-1&&this.raise(this.state.pos+1,f.DuplicateRegExpFlags);else{if(!S(e)&&92!==e)break;this.raise(this.state.pos+1,f.MalformedRegExpFlags)}++this.state.pos,r+=t}this.finishToken(n.regexp,{pattern:i,flags:r})}readInt(t,e,s,i=!0){const r=this.state.pos,a=16===t?ft.hex:ft.decBinOct,n=16===t?Dt.hex:10===t?Dt.dec:8===t?Dt.oct:Dt.bin;let o=!1,h=0;for(let r=0,p=null==e?1/0:e;r-1||a.indexOf(e)>-1||Number.isNaN(e))&&this.raise(this.state.pos,f.UnexpectedNumericSeparator),i||this.raise(this.state.pos,f.NumericSeparatorInEscapeSequence),++this.state.pos}else{if(p=e>=97?e-97+10:e>=65?e-65+10:dt(e)?e-48:1/0,p>=t)if(this.options.errorRecovery&&p<=9)p=0,this.raise(this.state.start+r+2,f.InvalidDigit,t);else{if(!s)break;p=0,o=!0}++this.state.pos,h=h*t+p}}return this.state.pos===r||null!=e&&this.state.pos-r!==e||o?null:h}readRadixNumber(t){const e=this.state.pos;let s=!1;this.state.pos+=2;const i=this.readInt(t);if(null==i&&this.raise(this.state.start+2,f.InvalidDigit,t),110===this.input.charCodeAt(this.state.pos)&&(++this.state.pos,s=!0),w(this.input.codePointAt(this.state.pos)))throw this.raise(this.state.pos,f.NumberIdentifier);if(s){const t=this.input.slice(e,this.state.pos).replace(/[_n]/g,"");this.finishToken(n.bigint,t)}else this.finishToken(n.num,i)}readNumber(t){const e=this.state.pos;let s=!1,i=!1,r=!1;t||null!==this.readInt(10)||this.raise(e,f.InvalidNumber);let a=this.state.pos-e>=2&&48===this.input.charCodeAt(e);a&&(this.state.strict&&this.raise(e,f.StrictOctalLiteral),/[89]/.test(this.input.slice(e,this.state.pos))&&(a=!1,r=!0));let o=this.input.charCodeAt(this.state.pos);if(46!==o||a||(++this.state.pos,this.readInt(10),s=!0,o=this.input.charCodeAt(this.state.pos)),69!==o&&101!==o||a||(o=this.input.charCodeAt(++this.state.pos),43!==o&&45!==o||++this.state.pos,null===this.readInt(10)&&this.raise(e,"Invalid number"),s=!0,o=this.input.charCodeAt(this.state.pos)),this.hasPlugin("numericSeparator")&&(a||r)){const t=this.input.slice(e,this.state.pos).indexOf("_");t>0&&this.raise(t+e,f.ZeroDigitNumericSeparator)}if(110===o&&((s||a||r)&&this.raise(e,"Invalid BigIntLiteral"),++this.state.pos,i=!0),w(this.input.codePointAt(this.state.pos)))throw this.raise(this.state.pos,f.NumberIdentifier);const h=this.input.slice(e,this.state.pos).replace(/[_n]/g,"");if(i)return void this.finishToken(n.bigint,h);const p=a?parseInt(h,8):parseFloat(h);this.finishToken(n.num,p)}readCodePoint(t){let e;if(123===this.input.charCodeAt(this.state.pos)){const s=++this.state.pos;if(e=this.readHexChar(this.input.indexOf("}",this.state.pos)-this.state.pos,!0,t),++this.state.pos,null!==e&&e>1114111){if(!t)return null;this.raise(s,f.InvalidCodePoint)}}else e=this.readHexChar(4,!1,t);return e}readString(t){let e="",s=++this.state.pos;for(;;){if(this.state.pos>=this.length)throw this.raise(this.state.start,f.UnterminatedString);const i=this.input.charCodeAt(this.state.pos);if(i===t)break;if(92===i)e+=this.input.slice(s,this.state.pos),e+=this.readEscapedChar(!1),s=this.state.pos;else if(8232===i||8233===i)++this.state.pos,++this.state.curLine,this.state.lineStart=this.state.pos;else{if(p(i))throw this.raise(this.state.start,f.UnterminatedString);++this.state.pos}}e+=this.input.slice(s,this.state.pos++),this.finishToken(n.string,e)}readTmplToken(){let t="",e=this.state.pos,s=!1;for(;;){if(this.state.pos>=this.length)throw this.raise(this.state.start,f.UnterminatedTemplate);const i=this.input.charCodeAt(this.state.pos);if(96===i||36===i&&123===this.input.charCodeAt(this.state.pos+1))return this.state.pos===this.state.start&&this.match(n.template)?36===i?(this.state.pos+=2,void this.finishToken(n.dollarBraceL)):(++this.state.pos,void this.finishToken(n.backQuote)):(t+=this.input.slice(e,this.state.pos),void this.finishToken(n.template,s?null:t));if(92===i){t+=this.input.slice(e,this.state.pos);const i=this.readEscapedChar(!0);null===i?s=!0:t+=i,e=this.state.pos}else if(p(i)){switch(t+=this.input.slice(e,this.state.pos),++this.state.pos,i){case 13:10===this.input.charCodeAt(this.state.pos)&&++this.state.pos;case 10:t+="\n";break;default:t+=String.fromCharCode(i)}++this.state.curLine,this.state.lineStart=this.state.pos,e=this.state.pos}else++this.state.pos}}readEscapedChar(t){const e=!t,s=this.input.charCodeAt(++this.state.pos);switch(++this.state.pos,s){case 110:return"\n";case 114:return"\r";case 120:{const t=this.readHexChar(2,!1,e);return null===t?null:String.fromCharCode(t)}case 117:{const t=this.readCodePoint(e);return null===t?null:String.fromCodePoint(t)}case 116:return"\t";case 98:return"\b";case 118:return"\v";case 102:return"\f";case 13:10===this.input.charCodeAt(this.state.pos)&&++this.state.pos;case 10:this.state.lineStart=this.state.pos,++this.state.curLine;case 8232:case 8233:return"";case 56:case 57:if(t)return null;default:if(s>=48&&s<=55){const e=this.state.pos-1;let s=this.input.substr(this.state.pos-1,3).match(/^[0-7]+/)[0],i=parseInt(s,8);i>255&&(s=s.slice(0,-1),i=parseInt(s,8)),this.state.pos+=s.length-1;const r=this.input.charCodeAt(this.state.pos);if("0"!==s||56===r||57===r){if(t)return null;this.state.strict?this.raise(e,f.StrictOctalLiteral):this.state.octalPositions.push(e)}return String.fromCharCode(i)}return String.fromCharCode(s)}}readHexChar(t,e,s){const i=this.state.pos,r=this.readInt(16,t,e,!1);return null===r&&(s?this.raise(i,f.InvalidEscapeSequence):this.state.pos=i-1),r}readWord1(){let t="";this.state.containsEsc=!1;const e=this.state.pos;let s=this.state.pos;for(;this.state.posthis.state.lastTokEnd&&this.raise(this.state.lastTokEnd,t)}unexpected(t,e="Unexpected token"){throw"string"!=typeof e&&(e='Unexpected token, expected "'.concat(e.label,'"')),this.raise(null!=t?t:this.state.start,e)}expectPlugin(t,e){if(!this.hasPlugin(t))throw this.raiseWithData(null!=e?e:this.state.start,{missingPlugin:[t]},"This experimental syntax requires enabling the parser plugin: '".concat(t,"'"));return!0}expectOnePlugin(t,e){if(!t.some(t=>this.hasPlugin(t)))throw this.raiseWithData(null!=e?e:this.state.start,{missingPlugin:t},"This experimental syntax requires enabling one of the following parser plugin(s): '".concat(t.join(", "),"'"))}checkYieldAwaitInDefaultParams(){-1!==this.state.yieldPos&&(-1===this.state.awaitPos||this.state.yieldPos{throw s.node=t,s});if(this.state.errors.length>e.errors.length){const t=this.state;return this.state=e,{node:i,error:t.errors[e.errors.length],thrown:!1,aborted:!1,failState:t}}return{node:i,error:null,thrown:!1,aborted:!1,failState:null}}catch(t){const i=this.state;if(this.state=e,t instanceof SyntaxError)return{node:null,error:t,thrown:!0,aborted:!1,failState:i};if(t===s)return{node:s.node,error:null,thrown:!1,aborted:!0,failState:i};throw t}}checkExpressionErrors(t,e){if(!t)return!1;const{shorthandAssign:s,doubleProto:i}=t;if(!e)return s>=0||i>=0;s>=0&&this.unexpected(s),i>=0&&this.raise(i,f.DuplicateProto)}}{startNode(){return new gt(this,this.state.start,this.state.startLoc)}startNodeAt(t,e){return new gt(this,t,e)}startNodeAtNode(t){return this.startNodeAt(t.start,t.loc.start)}finishNode(t,e){return this.finishNodeAt(t,e,this.state.lastTokEnd,this.state.lastTokEndLoc)}finishNodeAt(t,e,s,i){return t.type=e,t.end=s,t.loc.end=i,this.options.ranges&&(t.range[1]=s),this.processComment(t),t}resetStartLocation(t,e,s){t.start=e,t.loc.start=s,this.options.ranges&&(t.range[0]=e)}resetEndLocation(t,e=this.state.lastTokEnd,s=this.state.lastTokEndLoc){t.end=e,t.loc.end=s,this.options.ranges&&(t.range[1]=e)}resetStartLocationFromNode(t,e){this.resetStartLocation(t,e.start,e.loc.start)}}{toAssignable(t){var e,s;let i=void 0;switch(("ParenthesizedExpression"===t.type||(null==(e=t.extra)?void 0:e.parenthesized))&&(i=Pt(t),"Identifier"!==i.type&&"MemberExpression"!==i.type&&this.raise(t.start,f.InvalidParenthesizedAssignment)),t.type){case"Identifier":case"ObjectPattern":case"ArrayPattern":case"AssignmentPattern":break;case"ObjectExpression":t.type="ObjectPattern";for(let e=0,s=t.properties.length,i=s-1;e=s.left.start&&(e.shorthandAssign=-1),this.checkLVal(h,void 0,void 0,"assignment expression"),this.next(),s.right=this.parseMaybeAssign(t),this.finishNode(s,"AssignmentExpression")}return o&&this.checkExpressionErrors(e,!0),h}parseMaybeConditional(t,e,s){const i=this.state.start,r=this.state.startLoc,a=this.state.potentialArrowAt,n=this.parseExprOps(t,e);return"ArrowFunctionExpression"===n.type&&n.start===a?n:this.checkExpressionErrors(e,!1)?n:this.parseConditional(n,t,i,r,s)}parseConditional(t,e,s,i,r){if(this.eat(n.question)){const r=this.startNodeAt(s,i);return r.test=t,r.consequent=this.parseMaybeAssign(),this.expect(n.colon),r.alternate=this.parseMaybeAssign(e),this.finishNode(r,"ConditionalExpression")}return t}parseExprOps(t,e){const s=this.state.start,i=this.state.startLoc,r=this.state.potentialArrowAt,a=this.parseMaybeUnary(e);return"ArrowFunctionExpression"===a.type&&a.start===r?a:this.checkExpressionErrors(e,!1)?a:this.parseExprOp(a,s,i,-1,t)}parseExprOp(t,e,s,i,r){let a=this.state.type.binop;if(!(null==a||r&&this.match(n._in))&&a>i){const o=this.state.value;if("|>"===o&&this.state.inFSharpPipelineDirectBody)return t;const h=this.startNodeAt(e,s);h.left=t,h.operator=o,"**"!==o||"UnaryExpression"!==t.type||!this.options.createParenthesizedExpressions&&t.extra&&t.extra.parenthesized||this.raise(t.argument.start,f.UnexpectedTokenUnaryExponentiation);const p=this.state.type,c=p===n.logicalOR||p===n.logicalAND,u=p===n.nullishCoalescing;if(p===n.pipeline?(this.expectPlugin("pipelineOperator"),this.state.inPipeline=!0,this.checkPipelineAtInfixOperator(t,e)):u&&(a=n.logicalAND.binop),this.next(),p===n.pipeline&&"minimal"===this.getPluginOption("pipelineOperator","proposal")&&this.match(n.name)&&"await"===this.state.value&&this.prodParam.hasAwait)throw this.raise(this.state.start,f.UnexpectedAwaitAfterPipelineBody);h.right=this.parseExprOpRightExpr(p,a,r),this.finishNode(h,c||u?"LogicalExpression":"BinaryExpression");const l=this.state.type;if(u&&(l===n.logicalOR||l===n.logicalAND)||c&&l===n.nullishCoalescing)throw this.raise(this.state.start,f.MixingCoalesceWithLogical);return this.parseExprOp(h,e,s,i,r)}return t}parseExprOpRightExpr(t,e,s){const i=this.state.start,r=this.state.startLoc;switch(t){case n.pipeline:switch(this.getPluginOption("pipelineOperator","proposal")){case"smart":return this.withTopicPermittingContext(()=>this.parseSmartPipelineBody(this.parseExprOpBaseRightExpr(t,e,s),i,r));case"fsharp":return this.withSoloAwaitPermittingContext(()=>this.parseFSharpPipelineBody(e,s))}default:return this.parseExprOpBaseRightExpr(t,e,s)}}parseExprOpBaseRightExpr(t,e,s){const i=this.state.start,r=this.state.startLoc;return this.parseExprOp(this.parseMaybeUnary(),i,r,t.rightAssociative?e-1:e,s)}parseMaybeUnary(t){if(this.isContextual("await")&&this.isAwaitAllowed())return this.parseAwait();if(this.state.type.prefix){const e=this.startNode(),s=this.match(n.incDec);if(e.operator=this.state.value,e.prefix=!0,"throw"===e.operator&&this.expectPlugin("throwExpressions"),this.next(),e.argument=this.parseMaybeUnary(),this.checkExpressionErrors(t,!0),s)this.checkLVal(e.argument,void 0,void 0,"prefix operation");else if(this.state.strict&&"delete"===e.operator){const t=e.argument;"Identifier"===t.type?this.raise(e.start,f.StrictDelete):"MemberExpression"===t.type&&"PrivateName"===t.property.type&&this.raise(e.start,f.DeletePrivateField)}return this.finishNode(e,s?"UpdateExpression":"UnaryExpression")}const e=this.state.start,s=this.state.startLoc;let i=this.parseExprSubscripts(t);if(this.checkExpressionErrors(t,!1))return i;for(;this.state.type.postfix&&!this.canInsertSemicolon();){const t=this.startNodeAt(e,s);t.operator=this.state.value,t.prefix=!1,t.argument=i,this.checkLVal(i,void 0,void 0,"postfix operation"),this.next(),i=this.finishNode(t,"UpdateExpression")}return i}parseExprSubscripts(t){const e=this.state.start,s=this.state.startLoc,i=this.state.potentialArrowAt,r=this.parseExprAtom(t);return"ArrowFunctionExpression"===r.type&&r.start===i?r:this.parseSubscripts(r,e,s)}parseSubscripts(t,e,s,i){const r={optionalChainMember:!1,maybeAsyncArrow:this.atPossibleAsyncArrow(t),stop:!1};do{const a=this.state.maybeInAsyncArrowHead;r.maybeAsyncArrow&&(this.state.maybeInAsyncArrowHead=!0),t=this.parseSubscript(t,e,s,i,r),r.maybeAsyncArrow=!1,this.state.maybeInAsyncArrowHead=a}while(!r.stop);return t}parseSubscript(t,e,s,i,r){if(!i&&this.eat(n.doubleColon)){const a=this.startNodeAt(e,s);return a.object=t,a.callee=this.parseNoCallExpr(),r.stop=!0,this.parseSubscripts(this.finishNode(a,"BindExpression"),e,s,i)}let a=!1;if(this.match(n.questionDot)){if(r.optionalChainMember=a=!0,i&&40===this.lookaheadCharCode())return r.stop=!0,t;this.next()}const o=this.eat(n.bracketL);if(a&&!this.match(n.parenL)&&!this.match(n.backQuote)||o||this.eat(n.dot)){const i=this.startNodeAt(e,s);return i.object=t,i.property=o?this.parseExpression():a?this.parseIdentifier(!0):this.parseMaybePrivateName(!0),i.computed=o,"PrivateName"===i.property.type&&("Super"===i.object.type&&this.raise(e,f.SuperPrivateField),this.classScope.usePrivateName(i.property.id.name,i.property.start)),o&&this.expect(n.bracketR),r.optionalChainMember?(i.optional=a,this.finishNode(i,"OptionalMemberExpression")):this.finishNode(i,"MemberExpression")}if(!i&&this.match(n.parenL)){const i=this.state.maybeInArrowParameters,o=this.state.yieldPos,h=this.state.awaitPos;this.state.maybeInArrowParameters=!0,this.state.yieldPos=-1,this.state.awaitPos=-1,this.next();let p=this.startNodeAt(e,s);return p.callee=t,a?(p.optional=!0,p.arguments=this.parseCallExpressionArguments(n.parenR,!1)):p.arguments=this.parseCallExpressionArguments(n.parenR,r.maybeAsyncArrow,"Import"===t.type,"Super"!==t.type,p),this.finishCallExpression(p,r.optionalChainMember),r.maybeAsyncArrow&&this.shouldParseAsyncArrow()&&!a?(r.stop=!0,p=this.parseAsyncArrowFromCallExpression(this.startNodeAt(e,s),p),this.checkYieldAwaitInDefaultParams(),this.state.yieldPos=o,this.state.awaitPos=h):(this.toReferencedListDeep(p.arguments),-1!==o&&(this.state.yieldPos=o),(this.isAwaitAllowed()||i)&&-1===h||(this.state.awaitPos=h)),this.state.maybeInArrowParameters=i,p}return this.match(n.backQuote)?this.parseTaggedTemplateExpression(e,s,t,r):(r.stop=!0,t)}parseTaggedTemplateExpression(t,e,s,i,r){const a=this.startNodeAt(t,e);return a.tag=s,a.quasi=this.parseTemplate(!0),r&&(a.typeParameters=r),i.optionalChainMember&&this.raise(t,f.OptionalChainingNoTemplate),this.finishNode(a,"TaggedTemplateExpression")}atPossibleAsyncArrow(t){return"Identifier"===t.type&&"async"===t.name&&this.state.lastTokEnd===t.end&&!this.canInsertSemicolon()&&t.end-t.start==5&&t.start===this.state.potentialArrowAt}finishCallExpression(t,e){if("Import"===t.callee.type)if(1!==t.arguments.length)this.raise(t.start,f.ImportCallArity);else{const e=t.arguments[0];e&&"SpreadElement"===e.type&&this.raise(e.start,f.ImportCallSpreadArgument)}return this.finishNode(t,e?"OptionalCallExpression":"CallExpression")}parseCallExpressionArguments(t,e,s,i,r){const a=[];let o,h=!0;const p=this.state.inFSharpPipelineDirectBody;for(this.state.inFSharpPipelineDirectBody=!1;!this.eat(t);){if(h)h=!1;else if(this.expect(n.comma),this.match(t)){s&&this.raise(this.state.lastTokStart,f.ImportCallArgumentTrailingComma),r&&this.addExtra(r,"trailingComma",this.state.lastTokStart),this.next();break}this.match(n.parenL)&&!o&&(o=this.state.start),a.push(this.parseExprListItem(!1,e?new xt:void 0,e?{start:0}:void 0,i))}return e&&o&&this.shouldParseAsyncArrow()&&this.unexpected(),this.state.inFSharpPipelineDirectBody=p,a}shouldParseAsyncArrow(){return this.match(n.arrow)&&!this.canInsertSemicolon()}parseAsyncArrowFromCallExpression(t,e){var s;return this.expect(n.arrow),this.parseArrowExpression(t,e.arguments,!0,null==(s=e.extra)?void 0:s.trailingComma),t}parseNoCallExpr(){const t=this.state.start,e=this.state.startLoc;return this.parseSubscripts(this.parseExprAtom(),t,e,!0)}parseExprAtom(t){this.state.type===n.slash&&this.readRegexp();const e=this.state.potentialArrowAt===this.state.start;let s;switch(this.state.type){case n._super:return s=this.startNode(),this.next(),!this.match(n.parenL)||this.scope.allowDirectSuper||this.options.allowSuperOutsideMethod?this.scope.allowSuper||this.options.allowSuperOutsideMethod||this.raise(s.start,f.UnexpectedSuper):this.raise(s.start,f.SuperNotAllowed),this.match(n.parenL)||this.match(n.bracketL)||this.match(n.dot)||this.raise(s.start,f.UnsupportedSuper),this.finishNode(s,"Super");case n._import:return s=this.startNode(),this.next(),this.match(n.dot)?this.parseImportMetaProperty(s):(this.match(n.parenL)||this.raise(this.state.lastTokStart,f.UnsupportedImport),this.finishNode(s,"Import"));case n._this:return s=this.startNode(),this.next(),this.finishNode(s,"ThisExpression");case n.name:{s=this.startNode();const t=this.state.containsEsc,i=this.parseIdentifier();if(!t&&"async"===i.name&&this.match(n._function)&&!this.canInsertSemicolon()){const t=this.state.context.length-1;if(this.state.context[t]!==x.functionStatement)throw new Error("Internal error");return this.state.context[t]=x.functionExpression,this.next(),this.parseFunction(s,void 0,!0)}if(e&&!t&&"async"===i.name&&this.match(n.name)&&!this.canInsertSemicolon()){const t=this.state.maybeInArrowParameters,e=this.state.maybeInAsyncArrowHead,i=this.state.yieldPos,r=this.state.awaitPos;this.state.maybeInArrowParameters=!0,this.state.maybeInAsyncArrowHead=!0,this.state.yieldPos=-1,this.state.awaitPos=-1;const a=[this.parseIdentifier()];return this.expect(n.arrow),this.checkYieldAwaitInDefaultParams(),this.state.maybeInArrowParameters=t,this.state.maybeInAsyncArrowHead=e,this.state.yieldPos=i,this.state.awaitPos=r,this.parseArrowExpression(s,a,!0),s}return e&&this.match(n.arrow)&&!this.canInsertSemicolon()?(this.next(),this.parseArrowExpression(s,[i],!1),s):i}case n._do:{this.expectPlugin("doExpressions");const t=this.startNode();this.next();const e=this.state.labels;return this.state.labels=[],t.body=this.parseBlock(),this.state.labels=e,this.finishNode(t,"DoExpression")}case n.regexp:{const t=this.state.value;return s=this.parseLiteral(t.value,"RegExpLiteral"),s.pattern=t.pattern,s.flags=t.flags,s}case n.num:return this.parseLiteral(this.state.value,"NumericLiteral");case n.bigint:return this.parseLiteral(this.state.value,"BigIntLiteral");case n.string:return this.parseLiteral(this.state.value,"StringLiteral");case n._null:return s=this.startNode(),this.next(),this.finishNode(s,"NullLiteral");case n._true:case n._false:return this.parseBooleanLiteral();case n.parenL:return this.parseParenAndDistinguishExpression(e);case n.bracketBarL:case n.bracketHashL:{this.expectPlugin("recordAndTuple");const e=this.state.inFSharpPipelineDirectBody,i=this.state.type===n.bracketBarL?n.bracketBarR:n.bracketR;return this.state.inFSharpPipelineDirectBody=!1,s=this.startNode(),this.next(),s.elements=this.parseExprList(i,!0,t,s),this.state.inFSharpPipelineDirectBody=e,this.finishNode(s,"TupleExpression")}case n.bracketL:{const e=this.state.inFSharpPipelineDirectBody;return this.state.inFSharpPipelineDirectBody=!1,s=this.startNode(),this.next(),s.elements=this.parseExprList(n.bracketR,!0,t,s),this.state.maybeInArrowParameters||this.toReferencedList(s.elements),this.state.inFSharpPipelineDirectBody=e,this.finishNode(s,"ArrayExpression")}case n.braceBarL:case n.braceHashL:{this.expectPlugin("recordAndTuple");const e=this.state.inFSharpPipelineDirectBody,s=this.state.type===n.braceBarL?n.braceBarR:n.braceR;this.state.inFSharpPipelineDirectBody=!1;const i=this.parseObj(s,!1,!0,t);return this.state.inFSharpPipelineDirectBody=e,i}case n.braceL:{const e=this.state.inFSharpPipelineDirectBody;this.state.inFSharpPipelineDirectBody=!1;const s=this.parseObj(n.braceR,!1,!1,t);return this.state.inFSharpPipelineDirectBody=e,s}case n._function:return this.parseFunctionExpression();case n.at:this.parseDecorators();case n._class:return s=this.startNode(),this.takeDecorators(s),this.parseClass(s,!1);case n._new:return this.parseNew();case n.backQuote:return this.parseTemplate(!1);case n.doubleColon:{s=this.startNode(),this.next(),s.object=null;const t=s.callee=this.parseNoCallExpr();if("MemberExpression"===t.type)return this.finishNode(s,"BindExpression");throw this.raise(t.start,f.UnsupportedBind)}case n.hash:if(this.state.inPipeline)return s=this.startNode(),"smart"!==this.getPluginOption("pipelineOperator","proposal")&&this.raise(s.start,f.PrimaryTopicRequiresSmartPipeline),this.next(),this.primaryTopicReferenceIsAllowedInCurrentTopicContext()||this.raise(s.start,f.PrimaryTopicNotAllowed),this.registerTopicReference(),this.finishNode(s,"PipelinePrimaryTopicReference");default:throw this.unexpected()}}parseBooleanLiteral(){const t=this.startNode();return t.value=this.match(n._true),this.next(),this.finishNode(t,"BooleanLiteral")}parseMaybePrivateName(t){if(this.match(n.hash)){this.expectOnePlugin(["classPrivateProperties","classPrivateMethods"]),t||this.raise(this.state.pos,f.UnexpectedPrivateField);const e=this.startNode();return this.next(),this.assertNoSpace("Unexpected space between # and identifier"),e.id=this.parseIdentifier(!0),this.finishNode(e,"PrivateName")}return this.parseIdentifier(!0)}parseFunctionExpression(){const t=this.startNode();let e=this.startNode();return this.next(),e=this.createIdentifier(e,"function"),this.prodParam.hasYield&&this.eat(n.dot)?this.parseMetaProperty(t,e,"sent"):this.parseFunction(t)}parseMetaProperty(t,e,s){t.meta=e,"function"===e.name&&"sent"===s&&(this.isContextual(s)?this.expectPlugin("functionSent"):this.hasPlugin("functionSent")||this.unexpected());const i=this.state.containsEsc;return t.property=this.parseIdentifier(!0),(t.property.name!==s||i)&&this.raise(t.property.start,f.UnsupportedMetaProperty,e.name,s),this.finishNode(t,"MetaProperty")}parseImportMetaProperty(t){const e=this.createIdentifier(this.startNodeAtNode(t),"import");return this.expect(n.dot),this.isContextual("meta")?(this.expectPlugin("importMeta"),this.inModule||this.raiseWithData(e.start,{code:"BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED"},f.ImportMetaOutsideModule),this.sawUnambiguousESM=!0):this.hasPlugin("importMeta")||this.raise(e.start,f.ImportCallArityLtOne),this.parseMetaProperty(t,e,"meta")}parseLiteral(t,e,s,i){s=s||this.state.start,i=i||this.state.startLoc;const r=this.startNodeAt(s,i);return this.addExtra(r,"rawValue",t),this.addExtra(r,"raw",this.input.slice(s,this.state.end)),r.value=t,this.next(),this.finishNode(r,e)}parseParenAndDistinguishExpression(t){const e=this.state.start,s=this.state.startLoc;let i;this.expect(n.parenL);const r=this.state.maybeInArrowParameters,a=this.state.yieldPos,o=this.state.awaitPos,h=this.state.inFSharpPipelineDirectBody;this.state.maybeInArrowParameters=!0,this.state.yieldPos=-1,this.state.awaitPos=-1,this.state.inFSharpPipelineDirectBody=!1;const p=this.state.start,c=this.state.startLoc,u=[],l=new xt,d={start:0};let m,f,D=!0;for(;!this.match(n.parenR);){if(D)D=!1;else if(this.expect(n.comma,d.start||null),this.match(n.parenR)){f=this.state.start;break}if(this.match(n.ellipsis)){const t=this.state.start,e=this.state.startLoc;m=this.state.start,u.push(this.parseParenItem(this.parseRestBinding(),t,e)),this.checkCommaAfterRest(41);break}u.push(this.parseMaybeAssign(!1,l,this.parseParenItem,d))}const y=this.state.start,x=this.state.startLoc;this.expect(n.parenR),this.state.maybeInArrowParameters=r,this.state.inFSharpPipelineDirectBody=h;let g=this.startNodeAt(e,s);if(t&&this.shouldParseArrow()&&(g=this.parseArrow(g))){this.isAwaitAllowed()||this.state.maybeInAsyncArrowHead||(this.state.awaitPos=o),this.checkYieldAwaitInDefaultParams(),this.state.yieldPos=a,this.state.awaitPos=o;for(let t=0;t1?(i=this.startNodeAt(p,c),i.expressions=u,this.finishNodeAt(i,"SequenceExpression",y,x)):i=u[0],!this.options.createParenthesizedExpressions)return this.addExtra(i,"parenthesized",!0),this.addExtra(i,"parenStart",e),i;const P=this.startNodeAt(e,s);return P.expression=i,this.finishNode(P,"ParenthesizedExpression"),P}shouldParseArrow(){return!this.canInsertSemicolon()}parseArrow(t){if(this.eat(n.arrow))return t}parseParenItem(t,e,s){return t}parseNew(){const t=this.startNode();let e=this.startNode();if(this.next(),e=this.createIdentifier(e,"new"),this.eat(n.dot)){const s=this.parseMetaProperty(t,e,"target");if(!this.scope.inNonArrowFunction&&!this.scope.inClass){let t=f.UnexpectedNewTarget;this.hasPlugin("classProperties")&&(t+=" or class properties"),this.raise(s.start,t)}return s}return t.callee=this.parseNoCallExpr(),"Import"===t.callee.type?this.raise(t.callee.start,f.ImportCallNotNewExpression):"OptionalMemberExpression"===t.callee.type||"OptionalCallExpression"===t.callee.type?this.raise(this.state.lastTokEnd,f.OptionalChainingNoNew):this.eat(n.questionDot)&&this.raise(this.state.start,f.OptionalChainingNoNew),this.parseNewArguments(t),this.finishNode(t,"NewExpression")}parseNewArguments(t){if(this.eat(n.parenL)){const e=this.parseExprList(n.parenR);this.toReferencedList(e),t.arguments=e}else t.arguments=[]}parseTemplateElement(t){const e=this.startNode();return null===this.state.value&&(t||this.raise(this.state.start+1,f.InvalidEscapeSequenceTemplate)),e.value={raw:this.input.slice(this.state.start,this.state.end).replace(/\r\n?/g,"\n"),cooked:this.state.value},this.next(),e.tail=this.match(n.backQuote),this.finishNode(e,"TemplateElement")}parseTemplate(t){const e=this.startNode();this.next(),e.expressions=[];let s=this.parseTemplateElement(t);for(e.quasis=[s];!s.tail;)this.expect(n.dollarBraceL),e.expressions.push(this.parseExpression()),this.expect(n.braceR),e.quasis.push(s=this.parseTemplateElement(t));return this.next(),this.finishNode(e,"TemplateLiteral")}parseObj(t,e,s,i){const r=Object.create(null);let a=!0;const o=this.startNode();for(o.properties=[],this.next();!this.eat(t);){if(a)a=!1;else if(this.expect(n.comma),this.match(t)){this.addExtra(o,"trailingComma",this.state.lastTokStart),this.next();break}const s=this.parseObjectMember(e,i);e||this.checkDuplicatedProto(s,r,i),s.shorthand&&this.addExtra(s,"shorthand",!0),o.properties.push(s)}let h="ObjectExpression";return e?h="ObjectPattern":s&&(h="RecordExpression"),this.finishNode(o,h)}isAsyncProp(t){return!t.computed&&"Identifier"===t.key.type&&"async"===t.key.name&&(this.match(n.name)||this.match(n.num)||this.match(n.string)||this.match(n.bracketL)||this.state.type.keyword||this.match(n.star))&&!this.hasPrecedingLineBreak()}parseObjectMember(t,e){let s=[];if(this.match(n.at))for(this.hasPlugin("decorators")&&this.raise(this.state.start,f.UnsupportedPropertyDecorator);this.match(n.at);)s.push(this.parseDecorator());const i=this.startNode();let r,a,o=!1,h=!1;if(this.match(n.ellipsis))return s.length&&this.unexpected(),t?(this.next(),i.argument=this.parseIdentifier(),this.checkCommaAfterRest(125),this.finishNode(i,"RestElement")):this.parseSpread();s.length&&(i.decorators=s,s=[]),i.method=!1,(t||e)&&(r=this.state.start,a=this.state.startLoc),t||(o=this.eat(n.star));const p=this.state.containsEsc;return this.parsePropertyName(i,!1),t||p||o||!this.isAsyncProp(i)?h=!1:(h=!0,o=this.eat(n.star),this.parsePropertyName(i,!1)),this.parseObjPropValue(i,r,a,o,h,t,e,p),i}isGetterOrSetterMethod(t,e){return!e&&!t.computed&&"Identifier"===t.key.type&&("get"===t.key.name||"set"===t.key.name)&&(this.match(n.string)||this.match(n.num)||this.match(n.bracketL)||this.match(n.name)||!!this.state.type.keyword)}getGetterSetterExpectedParamCount(t){return"get"===t.kind?0:1}checkGetterSetterParams(t){const e=this.getGetterSetterExpectedParamCount(t),s=t.start;t.params.length!==e&&("get"===t.kind?this.raise(s,f.BadGetterArity):this.raise(s,f.BadSetterArity)),"set"===t.kind&&"RestElement"===t.params[t.params.length-1].type&&this.raise(s,f.BadSetterRestParameter)}parseObjectMethod(t,e,s,i,r){return s||e||this.match(n.parenL)?(i&&this.unexpected(),t.kind="method",t.method=!0,this.parseMethod(t,e,s,!1,!1,"ObjectMethod")):!r&&this.isGetterOrSetterMethod(t,i)?((e||s)&&this.unexpected(),t.kind=t.key.name,this.parsePropertyName(t,!1),this.parseMethod(t,!1,!1,!1,!1,"ObjectMethod"),this.checkGetterSetterParams(t),t):void 0}parseObjectProperty(t,e,s,i,r){return t.shorthand=!1,this.eat(n.colon)?(t.value=i?this.parseMaybeDefault(this.state.start,this.state.startLoc):this.parseMaybeAssign(!1,r),this.finishNode(t,"ObjectProperty")):t.computed||"Identifier"!==t.key.type?void 0:(this.checkReservedWord(t.key.name,t.key.start,!0,!0),i?t.value=this.parseMaybeDefault(e,s,t.key.__clone()):this.match(n.eq)&&r?(-1===r.shorthandAssign&&(r.shorthandAssign=this.state.start),t.value=this.parseMaybeDefault(e,s,t.key.__clone())):t.value=t.key.__clone(),t.shorthand=!0,this.finishNode(t,"ObjectProperty"))}parseObjPropValue(t,e,s,i,r,a,n,o){const h=this.parseObjectMethod(t,i,r,a,o)||this.parseObjectProperty(t,e,s,a,n);return h||this.unexpected(),h}parsePropertyName(t,e){if(this.eat(n.bracketL))t.computed=!0,t.key=this.parseMaybeAssign(),this.expect(n.bracketR);else{const s=this.state.inPropertyName;this.state.inPropertyName=!0,t.key=this.match(n.num)||this.match(n.string)||this.match(n.bigint)?this.parseExprAtom():this.parseMaybePrivateName(e),"PrivateName"!==t.key.type&&(t.computed=!1),this.state.inPropertyName=s}return t.key}initFunction(t,e){t.id=null,t.generator=!1,t.async=!!e}parseMethod(t,e,s,i,r,a,n=!1){const o=this.state.yieldPos,h=this.state.awaitPos;this.state.yieldPos=-1,this.state.awaitPos=-1,this.initFunction(t,s),t.generator=!!e;const p=i;return this.scope.enter(18|(n?64:0)|(r?32:0)),this.prodParam.enter(et(s,t.generator)),this.parseFunctionParams(t,p),this.parseFunctionBodyAndFinish(t,a,!0),this.prodParam.exit(),this.scope.exit(),this.state.yieldPos=o,this.state.awaitPos=h,t}parseArrowExpression(t,e,s,i){this.scope.enter(6),this.prodParam.enter(et(s,!1)),this.initFunction(t,s);const r=this.state.maybeInArrowParameters,a=this.state.yieldPos,n=this.state.awaitPos;return e&&(this.state.maybeInArrowParameters=!0,this.setArrowFunctionParameters(t,e,i)),this.state.maybeInArrowParameters=!1,this.state.yieldPos=-1,this.state.awaitPos=-1,this.parseFunctionBody(t,!0),this.prodParam.exit(),this.scope.exit(),this.state.maybeInArrowParameters=r,this.state.yieldPos=a,this.state.awaitPos=n,this.finishNode(t,"ArrowFunctionExpression")}setArrowFunctionParameters(t,e,s){t.params=this.toAssignableList(e,s)}parseFunctionBodyAndFinish(t,e,s=!1){this.parseFunctionBody(t,!1,s),this.finishNode(t,e)}parseFunctionBody(t,e,s=!1){const i=e&&!this.match(n.braceL),r=this.state.inParameters;if(this.state.inParameters=!1,i)t.body=this.parseMaybeAssign(),this.checkParams(t,!1,e,!1);else{const i=this.state.strict,r=this.state.labels;this.state.labels=[],this.prodParam.enter(4|this.prodParam.currentFlags()),t.body=this.parseBlock(!0,!1,r=>{const a=!this.isSimpleParamList(t.params);if(r&&a){const e="method"!==t.kind&&"constructor"!==t.kind||!t.key?t.start:t.key.end;this.raise(e,f.IllegalLanguageModeDirective)}const n=!i&&this.state.strict;this.checkParams(t,!(this.state.strict||e||s||a),e,n),this.state.strict&&t.id&&this.checkLVal(t.id,65,void 0,"function name",void 0,n)}),this.prodParam.exit(),this.state.labels=r}this.state.inParameters=r}isSimpleParamList(t){for(let e=0,s=t.length;e=1}topicReferenceWasUsedInCurrentTopicContext(){return null!=this.state.topicContext.maxTopicIndex&&this.state.topicContext.maxTopicIndex>=0}parseFSharpPipelineBody(t,e){const s=this.state.start,i=this.state.startLoc;this.state.potentialArrowAt=this.state.start;const r=this.state.inFSharpPipelineDirectBody;this.state.inFSharpPipelineDirectBody=!0;const a=this.parseExprOp(this.parseMaybeUnary(),s,i,t,e);return this.state.inFSharpPipelineDirectBody=r,a}}{parseTopLevel(t,e){if(e.sourceType=this.options.sourceType,e.interpreter=this.parseInterpreterDirective(),this.parseBlockBody(e,!0,!0,n.eof),this.inModule&&!this.options.allowUndeclaredExports&&this.scope.undefinedExports.size>0)for(let t=0,e=Array.from(this.scope.undefinedExports);tthis.parseStatement("do")),this.state.labels.pop(),this.expect(n._while),t.test=this.parseHeaderExpression(),this.eat(n.semi),this.finishNode(t,"DoWhileStatement")}parseForStatement(t){this.next(),this.state.labels.push(Et);let e=-1;if(this.isAwaitAllowed()&&this.eatContextual("await")&&(e=this.state.lastTokStart),this.scope.enter(0),this.expect(n.parenL),this.match(n.semi))return e>-1&&this.unexpected(e),this.parseFor(t,null);const s=this.isLet();if(this.match(n._var)||this.match(n._const)||s){const i=this.startNode(),r=s?"let":this.state.value;return this.next(),this.parseVar(i,!0,r),this.finishNode(i,"VariableDeclaration"),(this.match(n._in)||this.isContextual("of"))&&1===i.declarations.length?this.parseForIn(t,i,e):(e>-1&&this.unexpected(e),this.parseFor(t,i))}const i=new xt,r=this.parseExpression(!0,i);if(this.match(n._in)||this.isContextual("of")){this.toAssignable(r);const s=this.isContextual("of")?"for-of statement":"for-in statement";return this.checkLVal(r,void 0,void 0,s),this.parseForIn(t,r,e)}return this.checkExpressionErrors(i,!0),e>-1&&this.unexpected(e),this.parseFor(t,r)}parseFunctionStatement(t,e,s){return this.next(),this.parseFunction(t,1|(s?0:2),e)}parseIfStatement(t){return this.next(),t.test=this.parseHeaderExpression(),t.consequent=this.parseStatement("if"),t.alternate=this.eat(n._else)?this.parseStatement("if"):null,this.finishNode(t,"IfStatement")}parseReturnStatement(t){return this.prodParam.hasReturn||this.options.allowReturnOutsideFunction||this.raise(this.state.start,f.IllegalReturn),this.next(),this.isLineTerminator()?t.argument=null:(t.argument=this.parseExpression(),this.semicolon()),this.finishNode(t,"ReturnStatement")}parseSwitchStatement(t){this.next(),t.discriminant=this.parseHeaderExpression();const e=t.cases=[];let s,i;for(this.expect(n.braceL),this.state.labels.push(Ct),this.scope.enter(0);!this.match(n.braceR);)if(this.match(n._case)||this.match(n._default)){const t=this.match(n._case);s&&this.finishNode(s,"SwitchCase"),e.push(s=this.startNode()),s.consequent=[],this.next(),t?s.test=this.parseExpression():(i&&this.raise(this.state.lastTokStart,f.MultipleDefaultsInSwitch),i=!0,s.test=null),this.expect(n.colon)}else s?s.consequent.push(this.parseStatement(null)):this.unexpected();return this.scope.exit(),s&&this.finishNode(s,"SwitchCase"),this.next(),this.state.labels.pop(),this.finishNode(t,"SwitchStatement")}parseThrowStatement(t){return this.next(),o.test(this.input.slice(this.state.lastTokEnd,this.state.start))&&this.raise(this.state.lastTokEnd,f.NewlineAfterThrow),t.argument=this.parseExpression(),this.semicolon(),this.finishNode(t,"ThrowStatement")}parseTryStatement(t){if(this.next(),t.block=this.parseBlock(),t.handler=null,this.match(n._catch)){const e=this.startNode();if(this.next(),this.match(n.parenL)){this.expect(n.parenL),e.param=this.parseBindingAtom();const t="Identifier"===e.param.type;this.scope.enter(t?8:0),this.checkLVal(e.param,9,null,"catch clause"),this.expect(n.parenR)}else e.param=null,this.scope.enter(0);e.body=this.withTopicForbiddingContext(()=>this.parseBlock(!1,!1)),this.scope.exit(),t.handler=this.finishNode(e,"CatchClause")}return t.finalizer=this.eat(n._finally)?this.parseBlock():null,t.handler||t.finalizer||this.raise(t.start,f.NoCatchOrFinally),this.finishNode(t,"TryStatement")}parseVarStatement(t,e){return this.next(),this.parseVar(t,!1,e),this.semicolon(),this.finishNode(t,"VariableDeclaration")}parseWhileStatement(t){return this.next(),t.test=this.parseHeaderExpression(),this.state.labels.push(Et),t.body=this.withTopicForbiddingContext(()=>this.parseStatement("while")),this.state.labels.pop(),this.finishNode(t,"WhileStatement")}parseWithStatement(t){return this.state.strict&&this.raise(this.state.start,f.StrictWith),this.next(),t.object=this.parseHeaderExpression(),t.body=this.withTopicForbiddingContext(()=>this.parseStatement("with")),this.finishNode(t,"WithStatement")}parseEmptyStatement(t){return this.next(),this.finishNode(t,"EmptyStatement")}parseLabeledStatement(t,e,s,i){for(let t=0,i=this.state.labels;t=0;e--){const s=this.state.labels[e];if(s.statementStart!==t.start)break;s.statementStart=this.state.start,s.kind=r}return this.state.labels.push({name:e,kind:r,statementStart:this.state.start}),t.body=this.parseStatement(i?-1===i.indexOf("label")?i+"label":i:"label"),this.state.labels.pop(),t.label=s,this.finishNode(t,"LabeledStatement")}parseExpressionStatement(t,e){return t.expression=e,this.semicolon(),this.finishNode(t,"ExpressionStatement")}parseBlock(t=!1,e=!0,s){const i=this.startNode();return this.expect(n.braceL),e&&this.scope.enter(0),this.parseBlockBody(i,t,!1,n.braceR,s),e&&this.scope.exit(),this.finishNode(i,"BlockStatement")}isValidDirective(t){return"ExpressionStatement"===t.type&&"StringLiteral"===t.expression.type&&!t.expression.extra.parenthesized}parseBlockBody(t,e,s,i,r){const a=t.body=[],n=t.directives=[];this.parseBlockOrModuleBlockBody(a,e?n:void 0,s,i,r)}parseBlockOrModuleBlockBody(t,e,s,i,r){const a=[],n=this.state.strict;let o=!1,h=!1;for(;!this.match(i);){!h&&this.state.octalPositions.length&&a.push(...this.state.octalPositions);const i=this.parseStatement(null,s);if(e&&!h&&this.isValidDirective(i)){const t=this.stmtToDirective(i);e.push(t),o||"use strict"!==t.value.value||(o=!0,this.setStrict(!0))}else h=!0,t.push(i)}if(this.state.strict&&a.length)for(let t=0;tthis.parseStatement("for")),this.scope.exit(),this.state.labels.pop(),this.finishNode(t,"ForStatement")}parseForIn(t,e,s){const i=this.match(n._in);return this.next(),i?s>-1&&this.unexpected(s):t.await=s>-1,"VariableDeclaration"!==e.type||null==e.declarations[0].init||i&&!this.state.strict&&"var"===e.kind&&"Identifier"===e.declarations[0].id.type?"AssignmentPattern"===e.type&&this.raise(e.start,f.InvalidLhs,"for-loop"):this.raise(e.start,f.ForInOfLoopInitializer,i?"for-in":"for-of"),t.left=e,t.right=i?this.parseExpression():this.parseMaybeAssign(),this.expect(n.parenR),t.body=this.withTopicForbiddingContext(()=>this.parseStatement("for")),this.scope.exit(),this.state.labels.pop(),this.finishNode(t,i?"ForInStatement":"ForOfStatement")}parseVar(t,e,s){const i=t.declarations=[],r=this.hasPlugin("typescript");for(t.kind=s;;){const t=this.startNode();if(this.parseVarId(t,s),this.eat(n.eq)?t.init=this.parseMaybeAssign(e):("const"!==s||this.match(n._in)||this.isContextual("of")?"Identifier"===t.id.type||e&&(this.match(n._in)||this.isContextual("of"))||this.raise(this.state.lastTokEnd,f.DeclarationMissingInitializer,"Complex binding patterns"):r||this.unexpected(),t.init=null),i.push(this.finishNode(t,"VariableDeclarator")),!this.eat(n.comma))break}return t}parseVarId(t,e){t.id=this.parseBindingAtom(),this.checkLVal(t.id,"var"===e?5:9,void 0,"variable declaration","var"!==e)}parseFunction(t,e=0,s=!1){const i=1&e,r=2&e,a=!(!i||4&e);this.initFunction(t,s),this.match(n.star)&&r&&this.raise(this.state.start,f.GeneratorInSingleStatementContext),t.generator=this.eat(n.star),i&&(t.id=this.parseFunctionId(a));const o=this.state.maybeInArrowParameters,h=this.state.yieldPos,p=this.state.awaitPos;return this.state.maybeInArrowParameters=!1,this.state.yieldPos=-1,this.state.awaitPos=-1,this.scope.enter(2),this.prodParam.enter(et(s,t.generator)),i||(t.id=this.parseFunctionId()),this.parseFunctionParams(t),this.withTopicForbiddingContext(()=>{this.parseFunctionBodyAndFinish(t,i?"FunctionDeclaration":"FunctionExpression")}),this.prodParam.exit(),this.scope.exit(),i&&!r&&this.registerFunctionStatementId(t),this.state.maybeInArrowParameters=o,this.state.yieldPos=h,this.state.awaitPos=p,t}parseFunctionId(t){return t||this.match(n.name)?this.parseIdentifier():null}parseFunctionParams(t,e){const s=this.state.inParameters;this.state.inParameters=!0,this.expect(n.parenL),t.params=this.parseBindingList(n.parenR,41,!1,e),this.state.inParameters=s,this.checkYieldAwaitInDefaultParams()}registerFunctionStatementId(t){t.id&&this.scope.declareName(t.id.name,this.state.strict||t.generator||t.async?this.scope.treatFunctionsAsVar?5:9:17,t.id.start)}parseClass(t,e,s){this.next(),this.takeDecorators(t);const i=this.state.strict;return this.state.strict=!0,this.parseClassId(t,e,s),this.parseClassSuper(t),t.body=this.parseClassBody(!!t.superClass,i),this.state.strict=i,this.finishNode(t,e?"ClassDeclaration":"ClassExpression")}isClassProperty(){return this.match(n.eq)||this.match(n.semi)||this.match(n.braceR)}isClassMethod(){return this.match(n.parenL)}isNonstaticConstructor(t){return!(t.computed||t.static||"constructor"!==t.key.name&&"constructor"!==t.key.value)}parseClassBody(t,e){this.classScope.enter();const s={hadConstructor:!1};let i=[];const r=this.startNode();if(r.body=[],this.expect(n.braceL),this.withTopicForbiddingContext(()=>{for(;!this.match(n.braceR);){if(this.eat(n.semi)){if(i.length>0)throw this.raise(this.state.lastTokEnd,f.DecoratorSemicolon);continue}if(this.match(n.at)){i.push(this.parseDecorator());continue}const e=this.startNode();i.length&&(e.decorators=i,this.resetStartLocationFromNode(e,i[0]),i=[]),this.parseClassMember(r,e,s,t),"constructor"===e.kind&&e.decorators&&e.decorators.length>0&&this.raise(e.start,f.DecoratorConstructor)}}),e||(this.state.strict=!1),this.next(),i.length)throw this.raise(this.state.start,f.TrailingDecorator);return this.classScope.exit(),this.finishNode(r,"ClassBody")}parseClassMemberFromModifier(t,e){const s=this.state.containsEsc,i=this.parseIdentifier(!0);if(this.isClassMethod()){const s=e;return s.kind="method",s.computed=!1,s.key=i,s.static=!1,this.pushClassMethod(t,s,!1,!1,!1,!1),!0}if(this.isClassProperty()){const s=e;return s.computed=!1,s.key=i,s.static=!1,t.body.push(this.parseClassProperty(s)),!0}if(s)throw this.unexpected();return!1}parseClassMember(t,e,s,i){const r=this.isContextual("static");r&&this.parseClassMemberFromModifier(t,e)||this.parseClassMemberWithIsStatic(t,e,s,r,i)}parseClassMemberWithIsStatic(t,e,s,i,r){const a=e,o=e,h=e,p=e,c=a,u=a;if(e.static=i,this.eat(n.star))return c.kind="method",this.parseClassPropertyName(c),"PrivateName"===c.key.type?void this.pushClassPrivateMethod(t,o,!0,!1):(this.isNonstaticConstructor(a)&&this.raise(a.key.start,f.ConstructorIsGenerator),void this.pushClassMethod(t,a,!0,!1,!1,!1));const l=this.state.containsEsc,d=this.parseClassPropertyName(e),m="PrivateName"===d.type,D="Identifier"===d.type,y=this.state.start;if(this.parsePostMemberNameModifiers(u),this.isClassMethod()){if(c.kind="method",m)return void this.pushClassPrivateMethod(t,o,!1,!1);const e=this.isNonstaticConstructor(a);let i=!1;e&&(a.kind="constructor",s.hadConstructor&&!this.hasPlugin("typescript")&&this.raise(d.start,f.DuplicateConstructor),s.hadConstructor=!0,i=r),this.pushClassMethod(t,a,!1,!1,e,i)}else if(this.isClassProperty())m?this.pushClassPrivateProperty(t,p):this.pushClassProperty(t,h);else if(!D||"async"!==d.name||l||this.isLineTerminator())!D||"get"!==d.name&&"set"!==d.name||l||this.match(n.star)&&this.isLineTerminator()?this.isLineTerminator()?m?this.pushClassPrivateProperty(t,p):this.pushClassProperty(t,h):this.unexpected():(c.kind=d.name,this.parseClassPropertyName(a),"PrivateName"===c.key.type?this.pushClassPrivateMethod(t,o,!1,!1):(this.isNonstaticConstructor(a)&&this.raise(a.key.start,f.ConstructorIsAccessor),this.pushClassMethod(t,a,!1,!1,!1,!1)),this.checkGetterSetterParams(a));else{const e=this.eat(n.star);u.optional&&this.unexpected(y),c.kind="method",this.parseClassPropertyName(c),this.parsePostMemberNameModifiers(u),"PrivateName"===c.key.type?this.pushClassPrivateMethod(t,o,e,!0):(this.isNonstaticConstructor(a)&&this.raise(a.key.start,f.ConstructorIsAsync),this.pushClassMethod(t,a,e,!0,!1,!1))}}parseClassPropertyName(t){const e=this.parsePropertyName(t,!0);return t.computed||!t.static||"prototype"!==e.name&&"prototype"!==e.value||this.raise(e.start,f.StaticPrototype),"PrivateName"===e.type&&"constructor"===e.id.name&&this.raise(e.start,f.ConstructorClassPrivateField),e}pushClassProperty(t,e){e.computed||"constructor"!==e.key.name&&"constructor"!==e.key.value||this.raise(e.key.start,f.ConstructorClassField),t.body.push(this.parseClassProperty(e))}pushClassPrivateProperty(t,e){this.expectPlugin("classPrivateProperties",e.key.start);const s=this.parseClassPrivateProperty(e);t.body.push(s),this.classScope.declarePrivateName(s.key.id.name,0,s.key.start)}pushClassMethod(t,e,s,i,r,a){t.body.push(this.parseMethod(e,s,i,r,a,"ClassMethod",!0))}pushClassPrivateMethod(t,e,s,i){this.expectPlugin("classPrivateMethods",e.key.start);const r=this.parseMethod(e,s,i,!1,!1,"ClassPrivateMethod",!0);t.body.push(r);const a="get"===r.kind?r.static?6:2:"set"===r.kind?r.static?5:1:0;this.classScope.declarePrivateName(r.key.id.name,a,r.key.start)}parsePostMemberNameModifiers(t){}parseAccessModifier(){}parseClassPrivateProperty(t){return this.scope.enter(80),this.prodParam.enter(0),t.value=this.eat(n.eq)?this.parseMaybeAssign():null,this.semicolon(),this.prodParam.exit(),this.scope.exit(),this.finishNode(t,"ClassPrivateProperty")}parseClassProperty(t){return t.typeAnnotation||this.expectPlugin("classProperties"),this.scope.enter(80),this.prodParam.enter(0),this.match(n.eq)?(this.expectPlugin("classProperties"),this.next(),t.value=this.parseMaybeAssign()):t.value=null,this.semicolon(),this.prodParam.exit(),this.scope.exit(),this.finishNode(t,"ClassProperty")}parseClassId(t,e,s,i=139){this.match(n.name)?(t.id=this.parseIdentifier(),e&&this.checkLVal(t.id,i,void 0,"class name")):s||!e?t.id=null:this.unexpected(null,f.MissingClassName)}parseClassSuper(t){t.superClass=this.eat(n._extends)?this.parseExprSubscripts():null}parseExport(t){const e=this.maybeParseExportDefaultSpecifier(t),s=!e||this.eat(n.comma),i=s&&this.eatExportStar(t),r=i&&this.maybeParseExportNamespaceSpecifier(t),a=s&&(!r||this.eat(n.comma)),o=e||i;if(i&&!r)return e&&this.unexpected(),this.parseExportFrom(t,!0),this.finishNode(t,"ExportAllDeclaration");const h=this.maybeParseExportNamedSpecifiers(t);if(e&&s&&!i&&!h||r&&a&&!h)throw this.unexpected(null,n.braceL);let p;if(o||h?(p=!1,this.parseExportFrom(t,o)):p=this.maybeParseExportDeclaration(t),o||h||p)return this.checkExport(t,!0,!1,!!t.source),this.finishNode(t,"ExportNamedDeclaration");if(this.eat(n._default))return t.declaration=this.parseExportDefaultExpression(),this.checkExport(t,!0,!0),this.finishNode(t,"ExportDefaultDeclaration");throw this.unexpected(null,n.braceL)}eatExportStar(t){return this.eat(n.star)}maybeParseExportDefaultSpecifier(t){if(this.isExportDefaultSpecifier()){this.expectPlugin("exportDefaultFrom");const e=this.startNode();return e.exported=this.parseIdentifier(!0),t.specifiers=[this.finishNode(e,"ExportDefaultSpecifier")],!0}return!1}maybeParseExportNamespaceSpecifier(t){if(this.isContextual("as")){t.specifiers||(t.specifiers=[]);const e=this.startNodeAt(this.state.lastTokStart,this.state.lastTokStartLoc);return this.next(),e.exported=this.parseIdentifier(!0),t.specifiers.push(this.finishNode(e,"ExportNamespaceSpecifier")),!0}return!1}maybeParseExportNamedSpecifiers(t){return!!this.match(n.braceL)&&(t.specifiers||(t.specifiers=[]),t.specifiers.push(...this.parseExportSpecifiers()),t.source=null,t.declaration=null,!0)}maybeParseExportDeclaration(t){if(this.shouldParseExportDeclaration()){if(this.isContextual("async")){const t=this.nextTokenStart();this.isUnparsedContextual(t,"function")||this.unexpected(t,n._function)}return t.specifiers=[],t.source=null,t.declaration=this.parseExportDeclaration(t),!0}return!1}isAsyncFunction(){if(!this.isContextual("async"))return!1;const t=this.nextTokenStart();return!o.test(this.input.slice(this.state.pos,t))&&this.isUnparsedContextual(t,"function")}parseExportDefaultExpression(){const t=this.startNode(),e=this.isAsyncFunction();if(this.match(n._function)||e)return this.next(),e&&this.next(),this.parseFunction(t,5,e);if(this.match(n._class))return this.parseClass(t,!0,!0);if(this.match(n.at))return this.hasPlugin("decorators")&&this.getPluginOption("decorators","decoratorsBeforeExport")&&this.raise(this.state.start,f.DecoratorBeforeExport),this.parseDecorators(!1),this.parseClass(t,!0,!0);if(this.match(n._const)||this.match(n._var)||this.isLet())throw this.raise(this.state.start,f.UnsupportedDefaultExport);{const t=this.parseMaybeAssign();return this.semicolon(),t}}parseExportDeclaration(t){return this.parseStatement(null)}isExportDefaultSpecifier(){if(this.match(n.name))return"async"!==this.state.value&&"let"!==this.state.value;if(!this.match(n._default))return!1;const t=this.nextTokenStart();return 44===this.input.charCodeAt(t)||this.isUnparsedContextual(t,"from")}parseExportFrom(t,e){this.eatContextual("from")?(t.source=this.parseImportSource(),this.checkExport(t)):e?this.unexpected():t.source=null,this.semicolon()}shouldParseExportDeclaration(){if(this.match(n.at)&&(this.expectOnePlugin(["decorators","decorators-legacy"]),this.hasPlugin("decorators"))){if(!this.getPluginOption("decorators","decoratorsBeforeExport"))return!0;this.unexpected(this.state.start,f.DecoratorBeforeExport)}return"var"===this.state.type.keyword||"const"===this.state.type.keyword||"function"===this.state.type.keyword||"class"===this.state.type.keyword||this.isLet()||this.isAsyncFunction()}checkExport(t,e,s,i){if(e)if(s)this.checkDuplicateExports(t,"default");else if(t.specifiers&&t.specifiers.length)for(let e=0,s=t.specifiers;e-1&&this.raise(t.start,"default"===e?f.DuplicateDefaultExport:f.DuplicateExport,e),this.state.exportedIdentifiers.push(e)}parseExportSpecifiers(){const t=[];let e=!0;for(this.expect(n.braceL);!this.eat(n.braceR);){if(e)e=!1;else if(this.expect(n.comma),this.eat(n.braceR))break;const s=this.startNode();s.local=this.parseIdentifier(!0),s.exported=this.eatContextual("as")?this.parseIdentifier(!0):s.local.__clone(),t.push(this.finishNode(s,"ExportSpecifier"))}return t}parseImport(t){if(t.specifiers=[],!this.match(n.string)){const e=!this.maybeParseDefaultImportSpecifier(t)||this.eat(n.comma),s=e&&this.maybeParseStarImportSpecifier(t);e&&!s&&this.parseNamedImportSpecifiers(t),this.expectContextual("from")}return t.source=this.parseImportSource(),this.semicolon(),this.finishNode(t,"ImportDeclaration")}parseImportSource(){return this.match(n.string)||this.unexpected(),this.parseExprAtom()}shouldParseDefaultImport(t){return this.match(n.name)}parseImportSpecifierLocal(t,e,s,i){e.local=this.parseIdentifier(),this.checkLVal(e.local,9,void 0,i),t.specifiers.push(this.finishNode(e,s))}maybeParseDefaultImportSpecifier(t){return!!this.shouldParseDefaultImport(t)&&(this.parseImportSpecifierLocal(t,this.startNode(),"ImportDefaultSpecifier","default import specifier"),!0)}maybeParseStarImportSpecifier(t){if(this.match(n.star)){const e=this.startNode();return this.next(),this.expectContextual("as"),this.parseImportSpecifierLocal(t,e,"ImportNamespaceSpecifier","import namespace specifier"),!0}return!1}parseNamedImportSpecifiers(t){let e=!0;for(this.expect(n.braceL);!this.eat(n.braceR);){if(e)e=!1;else{if(this.eat(n.colon))throw this.raise(this.state.start,f.DestructureNamedImport);if(this.expect(n.comma),this.eat(n.braceR))break}this.parseImportSpecifier(t)}}parseImportSpecifier(t){const e=this.startNode();e.imported=this.parseIdentifier(!0),this.eatContextual("as")?e.local=this.parseIdentifier():(this.checkReservedWord(e.imported.name,e.start,!0,!0),e.local=e.imported.__clone()),this.checkLVal(e.local,9,void 0,"import specifier"),t.specifiers.push(this.finishNode(e,"ImportSpecifier"))}}{constructor(t,e){super(t=function(t){const e={};for(let s=0,i=Object.keys(ut);s"'".concat(t,"'")).join(", "));if(at(t,"recordAndTuple")&&!ht.includes(nt(t,"recordAndTuple","syntaxType")))throw new Error("'recordAndTuple' requires 'syntaxType' option whose value should be one of: "+ht.map(t=>"'".concat(t,"'")).join(", "))}(t.plugins),s=function(t){const e=ct.filter(e=>at(t,e)),s=e.join("/");let i=St[s];if(!i){i=At;for(let t=0;t{const n=Kt;let o;try{o=function(t,e){let s;for(let i=0;in[t](i,e),s.map(Xt))}catch(t){throw e(t.message.replace(/ \(.*\)/,""),{start:{line:t.loc.line,column:t.loc.column+1}})}return delete o.tokens,Wt(o,Object.assign({},a,{originalText:i}))}}const Qt=Gt("parse",["jsx","flow"]),Yt=Gt("parse",["jsx",["flow",{all:!0,enums:!0}]]),$t=Gt("parse",["jsx","typescript"],["typescript"]),Zt=Gt("parseExpression",["jsx"]);function te(t,s){switch(t.type){case"ArrayExpression":return t.elements.forEach(i);case"ObjectExpression":return t.properties.forEach(i);case"ObjectProperty":if(t.computed)throw r("computed");if(t.shorthand)throw r("shorthand");return[t.key,t.value].forEach(i);case"UnaryExpression":switch(t.operator){case"+":case"-":return i(t.argument);default:throw r("operator")}case"Identifier":if(s&&"ObjectProperty"===s.type&&s.key===t)return;throw r();case"NullLiteral":case"BooleanLiteral":case"NumericLiteral":case"StringLiteral":return;default:throw r()}function i(e){return te(e,t)}function r(s){const i=s?"".concat(t.type," with ").concat(s,"=").concat(JSON.stringify(t[s])):t.type;return e("".concat(i," is not allowed in JSON."),{start:{line:t.loc.start.line,column:t.loc.start.column+1}})}}const ee=Object.assign({parse:Qt,astFormat:"estree",hasPragma:Jt},m),se=Object.assign({},ee,{parse:Yt}),ie=Object.assign({},ee,{parse:$t}),re=Object.assign({},ee,{parse:Zt});var ae={parsers:{babel:ee,"babel-flow":se,"babel-ts":ie,json:Object.assign({},re,{hasPragma:()=>!0}),json5:re,"json-stringify":Object.assign({parse:function(t,e,s){const i=Zt(t,e,s);return i.comments.forEach(te),te(i),i},astFormat:"estree-json"},m),__js_expression:re,__vue_expression:re,__vue_event_binding:ee}},ne=ae.parsers;t.default=ae,t.parsers=ne,Object.defineProperty(t,"__esModule",{value:!0})}));
},{}],91:[function(require,module,exports){
(function (global){
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = global || self, global.prettier = factory());
}(this, (function () { 'use strict';
var name = "prettier";
var version = "2.0.5";
var description = "Prettier is an opinionated code formatter";
var bin = "./bin/prettier.js";
var repository = "prettier/prettier";
var homepage = "https://prettier.io";
var author = "James Long";
var license = "MIT";
var main = "./index.js";
var engines = {
node: ">=10.13.0"
};
var dependencies = {
"@angular/compiler": "9.0.5",
"@babel/code-frame": "7.8.0",
"@babel/parser": "7.9.4",
"@glimmer/syntax": "0.50.0",
"@iarna/toml": "2.2.3",
"@typescript-eslint/typescript-estree": "2.26.0",
"angular-estree-parser": "1.3.0",
"angular-html-parser": "1.4.0",
camelcase: "5.3.1",
chalk: "4.0.0",
"ci-info": "watson/ci-info#f43f6a1cefff47fb361c88cf4b943fdbcaafe540",
"cjk-regex": "2.0.0",
cosmiconfig: "6.0.0",
dashify: "2.0.0",
dedent: "0.7.0",
diff: "4.0.2",
editorconfig: "0.15.3",
"editorconfig-to-prettier": "0.1.1",
"escape-string-regexp": "2.0.0",
esutils: "2.0.3",
"fast-glob": "3.2.2",
"find-parent-dir": "0.3.0",
"find-project-root": "1.1.1",
"flow-parser": "0.122.0",
"get-stream": "5.1.0",
globby: "11.0.0",
graphql: "15.0.0",
"html-element-attributes": "2.2.1",
"html-styles": "1.0.0",
"html-tag-names": "1.1.5",
ignore: "4.0.6",
"jest-docblock": "25.2.6",
"json-stable-stringify": "1.0.1",
leven: "3.1.0",
"lines-and-columns": "1.1.6",
"linguist-languages": "7.9.0",
lodash: "4.17.15",
mem: "6.0.1",
minimatch: "3.0.4",
minimist: "1.2.5",
"n-readlines": "1.0.0",
"please-upgrade-node": "3.2.0",
"postcss-less": "3.1.4",
"postcss-media-query-parser": "0.2.3",
"postcss-scss": "2.0.0",
"postcss-selector-parser": "2.2.3",
"postcss-values-parser": "2.0.1",
"regexp-util": "1.2.2",
"remark-math": "1.0.6",
"remark-parse": "5.0.0",
resolve: "1.16.1",
semver: "7.1.3",
srcset: "2.0.1",
"string-width": "4.2.0",
typescript: "3.8.3",
"unicode-regex": "3.0.0",
unified: "9.0.0",
vnopts: "1.0.2",
"yaml-unist-parser": "1.1.1"
};
var devDependencies = {
"@babel/core": "7.9.0",
"@babel/preset-env": "7.9.0",
"@rollup/plugin-alias": "3.0.1",
"@rollup/plugin-commonjs": "11.0.2",
"@rollup/plugin-json": "4.0.2",
"@rollup/plugin-node-resolve": "7.1.1",
"@rollup/plugin-replace": "2.3.1",
"babel-loader": "8.1.0",
benchmark: "2.1.4",
"builtin-modules": "3.1.0",
codecov: "3.6.5",
"cross-env": "7.0.2",
cspell: "4.0.55",
eslint: "6.8.0",
"eslint-config-prettier": "6.10.1",
"eslint-formatter-friendly": "7.0.0",
"eslint-plugin-import": "2.20.2",
"eslint-plugin-prettier": "3.1.2",
"eslint-plugin-react": "7.19.0",
"eslint-plugin-unicorn": "18.0.1",
execa: "4.0.0",
jest: "25.2.7",
"jest-snapshot-serializer-ansi": "1.0.0",
"jest-snapshot-serializer-raw": "1.1.0",
"jest-watch-typeahead": "0.5.0",
prettier: "2.0.4",
rimraf: "3.0.2",
rollup: "2.3.2",
"rollup-plugin-babel": "4.4.0",
"rollup-plugin-node-globals": "1.4.0",
"rollup-plugin-terser": "5.3.0",
shelljs: "0.8.3",
"snapshot-diff": "0.7.0",
"strip-ansi": "6.0.0",
"synchronous-promise": "2.0.10",
tempy: "0.5.0",
"terser-webpack-plugin": "2.3.5",
webpack: "4.42.1"
};
var scripts = {
prepublishOnly: "echo \"Error: must publish from dist/\" && exit 1",
"prepare-release": "yarn && yarn build && yarn test:dist",
test: "jest",
"test:dist": "cross-env NODE_ENV=production jest",
"test:dist-standalone": "cross-env NODE_ENV=production TEST_STANDALONE=1 jest tests/",
"test:integration": "jest tests_integration",
"perf:repeat": "yarn && yarn build && cross-env NODE_ENV=production node ./dist/bin-prettier.js --debug-repeat ${PERF_REPEAT:-1000} --loglevel debug ${PERF_FILE:-./index.js} > /dev/null",
"perf:repeat-inspect": "yarn && yarn build && cross-env NODE_ENV=production node --inspect-brk ./dist/bin-prettier.js --debug-repeat ${PERF_REPEAT:-1000} --loglevel debug ${PERF_FILE:-./index.js} > /dev/null",
"perf:benchmark": "yarn && yarn build && cross-env NODE_ENV=production node ./dist/bin-prettier.js --debug-benchmark --loglevel debug ${PERF_FILE:-./index.js} > /dev/null",
"lint:typecheck": "tsc",
"lint:eslint": "cross-env EFF_NO_LINK_RULES=true eslint . --format friendly",
"lint:changelog": "node ./scripts/lint-changelog.js",
"lint:prettier": "prettier \"**/*.{md,json,yml,html,css}\" --check",
"lint:dist": "eslint --no-eslintrc --no-ignore --env=es6,browser --parser-options=ecmaVersion:2016 \"dist/!(bin-prettier|index|third-party).js\"",
"lint:spellcheck": "cspell {bin,scripts,src,website}/**/*.js {docs,website/blog,changelog_unreleased}/**/*.md",
"lint:deps": "node ./scripts/check-deps.js",
build: "node --max-old-space-size=3072 ./scripts/build/build.js",
"build-docs": "node ./scripts/build-docs.js"
};
var _package = {
name: name,
version: version,
description: description,
bin: bin,
repository: repository,
homepage: homepage,
author: author,
license: license,
main: main,
engines: engines,
dependencies: dependencies,
devDependencies: devDependencies,
scripts: scripts
};
var _package$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name,
version: version,
description: description,
bin: bin,
repository: repository,
homepage: homepage,
author: author,
license: license,
main: main,
engines: engines,
dependencies: dependencies,
devDependencies: devDependencies,
scripts: scripts,
'default': _package
});
function Diff() {}
Diff.prototype = {
diff: function diff(oldString, newString) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var callback = options.callback;
if (typeof options === 'function') {
callback = options;
options = {};
}
this.options = options;
var self = this;
function done(value) {
if (callback) {
setTimeout(function () {
callback(undefined, value);
}, 0);
return true;
} else {
return value;
}
} // Allow subclasses to massage the input prior to running
oldString = this.castInput(oldString);
newString = this.castInput(newString);
oldString = this.removeEmpty(this.tokenize(oldString));
newString = this.removeEmpty(this.tokenize(newString));
var newLen = newString.length,
oldLen = oldString.length;
var editLength = 1;
var maxEditLength = newLen + oldLen;
var bestPath = [{
newPos: -1,
components: []
}]; // Seed editLength = 0, i.e. the content starts with the same values
var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);
if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {
// Identity per the equality and tokenizer
return done([{
value: this.join(newString),
count: newString.length
}]);
} // Main worker method. checks all permutations of a given edit length for acceptance.
function execEditLength() {
for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {
var basePath = void 0;
var addPath = bestPath[diagonalPath - 1],
removePath = bestPath[diagonalPath + 1],
_oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;
if (addPath) {
// No one else is going to attempt to use this value, clear it
bestPath[diagonalPath - 1] = undefined;
}
var canAdd = addPath && addPath.newPos + 1 < newLen,
canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;
if (!canAdd && !canRemove) {
// If this path is a terminal then prune
bestPath[diagonalPath] = undefined;
continue;
} // Select the diagonal that we want to branch from. We select the prior
// path whose position in the new string is the farthest from the origin
// and does not pass the bounds of the diff graph
if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {
basePath = clonePath(removePath);
self.pushComponent(basePath.components, undefined, true);
} else {
basePath = addPath; // No need to clone, we've pulled it from the list
basePath.newPos++;
self.pushComponent(basePath.components, true, undefined);
}
_oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done
if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {
return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));
} else {
// Otherwise track this path as a potential candidate and continue.
bestPath[diagonalPath] = basePath;
}
}
editLength++;
} // Performs the length of edit iteration. Is a bit fugly as this has to support the
// sync and async mode which is never fun. Loops over execEditLength until a value
// is produced.
if (callback) {
(function exec() {
setTimeout(function () {
// This should not happen, but we want to be safe.
/* istanbul ignore next */
if (editLength > maxEditLength) {
return callback();
}
if (!execEditLength()) {
exec();
}
}, 0);
})();
} else {
while (editLength <= maxEditLength) {
var ret = execEditLength();
if (ret) {
return ret;
}
}
}
},
pushComponent: function pushComponent(components, added, removed) {
var last = components[components.length - 1];
if (last && last.added === added && last.removed === removed) {
// We need to clone here as the component clone operation is just
// as shallow array clone
components[components.length - 1] = {
count: last.count + 1,
added: added,
removed: removed
};
} else {
components.push({
count: 1,
added: added,
removed: removed
});
}
},
extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {
var newLen = newString.length,
oldLen = oldString.length,
newPos = basePath.newPos,
oldPos = newPos - diagonalPath,
commonCount = 0;
while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {
newPos++;
oldPos++;
commonCount++;
}
if (commonCount) {
basePath.components.push({
count: commonCount
});
}
basePath.newPos = newPos;
return oldPos;
},
equals: function equals(left, right) {
if (this.options.comparator) {
return this.options.comparator(left, right);
} else {
return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();
}
},
removeEmpty: function removeEmpty(array) {
var ret = [];
for (var i = 0; i < array.length; i++) {
if (array[i]) {
ret.push(array[i]);
}
}
return ret;
},
castInput: function castInput(value) {
return value;
},
tokenize: function tokenize(value) {
return value.split('');
},
join: function join(chars) {
return chars.join('');
}
};
function buildValues(diff, components, newString, oldString, useLongestToken) {
var componentPos = 0,
componentLen = components.length,
newPos = 0,
oldPos = 0;
for (; componentPos < componentLen; componentPos++) {
var component = components[componentPos];
if (!component.removed) {
if (!component.added && useLongestToken) {
var value = newString.slice(newPos, newPos + component.count);
value = value.map(function (value, i) {
var oldValue = oldString[oldPos + i];
return oldValue.length > value.length ? oldValue : value;
});
component.value = diff.join(value);
} else {
component.value = diff.join(newString.slice(newPos, newPos + component.count));
}
newPos += component.count; // Common case
if (!component.added) {
oldPos += component.count;
}
} else {
component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));
oldPos += component.count; // Reverse add and remove so removes are output first to match common convention
// The diffing algorithm is tied to add then remove output and this is the simplest
// route to get the desired output with minimal overhead.
if (componentPos && components[componentPos - 1].added) {
var tmp = components[componentPos - 1];
components[componentPos - 1] = components[componentPos];
components[componentPos] = tmp;
}
}
} // Special case handle for when one terminal is ignored (i.e. whitespace).
// For this case we merge the terminal into the prior string and drop the change.
// This is only available for string mode.
var lastComponent = components[componentLen - 1];
if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {
components[componentLen - 2].value += lastComponent.value;
components.pop();
}
return components;
}
function clonePath(path) {
return {
newPos: path.newPos,
components: path.components.slice(0)
};
}
var characterDiff = new Diff();
function diffChars(oldStr, newStr, options) {
return characterDiff.diff(oldStr, newStr, options);
}
function generateOptions(options, defaults) {
if (typeof options === 'function') {
defaults.callback = options;
} else if (options) {
for (var name in options) {
/* istanbul ignore else */
if (options.hasOwnProperty(name)) {
defaults[name] = options[name];
}
}
}
return defaults;
} //
// Ranges and exceptions:
// Latin-1 Supplement, 0080–00FF
// - U+00D7 × Multiplication sign
// - U+00F7 ÷ Division sign
// Latin Extended-A, 0100–017F
// Latin Extended-B, 0180–024F
// IPA Extensions, 0250–02AF
// Spacing Modifier Letters, 02B0–02FF
// - U+02C7 ˇ ˇ Caron
// - U+02D8 ˘ ˘ Breve
// - U+02D9 ˙ ˙ Dot Above
// - U+02DA ˚ ˚ Ring Above
// - U+02DB ˛ ˛ Ogonek
// - U+02DC ˜ ˜ Small Tilde
// - U+02DD ˝ ˝ Double Acute Accent
// Latin Extended Additional, 1E00–1EFF
var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/;
var reWhitespace = /\S/;
var wordDiff = new Diff();
wordDiff.equals = function (left, right) {
if (this.options.ignoreCase) {
left = left.toLowerCase();
right = right.toLowerCase();
}
return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);
};
wordDiff.tokenize = function (value) {
var tokens = value.split(/(\s+|[()[\]{}'"]|\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.
for (var i = 0; i < tokens.length - 1; i++) {
// If we have an empty string in the next field and we have only word chars before and after, merge
if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {
tokens[i] += tokens[i + 2];
tokens.splice(i + 1, 2);
i--;
}
}
return tokens;
};
function diffWords(oldStr, newStr, options) {
options = generateOptions(options, {
ignoreWhitespace: true
});
return wordDiff.diff(oldStr, newStr, options);
}
function diffWordsWithSpace(oldStr, newStr, options) {
return wordDiff.diff(oldStr, newStr, options);
}
var lineDiff = new Diff();
lineDiff.tokenize = function (value) {
var retLines = [],
linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line
if (!linesAndNewlines[linesAndNewlines.length - 1]) {
linesAndNewlines.pop();
} // Merge the content and line separators into single tokens
for (var i = 0; i < linesAndNewlines.length; i++) {
var line = linesAndNewlines[i];
if (i % 2 && !this.options.newlineIsToken) {
retLines[retLines.length - 1] += line;
} else {
if (this.options.ignoreWhitespace) {
line = line.trim();
}
retLines.push(line);
}
}
return retLines;
};
function diffLines(oldStr, newStr, callback) {
return lineDiff.diff(oldStr, newStr, callback);
}
function diffTrimmedLines(oldStr, newStr, callback) {
var options = generateOptions(callback, {
ignoreWhitespace: true
});
return lineDiff.diff(oldStr, newStr, options);
}
var sentenceDiff = new Diff();
sentenceDiff.tokenize = function (value) {
return value.split(/(\S.+?[.!?])(?=\s+|$)/);
};
function diffSentences(oldStr, newStr, callback) {
return sentenceDiff.diff(oldStr, newStr, callback);
}
var cssDiff = new Diff();
cssDiff.tokenize = function (value) {
return value.split(/([{}:;,]|\s+)/);
};
function diffCss(oldStr, newStr, callback) {
return cssDiff.diff(oldStr, newStr, callback);
}
function _typeof(obj) {
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
_typeof = function _typeof(obj) {
return typeof obj;
};
} else {
_typeof = function _typeof(obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};
}
return _typeof(obj);
}
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) {
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
return arr2;
}
}
function _iterableToArray(iter) {
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance");
}
var objectPrototypeToString = Object.prototype.toString;
var jsonDiff = new Diff(); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a
// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:
jsonDiff.useLongestToken = true;
jsonDiff.tokenize = lineDiff.tokenize;
jsonDiff.castInput = function (value) {
var _this$options = this.options,
undefinedReplacement = _this$options.undefinedReplacement,
_this$options$stringi = _this$options.stringifyReplacer,
stringifyReplacer = _this$options$stringi === void 0 ? function (k, v) {
return typeof v === 'undefined' ? undefinedReplacement : v;
} : _this$options$stringi;
return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' ');
};
jsonDiff.equals = function (left, right) {
return Diff.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1'));
};
function diffJson(oldObj, newObj, options) {
return jsonDiff.diff(oldObj, newObj, options);
} // This function handles the presence of circular references by bailing out when encountering an
// object that is already on the "stack" of items being processed. Accepts an optional replacer
function canonicalize(obj, stack, replacementStack, replacer, key) {
stack = stack || [];
replacementStack = replacementStack || [];
if (replacer) {
obj = replacer(key, obj);
}
var i;
for (i = 0; i < stack.length; i += 1) {
if (stack[i] === obj) {
return replacementStack[i];
}
}
var canonicalizedObj;
if ('[object Array]' === objectPrototypeToString.call(obj)) {
stack.push(obj);
canonicalizedObj = new Array(obj.length);
replacementStack.push(canonicalizedObj);
for (i = 0; i < obj.length; i += 1) {
canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);
}
stack.pop();
replacementStack.pop();
return canonicalizedObj;
}
if (obj && obj.toJSON) {
obj = obj.toJSON();
}
if (_typeof(obj) === 'object' && obj !== null) {
stack.push(obj);
canonicalizedObj = {};
replacementStack.push(canonicalizedObj);
var sortedKeys = [],
_key;
for (_key in obj) {
/* istanbul ignore else */
if (obj.hasOwnProperty(_key)) {
sortedKeys.push(_key);
}
}
sortedKeys.sort();
for (i = 0; i < sortedKeys.length; i += 1) {
_key = sortedKeys[i];
canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);
}
stack.pop();
replacementStack.pop();
} else {
canonicalizedObj = obj;
}
return canonicalizedObj;
}
var arrayDiff = new Diff();
arrayDiff.tokenize = function (value) {
return value.slice();
};
arrayDiff.join = arrayDiff.removeEmpty = function (value) {
return value;
};
function diffArrays(oldArr, newArr, callback) {
return arrayDiff.diff(oldArr, newArr, callback);
}
function parsePatch(uniDiff) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/),
delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [],
list = [],
i = 0;
function parseIndex() {
var index = {};
list.push(index); // Parse diff metadata
while (i < diffstr.length) {
var line = diffstr[i]; // File header found, end parsing diff metadata
if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) {
break;
} // Diff index
var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line);
if (header) {
index.index = header[1];
}
i++;
} // Parse file headers if they are defined. Unified diff requires them, but
// there's no technical issues to have an isolated hunk without file header
parseFileHeader(index);
parseFileHeader(index); // Parse hunks
index.hunks = [];
while (i < diffstr.length) {
var _line = diffstr[i];
if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) {
break;
} else if (/^@@/.test(_line)) {
index.hunks.push(parseHunk());
} else if (_line && options.strict) {
// Ignore unexpected content unless in strict mode
throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));
} else {
i++;
}
}
} // Parses the --- and +++ headers, if none are found, no lines
// are consumed.
function parseFileHeader(index) {
var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]);
if (fileHeader) {
var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';
var data = fileHeader[2].split('\t', 2);
var fileName = data[0].replace(/\\\\/g, '\\');
if (/^".*"$/.test(fileName)) {
fileName = fileName.substr(1, fileName.length - 2);
}
index[keyPrefix + 'FileName'] = fileName;
index[keyPrefix + 'Header'] = (data[1] || '').trim();
i++;
}
} // Parses a hunk
// This assumes that we are at the start of a hunk.
function parseHunk() {
var chunkHeaderIndex = i,
chunkHeaderLine = diffstr[i++],
chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
var hunk = {
oldStart: +chunkHeader[1],
oldLines: +chunkHeader[2] || 1,
newStart: +chunkHeader[3],
newLines: +chunkHeader[4] || 1,
lines: [],
linedelimiters: []
};
var addCount = 0,
removeCount = 0;
for (; i < diffstr.length; i++) {
// Lines starting with '---' could be mistaken for the "remove line" operation
// But they could be the header for the next file. Therefore prune such cases out.
if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {
break;
}
var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0];
if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') {
hunk.lines.push(diffstr[i]);
hunk.linedelimiters.push(delimiters[i] || '\n');
if (operation === '+') {
addCount++;
} else if (operation === '-') {
removeCount++;
} else if (operation === ' ') {
addCount++;
removeCount++;
}
} else {
break;
}
} // Handle the empty block count case
if (!addCount && hunk.newLines === 1) {
hunk.newLines = 0;
}
if (!removeCount && hunk.oldLines === 1) {
hunk.oldLines = 0;
} // Perform optional sanity checking
if (options.strict) {
if (addCount !== hunk.newLines) {
throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));
}
if (removeCount !== hunk.oldLines) {
throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));
}
}
return hunk;
}
while (i < diffstr.length) {
parseIndex();
}
return list;
} // Iterator that traverses in the range of [min, max], stepping
// by distance from a given start position. I.e. for [0, 4], with
// start of 2, this will iterate 2, 3, 1, 4, 0.
function distanceIterator(start, minLine, maxLine) {
var wantForward = true,
backwardExhausted = false,
forwardExhausted = false,
localOffset = 1;
return function iterator() {
if (wantForward && !forwardExhausted) {
if (backwardExhausted) {
localOffset++;
} else {
wantForward = false;
} // Check if trying to fit beyond text length, and if not, check it fits
// after offset location (or desired location on first iteration)
if (start + localOffset <= maxLine) {
return localOffset;
}
forwardExhausted = true;
}
if (!backwardExhausted) {
if (!forwardExhausted) {
wantForward = true;
} // Check if trying to fit before text beginning, and if not, check it fits
// before offset location
if (minLine <= start - localOffset) {
return -localOffset++;
}
backwardExhausted = true;
return iterator();
} // We tried to fit hunk before text beginning and beyond text length, then
// hunk can't fit on the text. Return undefined
};
}
function applyPatch(source, uniDiff) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (typeof uniDiff === 'string') {
uniDiff = parsePatch(uniDiff);
}
if (Array.isArray(uniDiff)) {
if (uniDiff.length > 1) {
throw new Error('applyPatch only works with a single input.');
}
uniDiff = uniDiff[0];
} // Apply the diff to the input
var lines = source.split(/\r\n|[\n\v\f\r\x85]/),
delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [],
hunks = uniDiff.hunks,
compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) {
return line === patchContent;
},
errorCount = 0,
fuzzFactor = options.fuzzFactor || 0,
minLine = 0,
offset = 0,
removeEOFNL,
addEOFNL;
/**
* Checks if the hunk exactly fits on the provided location
*/
function hunkFits(hunk, toPos) {
for (var j = 0; j < hunk.lines.length; j++) {
var line = hunk.lines[j],
operation = line.length > 0 ? line[0] : ' ',
content = line.length > 0 ? line.substr(1) : line;
if (operation === ' ' || operation === '-') {
// Context sanity check
if (!compareLine(toPos + 1, lines[toPos], operation, content)) {
errorCount++;
if (errorCount > fuzzFactor) {
return false;
}
}
toPos++;
}
}
return true;
} // Search best fit offsets for each hunk based on the previous ones
for (var i = 0; i < hunks.length; i++) {
var hunk = hunks[i],
maxLine = lines.length - hunk.oldLines,
localOffset = 0,
toPos = offset + hunk.oldStart - 1;
var iterator = distanceIterator(toPos, minLine, maxLine);
for (; localOffset !== undefined; localOffset = iterator()) {
if (hunkFits(hunk, toPos + localOffset)) {
hunk.offset = offset += localOffset;
break;
}
}
if (localOffset === undefined) {
return false;
} // Set lower text limit to end of the current hunk, so next ones don't try
// to fit over already patched text
minLine = hunk.offset + hunk.oldStart + hunk.oldLines;
} // Apply patch hunks
var diffOffset = 0;
for (var _i = 0; _i < hunks.length; _i++) {
var _hunk = hunks[_i],
_toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;
diffOffset += _hunk.newLines - _hunk.oldLines;
if (_toPos < 0) {
// Creating a new file
_toPos = 0;
}
for (var j = 0; j < _hunk.lines.length; j++) {
var line = _hunk.lines[j],
operation = line.length > 0 ? line[0] : ' ',
content = line.length > 0 ? line.substr(1) : line,
delimiter = _hunk.linedelimiters[j];
if (operation === ' ') {
_toPos++;
} else if (operation === '-') {
lines.splice(_toPos, 1);
delimiters.splice(_toPos, 1);
/* istanbul ignore else */
} else if (operation === '+') {
lines.splice(_toPos, 0, content);
delimiters.splice(_toPos, 0, delimiter);
_toPos++;
} else if (operation === '\\') {
var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;
if (previousOperation === '+') {
removeEOFNL = true;
} else if (previousOperation === '-') {
addEOFNL = true;
}
}
}
} // Handle EOFNL insertion/removal
if (removeEOFNL) {
while (!lines[lines.length - 1]) {
lines.pop();
delimiters.pop();
}
} else if (addEOFNL) {
lines.push('');
delimiters.push('\n');
}
for (var _k = 0; _k < lines.length - 1; _k++) {
lines[_k] = lines[_k] + delimiters[_k];
}
return lines.join('');
} // Wrapper that supports multiple file patches via callbacks.
function applyPatches(uniDiff, options) {
if (typeof uniDiff === 'string') {
uniDiff = parsePatch(uniDiff);
}
var currentIndex = 0;
function processIndex() {
var index = uniDiff[currentIndex++];
if (!index) {
return options.complete();
}
options.loadFile(index, function (err, data) {
if (err) {
return options.complete(err);
}
var updatedContent = applyPatch(data, index, options);
options.patched(index, updatedContent, function (err) {
if (err) {
return options.complete(err);
}
processIndex();
});
});
}
processIndex();
}
function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
if (!options) {
options = {};
}
if (typeof options.context === 'undefined') {
options.context = 4;
}
var diff = diffLines(oldStr, newStr, options);
diff.push({
value: '',
lines: []
}); // Append an empty value to make cleanup easier
function contextLines(lines) {
return lines.map(function (entry) {
return ' ' + entry;
});
}
var hunks = [];
var oldRangeStart = 0,
newRangeStart = 0,
curRange = [],
oldLine = 1,
newLine = 1;
var _loop = function _loop(i) {
var current = diff[i],
lines = current.lines || current.value.replace(/\n$/, '').split('\n');
current.lines = lines;
if (current.added || current.removed) {
var _curRange; // If we have previous context, start with that
if (!oldRangeStart) {
var prev = diff[i - 1];
oldRangeStart = oldLine;
newRangeStart = newLine;
if (prev) {
curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];
oldRangeStart -= curRange.length;
newRangeStart -= curRange.length;
}
} // Output our changes
(_curRange = curRange).push.apply(_curRange, _toConsumableArray(lines.map(function (entry) {
return (current.added ? '+' : '-') + entry;
}))); // Track the updated file position
if (current.added) {
newLine += lines.length;
} else {
oldLine += lines.length;
}
} else {
// Identical context lines. Track line changes
if (oldRangeStart) {
// Close out any changes that have been output (or join overlapping)
if (lines.length <= options.context * 2 && i < diff.length - 2) {
var _curRange2; // Overlapping
(_curRange2 = curRange).push.apply(_curRange2, _toConsumableArray(contextLines(lines)));
} else {
var _curRange3; // end the range and output
var contextSize = Math.min(lines.length, options.context);
(_curRange3 = curRange).push.apply(_curRange3, _toConsumableArray(contextLines(lines.slice(0, contextSize))));
var hunk = {
oldStart: oldRangeStart,
oldLines: oldLine - oldRangeStart + contextSize,
newStart: newRangeStart,
newLines: newLine - newRangeStart + contextSize,
lines: curRange
};
if (i >= diff.length - 2 && lines.length <= options.context) {
// EOF is inside this hunk
var oldEOFNewline = /\n$/.test(oldStr);
var newEOFNewline = /\n$/.test(newStr);
var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines;
if (!oldEOFNewline && noNlBeforeAdds) {
// special case: old has no eol and no trailing context; no-nl can end up before adds
curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file');
}
if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) {
curRange.push('\\ No newline at end of file');
}
}
hunks.push(hunk);
oldRangeStart = 0;
newRangeStart = 0;
curRange = [];
}
}
oldLine += lines.length;
newLine += lines.length;
}
};
for (var i = 0; i < diff.length; i++) {
_loop(i);
}
return {
oldFileName: oldFileName,
newFileName: newFileName,
oldHeader: oldHeader,
newHeader: newHeader,
hunks: hunks
};
}
function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options);
var ret = [];
if (oldFileName == newFileName) {
ret.push('Index: ' + oldFileName);
}
ret.push('===================================================================');
ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader));
ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader));
for (var i = 0; i < diff.hunks.length; i++) {
var hunk = diff.hunks[i];
ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');
ret.push.apply(ret, hunk.lines);
}
return ret.join('\n') + '\n';
}
function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {
return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);
}
function arrayEqual(a, b) {
if (a.length !== b.length) {
return false;
}
return arrayStartsWith(a, b);
}
function arrayStartsWith(array, start) {
if (start.length > array.length) {
return false;
}
for (var i = 0; i < start.length; i++) {
if (start[i] !== array[i]) {
return false;
}
}
return true;
}
function calcLineCount(hunk) {
var _calcOldNewLineCount = calcOldNewLineCount(hunk.lines),
oldLines = _calcOldNewLineCount.oldLines,
newLines = _calcOldNewLineCount.newLines;
if (oldLines !== undefined) {
hunk.oldLines = oldLines;
} else {
delete hunk.oldLines;
}
if (newLines !== undefined) {
hunk.newLines = newLines;
} else {
delete hunk.newLines;
}
}
function merge(mine, theirs, base) {
mine = loadPatch(mine, base);
theirs = loadPatch(theirs, base);
var ret = {}; // For index we just let it pass through as it doesn't have any necessary meaning.
// Leaving sanity checks on this to the API consumer that may know more about the
// meaning in their own context.
if (mine.index || theirs.index) {
ret.index = mine.index || theirs.index;
}
if (mine.newFileName || theirs.newFileName) {
if (!fileNameChanged(mine)) {
// No header or no change in ours, use theirs (and ours if theirs does not exist)
ret.oldFileName = theirs.oldFileName || mine.oldFileName;
ret.newFileName = theirs.newFileName || mine.newFileName;
ret.oldHeader = theirs.oldHeader || mine.oldHeader;
ret.newHeader = theirs.newHeader || mine.newHeader;
} else if (!fileNameChanged(theirs)) {
// No header or no change in theirs, use ours
ret.oldFileName = mine.oldFileName;
ret.newFileName = mine.newFileName;
ret.oldHeader = mine.oldHeader;
ret.newHeader = mine.newHeader;
} else {
// Both changed... figure it out
ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName);
ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName);
ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader);
ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader);
}
}
ret.hunks = [];
var mineIndex = 0,
theirsIndex = 0,
mineOffset = 0,
theirsOffset = 0;
while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) {
var mineCurrent = mine.hunks[mineIndex] || {
oldStart: Infinity
},
theirsCurrent = theirs.hunks[theirsIndex] || {
oldStart: Infinity
};
if (hunkBefore(mineCurrent, theirsCurrent)) {
// This patch does not overlap with any of the others, yay.
ret.hunks.push(cloneHunk(mineCurrent, mineOffset));
mineIndex++;
theirsOffset += mineCurrent.newLines - mineCurrent.oldLines;
} else if (hunkBefore(theirsCurrent, mineCurrent)) {
// This patch does not overlap with any of the others, yay.
ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset));
theirsIndex++;
mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines;
} else {
// Overlap, merge as best we can
var mergedHunk = {
oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart),
oldLines: 0,
newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset),
newLines: 0,
lines: []
};
mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines);
theirsIndex++;
mineIndex++;
ret.hunks.push(mergedHunk);
}
}
return ret;
}
function loadPatch(param, base) {
if (typeof param === 'string') {
if (/^@@/m.test(param) || /^Index:/m.test(param)) {
return parsePatch(param)[0];
}
if (!base) {
throw new Error('Must provide a base reference or pass in a patch');
}
return structuredPatch(undefined, undefined, base, param);
}
return param;
}
function fileNameChanged(patch) {
return patch.newFileName && patch.newFileName !== patch.oldFileName;
}
function selectField(index, mine, theirs) {
if (mine === theirs) {
return mine;
} else {
index.conflict = true;
return {
mine: mine,
theirs: theirs
};
}
}
function hunkBefore(test, check) {
return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart;
}
function cloneHunk(hunk, offset) {
return {
oldStart: hunk.oldStart,
oldLines: hunk.oldLines,
newStart: hunk.newStart + offset,
newLines: hunk.newLines,
lines: hunk.lines
};
}
function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {
// This will generally result in a conflicted hunk, but there are cases where the context
// is the only overlap where we can successfully merge the content here.
var mine = {
offset: mineOffset,
lines: mineLines,
index: 0
},
their = {
offset: theirOffset,
lines: theirLines,
index: 0
}; // Handle any leading content
insertLeading(hunk, mine, their);
insertLeading(hunk, their, mine); // Now in the overlap content. Scan through and select the best changes from each.
while (mine.index < mine.lines.length && their.index < their.lines.length) {
var mineCurrent = mine.lines[mine.index],
theirCurrent = their.lines[their.index];
if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) {
// Both modified ...
mutualChange(hunk, mine, their);
} else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') {
var _hunk$lines; // Mine inserted
(_hunk$lines = hunk.lines).push.apply(_hunk$lines, _toConsumableArray(collectChange(mine)));
} else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') {
var _hunk$lines2; // Theirs inserted
(_hunk$lines2 = hunk.lines).push.apply(_hunk$lines2, _toConsumableArray(collectChange(their)));
} else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') {
// Mine removed or edited
removal(hunk, mine, their);
} else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') {
// Their removed or edited
removal(hunk, their, mine, true);
} else if (mineCurrent === theirCurrent) {
// Context identity
hunk.lines.push(mineCurrent);
mine.index++;
their.index++;
} else {
// Context mismatch
conflict(hunk, collectChange(mine), collectChange(their));
}
} // Now push anything that may be remaining
insertTrailing(hunk, mine);
insertTrailing(hunk, their);
calcLineCount(hunk);
}
function mutualChange(hunk, mine, their) {
var myChanges = collectChange(mine),
theirChanges = collectChange(their);
if (allRemoves(myChanges) && allRemoves(theirChanges)) {
// Special case for remove changes that are supersets of one another
if (arrayStartsWith(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) {
var _hunk$lines3;
(_hunk$lines3 = hunk.lines).push.apply(_hunk$lines3, _toConsumableArray(myChanges));
return;
} else if (arrayStartsWith(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) {
var _hunk$lines4;
(_hunk$lines4 = hunk.lines).push.apply(_hunk$lines4, _toConsumableArray(theirChanges));
return;
}
} else if (arrayEqual(myChanges, theirChanges)) {
var _hunk$lines5;
(_hunk$lines5 = hunk.lines).push.apply(_hunk$lines5, _toConsumableArray(myChanges));
return;
}
conflict(hunk, myChanges, theirChanges);
}
function removal(hunk, mine, their, swap) {
var myChanges = collectChange(mine),
theirChanges = collectContext(their, myChanges);
if (theirChanges.merged) {
var _hunk$lines6;
(_hunk$lines6 = hunk.lines).push.apply(_hunk$lines6, _toConsumableArray(theirChanges.merged));
} else {
conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges);
}
}
function conflict(hunk, mine, their) {
hunk.conflict = true;
hunk.lines.push({
conflict: true,
mine: mine,
theirs: their
});
}
function insertLeading(hunk, insert, their) {
while (insert.offset < their.offset && insert.index < insert.lines.length) {
var line = insert.lines[insert.index++];
hunk.lines.push(line);
insert.offset++;
}
}
function insertTrailing(hunk, insert) {
while (insert.index < insert.lines.length) {
var line = insert.lines[insert.index++];
hunk.lines.push(line);
}
}
function collectChange(state) {
var ret = [],
operation = state.lines[state.index][0];
while (state.index < state.lines.length) {
var line = state.lines[state.index]; // Group additions that are immediately after subtractions and treat them as one "atomic" modify change.
if (operation === '-' && line[0] === '+') {
operation = '+';
}
if (operation === line[0]) {
ret.push(line);
state.index++;
} else {
break;
}
}
return ret;
}
function collectContext(state, matchChanges) {
var changes = [],
merged = [],
matchIndex = 0,
contextChanges = false,
conflicted = false;
while (matchIndex < matchChanges.length && state.index < state.lines.length) {
var change = state.lines[state.index],
match = matchChanges[matchIndex]; // Once we've hit our add, then we are done
if (match[0] === '+') {
break;
}
contextChanges = contextChanges || change[0] !== ' ';
merged.push(match);
matchIndex++; // Consume any additions in the other block as a conflict to attempt
// to pull in the remaining context after this
if (change[0] === '+') {
conflicted = true;
while (change[0] === '+') {
changes.push(change);
change = state.lines[++state.index];
}
}
if (match.substr(1) === change.substr(1)) {
changes.push(change);
state.index++;
} else {
conflicted = true;
}
}
if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) {
conflicted = true;
}
if (conflicted) {
return changes;
}
while (matchIndex < matchChanges.length) {
merged.push(matchChanges[matchIndex++]);
}
return {
merged: merged,
changes: changes
};
}
function allRemoves(changes) {
return changes.reduce(function (prev, change) {
return prev && change[0] === '-';
}, true);
}
function skipRemoveSuperset(state, removeChanges, delta) {
for (var i = 0; i < delta; i++) {
var changeContent = removeChanges[removeChanges.length - delta + i].substr(1);
if (state.lines[state.index + i] !== ' ' + changeContent) {
return false;
}
}
state.index += delta;
return true;
}
function calcOldNewLineCount(lines) {
var oldLines = 0;
var newLines = 0;
lines.forEach(function (line) {
if (typeof line !== 'string') {
var myCount = calcOldNewLineCount(line.mine);
var theirCount = calcOldNewLineCount(line.theirs);
if (oldLines !== undefined) {
if (myCount.oldLines === theirCount.oldLines) {
oldLines += myCount.oldLines;
} else {
oldLines = undefined;
}
}
if (newLines !== undefined) {
if (myCount.newLines === theirCount.newLines) {
newLines += myCount.newLines;
} else {
newLines = undefined;
}
}
} else {
if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) {
newLines++;
}
if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) {
oldLines++;
}
}
});
return {
oldLines: oldLines,
newLines: newLines
};
} // See: http://code.google.com/p/google-diff-match-patch/wiki/API
function convertChangesToDMP(changes) {
var ret = [],
change,
operation;
for (var i = 0; i < changes.length; i++) {
change = changes[i];
if (change.added) {
operation = 1;
} else if (change.removed) {
operation = -1;
} else {
operation = 0;
}
ret.push([operation, change.value]);
}
return ret;
}
function convertChangesToXML(changes) {
var ret = [];
for (var i = 0; i < changes.length; i++) {
var change = changes[i];
if (change.added) {
ret.push('');
} else if (change.removed) {
ret.push('');
}
ret.push(escapeHTML(change.value));
if (change.added) {
ret.push('');
} else if (change.removed) {
ret.push('');
}
}
return ret.join('');
}
function escapeHTML(s) {
var n = s;
n = n.replace(/&/g, '&');
n = n.replace(//g, '>');
n = n.replace(/"/g, '"');
return n;
}
var index_es6 = /*#__PURE__*/Object.freeze({
__proto__: null,
Diff: Diff,
diffChars: diffChars,
diffWords: diffWords,
diffWordsWithSpace: diffWordsWithSpace,
diffLines: diffLines,
diffTrimmedLines: diffTrimmedLines,
diffSentences: diffSentences,
diffCss: diffCss,
diffJson: diffJson,
diffArrays: diffArrays,
structuredPatch: structuredPatch,
createTwoFilesPatch: createTwoFilesPatch,
createPatch: createPatch,
applyPatch: applyPatch,
applyPatches: applyPatches,
parsePatch: parsePatch,
merge: merge,
convertChangesToDMP: convertChangesToDMP,
convertChangesToXML: convertChangesToXML,
canonicalize: canonicalize
});
var _shim_fs = {};
var _shim_fs$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
'default': _shim_fs
});
const sep = /[\\/]/;
function extname(path) {
const filename = basename(path);
const dotIndex = filename.lastIndexOf(".");
if (dotIndex === -1) return "";
return filename.slice(dotIndex);
}
function basename(path) {
return path.split(sep).pop();
}
function isAbsolute() {
return true;
}
var path = /*#__PURE__*/Object.freeze({
__proto__: null,
extname: extname,
basename: basename,
isAbsolute: isAbsolute
});
var global$1 = typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
var lookup = [];
var revLookup = [];
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
var inited = false;
function init() {
inited = true;
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
for (var i = 0, len = code.length; i < len; ++i) {
lookup[i] = code[i];
revLookup[code.charCodeAt(i)] = i;
}
revLookup['-'.charCodeAt(0)] = 62;
revLookup['_'.charCodeAt(0)] = 63;
}
function toByteArray(b64) {
if (!inited) {
init();
}
var i, j, l, tmp, placeHolders, arr;
var len = b64.length;
if (len % 4 > 0) {
throw new Error('Invalid string. Length must be a multiple of 4');
} // the number of equal signs (place holders)
// if there are two placeholders, than the two characters before it
// represent one byte
// if there is only one, then the three characters before it represent 2 bytes
// this is just a cheap hack to not do indexOf twice
placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; // base64 is 4/3 + up to two characters of the original data
arr = new Arr(len * 3 / 4 - placeHolders); // if there are placeholders, only get up to the last complete 4 chars
l = placeHolders > 0 ? len - 4 : len;
var L = 0;
for (i = 0, j = 0; i < l; i += 4, j += 3) {
tmp = revLookup[b64.charCodeAt(i)] << 18 | revLookup[b64.charCodeAt(i + 1)] << 12 | revLookup[b64.charCodeAt(i + 2)] << 6 | revLookup[b64.charCodeAt(i + 3)];
arr[L++] = tmp >> 16 & 0xFF;
arr[L++] = tmp >> 8 & 0xFF;
arr[L++] = tmp & 0xFF;
}
if (placeHolders === 2) {
tmp = revLookup[b64.charCodeAt(i)] << 2 | revLookup[b64.charCodeAt(i + 1)] >> 4;
arr[L++] = tmp & 0xFF;
} else if (placeHolders === 1) {
tmp = revLookup[b64.charCodeAt(i)] << 10 | revLookup[b64.charCodeAt(i + 1)] << 4 | revLookup[b64.charCodeAt(i + 2)] >> 2;
arr[L++] = tmp >> 8 & 0xFF;
arr[L++] = tmp & 0xFF;
}
return arr;
}
function tripletToBase64(num) {
return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];
}
function encodeChunk(uint8, start, end) {
var tmp;
var output = [];
for (var i = start; i < end; i += 3) {
tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + uint8[i + 2];
output.push(tripletToBase64(tmp));
}
return output.join('');
}
function fromByteArray(uint8) {
if (!inited) {
init();
}
var tmp;
var len = uint8.length;
var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
var output = '';
var parts = [];
var maxChunkLength = 16383; // must be multiple of 3
// go through the array every three bytes, we'll deal with trailing stuff later
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
parts.push(encodeChunk(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength));
} // pad the end with zeros, but make sure to not forget the extra bytes
if (extraBytes === 1) {
tmp = uint8[len - 1];
output += lookup[tmp >> 2];
output += lookup[tmp << 4 & 0x3F];
output += '==';
} else if (extraBytes === 2) {
tmp = (uint8[len - 2] << 8) + uint8[len - 1];
output += lookup[tmp >> 10];
output += lookup[tmp >> 4 & 0x3F];
output += lookup[tmp << 2 & 0x3F];
output += '=';
}
parts.push(output);
return parts.join('');
}
function read(buffer, offset, isLE, mLen, nBytes) {
var e, m;
var eLen = nBytes * 8 - mLen - 1;
var eMax = (1 << eLen) - 1;
var eBias = eMax >> 1;
var nBits = -7;
var i = isLE ? nBytes - 1 : 0;
var d = isLE ? -1 : 1;
var s = buffer[offset + i];
i += d;
e = s & (1 << -nBits) - 1;
s >>= -nBits;
nBits += eLen;
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
m = e & (1 << -nBits) - 1;
e >>= -nBits;
nBits += mLen;
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
if (e === 0) {
e = 1 - eBias;
} else if (e === eMax) {
return m ? NaN : (s ? -1 : 1) * Infinity;
} else {
m = m + Math.pow(2, mLen);
e = e - eBias;
}
return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
}
function write(buffer, value, offset, isLE, mLen, nBytes) {
var e, m, c;
var eLen = nBytes * 8 - mLen - 1;
var eMax = (1 << eLen) - 1;
var eBias = eMax >> 1;
var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;
var i = isLE ? 0 : nBytes - 1;
var d = isLE ? 1 : -1;
var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
value = Math.abs(value);
if (isNaN(value) || value === Infinity) {
m = isNaN(value) ? 1 : 0;
e = eMax;
} else {
e = Math.floor(Math.log(value) / Math.LN2);
if (value * (c = Math.pow(2, -e)) < 1) {
e--;
c *= 2;
}
if (e + eBias >= 1) {
value += rt / c;
} else {
value += rt * Math.pow(2, 1 - eBias);
}
if (value * c >= 2) {
e++;
c /= 2;
}
if (e + eBias >= eMax) {
m = 0;
e = eMax;
} else if (e + eBias >= 1) {
m = (value * c - 1) * Math.pow(2, mLen);
e = e + eBias;
} else {
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
e = 0;
}
}
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
e = e << mLen | m;
eLen += mLen;
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
buffer[offset + i - d] |= s * 128;
}
var toString = {}.toString;
var isArray = Array.isArray || function (arr) {
return toString.call(arr) == '[object Array]';
};
var INSPECT_MAX_BYTES = 50;
/**
* If `Buffer.TYPED_ARRAY_SUPPORT`:
* === true Use Uint8Array implementation (fastest)
* === false Use Object implementation (most compatible, even IE6)
*
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
* Opera 11.6+, iOS 4.2+.
*
* Due to various browser bugs, sometimes the Object implementation will be used even
* when the browser supports typed arrays.
*
* Note:
*
* - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
*
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
*
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
* incorrect length in some situations.
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
* get the Object implementation, which is slower but behaves correctly.
*/
Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined ? global$1.TYPED_ARRAY_SUPPORT : true;
function kMaxLength() {
return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff;
}
function createBuffer(that, length) {
if (kMaxLength() < length) {
throw new RangeError('Invalid typed array length');
}
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
that = new Uint8Array(length);
that.__proto__ = Buffer.prototype;
} else {
// Fallback: Return an object instance of the Buffer class
if (that === null) {
that = new Buffer(length);
}
that.length = length;
}
return that;
}
/**
* The Buffer constructor returns instances of `Uint8Array` that have their
* prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
* `Uint8Array`, so the returned instances will have all the node `Buffer` methods
* and the `Uint8Array` methods. Square bracket notation works as expected -- it
* returns a single octet.
*
* The `Uint8Array` prototype remains unmodified.
*/
function Buffer(arg, encodingOrOffset, length) {
if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
return new Buffer(arg, encodingOrOffset, length);
} // Common case.
if (typeof arg === 'number') {
if (typeof encodingOrOffset === 'string') {
throw new Error('If encoding is specified then the first argument must be a string');
}
return allocUnsafe(this, arg);
}
return from(this, arg, encodingOrOffset, length);
}
Buffer.poolSize = 8192; // not used by this implementation
// TODO: Legacy, not needed anymore. Remove in next major version.
Buffer._augment = function (arr) {
arr.__proto__ = Buffer.prototype;
return arr;
};
function from(that, value, encodingOrOffset, length) {
if (typeof value === 'number') {
throw new TypeError('"value" argument must not be a number');
}
if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
return fromArrayBuffer(that, value, encodingOrOffset, length);
}
if (typeof value === 'string') {
return fromString(that, value, encodingOrOffset);
}
return fromObject(that, value);
}
/**
* Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
* if value is a number.
* Buffer.from(str[, encoding])
* Buffer.from(array)
* Buffer.from(buffer)
* Buffer.from(arrayBuffer[, byteOffset[, length]])
**/
Buffer.from = function (value, encodingOrOffset, length) {
return from(null, value, encodingOrOffset, length);
};
if (Buffer.TYPED_ARRAY_SUPPORT) {
Buffer.prototype.__proto__ = Uint8Array.prototype;
Buffer.__proto__ = Uint8Array;
}
function assertSize(size) {
if (typeof size !== 'number') {
throw new TypeError('"size" argument must be a number');
} else if (size < 0) {
throw new RangeError('"size" argument must not be negative');
}
}
function alloc(that, size, fill, encoding) {
assertSize(size);
if (size <= 0) {
return createBuffer(that, size);
}
if (fill !== undefined) {
// Only pay attention to encoding if it's a string. This
// prevents accidentally sending in a number that would
// be interpretted as a start offset.
return typeof encoding === 'string' ? createBuffer(that, size).fill(fill, encoding) : createBuffer(that, size).fill(fill);
}
return createBuffer(that, size);
}
/**
* Creates a new filled Buffer instance.
* alloc(size[, fill[, encoding]])
**/
Buffer.alloc = function (size, fill, encoding) {
return alloc(null, size, fill, encoding);
};
function allocUnsafe(that, size) {
assertSize(size);
that = createBuffer(that, size < 0 ? 0 : checked(size) | 0);
if (!Buffer.TYPED_ARRAY_SUPPORT) {
for (var i = 0; i < size; ++i) {
that[i] = 0;
}
}
return that;
}
/**
* Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
* */
Buffer.allocUnsafe = function (size) {
return allocUnsafe(null, size);
};
/**
* Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
*/
Buffer.allocUnsafeSlow = function (size) {
return allocUnsafe(null, size);
};
function fromString(that, string, encoding) {
if (typeof encoding !== 'string' || encoding === '') {
encoding = 'utf8';
}
if (!Buffer.isEncoding(encoding)) {
throw new TypeError('"encoding" must be a valid string encoding');
}
var length = byteLength(string, encoding) | 0;
that = createBuffer(that, length);
var actual = that.write(string, encoding);
if (actual !== length) {
// Writing a hex string, for example, that contains invalid characters will
// cause everything after the first invalid character to be ignored. (e.g.
// 'abxxcd' will be treated as 'ab')
that = that.slice(0, actual);
}
return that;
}
function fromArrayLike(that, array) {
var length = array.length < 0 ? 0 : checked(array.length) | 0;
that = createBuffer(that, length);
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255;
}
return that;
}
function fromArrayBuffer(that, array, byteOffset, length) {
array.byteLength; // this throws if `array` is not a valid ArrayBuffer
if (byteOffset < 0 || array.byteLength < byteOffset) {
throw new RangeError('\'offset\' is out of bounds');
}
if (array.byteLength < byteOffset + (length || 0)) {
throw new RangeError('\'length\' is out of bounds');
}
if (byteOffset === undefined && length === undefined) {
array = new Uint8Array(array);
} else if (length === undefined) {
array = new Uint8Array(array, byteOffset);
} else {
array = new Uint8Array(array, byteOffset, length);
}
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
that = array;
that.__proto__ = Buffer.prototype;
} else {
// Fallback: Return an object instance of the Buffer class
that = fromArrayLike(that, array);
}
return that;
}
function fromObject(that, obj) {
if (internalIsBuffer(obj)) {
var len = checked(obj.length) | 0;
that = createBuffer(that, len);
if (that.length === 0) {
return that;
}
obj.copy(that, 0, 0, len);
return that;
}
if (obj) {
if (typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer || 'length' in obj) {
if (typeof obj.length !== 'number' || isnan(obj.length)) {
return createBuffer(that, 0);
}
return fromArrayLike(that, obj);
}
if (obj.type === 'Buffer' && isArray(obj.data)) {
return fromArrayLike(that, obj.data);
}
}
throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.');
}
function checked(length) {
// Note: cannot use `length < kMaxLength()` here because that fails when
// length is NaN (which is otherwise coerced to zero.)
if (length >= kMaxLength()) {
throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes');
}
return length | 0;
}
Buffer.isBuffer = isBuffer;
function internalIsBuffer(b) {
return !!(b != null && b._isBuffer);
}
Buffer.compare = function compare(a, b) {
if (!internalIsBuffer(a) || !internalIsBuffer(b)) {
throw new TypeError('Arguments must be Buffers');
}
if (a === b) return 0;
var x = a.length;
var y = b.length;
for (var i = 0, len = Math.min(x, y); i < len; ++i) {
if (a[i] !== b[i]) {
x = a[i];
y = b[i];
break;
}
}
if (x < y) return -1;
if (y < x) return 1;
return 0;
};
Buffer.isEncoding = function isEncoding(encoding) {
switch (String(encoding).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 true;
default:
return false;
}
};
Buffer.concat = function concat(list, length) {
if (!isArray(list)) {
throw new TypeError('"list" argument must be an Array of Buffers');
}
if (list.length === 0) {
return Buffer.alloc(0);
}
var i;
if (length === undefined) {
length = 0;
for (i = 0; i < list.length; ++i) {
length += list[i].length;
}
}
var buffer = Buffer.allocUnsafe(length);
var pos = 0;
for (i = 0; i < list.length; ++i) {
var buf = list[i];
if (!internalIsBuffer(buf)) {
throw new TypeError('"list" argument must be an Array of Buffers');
}
buf.copy(buffer, pos);
pos += buf.length;
}
return buffer;
};
function byteLength(string, encoding) {
if (internalIsBuffer(string)) {
return string.length;
}
if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
return string.byteLength;
}
if (typeof string !== 'string') {
string = '' + string;
}
var len = string.length;
if (len === 0) return 0; // Use a for loop to avoid recursion
var loweredCase = false;
for (;;) {
switch (encoding) {
case 'ascii':
case 'latin1':
case 'binary':
return len;
case 'utf8':
case 'utf-8':
case undefined:
return utf8ToBytes(string).length;
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return len * 2;
case 'hex':
return len >>> 1;
case 'base64':
return base64ToBytes(string).length;
default:
if (loweredCase) return utf8ToBytes(string).length; // assume utf8
encoding = ('' + encoding).toLowerCase();
loweredCase = true;
}
}
}
Buffer.byteLength = byteLength;
function slowToString(encoding, start, end) {
var loweredCase = false; // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
// property of a typed array.
// This behaves neither like String nor Uint8Array in that we set start/end
// to their upper/lower bounds if the value passed is out of range.
// undefined is handled specially as per ECMA-262 6th Edition,
// Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
if (start === undefined || start < 0) {
start = 0;
} // Return early if start > this.length. Done here to prevent potential uint32
// coercion fail below.
if (start > this.length) {
return '';
}
if (end === undefined || end > this.length) {
end = this.length;
}
if (end <= 0) {
return '';
} // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
end >>>= 0;
start >>>= 0;
if (end <= start) {
return '';
}
if (!encoding) encoding = 'utf8';
while (true) {
switch (encoding) {
case 'hex':
return hexSlice(this, start, end);
case 'utf8':
case 'utf-8':
return utf8Slice(this, start, end);
case 'ascii':
return asciiSlice(this, start, end);
case 'latin1':
case 'binary':
return latin1Slice(this, start, end);
case 'base64':
return base64Slice(this, start, end);
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return utf16leSlice(this, start, end);
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding);
encoding = (encoding + '').toLowerCase();
loweredCase = true;
}
}
} // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
// Buffer instances.
Buffer.prototype._isBuffer = true;
function swap(b, n, m) {
var i = b[n];
b[n] = b[m];
b[m] = i;
}
Buffer.prototype.swap16 = function swap16() {
var len = this.length;
if (len % 2 !== 0) {
throw new RangeError('Buffer size must be a multiple of 16-bits');
}
for (var i = 0; i < len; i += 2) {
swap(this, i, i + 1);
}
return this;
};
Buffer.prototype.swap32 = function swap32() {
var len = this.length;
if (len % 4 !== 0) {
throw new RangeError('Buffer size must be a multiple of 32-bits');
}
for (var i = 0; i < len; i += 4) {
swap(this, i, i + 3);
swap(this, i + 1, i + 2);
}
return this;
};
Buffer.prototype.swap64 = function swap64() {
var len = this.length;
if (len % 8 !== 0) {
throw new RangeError('Buffer size must be a multiple of 64-bits');
}
for (var i = 0; i < len; i += 8) {
swap(this, i, i + 7);
swap(this, i + 1, i + 6);
swap(this, i + 2, i + 5);
swap(this, i + 3, i + 4);
}
return this;
};
Buffer.prototype.toString = function toString() {
var length = this.length | 0;
if (length === 0) return '';
if (arguments.length === 0) return utf8Slice(this, 0, length);
return slowToString.apply(this, arguments);
};
Buffer.prototype.equals = function equals(b) {
if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer');
if (this === b) return true;
return Buffer.compare(this, b) === 0;
};
Buffer.prototype.inspect = function inspect() {
var str = '';
var max = INSPECT_MAX_BYTES;
if (this.length > 0) {
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');
if (this.length > max) str += ' ... ';
}
return '';
};
Buffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {
if (!internalIsBuffer(target)) {
throw new TypeError('Argument must be a Buffer');
}
if (start === undefined) {
start = 0;
}
if (end === undefined) {
end = target ? target.length : 0;
}
if (thisStart === undefined) {
thisStart = 0;
}
if (thisEnd === undefined) {
thisEnd = this.length;
}
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
throw new RangeError('out of range index');
}
if (thisStart >= thisEnd && start >= end) {
return 0;
}
if (thisStart >= thisEnd) {
return -1;
}
if (start >= end) {
return 1;
}
start >>>= 0;
end >>>= 0;
thisStart >>>= 0;
thisEnd >>>= 0;
if (this === target) return 0;
var x = thisEnd - thisStart;
var y = end - start;
var len = Math.min(x, y);
var thisCopy = this.slice(thisStart, thisEnd);
var targetCopy = target.slice(start, end);
for (var i = 0; i < len; ++i) {
if (thisCopy[i] !== targetCopy[i]) {
x = thisCopy[i];
y = targetCopy[i];
break;
}
}
if (x < y) return -1;
if (y < x) return 1;
return 0;
}; // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) {
// Empty buffer means no match
if (buffer.length === 0) return -1; // Normalize byteOffset
if (typeof byteOffset === 'string') {
encoding = byteOffset;
byteOffset = 0;
} else if (byteOffset > 0x7fffffff) {
byteOffset = 0x7fffffff;
} else if (byteOffset < -0x80000000) {
byteOffset = -0x80000000;
}
byteOffset = +byteOffset; // Coerce to Number.
if (isNaN(byteOffset)) {
// byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
byteOffset = dir ? 0 : buffer.length - 1;
} // Normalize byteOffset: negative offsets start from the end of the buffer
if (byteOffset < 0) byteOffset = buffer.length + byteOffset;
if (byteOffset >= buffer.length) {
if (dir) return -1;else byteOffset = buffer.length - 1;
} else if (byteOffset < 0) {
if (dir) byteOffset = 0;else return -1;
} // Normalize val
if (typeof val === 'string') {
val = Buffer.from(val, encoding);
} // Finally, search either indexOf (if dir is true) or lastIndexOf
if (internalIsBuffer(val)) {
// Special case: looking for empty string/buffer always fails
if (val.length === 0) {
return -1;
}
return arrayIndexOf(buffer, val, byteOffset, encoding, dir);
} else if (typeof val === 'number') {
val = val & 0xFF; // Search for a byte value [0-255]
if (Buffer.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf === 'function') {
if (dir) {
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset);
} else {
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset);
}
}
return arrayIndexOf(buffer, [val], byteOffset, encoding, dir);
}
throw new TypeError('val must be string, number or Buffer');
}
function arrayIndexOf(arr, val, byteOffset, encoding, dir) {
var indexSize = 1;
var arrLength = arr.length;
var valLength = val.length;
if (encoding !== undefined) {
encoding = String(encoding).toLowerCase();
if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') {
if (arr.length < 2 || val.length < 2) {
return -1;
}
indexSize = 2;
arrLength /= 2;
valLength /= 2;
byteOffset /= 2;
}
}
function read(buf, i) {
if (indexSize === 1) {
return buf[i];
} else {
return buf.readUInt16BE(i * indexSize);
}
}
var i;
if (dir) {
var foundIndex = -1;
for (i = byteOffset; i < arrLength; i++) {
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
if (foundIndex === -1) foundIndex = i;
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize;
} else {
if (foundIndex !== -1) i -= i - foundIndex;
foundIndex = -1;
}
}
} else {
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;
for (i = byteOffset; i >= 0; i--) {
var found = true;
for (var j = 0; j < valLength; j++) {
if (read(arr, i + j) !== read(val, j)) {
found = false;
break;
}
}
if (found) return i;
}
}
return -1;
}
Buffer.prototype.includes = function includes(val, byteOffset, encoding) {
return this.indexOf(val, byteOffset, encoding) !== -1;
};
Buffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) {
return bidirectionalIndexOf(this, val, byteOffset, encoding, true);
};
Buffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) {
return bidirectionalIndexOf(this, val, byteOffset, encoding, false);
};
function hexWrite(buf, string, offset, length) {
offset = Number(offset) || 0;
var remaining = buf.length - offset;
if (!length) {
length = remaining;
} else {
length = Number(length);
if (length > remaining) {
length = remaining;
}
} // must be an even number of digits
var strLen = string.length;
if (strLen % 2 !== 0) throw new TypeError('Invalid hex string');
if (length > strLen / 2) {
length = strLen / 2;
}
for (var i = 0; i < length; ++i) {
var parsed = parseInt(string.substr(i * 2, 2), 16);
if (isNaN(parsed)) return i;
buf[offset + i] = parsed;
}
return i;
}
function utf8Write(buf, string, offset, length) {
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length);
}
function asciiWrite(buf, string, offset, length) {
return blitBuffer(asciiToBytes(string), buf, offset, length);
}
function latin1Write(buf, string, offset, length) {
return asciiWrite(buf, string, offset, length);
}
function base64Write(buf, string, offset, length) {
return blitBuffer(base64ToBytes(string), buf, offset, length);
}
function ucs2Write(buf, string, offset, length) {
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length);
}
Buffer.prototype.write = function write(string, offset, length, encoding) {
// Buffer#write(string)
if (offset === undefined) {
encoding = 'utf8';
length = this.length;
offset = 0; // Buffer#write(string, encoding)
} else if (length === undefined && typeof offset === 'string') {
encoding = offset;
length = this.length;
offset = 0; // Buffer#write(string, offset[, length][, encoding])
} else if (isFinite(offset)) {
offset = offset | 0;
if (isFinite(length)) {
length = length | 0;
if (encoding === undefined) encoding = 'utf8';
} else {
encoding = length;
length = undefined;
} // legacy write(string, encoding, offset, length) - remove in v0.13
} else {
throw new Error('Buffer.write(string, encoding, offset[, length]) is no longer supported');
}
var remaining = this.length - offset;
if (length === undefined || length > remaining) length = remaining;
if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) {
throw new RangeError('Attempt to write outside buffer bounds');
}
if (!encoding) encoding = 'utf8';
var loweredCase = false;
for (;;) {
switch (encoding) {
case 'hex':
return hexWrite(this, string, offset, length);
case 'utf8':
case 'utf-8':
return utf8Write(this, string, offset, length);
case 'ascii':
return asciiWrite(this, string, offset, length);
case 'latin1':
case 'binary':
return latin1Write(this, string, offset, length);
case 'base64':
// Warning: maxLength not taken into account in base64Write
return base64Write(this, string, offset, length);
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return ucs2Write(this, string, offset, length);
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding);
encoding = ('' + encoding).toLowerCase();
loweredCase = true;
}
}
};
Buffer.prototype.toJSON = function toJSON() {
return {
type: 'Buffer',
data: Array.prototype.slice.call(this._arr || this, 0)
};
};
function base64Slice(buf, start, end) {
if (start === 0 && end === buf.length) {
return fromByteArray(buf);
} else {
return fromByteArray(buf.slice(start, end));
}
}
function utf8Slice(buf, start, end) {
end = Math.min(buf.length, end);
var res = [];
var i = start;
while (i < end) {
var firstByte = buf[i];
var codePoint = null;
var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1;
if (i + bytesPerSequence <= end) {
var secondByte, thirdByte, fourthByte, tempCodePoint;
switch (bytesPerSequence) {
case 1:
if (firstByte < 0x80) {
codePoint = firstByte;
}
break;
case 2:
secondByte = buf[i + 1];
if ((secondByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F;
if (tempCodePoint > 0x7F) {
codePoint = tempCodePoint;
}
}
break;
case 3:
secondByte = buf[i + 1];
thirdByte = buf[i + 2];
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F;
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
codePoint = tempCodePoint;
}
}
break;
case 4:
secondByte = buf[i + 1];
thirdByte = buf[i + 2];
fourthByte = buf[i + 3];
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F;
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
codePoint = tempCodePoint;
}
}
}
}
if (codePoint === null) {
// we did not generate a valid codePoint so insert a
// replacement char (U+FFFD) and advance only 1 byte
codePoint = 0xFFFD;
bytesPerSequence = 1;
} else if (codePoint > 0xFFFF) {
// encode to utf16 (surrogate pair dance)
codePoint -= 0x10000;
res.push(codePoint >>> 10 & 0x3FF | 0xD800);
codePoint = 0xDC00 | codePoint & 0x3FF;
}
res.push(codePoint);
i += bytesPerSequence;
}
return decodeCodePointsArray(res);
} // Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000;
function decodeCodePointsArray(codePoints) {
var len = codePoints.length;
if (len <= MAX_ARGUMENTS_LENGTH) {
return String.fromCharCode.apply(String, codePoints); // avoid extra slice()
} // Decode in chunks to avoid "call stack size exceeded".
var res = '';
var i = 0;
while (i < len) {
res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH));
}
return res;
}
function asciiSlice(buf, start, end) {
var ret = '';
end = Math.min(buf.length, end);
for (var i = start; i < end; ++i) {
ret += String.fromCharCode(buf[i] & 0x7F);
}
return ret;
}
function latin1Slice(buf, start, end) {
var ret = '';
end = Math.min(buf.length, end);
for (var i = start; i < end; ++i) {
ret += String.fromCharCode(buf[i]);
}
return ret;
}
function hexSlice(buf, start, end) {
var len = buf.length;
if (!start || start < 0) start = 0;
if (!end || end < 0 || end > len) end = len;
var out = '';
for (var i = start; i < end; ++i) {
out += toHex(buf[i]);
}
return out;
}
function utf16leSlice(buf, start, end) {
var bytes = buf.slice(start, end);
var res = '';
for (var i = 0; i < bytes.length; i += 2) {
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);
}
return res;
}
Buffer.prototype.slice = function slice(start, end) {
var len = this.length;
start = ~~start;
end = end === undefined ? len : ~~end;
if (start < 0) {
start += len;
if (start < 0) start = 0;
} else if (start > len) {
start = len;
}
if (end < 0) {
end += len;
if (end < 0) end = 0;
} else if (end > len) {
end = len;
}
if (end < start) end = start;
var newBuf;
if (Buffer.TYPED_ARRAY_SUPPORT) {
newBuf = this.subarray(start, end);
newBuf.__proto__ = Buffer.prototype;
} else {
var sliceLen = end - start;
newBuf = new Buffer(sliceLen, undefined);
for (var i = 0; i < sliceLen; ++i) {
newBuf[i] = this[i + start];
}
}
return newBuf;
};
/*
* Need to make sure that buffer isn't trying to write out of bounds.
*/
function checkOffset(offset, ext, length) {
if (offset % 1 !== 0 || offset < 0) throw new RangeError('offset is not uint');
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length');
}
Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength, noAssert) {
offset = offset | 0;
byteLength = byteLength | 0;
if (!noAssert) checkOffset(offset, byteLength, this.length);
var val = this[offset];
var mul = 1;
var i = 0;
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul;
}
return val;
};
Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength, noAssert) {
offset = offset | 0;
byteLength = byteLength | 0;
if (!noAssert) {
checkOffset(offset, byteLength, this.length);
}
var val = this[offset + --byteLength];
var mul = 1;
while (byteLength > 0 && (mul *= 0x100)) {
val += this[offset + --byteLength] * mul;
}
return val;
};
Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length);
return this[offset];
};
Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length);
return this[offset] | this[offset + 1] << 8;
};
Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length);
return this[offset] << 8 | this[offset + 1];
};
Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length);
return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000;
};
Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length);
return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]);
};
Buffer.prototype.readIntLE = function readIntLE(offset, byteLength, noAssert) {
offset = offset | 0;
byteLength = byteLength | 0;
if (!noAssert) checkOffset(offset, byteLength, this.length);
var val = this[offset];
var mul = 1;
var i = 0;
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul;
}
mul *= 0x80;
if (val >= mul) val -= Math.pow(2, 8 * byteLength);
return val;
};
Buffer.prototype.readIntBE = function readIntBE(offset, byteLength, noAssert) {
offset = offset | 0;
byteLength = byteLength | 0;
if (!noAssert) checkOffset(offset, byteLength, this.length);
var i = byteLength;
var mul = 1;
var val = this[offset + --i];
while (i > 0 && (mul *= 0x100)) {
val += this[offset + --i] * mul;
}
mul *= 0x80;
if (val >= mul) val -= Math.pow(2, 8 * byteLength);
return val;
};
Buffer.prototype.readInt8 = function readInt8(offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length);
if (!(this[offset] & 0x80)) return this[offset];
return (0xff - this[offset] + 1) * -1;
};
Buffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length);
var val = this[offset] | this[offset + 1] << 8;
return val & 0x8000 ? val | 0xFFFF0000 : val;
};
Buffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length);
var val = this[offset + 1] | this[offset] << 8;
return val & 0x8000 ? val | 0xFFFF0000 : val;
};
Buffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length);
return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24;
};
Buffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length);
return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3];
};
Buffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length);
return read(this, offset, true, 23, 4);
};
Buffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length);
return read(this, offset, false, 23, 4);
};
Buffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length);
return read(this, offset, true, 52, 8);
};
Buffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length);
return read(this, offset, false, 52, 8);
};
function checkInt(buf, value, offset, ext, max, min) {
if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance');
if (value > max || value < min) throw new RangeError('"value" argument is out of bounds');
if (offset + ext > buf.length) throw new RangeError('Index out of range');
}
Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength, noAssert) {
value = +value;
offset = offset | 0;
byteLength = byteLength | 0;
if (!noAssert) {
var maxBytes = Math.pow(2, 8 * byteLength) - 1;
checkInt(this, value, offset, byteLength, maxBytes, 0);
}
var mul = 1;
var i = 0;
this[offset] = value & 0xFF;
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = value / mul & 0xFF;
}
return offset + byteLength;
};
Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength, noAssert) {
value = +value;
offset = offset | 0;
byteLength = byteLength | 0;
if (!noAssert) {
var maxBytes = Math.pow(2, 8 * byteLength) - 1;
checkInt(this, value, offset, byteLength, maxBytes, 0);
}
var i = byteLength - 1;
var mul = 1;
this[offset + i] = value & 0xFF;
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = value / mul & 0xFF;
}
return offset + byteLength;
};
Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
this[offset] = value & 0xff;
return offset + 1;
};
function objectWriteUInt16(buf, value, offset, littleEndian) {
if (value < 0) value = 0xffff + value + 1;
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
buf[offset + i] = (value & 0xff << 8 * (littleEndian ? i : 1 - i)) >>> (littleEndian ? i : 1 - i) * 8;
}
}
Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value & 0xff;
this[offset + 1] = value >>> 8;
} else {
objectWriteUInt16(this, value, offset, true);
}
return offset + 2;
};
Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value >>> 8;
this[offset + 1] = value & 0xff;
} else {
objectWriteUInt16(this, value, offset, false);
}
return offset + 2;
};
function objectWriteUInt32(buf, value, offset, littleEndian) {
if (value < 0) value = 0xffffffff + value + 1;
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
buf[offset + i] = value >>> (littleEndian ? i : 3 - i) * 8 & 0xff;
}
}
Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset + 3] = value >>> 24;
this[offset + 2] = value >>> 16;
this[offset + 1] = value >>> 8;
this[offset] = value & 0xff;
} else {
objectWriteUInt32(this, value, offset, true);
}
return offset + 4;
};
Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value >>> 24;
this[offset + 1] = value >>> 16;
this[offset + 2] = value >>> 8;
this[offset + 3] = value & 0xff;
} else {
objectWriteUInt32(this, value, offset, false);
}
return offset + 4;
};
Buffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1);
checkInt(this, value, offset, byteLength, limit - 1, -limit);
}
var i = 0;
var mul = 1;
var sub = 0;
this[offset] = value & 0xFF;
while (++i < byteLength && (mul *= 0x100)) {
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
sub = 1;
}
this[offset + i] = (value / mul >> 0) - sub & 0xFF;
}
return offset + byteLength;
};
Buffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1);
checkInt(this, value, offset, byteLength, limit - 1, -limit);
}
var i = byteLength - 1;
var mul = 1;
var sub = 0;
this[offset + i] = value & 0xFF;
while (--i >= 0 && (mul *= 0x100)) {
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
sub = 1;
}
this[offset + i] = (value / mul >> 0) - sub & 0xFF;
}
return offset + byteLength;
};
Buffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80);
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
if (value < 0) value = 0xff + value + 1;
this[offset] = value & 0xff;
return offset + 1;
};
Buffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value & 0xff;
this[offset + 1] = value >>> 8;
} else {
objectWriteUInt16(this, value, offset, true);
}
return offset + 2;
};
Buffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value >>> 8;
this[offset + 1] = value & 0xff;
} else {
objectWriteUInt16(this, value, offset, false);
}
return offset + 2;
};
Buffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value & 0xff;
this[offset + 1] = value >>> 8;
this[offset + 2] = value >>> 16;
this[offset + 3] = value >>> 24;
} else {
objectWriteUInt32(this, value, offset, true);
}
return offset + 4;
};
Buffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {
value = +value;
offset = offset | 0;
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
if (value < 0) value = 0xffffffff + value + 1;
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value >>> 24;
this[offset + 1] = value >>> 16;
this[offset + 2] = value >>> 8;
this[offset + 3] = value & 0xff;
} else {
objectWriteUInt32(this, value, offset, false);
}
return offset + 4;
};
function checkIEEE754(buf, value, offset, ext, max, min) {
if (offset + ext > buf.length) throw new RangeError('Index out of range');
if (offset < 0) throw new RangeError('Index out of range');
}
function writeFloat(buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 4);
}
write(buf, value, offset, littleEndian, 23, 4);
return offset + 4;
}
Buffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {
return writeFloat(this, value, offset, true, noAssert);
};
Buffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {
return writeFloat(this, value, offset, false, noAssert);
};
function writeDouble(buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 8);
}
write(buf, value, offset, littleEndian, 52, 8);
return offset + 8;
}
Buffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {
return writeDouble(this, value, offset, true, noAssert);
};
Buffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {
return writeDouble(this, value, offset, false, noAssert);
}; // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy(target, targetStart, start, end) {
if (!start) start = 0;
if (!end && end !== 0) end = this.length;
if (targetStart >= target.length) targetStart = target.length;
if (!targetStart) targetStart = 0;
if (end > 0 && end < start) end = start; // Copy 0 bytes; we're done
if (end === start) return 0;
if (target.length === 0 || this.length === 0) return 0; // Fatal error conditions
if (targetStart < 0) {
throw new RangeError('targetStart out of bounds');
}
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds');
if (end < 0) throw new RangeError('sourceEnd out of bounds'); // Are we oob?
if (end > this.length) end = this.length;
if (target.length - targetStart < end - start) {
end = target.length - targetStart + start;
}
var len = end - start;
var i;
if (this === target && start < targetStart && targetStart < end) {
// descending copy from end
for (i = len - 1; i >= 0; --i) {
target[i + targetStart] = this[i + start];
}
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
// ascending copy from start
for (i = 0; i < len; ++i) {
target[i + targetStart] = this[i + start];
}
} else {
Uint8Array.prototype.set.call(target, this.subarray(start, start + len), targetStart);
}
return len;
}; // Usage:
// buffer.fill(number[, offset[, end]])
// buffer.fill(buffer[, offset[, end]])
// buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill(val, start, end, encoding) {
// Handle string cases:
if (typeof val === 'string') {
if (typeof start === 'string') {
encoding = start;
start = 0;
end = this.length;
} else if (typeof end === 'string') {
encoding = end;
end = this.length;
}
if (val.length === 1) {
var code = val.charCodeAt(0);
if (code < 256) {
val = code;
}
}
if (encoding !== undefined && typeof encoding !== 'string') {
throw new TypeError('encoding must be a string');
}
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
throw new TypeError('Unknown encoding: ' + encoding);
}
} else if (typeof val === 'number') {
val = val & 255;
} // Invalid ranges are not set to a default, so can range check early.
if (start < 0 || this.length < start || this.length < end) {
throw new RangeError('Out of range index');
}
if (end <= start) {
return this;
}
start = start >>> 0;
end = end === undefined ? this.length : end >>> 0;
if (!val) val = 0;
var i;
if (typeof val === 'number') {
for (i = start; i < end; ++i) {
this[i] = val;
}
} else {
var bytes = internalIsBuffer(val) ? val : utf8ToBytes(new Buffer(val, encoding).toString());
var len = bytes.length;
for (i = 0; i < end - start; ++i) {
this[i + start] = bytes[i % len];
}
}
return this;
}; // HELPER FUNCTIONS
// ================
var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g;
function base64clean(str) {
// Node strips out invalid characters like \n and \t from the string, base64-js does not
str = stringtrim(str).replace(INVALID_BASE64_RE, ''); // Node converts strings with length < 2 to ''
if (str.length < 2) return ''; // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
while (str.length % 4 !== 0) {
str = str + '=';
}
return str;
}
function stringtrim(str) {
if (str.trim) return str.trim();
return str.replace(/^\s+|\s+$/g, '');
}
function toHex(n) {
if (n < 16) return '0' + n.toString(16);
return n.toString(16);
}
function utf8ToBytes(string, units) {
units = units || Infinity;
var codePoint;
var length = string.length;
var leadSurrogate = null;
var bytes = [];
for (var i = 0; i < length; ++i) {
codePoint = string.charCodeAt(i); // is surrogate component
if (codePoint > 0xD7FF && codePoint < 0xE000) {
// last char was a lead
if (!leadSurrogate) {
// no lead yet
if (codePoint > 0xDBFF) {
// unexpected trail
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
continue;
} else if (i + 1 === length) {
// unpaired lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
continue;
} // valid lead
leadSurrogate = codePoint;
continue;
} // 2 leads in a row
if (codePoint < 0xDC00) {
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
leadSurrogate = codePoint;
continue;
} // valid surrogate pair
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;
} else if (leadSurrogate) {
// valid bmp char, but last char was a lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
}
leadSurrogate = null; // encode utf8
if (codePoint < 0x80) {
if ((units -= 1) < 0) break;
bytes.push(codePoint);
} else if (codePoint < 0x800) {
if ((units -= 2) < 0) break;
bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80);
} else if (codePoint < 0x10000) {
if ((units -= 3) < 0) break;
bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);
} else if (codePoint < 0x110000) {
if ((units -= 4) < 0) break;
bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);
} else {
throw new Error('Invalid code point');
}
}
return bytes;
}
function asciiToBytes(str) {
var byteArray = [];
for (var i = 0; i < str.length; ++i) {
// Node's code seems to be doing this and not & 0x7F..
byteArray.push(str.charCodeAt(i) & 0xFF);
}
return byteArray;
}
function utf16leToBytes(str, units) {
var c, hi, lo;
var byteArray = [];
for (var i = 0; i < str.length; ++i) {
if ((units -= 2) < 0) break;
c = str.charCodeAt(i);
hi = c >> 8;
lo = c % 256;
byteArray.push(lo);
byteArray.push(hi);
}
return byteArray;
}
function base64ToBytes(str) {
return toByteArray(base64clean(str));
}
function blitBuffer(src, dst, offset, length) {
for (var i = 0; i < length; ++i) {
if (i + offset >= dst.length || i >= src.length) break;
dst[i + offset] = src[i];
}
return i;
}
function isnan(val) {
return val !== val; // eslint-disable-line no-self-compare
} // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence
// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
function isBuffer(obj) {
return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj));
}
function isFastBuffer(obj) {
return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj);
} // For Node v0.10 support. Remove this eventually.
function isSlowBuffer(obj) {
return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0));
}
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function unwrapExports (x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
}
function createCommonjsModule(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
function getCjsExportFromNamespace (n) {
return n && n['default'] || n;
}
var fs = getCjsExportFromNamespace(_shim_fs$1);
/**
* @class
*/
class LineByLine {
constructor(file, options) {
options = options || {};
if (!options.readChunk) options.readChunk = 1024;
if (!options.newLineCharacter) {
options.newLineCharacter = 0x0a; //linux line ending
} else {
options.newLineCharacter = options.newLineCharacter.charCodeAt(0);
}
if (typeof file === 'number') {
this.fd = file;
} else {
this.fd = fs.openSync(file, 'r');
}
this.options = options;
this.newLineCharacter = options.newLineCharacter;
this.reset();
}
_searchInBuffer(buffer, hexNeedle) {
let found = -1;
for (let i = 0; i <= buffer.length; i++) {
let b_byte = buffer[i];
if (b_byte === hexNeedle) {
found = i;
break;
}
}
return found;
}
reset() {
this.eofReached = false;
this.linesCache = [];
this.fdPosition = 0;
}
close() {
fs.closeSync(this.fd);
this.fd = null;
}
_extractLines(buffer) {
let line;
const lines = [];
let bufferPosition = 0;
let lastNewLineBufferPosition = 0;
while (true) {
let bufferPositionValue = buffer[bufferPosition++];
if (bufferPositionValue === this.newLineCharacter) {
line = buffer.slice(lastNewLineBufferPosition, bufferPosition);
lines.push(line);
lastNewLineBufferPosition = bufferPosition;
} else if (!bufferPositionValue) {
break;
}
}
let leftovers = buffer.slice(lastNewLineBufferPosition, bufferPosition);
if (leftovers.length) {
lines.push(leftovers);
}
return lines;
}
_readChunk(lineLeftovers) {
let totalBytesRead = 0;
let bytesRead;
const buffers = [];
do {
const readBuffer = new Buffer(this.options.readChunk);
bytesRead = fs.readSync(this.fd, readBuffer, 0, this.options.readChunk, this.fdPosition);
totalBytesRead = totalBytesRead + bytesRead;
this.fdPosition = this.fdPosition + bytesRead;
buffers.push(readBuffer);
} while (bytesRead && this._searchInBuffer(buffers[buffers.length - 1], this.options.newLineCharacter) === -1);
let bufferData = Buffer.concat(buffers);
if (bytesRead < this.options.readChunk) {
this.eofReached = true;
bufferData = bufferData.slice(0, totalBytesRead);
}
if (totalBytesRead) {
this.linesCache = this._extractLines(bufferData);
if (lineLeftovers) {
this.linesCache[0] = Buffer.concat([lineLeftovers, this.linesCache[0]]);
}
}
return totalBytesRead;
}
next() {
if (!this.fd) return false;
let line = false;
if (this.eofReached && this.linesCache.length === 0) {
return line;
}
let bytesRead;
if (!this.linesCache.length) {
bytesRead = this._readChunk();
}
if (this.linesCache.length) {
line = this.linesCache.shift();
const lastLineCharacter = line[line.length - 1];
if (lastLineCharacter !== 0x0a) {
bytesRead = this._readChunk(line);
if (bytesRead) {
line = this.linesCache.shift();
}
}
}
if (this.eofReached && this.linesCache.length === 0) {
this.close();
}
if (line && line[line.length - 1] === this.newLineCharacter) {
line = line.slice(0, line.length - 1);
}
return line;
}
}
var readlines = LineByLine;
/**
* The inverse of `_.toPairs`; this method returns an object composed
* from key-value `pairs`.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Array
* @param {Array} pairs The key-value pairs.
* @returns {Object} Returns the new object.
* @example
*
* _.fromPairs([['a', 1], ['b', 2]]);
* // => { 'a': 1, 'b': 2 }
*/
function fromPairs(pairs) {
var index = -1,
length = pairs == null ? 0 : pairs.length,
result = {};
while (++index < length) {
var pair = pairs[index];
result[pair[0]] = pair[1];
}
return result;
}
var fromPairs_1 = fromPairs;
class ConfigError extends Error {}
class DebugError extends Error {}
class UndefinedParserError extends Error {}
var errors = {
ConfigError,
DebugError,
UndefinedParserError
};
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null) return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0) continue;
target[key] = source[key];
}
return target;
}
function _taggedTemplateLiteral(strings, raw) {
if (!raw) {
raw = strings.slice(0);
}
return Object.freeze(Object.defineProperties(strings, {
raw: {
value: Object.freeze(raw)
}
}));
}
// based off https://github.com/defunctzombie/node-process/blob/master/browser.js
function defaultSetTimout() {
throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout() {
throw new Error('clearTimeout has not been defined');
}
var cachedSetTimeout = defaultSetTimout;
var cachedClearTimeout = defaultClearTimeout;
if (typeof global$1.setTimeout === 'function') {
cachedSetTimeout = setTimeout;
}
if (typeof global$1.clearTimeout === 'function') {
cachedClearTimeout = clearTimeout;
}
function runTimeout(fun) {
if (cachedSetTimeout === setTimeout) {
//normal enviroments in sane situations
return setTimeout(fun, 0);
} // if setTimeout wasn't available but was latter defined
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
cachedSetTimeout = setTimeout;
return setTimeout(fun, 0);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedSetTimeout(fun, 0);
} catch (e) {
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedSetTimeout.call(null, fun, 0);
} catch (e) {
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
return cachedSetTimeout.call(this, fun, 0);
}
}
}
function runClearTimeout(marker) {
if (cachedClearTimeout === clearTimeout) {
//normal enviroments in sane situations
return clearTimeout(marker);
} // if clearTimeout wasn't available but was latter defined
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
cachedClearTimeout = clearTimeout;
return clearTimeout(marker);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedClearTimeout(marker);
} catch (e) {
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedClearTimeout.call(null, marker);
} catch (e) {
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
return cachedClearTimeout.call(this, marker);
}
}
}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;
function cleanUpNextTick() {
if (!draining || !currentQueue) {
return;
}
draining = false;
if (currentQueue.length) {
queue = currentQueue.concat(queue);
} else {
queueIndex = -1;
}
if (queue.length) {
drainQueue();
}
}
function drainQueue() {
if (draining) {
return;
}
var timeout = runTimeout(cleanUpNextTick);
draining = true;
var len = queue.length;
while (len) {
currentQueue = queue;
queue = [];
while (++queueIndex < len) {
if (currentQueue) {
currentQueue[queueIndex].run();
}
}
queueIndex = -1;
len = queue.length;
}
currentQueue = null;
draining = false;
runClearTimeout(timeout);
}
function nextTick(fun) {
var args = new Array(arguments.length - 1);
if (arguments.length > 1) {
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
runTimeout(drainQueue);
}
} // v8 likes predictible objects
function Item(fun, array) {
this.fun = fun;
this.array = array;
}
Item.prototype.run = function () {
this.fun.apply(null, this.array);
};
var title = 'browser';
var platform = 'browser';
var browser = true;
var env = {};
var argv = [];
var version$1 = ''; // empty string to avoid regexp issues
var versions = {};
var release = {};
var config = {};
function noop() {}
var on = noop;
var addListener = noop;
var once = noop;
var off = noop;
var removeListener = noop;
var removeAllListeners = noop;
var emit = noop;
function binding(name) {
throw new Error('process.binding is not supported');
}
function cwd() {
return '/';
}
function chdir(dir) {
throw new Error('process.chdir is not supported');
}
function umask() {
return 0;
} // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js
var performance = global$1.performance || {};
var performanceNow = performance.now || performance.mozNow || performance.msNow || performance.oNow || performance.webkitNow || function () {
return new Date().getTime();
}; // generate timestamp or delta
// see http://nodejs.org/api/process.html#process_process_hrtime
function hrtime(previousTimestamp) {
var clocktime = performanceNow.call(performance) * 1e-3;
var seconds = Math.floor(clocktime);
var nanoseconds = Math.floor(clocktime % 1 * 1e9);
if (previousTimestamp) {
seconds = seconds - previousTimestamp[0];
nanoseconds = nanoseconds - previousTimestamp[1];
if (nanoseconds < 0) {
seconds--;
nanoseconds += 1e9;
}
}
return [seconds, nanoseconds];
}
var startTime = new Date();
function uptime() {
var currentTime = new Date();
var dif = currentTime - startTime;
return dif / 1000;
}
var process = {
nextTick: nextTick,
title: title,
browser: browser,
env: env,
argv: argv,
version: version$1,
versions: versions,
on: on,
addListener: addListener,
once: once,
off: off,
removeListener: removeListener,
removeAllListeners: removeAllListeners,
emit: emit,
binding: binding,
cwd: cwd,
chdir: chdir,
umask: umask,
hrtime: hrtime,
platform: platform,
release: release,
config: config,
uptime: uptime
};
const debug = typeof process === 'object' && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error('SEMVER', ...args) : () => {};
var debug_1 = debug;
// Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code.
const SEMVER_SPEC_VERSION = '2.0.0';
const MAX_LENGTH = 256;
const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
/* istanbul ignore next */
9007199254740991; // Max safe segment length for coercion.
const MAX_SAFE_COMPONENT_LENGTH = 16;
var constants = {
SEMVER_SPEC_VERSION,
MAX_LENGTH,
MAX_SAFE_INTEGER,
MAX_SAFE_COMPONENT_LENGTH
};
var re_1 = createCommonjsModule(function (module, exports) {
const {
MAX_SAFE_COMPONENT_LENGTH
} = constants;
exports = module.exports = {}; // The actual regexps go on exports.re
const re = exports.re = [];
const src = exports.src = [];
const t = exports.t = {};
let R = 0;
const createToken = (name, value, isGlobal) => {
const index = R++;
debug_1(index, value);
t[name] = index;
src[index] = value;
re[index] = new RegExp(value, isGlobal ? 'g' : undefined);
}; // The following Regular Expressions can be used for tokenizing,
// validating, and parsing SemVer version strings.
// ## Numeric Identifier
// A single `0`, or a non-zero digit followed by zero or more digits.
createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*');
createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+'); // ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens.
createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*'); // ## Main Version
// Three dot-separated numeric identifiers.
createToken('MAINVERSION', "(".concat(src[t.NUMERICIDENTIFIER], ")\\.") + "(".concat(src[t.NUMERICIDENTIFIER], ")\\.") + "(".concat(src[t.NUMERICIDENTIFIER], ")"));
createToken('MAINVERSIONLOOSE', "(".concat(src[t.NUMERICIDENTIFIERLOOSE], ")\\.") + "(".concat(src[t.NUMERICIDENTIFIERLOOSE], ")\\.") + "(".concat(src[t.NUMERICIDENTIFIERLOOSE], ")")); // ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.
createToken('PRERELEASEIDENTIFIER', "(?:".concat(src[t.NUMERICIDENTIFIER], "|").concat(src[t.NONNUMERICIDENTIFIER], ")"));
createToken('PRERELEASEIDENTIFIERLOOSE', "(?:".concat(src[t.NUMERICIDENTIFIERLOOSE], "|").concat(src[t.NONNUMERICIDENTIFIER], ")")); // ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version
// identifiers.
createToken('PRERELEASE', "(?:-(".concat(src[t.PRERELEASEIDENTIFIER], "(?:\\.").concat(src[t.PRERELEASEIDENTIFIER], ")*))"));
createToken('PRERELEASELOOSE', "(?:-?(".concat(src[t.PRERELEASEIDENTIFIERLOOSE], "(?:\\.").concat(src[t.PRERELEASEIDENTIFIERLOOSE], ")*))")); // ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens.
createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+'); // ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata
// identifiers.
createToken('BUILD', "(?:\\+(".concat(src[t.BUILDIDENTIFIER], "(?:\\.").concat(src[t.BUILDIDENTIFIER], ")*))")); // ## Full Version String
// A main version, followed optionally by a pre-release version and
// build metadata.
// Note that the only major, minor, patch, and pre-release sections of
// the version string are capturing groups. The build metadata is not a
// capturing group, because it should not ever be used in version
// comparison.
createToken('FULLPLAIN', "v?".concat(src[t.MAINVERSION]).concat(src[t.PRERELEASE], "?").concat(src[t.BUILD], "?"));
createToken('FULL', "^".concat(src[t.FULLPLAIN], "$")); // like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
// common in the npm registry.
createToken('LOOSEPLAIN', "[v=\\s]*".concat(src[t.MAINVERSIONLOOSE]).concat(src[t.PRERELEASELOOSE], "?").concat(src[t.BUILD], "?"));
createToken('LOOSE', "^".concat(src[t.LOOSEPLAIN], "$"));
createToken('GTLT', '((?:<|>)?=?)'); // Something like "2.*" or "1.2.x".
// Note that "x.x" is a valid xRange identifer, meaning "any version"
// Only the first item is strictly required.
createToken('XRANGEIDENTIFIERLOOSE', "".concat(src[t.NUMERICIDENTIFIERLOOSE], "|x|X|\\*"));
createToken('XRANGEIDENTIFIER', "".concat(src[t.NUMERICIDENTIFIER], "|x|X|\\*"));
createToken('XRANGEPLAIN', "[v=\\s]*(".concat(src[t.XRANGEIDENTIFIER], ")") + "(?:\\.(".concat(src[t.XRANGEIDENTIFIER], ")") + "(?:\\.(".concat(src[t.XRANGEIDENTIFIER], ")") + "(?:".concat(src[t.PRERELEASE], ")?").concat(src[t.BUILD], "?") + ")?)?");
createToken('XRANGEPLAINLOOSE', "[v=\\s]*(".concat(src[t.XRANGEIDENTIFIERLOOSE], ")") + "(?:\\.(".concat(src[t.XRANGEIDENTIFIERLOOSE], ")") + "(?:\\.(".concat(src[t.XRANGEIDENTIFIERLOOSE], ")") + "(?:".concat(src[t.PRERELEASELOOSE], ")?").concat(src[t.BUILD], "?") + ")?)?");
createToken('XRANGE', "^".concat(src[t.GTLT], "\\s*").concat(src[t.XRANGEPLAIN], "$"));
createToken('XRANGELOOSE', "^".concat(src[t.GTLT], "\\s*").concat(src[t.XRANGEPLAINLOOSE], "$")); // Coercion.
// Extract anything that could conceivably be a part of a valid semver
createToken('COERCE', "".concat('(^|[^\\d])' + '(\\d{1,').concat(MAX_SAFE_COMPONENT_LENGTH, "})") + "(?:\\.(\\d{1,".concat(MAX_SAFE_COMPONENT_LENGTH, "}))?") + "(?:\\.(\\d{1,".concat(MAX_SAFE_COMPONENT_LENGTH, "}))?") + "(?:$|[^\\d])");
createToken('COERCERTL', src[t.COERCE], true); // Tilde ranges.
// Meaning is "reasonably at or greater than"
createToken('LONETILDE', '(?:~>?)');
createToken('TILDETRIM', "(\\s*)".concat(src[t.LONETILDE], "\\s+"), true);
exports.tildeTrimReplace = '$1~';
createToken('TILDE', "^".concat(src[t.LONETILDE]).concat(src[t.XRANGEPLAIN], "$"));
createToken('TILDELOOSE', "^".concat(src[t.LONETILDE]).concat(src[t.XRANGEPLAINLOOSE], "$")); // Caret ranges.
// Meaning is "at least and backwards compatible with"
createToken('LONECARET', '(?:\\^)');
createToken('CARETTRIM', "(\\s*)".concat(src[t.LONECARET], "\\s+"), true);
exports.caretTrimReplace = '$1^';
createToken('CARET', "^".concat(src[t.LONECARET]).concat(src[t.XRANGEPLAIN], "$"));
createToken('CARETLOOSE', "^".concat(src[t.LONECARET]).concat(src[t.XRANGEPLAINLOOSE], "$")); // A simple gt/lt/eq thing, or just "" to indicate "any version"
createToken('COMPARATORLOOSE', "^".concat(src[t.GTLT], "\\s*(").concat(src[t.LOOSEPLAIN], ")$|^$"));
createToken('COMPARATOR', "^".concat(src[t.GTLT], "\\s*(").concat(src[t.FULLPLAIN], ")$|^$")); // An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
createToken('COMPARATORTRIM', "(\\s*)".concat(src[t.GTLT], "\\s*(").concat(src[t.LOOSEPLAIN], "|").concat(src[t.XRANGEPLAIN], ")"), true);
exports.comparatorTrimReplace = '$1$2$3'; // Something like `1.2.3 - 1.2.4`
// Note that these all use the loose form, because they'll be
// checked against either the strict or loose comparator form
// later.
createToken('HYPHENRANGE', "^\\s*(".concat(src[t.XRANGEPLAIN], ")") + "\\s+-\\s+" + "(".concat(src[t.XRANGEPLAIN], ")") + "\\s*$");
createToken('HYPHENRANGELOOSE', "^\\s*(".concat(src[t.XRANGEPLAINLOOSE], ")") + "\\s+-\\s+" + "(".concat(src[t.XRANGEPLAINLOOSE], ")") + "\\s*$"); // Star ranges basically just allow anything at all.
createToken('STAR', '(<|>)?=?\\s*\\*');
});
var re_2 = re_1.re;
var re_3 = re_1.src;
var re_4 = re_1.t;
var re_5 = re_1.tildeTrimReplace;
var re_6 = re_1.caretTrimReplace;
var re_7 = re_1.comparatorTrimReplace;
const numeric = /^[0-9]+$/;
const compareIdentifiers = (a, b) => {
const anum = numeric.test(a);
const bnum = numeric.test(b);
if (anum && bnum) {
a = +a;
b = +b;
}
return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
};
const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
var identifiers = {
compareIdentifiers,
rcompareIdentifiers
};
const {
MAX_LENGTH: MAX_LENGTH$1,
MAX_SAFE_INTEGER: MAX_SAFE_INTEGER$1
} = constants;
const {
re,
t
} = re_1;
const {
compareIdentifiers: compareIdentifiers$1
} = identifiers;
class SemVer {
constructor(version, options) {
if (!options || typeof options !== 'object') {
options = {
loose: !!options,
includePrerelease: false
};
}
if (version instanceof SemVer) {
if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) {
return version;
} else {
version = version.version;
}
} else if (typeof version !== 'string') {
throw new TypeError("Invalid Version: ".concat(version));
}
if (version.length > MAX_LENGTH$1) {
throw new TypeError("version is longer than ".concat(MAX_LENGTH$1, " characters"));
}
debug_1('SemVer', version, options);
this.options = options;
this.loose = !!options.loose; // this isn't actually relevant for versions, but keep it so that we
// don't run into trouble passing this.options around.
this.includePrerelease = !!options.includePrerelease;
const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);
if (!m) {
throw new TypeError("Invalid Version: ".concat(version));
}
this.raw = version; // these are actually numbers
this.major = +m[1];
this.minor = +m[2];
this.patch = +m[3];
if (this.major > MAX_SAFE_INTEGER$1 || this.major < 0) {
throw new TypeError('Invalid major version');
}
if (this.minor > MAX_SAFE_INTEGER$1 || this.minor < 0) {
throw new TypeError('Invalid minor version');
}
if (this.patch > MAX_SAFE_INTEGER$1 || this.patch < 0) {
throw new TypeError('Invalid patch version');
} // numberify any prerelease numeric ids
if (!m[4]) {
this.prerelease = [];
} else {
this.prerelease = m[4].split('.').map(id => {
if (/^[0-9]+$/.test(id)) {
const num = +id;
if (num >= 0 && num < MAX_SAFE_INTEGER$1) {
return num;
}
}
return id;
});
}
this.build = m[5] ? m[5].split('.') : [];
this.format();
}
format() {
this.version = "".concat(this.major, ".").concat(this.minor, ".").concat(this.patch);
if (this.prerelease.length) {
this.version += "-".concat(this.prerelease.join('.'));
}
return this.version;
}
toString() {
return this.version;
}
compare(other) {
debug_1('SemVer.compare', this.version, this.options, other);
if (!(other instanceof SemVer)) {
if (typeof other === 'string' && other === this.version) {
return 0;
}
other = new SemVer(other, this.options);
}
if (other.version === this.version) {
return 0;
}
return this.compareMain(other) || this.comparePre(other);
}
compareMain(other) {
if (!(other instanceof SemVer)) {
other = new SemVer(other, this.options);
}
return compareIdentifiers$1(this.major, other.major) || compareIdentifiers$1(this.minor, other.minor) || compareIdentifiers$1(this.patch, other.patch);
}
comparePre(other) {
if (!(other instanceof SemVer)) {
other = new SemVer(other, this.options);
} // NOT having a prerelease is > having one
if (this.prerelease.length && !other.prerelease.length) {
return -1;
} else if (!this.prerelease.length && other.prerelease.length) {
return 1;
} else if (!this.prerelease.length && !other.prerelease.length) {
return 0;
}
let i = 0;
do {
const a = this.prerelease[i];
const b = other.prerelease[i];
debug_1('prerelease compare', i, a, b);
if (a === undefined && b === undefined) {
return 0;
} else if (b === undefined) {
return 1;
} else if (a === undefined) {
return -1;
} else if (a === b) {
continue;
} else {
return compareIdentifiers$1(a, b);
}
} while (++i);
}
compareBuild(other) {
if (!(other instanceof SemVer)) {
other = new SemVer(other, this.options);
}
let i = 0;
do {
const a = this.build[i];
const b = other.build[i];
debug_1('prerelease compare', i, a, b);
if (a === undefined && b === undefined) {
return 0;
} else if (b === undefined) {
return 1;
} else if (a === undefined) {
return -1;
} else if (a === b) {
continue;
} else {
return compareIdentifiers$1(a, b);
}
} while (++i);
} // preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
inc(release, identifier) {
switch (release) {
case 'premajor':
this.prerelease.length = 0;
this.patch = 0;
this.minor = 0;
this.major++;
this.inc('pre', identifier);
break;
case 'preminor':
this.prerelease.length = 0;
this.patch = 0;
this.minor++;
this.inc('pre', identifier);
break;
case 'prepatch':
// If this is already a prerelease, it will bump to the next version
// drop any prereleases that might already exist, since they are not
// relevant at this point.
this.prerelease.length = 0;
this.inc('patch', identifier);
this.inc('pre', identifier);
break;
// If the input is a non-prerelease version, this acts the same as
// prepatch.
case 'prerelease':
if (this.prerelease.length === 0) {
this.inc('patch', identifier);
}
this.inc('pre', identifier);
break;
case 'major':
// If this is a pre-major version, bump up to the same major version.
// Otherwise increment major.
// 1.0.0-5 bumps to 1.0.0
// 1.1.0 bumps to 2.0.0
if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
this.major++;
}
this.minor = 0;
this.patch = 0;
this.prerelease = [];
break;
case 'minor':
// If this is a pre-minor version, bump up to the same minor version.
// Otherwise increment minor.
// 1.2.0-5 bumps to 1.2.0
// 1.2.1 bumps to 1.3.0
if (this.patch !== 0 || this.prerelease.length === 0) {
this.minor++;
}
this.patch = 0;
this.prerelease = [];
break;
case 'patch':
// If this is not a pre-release version, it will increment the patch.
// If it is a pre-release it will bump up to the same patch version.
// 1.2.0-5 patches to 1.2.0
// 1.2.0 patches to 1.2.1
if (this.prerelease.length === 0) {
this.patch++;
}
this.prerelease = [];
break;
// This probably shouldn't be used publicly.
// 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
case 'pre':
if (this.prerelease.length === 0) {
this.prerelease = [0];
} else {
let i = this.prerelease.length;
while (--i >= 0) {
if (typeof this.prerelease[i] === 'number') {
this.prerelease[i]++;
i = -2;
}
}
if (i === -1) {
// didn't increment anything
this.prerelease.push(0);
}
}
if (identifier) {
// 1.2.0-beta.1 bumps to 1.2.0-beta.2,
// 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
if (this.prerelease[0] === identifier) {
if (isNaN(this.prerelease[1])) {
this.prerelease = [identifier, 0];
}
} else {
this.prerelease = [identifier, 0];
}
}
break;
default:
throw new Error("invalid increment argument: ".concat(release));
}
this.format();
this.raw = this.version;
return this;
}
}
var semver = SemVer;
const compare = (a, b, loose) => new semver(a, loose).compare(new semver(b, loose));
var compare_1 = compare;
const lt = (a, b, loose) => compare_1(a, b, loose) < 0;
var lt_1 = lt;
const gte = (a, b, loose) => compare_1(a, b, loose) >= 0;
var gte_1 = gte;
var arrayify = (object, keyName) => Object.entries(object).map(([key, value]) => Object.assign({
[keyName]: key
}, value));
var dedent_1 = createCommonjsModule(function (module) {
function dedent(strings) {
var raw = void 0;
if (typeof strings === "string") {
// dedent can be used as a plain function
raw = [strings];
} else {
raw = strings.raw;
} // first, perform interpolation
var result = "";
for (var i = 0; i < raw.length; i++) {
result += raw[i]. // join lines when there is a suppressed newline
replace(/\\\n[ \t]*/g, ""). // handle escaped backticks
replace(/\\`/g, "`");
if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) {
result += arguments.length <= i + 1 ? undefined : arguments[i + 1];
}
} // now strip indentation
var lines = result.split("\n");
var mindent = null;
lines.forEach(function (l) {
var m = l.match(/^(\s+)\S+/);
if (m) {
var indent = m[1].length;
if (!mindent) {
// this is the first indented line
mindent = indent;
} else {
mindent = Math.min(mindent, indent);
}
}
});
if (mindent !== null) {
result = lines.map(function (l) {
return l[0] === " " ? l.slice(mindent) : l;
}).join("\n");
} // dedent eats leading and trailing whitespace too
result = result.trim(); // handle escaped newlines at the end to ensure they don't get stripped too
return result.replace(/\\n/g, "\n");
}
{
module.exports = dedent;
}
});
function _templateObject6() {
const data = _taggedTemplateLiteral(["\n Require either '@prettier' or '@format' to be present in the file's first docblock comment\n in order for it to be formatted.\n "]);
_templateObject6 = function _templateObject6() {
return data;
};
return data;
}
function _templateObject5() {
const data = _taggedTemplateLiteral(["\n Format code starting at a given character offset.\n The range will extend backwards to the start of the first line containing the selected statement.\n This option cannot be used with --cursor-offset.\n "]);
_templateObject5 = function _templateObject5() {
return data;
};
return data;
}
function _templateObject4() {
const data = _taggedTemplateLiteral(["\n Format code ending at a given character offset (exclusive).\n The range will extend forwards to the end of the selected statement.\n This option cannot be used with --cursor-offset.\n "]);
_templateObject4 = function _templateObject4() {
return data;
};
return data;
}
function _templateObject3() {
const data = _taggedTemplateLiteral(["\n Custom directory that contains prettier plugins in node_modules subdirectory.\n Overrides default behavior when plugins are searched relatively to the location of Prettier.\n Multiple values are accepted.\n "]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
function _templateObject2() {
const data = _taggedTemplateLiteral(["\n Maintain existing\n (mixed values within one file are normalised by looking at what's used after the first line)\n "]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject() {
const data = _taggedTemplateLiteral(["\n Print (to stderr) where a cursor at the given position would move to after formatting.\n This option cannot be used with --range-start and --range-end.\n "]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
const CATEGORY_CONFIG = "Config";
const CATEGORY_EDITOR = "Editor";
const CATEGORY_FORMAT = "Format";
const CATEGORY_OTHER = "Other";
const CATEGORY_OUTPUT = "Output";
const CATEGORY_GLOBAL = "Global";
const CATEGORY_SPECIAL = "Special";
/**
* @typedef {Object} OptionInfo
* @property {string} [since] - available since version
* @property {string} category
* @property {'int' | 'boolean' | 'choice' | 'path'} type
* @property {boolean} [array] - indicate it's an array of the specified type
* @property {OptionValueInfo} [default]
* @property {OptionRangeInfo} [range] - for type int
* @property {string} description
* @property {string} [deprecated] - deprecated since version
* @property {OptionRedirectInfo} [redirect] - redirect deprecated option
* @property {(value: any) => boolean} [exception]
* @property {OptionChoiceInfo[]} [choices] - for type choice
* @property {string} [cliName]
* @property {string} [cliCategory]
* @property {string} [cliDescription]
*
* @typedef {number | boolean | string} OptionValue
* @typedef {OptionValue | [{ value: OptionValue[] }] | Array<{ since: string, value: OptionValue}>} OptionValueInfo
*
* @typedef {Object} OptionRedirectInfo
* @property {string} option
* @property {OptionValue} value
*
* @typedef {Object} OptionRangeInfo
* @property {number} start - recommended range start
* @property {number} end - recommended range end
* @property {number} step - recommended range step
*
* @typedef {Object} OptionChoiceInfo
* @property {boolean | string} value - boolean for the option that is originally boolean type
* @property {string} description
* @property {string} [since] - undefined if available since the first version of the option
* @property {string} [deprecated] - deprecated since version
* @property {OptionValueInfo} [redirect] - redirect deprecated value
*/
/** @type {{ [name: string]: OptionInfo }} */
const options = {
cursorOffset: {
since: "1.4.0",
category: CATEGORY_SPECIAL,
type: "int",
default: -1,
range: {
start: -1,
end: Infinity,
step: 1
},
description: dedent_1(_templateObject()),
cliCategory: CATEGORY_EDITOR
},
endOfLine: {
since: "1.15.0",
category: CATEGORY_GLOBAL,
type: "choice",
default: [{
since: "1.15.0",
value: "auto"
}, {
since: "2.0.0",
value: "lf"
}],
description: "Which end of line characters to apply.",
choices: [{
value: "lf",
description: "Line Feed only (\\n), common on Linux and macOS as well as inside git repos"
}, {
value: "crlf",
description: "Carriage Return + Line Feed characters (\\r\\n), common on Windows"
}, {
value: "cr",
description: "Carriage Return character only (\\r), used very rarely"
}, {
value: "auto",
description: dedent_1(_templateObject2())
}]
},
filepath: {
since: "1.4.0",
category: CATEGORY_SPECIAL,
type: "path",
description: "Specify the input filepath. This will be used to do parser inference.",
cliName: "stdin-filepath",
cliCategory: CATEGORY_OTHER,
cliDescription: "Path to the file to pretend that stdin comes from."
},
insertPragma: {
since: "1.8.0",
category: CATEGORY_SPECIAL,
type: "boolean",
default: false,
description: "Insert @format pragma into file's first docblock comment.",
cliCategory: CATEGORY_OTHER
},
parser: {
since: "0.0.10",
category: CATEGORY_GLOBAL,
type: "choice",
default: [{
since: "0.0.10",
value: "babylon"
}, {
since: "1.13.0",
value: undefined
}],
description: "Which parser to use.",
exception: value => typeof value === "string" || typeof value === "function",
choices: [{
value: "flow",
description: "Flow"
}, {
value: "babel",
since: "1.16.0",
description: "JavaScript"
}, {
value: "babel-flow",
since: "1.16.0",
description: "Flow"
}, {
value: "babel-ts",
since: "2.0.0",
description: "TypeScript"
}, {
value: "typescript",
since: "1.4.0",
description: "TypeScript"
}, {
value: "css",
since: "1.7.1",
description: "CSS"
}, {
value: "less",
since: "1.7.1",
description: "Less"
}, {
value: "scss",
since: "1.7.1",
description: "SCSS"
}, {
value: "json",
since: "1.5.0",
description: "JSON"
}, {
value: "json5",
since: "1.13.0",
description: "JSON5"
}, {
value: "json-stringify",
since: "1.13.0",
description: "JSON.stringify"
}, {
value: "graphql",
since: "1.5.0",
description: "GraphQL"
}, {
value: "markdown",
since: "1.8.0",
description: "Markdown"
}, {
value: "mdx",
since: "1.15.0",
description: "MDX"
}, {
value: "vue",
since: "1.10.0",
description: "Vue"
}, {
value: "yaml",
since: "1.14.0",
description: "YAML"
}, {
value: "glimmer",
since: null,
description: "Handlebars"
}, {
value: "html",
since: "1.15.0",
description: "HTML"
}, {
value: "angular",
since: "1.15.0",
description: "Angular"
}, {
value: "lwc",
since: "1.17.0",
description: "Lightning Web Components"
}]
},
plugins: {
since: "1.10.0",
type: "path",
array: true,
default: [{
value: []
}],
category: CATEGORY_GLOBAL,
description: "Add a plugin. Multiple plugins can be passed as separate `--plugin`s.",
exception: value => typeof value === "string" || typeof value === "object",
cliName: "plugin",
cliCategory: CATEGORY_CONFIG
},
pluginSearchDirs: {
since: "1.13.0",
type: "path",
array: true,
default: [{
value: []
}],
category: CATEGORY_GLOBAL,
description: dedent_1(_templateObject3()),
exception: value => typeof value === "string" || typeof value === "object",
cliName: "plugin-search-dir",
cliCategory: CATEGORY_CONFIG
},
printWidth: {
since: "0.0.0",
category: CATEGORY_GLOBAL,
type: "int",
default: 80,
description: "The line length where Prettier will try wrap.",
range: {
start: 0,
end: Infinity,
step: 1
}
},
rangeEnd: {
since: "1.4.0",
category: CATEGORY_SPECIAL,
type: "int",
default: Infinity,
range: {
start: 0,
end: Infinity,
step: 1
},
description: dedent_1(_templateObject4()),
cliCategory: CATEGORY_EDITOR
},
rangeStart: {
since: "1.4.0",
category: CATEGORY_SPECIAL,
type: "int",
default: 0,
range: {
start: 0,
end: Infinity,
step: 1
},
description: dedent_1(_templateObject5()),
cliCategory: CATEGORY_EDITOR
},
requirePragma: {
since: "1.7.0",
category: CATEGORY_SPECIAL,
type: "boolean",
default: false,
description: dedent_1(_templateObject6()),
cliCategory: CATEGORY_OTHER
},
tabWidth: {
type: "int",
category: CATEGORY_GLOBAL,
default: 2,
description: "Number of spaces per indentation level.",
range: {
start: 0,
end: Infinity,
step: 1
}
},
useTabs: {
since: "1.0.0",
category: CATEGORY_GLOBAL,
type: "boolean",
default: false,
description: "Indent with tabs instead of spaces."
}
};
var coreOptions = {
CATEGORY_CONFIG,
CATEGORY_EDITOR,
CATEGORY_FORMAT,
CATEGORY_OTHER,
CATEGORY_OUTPUT,
CATEGORY_GLOBAL,
CATEGORY_SPECIAL,
options
};
var require$$0 = getCjsExportFromNamespace(_package$1);
const semver$1 = {
compare: compare_1,
lt: lt_1,
gte: gte_1
};
const currentVersion = require$$0.version;
const coreOptions$1 = coreOptions.options;
/**
* Strings in `plugins` and `pluginSearchDirs` are handled by a wrapped version
* of this function created by `withPlugins`. Don't pass them here directly.
* @param {object} param0
* @param {(string | object)[]=} param0.plugins Strings are resolved by `withPlugins`.
* @param {string[]=} param0.pluginSearchDirs Added by `withPlugins`.
* @param {boolean=} param0.showUnreleased
* @param {boolean=} param0.showDeprecated
* @param {boolean=} param0.showInternal
*/
function getSupportInfo({
plugins = [],
showUnreleased = false,
showDeprecated = false,
showInternal = false
} = {}) {
// pre-release version is smaller than the normal version in semver,
// we need to treat it as the normal one so as to test new features.
const version = currentVersion.split("-", 1)[0];
const options = arrayify(Object.assign({}, ...plugins.map(({
options
}) => options), coreOptions$1), "name").filter(option => filterSince(option) && filterDeprecated(option)).sort((a, b) => a.name === b.name ? 0 : a.name < b.name ? -1 : 1).map(mapInternal).map(option => {
option = Object.assign({}, option);
if (Array.isArray(option.default)) {
option.default = option.default.length === 1 ? option.default[0].value : option.default.filter(filterSince).sort((info1, info2) => semver$1.compare(info2.since, info1.since))[0].value;
}
if (Array.isArray(option.choices)) {
option.choices = option.choices.filter(option => filterSince(option) && filterDeprecated(option));
}
const filteredPlugins = plugins.filter(plugin => plugin.defaultOptions && plugin.defaultOptions[option.name] !== undefined);
const pluginDefaults = filteredPlugins.reduce((reduced, plugin) => {
reduced[plugin.name] = plugin.defaultOptions[option.name];
return reduced;
}, {});
return Object.assign({}, option, {
pluginDefaults
});
});
const languages = plugins.reduce((all, plugin) => all.concat(plugin.languages || []), []).filter(filterSince);
return {
languages,
options
};
function filterSince(object) {
return showUnreleased || !("since" in object) || object.since && semver$1.gte(version, object.since);
}
function filterDeprecated(object) {
return showDeprecated || !("deprecated" in object) || object.deprecated && semver$1.lt(version, object.deprecated);
}
function mapInternal(object) {
if (showInternal) {
return object;
}
const newObject = _objectWithoutPropertiesLoose(object, ["cliName", "cliCategory", "cliDescription"]);
return newObject;
}
}
var support = {
getSupportInfo
};
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var _extendStatics = function extendStatics(d, b) {
_extendStatics = Object.setPrototypeOf || {
__proto__: []
} instanceof Array && function (d, b) {
d.__proto__ = b;
} || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
};
return _extendStatics(d, b);
};
function __extends(d, b) {
_extendStatics(d, b);
function __() {
this.constructor = d;
}
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
var _assign = function __assign() {
_assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return _assign.apply(this, arguments);
};
function __rest(s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
}
return t;
}
function __decorate(decorators, target, key, desc) {
var c = arguments.length,
r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function __param(paramIndex, decorator) {
return function (target, key) {
decorator(target, key, paramIndex);
};
}
function __metadata(metadataKey, metadataValue) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
}
function __awaiter(thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : new P(function (resolve) {
resolve(result.value);
}).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = {
label: 0,
sent: function sent() {
if (t[0] & 1) throw t[1];
return t[1];
},
trys: [],
ops: []
},
f,
y,
t,
g;
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function () {
return this;
}), g;
function verb(n) {
return function (v) {
return step([n, v]);
};
}
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [0];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2]) _.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [6, e];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5) throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
}
function __exportStar(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
function __values(o) {
var m = typeof Symbol === "function" && o[Symbol.iterator],
i = 0;
if (m) return m.call(o);
return {
next: function next() {
if (o && i >= o.length) o = void 0;
return {
value: o && o[i++],
done: !o
};
}
};
}
function __read(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o),
r,
ar = [],
e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
} catch (error) {
e = {
error: error
};
} finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
} finally {
if (e) throw e.error;
}
}
return ar;
}
function __spread() {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
}
function __spreadArrays() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j];
return r;
}
function __await(v) {
return this instanceof __await ? (this.v = v, this) : new __await(v);
}
function __asyncGenerator(thisArg, _arguments, generator) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var g = generator.apply(thisArg, _arguments || []),
i,
q = [];
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {
return this;
}, i;
function verb(n) {
if (g[n]) i[n] = function (v) {
return new Promise(function (a, b) {
q.push([n, v, a, b]) > 1 || resume(n, v);
});
};
}
function resume(n, v) {
try {
step(g[n](v));
} catch (e) {
settle(q[0][3], e);
}
}
function step(r) {
r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);
}
function fulfill(value) {
resume("next", value);
}
function reject(value) {
resume("throw", value);
}
function settle(f, v) {
if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);
}
}
function __asyncDelegator(o) {
var i, p;
return i = {}, verb("next"), verb("throw", function (e) {
throw e;
}), verb("return"), i[Symbol.iterator] = function () {
return this;
}, i;
function verb(n, f) {
i[n] = o[n] ? function (v) {
return (p = !p) ? {
value: __await(o[n](v)),
done: n === "return"
} : f ? f(v) : v;
} : f;
}
}
function __asyncValues(o) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator],
i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {
return this;
}, i);
function verb(n) {
i[n] = o[n] && function (v) {
return new Promise(function (resolve, reject) {
v = o[n](v), settle(resolve, reject, v.done, v.value);
});
};
}
function settle(resolve, reject, d, v) {
Promise.resolve(v).then(function (v) {
resolve({
value: v,
done: d
});
}, reject);
}
}
function __makeTemplateObject(cooked, raw) {
if (Object.defineProperty) {
Object.defineProperty(cooked, "raw", {
value: raw
});
} else {
cooked.raw = raw;
}
return cooked;
}
function __importStar(mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result.default = mod;
return result;
}
function __importDefault(mod) {
return mod && mod.__esModule ? mod : {
default: mod
};
}
var tslib_es6 = /*#__PURE__*/Object.freeze({
__proto__: null,
__extends: __extends,
get __assign () { return _assign; },
__rest: __rest,
__decorate: __decorate,
__param: __param,
__metadata: __metadata,
__awaiter: __awaiter,
__generator: __generator,
__exportStar: __exportStar,
__values: __values,
__read: __read,
__spread: __spread,
__spreadArrays: __spreadArrays,
__await: __await,
__asyncGenerator: __asyncGenerator,
__asyncDelegator: __asyncDelegator,
__asyncValues: __asyncValues,
__makeTemplateObject: __makeTemplateObject,
__importStar: __importStar,
__importDefault: __importDefault
});
var api = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.apiDescriptor = {
key: _key => /^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(_key) ? _key : JSON.stringify(_key),
value(value) {
if (value === null || typeof value !== 'object') {
return JSON.stringify(value);
}
if (Array.isArray(value)) {
return "[".concat(value.map(subValue => exports.apiDescriptor.value(subValue)).join(', '), "]");
}
const keys = Object.keys(value);
return keys.length === 0 ? '{}' : "{ ".concat(keys.map(key => "".concat(exports.apiDescriptor.key(key), ": ").concat(exports.apiDescriptor.value(value[key]))).join(', '), " }");
},
pair: ({
key,
value
}) => exports.apiDescriptor.value({
[key]: value
})
};
});
unwrapExports(api);
var api_1 = api.apiDescriptor;
var tslib_1 = getCjsExportFromNamespace(tslib_es6);
var descriptors = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
tslib_1.__exportStar(api, exports);
});
unwrapExports(descriptors);
var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
var escapeStringRegexp = function escapeStringRegexp(str) {
if (typeof str !== 'string') {
throw new TypeError('Expected a string');
}
return str.replace(matchOperatorsRe, '\\$&');
};
var colorName = {
"aliceblue": [240, 248, 255],
"antiquewhite": [250, 235, 215],
"aqua": [0, 255, 255],
"aquamarine": [127, 255, 212],
"azure": [240, 255, 255],
"beige": [245, 245, 220],
"bisque": [255, 228, 196],
"black": [0, 0, 0],
"blanchedalmond": [255, 235, 205],
"blue": [0, 0, 255],
"blueviolet": [138, 43, 226],
"brown": [165, 42, 42],
"burlywood": [222, 184, 135],
"cadetblue": [95, 158, 160],
"chartreuse": [127, 255, 0],
"chocolate": [210, 105, 30],
"coral": [255, 127, 80],
"cornflowerblue": [100, 149, 237],
"cornsilk": [255, 248, 220],
"crimson": [220, 20, 60],
"cyan": [0, 255, 255],
"darkblue": [0, 0, 139],
"darkcyan": [0, 139, 139],
"darkgoldenrod": [184, 134, 11],
"darkgray": [169, 169, 169],
"darkgreen": [0, 100, 0],
"darkgrey": [169, 169, 169],
"darkkhaki": [189, 183, 107],
"darkmagenta": [139, 0, 139],
"darkolivegreen": [85, 107, 47],
"darkorange": [255, 140, 0],
"darkorchid": [153, 50, 204],
"darkred": [139, 0, 0],
"darksalmon": [233, 150, 122],
"darkseagreen": [143, 188, 143],
"darkslateblue": [72, 61, 139],
"darkslategray": [47, 79, 79],
"darkslategrey": [47, 79, 79],
"darkturquoise": [0, 206, 209],
"darkviolet": [148, 0, 211],
"deeppink": [255, 20, 147],
"deepskyblue": [0, 191, 255],
"dimgray": [105, 105, 105],
"dimgrey": [105, 105, 105],
"dodgerblue": [30, 144, 255],
"firebrick": [178, 34, 34],
"floralwhite": [255, 250, 240],
"forestgreen": [34, 139, 34],
"fuchsia": [255, 0, 255],
"gainsboro": [220, 220, 220],
"ghostwhite": [248, 248, 255],
"gold": [255, 215, 0],
"goldenrod": [218, 165, 32],
"gray": [128, 128, 128],
"green": [0, 128, 0],
"greenyellow": [173, 255, 47],
"grey": [128, 128, 128],
"honeydew": [240, 255, 240],
"hotpink": [255, 105, 180],
"indianred": [205, 92, 92],
"indigo": [75, 0, 130],
"ivory": [255, 255, 240],
"khaki": [240, 230, 140],
"lavender": [230, 230, 250],
"lavenderblush": [255, 240, 245],
"lawngreen": [124, 252, 0],
"lemonchiffon": [255, 250, 205],
"lightblue": [173, 216, 230],
"lightcoral": [240, 128, 128],
"lightcyan": [224, 255, 255],
"lightgoldenrodyellow": [250, 250, 210],
"lightgray": [211, 211, 211],
"lightgreen": [144, 238, 144],
"lightgrey": [211, 211, 211],
"lightpink": [255, 182, 193],
"lightsalmon": [255, 160, 122],
"lightseagreen": [32, 178, 170],
"lightskyblue": [135, 206, 250],
"lightslategray": [119, 136, 153],
"lightslategrey": [119, 136, 153],
"lightsteelblue": [176, 196, 222],
"lightyellow": [255, 255, 224],
"lime": [0, 255, 0],
"limegreen": [50, 205, 50],
"linen": [250, 240, 230],
"magenta": [255, 0, 255],
"maroon": [128, 0, 0],
"mediumaquamarine": [102, 205, 170],
"mediumblue": [0, 0, 205],
"mediumorchid": [186, 85, 211],
"mediumpurple": [147, 112, 219],
"mediumseagreen": [60, 179, 113],
"mediumslateblue": [123, 104, 238],
"mediumspringgreen": [0, 250, 154],
"mediumturquoise": [72, 209, 204],
"mediumvioletred": [199, 21, 133],
"midnightblue": [25, 25, 112],
"mintcream": [245, 255, 250],
"mistyrose": [255, 228, 225],
"moccasin": [255, 228, 181],
"navajowhite": [255, 222, 173],
"navy": [0, 0, 128],
"oldlace": [253, 245, 230],
"olive": [128, 128, 0],
"olivedrab": [107, 142, 35],
"orange": [255, 165, 0],
"orangered": [255, 69, 0],
"orchid": [218, 112, 214],
"palegoldenrod": [238, 232, 170],
"palegreen": [152, 251, 152],
"paleturquoise": [175, 238, 238],
"palevioletred": [219, 112, 147],
"papayawhip": [255, 239, 213],
"peachpuff": [255, 218, 185],
"peru": [205, 133, 63],
"pink": [255, 192, 203],
"plum": [221, 160, 221],
"powderblue": [176, 224, 230],
"purple": [128, 0, 128],
"rebeccapurple": [102, 51, 153],
"red": [255, 0, 0],
"rosybrown": [188, 143, 143],
"royalblue": [65, 105, 225],
"saddlebrown": [139, 69, 19],
"salmon": [250, 128, 114],
"sandybrown": [244, 164, 96],
"seagreen": [46, 139, 87],
"seashell": [255, 245, 238],
"sienna": [160, 82, 45],
"silver": [192, 192, 192],
"skyblue": [135, 206, 235],
"slateblue": [106, 90, 205],
"slategray": [112, 128, 144],
"slategrey": [112, 128, 144],
"snow": [255, 250, 250],
"springgreen": [0, 255, 127],
"steelblue": [70, 130, 180],
"tan": [210, 180, 140],
"teal": [0, 128, 128],
"thistle": [216, 191, 216],
"tomato": [255, 99, 71],
"turquoise": [64, 224, 208],
"violet": [238, 130, 238],
"wheat": [245, 222, 179],
"white": [255, 255, 255],
"whitesmoke": [245, 245, 245],
"yellow": [255, 255, 0],
"yellowgreen": [154, 205, 50]
};
var conversions = createCommonjsModule(function (module) {
/* MIT license */
// NOTE: conversions should only return primitive values (i.e. arrays, or
// values that give correct `typeof` results).
// do not use box values types (i.e. Number(), String(), etc.)
var reverseKeywords = {};
for (var key in colorName) {
if (colorName.hasOwnProperty(key)) {
reverseKeywords[colorName[key]] = key;
}
}
var convert = module.exports = {
rgb: {
channels: 3,
labels: 'rgb'
},
hsl: {
channels: 3,
labels: 'hsl'
},
hsv: {
channels: 3,
labels: 'hsv'
},
hwb: {
channels: 3,
labels: 'hwb'
},
cmyk: {
channels: 4,
labels: 'cmyk'
},
xyz: {
channels: 3,
labels: 'xyz'
},
lab: {
channels: 3,
labels: 'lab'
},
lch: {
channels: 3,
labels: 'lch'
},
hex: {
channels: 1,
labels: ['hex']
},
keyword: {
channels: 1,
labels: ['keyword']
},
ansi16: {
channels: 1,
labels: ['ansi16']
},
ansi256: {
channels: 1,
labels: ['ansi256']
},
hcg: {
channels: 3,
labels: ['h', 'c', 'g']
},
apple: {
channels: 3,
labels: ['r16', 'g16', 'b16']
},
gray: {
channels: 1,
labels: ['gray']
}
}; // hide .channels and .labels properties
for (var model in convert) {
if (convert.hasOwnProperty(model)) {
if (!('channels' in convert[model])) {
throw new Error('missing channels property: ' + model);
}
if (!('labels' in convert[model])) {
throw new Error('missing channel labels property: ' + model);
}
if (convert[model].labels.length !== convert[model].channels) {
throw new Error('channel and label counts mismatch: ' + model);
}
var channels = convert[model].channels;
var labels = convert[model].labels;
delete convert[model].channels;
delete convert[model].labels;
Object.defineProperty(convert[model], 'channels', {
value: channels
});
Object.defineProperty(convert[model], 'labels', {
value: labels
});
}
}
convert.rgb.hsl = function (rgb) {
var r = rgb[0] / 255;
var g = rgb[1] / 255;
var b = rgb[2] / 255;
var min = Math.min(r, g, b);
var max = Math.max(r, g, b);
var delta = max - min;
var h;
var s;
var l;
if (max === min) {
h = 0;
} else if (r === max) {
h = (g - b) / delta;
} else if (g === max) {
h = 2 + (b - r) / delta;
} else if (b === max) {
h = 4 + (r - g) / delta;
}
h = Math.min(h * 60, 360);
if (h < 0) {
h += 360;
}
l = (min + max) / 2;
if (max === min) {
s = 0;
} else if (l <= 0.5) {
s = delta / (max + min);
} else {
s = delta / (2 - max - min);
}
return [h, s * 100, l * 100];
};
convert.rgb.hsv = function (rgb) {
var rdif;
var gdif;
var bdif;
var h;
var s;
var r = rgb[0] / 255;
var g = rgb[1] / 255;
var b = rgb[2] / 255;
var v = Math.max(r, g, b);
var diff = v - Math.min(r, g, b);
var diffc = function diffc(c) {
return (v - c) / 6 / diff + 1 / 2;
};
if (diff === 0) {
h = s = 0;
} else {
s = diff / v;
rdif = diffc(r);
gdif = diffc(g);
bdif = diffc(b);
if (r === v) {
h = bdif - gdif;
} else if (g === v) {
h = 1 / 3 + rdif - bdif;
} else if (b === v) {
h = 2 / 3 + gdif - rdif;
}
if (h < 0) {
h += 1;
} else if (h > 1) {
h -= 1;
}
}
return [h * 360, s * 100, v * 100];
};
convert.rgb.hwb = function (rgb) {
var r = rgb[0];
var g = rgb[1];
var b = rgb[2];
var h = convert.rgb.hsl(rgb)[0];
var w = 1 / 255 * Math.min(r, Math.min(g, b));
b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
return [h, w * 100, b * 100];
};
convert.rgb.cmyk = function (rgb) {
var r = rgb[0] / 255;
var g = rgb[1] / 255;
var b = rgb[2] / 255;
var c;
var m;
var y;
var k;
k = Math.min(1 - r, 1 - g, 1 - b);
c = (1 - r - k) / (1 - k) || 0;
m = (1 - g - k) / (1 - k) || 0;
y = (1 - b - k) / (1 - k) || 0;
return [c * 100, m * 100, y * 100, k * 100];
};
/**
* See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
* */
function comparativeDistance(x, y) {
return Math.pow(x[0] - y[0], 2) + Math.pow(x[1] - y[1], 2) + Math.pow(x[2] - y[2], 2);
}
convert.rgb.keyword = function (rgb) {
var reversed = reverseKeywords[rgb];
if (reversed) {
return reversed;
}
var currentClosestDistance = Infinity;
var currentClosestKeyword;
for (var keyword in colorName) {
if (colorName.hasOwnProperty(keyword)) {
var value = colorName[keyword]; // Compute comparative distance
var distance = comparativeDistance(rgb, value); // Check if its less, if so set as closest
if (distance < currentClosestDistance) {
currentClosestDistance = distance;
currentClosestKeyword = keyword;
}
}
}
return currentClosestKeyword;
};
convert.keyword.rgb = function (keyword) {
return colorName[keyword];
};
convert.rgb.xyz = function (rgb) {
var r = rgb[0] / 255;
var g = rgb[1] / 255;
var b = rgb[2] / 255; // assume sRGB
r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
var x = r * 0.4124 + g * 0.3576 + b * 0.1805;
var y = r * 0.2126 + g * 0.7152 + b * 0.0722;
var z = r * 0.0193 + g * 0.1192 + b * 0.9505;
return [x * 100, y * 100, z * 100];
};
convert.rgb.lab = function (rgb) {
var xyz = convert.rgb.xyz(rgb);
var x = xyz[0];
var y = xyz[1];
var z = xyz[2];
var l;
var a;
var b;
x /= 95.047;
y /= 100;
z /= 108.883;
x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;
y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;
z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;
l = 116 * y - 16;
a = 500 * (x - y);
b = 200 * (y - z);
return [l, a, b];
};
convert.hsl.rgb = function (hsl) {
var h = hsl[0] / 360;
var s = hsl[1] / 100;
var l = hsl[2] / 100;
var t1;
var t2;
var t3;
var rgb;
var val;
if (s === 0) {
val = l * 255;
return [val, val, val];
}
if (l < 0.5) {
t2 = l * (1 + s);
} else {
t2 = l + s - l * s;
}
t1 = 2 * l - t2;
rgb = [0, 0, 0];
for (var i = 0; i < 3; i++) {
t3 = h + 1 / 3 * -(i - 1);
if (t3 < 0) {
t3++;
}
if (t3 > 1) {
t3--;
}
if (6 * t3 < 1) {
val = t1 + (t2 - t1) * 6 * t3;
} else if (2 * t3 < 1) {
val = t2;
} else if (3 * t3 < 2) {
val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
} else {
val = t1;
}
rgb[i] = val * 255;
}
return rgb;
};
convert.hsl.hsv = function (hsl) {
var h = hsl[0];
var s = hsl[1] / 100;
var l = hsl[2] / 100;
var smin = s;
var lmin = Math.max(l, 0.01);
var sv;
var v;
l *= 2;
s *= l <= 1 ? l : 2 - l;
smin *= lmin <= 1 ? lmin : 2 - lmin;
v = (l + s) / 2;
sv = l === 0 ? 2 * smin / (lmin + smin) : 2 * s / (l + s);
return [h, sv * 100, v * 100];
};
convert.hsv.rgb = function (hsv) {
var h = hsv[0] / 60;
var s = hsv[1] / 100;
var v = hsv[2] / 100;
var hi = Math.floor(h) % 6;
var f = h - Math.floor(h);
var p = 255 * v * (1 - s);
var q = 255 * v * (1 - s * f);
var t = 255 * v * (1 - s * (1 - f));
v *= 255;
switch (hi) {
case 0:
return [v, t, p];
case 1:
return [q, v, p];
case 2:
return [p, v, t];
case 3:
return [p, q, v];
case 4:
return [t, p, v];
case 5:
return [v, p, q];
}
};
convert.hsv.hsl = function (hsv) {
var h = hsv[0];
var s = hsv[1] / 100;
var v = hsv[2] / 100;
var vmin = Math.max(v, 0.01);
var lmin;
var sl;
var l;
l = (2 - s) * v;
lmin = (2 - s) * vmin;
sl = s * vmin;
sl /= lmin <= 1 ? lmin : 2 - lmin;
sl = sl || 0;
l /= 2;
return [h, sl * 100, l * 100];
}; // http://dev.w3.org/csswg/css-color/#hwb-to-rgb
convert.hwb.rgb = function (hwb) {
var h = hwb[0] / 360;
var wh = hwb[1] / 100;
var bl = hwb[2] / 100;
var ratio = wh + bl;
var i;
var v;
var f;
var n; // wh + bl cant be > 1
if (ratio > 1) {
wh /= ratio;
bl /= ratio;
}
i = Math.floor(6 * h);
v = 1 - bl;
f = 6 * h - i;
if ((i & 0x01) !== 0) {
f = 1 - f;
}
n = wh + f * (v - wh); // linear interpolation
var r;
var g;
var b;
switch (i) {
default:
case 6:
case 0:
r = v;
g = n;
b = wh;
break;
case 1:
r = n;
g = v;
b = wh;
break;
case 2:
r = wh;
g = v;
b = n;
break;
case 3:
r = wh;
g = n;
b = v;
break;
case 4:
r = n;
g = wh;
b = v;
break;
case 5:
r = v;
g = wh;
b = n;
break;
}
return [r * 255, g * 255, b * 255];
};
convert.cmyk.rgb = function (cmyk) {
var c = cmyk[0] / 100;
var m = cmyk[1] / 100;
var y = cmyk[2] / 100;
var k = cmyk[3] / 100;
var r;
var g;
var b;
r = 1 - Math.min(1, c * (1 - k) + k);
g = 1 - Math.min(1, m * (1 - k) + k);
b = 1 - Math.min(1, y * (1 - k) + k);
return [r * 255, g * 255, b * 255];
};
convert.xyz.rgb = function (xyz) {
var x = xyz[0] / 100;
var y = xyz[1] / 100;
var z = xyz[2] / 100;
var r;
var g;
var b;
r = x * 3.2406 + y * -1.5372 + z * -0.4986;
g = x * -0.9689 + y * 1.8758 + z * 0.0415;
b = x * 0.0557 + y * -0.2040 + z * 1.0570; // assume sRGB
r = r > 0.0031308 ? 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055 : r * 12.92;
g = g > 0.0031308 ? 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055 : g * 12.92;
b = b > 0.0031308 ? 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055 : b * 12.92;
r = Math.min(Math.max(0, r), 1);
g = Math.min(Math.max(0, g), 1);
b = Math.min(Math.max(0, b), 1);
return [r * 255, g * 255, b * 255];
};
convert.xyz.lab = function (xyz) {
var x = xyz[0];
var y = xyz[1];
var z = xyz[2];
var l;
var a;
var b;
x /= 95.047;
y /= 100;
z /= 108.883;
x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;
y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;
z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;
l = 116 * y - 16;
a = 500 * (x - y);
b = 200 * (y - z);
return [l, a, b];
};
convert.lab.xyz = function (lab) {
var l = lab[0];
var a = lab[1];
var b = lab[2];
var x;
var y;
var z;
y = (l + 16) / 116;
x = a / 500 + y;
z = y - b / 200;
var y2 = Math.pow(y, 3);
var x2 = Math.pow(x, 3);
var z2 = Math.pow(z, 3);
y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
x *= 95.047;
y *= 100;
z *= 108.883;
return [x, y, z];
};
convert.lab.lch = function (lab) {
var l = lab[0];
var a = lab[1];
var b = lab[2];
var hr;
var h;
var c;
hr = Math.atan2(b, a);
h = hr * 360 / 2 / Math.PI;
if (h < 0) {
h += 360;
}
c = Math.sqrt(a * a + b * b);
return [l, c, h];
};
convert.lch.lab = function (lch) {
var l = lch[0];
var c = lch[1];
var h = lch[2];
var a;
var b;
var hr;
hr = h / 360 * 2 * Math.PI;
a = c * Math.cos(hr);
b = c * Math.sin(hr);
return [l, a, b];
};
convert.rgb.ansi16 = function (args) {
var r = args[0];
var g = args[1];
var b = args[2];
var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization
value = Math.round(value / 50);
if (value === 0) {
return 30;
}
var ansi = 30 + (Math.round(b / 255) << 2 | Math.round(g / 255) << 1 | Math.round(r / 255));
if (value === 2) {
ansi += 60;
}
return ansi;
};
convert.hsv.ansi16 = function (args) {
// optimization here; we already know the value and don't need to get
// it converted for us.
return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
};
convert.rgb.ansi256 = function (args) {
var r = args[0];
var g = args[1];
var b = args[2]; // we use the extended greyscale palette here, with the exception of
// black and white. normal palette only has 4 greyscale shades.
if (r === g && g === b) {
if (r < 8) {
return 16;
}
if (r > 248) {
return 231;
}
return Math.round((r - 8) / 247 * 24) + 232;
}
var ansi = 16 + 36 * Math.round(r / 255 * 5) + 6 * Math.round(g / 255 * 5) + Math.round(b / 255 * 5);
return ansi;
};
convert.ansi16.rgb = function (args) {
var color = args % 10; // handle greyscale
if (color === 0 || color === 7) {
if (args > 50) {
color += 3.5;
}
color = color / 10.5 * 255;
return [color, color, color];
}
var mult = (~~(args > 50) + 1) * 0.5;
var r = (color & 1) * mult * 255;
var g = (color >> 1 & 1) * mult * 255;
var b = (color >> 2 & 1) * mult * 255;
return [r, g, b];
};
convert.ansi256.rgb = function (args) {
// handle greyscale
if (args >= 232) {
var c = (args - 232) * 10 + 8;
return [c, c, c];
}
args -= 16;
var rem;
var r = Math.floor(args / 36) / 5 * 255;
var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
var b = rem % 6 / 5 * 255;
return [r, g, b];
};
convert.rgb.hex = function (args) {
var integer = ((Math.round(args[0]) & 0xFF) << 16) + ((Math.round(args[1]) & 0xFF) << 8) + (Math.round(args[2]) & 0xFF);
var string = integer.toString(16).toUpperCase();
return '000000'.substring(string.length) + string;
};
convert.hex.rgb = function (args) {
var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
if (!match) {
return [0, 0, 0];
}
var colorString = match[0];
if (match[0].length === 3) {
colorString = colorString.split('').map(function (char) {
return char + char;
}).join('');
}
var integer = parseInt(colorString, 16);
var r = integer >> 16 & 0xFF;
var g = integer >> 8 & 0xFF;
var b = integer & 0xFF;
return [r, g, b];
};
convert.rgb.hcg = function (rgb) {
var r = rgb[0] / 255;
var g = rgb[1] / 255;
var b = rgb[2] / 255;
var max = Math.max(Math.max(r, g), b);
var min = Math.min(Math.min(r, g), b);
var chroma = max - min;
var grayscale;
var hue;
if (chroma < 1) {
grayscale = min / (1 - chroma);
} else {
grayscale = 0;
}
if (chroma <= 0) {
hue = 0;
} else if (max === r) {
hue = (g - b) / chroma % 6;
} else if (max === g) {
hue = 2 + (b - r) / chroma;
} else {
hue = 4 + (r - g) / chroma + 4;
}
hue /= 6;
hue %= 1;
return [hue * 360, chroma * 100, grayscale * 100];
};
convert.hsl.hcg = function (hsl) {
var s = hsl[1] / 100;
var l = hsl[2] / 100;
var c = 1;
var f = 0;
if (l < 0.5) {
c = 2.0 * s * l;
} else {
c = 2.0 * s * (1.0 - l);
}
if (c < 1.0) {
f = (l - 0.5 * c) / (1.0 - c);
}
return [hsl[0], c * 100, f * 100];
};
convert.hsv.hcg = function (hsv) {
var s = hsv[1] / 100;
var v = hsv[2] / 100;
var c = s * v;
var f = 0;
if (c < 1.0) {
f = (v - c) / (1 - c);
}
return [hsv[0], c * 100, f * 100];
};
convert.hcg.rgb = function (hcg) {
var h = hcg[0] / 360;
var c = hcg[1] / 100;
var g = hcg[2] / 100;
if (c === 0.0) {
return [g * 255, g * 255, g * 255];
}
var pure = [0, 0, 0];
var hi = h % 1 * 6;
var v = hi % 1;
var w = 1 - v;
var mg = 0;
switch (Math.floor(hi)) {
case 0:
pure[0] = 1;
pure[1] = v;
pure[2] = 0;
break;
case 1:
pure[0] = w;
pure[1] = 1;
pure[2] = 0;
break;
case 2:
pure[0] = 0;
pure[1] = 1;
pure[2] = v;
break;
case 3:
pure[0] = 0;
pure[1] = w;
pure[2] = 1;
break;
case 4:
pure[0] = v;
pure[1] = 0;
pure[2] = 1;
break;
default:
pure[0] = 1;
pure[1] = 0;
pure[2] = w;
}
mg = (1.0 - c) * g;
return [(c * pure[0] + mg) * 255, (c * pure[1] + mg) * 255, (c * pure[2] + mg) * 255];
};
convert.hcg.hsv = function (hcg) {
var c = hcg[1] / 100;
var g = hcg[2] / 100;
var v = c + g * (1.0 - c);
var f = 0;
if (v > 0.0) {
f = c / v;
}
return [hcg[0], f * 100, v * 100];
};
convert.hcg.hsl = function (hcg) {
var c = hcg[1] / 100;
var g = hcg[2] / 100;
var l = g * (1.0 - c) + 0.5 * c;
var s = 0;
if (l > 0.0 && l < 0.5) {
s = c / (2 * l);
} else if (l >= 0.5 && l < 1.0) {
s = c / (2 * (1 - l));
}
return [hcg[0], s * 100, l * 100];
};
convert.hcg.hwb = function (hcg) {
var c = hcg[1] / 100;
var g = hcg[2] / 100;
var v = c + g * (1.0 - c);
return [hcg[0], (v - c) * 100, (1 - v) * 100];
};
convert.hwb.hcg = function (hwb) {
var w = hwb[1] / 100;
var b = hwb[2] / 100;
var v = 1 - b;
var c = v - w;
var g = 0;
if (c < 1) {
g = (v - c) / (1 - c);
}
return [hwb[0], c * 100, g * 100];
};
convert.apple.rgb = function (apple) {
return [apple[0] / 65535 * 255, apple[1] / 65535 * 255, apple[2] / 65535 * 255];
};
convert.rgb.apple = function (rgb) {
return [rgb[0] / 255 * 65535, rgb[1] / 255 * 65535, rgb[2] / 255 * 65535];
};
convert.gray.rgb = function (args) {
return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
};
convert.gray.hsl = convert.gray.hsv = function (args) {
return [0, 0, args[0]];
};
convert.gray.hwb = function (gray) {
return [0, 100, gray[0]];
};
convert.gray.cmyk = function (gray) {
return [0, 0, 0, gray[0]];
};
convert.gray.lab = function (gray) {
return [gray[0], 0, 0];
};
convert.gray.hex = function (gray) {
var val = Math.round(gray[0] / 100 * 255) & 0xFF;
var integer = (val << 16) + (val << 8) + val;
var string = integer.toString(16).toUpperCase();
return '000000'.substring(string.length) + string;
};
convert.rgb.gray = function (rgb) {
var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
return [val / 255 * 100];
};
});
var conversions_1 = conversions.rgb;
var conversions_2 = conversions.hsl;
var conversions_3 = conversions.hsv;
var conversions_4 = conversions.hwb;
var conversions_5 = conversions.cmyk;
var conversions_6 = conversions.xyz;
var conversions_7 = conversions.lab;
var conversions_8 = conversions.lch;
var conversions_9 = conversions.hex;
var conversions_10 = conversions.keyword;
var conversions_11 = conversions.ansi16;
var conversions_12 = conversions.ansi256;
var conversions_13 = conversions.hcg;
var conversions_14 = conversions.apple;
var conversions_15 = conversions.gray;
/*
this function routes a model to all other models.
all functions that are routed have a property `.conversion` attached
to the returned synthetic function. This property is an array
of strings, each with the steps in between the 'from' and 'to'
color models (inclusive).
conversions that are not possible simply are not included.
*/
function buildGraph() {
var graph = {}; // https://jsperf.com/object-keys-vs-for-in-with-closure/3
var models = Object.keys(conversions);
for (var len = models.length, i = 0; i < len; i++) {
graph[models[i]] = {
// http://jsperf.com/1-vs-infinity
// micro-opt, but this is simple.
distance: -1,
parent: null
};
}
return graph;
} // https://en.wikipedia.org/wiki/Breadth-first_search
function deriveBFS(fromModel) {
var graph = buildGraph();
var queue = [fromModel]; // unshift -> queue -> pop
graph[fromModel].distance = 0;
while (queue.length) {
var current = queue.pop();
var adjacents = Object.keys(conversions[current]);
for (var len = adjacents.length, i = 0; i < len; i++) {
var adjacent = adjacents[i];
var node = graph[adjacent];
if (node.distance === -1) {
node.distance = graph[current].distance + 1;
node.parent = current;
queue.unshift(adjacent);
}
}
}
return graph;
}
function link(from, to) {
return function (args) {
return to(from(args));
};
}
function wrapConversion(toModel, graph) {
var path = [graph[toModel].parent, toModel];
var fn = conversions[graph[toModel].parent][toModel];
var cur = graph[toModel].parent;
while (graph[cur].parent) {
path.unshift(graph[cur].parent);
fn = link(conversions[graph[cur].parent][cur], fn);
cur = graph[cur].parent;
}
fn.conversion = path;
return fn;
}
var route = function route(fromModel) {
var graph = deriveBFS(fromModel);
var conversion = {};
var models = Object.keys(graph);
for (var len = models.length, i = 0; i < len; i++) {
var toModel = models[i];
var node = graph[toModel];
if (node.parent === null) {
// no possible conversion, or this node is the source model.
continue;
}
conversion[toModel] = wrapConversion(toModel, graph);
}
return conversion;
};
var convert = {};
var models = Object.keys(conversions);
function wrapRaw(fn) {
var wrappedFn = function wrappedFn(args) {
if (args === undefined || args === null) {
return args;
}
if (arguments.length > 1) {
args = Array.prototype.slice.call(arguments);
}
return fn(args);
}; // preserve .conversion property if there is one
if ('conversion' in fn) {
wrappedFn.conversion = fn.conversion;
}
return wrappedFn;
}
function wrapRounded(fn) {
var wrappedFn = function wrappedFn(args) {
if (args === undefined || args === null) {
return args;
}
if (arguments.length > 1) {
args = Array.prototype.slice.call(arguments);
}
var result = fn(args); // we're assuming the result is an array here.
// see notice in conversions.js; don't use box types
// in conversion functions.
if (typeof result === 'object') {
for (var len = result.length, i = 0; i < len; i++) {
result[i] = Math.round(result[i]);
}
}
return result;
}; // preserve .conversion property if there is one
if ('conversion' in fn) {
wrappedFn.conversion = fn.conversion;
}
return wrappedFn;
}
models.forEach(function (fromModel) {
convert[fromModel] = {};
Object.defineProperty(convert[fromModel], 'channels', {
value: conversions[fromModel].channels
});
Object.defineProperty(convert[fromModel], 'labels', {
value: conversions[fromModel].labels
});
var routes = route(fromModel);
var routeModels = Object.keys(routes);
routeModels.forEach(function (toModel) {
var fn = routes[toModel];
convert[fromModel][toModel] = wrapRounded(fn);
convert[fromModel][toModel].raw = wrapRaw(fn);
});
});
var colorConvert = convert;
var ansiStyles = createCommonjsModule(function (module) {
const wrapAnsi16 = (fn, offset) => function () {
const code = fn.apply(colorConvert, arguments);
return "\x1B[".concat(code + offset, "m");
};
const wrapAnsi256 = (fn, offset) => function () {
const code = fn.apply(colorConvert, arguments);
return "\x1B[".concat(38 + offset, ";5;").concat(code, "m");
};
const wrapAnsi16m = (fn, offset) => function () {
const rgb = fn.apply(colorConvert, arguments);
return "\x1B[".concat(38 + offset, ";2;").concat(rgb[0], ";").concat(rgb[1], ";").concat(rgb[2], "m");
};
function assembleStyles() {
const codes = new Map();
const styles = {
modifier: {
reset: [0, 0],
// 21 isn't widely supported and 22 does the same thing
bold: [1, 22],
dim: [2, 22],
italic: [3, 23],
underline: [4, 24],
inverse: [7, 27],
hidden: [8, 28],
strikethrough: [9, 29]
},
color: {
black: [30, 39],
red: [31, 39],
green: [32, 39],
yellow: [33, 39],
blue: [34, 39],
magenta: [35, 39],
cyan: [36, 39],
white: [37, 39],
gray: [90, 39],
// Bright color
redBright: [91, 39],
greenBright: [92, 39],
yellowBright: [93, 39],
blueBright: [94, 39],
magentaBright: [95, 39],
cyanBright: [96, 39],
whiteBright: [97, 39]
},
bgColor: {
bgBlack: [40, 49],
bgRed: [41, 49],
bgGreen: [42, 49],
bgYellow: [43, 49],
bgBlue: [44, 49],
bgMagenta: [45, 49],
bgCyan: [46, 49],
bgWhite: [47, 49],
// Bright color
bgBlackBright: [100, 49],
bgRedBright: [101, 49],
bgGreenBright: [102, 49],
bgYellowBright: [103, 49],
bgBlueBright: [104, 49],
bgMagentaBright: [105, 49],
bgCyanBright: [106, 49],
bgWhiteBright: [107, 49]
}
}; // Fix humans
styles.color.grey = styles.color.gray;
for (const groupName of Object.keys(styles)) {
const group = styles[groupName];
for (const styleName of Object.keys(group)) {
const style = group[styleName];
styles[styleName] = {
open: "\x1B[".concat(style[0], "m"),
close: "\x1B[".concat(style[1], "m")
};
group[styleName] = styles[styleName];
codes.set(style[0], style[1]);
}
Object.defineProperty(styles, groupName, {
value: group,
enumerable: false
});
Object.defineProperty(styles, 'codes', {
value: codes,
enumerable: false
});
}
const ansi2ansi = n => n;
const rgb2rgb = (r, g, b) => [r, g, b];
styles.color.close = '\u001B[39m';
styles.bgColor.close = '\u001B[49m';
styles.color.ansi = {
ansi: wrapAnsi16(ansi2ansi, 0)
};
styles.color.ansi256 = {
ansi256: wrapAnsi256(ansi2ansi, 0)
};
styles.color.ansi16m = {
rgb: wrapAnsi16m(rgb2rgb, 0)
};
styles.bgColor.ansi = {
ansi: wrapAnsi16(ansi2ansi, 10)
};
styles.bgColor.ansi256 = {
ansi256: wrapAnsi256(ansi2ansi, 10)
};
styles.bgColor.ansi16m = {
rgb: wrapAnsi16m(rgb2rgb, 10)
};
for (let key of Object.keys(colorConvert)) {
if (typeof colorConvert[key] !== 'object') {
continue;
}
const suite = colorConvert[key];
if (key === 'ansi16') {
key = 'ansi';
}
if ('ansi16' in suite) {
styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);
styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);
}
if ('ansi256' in suite) {
styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);
styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);
}
if ('rgb' in suite) {
styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);
styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);
}
}
return styles;
} // Make the export immutable
Object.defineProperty(module, 'exports', {
enumerable: true,
get: assembleStyles
});
});
var require$$0$1 = {
EOL: "\n"
};
var hasFlag = (flag, argv) => {
argv = argv || process.argv;
const prefix = flag.startsWith('-') ? '' : flag.length === 1 ? '-' : '--';
const pos = argv.indexOf(prefix + flag);
const terminatorPos = argv.indexOf('--');
return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);
};
const env$1 = process.env;
let forceColor;
if (hasFlag('no-color') || hasFlag('no-colors') || hasFlag('color=false')) {
forceColor = false;
} else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true') || hasFlag('color=always')) {
forceColor = true;
}
if ('FORCE_COLOR' in env$1) {
forceColor = env$1.FORCE_COLOR.length === 0 || parseInt(env$1.FORCE_COLOR, 10) !== 0;
}
function translateLevel(level) {
if (level === 0) {
return false;
}
return {
level,
hasBasic: true,
has256: level >= 2,
has16m: level >= 3
};
}
function supportsColor(stream) {
if (forceColor === false) {
return 0;
}
if (hasFlag('color=16m') || hasFlag('color=full') || hasFlag('color=truecolor')) {
return 3;
}
if (hasFlag('color=256')) {
return 2;
}
if (stream && !stream.isTTY && forceColor !== true) {
return 0;
}
const min = forceColor ? 1 : 0;
if (process.platform === 'win32') {
// Node.js 7.5.0 is the first version of Node.js to include a patch to
// libuv that enables 256 color output on Windows. Anything earlier and it
// won't work. However, here we target Node.js 8 at minimum as it is an LTS
// release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows
// release that supports 256 colors. Windows 10 build 14931 is the first release
// that supports 16m/TrueColor.
const osRelease = require$$0$1.release().split('.');
if (Number(process.versions.node.split('.')[0]) >= 8 && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
return Number(osRelease[2]) >= 14931 ? 3 : 2;
}
return 1;
}
if ('CI' in env$1) {
if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env$1) || env$1.CI_NAME === 'codeship') {
return 1;
}
return min;
}
if ('TEAMCITY_VERSION' in env$1) {
return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env$1.TEAMCITY_VERSION) ? 1 : 0;
}
if (env$1.COLORTERM === 'truecolor') {
return 3;
}
if ('TERM_PROGRAM' in env$1) {
const version = parseInt((env$1.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
switch (env$1.TERM_PROGRAM) {
case 'iTerm.app':
return version >= 3 ? 3 : 2;
case 'Apple_Terminal':
return 2;
// No default
}
}
if (/-256(color)?$/i.test(env$1.TERM)) {
return 2;
}
if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env$1.TERM)) {
return 1;
}
if ('COLORTERM' in env$1) {
return 1;
}
if (env$1.TERM === 'dumb') {
return min;
}
return min;
}
function getSupportLevel(stream) {
const level = supportsColor(stream);
return translateLevel(level);
}
var supportsColor_1 = {
supportsColor: getSupportLevel,
stdout: getSupportLevel(process.stdout),
stderr: getSupportLevel(process.stderr)
};
const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi;
const ESCAPES = new Map([['n', '\n'], ['r', '\r'], ['t', '\t'], ['b', '\b'], ['f', '\f'], ['v', '\v'], ['0', '\0'], ['\\', '\\'], ['e', '\u001B'], ['a', '\u0007']]);
function unescape(c) {
if (c[0] === 'u' && c.length === 5 || c[0] === 'x' && c.length === 3) {
return String.fromCharCode(parseInt(c.slice(1), 16));
}
return ESCAPES.get(c) || c;
}
function parseArguments(name, args) {
const results = [];
const chunks = args.trim().split(/\s*,\s*/g);
let matches;
for (const chunk of chunks) {
if (!isNaN(chunk)) {
results.push(Number(chunk));
} else if (matches = chunk.match(STRING_REGEX)) {
results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr));
} else {
throw new Error("Invalid Chalk template style argument: ".concat(chunk, " (in style '").concat(name, "')"));
}
}
return results;
}
function parseStyle(style) {
STYLE_REGEX.lastIndex = 0;
const results = [];
let matches;
while ((matches = STYLE_REGEX.exec(style)) !== null) {
const name = matches[1];
if (matches[2]) {
const args = parseArguments(name, matches[2]);
results.push([name].concat(args));
} else {
results.push([name]);
}
}
return results;
}
function buildStyle(chalk, styles) {
const enabled = {};
for (const layer of styles) {
for (const style of layer.styles) {
enabled[style[0]] = layer.inverse ? null : style.slice(1);
}
}
let current = chalk;
for (const styleName of Object.keys(enabled)) {
if (Array.isArray(enabled[styleName])) {
if (!(styleName in current)) {
throw new Error("Unknown Chalk style: ".concat(styleName));
}
if (enabled[styleName].length > 0) {
current = current[styleName].apply(current, enabled[styleName]);
} else {
current = current[styleName];
}
}
}
return current;
}
var templates = (chalk, tmp) => {
const styles = [];
const chunks = [];
let chunk = []; // eslint-disable-next-line max-params
tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => {
if (escapeChar) {
chunk.push(unescape(escapeChar));
} else if (style) {
const str = chunk.join('');
chunk = [];
chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str));
styles.push({
inverse,
styles: parseStyle(style)
});
} else if (close) {
if (styles.length === 0) {
throw new Error('Found extraneous } in Chalk template literal');
}
chunks.push(buildStyle(chalk, styles)(chunk.join('')));
chunk = [];
styles.pop();
} else {
chunk.push(chr);
}
});
chunks.push(chunk.join(''));
if (styles.length > 0) {
const errMsg = "Chalk template literal is missing ".concat(styles.length, " closing bracket").concat(styles.length === 1 ? '' : 's', " (`}`)");
throw new Error(errMsg);
}
return chunks.join('');
};
var chalk = createCommonjsModule(function (module) {
const stdoutColor = supportsColor_1.stdout;
const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); // `supportsColor.level` → `ansiStyles.color[name]` mapping
const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; // `color-convert` models to exclude from the Chalk API due to conflicts and such
const skipModels = new Set(['gray']);
const styles = Object.create(null);
function applyOptions(obj, options) {
options = options || {}; // Detect level if not set manually
const scLevel = stdoutColor ? stdoutColor.level : 0;
obj.level = options.level === undefined ? scLevel : options.level;
obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0;
}
function Chalk(options) {
// We check for this.template here since calling `chalk.constructor()`
// by itself will have a `this` of a previously constructed chalk object
if (!this || !(this instanceof Chalk) || this.template) {
const chalk = {};
applyOptions(chalk, options);
chalk.template = function () {
const args = [].slice.call(arguments);
return chalkTag.apply(null, [chalk.template].concat(args));
};
Object.setPrototypeOf(chalk, Chalk.prototype);
Object.setPrototypeOf(chalk.template, chalk);
chalk.template.constructor = Chalk;
return chalk.template;
}
applyOptions(this, options);
} // Use bright blue on Windows as the normal blue color is illegible
if (isSimpleWindowsTerm) {
ansiStyles.blue.open = '\u001B[94m';
}
for (const key of Object.keys(ansiStyles)) {
ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
styles[key] = {
get() {
const codes = ansiStyles[key];
return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key);
}
};
}
styles.visible = {
get() {
return build.call(this, this._styles || [], true, 'visible');
}
};
ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g');
for (const model of Object.keys(ansiStyles.color.ansi)) {
if (skipModels.has(model)) {
continue;
}
styles[model] = {
get() {
const level = this.level;
return function () {
const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments);
const codes = {
open,
close: ansiStyles.color.close,
closeRe: ansiStyles.color.closeRe
};
return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
};
}
};
}
ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g');
for (const model of Object.keys(ansiStyles.bgColor.ansi)) {
if (skipModels.has(model)) {
continue;
}
const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
styles[bgModel] = {
get() {
const level = this.level;
return function () {
const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments);
const codes = {
open,
close: ansiStyles.bgColor.close,
closeRe: ansiStyles.bgColor.closeRe
};
return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
};
}
};
}
const proto = Object.defineProperties(() => {}, styles);
function build(_styles, _empty, key) {
const builder = function builder() {
return applyStyle.apply(builder, arguments);
};
builder._styles = _styles;
builder._empty = _empty;
const self = this;
Object.defineProperty(builder, 'level', {
enumerable: true,
get() {
return self.level;
},
set(level) {
self.level = level;
}
});
Object.defineProperty(builder, 'enabled', {
enumerable: true,
get() {
return self.enabled;
},
set(enabled) {
self.enabled = enabled;
}
}); // See below for fix regarding invisible grey/dim combination on Windows
builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; // `__proto__` is used because we must return a function, but there is
// no way to create a function with a different prototype
builder.__proto__ = proto; // eslint-disable-line no-proto
return builder;
}
function applyStyle() {
// Support varags, but simply cast to string in case there's only one arg
const args = arguments;
const argsLen = args.length;
let str = String(arguments[0]);
if (argsLen === 0) {
return '';
}
if (argsLen > 1) {
// Don't slice `arguments`, it prevents V8 optimizations
for (let a = 1; a < argsLen; a++) {
str += ' ' + args[a];
}
}
if (!this.enabled || this.level <= 0 || !str) {
return this._empty ? '' : str;
} // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
// see https://github.com/chalk/chalk/issues/58
// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
const originalDim = ansiStyles.dim.open;
if (isSimpleWindowsTerm && this.hasGrey) {
ansiStyles.dim.open = '';
}
for (const code of this._styles.slice().reverse()) {
// Replace any instances already present with a re-opening code
// otherwise only the part of the string until said closing code
// will be colored, and the rest will simply be 'plain'.
str = code.open + str.replace(code.closeRe, code.open) + code.close; // Close the styling before a linebreak and reopen
// after next line to fix a bleed issue on macOS
// https://github.com/chalk/chalk/pull/92
str = str.replace(/\r?\n/g, "".concat(code.close, "$&").concat(code.open));
} // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue
ansiStyles.dim.open = originalDim;
return str;
}
function chalkTag(chalk, strings) {
if (!Array.isArray(strings)) {
// If chalk() was called by itself or with a string,
// return the string itself as a string.
return [].slice.call(arguments, 1).join(' ');
}
const args = [].slice.call(arguments, 2);
const parts = [strings.raw[0]];
for (let i = 1; i < strings.length; i++) {
parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&'));
parts.push(String(strings.raw[i]));
}
return templates(chalk, parts.join(''));
}
Object.defineProperties(Chalk.prototype, styles);
module.exports = Chalk(); // eslint-disable-line new-cap
module.exports.supportsColor = stdoutColor;
module.exports.default = module.exports; // For TypeScript
});
var chalk_1 = chalk.supportsColor;
var common = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.commonDeprecatedHandler = (keyOrPair, redirectTo, {
descriptor
}) => {
const messages = ["".concat(chalk.default.yellow(typeof keyOrPair === 'string' ? descriptor.key(keyOrPair) : descriptor.pair(keyOrPair)), " is deprecated")];
if (redirectTo) {
messages.push("we now treat it as ".concat(chalk.default.blue(typeof redirectTo === 'string' ? descriptor.key(redirectTo) : descriptor.pair(redirectTo))));
}
return messages.join('; ') + '.';
};
});
unwrapExports(common);
var common_1 = common.commonDeprecatedHandler;
var deprecated = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
tslib_1.__exportStar(common, exports);
});
unwrapExports(deprecated);
var common$1 = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.commonInvalidHandler = (key, value, utils) => ["Invalid ".concat(chalk.default.red(utils.descriptor.key(key)), " value."), "Expected ".concat(chalk.default.blue(utils.schemas[key].expected(utils)), ","), "but received ".concat(chalk.default.red(utils.descriptor.value(value)), ".")].join(' ');
});
unwrapExports(common$1);
var common_1$1 = common$1.commonInvalidHandler;
var invalid = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
tslib_1.__exportStar(common$1, exports);
});
unwrapExports(invalid);
/* eslint-disable no-nested-ternary */
var arr = [];
var charCodeCache = [];
var leven = function leven(a, b) {
if (a === b) {
return 0;
}
var swap = a; // Swapping the strings if `a` is longer than `b` so we know which one is the
// shortest & which one is the longest
if (a.length > b.length) {
a = b;
b = swap;
}
var aLen = a.length;
var bLen = b.length;
if (aLen === 0) {
return bLen;
}
if (bLen === 0) {
return aLen;
} // Performing suffix trimming:
// We can linearly drop suffix common to both strings since they
// don't increase distance at all
// Note: `~-` is the bitwise way to perform a `- 1` operation
while (aLen > 0 && a.charCodeAt(~-aLen) === b.charCodeAt(~-bLen)) {
aLen--;
bLen--;
}
if (aLen === 0) {
return bLen;
} // Performing prefix trimming
// We can linearly drop prefix common to both strings since they
// don't increase distance at all
var start = 0;
while (start < aLen && a.charCodeAt(start) === b.charCodeAt(start)) {
start++;
}
aLen -= start;
bLen -= start;
if (aLen === 0) {
return bLen;
}
var bCharCode;
var ret;
var tmp;
var tmp2;
var i = 0;
var j = 0;
while (i < aLen) {
charCodeCache[start + i] = a.charCodeAt(start + i);
arr[i] = ++i;
}
while (j < bLen) {
bCharCode = b.charCodeAt(start + j);
tmp = j++;
ret = j;
for (i = 0; i < aLen; i++) {
tmp2 = bCharCode === charCodeCache[start + i] ? tmp : tmp + 1;
tmp = arr[i];
ret = arr[i] = tmp > ret ? tmp2 > ret ? ret + 1 : tmp2 : tmp2 > tmp ? tmp + 1 : tmp2;
}
}
return ret;
};
var leven_1 = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.levenUnknownHandler = (key, value, {
descriptor,
logger,
schemas
}) => {
const messages = ["Ignored unknown option ".concat(chalk.default.yellow(descriptor.pair({
key,
value
})), ".")];
const suggestion = Object.keys(schemas).sort().find(knownKey => leven(key, knownKey) < 3);
if (suggestion) {
messages.push("Did you mean ".concat(chalk.default.blue(descriptor.key(suggestion)), "?"));
}
logger.warn(messages.join(' '));
};
});
unwrapExports(leven_1);
var leven_2 = leven_1.levenUnknownHandler;
var unknown = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
tslib_1.__exportStar(leven_1, exports);
});
unwrapExports(unknown);
var handlers = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
tslib_1.__exportStar(deprecated, exports);
tslib_1.__exportStar(invalid, exports);
tslib_1.__exportStar(unknown, exports);
});
unwrapExports(handlers);
var schema = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
const HANDLER_KEYS = ['default', 'expected', 'validate', 'deprecated', 'forward', 'redirect', 'overlap', 'preprocess', 'postprocess'];
function createSchema(SchemaConstructor, parameters) {
const schema = new SchemaConstructor(parameters);
const subSchema = Object.create(schema);
for (const handlerKey of HANDLER_KEYS) {
if (handlerKey in parameters) {
subSchema[handlerKey] = normalizeHandler(parameters[handlerKey], schema, Schema.prototype[handlerKey].length);
}
}
return subSchema;
}
exports.createSchema = createSchema;
class Schema {
constructor(parameters) {
this.name = parameters.name;
}
static create(parameters) {
// @ts-ignore: https://github.com/Microsoft/TypeScript/issues/5863
return createSchema(this, parameters);
}
default(_utils) {
return undefined;
} // istanbul ignore next: this is actually an abstract method but we need a placeholder to get `function.length`
expected(_utils) {
return 'nothing';
} // istanbul ignore next: this is actually an abstract method but we need a placeholder to get `function.length`
validate(_value, _utils) {
return false;
}
deprecated(_value, _utils) {
return false;
}
forward(_value, _utils) {
return undefined;
}
redirect(_value, _utils) {
return undefined;
}
overlap(currentValue, _newValue, _utils) {
return currentValue;
}
preprocess(value, _utils) {
return value;
}
postprocess(value, _utils) {
return value;
}
}
exports.Schema = Schema;
function normalizeHandler(handler, superSchema, handlerArgumentsLength) {
return typeof handler === 'function' ? (...args) => handler(...args.slice(0, handlerArgumentsLength - 1), superSchema, ...args.slice(handlerArgumentsLength - 1)) : () => handler;
}
});
unwrapExports(schema);
var schema_1 = schema.createSchema;
var schema_2 = schema.Schema;
var alias = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
class AliasSchema extends schema.Schema {
constructor(parameters) {
super(parameters);
this._sourceName = parameters.sourceName;
}
expected(utils) {
return utils.schemas[this._sourceName].expected(utils);
}
validate(value, utils) {
return utils.schemas[this._sourceName].validate(value, utils);
}
redirect(_value, _utils) {
return this._sourceName;
}
}
exports.AliasSchema = AliasSchema;
});
unwrapExports(alias);
var alias_1 = alias.AliasSchema;
var any = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
class AnySchema extends schema.Schema {
expected() {
return 'anything';
}
validate() {
return true;
}
}
exports.AnySchema = AnySchema;
});
unwrapExports(any);
var any_1 = any.AnySchema;
var array = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
class ArraySchema extends schema.Schema {
constructor(_a) {
var {
valueSchema,
name = valueSchema.name
} = _a,
handlers = tslib_1.__rest(_a, ["valueSchema", "name"]);
super(Object.assign({}, handlers, {
name
}));
this._valueSchema = valueSchema;
}
expected(utils) {
return "an array of ".concat(this._valueSchema.expected(utils));
}
validate(value, utils) {
if (!Array.isArray(value)) {
return false;
}
const invalidValues = [];
for (const subValue of value) {
const subValidateResult = utils.normalizeValidateResult(this._valueSchema.validate(subValue, utils), subValue);
if (subValidateResult !== true) {
invalidValues.push(subValidateResult.value);
}
}
return invalidValues.length === 0 ? true : {
value: invalidValues
};
}
deprecated(value, utils) {
const deprecatedResult = [];
for (const subValue of value) {
const subDeprecatedResult = utils.normalizeDeprecatedResult(this._valueSchema.deprecated(subValue, utils), subValue);
if (subDeprecatedResult !== false) {
deprecatedResult.push(...subDeprecatedResult.map(({
value: deprecatedValue
}) => ({
value: [deprecatedValue]
})));
}
}
return deprecatedResult;
}
forward(value, utils) {
const forwardResult = [];
for (const subValue of value) {
const subForwardResult = utils.normalizeForwardResult(this._valueSchema.forward(subValue, utils), subValue);
forwardResult.push(...subForwardResult.map(wrapTransferResult));
}
return forwardResult;
}
redirect(value, utils) {
const remain = [];
const redirect = [];
for (const subValue of value) {
const subRedirectResult = utils.normalizeRedirectResult(this._valueSchema.redirect(subValue, utils), subValue);
if ('remain' in subRedirectResult) {
remain.push(subRedirectResult.remain);
}
redirect.push(...subRedirectResult.redirect.map(wrapTransferResult));
}
return remain.length === 0 ? {
redirect
} : {
redirect,
remain
};
}
overlap(currentValue, newValue) {
return currentValue.concat(newValue);
}
}
exports.ArraySchema = ArraySchema;
function wrapTransferResult({
from,
to
}) {
return {
from: [from],
to
};
}
});
unwrapExports(array);
var array_1 = array.ArraySchema;
var boolean_1 = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
class BooleanSchema extends schema.Schema {
expected() {
return 'true or false';
}
validate(value) {
return typeof value === 'boolean';
}
}
exports.BooleanSchema = BooleanSchema;
});
unwrapExports(boolean_1);
var boolean_2 = boolean_1.BooleanSchema;
var utils = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
function recordFromArray(array, mainKey) {
const record = Object.create(null);
for (const value of array) {
const key = value[mainKey]; // istanbul ignore next
if (record[key]) {
throw new Error("Duplicate ".concat(mainKey, " ").concat(JSON.stringify(key)));
} // @ts-ignore
record[key] = value;
}
return record;
}
exports.recordFromArray = recordFromArray;
function mapFromArray(array, mainKey) {
const map = new Map();
for (const value of array) {
const key = value[mainKey]; // istanbul ignore next
if (map.has(key)) {
throw new Error("Duplicate ".concat(mainKey, " ").concat(JSON.stringify(key)));
}
map.set(key, value);
}
return map;
}
exports.mapFromArray = mapFromArray;
function createAutoChecklist() {
const map = Object.create(null);
return id => {
const idString = JSON.stringify(id);
if (map[idString]) {
return true;
}
map[idString] = true;
return false;
};
}
exports.createAutoChecklist = createAutoChecklist;
function partition(array, predicate) {
const trueArray = [];
const falseArray = [];
for (const value of array) {
if (predicate(value)) {
trueArray.push(value);
} else {
falseArray.push(value);
}
}
return [trueArray, falseArray];
}
exports.partition = partition;
function isInt(value) {
return value === Math.floor(value);
}
exports.isInt = isInt;
function comparePrimitive(a, b) {
if (a === b) {
return 0;
}
const typeofA = typeof a;
const typeofB = typeof b;
const orders = ['undefined', 'object', 'boolean', 'number', 'string'];
if (typeofA !== typeofB) {
return orders.indexOf(typeofA) - orders.indexOf(typeofB);
}
if (typeofA !== 'string') {
return Number(a) - Number(b);
}
return a.localeCompare(b);
}
exports.comparePrimitive = comparePrimitive;
function normalizeDefaultResult(result) {
return result === undefined ? {} : result;
}
exports.normalizeDefaultResult = normalizeDefaultResult;
function normalizeValidateResult(result, value) {
return result === true ? true : result === false ? {
value
} : result;
}
exports.normalizeValidateResult = normalizeValidateResult;
function normalizeDeprecatedResult(result, value, doNotNormalizeTrue = false) {
return result === false ? false : result === true ? doNotNormalizeTrue ? true : [{
value
}] : 'value' in result ? [result] : result.length === 0 ? false : result;
}
exports.normalizeDeprecatedResult = normalizeDeprecatedResult;
function normalizeTransferResult(result, value) {
return typeof result === 'string' || 'key' in result ? {
from: value,
to: result
} : 'from' in result ? {
from: result.from,
to: result.to
} : {
from: value,
to: result.to
};
}
exports.normalizeTransferResult = normalizeTransferResult;
function normalizeForwardResult(result, value) {
return result === undefined ? [] : Array.isArray(result) ? result.map(transferResult => normalizeTransferResult(transferResult, value)) : [normalizeTransferResult(result, value)];
}
exports.normalizeForwardResult = normalizeForwardResult;
function normalizeRedirectResult(result, value) {
const redirect = normalizeForwardResult(typeof result === 'object' && 'redirect' in result ? result.redirect : result, value);
return redirect.length === 0 ? {
remain: value,
redirect
} : typeof result === 'object' && 'remain' in result ? {
remain: result.remain,
redirect
} : {
redirect
};
}
exports.normalizeRedirectResult = normalizeRedirectResult;
});
unwrapExports(utils);
var utils_1 = utils.recordFromArray;
var utils_2 = utils.mapFromArray;
var utils_3 = utils.createAutoChecklist;
var utils_4 = utils.partition;
var utils_5 = utils.isInt;
var utils_6 = utils.comparePrimitive;
var utils_7 = utils.normalizeDefaultResult;
var utils_8 = utils.normalizeValidateResult;
var utils_9 = utils.normalizeDeprecatedResult;
var utils_10 = utils.normalizeTransferResult;
var utils_11 = utils.normalizeForwardResult;
var utils_12 = utils.normalizeRedirectResult;
var choice = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
class ChoiceSchema extends schema.Schema {
constructor(parameters) {
super(parameters);
this._choices = utils.mapFromArray(parameters.choices.map(choice => choice && typeof choice === 'object' ? choice : {
value: choice
}), 'value');
}
expected({
descriptor
}) {
const choiceValues = Array.from(this._choices.keys()).map(value => this._choices.get(value)).filter(choiceInfo => !choiceInfo.deprecated).map(choiceInfo => choiceInfo.value).sort(utils.comparePrimitive).map(descriptor.value);
const head = choiceValues.slice(0, -2);
const tail = choiceValues.slice(-2);
return head.concat(tail.join(' or ')).join(', ');
}
validate(value) {
return this._choices.has(value);
}
deprecated(value) {
const choiceInfo = this._choices.get(value);
return choiceInfo && choiceInfo.deprecated ? {
value
} : false;
}
forward(value) {
const choiceInfo = this._choices.get(value);
return choiceInfo ? choiceInfo.forward : undefined;
}
redirect(value) {
const choiceInfo = this._choices.get(value);
return choiceInfo ? choiceInfo.redirect : undefined;
}
}
exports.ChoiceSchema = ChoiceSchema;
});
unwrapExports(choice);
var choice_1 = choice.ChoiceSchema;
var number = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
class NumberSchema extends schema.Schema {
expected() {
return 'a number';
}
validate(value, _utils) {
return typeof value === 'number';
}
}
exports.NumberSchema = NumberSchema;
});
unwrapExports(number);
var number_1 = number.NumberSchema;
var integer = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
class IntegerSchema extends number.NumberSchema {
expected() {
return 'an integer';
}
validate(value, utils$1) {
return utils$1.normalizeValidateResult(super.validate(value, utils$1), value) === true && utils.isInt(value);
}
}
exports.IntegerSchema = IntegerSchema;
});
unwrapExports(integer);
var integer_1 = integer.IntegerSchema;
var string = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
class StringSchema extends schema.Schema {
expected() {
return 'a string';
}
validate(value) {
return typeof value === 'string';
}
}
exports.StringSchema = StringSchema;
});
unwrapExports(string);
var string_1 = string.StringSchema;
var schemas = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
tslib_1.__exportStar(alias, exports);
tslib_1.__exportStar(any, exports);
tslib_1.__exportStar(array, exports);
tslib_1.__exportStar(boolean_1, exports);
tslib_1.__exportStar(choice, exports);
tslib_1.__exportStar(integer, exports);
tslib_1.__exportStar(number, exports);
tslib_1.__exportStar(string, exports);
});
unwrapExports(schemas);
var defaults = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.defaultDescriptor = api.apiDescriptor;
exports.defaultUnknownHandler = leven_1.levenUnknownHandler;
exports.defaultInvalidHandler = invalid.commonInvalidHandler;
exports.defaultDeprecatedHandler = common.commonDeprecatedHandler;
});
unwrapExports(defaults);
var defaults_1 = defaults.defaultDescriptor;
var defaults_2 = defaults.defaultUnknownHandler;
var defaults_3 = defaults.defaultInvalidHandler;
var defaults_4 = defaults.defaultDeprecatedHandler;
var normalize = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.normalize = (options, schemas, opts) => new Normalizer(schemas, opts).normalize(options);
class Normalizer {
constructor(schemas, opts) {
// istanbul ignore next
const {
logger = console,
descriptor = defaults.defaultDescriptor,
unknown = defaults.defaultUnknownHandler,
invalid = defaults.defaultInvalidHandler,
deprecated = defaults.defaultDeprecatedHandler
} = opts || {};
this._utils = {
descriptor,
logger:
/* istanbul ignore next */
logger || {
warn: () => {}
},
schemas: utils.recordFromArray(schemas, 'name'),
normalizeDefaultResult: utils.normalizeDefaultResult,
normalizeDeprecatedResult: utils.normalizeDeprecatedResult,
normalizeForwardResult: utils.normalizeForwardResult,
normalizeRedirectResult: utils.normalizeRedirectResult,
normalizeValidateResult: utils.normalizeValidateResult
};
this._unknownHandler = unknown;
this._invalidHandler = invalid;
this._deprecatedHandler = deprecated;
this.cleanHistory();
}
cleanHistory() {
this._hasDeprecationWarned = utils.createAutoChecklist();
}
normalize(options) {
const normalized = {};
const restOptionsArray = [options];
const applyNormalization = () => {
while (restOptionsArray.length !== 0) {
const currentOptions = restOptionsArray.shift();
const transferredOptionsArray = this._applyNormalization(currentOptions, normalized);
restOptionsArray.push(...transferredOptionsArray);
}
};
applyNormalization();
for (const key of Object.keys(this._utils.schemas)) {
const schema = this._utils.schemas[key];
if (!(key in normalized)) {
const defaultResult = utils.normalizeDefaultResult(schema.default(this._utils));
if ('value' in defaultResult) {
restOptionsArray.push({
[key]: defaultResult.value
});
}
}
}
applyNormalization();
for (const key of Object.keys(this._utils.schemas)) {
const schema = this._utils.schemas[key];
if (key in normalized) {
normalized[key] = schema.postprocess(normalized[key], this._utils);
}
}
return normalized;
}
_applyNormalization(options, normalized) {
const transferredOptionsArray = [];
const [knownOptionNames, unknownOptionNames] = utils.partition(Object.keys(options), key => key in this._utils.schemas);
for (const key of knownOptionNames) {
const schema = this._utils.schemas[key];
const value = schema.preprocess(options[key], this._utils);
const validateResult = utils.normalizeValidateResult(schema.validate(value, this._utils), value);
if (validateResult !== true) {
const {
value: invalidValue
} = validateResult;
const errorMessageOrError = this._invalidHandler(key, invalidValue, this._utils);
throw typeof errorMessageOrError === 'string' ? new Error(errorMessageOrError) :
/* istanbul ignore next*/
errorMessageOrError;
}
const appendTransferredOptions = ({
from,
to
}) => {
transferredOptionsArray.push(typeof to === 'string' ? {
[to]: from
} : {
[to.key]: to.value
});
};
const warnDeprecated = ({
value: currentValue,
redirectTo
}) => {
const deprecatedResult = utils.normalizeDeprecatedResult(schema.deprecated(currentValue, this._utils), value,
/* doNotNormalizeTrue */
true);
if (deprecatedResult === false) {
return;
}
if (deprecatedResult === true) {
if (!this._hasDeprecationWarned(key)) {
this._utils.logger.warn(this._deprecatedHandler(key, redirectTo, this._utils));
}
} else {
for (const {
value: deprecatedValue
} of deprecatedResult) {
const pair = {
key,
value: deprecatedValue
};
if (!this._hasDeprecationWarned(pair)) {
const redirectToPair = typeof redirectTo === 'string' ? {
key: redirectTo,
value: deprecatedValue
} : redirectTo;
this._utils.logger.warn(this._deprecatedHandler(pair, redirectToPair, this._utils));
}
}
}
};
const forwardResult = utils.normalizeForwardResult(schema.forward(value, this._utils), value);
forwardResult.forEach(appendTransferredOptions);
const redirectResult = utils.normalizeRedirectResult(schema.redirect(value, this._utils), value);
redirectResult.redirect.forEach(appendTransferredOptions);
if ('remain' in redirectResult) {
const remainingValue = redirectResult.remain;
normalized[key] = key in normalized ? schema.overlap(normalized[key], remainingValue, this._utils) : remainingValue;
warnDeprecated({
value: remainingValue
});
}
for (const {
from,
to
} of redirectResult.redirect) {
warnDeprecated({
value: from,
redirectTo: to
});
}
}
for (const key of unknownOptionNames) {
const value = options[key];
const unknownResult = this._unknownHandler(key, value, this._utils);
if (unknownResult) {
for (const unknownKey of Object.keys(unknownResult)) {
const unknownOption = {
[unknownKey]: unknownResult[unknownKey]
};
if (unknownKey in this._utils.schemas) {
transferredOptionsArray.push(unknownOption);
} else {
Object.assign(normalized, unknownOption);
}
}
}
}
return transferredOptionsArray;
}
}
exports.Normalizer = Normalizer;
});
unwrapExports(normalize);
var normalize_1 = normalize.normalize;
var normalize_2 = normalize.Normalizer;
var lib = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
tslib_1.__exportStar(descriptors, exports);
tslib_1.__exportStar(handlers, exports);
tslib_1.__exportStar(schemas, exports);
tslib_1.__exportStar(normalize, exports);
tslib_1.__exportStar(schema, exports);
});
unwrapExports(lib);
const array$1 = [];
const charCodeCache$1 = [];
const leven$1 = (left, right) => {
if (left === right) {
return 0;
}
const swap = left; // Swapping the strings if `a` is longer than `b` so we know which one is the
// shortest & which one is the longest
if (left.length > right.length) {
left = right;
right = swap;
}
let leftLength = left.length;
let rightLength = right.length; // Performing suffix trimming:
// We can linearly drop suffix common to both strings since they
// don't increase distance at all
// Note: `~-` is the bitwise way to perform a `- 1` operation
while (leftLength > 0 && left.charCodeAt(~-leftLength) === right.charCodeAt(~-rightLength)) {
leftLength--;
rightLength--;
} // Performing prefix trimming
// We can linearly drop prefix common to both strings since they
// don't increase distance at all
let start = 0;
while (start < leftLength && left.charCodeAt(start) === right.charCodeAt(start)) {
start++;
}
leftLength -= start;
rightLength -= start;
if (leftLength === 0) {
return rightLength;
}
let bCharCode;
let result;
let temp;
let temp2;
let i = 0;
let j = 0;
while (i < leftLength) {
charCodeCache$1[i] = left.charCodeAt(start + i);
array$1[i] = ++i;
}
while (j < rightLength) {
bCharCode = right.charCodeAt(start + j);
temp = j++;
result = j;
for (i = 0; i < leftLength; i++) {
temp2 = bCharCode === charCodeCache$1[i] ? temp : temp + 1;
temp = array$1[i]; // eslint-disable-next-line no-multi-assign
result = array$1[i] = temp > result ? temp2 > result ? result + 1 : temp2 : temp2 > temp ? temp + 1 : temp2;
}
}
return result;
};
var leven_1$1 = leven$1; // TODO: Remove this for the next major release
var default_1 = leven$1;
leven_1$1.default = default_1;
var colorName$1 = {
"aliceblue": [240, 248, 255],
"antiquewhite": [250, 235, 215],
"aqua": [0, 255, 255],
"aquamarine": [127, 255, 212],
"azure": [240, 255, 255],
"beige": [245, 245, 220],
"bisque": [255, 228, 196],
"black": [0, 0, 0],
"blanchedalmond": [255, 235, 205],
"blue": [0, 0, 255],
"blueviolet": [138, 43, 226],
"brown": [165, 42, 42],
"burlywood": [222, 184, 135],
"cadetblue": [95, 158, 160],
"chartreuse": [127, 255, 0],
"chocolate": [210, 105, 30],
"coral": [255, 127, 80],
"cornflowerblue": [100, 149, 237],
"cornsilk": [255, 248, 220],
"crimson": [220, 20, 60],
"cyan": [0, 255, 255],
"darkblue": [0, 0, 139],
"darkcyan": [0, 139, 139],
"darkgoldenrod": [184, 134, 11],
"darkgray": [169, 169, 169],
"darkgreen": [0, 100, 0],
"darkgrey": [169, 169, 169],
"darkkhaki": [189, 183, 107],
"darkmagenta": [139, 0, 139],
"darkolivegreen": [85, 107, 47],
"darkorange": [255, 140, 0],
"darkorchid": [153, 50, 204],
"darkred": [139, 0, 0],
"darksalmon": [233, 150, 122],
"darkseagreen": [143, 188, 143],
"darkslateblue": [72, 61, 139],
"darkslategray": [47, 79, 79],
"darkslategrey": [47, 79, 79],
"darkturquoise": [0, 206, 209],
"darkviolet": [148, 0, 211],
"deeppink": [255, 20, 147],
"deepskyblue": [0, 191, 255],
"dimgray": [105, 105, 105],
"dimgrey": [105, 105, 105],
"dodgerblue": [30, 144, 255],
"firebrick": [178, 34, 34],
"floralwhite": [255, 250, 240],
"forestgreen": [34, 139, 34],
"fuchsia": [255, 0, 255],
"gainsboro": [220, 220, 220],
"ghostwhite": [248, 248, 255],
"gold": [255, 215, 0],
"goldenrod": [218, 165, 32],
"gray": [128, 128, 128],
"green": [0, 128, 0],
"greenyellow": [173, 255, 47],
"grey": [128, 128, 128],
"honeydew": [240, 255, 240],
"hotpink": [255, 105, 180],
"indianred": [205, 92, 92],
"indigo": [75, 0, 130],
"ivory": [255, 255, 240],
"khaki": [240, 230, 140],
"lavender": [230, 230, 250],
"lavenderblush": [255, 240, 245],
"lawngreen": [124, 252, 0],
"lemonchiffon": [255, 250, 205],
"lightblue": [173, 216, 230],
"lightcoral": [240, 128, 128],
"lightcyan": [224, 255, 255],
"lightgoldenrodyellow": [250, 250, 210],
"lightgray": [211, 211, 211],
"lightgreen": [144, 238, 144],
"lightgrey": [211, 211, 211],
"lightpink": [255, 182, 193],
"lightsalmon": [255, 160, 122],
"lightseagreen": [32, 178, 170],
"lightskyblue": [135, 206, 250],
"lightslategray": [119, 136, 153],
"lightslategrey": [119, 136, 153],
"lightsteelblue": [176, 196, 222],
"lightyellow": [255, 255, 224],
"lime": [0, 255, 0],
"limegreen": [50, 205, 50],
"linen": [250, 240, 230],
"magenta": [255, 0, 255],
"maroon": [128, 0, 0],
"mediumaquamarine": [102, 205, 170],
"mediumblue": [0, 0, 205],
"mediumorchid": [186, 85, 211],
"mediumpurple": [147, 112, 219],
"mediumseagreen": [60, 179, 113],
"mediumslateblue": [123, 104, 238],
"mediumspringgreen": [0, 250, 154],
"mediumturquoise": [72, 209, 204],
"mediumvioletred": [199, 21, 133],
"midnightblue": [25, 25, 112],
"mintcream": [245, 255, 250],
"mistyrose": [255, 228, 225],
"moccasin": [255, 228, 181],
"navajowhite": [255, 222, 173],
"navy": [0, 0, 128],
"oldlace": [253, 245, 230],
"olive": [128, 128, 0],
"olivedrab": [107, 142, 35],
"orange": [255, 165, 0],
"orangered": [255, 69, 0],
"orchid": [218, 112, 214],
"palegoldenrod": [238, 232, 170],
"palegreen": [152, 251, 152],
"paleturquoise": [175, 238, 238],
"palevioletred": [219, 112, 147],
"papayawhip": [255, 239, 213],
"peachpuff": [255, 218, 185],
"peru": [205, 133, 63],
"pink": [255, 192, 203],
"plum": [221, 160, 221],
"powderblue": [176, 224, 230],
"purple": [128, 0, 128],
"rebeccapurple": [102, 51, 153],
"red": [255, 0, 0],
"rosybrown": [188, 143, 143],
"royalblue": [65, 105, 225],
"saddlebrown": [139, 69, 19],
"salmon": [250, 128, 114],
"sandybrown": [244, 164, 96],
"seagreen": [46, 139, 87],
"seashell": [255, 245, 238],
"sienna": [160, 82, 45],
"silver": [192, 192, 192],
"skyblue": [135, 206, 235],
"slateblue": [106, 90, 205],
"slategray": [112, 128, 144],
"slategrey": [112, 128, 144],
"snow": [255, 250, 250],
"springgreen": [0, 255, 127],
"steelblue": [70, 130, 180],
"tan": [210, 180, 140],
"teal": [0, 128, 128],
"thistle": [216, 191, 216],
"tomato": [255, 99, 71],
"turquoise": [64, 224, 208],
"violet": [238, 130, 238],
"wheat": [245, 222, 179],
"white": [255, 255, 255],
"whitesmoke": [245, 245, 245],
"yellow": [255, 255, 0],
"yellowgreen": [154, 205, 50]
};
/* MIT license */
/* eslint-disable no-mixed-operators */
// NOTE: conversions should only return primitive values (i.e. arrays, or
// values that give correct `typeof` results).
// do not use box values types (i.e. Number(), String(), etc.)
const reverseKeywords = {};
for (const key of Object.keys(colorName$1)) {
reverseKeywords[colorName$1[key]] = key;
}
const convert$1 = {
rgb: {
channels: 3,
labels: 'rgb'
},
hsl: {
channels: 3,
labels: 'hsl'
},
hsv: {
channels: 3,
labels: 'hsv'
},
hwb: {
channels: 3,
labels: 'hwb'
},
cmyk: {
channels: 4,
labels: 'cmyk'
},
xyz: {
channels: 3,
labels: 'xyz'
},
lab: {
channels: 3,
labels: 'lab'
},
lch: {
channels: 3,
labels: 'lch'
},
hex: {
channels: 1,
labels: ['hex']
},
keyword: {
channels: 1,
labels: ['keyword']
},
ansi16: {
channels: 1,
labels: ['ansi16']
},
ansi256: {
channels: 1,
labels: ['ansi256']
},
hcg: {
channels: 3,
labels: ['h', 'c', 'g']
},
apple: {
channels: 3,
labels: ['r16', 'g16', 'b16']
},
gray: {
channels: 1,
labels: ['gray']
}
};
var conversions$1 = convert$1; // Hide .channels and .labels properties
for (const model of Object.keys(convert$1)) {
if (!('channels' in convert$1[model])) {
throw new Error('missing channels property: ' + model);
}
if (!('labels' in convert$1[model])) {
throw new Error('missing channel labels property: ' + model);
}
if (convert$1[model].labels.length !== convert$1[model].channels) {
throw new Error('channel and label counts mismatch: ' + model);
}
const {
channels,
labels
} = convert$1[model];
delete convert$1[model].channels;
delete convert$1[model].labels;
Object.defineProperty(convert$1[model], 'channels', {
value: channels
});
Object.defineProperty(convert$1[model], 'labels', {
value: labels
});
}
convert$1.rgb.hsl = function (rgb) {
const r = rgb[0] / 255;
const g = rgb[1] / 255;
const b = rgb[2] / 255;
const min = Math.min(r, g, b);
const max = Math.max(r, g, b);
const delta = max - min;
let h;
let s;
if (max === min) {
h = 0;
} else if (r === max) {
h = (g - b) / delta;
} else if (g === max) {
h = 2 + (b - r) / delta;
} else if (b === max) {
h = 4 + (r - g) / delta;
}
h = Math.min(h * 60, 360);
if (h < 0) {
h += 360;
}
const l = (min + max) / 2;
if (max === min) {
s = 0;
} else if (l <= 0.5) {
s = delta / (max + min);
} else {
s = delta / (2 - max - min);
}
return [h, s * 100, l * 100];
};
convert$1.rgb.hsv = function (rgb) {
let rdif;
let gdif;
let bdif;
let h;
let s;
const r = rgb[0] / 255;
const g = rgb[1] / 255;
const b = rgb[2] / 255;
const v = Math.max(r, g, b);
const diff = v - Math.min(r, g, b);
const diffc = function diffc(c) {
return (v - c) / 6 / diff + 1 / 2;
};
if (diff === 0) {
h = 0;
s = 0;
} else {
s = diff / v;
rdif = diffc(r);
gdif = diffc(g);
bdif = diffc(b);
if (r === v) {
h = bdif - gdif;
} else if (g === v) {
h = 1 / 3 + rdif - bdif;
} else if (b === v) {
h = 2 / 3 + gdif - rdif;
}
if (h < 0) {
h += 1;
} else if (h > 1) {
h -= 1;
}
}
return [h * 360, s * 100, v * 100];
};
convert$1.rgb.hwb = function (rgb) {
const r = rgb[0];
const g = rgb[1];
let b = rgb[2];
const h = convert$1.rgb.hsl(rgb)[0];
const w = 1 / 255 * Math.min(r, Math.min(g, b));
b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
return [h, w * 100, b * 100];
};
convert$1.rgb.cmyk = function (rgb) {
const r = rgb[0] / 255;
const g = rgb[1] / 255;
const b = rgb[2] / 255;
const k = Math.min(1 - r, 1 - g, 1 - b);
const c = (1 - r - k) / (1 - k) || 0;
const m = (1 - g - k) / (1 - k) || 0;
const y = (1 - b - k) / (1 - k) || 0;
return [c * 100, m * 100, y * 100, k * 100];
};
function comparativeDistance(x, y) {
/*
See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
*/
return (x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2 + (x[2] - y[2]) ** 2;
}
convert$1.rgb.keyword = function (rgb) {
const reversed = reverseKeywords[rgb];
if (reversed) {
return reversed;
}
let currentClosestDistance = Infinity;
let currentClosestKeyword;
for (const keyword of Object.keys(colorName$1)) {
const value = colorName$1[keyword]; // Compute comparative distance
const distance = comparativeDistance(rgb, value); // Check if its less, if so set as closest
if (distance < currentClosestDistance) {
currentClosestDistance = distance;
currentClosestKeyword = keyword;
}
}
return currentClosestKeyword;
};
convert$1.keyword.rgb = function (keyword) {
return colorName$1[keyword];
};
convert$1.rgb.xyz = function (rgb) {
let r = rgb[0] / 255;
let g = rgb[1] / 255;
let b = rgb[2] / 255; // Assume sRGB
r = r > 0.04045 ? ((r + 0.055) / 1.055) ** 2.4 : r / 12.92;
g = g > 0.04045 ? ((g + 0.055) / 1.055) ** 2.4 : g / 12.92;
b = b > 0.04045 ? ((b + 0.055) / 1.055) ** 2.4 : b / 12.92;
const x = r * 0.4124 + g * 0.3576 + b * 0.1805;
const y = r * 0.2126 + g * 0.7152 + b * 0.0722;
const z = r * 0.0193 + g * 0.1192 + b * 0.9505;
return [x * 100, y * 100, z * 100];
};
convert$1.rgb.lab = function (rgb) {
const xyz = convert$1.rgb.xyz(rgb);
let x = xyz[0];
let y = xyz[1];
let z = xyz[2];
x /= 95.047;
y /= 100;
z /= 108.883;
x = x > 0.008856 ? x ** (1 / 3) : 7.787 * x + 16 / 116;
y = y > 0.008856 ? y ** (1 / 3) : 7.787 * y + 16 / 116;
z = z > 0.008856 ? z ** (1 / 3) : 7.787 * z + 16 / 116;
const l = 116 * y - 16;
const a = 500 * (x - y);
const b = 200 * (y - z);
return [l, a, b];
};
convert$1.hsl.rgb = function (hsl) {
const h = hsl[0] / 360;
const s = hsl[1] / 100;
const l = hsl[2] / 100;
let t2;
let t3;
let val;
if (s === 0) {
val = l * 255;
return [val, val, val];
}
if (l < 0.5) {
t2 = l * (1 + s);
} else {
t2 = l + s - l * s;
}
const t1 = 2 * l - t2;
const rgb = [0, 0, 0];
for (let i = 0; i < 3; i++) {
t3 = h + 1 / 3 * -(i - 1);
if (t3 < 0) {
t3++;
}
if (t3 > 1) {
t3--;
}
if (6 * t3 < 1) {
val = t1 + (t2 - t1) * 6 * t3;
} else if (2 * t3 < 1) {
val = t2;
} else if (3 * t3 < 2) {
val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
} else {
val = t1;
}
rgb[i] = val * 255;
}
return rgb;
};
convert$1.hsl.hsv = function (hsl) {
const h = hsl[0];
let s = hsl[1] / 100;
let l = hsl[2] / 100;
let smin = s;
const lmin = Math.max(l, 0.01);
l *= 2;
s *= l <= 1 ? l : 2 - l;
smin *= lmin <= 1 ? lmin : 2 - lmin;
const v = (l + s) / 2;
const sv = l === 0 ? 2 * smin / (lmin + smin) : 2 * s / (l + s);
return [h, sv * 100, v * 100];
};
convert$1.hsv.rgb = function (hsv) {
const h = hsv[0] / 60;
const s = hsv[1] / 100;
let v = hsv[2] / 100;
const hi = Math.floor(h) % 6;
const f = h - Math.floor(h);
const p = 255 * v * (1 - s);
const q = 255 * v * (1 - s * f);
const t = 255 * v * (1 - s * (1 - f));
v *= 255;
switch (hi) {
case 0:
return [v, t, p];
case 1:
return [q, v, p];
case 2:
return [p, v, t];
case 3:
return [p, q, v];
case 4:
return [t, p, v];
case 5:
return [v, p, q];
}
};
convert$1.hsv.hsl = function (hsv) {
const h = hsv[0];
const s = hsv[1] / 100;
const v = hsv[2] / 100;
const vmin = Math.max(v, 0.01);
let sl;
let l;
l = (2 - s) * v;
const lmin = (2 - s) * vmin;
sl = s * vmin;
sl /= lmin <= 1 ? lmin : 2 - lmin;
sl = sl || 0;
l /= 2;
return [h, sl * 100, l * 100];
}; // http://dev.w3.org/csswg/css-color/#hwb-to-rgb
convert$1.hwb.rgb = function (hwb) {
const h = hwb[0] / 360;
let wh = hwb[1] / 100;
let bl = hwb[2] / 100;
const ratio = wh + bl;
let f; // Wh + bl cant be > 1
if (ratio > 1) {
wh /= ratio;
bl /= ratio;
}
const i = Math.floor(6 * h);
const v = 1 - bl;
f = 6 * h - i;
if ((i & 0x01) !== 0) {
f = 1 - f;
}
const n = wh + f * (v - wh); // Linear interpolation
let r;
let g;
let b;
/* eslint-disable max-statements-per-line,no-multi-spaces */
switch (i) {
default:
case 6:
case 0:
r = v;
g = n;
b = wh;
break;
case 1:
r = n;
g = v;
b = wh;
break;
case 2:
r = wh;
g = v;
b = n;
break;
case 3:
r = wh;
g = n;
b = v;
break;
case 4:
r = n;
g = wh;
b = v;
break;
case 5:
r = v;
g = wh;
b = n;
break;
}
/* eslint-enable max-statements-per-line,no-multi-spaces */
return [r * 255, g * 255, b * 255];
};
convert$1.cmyk.rgb = function (cmyk) {
const c = cmyk[0] / 100;
const m = cmyk[1] / 100;
const y = cmyk[2] / 100;
const k = cmyk[3] / 100;
const r = 1 - Math.min(1, c * (1 - k) + k);
const g = 1 - Math.min(1, m * (1 - k) + k);
const b = 1 - Math.min(1, y * (1 - k) + k);
return [r * 255, g * 255, b * 255];
};
convert$1.xyz.rgb = function (xyz) {
const x = xyz[0] / 100;
const y = xyz[1] / 100;
const z = xyz[2] / 100;
let r;
let g;
let b;
r = x * 3.2406 + y * -1.5372 + z * -0.4986;
g = x * -0.9689 + y * 1.8758 + z * 0.0415;
b = x * 0.0557 + y * -0.2040 + z * 1.0570; // Assume sRGB
r = r > 0.0031308 ? 1.055 * r ** (1.0 / 2.4) - 0.055 : r * 12.92;
g = g > 0.0031308 ? 1.055 * g ** (1.0 / 2.4) - 0.055 : g * 12.92;
b = b > 0.0031308 ? 1.055 * b ** (1.0 / 2.4) - 0.055 : b * 12.92;
r = Math.min(Math.max(0, r), 1);
g = Math.min(Math.max(0, g), 1);
b = Math.min(Math.max(0, b), 1);
return [r * 255, g * 255, b * 255];
};
convert$1.xyz.lab = function (xyz) {
let x = xyz[0];
let y = xyz[1];
let z = xyz[2];
x /= 95.047;
y /= 100;
z /= 108.883;
x = x > 0.008856 ? x ** (1 / 3) : 7.787 * x + 16 / 116;
y = y > 0.008856 ? y ** (1 / 3) : 7.787 * y + 16 / 116;
z = z > 0.008856 ? z ** (1 / 3) : 7.787 * z + 16 / 116;
const l = 116 * y - 16;
const a = 500 * (x - y);
const b = 200 * (y - z);
return [l, a, b];
};
convert$1.lab.xyz = function (lab) {
const l = lab[0];
const a = lab[1];
const b = lab[2];
let x;
let y;
let z;
y = (l + 16) / 116;
x = a / 500 + y;
z = y - b / 200;
const y2 = y ** 3;
const x2 = x ** 3;
const z2 = z ** 3;
y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
x *= 95.047;
y *= 100;
z *= 108.883;
return [x, y, z];
};
convert$1.lab.lch = function (lab) {
const l = lab[0];
const a = lab[1];
const b = lab[2];
let h;
const hr = Math.atan2(b, a);
h = hr * 360 / 2 / Math.PI;
if (h < 0) {
h += 360;
}
const c = Math.sqrt(a * a + b * b);
return [l, c, h];
};
convert$1.lch.lab = function (lch) {
const l = lch[0];
const c = lch[1];
const h = lch[2];
const hr = h / 360 * 2 * Math.PI;
const a = c * Math.cos(hr);
const b = c * Math.sin(hr);
return [l, a, b];
};
convert$1.rgb.ansi16 = function (args, saturation = null) {
const [r, g, b] = args;
let value = saturation === null ? convert$1.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization
value = Math.round(value / 50);
if (value === 0) {
return 30;
}
let ansi = 30 + (Math.round(b / 255) << 2 | Math.round(g / 255) << 1 | Math.round(r / 255));
if (value === 2) {
ansi += 60;
}
return ansi;
};
convert$1.hsv.ansi16 = function (args) {
// Optimization here; we already know the value and don't need to get
// it converted for us.
return convert$1.rgb.ansi16(convert$1.hsv.rgb(args), args[2]);
};
convert$1.rgb.ansi256 = function (args) {
const r = args[0];
const g = args[1];
const b = args[2]; // We use the extended greyscale palette here, with the exception of
// black and white. normal palette only has 4 greyscale shades.
if (r === g && g === b) {
if (r < 8) {
return 16;
}
if (r > 248) {
return 231;
}
return Math.round((r - 8) / 247 * 24) + 232;
}
const ansi = 16 + 36 * Math.round(r / 255 * 5) + 6 * Math.round(g / 255 * 5) + Math.round(b / 255 * 5);
return ansi;
};
convert$1.ansi16.rgb = function (args) {
let color = args % 10; // Handle greyscale
if (color === 0 || color === 7) {
if (args > 50) {
color += 3.5;
}
color = color / 10.5 * 255;
return [color, color, color];
}
const mult = (~~(args > 50) + 1) * 0.5;
const r = (color & 1) * mult * 255;
const g = (color >> 1 & 1) * mult * 255;
const b = (color >> 2 & 1) * mult * 255;
return [r, g, b];
};
convert$1.ansi256.rgb = function (args) {
// Handle greyscale
if (args >= 232) {
const c = (args - 232) * 10 + 8;
return [c, c, c];
}
args -= 16;
let rem;
const r = Math.floor(args / 36) / 5 * 255;
const g = Math.floor((rem = args % 36) / 6) / 5 * 255;
const b = rem % 6 / 5 * 255;
return [r, g, b];
};
convert$1.rgb.hex = function (args) {
const integer = ((Math.round(args[0]) & 0xFF) << 16) + ((Math.round(args[1]) & 0xFF) << 8) + (Math.round(args[2]) & 0xFF);
const string = integer.toString(16).toUpperCase();
return '000000'.substring(string.length) + string;
};
convert$1.hex.rgb = function (args) {
const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
if (!match) {
return [0, 0, 0];
}
let colorString = match[0];
if (match[0].length === 3) {
colorString = colorString.split('').map(char => {
return char + char;
}).join('');
}
const integer = parseInt(colorString, 16);
const r = integer >> 16 & 0xFF;
const g = integer >> 8 & 0xFF;
const b = integer & 0xFF;
return [r, g, b];
};
convert$1.rgb.hcg = function (rgb) {
const r = rgb[0] / 255;
const g = rgb[1] / 255;
const b = rgb[2] / 255;
const max = Math.max(Math.max(r, g), b);
const min = Math.min(Math.min(r, g), b);
const chroma = max - min;
let grayscale;
let hue;
if (chroma < 1) {
grayscale = min / (1 - chroma);
} else {
grayscale = 0;
}
if (chroma <= 0) {
hue = 0;
} else if (max === r) {
hue = (g - b) / chroma % 6;
} else if (max === g) {
hue = 2 + (b - r) / chroma;
} else {
hue = 4 + (r - g) / chroma;
}
hue /= 6;
hue %= 1;
return [hue * 360, chroma * 100, grayscale * 100];
};
convert$1.hsl.hcg = function (hsl) {
const s = hsl[1] / 100;
const l = hsl[2] / 100;
const c = l < 0.5 ? 2.0 * s * l : 2.0 * s * (1.0 - l);
let f = 0;
if (c < 1.0) {
f = (l - 0.5 * c) / (1.0 - c);
}
return [hsl[0], c * 100, f * 100];
};
convert$1.hsv.hcg = function (hsv) {
const s = hsv[1] / 100;
const v = hsv[2] / 100;
const c = s * v;
let f = 0;
if (c < 1.0) {
f = (v - c) / (1 - c);
}
return [hsv[0], c * 100, f * 100];
};
convert$1.hcg.rgb = function (hcg) {
const h = hcg[0] / 360;
const c = hcg[1] / 100;
const g = hcg[2] / 100;
if (c === 0.0) {
return [g * 255, g * 255, g * 255];
}
const pure = [0, 0, 0];
const hi = h % 1 * 6;
const v = hi % 1;
const w = 1 - v;
let mg = 0;
/* eslint-disable max-statements-per-line */
switch (Math.floor(hi)) {
case 0:
pure[0] = 1;
pure[1] = v;
pure[2] = 0;
break;
case 1:
pure[0] = w;
pure[1] = 1;
pure[2] = 0;
break;
case 2:
pure[0] = 0;
pure[1] = 1;
pure[2] = v;
break;
case 3:
pure[0] = 0;
pure[1] = w;
pure[2] = 1;
break;
case 4:
pure[0] = v;
pure[1] = 0;
pure[2] = 1;
break;
default:
pure[0] = 1;
pure[1] = 0;
pure[2] = w;
}
/* eslint-enable max-statements-per-line */
mg = (1.0 - c) * g;
return [(c * pure[0] + mg) * 255, (c * pure[1] + mg) * 255, (c * pure[2] + mg) * 255];
};
convert$1.hcg.hsv = function (hcg) {
const c = hcg[1] / 100;
const g = hcg[2] / 100;
const v = c + g * (1.0 - c);
let f = 0;
if (v > 0.0) {
f = c / v;
}
return [hcg[0], f * 100, v * 100];
};
convert$1.hcg.hsl = function (hcg) {
const c = hcg[1] / 100;
const g = hcg[2] / 100;
const l = g * (1.0 - c) + 0.5 * c;
let s = 0;
if (l > 0.0 && l < 0.5) {
s = c / (2 * l);
} else if (l >= 0.5 && l < 1.0) {
s = c / (2 * (1 - l));
}
return [hcg[0], s * 100, l * 100];
};
convert$1.hcg.hwb = function (hcg) {
const c = hcg[1] / 100;
const g = hcg[2] / 100;
const v = c + g * (1.0 - c);
return [hcg[0], (v - c) * 100, (1 - v) * 100];
};
convert$1.hwb.hcg = function (hwb) {
const w = hwb[1] / 100;
const b = hwb[2] / 100;
const v = 1 - b;
const c = v - w;
let g = 0;
if (c < 1) {
g = (v - c) / (1 - c);
}
return [hwb[0], c * 100, g * 100];
};
convert$1.apple.rgb = function (apple) {
return [apple[0] / 65535 * 255, apple[1] / 65535 * 255, apple[2] / 65535 * 255];
};
convert$1.rgb.apple = function (rgb) {
return [rgb[0] / 255 * 65535, rgb[1] / 255 * 65535, rgb[2] / 255 * 65535];
};
convert$1.gray.rgb = function (args) {
return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
};
convert$1.gray.hsl = function (args) {
return [0, 0, args[0]];
};
convert$1.gray.hsv = convert$1.gray.hsl;
convert$1.gray.hwb = function (gray) {
return [0, 100, gray[0]];
};
convert$1.gray.cmyk = function (gray) {
return [0, 0, 0, gray[0]];
};
convert$1.gray.lab = function (gray) {
return [gray[0], 0, 0];
};
convert$1.gray.hex = function (gray) {
const val = Math.round(gray[0] / 100 * 255) & 0xFF;
const integer = (val << 16) + (val << 8) + val;
const string = integer.toString(16).toUpperCase();
return '000000'.substring(string.length) + string;
};
convert$1.rgb.gray = function (rgb) {
const val = (rgb[0] + rgb[1] + rgb[2]) / 3;
return [val / 255 * 100];
};
/*
This function routes a model to all other models.
all functions that are routed have a property `.conversion` attached
to the returned synthetic function. This property is an array
of strings, each with the steps in between the 'from' and 'to'
color models (inclusive).
conversions that are not possible simply are not included.
*/
function buildGraph$1() {
const graph = {}; // https://jsperf.com/object-keys-vs-for-in-with-closure/3
const models = Object.keys(conversions$1);
for (let len = models.length, i = 0; i < len; i++) {
graph[models[i]] = {
// http://jsperf.com/1-vs-infinity
// micro-opt, but this is simple.
distance: -1,
parent: null
};
}
return graph;
} // https://en.wikipedia.org/wiki/Breadth-first_search
function deriveBFS$1(fromModel) {
const graph = buildGraph$1();
const queue = [fromModel]; // Unshift -> queue -> pop
graph[fromModel].distance = 0;
while (queue.length) {
const current = queue.pop();
const adjacents = Object.keys(conversions$1[current]);
for (let len = adjacents.length, i = 0; i < len; i++) {
const adjacent = adjacents[i];
const node = graph[adjacent];
if (node.distance === -1) {
node.distance = graph[current].distance + 1;
node.parent = current;
queue.unshift(adjacent);
}
}
}
return graph;
}
function link$1(from, to) {
return function (args) {
return to(from(args));
};
}
function wrapConversion$1(toModel, graph) {
const path = [graph[toModel].parent, toModel];
let fn = conversions$1[graph[toModel].parent][toModel];
let cur = graph[toModel].parent;
while (graph[cur].parent) {
path.unshift(graph[cur].parent);
fn = link$1(conversions$1[graph[cur].parent][cur], fn);
cur = graph[cur].parent;
}
fn.conversion = path;
return fn;
}
var route$1 = function route(fromModel) {
const graph = deriveBFS$1(fromModel);
const conversion = {};
const models = Object.keys(graph);
for (let len = models.length, i = 0; i < len; i++) {
const toModel = models[i];
const node = graph[toModel];
if (node.parent === null) {
// No possible conversion, or this node is the source model.
continue;
}
conversion[toModel] = wrapConversion$1(toModel, graph);
}
return conversion;
};
const convert$2 = {};
const models$1 = Object.keys(conversions$1);
function wrapRaw$1(fn) {
const wrappedFn = function wrappedFn(...args) {
const arg0 = args[0];
if (arg0 === undefined || arg0 === null) {
return arg0;
}
if (arg0.length > 1) {
args = arg0;
}
return fn(args);
}; // Preserve .conversion property if there is one
if ('conversion' in fn) {
wrappedFn.conversion = fn.conversion;
}
return wrappedFn;
}
function wrapRounded$1(fn) {
const wrappedFn = function wrappedFn(...args) {
const arg0 = args[0];
if (arg0 === undefined || arg0 === null) {
return arg0;
}
if (arg0.length > 1) {
args = arg0;
}
const result = fn(args); // We're assuming the result is an array here.
// see notice in conversions.js; don't use box types
// in conversion functions.
if (typeof result === 'object') {
for (let len = result.length, i = 0; i < len; i++) {
result[i] = Math.round(result[i]);
}
}
return result;
}; // Preserve .conversion property if there is one
if ('conversion' in fn) {
wrappedFn.conversion = fn.conversion;
}
return wrappedFn;
}
models$1.forEach(fromModel => {
convert$2[fromModel] = {};
Object.defineProperty(convert$2[fromModel], 'channels', {
value: conversions$1[fromModel].channels
});
Object.defineProperty(convert$2[fromModel], 'labels', {
value: conversions$1[fromModel].labels
});
const routes = route$1(fromModel);
const routeModels = Object.keys(routes);
routeModels.forEach(toModel => {
const fn = routes[toModel];
convert$2[fromModel][toModel] = wrapRounded$1(fn);
convert$2[fromModel][toModel].raw = wrapRaw$1(fn);
});
});
var colorConvert$1 = convert$2;
var ansiStyles$1 = createCommonjsModule(function (module) {
const wrapAnsi16 = (fn, offset) => (...args) => {
const code = fn(...args);
return "\x1B[".concat(code + offset, "m");
};
const wrapAnsi256 = (fn, offset) => (...args) => {
const code = fn(...args);
return "\x1B[".concat(38 + offset, ";5;").concat(code, "m");
};
const wrapAnsi16m = (fn, offset) => (...args) => {
const rgb = fn(...args);
return "\x1B[".concat(38 + offset, ";2;").concat(rgb[0], ";").concat(rgb[1], ";").concat(rgb[2], "m");
};
const ansi2ansi = n => n;
const rgb2rgb = (r, g, b) => [r, g, b];
const setLazyProperty = (object, property, _get) => {
Object.defineProperty(object, property, {
get: () => {
const value = _get();
Object.defineProperty(object, property, {
value,
enumerable: true,
configurable: true
});
return value;
},
enumerable: true,
configurable: true
});
};
/** @type {typeof import('color-convert')} */
let colorConvert;
const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {
if (colorConvert === undefined) {
colorConvert = colorConvert$1;
}
const offset = isBackground ? 10 : 0;
const styles = {};
for (const [sourceSpace, suite] of Object.entries(colorConvert)) {
const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace;
if (sourceSpace === targetSpace) {
styles[name] = wrap(identity, offset);
} else if (typeof suite === 'object') {
styles[name] = wrap(suite[targetSpace], offset);
}
}
return styles;
};
function assembleStyles() {
const codes = new Map();
const styles = {
modifier: {
reset: [0, 0],
// 21 isn't widely supported and 22 does the same thing
bold: [1, 22],
dim: [2, 22],
italic: [3, 23],
underline: [4, 24],
inverse: [7, 27],
hidden: [8, 28],
strikethrough: [9, 29]
},
color: {
black: [30, 39],
red: [31, 39],
green: [32, 39],
yellow: [33, 39],
blue: [34, 39],
magenta: [35, 39],
cyan: [36, 39],
white: [37, 39],
// Bright color
blackBright: [90, 39],
redBright: [91, 39],
greenBright: [92, 39],
yellowBright: [93, 39],
blueBright: [94, 39],
magentaBright: [95, 39],
cyanBright: [96, 39],
whiteBright: [97, 39]
},
bgColor: {
bgBlack: [40, 49],
bgRed: [41, 49],
bgGreen: [42, 49],
bgYellow: [43, 49],
bgBlue: [44, 49],
bgMagenta: [45, 49],
bgCyan: [46, 49],
bgWhite: [47, 49],
// Bright color
bgBlackBright: [100, 49],
bgRedBright: [101, 49],
bgGreenBright: [102, 49],
bgYellowBright: [103, 49],
bgBlueBright: [104, 49],
bgMagentaBright: [105, 49],
bgCyanBright: [106, 49],
bgWhiteBright: [107, 49]
}
}; // Alias bright black as gray (and grey)
styles.color.gray = styles.color.blackBright;
styles.bgColor.bgGray = styles.bgColor.bgBlackBright;
styles.color.grey = styles.color.blackBright;
styles.bgColor.bgGrey = styles.bgColor.bgBlackBright;
for (const [groupName, group] of Object.entries(styles)) {
for (const [styleName, style] of Object.entries(group)) {
styles[styleName] = {
open: "\x1B[".concat(style[0], "m"),
close: "\x1B[".concat(style[1], "m")
};
group[styleName] = styles[styleName];
codes.set(style[0], style[1]);
}
Object.defineProperty(styles, groupName, {
value: group,
enumerable: false
});
}
Object.defineProperty(styles, 'codes', {
value: codes,
enumerable: false
});
styles.color.close = '\u001B[39m';
styles.bgColor.close = '\u001B[49m';
setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false));
setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false));
setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false));
setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true));
setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true));
setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true));
return styles;
} // Make the export immutable
Object.defineProperty(module, 'exports', {
enumerable: true,
get: assembleStyles
});
});
var tty = {
isatty() {
return false;
}
};
var hasFlag$1 = (flag, argv = process.argv) => {
const prefix = flag.startsWith('-') ? '' : flag.length === 1 ? '-' : '--';
const position = argv.indexOf(prefix + flag);
const terminatorPosition = argv.indexOf('--');
return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
};
const {
env: env$2
} = process;
let forceColor$1;
if (hasFlag$1('no-color') || hasFlag$1('no-colors') || hasFlag$1('color=false') || hasFlag$1('color=never')) {
forceColor$1 = 0;
} else if (hasFlag$1('color') || hasFlag$1('colors') || hasFlag$1('color=true') || hasFlag$1('color=always')) {
forceColor$1 = 1;
}
if ('FORCE_COLOR' in env$2) {
if (env$2.FORCE_COLOR === 'true') {
forceColor$1 = 1;
} else if (env$2.FORCE_COLOR === 'false') {
forceColor$1 = 0;
} else {
forceColor$1 = env$2.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env$2.FORCE_COLOR, 10), 3);
}
}
function translateLevel$1(level) {
if (level === 0) {
return false;
}
return {
level,
hasBasic: true,
has256: level >= 2,
has16m: level >= 3
};
}
function supportsColor$1(haveStream, streamIsTTY) {
if (forceColor$1 === 0) {
return 0;
}
if (hasFlag$1('color=16m') || hasFlag$1('color=full') || hasFlag$1('color=truecolor')) {
return 3;
}
if (hasFlag$1('color=256')) {
return 2;
}
if (haveStream && !streamIsTTY && forceColor$1 === undefined) {
return 0;
}
const min = forceColor$1 || 0;
if (env$2.TERM === 'dumb') {
return min;
}
if (process.platform === 'win32') {
// Windows 10 build 10586 is the first Windows release that supports 256 colors.
// Windows 10 build 14931 is the first release that supports 16m/TrueColor.
const osRelease = require$$0$1.release().split('.');
if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
return Number(osRelease[2]) >= 14931 ? 3 : 2;
}
return 1;
}
if ('CI' in env$2) {
if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env$2) || env$2.CI_NAME === 'codeship') {
return 1;
}
return min;
}
if ('TEAMCITY_VERSION' in env$2) {
return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env$2.TEAMCITY_VERSION) ? 1 : 0;
}
if ('GITHUB_ACTIONS' in env$2) {
return 1;
}
if (env$2.COLORTERM === 'truecolor') {
return 3;
}
if ('TERM_PROGRAM' in env$2) {
const version = parseInt((env$2.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
switch (env$2.TERM_PROGRAM) {
case 'iTerm.app':
return version >= 3 ? 3 : 2;
case 'Apple_Terminal':
return 2;
// No default
}
}
if (/-256(color)?$/i.test(env$2.TERM)) {
return 2;
}
if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env$2.TERM)) {
return 1;
}
if ('COLORTERM' in env$2) {
return 1;
}
return min;
}
function getSupportLevel$1(stream) {
const level = supportsColor$1(stream, stream && stream.isTTY);
return translateLevel$1(level);
}
var supportsColor_1$1 = {
supportsColor: getSupportLevel$1,
stdout: translateLevel$1(supportsColor$1(true, tty.isatty(1))),
stderr: translateLevel$1(supportsColor$1(true, tty.isatty(2)))
};
const stringReplaceAll = (string, substring, replacer) => {
let index = string.indexOf(substring);
if (index === -1) {
return string;
}
const substringLength = substring.length;
let endIndex = 0;
let returnValue = '';
do {
returnValue += string.substr(endIndex, index - endIndex) + substring + replacer;
endIndex = index + substringLength;
index = string.indexOf(substring, endIndex);
} while (index !== -1);
returnValue += string.substr(endIndex);
return returnValue;
};
const stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => {
let endIndex = 0;
let returnValue = '';
do {
const gotCR = string[index - 1] === '\r';
returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\r\n' : '\n') + postfix;
endIndex = index + 1;
index = string.indexOf('\n', endIndex);
} while (index !== -1);
returnValue += string.substr(endIndex);
return returnValue;
};
var util = {
stringReplaceAll,
stringEncaseCRLFWithFirstIndex
};
const TEMPLATE_REGEX$1 = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
const STYLE_REGEX$1 = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
const STRING_REGEX$1 = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
const ESCAPE_REGEX$1 = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi;
const ESCAPES$1 = new Map([['n', '\n'], ['r', '\r'], ['t', '\t'], ['b', '\b'], ['f', '\f'], ['v', '\v'], ['0', '\0'], ['\\', '\\'], ['e', '\u001B'], ['a', '\u0007']]);
function unescape$1(c) {
const u = c[0] === 'u';
const bracket = c[1] === '{';
if (u && !bracket && c.length === 5 || c[0] === 'x' && c.length === 3) {
return String.fromCharCode(parseInt(c.slice(1), 16));
}
if (u && bracket) {
return String.fromCodePoint(parseInt(c.slice(2, -1), 16));
}
return ESCAPES$1.get(c) || c;
}
function parseArguments$1(name, arguments_) {
const results = [];
const chunks = arguments_.trim().split(/\s*,\s*/g);
let matches;
for (const chunk of chunks) {
const number = Number(chunk);
if (!Number.isNaN(number)) {
results.push(number);
} else if (matches = chunk.match(STRING_REGEX$1)) {
results.push(matches[2].replace(ESCAPE_REGEX$1, (m, escape, character) => escape ? unescape$1(escape) : character));
} else {
throw new Error("Invalid Chalk template style argument: ".concat(chunk, " (in style '").concat(name, "')"));
}
}
return results;
}
function parseStyle$1(style) {
STYLE_REGEX$1.lastIndex = 0;
const results = [];
let matches;
while ((matches = STYLE_REGEX$1.exec(style)) !== null) {
const name = matches[1];
if (matches[2]) {
const args = parseArguments$1(name, matches[2]);
results.push([name].concat(args));
} else {
results.push([name]);
}
}
return results;
}
function buildStyle$1(chalk, styles) {
const enabled = {};
for (const layer of styles) {
for (const style of layer.styles) {
enabled[style[0]] = layer.inverse ? null : style.slice(1);
}
}
let current = chalk;
for (const [styleName, styles] of Object.entries(enabled)) {
if (!Array.isArray(styles)) {
continue;
}
if (!(styleName in current)) {
throw new Error("Unknown Chalk style: ".concat(styleName));
}
current = styles.length > 0 ? current[styleName](...styles) : current[styleName];
}
return current;
}
var templates$1 = (chalk, temporary) => {
const styles = [];
const chunks = [];
let chunk = []; // eslint-disable-next-line max-params
temporary.replace(TEMPLATE_REGEX$1, (m, escapeCharacter, inverse, style, close, character) => {
if (escapeCharacter) {
chunk.push(unescape$1(escapeCharacter));
} else if (style) {
const string = chunk.join('');
chunk = [];
chunks.push(styles.length === 0 ? string : buildStyle$1(chalk, styles)(string));
styles.push({
inverse,
styles: parseStyle$1(style)
});
} else if (close) {
if (styles.length === 0) {
throw new Error('Found extraneous } in Chalk template literal');
}
chunks.push(buildStyle$1(chalk, styles)(chunk.join('')));
chunk = [];
styles.pop();
} else {
chunk.push(character);
}
});
chunks.push(chunk.join(''));
if (styles.length > 0) {
const errMessage = "Chalk template literal is missing ".concat(styles.length, " closing bracket").concat(styles.length === 1 ? '' : 's', " (`}`)");
throw new Error(errMessage);
}
return chunks.join('');
};
const {
stdout: stdoutColor,
stderr: stderrColor
} = supportsColor_1$1;
const {
stringReplaceAll: stringReplaceAll$1,
stringEncaseCRLFWithFirstIndex: stringEncaseCRLFWithFirstIndex$1
} = util; // `supportsColor.level` → `ansiStyles.color[name]` mapping
const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m'];
const styles = Object.create(null);
const applyOptions = (object, options = {}) => {
if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {
throw new Error('The `level` option should be an integer from 0 to 3');
} // Detect level if not set manually
const colorLevel = stdoutColor ? stdoutColor.level : 0;
object.level = options.level === undefined ? colorLevel : options.level;
};
class ChalkClass {
constructor(options) {
// eslint-disable-next-line no-constructor-return
return chalkFactory(options);
}
}
const chalkFactory = options => {
const chalk = {};
applyOptions(chalk, options);
chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_);
Object.setPrototypeOf(chalk, Chalk.prototype);
Object.setPrototypeOf(chalk.template, chalk);
chalk.template.constructor = () => {
throw new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.');
};
chalk.template.Instance = ChalkClass;
return chalk.template;
};
function Chalk(options) {
return chalkFactory(options);
}
for (const [styleName, style] of Object.entries(ansiStyles$1)) {
styles[styleName] = {
get() {
const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty);
Object.defineProperty(this, styleName, {
value: builder
});
return builder;
}
};
}
styles.visible = {
get() {
const builder = createBuilder(this, this._styler, true);
Object.defineProperty(this, 'visible', {
value: builder
});
return builder;
}
};
const usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256'];
for (const model of usedModels) {
styles[model] = {
get() {
const {
level
} = this;
return function (...arguments_) {
const styler = createStyler(ansiStyles$1.color[levelMapping[level]][model](...arguments_), ansiStyles$1.color.close, this._styler);
return createBuilder(this, styler, this._isEmpty);
};
}
};
}
for (const model of usedModels) {
const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
styles[bgModel] = {
get() {
const {
level
} = this;
return function (...arguments_) {
const styler = createStyler(ansiStyles$1.bgColor[levelMapping[level]][model](...arguments_), ansiStyles$1.bgColor.close, this._styler);
return createBuilder(this, styler, this._isEmpty);
};
}
};
}
const proto = Object.defineProperties(() => {}, Object.assign({}, styles, {
level: {
enumerable: true,
get() {
return this._generator.level;
},
set(level) {
this._generator.level = level;
}
}
}));
const createStyler = (open, close, parent) => {
let openAll;
let closeAll;
if (parent === undefined) {
openAll = open;
closeAll = close;
} else {
openAll = parent.openAll + open;
closeAll = close + parent.closeAll;
}
return {
open,
close,
openAll,
closeAll,
parent
};
};
const createBuilder = (self, _styler, _isEmpty) => {
const builder = (...arguments_) => {
// Single argument is hot path, implicit coercion is faster than anything
// eslint-disable-next-line no-implicit-coercion
return applyStyle(builder, arguments_.length === 1 ? '' + arguments_[0] : arguments_.join(' '));
}; // We alter the prototype because we must return a function, but there is
// no way to create a function with a different prototype
Object.setPrototypeOf(builder, proto);
builder._generator = self;
builder._styler = _styler;
builder._isEmpty = _isEmpty;
return builder;
};
const applyStyle = (self, string) => {
if (self.level <= 0 || !string) {
return self._isEmpty ? '' : string;
}
let styler = self._styler;
if (styler === undefined) {
return string;
}
const {
openAll,
closeAll
} = styler;
if (string.indexOf('\u001B') !== -1) {
while (styler !== undefined) {
// Replace any instances already present with a re-opening code
// otherwise only the part of the string until said closing code
// will be colored, and the rest will simply be 'plain'.
string = stringReplaceAll$1(string, styler.close, styler.open);
styler = styler.parent;
}
} // We can move both next actions out of loop, because remaining actions in loop won't have
// any/visible effect on parts we add here. Close the styling before a linebreak and reopen
// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92
const lfIndex = string.indexOf('\n');
if (lfIndex !== -1) {
string = stringEncaseCRLFWithFirstIndex$1(string, closeAll, openAll, lfIndex);
}
return openAll + string + closeAll;
};
let template;
const chalkTag = (chalk, ...strings) => {
const [firstString] = strings;
if (!Array.isArray(firstString)) {
// If chalk() was called by itself or with a string,
// return the string itself as a string.
return strings.join(' ');
}
const arguments_ = strings.slice(1);
const parts = [firstString.raw[0]];
for (let i = 1; i < firstString.length; i++) {
parts.push(String(arguments_[i - 1]).replace(/[{}\\]/g, '\\$&'), String(firstString.raw[i]));
}
if (template === undefined) {
template = templates$1;
}
return template(chalk, parts.join(''));
};
Object.defineProperties(Chalk.prototype, styles);
const chalk$1 = Chalk(); // eslint-disable-line new-cap
chalk$1.supportsColor = stdoutColor;
chalk$1.stderr = Chalk({
level: stderrColor ? stderrColor.level : 0
}); // eslint-disable-line new-cap
chalk$1.stderr.supportsColor = stderrColor;
var source = chalk$1;
const cliDescriptor = {
key: _key => _key.length === 1 ? "-".concat(_key) : "--".concat(_key),
value: _value => lib.apiDescriptor.value(_value),
pair: ({
key,
value
}) => value === false ? "--no-".concat(key) : value === true ? cliDescriptor.key(key) : value === "" ? "".concat(cliDescriptor.key(key), " without an argument") : "".concat(cliDescriptor.key(key), "=").concat(value)
};
class FlagSchema extends lib.ChoiceSchema {
constructor({
name,
flags
}) {
super({
name,
choices: flags
});
this._flags = flags.slice().sort();
}
preprocess(value, utils) {
if (typeof value === "string" && value.length !== 0 && !this._flags.includes(value)) {
const suggestion = this._flags.find(flag => leven_1$1(flag, value) < 3);
if (suggestion) {
utils.logger.warn(["Unknown flag ".concat(source.yellow(utils.descriptor.value(value)), ","), "did you mean ".concat(source.blue(utils.descriptor.value(suggestion)), "?")].join(" "));
return suggestion;
}
}
return value;
}
expected() {
return "a flag";
}
}
let hasDeprecationWarned;
function normalizeOptions(options, optionInfos, {
logger,
isCLI = false,
passThrough = false
} = {}) {
const unknown = !passThrough ? lib.levenUnknownHandler : Array.isArray(passThrough) ? (key, value) => !passThrough.includes(key) ? undefined : {
[key]: value
} : (key, value) => ({
[key]: value
});
const descriptor = isCLI ? cliDescriptor : lib.apiDescriptor;
const schemas = optionInfosToSchemas(optionInfos, {
isCLI
});
const normalizer = new lib.Normalizer(schemas, {
logger,
unknown,
descriptor
});
const shouldSuppressDuplicateDeprecationWarnings = logger !== false;
if (shouldSuppressDuplicateDeprecationWarnings && hasDeprecationWarned) {
normalizer._hasDeprecationWarned = hasDeprecationWarned;
}
const normalized = normalizer.normalize(options);
if (shouldSuppressDuplicateDeprecationWarnings) {
hasDeprecationWarned = normalizer._hasDeprecationWarned;
}
return normalized;
}
function optionInfosToSchemas(optionInfos, {
isCLI
}) {
const schemas = [];
if (isCLI) {
schemas.push(lib.AnySchema.create({
name: "_"
}));
}
for (const optionInfo of optionInfos) {
schemas.push(optionInfoToSchema(optionInfo, {
isCLI,
optionInfos
}));
if (optionInfo.alias && isCLI) {
schemas.push(lib.AliasSchema.create({
name: optionInfo.alias,
sourceName: optionInfo.name
}));
}
}
return schemas;
}
function optionInfoToSchema(optionInfo, {
isCLI,
optionInfos
}) {
let SchemaConstructor;
const parameters = {
name: optionInfo.name
};
const handlers = {};
switch (optionInfo.type) {
case "int":
SchemaConstructor = lib.IntegerSchema;
if (isCLI) {
parameters.preprocess = value => Number(value);
}
break;
case "string":
SchemaConstructor = lib.StringSchema;
break;
case "choice":
SchemaConstructor = lib.ChoiceSchema;
parameters.choices = optionInfo.choices.map(choiceInfo => typeof choiceInfo === "object" && choiceInfo.redirect ? Object.assign({}, choiceInfo, {
redirect: {
to: {
key: optionInfo.name,
value: choiceInfo.redirect
}
}
}) : choiceInfo);
break;
case "boolean":
SchemaConstructor = lib.BooleanSchema;
break;
case "flag":
SchemaConstructor = FlagSchema;
parameters.flags = optionInfos.map(optionInfo => [].concat(optionInfo.alias || [], optionInfo.description ? optionInfo.name : [], optionInfo.oppositeDescription ? "no-".concat(optionInfo.name) : [])).reduce((a, b) => a.concat(b), []);
break;
case "path":
SchemaConstructor = lib.StringSchema;
break;
default:
throw new Error("Unexpected type ".concat(optionInfo.type));
}
if (optionInfo.exception) {
parameters.validate = (value, schema, utils) => {
return optionInfo.exception(value) || schema.validate(value, utils);
};
} else {
parameters.validate = (value, schema, utils) => {
return value === undefined || schema.validate(value, utils);
};
}
if (optionInfo.redirect) {
handlers.redirect = value => !value ? undefined : {
to: {
key: optionInfo.redirect.option,
value: optionInfo.redirect.value
}
};
}
if (optionInfo.deprecated) {
handlers.deprecated = true;
} // allow CLI overriding, e.g., prettier package.json --tab-width 1 --tab-width 2
if (isCLI && !optionInfo.array) {
const originalPreprocess = parameters.preprocess || (x => x);
parameters.preprocess = (value, schema, utils) => schema.preprocess(originalPreprocess(Array.isArray(value) ? value[value.length - 1] : value), utils);
}
return optionInfo.array ? lib.ArraySchema.create(Object.assign({}, isCLI ? {
preprocess: v => [].concat(v)
} : {}, {}, handlers, {
valueSchema: SchemaConstructor.create(parameters)
})) : SchemaConstructor.create(Object.assign({}, parameters, {}, handlers));
}
function normalizeApiOptions(options, optionInfos, opts) {
return normalizeOptions(options, optionInfos, opts);
}
function normalizeCliOptions(options, optionInfos, opts) {
return normalizeOptions(options, optionInfos, Object.assign({
isCLI: true
}, opts));
}
var optionsNormalizer = {
normalizeApiOptions,
normalizeCliOptions
};
var getLast = arr => arr[arr.length - 1];
function locStart(node, opts) {
opts = opts || {}; // Handle nodes with decorators. They should start at the first decorator
if (!opts.ignoreDecorators && node.declaration && node.declaration.decorators && node.declaration.decorators.length > 0) {
return locStart(node.declaration.decorators[0]);
}
if (!opts.ignoreDecorators && node.decorators && node.decorators.length > 0) {
return locStart(node.decorators[0]);
}
if (node.__location) {
return node.__location.startOffset;
}
if (node.range) {
return node.range[0];
}
if (typeof node.start === "number") {
return node.start;
}
if (node.loc) {
return node.loc.start;
}
return null;
}
function locEnd(node) {
const endNode = node.nodes && getLast(node.nodes);
if (endNode && node.source && !node.source.end) {
node = endNode;
}
if (node.__location) {
return node.__location.endOffset;
}
const loc = node.range ? node.range[1] : typeof node.end === "number" ? node.end : null;
if (node.typeAnnotation) {
return Math.max(loc, locEnd(node.typeAnnotation));
}
if (node.loc && !loc) {
return node.loc.end;
}
return loc;
}
function composeLoc(startNode, endNodeOrLength = startNode) {
const length = typeof endNodeOrLength === "number" ? endNodeOrLength : -1;
const start = locStart(startNode);
const end = length !== -1 ? start + length : locEnd(endNodeOrLength);
const startLoc = startNode.loc.start;
return {
start,
end,
range: [start, end],
loc: {
start: startLoc,
end: length !== -1 ? {
line: startLoc.line,
column: startLoc.column + length
} : endNodeOrLength.loc.end
}
};
}
var loc = {
locStart,
locEnd,
composeLoc
};
var jsTokens = createCommonjsModule(function (module, exports) {
// Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell
// License: MIT. (See LICENSE.)
Object.defineProperty(exports, "__esModule", {
value: true
}); // This regex comes from regex.coffee, and is inserted here by generate-index.js
// (run `npm run build`).
exports.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g;
exports.matchToToken = function (match) {
var token = {
type: "invalid",
value: match[0],
closed: undefined
};
if (match[1]) token.type = "string", token.closed = !!(match[3] || match[4]);else if (match[5]) token.type = "comment";else if (match[6]) token.type = "comment", token.closed = !!match[7];else if (match[8]) token.type = "regex";else if (match[9]) token.type = "number";else if (match[10]) token.type = "name";else if (match[11]) token.type = "punctuator";else if (match[12]) token.type = "whitespace";
return token;
};
});
unwrapExports(jsTokens);
var jsTokens_1 = jsTokens.matchToToken;
var ast = createCommonjsModule(function (module) {
/*
Copyright (C) 2013 Yusuke Suzuki
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function () {
function isExpression(node) {
if (node == null) {
return false;
}
switch (node.type) {
case 'ArrayExpression':
case 'AssignmentExpression':
case 'BinaryExpression':
case 'CallExpression':
case 'ConditionalExpression':
case 'FunctionExpression':
case 'Identifier':
case 'Literal':
case 'LogicalExpression':
case 'MemberExpression':
case 'NewExpression':
case 'ObjectExpression':
case 'SequenceExpression':
case 'ThisExpression':
case 'UnaryExpression':
case 'UpdateExpression':
return true;
}
return false;
}
function isIterationStatement(node) {
if (node == null) {
return false;
}
switch (node.type) {
case 'DoWhileStatement':
case 'ForInStatement':
case 'ForStatement':
case 'WhileStatement':
return true;
}
return false;
}
function isStatement(node) {
if (node == null) {
return false;
}
switch (node.type) {
case 'BlockStatement':
case 'BreakStatement':
case 'ContinueStatement':
case 'DebuggerStatement':
case 'DoWhileStatement':
case 'EmptyStatement':
case 'ExpressionStatement':
case 'ForInStatement':
case 'ForStatement':
case 'IfStatement':
case 'LabeledStatement':
case 'ReturnStatement':
case 'SwitchStatement':
case 'ThrowStatement':
case 'TryStatement':
case 'VariableDeclaration':
case 'WhileStatement':
case 'WithStatement':
return true;
}
return false;
}
function isSourceElement(node) {
return isStatement(node) || node != null && node.type === 'FunctionDeclaration';
}
function trailingStatement(node) {
switch (node.type) {
case 'IfStatement':
if (node.alternate != null) {
return node.alternate;
}
return node.consequent;
case 'LabeledStatement':
case 'ForStatement':
case 'ForInStatement':
case 'WhileStatement':
case 'WithStatement':
return node.body;
}
return null;
}
function isProblematicIfStatement(node) {
var current;
if (node.type !== 'IfStatement') {
return false;
}
if (node.alternate == null) {
return false;
}
current = node.consequent;
do {
if (current.type === 'IfStatement') {
if (current.alternate == null) {
return true;
}
}
current = trailingStatement(current);
} while (current);
return false;
}
module.exports = {
isExpression: isExpression,
isStatement: isStatement,
isIterationStatement: isIterationStatement,
isSourceElement: isSourceElement,
isProblematicIfStatement: isProblematicIfStatement,
trailingStatement: trailingStatement
};
})();
/* vim: set sw=4 ts=4 et tw=80 : */
});
var ast_1 = ast.isExpression;
var ast_2 = ast.isStatement;
var ast_3 = ast.isIterationStatement;
var ast_4 = ast.isSourceElement;
var ast_5 = ast.isProblematicIfStatement;
var ast_6 = ast.trailingStatement;
var code = createCommonjsModule(function (module) {
/*
Copyright (C) 2013-2014 Yusuke Suzuki
Copyright (C) 2014 Ivan Nikulin
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function () {
var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch; // See `tools/generate-identifier-regex.js`.
ES5Regex = {
// ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierStart:
NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,
// ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierPart:
NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/
};
ES6Regex = {
// ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierStart:
NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
// ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierPart:
NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
};
function isDecimalDigit(ch) {
return 0x30 <= ch && ch <= 0x39; // 0..9
}
function isHexDigit(ch) {
return 0x30 <= ch && ch <= 0x39 || // 0..9
0x61 <= ch && ch <= 0x66 || // a..f
0x41 <= ch && ch <= 0x46; // A..F
}
function isOctalDigit(ch) {
return ch >= 0x30 && ch <= 0x37; // 0..7
} // 7.2 White Space
NON_ASCII_WHITESPACES = [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF];
function isWhiteSpace(ch) {
return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0;
} // 7.3 Line Terminators
function isLineTerminator(ch) {
return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;
} // 7.6 Identifier Names and Identifiers
function fromCodePoint(cp) {
if (cp <= 0xFFFF) {
return String.fromCharCode(cp);
}
var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800);
var cu2 = String.fromCharCode((cp - 0x10000) % 0x400 + 0xDC00);
return cu1 + cu2;
}
IDENTIFIER_START = new Array(0x80);
for (ch = 0; ch < 0x80; ++ch) {
IDENTIFIER_START[ch] = ch >= 0x61 && ch <= 0x7A || // a..z
ch >= 0x41 && ch <= 0x5A || // A..Z
ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
}
IDENTIFIER_PART = new Array(0x80);
for (ch = 0; ch < 0x80; ++ch) {
IDENTIFIER_PART[ch] = ch >= 0x61 && ch <= 0x7A || // a..z
ch >= 0x41 && ch <= 0x5A || // A..Z
ch >= 0x30 && ch <= 0x39 || // 0..9
ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
}
function isIdentifierStartES5(ch) {
return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
}
function isIdentifierPartES5(ch) {
return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
}
function isIdentifierStartES6(ch) {
return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
}
function isIdentifierPartES6(ch) {
return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
}
module.exports = {
isDecimalDigit: isDecimalDigit,
isHexDigit: isHexDigit,
isOctalDigit: isOctalDigit,
isWhiteSpace: isWhiteSpace,
isLineTerminator: isLineTerminator,
isIdentifierStartES5: isIdentifierStartES5,
isIdentifierPartES5: isIdentifierPartES5,
isIdentifierStartES6: isIdentifierStartES6,
isIdentifierPartES6: isIdentifierPartES6
};
})();
/* vim: set sw=4 ts=4 et tw=80 : */
});
var code_1 = code.isDecimalDigit;
var code_2 = code.isHexDigit;
var code_3 = code.isOctalDigit;
var code_4 = code.isWhiteSpace;
var code_5 = code.isLineTerminator;
var code_6 = code.isIdentifierStartES5;
var code_7 = code.isIdentifierPartES5;
var code_8 = code.isIdentifierStartES6;
var code_9 = code.isIdentifierPartES6;
var keyword = createCommonjsModule(function (module) {
/*
Copyright (C) 2013 Yusuke Suzuki
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function () {
var code$1 = code;
function isStrictModeReservedWordES6(id) {
switch (id) {
case 'implements':
case 'interface':
case 'package':
case 'private':
case 'protected':
case 'public':
case 'static':
case 'let':
return true;
default:
return false;
}
}
function isKeywordES5(id, strict) {
// yield should not be treated as keyword under non-strict mode.
if (!strict && id === 'yield') {
return false;
}
return isKeywordES6(id, strict);
}
function isKeywordES6(id, strict) {
if (strict && isStrictModeReservedWordES6(id)) {
return true;
}
switch (id.length) {
case 2:
return id === 'if' || id === 'in' || id === 'do';
case 3:
return id === 'var' || id === 'for' || id === 'new' || id === 'try';
case 4:
return id === 'this' || id === 'else' || id === 'case' || id === 'void' || id === 'with' || id === 'enum';
case 5:
return id === 'while' || id === 'break' || id === 'catch' || id === 'throw' || id === 'const' || id === 'yield' || id === 'class' || id === 'super';
case 6:
return id === 'return' || id === 'typeof' || id === 'delete' || id === 'switch' || id === 'export' || id === 'import';
case 7:
return id === 'default' || id === 'finally' || id === 'extends';
case 8:
return id === 'function' || id === 'continue' || id === 'debugger';
case 10:
return id === 'instanceof';
default:
return false;
}
}
function isReservedWordES5(id, strict) {
return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict);
}
function isReservedWordES6(id, strict) {
return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict);
}
function isRestrictedWord(id) {
return id === 'eval' || id === 'arguments';
}
function isIdentifierNameES5(id) {
var i, iz, ch;
if (id.length === 0) {
return false;
}
ch = id.charCodeAt(0);
if (!code$1.isIdentifierStartES5(ch)) {
return false;
}
for (i = 1, iz = id.length; i < iz; ++i) {
ch = id.charCodeAt(i);
if (!code$1.isIdentifierPartES5(ch)) {
return false;
}
}
return true;
}
function decodeUtf16(lead, trail) {
return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
}
function isIdentifierNameES6(id) {
var i, iz, ch, lowCh, check;
if (id.length === 0) {
return false;
}
check = code$1.isIdentifierStartES6;
for (i = 0, iz = id.length; i < iz; ++i) {
ch = id.charCodeAt(i);
if (0xD800 <= ch && ch <= 0xDBFF) {
++i;
if (i >= iz) {
return false;
}
lowCh = id.charCodeAt(i);
if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) {
return false;
}
ch = decodeUtf16(ch, lowCh);
}
if (!check(ch)) {
return false;
}
check = code$1.isIdentifierPartES6;
}
return true;
}
function isIdentifierES5(id, strict) {
return isIdentifierNameES5(id) && !isReservedWordES5(id, strict);
}
function isIdentifierES6(id, strict) {
return isIdentifierNameES6(id) && !isReservedWordES6(id, strict);
}
module.exports = {
isKeywordES5: isKeywordES5,
isKeywordES6: isKeywordES6,
isReservedWordES5: isReservedWordES5,
isReservedWordES6: isReservedWordES6,
isRestrictedWord: isRestrictedWord,
isIdentifierNameES5: isIdentifierNameES5,
isIdentifierNameES6: isIdentifierNameES6,
isIdentifierES5: isIdentifierES5,
isIdentifierES6: isIdentifierES6
};
})();
/* vim: set sw=4 ts=4 et tw=80 : */
});
var keyword_1 = keyword.isKeywordES5;
var keyword_2 = keyword.isKeywordES6;
var keyword_3 = keyword.isReservedWordES5;
var keyword_4 = keyword.isReservedWordES6;
var keyword_5 = keyword.isRestrictedWord;
var keyword_6 = keyword.isIdentifierNameES5;
var keyword_7 = keyword.isIdentifierNameES6;
var keyword_8 = keyword.isIdentifierES5;
var keyword_9 = keyword.isIdentifierES6;
var utils$1 = createCommonjsModule(function (module, exports) {
/*
Copyright (C) 2013 Yusuke Suzuki
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function () {
exports.ast = ast;
exports.code = code;
exports.keyword = keyword;
})();
/* vim: set sw=4 ts=4 et tw=80 : */
});
var utils_1$1 = utils$1.ast;
var utils_2$1 = utils$1.code;
var utils_3$1 = utils$1.keyword;
var matchOperatorsRe$1 = /[|\\{}()[\]^$+*?.]/g;
var escapeStringRegexp$1 = function escapeStringRegexp(str) {
if (typeof str !== 'string') {
throw new TypeError('Expected a string');
}
return str.replace(matchOperatorsRe$1, '\\$&');
};
var colorName$2 = {
"aliceblue": [240, 248, 255],
"antiquewhite": [250, 235, 215],
"aqua": [0, 255, 255],
"aquamarine": [127, 255, 212],
"azure": [240, 255, 255],
"beige": [245, 245, 220],
"bisque": [255, 228, 196],
"black": [0, 0, 0],
"blanchedalmond": [255, 235, 205],
"blue": [0, 0, 255],
"blueviolet": [138, 43, 226],
"brown": [165, 42, 42],
"burlywood": [222, 184, 135],
"cadetblue": [95, 158, 160],
"chartreuse": [127, 255, 0],
"chocolate": [210, 105, 30],
"coral": [255, 127, 80],
"cornflowerblue": [100, 149, 237],
"cornsilk": [255, 248, 220],
"crimson": [220, 20, 60],
"cyan": [0, 255, 255],
"darkblue": [0, 0, 139],
"darkcyan": [0, 139, 139],
"darkgoldenrod": [184, 134, 11],
"darkgray": [169, 169, 169],
"darkgreen": [0, 100, 0],
"darkgrey": [169, 169, 169],
"darkkhaki": [189, 183, 107],
"darkmagenta": [139, 0, 139],
"darkolivegreen": [85, 107, 47],
"darkorange": [255, 140, 0],
"darkorchid": [153, 50, 204],
"darkred": [139, 0, 0],
"darksalmon": [233, 150, 122],
"darkseagreen": [143, 188, 143],
"darkslateblue": [72, 61, 139],
"darkslategray": [47, 79, 79],
"darkslategrey": [47, 79, 79],
"darkturquoise": [0, 206, 209],
"darkviolet": [148, 0, 211],
"deeppink": [255, 20, 147],
"deepskyblue": [0, 191, 255],
"dimgray": [105, 105, 105],
"dimgrey": [105, 105, 105],
"dodgerblue": [30, 144, 255],
"firebrick": [178, 34, 34],
"floralwhite": [255, 250, 240],
"forestgreen": [34, 139, 34],
"fuchsia": [255, 0, 255],
"gainsboro": [220, 220, 220],
"ghostwhite": [248, 248, 255],
"gold": [255, 215, 0],
"goldenrod": [218, 165, 32],
"gray": [128, 128, 128],
"green": [0, 128, 0],
"greenyellow": [173, 255, 47],
"grey": [128, 128, 128],
"honeydew": [240, 255, 240],
"hotpink": [255, 105, 180],
"indianred": [205, 92, 92],
"indigo": [75, 0, 130],
"ivory": [255, 255, 240],
"khaki": [240, 230, 140],
"lavender": [230, 230, 250],
"lavenderblush": [255, 240, 245],
"lawngreen": [124, 252, 0],
"lemonchiffon": [255, 250, 205],
"lightblue": [173, 216, 230],
"lightcoral": [240, 128, 128],
"lightcyan": [224, 255, 255],
"lightgoldenrodyellow": [250, 250, 210],
"lightgray": [211, 211, 211],
"lightgreen": [144, 238, 144],
"lightgrey": [211, 211, 211],
"lightpink": [255, 182, 193],
"lightsalmon": [255, 160, 122],
"lightseagreen": [32, 178, 170],
"lightskyblue": [135, 206, 250],
"lightslategray": [119, 136, 153],
"lightslategrey": [119, 136, 153],
"lightsteelblue": [176, 196, 222],
"lightyellow": [255, 255, 224],
"lime": [0, 255, 0],
"limegreen": [50, 205, 50],
"linen": [250, 240, 230],
"magenta": [255, 0, 255],
"maroon": [128, 0, 0],
"mediumaquamarine": [102, 205, 170],
"mediumblue": [0, 0, 205],
"mediumorchid": [186, 85, 211],
"mediumpurple": [147, 112, 219],
"mediumseagreen": [60, 179, 113],
"mediumslateblue": [123, 104, 238],
"mediumspringgreen": [0, 250, 154],
"mediumturquoise": [72, 209, 204],
"mediumvioletred": [199, 21, 133],
"midnightblue": [25, 25, 112],
"mintcream": [245, 255, 250],
"mistyrose": [255, 228, 225],
"moccasin": [255, 228, 181],
"navajowhite": [255, 222, 173],
"navy": [0, 0, 128],
"oldlace": [253, 245, 230],
"olive": [128, 128, 0],
"olivedrab": [107, 142, 35],
"orange": [255, 165, 0],
"orangered": [255, 69, 0],
"orchid": [218, 112, 214],
"palegoldenrod": [238, 232, 170],
"palegreen": [152, 251, 152],
"paleturquoise": [175, 238, 238],
"palevioletred": [219, 112, 147],
"papayawhip": [255, 239, 213],
"peachpuff": [255, 218, 185],
"peru": [205, 133, 63],
"pink": [255, 192, 203],
"plum": [221, 160, 221],
"powderblue": [176, 224, 230],
"purple": [128, 0, 128],
"rebeccapurple": [102, 51, 153],
"red": [255, 0, 0],
"rosybrown": [188, 143, 143],
"royalblue": [65, 105, 225],
"saddlebrown": [139, 69, 19],
"salmon": [250, 128, 114],
"sandybrown": [244, 164, 96],
"seagreen": [46, 139, 87],
"seashell": [255, 245, 238],
"sienna": [160, 82, 45],
"silver": [192, 192, 192],
"skyblue": [135, 206, 235],
"slateblue": [106, 90, 205],
"slategray": [112, 128, 144],
"slategrey": [112, 128, 144],
"snow": [255, 250, 250],
"springgreen": [0, 255, 127],
"steelblue": [70, 130, 180],
"tan": [210, 180, 140],
"teal": [0, 128, 128],
"thistle": [216, 191, 216],
"tomato": [255, 99, 71],
"turquoise": [64, 224, 208],
"violet": [238, 130, 238],
"wheat": [245, 222, 179],
"white": [255, 255, 255],
"whitesmoke": [245, 245, 245],
"yellow": [255, 255, 0],
"yellowgreen": [154, 205, 50]
};
var conversions$2 = createCommonjsModule(function (module) {
/* MIT license */
// NOTE: conversions should only return primitive values (i.e. arrays, or
// values that give correct `typeof` results).
// do not use box values types (i.e. Number(), String(), etc.)
var reverseKeywords = {};
for (var key in colorName$2) {
if (colorName$2.hasOwnProperty(key)) {
reverseKeywords[colorName$2[key]] = key;
}
}
var convert = module.exports = {
rgb: {
channels: 3,
labels: 'rgb'
},
hsl: {
channels: 3,
labels: 'hsl'
},
hsv: {
channels: 3,
labels: 'hsv'
},
hwb: {
channels: 3,
labels: 'hwb'
},
cmyk: {
channels: 4,
labels: 'cmyk'
},
xyz: {
channels: 3,
labels: 'xyz'
},
lab: {
channels: 3,
labels: 'lab'
},
lch: {
channels: 3,
labels: 'lch'
},
hex: {
channels: 1,
labels: ['hex']
},
keyword: {
channels: 1,
labels: ['keyword']
},
ansi16: {
channels: 1,
labels: ['ansi16']
},
ansi256: {
channels: 1,
labels: ['ansi256']
},
hcg: {
channels: 3,
labels: ['h', 'c', 'g']
},
apple: {
channels: 3,
labels: ['r16', 'g16', 'b16']
},
gray: {
channels: 1,
labels: ['gray']
}
}; // hide .channels and .labels properties
for (var model in convert) {
if (convert.hasOwnProperty(model)) {
if (!('channels' in convert[model])) {
throw new Error('missing channels property: ' + model);
}
if (!('labels' in convert[model])) {
throw new Error('missing channel labels property: ' + model);
}
if (convert[model].labels.length !== convert[model].channels) {
throw new Error('channel and label counts mismatch: ' + model);
}
var channels = convert[model].channels;
var labels = convert[model].labels;
delete convert[model].channels;
delete convert[model].labels;
Object.defineProperty(convert[model], 'channels', {
value: channels
});
Object.defineProperty(convert[model], 'labels', {
value: labels
});
}
}
convert.rgb.hsl = function (rgb) {
var r = rgb[0] / 255;
var g = rgb[1] / 255;
var b = rgb[2] / 255;
var min = Math.min(r, g, b);
var max = Math.max(r, g, b);
var delta = max - min;
var h;
var s;
var l;
if (max === min) {
h = 0;
} else if (r === max) {
h = (g - b) / delta;
} else if (g === max) {
h = 2 + (b - r) / delta;
} else if (b === max) {
h = 4 + (r - g) / delta;
}
h = Math.min(h * 60, 360);
if (h < 0) {
h += 360;
}
l = (min + max) / 2;
if (max === min) {
s = 0;
} else if (l <= 0.5) {
s = delta / (max + min);
} else {
s = delta / (2 - max - min);
}
return [h, s * 100, l * 100];
};
convert.rgb.hsv = function (rgb) {
var rdif;
var gdif;
var bdif;
var h;
var s;
var r = rgb[0] / 255;
var g = rgb[1] / 255;
var b = rgb[2] / 255;
var v = Math.max(r, g, b);
var diff = v - Math.min(r, g, b);
var diffc = function diffc(c) {
return (v - c) / 6 / diff + 1 / 2;
};
if (diff === 0) {
h = s = 0;
} else {
s = diff / v;
rdif = diffc(r);
gdif = diffc(g);
bdif = diffc(b);
if (r === v) {
h = bdif - gdif;
} else if (g === v) {
h = 1 / 3 + rdif - bdif;
} else if (b === v) {
h = 2 / 3 + gdif - rdif;
}
if (h < 0) {
h += 1;
} else if (h > 1) {
h -= 1;
}
}
return [h * 360, s * 100, v * 100];
};
convert.rgb.hwb = function (rgb) {
var r = rgb[0];
var g = rgb[1];
var b = rgb[2];
var h = convert.rgb.hsl(rgb)[0];
var w = 1 / 255 * Math.min(r, Math.min(g, b));
b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
return [h, w * 100, b * 100];
};
convert.rgb.cmyk = function (rgb) {
var r = rgb[0] / 255;
var g = rgb[1] / 255;
var b = rgb[2] / 255;
var c;
var m;
var y;
var k;
k = Math.min(1 - r, 1 - g, 1 - b);
c = (1 - r - k) / (1 - k) || 0;
m = (1 - g - k) / (1 - k) || 0;
y = (1 - b - k) / (1 - k) || 0;
return [c * 100, m * 100, y * 100, k * 100];
};
/**
* See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
* */
function comparativeDistance(x, y) {
return Math.pow(x[0] - y[0], 2) + Math.pow(x[1] - y[1], 2) + Math.pow(x[2] - y[2], 2);
}
convert.rgb.keyword = function (rgb) {
var reversed = reverseKeywords[rgb];
if (reversed) {
return reversed;
}
var currentClosestDistance = Infinity;
var currentClosestKeyword;
for (var keyword in colorName$2) {
if (colorName$2.hasOwnProperty(keyword)) {
var value = colorName$2[keyword]; // Compute comparative distance
var distance = comparativeDistance(rgb, value); // Check if its less, if so set as closest
if (distance < currentClosestDistance) {
currentClosestDistance = distance;
currentClosestKeyword = keyword;
}
}
}
return currentClosestKeyword;
};
convert.keyword.rgb = function (keyword) {
return colorName$2[keyword];
};
convert.rgb.xyz = function (rgb) {
var r = rgb[0] / 255;
var g = rgb[1] / 255;
var b = rgb[2] / 255; // assume sRGB
r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
var x = r * 0.4124 + g * 0.3576 + b * 0.1805;
var y = r * 0.2126 + g * 0.7152 + b * 0.0722;
var z = r * 0.0193 + g * 0.1192 + b * 0.9505;
return [x * 100, y * 100, z * 100];
};
convert.rgb.lab = function (rgb) {
var xyz = convert.rgb.xyz(rgb);
var x = xyz[0];
var y = xyz[1];
var z = xyz[2];
var l;
var a;
var b;
x /= 95.047;
y /= 100;
z /= 108.883;
x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;
y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;
z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;
l = 116 * y - 16;
a = 500 * (x - y);
b = 200 * (y - z);
return [l, a, b];
};
convert.hsl.rgb = function (hsl) {
var h = hsl[0] / 360;
var s = hsl[1] / 100;
var l = hsl[2] / 100;
var t1;
var t2;
var t3;
var rgb;
var val;
if (s === 0) {
val = l * 255;
return [val, val, val];
}
if (l < 0.5) {
t2 = l * (1 + s);
} else {
t2 = l + s - l * s;
}
t1 = 2 * l - t2;
rgb = [0, 0, 0];
for (var i = 0; i < 3; i++) {
t3 = h + 1 / 3 * -(i - 1);
if (t3 < 0) {
t3++;
}
if (t3 > 1) {
t3--;
}
if (6 * t3 < 1) {
val = t1 + (t2 - t1) * 6 * t3;
} else if (2 * t3 < 1) {
val = t2;
} else if (3 * t3 < 2) {
val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
} else {
val = t1;
}
rgb[i] = val * 255;
}
return rgb;
};
convert.hsl.hsv = function (hsl) {
var h = hsl[0];
var s = hsl[1] / 100;
var l = hsl[2] / 100;
var smin = s;
var lmin = Math.max(l, 0.01);
var sv;
var v;
l *= 2;
s *= l <= 1 ? l : 2 - l;
smin *= lmin <= 1 ? lmin : 2 - lmin;
v = (l + s) / 2;
sv = l === 0 ? 2 * smin / (lmin + smin) : 2 * s / (l + s);
return [h, sv * 100, v * 100];
};
convert.hsv.rgb = function (hsv) {
var h = hsv[0] / 60;
var s = hsv[1] / 100;
var v = hsv[2] / 100;
var hi = Math.floor(h) % 6;
var f = h - Math.floor(h);
var p = 255 * v * (1 - s);
var q = 255 * v * (1 - s * f);
var t = 255 * v * (1 - s * (1 - f));
v *= 255;
switch (hi) {
case 0:
return [v, t, p];
case 1:
return [q, v, p];
case 2:
return [p, v, t];
case 3:
return [p, q, v];
case 4:
return [t, p, v];
case 5:
return [v, p, q];
}
};
convert.hsv.hsl = function (hsv) {
var h = hsv[0];
var s = hsv[1] / 100;
var v = hsv[2] / 100;
var vmin = Math.max(v, 0.01);
var lmin;
var sl;
var l;
l = (2 - s) * v;
lmin = (2 - s) * vmin;
sl = s * vmin;
sl /= lmin <= 1 ? lmin : 2 - lmin;
sl = sl || 0;
l /= 2;
return [h, sl * 100, l * 100];
}; // http://dev.w3.org/csswg/css-color/#hwb-to-rgb
convert.hwb.rgb = function (hwb) {
var h = hwb[0] / 360;
var wh = hwb[1] / 100;
var bl = hwb[2] / 100;
var ratio = wh + bl;
var i;
var v;
var f;
var n; // wh + bl cant be > 1
if (ratio > 1) {
wh /= ratio;
bl /= ratio;
}
i = Math.floor(6 * h);
v = 1 - bl;
f = 6 * h - i;
if ((i & 0x01) !== 0) {
f = 1 - f;
}
n = wh + f * (v - wh); // linear interpolation
var r;
var g;
var b;
switch (i) {
default:
case 6:
case 0:
r = v;
g = n;
b = wh;
break;
case 1:
r = n;
g = v;
b = wh;
break;
case 2:
r = wh;
g = v;
b = n;
break;
case 3:
r = wh;
g = n;
b = v;
break;
case 4:
r = n;
g = wh;
b = v;
break;
case 5:
r = v;
g = wh;
b = n;
break;
}
return [r * 255, g * 255, b * 255];
};
convert.cmyk.rgb = function (cmyk) {
var c = cmyk[0] / 100;
var m = cmyk[1] / 100;
var y = cmyk[2] / 100;
var k = cmyk[3] / 100;
var r;
var g;
var b;
r = 1 - Math.min(1, c * (1 - k) + k);
g = 1 - Math.min(1, m * (1 - k) + k);
b = 1 - Math.min(1, y * (1 - k) + k);
return [r * 255, g * 255, b * 255];
};
convert.xyz.rgb = function (xyz) {
var x = xyz[0] / 100;
var y = xyz[1] / 100;
var z = xyz[2] / 100;
var r;
var g;
var b;
r = x * 3.2406 + y * -1.5372 + z * -0.4986;
g = x * -0.9689 + y * 1.8758 + z * 0.0415;
b = x * 0.0557 + y * -0.2040 + z * 1.0570; // assume sRGB
r = r > 0.0031308 ? 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055 : r * 12.92;
g = g > 0.0031308 ? 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055 : g * 12.92;
b = b > 0.0031308 ? 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055 : b * 12.92;
r = Math.min(Math.max(0, r), 1);
g = Math.min(Math.max(0, g), 1);
b = Math.min(Math.max(0, b), 1);
return [r * 255, g * 255, b * 255];
};
convert.xyz.lab = function (xyz) {
var x = xyz[0];
var y = xyz[1];
var z = xyz[2];
var l;
var a;
var b;
x /= 95.047;
y /= 100;
z /= 108.883;
x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;
y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;
z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;
l = 116 * y - 16;
a = 500 * (x - y);
b = 200 * (y - z);
return [l, a, b];
};
convert.lab.xyz = function (lab) {
var l = lab[0];
var a = lab[1];
var b = lab[2];
var x;
var y;
var z;
y = (l + 16) / 116;
x = a / 500 + y;
z = y - b / 200;
var y2 = Math.pow(y, 3);
var x2 = Math.pow(x, 3);
var z2 = Math.pow(z, 3);
y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
x *= 95.047;
y *= 100;
z *= 108.883;
return [x, y, z];
};
convert.lab.lch = function (lab) {
var l = lab[0];
var a = lab[1];
var b = lab[2];
var hr;
var h;
var c;
hr = Math.atan2(b, a);
h = hr * 360 / 2 / Math.PI;
if (h < 0) {
h += 360;
}
c = Math.sqrt(a * a + b * b);
return [l, c, h];
};
convert.lch.lab = function (lch) {
var l = lch[0];
var c = lch[1];
var h = lch[2];
var a;
var b;
var hr;
hr = h / 360 * 2 * Math.PI;
a = c * Math.cos(hr);
b = c * Math.sin(hr);
return [l, a, b];
};
convert.rgb.ansi16 = function (args) {
var r = args[0];
var g = args[1];
var b = args[2];
var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization
value = Math.round(value / 50);
if (value === 0) {
return 30;
}
var ansi = 30 + (Math.round(b / 255) << 2 | Math.round(g / 255) << 1 | Math.round(r / 255));
if (value === 2) {
ansi += 60;
}
return ansi;
};
convert.hsv.ansi16 = function (args) {
// optimization here; we already know the value and don't need to get
// it converted for us.
return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
};
convert.rgb.ansi256 = function (args) {
var r = args[0];
var g = args[1];
var b = args[2]; // we use the extended greyscale palette here, with the exception of
// black and white. normal palette only has 4 greyscale shades.
if (r === g && g === b) {
if (r < 8) {
return 16;
}
if (r > 248) {
return 231;
}
return Math.round((r - 8) / 247 * 24) + 232;
}
var ansi = 16 + 36 * Math.round(r / 255 * 5) + 6 * Math.round(g / 255 * 5) + Math.round(b / 255 * 5);
return ansi;
};
convert.ansi16.rgb = function (args) {
var color = args % 10; // handle greyscale
if (color === 0 || color === 7) {
if (args > 50) {
color += 3.5;
}
color = color / 10.5 * 255;
return [color, color, color];
}
var mult = (~~(args > 50) + 1) * 0.5;
var r = (color & 1) * mult * 255;
var g = (color >> 1 & 1) * mult * 255;
var b = (color >> 2 & 1) * mult * 255;
return [r, g, b];
};
convert.ansi256.rgb = function (args) {
// handle greyscale
if (args >= 232) {
var c = (args - 232) * 10 + 8;
return [c, c, c];
}
args -= 16;
var rem;
var r = Math.floor(args / 36) / 5 * 255;
var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
var b = rem % 6 / 5 * 255;
return [r, g, b];
};
convert.rgb.hex = function (args) {
var integer = ((Math.round(args[0]) & 0xFF) << 16) + ((Math.round(args[1]) & 0xFF) << 8) + (Math.round(args[2]) & 0xFF);
var string = integer.toString(16).toUpperCase();
return '000000'.substring(string.length) + string;
};
convert.hex.rgb = function (args) {
var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
if (!match) {
return [0, 0, 0];
}
var colorString = match[0];
if (match[0].length === 3) {
colorString = colorString.split('').map(function (char) {
return char + char;
}).join('');
}
var integer = parseInt(colorString, 16);
var r = integer >> 16 & 0xFF;
var g = integer >> 8 & 0xFF;
var b = integer & 0xFF;
return [r, g, b];
};
convert.rgb.hcg = function (rgb) {
var r = rgb[0] / 255;
var g = rgb[1] / 255;
var b = rgb[2] / 255;
var max = Math.max(Math.max(r, g), b);
var min = Math.min(Math.min(r, g), b);
var chroma = max - min;
var grayscale;
var hue;
if (chroma < 1) {
grayscale = min / (1 - chroma);
} else {
grayscale = 0;
}
if (chroma <= 0) {
hue = 0;
} else if (max === r) {
hue = (g - b) / chroma % 6;
} else if (max === g) {
hue = 2 + (b - r) / chroma;
} else {
hue = 4 + (r - g) / chroma + 4;
}
hue /= 6;
hue %= 1;
return [hue * 360, chroma * 100, grayscale * 100];
};
convert.hsl.hcg = function (hsl) {
var s = hsl[1] / 100;
var l = hsl[2] / 100;
var c = 1;
var f = 0;
if (l < 0.5) {
c = 2.0 * s * l;
} else {
c = 2.0 * s * (1.0 - l);
}
if (c < 1.0) {
f = (l - 0.5 * c) / (1.0 - c);
}
return [hsl[0], c * 100, f * 100];
};
convert.hsv.hcg = function (hsv) {
var s = hsv[1] / 100;
var v = hsv[2] / 100;
var c = s * v;
var f = 0;
if (c < 1.0) {
f = (v - c) / (1 - c);
}
return [hsv[0], c * 100, f * 100];
};
convert.hcg.rgb = function (hcg) {
var h = hcg[0] / 360;
var c = hcg[1] / 100;
var g = hcg[2] / 100;
if (c === 0.0) {
return [g * 255, g * 255, g * 255];
}
var pure = [0, 0, 0];
var hi = h % 1 * 6;
var v = hi % 1;
var w = 1 - v;
var mg = 0;
switch (Math.floor(hi)) {
case 0:
pure[0] = 1;
pure[1] = v;
pure[2] = 0;
break;
case 1:
pure[0] = w;
pure[1] = 1;
pure[2] = 0;
break;
case 2:
pure[0] = 0;
pure[1] = 1;
pure[2] = v;
break;
case 3:
pure[0] = 0;
pure[1] = w;
pure[2] = 1;
break;
case 4:
pure[0] = v;
pure[1] = 0;
pure[2] = 1;
break;
default:
pure[0] = 1;
pure[1] = 0;
pure[2] = w;
}
mg = (1.0 - c) * g;
return [(c * pure[0] + mg) * 255, (c * pure[1] + mg) * 255, (c * pure[2] + mg) * 255];
};
convert.hcg.hsv = function (hcg) {
var c = hcg[1] / 100;
var g = hcg[2] / 100;
var v = c + g * (1.0 - c);
var f = 0;
if (v > 0.0) {
f = c / v;
}
return [hcg[0], f * 100, v * 100];
};
convert.hcg.hsl = function (hcg) {
var c = hcg[1] / 100;
var g = hcg[2] / 100;
var l = g * (1.0 - c) + 0.5 * c;
var s = 0;
if (l > 0.0 && l < 0.5) {
s = c / (2 * l);
} else if (l >= 0.5 && l < 1.0) {
s = c / (2 * (1 - l));
}
return [hcg[0], s * 100, l * 100];
};
convert.hcg.hwb = function (hcg) {
var c = hcg[1] / 100;
var g = hcg[2] / 100;
var v = c + g * (1.0 - c);
return [hcg[0], (v - c) * 100, (1 - v) * 100];
};
convert.hwb.hcg = function (hwb) {
var w = hwb[1] / 100;
var b = hwb[2] / 100;
var v = 1 - b;
var c = v - w;
var g = 0;
if (c < 1) {
g = (v - c) / (1 - c);
}
return [hwb[0], c * 100, g * 100];
};
convert.apple.rgb = function (apple) {
return [apple[0] / 65535 * 255, apple[1] / 65535 * 255, apple[2] / 65535 * 255];
};
convert.rgb.apple = function (rgb) {
return [rgb[0] / 255 * 65535, rgb[1] / 255 * 65535, rgb[2] / 255 * 65535];
};
convert.gray.rgb = function (args) {
return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
};
convert.gray.hsl = convert.gray.hsv = function (args) {
return [0, 0, args[0]];
};
convert.gray.hwb = function (gray) {
return [0, 100, gray[0]];
};
convert.gray.cmyk = function (gray) {
return [0, 0, 0, gray[0]];
};
convert.gray.lab = function (gray) {
return [gray[0], 0, 0];
};
convert.gray.hex = function (gray) {
var val = Math.round(gray[0] / 100 * 255) & 0xFF;
var integer = (val << 16) + (val << 8) + val;
var string = integer.toString(16).toUpperCase();
return '000000'.substring(string.length) + string;
};
convert.rgb.gray = function (rgb) {
var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
return [val / 255 * 100];
};
});
var conversions_1$1 = conversions$2.rgb;
var conversions_2$1 = conversions$2.hsl;
var conversions_3$1 = conversions$2.hsv;
var conversions_4$1 = conversions$2.hwb;
var conversions_5$1 = conversions$2.cmyk;
var conversions_6$1 = conversions$2.xyz;
var conversions_7$1 = conversions$2.lab;
var conversions_8$1 = conversions$2.lch;
var conversions_9$1 = conversions$2.hex;
var conversions_10$1 = conversions$2.keyword;
var conversions_11$1 = conversions$2.ansi16;
var conversions_12$1 = conversions$2.ansi256;
var conversions_13$1 = conversions$2.hcg;
var conversions_14$1 = conversions$2.apple;
var conversions_15$1 = conversions$2.gray;
/*
this function routes a model to all other models.
all functions that are routed have a property `.conversion` attached
to the returned synthetic function. This property is an array
of strings, each with the steps in between the 'from' and 'to'
color models (inclusive).
conversions that are not possible simply are not included.
*/
function buildGraph$2() {
var graph = {}; // https://jsperf.com/object-keys-vs-for-in-with-closure/3
var models = Object.keys(conversions$2);
for (var len = models.length, i = 0; i < len; i++) {
graph[models[i]] = {
// http://jsperf.com/1-vs-infinity
// micro-opt, but this is simple.
distance: -1,
parent: null
};
}
return graph;
} // https://en.wikipedia.org/wiki/Breadth-first_search
function deriveBFS$2(fromModel) {
var graph = buildGraph$2();
var queue = [fromModel]; // unshift -> queue -> pop
graph[fromModel].distance = 0;
while (queue.length) {
var current = queue.pop();
var adjacents = Object.keys(conversions$2[current]);
for (var len = adjacents.length, i = 0; i < len; i++) {
var adjacent = adjacents[i];
var node = graph[adjacent];
if (node.distance === -1) {
node.distance = graph[current].distance + 1;
node.parent = current;
queue.unshift(adjacent);
}
}
}
return graph;
}
function link$2(from, to) {
return function (args) {
return to(from(args));
};
}
function wrapConversion$2(toModel, graph) {
var path = [graph[toModel].parent, toModel];
var fn = conversions$2[graph[toModel].parent][toModel];
var cur = graph[toModel].parent;
while (graph[cur].parent) {
path.unshift(graph[cur].parent);
fn = link$2(conversions$2[graph[cur].parent][cur], fn);
cur = graph[cur].parent;
}
fn.conversion = path;
return fn;
}
var route$2 = function route(fromModel) {
var graph = deriveBFS$2(fromModel);
var conversion = {};
var models = Object.keys(graph);
for (var len = models.length, i = 0; i < len; i++) {
var toModel = models[i];
var node = graph[toModel];
if (node.parent === null) {
// no possible conversion, or this node is the source model.
continue;
}
conversion[toModel] = wrapConversion$2(toModel, graph);
}
return conversion;
};
var convert$3 = {};
var models$2 = Object.keys(conversions$2);
function wrapRaw$2(fn) {
var wrappedFn = function wrappedFn(args) {
if (args === undefined || args === null) {
return args;
}
if (arguments.length > 1) {
args = Array.prototype.slice.call(arguments);
}
return fn(args);
}; // preserve .conversion property if there is one
if ('conversion' in fn) {
wrappedFn.conversion = fn.conversion;
}
return wrappedFn;
}
function wrapRounded$2(fn) {
var wrappedFn = function wrappedFn(args) {
if (args === undefined || args === null) {
return args;
}
if (arguments.length > 1) {
args = Array.prototype.slice.call(arguments);
}
var result = fn(args); // we're assuming the result is an array here.
// see notice in conversions.js; don't use box types
// in conversion functions.
if (typeof result === 'object') {
for (var len = result.length, i = 0; i < len; i++) {
result[i] = Math.round(result[i]);
}
}
return result;
}; // preserve .conversion property if there is one
if ('conversion' in fn) {
wrappedFn.conversion = fn.conversion;
}
return wrappedFn;
}
models$2.forEach(function (fromModel) {
convert$3[fromModel] = {};
Object.defineProperty(convert$3[fromModel], 'channels', {
value: conversions$2[fromModel].channels
});
Object.defineProperty(convert$3[fromModel], 'labels', {
value: conversions$2[fromModel].labels
});
var routes = route$2(fromModel);
var routeModels = Object.keys(routes);
routeModels.forEach(function (toModel) {
var fn = routes[toModel];
convert$3[fromModel][toModel] = wrapRounded$2(fn);
convert$3[fromModel][toModel].raw = wrapRaw$2(fn);
});
});
var colorConvert$2 = convert$3;
var ansiStyles$2 = createCommonjsModule(function (module) {
const wrapAnsi16 = (fn, offset) => function () {
const code = fn.apply(colorConvert$2, arguments);
return "\x1B[".concat(code + offset, "m");
};
const wrapAnsi256 = (fn, offset) => function () {
const code = fn.apply(colorConvert$2, arguments);
return "\x1B[".concat(38 + offset, ";5;").concat(code, "m");
};
const wrapAnsi16m = (fn, offset) => function () {
const rgb = fn.apply(colorConvert$2, arguments);
return "\x1B[".concat(38 + offset, ";2;").concat(rgb[0], ";").concat(rgb[1], ";").concat(rgb[2], "m");
};
function assembleStyles() {
const codes = new Map();
const styles = {
modifier: {
reset: [0, 0],
// 21 isn't widely supported and 22 does the same thing
bold: [1, 22],
dim: [2, 22],
italic: [3, 23],
underline: [4, 24],
inverse: [7, 27],
hidden: [8, 28],
strikethrough: [9, 29]
},
color: {
black: [30, 39],
red: [31, 39],
green: [32, 39],
yellow: [33, 39],
blue: [34, 39],
magenta: [35, 39],
cyan: [36, 39],
white: [37, 39],
gray: [90, 39],
// Bright color
redBright: [91, 39],
greenBright: [92, 39],
yellowBright: [93, 39],
blueBright: [94, 39],
magentaBright: [95, 39],
cyanBright: [96, 39],
whiteBright: [97, 39]
},
bgColor: {
bgBlack: [40, 49],
bgRed: [41, 49],
bgGreen: [42, 49],
bgYellow: [43, 49],
bgBlue: [44, 49],
bgMagenta: [45, 49],
bgCyan: [46, 49],
bgWhite: [47, 49],
// Bright color
bgBlackBright: [100, 49],
bgRedBright: [101, 49],
bgGreenBright: [102, 49],
bgYellowBright: [103, 49],
bgBlueBright: [104, 49],
bgMagentaBright: [105, 49],
bgCyanBright: [106, 49],
bgWhiteBright: [107, 49]
}
}; // Fix humans
styles.color.grey = styles.color.gray;
for (const groupName of Object.keys(styles)) {
const group = styles[groupName];
for (const styleName of Object.keys(group)) {
const style = group[styleName];
styles[styleName] = {
open: "\x1B[".concat(style[0], "m"),
close: "\x1B[".concat(style[1], "m")
};
group[styleName] = styles[styleName];
codes.set(style[0], style[1]);
}
Object.defineProperty(styles, groupName, {
value: group,
enumerable: false
});
Object.defineProperty(styles, 'codes', {
value: codes,
enumerable: false
});
}
const ansi2ansi = n => n;
const rgb2rgb = (r, g, b) => [r, g, b];
styles.color.close = '\u001B[39m';
styles.bgColor.close = '\u001B[49m';
styles.color.ansi = {
ansi: wrapAnsi16(ansi2ansi, 0)
};
styles.color.ansi256 = {
ansi256: wrapAnsi256(ansi2ansi, 0)
};
styles.color.ansi16m = {
rgb: wrapAnsi16m(rgb2rgb, 0)
};
styles.bgColor.ansi = {
ansi: wrapAnsi16(ansi2ansi, 10)
};
styles.bgColor.ansi256 = {
ansi256: wrapAnsi256(ansi2ansi, 10)
};
styles.bgColor.ansi16m = {
rgb: wrapAnsi16m(rgb2rgb, 10)
};
for (let key of Object.keys(colorConvert$2)) {
if (typeof colorConvert$2[key] !== 'object') {
continue;
}
const suite = colorConvert$2[key];
if (key === 'ansi16') {
key = 'ansi';
}
if ('ansi16' in suite) {
styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);
styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);
}
if ('ansi256' in suite) {
styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);
styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);
}
if ('rgb' in suite) {
styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);
styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);
}
}
return styles;
} // Make the export immutable
Object.defineProperty(module, 'exports', {
enumerable: true,
get: assembleStyles
});
});
const env$3 = process.env;
let forceColor$2;
if (hasFlag('no-color') || hasFlag('no-colors') || hasFlag('color=false')) {
forceColor$2 = false;
} else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true') || hasFlag('color=always')) {
forceColor$2 = true;
}
if ('FORCE_COLOR' in env$3) {
forceColor$2 = env$3.FORCE_COLOR.length === 0 || parseInt(env$3.FORCE_COLOR, 10) !== 0;
}
function translateLevel$2(level) {
if (level === 0) {
return false;
}
return {
level,
hasBasic: true,
has256: level >= 2,
has16m: level >= 3
};
}
function supportsColor$2(stream) {
if (forceColor$2 === false) {
return 0;
}
if (hasFlag('color=16m') || hasFlag('color=full') || hasFlag('color=truecolor')) {
return 3;
}
if (hasFlag('color=256')) {
return 2;
}
if (stream && !stream.isTTY && forceColor$2 !== true) {
return 0;
}
const min = forceColor$2 ? 1 : 0;
if (process.platform === 'win32') {
// Node.js 7.5.0 is the first version of Node.js to include a patch to
// libuv that enables 256 color output on Windows. Anything earlier and it
// won't work. However, here we target Node.js 8 at minimum as it is an LTS
// release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows
// release that supports 256 colors. Windows 10 build 14931 is the first release
// that supports 16m/TrueColor.
const osRelease = require$$0$1.release().split('.');
if (Number(process.versions.node.split('.')[0]) >= 8 && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
return Number(osRelease[2]) >= 14931 ? 3 : 2;
}
return 1;
}
if ('CI' in env$3) {
if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env$3) || env$3.CI_NAME === 'codeship') {
return 1;
}
return min;
}
if ('TEAMCITY_VERSION' in env$3) {
return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env$3.TEAMCITY_VERSION) ? 1 : 0;
}
if (env$3.COLORTERM === 'truecolor') {
return 3;
}
if ('TERM_PROGRAM' in env$3) {
const version = parseInt((env$3.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
switch (env$3.TERM_PROGRAM) {
case 'iTerm.app':
return version >= 3 ? 3 : 2;
case 'Apple_Terminal':
return 2;
// No default
}
}
if (/-256(color)?$/i.test(env$3.TERM)) {
return 2;
}
if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env$3.TERM)) {
return 1;
}
if ('COLORTERM' in env$3) {
return 1;
}
if (env$3.TERM === 'dumb') {
return min;
}
return min;
}
function getSupportLevel$2(stream) {
const level = supportsColor$2(stream);
return translateLevel$2(level);
}
var supportsColor_1$2 = {
supportsColor: getSupportLevel$2,
stdout: getSupportLevel$2(process.stdout),
stderr: getSupportLevel$2(process.stderr)
};
const TEMPLATE_REGEX$2 = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
const STYLE_REGEX$2 = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
const STRING_REGEX$2 = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
const ESCAPE_REGEX$2 = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi;
const ESCAPES$2 = new Map([['n', '\n'], ['r', '\r'], ['t', '\t'], ['b', '\b'], ['f', '\f'], ['v', '\v'], ['0', '\0'], ['\\', '\\'], ['e', '\u001B'], ['a', '\u0007']]);
function unescape$2(c) {
if (c[0] === 'u' && c.length === 5 || c[0] === 'x' && c.length === 3) {
return String.fromCharCode(parseInt(c.slice(1), 16));
}
return ESCAPES$2.get(c) || c;
}
function parseArguments$2(name, args) {
const results = [];
const chunks = args.trim().split(/\s*,\s*/g);
let matches;
for (const chunk of chunks) {
if (!isNaN(chunk)) {
results.push(Number(chunk));
} else if (matches = chunk.match(STRING_REGEX$2)) {
results.push(matches[2].replace(ESCAPE_REGEX$2, (m, escape, chr) => escape ? unescape$2(escape) : chr));
} else {
throw new Error("Invalid Chalk template style argument: ".concat(chunk, " (in style '").concat(name, "')"));
}
}
return results;
}
function parseStyle$2(style) {
STYLE_REGEX$2.lastIndex = 0;
const results = [];
let matches;
while ((matches = STYLE_REGEX$2.exec(style)) !== null) {
const name = matches[1];
if (matches[2]) {
const args = parseArguments$2(name, matches[2]);
results.push([name].concat(args));
} else {
results.push([name]);
}
}
return results;
}
function buildStyle$2(chalk, styles) {
const enabled = {};
for (const layer of styles) {
for (const style of layer.styles) {
enabled[style[0]] = layer.inverse ? null : style.slice(1);
}
}
let current = chalk;
for (const styleName of Object.keys(enabled)) {
if (Array.isArray(enabled[styleName])) {
if (!(styleName in current)) {
throw new Error("Unknown Chalk style: ".concat(styleName));
}
if (enabled[styleName].length > 0) {
current = current[styleName].apply(current, enabled[styleName]);
} else {
current = current[styleName];
}
}
}
return current;
}
var templates$2 = (chalk, tmp) => {
const styles = [];
const chunks = [];
let chunk = []; // eslint-disable-next-line max-params
tmp.replace(TEMPLATE_REGEX$2, (m, escapeChar, inverse, style, close, chr) => {
if (escapeChar) {
chunk.push(unescape$2(escapeChar));
} else if (style) {
const str = chunk.join('');
chunk = [];
chunks.push(styles.length === 0 ? str : buildStyle$2(chalk, styles)(str));
styles.push({
inverse,
styles: parseStyle$2(style)
});
} else if (close) {
if (styles.length === 0) {
throw new Error('Found extraneous } in Chalk template literal');
}
chunks.push(buildStyle$2(chalk, styles)(chunk.join('')));
chunk = [];
styles.pop();
} else {
chunk.push(chr);
}
});
chunks.push(chunk.join(''));
if (styles.length > 0) {
const errMsg = "Chalk template literal is missing ".concat(styles.length, " closing bracket").concat(styles.length === 1 ? '' : 's', " (`}`)");
throw new Error(errMsg);
}
return chunks.join('');
};
var chalk$2 = createCommonjsModule(function (module) {
const stdoutColor = supportsColor_1$2.stdout;
const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); // `supportsColor.level` → `ansiStyles.color[name]` mapping
const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; // `color-convert` models to exclude from the Chalk API due to conflicts and such
const skipModels = new Set(['gray']);
const styles = Object.create(null);
function applyOptions(obj, options) {
options = options || {}; // Detect level if not set manually
const scLevel = stdoutColor ? stdoutColor.level : 0;
obj.level = options.level === undefined ? scLevel : options.level;
obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0;
}
function Chalk(options) {
// We check for this.template here since calling `chalk.constructor()`
// by itself will have a `this` of a previously constructed chalk object
if (!this || !(this instanceof Chalk) || this.template) {
const chalk = {};
applyOptions(chalk, options);
chalk.template = function () {
const args = [].slice.call(arguments);
return chalkTag.apply(null, [chalk.template].concat(args));
};
Object.setPrototypeOf(chalk, Chalk.prototype);
Object.setPrototypeOf(chalk.template, chalk);
chalk.template.constructor = Chalk;
return chalk.template;
}
applyOptions(this, options);
} // Use bright blue on Windows as the normal blue color is illegible
if (isSimpleWindowsTerm) {
ansiStyles$2.blue.open = '\u001B[94m';
}
for (const key of Object.keys(ansiStyles$2)) {
ansiStyles$2[key].closeRe = new RegExp(escapeStringRegexp$1(ansiStyles$2[key].close), 'g');
styles[key] = {
get() {
const codes = ansiStyles$2[key];
return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key);
}
};
}
styles.visible = {
get() {
return build.call(this, this._styles || [], true, 'visible');
}
};
ansiStyles$2.color.closeRe = new RegExp(escapeStringRegexp$1(ansiStyles$2.color.close), 'g');
for (const model of Object.keys(ansiStyles$2.color.ansi)) {
if (skipModels.has(model)) {
continue;
}
styles[model] = {
get() {
const level = this.level;
return function () {
const open = ansiStyles$2.color[levelMapping[level]][model].apply(null, arguments);
const codes = {
open,
close: ansiStyles$2.color.close,
closeRe: ansiStyles$2.color.closeRe
};
return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
};
}
};
}
ansiStyles$2.bgColor.closeRe = new RegExp(escapeStringRegexp$1(ansiStyles$2.bgColor.close), 'g');
for (const model of Object.keys(ansiStyles$2.bgColor.ansi)) {
if (skipModels.has(model)) {
continue;
}
const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
styles[bgModel] = {
get() {
const level = this.level;
return function () {
const open = ansiStyles$2.bgColor[levelMapping[level]][model].apply(null, arguments);
const codes = {
open,
close: ansiStyles$2.bgColor.close,
closeRe: ansiStyles$2.bgColor.closeRe
};
return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
};
}
};
}
const proto = Object.defineProperties(() => {}, styles);
function build(_styles, _empty, key) {
const builder = function builder() {
return applyStyle.apply(builder, arguments);
};
builder._styles = _styles;
builder._empty = _empty;
const self = this;
Object.defineProperty(builder, 'level', {
enumerable: true,
get() {
return self.level;
},
set(level) {
self.level = level;
}
});
Object.defineProperty(builder, 'enabled', {
enumerable: true,
get() {
return self.enabled;
},
set(enabled) {
self.enabled = enabled;
}
}); // See below for fix regarding invisible grey/dim combination on Windows
builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; // `__proto__` is used because we must return a function, but there is
// no way to create a function with a different prototype
builder.__proto__ = proto; // eslint-disable-line no-proto
return builder;
}
function applyStyle() {
// Support varags, but simply cast to string in case there's only one arg
const args = arguments;
const argsLen = args.length;
let str = String(arguments[0]);
if (argsLen === 0) {
return '';
}
if (argsLen > 1) {
// Don't slice `arguments`, it prevents V8 optimizations
for (let a = 1; a < argsLen; a++) {
str += ' ' + args[a];
}
}
if (!this.enabled || this.level <= 0 || !str) {
return this._empty ? '' : str;
} // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
// see https://github.com/chalk/chalk/issues/58
// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
const originalDim = ansiStyles$2.dim.open;
if (isSimpleWindowsTerm && this.hasGrey) {
ansiStyles$2.dim.open = '';
}
for (const code of this._styles.slice().reverse()) {
// Replace any instances already present with a re-opening code
// otherwise only the part of the string until said closing code
// will be colored, and the rest will simply be 'plain'.
str = code.open + str.replace(code.closeRe, code.open) + code.close; // Close the styling before a linebreak and reopen
// after next line to fix a bleed issue on macOS
// https://github.com/chalk/chalk/pull/92
str = str.replace(/\r?\n/g, "".concat(code.close, "$&").concat(code.open));
} // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue
ansiStyles$2.dim.open = originalDim;
return str;
}
function chalkTag(chalk, strings) {
if (!Array.isArray(strings)) {
// If chalk() was called by itself or with a string,
// return the string itself as a string.
return [].slice.call(arguments, 1).join(' ');
}
const args = [].slice.call(arguments, 2);
const parts = [strings.raw[0]];
for (let i = 1; i < strings.length; i++) {
parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&'));
parts.push(String(strings.raw[i]));
}
return templates$2(chalk, parts.join(''));
}
Object.defineProperties(Chalk.prototype, styles);
module.exports = Chalk(); // eslint-disable-line new-cap
module.exports.supportsColor = stdoutColor;
module.exports.default = module.exports; // For TypeScript
});
var chalk_1$1 = chalk$2.supportsColor;
var lib$1 = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.shouldHighlight = shouldHighlight;
exports.getChalk = getChalk;
exports.default = highlight;
var _jsTokens = _interopRequireWildcard(jsTokens);
var _esutils = _interopRequireDefault(utils$1);
var _chalk = _interopRequireDefault(chalk$2);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache() {
if (typeof WeakMap !== "function") return null;
var cache = new WeakMap();
_getRequireWildcardCache = function _getRequireWildcardCache() {
return cache;
};
return cache;
}
function _interopRequireWildcard(obj) {
if (obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache();
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
function getDefs(chalk) {
return {
keyword: chalk.cyan,
capitalized: chalk.yellow,
jsx_tag: chalk.yellow,
punctuator: chalk.yellow,
number: chalk.magenta,
string: chalk.green,
regex: chalk.magenta,
comment: chalk.grey,
invalid: chalk.white.bgRed.bold
};
}
const NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
const JSX_TAG = /^[a-z][\w-]*$/i;
const BRACKET = /^[()[\]{}]$/;
function getTokenType(match) {
const [offset, text] = match.slice(-2);
const token = (0, _jsTokens.matchToToken)(match);
if (token.type === "name") {
if (_esutils.default.keyword.isReservedWordES6(token.value)) {
return "keyword";
}
if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.substr(offset - 2, 2) == "")) {
return "jsx_tag";
}
if (token.value[0] !== token.value[0].toLowerCase()) {
return "capitalized";
}
}
if (token.type === "punctuator" && BRACKET.test(token.value)) {
return "bracket";
}
if (token.type === "invalid" && (token.value === "@" || token.value === "#")) {
return "punctuator";
}
return token.type;
}
function highlightTokens(defs, text) {
return text.replace(_jsTokens.default, function (...args) {
const type = getTokenType(args);
const colorize = defs[type];
if (colorize) {
return args[0].split(NEWLINE).map(str => colorize(str)).join("\n");
} else {
return args[0];
}
});
}
function shouldHighlight(options) {
return _chalk.default.supportsColor || options.forceColor;
}
function getChalk(options) {
let chalk = _chalk.default;
if (options.forceColor) {
chalk = new _chalk.default.constructor({
enabled: true,
level: 1
});
}
return chalk;
}
function highlight(code, options = {}) {
if (shouldHighlight(options)) {
const chalk = getChalk(options);
const defs = getDefs(chalk);
return highlightTokens(defs, code);
} else {
return code;
}
}
});
unwrapExports(lib$1);
var lib_1 = lib$1.shouldHighlight;
var lib_2 = lib$1.getChalk;
var lib$2 = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.codeFrameColumns = codeFrameColumns;
exports.default = _default;
var _highlight = _interopRequireWildcard(lib$1);
function _getRequireWildcardCache() {
if (typeof WeakMap !== "function") return null;
var cache = new WeakMap();
_getRequireWildcardCache = function _getRequireWildcardCache() {
return cache;
};
return cache;
}
function _interopRequireWildcard(obj) {
if (obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache();
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
let deprecationWarningShown = false;
function getDefs(chalk) {
return {
gutter: chalk.grey,
marker: chalk.red.bold,
message: chalk.red.bold
};
}
const NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
function getMarkerLines(loc, source, opts) {
const startLoc = Object.assign({
column: 0,
line: -1
}, loc.start);
const endLoc = Object.assign({}, startLoc, {}, loc.end);
const {
linesAbove = 2,
linesBelow = 3
} = opts || {};
const startLine = startLoc.line;
const startColumn = startLoc.column;
const endLine = endLoc.line;
const endColumn = endLoc.column;
let start = Math.max(startLine - (linesAbove + 1), 0);
let end = Math.min(source.length, endLine + linesBelow);
if (startLine === -1) {
start = 0;
}
if (endLine === -1) {
end = source.length;
}
const lineDiff = endLine - startLine;
const markerLines = {};
if (lineDiff) {
for (let i = 0; i <= lineDiff; i++) {
const lineNumber = i + startLine;
if (!startColumn) {
markerLines[lineNumber] = true;
} else if (i === 0) {
const sourceLength = source[lineNumber - 1].length;
markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1];
} else if (i === lineDiff) {
markerLines[lineNumber] = [0, endColumn];
} else {
const sourceLength = source[lineNumber - i].length;
markerLines[lineNumber] = [0, sourceLength];
}
}
} else {
if (startColumn === endColumn) {
if (startColumn) {
markerLines[startLine] = [startColumn, 0];
} else {
markerLines[startLine] = true;
}
} else {
markerLines[startLine] = [startColumn, endColumn - startColumn];
}
}
return {
start,
end,
markerLines
};
}
function codeFrameColumns(rawLines, loc, opts = {}) {
const highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight.shouldHighlight)(opts);
const chalk = (0, _highlight.getChalk)(opts);
const defs = getDefs(chalk);
const maybeHighlight = (chalkFn, string) => {
return highlighted ? chalkFn(string) : string;
};
const lines = rawLines.split(NEWLINE);
const {
start,
end,
markerLines
} = getMarkerLines(loc, lines, opts);
const hasColumns = loc.start && typeof loc.start.column === "number";
const numberMaxWidth = String(end).length;
const highlightedLines = highlighted ? (0, _highlight.default)(rawLines, opts) : rawLines;
let frame = highlightedLines.split(NEWLINE).slice(start, end).map((line, index) => {
const number = start + 1 + index;
const paddedNumber = " ".concat(number).slice(-numberMaxWidth);
const gutter = " ".concat(paddedNumber, " | ");
const hasMarker = markerLines[number];
const lastMarkerLine = !markerLines[number + 1];
if (hasMarker) {
let markerLine = "";
if (Array.isArray(hasMarker)) {
const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " ");
const numberOfMarkers = hasMarker[1] || 1;
markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join("");
if (lastMarkerLine && opts.message) {
markerLine += " " + maybeHighlight(defs.message, opts.message);
}
}
return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line, markerLine].join("");
} else {
return " ".concat(maybeHighlight(defs.gutter, gutter)).concat(line);
}
}).join("\n");
if (opts.message && !hasColumns) {
frame = "".concat(" ".repeat(numberMaxWidth + 1)).concat(opts.message, "\n").concat(frame);
}
if (highlighted) {
return chalk.reset(frame);
} else {
return frame;
}
}
function _default(rawLines, lineNumber, colNumber, opts = {}) {
if (!deprecationWarningShown) {
deprecationWarningShown = true;
const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`.";
if (process.emitWarning) {
process.emitWarning(message, "DeprecationWarning");
} else {
const deprecationError = new Error(message);
deprecationError.name = "DeprecationWarning";
console.warn(new Error(message));
}
}
colNumber = Math.max(colNumber, 0);
const location = {
start: {
column: colNumber,
line: lineNumber
}
};
return codeFrameColumns(rawLines, location, opts);
}
});
unwrapExports(lib$2);
var lib_1$1 = lib$2.codeFrameColumns;
const {
ConfigError: ConfigError$1
} = errors;
const {
locStart: locStart$1,
locEnd: locEnd$1
} = loc; // Use defineProperties()/getOwnPropertyDescriptor() to prevent
// triggering the parsers getters.
const ownNames = Object.getOwnPropertyNames;
const ownDescriptor = Object.getOwnPropertyDescriptor;
function getParsers(options) {
const parsers = {};
for (const plugin of options.plugins) {
if (!plugin.parsers) {
continue;
}
for (const name of ownNames(plugin.parsers)) {
Object.defineProperty(parsers, name, ownDescriptor(plugin.parsers, name));
}
}
return parsers;
}
function resolveParser(opts, parsers) {
parsers = parsers || getParsers(opts);
if (typeof opts.parser === "function") {
// Custom parser API always works with JavaScript.
return {
parse: opts.parser,
astFormat: "estree",
locStart: locStart$1,
locEnd: locEnd$1
};
}
if (typeof opts.parser === "string") {
if (Object.prototype.hasOwnProperty.call(parsers, opts.parser)) {
return parsers[opts.parser];
}
/* istanbul ignore next */
{
throw new ConfigError$1("Couldn't resolve parser \"".concat(opts.parser, "\". Parsers must be explicitly added to the standalone bundle."));
}
}
}
function parse(text, opts) {
const parsers = getParsers(opts); // Create a new object {parserName: parseFn}. Uses defineProperty() to only call
// the parsers getters when actually calling the parser `parse` function.
const parsersForCustomParserApi = Object.keys(parsers).reduce((object, parserName) => Object.defineProperty(object, parserName, {
enumerable: true,
get() {
return parsers[parserName].parse;
}
}), {});
const parser = resolveParser(opts, parsers);
try {
if (parser.preprocess) {
text = parser.preprocess(text, opts);
}
return {
text,
ast: parser.parse(text, parsersForCustomParserApi, opts)
};
} catch (error) {
const {
loc
} = error;
if (loc) {
const codeFrame = lib$2;
error.codeFrame = codeFrame.codeFrameColumns(text, loc, {
highlightCode: true
});
error.message += "\n" + error.codeFrame;
throw error;
}
/* istanbul ignore next */
throw error.stack;
}
}
var parser = {
parse,
resolveParser
};
const {
UndefinedParserError: UndefinedParserError$1
} = errors;
const {
getSupportInfo: getSupportInfo$1
} = support;
const {
resolveParser: resolveParser$1
} = parser;
const hiddenDefaults = {
astFormat: "estree",
printer: {},
originalText: undefined,
locStart: null,
locEnd: null
}; // Copy options and fill in default values.
function normalize$1(options, opts) {
opts = opts || {};
const rawOptions = Object.assign({}, options);
const supportOptions = getSupportInfo$1({
plugins: options.plugins,
showUnreleased: true,
showDeprecated: true
}).options;
const defaults = Object.assign({}, hiddenDefaults, {}, fromPairs_1(supportOptions.filter(optionInfo => optionInfo.default !== undefined).map(option => [option.name, option.default])));
if (!rawOptions.parser) {
if (!rawOptions.filepath) {
const logger = opts.logger || console;
logger.warn("No parser and no filepath given, using 'babel' the parser now " + "but this will throw an error in the future. " + "Please specify a parser or a filepath so one can be inferred.");
rawOptions.parser = "babel";
} else {
rawOptions.parser = inferParser(rawOptions.filepath, rawOptions.plugins);
if (!rawOptions.parser) {
throw new UndefinedParserError$1("No parser could be inferred for file: ".concat(rawOptions.filepath));
}
}
}
const parser = resolveParser$1(optionsNormalizer.normalizeApiOptions(rawOptions, [supportOptions.find(x => x.name === "parser")], {
passThrough: true,
logger: false
}));
rawOptions.astFormat = parser.astFormat;
rawOptions.locEnd = parser.locEnd;
rawOptions.locStart = parser.locStart;
const plugin = getPlugin(rawOptions);
rawOptions.printer = plugin.printers[rawOptions.astFormat];
const pluginDefaults = supportOptions.filter(optionInfo => optionInfo.pluginDefaults && optionInfo.pluginDefaults[plugin.name] !== undefined).reduce((reduced, optionInfo) => Object.assign(reduced, {
[optionInfo.name]: optionInfo.pluginDefaults[plugin.name]
}), {});
const mixedDefaults = Object.assign({}, defaults, {}, pluginDefaults);
Object.keys(mixedDefaults).forEach(k => {
if (rawOptions[k] == null) {
rawOptions[k] = mixedDefaults[k];
}
});
if (rawOptions.parser === "json") {
rawOptions.trailingComma = "none";
}
return optionsNormalizer.normalizeApiOptions(rawOptions, supportOptions, Object.assign({
passThrough: Object.keys(hiddenDefaults)
}, opts));
}
function getPlugin(options) {
const {
astFormat
} = options;
if (!astFormat) {
throw new Error("getPlugin() requires astFormat to be set");
}
const printerPlugin = options.plugins.find(plugin => plugin.printers && plugin.printers[astFormat]);
if (!printerPlugin) {
throw new Error("Couldn't find plugin for AST format \"".concat(astFormat, "\""));
}
return printerPlugin;
}
function getInterpreter(filepath) {
if (typeof filepath !== "string") {
return "";
}
let fd;
try {
fd = fs.openSync(filepath, "r");
} catch (err) {
// istanbul ignore next
return "";
}
try {
const liner = new readlines(fd);
const firstLine = liner.next().toString("utf8"); // #!/bin/env node, #!/usr/bin/env node
const m1 = firstLine.match(/^#!\/(?:usr\/)?bin\/env\s+(\S+)/);
if (m1) {
return m1[1];
} // #!/bin/node, #!/usr/bin/node, #!/usr/local/bin/node
const m2 = firstLine.match(/^#!\/(?:usr\/(?:local\/)?)?bin\/(\S+)/);
if (m2) {
return m2[1];
}
return "";
} catch (err) {
// There are some weird cases where paths are missing, causing Jest
// failures. It's unclear what these correspond to in the real world.
return "";
} finally {
try {
// There are some weird cases where paths are missing, causing Jest
// failures. It's unclear what these correspond to in the real world.
fs.closeSync(fd);
} catch (err) {// nop
}
}
}
function inferParser(filepath, plugins) {
const filename = path.basename(filepath).toLowerCase();
const languages = getSupportInfo$1({
plugins
}).languages.filter(language => language.since !== null); // If the file has no extension, we can try to infer the language from the
// interpreter in the shebang line, if any; but since this requires FS access,
// do it last.
let language = languages.find(language => language.extensions && language.extensions.some(extension => filename.endsWith(extension)) || language.filenames && language.filenames.find(name => name.toLowerCase() === filename));
if (!language && !filename.includes(".")) {
const interpreter = getInterpreter(filepath);
language = languages.find(language => language.interpreters && language.interpreters.includes(interpreter));
}
return language && language.parsers[0];
}
var options$1 = {
normalize: normalize$1,
hiddenDefaults,
inferParser
};
function massageAST(ast, options, parent) {
if (Array.isArray(ast)) {
return ast.map(e => massageAST(e, options, parent)).filter(Boolean);
}
if (!ast || typeof ast !== "object") {
return ast;
}
const newObj = {};
for (const key of Object.keys(ast)) {
if (typeof ast[key] !== "function") {
newObj[key] = massageAST(ast[key], options, ast);
}
}
if (options.printer.massageAstNode) {
const result = options.printer.massageAstNode(ast, newObj, parent);
if (result === null) {
return undefined;
}
if (result) {
return result;
}
}
return newObj;
}
var massageAst = massageAST;
function assert() {}
assert.ok = function () {};
assert.strictEqual = function () {};
/**
* @param {Doc[]} parts
* @returns Doc
*/
function concat(parts) {
// access the internals of a document directly.
// if(parts.length === 1) {
// // If it's a single document, no need to concat it.
// return parts[0];
// }
return {
type: "concat",
parts
};
}
/**
* @param {Doc} contents
* @returns Doc
*/
function indent(contents) {
return {
type: "indent",
contents
};
}
/**
* @param {number} n
* @param {Doc} contents
* @returns Doc
*/
function align(n, contents) {
return {
type: "align",
contents,
n
};
}
/**
* @param {Doc} contents
* @param {object} [opts] - TBD ???
* @returns Doc
*/
function group(contents, opts) {
opts = opts || {};
return {
type: "group",
id: opts.id,
contents,
break: !!opts.shouldBreak,
expandedStates: opts.expandedStates
};
}
/**
* @param {Doc} contents
* @returns Doc
*/
function dedentToRoot(contents) {
return align(-Infinity, contents);
}
/**
* @param {Doc} contents
* @returns Doc
*/
function markAsRoot(contents) {
// @ts-ignore - TBD ???:
return align({
type: "root"
}, contents);
}
/**
* @param {Doc} contents
* @returns Doc
*/
function dedent(contents) {
return align(-1, contents);
}
/**
* @param {Doc[]} states
* @param {object} [opts] - TBD ???
* @returns Doc
*/
function conditionalGroup(states, opts) {
return group(states[0], Object.assign({}, opts, {
expandedStates: states
}));
}
/**
* @param {Doc[]} parts
* @returns Doc
*/
function fill(parts) {
return {
type: "fill",
parts
};
}
/**
* @param {Doc} [breakContents]
* @param {Doc} [flatContents]
* @param {object} [opts] - TBD ???
* @returns Doc
*/
function ifBreak(breakContents, flatContents, opts) {
opts = opts || {};
return {
type: "if-break",
breakContents,
flatContents,
groupId: opts.groupId
};
}
/**
* @param {Doc} contents
* @returns Doc
*/
function lineSuffix(contents) {
return {
type: "line-suffix",
contents
};
}
const lineSuffixBoundary = {
type: "line-suffix-boundary"
};
const breakParent = {
type: "break-parent"
};
const trim = {
type: "trim"
};
const line = {
type: "line"
};
const softline = {
type: "line",
soft: true
};
const hardline = concat([{
type: "line",
hard: true
}, breakParent]);
const literalline = concat([{
type: "line",
hard: true,
literal: true
}, breakParent]);
const cursor = {
type: "cursor",
placeholder: Symbol("cursor")
};
/**
* @param {Doc} sep
* @param {Doc[]} arr
* @returns Doc
*/
function join(sep, arr) {
const res = [];
for (let i = 0; i < arr.length; i++) {
if (i !== 0) {
res.push(sep);
}
res.push(arr[i]);
}
return concat(res);
}
/**
* @param {Doc} doc
* @param {number} size
* @param {number} tabWidth
*/
function addAlignmentToDoc(doc, size, tabWidth) {
let aligned = doc;
if (size > 0) {
// Use indent to add tabs for all the levels of tabs we need
for (let i = 0; i < Math.floor(size / tabWidth); ++i) {
aligned = indent(aligned);
} // Use align for all the spaces that are needed
aligned = align(size % tabWidth, aligned); // size is absolute from 0 and not relative to the current
// indentation, so we use -Infinity to reset the indentation to 0
aligned = align(-Infinity, aligned);
}
return aligned;
}
var docBuilders = {
concat,
join,
line,
softline,
hardline,
literalline,
group,
conditionalGroup,
fill,
lineSuffix,
lineSuffixBoundary,
cursor,
breakParent,
ifBreak,
trim,
indent,
align,
addAlignmentToDoc,
markAsRoot,
dedentToRoot,
dedent
};
var ansiRegex = ({
onlyFirst = false
} = {}) => {
const pattern = ['[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'].join('|');
return new RegExp(pattern, onlyFirst ? undefined : 'g');
};
var stripAnsi = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;
/* eslint-disable yoda */
const isFullwidthCodePoint = codePoint => {
if (Number.isNaN(codePoint)) {
return false;
} // Code points are derived from:
// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
if (codePoint >= 0x1100 && (codePoint <= 0x115F || // Hangul Jamo
codePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET
codePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET
// CJK Radicals Supplement .. Enclosed CJK Letters and Months
0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F || // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
0x3250 <= codePoint && codePoint <= 0x4DBF || // CJK Unified Ideographs .. Yi Radicals
0x4E00 <= codePoint && codePoint <= 0xA4C6 || // Hangul Jamo Extended-A
0xA960 <= codePoint && codePoint <= 0xA97C || // Hangul Syllables
0xAC00 <= codePoint && codePoint <= 0xD7A3 || // CJK Compatibility Ideographs
0xF900 <= codePoint && codePoint <= 0xFAFF || // Vertical Forms
0xFE10 <= codePoint && codePoint <= 0xFE19 || // CJK Compatibility Forms .. Small Form Variants
0xFE30 <= codePoint && codePoint <= 0xFE6B || // Halfwidth and Fullwidth Forms
0xFF01 <= codePoint && codePoint <= 0xFF60 || 0xFFE0 <= codePoint && codePoint <= 0xFFE6 || // Kana Supplement
0x1B000 <= codePoint && codePoint <= 0x1B001 || // Enclosed Ideographic Supplement
0x1F200 <= codePoint && codePoint <= 0x1F251 || // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
0x20000 <= codePoint && codePoint <= 0x3FFFD)) {
return true;
}
return false;
};
var isFullwidthCodePoint_1 = isFullwidthCodePoint;
var default_1$1 = isFullwidthCodePoint;
isFullwidthCodePoint_1.default = default_1$1;
var emojiRegex = function emojiRegex() {
// https://mths.be/emoji
return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
};
const stringWidth = string => {
string = string.replace(emojiRegex(), ' ');
if (typeof string !== 'string' || string.length === 0) {
return 0;
}
string = stripAnsi(string);
let width = 0;
for (let i = 0; i < string.length; i++) {
const code = string.codePointAt(i); // Ignore control characters
if (code <= 0x1F || code >= 0x7F && code <= 0x9F) {
continue;
} // Ignore combining characters
if (code >= 0x300 && code <= 0x36F) {
continue;
} // Surrogates
if (code > 0xFFFF) {
i++;
}
width += isFullwidthCodePoint_1(code) ? 2 : 1;
}
return width;
};
var stringWidth_1 = stringWidth; // TODO: remove this in the next major version
var default_1$2 = stringWidth;
stringWidth_1.default = default_1$2;
const matchOperatorsRegex = /[|\\{}()[\]^$+*?.-]/g;
var escapeStringRegexp$2 = string => {
if (typeof string !== 'string') {
throw new TypeError('Expected a string');
}
return string.replace(matchOperatorsRegex, '\\$&');
};
const notAsciiRegex = /[^\x20-\x7F]/;
function getPenultimate(arr) {
if (arr.length > 1) {
return arr[arr.length - 2];
}
return null;
}
/**
* @typedef {{backwards?: boolean}} SkipOptions
*/
/**
* @param {string | RegExp} chars
* @returns {(text: string, index: number | false, opts?: SkipOptions) => number | false}
*/
function skip(chars) {
return (text, index, opts) => {
const backwards = opts && opts.backwards; // Allow `skip` functions to be threaded together without having
// to check for failures (did someone say monads?).
if (index === false) {
return false;
}
const {
length
} = text;
let cursor = index;
while (cursor >= 0 && cursor < length) {
const c = text.charAt(cursor);
if (chars instanceof RegExp) {
if (!chars.test(c)) {
return cursor;
}
} else if (!chars.includes(c)) {
return cursor;
}
backwards ? cursor-- : cursor++;
}
if (cursor === -1 || cursor === length) {
// If we reached the beginning or end of the file, return the
// out-of-bounds cursor. It's up to the caller to handle this
// correctly. We don't want to indicate `false` though if it
// actually skipped valid characters.
return cursor;
}
return false;
};
}
/**
* @type {(text: string, index: number | false, opts?: SkipOptions) => number | false}
*/
const skipWhitespace = skip(/\s/);
/**
* @type {(text: string, index: number | false, opts?: SkipOptions) => number | false}
*/
const skipSpaces = skip(" \t");
/**
* @type {(text: string, index: number | false, opts?: SkipOptions) => number | false}
*/
const skipToLineEnd = skip(",; \t");
/**
* @type {(text: string, index: number | false, opts?: SkipOptions) => number | false}
*/
const skipEverythingButNewLine = skip(/[^\r\n]/);
/**
* @param {string} text
* @param {number | false} index
* @returns {number | false}
*/
function skipInlineComment(text, index) {
if (index === false) {
return false;
}
if (text.charAt(index) === "/" && text.charAt(index + 1) === "*") {
for (let i = index + 2; i < text.length; ++i) {
if (text.charAt(i) === "*" && text.charAt(i + 1) === "/") {
return i + 2;
}
}
}
return index;
}
/**
* @param {string} text
* @param {number | false} index
* @returns {number | false}
*/
function skipTrailingComment(text, index) {
if (index === false) {
return false;
}
if (text.charAt(index) === "/" && text.charAt(index + 1) === "/") {
return skipEverythingButNewLine(text, index);
}
return index;
} // This one doesn't use the above helper function because it wants to
// test \r\n in order and `skip` doesn't support ordering and we only
// want to skip one newline. It's simple to implement.
/**
* @param {string} text
* @param {number | false} index
* @param {SkipOptions=} opts
* @returns {number | false}
*/
function skipNewline(text, index, opts) {
const backwards = opts && opts.backwards;
if (index === false) {
return false;
}
const atIndex = text.charAt(index);
if (backwards) {
if (text.charAt(index - 1) === "\r" && atIndex === "\n") {
return index - 2;
}
if (atIndex === "\n" || atIndex === "\r" || atIndex === "\u2028" || atIndex === "\u2029") {
return index - 1;
}
} else {
if (atIndex === "\r" && text.charAt(index + 1) === "\n") {
return index + 2;
}
if (atIndex === "\n" || atIndex === "\r" || atIndex === "\u2028" || atIndex === "\u2029") {
return index + 1;
}
}
return index;
}
/**
* @param {string} text
* @param {number} index
* @param {SkipOptions=} opts
* @returns {boolean}
*/
function hasNewline(text, index, opts) {
opts = opts || {};
const idx = skipSpaces(text, opts.backwards ? index - 1 : index, opts);
const idx2 = skipNewline(text, idx, opts);
return idx !== idx2;
}
/**
* @param {string} text
* @param {number} start
* @param {number} end
* @returns {boolean}
*/
function hasNewlineInRange(text, start, end) {
for (let i = start; i < end; ++i) {
if (text.charAt(i) === "\n") {
return true;
}
}
return false;
} // Note: this function doesn't ignore leading comments unlike isNextLineEmpty
/**
* @template N
* @param {string} text
* @param {N} node
* @param {(node: N) => number} locStart
*/
function isPreviousLineEmpty(text, node, locStart) {
/** @type {number | false} */
let idx = locStart(node) - 1;
idx = skipSpaces(text, idx, {
backwards: true
});
idx = skipNewline(text, idx, {
backwards: true
});
idx = skipSpaces(text, idx, {
backwards: true
});
const idx2 = skipNewline(text, idx, {
backwards: true
});
return idx !== idx2;
}
/**
* @param {string} text
* @param {number} index
* @returns {boolean}
*/
function isNextLineEmptyAfterIndex(text, index) {
/** @type {number | false} */
let oldIdx = null;
/** @type {number | false} */
let idx = index;
while (idx !== oldIdx) {
// We need to skip all the potential trailing inline comments
oldIdx = idx;
idx = skipToLineEnd(text, idx);
idx = skipInlineComment(text, idx);
idx = skipSpaces(text, idx);
}
idx = skipTrailingComment(text, idx);
idx = skipNewline(text, idx);
return idx !== false && hasNewline(text, idx);
}
/**
* @template N
* @param {string} text
* @param {N} node
* @param {(node: N) => number} locEnd
* @returns {boolean}
*/
function isNextLineEmpty(text, node, locEnd) {
return isNextLineEmptyAfterIndex(text, locEnd(node));
}
/**
* @param {string} text
* @param {number} idx
* @returns {number | false}
*/
function getNextNonSpaceNonCommentCharacterIndexWithStartIndex(text, idx) {
/** @type {number | false} */
let oldIdx = null;
/** @type {number | false} */
let nextIdx = idx;
while (nextIdx !== oldIdx) {
oldIdx = nextIdx;
nextIdx = skipSpaces(text, nextIdx);
nextIdx = skipInlineComment(text, nextIdx);
nextIdx = skipTrailingComment(text, nextIdx);
nextIdx = skipNewline(text, nextIdx);
}
return nextIdx;
}
/**
* @template N
* @param {string} text
* @param {N} node
* @param {(node: N) => number} locEnd
* @returns {number | false}
*/
function getNextNonSpaceNonCommentCharacterIndex(text, node, locEnd) {
return getNextNonSpaceNonCommentCharacterIndexWithStartIndex(text, locEnd(node));
}
/**
* @template N
* @param {string} text
* @param {N} node
* @param {(node: N) => number} locEnd
* @returns {string}
*/
function getNextNonSpaceNonCommentCharacter(text, node, locEnd) {
return text.charAt( // @ts-ignore => TBD: can return false, should we define a fallback?
getNextNonSpaceNonCommentCharacterIndex(text, node, locEnd));
}
/**
* @param {string} text
* @param {number} index
* @param {SkipOptions=} opts
* @returns {boolean}
*/
function hasSpaces(text, index, opts) {
opts = opts || {};
const idx = skipSpaces(text, opts.backwards ? index - 1 : index, opts);
return idx !== index;
}
/**
* @param {{range?: [number, number], start?: number}} node
* @param {number} index
*/
function setLocStart(node, index) {
if (node.range) {
node.range[0] = index;
} else {
node.start = index;
}
}
/**
* @param {{range?: [number, number], end?: number}} node
* @param {number} index
*/
function setLocEnd(node, index) {
if (node.range) {
node.range[1] = index;
} else {
node.end = index;
}
}
const PRECEDENCE = {};
[["|>"], ["??"], ["||"], ["&&"], ["|"], ["^"], ["&"], ["==", "===", "!=", "!=="], ["<", ">", "<=", ">=", "in", "instanceof"], [">>", "<<", ">>>"], ["+", "-"], ["*", "/", "%"], ["**"]].forEach((tier, i) => {
tier.forEach(op => {
PRECEDENCE[op] = i;
});
});
function getPrecedence(op) {
return PRECEDENCE[op];
}
const equalityOperators = {
"==": true,
"!=": true,
"===": true,
"!==": true
};
const multiplicativeOperators = {
"*": true,
"/": true,
"%": true
};
const bitshiftOperators = {
">>": true,
">>>": true,
"<<": true
};
function shouldFlatten(parentOp, nodeOp) {
if (getPrecedence(nodeOp) !== getPrecedence(parentOp)) {
return false;
} // ** is right-associative
// x ** y ** z --> x ** (y ** z)
if (parentOp === "**") {
return false;
} // x == y == z --> (x == y) == z
if (equalityOperators[parentOp] && equalityOperators[nodeOp]) {
return false;
} // x * y % z --> (x * y) % z
if (nodeOp === "%" && multiplicativeOperators[parentOp] || parentOp === "%" && multiplicativeOperators[nodeOp]) {
return false;
} // x * y / z --> (x * y) / z
// x / y * z --> (x / y) * z
if (nodeOp !== parentOp && multiplicativeOperators[nodeOp] && multiplicativeOperators[parentOp]) {
return false;
} // x << y << z --> (x << y) << z
if (bitshiftOperators[parentOp] && bitshiftOperators[nodeOp]) {
return false;
}
return true;
}
function isBitwiseOperator(operator) {
return !!bitshiftOperators[operator] || operator === "|" || operator === "^" || operator === "&";
} // Tests if an expression starts with `{`, or (if forbidFunctionClassAndDoExpr
// holds) `function`, `class`, or `do {}`. Will be overzealous if there's
// already necessary grouping parentheses.
function startsWithNoLookaheadToken(node, forbidFunctionClassAndDoExpr) {
node = getLeftMost(node);
switch (node.type) {
case "FunctionExpression":
case "ClassExpression":
case "DoExpression":
return forbidFunctionClassAndDoExpr;
case "ObjectExpression":
return true;
case "MemberExpression":
case "OptionalMemberExpression":
return startsWithNoLookaheadToken(node.object, forbidFunctionClassAndDoExpr);
case "TaggedTemplateExpression":
if (node.tag.type === "FunctionExpression") {
// IIFEs are always already parenthesized
return false;
}
return startsWithNoLookaheadToken(node.tag, forbidFunctionClassAndDoExpr);
case "CallExpression":
case "OptionalCallExpression":
if (node.callee.type === "FunctionExpression") {
// IIFEs are always already parenthesized
return false;
}
return startsWithNoLookaheadToken(node.callee, forbidFunctionClassAndDoExpr);
case "ConditionalExpression":
return startsWithNoLookaheadToken(node.test, forbidFunctionClassAndDoExpr);
case "UpdateExpression":
return !node.prefix && startsWithNoLookaheadToken(node.argument, forbidFunctionClassAndDoExpr);
case "BindExpression":
return node.object && startsWithNoLookaheadToken(node.object, forbidFunctionClassAndDoExpr);
case "SequenceExpression":
return startsWithNoLookaheadToken(node.expressions[0], forbidFunctionClassAndDoExpr);
case "TSAsExpression":
return startsWithNoLookaheadToken(node.expression, forbidFunctionClassAndDoExpr);
default:
return false;
}
}
function getLeftMost(node) {
if (node.left) {
return getLeftMost(node.left);
}
return node;
}
/**
* @param {string} value
* @param {number} tabWidth
* @param {number=} startIndex
* @returns {number}
*/
function getAlignmentSize(value, tabWidth, startIndex) {
startIndex = startIndex || 0;
let size = 0;
for (let i = startIndex; i < value.length; ++i) {
if (value[i] === "\t") {
// Tabs behave in a way that they are aligned to the nearest
// multiple of tabWidth:
// 0 -> 4, 1 -> 4, 2 -> 4, 3 -> 4
// 4 -> 8, 5 -> 8, 6 -> 8, 7 -> 8 ...
size = size + tabWidth - size % tabWidth;
} else {
size++;
}
}
return size;
}
/**
* @param {string} value
* @param {number} tabWidth
* @returns {number}
*/
function getIndentSize(value, tabWidth) {
const lastNewlineIndex = value.lastIndexOf("\n");
if (lastNewlineIndex === -1) {
return 0;
}
return getAlignmentSize( // All the leading whitespaces
value.slice(lastNewlineIndex + 1).match(/^[ \t]*/)[0], tabWidth);
}
/**
* @typedef {'"' | "'"} Quote
*/
/**
*
* @param {string} raw
* @param {Quote} preferredQuote
* @returns {Quote}
*/
function getPreferredQuote(raw, preferredQuote) {
// `rawContent` is the string exactly like it appeared in the input source
// code, without its enclosing quotes.
const rawContent = raw.slice(1, -1);
/** @type {{ quote: '"', regex: RegExp }} */
const double = {
quote: '"',
regex: /"/g
};
/** @type {{ quote: "'", regex: RegExp }} */
const single = {
quote: "'",
regex: /'/g
};
const preferred = preferredQuote === "'" ? single : double;
const alternate = preferred === single ? double : single;
let result = preferred.quote; // If `rawContent` contains at least one of the quote preferred for enclosing
// the string, we might want to enclose with the alternate quote instead, to
// minimize the number of escaped quotes.
if (rawContent.includes(preferred.quote) || rawContent.includes(alternate.quote)) {
const numPreferredQuotes = (rawContent.match(preferred.regex) || []).length;
const numAlternateQuotes = (rawContent.match(alternate.regex) || []).length;
result = numPreferredQuotes > numAlternateQuotes ? alternate.quote : preferred.quote;
}
return result;
}
function printString(raw, options, isDirectiveLiteral) {
// `rawContent` is the string exactly like it appeared in the input source
// code, without its enclosing quotes.
const rawContent = raw.slice(1, -1); // Check for the alternate quote, to determine if we're allowed to swap
// the quotes on a DirectiveLiteral.
const canChangeDirectiveQuotes = !rawContent.includes('"') && !rawContent.includes("'");
/** @type {Quote} */
const enclosingQuote = options.parser === "json" ? '"' : options.__isInHtmlAttribute ? "'" : getPreferredQuote(raw, options.singleQuote ? "'" : '"'); // Directives are exact code unit sequences, which means that you can't
// change the escape sequences they use.
// See https://github.com/prettier/prettier/issues/1555
// and https://tc39.github.io/ecma262/#directive-prologue
if (isDirectiveLiteral) {
if (canChangeDirectiveQuotes) {
return enclosingQuote + rawContent + enclosingQuote;
}
return raw;
} // It might sound unnecessary to use `makeString` even if the string already
// is enclosed with `enclosingQuote`, but it isn't. The string could contain
// unnecessary escapes (such as in `"\'"`). Always using `makeString` makes
// sure that we consistently output the minimum amount of escaped quotes.
return makeString(rawContent, enclosingQuote, !(options.parser === "css" || options.parser === "less" || options.parser === "scss" || options.embeddedInHtml));
}
/**
* @param {string} rawContent
* @param {Quote} enclosingQuote
* @param {boolean=} unescapeUnnecessaryEscapes
* @returns {string}
*/
function makeString(rawContent, enclosingQuote, unescapeUnnecessaryEscapes) {
const otherQuote = enclosingQuote === '"' ? "'" : '"'; // Matches _any_ escape and unescaped quotes (both single and double).
const regex = /\\([\s\S])|(['"])/g; // Escape and unescape single and double quotes as needed to be able to
// enclose `rawContent` with `enclosingQuote`.
const newContent = rawContent.replace(regex, (match, escaped, quote) => {
// If we matched an escape, and the escaped character is a quote of the
// other type than we intend to enclose the string with, there's no need for
// it to be escaped, so return it _without_ the backslash.
if (escaped === otherQuote) {
return escaped;
} // If we matched an unescaped quote and it is of the _same_ type as we
// intend to enclose the string with, it must be escaped, so return it with
// a backslash.
if (quote === enclosingQuote) {
return "\\" + quote;
}
if (quote) {
return quote;
} // Unescape any unnecessarily escaped character.
// Adapted from https://github.com/eslint/eslint/blob/de0b4ad7bd820ade41b1f606008bea68683dc11a/lib/rules/no-useless-escape.js#L27
return unescapeUnnecessaryEscapes && /^[^\\nrvtbfux\r\n\u2028\u2029"'0-7]$/.test(escaped) ? escaped : "\\" + escaped;
});
return enclosingQuote + newContent + enclosingQuote;
}
function printNumber(rawNumber) {
return rawNumber.toLowerCase() // Remove unnecessary plus and zeroes from scientific notation.
.replace(/^([+-]?[\d.]+e)(?:\+|(-))?0*(\d)/, "$1$2$3") // Remove unnecessary scientific notation (1e0).
.replace(/^([+-]?[\d.]+)e[+-]?0+$/, "$1") // Make sure numbers always start with a digit.
.replace(/^([+-])?\./, "$10.") // Remove extraneous trailing decimal zeroes.
.replace(/(\.\d+?)0+(?=e|$)/, "$1") // Remove trailing dot.
.replace(/\.(?=e|$)/, "");
}
/**
* @param {string} str
* @param {string} target
* @returns {number}
*/
function getMaxContinuousCount(str, target) {
const results = str.match(new RegExp("(".concat(escapeStringRegexp$2(target), ")+"), "g"));
if (results === null) {
return 0;
}
return results.reduce((maxCount, result) => Math.max(maxCount, result.length / target.length), 0);
}
function getMinNotPresentContinuousCount(str, target) {
const matches = str.match(new RegExp("(".concat(escapeStringRegexp$2(target), ")+"), "g"));
if (matches === null) {
return 0;
}
const countPresent = new Map();
let max = 0;
for (const match of matches) {
const count = match.length / target.length;
countPresent.set(count, true);
if (count > max) {
max = count;
}
}
for (let i = 1; i < max; i++) {
if (!countPresent.get(i)) {
return i;
}
}
return max + 1;
}
/**
* @param {string} text
* @returns {number}
*/
function getStringWidth(text) {
if (!text) {
return 0;
} // shortcut to avoid needless string `RegExp`s, replacements, and allocations within `string-width`
if (!notAsciiRegex.test(text)) {
return text.length;
}
return stringWidth_1(text);
}
function hasIgnoreComment(path) {
const node = path.getValue();
return hasNodeIgnoreComment(node);
}
function hasNodeIgnoreComment(node) {
return node && (node.comments && node.comments.length > 0 && node.comments.some(comment => isNodeIgnoreComment(comment) && !comment.unignore) || node.prettierIgnore);
}
function isNodeIgnoreComment(comment) {
return comment.value.trim() === "prettier-ignore";
}
function addCommentHelper(node, comment) {
const comments = node.comments || (node.comments = []);
comments.push(comment);
comment.printed = false; // For some reason, TypeScript parses `// x` inside of JSXText as a comment
// We already "print" it via the raw text, we don't need to re-print it as a
// comment
if (node.type === "JSXText") {
comment.printed = true;
}
}
function addLeadingComment(node, comment) {
comment.leading = true;
comment.trailing = false;
addCommentHelper(node, comment);
}
function addDanglingComment(node, comment) {
comment.leading = false;
comment.trailing = false;
addCommentHelper(node, comment);
}
function addTrailingComment(node, comment) {
comment.leading = false;
comment.trailing = true;
addCommentHelper(node, comment);
}
function isWithinParentArrayProperty(path, propertyName) {
const node = path.getValue();
const parent = path.getParentNode();
if (parent == null) {
return false;
}
if (!Array.isArray(parent[propertyName])) {
return false;
}
const key = path.getName();
return parent[propertyName][key] === node;
}
function replaceEndOfLineWith(text, replacement) {
const parts = [];
for (const part of text.split("\n")) {
if (parts.length !== 0) {
parts.push(replacement);
}
parts.push(part);
}
return parts;
}
var util$1 = {
replaceEndOfLineWith,
getStringWidth,
getMaxContinuousCount,
getMinNotPresentContinuousCount,
getPrecedence,
shouldFlatten,
isBitwiseOperator,
getPenultimate,
getLast,
getNextNonSpaceNonCommentCharacterIndexWithStartIndex,
getNextNonSpaceNonCommentCharacterIndex,
getNextNonSpaceNonCommentCharacter,
skip,
skipWhitespace,
skipSpaces,
skipToLineEnd,
skipEverythingButNewLine,
skipInlineComment,
skipTrailingComment,
skipNewline,
isNextLineEmptyAfterIndex,
isNextLineEmpty,
isPreviousLineEmpty,
hasNewline,
hasNewlineInRange,
hasSpaces,
setLocStart,
setLocEnd,
startsWithNoLookaheadToken,
getAlignmentSize,
getIndentSize,
getPreferredQuote,
printString,
printNumber,
hasIgnoreComment,
hasNodeIgnoreComment,
isNodeIgnoreComment,
makeString,
addLeadingComment,
addDanglingComment,
addTrailingComment,
isWithinParentArrayProperty
};
function guessEndOfLine(text) {
const index = text.indexOf("\r");
if (index >= 0) {
return text.charAt(index + 1) === "\n" ? "crlf" : "cr";
}
return "lf";
}
function convertEndOfLineToChars(value) {
switch (value) {
case "cr":
return "\r";
case "crlf":
return "\r\n";
default:
return "\n";
}
}
var endOfLine = {
guessEndOfLine,
convertEndOfLineToChars
};
const {
getStringWidth: getStringWidth$1
} = util$1;
const {
convertEndOfLineToChars: convertEndOfLineToChars$1
} = endOfLine;
const {
concat: concat$1,
fill: fill$1,
cursor: cursor$1
} = docBuilders;
/** @type {Record} */
let groupModeMap;
const MODE_BREAK = 1;
const MODE_FLAT = 2;
function rootIndent() {
return {
value: "",
length: 0,
queue: []
};
}
function makeIndent(ind, options) {
return generateInd(ind, {
type: "indent"
}, options);
}
function makeAlign(ind, n, options) {
return n === -Infinity ? ind.root || rootIndent() : n < 0 ? generateInd(ind, {
type: "dedent"
}, options) : !n ? ind : n.type === "root" ? Object.assign({}, ind, {
root: ind
}) : typeof n === "string" ? generateInd(ind, {
type: "stringAlign",
n
}, options) : generateInd(ind, {
type: "numberAlign",
n
}, options);
}
function generateInd(ind, newPart, options) {
const queue = newPart.type === "dedent" ? ind.queue.slice(0, -1) : ind.queue.concat(newPart);
let value = "";
let length = 0;
let lastTabs = 0;
let lastSpaces = 0;
for (const part of queue) {
switch (part.type) {
case "indent":
flush();
if (options.useTabs) {
addTabs(1);
} else {
addSpaces(options.tabWidth);
}
break;
case "stringAlign":
flush();
value += part.n;
length += part.n.length;
break;
case "numberAlign":
lastTabs += 1;
lastSpaces += part.n;
break;
/* istanbul ignore next */
default:
throw new Error("Unexpected type '".concat(part.type, "'"));
}
}
flushSpaces();
return Object.assign({}, ind, {
value,
length,
queue
});
function addTabs(count) {
value += "\t".repeat(count);
length += options.tabWidth * count;
}
function addSpaces(count) {
value += " ".repeat(count);
length += count;
}
function flush() {
if (options.useTabs) {
flushTabs();
} else {
flushSpaces();
}
}
function flushTabs() {
if (lastTabs > 0) {
addTabs(lastTabs);
}
resetLast();
}
function flushSpaces() {
if (lastSpaces > 0) {
addSpaces(lastSpaces);
}
resetLast();
}
function resetLast() {
lastTabs = 0;
lastSpaces = 0;
}
}
function trim$1(out) {
if (out.length === 0) {
return 0;
}
let trimCount = 0; // Trim whitespace at the end of line
while (out.length > 0 && typeof out[out.length - 1] === "string" && out[out.length - 1].match(/^[ \t]*$/)) {
trimCount += out.pop().length;
}
if (out.length && typeof out[out.length - 1] === "string") {
const trimmed = out[out.length - 1].replace(/[ \t]*$/, "");
trimCount += out[out.length - 1].length - trimmed.length;
out[out.length - 1] = trimmed;
}
return trimCount;
}
function fits(next, restCommands, width, options, mustBeFlat) {
let restIdx = restCommands.length;
const cmds = [next]; // `out` is only used for width counting because `trim` requires to look
// backwards for space characters.
const out = [];
while (width >= 0) {
if (cmds.length === 0) {
if (restIdx === 0) {
return true;
}
cmds.push(restCommands[restIdx - 1]);
restIdx--;
continue;
}
const [ind, mode, doc] = cmds.pop();
if (typeof doc === "string") {
out.push(doc);
width -= getStringWidth$1(doc);
} else {
switch (doc.type) {
case "concat":
for (let i = doc.parts.length - 1; i >= 0; i--) {
cmds.push([ind, mode, doc.parts[i]]);
}
break;
case "indent":
cmds.push([makeIndent(ind, options), mode, doc.contents]);
break;
case "align":
cmds.push([makeAlign(ind, doc.n, options), mode, doc.contents]);
break;
case "trim":
width += trim$1(out);
break;
case "group":
if (mustBeFlat && doc.break) {
return false;
}
cmds.push([ind, doc.break ? MODE_BREAK : mode, doc.contents]);
if (doc.id) {
groupModeMap[doc.id] = cmds[cmds.length - 1][1];
}
break;
case "fill":
for (let i = doc.parts.length - 1; i >= 0; i--) {
cmds.push([ind, mode, doc.parts[i]]);
}
break;
case "if-break":
{
const groupMode = doc.groupId ? groupModeMap[doc.groupId] : mode;
if (groupMode === MODE_BREAK) {
if (doc.breakContents) {
cmds.push([ind, mode, doc.breakContents]);
}
}
if (groupMode === MODE_FLAT) {
if (doc.flatContents) {
cmds.push([ind, mode, doc.flatContents]);
}
}
break;
}
case "line":
switch (mode) {
// fallthrough
case MODE_FLAT:
if (!doc.hard) {
if (!doc.soft) {
out.push(" ");
width -= 1;
}
break;
}
return true;
case MODE_BREAK:
return true;
}
break;
}
}
}
return false;
}
function printDocToString(doc, options) {
groupModeMap = {};
const width = options.printWidth;
const newLine = convertEndOfLineToChars$1(options.endOfLine);
let pos = 0; // cmds is basically a stack. We've turned a recursive call into a
// while loop which is much faster. The while loop below adds new
// cmds to the array instead of recursively calling `print`.
const cmds = [[rootIndent(), MODE_BREAK, doc]];
const out = [];
let shouldRemeasure = false;
let lineSuffix = [];
while (cmds.length !== 0) {
const [ind, mode, doc] = cmds.pop();
if (typeof doc === "string") {
const formatted = newLine !== "\n" && doc.includes("\n") ? doc.replace(/\n/g, newLine) : doc;
out.push(formatted);
pos += getStringWidth$1(formatted);
} else {
switch (doc.type) {
case "cursor":
out.push(cursor$1.placeholder);
break;
case "concat":
for (let i = doc.parts.length - 1; i >= 0; i--) {
cmds.push([ind, mode, doc.parts[i]]);
}
break;
case "indent":
cmds.push([makeIndent(ind, options), mode, doc.contents]);
break;
case "align":
cmds.push([makeAlign(ind, doc.n, options), mode, doc.contents]);
break;
case "trim":
pos -= trim$1(out);
break;
case "group":
switch (mode) {
case MODE_FLAT:
if (!shouldRemeasure) {
cmds.push([ind, doc.break ? MODE_BREAK : MODE_FLAT, doc.contents]);
break;
}
// fallthrough
case MODE_BREAK:
{
shouldRemeasure = false;
const next = [ind, MODE_FLAT, doc.contents];
const rem = width - pos;
if (!doc.break && fits(next, cmds, rem, options)) {
cmds.push(next);
} else {
// Expanded states are a rare case where a document
// can manually provide multiple representations of
// itself. It provides an array of documents
// going from the least expanded (most flattened)
// representation first to the most expanded. If a
// group has these, we need to manually go through
// these states and find the first one that fits.
if (doc.expandedStates) {
const mostExpanded = doc.expandedStates[doc.expandedStates.length - 1];
if (doc.break) {
cmds.push([ind, MODE_BREAK, mostExpanded]);
break;
} else {
for (let i = 1; i < doc.expandedStates.length + 1; i++) {
if (i >= doc.expandedStates.length) {
cmds.push([ind, MODE_BREAK, mostExpanded]);
break;
} else {
const state = doc.expandedStates[i];
const cmd = [ind, MODE_FLAT, state];
if (fits(cmd, cmds, rem, options)) {
cmds.push(cmd);
break;
}
}
}
}
} else {
cmds.push([ind, MODE_BREAK, doc.contents]);
}
}
break;
}
}
if (doc.id) {
groupModeMap[doc.id] = cmds[cmds.length - 1][1];
}
break;
// Fills each line with as much code as possible before moving to a new
// line with the same indentation.
//
// Expects doc.parts to be an array of alternating content and
// whitespace. The whitespace contains the linebreaks.
//
// For example:
// ["I", line, "love", line, "monkeys"]
// or
// [{ type: group, ... }, softline, { type: group, ... }]
//
// It uses this parts structure to handle three main layout cases:
// * The first two content items fit on the same line without
// breaking
// -> output the first content item and the whitespace "flat".
// * Only the first content item fits on the line without breaking
// -> output the first content item "flat" and the whitespace with
// "break".
// * Neither content item fits on the line without breaking
// -> output the first content item and the whitespace with "break".
case "fill":
{
const rem = width - pos;
const {
parts
} = doc;
if (parts.length === 0) {
break;
}
const [content, whitespace] = parts;
const contentFlatCmd = [ind, MODE_FLAT, content];
const contentBreakCmd = [ind, MODE_BREAK, content];
const contentFits = fits(contentFlatCmd, [], rem, options, true);
if (parts.length === 1) {
if (contentFits) {
cmds.push(contentFlatCmd);
} else {
cmds.push(contentBreakCmd);
}
break;
}
const whitespaceFlatCmd = [ind, MODE_FLAT, whitespace];
const whitespaceBreakCmd = [ind, MODE_BREAK, whitespace];
if (parts.length === 2) {
if (contentFits) {
cmds.push(whitespaceFlatCmd);
cmds.push(contentFlatCmd);
} else {
cmds.push(whitespaceBreakCmd);
cmds.push(contentBreakCmd);
}
break;
} // At this point we've handled the first pair (context, separator)
// and will create a new fill doc for the rest of the content.
// Ideally we wouldn't mutate the array here but copying all the
// elements to a new array would make this algorithm quadratic,
// which is unusable for large arrays (e.g. large texts in JSX).
parts.splice(0, 2);
const remainingCmd = [ind, mode, fill$1(parts)];
const secondContent = parts[0];
const firstAndSecondContentFlatCmd = [ind, MODE_FLAT, concat$1([content, whitespace, secondContent])];
const firstAndSecondContentFits = fits(firstAndSecondContentFlatCmd, [], rem, options, true);
if (firstAndSecondContentFits) {
cmds.push(remainingCmd);
cmds.push(whitespaceFlatCmd);
cmds.push(contentFlatCmd);
} else if (contentFits) {
cmds.push(remainingCmd);
cmds.push(whitespaceBreakCmd);
cmds.push(contentFlatCmd);
} else {
cmds.push(remainingCmd);
cmds.push(whitespaceBreakCmd);
cmds.push(contentBreakCmd);
}
break;
}
case "if-break":
{
const groupMode = doc.groupId ? groupModeMap[doc.groupId] : mode;
if (groupMode === MODE_BREAK) {
if (doc.breakContents) {
cmds.push([ind, mode, doc.breakContents]);
}
}
if (groupMode === MODE_FLAT) {
if (doc.flatContents) {
cmds.push([ind, mode, doc.flatContents]);
}
}
break;
}
case "line-suffix":
lineSuffix.push([ind, mode, doc.contents]);
break;
case "line-suffix-boundary":
if (lineSuffix.length > 0) {
cmds.push([ind, mode, {
type: "line",
hard: true
}]);
}
break;
case "line":
switch (mode) {
case MODE_FLAT:
if (!doc.hard) {
if (!doc.soft) {
out.push(" ");
pos += 1;
}
break;
} else {
// This line was forced into the output even if we
// were in flattened mode, so we need to tell the next
// group that no matter what, it needs to remeasure
// because the previous measurement didn't accurately
// capture the entire expression (this is necessary
// for nested groups)
shouldRemeasure = true;
}
// fallthrough
case MODE_BREAK:
if (lineSuffix.length) {
cmds.push([ind, mode, doc]);
cmds.push(...lineSuffix.reverse());
lineSuffix = [];
break;
}
if (doc.literal) {
if (ind.root) {
out.push(newLine, ind.root.value);
pos = ind.root.length;
} else {
out.push(newLine);
pos = 0;
}
} else {
pos -= trim$1(out);
out.push(newLine + ind.value);
pos = ind.length;
}
break;
}
break;
}
}
}
const cursorPlaceholderIndex = out.indexOf(cursor$1.placeholder);
if (cursorPlaceholderIndex !== -1) {
const otherCursorPlaceholderIndex = out.indexOf(cursor$1.placeholder, cursorPlaceholderIndex + 1);
const beforeCursor = out.slice(0, cursorPlaceholderIndex).join("");
const aroundCursor = out.slice(cursorPlaceholderIndex + 1, otherCursorPlaceholderIndex).join("");
const afterCursor = out.slice(otherCursorPlaceholderIndex + 1).join("");
return {
formatted: beforeCursor + aroundCursor + afterCursor,
cursorNodeStart: beforeCursor.length,
cursorNodeText: aroundCursor
};
}
return {
formatted: out.join("")
};
}
var docPrinter = {
printDocToString
};
const traverseDocOnExitStackMarker = {};
function traverseDoc(doc, onEnter, onExit, shouldTraverseConditionalGroups) {
const docsStack = [doc];
while (docsStack.length !== 0) {
const doc = docsStack.pop();
if (doc === traverseDocOnExitStackMarker) {
onExit(docsStack.pop());
continue;
}
let shouldRecurse = true;
if (onEnter) {
if (onEnter(doc) === false) {
shouldRecurse = false;
}
}
if (onExit) {
docsStack.push(doc);
docsStack.push(traverseDocOnExitStackMarker);
}
if (shouldRecurse) {
// When there are multiple parts to process,
// the parts need to be pushed onto the stack in reverse order,
// so that they are processed in the original order
// when the stack is popped.
if (doc.type === "concat" || doc.type === "fill") {
for (let ic = doc.parts.length, i = ic - 1; i >= 0; --i) {
docsStack.push(doc.parts[i]);
}
} else if (doc.type === "if-break") {
if (doc.flatContents) {
docsStack.push(doc.flatContents);
}
if (doc.breakContents) {
docsStack.push(doc.breakContents);
}
} else if (doc.type === "group" && doc.expandedStates) {
if (shouldTraverseConditionalGroups) {
for (let ic = doc.expandedStates.length, i = ic - 1; i >= 0; --i) {
docsStack.push(doc.expandedStates[i]);
}
} else {
docsStack.push(doc.contents);
}
} else if (doc.contents) {
docsStack.push(doc.contents);
}
}
}
}
function mapDoc(doc, cb) {
if (doc.type === "concat" || doc.type === "fill") {
const parts = doc.parts.map(part => mapDoc(part, cb));
return cb(Object.assign({}, doc, {
parts
}));
} else if (doc.type === "if-break") {
const breakContents = doc.breakContents && mapDoc(doc.breakContents, cb);
const flatContents = doc.flatContents && mapDoc(doc.flatContents, cb);
return cb(Object.assign({}, doc, {
breakContents,
flatContents
}));
} else if (doc.contents) {
const contents = mapDoc(doc.contents, cb);
return cb(Object.assign({}, doc, {
contents
}));
}
return cb(doc);
}
function findInDoc(doc, fn, defaultValue) {
let result = defaultValue;
let hasStopped = false;
function findInDocOnEnterFn(doc) {
const maybeResult = fn(doc);
if (maybeResult !== undefined) {
hasStopped = true;
result = maybeResult;
}
if (hasStopped) {
return false;
}
}
traverseDoc(doc, findInDocOnEnterFn);
return result;
}
function isEmpty(n) {
return typeof n === "string" && n.length === 0;
}
function isLineNextFn(doc) {
if (typeof doc === "string") {
return false;
}
if (doc.type === "line") {
return true;
}
}
function isLineNext(doc) {
return findInDoc(doc, isLineNextFn, false);
}
function willBreakFn(doc) {
if (doc.type === "group" && doc.break) {
return true;
}
if (doc.type === "line" && doc.hard) {
return true;
}
if (doc.type === "break-parent") {
return true;
}
}
function willBreak(doc) {
return findInDoc(doc, willBreakFn, false);
}
function breakParentGroup(groupStack) {
if (groupStack.length > 0) {
const parentGroup = groupStack[groupStack.length - 1]; // Breaks are not propagated through conditional groups because
// the user is expected to manually handle what breaks.
if (!parentGroup.expandedStates) {
parentGroup.break = true;
}
}
return null;
}
function propagateBreaks(doc) {
const alreadyVisitedSet = new Set();
const groupStack = [];
function propagateBreaksOnEnterFn(doc) {
if (doc.type === "break-parent") {
breakParentGroup(groupStack);
}
if (doc.type === "group") {
groupStack.push(doc);
if (alreadyVisitedSet.has(doc)) {
return false;
}
alreadyVisitedSet.add(doc);
}
}
function propagateBreaksOnExitFn(doc) {
if (doc.type === "group") {
const group = groupStack.pop();
if (group.break) {
breakParentGroup(groupStack);
}
}
}
traverseDoc(doc, propagateBreaksOnEnterFn, propagateBreaksOnExitFn,
/* shouldTraverseConditionalGroups */
true);
}
function removeLinesFn(doc) {
// Force this doc into flat mode by statically converting all
// lines into spaces (or soft lines into nothing). Hard lines
// should still output because there's too great of a chance
// of breaking existing assumptions otherwise.
if (doc.type === "line" && !doc.hard) {
return doc.soft ? "" : " ";
} else if (doc.type === "if-break") {
return doc.flatContents || "";
}
return doc;
}
function removeLines(doc) {
return mapDoc(doc, removeLinesFn);
}
function stripTrailingHardline(doc) {
// HACK remove ending hardline, original PR: #1984
if (doc.type === "concat" && doc.parts.length !== 0) {
const lastPart = doc.parts[doc.parts.length - 1];
if (lastPart.type === "concat") {
if (lastPart.parts.length === 2 && lastPart.parts[0].hard && lastPart.parts[1].type === "break-parent") {
return {
type: "concat",
parts: doc.parts.slice(0, -1)
};
}
return {
type: "concat",
parts: doc.parts.slice(0, -1).concat(stripTrailingHardline(lastPart))
};
}
}
return doc;
}
var docUtils = {
isEmpty,
willBreak,
isLineNext,
traverseDoc,
findInDoc,
mapDoc,
propagateBreaks,
removeLines,
stripTrailingHardline
};
function flattenDoc(doc) {
if (doc.type === "concat") {
const res = [];
for (let i = 0; i < doc.parts.length; ++i) {
const doc2 = doc.parts[i];
if (typeof doc2 !== "string" && doc2.type === "concat") {
res.push(...flattenDoc(doc2).parts);
} else {
const flattened = flattenDoc(doc2);
if (flattened !== "") {
res.push(flattened);
}
}
}
return Object.assign({}, doc, {
parts: res
});
} else if (doc.type === "if-break") {
return Object.assign({}, doc, {
breakContents: doc.breakContents != null ? flattenDoc(doc.breakContents) : null,
flatContents: doc.flatContents != null ? flattenDoc(doc.flatContents) : null
});
} else if (doc.type === "group") {
return Object.assign({}, doc, {
contents: flattenDoc(doc.contents),
expandedStates: doc.expandedStates ? doc.expandedStates.map(flattenDoc) : doc.expandedStates
});
} else if (doc.contents) {
return Object.assign({}, doc, {
contents: flattenDoc(doc.contents)
});
}
return doc;
}
function printDoc(doc) {
if (typeof doc === "string") {
return JSON.stringify(doc);
}
if (doc.type === "line") {
if (doc.literal) {
return "literalline";
}
if (doc.hard) {
return "hardline";
}
if (doc.soft) {
return "softline";
}
return "line";
}
if (doc.type === "break-parent") {
return "breakParent";
}
if (doc.type === "trim") {
return "trim";
}
if (doc.type === "concat") {
return "[" + doc.parts.map(printDoc).join(", ") + "]";
}
if (doc.type === "indent") {
return "indent(" + printDoc(doc.contents) + ")";
}
if (doc.type === "align") {
return doc.n === -Infinity ? "dedentToRoot(" + printDoc(doc.contents) + ")" : doc.n < 0 ? "dedent(" + printDoc(doc.contents) + ")" : doc.n.type === "root" ? "markAsRoot(" + printDoc(doc.contents) + ")" : "align(" + JSON.stringify(doc.n) + ", " + printDoc(doc.contents) + ")";
}
if (doc.type === "if-break") {
return "ifBreak(" + printDoc(doc.breakContents) + (doc.flatContents ? ", " + printDoc(doc.flatContents) : "") + ")";
}
if (doc.type === "group") {
if (doc.expandedStates) {
return "conditionalGroup(" + "[" + doc.expandedStates.map(printDoc).join(",") + "])";
}
return (doc.break ? "wrappedGroup" : "group") + "(" + printDoc(doc.contents) + ")";
}
if (doc.type === "fill") {
return "fill" + "(" + doc.parts.map(printDoc).join(", ") + ")";
}
if (doc.type === "line-suffix") {
return "lineSuffix(" + printDoc(doc.contents) + ")";
}
if (doc.type === "line-suffix-boundary") {
return "lineSuffixBoundary";
}
throw new Error("Unknown doc type " + doc.type);
}
var docDebug = {
printDocToDebug(doc) {
return printDoc(flattenDoc(doc));
}
};
var document = {
builders: docBuilders,
printer: docPrinter,
utils: docUtils,
debug: docDebug
};
const {
getMaxContinuousCount: getMaxContinuousCount$1,
getStringWidth: getStringWidth$2,
getAlignmentSize: getAlignmentSize$1,
getIndentSize: getIndentSize$1,
skip: skip$1,
skipWhitespace: skipWhitespace$1,
skipSpaces: skipSpaces$1,
skipNewline: skipNewline$1,
skipToLineEnd: skipToLineEnd$1,
skipEverythingButNewLine: skipEverythingButNewLine$1,
skipInlineComment: skipInlineComment$1,
skipTrailingComment: skipTrailingComment$1,
hasNewline: hasNewline$1,
hasNewlineInRange: hasNewlineInRange$1,
hasSpaces: hasSpaces$1,
isNextLineEmpty: isNextLineEmpty$1,
isNextLineEmptyAfterIndex: isNextLineEmptyAfterIndex$1,
isPreviousLineEmpty: isPreviousLineEmpty$1,
getNextNonSpaceNonCommentCharacterIndex: getNextNonSpaceNonCommentCharacterIndex$1,
makeString: makeString$1,
addLeadingComment: addLeadingComment$1,
addDanglingComment: addDanglingComment$1,
addTrailingComment: addTrailingComment$1
} = util$1;
var utilShared = {
getMaxContinuousCount: getMaxContinuousCount$1,
getStringWidth: getStringWidth$2,
getAlignmentSize: getAlignmentSize$1,
getIndentSize: getIndentSize$1,
skip: skip$1,
skipWhitespace: skipWhitespace$1,
skipSpaces: skipSpaces$1,
skipNewline: skipNewline$1,
skipToLineEnd: skipToLineEnd$1,
skipEverythingButNewLine: skipEverythingButNewLine$1,
skipInlineComment: skipInlineComment$1,
skipTrailingComment: skipTrailingComment$1,
hasNewline: hasNewline$1,
hasNewlineInRange: hasNewlineInRange$1,
hasSpaces: hasSpaces$1,
isNextLineEmpty: isNextLineEmpty$1,
isNextLineEmptyAfterIndex: isNextLineEmptyAfterIndex$1,
isPreviousLineEmpty: isPreviousLineEmpty$1,
getNextNonSpaceNonCommentCharacterIndex: getNextNonSpaceNonCommentCharacterIndex$1,
makeString: makeString$1,
addLeadingComment: addLeadingComment$1,
addDanglingComment: addDanglingComment$1,
addTrailingComment: addTrailingComment$1
};
const {
concat: concat$2,
line: line$1,
hardline: hardline$1,
breakParent: breakParent$1,
indent: indent$1,
lineSuffix: lineSuffix$1,
join: join$1,
cursor: cursor$2
} = document.builders;
const {
hasNewline: hasNewline$2,
skipNewline: skipNewline$2,
isPreviousLineEmpty: isPreviousLineEmpty$2
} = util$1;
const {
addLeadingComment: addLeadingComment$2,
addDanglingComment: addDanglingComment$2,
addTrailingComment: addTrailingComment$2
} = utilShared;
const childNodesCacheKey = Symbol("child-nodes");
function getSortedChildNodes(node, options, resultArray) {
if (!node) {
return;
}
const {
printer,
locStart,
locEnd
} = options;
if (resultArray) {
if (printer.canAttachComment && printer.canAttachComment(node)) {
// This reverse insertion sort almost always takes constant
// time because we almost always (maybe always?) append the
// nodes in order anyway.
let i;
for (i = resultArray.length - 1; i >= 0; --i) {
if (locStart(resultArray[i]) <= locStart(node) && locEnd(resultArray[i]) <= locEnd(node)) {
break;
}
}
resultArray.splice(i + 1, 0, node);
return;
}
} else if (node[childNodesCacheKey]) {
return node[childNodesCacheKey];
}
const childNodes = printer.getCommentChildNodes && printer.getCommentChildNodes(node, options) || typeof node === "object" && Object.keys(node).filter(n => n !== "enclosingNode" && n !== "precedingNode" && n !== "followingNode").map(n => node[n]);
if (!childNodes) {
return;
}
if (!resultArray) {
Object.defineProperty(node, childNodesCacheKey, {
value: resultArray = [],
enumerable: false
});
}
childNodes.forEach(childNode => {
getSortedChildNodes(childNode, options, resultArray);
});
return resultArray;
} // As efficiently as possible, decorate the comment object with
// .precedingNode, .enclosingNode, and/or .followingNode properties, at
// least one of which is guaranteed to be defined.
function decorateComment(node, comment, options) {
const {
locStart,
locEnd
} = options;
const childNodes = getSortedChildNodes(node, options);
let precedingNode;
let followingNode; // Time to dust off the old binary search robes and wizard hat.
let left = 0;
let right = childNodes.length;
while (left < right) {
const middle = left + right >> 1;
const child = childNodes[middle];
if (locStart(child) - locStart(comment) <= 0 && locEnd(comment) - locEnd(child) <= 0) {
// The comment is completely contained by this child node.
comment.enclosingNode = child;
decorateComment(child, comment, options);
return; // Abandon the binary search at this level.
}
if (locEnd(child) - locStart(comment) <= 0) {
// This child node falls completely before the comment.
// Because we will never consider this node or any nodes
// before it again, this node must be the closest preceding
// node we have encountered so far.
precedingNode = child;
left = middle + 1;
continue;
}
if (locEnd(comment) - locStart(child) <= 0) {
// This child node falls completely after the comment.
// Because we will never consider this node or any nodes after
// it again, this node must be the closest following node we
// have encountered so far.
followingNode = child;
right = middle;
continue;
}
/* istanbul ignore next */
throw new Error("Comment location overlaps with node location");
} // We don't want comments inside of different expressions inside of the same
// template literal to move to another expression.
if (comment.enclosingNode && comment.enclosingNode.type === "TemplateLiteral") {
const {
quasis
} = comment.enclosingNode;
const commentIndex = findExpressionIndexForComment(quasis, comment, options);
if (precedingNode && findExpressionIndexForComment(quasis, precedingNode, options) !== commentIndex) {
precedingNode = null;
}
if (followingNode && findExpressionIndexForComment(quasis, followingNode, options) !== commentIndex) {
followingNode = null;
}
}
if (precedingNode) {
comment.precedingNode = precedingNode;
}
if (followingNode) {
comment.followingNode = followingNode;
}
}
function attach(comments, ast, text, options) {
if (!Array.isArray(comments)) {
return;
}
const tiesToBreak = [];
const {
locStart,
locEnd
} = options;
comments.forEach((comment, i) => {
if (options.parser === "json" || options.parser === "json5" || options.parser === "__js_expression" || options.parser === "__vue_expression") {
if (locStart(comment) - locStart(ast) <= 0) {
addLeadingComment$2(ast, comment);
return;
}
if (locEnd(comment) - locEnd(ast) >= 0) {
addTrailingComment$2(ast, comment);
return;
}
}
decorateComment(ast, comment, options);
const {
precedingNode,
enclosingNode,
followingNode
} = comment;
const pluginHandleOwnLineComment = options.printer.handleComments && options.printer.handleComments.ownLine ? options.printer.handleComments.ownLine : () => false;
const pluginHandleEndOfLineComment = options.printer.handleComments && options.printer.handleComments.endOfLine ? options.printer.handleComments.endOfLine : () => false;
const pluginHandleRemainingComment = options.printer.handleComments && options.printer.handleComments.remaining ? options.printer.handleComments.remaining : () => false;
const isLastComment = comments.length - 1 === i;
if (hasNewline$2(text, locStart(comment), {
backwards: true
})) {
// If a comment exists on its own line, prefer a leading comment.
// We also need to check if it's the first line of the file.
if (pluginHandleOwnLineComment(comment, text, options, ast, isLastComment)) ; else if (followingNode) {
// Always a leading comment.
addLeadingComment$2(followingNode, comment);
} else if (precedingNode) {
addTrailingComment$2(precedingNode, comment);
} else if (enclosingNode) {
addDanglingComment$2(enclosingNode, comment);
} else {
// There are no nodes, let's attach it to the root of the ast
/* istanbul ignore next */
addDanglingComment$2(ast, comment);
}
} else if (hasNewline$2(text, locEnd(comment))) {
if (pluginHandleEndOfLineComment(comment, text, options, ast, isLastComment)) ; else if (precedingNode) {
// There is content before this comment on the same line, but
// none after it, so prefer a trailing comment of the previous node.
addTrailingComment$2(precedingNode, comment);
} else if (followingNode) {
addLeadingComment$2(followingNode, comment);
} else if (enclosingNode) {
addDanglingComment$2(enclosingNode, comment);
} else {
// There are no nodes, let's attach it to the root of the ast
/* istanbul ignore next */
addDanglingComment$2(ast, comment);
}
} else {
if (pluginHandleRemainingComment(comment, text, options, ast, isLastComment)) ; else if (precedingNode && followingNode) {
// Otherwise, text exists both before and after the comment on
// the same line. If there is both a preceding and following
// node, use a tie-breaking algorithm to determine if it should
// be attached to the next or previous node. In the last case,
// simply attach the right node;
const tieCount = tiesToBreak.length;
if (tieCount > 0) {
const lastTie = tiesToBreak[tieCount - 1];
if (lastTie.followingNode !== comment.followingNode) {
breakTies(tiesToBreak, text, options);
}
}
tiesToBreak.push(comment);
} else if (precedingNode) {
addTrailingComment$2(precedingNode, comment);
} else if (followingNode) {
addLeadingComment$2(followingNode, comment);
} else if (enclosingNode) {
addDanglingComment$2(enclosingNode, comment);
} else {
// There are no nodes, let's attach it to the root of the ast
/* istanbul ignore next */
addDanglingComment$2(ast, comment);
}
}
});
breakTies(tiesToBreak, text, options);
comments.forEach(comment => {
// These node references were useful for breaking ties, but we
// don't need them anymore, and they create cycles in the AST that
// may lead to infinite recursion if we don't delete them here.
delete comment.precedingNode;
delete comment.enclosingNode;
delete comment.followingNode;
});
}
function breakTies(tiesToBreak, text, options) {
const tieCount = tiesToBreak.length;
if (tieCount === 0) {
return;
}
const {
precedingNode,
followingNode,
enclosingNode
} = tiesToBreak[0];
const gapRegExp = options.printer.getGapRegex && options.printer.getGapRegex(enclosingNode) || /^[\s(]*$/;
let gapEndPos = options.locStart(followingNode); // Iterate backwards through tiesToBreak, examining the gaps
// between the tied comments. In order to qualify as leading, a
// comment must be separated from followingNode by an unbroken series of
// gaps (or other comments). Gaps should only contain whitespace or open
// parentheses.
let indexOfFirstLeadingComment;
for (indexOfFirstLeadingComment = tieCount; indexOfFirstLeadingComment > 0; --indexOfFirstLeadingComment) {
const comment = tiesToBreak[indexOfFirstLeadingComment - 1];
assert.strictEqual(comment.precedingNode, precedingNode);
assert.strictEqual(comment.followingNode, followingNode);
const gap = text.slice(options.locEnd(comment), gapEndPos);
if (gapRegExp.test(gap)) {
gapEndPos = options.locStart(comment);
} else {
// The gap string contained something other than whitespace or open
// parentheses.
break;
}
}
tiesToBreak.forEach((comment, i) => {
if (i < indexOfFirstLeadingComment) {
addTrailingComment$2(precedingNode, comment);
} else {
addLeadingComment$2(followingNode, comment);
}
});
tiesToBreak.length = 0;
}
function printComment(commentPath, options) {
const comment = commentPath.getValue();
comment.printed = true;
return options.printer.printComment(commentPath, options);
}
function findExpressionIndexForComment(quasis, comment, options) {
const startPos = options.locStart(comment) - 1;
for (let i = 1; i < quasis.length; ++i) {
if (startPos < getQuasiRange(quasis[i]).start) {
return i - 1;
}
} // We haven't found it, it probably means that some of the locations are off.
// Let's just return the first one.
/* istanbul ignore next */
return 0;
}
function getQuasiRange(expr) {
if (expr.start !== undefined) {
// Babel
return {
start: expr.start,
end: expr.end
};
} // Flow
return {
start: expr.range[0],
end: expr.range[1]
};
}
function printLeadingComment(commentPath, print, options) {
const comment = commentPath.getValue();
const contents = printComment(commentPath, options);
if (!contents) {
return "";
}
const isBlock = options.printer.isBlockComment && options.printer.isBlockComment(comment); // Leading block comments should see if they need to stay on the
// same line or not.
if (isBlock) {
const lineBreak = hasNewline$2(options.originalText, options.locEnd(comment)) ? hasNewline$2(options.originalText, options.locStart(comment), {
backwards: true
}) ? hardline$1 : line$1 : " ";
return concat$2([contents, lineBreak]);
}
return concat$2([contents, hardline$1]);
}
function printTrailingComment(commentPath, print, options) {
const comment = commentPath.getValue();
const contents = printComment(commentPath, options);
if (!contents) {
return "";
}
const isBlock = options.printer.isBlockComment && options.printer.isBlockComment(comment); // We don't want the line to break
// when the parentParentNode is a ClassDeclaration/-Expression
// And the parentNode is in the superClass property
const parentNode = commentPath.getNode(1);
const parentParentNode = commentPath.getNode(2);
const isParentSuperClass = parentParentNode && (parentParentNode.type === "ClassDeclaration" || parentParentNode.type === "ClassExpression") && parentParentNode.superClass === parentNode;
if (hasNewline$2(options.originalText, options.locStart(comment), {
backwards: true
})) {
// This allows comments at the end of nested structures:
// {
// x: 1,
// y: 2
// // A comment
// }
// Those kinds of comments are almost always leading comments, but
// here it doesn't go "outside" the block and turns it into a
// trailing comment for `2`. We can simulate the above by checking
// if this a comment on its own line; normal trailing comments are
// always at the end of another expression.
const isLineBeforeEmpty = isPreviousLineEmpty$2(options.originalText, comment, options.locStart);
return lineSuffix$1(concat$2([hardline$1, isLineBeforeEmpty ? hardline$1 : "", contents]));
} else if (isBlock || isParentSuperClass) {
// Trailing block comments never need a newline
return concat$2([" ", contents]);
}
return concat$2([lineSuffix$1(concat$2([" ", contents])), !isBlock ? breakParent$1 : ""]);
}
function printDanglingComments(path, options, sameIndent, filter) {
const parts = [];
const node = path.getValue();
if (!node || !node.comments) {
return "";
}
path.each(commentPath => {
const comment = commentPath.getValue();
if (comment && !comment.leading && !comment.trailing && (!filter || filter(comment))) {
parts.push(printComment(commentPath, options));
}
}, "comments");
if (parts.length === 0) {
return "";
}
if (sameIndent) {
return join$1(hardline$1, parts);
}
return indent$1(concat$2([hardline$1, join$1(hardline$1, parts)]));
}
function prependCursorPlaceholder(path, options, printed) {
if (path.getNode() === options.cursorNode && path.getValue()) {
return concat$2([cursor$2, printed, cursor$2]);
}
return printed;
}
function printComments(path, print, options, needsSemi) {
const value = path.getValue();
const printed = print(path);
const comments = value && value.comments;
if (!comments || comments.length === 0) {
return prependCursorPlaceholder(path, options, printed);
}
const leadingParts = [];
const trailingParts = [needsSemi ? ";" : "", printed];
path.each(commentPath => {
const comment = commentPath.getValue();
const {
leading,
trailing
} = comment;
if (leading) {
const contents = printLeadingComment(commentPath, print, options);
if (!contents) {
return;
}
leadingParts.push(contents);
const text = options.originalText;
const index = skipNewline$2(text, options.locEnd(comment));
if (index !== false && hasNewline$2(text, index)) {
leadingParts.push(hardline$1);
}
} else if (trailing) {
trailingParts.push(printTrailingComment(commentPath, print, options));
}
}, "comments");
return prependCursorPlaceholder(path, options, concat$2(leadingParts.concat(trailingParts)));
}
var comments = {
attach,
printComments,
printDanglingComments,
getSortedChildNodes
};
function getNodeHelper(path, count) {
const stackIndex = getNodeStackIndexHelper(path.stack, count);
return stackIndex === -1 ? null : path.stack[stackIndex];
}
function getNodeStackIndexHelper(stack, count) {
for (let i = stack.length - 1; i >= 0; i -= 2) {
const value = stack[i];
if (value && !Array.isArray(value) && --count < 0) {
return i;
}
}
return -1;
}
class FastPath {
constructor(value) {
this.stack = [value];
} // The name of the current property is always the penultimate element of
// this.stack, and always a String.
getName() {
const {
stack
} = this;
const {
length
} = stack;
if (length > 1) {
return stack[length - 2];
} // Since the name is always a string, null is a safe sentinel value to
// return if we do not know the name of the (root) value.
/* istanbul ignore next */
return null;
} // The value of the current property is always the final element of
// this.stack.
getValue() {
return getLast(this.stack);
}
getNode(count = 0) {
return getNodeHelper(this, count);
}
getParentNode(count = 0) {
return getNodeHelper(this, count + 1);
} // Temporarily push properties named by string arguments given after the
// callback function onto this.stack, then call the callback with a
// reference to this (modified) FastPath object. Note that the stack will
// be restored to its original state after the callback is finished, so it
// is probably a mistake to retain a reference to the path.
call(callback, ...names) {
const {
stack
} = this;
const {
length
} = stack;
let value = getLast(stack);
for (const name of names) {
value = value[name];
stack.push(name, value);
}
const result = callback(this);
stack.length = length;
return result;
}
callParent(callback, count = 0) {
const stackIndex = getNodeStackIndexHelper(this.stack, count + 1);
const parentValues = this.stack.splice(stackIndex + 1);
const result = callback(this);
this.stack.push(...parentValues);
return result;
} // Similar to FastPath.prototype.call, except that the value obtained by
// accessing this.getValue()[name1][name2]... should be array-like. The
// callback will be called with a reference to this path object for each
// element of the array.
each(callback, ...names) {
const {
stack
} = this;
const {
length
} = stack;
let value = getLast(stack);
for (const name of names) {
value = value[name];
stack.push(name, value);
}
for (let i = 0; i < value.length; ++i) {
if (i in value) {
stack.push(i, value[i]); // If the callback needs to know the value of i, call
// path.getName(), assuming path is the parameter name.
callback(this);
stack.length -= 2;
}
}
stack.length = length;
} // Similar to FastPath.prototype.each, except that the results of the
// callback function invocations are stored in an array and returned at
// the end of the iteration.
map(callback, ...names) {
const {
stack
} = this;
const {
length
} = stack;
let value = getLast(stack);
for (const name of names) {
value = value[name];
stack.push(name, value);
}
const result = new Array(value.length);
for (let i = 0; i < value.length; ++i) {
if (i in value) {
stack.push(i, value[i]);
result[i] = callback(this, i);
stack.length -= 2;
}
}
stack.length = length;
return result;
}
/**
* @param {...(
* | ((node: any, name: string | null, number: number | null) => boolean)
* | undefined
* )} predicates
*/
match(...predicates) {
let stackPointer = this.stack.length - 1;
let name = null;
let node = this.stack[stackPointer--];
for (const predicate of predicates) {
if (node === undefined) {
return false;
} // skip index/array
let number = null;
if (typeof name === "number") {
number = name;
name = this.stack[stackPointer--];
node = this.stack[stackPointer--];
}
if (predicate && !predicate(node, name, number)) {
return false;
}
name = this.stack[stackPointer--];
node = this.stack[stackPointer--];
}
return true;
}
}
var fastPath = FastPath;
const {
normalize: normalize$2
} = options$1;
function printSubtree(path, print, options, printAstToDoc) {
if (options.printer.embed) {
return options.printer.embed(path, print, (text, partialNextOptions) => textToDoc(text, partialNextOptions, options, printAstToDoc), options);
}
}
function textToDoc(text, partialNextOptions, parentOptions, printAstToDoc) {
const nextOptions = normalize$2(Object.assign({}, parentOptions, {}, partialNextOptions, {
parentParser: parentOptions.parser,
embeddedInHtml: !!(parentOptions.embeddedInHtml || parentOptions.parser === "html" || parentOptions.parser === "vue" || parentOptions.parser === "angular" || parentOptions.parser === "lwc"),
originalText: text
}), {
passThrough: true
});
const result = parser.parse(text, nextOptions);
const {
ast
} = result;
text = result.text;
const astComments = ast.comments;
delete ast.comments;
comments.attach(astComments, ast, text, nextOptions);
return printAstToDoc(ast, nextOptions);
}
var multiparser = {
printSubtree
};
const doc = document;
const docBuilders$1 = doc.builders;
const {
concat: concat$3,
hardline: hardline$2,
addAlignmentToDoc: addAlignmentToDoc$1
} = docBuilders$1;
const docUtils$1 = doc.utils;
/**
* Takes an abstract syntax tree (AST) and recursively converts it to a
* document (series of printing primitives).
*
* This is done by descending down the AST recursively. The recursion
* involves two functions that call each other:
*
* 1. printGenerically(), which is defined as an inner function here.
* It basically takes care of node caching.
* 2. callPluginPrintFunction(), which checks for some options, and
* ultimately calls the print() function provided by the plugin.
*
* The plugin function will call printGenerically() again for child nodes
* of the current node, which will do its housekeeping, then call the
* plugin function again, and so on.
*
* All the while, these functions pass a "path" variable around, which
* is a stack-like data structure (FastPath) that maintains the current
* state of the recursion. It is called "path", because it represents
* the path to the current node through the Abstract Syntax Tree.
*/
function printAstToDoc(ast, options, alignmentSize = 0) {
const {
printer
} = options;
if (printer.preprocess) {
ast = printer.preprocess(ast, options);
}
const cache = new Map();
function printGenerically(path, args) {
const node = path.getValue();
const shouldCache = node && typeof node === "object" && args === undefined;
if (shouldCache && cache.has(node)) {
return cache.get(node);
} // We let JSXElement print its comments itself because it adds () around
// UnionTypeAnnotation has to align the child without the comments
let res;
if (printer.willPrintOwnComments && printer.willPrintOwnComments(path, options)) {
res = callPluginPrintFunction(path, options, printGenerically, args);
} else {
// printComments will call the plugin print function and check for
// comments to print
res = comments.printComments(path, p => callPluginPrintFunction(p, options, printGenerically, args), options, args && args.needsSemi);
}
if (shouldCache) {
cache.set(node, res);
}
return res;
}
let doc = printGenerically(new fastPath(ast));
if (alignmentSize > 0) {
// Add a hardline to make the indents take effect
// It should be removed in index.js format()
doc = addAlignmentToDoc$1(concat$3([hardline$2, doc]), alignmentSize, options.tabWidth);
}
docUtils$1.propagateBreaks(doc);
return doc;
}
function callPluginPrintFunction(path, options, printPath, args) {
assert.ok(path instanceof fastPath);
const node = path.getValue();
const {
printer
} = options; // Escape hatch
if (printer.hasPrettierIgnore && printer.hasPrettierIgnore(path)) {
return options.originalText.slice(options.locStart(node), options.locEnd(node));
}
if (node) {
try {
// Potentially switch to a different parser
const sub = multiparser.printSubtree(path, printPath, options, printAstToDoc);
if (sub) {
return sub;
}
} catch (error) {
/* istanbul ignore if */
if (commonjsGlobal.PRETTIER_DEBUG) {
throw error;
} // Continue with current parser
}
}
return printer.print(path, options, printPath, args);
}
var astToDoc = printAstToDoc;
function findSiblingAncestors(startNodeAndParents, endNodeAndParents, opts) {
let resultStartNode = startNodeAndParents.node;
let resultEndNode = endNodeAndParents.node;
if (resultStartNode === resultEndNode) {
return {
startNode: resultStartNode,
endNode: resultEndNode
};
}
for (const endParent of endNodeAndParents.parentNodes) {
if (endParent.type !== "Program" && endParent.type !== "File" && opts.locStart(endParent) >= opts.locStart(startNodeAndParents.node)) {
resultEndNode = endParent;
} else {
break;
}
}
for (const startParent of startNodeAndParents.parentNodes) {
if (startParent.type !== "Program" && startParent.type !== "File" && opts.locEnd(startParent) <= opts.locEnd(endNodeAndParents.node)) {
resultStartNode = startParent;
} else {
break;
}
}
return {
startNode: resultStartNode,
endNode: resultEndNode
};
}
function findNodeAtOffset(node, offset, options, predicate, parentNodes) {
predicate = predicate || (() => true);
parentNodes = parentNodes || [];
const start = options.locStart(node, options.locStart);
const end = options.locEnd(node, options.locEnd);
if (start <= offset && offset <= end) {
for (const childNode of comments.getSortedChildNodes(node, options)) {
const childResult = findNodeAtOffset(childNode, offset, options, predicate, [node].concat(parentNodes));
if (childResult) {
return childResult;
}
}
if (predicate(node)) {
return {
node,
parentNodes
};
}
}
} // See https://www.ecma-international.org/ecma-262/5.1/#sec-A.5
function isSourceElement(opts, node) {
if (node == null) {
return false;
} // JS and JS like to avoid repetitions
const jsSourceElements = ["FunctionDeclaration", "BlockStatement", "BreakStatement", "ContinueStatement", "DebuggerStatement", "DoWhileStatement", "EmptyStatement", "ExpressionStatement", "ForInStatement", "ForStatement", "IfStatement", "LabeledStatement", "ReturnStatement", "SwitchStatement", "ThrowStatement", "TryStatement", "VariableDeclaration", "WhileStatement", "WithStatement", "ClassDeclaration", // ES 2015
"ImportDeclaration", // Module
"ExportDefaultDeclaration", // Module
"ExportNamedDeclaration", // Module
"ExportAllDeclaration", // Module
"TypeAlias", // Flow
"InterfaceDeclaration", // Flow, TypeScript
"TypeAliasDeclaration", // TypeScript
"ExportAssignment", // TypeScript
"ExportDeclaration" // TypeScript
];
const jsonSourceElements = ["ObjectExpression", "ArrayExpression", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral"];
const graphqlSourceElements = ["OperationDefinition", "FragmentDefinition", "VariableDefinition", "TypeExtensionDefinition", "ObjectTypeDefinition", "FieldDefinition", "DirectiveDefinition", "EnumTypeDefinition", "EnumValueDefinition", "InputValueDefinition", "InputObjectTypeDefinition", "SchemaDefinition", "OperationTypeDefinition", "InterfaceTypeDefinition", "UnionTypeDefinition", "ScalarTypeDefinition"];
switch (opts.parser) {
case "flow":
case "babel":
case "babel-flow":
case "babel-ts":
case "typescript":
return jsSourceElements.includes(node.type);
case "json":
return jsonSourceElements.includes(node.type);
case "graphql":
return graphqlSourceElements.includes(node.kind);
case "vue":
return node.tag !== "root";
}
return false;
}
function calculateRange(text, opts, ast) {
// Contract the range so that it has non-whitespace characters at its endpoints.
// This ensures we can format a range that doesn't end on a node.
const rangeStringOrig = text.slice(opts.rangeStart, opts.rangeEnd);
const startNonWhitespace = Math.max(opts.rangeStart + rangeStringOrig.search(/\S/), opts.rangeStart);
let endNonWhitespace;
for (endNonWhitespace = opts.rangeEnd; endNonWhitespace > opts.rangeStart; --endNonWhitespace) {
if (text[endNonWhitespace - 1].match(/\S/)) {
break;
}
}
const startNodeAndParents = findNodeAtOffset(ast, startNonWhitespace, opts, node => isSourceElement(opts, node));
const endNodeAndParents = findNodeAtOffset(ast, endNonWhitespace, opts, node => isSourceElement(opts, node));
if (!startNodeAndParents || !endNodeAndParents) {
return {
rangeStart: 0,
rangeEnd: 0
};
}
const siblingAncestors = findSiblingAncestors(startNodeAndParents, endNodeAndParents, opts);
const {
startNode,
endNode
} = siblingAncestors;
const rangeStart = Math.min(opts.locStart(startNode, opts.locStart), opts.locStart(endNode, opts.locStart));
const rangeEnd = Math.max(opts.locEnd(startNode, opts.locEnd), opts.locEnd(endNode, opts.locEnd));
return {
rangeStart,
rangeEnd
};
}
var rangeUtil = {
calculateRange,
findNodeAtOffset
};
var diff = getCjsExportFromNamespace(index_es6);
const normalizeOptions$1 = options$1.normalize;
const {
guessEndOfLine: guessEndOfLine$1,
convertEndOfLineToChars: convertEndOfLineToChars$2
} = endOfLine;
const {
printer: {
printDocToString: printDocToString$1
},
debug: {
printDocToDebug
}
} = document;
const BOM = "\uFEFF";
const CURSOR = Symbol("cursor");
const PLACEHOLDERS = {
cursorOffset: "<<>>",
rangeStart: "<<>>",
rangeEnd: "<<>>"
};
function ensureAllCommentsPrinted(astComments) {
if (!astComments) {
return;
}
for (let i = 0; i < astComments.length; ++i) {
if (util$1.isNodeIgnoreComment(astComments[i])) {
// If there's a prettier-ignore, we're not printing that sub-tree so we
// don't know if the comments was printed or not.
return;
}
}
astComments.forEach(comment => {
if (!comment.printed) {
throw new Error('Comment "' + comment.value.trim() + '" was not printed. Please report this error!');
}
delete comment.printed;
});
}
function attachComments(text, ast, opts) {
const astComments = ast.comments;
if (astComments) {
delete ast.comments;
comments.attach(astComments, ast, text, opts);
}
ast.tokens = [];
opts.originalText = opts.parser === "yaml" ? text : text.trimEnd();
return astComments;
}
function coreFormat(text, opts, addAlignmentSize) {
if (!text || !text.trim().length) {
return {
formatted: "",
cursorOffset: 0
};
}
addAlignmentSize = addAlignmentSize || 0;
const parsed = parser.parse(text, opts);
const {
ast
} = parsed;
text = parsed.text;
if (opts.cursorOffset >= 0) {
const nodeResult = rangeUtil.findNodeAtOffset(ast, opts.cursorOffset, opts);
if (nodeResult && nodeResult.node) {
opts.cursorNode = nodeResult.node;
}
}
const astComments = attachComments(text, ast, opts);
const doc = astToDoc(ast, opts, addAlignmentSize);
const result = printDocToString$1(doc, opts);
ensureAllCommentsPrinted(astComments); // Remove extra leading indentation as well as the added indentation after last newline
if (addAlignmentSize > 0) {
const trimmed = result.formatted.trim();
if (result.cursorNodeStart !== undefined) {
result.cursorNodeStart -= result.formatted.indexOf(trimmed);
}
result.formatted = trimmed + convertEndOfLineToChars$2(opts.endOfLine);
}
if (opts.cursorOffset >= 0) {
let oldCursorNodeStart;
let oldCursorNodeText;
let cursorOffsetRelativeToOldCursorNode;
let newCursorNodeStart;
let newCursorNodeText;
if (opts.cursorNode && result.cursorNodeText) {
oldCursorNodeStart = opts.locStart(opts.cursorNode);
oldCursorNodeText = text.slice(oldCursorNodeStart, opts.locEnd(opts.cursorNode));
cursorOffsetRelativeToOldCursorNode = opts.cursorOffset - oldCursorNodeStart;
newCursorNodeStart = result.cursorNodeStart;
newCursorNodeText = result.cursorNodeText;
} else {
oldCursorNodeStart = 0;
oldCursorNodeText = text;
cursorOffsetRelativeToOldCursorNode = opts.cursorOffset;
newCursorNodeStart = 0;
newCursorNodeText = result.formatted;
}
if (oldCursorNodeText === newCursorNodeText) {
return {
formatted: result.formatted,
cursorOffset: newCursorNodeStart + cursorOffsetRelativeToOldCursorNode
};
} // diff old and new cursor node texts, with a special cursor
// symbol inserted to find out where it moves to
const oldCursorNodeCharArray = oldCursorNodeText.split("");
oldCursorNodeCharArray.splice(cursorOffsetRelativeToOldCursorNode, 0, CURSOR);
const newCursorNodeCharArray = newCursorNodeText.split("");
const cursorNodeDiff = diff.diffArrays(oldCursorNodeCharArray, newCursorNodeCharArray);
let cursorOffset = newCursorNodeStart;
for (const entry of cursorNodeDiff) {
if (entry.removed) {
if (entry.value.includes(CURSOR)) {
break;
}
} else {
cursorOffset += entry.count;
}
}
return {
formatted: result.formatted,
cursorOffset
};
}
return {
formatted: result.formatted
};
}
function formatRange(text, opts) {
const parsed = parser.parse(text, opts);
const {
ast
} = parsed;
text = parsed.text;
const range = rangeUtil.calculateRange(text, opts, ast);
const {
rangeStart,
rangeEnd
} = range;
const rangeString = text.slice(rangeStart, rangeEnd); // Try to extend the range backwards to the beginning of the line.
// This is so we can detect indentation correctly and restore it.
// Use `Math.min` since `lastIndexOf` returns 0 when `rangeStart` is 0
const rangeStart2 = Math.min(rangeStart, text.lastIndexOf("\n", rangeStart) + 1);
const indentString = text.slice(rangeStart2, rangeStart);
const alignmentSize = util$1.getAlignmentSize(indentString, opts.tabWidth);
const rangeResult = coreFormat(rangeString, Object.assign({}, opts, {
rangeStart: 0,
rangeEnd: Infinity,
// track the cursor offset only if it's within our range
cursorOffset: opts.cursorOffset >= rangeStart && opts.cursorOffset < rangeEnd ? opts.cursorOffset - rangeStart : -1
}), alignmentSize); // Since the range contracts to avoid trailing whitespace,
// we need to remove the newline that was inserted by the `format` call.
const rangeTrimmed = rangeResult.formatted.trimEnd();
const rangeLeft = text.slice(0, rangeStart);
const rangeRight = text.slice(rangeEnd);
let {
cursorOffset
} = opts;
if (opts.cursorOffset >= rangeEnd) {
// handle the case where the cursor was past the end of the range
cursorOffset = opts.cursorOffset - rangeEnd + (rangeStart + rangeTrimmed.length);
} else if (rangeResult.cursorOffset !== undefined) {
// handle the case where the cursor was in the range
cursorOffset = rangeResult.cursorOffset + rangeStart;
} // keep the cursor as it was if it was before the start of the range
let formatted;
if (opts.endOfLine === "lf") {
formatted = rangeLeft + rangeTrimmed + rangeRight;
} else {
const eol = convertEndOfLineToChars$2(opts.endOfLine);
if (cursorOffset >= 0) {
const parts = [rangeLeft, rangeTrimmed, rangeRight];
let partIndex = 0;
let partOffset = cursorOffset;
while (partIndex < parts.length) {
const part = parts[partIndex];
if (partOffset < part.length) {
parts[partIndex] = parts[partIndex].slice(0, partOffset) + PLACEHOLDERS.cursorOffset + parts[partIndex].slice(partOffset);
break;
}
partIndex++;
partOffset -= part.length;
}
const [newRangeLeft, newRangeTrimmed, newRangeRight] = parts;
formatted = (newRangeLeft.replace(/\n/g, eol) + newRangeTrimmed + newRangeRight.replace(/\n/g, eol)).replace(PLACEHOLDERS.cursorOffset, (_, index) => {
cursorOffset = index;
return "";
});
} else {
formatted = rangeLeft.replace(/\n/g, eol) + rangeTrimmed + rangeRight.replace(/\n/g, eol);
}
}
return {
formatted,
cursorOffset
};
}
function format(text, opts) {
const selectedParser = parser.resolveParser(opts);
const hasPragma = !selectedParser.hasPragma || selectedParser.hasPragma(text);
if (opts.requirePragma && !hasPragma) {
return {
formatted: text
};
}
if (opts.endOfLine === "auto") {
opts.endOfLine = guessEndOfLine$1(text);
}
const hasCursor = opts.cursorOffset >= 0;
const hasRangeStart = opts.rangeStart > 0;
const hasRangeEnd = opts.rangeEnd < text.length; // get rid of CR/CRLF parsing
if (text.includes("\r")) {
const offsetKeys = [hasCursor && "cursorOffset", hasRangeStart && "rangeStart", hasRangeEnd && "rangeEnd"].filter(Boolean).sort((aKey, bKey) => opts[aKey] - opts[bKey]);
for (let i = offsetKeys.length - 1; i >= 0; i--) {
const key = offsetKeys[i];
text = text.slice(0, opts[key]) + PLACEHOLDERS[key] + text.slice(opts[key]);
}
text = text.replace(/\r\n?/g, "\n");
for (let i = 0; i < offsetKeys.length; i++) {
const key = offsetKeys[i];
text = text.replace(PLACEHOLDERS[key], (_, index) => {
opts[key] = index;
return "";
});
}
}
const hasUnicodeBOM = text.charAt(0) === BOM;
if (hasUnicodeBOM) {
text = text.slice(1);
if (hasCursor) {
opts.cursorOffset++;
}
if (hasRangeStart) {
opts.rangeStart++;
}
if (hasRangeEnd) {
opts.rangeEnd++;
}
}
if (!hasCursor) {
opts.cursorOffset = -1;
}
if (opts.rangeStart < 0) {
opts.rangeStart = 0;
}
if (opts.rangeEnd > text.length) {
opts.rangeEnd = text.length;
}
const result = hasRangeStart || hasRangeEnd ? formatRange(text, opts) : coreFormat(opts.insertPragma && opts.printer.insertPragma && !hasPragma ? opts.printer.insertPragma(text) : text, opts);
if (hasUnicodeBOM) {
result.formatted = BOM + result.formatted;
if (hasCursor) {
result.cursorOffset++;
}
}
return result;
}
var core = {
formatWithCursor(text, opts) {
opts = normalizeOptions$1(opts);
return format(text, opts);
},
parse(text, opts, massage) {
opts = normalizeOptions$1(opts);
if (text.includes("\r")) {
text = text.replace(/\r\n?/g, "\n");
}
const parsed = parser.parse(text, opts);
if (massage) {
parsed.ast = massageAst(parsed.ast, opts);
}
return parsed;
},
formatAST(ast, opts) {
opts = normalizeOptions$1(opts);
const doc = astToDoc(ast, opts);
return printDocToString$1(doc, opts);
},
// Doesn't handle shebang for now
formatDoc(doc, opts) {
const debug = printDocToDebug(doc);
opts = normalizeOptions$1(Object.assign({}, opts, {
parser: "babel"
}));
return format(debug, opts).formatted;
},
printToDoc(text, opts) {
opts = normalizeOptions$1(opts);
const parsed = parser.parse(text, opts);
const {
ast
} = parsed;
text = parsed.text;
attachComments(text, ast, opts);
return astToDoc(ast, opts);
},
printDocToString(doc, opts) {
return printDocToString$1(doc, normalizeOptions$1(opts));
}
};
function clean(ast, newObj, parent) {
["raw", // front-matter
"raws", "sourceIndex", "source", "before", "after", "trailingComma"].forEach(name => {
delete newObj[name];
});
if (ast.type === "yaml") {
delete newObj.value;
} // --insert-pragma
if (ast.type === "css-comment" && parent.type === "css-root" && parent.nodes.length !== 0 && ( // first non-front-matter comment
parent.nodes[0] === ast || (parent.nodes[0].type === "yaml" || parent.nodes[0].type === "toml") && parent.nodes[1] === ast)) {
/**
* something
*
* @format
*/
delete newObj.text; // standalone pragma
if (/^\*\s*@(format|prettier)\s*$/.test(ast.text)) {
return null;
}
}
if (ast.type === "media-query" || ast.type === "media-query-list" || ast.type === "media-feature-expression") {
delete newObj.value;
}
if (ast.type === "css-rule") {
delete newObj.params;
}
if (ast.type === "selector-combinator") {
newObj.value = newObj.value.replace(/\s+/g, " ");
}
if (ast.type === "media-feature") {
newObj.value = newObj.value.replace(/ /g, "");
}
if (ast.type === "value-word" && (ast.isColor && ast.isHex || ["initial", "inherit", "unset", "revert"].includes(newObj.value.replace().toLowerCase())) || ast.type === "media-feature" || ast.type === "selector-root-invalid" || ast.type === "selector-pseudo") {
newObj.value = newObj.value.toLowerCase();
}
if (ast.type === "css-decl") {
newObj.prop = newObj.prop.toLowerCase();
}
if (ast.type === "css-atrule" || ast.type === "css-import") {
newObj.name = newObj.name.toLowerCase();
}
if (ast.type === "value-number") {
newObj.unit = newObj.unit.toLowerCase();
}
if ((ast.type === "media-feature" || ast.type === "media-keyword" || ast.type === "media-type" || ast.type === "media-unknown" || ast.type === "media-url" || ast.type === "media-value" || ast.type === "selector-attribute" || ast.type === "selector-string" || ast.type === "selector-class" || ast.type === "selector-combinator" || ast.type === "value-string") && newObj.value) {
newObj.value = cleanCSSStrings(newObj.value);
}
if (ast.type === "selector-attribute") {
newObj.attribute = newObj.attribute.trim();
if (newObj.namespace) {
if (typeof newObj.namespace === "string") {
newObj.namespace = newObj.namespace.trim();
if (newObj.namespace.length === 0) {
newObj.namespace = true;
}
}
}
if (newObj.value) {
newObj.value = newObj.value.trim().replace(/^['"]|['"]$/g, "");
delete newObj.quoted;
}
}
if ((ast.type === "media-value" || ast.type === "media-type" || ast.type === "value-number" || ast.type === "selector-root-invalid" || ast.type === "selector-class" || ast.type === "selector-combinator" || ast.type === "selector-tag") && newObj.value) {
newObj.value = newObj.value.replace(/([\d.eE+-]+)([a-zA-Z]*)/g, (match, numStr, unit) => {
const num = Number(numStr);
return isNaN(num) ? match : num + unit.toLowerCase();
});
}
if (ast.type === "selector-tag") {
const lowercasedValue = ast.value.toLowerCase();
if (["from", "to"].includes(lowercasedValue)) {
newObj.value = lowercasedValue;
}
} // Workaround when `postcss-values-parser` parse `not`, `and` or `or` keywords as `value-func`
if (ast.type === "css-atrule" && ast.name.toLowerCase() === "supports") {
delete newObj.value;
} // Workaround for SCSS nested properties
if (ast.type === "selector-unknown") {
delete newObj.value;
}
}
function cleanCSSStrings(value) {
return value.replace(/'/g, '"').replace(/\\([^a-fA-F\d])/g, "$1");
}
var clean_1 = clean;
const {
builders: {
hardline: hardline$3,
literalline: literalline$1,
concat: concat$4,
markAsRoot: markAsRoot$1
},
utils: {
mapDoc: mapDoc$1
}
} = document;
function embed(path, print, textToDoc
/*, options */
) {
const node = path.getValue();
if (node.type === "yaml") {
return markAsRoot$1(concat$4(["---", hardline$3, node.value.trim() ? replaceNewlinesWithLiterallines(textToDoc(node.value, {
parser: "yaml"
})) : "", "---", hardline$3]));
}
return null;
function replaceNewlinesWithLiterallines(doc) {
return mapDoc$1(doc, currentDoc => typeof currentDoc === "string" && currentDoc.includes("\n") ? concat$4(currentDoc.split(/(\n)/g).map((v, i) => i % 2 === 0 ? v : literalline$1)) : currentDoc);
}
}
var embed_1 = embed;
const detectNewline = string => {
if (typeof string !== 'string') {
throw new TypeError('Expected a string');
}
const newlines = string.match(/(?:\r?\n)/g) || [];
if (newlines.length === 0) {
return;
}
const crlf = newlines.filter(newline => newline === '\r\n').length;
const lf = newlines.length - crlf;
return crlf > lf ? '\r\n' : '\n';
};
var detectNewline_1 = detectNewline;
var graceful = string => typeof string === 'string' && detectNewline(string) || '\n';
detectNewline_1.graceful = graceful;
var build = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.extract = extract;
exports.strip = strip;
exports.parse = parse;
exports.parseWithComments = parseWithComments;
exports.print = print;
function _os() {
const data = require$$0$1;
_os = function _os() {
return data;
};
return data;
}
function _detectNewline() {
const data = _interopRequireDefault(detectNewline_1);
_detectNewline = function _detectNewline() {
return data;
};
return data;
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const commentEndRe = /\*\/$/;
const commentStartRe = /^\/\*\*/;
const docblockRe = /^\s*(\/\*\*?(.|\r?\n)*?\*\/)/;
const lineCommentRe = /(^|\s+)\/\/([^\r\n]*)/g;
const ltrimNewlineRe = /^(\r?\n)+/;
const multilineRe = /(?:^|\r?\n) *(@[^\r\n]*?) *\r?\n *(?![^@\r\n]*\/\/[^]*)([^@\r\n\s][^@\r\n]+?) *\r?\n/g;
const propertyRe = /(?:^|\r?\n) *@(\S+) *([^\r\n]*)/g;
const stringStartRe = /(\r?\n|^) *\* ?/g;
function extract(contents) {
const match = contents.match(docblockRe);
return match ? match[0].trimLeft() : '';
}
function strip(contents) {
const match = contents.match(docblockRe);
return match && match[0] ? contents.substring(match[0].length) : contents;
}
function parse(docblock) {
return parseWithComments(docblock).pragmas;
}
function parseWithComments(docblock) {
const line = (0, _detectNewline().default)(docblock) || _os().EOL;
docblock = docblock.replace(commentStartRe, '').replace(commentEndRe, '').replace(stringStartRe, '$1'); // Normalize multi-line directives
let prev = '';
while (prev !== docblock) {
prev = docblock;
docblock = docblock.replace(multilineRe, "".concat(line, "$1 $2").concat(line));
}
docblock = docblock.replace(ltrimNewlineRe, '').trimRight();
const result = Object.create(null);
const comments = docblock.replace(propertyRe, '').replace(ltrimNewlineRe, '').trimRight();
let match;
while (match = propertyRe.exec(docblock)) {
// strip linecomments from pragmas
const nextPragma = match[2].replace(lineCommentRe, '');
if (typeof result[match[1]] === 'string' || Array.isArray(result[match[1]])) {
result[match[1]] = [].concat(result[match[1]], nextPragma);
} else {
result[match[1]] = nextPragma;
}
}
return {
comments,
pragmas: result
};
}
function print({
comments = '',
pragmas = {}
}) {
const line = (0, _detectNewline().default)(comments) || _os().EOL;
const head = '/**';
const start = ' *';
const tail = ' */';
const keys = Object.keys(pragmas);
const printedObject = keys.map(key => printKeyValues(key, pragmas[key])).reduce((arr, next) => arr.concat(next), []).map(keyValue => start + ' ' + keyValue + line).join('');
if (!comments) {
if (keys.length === 0) {
return '';
}
if (keys.length === 1 && !Array.isArray(pragmas[keys[0]])) {
const value = pragmas[keys[0]];
return "".concat(head, " ").concat(printKeyValues(keys[0], value)[0]).concat(tail);
}
}
const printedComments = comments.split(line).map(textLine => "".concat(start, " ").concat(textLine)).join(line) + line;
return head + line + (comments ? printedComments : '') + (comments && keys.length ? start + line : '') + printedObject + tail;
}
function printKeyValues(key, valueOrArray) {
return [].concat(valueOrArray).map(value => "@".concat(key, " ").concat(value).trim());
}
});
unwrapExports(build);
var build_1 = build.extract;
var build_2 = build.strip;
var build_3 = build.parse;
var build_4 = build.parseWithComments;
var build_5 = build.print;
function hasPragma(text) {
const pragmas = Object.keys(build.parse(build.extract(text)));
return pragmas.includes("prettier") || pragmas.includes("format");
}
function insertPragma(text) {
const parsedDocblock = build.parseWithComments(build.extract(text));
const pragmas = Object.assign({
format: ""
}, parsedDocblock.pragmas);
const newDocblock = build.print({
pragmas,
comments: parsedDocblock.comments.replace(/^(\s+?\r?\n)+/, "") // remove leading newlines
}).replace(/(\r\n|\r)/g, "\n"); // normalise newlines (mitigate use of os.EOL by jest-docblock)
const strippedText = build.strip(text);
const separatingNewlines = strippedText.startsWith("\n") ? "\n" : "\n\n";
return newDocblock + separatingNewlines + strippedText;
}
var pragma = {
hasPragma,
insertPragma
};
const DELIMITER_MAP = {
"---": "yaml",
"+++": "toml"
};
function parse$1(text) {
const delimiterRegex = Object.keys(DELIMITER_MAP).map(escapeStringRegexp$2).join("|");
const match = text.match( // trailing spaces after delimiters are allowed
new RegExp("^(".concat(delimiterRegex, ")[^\\n\\S]*\\n(?:([\\s\\S]*?)\\n)?\\1[^\\n\\S]*(\\n|$)")));
if (match === null) {
return {
frontMatter: null,
content: text
};
}
const [raw, delimiter, value] = match;
return {
frontMatter: {
type: DELIMITER_MAP[delimiter],
value,
raw: raw.replace(/\n$/, "")
},
content: raw.replace(/[^\n]/g, " ") + text.slice(raw.length)
};
}
var frontMatter = parse$1;
function hasPragma$1(text) {
return pragma.hasPragma(frontMatter(text).content);
}
function insertPragma$1(text) {
const {
frontMatter: frontMatter$1,
content
} = frontMatter(text);
return (frontMatter$1 ? frontMatter$1.raw + "\n\n" : "") + pragma.insertPragma(content);
}
var pragma$1 = {
hasPragma: hasPragma$1,
insertPragma: insertPragma$1
};
var lineColumnToIndex = function lineColumnToIndex(lineColumn, text) {
let index = 0;
for (let i = 0; i < lineColumn.line - 1; ++i) {
index = text.indexOf("\n", index) + 1;
if (index === -1) {
return -1;
}
}
return index + lineColumn.column;
};
const {
getLast: getLast$1,
skipEverythingButNewLine: skipEverythingButNewLine$2
} = util$1;
function calculateLocStart(node, text) {
if (node.source) {
return lineColumnToIndex(node.source.start, text) - 1;
}
return null;
}
function calculateLocEnd(node, text) {
if (node.type === "css-comment" && node.inline) {
return skipEverythingButNewLine$2(text, node.source.startOffset);
}
const endNode = node.nodes && getLast$1(node.nodes);
if (endNode && node.source && !node.source.end) {
node = endNode;
}
if (node.source && node.source.end) {
return lineColumnToIndex(node.source.end, text);
}
return null;
}
function calculateLoc(node, text) {
if (node && typeof node === "object") {
if (node.source) {
node.source.startOffset = calculateLocStart(node, text);
node.source.endOffset = calculateLocEnd(node, text);
}
for (const key in node) {
calculateLoc(node[key], text);
}
}
}
/**
* Workaround for a bug: quotes in inline comments corrupt loc data of subsequent nodes.
* This function replaces the quotes with U+FFFE and U+FFFF. Later, when the comments are printed,
* their content is extracted from the original text or restored by replacing the placeholder
* characters back with quotes.
* - https://github.com/prettier/prettier/issues/7780
* - https://github.com/shellscape/postcss-less/issues/145
* - About noncharacters (U+FFFE and U+FFFF): http://www.unicode.org/faq/private_use.html#nonchar1
* @param text {string}
*/
function replaceQuotesInInlineComments(text) {
/** @typedef { 'initial' | 'single-quotes' | 'double-quotes' | 'url' | 'comment-block' | 'comment-inline' } State */
/** @type {State} */
let state = "initial";
/** @type {State} */
let stateToReturnFromQuotes = "initial";
let inlineCommentStartIndex;
let inlineCommentContainsQuotes = false;
const inlineCommentsToReplace = [];
for (let i = 0; i < text.length; i++) {
const c = text[i];
switch (state) {
case "initial":
if (c === "'") {
state = "single-quotes";
continue;
}
if (c === '"') {
state = "double-quotes";
continue;
}
if ((c === "u" || c === "U") && text.slice(i, i + 4).toLowerCase() === "url(") {
state = "url";
i += 3;
continue;
}
if (c === "*" && text[i - 1] === "/") {
state = "comment-block";
continue;
}
if (c === "/" && text[i - 1] === "/") {
state = "comment-inline";
inlineCommentStartIndex = i - 1;
continue;
}
continue;
case "single-quotes":
if (c === "'" && text[i - 1] !== "\\") {
state = stateToReturnFromQuotes;
stateToReturnFromQuotes = "initial";
}
if (c === "\n" || c === "\r") {
return text; // invalid input
}
continue;
case "double-quotes":
if (c === '"' && text[i - 1] !== "\\") {
state = stateToReturnFromQuotes;
stateToReturnFromQuotes = "initial";
}
if (c === "\n" || c === "\r") {
return text; // invalid input
}
continue;
case "url":
if (c === ")") {
state = "initial";
}
if (c === "\n" || c === "\r") {
return text; // invalid input
}
if (c === "'") {
state = "single-quotes";
stateToReturnFromQuotes = "url";
continue;
}
if (c === '"') {
state = "double-quotes";
stateToReturnFromQuotes = "url";
continue;
}
continue;
case "comment-block":
if (c === "/" && text[i - 1] === "*") {
state = "initial";
}
continue;
case "comment-inline":
if (c === '"' || c === "'") {
inlineCommentContainsQuotes = true;
}
if (c === "\n" || c === "\r") {
if (inlineCommentContainsQuotes) {
inlineCommentsToReplace.push([inlineCommentStartIndex, i]);
}
state = "initial";
inlineCommentContainsQuotes = false;
}
continue;
}
}
for (const [start, end] of inlineCommentsToReplace) {
text = text.slice(0, start) + text.slice(start, end).replace(/'/g, "\ufffe").replace(/"/g, "\uffff") + text.slice(end);
}
return text;
}
function restoreQuotesInInlineComments(text) {
return text.replace(/\ufffe/g, "'").replace(/\uffff/g, '"');
}
var loc$1 = {
calculateLoc,
replaceQuotesInInlineComments,
restoreQuotesInInlineComments
};
const colorAdjusterFunctions = ["red", "green", "blue", "alpha", "a", "rgb", "hue", "h", "saturation", "s", "lightness", "l", "whiteness", "w", "blackness", "b", "tint", "shade", "blend", "blenda", "contrast", "hsl", "hsla", "hwb", "hwba"];
function getAncestorCounter(path, typeOrTypes) {
const types = [].concat(typeOrTypes);
let counter = -1;
let ancestorNode;
while (ancestorNode = path.getParentNode(++counter)) {
if (types.includes(ancestorNode.type)) {
return counter;
}
}
return -1;
}
function getAncestorNode(path, typeOrTypes) {
const counter = getAncestorCounter(path, typeOrTypes);
return counter === -1 ? null : path.getParentNode(counter);
}
function getPropOfDeclNode(path) {
const declAncestorNode = getAncestorNode(path, "css-decl");
return declAncestorNode && declAncestorNode.prop && declAncestorNode.prop.toLowerCase();
}
function isSCSS(parser, text) {
const hasExplicitParserChoice = parser === "less" || parser === "scss";
const IS_POSSIBLY_SCSS = /(\w\s*:\s*[^}:]+|#){|@import[^\n]+(?:url|,)/;
return hasExplicitParserChoice ? parser === "scss" : IS_POSSIBLY_SCSS.test(text);
}
function isWideKeywords(value) {
return ["initial", "inherit", "unset", "revert"].includes(value.toLowerCase());
}
function isKeyframeAtRuleKeywords(path, value) {
const atRuleAncestorNode = getAncestorNode(path, "css-atrule");
return atRuleAncestorNode && atRuleAncestorNode.name && atRuleAncestorNode.name.toLowerCase().endsWith("keyframes") && ["from", "to"].includes(value.toLowerCase());
}
function maybeToLowerCase(value) {
return value.includes("$") || value.includes("@") || value.includes("#") || value.startsWith("%") || value.startsWith("--") || value.startsWith(":--") || value.includes("(") && value.includes(")") ? value : value.toLowerCase();
}
function insideValueFunctionNode(path, functionName) {
const funcAncestorNode = getAncestorNode(path, "value-func");
return funcAncestorNode && funcAncestorNode.value && funcAncestorNode.value.toLowerCase() === functionName;
}
function insideICSSRuleNode(path) {
const ruleAncestorNode = getAncestorNode(path, "css-rule");
return ruleAncestorNode && ruleAncestorNode.raws && ruleAncestorNode.raws.selector && (ruleAncestorNode.raws.selector.startsWith(":import") || ruleAncestorNode.raws.selector.startsWith(":export"));
}
function insideAtRuleNode(path, atRuleNameOrAtRuleNames) {
const atRuleNames = [].concat(atRuleNameOrAtRuleNames);
const atRuleAncestorNode = getAncestorNode(path, "css-atrule");
return atRuleAncestorNode && atRuleNames.includes(atRuleAncestorNode.name.toLowerCase());
}
function insideURLFunctionInImportAtRuleNode(path) {
const node = path.getValue();
const atRuleAncestorNode = getAncestorNode(path, "css-atrule");
return atRuleAncestorNode && atRuleAncestorNode.name === "import" && node.groups[0].value === "url" && node.groups.length === 2;
}
function isURLFunctionNode(node) {
return node.type === "value-func" && node.value.toLowerCase() === "url";
}
function isLastNode(path, node) {
const parentNode = path.getParentNode();
if (!parentNode) {
return false;
}
const {
nodes
} = parentNode;
return nodes && nodes.indexOf(node) === nodes.length - 1;
}
function isDetachedRulesetDeclarationNode(node) {
// If a Less file ends up being parsed with the SCSS parser, Less
// variable declarations will be parsed as atrules with names ending
// with a colon, so keep the original case then.
if (!node.selector) {
return false;
}
return typeof node.selector === "string" && /^@.+:.*$/.test(node.selector) || node.selector.value && /^@.+:.*$/.test(node.selector.value);
}
function isForKeywordNode(node) {
return node.type === "value-word" && ["from", "through", "end"].includes(node.value);
}
function isIfElseKeywordNode(node) {
return node.type === "value-word" && ["and", "or", "not"].includes(node.value);
}
function isEachKeywordNode(node) {
return node.type === "value-word" && node.value === "in";
}
function isMultiplicationNode(node) {
return node.type === "value-operator" && node.value === "*";
}
function isDivisionNode(node) {
return node.type === "value-operator" && node.value === "/";
}
function isAdditionNode(node) {
return node.type === "value-operator" && node.value === "+";
}
function isSubtractionNode(node) {
return node.type === "value-operator" && node.value === "-";
}
function isModuloNode(node) {
return node.type === "value-operator" && node.value === "%";
}
function isMathOperatorNode(node) {
return isMultiplicationNode(node) || isDivisionNode(node) || isAdditionNode(node) || isSubtractionNode(node) || isModuloNode(node);
}
function isEqualityOperatorNode(node) {
return node.type === "value-word" && ["==", "!="].includes(node.value);
}
function isRelationalOperatorNode(node) {
return node.type === "value-word" && ["<", ">", "<=", ">="].includes(node.value);
}
function isSCSSControlDirectiveNode(node) {
return node.type === "css-atrule" && ["if", "else", "for", "each", "while"].includes(node.name);
}
function isSCSSNestedPropertyNode(node) {
if (!node.selector) {
return false;
}
return node.selector.replace(/\/\*.*?\*\//, "").replace(/\/\/.*?\n/, "").trim().endsWith(":");
}
function isDetachedRulesetCallNode(node) {
return node.raws && node.raws.params && /^\(\s*\)$/.test(node.raws.params);
}
function isTemplatePlaceholderNode(node) {
return node.name.startsWith("prettier-placeholder");
}
function isTemplatePropNode(node) {
return node.prop.startsWith("@prettier-placeholder");
}
function isPostcssSimpleVarNode(currentNode, nextNode) {
return currentNode.value === "$$" && currentNode.type === "value-func" && nextNode && nextNode.type === "value-word" && !nextNode.raws.before;
}
function hasComposesNode(node) {
return node.value && node.value.type === "value-root" && node.value.group && node.value.group.type === "value-value" && node.prop.toLowerCase() === "composes";
}
function hasParensAroundNode(node) {
return node.value && node.value.group && node.value.group.group && node.value.group.group.type === "value-paren_group" && node.value.group.group.open !== null && node.value.group.group.close !== null;
}
function hasEmptyRawBefore(node) {
return node.raws && node.raws.before === "";
}
function isKeyValuePairNode(node) {
return node.type === "value-comma_group" && node.groups && node.groups[1] && node.groups[1].type === "value-colon";
}
function isKeyValuePairInParenGroupNode(node) {
return node.type === "value-paren_group" && node.groups && node.groups[0] && isKeyValuePairNode(node.groups[0]);
}
function isSCSSMapItemNode(path) {
const node = path.getValue(); // Ignore empty item (i.e. `$key: ()`)
if (node.groups.length === 0) {
return false;
}
const parentParentNode = path.getParentNode(1); // Check open parens contain key/value pair (i.e. `(key: value)` and `(key: (value, other-value)`)
if (!isKeyValuePairInParenGroupNode(node) && !(parentParentNode && isKeyValuePairInParenGroupNode(parentParentNode))) {
return false;
}
const declNode = getAncestorNode(path, "css-decl"); // SCSS map declaration (i.e. `$map: (key: value, other-key: other-value)`)
if (declNode && declNode.prop && declNode.prop.startsWith("$")) {
return true;
} // List as value of key inside SCSS map (i.e. `$map: (key: (value other-value other-other-value))`)
if (isKeyValuePairInParenGroupNode(parentParentNode)) {
return true;
} // SCSS Map is argument of function (i.e. `func((key: value, other-key: other-value))`)
if (parentParentNode.type === "value-func") {
return true;
}
return false;
}
function isInlineValueCommentNode(node) {
return node.type === "value-comment" && node.inline;
}
function isHashNode(node) {
return node.type === "value-word" && node.value === "#";
}
function isLeftCurlyBraceNode(node) {
return node.type === "value-word" && node.value === "{";
}
function isRightCurlyBraceNode(node) {
return node.type === "value-word" && node.value === "}";
}
function isWordNode(node) {
return ["value-word", "value-atword"].includes(node.type);
}
function isColonNode(node) {
return node.type === "value-colon";
}
function isMediaAndSupportsKeywords(node) {
return node.value && ["not", "and", "or"].includes(node.value.toLowerCase());
}
function isColorAdjusterFuncNode(node) {
if (node.type !== "value-func") {
return false;
}
return colorAdjusterFunctions.includes(node.value.toLowerCase());
} // TODO: only check `less` when we don't use `less` to parse `css`
function isLessParser(options) {
return options.parser === "css" || options.parser === "less";
}
function lastLineHasInlineComment(text) {
return /\/\//.test(text.split(/[\r\n]/).pop());
}
var utils$2 = {
getAncestorCounter,
getAncestorNode,
getPropOfDeclNode,
maybeToLowerCase,
insideValueFunctionNode,
insideICSSRuleNode,
insideAtRuleNode,
insideURLFunctionInImportAtRuleNode,
isKeyframeAtRuleKeywords,
isWideKeywords,
isSCSS,
isLastNode,
isLessParser,
isSCSSControlDirectiveNode,
isDetachedRulesetDeclarationNode,
isRelationalOperatorNode,
isEqualityOperatorNode,
isMultiplicationNode,
isDivisionNode,
isAdditionNode,
isSubtractionNode,
isModuloNode,
isMathOperatorNode,
isEachKeywordNode,
isForKeywordNode,
isURLFunctionNode,
isIfElseKeywordNode,
hasComposesNode,
hasParensAroundNode,
hasEmptyRawBefore,
isSCSSNestedPropertyNode,
isDetachedRulesetCallNode,
isTemplatePlaceholderNode,
isTemplatePropNode,
isPostcssSimpleVarNode,
isKeyValuePairNode,
isKeyValuePairInParenGroupNode,
isSCSSMapItemNode,
isInlineValueCommentNode,
isHashNode,
isLeftCurlyBraceNode,
isRightCurlyBraceNode,
isWordNode,
isColonNode,
isMediaAndSupportsKeywords,
isColorAdjusterFuncNode,
lastLineHasInlineComment
};
const {
insertPragma: insertPragma$2
} = pragma$1;
const {
printNumber: printNumber$1,
printString: printString$1,
hasIgnoreComment: hasIgnoreComment$1,
hasNewline: hasNewline$3
} = util$1;
const {
isNextLineEmpty: isNextLineEmpty$2
} = utilShared;
const {
restoreQuotesInInlineComments: restoreQuotesInInlineComments$1
} = loc$1;
const {
builders: {
concat: concat$5,
join: join$2,
line: line$2,
hardline: hardline$4,
softline: softline$1,
group: group$1,
fill: fill$2,
indent: indent$2,
dedent: dedent$1,
ifBreak: ifBreak$1
},
utils: {
removeLines: removeLines$1
}
} = document;
const {
getAncestorNode: getAncestorNode$1,
getPropOfDeclNode: getPropOfDeclNode$1,
maybeToLowerCase: maybeToLowerCase$1,
insideValueFunctionNode: insideValueFunctionNode$1,
insideICSSRuleNode: insideICSSRuleNode$1,
insideAtRuleNode: insideAtRuleNode$1,
insideURLFunctionInImportAtRuleNode: insideURLFunctionInImportAtRuleNode$1,
isKeyframeAtRuleKeywords: isKeyframeAtRuleKeywords$1,
isWideKeywords: isWideKeywords$1,
isSCSS: isSCSS$1,
isLastNode: isLastNode$1,
isLessParser: isLessParser$1,
isSCSSControlDirectiveNode: isSCSSControlDirectiveNode$1,
isDetachedRulesetDeclarationNode: isDetachedRulesetDeclarationNode$1,
isRelationalOperatorNode: isRelationalOperatorNode$1,
isEqualityOperatorNode: isEqualityOperatorNode$1,
isMultiplicationNode: isMultiplicationNode$1,
isDivisionNode: isDivisionNode$1,
isAdditionNode: isAdditionNode$1,
isSubtractionNode: isSubtractionNode$1,
isMathOperatorNode: isMathOperatorNode$1,
isEachKeywordNode: isEachKeywordNode$1,
isForKeywordNode: isForKeywordNode$1,
isURLFunctionNode: isURLFunctionNode$1,
isIfElseKeywordNode: isIfElseKeywordNode$1,
hasComposesNode: hasComposesNode$1,
hasParensAroundNode: hasParensAroundNode$1,
hasEmptyRawBefore: hasEmptyRawBefore$1,
isKeyValuePairNode: isKeyValuePairNode$1,
isDetachedRulesetCallNode: isDetachedRulesetCallNode$1,
isTemplatePlaceholderNode: isTemplatePlaceholderNode$1,
isTemplatePropNode: isTemplatePropNode$1,
isPostcssSimpleVarNode: isPostcssSimpleVarNode$1,
isSCSSMapItemNode: isSCSSMapItemNode$1,
isInlineValueCommentNode: isInlineValueCommentNode$1,
isHashNode: isHashNode$1,
isLeftCurlyBraceNode: isLeftCurlyBraceNode$1,
isRightCurlyBraceNode: isRightCurlyBraceNode$1,
isWordNode: isWordNode$1,
isColonNode: isColonNode$1,
isMediaAndSupportsKeywords: isMediaAndSupportsKeywords$1,
isColorAdjusterFuncNode: isColorAdjusterFuncNode$1,
lastLineHasInlineComment: lastLineHasInlineComment$1
} = utils$2;
function shouldPrintComma(options) {
switch (options.trailingComma) {
case "all":
case "es5":
return true;
case "none":
default:
return false;
}
}
function genericPrint(path, options, print) {
const node = path.getValue();
/* istanbul ignore if */
if (!node) {
return "";
}
if (typeof node === "string") {
return node;
}
switch (node.type) {
case "yaml":
case "toml":
return concat$5([node.raw, hardline$4]);
case "css-root":
{
const nodes = printNodeSequence(path, options, print);
if (nodes.parts.length) {
return concat$5([nodes, options.__isHTMLStyleAttribute ? "" : hardline$4]);
}
return nodes;
}
case "css-comment":
{
const isInlineComment = node.inline || node.raws.inline;
const text = options.originalText.slice(options.locStart(node), options.locEnd(node));
return isInlineComment ? text.trimEnd() : text;
}
case "css-rule":
{
return concat$5([path.call(print, "selector"), node.important ? " !important" : "", node.nodes ? concat$5([node.selector && node.selector.type === "selector-unknown" && lastLineHasInlineComment$1(node.selector.value) ? line$2 : " ", "{", node.nodes.length > 0 ? indent$2(concat$5([hardline$4, printNodeSequence(path, options, print)])) : "", hardline$4, "}", isDetachedRulesetDeclarationNode$1(node) ? ";" : ""]) : ";"]);
}
case "css-decl":
{
const parentNode = path.getParentNode();
return concat$5([node.raws.before.replace(/[\s;]/g, ""), insideICSSRuleNode$1(path) ? node.prop : maybeToLowerCase$1(node.prop), node.raws.between.trim() === ":" ? ":" : node.raws.between.trim(), node.extend ? "" : " ", hasComposesNode$1(node) ? removeLines$1(path.call(print, "value")) : path.call(print, "value"), node.raws.important ? node.raws.important.replace(/\s*!\s*important/i, " !important") : node.important ? " !important" : "", node.raws.scssDefault ? node.raws.scssDefault.replace(/\s*!default/i, " !default") : node.scssDefault ? " !default" : "", node.raws.scssGlobal ? node.raws.scssGlobal.replace(/\s*!global/i, " !global") : node.scssGlobal ? " !global" : "", node.nodes ? concat$5([" {", indent$2(concat$5([softline$1, printNodeSequence(path, options, print)])), softline$1, "}"]) : isTemplatePropNode$1(node) && !parentNode.raws.semicolon && options.originalText[options.locEnd(node) - 1] !== ";" ? "" : ";"]);
}
case "css-atrule":
{
const parentNode = path.getParentNode();
const isTemplatePlaceholderNodeWithoutSemiColon = isTemplatePlaceholderNode$1(node) && !parentNode.raws.semicolon && options.originalText[options.locEnd(node) - 1] !== ";";
if (isLessParser$1(options)) {
if (node.mixin) {
return concat$5([path.call(print, "selector"), node.important ? " !important" : "", isTemplatePlaceholderNodeWithoutSemiColon ? "" : ";"]);
}
if (node.function) {
return concat$5([node.name, concat$5([path.call(print, "params")]), isTemplatePlaceholderNodeWithoutSemiColon ? "" : ";"]);
}
if (node.variable) {
return concat$5(["@", node.name, ": ", node.value ? concat$5([path.call(print, "value")]) : "", node.raws.between.trim() ? node.raws.between.trim() + " " : "", node.nodes ? concat$5(["{", indent$2(concat$5([node.nodes.length > 0 ? softline$1 : "", printNodeSequence(path, options, print)])), softline$1, "}"]) : "", isTemplatePlaceholderNodeWithoutSemiColon ? "" : ";"]);
}
}
return concat$5(["@", // If a Less file ends up being parsed with the SCSS parser, Less
// variable declarations will be parsed as at-rules with names ending
// with a colon, so keep the original case then.
isDetachedRulesetCallNode$1(node) || node.name.endsWith(":") ? node.name : maybeToLowerCase$1(node.name), node.params ? concat$5([isDetachedRulesetCallNode$1(node) ? "" : isTemplatePlaceholderNode$1(node) ? node.raws.afterName === "" ? "" : node.name.endsWith(":") ? " " : /^\s*\n\s*\n/.test(node.raws.afterName) ? concat$5([hardline$4, hardline$4]) : /^\s*\n/.test(node.raws.afterName) ? hardline$4 : " " : " ", path.call(print, "params")]) : "", node.selector ? indent$2(concat$5([" ", path.call(print, "selector")])) : "", node.value ? group$1(concat$5([" ", path.call(print, "value"), isSCSSControlDirectiveNode$1(node) ? hasParensAroundNode$1(node) ? " " : line$2 : ""])) : node.name === "else" ? " " : "", node.nodes ? concat$5([isSCSSControlDirectiveNode$1(node) ? "" : " ", "{", indent$2(concat$5([node.nodes.length > 0 ? softline$1 : "", printNodeSequence(path, options, print)])), softline$1, "}"]) : isTemplatePlaceholderNodeWithoutSemiColon ? "" : ";"]);
}
// postcss-media-query-parser
case "media-query-list":
{
const parts = [];
path.each(childPath => {
const node = childPath.getValue();
if (node.type === "media-query" && node.value === "") {
return;
}
parts.push(childPath.call(print));
}, "nodes");
return group$1(indent$2(join$2(line$2, parts)));
}
case "media-query":
{
return concat$5([join$2(" ", path.map(print, "nodes")), isLastNode$1(path, node) ? "" : ","]);
}
case "media-type":
{
return adjustNumbers(adjustStrings(node.value, options));
}
case "media-feature-expression":
{
if (!node.nodes) {
return node.value;
}
return concat$5(["(", concat$5(path.map(print, "nodes")), ")"]);
}
case "media-feature":
{
return maybeToLowerCase$1(adjustStrings(node.value.replace(/ +/g, " "), options));
}
case "media-colon":
{
return concat$5([node.value, " "]);
}
case "media-value":
{
return adjustNumbers(adjustStrings(node.value, options));
}
case "media-keyword":
{
return adjustStrings(node.value, options);
}
case "media-url":
{
return adjustStrings(node.value.replace(/^url\(\s+/gi, "url(").replace(/\s+\)$/gi, ")"), options);
}
case "media-unknown":
{
return node.value;
}
// postcss-selector-parser
case "selector-root":
{
return group$1(concat$5([insideAtRuleNode$1(path, "custom-selector") ? concat$5([getAncestorNode$1(path, "css-atrule").customSelector, line$2]) : "", join$2(concat$5([",", insideAtRuleNode$1(path, ["extend", "custom-selector", "nest"]) ? line$2 : hardline$4]), path.map(print, "nodes"))]));
}
case "selector-selector":
{
return group$1(indent$2(concat$5(path.map(print, "nodes"))));
}
case "selector-comment":
{
return node.value;
}
case "selector-string":
{
return adjustStrings(node.value, options);
}
case "selector-tag":
{
const parentNode = path.getParentNode();
const index = parentNode && parentNode.nodes.indexOf(node);
const prevNode = index && parentNode.nodes[index - 1];
return concat$5([node.namespace ? concat$5([node.namespace === true ? "" : node.namespace.trim(), "|"]) : "", prevNode.type === "selector-nesting" ? node.value : adjustNumbers(isKeyframeAtRuleKeywords$1(path, node.value) ? node.value.toLowerCase() : node.value)]);
}
case "selector-id":
{
return concat$5(["#", node.value]);
}
case "selector-class":
{
return concat$5([".", adjustNumbers(adjustStrings(node.value, options))]);
}
case "selector-attribute":
{
return concat$5(["[", node.namespace ? concat$5([node.namespace === true ? "" : node.namespace.trim(), "|"]) : "", node.attribute.trim(), node.operator ? node.operator : "", node.value ? quoteAttributeValue(adjustStrings(node.value.trim(), options), options) : "", node.insensitive ? " i" : "", "]"]);
}
case "selector-combinator":
{
if (node.value === "+" || node.value === ">" || node.value === "~" || node.value === ">>>") {
const parentNode = path.getParentNode();
const leading = parentNode.type === "selector-selector" && parentNode.nodes[0] === node ? "" : line$2;
return concat$5([leading, node.value, isLastNode$1(path, node) ? "" : " "]);
}
const leading = node.value.trim().startsWith("(") ? line$2 : "";
const value = adjustNumbers(adjustStrings(node.value.trim(), options)) || line$2;
return concat$5([leading, value]);
}
case "selector-universal":
{
return concat$5([node.namespace ? concat$5([node.namespace === true ? "" : node.namespace.trim(), "|"]) : "", node.value]);
}
case "selector-pseudo":
{
return concat$5([maybeToLowerCase$1(node.value), node.nodes && node.nodes.length > 0 ? concat$5(["(", join$2(", ", path.map(print, "nodes")), ")"]) : ""]);
}
case "selector-nesting":
{
return node.value;
}
case "selector-unknown":
{
const ruleAncestorNode = getAncestorNode$1(path, "css-rule"); // Nested SCSS property
if (ruleAncestorNode && ruleAncestorNode.isSCSSNesterProperty) {
return adjustNumbers(adjustStrings(maybeToLowerCase$1(node.value), options));
} // originalText has to be used for Less, see replaceQuotesInInlineComments in loc.js
const parentNode = path.getParentNode();
if (parentNode.raws && parentNode.raws.selector) {
const start = options.locStart(parentNode);
const end = start + parentNode.raws.selector.length;
return options.originalText.slice(start, end).trim();
}
return node.value;
}
// postcss-values-parser
case "value-value":
case "value-root":
{
return path.call(print, "group");
}
case "value-comment":
{
return concat$5([node.inline ? "//" : "/*", // see replaceQuotesInInlineComments in loc.js
// value-* nodes don't have correct location data, so we have to rely on placeholder characters.
restoreQuotesInInlineComments$1(node.value), node.inline ? "" : "*/"]);
}
case "value-comma_group":
{
const parentNode = path.getParentNode();
const parentParentNode = path.getParentNode(1);
const declAncestorProp = getPropOfDeclNode$1(path);
const isGridValue = declAncestorProp && parentNode.type === "value-value" && (declAncestorProp === "grid" || declAncestorProp.startsWith("grid-template"));
const atRuleAncestorNode = getAncestorNode$1(path, "css-atrule");
const isControlDirective = atRuleAncestorNode && isSCSSControlDirectiveNode$1(atRuleAncestorNode);
const printed = path.map(print, "groups");
const parts = [];
const insideURLFunction = insideValueFunctionNode$1(path, "url");
let insideSCSSInterpolationInString = false;
let didBreak = false;
for (let i = 0; i < node.groups.length; ++i) {
parts.push(printed[i]);
const iPrevNode = node.groups[i - 1];
const iNode = node.groups[i];
const iNextNode = node.groups[i + 1];
const iNextNextNode = node.groups[i + 2];
if (insideURLFunction) {
if (iNextNode && isAdditionNode$1(iNextNode) || isAdditionNode$1(iNode)) {
parts.push(" ");
}
continue;
} // Ignore after latest node (i.e. before semicolon)
if (!iNextNode) {
continue;
} // styled.div` background: var(--${one}); `
if (!iPrevNode && iNode.value === "--" && iNextNode.type === "value-atword") {
continue;
} // Ignore spaces before/after string interpolation (i.e. `"#{my-fn("_")}"`)
const isStartSCSSInterpolationInString = iNode.type === "value-string" && iNode.value.startsWith("#{");
const isEndingSCSSInterpolationInString = insideSCSSInterpolationInString && iNextNode.type === "value-string" && iNextNode.value.endsWith("}");
if (isStartSCSSInterpolationInString || isEndingSCSSInterpolationInString) {
insideSCSSInterpolationInString = !insideSCSSInterpolationInString;
continue;
}
if (insideSCSSInterpolationInString) {
continue;
} // Ignore colon (i.e. `:`)
if (isColonNode$1(iNode) || isColonNode$1(iNextNode)) {
continue;
} // Ignore `@` in Less (i.e. `@@var;`)
if (iNode.type === "value-atword" && iNode.value === "") {
continue;
} // Ignore `~` in Less (i.e. `content: ~"^//* some horrible but needed css hack";`)
if (iNode.value === "~") {
continue;
} // Ignore escape `\`
if (iNode.value && iNode.value.includes("\\") && iNextNode && iNextNode.type !== "value-comment") {
continue;
} // Ignore escaped `/`
if (iPrevNode && iPrevNode.value && iPrevNode.value.indexOf("\\") === iPrevNode.value.length - 1 && iNode.type === "value-operator" && iNode.value === "/") {
continue;
} // Ignore `\` (i.e. `$variable: \@small;`)
if (iNode.value === "\\") {
continue;
} // Ignore `$$` (i.e. `background-color: $$(style)Color;`)
if (isPostcssSimpleVarNode$1(iNode, iNextNode)) {
continue;
} // Ignore spaces after `#` and after `{` and before `}` in SCSS interpolation (i.e. `#{variable}`)
if (isHashNode$1(iNode) || isLeftCurlyBraceNode$1(iNode) || isRightCurlyBraceNode$1(iNextNode) || isLeftCurlyBraceNode$1(iNextNode) && hasEmptyRawBefore$1(iNextNode) || isRightCurlyBraceNode$1(iNode) && hasEmptyRawBefore$1(iNextNode)) {
continue;
} // Ignore css variables and interpolation in SCSS (i.e. `--#{$var}`)
if (iNode.value === "--" && isHashNode$1(iNextNode)) {
continue;
} // Formatting math operations
const isMathOperator = isMathOperatorNode$1(iNode);
const isNextMathOperator = isMathOperatorNode$1(iNextNode); // Print spaces before and after math operators beside SCSS interpolation as is
// (i.e. `#{$var}+5`, `#{$var} +5`, `#{$var}+ 5`, `#{$var} + 5`)
// (i.e. `5+#{$var}`, `5 +#{$var}`, `5+ #{$var}`, `5 + #{$var}`)
if ((isMathOperator && isHashNode$1(iNextNode) || isNextMathOperator && isRightCurlyBraceNode$1(iNode)) && hasEmptyRawBefore$1(iNextNode)) {
continue;
} // Print spaces before and after addition and subtraction math operators as is in `calc` function
// due to the fact that it is not valid syntax
// (i.e. `calc(1px+1px)`, `calc(1px+ 1px)`, `calc(1px +1px)`, `calc(1px + 1px)`)
if (insideValueFunctionNode$1(path, "calc") && (isAdditionNode$1(iNode) || isAdditionNode$1(iNextNode) || isSubtractionNode$1(iNode) || isSubtractionNode$1(iNextNode)) && hasEmptyRawBefore$1(iNextNode)) {
continue;
} // Print spaces after `+` and `-` in color adjuster functions as is (e.g. `color(red l(+ 20%))`)
// Adjusters with signed numbers (e.g. `color(red l(+20%))`) output as-is.
const isColorAdjusterNode = (isAdditionNode$1(iNode) || isSubtractionNode$1(iNode)) && i === 0 && (iNextNode.type === "value-number" || iNextNode.isHex) && parentParentNode && isColorAdjusterFuncNode$1(parentParentNode) && !hasEmptyRawBefore$1(iNextNode);
const requireSpaceBeforeOperator = iNextNextNode && iNextNextNode.type === "value-func" || iNextNextNode && isWordNode$1(iNextNextNode) || iNode.type === "value-func" || isWordNode$1(iNode);
const requireSpaceAfterOperator = iNextNode.type === "value-func" || isWordNode$1(iNextNode) || iPrevNode && iPrevNode.type === "value-func" || iPrevNode && isWordNode$1(iPrevNode); // Formatting `/`, `+`, `-` sign
if (!(isMultiplicationNode$1(iNextNode) || isMultiplicationNode$1(iNode)) && !insideValueFunctionNode$1(path, "calc") && !isColorAdjusterNode && (isDivisionNode$1(iNextNode) && !requireSpaceBeforeOperator || isDivisionNode$1(iNode) && !requireSpaceAfterOperator || isAdditionNode$1(iNextNode) && !requireSpaceBeforeOperator || isAdditionNode$1(iNode) && !requireSpaceAfterOperator || isSubtractionNode$1(iNextNode) || isSubtractionNode$1(iNode)) && (hasEmptyRawBefore$1(iNextNode) || isMathOperator && (!iPrevNode || iPrevNode && isMathOperatorNode$1(iPrevNode)))) {
continue;
} // Add `hardline` after inline comment (i.e. `// comment\n foo: bar;`)
if (isInlineValueCommentNode$1(iNode)) {
parts.push(hardline$4);
continue;
} // Handle keywords in SCSS control directive
if (isControlDirective && (isEqualityOperatorNode$1(iNextNode) || isRelationalOperatorNode$1(iNextNode) || isIfElseKeywordNode$1(iNextNode) || isEachKeywordNode$1(iNode) || isForKeywordNode$1(iNode))) {
parts.push(" ");
continue;
} // At-rule `namespace` should be in one line
if (atRuleAncestorNode && atRuleAncestorNode.name.toLowerCase() === "namespace") {
parts.push(" ");
continue;
} // Formatting `grid` property
if (isGridValue) {
if (iNode.source && iNextNode.source && iNode.source.start.line !== iNextNode.source.start.line) {
parts.push(hardline$4);
didBreak = true;
} else {
parts.push(" ");
}
continue;
} // Add `space` before next math operation
// Note: `grip` property have `/` delimiter and it is not math operation, so
// `grid` property handles above
if (isNextMathOperator) {
parts.push(" ");
continue;
} // Be default all values go through `line`
parts.push(line$2);
}
if (didBreak) {
parts.unshift(hardline$4);
}
if (isControlDirective) {
return group$1(indent$2(concat$5(parts)));
} // Indent is not needed for import url when url is very long
// and node has two groups
// when type is value-comma_group
// example @import url("verylongurl") projection,tv
if (insideURLFunctionInImportAtRuleNode$1(path)) {
return group$1(fill$2(parts));
}
return group$1(indent$2(fill$2(parts)));
}
case "value-paren_group":
{
const parentNode = path.getParentNode();
if (parentNode && isURLFunctionNode$1(parentNode) && (node.groups.length === 1 || node.groups.length > 0 && node.groups[0].type === "value-comma_group" && node.groups[0].groups.length > 0 && node.groups[0].groups[0].type === "value-word" && node.groups[0].groups[0].value.startsWith("data:"))) {
return concat$5([node.open ? path.call(print, "open") : "", join$2(",", path.map(print, "groups")), node.close ? path.call(print, "close") : ""]);
}
if (!node.open) {
const printed = path.map(print, "groups");
const res = [];
for (let i = 0; i < printed.length; i++) {
if (i !== 0) {
res.push(concat$5([",", line$2]));
}
res.push(printed[i]);
}
return group$1(indent$2(fill$2(res)));
}
const isSCSSMapItem = isSCSSMapItemNode$1(path);
const lastItem = node.groups[node.groups.length - 1];
const isLastItemComment = lastItem && lastItem.type === "value-comment";
return group$1(concat$5([node.open ? path.call(print, "open") : "", indent$2(concat$5([softline$1, join$2(concat$5([",", line$2]), path.map(childPath => {
const node = childPath.getValue();
const printed = print(childPath); // Key/Value pair in open paren already indented
if (isKeyValuePairNode$1(node) && node.type === "value-comma_group" && node.groups && node.groups[2] && node.groups[2].type === "value-paren_group") {
printed.contents.contents.parts[1] = group$1(printed.contents.contents.parts[1]);
return group$1(dedent$1(printed));
}
return printed;
}, "groups"))])), ifBreak$1(!isLastItemComment && isSCSS$1(options.parser, options.originalText) && isSCSSMapItem && shouldPrintComma(options) ? "," : ""), softline$1, node.close ? path.call(print, "close") : ""]), {
shouldBreak: isSCSSMapItem
});
}
case "value-func":
{
return concat$5([node.value, insideAtRuleNode$1(path, "supports") && isMediaAndSupportsKeywords$1(node) ? " " : "", path.call(print, "group")]);
}
case "value-paren":
{
return node.value;
}
case "value-number":
{
return concat$5([printCssNumber(node.value), maybeToLowerCase$1(node.unit)]);
}
case "value-operator":
{
return node.value;
}
case "value-word":
{
if (node.isColor && node.isHex || isWideKeywords$1(node.value)) {
return node.value.toLowerCase();
}
return node.value;
}
case "value-colon":
{
return concat$5([node.value, // Don't add spaces on `:` in `url` function (i.e. `url(fbglyph: cross-outline, fig-white)`)
insideValueFunctionNode$1(path, "url") ? "" : line$2]);
}
case "value-comma":
{
return concat$5([node.value, " "]);
}
case "value-string":
{
return printString$1(node.raws.quote + node.value + node.raws.quote, options);
}
case "value-atword":
{
return concat$5(["@", node.value]);
}
case "value-unicode-range":
{
return node.value;
}
case "value-unknown":
{
return node.value;
}
default:
/* istanbul ignore next */
throw new Error("Unknown postcss type ".concat(JSON.stringify(node.type)));
}
}
function printNodeSequence(path, options, print) {
const node = path.getValue();
const parts = [];
let i = 0;
path.map(pathChild => {
const prevNode = node.nodes[i - 1];
if (prevNode && prevNode.type === "css-comment" && prevNode.text.trim() === "prettier-ignore") {
const childNode = pathChild.getValue();
parts.push(options.originalText.slice(options.locStart(childNode), options.locEnd(childNode)));
} else {
parts.push(pathChild.call(print));
}
if (i !== node.nodes.length - 1) {
if (node.nodes[i + 1].type === "css-comment" && !hasNewline$3(options.originalText, options.locStart(node.nodes[i + 1]), {
backwards: true
}) && node.nodes[i].type !== "yaml" && node.nodes[i].type !== "toml" || node.nodes[i + 1].type === "css-atrule" && node.nodes[i + 1].name === "else" && node.nodes[i].type !== "css-comment") {
parts.push(" ");
} else {
parts.push(options.__isHTMLStyleAttribute ? line$2 : hardline$4);
if (isNextLineEmpty$2(options.originalText, pathChild.getValue(), options.locEnd) && node.nodes[i].type !== "yaml" && node.nodes[i].type !== "toml") {
parts.push(hardline$4);
}
}
}
i++;
}, "nodes");
return concat$5(parts);
}
const STRING_REGEX$3 = /(['"])(?:(?!\1)[^\\]|\\[\s\S])*\1/g;
const NUMBER_REGEX = /(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?/g;
const STANDARD_UNIT_REGEX = /[a-zA-Z]+/g;
const WORD_PART_REGEX = /[$@]?[a-zA-Z_\u0080-\uFFFF][\w\-\u0080-\uFFFF]*/g;
const ADJUST_NUMBERS_REGEX = new RegExp(STRING_REGEX$3.source + "|" + "(".concat(WORD_PART_REGEX.source, ")?") + "(".concat(NUMBER_REGEX.source, ")") + "(".concat(STANDARD_UNIT_REGEX.source, ")?"), "g");
function adjustStrings(value, options) {
return value.replace(STRING_REGEX$3, match => printString$1(match, options));
}
function quoteAttributeValue(value, options) {
const quote = options.singleQuote ? "'" : '"';
return value.includes('"') || value.includes("'") ? value : quote + value + quote;
}
function adjustNumbers(value) {
return value.replace(ADJUST_NUMBERS_REGEX, (match, quote, wordPart, number, unit) => !wordPart && number ? printCssNumber(number) + maybeToLowerCase$1(unit || "") : match);
}
function printCssNumber(rawNumber) {
return printNumber$1(rawNumber) // Remove trailing `.0`.
.replace(/\.0(?=$|e)/, "");
}
var printerPostcss = {
print: genericPrint,
embed: embed_1,
insertPragma: insertPragma$2,
hasPrettierIgnore: hasIgnoreComment$1,
massageAstNode: clean_1
};
const CATEGORY_COMMON = "Common"; // format based on https://github.com/prettier/prettier/blob/master/src/main/core-options.js
var commonOptions = {
bracketSpacing: {
since: "0.0.0",
category: CATEGORY_COMMON,
type: "boolean",
default: true,
description: "Print spaces between brackets.",
oppositeDescription: "Do not print spaces between brackets."
},
singleQuote: {
since: "0.0.0",
category: CATEGORY_COMMON,
type: "boolean",
default: false,
description: "Use single quotes instead of double quotes."
},
proseWrap: {
since: "1.8.2",
category: CATEGORY_COMMON,
type: "choice",
default: [{
since: "1.8.2",
value: true
}, {
since: "1.9.0",
value: "preserve"
}],
description: "How to wrap prose.",
choices: [{
since: "1.9.0",
value: "always",
description: "Wrap prose if it exceeds the print width."
}, {
since: "1.9.0",
value: "never",
description: "Do not wrap prose."
}, {
since: "1.9.0",
value: "preserve",
description: "Wrap prose as-is."
}]
}
};
var options$2 = {
singleQuote: commonOptions.singleQuote
};
var createLanguage = function createLanguage(linguistData, override) {
const {
languageId
} = linguistData,
rest = _objectWithoutPropertiesLoose(linguistData, ["languageId"]);
return Object.assign({
linguistLanguageId: languageId
}, rest, {}, override(linguistData));
};
var name$1 = "CSS";
var type = "markup";
var tmScope = "source.css";
var aceMode = "css";
var codemirrorMode = "css";
var codemirrorMimeType = "text/css";
var color = "#563d7c";
var extensions = [
".css"
];
var languageId = 50;
var CSS = {
name: name$1,
type: type,
tmScope: tmScope,
aceMode: aceMode,
codemirrorMode: codemirrorMode,
codemirrorMimeType: codemirrorMimeType,
color: color,
extensions: extensions,
languageId: languageId
};
var CSS$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$1,
type: type,
tmScope: tmScope,
aceMode: aceMode,
codemirrorMode: codemirrorMode,
codemirrorMimeType: codemirrorMimeType,
color: color,
extensions: extensions,
languageId: languageId,
'default': CSS
});
var name$2 = "PostCSS";
var type$1 = "markup";
var tmScope$1 = "source.postcss";
var group$2 = "CSS";
var extensions$1 = [
".pcss",
".postcss"
];
var aceMode$1 = "text";
var languageId$1 = 262764437;
var PostCSS = {
name: name$2,
type: type$1,
tmScope: tmScope$1,
group: group$2,
extensions: extensions$1,
aceMode: aceMode$1,
languageId: languageId$1
};
var PostCSS$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$2,
type: type$1,
tmScope: tmScope$1,
group: group$2,
extensions: extensions$1,
aceMode: aceMode$1,
languageId: languageId$1,
'default': PostCSS
});
var name$3 = "Less";
var type$2 = "markup";
var group$3 = "CSS";
var extensions$2 = [
".less"
];
var tmScope$2 = "source.css.less";
var aceMode$2 = "less";
var codemirrorMode$1 = "css";
var codemirrorMimeType$1 = "text/css";
var languageId$2 = 198;
var Less = {
name: name$3,
type: type$2,
group: group$3,
extensions: extensions$2,
tmScope: tmScope$2,
aceMode: aceMode$2,
codemirrorMode: codemirrorMode$1,
codemirrorMimeType: codemirrorMimeType$1,
languageId: languageId$2
};
var Less$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$3,
type: type$2,
group: group$3,
extensions: extensions$2,
tmScope: tmScope$2,
aceMode: aceMode$2,
codemirrorMode: codemirrorMode$1,
codemirrorMimeType: codemirrorMimeType$1,
languageId: languageId$2,
'default': Less
});
var name$4 = "SCSS";
var type$3 = "markup";
var tmScope$3 = "source.css.scss";
var group$4 = "CSS";
var aceMode$3 = "scss";
var codemirrorMode$2 = "css";
var codemirrorMimeType$2 = "text/x-scss";
var extensions$3 = [
".scss"
];
var languageId$3 = 329;
var SCSS = {
name: name$4,
type: type$3,
tmScope: tmScope$3,
group: group$4,
aceMode: aceMode$3,
codemirrorMode: codemirrorMode$2,
codemirrorMimeType: codemirrorMimeType$2,
extensions: extensions$3,
languageId: languageId$3
};
var SCSS$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$4,
type: type$3,
tmScope: tmScope$3,
group: group$4,
aceMode: aceMode$3,
codemirrorMode: codemirrorMode$2,
codemirrorMimeType: codemirrorMimeType$2,
extensions: extensions$3,
languageId: languageId$3,
'default': SCSS
});
var require$$0$2 = getCjsExportFromNamespace(CSS$1);
var require$$1 = getCjsExportFromNamespace(PostCSS$1);
var require$$2 = getCjsExportFromNamespace(Less$1);
var require$$3 = getCjsExportFromNamespace(SCSS$1);
const languages = [createLanguage(require$$0$2, () => ({
since: "1.4.0",
parsers: ["css"],
vscodeLanguageIds: ["css"]
})), createLanguage(require$$1, () => ({
since: "1.4.0",
parsers: ["css"],
vscodeLanguageIds: ["postcss"]
})), createLanguage(require$$2, () => ({
since: "1.4.0",
parsers: ["less"],
vscodeLanguageIds: ["less"]
})), createLanguage(require$$3, () => ({
since: "1.4.0",
parsers: ["scss"],
vscodeLanguageIds: ["scss"]
}))];
const printers = {
postcss: printerPostcss
};
var languageCss = {
languages,
options: options$2,
printers
};
function hasPragma$2(text) {
return /^\s*#[^\n\S]*@(format|prettier)\s*(\n|$)/.test(text);
}
function insertPragma$3(text) {
return "# @format\n\n" + text;
}
var pragma$2 = {
hasPragma: hasPragma$2,
insertPragma: insertPragma$3
};
const {
concat: concat$6,
join: join$3,
hardline: hardline$5,
line: line$3,
softline: softline$2,
group: group$5,
indent: indent$3,
ifBreak: ifBreak$2
} = document.builders;
const {
hasIgnoreComment: hasIgnoreComment$2
} = util$1;
const {
isNextLineEmpty: isNextLineEmpty$3
} = utilShared;
const {
insertPragma: insertPragma$4
} = pragma$2;
function genericPrint$1(path, options, print) {
const n = path.getValue();
if (!n) {
return "";
}
if (typeof n === "string") {
return n;
}
switch (n.kind) {
case "Document":
{
const parts = [];
path.map((pathChild, index) => {
parts.push(concat$6([pathChild.call(print)]));
if (index !== n.definitions.length - 1) {
parts.push(hardline$5);
if (isNextLineEmpty$3(options.originalText, pathChild.getValue(), options.locEnd)) {
parts.push(hardline$5);
}
}
}, "definitions");
return concat$6([concat$6(parts), hardline$5]);
}
case "OperationDefinition":
{
const hasOperation = options.originalText[options.locStart(n)] !== "{";
const hasName = !!n.name;
return concat$6([hasOperation ? n.operation : "", hasOperation && hasName ? concat$6([" ", path.call(print, "name")]) : "", n.variableDefinitions && n.variableDefinitions.length ? group$5(concat$6(["(", indent$3(concat$6([softline$2, join$3(concat$6([ifBreak$2("", ", "), softline$2]), path.map(print, "variableDefinitions"))])), softline$2, ")"])) : "", printDirectives(path, print, n), n.selectionSet ? !hasOperation && !hasName ? "" : " " : "", path.call(print, "selectionSet")]);
}
case "FragmentDefinition":
{
return concat$6(["fragment ", path.call(print, "name"), n.variableDefinitions && n.variableDefinitions.length ? group$5(concat$6(["(", indent$3(concat$6([softline$2, join$3(concat$6([ifBreak$2("", ", "), softline$2]), path.map(print, "variableDefinitions"))])), softline$2, ")"])) : "", " on ", path.call(print, "typeCondition"), printDirectives(path, print, n), " ", path.call(print, "selectionSet")]);
}
case "SelectionSet":
{
return concat$6(["{", indent$3(concat$6([hardline$5, join$3(hardline$5, path.call(selectionsPath => printSequence(selectionsPath, options, print), "selections"))])), hardline$5, "}"]);
}
case "Field":
{
return group$5(concat$6([n.alias ? concat$6([path.call(print, "alias"), ": "]) : "", path.call(print, "name"), n.arguments.length > 0 ? group$5(concat$6(["(", indent$3(concat$6([softline$2, join$3(concat$6([ifBreak$2("", ", "), softline$2]), path.call(argsPath => printSequence(argsPath, options, print), "arguments"))])), softline$2, ")"])) : "", printDirectives(path, print, n), n.selectionSet ? " " : "", path.call(print, "selectionSet")]));
}
case "Name":
{
return n.value;
}
case "StringValue":
{
if (n.block) {
return concat$6(['"""', hardline$5, join$3(hardline$5, n.value.replace(/"""/g, "\\$&").split("\n")), hardline$5, '"""']);
}
return concat$6(['"', n.value.replace(/["\\]/g, "\\$&").replace(/\n/g, "\\n"), '"']);
}
case "IntValue":
case "FloatValue":
case "EnumValue":
{
return n.value;
}
case "BooleanValue":
{
return n.value ? "true" : "false";
}
case "NullValue":
{
return "null";
}
case "Variable":
{
return concat$6(["$", path.call(print, "name")]);
}
case "ListValue":
{
return group$5(concat$6(["[", indent$3(concat$6([softline$2, join$3(concat$6([ifBreak$2("", ", "), softline$2]), path.map(print, "values"))])), softline$2, "]"]));
}
case "ObjectValue":
{
return group$5(concat$6(["{", options.bracketSpacing && n.fields.length > 0 ? " " : "", indent$3(concat$6([softline$2, join$3(concat$6([ifBreak$2("", ", "), softline$2]), path.map(print, "fields"))])), softline$2, ifBreak$2("", options.bracketSpacing && n.fields.length > 0 ? " " : ""), "}"]));
}
case "ObjectField":
case "Argument":
{
return concat$6([path.call(print, "name"), ": ", path.call(print, "value")]);
}
case "Directive":
{
return concat$6(["@", path.call(print, "name"), n.arguments.length > 0 ? group$5(concat$6(["(", indent$3(concat$6([softline$2, join$3(concat$6([ifBreak$2("", ", "), softline$2]), path.call(argsPath => printSequence(argsPath, options, print), "arguments"))])), softline$2, ")"])) : ""]);
}
case "NamedType":
{
return path.call(print, "name");
}
case "VariableDefinition":
{
return concat$6([path.call(print, "variable"), ": ", path.call(print, "type"), n.defaultValue ? concat$6([" = ", path.call(print, "defaultValue")]) : "", printDirectives(path, print, n)]);
}
case "TypeExtensionDefinition":
{
return concat$6(["extend ", path.call(print, "definition")]);
}
case "ObjectTypeExtension":
case "ObjectTypeDefinition":
{
return concat$6([path.call(print, "description"), n.description ? hardline$5 : "", n.kind === "ObjectTypeExtension" ? "extend " : "", "type ", path.call(print, "name"), n.interfaces.length > 0 ? concat$6([" implements ", concat$6(printInterfaces(path, options, print))]) : "", printDirectives(path, print, n), n.fields.length > 0 ? concat$6([" {", indent$3(concat$6([hardline$5, join$3(hardline$5, path.call(fieldsPath => printSequence(fieldsPath, options, print), "fields"))])), hardline$5, "}"]) : ""]);
}
case "FieldDefinition":
{
return concat$6([path.call(print, "description"), n.description ? hardline$5 : "", path.call(print, "name"), n.arguments.length > 0 ? group$5(concat$6(["(", indent$3(concat$6([softline$2, join$3(concat$6([ifBreak$2("", ", "), softline$2]), path.call(argsPath => printSequence(argsPath, options, print), "arguments"))])), softline$2, ")"])) : "", ": ", path.call(print, "type"), printDirectives(path, print, n)]);
}
case "DirectiveDefinition":
{
return concat$6([path.call(print, "description"), n.description ? hardline$5 : "", "directive ", "@", path.call(print, "name"), n.arguments.length > 0 ? group$5(concat$6(["(", indent$3(concat$6([softline$2, join$3(concat$6([ifBreak$2("", ", "), softline$2]), path.call(argsPath => printSequence(argsPath, options, print), "arguments"))])), softline$2, ")"])) : "", n.repeatable ? " repeatable" : "", concat$6([" on ", join$3(" | ", path.map(print, "locations"))])]);
}
case "EnumTypeExtension":
case "EnumTypeDefinition":
{
return concat$6([path.call(print, "description"), n.description ? hardline$5 : "", n.kind === "EnumTypeExtension" ? "extend " : "", "enum ", path.call(print, "name"), printDirectives(path, print, n), n.values.length > 0 ? concat$6([" {", indent$3(concat$6([hardline$5, join$3(hardline$5, path.call(valuesPath => printSequence(valuesPath, options, print), "values"))])), hardline$5, "}"]) : ""]);
}
case "EnumValueDefinition":
{
return concat$6([path.call(print, "description"), n.description ? hardline$5 : "", path.call(print, "name"), printDirectives(path, print, n)]);
}
case "InputValueDefinition":
{
return concat$6([path.call(print, "description"), n.description ? n.description.block ? hardline$5 : line$3 : "", path.call(print, "name"), ": ", path.call(print, "type"), n.defaultValue ? concat$6([" = ", path.call(print, "defaultValue")]) : "", printDirectives(path, print, n)]);
}
case "InputObjectTypeExtension":
case "InputObjectTypeDefinition":
{
return concat$6([path.call(print, "description"), n.description ? hardline$5 : "", n.kind === "InputObjectTypeExtension" ? "extend " : "", "input ", path.call(print, "name"), printDirectives(path, print, n), n.fields.length > 0 ? concat$6([" {", indent$3(concat$6([hardline$5, join$3(hardline$5, path.call(fieldsPath => printSequence(fieldsPath, options, print), "fields"))])), hardline$5, "}"]) : ""]);
}
case "SchemaDefinition":
{
return concat$6(["schema", printDirectives(path, print, n), " {", n.operationTypes.length > 0 ? indent$3(concat$6([hardline$5, join$3(hardline$5, path.call(opsPath => printSequence(opsPath, options, print), "operationTypes"))])) : "", hardline$5, "}"]);
}
case "OperationTypeDefinition":
{
return concat$6([path.call(print, "operation"), ": ", path.call(print, "type")]);
}
case "InterfaceTypeExtension":
case "InterfaceTypeDefinition":
{
return concat$6([path.call(print, "description"), n.description ? hardline$5 : "", n.kind === "InterfaceTypeExtension" ? "extend " : "", "interface ", path.call(print, "name"), printDirectives(path, print, n), n.fields.length > 0 ? concat$6([" {", indent$3(concat$6([hardline$5, join$3(hardline$5, path.call(fieldsPath => printSequence(fieldsPath, options, print), "fields"))])), hardline$5, "}"]) : ""]);
}
case "FragmentSpread":
{
return concat$6(["...", path.call(print, "name"), printDirectives(path, print, n)]);
}
case "InlineFragment":
{
return concat$6(["...", n.typeCondition ? concat$6([" on ", path.call(print, "typeCondition")]) : "", printDirectives(path, print, n), " ", path.call(print, "selectionSet")]);
}
case "UnionTypeExtension":
case "UnionTypeDefinition":
{
return group$5(concat$6([path.call(print, "description"), n.description ? hardline$5 : "", group$5(concat$6([n.kind === "UnionTypeExtension" ? "extend " : "", "union ", path.call(print, "name"), printDirectives(path, print, n), n.types.length > 0 ? concat$6([" =", ifBreak$2("", " "), indent$3(concat$6([ifBreak$2(concat$6([line$3, " "])), join$3(concat$6([line$3, "| "]), path.map(print, "types"))]))]) : ""]))]));
}
case "ScalarTypeExtension":
case "ScalarTypeDefinition":
{
return concat$6([path.call(print, "description"), n.description ? hardline$5 : "", n.kind === "ScalarTypeExtension" ? "extend " : "", "scalar ", path.call(print, "name"), printDirectives(path, print, n)]);
}
case "NonNullType":
{
return concat$6([path.call(print, "type"), "!"]);
}
case "ListType":
{
return concat$6(["[", path.call(print, "type"), "]"]);
}
default:
/* istanbul ignore next */
throw new Error("unknown graphql type: " + JSON.stringify(n.kind));
}
}
function printDirectives(path, print, n) {
if (n.directives.length === 0) {
return "";
}
return concat$6([" ", group$5(indent$3(concat$6([softline$2, join$3(concat$6([ifBreak$2("", " "), softline$2]), path.map(print, "directives"))])))]);
}
function printSequence(sequencePath, options, print) {
const count = sequencePath.getValue().length;
return sequencePath.map((path, i) => {
const printed = print(path);
if (isNextLineEmpty$3(options.originalText, path.getValue(), options.locEnd) && i < count - 1) {
return concat$6([printed, hardline$5]);
}
return printed;
});
}
function canAttachComment(node) {
return node.kind && node.kind !== "Comment";
}
function printComment$1(commentPath) {
const comment = commentPath.getValue();
if (comment.kind === "Comment") {
return "#" + comment.value.trimEnd();
}
throw new Error("Not a comment: " + JSON.stringify(comment));
}
function determineInterfaceSeparatorBetween(first, second, options) {
const textBetween = options.originalText.slice(first.loc.end, second.loc.start).replace(/#.*/g, "").trim();
return textBetween === "," ? ", " : " & ";
}
function printInterfaces(path, options, print) {
const node = path.getNode();
const parts = [];
const {
interfaces
} = node;
const printed = path.map(node => print(node), "interfaces");
for (let index = 0; index < interfaces.length; index++) {
const interfaceNode = interfaces[index];
if (index > 0) {
parts.push(determineInterfaceSeparatorBetween(interfaces[index - 1], interfaceNode, options));
}
parts.push(printed[index]);
}
return parts;
}
function clean$1(node, newNode
/*, parent*/
) {
delete newNode.loc;
delete newNode.comments;
}
var printerGraphql = {
print: genericPrint$1,
massageAstNode: clean$1,
hasPrettierIgnore: hasIgnoreComment$2,
insertPragma: insertPragma$4,
printComment: printComment$1,
canAttachComment
};
var options$3 = {
bracketSpacing: commonOptions.bracketSpacing
};
var name$5 = "GraphQL";
var type$4 = "data";
var extensions$4 = [
".graphql",
".gql",
".graphqls"
];
var tmScope$4 = "source.graphql";
var aceMode$4 = "text";
var languageId$4 = 139;
var GraphQL = {
name: name$5,
type: type$4,
extensions: extensions$4,
tmScope: tmScope$4,
aceMode: aceMode$4,
languageId: languageId$4
};
var GraphQL$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$5,
type: type$4,
extensions: extensions$4,
tmScope: tmScope$4,
aceMode: aceMode$4,
languageId: languageId$4,
'default': GraphQL
});
var require$$0$3 = getCjsExportFromNamespace(GraphQL$1);
const languages$1 = [createLanguage(require$$0$3, () => ({
since: "1.5.0",
parsers: ["graphql"],
vscodeLanguageIds: ["graphql"]
}))];
const printers$1 = {
graphql: printerGraphql
};
var languageGraphql = {
languages: languages$1,
options: options$3,
printers: printers$1
};
var clean$2 = function clean(ast, newNode) {
delete newNode.loc;
delete newNode.selfClosing; // (Glimmer/HTML) ignore TextNode whitespace
if (ast.type === "TextNode") {
const trimmed = ast.chars.trim();
if (!trimmed) {
return null;
}
newNode.chars = trimmed;
}
};
function isUppercase(string) {
return string.toUpperCase() === string;
}
function isGlimmerComponent(node) {
return isNodeOfSomeType(node, ["ElementNode"]) && typeof node.tag === "string" && (isUppercase(node.tag[0]) || node.tag.includes("."));
}
function isWhitespaceNode(node) {
return isNodeOfSomeType(node, ["TextNode"]) && !/\S/.test(node.chars);
}
function isNodeOfSomeType(node, types) {
return node && types.some(type => node.type === type);
}
function isParentOfSomeType(path, types) {
const parentNode = path.getParentNode(0);
return isNodeOfSomeType(parentNode, types);
}
function isPreviousNodeOfSomeType(path, types) {
const previousNode = getPreviousNode(path);
return isNodeOfSomeType(previousNode, types);
}
function isNextNodeOfSomeType(path, types) {
const nextNode = getNextNode(path);
return isNodeOfSomeType(nextNode, types);
}
function getSiblingNode(path, offset) {
const node = path.getValue();
const parentNode = path.getParentNode(0) || {};
const children = parentNode.children || parentNode.body || [];
const index = children.indexOf(node);
return index !== -1 && children[index + offset];
}
function getPreviousNode(path, lookBack = 1) {
return getSiblingNode(path, -lookBack);
}
function getNextNode(path) {
return getSiblingNode(path, 1);
}
function isPrettierIgnoreNode(node) {
return isNodeOfSomeType(node, ["MustacheCommentStatement"]) && typeof node.value === "string" && node.value.trim() === "prettier-ignore";
}
function hasPrettierIgnore(path) {
const node = path.getValue();
const previousPreviousNode = getPreviousNode(path, 2);
return isPrettierIgnoreNode(node) || isPrettierIgnoreNode(previousPreviousNode);
}
var utils$3 = {
getNextNode,
getPreviousNode,
hasPrettierIgnore,
isGlimmerComponent,
isNextNodeOfSomeType,
isNodeOfSomeType,
isParentOfSomeType,
isPreviousNodeOfSomeType,
isWhitespaceNode
};
const {
concat: concat$7,
join: join$4,
softline: softline$3,
hardline: hardline$6,
line: line$4,
group: group$6,
indent: indent$4,
ifBreak: ifBreak$3
} = document.builders;
const {
getNextNode: getNextNode$1,
getPreviousNode: getPreviousNode$1,
hasPrettierIgnore: hasPrettierIgnore$1,
isGlimmerComponent: isGlimmerComponent$1,
isNextNodeOfSomeType: isNextNodeOfSomeType$1,
isParentOfSomeType: isParentOfSomeType$1,
isPreviousNodeOfSomeType: isPreviousNodeOfSomeType$1,
isWhitespaceNode: isWhitespaceNode$1
} = utils$3; // http://w3c.github.io/html/single-page.html#void-elements
const voidTags = ["area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", "track", "wbr"]; // Formatter based on @glimmerjs/syntax's built-in test formatter:
// https://github.com/glimmerjs/glimmer-vm/blob/master/packages/%40glimmer/syntax/lib/generation/print.ts
function print(path, options, print) {
const n = path.getValue();
/* istanbul ignore if*/
if (!n) {
return "";
}
if (hasPrettierIgnore$1(path)) {
const startOffset = locationToOffset(options.originalText, n.loc.start.line - 1, n.loc.start.column);
const endOffset = locationToOffset(options.originalText, n.loc.end.line - 1, n.loc.end.column);
const ignoredText = options.originalText.slice(startOffset, endOffset);
return ignoredText;
}
switch (n.type) {
case "Block":
case "Program":
case "Template":
{
return group$6(concat$7(path.map(print, "body")));
}
case "ElementNode":
{
const hasChildren = n.children.length > 0;
const hasNonWhitespaceChildren = n.children.some(n => !isWhitespaceNode$1(n));
const isVoid = isGlimmerComponent$1(n) && (!hasChildren || !hasNonWhitespaceChildren) || voidTags.includes(n.tag);
const closeTagForNoBreak = isVoid ? concat$7([" />", softline$3]) : ">";
const closeTagForBreak = isVoid ? "/>" : ">";
const printParams = (path, print) => indent$4(concat$7([n.attributes.length ? line$4 : "", join$4(line$4, path.map(print, "attributes")), n.modifiers.length ? line$4 : "", join$4(line$4, path.map(print, "modifiers")), n.comments.length ? line$4 : "", join$4(line$4, path.map(print, "comments"))]));
const nextNode = getNextNode$1(path);
return concat$7([group$6(concat$7(["<", n.tag, printParams(path, print), n.blockParams.length ? " as |".concat(n.blockParams.join(" "), "|") : "", ifBreak$3(softline$3, ""), ifBreak$3(closeTagForBreak, closeTagForNoBreak)])), !isVoid ? group$6(concat$7([hasNonWhitespaceChildren ? indent$4(printChildren(path, options, print)) : "", ifBreak$3(hasChildren ? hardline$6 : "", ""), concat$7(["", n.tag, ">"])])) : "", nextNode && nextNode.type === "ElementNode" ? hardline$6 : ""]);
}
case "BlockStatement":
{
const pp = path.getParentNode(1);
const isElseIf = pp && pp.inverse && pp.inverse.body.length === 1 && pp.inverse.body[0] === n && pp.inverse.body[0].path.parts[0] === "if";
const hasElseIf = n.inverse && n.inverse.body.length === 1 && n.inverse.body[0].type === "BlockStatement" && n.inverse.body[0].path.parts[0] === "if";
const indentElse = hasElseIf ? a => a : indent$4;
const inverseElseStatement = (n.inverseStrip.open ? "{{~" : "{{") + "else" + (n.inverseStrip.close ? "~}}" : "}}");
if (n.inverse) {
return concat$7([isElseIf ? concat$7([n.openStrip.open ? "{{~else " : "{{else ", printPathParams(path, print), n.openStrip.close ? "~}}" : "}}"]) : printOpenBlock(path, print, n.openStrip), indent$4(concat$7([hardline$6, path.call(print, "program")])), n.inverse && !hasElseIf ? concat$7([hardline$6, inverseElseStatement]) : "", n.inverse ? indentElse(concat$7([hardline$6, path.call(print, "inverse")])) : "", isElseIf ? "" : concat$7([hardline$6, printCloseBlock(path, print, n.closeStrip)])]);
} else if (isElseIf) {
return concat$7([concat$7([n.openStrip.open ? "{{~else" : "{{else ", printPathParams(path, print), n.openStrip.close ? "~}}" : "}}"]), indent$4(concat$7([hardline$6, path.call(print, "program")]))]);
}
const hasNonWhitespaceChildren = n.program.body.some(n => !isWhitespaceNode$1(n));
return concat$7([printOpenBlock(path, print, n.openStrip), group$6(concat$7([indent$4(concat$7([softline$3, path.call(print, "program")])), hasNonWhitespaceChildren ? hardline$6 : softline$3, printCloseBlock(path, print, n.closeStrip)]))]);
}
case "ElementModifierStatement":
{
return group$6(concat$7(["{{", printPathParams(path, print), softline$3, "}}"]));
}
case "MustacheStatement":
{
const isEscaped = n.escaped === false;
const {
open: openStrip,
close: closeStrip
} = n.strip;
const opening = (isEscaped ? "{{{" : "{{") + (openStrip ? "~" : "");
const closing = (closeStrip ? "~" : "") + (isEscaped ? "}}}" : "}}");
const leading = isParentOfSomeType$1(path, ["AttrNode", "ConcatStatement", "ElementNode"]) ? [opening, indent$4(softline$3)] : [opening];
return group$6(concat$7([...leading, printPathParams(path, print), softline$3, closing]));
}
case "SubExpression":
{
const params = printParams(path, print);
const printedParams = params.length > 0 ? indent$4(concat$7([line$4, group$6(join$4(line$4, params))])) : "";
return group$6(concat$7(["(", printPath(path, print), printedParams, softline$3, ")"]));
}
case "AttrNode":
{
const isText = n.value.type === "TextNode";
const isEmptyText = isText && n.value.chars === ""; // If the text is empty and the value's loc start and end columns are the
// same, there is no value for this AttrNode and it should be printed
// without the `=""`. Example: `
` -> `
`
const isEmptyValue = isEmptyText && n.value.loc.start.column === n.value.loc.end.column;
if (isEmptyValue) {
return concat$7([n.name]);
}
const value = path.call(print, "value");
const quotedValue = isText ? printStringLiteral(value.parts.join(), options) : value;
return concat$7([n.name, "=", quotedValue]);
}
case "ConcatStatement":
{
return concat$7(['"', concat$7(path.map(partPath => print(partPath), "parts").filter(a => a !== "")), '"']);
}
case "Hash":
{
return concat$7([join$4(line$4, path.map(print, "pairs"))]);
}
case "HashPair":
{
return concat$7([n.key, "=", path.call(print, "value")]);
}
case "TextNode":
{
const maxLineBreaksToPreserve = 2;
const isFirstElement = !getPreviousNode$1(path);
const isLastElement = !getNextNode$1(path);
const isWhitespaceOnly = !/\S/.test(n.chars);
const lineBreaksCount = countNewLines(n.chars);
const hasBlockParent = path.getParentNode(0).type === "Block";
const hasElementParent = path.getParentNode(0).type === "ElementNode";
const hasTemplateParent = path.getParentNode(0).type === "Template";
let leadingLineBreaksCount = countLeadingNewLines(n.chars);
let trailingLineBreaksCount = countTrailingNewLines(n.chars);
if ((isFirstElement || isLastElement) && isWhitespaceOnly && (hasBlockParent || hasElementParent || hasTemplateParent)) {
return "";
}
if (isWhitespaceOnly && lineBreaksCount) {
leadingLineBreaksCount = Math.min(lineBreaksCount, maxLineBreaksToPreserve);
trailingLineBreaksCount = 0;
} else {
if (isNextNodeOfSomeType$1(path, ["BlockStatement", "ElementNode"])) {
trailingLineBreaksCount = Math.max(trailingLineBreaksCount, 1);
}
if (isPreviousNodeOfSomeType$1(path, ["ElementNode"]) || isPreviousNodeOfSomeType$1(path, ["BlockStatement"])) {
leadingLineBreaksCount = Math.max(leadingLineBreaksCount, 1);
}
}
let leadingSpace = "";
let trailingSpace = ""; // preserve a space inside of an attribute node where whitespace present,
// when next to mustache statement.
const inAttrNode = path.stack.includes("attributes");
if (inAttrNode) {
const parentNode = path.getParentNode(0);
const isConcat = parentNode.type === "ConcatStatement";
if (isConcat) {
const {
parts
} = parentNode;
const partIndex = parts.indexOf(n);
if (partIndex > 0) {
const partType = parts[partIndex - 1].type;
const isMustache = partType === "MustacheStatement";
if (isMustache) {
leadingSpace = " ";
}
}
if (partIndex < parts.length - 1) {
const partType = parts[partIndex + 1].type;
const isMustache = partType === "MustacheStatement";
if (isMustache) {
trailingSpace = " ";
}
}
}
} else {
if (trailingLineBreaksCount === 0 && isNextNodeOfSomeType$1(path, ["MustacheStatement"])) {
trailingSpace = " ";
}
if (leadingLineBreaksCount === 0 && isPreviousNodeOfSomeType$1(path, ["MustacheStatement"])) {
leadingSpace = " ";
}
if (isFirstElement) {
leadingLineBreaksCount = 0;
leadingSpace = "";
}
if (isLastElement) {
trailingLineBreaksCount = 0;
trailingSpace = "";
}
}
return concat$7([...generateHardlines(leadingLineBreaksCount, maxLineBreaksToPreserve), n.chars.replace(/^[\s ]+/g, leadingSpace).replace(/[\s ]+$/, trailingSpace), ...generateHardlines(trailingLineBreaksCount, maxLineBreaksToPreserve)].filter(Boolean));
}
case "MustacheCommentStatement":
{
const dashes = n.value.includes("}}") ? "--" : "";
return concat$7(["{{!", dashes, n.value, dashes, "}}"]);
}
case "PathExpression":
{
return n.original;
}
case "BooleanLiteral":
{
return String(n.value);
}
case "CommentStatement":
{
return concat$7([""]);
}
case "StringLiteral":
{
return printStringLiteral(n.value, options);
}
case "NumberLiteral":
{
return String(n.value);
}
case "UndefinedLiteral":
{
return "undefined";
}
case "NullLiteral":
{
return "null";
}
/* istanbul ignore next */
default:
throw new Error("unknown glimmer type: " + JSON.stringify(n.type));
}
}
function printChildren(path, options, print) {
return concat$7(path.map((childPath, childIndex) => {
const childNode = path.getValue();
const isFirstNode = childIndex === 0;
const isLastNode = childIndex === path.getParentNode(0).children.length - 1;
const isLastNodeInMultiNodeList = isLastNode && !isFirstNode;
const isWhitespace = isWhitespaceNode$1(childNode);
if (isWhitespace && isLastNodeInMultiNodeList) {
return print(childPath, options, print);
} else if (isFirstNode) {
return concat$7([softline$3, print(childPath, options, print)]);
}
return print(childPath, options, print);
}, "children"));
}
/**
* Prints a string literal with the correct surrounding quotes based on
* `options.singleQuote` and the number of escaped quotes contained in
* the string literal. This function is the glimmer equivalent of `printString`
* in `common/util`, but has differences because of the way escaped characters
* are treated in hbs string literals.
* @param {string} stringLiteral - the string literal value
* @param {object} options - the prettier options object
*/
function printStringLiteral(stringLiteral, options) {
const double = {
quote: '"',
regex: /"/g
};
const single = {
quote: "'",
regex: /'/g
};
const preferred = options.singleQuote ? single : double;
const alternate = preferred === single ? double : single;
let shouldUseAlternateQuote = false; // If `stringLiteral` contains at least one of the quote preferred for
// enclosing the string, we might want to enclose with the alternate quote
// instead, to minimize the number of escaped quotes.
if (stringLiteral.includes(preferred.quote) || stringLiteral.includes(alternate.quote)) {
const numPreferredQuotes = (stringLiteral.match(preferred.regex) || []).length;
const numAlternateQuotes = (stringLiteral.match(alternate.regex) || []).length;
shouldUseAlternateQuote = numPreferredQuotes > numAlternateQuotes;
}
const enclosingQuote = shouldUseAlternateQuote ? alternate : preferred;
const escapedStringLiteral = stringLiteral.replace(enclosingQuote.regex, "\\".concat(enclosingQuote.quote));
return concat$7([enclosingQuote.quote, escapedStringLiteral, enclosingQuote.quote]);
}
function printPath(path, print) {
return path.call(print, "path");
}
function printParams(path, print) {
const node = path.getValue();
let parts = [];
if (node.params.length > 0) {
parts = parts.concat(path.map(print, "params"));
}
if (node.hash && node.hash.pairs.length > 0) {
parts.push(path.call(print, "hash"));
}
return parts;
}
function printPathParams(path, print) {
const printedPath = printPath(path, print);
const printedParams = printParams(path, print);
const parts = [printedPath, ...printedParams];
return indent$4(group$6(join$4(line$4, parts)));
}
function printBlockParams(path) {
const block = path.getValue();
if (!block.program || !block.program.blockParams.length) {
return "";
}
return concat$7([" as |", block.program.blockParams.join(" "), "|"]);
}
function printOpenBlock(path, print, {
open: isOpenStrip = false,
close: isCloseStrip = false
} = {}) {
return group$6(concat$7([isOpenStrip ? "{{~#" : "{{#", printPathParams(path, print), printBlockParams(path), softline$3, isCloseStrip ? "~}}" : "}}"]));
}
function printCloseBlock(path, print, {
open: isOpenStrip = false,
close: isCloseStrip = false
} = {}) {
return concat$7([isOpenStrip ? "{{~/" : "{{/", path.call(print, "path"), isCloseStrip ? "~}}" : "}}"]);
}
function countNewLines(string) {
/* istanbul ignore next */
string = typeof string === "string" ? string : "";
return string.split("\n").length - 1;
}
function countLeadingNewLines(string) {
/* istanbul ignore next */
string = typeof string === "string" ? string : "";
const newLines = (string.match(/^([^\S\r\n]*[\r\n])+/g) || [])[0] || "";
return countNewLines(newLines);
}
function countTrailingNewLines(string) {
/* istanbul ignore next */
string = typeof string === "string" ? string : "";
const newLines = (string.match(/([\r\n][^\S\r\n]*)+$/g) || [])[0] || "";
return countNewLines(newLines);
}
function generateHardlines(number = 0, max = 0) {
return new Array(Math.min(number, max)).fill(hardline$6);
}
/* istanbul ignore next
https://github.com/glimmerjs/glimmer-vm/blob/master/packages/%40glimmer/compiler/lib/location.ts#L5-L29
*/
function locationToOffset(source, line, column) {
let seenLines = 0;
let seenChars = 0; // eslint-disable-next-line no-constant-condition
while (true) {
if (seenChars === source.length) {
return null;
}
let nextLine = source.indexOf("\n", seenChars);
if (nextLine === -1) {
nextLine = source.length;
}
if (seenLines === line) {
if (seenChars + column > nextLine) {
return null;
}
return seenChars + column;
} else if (nextLine === -1) {
return null;
}
seenLines += 1;
seenChars = nextLine + 1;
}
}
var printerGlimmer = {
print,
massageAstNode: clean$2
};
var name$6 = "Handlebars";
var type$5 = "markup";
var group$7 = "HTML";
var aliases = [
"hbs",
"htmlbars"
];
var extensions$5 = [
".handlebars",
".hbs"
];
var tmScope$5 = "text.html.handlebars";
var aceMode$5 = "handlebars";
var languageId$5 = 155;
var Handlebars = {
name: name$6,
type: type$5,
group: group$7,
aliases: aliases,
extensions: extensions$5,
tmScope: tmScope$5,
aceMode: aceMode$5,
languageId: languageId$5
};
var Handlebars$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$6,
type: type$5,
group: group$7,
aliases: aliases,
extensions: extensions$5,
tmScope: tmScope$5,
aceMode: aceMode$5,
languageId: languageId$5,
'default': Handlebars
});
var require$$0$4 = getCjsExportFromNamespace(Handlebars$1);
const languages$2 = [createLanguage(require$$0$4, () => ({
since: null,
// unreleased
parsers: ["glimmer"],
vscodeLanguageIds: ["handlebars"]
}))];
const printers$2 = {
glimmer: printerGlimmer
};
var languageHandlebars = {
languages: languages$2,
printers: printers$2
};
var clean$3 = function clean(ast, newNode) {
delete newNode.sourceSpan;
delete newNode.startSourceSpan;
delete newNode.endSourceSpan;
delete newNode.nameSpan;
delete newNode.valueSpan;
if (ast.type === "text" || ast.type === "comment") {
return null;
} // may be formatted by multiparser
if (ast.type === "yaml" || ast.type === "toml") {
return null;
}
if (ast.type === "attribute") {
delete newNode.value;
}
if (ast.type === "docType") {
delete newNode.value;
}
};
var json = {
"CSS_DISPLAY_TAGS": {
"area": "none",
"base": "none",
"basefont": "none",
"datalist": "none",
"head": "none",
"link": "none",
"meta": "none",
"noembed": "none",
"noframes": "none",
"param": "none",
"rp": "none",
"script": "block",
"source": "block",
"style": "none",
"template": "inline",
"track": "block",
"title": "none",
"html": "block",
"body": "block",
"address": "block",
"blockquote": "block",
"center": "block",
"div": "block",
"figure": "block",
"figcaption": "block",
"footer": "block",
"form": "block",
"header": "block",
"hr": "block",
"legend": "block",
"listing": "block",
"main": "block",
"p": "block",
"plaintext": "block",
"pre": "block",
"xmp": "block",
"slot": "contents",
"ruby": "ruby",
"rt": "ruby-text",
"article": "block",
"aside": "block",
"h1": "block",
"h2": "block",
"h3": "block",
"h4": "block",
"h5": "block",
"h6": "block",
"hgroup": "block",
"nav": "block",
"section": "block",
"dir": "block",
"dd": "block",
"dl": "block",
"dt": "block",
"ol": "block",
"ul": "block",
"li": "list-item",
"table": "table",
"caption": "table-caption",
"colgroup": "table-column-group",
"col": "table-column",
"thead": "table-header-group",
"tbody": "table-row-group",
"tfoot": "table-footer-group",
"tr": "table-row",
"td": "table-cell",
"th": "table-cell",
"fieldset": "block",
"button": "inline-block",
"video": "inline-block",
"audio": "inline-block"
},
"CSS_DISPLAY_DEFAULT": "inline",
"CSS_WHITE_SPACE_TAGS": {
"listing": "pre",
"plaintext": "pre",
"pre": "pre",
"xmp": "pre",
"nobr": "nowrap",
"table": "initial",
"textarea": "pre-wrap"
},
"CSS_WHITE_SPACE_DEFAULT": "normal"
};
var index = [
"a",
"abbr",
"acronym",
"address",
"applet",
"area",
"article",
"aside",
"audio",
"b",
"base",
"basefont",
"bdi",
"bdo",
"bgsound",
"big",
"blink",
"blockquote",
"body",
"br",
"button",
"canvas",
"caption",
"center",
"cite",
"code",
"col",
"colgroup",
"command",
"content",
"data",
"datalist",
"dd",
"del",
"details",
"dfn",
"dialog",
"dir",
"div",
"dl",
"dt",
"element",
"em",
"embed",
"fieldset",
"figcaption",
"figure",
"font",
"footer",
"form",
"frame",
"frameset",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
"head",
"header",
"hgroup",
"hr",
"html",
"i",
"iframe",
"image",
"img",
"input",
"ins",
"isindex",
"kbd",
"keygen",
"label",
"legend",
"li",
"link",
"listing",
"main",
"map",
"mark",
"marquee",
"math",
"menu",
"menuitem",
"meta",
"meter",
"multicol",
"nav",
"nextid",
"nobr",
"noembed",
"noframes",
"noscript",
"object",
"ol",
"optgroup",
"option",
"output",
"p",
"param",
"picture",
"plaintext",
"pre",
"progress",
"q",
"rb",
"rbc",
"rp",
"rt",
"rtc",
"ruby",
"s",
"samp",
"script",
"section",
"select",
"shadow",
"slot",
"small",
"source",
"spacer",
"span",
"strike",
"strong",
"style",
"sub",
"summary",
"sup",
"svg",
"table",
"tbody",
"td",
"template",
"textarea",
"tfoot",
"th",
"thead",
"time",
"title",
"tr",
"track",
"tt",
"u",
"ul",
"var",
"video",
"wbr",
"xmp"
];
var htmlTagNames = /*#__PURE__*/Object.freeze({
__proto__: null,
'default': index
});
var a = [
"accesskey",
"charset",
"coords",
"download",
"href",
"hreflang",
"name",
"ping",
"referrerpolicy",
"rel",
"rev",
"shape",
"tabindex",
"target",
"type"
];
var abbr = [
"title"
];
var applet = [
"align",
"alt",
"archive",
"code",
"codebase",
"height",
"hspace",
"name",
"object",
"vspace",
"width"
];
var area = [
"accesskey",
"alt",
"coords",
"download",
"href",
"hreflang",
"nohref",
"ping",
"referrerpolicy",
"rel",
"shape",
"tabindex",
"target",
"type"
];
var audio = [
"autoplay",
"controls",
"crossorigin",
"loop",
"muted",
"preload",
"src"
];
var base = [
"href",
"target"
];
var basefont = [
"color",
"face",
"size"
];
var bdo = [
"dir"
];
var blockquote = [
"cite"
];
var body = [
"alink",
"background",
"bgcolor",
"link",
"text",
"vlink"
];
var br = [
"clear"
];
var button = [
"accesskey",
"autofocus",
"disabled",
"form",
"formaction",
"formenctype",
"formmethod",
"formnovalidate",
"formtarget",
"name",
"tabindex",
"type",
"value"
];
var canvas = [
"height",
"width"
];
var caption = [
"align"
];
var col = [
"align",
"char",
"charoff",
"span",
"valign",
"width"
];
var colgroup = [
"align",
"char",
"charoff",
"span",
"valign",
"width"
];
var data = [
"value"
];
var del = [
"cite",
"datetime"
];
var details = [
"open"
];
var dfn = [
"title"
];
var dialog = [
"open"
];
var dir = [
"compact"
];
var div = [
"align"
];
var dl = [
"compact"
];
var embed$1 = [
"height",
"src",
"type",
"width"
];
var fieldset = [
"disabled",
"form",
"name"
];
var font = [
"color",
"face",
"size"
];
var form = [
"accept",
"accept-charset",
"action",
"autocomplete",
"enctype",
"method",
"name",
"novalidate",
"target"
];
var frame = [
"frameborder",
"longdesc",
"marginheight",
"marginwidth",
"name",
"noresize",
"scrolling",
"src"
];
var frameset = [
"cols",
"rows"
];
var h1 = [
"align"
];
var h2 = [
"align"
];
var h3 = [
"align"
];
var h4 = [
"align"
];
var h5 = [
"align"
];
var h6 = [
"align"
];
var head = [
"profile"
];
var hr = [
"align",
"noshade",
"size",
"width"
];
var html = [
"manifest",
"version"
];
var iframe = [
"align",
"allow",
"allowfullscreen",
"allowpaymentrequest",
"allowusermedia",
"frameborder",
"height",
"longdesc",
"marginheight",
"marginwidth",
"name",
"referrerpolicy",
"sandbox",
"scrolling",
"src",
"srcdoc",
"width"
];
var img = [
"align",
"alt",
"border",
"crossorigin",
"decoding",
"height",
"hspace",
"ismap",
"longdesc",
"name",
"referrerpolicy",
"sizes",
"src",
"srcset",
"usemap",
"vspace",
"width"
];
var input = [
"accept",
"accesskey",
"align",
"alt",
"autocomplete",
"autofocus",
"checked",
"dirname",
"disabled",
"form",
"formaction",
"formenctype",
"formmethod",
"formnovalidate",
"formtarget",
"height",
"ismap",
"list",
"max",
"maxlength",
"min",
"minlength",
"multiple",
"name",
"pattern",
"placeholder",
"readonly",
"required",
"size",
"src",
"step",
"tabindex",
"title",
"type",
"usemap",
"value",
"width"
];
var ins = [
"cite",
"datetime"
];
var isindex = [
"prompt"
];
var label = [
"accesskey",
"for",
"form"
];
var legend = [
"accesskey",
"align"
];
var li = [
"type",
"value"
];
var link$3 = [
"as",
"charset",
"color",
"crossorigin",
"href",
"hreflang",
"imagesizes",
"imagesrcset",
"integrity",
"media",
"nonce",
"referrerpolicy",
"rel",
"rev",
"sizes",
"target",
"title",
"type"
];
var map = [
"name"
];
var menu = [
"compact"
];
var meta = [
"charset",
"content",
"http-equiv",
"name",
"scheme"
];
var meter = [
"high",
"low",
"max",
"min",
"optimum",
"value"
];
var object = [
"align",
"archive",
"border",
"classid",
"codebase",
"codetype",
"data",
"declare",
"form",
"height",
"hspace",
"name",
"standby",
"tabindex",
"type",
"typemustmatch",
"usemap",
"vspace",
"width"
];
var ol = [
"compact",
"reversed",
"start",
"type"
];
var optgroup = [
"disabled",
"label"
];
var option = [
"disabled",
"label",
"selected",
"value"
];
var output = [
"for",
"form",
"name"
];
var p = [
"align"
];
var param = [
"name",
"type",
"value",
"valuetype"
];
var pre = [
"width"
];
var progress = [
"max",
"value"
];
var q = [
"cite"
];
var script = [
"async",
"charset",
"crossorigin",
"defer",
"integrity",
"language",
"nomodule",
"nonce",
"referrerpolicy",
"src",
"type"
];
var select = [
"autocomplete",
"autofocus",
"disabled",
"form",
"multiple",
"name",
"required",
"size",
"tabindex"
];
var slot = [
"name"
];
var source$1 = [
"media",
"sizes",
"src",
"srcset",
"type"
];
var style = [
"media",
"nonce",
"title",
"type"
];
var table = [
"align",
"bgcolor",
"border",
"cellpadding",
"cellspacing",
"frame",
"rules",
"summary",
"width"
];
var tbody = [
"align",
"char",
"charoff",
"valign"
];
var td = [
"abbr",
"align",
"axis",
"bgcolor",
"char",
"charoff",
"colspan",
"headers",
"height",
"nowrap",
"rowspan",
"scope",
"valign",
"width"
];
var textarea = [
"accesskey",
"autocomplete",
"autofocus",
"cols",
"dirname",
"disabled",
"form",
"maxlength",
"minlength",
"name",
"placeholder",
"readonly",
"required",
"rows",
"tabindex",
"wrap"
];
var tfoot = [
"align",
"char",
"charoff",
"valign"
];
var th = [
"abbr",
"align",
"axis",
"bgcolor",
"char",
"charoff",
"colspan",
"headers",
"height",
"nowrap",
"rowspan",
"scope",
"valign",
"width"
];
var thead = [
"align",
"char",
"charoff",
"valign"
];
var time = [
"datetime"
];
var tr = [
"align",
"bgcolor",
"char",
"charoff",
"valign"
];
var track = [
"default",
"kind",
"label",
"src",
"srclang"
];
var ul = [
"compact",
"type"
];
var video = [
"autoplay",
"controls",
"crossorigin",
"height",
"loop",
"muted",
"playsinline",
"poster",
"preload",
"src",
"width"
];
var index$1 = {
"*": [
"accesskey",
"autocapitalize",
"autofocus",
"class",
"contenteditable",
"dir",
"draggable",
"enterkeyhint",
"hidden",
"id",
"inputmode",
"is",
"itemid",
"itemprop",
"itemref",
"itemscope",
"itemtype",
"lang",
"nonce",
"slot",
"spellcheck",
"style",
"tabindex",
"title",
"translate"
],
a: a,
abbr: abbr,
applet: applet,
area: area,
audio: audio,
base: base,
basefont: basefont,
bdo: bdo,
blockquote: blockquote,
body: body,
br: br,
button: button,
canvas: canvas,
caption: caption,
col: col,
colgroup: colgroup,
data: data,
del: del,
details: details,
dfn: dfn,
dialog: dialog,
dir: dir,
div: div,
dl: dl,
embed: embed$1,
fieldset: fieldset,
font: font,
form: form,
frame: frame,
frameset: frameset,
h1: h1,
h2: h2,
h3: h3,
h4: h4,
h5: h5,
h6: h6,
head: head,
hr: hr,
html: html,
iframe: iframe,
img: img,
input: input,
ins: ins,
isindex: isindex,
label: label,
legend: legend,
li: li,
link: link$3,
map: map,
menu: menu,
meta: meta,
meter: meter,
object: object,
ol: ol,
optgroup: optgroup,
option: option,
output: output,
p: p,
param: param,
pre: pre,
progress: progress,
q: q,
script: script,
select: select,
slot: slot,
source: source$1,
style: style,
table: table,
tbody: tbody,
td: td,
textarea: textarea,
tfoot: tfoot,
th: th,
thead: thead,
time: time,
tr: tr,
track: track,
ul: ul,
video: video
};
var htmlElementAttributes = /*#__PURE__*/Object.freeze({
__proto__: null,
a: a,
abbr: abbr,
applet: applet,
area: area,
audio: audio,
base: base,
basefont: basefont,
bdo: bdo,
blockquote: blockquote,
body: body,
br: br,
button: button,
canvas: canvas,
caption: caption,
col: col,
colgroup: colgroup,
data: data,
del: del,
details: details,
dfn: dfn,
dialog: dialog,
dir: dir,
div: div,
dl: dl,
embed: embed$1,
fieldset: fieldset,
font: font,
form: form,
frame: frame,
frameset: frameset,
h1: h1,
h2: h2,
h3: h3,
h4: h4,
h5: h5,
h6: h6,
head: head,
hr: hr,
html: html,
iframe: iframe,
img: img,
input: input,
ins: ins,
isindex: isindex,
label: label,
legend: legend,
li: li,
link: link$3,
map: map,
menu: menu,
meta: meta,
meter: meter,
object: object,
ol: ol,
optgroup: optgroup,
option: option,
output: output,
p: p,
param: param,
pre: pre,
progress: progress,
q: q,
script: script,
select: select,
slot: slot,
source: source$1,
style: style,
table: table,
tbody: tbody,
td: td,
textarea: textarea,
tfoot: tfoot,
th: th,
thead: thead,
time: time,
tr: tr,
track: track,
ul: ul,
video: video,
'default': index$1
});
var htmlTagNames$1 = getCjsExportFromNamespace(htmlTagNames);
var htmlElementAttributes$1 = getCjsExportFromNamespace(htmlElementAttributes);
const {
CSS_DISPLAY_TAGS,
CSS_DISPLAY_DEFAULT,
CSS_WHITE_SPACE_TAGS,
CSS_WHITE_SPACE_DEFAULT
} = json;
const HTML_TAGS = arrayToMap(htmlTagNames$1);
const HTML_ELEMENT_ATTRIBUTES = mapObject(htmlElementAttributes$1, arrayToMap);
function arrayToMap(array) {
const map = Object.create(null);
for (const value of array) {
map[value] = true;
}
return map;
}
function mapObject(object, fn) {
const newObject = Object.create(null);
for (const key of Object.keys(object)) {
newObject[key] = fn(object[key], key);
}
return newObject;
}
function shouldPreserveContent(node, options) {
if (!node.endSourceSpan) {
return false;
}
if (node.type === "element" && node.fullName === "template" && node.attrMap.lang && node.attrMap.lang !== "html") {
return true;
} // unterminated node in ie conditional comment
// e.g.
if (node.type === "ieConditionalComment" && node.lastChild && !node.lastChild.isSelfClosing && !node.lastChild.endSourceSpan) {
return true;
} // incomplete html in ie conditional comment
// e.g.
if (node.type === "ieConditionalComment" && !node.complete) {
return true;
} // top-level elements (excluding ,
* css``
* css.global``
* css.resolve``
*/
function isStyledJsx(path) {
const node = path.getValue();
const parent = path.getParentNode();
const parentParent = path.getParentNode(1);
return parentParent && node.quasis && parent.type === "JSXExpressionContainer" && parentParent.type === "JSXElement" && parentParent.openingElement.name.name === "style" && parentParent.openingElement.attributes.some(attribute => attribute.name.name === "jsx") || parent && parent.type === "TaggedTemplateExpression" && parent.tag.type === "Identifier" && parent.tag.name === "css" || parent && parent.type === "TaggedTemplateExpression" && parent.tag.type === "MemberExpression" && parent.tag.object.name === "css" && (parent.tag.property.name === "global" || parent.tag.property.name === "resolve");
}
/**
* Angular Components can have:
* - Inline HTML template
* - Inline CSS styles
*
* ...which are both within template literals somewhere
* inside of the Component decorator factory.
*
* E.g.
* @Component({
* template: `...
`,
* styles: [`h1 { color: blue; }`]
* })
*/
function isAngularComponentStyles(path) {
return path.match(node => node.type === "TemplateLiteral", (node, name) => node.type === "ArrayExpression" && name === "elements", (node, name) => (node.type === "Property" || node.type === "ObjectProperty") && node.key.type === "Identifier" && node.key.name === "styles" && name === "value", ...angularComponentObjectExpressionPredicates);
}
function isAngularComponentTemplate(path) {
return path.match(node => node.type === "TemplateLiteral", (node, name) => (node.type === "Property" || node.type === "ObjectProperty") && node.key.type === "Identifier" && node.key.name === "template" && name === "value", ...angularComponentObjectExpressionPredicates);
}
const angularComponentObjectExpressionPredicates = [(node, name) => node.type === "ObjectExpression" && name === "properties", (node, name) => node.type === "CallExpression" && node.callee.type === "Identifier" && node.callee.name === "Component" && name === "arguments", (node, name) => node.type === "Decorator" && name === "expression"];
/**
* styled-components template literals
*/
function isStyledComponents(path) {
const parent = path.getParentNode();
if (!parent || parent.type !== "TaggedTemplateExpression") {
return false;
}
const {
tag
} = parent;
switch (tag.type) {
case "MemberExpression":
return (// styled.foo``
isStyledIdentifier(tag.object) || // Component.extend``
isStyledExtend(tag)
);
case "CallExpression":
return (// styled(Component)``
isStyledIdentifier(tag.callee) || tag.callee.type === "MemberExpression" && (tag.callee.object.type === "MemberExpression" && ( // styled.foo.attrs({})``
isStyledIdentifier(tag.callee.object.object) || // Component.extend.attrs({})``
isStyledExtend(tag.callee.object)) || // styled(Component).attrs({})``
tag.callee.object.type === "CallExpression" && isStyledIdentifier(tag.callee.object.callee))
);
case "Identifier":
// css``
return tag.name === "css";
default:
return false;
}
}
/**
* JSX element with CSS prop
*/
function isCssProp(path) {
const parent = path.getParentNode();
const parentParent = path.getParentNode(1);
return parentParent && parent.type === "JSXExpressionContainer" && parentParent.type === "JSXAttribute" && parentParent.name.type === "JSXIdentifier" && parentParent.name.name === "css";
}
function isStyledIdentifier(node) {
return node.type === "Identifier" && node.name === "styled";
}
function isStyledExtend(node) {
return /^[A-Z]/.test(node.object.name) && node.property.name === "extend";
}
/*
* react-relay and graphql-tag
* graphql`...`
* graphql.experimental`...`
* gql`...`
* GraphQL comment block
*
* This intentionally excludes Relay Classic tags, as Prettier does not
* support Relay Classic formatting.
*/
function isGraphQL(path) {
const node = path.getValue();
const parent = path.getParentNode();
return hasLanguageComment(node, "GraphQL") || parent && (parent.type === "TaggedTemplateExpression" && (parent.tag.type === "MemberExpression" && parent.tag.object.name === "graphql" && parent.tag.property.name === "experimental" || parent.tag.type === "Identifier" && (parent.tag.name === "gql" || parent.tag.name === "graphql")) || parent.type === "CallExpression" && parent.callee.type === "Identifier" && parent.callee.name === "graphql");
}
function hasLanguageComment(node, languageName) {
// This checks for a leading comment that is exactly `/* GraphQL */`
// In order to be in line with other implementations of this comment tag
// we will not trim the comment value and we will expect exactly one space on
// either side of the GraphQL string
// Also see ./clean.js
return hasLeadingComment$1(node, comment => isBlockComment$1(comment) && comment.value === " ".concat(languageName, " "));
}
/**
* - html`...`
* - HTML comment block
*/
function isHtml(path) {
return hasLanguageComment(path.getValue(), "HTML") || path.match(node => node.type === "TemplateLiteral", (node, name) => node.type === "TaggedTemplateExpression" && node.tag.type === "Identifier" && node.tag.name === "html" && name === "quasi");
} // The counter is needed to distinguish nested embeds.
let htmlTemplateLiteralCounter = 0;
function printHtmlTemplateLiteral(path, print, textToDoc, parser, options) {
const node = path.getValue();
const counter = htmlTemplateLiteralCounter;
htmlTemplateLiteralCounter = htmlTemplateLiteralCounter + 1 >>> 0;
const composePlaceholder = index => "PRETTIER_HTML_PLACEHOLDER_".concat(index, "_").concat(counter, "_IN_JS");
const text = node.quasis.map((quasi, index, quasis) => index === quasis.length - 1 ? quasi.value.cooked : quasi.value.cooked + composePlaceholder(index)).join("");
const expressionDocs = path.map(print, "expressions");
if (expressionDocs.length === 0 && text.trim().length === 0) {
return "``";
}
const placeholderRegex = new RegExp(composePlaceholder("(\\d+)"), "g");
let topLevelCount = 0;
const contentDoc = mapDoc$3(stripTrailingHardline$2(textToDoc(text, {
parser,
__onHtmlRoot(root) {
topLevelCount = root.children.length;
}
})), doc => {
if (typeof doc !== "string") {
return doc;
}
const parts = [];
const components = doc.split(placeholderRegex);
for (let i = 0; i < components.length; i++) {
let component = components[i];
if (i % 2 === 0) {
if (component) {
component = uncook(component);
if (options.embeddedInHtml) {
component = component.replace(/<\/(script)\b/gi, "<\\/$1");
}
parts.push(component);
}
continue;
}
const placeholderIndex = +component;
parts.push(concat$b(["${", group$a(expressionDocs[placeholderIndex]), "}"]));
}
return concat$b(parts);
});
const leadingWhitespace = /^\s/.test(text) ? " " : "";
const trailingWhitespace = /\s$/.test(text) ? " " : "";
const linebreak = options.htmlWhitespaceSensitivity === "ignore" ? hardline$8 : leadingWhitespace && trailingWhitespace ? line$7 : null;
if (linebreak) {
return group$a(concat$b(["`", indent$6(concat$b([linebreak, group$a(contentDoc)])), linebreak, "`"]));
}
return group$a(concat$b(["`", leadingWhitespace, topLevelCount > 1 ? indent$6(group$a(contentDoc)) : group$a(contentDoc), trailingWhitespace, "`"]));
}
var embed_1$1 = embed$3;
function clean$4(ast, newObj, parent) {
["range", "raw", "comments", "leadingComments", "trailingComments", "innerComments", "extra", "start", "end", "flags", "errors"].forEach(name => {
delete newObj[name];
});
if (ast.loc && ast.loc.source === null) {
delete newObj.loc.source;
}
if (ast.type === "BigIntLiteral") {
newObj.value = newObj.value.toLowerCase();
} // We remove extra `;` and add them when needed
if (ast.type === "EmptyStatement") {
return null;
} // We move text around, including whitespaces and add {" "}
if (ast.type === "JSXText") {
return null;
}
if (ast.type === "JSXExpressionContainer" && ast.expression.type === "Literal" && ast.expression.value === " ") {
return null;
} // (TypeScript) Ignore `static` in `constructor(static p) {}`
// and `export` in `constructor(export p) {}`
if (ast.type === "TSParameterProperty" && ast.accessibility === null && !ast.readonly) {
return {
type: "Identifier",
name: ast.parameter.name,
typeAnnotation: newObj.parameter.typeAnnotation,
decorators: newObj.decorators
};
} // (TypeScript) ignore empty `specifiers` array
if (ast.type === "TSNamespaceExportDeclaration" && ast.specifiers && ast.specifiers.length === 0) {
delete newObj.specifiers;
} // We convert to
if (ast.type === "JSXOpeningElement") {
delete newObj.selfClosing;
}
if (ast.type === "JSXElement") {
delete newObj.closingElement;
} // We change {'key': value} into {key: value}
if ((ast.type === "Property" || ast.type === "ObjectProperty" || ast.type === "MethodDefinition" || ast.type === "ClassProperty" || ast.type === "TSPropertySignature" || ast.type === "ObjectTypeProperty") && typeof ast.key === "object" && ast.key && (ast.key.type === "Literal" || ast.key.type === "StringLiteral" || ast.key.type === "Identifier")) {
delete newObj.key;
}
if (ast.type === "OptionalMemberExpression" && ast.optional === false) {
newObj.type = "MemberExpression";
delete newObj.optional;
} // Remove raw and cooked values from TemplateElement when it's CSS
// styled-jsx
if (ast.type === "JSXElement" && ast.openingElement.name.name === "style" && ast.openingElement.attributes.some(attr => attr.name.name === "jsx")) {
const templateLiterals = newObj.children.filter(child => child.type === "JSXExpressionContainer" && child.expression.type === "TemplateLiteral").map(container => container.expression);
const quasis = templateLiterals.reduce((quasis, templateLiteral) => quasis.concat(templateLiteral.quasis), []);
quasis.forEach(q => delete q.value);
} // CSS template literals in css prop
if (ast.type === "JSXAttribute" && ast.name.name === "css" && ast.value.type === "JSXExpressionContainer" && ast.value.expression.type === "TemplateLiteral") {
newObj.value.expression.quasis.forEach(q => delete q.value);
} // Angular Components: Inline HTML template and Inline CSS styles
const expression = ast.expression || ast.callee;
if (ast.type === "Decorator" && expression.type === "CallExpression" && expression.callee.name === "Component" && expression.arguments.length === 1) {
const astProps = ast.expression.arguments[0].properties;
newObj.expression.arguments[0].properties.forEach((prop, index) => {
let templateLiteral = null;
switch (astProps[index].key.name) {
case "styles":
if (prop.value.type === "ArrayExpression") {
templateLiteral = prop.value.elements[0];
}
break;
case "template":
if (prop.value.type === "TemplateLiteral") {
templateLiteral = prop.value;
}
break;
}
if (templateLiteral) {
templateLiteral.quasis.forEach(q => delete q.value);
}
});
} // styled-components, graphql, markdown
if (ast.type === "TaggedTemplateExpression" && (ast.tag.type === "MemberExpression" || ast.tag.type === "Identifier" && (ast.tag.name === "gql" || ast.tag.name === "graphql" || ast.tag.name === "css" || ast.tag.name === "md" || ast.tag.name === "markdown" || ast.tag.name === "html") || ast.tag.type === "CallExpression")) {
newObj.quasi.quasis.forEach(quasi => delete quasi.value);
}
if (ast.type === "TemplateLiteral") {
// This checks for a leading comment that is exactly `/* GraphQL */`
// In order to be in line with other implementations of this comment tag
// we will not trim the comment value and we will expect exactly one space on
// either side of the GraphQL string
// Also see ./embed.js
const hasLanguageComment = ast.leadingComments && ast.leadingComments.some(comment => comment.type === "CommentBlock" && ["GraphQL", "HTML"].some(languageName => comment.value === " ".concat(languageName, " ")));
if (hasLanguageComment || parent.type === "CallExpression" && parent.callee.name === "graphql") {
newObj.quasis.forEach(quasi => delete quasi.value);
}
}
}
var clean_1$1 = clean$4;
const {
getLast: getLast$2,
hasNewline: hasNewline$4,
hasNewlineInRange: hasNewlineInRange$2,
hasIgnoreComment: hasIgnoreComment$3,
hasNodeIgnoreComment: hasNodeIgnoreComment$1,
skipWhitespace: skipWhitespace$2
} = util$1;
const isIdentifierName = utils$1.keyword.isIdentifierNameES5; // We match any whitespace except line terminators because
// Flow annotation comments cannot be split across lines. For example:
//
// (this /*
// : any */).foo = 5;
//
// is not picked up by Flow (see https://github.com/facebook/flow/issues/7050), so
// removing the newline would create a type annotation that the user did not intend
// to create.
const NON_LINE_TERMINATING_WHITE_SPACE = "(?:(?=.)\\s)";
const FLOW_SHORTHAND_ANNOTATION = new RegExp("^".concat(NON_LINE_TERMINATING_WHITE_SPACE, "*:"));
const FLOW_ANNOTATION = new RegExp("^".concat(NON_LINE_TERMINATING_WHITE_SPACE, "*::"));
function hasFlowShorthandAnnotationComment(node) {
// https://flow.org/en/docs/types/comments/
// Syntax example: const r = new (window.Request /*: Class */)("");
return node.extra && node.extra.parenthesized && node.trailingComments && node.trailingComments[0].value.match(FLOW_SHORTHAND_ANNOTATION);
}
function hasFlowAnnotationComment(comments) {
return comments && comments[0].value.match(FLOW_ANNOTATION);
}
function hasNode(node, fn) {
if (!node || typeof node !== "object") {
return false;
}
if (Array.isArray(node)) {
return node.some(value => hasNode(value, fn));
}
const result = fn(node);
return typeof result === "boolean" ? result : Object.keys(node).some(key => hasNode(node[key], fn));
}
function hasNakedLeftSide(node) {
return node.type === "AssignmentExpression" || node.type === "BinaryExpression" || node.type === "LogicalExpression" || node.type === "NGPipeExpression" || node.type === "ConditionalExpression" || node.type === "CallExpression" || node.type === "OptionalCallExpression" || node.type === "MemberExpression" || node.type === "OptionalMemberExpression" || node.type === "SequenceExpression" || node.type === "TaggedTemplateExpression" || node.type === "BindExpression" || node.type === "UpdateExpression" && !node.prefix || node.type === "TSAsExpression" || node.type === "TSNonNullExpression";
}
function getLeftSide(node) {
if (node.expressions) {
return node.expressions[0];
}
return node.left || node.test || node.callee || node.object || node.tag || node.argument || node.expression;
}
function getLeftSidePathName(path, node) {
if (node.expressions) {
return ["expressions", 0];
}
if (node.left) {
return ["left"];
}
if (node.test) {
return ["test"];
}
if (node.object) {
return ["object"];
}
if (node.callee) {
return ["callee"];
}
if (node.tag) {
return ["tag"];
}
if (node.argument) {
return ["argument"];
}
if (node.expression) {
return ["expression"];
}
throw new Error("Unexpected node has no left side", node);
}
const exportDeclarationTypes = new Set(["ExportDefaultDeclaration", "ExportDefaultSpecifier", "DeclareExportDeclaration", "ExportNamedDeclaration", "ExportAllDeclaration"]);
function isExportDeclaration(node) {
return node && exportDeclarationTypes.has(node.type);
}
function getParentExportDeclaration(path) {
const parentNode = path.getParentNode();
if (path.getName() === "declaration" && isExportDeclaration(parentNode)) {
return parentNode;
}
return null;
}
function isLiteral(node) {
return node.type === "BooleanLiteral" || node.type === "DirectiveLiteral" || node.type === "Literal" || node.type === "NullLiteral" || node.type === "NumericLiteral" || node.type === "RegExpLiteral" || node.type === "StringLiteral" || node.type === "TemplateLiteral" || node.type === "TSTypeLiteral" || node.type === "JSXText";
}
function isNumericLiteral(node) {
return node.type === "NumericLiteral" || node.type === "Literal" && typeof node.value === "number";
}
function isStringLiteral(node) {
return node.type === "StringLiteral" || node.type === "Literal" && typeof node.value === "string";
}
function isObjectType(n) {
return n.type === "ObjectTypeAnnotation" || n.type === "TSTypeLiteral";
}
function isFunctionOrArrowExpression(node) {
return node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression";
}
function isFunctionOrArrowExpressionWithBody(node) {
return node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression" && node.body.type === "BlockStatement";
}
function isTemplateLiteral(node) {
return node.type === "TemplateLiteral";
} // `inject` is used in AngularJS 1.x, `async` in Angular 2+
// example: https://docs.angularjs.org/guide/unit-testing#using-beforeall-
function isAngularTestWrapper(node) {
return (node.type === "CallExpression" || node.type === "OptionalCallExpression") && node.callee.type === "Identifier" && (node.callee.name === "async" || node.callee.name === "inject" || node.callee.name === "fakeAsync");
}
function isJSXNode(node) {
return node.type === "JSXElement" || node.type === "JSXFragment";
}
function isTheOnlyJSXElementInMarkdown(options, path) {
if (options.parentParser !== "markdown" && options.parentParser !== "mdx") {
return false;
}
const node = path.getNode();
if (!node.expression || !isJSXNode(node.expression)) {
return false;
}
const parent = path.getParentNode();
return parent.type === "Program" && parent.body.length === 1;
} // Detect an expression node representing `{" "}`
function isJSXWhitespaceExpression(node) {
return node.type === "JSXExpressionContainer" && isLiteral(node.expression) && node.expression.value === " " && !node.expression.comments;
}
function isMemberExpressionChain(node) {
if (node.type !== "MemberExpression" && node.type !== "OptionalMemberExpression") {
return false;
}
if (node.object.type === "Identifier") {
return true;
}
return isMemberExpressionChain(node.object);
}
function isGetterOrSetter(node) {
return node.kind === "get" || node.kind === "set";
}
function sameLocStart(nodeA, nodeB, options) {
return options.locStart(nodeA) === options.locStart(nodeB);
} // TODO: This is a bad hack and we need a better way to distinguish between
// arrow functions and otherwise
function isFunctionNotation(node, options) {
return isGetterOrSetter(node) || sameLocStart(node, node.value, options);
} // Hack to differentiate between the following two which have the same ast
// type T = { method: () => void };
// type T = { method(): void };
function isObjectTypePropertyAFunction(node, options) {
return (node.type === "ObjectTypeProperty" || node.type === "ObjectTypeInternalSlot") && node.value.type === "FunctionTypeAnnotation" && !node.static && !isFunctionNotation(node, options);
} // Hack to differentiate between the following two which have the same ast
// declare function f(a): void;
// var f: (a) => void;
function isTypeAnnotationAFunction(node, options) {
return (node.type === "TypeAnnotation" || node.type === "TSTypeAnnotation") && node.typeAnnotation.type === "FunctionTypeAnnotation" && !node.static && !sameLocStart(node, node.typeAnnotation, options);
}
const binaryishNodeTypes = new Set(["BinaryExpression", "LogicalExpression", "NGPipeExpression"]);
function isBinaryish(node) {
return binaryishNodeTypes.has(node.type);
}
function isMemberish(node) {
return node.type === "MemberExpression" || node.type === "OptionalMemberExpression" || node.type === "BindExpression" && node.object;
}
function isSimpleFlowType(node) {
const flowTypeAnnotations = ["AnyTypeAnnotation", "NullLiteralTypeAnnotation", "GenericTypeAnnotation", "ThisTypeAnnotation", "NumberTypeAnnotation", "VoidTypeAnnotation", "EmptyTypeAnnotation", "MixedTypeAnnotation", "BooleanTypeAnnotation", "BooleanLiteralTypeAnnotation", "StringTypeAnnotation"];
return node && flowTypeAnnotations.includes(node.type) && !(node.type === "GenericTypeAnnotation" && node.typeParameters);
}
const unitTestRe = /^(skip|[fx]?(it|describe|test))$/;
function isSkipOrOnlyBlock(node) {
return (node.callee.type === "MemberExpression" || node.callee.type === "OptionalMemberExpression") && node.callee.object.type === "Identifier" && node.callee.property.type === "Identifier" && unitTestRe.test(node.callee.object.name) && (node.callee.property.name === "only" || node.callee.property.name === "skip");
}
function isUnitTestSetUp(n) {
const unitTestSetUpRe = /^(before|after)(Each|All)$/;
return n.callee.type === "Identifier" && unitTestSetUpRe.test(n.callee.name) && n.arguments.length === 1;
} // eg; `describe("some string", (done) => {})`
function isTestCall(n, parent) {
if (n.type !== "CallExpression") {
return false;
}
if (n.arguments.length === 1) {
if (isAngularTestWrapper(n) && parent && isTestCall(parent)) {
return isFunctionOrArrowExpression(n.arguments[0]);
}
if (isUnitTestSetUp(n)) {
return isAngularTestWrapper(n.arguments[0]);
}
} else if (n.arguments.length === 2 || n.arguments.length === 3) {
if ((n.callee.type === "Identifier" && unitTestRe.test(n.callee.name) || isSkipOrOnlyBlock(n)) && (isTemplateLiteral(n.arguments[0]) || isStringLiteral(n.arguments[0]))) {
// it("name", () => { ... }, 2500)
if (n.arguments[2] && !isNumericLiteral(n.arguments[2])) {
return false;
}
return (n.arguments.length === 2 ? isFunctionOrArrowExpression(n.arguments[1]) : isFunctionOrArrowExpressionWithBody(n.arguments[1]) && n.arguments[1].params.length <= 1) || isAngularTestWrapper(n.arguments[1]);
}
}
return false;
}
function hasLeadingComment$2(node) {
return node.comments && node.comments.some(comment => comment.leading);
}
function hasTrailingComment(node) {
return node.comments && node.comments.some(comment => comment.trailing);
}
function isCallOrOptionalCallExpression(node) {
return node.type === "CallExpression" || node.type === "OptionalCallExpression";
}
function hasDanglingComments(node) {
return node.comments && node.comments.some(comment => !comment.leading && !comment.trailing);
}
/** identify if an angular expression seems to have side effects */
function hasNgSideEffect(path) {
return hasNode(path.getValue(), node => {
switch (node.type) {
case undefined:
return false;
case "CallExpression":
case "OptionalCallExpression":
case "AssignmentExpression":
return true;
}
});
}
function isNgForOf(node, index, parentNode) {
return node.type === "NGMicrosyntaxKeyedExpression" && node.key.name === "of" && index === 1 && parentNode.body[0].type === "NGMicrosyntaxLet" && parentNode.body[0].value === null;
}
/** @param node {import("estree").TemplateLiteral} */
function isSimpleTemplateLiteral(node) {
if (node.expressions.length === 0) {
return false;
}
return node.expressions.every(expr => {
// Disallow comments since printDocToString can't print them here
if (expr.comments) {
return false;
} // Allow `x` and `this`
if (expr.type === "Identifier" || expr.type === "ThisExpression") {
return true;
} // Allow `a.b.c`, `a.b[c]`, and `this.x.y`
if (expr.type === "MemberExpression" || expr.type === "OptionalMemberExpression") {
let head = expr;
while (head.type === "MemberExpression" || head.type === "OptionalMemberExpression") {
if (head.property.type !== "Identifier" && head.property.type !== "Literal" && head.property.type !== "StringLiteral" && head.property.type !== "NumericLiteral") {
return false;
}
head = head.object;
if (head.comments) {
return false;
}
}
if (head.type === "Identifier" || head.type === "ThisExpression") {
return true;
}
return false;
}
return false;
});
}
function getFlowVariance(path) {
if (!path.variance) {
return null;
} // Babel 7.0 currently uses variance node type, and flow should
// follow suit soon:
// https://github.com/babel/babel/issues/4722
const variance = path.variance.kind || path.variance;
switch (variance) {
case "plus":
return "+";
case "minus":
return "-";
default:
/* istanbul ignore next */
return variance;
}
}
function classPropMayCauseASIProblems(path) {
const node = path.getNode();
if (node.type !== "ClassProperty") {
return false;
}
const name = node.key && node.key.name; // this isn't actually possible yet with most parsers available today
// so isn't properly tested yet.
if ((name === "static" || name === "get" || name === "set") && !node.value && !node.typeAnnotation) {
return true;
}
}
function classChildNeedsASIProtection(node) {
if (!node) {
return;
}
if (node.static || node.accessibility // TypeScript
) {
return false;
}
if (!node.computed) {
const name = node.key && node.key.name;
if (name === "in" || name === "instanceof") {
return true;
}
}
switch (node.type) {
case "ClassProperty":
case "TSAbstractClassProperty":
return node.computed;
case "MethodDefinition": // Flow
case "TSAbstractMethodDefinition": // TypeScript
case "ClassMethod":
case "ClassPrivateMethod":
{
// Babel
const isAsync = node.value ? node.value.async : node.async;
const isGenerator = node.value ? node.value.generator : node.generator;
if (isAsync || node.kind === "get" || node.kind === "set") {
return false;
}
if (node.computed || isGenerator) {
return true;
}
return false;
}
case "TSIndexSignature":
return true;
default:
/* istanbul ignore next */
return false;
}
}
function getTypeScriptMappedTypeModifier(tokenNode, keyword) {
if (tokenNode === "+") {
return "+" + keyword;
} else if (tokenNode === "-") {
return "-" + keyword;
}
return keyword;
}
function hasNewlineBetweenOrAfterDecorators(node, options) {
return hasNewlineInRange$2(options.originalText, options.locStart(node.decorators[0]), options.locEnd(getLast$2(node.decorators))) || hasNewline$4(options.originalText, options.locEnd(getLast$2(node.decorators)));
} // Only space, newline, carriage return, and tab are treated as whitespace
// inside JSX.
const jsxWhitespaceChars = " \n\r\t";
const matchJsxWhitespaceRegex = new RegExp("([" + jsxWhitespaceChars + "]+)");
const containsNonJsxWhitespaceRegex = new RegExp("[^" + jsxWhitespaceChars + "]"); // Meaningful if it contains non-whitespace characters,
// or it contains whitespace without a new line.
function isMeaningfulJSXText(node) {
return isLiteral(node) && (containsNonJsxWhitespaceRegex.test(rawText(node)) || !/\n/.test(rawText(node)));
}
function hasJsxIgnoreComment(path) {
const node = path.getValue();
const parent = path.getParentNode();
if (!parent || !node || !isJSXNode(node) || !isJSXNode(parent)) {
return false;
} // Lookup the previous sibling, ignoring any empty JSXText elements
const index = parent.children.indexOf(node);
let prevSibling = null;
for (let i = index; i > 0; i--) {
const candidate = parent.children[i - 1];
if (candidate.type === "JSXText" && !isMeaningfulJSXText(candidate)) {
continue;
}
prevSibling = candidate;
break;
}
return prevSibling && prevSibling.type === "JSXExpressionContainer" && prevSibling.expression.type === "JSXEmptyExpression" && prevSibling.expression.comments && prevSibling.expression.comments.find(comment => comment.value.trim() === "prettier-ignore");
}
function isEmptyJSXElement(node) {
if (node.children.length === 0) {
return true;
}
if (node.children.length > 1) {
return false;
} // if there is one text child and does not contain any meaningful text
// we can treat the element as empty.
const child = node.children[0];
return isLiteral(child) && !isMeaningfulJSXText(child);
}
function hasPrettierIgnore$4(path) {
return hasIgnoreComment$3(path) || hasJsxIgnoreComment(path);
}
function isLastStatement(path) {
const parent = path.getParentNode();
if (!parent) {
return true;
}
const node = path.getValue();
const body = (parent.body || parent.consequent).filter(stmt => stmt.type !== "EmptyStatement");
return body && body[body.length - 1] === node;
}
function isFlowAnnotationComment(text, typeAnnotation, options) {
const start = options.locStart(typeAnnotation);
const end = skipWhitespace$2(text, options.locEnd(typeAnnotation));
return text.slice(start, start + 2) === "/*" && text.slice(end, end + 2) === "*/";
}
function hasLeadingOwnLineComment(text, node, options) {
if (isJSXNode(node)) {
return hasNodeIgnoreComment$1(node);
}
const res = node.comments && node.comments.some(comment => comment.leading && hasNewline$4(text, options.locEnd(comment)));
return res;
} // This recurses the return argument, looking for the first token
// (the leftmost leaf node) and, if it (or its parents) has any
// leadingComments, returns true (so it can be wrapped in parens).
function returnArgumentHasLeadingComment(options, argument) {
if (hasLeadingOwnLineComment(options.originalText, argument, options)) {
return true;
}
if (hasNakedLeftSide(argument)) {
let leftMost = argument;
let newLeftMost;
while (newLeftMost = getLeftSide(leftMost)) {
leftMost = newLeftMost;
if (hasLeadingOwnLineComment(options.originalText, leftMost, options)) {
return true;
}
}
}
return false;
}
function isStringPropSafeToCoerceToIdentifier(node, options) {
return isStringLiteral(node.key) && isIdentifierName(node.key.value) && options.parser !== "json" && // With `--strictPropertyInitialization`, TS treats properties with quoted names differently than unquoted ones.
// See https://github.com/microsoft/TypeScript/pull/20075
!((options.parser === "typescript" || options.parser === "babel-ts") && node.type === "ClassProperty");
}
function isJestEachTemplateLiteral(node, parentNode) {
/**
* describe.each`table`(name, fn)
* describe.only.each`table`(name, fn)
* describe.skip.each`table`(name, fn)
* test.each`table`(name, fn)
* test.only.each`table`(name, fn)
* test.skip.each`table`(name, fn)
*
* Ref: https://github.com/facebook/jest/pull/6102
*/
const jestEachTriggerRegex = /^[xf]?(describe|it|test)$/;
return parentNode.type === "TaggedTemplateExpression" && parentNode.quasi === node && parentNode.tag.type === "MemberExpression" && parentNode.tag.property.type === "Identifier" && parentNode.tag.property.name === "each" && (parentNode.tag.object.type === "Identifier" && jestEachTriggerRegex.test(parentNode.tag.object.name) || parentNode.tag.object.type === "MemberExpression" && parentNode.tag.object.property.type === "Identifier" && (parentNode.tag.object.property.name === "only" || parentNode.tag.object.property.name === "skip") && parentNode.tag.object.object.type === "Identifier" && jestEachTriggerRegex.test(parentNode.tag.object.object.name));
}
function templateLiteralHasNewLines(template) {
return template.quasis.some(quasi => quasi.value.raw.includes("\n"));
}
function isTemplateOnItsOwnLine(n, text, options) {
return (n.type === "TemplateLiteral" && templateLiteralHasNewLines(n) || n.type === "TaggedTemplateExpression" && templateLiteralHasNewLines(n.quasi)) && !hasNewline$4(text, options.locStart(n), {
backwards: true
});
}
function needsHardlineAfterDanglingComment(node) {
if (!node.comments) {
return false;
}
const lastDanglingComment = getLast$2(node.comments.filter(comment => !comment.leading && !comment.trailing));
return lastDanglingComment && !comments$1.isBlockComment(lastDanglingComment);
} // If we have nested conditional expressions, we want to print them in JSX mode
// if there's at least one JSXElement somewhere in the tree.
//
// A conditional expression chain like this should be printed in normal mode,
// because there aren't JSXElements anywhere in it:
//
// isA ? "A" : isB ? "B" : isC ? "C" : "Unknown";
//
// But a conditional expression chain like this should be printed in JSX mode,
// because there is a JSXElement in the last ConditionalExpression:
//
// isA ? "A" : isB ? "B" : isC ? "C" : Unknown;
//
// This type of ConditionalExpression chain is structured like this in the AST:
//
// ConditionalExpression {
// test: ...,
// consequent: ...,
// alternate: ConditionalExpression {
// test: ...,
// consequent: ...,
// alternate: ConditionalExpression {
// test: ...,
// consequent: ...,
// alternate: ...,
// }
// }
// }
//
// We want to traverse over that shape and convert it into a flat structure so
// that we can find if there's a JSXElement somewhere inside.
function getConditionalChainContents(node) {
// Given this code:
//
// // Using a ConditionalExpression as the consequent is uncommon, but should
// // be handled.
// A ? B : C ? D : E ? F ? G : H : I
//
// which has this AST:
//
// ConditionalExpression {
// test: Identifier(A),
// consequent: Identifier(B),
// alternate: ConditionalExpression {
// test: Identifier(C),
// consequent: Identifier(D),
// alternate: ConditionalExpression {
// test: Identifier(E),
// consequent: ConditionalExpression {
// test: Identifier(F),
// consequent: Identifier(G),
// alternate: Identifier(H),
// },
// alternate: Identifier(I),
// }
// }
// }
//
// we should return this Array:
//
// [
// Identifier(A),
// Identifier(B),
// Identifier(C),
// Identifier(D),
// Identifier(E),
// Identifier(F),
// Identifier(G),
// Identifier(H),
// Identifier(I)
// ];
//
// This loses the information about whether each node was the test,
// consequent, or alternate, but we don't care about that here- we are only
// flattening this structure to find if there's any JSXElements inside.
const nonConditionalExpressions = [];
function recurse(node) {
if (node.type === "ConditionalExpression") {
recurse(node.test);
recurse(node.consequent);
recurse(node.alternate);
} else {
nonConditionalExpressions.push(node);
}
}
recurse(node);
return nonConditionalExpressions;
}
function conditionalExpressionChainContainsJSX(node) {
return Boolean(getConditionalChainContents(node).find(isJSXNode));
} // Logic to check for args with multiple anonymous functions. For instance,
// the following call should be split on multiple lines for readability:
// source.pipe(map((x) => x + x), filter((x) => x % 2 === 0))
function isFunctionCompositionArgs(args) {
if (args.length <= 1) {
return false;
}
let count = 0;
for (const arg of args) {
if (isFunctionOrArrowExpression(arg)) {
count += 1;
if (count > 1) {
return true;
}
} else if (isCallOrOptionalCallExpression(arg)) {
for (const childArg of arg.arguments) {
if (isFunctionOrArrowExpression(childArg)) {
return true;
}
}
}
}
return false;
} // Logic to determine if a call is a “long curried function call”.
// See https://github.com/prettier/prettier/issues/1420.
//
// `connect(a, b, c)(d)`
// In the above call expression, the second call is the parent node and the
// first call is the current node.
function isLongCurriedCallExpression(path) {
const node = path.getValue();
const parent = path.getParentNode();
return isCallOrOptionalCallExpression(node) && isCallOrOptionalCallExpression(parent) && parent.callee === node && node.arguments.length > parent.arguments.length && parent.arguments.length > 0;
}
/**
* @param {import('estree').Node} node
* @param {number} depth
* @returns {boolean}
*/
function isSimpleCallArgument(node, depth) {
if (depth >= 2) {
return false;
}
const isChildSimple = child => isSimpleCallArgument(child, depth + 1);
const regexpPattern = node.type === "Literal" && node.regex && node.regex.pattern || node.type === "RegExpLiteral" && node.pattern;
if (regexpPattern && regexpPattern.length > 5) {
return false;
}
if (node.type === "Literal" || node.type === "BooleanLiteral" || node.type === "NullLiteral" || node.type === "NumericLiteral" || node.type === "StringLiteral" || node.type === "Identifier" || node.type === "ThisExpression" || node.type === "Super" || node.type === "BigIntLiteral" || node.type === "PrivateName" || node.type === "ArgumentPlaceholder" || node.type === "RegExpLiteral" || node.type === "Import") {
return true;
}
if (node.type === "TemplateLiteral") {
return node.expressions.every(isChildSimple);
}
if (node.type === "ObjectExpression") {
return node.properties.every(p => !p.computed && (p.shorthand || p.value && isChildSimple(p.value)));
}
if (node.type === "ArrayExpression") {
return node.elements.every(x => x == null || isChildSimple(x));
}
if (node.type === "CallExpression" || node.type === "OptionalCallExpression" || node.type === "NewExpression") {
return isSimpleCallArgument(node.callee, depth) && node.arguments.every(isChildSimple);
}
if (node.type === "MemberExpression" || node.type === "OptionalMemberExpression") {
return isSimpleCallArgument(node.object, depth) && isSimpleCallArgument(node.property, depth);
}
if (node.type === "UnaryExpression" && (node.operator === "!" || node.operator === "-")) {
return isSimpleCallArgument(node.argument, depth);
}
if (node.type === "TSNonNullExpression") {
return isSimpleCallArgument(node.expression, depth);
}
return false;
}
function rawText(node) {
return node.extra ? node.extra.raw : node.raw;
}
function identity$1(x) {
return x;
}
function isTSXFile(options) {
return options.filepath && /\.tsx$/i.test(options.filepath);
}
var utils$5 = {
classChildNeedsASIProtection,
classPropMayCauseASIProblems,
conditionalExpressionChainContainsJSX,
getFlowVariance,
getLeftSidePathName,
getParentExportDeclaration,
getTypeScriptMappedTypeModifier,
hasDanglingComments,
hasFlowAnnotationComment,
hasFlowShorthandAnnotationComment,
hasLeadingComment: hasLeadingComment$2,
hasLeadingOwnLineComment,
hasNakedLeftSide,
hasNewlineBetweenOrAfterDecorators,
hasNgSideEffect,
hasNode,
hasPrettierIgnore: hasPrettierIgnore$4,
hasTrailingComment,
identity: identity$1,
isBinaryish,
isCallOrOptionalCallExpression,
isEmptyJSXElement,
isExportDeclaration,
isFlowAnnotationComment,
isFunctionCompositionArgs,
isFunctionNotation,
isFunctionOrArrowExpression,
isGetterOrSetter,
isJestEachTemplateLiteral,
isJSXNode,
isJSXWhitespaceExpression,
isLastStatement,
isLiteral,
isLongCurriedCallExpression,
isSimpleCallArgument,
isMeaningfulJSXText,
isMemberExpressionChain,
isMemberish,
isNgForOf,
isNumericLiteral,
isObjectType,
isObjectTypePropertyAFunction,
isSimpleFlowType,
isSimpleTemplateLiteral,
isStringLiteral,
isStringPropSafeToCoerceToIdentifier,
isTemplateOnItsOwnLine,
isTestCall,
isTheOnlyJSXElementInMarkdown,
isTSXFile,
isTypeAnnotationAFunction,
matchJsxWhitespaceRegex,
needsHardlineAfterDanglingComment,
rawText,
returnArgumentHasLeadingComment
};
const {
getLeftSidePathName: getLeftSidePathName$1,
hasFlowShorthandAnnotationComment: hasFlowShorthandAnnotationComment$1,
hasNakedLeftSide: hasNakedLeftSide$1,
hasNode: hasNode$1
} = utils$5;
function needsParens(path, options) {
const parent = path.getParentNode();
if (!parent) {
return false;
}
const name = path.getName();
const node = path.getNode(); // If the value of this path is some child of a Node and not a Node
// itself, then it doesn't need parentheses. Only Node objects (in
// fact, only Expression nodes) need parentheses.
if (path.getValue() !== node) {
return false;
} // to avoid unexpected `}}` in HTML interpolations
if (options.__isInHtmlInterpolation && !options.bracketSpacing && endsWithRightBracket(node) && isFollowedByRightBracket(path)) {
return true;
} // Only statements don't need parentheses.
if (isStatement(node)) {
return false;
}
if ( // Preserve parens if we have a Flow annotation comment, unless we're using the Flow
// parser. The Flow parser turns Flow comments into type annotation nodes in its
// AST, which we handle separately.
options.parser !== "flow" && hasFlowShorthandAnnotationComment$1(path.getValue())) {
return true;
} // Identifiers never need parentheses.
if (node.type === "Identifier") {
// ...unless those identifiers are embed placeholders. They might be substituted by complex
// expressions, so the parens around them should not be dropped. Example (JS-in-HTML-in-JS):
// let tpl = html``;
// If the inner JS formatter removes the parens, the expression might change its meaning:
// f((a + b) / 2) vs f(a + b / 2)
if (node.extra && node.extra.parenthesized && /^PRETTIER_HTML_PLACEHOLDER_\d+_\d+_IN_JS$/.test(node.name)) {
return true;
}
return false;
}
if (parent.type === "ParenthesizedExpression") {
return false;
} // Add parens around the extends clause of a class. It is needed for almost
// all expressions.
if ((parent.type === "ClassDeclaration" || parent.type === "ClassExpression") && parent.superClass === node && (node.type === "ArrowFunctionExpression" || node.type === "AssignmentExpression" || node.type === "AwaitExpression" || node.type === "BinaryExpression" || node.type === "ConditionalExpression" || node.type === "LogicalExpression" || node.type === "NewExpression" || node.type === "ObjectExpression" || node.type === "ParenthesizedExpression" || node.type === "SequenceExpression" || node.type === "TaggedTemplateExpression" || node.type === "UnaryExpression" || node.type === "UpdateExpression" || node.type === "YieldExpression")) {
return true;
}
if (parent.type === "ExportDefaultDeclaration") {
return (// `export default function` or `export default class` can't be followed by
// anything after. So an expression like `export default (function(){}).toString()`
// needs to be followed by a parentheses
shouldWrapFunctionForExportDefault(path, options) || // `export default (foo, bar)` also needs parentheses
node.type === "SequenceExpression"
);
}
if (parent.type === "Decorator" && parent.expression === node) {
let hasCallExpression = false;
let hasMemberExpression = false;
let current = node;
while (current) {
switch (current.type) {
case "MemberExpression":
hasMemberExpression = true;
current = current.object;
break;
case "CallExpression":
if (
/** @(x().y) */
hasMemberExpression ||
/** @(x().y()) */
hasCallExpression) {
return true;
}
hasCallExpression = true;
current = current.callee;
break;
case "Identifier":
return false;
default:
return true;
}
}
return true;
}
if (parent.type === "ArrowFunctionExpression" && parent.body === node && node.type !== "SequenceExpression" && // these have parens added anyway
util$1.startsWithNoLookaheadToken(node,
/* forbidFunctionClassAndDoExpr */
false) || parent.type === "ExpressionStatement" && util$1.startsWithNoLookaheadToken(node,
/* forbidFunctionClassAndDoExpr */
true)) {
return true;
}
switch (node.type) {
case "SpreadElement":
case "SpreadProperty":
return parent.type === "MemberExpression" && name === "object" && parent.object === node;
case "UpdateExpression":
if (parent.type === "UnaryExpression") {
return node.prefix && (node.operator === "++" && parent.operator === "+" || node.operator === "--" && parent.operator === "-");
}
// else fallthrough
case "UnaryExpression":
switch (parent.type) {
case "UnaryExpression":
return node.operator === parent.operator && (node.operator === "+" || node.operator === "-");
case "BindExpression":
return true;
case "MemberExpression":
case "OptionalMemberExpression":
return name === "object";
case "TaggedTemplateExpression":
return true;
case "NewExpression":
case "CallExpression":
case "OptionalCallExpression":
return name === "callee";
case "BinaryExpression":
return parent.operator === "**" && name === "left";
case "TSNonNullExpression":
return true;
default:
return false;
}
case "BinaryExpression":
{
if (parent.type === "UpdateExpression") {
return true;
}
const isLeftOfAForStatement = node => {
let i = 0;
while (node) {
const parent = path.getParentNode(i++);
if (!parent) {
return false;
}
if (parent.type === "ForStatement" && parent.init === node) {
return true;
}
node = parent;
}
return false;
};
if (node.operator === "in" && isLeftOfAForStatement(node)) {
return true;
}
}
// fallthrough
case "TSTypeAssertion":
case "TSAsExpression":
case "LogicalExpression":
switch (parent.type) {
case "ConditionalExpression":
return node.type === "TSAsExpression";
case "CallExpression":
case "NewExpression":
case "OptionalCallExpression":
return name === "callee";
case "ClassExpression":
case "ClassDeclaration":
return name === "superClass" && parent.superClass === node;
case "TSTypeAssertion":
case "TaggedTemplateExpression":
case "UnaryExpression":
case "JSXSpreadAttribute":
case "SpreadElement":
case "SpreadProperty":
case "BindExpression":
case "AwaitExpression":
case "TSAsExpression":
case "TSNonNullExpression":
case "UpdateExpression":
return true;
case "MemberExpression":
case "OptionalMemberExpression":
return name === "object";
case "AssignmentExpression":
return parent.left === node && (node.type === "TSTypeAssertion" || node.type === "TSAsExpression");
case "LogicalExpression":
if (node.type === "LogicalExpression") {
return parent.operator !== node.operator;
}
// else fallthrough
case "BinaryExpression":
{
if (!node.operator && node.type !== "TSTypeAssertion") {
return true;
}
const po = parent.operator;
const pp = util$1.getPrecedence(po);
const no = node.operator;
const np = util$1.getPrecedence(no);
if (pp > np) {
return true;
}
if (pp === np && name === "right") {
assert.strictEqual(parent.right, node);
return true;
}
if (pp === np && !util$1.shouldFlatten(po, no)) {
return true;
}
if (pp < np && no === "%") {
return po === "+" || po === "-";
} // Add parenthesis when working with bitwise operators
// It's not strictly needed but helps with code understanding
if (util$1.isBitwiseOperator(po)) {
return true;
}
return false;
}
default:
return false;
}
case "SequenceExpression":
switch (parent.type) {
case "ReturnStatement":
return false;
case "ForStatement":
// Although parentheses wouldn't hurt around sequence
// expressions in the head of for loops, traditional style
// dictates that e.g. i++, j++ should not be wrapped with
// parentheses.
return false;
case "ExpressionStatement":
return name !== "expression";
case "ArrowFunctionExpression":
// We do need parentheses, but SequenceExpressions are handled
// specially when printing bodies of arrow functions.
return name !== "body";
default:
// Otherwise err on the side of overparenthesization, adding
// explicit exceptions above if this proves overzealous.
return true;
}
case "YieldExpression":
if (parent.type === "UnaryExpression" || parent.type === "AwaitExpression" || parent.type === "TSAsExpression" || parent.type === "TSNonNullExpression") {
return true;
}
// else fallthrough
case "AwaitExpression":
switch (parent.type) {
case "TaggedTemplateExpression":
case "UnaryExpression":
case "BinaryExpression":
case "LogicalExpression":
case "SpreadElement":
case "SpreadProperty":
case "TSAsExpression":
case "TSNonNullExpression":
case "BindExpression":
return true;
case "MemberExpression":
case "OptionalMemberExpression":
return name === "object";
case "NewExpression":
case "CallExpression":
case "OptionalCallExpression":
return name === "callee";
case "ConditionalExpression":
return parent.test === node;
default:
return false;
}
case "TSJSDocFunctionType":
case "TSConditionalType":
if (parent.type === "TSConditionalType" && node === parent.extendsType) {
return true;
}
// fallthrough
case "TSFunctionType":
case "TSConstructorType":
if (parent.type === "TSConditionalType" && node === parent.checkType) {
return true;
}
// fallthrough
case "TSUnionType":
case "TSIntersectionType":
if (parent.type === "TSUnionType" || parent.type === "TSIntersectionType") {
return true;
}
// fallthrough
case "TSTypeOperator":
case "TSInferType":
return parent.type === "TSArrayType" || parent.type === "TSOptionalType" || parent.type === "TSRestType" || parent.type === "TSIndexedAccessType" && node === parent.objectType || parent.type === "TSTypeOperator" || parent.type === "TSTypeAnnotation" && /^TSJSDoc/.test(path.getParentNode(1).type);
case "ArrayTypeAnnotation":
return parent.type === "NullableTypeAnnotation";
case "IntersectionTypeAnnotation":
case "UnionTypeAnnotation":
return parent.type === "ArrayTypeAnnotation" || parent.type === "NullableTypeAnnotation" || parent.type === "IntersectionTypeAnnotation" || parent.type === "UnionTypeAnnotation";
case "NullableTypeAnnotation":
return parent.type === "ArrayTypeAnnotation";
case "FunctionTypeAnnotation":
{
const ancestor = parent.type === "NullableTypeAnnotation" ? path.getParentNode(1) : parent;
return ancestor.type === "UnionTypeAnnotation" || ancestor.type === "IntersectionTypeAnnotation" || ancestor.type === "ArrayTypeAnnotation" || // We should check ancestor's parent to know whether the parentheses
// are really needed, but since ??T doesn't make sense this check
// will almost never be true.
ancestor.type === "NullableTypeAnnotation";
}
case "StringLiteral":
case "NumericLiteral":
case "Literal":
if (typeof node.value === "string" && parent.type === "ExpressionStatement" && ( // TypeScript workaround for https://github.com/JamesHenry/typescript-estree/issues/2
// See corresponding workaround in printer.js case: "Literal"
options.parser !== "typescript" && !parent.directive || options.parser === "typescript" && options.originalText.charAt(options.locStart(node) - 1) === "(")) {
// To avoid becoming a directive
const grandParent = path.getParentNode(1);
return grandParent.type === "Program" || grandParent.type === "BlockStatement";
}
return parent.type === "MemberExpression" && typeof node.value === "number" && name === "object" && parent.object === node;
case "AssignmentExpression":
{
const grandParent = path.getParentNode(1);
if (parent.type === "ArrowFunctionExpression" && parent.body === node) {
return true;
} else if (parent.type === "ClassProperty" && parent.key === node && parent.computed) {
return false;
} else if (parent.type === "TSPropertySignature" && parent.name === node) {
return false;
} else if (parent.type === "ForStatement" && (parent.init === node || parent.update === node)) {
return false;
} else if (parent.type === "ExpressionStatement") {
return node.left.type === "ObjectPattern";
} else if (parent.type === "TSPropertySignature" && parent.key === node) {
return false;
} else if (parent.type === "AssignmentExpression") {
return false;
} else if (parent.type === "SequenceExpression" && grandParent && grandParent.type === "ForStatement" && (grandParent.init === parent || grandParent.update === parent)) {
return false;
} else if (parent.type === "Property" && parent.value === node) {
return false;
} else if (parent.type === "NGChainedExpression") {
return false;
}
return true;
}
case "ConditionalExpression":
switch (parent.type) {
case "TaggedTemplateExpression":
case "UnaryExpression":
case "SpreadElement":
case "SpreadProperty":
case "BinaryExpression":
case "LogicalExpression":
case "NGPipeExpression":
case "ExportDefaultDeclaration":
case "AwaitExpression":
case "JSXSpreadAttribute":
case "TSTypeAssertion":
case "TypeCastExpression":
case "TSAsExpression":
case "TSNonNullExpression":
return true;
case "NewExpression":
case "CallExpression":
case "OptionalCallExpression":
return name === "callee";
case "ConditionalExpression":
return name === "test" && parent.test === node;
case "MemberExpression":
case "OptionalMemberExpression":
return name === "object";
default:
return false;
}
case "FunctionExpression":
switch (parent.type) {
case "NewExpression":
case "CallExpression":
case "OptionalCallExpression":
// Not always necessary, but it's clearer to the reader if IIFEs are wrapped in parentheses.
// Is necessary if it is `expression` of `ExpressionStatement`.
return name === "callee";
case "TaggedTemplateExpression":
return true;
// This is basically a kind of IIFE.
default:
return false;
}
case "ArrowFunctionExpression":
switch (parent.type) {
case "NewExpression":
case "CallExpression":
case "OptionalCallExpression":
return name === "callee";
case "MemberExpression":
case "OptionalMemberExpression":
return name === "object";
case "TSAsExpression":
case "BindExpression":
case "TaggedTemplateExpression":
case "UnaryExpression":
case "LogicalExpression":
case "BinaryExpression":
case "AwaitExpression":
case "TSTypeAssertion":
return true;
case "ConditionalExpression":
return name === "test";
default:
return false;
}
case "ClassExpression":
switch (parent.type) {
case "NewExpression":
return name === "callee" && parent.callee === node;
default:
return false;
}
case "OptionalMemberExpression":
case "OptionalCallExpression":
if (parent.type === "MemberExpression" && name === "object" || (parent.type === "CallExpression" || parent.type === "NewExpression") && name === "callee") {
return true;
}
// fallthrough
case "CallExpression":
case "MemberExpression":
case "TaggedTemplateExpression":
case "TSNonNullExpression":
if ((parent.type === "BindExpression" || parent.type === "NewExpression") && name === "callee") {
let object = node;
while (object) {
switch (object.type) {
case "CallExpression":
case "OptionalCallExpression":
return true;
case "MemberExpression":
case "OptionalMemberExpression":
case "BindExpression":
object = object.object;
break;
// tagged templates are basically member expressions from a grammar perspective
// see https://tc39.github.io/ecma262/#prod-MemberExpression
case "TaggedTemplateExpression":
object = object.tag;
break;
case "TSNonNullExpression":
object = object.expression;
break;
default:
return false;
}
}
}
return false;
case "BindExpression":
return (parent.type === "BindExpression" || parent.type === "NewExpression") && name === "callee" || (parent.type === "MemberExpression" || parent.type === "OptionalMemberExpression") && name === "object";
case "NGPipeExpression":
if (parent.type === "NGRoot" || parent.type === "NGMicrosyntaxExpression" || parent.type === "ObjectProperty" || parent.type === "ArrayExpression" || (parent.type === "CallExpression" || parent.type === "OptionalCallExpression") && parent.arguments[name] === node || parent.type === "NGPipeExpression" && name === "right" || parent.type === "MemberExpression" && name === "property" || parent.type === "AssignmentExpression") {
return false;
}
return true;
case "JSXFragment":
case "JSXElement":
return name === "callee" || parent.type !== "ArrayExpression" && parent.type !== "ArrowFunctionExpression" && parent.type !== "AssignmentExpression" && parent.type !== "AssignmentPattern" && parent.type !== "BinaryExpression" && parent.type !== "CallExpression" && parent.type !== "NewExpression" && parent.type !== "ConditionalExpression" && parent.type !== "ExpressionStatement" && parent.type !== "JsExpressionRoot" && parent.type !== "JSXAttribute" && parent.type !== "JSXElement" && parent.type !== "JSXExpressionContainer" && parent.type !== "JSXFragment" && parent.type !== "LogicalExpression" && parent.type !== "ObjectProperty" && parent.type !== "OptionalCallExpression" && parent.type !== "Property" && parent.type !== "ReturnStatement" && parent.type !== "ThrowStatement" && parent.type !== "TypeCastExpression" && parent.type !== "VariableDeclarator" && parent.type !== "YieldExpression";
case "TypeAnnotation":
return name === "returnType" && parent.type === "ArrowFunctionExpression" && includesFunctionTypeInObjectType(node);
}
return false;
}
function isStatement(node) {
return node.type === "BlockStatement" || node.type === "BreakStatement" || node.type === "ClassBody" || node.type === "ClassDeclaration" || node.type === "ClassMethod" || node.type === "ClassProperty" || node.type === "ClassPrivateProperty" || node.type === "ContinueStatement" || node.type === "DebuggerStatement" || node.type === "DeclareClass" || node.type === "DeclareExportAllDeclaration" || node.type === "DeclareExportDeclaration" || node.type === "DeclareFunction" || node.type === "DeclareInterface" || node.type === "DeclareModule" || node.type === "DeclareModuleExports" || node.type === "DeclareVariable" || node.type === "DoWhileStatement" || node.type === "EnumDeclaration" || node.type === "ExportAllDeclaration" || node.type === "ExportDefaultDeclaration" || node.type === "ExportNamedDeclaration" || node.type === "ExpressionStatement" || node.type === "ForInStatement" || node.type === "ForOfStatement" || node.type === "ForStatement" || node.type === "FunctionDeclaration" || node.type === "IfStatement" || node.type === "ImportDeclaration" || node.type === "InterfaceDeclaration" || node.type === "LabeledStatement" || node.type === "MethodDefinition" || node.type === "ReturnStatement" || node.type === "SwitchStatement" || node.type === "ThrowStatement" || node.type === "TryStatement" || node.type === "TSDeclareFunction" || node.type === "TSEnumDeclaration" || node.type === "TSImportEqualsDeclaration" || node.type === "TSInterfaceDeclaration" || node.type === "TSModuleDeclaration" || node.type === "TSNamespaceExportDeclaration" || node.type === "TypeAlias" || node.type === "VariableDeclaration" || node.type === "WhileStatement" || node.type === "WithStatement";
}
function includesFunctionTypeInObjectType(node) {
return hasNode$1(node, n1 => n1.type === "ObjectTypeAnnotation" && hasNode$1(n1, n2 => n2.type === "FunctionTypeAnnotation" || undefined) || undefined);
}
function endsWithRightBracket(node) {
switch (node.type) {
case "ObjectExpression":
return true;
default:
return false;
}
}
function isFollowedByRightBracket(path) {
const node = path.getValue();
const parent = path.getParentNode();
const name = path.getName();
switch (parent.type) {
case "NGPipeExpression":
if (typeof name === "number" && parent.arguments[name] === node && parent.arguments.length - 1 === name) {
return path.callParent(isFollowedByRightBracket);
}
break;
case "ObjectProperty":
if (name === "value") {
const parentParent = path.getParentNode(1);
return parentParent.properties[parentParent.properties.length - 1] === parent;
}
break;
case "BinaryExpression":
case "LogicalExpression":
if (name === "right") {
return path.callParent(isFollowedByRightBracket);
}
break;
case "ConditionalExpression":
if (name === "alternate") {
return path.callParent(isFollowedByRightBracket);
}
break;
case "UnaryExpression":
if (parent.prefix) {
return path.callParent(isFollowedByRightBracket);
}
break;
}
return false;
}
function shouldWrapFunctionForExportDefault(path, options) {
const node = path.getValue();
const parent = path.getParentNode();
if (node.type === "FunctionExpression" || node.type === "ClassExpression") {
return parent.type === "ExportDefaultDeclaration" || // in some cases the function is already wrapped
// (e.g. `export default (function() {})();`)
// in this case we don't need to add extra parens
!needsParens(path, options);
}
if (!hasNakedLeftSide$1(node) || parent.type !== "ExportDefaultDeclaration" && needsParens(path, options)) {
return false;
}
return path.call(childPath => shouldWrapFunctionForExportDefault(childPath, options), ...getLeftSidePathName$1(path, node));
}
var needsParens_1 = needsParens;
const {
builders: {
concat: concat$c,
join: join$8,
line: line$8
}
} = document;
function printHtmlBinding(path, options, print) {
const node = path.getValue();
if (options.__onHtmlBindingRoot && path.getName() === null) {
options.__onHtmlBindingRoot(node, options);
}
if (node.type !== "File") {
return;
}
if (options.__isVueForBindingLeft) {
return path.call(functionDeclarationPath => {
const {
params
} = functionDeclarationPath.getValue();
return concat$c([params.length > 1 ? "(" : "", join$8(concat$c([",", line$8]), functionDeclarationPath.map(print, "params")), params.length > 1 ? ")" : ""]);
}, "program", "body", 0);
}
if (options.__isVueSlotScope) {
return path.call(functionDeclarationPath => join$8(concat$c([",", line$8]), functionDeclarationPath.map(print, "params")), "program", "body", 0);
}
} // based on https://github.com/prettier/prettier/blob/master/src/language-html/syntax-vue.js isVueEventBindingExpression()
function isVueEventBindingExpression$2(node) {
switch (node.type) {
case "MemberExpression":
switch (node.property.type) {
case "Identifier":
case "NumericLiteral":
case "StringLiteral":
return isVueEventBindingExpression$2(node.object);
}
return false;
case "Identifier":
return true;
default:
return false;
}
}
var htmlBinding = {
isVueEventBindingExpression: isVueEventBindingExpression$2,
printHtmlBinding
};
function preprocess$1(ast, options) {
switch (options.parser) {
case "json":
case "json5":
case "json-stringify":
case "__js_expression":
case "__vue_expression":
return Object.assign({}, ast, {
type: options.parser.startsWith("__") ? "JsExpressionRoot" : "JsonRoot",
node: ast,
comments: [],
rootMarker: options.rootMarker
});
default:
return ast;
}
}
var preprocess_1$1 = preprocess$1;
const {
shouldFlatten: shouldFlatten$1,
getNextNonSpaceNonCommentCharacter: getNextNonSpaceNonCommentCharacter$1,
hasNewline: hasNewline$5,
hasNewlineInRange: hasNewlineInRange$3,
getLast: getLast$3,
getStringWidth: getStringWidth$3,
printString: printString$2,
printNumber: printNumber$2,
hasIgnoreComment: hasIgnoreComment$4,
hasNodeIgnoreComment: hasNodeIgnoreComment$2,
getPenultimate: getPenultimate$1,
startsWithNoLookaheadToken: startsWithNoLookaheadToken$1,
getIndentSize: getIndentSize$2,
getPreferredQuote: getPreferredQuote$1
} = util$1;
const {
isNextLineEmpty: isNextLineEmpty$4,
isNextLineEmptyAfterIndex: isNextLineEmptyAfterIndex$2,
getNextNonSpaceNonCommentCharacterIndex: getNextNonSpaceNonCommentCharacterIndex$3
} = utilShared;
const {
insertPragma: insertPragma$7
} = pragma;
const {
printHtmlBinding: printHtmlBinding$1,
isVueEventBindingExpression: isVueEventBindingExpression$3
} = htmlBinding;
const {
classChildNeedsASIProtection: classChildNeedsASIProtection$1,
classPropMayCauseASIProblems: classPropMayCauseASIProblems$1,
conditionalExpressionChainContainsJSX: conditionalExpressionChainContainsJSX$1,
getFlowVariance: getFlowVariance$1,
getLeftSidePathName: getLeftSidePathName$2,
getParentExportDeclaration: getParentExportDeclaration$1,
getTypeScriptMappedTypeModifier: getTypeScriptMappedTypeModifier$1,
hasDanglingComments: hasDanglingComments$1,
hasFlowAnnotationComment: hasFlowAnnotationComment$1,
hasFlowShorthandAnnotationComment: hasFlowShorthandAnnotationComment$2,
hasLeadingComment: hasLeadingComment$3,
hasLeadingOwnLineComment: hasLeadingOwnLineComment$1,
hasNakedLeftSide: hasNakedLeftSide$2,
hasNewlineBetweenOrAfterDecorators: hasNewlineBetweenOrAfterDecorators$1,
hasNgSideEffect: hasNgSideEffect$1,
hasPrettierIgnore: hasPrettierIgnore$5,
hasTrailingComment: hasTrailingComment$1,
identity: identity$2,
isBinaryish: isBinaryish$1,
isCallOrOptionalCallExpression: isCallOrOptionalCallExpression$1,
isEmptyJSXElement: isEmptyJSXElement$1,
isExportDeclaration: isExportDeclaration$1,
isFlowAnnotationComment: isFlowAnnotationComment$1,
isFunctionCompositionArgs: isFunctionCompositionArgs$1,
isFunctionNotation: isFunctionNotation$1,
isFunctionOrArrowExpression: isFunctionOrArrowExpression$1,
isGetterOrSetter: isGetterOrSetter$1,
isJestEachTemplateLiteral: isJestEachTemplateLiteral$1,
isJSXNode: isJSXNode$1,
isJSXWhitespaceExpression: isJSXWhitespaceExpression$1,
isLastStatement: isLastStatement$1,
isLiteral: isLiteral$1,
isLongCurriedCallExpression: isLongCurriedCallExpression$1,
isMeaningfulJSXText: isMeaningfulJSXText$1,
isMemberExpressionChain: isMemberExpressionChain$1,
isMemberish: isMemberish$1,
isNgForOf: isNgForOf$1,
isNumericLiteral: isNumericLiteral$1,
isObjectType: isObjectType$1,
isObjectTypePropertyAFunction: isObjectTypePropertyAFunction$1,
isSimpleCallArgument: isSimpleCallArgument$1,
isSimpleFlowType: isSimpleFlowType$1,
isSimpleTemplateLiteral: isSimpleTemplateLiteral$1,
isStringLiteral: isStringLiteral$1,
isStringPropSafeToCoerceToIdentifier: isStringPropSafeToCoerceToIdentifier$1,
isTemplateOnItsOwnLine: isTemplateOnItsOwnLine$1,
isTestCall: isTestCall$1,
isTheOnlyJSXElementInMarkdown: isTheOnlyJSXElementInMarkdown$1,
isTSXFile: isTSXFile$1,
isTypeAnnotationAFunction: isTypeAnnotationAFunction$1,
matchJsxWhitespaceRegex: matchJsxWhitespaceRegex$1,
needsHardlineAfterDanglingComment: needsHardlineAfterDanglingComment$1,
rawText: rawText$1,
returnArgumentHasLeadingComment: returnArgumentHasLeadingComment$1
} = utils$5;
const needsQuoteProps = new WeakMap();
const {
builders: {
concat: concat$d,
join: join$9,
line: line$9,
hardline: hardline$9,
softline: softline$6,
literalline: literalline$4,
group: group$b,
indent: indent$7,
align: align$1,
conditionalGroup: conditionalGroup$1,
fill: fill$4,
ifBreak: ifBreak$6,
breakParent: breakParent$3,
lineSuffixBoundary: lineSuffixBoundary$1,
addAlignmentToDoc: addAlignmentToDoc$2,
dedent: dedent$2
},
utils: {
willBreak: willBreak$1,
isLineNext: isLineNext$1,
isEmpty: isEmpty$1,
removeLines: removeLines$2
},
printer: {
printDocToString: printDocToString$2
}
} = document;
let uid = 0;
function shouldPrintComma$1(options, level) {
level = level || "es5";
switch (options.trailingComma) {
case "all":
if (level === "all") {
return true;
}
// fallthrough
case "es5":
if (level === "es5") {
return true;
}
// fallthrough
case "none":
default:
return false;
}
}
function genericPrint$3(path, options, printPath, args) {
const node = path.getValue();
let needsParens = false;
const linesWithoutParens = printPathNoParens(path, options, printPath, args);
if (!node || isEmpty$1(linesWithoutParens)) {
return linesWithoutParens;
}
const parentExportDecl = getParentExportDeclaration$1(path);
const decorators = [];
if (node.type === "ClassMethod" || node.type === "ClassPrivateMethod" || node.type === "ClassProperty" || node.type === "TSAbstractClassProperty" || node.type === "ClassPrivateProperty" || node.type === "MethodDefinition" || node.type === "TSAbstractMethodDefinition" || node.type === "TSDeclareMethod") ; else if (node.decorators && node.decorators.length > 0 && // If the parent node is an export declaration and the decorator
// was written before the export, the export will be responsible
// for printing the decorators.
!(parentExportDecl && options.locStart(parentExportDecl, {
ignoreDecorators: true
}) > options.locStart(node.decorators[0]))) {
const shouldBreak = node.type === "ClassExpression" || node.type === "ClassDeclaration" || hasNewlineBetweenOrAfterDecorators$1(node, options);
const separator = shouldBreak ? hardline$9 : line$9;
path.each(decoratorPath => {
let decorator = decoratorPath.getValue();
if (decorator.expression) {
decorator = decorator.expression;
} else {
decorator = decorator.callee;
}
decorators.push(printPath(decoratorPath), separator);
}, "decorators");
if (parentExportDecl) {
decorators.unshift(hardline$9);
}
} else if (isExportDeclaration$1(node) && node.declaration && node.declaration.decorators && node.declaration.decorators.length > 0 && // Only print decorators here if they were written before the export,
// otherwise they are printed by the node.declaration
options.locStart(node, {
ignoreDecorators: true
}) > options.locStart(node.declaration.decorators[0])) {
// Export declarations are responsible for printing any decorators
// that logically apply to node.declaration.
path.each(decoratorPath => {
const decorator = decoratorPath.getValue();
const prefix = decorator.type === "Decorator" ? "" : "@";
decorators.push(prefix, printPath(decoratorPath), hardline$9);
}, "declaration", "decorators");
} else {
// Nodes with decorators can't have parentheses, so we can avoid
// computing pathNeedsParens() except in this case.
needsParens = needsParens_1(path, options);
}
const parts = [];
if (needsParens) {
parts.unshift("(");
}
parts.push(linesWithoutParens);
if (needsParens) {
const node = path.getValue();
if (hasFlowShorthandAnnotationComment$2(node)) {
parts.push(" /*");
parts.push(node.trailingComments[0].value.trimStart());
parts.push("*/");
node.trailingComments[0].printed = true;
}
parts.push(")");
}
if (decorators.length > 0) {
return group$b(concat$d(decorators.concat(parts)));
}
return concat$d(parts);
}
function printDecorators(path, options, print) {
const node = path.getValue();
return group$b(concat$d([join$9(line$9, path.map(print, "decorators")), hasNewlineBetweenOrAfterDecorators$1(node, options) ? hardline$9 : line$9]));
}
/**
* The following is the shared logic for
* ternary operators, namely ConditionalExpression
* and TSConditionalType
* @typedef {Object} OperatorOptions
* @property {() => Array} beforeParts - Parts to print before the `?`.
* @property {(breakClosingParen: boolean) => Array} afterParts - Parts to print after the conditional expression.
* @property {boolean} shouldCheckJsx - Whether to check for and print in JSX mode.
* @property {string} conditionalNodeType - The type of the conditional expression node, ie "ConditionalExpression" or "TSConditionalType".
* @property {string} consequentNodePropertyName - The property at which the consequent node can be found on the main node, eg "consequent".
* @property {string} alternateNodePropertyName - The property at which the alternate node can be found on the main node, eg "alternate".
* @property {string[]} testNodePropertyNames - The properties at which the test nodes can be found on the main node, eg "test".
* @param {FastPath} path - The path to the ConditionalExpression/TSConditionalType node.
* @param {Options} options - Prettier options
* @param {Function} print - Print function to call recursively
* @param {OperatorOptions} operatorOptions
* @returns Doc
*/
function printTernaryOperator(path, options, print, operatorOptions) {
const node = path.getValue();
const consequentNode = node[operatorOptions.consequentNodePropertyName];
const alternateNode = node[operatorOptions.alternateNodePropertyName];
const parts = []; // We print a ConditionalExpression in either "JSX mode" or "normal mode".
// See tests/jsx/conditional-expression.js for more info.
let jsxMode = false;
const parent = path.getParentNode();
const isParentTest = parent.type === operatorOptions.conditionalNodeType && operatorOptions.testNodePropertyNames.some(prop => parent[prop] === node);
let forceNoIndent = parent.type === operatorOptions.conditionalNodeType && !isParentTest; // Find the outermost non-ConditionalExpression parent, and the outermost
// ConditionalExpression parent. We'll use these to determine if we should
// print in JSX mode.
let currentParent;
let previousParent;
let i = 0;
do {
previousParent = currentParent || node;
currentParent = path.getParentNode(i);
i++;
} while (currentParent && currentParent.type === operatorOptions.conditionalNodeType && operatorOptions.testNodePropertyNames.every(prop => currentParent[prop] !== previousParent));
const firstNonConditionalParent = currentParent || parent;
const lastConditionalParent = previousParent;
if (operatorOptions.shouldCheckJsx && (isJSXNode$1(node[operatorOptions.testNodePropertyNames[0]]) || isJSXNode$1(consequentNode) || isJSXNode$1(alternateNode) || conditionalExpressionChainContainsJSX$1(lastConditionalParent))) {
jsxMode = true;
forceNoIndent = true; // Even though they don't need parens, we wrap (almost) everything in
// parens when using ?: within JSX, because the parens are analogous to
// curly braces in an if statement.
const wrap = doc => concat$d([ifBreak$6("(", ""), indent$7(concat$d([softline$6, doc])), softline$6, ifBreak$6(")", "")]); // The only things we don't wrap are:
// * Nested conditional expressions in alternates
// * null
// * undefined
const isNil = node => node.type === "NullLiteral" || node.type === "Literal" && node.value === null || node.type === "Identifier" && node.name === "undefined";
parts.push(" ? ", isNil(consequentNode) ? path.call(print, operatorOptions.consequentNodePropertyName) : wrap(path.call(print, operatorOptions.consequentNodePropertyName)), " : ", alternateNode.type === operatorOptions.conditionalNodeType || isNil(alternateNode) ? path.call(print, operatorOptions.alternateNodePropertyName) : wrap(path.call(print, operatorOptions.alternateNodePropertyName)));
} else {
// normal mode
const part = concat$d([line$9, "? ", consequentNode.type === operatorOptions.conditionalNodeType ? ifBreak$6("", "(") : "", align$1(2, path.call(print, operatorOptions.consequentNodePropertyName)), consequentNode.type === operatorOptions.conditionalNodeType ? ifBreak$6("", ")") : "", line$9, ": ", alternateNode.type === operatorOptions.conditionalNodeType ? path.call(print, operatorOptions.alternateNodePropertyName) : align$1(2, path.call(print, operatorOptions.alternateNodePropertyName))]);
parts.push(parent.type !== operatorOptions.conditionalNodeType || parent[operatorOptions.alternateNodePropertyName] === node || isParentTest ? part : options.useTabs ? dedent$2(indent$7(part)) : align$1(Math.max(0, options.tabWidth - 2), part));
} // We want a whole chain of ConditionalExpressions to all
// break if any of them break. That means we should only group around the
// outer-most ConditionalExpression.
const maybeGroup = doc => parent === firstNonConditionalParent ? group$b(doc) : doc; // Break the closing paren to keep the chain right after it:
// (a
// ? b
// : c
// ).call()
const breakClosingParen = !jsxMode && (parent.type === "MemberExpression" || parent.type === "OptionalMemberExpression" || parent.type === "NGPipeExpression" && parent.left === node) && !parent.computed;
const result = maybeGroup(concat$d([].concat((testDoc =>
/**
* a
* ? b
* : multiline
* test
* node
* ^^ align(2)
* ? d
* : e
*/
parent.type === operatorOptions.conditionalNodeType && parent[operatorOptions.alternateNodePropertyName] === node ? align$1(2, testDoc) : testDoc)(concat$d(operatorOptions.beforeParts())), forceNoIndent ? concat$d(parts) : indent$7(concat$d(parts)), operatorOptions.afterParts(breakClosingParen))));
return isParentTest ? group$b(concat$d([indent$7(concat$d([softline$6, result])), softline$6])) : result;
}
function printPathNoParens(path, options, print, args) {
const n = path.getValue();
const semi = options.semi ? ";" : "";
if (!n) {
return "";
}
if (typeof n === "string") {
return n;
}
const htmlBinding = printHtmlBinding$1(path, options, print);
if (htmlBinding) {
return htmlBinding;
}
let parts = [];
switch (n.type) {
case "JsExpressionRoot":
return path.call(print, "node");
case "JsonRoot":
return concat$d([path.call(print, "node"), hardline$9]);
case "File":
// Print @babel/parser's InterpreterDirective here so that
// leading comments on the `Program` node get printed after the hashbang.
if (n.program && n.program.interpreter) {
parts.push(path.call(programPath => programPath.call(print, "interpreter"), "program"));
}
parts.push(path.call(print, "program"));
return concat$d(parts);
case "Program":
// Babel 6
if (n.directives) {
path.each(childPath => {
parts.push(print(childPath), semi, hardline$9);
if (isNextLineEmpty$4(options.originalText, childPath.getValue(), options.locEnd)) {
parts.push(hardline$9);
}
}, "directives");
}
parts.push(path.call(bodyPath => {
return printStatementSequence(bodyPath, options, print);
}, "body"));
parts.push(comments.printDanglingComments(path, options,
/* sameIndent */
true)); // Only force a trailing newline if there were any contents.
if (!n.body.every(({
type
}) => type === "EmptyStatement") || n.comments) {
parts.push(hardline$9);
}
return concat$d(parts);
// Babel extension.
case "EmptyStatement":
return "";
case "ExpressionStatement":
// Detect Flow-parsed directives
if (n.directive) {
return concat$d([nodeStr(n.expression, options, true), semi]);
}
if (options.parser === "__vue_event_binding") {
const parent = path.getParentNode();
if (parent.type === "Program" && parent.body.length === 1 && parent.body[0] === n) {
return concat$d([path.call(print, "expression"), isVueEventBindingExpression$3(n.expression) ? ";" : ""]);
}
} // Do not append semicolon after the only JSX element in a program
return concat$d([path.call(print, "expression"), isTheOnlyJSXElementInMarkdown$1(options, path) ? "" : semi]);
// Babel non-standard node. Used for Closure-style type casts. See postprocess.js.
case "ParenthesizedExpression":
{
const shouldHug = !n.expression.comments;
if (shouldHug) {
return concat$d(["(", path.call(print, "expression"), ")"]);
}
return group$b(concat$d(["(", indent$7(concat$d([softline$6, path.call(print, "expression")])), softline$6, ")"]));
}
case "AssignmentExpression":
return printAssignment(n.left, path.call(print, "left"), concat$d([" ", n.operator]), n.right, path.call(print, "right"), options);
case "BinaryExpression":
case "LogicalExpression":
case "NGPipeExpression":
{
const parent = path.getParentNode();
const parentParent = path.getParentNode(1);
const isInsideParenthesis = n !== parent.body && (parent.type === "IfStatement" || parent.type === "WhileStatement" || parent.type === "SwitchStatement" || parent.type === "DoWhileStatement");
const parts = printBinaryishExpressions(path, print, options,
/* isNested */
false, isInsideParenthesis); // if (
// this.hasPlugin("dynamicImports") && this.lookahead().type === tt.parenLeft
// ) {
//
// looks super weird, we want to break the children if the parent breaks
//
// if (
// this.hasPlugin("dynamicImports") &&
// this.lookahead().type === tt.parenLeft
// ) {
if (isInsideParenthesis) {
return concat$d(parts);
} // Break between the parens in
// unaries or in a member or specific call expression, i.e.
//
// (
// a &&
// b &&
// c
// ).call()
if ((parent.type === "CallExpression" || parent.type === "OptionalCallExpression") && parent.callee === n || parent.type === "UnaryExpression" || (parent.type === "MemberExpression" || parent.type === "OptionalMemberExpression") && !parent.computed) {
return group$b(concat$d([indent$7(concat$d([softline$6, concat$d(parts)])), softline$6]));
} // Avoid indenting sub-expressions in some cases where the first sub-expression is already
// indented accordingly. We should indent sub-expressions where the first case isn't indented.
const shouldNotIndent = parent.type === "ReturnStatement" || parent.type === "ThrowStatement" || parent.type === "JSXExpressionContainer" && parentParent.type === "JSXAttribute" || n.operator !== "|" && parent.type === "JsExpressionRoot" || n.type !== "NGPipeExpression" && (parent.type === "NGRoot" && options.parser === "__ng_binding" || parent.type === "NGMicrosyntaxExpression" && parentParent.type === "NGMicrosyntax" && parentParent.body.length === 1) || n === parent.body && parent.type === "ArrowFunctionExpression" || n !== parent.body && parent.type === "ForStatement" || parent.type === "ConditionalExpression" && parentParent.type !== "ReturnStatement" && parentParent.type !== "ThrowStatement" && parentParent.type !== "CallExpression" && parentParent.type !== "OptionalCallExpression" || parent.type === "TemplateLiteral";
const shouldIndentIfInlining = parent.type === "AssignmentExpression" || parent.type === "VariableDeclarator" || parent.type === "ClassProperty" || parent.type === "TSAbstractClassProperty" || parent.type === "ClassPrivateProperty" || parent.type === "ObjectProperty" || parent.type === "Property";
const samePrecedenceSubExpression = isBinaryish$1(n.left) && shouldFlatten$1(n.operator, n.left.operator);
if (shouldNotIndent || shouldInlineLogicalExpression(n) && !samePrecedenceSubExpression || !shouldInlineLogicalExpression(n) && shouldIndentIfInlining) {
return group$b(concat$d(parts));
}
if (parts.length === 0) {
return "";
} // If the right part is a JSX node, we include it in a separate group to
// prevent it breaking the whole chain, so we can print the expression like:
//
// foo && bar && (
//
//
//
// )
const hasJSX = isJSXNode$1(n.right);
const rest = concat$d(hasJSX ? parts.slice(1, -1) : parts.slice(1));
const groupId = Symbol("logicalChain-" + ++uid);
const chain = group$b(concat$d([// Don't include the initial expression in the indentation
// level. The first item is guaranteed to be the first
// left-most expression.
parts.length > 0 ? parts[0] : "", indent$7(rest)]), {
id: groupId
});
if (!hasJSX) {
return chain;
}
const jsxPart = getLast$3(parts);
return group$b(concat$d([chain, ifBreak$6(indent$7(jsxPart), jsxPart, {
groupId
})]));
}
case "AssignmentPattern":
return concat$d([path.call(print, "left"), " = ", path.call(print, "right")]);
case "TSTypeAssertion":
{
const shouldBreakAfterCast = !(n.expression.type === "ArrayExpression" || n.expression.type === "ObjectExpression");
const castGroup = group$b(concat$d(["<", indent$7(concat$d([softline$6, path.call(print, "typeAnnotation")])), softline$6, ">"]));
const exprContents = concat$d([ifBreak$6("("), indent$7(concat$d([softline$6, path.call(print, "expression")])), softline$6, ifBreak$6(")")]);
if (shouldBreakAfterCast) {
return conditionalGroup$1([concat$d([castGroup, path.call(print, "expression")]), concat$d([castGroup, group$b(exprContents, {
shouldBreak: true
})]), concat$d([castGroup, path.call(print, "expression")])]);
}
return group$b(concat$d([castGroup, path.call(print, "expression")]));
}
case "OptionalMemberExpression":
case "MemberExpression":
{
const parent = path.getParentNode();
let firstNonMemberParent;
let i = 0;
do {
firstNonMemberParent = path.getParentNode(i);
i++;
} while (firstNonMemberParent && (firstNonMemberParent.type === "MemberExpression" || firstNonMemberParent.type === "OptionalMemberExpression" || firstNonMemberParent.type === "TSNonNullExpression"));
const shouldInline = firstNonMemberParent && (firstNonMemberParent.type === "NewExpression" || firstNonMemberParent.type === "BindExpression" || firstNonMemberParent.type === "VariableDeclarator" && firstNonMemberParent.id.type !== "Identifier" || firstNonMemberParent.type === "AssignmentExpression" && firstNonMemberParent.left.type !== "Identifier") || n.computed || n.object.type === "Identifier" && n.property.type === "Identifier" && parent.type !== "MemberExpression" && parent.type !== "OptionalMemberExpression";
return concat$d([path.call(print, "object"), shouldInline ? printMemberLookup(path, options, print) : group$b(indent$7(concat$d([softline$6, printMemberLookup(path, options, print)])))]);
}
case "MetaProperty":
return concat$d([path.call(print, "meta"), ".", path.call(print, "property")]);
case "BindExpression":
if (n.object) {
parts.push(path.call(print, "object"));
}
parts.push(group$b(indent$7(concat$d([softline$6, printBindExpressionCallee(path, options, print)]))));
return concat$d(parts);
case "Identifier":
{
return concat$d([n.name, printOptionalToken(path), printTypeAnnotation(path, options, print)]);
}
case "V8IntrinsicIdentifier":
return concat$d(["%", n.name]);
case "SpreadElement":
case "SpreadElementPattern":
case "SpreadProperty":
case "SpreadPropertyPattern":
case "RestElement":
case "ObjectTypeSpreadProperty":
return concat$d(["...", path.call(print, "argument"), printTypeAnnotation(path, options, print)]);
case "FunctionDeclaration":
case "FunctionExpression":
parts.push(printFunctionDeclaration(path, print, options));
if (!n.body) {
parts.push(semi);
}
return concat$d(parts);
case "ArrowFunctionExpression":
{
if (n.async) {
parts.push("async ");
}
if (shouldPrintParamsWithoutParens(path, options)) {
parts.push(path.call(print, "params", 0));
} else {
parts.push(group$b(concat$d([printFunctionParams(path, print, options,
/* expandLast */
args && (args.expandLastArg || args.expandFirstArg),
/* printTypeParams */
true), printReturnType(path, print, options)])));
}
const dangling = comments.printDanglingComments(path, options,
/* sameIndent */
true, comment => {
const nextCharacter = getNextNonSpaceNonCommentCharacterIndex$3(options.originalText, comment, options.locEnd);
return options.originalText.slice(nextCharacter, nextCharacter + 2) === "=>";
});
if (dangling) {
parts.push(" ", dangling);
}
parts.push(" =>");
const body = path.call(bodyPath => print(bodyPath, args), "body"); // We want to always keep these types of nodes on the same line
// as the arrow.
if (!hasLeadingOwnLineComment$1(options.originalText, n.body, options) && (n.body.type === "ArrayExpression" || n.body.type === "ObjectExpression" || n.body.type === "BlockStatement" || isJSXNode$1(n.body) || isTemplateOnItsOwnLine$1(n.body, options.originalText, options) || n.body.type === "ArrowFunctionExpression" || n.body.type === "DoExpression")) {
return group$b(concat$d([concat$d(parts), " ", body]));
} // We handle sequence expressions as the body of arrows specially,
// so that the required parentheses end up on their own lines.
if (n.body.type === "SequenceExpression") {
return group$b(concat$d([concat$d(parts), group$b(concat$d([" (", indent$7(concat$d([softline$6, body])), softline$6, ")"]))]));
} // if the arrow function is expanded as last argument, we are adding a
// level of indentation and need to add a softline to align the closing )
// with the opening (, or if it's inside a JSXExpression (e.g. an attribute)
// we should align the expression's closing } with the line with the opening {.
const shouldAddSoftLine = (args && args.expandLastArg || path.getParentNode().type === "JSXExpressionContainer") && !(n.comments && n.comments.length);
const printTrailingComma = args && args.expandLastArg && shouldPrintComma$1(options, "all"); // In order to avoid confusion between
// a => a ? a : a
// a <= a ? a : a
const shouldAddParens = n.body.type === "ConditionalExpression" && !startsWithNoLookaheadToken$1(n.body,
/* forbidFunctionAndClass */
false);
return group$b(concat$d([concat$d(parts), group$b(concat$d([indent$7(concat$d([line$9, shouldAddParens ? ifBreak$6("", "(") : "", body, shouldAddParens ? ifBreak$6("", ")") : ""])), shouldAddSoftLine ? concat$d([ifBreak$6(printTrailingComma ? "," : ""), softline$6]) : ""]))]));
}
case "YieldExpression":
parts.push("yield");
if (n.delegate) {
parts.push("*");
}
if (n.argument) {
parts.push(" ", path.call(print, "argument"));
}
return concat$d(parts);
case "AwaitExpression":
{
parts.push("await ", path.call(print, "argument"));
const parent = path.getParentNode();
if ((parent.type === "CallExpression" || parent.type === "OptionalCallExpression") && parent.callee === n || (parent.type === "MemberExpression" || parent.type === "OptionalMemberExpression") && parent.object === n) {
return group$b(concat$d([indent$7(concat$d([softline$6, concat$d(parts)])), softline$6]));
}
return concat$d(parts);
}
case "ImportSpecifier":
if (n.importKind) {
parts.push(path.call(print, "importKind"), " ");
}
parts.push(path.call(print, "imported"));
if (n.local && n.local.name !== n.imported.name) {
parts.push(" as ", path.call(print, "local"));
}
return concat$d(parts);
case "ExportSpecifier":
parts.push(path.call(print, "local"));
if (n.exported && n.exported.name !== n.local.name) {
parts.push(" as ", path.call(print, "exported"));
}
return concat$d(parts);
case "ImportNamespaceSpecifier":
parts.push("* as ");
parts.push(path.call(print, "local"));
return concat$d(parts);
case "ImportDefaultSpecifier":
return path.call(print, "local");
case "TSExportAssignment":
return concat$d(["export = ", path.call(print, "expression"), semi]);
case "ExportDefaultDeclaration":
case "ExportNamedDeclaration":
return printExportDeclaration(path, options, print);
case "ExportAllDeclaration":
parts.push("export ");
if (n.exportKind === "type") {
parts.push("type ");
}
parts.push("* ");
if (n.exported) {
parts.push("as ", path.call(print, "exported"), " ");
}
parts.push("from ", path.call(print, "source"), semi);
return concat$d(parts);
case "ExportNamespaceSpecifier":
case "ExportDefaultSpecifier":
return path.call(print, "exported");
case "ImportDeclaration":
{
parts.push("import ");
if (n.importKind && n.importKind !== "value") {
parts.push(n.importKind + " ");
}
const standalones = [];
const grouped = [];
if (n.specifiers && n.specifiers.length > 0) {
path.each(specifierPath => {
const value = specifierPath.getValue();
if (value.type === "ImportDefaultSpecifier" || value.type === "ImportNamespaceSpecifier") {
standalones.push(print(specifierPath));
} else {
grouped.push(print(specifierPath));
}
}, "specifiers");
if (standalones.length > 0) {
parts.push(join$9(", ", standalones));
}
if (standalones.length > 0 && grouped.length > 0) {
parts.push(", ");
}
if (grouped.length === 1 && standalones.length === 0 && n.specifiers && !n.specifiers.some(node => node.comments)) {
parts.push(concat$d(["{", options.bracketSpacing ? " " : "", concat$d(grouped), options.bracketSpacing ? " " : "", "}"]));
} else if (grouped.length >= 1) {
parts.push(group$b(concat$d(["{", indent$7(concat$d([options.bracketSpacing ? line$9 : softline$6, join$9(concat$d([",", line$9]), grouped)])), ifBreak$6(shouldPrintComma$1(options) ? "," : ""), options.bracketSpacing ? line$9 : softline$6, "}"])));
}
parts.push(" from ");
} else if (n.importKind && n.importKind === "type" || // import {} from 'x'
/{\s*}/.test(options.originalText.slice(options.locStart(n), options.locStart(n.source)))) {
parts.push("{} from ");
}
parts.push(path.call(print, "source"), semi);
return concat$d(parts);
}
case "Import":
return "import";
case "TSModuleBlock":
case "BlockStatement":
{
const naked = path.call(bodyPath => {
return printStatementSequence(bodyPath, options, print);
}, "body");
const hasContent = n.body.find(node => node.type !== "EmptyStatement");
const hasDirectives = n.directives && n.directives.length > 0;
const parent = path.getParentNode();
const parentParent = path.getParentNode(1);
if (!hasContent && !hasDirectives && !hasDanglingComments$1(n) && (parent.type === "ArrowFunctionExpression" || parent.type === "FunctionExpression" || parent.type === "FunctionDeclaration" || parent.type === "ObjectMethod" || parent.type === "ClassMethod" || parent.type === "ClassPrivateMethod" || parent.type === "ForStatement" || parent.type === "WhileStatement" || parent.type === "DoWhileStatement" || parent.type === "DoExpression" || parent.type === "CatchClause" && !parentParent.finalizer || parent.type === "TSModuleDeclaration")) {
return "{}";
}
parts.push("{"); // Babel 6
if (hasDirectives) {
path.each(childPath => {
parts.push(indent$7(concat$d([hardline$9, print(childPath), semi])));
if (isNextLineEmpty$4(options.originalText, childPath.getValue(), options.locEnd)) {
parts.push(hardline$9);
}
}, "directives");
}
if (hasContent) {
parts.push(indent$7(concat$d([hardline$9, naked])));
}
parts.push(comments.printDanglingComments(path, options));
parts.push(hardline$9, "}");
return concat$d(parts);
}
case "ReturnStatement":
return concat$d(["return", printReturnAndThrowArgument(path, options, print)]);
case "NewExpression":
case "OptionalCallExpression":
case "CallExpression":
{
const isNew = n.type === "NewExpression";
const optional = printOptionalToken(path);
if ( // We want to keep CommonJS- and AMD-style require calls, and AMD-style
// define calls, as a unit.
// e.g. `define(["some/lib", (lib) => {`
!isNew && n.callee.type === "Identifier" && (n.callee.name === "require" || n.callee.name === "define") || // Template literals as single arguments
n.arguments.length === 1 && isTemplateOnItsOwnLine$1(n.arguments[0], options.originalText, options) || // Keep test declarations on a single line
// e.g. `it('long name', () => {`
!isNew && isTestCall$1(n, path.getParentNode())) {
return concat$d([isNew ? "new " : "", path.call(print, "callee"), optional, printFunctionTypeParameters(path, options, print), concat$d(["(", join$9(", ", path.map(print, "arguments")), ")"])]);
} // Inline Flow annotation comments following Identifiers in Call nodes need to
// stay with the Identifier. For example:
//
// foo /*:: */(bar);
//
// Here, we ensure that such comments stay between the Identifier and the Callee.
const isIdentifierWithFlowAnnotation = n.callee.type === "Identifier" && hasFlowAnnotationComment$1(n.callee.trailingComments);
if (isIdentifierWithFlowAnnotation) {
n.callee.trailingComments[0].printed = true;
} // We detect calls on member lookups and possibly print them in a
// special chain format. See `printMemberChain` for more info.
if (!isNew && isMemberish$1(n.callee) && !path.call(path => needsParens_1(path, options), "callee")) {
return printMemberChain(path, options, print);
}
const contents = concat$d([isNew ? "new " : "", path.call(print, "callee"), optional, isIdentifierWithFlowAnnotation ? "/*:: ".concat(n.callee.trailingComments[0].value.slice(2).trim(), " */") : "", printFunctionTypeParameters(path, options, print), printArgumentsList(path, options, print)]); // We group here when the callee is itself a call expression.
// See `isLongCurriedCallExpression` for more info.
if (isCallOrOptionalCallExpression$1(n.callee)) {
return group$b(contents);
}
return contents;
}
case "TSInterfaceDeclaration":
if (n.declare) {
parts.push("declare ");
}
parts.push(n.abstract ? "abstract " : "", printTypeScriptModifiers(path, options, print), "interface ", path.call(print, "id"), n.typeParameters ? path.call(print, "typeParameters") : "", " ");
if (n.extends && n.extends.length) {
parts.push(group$b(indent$7(concat$d([softline$6, "extends ", (n.extends.length === 1 ? identity$2 : indent$7)(join$9(concat$d([",", line$9]), path.map(print, "extends"))), " "]))));
}
parts.push(path.call(print, "body"));
return concat$d(parts);
case "ObjectTypeInternalSlot":
return concat$d([n.static ? "static " : "", "[[", path.call(print, "id"), "]]", printOptionalToken(path), n.method ? "" : ": ", path.call(print, "value")]);
case "ObjectExpression":
case "ObjectPattern":
case "ObjectTypeAnnotation":
case "TSInterfaceBody":
case "TSTypeLiteral":
{
let propertiesField;
if (n.type === "TSTypeLiteral") {
propertiesField = "members";
} else if (n.type === "TSInterfaceBody") {
propertiesField = "body";
} else {
propertiesField = "properties";
}
const isTypeAnnotation = n.type === "ObjectTypeAnnotation";
const fields = [];
if (isTypeAnnotation) {
fields.push("indexers", "callProperties", "internalSlots");
}
fields.push(propertiesField);
const firstProperty = fields.map(field => n[field][0]).sort((a, b) => options.locStart(a) - options.locStart(b))[0];
const parent = path.getParentNode(0);
const isFlowInterfaceLikeBody = isTypeAnnotation && parent && (parent.type === "InterfaceDeclaration" || parent.type === "DeclareInterface" || parent.type === "DeclareClass") && path.getName() === "body";
const shouldBreak = n.type === "TSInterfaceBody" || isFlowInterfaceLikeBody || n.type === "ObjectPattern" && parent.type !== "FunctionDeclaration" && parent.type !== "FunctionExpression" && parent.type !== "ArrowFunctionExpression" && parent.type !== "ObjectMethod" && parent.type !== "ClassMethod" && parent.type !== "ClassPrivateMethod" && parent.type !== "AssignmentPattern" && parent.type !== "CatchClause" && n.properties.some(property => property.value && (property.value.type === "ObjectPattern" || property.value.type === "ArrayPattern")) || n.type !== "ObjectPattern" && firstProperty && hasNewlineInRange$3(options.originalText, options.locStart(n), options.locStart(firstProperty));
const separator = isFlowInterfaceLikeBody ? ";" : n.type === "TSInterfaceBody" || n.type === "TSTypeLiteral" ? ifBreak$6(semi, ";") : ",";
const leftBrace = n.exact ? "{|" : "{";
const rightBrace = n.exact ? "|}" : "}"; // Unfortunately, things are grouped together in the ast can be
// interleaved in the source code. So we need to reorder them before
// printing them.
const propsAndLoc = [];
fields.forEach(field => {
path.each(childPath => {
const node = childPath.getValue();
propsAndLoc.push({
node,
printed: print(childPath),
loc: options.locStart(node)
});
}, field);
});
let separatorParts = [];
const props = propsAndLoc.sort((a, b) => a.loc - b.loc).map(prop => {
const result = concat$d(separatorParts.concat(group$b(prop.printed)));
separatorParts = [separator, line$9];
if ((prop.node.type === "TSPropertySignature" || prop.node.type === "TSMethodSignature" || prop.node.type === "TSConstructSignatureDeclaration") && hasNodeIgnoreComment$2(prop.node)) {
separatorParts.shift();
}
if (isNextLineEmpty$4(options.originalText, prop.node, options.locEnd)) {
separatorParts.push(hardline$9);
}
return result;
});
if (n.inexact) {
let printed;
if (hasDanglingComments$1(n)) {
const hasLineComments = !n.comments.every(comments$1.isBlockComment);
const printedDanglingComments = comments.printDanglingComments(path, options,
/* sameIndent */
true);
printed = concat$d([printedDanglingComments, hasLineComments || hasNewline$5(options.originalText, options.locEnd(n.comments[n.comments.length - 1])) ? hardline$9 : line$9, "..."]);
} else {
printed = "...";
}
props.push(concat$d(separatorParts.concat(printed)));
}
const lastElem = getLast$3(n[propertiesField]);
const canHaveTrailingSeparator = !(n.inexact || lastElem && (lastElem.type === "RestElement" || hasNodeIgnoreComment$2(lastElem)));
let content;
if (props.length === 0) {
if (!hasDanglingComments$1(n)) {
return concat$d([leftBrace, rightBrace, printTypeAnnotation(path, options, print)]);
}
content = group$b(concat$d([leftBrace, comments.printDanglingComments(path, options), softline$6, rightBrace, printOptionalToken(path), printTypeAnnotation(path, options, print)]));
} else {
content = concat$d([leftBrace, indent$7(concat$d([options.bracketSpacing ? line$9 : softline$6, concat$d(props)])), ifBreak$6(canHaveTrailingSeparator && (separator !== "," || shouldPrintComma$1(options)) ? separator : ""), concat$d([options.bracketSpacing ? line$9 : softline$6, rightBrace]), printOptionalToken(path), printTypeAnnotation(path, options, print)]);
} // If we inline the object as first argument of the parent, we don't want
// to create another group so that the object breaks before the return
// type
if (path.match(node => node.type === "ObjectPattern" && !node.decorators, (node, name, number) => shouldHugArguments(node) && (name === "params" || name === "parameters") && number === 0) || path.match(shouldHugType, (node, name) => name === "typeAnnotation", (node, name) => name === "typeAnnotation", (node, name, number) => shouldHugArguments(node) && (name === "params" || name === "parameters") && number === 0)) {
return content;
}
return group$b(content, {
shouldBreak
});
}
// Babel 6
case "ObjectProperty": // Non-standard AST node type.
case "Property":
if (n.method || n.kind === "get" || n.kind === "set") {
return printMethod(path, options, print);
}
if (n.shorthand) {
parts.push(path.call(print, "value"));
} else {
parts.push(printAssignment(n.key, printPropertyKey(path, options, print), ":", n.value, path.call(print, "value"), options));
}
return concat$d(parts);
// Babel 6
case "ClassMethod":
case "ClassPrivateMethod":
case "MethodDefinition":
case "TSAbstractMethodDefinition":
case "TSDeclareMethod":
if (n.decorators && n.decorators.length !== 0) {
parts.push(printDecorators(path, options, print));
}
if (n.accessibility) {
parts.push(n.accessibility + " ");
}
if (n.static) {
parts.push("static ");
}
if (n.type === "TSAbstractMethodDefinition" || n.abstract) {
parts.push("abstract ");
}
parts.push(printMethod(path, options, print));
return concat$d(parts);
case "ObjectMethod":
return printMethod(path, options, print);
case "Decorator":
return concat$d(["@", path.call(print, "expression"), path.call(print, "callee")]);
case "ArrayExpression":
case "ArrayPattern":
if (n.elements.length === 0) {
if (!hasDanglingComments$1(n)) {
parts.push("[]");
} else {
parts.push(group$b(concat$d(["[", comments.printDanglingComments(path, options), softline$6, "]"])));
}
} else {
const lastElem = getLast$3(n.elements);
const canHaveTrailingComma = !(lastElem && lastElem.type === "RestElement"); // JavaScript allows you to have empty elements in an array which
// changes its length based on the number of commas. The algorithm
// is that if the last argument is null, we need to force insert
// a comma to ensure JavaScript recognizes it.
// [,].length === 1
// [1,].length === 1
// [1,,].length === 2
//
// Note that getLast returns null if the array is empty, but
// we already check for an empty array just above so we are safe
const needsForcedTrailingComma = canHaveTrailingComma && lastElem === null;
const shouldBreak = n.elements.length > 1 && n.elements.every((element, i, elements) => {
const elementType = element && element.type;
if (elementType !== "ArrayExpression" && elementType !== "ObjectExpression") {
return false;
}
const nextElement = elements[i + 1];
if (nextElement && elementType !== nextElement.type) {
return false;
}
const itemsKey = elementType === "ArrayExpression" ? "elements" : "properties";
return element[itemsKey] && element[itemsKey].length > 1;
});
parts.push(group$b(concat$d(["[", indent$7(concat$d([softline$6, printArrayItems(path, options, "elements", print)])), needsForcedTrailingComma ? "," : "", ifBreak$6(canHaveTrailingComma && !needsForcedTrailingComma && shouldPrintComma$1(options) ? "," : ""), comments.printDanglingComments(path, options,
/* sameIndent */
true), softline$6, "]"]), {
shouldBreak
}));
}
parts.push(printOptionalToken(path), printTypeAnnotation(path, options, print));
return concat$d(parts);
case "SequenceExpression":
{
const parent = path.getParentNode(0);
if (parent.type === "ExpressionStatement" || parent.type === "ForStatement") {
// For ExpressionStatements and for-loop heads, which are among
// the few places a SequenceExpression appears unparenthesized, we want
// to indent expressions after the first.
const parts = [];
path.each(p => {
if (p.getName() === 0) {
parts.push(print(p));
} else {
parts.push(",", indent$7(concat$d([line$9, print(p)])));
}
}, "expressions");
return group$b(concat$d(parts));
}
return group$b(concat$d([join$9(concat$d([",", line$9]), path.map(print, "expressions"))]));
}
case "ThisExpression":
return "this";
case "Super":
return "super";
case "NullLiteral":
// Babel 6 Literal split
return "null";
case "RegExpLiteral":
// Babel 6 Literal split
return printRegex(n);
case "NumericLiteral":
// Babel 6 Literal split
return printNumber$2(n.extra.raw);
case "BigIntLiteral":
// babel: n.extra.raw, typescript: n.raw, flow: n.bigint
return (n.bigint || (n.extra ? n.extra.raw : n.raw)).toLowerCase();
case "BooleanLiteral": // Babel 6 Literal split
case "StringLiteral": // Babel 6 Literal split
case "Literal":
{
if (n.regex) {
return printRegex(n.regex);
}
if (typeof n.value === "number") {
return printNumber$2(n.raw);
}
if (typeof n.value !== "string") {
return "" + n.value;
} // TypeScript workaround for https://github.com/JamesHenry/typescript-estree/issues/2
// See corresponding workaround in needs-parens.js
const grandParent = path.getParentNode(1);
const isTypeScriptDirective = options.parser === "typescript" && typeof n.value === "string" && grandParent && (grandParent.type === "Program" || grandParent.type === "BlockStatement");
return nodeStr(n, options, isTypeScriptDirective);
}
case "Directive":
return path.call(print, "value");
// Babel 6
case "DirectiveLiteral":
return nodeStr(n, options);
case "UnaryExpression":
parts.push(n.operator);
if (/[a-z]$/.test(n.operator)) {
parts.push(" ");
}
if (n.argument.comments && n.argument.comments.length > 0) {
parts.push(group$b(concat$d(["(", indent$7(concat$d([softline$6, path.call(print, "argument")])), softline$6, ")"])));
} else {
parts.push(path.call(print, "argument"));
}
return concat$d(parts);
case "UpdateExpression":
parts.push(path.call(print, "argument"), n.operator);
if (n.prefix) {
parts.reverse();
}
return concat$d(parts);
case "ConditionalExpression":
return printTernaryOperator(path, options, print, {
beforeParts: () => [path.call(print, "test")],
afterParts: breakClosingParen => [breakClosingParen ? softline$6 : ""],
shouldCheckJsx: true,
conditionalNodeType: "ConditionalExpression",
consequentNodePropertyName: "consequent",
alternateNodePropertyName: "alternate",
testNodePropertyNames: ["test"]
});
case "VariableDeclaration":
{
const printed = path.map(childPath => {
return print(childPath);
}, "declarations"); // We generally want to terminate all variable declarations with a
// semicolon, except when they in the () part of for loops.
const parentNode = path.getParentNode();
const isParentForLoop = parentNode.type === "ForStatement" || parentNode.type === "ForInStatement" || parentNode.type === "ForOfStatement";
const hasValue = n.declarations.some(decl => decl.init);
let firstVariable;
if (printed.length === 1 && !n.declarations[0].comments) {
firstVariable = printed[0];
} else if (printed.length > 0) {
// Indent first var to comply with eslint one-var rule
firstVariable = indent$7(printed[0]);
}
parts = [n.declare ? "declare " : "", n.kind, firstVariable ? concat$d([" ", firstVariable]) : "", indent$7(concat$d(printed.slice(1).map(p => concat$d([",", hasValue && !isParentForLoop ? hardline$9 : line$9, p]))))];
if (!(isParentForLoop && parentNode.body !== n)) {
parts.push(semi);
}
return group$b(concat$d(parts));
}
case "TSTypeAliasDeclaration":
{
if (n.declare) {
parts.push("declare ");
}
const printed = printAssignmentRight(n.id, n.typeAnnotation, n.typeAnnotation && path.call(print, "typeAnnotation"), options);
parts.push("type ", path.call(print, "id"), path.call(print, "typeParameters"), " =", printed, semi);
return group$b(concat$d(parts));
}
case "VariableDeclarator":
return printAssignment(n.id, path.call(print, "id"), " =", n.init, n.init && path.call(print, "init"), options);
case "WithStatement":
return group$b(concat$d(["with (", path.call(print, "object"), ")", adjustClause(n.body, path.call(print, "body"))]));
case "IfStatement":
{
const con = adjustClause(n.consequent, path.call(print, "consequent"));
const opening = group$b(concat$d(["if (", group$b(concat$d([indent$7(concat$d([softline$6, path.call(print, "test")])), softline$6])), ")", con]));
parts.push(opening);
if (n.alternate) {
const commentOnOwnLine = hasTrailingComment$1(n.consequent) && n.consequent.comments.some(comment => comment.trailing && !comments$1.isBlockComment(comment)) || needsHardlineAfterDanglingComment$1(n);
const elseOnSameLine = n.consequent.type === "BlockStatement" && !commentOnOwnLine;
parts.push(elseOnSameLine ? " " : hardline$9);
if (hasDanglingComments$1(n)) {
parts.push(comments.printDanglingComments(path, options, true), commentOnOwnLine ? hardline$9 : " ");
}
parts.push("else", group$b(adjustClause(n.alternate, path.call(print, "alternate"), n.alternate.type === "IfStatement")));
}
return concat$d(parts);
}
case "ForStatement":
{
const body = adjustClause(n.body, path.call(print, "body")); // We want to keep dangling comments above the loop to stay consistent.
// Any comment positioned between the for statement and the parentheses
// is going to be printed before the statement.
const dangling = comments.printDanglingComments(path, options,
/* sameLine */
true);
const printedComments = dangling ? concat$d([dangling, softline$6]) : "";
if (!n.init && !n.test && !n.update) {
return concat$d([printedComments, group$b(concat$d(["for (;;)", body]))]);
}
return concat$d([printedComments, group$b(concat$d(["for (", group$b(concat$d([indent$7(concat$d([softline$6, path.call(print, "init"), ";", line$9, path.call(print, "test"), ";", line$9, path.call(print, "update")])), softline$6])), ")", body]))]);
}
case "WhileStatement":
return group$b(concat$d(["while (", group$b(concat$d([indent$7(concat$d([softline$6, path.call(print, "test")])), softline$6])), ")", adjustClause(n.body, path.call(print, "body"))]));
case "ForInStatement":
// Note: esprima can't actually parse "for each (".
return group$b(concat$d([n.each ? "for each (" : "for (", path.call(print, "left"), " in ", path.call(print, "right"), ")", adjustClause(n.body, path.call(print, "body"))]));
case "ForOfStatement":
return group$b(concat$d(["for", n.await ? " await" : "", " (", path.call(print, "left"), " of ", path.call(print, "right"), ")", adjustClause(n.body, path.call(print, "body"))]));
case "DoWhileStatement":
{
const clause = adjustClause(n.body, path.call(print, "body"));
const doBody = group$b(concat$d(["do", clause]));
parts = [doBody];
if (n.body.type === "BlockStatement") {
parts.push(" ");
} else {
parts.push(hardline$9);
}
parts.push("while (");
parts.push(group$b(concat$d([indent$7(concat$d([softline$6, path.call(print, "test")])), softline$6])), ")", semi);
return concat$d(parts);
}
case "DoExpression":
return concat$d(["do ", path.call(print, "body")]);
case "BreakStatement":
parts.push("break");
if (n.label) {
parts.push(" ", path.call(print, "label"));
}
parts.push(semi);
return concat$d(parts);
case "ContinueStatement":
parts.push("continue");
if (n.label) {
parts.push(" ", path.call(print, "label"));
}
parts.push(semi);
return concat$d(parts);
case "LabeledStatement":
if (n.body.type === "EmptyStatement") {
return concat$d([path.call(print, "label"), ":;"]);
}
return concat$d([path.call(print, "label"), ": ", path.call(print, "body")]);
case "TryStatement":
return concat$d(["try ", path.call(print, "block"), n.handler ? concat$d([" ", path.call(print, "handler")]) : "", n.finalizer ? concat$d([" finally ", path.call(print, "finalizer")]) : ""]);
case "CatchClause":
if (n.param) {
const hasComments = n.param.comments && n.param.comments.some(comment => !comments$1.isBlockComment(comment) || comment.leading && hasNewline$5(options.originalText, options.locEnd(comment)) || comment.trailing && hasNewline$5(options.originalText, options.locStart(comment), {
backwards: true
}));
const param = path.call(print, "param");
return concat$d(["catch ", hasComments ? concat$d(["(", indent$7(concat$d([softline$6, param])), softline$6, ") "]) : concat$d(["(", param, ") "]), path.call(print, "body")]);
}
return concat$d(["catch ", path.call(print, "body")]);
case "ThrowStatement":
return concat$d(["throw", printReturnAndThrowArgument(path, options, print)]);
// Note: ignoring n.lexical because it has no printing consequences.
case "SwitchStatement":
return concat$d([group$b(concat$d(["switch (", indent$7(concat$d([softline$6, path.call(print, "discriminant")])), softline$6, ")"])), " {", n.cases.length > 0 ? indent$7(concat$d([hardline$9, join$9(hardline$9, path.map(casePath => {
const caseNode = casePath.getValue();
return concat$d([casePath.call(print), n.cases.indexOf(caseNode) !== n.cases.length - 1 && isNextLineEmpty$4(options.originalText, caseNode, options.locEnd) ? hardline$9 : ""]);
}, "cases"))])) : "", hardline$9, "}"]);
case "SwitchCase":
{
if (n.test) {
parts.push("case ", path.call(print, "test"), ":");
} else {
parts.push("default:");
}
const consequent = n.consequent.filter(node => node.type !== "EmptyStatement");
if (consequent.length > 0) {
const cons = path.call(consequentPath => {
return printStatementSequence(consequentPath, options, print);
}, "consequent");
parts.push(consequent.length === 1 && consequent[0].type === "BlockStatement" ? concat$d([" ", cons]) : indent$7(concat$d([hardline$9, cons])));
}
return concat$d(parts);
}
// JSX extensions below.
case "DebuggerStatement":
return concat$d(["debugger", semi]);
case "JSXAttribute":
parts.push(path.call(print, "name"));
if (n.value) {
let res;
if (isStringLiteral$1(n.value)) {
const raw = rawText$1(n.value); // Unescape all quotes so we get an accurate preferred quote
let final = raw.replace(/'/g, "'").replace(/"/g, '"');
const quote = getPreferredQuote$1(final, options.jsxSingleQuote ? "'" : '"');
const escape = quote === "'" ? "'" : """;
final = final.slice(1, -1).replace(new RegExp(quote, "g"), escape);
res = concat$d([quote, final, quote]);
} else {
res = path.call(print, "value");
}
parts.push("=", res);
}
return concat$d(parts);
case "JSXIdentifier":
return "" + n.name;
case "JSXNamespacedName":
return join$9(":", [path.call(print, "namespace"), path.call(print, "name")]);
case "JSXMemberExpression":
return join$9(".", [path.call(print, "object"), path.call(print, "property")]);
case "TSQualifiedName":
return join$9(".", [path.call(print, "left"), path.call(print, "right")]);
case "JSXSpreadAttribute":
case "JSXSpreadChild":
{
return concat$d(["{", path.call(p => {
const printed = concat$d(["...", print(p)]);
const n = p.getValue();
if (!n.comments || !n.comments.length) {
return printed;
}
return concat$d([indent$7(concat$d([softline$6, comments.printComments(p, () => printed, options)])), softline$6]);
}, n.type === "JSXSpreadAttribute" ? "argument" : "expression"), "}"]);
}
case "JSXExpressionContainer":
{
const parent = path.getParentNode(0);
const hasComments = n.expression.comments && n.expression.comments.length > 0;
const shouldInline = n.expression.type === "JSXEmptyExpression" || !hasComments && (n.expression.type === "ArrayExpression" || n.expression.type === "ObjectExpression" || n.expression.type === "ArrowFunctionExpression" || n.expression.type === "CallExpression" || n.expression.type === "OptionalCallExpression" || n.expression.type === "FunctionExpression" || n.expression.type === "TemplateLiteral" || n.expression.type === "TaggedTemplateExpression" || n.expression.type === "DoExpression" || isJSXNode$1(parent) && (n.expression.type === "ConditionalExpression" || isBinaryish$1(n.expression)));
if (shouldInline) {
return group$b(concat$d(["{", path.call(print, "expression"), lineSuffixBoundary$1, "}"]));
}
return group$b(concat$d(["{", indent$7(concat$d([softline$6, path.call(print, "expression")])), softline$6, lineSuffixBoundary$1, "}"]));
}
case "JSXFragment":
case "JSXElement":
{
const elem = comments.printComments(path, () => printJSXElement(path, options, print), options);
return maybeWrapJSXElementInParens(path, elem, options);
}
case "JSXOpeningElement":
{
const n = path.getValue();
const nameHasComments = n.name && n.name.comments && n.name.comments.length > 0 || n.typeParameters && n.typeParameters.comments && n.typeParameters.comments.length > 0; // Don't break self-closing elements with no attributes and no comments
if (n.selfClosing && !n.attributes.length && !nameHasComments) {
return concat$d(["<", path.call(print, "name"), path.call(print, "typeParameters"), " />"]);
} // don't break up opening elements with a single long text attribute
if (n.attributes && n.attributes.length === 1 && n.attributes[0].value && isStringLiteral$1(n.attributes[0].value) && !n.attributes[0].value.value.includes("\n") && // We should break for the following cases:
//
//
!nameHasComments && (!n.attributes[0].comments || !n.attributes[0].comments.length)) {
return group$b(concat$d(["<", path.call(print, "name"), path.call(print, "typeParameters"), " ", concat$d(path.map(print, "attributes")), n.selfClosing ? " />" : ">"]));
}
const lastAttrHasTrailingComments = n.attributes.length && hasTrailingComment$1(getLast$3(n.attributes));
const bracketSameLine = // Simple tags (no attributes and no comment in tag name) should be
// kept unbroken regardless of `jsxBracketSameLine`
!n.attributes.length && !nameHasComments || options.jsxBracketSameLine && ( // We should print the bracket in a new line for the following cases:
//
//
!nameHasComments || n.attributes.length) && !lastAttrHasTrailingComments; // We should print the opening element expanded if any prop value is a
// string literal with newlines
const shouldBreak = n.attributes && n.attributes.some(attr => attr.value && isStringLiteral$1(attr.value) && attr.value.value.includes("\n"));
return group$b(concat$d(["<", path.call(print, "name"), path.call(print, "typeParameters"), concat$d([indent$7(concat$d(path.map(attr => concat$d([line$9, print(attr)]), "attributes"))), n.selfClosing ? line$9 : bracketSameLine ? ">" : softline$6]), n.selfClosing ? "/>" : bracketSameLine ? "" : ">"]), {
shouldBreak
});
}
case "JSXClosingElement":
return concat$d(["", path.call(print, "name"), ">"]);
case "JSXOpeningFragment":
case "JSXClosingFragment":
{
const hasComment = n.comments && n.comments.length;
const hasOwnLineComment = hasComment && !n.comments.every(comments$1.isBlockComment);
const isOpeningFragment = n.type === "JSXOpeningFragment";
return concat$d([isOpeningFragment ? "<" : "", indent$7(concat$d([hasOwnLineComment ? hardline$9 : hasComment && !isOpeningFragment ? " " : "", comments.printDanglingComments(path, options, true)])), hasOwnLineComment ? hardline$9 : "", ">"]);
}
case "JSXText":
/* istanbul ignore next */
throw new Error("JSXTest should be handled by JSXElement");
case "JSXEmptyExpression":
{
const requiresHardline = n.comments && !n.comments.every(comments$1.isBlockComment);
return concat$d([comments.printDanglingComments(path, options,
/* sameIndent */
!requiresHardline), requiresHardline ? hardline$9 : ""]);
}
case "ClassBody":
if (!n.comments && n.body.length === 0) {
return "{}";
}
return concat$d(["{", n.body.length > 0 ? indent$7(concat$d([hardline$9, path.call(bodyPath => {
return printStatementSequence(bodyPath, options, print);
}, "body")])) : comments.printDanglingComments(path, options), hardline$9, "}"]);
case "ClassProperty":
case "TSAbstractClassProperty":
case "ClassPrivateProperty":
{
if (n.decorators && n.decorators.length !== 0) {
parts.push(printDecorators(path, options, print));
}
if (n.accessibility) {
parts.push(n.accessibility + " ");
}
if (n.declare) {
parts.push("declare ");
}
if (n.static) {
parts.push("static ");
}
if (n.type === "TSAbstractClassProperty" || n.abstract) {
parts.push("abstract ");
}
if (n.readonly) {
parts.push("readonly ");
}
const variance = getFlowVariance$1(n);
if (variance) {
parts.push(variance);
}
parts.push(printPropertyKey(path, options, print), printOptionalToken(path), printTypeAnnotation(path, options, print));
if (n.value) {
parts.push(" =", printAssignmentRight(n.key, n.value, path.call(print, "value"), options));
}
parts.push(semi);
return group$b(concat$d(parts));
}
case "ClassDeclaration":
case "ClassExpression":
if (n.declare) {
parts.push("declare ");
}
parts.push(concat$d(printClass(path, options, print)));
return concat$d(parts);
case "TSInterfaceHeritage":
case "TSExpressionWithTypeArguments":
// Babel AST
parts.push(path.call(print, "expression"));
if (n.typeParameters) {
parts.push(path.call(print, "typeParameters"));
}
return concat$d(parts);
case "TemplateElement":
return join$9(literalline$4, n.value.raw.split(/\r?\n/g));
case "TemplateLiteral":
{
let expressions = path.map(print, "expressions");
const parentNode = path.getParentNode();
if (isJestEachTemplateLiteral$1(n, parentNode)) {
const printed = printJestEachTemplateLiteral(n, expressions, options);
if (printed) {
return printed;
}
}
const isSimple = isSimpleTemplateLiteral$1(n);
if (isSimple) {
expressions = expressions.map(doc => printDocToString$2(doc, Object.assign({}, options, {
printWidth: Infinity
})).formatted);
}
parts.push(lineSuffixBoundary$1, "`");
path.each(childPath => {
const i = childPath.getName();
parts.push(print(childPath));
if (i < expressions.length) {
// For a template literal of the following form:
// `someQuery {
// ${call({
// a,
// b,
// })}
// }`
// the expression is on its own line (there is a \n in the previous
// quasi literal), therefore we want to indent the JavaScript
// expression inside at the beginning of ${ instead of the beginning
// of the `.
const {
tabWidth
} = options;
const quasi = childPath.getValue();
const indentSize = getIndentSize$2(quasi.value.raw, tabWidth);
let printed = expressions[i];
if (!isSimple) {
// Breaks at the template element boundaries (${ and }) are preferred to breaking
// in the middle of a MemberExpression
if (n.expressions[i].comments && n.expressions[i].comments.length || n.expressions[i].type === "MemberExpression" || n.expressions[i].type === "OptionalMemberExpression" || n.expressions[i].type === "ConditionalExpression" || n.expressions[i].type === "SequenceExpression" || n.expressions[i].type === "TSAsExpression" || isBinaryish$1(n.expressions[i])) {
printed = concat$d([indent$7(concat$d([softline$6, printed])), softline$6]);
}
}
const aligned = indentSize === 0 && quasi.value.raw.endsWith("\n") ? align$1(-Infinity, printed) : addAlignmentToDoc$2(printed, indentSize, tabWidth);
parts.push(group$b(concat$d(["${", aligned, lineSuffixBoundary$1, "}"])));
}
}, "quasis");
parts.push("`");
return concat$d(parts);
}
// These types are unprintable because they serve as abstract
// supertypes for other (printable) types.
case "TaggedTemplateExpression":
return concat$d([path.call(print, "tag"), path.call(print, "typeParameters"), path.call(print, "quasi")]);
case "Node":
case "Printable":
case "SourceLocation":
case "Position":
case "Statement":
case "Function":
case "Pattern":
case "Expression":
case "Declaration":
case "Specifier":
case "NamedSpecifier":
case "Comment":
case "MemberTypeAnnotation": // Flow
case "Type":
/* istanbul ignore next */
throw new Error("unprintable type: " + JSON.stringify(n.type));
// Type Annotations for Facebook Flow, typically stripped out or
// transformed away before printing.
case "TypeAnnotation":
case "TSTypeAnnotation":
if (n.typeAnnotation) {
return path.call(print, "typeAnnotation");
}
/* istanbul ignore next */
return "";
case "TSTupleType":
case "TupleTypeAnnotation":
{
const typesField = n.type === "TSTupleType" ? "elementTypes" : "types";
const hasRest = n[typesField].length > 0 && getLast$3(n[typesField]).type === "TSRestType";
return group$b(concat$d(["[", indent$7(concat$d([softline$6, printArrayItems(path, options, typesField, print)])), ifBreak$6(shouldPrintComma$1(options, "all") && !hasRest ? "," : ""), comments.printDanglingComments(path, options,
/* sameIndent */
true), softline$6, "]"]));
}
case "ExistsTypeAnnotation":
return "*";
case "EmptyTypeAnnotation":
return "empty";
case "AnyTypeAnnotation":
return "any";
case "MixedTypeAnnotation":
return "mixed";
case "ArrayTypeAnnotation":
return concat$d([path.call(print, "elementType"), "[]"]);
case "BooleanTypeAnnotation":
return "boolean";
case "BooleanLiteralTypeAnnotation":
return "" + n.value;
case "DeclareClass":
return printFlowDeclaration(path, printClass(path, options, print));
case "TSDeclareFunction":
// For TypeScript the TSDeclareFunction node shares the AST
// structure with FunctionDeclaration
return concat$d([n.declare ? "declare " : "", printFunctionDeclaration(path, print, options), semi]);
case "DeclareFunction":
return printFlowDeclaration(path, ["function ", path.call(print, "id"), n.predicate ? " " : "", path.call(print, "predicate"), semi]);
case "DeclareModule":
return printFlowDeclaration(path, ["module ", path.call(print, "id"), " ", path.call(print, "body")]);
case "DeclareModuleExports":
return printFlowDeclaration(path, ["module.exports", ": ", path.call(print, "typeAnnotation"), semi]);
case "DeclareVariable":
return printFlowDeclaration(path, ["var ", path.call(print, "id"), semi]);
case "DeclareExportAllDeclaration":
return concat$d(["declare export * from ", path.call(print, "source")]);
case "DeclareExportDeclaration":
return concat$d(["declare ", printExportDeclaration(path, options, print)]);
case "DeclareOpaqueType":
case "OpaqueType":
{
parts.push("opaque type ", path.call(print, "id"), path.call(print, "typeParameters"));
if (n.supertype) {
parts.push(": ", path.call(print, "supertype"));
}
if (n.impltype) {
parts.push(" = ", path.call(print, "impltype"));
}
parts.push(semi);
if (n.type === "DeclareOpaqueType") {
return printFlowDeclaration(path, parts);
}
return concat$d(parts);
}
case "EnumDeclaration":
return concat$d(["enum ", path.call(print, "id"), " ", path.call(print, "body")]);
case "EnumBooleanBody":
case "EnumNumberBody":
case "EnumStringBody":
case "EnumSymbolBody":
{
if (n.type === "EnumSymbolBody" || n.explicitType) {
let type = null;
switch (n.type) {
case "EnumBooleanBody":
type = "boolean";
break;
case "EnumNumberBody":
type = "number";
break;
case "EnumStringBody":
type = "string";
break;
case "EnumSymbolBody":
type = "symbol";
break;
}
parts.push("of ", type, " ");
}
if (n.members.length === 0) {
parts.push(group$b(concat$d(["{", comments.printDanglingComments(path, options), softline$6, "}"])));
} else {
parts.push(group$b(concat$d(["{", indent$7(concat$d([hardline$9, printArrayItems(path, options, "members", print), shouldPrintComma$1(options) ? "," : ""])), comments.printDanglingComments(path, options,
/* sameIndent */
true), hardline$9, "}"])));
}
return concat$d(parts);
}
case "EnumBooleanMember":
case "EnumNumberMember":
case "EnumStringMember":
return concat$d([path.call(print, "id"), " = ", typeof n.init === "object" ? path.call(print, "init") : String(n.init)]);
case "EnumDefaultedMember":
return path.call(print, "id");
case "FunctionTypeAnnotation":
case "TSFunctionType":
{
// FunctionTypeAnnotation is ambiguous:
// declare function foo(a: B): void; OR
// var A: (a: B) => void;
const parent = path.getParentNode(0);
const parentParent = path.getParentNode(1);
const parentParentParent = path.getParentNode(2);
let isArrowFunctionTypeAnnotation = n.type === "TSFunctionType" || !((parent.type === "ObjectTypeProperty" || parent.type === "ObjectTypeInternalSlot") && !getFlowVariance$1(parent) && !parent.optional && options.locStart(parent) === options.locStart(n) || parent.type === "ObjectTypeCallProperty" || parentParentParent && parentParentParent.type === "DeclareFunction");
let needsColon = isArrowFunctionTypeAnnotation && (parent.type === "TypeAnnotation" || parent.type === "TSTypeAnnotation"); // Sadly we can't put it inside of FastPath::needsColon because we are
// printing ":" as part of the expression and it would put parenthesis
// around :(
const needsParens = needsColon && isArrowFunctionTypeAnnotation && (parent.type === "TypeAnnotation" || parent.type === "TSTypeAnnotation") && parentParent.type === "ArrowFunctionExpression";
if (isObjectTypePropertyAFunction$1(parent, options)) {
isArrowFunctionTypeAnnotation = true;
needsColon = true;
}
if (needsParens) {
parts.push("(");
}
parts.push(printFunctionParams(path, print, options,
/* expandArg */
false,
/* printTypeParams */
true)); // The returnType is not wrapped in a TypeAnnotation, so the colon
// needs to be added separately.
if (n.returnType || n.predicate || n.typeAnnotation) {
parts.push(isArrowFunctionTypeAnnotation ? " => " : ": ", path.call(print, "returnType"), path.call(print, "predicate"), path.call(print, "typeAnnotation"));
}
if (needsParens) {
parts.push(")");
}
return group$b(concat$d(parts));
}
case "TSRestType":
return concat$d(["...", path.call(print, "typeAnnotation")]);
case "TSOptionalType":
return concat$d([path.call(print, "typeAnnotation"), "?"]);
case "FunctionTypeParam":
return concat$d([path.call(print, "name"), printOptionalToken(path), n.name ? ": " : "", path.call(print, "typeAnnotation")]);
case "GenericTypeAnnotation":
return concat$d([path.call(print, "id"), path.call(print, "typeParameters")]);
case "DeclareInterface":
case "InterfaceDeclaration":
case "InterfaceTypeAnnotation":
{
if (n.type === "DeclareInterface" || n.declare) {
parts.push("declare ");
}
parts.push("interface");
if (n.type === "DeclareInterface" || n.type === "InterfaceDeclaration") {
parts.push(" ", path.call(print, "id"), path.call(print, "typeParameters"));
}
if (n.extends.length > 0) {
parts.push(group$b(indent$7(concat$d([line$9, "extends ", (n.extends.length === 1 ? identity$2 : indent$7)(join$9(concat$d([",", line$9]), path.map(print, "extends")))]))));
}
parts.push(" ", path.call(print, "body"));
return group$b(concat$d(parts));
}
case "ClassImplements":
case "InterfaceExtends":
return concat$d([path.call(print, "id"), path.call(print, "typeParameters")]);
case "TSClassImplements":
return concat$d([path.call(print, "expression"), path.call(print, "typeParameters")]);
case "TSIntersectionType":
case "IntersectionTypeAnnotation":
{
const types = path.map(print, "types");
const result = [];
let wasIndented = false;
for (let i = 0; i < types.length; ++i) {
if (i === 0) {
result.push(types[i]);
} else if (isObjectType$1(n.types[i - 1]) && isObjectType$1(n.types[i])) {
// If both are objects, don't indent
result.push(concat$d([" & ", wasIndented ? indent$7(types[i]) : types[i]]));
} else if (!isObjectType$1(n.types[i - 1]) && !isObjectType$1(n.types[i])) {
// If no object is involved, go to the next line if it breaks
result.push(indent$7(concat$d([" &", line$9, types[i]])));
} else {
// If you go from object to non-object or vis-versa, then inline it
if (i > 1) {
wasIndented = true;
}
result.push(" & ", i > 1 ? indent$7(types[i]) : types[i]);
}
}
return group$b(concat$d(result));
}
case "TSUnionType":
case "UnionTypeAnnotation":
{
// single-line variation
// A | B | C
// multi-line variation
// | A
// | B
// | C
const parent = path.getParentNode(); // If there's a leading comment, the parent is doing the indentation
const shouldIndent = parent.type !== "TypeParameterInstantiation" && parent.type !== "TSTypeParameterInstantiation" && parent.type !== "GenericTypeAnnotation" && parent.type !== "TSTypeReference" && parent.type !== "TSTypeAssertion" && parent.type !== "TupleTypeAnnotation" && parent.type !== "TSTupleType" && !(parent.type === "FunctionTypeParam" && !parent.name) && !((parent.type === "TypeAlias" || parent.type === "VariableDeclarator" || parent.type === "TSTypeAliasDeclaration") && hasLeadingOwnLineComment$1(options.originalText, n, options)); // {
// a: string
// } | null | void
// should be inlined and not be printed in the multi-line variant
const shouldHug = shouldHugType(n); // We want to align the children but without its comment, so it looks like
// | child1
// // comment
// | child2
const printed = path.map(typePath => {
let printedType = typePath.call(print);
if (!shouldHug) {
printedType = align$1(2, printedType);
}
return comments.printComments(typePath, () => printedType, options);
}, "types");
if (shouldHug) {
return join$9(" | ", printed);
}
const shouldAddStartLine = shouldIndent && !hasLeadingOwnLineComment$1(options.originalText, n, options);
const code = concat$d([ifBreak$6(concat$d([shouldAddStartLine ? line$9 : "", "| "])), join$9(concat$d([line$9, "| "]), printed)]);
if (needsParens_1(path, options)) {
return group$b(concat$d([indent$7(code), softline$6]));
}
if (parent.type === "TupleTypeAnnotation" && parent.types.length > 1 || parent.type === "TSTupleType" && parent.elementTypes.length > 1) {
return group$b(concat$d([indent$7(concat$d([ifBreak$6(concat$d(["(", softline$6])), code])), softline$6, ifBreak$6(")")]));
}
return group$b(shouldIndent ? indent$7(code) : code);
}
case "NullableTypeAnnotation":
return concat$d(["?", path.call(print, "typeAnnotation")]);
case "TSNullKeyword":
case "NullLiteralTypeAnnotation":
return "null";
case "ThisTypeAnnotation":
return "this";
case "NumberTypeAnnotation":
return "number";
case "SymbolTypeAnnotation":
return "symbol";
case "ObjectTypeCallProperty":
if (n.static) {
parts.push("static ");
}
parts.push(path.call(print, "value"));
return concat$d(parts);
case "ObjectTypeIndexer":
{
const variance = getFlowVariance$1(n);
return concat$d([variance || "", "[", path.call(print, "id"), n.id ? ": " : "", path.call(print, "key"), "]: ", path.call(print, "value")]);
}
case "ObjectTypeProperty":
{
const variance = getFlowVariance$1(n);
let modifier = "";
if (n.proto) {
modifier = "proto ";
} else if (n.static) {
modifier = "static ";
}
return concat$d([modifier, isGetterOrSetter$1(n) ? n.kind + " " : "", variance || "", printPropertyKey(path, options, print), printOptionalToken(path), isFunctionNotation$1(n, options) ? "" : ": ", path.call(print, "value")]);
}
case "QualifiedTypeIdentifier":
return concat$d([path.call(print, "qualification"), ".", path.call(print, "id")]);
case "StringLiteralTypeAnnotation":
return nodeStr(n, options);
case "NumberLiteralTypeAnnotation":
assert.strictEqual(typeof n.value, "number");
if (n.extra != null) {
return printNumber$2(n.extra.raw);
}
return printNumber$2(n.raw);
case "StringTypeAnnotation":
return "string";
case "DeclareTypeAlias":
case "TypeAlias":
{
if (n.type === "DeclareTypeAlias" || n.declare) {
parts.push("declare ");
}
const printed = printAssignmentRight(n.id, n.right, path.call(print, "right"), options);
parts.push("type ", path.call(print, "id"), path.call(print, "typeParameters"), " =", printed, semi);
return group$b(concat$d(parts));
}
case "TypeCastExpression":
{
return concat$d(["(", path.call(print, "expression"), printTypeAnnotation(path, options, print), ")"]);
}
case "TypeParameterDeclaration":
case "TypeParameterInstantiation":
{
const value = path.getValue();
const commentStart = value.range ? options.originalText.slice(0, value.range[0]).lastIndexOf("/*") : -1; // As noted in the TypeCastExpression comments above, we're able to use a normal whitespace regex here
// because we know for sure that this is a type definition.
const commentSyntax = commentStart >= 0 && options.originalText.slice(commentStart).match(/^\/\*\s*::/);
if (commentSyntax) {
return concat$d(["/*:: ", printTypeParameters(path, options, print, "params"), " */"]);
}
return printTypeParameters(path, options, print, "params");
}
case "TSTypeParameterDeclaration":
case "TSTypeParameterInstantiation":
return printTypeParameters(path, options, print, "params");
case "TSTypeParameter":
case "TypeParameter":
{
const parent = path.getParentNode();
if (parent.type === "TSMappedType") {
parts.push("[", path.call(print, "name"));
if (n.constraint) {
parts.push(" in ", path.call(print, "constraint"));
}
parts.push("]");
return concat$d(parts);
}
const variance = getFlowVariance$1(n);
if (variance) {
parts.push(variance);
}
parts.push(path.call(print, "name"));
if (n.bound) {
parts.push(": ");
parts.push(path.call(print, "bound"));
}
if (n.constraint) {
parts.push(" extends ", path.call(print, "constraint"));
}
if (n.default) {
parts.push(" = ", path.call(print, "default"));
} // Keep comma if the file extension is .tsx and
// has one type parameter that isn't extend with any types.
// Because, otherwise formatted result will be invalid as tsx.
const grandParent = path.getNode(2);
if (parent.params && parent.params.length === 1 && isTSXFile$1(options) && !n.constraint && grandParent.type === "ArrowFunctionExpression") {
parts.push(",");
}
return concat$d(parts);
}
case "TypeofTypeAnnotation":
return concat$d(["typeof ", path.call(print, "argument")]);
case "VoidTypeAnnotation":
return "void";
case "InferredPredicate":
return "%checks";
// Unhandled types below. If encountered, nodes of these types should
// be either left alone or desugared into AST types that are fully
// supported by the pretty-printer.
case "DeclaredPredicate":
return concat$d(["%checks(", path.call(print, "value"), ")"]);
case "TSAbstractKeyword":
return "abstract";
case "TSAnyKeyword":
return "any";
case "TSAsyncKeyword":
return "async";
case "TSBooleanKeyword":
return "boolean";
case "TSBigIntKeyword":
return "bigint";
case "TSConstKeyword":
return "const";
case "TSDeclareKeyword":
return "declare";
case "TSExportKeyword":
return "export";
case "TSNeverKeyword":
return "never";
case "TSNumberKeyword":
return "number";
case "TSObjectKeyword":
return "object";
case "TSProtectedKeyword":
return "protected";
case "TSPrivateKeyword":
return "private";
case "TSPublicKeyword":
return "public";
case "TSReadonlyKeyword":
return "readonly";
case "TSSymbolKeyword":
return "symbol";
case "TSStaticKeyword":
return "static";
case "TSStringKeyword":
return "string";
case "TSUndefinedKeyword":
return "undefined";
case "TSUnknownKeyword":
return "unknown";
case "TSVoidKeyword":
return "void";
case "TSAsExpression":
return concat$d([path.call(print, "expression"), " as ", path.call(print, "typeAnnotation")]);
case "TSArrayType":
return concat$d([path.call(print, "elementType"), "[]"]);
case "TSPropertySignature":
{
if (n.export) {
parts.push("export ");
}
if (n.accessibility) {
parts.push(n.accessibility + " ");
}
if (n.static) {
parts.push("static ");
}
if (n.readonly) {
parts.push("readonly ");
}
parts.push(printPropertyKey(path, options, print), printOptionalToken(path));
if (n.typeAnnotation) {
parts.push(": ");
parts.push(path.call(print, "typeAnnotation"));
} // This isn't valid semantically, but it's in the AST so we can print it.
if (n.initializer) {
parts.push(" = ", path.call(print, "initializer"));
}
return concat$d(parts);
}
case "TSParameterProperty":
if (n.accessibility) {
parts.push(n.accessibility + " ");
}
if (n.export) {
parts.push("export ");
}
if (n.static) {
parts.push("static ");
}
if (n.readonly) {
parts.push("readonly ");
}
parts.push(path.call(print, "parameter"));
return concat$d(parts);
case "TSTypeReference":
return concat$d([path.call(print, "typeName"), printTypeParameters(path, options, print, "typeParameters")]);
case "TSTypeQuery":
return concat$d(["typeof ", path.call(print, "exprName")]);
case "TSIndexSignature":
{
const parent = path.getParentNode(); // The typescript parser accepts multiple parameters here. If you're
// using them, it makes sense to have a trailing comma. But if you
// aren't, this is more like a computed property name than an array.
// So we leave off the trailing comma when there's just one parameter.
const trailingComma = n.parameters.length > 1 ? ifBreak$6(shouldPrintComma$1(options) ? "," : "") : "";
const parametersGroup = group$b(concat$d([indent$7(concat$d([softline$6, join$9(concat$d([", ", softline$6]), path.map(print, "parameters"))])), trailingComma, softline$6]));
return concat$d([n.export ? "export " : "", n.accessibility ? concat$d([n.accessibility, " "]) : "", n.static ? "static " : "", n.readonly ? "readonly " : "", "[", n.parameters ? parametersGroup : "", n.typeAnnotation ? "]: " : "]", n.typeAnnotation ? path.call(print, "typeAnnotation") : "", parent.type === "ClassBody" ? semi : ""]);
}
case "TSTypePredicate":
return concat$d([n.asserts ? "asserts " : "", path.call(print, "parameterName"), n.typeAnnotation ? concat$d([" is ", path.call(print, "typeAnnotation")]) : ""]);
case "TSNonNullExpression":
return concat$d([path.call(print, "expression"), "!"]);
case "TSThisType":
return "this";
case "TSImportType":
return concat$d([!n.isTypeOf ? "" : "typeof ", "import(", path.call(print, n.parameter ? "parameter" : "argument"), ")", !n.qualifier ? "" : concat$d([".", path.call(print, "qualifier")]), printTypeParameters(path, options, print, "typeParameters")]);
case "TSLiteralType":
return path.call(print, "literal");
case "TSIndexedAccessType":
return concat$d([path.call(print, "objectType"), "[", path.call(print, "indexType"), "]"]);
case "TSConstructSignatureDeclaration":
case "TSCallSignatureDeclaration":
case "TSConstructorType":
{
if (n.type !== "TSCallSignatureDeclaration") {
parts.push("new ");
}
parts.push(group$b(printFunctionParams(path, print, options,
/* expandArg */
false,
/* printTypeParams */
true)));
if (n.returnType || n.typeAnnotation) {
const isType = n.type === "TSConstructorType";
parts.push(isType ? " => " : ": ", path.call(print, "returnType"), path.call(print, "typeAnnotation"));
}
return concat$d(parts);
}
case "TSTypeOperator":
return concat$d([n.operator, " ", path.call(print, "typeAnnotation")]);
case "TSMappedType":
{
const shouldBreak = hasNewlineInRange$3(options.originalText, options.locStart(n), options.locEnd(n));
return group$b(concat$d(["{", indent$7(concat$d([options.bracketSpacing ? line$9 : softline$6, n.readonly ? concat$d([getTypeScriptMappedTypeModifier$1(n.readonly, "readonly"), " "]) : "", printTypeScriptModifiers(path, options, print), path.call(print, "typeParameter"), n.optional ? getTypeScriptMappedTypeModifier$1(n.optional, "?") : "", n.typeAnnotation ? ": " : "", path.call(print, "typeAnnotation"), ifBreak$6(semi, "")])), comments.printDanglingComments(path, options,
/* sameIndent */
true), options.bracketSpacing ? line$9 : softline$6, "}"]), {
shouldBreak
});
}
case "TSMethodSignature":
parts.push(n.accessibility ? concat$d([n.accessibility, " "]) : "", n.export ? "export " : "", n.static ? "static " : "", n.readonly ? "readonly " : "", n.computed ? "[" : "", path.call(print, "key"), n.computed ? "]" : "", printOptionalToken(path), printFunctionParams(path, print, options,
/* expandArg */
false,
/* printTypeParams */
true));
if (n.returnType || n.typeAnnotation) {
parts.push(": ", path.call(print, "returnType"), path.call(print, "typeAnnotation"));
}
return group$b(concat$d(parts));
case "TSNamespaceExportDeclaration":
parts.push("export as namespace ", path.call(print, "id"));
if (options.semi) {
parts.push(";");
}
return group$b(concat$d(parts));
case "TSEnumDeclaration":
if (n.declare) {
parts.push("declare ");
}
if (n.modifiers) {
parts.push(printTypeScriptModifiers(path, options, print));
}
if (n.const) {
parts.push("const ");
}
parts.push("enum ", path.call(print, "id"), " ");
if (n.members.length === 0) {
parts.push(group$b(concat$d(["{", comments.printDanglingComments(path, options), softline$6, "}"])));
} else {
parts.push(group$b(concat$d(["{", indent$7(concat$d([hardline$9, printArrayItems(path, options, "members", print), shouldPrintComma$1(options, "es5") ? "," : ""])), comments.printDanglingComments(path, options,
/* sameIndent */
true), hardline$9, "}"])));
}
return concat$d(parts);
case "TSEnumMember":
parts.push(path.call(print, "id"));
if (n.initializer) {
parts.push(" = ", path.call(print, "initializer"));
}
return concat$d(parts);
case "TSImportEqualsDeclaration":
if (n.isExport) {
parts.push("export ");
}
parts.push("import ", path.call(print, "id"), " = ", path.call(print, "moduleReference"));
if (options.semi) {
parts.push(";");
}
return group$b(concat$d(parts));
case "TSExternalModuleReference":
return concat$d(["require(", path.call(print, "expression"), ")"]);
case "TSModuleDeclaration":
{
const parent = path.getParentNode();
const isExternalModule = isLiteral$1(n.id);
const parentIsDeclaration = parent.type === "TSModuleDeclaration";
const bodyIsDeclaration = n.body && n.body.type === "TSModuleDeclaration";
if (parentIsDeclaration) {
parts.push(".");
} else {
if (n.declare) {
parts.push("declare ");
}
parts.push(printTypeScriptModifiers(path, options, print));
const textBetweenNodeAndItsId = options.originalText.slice(options.locStart(n), options.locStart(n.id)); // Global declaration looks like this:
// (declare)? global { ... }
const isGlobalDeclaration = n.id.type === "Identifier" && n.id.name === "global" && !/namespace|module/.test(textBetweenNodeAndItsId);
if (!isGlobalDeclaration) {
parts.push(isExternalModule || /(^|\s)module(\s|$)/.test(textBetweenNodeAndItsId) ? "module " : "namespace ");
}
}
parts.push(path.call(print, "id"));
if (bodyIsDeclaration) {
parts.push(path.call(print, "body"));
} else if (n.body) {
parts.push(" ", group$b(path.call(print, "body")));
} else {
parts.push(semi);
}
return concat$d(parts);
}
case "PrivateName":
return concat$d(["#", path.call(print, "id")]);
// TODO: Temporary auto-generated node type. To remove when typescript-estree has proper support for private fields.
case "TSPrivateIdentifier":
return n.escapedText;
case "TSConditionalType":
return printTernaryOperator(path, options, print, {
beforeParts: () => [path.call(print, "checkType"), " ", "extends", " ", path.call(print, "extendsType")],
afterParts: () => [],
shouldCheckJsx: false,
conditionalNodeType: "TSConditionalType",
consequentNodePropertyName: "trueType",
alternateNodePropertyName: "falseType",
testNodePropertyNames: ["checkType", "extendsType"]
});
case "TSInferType":
return concat$d(["infer", " ", path.call(print, "typeParameter")]);
case "InterpreterDirective":
parts.push("#!", n.value, hardline$9);
if (isNextLineEmpty$4(options.originalText, n, options.locEnd)) {
parts.push(hardline$9);
}
return concat$d(parts);
case "NGRoot":
return concat$d([].concat(path.call(print, "node"), !n.node.comments || n.node.comments.length === 0 ? [] : concat$d([" //", n.node.comments[0].value.trimEnd()])));
case "NGChainedExpression":
return group$b(join$9(concat$d([";", line$9]), path.map(childPath => hasNgSideEffect$1(childPath) ? print(childPath) : concat$d(["(", print(childPath), ")"]), "expressions")));
case "NGEmptyExpression":
return "";
case "NGQuotedExpression":
return concat$d([n.prefix, ": ", n.value.trim()]);
case "NGMicrosyntax":
return concat$d(path.map((childPath, index) => concat$d([index === 0 ? "" : isNgForOf$1(childPath.getValue(), index, n) ? " " : concat$d([";", line$9]), print(childPath)]), "body"));
case "NGMicrosyntaxKey":
return /^[a-z_$][a-z0-9_$]*(-[a-z_$][a-z0-9_$])*$/i.test(n.name) ? n.name : JSON.stringify(n.name);
case "NGMicrosyntaxExpression":
return concat$d([path.call(print, "expression"), n.alias === null ? "" : concat$d([" as ", path.call(print, "alias")])]);
case "NGMicrosyntaxKeyedExpression":
{
const index = path.getName();
const parentNode = path.getParentNode();
const shouldNotPrintColon = isNgForOf$1(n, index, parentNode) || (index === 1 && (n.key.name === "then" || n.key.name === "else") || index === 2 && n.key.name === "else" && parentNode.body[index - 1].type === "NGMicrosyntaxKeyedExpression" && parentNode.body[index - 1].key.name === "then") && parentNode.body[0].type === "NGMicrosyntaxExpression";
return concat$d([path.call(print, "key"), shouldNotPrintColon ? " " : ": ", path.call(print, "expression")]);
}
case "NGMicrosyntaxLet":
return concat$d(["let ", path.call(print, "key"), n.value === null ? "" : concat$d([" = ", path.call(print, "value")])]);
case "NGMicrosyntaxAs":
return concat$d([path.call(print, "key"), " as ", path.call(print, "alias")]);
case "ArgumentPlaceholder":
return "?";
// These are not valid TypeScript. Printing them just for the sake of error recovery.
case "TSJSDocAllType":
return "*";
case "TSJSDocUnknownType":
return "?";
case "TSJSDocNullableType":
return concat$d(["?", path.call(print, "typeAnnotation")]);
case "TSJSDocNonNullableType":
return concat$d(["!", path.call(print, "typeAnnotation")]);
case "TSJSDocFunctionType":
return concat$d(["function(", // The parameters could be here, but typescript-estree doesn't convert them anyway (throws an error).
"): ", path.call(print, "typeAnnotation")]);
default:
/* istanbul ignore next */
throw new Error("unknown type: " + JSON.stringify(n.type));
}
}
function printStatementSequence(path, options, print) {
const printed = [];
const bodyNode = path.getNode();
const isClass = bodyNode.type === "ClassBody";
path.map((stmtPath, i) => {
const stmt = stmtPath.getValue(); // Just in case the AST has been modified to contain falsy
// "statements," it's safer simply to skip them.
/* istanbul ignore if */
if (!stmt) {
return;
} // Skip printing EmptyStatement nodes to avoid leaving stray
// semicolons lying around.
if (stmt.type === "EmptyStatement") {
return;
}
const stmtPrinted = print(stmtPath);
const text = options.originalText;
const parts = []; // in no-semi mode, prepend statement with semicolon if it might break ASI
// don't prepend the only JSX element in a program with semicolon
if (!options.semi && !isClass && !isTheOnlyJSXElementInMarkdown$1(options, stmtPath) && stmtNeedsASIProtection(stmtPath, options)) {
if (stmt.comments && stmt.comments.some(comment => comment.leading)) {
parts.push(print(stmtPath, {
needsSemi: true
}));
} else {
parts.push(";", stmtPrinted);
}
} else {
parts.push(stmtPrinted);
}
if (!options.semi && isClass) {
if (classPropMayCauseASIProblems$1(stmtPath)) {
parts.push(";");
} else if (stmt.type === "ClassProperty") {
const nextChild = bodyNode.body[i + 1];
if (classChildNeedsASIProtection$1(nextChild)) {
parts.push(";");
}
}
}
if (isNextLineEmpty$4(text, stmt, options.locEnd) && !isLastStatement$1(stmtPath)) {
parts.push(hardline$9);
}
printed.push(concat$d(parts));
});
return join$9(hardline$9, printed);
}
function printPropertyKey(path, options, print) {
const node = path.getNode();
if (node.computed) {
return concat$d(["[", path.call(print, "key"), "]"]);
}
const parent = path.getParentNode();
const {
key
} = node;
if (node.type === "ClassPrivateProperty" && // flow has `Identifier` key, and babel has `PrivateName` key
key.type === "Identifier") {
return concat$d(["#", path.call(print, "key")]);
}
if (options.quoteProps === "consistent" && !needsQuoteProps.has(parent)) {
const objectHasStringProp = (parent.properties || parent.body || parent.members).some(prop => !prop.computed && prop.key && isStringLiteral$1(prop.key) && !isStringPropSafeToCoerceToIdentifier$1(prop, options));
needsQuoteProps.set(parent, objectHasStringProp);
}
if (key.type === "Identifier" && (options.parser === "json" || options.quoteProps === "consistent" && needsQuoteProps.get(parent))) {
// a -> "a"
const prop = printString$2(JSON.stringify(key.name), options);
return path.call(keyPath => comments.printComments(keyPath, () => prop, options), "key");
}
if (isStringPropSafeToCoerceToIdentifier$1(node, options) && (options.quoteProps === "as-needed" || options.quoteProps === "consistent" && !needsQuoteProps.get(parent))) {
// 'a' -> a
return path.call(keyPath => comments.printComments(keyPath, () => key.value, options), "key");
}
return path.call(print, "key");
}
function printMethod(path, options, print) {
const node = path.getNode();
const {
kind
} = node;
const value = node.value || node;
const parts = [];
if (!kind || kind === "init" || kind === "method" || kind === "constructor") {
if (value.async) {
parts.push("async ");
}
if (value.generator) {
parts.push("*");
}
} else {
assert.ok(kind === "get" || kind === "set");
parts.push(kind, " ");
}
parts.push(printPropertyKey(path, options, print), node.optional || node.key.optional ? "?" : "", node === value ? printMethodInternal(path, options, print) : path.call(path => printMethodInternal(path, options, print), "value"));
return concat$d(parts);
}
function printMethodInternal(path, options, print) {
const parts = [printFunctionTypeParameters(path, options, print), group$b(concat$d([printFunctionParams(path, print, options), printReturnType(path, print, options)]))];
if (path.getNode().body) {
parts.push(" ", path.call(print, "body"));
} else {
parts.push(options.semi ? ";" : "");
}
return concat$d(parts);
}
function couldGroupArg(arg) {
return arg.type === "ObjectExpression" && (arg.properties.length > 0 || arg.comments) || arg.type === "ArrayExpression" && (arg.elements.length > 0 || arg.comments) || arg.type === "TSTypeAssertion" && couldGroupArg(arg.expression) || arg.type === "TSAsExpression" && couldGroupArg(arg.expression) || arg.type === "FunctionExpression" || arg.type === "ArrowFunctionExpression" && ( // we want to avoid breaking inside composite return types but not simple keywords
// https://github.com/prettier/prettier/issues/4070
// export class Thing implements OtherThing {
// do: (type: Type) => Provider
= memoize(
// (type: ObjectType): Provider => {}
// );
// }
// https://github.com/prettier/prettier/issues/6099
// app.get("/", (req, res): void => {
// res.send("Hello World!");
// });
!arg.returnType || !arg.returnType.typeAnnotation || arg.returnType.typeAnnotation.type !== "TSTypeReference") && (arg.body.type === "BlockStatement" || arg.body.type === "ArrowFunctionExpression" || arg.body.type === "ObjectExpression" || arg.body.type === "ArrayExpression" || arg.body.type === "CallExpression" || arg.body.type === "OptionalCallExpression" || arg.body.type === "ConditionalExpression" || isJSXNode$1(arg.body));
}
function shouldGroupLastArg(args) {
const lastArg = getLast$3(args);
const penultimateArg = getPenultimate$1(args);
return !hasLeadingComment$3(lastArg) && !hasTrailingComment$1(lastArg) && couldGroupArg(lastArg) && ( // If the last two arguments are of the same type,
// disable last element expansion.
!penultimateArg || penultimateArg.type !== lastArg.type);
}
function shouldGroupFirstArg(args) {
if (args.length !== 2) {
return false;
}
const [firstArg, secondArg] = args;
return (!firstArg.comments || !firstArg.comments.length) && (firstArg.type === "FunctionExpression" || firstArg.type === "ArrowFunctionExpression" && firstArg.body.type === "BlockStatement") && secondArg.type !== "FunctionExpression" && secondArg.type !== "ArrowFunctionExpression" && secondArg.type !== "ConditionalExpression" && !couldGroupArg(secondArg);
}
function printJestEachTemplateLiteral(node, expressions, options) {
/**
* a | b | expected
* ${1} | ${1} | ${2}
* ${1} | ${2} | ${3}
* ${2} | ${1} | ${3}
*/
const headerNames = node.quasis[0].value.raw.trim().split(/\s*\|\s*/);
if (headerNames.length > 1 || headerNames.some(headerName => headerName.length !== 0)) {
const parts = [];
const stringifiedExpressions = expressions.map(doc => "${" + printDocToString$2(doc, Object.assign({}, options, {
printWidth: Infinity,
endOfLine: "lf"
})).formatted + "}");
const tableBody = [{
hasLineBreak: false,
cells: []
}];
for (let i = 1; i < node.quasis.length; i++) {
const row = tableBody[tableBody.length - 1];
const correspondingExpression = stringifiedExpressions[i - 1];
row.cells.push(correspondingExpression);
if (correspondingExpression.includes("\n")) {
row.hasLineBreak = true;
}
if (node.quasis[i].value.raw.includes("\n")) {
tableBody.push({
hasLineBreak: false,
cells: []
});
}
}
const maxColumnCount = Math.max(headerNames.length, ...tableBody.map(row => row.cells.length));
const maxColumnWidths = Array.from({
length: maxColumnCount
}).fill(0);
const table = [{
cells: headerNames
}, ...tableBody.filter(row => row.cells.length !== 0)];
for (const {
cells
} of table.filter(row => !row.hasLineBreak)) {
cells.forEach((cell, index) => {
maxColumnWidths[index] = Math.max(maxColumnWidths[index], getStringWidth$3(cell));
});
}
parts.push(lineSuffixBoundary$1, "`", indent$7(concat$d([hardline$9, join$9(hardline$9, table.map(row => join$9(" | ", row.cells.map((cell, index) => row.hasLineBreak ? cell : cell + " ".repeat(maxColumnWidths[index] - getStringWidth$3(cell))))))])), hardline$9, "`");
return concat$d(parts);
}
}
function printArgumentsList(path, options, print) {
const node = path.getValue();
const args = node.arguments;
if (args.length === 0) {
return concat$d(["(", comments.printDanglingComments(path, options,
/* sameIndent */
true), ")"]);
} // useEffect(() => { ... }, [foo, bar, baz])
if (args.length === 2 && args[0].type === "ArrowFunctionExpression" && args[0].params.length === 0 && args[0].body.type === "BlockStatement" && args[1].type === "ArrayExpression" && !args.find(arg => arg.comments)) {
return concat$d(["(", path.call(print, "arguments", 0), ", ", path.call(print, "arguments", 1), ")"]);
} // func(
// ({
// a,
// b
// }) => {}
// );
function shouldBreakForArrowFunctionInArguments(arg, argPath) {
if (!arg || arg.type !== "ArrowFunctionExpression" || !arg.body || arg.body.type !== "BlockStatement" || !arg.params || arg.params.length < 1) {
return false;
}
let shouldBreak = false;
argPath.each(paramPath => {
const printed = concat$d([print(paramPath)]);
shouldBreak = shouldBreak || willBreak$1(printed);
}, "params");
return shouldBreak;
}
let anyArgEmptyLine = false;
let shouldBreakForArrowFunction = false;
let hasEmptyLineFollowingFirstArg = false;
const lastArgIndex = args.length - 1;
const printedArguments = path.map((argPath, index) => {
const arg = argPath.getNode();
const parts = [print(argPath)];
if (index === lastArgIndex) ; else if (isNextLineEmpty$4(options.originalText, arg, options.locEnd)) {
if (index === 0) {
hasEmptyLineFollowingFirstArg = true;
}
anyArgEmptyLine = true;
parts.push(",", hardline$9, hardline$9);
} else {
parts.push(",", line$9);
}
shouldBreakForArrowFunction = shouldBreakForArrowFunctionInArguments(arg, argPath);
return concat$d(parts);
}, "arguments");
const maybeTrailingComma = // Dynamic imports cannot have trailing commas
!(node.callee && node.callee.type === "Import") && shouldPrintComma$1(options, "all") ? "," : "";
function allArgsBrokenOut() {
return group$b(concat$d(["(", indent$7(concat$d([line$9, concat$d(printedArguments)])), maybeTrailingComma, line$9, ")"]), {
shouldBreak: true
});
}
if (path.getParentNode().type !== "Decorator" && isFunctionCompositionArgs$1(args)) {
return allArgsBrokenOut();
}
const shouldGroupFirst = shouldGroupFirstArg(args);
const shouldGroupLast = shouldGroupLastArg(args);
if (shouldGroupFirst || shouldGroupLast) {
const shouldBreak = (shouldGroupFirst ? printedArguments.slice(1).some(willBreak$1) : printedArguments.slice(0, -1).some(willBreak$1)) || anyArgEmptyLine || shouldBreakForArrowFunction; // We want to print the last argument with a special flag
let printedExpanded;
let i = 0;
path.each(argPath => {
if (shouldGroupFirst && i === 0) {
printedExpanded = [concat$d([argPath.call(p => print(p, {
expandFirstArg: true
})), printedArguments.length > 1 ? "," : "", hasEmptyLineFollowingFirstArg ? hardline$9 : line$9, hasEmptyLineFollowingFirstArg ? hardline$9 : ""])].concat(printedArguments.slice(1));
}
if (shouldGroupLast && i === args.length - 1) {
printedExpanded = printedArguments.slice(0, -1).concat(argPath.call(p => print(p, {
expandLastArg: true
})));
}
i++;
}, "arguments");
const somePrintedArgumentsWillBreak = printedArguments.some(willBreak$1);
const simpleConcat = concat$d(["(", concat$d(printedExpanded), ")"]);
return concat$d([somePrintedArgumentsWillBreak ? breakParent$3 : "", conditionalGroup$1([!somePrintedArgumentsWillBreak && !node.typeArguments && !node.typeParameters ? simpleConcat : ifBreak$6(allArgsBrokenOut(), simpleConcat), shouldGroupFirst ? concat$d(["(", group$b(printedExpanded[0], {
shouldBreak: true
}), concat$d(printedExpanded.slice(1)), ")"]) : concat$d(["(", concat$d(printedArguments.slice(0, -1)), group$b(getLast$3(printedExpanded), {
shouldBreak: true
}), ")"]), allArgsBrokenOut()], {
shouldBreak
})]);
}
const contents = concat$d(["(", indent$7(concat$d([softline$6, concat$d(printedArguments)])), ifBreak$6(maybeTrailingComma), softline$6, ")"]);
if (isLongCurriedCallExpression$1(path)) {
// By not wrapping the arguments in a group, the printer prioritizes
// breaking up these arguments rather than the args of the parent call.
return contents;
}
return group$b(contents, {
shouldBreak: printedArguments.some(willBreak$1) || anyArgEmptyLine
});
}
function printTypeAnnotation(path, options, print) {
const node = path.getValue();
if (!node.typeAnnotation) {
return "";
}
const parentNode = path.getParentNode();
const isDefinite = node.definite || parentNode && parentNode.type === "VariableDeclarator" && parentNode.definite;
const isFunctionDeclarationIdentifier = parentNode.type === "DeclareFunction" && parentNode.id === node;
if (isFlowAnnotationComment$1(options.originalText, node.typeAnnotation, options)) {
return concat$d([" /*: ", path.call(print, "typeAnnotation"), " */"]);
}
return concat$d([isFunctionDeclarationIdentifier ? "" : isDefinite ? "!: " : ": ", path.call(print, "typeAnnotation")]);
}
function printFunctionTypeParameters(path, options, print) {
const fun = path.getValue();
if (fun.typeArguments) {
return path.call(print, "typeArguments");
}
if (fun.typeParameters) {
return path.call(print, "typeParameters");
}
return "";
}
function printFunctionParams(path, print, options, expandArg, printTypeParams) {
const fun = path.getValue();
const parent = path.getParentNode();
const paramsField = fun.parameters ? "parameters" : "params";
const isParametersInTestCall = isTestCall$1(parent);
const shouldHugParameters = shouldHugArguments(fun);
const shouldExpandParameters = expandArg && !(fun[paramsField] && fun[paramsField].some(n => n.comments));
const typeParams = printTypeParams ? printFunctionTypeParameters(path, options, print) : "";
let printed = [];
if (fun[paramsField]) {
const lastArgIndex = fun[paramsField].length - 1;
printed = path.map((childPath, index) => {
const parts = [];
const param = childPath.getValue();
parts.push(print(childPath));
if (index === lastArgIndex) {
if (fun.rest) {
parts.push(",", line$9);
}
} else if (isParametersInTestCall || shouldHugParameters || shouldExpandParameters) {
parts.push(", ");
} else if (isNextLineEmpty$4(options.originalText, param, options.locEnd)) {
parts.push(",", hardline$9, hardline$9);
} else {
parts.push(",", line$9);
}
return concat$d(parts);
}, paramsField);
}
if (fun.rest) {
printed.push(concat$d(["...", path.call(print, "rest")]));
}
if (printed.length === 0) {
return concat$d([typeParams, "(", comments.printDanglingComments(path, options,
/* sameIndent */
true, comment => getNextNonSpaceNonCommentCharacter$1(options.originalText, comment, options.locEnd) === ")"), ")"]);
}
const lastParam = getLast$3(fun[paramsField]); // If the parent is a call with the first/last argument expansion and this is the
// params of the first/last argument, we don't want the arguments to break and instead
// want the whole expression to be on a new line.
//
// Good: Bad:
// verylongcall( verylongcall((
// (a, b) => { a,
// } b,
// }) ) => {
// })
if (shouldExpandParameters) {
return group$b(concat$d([removeLines$2(typeParams), "(", concat$d(printed.map(removeLines$2)), ")"]));
} // Single object destructuring should hug
//
// function({
// a,
// b,
// c
// }) {}
const hasNotParameterDecorator = fun[paramsField].every(param => !param.decorators);
if (shouldHugParameters && hasNotParameterDecorator) {
return concat$d([typeParams, "(", concat$d(printed), ")"]);
} // don't break in specs, eg; `it("should maintain parens around done even when long", (done) => {})`
if (isParametersInTestCall) {
return concat$d([typeParams, "(", concat$d(printed), ")"]);
}
const isFlowShorthandWithOneArg = (isObjectTypePropertyAFunction$1(parent, options) || isTypeAnnotationAFunction$1(parent, options) || parent.type === "TypeAlias" || parent.type === "UnionTypeAnnotation" || parent.type === "TSUnionType" || parent.type === "IntersectionTypeAnnotation" || parent.type === "FunctionTypeAnnotation" && parent.returnType === fun) && fun[paramsField].length === 1 && fun[paramsField][0].name === null && fun[paramsField][0].typeAnnotation && fun.typeParameters === null && isSimpleFlowType$1(fun[paramsField][0].typeAnnotation) && !fun.rest;
if (isFlowShorthandWithOneArg) {
if (options.arrowParens === "always") {
return concat$d(["(", concat$d(printed), ")"]);
}
return concat$d(printed);
}
const canHaveTrailingComma = !(lastParam && lastParam.type === "RestElement") && !fun.rest;
return concat$d([typeParams, "(", indent$7(concat$d([softline$6, concat$d(printed)])), ifBreak$6(canHaveTrailingComma && shouldPrintComma$1(options, "all") ? "," : ""), softline$6, ")"]);
}
function shouldPrintParamsWithoutParens(path, options) {
if (options.arrowParens === "always") {
return false;
}
if (options.arrowParens === "avoid") {
const node = path.getValue();
return canPrintParamsWithoutParens(node);
} // Fallback default; should be unreachable
return false;
}
function canPrintParamsWithoutParens(node) {
return node.params.length === 1 && !node.rest && !node.typeParameters && !hasDanglingComments$1(node) && node.params[0].type === "Identifier" && !node.params[0].typeAnnotation && !node.params[0].comments && !node.params[0].optional && !node.predicate && !node.returnType;
}
function printFunctionDeclaration(path, print, options) {
const n = path.getValue();
const parts = [];
if (n.async) {
parts.push("async ");
}
if (n.generator) {
parts.push("function* ");
} else {
parts.push("function ");
}
if (n.id) {
parts.push(path.call(print, "id"));
}
parts.push(printFunctionTypeParameters(path, options, print), group$b(concat$d([printFunctionParams(path, print, options), printReturnType(path, print, options)])), n.body ? " " : "", path.call(print, "body"));
return concat$d(parts);
}
function printReturnType(path, print, options) {
const n = path.getValue();
const returnType = path.call(print, "returnType");
if (n.returnType && isFlowAnnotationComment$1(options.originalText, n.returnType, options)) {
return concat$d([" /*: ", returnType, " */"]);
}
const parts = [returnType]; // prepend colon to TypeScript type annotation
if (n.returnType && n.returnType.typeAnnotation) {
parts.unshift(": ");
}
if (n.predicate) {
// The return type will already add the colon, but otherwise we
// need to do it ourselves
parts.push(n.returnType ? " " : ": ", path.call(print, "predicate"));
}
return concat$d(parts);
}
function printExportDeclaration(path, options, print) {
const decl = path.getValue();
const semi = options.semi ? ";" : "";
const parts = ["export "];
const isDefault = decl.default || decl.type === "ExportDefaultDeclaration";
if (isDefault) {
parts.push("default ");
}
parts.push(comments.printDanglingComments(path, options,
/* sameIndent */
true));
if (needsHardlineAfterDanglingComment$1(decl)) {
parts.push(hardline$9);
}
if (decl.declaration) {
parts.push(path.call(print, "declaration"));
if (isDefault && decl.declaration.type !== "ClassDeclaration" && decl.declaration.type !== "FunctionDeclaration" && decl.declaration.type !== "TSInterfaceDeclaration" && decl.declaration.type !== "DeclareClass" && decl.declaration.type !== "DeclareFunction" && decl.declaration.type !== "TSDeclareFunction") {
parts.push(semi);
}
} else {
if (decl.specifiers && decl.specifiers.length > 0) {
const specifiers = [];
const defaultSpecifiers = [];
const namespaceSpecifiers = [];
path.each(specifierPath => {
const specifierType = path.getValue().type;
if (specifierType === "ExportSpecifier") {
specifiers.push(print(specifierPath));
} else if (specifierType === "ExportDefaultSpecifier") {
defaultSpecifiers.push(print(specifierPath));
} else if (specifierType === "ExportNamespaceSpecifier") {
namespaceSpecifiers.push(concat$d(["* as ", print(specifierPath)]));
}
}, "specifiers");
const isNamespaceFollowed = namespaceSpecifiers.length !== 0 && specifiers.length !== 0;
const isDefaultFollowed = defaultSpecifiers.length !== 0 && (namespaceSpecifiers.length !== 0 || specifiers.length !== 0);
const canBreak = specifiers.length > 1 || defaultSpecifiers.length > 0 || decl.specifiers && decl.specifiers.some(node => node.comments);
let printed = "";
if (specifiers.length !== 0) {
if (canBreak) {
printed = group$b(concat$d(["{", indent$7(concat$d([options.bracketSpacing ? line$9 : softline$6, join$9(concat$d([",", line$9]), specifiers)])), ifBreak$6(shouldPrintComma$1(options) ? "," : ""), options.bracketSpacing ? line$9 : softline$6, "}"]));
} else {
printed = concat$d(["{", options.bracketSpacing ? " " : "", concat$d(specifiers), options.bracketSpacing ? " " : "", "}"]);
}
}
parts.push(decl.exportKind === "type" ? "type " : "", concat$d(defaultSpecifiers), concat$d([isDefaultFollowed ? ", " : ""]), concat$d(namespaceSpecifiers), concat$d([isNamespaceFollowed ? ", " : ""]), printed);
} else {
parts.push("{}");
}
if (decl.source) {
parts.push(" from ", path.call(print, "source"));
}
parts.push(semi);
}
return concat$d(parts);
}
function printFlowDeclaration(path, parts) {
const parentExportDecl = getParentExportDeclaration$1(path);
if (parentExportDecl) {
assert.strictEqual(parentExportDecl.type, "DeclareExportDeclaration");
} else {
// If the parent node has type DeclareExportDeclaration, then it
// will be responsible for printing the "declare" token. Otherwise
// it needs to be printed with this non-exported declaration node.
parts.unshift("declare ");
}
return concat$d(parts);
}
function printTypeScriptModifiers(path, options, print) {
const n = path.getValue();
if (!n.modifiers || !n.modifiers.length) {
return "";
}
return concat$d([join$9(" ", path.map(print, "modifiers")), " "]);
}
function printTypeParameters(path, options, print, paramsKey) {
const n = path.getValue();
if (!n[paramsKey]) {
return "";
} // for TypeParameterDeclaration typeParameters is a single node
if (!Array.isArray(n[paramsKey])) {
return path.call(print, paramsKey);
}
const grandparent = path.getNode(2);
const greatGrandParent = path.getNode(3);
const greatGreatGrandParent = path.getNode(4);
const isParameterInTestCall = grandparent != null && isTestCall$1(grandparent);
const shouldInline = isParameterInTestCall || n[paramsKey].length === 0 || n[paramsKey].length === 1 && (shouldHugType(n[paramsKey][0]) || n[paramsKey][0].type === "GenericTypeAnnotation" && shouldHugType(n[paramsKey][0].id) || n[paramsKey][0].type === "TSTypeReference" && shouldHugType(n[paramsKey][0].typeName) || n[paramsKey][0].type === "NullableTypeAnnotation" || // See https://github.com/prettier/prettier/pull/6467 for the context.
greatGreatGrandParent && greatGreatGrandParent.type === "VariableDeclarator" && grandparent.type === "TSTypeAnnotation" && greatGrandParent.type !== "ArrowFunctionExpression" && n[paramsKey][0].type !== "TSUnionType" && n[paramsKey][0].type !== "UnionTypeAnnotation" && n[paramsKey][0].type !== "TSIntersectionType" && n[paramsKey][0].type !== "IntersectionTypeAnnotation" && n[paramsKey][0].type !== "TSConditionalType" && n[paramsKey][0].type !== "TSMappedType" && n[paramsKey][0].type !== "TSTypeOperator" && n[paramsKey][0].type !== "TSIndexedAccessType" && n[paramsKey][0].type !== "TSArrayType");
function printDanglingCommentsForInline(n) {
if (!hasDanglingComments$1(n)) {
return "";
}
const hasOnlyBlockComments = n.comments.every(comments$1.isBlockComment);
const printed = comments.printDanglingComments(path, options,
/* sameIndent */
hasOnlyBlockComments);
if (hasOnlyBlockComments) {
return printed;
}
return concat$d([printed, hardline$9]);
}
if (shouldInline) {
return concat$d(["<", join$9(", ", path.map(print, paramsKey)), printDanglingCommentsForInline(n), ">"]);
}
return group$b(concat$d(["<", indent$7(concat$d([softline$6, join$9(concat$d([",", line$9]), path.map(print, paramsKey))])), ifBreak$6(options.parser !== "typescript" && options.parser !== "babel-ts" && shouldPrintComma$1(options, "all") ? "," : ""), softline$6, ">"]));
}
function printClass(path, options, print) {
const n = path.getValue();
const parts = [];
if (n.abstract) {
parts.push("abstract ");
}
parts.push("class");
if (n.id) {
parts.push(" ", path.call(print, "id"));
}
parts.push(path.call(print, "typeParameters"));
const partsGroup = [];
if (n.superClass) {
const printed = concat$d(["extends ", path.call(print, "superClass"), path.call(print, "superTypeParameters")]); // Keep old behaviour of extends in same line
// If there is only on extends and there are not comments
if ((!n.implements || n.implements.length === 0) && (!n.superClass.comments || n.superClass.comments.length === 0)) {
parts.push(concat$d([" ", path.call(superClass => comments.printComments(superClass, () => printed, options), "superClass")]));
} else {
partsGroup.push(group$b(concat$d([line$9, path.call(superClass => comments.printComments(superClass, () => printed, options), "superClass")])));
}
} else if (n.extends && n.extends.length > 0) {
parts.push(" extends ", join$9(", ", path.map(print, "extends")));
}
if (n.mixins && n.mixins.length > 0) {
partsGroup.push(line$9, "mixins ", group$b(indent$7(join$9(concat$d([",", line$9]), path.map(print, "mixins")))));
}
if (n.implements && n.implements.length > 0) {
partsGroup.push(line$9, "implements", group$b(indent$7(concat$d([line$9, join$9(concat$d([",", line$9]), path.map(print, "implements"))]))));
}
if (partsGroup.length > 0) {
parts.push(group$b(indent$7(concat$d(partsGroup))));
}
if (n.body && n.body.comments && hasLeadingOwnLineComment$1(options.originalText, n.body, options)) {
parts.push(hardline$9);
} else {
parts.push(" ");
}
parts.push(path.call(print, "body"));
return parts;
}
function printOptionalToken(path) {
const node = path.getValue();
if (!node.optional || // It's an optional computed method parsed by typescript-estree.
// "?" is printed in `printMethod`.
node.type === "Identifier" && node === path.getParentNode().key) {
return "";
}
if (node.type === "OptionalCallExpression" || node.type === "OptionalMemberExpression" && node.computed) {
return "?.";
}
return "?";
}
function printMemberLookup(path, options, print) {
const property = path.call(print, "property");
const n = path.getValue();
const optional = printOptionalToken(path);
if (!n.computed) {
return concat$d([optional, ".", property]);
}
if (!n.property || isNumericLiteral$1(n.property)) {
return concat$d([optional, "[", property, "]"]);
}
return group$b(concat$d([optional, "[", indent$7(concat$d([softline$6, property])), softline$6, "]"]));
}
function printBindExpressionCallee(path, options, print) {
return concat$d(["::", path.call(print, "callee")]);
} // We detect calls on member expressions specially to format a
// common pattern better. The pattern we are looking for is this:
//
// arr
// .map(x => x + 1)
// .filter(x => x > 10)
// .some(x => x % 2)
//
// The way it is structured in the AST is via a nested sequence of
// MemberExpression and CallExpression. We need to traverse the AST
// and make groups out of it to print it in the desired way.
function printMemberChain(path, options, print) {
// The first phase is to linearize the AST by traversing it down.
//
// a().b()
// has the following AST structure:
// CallExpression(MemberExpression(CallExpression(Identifier)))
// and we transform it into
// [Identifier, CallExpression, MemberExpression, CallExpression]
const printedNodes = []; // Here we try to retain one typed empty line after each call expression or
// the first group whether it is in parentheses or not
function shouldInsertEmptyLineAfter(node) {
const {
originalText
} = options;
const nextCharIndex = getNextNonSpaceNonCommentCharacterIndex$3(originalText, node, options.locEnd);
const nextChar = originalText.charAt(nextCharIndex); // if it is cut off by a parenthesis, we only account for one typed empty
// line after that parenthesis
if (nextChar === ")") {
return isNextLineEmptyAfterIndex$2(originalText, nextCharIndex + 1, options.locEnd);
}
return isNextLineEmpty$4(originalText, node, options.locEnd);
}
function rec(path) {
const node = path.getValue();
if ((node.type === "CallExpression" || node.type === "OptionalCallExpression") && (isMemberish$1(node.callee) || node.callee.type === "CallExpression" || node.callee.type === "OptionalCallExpression")) {
printedNodes.unshift({
node,
printed: concat$d([comments.printComments(path, () => concat$d([printOptionalToken(path), printFunctionTypeParameters(path, options, print), printArgumentsList(path, options, print)]), options), shouldInsertEmptyLineAfter(node) ? hardline$9 : ""])
});
path.call(callee => rec(callee), "callee");
} else if (isMemberish$1(node)) {
printedNodes.unshift({
node,
needsParens: needsParens_1(path, options),
printed: comments.printComments(path, () => node.type === "OptionalMemberExpression" || node.type === "MemberExpression" ? printMemberLookup(path, options, print) : printBindExpressionCallee(path, options, print), options)
});
path.call(object => rec(object), "object");
} else if (node.type === "TSNonNullExpression") {
printedNodes.unshift({
node,
printed: comments.printComments(path, () => "!", options)
});
path.call(expression => rec(expression), "expression");
} else {
printedNodes.unshift({
node,
printed: path.call(print)
});
}
} // Note: the comments of the root node have already been printed, so we
// need to extract this first call without printing them as they would
// if handled inside of the recursive call.
const node = path.getValue();
printedNodes.unshift({
node,
printed: concat$d([printOptionalToken(path), printFunctionTypeParameters(path, options, print), printArgumentsList(path, options, print)])
});
path.call(callee => rec(callee), "callee"); // Once we have a linear list of printed nodes, we want to create groups out
// of it.
//
// a().b.c().d().e
// will be grouped as
// [
// [Identifier, CallExpression],
// [MemberExpression, MemberExpression, CallExpression],
// [MemberExpression, CallExpression],
// [MemberExpression],
// ]
// so that we can print it as
// a()
// .b.c()
// .d()
// .e
// The first group is the first node followed by
// - as many CallExpression as possible
// < fn()()() >.something()
// - as many array accessors as possible
// < fn()[0][1][2] >.something()
// - then, as many MemberExpression as possible but the last one
// < this.items >.something()
const groups = [];
let currentGroup = [printedNodes[0]];
let i = 1;
for (; i < printedNodes.length; ++i) {
if (printedNodes[i].node.type === "TSNonNullExpression" || printedNodes[i].node.type === "OptionalCallExpression" || printedNodes[i].node.type === "CallExpression" || (printedNodes[i].node.type === "MemberExpression" || printedNodes[i].node.type === "OptionalMemberExpression") && printedNodes[i].node.computed && isNumericLiteral$1(printedNodes[i].node.property)) {
currentGroup.push(printedNodes[i]);
} else {
break;
}
}
if (printedNodes[0].node.type !== "CallExpression" && printedNodes[0].node.type !== "OptionalCallExpression") {
for (; i + 1 < printedNodes.length; ++i) {
if (isMemberish$1(printedNodes[i].node) && isMemberish$1(printedNodes[i + 1].node)) {
currentGroup.push(printedNodes[i]);
} else {
break;
}
}
}
groups.push(currentGroup);
currentGroup = []; // Then, each following group is a sequence of MemberExpression followed by
// a sequence of CallExpression. To compute it, we keep adding things to the
// group until we has seen a CallExpression in the past and reach a
// MemberExpression
let hasSeenCallExpression = false;
for (; i < printedNodes.length; ++i) {
if (hasSeenCallExpression && isMemberish$1(printedNodes[i].node)) {
// [0] should be appended at the end of the group instead of the
// beginning of the next one
if (printedNodes[i].node.computed && isNumericLiteral$1(printedNodes[i].node.property)) {
currentGroup.push(printedNodes[i]);
continue;
}
groups.push(currentGroup);
currentGroup = [];
hasSeenCallExpression = false;
}
if (printedNodes[i].node.type === "CallExpression" || printedNodes[i].node.type === "OptionalCallExpression") {
hasSeenCallExpression = true;
}
currentGroup.push(printedNodes[i]);
if (printedNodes[i].node.comments && printedNodes[i].node.comments.some(comment => comment.trailing)) {
groups.push(currentGroup);
currentGroup = [];
hasSeenCallExpression = false;
}
}
if (currentGroup.length > 0) {
groups.push(currentGroup);
} // There are cases like Object.keys(), Observable.of(), _.values() where
// they are the subject of all the chained calls and therefore should
// be kept on the same line:
//
// Object.keys(items)
// .filter(x => x)
// .map(x => x)
//
// In order to detect those cases, we use an heuristic: if the first
// node is an identifier with the name starting with a capital
// letter or just a sequence of _$. The rationale is that they are
// likely to be factories.
function isFactory(name) {
return /^[A-Z]|^[_$]+$/.test(name);
} // In case the Identifier is shorter than tab width, we can keep the
// first call in a single line, if it's an ExpressionStatement.
//
// d3.scaleLinear()
// .domain([0, 100])
// .range([0, width]);
//
function isShort(name) {
return name.length <= options.tabWidth;
}
function shouldNotWrap(groups) {
const parent = path.getParentNode();
const isExpression = parent && parent.type === "ExpressionStatement";
const hasComputed = groups[1].length && groups[1][0].node.computed;
if (groups[0].length === 1) {
const firstNode = groups[0][0].node;
return firstNode.type === "ThisExpression" || firstNode.type === "Identifier" && (isFactory(firstNode.name) || isExpression && isShort(firstNode.name) || hasComputed);
}
const lastNode = getLast$3(groups[0]).node;
return (lastNode.type === "MemberExpression" || lastNode.type === "OptionalMemberExpression") && lastNode.property.type === "Identifier" && (isFactory(lastNode.property.name) || hasComputed);
}
const shouldMerge = groups.length >= 2 && !groups[1][0].node.comments && shouldNotWrap(groups);
function printGroup(printedGroup) {
const printed = printedGroup.map(tuple => tuple.printed); // Checks if the last node (i.e. the parent node) needs parens and print
// accordingly
if (printedGroup.length > 0 && printedGroup[printedGroup.length - 1].needsParens) {
return concat$d(["(", ...printed, ")"]);
}
return concat$d(printed);
}
function printIndentedGroup(groups) {
if (groups.length === 0) {
return "";
}
return indent$7(group$b(concat$d([hardline$9, join$9(hardline$9, groups.map(printGroup))])));
}
const printedGroups = groups.map(printGroup);
const oneLine = concat$d(printedGroups);
const cutoff = shouldMerge ? 3 : 2;
const flatGroups = groups.reduce((res, group) => res.concat(group), []);
const hasComment = flatGroups.slice(1, -1).some(node => hasLeadingComment$3(node.node)) || flatGroups.slice(0, -1).some(node => hasTrailingComment$1(node.node)) || groups[cutoff] && hasLeadingComment$3(groups[cutoff][0].node); // If we only have a single `.`, we shouldn't do anything fancy and just
// render everything concatenated together.
if (groups.length <= cutoff && !hasComment) {
if (isLongCurriedCallExpression$1(path)) {
return oneLine;
}
return group$b(oneLine);
} // Find out the last node in the first group and check if it has an
// empty line after
const lastNodeBeforeIndent = getLast$3(shouldMerge ? groups.slice(1, 2)[0] : groups[0]).node;
const shouldHaveEmptyLineBeforeIndent = lastNodeBeforeIndent.type !== "CallExpression" && lastNodeBeforeIndent.type !== "OptionalCallExpression" && shouldInsertEmptyLineAfter(lastNodeBeforeIndent);
const expanded = concat$d([printGroup(groups[0]), shouldMerge ? concat$d(groups.slice(1, 2).map(printGroup)) : "", shouldHaveEmptyLineBeforeIndent ? hardline$9 : "", printIndentedGroup(groups.slice(shouldMerge ? 2 : 1))]);
const callExpressions = printedNodes.map(({
node
}) => node).filter(isCallOrOptionalCallExpression$1); // We don't want to print in one line if the chain has:
// * A comment.
// * Non-trivial arguments.
// * Any group but the last one has a hard line.
// If the last group is a function it's okay to inline if it fits.
if (hasComment || callExpressions.length > 2 && callExpressions.some(expr => !expr.arguments.every(arg => isSimpleCallArgument$1(arg, 0))) || printedGroups.slice(0, -1).some(willBreak$1) ||
/**
* scopes.filter(scope => scope.value !== '').map((scope, i) => {
* // multi line content
* })
*/
((lastGroupDoc, lastGroupNode) => isCallOrOptionalCallExpression$1(lastGroupNode) && willBreak$1(lastGroupDoc))(getLast$3(printedGroups), getLast$3(getLast$3(groups)).node) && callExpressions.slice(0, -1).some(n => n.arguments.some(isFunctionOrArrowExpression$1))) {
return group$b(expanded);
}
return concat$d([// We only need to check `oneLine` because if `expanded` is chosen
// that means that the parent group has already been broken
// naturally
willBreak$1(oneLine) || shouldHaveEmptyLineBeforeIndent ? breakParent$3 : "", conditionalGroup$1([oneLine, expanded])]);
}
function separatorNoWhitespace(isFacebookTranslationTag, child, childNode, nextNode) {
if (isFacebookTranslationTag) {
return "";
}
if (childNode.type === "JSXElement" && !childNode.closingElement || nextNode && nextNode.type === "JSXElement" && !nextNode.closingElement) {
return child.length === 1 ? softline$6 : hardline$9;
}
return softline$6;
}
function separatorWithWhitespace(isFacebookTranslationTag, child, childNode, nextNode) {
if (isFacebookTranslationTag) {
return hardline$9;
}
if (child.length === 1) {
return childNode.type === "JSXElement" && !childNode.closingElement || nextNode && nextNode.type === "JSXElement" && !nextNode.closingElement ? hardline$9 : softline$6;
}
return hardline$9;
} // JSX Children are strange, mostly for two reasons:
// 1. JSX reads newlines into string values, instead of skipping them like JS
// 2. up to one whitespace between elements within a line is significant,
// but not between lines.
//
// Leading, trailing, and lone whitespace all need to
// turn themselves into the rather ugly `{' '}` when breaking.
//
// We print JSX using the `fill` doc primitive.
// This requires that we give it an array of alternating
// content and whitespace elements.
// To ensure this we add dummy `""` content elements as needed.
function printJSXChildren(path, options, print, jsxWhitespace, isFacebookTranslationTag) {
const n = path.getValue();
const children = []; // using `map` instead of `each` because it provides `i`
path.map((childPath, i) => {
const child = childPath.getValue();
if (isLiteral$1(child)) {
const text = rawText$1(child); // Contains a non-whitespace character
if (isMeaningfulJSXText$1(child)) {
const words = text.split(matchJsxWhitespaceRegex$1); // Starts with whitespace
if (words[0] === "") {
children.push("");
words.shift();
if (/\n/.test(words[0])) {
const next = n.children[i + 1];
children.push(separatorWithWhitespace(isFacebookTranslationTag, words[1], child, next));
} else {
children.push(jsxWhitespace);
}
words.shift();
}
let endWhitespace; // Ends with whitespace
if (getLast$3(words) === "") {
words.pop();
endWhitespace = words.pop();
} // This was whitespace only without a new line.
if (words.length === 0) {
return;
}
words.forEach((word, i) => {
if (i % 2 === 1) {
children.push(line$9);
} else {
children.push(word);
}
});
if (endWhitespace !== undefined) {
if (/\n/.test(endWhitespace)) {
const next = n.children[i + 1];
children.push(separatorWithWhitespace(isFacebookTranslationTag, getLast$3(children), child, next));
} else {
children.push(jsxWhitespace);
}
} else {
const next = n.children[i + 1];
children.push(separatorNoWhitespace(isFacebookTranslationTag, getLast$3(children), child, next));
}
} else if (/\n/.test(text)) {
// Keep (up to one) blank line between tags/expressions/text.
// Note: We don't keep blank lines between text elements.
if (text.match(/\n/g).length > 1) {
children.push("");
children.push(hardline$9);
}
} else {
children.push("");
children.push(jsxWhitespace);
}
} else {
const printedChild = print(childPath);
children.push(printedChild);
const next = n.children[i + 1];
const directlyFollowedByMeaningfulText = next && isMeaningfulJSXText$1(next);
if (directlyFollowedByMeaningfulText) {
const firstWord = rawText$1(next).trim().split(matchJsxWhitespaceRegex$1)[0];
children.push(separatorNoWhitespace(isFacebookTranslationTag, firstWord, child, next));
} else {
children.push(hardline$9);
}
}
}, "children");
return children;
} // JSX expands children from the inside-out, instead of the outside-in.
// This is both to break children before attributes,
// and to ensure that when children break, their parents do as well.
//
// Any element that is written without any newlines and fits on a single line
// is left that way.
// Not only that, any user-written-line containing multiple JSX siblings
// should also be kept on one line if possible,
// so each user-written-line is wrapped in its own group.
//
// Elements that contain newlines or don't fit on a single line (recursively)
// are fully-split, using hardline and shouldBreak: true.
//
// To support that case properly, all leading and trailing spaces
// are stripped from the list of children, and replaced with a single hardline.
function printJSXElement(path, options, print) {
const n = path.getValue();
if (n.type === "JSXElement" && isEmptyJSXElement$1(n)) {
return concat$d([path.call(print, "openingElement"), path.call(print, "closingElement")]);
}
const openingLines = n.type === "JSXElement" ? path.call(print, "openingElement") : path.call(print, "openingFragment");
const closingLines = n.type === "JSXElement" ? path.call(print, "closingElement") : path.call(print, "closingFragment");
if (n.children.length === 1 && n.children[0].type === "JSXExpressionContainer" && (n.children[0].expression.type === "TemplateLiteral" || n.children[0].expression.type === "TaggedTemplateExpression")) {
return concat$d([openingLines, concat$d(path.map(print, "children")), closingLines]);
} // Convert `{" "}` to text nodes containing a space.
// This makes it easy to turn them into `jsxWhitespace` which
// can then print as either a space or `{" "}` when breaking.
n.children = n.children.map(child => {
if (isJSXWhitespaceExpression$1(child)) {
return {
type: "JSXText",
value: " ",
raw: " "
};
}
return child;
});
const containsTag = n.children.filter(isJSXNode$1).length > 0;
const containsMultipleExpressions = n.children.filter(child => child.type === "JSXExpressionContainer").length > 1;
const containsMultipleAttributes = n.type === "JSXElement" && n.openingElement.attributes.length > 1; // Record any breaks. Should never go from true to false, only false to true.
let forcedBreak = willBreak$1(openingLines) || containsTag || containsMultipleAttributes || containsMultipleExpressions;
const isMdxBlock = path.getParentNode().rootMarker === "mdx";
const rawJsxWhitespace = options.singleQuote ? "{' '}" : '{" "}';
const jsxWhitespace = isMdxBlock ? concat$d([" "]) : ifBreak$6(concat$d([rawJsxWhitespace, softline$6]), " ");
const isFacebookTranslationTag = n.openingElement && n.openingElement.name && n.openingElement.name.name === "fbt";
const children = printJSXChildren(path, options, print, jsxWhitespace, isFacebookTranslationTag);
const containsText = n.children.some(child => isMeaningfulJSXText$1(child)); // We can end up we multiple whitespace elements with empty string
// content between them.
// We need to remove empty whitespace and softlines before JSX whitespace
// to get the correct output.
for (let i = children.length - 2; i >= 0; i--) {
const isPairOfEmptyStrings = children[i] === "" && children[i + 1] === "";
const isPairOfHardlines = children[i] === hardline$9 && children[i + 1] === "" && children[i + 2] === hardline$9;
const isLineFollowedByJSXWhitespace = (children[i] === softline$6 || children[i] === hardline$9) && children[i + 1] === "" && children[i + 2] === jsxWhitespace;
const isJSXWhitespaceFollowedByLine = children[i] === jsxWhitespace && children[i + 1] === "" && (children[i + 2] === softline$6 || children[i + 2] === hardline$9);
const isDoubleJSXWhitespace = children[i] === jsxWhitespace && children[i + 1] === "" && children[i + 2] === jsxWhitespace;
const isPairOfHardOrSoftLines = children[i] === softline$6 && children[i + 1] === "" && children[i + 2] === hardline$9 || children[i] === hardline$9 && children[i + 1] === "" && children[i + 2] === softline$6;
if (isPairOfHardlines && containsText || isPairOfEmptyStrings || isLineFollowedByJSXWhitespace || isDoubleJSXWhitespace || isPairOfHardOrSoftLines) {
children.splice(i, 2);
} else if (isJSXWhitespaceFollowedByLine) {
children.splice(i + 1, 2);
}
} // Trim trailing lines (or empty strings)
while (children.length && (isLineNext$1(getLast$3(children)) || isEmpty$1(getLast$3(children)))) {
children.pop();
} // Trim leading lines (or empty strings)
while (children.length && (isLineNext$1(children[0]) || isEmpty$1(children[0])) && (isLineNext$1(children[1]) || isEmpty$1(children[1]))) {
children.shift();
children.shift();
} // Tweak how we format children if outputting this element over multiple lines.
// Also detect whether we will force this element to output over multiple lines.
const multilineChildren = [];
children.forEach((child, i) => {
// There are a number of situations where we need to ensure we display
// whitespace as `{" "}` when outputting this element over multiple lines.
if (child === jsxWhitespace) {
if (i === 1 && children[i - 1] === "") {
if (children.length === 2) {
// Solitary whitespace
multilineChildren.push(rawJsxWhitespace);
return;
} // Leading whitespace
multilineChildren.push(concat$d([rawJsxWhitespace, hardline$9]));
return;
} else if (i === children.length - 1) {
// Trailing whitespace
multilineChildren.push(rawJsxWhitespace);
return;
} else if (children[i - 1] === "" && children[i - 2] === hardline$9) {
// Whitespace after line break
multilineChildren.push(rawJsxWhitespace);
return;
}
}
multilineChildren.push(child);
if (willBreak$1(child)) {
forcedBreak = true;
}
}); // If there is text we use `fill` to fit as much onto each line as possible.
// When there is no text (just tags and expressions) we use `group`
// to output each on a separate line.
const content = containsText ? fill$4(multilineChildren) : group$b(concat$d(multilineChildren), {
shouldBreak: true
});
if (isMdxBlock) {
return content;
}
const multiLineElem = group$b(concat$d([openingLines, indent$7(concat$d([hardline$9, content])), hardline$9, closingLines]));
if (forcedBreak) {
return multiLineElem;
}
return conditionalGroup$1([group$b(concat$d([openingLines, concat$d(children), closingLines])), multiLineElem]);
}
function maybeWrapJSXElementInParens(path, elem, options) {
const parent = path.getParentNode();
if (!parent) {
return elem;
}
const NO_WRAP_PARENTS = {
ArrayExpression: true,
JSXAttribute: true,
JSXElement: true,
JSXExpressionContainer: true,
JSXFragment: true,
ExpressionStatement: true,
CallExpression: true,
OptionalCallExpression: true,
ConditionalExpression: true,
JsExpressionRoot: true
};
if (NO_WRAP_PARENTS[parent.type]) {
return elem;
}
const shouldBreak = path.match(undefined, node => node.type === "ArrowFunctionExpression", isCallOrOptionalCallExpression$1, node => node.type === "JSXExpressionContainer");
const needsParens = needsParens_1(path, options);
return group$b(concat$d([needsParens ? "" : ifBreak$6("("), indent$7(concat$d([softline$6, elem])), softline$6, needsParens ? "" : ifBreak$6(")")]), {
shouldBreak
});
}
function shouldInlineLogicalExpression(node) {
if (node.type !== "LogicalExpression") {
return false;
}
if (node.right.type === "ObjectExpression" && node.right.properties.length !== 0) {
return true;
}
if (node.right.type === "ArrayExpression" && node.right.elements.length !== 0) {
return true;
}
if (isJSXNode$1(node.right)) {
return true;
}
return false;
} // For binary expressions to be consistent, we need to group
// subsequent operators with the same precedence level under a single
// group. Otherwise they will be nested such that some of them break
// onto new lines but not all. Operators with the same precedence
// level should either all break or not. Because we group them by
// precedence level and the AST is structured based on precedence
// level, things are naturally broken up correctly, i.e. `&&` is
// broken before `+`.
function printBinaryishExpressions(path, print, options, isNested, isInsideParenthesis) {
let parts = [];
const node = path.getValue(); // We treat BinaryExpression and LogicalExpression nodes the same.
if (isBinaryish$1(node)) {
// Put all operators with the same precedence level in the same
// group. The reason we only need to do this with the `left`
// expression is because given an expression like `1 + 2 - 3`, it
// is always parsed like `((1 + 2) - 3)`, meaning the `left` side
// is where the rest of the expression will exist. Binary
// expressions on the right side mean they have a difference
// precedence level and should be treated as a separate group, so
// print them normally. (This doesn't hold for the `**` operator,
// which is unique in that it is right-associative.)
if (shouldFlatten$1(node.operator, node.left.operator)) {
// Flatten them out by recursively calling this function.
parts = parts.concat(path.call(left => printBinaryishExpressions(left, print, options,
/* isNested */
true, isInsideParenthesis), "left"));
} else {
parts.push(path.call(print, "left"));
}
const shouldInline = shouldInlineLogicalExpression(node);
const lineBeforeOperator = (node.operator === "|>" || node.type === "NGPipeExpression" || node.operator === "|" && options.parser === "__vue_expression") && !hasLeadingOwnLineComment$1(options.originalText, node.right, options);
const operator = node.type === "NGPipeExpression" ? "|" : node.operator;
const rightSuffix = node.type === "NGPipeExpression" && node.arguments.length !== 0 ? group$b(indent$7(concat$d([softline$6, ": ", join$9(concat$d([softline$6, ":", ifBreak$6(" ")]), path.map(print, "arguments").map(arg => align$1(2, group$b(arg))))]))) : "";
const right = shouldInline ? concat$d([operator, " ", path.call(print, "right"), rightSuffix]) : concat$d([lineBeforeOperator ? softline$6 : "", operator, lineBeforeOperator ? " " : line$9, path.call(print, "right"), rightSuffix]); // If there's only a single binary expression, we want to create a group
// in order to avoid having a small right part like -1 be on its own line.
const parent = path.getParentNode();
const shouldGroup = !(isInsideParenthesis && node.type === "LogicalExpression") && parent.type !== node.type && node.left.type !== node.type && node.right.type !== node.type;
parts.push(" ", shouldGroup ? group$b(right) : right); // The root comments are already printed, but we need to manually print
// the other ones since we don't call the normal print on BinaryExpression,
// only for the left and right parts
if (isNested && node.comments) {
parts = comments.printComments(path, () => concat$d(parts), options);
}
} else {
// Our stopping case. Simply print the node normally.
parts.push(path.call(print));
}
return parts;
}
function printAssignmentRight(leftNode, rightNode, printedRight, options) {
if (hasLeadingOwnLineComment$1(options.originalText, rightNode, options)) {
return indent$7(concat$d([line$9, printedRight]));
}
const canBreak = isBinaryish$1(rightNode) && !shouldInlineLogicalExpression(rightNode) || rightNode.type === "ConditionalExpression" && isBinaryish$1(rightNode.test) && !shouldInlineLogicalExpression(rightNode.test) || rightNode.type === "StringLiteralTypeAnnotation" || rightNode.type === "ClassExpression" && rightNode.decorators && rightNode.decorators.length || (leftNode.type === "Identifier" || isStringLiteral$1(leftNode) || leftNode.type === "MemberExpression") && (isStringLiteral$1(rightNode) || isMemberExpressionChain$1(rightNode)) && // do not put values on a separate line from the key in json
options.parser !== "json" && options.parser !== "json5" || rightNode.type === "SequenceExpression";
if (canBreak) {
return group$b(indent$7(concat$d([line$9, printedRight])));
}
return concat$d([" ", printedRight]);
}
function printAssignment(leftNode, printedLeft, operator, rightNode, printedRight, options) {
if (!rightNode) {
return printedLeft;
}
const printed = printAssignmentRight(leftNode, rightNode, printedRight, options);
return group$b(concat$d([printedLeft, operator, printed]));
}
function adjustClause(node, clause, forceSpace) {
if (node.type === "EmptyStatement") {
return ";";
}
if (node.type === "BlockStatement" || forceSpace) {
return concat$d([" ", clause]);
}
return indent$7(concat$d([line$9, clause]));
}
function nodeStr(node, options, isFlowOrTypeScriptDirectiveLiteral) {
const raw = rawText$1(node);
const isDirectiveLiteral = isFlowOrTypeScriptDirectiveLiteral || node.type === "DirectiveLiteral";
return printString$2(raw, options, isDirectiveLiteral);
}
function printRegex(node) {
const flags = node.flags.split("").sort().join("");
return "/".concat(node.pattern, "/").concat(flags);
}
function exprNeedsASIProtection(path, options) {
const node = path.getValue();
const maybeASIProblem = needsParens_1(path, options) || node.type === "ParenthesizedExpression" || node.type === "TypeCastExpression" || node.type === "ArrowFunctionExpression" && !shouldPrintParamsWithoutParens(path, options) || node.type === "ArrayExpression" || node.type === "ArrayPattern" || node.type === "UnaryExpression" && node.prefix && (node.operator === "+" || node.operator === "-") || node.type === "TemplateLiteral" || node.type === "TemplateElement" || isJSXNode$1(node) || node.type === "BindExpression" && !node.object || node.type === "RegExpLiteral" || node.type === "Literal" && node.pattern || node.type === "Literal" && node.regex;
if (maybeASIProblem) {
return true;
}
if (!hasNakedLeftSide$2(node)) {
return false;
}
return path.call(childPath => exprNeedsASIProtection(childPath, options), ...getLeftSidePathName$2(path, node));
}
function stmtNeedsASIProtection(path, options) {
const node = path.getNode();
if (node.type !== "ExpressionStatement") {
return false;
}
return path.call(childPath => exprNeedsASIProtection(childPath, options), "expression");
}
function shouldHugType(node) {
if (isSimpleFlowType$1(node) || isObjectType$1(node)) {
return true;
}
if (node.type === "UnionTypeAnnotation" || node.type === "TSUnionType") {
const voidCount = node.types.filter(n => n.type === "VoidTypeAnnotation" || n.type === "TSVoidKeyword" || n.type === "NullLiteralTypeAnnotation" || n.type === "TSNullKeyword").length;
const hasObject = node.types.some(n => n.type === "ObjectTypeAnnotation" || n.type === "TSTypeLiteral" || // This is a bit aggressive but captures Array<{x}>
n.type === "GenericTypeAnnotation" || n.type === "TSTypeReference");
if (node.types.length - 1 === voidCount && hasObject) {
return true;
}
}
return false;
}
function shouldHugArguments(fun) {
if (!fun || fun.rest) {
return false;
}
const params = fun.params || fun.parameters;
if (!params || params.length !== 1) {
return false;
}
const param = params[0];
return !param.comments && (param.type === "ObjectPattern" || param.type === "ArrayPattern" || param.type === "Identifier" && param.typeAnnotation && (param.typeAnnotation.type === "TypeAnnotation" || param.typeAnnotation.type === "TSTypeAnnotation") && isObjectType$1(param.typeAnnotation.typeAnnotation) || param.type === "FunctionTypeParam" && isObjectType$1(param.typeAnnotation) || param.type === "AssignmentPattern" && (param.left.type === "ObjectPattern" || param.left.type === "ArrayPattern") && (param.right.type === "Identifier" || param.right.type === "ObjectExpression" && param.right.properties.length === 0 || param.right.type === "ArrayExpression" && param.right.elements.length === 0));
}
function printArrayItems(path, options, printPath, print) {
const printedElements = [];
let separatorParts = [];
path.each(childPath => {
printedElements.push(concat$d(separatorParts));
printedElements.push(group$b(print(childPath)));
separatorParts = [",", line$9];
if (childPath.getValue() && isNextLineEmpty$4(options.originalText, childPath.getValue(), options.locEnd)) {
separatorParts.push(softline$6);
}
}, printPath);
return concat$d(printedElements);
}
function printReturnAndThrowArgument(path, options, print) {
const node = path.getValue();
const semi = options.semi ? ";" : "";
const parts = [];
if (node.argument) {
if (returnArgumentHasLeadingComment$1(options, node.argument)) {
parts.push(concat$d([" (", indent$7(concat$d([hardline$9, path.call(print, "argument")])), hardline$9, ")"]));
} else if (isBinaryish$1(node.argument) || node.argument.type === "SequenceExpression") {
parts.push(group$b(concat$d([ifBreak$6(" (", " "), indent$7(concat$d([softline$6, path.call(print, "argument")])), softline$6, ifBreak$6(")")])));
} else {
parts.push(" ", path.call(print, "argument"));
}
}
const lastComment = Array.isArray(node.comments) && node.comments[node.comments.length - 1];
const isLastCommentLine = lastComment && (lastComment.type === "CommentLine" || lastComment.type === "Line");
if (isLastCommentLine) {
parts.push(semi);
}
if (hasDanglingComments$1(node)) {
parts.push(" ", comments.printDanglingComments(path, options,
/* sameIndent */
true));
}
if (!isLastCommentLine) {
parts.push(semi);
}
return concat$d(parts);
}
function willPrintOwnComments(path
/*, options */
) {
const node = path.getValue();
const parent = path.getParentNode();
return (node && (isJSXNode$1(node) || hasFlowShorthandAnnotationComment$2(node) || parent && (parent.type === "CallExpression" || parent.type === "OptionalCallExpression") && (hasFlowAnnotationComment$1(node.leadingComments) || hasFlowAnnotationComment$1(node.trailingComments))) || parent && (parent.type === "JSXSpreadAttribute" || parent.type === "JSXSpreadChild" || parent.type === "UnionTypeAnnotation" || parent.type === "TSUnionType" || (parent.type === "ClassDeclaration" || parent.type === "ClassExpression") && parent.superClass === node)) && (!hasIgnoreComment$4(path) || parent.type === "UnionTypeAnnotation" || parent.type === "TSUnionType");
}
function canAttachComment$1(node) {
return node.type && node.type !== "CommentBlock" && node.type !== "CommentLine" && node.type !== "Line" && node.type !== "Block" && node.type !== "EmptyStatement" && node.type !== "TemplateElement" && node.type !== "Import";
}
function printComment$2(commentPath, options) {
const comment = commentPath.getValue();
switch (comment.type) {
case "CommentBlock":
case "Block":
{
if (isIndentableBlockComment(comment)) {
const printed = printIndentableBlockComment(comment); // We need to prevent an edge case of a previous trailing comment
// printed as a `lineSuffix` which causes the comments to be
// interleaved. See https://github.com/prettier/prettier/issues/4412
if (comment.trailing && !hasNewline$5(options.originalText, options.locStart(comment), {
backwards: true
})) {
return concat$d([hardline$9, printed]);
}
return printed;
}
const commentEnd = options.locEnd(comment);
const isInsideFlowComment = options.originalText.slice(commentEnd - 3, commentEnd) === "*-/";
return "/*" + comment.value + (isInsideFlowComment ? "*-/" : "*/");
}
case "CommentLine":
case "Line":
// Print shebangs with the proper comment characters
if (options.originalText.slice(options.locStart(comment)).startsWith("#!")) {
return "#!" + comment.value.trimEnd();
}
return "//" + comment.value.trimEnd();
default:
throw new Error("Not a comment: " + JSON.stringify(comment));
}
}
function isIndentableBlockComment(comment) {
// If the comment has multiple lines and every line starts with a star
// we can fix the indentation of each line. The stars in the `/*` and
// `*/` delimiters are not included in the comment value, so add them
// back first.
const lines = "*".concat(comment.value, "*").split("\n");
return lines.length > 1 && lines.every(line => line.trim()[0] === "*");
}
function printIndentableBlockComment(comment) {
const lines = comment.value.split("\n");
return concat$d(["/*", join$9(hardline$9, lines.map((line, index) => index === 0 ? line.trimEnd() : " " + (index < lines.length - 1 ? line.trim() : line.trimStart()))), "*/"]);
}
var printerEstree = {
preprocess: preprocess_1$1,
print: genericPrint$3,
embed: embed_1$1,
insertPragma: insertPragma$7,
massageAstNode: clean_1$1,
hasPrettierIgnore: hasPrettierIgnore$5,
willPrintOwnComments,
canAttachComment: canAttachComment$1,
printComment: printComment$2,
isBlockComment: comments$1.isBlockComment,
handleComments: {
ownLine: comments$1.handleOwnLineComment,
endOfLine: comments$1.handleEndOfLineComment,
remaining: comments$1.handleRemainingComment
},
getGapRegex: comments$1.getGapRegex,
getCommentChildNodes: comments$1.getCommentChildNodes
};
const {
concat: concat$e,
hardline: hardline$a,
indent: indent$8,
join: join$a
} = document.builders;
function genericPrint$4(path, options, print) {
const node = path.getValue();
switch (node.type) {
case "JsonRoot":
return concat$e([path.call(print, "node"), hardline$a]);
case "ArrayExpression":
return node.elements.length === 0 ? "[]" : concat$e(["[", indent$8(concat$e([hardline$a, join$a(concat$e([",", hardline$a]), path.map(print, "elements"))])), hardline$a, "]"]);
case "ObjectExpression":
return node.properties.length === 0 ? "{}" : concat$e(["{", indent$8(concat$e([hardline$a, join$a(concat$e([",", hardline$a]), path.map(print, "properties"))])), hardline$a, "}"]);
case "ObjectProperty":
return concat$e([path.call(print, "key"), ": ", path.call(print, "value")]);
case "UnaryExpression":
return concat$e([node.operator === "+" ? "" : node.operator, path.call(print, "argument")]);
case "NullLiteral":
return "null";
case "BooleanLiteral":
return node.value ? "true" : "false";
case "StringLiteral":
case "NumericLiteral":
return JSON.stringify(node.value);
case "Identifier":
return JSON.stringify(node.name);
default:
/* istanbul ignore next */
throw new Error("unknown type: " + JSON.stringify(node.type));
}
}
function clean$5(node, newNode
/*, parent*/
) {
delete newNode.start;
delete newNode.end;
delete newNode.extra;
delete newNode.loc;
delete newNode.comments;
delete newNode.errors;
if (node.type === "Identifier") {
return {
type: "StringLiteral",
value: node.name
};
}
if (node.type === "UnaryExpression" && node.operator === "+") {
return newNode.argument;
}
}
var printerEstreeJson = {
preprocess: preprocess_1$1,
print: genericPrint$4,
massageAstNode: clean$5
};
const CATEGORY_JAVASCRIPT = "JavaScript"; // format based on https://github.com/prettier/prettier/blob/master/src/main/core-options.js
var options$5 = {
arrowParens: {
since: "1.9.0",
category: CATEGORY_JAVASCRIPT,
type: "choice",
default: [{
since: "1.9.0",
value: "avoid"
}, {
since: "2.0.0",
value: "always"
}],
description: "Include parentheses around a sole arrow function parameter.",
choices: [{
value: "always",
description: "Always include parens. Example: `(x) => x`"
}, {
value: "avoid",
description: "Omit parens when possible. Example: `x => x`"
}]
},
bracketSpacing: commonOptions.bracketSpacing,
jsxBracketSameLine: {
since: "0.17.0",
category: CATEGORY_JAVASCRIPT,
type: "boolean",
default: false,
description: "Put > on the last line instead of at a new line."
},
semi: {
since: "1.0.0",
category: CATEGORY_JAVASCRIPT,
type: "boolean",
default: true,
description: "Print semicolons.",
oppositeDescription: "Do not print semicolons, except at the beginning of lines which may need them."
},
singleQuote: commonOptions.singleQuote,
jsxSingleQuote: {
since: "1.15.0",
category: CATEGORY_JAVASCRIPT,
type: "boolean",
default: false,
description: "Use single quotes in JSX."
},
quoteProps: {
since: "1.17.0",
category: CATEGORY_JAVASCRIPT,
type: "choice",
default: "as-needed",
description: "Change when properties in objects are quoted.",
choices: [{
value: "as-needed",
description: "Only add quotes around object properties where required."
}, {
value: "consistent",
description: "If at least one property in an object requires quotes, quote all properties."
}, {
value: "preserve",
description: "Respect the input use of quotes in object properties."
}]
},
trailingComma: {
since: "0.0.0",
category: CATEGORY_JAVASCRIPT,
type: "choice",
default: [{
since: "0.0.0",
value: false
}, {
since: "0.19.0",
value: "none"
}, {
since: "2.0.0",
value: "es5"
}],
description: "Print trailing commas wherever possible when multi-line.",
choices: [{
value: "es5",
description: "Trailing commas where valid in ES5 (objects, arrays, etc.)"
}, {
value: "none",
description: "No trailing commas."
}, {
value: "all",
description: "Trailing commas wherever possible (including function arguments)."
}]
}
};
var name$9 = "JavaScript";
var type$8 = "programming";
var tmScope$8 = "source.js";
var aceMode$8 = "javascript";
var codemirrorMode$4 = "javascript";
var codemirrorMimeType$4 = "text/javascript";
var color$3 = "#f1e05a";
var aliases$2 = [
"js",
"node"
];
var extensions$8 = [
".js",
"._js",
".bones",
".cjs",
".es",
".es6",
".frag",
".gs",
".jake",
".jsb",
".jscad",
".jsfl",
".jsm",
".jss",
".mjs",
".njs",
".pac",
".sjs",
".ssjs",
".xsjs",
".xsjslib"
];
var filenames = [
"Jakefile"
];
var interpreters = [
"chakra",
"d8",
"gjs",
"js",
"node",
"qjs",
"rhino",
"v8",
"v8-shell"
];
var languageId$8 = 183;
var JavaScript = {
name: name$9,
type: type$8,
tmScope: tmScope$8,
aceMode: aceMode$8,
codemirrorMode: codemirrorMode$4,
codemirrorMimeType: codemirrorMimeType$4,
color: color$3,
aliases: aliases$2,
extensions: extensions$8,
filenames: filenames,
interpreters: interpreters,
languageId: languageId$8
};
var JavaScript$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$9,
type: type$8,
tmScope: tmScope$8,
aceMode: aceMode$8,
codemirrorMode: codemirrorMode$4,
codemirrorMimeType: codemirrorMimeType$4,
color: color$3,
aliases: aliases$2,
extensions: extensions$8,
filenames: filenames,
interpreters: interpreters,
languageId: languageId$8,
'default': JavaScript
});
var name$a = "JSX";
var type$9 = "programming";
var group$c = "JavaScript";
var extensions$9 = [
".jsx"
];
var tmScope$9 = "source.js.jsx";
var aceMode$9 = "javascript";
var codemirrorMode$5 = "jsx";
var codemirrorMimeType$5 = "text/jsx";
var languageId$9 = 178;
var JSX = {
name: name$a,
type: type$9,
group: group$c,
extensions: extensions$9,
tmScope: tmScope$9,
aceMode: aceMode$9,
codemirrorMode: codemirrorMode$5,
codemirrorMimeType: codemirrorMimeType$5,
languageId: languageId$9
};
var JSX$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$a,
type: type$9,
group: group$c,
extensions: extensions$9,
tmScope: tmScope$9,
aceMode: aceMode$9,
codemirrorMode: codemirrorMode$5,
codemirrorMimeType: codemirrorMimeType$5,
languageId: languageId$9,
'default': JSX
});
var name$b = "TypeScript";
var type$a = "programming";
var color$4 = "#2b7489";
var aliases$3 = [
"ts"
];
var interpreters$1 = [
"deno",
"ts-node"
];
var extensions$a = [
".ts"
];
var tmScope$a = "source.ts";
var aceMode$a = "typescript";
var codemirrorMode$6 = "javascript";
var codemirrorMimeType$6 = "application/typescript";
var languageId$a = 378;
var TypeScript = {
name: name$b,
type: type$a,
color: color$4,
aliases: aliases$3,
interpreters: interpreters$1,
extensions: extensions$a,
tmScope: tmScope$a,
aceMode: aceMode$a,
codemirrorMode: codemirrorMode$6,
codemirrorMimeType: codemirrorMimeType$6,
languageId: languageId$a
};
var TypeScript$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$b,
type: type$a,
color: color$4,
aliases: aliases$3,
interpreters: interpreters$1,
extensions: extensions$a,
tmScope: tmScope$a,
aceMode: aceMode$a,
codemirrorMode: codemirrorMode$6,
codemirrorMimeType: codemirrorMimeType$6,
languageId: languageId$a,
'default': TypeScript
});
var name$c = "TSX";
var type$b = "programming";
var group$d = "TypeScript";
var extensions$b = [
".tsx"
];
var tmScope$b = "source.tsx";
var aceMode$b = "javascript";
var codemirrorMode$7 = "jsx";
var codemirrorMimeType$7 = "text/jsx";
var languageId$b = 94901924;
var TSX = {
name: name$c,
type: type$b,
group: group$d,
extensions: extensions$b,
tmScope: tmScope$b,
aceMode: aceMode$b,
codemirrorMode: codemirrorMode$7,
codemirrorMimeType: codemirrorMimeType$7,
languageId: languageId$b
};
var TSX$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$c,
type: type$b,
group: group$d,
extensions: extensions$b,
tmScope: tmScope$b,
aceMode: aceMode$b,
codemirrorMode: codemirrorMode$7,
codemirrorMimeType: codemirrorMimeType$7,
languageId: languageId$b,
'default': TSX
});
var name$d = "JSON";
var type$c = "data";
var tmScope$c = "source.json";
var aceMode$c = "json";
var codemirrorMode$8 = "javascript";
var codemirrorMimeType$8 = "application/json";
var searchable = false;
var extensions$c = [
".json",
".avsc",
".geojson",
".gltf",
".har",
".ice",
".JSON-tmLanguage",
".jsonl",
".mcmeta",
".tfstate",
".tfstate.backup",
".topojson",
".webapp",
".webmanifest",
".yy",
".yyp"
];
var filenames$1 = [
".arcconfig",
".htmlhintrc",
".tern-config",
".tern-project",
".watchmanconfig",
"composer.lock",
"mcmod.info"
];
var languageId$c = 174;
var _JSON = {
name: name$d,
type: type$c,
tmScope: tmScope$c,
aceMode: aceMode$c,
codemirrorMode: codemirrorMode$8,
codemirrorMimeType: codemirrorMimeType$8,
searchable: searchable,
extensions: extensions$c,
filenames: filenames$1,
languageId: languageId$c
};
var _JSON$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$d,
type: type$c,
tmScope: tmScope$c,
aceMode: aceMode$c,
codemirrorMode: codemirrorMode$8,
codemirrorMimeType: codemirrorMimeType$8,
searchable: searchable,
extensions: extensions$c,
filenames: filenames$1,
languageId: languageId$c,
'default': _JSON
});
var name$e = "JSON with Comments";
var type$d = "data";
var group$e = "JSON";
var tmScope$d = "source.js";
var aceMode$d = "javascript";
var codemirrorMode$9 = "javascript";
var codemirrorMimeType$9 = "text/javascript";
var aliases$4 = [
"jsonc"
];
var extensions$d = [
".jsonc",
".sublime-build",
".sublime-commands",
".sublime-completions",
".sublime-keymap",
".sublime-macro",
".sublime-menu",
".sublime-mousemap",
".sublime-project",
".sublime-settings",
".sublime-theme",
".sublime-workspace",
".sublime_metrics",
".sublime_session"
];
var filenames$2 = [
".babelrc",
".eslintrc.json",
".jscsrc",
".jshintrc",
".jslintrc",
"jsconfig.json",
"language-configuration.json",
"tsconfig.json"
];
var languageId$d = 423;
var JSON_with_Comments = {
name: name$e,
type: type$d,
group: group$e,
tmScope: tmScope$d,
aceMode: aceMode$d,
codemirrorMode: codemirrorMode$9,
codemirrorMimeType: codemirrorMimeType$9,
aliases: aliases$4,
extensions: extensions$d,
filenames: filenames$2,
languageId: languageId$d
};
var JSON_with_Comments$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$e,
type: type$d,
group: group$e,
tmScope: tmScope$d,
aceMode: aceMode$d,
codemirrorMode: codemirrorMode$9,
codemirrorMimeType: codemirrorMimeType$9,
aliases: aliases$4,
extensions: extensions$d,
filenames: filenames$2,
languageId: languageId$d,
'default': JSON_with_Comments
});
var name$f = "JSON5";
var type$e = "data";
var extensions$e = [
".json5"
];
var tmScope$e = "source.js";
var aceMode$e = "javascript";
var codemirrorMode$a = "javascript";
var codemirrorMimeType$a = "application/json";
var languageId$e = 175;
var JSON5 = {
name: name$f,
type: type$e,
extensions: extensions$e,
tmScope: tmScope$e,
aceMode: aceMode$e,
codemirrorMode: codemirrorMode$a,
codemirrorMimeType: codemirrorMimeType$a,
languageId: languageId$e
};
var JSON5$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$f,
type: type$e,
extensions: extensions$e,
tmScope: tmScope$e,
aceMode: aceMode$e,
codemirrorMode: codemirrorMode$a,
codemirrorMimeType: codemirrorMimeType$a,
languageId: languageId$e,
'default': JSON5
});
var require$$0$6 = getCjsExportFromNamespace(JavaScript$1);
var require$$1$2 = getCjsExportFromNamespace(JSX$1);
var require$$2$1 = getCjsExportFromNamespace(TypeScript$1);
var require$$3$1 = getCjsExportFromNamespace(TSX$1);
var require$$4 = getCjsExportFromNamespace(_JSON$1);
var require$$5 = getCjsExportFromNamespace(JSON_with_Comments$1);
var require$$6 = getCjsExportFromNamespace(JSON5$1);
const languages$4 = [createLanguage(require$$0$6, data => ({
since: "0.0.0",
parsers: ["babel", "flow"],
vscodeLanguageIds: ["javascript", "mongo"],
interpreters: data.interpreters.concat(["nodejs"])
})), createLanguage(require$$0$6, () => ({
name: "Flow",
since: "0.0.0",
parsers: ["babel", "flow"],
vscodeLanguageIds: ["javascript"],
aliases: [],
filenames: [],
extensions: [".js.flow"]
})), createLanguage(require$$1$2, () => ({
since: "0.0.0",
parsers: ["babel", "flow"],
vscodeLanguageIds: ["javascriptreact"]
})), createLanguage(require$$2$1, () => ({
since: "1.4.0",
parsers: ["typescript", "babel-ts"],
vscodeLanguageIds: ["typescript"]
})), createLanguage(require$$3$1, () => ({
since: "1.4.0",
parsers: ["typescript", "babel-ts"],
vscodeLanguageIds: ["typescriptreact"]
})), createLanguage(require$$4, () => ({
name: "JSON.stringify",
since: "1.13.0",
parsers: ["json-stringify"],
vscodeLanguageIds: ["json"],
extensions: [],
// .json file defaults to json instead of json-stringify
filenames: ["package.json", "package-lock.json", "composer.json"]
})), createLanguage(require$$4, data => ({
since: "1.5.0",
parsers: ["json"],
vscodeLanguageIds: ["json"],
filenames: data.filenames.concat([".prettierrc"])
})), createLanguage(require$$5, data => ({
since: "1.5.0",
parsers: ["json"],
vscodeLanguageIds: ["jsonc"],
filenames: data.filenames.concat([".eslintrc"])
})), createLanguage(require$$6, () => ({
since: "1.13.0",
parsers: ["json5"],
vscodeLanguageIds: ["json5"]
}))];
const printers$4 = {
estree: printerEstree,
"estree-json": printerEstreeJson
};
var languageJs = {
languages: languages$4,
options: options$5,
printers: printers$4
};
var json$1 = {
"cjkPattern": "[\\u02ea-\\u02eb\\u1100-\\u11ff\\u2e80-\\u2e99\\u2e9b-\\u2ef3\\u2f00-\\u2fd5\\u3000-\\u303f\\u3041-\\u3096\\u3099-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u3190-\\u3191\\u3196-\\u31ba\\u31c0-\\u31e3\\u31f0-\\u321e\\u322a-\\u3247\\u3260-\\u327e\\u328a-\\u32b0\\u32c0-\\u32cb\\u32d0-\\u3370\\u337b-\\u337f\\u33e0-\\u33fe\\u3400-\\u4db5\\u4e00-\\u9fef\\ua960-\\ua97c\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufe10-\\ufe1f\\ufe30-\\ufe6f\\uff00-\\uffef]|[\\ud840-\\ud868\\ud86a-\\ud86c\\ud86f-\\ud872\\ud874-\\ud879][\\udc00-\\udfff]|\\ud82c[\\udc00-\\udd1e\\udd50-\\udd52\\udd64-\\udd67]|\\ud83c[\\ude00\\ude50-\\ude51]|\\ud869[\\udc00-\\uded6\\udf00-\\udfff]|\\ud86d[\\udc00-\\udf34\\udf40-\\udfff]|\\ud86e[\\udc00-\\udc1d\\udc20-\\udfff]|\\ud873[\\udc00-\\udea1\\udeb0-\\udfff]|\\ud87a[\\udc00-\\udfe0]|\\ud87e[\\udc00-\\ude1d]",
"kPattern": "[\\u1100-\\u11ff\\u3001-\\u3003\\u3008-\\u3011\\u3013-\\u301f\\u302e-\\u3030\\u3037\\u30fb\\u3131-\\u318e\\u3200-\\u321e\\u3260-\\u327e\\ua960-\\ua97c\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\ufe45-\\ufe46\\uff61-\\uff65\\uffa0-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc]",
"punctuationPattern": "[\\u0021-\\u002f\\u003a-\\u0040\\u005b-\\u0060\\u007b-\\u007e\\u00a1\\u00a7\\u00ab\\u00b6-\\u00b7\\u00bb\\u00bf\\u037e\\u0387\\u055a-\\u055f\\u0589-\\u058a\\u05be\\u05c0\\u05c3\\u05c6\\u05f3-\\u05f4\\u0609-\\u060a\\u060c-\\u060d\\u061b\\u061e-\\u061f\\u066a-\\u066d\\u06d4\\u0700-\\u070d\\u07f7-\\u07f9\\u0830-\\u083e\\u085e\\u0964-\\u0965\\u0970\\u09fd\\u0a76\\u0af0\\u0c77\\u0c84\\u0df4\\u0e4f\\u0e5a-\\u0e5b\\u0f04-\\u0f12\\u0f14\\u0f3a-\\u0f3d\\u0f85\\u0fd0-\\u0fd4\\u0fd9-\\u0fda\\u104a-\\u104f\\u10fb\\u1360-\\u1368\\u1400\\u166e\\u169b-\\u169c\\u16eb-\\u16ed\\u1735-\\u1736\\u17d4-\\u17d6\\u17d8-\\u17da\\u1800-\\u180a\\u1944-\\u1945\\u1a1e-\\u1a1f\\u1aa0-\\u1aa6\\u1aa8-\\u1aad\\u1b5a-\\u1b60\\u1bfc-\\u1bff\\u1c3b-\\u1c3f\\u1c7e-\\u1c7f\\u1cc0-\\u1cc7\\u1cd3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205e\\u207d-\\u207e\\u208d-\\u208e\\u2308-\\u230b\\u2329-\\u232a\\u2768-\\u2775\\u27c5-\\u27c6\\u27e6-\\u27ef\\u2983-\\u2998\\u29d8-\\u29db\\u29fc-\\u29fd\\u2cf9-\\u2cfc\\u2cfe-\\u2cff\\u2d70\\u2e00-\\u2e2e\\u2e30-\\u2e4f\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301f\\u3030\\u303d\\u30a0\\u30fb\\ua4fe-\\ua4ff\\ua60d-\\ua60f\\ua673\\ua67e\\ua6f2-\\ua6f7\\ua874-\\ua877\\ua8ce-\\ua8cf\\ua8f8-\\ua8fa\\ua8fc\\ua92e-\\ua92f\\ua95f\\ua9c1-\\ua9cd\\ua9de-\\ua9df\\uaa5c-\\uaa5f\\uaade-\\uaadf\\uaaf0-\\uaaf1\\uabeb\\ufd3e-\\ufd3f\\ufe10-\\ufe19\\ufe30-\\ufe52\\ufe54-\\ufe61\\ufe63\\ufe68\\ufe6a-\\ufe6b\\uff01-\\uff03\\uff05-\\uff0a\\uff0c-\\uff0f\\uff1a-\\uff1b\\uff1f-\\uff20\\uff3b-\\uff3d\\uff3f\\uff5b\\uff5d\\uff5f-\\uff65]|\\ud800[\\udd00-\\udd02\\udf9f\\udfd0]|\\ud801[\\udd6f]|\\ud802[\\udc57\\udd1f\\udd3f\\ude50-\\ude58\\ude7f\\udef0-\\udef6\\udf39-\\udf3f\\udf99-\\udf9c]|\\ud803[\\udf55-\\udf59]|\\ud804[\\udc47-\\udc4d\\udcbb-\\udcbc\\udcbe-\\udcc1\\udd40-\\udd43\\udd74-\\udd75\\uddc5-\\uddc8\\uddcd\\udddb\\udddd-\\udddf\\ude38-\\ude3d\\udea9]|\\ud805[\\udc4b-\\udc4f\\udc5b\\udc5d\\udcc6\\uddc1-\\uddd7\\ude41-\\ude43\\ude60-\\ude6c\\udf3c-\\udf3e]|\\ud806[\\udc3b\\udde2\\ude3f-\\ude46\\ude9a-\\ude9c\\ude9e-\\udea2]|\\ud807[\\udc41-\\udc45\\udc70-\\udc71\\udef7-\\udef8\\udfff]|\\ud809[\\udc70-\\udc74]|\\ud81a[\\ude6e-\\ude6f\\udef5\\udf37-\\udf3b\\udf44]|\\ud81b[\\ude97-\\ude9a\\udfe2]|\\ud82f[\\udc9f]|\\ud836[\\ude87-\\ude8b]|\\ud83a[\\udd5e-\\udd5f]"
};
const {
cjkPattern,
kPattern,
punctuationPattern
} = json$1;
const {
getLast: getLast$4
} = util$1;
const INLINE_NODE_TYPES = ["liquidNode", "inlineCode", "emphasis", "strong", "delete", "link", "linkReference", "image", "imageReference", "footnote", "footnoteReference", "sentence", "whitespace", "word", "break", "inlineMath"];
const INLINE_NODE_WRAPPER_TYPES = INLINE_NODE_TYPES.concat(["tableCell", "paragraph", "heading"]);
const kRegex = new RegExp(kPattern);
const punctuationRegex = new RegExp(punctuationPattern);
/**
* split text into whitespaces and words
* @param {string} text
* @return {Array<{ type: "whitespace", value: " " | "\n" | "" } | { type: "word", value: string }>}
*/
function splitText(text, options) {
const KIND_NON_CJK = "non-cjk";
const KIND_CJ_LETTER = "cj-letter";
const KIND_K_LETTER = "k-letter";
const KIND_CJK_PUNCTUATION = "cjk-punctuation";
const nodes = [];
(options.proseWrap === "preserve" ? text : text.replace(new RegExp("(".concat(cjkPattern, ")\n(").concat(cjkPattern, ")"), "g"), "$1$2")).split(/([ \t\n]+)/).forEach((token, index, tokens) => {
// whitespace
if (index % 2 === 1) {
nodes.push({
type: "whitespace",
value: /\n/.test(token) ? "\n" : " "
});
return;
} // word separated by whitespace
if ((index === 0 || index === tokens.length - 1) && token === "") {
return;
}
token.split(new RegExp("(".concat(cjkPattern, ")"))).forEach((innerToken, innerIndex, innerTokens) => {
if ((innerIndex === 0 || innerIndex === innerTokens.length - 1) && innerToken === "") {
return;
} // non-CJK word
if (innerIndex % 2 === 0) {
if (innerToken !== "") {
appendNode({
type: "word",
value: innerToken,
kind: KIND_NON_CJK,
hasLeadingPunctuation: punctuationRegex.test(innerToken[0]),
hasTrailingPunctuation: punctuationRegex.test(getLast$4(innerToken))
});
}
return;
} // CJK character
appendNode(punctuationRegex.test(innerToken) ? {
type: "word",
value: innerToken,
kind: KIND_CJK_PUNCTUATION,
hasLeadingPunctuation: true,
hasTrailingPunctuation: true
} : {
type: "word",
value: innerToken,
kind: kRegex.test(innerToken) ? KIND_K_LETTER : KIND_CJ_LETTER,
hasLeadingPunctuation: false,
hasTrailingPunctuation: false
});
});
});
return nodes;
function appendNode(node) {
const lastNode = getLast$4(nodes);
if (lastNode && lastNode.type === "word") {
if (lastNode.kind === KIND_NON_CJK && node.kind === KIND_CJ_LETTER && !lastNode.hasTrailingPunctuation || lastNode.kind === KIND_CJ_LETTER && node.kind === KIND_NON_CJK && !node.hasLeadingPunctuation) {
nodes.push({
type: "whitespace",
value: " "
});
} else if (!isBetween(KIND_NON_CJK, KIND_CJK_PUNCTUATION) && // disallow leading/trailing full-width whitespace
![lastNode.value, node.value].some(value => /\u3000/.test(value))) {
nodes.push({
type: "whitespace",
value: ""
});
}
}
nodes.push(node);
function isBetween(kind1, kind2) {
return lastNode.kind === kind1 && node.kind === kind2 || lastNode.kind === kind2 && node.kind === kind1;
}
}
}
function getOrderedListItemInfo(orderListItem, originalText) {
const [, numberText, marker, leadingSpaces] = originalText.slice(orderListItem.position.start.offset, orderListItem.position.end.offset).match(/^\s*(\d+)(\.|\))(\s*)/);
return {
numberText,
marker,
leadingSpaces
};
}
function hasGitDiffFriendlyOrderedList(node, options) {
if (!node.ordered) {
return false;
}
if (node.children.length < 2) {
return false;
}
const firstNumber = Number(getOrderedListItemInfo(node.children[0], options.originalText).numberText);
const secondNumber = Number(getOrderedListItemInfo(node.children[1], options.originalText).numberText);
if (firstNumber === 0 && node.children.length > 2) {
const thirdNumber = Number(getOrderedListItemInfo(node.children[2], options.originalText).numberText);
return secondNumber === 1 && thirdNumber === 1;
}
return secondNumber === 1;
} // workaround for https://github.com/remarkjs/remark/issues/351
// leading and trailing newlines are stripped by remark
function getFencedCodeBlockValue(node, originalText) {
const text = originalText.slice(node.position.start.offset, node.position.end.offset);
const leadingSpaceCount = text.match(/^\s*/)[0].length;
const replaceRegex = new RegExp("^\\s{0,".concat(leadingSpaceCount, "}"));
const lineContents = text.split("\n");
const markerStyle = text[leadingSpaceCount]; // ` or ~
const marker = text.slice(leadingSpaceCount).match(new RegExp("^[".concat(markerStyle, "]+")))[0]; // https://spec.commonmark.org/0.28/#example-104: Closing fences may be indented by 0-3 spaces
// https://spec.commonmark.org/0.28/#example-93: The closing code fence must be at least as long as the opening fence
const hasEndMarker = new RegExp("^\\s{0,3}".concat(marker)).test(lineContents[lineContents.length - 1].slice(getIndent(lineContents.length - 1)));
return lineContents.slice(1, hasEndMarker ? -1 : undefined).map((x, i) => x.slice(getIndent(i + 1)).replace(replaceRegex, "")).join("\n");
function getIndent(lineIndex) {
return node.position.indent[lineIndex - 1] - 1;
}
}
function mapAst(ast, handler) {
return function preorder(node, index, parentStack) {
parentStack = parentStack || [];
const newNode = Object.assign({}, handler(node, index, parentStack));
if (newNode.children) {
newNode.children = newNode.children.map((child, index) => {
return preorder(child, index, [newNode].concat(parentStack));
});
}
return newNode;
}(ast, null, null);
}
var utils$6 = {
mapAst,
splitText,
punctuationPattern,
getFencedCodeBlockValue,
getOrderedListItemInfo,
hasGitDiffFriendlyOrderedList,
INLINE_NODE_TYPES,
INLINE_NODE_WRAPPER_TYPES
};
const {
builders: {
hardline: hardline$b,
literalline: literalline$5,
concat: concat$f,
markAsRoot: markAsRoot$3
},
utils: {
mapDoc: mapDoc$4
}
} = document;
const {
getFencedCodeBlockValue: getFencedCodeBlockValue$1
} = utils$6;
function embed$4(path, print, textToDoc, options) {
const node = path.getValue();
if (node.type === "code" && node.lang !== null) {
// only look for the first string so as to support [markdown-preview-enhanced](https://shd101wyy.github.io/markdown-preview-enhanced/#/code-chunk)
const langMatch = node.lang.match(/^[A-Za-z0-9_-]+/);
const lang = langMatch ? langMatch[0] : "";
const parser = getParserName(lang);
if (parser) {
const styleUnit = options.__inJsTemplate ? "~" : "`";
const style = styleUnit.repeat(Math.max(3, util$1.getMaxContinuousCount(node.value, styleUnit) + 1));
const doc = textToDoc(getFencedCodeBlockValue$1(node, options.originalText), {
parser
});
return markAsRoot$3(concat$f([style, node.lang, hardline$b, replaceNewlinesWithLiterallines(doc), style]));
}
}
if (node.type === "yaml") {
return markAsRoot$3(concat$f(["---", hardline$b, node.value && node.value.trim() ? replaceNewlinesWithLiterallines(textToDoc(node.value, {
parser: "yaml"
})) : "", "---"]));
} // MDX
switch (node.type) {
case "importExport":
return textToDoc(node.value, {
parser: "babel"
});
case "jsx":
return textToDoc("<$>".concat(node.value, "$>"), {
parser: "__js_expression",
rootMarker: "mdx"
});
}
return null;
function getParserName(lang) {
const supportInfo = support.getSupportInfo({
plugins: options.plugins
});
const language = supportInfo.languages.find(language => language.name.toLowerCase() === lang || language.aliases && language.aliases.includes(lang) || language.extensions && language.extensions.find(ext => ext === ".".concat(lang)));
if (language) {
return language.parsers[0];
}
return null;
}
function replaceNewlinesWithLiterallines(doc) {
return mapDoc$4(doc, currentDoc => typeof currentDoc === "string" && currentDoc.includes("\n") ? concat$f(currentDoc.split(/(\n)/g).map((v, i) => i % 2 === 0 ? v : literalline$5)) : currentDoc);
}
}
var embed_1$2 = embed$4;
const pragmas = ["format", "prettier"];
function startWithPragma(text) {
const pragma = "@(".concat(pragmas.join("|"), ")");
const regex = new RegExp([""), "")].join("|"), "m");
const matched = text.match(regex);
return matched && matched.index === 0;
}
var pragma$4 = {
startWithPragma,
hasPragma: text => startWithPragma(frontMatter(text).content.trimStart()),
insertPragma: text => {
const extracted = frontMatter(text);
const pragma = "");
return extracted.frontMatter ? "".concat(extracted.frontMatter.raw, "\n\n").concat(pragma, "\n\n").concat(extracted.content) : "".concat(pragma, "\n\n").concat(extracted.content);
}
};
const {
getOrderedListItemInfo: getOrderedListItemInfo$1,
mapAst: mapAst$1,
splitText: splitText$1
} = utils$6; // 0x0 ~ 0x10ffff
// eslint-disable-next-line no-control-regex
const isSingleCharRegex = /^([\u0000-\uffff]|[\ud800-\udbff][\udc00-\udfff])$/;
function preprocess$2(ast, options) {
ast = restoreUnescapedCharacter(ast, options);
ast = mergeContinuousTexts(ast);
ast = transformInlineCode(ast);
ast = transformIndentedCodeblockAndMarkItsParentList(ast, options);
ast = markAlignedList(ast, options);
ast = splitTextIntoSentences(ast, options);
ast = transformImportExport(ast);
ast = mergeContinuousImportExport(ast);
return ast;
}
function transformImportExport(ast) {
return mapAst$1(ast, node => {
if (node.type !== "import" && node.type !== "export") {
return node;
}
return Object.assign({}, node, {
type: "importExport"
});
});
}
function transformInlineCode(ast) {
return mapAst$1(ast, node => {
if (node.type !== "inlineCode") {
return node;
}
return Object.assign({}, node, {
value: node.value.replace(/\s+/g, " ")
});
});
}
function restoreUnescapedCharacter(ast, options) {
return mapAst$1(ast, node => {
return node.type !== "text" ? node : Object.assign({}, node, {
value: node.value !== "*" && node.value !== "_" && node.value !== "$" && // handle these cases in printer
isSingleCharRegex.test(node.value) && node.position.end.offset - node.position.start.offset !== node.value.length ? options.originalText.slice(node.position.start.offset, node.position.end.offset) : node.value
});
});
}
function mergeContinuousImportExport(ast) {
return mergeChildren(ast, (prevNode, node) => prevNode.type === "importExport" && node.type === "importExport", (prevNode, node) => ({
type: "importExport",
value: prevNode.value + "\n\n" + node.value,
position: {
start: prevNode.position.start,
end: node.position.end
}
}));
}
function mergeChildren(ast, shouldMerge, mergeNode) {
return mapAst$1(ast, node => {
if (!node.children) {
return node;
}
const children = node.children.reduce((current, child) => {
const lastChild = current[current.length - 1];
if (lastChild && shouldMerge(lastChild, child)) {
current.splice(-1, 1, mergeNode(lastChild, child));
} else {
current.push(child);
}
return current;
}, []);
return Object.assign({}, node, {
children
});
});
}
function mergeContinuousTexts(ast) {
return mergeChildren(ast, (prevNode, node) => prevNode.type === "text" && node.type === "text", (prevNode, node) => ({
type: "text",
value: prevNode.value + node.value,
position: {
start: prevNode.position.start,
end: node.position.end
}
}));
}
function splitTextIntoSentences(ast, options) {
return mapAst$1(ast, (node, index, [parentNode]) => {
if (node.type !== "text") {
return node;
}
let {
value
} = node;
if (parentNode.type === "paragraph") {
if (index === 0) {
value = value.trimStart();
}
if (index === parentNode.children.length - 1) {
value = value.trimEnd();
}
}
return {
type: "sentence",
position: node.position,
children: splitText$1(value, options)
};
});
}
function transformIndentedCodeblockAndMarkItsParentList(ast, options) {
return mapAst$1(ast, (node, index, parentStack) => {
if (node.type === "code") {
// the first char may point to `\n`, e.g. `\n\t\tbar`, just ignore it
const isIndented = /^\n?( {4,}|\t)/.test(options.originalText.slice(node.position.start.offset, node.position.end.offset));
node.isIndented = isIndented;
if (isIndented) {
for (let i = 0; i < parentStack.length; i++) {
const parent = parentStack[i]; // no need to check checked items
if (parent.hasIndentedCodeblock) {
break;
}
if (parent.type === "list") {
parent.hasIndentedCodeblock = true;
}
}
}
}
return node;
});
}
function markAlignedList(ast, options) {
return mapAst$1(ast, (node, index, parentStack) => {
if (node.type === "list" && node.children.length !== 0) {
// if one of its parents is not aligned, it's not possible to be aligned in sub-lists
for (let i = 0; i < parentStack.length; i++) {
const parent = parentStack[i];
if (parent.type === "list" && !parent.isAligned) {
node.isAligned = false;
return node;
}
}
node.isAligned = isAligned(node);
}
return node;
});
function getListItemStart(listItem) {
return listItem.children.length === 0 ? -1 : listItem.children[0].position.start.column - 1;
}
function isAligned(list) {
if (!list.ordered) {
/**
* - 123
* - 123
*/
return true;
}
const [firstItem, secondItem] = list.children;
const firstInfo = getOrderedListItemInfo$1(firstItem, options.originalText);
if (firstInfo.leadingSpaces.length > 1) {
/**
* 1. 123
*
* 1. 123
* 1. 123
*/
return true;
}
const firstStart = getListItemStart(firstItem);
if (firstStart === -1) {
/**
* 1.
*
* 1.
* 1.
*/
return false;
}
if (list.children.length === 1) {
/**
* aligned:
*
* 11. 123
*
* not aligned:
*
* 1. 123
*/
return firstStart % options.tabWidth === 0;
}
const secondStart = getListItemStart(secondItem);
if (firstStart !== secondStart) {
/**
* 11. 123
* 1. 123
*
* 1. 123
* 11. 123
*/
return false;
}
if (firstStart % options.tabWidth === 0) {
/**
* 11. 123
* 12. 123
*/
return true;
}
/**
* aligned:
*
* 11. 123
* 1. 123
*
* not aligned:
*
* 1. 123
* 2. 123
*/
const secondInfo = getOrderedListItemInfo$1(secondItem, options.originalText);
return secondInfo.leadingSpaces.length > 1;
}
}
var preprocess_1$2 = preprocess$2;
const {
builders: {
breakParent: breakParent$4,
concat: concat$g,
join: join$b,
line: line$a,
literalline: literalline$6,
markAsRoot: markAsRoot$4,
hardline: hardline$c,
softline: softline$7,
ifBreak: ifBreak$7,
fill: fill$5,
align: align$2,
indent: indent$9,
group: group$f
},
utils: {
mapDoc: mapDoc$5
},
printer: {
printDocToString: printDocToString$3
}
} = document;
const {
getFencedCodeBlockValue: getFencedCodeBlockValue$2,
hasGitDiffFriendlyOrderedList: hasGitDiffFriendlyOrderedList$1,
splitText: splitText$2,
punctuationPattern: punctuationPattern$1,
INLINE_NODE_TYPES: INLINE_NODE_TYPES$1,
INLINE_NODE_WRAPPER_TYPES: INLINE_NODE_WRAPPER_TYPES$1
} = utils$6;
const {
replaceEndOfLineWith: replaceEndOfLineWith$2
} = util$1;
const TRAILING_HARDLINE_NODES = ["importExport"];
const SINGLE_LINE_NODE_TYPES = ["heading", "tableCell", "link"];
const SIBLING_NODE_TYPES = ["listItem", "definition", "footnoteDefinition"];
function genericPrint$5(path, options, print) {
const node = path.getValue();
if (shouldRemainTheSameContent(path)) {
return concat$g(splitText$2(options.originalText.slice(node.position.start.offset, node.position.end.offset), options).map(node => node.type === "word" ? node.value : node.value === "" ? "" : printLine(path, node.value, options)));
}
switch (node.type) {
case "root":
if (node.children.length === 0) {
return "";
}
return concat$g([normalizeDoc(printRoot(path, options, print)), !TRAILING_HARDLINE_NODES.includes(getLastDescendantNode(node).type) ? hardline$c : ""]);
case "paragraph":
return printChildren$2(path, options, print, {
postprocessor: fill$5
});
case "sentence":
return printChildren$2(path, options, print);
case "word":
return node.value.replace(/[*$]/g, "\\$&") // escape all `*` and `$` (math)
.replace(new RegExp(["(^|".concat(punctuationPattern$1, ")(_+)"), "(_+)(".concat(punctuationPattern$1, "|$)")].join("|"), "g"), (_, text1, underscore1, underscore2, text2) => (underscore1 ? "".concat(text1).concat(underscore1) : "".concat(underscore2).concat(text2)).replace(/_/g, "\\_"));
// escape all `_` except concating with non-punctuation, e.g. `1_2_3` is not considered emphasis
case "whitespace":
{
const parentNode = path.getParentNode();
const index = parentNode.children.indexOf(node);
const nextNode = parentNode.children[index + 1];
const proseWrap = // leading char that may cause different syntax
nextNode && /^>|^([-+*]|#{1,6}|[0-9]+[.)])$/.test(nextNode.value) ? "never" : options.proseWrap;
return printLine(path, node.value, {
proseWrap
});
}
case "emphasis":
{
const parentNode = path.getParentNode();
const index = parentNode.children.indexOf(node);
const prevNode = parentNode.children[index - 1];
const nextNode = parentNode.children[index + 1];
const hasPrevOrNextWord = // `1*2*3` is considered emphasis but `1_2_3` is not
prevNode && prevNode.type === "sentence" && prevNode.children.length > 0 && util$1.getLast(prevNode.children).type === "word" && !util$1.getLast(prevNode.children).hasTrailingPunctuation || nextNode && nextNode.type === "sentence" && nextNode.children.length > 0 && nextNode.children[0].type === "word" && !nextNode.children[0].hasLeadingPunctuation;
const style = hasPrevOrNextWord || getAncestorNode$2(path, "emphasis") ? "*" : "_";
return concat$g([style, printChildren$2(path, options, print), style]);
}
case "strong":
return concat$g(["**", printChildren$2(path, options, print), "**"]);
case "delete":
return concat$g(["~~", printChildren$2(path, options, print), "~~"]);
case "inlineCode":
{
const backtickCount = util$1.getMinNotPresentContinuousCount(node.value, "`");
const style = "`".repeat(backtickCount || 1);
const gap = backtickCount ? " " : "";
return concat$g([style, gap, node.value, gap, style]);
}
case "link":
switch (options.originalText[node.position.start.offset]) {
case "<":
{
const mailto = "mailto:";
const url = // is parsed as { url: "mailto:hello@example.com" }
node.url.startsWith(mailto) && options.originalText.slice(node.position.start.offset + 1, node.position.start.offset + 1 + mailto.length) !== mailto ? node.url.slice(mailto.length) : node.url;
return concat$g(["<", url, ">"]);
}
case "[":
return concat$g(["[", printChildren$2(path, options, print), "](", printUrl(node.url, ")"), printTitle(node.title, options), ")"]);
default:
return options.originalText.slice(node.position.start.offset, node.position.end.offset);
}
case "image":
return concat$g([""), printTitle(node.title, options), ")"]);
case "blockquote":
return concat$g(["> ", align$2("> ", printChildren$2(path, options, print))]);
case "heading":
return concat$g(["#".repeat(node.depth) + " ", printChildren$2(path, options, print)]);
case "code":
{
if (node.isIndented) {
// indented code block
const alignment = " ".repeat(4);
return align$2(alignment, concat$g([alignment, concat$g(replaceEndOfLineWith$2(node.value, hardline$c))]));
} // fenced code block
const styleUnit = options.__inJsTemplate ? "~" : "`";
const style = styleUnit.repeat(Math.max(3, util$1.getMaxContinuousCount(node.value, styleUnit) + 1));
return concat$g([style, node.lang || "", hardline$c, concat$g(replaceEndOfLineWith$2(getFencedCodeBlockValue$2(node, options.originalText), hardline$c)), hardline$c, style]);
}
case "yaml":
case "toml":
return options.originalText.slice(node.position.start.offset, node.position.end.offset);
case "html":
{
const parentNode = path.getParentNode();
const value = parentNode.type === "root" && util$1.getLast(parentNode.children) === node ? node.value.trimEnd() : node.value;
const isHtmlComment = /^$/.test(value);
return concat$g(replaceEndOfLineWith$2(value, isHtmlComment ? hardline$c : markAsRoot$4(literalline$6)));
}
case "list":
{
const nthSiblingIndex = getNthListSiblingIndex(node, path.getParentNode());
const isGitDiffFriendlyOrderedList = hasGitDiffFriendlyOrderedList$1(node, options);
return printChildren$2(path, options, print, {
processor: (childPath, index) => {
const prefix = getPrefix();
const childNode = childPath.getValue();
if (childNode.children.length === 2 && childNode.children[1].type === "html" && childNode.children[0].position.start.column !== childNode.children[1].position.start.column) {
return concat$g([prefix, printListItem(childPath, options, print, prefix)]);
}
return concat$g([prefix, align$2(" ".repeat(prefix.length), printListItem(childPath, options, print, prefix))]);
function getPrefix() {
const rawPrefix = node.ordered ? (index === 0 ? node.start : isGitDiffFriendlyOrderedList ? 1 : node.start + index) + (nthSiblingIndex % 2 === 0 ? ". " : ") ") : nthSiblingIndex % 2 === 0 ? "- " : "* ";
return node.isAligned ||
/* workaround for https://github.com/remarkjs/remark/issues/315 */
node.hasIndentedCodeblock ? alignListPrefix(rawPrefix, options) : rawPrefix;
}
}
});
}
case "thematicBreak":
{
const counter = getAncestorCounter$1(path, "list");
if (counter === -1) {
return "---";
}
const nthSiblingIndex = getNthListSiblingIndex(path.getParentNode(counter), path.getParentNode(counter + 1));
return nthSiblingIndex % 2 === 0 ? "***" : "---";
}
case "linkReference":
return concat$g(["[", printChildren$2(path, options, print), "]", node.referenceType === "full" ? concat$g(["[", node.identifier, "]"]) : node.referenceType === "collapsed" ? "[]" : ""]);
case "imageReference":
switch (node.referenceType) {
case "full":
return concat$g(["![", node.alt || "", "][", node.identifier, "]"]);
default:
return concat$g(["![", node.alt, "]", node.referenceType === "collapsed" ? "[]" : ""]);
}
case "definition":
{
const lineOrSpace = options.proseWrap === "always" ? line$a : " ";
return group$f(concat$g([concat$g(["[", node.identifier, "]:"]), indent$9(concat$g([lineOrSpace, printUrl(node.url), node.title === null ? "" : concat$g([lineOrSpace, printTitle(node.title, options, false)])]))]));
}
case "footnote":
return concat$g(["[^", printChildren$2(path, options, print), "]"]);
case "footnoteReference":
return concat$g(["[^", node.identifier, "]"]);
case "footnoteDefinition":
{
const nextNode = path.getParentNode().children[path.getName() + 1];
const shouldInlineFootnote = node.children.length === 1 && node.children[0].type === "paragraph" && (options.proseWrap === "never" || options.proseWrap === "preserve" && node.children[0].position.start.line === node.children[0].position.end.line);
return concat$g(["[^", node.identifier, "]: ", shouldInlineFootnote ? printChildren$2(path, options, print) : group$f(concat$g([align$2(" ".repeat(options.tabWidth), printChildren$2(path, options, print, {
processor: (childPath, index) => {
return index === 0 ? group$f(concat$g([softline$7, childPath.call(print)])) : childPath.call(print);
}
})), nextNode && nextNode.type === "footnoteDefinition" ? softline$7 : ""]))]);
}
case "table":
return printTable(path, options, print);
case "tableCell":
return printChildren$2(path, options, print);
case "break":
return /\s/.test(options.originalText[node.position.start.offset]) ? concat$g([" ", markAsRoot$4(literalline$6)]) : concat$g(["\\", hardline$c]);
case "liquidNode":
return concat$g(replaceEndOfLineWith$2(node.value, hardline$c));
// MDX
case "importExport":
case "jsx":
return node.value;
// fallback to the original text if multiparser failed
case "math":
return concat$g(["$$", hardline$c, node.value ? concat$g([concat$g(replaceEndOfLineWith$2(node.value, hardline$c)), hardline$c]) : "", "$$"]);
case "inlineMath":
{
// remark-math trims content but we don't want to remove whitespaces
// since it's very possible that it's recognized as math accidentally
return options.originalText.slice(options.locStart(node), options.locEnd(node));
}
case "tableRow": // handled in "table"
case "listItem": // handled in "list"
default:
throw new Error("Unknown markdown type ".concat(JSON.stringify(node.type)));
}
}
function printListItem(path, options, print, listPrefix) {
const node = path.getValue();
const prefix = node.checked === null ? "" : node.checked ? "[x] " : "[ ] ";
return concat$g([prefix, printChildren$2(path, options, print, {
processor: (childPath, index) => {
if (index === 0 && childPath.getValue().type !== "list") {
return align$2(" ".repeat(prefix.length), childPath.call(print));
}
const alignment = " ".repeat(clamp(options.tabWidth - listPrefix.length, 0, 3) // 4+ will cause indented code block
);
return concat$g([alignment, align$2(alignment, childPath.call(print))]);
}
})]);
}
function alignListPrefix(prefix, options) {
const additionalSpaces = getAdditionalSpaces();
return prefix + " ".repeat(additionalSpaces >= 4 ? 0 : additionalSpaces // 4+ will cause indented code block
);
function getAdditionalSpaces() {
const restSpaces = prefix.length % options.tabWidth;
return restSpaces === 0 ? 0 : options.tabWidth - restSpaces;
}
}
function getNthListSiblingIndex(node, parentNode) {
return getNthSiblingIndex(node, parentNode, siblingNode => siblingNode.ordered === node.ordered);
}
function getNthSiblingIndex(node, parentNode, condition) {
condition = condition || (() => true);
let index = -1;
for (const childNode of parentNode.children) {
if (childNode.type === node.type && condition(childNode)) {
index++;
} else {
index = -1;
}
if (childNode === node) {
return index;
}
}
}
function getAncestorCounter$1(path, typeOrTypes) {
const types = [].concat(typeOrTypes);
let counter = -1;
let ancestorNode;
while (ancestorNode = path.getParentNode(++counter)) {
if (types.includes(ancestorNode.type)) {
return counter;
}
}
return -1;
}
function getAncestorNode$2(path, typeOrTypes) {
const counter = getAncestorCounter$1(path, typeOrTypes);
return counter === -1 ? null : path.getParentNode(counter);
}
function printLine(path, value, options) {
if (options.proseWrap === "preserve" && value === "\n") {
return hardline$c;
}
const isBreakable = options.proseWrap === "always" && !getAncestorNode$2(path, SINGLE_LINE_NODE_TYPES);
return value !== "" ? isBreakable ? line$a : " " : isBreakable ? softline$7 : "";
}
function printTable(path, options, print) {
const hardlineWithoutBreakParent = hardline$c.parts[0];
const node = path.getValue();
const contents = []; // { [rowIndex: number]: { [columnIndex: number]: string } }
path.map(rowPath => {
const rowContents = [];
rowPath.map(cellPath => {
rowContents.push(printDocToString$3(cellPath.call(print), options).formatted);
}, "children");
contents.push(rowContents);
}, "children"); // Get the width of each column
const columnMaxWidths = contents.reduce((currentWidths, rowContents) => currentWidths.map((width, columnIndex) => Math.max(width, util$1.getStringWidth(rowContents[columnIndex]))), contents[0].map(() => 3) // minimum width = 3 (---, :--, :-:, --:)
);
const alignedTable = join$b(hardlineWithoutBreakParent, [printRow(contents[0]), printSeparator(), join$b(hardlineWithoutBreakParent, contents.slice(1).map(rowContents => printRow(rowContents)))]);
if (options.proseWrap !== "never") {
return concat$g([breakParent$4, alignedTable]);
} // Only if the --prose-wrap never is set and it exceeds the print width.
const compactTable = join$b(hardlineWithoutBreakParent, [printRow(contents[0],
/* isCompact */
true), printSeparator(
/* isCompact */
true), join$b(hardlineWithoutBreakParent, contents.slice(1).map(rowContents => printRow(rowContents,
/* isCompact */
true)))]);
return concat$g([breakParent$4, group$f(ifBreak$7(compactTable, alignedTable))]);
function printSeparator(isCompact) {
return concat$g(["| ", join$b(" | ", columnMaxWidths.map((width, index) => {
const spaces = isCompact ? 3 : width;
switch (node.align[index]) {
case "left":
return ":" + "-".repeat(spaces - 1);
case "right":
return "-".repeat(spaces - 1) + ":";
case "center":
return ":" + "-".repeat(spaces - 2) + ":";
default:
return "-".repeat(spaces);
}
})), " |"]);
}
function printRow(rowContents, isCompact) {
return concat$g(["| ", join$b(" | ", isCompact ? rowContents : rowContents.map((rowContent, columnIndex) => {
switch (node.align[columnIndex]) {
case "right":
return alignRight(rowContent, columnMaxWidths[columnIndex]);
case "center":
return alignCenter(rowContent, columnMaxWidths[columnIndex]);
default:
return alignLeft(rowContent, columnMaxWidths[columnIndex]);
}
})), " |"]);
}
function alignLeft(text, width) {
const spaces = width - util$1.getStringWidth(text);
return concat$g([text, " ".repeat(spaces)]);
}
function alignRight(text, width) {
const spaces = width - util$1.getStringWidth(text);
return concat$g([" ".repeat(spaces), text]);
}
function alignCenter(text, width) {
const spaces = width - util$1.getStringWidth(text);
const left = Math.floor(spaces / 2);
const right = spaces - left;
return concat$g([" ".repeat(left), text, " ".repeat(right)]);
}
}
function printRoot(path, options, print) {
/** @typedef {{ index: number, offset: number }} IgnorePosition */
/** @type {Array<{start: IgnorePosition, end: IgnorePosition}>} */
const ignoreRanges = [];
/** @type {IgnorePosition | null} */
let ignoreStart = null;
const {
children
} = path.getValue();
children.forEach((childNode, index) => {
switch (isPrettierIgnore$1(childNode)) {
case "start":
if (ignoreStart === null) {
ignoreStart = {
index,
offset: childNode.position.end.offset
};
}
break;
case "end":
if (ignoreStart !== null) {
ignoreRanges.push({
start: ignoreStart,
end: {
index,
offset: childNode.position.start.offset
}
});
ignoreStart = null;
}
break;
}
});
return printChildren$2(path, options, print, {
processor: (childPath, index) => {
if (ignoreRanges.length !== 0) {
const ignoreRange = ignoreRanges[0];
if (index === ignoreRange.start.index) {
return concat$g([children[ignoreRange.start.index].value, options.originalText.slice(ignoreRange.start.offset, ignoreRange.end.offset), children[ignoreRange.end.index].value]);
}
if (ignoreRange.start.index < index && index < ignoreRange.end.index) {
return false;
}
if (index === ignoreRange.end.index) {
ignoreRanges.shift();
return false;
}
}
return childPath.call(print);
}
});
}
function printChildren$2(path, options, print, events) {
events = events || {};
const postprocessor = events.postprocessor || concat$g;
const processor = events.processor || (childPath => childPath.call(print));
const node = path.getValue();
const parts = [];
let lastChildNode;
path.map((childPath, index) => {
const childNode = childPath.getValue();
const result = processor(childPath, index);
if (result !== false) {
const data = {
parts,
prevNode: lastChildNode,
parentNode: node,
options
};
if (!shouldNotPrePrintHardline(childNode, data)) {
parts.push(hardline$c);
if (lastChildNode && TRAILING_HARDLINE_NODES.includes(lastChildNode.type)) {
if (shouldPrePrintTripleHardline(childNode, data)) {
parts.push(hardline$c);
}
} else {
if (shouldPrePrintDoubleHardline(childNode, data) || shouldPrePrintTripleHardline(childNode, data)) {
parts.push(hardline$c);
}
if (shouldPrePrintTripleHardline(childNode, data)) {
parts.push(hardline$c);
}
}
}
parts.push(result);
lastChildNode = childNode;
}
}, "children");
return postprocessor(parts);
}
function getLastDescendantNode(node) {
let current = node;
while (current.children && current.children.length !== 0) {
current = current.children[current.children.length - 1];
}
return current;
}
/** @return {false | 'next' | 'start' | 'end'} */
function isPrettierIgnore$1(node) {
if (node.type !== "html") {
return false;
}
const match = node.value.match(/^$/);
return match === null ? false : match[1] ? match[1] : "next";
}
function shouldNotPrePrintHardline(node, data) {
const isFirstNode = data.parts.length === 0;
const isInlineNode = INLINE_NODE_TYPES$1.includes(node.type);
const isInlineHTML = node.type === "html" && INLINE_NODE_WRAPPER_TYPES$1.includes(data.parentNode.type);
return isFirstNode || isInlineNode || isInlineHTML;
}
function shouldPrePrintDoubleHardline(node, data) {
const isSequence = (data.prevNode && data.prevNode.type) === node.type;
const isSiblingNode = isSequence && SIBLING_NODE_TYPES.includes(node.type);
const isInTightListItem = data.parentNode.type === "listItem" && !data.parentNode.loose;
const isPrevNodeLooseListItem = data.prevNode && data.prevNode.type === "listItem" && data.prevNode.loose;
const isPrevNodePrettierIgnore = isPrettierIgnore$1(data.prevNode) === "next";
const isBlockHtmlWithoutBlankLineBetweenPrevHtml = node.type === "html" && data.prevNode && data.prevNode.type === "html" && data.prevNode.position.end.line + 1 === node.position.start.line;
const isHtmlDirectAfterListItem = node.type === "html" && data.parentNode.type === "listItem" && data.prevNode && data.prevNode.type === "paragraph" && data.prevNode.position.end.line + 1 === node.position.start.line;
return isPrevNodeLooseListItem || !(isSiblingNode || isInTightListItem || isPrevNodePrettierIgnore || isBlockHtmlWithoutBlankLineBetweenPrevHtml || isHtmlDirectAfterListItem);
}
function shouldPrePrintTripleHardline(node, data) {
const isPrevNodeList = data.prevNode && data.prevNode.type === "list";
const isIndentedCode = node.type === "code" && node.isIndented;
return isPrevNodeList && isIndentedCode;
}
function shouldRemainTheSameContent(path) {
const ancestorNode = getAncestorNode$2(path, ["linkReference", "imageReference"]);
return ancestorNode && (ancestorNode.type !== "linkReference" || ancestorNode.referenceType !== "full");
}
function normalizeDoc(doc) {
return mapDoc$5(doc, currentDoc => {
if (!currentDoc.parts) {
return currentDoc;
}
if (currentDoc.type === "concat" && currentDoc.parts.length === 1) {
return currentDoc.parts[0];
}
const parts = currentDoc.parts.reduce((parts, part) => {
if (part.type === "concat") {
parts.push(...part.parts);
} else if (part !== "") {
parts.push(part);
}
return parts;
}, []);
return Object.assign({}, currentDoc, {
parts: normalizeParts$2(parts)
});
});
}
function printUrl(url, dangerousCharOrChars) {
const dangerousChars = [" "].concat(dangerousCharOrChars || []);
return new RegExp(dangerousChars.map(x => "\\".concat(x)).join("|")).test(url) ? "<".concat(url, ">") : url;
}
function printTitle(title, options, printSpace) {
if (printSpace == null) {
printSpace = true;
}
if (!title) {
return "";
}
if (printSpace) {
return " " + printTitle(title, options, false);
}
if (title.includes('"') && title.includes("'") && !title.includes(")")) {
return "(".concat(title, ")"); // avoid escaped quotes
} // faster than using RegExps: https://jsperf.com/performance-of-match-vs-split
const singleCount = title.split("'").length - 1;
const doubleCount = title.split('"').length - 1;
const quote = singleCount > doubleCount ? '"' : doubleCount > singleCount ? "'" : options.singleQuote ? "'" : '"';
title = title.replace(new RegExp("(".concat(quote, ")"), "g"), "\\$1");
return "".concat(quote).concat(title).concat(quote);
}
function normalizeParts$2(parts) {
return parts.reduce((current, part) => {
const lastPart = util$1.getLast(current);
if (typeof lastPart === "string" && typeof part === "string") {
current.splice(-1, 1, lastPart + part);
} else {
current.push(part);
}
return current;
}, []);
}
function clamp(value, min, max) {
return value < min ? min : value > max ? max : value;
}
function clean$6(ast, newObj, parent) {
delete newObj.position;
delete newObj.raw; // front-matter
// for codeblock
if (ast.type === "code" || ast.type === "yaml" || ast.type === "import" || ast.type === "export" || ast.type === "jsx") {
delete newObj.value;
}
if (ast.type === "list") {
delete newObj.isAligned;
} // texts can be splitted or merged
if (ast.type === "text") {
return null;
}
if (ast.type === "inlineCode") {
newObj.value = ast.value.replace(/[ \t\n]+/g, " ");
} // for insert pragma
if (parent && parent.type === "root" && parent.children.length > 0 && (parent.children[0] === ast || (parent.children[0].type === "yaml" || parent.children[0].type === "toml") && parent.children[1] === ast) && ast.type === "html" && pragma$4.startWithPragma(ast.value)) {
return null;
}
}
function hasPrettierIgnore$6(path) {
const index = +path.getName();
if (index === 0) {
return false;
}
const prevNode = path.getParentNode().children[index - 1];
return isPrettierIgnore$1(prevNode) === "next";
}
var printerMarkdown = {
preprocess: preprocess_1$2,
print: genericPrint$5,
embed: embed_1$2,
massageAstNode: clean$6,
hasPrettierIgnore: hasPrettierIgnore$6,
insertPragma: pragma$4.insertPragma
};
var options$6 = {
proseWrap: commonOptions.proseWrap,
singleQuote: commonOptions.singleQuote
};
var name$g = "Markdown";
var type$f = "prose";
var aliases$5 = [
"pandoc"
];
var aceMode$f = "markdown";
var codemirrorMode$b = "gfm";
var codemirrorMimeType$b = "text/x-gfm";
var wrap = true;
var extensions$f = [
".md",
".markdown",
".mdown",
".mdwn",
".mdx",
".mkd",
".mkdn",
".mkdown",
".ronn",
".workbook"
];
var filenames$3 = [
"contents.lr"
];
var tmScope$f = "source.gfm";
var languageId$f = 222;
var Markdown = {
name: name$g,
type: type$f,
aliases: aliases$5,
aceMode: aceMode$f,
codemirrorMode: codemirrorMode$b,
codemirrorMimeType: codemirrorMimeType$b,
wrap: wrap,
extensions: extensions$f,
filenames: filenames$3,
tmScope: tmScope$f,
languageId: languageId$f
};
var Markdown$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$g,
type: type$f,
aliases: aliases$5,
aceMode: aceMode$f,
codemirrorMode: codemirrorMode$b,
codemirrorMimeType: codemirrorMimeType$b,
wrap: wrap,
extensions: extensions$f,
filenames: filenames$3,
tmScope: tmScope$f,
languageId: languageId$f,
'default': Markdown
});
var require$$0$7 = getCjsExportFromNamespace(Markdown$1);
const languages$5 = [createLanguage(require$$0$7, data => ({
since: "1.8.0",
parsers: ["markdown"],
vscodeLanguageIds: ["markdown"],
filenames: data.filenames.concat(["README"]),
extensions: data.extensions.filter(extension => extension !== ".mdx")
})), createLanguage(require$$0$7, () => ({
name: "MDX",
since: "1.15.0",
parsers: ["mdx"],
vscodeLanguageIds: ["mdx"],
filenames: [],
extensions: [".mdx"]
}))];
const printers$5 = {
mdast: printerMarkdown
};
var languageMarkdown = {
languages: languages$5,
options: options$6,
printers: printers$5
};
function isPragma(text) {
return /^\s*@(prettier|format)\s*$/.test(text);
}
function hasPragma$4(text) {
return /^\s*#[^\n\S]*@(prettier|format)\s*?(\n|$)/.test(text);
}
function insertPragma$8(text) {
return "# @format\n\n".concat(text);
}
var pragma$5 = {
isPragma,
hasPragma: hasPragma$4,
insertPragma: insertPragma$8
};
const {
getLast: getLast$5
} = util$1;
function getAncestorCount(path, filter) {
let counter = 0;
const pathStackLength = path.stack.length - 1;
for (let i = 0; i < pathStackLength; i++) {
const value = path.stack[i];
if (isNode(value) && filter(value)) {
counter++;
}
}
return counter;
}
/**
* @param {any} value
* @param {string[]=} types
*/
function isNode(value, types) {
return value && typeof value.type === "string" && (!types || types.includes(value.type));
}
function mapNode(node, callback, parent) {
return callback("children" in node ? Object.assign({}, node, {
children: node.children.map(childNode => mapNode(childNode, callback, node))
}) : node, parent);
}
function defineShortcut(x, key, getter) {
Object.defineProperty(x, key, {
get: getter,
enumerable: false
});
}
function isNextLineEmpty$5(node, text) {
let newlineCount = 0;
const textLength = text.length;
for (let i = node.position.end.offset - 1; i < textLength; i++) {
const char = text[i];
if (char === "\n") {
newlineCount++;
}
if (newlineCount === 1 && /\S/.test(char)) {
return false;
}
if (newlineCount === 2) {
return true;
}
}
return false;
}
function isLastDescendantNode(path) {
const node = path.getValue();
switch (node.type) {
case "tag":
case "anchor":
case "comment":
return false;
}
const pathStackLength = path.stack.length;
for (let i = 1; i < pathStackLength; i++) {
const item = path.stack[i];
const parentItem = path.stack[i - 1];
if (Array.isArray(parentItem) && typeof item === "number" && item !== parentItem.length - 1) {
return false;
}
}
return true;
}
function getLastDescendantNode$1(node) {
return "children" in node && node.children.length !== 0 ? getLastDescendantNode$1(getLast$5(node.children)) : node;
}
function isPrettierIgnore$2(comment) {
return comment.value.trim() === "prettier-ignore";
}
function hasPrettierIgnore$7(path) {
const node = path.getValue();
if (node.type === "documentBody") {
const document = path.getParentNode();
return hasEndComments(document.head) && isPrettierIgnore$2(getLast$5(document.head.endComments));
}
return hasLeadingComments(node) && isPrettierIgnore$2(getLast$5(node.leadingComments));
}
function isEmptyNode(node) {
return (!node.children || node.children.length === 0) && !hasComments(node);
}
function hasComments(node) {
return hasLeadingComments(node) || hasMiddleComments(node) || hasIndicatorComment(node) || hasTrailingComment$2(node) || hasEndComments(node);
}
function hasLeadingComments(node) {
return node && node.leadingComments && node.leadingComments.length !== 0;
}
function hasMiddleComments(node) {
return node && node.middleComments && node.middleComments.length !== 0;
}
function hasIndicatorComment(node) {
return node && node.indicatorComment;
}
function hasTrailingComment$2(node) {
return node && node.trailingComment;
}
function hasEndComments(node) {
return node && node.endComments && node.endComments.length !== 0;
}
/**
* " a b c d e f " -> [" a b", "c d", "e f "]
*/
function splitWithSingleSpace(text) {
const parts = [];
let lastPart = undefined;
for (const part of text.split(/( +)/g)) {
if (part !== " ") {
if (lastPart === " ") {
parts.push(part);
} else {
parts.push((parts.pop() || "") + part);
}
} else if (lastPart === undefined) {
parts.unshift("");
}
lastPart = part;
}
if (lastPart === " ") {
parts.push((parts.pop() || "") + " ");
}
if (parts[0] === "") {
parts.shift();
parts.unshift(" " + (parts.shift() || ""));
}
return parts;
}
function getFlowScalarLineContents(nodeType, content, options) {
const rawLineContents = content.split("\n").map((lineContent, index, lineContents) => index === 0 && index === lineContents.length - 1 ? lineContent : index !== 0 && index !== lineContents.length - 1 ? lineContent.trim() : index === 0 ? lineContent.trimEnd() : lineContent.trimStart());
if (options.proseWrap === "preserve") {
return rawLineContents.map(lineContent => lineContent.length === 0 ? [] : [lineContent]);
}
return rawLineContents.map(lineContent => lineContent.length === 0 ? [] : splitWithSingleSpace(lineContent)).reduce((reduced, lineContentWords, index) => index !== 0 && rawLineContents[index - 1].length !== 0 && lineContentWords.length !== 0 && !( // trailing backslash in quoteDouble should be preserved
nodeType === "quoteDouble" && getLast$5(getLast$5(reduced)).endsWith("\\")) ? reduced.concat([reduced.pop().concat(lineContentWords)]) : reduced.concat([lineContentWords]), []).map(lineContentWords => options.proseWrap === "never" ? [lineContentWords.join(" ")] : lineContentWords);
}
function getBlockValueLineContents(node, {
parentIndent,
isLastDescendant,
options
}) {
const content = node.position.start.line === node.position.end.line ? "" : options.originalText.slice(node.position.start.offset, node.position.end.offset) // exclude open line `>` or `|`
.match(/^[^\n]*?\n([\s\S]*)$/)[1];
const leadingSpaceCount = node.indent === null ? (match => match ? match[1].length : Infinity)(content.match(/^( *)\S/m)) : node.indent - 1 + parentIndent;
const rawLineContents = content.split("\n").map(lineContent => lineContent.slice(leadingSpaceCount));
if (options.proseWrap === "preserve" || node.type === "blockLiteral") {
return removeUnnecessaryTrailingNewlines(rawLineContents.map(lineContent => lineContent.length === 0 ? [] : [lineContent]));
}
return removeUnnecessaryTrailingNewlines(rawLineContents.map(lineContent => lineContent.length === 0 ? [] : splitWithSingleSpace(lineContent)).reduce((reduced, lineContentWords, index) => index !== 0 && rawLineContents[index - 1].length !== 0 && lineContentWords.length !== 0 && !/^\s/.test(lineContentWords[0]) && !/^\s|\s$/.test(getLast$5(reduced)) ? reduced.concat([reduced.pop().concat(lineContentWords)]) : reduced.concat([lineContentWords]), []).map(lineContentWords => lineContentWords.reduce((reduced, word) => // disallow trailing spaces
reduced.length !== 0 && /\s$/.test(getLast$5(reduced)) ? reduced.concat(reduced.pop() + " " + word) : reduced.concat(word), [])).map(lineContentWords => options.proseWrap === "never" ? [lineContentWords.join(" ")] : lineContentWords));
function removeUnnecessaryTrailingNewlines(lineContents) {
if (node.chomping === "keep") {
return getLast$5(lineContents).length === 0 ? lineContents.slice(0, -1) : lineContents;
}
let trailingNewlineCount = 0;
for (let i = lineContents.length - 1; i >= 0; i--) {
if (lineContents[i].length === 0) {
trailingNewlineCount++;
} else {
break;
}
}
return trailingNewlineCount === 0 ? lineContents : trailingNewlineCount >= 2 && !isLastDescendant ? // next empty line
lineContents.slice(0, -(trailingNewlineCount - 1)) : lineContents.slice(0, -trailingNewlineCount);
}
}
var utils$7 = {
getLast: getLast$5,
getAncestorCount,
isNode,
isEmptyNode,
mapNode,
defineShortcut,
isNextLineEmpty: isNextLineEmpty$5,
isLastDescendantNode,
getBlockValueLineContents,
getFlowScalarLineContents,
getLastDescendantNode: getLastDescendantNode$1,
hasPrettierIgnore: hasPrettierIgnore$7,
hasLeadingComments,
hasMiddleComments,
hasIndicatorComment,
hasTrailingComment: hasTrailingComment$2,
hasEndComments
};
const {
insertPragma: insertPragma$9,
isPragma: isPragma$1
} = pragma$5;
const {
getAncestorCount: getAncestorCount$1,
getBlockValueLineContents: getBlockValueLineContents$1,
getFlowScalarLineContents: getFlowScalarLineContents$1,
getLast: getLast$6,
getLastDescendantNode: getLastDescendantNode$2,
hasLeadingComments: hasLeadingComments$1,
hasMiddleComments: hasMiddleComments$1,
hasIndicatorComment: hasIndicatorComment$1,
hasTrailingComment: hasTrailingComment$3,
hasEndComments: hasEndComments$1,
hasPrettierIgnore: hasPrettierIgnore$8,
isLastDescendantNode: isLastDescendantNode$1,
isNextLineEmpty: isNextLineEmpty$6,
isNode: isNode$1,
isEmptyNode: isEmptyNode$1,
defineShortcut: defineShortcut$1,
mapNode: mapNode$1
} = utils$7;
const docBuilders$2 = document.builders;
const {
conditionalGroup: conditionalGroup$2,
breakParent: breakParent$5,
concat: concat$h,
dedent: dedent$3,
dedentToRoot: dedentToRoot$3,
fill: fill$6,
group: group$g,
hardline: hardline$d,
ifBreak: ifBreak$8,
join: join$c,
line: line$b,
lineSuffix: lineSuffix$2,
literalline: literalline$7,
markAsRoot: markAsRoot$5,
softline: softline$8
} = docBuilders$2;
const {
replaceEndOfLineWith: replaceEndOfLineWith$3
} = util$1;
function preprocess$3(ast) {
return mapNode$1(ast, defineShortcuts);
}
function defineShortcuts(node) {
switch (node.type) {
case "document":
defineShortcut$1(node, "head", () => node.children[0]);
defineShortcut$1(node, "body", () => node.children[1]);
break;
case "documentBody":
case "sequenceItem":
case "flowSequenceItem":
case "mappingKey":
case "mappingValue":
defineShortcut$1(node, "content", () => node.children[0]);
break;
case "mappingItem":
case "flowMappingItem":
defineShortcut$1(node, "key", () => node.children[0]);
defineShortcut$1(node, "value", () => node.children[1]);
break;
}
return node;
}
function genericPrint$6(path, options, print) {
const node = path.getValue();
const parentNode = path.getParentNode();
const tag = !node.tag ? "" : path.call(print, "tag");
const anchor = !node.anchor ? "" : path.call(print, "anchor");
const nextEmptyLine = isNode$1(node, ["mapping", "sequence", "comment", "directive", "mappingItem", "sequenceItem"]) && !isLastDescendantNode$1(path) ? printNextEmptyLine(path, options.originalText) : "";
return concat$h([node.type !== "mappingValue" && hasLeadingComments$1(node) ? concat$h([join$c(hardline$d, path.map(print, "leadingComments")), hardline$d]) : "", tag, tag && anchor ? " " : "", anchor, tag || anchor ? isNode$1(node, ["sequence", "mapping"]) && !hasMiddleComments$1(node) ? hardline$d : " " : "", hasMiddleComments$1(node) ? concat$h([node.middleComments.length === 1 ? "" : hardline$d, join$c(hardline$d, path.map(print, "middleComments")), hardline$d]) : "", hasPrettierIgnore$8(path) ? concat$h(replaceEndOfLineWith$3(options.originalText.slice(node.position.start.offset, node.position.end.offset), literalline$7)) : group$g(_print(node, parentNode, path, options, print)), hasTrailingComment$3(node) && !isNode$1(node, ["document", "documentHead"]) ? lineSuffix$2(concat$h([node.type === "mappingValue" && !node.content ? "" : " ", parentNode.type === "mappingKey" && path.getParentNode(2).type === "mapping" && isInlineNode(node) ? "" : breakParent$5, path.call(print, "trailingComment")])) : "", nextEmptyLine, hasEndComments$1(node) && !isNode$1(node, ["documentHead", "documentBody"]) ? align$3(node.type === "sequenceItem" ? 2 : 0, concat$h([hardline$d, join$c(hardline$d, path.map(print, "endComments"))])) : ""]);
}
function _print(node, parentNode, path, options, print) {
switch (node.type) {
case "root":
return concat$h([join$c(hardline$d, path.map((childPath, index) => {
const document = node.children[index];
const nextDocument = node.children[index + 1];
return concat$h([print(childPath), shouldPrintDocumentEndMarker(document, nextDocument) ? concat$h([hardline$d, "...", hasTrailingComment$3(document) ? concat$h([" ", path.call(print, "trailingComment")]) : ""]) : !nextDocument || hasTrailingComment$3(nextDocument.head) ? "" : concat$h([hardline$d, "---"])]);
}, "children")), node.children.length === 0 || (lastDescendantNode => isNode$1(lastDescendantNode, ["blockLiteral", "blockFolded"]) && lastDescendantNode.chomping === "keep")(getLastDescendantNode$2(node)) ? "" : hardline$d]);
case "document":
{
const nextDocument = parentNode.children[path.getName() + 1];
return join$c(hardline$d, [shouldPrintDocumentHeadEndMarker(node, nextDocument, parentNode, options) === "head" ? join$c(hardline$d, [node.head.children.length === 0 && node.head.endComments.length === 0 ? "" : path.call(print, "head"), concat$h(["---", hasTrailingComment$3(node.head) ? concat$h([" ", path.call(print, "head", "trailingComment")]) : ""])].filter(Boolean)) : "", shouldPrintDocumentBody(node) ? path.call(print, "body") : ""].filter(Boolean));
}
case "documentHead":
return join$c(hardline$d, [].concat(path.map(print, "children"), path.map(print, "endComments")));
case "documentBody":
{
const children = join$c(hardline$d, path.map(print, "children")).parts;
const endComments = join$c(hardline$d, path.map(print, "endComments")).parts;
const separator = children.length === 0 || endComments.length === 0 ? "" : (lastDescendantNode => isNode$1(lastDescendantNode, ["blockFolded", "blockLiteral"]) ? lastDescendantNode.chomping === "keep" ? // there's already a newline printed at the end of blockValue (chomping=keep, lastDescendant=true)
"" : // an extra newline for better readability
concat$h([hardline$d, hardline$d]) : hardline$d)(getLastDescendantNode$2(node));
return concat$h([].concat(children, separator, endComments));
}
case "directive":
return concat$h(["%", join$c(" ", [node.name].concat(node.parameters))]);
case "comment":
return concat$h(["#", node.value]);
case "alias":
return concat$h(["*", node.value]);
case "tag":
return options.originalText.slice(node.position.start.offset, node.position.end.offset);
case "anchor":
return concat$h(["&", node.value]);
case "plain":
return printFlowScalarContent(node.type, options.originalText.slice(node.position.start.offset, node.position.end.offset), options);
case "quoteDouble":
case "quoteSingle":
{
const singleQuote = "'";
const doubleQuote = '"';
const raw = options.originalText.slice(node.position.start.offset + 1, node.position.end.offset - 1);
if (node.type === "quoteSingle" && raw.includes("\\") || node.type === "quoteDouble" && /\\[^"]/.test(raw)) {
// only quoteDouble can use escape chars
// and quoteSingle do not need to escape backslashes
const originalQuote = node.type === "quoteDouble" ? doubleQuote : singleQuote;
return concat$h([originalQuote, printFlowScalarContent(node.type, raw, options), originalQuote]);
} else if (raw.includes(doubleQuote)) {
return concat$h([singleQuote, printFlowScalarContent(node.type, node.type === "quoteDouble" ? raw // double quote needs to be escaped by backslash in quoteDouble
.replace(/\\"/g, doubleQuote).replace(/'/g, singleQuote.repeat(2)) : raw, options), singleQuote]);
}
if (raw.includes(singleQuote)) {
return concat$h([doubleQuote, printFlowScalarContent(node.type, node.type === "quoteSingle" ? // single quote needs to be escaped by 2 single quotes in quoteSingle
raw.replace(/''/g, singleQuote) : raw, options), doubleQuote]);
}
const quote = options.singleQuote ? singleQuote : doubleQuote;
return concat$h([quote, printFlowScalarContent(node.type, raw, options), quote]);
}
case "blockFolded":
case "blockLiteral":
{
const parentIndent = getAncestorCount$1(path, ancestorNode => isNode$1(ancestorNode, ["sequence", "mapping"]));
const isLastDescendant = isLastDescendantNode$1(path);
return concat$h([node.type === "blockFolded" ? ">" : "|", node.indent === null ? "" : node.indent.toString(), node.chomping === "clip" ? "" : node.chomping === "keep" ? "+" : "-", hasIndicatorComment$1(node) ? concat$h([" ", path.call(print, "indicatorComment")]) : "", (node.indent === null ? dedent$3 : dedentToRoot$3)(align$3(node.indent === null ? options.tabWidth : node.indent - 1 + parentIndent, concat$h(getBlockValueLineContents$1(node, {
parentIndent,
isLastDescendant,
options
}).reduce((reduced, lineWords, index, lineContents) => reduced.concat(index === 0 ? hardline$d : "", fill$6(join$c(line$b, lineWords).parts), index !== lineContents.length - 1 ? lineWords.length === 0 ? hardline$d : markAsRoot$5(literalline$7) : node.chomping === "keep" && isLastDescendant ? lineWords.length === 0 ? dedentToRoot$3(hardline$d) : dedentToRoot$3(literalline$7) : ""), []))))]);
}
case "sequence":
return join$c(hardline$d, path.map(print, "children"));
case "sequenceItem":
return concat$h(["- ", align$3(2, !node.content ? "" : path.call(print, "content"))]);
case "mappingKey":
return !node.content ? "" : path.call(print, "content");
case "mappingValue":
return !node.content ? "" : path.call(print, "content");
case "mapping":
return join$c(hardline$d, path.map(print, "children"));
case "mappingItem":
case "flowMappingItem":
{
const isEmptyMappingKey = isEmptyNode$1(node.key);
const isEmptyMappingValue = isEmptyNode$1(node.value);
if (isEmptyMappingKey && isEmptyMappingValue) {
return concat$h([": "]);
}
const key = path.call(print, "key");
const value = path.call(print, "value");
if (isEmptyMappingValue) {
return node.type === "flowMappingItem" && parentNode.type === "flowMapping" ? key : node.type === "mappingItem" && isAbsolutelyPrintedAsSingleLineNode(node.key.content, options) && !hasTrailingComment$3(node.key.content) && (!parentNode.tag || parentNode.tag.value !== "tag:yaml.org,2002:set") ? concat$h([key, needsSpaceInFrontOfMappingValue(node) ? " " : "", ":"]) : concat$h(["? ", align$3(2, key)]);
}
if (isEmptyMappingKey) {
return concat$h([": ", align$3(2, value)]);
}
const groupId = Symbol("mappingKey");
const forceExplicitKey = hasLeadingComments$1(node.value) || !isInlineNode(node.key.content);
return forceExplicitKey ? concat$h(["? ", align$3(2, key), hardline$d, join$c("", path.map(print, "value", "leadingComments").map(comment => concat$h([comment, hardline$d]))), ": ", align$3(2, value)]) : // force singleline
isSingleLineNode(node.key.content) && !hasLeadingComments$1(node.key.content) && !hasMiddleComments$1(node.key.content) && !hasTrailingComment$3(node.key.content) && !hasEndComments$1(node.key) && !hasLeadingComments$1(node.value.content) && !hasMiddleComments$1(node.value.content) && !hasEndComments$1(node.value) && isAbsolutelyPrintedAsSingleLineNode(node.value.content, options) ? concat$h([key, needsSpaceInFrontOfMappingValue(node) ? " " : "", ": ", value]) : conditionalGroup$2([concat$h([group$g(concat$h([ifBreak$8("? "), group$g(align$3(2, key), {
id: groupId
})])), ifBreak$8(concat$h([hardline$d, ": ", align$3(2, value)]), indent(concat$h([needsSpaceInFrontOfMappingValue(node) ? " " : "", ":", hasLeadingComments$1(node.value.content) || hasEndComments$1(node.value) && node.value.content && !isNode$1(node.value.content, ["mapping", "sequence"]) || parentNode.type === "mapping" && hasTrailingComment$3(node.key.content) && isInlineNode(node.value.content) || isNode$1(node.value.content, ["mapping", "sequence"]) && node.value.content.tag === null && node.value.content.anchor === null ? hardline$d : !node.value.content ? "" : line$b, value])), {
groupId
})])]);
}
case "flowMapping":
case "flowSequence":
{
const openMarker = node.type === "flowMapping" ? "{" : "[";
const closeMarker = node.type === "flowMapping" ? "}" : "]";
const bracketSpacing = node.type === "flowMapping" && node.children.length !== 0 && options.bracketSpacing ? line$b : softline$8;
const isLastItemEmptyMappingItem = node.children.length !== 0 && (lastItem => lastItem.type === "flowMappingItem" && isEmptyNode$1(lastItem.key) && isEmptyNode$1(lastItem.value))(getLast$6(node.children));
return concat$h([openMarker, indent(concat$h([bracketSpacing, concat$h(path.map((childPath, index) => concat$h([print(childPath), index === node.children.length - 1 ? "" : concat$h([",", line$b, node.children[index].position.start.line !== node.children[index + 1].position.start.line ? printNextEmptyLine(childPath, options.originalText) : ""])]), "children")), ifBreak$8(",", "")])), isLastItemEmptyMappingItem ? "" : bracketSpacing, closeMarker]);
}
case "flowSequenceItem":
return path.call(print, "content");
// istanbul ignore next
default:
throw new Error("Unexpected node type ".concat(node.type));
}
function indent(doc) {
return docBuilders$2.align(" ".repeat(options.tabWidth), doc);
}
}
function align$3(n, doc) {
return typeof n === "number" && n > 0 ? docBuilders$2.align(" ".repeat(n), doc) : docBuilders$2.align(n, doc);
}
function isInlineNode(node) {
if (!node) {
return true;
}
switch (node.type) {
case "plain":
case "quoteDouble":
case "quoteSingle":
case "alias":
case "flowMapping":
case "flowSequence":
return true;
default:
return false;
}
}
function isSingleLineNode(node) {
if (!node) {
return true;
}
switch (node.type) {
case "plain":
case "quoteDouble":
case "quoteSingle":
return node.position.start.line === node.position.end.line;
case "alias":
return true;
default:
return false;
}
}
function shouldPrintDocumentBody(document) {
return document.body.children.length !== 0 || hasEndComments$1(document.body);
}
function shouldPrintDocumentEndMarker(document, nextDocument) {
return (
/**
*... # trailingComment
*/
hasTrailingComment$3(document) || nextDocument && (
/**
* ...
* %DIRECTIVE
* ---
*/
nextDocument.head.children.length !== 0 ||
/**
* ...
* # endComment
* ---
*/
hasEndComments$1(nextDocument.head))
);
}
function shouldPrintDocumentHeadEndMarker(document, nextDocument, root, options) {
if (
/**
* ---
* preserve the first document head end marker
*/
root.children[0] === document && /---(\s|$)/.test(options.originalText.slice(options.locStart(document), options.locStart(document) + 4)) ||
/**
* %DIRECTIVE
* ---
*/
document.head.children.length !== 0 ||
/**
* # end comment
* ---
*/
hasEndComments$1(document.head) ||
/**
* --- # trailing comment
*/
hasTrailingComment$3(document.head)) {
return "head";
}
if (shouldPrintDocumentEndMarker(document, nextDocument)) {
return false;
}
return nextDocument ? "root" : false;
}
function isAbsolutelyPrintedAsSingleLineNode(node, options) {
if (!node) {
return true;
}
switch (node.type) {
case "plain":
case "quoteSingle":
case "quoteDouble":
break;
case "alias":
return true;
default:
return false;
}
if (options.proseWrap === "preserve") {
return node.position.start.line === node.position.end.line;
}
if ( // backslash-newline
/\\$/m.test(options.originalText.slice(node.position.start.offset, node.position.end.offset))) {
return false;
}
switch (options.proseWrap) {
case "never":
return !node.value.includes("\n");
case "always":
return !/[\n ]/.test(node.value);
// istanbul ignore next
default:
return false;
}
}
function needsSpaceInFrontOfMappingValue(node) {
return node.key.content && node.key.content.type === "alias";
}
function printNextEmptyLine(path, originalText) {
const node = path.getValue();
const root = path.stack[0];
root.isNextEmptyLinePrintedChecklist = root.isNextEmptyLinePrintedChecklist || [];
if (!root.isNextEmptyLinePrintedChecklist[node.position.end.line]) {
if (isNextLineEmpty$6(node, originalText)) {
root.isNextEmptyLinePrintedChecklist[node.position.end.line] = true;
return softline$8;
}
}
return "";
}
function printFlowScalarContent(nodeType, content, options) {
const lineContents = getFlowScalarLineContents$1(nodeType, content, options);
return join$c(hardline$d, lineContents.map(lineContentWords => fill$6(join$c(line$b, lineContentWords).parts)));
}
function clean$7(node, newNode
/*, parent */
) {
if (isNode$1(newNode)) {
delete newNode.position;
switch (newNode.type) {
case "comment":
// insert pragma
if (isPragma$1(newNode.value)) {
return null;
}
break;
case "quoteDouble":
case "quoteSingle":
newNode.type = "quote";
break;
}
}
}
var printerYaml = {
preprocess: preprocess$3,
print: genericPrint$6,
massageAstNode: clean$7,
insertPragma: insertPragma$9
};
var options$7 = {
bracketSpacing: commonOptions.bracketSpacing,
singleQuote: commonOptions.singleQuote,
proseWrap: commonOptions.proseWrap
};
var name$h = "YAML";
var type$g = "data";
var tmScope$g = "source.yaml";
var aliases$6 = [
"yml"
];
var extensions$g = [
".yml",
".mir",
".reek",
".rviz",
".sublime-syntax",
".syntax",
".yaml",
".yaml-tmlanguage",
".yaml.sed",
".yml.mysql"
];
var filenames$4 = [
".clang-format",
".clang-tidy",
".gemrc",
"glide.lock",
"yarn.lock"
];
var aceMode$g = "yaml";
var codemirrorMode$c = "yaml";
var codemirrorMimeType$c = "text/x-yaml";
var languageId$g = 407;
var YAML = {
name: name$h,
type: type$g,
tmScope: tmScope$g,
aliases: aliases$6,
extensions: extensions$g,
filenames: filenames$4,
aceMode: aceMode$g,
codemirrorMode: codemirrorMode$c,
codemirrorMimeType: codemirrorMimeType$c,
languageId: languageId$g
};
var YAML$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
name: name$h,
type: type$g,
tmScope: tmScope$g,
aliases: aliases$6,
extensions: extensions$g,
filenames: filenames$4,
aceMode: aceMode$g,
codemirrorMode: codemirrorMode$c,
codemirrorMimeType: codemirrorMimeType$c,
languageId: languageId$g,
'default': YAML
});
var require$$0$8 = getCjsExportFromNamespace(YAML$1);
const languages$6 = [createLanguage(require$$0$8, data => ({
since: "1.14.0",
parsers: ["yaml"],
vscodeLanguageIds: ["yaml"],
// yarn.lock is not YAML: https://github.com/yarnpkg/yarn/issues/5629
filenames: data.filenames.filter(filename => filename !== "yarn.lock")
}))];
var languageYaml = {
languages: languages$6,
printers: {
yaml: printerYaml
},
options: options$7
};
const {
version: version$2
} = require$$0;
const {
getSupportInfo: getSupportInfo$2
} = support;
const internalPlugins = [languageCss, languageGraphql, languageHandlebars, languageHtml, languageJs, languageMarkdown, languageYaml];
function withPlugins(fn, optsArgIdx = 1 // Usually `opts` is the 2nd argument
) {
return (...args) => {
const opts = args[optsArgIdx] || {};
const plugins = opts.plugins || [];
args[optsArgIdx] = Object.assign({}, opts, {
plugins: [...internalPlugins, ...(Array.isArray(plugins) ? plugins : Object.values(plugins))]
});
return fn(...args);
};
}
const formatWithCursor = withPlugins(core.formatWithCursor);
var standalone = {
formatWithCursor,
format(text, opts) {
return formatWithCursor(text, opts).formatted;
},
check(text, opts) {
const {
formatted
} = formatWithCursor(text, opts);
return formatted === text;
},
doc: document,
getSupportInfo: withPlugins(getSupportInfo$2, 0),
version: version$2,
util: utilShared,
__debug: {
parse: withPlugins(core.parse),
formatAST: withPlugins(core.formatAST),
formatDoc: withPlugins(core.formatDoc),
printToDoc: withPlugins(core.printToDoc),
printDocToString: withPlugins(core.printDocToString)
}
};
var standalone$1 = standalone;
return standalone$1;
})));
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],92:[function(require,module,exports){
(function (process){
'use strict';
if (!process.version ||
process.version.indexOf('v0.') === 0 ||
process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
module.exports = { nextTick: nextTick };
} else {
module.exports = process
}
function nextTick(fn, arg1, arg2, arg3) {
if (typeof fn !== 'function') {
throw new TypeError('"callback" argument must be a function');
}
var len = arguments.length;
var args, i;
switch (len) {
case 0:
case 1:
return process.nextTick(fn);
case 2:
return process.nextTick(function afterTickOne() {
fn.call(null, arg1);
});
case 3:
return process.nextTick(function afterTickTwo() {
fn.call(null, arg1, arg2);
});
case 4:
return process.nextTick(function afterTickThree() {
fn.call(null, arg1, arg2, arg3);
});
default:
args = new Array(len - 1);
i = 0;
while (i < args.length) {
args[i++] = arguments[i];
}
return process.nextTick(function afterTick() {
fn.apply(null, args);
});
}
}
}).call(this,require('_process'))
},{"_process":93}],93:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};
// cached from whatever global is present so that test runners that stub it
// don't break things. But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals. It's inside a
// function because try/catches deoptimize in certain engines.
var cachedSetTimeout;
var cachedClearTimeout;
function defaultSetTimout() {
throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
throw new Error('clearTimeout has not been defined');
}
(function () {
try {
if (typeof setTimeout === 'function') {
cachedSetTimeout = setTimeout;
} else {
cachedSetTimeout = defaultSetTimout;
}
} catch (e) {
cachedSetTimeout = defaultSetTimout;
}
try {
if (typeof clearTimeout === 'function') {
cachedClearTimeout = clearTimeout;
} else {
cachedClearTimeout = defaultClearTimeout;
}
} catch (e) {
cachedClearTimeout = defaultClearTimeout;
}
} ())
function runTimeout(fun) {
if (cachedSetTimeout === setTimeout) {
//normal enviroments in sane situations
return setTimeout(fun, 0);
}
// if setTimeout wasn't available but was latter defined
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
cachedSetTimeout = setTimeout;
return setTimeout(fun, 0);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedSetTimeout(fun, 0);
} catch(e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedSetTimeout.call(null, fun, 0);
} catch(e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
return cachedSetTimeout.call(this, fun, 0);
}
}
}
function runClearTimeout(marker) {
if (cachedClearTimeout === clearTimeout) {
//normal enviroments in sane situations
return clearTimeout(marker);
}
// if clearTimeout wasn't available but was latter defined
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
cachedClearTimeout = clearTimeout;
return clearTimeout(marker);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedClearTimeout(marker);
} catch (e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedClearTimeout.call(null, marker);
} catch (e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
return cachedClearTimeout.call(this, marker);
}
}
}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;
function cleanUpNextTick() {
if (!draining || !currentQueue) {
return;
}
draining = false;
if (currentQueue.length) {
queue = currentQueue.concat(queue);
} else {
queueIndex = -1;
}
if (queue.length) {
drainQueue();
}
}
function drainQueue() {
if (draining) {
return;
}
var timeout = runTimeout(cleanUpNextTick);
draining = true;
var len = queue.length;
while(len) {
currentQueue = queue;
queue = [];
while (++queueIndex < len) {
if (currentQueue) {
currentQueue[queueIndex].run();
}
}
queueIndex = -1;
len = queue.length;
}
currentQueue = null;
draining = false;
runClearTimeout(timeout);
}
process.nextTick = function (fun) {
var args = new Array(arguments.length - 1);
if (arguments.length > 1) {
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
runTimeout(drainQueue);
}
};
// v8 likes predictible objects
function Item(fun, array) {
this.fun = fun;
this.array = array;
}
Item.prototype.run = function () {
this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;
process.listeners = function (name) { return [] }
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
},{}],94:[function(require,module,exports){
var inherits = require('inherits')
var EventEmitter = require('events').EventEmitter
var now = require('right-now')
var raf = require('raf')
module.exports = Engine
function Engine(fn) {
if (!(this instanceof Engine))
return new Engine(fn)
this.running = false
this.last = now()
this._frame = 0
this._tick = this.tick.bind(this)
if (fn)
this.on('tick', fn)
}
inherits(Engine, EventEmitter)
Engine.prototype.start = function() {
if (this.running)
return
this.running = true
this.last = now()
this._frame = raf(this._tick)
return this
}
Engine.prototype.stop = function() {
this.running = false
if (this._frame !== 0)
raf.cancel(this._frame)
this._frame = 0
return this
}
Engine.prototype.tick = function() {
this._frame = raf(this._tick)
var time = now()
var dt = time - this.last
this.emit('tick', dt)
this.last = time
}
},{"events":26,"inherits":79,"raf":95,"right-now":107}],95:[function(require,module,exports){
(function (global){
var now = require('performance-now')
, root = typeof window === 'undefined' ? global : window
, vendors = ['moz', 'webkit']
, suffix = 'AnimationFrame'
, raf = root['request' + suffix]
, caf = root['cancel' + suffix] || root['cancelRequest' + suffix]
for(var i = 0; !raf && i < vendors.length; i++) {
raf = root[vendors[i] + 'Request' + suffix]
caf = root[vendors[i] + 'Cancel' + suffix]
|| root[vendors[i] + 'CancelRequest' + suffix]
}
// Some versions of FF have rAF but not cAF
if(!raf || !caf) {
var last = 0
, id = 0
, queue = []
, frameDuration = 1000 / 60
raf = function(callback) {
if(queue.length === 0) {
var _now = now()
, next = Math.max(0, frameDuration - (_now - last))
last = next + _now
setTimeout(function() {
var cp = queue.slice(0)
// Clear queue here to prevent
// callbacks from appending listeners
// to the current frame's queue
queue.length = 0
for(var i = 0; i < cp.length; i++) {
if(!cp[i].cancelled) {
try{
cp[i].callback(last)
} catch(e) {
setTimeout(function() { throw e }, 0)
}
}
}
}, Math.round(next))
}
queue.push({
handle: ++id,
callback: callback,
cancelled: false
})
return id
}
caf = function(handle) {
for(var i = 0; i < queue.length; i++) {
if(queue[i].handle === handle) {
queue[i].cancelled = true
}
}
}
}
module.exports = function(fn) {
// Wrap in a new function to prevent
// `cancel` potentially being assigned
// to the native rAF function
return raf.call(root, fn)
}
module.exports.cancel = function() {
caf.apply(root, arguments)
}
module.exports.polyfill = function(object) {
if (!object) {
object = root;
}
object.requestAnimationFrame = raf
object.cancelAnimationFrame = caf
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"performance-now":89}],96:[function(require,module,exports){
(function (process,global){
'use strict'
function oldBrowser () {
throw new Error('Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11')
}
var Buffer = require('safe-buffer').Buffer
var crypto = global.crypto || global.msCrypto
if (crypto && crypto.getRandomValues) {
module.exports = randomBytes
} else {
module.exports = oldBrowser
}
function randomBytes (size, cb) {
// phantomjs needs to throw
if (size > 65536) throw new Error('requested too many random bytes')
// in case browserify isn't using the Uint8Array version
var rawBytes = new global.Uint8Array(size)
// This will not work in older browsers.
// See https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues
if (size > 0) { // getRandomValues fails on IE if size == 0
crypto.getRandomValues(rawBytes)
}
// XXX: phantomjs doesn't like a buffer being passed here
var bytes = Buffer.from(rawBytes.buffer)
if (typeof cb === 'function') {
return process.nextTick(function () {
cb(null, bytes)
})
}
return bytes
}
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"_process":93,"safe-buffer":108}],97:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// a duplex stream is just a stream that is both readable and writable.
// Since JS doesn't have multiple prototypal inheritance, this class
// prototypally inherits from Readable, and then parasitically from
// Writable.
'use strict';
/**/
var processNextTick = require('process-nextick-args').nextTick;
/**/
/**/
var objectKeys = Object.keys || function (obj) {
var keys = [];
for (var key in obj) {
keys.push(key);
}return keys;
};
/**/
module.exports = Duplex;
/**/
var util = require('core-util-is');
util.inherits = require('inherits');
/**/
var Readable = require('./_stream_readable');
var Writable = require('./_stream_writable');
util.inherits(Duplex, Readable);
var keys = objectKeys(Writable.prototype);
for (var v = 0; v < keys.length; v++) {
var method = keys[v];
if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
}
function Duplex(options) {
if (!(this instanceof Duplex)) return new Duplex(options);
Readable.call(this, options);
Writable.call(this, options);
if (options && options.readable === false) this.readable = false;
if (options && options.writable === false) this.writable = false;
this.allowHalfOpen = true;
if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
this.once('end', onend);
}
// the no-half-open enforcer
function onend() {
// if we allow half-open state, or if the writable side ended,
// then we're ok.
if (this.allowHalfOpen || this._writableState.ended) return;
// no more data can be written.
// But allow more writes to happen in this tick.
processNextTick(onEndNT, this);
}
function onEndNT(self) {
self.end();
}
Object.defineProperty(Duplex.prototype, 'destroyed', {
get: function () {
if (this._readableState === undefined || this._writableState === undefined) {
return false;
}
return this._readableState.destroyed && this._writableState.destroyed;
},
set: function (value) {
// we ignore the value if the stream
// has not been initialized yet
if (this._readableState === undefined || this._writableState === undefined) {
return;
}
// backward compatibility, the user is explicitly
// managing destroyed
this._readableState.destroyed = value;
this._writableState.destroyed = value;
}
});
Duplex.prototype._destroy = function (err, cb) {
this.push(null);
this.end();
processNextTick(cb, err);
};
function forEach(xs, f) {
for (var i = 0, l = xs.length; i < l; i++) {
f(xs[i], i);
}
}
},{"./_stream_readable":99,"./_stream_writable":101,"core-util-is":37,"inherits":79,"process-nextick-args":92}],98:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// a passthrough stream.
// basically just the most minimal sort of Transform stream.
// Every written chunk gets output as-is.
'use strict';
module.exports = PassThrough;
var Transform = require('./_stream_transform');
/**/
var util = require('core-util-is');
util.inherits = require('inherits');
/**/
util.inherits(PassThrough, Transform);
function PassThrough(options) {
if (!(this instanceof PassThrough)) return new PassThrough(options);
Transform.call(this, options);
}
PassThrough.prototype._transform = function (chunk, encoding, cb) {
cb(null, chunk);
};
},{"./_stream_transform":100,"core-util-is":37,"inherits":79}],99:[function(require,module,exports){
(function (process,global){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';
/**/
var processNextTick = require('process-nextick-args').nextTick;
/**/
module.exports = Readable;
/**/
var isArray = require('isarray');
/**/
/**/
var Duplex;
/**/
Readable.ReadableState = ReadableState;
/**/
var EE = require('events').EventEmitter;
var EElistenerCount = function (emitter, type) {
return emitter.listeners(type).length;
};
/**/
/**/
var Stream = require('./internal/streams/stream');
/**/
/**/
var Buffer = require('safe-buffer').Buffer;
var OurUint8Array = global.Uint8Array || function () {};
function _uint8ArrayToBuffer(chunk) {
return Buffer.from(chunk);
}
function _isUint8Array(obj) {
return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}
/**/
/**/
var util = require('core-util-is');
util.inherits = require('inherits');
/**/
/**/
var debugUtil = require('util');
var debug = void 0;
if (debugUtil && debugUtil.debuglog) {
debug = debugUtil.debuglog('stream');
} else {
debug = function () {};
}
/**/
var BufferList = require('./internal/streams/BufferList');
var destroyImpl = require('./internal/streams/destroy');
var StringDecoder;
util.inherits(Readable, Stream);
var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
function prependListener(emitter, event, fn) {
// Sadly this is not cacheable as some libraries bundle their own
// event emitter implementation with them.
if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
// This is a hack to make sure that our error handler is attached before any
// userland ones. NEVER DO THIS. This is here only because this code needs
// to continue to work with older versions of Node.js that do not include
// the prependListener() method. The goal is to eventually remove this hack.
if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
}
function ReadableState(options, stream) {
Duplex = Duplex || require('./_stream_duplex');
options = options || {};
// Duplex streams are both readable and writable, but share
// the same options object.
// However, some cases require setting options to different
// values for the readable and the writable sides of the duplex stream.
// These options can be provided separately as readableXXX and writableXXX.
var isDuplex = stream instanceof Duplex;
// object stream flag. Used to make read(n) ignore n and to
// make all the buffer merging and length checks go away
this.objectMode = !!options.objectMode;
if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
// the point at which it stops calling _read() to fill the buffer
// Note: 0 is a valid value, means "don't call _read preemptively ever"
var hwm = options.highWaterMark;
var readableHwm = options.readableHighWaterMark;
var defaultHwm = this.objectMode ? 16 : 16 * 1024;
if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
// cast to ints.
this.highWaterMark = Math.floor(this.highWaterMark);
// A linked list is used to store data chunks instead of an array because the
// linked list can remove elements from the beginning faster than
// array.shift()
this.buffer = new BufferList();
this.length = 0;
this.pipes = null;
this.pipesCount = 0;
this.flowing = null;
this.ended = false;
this.endEmitted = false;
this.reading = false;
// a flag to be able to tell if the event 'readable'/'data' is emitted
// immediately, or on a later tick. We set this to true at first, because
// any actions that shouldn't happen until "later" should generally also
// not happen before the first read call.
this.sync = true;
// whenever we return null, then we set a flag to say
// that we're awaiting a 'readable' event emission.
this.needReadable = false;
this.emittedReadable = false;
this.readableListening = false;
this.resumeScheduled = false;
// has it been destroyed
this.destroyed = false;
// Crypto is kind of old and crusty. Historically, its default string
// encoding is 'binary' so we have to make this configurable.
// Everything else in the universe uses 'utf8', though.
this.defaultEncoding = options.defaultEncoding || 'utf8';
// the number of writers that are awaiting a drain event in .pipe()s
this.awaitDrain = 0;
// if true, a maybeReadMore has been scheduled
this.readingMore = false;
this.decoder = null;
this.encoding = null;
if (options.encoding) {
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
this.decoder = new StringDecoder(options.encoding);
this.encoding = options.encoding;
}
}
function Readable(options) {
Duplex = Duplex || require('./_stream_duplex');
if (!(this instanceof Readable)) return new Readable(options);
this._readableState = new ReadableState(options, this);
// legacy
this.readable = true;
if (options) {
if (typeof options.read === 'function') this._read = options.read;
if (typeof options.destroy === 'function') this._destroy = options.destroy;
}
Stream.call(this);
}
Object.defineProperty(Readable.prototype, 'destroyed', {
get: function () {
if (this._readableState === undefined) {
return false;
}
return this._readableState.destroyed;
},
set: function (value) {
// we ignore the value if the stream
// has not been initialized yet
if (!this._readableState) {
return;
}
// backward compatibility, the user is explicitly
// managing destroyed
this._readableState.destroyed = value;
}
});
Readable.prototype.destroy = destroyImpl.destroy;
Readable.prototype._undestroy = destroyImpl.undestroy;
Readable.prototype._destroy = function (err, cb) {
this.push(null);
cb(err);
};
// Manually shove something into the read() buffer.
// This returns true if the highWaterMark has not been hit yet,
// similar to how Writable.write() returns true if you should
// write() some more.
Readable.prototype.push = function (chunk, encoding) {
var state = this._readableState;
var skipChunkCheck;
if (!state.objectMode) {
if (typeof chunk === 'string') {
encoding = encoding || state.defaultEncoding;
if (encoding !== state.encoding) {
chunk = Buffer.from(chunk, encoding);
encoding = '';
}
skipChunkCheck = true;
}
} else {
skipChunkCheck = true;
}
return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
};
// Unshift should *always* be something directly out of read()
Readable.prototype.unshift = function (chunk) {
return readableAddChunk(this, chunk, null, true, false);
};
function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
var state = stream._readableState;
if (chunk === null) {
state.reading = false;
onEofChunk(stream, state);
} else {
var er;
if (!skipChunkCheck) er = chunkInvalid(state, chunk);
if (er) {
stream.emit('error', er);
} else if (state.objectMode || chunk && chunk.length > 0) {
if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
chunk = _uint8ArrayToBuffer(chunk);
}
if (addToFront) {
if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
} else if (state.ended) {
stream.emit('error', new Error('stream.push() after EOF'));
} else {
state.reading = false;
if (state.decoder && !encoding) {
chunk = state.decoder.write(chunk);
if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
} else {
addChunk(stream, state, chunk, false);
}
}
} else if (!addToFront) {
state.reading = false;
}
}
return needMoreData(state);
}
function addChunk(stream, state, chunk, addToFront) {
if (state.flowing && state.length === 0 && !state.sync) {
stream.emit('data', chunk);
stream.read(0);
} else {
// update the buffer info.
state.length += state.objectMode ? 1 : chunk.length;
if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
if (state.needReadable) emitReadable(stream);
}
maybeReadMore(stream, state);
}
function chunkInvalid(state, chunk) {
var er;
if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
er = new TypeError('Invalid non-string/buffer chunk');
}
return er;
}
// if it's past the high water mark, we can push in some more.
// Also, if we have no data yet, we can stand some
// more bytes. This is to work around cases where hwm=0,
// such as the repl. Also, if the push() triggered a
// readable event, and the user called read(largeNumber) such that
// needReadable was set, then we ought to push more, so that another
// 'readable' event will be triggered.
function needMoreData(state) {
return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
}
Readable.prototype.isPaused = function () {
return this._readableState.flowing === false;
};
// backwards compatibility.
Readable.prototype.setEncoding = function (enc) {
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
this._readableState.decoder = new StringDecoder(enc);
this._readableState.encoding = enc;
return this;
};
// Don't raise the hwm > 8MB
var MAX_HWM = 0x800000;
function computeNewHighWaterMark(n) {
if (n >= MAX_HWM) {
n = MAX_HWM;
} else {
// Get the next highest power of 2 to prevent increasing hwm excessively in
// tiny amounts
n--;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
n++;
}
return n;
}
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function howMuchToRead(n, state) {
if (n <= 0 || state.length === 0 && state.ended) return 0;
if (state.objectMode) return 1;
if (n !== n) {
// Only flow one buffer at a time
if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
}
// If we're asking for more than the current hwm, then raise the hwm.
if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
if (n <= state.length) return n;
// Don't have enough
if (!state.ended) {
state.needReadable = true;
return 0;
}
return state.length;
}
// you can override either this method, or the async _read(n) below.
Readable.prototype.read = function (n) {
debug('read', n);
n = parseInt(n, 10);
var state = this._readableState;
var nOrig = n;
if (n !== 0) state.emittedReadable = false;
// if we're doing read(0) to trigger a readable event, but we
// already have a bunch of data in the buffer, then just trigger
// the 'readable' event and move on.
if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
debug('read: emitReadable', state.length, state.ended);
if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
return null;
}
n = howMuchToRead(n, state);
// if we've ended, and we're now clear, then finish it up.
if (n === 0 && state.ended) {
if (state.length === 0) endReadable(this);
return null;
}
// All the actual chunk generation logic needs to be
// *below* the call to _read. The reason is that in certain
// synthetic stream cases, such as passthrough streams, _read
// may be a completely synchronous operation which may change
// the state of the read buffer, providing enough data when
// before there was *not* enough.
//
// So, the steps are:
// 1. Figure out what the state of things will be after we do
// a read from the buffer.
//
// 2. If that resulting state will trigger a _read, then call _read.
// Note that this may be asynchronous, or synchronous. Yes, it is
// deeply ugly to write APIs this way, but that still doesn't mean
// that the Readable class should behave improperly, as streams are
// designed to be sync/async agnostic.
// Take note if the _read call is sync or async (ie, if the read call
// has returned yet), so that we know whether or not it's safe to emit
// 'readable' etc.
//
// 3. Actually pull the requested chunks out of the buffer and return.
// if we need a readable event, then we need to do some reading.
var doRead = state.needReadable;
debug('need readable', doRead);
// if we currently have less than the highWaterMark, then also read some
if (state.length === 0 || state.length - n < state.highWaterMark) {
doRead = true;
debug('length less than watermark', doRead);
}
// however, if we've ended, then there's no point, and if we're already
// reading, then it's unnecessary.
if (state.ended || state.reading) {
doRead = false;
debug('reading or ended', doRead);
} else if (doRead) {
debug('do read');
state.reading = true;
state.sync = true;
// if the length is currently zero, then we *need* a readable event.
if (state.length === 0) state.needReadable = true;
// call internal read method
this._read(state.highWaterMark);
state.sync = false;
// If _read pushed data synchronously, then `reading` will be false,
// and we need to re-evaluate how much data we can return to the user.
if (!state.reading) n = howMuchToRead(nOrig, state);
}
var ret;
if (n > 0) ret = fromList(n, state);else ret = null;
if (ret === null) {
state.needReadable = true;
n = 0;
} else {
state.length -= n;
}
if (state.length === 0) {
// If we have nothing in the buffer, then we want to know
// as soon as we *do* get something into the buffer.
if (!state.ended) state.needReadable = true;
// If we tried to read() past the EOF, then emit end on the next tick.
if (nOrig !== n && state.ended) endReadable(this);
}
if (ret !== null) this.emit('data', ret);
return ret;
};
function onEofChunk(stream, state) {
if (state.ended) return;
if (state.decoder) {
var chunk = state.decoder.end();
if (chunk && chunk.length) {
state.buffer.push(chunk);
state.length += state.objectMode ? 1 : chunk.length;
}
}
state.ended = true;
// emit 'readable' now to make sure it gets picked up.
emitReadable(stream);
}
// Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow. This way, it might trigger
// a nextTick recursion warning, but that's not so bad.
function emitReadable(stream) {
var state = stream._readableState;
state.needReadable = false;
if (!state.emittedReadable) {
debug('emitReadable', state.flowing);
state.emittedReadable = true;
if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);
}
}
function emitReadable_(stream) {
debug('emit readable');
stream.emit('readable');
flow(stream);
}
// at this point, the user has presumably seen the 'readable' event,
// and called read() to consume some data. that may have triggered
// in turn another _read(n) call, in which case reading = true if
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.
function maybeReadMore(stream, state) {
if (!state.readingMore) {
state.readingMore = true;
processNextTick(maybeReadMore_, stream, state);
}
}
function maybeReadMore_(stream, state) {
var len = state.length;
while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
debug('maybeReadMore read 0');
stream.read(0);
if (len === state.length)
// didn't get any data, stop spinning.
break;else len = state.length;
}
state.readingMore = false;
}
// abstract method. to be overridden in specific implementation classes.
// call cb(er, data) where data is <= n in length.
// for virtual (non-string, non-buffer) streams, "length" is somewhat
// arbitrary, and perhaps not very meaningful.
Readable.prototype._read = function (n) {
this.emit('error', new Error('_read() is not implemented'));
};
Readable.prototype.pipe = function (dest, pipeOpts) {
var src = this;
var state = this._readableState;
switch (state.pipesCount) {
case 0:
state.pipes = dest;
break;
case 1:
state.pipes = [state.pipes, dest];
break;
default:
state.pipes.push(dest);
break;
}
state.pipesCount += 1;
debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
var endFn = doEnd ? onend : unpipe;
if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);
dest.on('unpipe', onunpipe);
function onunpipe(readable, unpipeInfo) {
debug('onunpipe');
if (readable === src) {
if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
unpipeInfo.hasUnpiped = true;
cleanup();
}
}
}
function onend() {
debug('onend');
dest.end();
}
// when the dest drains, it reduces the awaitDrain counter
// on the source. This would be more elegant with a .once()
// handler in flow(), but adding and removing repeatedly is
// too slow.
var ondrain = pipeOnDrain(src);
dest.on('drain', ondrain);
var cleanedUp = false;
function cleanup() {
debug('cleanup');
// cleanup event handlers once the pipe is broken
dest.removeListener('close', onclose);
dest.removeListener('finish', onfinish);
dest.removeListener('drain', ondrain);
dest.removeListener('error', onerror);
dest.removeListener('unpipe', onunpipe);
src.removeListener('end', onend);
src.removeListener('end', unpipe);
src.removeListener('data', ondata);
cleanedUp = true;
// if the reader is waiting for a drain event from this
// specific writer, then it would cause it to never start
// flowing again.
// So, if this is awaiting a drain, then we just call it now.
// If we don't know, then assume that we are waiting for one.
if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
}
// If the user pushes more data while we're writing to dest then we'll end up
// in ondata again. However, we only want to increase awaitDrain once because
// dest will only emit one 'drain' event for the multiple writes.
// => Introduce a guard on increasing awaitDrain.
var increasedAwaitDrain = false;
src.on('data', ondata);
function ondata(chunk) {
debug('ondata');
increasedAwaitDrain = false;
var ret = dest.write(chunk);
if (false === ret && !increasedAwaitDrain) {
// If the user unpiped during `dest.write()`, it is possible
// to get stuck in a permanently paused state if that write
// also returned false.
// => Check whether `dest` is still a piping destination.
if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
debug('false write response, pause', src._readableState.awaitDrain);
src._readableState.awaitDrain++;
increasedAwaitDrain = true;
}
src.pause();
}
}
// if the dest has an error, then stop piping into it.
// however, don't suppress the throwing behavior for this.
function onerror(er) {
debug('onerror', er);
unpipe();
dest.removeListener('error', onerror);
if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
}
// Make sure our error handler is attached before userland ones.
prependListener(dest, 'error', onerror);
// Both close and finish should trigger unpipe, but only once.
function onclose() {
dest.removeListener('finish', onfinish);
unpipe();
}
dest.once('close', onclose);
function onfinish() {
debug('onfinish');
dest.removeListener('close', onclose);
unpipe();
}
dest.once('finish', onfinish);
function unpipe() {
debug('unpipe');
src.unpipe(dest);
}
// tell the dest that it's being piped to
dest.emit('pipe', src);
// start the flow if it hasn't been started already.
if (!state.flowing) {
debug('pipe resume');
src.resume();
}
return dest;
};
function pipeOnDrain(src) {
return function () {
var state = src._readableState;
debug('pipeOnDrain', state.awaitDrain);
if (state.awaitDrain) state.awaitDrain--;
if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
state.flowing = true;
flow(src);
}
};
}
Readable.prototype.unpipe = function (dest) {
var state = this._readableState;
var unpipeInfo = { hasUnpiped: false };
// if we're not piping anywhere, then do nothing.
if (state.pipesCount === 0) return this;
// just one destination. most common case.
if (state.pipesCount === 1) {
// passed in one, but it's not the right one.
if (dest && dest !== state.pipes) return this;
if (!dest) dest = state.pipes;
// got a match.
state.pipes = null;
state.pipesCount = 0;
state.flowing = false;
if (dest) dest.emit('unpipe', this, unpipeInfo);
return this;
}
// slow case. multiple pipe destinations.
if (!dest) {
// remove all.
var dests = state.pipes;
var len = state.pipesCount;
state.pipes = null;
state.pipesCount = 0;
state.flowing = false;
for (var i = 0; i < len; i++) {
dests[i].emit('unpipe', this, unpipeInfo);
}return this;
}
// try to find the right one.
var index = indexOf(state.pipes, dest);
if (index === -1) return this;
state.pipes.splice(index, 1);
state.pipesCount -= 1;
if (state.pipesCount === 1) state.pipes = state.pipes[0];
dest.emit('unpipe', this, unpipeInfo);
return this;
};
// set up data events if they are asked for
// Ensure readable listeners eventually get something
Readable.prototype.on = function (ev, fn) {
var res = Stream.prototype.on.call(this, ev, fn);
if (ev === 'data') {
// Start flowing on next tick if stream isn't explicitly paused
if (this._readableState.flowing !== false) this.resume();
} else if (ev === 'readable') {
var state = this._readableState;
if (!state.endEmitted && !state.readableListening) {
state.readableListening = state.needReadable = true;
state.emittedReadable = false;
if (!state.reading) {
processNextTick(nReadingNextTick, this);
} else if (state.length) {
emitReadable(this);
}
}
}
return res;
};
Readable.prototype.addListener = Readable.prototype.on;
function nReadingNextTick(self) {
debug('readable nexttick read 0');
self.read(0);
}
// pause() and resume() are remnants of the legacy readable stream API
// If the user uses them, then switch into old mode.
Readable.prototype.resume = function () {
var state = this._readableState;
if (!state.flowing) {
debug('resume');
state.flowing = true;
resume(this, state);
}
return this;
};
function resume(stream, state) {
if (!state.resumeScheduled) {
state.resumeScheduled = true;
processNextTick(resume_, stream, state);
}
}
function resume_(stream, state) {
if (!state.reading) {
debug('resume read 0');
stream.read(0);
}
state.resumeScheduled = false;
state.awaitDrain = 0;
stream.emit('resume');
flow(stream);
if (state.flowing && !state.reading) stream.read(0);
}
Readable.prototype.pause = function () {
debug('call pause flowing=%j', this._readableState.flowing);
if (false !== this._readableState.flowing) {
debug('pause');
this._readableState.flowing = false;
this.emit('pause');
}
return this;
};
function flow(stream) {
var state = stream._readableState;
debug('flow', state.flowing);
while (state.flowing && stream.read() !== null) {}
}
// wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.
Readable.prototype.wrap = function (stream) {
var _this = this;
var state = this._readableState;
var paused = false;
stream.on('end', function () {
debug('wrapped end');
if (state.decoder && !state.ended) {
var chunk = state.decoder.end();
if (chunk && chunk.length) _this.push(chunk);
}
_this.push(null);
});
stream.on('data', function (chunk) {
debug('wrapped data');
if (state.decoder) chunk = state.decoder.write(chunk);
// don't skip over falsy values in objectMode
if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
var ret = _this.push(chunk);
if (!ret) {
paused = true;
stream.pause();
}
});
// proxy all the other methods.
// important when wrapping filters and duplexes.
for (var i in stream) {
if (this[i] === undefined && typeof stream[i] === 'function') {
this[i] = function (method) {
return function () {
return stream[method].apply(stream, arguments);
};
}(i);
}
}
// proxy certain important events.
for (var n = 0; n < kProxyEvents.length; n++) {
stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
}
// when we try to consume some more bytes, simply unpause the
// underlying stream.
this._read = function (n) {
debug('wrapped _read', n);
if (paused) {
paused = false;
stream.resume();
}
};
return this;
};
// exposed for testing purposes only.
Readable._fromList = fromList;
// Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function fromList(n, state) {
// nothing buffered
if (state.length === 0) return null;
var ret;
if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
// read it all, truncate the list
if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
state.buffer.clear();
} else {
// read part of list
ret = fromListPartial(n, state.buffer, state.decoder);
}
return ret;
}
// Extracts only enough buffered data to satisfy the amount requested.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function fromListPartial(n, list, hasStrings) {
var ret;
if (n < list.head.data.length) {
// slice is the same for buffers and strings
ret = list.head.data.slice(0, n);
list.head.data = list.head.data.slice(n);
} else if (n === list.head.data.length) {
// first chunk is a perfect match
ret = list.shift();
} else {
// result spans more than one buffer
ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
}
return ret;
}
// Copies a specified amount of characters from the list of buffered data
// chunks.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function copyFromBufferString(n, list) {
var p = list.head;
var c = 1;
var ret = p.data;
n -= ret.length;
while (p = p.next) {
var str = p.data;
var nb = n > str.length ? str.length : n;
if (nb === str.length) ret += str;else ret += str.slice(0, n);
n -= nb;
if (n === 0) {
if (nb === str.length) {
++c;
if (p.next) list.head = p.next;else list.head = list.tail = null;
} else {
list.head = p;
p.data = str.slice(nb);
}
break;
}
++c;
}
list.length -= c;
return ret;
}
// Copies a specified amount of bytes from the list of buffered data chunks.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function copyFromBuffer(n, list) {
var ret = Buffer.allocUnsafe(n);
var p = list.head;
var c = 1;
p.data.copy(ret);
n -= p.data.length;
while (p = p.next) {
var buf = p.data;
var nb = n > buf.length ? buf.length : n;
buf.copy(ret, ret.length - n, 0, nb);
n -= nb;
if (n === 0) {
if (nb === buf.length) {
++c;
if (p.next) list.head = p.next;else list.head = list.tail = null;
} else {
list.head = p;
p.data = buf.slice(nb);
}
break;
}
++c;
}
list.length -= c;
return ret;
}
function endReadable(stream) {
var state = stream._readableState;
// If we get here before consuming all the bytes, then that is a
// bug in node. Should never happen.
if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
if (!state.endEmitted) {
state.ended = true;
processNextTick(endReadableNT, state, stream);
}
}
function endReadableNT(state, stream) {
// Check that we didn't get one last unshift.
if (!state.endEmitted && state.length === 0) {
state.endEmitted = true;
stream.readable = false;
stream.emit('end');
}
}
function forEach(xs, f) {
for (var i = 0, l = xs.length; i < l; i++) {
f(xs[i], i);
}
}
function indexOf(xs, x) {
for (var i = 0, l = xs.length; i < l; i++) {
if (xs[i] === x) return i;
}
return -1;
}
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./_stream_duplex":97,"./internal/streams/BufferList":102,"./internal/streams/destroy":103,"./internal/streams/stream":104,"_process":93,"core-util-is":37,"events":26,"inherits":79,"isarray":81,"process-nextick-args":92,"safe-buffer":108,"string_decoder/":132,"util":25}],100:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// a transform stream is a readable/writable stream where you do
// something with the data. Sometimes it's called a "filter",
// but that's not a great name for it, since that implies a thing where
// some bits pass through, and others are simply ignored. (That would
// be a valid example of a transform, of course.)
//
// While the output is causally related to the input, it's not a
// necessarily symmetric or synchronous transformation. For example,
// a zlib stream might take multiple plain-text writes(), and then
// emit a single compressed chunk some time in the future.
//
// Here's how this works:
//
// The Transform stream has all the aspects of the readable and writable
// stream classes. When you write(chunk), that calls _write(chunk,cb)
// internally, and returns false if there's a lot of pending writes
// buffered up. When you call read(), that calls _read(n) until
// there's enough pending readable data buffered up.
//
// In a transform stream, the written data is placed in a buffer. When
// _read(n) is called, it transforms the queued up data, calling the
// buffered _write cb's as it consumes chunks. If consuming a single
// written chunk would result in multiple output chunks, then the first
// outputted bit calls the readcb, and subsequent chunks just go into
// the read buffer, and will cause it to emit 'readable' if necessary.
//
// This way, back-pressure is actually determined by the reading side,
// since _read has to be called to start processing a new chunk. However,
// a pathological inflate type of transform can cause excessive buffering
// here. For example, imagine a stream where every byte of input is
// interpreted as an integer from 0-255, and then results in that many
// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
// 1kb of data being output. In this case, you could write a very small
// amount of input, and end up with a very large amount of output. In
// such a pathological inflating mechanism, there'd be no way to tell
// the system to stop doing the transform. A single 4MB write could
// cause the system to run out of memory.
//
// However, even in such a pathological case, only a single written chunk
// would be consumed, and then the rest would wait (un-transformed) until
// the results of the previous transformed chunk were consumed.
'use strict';
module.exports = Transform;
var Duplex = require('./_stream_duplex');
/**/
var util = require('core-util-is');
util.inherits = require('inherits');
/**/
util.inherits(Transform, Duplex);
function afterTransform(er, data) {
var ts = this._transformState;
ts.transforming = false;
var cb = ts.writecb;
if (!cb) {
return this.emit('error', new Error('write callback called multiple times'));
}
ts.writechunk = null;
ts.writecb = null;
if (data != null) // single equals check for both `null` and `undefined`
this.push(data);
cb(er);
var rs = this._readableState;
rs.reading = false;
if (rs.needReadable || rs.length < rs.highWaterMark) {
this._read(rs.highWaterMark);
}
}
function Transform(options) {
if (!(this instanceof Transform)) return new Transform(options);
Duplex.call(this, options);
this._transformState = {
afterTransform: afterTransform.bind(this),
needTransform: false,
transforming: false,
writecb: null,
writechunk: null,
writeencoding: null
};
// start out asking for a readable event once data is transformed.
this._readableState.needReadable = true;
// we have implemented the _read method, and done the other things
// that Readable wants before the first _read call, so unset the
// sync guard flag.
this._readableState.sync = false;
if (options) {
if (typeof options.transform === 'function') this._transform = options.transform;
if (typeof options.flush === 'function') this._flush = options.flush;
}
// When the writable side finishes, then flush out anything remaining.
this.on('prefinish', prefinish);
}
function prefinish() {
var _this = this;
if (typeof this._flush === 'function') {
this._flush(function (er, data) {
done(_this, er, data);
});
} else {
done(this, null, null);
}
}
Transform.prototype.push = function (chunk, encoding) {
this._transformState.needTransform = false;
return Duplex.prototype.push.call(this, chunk, encoding);
};
// This is the part where you do stuff!
// override this function in implementation classes.
// 'chunk' is an input chunk.
//
// Call `push(newChunk)` to pass along transformed output
// to the readable side. You may call 'push' zero or more times.
//
// Call `cb(err)` when you are done with this chunk. If you pass
// an error, then that'll put the hurt on the whole operation. If you
// never call cb(), then you'll never get another chunk.
Transform.prototype._transform = function (chunk, encoding, cb) {
throw new Error('_transform() is not implemented');
};
Transform.prototype._write = function (chunk, encoding, cb) {
var ts = this._transformState;
ts.writecb = cb;
ts.writechunk = chunk;
ts.writeencoding = encoding;
if (!ts.transforming) {
var rs = this._readableState;
if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
}
};
// Doesn't matter what the args are here.
// _transform does all the work.
// That we got here means that the readable side wants more data.
Transform.prototype._read = function (n) {
var ts = this._transformState;
if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
ts.transforming = true;
this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
} else {
// mark that we need a transform, so that any data that comes in
// will get processed, now that we've asked for it.
ts.needTransform = true;
}
};
Transform.prototype._destroy = function (err, cb) {
var _this2 = this;
Duplex.prototype._destroy.call(this, err, function (err2) {
cb(err2);
_this2.emit('close');
});
};
function done(stream, er, data) {
if (er) return stream.emit('error', er);
if (data != null) // single equals check for both `null` and `undefined`
stream.push(data);
// if there's nothing in the write buffer, then that means
// that nothing more will ever be provided
if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');
if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');
return stream.push(null);
}
},{"./_stream_duplex":97,"core-util-is":37,"inherits":79}],101:[function(require,module,exports){
(function (process,global){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// A bit simpler than readable streams.
// Implement an async ._write(chunk, encoding, cb), and it'll handle all
// the drain event emission and buffering.
'use strict';
/**/
var processNextTick = require('process-nextick-args').nextTick;
/**/
module.exports = Writable;
/* */
function WriteReq(chunk, encoding, cb) {
this.chunk = chunk;
this.encoding = encoding;
this.callback = cb;
this.next = null;
}
// It seems a linked list but it is not
// there will be only 2 of these for each stream
function CorkedRequest(state) {
var _this = this;
this.next = null;
this.entry = null;
this.finish = function () {
onCorkedFinish(_this, state);
};
}
/* */
/**/
var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;
/**/
/**/
var Duplex;
/**/
Writable.WritableState = WritableState;
/**/
var util = require('core-util-is');
util.inherits = require('inherits');
/**/
/**/
var internalUtil = {
deprecate: require('util-deprecate')
};
/**/
/**/
var Stream = require('./internal/streams/stream');
/**/
/**/
var Buffer = require('safe-buffer').Buffer;
var OurUint8Array = global.Uint8Array || function () {};
function _uint8ArrayToBuffer(chunk) {
return Buffer.from(chunk);
}
function _isUint8Array(obj) {
return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}
/**/
var destroyImpl = require('./internal/streams/destroy');
util.inherits(Writable, Stream);
function nop() {}
function WritableState(options, stream) {
Duplex = Duplex || require('./_stream_duplex');
options = options || {};
// Duplex streams are both readable and writable, but share
// the same options object.
// However, some cases require setting options to different
// values for the readable and the writable sides of the duplex stream.
// These options can be provided separately as readableXXX and writableXXX.
var isDuplex = stream instanceof Duplex;
// object stream flag to indicate whether or not this stream
// contains buffers or objects.
this.objectMode = !!options.objectMode;
if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
// the point at which write() starts returning false
// Note: 0 is a valid value, means that we always return false if
// the entire buffer is not flushed immediately on write()
var hwm = options.highWaterMark;
var writableHwm = options.writableHighWaterMark;
var defaultHwm = this.objectMode ? 16 : 16 * 1024;
if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;
// cast to ints.
this.highWaterMark = Math.floor(this.highWaterMark);
// if _final has been called
this.finalCalled = false;
// drain event flag.
this.needDrain = false;
// at the start of calling end()
this.ending = false;
// when end() has been called, and returned
this.ended = false;
// when 'finish' is emitted
this.finished = false;
// has it been destroyed
this.destroyed = false;
// should we decode strings into buffers before passing to _write?
// this is here so that some node-core streams can optimize string
// handling at a lower level.
var noDecode = options.decodeStrings === false;
this.decodeStrings = !noDecode;
// Crypto is kind of old and crusty. Historically, its default string
// encoding is 'binary' so we have to make this configurable.
// Everything else in the universe uses 'utf8', though.
this.defaultEncoding = options.defaultEncoding || 'utf8';
// not an actual buffer we keep track of, but a measurement
// of how much we're waiting to get pushed to some underlying
// socket or file.
this.length = 0;
// a flag to see when we're in the middle of a write.
this.writing = false;
// when true all writes will be buffered until .uncork() call
this.corked = 0;
// a flag to be able to tell if the onwrite cb is called immediately,
// or on a later tick. We set this to true at first, because any
// actions that shouldn't happen until "later" should generally also
// not happen before the first write call.
this.sync = true;
// a flag to know if we're processing previously buffered items, which
// may call the _write() callback in the same tick, so that we don't
// end up in an overlapped onwrite situation.
this.bufferProcessing = false;
// the callback that's passed to _write(chunk,cb)
this.onwrite = function (er) {
onwrite(stream, er);
};
// the callback that the user supplies to write(chunk,encoding,cb)
this.writecb = null;
// the amount that is being written when _write is called.
this.writelen = 0;
this.bufferedRequest = null;
this.lastBufferedRequest = null;
// number of pending user-supplied write callbacks
// this must be 0 before 'finish' can be emitted
this.pendingcb = 0;
// emit prefinish if the only thing we're waiting for is _write cbs
// This is relevant for synchronous Transform streams
this.prefinished = false;
// True if the error was already emitted and should not be thrown again
this.errorEmitted = false;
// count buffered requests
this.bufferedRequestCount = 0;
// allocate the first CorkedRequest, there is always
// one allocated and free to use, and we maintain at most two
this.corkedRequestsFree = new CorkedRequest(this);
}
WritableState.prototype.getBuffer = function getBuffer() {
var current = this.bufferedRequest;
var out = [];
while (current) {
out.push(current);
current = current.next;
}
return out;
};
(function () {
try {
Object.defineProperty(WritableState.prototype, 'buffer', {
get: internalUtil.deprecate(function () {
return this.getBuffer();
}, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
});
} catch (_) {}
})();
// Test _writableState for inheritance to account for Duplex streams,
// whose prototype chain only points to Readable.
var realHasInstance;
if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
realHasInstance = Function.prototype[Symbol.hasInstance];
Object.defineProperty(Writable, Symbol.hasInstance, {
value: function (object) {
if (realHasInstance.call(this, object)) return true;
if (this !== Writable) return false;
return object && object._writableState instanceof WritableState;
}
});
} else {
realHasInstance = function (object) {
return object instanceof this;
};
}
function Writable(options) {
Duplex = Duplex || require('./_stream_duplex');
// Writable ctor is applied to Duplexes, too.
// `realHasInstance` is necessary because using plain `instanceof`
// would return false, as no `_writableState` property is attached.
// Trying to use the custom `instanceof` for Writable here will also break the
// Node.js LazyTransform implementation, which has a non-trivial getter for
// `_writableState` that would lead to infinite recursion.
if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
return new Writable(options);
}
this._writableState = new WritableState(options, this);
// legacy.
this.writable = true;
if (options) {
if (typeof options.write === 'function') this._write = options.write;
if (typeof options.writev === 'function') this._writev = options.writev;
if (typeof options.destroy === 'function') this._destroy = options.destroy;
if (typeof options.final === 'function') this._final = options.final;
}
Stream.call(this);
}
// Otherwise people can pipe Writable streams, which is just wrong.
Writable.prototype.pipe = function () {
this.emit('error', new Error('Cannot pipe, not readable'));
};
function writeAfterEnd(stream, cb) {
var er = new Error('write after end');
// TODO: defer error events consistently everywhere, not just the cb
stream.emit('error', er);
processNextTick(cb, er);
}
// Checks that a user-supplied chunk is valid, especially for the particular
// mode the stream is in. Currently this means that `null` is never accepted
// and undefined/non-string values are only allowed in object mode.
function validChunk(stream, state, chunk, cb) {
var valid = true;
var er = false;
if (chunk === null) {
er = new TypeError('May not write null values to stream');
} else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
er = new TypeError('Invalid non-string/buffer chunk');
}
if (er) {
stream.emit('error', er);
processNextTick(cb, er);
valid = false;
}
return valid;
}
Writable.prototype.write = function (chunk, encoding, cb) {
var state = this._writableState;
var ret = false;
var isBuf = !state.objectMode && _isUint8Array(chunk);
if (isBuf && !Buffer.isBuffer(chunk)) {
chunk = _uint8ArrayToBuffer(chunk);
}
if (typeof encoding === 'function') {
cb = encoding;
encoding = null;
}
if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
if (typeof cb !== 'function') cb = nop;
if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
state.pendingcb++;
ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
}
return ret;
};
Writable.prototype.cork = function () {
var state = this._writableState;
state.corked++;
};
Writable.prototype.uncork = function () {
var state = this._writableState;
if (state.corked) {
state.corked--;
if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
}
};
Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
// node::ParseEncoding() requires lower case.
if (typeof encoding === 'string') encoding = encoding.toLowerCase();
if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
this._writableState.defaultEncoding = encoding;
return this;
};
function decodeChunk(state, chunk, encoding) {
if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
chunk = Buffer.from(chunk, encoding);
}
return chunk;
}
// if we're already writing something, then just put this
// in the queue, and wait our turn. Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.
function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
if (!isBuf) {
var newChunk = decodeChunk(state, chunk, encoding);
if (chunk !== newChunk) {
isBuf = true;
encoding = 'buffer';
chunk = newChunk;
}
}
var len = state.objectMode ? 1 : chunk.length;
state.length += len;
var ret = state.length < state.highWaterMark;
// we must ensure that previous needDrain will not be reset to false.
if (!ret) state.needDrain = true;
if (state.writing || state.corked) {
var last = state.lastBufferedRequest;
state.lastBufferedRequest = {
chunk: chunk,
encoding: encoding,
isBuf: isBuf,
callback: cb,
next: null
};
if (last) {
last.next = state.lastBufferedRequest;
} else {
state.bufferedRequest = state.lastBufferedRequest;
}
state.bufferedRequestCount += 1;
} else {
doWrite(stream, state, false, len, chunk, encoding, cb);
}
return ret;
}
function doWrite(stream, state, writev, len, chunk, encoding, cb) {
state.writelen = len;
state.writecb = cb;
state.writing = true;
state.sync = true;
if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
state.sync = false;
}
function onwriteError(stream, state, sync, er, cb) {
--state.pendingcb;
if (sync) {
// defer the callback if we are being called synchronously
// to avoid piling up things on the stack
processNextTick(cb, er);
// this can emit finish, and it will always happen
// after error
processNextTick(finishMaybe, stream, state);
stream._writableState.errorEmitted = true;
stream.emit('error', er);
} else {
// the caller expect this to happen before if
// it is async
cb(er);
stream._writableState.errorEmitted = true;
stream.emit('error', er);
// this can emit finish, but finish must
// always follow error
finishMaybe(stream, state);
}
}
function onwriteStateUpdate(state) {
state.writing = false;
state.writecb = null;
state.length -= state.writelen;
state.writelen = 0;
}
function onwrite(stream, er) {
var state = stream._writableState;
var sync = state.sync;
var cb = state.writecb;
onwriteStateUpdate(state);
if (er) onwriteError(stream, state, sync, er, cb);else {
// Check if we're actually ready to finish, but don't emit yet
var finished = needFinish(state);
if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
clearBuffer(stream, state);
}
if (sync) {
/**/
asyncWrite(afterWrite, stream, state, finished, cb);
/**/
} else {
afterWrite(stream, state, finished, cb);
}
}
}
function afterWrite(stream, state, finished, cb) {
if (!finished) onwriteDrain(stream, state);
state.pendingcb--;
cb();
finishMaybe(stream, state);
}
// Must force callback to be called on nextTick, so that we don't
// emit 'drain' before the write() consumer gets the 'false' return
// value, and has a chance to attach a 'drain' listener.
function onwriteDrain(stream, state) {
if (state.length === 0 && state.needDrain) {
state.needDrain = false;
stream.emit('drain');
}
}
// if there's something in the buffer waiting, then process it
function clearBuffer(stream, state) {
state.bufferProcessing = true;
var entry = state.bufferedRequest;
if (stream._writev && entry && entry.next) {
// Fast case, write everything using _writev()
var l = state.bufferedRequestCount;
var buffer = new Array(l);
var holder = state.corkedRequestsFree;
holder.entry = entry;
var count = 0;
var allBuffers = true;
while (entry) {
buffer[count] = entry;
if (!entry.isBuf) allBuffers = false;
entry = entry.next;
count += 1;
}
buffer.allBuffers = allBuffers;
doWrite(stream, state, true, state.length, buffer, '', holder.finish);
// doWrite is almost always async, defer these to save a bit of time
// as the hot path ends with doWrite
state.pendingcb++;
state.lastBufferedRequest = null;
if (holder.next) {
state.corkedRequestsFree = holder.next;
holder.next = null;
} else {
state.corkedRequestsFree = new CorkedRequest(state);
}
state.bufferedRequestCount = 0;
} else {
// Slow case, write chunks one-by-one
while (entry) {
var chunk = entry.chunk;
var encoding = entry.encoding;
var cb = entry.callback;
var len = state.objectMode ? 1 : chunk.length;
doWrite(stream, state, false, len, chunk, encoding, cb);
entry = entry.next;
state.bufferedRequestCount--;
// if we didn't call the onwrite immediately, then
// it means that we need to wait until it does.
// also, that means that the chunk and cb are currently
// being processed, so move the buffer counter past them.
if (state.writing) {
break;
}
}
if (entry === null) state.lastBufferedRequest = null;
}
state.bufferedRequest = entry;
state.bufferProcessing = false;
}
Writable.prototype._write = function (chunk, encoding, cb) {
cb(new Error('_write() is not implemented'));
};
Writable.prototype._writev = null;
Writable.prototype.end = function (chunk, encoding, cb) {
var state = this._writableState;
if (typeof chunk === 'function') {
cb = chunk;
chunk = null;
encoding = null;
} else if (typeof encoding === 'function') {
cb = encoding;
encoding = null;
}
if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
// .end() fully uncorks
if (state.corked) {
state.corked = 1;
this.uncork();
}
// ignore unnecessary end() calls.
if (!state.ending && !state.finished) endWritable(this, state, cb);
};
function needFinish(state) {
return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
}
function callFinal(stream, state) {
stream._final(function (err) {
state.pendingcb--;
if (err) {
stream.emit('error', err);
}
state.prefinished = true;
stream.emit('prefinish');
finishMaybe(stream, state);
});
}
function prefinish(stream, state) {
if (!state.prefinished && !state.finalCalled) {
if (typeof stream._final === 'function') {
state.pendingcb++;
state.finalCalled = true;
processNextTick(callFinal, stream, state);
} else {
state.prefinished = true;
stream.emit('prefinish');
}
}
}
function finishMaybe(stream, state) {
var need = needFinish(state);
if (need) {
prefinish(stream, state);
if (state.pendingcb === 0) {
state.finished = true;
stream.emit('finish');
}
}
return need;
}
function endWritable(stream, state, cb) {
state.ending = true;
finishMaybe(stream, state);
if (cb) {
if (state.finished) processNextTick(cb);else stream.once('finish', cb);
}
state.ended = true;
stream.writable = false;
}
function onCorkedFinish(corkReq, state, err) {
var entry = corkReq.entry;
corkReq.entry = null;
while (entry) {
var cb = entry.callback;
state.pendingcb--;
cb(err);
entry = entry.next;
}
if (state.corkedRequestsFree) {
state.corkedRequestsFree.next = corkReq;
} else {
state.corkedRequestsFree = corkReq;
}
}
Object.defineProperty(Writable.prototype, 'destroyed', {
get: function () {
if (this._writableState === undefined) {
return false;
}
return this._writableState.destroyed;
},
set: function (value) {
// we ignore the value if the stream
// has not been initialized yet
if (!this._writableState) {
return;
}
// backward compatibility, the user is explicitly
// managing destroyed
this._writableState.destroyed = value;
}
});
Writable.prototype.destroy = destroyImpl.destroy;
Writable.prototype._undestroy = destroyImpl.undestroy;
Writable.prototype._destroy = function (err, cb) {
this.end();
cb(err);
};
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./_stream_duplex":97,"./internal/streams/destroy":103,"./internal/streams/stream":104,"_process":93,"core-util-is":37,"inherits":79,"process-nextick-args":92,"safe-buffer":108,"util-deprecate":140}],102:[function(require,module,exports){
'use strict';
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Buffer = require('safe-buffer').Buffer;
var util = require('util');
function copyBuffer(src, target, offset) {
src.copy(target, offset);
}
module.exports = function () {
function BufferList() {
_classCallCheck(this, BufferList);
this.head = null;
this.tail = null;
this.length = 0;
}
BufferList.prototype.push = function push(v) {
var entry = { data: v, next: null };
if (this.length > 0) this.tail.next = entry;else this.head = entry;
this.tail = entry;
++this.length;
};
BufferList.prototype.unshift = function unshift(v) {
var entry = { data: v, next: this.head };
if (this.length === 0) this.tail = entry;
this.head = entry;
++this.length;
};
BufferList.prototype.shift = function shift() {
if (this.length === 0) return;
var ret = this.head.data;
if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
--this.length;
return ret;
};
BufferList.prototype.clear = function clear() {
this.head = this.tail = null;
this.length = 0;
};
BufferList.prototype.join = function join(s) {
if (this.length === 0) return '';
var p = this.head;
var ret = '' + p.data;
while (p = p.next) {
ret += s + p.data;
}return ret;
};
BufferList.prototype.concat = function concat(n) {
if (this.length === 0) return Buffer.alloc(0);
if (this.length === 1) return this.head.data;
var ret = Buffer.allocUnsafe(n >>> 0);
var p = this.head;
var i = 0;
while (p) {
copyBuffer(p.data, ret, i);
i += p.data.length;
p = p.next;
}
return ret;
};
return BufferList;
}();
if (util && util.inspect && util.inspect.custom) {
module.exports.prototype[util.inspect.custom] = function () {
var obj = util.inspect({ length: this.length });
return this.constructor.name + ' ' + obj;
};
}
},{"safe-buffer":108,"util":25}],103:[function(require,module,exports){
'use strict';
/**/
var processNextTick = require('process-nextick-args').nextTick;
/**/
// undocumented cb() API, needed for core, not for public API
function destroy(err, cb) {
var _this = this;
var readableDestroyed = this._readableState && this._readableState.destroyed;
var writableDestroyed = this._writableState && this._writableState.destroyed;
if (readableDestroyed || writableDestroyed) {
if (cb) {
cb(err);
} else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
processNextTick(emitErrorNT, this, err);
}
return this;
}
// we set destroyed to true before firing error callbacks in order
// to make it re-entrance safe in case destroy() is called within callbacks
if (this._readableState) {
this._readableState.destroyed = true;
}
// if this is a duplex stream mark the writable part as destroyed as well
if (this._writableState) {
this._writableState.destroyed = true;
}
this._destroy(err || null, function (err) {
if (!cb && err) {
processNextTick(emitErrorNT, _this, err);
if (_this._writableState) {
_this._writableState.errorEmitted = true;
}
} else if (cb) {
cb(err);
}
});
return this;
}
function undestroy() {
if (this._readableState) {
this._readableState.destroyed = false;
this._readableState.reading = false;
this._readableState.ended = false;
this._readableState.endEmitted = false;
}
if (this._writableState) {
this._writableState.destroyed = false;
this._writableState.ended = false;
this._writableState.ending = false;
this._writableState.finished = false;
this._writableState.errorEmitted = false;
}
}
function emitErrorNT(self, err) {
self.emit('error', err);
}
module.exports = {
destroy: destroy,
undestroy: undestroy
};
},{"process-nextick-args":92}],104:[function(require,module,exports){
module.exports = require('events').EventEmitter;
},{"events":26}],105:[function(require,module,exports){
exports = module.exports = require('./lib/_stream_readable.js');
exports.Stream = exports;
exports.Readable = exports;
exports.Writable = require('./lib/_stream_writable.js');
exports.Duplex = require('./lib/_stream_duplex.js');
exports.Transform = require('./lib/_stream_transform.js');
exports.PassThrough = require('./lib/_stream_passthrough.js');
},{"./lib/_stream_duplex.js":97,"./lib/_stream_passthrough.js":98,"./lib/_stream_readable.js":99,"./lib/_stream_transform.js":100,"./lib/_stream_writable.js":101}],106:[function(require,module,exports){
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.createREGL = factory());
}(this, (function () { 'use strict';
var isTypedArray = function (x) {
return (
x instanceof Uint8Array ||
x instanceof Uint16Array ||
x instanceof Uint32Array ||
x instanceof Int8Array ||
x instanceof Int16Array ||
x instanceof Int32Array ||
x instanceof Float32Array ||
x instanceof Float64Array ||
x instanceof Uint8ClampedArray
)
}
var extend = function (base, opts) {
var keys = Object.keys(opts)
for (var i = 0; i < keys.length; ++i) {
base[keys[i]] = opts[keys[i]]
}
return base
}
// Error checking and parameter validation.
//
// Statements for the form `check.someProcedure(...)` get removed by
// a browserify transform for optimized/minified bundles.
//
/* globals atob */
var endl = '\n'
// only used for extracting shader names. if atob not present, then errors
// will be slightly crappier
function decodeB64 (str) {
if (typeof atob !== 'undefined') {
return atob(str)
}
return 'base64:' + str
}
function raise (message) {
var error = new Error('(regl) ' + message)
console.error(error)
throw error
}
function check (pred, message) {
if (!pred) {
raise(message)
}
}
function encolon (message) {
if (message) {
return ': ' + message
}
return ''
}
function checkParameter (param, possibilities, message) {
if (!(param in possibilities)) {
raise('unknown parameter (' + param + ')' + encolon(message) +
'. possible values: ' + Object.keys(possibilities).join())
}
}
function checkIsTypedArray (data, message) {
if (!isTypedArray(data)) {
raise(
'invalid parameter type' + encolon(message) +
'. must be a typed array')
}
}
function standardTypeEh (value, type) {
switch (type) {
case 'number': return typeof value === 'number'
case 'object': return typeof value === 'object'
case 'string': return typeof value === 'string'
case 'boolean': return typeof value === 'boolean'
case 'function': return typeof value === 'function'
case 'undefined': return typeof value === 'undefined'
case 'symbol': return typeof value === 'symbol'
}
}
function checkTypeOf (value, type, message) {
if (!standardTypeEh(value, type)) {
raise(
'invalid parameter type' + encolon(message) +
'. expected ' + type + ', got ' + (typeof value))
}
}
function checkNonNegativeInt (value, message) {
if (!((value >= 0) &&
((value | 0) === value))) {
raise('invalid parameter type, (' + value + ')' + encolon(message) +
'. must be a nonnegative integer')
}
}
function checkOneOf (value, list, message) {
if (list.indexOf(value) < 0) {
raise('invalid value' + encolon(message) + '. must be one of: ' + list)
}
}
var constructorKeys = [
'gl',
'canvas',
'container',
'attributes',
'pixelRatio',
'extensions',
'optionalExtensions',
'profile',
'onDone'
]
function checkConstructor (obj) {
Object.keys(obj).forEach(function (key) {
if (constructorKeys.indexOf(key) < 0) {
raise('invalid regl constructor argument "' + key + '". must be one of ' + constructorKeys)
}
})
}
function leftPad (str, n) {
str = str + ''
while (str.length < n) {
str = ' ' + str
}
return str
}
function ShaderFile () {
this.name = 'unknown'
this.lines = []
this.index = {}
this.hasErrors = false
}
function ShaderLine (number, line) {
this.number = number
this.line = line
this.errors = []
}
function ShaderError (fileNumber, lineNumber, message) {
this.file = fileNumber
this.line = lineNumber
this.message = message
}
function guessCommand () {
var error = new Error()
var stack = (error.stack || error).toString()
var pat = /compileProcedure.*\n\s*at.*\((.*)\)/.exec(stack)
if (pat) {
return pat[1]
}
var pat2 = /compileProcedure.*\n\s*at\s+(.*)(\n|$)/.exec(stack)
if (pat2) {
return pat2[1]
}
return 'unknown'
}
function guessCallSite () {
var error = new Error()
var stack = (error.stack || error).toString()
var pat = /at REGLCommand.*\n\s+at.*\((.*)\)/.exec(stack)
if (pat) {
return pat[1]
}
var pat2 = /at REGLCommand.*\n\s+at\s+(.*)\n/.exec(stack)
if (pat2) {
return pat2[1]
}
return 'unknown'
}
function parseSource (source, command) {
var lines = source.split('\n')
var lineNumber = 1
var fileNumber = 0
var files = {
unknown: new ShaderFile(),
0: new ShaderFile()
}
files.unknown.name = files[0].name = command || guessCommand()
files.unknown.lines.push(new ShaderLine(0, ''))
for (var i = 0; i < lines.length; ++i) {
var line = lines[i]
var parts = /^\s*#\s*(\w+)\s+(.+)\s*$/.exec(line)
if (parts) {
switch (parts[1]) {
case 'line':
var lineNumberInfo = /(\d+)(\s+\d+)?/.exec(parts[2])
if (lineNumberInfo) {
lineNumber = lineNumberInfo[1] | 0
if (lineNumberInfo[2]) {
fileNumber = lineNumberInfo[2] | 0
if (!(fileNumber in files)) {
files[fileNumber] = new ShaderFile()
}
}
}
break
case 'define':
var nameInfo = /SHADER_NAME(_B64)?\s+(.*)$/.exec(parts[2])
if (nameInfo) {
files[fileNumber].name = (nameInfo[1]
? decodeB64(nameInfo[2])
: nameInfo[2])
}
break
}
}
files[fileNumber].lines.push(new ShaderLine(lineNumber++, line))
}
Object.keys(files).forEach(function (fileNumber) {
var file = files[fileNumber]
file.lines.forEach(function (line) {
file.index[line.number] = line
})
})
return files
}
function parseErrorLog (errLog) {
var result = []
errLog.split('\n').forEach(function (errMsg) {
if (errMsg.length < 5) {
return
}
var parts = /^ERROR:\s+(\d+):(\d+):\s*(.*)$/.exec(errMsg)
if (parts) {
result.push(new ShaderError(
parts[1] | 0,
parts[2] | 0,
parts[3].trim()))
} else if (errMsg.length > 0) {
result.push(new ShaderError('unknown', 0, errMsg))
}
})
return result
}
function annotateFiles (files, errors) {
errors.forEach(function (error) {
var file = files[error.file]
if (file) {
var line = file.index[error.line]
if (line) {
line.errors.push(error)
file.hasErrors = true
return
}
}
files.unknown.hasErrors = true
files.unknown.lines[0].errors.push(error)
})
}
function checkShaderError (gl, shader, source, type, command) {
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
var errLog = gl.getShaderInfoLog(shader)
var typeName = type === gl.FRAGMENT_SHADER ? 'fragment' : 'vertex'
checkCommandType(source, 'string', typeName + ' shader source must be a string', command)
var files = parseSource(source, command)
var errors = parseErrorLog(errLog)
annotateFiles(files, errors)
Object.keys(files).forEach(function (fileNumber) {
var file = files[fileNumber]
if (!file.hasErrors) {
return
}
var strings = ['']
var styles = ['']
function push (str, style) {
strings.push(str)
styles.push(style || '')
}
push('file number ' + fileNumber + ': ' + file.name + '\n', 'color:red;text-decoration:underline;font-weight:bold')
file.lines.forEach(function (line) {
if (line.errors.length > 0) {
push(leftPad(line.number, 4) + '| ', 'background-color:yellow; font-weight:bold')
push(line.line + endl, 'color:red; background-color:yellow; font-weight:bold')
// try to guess token
var offset = 0
line.errors.forEach(function (error) {
var message = error.message
var token = /^\s*'(.*)'\s*:\s*(.*)$/.exec(message)
if (token) {
var tokenPat = token[1]
message = token[2]
switch (tokenPat) {
case 'assign':
tokenPat = '='
break
}
offset = Math.max(line.line.indexOf(tokenPat, offset), 0)
} else {
offset = 0
}
push(leftPad('| ', 6))
push(leftPad('^^^', offset + 3) + endl, 'font-weight:bold')
push(leftPad('| ', 6))
push(message + endl, 'font-weight:bold')
})
push(leftPad('| ', 6) + endl)
} else {
push(leftPad(line.number, 4) + '| ')
push(line.line + endl, 'color:red')
}
})
if (typeof document !== 'undefined' && !window.chrome) {
styles[0] = strings.join('%c')
console.log.apply(console, styles)
} else {
console.log(strings.join(''))
}
})
check.raise('Error compiling ' + typeName + ' shader, ' + files[0].name)
}
}
function checkLinkError (gl, program, fragShader, vertShader, command) {
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
var errLog = gl.getProgramInfoLog(program)
var fragParse = parseSource(fragShader, command)
var vertParse = parseSource(vertShader, command)
var header = 'Error linking program with vertex shader, "' +
vertParse[0].name + '", and fragment shader "' + fragParse[0].name + '"'
if (typeof document !== 'undefined') {
console.log('%c' + header + endl + '%c' + errLog,
'color:red;text-decoration:underline;font-weight:bold',
'color:red')
} else {
console.log(header + endl + errLog)
}
check.raise(header)
}
}
function saveCommandRef (object) {
object._commandRef = guessCommand()
}
function saveDrawCommandInfo (opts, uniforms, attributes, stringStore) {
saveCommandRef(opts)
function id (str) {
if (str) {
return stringStore.id(str)
}
return 0
}
opts._fragId = id(opts.static.frag)
opts._vertId = id(opts.static.vert)
function addProps (dict, set) {
Object.keys(set).forEach(function (u) {
dict[stringStore.id(u)] = true
})
}
var uniformSet = opts._uniformSet = {}
addProps(uniformSet, uniforms.static)
addProps(uniformSet, uniforms.dynamic)
var attributeSet = opts._attributeSet = {}
addProps(attributeSet, attributes.static)
addProps(attributeSet, attributes.dynamic)
opts._hasCount = (
'count' in opts.static ||
'count' in opts.dynamic ||
'elements' in opts.static ||
'elements' in opts.dynamic)
}
function commandRaise (message, command) {
var callSite = guessCallSite()
raise(message +
' in command ' + (command || guessCommand()) +
(callSite === 'unknown' ? '' : ' called from ' + callSite))
}
function checkCommand (pred, message, command) {
if (!pred) {
commandRaise(message, command || guessCommand())
}
}
function checkParameterCommand (param, possibilities, message, command) {
if (!(param in possibilities)) {
commandRaise(
'unknown parameter (' + param + ')' + encolon(message) +
'. possible values: ' + Object.keys(possibilities).join(),
command || guessCommand())
}
}
function checkCommandType (value, type, message, command) {
if (!standardTypeEh(value, type)) {
commandRaise(
'invalid parameter type' + encolon(message) +
'. expected ' + type + ', got ' + (typeof value),
command || guessCommand())
}
}
function checkOptional (block) {
block()
}
function checkFramebufferFormat (attachment, texFormats, rbFormats) {
if (attachment.texture) {
checkOneOf(
attachment.texture._texture.internalformat,
texFormats,
'unsupported texture format for attachment')
} else {
checkOneOf(
attachment.renderbuffer._renderbuffer.format,
rbFormats,
'unsupported renderbuffer format for attachment')
}
}
var GL_CLAMP_TO_EDGE = 0x812F
var GL_NEAREST = 0x2600
var GL_NEAREST_MIPMAP_NEAREST = 0x2700
var GL_LINEAR_MIPMAP_NEAREST = 0x2701
var GL_NEAREST_MIPMAP_LINEAR = 0x2702
var GL_LINEAR_MIPMAP_LINEAR = 0x2703
var GL_BYTE = 5120
var GL_UNSIGNED_BYTE = 5121
var GL_SHORT = 5122
var GL_UNSIGNED_SHORT = 5123
var GL_INT = 5124
var GL_UNSIGNED_INT = 5125
var GL_FLOAT = 5126
var GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033
var GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034
var GL_UNSIGNED_SHORT_5_6_5 = 0x8363
var GL_UNSIGNED_INT_24_8_WEBGL = 0x84FA
var GL_HALF_FLOAT_OES = 0x8D61
var TYPE_SIZE = {}
TYPE_SIZE[GL_BYTE] =
TYPE_SIZE[GL_UNSIGNED_BYTE] = 1
TYPE_SIZE[GL_SHORT] =
TYPE_SIZE[GL_UNSIGNED_SHORT] =
TYPE_SIZE[GL_HALF_FLOAT_OES] =
TYPE_SIZE[GL_UNSIGNED_SHORT_5_6_5] =
TYPE_SIZE[GL_UNSIGNED_SHORT_4_4_4_4] =
TYPE_SIZE[GL_UNSIGNED_SHORT_5_5_5_1] = 2
TYPE_SIZE[GL_INT] =
TYPE_SIZE[GL_UNSIGNED_INT] =
TYPE_SIZE[GL_FLOAT] =
TYPE_SIZE[GL_UNSIGNED_INT_24_8_WEBGL] = 4
function pixelSize (type, channels) {
if (type === GL_UNSIGNED_SHORT_5_5_5_1 ||
type === GL_UNSIGNED_SHORT_4_4_4_4 ||
type === GL_UNSIGNED_SHORT_5_6_5) {
return 2
} else if (type === GL_UNSIGNED_INT_24_8_WEBGL) {
return 4
} else {
return TYPE_SIZE[type] * channels
}
}
function isPow2 (v) {
return !(v & (v - 1)) && (!!v)
}
function checkTexture2D (info, mipData, limits) {
var i
var w = mipData.width
var h = mipData.height
var c = mipData.channels
// Check texture shape
check(w > 0 && w <= limits.maxTextureSize &&
h > 0 && h <= limits.maxTextureSize,
'invalid texture shape')
// check wrap mode
if (info.wrapS !== GL_CLAMP_TO_EDGE || info.wrapT !== GL_CLAMP_TO_EDGE) {
check(isPow2(w) && isPow2(h),
'incompatible wrap mode for texture, both width and height must be power of 2')
}
if (mipData.mipmask === 1) {
if (w !== 1 && h !== 1) {
check(
info.minFilter !== GL_NEAREST_MIPMAP_NEAREST &&
info.minFilter !== GL_NEAREST_MIPMAP_LINEAR &&
info.minFilter !== GL_LINEAR_MIPMAP_NEAREST &&
info.minFilter !== GL_LINEAR_MIPMAP_LINEAR,
'min filter requires mipmap')
}
} else {
// texture must be power of 2
check(isPow2(w) && isPow2(h),
'texture must be a square power of 2 to support mipmapping')
check(mipData.mipmask === (w << 1) - 1,
'missing or incomplete mipmap data')
}
if (mipData.type === GL_FLOAT) {
if (limits.extensions.indexOf('oes_texture_float_linear') < 0) {
check(info.minFilter === GL_NEAREST && info.magFilter === GL_NEAREST,
'filter not supported, must enable oes_texture_float_linear')
}
check(!info.genMipmaps,
'mipmap generation not supported with float textures')
}
// check image complete
var mipimages = mipData.images
for (i = 0; i < 16; ++i) {
if (mipimages[i]) {
var mw = w >> i
var mh = h >> i
check(mipData.mipmask & (1 << i), 'missing mipmap data')
var img = mipimages[i]
check(
img.width === mw &&
img.height === mh,
'invalid shape for mip images')
check(
img.format === mipData.format &&
img.internalformat === mipData.internalformat &&
img.type === mipData.type,
'incompatible type for mip image')
if (img.compressed) {
// TODO: check size for compressed images
} else if (img.data) {
// check(img.data.byteLength === mw * mh *
// Math.max(pixelSize(img.type, c), img.unpackAlignment),
var rowSize = Math.ceil(pixelSize(img.type, c) * mw / img.unpackAlignment) * img.unpackAlignment
check(img.data.byteLength === rowSize * mh,
'invalid data for image, buffer size is inconsistent with image format')
} else if (img.element) {
// TODO: check element can be loaded
} else if (img.copy) {
// TODO: check compatible format and type
}
} else if (!info.genMipmaps) {
check((mipData.mipmask & (1 << i)) === 0, 'extra mipmap data')
}
}
if (mipData.compressed) {
check(!info.genMipmaps,
'mipmap generation for compressed images not supported')
}
}
function checkTextureCube (texture, info, faces, limits) {
var w = texture.width
var h = texture.height
var c = texture.channels
// Check texture shape
check(
w > 0 && w <= limits.maxTextureSize && h > 0 && h <= limits.maxTextureSize,
'invalid texture shape')
check(
w === h,
'cube map must be square')
check(
info.wrapS === GL_CLAMP_TO_EDGE && info.wrapT === GL_CLAMP_TO_EDGE,
'wrap mode not supported by cube map')
for (var i = 0; i < faces.length; ++i) {
var face = faces[i]
check(
face.width === w && face.height === h,
'inconsistent cube map face shape')
if (info.genMipmaps) {
check(!face.compressed,
'can not generate mipmap for compressed textures')
check(face.mipmask === 1,
'can not specify mipmaps and generate mipmaps')
} else {
// TODO: check mip and filter mode
}
var mipmaps = face.images
for (var j = 0; j < 16; ++j) {
var img = mipmaps[j]
if (img) {
var mw = w >> j
var mh = h >> j
check(face.mipmask & (1 << j), 'missing mipmap data')
check(
img.width === mw &&
img.height === mh,
'invalid shape for mip images')
check(
img.format === texture.format &&
img.internalformat === texture.internalformat &&
img.type === texture.type,
'incompatible type for mip image')
if (img.compressed) {
// TODO: check size for compressed images
} else if (img.data) {
check(img.data.byteLength === mw * mh *
Math.max(pixelSize(img.type, c), img.unpackAlignment),
'invalid data for image, buffer size is inconsistent with image format')
} else if (img.element) {
// TODO: check element can be loaded
} else if (img.copy) {
// TODO: check compatible format and type
}
}
}
}
}
var check$1 = extend(check, {
optional: checkOptional,
raise: raise,
commandRaise: commandRaise,
command: checkCommand,
parameter: checkParameter,
commandParameter: checkParameterCommand,
constructor: checkConstructor,
type: checkTypeOf,
commandType: checkCommandType,
isTypedArray: checkIsTypedArray,
nni: checkNonNegativeInt,
oneOf: checkOneOf,
shaderError: checkShaderError,
linkError: checkLinkError,
callSite: guessCallSite,
saveCommandRef: saveCommandRef,
saveDrawInfo: saveDrawCommandInfo,
framebufferFormat: checkFramebufferFormat,
guessCommand: guessCommand,
texture2D: checkTexture2D,
textureCube: checkTextureCube
});
var VARIABLE_COUNTER = 0
var DYN_FUNC = 0
var DYN_CONSTANT = 5
var DYN_ARRAY = 6
function DynamicVariable (type, data) {
this.id = (VARIABLE_COUNTER++)
this.type = type
this.data = data
}
function escapeStr (str) {
return str.replace(/\\/g, '\\\\').replace(/"/g, '\\"')
}
function splitParts (str) {
if (str.length === 0) {
return []
}
var firstChar = str.charAt(0)
var lastChar = str.charAt(str.length - 1)
if (str.length > 1 &&
firstChar === lastChar &&
(firstChar === '"' || firstChar === "'")) {
return ['"' + escapeStr(str.substr(1, str.length - 2)) + '"']
}
var parts = /\[(false|true|null|\d+|'[^']*'|"[^"]*")\]/.exec(str)
if (parts) {
return (
splitParts(str.substr(0, parts.index))
.concat(splitParts(parts[1]))
.concat(splitParts(str.substr(parts.index + parts[0].length)))
)
}
var subparts = str.split('.')
if (subparts.length === 1) {
return ['"' + escapeStr(str) + '"']
}
var result = []
for (var i = 0; i < subparts.length; ++i) {
result = result.concat(splitParts(subparts[i]))
}
return result
}
function toAccessorString (str) {
return '[' + splitParts(str).join('][') + ']'
}
function defineDynamic (type, data) {
return new DynamicVariable(type, toAccessorString(data + ''))
}
function isDynamic (x) {
return (typeof x === 'function' && !x._reglType) || (x instanceof DynamicVariable)
}
function unbox (x, path) {
if (typeof x === 'function') {
return new DynamicVariable(DYN_FUNC, x)
} else if (typeof x === 'number' || typeof x === 'boolean') {
return new DynamicVariable(DYN_CONSTANT, x)
} else if (Array.isArray(x)) {
return new DynamicVariable(DYN_ARRAY, x.map((y, i) => unbox(y, path + '[' + i + ']')))
} else if (x instanceof DynamicVariable) {
return x
}
check$1(false, 'invalid option type in uniform ' + path)
}
var dynamic = {
DynamicVariable: DynamicVariable,
define: defineDynamic,
isDynamic: isDynamic,
unbox: unbox,
accessor: toAccessorString
};
/* globals requestAnimationFrame, cancelAnimationFrame */
var raf = {
next: typeof requestAnimationFrame === 'function'
? function (cb) { return requestAnimationFrame(cb) }
: function (cb) { return setTimeout(cb, 16) },
cancel: typeof cancelAnimationFrame === 'function'
? function (raf) { return cancelAnimationFrame(raf) }
: clearTimeout
};
/* globals performance */
var clock = (typeof performance !== 'undefined' && performance.now)
? function () { return performance.now() }
: function () { return +(new Date()) };
function createStringStore () {
var stringIds = { '': 0 }
var stringValues = ['']
return {
id: function (str) {
var result = stringIds[str]
if (result) {
return result
}
result = stringIds[str] = stringValues.length
stringValues.push(str)
return result
},
str: function (id) {
return stringValues[id]
}
}
}
// Context and canvas creation helper functions
function createCanvas (element, onDone, pixelRatio) {
var canvas = document.createElement('canvas')
extend(canvas.style, {
border: 0,
margin: 0,
padding: 0,
top: 0,
left: 0
})
element.appendChild(canvas)
if (element === document.body) {
canvas.style.position = 'absolute'
extend(element.style, {
margin: 0,
padding: 0
})
}
function resize () {
var w = window.innerWidth
var h = window.innerHeight
if (element !== document.body) {
var bounds = element.getBoundingClientRect()
w = bounds.right - bounds.left
h = bounds.bottom - bounds.top
}
canvas.width = pixelRatio * w
canvas.height = pixelRatio * h
extend(canvas.style, {
width: w + 'px',
height: h + 'px'
})
}
var resizeObserver
if (element !== document.body && typeof ResizeObserver === 'function') {
// ignore 'ResizeObserver' is not defined
// eslint-disable-next-line
resizeObserver = new ResizeObserver(function () {
// setTimeout to avoid flicker
setTimeout(resize)
})
resizeObserver.observe(element)
} else {
window.addEventListener('resize', resize, false)
}
function onDestroy () {
if (resizeObserver) {
resizeObserver.disconnect()
} else {
window.removeEventListener('resize', resize)
}
element.removeChild(canvas)
}
resize()
return {
canvas: canvas,
onDestroy: onDestroy
}
}
function createContext (canvas, contextAttributes) {
function get (name) {
try {
return canvas.getContext(name, contextAttributes)
} catch (e) {
return null
}
}
return (
get('webgl') ||
get('experimental-webgl') ||
get('webgl-experimental')
)
}
function isHTMLElement (obj) {
return (
typeof obj.nodeName === 'string' &&
typeof obj.appendChild === 'function' &&
typeof obj.getBoundingClientRect === 'function'
)
}
function isWebGLContext (obj) {
return (
typeof obj.drawArrays === 'function' ||
typeof obj.drawElements === 'function'
)
}
function parseExtensions (input) {
if (typeof input === 'string') {
return input.split()
}
check$1(Array.isArray(input), 'invalid extension array')
return input
}
function getElement (desc) {
if (typeof desc === 'string') {
check$1(typeof document !== 'undefined', 'not supported outside of DOM')
return document.querySelector(desc)
}
return desc
}
function parseArgs (args_) {
var args = args_ || {}
var element, container, canvas, gl
var contextAttributes = {}
var extensions = []
var optionalExtensions = []
var pixelRatio = (typeof window === 'undefined' ? 1 : window.devicePixelRatio)
var profile = false
var onDone = function (err) {
if (err) {
check$1.raise(err)
}
}
var onDestroy = function () {}
if (typeof args === 'string') {
check$1(
typeof document !== 'undefined',
'selector queries only supported in DOM enviroments')
element = document.querySelector(args)
check$1(element, 'invalid query string for element')
} else if (typeof args === 'object') {
if (isHTMLElement(args)) {
element = args
} else if (isWebGLContext(args)) {
gl = args
canvas = gl.canvas
} else {
check$1.constructor(args)
if ('gl' in args) {
gl = args.gl
} else if ('canvas' in args) {
canvas = getElement(args.canvas)
} else if ('container' in args) {
container = getElement(args.container)
}
if ('attributes' in args) {
contextAttributes = args.attributes
check$1.type(contextAttributes, 'object', 'invalid context attributes')
}
if ('extensions' in args) {
extensions = parseExtensions(args.extensions)
}
if ('optionalExtensions' in args) {
optionalExtensions = parseExtensions(args.optionalExtensions)
}
if ('onDone' in args) {
check$1.type(
args.onDone, 'function',
'invalid or missing onDone callback')
onDone = args.onDone
}
if ('profile' in args) {
profile = !!args.profile
}
if ('pixelRatio' in args) {
pixelRatio = +args.pixelRatio
check$1(pixelRatio > 0, 'invalid pixel ratio')
}
}
} else {
check$1.raise('invalid arguments to regl')
}
if (element) {
if (element.nodeName.toLowerCase() === 'canvas') {
canvas = element
} else {
container = element
}
}
if (!gl) {
if (!canvas) {
check$1(
typeof document !== 'undefined',
'must manually specify webgl context outside of DOM environments')
var result = createCanvas(container || document.body, onDone, pixelRatio)
if (!result) {
return null
}
canvas = result.canvas
onDestroy = result.onDestroy
}
// workaround for chromium bug, premultiplied alpha value is platform dependent
if (contextAttributes.premultipliedAlpha === undefined) contextAttributes.premultipliedAlpha = true
gl = createContext(canvas, contextAttributes)
}
if (!gl) {
onDestroy()
onDone('webgl not supported, try upgrading your browser or graphics drivers http://get.webgl.org')
return null
}
return {
gl: gl,
canvas: canvas,
container: container,
extensions: extensions,
optionalExtensions: optionalExtensions,
pixelRatio: pixelRatio,
profile: profile,
onDone: onDone,
onDestroy: onDestroy
}
}
function createExtensionCache (gl, config) {
var extensions = {}
function tryLoadExtension (name_) {
check$1.type(name_, 'string', 'extension name must be string')
var name = name_.toLowerCase()
var ext
try {
ext = extensions[name] = gl.getExtension(name)
} catch (e) {}
return !!ext
}
for (var i = 0; i < config.extensions.length; ++i) {
var name = config.extensions[i]
if (!tryLoadExtension(name)) {
config.onDestroy()
config.onDone('"' + name + '" extension is not supported by the current WebGL context, try upgrading your system or a different browser')
return null
}
}
config.optionalExtensions.forEach(tryLoadExtension)
return {
extensions: extensions,
restore: function () {
Object.keys(extensions).forEach(function (name) {
if (extensions[name] && !tryLoadExtension(name)) {
throw new Error('(regl): error restoring extension ' + name)
}
})
}
}
}
function loop (n, f) {
var result = Array(n)
for (var i = 0; i < n; ++i) {
result[i] = f(i)
}
return result
}
var GL_BYTE$1 = 5120
var GL_UNSIGNED_BYTE$2 = 5121
var GL_SHORT$1 = 5122
var GL_UNSIGNED_SHORT$1 = 5123
var GL_INT$1 = 5124
var GL_UNSIGNED_INT$1 = 5125
var GL_FLOAT$2 = 5126
function nextPow16 (v) {
for (var i = 16; i <= (1 << 28); i *= 16) {
if (v <= i) {
return i
}
}
return 0
}
function log2 (v) {
var r, shift
r = (v > 0xFFFF) << 4
v >>>= r
shift = (v > 0xFF) << 3
v >>>= shift; r |= shift
shift = (v > 0xF) << 2
v >>>= shift; r |= shift
shift = (v > 0x3) << 1
v >>>= shift; r |= shift
return r | (v >> 1)
}
function createPool () {
var bufferPool = loop(8, function () {
return []
})
function alloc (n) {
var sz = nextPow16(n)
var bin = bufferPool[log2(sz) >> 2]
if (bin.length > 0) {
return bin.pop()
}
return new ArrayBuffer(sz)
}
function free (buf) {
bufferPool[log2(buf.byteLength) >> 2].push(buf)
}
function allocType (type, n) {
var result = null
switch (type) {
case GL_BYTE$1:
result = new Int8Array(alloc(n), 0, n)
break
case GL_UNSIGNED_BYTE$2:
result = new Uint8Array(alloc(n), 0, n)
break
case GL_SHORT$1:
result = new Int16Array(alloc(2 * n), 0, n)
break
case GL_UNSIGNED_SHORT$1:
result = new Uint16Array(alloc(2 * n), 0, n)
break
case GL_INT$1:
result = new Int32Array(alloc(4 * n), 0, n)
break
case GL_UNSIGNED_INT$1:
result = new Uint32Array(alloc(4 * n), 0, n)
break
case GL_FLOAT$2:
result = new Float32Array(alloc(4 * n), 0, n)
break
default:
return null
}
if (result.length !== n) {
return result.subarray(0, n)
}
return result
}
function freeType (array) {
free(array.buffer)
}
return {
alloc: alloc,
free: free,
allocType: allocType,
freeType: freeType
}
}
var pool = createPool()
// zero pool for initial zero data
pool.zero = createPool()
var GL_SUBPIXEL_BITS = 0x0D50
var GL_RED_BITS = 0x0D52
var GL_GREEN_BITS = 0x0D53
var GL_BLUE_BITS = 0x0D54
var GL_ALPHA_BITS = 0x0D55
var GL_DEPTH_BITS = 0x0D56
var GL_STENCIL_BITS = 0x0D57
var GL_ALIASED_POINT_SIZE_RANGE = 0x846D
var GL_ALIASED_LINE_WIDTH_RANGE = 0x846E
var GL_MAX_TEXTURE_SIZE = 0x0D33
var GL_MAX_VIEWPORT_DIMS = 0x0D3A
var GL_MAX_VERTEX_ATTRIBS = 0x8869
var GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB
var GL_MAX_VARYING_VECTORS = 0x8DFC
var GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D
var GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C
var GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872
var GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD
var GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C
var GL_MAX_RENDERBUFFER_SIZE = 0x84E8
var GL_VENDOR = 0x1F00
var GL_RENDERER = 0x1F01
var GL_VERSION = 0x1F02
var GL_SHADING_LANGUAGE_VERSION = 0x8B8C
var GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF
var GL_MAX_COLOR_ATTACHMENTS_WEBGL = 0x8CDF
var GL_MAX_DRAW_BUFFERS_WEBGL = 0x8824
var GL_TEXTURE_2D = 0x0DE1
var GL_TEXTURE_CUBE_MAP = 0x8513
var GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515
var GL_TEXTURE0 = 0x84C0
var GL_RGBA = 0x1908
var GL_FLOAT$1 = 0x1406
var GL_UNSIGNED_BYTE$1 = 0x1401
var GL_FRAMEBUFFER = 0x8D40
var GL_FRAMEBUFFER_COMPLETE = 0x8CD5
var GL_COLOR_ATTACHMENT0 = 0x8CE0
var GL_COLOR_BUFFER_BIT$1 = 0x4000
var wrapLimits = function (gl, extensions) {
var maxAnisotropic = 1
if (extensions.ext_texture_filter_anisotropic) {
maxAnisotropic = gl.getParameter(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)
}
var maxDrawbuffers = 1
var maxColorAttachments = 1
if (extensions.webgl_draw_buffers) {
maxDrawbuffers = gl.getParameter(GL_MAX_DRAW_BUFFERS_WEBGL)
maxColorAttachments = gl.getParameter(GL_MAX_COLOR_ATTACHMENTS_WEBGL)
}
// detect if reading float textures is available (Safari doesn't support)
var readFloat = !!extensions.oes_texture_float
if (readFloat) {
var readFloatTexture = gl.createTexture()
gl.bindTexture(GL_TEXTURE_2D, readFloatTexture)
gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_FLOAT$1, null)
var fbo = gl.createFramebuffer()
gl.bindFramebuffer(GL_FRAMEBUFFER, fbo)
gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, readFloatTexture, 0)
gl.bindTexture(GL_TEXTURE_2D, null)
if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) !== GL_FRAMEBUFFER_COMPLETE) readFloat = false
else {
gl.viewport(0, 0, 1, 1)
gl.clearColor(1.0, 0.0, 0.0, 1.0)
gl.clear(GL_COLOR_BUFFER_BIT$1)
var pixels = pool.allocType(GL_FLOAT$1, 4)
gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT$1, pixels)
if (gl.getError()) readFloat = false
else {
gl.deleteFramebuffer(fbo)
gl.deleteTexture(readFloatTexture)
readFloat = pixels[0] === 1.0
}
pool.freeType(pixels)
}
}
// detect non power of two cube textures support (IE doesn't support)
var isIE = typeof navigator !== 'undefined' && (/MSIE/.test(navigator.userAgent) || /Trident\//.test(navigator.appVersion) || /Edge/.test(navigator.userAgent))
var npotTextureCube = true
if (!isIE) {
var cubeTexture = gl.createTexture()
var data = pool.allocType(GL_UNSIGNED_BYTE$1, 36)
gl.activeTexture(GL_TEXTURE0)
gl.bindTexture(GL_TEXTURE_CUBE_MAP, cubeTexture)
gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE$1, data)
pool.freeType(data)
gl.bindTexture(GL_TEXTURE_CUBE_MAP, null)
gl.deleteTexture(cubeTexture)
npotTextureCube = !gl.getError()
}
return {
// drawing buffer bit depth
colorBits: [
gl.getParameter(GL_RED_BITS),
gl.getParameter(GL_GREEN_BITS),
gl.getParameter(GL_BLUE_BITS),
gl.getParameter(GL_ALPHA_BITS)
],
depthBits: gl.getParameter(GL_DEPTH_BITS),
stencilBits: gl.getParameter(GL_STENCIL_BITS),
subpixelBits: gl.getParameter(GL_SUBPIXEL_BITS),
// supported extensions
extensions: Object.keys(extensions).filter(function (ext) {
return !!extensions[ext]
}),
// max aniso samples
maxAnisotropic: maxAnisotropic,
// max draw buffers
maxDrawbuffers: maxDrawbuffers,
maxColorAttachments: maxColorAttachments,
// point and line size ranges
pointSizeDims: gl.getParameter(GL_ALIASED_POINT_SIZE_RANGE),
lineWidthDims: gl.getParameter(GL_ALIASED_LINE_WIDTH_RANGE),
maxViewportDims: gl.getParameter(GL_MAX_VIEWPORT_DIMS),
maxCombinedTextureUnits: gl.getParameter(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS),
maxCubeMapSize: gl.getParameter(GL_MAX_CUBE_MAP_TEXTURE_SIZE),
maxRenderbufferSize: gl.getParameter(GL_MAX_RENDERBUFFER_SIZE),
maxTextureUnits: gl.getParameter(GL_MAX_TEXTURE_IMAGE_UNITS),
maxTextureSize: gl.getParameter(GL_MAX_TEXTURE_SIZE),
maxAttributes: gl.getParameter(GL_MAX_VERTEX_ATTRIBS),
maxVertexUniforms: gl.getParameter(GL_MAX_VERTEX_UNIFORM_VECTORS),
maxVertexTextureUnits: gl.getParameter(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS),
maxVaryingVectors: gl.getParameter(GL_MAX_VARYING_VECTORS),
maxFragmentUniforms: gl.getParameter(GL_MAX_FRAGMENT_UNIFORM_VECTORS),
// vendor info
glsl: gl.getParameter(GL_SHADING_LANGUAGE_VERSION),
renderer: gl.getParameter(GL_RENDERER),
vendor: gl.getParameter(GL_VENDOR),
version: gl.getParameter(GL_VERSION),
// quirks
readFloat: readFloat,
npotTextureCube: npotTextureCube
}
}
function isNDArrayLike (obj) {
return (
!!obj &&
typeof obj === 'object' &&
Array.isArray(obj.shape) &&
Array.isArray(obj.stride) &&
typeof obj.offset === 'number' &&
obj.shape.length === obj.stride.length &&
(Array.isArray(obj.data) ||
isTypedArray(obj.data)))
}
var values = function (obj) {
return Object.keys(obj).map(function (key) { return obj[key] })
}
var flattenUtils = {
shape: arrayShape$1,
flatten: flattenArray
};
function flatten1D (array, nx, out) {
for (var i = 0; i < nx; ++i) {
out[i] = array[i]
}
}
function flatten2D (array, nx, ny, out) {
var ptr = 0
for (var i = 0; i < nx; ++i) {
var row = array[i]
for (var j = 0; j < ny; ++j) {
out[ptr++] = row[j]
}
}
}
function flatten3D (array, nx, ny, nz, out, ptr_) {
var ptr = ptr_
for (var i = 0; i < nx; ++i) {
var row = array[i]
for (var j = 0; j < ny; ++j) {
var col = row[j]
for (var k = 0; k < nz; ++k) {
out[ptr++] = col[k]
}
}
}
}
function flattenRec (array, shape, level, out, ptr) {
var stride = 1
for (var i = level + 1; i < shape.length; ++i) {
stride *= shape[i]
}
var n = shape[level]
if (shape.length - level === 4) {
var nx = shape[level + 1]
var ny = shape[level + 2]
var nz = shape[level + 3]
for (i = 0; i < n; ++i) {
flatten3D(array[i], nx, ny, nz, out, ptr)
ptr += stride
}
} else {
for (i = 0; i < n; ++i) {
flattenRec(array[i], shape, level + 1, out, ptr)
ptr += stride
}
}
}
function flattenArray (array, shape, type, out_) {
var sz = 1
if (shape.length) {
for (var i = 0; i < shape.length; ++i) {
sz *= shape[i]
}
} else {
sz = 0
}
var out = out_ || pool.allocType(type, sz)
switch (shape.length) {
case 0:
break
case 1:
flatten1D(array, shape[0], out)
break
case 2:
flatten2D(array, shape[0], shape[1], out)
break
case 3:
flatten3D(array, shape[0], shape[1], shape[2], out, 0)
break
default:
flattenRec(array, shape, 0, out, 0)
}
return out
}
function arrayShape$1 (array_) {
var shape = []
for (var array = array_; array.length; array = array[0]) {
shape.push(array.length)
}
return shape
}
var arrayTypes = {
"[object Int8Array]": 5120,
"[object Int16Array]": 5122,
"[object Int32Array]": 5124,
"[object Uint8Array]": 5121,
"[object Uint8ClampedArray]": 5121,
"[object Uint16Array]": 5123,
"[object Uint32Array]": 5125,
"[object Float32Array]": 5126,
"[object Float64Array]": 5121,
"[object ArrayBuffer]": 5121
};
var int8 = 5120;
var int16 = 5122;
var int32 = 5124;
var uint8 = 5121;
var uint16 = 5123;
var uint32 = 5125;
var float = 5126;
var float32 = 5126;
var glTypes = {
int8: int8,
int16: int16,
int32: int32,
uint8: uint8,
uint16: uint16,
uint32: uint32,
float: float,
float32: float32
};
var dynamic$1 = 35048;
var stream = 35040;
var usageTypes = {
dynamic: dynamic$1,
stream: stream,
"static": 35044
};
var arrayFlatten = flattenUtils.flatten
var arrayShape = flattenUtils.shape
var GL_STATIC_DRAW = 0x88E4
var GL_STREAM_DRAW = 0x88E0
var GL_UNSIGNED_BYTE$3 = 5121
var GL_FLOAT$3 = 5126
var DTYPES_SIZES = []
DTYPES_SIZES[5120] = 1 // int8
DTYPES_SIZES[5122] = 2 // int16
DTYPES_SIZES[5124] = 4 // int32
DTYPES_SIZES[5121] = 1 // uint8
DTYPES_SIZES[5123] = 2 // uint16
DTYPES_SIZES[5125] = 4 // uint32
DTYPES_SIZES[5126] = 4 // float32
function typedArrayCode (data) {
return arrayTypes[Object.prototype.toString.call(data)] | 0
}
function copyArray (out, inp) {
for (var i = 0; i < inp.length; ++i) {
out[i] = inp[i]
}
}
function transpose (
result, data, shapeX, shapeY, strideX, strideY, offset) {
var ptr = 0
for (var i = 0; i < shapeX; ++i) {
for (var j = 0; j < shapeY; ++j) {
result[ptr++] = data[strideX * i + strideY * j + offset]
}
}
}
function wrapBufferState (gl, stats, config, destroyBuffer) {
var bufferCount = 0
var bufferSet = {}
function REGLBuffer (type) {
this.id = bufferCount++
this.buffer = gl.createBuffer()
this.type = type
this.usage = GL_STATIC_DRAW
this.byteLength = 0
this.dimension = 1
this.dtype = GL_UNSIGNED_BYTE$3
this.persistentData = null
if (config.profile) {
this.stats = { size: 0 }
}
}
REGLBuffer.prototype.bind = function () {
gl.bindBuffer(this.type, this.buffer)
}
REGLBuffer.prototype.destroy = function () {
destroy(this)
}
var streamPool = []
function createStream (type, data) {
var buffer = streamPool.pop()
if (!buffer) {
buffer = new REGLBuffer(type)
}
buffer.bind()
initBufferFromData(buffer, data, GL_STREAM_DRAW, 0, 1, false)
return buffer
}
function destroyStream (stream$$1) {
streamPool.push(stream$$1)
}
function initBufferFromTypedArray (buffer, data, usage) {
buffer.byteLength = data.byteLength
gl.bufferData(buffer.type, data, usage)
}
function initBufferFromData (buffer, data, usage, dtype, dimension, persist) {
var shape
buffer.usage = usage
if (Array.isArray(data)) {
buffer.dtype = dtype || GL_FLOAT$3
if (data.length > 0) {
var flatData
if (Array.isArray(data[0])) {
shape = arrayShape(data)
var dim = 1
for (var i = 1; i < shape.length; ++i) {
dim *= shape[i]
}
buffer.dimension = dim
flatData = arrayFlatten(data, shape, buffer.dtype)
initBufferFromTypedArray(buffer, flatData, usage)
if (persist) {
buffer.persistentData = flatData
} else {
pool.freeType(flatData)
}
} else if (typeof data[0] === 'number') {
buffer.dimension = dimension
var typedData = pool.allocType(buffer.dtype, data.length)
copyArray(typedData, data)
initBufferFromTypedArray(buffer, typedData, usage)
if (persist) {
buffer.persistentData = typedData
} else {
pool.freeType(typedData)
}
} else if (isTypedArray(data[0])) {
buffer.dimension = data[0].length
buffer.dtype = dtype || typedArrayCode(data[0]) || GL_FLOAT$3
flatData = arrayFlatten(
data,
[data.length, data[0].length],
buffer.dtype)
initBufferFromTypedArray(buffer, flatData, usage)
if (persist) {
buffer.persistentData = flatData
} else {
pool.freeType(flatData)
}
} else {
check$1.raise('invalid buffer data')
}
}
} else if (isTypedArray(data)) {
buffer.dtype = dtype || typedArrayCode(data)
buffer.dimension = dimension
initBufferFromTypedArray(buffer, data, usage)
if (persist) {
buffer.persistentData = new Uint8Array(new Uint8Array(data.buffer))
}
} else if (isNDArrayLike(data)) {
shape = data.shape
var stride = data.stride
var offset = data.offset
var shapeX = 0
var shapeY = 0
var strideX = 0
var strideY = 0
if (shape.length === 1) {
shapeX = shape[0]
shapeY = 1
strideX = stride[0]
strideY = 0
} else if (shape.length === 2) {
shapeX = shape[0]
shapeY = shape[1]
strideX = stride[0]
strideY = stride[1]
} else {
check$1.raise('invalid shape')
}
buffer.dtype = dtype || typedArrayCode(data.data) || GL_FLOAT$3
buffer.dimension = shapeY
var transposeData = pool.allocType(buffer.dtype, shapeX * shapeY)
transpose(transposeData,
data.data,
shapeX, shapeY,
strideX, strideY,
offset)
initBufferFromTypedArray(buffer, transposeData, usage)
if (persist) {
buffer.persistentData = transposeData
} else {
pool.freeType(transposeData)
}
} else if (data instanceof ArrayBuffer) {
buffer.dtype = GL_UNSIGNED_BYTE$3
buffer.dimension = dimension
initBufferFromTypedArray(buffer, data, usage)
if (persist) {
buffer.persistentData = new Uint8Array(new Uint8Array(data))
}
} else {
check$1.raise('invalid buffer data')
}
}
function destroy (buffer) {
stats.bufferCount--
// remove attribute link
destroyBuffer(buffer)
var handle = buffer.buffer
check$1(handle, 'buffer must not be deleted already')
gl.deleteBuffer(handle)
buffer.buffer = null
delete bufferSet[buffer.id]
}
function createBuffer (options, type, deferInit, persistent) {
stats.bufferCount++
var buffer = new REGLBuffer(type)
bufferSet[buffer.id] = buffer
function reglBuffer (options) {
var usage = GL_STATIC_DRAW
var data = null
var byteLength = 0
var dtype = 0
var dimension = 1
if (Array.isArray(options) ||
isTypedArray(options) ||
isNDArrayLike(options) ||
options instanceof ArrayBuffer) {
data = options
} else if (typeof options === 'number') {
byteLength = options | 0
} else if (options) {
check$1.type(
options, 'object',
'buffer arguments must be an object, a number or an array')
if ('data' in options) {
check$1(
data === null ||
Array.isArray(data) ||
isTypedArray(data) ||
isNDArrayLike(data),
'invalid data for buffer')
data = options.data
}
if ('usage' in options) {
check$1.parameter(options.usage, usageTypes, 'invalid buffer usage')
usage = usageTypes[options.usage]
}
if ('type' in options) {
check$1.parameter(options.type, glTypes, 'invalid buffer type')
dtype = glTypes[options.type]
}
if ('dimension' in options) {
check$1.type(options.dimension, 'number', 'invalid dimension')
dimension = options.dimension | 0
}
if ('length' in options) {
check$1.nni(byteLength, 'buffer length must be a nonnegative integer')
byteLength = options.length | 0
}
}
buffer.bind()
if (!data) {
// #475
if (byteLength) gl.bufferData(buffer.type, byteLength, usage)
buffer.dtype = dtype || GL_UNSIGNED_BYTE$3
buffer.usage = usage
buffer.dimension = dimension
buffer.byteLength = byteLength
} else {
initBufferFromData(buffer, data, usage, dtype, dimension, persistent)
}
if (config.profile) {
buffer.stats.size = buffer.byteLength * DTYPES_SIZES[buffer.dtype]
}
return reglBuffer
}
function setSubData (data, offset) {
check$1(offset + data.byteLength <= buffer.byteLength,
'invalid buffer subdata call, buffer is too small. ' + ' Can\'t write data of size ' + data.byteLength + ' starting from offset ' + offset + ' to a buffer of size ' + buffer.byteLength)
gl.bufferSubData(buffer.type, offset, data)
}
function subdata (data, offset_) {
var offset = (offset_ || 0) | 0
var shape
buffer.bind()
if (isTypedArray(data) || data instanceof ArrayBuffer) {
setSubData(data, offset)
} else if (Array.isArray(data)) {
if (data.length > 0) {
if (typeof data[0] === 'number') {
var converted = pool.allocType(buffer.dtype, data.length)
copyArray(converted, data)
setSubData(converted, offset)
pool.freeType(converted)
} else if (Array.isArray(data[0]) || isTypedArray(data[0])) {
shape = arrayShape(data)
var flatData = arrayFlatten(data, shape, buffer.dtype)
setSubData(flatData, offset)
pool.freeType(flatData)
} else {
check$1.raise('invalid buffer data')
}
}
} else if (isNDArrayLike(data)) {
shape = data.shape
var stride = data.stride
var shapeX = 0
var shapeY = 0
var strideX = 0
var strideY = 0
if (shape.length === 1) {
shapeX = shape[0]
shapeY = 1
strideX = stride[0]
strideY = 0
} else if (shape.length === 2) {
shapeX = shape[0]
shapeY = shape[1]
strideX = stride[0]
strideY = stride[1]
} else {
check$1.raise('invalid shape')
}
var dtype = Array.isArray(data.data)
? buffer.dtype
: typedArrayCode(data.data)
var transposeData = pool.allocType(dtype, shapeX * shapeY)
transpose(transposeData,
data.data,
shapeX, shapeY,
strideX, strideY,
data.offset)
setSubData(transposeData, offset)
pool.freeType(transposeData)
} else {
check$1.raise('invalid data for buffer subdata')
}
return reglBuffer
}
if (!deferInit) {
reglBuffer(options)
}
reglBuffer._reglType = 'buffer'
reglBuffer._buffer = buffer
reglBuffer.subdata = subdata
if (config.profile) {
reglBuffer.stats = buffer.stats
}
reglBuffer.destroy = function () { destroy(buffer) }
return reglBuffer
}
function restoreBuffers () {
values(bufferSet).forEach(function (buffer) {
buffer.buffer = gl.createBuffer()
gl.bindBuffer(buffer.type, buffer.buffer)
gl.bufferData(
buffer.type, buffer.persistentData || buffer.byteLength, buffer.usage)
})
}
if (config.profile) {
stats.getTotalBufferSize = function () {
var total = 0
// TODO: Right now, the streams are not part of the total count.
Object.keys(bufferSet).forEach(function (key) {
total += bufferSet[key].stats.size
})
return total
}
}
return {
create: createBuffer,
createStream: createStream,
destroyStream: destroyStream,
clear: function () {
values(bufferSet).forEach(destroy)
streamPool.forEach(destroy)
},
getBuffer: function (wrapper) {
if (wrapper && wrapper._buffer instanceof REGLBuffer) {
return wrapper._buffer
}
return null
},
restore: restoreBuffers,
_initBuffer: initBufferFromData
}
}
var points = 0;
var point = 0;
var lines = 1;
var line = 1;
var triangles = 4;
var triangle = 4;
var primTypes = {
points: points,
point: point,
lines: lines,
line: line,
triangles: triangles,
triangle: triangle,
"line loop": 2,
"line strip": 3,
"triangle strip": 5,
"triangle fan": 6
};
var GL_POINTS = 0
var GL_LINES = 1
var GL_TRIANGLES = 4
var GL_BYTE$2 = 5120
var GL_UNSIGNED_BYTE$4 = 5121
var GL_SHORT$2 = 5122
var GL_UNSIGNED_SHORT$2 = 5123
var GL_INT$2 = 5124
var GL_UNSIGNED_INT$2 = 5125
var GL_ELEMENT_ARRAY_BUFFER = 34963
var GL_STREAM_DRAW$1 = 0x88E0
var GL_STATIC_DRAW$1 = 0x88E4
function wrapElementsState (gl, extensions, bufferState, stats) {
var elementSet = {}
var elementCount = 0
var elementTypes = {
'uint8': GL_UNSIGNED_BYTE$4,
'uint16': GL_UNSIGNED_SHORT$2
}
if (extensions.oes_element_index_uint) {
elementTypes.uint32 = GL_UNSIGNED_INT$2
}
function REGLElementBuffer (buffer) {
this.id = elementCount++
elementSet[this.id] = this
this.buffer = buffer
this.primType = GL_TRIANGLES
this.vertCount = 0
this.type = 0
}
REGLElementBuffer.prototype.bind = function () {
this.buffer.bind()
}
var bufferPool = []
function createElementStream (data) {
var result = bufferPool.pop()
if (!result) {
result = new REGLElementBuffer(bufferState.create(
null,
GL_ELEMENT_ARRAY_BUFFER,
true,
false)._buffer)
}
initElements(result, data, GL_STREAM_DRAW$1, -1, -1, 0, 0)
return result
}
function destroyElementStream (elements) {
bufferPool.push(elements)
}
function initElements (
elements,
data,
usage,
prim,
count,
byteLength,
type) {
elements.buffer.bind()
var dtype
if (data) {
var predictedType = type
if (!type && (
!isTypedArray(data) ||
(isNDArrayLike(data) && !isTypedArray(data.data)))) {
predictedType = extensions.oes_element_index_uint
? GL_UNSIGNED_INT$2
: GL_UNSIGNED_SHORT$2
}
bufferState._initBuffer(
elements.buffer,
data,
usage,
predictedType,
3)
} else {
gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, byteLength, usage)
elements.buffer.dtype = dtype || GL_UNSIGNED_BYTE$4
elements.buffer.usage = usage
elements.buffer.dimension = 3
elements.buffer.byteLength = byteLength
}
dtype = type
if (!type) {
switch (elements.buffer.dtype) {
case GL_UNSIGNED_BYTE$4:
case GL_BYTE$2:
dtype = GL_UNSIGNED_BYTE$4
break
case GL_UNSIGNED_SHORT$2:
case GL_SHORT$2:
dtype = GL_UNSIGNED_SHORT$2
break
case GL_UNSIGNED_INT$2:
case GL_INT$2:
dtype = GL_UNSIGNED_INT$2
break
default:
check$1.raise('unsupported type for element array')
}
elements.buffer.dtype = dtype
}
elements.type = dtype
// Check oes_element_index_uint extension
check$1(
dtype !== GL_UNSIGNED_INT$2 ||
!!extensions.oes_element_index_uint,
'32 bit element buffers not supported, enable oes_element_index_uint first')
// try to guess default primitive type and arguments
var vertCount = count
if (vertCount < 0) {
vertCount = elements.buffer.byteLength
if (dtype === GL_UNSIGNED_SHORT$2) {
vertCount >>= 1
} else if (dtype === GL_UNSIGNED_INT$2) {
vertCount >>= 2
}
}
elements.vertCount = vertCount
// try to guess primitive type from cell dimension
var primType = prim
if (prim < 0) {
primType = GL_TRIANGLES
var dimension = elements.buffer.dimension
if (dimension === 1) primType = GL_POINTS
if (dimension === 2) primType = GL_LINES
if (dimension === 3) primType = GL_TRIANGLES
}
elements.primType = primType
}
function destroyElements (elements) {
stats.elementsCount--
check$1(elements.buffer !== null, 'must not double destroy elements')
delete elementSet[elements.id]
elements.buffer.destroy()
elements.buffer = null
}
function createElements (options, persistent) {
var buffer = bufferState.create(null, GL_ELEMENT_ARRAY_BUFFER, true)
var elements = new REGLElementBuffer(buffer._buffer)
stats.elementsCount++
function reglElements (options) {
if (!options) {
buffer()
elements.primType = GL_TRIANGLES
elements.vertCount = 0
elements.type = GL_UNSIGNED_BYTE$4
} else if (typeof options === 'number') {
buffer(options)
elements.primType = GL_TRIANGLES
elements.vertCount = options | 0
elements.type = GL_UNSIGNED_BYTE$4
} else {
var data = null
var usage = GL_STATIC_DRAW$1
var primType = -1
var vertCount = -1
var byteLength = 0
var dtype = 0
if (Array.isArray(options) ||
isTypedArray(options) ||
isNDArrayLike(options)) {
data = options
} else {
check$1.type(options, 'object', 'invalid arguments for elements')
if ('data' in options) {
data = options.data
check$1(
Array.isArray(data) ||
isTypedArray(data) ||
isNDArrayLike(data),
'invalid data for element buffer')
}
if ('usage' in options) {
check$1.parameter(
options.usage,
usageTypes,
'invalid element buffer usage')
usage = usageTypes[options.usage]
}
if ('primitive' in options) {
check$1.parameter(
options.primitive,
primTypes,
'invalid element buffer primitive')
primType = primTypes[options.primitive]
}
if ('count' in options) {
check$1(
typeof options.count === 'number' && options.count >= 0,
'invalid vertex count for elements')
vertCount = options.count | 0
}
if ('type' in options) {
check$1.parameter(
options.type,
elementTypes,
'invalid buffer type')
dtype = elementTypes[options.type]
}
if ('length' in options) {
byteLength = options.length | 0
} else {
byteLength = vertCount
if (dtype === GL_UNSIGNED_SHORT$2 || dtype === GL_SHORT$2) {
byteLength *= 2
} else if (dtype === GL_UNSIGNED_INT$2 || dtype === GL_INT$2) {
byteLength *= 4
}
}
}
initElements(
elements,
data,
usage,
primType,
vertCount,
byteLength,
dtype)
}
return reglElements
}
reglElements(options)
reglElements._reglType = 'elements'
reglElements._elements = elements
reglElements.subdata = function (data, offset) {
buffer.subdata(data, offset)
return reglElements
}
reglElements.destroy = function () {
destroyElements(elements)
}
return reglElements
}
return {
create: createElements,
createStream: createElementStream,
destroyStream: destroyElementStream,
getElements: function (elements) {
if (typeof elements === 'function' &&
elements._elements instanceof REGLElementBuffer) {
return elements._elements
}
return null
},
clear: function () {
values(elementSet).forEach(destroyElements)
}
}
}
var FLOAT = new Float32Array(1)
var INT = new Uint32Array(FLOAT.buffer)
var GL_UNSIGNED_SHORT$4 = 5123
function convertToHalfFloat (array) {
var ushorts = pool.allocType(GL_UNSIGNED_SHORT$4, array.length)
for (var i = 0; i < array.length; ++i) {
if (isNaN(array[i])) {
ushorts[i] = 0xffff
} else if (array[i] === Infinity) {
ushorts[i] = 0x7c00
} else if (array[i] === -Infinity) {
ushorts[i] = 0xfc00
} else {
FLOAT[0] = array[i]
var x = INT[0]
var sgn = (x >>> 31) << 15
var exp = ((x << 1) >>> 24) - 127
var frac = (x >> 13) & ((1 << 10) - 1)
if (exp < -24) {
// round non-representable denormals to 0
ushorts[i] = sgn
} else if (exp < -14) {
// handle denormals
var s = -14 - exp
ushorts[i] = sgn + ((frac + (1 << 10)) >> s)
} else if (exp > 15) {
// round overflow to +/- Infinity
ushorts[i] = sgn + 0x7c00
} else {
// otherwise convert directly
ushorts[i] = sgn + ((exp + 15) << 10) + frac
}
}
}
return ushorts
}
function isArrayLike (s) {
return Array.isArray(s) || isTypedArray(s)
}
var isPow2$1 = function (v) {
return !(v & (v - 1)) && (!!v)
}
var GL_COMPRESSED_TEXTURE_FORMATS = 0x86A3
var GL_TEXTURE_2D$1 = 0x0DE1
var GL_TEXTURE_CUBE_MAP$1 = 0x8513
var GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 = 0x8515
var GL_RGBA$1 = 0x1908
var GL_ALPHA = 0x1906
var GL_RGB = 0x1907
var GL_LUMINANCE = 0x1909
var GL_LUMINANCE_ALPHA = 0x190A
var GL_RGBA4 = 0x8056
var GL_RGB5_A1 = 0x8057
var GL_RGB565 = 0x8D62
var GL_UNSIGNED_SHORT_4_4_4_4$1 = 0x8033
var GL_UNSIGNED_SHORT_5_5_5_1$1 = 0x8034
var GL_UNSIGNED_SHORT_5_6_5$1 = 0x8363
var GL_UNSIGNED_INT_24_8_WEBGL$1 = 0x84FA
var GL_DEPTH_COMPONENT = 0x1902
var GL_DEPTH_STENCIL = 0x84F9
var GL_SRGB_EXT = 0x8C40
var GL_SRGB_ALPHA_EXT = 0x8C42
var GL_HALF_FLOAT_OES$1 = 0x8D61
var GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0
var GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1
var GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2
var GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3
var GL_COMPRESSED_RGB_ATC_WEBGL = 0x8C92
var GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8C93
var GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87EE
var GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00
var GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01
var GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02
var GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03
var GL_COMPRESSED_RGB_ETC1_WEBGL = 0x8D64
var GL_UNSIGNED_BYTE$5 = 0x1401
var GL_UNSIGNED_SHORT$3 = 0x1403
var GL_UNSIGNED_INT$3 = 0x1405
var GL_FLOAT$4 = 0x1406
var GL_TEXTURE_WRAP_S = 0x2802
var GL_TEXTURE_WRAP_T = 0x2803
var GL_REPEAT = 0x2901
var GL_CLAMP_TO_EDGE$1 = 0x812F
var GL_MIRRORED_REPEAT = 0x8370
var GL_TEXTURE_MAG_FILTER = 0x2800
var GL_TEXTURE_MIN_FILTER = 0x2801
var GL_NEAREST$1 = 0x2600
var GL_LINEAR = 0x2601
var GL_NEAREST_MIPMAP_NEAREST$1 = 0x2700
var GL_LINEAR_MIPMAP_NEAREST$1 = 0x2701
var GL_NEAREST_MIPMAP_LINEAR$1 = 0x2702
var GL_LINEAR_MIPMAP_LINEAR$1 = 0x2703
var GL_GENERATE_MIPMAP_HINT = 0x8192
var GL_DONT_CARE = 0x1100
var GL_FASTEST = 0x1101
var GL_NICEST = 0x1102
var GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE
var GL_UNPACK_ALIGNMENT = 0x0CF5
var GL_UNPACK_FLIP_Y_WEBGL = 0x9240
var GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241
var GL_UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243
var GL_BROWSER_DEFAULT_WEBGL = 0x9244
var GL_TEXTURE0$1 = 0x84C0
var MIPMAP_FILTERS = [
GL_NEAREST_MIPMAP_NEAREST$1,
GL_NEAREST_MIPMAP_LINEAR$1,
GL_LINEAR_MIPMAP_NEAREST$1,
GL_LINEAR_MIPMAP_LINEAR$1
]
var CHANNELS_FORMAT = [
0,
GL_LUMINANCE,
GL_LUMINANCE_ALPHA,
GL_RGB,
GL_RGBA$1
]
var FORMAT_CHANNELS = {}
FORMAT_CHANNELS[GL_LUMINANCE] =
FORMAT_CHANNELS[GL_ALPHA] =
FORMAT_CHANNELS[GL_DEPTH_COMPONENT] = 1
FORMAT_CHANNELS[GL_DEPTH_STENCIL] =
FORMAT_CHANNELS[GL_LUMINANCE_ALPHA] = 2
FORMAT_CHANNELS[GL_RGB] =
FORMAT_CHANNELS[GL_SRGB_EXT] = 3
FORMAT_CHANNELS[GL_RGBA$1] =
FORMAT_CHANNELS[GL_SRGB_ALPHA_EXT] = 4
function objectName (str) {
return '[object ' + str + ']'
}
var CANVAS_CLASS = objectName('HTMLCanvasElement')
var OFFSCREENCANVAS_CLASS = objectName('OffscreenCanvas')
var CONTEXT2D_CLASS = objectName('CanvasRenderingContext2D')
var BITMAP_CLASS = objectName('ImageBitmap')
var IMAGE_CLASS = objectName('HTMLImageElement')
var VIDEO_CLASS = objectName('HTMLVideoElement')
var PIXEL_CLASSES = Object.keys(arrayTypes).concat([
CANVAS_CLASS,
OFFSCREENCANVAS_CLASS,
CONTEXT2D_CLASS,
BITMAP_CLASS,
IMAGE_CLASS,
VIDEO_CLASS
])
// for every texture type, store
// the size in bytes.
var TYPE_SIZES = []
TYPE_SIZES[GL_UNSIGNED_BYTE$5] = 1
TYPE_SIZES[GL_FLOAT$4] = 4
TYPE_SIZES[GL_HALF_FLOAT_OES$1] = 2
TYPE_SIZES[GL_UNSIGNED_SHORT$3] = 2
TYPE_SIZES[GL_UNSIGNED_INT$3] = 4
var FORMAT_SIZES_SPECIAL = []
FORMAT_SIZES_SPECIAL[GL_RGBA4] = 2
FORMAT_SIZES_SPECIAL[GL_RGB5_A1] = 2
FORMAT_SIZES_SPECIAL[GL_RGB565] = 2
FORMAT_SIZES_SPECIAL[GL_DEPTH_STENCIL] = 4
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_S3TC_DXT1_EXT] = 0.5
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_S3TC_DXT1_EXT] = 0.5
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_S3TC_DXT3_EXT] = 1
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_S3TC_DXT5_EXT] = 1
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_ATC_WEBGL] = 0.5
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL] = 1
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL] = 1
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG] = 0.5
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG] = 0.25
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG] = 0.5
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG] = 0.25
FORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_ETC1_WEBGL] = 0.5
function isNumericArray (arr) {
return (
Array.isArray(arr) &&
(arr.length === 0 ||
typeof arr[0] === 'number'))
}
function isRectArray (arr) {
if (!Array.isArray(arr)) {
return false
}
var width = arr.length
if (width === 0 || !isArrayLike(arr[0])) {
return false
}
return true
}
function classString (x) {
return Object.prototype.toString.call(x)
}
function isCanvasElement (object) {
return classString(object) === CANVAS_CLASS
}
function isOffscreenCanvas (object) {
return classString(object) === OFFSCREENCANVAS_CLASS
}
function isContext2D (object) {
return classString(object) === CONTEXT2D_CLASS
}
function isBitmap (object) {
return classString(object) === BITMAP_CLASS
}
function isImageElement (object) {
return classString(object) === IMAGE_CLASS
}
function isVideoElement (object) {
return classString(object) === VIDEO_CLASS
}
function isPixelData (object) {
if (!object) {
return false
}
var className = classString(object)
if (PIXEL_CLASSES.indexOf(className) >= 0) {
return true
}
return (
isNumericArray(object) ||
isRectArray(object) ||
isNDArrayLike(object))
}
function typedArrayCode$1 (data) {
return arrayTypes[Object.prototype.toString.call(data)] | 0
}
function convertData (result, data) {
var n = data.length
switch (result.type) {
case GL_UNSIGNED_BYTE$5:
case GL_UNSIGNED_SHORT$3:
case GL_UNSIGNED_INT$3:
case GL_FLOAT$4:
var converted = pool.allocType(result.type, n)
converted.set(data)
result.data = converted
break
case GL_HALF_FLOAT_OES$1:
result.data = convertToHalfFloat(data)
break
default:
check$1.raise('unsupported texture type, must specify a typed array')
}
}
function preConvert (image, n) {
return pool.allocType(
image.type === GL_HALF_FLOAT_OES$1
? GL_FLOAT$4
: image.type, n)
}
function postConvert (image, data) {
if (image.type === GL_HALF_FLOAT_OES$1) {
image.data = convertToHalfFloat(data)
pool.freeType(data)
} else {
image.data = data
}
}
function transposeData (image, array, strideX, strideY, strideC, offset) {
var w = image.width
var h = image.height
var c = image.channels
var n = w * h * c
var data = preConvert(image, n)
var p = 0
for (var i = 0; i < h; ++i) {
for (var j = 0; j < w; ++j) {
for (var k = 0; k < c; ++k) {
data[p++] = array[strideX * j + strideY * i + strideC * k + offset]
}
}
}
postConvert(image, data)
}
function getTextureSize (format, type, width, height, isMipmap, isCube) {
var s
if (typeof FORMAT_SIZES_SPECIAL[format] !== 'undefined') {
// we have a special array for dealing with weird color formats such as RGB5A1
s = FORMAT_SIZES_SPECIAL[format]
} else {
s = FORMAT_CHANNELS[format] * TYPE_SIZES[type]
}
if (isCube) {
s *= 6
}
if (isMipmap) {
// compute the total size of all the mipmaps.
var total = 0
var w = width
while (w >= 1) {
// we can only use mipmaps on a square image,
// so we can simply use the width and ignore the height:
total += s * w * w
w /= 2
}
return total
} else {
return s * width * height
}
}
function createTextureSet (
gl, extensions, limits, reglPoll, contextState, stats, config) {
// -------------------------------------------------------
// Initialize constants and parameter tables here
// -------------------------------------------------------
var mipmapHint = {
"don't care": GL_DONT_CARE,
'dont care': GL_DONT_CARE,
'nice': GL_NICEST,
'fast': GL_FASTEST
}
var wrapModes = {
'repeat': GL_REPEAT,
'clamp': GL_CLAMP_TO_EDGE$1,
'mirror': GL_MIRRORED_REPEAT
}
var magFilters = {
'nearest': GL_NEAREST$1,
'linear': GL_LINEAR
}
var minFilters = extend({
'mipmap': GL_LINEAR_MIPMAP_LINEAR$1,
'nearest mipmap nearest': GL_NEAREST_MIPMAP_NEAREST$1,
'linear mipmap nearest': GL_LINEAR_MIPMAP_NEAREST$1,
'nearest mipmap linear': GL_NEAREST_MIPMAP_LINEAR$1,
'linear mipmap linear': GL_LINEAR_MIPMAP_LINEAR$1
}, magFilters)
var colorSpace = {
'none': 0,
'browser': GL_BROWSER_DEFAULT_WEBGL
}
var textureTypes = {
'uint8': GL_UNSIGNED_BYTE$5,
'rgba4': GL_UNSIGNED_SHORT_4_4_4_4$1,
'rgb565': GL_UNSIGNED_SHORT_5_6_5$1,
'rgb5 a1': GL_UNSIGNED_SHORT_5_5_5_1$1
}
var textureFormats = {
'alpha': GL_ALPHA,
'luminance': GL_LUMINANCE,
'luminance alpha': GL_LUMINANCE_ALPHA,
'rgb': GL_RGB,
'rgba': GL_RGBA$1,
'rgba4': GL_RGBA4,
'rgb5 a1': GL_RGB5_A1,
'rgb565': GL_RGB565
}
var compressedTextureFormats = {}
if (extensions.ext_srgb) {
textureFormats.srgb = GL_SRGB_EXT
textureFormats.srgba = GL_SRGB_ALPHA_EXT
}
if (extensions.oes_texture_float) {
textureTypes.float32 = textureTypes.float = GL_FLOAT$4
}
if (extensions.oes_texture_half_float) {
textureTypes['float16'] = textureTypes['half float'] = GL_HALF_FLOAT_OES$1
}
if (extensions.webgl_depth_texture) {
extend(textureFormats, {
'depth': GL_DEPTH_COMPONENT,
'depth stencil': GL_DEPTH_STENCIL
})
extend(textureTypes, {
'uint16': GL_UNSIGNED_SHORT$3,
'uint32': GL_UNSIGNED_INT$3,
'depth stencil': GL_UNSIGNED_INT_24_8_WEBGL$1
})
}
if (extensions.webgl_compressed_texture_s3tc) {
extend(compressedTextureFormats, {
'rgb s3tc dxt1': GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
'rgba s3tc dxt1': GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
'rgba s3tc dxt3': GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,
'rgba s3tc dxt5': GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
})
}
if (extensions.webgl_compressed_texture_atc) {
extend(compressedTextureFormats, {
'rgb atc': GL_COMPRESSED_RGB_ATC_WEBGL,
'rgba atc explicit alpha': GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL,
'rgba atc interpolated alpha': GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL
})
}
if (extensions.webgl_compressed_texture_pvrtc) {
extend(compressedTextureFormats, {
'rgb pvrtc 4bppv1': GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG,
'rgb pvrtc 2bppv1': GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG,
'rgba pvrtc 4bppv1': GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,
'rgba pvrtc 2bppv1': GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
})
}
if (extensions.webgl_compressed_texture_etc1) {
compressedTextureFormats['rgb etc1'] = GL_COMPRESSED_RGB_ETC1_WEBGL
}
// Copy over all texture formats
var supportedCompressedFormats = Array.prototype.slice.call(
gl.getParameter(GL_COMPRESSED_TEXTURE_FORMATS))
Object.keys(compressedTextureFormats).forEach(function (name) {
var format = compressedTextureFormats[name]
if (supportedCompressedFormats.indexOf(format) >= 0) {
textureFormats[name] = format
}
})
var supportedFormats = Object.keys(textureFormats)
limits.textureFormats = supportedFormats
// associate with every format string its
// corresponding GL-value.
var textureFormatsInvert = []
Object.keys(textureFormats).forEach(function (key) {
var val = textureFormats[key]
textureFormatsInvert[val] = key
})
// associate with every type string its
// corresponding GL-value.
var textureTypesInvert = []
Object.keys(textureTypes).forEach(function (key) {
var val = textureTypes[key]
textureTypesInvert[val] = key
})
var magFiltersInvert = []
Object.keys(magFilters).forEach(function (key) {
var val = magFilters[key]
magFiltersInvert[val] = key
})
var minFiltersInvert = []
Object.keys(minFilters).forEach(function (key) {
var val = minFilters[key]
minFiltersInvert[val] = key
})
var wrapModesInvert = []
Object.keys(wrapModes).forEach(function (key) {
var val = wrapModes[key]
wrapModesInvert[val] = key
})
// colorFormats[] gives the format (channels) associated to an
// internalformat
var colorFormats = supportedFormats.reduce(function (color, key) {
var glenum = textureFormats[key]
if (glenum === GL_LUMINANCE ||
glenum === GL_ALPHA ||
glenum === GL_LUMINANCE ||
glenum === GL_LUMINANCE_ALPHA ||
glenum === GL_DEPTH_COMPONENT ||
glenum === GL_DEPTH_STENCIL ||
(extensions.ext_srgb &&
(glenum === GL_SRGB_EXT ||
glenum === GL_SRGB_ALPHA_EXT))) {
color[glenum] = glenum
} else if (glenum === GL_RGB5_A1 || key.indexOf('rgba') >= 0) {
color[glenum] = GL_RGBA$1
} else {
color[glenum] = GL_RGB
}
return color
}, {})
function TexFlags () {
// format info
this.internalformat = GL_RGBA$1
this.format = GL_RGBA$1
this.type = GL_UNSIGNED_BYTE$5
this.compressed = false
// pixel storage
this.premultiplyAlpha = false
this.flipY = false
this.unpackAlignment = 1
this.colorSpace = GL_BROWSER_DEFAULT_WEBGL
// shape info
this.width = 0
this.height = 0
this.channels = 0
}
function copyFlags (result, other) {
result.internalformat = other.internalformat
result.format = other.format
result.type = other.type
result.compressed = other.compressed
result.premultiplyAlpha = other.premultiplyAlpha
result.flipY = other.flipY
result.unpackAlignment = other.unpackAlignment
result.colorSpace = other.colorSpace
result.width = other.width
result.height = other.height
result.channels = other.channels
}
function parseFlags (flags, options) {
if (typeof options !== 'object' || !options) {
return
}
if ('premultiplyAlpha' in options) {
check$1.type(options.premultiplyAlpha, 'boolean',
'invalid premultiplyAlpha')
flags.premultiplyAlpha = options.premultiplyAlpha
}
if ('flipY' in options) {
check$1.type(options.flipY, 'boolean',
'invalid texture flip')
flags.flipY = options.flipY
}
if ('alignment' in options) {
check$1.oneOf(options.alignment, [1, 2, 4, 8],
'invalid texture unpack alignment')
flags.unpackAlignment = options.alignment
}
if ('colorSpace' in options) {
check$1.parameter(options.colorSpace, colorSpace,
'invalid colorSpace')
flags.colorSpace = colorSpace[options.colorSpace]
}
if ('type' in options) {
var type = options.type
check$1(extensions.oes_texture_float ||
!(type === 'float' || type === 'float32'),
'you must enable the OES_texture_float extension in order to use floating point textures.')
check$1(extensions.oes_texture_half_float ||
!(type === 'half float' || type === 'float16'),
'you must enable the OES_texture_half_float extension in order to use 16-bit floating point textures.')
check$1(extensions.webgl_depth_texture ||
!(type === 'uint16' || type === 'uint32' || type === 'depth stencil'),
'you must enable the WEBGL_depth_texture extension in order to use depth/stencil textures.')
check$1.parameter(type, textureTypes,
'invalid texture type')
flags.type = textureTypes[type]
}
var w = flags.width
var h = flags.height
var c = flags.channels
var hasChannels = false
if ('shape' in options) {
check$1(Array.isArray(options.shape) && options.shape.length >= 2,
'shape must be an array')
w = options.shape[0]
h = options.shape[1]
if (options.shape.length === 3) {
c = options.shape[2]
check$1(c > 0 && c <= 4, 'invalid number of channels')
hasChannels = true
}
check$1(w >= 0 && w <= limits.maxTextureSize, 'invalid width')
check$1(h >= 0 && h <= limits.maxTextureSize, 'invalid height')
} else {
if ('radius' in options) {
w = h = options.radius
check$1(w >= 0 && w <= limits.maxTextureSize, 'invalid radius')
}
if ('width' in options) {
w = options.width
check$1(w >= 0 && w <= limits.maxTextureSize, 'invalid width')
}
if ('height' in options) {
h = options.height
check$1(h >= 0 && h <= limits.maxTextureSize, 'invalid height')
}
if ('channels' in options) {
c = options.channels
check$1(c > 0 && c <= 4, 'invalid number of channels')
hasChannels = true
}
}
flags.width = w | 0
flags.height = h | 0
flags.channels = c | 0
var hasFormat = false
if ('format' in options) {
var formatStr = options.format
check$1(extensions.webgl_depth_texture ||
!(formatStr === 'depth' || formatStr === 'depth stencil'),
'you must enable the WEBGL_depth_texture extension in order to use depth/stencil textures.')
check$1.parameter(formatStr, textureFormats,
'invalid texture format')
var internalformat = flags.internalformat = textureFormats[formatStr]
flags.format = colorFormats[internalformat]
if (formatStr in textureTypes) {
if (!('type' in options)) {
flags.type = textureTypes[formatStr]
}
}
if (formatStr in compressedTextureFormats) {
flags.compressed = true
}
hasFormat = true
}
// Reconcile channels and format
if (!hasChannels && hasFormat) {
flags.channels = FORMAT_CHANNELS[flags.format]
} else if (hasChannels && !hasFormat) {
if (flags.channels !== CHANNELS_FORMAT[flags.format]) {
flags.format = flags.internalformat = CHANNELS_FORMAT[flags.channels]
}
} else if (hasFormat && hasChannels) {
check$1(
flags.channels === FORMAT_CHANNELS[flags.format],
'number of channels inconsistent with specified format')
}
}
function setFlags (flags) {
gl.pixelStorei(GL_UNPACK_FLIP_Y_WEBGL, flags.flipY)
gl.pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL, flags.premultiplyAlpha)
gl.pixelStorei(GL_UNPACK_COLORSPACE_CONVERSION_WEBGL, flags.colorSpace)
gl.pixelStorei(GL_UNPACK_ALIGNMENT, flags.unpackAlignment)
}
// -------------------------------------------------------
// Tex image data
// -------------------------------------------------------
function TexImage () {
TexFlags.call(this)
this.xOffset = 0
this.yOffset = 0
// data
this.data = null
this.needsFree = false
// html element
this.element = null
// copyTexImage info
this.needsCopy = false
}
function parseImage (image, options) {
var data = null
if (isPixelData(options)) {
data = options
} else if (options) {
check$1.type(options, 'object', 'invalid pixel data type')
parseFlags(image, options)
if ('x' in options) {
image.xOffset = options.x | 0
}
if ('y' in options) {
image.yOffset = options.y | 0
}
if (isPixelData(options.data)) {
data = options.data
}
}
check$1(
!image.compressed ||
data instanceof Uint8Array,
'compressed texture data must be stored in a uint8array')
if (options.copy) {
check$1(!data, 'can not specify copy and data field for the same texture')
var viewW = contextState.viewportWidth
var viewH = contextState.viewportHeight
image.width = image.width || (viewW - image.xOffset)
image.height = image.height || (viewH - image.yOffset)
image.needsCopy = true
check$1(image.xOffset >= 0 && image.xOffset < viewW &&
image.yOffset >= 0 && image.yOffset < viewH &&
image.width > 0 && image.width <= viewW &&
image.height > 0 && image.height <= viewH,
'copy texture read out of bounds')
} else if (!data) {
image.width = image.width || 1
image.height = image.height || 1
image.channels = image.channels || 4
} else if (isTypedArray(data)) {
image.channels = image.channels || 4
image.data = data
if (!('type' in options) && image.type === GL_UNSIGNED_BYTE$5) {
image.type = typedArrayCode$1(data)
}
} else if (isNumericArray(data)) {
image.channels = image.channels || 4
convertData(image, data)
image.alignment = 1
image.needsFree = true
} else if (isNDArrayLike(data)) {
var array = data.data
if (!Array.isArray(array) && image.type === GL_UNSIGNED_BYTE$5) {
image.type = typedArrayCode$1(array)
}
var shape = data.shape
var stride = data.stride
var shapeX, shapeY, shapeC, strideX, strideY, strideC
if (shape.length === 3) {
shapeC = shape[2]
strideC = stride[2]
} else {
check$1(shape.length === 2, 'invalid ndarray pixel data, must be 2 or 3D')
shapeC = 1
strideC = 1
}
shapeX = shape[0]
shapeY = shape[1]
strideX = stride[0]
strideY = stride[1]
image.alignment = 1
image.width = shapeX
image.height = shapeY
image.channels = shapeC
image.format = image.internalformat = CHANNELS_FORMAT[shapeC]
image.needsFree = true
transposeData(image, array, strideX, strideY, strideC, data.offset)
} else if (isCanvasElement(data) || isOffscreenCanvas(data) || isContext2D(data)) {
if (isCanvasElement(data) || isOffscreenCanvas(data)) {
image.element = data
} else {
image.element = data.canvas
}
image.width = image.element.width
image.height = image.element.height
image.channels = 4
} else if (isBitmap(data)) {
image.element = data
image.width = data.width
image.height = data.height
image.channels = 4
} else if (isImageElement(data)) {
image.element = data
image.width = data.naturalWidth
image.height = data.naturalHeight
image.channels = 4
} else if (isVideoElement(data)) {
image.element = data
image.width = data.videoWidth
image.height = data.videoHeight
image.channels = 4
} else if (isRectArray(data)) {
var w = image.width || data[0].length
var h = image.height || data.length
var c = image.channels
if (isArrayLike(data[0][0])) {
c = c || data[0][0].length
} else {
c = c || 1
}
var arrayShape = flattenUtils.shape(data)
var n = 1
for (var dd = 0; dd < arrayShape.length; ++dd) {
n *= arrayShape[dd]
}
var allocData = preConvert(image, n)
flattenUtils.flatten(data, arrayShape, '', allocData)
postConvert(image, allocData)
image.alignment = 1
image.width = w
image.height = h
image.channels = c
image.format = image.internalformat = CHANNELS_FORMAT[c]
image.needsFree = true
}
if (image.type === GL_FLOAT$4) {
check$1(limits.extensions.indexOf('oes_texture_float') >= 0,
'oes_texture_float extension not enabled')
} else if (image.type === GL_HALF_FLOAT_OES$1) {
check$1(limits.extensions.indexOf('oes_texture_half_float') >= 0,
'oes_texture_half_float extension not enabled')
}
// do compressed texture validation here.
}
function setImage (info, target, miplevel) {
var element = info.element
var data = info.data
var internalformat = info.internalformat
var format = info.format
var type = info.type
var width = info.width
var height = info.height
setFlags(info)
if (element) {
gl.texImage2D(target, miplevel, format, format, type, element)
} else if (info.compressed) {
gl.compressedTexImage2D(target, miplevel, internalformat, width, height, 0, data)
} else if (info.needsCopy) {
reglPoll()
gl.copyTexImage2D(
target, miplevel, format, info.xOffset, info.yOffset, width, height, 0)
} else {
gl.texImage2D(target, miplevel, format, width, height, 0, format, type, data || null)
}
}
function setSubImage (info, target, x, y, miplevel) {
var element = info.element
var data = info.data
var internalformat = info.internalformat
var format = info.format
var type = info.type
var width = info.width
var height = info.height
setFlags(info)
if (element) {
gl.texSubImage2D(
target, miplevel, x, y, format, type, element)
} else if (info.compressed) {
gl.compressedTexSubImage2D(
target, miplevel, x, y, internalformat, width, height, data)
} else if (info.needsCopy) {
reglPoll()
gl.copyTexSubImage2D(
target, miplevel, x, y, info.xOffset, info.yOffset, width, height)
} else {
gl.texSubImage2D(
target, miplevel, x, y, width, height, format, type, data)
}
}
// texImage pool
var imagePool = []
function allocImage () {
return imagePool.pop() || new TexImage()
}
function freeImage (image) {
if (image.needsFree) {
pool.freeType(image.data)
}
TexImage.call(image)
imagePool.push(image)
}
// -------------------------------------------------------
// Mip map
// -------------------------------------------------------
function MipMap () {
TexFlags.call(this)
this.genMipmaps = false
this.mipmapHint = GL_DONT_CARE
this.mipmask = 0
this.images = Array(16)
}
function parseMipMapFromShape (mipmap, width, height) {
var img = mipmap.images[0] = allocImage()
mipmap.mipmask = 1
img.width = mipmap.width = width
img.height = mipmap.height = height
img.channels = mipmap.channels = 4
}
function parseMipMapFromObject (mipmap, options) {
var imgData = null
if (isPixelData(options)) {
imgData = mipmap.images[0] = allocImage()
copyFlags(imgData, mipmap)
parseImage(imgData, options)
mipmap.mipmask = 1
} else {
parseFlags(mipmap, options)
if (Array.isArray(options.mipmap)) {
var mipData = options.mipmap
for (var i = 0; i < mipData.length; ++i) {
imgData = mipmap.images[i] = allocImage()
copyFlags(imgData, mipmap)
imgData.width >>= i
imgData.height >>= i
parseImage(imgData, mipData[i])
mipmap.mipmask |= (1 << i)
}
} else {
imgData = mipmap.images[0] = allocImage()
copyFlags(imgData, mipmap)
parseImage(imgData, options)
mipmap.mipmask = 1
}
}
copyFlags(mipmap, mipmap.images[0])
// For textures of the compressed format WEBGL_compressed_texture_s3tc
// we must have that
//
// "When level equals zero width and height must be a multiple of 4.
// When level is greater than 0 width and height must be 0, 1, 2 or a multiple of 4. "
//
// but we do not yet support having multiple mipmap levels for compressed textures,
// so we only test for level zero.
if (
mipmap.compressed &&
(
mipmap.internalformat === GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
mipmap.internalformat === GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
mipmap.internalformat === GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ||
mipmap.internalformat === GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
)
) {
check$1(mipmap.width % 4 === 0 && mipmap.height % 4 === 0,
'for compressed texture formats, mipmap level 0 must have width and height that are a multiple of 4')
}
}
function setMipMap (mipmap, target) {
var images = mipmap.images
for (var i = 0; i < images.length; ++i) {
if (!images[i]) {
return
}
setImage(images[i], target, i)
}
}
var mipPool = []
function allocMipMap () {
var result = mipPool.pop() || new MipMap()
TexFlags.call(result)
result.mipmask = 0
for (var i = 0; i < 16; ++i) {
result.images[i] = null
}
return result
}
function freeMipMap (mipmap) {
var images = mipmap.images
for (var i = 0; i < images.length; ++i) {
if (images[i]) {
freeImage(images[i])
}
images[i] = null
}
mipPool.push(mipmap)
}
// -------------------------------------------------------
// Tex info
// -------------------------------------------------------
function TexInfo () {
this.minFilter = GL_NEAREST$1
this.magFilter = GL_NEAREST$1
this.wrapS = GL_CLAMP_TO_EDGE$1
this.wrapT = GL_CLAMP_TO_EDGE$1
this.anisotropic = 1
this.genMipmaps = false
this.mipmapHint = GL_DONT_CARE
}
function parseTexInfo (info, options) {
if ('min' in options) {
var minFilter = options.min
check$1.parameter(minFilter, minFilters)
info.minFilter = minFilters[minFilter]
if (MIPMAP_FILTERS.indexOf(info.minFilter) >= 0 && !('faces' in options)) {
info.genMipmaps = true
}
}
if ('mag' in options) {
var magFilter = options.mag
check$1.parameter(magFilter, magFilters)
info.magFilter = magFilters[magFilter]
}
var wrapS = info.wrapS
var wrapT = info.wrapT
if ('wrap' in options) {
var wrap = options.wrap
if (typeof wrap === 'string') {
check$1.parameter(wrap, wrapModes)
wrapS = wrapT = wrapModes[wrap]
} else if (Array.isArray(wrap)) {
check$1.parameter(wrap[0], wrapModes)
check$1.parameter(wrap[1], wrapModes)
wrapS = wrapModes[wrap[0]]
wrapT = wrapModes[wrap[1]]
}
} else {
if ('wrapS' in options) {
var optWrapS = options.wrapS
check$1.parameter(optWrapS, wrapModes)
wrapS = wrapModes[optWrapS]
}
if ('wrapT' in options) {
var optWrapT = options.wrapT
check$1.parameter(optWrapT, wrapModes)
wrapT = wrapModes[optWrapT]
}
}
info.wrapS = wrapS
info.wrapT = wrapT
if ('anisotropic' in options) {
var anisotropic = options.anisotropic
check$1(typeof anisotropic === 'number' &&
anisotropic >= 1 && anisotropic <= limits.maxAnisotropic,
'aniso samples must be between 1 and ')
info.anisotropic = options.anisotropic
}
if ('mipmap' in options) {
var hasMipMap = false
switch (typeof options.mipmap) {
case 'string':
check$1.parameter(options.mipmap, mipmapHint,
'invalid mipmap hint')
info.mipmapHint = mipmapHint[options.mipmap]
info.genMipmaps = true
hasMipMap = true
break
case 'boolean':
hasMipMap = info.genMipmaps = options.mipmap
break
case 'object':
check$1(Array.isArray(options.mipmap), 'invalid mipmap type')
info.genMipmaps = false
hasMipMap = true
break
default:
check$1.raise('invalid mipmap type')
}
if (hasMipMap && !('min' in options)) {
info.minFilter = GL_NEAREST_MIPMAP_NEAREST$1
}
}
}
function setTexInfo (info, target) {
gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, info.minFilter)
gl.texParameteri(target, GL_TEXTURE_MAG_FILTER, info.magFilter)
gl.texParameteri(target, GL_TEXTURE_WRAP_S, info.wrapS)
gl.texParameteri(target, GL_TEXTURE_WRAP_T, info.wrapT)
if (extensions.ext_texture_filter_anisotropic) {
gl.texParameteri(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, info.anisotropic)
}
if (info.genMipmaps) {
gl.hint(GL_GENERATE_MIPMAP_HINT, info.mipmapHint)
gl.generateMipmap(target)
}
}
// -------------------------------------------------------
// Full texture object
// -------------------------------------------------------
var textureCount = 0
var textureSet = {}
var numTexUnits = limits.maxTextureUnits
var textureUnits = Array(numTexUnits).map(function () {
return null
})
function REGLTexture (target) {
TexFlags.call(this)
this.mipmask = 0
this.internalformat = GL_RGBA$1
this.id = textureCount++
this.refCount = 1
this.target = target
this.texture = gl.createTexture()
this.unit = -1
this.bindCount = 0
this.texInfo = new TexInfo()
if (config.profile) {
this.stats = { size: 0 }
}
}
function tempBind (texture) {
gl.activeTexture(GL_TEXTURE0$1)
gl.bindTexture(texture.target, texture.texture)
}
function tempRestore () {
var prev = textureUnits[0]
if (prev) {
gl.bindTexture(prev.target, prev.texture)
} else {
gl.bindTexture(GL_TEXTURE_2D$1, null)
}
}
function destroy (texture) {
var handle = texture.texture
check$1(handle, 'must not double destroy texture')
var unit = texture.unit
var target = texture.target
if (unit >= 0) {
gl.activeTexture(GL_TEXTURE0$1 + unit)
gl.bindTexture(target, null)
textureUnits[unit] = null
}
gl.deleteTexture(handle)
texture.texture = null
texture.params = null
texture.pixels = null
texture.refCount = 0
delete textureSet[texture.id]
stats.textureCount--
}
extend(REGLTexture.prototype, {
bind: function () {
var texture = this
texture.bindCount += 1
var unit = texture.unit
if (unit < 0) {
for (var i = 0; i < numTexUnits; ++i) {
var other = textureUnits[i]
if (other) {
if (other.bindCount > 0) {
continue
}
other.unit = -1
}
textureUnits[i] = texture
unit = i
break
}
if (unit >= numTexUnits) {
check$1.raise('insufficient number of texture units')
}
if (config.profile && stats.maxTextureUnits < (unit + 1)) {
stats.maxTextureUnits = unit + 1 // +1, since the units are zero-based
}
texture.unit = unit
gl.activeTexture(GL_TEXTURE0$1 + unit)
gl.bindTexture(texture.target, texture.texture)
}
return unit
},
unbind: function () {
this.bindCount -= 1
},
decRef: function () {
if (--this.refCount <= 0) {
destroy(this)
}
}
})
function createTexture2D (a, b) {
var texture = new REGLTexture(GL_TEXTURE_2D$1)
textureSet[texture.id] = texture
stats.textureCount++
function reglTexture2D (a, b) {
var texInfo = texture.texInfo
TexInfo.call(texInfo)
var mipData = allocMipMap()
if (typeof a === 'number') {
if (typeof b === 'number') {
parseMipMapFromShape(mipData, a | 0, b | 0)
} else {
parseMipMapFromShape(mipData, a | 0, a | 0)
}
} else if (a) {
check$1.type(a, 'object', 'invalid arguments to regl.texture')
parseTexInfo(texInfo, a)
parseMipMapFromObject(mipData, a)
} else {
// empty textures get assigned a default shape of 1x1
parseMipMapFromShape(mipData, 1, 1)
}
if (texInfo.genMipmaps) {
mipData.mipmask = (mipData.width << 1) - 1
}
texture.mipmask = mipData.mipmask
copyFlags(texture, mipData)
check$1.texture2D(texInfo, mipData, limits)
texture.internalformat = mipData.internalformat
reglTexture2D.width = mipData.width
reglTexture2D.height = mipData.height
tempBind(texture)
setMipMap(mipData, GL_TEXTURE_2D$1)
setTexInfo(texInfo, GL_TEXTURE_2D$1)
tempRestore()
freeMipMap(mipData)
if (config.profile) {
texture.stats.size = getTextureSize(
texture.internalformat,
texture.type,
mipData.width,
mipData.height,
texInfo.genMipmaps,
false)
}
reglTexture2D.format = textureFormatsInvert[texture.internalformat]
reglTexture2D.type = textureTypesInvert[texture.type]
reglTexture2D.mag = magFiltersInvert[texInfo.magFilter]
reglTexture2D.min = minFiltersInvert[texInfo.minFilter]
reglTexture2D.wrapS = wrapModesInvert[texInfo.wrapS]
reglTexture2D.wrapT = wrapModesInvert[texInfo.wrapT]
return reglTexture2D
}
function subimage (image, x_, y_, level_) {
check$1(!!image, 'must specify image data')
var x = x_ | 0
var y = y_ | 0
var level = level_ | 0
var imageData = allocImage()
copyFlags(imageData, texture)
imageData.width = 0
imageData.height = 0
parseImage(imageData, image)
imageData.width = imageData.width || ((texture.width >> level) - x)
imageData.height = imageData.height || ((texture.height >> level) - y)
check$1(
texture.type === imageData.type &&
texture.format === imageData.format &&
texture.internalformat === imageData.internalformat,
'incompatible format for texture.subimage')
check$1(
x >= 0 && y >= 0 &&
x + imageData.width <= texture.width &&
y + imageData.height <= texture.height,
'texture.subimage write out of bounds')
check$1(
texture.mipmask & (1 << level),
'missing mipmap data')
check$1(
imageData.data || imageData.element || imageData.needsCopy,
'missing image data')
tempBind(texture)
setSubImage(imageData, GL_TEXTURE_2D$1, x, y, level)
tempRestore()
freeImage(imageData)
return reglTexture2D
}
function resize (w_, h_) {
var w = w_ | 0
var h = (h_ | 0) || w
if (w === texture.width && h === texture.height) {
return reglTexture2D
}
reglTexture2D.width = texture.width = w
reglTexture2D.height = texture.height = h
tempBind(texture)
for (var i = 0; texture.mipmask >> i; ++i) {
var _w = w >> i
var _h = h >> i
if (!_w || !_h) break
gl.texImage2D(
GL_TEXTURE_2D$1,
i,
texture.format,
_w,
_h,
0,
texture.format,
texture.type,
null)
}
tempRestore()
// also, recompute the texture size.
if (config.profile) {
texture.stats.size = getTextureSize(
texture.internalformat,
texture.type,
w,
h,
false,
false)
}
return reglTexture2D
}
reglTexture2D(a, b)
reglTexture2D.subimage = subimage
reglTexture2D.resize = resize
reglTexture2D._reglType = 'texture2d'
reglTexture2D._texture = texture
if (config.profile) {
reglTexture2D.stats = texture.stats
}
reglTexture2D.destroy = function () {
texture.decRef()
}
return reglTexture2D
}
function createTextureCube (a0, a1, a2, a3, a4, a5) {
var texture = new REGLTexture(GL_TEXTURE_CUBE_MAP$1)
textureSet[texture.id] = texture
stats.cubeCount++
var faces = new Array(6)
function reglTextureCube (a0, a1, a2, a3, a4, a5) {
var i
var texInfo = texture.texInfo
TexInfo.call(texInfo)
for (i = 0; i < 6; ++i) {
faces[i] = allocMipMap()
}
if (typeof a0 === 'number' || !a0) {
var s = (a0 | 0) || 1
for (i = 0; i < 6; ++i) {
parseMipMapFromShape(faces[i], s, s)
}
} else if (typeof a0 === 'object') {
if (a1) {
parseMipMapFromObject(faces[0], a0)
parseMipMapFromObject(faces[1], a1)
parseMipMapFromObject(faces[2], a2)
parseMipMapFromObject(faces[3], a3)
parseMipMapFromObject(faces[4], a4)
parseMipMapFromObject(faces[5], a5)
} else {
parseTexInfo(texInfo, a0)
parseFlags(texture, a0)
if ('faces' in a0) {
var faceInput = a0.faces
check$1(Array.isArray(faceInput) && faceInput.length === 6,
'cube faces must be a length 6 array')
for (i = 0; i < 6; ++i) {
check$1(typeof faceInput[i] === 'object' && !!faceInput[i],
'invalid input for cube map face')
copyFlags(faces[i], texture)
parseMipMapFromObject(faces[i], faceInput[i])
}
} else {
for (i = 0; i < 6; ++i) {
parseMipMapFromObject(faces[i], a0)
}
}
}
} else {
check$1.raise('invalid arguments to cube map')
}
copyFlags(texture, faces[0])
if (!limits.npotTextureCube) {
check$1(isPow2$1(texture.width) && isPow2$1(texture.height), 'your browser does not support non power or two texture dimensions')
}
if (texInfo.genMipmaps) {
texture.mipmask = (faces[0].width << 1) - 1
} else {
texture.mipmask = faces[0].mipmask
}
check$1.textureCube(texture, texInfo, faces, limits)
texture.internalformat = faces[0].internalformat
reglTextureCube.width = faces[0].width
reglTextureCube.height = faces[0].height
tempBind(texture)
for (i = 0; i < 6; ++i) {
setMipMap(faces[i], GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + i)
}
setTexInfo(texInfo, GL_TEXTURE_CUBE_MAP$1)
tempRestore()
if (config.profile) {
texture.stats.size = getTextureSize(
texture.internalformat,
texture.type,
reglTextureCube.width,
reglTextureCube.height,
texInfo.genMipmaps,
true)
}
reglTextureCube.format = textureFormatsInvert[texture.internalformat]
reglTextureCube.type = textureTypesInvert[texture.type]
reglTextureCube.mag = magFiltersInvert[texInfo.magFilter]
reglTextureCube.min = minFiltersInvert[texInfo.minFilter]
reglTextureCube.wrapS = wrapModesInvert[texInfo.wrapS]
reglTextureCube.wrapT = wrapModesInvert[texInfo.wrapT]
for (i = 0; i < 6; ++i) {
freeMipMap(faces[i])
}
return reglTextureCube
}
function subimage (face, image, x_, y_, level_) {
check$1(!!image, 'must specify image data')
check$1(typeof face === 'number' && face === (face | 0) &&
face >= 0 && face < 6, 'invalid face')
var x = x_ | 0
var y = y_ | 0
var level = level_ | 0
var imageData = allocImage()
copyFlags(imageData, texture)
imageData.width = 0
imageData.height = 0
parseImage(imageData, image)
imageData.width = imageData.width || ((texture.width >> level) - x)
imageData.height = imageData.height || ((texture.height >> level) - y)
check$1(
texture.type === imageData.type &&
texture.format === imageData.format &&
texture.internalformat === imageData.internalformat,
'incompatible format for texture.subimage')
check$1(
x >= 0 && y >= 0 &&
x + imageData.width <= texture.width &&
y + imageData.height <= texture.height,
'texture.subimage write out of bounds')
check$1(
texture.mipmask & (1 << level),
'missing mipmap data')
check$1(
imageData.data || imageData.element || imageData.needsCopy,
'missing image data')
tempBind(texture)
setSubImage(imageData, GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + face, x, y, level)
tempRestore()
freeImage(imageData)
return reglTextureCube
}
function resize (radius_) {
var radius = radius_ | 0
if (radius === texture.width) {
return
}
reglTextureCube.width = texture.width = radius
reglTextureCube.height = texture.height = radius
tempBind(texture)
for (var i = 0; i < 6; ++i) {
for (var j = 0; texture.mipmask >> j; ++j) {
gl.texImage2D(
GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + i,
j,
texture.format,
radius >> j,
radius >> j,
0,
texture.format,
texture.type,
null)
}
}
tempRestore()
if (config.profile) {
texture.stats.size = getTextureSize(
texture.internalformat,
texture.type,
reglTextureCube.width,
reglTextureCube.height,
false,
true)
}
return reglTextureCube
}
reglTextureCube(a0, a1, a2, a3, a4, a5)
reglTextureCube.subimage = subimage
reglTextureCube.resize = resize
reglTextureCube._reglType = 'textureCube'
reglTextureCube._texture = texture
if (config.profile) {
reglTextureCube.stats = texture.stats
}
reglTextureCube.destroy = function () {
texture.decRef()
}
return reglTextureCube
}
// Called when regl is destroyed
function destroyTextures () {
for (var i = 0; i < numTexUnits; ++i) {
gl.activeTexture(GL_TEXTURE0$1 + i)
gl.bindTexture(GL_TEXTURE_2D$1, null)
textureUnits[i] = null
}
values(textureSet).forEach(destroy)
stats.cubeCount = 0
stats.textureCount = 0
}
if (config.profile) {
stats.getTotalTextureSize = function () {
var total = 0
Object.keys(textureSet).forEach(function (key) {
total += textureSet[key].stats.size
})
return total
}
}
function restoreTextures () {
for (var i = 0; i < numTexUnits; ++i) {
var tex = textureUnits[i]
if (tex) {
tex.bindCount = 0
tex.unit = -1
textureUnits[i] = null
}
}
values(textureSet).forEach(function (texture) {
texture.texture = gl.createTexture()
gl.bindTexture(texture.target, texture.texture)
for (var i = 0; i < 32; ++i) {
if ((texture.mipmask & (1 << i)) === 0) {
continue
}
if (texture.target === GL_TEXTURE_2D$1) {
gl.texImage2D(GL_TEXTURE_2D$1,
i,
texture.internalformat,
texture.width >> i,
texture.height >> i,
0,
texture.internalformat,
texture.type,
null)
} else {
for (var j = 0; j < 6; ++j) {
gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + j,
i,
texture.internalformat,
texture.width >> i,
texture.height >> i,
0,
texture.internalformat,
texture.type,
null)
}
}
}
setTexInfo(texture.texInfo, texture.target)
})
}
function refreshTextures () {
for (var i = 0; i < numTexUnits; ++i) {
var tex = textureUnits[i]
if (tex) {
tex.bindCount = 0
tex.unit = -1
textureUnits[i] = null
}
gl.activeTexture(GL_TEXTURE0$1 + i)
gl.bindTexture(GL_TEXTURE_2D$1, null)
gl.bindTexture(GL_TEXTURE_CUBE_MAP$1, null)
}
}
return {
create2D: createTexture2D,
createCube: createTextureCube,
clear: destroyTextures,
getTexture: function (wrapper) {
return null
},
restore: restoreTextures,
refresh: refreshTextures
}
}
var GL_RENDERBUFFER = 0x8D41
var GL_RGBA4$1 = 0x8056
var GL_RGB5_A1$1 = 0x8057
var GL_RGB565$1 = 0x8D62
var GL_DEPTH_COMPONENT16 = 0x81A5
var GL_STENCIL_INDEX8 = 0x8D48
var GL_DEPTH_STENCIL$1 = 0x84F9
var GL_SRGB8_ALPHA8_EXT = 0x8C43
var GL_RGBA32F_EXT = 0x8814
var GL_RGBA16F_EXT = 0x881A
var GL_RGB16F_EXT = 0x881B
var FORMAT_SIZES = []
FORMAT_SIZES[GL_RGBA4$1] = 2
FORMAT_SIZES[GL_RGB5_A1$1] = 2
FORMAT_SIZES[GL_RGB565$1] = 2
FORMAT_SIZES[GL_DEPTH_COMPONENT16] = 2
FORMAT_SIZES[GL_STENCIL_INDEX8] = 1
FORMAT_SIZES[GL_DEPTH_STENCIL$1] = 4
FORMAT_SIZES[GL_SRGB8_ALPHA8_EXT] = 4
FORMAT_SIZES[GL_RGBA32F_EXT] = 16
FORMAT_SIZES[GL_RGBA16F_EXT] = 8
FORMAT_SIZES[GL_RGB16F_EXT] = 6
function getRenderbufferSize (format, width, height) {
return FORMAT_SIZES[format] * width * height
}
var wrapRenderbuffers = function (gl, extensions, limits, stats, config) {
var formatTypes = {
'rgba4': GL_RGBA4$1,
'rgb565': GL_RGB565$1,
'rgb5 a1': GL_RGB5_A1$1,
'depth': GL_DEPTH_COMPONENT16,
'stencil': GL_STENCIL_INDEX8,
'depth stencil': GL_DEPTH_STENCIL$1
}
if (extensions.ext_srgb) {
formatTypes['srgba'] = GL_SRGB8_ALPHA8_EXT
}
if (extensions.ext_color_buffer_half_float) {
formatTypes['rgba16f'] = GL_RGBA16F_EXT
formatTypes['rgb16f'] = GL_RGB16F_EXT
}
if (extensions.webgl_color_buffer_float) {
formatTypes['rgba32f'] = GL_RGBA32F_EXT
}
var formatTypesInvert = []
Object.keys(formatTypes).forEach(function (key) {
var val = formatTypes[key]
formatTypesInvert[val] = key
})
var renderbufferCount = 0
var renderbufferSet = {}
function REGLRenderbuffer (renderbuffer) {
this.id = renderbufferCount++
this.refCount = 1
this.renderbuffer = renderbuffer
this.format = GL_RGBA4$1
this.width = 0
this.height = 0
if (config.profile) {
this.stats = { size: 0 }
}
}
REGLRenderbuffer.prototype.decRef = function () {
if (--this.refCount <= 0) {
destroy(this)
}
}
function destroy (rb) {
var handle = rb.renderbuffer
check$1(handle, 'must not double destroy renderbuffer')
gl.bindRenderbuffer(GL_RENDERBUFFER, null)
gl.deleteRenderbuffer(handle)
rb.renderbuffer = null
rb.refCount = 0
delete renderbufferSet[rb.id]
stats.renderbufferCount--
}
function createRenderbuffer (a, b) {
var renderbuffer = new REGLRenderbuffer(gl.createRenderbuffer())
renderbufferSet[renderbuffer.id] = renderbuffer
stats.renderbufferCount++
function reglRenderbuffer (a, b) {
var w = 0
var h = 0
var format = GL_RGBA4$1
if (typeof a === 'object' && a) {
var options = a
if ('shape' in options) {
var shape = options.shape
check$1(Array.isArray(shape) && shape.length >= 2,
'invalid renderbuffer shape')
w = shape[0] | 0
h = shape[1] | 0
} else {
if ('radius' in options) {
w = h = options.radius | 0
}
if ('width' in options) {
w = options.width | 0
}
if ('height' in options) {
h = options.height | 0
}
}
if ('format' in options) {
check$1.parameter(options.format, formatTypes,
'invalid renderbuffer format')
format = formatTypes[options.format]
}
} else if (typeof a === 'number') {
w = a | 0
if (typeof b === 'number') {
h = b | 0
} else {
h = w
}
} else if (!a) {
w = h = 1
} else {
check$1.raise('invalid arguments to renderbuffer constructor')
}
// check shape
check$1(
w > 0 && h > 0 &&
w <= limits.maxRenderbufferSize && h <= limits.maxRenderbufferSize,
'invalid renderbuffer size')
if (w === renderbuffer.width &&
h === renderbuffer.height &&
format === renderbuffer.format) {
return
}
reglRenderbuffer.width = renderbuffer.width = w
reglRenderbuffer.height = renderbuffer.height = h
renderbuffer.format = format
gl.bindRenderbuffer(GL_RENDERBUFFER, renderbuffer.renderbuffer)
gl.renderbufferStorage(GL_RENDERBUFFER, format, w, h)
check$1(
gl.getError() === 0,
'invalid render buffer format')
if (config.profile) {
renderbuffer.stats.size = getRenderbufferSize(renderbuffer.format, renderbuffer.width, renderbuffer.height)
}
reglRenderbuffer.format = formatTypesInvert[renderbuffer.format]
return reglRenderbuffer
}
function resize (w_, h_) {
var w = w_ | 0
var h = (h_ | 0) || w
if (w === renderbuffer.width && h === renderbuffer.height) {
return reglRenderbuffer
}
// check shape
check$1(
w > 0 && h > 0 &&
w <= limits.maxRenderbufferSize && h <= limits.maxRenderbufferSize,
'invalid renderbuffer size')
reglRenderbuffer.width = renderbuffer.width = w
reglRenderbuffer.height = renderbuffer.height = h
gl.bindRenderbuffer(GL_RENDERBUFFER, renderbuffer.renderbuffer)
gl.renderbufferStorage(GL_RENDERBUFFER, renderbuffer.format, w, h)
check$1(
gl.getError() === 0,
'invalid render buffer format')
// also, recompute size.
if (config.profile) {
renderbuffer.stats.size = getRenderbufferSize(
renderbuffer.format, renderbuffer.width, renderbuffer.height)
}
return reglRenderbuffer
}
reglRenderbuffer(a, b)
reglRenderbuffer.resize = resize
reglRenderbuffer._reglType = 'renderbuffer'
reglRenderbuffer._renderbuffer = renderbuffer
if (config.profile) {
reglRenderbuffer.stats = renderbuffer.stats
}
reglRenderbuffer.destroy = function () {
renderbuffer.decRef()
}
return reglRenderbuffer
}
if (config.profile) {
stats.getTotalRenderbufferSize = function () {
var total = 0
Object.keys(renderbufferSet).forEach(function (key) {
total += renderbufferSet[key].stats.size
})
return total
}
}
function restoreRenderbuffers () {
values(renderbufferSet).forEach(function (rb) {
rb.renderbuffer = gl.createRenderbuffer()
gl.bindRenderbuffer(GL_RENDERBUFFER, rb.renderbuffer)
gl.renderbufferStorage(GL_RENDERBUFFER, rb.format, rb.width, rb.height)
})
gl.bindRenderbuffer(GL_RENDERBUFFER, null)
}
return {
create: createRenderbuffer,
clear: function () {
values(renderbufferSet).forEach(destroy)
},
restore: restoreRenderbuffers
}
}
// We store these constants so that the minifier can inline them
var GL_FRAMEBUFFER$1 = 0x8D40
var GL_RENDERBUFFER$1 = 0x8D41
var GL_TEXTURE_2D$2 = 0x0DE1
var GL_TEXTURE_CUBE_MAP_POSITIVE_X$2 = 0x8515
var GL_COLOR_ATTACHMENT0$1 = 0x8CE0
var GL_DEPTH_ATTACHMENT = 0x8D00
var GL_STENCIL_ATTACHMENT = 0x8D20
var GL_DEPTH_STENCIL_ATTACHMENT = 0x821A
var GL_FRAMEBUFFER_COMPLETE$1 = 0x8CD5
var GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6
var GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7
var GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9
var GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD
var GL_HALF_FLOAT_OES$2 = 0x8D61
var GL_UNSIGNED_BYTE$6 = 0x1401
var GL_FLOAT$5 = 0x1406
var GL_RGB$1 = 0x1907
var GL_RGBA$2 = 0x1908
var GL_DEPTH_COMPONENT$1 = 0x1902
var colorTextureFormatEnums = [
GL_RGB$1,
GL_RGBA$2
]
// for every texture format, store
// the number of channels
var textureFormatChannels = []
textureFormatChannels[GL_RGBA$2] = 4
textureFormatChannels[GL_RGB$1] = 3
// for every texture type, store
// the size in bytes.
var textureTypeSizes = []
textureTypeSizes[GL_UNSIGNED_BYTE$6] = 1
textureTypeSizes[GL_FLOAT$5] = 4
textureTypeSizes[GL_HALF_FLOAT_OES$2] = 2
var GL_RGBA4$2 = 0x8056
var GL_RGB5_A1$2 = 0x8057
var GL_RGB565$2 = 0x8D62
var GL_DEPTH_COMPONENT16$1 = 0x81A5
var GL_STENCIL_INDEX8$1 = 0x8D48
var GL_DEPTH_STENCIL$2 = 0x84F9
var GL_SRGB8_ALPHA8_EXT$1 = 0x8C43
var GL_RGBA32F_EXT$1 = 0x8814
var GL_RGBA16F_EXT$1 = 0x881A
var GL_RGB16F_EXT$1 = 0x881B
var colorRenderbufferFormatEnums = [
GL_RGBA4$2,
GL_RGB5_A1$2,
GL_RGB565$2,
GL_SRGB8_ALPHA8_EXT$1,
GL_RGBA16F_EXT$1,
GL_RGB16F_EXT$1,
GL_RGBA32F_EXT$1
]
var statusCode = {}
statusCode[GL_FRAMEBUFFER_COMPLETE$1] = 'complete'
statusCode[GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT] = 'incomplete attachment'
statusCode[GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS] = 'incomplete dimensions'
statusCode[GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT] = 'incomplete, missing attachment'
statusCode[GL_FRAMEBUFFER_UNSUPPORTED] = 'unsupported'
function wrapFBOState (
gl,
extensions,
limits,
textureState,
renderbufferState,
stats) {
var framebufferState = {
cur: null,
next: null,
dirty: false,
setFBO: null
}
var colorTextureFormats = ['rgba']
var colorRenderbufferFormats = ['rgba4', 'rgb565', 'rgb5 a1']
if (extensions.ext_srgb) {
colorRenderbufferFormats.push('srgba')
}
if (extensions.ext_color_buffer_half_float) {
colorRenderbufferFormats.push('rgba16f', 'rgb16f')
}
if (extensions.webgl_color_buffer_float) {
colorRenderbufferFormats.push('rgba32f')
}
var colorTypes = ['uint8']
if (extensions.oes_texture_half_float) {
colorTypes.push('half float', 'float16')
}
if (extensions.oes_texture_float) {
colorTypes.push('float', 'float32')
}
function FramebufferAttachment (target, texture, renderbuffer) {
this.target = target
this.texture = texture
this.renderbuffer = renderbuffer
var w = 0
var h = 0
if (texture) {
w = texture.width
h = texture.height
} else if (renderbuffer) {
w = renderbuffer.width
h = renderbuffer.height
}
this.width = w
this.height = h
}
function decRef (attachment) {
if (attachment) {
if (attachment.texture) {
attachment.texture._texture.decRef()
}
if (attachment.renderbuffer) {
attachment.renderbuffer._renderbuffer.decRef()
}
}
}
function incRefAndCheckShape (attachment, width, height) {
if (!attachment) {
return
}
if (attachment.texture) {
var texture = attachment.texture._texture
var tw = Math.max(1, texture.width)
var th = Math.max(1, texture.height)
check$1(tw === width && th === height,
'inconsistent width/height for supplied texture')
texture.refCount += 1
} else {
var renderbuffer = attachment.renderbuffer._renderbuffer
check$1(
renderbuffer.width === width && renderbuffer.height === height,
'inconsistent width/height for renderbuffer')
renderbuffer.refCount += 1
}
}
function attach (location, attachment) {
if (attachment) {
if (attachment.texture) {
gl.framebufferTexture2D(
GL_FRAMEBUFFER$1,
location,
attachment.target,
attachment.texture._texture.texture,
0)
} else {
gl.framebufferRenderbuffer(
GL_FRAMEBUFFER$1,
location,
GL_RENDERBUFFER$1,
attachment.renderbuffer._renderbuffer.renderbuffer)
}
}
}
function parseAttachment (attachment) {
var target = GL_TEXTURE_2D$2
var texture = null
var renderbuffer = null
var data = attachment
if (typeof attachment === 'object') {
data = attachment.data
if ('target' in attachment) {
target = attachment.target | 0
}
}
check$1.type(data, 'function', 'invalid attachment data')
var type = data._reglType
if (type === 'texture2d') {
texture = data
check$1(target === GL_TEXTURE_2D$2)
} else if (type === 'textureCube') {
texture = data
check$1(
target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X$2 &&
target < GL_TEXTURE_CUBE_MAP_POSITIVE_X$2 + 6,
'invalid cube map target')
} else if (type === 'renderbuffer') {
renderbuffer = data
target = GL_RENDERBUFFER$1
} else {
check$1.raise('invalid regl object for attachment')
}
return new FramebufferAttachment(target, texture, renderbuffer)
}
function allocAttachment (
width,
height,
isTexture,
format,
type) {
if (isTexture) {
var texture = textureState.create2D({
width: width,
height: height,
format: format,
type: type
})
texture._texture.refCount = 0
return new FramebufferAttachment(GL_TEXTURE_2D$2, texture, null)
} else {
var rb = renderbufferState.create({
width: width,
height: height,
format: format
})
rb._renderbuffer.refCount = 0
return new FramebufferAttachment(GL_RENDERBUFFER$1, null, rb)
}
}
function unwrapAttachment (attachment) {
return attachment && (attachment.texture || attachment.renderbuffer)
}
function resizeAttachment (attachment, w, h) {
if (attachment) {
if (attachment.texture) {
attachment.texture.resize(w, h)
} else if (attachment.renderbuffer) {
attachment.renderbuffer.resize(w, h)
}
attachment.width = w
attachment.height = h
}
}
var framebufferCount = 0
var framebufferSet = {}
function REGLFramebuffer () {
this.id = framebufferCount++
framebufferSet[this.id] = this
this.framebuffer = gl.createFramebuffer()
this.width = 0
this.height = 0
this.colorAttachments = []
this.depthAttachment = null
this.stencilAttachment = null
this.depthStencilAttachment = null
}
function decFBORefs (framebuffer) {
framebuffer.colorAttachments.forEach(decRef)
decRef(framebuffer.depthAttachment)
decRef(framebuffer.stencilAttachment)
decRef(framebuffer.depthStencilAttachment)
}
function destroy (framebuffer) {
var handle = framebuffer.framebuffer
check$1(handle, 'must not double destroy framebuffer')
gl.deleteFramebuffer(handle)
framebuffer.framebuffer = null
stats.framebufferCount--
delete framebufferSet[framebuffer.id]
}
function updateFramebuffer (framebuffer) {
var i
gl.bindFramebuffer(GL_FRAMEBUFFER$1, framebuffer.framebuffer)
var colorAttachments = framebuffer.colorAttachments
for (i = 0; i < colorAttachments.length; ++i) {
attach(GL_COLOR_ATTACHMENT0$1 + i, colorAttachments[i])
}
for (i = colorAttachments.length; i < limits.maxColorAttachments; ++i) {
gl.framebufferTexture2D(
GL_FRAMEBUFFER$1,
GL_COLOR_ATTACHMENT0$1 + i,
GL_TEXTURE_2D$2,
null,
0)
}
gl.framebufferTexture2D(
GL_FRAMEBUFFER$1,
GL_DEPTH_STENCIL_ATTACHMENT,
GL_TEXTURE_2D$2,
null,
0)
gl.framebufferTexture2D(
GL_FRAMEBUFFER$1,
GL_DEPTH_ATTACHMENT,
GL_TEXTURE_2D$2,
null,
0)
gl.framebufferTexture2D(
GL_FRAMEBUFFER$1,
GL_STENCIL_ATTACHMENT,
GL_TEXTURE_2D$2,
null,
0)
attach(GL_DEPTH_ATTACHMENT, framebuffer.depthAttachment)
attach(GL_STENCIL_ATTACHMENT, framebuffer.stencilAttachment)
attach(GL_DEPTH_STENCIL_ATTACHMENT, framebuffer.depthStencilAttachment)
// Check status code
var status = gl.checkFramebufferStatus(GL_FRAMEBUFFER$1)
if (!gl.isContextLost() && status !== GL_FRAMEBUFFER_COMPLETE$1) {
check$1.raise('framebuffer configuration not supported, status = ' +
statusCode[status])
}
gl.bindFramebuffer(GL_FRAMEBUFFER$1, framebufferState.next ? framebufferState.next.framebuffer : null)
framebufferState.cur = framebufferState.next
// FIXME: Clear error code here. This is a work around for a bug in
// headless-gl
gl.getError()
}
function createFBO (a0, a1) {
var framebuffer = new REGLFramebuffer()
stats.framebufferCount++
function reglFramebuffer (a, b) {
var i
check$1(framebufferState.next !== framebuffer,
'can not update framebuffer which is currently in use')
var width = 0
var height = 0
var needsDepth = true
var needsStencil = true
var colorBuffer = null
var colorTexture = true
var colorFormat = 'rgba'
var colorType = 'uint8'
var colorCount = 1
var depthBuffer = null
var stencilBuffer = null
var depthStencilBuffer = null
var depthStencilTexture = false
if (typeof a === 'number') {
width = a | 0
height = (b | 0) || width
} else if (!a) {
width = height = 1
} else {
check$1.type(a, 'object', 'invalid arguments for framebuffer')
var options = a
if ('shape' in options) {
var shape = options.shape
check$1(Array.isArray(shape) && shape.length >= 2,
'invalid shape for framebuffer')
width = shape[0]
height = shape[1]
} else {
if ('radius' in options) {
width = height = options.radius
}
if ('width' in options) {
width = options.width
}
if ('height' in options) {
height = options.height
}
}
if ('color' in options ||
'colors' in options) {
colorBuffer =
options.color ||
options.colors
if (Array.isArray(colorBuffer)) {
check$1(
colorBuffer.length === 1 || extensions.webgl_draw_buffers,
'multiple render targets not supported')
}
}
if (!colorBuffer) {
if ('colorCount' in options) {
colorCount = options.colorCount | 0
check$1(colorCount > 0, 'invalid color buffer count')
}
if ('colorTexture' in options) {
colorTexture = !!options.colorTexture
colorFormat = 'rgba4'
}
if ('colorType' in options) {
colorType = options.colorType
if (!colorTexture) {
if (colorType === 'half float' || colorType === 'float16') {
check$1(extensions.ext_color_buffer_half_float,
'you must enable EXT_color_buffer_half_float to use 16-bit render buffers')
colorFormat = 'rgba16f'
} else if (colorType === 'float' || colorType === 'float32') {
check$1(extensions.webgl_color_buffer_float,
'you must enable WEBGL_color_buffer_float in order to use 32-bit floating point renderbuffers')
colorFormat = 'rgba32f'
}
} else {
check$1(extensions.oes_texture_float ||
!(colorType === 'float' || colorType === 'float32'),
'you must enable OES_texture_float in order to use floating point framebuffer objects')
check$1(extensions.oes_texture_half_float ||
!(colorType === 'half float' || colorType === 'float16'),
'you must enable OES_texture_half_float in order to use 16-bit floating point framebuffer objects')
}
check$1.oneOf(colorType, colorTypes, 'invalid color type')
}
if ('colorFormat' in options) {
colorFormat = options.colorFormat
if (colorTextureFormats.indexOf(colorFormat) >= 0) {
colorTexture = true
} else if (colorRenderbufferFormats.indexOf(colorFormat) >= 0) {
colorTexture = false
} else {
if (colorTexture) {
check$1.oneOf(
options.colorFormat, colorTextureFormats,
'invalid color format for texture')
} else {
check$1.oneOf(
options.colorFormat, colorRenderbufferFormats,
'invalid color format for renderbuffer')
}
}
}
}
if ('depthTexture' in options || 'depthStencilTexture' in options) {
depthStencilTexture = !!(options.depthTexture ||
options.depthStencilTexture)
check$1(!depthStencilTexture || extensions.webgl_depth_texture,
'webgl_depth_texture extension not supported')
}
if ('depth' in options) {
if (typeof options.depth === 'boolean') {
needsDepth = options.depth
} else {
depthBuffer = options.depth
needsStencil = false
}
}
if ('stencil' in options) {
if (typeof options.stencil === 'boolean') {
needsStencil = options.stencil
} else {
stencilBuffer = options.stencil
needsDepth = false
}
}
if ('depthStencil' in options) {
if (typeof options.depthStencil === 'boolean') {
needsDepth = needsStencil = options.depthStencil
} else {
depthStencilBuffer = options.depthStencil
needsDepth = false
needsStencil = false
}
}
}
// parse attachments
var colorAttachments = null
var depthAttachment = null
var stencilAttachment = null
var depthStencilAttachment = null
// Set up color attachments
if (Array.isArray(colorBuffer)) {
colorAttachments = colorBuffer.map(parseAttachment)
} else if (colorBuffer) {
colorAttachments = [parseAttachment(colorBuffer)]
} else {
colorAttachments = new Array(colorCount)
for (i = 0; i < colorCount; ++i) {
colorAttachments[i] = allocAttachment(
width,
height,
colorTexture,
colorFormat,
colorType)
}
}
check$1(extensions.webgl_draw_buffers || colorAttachments.length <= 1,
'you must enable the WEBGL_draw_buffers extension in order to use multiple color buffers.')
check$1(colorAttachments.length <= limits.maxColorAttachments,
'too many color attachments, not supported')
width = width || colorAttachments[0].width
height = height || colorAttachments[0].height
if (depthBuffer) {
depthAttachment = parseAttachment(depthBuffer)
} else if (needsDepth && !needsStencil) {
depthAttachment = allocAttachment(
width,
height,
depthStencilTexture,
'depth',
'uint32')
}
if (stencilBuffer) {
stencilAttachment = parseAttachment(stencilBuffer)
} else if (needsStencil && !needsDepth) {
stencilAttachment = allocAttachment(
width,
height,
false,
'stencil',
'uint8')
}
if (depthStencilBuffer) {
depthStencilAttachment = parseAttachment(depthStencilBuffer)
} else if (!depthBuffer && !stencilBuffer && needsStencil && needsDepth) {
depthStencilAttachment = allocAttachment(
width,
height,
depthStencilTexture,
'depth stencil',
'depth stencil')
}
check$1(
(!!depthBuffer) + (!!stencilBuffer) + (!!depthStencilBuffer) <= 1,
'invalid framebuffer configuration, can specify exactly one depth/stencil attachment')
var commonColorAttachmentSize = null
for (i = 0; i < colorAttachments.length; ++i) {
incRefAndCheckShape(colorAttachments[i], width, height)
check$1(!colorAttachments[i] ||
(colorAttachments[i].texture &&
colorTextureFormatEnums.indexOf(colorAttachments[i].texture._texture.format) >= 0) ||
(colorAttachments[i].renderbuffer &&
colorRenderbufferFormatEnums.indexOf(colorAttachments[i].renderbuffer._renderbuffer.format) >= 0),
'framebuffer color attachment ' + i + ' is invalid')
if (colorAttachments[i] && colorAttachments[i].texture) {
var colorAttachmentSize =
textureFormatChannels[colorAttachments[i].texture._texture.format] *
textureTypeSizes[colorAttachments[i].texture._texture.type]
if (commonColorAttachmentSize === null) {
commonColorAttachmentSize = colorAttachmentSize
} else {
// We need to make sure that all color attachments have the same number of bitplanes
// (that is, the same numer of bits per pixel)
// This is required by the GLES2.0 standard. See the beginning of Chapter 4 in that document.
check$1(commonColorAttachmentSize === colorAttachmentSize,
'all color attachments much have the same number of bits per pixel.')
}
}
}
incRefAndCheckShape(depthAttachment, width, height)
check$1(!depthAttachment ||
(depthAttachment.texture &&
depthAttachment.texture._texture.format === GL_DEPTH_COMPONENT$1) ||
(depthAttachment.renderbuffer &&
depthAttachment.renderbuffer._renderbuffer.format === GL_DEPTH_COMPONENT16$1),
'invalid depth attachment for framebuffer object')
incRefAndCheckShape(stencilAttachment, width, height)
check$1(!stencilAttachment ||
(stencilAttachment.renderbuffer &&
stencilAttachment.renderbuffer._renderbuffer.format === GL_STENCIL_INDEX8$1),
'invalid stencil attachment for framebuffer object')
incRefAndCheckShape(depthStencilAttachment, width, height)
check$1(!depthStencilAttachment ||
(depthStencilAttachment.texture &&
depthStencilAttachment.texture._texture.format === GL_DEPTH_STENCIL$2) ||
(depthStencilAttachment.renderbuffer &&
depthStencilAttachment.renderbuffer._renderbuffer.format === GL_DEPTH_STENCIL$2),
'invalid depth-stencil attachment for framebuffer object')
// decrement references
decFBORefs(framebuffer)
framebuffer.width = width
framebuffer.height = height
framebuffer.colorAttachments = colorAttachments
framebuffer.depthAttachment = depthAttachment
framebuffer.stencilAttachment = stencilAttachment
framebuffer.depthStencilAttachment = depthStencilAttachment
reglFramebuffer.color = colorAttachments.map(unwrapAttachment)
reglFramebuffer.depth = unwrapAttachment(depthAttachment)
reglFramebuffer.stencil = unwrapAttachment(stencilAttachment)
reglFramebuffer.depthStencil = unwrapAttachment(depthStencilAttachment)
reglFramebuffer.width = framebuffer.width
reglFramebuffer.height = framebuffer.height
updateFramebuffer(framebuffer)
return reglFramebuffer
}
function resize (w_, h_) {
check$1(framebufferState.next !== framebuffer,
'can not resize a framebuffer which is currently in use')
var w = Math.max(w_ | 0, 1)
var h = Math.max((h_ | 0) || w, 1)
if (w === framebuffer.width && h === framebuffer.height) {
return reglFramebuffer
}
// resize all buffers
var colorAttachments = framebuffer.colorAttachments
for (var i = 0; i < colorAttachments.length; ++i) {
resizeAttachment(colorAttachments[i], w, h)
}
resizeAttachment(framebuffer.depthAttachment, w, h)
resizeAttachment(framebuffer.stencilAttachment, w, h)
resizeAttachment(framebuffer.depthStencilAttachment, w, h)
framebuffer.width = reglFramebuffer.width = w
framebuffer.height = reglFramebuffer.height = h
updateFramebuffer(framebuffer)
return reglFramebuffer
}
reglFramebuffer(a0, a1)
return extend(reglFramebuffer, {
resize: resize,
_reglType: 'framebuffer',
_framebuffer: framebuffer,
destroy: function () {
destroy(framebuffer)
decFBORefs(framebuffer)
},
use: function (block) {
framebufferState.setFBO({
framebuffer: reglFramebuffer
}, block)
}
})
}
function createCubeFBO (options) {
var faces = Array(6)
function reglFramebufferCube (a) {
var i
check$1(faces.indexOf(framebufferState.next) < 0,
'can not update framebuffer which is currently in use')
var params = {
color: null
}
var radius = 0
var colorBuffer = null
var colorFormat = 'rgba'
var colorType = 'uint8'
var colorCount = 1
if (typeof a === 'number') {
radius = a | 0
} else if (!a) {
radius = 1
} else {
check$1.type(a, 'object', 'invalid arguments for framebuffer')
var options = a
if ('shape' in options) {
var shape = options.shape
check$1(
Array.isArray(shape) && shape.length >= 2,
'invalid shape for framebuffer')
check$1(
shape[0] === shape[1],
'cube framebuffer must be square')
radius = shape[0]
} else {
if ('radius' in options) {
radius = options.radius | 0
}
if ('width' in options) {
radius = options.width | 0
if ('height' in options) {
check$1(options.height === radius, 'must be square')
}
} else if ('height' in options) {
radius = options.height | 0
}
}
if ('color' in options ||
'colors' in options) {
colorBuffer =
options.color ||
options.colors
if (Array.isArray(colorBuffer)) {
check$1(
colorBuffer.length === 1 || extensions.webgl_draw_buffers,
'multiple render targets not supported')
}
}
if (!colorBuffer) {
if ('colorCount' in options) {
colorCount = options.colorCount | 0
check$1(colorCount > 0, 'invalid color buffer count')
}
if ('colorType' in options) {
check$1.oneOf(
options.colorType, colorTypes,
'invalid color type')
colorType = options.colorType
}
if ('colorFormat' in options) {
colorFormat = options.colorFormat
check$1.oneOf(
options.colorFormat, colorTextureFormats,
'invalid color format for texture')
}
}
if ('depth' in options) {
params.depth = options.depth
}
if ('stencil' in options) {
params.stencil = options.stencil
}
if ('depthStencil' in options) {
params.depthStencil = options.depthStencil
}
}
var colorCubes
if (colorBuffer) {
if (Array.isArray(colorBuffer)) {
colorCubes = []
for (i = 0; i < colorBuffer.length; ++i) {
colorCubes[i] = colorBuffer[i]
}
} else {
colorCubes = [ colorBuffer ]
}
} else {
colorCubes = Array(colorCount)
var cubeMapParams = {
radius: radius,
format: colorFormat,
type: colorType
}
for (i = 0; i < colorCount; ++i) {
colorCubes[i] = textureState.createCube(cubeMapParams)
}
}
// Check color cubes
params.color = Array(colorCubes.length)
for (i = 0; i < colorCubes.length; ++i) {
var cube = colorCubes[i]
check$1(
typeof cube === 'function' && cube._reglType === 'textureCube',
'invalid cube map')
radius = radius || cube.width
check$1(
cube.width === radius && cube.height === radius,
'invalid cube map shape')
params.color[i] = {
target: GL_TEXTURE_CUBE_MAP_POSITIVE_X$2,
data: colorCubes[i]
}
}
for (i = 0; i < 6; ++i) {
for (var j = 0; j < colorCubes.length; ++j) {
params.color[j].target = GL_TEXTURE_CUBE_MAP_POSITIVE_X$2 + i
}
// reuse depth-stencil attachments across all cube maps
if (i > 0) {
params.depth = faces[0].depth
params.stencil = faces[0].stencil
params.depthStencil = faces[0].depthStencil
}
if (faces[i]) {
(faces[i])(params)
} else {
faces[i] = createFBO(params)
}
}
return extend(reglFramebufferCube, {
width: radius,
height: radius,
color: colorCubes
})
}
function resize (radius_) {
var i
var radius = radius_ | 0
check$1(radius > 0 && radius <= limits.maxCubeMapSize,
'invalid radius for cube fbo')
if (radius === reglFramebufferCube.width) {
return reglFramebufferCube
}
var colors = reglFramebufferCube.color
for (i = 0; i < colors.length; ++i) {
colors[i].resize(radius)
}
for (i = 0; i < 6; ++i) {
faces[i].resize(radius)
}
reglFramebufferCube.width = reglFramebufferCube.height = radius
return reglFramebufferCube
}
reglFramebufferCube(options)
return extend(reglFramebufferCube, {
faces: faces,
resize: resize,
_reglType: 'framebufferCube',
destroy: function () {
faces.forEach(function (f) {
f.destroy()
})
}
})
}
function restoreFramebuffers () {
framebufferState.cur = null
framebufferState.next = null
framebufferState.dirty = true
values(framebufferSet).forEach(function (fb) {
fb.framebuffer = gl.createFramebuffer()
updateFramebuffer(fb)
})
}
return extend(framebufferState, {
getFramebuffer: function (object) {
if (typeof object === 'function' && object._reglType === 'framebuffer') {
var fbo = object._framebuffer
if (fbo instanceof REGLFramebuffer) {
return fbo
}
}
return null
},
create: createFBO,
createCube: createCubeFBO,
clear: function () {
values(framebufferSet).forEach(destroy)
},
restore: restoreFramebuffers
})
}
var GL_FLOAT$6 = 5126
var GL_ARRAY_BUFFER$1 = 34962
function AttributeRecord () {
this.state = 0
this.x = 0.0
this.y = 0.0
this.z = 0.0
this.w = 0.0
this.buffer = null
this.size = 0
this.normalized = false
this.type = GL_FLOAT$6
this.offset = 0
this.stride = 0
this.divisor = 0
}
function wrapAttributeState (
gl,
extensions,
limits,
stats,
bufferState) {
var NUM_ATTRIBUTES = limits.maxAttributes
var attributeBindings = new Array(NUM_ATTRIBUTES)
for (var i = 0; i < NUM_ATTRIBUTES; ++i) {
attributeBindings[i] = new AttributeRecord()
}
var vaoCount = 0
var vaoSet = {}
var state = {
Record: AttributeRecord,
scope: {},
state: attributeBindings,
currentVAO: null,
targetVAO: null,
restore: extVAO() ? restoreVAO : function () {},
createVAO: createVAO,
getVAO: getVAO,
destroyBuffer: destroyBuffer,
setVAO: extVAO() ? setVAOEXT : setVAOEmulated,
clear: extVAO() ? destroyVAOEXT : function () {}
}
function destroyBuffer (buffer) {
for (var i = 0; i < attributeBindings.length; ++i) {
var record = attributeBindings[i]
if (record.buffer === buffer) {
gl.disableVertexAttribArray(i)
record.buffer = null
}
}
}
function extVAO () {
return extensions.oes_vertex_array_object
}
function extInstanced () {
return extensions.angle_instanced_arrays
}
function getVAO (vao) {
if (typeof vao === 'function' && vao._vao) {
return vao._vao
}
return null
}
function setVAOEXT (vao) {
if (vao === state.currentVAO) {
return
}
var ext = extVAO()
if (vao) {
ext.bindVertexArrayOES(vao.vao)
} else {
ext.bindVertexArrayOES(null)
}
state.currentVAO = vao
}
function setVAOEmulated (vao) {
if (vao === state.currentVAO) {
return
}
if (vao) {
vao.bindAttrs()
} else {
var exti = extInstanced()
for (var i = 0; i < attributeBindings.length; ++i) {
var binding = attributeBindings[i]
if (binding.buffer) {
gl.enableVertexAttribArray(i)
gl.vertexAttribPointer(i, binding.size, binding.type, binding.normalized, binding.stride, binding.offfset)
if (exti && binding.divisor) {
exti.vertexAttribDivisorANGLE(i, binding.divisor)
}
} else {
gl.disableVertexAttribArray(i)
gl.vertexAttrib4f(i, binding.x, binding.y, binding.z, binding.w)
}
}
}
state.currentVAO = vao
}
function destroyVAOEXT () {
values(vaoSet).forEach(function (vao) {
vao.destroy()
})
}
function REGLVAO () {
this.id = ++vaoCount
this.attributes = []
var extension = extVAO()
if (extension) {
this.vao = extension.createVertexArrayOES()
} else {
this.vao = null
}
vaoSet[this.id] = this
this.buffers = []
}
REGLVAO.prototype.bindAttrs = function () {
var exti = extInstanced()
var attributes = this.attributes
for (var i = 0; i < attributes.length; ++i) {
var attr = attributes[i]
if (attr.buffer) {
gl.enableVertexAttribArray(i)
gl.bindBuffer(GL_ARRAY_BUFFER$1, attr.buffer.buffer)
gl.vertexAttribPointer(i, attr.size, attr.type, attr.normalized, attr.stride, attr.offset)
if (exti && attr.divisor) {
exti.vertexAttribDivisorANGLE(i, attr.divisor)
}
} else {
gl.disableVertexAttribArray(i)
gl.vertexAttrib4f(i, attr.x, attr.y, attr.z, attr.w)
}
}
for (var j = attributes.length; j < NUM_ATTRIBUTES; ++j) {
gl.disableVertexAttribArray(j)
}
}
REGLVAO.prototype.refresh = function () {
var ext = extVAO()
if (ext) {
ext.bindVertexArrayOES(this.vao)
this.bindAttrs()
state.currentVAO = this
}
}
REGLVAO.prototype.destroy = function () {
if (this.vao) {
var extension = extVAO()
if (this === state.currentVAO) {
state.currentVAO = null
extension.bindVertexArrayOES(null)
}
extension.deleteVertexArrayOES(this.vao)
this.vao = null
}
if (vaoSet[this.id]) {
delete vaoSet[this.id]
stats.vaoCount -= 1
}
}
function restoreVAO () {
var ext = extVAO()
if (ext) {
values(vaoSet).forEach(function (vao) {
vao.refresh()
})
}
}
function createVAO (_attr) {
var vao = new REGLVAO()
stats.vaoCount += 1
function updateVAO (attributes) {
check$1(Array.isArray(attributes), 'arguments to vertex array constructor must be an array')
check$1(attributes.length < NUM_ATTRIBUTES, 'too many attributes')
check$1(attributes.length > 0, 'must specify at least one attribute')
var bufUpdated = {}
var nattributes = vao.attributes
nattributes.length = attributes.length
for (var i = 0; i < attributes.length; ++i) {
var spec = attributes[i]
var rec = nattributes[i] = new AttributeRecord()
var data = spec.data || spec
if (Array.isArray(data) || isTypedArray(data) || isNDArrayLike(data)) {
var buf
if (vao.buffers[i]) {
buf = vao.buffers[i]
if (isTypedArray(data) && buf._buffer.byteLength >= data.byteLength) {
buf.subdata(data)
} else {
buf.destroy()
vao.buffers[i] = null
}
}
if (!vao.buffers[i]) {
buf = vao.buffers[i] = bufferState.create(spec, GL_ARRAY_BUFFER$1, false, true)
}
rec.buffer = bufferState.getBuffer(buf)
rec.size = rec.buffer.dimension | 0
rec.normalized = false
rec.type = rec.buffer.dtype
rec.offset = 0
rec.stride = 0
rec.divisor = 0
rec.state = 1
bufUpdated[i] = 1
} else if (bufferState.getBuffer(spec)) {
rec.buffer = bufferState.getBuffer(spec)
rec.size = rec.buffer.dimension | 0
rec.normalized = false
rec.type = rec.buffer.dtype
rec.offset = 0
rec.stride = 0
rec.divisor = 0
rec.state = 1
} else if (bufferState.getBuffer(spec.buffer)) {
rec.buffer = bufferState.getBuffer(spec.buffer)
rec.size = ((+spec.size) || rec.buffer.dimension) | 0
rec.normalized = !!spec.normalized || false
if ('type' in spec) {
check$1.parameter(spec.type, glTypes, 'invalid buffer type')
rec.type = glTypes[spec.type]
} else {
rec.type = rec.buffer.dtype
}
rec.offset = (spec.offset || 0) | 0
rec.stride = (spec.stride || 0) | 0
rec.divisor = (spec.divisor || 0) | 0
rec.state = 1
check$1(rec.size >= 1 && rec.size <= 4, 'size must be between 1 and 4')
check$1(rec.offset >= 0, 'invalid offset')
check$1(rec.stride >= 0 && rec.stride <= 255, 'stride must be between 0 and 255')
check$1(rec.divisor >= 0, 'divisor must be positive')
check$1(!rec.divisor || !!extensions.angle_instanced_arrays, 'ANGLE_instanced_arrays must be enabled to use divisor')
} else if ('x' in spec) {
check$1(i > 0, 'first attribute must not be a constant')
rec.x = +spec.x || 0
rec.y = +spec.y || 0
rec.z = +spec.z || 0
rec.w = +spec.w || 0
rec.state = 2
} else {
check$1(false, 'invalid attribute spec for location ' + i)
}
}
// retire unused buffers
for (var j = 0; j < vao.buffers.length; ++j) {
if (!bufUpdated[j] && vao.buffers[j]) {
vao.buffers[j].destroy()
vao.buffers[j] = null
}
}
vao.refresh()
return updateVAO
}
updateVAO.destroy = function () {
for (var j = 0; j < vao.buffers.length; ++j) {
if (vao.buffers[j]) {
vao.buffers[j].destroy()
}
}
vao.buffers.length = 0
vao.destroy()
}
updateVAO._vao = vao
updateVAO._reglType = 'vao'
return updateVAO(_attr)
}
return state
}
var GL_FRAGMENT_SHADER = 35632
var GL_VERTEX_SHADER = 35633
var GL_ACTIVE_UNIFORMS = 0x8B86
var GL_ACTIVE_ATTRIBUTES = 0x8B89
function wrapShaderState (gl, stringStore, stats, config) {
// ===================================================
// glsl compilation and linking
// ===================================================
var fragShaders = {}
var vertShaders = {}
function ActiveInfo (name, id, location, info) {
this.name = name
this.id = id
this.location = location
this.info = info
}
function insertActiveInfo (list, info) {
for (var i = 0; i < list.length; ++i) {
if (list[i].id === info.id) {
list[i].location = info.location
return
}
}
list.push(info)
}
function getShader (type, id, command) {
var cache = type === GL_FRAGMENT_SHADER ? fragShaders : vertShaders
var shader = cache[id]
if (!shader) {
var source = stringStore.str(id)
shader = gl.createShader(type)
gl.shaderSource(shader, source)
gl.compileShader(shader)
check$1.shaderError(gl, shader, source, type, command)
cache[id] = shader
}
return shader
}
// ===================================================
// program linking
// ===================================================
var programCache = {}
var programList = []
var PROGRAM_COUNTER = 0
function REGLProgram (fragId, vertId) {
this.id = PROGRAM_COUNTER++
this.fragId = fragId
this.vertId = vertId
this.program = null
this.uniforms = []
this.attributes = []
this.refCount = 1
if (config.profile) {
this.stats = {
uniformsCount: 0,
attributesCount: 0
}
}
}
function linkProgram (desc, command, attributeLocations) {
var i, info
// -------------------------------
// compile & link
// -------------------------------
var fragShader = getShader(GL_FRAGMENT_SHADER, desc.fragId)
var vertShader = getShader(GL_VERTEX_SHADER, desc.vertId)
var program = desc.program = gl.createProgram()
gl.attachShader(program, fragShader)
gl.attachShader(program, vertShader)
if (attributeLocations) {
for (i = 0; i < attributeLocations.length; ++i) {
var binding = attributeLocations[i]
gl.bindAttribLocation(program, binding[0], binding[1])
}
}
gl.linkProgram(program)
check$1.linkError(
gl,
program,
stringStore.str(desc.fragId),
stringStore.str(desc.vertId),
command)
// -------------------------------
// grab uniforms
// -------------------------------
var numUniforms = gl.getProgramParameter(program, GL_ACTIVE_UNIFORMS)
if (config.profile) {
desc.stats.uniformsCount = numUniforms
}
var uniforms = desc.uniforms
for (i = 0; i < numUniforms; ++i) {
info = gl.getActiveUniform(program, i)
if (info) {
if (info.size > 1) {
for (var j = 0; j < info.size; ++j) {
var name = info.name.replace('[0]', '[' + j + ']')
insertActiveInfo(uniforms, new ActiveInfo(
name,
stringStore.id(name),
gl.getUniformLocation(program, name),
info))
}
} else {
insertActiveInfo(uniforms, new ActiveInfo(
info.name,
stringStore.id(info.name),
gl.getUniformLocation(program, info.name),
info))
}
}
}
// -------------------------------
// grab attributes
// -------------------------------
var numAttributes = gl.getProgramParameter(program, GL_ACTIVE_ATTRIBUTES)
if (config.profile) {
desc.stats.attributesCount = numAttributes
}
var attributes = desc.attributes
for (i = 0; i < numAttributes; ++i) {
info = gl.getActiveAttrib(program, i)
if (info) {
insertActiveInfo(attributes, new ActiveInfo(
info.name,
stringStore.id(info.name),
gl.getAttribLocation(program, info.name),
info))
}
}
}
if (config.profile) {
stats.getMaxUniformsCount = function () {
var m = 0
programList.forEach(function (desc) {
if (desc.stats.uniformsCount > m) {
m = desc.stats.uniformsCount
}
})
return m
}
stats.getMaxAttributesCount = function () {
var m = 0
programList.forEach(function (desc) {
if (desc.stats.attributesCount > m) {
m = desc.stats.attributesCount
}
})
return m
}
}
function restoreShaders () {
fragShaders = {}
vertShaders = {}
for (var i = 0; i < programList.length; ++i) {
linkProgram(programList[i], null, programList[i].attributes.map(function (info) {
return [info.location, info.name]
}))
}
}
return {
clear: function () {
var deleteShader = gl.deleteShader.bind(gl)
values(fragShaders).forEach(deleteShader)
fragShaders = {}
values(vertShaders).forEach(deleteShader)
vertShaders = {}
programList.forEach(function (desc) {
gl.deleteProgram(desc.program)
})
programList.length = 0
programCache = {}
stats.shaderCount = 0
},
program: function (vertId, fragId, command, attribLocations) {
check$1.command(vertId >= 0, 'missing vertex shader', command)
check$1.command(fragId >= 0, 'missing fragment shader', command)
var cache = programCache[fragId]
if (!cache) {
cache = programCache[fragId] = {}
}
var prevProgram = cache[vertId]
if (prevProgram) {
prevProgram.refCount++
if (!attribLocations) {
return prevProgram
}
}
var program = new REGLProgram(fragId, vertId)
stats.shaderCount++
linkProgram(program, command, attribLocations)
if (!prevProgram) {
cache[vertId] = program
}
programList.push(program)
return extend(program, {
destroy: function () {
program.refCount--
if (program.refCount <= 0) {
gl.deleteProgram(program.program)
var idx = programList.indexOf(program)
programList.splice(idx, 1)
stats.shaderCount--
}
// no program is linked to this vert anymore
if (cache[program.vertId].refCount <= 0) {
gl.deleteShader(vertShaders[program.vertId])
delete vertShaders[program.vertId]
delete programCache[program.fragId][program.vertId]
}
// no program is linked to this frag anymore
if (!Object.keys(programCache[program.fragId]).length) {
gl.deleteShader(fragShaders[program.fragId])
delete fragShaders[program.fragId]
delete programCache[program.fragId]
}
}
})
},
restore: restoreShaders,
shader: getShader,
frag: -1,
vert: -1
}
}
var GL_RGBA$3 = 6408
var GL_UNSIGNED_BYTE$7 = 5121
var GL_PACK_ALIGNMENT = 0x0D05
var GL_FLOAT$7 = 0x1406 // 5126
function wrapReadPixels (
gl,
framebufferState,
reglPoll,
context,
glAttributes,
extensions,
limits) {
function readPixelsImpl (input) {
var type
if (framebufferState.next === null) {
check$1(
glAttributes.preserveDrawingBuffer,
'you must create a webgl context with "preserveDrawingBuffer":true in order to read pixels from the drawing buffer')
type = GL_UNSIGNED_BYTE$7
} else {
check$1(
framebufferState.next.colorAttachments[0].texture !== null,
'You cannot read from a renderbuffer')
type = framebufferState.next.colorAttachments[0].texture._texture.type
if (extensions.oes_texture_float) {
check$1(
type === GL_UNSIGNED_BYTE$7 || type === GL_FLOAT$7,
'Reading from a framebuffer is only allowed for the types \'uint8\' and \'float\'')
if (type === GL_FLOAT$7) {
check$1(limits.readFloat, 'Reading \'float\' values is not permitted in your browser. For a fallback, please see: https://www.npmjs.com/package/glsl-read-float')
}
} else {
check$1(
type === GL_UNSIGNED_BYTE$7,
'Reading from a framebuffer is only allowed for the type \'uint8\'')
}
}
var x = 0
var y = 0
var width = context.framebufferWidth
var height = context.framebufferHeight
var data = null
if (isTypedArray(input)) {
data = input
} else if (input) {
check$1.type(input, 'object', 'invalid arguments to regl.read()')
x = input.x | 0
y = input.y | 0
check$1(
x >= 0 && x < context.framebufferWidth,
'invalid x offset for regl.read')
check$1(
y >= 0 && y < context.framebufferHeight,
'invalid y offset for regl.read')
width = (input.width || (context.framebufferWidth - x)) | 0
height = (input.height || (context.framebufferHeight - y)) | 0
data = input.data || null
}
// sanity check input.data
if (data) {
if (type === GL_UNSIGNED_BYTE$7) {
check$1(
data instanceof Uint8Array,
'buffer must be \'Uint8Array\' when reading from a framebuffer of type \'uint8\'')
} else if (type === GL_FLOAT$7) {
check$1(
data instanceof Float32Array,
'buffer must be \'Float32Array\' when reading from a framebuffer of type \'float\'')
}
}
check$1(
width > 0 && width + x <= context.framebufferWidth,
'invalid width for read pixels')
check$1(
height > 0 && height + y <= context.framebufferHeight,
'invalid height for read pixels')
// Update WebGL state
reglPoll()
// Compute size
var size = width * height * 4
// Allocate data
if (!data) {
if (type === GL_UNSIGNED_BYTE$7) {
data = new Uint8Array(size)
} else if (type === GL_FLOAT$7) {
data = data || new Float32Array(size)
}
}
// Type check
check$1.isTypedArray(data, 'data buffer for regl.read() must be a typedarray')
check$1(data.byteLength >= size, 'data buffer for regl.read() too small')
// Run read pixels
gl.pixelStorei(GL_PACK_ALIGNMENT, 4)
gl.readPixels(x, y, width, height, GL_RGBA$3,
type,
data)
return data
}
function readPixelsFBO (options) {
var result
framebufferState.setFBO({
framebuffer: options.framebuffer
}, function () {
result = readPixelsImpl(options)
})
return result
}
function readPixels (options) {
if (!options || !('framebuffer' in options)) {
return readPixelsImpl(options)
} else {
return readPixelsFBO(options)
}
}
return readPixels
}
function slice (x) {
return Array.prototype.slice.call(x)
}
function join (x) {
return slice(x).join('')
}
function createEnvironment () {
// Unique variable id counter
var varCounter = 0
// Linked values are passed from this scope into the generated code block
// Calling link() passes a value into the generated scope and returns
// the variable name which it is bound to
var linkedNames = []
var linkedValues = []
function link (value) {
for (var i = 0; i < linkedValues.length; ++i) {
if (linkedValues[i] === value) {
return linkedNames[i]
}
}
var name = 'g' + (varCounter++)
linkedNames.push(name)
linkedValues.push(value)
return name
}
// create a code block
function block () {
var code = []
function push () {
code.push.apply(code, slice(arguments))
}
var vars = []
function def () {
var name = 'v' + (varCounter++)
vars.push(name)
if (arguments.length > 0) {
code.push(name, '=')
code.push.apply(code, slice(arguments))
code.push(';')
}
return name
}
return extend(push, {
def: def,
toString: function () {
return join([
(vars.length > 0 ? 'var ' + vars.join(',') + ';' : ''),
join(code)
])
}
})
}
function scope () {
var entry = block()
var exit = block()
var entryToString = entry.toString
var exitToString = exit.toString
function save (object, prop) {
exit(object, prop, '=', entry.def(object, prop), ';')
}
return extend(function () {
entry.apply(entry, slice(arguments))
}, {
def: entry.def,
entry: entry,
exit: exit,
save: save,
set: function (object, prop, value) {
save(object, prop)
entry(object, prop, '=', value, ';')
},
toString: function () {
return entryToString() + exitToString()
}
})
}
function conditional () {
var pred = join(arguments)
var thenBlock = scope()
var elseBlock = scope()
var thenToString = thenBlock.toString
var elseToString = elseBlock.toString
return extend(thenBlock, {
then: function () {
thenBlock.apply(thenBlock, slice(arguments))
return this
},
else: function () {
elseBlock.apply(elseBlock, slice(arguments))
return this
},
toString: function () {
var elseClause = elseToString()
if (elseClause) {
elseClause = 'else{' + elseClause + '}'
}
return join([
'if(', pred, '){',
thenToString(),
'}', elseClause
])
}
})
}
// procedure list
var globalBlock = block()
var procedures = {}
function proc (name, count) {
var args = []
function arg () {
var name = 'a' + args.length
args.push(name)
return name
}
count = count || 0
for (var i = 0; i < count; ++i) {
arg()
}
var body = scope()
var bodyToString = body.toString
var result = procedures[name] = extend(body, {
arg: arg,
toString: function () {
return join([
'function(', args.join(), '){',
bodyToString(),
'}'
])
}
})
return result
}
function compile () {
var code = ['"use strict";',
globalBlock,
'return {']
Object.keys(procedures).forEach(function (name) {
code.push('"', name, '":', procedures[name].toString(), ',')
})
code.push('}')
var src = join(code)
.replace(/;/g, ';\n')
.replace(/}/g, '}\n')
.replace(/{/g, '{\n')
var proc = Function.apply(null, linkedNames.concat(src))
return proc.apply(null, linkedValues)
}
return {
global: globalBlock,
link: link,
block: block,
proc: proc,
scope: scope,
cond: conditional,
compile: compile
}
}
// "cute" names for vector components
var CUTE_COMPONENTS = 'xyzw'.split('')
var GL_UNSIGNED_BYTE$8 = 5121
var ATTRIB_STATE_POINTER = 1
var ATTRIB_STATE_CONSTANT = 2
var DYN_FUNC$1 = 0
var DYN_PROP$1 = 1
var DYN_CONTEXT$1 = 2
var DYN_STATE$1 = 3
var DYN_THUNK = 4
var DYN_CONSTANT$1 = 5
var DYN_ARRAY$1 = 6
var S_DITHER = 'dither'
var S_BLEND_ENABLE = 'blend.enable'
var S_BLEND_COLOR = 'blend.color'
var S_BLEND_EQUATION = 'blend.equation'
var S_BLEND_FUNC = 'blend.func'
var S_DEPTH_ENABLE = 'depth.enable'
var S_DEPTH_FUNC = 'depth.func'
var S_DEPTH_RANGE = 'depth.range'
var S_DEPTH_MASK = 'depth.mask'
var S_COLOR_MASK = 'colorMask'
var S_CULL_ENABLE = 'cull.enable'
var S_CULL_FACE = 'cull.face'
var S_FRONT_FACE = 'frontFace'
var S_LINE_WIDTH = 'lineWidth'
var S_POLYGON_OFFSET_ENABLE = 'polygonOffset.enable'
var S_POLYGON_OFFSET_OFFSET = 'polygonOffset.offset'
var S_SAMPLE_ALPHA = 'sample.alpha'
var S_SAMPLE_ENABLE = 'sample.enable'
var S_SAMPLE_COVERAGE = 'sample.coverage'
var S_STENCIL_ENABLE = 'stencil.enable'
var S_STENCIL_MASK = 'stencil.mask'
var S_STENCIL_FUNC = 'stencil.func'
var S_STENCIL_OPFRONT = 'stencil.opFront'
var S_STENCIL_OPBACK = 'stencil.opBack'
var S_SCISSOR_ENABLE = 'scissor.enable'
var S_SCISSOR_BOX = 'scissor.box'
var S_VIEWPORT = 'viewport'
var S_PROFILE = 'profile'
var S_FRAMEBUFFER = 'framebuffer'
var S_VERT = 'vert'
var S_FRAG = 'frag'
var S_ELEMENTS = 'elements'
var S_PRIMITIVE = 'primitive'
var S_COUNT = 'count'
var S_OFFSET = 'offset'
var S_INSTANCES = 'instances'
var S_VAO = 'vao'
var SUFFIX_WIDTH = 'Width'
var SUFFIX_HEIGHT = 'Height'
var S_FRAMEBUFFER_WIDTH = S_FRAMEBUFFER + SUFFIX_WIDTH
var S_FRAMEBUFFER_HEIGHT = S_FRAMEBUFFER + SUFFIX_HEIGHT
var S_VIEWPORT_WIDTH = S_VIEWPORT + SUFFIX_WIDTH
var S_VIEWPORT_HEIGHT = S_VIEWPORT + SUFFIX_HEIGHT
var S_DRAWINGBUFFER = 'drawingBuffer'
var S_DRAWINGBUFFER_WIDTH = S_DRAWINGBUFFER + SUFFIX_WIDTH
var S_DRAWINGBUFFER_HEIGHT = S_DRAWINGBUFFER + SUFFIX_HEIGHT
var NESTED_OPTIONS = [
S_BLEND_FUNC,
S_BLEND_EQUATION,
S_STENCIL_FUNC,
S_STENCIL_OPFRONT,
S_STENCIL_OPBACK,
S_SAMPLE_COVERAGE,
S_VIEWPORT,
S_SCISSOR_BOX,
S_POLYGON_OFFSET_OFFSET
]
var GL_ARRAY_BUFFER$2 = 34962
var GL_ELEMENT_ARRAY_BUFFER$1 = 34963
var GL_FRAGMENT_SHADER$1 = 35632
var GL_VERTEX_SHADER$1 = 35633
var GL_TEXTURE_2D$3 = 0x0DE1
var GL_TEXTURE_CUBE_MAP$2 = 0x8513
var GL_CULL_FACE = 0x0B44
var GL_BLEND = 0x0BE2
var GL_DITHER = 0x0BD0
var GL_STENCIL_TEST = 0x0B90
var GL_DEPTH_TEST = 0x0B71
var GL_SCISSOR_TEST = 0x0C11
var GL_POLYGON_OFFSET_FILL = 0x8037
var GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809E
var GL_SAMPLE_COVERAGE = 0x80A0
var GL_FLOAT$8 = 5126
var GL_FLOAT_VEC2 = 35664
var GL_FLOAT_VEC3 = 35665
var GL_FLOAT_VEC4 = 35666
var GL_INT$3 = 5124
var GL_INT_VEC2 = 35667
var GL_INT_VEC3 = 35668
var GL_INT_VEC4 = 35669
var GL_BOOL = 35670
var GL_BOOL_VEC2 = 35671
var GL_BOOL_VEC3 = 35672
var GL_BOOL_VEC4 = 35673
var GL_FLOAT_MAT2 = 35674
var GL_FLOAT_MAT3 = 35675
var GL_FLOAT_MAT4 = 35676
var GL_SAMPLER_2D = 35678
var GL_SAMPLER_CUBE = 35680
var GL_TRIANGLES$1 = 4
var GL_FRONT = 1028
var GL_BACK = 1029
var GL_CW = 0x0900
var GL_CCW = 0x0901
var GL_MIN_EXT = 0x8007
var GL_MAX_EXT = 0x8008
var GL_ALWAYS = 519
var GL_KEEP = 7680
var GL_ZERO = 0
var GL_ONE = 1
var GL_FUNC_ADD = 0x8006
var GL_LESS = 513
var GL_FRAMEBUFFER$2 = 0x8D40
var GL_COLOR_ATTACHMENT0$2 = 0x8CE0
var blendFuncs = {
'0': 0,
'1': 1,
'zero': 0,
'one': 1,
'src color': 768,
'one minus src color': 769,
'src alpha': 770,
'one minus src alpha': 771,
'dst color': 774,
'one minus dst color': 775,
'dst alpha': 772,
'one minus dst alpha': 773,
'constant color': 32769,
'one minus constant color': 32770,
'constant alpha': 32771,
'one minus constant alpha': 32772,
'src alpha saturate': 776
}
// There are invalid values for srcRGB and dstRGB. See:
// https://www.khronos.org/registry/webgl/specs/1.0/#6.13
// https://github.com/KhronosGroup/WebGL/blob/0d3201f5f7ec3c0060bc1f04077461541f1987b9/conformance-suites/1.0.3/conformance/misc/webgl-specific.html#L56
var invalidBlendCombinations = [
'constant color, constant alpha',
'one minus constant color, constant alpha',
'constant color, one minus constant alpha',
'one minus constant color, one minus constant alpha',
'constant alpha, constant color',
'constant alpha, one minus constant color',
'one minus constant alpha, constant color',
'one minus constant alpha, one minus constant color'
]
var compareFuncs = {
'never': 512,
'less': 513,
'<': 513,
'equal': 514,
'=': 514,
'==': 514,
'===': 514,
'lequal': 515,
'<=': 515,
'greater': 516,
'>': 516,
'notequal': 517,
'!=': 517,
'!==': 517,
'gequal': 518,
'>=': 518,
'always': 519
}
var stencilOps = {
'0': 0,
'zero': 0,
'keep': 7680,
'replace': 7681,
'increment': 7682,
'decrement': 7683,
'increment wrap': 34055,
'decrement wrap': 34056,
'invert': 5386
}
var shaderType = {
'frag': GL_FRAGMENT_SHADER$1,
'vert': GL_VERTEX_SHADER$1
}
var orientationType = {
'cw': GL_CW,
'ccw': GL_CCW
}
function isBufferArgs (x) {
return Array.isArray(x) ||
isTypedArray(x) ||
isNDArrayLike(x)
}
// Make sure viewport is processed first
function sortState (state) {
return state.sort(function (a, b) {
if (a === S_VIEWPORT) {
return -1
} else if (b === S_VIEWPORT) {
return 1
}
return (a < b) ? -1 : 1
})
}
function Declaration (thisDep, contextDep, propDep, append) {
this.thisDep = thisDep
this.contextDep = contextDep
this.propDep = propDep
this.append = append
}
function isStatic (decl) {
return decl && !(decl.thisDep || decl.contextDep || decl.propDep)
}
function createStaticDecl (append) {
return new Declaration(false, false, false, append)
}
function createDynamicDecl (dyn, append) {
var type = dyn.type
if (type === DYN_FUNC$1) {
var numArgs = dyn.data.length
return new Declaration(
true,
numArgs >= 1,
numArgs >= 2,
append)
} else if (type === DYN_THUNK) {
var data = dyn.data
return new Declaration(
data.thisDep,
data.contextDep,
data.propDep,
append)
} else if (type === DYN_CONSTANT$1) {
return new Declaration(
false,
false,
false,
append)
} else if (type === DYN_ARRAY$1) {
var thisDep = false
var contextDep = false
var propDep = false
for (var i = 0; i < dyn.data.length; ++i) {
var subDyn = dyn.data[i]
if (subDyn.type === DYN_PROP$1) {
propDep = true
} else if (subDyn.type === DYN_CONTEXT$1) {
contextDep = true
} else if (subDyn.type === DYN_STATE$1) {
thisDep = true
} else if (subDyn.type === DYN_FUNC$1) {
thisDep = true
var subArgs = subDyn.data
if (subArgs >= 1) {
contextDep = true
}
if (subArgs >= 2) {
propDep = true
}
} else if (subDyn.type === DYN_THUNK) {
thisDep = thisDep || subDyn.data.thisDep
contextDep = contextDep || subDyn.data.contextDep
propDep = propDep || subDyn.data.propDep
}
}
return new Declaration(
thisDep,
contextDep,
propDep,
append)
} else {
return new Declaration(
type === DYN_STATE$1,
type === DYN_CONTEXT$1,
type === DYN_PROP$1,
append)
}
}
var SCOPE_DECL = new Declaration(false, false, false, function () {})
function reglCore (
gl,
stringStore,
extensions,
limits,
bufferState,
elementState,
textureState,
framebufferState,
uniformState,
attributeState,
shaderState,
drawState,
contextState,
timer,
config) {
var AttributeRecord = attributeState.Record
var blendEquations = {
'add': 32774,
'subtract': 32778,
'reverse subtract': 32779
}
if (extensions.ext_blend_minmax) {
blendEquations.min = GL_MIN_EXT
blendEquations.max = GL_MAX_EXT
}
var extInstancing = extensions.angle_instanced_arrays
var extDrawBuffers = extensions.webgl_draw_buffers
// ===================================================
// ===================================================
// WEBGL STATE
// ===================================================
// ===================================================
var currentState = {
dirty: true,
profile: config.profile
}
var nextState = {}
var GL_STATE_NAMES = []
var GL_FLAGS = {}
var GL_VARIABLES = {}
function propName (name) {
return name.replace('.', '_')
}
function stateFlag (sname, cap, init) {
var name = propName(sname)
GL_STATE_NAMES.push(sname)
nextState[name] = currentState[name] = !!init
GL_FLAGS[name] = cap
}
function stateVariable (sname, func, init) {
var name = propName(sname)
GL_STATE_NAMES.push(sname)
if (Array.isArray(init)) {
currentState[name] = init.slice()
nextState[name] = init.slice()
} else {
currentState[name] = nextState[name] = init
}
GL_VARIABLES[name] = func
}
// Dithering
stateFlag(S_DITHER, GL_DITHER)
// Blending
stateFlag(S_BLEND_ENABLE, GL_BLEND)
stateVariable(S_BLEND_COLOR, 'blendColor', [0, 0, 0, 0])
stateVariable(S_BLEND_EQUATION, 'blendEquationSeparate',
[GL_FUNC_ADD, GL_FUNC_ADD])
stateVariable(S_BLEND_FUNC, 'blendFuncSeparate',
[GL_ONE, GL_ZERO, GL_ONE, GL_ZERO])
// Depth
stateFlag(S_DEPTH_ENABLE, GL_DEPTH_TEST, true)
stateVariable(S_DEPTH_FUNC, 'depthFunc', GL_LESS)
stateVariable(S_DEPTH_RANGE, 'depthRange', [0, 1])
stateVariable(S_DEPTH_MASK, 'depthMask', true)
// Color mask
stateVariable(S_COLOR_MASK, S_COLOR_MASK, [true, true, true, true])
// Face culling
stateFlag(S_CULL_ENABLE, GL_CULL_FACE)
stateVariable(S_CULL_FACE, 'cullFace', GL_BACK)
// Front face orientation
stateVariable(S_FRONT_FACE, S_FRONT_FACE, GL_CCW)
// Line width
stateVariable(S_LINE_WIDTH, S_LINE_WIDTH, 1)
// Polygon offset
stateFlag(S_POLYGON_OFFSET_ENABLE, GL_POLYGON_OFFSET_FILL)
stateVariable(S_POLYGON_OFFSET_OFFSET, 'polygonOffset', [0, 0])
// Sample coverage
stateFlag(S_SAMPLE_ALPHA, GL_SAMPLE_ALPHA_TO_COVERAGE)
stateFlag(S_SAMPLE_ENABLE, GL_SAMPLE_COVERAGE)
stateVariable(S_SAMPLE_COVERAGE, 'sampleCoverage', [1, false])
// Stencil
stateFlag(S_STENCIL_ENABLE, GL_STENCIL_TEST)
stateVariable(S_STENCIL_MASK, 'stencilMask', -1)
stateVariable(S_STENCIL_FUNC, 'stencilFunc', [GL_ALWAYS, 0, -1])
stateVariable(S_STENCIL_OPFRONT, 'stencilOpSeparate',
[GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP])
stateVariable(S_STENCIL_OPBACK, 'stencilOpSeparate',
[GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP])
// Scissor
stateFlag(S_SCISSOR_ENABLE, GL_SCISSOR_TEST)
stateVariable(S_SCISSOR_BOX, 'scissor',
[0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight])
// Viewport
stateVariable(S_VIEWPORT, S_VIEWPORT,
[0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight])
// ===================================================
// ===================================================
// ENVIRONMENT
// ===================================================
// ===================================================
var sharedState = {
gl: gl,
context: contextState,
strings: stringStore,
next: nextState,
current: currentState,
draw: drawState,
elements: elementState,
buffer: bufferState,
shader: shaderState,
attributes: attributeState.state,
vao: attributeState,
uniforms: uniformState,
framebuffer: framebufferState,
extensions: extensions,
timer: timer,
isBufferArgs: isBufferArgs
}
var sharedConstants = {
primTypes: primTypes,
compareFuncs: compareFuncs,
blendFuncs: blendFuncs,
blendEquations: blendEquations,
stencilOps: stencilOps,
glTypes: glTypes,
orientationType: orientationType
}
check$1.optional(function () {
sharedState.isArrayLike = isArrayLike
})
if (extDrawBuffers) {
sharedConstants.backBuffer = [GL_BACK]
sharedConstants.drawBuffer = loop(limits.maxDrawbuffers, function (i) {
if (i === 0) {
return [0]
}
return loop(i, function (j) {
return GL_COLOR_ATTACHMENT0$2 + j
})
})
}
var drawCallCounter = 0
function createREGLEnvironment () {
var env = createEnvironment()
var link = env.link
var global = env.global
env.id = drawCallCounter++
env.batchId = '0'
// link shared state
var SHARED = link(sharedState)
var shared = env.shared = {
props: 'a0'
}
Object.keys(sharedState).forEach(function (prop) {
shared[prop] = global.def(SHARED, '.', prop)
})
// Inject runtime assertion stuff for debug builds
check$1.optional(function () {
env.CHECK = link(check$1)
env.commandStr = check$1.guessCommand()
env.command = link(env.commandStr)
env.assert = function (block, pred, message) {
block(
'if(!(', pred, '))',
this.CHECK, '.commandRaise(', link(message), ',', this.command, ');')
}
sharedConstants.invalidBlendCombinations = invalidBlendCombinations
})
// Copy GL state variables over
var nextVars = env.next = {}
var currentVars = env.current = {}
Object.keys(GL_VARIABLES).forEach(function (variable) {
if (Array.isArray(currentState[variable])) {
nextVars[variable] = global.def(shared.next, '.', variable)
currentVars[variable] = global.def(shared.current, '.', variable)
}
})
// Initialize shared constants
var constants = env.constants = {}
Object.keys(sharedConstants).forEach(function (name) {
constants[name] = global.def(JSON.stringify(sharedConstants[name]))
})
// Helper function for calling a block
env.invoke = function (block, x) {
switch (x.type) {
case DYN_FUNC$1:
var argList = [
'this',
shared.context,
shared.props,
env.batchId
]
return block.def(
link(x.data), '.call(',
argList.slice(0, Math.max(x.data.length + 1, 4)),
')')
case DYN_PROP$1:
return block.def(shared.props, x.data)
case DYN_CONTEXT$1:
return block.def(shared.context, x.data)
case DYN_STATE$1:
return block.def('this', x.data)
case DYN_THUNK:
x.data.append(env, block)
return x.data.ref
case DYN_CONSTANT$1:
return x.data.toString()
case DYN_ARRAY$1:
return x.data.map(function (y) {
return env.invoke(block, y)
})
}
}
env.attribCache = {}
var scopeAttribs = {}
env.scopeAttrib = function (name) {
var id = stringStore.id(name)
if (id in scopeAttribs) {
return scopeAttribs[id]
}
var binding = attributeState.scope[id]
if (!binding) {
binding = attributeState.scope[id] = new AttributeRecord()
}
var result = scopeAttribs[id] = link(binding)
return result
}
return env
}
// ===================================================
// ===================================================
// PARSING
// ===================================================
// ===================================================
function parseProfile (options) {
var staticOptions = options.static
var dynamicOptions = options.dynamic
var profileEnable
if (S_PROFILE in staticOptions) {
var value = !!staticOptions[S_PROFILE]
profileEnable = createStaticDecl(function (env, scope) {
return value
})
profileEnable.enable = value
} else if (S_PROFILE in dynamicOptions) {
var dyn = dynamicOptions[S_PROFILE]
profileEnable = createDynamicDecl(dyn, function (env, scope) {
return env.invoke(scope, dyn)
})
}
return profileEnable
}
function parseFramebuffer (options, env) {
var staticOptions = options.static
var dynamicOptions = options.dynamic
if (S_FRAMEBUFFER in staticOptions) {
var framebuffer = staticOptions[S_FRAMEBUFFER]
if (framebuffer) {
framebuffer = framebufferState.getFramebuffer(framebuffer)
check$1.command(framebuffer, 'invalid framebuffer object')
return createStaticDecl(function (env, block) {
var FRAMEBUFFER = env.link(framebuffer)
var shared = env.shared
block.set(
shared.framebuffer,
'.next',
FRAMEBUFFER)
var CONTEXT = shared.context
block.set(
CONTEXT,
'.' + S_FRAMEBUFFER_WIDTH,
FRAMEBUFFER + '.width')
block.set(
CONTEXT,
'.' + S_FRAMEBUFFER_HEIGHT,
FRAMEBUFFER + '.height')
return FRAMEBUFFER
})
} else {
return createStaticDecl(function (env, scope) {
var shared = env.shared
scope.set(
shared.framebuffer,
'.next',
'null')
var CONTEXT = shared.context
scope.set(
CONTEXT,
'.' + S_FRAMEBUFFER_WIDTH,
CONTEXT + '.' + S_DRAWINGBUFFER_WIDTH)
scope.set(
CONTEXT,
'.' + S_FRAMEBUFFER_HEIGHT,
CONTEXT + '.' + S_DRAWINGBUFFER_HEIGHT)
return 'null'
})
}
} else if (S_FRAMEBUFFER in dynamicOptions) {
var dyn = dynamicOptions[S_FRAMEBUFFER]
return createDynamicDecl(dyn, function (env, scope) {
var FRAMEBUFFER_FUNC = env.invoke(scope, dyn)
var shared = env.shared
var FRAMEBUFFER_STATE = shared.framebuffer
var FRAMEBUFFER = scope.def(
FRAMEBUFFER_STATE, '.getFramebuffer(', FRAMEBUFFER_FUNC, ')')
check$1.optional(function () {
env.assert(scope,
'!' + FRAMEBUFFER_FUNC + '||' + FRAMEBUFFER,
'invalid framebuffer object')
})
scope.set(
FRAMEBUFFER_STATE,
'.next',
FRAMEBUFFER)
var CONTEXT = shared.context
scope.set(
CONTEXT,
'.' + S_FRAMEBUFFER_WIDTH,
FRAMEBUFFER + '?' + FRAMEBUFFER + '.width:' +
CONTEXT + '.' + S_DRAWINGBUFFER_WIDTH)
scope.set(
CONTEXT,
'.' + S_FRAMEBUFFER_HEIGHT,
FRAMEBUFFER +
'?' + FRAMEBUFFER + '.height:' +
CONTEXT + '.' + S_DRAWINGBUFFER_HEIGHT)
return FRAMEBUFFER
})
} else {
return null
}
}
function parseViewportScissor (options, framebuffer, env) {
var staticOptions = options.static
var dynamicOptions = options.dynamic
function parseBox (param) {
if (param in staticOptions) {
var box = staticOptions[param]
check$1.commandType(box, 'object', 'invalid ' + param, env.commandStr)
var isStatic = true
var x = box.x | 0
var y = box.y | 0
var w, h
if ('width' in box) {
w = box.width | 0
check$1.command(w >= 0, 'invalid ' + param, env.commandStr)
} else {
isStatic = false
}
if ('height' in box) {
h = box.height | 0
check$1.command(h >= 0, 'invalid ' + param, env.commandStr)
} else {
isStatic = false
}
return new Declaration(
!isStatic && framebuffer && framebuffer.thisDep,
!isStatic && framebuffer && framebuffer.contextDep,
!isStatic && framebuffer && framebuffer.propDep,
function (env, scope) {
var CONTEXT = env.shared.context
var BOX_W = w
if (!('width' in box)) {
BOX_W = scope.def(CONTEXT, '.', S_FRAMEBUFFER_WIDTH, '-', x)
}
var BOX_H = h
if (!('height' in box)) {
BOX_H = scope.def(CONTEXT, '.', S_FRAMEBUFFER_HEIGHT, '-', y)
}
return [x, y, BOX_W, BOX_H]
})
} else if (param in dynamicOptions) {
var dynBox = dynamicOptions[param]
var result = createDynamicDecl(dynBox, function (env, scope) {
var BOX = env.invoke(scope, dynBox)
check$1.optional(function () {
env.assert(scope,
BOX + '&&typeof ' + BOX + '==="object"',
'invalid ' + param)
})
var CONTEXT = env.shared.context
var BOX_X = scope.def(BOX, '.x|0')
var BOX_Y = scope.def(BOX, '.y|0')
var BOX_W = scope.def(
'"width" in ', BOX, '?', BOX, '.width|0:',
'(', CONTEXT, '.', S_FRAMEBUFFER_WIDTH, '-', BOX_X, ')')
var BOX_H = scope.def(
'"height" in ', BOX, '?', BOX, '.height|0:',
'(', CONTEXT, '.', S_FRAMEBUFFER_HEIGHT, '-', BOX_Y, ')')
check$1.optional(function () {
env.assert(scope,
BOX_W + '>=0&&' +
BOX_H + '>=0',
'invalid ' + param)
})
return [BOX_X, BOX_Y, BOX_W, BOX_H]
})
if (framebuffer) {
result.thisDep = result.thisDep || framebuffer.thisDep
result.contextDep = result.contextDep || framebuffer.contextDep
result.propDep = result.propDep || framebuffer.propDep
}
return result
} else if (framebuffer) {
return new Declaration(
framebuffer.thisDep,
framebuffer.contextDep,
framebuffer.propDep,
function (env, scope) {
var CONTEXT = env.shared.context
return [
0, 0,
scope.def(CONTEXT, '.', S_FRAMEBUFFER_WIDTH),
scope.def(CONTEXT, '.', S_FRAMEBUFFER_HEIGHT)]
})
} else {
return null
}
}
var viewport = parseBox(S_VIEWPORT)
if (viewport) {
var prevViewport = viewport
viewport = new Declaration(
viewport.thisDep,
viewport.contextDep,
viewport.propDep,
function (env, scope) {
var VIEWPORT = prevViewport.append(env, scope)
var CONTEXT = env.shared.context
scope.set(
CONTEXT,
'.' + S_VIEWPORT_WIDTH,
VIEWPORT[2])
scope.set(
CONTEXT,
'.' + S_VIEWPORT_HEIGHT,
VIEWPORT[3])
return VIEWPORT
})
}
return {
viewport: viewport,
scissor_box: parseBox(S_SCISSOR_BOX)
}
}
function parseAttribLocations (options, attributes) {
var staticOptions = options.static
var staticProgram =
typeof staticOptions[S_FRAG] === 'string' &&
typeof staticOptions[S_VERT] === 'string'
if (staticProgram) {
if (Object.keys(attributes.dynamic).length > 0) {
return null
}
var staticAttributes = attributes.static
var sAttributes = Object.keys(staticAttributes)
if (sAttributes.length > 0 && typeof staticAttributes[sAttributes[0]] === 'number') {
var bindings = []
for (var i = 0; i < sAttributes.length; ++i) {
check$1(typeof staticAttributes[sAttributes[i]] === 'number', 'must specify all vertex attribute locations when using vaos')
bindings.push([staticAttributes[sAttributes[i]] | 0, sAttributes[i]])
}
return bindings
}
}
return null
}
function parseProgram (options, env, attribLocations) {
var staticOptions = options.static
var dynamicOptions = options.dynamic
function parseShader (name) {
if (name in staticOptions) {
var id = stringStore.id(staticOptions[name])
check$1.optional(function () {
shaderState.shader(shaderType[name], id, check$1.guessCommand())
})
var result = createStaticDecl(function () {
return id
})
result.id = id
return result
} else if (name in dynamicOptions) {
var dyn = dynamicOptions[name]
return createDynamicDecl(dyn, function (env, scope) {
var str = env.invoke(scope, dyn)
var id = scope.def(env.shared.strings, '.id(', str, ')')
check$1.optional(function () {
scope(
env.shared.shader, '.shader(',
shaderType[name], ',',
id, ',',
env.command, ');')
})
return id
})
}
return null
}
var frag = parseShader(S_FRAG)
var vert = parseShader(S_VERT)
var program = null
var progVar
if (isStatic(frag) && isStatic(vert)) {
program = shaderState.program(vert.id, frag.id, null, attribLocations)
progVar = createStaticDecl(function (env, scope) {
return env.link(program)
})
} else {
progVar = new Declaration(
(frag && frag.thisDep) || (vert && vert.thisDep),
(frag && frag.contextDep) || (vert && vert.contextDep),
(frag && frag.propDep) || (vert && vert.propDep),
function (env, scope) {
var SHADER_STATE = env.shared.shader
var fragId
if (frag) {
fragId = frag.append(env, scope)
} else {
fragId = scope.def(SHADER_STATE, '.', S_FRAG)
}
var vertId
if (vert) {
vertId = vert.append(env, scope)
} else {
vertId = scope.def(SHADER_STATE, '.', S_VERT)
}
var progDef = SHADER_STATE + '.program(' + vertId + ',' + fragId
check$1.optional(function () {
progDef += ',' + env.command
})
return scope.def(progDef + ')')
})
}
return {
frag: frag,
vert: vert,
progVar: progVar,
program: program
}
}
function parseDraw (options, env) {
var staticOptions = options.static
var dynamicOptions = options.dynamic
function parseElements () {
if (S_ELEMENTS in staticOptions) {
var elements = staticOptions[S_ELEMENTS]
if (isBufferArgs(elements)) {
elements = elementState.getElements(elementState.create(elements, true))
} else if (elements) {
elements = elementState.getElements(elements)
check$1.command(elements, 'invalid elements', env.commandStr)
}
var result = createStaticDecl(function (env, scope) {
if (elements) {
var result = env.link(elements)
env.ELEMENTS = result
return result
}
env.ELEMENTS = null
return null
})
result.value = elements
return result
} else if (S_ELEMENTS in dynamicOptions) {
var dyn = dynamicOptions[S_ELEMENTS]
return createDynamicDecl(dyn, function (env, scope) {
var shared = env.shared
var IS_BUFFER_ARGS = shared.isBufferArgs
var ELEMENT_STATE = shared.elements
var elementDefn = env.invoke(scope, dyn)
var elements = scope.def('null')
var elementStream = scope.def(IS_BUFFER_ARGS, '(', elementDefn, ')')
var ifte = env.cond(elementStream)
.then(elements, '=', ELEMENT_STATE, '.createStream(', elementDefn, ');')
.else(elements, '=', ELEMENT_STATE, '.getElements(', elementDefn, ');')
check$1.optional(function () {
env.assert(ifte.else,
'!' + elementDefn + '||' + elements,
'invalid elements')
})
scope.entry(ifte)
scope.exit(
env.cond(elementStream)
.then(ELEMENT_STATE, '.destroyStream(', elements, ');'))
env.ELEMENTS = elements
return elements
})
}
return null
}
var elements = parseElements()
function parsePrimitive () {
if (S_PRIMITIVE in staticOptions) {
var primitive = staticOptions[S_PRIMITIVE]
check$1.commandParameter(primitive, primTypes, 'invalid primitve', env.commandStr)
return createStaticDecl(function (env, scope) {
return primTypes[primitive]
})
} else if (S_PRIMITIVE in dynamicOptions) {
var dynPrimitive = dynamicOptions[S_PRIMITIVE]
return createDynamicDecl(dynPrimitive, function (env, scope) {
var PRIM_TYPES = env.constants.primTypes
var prim = env.invoke(scope, dynPrimitive)
check$1.optional(function () {
env.assert(scope,
prim + ' in ' + PRIM_TYPES,
'invalid primitive, must be one of ' + Object.keys(primTypes))
})
return scope.def(PRIM_TYPES, '[', prim, ']')
})
} else if (elements) {
if (isStatic(elements)) {
if (elements.value) {
return createStaticDecl(function (env, scope) {
return scope.def(env.ELEMENTS, '.primType')
})
} else {
return createStaticDecl(function () {
return GL_TRIANGLES$1
})
}
} else {
return new Declaration(
elements.thisDep,
elements.contextDep,
elements.propDep,
function (env, scope) {
var elements = env.ELEMENTS
return scope.def(elements, '?', elements, '.primType:', GL_TRIANGLES$1)
})
}
}
return null
}
function parseParam (param, isOffset) {
if (param in staticOptions) {
var value = staticOptions[param] | 0
check$1.command(!isOffset || value >= 0, 'invalid ' + param, env.commandStr)
return createStaticDecl(function (env, scope) {
if (isOffset) {
env.OFFSET = value
}
return value
})
} else if (param in dynamicOptions) {
var dynValue = dynamicOptions[param]
return createDynamicDecl(dynValue, function (env, scope) {
var result = env.invoke(scope, dynValue)
if (isOffset) {
env.OFFSET = result
check$1.optional(function () {
env.assert(scope,
result + '>=0',
'invalid ' + param)
})
}
return result
})
} else if (isOffset && elements) {
return createStaticDecl(function (env, scope) {
env.OFFSET = '0'
return 0
})
}
return null
}
var OFFSET = parseParam(S_OFFSET, true)
function parseVertCount () {
if (S_COUNT in staticOptions) {
var count = staticOptions[S_COUNT] | 0
check$1.command(
typeof count === 'number' && count >= 0, 'invalid vertex count', env.commandStr)
return createStaticDecl(function () {
return count
})
} else if (S_COUNT in dynamicOptions) {
var dynCount = dynamicOptions[S_COUNT]
return createDynamicDecl(dynCount, function (env, scope) {
var result = env.invoke(scope, dynCount)
check$1.optional(function () {
env.assert(scope,
'typeof ' + result + '==="number"&&' +
result + '>=0&&' +
result + '===(' + result + '|0)',
'invalid vertex count')
})
return result
})
} else if (elements) {
if (isStatic(elements)) {
if (elements) {
if (OFFSET) {
return new Declaration(
OFFSET.thisDep,
OFFSET.contextDep,
OFFSET.propDep,
function (env, scope) {
var result = scope.def(
env.ELEMENTS, '.vertCount-', env.OFFSET)
check$1.optional(function () {
env.assert(scope,
result + '>=0',
'invalid vertex offset/element buffer too small')
})
return result
})
} else {
return createStaticDecl(function (env, scope) {
return scope.def(env.ELEMENTS, '.vertCount')
})
}
} else {
var result = createStaticDecl(function () {
return -1
})
check$1.optional(function () {
result.MISSING = true
})
return result
}
} else {
var variable = new Declaration(
elements.thisDep || OFFSET.thisDep,
elements.contextDep || OFFSET.contextDep,
elements.propDep || OFFSET.propDep,
function (env, scope) {
var elements = env.ELEMENTS
if (env.OFFSET) {
return scope.def(elements, '?', elements, '.vertCount-',
env.OFFSET, ':-1')
}
return scope.def(elements, '?', elements, '.vertCount:-1')
})
check$1.optional(function () {
variable.DYNAMIC = true
})
return variable
}
}
return null
}
return {
elements: elements,
primitive: parsePrimitive(),
count: parseVertCount(),
instances: parseParam(S_INSTANCES, false),
offset: OFFSET
}
}
function parseGLState (options, env) {
var staticOptions = options.static
var dynamicOptions = options.dynamic
var STATE = {}
GL_STATE_NAMES.forEach(function (prop) {
var param = propName(prop)
function parseParam (parseStatic, parseDynamic) {
if (prop in staticOptions) {
var value = parseStatic(staticOptions[prop])
STATE[param] = createStaticDecl(function () {
return value
})
} else if (prop in dynamicOptions) {
var dyn = dynamicOptions[prop]
STATE[param] = createDynamicDecl(dyn, function (env, scope) {
return parseDynamic(env, scope, env.invoke(scope, dyn))
})
}
}
switch (prop) {
case S_CULL_ENABLE:
case S_BLEND_ENABLE:
case S_DITHER:
case S_STENCIL_ENABLE:
case S_DEPTH_ENABLE:
case S_SCISSOR_ENABLE:
case S_POLYGON_OFFSET_ENABLE:
case S_SAMPLE_ALPHA:
case S_SAMPLE_ENABLE:
case S_DEPTH_MASK:
return parseParam(
function (value) {
check$1.commandType(value, 'boolean', prop, env.commandStr)
return value
},
function (env, scope, value) {
check$1.optional(function () {
env.assert(scope,
'typeof ' + value + '==="boolean"',
'invalid flag ' + prop, env.commandStr)
})
return value
})
case S_DEPTH_FUNC:
return parseParam(
function (value) {
check$1.commandParameter(value, compareFuncs, 'invalid ' + prop, env.commandStr)
return compareFuncs[value]
},
function (env, scope, value) {
var COMPARE_FUNCS = env.constants.compareFuncs
check$1.optional(function () {
env.assert(scope,
value + ' in ' + COMPARE_FUNCS,
'invalid ' + prop + ', must be one of ' + Object.keys(compareFuncs))
})
return scope.def(COMPARE_FUNCS, '[', value, ']')
})
case S_DEPTH_RANGE:
return parseParam(
function (value) {
check$1.command(
isArrayLike(value) &&
value.length === 2 &&
typeof value[0] === 'number' &&
typeof value[1] === 'number' &&
value[0] <= value[1],
'depth range is 2d array',
env.commandStr)
return value
},
function (env, scope, value) {
check$1.optional(function () {
env.assert(scope,
env.shared.isArrayLike + '(' + value + ')&&' +
value + '.length===2&&' +
'typeof ' + value + '[0]==="number"&&' +
'typeof ' + value + '[1]==="number"&&' +
value + '[0]<=' + value + '[1]',
'depth range must be a 2d array')
})
var Z_NEAR = scope.def('+', value, '[0]')
var Z_FAR = scope.def('+', value, '[1]')
return [Z_NEAR, Z_FAR]
})
case S_BLEND_FUNC:
return parseParam(
function (value) {
check$1.commandType(value, 'object', 'blend.func', env.commandStr)
var srcRGB = ('srcRGB' in value ? value.srcRGB : value.src)
var srcAlpha = ('srcAlpha' in value ? value.srcAlpha : value.src)
var dstRGB = ('dstRGB' in value ? value.dstRGB : value.dst)
var dstAlpha = ('dstAlpha' in value ? value.dstAlpha : value.dst)
check$1.commandParameter(srcRGB, blendFuncs, param + '.srcRGB', env.commandStr)
check$1.commandParameter(srcAlpha, blendFuncs, param + '.srcAlpha', env.commandStr)
check$1.commandParameter(dstRGB, blendFuncs, param + '.dstRGB', env.commandStr)
check$1.commandParameter(dstAlpha, blendFuncs, param + '.dstAlpha', env.commandStr)
check$1.command(
(invalidBlendCombinations.indexOf(srcRGB + ', ' + dstRGB) === -1),
'unallowed blending combination (srcRGB, dstRGB) = (' + srcRGB + ', ' + dstRGB + ')', env.commandStr)
return [
blendFuncs[srcRGB],
blendFuncs[dstRGB],
blendFuncs[srcAlpha],
blendFuncs[dstAlpha]
]
},
function (env, scope, value) {
var BLEND_FUNCS = env.constants.blendFuncs
check$1.optional(function () {
env.assert(scope,
value + '&&typeof ' + value + '==="object"',
'invalid blend func, must be an object')
})
function read (prefix, suffix) {
var func = scope.def(
'"', prefix, suffix, '" in ', value,
'?', value, '.', prefix, suffix,
':', value, '.', prefix)
check$1.optional(function () {
env.assert(scope,
func + ' in ' + BLEND_FUNCS,
'invalid ' + prop + '.' + prefix + suffix + ', must be one of ' + Object.keys(blendFuncs))
})
return func
}
var srcRGB = read('src', 'RGB')
var dstRGB = read('dst', 'RGB')
check$1.optional(function () {
var INVALID_BLEND_COMBINATIONS = env.constants.invalidBlendCombinations
env.assert(scope,
INVALID_BLEND_COMBINATIONS +
'.indexOf(' + srcRGB + '+", "+' + dstRGB + ') === -1 ',
'unallowed blending combination for (srcRGB, dstRGB)'
)
})
var SRC_RGB = scope.def(BLEND_FUNCS, '[', srcRGB, ']')
var SRC_ALPHA = scope.def(BLEND_FUNCS, '[', read('src', 'Alpha'), ']')
var DST_RGB = scope.def(BLEND_FUNCS, '[', dstRGB, ']')
var DST_ALPHA = scope.def(BLEND_FUNCS, '[', read('dst', 'Alpha'), ']')
return [SRC_RGB, DST_RGB, SRC_ALPHA, DST_ALPHA]
})
case S_BLEND_EQUATION:
return parseParam(
function (value) {
if (typeof value === 'string') {
check$1.commandParameter(value, blendEquations, 'invalid ' + prop, env.commandStr)
return [
blendEquations[value],
blendEquations[value]
]
} else if (typeof value === 'object') {
check$1.commandParameter(
value.rgb, blendEquations, prop + '.rgb', env.commandStr)
check$1.commandParameter(
value.alpha, blendEquations, prop + '.alpha', env.commandStr)
return [
blendEquations[value.rgb],
blendEquations[value.alpha]
]
} else {
check$1.commandRaise('invalid blend.equation', env.commandStr)
}
},
function (env, scope, value) {
var BLEND_EQUATIONS = env.constants.blendEquations
var RGB = scope.def()
var ALPHA = scope.def()
var ifte = env.cond('typeof ', value, '==="string"')
check$1.optional(function () {
function checkProp (block, name, value) {
env.assert(block,
value + ' in ' + BLEND_EQUATIONS,
'invalid ' + name + ', must be one of ' + Object.keys(blendEquations))
}
checkProp(ifte.then, prop, value)
env.assert(ifte.else,
value + '&&typeof ' + value + '==="object"',
'invalid ' + prop)
checkProp(ifte.else, prop + '.rgb', value + '.rgb')
checkProp(ifte.else, prop + '.alpha', value + '.alpha')
})
ifte.then(
RGB, '=', ALPHA, '=', BLEND_EQUATIONS, '[', value, '];')
ifte.else(
RGB, '=', BLEND_EQUATIONS, '[', value, '.rgb];',
ALPHA, '=', BLEND_EQUATIONS, '[', value, '.alpha];')
scope(ifte)
return [RGB, ALPHA]
})
case S_BLEND_COLOR:
return parseParam(
function (value) {
check$1.command(
isArrayLike(value) &&
value.length === 4,
'blend.color must be a 4d array', env.commandStr)
return loop(4, function (i) {
return +value[i]
})
},
function (env, scope, value) {
check$1.optional(function () {
env.assert(scope,
env.shared.isArrayLike + '(' + value + ')&&' +
value + '.length===4',
'blend.color must be a 4d array')
})
return loop(4, function (i) {
return scope.def('+', value, '[', i, ']')
})
})
case S_STENCIL_MASK:
return parseParam(
function (value) {
check$1.commandType(value, 'number', param, env.commandStr)
return value | 0
},
function (env, scope, value) {
check$1.optional(function () {
env.assert(scope,
'typeof ' + value + '==="number"',
'invalid stencil.mask')
})
return scope.def(value, '|0')
})
case S_STENCIL_FUNC:
return parseParam(
function (value) {
check$1.commandType(value, 'object', param, env.commandStr)
var cmp = value.cmp || 'keep'
var ref = value.ref || 0
var mask = 'mask' in value ? value.mask : -1
check$1.commandParameter(cmp, compareFuncs, prop + '.cmp', env.commandStr)
check$1.commandType(ref, 'number', prop + '.ref', env.commandStr)
check$1.commandType(mask, 'number', prop + '.mask', env.commandStr)
return [
compareFuncs[cmp],
ref,
mask
]
},
function (env, scope, value) {
var COMPARE_FUNCS = env.constants.compareFuncs
check$1.optional(function () {
function assert () {
env.assert(scope,
Array.prototype.join.call(arguments, ''),
'invalid stencil.func')
}
assert(value + '&&typeof ', value, '==="object"')
assert('!("cmp" in ', value, ')||(',
value, '.cmp in ', COMPARE_FUNCS, ')')
})
var cmp = scope.def(
'"cmp" in ', value,
'?', COMPARE_FUNCS, '[', value, '.cmp]',
':', GL_KEEP)
var ref = scope.def(value, '.ref|0')
var mask = scope.def(
'"mask" in ', value,
'?', value, '.mask|0:-1')
return [cmp, ref, mask]
})
case S_STENCIL_OPFRONT:
case S_STENCIL_OPBACK:
return parseParam(
function (value) {
check$1.commandType(value, 'object', param, env.commandStr)
var fail = value.fail || 'keep'
var zfail = value.zfail || 'keep'
var zpass = value.zpass || 'keep'
check$1.commandParameter(fail, stencilOps, prop + '.fail', env.commandStr)
check$1.commandParameter(zfail, stencilOps, prop + '.zfail', env.commandStr)
check$1.commandParameter(zpass, stencilOps, prop + '.zpass', env.commandStr)
return [
prop === S_STENCIL_OPBACK ? GL_BACK : GL_FRONT,
stencilOps[fail],
stencilOps[zfail],
stencilOps[zpass]
]
},
function (env, scope, value) {
var STENCIL_OPS = env.constants.stencilOps
check$1.optional(function () {
env.assert(scope,
value + '&&typeof ' + value + '==="object"',
'invalid ' + prop)
})
function read (name) {
check$1.optional(function () {
env.assert(scope,
'!("' + name + '" in ' + value + ')||' +
'(' + value + '.' + name + ' in ' + STENCIL_OPS + ')',
'invalid ' + prop + '.' + name + ', must be one of ' + Object.keys(stencilOps))
})
return scope.def(
'"', name, '" in ', value,
'?', STENCIL_OPS, '[', value, '.', name, ']:',
GL_KEEP)
}
return [
prop === S_STENCIL_OPBACK ? GL_BACK : GL_FRONT,
read('fail'),
read('zfail'),
read('zpass')
]
})
case S_POLYGON_OFFSET_OFFSET:
return parseParam(
function (value) {
check$1.commandType(value, 'object', param, env.commandStr)
var factor = value.factor | 0
var units = value.units | 0
check$1.commandType(factor, 'number', param + '.factor', env.commandStr)
check$1.commandType(units, 'number', param + '.units', env.commandStr)
return [factor, units]
},
function (env, scope, value) {
check$1.optional(function () {
env.assert(scope,
value + '&&typeof ' + value + '==="object"',
'invalid ' + prop)
})
var FACTOR = scope.def(value, '.factor|0')
var UNITS = scope.def(value, '.units|0')
return [FACTOR, UNITS]
})
case S_CULL_FACE:
return parseParam(
function (value) {
var face = 0
if (value === 'front') {
face = GL_FRONT
} else if (value === 'back') {
face = GL_BACK
}
check$1.command(!!face, param, env.commandStr)
return face
},
function (env, scope, value) {
check$1.optional(function () {
env.assert(scope,
value + '==="front"||' +
value + '==="back"',
'invalid cull.face')
})
return scope.def(value, '==="front"?', GL_FRONT, ':', GL_BACK)
})
case S_LINE_WIDTH:
return parseParam(
function (value) {
check$1.command(
typeof value === 'number' &&
value >= limits.lineWidthDims[0] &&
value <= limits.lineWidthDims[1],
'invalid line width, must be a positive number between ' +
limits.lineWidthDims[0] + ' and ' + limits.lineWidthDims[1], env.commandStr)
return value
},
function (env, scope, value) {
check$1.optional(function () {
env.assert(scope,
'typeof ' + value + '==="number"&&' +
value + '>=' + limits.lineWidthDims[0] + '&&' +
value + '<=' + limits.lineWidthDims[1],
'invalid line width')
})
return value
})
case S_FRONT_FACE:
return parseParam(
function (value) {
check$1.commandParameter(value, orientationType, param, env.commandStr)
return orientationType[value]
},
function (env, scope, value) {
check$1.optional(function () {
env.assert(scope,
value + '==="cw"||' +
value + '==="ccw"',
'invalid frontFace, must be one of cw,ccw')
})
return scope.def(value + '==="cw"?' + GL_CW + ':' + GL_CCW)
})
case S_COLOR_MASK:
return parseParam(
function (value) {
check$1.command(
isArrayLike(value) && value.length === 4,
'color.mask must be length 4 array', env.commandStr)
return value.map(function (v) { return !!v })
},
function (env, scope, value) {
check$1.optional(function () {
env.assert(scope,
env.shared.isArrayLike + '(' + value + ')&&' +
value + '.length===4',
'invalid color.mask')
})
return loop(4, function (i) {
return '!!' + value + '[' + i + ']'
})
})
case S_SAMPLE_COVERAGE:
return parseParam(
function (value) {
check$1.command(typeof value === 'object' && value, param, env.commandStr)
var sampleValue = 'value' in value ? value.value : 1
var sampleInvert = !!value.invert
check$1.command(
typeof sampleValue === 'number' &&
sampleValue >= 0 && sampleValue <= 1,
'sample.coverage.value must be a number between 0 and 1', env.commandStr)
return [sampleValue, sampleInvert]
},
function (env, scope, value) {
check$1.optional(function () {
env.assert(scope,
value + '&&typeof ' + value + '==="object"',
'invalid sample.coverage')
})
var VALUE = scope.def(
'"value" in ', value, '?+', value, '.value:1')
var INVERT = scope.def('!!', value, '.invert')
return [VALUE, INVERT]
})
}
})
return STATE
}
function parseUniforms (uniforms, env) {
var staticUniforms = uniforms.static
var dynamicUniforms = uniforms.dynamic
var UNIFORMS = {}
Object.keys(staticUniforms).forEach(function (name) {
var value = staticUniforms[name]
var result
if (typeof value === 'number' ||
typeof value === 'boolean') {
result = createStaticDecl(function () {
return value
})
} else if (typeof value === 'function') {
var reglType = value._reglType
if (reglType === 'texture2d' ||
reglType === 'textureCube') {
result = createStaticDecl(function (env) {
return env.link(value)
})
} else if (reglType === 'framebuffer' ||
reglType === 'framebufferCube') {
check$1.command(value.color.length > 0,
'missing color attachment for framebuffer sent to uniform "' + name + '"', env.commandStr)
result = createStaticDecl(function (env) {
return env.link(value.color[0])
})
} else {
check$1.commandRaise('invalid data for uniform "' + name + '"', env.commandStr)
}
} else if (isArrayLike(value)) {
result = createStaticDecl(function (env) {
var ITEM = env.global.def('[',
loop(value.length, function (i) {
check$1.command(
typeof value[i] === 'number' ||
typeof value[i] === 'boolean',
'invalid uniform ' + name, env.commandStr)
return value[i]
}), ']')
return ITEM
})
} else {
check$1.commandRaise('invalid or missing data for uniform "' + name + '"', env.commandStr)
}
result.value = value
UNIFORMS[name] = result
})
Object.keys(dynamicUniforms).forEach(function (key) {
var dyn = dynamicUniforms[key]
UNIFORMS[key] = createDynamicDecl(dyn, function (env, scope) {
return env.invoke(scope, dyn)
})
})
return UNIFORMS
}
function parseAttributes (attributes, env) {
var staticAttributes = attributes.static
var dynamicAttributes = attributes.dynamic
var attributeDefs = {}
Object.keys(staticAttributes).forEach(function (attribute) {
var value = staticAttributes[attribute]
var id = stringStore.id(attribute)
var record = new AttributeRecord()
if (isBufferArgs(value)) {
record.state = ATTRIB_STATE_POINTER
record.buffer = bufferState.getBuffer(
bufferState.create(value, GL_ARRAY_BUFFER$2, false, true))
record.type = 0
} else {
var buffer = bufferState.getBuffer(value)
if (buffer) {
record.state = ATTRIB_STATE_POINTER
record.buffer = buffer
record.type = 0
} else {
check$1.command(typeof value === 'object' && value,
'invalid data for attribute ' + attribute, env.commandStr)
if ('constant' in value) {
var constant = value.constant
record.buffer = 'null'
record.state = ATTRIB_STATE_CONSTANT
if (typeof constant === 'number') {
record.x = constant
} else {
check$1.command(
isArrayLike(constant) &&
constant.length > 0 &&
constant.length <= 4,
'invalid constant for attribute ' + attribute, env.commandStr)
CUTE_COMPONENTS.forEach(function (c, i) {
if (i < constant.length) {
record[c] = constant[i]
}
})
}
} else {
if (isBufferArgs(value.buffer)) {
buffer = bufferState.getBuffer(
bufferState.create(value.buffer, GL_ARRAY_BUFFER$2, false, true))
} else {
buffer = bufferState.getBuffer(value.buffer)
}
check$1.command(!!buffer, 'missing buffer for attribute "' + attribute + '"', env.commandStr)
var offset = value.offset | 0
check$1.command(offset >= 0,
'invalid offset for attribute "' + attribute + '"', env.commandStr)
var stride = value.stride | 0
check$1.command(stride >= 0 && stride < 256,
'invalid stride for attribute "' + attribute + '", must be integer betweeen [0, 255]', env.commandStr)
var size = value.size | 0
check$1.command(!('size' in value) || (size > 0 && size <= 4),
'invalid size for attribute "' + attribute + '", must be 1,2,3,4', env.commandStr)
var normalized = !!value.normalized
var type = 0
if ('type' in value) {
check$1.commandParameter(
value.type, glTypes,
'invalid type for attribute ' + attribute, env.commandStr)
type = glTypes[value.type]
}
var divisor = value.divisor | 0
if ('divisor' in value) {
check$1.command(divisor === 0 || extInstancing,
'cannot specify divisor for attribute "' + attribute + '", instancing not supported', env.commandStr)
check$1.command(divisor >= 0,
'invalid divisor for attribute "' + attribute + '"', env.commandStr)
}
check$1.optional(function () {
var command = env.commandStr
var VALID_KEYS = [
'buffer',
'offset',
'divisor',
'normalized',
'type',
'size',
'stride'
]
Object.keys(value).forEach(function (prop) {
check$1.command(
VALID_KEYS.indexOf(prop) >= 0,
'unknown parameter "' + prop + '" for attribute pointer "' + attribute + '" (valid parameters are ' + VALID_KEYS + ')',
command)
})
})
record.buffer = buffer
record.state = ATTRIB_STATE_POINTER
record.size = size
record.normalized = normalized
record.type = type || buffer.dtype
record.offset = offset
record.stride = stride
record.divisor = divisor
}
}
}
attributeDefs[attribute] = createStaticDecl(function (env, scope) {
var cache = env.attribCache
if (id in cache) {
return cache[id]
}
var result = {
isStream: false
}
Object.keys(record).forEach(function (key) {
result[key] = record[key]
})
if (record.buffer) {
result.buffer = env.link(record.buffer)
result.type = result.type || (result.buffer + '.dtype')
}
cache[id] = result
return result
})
})
Object.keys(dynamicAttributes).forEach(function (attribute) {
var dyn = dynamicAttributes[attribute]
function appendAttributeCode (env, block) {
var VALUE = env.invoke(block, dyn)
var shared = env.shared
var constants = env.constants
var IS_BUFFER_ARGS = shared.isBufferArgs
var BUFFER_STATE = shared.buffer
// Perform validation on attribute
check$1.optional(function () {
env.assert(block,
VALUE + '&&(typeof ' + VALUE + '==="object"||typeof ' +
VALUE + '==="function")&&(' +
IS_BUFFER_ARGS + '(' + VALUE + ')||' +
BUFFER_STATE + '.getBuffer(' + VALUE + ')||' +
BUFFER_STATE + '.getBuffer(' + VALUE + '.buffer)||' +
IS_BUFFER_ARGS + '(' + VALUE + '.buffer)||' +
'("constant" in ' + VALUE +
'&&(typeof ' + VALUE + '.constant==="number"||' +
shared.isArrayLike + '(' + VALUE + '.constant))))',
'invalid dynamic attribute "' + attribute + '"')
})
// allocate names for result
var result = {
isStream: block.def(false)
}
var defaultRecord = new AttributeRecord()
defaultRecord.state = ATTRIB_STATE_POINTER
Object.keys(defaultRecord).forEach(function (key) {
result[key] = block.def('' + defaultRecord[key])
})
var BUFFER = result.buffer
var TYPE = result.type
block(
'if(', IS_BUFFER_ARGS, '(', VALUE, ')){',
result.isStream, '=true;',
BUFFER, '=', BUFFER_STATE, '.createStream(', GL_ARRAY_BUFFER$2, ',', VALUE, ');',
TYPE, '=', BUFFER, '.dtype;',
'}else{',
BUFFER, '=', BUFFER_STATE, '.getBuffer(', VALUE, ');',
'if(', BUFFER, '){',
TYPE, '=', BUFFER, '.dtype;',
'}else if("constant" in ', VALUE, '){',
result.state, '=', ATTRIB_STATE_CONSTANT, ';',
'if(typeof ' + VALUE + '.constant === "number"){',
result[CUTE_COMPONENTS[0]], '=', VALUE, '.constant;',
CUTE_COMPONENTS.slice(1).map(function (n) {
return result[n]
}).join('='), '=0;',
'}else{',
CUTE_COMPONENTS.map(function (name, i) {
return (
result[name] + '=' + VALUE + '.constant.length>' + i +
'?' + VALUE + '.constant[' + i + ']:0;'
)
}).join(''),
'}}else{',
'if(', IS_BUFFER_ARGS, '(', VALUE, '.buffer)){',
BUFFER, '=', BUFFER_STATE, '.createStream(', GL_ARRAY_BUFFER$2, ',', VALUE, '.buffer);',
'}else{',
BUFFER, '=', BUFFER_STATE, '.getBuffer(', VALUE, '.buffer);',
'}',
TYPE, '="type" in ', VALUE, '?',
constants.glTypes, '[', VALUE, '.type]:', BUFFER, '.dtype;',
result.normalized, '=!!', VALUE, '.normalized;')
function emitReadRecord (name) {
block(result[name], '=', VALUE, '.', name, '|0;')
}
emitReadRecord('size')
emitReadRecord('offset')
emitReadRecord('stride')
emitReadRecord('divisor')
block('}}')
block.exit(
'if(', result.isStream, '){',
BUFFER_STATE, '.destroyStream(', BUFFER, ');',
'}')
return result
}
attributeDefs[attribute] = createDynamicDecl(dyn, appendAttributeCode)
})
return attributeDefs
}
function parseVAO (options, env) {
var staticOptions = options.static
var dynamicOptions = options.dynamic
if (S_VAO in staticOptions) {
var vao = staticOptions[S_VAO]
if (vao !== null && attributeState.getVAO(vao) === null) {
vao = attributeState.createVAO(vao)
}
return createStaticDecl(function (env) {
return env.link(attributeState.getVAO(vao))
})
} else if (S_VAO in dynamicOptions) {
var dyn = dynamicOptions[S_VAO]
return createDynamicDecl(dyn, function (env, scope) {
var vaoRef = env.invoke(scope, dyn)
return scope.def(env.shared.vao + '.getVAO(' + vaoRef + ')')
})
}
return null
}
function parseContext (context) {
var staticContext = context.static
var dynamicContext = context.dynamic
var result = {}
Object.keys(staticContext).forEach(function (name) {
var value = staticContext[name]
result[name] = createStaticDecl(function (env, scope) {
if (typeof value === 'number' || typeof value === 'boolean') {
return '' + value
} else {
return env.link(value)
}
})
})
Object.keys(dynamicContext).forEach(function (name) {
var dyn = dynamicContext[name]
result[name] = createDynamicDecl(dyn, function (env, scope) {
return env.invoke(scope, dyn)
})
})
return result
}
function parseArguments (options, attributes, uniforms, context, env) {
var staticOptions = options.static
var dynamicOptions = options.dynamic
check$1.optional(function () {
var KEY_NAMES = [
S_FRAMEBUFFER,
S_VERT,
S_FRAG,
S_ELEMENTS,
S_PRIMITIVE,
S_OFFSET,
S_COUNT,
S_INSTANCES,
S_PROFILE,
S_VAO
].concat(GL_STATE_NAMES)
function checkKeys (dict) {
Object.keys(dict).forEach(function (key) {
check$1.command(
KEY_NAMES.indexOf(key) >= 0,
'unknown parameter "' + key + '"',
env.commandStr)
})
}
checkKeys(staticOptions)
checkKeys(dynamicOptions)
})
var attribLocations = parseAttribLocations(options, attributes)
var framebuffer = parseFramebuffer(options, env)
var viewportAndScissor = parseViewportScissor(options, framebuffer, env)
var draw = parseDraw(options, env)
var state = parseGLState(options, env)
var shader = parseProgram(options, env, attribLocations)
function copyBox (name) {
var defn = viewportAndScissor[name]
if (defn) {
state[name] = defn
}
}
copyBox(S_VIEWPORT)
copyBox(propName(S_SCISSOR_BOX))
var dirty = Object.keys(state).length > 0
var result = {
framebuffer: framebuffer,
draw: draw,
shader: shader,
state: state,
dirty: dirty,
scopeVAO: null,
drawVAO: null,
useVAO: false,
attributes: {}
}
result.profile = parseProfile(options, env)
result.uniforms = parseUniforms(uniforms, env)
result.drawVAO = result.scopeVAO = parseVAO(options, env)
// special case: check if we can statically allocate a vertex array object for this program
if (!result.drawVAO && shader.program && !attribLocations && extensions.angle_instanced_arrays) {
var useVAO = true
var staticBindings = shader.program.attributes.map(function (attr) {
var binding = attributes.static[attr]
useVAO = useVAO && !!binding
return binding
})
if (useVAO && staticBindings.length > 0) {
var vao = attributeState.getVAO(attributeState.createVAO(staticBindings))
result.drawVAO = new Declaration(null, null, null, function (env, scope) {
return env.link(vao)
})
result.useVAO = true
}
}
if (attribLocations) {
result.useVAO = true
} else {
result.attributes = parseAttributes(attributes, env)
}
result.context = parseContext(context, env)
return result
}
// ===================================================
// ===================================================
// COMMON UPDATE FUNCTIONS
// ===================================================
// ===================================================
function emitContext (env, scope, context) {
var shared = env.shared
var CONTEXT = shared.context
var contextEnter = env.scope()
Object.keys(context).forEach(function (name) {
scope.save(CONTEXT, '.' + name)
var defn = context[name]
var value = defn.append(env, scope)
if (Array.isArray(value)) {
contextEnter(CONTEXT, '.', name, '=[', value.join(), '];')
} else {
contextEnter(CONTEXT, '.', name, '=', value, ';')
}
})
scope(contextEnter)
}
// ===================================================
// ===================================================
// COMMON DRAWING FUNCTIONS
// ===================================================
// ===================================================
function emitPollFramebuffer (env, scope, framebuffer, skipCheck) {
var shared = env.shared
var GL = shared.gl
var FRAMEBUFFER_STATE = shared.framebuffer
var EXT_DRAW_BUFFERS
if (extDrawBuffers) {
EXT_DRAW_BUFFERS = scope.def(shared.extensions, '.webgl_draw_buffers')
}
var constants = env.constants
var DRAW_BUFFERS = constants.drawBuffer
var BACK_BUFFER = constants.backBuffer
var NEXT
if (framebuffer) {
NEXT = framebuffer.append(env, scope)
} else {
NEXT = scope.def(FRAMEBUFFER_STATE, '.next')
}
if (!skipCheck) {
scope('if(', NEXT, '!==', FRAMEBUFFER_STATE, '.cur){')
}
scope(
'if(', NEXT, '){',
GL, '.bindFramebuffer(', GL_FRAMEBUFFER$2, ',', NEXT, '.framebuffer);')
if (extDrawBuffers) {
scope(EXT_DRAW_BUFFERS, '.drawBuffersWEBGL(',
DRAW_BUFFERS, '[', NEXT, '.colorAttachments.length]);')
}
scope('}else{',
GL, '.bindFramebuffer(', GL_FRAMEBUFFER$2, ',null);')
if (extDrawBuffers) {
scope(EXT_DRAW_BUFFERS, '.drawBuffersWEBGL(', BACK_BUFFER, ');')
}
scope(
'}',
FRAMEBUFFER_STATE, '.cur=', NEXT, ';')
if (!skipCheck) {
scope('}')
}
}
function emitPollState (env, scope, args) {
var shared = env.shared
var GL = shared.gl
var CURRENT_VARS = env.current
var NEXT_VARS = env.next
var CURRENT_STATE = shared.current
var NEXT_STATE = shared.next
var block = env.cond(CURRENT_STATE, '.dirty')
GL_STATE_NAMES.forEach(function (prop) {
var param = propName(prop)
if (param in args.state) {
return
}
var NEXT, CURRENT
if (param in NEXT_VARS) {
NEXT = NEXT_VARS[param]
CURRENT = CURRENT_VARS[param]
var parts = loop(currentState[param].length, function (i) {
return block.def(NEXT, '[', i, ']')
})
block(env.cond(parts.map(function (p, i) {
return p + '!==' + CURRENT + '[' + i + ']'
}).join('||'))
.then(
GL, '.', GL_VARIABLES[param], '(', parts, ');',
parts.map(function (p, i) {
return CURRENT + '[' + i + ']=' + p
}).join(';'), ';'))
} else {
NEXT = block.def(NEXT_STATE, '.', param)
var ifte = env.cond(NEXT, '!==', CURRENT_STATE, '.', param)
block(ifte)
if (param in GL_FLAGS) {
ifte(
env.cond(NEXT)
.then(GL, '.enable(', GL_FLAGS[param], ');')
.else(GL, '.disable(', GL_FLAGS[param], ');'),
CURRENT_STATE, '.', param, '=', NEXT, ';')
} else {
ifte(
GL, '.', GL_VARIABLES[param], '(', NEXT, ');',
CURRENT_STATE, '.', param, '=', NEXT, ';')
}
}
})
if (Object.keys(args.state).length === 0) {
block(CURRENT_STATE, '.dirty=false;')
}
scope(block)
}
function emitSetOptions (env, scope, options, filter) {
var shared = env.shared
var CURRENT_VARS = env.current
var CURRENT_STATE = shared.current
var GL = shared.gl
sortState(Object.keys(options)).forEach(function (param) {
var defn = options[param]
if (filter && !filter(defn)) {
return
}
var variable = defn.append(env, scope)
if (GL_FLAGS[param]) {
var flag = GL_FLAGS[param]
if (isStatic(defn)) {
if (variable) {
scope(GL, '.enable(', flag, ');')
} else {
scope(GL, '.disable(', flag, ');')
}
} else {
scope(env.cond(variable)
.then(GL, '.enable(', flag, ');')
.else(GL, '.disable(', flag, ');'))
}
scope(CURRENT_STATE, '.', param, '=', variable, ';')
} else if (isArrayLike(variable)) {
var CURRENT = CURRENT_VARS[param]
scope(
GL, '.', GL_VARIABLES[param], '(', variable, ');',
variable.map(function (v, i) {
return CURRENT + '[' + i + ']=' + v
}).join(';'), ';')
} else {
scope(
GL, '.', GL_VARIABLES[param], '(', variable, ');',
CURRENT_STATE, '.', param, '=', variable, ';')
}
})
}
function injectExtensions (env, scope) {
if (extInstancing) {
env.instancing = scope.def(
env.shared.extensions, '.angle_instanced_arrays')
}
}
function emitProfile (env, scope, args, useScope, incrementCounter) {
var shared = env.shared
var STATS = env.stats
var CURRENT_STATE = shared.current
var TIMER = shared.timer
var profileArg = args.profile
function perfCounter () {
if (typeof performance === 'undefined') {
return 'Date.now()'
} else {
return 'performance.now()'
}
}
var CPU_START, QUERY_COUNTER
function emitProfileStart (block) {
CPU_START = scope.def()
block(CPU_START, '=', perfCounter(), ';')
if (typeof incrementCounter === 'string') {
block(STATS, '.count+=', incrementCounter, ';')
} else {
block(STATS, '.count++;')
}
if (timer) {
if (useScope) {
QUERY_COUNTER = scope.def()
block(QUERY_COUNTER, '=', TIMER, '.getNumPendingQueries();')
} else {
block(TIMER, '.beginQuery(', STATS, ');')
}
}
}
function emitProfileEnd (block) {
block(STATS, '.cpuTime+=', perfCounter(), '-', CPU_START, ';')
if (timer) {
if (useScope) {
block(TIMER, '.pushScopeStats(',
QUERY_COUNTER, ',',
TIMER, '.getNumPendingQueries(),',
STATS, ');')
} else {
block(TIMER, '.endQuery();')
}
}
}
function scopeProfile (value) {
var prev = scope.def(CURRENT_STATE, '.profile')
scope(CURRENT_STATE, '.profile=', value, ';')
scope.exit(CURRENT_STATE, '.profile=', prev, ';')
}
var USE_PROFILE
if (profileArg) {
if (isStatic(profileArg)) {
if (profileArg.enable) {
emitProfileStart(scope)
emitProfileEnd(scope.exit)
scopeProfile('true')
} else {
scopeProfile('false')
}
return
}
USE_PROFILE = profileArg.append(env, scope)
scopeProfile(USE_PROFILE)
} else {
USE_PROFILE = scope.def(CURRENT_STATE, '.profile')
}
var start = env.block()
emitProfileStart(start)
scope('if(', USE_PROFILE, '){', start, '}')
var end = env.block()
emitProfileEnd(end)
scope.exit('if(', USE_PROFILE, '){', end, '}')
}
function emitAttributes (env, scope, args, attributes, filter) {
var shared = env.shared
function typeLength (x) {
switch (x) {
case GL_FLOAT_VEC2:
case GL_INT_VEC2:
case GL_BOOL_VEC2:
return 2
case GL_FLOAT_VEC3:
case GL_INT_VEC3:
case GL_BOOL_VEC3:
return 3
case GL_FLOAT_VEC4:
case GL_INT_VEC4:
case GL_BOOL_VEC4:
return 4
default:
return 1
}
}
function emitBindAttribute (ATTRIBUTE, size, record) {
var GL = shared.gl
var LOCATION = scope.def(ATTRIBUTE, '.location')
var BINDING = scope.def(shared.attributes, '[', LOCATION, ']')
var STATE = record.state
var BUFFER = record.buffer
var CONST_COMPONENTS = [
record.x,
record.y,
record.z,
record.w
]
var COMMON_KEYS = [
'buffer',
'normalized',
'offset',
'stride'
]
function emitBuffer () {
scope(
'if(!', BINDING, '.buffer){',
GL, '.enableVertexAttribArray(', LOCATION, ');}')
var TYPE = record.type
var SIZE
if (!record.size) {
SIZE = size
} else {
SIZE = scope.def(record.size, '||', size)
}
scope('if(',
BINDING, '.type!==', TYPE, '||',
BINDING, '.size!==', SIZE, '||',
COMMON_KEYS.map(function (key) {
return BINDING + '.' + key + '!==' + record[key]
}).join('||'),
'){',
GL, '.bindBuffer(', GL_ARRAY_BUFFER$2, ',', BUFFER, '.buffer);',
GL, '.vertexAttribPointer(', [
LOCATION,
SIZE,
TYPE,
record.normalized,
record.stride,
record.offset
], ');',
BINDING, '.type=', TYPE, ';',
BINDING, '.size=', SIZE, ';',
COMMON_KEYS.map(function (key) {
return BINDING + '.' + key + '=' + record[key] + ';'
}).join(''),
'}')
if (extInstancing) {
var DIVISOR = record.divisor
scope(
'if(', BINDING, '.divisor!==', DIVISOR, '){',
env.instancing, '.vertexAttribDivisorANGLE(', [LOCATION, DIVISOR], ');',
BINDING, '.divisor=', DIVISOR, ';}')
}
}
function emitConstant () {
scope(
'if(', BINDING, '.buffer){',
GL, '.disableVertexAttribArray(', LOCATION, ');',
BINDING, '.buffer=null;',
'}if(', CUTE_COMPONENTS.map(function (c, i) {
return BINDING + '.' + c + '!==' + CONST_COMPONENTS[i]
}).join('||'), '){',
GL, '.vertexAttrib4f(', LOCATION, ',', CONST_COMPONENTS, ');',
CUTE_COMPONENTS.map(function (c, i) {
return BINDING + '.' + c + '=' + CONST_COMPONENTS[i] + ';'
}).join(''),
'}')
}
if (STATE === ATTRIB_STATE_POINTER) {
emitBuffer()
} else if (STATE === ATTRIB_STATE_CONSTANT) {
emitConstant()
} else {
scope('if(', STATE, '===', ATTRIB_STATE_POINTER, '){')
emitBuffer()
scope('}else{')
emitConstant()
scope('}')
}
}
attributes.forEach(function (attribute) {
var name = attribute.name
var arg = args.attributes[name]
var record
if (arg) {
if (!filter(arg)) {
return
}
record = arg.append(env, scope)
} else {
if (!filter(SCOPE_DECL)) {
return
}
var scopeAttrib = env.scopeAttrib(name)
check$1.optional(function () {
env.assert(scope,
scopeAttrib + '.state',
'missing attribute ' + name)
})
record = {}
Object.keys(new AttributeRecord()).forEach(function (key) {
record[key] = scope.def(scopeAttrib, '.', key)
})
}
emitBindAttribute(
env.link(attribute), typeLength(attribute.info.type), record)
})
}
function emitUniforms (env, scope, args, uniforms, filter) {
var shared = env.shared
var GL = shared.gl
var infix
for (var i = 0; i < uniforms.length; ++i) {
var uniform = uniforms[i]
var name = uniform.name
var type = uniform.info.type
var arg = args.uniforms[name]
var UNIFORM = env.link(uniform)
var LOCATION = UNIFORM + '.location'
var VALUE
if (arg) {
if (!filter(arg)) {
continue
}
if (isStatic(arg)) {
var value = arg.value
check$1.command(
value !== null && typeof value !== 'undefined',
'missing uniform "' + name + '"', env.commandStr)
if (type === GL_SAMPLER_2D || type === GL_SAMPLER_CUBE) {
check$1.command(
typeof value === 'function' &&
((type === GL_SAMPLER_2D &&
(value._reglType === 'texture2d' ||
value._reglType === 'framebuffer')) ||
(type === GL_SAMPLER_CUBE &&
(value._reglType === 'textureCube' ||
value._reglType === 'framebufferCube'))),
'invalid texture for uniform ' + name, env.commandStr)
var TEX_VALUE = env.link(value._texture || value.color[0]._texture)
scope(GL, '.uniform1i(', LOCATION, ',', TEX_VALUE + '.bind());')
scope.exit(TEX_VALUE, '.unbind();')
} else if (
type === GL_FLOAT_MAT2 ||
type === GL_FLOAT_MAT3 ||
type === GL_FLOAT_MAT4) {
check$1.optional(function () {
check$1.command(isArrayLike(value),
'invalid matrix for uniform ' + name, env.commandStr)
check$1.command(
(type === GL_FLOAT_MAT2 && value.length === 4) ||
(type === GL_FLOAT_MAT3 && value.length === 9) ||
(type === GL_FLOAT_MAT4 && value.length === 16),
'invalid length for matrix uniform ' + name, env.commandStr)
})
var MAT_VALUE = env.global.def('new Float32Array([' +
Array.prototype.slice.call(value) + '])')
var dim = 2
if (type === GL_FLOAT_MAT3) {
dim = 3
} else if (type === GL_FLOAT_MAT4) {
dim = 4
}
scope(
GL, '.uniformMatrix', dim, 'fv(',
LOCATION, ',false,', MAT_VALUE, ');')
} else {
switch (type) {
case GL_FLOAT$8:
check$1.commandType(value, 'number', 'uniform ' + name, env.commandStr)
infix = '1f'
break
case GL_FLOAT_VEC2:
check$1.command(
isArrayLike(value) && value.length === 2,
'uniform ' + name, env.commandStr)
infix = '2f'
break
case GL_FLOAT_VEC3:
check$1.command(
isArrayLike(value) && value.length === 3,
'uniform ' + name, env.commandStr)
infix = '3f'
break
case GL_FLOAT_VEC4:
check$1.command(
isArrayLike(value) && value.length === 4,
'uniform ' + name, env.commandStr)
infix = '4f'
break
case GL_BOOL:
check$1.commandType(value, 'boolean', 'uniform ' + name, env.commandStr)
infix = '1i'
break
case GL_INT$3:
check$1.commandType(value, 'number', 'uniform ' + name, env.commandStr)
infix = '1i'
break
case GL_BOOL_VEC2:
check$1.command(
isArrayLike(value) && value.length === 2,
'uniform ' + name, env.commandStr)
infix = '2i'
break
case GL_INT_VEC2:
check$1.command(
isArrayLike(value) && value.length === 2,
'uniform ' + name, env.commandStr)
infix = '2i'
break
case GL_BOOL_VEC3:
check$1.command(
isArrayLike(value) && value.length === 3,
'uniform ' + name, env.commandStr)
infix = '3i'
break
case GL_INT_VEC3:
check$1.command(
isArrayLike(value) && value.length === 3,
'uniform ' + name, env.commandStr)
infix = '3i'
break
case GL_BOOL_VEC4:
check$1.command(
isArrayLike(value) && value.length === 4,
'uniform ' + name, env.commandStr)
infix = '4i'
break
case GL_INT_VEC4:
check$1.command(
isArrayLike(value) && value.length === 4,
'uniform ' + name, env.commandStr)
infix = '4i'
break
}
scope(GL, '.uniform', infix, '(', LOCATION, ',',
isArrayLike(value) ? Array.prototype.slice.call(value) : value,
');')
}
continue
} else {
VALUE = arg.append(env, scope)
}
} else {
if (!filter(SCOPE_DECL)) {
continue
}
VALUE = scope.def(shared.uniforms, '[', stringStore.id(name), ']')
}
if (type === GL_SAMPLER_2D) {
check$1(!Array.isArray(VALUE), 'must specify a scalar prop for textures')
scope(
'if(', VALUE, '&&', VALUE, '._reglType==="framebuffer"){',
VALUE, '=', VALUE, '.color[0];',
'}')
} else if (type === GL_SAMPLER_CUBE) {
check$1(!Array.isArray(VALUE), 'must specify a scalar prop for cube maps')
scope(
'if(', VALUE, '&&', VALUE, '._reglType==="framebufferCube"){',
VALUE, '=', VALUE, '.color[0];',
'}')
}
// perform type validation
check$1.optional(function () {
function emitCheck (pred, message) {
env.assert(scope, pred,
'bad data or missing for uniform "' + name + '". ' + message)
}
function checkType (type) {
check$1(!Array.isArray(VALUE), 'must not specify an array type for uniform')
emitCheck(
'typeof ' + VALUE + '==="' + type + '"',
'invalid type, expected ' + type)
}
function checkVector (n, type) {
if (Array.isArray(VALUE)) {
check$1(VALUE.length === n, 'must have length ' + n)
} else {
emitCheck(
shared.isArrayLike + '(' + VALUE + ')&&' + VALUE + '.length===' + n,
'invalid vector, should have length ' + n, env.commandStr)
}
}
function checkTexture (target) {
check$1(!Array.isArray(VALUE), 'must not specify a value type')
emitCheck(
'typeof ' + VALUE + '==="function"&&' +
VALUE + '._reglType==="texture' +
(target === GL_TEXTURE_2D$3 ? '2d' : 'Cube') + '"',
'invalid texture type', env.commandStr)
}
switch (type) {
case GL_INT$3:
checkType('number')
break
case GL_INT_VEC2:
checkVector(2, 'number')
break
case GL_INT_VEC3:
checkVector(3, 'number')
break
case GL_INT_VEC4:
checkVector(4, 'number')
break
case GL_FLOAT$8:
checkType('number')
break
case GL_FLOAT_VEC2:
checkVector(2, 'number')
break
case GL_FLOAT_VEC3:
checkVector(3, 'number')
break
case GL_FLOAT_VEC4:
checkVector(4, 'number')
break
case GL_BOOL:
checkType('boolean')
break
case GL_BOOL_VEC2:
checkVector(2, 'boolean')
break
case GL_BOOL_VEC3:
checkVector(3, 'boolean')
break
case GL_BOOL_VEC4:
checkVector(4, 'boolean')
break
case GL_FLOAT_MAT2:
checkVector(4, 'number')
break
case GL_FLOAT_MAT3:
checkVector(9, 'number')
break
case GL_FLOAT_MAT4:
checkVector(16, 'number')
break
case GL_SAMPLER_2D:
checkTexture(GL_TEXTURE_2D$3)
break
case GL_SAMPLER_CUBE:
checkTexture(GL_TEXTURE_CUBE_MAP$2)
break
}
})
var unroll = 1
switch (type) {
case GL_SAMPLER_2D:
case GL_SAMPLER_CUBE:
var TEX = scope.def(VALUE, '._texture')
scope(GL, '.uniform1i(', LOCATION, ',', TEX, '.bind());')
scope.exit(TEX, '.unbind();')
continue
case GL_INT$3:
case GL_BOOL:
infix = '1i'
break
case GL_INT_VEC2:
case GL_BOOL_VEC2:
infix = '2i'
unroll = 2
break
case GL_INT_VEC3:
case GL_BOOL_VEC3:
infix = '3i'
unroll = 3
break
case GL_INT_VEC4:
case GL_BOOL_VEC4:
infix = '4i'
unroll = 4
break
case GL_FLOAT$8:
infix = '1f'
break
case GL_FLOAT_VEC2:
infix = '2f'
unroll = 2
break
case GL_FLOAT_VEC3:
infix = '3f'
unroll = 3
break
case GL_FLOAT_VEC4:
infix = '4f'
unroll = 4
break
case GL_FLOAT_MAT2:
infix = 'Matrix2fv'
break
case GL_FLOAT_MAT3:
infix = 'Matrix3fv'
break
case GL_FLOAT_MAT4:
infix = 'Matrix4fv'
break
}
scope(GL, '.uniform', infix, '(', LOCATION, ',')
if (infix.charAt(0) === 'M') {
var matSize = Math.pow(type - GL_FLOAT_MAT2 + 2, 2)
var STORAGE = env.global.def('new Float32Array(', matSize, ')')
if (Array.isArray(VALUE)) {
scope(
'false,(',
loop(matSize, function (i) {
return STORAGE + '[' + i + ']=' + VALUE[i]
}), ',', STORAGE, ')')
} else {
scope(
'false,(Array.isArray(', VALUE, ')||', VALUE, ' instanceof Float32Array)?', VALUE, ':(',
loop(matSize, function (i) {
return STORAGE + '[' + i + ']=' + VALUE + '[' + i + ']'
}), ',', STORAGE, ')')
}
} else if (unroll > 1) {
scope(loop(unroll, function (i) {
return Array.isArray(VALUE) ? VALUE[i] : VALUE + '[' + i + ']'
}))
} else {
check$1(!Array.isArray(VALUE), 'uniform value must not be an array')
scope(VALUE)
}
scope(');')
}
}
function emitDraw (env, outer, inner, args) {
var shared = env.shared
var GL = shared.gl
var DRAW_STATE = shared.draw
var drawOptions = args.draw
function emitElements () {
var defn = drawOptions.elements
var ELEMENTS
var scope = outer
if (defn) {
if ((defn.contextDep && args.contextDynamic) || defn.propDep) {
scope = inner
}
ELEMENTS = defn.append(env, scope)
} else {
ELEMENTS = scope.def(DRAW_STATE, '.', S_ELEMENTS)
}
if (ELEMENTS) {
scope(
'if(' + ELEMENTS + ')' +
GL + '.bindBuffer(' + GL_ELEMENT_ARRAY_BUFFER$1 + ',' + ELEMENTS + '.buffer.buffer);')
}
return ELEMENTS
}
function emitCount () {
var defn = drawOptions.count
var COUNT
var scope = outer
if (defn) {
if ((defn.contextDep && args.contextDynamic) || defn.propDep) {
scope = inner
}
COUNT = defn.append(env, scope)
check$1.optional(function () {
if (defn.MISSING) {
env.assert(outer, 'false', 'missing vertex count')
}
if (defn.DYNAMIC) {
env.assert(scope, COUNT + '>=0', 'missing vertex count')
}
})
} else {
COUNT = scope.def(DRAW_STATE, '.', S_COUNT)
check$1.optional(function () {
env.assert(scope, COUNT + '>=0', 'missing vertex count')
})
}
return COUNT
}
var ELEMENTS = emitElements()
function emitValue (name) {
var defn = drawOptions[name]
if (defn) {
if ((defn.contextDep && args.contextDynamic) || defn.propDep) {
return defn.append(env, inner)
} else {
return defn.append(env, outer)
}
} else {
return outer.def(DRAW_STATE, '.', name)
}
}
var PRIMITIVE = emitValue(S_PRIMITIVE)
var OFFSET = emitValue(S_OFFSET)
var COUNT = emitCount()
if (typeof COUNT === 'number') {
if (COUNT === 0) {
return
}
} else {
inner('if(', COUNT, '){')
inner.exit('}')
}
var INSTANCES, EXT_INSTANCING
if (extInstancing) {
INSTANCES = emitValue(S_INSTANCES)
EXT_INSTANCING = env.instancing
}
var ELEMENT_TYPE = ELEMENTS + '.type'
var elementsStatic = drawOptions.elements && isStatic(drawOptions.elements)
function emitInstancing () {
function drawElements () {
inner(EXT_INSTANCING, '.drawElementsInstancedANGLE(', [
PRIMITIVE,
COUNT,
ELEMENT_TYPE,
OFFSET + '<<((' + ELEMENT_TYPE + '-' + GL_UNSIGNED_BYTE$8 + ')>>1)',
INSTANCES
], ');')
}
function drawArrays () {
inner(EXT_INSTANCING, '.drawArraysInstancedANGLE(',
[PRIMITIVE, OFFSET, COUNT, INSTANCES], ');')
}
if (ELEMENTS) {
if (!elementsStatic) {
inner('if(', ELEMENTS, '){')
drawElements()
inner('}else{')
drawArrays()
inner('}')
} else {
drawElements()
}
} else {
drawArrays()
}
}
function emitRegular () {
function drawElements () {
inner(GL + '.drawElements(' + [
PRIMITIVE,
COUNT,
ELEMENT_TYPE,
OFFSET + '<<((' + ELEMENT_TYPE + '-' + GL_UNSIGNED_BYTE$8 + ')>>1)'
] + ');')
}
function drawArrays () {
inner(GL + '.drawArrays(' + [PRIMITIVE, OFFSET, COUNT] + ');')
}
if (ELEMENTS) {
if (!elementsStatic) {
inner('if(', ELEMENTS, '){')
drawElements()
inner('}else{')
drawArrays()
inner('}')
} else {
drawElements()
}
} else {
drawArrays()
}
}
if (extInstancing && (typeof INSTANCES !== 'number' || INSTANCES >= 0)) {
if (typeof INSTANCES === 'string') {
inner('if(', INSTANCES, '>0){')
emitInstancing()
inner('}else if(', INSTANCES, '<0){')
emitRegular()
inner('}')
} else {
emitInstancing()
}
} else {
emitRegular()
}
}
function createBody (emitBody, parentEnv, args, program, count) {
var env = createREGLEnvironment()
var scope = env.proc('body', count)
check$1.optional(function () {
env.commandStr = parentEnv.commandStr
env.command = env.link(parentEnv.commandStr)
})
if (extInstancing) {
env.instancing = scope.def(
env.shared.extensions, '.angle_instanced_arrays')
}
emitBody(env, scope, args, program)
return env.compile().body
}
// ===================================================
// ===================================================
// DRAW PROC
// ===================================================
// ===================================================
function emitDrawBody (env, draw, args, program) {
injectExtensions(env, draw)
if (args.useVAO) {
if (args.drawVAO) {
draw(env.shared.vao, '.setVAO(', args.drawVAO.append(env, draw), ');')
} else {
draw(env.shared.vao, '.setVAO(', env.shared.vao, '.targetVAO);')
}
} else {
draw(env.shared.vao, '.setVAO(null);')
emitAttributes(env, draw, args, program.attributes, function () {
return true
})
}
emitUniforms(env, draw, args, program.uniforms, function () {
return true
})
emitDraw(env, draw, draw, args)
}
function emitDrawProc (env, args) {
var draw = env.proc('draw', 1)
injectExtensions(env, draw)
emitContext(env, draw, args.context)
emitPollFramebuffer(env, draw, args.framebuffer)
emitPollState(env, draw, args)
emitSetOptions(env, draw, args.state)
emitProfile(env, draw, args, false, true)
var program = args.shader.progVar.append(env, draw)
draw(env.shared.gl, '.useProgram(', program, '.program);')
if (args.shader.program) {
emitDrawBody(env, draw, args, args.shader.program)
} else {
draw(env.shared.vao, '.setVAO(null);')
var drawCache = env.global.def('{}')
var PROG_ID = draw.def(program, '.id')
var CACHED_PROC = draw.def(drawCache, '[', PROG_ID, ']')
draw(
env.cond(CACHED_PROC)
.then(CACHED_PROC, '.call(this,a0);')
.else(
CACHED_PROC, '=', drawCache, '[', PROG_ID, ']=',
env.link(function (program) {
return createBody(emitDrawBody, env, args, program, 1)
}), '(', program, ');',
CACHED_PROC, '.call(this,a0);'))
}
if (Object.keys(args.state).length > 0) {
draw(env.shared.current, '.dirty=true;')
}
}
// ===================================================
// ===================================================
// BATCH PROC
// ===================================================
// ===================================================
function emitBatchDynamicShaderBody (env, scope, args, program) {
env.batchId = 'a1'
injectExtensions(env, scope)
function all () {
return true
}
emitAttributes(env, scope, args, program.attributes, all)
emitUniforms(env, scope, args, program.uniforms, all)
emitDraw(env, scope, scope, args)
}
function emitBatchBody (env, scope, args, program) {
injectExtensions(env, scope)
var contextDynamic = args.contextDep
var BATCH_ID = scope.def()
var PROP_LIST = 'a0'
var NUM_PROPS = 'a1'
var PROPS = scope.def()
env.shared.props = PROPS
env.batchId = BATCH_ID
var outer = env.scope()
var inner = env.scope()
scope(
outer.entry,
'for(', BATCH_ID, '=0;', BATCH_ID, '<', NUM_PROPS, ';++', BATCH_ID, '){',
PROPS, '=', PROP_LIST, '[', BATCH_ID, '];',
inner,
'}',
outer.exit)
function isInnerDefn (defn) {
return ((defn.contextDep && contextDynamic) || defn.propDep)
}
function isOuterDefn (defn) {
return !isInnerDefn(defn)
}
if (args.needsContext) {
emitContext(env, inner, args.context)
}
if (args.needsFramebuffer) {
emitPollFramebuffer(env, inner, args.framebuffer)
}
emitSetOptions(env, inner, args.state, isInnerDefn)
if (args.profile && isInnerDefn(args.profile)) {
emitProfile(env, inner, args, false, true)
}
if (!program) {
var progCache = env.global.def('{}')
var PROGRAM = args.shader.progVar.append(env, inner)
var PROG_ID = inner.def(PROGRAM, '.id')
var CACHED_PROC = inner.def(progCache, '[', PROG_ID, ']')
inner(
env.shared.gl, '.useProgram(', PROGRAM, '.program);',
'if(!', CACHED_PROC, '){',
CACHED_PROC, '=', progCache, '[', PROG_ID, ']=',
env.link(function (program) {
return createBody(
emitBatchDynamicShaderBody, env, args, program, 2)
}), '(', PROGRAM, ');}',
CACHED_PROC, '.call(this,a0[', BATCH_ID, '],', BATCH_ID, ');')
} else {
if (args.useVAO) {
if (args.drawVAO) {
if (isInnerDefn(args.drawVAO)) {
// vao is a prop
inner(env.shared.vao, '.setVAO(', args.drawVAO.append(env, inner), ');')
} else {
// vao is invariant
outer(env.shared.vao, '.setVAO(', args.drawVAO.append(env, outer), ');')
}
} else {
// scoped vao binding
outer(env.shared.vao, '.setVAO(', env.shared.vao, '.targetVAO);')
}
} else {
outer(env.shared.vao, '.setVAO(null);')
emitAttributes(env, outer, args, program.attributes, isOuterDefn)
emitAttributes(env, inner, args, program.attributes, isInnerDefn)
}
emitUniforms(env, outer, args, program.uniforms, isOuterDefn)
emitUniforms(env, inner, args, program.uniforms, isInnerDefn)
emitDraw(env, outer, inner, args)
}
}
function emitBatchProc (env, args) {
var batch = env.proc('batch', 2)
env.batchId = '0'
injectExtensions(env, batch)
// Check if any context variables depend on props
var contextDynamic = false
var needsContext = true
Object.keys(args.context).forEach(function (name) {
contextDynamic = contextDynamic || args.context[name].propDep
})
if (!contextDynamic) {
emitContext(env, batch, args.context)
needsContext = false
}
// framebuffer state affects framebufferWidth/height context vars
var framebuffer = args.framebuffer
var needsFramebuffer = false
if (framebuffer) {
if (framebuffer.propDep) {
contextDynamic = needsFramebuffer = true
} else if (framebuffer.contextDep && contextDynamic) {
needsFramebuffer = true
}
if (!needsFramebuffer) {
emitPollFramebuffer(env, batch, framebuffer)
}
} else {
emitPollFramebuffer(env, batch, null)
}
// viewport is weird because it can affect context vars
if (args.state.viewport && args.state.viewport.propDep) {
contextDynamic = true
}
function isInnerDefn (defn) {
return (defn.contextDep && contextDynamic) || defn.propDep
}
// set webgl options
emitPollState(env, batch, args)
emitSetOptions(env, batch, args.state, function (defn) {
return !isInnerDefn(defn)
})
if (!args.profile || !isInnerDefn(args.profile)) {
emitProfile(env, batch, args, false, 'a1')
}
// Save these values to args so that the batch body routine can use them
args.contextDep = contextDynamic
args.needsContext = needsContext
args.needsFramebuffer = needsFramebuffer
// determine if shader is dynamic
var progDefn = args.shader.progVar
if ((progDefn.contextDep && contextDynamic) || progDefn.propDep) {
emitBatchBody(
env,
batch,
args,
null)
} else {
var PROGRAM = progDefn.append(env, batch)
batch(env.shared.gl, '.useProgram(', PROGRAM, '.program);')
if (args.shader.program) {
emitBatchBody(
env,
batch,
args,
args.shader.program)
} else {
batch(env.shared.vao, '.setVAO(null);')
var batchCache = env.global.def('{}')
var PROG_ID = batch.def(PROGRAM, '.id')
var CACHED_PROC = batch.def(batchCache, '[', PROG_ID, ']')
batch(
env.cond(CACHED_PROC)
.then(CACHED_PROC, '.call(this,a0,a1);')
.else(
CACHED_PROC, '=', batchCache, '[', PROG_ID, ']=',
env.link(function (program) {
return createBody(emitBatchBody, env, args, program, 2)
}), '(', PROGRAM, ');',
CACHED_PROC, '.call(this,a0,a1);'))
}
}
if (Object.keys(args.state).length > 0) {
batch(env.shared.current, '.dirty=true;')
}
}
// ===================================================
// ===================================================
// SCOPE COMMAND
// ===================================================
// ===================================================
function emitScopeProc (env, args) {
var scope = env.proc('scope', 3)
env.batchId = 'a2'
var shared = env.shared
var CURRENT_STATE = shared.current
emitContext(env, scope, args.context)
if (args.framebuffer) {
args.framebuffer.append(env, scope)
}
sortState(Object.keys(args.state)).forEach(function (name) {
var defn = args.state[name]
var value = defn.append(env, scope)
if (isArrayLike(value)) {
value.forEach(function (v, i) {
scope.set(env.next[name], '[' + i + ']', v)
})
} else {
scope.set(shared.next, '.' + name, value)
}
})
emitProfile(env, scope, args, true, true)
;[S_ELEMENTS, S_OFFSET, S_COUNT, S_INSTANCES, S_PRIMITIVE].forEach(
function (opt) {
var variable = args.draw[opt]
if (!variable) {
return
}
scope.set(shared.draw, '.' + opt, '' + variable.append(env, scope))
})
Object.keys(args.uniforms).forEach(function (opt) {
var value = args.uniforms[opt].append(env, scope)
if (Array.isArray(value)) {
value = '[' + value.join() + ']'
}
scope.set(
shared.uniforms,
'[' + stringStore.id(opt) + ']',
value)
})
Object.keys(args.attributes).forEach(function (name) {
var record = args.attributes[name].append(env, scope)
var scopeAttrib = env.scopeAttrib(name)
Object.keys(new AttributeRecord()).forEach(function (prop) {
scope.set(scopeAttrib, '.' + prop, record[prop])
})
})
if (args.scopeVAO) {
scope.set(shared.vao, '.targetVAO', args.scopeVAO.append(env, scope))
}
function saveShader (name) {
var shader = args.shader[name]
if (shader) {
scope.set(shared.shader, '.' + name, shader.append(env, scope))
}
}
saveShader(S_VERT)
saveShader(S_FRAG)
if (Object.keys(args.state).length > 0) {
scope(CURRENT_STATE, '.dirty=true;')
scope.exit(CURRENT_STATE, '.dirty=true;')
}
scope('a1(', env.shared.context, ',a0,', env.batchId, ');')
}
function isDynamicObject (object) {
if (typeof object !== 'object' || isArrayLike(object)) {
return
}
var props = Object.keys(object)
for (var i = 0; i < props.length; ++i) {
if (dynamic.isDynamic(object[props[i]])) {
return true
}
}
return false
}
function splatObject (env, options, name) {
var object = options.static[name]
if (!object || !isDynamicObject(object)) {
return
}
var globals = env.global
var keys = Object.keys(object)
var thisDep = false
var contextDep = false
var propDep = false
var objectRef = env.global.def('{}')
keys.forEach(function (key) {
var value = object[key]
if (dynamic.isDynamic(value)) {
if (typeof value === 'function') {
value = object[key] = dynamic.unbox(value)
}
var deps = createDynamicDecl(value, null)
thisDep = thisDep || deps.thisDep
propDep = propDep || deps.propDep
contextDep = contextDep || deps.contextDep
} else {
globals(objectRef, '.', key, '=')
switch (typeof value) {
case 'number':
globals(value)
break
case 'string':
globals('"', value, '"')
break
case 'object':
if (Array.isArray(value)) {
globals('[', value.join(), ']')
}
break
default:
globals(env.link(value))
break
}
globals(';')
}
})
function appendBlock (env, block) {
keys.forEach(function (key) {
var value = object[key]
if (!dynamic.isDynamic(value)) {
return
}
var ref = env.invoke(block, value)
block(objectRef, '.', key, '=', ref, ';')
})
}
options.dynamic[name] = new dynamic.DynamicVariable(DYN_THUNK, {
thisDep: thisDep,
contextDep: contextDep,
propDep: propDep,
ref: objectRef,
append: appendBlock
})
delete options.static[name]
}
// ===========================================================================
// ===========================================================================
// MAIN DRAW COMMAND
// ===========================================================================
// ===========================================================================
function compileCommand (options, attributes, uniforms, context, stats) {
var env = createREGLEnvironment()
// link stats, so that we can easily access it in the program.
env.stats = env.link(stats)
// splat options and attributes to allow for dynamic nested properties
Object.keys(attributes.static).forEach(function (key) {
splatObject(env, attributes, key)
})
NESTED_OPTIONS.forEach(function (name) {
splatObject(env, options, name)
})
var args = parseArguments(options, attributes, uniforms, context, env)
emitDrawProc(env, args)
emitScopeProc(env, args)
emitBatchProc(env, args)
return extend(env.compile(), {
destroy: function () {
args.shader.program.destroy()
}
})
}
// ===========================================================================
// ===========================================================================
// POLL / REFRESH
// ===========================================================================
// ===========================================================================
return {
next: nextState,
current: currentState,
procs: (function () {
var env = createREGLEnvironment()
var poll = env.proc('poll')
var refresh = env.proc('refresh')
var common = env.block()
poll(common)
refresh(common)
var shared = env.shared
var GL = shared.gl
var NEXT_STATE = shared.next
var CURRENT_STATE = shared.current
common(CURRENT_STATE, '.dirty=false;')
emitPollFramebuffer(env, poll)
emitPollFramebuffer(env, refresh, null, true)
// Refresh updates all attribute state changes
var INSTANCING
if (extInstancing) {
INSTANCING = env.link(extInstancing)
}
// update vertex array bindings
if (extensions.oes_vertex_array_object) {
refresh(env.link(extensions.oes_vertex_array_object), '.bindVertexArrayOES(null);')
}
for (var i = 0; i < limits.maxAttributes; ++i) {
var BINDING = refresh.def(shared.attributes, '[', i, ']')
var ifte = env.cond(BINDING, '.buffer')
ifte.then(
GL, '.enableVertexAttribArray(', i, ');',
GL, '.bindBuffer(',
GL_ARRAY_BUFFER$2, ',',
BINDING, '.buffer.buffer);',
GL, '.vertexAttribPointer(',
i, ',',
BINDING, '.size,',
BINDING, '.type,',
BINDING, '.normalized,',
BINDING, '.stride,',
BINDING, '.offset);'
).else(
GL, '.disableVertexAttribArray(', i, ');',
GL, '.vertexAttrib4f(',
i, ',',
BINDING, '.x,',
BINDING, '.y,',
BINDING, '.z,',
BINDING, '.w);',
BINDING, '.buffer=null;')
refresh(ifte)
if (extInstancing) {
refresh(
INSTANCING, '.vertexAttribDivisorANGLE(',
i, ',',
BINDING, '.divisor);')
}
}
refresh(
env.shared.vao, '.currentVAO=null;',
env.shared.vao, '.setVAO(', env.shared.vao, '.targetVAO);')
Object.keys(GL_FLAGS).forEach(function (flag) {
var cap = GL_FLAGS[flag]
var NEXT = common.def(NEXT_STATE, '.', flag)
var block = env.block()
block('if(', NEXT, '){',
GL, '.enable(', cap, ')}else{',
GL, '.disable(', cap, ')}',
CURRENT_STATE, '.', flag, '=', NEXT, ';')
refresh(block)
poll(
'if(', NEXT, '!==', CURRENT_STATE, '.', flag, '){',
block,
'}')
})
Object.keys(GL_VARIABLES).forEach(function (name) {
var func = GL_VARIABLES[name]
var init = currentState[name]
var NEXT, CURRENT
var block = env.block()
block(GL, '.', func, '(')
if (isArrayLike(init)) {
var n = init.length
NEXT = env.global.def(NEXT_STATE, '.', name)
CURRENT = env.global.def(CURRENT_STATE, '.', name)
block(
loop(n, function (i) {
return NEXT + '[' + i + ']'
}), ');',
loop(n, function (i) {
return CURRENT + '[' + i + ']=' + NEXT + '[' + i + '];'
}).join(''))
poll(
'if(', loop(n, function (i) {
return NEXT + '[' + i + ']!==' + CURRENT + '[' + i + ']'
}).join('||'), '){',
block,
'}')
} else {
NEXT = common.def(NEXT_STATE, '.', name)
CURRENT = common.def(CURRENT_STATE, '.', name)
block(
NEXT, ');',
CURRENT_STATE, '.', name, '=', NEXT, ';')
poll(
'if(', NEXT, '!==', CURRENT, '){',
block,
'}')
}
refresh(block)
})
return env.compile()
})(),
compile: compileCommand
}
}
function stats () {
return {
vaoCount: 0,
bufferCount: 0,
elementsCount: 0,
framebufferCount: 0,
shaderCount: 0,
textureCount: 0,
cubeCount: 0,
renderbufferCount: 0,
maxTextureUnits: 0
}
}
var GL_QUERY_RESULT_EXT = 0x8866
var GL_QUERY_RESULT_AVAILABLE_EXT = 0x8867
var GL_TIME_ELAPSED_EXT = 0x88BF
var createTimer = function (gl, extensions) {
if (!extensions.ext_disjoint_timer_query) {
return null
}
// QUERY POOL BEGIN
var queryPool = []
function allocQuery () {
return queryPool.pop() || extensions.ext_disjoint_timer_query.createQueryEXT()
}
function freeQuery (query) {
queryPool.push(query)
}
// QUERY POOL END
var pendingQueries = []
function beginQuery (stats) {
var query = allocQuery()
extensions.ext_disjoint_timer_query.beginQueryEXT(GL_TIME_ELAPSED_EXT, query)
pendingQueries.push(query)
pushScopeStats(pendingQueries.length - 1, pendingQueries.length, stats)
}
function endQuery () {
extensions.ext_disjoint_timer_query.endQueryEXT(GL_TIME_ELAPSED_EXT)
}
//
// Pending stats pool.
//
function PendingStats () {
this.startQueryIndex = -1
this.endQueryIndex = -1
this.sum = 0
this.stats = null
}
var pendingStatsPool = []
function allocPendingStats () {
return pendingStatsPool.pop() || new PendingStats()
}
function freePendingStats (pendingStats) {
pendingStatsPool.push(pendingStats)
}
// Pending stats pool end
var pendingStats = []
function pushScopeStats (start, end, stats) {
var ps = allocPendingStats()
ps.startQueryIndex = start
ps.endQueryIndex = end
ps.sum = 0
ps.stats = stats
pendingStats.push(ps)
}
// we should call this at the beginning of the frame,
// in order to update gpuTime
var timeSum = []
var queryPtr = []
function update () {
var ptr, i
var n = pendingQueries.length
if (n === 0) {
return
}
// Reserve space
queryPtr.length = Math.max(queryPtr.length, n + 1)
timeSum.length = Math.max(timeSum.length, n + 1)
timeSum[0] = 0
queryPtr[0] = 0
// Update all pending timer queries
var queryTime = 0
ptr = 0
for (i = 0; i < pendingQueries.length; ++i) {
var query = pendingQueries[i]
if (extensions.ext_disjoint_timer_query.getQueryObjectEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT)) {
queryTime += extensions.ext_disjoint_timer_query.getQueryObjectEXT(query, GL_QUERY_RESULT_EXT)
freeQuery(query)
} else {
pendingQueries[ptr++] = query
}
timeSum[i + 1] = queryTime
queryPtr[i + 1] = ptr
}
pendingQueries.length = ptr
// Update all pending stat queries
ptr = 0
for (i = 0; i < pendingStats.length; ++i) {
var stats = pendingStats[i]
var start = stats.startQueryIndex
var end = stats.endQueryIndex
stats.sum += timeSum[end] - timeSum[start]
var startPtr = queryPtr[start]
var endPtr = queryPtr[end]
if (endPtr === startPtr) {
stats.stats.gpuTime += stats.sum / 1e6
freePendingStats(stats)
} else {
stats.startQueryIndex = startPtr
stats.endQueryIndex = endPtr
pendingStats[ptr++] = stats
}
}
pendingStats.length = ptr
}
return {
beginQuery: beginQuery,
endQuery: endQuery,
pushScopeStats: pushScopeStats,
update: update,
getNumPendingQueries: function () {
return pendingQueries.length
},
clear: function () {
queryPool.push.apply(queryPool, pendingQueries)
for (var i = 0; i < queryPool.length; i++) {
extensions.ext_disjoint_timer_query.deleteQueryEXT(queryPool[i])
}
pendingQueries.length = 0
queryPool.length = 0
},
restore: function () {
pendingQueries.length = 0
queryPool.length = 0
}
}
}
var GL_COLOR_BUFFER_BIT = 16384
var GL_DEPTH_BUFFER_BIT = 256
var GL_STENCIL_BUFFER_BIT = 1024
var GL_ARRAY_BUFFER = 34962
var CONTEXT_LOST_EVENT = 'webglcontextlost'
var CONTEXT_RESTORED_EVENT = 'webglcontextrestored'
var DYN_PROP = 1
var DYN_CONTEXT = 2
var DYN_STATE = 3
function find (haystack, needle) {
for (var i = 0; i < haystack.length; ++i) {
if (haystack[i] === needle) {
return i
}
}
return -1
}
function wrapREGL (args) {
var config = parseArgs(args)
if (!config) {
return null
}
var gl = config.gl
var glAttributes = gl.getContextAttributes()
var contextLost = gl.isContextLost()
var extensionState = createExtensionCache(gl, config)
if (!extensionState) {
return null
}
var stringStore = createStringStore()
var stats$$1 = stats()
var extensions = extensionState.extensions
var timer = createTimer(gl, extensions)
var START_TIME = clock()
var WIDTH = gl.drawingBufferWidth
var HEIGHT = gl.drawingBufferHeight
var contextState = {
tick: 0,
time: 0,
viewportWidth: WIDTH,
viewportHeight: HEIGHT,
framebufferWidth: WIDTH,
framebufferHeight: HEIGHT,
drawingBufferWidth: WIDTH,
drawingBufferHeight: HEIGHT,
pixelRatio: config.pixelRatio
}
var uniformState = {}
var drawState = {
elements: null,
primitive: 4, // GL_TRIANGLES
count: -1,
offset: 0,
instances: -1
}
var limits = wrapLimits(gl, extensions)
var bufferState = wrapBufferState(
gl,
stats$$1,
config,
destroyBuffer)
var attributeState = wrapAttributeState(
gl,
extensions,
limits,
stats$$1,
bufferState)
function destroyBuffer (buffer) {
return attributeState.destroyBuffer(buffer)
}
var elementState = wrapElementsState(gl, extensions, bufferState, stats$$1)
var shaderState = wrapShaderState(gl, stringStore, stats$$1, config)
var textureState = createTextureSet(
gl,
extensions,
limits,
function () { core.procs.poll() },
contextState,
stats$$1,
config)
var renderbufferState = wrapRenderbuffers(gl, extensions, limits, stats$$1, config)
var framebufferState = wrapFBOState(
gl,
extensions,
limits,
textureState,
renderbufferState,
stats$$1)
var core = reglCore(
gl,
stringStore,
extensions,
limits,
bufferState,
elementState,
textureState,
framebufferState,
uniformState,
attributeState,
shaderState,
drawState,
contextState,
timer,
config)
var readPixels = wrapReadPixels(
gl,
framebufferState,
core.procs.poll,
contextState,
glAttributes, extensions, limits)
var nextState = core.next
var canvas = gl.canvas
var rafCallbacks = []
var lossCallbacks = []
var restoreCallbacks = []
var destroyCallbacks = [config.onDestroy]
var activeRAF = null
function handleRAF () {
if (rafCallbacks.length === 0) {
if (timer) {
timer.update()
}
activeRAF = null
return
}
// schedule next animation frame
activeRAF = raf.next(handleRAF)
// poll for changes
poll()
// fire a callback for all pending rafs
for (var i = rafCallbacks.length - 1; i >= 0; --i) {
var cb = rafCallbacks[i]
if (cb) {
cb(contextState, null, 0)
}
}
// flush all pending webgl calls
gl.flush()
// poll GPU timers *after* gl.flush so we don't delay command dispatch
if (timer) {
timer.update()
}
}
function startRAF () {
if (!activeRAF && rafCallbacks.length > 0) {
activeRAF = raf.next(handleRAF)
}
}
function stopRAF () {
if (activeRAF) {
raf.cancel(handleRAF)
activeRAF = null
}
}
function handleContextLoss (event) {
event.preventDefault()
// set context lost flag
contextLost = true
// pause request animation frame
stopRAF()
// lose context
lossCallbacks.forEach(function (cb) {
cb()
})
}
function handleContextRestored (event) {
// clear error code
gl.getError()
// clear context lost flag
contextLost = false
// refresh state
extensionState.restore()
shaderState.restore()
bufferState.restore()
textureState.restore()
renderbufferState.restore()
framebufferState.restore()
attributeState.restore()
if (timer) {
timer.restore()
}
// refresh state
core.procs.refresh()
// restart RAF
startRAF()
// restore context
restoreCallbacks.forEach(function (cb) {
cb()
})
}
if (canvas) {
canvas.addEventListener(CONTEXT_LOST_EVENT, handleContextLoss, false)
canvas.addEventListener(CONTEXT_RESTORED_EVENT, handleContextRestored, false)
}
function destroy () {
rafCallbacks.length = 0
stopRAF()
if (canvas) {
canvas.removeEventListener(CONTEXT_LOST_EVENT, handleContextLoss)
canvas.removeEventListener(CONTEXT_RESTORED_EVENT, handleContextRestored)
}
shaderState.clear()
framebufferState.clear()
renderbufferState.clear()
textureState.clear()
elementState.clear()
bufferState.clear()
attributeState.clear()
if (timer) {
timer.clear()
}
destroyCallbacks.forEach(function (cb) {
cb()
})
}
function compileProcedure (options) {
check$1(!!options, 'invalid args to regl({...})')
check$1.type(options, 'object', 'invalid args to regl({...})')
function flattenNestedOptions (options) {
var result = extend({}, options)
delete result.uniforms
delete result.attributes
delete result.context
delete result.vao
if ('stencil' in result && result.stencil.op) {
result.stencil.opBack = result.stencil.opFront = result.stencil.op
delete result.stencil.op
}
function merge (name) {
if (name in result) {
var child = result[name]
delete result[name]
Object.keys(child).forEach(function (prop) {
result[name + '.' + prop] = child[prop]
})
}
}
merge('blend')
merge('depth')
merge('cull')
merge('stencil')
merge('polygonOffset')
merge('scissor')
merge('sample')
if ('vao' in options) {
result.vao = options.vao
}
return result
}
function separateDynamic (object, useArrays) {
var staticItems = {}
var dynamicItems = {}
Object.keys(object).forEach(function (option) {
var value = object[option]
if (dynamic.isDynamic(value)) {
dynamicItems[option] = dynamic.unbox(value, option)
return
} else if (useArrays && Array.isArray(value)) {
for (var i = 0; i < value.length; ++i) {
if (dynamic.isDynamic(value[i])) {
dynamicItems[option] = dynamic.unbox(value, option)
return
}
}
}
staticItems[option] = value
})
return {
dynamic: dynamicItems,
static: staticItems
}
}
// Treat context variables separate from other dynamic variables
var context = separateDynamic(options.context || {}, true)
var uniforms = separateDynamic(options.uniforms || {}, true)
var attributes = separateDynamic(options.attributes || {}, false)
var opts = separateDynamic(flattenNestedOptions(options), false)
var stats$$1 = {
gpuTime: 0.0,
cpuTime: 0.0,
count: 0
}
var compiled = core.compile(opts, attributes, uniforms, context, stats$$1)
var draw = compiled.draw
var batch = compiled.batch
var scope = compiled.scope
// FIXME: we should modify code generation for batch commands so this
// isn't necessary
var EMPTY_ARRAY = []
function reserve (count) {
while (EMPTY_ARRAY.length < count) {
EMPTY_ARRAY.push(null)
}
return EMPTY_ARRAY
}
function REGLCommand (args, body) {
var i
if (contextLost) {
check$1.raise('context lost')
}
if (typeof args === 'function') {
return scope.call(this, null, args, 0)
} else if (typeof body === 'function') {
if (typeof args === 'number') {
for (i = 0; i < args; ++i) {
scope.call(this, null, body, i)
}
} else if (Array.isArray(args)) {
for (i = 0; i < args.length; ++i) {
scope.call(this, args[i], body, i)
}
} else {
return scope.call(this, args, body, 0)
}
} else if (typeof args === 'number') {
if (args > 0) {
return batch.call(this, reserve(args | 0), args | 0)
}
} else if (Array.isArray(args)) {
if (args.length) {
return batch.call(this, args, args.length)
}
} else {
return draw.call(this, args)
}
}
return extend(REGLCommand, {
stats: stats$$1,
destroy: function () {
compiled.destroy()
}
})
}
var setFBO = framebufferState.setFBO = compileProcedure({
framebuffer: dynamic.define.call(null, DYN_PROP, 'framebuffer')
})
function clearImpl (_, options) {
var clearFlags = 0
core.procs.poll()
var c = options.color
if (c) {
gl.clearColor(+c[0] || 0, +c[1] || 0, +c[2] || 0, +c[3] || 0)
clearFlags |= GL_COLOR_BUFFER_BIT
}
if ('depth' in options) {
gl.clearDepth(+options.depth)
clearFlags |= GL_DEPTH_BUFFER_BIT
}
if ('stencil' in options) {
gl.clearStencil(options.stencil | 0)
clearFlags |= GL_STENCIL_BUFFER_BIT
}
check$1(!!clearFlags, 'called regl.clear with no buffer specified')
gl.clear(clearFlags)
}
function clear (options) {
check$1(
typeof options === 'object' && options,
'regl.clear() takes an object as input')
if ('framebuffer' in options) {
if (options.framebuffer &&
options.framebuffer_reglType === 'framebufferCube') {
for (var i = 0; i < 6; ++i) {
setFBO(extend({
framebuffer: options.framebuffer.faces[i]
}, options), clearImpl)
}
} else {
setFBO(options, clearImpl)
}
} else {
clearImpl(null, options)
}
}
function frame (cb) {
check$1.type(cb, 'function', 'regl.frame() callback must be a function')
rafCallbacks.push(cb)
function cancel () {
// FIXME: should we check something other than equals cb here?
// what if a user calls frame twice with the same callback...
//
var i = find(rafCallbacks, cb)
check$1(i >= 0, 'cannot cancel a frame twice')
function pendingCancel () {
var index = find(rafCallbacks, pendingCancel)
rafCallbacks[index] = rafCallbacks[rafCallbacks.length - 1]
rafCallbacks.length -= 1
if (rafCallbacks.length <= 0) {
stopRAF()
}
}
rafCallbacks[i] = pendingCancel
}
startRAF()
return {
cancel: cancel
}
}
// poll viewport
function pollViewport () {
var viewport = nextState.viewport
var scissorBox = nextState.scissor_box
viewport[0] = viewport[1] = scissorBox[0] = scissorBox[1] = 0
contextState.viewportWidth =
contextState.framebufferWidth =
contextState.drawingBufferWidth =
viewport[2] =
scissorBox[2] = gl.drawingBufferWidth
contextState.viewportHeight =
contextState.framebufferHeight =
contextState.drawingBufferHeight =
viewport[3] =
scissorBox[3] = gl.drawingBufferHeight
}
function poll () {
contextState.tick += 1
contextState.time = now()
pollViewport()
core.procs.poll()
}
function refresh () {
textureState.refresh()
pollViewport()
core.procs.refresh()
if (timer) {
timer.update()
}
}
function now () {
return (clock() - START_TIME) / 1000.0
}
refresh()
function addListener (event, callback) {
check$1.type(callback, 'function', 'listener callback must be a function')
var callbacks
switch (event) {
case 'frame':
return frame(callback)
case 'lost':
callbacks = lossCallbacks
break
case 'restore':
callbacks = restoreCallbacks
break
case 'destroy':
callbacks = destroyCallbacks
break
default:
check$1.raise('invalid event, must be one of frame,lost,restore,destroy')
}
callbacks.push(callback)
return {
cancel: function () {
for (var i = 0; i < callbacks.length; ++i) {
if (callbacks[i] === callback) {
callbacks[i] = callbacks[callbacks.length - 1]
callbacks.pop()
return
}
}
}
}
}
var regl = extend(compileProcedure, {
// Clear current FBO
clear: clear,
// Short cuts for dynamic variables
prop: dynamic.define.bind(null, DYN_PROP),
context: dynamic.define.bind(null, DYN_CONTEXT),
this: dynamic.define.bind(null, DYN_STATE),
// executes an empty draw command
draw: compileProcedure({}),
// Resources
buffer: function (options) {
return bufferState.create(options, GL_ARRAY_BUFFER, false, false)
},
elements: function (options) {
return elementState.create(options, false)
},
texture: textureState.create2D,
cube: textureState.createCube,
renderbuffer: renderbufferState.create,
framebuffer: framebufferState.create,
framebufferCube: framebufferState.createCube,
vao: attributeState.createVAO,
// Expose context attributes
attributes: glAttributes,
// Frame rendering
frame: frame,
on: addListener,
// System limits
limits: limits,
hasExtension: function (name) {
return limits.extensions.indexOf(name.toLowerCase()) >= 0
},
// Read pixels
read: readPixels,
// Destroy regl and all associated resources
destroy: destroy,
// Direct GL state manipulation
_gl: gl,
_refresh: refresh,
poll: function () {
poll()
if (timer) {
timer.update()
}
},
// Current time
now: now,
// regl Statistics Information
stats: stats$$1
})
config.onDone(null, regl)
return regl
}
return wrapREGL;
})));
},{}],107:[function(require,module,exports){
(function (global){
module.exports =
global.performance &&
global.performance.now ? function now() {
return performance.now()
} : Date.now || function now() {
return +new Date
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],108:[function(require,module,exports){
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer
// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
for (var key in src) {
dst[key] = src[key]
}
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
module.exports = buffer
} else {
// Copy properties from require('buffer')
copyProps(buffer, exports)
exports.Buffer = SafeBuffer
}
function SafeBuffer (arg, encodingOrOffset, length) {
return Buffer(arg, encodingOrOffset, length)
}
// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)
SafeBuffer.from = function (arg, encodingOrOffset, length) {
if (typeof arg === 'number') {
throw new TypeError('Argument must not be a number')
}
return Buffer(arg, encodingOrOffset, length)
}
SafeBuffer.alloc = function (size, fill, encoding) {
if (typeof size !== 'number') {
throw new TypeError('Argument must be a number')
}
var buf = Buffer(size)
if (fill !== undefined) {
if (typeof encoding === 'string') {
buf.fill(fill, encoding)
} else {
buf.fill(fill)
}
} else {
buf.fill(0)
}
return buf
}
SafeBuffer.allocUnsafe = function (size) {
if (typeof size !== 'number') {
throw new TypeError('Argument must be a number')
}
return Buffer(size)
}
SafeBuffer.allocUnsafeSlow = function (size) {
if (typeof size !== 'number') {
throw new TypeError('Argument must be a number')
}
return buffer.SlowBuffer(size)
}
},{"buffer":27}],109:[function(require,module,exports){
'use strict';
module.exports = require('./lib/index');
},{"./lib/index":114}],110:[function(require,module,exports){
'use strict';
var randomFromSeed = require('./random/random-from-seed');
var ORIGINAL = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';
var alphabet;
var previousSeed;
var shuffled;
function reset() {
shuffled = false;
}
function setCharacters(_alphabet_) {
if (!_alphabet_) {
if (alphabet !== ORIGINAL) {
alphabet = ORIGINAL;
reset();
}
return;
}
if (_alphabet_ === alphabet) {
return;
}
if (_alphabet_.length !== ORIGINAL.length) {
throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. You submitted ' + _alphabet_.length + ' characters: ' + _alphabet_);
}
var unique = _alphabet_.split('').filter(function(item, ind, arr){
return ind !== arr.lastIndexOf(item);
});
if (unique.length) {
throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. These characters were not unique: ' + unique.join(', '));
}
alphabet = _alphabet_;
reset();
}
function characters(_alphabet_) {
setCharacters(_alphabet_);
return alphabet;
}
function setSeed(seed) {
randomFromSeed.seed(seed);
if (previousSeed !== seed) {
reset();
previousSeed = seed;
}
}
function shuffle() {
if (!alphabet) {
setCharacters(ORIGINAL);
}
var sourceArray = alphabet.split('');
var targetArray = [];
var r = randomFromSeed.nextValue();
var characterIndex;
while (sourceArray.length > 0) {
r = randomFromSeed.nextValue();
characterIndex = Math.floor(r * sourceArray.length);
targetArray.push(sourceArray.splice(characterIndex, 1)[0]);
}
return targetArray.join('');
}
function getShuffled() {
if (shuffled) {
return shuffled;
}
shuffled = shuffle();
return shuffled;
}
/**
* lookup shuffled letter
* @param index
* @returns {string}
*/
function lookup(index) {
var alphabetShuffled = getShuffled();
return alphabetShuffled[index];
}
module.exports = {
characters: characters,
seed: setSeed,
lookup: lookup,
shuffled: getShuffled
};
},{"./random/random-from-seed":117}],111:[function(require,module,exports){
'use strict';
var encode = require('./encode');
var alphabet = require('./alphabet');
// Ignore all milliseconds before a certain time to reduce the size of the date entropy without sacrificing uniqueness.
// This number should be updated every year or so to keep the generated id short.
// To regenerate `new Date() - 0` and bump the version. Always bump the version!
var REDUCE_TIME = 1459707606518;
// don't change unless we change the algos or REDUCE_TIME
// must be an integer and less than 16
var version = 6;
// Counter is used when shortid is called multiple times in one second.
var counter;
// Remember the last time shortid was called in case counter is needed.
var previousSeconds;
/**
* Generate unique id
* Returns string id
*/
function build(clusterWorkerId) {
var str = '';
var seconds = Math.floor((Date.now() - REDUCE_TIME) * 0.001);
if (seconds === previousSeconds) {
counter++;
} else {
counter = 0;
previousSeconds = seconds;
}
str = str + encode(alphabet.lookup, version);
str = str + encode(alphabet.lookup, clusterWorkerId);
if (counter > 0) {
str = str + encode(alphabet.lookup, counter);
}
str = str + encode(alphabet.lookup, seconds);
return str;
}
module.exports = build;
},{"./alphabet":110,"./encode":113}],112:[function(require,module,exports){
'use strict';
var alphabet = require('./alphabet');
/**
* Decode the id to get the version and worker
* Mainly for debugging and testing.
* @param id - the shortid-generated id.
*/
function decode(id) {
var characters = alphabet.shuffled();
return {
version: characters.indexOf(id.substr(0, 1)) & 0x0f,
worker: characters.indexOf(id.substr(1, 1)) & 0x0f
};
}
module.exports = decode;
},{"./alphabet":110}],113:[function(require,module,exports){
'use strict';
var randomByte = require('./random/random-byte');
function encode(lookup, number) {
var loopCounter = 0;
var done;
var str = '';
while (!done) {
str = str + lookup( ( (number >> (4 * loopCounter)) & 0x0f ) | randomByte() );
done = number < (Math.pow(16, loopCounter + 1 ) );
loopCounter++;
}
return str;
}
module.exports = encode;
},{"./random/random-byte":116}],114:[function(require,module,exports){
'use strict';
var alphabet = require('./alphabet');
var encode = require('./encode');
var decode = require('./decode');
var build = require('./build');
var isValid = require('./is-valid');
// if you are using cluster or multiple servers use this to make each instance
// has a unique value for worker
// Note: I don't know if this is automatically set when using third
// party cluster solutions such as pm2.
var clusterWorkerId = require('./util/cluster-worker-id') || 0;
/**
* Set the seed.
* Highly recommended if you don't want people to try to figure out your id schema.
* exposed as shortid.seed(int)
* @param seed Integer value to seed the random alphabet. ALWAYS USE THE SAME SEED or you might get overlaps.
*/
function seed(seedValue) {
alphabet.seed(seedValue);
return module.exports;
}
/**
* Set the cluster worker or machine id
* exposed as shortid.worker(int)
* @param workerId worker must be positive integer. Number less than 16 is recommended.
* returns shortid module so it can be chained.
*/
function worker(workerId) {
clusterWorkerId = workerId;
return module.exports;
}
/**
*
* sets new characters to use in the alphabet
* returns the shuffled alphabet
*/
function characters(newCharacters) {
if (newCharacters !== undefined) {
alphabet.characters(newCharacters);
}
return alphabet.shuffled();
}
/**
* Generate unique id
* Returns string id
*/
function generate() {
return build(clusterWorkerId);
}
// Export all other functions as properties of the generate function
module.exports = generate;
module.exports.generate = generate;
module.exports.seed = seed;
module.exports.worker = worker;
module.exports.characters = characters;
module.exports.decode = decode;
module.exports.isValid = isValid;
},{"./alphabet":110,"./build":111,"./decode":112,"./encode":113,"./is-valid":115,"./util/cluster-worker-id":118}],115:[function(require,module,exports){
'use strict';
var alphabet = require('./alphabet');
function isShortId(id) {
if (!id || typeof id !== 'string' || id.length < 6 ) {
return false;
}
var characters = alphabet.characters();
var len = id.length;
for(var i = 0; i < len;i++) {
if (characters.indexOf(id[i]) === -1) {
return false;
}
}
return true;
}
module.exports = isShortId;
},{"./alphabet":110}],116:[function(require,module,exports){
'use strict';
var crypto = typeof window === 'object' && (window.crypto || window.msCrypto); // IE 11 uses window.msCrypto
function randomByte() {
if (!crypto || !crypto.getRandomValues) {
return Math.floor(Math.random() * 256) & 0x30;
}
var dest = new Uint8Array(1);
crypto.getRandomValues(dest);
return dest[0] & 0x30;
}
module.exports = randomByte;
},{}],117:[function(require,module,exports){
'use strict';
// Found this seed-based random generator somewhere
// Based on The Central Randomizer 1.3 (C) 1997 by Paul Houle (houle@msc.cornell.edu)
var seed = 1;
/**
* return a random number based on a seed
* @param seed
* @returns {number}
*/
function getNextValue() {
seed = (seed * 9301 + 49297) % 233280;
return seed/(233280.0);
}
function setSeed(_seed_) {
seed = _seed_;
}
module.exports = {
nextValue: getNextValue,
seed: setSeed
};
},{}],118:[function(require,module,exports){
'use strict';
module.exports = 0;
},{}],119:[function(require,module,exports){
(function (Buffer){
module.exports = Peer
var debug = require('debug')('simple-peer')
var getBrowserRTC = require('get-browser-rtc')
var inherits = require('inherits')
var randombytes = require('randombytes')
var stream = require('readable-stream')
var MAX_BUFFERED_AMOUNT = 64 * 1024
inherits(Peer, stream.Duplex)
/**
* WebRTC peer connection. Same API as node core `net.Socket`, plus a few extra methods.
* Duplex stream.
* @param {Object} opts
*/
function Peer (opts) {
var self = this
if (!(self instanceof Peer)) return new Peer(opts)
self._id = randombytes(4).toString('hex').slice(0, 7)
self._debug('new peer %o', opts)
opts = Object.assign({
allowHalfOpen: false
}, opts)
stream.Duplex.call(self, opts)
self.channelName = opts.initiator
? opts.channelName || randombytes(20).toString('hex')
: null
// Needed by _transformConstraints, so set this early
self._isChromium = typeof window !== 'undefined' && !!window.webkitRTCPeerConnection
self.initiator = opts.initiator || false
self.channelConfig = opts.channelConfig || Peer.channelConfig
self.config = opts.config || Peer.config
self.constraints = self._transformConstraints(opts.constraints || Peer.constraints)
self.offerConstraints = self._transformConstraints(opts.offerConstraints || {})
self.answerConstraints = self._transformConstraints(opts.answerConstraints || {})
self.sdpTransform = opts.sdpTransform || function (sdp) { return sdp }
self.streams = opts.streams || (opts.stream ? [opts.stream] : []) // support old "stream" option
self.trickle = opts.trickle !== undefined ? opts.trickle : true
self.destroyed = false
self.connected = false
self.remoteAddress = undefined
self.remoteFamily = undefined
self.remotePort = undefined
self.localAddress = undefined
self.localPort = undefined
self._wrtc = (opts.wrtc && typeof opts.wrtc === 'object')
? opts.wrtc
: getBrowserRTC()
if (!self._wrtc) {
if (typeof window === 'undefined') {
throw makeError('No WebRTC support: Specify `opts.wrtc` option in this environment', 'ERR_WEBRTC_SUPPORT')
} else {
throw makeError('No WebRTC support: Not a supported browser', 'ERR_WEBRTC_SUPPORT')
}
}
self._pcReady = false
self._channelReady = false
self._iceComplete = false // ice candidate trickle done (got null candidate)
self._channel = null
self._pendingCandidates = []
self._isNegotiating = false // is this peer waiting for negotiation to complete?
self._batchedNegotiation = false // batch synchronous negotiations
self._queuedNegotiation = false // is there a queued negotiation request?
self._sendersAwaitingStable = []
self._senderMap = new WeakMap()
self._remoteTracks = []
self._remoteStreams = []
self._chunk = null
self._cb = null
self._interval = null
self._pc = new (self._wrtc.RTCPeerConnection)(self.config, self.constraints)
// We prefer feature detection whenever possible, but sometimes that's not
// possible for certain implementations.
self._isReactNativeWebrtc = typeof self._pc._peerConnectionId === 'number'
self._pc.oniceconnectionstatechange = function () {
self._onIceStateChange()
}
self._pc.onicegatheringstatechange = function () {
self._onIceStateChange()
}
self._pc.onsignalingstatechange = function () {
self._onSignalingStateChange()
}
self._pc.onicecandidate = function (event) {
self._onIceCandidate(event)
}
// Other spec events, unused by this implementation:
// - onconnectionstatechange
// - onicecandidateerror
// - onfingerprintfailure
// - onnegotiationneeded
if (self.initiator) {
self._setupData({
channel: self._pc.createDataChannel(self.channelName, self.channelConfig)
})
} else {
self._pc.ondatachannel = function (event) {
self._setupData(event)
}
}
if ('addTrack' in self._pc) {
if (self.streams) {
self.streams.forEach(function (stream) {
self.addStream(stream)
})
}
self._pc.ontrack = function (event) {
self._onTrack(event)
}
}
if (self.initiator) {
self._needsNegotiation()
}
self._onFinishBound = function () {
self._onFinish()
}
self.once('finish', self._onFinishBound)
}
Peer.WEBRTC_SUPPORT = !!getBrowserRTC()
/**
* Expose config, constraints, and data channel config for overriding all Peer
* instances. Otherwise, just set opts.config, opts.constraints, or opts.channelConfig
* when constructing a Peer.
*/
Peer.config = {
iceServers: [
{
urls: 'stun:stun.l.google.com:19302'
},
{
urls: 'stun:global.stun.twilio.com:3478?transport=udp'
}
]
}
Peer.constraints = {}
Peer.channelConfig = {}
Object.defineProperty(Peer.prototype, 'bufferSize', {
get: function () {
var self = this
return (self._channel && self._channel.bufferedAmount) || 0
}
})
Peer.prototype.address = function () {
var self = this
return { port: self.localPort, family: 'IPv4', address: self.localAddress }
}
Peer.prototype.signal = function (data) {
var self = this
if (self.destroyed) throw makeError('cannot signal after peer is destroyed', 'ERR_SIGNALING')
if (typeof data === 'string') {
try {
data = JSON.parse(data)
} catch (err) {
data = {}
}
}
self._debug('signal()')
if (data.renegotiate) {
self._debug('got request to renegotiate')
self._needsNegotiation()
}
if (data.candidate) {
if (self._pc.remoteDescription && self._pc.remoteDescription.type) self._addIceCandidate(data.candidate)
else self._pendingCandidates.push(data.candidate)
}
if (data.sdp) {
self._pc.setRemoteDescription(new (self._wrtc.RTCSessionDescription)(data), function () {
if (self.destroyed) return
self._pendingCandidates.forEach(function (candidate) {
self._addIceCandidate(candidate)
})
self._pendingCandidates = []
if (self._pc.remoteDescription.type === 'offer') self._createAnswer()
}, function (err) { self.destroy(makeError(err, 'ERR_SET_REMOTE_DESCRIPTION')) })
}
if (!data.sdp && !data.candidate && !data.renegotiate) {
self.destroy(makeError('signal() called with invalid signal data', 'ERR_SIGNALING'))
}
}
Peer.prototype._addIceCandidate = function (candidate) {
var self = this
try {
self._pc.addIceCandidate(
new self._wrtc.RTCIceCandidate(candidate),
noop,
function (err) { self.destroy(makeError(err, 'ERR_ADD_ICE_CANDIDATE')) }
)
} catch (err) {
self.destroy(makeError('error adding candidate: ' + err.message, 'ERR_ADD_ICE_CANDIDATE'))
}
}
/**
* Send text/binary data to the remote peer.
* @param {ArrayBufferView|ArrayBuffer|Buffer|string|Blob} chunk
*/
Peer.prototype.send = function (chunk) {
var self = this
self._channel.send(chunk)
}
/**
* Add a MediaStream to the connection.
* @param {MediaStream} stream
*/
Peer.prototype.addStream = function (stream) {
var self = this
self._debug('addStream()')
stream.getTracks().forEach(function (track) {
self.addTrack(track, stream)
})
}
/**
* Add a MediaStreamTrack to the connection.
* @param {MediaStreamTrack} track
* @param {MediaStream} stream
*/
Peer.prototype.addTrack = function (track, stream) {
var self = this
self._debug('addTrack()')
var sender = self._pc.addTrack(track, stream)
var submap = self._senderMap.get(track) || new WeakMap() // nested WeakMaps map [track, stream] to sender
submap.set(stream, sender)
self._senderMap.set(track, submap)
self._needsNegotiation()
}
/**
* Remove a MediaStreamTrack from the connection.
* @param {MediaStreamTrack} track
* @param {MediaStream} stream
*/
Peer.prototype.removeTrack = function (track, stream) {
var self = this
self._debug('removeSender()')
var submap = self._senderMap.get(track)
var sender = submap ? submap.get(stream) : null
if (!sender) {
self.destroy(new Error('Cannot remove track that was never added.'))
}
try {
self._pc.removeTrack(sender)
} catch (err) {
if (err.name === 'NS_ERROR_UNEXPECTED') {
self._sendersAwaitingStable.push(sender) // HACK: Firefox must wait until (signalingState === stable) https://bugzilla.mozilla.org/show_bug.cgi?id=1133874
} else {
self.destroy(err)
}
}
}
/**
* Remove a MediaStream from the connection.
* @param {MediaStream} stream
*/
Peer.prototype.removeStream = function (stream) {
var self = this
self._debug('removeSenders()')
stream.getTracks().forEach(function (track) {
self.removeTrack(track, stream)
})
}
Peer.prototype._needsNegotiation = function () {
var self = this
self._debug('_needsNegotiation')
if (self._batchedNegotiation) return // batch synchronous renegotiations
self._batchedNegotiation = true
setTimeout(function () {
self._batchedNegotiation = false
self._debug('starting batched negotiation')
self.negotiate()
}, 0)
}
Peer.prototype.negotiate = function () {
var self = this
if (self.initiator) {
if (self._isNegotiating) {
self._queuedNegotiation = true
self._debug('already negotiating, queueing')
} else {
self._debug('start negotiation')
self._createOffer()
}
} else {
self._debug('requesting negotiation from initiator')
self.emit('signal', { // request initiator to renegotiate
renegotiate: true
})
}
self._isNegotiating = true
}
// TODO: Delete this method once readable-stream is updated to contain a default
// implementation of destroy() that automatically calls _destroy()
// See: https://github.com/nodejs/readable-stream/issues/283
Peer.prototype.destroy = function (err) {
var self = this
self._destroy(err, function () {})
}
Peer.prototype._destroy = function (err, cb) {
var self = this
if (self.destroyed) return
self._debug('destroy (error: %s)', err && (err.message || err))
self.readable = self.writable = false
if (!self._readableState.ended) self.push(null)
if (!self._writableState.finished) self.end()
self.destroyed = true
self.connected = false
self._pcReady = false
self._channelReady = false
self._remoteTracks = null
self._remoteStreams = null
self._senderMap = null
clearInterval(self._interval)
self._interval = null
self._chunk = null
self._cb = null
if (self._onFinishBound) self.removeListener('finish', self._onFinishBound)
self._onFinishBound = null
if (self._channel) {
try {
self._channel.close()
} catch (err) {}
self._channel.onmessage = null
self._channel.onopen = null
self._channel.onclose = null
self._channel.onerror = null
}
if (self._pc) {
try {
self._pc.close()
} catch (err) {}
self._pc.oniceconnectionstatechange = null
self._pc.onicegatheringstatechange = null
self._pc.onsignalingstatechange = null
self._pc.onicecandidate = null
if ('addTrack' in self._pc) {
self._pc.ontrack = null
}
self._pc.ondatachannel = null
}
self._pc = null
self._channel = null
if (err) self.emit('error', err)
self.emit('close')
cb()
}
Peer.prototype._setupData = function (event) {
var self = this
if (!event.channel) {
// In some situations `pc.createDataChannel()` returns `undefined` (in wrtc),
// which is invalid behavior. Handle it gracefully.
// See: https://github.com/feross/simple-peer/issues/163
return self.destroy(makeError('Data channel event is missing `channel` property', 'ERR_DATA_CHANNEL'))
}
self._channel = event.channel
self._channel.binaryType = 'arraybuffer'
if (typeof self._channel.bufferedAmountLowThreshold === 'number') {
self._channel.bufferedAmountLowThreshold = MAX_BUFFERED_AMOUNT
}
self.channelName = self._channel.label
self._channel.onmessage = function (event) {
self._onChannelMessage(event)
}
self._channel.onbufferedamountlow = function () {
self._onChannelBufferedAmountLow()
}
self._channel.onopen = function () {
self._onChannelOpen()
}
self._channel.onclose = function () {
self._onChannelClose()
}
self._channel.onerror = function (err) {
self.destroy(makeError(err, 'ERR_DATA_CHANNEL'))
}
}
Peer.prototype._read = function () {}
Peer.prototype._write = function (chunk, encoding, cb) {
var self = this
if (self.destroyed) return cb(makeError('cannot write after peer is destroyed', 'ERR_DATA_CHANNEL'))
if (self.connected) {
try {
self.send(chunk)
} catch (err) {
return self.destroy(makeError(err, 'ERR_DATA_CHANNEL'))
}
if (self._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {
self._debug('start backpressure: bufferedAmount %d', self._channel.bufferedAmount)
self._cb = cb
} else {
cb(null)
}
} else {
self._debug('write before connect')
self._chunk = chunk
self._cb = cb
}
}
// When stream finishes writing, close socket. Half open connections are not
// supported.
Peer.prototype._onFinish = function () {
var self = this
if (self.destroyed) return
if (self.connected) {
destroySoon()
} else {
self.once('connect', destroySoon)
}
// Wait a bit before destroying so the socket flushes.
// TODO: is there a more reliable way to accomplish this?
function destroySoon () {
setTimeout(function () {
self.destroy()
}, 1000)
}
}
Peer.prototype._createOffer = function () {
var self = this
if (self.destroyed) return
self._pc.createOffer(function (offer) {
if (self.destroyed) return
offer.sdp = self.sdpTransform(offer.sdp)
self._pc.setLocalDescription(offer, onSuccess, onError)
function onSuccess () {
self._debug('createOffer success')
if (self.destroyed) return
if (self.trickle || self._iceComplete) sendOffer()
else self.once('_iceComplete', sendOffer) // wait for candidates
}
function onError (err) {
self.destroy(makeError(err, 'ERR_SET_LOCAL_DESCRIPTION'))
}
function sendOffer () {
var signal = self._pc.localDescription || offer
self._debug('signal')
self.emit('signal', {
type: signal.type,
sdp: signal.sdp
})
}
}, function (err) { self.destroy(makeError(err, 'ERR_CREATE_OFFER')) }, self.offerConstraints)
}
Peer.prototype._createAnswer = function () {
var self = this
if (self.destroyed) return
self._pc.createAnswer(function (answer) {
if (self.destroyed) return
answer.sdp = self.sdpTransform(answer.sdp)
self._pc.setLocalDescription(answer, onSuccess, onError)
function onSuccess () {
if (self.destroyed) return
if (self.trickle || self._iceComplete) sendAnswer()
else self.once('_iceComplete', sendAnswer)
}
function onError (err) {
self.destroy(makeError(err, 'ERR_SET_LOCAL_DESCRIPTION'))
}
function sendAnswer () {
var signal = self._pc.localDescription || answer
self._debug('signal')
self.emit('signal', {
type: signal.type,
sdp: signal.sdp
})
}
}, function (err) { self.destroy(makeError(err, 'ERR_CREATE_ANSWER')) }, self.answerConstraints)
}
Peer.prototype._onIceStateChange = function () {
var self = this
if (self.destroyed) return
var iceConnectionState = self._pc.iceConnectionState
var iceGatheringState = self._pc.iceGatheringState
self._debug(
'iceStateChange (connection: %s) (gathering: %s)',
iceConnectionState,
iceGatheringState
)
self.emit('iceStateChange', iceConnectionState, iceGatheringState)
if (iceConnectionState === 'connected' || iceConnectionState === 'completed') {
self._pcReady = true
self._maybeReady()
}
if (iceConnectionState === 'failed') {
self.destroy(makeError('Ice connection failed.', 'ERR_ICE_CONNECTION_FAILURE'))
}
if (iceConnectionState === 'closed') {
self.destroy(new Error('Ice connection closed.'))
}
}
Peer.prototype.getStats = function (cb) {
var self = this
// Promise-based getStats() (standard)
if (self._pc.getStats.length === 0) {
self._pc.getStats().then(function (res) {
var reports = []
res.forEach(function (report) {
reports.push(report)
})
cb(null, reports)
}, function (err) { cb(err) })
// Two-parameter callback-based getStats() (deprecated, former standard)
} else if (self._isReactNativeWebrtc) {
self._pc.getStats(null, function (res) {
var reports = []
res.forEach(function (report) {
reports.push(report)
})
cb(null, reports)
}, function (err) { cb(err) })
// Single-parameter callback-based getStats() (non-standard)
} else if (self._pc.getStats.length > 0) {
self._pc.getStats(function (res) {
// If we destroy connection in `connect` callback this code might happen to run when actual connection is already closed
if (self.destroyed) return
var reports = []
res.result().forEach(function (result) {
var report = {}
result.names().forEach(function (name) {
report[name] = result.stat(name)
})
report.id = result.id
report.type = result.type
report.timestamp = result.timestamp
reports.push(report)
})
cb(null, reports)
}, function (err) { cb(err) })
// Unknown browser, skip getStats() since it's anyone's guess which style of
// getStats() they implement.
} else {
cb(null, [])
}
}
Peer.prototype._maybeReady = function () {
var self = this
self._debug('maybeReady pc %s channel %s', self._pcReady, self._channelReady)
if (self.connected || self._connecting || !self._pcReady || !self._channelReady) return
self._connecting = true
// HACK: We can't rely on order here, for details see https://github.com/js-platform/node-webrtc/issues/339
function findCandidatePair () {
if (self.destroyed) return
self.getStats(function (err, items) {
if (self.destroyed) return
// Treat getStats error as non-fatal. It's not essential.
if (err) items = []
var remoteCandidates = {}
var localCandidates = {}
var candidatePairs = {}
var foundSelectedCandidatePair = false
items.forEach(function (item) {
// TODO: Once all browsers support the hyphenated stats report types, remove
// the non-hypenated ones
if (item.type === 'remotecandidate' || item.type === 'remote-candidate') {
remoteCandidates[item.id] = item
}
if (item.type === 'localcandidate' || item.type === 'local-candidate') {
localCandidates[item.id] = item
}
if (item.type === 'candidatepair' || item.type === 'candidate-pair') {
candidatePairs[item.id] = item
}
})
items.forEach(function (item) {
// Spec-compliant
if (item.type === 'transport' && item.selectedCandidatePairId) {
setSelectedCandidatePair(candidatePairs[item.selectedCandidatePairId])
}
// Old implementations
if (
(item.type === 'googCandidatePair' && item.googActiveConnection === 'true') ||
((item.type === 'candidatepair' || item.type === 'candidate-pair') && item.selected)
) {
setSelectedCandidatePair(item)
}
})
function setSelectedCandidatePair (selectedCandidatePair) {
foundSelectedCandidatePair = true
var local = localCandidates[selectedCandidatePair.localCandidateId]
if (local && local.ip) {
// Spec
self.localAddress = local.ip
self.localPort = Number(local.port)
} else if (local && local.ipAddress) {
// Firefox
self.localAddress = local.ipAddress
self.localPort = Number(local.portNumber)
} else if (typeof selectedCandidatePair.googLocalAddress === 'string') {
// TODO: remove this once Chrome 58 is released
local = selectedCandidatePair.googLocalAddress.split(':')
self.localAddress = local[0]
self.localPort = Number(local[1])
}
var remote = remoteCandidates[selectedCandidatePair.remoteCandidateId]
if (remote && remote.ip) {
// Spec
self.remoteAddress = remote.ip
self.remotePort = Number(remote.port)
} else if (remote && remote.ipAddress) {
// Firefox
self.remoteAddress = remote.ipAddress
self.remotePort = Number(remote.portNumber)
} else if (typeof selectedCandidatePair.googRemoteAddress === 'string') {
// TODO: remove this once Chrome 58 is released
remote = selectedCandidatePair.googRemoteAddress.split(':')
self.remoteAddress = remote[0]
self.remotePort = Number(remote[1])
}
self.remoteFamily = 'IPv4'
self._debug(
'connect local: %s:%s remote: %s:%s',
self.localAddress, self.localPort, self.remoteAddress, self.remotePort
)
}
// Ignore candidate pair selection in browsers like Safari 11 that do not have any local or remote candidates
// But wait until at least 1 candidate pair is available
if (!foundSelectedCandidatePair && (!Object.keys(candidatePairs).length || Object.keys(localCandidates).length)) {
setTimeout(findCandidatePair, 100)
return
} else {
self._connecting = false
self.connected = true
}
if (self._chunk) {
try {
self.send(self._chunk)
} catch (err) {
return self.destroy(makeError(err, 'ERR_DATA_CHANNEL'))
}
self._chunk = null
self._debug('sent chunk from "write before connect"')
var cb = self._cb
self._cb = null
cb(null)
}
// If `bufferedAmountLowThreshold` and 'onbufferedamountlow' are unsupported,
// fallback to using setInterval to implement backpressure.
if (typeof self._channel.bufferedAmountLowThreshold !== 'number') {
self._interval = setInterval(function () { self._onInterval() }, 150)
if (self._interval.unref) self._interval.unref()
}
self._debug('connect')
self.emit('connect')
})
}
findCandidatePair()
}
Peer.prototype._onInterval = function () {
var self = this
if (!self._cb || !self._channel || self._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {
return
}
self._onChannelBufferedAmountLow()
}
Peer.prototype._onSignalingStateChange = function () {
var self = this
if (self.destroyed) return
if (self._pc.signalingState === 'stable') {
self._isNegotiating = false
// HACK: Firefox doesn't yet support removing tracks when signalingState !== 'stable'
self._debug('flushing sender queue', self._sendersAwaitingStable)
self._sendersAwaitingStable.forEach(function (sender) {
self.removeTrack(sender)
self._queuedNegotiation = true
})
self._sendersAwaitingStable = []
if (self._queuedNegotiation) {
self._debug('flushing negotiation queue')
self._queuedNegotiation = false
self._needsNegotiation() // negotiate again
}
self._debug('negotiate')
self.emit('negotiate')
}
self._debug('signalingStateChange %s', self._pc.signalingState)
self.emit('signalingStateChange', self._pc.signalingState)
}
Peer.prototype._onIceCandidate = function (event) {
var self = this
if (self.destroyed) return
if (event.candidate && self.trickle) {
self.emit('signal', {
candidate: {
candidate: event.candidate.candidate,
sdpMLineIndex: event.candidate.sdpMLineIndex,
sdpMid: event.candidate.sdpMid
}
})
} else if (!event.candidate) {
self._iceComplete = true
self.emit('_iceComplete')
}
}
Peer.prototype._onChannelMessage = function (event) {
var self = this
if (self.destroyed) return
var data = event.data
if (data instanceof ArrayBuffer) data = Buffer.from(data)
self.push(data)
}
Peer.prototype._onChannelBufferedAmountLow = function () {
var self = this
if (self.destroyed || !self._cb) return
self._debug('ending backpressure: bufferedAmount %d', self._channel.bufferedAmount)
var cb = self._cb
self._cb = null
cb(null)
}
Peer.prototype._onChannelOpen = function () {
var self = this
if (self.connected || self.destroyed) return
self._debug('on channel open')
self._channelReady = true
self._maybeReady()
}
Peer.prototype._onChannelClose = function () {
var self = this
if (self.destroyed) return
self._debug('on channel close')
self.destroy()
}
Peer.prototype._onTrack = function (event) {
var self = this
if (self.destroyed) return
event.streams.forEach(function (eventStream) {
self._debug('on track')
self.emit('track', event.track, eventStream)
self._remoteTracks.push({
track: event.track,
stream: eventStream
})
if (self._remoteStreams.some(function (remoteStream) {
return remoteStream.id === eventStream.id
})) return // Only fire one 'stream' event, even though there may be multiple tracks per stream
self._remoteStreams.push(eventStream)
setTimeout(function () {
self.emit('stream', eventStream) // ensure all tracks have been added
}, 0)
})
}
Peer.prototype._debug = function () {
var self = this
var args = [].slice.call(arguments)
args[0] = '[' + self._id + '] ' + args[0]
debug.apply(null, args)
}
// Transform constraints objects into the new format (unless Chromium)
// TODO: This can be removed when Chromium supports the new format
Peer.prototype._transformConstraints = function (constraints) {
var self = this
if (Object.keys(constraints).length === 0) {
return constraints
}
if ((constraints.mandatory || constraints.optional) && !self._isChromium) {
// convert to new format
// Merge mandatory and optional objects, prioritizing mandatory
var newConstraints = Object.assign({}, constraints.optional, constraints.mandatory)
// fix casing
if (newConstraints.OfferToReceiveVideo !== undefined) {
newConstraints.offerToReceiveVideo = newConstraints.OfferToReceiveVideo
delete newConstraints['OfferToReceiveVideo']
}
if (newConstraints.OfferToReceiveAudio !== undefined) {
newConstraints.offerToReceiveAudio = newConstraints.OfferToReceiveAudio
delete newConstraints['OfferToReceiveAudio']
}
return newConstraints
} else if (!constraints.mandatory && !constraints.optional && self._isChromium) {
// convert to old format
// fix casing
if (constraints.offerToReceiveVideo !== undefined) {
constraints.OfferToReceiveVideo = constraints.offerToReceiveVideo
delete constraints['offerToReceiveVideo']
}
if (constraints.offerToReceiveAudio !== undefined) {
constraints.OfferToReceiveAudio = constraints.offerToReceiveAudio
delete constraints['offerToReceiveAudio']
}
return {
mandatory: constraints // NOTE: All constraints are upgraded to mandatory
}
}
return constraints
}
function makeError (message, code) {
var err = new Error(message)
err.code = code
return err
}
function noop () {}
}).call(this,require("buffer").Buffer)
},{"buffer":27,"debug":120,"get-browser-rtc":56,"inherits":79,"randombytes":96,"readable-stream":105}],120:[function(require,module,exports){
(function (process){
/**
* This is the web browser implementation of `debug()`.
*
* Expose `debug()` as the module.
*/
exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
&& 'undefined' != typeof chrome.storage
? chrome.storage.local
: localstorage();
/**
* Colors.
*/
exports.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'
];
/**
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
* and the Firebug extension (any Firefox version) are known
* to support "%c" CSS customizations.
*
* TODO: add a `localStorage` variable to explicitly enable/disable colors
*/
function useColors() {
// NB: In an Electron preload script, document will be defined but not fully
// initialized. Since we know we're in Chrome, we'll just detect this case
// explicitly
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
return true;
}
// Internet Explorer and Edge do not support colors.
if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
return false;
}
// is webkit? http://stackoverflow.com/a/16459606/376773
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
// is firebug? http://stackoverflow.com/a/398120/376773
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
// is firefox >= v31?
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
// double check webkit in userAgent just in case we are in a worker
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}
/**
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
*/
exports.formatters.j = function(v) {
try {
return JSON.stringify(v);
} catch (err) {
return '[UnexpectedJSONParseError]: ' + err.message;
}
};
/**
* Colorize log arguments if enabled.
*
* @api public
*/
function formatArgs(args) {
var useColors = this.useColors;
args[0] = (useColors ? '%c' : '')
+ this.namespace
+ (useColors ? ' %c' : ' ')
+ args[0]
+ (useColors ? '%c ' : ' ')
+ '+' + exports.humanize(this.diff);
if (!useColors) return;
var c = 'color: ' + this.color;
args.splice(1, 0, c, 'color: inherit')
// the final "%c" is somewhat tricky, because there could be other
// arguments passed either before or after the %c, so we need to
// figure out the correct index to insert the CSS into
var index = 0;
var lastC = 0;
args[0].replace(/%[a-zA-Z%]/g, function(match) {
if ('%%' === match) return;
index++;
if ('%c' === match) {
// we only are interested in the *last* %c
// (the user may have provided their own)
lastC = index;
}
});
args.splice(lastC, 0, c);
}
/**
* Invokes `console.log()` when available.
* No-op when `console.log` is not a "function".
*
* @api public
*/
function log() {
// this hackery is required for IE8/9, where
// the `console.log` function doesn't have 'apply'
return 'object' === typeof console
&& console.log
&& Function.prototype.apply.call(console.log, console, arguments);
}
/**
* Save `namespaces`.
*
* @param {String} namespaces
* @api private
*/
function save(namespaces) {
try {
if (null == namespaces) {
exports.storage.removeItem('debug');
} else {
exports.storage.debug = namespaces;
}
} catch(e) {}
}
/**
* Load `namespaces`.
*
* @return {String} returns the previously persisted debug modes
* @api private
*/
function load() {
var r;
try {
r = exports.storage.debug;
} catch(e) {}
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
if (!r && typeof process !== 'undefined' && 'env' in process) {
r = process.env.DEBUG;
}
return r;
}
/**
* Enable namespaces listed in `localStorage.debug` initially.
*/
exports.enable(load());
/**
* Localstorage attempts to return the localstorage.
*
* This is necessary because safari throws
* when a user disables cookies/localstorage
* and you attempt to access it.
*
* @return {LocalStorage}
* @api private
*/
function localstorage() {
try {
return window.localStorage;
} catch (e) {}
}
}).call(this,require('_process'))
},{"./debug":121,"_process":93}],121:[function(require,module,exports){
arguments[4][51][0].apply(exports,arguments)
},{"dup":51,"ms":122}],122:[function(require,module,exports){
arguments[4][38][0].apply(exports,arguments)
},{"dup":38}],123:[function(require,module,exports){
/**
* Module dependencies.
*/
var url = require('./url');
var parser = require('socket.io-parser');
var Manager = require('./manager');
var debug = require('debug')('socket.io-client');
/**
* Module exports.
*/
module.exports = exports = lookup;
/**
* Managers cache.
*/
var cache = exports.managers = {};
/**
* Looks up an existing `Manager` for multiplexing.
* If the user summons:
*
* `io('http://localhost/a');`
* `io('http://localhost/b');`
*
* We reuse the existing instance based on same scheme/port/host,
* and we initialize sockets for each namespace.
*
* @api public
*/
function lookup (uri, opts) {
if (typeof uri === 'object') {
opts = uri;
uri = undefined;
}
opts = opts || {};
var parsed = url(uri);
var source = parsed.source;
var id = parsed.id;
var path = parsed.path;
var sameNamespace = cache[id] && path in cache[id].nsps;
var newConnection = opts.forceNew || opts['force new connection'] ||
false === opts.multiplex || sameNamespace;
var io;
if (newConnection) {
debug('ignoring socket cache for %s', source);
io = Manager(source, opts);
} else {
if (!cache[id]) {
debug('new io instance for %s', source);
cache[id] = Manager(source, opts);
}
io = cache[id];
}
if (parsed.query && !opts.query) {
opts.query = parsed.query;
}
return io.socket(parsed.path, opts);
}
/**
* Protocol version.
*
* @api public
*/
exports.protocol = parser.protocol;
/**
* `connect`.
*
* @param {String} uri
* @api public
*/
exports.connect = lookup;
/**
* Expose constructors for standalone build.
*
* @api public
*/
exports.Manager = require('./manager');
exports.Socket = require('./socket');
},{"./manager":124,"./socket":126,"./url":127,"debug":39,"socket.io-parser":129}],124:[function(require,module,exports){
/**
* Module dependencies.
*/
var eio = require('engine.io-client');
var Socket = require('./socket');
var Emitter = require('component-emitter');
var parser = require('socket.io-parser');
var on = require('./on');
var bind = require('component-bind');
var debug = require('debug')('socket.io-client:manager');
var indexOf = require('indexof');
var Backoff = require('backo2');
/**
* IE6+ hasOwnProperty
*/
var has = Object.prototype.hasOwnProperty;
/**
* Module exports
*/
module.exports = Manager;
/**
* `Manager` constructor.
*
* @param {String} engine instance or engine uri/opts
* @param {Object} options
* @api public
*/
function Manager (uri, opts) {
if (!(this instanceof Manager)) return new Manager(uri, opts);
if (uri && ('object' === typeof uri)) {
opts = uri;
uri = undefined;
}
opts = opts || {};
opts.path = opts.path || '/socket.io';
this.nsps = {};
this.subs = [];
this.opts = opts;
this.reconnection(opts.reconnection !== false);
this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);
this.reconnectionDelay(opts.reconnectionDelay || 1000);
this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);
this.randomizationFactor(opts.randomizationFactor || 0.5);
this.backoff = new Backoff({
min: this.reconnectionDelay(),
max: this.reconnectionDelayMax(),
jitter: this.randomizationFactor()
});
this.timeout(null == opts.timeout ? 20000 : opts.timeout);
this.readyState = 'closed';
this.uri = uri;
this.connecting = [];
this.lastPing = null;
this.encoding = false;
this.packetBuffer = [];
var _parser = opts.parser || parser;
this.encoder = new _parser.Encoder();
this.decoder = new _parser.Decoder();
this.autoConnect = opts.autoConnect !== false;
if (this.autoConnect) this.open();
}
/**
* Propagate given event to sockets and emit on `this`
*
* @api private
*/
Manager.prototype.emitAll = function () {
this.emit.apply(this, arguments);
for (var nsp in this.nsps) {
if (has.call(this.nsps, nsp)) {
this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);
}
}
};
/**
* Update `socket.id` of all sockets
*
* @api private
*/
Manager.prototype.updateSocketIds = function () {
for (var nsp in this.nsps) {
if (has.call(this.nsps, nsp)) {
this.nsps[nsp].id = this.generateId(nsp);
}
}
};
/**
* generate `socket.id` for the given `nsp`
*
* @param {String} nsp
* @return {String}
* @api private
*/
Manager.prototype.generateId = function (nsp) {
return (nsp === '/' ? '' : (nsp + '#')) + this.engine.id;
};
/**
* Mix in `Emitter`.
*/
Emitter(Manager.prototype);
/**
* Sets the `reconnection` config.
*
* @param {Boolean} true/false if it should automatically reconnect
* @return {Manager} self or value
* @api public
*/
Manager.prototype.reconnection = function (v) {
if (!arguments.length) return this._reconnection;
this._reconnection = !!v;
return this;
};
/**
* Sets the reconnection attempts config.
*
* @param {Number} max reconnection attempts before giving up
* @return {Manager} self or value
* @api public
*/
Manager.prototype.reconnectionAttempts = function (v) {
if (!arguments.length) return this._reconnectionAttempts;
this._reconnectionAttempts = v;
return this;
};
/**
* Sets the delay between reconnections.
*
* @param {Number} delay
* @return {Manager} self or value
* @api public
*/
Manager.prototype.reconnectionDelay = function (v) {
if (!arguments.length) return this._reconnectionDelay;
this._reconnectionDelay = v;
this.backoff && this.backoff.setMin(v);
return this;
};
Manager.prototype.randomizationFactor = function (v) {
if (!arguments.length) return this._randomizationFactor;
this._randomizationFactor = v;
this.backoff && this.backoff.setJitter(v);
return this;
};
/**
* Sets the maximum delay between reconnections.
*
* @param {Number} delay
* @return {Manager} self or value
* @api public
*/
Manager.prototype.reconnectionDelayMax = function (v) {
if (!arguments.length) return this._reconnectionDelayMax;
this._reconnectionDelayMax = v;
this.backoff && this.backoff.setMax(v);
return this;
};
/**
* Sets the connection timeout. `false` to disable
*
* @return {Manager} self or value
* @api public
*/
Manager.prototype.timeout = function (v) {
if (!arguments.length) return this._timeout;
this._timeout = v;
return this;
};
/**
* Starts trying to reconnect if reconnection is enabled and we have not
* started reconnecting yet
*
* @api private
*/
Manager.prototype.maybeReconnectOnOpen = function () {
// Only try to reconnect if it's the first time we're connecting
if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {
// keeps reconnection from firing twice for the same reconnection loop
this.reconnect();
}
};
/**
* Sets the current transport `socket`.
*
* @param {Function} optional, callback
* @return {Manager} self
* @api public
*/
Manager.prototype.open =
Manager.prototype.connect = function (fn, opts) {
debug('readyState %s', this.readyState);
if (~this.readyState.indexOf('open')) return this;
debug('opening %s', this.uri);
this.engine = eio(this.uri, this.opts);
var socket = this.engine;
var self = this;
this.readyState = 'opening';
this.skipReconnect = false;
// emit `open`
var openSub = on(socket, 'open', function () {
self.onopen();
fn && fn();
});
// emit `connect_error`
var errorSub = on(socket, 'error', function (data) {
debug('connect_error');
self.cleanup();
self.readyState = 'closed';
self.emitAll('connect_error', data);
if (fn) {
var err = new Error('Connection error');
err.data = data;
fn(err);
} else {
// Only do this if there is no fn to handle the error
self.maybeReconnectOnOpen();
}
});
// emit `connect_timeout`
if (false !== this._timeout) {
var timeout = this._timeout;
debug('connect attempt will timeout after %d', timeout);
// set timer
var timer = setTimeout(function () {
debug('connect attempt timed out after %d', timeout);
openSub.destroy();
socket.close();
socket.emit('error', 'timeout');
self.emitAll('connect_timeout', timeout);
}, timeout);
this.subs.push({
destroy: function () {
clearTimeout(timer);
}
});
}
this.subs.push(openSub);
this.subs.push(errorSub);
return this;
};
/**
* Called upon transport open.
*
* @api private
*/
Manager.prototype.onopen = function () {
debug('open');
// clear old subs
this.cleanup();
// mark as open
this.readyState = 'open';
this.emit('open');
// add new subs
var socket = this.engine;
this.subs.push(on(socket, 'data', bind(this, 'ondata')));
this.subs.push(on(socket, 'ping', bind(this, 'onping')));
this.subs.push(on(socket, 'pong', bind(this, 'onpong')));
this.subs.push(on(socket, 'error', bind(this, 'onerror')));
this.subs.push(on(socket, 'close', bind(this, 'onclose')));
this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));
};
/**
* Called upon a ping.
*
* @api private
*/
Manager.prototype.onping = function () {
this.lastPing = new Date();
this.emitAll('ping');
};
/**
* Called upon a packet.
*
* @api private
*/
Manager.prototype.onpong = function () {
this.emitAll('pong', new Date() - this.lastPing);
};
/**
* Called with data.
*
* @api private
*/
Manager.prototype.ondata = function (data) {
this.decoder.add(data);
};
/**
* Called when parser fully decodes a packet.
*
* @api private
*/
Manager.prototype.ondecoded = function (packet) {
this.emit('packet', packet);
};
/**
* Called upon socket error.
*
* @api private
*/
Manager.prototype.onerror = function (err) {
debug('error', err);
this.emitAll('error', err);
};
/**
* Creates a new socket for the given `nsp`.
*
* @return {Socket}
* @api public
*/
Manager.prototype.socket = function (nsp, opts) {
var socket = this.nsps[nsp];
if (!socket) {
socket = new Socket(this, nsp, opts);
this.nsps[nsp] = socket;
var self = this;
socket.on('connecting', onConnecting);
socket.on('connect', function () {
socket.id = self.generateId(nsp);
});
if (this.autoConnect) {
// manually call here since connecting event is fired before listening
onConnecting();
}
}
function onConnecting () {
if (!~indexOf(self.connecting, socket)) {
self.connecting.push(socket);
}
}
return socket;
};
/**
* Called upon a socket close.
*
* @param {Socket} socket
*/
Manager.prototype.destroy = function (socket) {
var index = indexOf(this.connecting, socket);
if (~index) this.connecting.splice(index, 1);
if (this.connecting.length) return;
this.close();
};
/**
* Writes a packet.
*
* @param {Object} packet
* @api private
*/
Manager.prototype.packet = function (packet) {
debug('writing packet %j', packet);
var self = this;
if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;
if (!self.encoding) {
// encode, then write to engine with result
self.encoding = true;
this.encoder.encode(packet, function (encodedPackets) {
for (var i = 0; i < encodedPackets.length; i++) {
self.engine.write(encodedPackets[i], packet.options);
}
self.encoding = false;
self.processPacketQueue();
});
} else { // add packet to the queue
self.packetBuffer.push(packet);
}
};
/**
* If packet buffer is non-empty, begins encoding the
* next packet in line.
*
* @api private
*/
Manager.prototype.processPacketQueue = function () {
if (this.packetBuffer.length > 0 && !this.encoding) {
var pack = this.packetBuffer.shift();
this.packet(pack);
}
};
/**
* Clean up transport subscriptions and packet buffer.
*
* @api private
*/
Manager.prototype.cleanup = function () {
debug('cleanup');
var subsLength = this.subs.length;
for (var i = 0; i < subsLength; i++) {
var sub = this.subs.shift();
sub.destroy();
}
this.packetBuffer = [];
this.encoding = false;
this.lastPing = null;
this.decoder.destroy();
};
/**
* Close the current socket.
*
* @api private
*/
Manager.prototype.close =
Manager.prototype.disconnect = function () {
debug('disconnect');
this.skipReconnect = true;
this.reconnecting = false;
if ('opening' === this.readyState) {
// `onclose` will not fire because
// an open event never happened
this.cleanup();
}
this.backoff.reset();
this.readyState = 'closed';
if (this.engine) this.engine.close();
};
/**
* Called upon engine close.
*
* @api private
*/
Manager.prototype.onclose = function (reason) {
debug('onclose');
this.cleanup();
this.backoff.reset();
this.readyState = 'closed';
this.emit('close', reason);
if (this._reconnection && !this.skipReconnect) {
this.reconnect();
}
};
/**
* Attempt a reconnection.
*
* @api private
*/
Manager.prototype.reconnect = function () {
if (this.reconnecting || this.skipReconnect) return this;
var self = this;
if (this.backoff.attempts >= this._reconnectionAttempts) {
debug('reconnect failed');
this.backoff.reset();
this.emitAll('reconnect_failed');
this.reconnecting = false;
} else {
var delay = this.backoff.duration();
debug('will wait %dms before reconnect attempt', delay);
this.reconnecting = true;
var timer = setTimeout(function () {
if (self.skipReconnect) return;
debug('attempting reconnect');
self.emitAll('reconnect_attempt', self.backoff.attempts);
self.emitAll('reconnecting', self.backoff.attempts);
// check again for the case socket closed in above events
if (self.skipReconnect) return;
self.open(function (err) {
if (err) {
debug('reconnect attempt error');
self.reconnecting = false;
self.reconnect();
self.emitAll('reconnect_error', err.data);
} else {
debug('reconnect success');
self.onreconnect();
}
});
}, delay);
this.subs.push({
destroy: function () {
clearTimeout(timer);
}
});
}
};
/**
* Called upon successful reconnect.
*
* @api private
*/
Manager.prototype.onreconnect = function () {
var attempt = this.backoff.attempts;
this.reconnecting = false;
this.backoff.reset();
this.updateSocketIds();
this.emitAll('reconnect', attempt);
};
},{"./on":125,"./socket":126,"backo2":21,"component-bind":34,"component-emitter":35,"debug":39,"engine.io-client":41,"indexof":78,"socket.io-parser":129}],125:[function(require,module,exports){
/**
* Module exports.
*/
module.exports = on;
/**
* Helper for subscriptions.
*
* @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`
* @param {String} event name
* @param {Function} callback
* @api public
*/
function on (obj, ev, fn) {
obj.on(ev, fn);
return {
destroy: function () {
obj.removeListener(ev, fn);
}
};
}
},{}],126:[function(require,module,exports){
/**
* Module dependencies.
*/
var parser = require('socket.io-parser');
var Emitter = require('component-emitter');
var toArray = require('to-array');
var on = require('./on');
var bind = require('component-bind');
var debug = require('debug')('socket.io-client:socket');
var parseqs = require('parseqs');
/**
* Module exports.
*/
module.exports = exports = Socket;
/**
* Internal events (blacklisted).
* These events can't be emitted by the user.
*
* @api private
*/
var events = {
connect: 1,
connect_error: 1,
connect_timeout: 1,
connecting: 1,
disconnect: 1,
error: 1,
reconnect: 1,
reconnect_attempt: 1,
reconnect_failed: 1,
reconnect_error: 1,
reconnecting: 1,
ping: 1,
pong: 1
};
/**
* Shortcut to `Emitter#emit`.
*/
var emit = Emitter.prototype.emit;
/**
* `Socket` constructor.
*
* @api public
*/
function Socket (io, nsp, opts) {
this.io = io;
this.nsp = nsp;
this.json = this; // compat
this.ids = 0;
this.acks = {};
this.receiveBuffer = [];
this.sendBuffer = [];
this.connected = false;
this.disconnected = true;
if (opts && opts.query) {
this.query = opts.query;
}
if (this.io.autoConnect) this.open();
}
/**
* Mix in `Emitter`.
*/
Emitter(Socket.prototype);
/**
* Subscribe to open, close and packet events
*
* @api private
*/
Socket.prototype.subEvents = function () {
if (this.subs) return;
var io = this.io;
this.subs = [
on(io, 'open', bind(this, 'onopen')),
on(io, 'packet', bind(this, 'onpacket')),
on(io, 'close', bind(this, 'onclose'))
];
};
/**
* "Opens" the socket.
*
* @api public
*/
Socket.prototype.open =
Socket.prototype.connect = function () {
if (this.connected) return this;
this.subEvents();
this.io.open(); // ensure open
if ('open' === this.io.readyState) this.onopen();
this.emit('connecting');
return this;
};
/**
* Sends a `message` event.
*
* @return {Socket} self
* @api public
*/
Socket.prototype.send = function () {
var args = toArray(arguments);
args.unshift('message');
this.emit.apply(this, args);
return this;
};
/**
* Override `emit`.
* If the event is in `events`, it's emitted normally.
*
* @param {String} event name
* @return {Socket} self
* @api public
*/
Socket.prototype.emit = function (ev) {
if (events.hasOwnProperty(ev)) {
emit.apply(this, arguments);
return this;
}
var args = toArray(arguments);
var packet = { type: parser.EVENT, data: args };
packet.options = {};
packet.options.compress = !this.flags || false !== this.flags.compress;
// event ack callback
if ('function' === typeof args[args.length - 1]) {
debug('emitting packet with ack id %d', this.ids);
this.acks[this.ids] = args.pop();
packet.id = this.ids++;
}
if (this.connected) {
this.packet(packet);
} else {
this.sendBuffer.push(packet);
}
delete this.flags;
return this;
};
/**
* Sends a packet.
*
* @param {Object} packet
* @api private
*/
Socket.prototype.packet = function (packet) {
packet.nsp = this.nsp;
this.io.packet(packet);
};
/**
* Called upon engine `open`.
*
* @api private
*/
Socket.prototype.onopen = function () {
debug('transport is open - connecting');
// write connect packet if necessary
if ('/' !== this.nsp) {
if (this.query) {
var query = typeof this.query === 'object' ? parseqs.encode(this.query) : this.query;
debug('sending connect packet with query %s', query);
this.packet({type: parser.CONNECT, query: query});
} else {
this.packet({type: parser.CONNECT});
}
}
};
/**
* Called upon engine `close`.
*
* @param {String} reason
* @api private
*/
Socket.prototype.onclose = function (reason) {
debug('close (%s)', reason);
this.connected = false;
this.disconnected = true;
delete this.id;
this.emit('disconnect', reason);
};
/**
* Called with socket packet.
*
* @param {Object} packet
* @api private
*/
Socket.prototype.onpacket = function (packet) {
if (packet.nsp !== this.nsp) return;
switch (packet.type) {
case parser.CONNECT:
this.onconnect();
break;
case parser.EVENT:
this.onevent(packet);
break;
case parser.BINARY_EVENT:
this.onevent(packet);
break;
case parser.ACK:
this.onack(packet);
break;
case parser.BINARY_ACK:
this.onack(packet);
break;
case parser.DISCONNECT:
this.ondisconnect();
break;
case parser.ERROR:
this.emit('error', packet.data);
break;
}
};
/**
* Called upon a server event.
*
* @param {Object} packet
* @api private
*/
Socket.prototype.onevent = function (packet) {
var args = packet.data || [];
debug('emitting event %j', args);
if (null != packet.id) {
debug('attaching ack callback to event');
args.push(this.ack(packet.id));
}
if (this.connected) {
emit.apply(this, args);
} else {
this.receiveBuffer.push(args);
}
};
/**
* Produces an ack callback to emit with an event.
*
* @api private
*/
Socket.prototype.ack = function (id) {
var self = this;
var sent = false;
return function () {
// prevent double callbacks
if (sent) return;
sent = true;
var args = toArray(arguments);
debug('sending ack %j', args);
self.packet({
type: parser.ACK,
id: id,
data: args
});
};
};
/**
* Called upon a server acknowlegement.
*
* @param {Object} packet
* @api private
*/
Socket.prototype.onack = function (packet) {
var ack = this.acks[packet.id];
if ('function' === typeof ack) {
debug('calling ack %s with %j', packet.id, packet.data);
ack.apply(this, packet.data);
delete this.acks[packet.id];
} else {
debug('bad ack %s', packet.id);
}
};
/**
* Called upon server connect.
*
* @api private
*/
Socket.prototype.onconnect = function () {
this.connected = true;
this.disconnected = false;
this.emit('connect');
this.emitBuffered();
};
/**
* Emit buffered events (received and emitted).
*
* @api private
*/
Socket.prototype.emitBuffered = function () {
var i;
for (i = 0; i < this.receiveBuffer.length; i++) {
emit.apply(this, this.receiveBuffer[i]);
}
this.receiveBuffer = [];
for (i = 0; i < this.sendBuffer.length; i++) {
this.packet(this.sendBuffer[i]);
}
this.sendBuffer = [];
};
/**
* Called upon server disconnect.
*
* @api private
*/
Socket.prototype.ondisconnect = function () {
debug('server disconnect (%s)', this.nsp);
this.destroy();
this.onclose('io server disconnect');
};
/**
* Called upon forced client/server side disconnections,
* this method ensures the manager stops tracking us and
* that reconnections don't get triggered for this.
*
* @api private.
*/
Socket.prototype.destroy = function () {
if (this.subs) {
// clean subscriptions to avoid reconnections
for (var i = 0; i < this.subs.length; i++) {
this.subs[i].destroy();
}
this.subs = null;
}
this.io.destroy(this);
};
/**
* Disconnects the socket manually.
*
* @return {Socket} self
* @api public
*/
Socket.prototype.close =
Socket.prototype.disconnect = function () {
if (this.connected) {
debug('performing disconnect (%s)', this.nsp);
this.packet({ type: parser.DISCONNECT });
}
// remove socket from pool
this.destroy();
if (this.connected) {
// fire events
this.onclose('io client disconnect');
}
return this;
};
/**
* Sets the compress flag.
*
* @param {Boolean} if `true`, compresses the sending data
* @return {Socket} self
* @api public
*/
Socket.prototype.compress = function (compress) {
this.flags = this.flags || {};
this.flags.compress = compress;
return this;
};
},{"./on":125,"component-bind":34,"component-emitter":35,"debug":39,"parseqs":87,"socket.io-parser":129,"to-array":139}],127:[function(require,module,exports){
(function (global){
/**
* Module dependencies.
*/
var parseuri = require('parseuri');
var debug = require('debug')('socket.io-client:url');
/**
* Module exports.
*/
module.exports = url;
/**
* URL parser.
*
* @param {String} url
* @param {Object} An object meant to mimic window.location.
* Defaults to window.location.
* @api public
*/
function url (uri, loc) {
var obj = uri;
// default to window.location
loc = loc || global.location;
if (null == uri) uri = loc.protocol + '//' + loc.host;
// relative path support
if ('string' === typeof uri) {
if ('/' === uri.charAt(0)) {
if ('/' === uri.charAt(1)) {
uri = loc.protocol + uri;
} else {
uri = loc.host + uri;
}
}
if (!/^(https?|wss?):\/\//.test(uri)) {
debug('protocol-less url %s', uri);
if ('undefined' !== typeof loc) {
uri = loc.protocol + '//' + uri;
} else {
uri = 'https://' + uri;
}
}
// parse
debug('parse %s', uri);
obj = parseuri(uri);
}
// make sure we treat `localhost:80` and `localhost` equally
if (!obj.port) {
if (/^(http|ws)$/.test(obj.protocol)) {
obj.port = '80';
} else if (/^(http|ws)s$/.test(obj.protocol)) {
obj.port = '443';
}
}
obj.path = obj.path || '/';
var ipv6 = obj.host.indexOf(':') !== -1;
var host = ipv6 ? '[' + obj.host + ']' : obj.host;
// define unique id
obj.id = obj.protocol + '://' + host + ':' + obj.port;
// define href
obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : (':' + obj.port));
return obj;
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"debug":39,"parseuri":88}],128:[function(require,module,exports){
(function (global){
/*global Blob,File*/
/**
* Module requirements
*/
var isArray = require('isarray');
var isBuf = require('./is-buffer');
var toString = Object.prototype.toString;
var withNativeBlob = typeof global.Blob === 'function' || toString.call(global.Blob) === '[object BlobConstructor]';
var withNativeFile = typeof global.File === 'function' || toString.call(global.File) === '[object FileConstructor]';
/**
* Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.
* Anything with blobs or files should be fed through removeBlobs before coming
* here.
*
* @param {Object} packet - socket.io event packet
* @return {Object} with deconstructed packet and list of buffers
* @api public
*/
exports.deconstructPacket = function(packet) {
var buffers = [];
var packetData = packet.data;
var pack = packet;
pack.data = _deconstructPacket(packetData, buffers);
pack.attachments = buffers.length; // number of binary 'attachments'
return {packet: pack, buffers: buffers};
};
function _deconstructPacket(data, buffers) {
if (!data) return data;
if (isBuf(data)) {
var placeholder = { _placeholder: true, num: buffers.length };
buffers.push(data);
return placeholder;
} else if (isArray(data)) {
var newData = new Array(data.length);
for (var i = 0; i < data.length; i++) {
newData[i] = _deconstructPacket(data[i], buffers);
}
return newData;
} else if (typeof data === 'object' && !(data instanceof Date)) {
var newData = {};
for (var key in data) {
newData[key] = _deconstructPacket(data[key], buffers);
}
return newData;
}
return data;
}
/**
* Reconstructs a binary packet from its placeholder packet and buffers
*
* @param {Object} packet - event packet with placeholders
* @param {Array} buffers - binary buffers to put in placeholder positions
* @return {Object} reconstructed packet
* @api public
*/
exports.reconstructPacket = function(packet, buffers) {
packet.data = _reconstructPacket(packet.data, buffers);
packet.attachments = undefined; // no longer useful
return packet;
};
function _reconstructPacket(data, buffers) {
if (!data) return data;
if (data && data._placeholder) {
return buffers[data.num]; // appropriate buffer (should be natural order anyway)
} else if (isArray(data)) {
for (var i = 0; i < data.length; i++) {
data[i] = _reconstructPacket(data[i], buffers);
}
} else if (typeof data === 'object') {
for (var key in data) {
data[key] = _reconstructPacket(data[key], buffers);
}
}
return data;
}
/**
* Asynchronously removes Blobs or Files from data via
* FileReader's readAsArrayBuffer method. Used before encoding
* data as msgpack. Calls callback with the blobless data.
*
* @param {Object} data
* @param {Function} callback
* @api private
*/
exports.removeBlobs = function(data, callback) {
function _removeBlobs(obj, curKey, containingObject) {
if (!obj) return obj;
// convert any blob
if ((withNativeBlob && obj instanceof Blob) ||
(withNativeFile && obj instanceof File)) {
pendingBlobs++;
// async filereader
var fileReader = new FileReader();
fileReader.onload = function() { // this.result == arraybuffer
if (containingObject) {
containingObject[curKey] = this.result;
}
else {
bloblessData = this.result;
}
// if nothing pending its callback time
if(! --pendingBlobs) {
callback(bloblessData);
}
};
fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer
} else if (isArray(obj)) { // handle array
for (var i = 0; i < obj.length; i++) {
_removeBlobs(obj[i], i, obj);
}
} else if (typeof obj === 'object' && !isBuf(obj)) { // and object
for (var key in obj) {
_removeBlobs(obj[key], key, obj);
}
}
}
var pendingBlobs = 0;
var bloblessData = data;
_removeBlobs(bloblessData);
if (!pendingBlobs) {
callback(bloblessData);
}
};
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./is-buffer":130,"isarray":131}],129:[function(require,module,exports){
/**
* Module dependencies.
*/
var debug = require('debug')('socket.io-parser');
var Emitter = require('component-emitter');
var hasBin = require('has-binary2');
var binary = require('./binary');
var isBuf = require('./is-buffer');
/**
* Protocol version.
*
* @api public
*/
exports.protocol = 4;
/**
* Packet types.
*
* @api public
*/
exports.types = [
'CONNECT',
'DISCONNECT',
'EVENT',
'ACK',
'ERROR',
'BINARY_EVENT',
'BINARY_ACK'
];
/**
* Packet type `connect`.
*
* @api public
*/
exports.CONNECT = 0;
/**
* Packet type `disconnect`.
*
* @api public
*/
exports.DISCONNECT = 1;
/**
* Packet type `event`.
*
* @api public
*/
exports.EVENT = 2;
/**
* Packet type `ack`.
*
* @api public
*/
exports.ACK = 3;
/**
* Packet type `error`.
*
* @api public
*/
exports.ERROR = 4;
/**
* Packet type 'binary event'
*
* @api public
*/
exports.BINARY_EVENT = 5;
/**
* Packet type `binary ack`. For acks with binary arguments.
*
* @api public
*/
exports.BINARY_ACK = 6;
/**
* Encoder constructor.
*
* @api public
*/
exports.Encoder = Encoder;
/**
* Decoder constructor.
*
* @api public
*/
exports.Decoder = Decoder;
/**
* A socket.io Encoder instance
*
* @api public
*/
function Encoder() {}
/**
* Encode a packet as a single string if non-binary, or as a
* buffer sequence, depending on packet type.
*
* @param {Object} obj - packet object
* @param {Function} callback - function to handle encodings (likely engine.write)
* @return Calls callback with Array of encodings
* @api public
*/
Encoder.prototype.encode = function(obj, callback){
if ((obj.type === exports.EVENT || obj.type === exports.ACK) && hasBin(obj.data)) {
obj.type = obj.type === exports.EVENT ? exports.BINARY_EVENT : exports.BINARY_ACK;
}
debug('encoding packet %j', obj);
if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {
encodeAsBinary(obj, callback);
}
else {
var encoding = encodeAsString(obj);
callback([encoding]);
}
};
/**
* Encode packet as string.
*
* @param {Object} packet
* @return {String} encoded
* @api private
*/
function encodeAsString(obj) {
// first is type
var str = '' + obj.type;
// attachments if we have them
if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {
str += obj.attachments + '-';
}
// if we have a namespace other than `/`
// we append it followed by a comma `,`
if (obj.nsp && '/' !== obj.nsp) {
str += obj.nsp + ',';
}
// immediately followed by the id
if (null != obj.id) {
str += obj.id;
}
// json data
if (null != obj.data) {
str += JSON.stringify(obj.data);
}
debug('encoded %j as %s', obj, str);
return str;
}
/**
* Encode packet as 'buffer sequence' by removing blobs, and
* deconstructing packet into object with placeholders and
* a list of buffers.
*
* @param {Object} packet
* @return {Buffer} encoded
* @api private
*/
function encodeAsBinary(obj, callback) {
function writeEncoding(bloblessData) {
var deconstruction = binary.deconstructPacket(bloblessData);
var pack = encodeAsString(deconstruction.packet);
var buffers = deconstruction.buffers;
buffers.unshift(pack); // add packet info to beginning of data list
callback(buffers); // write all the buffers
}
binary.removeBlobs(obj, writeEncoding);
}
/**
* A socket.io Decoder instance
*
* @return {Object} decoder
* @api public
*/
function Decoder() {
this.reconstructor = null;
}
/**
* Mix in `Emitter` with Decoder.
*/
Emitter(Decoder.prototype);
/**
* Decodes an ecoded packet string into packet JSON.
*
* @param {String} obj - encoded packet
* @return {Object} packet
* @api public
*/
Decoder.prototype.add = function(obj) {
var packet;
if (typeof obj === 'string') {
packet = decodeString(obj);
if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) { // binary packet's json
this.reconstructor = new BinaryReconstructor(packet);
// no attachments, labeled binary but no binary data to follow
if (this.reconstructor.reconPack.attachments === 0) {
this.emit('decoded', packet);
}
} else { // non-binary full packet
this.emit('decoded', packet);
}
}
else if (isBuf(obj) || obj.base64) { // raw binary data
if (!this.reconstructor) {
throw new Error('got binary data when not reconstructing a packet');
} else {
packet = this.reconstructor.takeBinaryData(obj);
if (packet) { // received final buffer
this.reconstructor = null;
this.emit('decoded', packet);
}
}
}
else {
throw new Error('Unknown type: ' + obj);
}
};
/**
* Decode a packet String (JSON data)
*
* @param {String} str
* @return {Object} packet
* @api private
*/
function decodeString(str) {
var i = 0;
// look up type
var p = {
type: Number(str.charAt(0))
};
if (null == exports.types[p.type]) return error();
// look up attachments if type binary
if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) {
var buf = '';
while (str.charAt(++i) !== '-') {
buf += str.charAt(i);
if (i == str.length) break;
}
if (buf != Number(buf) || str.charAt(i) !== '-') {
throw new Error('Illegal attachments');
}
p.attachments = Number(buf);
}
// look up namespace (if any)
if ('/' === str.charAt(i + 1)) {
p.nsp = '';
while (++i) {
var c = str.charAt(i);
if (',' === c) break;
p.nsp += c;
if (i === str.length) break;
}
} else {
p.nsp = '/';
}
// look up id
var next = str.charAt(i + 1);
if ('' !== next && Number(next) == next) {
p.id = '';
while (++i) {
var c = str.charAt(i);
if (null == c || Number(c) != c) {
--i;
break;
}
p.id += str.charAt(i);
if (i === str.length) break;
}
p.id = Number(p.id);
}
// look up json data
if (str.charAt(++i)) {
p = tryParse(p, str.substr(i));
}
debug('decoded %s as %j', str, p);
return p;
}
function tryParse(p, str) {
try {
p.data = JSON.parse(str);
} catch(e){
return error();
}
return p;
}
/**
* Deallocates a parser's resources
*
* @api public
*/
Decoder.prototype.destroy = function() {
if (this.reconstructor) {
this.reconstructor.finishedReconstruction();
}
};
/**
* A manager of a binary event's 'buffer sequence'. Should
* be constructed whenever a packet of type BINARY_EVENT is
* decoded.
*
* @param {Object} packet
* @return {BinaryReconstructor} initialized reconstructor
* @api private
*/
function BinaryReconstructor(packet) {
this.reconPack = packet;
this.buffers = [];
}
/**
* Method to be called when binary data received from connection
* after a BINARY_EVENT packet.
*
* @param {Buffer | ArrayBuffer} binData - the raw binary data received
* @return {null | Object} returns null if more binary data is expected or
* a reconstructed packet object if all buffers have been received.
* @api private
*/
BinaryReconstructor.prototype.takeBinaryData = function(binData) {
this.buffers.push(binData);
if (this.buffers.length === this.reconPack.attachments) { // done with buffer list
var packet = binary.reconstructPacket(this.reconPack, this.buffers);
this.finishedReconstruction();
return packet;
}
return null;
};
/**
* Cleans up binary packet reconstruction variables.
*
* @api private
*/
BinaryReconstructor.prototype.finishedReconstruction = function() {
this.reconPack = null;
this.buffers = [];
};
function error() {
return {
type: exports.ERROR,
data: 'parser error'
};
}
},{"./binary":128,"./is-buffer":130,"component-emitter":35,"debug":39,"has-binary2":57}],130:[function(require,module,exports){
(function (global){
module.exports = isBuf;
/**
* Returns true if obj is a buffer or an arraybuffer.
*
* @api private
*/
function isBuf(obj) {
return (global.Buffer && global.Buffer.isBuffer(obj)) ||
(global.ArrayBuffer && obj instanceof ArrayBuffer);
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],131:[function(require,module,exports){
arguments[4][58][0].apply(exports,arguments)
},{"dup":58}],132:[function(require,module,exports){
'use strict';
var Buffer = require('safe-buffer').Buffer;
var isEncoding = Buffer.isEncoding || function (encoding) {
encoding = '' + encoding;
switch (encoding && encoding.toLowerCase()) {
case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
return true;
default:
return false;
}
};
function _normalizeEncoding(enc) {
if (!enc) return 'utf8';
var retried;
while (true) {
switch (enc) {
case 'utf8':
case 'utf-8':
return 'utf8';
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return 'utf16le';
case 'latin1':
case 'binary':
return 'latin1';
case 'base64':
case 'ascii':
case 'hex':
return enc;
default:
if (retried) return; // undefined
enc = ('' + enc).toLowerCase();
retried = true;
}
}
};
// Do not cache `Buffer.isEncoding` when checking encoding names as some
// modules monkey-patch it to support additional encodings
function normalizeEncoding(enc) {
var nenc = _normalizeEncoding(enc);
if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
return nenc || enc;
}
// StringDecoder provides an interface for efficiently splitting a series of
// buffers into a series of JS strings without breaking apart multi-byte
// characters.
exports.StringDecoder = StringDecoder;
function StringDecoder(encoding) {
this.encoding = normalizeEncoding(encoding);
var nb;
switch (this.encoding) {
case 'utf16le':
this.text = utf16Text;
this.end = utf16End;
nb = 4;
break;
case 'utf8':
this.fillLast = utf8FillLast;
nb = 4;
break;
case 'base64':
this.text = base64Text;
this.end = base64End;
nb = 3;
break;
default:
this.write = simpleWrite;
this.end = simpleEnd;
return;
}
this.lastNeed = 0;
this.lastTotal = 0;
this.lastChar = Buffer.allocUnsafe(nb);
}
StringDecoder.prototype.write = function (buf) {
if (buf.length === 0) return '';
var r;
var i;
if (this.lastNeed) {
r = this.fillLast(buf);
if (r === undefined) return '';
i = this.lastNeed;
this.lastNeed = 0;
} else {
i = 0;
}
if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
return r || '';
};
StringDecoder.prototype.end = utf8End;
// Returns only complete characters in a Buffer
StringDecoder.prototype.text = utf8Text;
// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
StringDecoder.prototype.fillLast = function (buf) {
if (this.lastNeed <= buf.length) {
buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
return this.lastChar.toString(this.encoding, 0, this.lastTotal);
}
buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
this.lastNeed -= buf.length;
};
// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
// continuation byte.
function utf8CheckByte(byte) {
if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
return -1;
}
// Checks at most 3 bytes at the end of a Buffer in order to detect an
// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
// needed to complete the UTF-8 character (if applicable) are returned.
function utf8CheckIncomplete(self, buf, i) {
var j = buf.length - 1;
if (j < i) return 0;
var nb = utf8CheckByte(buf[j]);
if (nb >= 0) {
if (nb > 0) self.lastNeed = nb - 1;
return nb;
}
if (--j < i) return 0;
nb = utf8CheckByte(buf[j]);
if (nb >= 0) {
if (nb > 0) self.lastNeed = nb - 2;
return nb;
}
if (--j < i) return 0;
nb = utf8CheckByte(buf[j]);
if (nb >= 0) {
if (nb > 0) {
if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
}
return nb;
}
return 0;
}
// Validates as many continuation bytes for a multi-byte UTF-8 character as
// needed or are available. If we see a non-continuation byte where we expect
// one, we "replace" the validated continuation bytes we've seen so far with
// UTF-8 replacement characters ('\ufffd'), to match v8's UTF-8 decoding
// behavior. The continuation byte check is included three times in the case
// where all of the continuation bytes for a character exist in the same buffer.
// It is also done this way as a slight performance increase instead of using a
// loop.
function utf8CheckExtraBytes(self, buf, p) {
if ((buf[0] & 0xC0) !== 0x80) {
self.lastNeed = 0;
return '\ufffd'.repeat(p);
}
if (self.lastNeed > 1 && buf.length > 1) {
if ((buf[1] & 0xC0) !== 0x80) {
self.lastNeed = 1;
return '\ufffd'.repeat(p + 1);
}
if (self.lastNeed > 2 && buf.length > 2) {
if ((buf[2] & 0xC0) !== 0x80) {
self.lastNeed = 2;
return '\ufffd'.repeat(p + 2);
}
}
}
}
// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
function utf8FillLast(buf) {
var p = this.lastTotal - this.lastNeed;
var r = utf8CheckExtraBytes(this, buf, p);
if (r !== undefined) return r;
if (this.lastNeed <= buf.length) {
buf.copy(this.lastChar, p, 0, this.lastNeed);
return this.lastChar.toString(this.encoding, 0, this.lastTotal);
}
buf.copy(this.lastChar, p, 0, buf.length);
this.lastNeed -= buf.length;
}
// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
// partial character, the character's bytes are buffered until the required
// number of bytes are available.
function utf8Text(buf, i) {
var total = utf8CheckIncomplete(this, buf, i);
if (!this.lastNeed) return buf.toString('utf8', i);
this.lastTotal = total;
var end = buf.length - (total - this.lastNeed);
buf.copy(this.lastChar, 0, end);
return buf.toString('utf8', i, end);
}
// For UTF-8, a replacement character for each buffered byte of a (partial)
// character needs to be added to the output.
function utf8End(buf) {
var r = buf && buf.length ? this.write(buf) : '';
if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed);
return r;
}
// UTF-16LE typically needs two bytes per character, but even if we have an even
// number of bytes available, we need to check if we end on a leading/high
// surrogate. In that case, we need to wait for the next two bytes in order to
// decode the last character properly.
function utf16Text(buf, i) {
if ((buf.length - i) % 2 === 0) {
var r = buf.toString('utf16le', i);
if (r) {
var c = r.charCodeAt(r.length - 1);
if (c >= 0xD800 && c <= 0xDBFF) {
this.lastNeed = 2;
this.lastTotal = 4;
this.lastChar[0] = buf[buf.length - 2];
this.lastChar[1] = buf[buf.length - 1];
return r.slice(0, -1);
}
}
return r;
}
this.lastNeed = 1;
this.lastTotal = 2;
this.lastChar[0] = buf[buf.length - 1];
return buf.toString('utf16le', i, buf.length - 1);
}
// For UTF-16LE we do not explicitly append special replacement characters if we
// end on a partial character, we simply let v8 handle that.
function utf16End(buf) {
var r = buf && buf.length ? this.write(buf) : '';
if (this.lastNeed) {
var end = this.lastTotal - this.lastNeed;
return r + this.lastChar.toString('utf16le', 0, end);
}
return r;
}
function base64Text(buf, i) {
var n = (buf.length - i) % 3;
if (n === 0) return buf.toString('base64', i);
this.lastNeed = 3 - n;
this.lastTotal = 3;
if (n === 1) {
this.lastChar[0] = buf[buf.length - 1];
} else {
this.lastChar[0] = buf[buf.length - 2];
this.lastChar[1] = buf[buf.length - 1];
}
return buf.toString('base64', i, buf.length - n);
}
function base64End(buf) {
var r = buf && buf.length ? this.write(buf) : '';
if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
return r;
}
// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
function simpleWrite(buf) {
return buf.toString(this.encoding);
}
function simpleEnd(buf) {
return buf && buf.length ? this.write(buf) : '';
}
},{"safe-buffer":108}],133:[function(require,module,exports){
function Agent() {
this._defaults = [];
}
["use", "on", "once", "set", "query", "type", "accept", "auth", "withCredentials", "sortQuery", "retry", "ok", "redirects",
"timeout", "buffer", "serialize", "parse", "ca", "key", "pfx", "cert"].forEach(function(fn) {
/** Default setting for all requests from this agent */
Agent.prototype[fn] = function(/*varargs*/) {
this._defaults.push({fn:fn, arguments:arguments});
return this;
}
});
Agent.prototype._setDefaults = function(req) {
this._defaults.forEach(function(def) {
req[def.fn].apply(req, def.arguments);
});
};
module.exports = Agent;
},{}],134:[function(require,module,exports){
/**
* Root reference for iframes.
*/
var root;
if (typeof window !== 'undefined') { // Browser window
root = window;
} else if (typeof self !== 'undefined') { // Web Worker
root = self;
} else { // Other environments
console.warn("Using browser-only version of superagent in non-browser environment");
root = this;
}
var Emitter = require('component-emitter');
var RequestBase = require('./request-base');
var isObject = require('./is-object');
var ResponseBase = require('./response-base');
var Agent = require('./agent-base');
/**
* Noop.
*/
function noop(){};
/**
* Expose `request`.
*/
var request = exports = module.exports = function(method, url) {
// callback
if ('function' == typeof url) {
return new exports.Request('GET', method).end(url);
}
// url first
if (1 == arguments.length) {
return new exports.Request('GET', method);
}
return new exports.Request(method, url);
}
exports.Request = Request;
/**
* Determine XHR.
*/
request.getXHR = function () {
if (root.XMLHttpRequest
&& (!root.location || 'file:' != root.location.protocol
|| !root.ActiveXObject)) {
return new XMLHttpRequest;
} else {
try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}
try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}
try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}
try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}
}
throw Error("Browser-only version of superagent could not find XHR");
};
/**
* Removes leading and trailing whitespace, added to support IE.
*
* @param {String} s
* @return {String}
* @api private
*/
var trim = ''.trim
? function(s) { return s.trim(); }
: function(s) { return s.replace(/(^\s*|\s*$)/g, ''); };
/**
* Serialize the given `obj`.
*
* @param {Object} obj
* @return {String}
* @api private
*/
function serialize(obj) {
if (!isObject(obj)) return obj;
var pairs = [];
for (var key in obj) {
pushEncodedKeyValuePair(pairs, key, obj[key]);
}
return pairs.join('&');
}
/**
* Helps 'serialize' with serializing arrays.
* Mutates the pairs array.
*
* @param {Array} pairs
* @param {String} key
* @param {Mixed} val
*/
function pushEncodedKeyValuePair(pairs, key, val) {
if (val != null) {
if (Array.isArray(val)) {
val.forEach(function(v) {
pushEncodedKeyValuePair(pairs, key, v);
});
} else if (isObject(val)) {
for(var subkey in val) {
pushEncodedKeyValuePair(pairs, key + '[' + subkey + ']', val[subkey]);
}
} else {
pairs.push(encodeURIComponent(key)
+ '=' + encodeURIComponent(val));
}
} else if (val === null) {
pairs.push(encodeURIComponent(key));
}
}
/**
* Expose serialization method.
*/
request.serializeObject = serialize;
/**
* Parse the given x-www-form-urlencoded `str`.
*
* @param {String} str
* @return {Object}
* @api private
*/
function parseString(str) {
var obj = {};
var pairs = str.split('&');
var pair;
var pos;
for (var i = 0, len = pairs.length; i < len; ++i) {
pair = pairs[i];
pos = pair.indexOf('=');
if (pos == -1) {
obj[decodeURIComponent(pair)] = '';
} else {
obj[decodeURIComponent(pair.slice(0, pos))] =
decodeURIComponent(pair.slice(pos + 1));
}
}
return obj;
}
/**
* Expose parser.
*/
request.parseString = parseString;
/**
* Default MIME type map.
*
* superagent.types.xml = 'application/xml';
*
*/
request.types = {
html: 'text/html',
json: 'application/json',
xml: 'text/xml',
urlencoded: 'application/x-www-form-urlencoded',
'form': 'application/x-www-form-urlencoded',
'form-data': 'application/x-www-form-urlencoded'
};
/**
* Default serialization map.
*
* superagent.serialize['application/xml'] = function(obj){
* return 'generated xml here';
* };
*
*/
request.serialize = {
'application/x-www-form-urlencoded': serialize,
'application/json': JSON.stringify
};
/**
* Default parsers.
*
* superagent.parse['application/xml'] = function(str){
* return { object parsed from str };
* };
*
*/
request.parse = {
'application/x-www-form-urlencoded': parseString,
'application/json': JSON.parse
};
/**
* Parse the given header `str` into
* an object containing the mapped fields.
*
* @param {String} str
* @return {Object}
* @api private
*/
function parseHeader(str) {
var lines = str.split(/\r?\n/);
var fields = {};
var index;
var line;
var field;
var val;
for (var i = 0, len = lines.length; i < len; ++i) {
line = lines[i];
index = line.indexOf(':');
if (index === -1) { // could be empty line, just skip it
continue;
}
field = line.slice(0, index).toLowerCase();
val = trim(line.slice(index + 1));
fields[field] = val;
}
return fields;
}
/**
* Check if `mime` is json or has +json structured syntax suffix.
*
* @param {String} mime
* @return {Boolean}
* @api private
*/
function isJSON(mime) {
// should match /json or +json
// but not /json-seq
return /[\/+]json($|[^-\w])/.test(mime);
}
/**
* Initialize a new `Response` with the given `xhr`.
*
* - set flags (.ok, .error, etc)
* - parse header
*
* Examples:
*
* Aliasing `superagent` as `request` is nice:
*
* request = superagent;
*
* We can use the promise-like API, or pass callbacks:
*
* request.get('/').end(function(res){});
* request.get('/', function(res){});
*
* Sending data can be chained:
*
* request
* .post('/user')
* .send({ name: 'tj' })
* .end(function(res){});
*
* Or passed to `.send()`:
*
* request
* .post('/user')
* .send({ name: 'tj' }, function(res){});
*
* Or passed to `.post()`:
*
* request
* .post('/user', { name: 'tj' })
* .end(function(res){});
*
* Or further reduced to a single call for simple cases:
*
* request
* .post('/user', { name: 'tj' }, function(res){});
*
* @param {XMLHTTPRequest} xhr
* @param {Object} options
* @api private
*/
function Response(req) {
this.req = req;
this.xhr = this.req.xhr;
// responseText is accessible only if responseType is '' or 'text' and on older browsers
this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')
? this.xhr.responseText
: null;
this.statusText = this.req.xhr.statusText;
var status = this.xhr.status;
// handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request
if (status === 1223) {
status = 204;
}
this._setStatusProperties(status);
this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());
// getAllResponseHeaders sometimes falsely returns "" for CORS requests, but
// getResponseHeader still works. so we get content-type even if getting
// other headers fails.
this.header['content-type'] = this.xhr.getResponseHeader('content-type');
this._setHeaderProperties(this.header);
if (null === this.text && req._responseType) {
this.body = this.xhr.response;
} else {
this.body = this.req.method != 'HEAD'
? this._parseBody(this.text ? this.text : this.xhr.response)
: null;
}
}
ResponseBase(Response.prototype);
/**
* Parse the given body `str`.
*
* Used for auto-parsing of bodies. Parsers
* are defined on the `superagent.parse` object.
*
* @param {String} str
* @return {Mixed}
* @api private
*/
Response.prototype._parseBody = function(str) {
var parse = request.parse[this.type];
if (this.req._parser) {
return this.req._parser(this, str);
}
if (!parse && isJSON(this.type)) {
parse = request.parse['application/json'];
}
return parse && str && (str.length || str instanceof Object)
? parse(str)
: null;
};
/**
* Return an `Error` representative of this response.
*
* @return {Error}
* @api public
*/
Response.prototype.toError = function(){
var req = this.req;
var method = req.method;
var url = req.url;
var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';
var err = new Error(msg);
err.status = this.status;
err.method = method;
err.url = url;
return err;
};
/**
* Expose `Response`.
*/
request.Response = Response;
/**
* Initialize a new `Request` with the given `method` and `url`.
*
* @param {String} method
* @param {String} url
* @api public
*/
function Request(method, url) {
var self = this;
this._query = this._query || [];
this.method = method;
this.url = url;
this.header = {}; // preserves header name case
this._header = {}; // coerces header names to lowercase
this.on('end', function(){
var err = null;
var res = null;
try {
res = new Response(self);
} catch(e) {
err = new Error('Parser is unable to parse the response');
err.parse = true;
err.original = e;
// issue #675: return the raw response if the response parsing fails
if (self.xhr) {
// ie9 doesn't have 'response' property
err.rawResponse = typeof self.xhr.responseType == 'undefined' ? self.xhr.responseText : self.xhr.response;
// issue #876: return the http status code if the response parsing fails
err.status = self.xhr.status ? self.xhr.status : null;
err.statusCode = err.status; // backwards-compat only
} else {
err.rawResponse = null;
err.status = null;
}
return self.callback(err);
}
self.emit('response', res);
var new_err;
try {
if (!self._isResponseOK(res)) {
new_err = new Error(res.statusText || 'Unsuccessful HTTP response');
}
} catch(custom_err) {
new_err = custom_err; // ok() callback can throw
}
// #1000 don't catch errors from the callback to avoid double calling it
if (new_err) {
new_err.original = err;
new_err.response = res;
new_err.status = res.status;
self.callback(new_err, res);
} else {
self.callback(null, res);
}
});
}
/**
* Mixin `Emitter` and `RequestBase`.
*/
Emitter(Request.prototype);
RequestBase(Request.prototype);
/**
* Set Content-Type to `type`, mapping values from `request.types`.
*
* Examples:
*
* superagent.types.xml = 'application/xml';
*
* request.post('/')
* .type('xml')
* .send(xmlstring)
* .end(callback);
*
* request.post('/')
* .type('application/xml')
* .send(xmlstring)
* .end(callback);
*
* @param {String} type
* @return {Request} for chaining
* @api public
*/
Request.prototype.type = function(type){
this.set('Content-Type', request.types[type] || type);
return this;
};
/**
* Set Accept to `type`, mapping values from `request.types`.
*
* Examples:
*
* superagent.types.json = 'application/json';
*
* request.get('/agent')
* .accept('json')
* .end(callback);
*
* request.get('/agent')
* .accept('application/json')
* .end(callback);
*
* @param {String} accept
* @return {Request} for chaining
* @api public
*/
Request.prototype.accept = function(type){
this.set('Accept', request.types[type] || type);
return this;
};
/**
* Set Authorization field value with `user` and `pass`.
*
* @param {String} user
* @param {String} [pass] optional in case of using 'bearer' as type
* @param {Object} options with 'type' property 'auto', 'basic' or 'bearer' (default 'basic')
* @return {Request} for chaining
* @api public
*/
Request.prototype.auth = function(user, pass, options){
if (1 === arguments.length) pass = '';
if (typeof pass === 'object' && pass !== null) { // pass is optional and can be replaced with options
options = pass;
pass = '';
}
if (!options) {
options = {
type: 'function' === typeof btoa ? 'basic' : 'auto',
};
}
var encoder = function(string) {
if ('function' === typeof btoa) {
return btoa(string);
}
throw new Error('Cannot use basic auth, btoa is not a function');
};
return this._auth(user, pass, options, encoder);
};
/**
* Add query-string `val`.
*
* Examples:
*
* request.get('/shoes')
* .query('size=10')
* .query({ color: 'blue' })
*
* @param {Object|String} val
* @return {Request} for chaining
* @api public
*/
Request.prototype.query = function(val){
if ('string' != typeof val) val = serialize(val);
if (val) this._query.push(val);
return this;
};
/**
* Queue the given `file` as an attachment to the specified `field`,
* with optional `options` (or filename).
*
* ``` js
* request.post('/upload')
* .attach('content', new Blob(['hey!'], { type: "text/html"}))
* .end(callback);
* ```
*
* @param {String} field
* @param {Blob|File} file
* @param {String|Object} options
* @return {Request} for chaining
* @api public
*/
Request.prototype.attach = function(field, file, options){
if (file) {
if (this._data) {
throw Error("superagent can't mix .send() and .attach()");
}
this._getFormData().append(field, file, options || file.name);
}
return this;
};
Request.prototype._getFormData = function(){
if (!this._formData) {
this._formData = new root.FormData();
}
return this._formData;
};
/**
* Invoke the callback with `err` and `res`
* and handle arity check.
*
* @param {Error} err
* @param {Response} res
* @api private
*/
Request.prototype.callback = function(err, res){
if (this._shouldRetry(err, res)) {
return this._retry();
}
var fn = this._callback;
this.clearTimeout();
if (err) {
if (this._maxRetries) err.retries = this._retries - 1;
this.emit('error', err);
}
fn(err, res);
};
/**
* Invoke callback with x-domain error.
*
* @api private
*/
Request.prototype.crossDomainError = function(){
var err = new Error('Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');
err.crossDomain = true;
err.status = this.status;
err.method = this.method;
err.url = this.url;
this.callback(err);
};
// This only warns, because the request is still likely to work
Request.prototype.buffer = Request.prototype.ca = Request.prototype.agent = function(){
console.warn("This is not supported in browser version of superagent");
return this;
};
// This throws, because it can't send/receive data as expected
Request.prototype.pipe = Request.prototype.write = function(){
throw Error("Streaming is not supported in browser version of superagent");
};
/**
* Check if `obj` is a host object,
* we don't want to serialize these :)
*
* @param {Object} obj
* @return {Boolean}
* @api private
*/
Request.prototype._isHost = function _isHost(obj) {
// Native objects stringify to [object File], [object Blob], [object FormData], etc.
return obj && 'object' === typeof obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== '[object Object]';
}
/**
* Initiate request, invoking callback `fn(res)`
* with an instanceof `Response`.
*
* @param {Function} fn
* @return {Request} for chaining
* @api public
*/
Request.prototype.end = function(fn){
if (this._endCalled) {
console.warn("Warning: .end() was called twice. This is not supported in superagent");
}
this._endCalled = true;
// store callback
this._callback = fn || noop;
// querystring
this._finalizeQueryString();
return this._end();
};
Request.prototype._end = function() {
var self = this;
var xhr = (this.xhr = request.getXHR());
var data = this._formData || this._data;
this._setTimeouts();
// state change
xhr.onreadystatechange = function(){
var readyState = xhr.readyState;
if (readyState >= 2 && self._responseTimeoutTimer) {
clearTimeout(self._responseTimeoutTimer);
}
if (4 != readyState) {
return;
}
// In IE9, reads to any property (e.g. status) off of an aborted XHR will
// result in the error "Could not complete the operation due to error c00c023f"
var status;
try { status = xhr.status } catch(e) { status = 0; }
if (!status) {
if (self.timedout || self._aborted) return;
return self.crossDomainError();
}
self.emit('end');
};
// progress
var handleProgress = function(direction, e) {
if (e.total > 0) {
e.percent = e.loaded / e.total * 100;
}
e.direction = direction;
self.emit('progress', e);
};
if (this.hasListeners('progress')) {
try {
xhr.onprogress = handleProgress.bind(null, 'download');
if (xhr.upload) {
xhr.upload.onprogress = handleProgress.bind(null, 'upload');
}
} catch(e) {
// Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.
// Reported here:
// https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context
}
}
// initiate request
try {
if (this.username && this.password) {
xhr.open(this.method, this.url, true, this.username, this.password);
} else {
xhr.open(this.method, this.url, true);
}
} catch (err) {
// see #1149
return this.callback(err);
}
// CORS
if (this._withCredentials) xhr.withCredentials = true;
// body
if (!this._formData && 'GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !this._isHost(data)) {
// serialize stuff
var contentType = this._header['content-type'];
var serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : ''];
if (!serialize && isJSON(contentType)) {
serialize = request.serialize['application/json'];
}
if (serialize) data = serialize(data);
}
// set header fields
for (var field in this.header) {
if (null == this.header[field]) continue;
if (this.header.hasOwnProperty(field))
xhr.setRequestHeader(field, this.header[field]);
}
if (this._responseType) {
xhr.responseType = this._responseType;
}
// send stuff
this.emit('request', this);
// IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)
// We need null here if data is undefined
xhr.send(typeof data !== 'undefined' ? data : null);
return this;
};
request.agent = function() {
return new Agent();
};
["GET", "POST", "OPTIONS", "PATCH", "PUT", "DELETE"].forEach(function(method) {
Agent.prototype[method.toLowerCase()] = function(url, fn) {
var req = new request.Request(method, url);
this._setDefaults(req);
if (fn) {
req.end(fn);
}
return req;
};
});
Agent.prototype.del = Agent.prototype['delete'];
/**
* GET `url` with optional callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} [data] or fn
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.get = function(url, data, fn) {
var req = request('GET', url);
if ('function' == typeof data) (fn = data), (data = null);
if (data) req.query(data);
if (fn) req.end(fn);
return req;
};
/**
* HEAD `url` with optional callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} [data] or fn
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.head = function(url, data, fn) {
var req = request('HEAD', url);
if ('function' == typeof data) (fn = data), (data = null);
if (data) req.query(data);
if (fn) req.end(fn);
return req;
};
/**
* OPTIONS query to `url` with optional callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} [data] or fn
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.options = function(url, data, fn) {
var req = request('OPTIONS', url);
if ('function' == typeof data) (fn = data), (data = null);
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
/**
* DELETE `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed} [data]
* @param {Function} [fn]
* @return {Request}
* @api public
*/
function del(url, data, fn) {
var req = request('DELETE', url);
if ('function' == typeof data) (fn = data), (data = null);
if (data) req.send(data);
if (fn) req.end(fn);
return req;
}
request['del'] = del;
request['delete'] = del;
/**
* PATCH `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed} [data]
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.patch = function(url, data, fn) {
var req = request('PATCH', url);
if ('function' == typeof data) (fn = data), (data = null);
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
/**
* POST `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed} [data]
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.post = function(url, data, fn) {
var req = request('POST', url);
if ('function' == typeof data) (fn = data), (data = null);
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
/**
* PUT `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} [data] or fn
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.put = function(url, data, fn) {
var req = request('PUT', url);
if ('function' == typeof data) (fn = data), (data = null);
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
},{"./agent-base":133,"./is-object":135,"./request-base":136,"./response-base":137,"component-emitter":35}],135:[function(require,module,exports){
'use strict';
/**
* Check if `obj` is an object.
*
* @param {Object} obj
* @return {Boolean}
* @api private
*/
function isObject(obj) {
return null !== obj && 'object' === typeof obj;
}
module.exports = isObject;
},{}],136:[function(require,module,exports){
'use strict';
/**
* Module of mixed-in functions shared between node and client code
*/
var isObject = require('./is-object');
/**
* Expose `RequestBase`.
*/
module.exports = RequestBase;
/**
* Initialize a new `RequestBase`.
*
* @api public
*/
function RequestBase(obj) {
if (obj) return mixin(obj);
}
/**
* Mixin the prototype properties.
*
* @param {Object} obj
* @return {Object}
* @api private
*/
function mixin(obj) {
for (var key in RequestBase.prototype) {
obj[key] = RequestBase.prototype[key];
}
return obj;
}
/**
* Clear previous timeout.
*
* @return {Request} for chaining
* @api public
*/
RequestBase.prototype.clearTimeout = function _clearTimeout(){
clearTimeout(this._timer);
clearTimeout(this._responseTimeoutTimer);
delete this._timer;
delete this._responseTimeoutTimer;
return this;
};
/**
* Override default response body parser
*
* This function will be called to convert incoming data into request.body
*
* @param {Function}
* @api public
*/
RequestBase.prototype.parse = function parse(fn){
this._parser = fn;
return this;
};
/**
* Set format of binary response body.
* In browser valid formats are 'blob' and 'arraybuffer',
* which return Blob and ArrayBuffer, respectively.
*
* In Node all values result in Buffer.
*
* Examples:
*
* req.get('/')
* .responseType('blob')
* .end(callback);
*
* @param {String} val
* @return {Request} for chaining
* @api public
*/
RequestBase.prototype.responseType = function(val){
this._responseType = val;
return this;
};
/**
* Override default request body serializer
*
* This function will be called to convert data set via .send or .attach into payload to send
*
* @param {Function}
* @api public
*/
RequestBase.prototype.serialize = function serialize(fn){
this._serializer = fn;
return this;
};
/**
* Set timeouts.
*
* - response timeout is time between sending request and receiving the first byte of the response. Includes DNS and connection time.
* - deadline is the time from start of the request to receiving response body in full. If the deadline is too short large files may not load at all on slow connections.
*
* Value of 0 or false means no timeout.
*
* @param {Number|Object} ms or {response, deadline}
* @return {Request} for chaining
* @api public
*/
RequestBase.prototype.timeout = function timeout(options){
if (!options || 'object' !== typeof options) {
this._timeout = options;
this._responseTimeout = 0;
return this;
}
for(var option in options) {
switch(option) {
case 'deadline':
this._timeout = options.deadline;
break;
case 'response':
this._responseTimeout = options.response;
break;
default:
console.warn("Unknown timeout option", option);
}
}
return this;
};
/**
* Set number of retry attempts on error.
*
* Failed requests will be retried 'count' times if timeout or err.code >= 500.
*
* @param {Number} count
* @param {Function} [fn]
* @return {Request} for chaining
* @api public
*/
RequestBase.prototype.retry = function retry(count, fn){
// Default to 1 if no count passed or true
if (arguments.length === 0 || count === true) count = 1;
if (count <= 0) count = 0;
this._maxRetries = count;
this._retries = 0;
this._retryCallback = fn;
return this;
};
var ERROR_CODES = [
'ECONNRESET',
'ETIMEDOUT',
'EADDRINFO',
'ESOCKETTIMEDOUT'
];
/**
* Determine if a request should be retried.
* (Borrowed from segmentio/superagent-retry)
*
* @param {Error} err
* @param {Response} [res]
* @returns {Boolean}
*/
RequestBase.prototype._shouldRetry = function(err, res) {
if (!this._maxRetries || this._retries++ >= this._maxRetries) {
return false;
}
if (this._retryCallback) {
try {
var override = this._retryCallback(err, res);
if (override === true) return true;
if (override === false) return false;
// undefined falls back to defaults
} catch(e) {
console.error(e);
}
}
if (res && res.status && res.status >= 500 && res.status != 501) return true;
if (err) {
if (err.code && ~ERROR_CODES.indexOf(err.code)) return true;
// Superagent timeout
if (err.timeout && err.code == 'ECONNABORTED') return true;
if (err.crossDomain) return true;
}
return false;
};
/**
* Retry request
*
* @return {Request} for chaining
* @api private
*/
RequestBase.prototype._retry = function() {
this.clearTimeout();
// node
if (this.req) {
this.req = null;
this.req = this.request();
}
this._aborted = false;
this.timedout = false;
return this._end();
};
/**
* Promise support
*
* @param {Function} resolve
* @param {Function} [reject]
* @return {Request}
*/
RequestBase.prototype.then = function then(resolve, reject) {
if (!this._fullfilledPromise) {
var self = this;
if (this._endCalled) {
console.warn("Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises");
}
this._fullfilledPromise = new Promise(function(innerResolve, innerReject) {
self.end(function(err, res) {
if (err) innerReject(err);
else innerResolve(res);
});
});
}
return this._fullfilledPromise.then(resolve, reject);
};
RequestBase.prototype['catch'] = function(cb) {
return this.then(undefined, cb);
};
/**
* Allow for extension
*/
RequestBase.prototype.use = function use(fn) {
fn(this);
return this;
};
RequestBase.prototype.ok = function(cb) {
if ('function' !== typeof cb) throw Error("Callback required");
this._okCallback = cb;
return this;
};
RequestBase.prototype._isResponseOK = function(res) {
if (!res) {
return false;
}
if (this._okCallback) {
return this._okCallback(res);
}
return res.status >= 200 && res.status < 300;
};
/**
* Get request header `field`.
* Case-insensitive.
*
* @param {String} field
* @return {String}
* @api public
*/
RequestBase.prototype.get = function(field){
return this._header[field.toLowerCase()];
};
/**
* Get case-insensitive header `field` value.
* This is a deprecated internal API. Use `.get(field)` instead.
*
* (getHeader is no longer used internally by the superagent code base)
*
* @param {String} field
* @return {String}
* @api private
* @deprecated
*/
RequestBase.prototype.getHeader = RequestBase.prototype.get;
/**
* Set header `field` to `val`, or multiple fields with one object.
* Case-insensitive.
*
* Examples:
*
* req.get('/')
* .set('Accept', 'application/json')
* .set('X-API-Key', 'foobar')
* .end(callback);
*
* req.get('/')
* .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })
* .end(callback);
*
* @param {String|Object} field
* @param {String} val
* @return {Request} for chaining
* @api public
*/
RequestBase.prototype.set = function(field, val){
if (isObject(field)) {
for (var key in field) {
this.set(key, field[key]);
}
return this;
}
this._header[field.toLowerCase()] = val;
this.header[field] = val;
return this;
};
/**
* Remove header `field`.
* Case-insensitive.
*
* Example:
*
* req.get('/')
* .unset('User-Agent')
* .end(callback);
*
* @param {String} field
*/
RequestBase.prototype.unset = function(field){
delete this._header[field.toLowerCase()];
delete this.header[field];
return this;
};
/**
* Write the field `name` and `val`, or multiple fields with one object
* for "multipart/form-data" request bodies.
*
* ``` js
* request.post('/upload')
* .field('foo', 'bar')
* .end(callback);
*
* request.post('/upload')
* .field({ foo: 'bar', baz: 'qux' })
* .end(callback);
* ```
*
* @param {String|Object} name
* @param {String|Blob|File|Buffer|fs.ReadStream} val
* @return {Request} for chaining
* @api public
*/
RequestBase.prototype.field = function(name, val) {
// name should be either a string or an object.
if (null === name || undefined === name) {
throw new Error('.field(name, val) name can not be empty');
}
if (this._data) {
console.error(".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()");
}
if (isObject(name)) {
for (var key in name) {
this.field(key, name[key]);
}
return this;
}
if (Array.isArray(val)) {
for (var i in val) {
this.field(name, val[i]);
}
return this;
}
// val should be defined now
if (null === val || undefined === val) {
throw new Error('.field(name, val) val can not be empty');
}
if ('boolean' === typeof val) {
val = '' + val;
}
this._getFormData().append(name, val);
return this;
};
/**
* Abort the request, and clear potential timeout.
*
* @return {Request}
* @api public
*/
RequestBase.prototype.abort = function(){
if (this._aborted) {
return this;
}
this._aborted = true;
this.xhr && this.xhr.abort(); // browser
this.req && this.req.abort(); // node
this.clearTimeout();
this.emit('abort');
return this;
};
RequestBase.prototype._auth = function(user, pass, options, base64Encoder) {
switch (options.type) {
case 'basic':
this.set('Authorization', 'Basic ' + base64Encoder(user + ':' + pass));
break;
case 'auto':
this.username = user;
this.password = pass;
break;
case 'bearer': // usage would be .auth(accessToken, { type: 'bearer' })
this.set('Authorization', 'Bearer ' + user);
break;
}
return this;
};
/**
* Enable transmission of cookies with x-domain requests.
*
* Note that for this to work the origin must not be
* using "Access-Control-Allow-Origin" with a wildcard,
* and also must set "Access-Control-Allow-Credentials"
* to "true".
*
* @api public
*/
RequestBase.prototype.withCredentials = function(on) {
// This is browser-only functionality. Node side is no-op.
if (on == undefined) on = true;
this._withCredentials = on;
return this;
};
/**
* Set the max redirects to `n`. Does noting in browser XHR implementation.
*
* @param {Number} n
* @return {Request} for chaining
* @api public
*/
RequestBase.prototype.redirects = function(n){
this._maxRedirects = n;
return this;
};
/**
* Maximum size of buffered response body, in bytes. Counts uncompressed size.
* Default 200MB.
*
* @param {Number} n
* @return {Request} for chaining
*/
RequestBase.prototype.maxResponseSize = function(n){
if ('number' !== typeof n) {
throw TypeError("Invalid argument");
}
this._maxResponseSize = n;
return this;
};
/**
* Convert to a plain javascript object (not JSON string) of scalar properties.
* Note as this method is designed to return a useful non-this value,
* it cannot be chained.
*
* @return {Object} describing method, url, and data of this request
* @api public
*/
RequestBase.prototype.toJSON = function() {
return {
method: this.method,
url: this.url,
data: this._data,
headers: this._header,
};
};
/**
* Send `data` as the request body, defaulting the `.type()` to "json" when
* an object is given.
*
* Examples:
*
* // manual json
* request.post('/user')
* .type('json')
* .send('{"name":"tj"}')
* .end(callback)
*
* // auto json
* request.post('/user')
* .send({ name: 'tj' })
* .end(callback)
*
* // manual x-www-form-urlencoded
* request.post('/user')
* .type('form')
* .send('name=tj')
* .end(callback)
*
* // auto x-www-form-urlencoded
* request.post('/user')
* .type('form')
* .send({ name: 'tj' })
* .end(callback)
*
* // defaults to x-www-form-urlencoded
* request.post('/user')
* .send('name=tobi')
* .send('species=ferret')
* .end(callback)
*
* @param {String|Object} data
* @return {Request} for chaining
* @api public
*/
RequestBase.prototype.send = function(data){
var isObj = isObject(data);
var type = this._header['content-type'];
if (this._formData) {
console.error(".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()");
}
if (isObj && !this._data) {
if (Array.isArray(data)) {
this._data = [];
} else if (!this._isHost(data)) {
this._data = {};
}
} else if (data && this._data && this._isHost(this._data)) {
throw Error("Can't merge these send calls");
}
// merge
if (isObj && isObject(this._data)) {
for (var key in data) {
this._data[key] = data[key];
}
} else if ('string' == typeof data) {
// default to x-www-form-urlencoded
if (!type) this.type('form');
type = this._header['content-type'];
if ('application/x-www-form-urlencoded' == type) {
this._data = this._data
? this._data + '&' + data
: data;
} else {
this._data = (this._data || '') + data;
}
} else {
this._data = data;
}
if (!isObj || this._isHost(data)) {
return this;
}
// default to json
if (!type) this.type('json');
return this;
};
/**
* Sort `querystring` by the sort function
*
*
* Examples:
*
* // default order
* request.get('/user')
* .query('name=Nick')
* .query('search=Manny')
* .sortQuery()
* .end(callback)
*
* // customized sort function
* request.get('/user')
* .query('name=Nick')
* .query('search=Manny')
* .sortQuery(function(a, b){
* return a.length - b.length;
* })
* .end(callback)
*
*
* @param {Function} sort
* @return {Request} for chaining
* @api public
*/
RequestBase.prototype.sortQuery = function(sort) {
// _sort default to true but otherwise can be a function or boolean
this._sort = typeof sort === 'undefined' ? true : sort;
return this;
};
/**
* Compose querystring to append to req.url
*
* @api private
*/
RequestBase.prototype._finalizeQueryString = function(){
var query = this._query.join('&');
if (query) {
this.url += (this.url.indexOf('?') >= 0 ? '&' : '?') + query;
}
this._query.length = 0; // Makes the call idempotent
if (this._sort) {
var index = this.url.indexOf('?');
if (index >= 0) {
var queryArr = this.url.substring(index + 1).split('&');
if ('function' === typeof this._sort) {
queryArr.sort(this._sort);
} else {
queryArr.sort();
}
this.url = this.url.substring(0, index) + '?' + queryArr.join('&');
}
}
};
// For backwards compat only
RequestBase.prototype._appendQueryString = function() {console.trace("Unsupported");}
/**
* Invoke callback with timeout error.
*
* @api private
*/
RequestBase.prototype._timeoutError = function(reason, timeout, errno){
if (this._aborted) {
return;
}
var err = new Error(reason + timeout + 'ms exceeded');
err.timeout = timeout;
err.code = 'ECONNABORTED';
err.errno = errno;
this.timedout = true;
this.abort();
this.callback(err);
};
RequestBase.prototype._setTimeouts = function() {
var self = this;
// deadline
if (this._timeout && !this._timer) {
this._timer = setTimeout(function(){
self._timeoutError('Timeout of ', self._timeout, 'ETIME');
}, this._timeout);
}
// response timeout
if (this._responseTimeout && !this._responseTimeoutTimer) {
this._responseTimeoutTimer = setTimeout(function(){
self._timeoutError('Response timeout of ', self._responseTimeout, 'ETIMEDOUT');
}, this._responseTimeout);
}
};
},{"./is-object":135}],137:[function(require,module,exports){
'use strict';
/**
* Module dependencies.
*/
var utils = require('./utils');
/**
* Expose `ResponseBase`.
*/
module.exports = ResponseBase;
/**
* Initialize a new `ResponseBase`.
*
* @api public
*/
function ResponseBase(obj) {
if (obj) return mixin(obj);
}
/**
* Mixin the prototype properties.
*
* @param {Object} obj
* @return {Object}
* @api private
*/
function mixin(obj) {
for (var key in ResponseBase.prototype) {
obj[key] = ResponseBase.prototype[key];
}
return obj;
}
/**
* Get case-insensitive `field` value.
*
* @param {String} field
* @return {String}
* @api public
*/
ResponseBase.prototype.get = function(field) {
return this.header[field.toLowerCase()];
};
/**
* Set header related properties:
*
* - `.type` the content type without params
*
* A response of "Content-Type: text/plain; charset=utf-8"
* will provide you with a `.type` of "text/plain".
*
* @param {Object} header
* @api private
*/
ResponseBase.prototype._setHeaderProperties = function(header){
// TODO: moar!
// TODO: make this a util
// content-type
var ct = header['content-type'] || '';
this.type = utils.type(ct);
// params
var params = utils.params(ct);
for (var key in params) this[key] = params[key];
this.links = {};
// links
try {
if (header.link) {
this.links = utils.parseLinks(header.link);
}
} catch (err) {
// ignore
}
};
/**
* Set flags such as `.ok` based on `status`.
*
* For example a 2xx response will give you a `.ok` of __true__
* whereas 5xx will be __false__ and `.error` will be __true__. The
* `.clientError` and `.serverError` are also available to be more
* specific, and `.statusType` is the class of error ranging from 1..5
* sometimes useful for mapping respond colors etc.
*
* "sugar" properties are also defined for common cases. Currently providing:
*
* - .noContent
* - .badRequest
* - .unauthorized
* - .notAcceptable
* - .notFound
*
* @param {Number} status
* @api private
*/
ResponseBase.prototype._setStatusProperties = function(status){
var type = status / 100 | 0;
// status / class
this.status = this.statusCode = status;
this.statusType = type;
// basics
this.info = 1 == type;
this.ok = 2 == type;
this.redirect = 3 == type;
this.clientError = 4 == type;
this.serverError = 5 == type;
this.error = (4 == type || 5 == type)
? this.toError()
: false;
// sugar
this.created = 201 == status;
this.accepted = 202 == status;
this.noContent = 204 == status;
this.badRequest = 400 == status;
this.unauthorized = 401 == status;
this.notAcceptable = 406 == status;
this.forbidden = 403 == status;
this.notFound = 404 == status;
this.unprocessableEntity = 422 == status;
};
},{"./utils":138}],138:[function(require,module,exports){
'use strict';
/**
* Return the mime type for the given `str`.
*
* @param {String} str
* @return {String}
* @api private
*/
exports.type = function(str){
return str.split(/ *; */).shift();
};
/**
* Return header field parameters.
*
* @param {String} str
* @return {Object}
* @api private
*/
exports.params = function(str){
return str.split(/ *; */).reduce(function(obj, str){
var parts = str.split(/ *= */);
var key = parts.shift();
var val = parts.shift();
if (key && val) obj[key] = val;
return obj;
}, {});
};
/**
* Parse Link header fields.
*
* @param {String} str
* @return {Object}
* @api private
*/
exports.parseLinks = function(str){
return str.split(/ *, */).reduce(function(obj, str){
var parts = str.split(/ *; */);
var url = parts[0].slice(1, -1);
var rel = parts[1].split(/ *= */)[1].slice(1, -1);
obj[rel] = url;
return obj;
}, {});
};
/**
* Strip content related fields from `header`.
*
* @param {Object} header
* @return {Object} header
* @api private
*/
exports.cleanHeader = function(header, changesOrigin){
delete header['content-type'];
delete header['content-length'];
delete header['transfer-encoding'];
delete header['host'];
// secuirty
if (changesOrigin) {
delete header['authorization'];
delete header['cookie'];
}
return header;
};
},{}],139:[function(require,module,exports){
module.exports = toArray
function toArray(list, index) {
var array = []
index = index || 0
for (var i = index || 0; i < list.length; i++) {
array[i - index] = list[i]
}
return array
}
},{}],140:[function(require,module,exports){
(function (global){
/**
* Module exports.
*/
module.exports = deprecate;
/**
* Mark that a method should not be used.
* Returns a modified function which warns once by default.
*
* If `localStorage.noDeprecation = true` is set, then it is a no-op.
*
* If `localStorage.throwDeprecation = true` is set, then deprecated functions
* will throw an Error when invoked.
*
* If `localStorage.traceDeprecation = true` is set, then deprecated functions
* will invoke `console.trace()` instead of `console.error()`.
*
* @param {Function} fn - the function to deprecate
* @param {String} msg - the string to print to the console when `fn` is invoked
* @returns {Function} a new "deprecated" version of `fn`
* @api public
*/
function deprecate (fn, msg) {
if (config('noDeprecation')) {
return fn;
}
var warned = false;
function deprecated() {
if (!warned) {
if (config('throwDeprecation')) {
throw new Error(msg);
} else if (config('traceDeprecation')) {
console.trace(msg);
} else {
console.warn(msg);
}
warned = true;
}
return fn.apply(this, arguments);
}
return deprecated;
}
/**
* Checks `localStorage` for boolean values for the given `name`.
*
* @param {String} name
* @returns {Boolean}
* @api private
*/
function config (name) {
// accessing global.localStorage can trigger a DOMException in sandboxed iframes
try {
if (!global.localStorage) return false;
} catch (_) {
return false;
}
var val = global.localStorage[name];
if (null == val) return false;
return String(val).toLowerCase() === 'true';
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],141:[function(require,module,exports){
'use strict';
var alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')
, length = 64
, map = {}
, seed = 0
, i = 0
, prev;
/**
* Return a string representing the specified number.
*
* @param {Number} num The number to convert.
* @returns {String} The string representation of the number.
* @api public
*/
function encode(num) {
var encoded = '';
do {
encoded = alphabet[num % length] + encoded;
num = Math.floor(num / length);
} while (num > 0);
return encoded;
}
/**
* Return the integer value specified by the given string.
*
* @param {String} str The string to convert.
* @returns {Number} The integer value represented by the string.
* @api public
*/
function decode(str) {
var decoded = 0;
for (i = 0; i < str.length; i++) {
decoded = decoded * length + map[str.charAt(i)];
}
return decoded;
}
/**
* Yeast: A tiny growing id generator.
*
* @returns {String} A unique id.
* @api public
*/
function yeast() {
var now = encode(+new Date());
if (now !== prev) return seed = 0, prev = now;
return now +'.'+ encode(seed++);
}
//
// Map each character to its index.
//
for (; i < length; i++) map[alphabet[i]] = i;
//
// Expose the `yeast`, `encode` and `decode` functions.
//
yeast.encode = encode;
yeast.decode = decode;
module.exports = yeast;
},{}]},{},[1])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJoeWRyYS1zZXJ2ZXIvYXBwL2luZGV4LmpzIiwiaHlkcmEtc2VydmVyL2FwcC9rZXltYXBzLmpzIiwiaHlkcmEtc2VydmVyL2FwcC9zcmMvTXV0YXRvci5qcyIsImh5ZHJhLXNlcnZlci9hcHAvc3JjL1VuZG9TdGFjay5qcyIsImh5ZHJhLXNlcnZlci9hcHAvc3JjL2VkaXRvci5qcyIsImh5ZHJhLXNlcnZlci9hcHAvc3JjL2V4YW1wbGVzLmpzb24iLCJoeWRyYS1zZXJ2ZXIvYXBwL3NyYy9nYWxsZXJ5LmpzIiwiaHlkcmEtc2VydmVyL2FwcC9zcmMvbG9nLmpzIiwiaHlkcmEtc2VydmVyL2FwcC9zcmMvbWVudS5qcyIsImh5ZHJhLXNlcnZlci9hcHAvc3JjL3A1LXdyYXBwZXIuanMiLCJoeWRyYS1zZXJ2ZXIvYXBwL3NyYy9wYi1saXZlLmpzIiwiaHlkcmEtc2VydmVyL2FwcC9zcmMvcmVwbC5qcyIsImh5ZHJhLXNlcnZlci9hcHAvc3JjL3J0Yy1wYXRjaC1iYXkuanMiLCJub2RlX21vZHVsZXMvYWNvcm4vZGlzdC9hY29ybi5qcyIsIm5vZGVfbW9kdWxlcy9hZnRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hcnJheWJ1ZmZlci5zbGljZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hc3RyYXZlbC9kaXN0L2FzdHJhdmVsLmpzIiwibm9kZV9tb2R1bGVzL2FzdHJhdmVsL2Rpc3QvYXR0YWNoQ29tbWVudHMuanMiLCJub2RlX21vZHVsZXMvYXN0cmF2ZWwvZGlzdC9kZWZhdWx0VHJhdmVsZXIuanMiLCJub2RlX21vZHVsZXMvYXN0cmluZy9kaXN0L2FzdHJpbmcuanMiLCJub2RlX21vZHVsZXMvYmFja28yL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jhc2U2NC1hcnJheWJ1ZmZlci9saWIvYmFzZTY0LWFycmF5YnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ibG9iL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXItcmVzb2x2ZS9lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2FkZG9uL2NvbW1lbnQvY29tbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2FkZG9uL2hpbnQvamF2YXNjcmlwdC1oaW50LmpzIiwibm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vaGludC9zaG93LWhpbnQuanMiLCJub2RlX21vZHVsZXMvY29kZW1pcnJvci9hZGRvbi9zZWxlY3Rpb24vbWFyay1zZWxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvY29kZW1pcnJvci9saWIvY29kZW1pcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9jb2RlbWlycm9yL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvbmVudC1iaW5kL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvbmVudC1lbWl0dGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvbmVudC1pbmhlcml0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9kZWJ1Zy9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvZGVidWcvc3JjL2RlYnVnLmpzIiwibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvbGliL3NvY2tldC5qcyIsIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnQuanMiLCJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9saWIvdHJhbnNwb3J0cy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnRzL3BvbGxpbmctanNvbnAuanMiLCJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9saWIvdHJhbnNwb3J0cy9wb2xsaW5nLXhoci5qcyIsIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnRzL3BvbGxpbmcuanMiLCJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9saWIvdHJhbnNwb3J0cy93ZWJzb2NrZXQuanMiLCJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9saWIveG1saHR0cHJlcXVlc3QuanMiLCJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2RlYnVnLmpzIiwibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1wYXJzZXIvbGliL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvZW5naW5lLmlvLXBhcnNlci9saWIva2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2xpYi91dGY4LmpzIiwibm9kZV9tb2R1bGVzL2dldC1icm93c2VyLXJ0Yy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXMtYmluYXJ5Mi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXMtYmluYXJ5Mi9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXMtY29ycy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oeWRyYS1zeW50aC9oeWRyYS1zeW50aC5qcyIsIm5vZGVfbW9kdWxlcy9oeWRyYS1zeW50aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oeWRyYS1zeW50aC9zcmMvZXZhbC1zYW5kYm94LmpzIiwibm9kZV9tb2R1bGVzL2h5ZHJhLXN5bnRoL3NyYy9nZW5lcmF0b3ItZmFjdG9yeS5qcyIsIm5vZGVfbW9kdWxlcy9oeWRyYS1zeW50aC9zcmMvZ2xzbC1zb3VyY2UuanMiLCJub2RlX21vZHVsZXMvaHlkcmEtc3ludGgvc3JjL2dsc2wtdXRpbHMuanMiLCJub2RlX21vZHVsZXMvaHlkcmEtc3ludGgvc3JjL2dsc2wvZ2xzbC1mdW5jdGlvbnMuanMiLCJub2RlX21vZHVsZXMvaHlkcmEtc3ludGgvc3JjL2dsc2wvdXRpbGl0eS1mdW5jdGlvbnMuanMiLCJub2RlX21vZHVsZXMvaHlkcmEtc3ludGgvc3JjL2h5ZHJhLXNvdXJjZS5qcyIsIm5vZGVfbW9kdWxlcy9oeWRyYS1zeW50aC9zcmMvbGliL2FycmF5LXV0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2h5ZHJhLXN5bnRoL3NyYy9saWIvYXVkaW8uanMiLCJub2RlX21vZHVsZXMvaHlkcmEtc3ludGgvc3JjL2xpYi9lYXNpbmctZnVuY3Rpb25zLmpzIiwibm9kZV9tb2R1bGVzL2h5ZHJhLXN5bnRoL3NyYy9saWIvc2FuZGJveC5qcyIsIm5vZGVfbW9kdWxlcy9oeWRyYS1zeW50aC9zcmMvbGliL3NjcmVlbm1lZGlhLmpzIiwibm9kZV9tb2R1bGVzL2h5ZHJhLXN5bnRoL3NyYy9saWIvdmlkZW8tcmVjb3JkZXIuanMiLCJub2RlX21vZHVsZXMvaHlkcmEtc3ludGgvc3JjL2xpYi93ZWJjYW0uanMiLCJub2RlX21vZHVsZXMvaHlkcmEtc3ludGgvc3JjL291dHB1dC5qcyIsIm5vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2luZGV4b2YvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWV5ZGEvZGlzdC93ZWIvbWV5ZGEubWluLmpzIiwibm9kZV9tb2R1bGVzL21vdXNlLWNoYW5nZS9tb3VzZS1saXN0ZW4uanMiLCJub2RlX21vZHVsZXMvbW91c2UtZXZlbnQvbW91c2UuanMiLCJub2RlX21vZHVsZXMvcDUvbGliL2FkZG9ucy9wNS5kb20uanMiLCJub2RlX21vZHVsZXMvcDUvbGliL3A1LmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlcXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2V1cmkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGVyZm9ybWFuY2Utbm93L2xpYi9wZXJmb3JtYW5jZS1ub3cuanMiLCJub2RlX21vZHVsZXMvcHJldHRpZXIvcGFyc2VyLWJhYmVsLmpzIiwibm9kZV9tb2R1bGVzL3ByZXR0aWVyL3N0YW5kYWxvbmUuanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3JhZi1sb29wL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JhZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYW5kb21ieXRlcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtLWJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLWJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVnbC9kaXN0L3JlZ2wuanMiLCJub2RlX21vZHVsZXMvcmlnaHQtbm93L2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2hvcnRpZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zaG9ydGlkL2xpYi9hbHBoYWJldC5qcyIsIm5vZGVfbW9kdWxlcy9zaG9ydGlkL2xpYi9idWlsZC5qcyIsIm5vZGVfbW9kdWxlcy9zaG9ydGlkL2xpYi9kZWNvZGUuanMiLCJub2RlX21vZHVsZXMvc2hvcnRpZC9saWIvZW5jb2RlLmpzIiwibm9kZV9tb2R1bGVzL3Nob3J0aWQvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Nob3J0aWQvbGliL2lzLXZhbGlkLmpzIiwibm9kZV9tb2R1bGVzL3Nob3J0aWQvbGliL3JhbmRvbS9yYW5kb20tYnl0ZS1icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3Nob3J0aWQvbGliL3JhbmRvbS9yYW5kb20tZnJvbS1zZWVkLmpzIiwibm9kZV9tb2R1bGVzL3Nob3J0aWQvbGliL3V0aWwvY2x1c3Rlci13b3JrZXItaWQtYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtcGVlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtcGVlci9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9saWIvbWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2xpYi9vbi5qcyIsIm5vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2xpYi9zb2NrZXQuanMiLCJub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9saWIvdXJsLmpzIiwibm9kZV9tb2R1bGVzL3NvY2tldC5pby1wYXJzZXIvYmluYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NvY2tldC5pby1wYXJzZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc29ja2V0LmlvLXBhcnNlci9pcy1idWZmZXIuanMiLCJub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL2FnZW50LWJhc2UuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9yZXF1ZXN0LWJhc2UuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvcmVzcG9uc2UtYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy90by1hcnJheS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3llYXN0L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMTVKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25rQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoR0E7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4c0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNzhTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuMkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdnVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN2T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNwYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNyUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUM5UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDak9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDOWxCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMvUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNrQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdk5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzEzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcG0xRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BDQTtBQUNBOzs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzNwZ0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdC9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDck5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNwcUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzcrVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDaDZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUNuTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbGFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeDVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9cmV0dXJuIGV9KSgpIiwiY29uc3QgUGF0Y2hCYXkgPSByZXF1aXJlKCcuL3NyYy9wYi1saXZlLmpzJylcbmNvbnN0IEh5ZHJhU3ludGggPSByZXF1aXJlKCdoeWRyYS1zeW50aCcpXG5jb25zdCBFZGl0b3IgPSByZXF1aXJlKCcuL3NyYy9lZGl0b3IuanMnKVxuY29uc3QgbG9vcCA9IHJlcXVpcmUoJ3JhZi1sb29wJylcbmNvbnN0IFA1ICA9IHJlcXVpcmUoJy4vc3JjL3A1LXdyYXBwZXIuanMnKVxuY29uc3QgR2FsbGVyeSAgPSByZXF1aXJlKCcuL3NyYy9nYWxsZXJ5LmpzJylcbmNvbnN0IE1lbnUgPSByZXF1aXJlKCcuL3NyYy9tZW51LmpzJylcbmNvbnN0IGtleW1hcHMgPSByZXF1aXJlKCcuL2tleW1hcHMuanMnKVxuY29uc3QgbG9nID0gcmVxdWlyZSgnLi9zcmMvbG9nLmpzJylcbmNvbnN0IHJlcGwgPSByZXF1aXJlKCcuL3NyYy9yZXBsLmpzJylcblxuZnVuY3Rpb24gaW5pdCAoKSB7XG4gIHdpbmRvdy5wYiA9IHBiXG4gIHdpbmRvdy5QNSA9IFA1XG5cbiAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoeWRyYS1jYW52YXMnKVxuICBjYW52YXMud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvXG4gIGNhbnZhcy5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb1xuICBjYW52YXMuc3R5bGUud2lkdGggPSAnMTAwJSdcbiAgY2FudmFzLnN0eWxlLmhlaWdodCA9ICcxMDAlJ1xuICBjYW52YXMuc3R5bGUuaW1hZ2VSZW5kZXJpbmcgPSAncGl4ZWxhdGVkJ1xuXG4gIGxldCBpc0lPUyA9XG4gICgvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pIHx8XG4gICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKSkgJiZcbiAgIXdpbmRvdy5NU1N0cmVhbTtcblxuICBsZXQgcHJlY2lzaW9uVmFsdWUgPSBpc0lPUyA/ICdoaWdocCcgOiAnbWVkaXVtcCdcblxuICB2YXIgcGIgPSBuZXcgUGF0Y2hCYXkoKVxuICB2YXIgaHlkcmEgPSBuZXcgSHlkcmFTeW50aCh7IHBiOiBwYiwgY2FudmFzOiBjYW52YXMsIGF1dG9Mb29wOiBmYWxzZSwgIHByZWNpc2lvbjogcHJlY2lzaW9uVmFsdWV9KVxuICB2YXIgZWRpdG9yID0gbmV3IEVkaXRvcigpXG4gIHZhciBtZW51ID0gbmV3IE1lbnUoeyBlZGl0b3I6IGVkaXRvciwgaHlkcmE6IGh5ZHJhfSlcbiAgbG9nLmluaXQoKVxuXG4gIC8vIGdldCBpbml0aWFsIGNvZGUgdG8gZmlsbCBnYWxsZXJ5XG4gIHZhciBza2V0Y2hlcyA9IG5ldyBHYWxsZXJ5KGZ1bmN0aW9uKGNvZGUsIHNrZXRjaEZyb21VUkwpIHtcbiAgICBlZGl0b3Iuc2V0VmFsdWUoY29kZSlcbiAgICByZXBsLmV2YWwoY29kZSlcblxuICAgIC8vIGlmIGEgc2tldGNoIHdhcyBmb3VuZCBiYXNlZCBvbiB0aGUgVVJMIHBhcmFtZXRlcnMsIGRvbnQgc2hvdyBpbnRybyB3aW5kb3dcbiAgICBpZihza2V0Y2hGcm9tVVJMKSB7XG4gICAgICBtZW51LmNsb3NlTW9kYWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICBtZW51Lm9wZW5Nb2RhbCgpXG4gICAgfVxuICB9KVxuICBtZW51LnNrZXRjaGVzID0gc2tldGNoZXNcblxuICBrZXltYXBzLmluaXQgKHtcbiAgICBlZGl0b3I6IGVkaXRvcixcbiAgICBnYWxsZXJ5OiBza2V0Y2hlcyxcbiAgICBtZW51OiBtZW51LFxuICAgIHJlcGw6IHJlcGwsXG4gICAgbG9nOiBsb2dcbiAgfSlcblxuICAvLyBkZWZpbmUgZXh0cmEgZnVuY3Rpb25zIChldmVudHVhbGx5IHNob3VsZCBiZSBhZGRlZCB0byBoeWRyYS1zeW50aD8pXG5cbiAgLy8gaHVzaCBjbGVhcnMgd2hhdCB5b3Ugc2VlIG9uIHRoZSBzY3JlZW5cbiAgd2luZG93Lmh1c2ggPSAoKSA9PiB7XG4gICAgc29saWQoKS5vdXQoKVxuICAgIHNvbGlkKCkub3V0KG8xKVxuICAgIHNvbGlkKCkub3V0KG8yKVxuICAgIHNvbGlkKCkub3V0KG8zKVxuICAgIHJlbmRlcihvMClcbiAgfVxuXG5cbiAgcGIuaW5pdChoeWRyYS5jYXB0dXJlU3RyZWFtLCB7XG4gICAgc2VydmVyOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luLFxuICAgIHJvb206ICdpY2xjJ1xuICB9KVxuXG4gIHZhciBlbmdpbmUgPSBsb29wKGZ1bmN0aW9uKGR0KSB7XG4gICAgaHlkcmEudGljayhkdClcbiAgfSkuc3RhcnQoKVxuXG59XG5cbndpbmRvdy5vbmxvYWQgPSBpbml0XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW5pdCA6ICh7IGVkaXRvciwgZ2FsbGVyeSwgbWVudSwgcmVwbCwgbG9nfSkgPT4ge1xuICAgIHdpbmRvdy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgIC8vICBjb25zb2xlLmxvZyhlKVxuICAgICAgaWYgKCBlLmN0cmxLZXkgPT09IHRydWUgKSB7XG4gICAgICAgIGlmICggZS5zaGlmdEtleSA9PT0gdHJ1ZSApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlKVxuICAgICAgICAgIC8vIHNoaWZ0IC0gY3RybCAtIGVudGVyOiBldmFsQWxsXG4gICAgICAgICAgaWYgKCBlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIC8vIHJlcGwuZXZhbChlZGl0b3IuZ2V0VmFsdWUoKSwgKHN0cmluZywgZXJyKSA9PiB7XG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCdldmFsJywgZXJyKVxuICAgICAgICAgICAgLy8gICBpZighZXJyKSBnYWxsZXJ5LnNhdmVMb2NhbGx5KGVkaXRvci5nZXRWYWx1ZSgpKVxuICAgICAgICAgICAgLy8gfSlcbiAgICAgICAgICAgIG1lbnUucnVuQWxsKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaGlmdCAtIGN0cmwgLSBHOiBzaGFyZSBza2V0Y2hcbiAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA3MSkge1xuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIG1lbnUuc2hhcmVTa2V0Y2goKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHNoaWZ0IC0gY3RybCAtIEY6IGZvcm1hdCBjb2RlXG4gICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gNzApIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgbWVudS5mb3JtYXRDb2RlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaGlmdCAtIGN0cmwgLSBsOiBzYXZlIHRvIHVybFxuICAgICAgICAgIGlmKGUua2V5Q29kZSA9PT0gNzYpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgZ2FsbGVyeS5zYXZlTG9jYWxseShlZGl0b3IuZ2V0VmFsdWUoKSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaGlmdCAtIGN0cmwgLSBoOiB0b2dnbGUgZWRpdG9yXG4gICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gNzIpIHtcbiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICBlZGl0b3IudG9nZ2xlKClcbiAgICAgICAgICAgIGxvZy50b2dnbGUoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHNoaWZ0IC0gY3RybCAtIHM6IHNjcmVlbmNhcFxuICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgzKSB7XG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgc2NyZWVuY2FwKClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY3RybC1lbnRlcjogZXZhbExpbmVcbiAgICAgICAgICBpZiAoIGUua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgLy8gIGNvbnNvbGUubG9nKCdldmFsIGxpbmUnKVxuICAgICAgICAgICAgcmVwbC5ldmFsKGVkaXRvci5nZXRMaW5lKCkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGN0cmwgLSAvOiB0b2dnbGUgY29tbWVudFxuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAxOTEpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIGVkaXRvci5jbS50b2dnbGVDb21tZW50KClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvaW50IE11dGF0aW9uIEdsaXRjaGVyIEtleSBDb21tYW5kcyBhbmQgaGlzdG9yeSBjb21tYW5kcyAobGVmdCBhbmQgcmlnaHQgYXJyb3dzKVxuICAgICAgICAvLyByaWdodCBhcnJvdyBrZXlcbiAgICAgICAgaWYoZS5rZXlDb2RlID09PSAzOSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIC8vIGlmKGUuc2hpZnRLZXkgPT09IHRydWUpIHtcbiAgICAgICAgICAvLyAgIGVkaXRvci5tdXRhdG9yLm11dGF0ZSh7cmVyb2xsOiBmYWxzZX0pXG4gICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LmZvcndhcmQoKVxuICAgICAgICAvLyAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGxlZnQgYXJyb3dcbiAgICAgICAgaWYoZS5rZXlDb2RlID09PSAzNykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIC8vIGlmKGUuc2hpZnRLZXkgPT09IHRydWUpIHtcbiAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCdyZWRvaW5nJylcbiAgICAgICAgICAvLyAgIGVkaXRvci5tdXRhdG9yLmRvVW5kbygpXG4gICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKVxuICAgICAgICAvLyAgfVxuICAgICAgICAvLyAgZWRpdG9yLm11dGF0b3IuZG9VbmRvKClcbiAgICAgICAgfVxuICAgICAgICAvLyB1cCBhcnJvd1xuICAgICAgICBpZihlLmtleUNvZGUgPT09IDM4KSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgZWRpdG9yLm11dGF0b3IuZG9SZWRvKClcbiAgICAgICAgfVxuICAgICAgICAvLyBkb3duIGFycm93XG4gICAgICAgIGlmKGUua2V5Q29kZSA9PT0gNDApICB7XG4gICAgICAgICAgZWRpdG9yLm11dGF0b3IubXV0YXRlKHtyZXJvbGw6IHRydWV9KVxuICAgICAgICAgIGdhbGxlcnkuc2F2ZUxvY2FsbHkoZWRpdG9yLmdldFZhbHVlKCkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuXG5cbiAgICAgIGlmIChlLmFsdEtleSA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBhbHQgLSBlbnRlcjogZXZhbEJsb2NrXG4gICAgICAgIGlmICggZS5rZXlDb2RlID09PSAxMykge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgcmVwbC5ldmFsKGVkaXRvci5nZXRDdXJyZW50QmxvY2soKS50ZXh0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJjb25zdCB7UGFyc2VyfSA9IHJlcXVpcmUoXCJhY29yblwiKTtcbmNvbnN0IHtnZW5lcmF0ZX0gPSByZXF1aXJlKCdhc3RyaW5nJyk7XG5jb25zdCB7IGRlZmF1bHRUcmF2ZWxlciwgYXR0YWNoQ29tbWVudHMsIG1ha2VUcmF2ZWxlciB9ID0gcmVxdWlyZSgnYXN0cmF2ZWwnKTtcbmNvbnN0IHtVbmRvU3RhY2t9ID0gcmVxdWlyZSgnLi9VbmRvU3RhY2suanMnKTtcbmNvbnN0IHJlcGwgPSByZXF1aXJlKCcuL3JlcGwuanMnKVxuXG5jbGFzcyBNdXRhdG9yIHtcblxuICBjb25zdHJ1Y3RvcihlZGl0b3IpIHtcbiAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjtcbiAgICB0aGlzLnVuZG9TdGFjayA9IG5ldyBVbmRvU3RhY2soKTtcblxuICAgIHRoaXMuaW5pdGlhbFZlY3RvciA9IFtdO1xuICB9XG5cblxuICBtdXRhdGUob3B0aW9ucykge1xuICAgIC8vIEdldCB0ZXh0IGZyb20gQ29kZU1pcnJvci5cbiAgICBsZXQgdGV4dCA9IHRoaXMuZWRpdG9yLmNtLmdldFZhbHVlKCk7XG4gICAgdGhpcy51bmRvU3RhY2sucHVzaCh7dGV4dCwgbGFzdExpdFg6IHRoaXMubGFzdExpdFh9KTtcbiAgICBsZXQgbmVlZFRvUnVuID0gdHJ1ZTtcbiAgICBsZXQgdHJ5Q291bnRlciA9IDU7XG4gICAgd2hpbGUgKG5lZWRUb1J1biAmJiB0cnlDb3VudGVyLS0gPj0gMCkge1xuICAgICAgICAvLyBQYXJzZSB0byBBU1RcbiAgICAgICAgdmFyIGNvbW1lbnRzID0gW107XG4gICAgICAgIGxldCBhc3QgPSBQYXJzZXIucGFyc2UodGV4dCwge1xuICAgICAgICAgICAgbG9jYXRpb25zOiB0cnVlLFxuICAgICAgICAgICAgb25Db21tZW50OiBjb21tZW50c31cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBNb2RpZnkgdGhlIEFTVC5cblxuICAgICAgICB0aGlzLnRyYW5zZm9ybShhc3QsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFB1dCB0aGUgY29tbWVudHMgYmFjay5cbiAgICAgICAgYXR0YWNoQ29tbWVudHMoYXN0LCBjb21tZW50cyk7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgSlMgZnJvbSBBU1QgYW5kIHNldCBiYWNrIGludG8gQ29kZU1pcnJvciBlZGl0b3IuXG4gICAgICAgIGxldCByZWdlbiA9IGdlbmVyYXRlKGFzdCwge2NvbW1lbnRzOiB0cnVlfSk7XG5cbiAgICAgICAgdGhpcy5lZGl0b3IuY20uc2V0VmFsdWUocmVnZW4pO1xuXG4gICAgICAgIC8vIEV2YWx1YXRlIHRoZSB1cGRhdGVkIGV4cHJlc3Npb24uXG4gICAgICAgIHJlcGwuZXZhbChyZWdlbiwgKGNvZGUsIGVycm9yKSA9PiB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBnb3QgYW4gZXJyb3IsIGtlZXAgdHJ5aW5nIHNvbWV0aGluZyBlbHNlLlxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFdmFsIGVycm9yOiBcIiArIHJlZ2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5lZWRUb1J1biA9IGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgfVxuICB9XG5cbiAgZG9VbmRvKCkge1xuICAgIC8vIElmIHRoZSBjdXJyZW50IHRleHQgaXMgdW5zYXZlZCwgc2F2ZSBpdCBzbyB3ZSBjYW4gcmVkbyBpZiBuZWVkIGJlLlxuICAgIGlmICh0aGlzLnVuZG9TdGFjay5hdFRvcCgpKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gdGhpcy5lZGl0b3IuY20uZ2V0VmFsdWUoKTtcbiAgICAgICAgdGhpcy51bmRvU3RhY2sucHVzaCh7dGV4dCwgbGFzdExpdFg6IHRoaXMubGFzdExpdFh9KTtcbiAgICB9XG4gICAgLy8gVGhlbiBwb3Atb2ZmIHRoZSBpbmZvIHRvIHJlc3RvcmUuXG4gICAgaWYgKHRoaXMudW5kb1N0YWNrLmNhblVuZG8oKSkge1xuICAgICAgICBsZXQge3RleHQsIGxhc3RMaXRYfSA9IHRoaXMudW5kb1N0YWNrLnVuZG8oKTtcbiAgICAgICAgdGhpcy5zZXRUZXh0KHRleHQpO1xuICAgICAgICB0aGlzLmxhc3RMaXRYID0gbGFzdExpdFg7XG4gICAgfVxuICB9XG5cbiAgZG9SZWRvKCkge1xuICAgIGlmKHRoaXMudW5kb1N0YWNrLmNhblJlZG8oKSkge1xuICAgICAgICBsZXQge3RleHQsIGxhc3RMaXRYfSA9IHRoaXMudW5kb1N0YWNrLnJlZG8oKTtcbiAgICAgICAgdGhpcy5zZXRUZXh0KHRleHQpO1xuICAgICAgICB0aGlzLmxhc3RMaXRYID0gbGFzdExpdFg7XG4gICAgfVxuICB9XG5cbiAgc2V0VGV4dCh0ZXh0KSB7XG4gICAgdGhpcy5lZGl0b3IuY20uc2V0VmFsdWUodGV4dCk7XG4gICAgcmVwbC5ldmFsKHRleHQsIChjb2RlLCBlcnJvcikgPT4ge1xuICAgIH0pO1xuXG4gICAgfVxuXG4gIC8vIFRoZSBvcHRpb25zIG9iamVjdCBjb250YWlucyBhIGZsYWcgdGhhdCBjb250cm9scyBob3cgdGhlXG4gIC8vIExpdGVyYWwgdG8gbXV0YXRlIGlzIGRldGVybWluZWQuIElmIHJlcm9sbCBpcyBmYWxzZSwgd2VcbiAgLy8gcGljayBvbmUgYXQgcmFuZG9tLiBJZiByZXJvbGwgaXMgdHJ1ZSwgd2UgdXNlIHRoZSBzYW1lIGZpZWxkXG4gIC8vIHdlIGRpZCBsYXN0IHRpbWUuXG4gIHRyYW5zZm9ybShhc3QsIG9wdGlvbnMpIHtcbiAgICAvLyBBbiBBU1QgdHJhdmVsZXIgdGhhdCBhY2N1bXVsYXRlcyBhIGxpc3Qgb2YgTGl0ZXJhbCBub2Rlcy5cbiAgICBsZXQgdHJhdmVsZXIgPSBtYWtlVHJhdmVsZXIoe1xuICBnbzogZnVuY3Rpb24obm9kZSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0xpdGVyYWwnKSB7XG4gICAgICAgICAgICBzdGF0ZS5saXRlcmFsVGFiLnB1c2gobm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpIHtcbiAgICAgICAgICAgIGlmIChub2RlLnByb3BlcnR5ICYmIG5vZGUucHJvcGVydHkudHlwZSA9PT0gJ0xpdGVyYWwnKSB7XG4gICAgICAgICAgICAgICAgLy8gbnVtZXJpYyBhcnJheSBzdWJzY3JpcHRzIGFyZSBpbmVsaWdhYmxlXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgaWYgKG5vZGUuY2FsbGVlICYmIG5vZGUuY2FsbGVlLnByb3BlcnR5ICYmIG5vZGUuY2FsbGVlLnByb3BlcnR5Lm5hbWUgJiYgbm9kZS5jYWxsZWUucHJvcGVydHkubmFtZSAhPT0gJ291dCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5mdW5jdGlvblRhYi5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENhbGwgdGhlIHBhcmVudCdzIGBnb2AgbWV0aG9kXG4gICAgICAgIHRoaXMuc3VwZXIuZ28uY2FsbCh0aGlzLCBub2RlLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgc3RhdGUgPSB7fTtcbiAgICBzdGF0ZS5saXRlcmFsVGFiID0gW107XG4gICAgc3RhdGUuZnVuY3Rpb25UYWIgPSBbXTtcblxuICAgIHRyYXZlbGVyLmdvKGFzdCwgc3RhdGUpO1xuXG4gICAgbGV0IGxpdENvdW50ID0gc3RhdGUubGl0ZXJhbFRhYi5sZW5ndGg7XG4gICAgbGV0IGZ1bkNvdW50ID0gc3RhdGUuZnVuY3Rpb25UYWIubGVuZ3RoO1xuICAgIGlmIChsaXRDb3VudCAhPT0gdGhpcy5pbml0aWFsVmVjdG9yLmxlbmd0aCkge1xuICAgICAgICBsZXQgbmV4dFZlY3QgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGxpdENvdW50OyArK2kpIHtcbiAgICAgICAgICAgIG5leHRWZWN0LnB1c2goc3RhdGUubGl0ZXJhbFRhYltpXS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0aWFsVmVjdG9yID0gbmV4dFZlY3Q7XG4gICAgfVxuICAgIGxldCBsaXR4ID0gMDtcbiAgICBpZiAob3B0aW9ucy5yZXJvbGwpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdExpdFggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGl0eCA9IHRoaXMubGFzdExpdFg7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBsaXR4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGl0Q291bnQpO1xuICAgICAgICB0aGlzLmxhc3RMaXRYID0gbGl0eDtcbiAgICB9XG4gICAgbGV0IG1vZExpdCA9IHN0YXRlLmxpdGVyYWxUYWJbbGl0eF07XG4gICAgaWYgKG1vZExpdCkge1xuICAgICAgICAvLyBsZXQgZ2xpdGNoZWQgPSB0aGlzLmdsaXRjaE51bWJlcihtb2RMaXQudmFsdWUpO1xuICAgICAgICBsZXQgZ2xpdGNoZWQgPSB0aGlzLmdsaXRjaFJlbFRvSW5pdChtb2RMaXQudmFsdWUsIHRoaXMuaW5pdGlhbFZlY3RvcltsaXR4XSk7XG4gICAgICAgIGxldCB3YXMgPSBtb2RMaXQucmF3O1xuICAgICAgICBtb2RMaXQudmFsdWUgPSBnbGl0Y2hlZDtcbiAgICAgICAgbW9kTGl0LnJhdyA9IFwiXCIgKyBnbGl0Y2hlZDtcbiAgICAgICAgY29uc29sZS5sb2coXCJMaXRlcmFsOiBcIiArIGxpdHggKyBcIiBjaGFuZ2VkIGZyb206IFwiICsgd2FzICsgXCIgdG86IFwiICsgZ2xpdGNoZWQpO1xuICAgIH1cblxufVxuICBnbGl0Y2hOdW1iZXIobnVtKSB7XG4gICAgaWYgKG51bSA9PT0gMCkge1xuICAgICAgICBudW0gPSAxO1xuICAgIH1cbiAgICBsZXQgcmFuZ2UgPSBudW0gKiAyO1xuICAgIGxldCBybmRWYWwgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiByYW5nZSAqIDEwMDApIC8gMTAwMDtcbiAgICByZXR1cm4gcm5kVmFsO1xuICB9XG5cbiAgZ2xpdGNoUmVsVG9Jbml0KG51bSwgaW5pdFZhbCkge1xuICAgIGlmIChpbml0VmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGdsaXRjaE51bWJlcihudW0pO1xuICAgIH0gaWYgKGluaXRWYWwgPT09IDApIHtcbiAgICAgICAgaW5pdFZhbCA9IDAuNTtcbiAgICB9XG5cbiAgICBsZXQgcm5kVmFsID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogaW5pdFZhbCAqIDIgKiAxMDAwKSAvIDEwMDA7XG4gICAgcmV0dXJuIHJuZFZhbDtcbn1cbn0gLy8gIEVuZCBvZiBjbGFzcyBNdXRhdG9yLlxuXG5tb2R1bGUuZXhwb3J0cyA9IE11dGF0b3JcbiIsIi8vIEEgZ2VuZXJhbGl6ZWQgJ1VuZG8gc3RhY2snIHdoaWNoIGNhbiBrZWVwIE4gbGV2ZWxzIG9mIHJldmVydGFibGUgc3RhdGUuXG5jbGFzcyBVbmRvU3RhY2sge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0KSB7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy5pbmRleCA9IC0xO1xuICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7XG4gICAgfVxuICAgIFxuICAgIGF0VG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gLTE7XG4gICAgfVxuXG4gICAgY2FuVW5kbygpIHtcbiAgICAgICAgaWYodGhpcy5zdGFjay5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IC0xIHx8IHRoaXMuaW5kZXggPiAwO1xuICAgIH1cblxuICAgIGNhblJlZG8oKSB7XG4gICAgICAgIGlmKHRoaXMuc3RhY2subGVuZ3RoID09PSAwIHx8IHRoaXMuaW5kZXggPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4IDwgdGhpcy5zdGFjay5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIHB1c2goaXRlbSkge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuc3RhY2subGVuZ3RoKSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5pbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpbWl0ICYmIHRoaXMuc3RhY2subGVuZ3RoID4gdGhpcy5saW1pdCkge1xuICAgICAgICAgICAgdGhpcy5zdGFjay5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhY2sucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICB1bmRvKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSAtMSkgeyAvLyBzdGFydCBvbmUgYmVoaW5kIHRoZSByZWRvIGJ1ZmZlclxuICAgICAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRleCA+IDApIHRoaXMuaW5kZXgtLTtcbiAgICAgICAgbGV0IHYgPSB0aGlzLnN0YWNrW3RoaXMuaW5kZXhdO1xuICAgICAgICByZXR1cm4gdjtcbiAgICB9XG5cbiAgICByZWRvKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPT09IDAgfHwgdGhpcy5pbmRleCA9PT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBuZXh0WCA9IHRoaXMuaW5kZXggKyAxO1xuICAgICAgICBpZiAobmV4dFggPj0gdGhpcy5zdGFjay5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXh0WDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5pbmRleF07XG4gICAgfVxufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtVbmRvU3RhY2t9IiwiLyogZXNsaW50LWRpc2FibGUgbm8tZXZhbCAqL1xudmFyIENvZGVNaXJyb3IgPSByZXF1aXJlKCdjb2RlbWlycm9yL2xpYi9jb2RlbWlycm9yJylcbnJlcXVpcmUoJ2NvZGVtaXJyb3IvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQnKVxucmVxdWlyZSgnY29kZW1pcnJvci9hZGRvbi9oaW50L2phdmFzY3JpcHQtaGludCcpXG5yZXF1aXJlKCdjb2RlbWlycm9yL2FkZG9uL2hpbnQvc2hvdy1oaW50JylcbnJlcXVpcmUoJ2NvZGVtaXJyb3IvYWRkb24vc2VsZWN0aW9uL21hcmstc2VsZWN0aW9uJylcbnJlcXVpcmUoJ2NvZGVtaXJyb3IvYWRkb24vY29tbWVudC9jb21tZW50JylcblxudmFyIE11dGF0b3IgPSByZXF1aXJlKCcuL011dGF0b3IuanMnKTtcblxuXG52YXIgaXNTaG93aW5nID0gdHJ1ZVxuXG52YXIgRWRpdG9yQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG5cdGNvbnNvbGUubG9nKFwiKioqIEVkaXRvciBjbGFzcyBjcmVhdGVkXCIpO1xuICB2YXIgc2VsZiA9IHRoaXNcblxuXHR2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCdlZGl0b3ItY29udGFpbmVyJylcbiAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnVEVYVEFSRUEnKVxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcilcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsKVxuXG4gIHRoaXMubXV0YXRvciA9IG5ldyBNdXRhdG9yKHRoaXMpO1xuICB0aGlzLmNtID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZWwsIHtcbiAgICB0aGVtZTogJ3RvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzJyxcbiAgICB2YWx1ZTogJ2hlbGxvJyxcbiAgICBtb2RlOiB7bmFtZTogJ2phdmFzY3JpcHQnLCBnbG9iYWxWYXJzOiB0cnVlfSxcbiAgICBsaW5lV3JhcHBpbmc6IHRydWUsXG4gICAgc3R5bGVTZWxlY3RlZFRleHQ6IHRydWVcbiAgfSlcblxuICBjb25zb2xlLmxvZygnY29kZSBtaXJyb3InLCB0aGlzLmNtKVxuXHQvL3RoaXMuY20ucmVtb3ZlS2V5TWFwKClcblxuICB0aGlzLmNtLnJlZnJlc2goKVxuXG4gIHRoaXMuc2hvdygpXG4gIC8vIFRPIERPOiBhZGQgc2hvdyBjb2RlIHBhcmFtXG4gIGxldCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpXG4gIGxldCBzaG93Q29kZSA9IHNlYXJjaFBhcmFtcy5nZXQoJ3Nob3ctY29kZScpXG5cbiAgICBpZihzaG93Q29kZSA9PSBcImZhbHNlXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwibm90IHNob3dpbmcgY29kZVwiKVxuICAgICAgdmFyIGwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdDb2RlTWlycm9yLXNjcm9sbCcpWzBdXG4gICAgICBsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAvLyAgc2VsZi5sb2dFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgIGlzU2hvd2luZyA9IGZhbHNlXG4gICAgfVxuICAvL31cbn1cblxuRWRpdG9yQ2xhc3MucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNtLnNldFZhbHVlKCdcXG4gXFxuIC8vIFR5cGUgc29tZSBjb2RlIG9uIGEgbmV3IGxpbmUgKHN1Y2ggYXMgXCJvc2MoKS5vdXQoKVwiKSwgYW5kIHByZXNzIENUUkwrc2hpZnQrZW50ZXInKVxufVxuXG5FZGl0b3JDbGFzcy5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuY20uc2V0VmFsdWUodmFsKVxufVxuXG5FZGl0b3JDbGFzcy5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmNtLmdldFZhbHVlKClcbn1cblxuRWRpdG9yQ2xhc3MucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnQ29kZU1pcnJvci1zY3JvbGwnKVswXVxuICB2YXIgbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1oZWFkZXInKVxuLy8gICBsLnN0eWxlLm9wYWNpdHkgPSAwXG4vLyAvLyAgdGhpcy5sb2dFbGVtZW50LnN0eWxlLm9wYWNpdHkgID0gMFxuLy8gICBtLnN0eWxlLm9wYWNpdHkgPSAwXG5sLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbm0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICB0aGlzLmlzU2hvd2luZyA9IGZhbHNlXG59XG5cbkVkaXRvckNsYXNzLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ0NvZGVNaXJyb3Itc2Nyb2xsJylbMF1cbiAgdmFyIG0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWwtaGVhZGVyJylcbiAgLy8gbC5zdHlsZS5vcGFjaXR5PSAxXG4gIC8vIG0uc3R5bGUub3BhY2l0eSA9IDFcblx0bC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuXHRtLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcbi8vICB0aGlzLmxvZ0VsZW1lbnQuc3R5bGUub3BhY2l0eSAgPSAxXG4gIHRoaXMuaXNTaG93aW5nID0gdHJ1ZVxufVxuXG5FZGl0b3JDbGFzcy5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5pc1Nob3dpbmcpIHtcbiAgICB0aGlzLmhpZGUoKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuc2hvdygpXG4gIH1cbn1cblxuRWRpdG9yQ2xhc3MucHJvdG90eXBlLmdldExpbmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjID0gdGhpcy5jbS5nZXRDdXJzb3IoKVxuICB2YXIgcyA9IHRoaXMuY20uZ2V0TGluZShjLmxpbmUpXG4vLyAgdGhpcy5jbS5tYXJrVGV4dCh7bGluZTogYy5saW5lLCBjaDowfSwge2xpbmU6IGMubGluZSsxLCBjaDowfSwge2NsYXNzTmFtZTogJ3N0eWxlZC1iYWNrZ3JvdW5kJ30pXG4gIHRoaXMuZmxhc2hDb2RlKHtsaW5lOiBjLmxpbmUsIGNoOjB9LCB7bGluZTogYy5saW5lKzEsIGNoOjB9KVxuICByZXR1cm4gc1xufVxuXG5FZGl0b3JDbGFzcy5wcm90b3R5cGUuZmxhc2hDb2RlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcblx0ICBpZighc3RhcnQpIHN0YXJ0ID0ge2xpbmU6IHRoaXMuY20uZmlyc3RMaW5lKCksIGNoOjB9XG5cdFx0aWYoIWVuZCkgZW5kID0ge2xpbmU6IHRoaXMuY20ubGFzdExpbmUoKSArIDEsIGNoOjB9XG4gICAgdmFyIG1hcmtlciA9IHRoaXMuY20ubWFya1RleHQoc3RhcnQsIGVuZCwge2NsYXNzTmFtZTogJ3N0eWxlZC1iYWNrZ3JvdW5kJ30pXG4gICAgc2V0VGltZW91dCgoKSA9PiAgIG1hcmtlci5jbGVhcigpLCAzMDApXG59XG5cblxuRWRpdG9yQ2xhc3MucHJvdG90eXBlLmdldEN1cnJlbnRCbG9jayA9IGZ1bmN0aW9uICgpIHsgLy8gdGhhbmtzIHRvIGdyYWhhbSB3YWtlZmllbGQgKyBnaWJiZXJcbiAgdmFyIGVkaXRvciA9IHRoaXMuY21cbiAgdmFyIHBvcyA9IGVkaXRvci5nZXRDdXJzb3IoKVxuICB2YXIgc3RhcnRsaW5lID0gcG9zLmxpbmVcbiAgdmFyIGVuZGxpbmUgPSBwb3MubGluZVxuICB3aGlsZSAoc3RhcnRsaW5lID4gMCAmJiBlZGl0b3IuZ2V0TGluZShzdGFydGxpbmUpICE9PSAnJykge1xuICAgIHN0YXJ0bGluZS0tXG4gIH1cbiAgd2hpbGUgKGVuZGxpbmUgPCBlZGl0b3IubGluZUNvdW50KCkgJiYgZWRpdG9yLmdldExpbmUoZW5kbGluZSkgIT09ICcnKSB7XG4gICAgZW5kbGluZSsrXG4gIH1cbiAgdmFyIHBvczEgPSB7XG4gICAgbGluZTogc3RhcnRsaW5lLFxuICAgIGNoOiAwXG4gIH1cbiAgdmFyIHBvczIgPSB7XG4gICAgbGluZTogZW5kbGluZSxcbiAgICBjaDogMFxuICB9XG4gIHZhciBzdHIgPSBlZGl0b3IuZ2V0UmFuZ2UocG9zMSwgcG9zMilcblxuICB0aGlzLmZsYXNoQ29kZShwb3MxLCBwb3MyKVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHBvczEsXG4gICAgZW5kOiBwb3MyLFxuICAgIHRleHQ6IHN0clxuICB9XG59XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IEVkaXRvckNsYXNzXG4iLCJtb2R1bGUuZXhwb3J0cz1bXG4gIHtcbiAgICBcInNrZXRjaF9pZFwiOiBcImV4YW1wbGVfMFwiLFxuICBcImNvZGVcIjogXCJKVEpHSlRKR1JteHZjaVV5TUdSbEpUSXdSblZsWjI4bE1FRWxNRUZ6YUdGd1pTZ3lNREFsTWtNd0xqVWxNa014TGpVcEpUQkJMbk5qWVd4bEtEQXVOU1V5UXpBdU5Ta2xNRUV1WTI5c2IzSW9KVFZDTUM0MUpUSkRNaVUxUkM1emJXOXZkR2dvTVNrbE1rTXdMak1sTWtNd0tTVXdRUzV5WlhCbFlYUW9NaVV5UXpJcEpUQkJMbTF2WkhWc1lYUmxVMk5oYkdVb2IzTmpLRE1sTWtNd0xqVXBKVEpETFRBdU5pa2xNRUV1WVdSa0tHOHdKVEpETUM0MUtTVXdRUzV6WTJGc1pTZ3dMamtwSlRCQkxtOTFkQ2dwXCJcbn0se1xuICBcInNrZXRjaF9pZFwiOiBcImV4YW1wbGVfM1wiLFxuICBcImNvZGVcIjpcIkpUSkdKVEpHSlRJd1lua2xNakJQYkdsMmFXRWxNakJLWVdOckpUQkJKVEJCYjNOaktESXdKVEpESlRJd01DNHdNeVV5UXlVeU1ERXVOeWt1YTJGc1pXbGtLQ2t1YlhWc2RDaHZjMk1vTWpBbE1rTWxNakF3TGpBd01TVXlReVV5TURBcExuSnZkR0YwWlNneExqVTRLU2t1WW14bGJtUW9iekFsTWtNbE1qQXdMamswS1M1dGIyUjFiR0YwWlZOallXeGxLRzl6WXlneE1DVXlReVV5TURBcEpUSkRMVEF1TURNcExuTmpZV3hsS0RBdU9DVXlReVV5TUNncEpUSXdKVE5FSlRORkpUSXdLREV1TURVbE1qQWxNa0lsTWpBd0xqRWxNakFxSlRJd1RXRjBhQzV6YVc0b01DNHdOU3AwYVcxbEtTa3BMbTkxZENodk1Daz1cIlxufSx7XG4gIFwic2tldGNoX2lkXCI6IFwiZXhhbXBsZV80XCIsXG4gIFwiY29kZVwiOlwiSlRKR0pUSkdKVEl3WW5rbE1qQk9aV3h6YjI0bE1qQldaWEpoSlRCQkpUSkdKVEpHSlRJd2RIZHBkSFJsY2lVelFTVXlNQ1UwTUc1bGJGOXpiMjV2Ykc5bmFXRWxNRUVsTUVGdmMyTW9PQ1V5UXkwd0xqVWxNa01sTWpBeEtTNWpiMnh2Y2lndE1TNDFKVEpESlRJd0xURXVOU1V5UXlVeU1DMHhMalVwTG1Kc1pXNWtLRzh3S1M1eWIzUmhkR1VvTFRBdU5TVXlReVV5TUMwd0xqVXBMbTF2WkhWc1lYUmxLSE5vWVhCbEtEUXBMbkp2ZEdGMFpTZ3dMalVsTWtNbE1qQXdMalVwTG5OallXeGxLRElwTG5KbGNHVmhkRmdvTWlVeVF5VXlNRElwTG0xdlpIVnNZWFJsS0c4d0pUSkRKVEl3S0NrbE1qQWxNMFFsTTBVbE1qQnRiM1Z6WlM1NEpUSXdLaVV5TURBdU1EQXdOU2t1Y21Wd1pXRjBXU2d5SlRKREpUSXdNaWtwTG05MWRDaHZNQ2tsTUVFbE1FRWxNRUVsTUVFbE1FRWxNRUU9XCJcbn0se1xuICBcInNrZXRjaF9pZFwiOiBcImV4YW1wbGVfNlwiLFxuICBcImNvZGVcIjpcIkpUSkdKVEpHSlRJd1lua2xNakJFSlVNekpVRTVZbTl5WVNVeU1FWmhiR3hsYVhKdmN5VXlNRWR2Ym5waGJHVnpKVEJCSlRKR0pUSkdKVEl3YUhSMGNITWxNMEVsTWtZbE1rWjNkM2N1WjI5dWVtRnNaWE5rWldKdmNtRXVZMjl0SlRKR0pUQkJKVEJCYjNOaktEVXBMbUZrWkNodWIybHpaU2cxSlRKREpUSXdNaWtwTG1OdmJHOXlLREFsTWtNbE1qQXdKVEpESlRJd015a3VZMjlzYjNKaGJXRW9NQzQwS1M1dmRYUW9LU1V3UVNVd1FTVXdRU1V3UVE9PVwiXG59LHtcbiAgXCJza2V0Y2hfaWRcIjogXCJleGFtcGxlXzhcIixcbiAgXCJjb2RlXCI6XCJKVEpHSlRKR0pUSXdZbmtsTWpCU2IyUnlhV2R2SlRJd1ZtVnNZWE5qYnlVd1FTVXlSaVV5UmlVeU1HaDBkSEJ6SlROQkpUSkdKVEpHZVdWamRHOHVaMmwwYUhWaUxtbHZKVEpHSlRCQkpUQkJiM05qS0RFd055VXlReVV5TURBbE1rTWxNakF3TGpjcExtTnZiRzl5S0RFbE1rTWxNakF3SlRKREpUSXdNU2t1Y205MFlYUmxLREFsTWtNbE1qQXRNQzR3T0NrdWJXOWtkV3hoZEdWU2IzUmhkR1VvYnpFbE1rTWxNakF3TGpRcExtOTFkQ2h2TUNrbE1FRnZjMk1vTXpNcExuSnZkR0YwWlNneUpUSkRKVEl3TUM0NEtTNXRiMlIxYkdGMFpWSnZkR0YwWlNodk1DVXlReVV5TUNncEpUSXdKVE5FSlRORkpUSXdLR0V1Wm1aMEpUVkNNQ1UxUkNveUtTa3ViM1YwS0c4eEtTVXdRUT09XCJcbn0se1xuICBcInNrZXRjaF9pZFwiOiBcImV4YW1wbGVfOVwiLFxuICBcImNvZGVcIjpcIkpUSkdKVEpHSlRJd1lua2xNakJTYjJSeWFXZHZKVEl3Vm1Wc1lYTmpieVV3UVNVeVJpVXlSaVV5TUdoMGRIQnpKVE5CSlRKR0pUSkdlV1ZqZEc4dVoybDBhSFZpTG1sdkpUSkdKVEJCSlRCQmIzTmpLREU0SlRKREpUSXdNQzR4SlRKREpUSXdNQ2t1WTI5c2IzSW9NaVV5UXlVeU1EQXVNU1V5UXlVeU1ESXBKVEJCTG0xMWJIUW9iM05qS0RJd0pUSkRKVEl3TUM0d01TVXlReVV5TURBcEtTNXlaWEJsWVhRb01pVXlReVV5TURJd0tTNXliM1JoZEdVb01DNDFLUzV0YjJSMWJHRjBaU2h2TVNrbE1FRXVjMk5oYkdVb01TVXlReVV5TUNncEpUSXdKVE5FSlRORkpUSXdKVEl3S0dFdVptWjBKVFZDTUNVMVJDb3dMamtsTWpBbE1rSWxNakF5S1NrdVpHbG1aaWh2TVNrdWIzVjBLRzh3S1NVd1FXOXpZeWd5TUNVeVF5VXlNREF1TWlVeVF5VXlNREFwTG1OdmJHOXlLRElsTWtNbE1qQXdMamNsTWtNbE1qQXdMakVwTG0xMWJIUW9iM05qS0RRd0tTa3ViVzlrZFd4aGRHVlNiM1JoZEdVb2J6QWxNa01sTWpBd0xqSXBKVEJCTG5KdmRHRjBaU2d3TGpJcExtOTFkQ2h2TVNrPVwiXG59LHtcbiAgXCJza2V0Y2hfaWRcIjogXCJleGFtcGxlXzEwXCIsXG4gIFwiY29kZVwiOlwiSlRKR0pUSkdKVEl3WW5rbE1qQmFZV05vSlRJd1MzSmhiR3dsTUVFbE1rWWxNa1lsTWpCb2RIUndKVE5CSlRKR0pUSkdlbUZqYUd0eVlXeHNMbTl1YkdsdVpTVXlSaVV3UVNVd1FXOXpZeWdsTWpBeU1UVWxNa01sTWpBd0xqRWxNa01sTWpBeUpUSXdLU1V3UVM1dGIyUjFiR0YwWlNnbE1FRWxNakFsTWpCdmMyTW9KVEl3TWlVeVF5VXlNQzB3TGpNbE1rTWxNakF4TURBbE1qQXBKVEJCSlRJd0pUSXdMbkp2ZEdGMFpTZ3hOU2tsTUVFcEpUQkJMbTExYkhRb0pUQkJKVEl3SlRJd2IzTmpLQ1V5TURJeE5TVXlReVV5TUMwd0xqRWxNa01sTWpBeUtTVXdRU1V5TUNVeU1DNXdhWGhsYkdGMFpTZ2xNakExTUNVeVF5VXlNRFV3SlRJd0tTVXdRU2tsTUVFdVkyOXNiM0lvSlRJd01DNDVKVEpESlRJd01DNHdKVEpESlRJd01DNDVKVEl3S1NVd1FTNXRiMlIxYkdGMFpTZ2xNRUVsTWpBbE1qQnZjMk1vSlRJd05pVXlReVV5TUMwd0xqRWxNakFwSlRCQkpUSXdKVEl3TG5KdmRHRjBaU2dsTWpBNUpUSXdLU1V3UVNrbE1FRXVZV1JrS0NVd1FTVXlNQ1V5TUc5ell5Z2xNakF4TUNVeVF5VXlNQzB3TGprbE1rTWxNakE1TURBbE1qQXBKVEJCSlRJd0pUSXdMbU52Ykc5eUtERWxNa013SlRKRE1Ta2xNRUVwSlRCQkxtMTFiSFFvSlRCQkpUSXdKVEl3YzJoaGNHVW9PVEF3SlRKREpUSXdNQzR5SlRKREpUSXdNU2tsTUVFbE1qQWxNakF1YkhWdFlTZ3BKVEJCSlRJd0pUSXdMbkpsY0dWaGRGZ29NaWtsTUVFbE1qQWxNakF1Y21Wd1pXRjBXU2d5S1NVd1FTVXlNQ1V5TUM1amIyeHZjbUZ0WVNneE1Da2xNRUVwSlRCQkxtMXZaSFZzWVhSbEtDVXdRU1V5TUNVeU1HOXpZeWdsTWpBNUpUSkRKVEl3TFRBdU15VXlReVV5TURrd01DVXlNQ2tsTUVFbE1qQWxNakF1Y205MFlYUmxLQ1V5TURZbE1qQXBKVEJCS1NVd1FTNWhaR1FvSlRCQkpUSXdKVEl3YjNOaktEUWxNa01sTWpBeEpUSkRKVEl3T1RBcEpUQkJKVEl3SlRJd0xtTnZiRzl5S0RBdU1pVXlRekFsTWtNeEtTVXdRU2tsTUVFdWIzVjBLQ2tsTUVFPVwiXG59LHtcbiAgXCJza2V0Y2hfaWRcIjogXCJleGFtcGxlXzExXCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd1lua2xNakJhWVdOb0pUSXdTM0poYkd3bE1FRWxNa1lsTWtZbE1qQm9kSFJ3SlROQkpUSkdKVEpHZW1GamFHdHlZV3hzTG05dWJHbHVaU1V5UmlVd1FTVXdRVzl6WXlneE1DVXlReVV5TURBdU9TVXlReVV5TURNd01Da2xNRUV1WTI5c2IzSW9NQzQ1SlRKREpUSXdNQzQzSlRKREpUSXdNQzQ0S1NVd1FTNWthV1ptS0NVd1FTVXlNQ1V5TUc5ell5ZzBOU1V5UXlVeU1EQXVNeVV5UXlVeU1ERXdNQ2tsTUVFbE1qQWxNakF1WTI5c2IzSW9NQzQ1SlRKREpUSXdNQzQ1SlRKREpUSXdNQzQ1S1NVd1FTVXlNQ1V5TUM1eWIzUmhkR1VvTUM0eE9Da2xNRUVsTWpBbE1qQXVjR2w0Wld4aGRHVW9NVElwSlRCQkpUSXdKVEl3TG10aGJHVnBaQ2dwSlRCQktTVXdRUzV6WTNKdmJHeFlLREV3S1NVd1FTNWpiMnh2Y21GdFlTZ3BKVEJCTG14MWJXRW9LU1V3UVM1eVpYQmxZWFJZS0RRcEpUQkJMbkpsY0dWaGRGa29OQ2tsTUVFdWJXOWtkV3hoZEdVb0pUQkJKVEl3SlRJd2IzTmpLREVsTWtNbE1qQXRNQzQ1SlRKREpUSXdNekF3S1NVd1FTa2xNRUV1YzJOaGJHVW9NaWtsTUVFdWIzVjBLQ2tsTUVFPVwiXG59LHtcbiAgXCJza2V0Y2hfaWRcIjogXCJleGFtcGxlXzEzXCIsXG4gIFwiY29kZVwiOlwiSlRKR0pUSkdKVEl3WVdOcFpDVXlNR0oxY3lVeU1ITmxZWFFsTUVFbE1rWWxNa1lsTWpCaWVTVXlNRmRwYkd3bE1qQklkVzF3YUhKbGVYTWxNRUVsTWtZbE1rWWxNakJvZEhSd2N5VXpRU1V5UmlVeVJtZHBkR2gxWWk1amIyMGxNa1pVYUdWWGFYTndlU1V3UVNVd1FXOXpZeWd4TURVcExtTnZiRzl5S0RBdU5TVXlRekF1TVNVeVF6QXVPQ2t1Y205MFlYUmxLREF1TVRFbE1rTWxNakF3TGpFcExtMXZaSFZzWVhSbEtHOXpZeWd4TUNrdWNtOTBZWFJsS0RBdU15a3VZV1JrS0c4d0pUSkRKVEl3TUM0eEtTa3VZV1JrS0c5ell5Z3lNQ1V5UXpBdU1ERWxNa014S1M1amIyeHZjaWd3SlRKRE1DNDRKVEpETVNrcExtOTFkQ2h2TUNrbE1FRnZjMk1vTlRBbE1rTXdMakExSlRKREpUSXdNQzQzS1M1amIyeHZjaWd4SlRKRE1DNDNKVEpETUM0MUtTNWthV1ptS0c4d0tTNXRiMlIxYkdGMFpTaHZNU1V5UXpBdU1EVXBMbTkxZENodk1Ta2xNRUZ5Wlc1a1pYSW9iekVwXCJcbn0sXG57XG4gIFwic2tldGNoX2lkXCI6IFwiZXhhbXBsZV8xNFwiLFxuICBcImNvZGVcIjogXCJKVEpHSlRKR0pUSXdZbmtsTWpCUGJHbDJhV0VsTWpCS1lXTnJKVEJCSlRKR0pUSkdKVEl3SlRRd1gyOXFZV05yWHlVd1FTVXdRVzl6WXlneU1DVXlReVV5TURBdU1ERWxNa01sTWpBeExqRXBKVEJCSlRBNUxtdGhiR1ZwWkNnMUtTVXdRU1V3T1M1amIyeHZjaWd5TGpnekpUSkRNQzQ1TVNVeVF6QXVNemtwSlRCQkpUQTVMbkp2ZEdGMFpTZ3dKVEpESlRJd01DNHhLU1V3UVNVd09TNXRiMlIxYkdGMFpTaHZNQ1V5UXlVeU1DZ3BKVEl3SlRORUpUTkZKVEl3Ylc5MWMyVXVlQ1V5TUNvbE1qQXdMakF3TURNcEpUQkJKVEE1TG5OallXeGxLREV1TURFcEpUQkJKVEl3SlRJd0pUQTVMbTkxZENodk1Daz1cIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJleGFtcGxlXzE1XCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd1lua2xNakJQYkdsMmFXRWxNakJLWVdOckpUQkJKVEpHSlRKR0pUSXdhSFIwY0hNbE0wRWxNa1lsTWtadmFtRmpheTVuYVhSb2RXSXVhVzhsTUVFbE1FRnZjMk1vTVRBd0pUSkRKVEl3TUM0d01TVXlReVV5TURFdU5Da2xNRUVsTURrdWNtOTBZWFJsS0RBbE1rTWxNakF3TGpFcEpUQkJKVEE1TG0xMWJIUW9iM05qS0RFd0pUSkRKVEl3TUM0eEtTNXRiMlIxYkdGMFpTaHZjMk1vTVRBcExuSnZkR0YwWlNnd0pUSkRKVEl3TFRBdU1Ta2xNa01sTWpBeEtTa2xNRUVsTURrdVkyOXNiM0lvTWk0NE15VXlRekF1T1RFbE1rTXdMak01S1NVd1FTVXlNQ1V5TUM1dmRYUW9iekFwXCJcbn0sXG57XG4gIFwic2tldGNoX2lkXCI6IFwiZXhhbXBsZV8xNlwiLFxuICBcImNvZGVcIjogXCJKVEpHSlRKR0pUSXdZbmtsTWpCUGJHbDJhV0VsTWpCS1lXTnJKVEJCSlRKR0pUSkdKVEl3YUhSMGNITWxNMEVsTWtZbE1rWnZhbUZqYXk1bmFYUm9kV0l1YVc4bE1FRWxNRUZ2YzJNb05DVXlReVV5TURBdU1TVXlReVV5TURBdU9Da3VZMjlzYjNJb01TNHdOQ1V5UXpBbE1rTWxNakF0TVM0eEtTNXliM1JoZEdVb01DNHpNQ1V5UXlVeU1EQXVNU2t1Y0dsNFpXeGhkR1VvTWlVeVF5VXlNREl3S1M1dGIyUjFiR0YwWlNodWIybHpaU2d5TGpVcEpUSkRKVEl3S0NrbE1qQWxNMFFsTTBVbE1qQXhMalVsTWpBcUpUSXdUV0YwYUM1emFXNG9NQzR3T0NVeU1Db2xNakIwYVcxbEtTa3ViM1YwS0c4d0tRPT1cIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJleGFtcGxlXzE3XCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd2JXOXBjbVVsTUVFbE1rWWxNa1lsTWpCaWVTVXlNRTlzYVhacFlTVXlNRXBoWTJzbE1FRWxNa1lsTWtZbE1qQjBkMmwwZEdWeUpUTkJKVEl3SlRRd1gyOXFZV05yWHlVd1FTVXdRWEJoZEhSbGNtNGxNakFsTTBRbE1qQW9LU1V5TUNVelJDVXpSU1V5TUc5ell5Z3lNREFsTWtNbE1qQXdLUzVyWVd4bGFXUW9NakF3S1M1elkyRnNaU2d4SlRKREpUSXdNQzQwS1NVd1FTVXlSaVV5UmlVd1FYQmhkSFJsY200b0tTVXdRU1V5TUNVeU1DNXpZM0p2Ykd4WUtEQXVNU1V5UXlVeU1EQXVNREVwSlRCQkpUSXdKVEl3TG0xMWJIUW9jR0YwZEdWeWJpZ3BLU1V3UVNVeU1DVXlNQzV2ZFhRb0tRPT1cIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJleGFtcGxlXzE4XCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd1lua2xNakJQYkdsMmFXRWxNakJLWVdOckpUQkJKVEpHSlRKR0pUSXdhSFIwY0hNbE0wRWxNa1lsTWtadmFtRmpheTVuYVhSb2RXSXVhVzhsTUVFbE1FRnZjMk1vTmlVeVF5VXlNREFsTWtNbE1qQXdMamdwSlRCQkpUSXdKVEl3TG1OdmJHOXlLREV1TVRRbE1rTWxNakF3TGpZbE1rTXVPREFwSlRCQkpUSXdKVEl3TG5KdmRHRjBaU2d3TGpreUpUSkRKVEl3TUM0ektTVXdRU1V5TUNVeU1DNXdhWGhsYkdGMFpTZ3lNQ1V5UXlVeU1ERXdLU1V3UVNVeU1DVXlNQzV0ZFd4MEtHOXpZeWcwTUNVeVF5VXlNREF1TURNcExuUm9jbVZ6YUNnd0xqUXBMbkp2ZEdGMFpTZ3dKVEpESlRJd0xUQXVNRElwS1NVd1FTVXlNQ1V5TUM1dGIyUjFiR0YwWlZKdmRHRjBaU2h2YzJNb01qQWxNa01sTWpBd0tTNTBhSEpsYzJnb01DNHpKVEpESlRJd01DNDJLU1V5UXlVeU1DZ3BKVEl3SlRORUpUTkZKVEl3TUM0eEpUSXdKVEpDSlRJd2JXOTFjMlV1ZUNVeU1Db2xNakF3TGpBd01pa2xNRUVsTWpBbE1qQXViM1YwS0c4d0tRPT1cIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJyYW5nZ2FfMFwiLFxuICBcImNvZGVcIjogXCJKVEpHSlRKR0pUSXdSSEpsWVcxNUpUSXdSR2xoYlc5dVpDVXdRU1V5UmlVeVJpVXlNR0o1SlRJd1VtRnVaMmRoSlRJd1VIVnlibUZ0WVNVeU1FRnFhU1V3UVNVeVJpVXlSaVV5TUdoMGRIQnpKVE5CSlRKR0pUSkdjbUZ1WjJkaGNIVnlibUZ0WVdGcWFURXVkMmw0YzJsMFpTNWpiMjBsTWtad2IzSjBabTlzYVc4bE1FRWxNRUZ2YzJNb055VXlReTB3TGpFeU5Ta3ViVzlrZFd4aGRHVW9kbTl5YjI1dmFTZ3hLU2t1WkdsbVppaDJiM0p2Ym05cEtERXBMbTExYkhRb1ozSmhaR2xsYm5Rb0xURXBMbXgxYldFb01DNHhNalVwS1NrbE1FRWxNakFsTWpBdWJIVnRZU2d3TGpFeU5Ta2xNRUVsTWpBbE1qQXVZV1JrS0hOb1lYQmxLRGNsTWtNbE1qQXdMalVwSlRCQkpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdMbTExYkhRb2RtOXliMjV2YVNneE1DVXlReklwTG1Kc1pXNWtLRzh3S1M1a2FXWm1LR2R5WVdScFpXNTBLREVwS1M1dGIyUjFiR0YwWlNoMmIzSnZibTlwS0NrcEtTa2xNRUVsTWpBbE1qQXVjMk55YjJ4c1dTZ3RNQzR4S1NVd1FTVXlNQ1V5TUM1elkzSnZiR3hZS0RBdU1USTFLU1V3UVNVeU1DVXlNQzVpYkdWdVpDaHZNQ2tsTUVFbE1qQWxNakF1WW14bGJtUW9iekFwSlRCQkpUSXdKVEl3TG05MWRDZ3BKVEJCXCJcbn0sXG57XG4gIFwic2tldGNoX2lkXCI6IFwicmFuZ2dhXzFcIixcbiAgXCJjb2RlXCI6IFwiSlRKR0pUSkdKVEl3VkdGbkpUSXdKVEkySlRJd1UzZGxaWEFsTUVFbE1rWWxNa1lsTWpCaWVTVXlNRkpoYm1kbllTVXlNRkIxY201aGJXRWxNakJCYW1rbE1FRWxNa1lsTWtZbE1qQm9kSFJ3Y3lVelFTVXlSaVV5Um5KaGJtZG5ZWEIxY201aGJXRmhhbWt4TG5kcGVITnBkR1V1WTI5dEpUSkdjRzl5ZEdadmJHbHZKVEJCSlRCQmIzTmpLRFVsTWtNd0xqRXlOU2t1WTI5c2IzSmhiV0VvTVNrbE1FRWxNakFsTWpBdWJIVnRZU2d3TGpFeU5Ta3VZV1JrS0hOb1lYQmxLREVsTWtNd0xqVXBMbXgxYldFb01pa3VaR2xtWmlobmNtRmthV1Z1ZENneEtTa3BKVEJCSlRJd0pUSXdMbVJwWm1Zb2IzTmpLQzB4SlRKRExUQXVNalVwS1M1aWJHVnVaQ2h2TUNrdVkyOXNiM0lvTUNVeVF6SXVOU1V5UXpFdU56VXBKVEJCSlRJd0pUSXdMbTkxZENncFwiXG59LFxue1xuICBcInNrZXRjaF9pZFwiOiBcInJhbmdnYV8yXCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd1RXOXViMk5vY205dFpTVXlNRTFsYlc5aGNpVXdRU1V5UmlVeVJpVXlNR0o1SlRJd1VtRnVaMmRoSlRJd1VIVnlibUZ0WVNVeU1FRnFhU1V3UVNVeVJpVXlSaVV5TUdoMGRIQnpKVE5CSlRKR0pUSkdjbUZ1WjJkaGNIVnlibUZ0WVdGcWFURXVkMmw0YzJsMFpTNWpiMjBsTWtad2IzSjBabTlzYVc4bE1FRWxNRUYyYjNKdmJtOXBLRFV3SlRKRE1Ta2xNRUVsTWpBbE1qQXViSFZ0WVNnd0xqVXBMbUZrWkNoemFHRndaU2d4SlRKRE1Ta3ViSFZ0WVNneEtTa2xNRUVsTWpBbE1qQXViVzlrZFd4aGRHVW9iM05qS0MweE1EQXdKVEpETFRFcEpUQkJKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdMbTF2WkhWc1lYUmxLRzl6WXlncExteDFiV0VvS1NrcEpUQkJKVEl3SlRJd0xtSnNaVzVrS0c4d0tTVXdRU1V5TUNVeU1DNWliR1Z1WkNodk1Da2xNRUVsTWpBbE1qQXVZbXhsYm1Rb2J6QXBKVEJCSlRJd0pUSXdMbUpzWlc1a0tHOHdLU1V3UVNVeU1DVXlNQzV2ZFhRb0tRPT1cIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJyYW5nZ2FfM1wiLFxuICBcImNvZGVcIjogXCJKVEpHSlRKR0pUSXdSMkZzWVhoNUpUSXdWSEpwY0NVd1FTVXlSaVV5UmlVeU1HSjVKVEl3VW1GdVoyZGhKVEl3VUhWeWJtRnRZU1V5TUVGcWFTVXdRU1V5UmlVeVJpVXlNR2gwZEhCekpUTkJKVEpHSlRKR2NtRnVaMmRoY0hWeWJtRnRZV0ZxYVRFdWQybDRjMmwwWlM1amIyMGxNa1p3YjNKMFptOXNhVzhsTUVFbE1FRnphR0Z3WlNneEpUSkRNU2tsTUVFbE1qQWxNakF1YlhWc2RDaDJiM0p2Ym05cEtERXdNREFsTWtNeUtTVXdRU1V5TUNVeU1DNWliR1Z1WkNodk1Da3ViSFZ0WVNncEtTVXdRU1V5TUNVeU1DNWhaR1FvYzJoaGNHVW9NeVV5UXpBdU1USTFLU1V3UVNVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1DNXliM1JoZEdVb01TVXlRekVwTG0xMWJIUW9kbTl5YjI1dmFTZ3hNREF3SlRKRE1Ta3ViSFZ0WVNncEtTVXdRU1V5TUNVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUM1eWIzUmhkR1VvTVM0MUtTa3VjMk55YjJ4c1dDZ2xOVUl3TGpFbE1rTXRNQzR3TmpJMUpUSkRNQzR3TURVbE1rTXdMakF3TURBeEpUVkVKVEpETUNrbE1FRWxNakFsTWpBdWMyTnliMnhzV1NnbE5VSXdMakVsTWtNdE1DNHdOakkxSlRKRE1DNHdNRFVsTWtNd0xqQXdNREF4SlRWRUpUSkRNQ2tsTUVFbE1qQWxNakF1YjNWMEtDaz1cIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJyYW5nZ2FfNFwiLFxuICBcImNvZGVcIjogXCJKVEpHSlRKR0pUSXdVM1Z0WlhRbE1FRWxNa1lsTWtZbE1qQmllU1V5TUZKaGJtZG5ZU1V5TUZCMWNtNWhiV0VsTWpCQmFta2xNRUVsTWtZbE1rWWxNakJvZEhSd2N5VXpRU1V5UmlVeVJuSmhibWRuWVhCMWNtNWhiV0ZoYW1reExuZHBlSE5wZEdVdVkyOXRKVEpHY0c5eWRHWnZiR2x2SlRCQkpUQkJiM05qS0RBdU5TVXlRekV1TWpVcExtMTFiSFFvYzJoaGNHVW9NU1V5UXpBdU1Ea3BMbkp2ZEdGMFpTZ3hMalVwS1NVd1FTVXlNQ1V5TUM1a2FXWm1LR2R5WVdScFpXNTBLQ2twSlRCQkpUSXdKVEl3TG1Ga1pDaHphR0Z3WlNneUpUSkRNaWt1WW14bGJtUW9aM0poWkdsbGJuUW9NU2twS1NVd1FTVXlNQ1V5TUM1dGIyUjFiR0YwWlNodWIybHpaU2dwSlRCQkpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0xtMXZaSFZzWVhSbEtHNXZhWE5sS0NrdWMyTnliMnhzV1NneEpUSkRNQzR3TmpJMUtTa3BKVEJCSlRJd0pUSXdMbUpzWlc1a0tHOHdLU1V3UVNVeU1DVXlNQzVqYjJ4dmNpZ3hKVEpETFRBdU5TVXlReTB3TGpjMUtTVXdRU1V5TUNVeU1DNXZkWFFvS1E9PVwiXG59LFxue1xuICBcInNrZXRjaF9pZFwiOiBcIm1hcmlhbm5lXzBcIixcbiAgXCJjb2RlXCI6IFwiSlRKR0pUSkdjRzl5ZENVd1FTVXlSaVV5Um1KNUpUSXdUV0Z5YVdGdWJtVWxNakJVWldsNGFXUnZKVEJCSlRKR0pUSkdhSFIwY0hNbE0wRWxNa1lsTWtadFlYSnBZVzV1WlhSbGFYaHBaRzh1WjJsMGFIVmlMbWx2SlRKR0pUQkJKVEJCYjNOaktEVWxNa01sTWpBd0xqa2xNa01sTWpBd0xqQXdNU2tsTUVFbE1qQWxNakFsTWpBbE1qQXVhMkZzWldsa0tDVTFRak1sTWtNMEpUSkROU1V5UXpjbE1rTTRKVEpET1NVeVF6RXdKVFZFTG1aaGMzUW9NQzR4S1NrbE1FRWxNakFsTWpBbE1qQWxNakF1WTI5c2IzSW9NQzQxSlRKREpUSXdNQzR6S1NVd1FTVXlNQ1V5TUNVeU1DVXlNQzVqYjJ4dmNtRnRZU2d3TGpRcEpUQkJKVEl3SlRJd0pUSXdKVEl3TG5KdmRHRjBaU2d3TGpBd09TVXlReWdwSlRORUpUTkZUV0YwYUM1emFXNG9kR2x0WlNrcUpUSXdMVEF1TURBeEpUSXdLU1V3UVNVeU1DVXlNQ1V5TUNVeU1DNXRiMlIxYkdGMFpWSnZkR0YwWlNodk1DVXlReWdwSlRORUpUTkZUV0YwYUM1emFXNG9kR2x0WlNrbE1qQXFKVEl3TUM0d01ETXBKVEJCSlRJd0pUSXdKVEl3SlRJd0xtMXZaSFZzWVhSbEtHOHdKVEpESlRJd01DNDVLU1V3UVNVeU1DVXlNQ1V5TUNVeU1DNXpZMkZzWlNnd0xqa3BKVEJCSlRJd0pUSXdKVEl3SlRJd0xtOTFkQ2h2TUNrbE1FRWxNRUU9XCJcbn0sXG57XG4gIFwic2tldGNoX2lkXCI6IFwibWFyaWFubmVfMVwiLFxuICBcImNvZGVcIjogXCJKVEpHSlRKR1VHbDRaV3h6WTJGd1pTVXdRU1V5UmlVeVJrMWhjbWxoYm01bEpUSXdWR1ZwZUdsa2J5VXdRU1V5UmlVeVJtaDBkSEJ6SlROQkpUSkdKVEpHWjJsMGFIVmlMbU52YlNVeVJrMWhjbWxoYm01bFZHVnBlR2xrYnlVd1FTVXdRWE55WXlodk1Da2xNRUVsTWpBdWMyRjBkWEpoZEdVb01TNHdNU2tsTUVFbE1qQXVjMk5oYkdVb0xqazVPU2tsTUVFbE1qQXVZMjlzYjNJb01TNHdNU1V5UXpFdU1ERWxNa014TGpBeEtTVXdRU1V5TUM1b2RXVW9MakF4S1NVd1FTVXlNQzV0YjJSMWJHRjBaVWgxWlNoemNtTW9iekVwTG1oMVpTZ3VNeWt1Y0c5emRHVnlhWHBsS0MweEtTNWpiMjUwY21GemRDZ3VOeWtsTWtNeUtTVXdRU1V5TUNVeU1DNXNZWGxsY2loemNtTW9iekVwSlRCQkpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0xteDFiV0VvS1NVd1FTVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1DNXRkV3gwS0dkeVlXUnBaVzUwS0RFcEpUQkJKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdMbk5oZEhWeVlYUmxLQzQ1S1NrcEpUQkJKVEl3SlRJd0xtOTFkQ2h2TUNrbE1FRWxNRUZ1YjJselpTZ3hKVEpESlRJd0xqSXBKVEJCSlRJd0pUSXdMbkp2ZEdGMFpTZ3lKVEpETGpVcEpUQkJKVEl3SlRJd0xteGhlV1Z5S0hOeVl5aHZNQ2tsTUVFbE1qQWxNakF1YzJOeWIyeHNXQ2d1TWlrcEpUQkJKVEl3SlRJd0xtOTFkQ2h2TVNrbE1FRWxNRUZ5Wlc1a1pYSW9iekFwXCJcblxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJuYW90b18wXCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd0pUUXdibUZ2ZEc5ZmFHbGxaR0VsTUVGdmMyTW9NakFsTWtNbE1qQXdMakVsTWtNbE1qQXdLUzVqYjJ4dmNpZ3dKVEpESlRJd01TVXlReVV5TURJcExuSnZkR0YwWlNneExqVTNKVEpHTWlrdWIzVjBLRzh4S1NVd1FXOXpZeWd6TUNVeVF5VXlNREF1TURFbE1rTWxNakF3S1M1amIyeHZjaWd5SlRKREpUSXdNQzQzSlRKREpUSXdNU2t1Ylc5a2RXeGhkR1VvYnpFbE1rTWxNakF3S1M1aFpHUW9iekVsTWtNeEtTNXRiMlIxYkdGMFpWQnBlR1ZzWVhSbEtHOHhKVEpETVNVeVF6RXdLUzV2ZFhRb2J6QXBcIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJuYW90b18xXCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd0pUUXdibUZ2ZEc5ZmFHbGxaR0VsTUVGemIyeHBaQ2d3TGpJbE1rTXdMallsTWtNd0xqa3BMbXhoZVdWeUtHOXpZeWd6TVM0MEpUSkRNQ2t1ZEdoeVpYTm9LREF1TnlrdWJIVnRZU2dwTG0xdlpIVnNZWFJsS0c5ell5ZzBKVEpETVNrdWNtOTBZWFJsS0RFcEpUSkRNQzR3TlNrdVkyOXNiM0lvTUNVeVF6QWxNa013S1NrdWJHRjVaWElvYjNOaktETXhMalFsTWtNd0tTNTBhSEpsYzJnb01DNDNLUzVzZFcxaEtDa3ViVzlrZFd4aGRHVW9iM05qS0RRbE1rTXhLUzV5YjNSaGRHVW9NU2tsTWtNd0xqRXBLUzV2ZFhRb0tRPT1cIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJyaXRjaHNlXzBcIixcbiAgXCJjb2RlXCI6IFwiSlRKR0pUSkdjbUZ1Wkc5dEpUSXdkSEo1Y0c5d2FHOWlhV0VsTWpBdEpUSXdZMmhoYm1kbGN5VXlNR1YyWlhKNWRHbHRaU1V5TUhsdmRTVXlNR3h2WVdRbE1qQnBkQ0VsTUVFbE1rWWxNa1ppZVNVeU1GSnBkR05vYzJVbE1FRWxNa1lsTWtacGJuTjBZV2R5WVcwdVkyOXRKVEpHY21sMFkyaHpaU1V3UVNVeU1DVXdRV1oxYm1OMGFXOXVKVEl3Y2lodGFXNGxNMFF3SlRKRGJXRjRKVE5FTVNrbE1qQWxOMElsTWpCeVpYUjFjbTRsTWpCTllYUm9MbkpoYm1SdmJTZ3BLaWh0WVhndGJXbHVLU1V5UW0xcGJpVXpRaVV5TUNVM1JDVXdRU1V5TUNVd1FYTnZiR2xrS0RFbE1rTXhKVEpETVNrbE1FRWxNakFsTWpBbE1Ea3VaR2xtWmloemFHRndaU2dsTlVJMEpUSkROQ1V5UXpRbE1rTXlOQ1UxUkM1emJXOXZkR2dvS1M1bVlYTjBLQzQxS1NVeVEzSW9NQzQySlRKRE1DNDVNeWtsTWtNdU1Ea3BMbkpsY0dWaGRDZ3lNQ1V5UXpFd0tTa2xNRUVsTURrdWJXOWtkV3hoZEdWVFkyRnNaU2h2YzJNb09Da3VjbTkwWVhSbEtISW9MUzQxSlRKRExqVXBLU1V5UXk0MU1pa2xNRUVsTURrdVlXUmtLQ1V3UVNVeU1DVXlNQ1V3T1NVd09YTnlZeWh2TUNrdWMyTmhiR1VvTUM0NU5qVXBMbkp2ZEdGMFpTZ3VNREV5S2loTllYUm9Mbkp2ZFc1a0tISW9MVElsTWtNeEtTa3BLU1V3UVNVeU1DVXlNQ1V3T1NVd09TNWpiMnh2Y2loeUtDa2xNa055S0NrbE1rTnlLQ2twSlRCQkpUSXdKVEl3SlRJd0pUSXdKVEE1TG0xdlpIVnNZWFJsVW05MFlYUmxLRzh3SlRKRGNpZ3dKVEpETUM0MUtTa2xNRUVsTWpBbE1qQWxNRGtsTURrdVluSnBaMmgwYm1WemN5Z3VNVFVwSlRCQkpUSXdKVEl3SlRBNUpUQTVKVEpETGpjcEpUQkJKVEE1TG05MWRDZ3BcIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJyaXRjaHNlXzFcIixcbiAgXCJjb2RlXCI6IFwiSlRKR0pUSkdZMjl5Y25Wd2RHVmtKVEl3YzJOeVpXVnVjMkYyWlhJbE1FRWxNa1lsTWtaaWVTVXlNRkpwZEdOb2MyVWxNRUVsTWtZbE1rWnBibk4wWVdkeVlXMHVZMjl0SlRKR2NtbDBZMmh6WlNVd1FTVXlNQ1V3UVhadmNtOXViMmtvTXpVd0pUSkRNQzR4TlNrbE1FRWxNakFsTWpBbE1Ea3ViVzlrZFd4aGRHVlRZMkZzWlNodmMyTW9PQ2t1Y205MFlYUmxLRTFoZEdndWMybHVLSFJwYldVcEtTVXlReTQxS1NVd1FTVXlNQ1V5TUNVd09TNTBhSEpsYzJnb0xqZ3BKVEJCSlRBNUxtMXZaSFZzWVhSbFVtOTBZWFJsS0c5ell5ZzNLU1V5UXk0MEtTVXdRU1V3T1M1MGFISmxjMmdvTGpjcEpUQkJKVEl3SlRJd0pUQTVMbVJwWm1Zb2MzSmpLRzh3S1M1elkyRnNaU2d4TGpncEtTVXdRU1V3T1M1dGIyUjFiR0YwWlZOallXeGxLRzl6WXlneUtTNXRiMlIxYkdGMFpWSnZkR0YwWlNodk1DVXlReTQzTkNrcEpUQkJKVEE1TG1ScFptWW9jM0pqS0c4d0tTNXliM1JoZEdVb0pUVkNMUzR3TVRJbE1rTXVNREVsTWtNdExqQXdNaVV5UXpBbE5VUXBMbk5qY205c2JGa29NQ1V5UXlVMVFpMHhKVEpHTVRrNU9EQXdKVEpETUNVMVJDNW1ZWE4wS0RBdU55a3BLU1V3UVNVd09TNWljbWxuYUhSdVpYTnpLQ1UxUWkwdU1ESWxNa010TGpFM0pUVkVMbk50YjI5MGFDZ3BMbVpoYzNRb0xqVXBLU1V3UVNVd09TNXZkWFFvS1E9PVwiXG59LFxue1xuICBcInNrZXRjaF9pZFwiOiBcInJpdGNoc2VfMlwiLFxuICBcImNvZGVcIjogXCJKVEpHSlRKR2RISnZjR2xqWVd3bE1qQnFkV2xqWlNVd1FTVXlSaVV5Um1KNUpUSXdVbWwwWTJoelpTVXdRU1V5UmlVeVJtbHVjM1JoWjNKaGJTNWpiMjBsTWtaeWFYUmphSE5sSlRCQkpUSXdKVEJCZG05eWIyNXZhU2d5SlRKRE1DNHpKVEpETUM0eUtTNXphR2xtZENnd0xqVXBKVEJCTG0xdlpIVnNZWFJsVUdsNFpXeGhkR1VvZG05eWIyNXZhU2cwSlRKRE1DNHlLU1V5UXpNeUpUSkRNaWtsTUVFdWMyTmhiR1VvS0NrbE0wUWxNMFV4SlRKQ0tFMWhkR2d1YzJsdUtIUnBiV1VxTWk0MUtTb3dMakExS1NrbE1FRXVaR2xtWmloMmIzSnZibTlwS0RNcExuTm9hV1owS0RBdU5pa3BKVEJCTG1ScFptWW9iM05qS0RJbE1rTXdMakUxSlRKRE1TNHhLUzV5YjNSaGRHVW9LU2tsTUVFdVluSnBaMmgwYm1WemN5Z3dMakVwTG1OdmJuUnlZWE4wS0RFdU1pa3VjMkYwZFhKaGRHVW9NUzR5S1NVd1FTVXdPUzV2ZFhRb0tTVXdRWE53WldWa0pUSXdKVE5FSlRJd01DNDRcIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJyaXRjaHNlXzNcIixcbiAgXCJjb2RlXCI6IFwiSlRKR0pUSkdkSEo1YVc1bkpUSXdkRzhsTWpCblpYUWxNakJqYkc5elpYSWxNRUVsTWtZbE1rWmllU1V5TUZKcGRHTm9jMlVsTUVFbE1rWWxNa1pwYm5OMFlXZHlZVzB1WTI5dEpUSkdjbWwwWTJoelpTVXdRU1V5TUNVd1FXOXpZeWcyTUNVeVF5MHdMakF4TlNVeVF6QXVNeWt1WkdsbVppaHZjMk1vTmpBbE1rTXdMakE0S1M1eWIzUmhkR1VvVFdGMGFDNVFTU1V5UmpJcEtTVXdRU1V3T1M1dGIyUjFiR0YwWlZOallXeGxLRzV2YVhObEtETXVOU1V5UXpBdU1qVXBMbTF2WkhWc1lYUmxVMk5oYkdVb2IzTmpLREUxS1M1eWIzUmhkR1VvS0NrbE0wUWxNMFZOWVhSb0xuTnBiaWgwYVcxbEpUSkdNaWtwS1NVeVF6QXVOaWtsTUVFbE1Ea3VZMjlzYjNJb01TVXlRekF1TlNVeVF6QXVOQ2t1WTI5dWRISmhjM1FvTVM0MEtTVXdRU1V3T1M1aFpHUW9jM0pqS0c4d0tTNXRiMlIxYkdGMFpTaHZNQ1V5UXk0d05Da2xNa011TmlrbE1FRWxNRGt1YVc1MlpYSjBLQ2t1WW5KcFoyaDBibVZ6Y3lnd0xqRXBMbU52Ym5SeVlYTjBLREV1TWlrbE1FRWxNRGt1Ylc5a2RXeGhkR1ZUWTJGc1pTaHZjMk1vTWlrbE1rTXRNQzR5S1NVd1FTVXlNQ1V5TUM1dmRYUW9LUT09XCJcbn0sXG57XG4gIFwic2tldGNoX2lkXCI6IFwicml0Y2hzZV80XCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd1pHbHphVzUwWldkeVlYUnBiMjRsTUVFbE1rWWxNa1lsTWpCaWVTVXlNRkpwZEdOb2MyVWxNRUVsTWtZbE1rWWxNakJwYm5OMFlXZHlZVzB1WTI5dEpUSkdjbWwwWTJoelpTVXdRU1V5TUNVd1FXOXpZeWcxSlRKRExqRXBMbTF2WkhWc1lYUmxLRzV2YVhObEtEWXBKVEpETGpJeUtTNWthV1ptS0c4d0tTVXdRU1V5TUNVeU1DVXdPUzV0YjJSMWJHRjBaVk5qY205c2JGa29iM05qS0RJcExtMXZaSFZzWVhSbEtHOXpZeWdwTG5KdmRHRjBaU2dwSlRKRExqRXhLU2tsTUVFbE1Ea3VjMk5oYkdVb0xqY3lLUzVqYjJ4dmNpZ3dMams1SlRKRE1TNHdNVFFsTWtNeEtTVXdRU1V5TUNVeU1DVXdPUzV2ZFhRb0tRPT0gIFwiXG59LFxue1xuICBcInNrZXRjaF9pZFwiOiBcImZsb3JfMFwiLFxuICBcImNvZGVcIjogXCJKVEpHSlRKR1JteHZjaVV5TUdSbEpUSXdSblZsWjI4bE1FRWxNa1lsTWtab2RIUndjeVV6UVNVeVJpVXlSbVpzYjNKa1pXWjFaV2R2TG1kcGRHaDFZaTVwYnlVeVJpVXdRVzl6WXlnek1DVXlRekF1TURFbE1rTXhLU1V3UVM1dGRXeDBLRzl6WXlneU1DVXlReTB3TGpFbE1rTXhLUzV0YjJSMWJHRjBaU2h1YjJselpTZ3pKVEpETVNrcExuSnZkR0YwWlNnd0xqY3BLU1V3UVM1d2IzTjBaWEpwZW1Vb0pUVkNNeVV5UXpFd0pUSkRNaVUxUkM1bVlYTjBLREF1TlNrdWMyMXZiM1JvS0RFcEtTVXdRUzV0YjJSMWJHRjBaVkp2ZEdGMFpTaHZNQ1V5UXlncEpUTkVKVE5GYlc5MWMyVXVlQ293TGpBd015a2xNRUV1YjNWMEtDaz0gXCJcbn0sXG57XG4gIFwic2tldGNoX2lkXCI6IFwibWFoYWxpYV8wXCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd1RXRm9ZV3hwWVNVeU1FZ3RVaVV3UVNVeVJpVXlSaVV5TUVsSEpUTkJKVEl3SlRRd2JXMWZhSEpmSlRCQkpUQkJjMmhoY0dVb01qQWxNa013TGpFbE1rTXdMakF4S1NVd1FTVXlNQ1V5TUM1elkyRnNaU2dvS1NVeU1DVXpSQ1V6UlNVeU1FMWhkR2d1YzJsdUtIUnBiV1VwS2pNcEpUQkJKVEl3SlRJd0xuSmxjR1ZoZENnb0tTVXlNQ1V6UkNVelJTVXlNRTFoZEdndWMybHVLSFJwYldVcEtqRXdLU1V3UVNVeU1DVXlNQzV0YjJSMWJHRjBaVkp2ZEdGMFpTaHZNQ2tsTUVFbE1qQWxNakF1YzJOaGJHVW9LQ2tsTWpBbE0wUWxNMFVsTWpCTllYUm9Mbk5wYmloMGFXMWxLU295S1NVd1FTVXlNQ1V5TUM1dGIyUjFiR0YwWlNodWIybHpaU2d5SlRKRE1Da3BKVEJCSlRJd0pUSXdMbkp2ZEdGMFpTZ3dMakVsTWtNbE1qQXdMamtwSlRCQkxtOTFkQ2h2TUNrbE1FRWxNRUZ6Y21Nb2J6QXBKVEJCTG0xdlpIVnNZWFJsS0c5ell5ZzFNREFsTWtNd0pUSkRNQ2twSlRCQkxtOTFkQ2h2TVNrbE1FRWxNRUZ6Y21Nb2J6RXBKVEJCTG0xdlpIVnNZWFJsUzJGc1pXbGtLSFp2Y205dWIya29LQ2tsTWpBbE0wUWxNMFVsTWpCTllYUm9Mbk5wYmloMGFXMWxLU296SlRKRE1DNHhKVEpETUM0d01Ta2xNa01vS1NVeU1DVXpSQ1V6UlNVeU1FMWhkR2d1YzJsdUtIUnBiV1VwS2pNcEpUQkJMbk5qWVd4bEtDZ3BKVEl3SlRORUpUTkZKVEl3VFdGMGFDNXphVzRvZEdsdFpTa3FNeWtsTUVFdWIzVjBLRzh5S1NVd1FTVXdRWEpsYm1SbGNpaHZNaWs9XCJcbn0sXG57XG4gIFwic2tldGNoX2lkXCI6IFwibWFoYWxpYV8xXCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd1RXRm9ZV3hwWVNVeU1FZ3RVaVV3UVNVeVJpVXlSaVV5TUVsSEpUTkJKVEl3SlRRd2JXMWZhSEpmSlRCQkpUQkJjMmhoY0dVb0tDa2xNakFsTTBRbE0wVWxNakJOWVhSb0xuTnBiaWgwYVcxbEtTVXlRakVxTWlrbE1FRXVjbTkwWVhSbEtDZ3BKVEl3SlRORUpUTkZKVEl3VFdGMGFDNVFTU1V5TUNvbE1qQnRiM1Z6WlM1NEpUSXdKVEpHTVRnd0tTVXdRUzV5WlhCbFlYUllLRE1wSlRCQkxuSmxjR1ZoZEZrb0tDa2xNMFFsTTBWTllYUm9Mbk5wYmloMGFXMWxLU28xS1NVd1FTNXpZMkZzWlNnb0tTVXlNQ1V6UkNVelJTVXlNRTFoZEdndVVFa2xNa1kwS1NVd1FTNWliR1Z1WkNoemNtTW9iekFwTG1OdmJHOXlLREVsTWtNd0pUSkRNQ2twSlRCQkxtMXZaSFZzWVhSbEtHOXpZeWd5TUNVeVF5VXlNREFsTWtNdU5Da3BKVEJCTG10aGJHVnBaQ2d5S1NVd1FTVXlNQzV2ZFhRb2J6QXBKVEJCSlRCQmNtVnVaR1Z5S0c4d0tRPT1cIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJtYWhhbGlhXzJcIixcbiAgXCJjb2RlXCI6IFwiSlRKR0pUSkdKVEl3Vm1Wc2RtVjBKVEl3VUc5dmJDVXdRU1V5UmlVeVJpVXlNR0o1SlRJd1RXRm9ZV3hwWVNVeU1FZ3RVaVV3UVNVeVJpVXlSaVV5TUVsSEpUTkJKVEl3YlcxZmFISmZKVEJCSlRCQkpUQkJibTlwYzJVb0tTVXdRUzVqYjJ4dmNpZ29LU1V5TUNVelJDVXpSU1V5TUdFdVptWjBKVFZDTWlVMVJDb3lKVEpETUNVeVF5NDJLU1V3UVM1dGIyUjFiR0YwWlNodWIybHpaU2dvS1NVeU1DVXpSQ1V6UlNVeU1HRXVabVowSlRWQ01DVTFSQ294TUNrcEpUQkJMbk5qWVd4bEtDZ3BKVE5FSlRORkpUSXdZUzVtWm5RbE5VSXlKVFZFS2pVcEpUQkJMbXhoZVdWeUtDVXdRU1V5TUNVeU1ITnlZeWh2TUNrbE1FRWxNakFsTWpBdWJXRnpheWh2YzJNb01UQXBMbTF2WkhWc1lYUmxVbTkwWVhSbEtHOXpZeWdwSlRKRE9UQWxNa013S1NrbE1FRWxNakFsTWpBdWMyTmhiR1VvS0NrbE1qQWxNMFFsTTBVbE1qQmhMbVptZENVMVFqQWxOVVFxTWlrbE1FRWxNakFsTWpBdWJIVnRZU2d3TGpJbE1rTXdMak1wSlRCQktTVXdRUzVpYkdWdVpDaHZNQ2tsTUVFdWIzVjBLRzh3S1NVd1FTVXdRVzl6WXlncEpUQkJMbTF2WkhWc1lYUmxLRzV2YVhObEtDZ3BKVEl3SlRORUpUTkZKVEl3WVM1bVpuUWxOVUl4SlRWRUpUSkNOU2twSlRCQkxtTnZiRzl5S0RFbE1rTXdKVEpETUNrbE1FRXViM1YwS0c4eEtTVXdRU1V3UVhOeVl5aHZNQ2tsTUVFdWJXOWtkV3hoZEdVb2J6RXBKVEJCTG14aGVXVnlLQ1V3UVNVeU1DVXlNSE55WXlodk1Ta2xNRUVsTWpBbE1qQXViV0Z6YXlodk1Ta2xNRUVsTWpBbE1qQXVjMkYwZFhKaGRHVW9OeWtsTUVFcEpUQkJMbTF2WkhWc1lYUmxVbTkwWVhSbEtHOHhLU1V3UVM1eWIzUmhkR1VvS0NVM1FuUnBiV1VsTjBRcEpUSXdKVE5FSlRORkpUSXdkR2x0WlNVeU5UTTJNQ293TGpBMUtTVXdRUzV2ZFhRb2J6SXBKVEJCSlRCQmNtVnVaR1Z5S0c4eUtRPT1cIlxufSxcbntcbiAgXCJza2V0Y2hfaWRcIjogXCJtYWhhbGlhXzNcIixcbiAgXCJjb2RlXCI6IFwiSlRKR0pUSkdKVEl3WW5rbE1qQk5ZV2hoYkdsaEpUSXdTQzFTSlRCQkpUSkdKVEpHSlRJd1NVY2xNMEVsTWpCdGJWOW9jbDhsTUVFbE1FRnphR0Z3WlNnb0tTVXpSQ1V6UlUxaGRHZ3VjMmx1S0hScGJXVXBKVEpDTVNvekpUSkRKVEl3TGpVbE1rTXVNREVwSlRCQkxuSmxjR1ZoZENnMUpUSkRNeVV5UXlVeU1DZ3BKVE5FSlRORllTNW1ablFsTlVJd0pUVkVLaklsTWtNbE1qQW9LU1V6UkNVelJXRXVabVowSlRWQ01TVTFSQ295S1NVd1FTNXpZM0p2Ykd4WktDNDFKVEpETUM0eEtTVXdRUzVzWVhsbGNpZ2xNRUVsTWpBbE1qQnpjbU1vYnpFcEpUQkJKVEl3SlRJd0xtMWhjMnNvYnpBcEpUQkJKVEl3SlRJd0xteDFiV0VvTGpBeEpUSkRKVEl3TGpFcEpUQkJKVEl3SlRJd0xtbHVkbVZ5ZENndU1pa2xNRUVwSlRCQkxtMXZaSFZzWVhSbEtHOHhKVEpETGpBeUtTVXdRUzV2ZFhRb2J6QXBKVEJCSlRCQmIzTmpLRFF3SlRKREpUSXdNQzR3T1NVeVF5VXlNREF1T1NrbE1FRXVZMjlzYjNJb0xqa2xNa013SlRKRE5Ta2xNRUV1Ylc5a2RXeGhkR1VvYjNOaktERXdLUzV5YjNSaGRHVW9NU1V5UXlVeU1EQXVOU2twSlRCQkxuSnZkR0YwWlNneEpUSkRKVEl3TUM0eUtTVXdRUzV2ZFhRb2J6RXBKVEJCSlRCQmNtVnVaR1Z5S0c4d0tTVXdRU1V3UVE9PVwiXG59LFxue1xuICBcInNrZXRjaF9pZFwiOiBcIm1haGFsaWFfNFwiLFxuICBcImNvZGVcIjogXCJKVEpHSlRKR0pUSXdRMlZzYkhWc1lYSWxNakFsTWpZbE1qQkNiRzlpZFd4aGNpVXdRU1V5UmlVeVJpVXlNR0o1SlRJd1RXRm9ZV3hwWVNVeU1FZ3RVaVV3UVNVeVJpVXlSaVV5TUVsSEpUTkJKVEl3YlcxZmFISmZKVEJCSlRCQmMzQmxaV1FsTWpBbE0wUWxNakF3TGpNbE1FRWxNRUZ6YUdGd1pTZ3lNQ1V5UXpBdU1pVXlRekF1TXlrbE1FRXVZMjlzYjNJb01DNDFKVEpETUM0NEpUSkROVEFwSlRCQkpUSXdKVEl3TG5OallXeGxLQ2dwSlRJd0pUTkVKVE5GSlRJd1RXRjBhQzV6YVc0b2RHbHRaU2tsTWtJeEtqSXBKVEJCSlRJd0pUSXdMbkpsY0dWaGRDZ29LU1V5TUNVelJDVXpSU1V5TUUxaGRHZ3VjMmx1S0hScGJXVXBLakV3S1NVd1FTVXlNQ1V5TUM1dGIyUjFiR0YwWlZKdmRHRjBaU2h2TUNrbE1FRWxNakFsTWpBdWMyTmhiR1VvS0NrbE1qQWxNMFFsTTBVbE1qQk5ZWFJvTG5OcGJpaDBhVzFsS1NVeVFqRWxNakFxTVM0MUtTVXdRU1V5TUNVeU1DNXRiMlIxYkdGMFpTaHViMmx6WlNneUpUSkRNaWtwSlRCQkpUSXdKVEl3TG5KdmRHRjBaU2d4SlRKREpUSXdMaklwSlRCQkpUSXdKVEl3SlRKR0pUSkdKVEl3TG1sdWRtVnlkQ2d5TGpRcEpUQkJMbTkxZENodk1Da2xNRUU9XCJcbn0sXG57XG4gIFwic2tldGNoX2lkXCI6IFwiYW5kcm9tZWRhXzBcIixcbiAgXCJjb2RlXCI6IFwiSlRKR0pUSkdKVEl3TXk0d0pUQkJKVEpHSlRKR0pUSXdZbmtsTWpBbFEwVWxPVFJPUkZJd1RUTkVKVU5GSlRrMEpUQkJKVEpHSlRKR0pUSXdhSFIwY0hNbE0wRWxNa1lsTWtaM2QzY3VhVzV6ZEdGbmNtRnRMbU52YlNVeVJtRnVaSEp2YlROZlpHRWxNa1lsTUVFbE1FRWxNRUZ1YjJselpTZ3pKVEpETUM0ekpUSkRNeWt1ZEdoeVpYTm9LREF1TXlVeVF6QXVNRE1wTG1ScFptWW9iek1sTWtNd0xqTXBMbTkxZENodk1Ta2xNRUZuY21Ga2FXVnVkQ2dsTlVJd0xqTWxNa013TGpNbE1rTXpKVFZFS1M1a2FXWm1LRzh3S1M1aWJHVnVaQ2h2TVNrdWIzVjBLRzh6S1NVd1FYWnZjbTl1YjJrb016TWxNa016SlRKRE16QXBMbkp2ZEdGMFpTZ3pKVEpETUM0ekpUSkRNQ2t1Ylc5a2RXeGhkR1ZUWTJGc1pTaHZNaVV5UXpBdU15a3VZMjlzYjNJb0xUTWxNa016SlRKRE1Da3VZbkpwWjJoMGJtVnpjeWd6S1M1dmRYUW9iekFwSlRCQmMyaGhjR1VvTXpBbE1rTXdMak1sTWtNeEtTNXBiblpsY25Rb0tDVTNRblJwYldVbE4wUXBKVE5FSlRORlRXRjBhQzV6YVc0b2RHbHRaU2txTXlrdWIzVjBLRzh5S1NVd1FTVXdRWEpsYm1SbGNpaHZNeWtsTUVFPVwiXG59LFxue1xuICBcInNrZXRjaF9pZFwiOiBcImFuZHJvbWVkYV8xXCIsXG4gIFwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd015NHpKVEJCSlRKR0pUSkdKVEl3WW5rbE1qQWxRMFVsT1RST1JGSXdUVE5FSlVORkpUazBKVEJCSlRKR0pUSkdKVEl3YUhSMGNITWxNMEVsTWtZbE1rWjNkM2N1YVc1emRHRm5jbUZ0TG1OdmJTVXlSbUZ1WkhKdmJUTmZaR0VsTWtZbE1FRWxNRUZ2YzJNb0tTNXRiMlIxYkdGMFpWSnZkR0YwWlNodk1DVXlRekF1TXlrdWIzVjBLQ2tsTUVGdmMyTW9Nek1sTWtNd0xqTWxNa013TGpNcExtUnBabVlvYnpNbE1rTXpLUzV2ZFhRb2J6RXBKVEJCYjNOaktETWxNa013TGpNbE1rTXpNeWt1Ylc5a2RXeGhkR1ZMWVd4bGFXUW9iek1sTWtNektTNWthV1ptS0c4d0tTNXZkWFFvYnpJcEpUQkJjM0pqS0c4d0pUSkRNeWt1YlhWc2RDaHZNU1V5UXpNcExtdGhiR1ZwWkNnektTNXZkWFFvYnpNcEpUQkJjbVZ1WkdWeUtHOHlLUT09XCJcbn0sXG57XG5cInNrZXRjaF9pZFwiOiBcImFzZHJ1YmFsXzBcIixcbiBcImNvZGVcIjogXCJKVEpHSlRKR1FYTmtjaVZETXlWQ1FXSmhiQ1V5TUVkdmJXVjZKVEJCSlRCQmJtOXBjMlVvTXlVeVF6QXVNU1V5UXpjcEpUQkJMbkp2ZEdGMFpTZ3hKVEpETFRFbE1rTXRNaWt1YldGemF5aHphR0Z3WlNneU1Da3BKVEJCTG1OdmJHOXlZVzFoS0RBdU5Ta2xNRUV1Ylc5a2RXeGhkR1ZUWTJGc1pTaHZNQ2tsTUVFdWJXOWtkV3hoZEdWVFkyRnNaU2h2TUNVeVF6RWxNa01wSlRCQkxtSnNaVzVrS0c4d0tTVXdRUzVpYkdWdVpDaHZNQ2tsTUVFdVlteGxibVFvYnpBcEpUQkJMbUpzWlc1a0tHOHdLU1V3UVM1dmRYUW9iekFwSlRCQlwiXG59LFxue1xuXCJza2V0Y2hfaWRcIjogXCJmbG9yXzFcIixcblwiY29kZVwiOiBcIkpUSkdKVEpHU0hsa2NtRWxNakJIYkdsMFkyaDVKVEl3VTJ4cGRDVXlNRk5qWVc0bE1FRWxNa1lsTWtaR2JHOXlKVEl3WkdVbE1qQkdkV1ZuYnlVd1FTVXlSaVV5Um1oMGRIQnpKVE5CSlRKR0pUSkdabXh2Y21SbFpuVmxaMjh1WjJsMGFIVmlMbWx2SlRKR0pUSXdKVEJCY3pBdWFXNXBkRU5oYlNncEpUQkJjM0pqS0hNd0tTNXpZWFIxY21GMFpTZ3lLUzVqYjI1MGNtRnpkQ2d4TGpNcExteGhlV1Z5S0hOeVl5aHZNQ2t1YldGemF5aHphR0Z3WlNnMEpUSkRNaWt1YzJOaGJHVW9NQzQxSlRKRE1DNDNLUzV6WTNKdmJHeFlLREF1TWpVcEtTNXpZM0p2Ykd4WUtEQXVNREF4S1NrdWJXOWtkV3hoZEdVb2J6QWxNa013TGpBd01Ta3ViM1YwS0c4d0tTVXdRU1V3UVE9PVwiXG59LFxue1xuXCJza2V0Y2hfaWRcIjogXCJmbG9yXzJcIixcblwiY29kZVwiOiBcIkpUSkdKVEpHUjJ4cGRHTm9KVEl3VW1sMlpYSWxNRUVsTWtZbE1rWkdiRzl5SlRJd1pHVWxNakJHZFdWbmJ5VXdRU1V5UmlVeVJtaDBkSEJ6SlROQkpUSkdKVEpHWm14dmNtUmxablZsWjI4dVoybDBhSFZpTG1sdkpUSkdKVEJCZG05eWIyNXZhU2c0SlRKRE1Ta2xNRUV1YlhWc2RDaHZjMk1vTVRBbE1rTXdMakVsTWtNb0tTVXpSQ1V6UlUxaGRHZ3VjMmx1S0hScGJXVXBLak1wTG5OaGRIVnlZWFJsS0RNcExtdGhiR1ZwWkNneU1EQXBLU1V3UVM1dGIyUjFiR0YwWlNodk1DVXlRekF1TlNrbE1FRXVZV1JrS0c4d0pUSkRNQzQ0S1NVd1FTNXpZM0p2Ykd4WktDMHdMakF4S1NVd1FTNXpZMkZzWlNnd0xqazVLU1V3UVM1dGIyUjFiR0YwWlNoMmIzSnZibTlwS0RnbE1rTXhLU1V5UXpBdU1EQTRLU1V3UVM1c2RXMWhLREF1TXlrbE1FRXViM1YwS0NrbE1FRWxNRUVsTUVGemNHVmxaQ1V5TUNVelJDVXlNREF1TVNVd1FTVXdRU1V3UVNVd1FRPT1cIlxufSxcblxue1xuXCJza2V0Y2hfaWRcIjogXCJuZXNzb18wXCIsXG5cImNvZGVcIjogXCJKVEJCSlRKR0pUSkdZMnh2ZFdSekpUSXdiMllsTWpCd1lYTnpZV2RsSlRCQkpUSkdKVEpHWW5rbE1qQk9aWE56YnlVd1FTVXlSaVV5Um5kM2R5NXVaWE56Ynk1NGVYb2xNRUVsTUVGemFHRndaU2dsTlVJMEpUSkROU1V5UXpZbE5VUXVabUZ6ZENnd0xqRXBMbk50YjI5MGFDZ3hLU1V5UXpBdU1EQXdNREF4SlRKREpUVkNNQzR5SlRKRE1DNDNKVFZFTG5OdGIyOTBhQ2d4S1NrbE1FRXVZMjlzYjNJb01DNHlKVEpETUM0MEpUSkRNQzR6S1NVd1FTNXpZM0p2Ykd4WUtDZ3BKVE5FSlRORlRXRjBhQzV6YVc0b2RHbHRaU293TGpJM0tTa2xNRUV1WVdSa0tDVXdRU1V5TUNVeU1ITm9ZWEJsS0NVMVFqUWxNa00xSlRKRE5pVTFSQzVtWVhOMEtEQXVNU2t1YzIxdmIzUm9LREVwSlRKRE1DNHdNREF3TURFbE1rTWxOVUl3TGpJbE1rTXdMamNsTWtNd0xqVWxNa013TGpNbE5VUXVjMjF2YjNSb0tERXBLU1V3UVNVeU1DVXlNQzVqYjJ4dmNpZ3dMallsTWtNd0xqSWxNa013TGpVcEpUQkJKVEl3SlRJd0xuTmpjbTlzYkZrb01DNHpOU2tsTUVFbE1qQWxNakF1YzJOeWIyeHNXQ2dvS1NVelJDVXpSVTFoZEdndWMybHVLSFJwYldVcU1DNHpNeWtwS1NVd1FTNWhaR1FvSlRCQkpUSXdKVEl3YzJoaGNHVW9KVFZDTkNVeVF6VWxNa00ySlRWRUxtWmhjM1FvTUM0eEtTNXpiVzl2ZEdnb01Ta2xNa013TGpBd01EQXdNU1V5UXlVMVFqQXVNaVV5UXpBdU55VXlRekF1TXlVMVJDNXpiVzl2ZEdnb01Ta3BKVEJCSlRJd0pUSXdMbU52Ykc5eUtEQXVNaVV5UXpBdU5DVXlRekF1TmlrbE1FRWxNakFsTWpBdWMyTnliMnhzV1NndE1DNHpOU2tsTUVFbE1qQWxNakF1YzJOeWIyeHNXQ2dvS1NVelJDVXpSVTFoZEdndWMybHVLSFJwYldVcU1DNDBNU2txTFRFcEtTVXdRUzVoWkdRb0pUQkJKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjM0pqS0c4d0tTNXphR2xtZENnd0xqQXdNU1V5UXpBdU1ERWxNa013TGpBd01Ta2xNRUVsTWpBbE1qQWxNakFsTWpBbE1qQWxNakF1YzJOeWIyeHNXQ2dsTlVJd0xqQTFKVEpETFRBdU1EVWxOVVF1Wm1GemRDZ3dMakVwTG5OdGIyOTBhQ2d4S1NrbE1FRWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQXVjMk5oYkdVb0pUVkNNUzR3TlNVeVF6QXVPU1UxUkM1bVlYTjBLREF1TXlrdWMyMXZiM1JvS0RFcEpUSkRKVFZDTVM0d05TVXlRekF1T1NVeVF6RWxOVVF1Wm1GemRDZ3dMakk1S1M1emJXOXZkR2dvTVNrcEpUQkJKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEpETUM0NE5Ta2xNRUV1Ylc5a2RXeGhkR1VvZG05eWIyNXZhU2d4TUNVeVF6SWxNa015S1NrbE1FRXViM1YwS0NrPVwiXG59LFxue1xuXCJza2V0Y2hfaWRcIjogXCJtYWxpdHppbl8wXCIsXG5cImNvZGVcIjogXCJKVEpHSlRKR1EwNUVVMFFsTUVFbE1rWWxNa1pvZEhSd0pUTkJKVEpHSlRKR2JXRnNhWFI2YVc1amIzSjBaWE11Ym1WMEpUSkdKVEJCSlRKR0pUSkdKVEl3YzJGdVpDVXlNSE53YVhKaGJITWxNRUVsTUVGdmMyTW9NeVV5UXlVeU1EQXVNREVsTWtNbE1qQXdMalFwSlRCQkxtTnZiRzl5S0RFdU1pVXlRekV1TWlVeVF6RXVNeWtsTUVFdWMyRjBkWEpoZEdVb01DNDBLU1V3UVM1dGIyUjFiR0YwWlZKbGNHVmhkQ2h2YzJNb01pa2xNa014SlRKREpUSXdNaVV5UXlVeU1EUWxNa01sTWpBektTVXdRUzV0YjJSMWJHRjBaVXRoYkdWcFpDaHZjMk1vTVRJbE1rTXdMakExSlRKRE1Da2xNa014S1NVd1FTNXNkVzFoSlRJd0tEQXVOQ2tsTUVFdWNtOTBZWFJsS0RRbE1rTWxNakF3TGpFbE1rTXdLU1V3UVM1dGIyUjFiR0YwWlNodk1DVXlReVV5TUNncEpUSXdKVE5FSlRORkpUSXdiVzkxYzJVdWVTVXlNQ293TGpBd01ESWxNakFwSlRCQkxuTmpZV3hsS0RFcExtUnBabVlvYnpFcEpUQkJMbTkxZENodk1Daz1cIlxufSxcbntcblwic2tldGNoX2lkXCI6IFwibWFsaXR6aW5fMVwiLFxuXCJjb2RlXCI6IFwiSlRKR0pUSkdRMDVFVTBRbE1FRWxNa1lsTWtab2RIUndKVE5CSlRKR0pUSkdiV0ZzYVhSNmFXNWpiM0owWlhNdWJtVjBKVEpHSlRCQkpUSkdKVEpHWVcxbFltRWxNRUVsTUVGdmMyTW9NVFVsTWtNbE1qQXdMakF4SlRKREpUSXdNQzR4S1M1dGRXeDBLRzl6WXlneEpUSkRKVEl3TFRBdU1Ta3ViVzlrZFd4aGRHVW9iM05qS0RJcExuSnZkR0YwWlNnMEpUSkRNU2tsTWtNbE1qQXlNQ2twSlRCQkxtTnZiRzl5S0RBbE1rTXlMalFsTWtNMUtTVXdRUzV6WVhSMWNtRjBaU2d3TGpRcEpUQkJMbXgxYldFb01TVXlRekF1TVNVeVF5VXlNQ2cySlRKREpUSXdLQ2tsTTBRbE0wVWxNakF4SlRJd0pUSkNKVEl3WVM1bVpuUWxOVUl6SlRWRUtTa2xNRUV1YzJOaGJHVW9NQzQzSlRKREpUSXdLQ2tsTTBRbE0wVWxNakF3TGpjbE1qQWxNa0lsTWpCaExtWm1kQ1UxUWpNbE5VUXBKVEJCTG1ScFptWW9iekFwSlRKR0pUSkdKVEl3YnpBbE1FRXViM1YwS0c4d0tTVXlSaVV5UmlVeU1HOHhcIlxufSxcbntcblwic2tldGNoX2lkXCI6IFwibWFsaXR6aW5fMlwiLFxuXCJjb2RlXCI6IFwiSlRKR0pUSkdRMDVFVTBRbE1FRWxNa1lsTWtab2RIUndKVE5CSlRKR0pUSkdiV0ZzYVhSNmFXNWpiM0owWlhNdWJtVjBKVEpHSlRCQkpUSkdKVEpHWTNKaGVua2xNakJ6Y1hWaGNtVnpKVEJCSlRCQmMyaGhjR1VvTkNVeVF5VXlNQ2d3TGpBeEpUSkRKVEl3S0NrbE0wUWxNMFVsTWpBd0xqSWxNakFsTWtJbE1qQmhMbVptZENVMVFqSWxOVVFwSlRKRE1Ta2xNRUV1YlhWc2RDaHZjMk1vTVNVeVF5VXlNREVwTG0xdlpIVnNZWFJsS0c5ell5ZzFLUzV5YjNSaGRHVW9NUzQwSlRKRE1Ta2xNa016S1NrbE1FRXVZMjlzYjNJb01TVXlReklsTWtNMEtTVXdRUzV6WVhSMWNtRjBaU2d3TGpJcEpUQkJMbXgxYldFb01TNHlKVEpETUM0d05TVXlReVV5TUNnMUpUSkRKVEl3S0NrbE0wUWxNMFVsTWpBeUpUSXdKVEpDSlRJd1lTNW1ablFsTlVJekpUVkVLU2tsTUVFdWMyTmhiR1VvTUM0MkpUSkRKVEl3S0NrbE0wUWxNMFVsTWpBd0xqa2xNakFsTWtJbE1qQmhMbVptZENVMVFqTWxOVVFwSlRCQkxtUnBabVlvYnpBcEpUSkdKVEpHSlRJd2J6QWxNRUV1YjNWMEtHOHdLU1V5UmlVeVJpVXlNRzh4XCJcbn0sXG57XG5cInNrZXRjaF9pZFwiOiBcImtob3BhcnppXzBcIixcblwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd1NHRndjSGtsTWpCTllXNWtZV3hoSlRCQkpUSkdKVEpHSlRJd1Fua2xNakJCWW1ocGJtRjVKVEl3UzJodmNHRnllbWtsTUVFbE1rWWxNa1lsTWpCMGQybDBkR1Z5SlRKR1oybDBhSFZpSlRKR2FXNXpkR0ZuY21GdEpUTkJKVEl3SlRRd2EyaHZjR0Z5ZW1rbE1FRjJiM0p2Ym05cEtEVWxNa010TUM0eEpUSkROU2tsTUVFdVlXUmtLRzl6WXlneEpUSkRNQ1V5UXpFcEtTNXJZV3hsYVdRb01qRXBKVEJCTG5OallXeGxLREVsTWtNeEpUSkRNaWt1WTI5c2IzSmhiV0VvS1M1dmRYUW9iekVwSlRCQmMzSmpLRzh4S1M1dGRXeDBLSE55WXloek1Da3ViVzlrZFd4aGRHVlNiM1JoZEdVb2J6RWxNa014TURBcEpUSkRKVEl3TFRBdU5Ta2xNRUVsTWpBbE1qQXViM1YwS0c4d0tTVXdRU1V3UVE9PVwiXG59LFxue1xuXCJza2V0Y2hfaWRcIjogXCJraG9wYXJ6aV8xXCIsXG5cImNvZGVcIjogXCJKVEpHSlRKR0pUSXdVR1Z5Y0dWMGRXRnNKVEl3Wld4bGRtRjBiM0lsTWpCaWRYUjBiMjV6SlRCQkpUSkdKVEpHSlRJd1Fua2xNakJMYUc5d1lYSjZhU1V3UVNVeVJpVXlSaVV5TUdoMGRIQWxNMEVsTWtZbE1rWnJhRzl3WVhKNmFTNWpiMjBsTUVFbE1FRnphR0Z3WlNnektTNWhaR1FvYjNOaktERWxNa013TGpVbE1rTXhLU1V5UXlVeU1ERXBKVEJCSlRBNUxtRmtaQ2h2TVNVeVF5VXlNQ2dwSlRJd0pUTkVKVE5GSlRJd0tFMWhkR2d1YzJsdUtIUnBiV1VsTWtZMEtTVXlNQ29sTWpBd0xqY2xNakFsTWtJbE1qQXdMakVwS1NVd1FTVXdPU1V5UmlVeVJpNXlaWEJsWVhRb05Ta2xNRUVsTWpBbE1qQWxNRGt1YzJOaGJHVW9LQ2tsTTBRbE0wVk5ZWFJvTG5OcGJpaDBhVzFsSlRJd0pUSkdKVEl3TVRZcEtTNXliM1JoZEdVb01DVXlReVV5TUMwd0xqRXBKVEJCSlRBNUxtOTFkQ2h2TVNrbE1FRWxNRUZ6Y21Nb2J6RXBKVEJCSlRJd0pUSXdMbkp2ZEdGMFpTZ3dKVEpETUM0eEtTVXdRU1V5TUNVeU1DNXZkWFFvS1E9PVwiXG59LFxue1xuXCJza2V0Y2hfaWRcIjogXCJraG9wYXJ6aV8yXCIsXG5cImNvZGVcIjogXCJKVEpHSlRKR0pUSXdVbVZoYkd4NUpUSXdURzkyWlNVd1FTVXlSaVV5UmlVeU1HSjVKVEl3UVdKb2FXNWhlU1V5TUV0b2IzQmhjbnBwSlRCQkpUSkdKVEpHSlRJd2FIUjBjQ1V6UVNVeVJpVXlSbXRvYjNCaGNucHBMbU52YlNVd1FXOXpZeWd4TURBbE1rTXRNQzR3TVRJME5TVXlRekVwTG5CcGVHVnNZWFJsS0RVd0tTNXJZV3hsYVdRb0tDa2xNMFFsTTBVb1RXRjBhQzV6YVc0b2RHbHRaU1V5UmpncEtqa2xNa0l6S1NrdWNtOTBZWFJsS0RBbE1rTXdMakV5TlNrbE1FRXViVzlrZFd4aGRHVlNiM1JoZEdVb2MyaGhjR1VvTXlrdWMyTmhiR1VvS0NrbE0wUWxNMFVvVFdGMGFDNWpiM01vZEdsdFpTa3FNaWtwTG5KdmRHRjBaU2d3SlRKRExUQXVNalVwS1M1a2FXWm1LSE55WXlodk1Da3VZbkpwWjJoMGJtVnpjeWd3TGpNcEtTVXdRU1V5TUNVeU1DNXZkWFFvS1E9PVwiXG59LFxue1xuXCJza2V0Y2hfaWRcIjogXCJraG9wYXJ6aV8zXCIsXG5cImNvZGVcIjogXCJKVEpHSlRKR0pUSXdRWEZoZFhScFl5VXlNR0pzZFdKekpUQkJKVEpHSlRKR0pUSXdRbmtsTWpCTGFHOXdZWEo2YVNVd1FTVXlSaVV5UmlVeU1HaDBkSEJ6SlROQkpUSkdKVEpHYTJodmNHRnllbWt1WTI5dEpUQkJKVEJCWjNKaFpHbGxiblFvTUM0eU5Ta2xNRUV1WVdSa0tHNXZhWE5sS0NrbE1rTWxNakFvS1NVelJDVXpSVTFoZEdndVkyOXpLSFJwYldVcEtTVXdRUzV0YjJSMWJHRjBaVkp2ZEdGMFpTaHpjbU1vYnpBcExuSnZkR0YwWlNnd0pUSkRKVEl3TFRBdU5USXBKVEpESlRJd01DNHlLUzV0ZFd4MEtITm9ZWEJsS0RNMk1Da2xNa01sTWpBd0xqZ3BKVEJCTG5KbGNHVmhkQ2d4TUNVeVF6VXBMbTExYkhRb2MyaGhjR1VvTXpZd0tTNXpZMkZzWlNnb0tTVXpSQ1V6UlUxaGRHZ3VjMmx1S0hScGJXVXBLU1V5UXlVeU1EQXVPQ2t1Y205MFlYUmxLREFsTWtNbE1qQXdMaklwSlRCQkxtUnBabVlvYzNKaktHOHdLUzV5YjNSaGRHVW9NQ1V5UXlVeU1DMHdMaklwSlRKREpUSXdNQzR5S1NVd1FTNXZkWFFvS1E9PVwiXG59LFxue1xuXCJza2V0Y2hfaWRcIjogXCJjZWxlc3RlXzBcIixcblwiY29kZVwiOiBcIkpUQkJKVEl3SlRKR0pUSkdKVEl3VUhWbGNuUmhjeVV5TUVsSkpUQkJKVEpHSlRKR0pUSXdjRzl5SlRJd1EyVnNaWE4wWlNVeU1FSmxkR0Z1WTNWeUpUQkJKVEpHSlRKR0pUSXdhSFIwY0hNbE0wRWxNa1lsTWtabmFYUm9kV0l1WTI5dEpUSkdaWE56ZEdWaVlXNGxNRUVsTUVGdmMyTW9NVE1sTWtNd0pUSkRNU2tsTUVFbE1qQWxNakF1YTJGc1pXbGtLQ2tsTUVFbE1qQWxNakF1YldGemF5aHphR0Z3WlNnMEpUSkRNQzR6SlRKRE1Ta3BKVEJCSlRJd0pUSXdMbTF2WkhWc1lYUmxVbTkwWVhSbEtITm9ZWEJsS0RRbE1rTXdMakVsTWtNeEtTa2xNRUVsTWpBbE1qQXViVzlrZFd4aGRHVlNiM1JoZEdVb2MyaGhjR1VvTkNVeVF6QXVNU1V5UXpBdU9Ta3BKVEJCSlRJd0pUSXdMbTF2WkhWc1lYUmxVbTkwWVhSbEtITm9ZWEJsS0RRbE1rTXdMakVsTWtNd0xqZ3BLU1V3UVNVeU1DVXlNQzV6WTJGc1pTZ3dMak1wSlRCQkpUSXdKVEl3TG1Ga1pDaHphR0Z3WlNnMEpUSkRNQzR5SlRKRE1Ta3VZMjlzYjNJb01DNHpKVEpETVNVeVF6RWxNa013TGpVcEtTVXdRU1V5TUNVeU1DNXliM1JoZEdVb0tDa2xNMFFsTTBWMGFXMWxLU1V3UVNVeU1DVXlNQzV2ZFhRb0tRPT1cIlxufSxcbntcblwic2tldGNoX2lkXCI6IFwiY2VsZXN0ZV8xXCIsXG5cImNvZGVcIjogXCJKVEpHSlRKR0pUSXdVSFZsY25SaGN5VXlNRWxKU1NVd1FTVXlSaVV5UmlVeU1IQnZjaVV5TUVObGJHVnpkR1VsTWpCQ1pYUmhibU4xY2lVd1FTVXlSaVV5UmlVeU1HaDBkSEJ6SlROQkpUSkdKVEpHWjJsMGFIVmlMbU52YlNVeVJtVnpjM1JsWW1GdUpUQkJKVEl3SlRCQmIzTmpLRFF3SlRKRE1DNHlKVEpETVNrbE1FRWxNakFsTWpBdWJXOWtkV3hoZEdWVFkyRnNaU2h2YzJNb05EQWxNa013SlRKRE1Ta3VhMkZzWldsa0tEZ3BLU1V3UVNVeU1DVXlNQzV5WlhCbFlYUW9NaVV5UXpRcEpUQkJKVEl3SlRJd0xtMXZaSFZzWVhSbEtHOHdKVEpETUM0d05Ta2xNRUVsTWpBbE1qQXViVzlrZFd4aGRHVkxZV3hsYVdRb2MyaGhjR1VvTkNVeVF6QXVNU1V5UXpFcEtTVXdRU1V5TUNVeU1DNXZkWFFvYnpBcFwiXG59LFxue1xuXCJza2V0Y2hfaWRcIjogXCJjZWxlc3RlXzJcIixcblwiY29kZVwiOiBcIkpUQkJKVEl3SlRKR0pUSkdKVEl3VUhWbGNuUmhjeVV3UVNVeVJpVXlSaVV5TUhCdmNpVXlNRU5sYkdWemRHVWxNakJDWlhSaGJtTjFjaVV3UVNVeVJpVXlSaVV5TUdoMGRIQnpKVE5CSlRKR0pUSkdaMmwwYUhWaUxtTnZiU1V5Um1WemMzUmxZbUZ1SlRCQkpUQkJiM05qS0RFekpUSkRNQ1V5UXpFcEpUQkJKVEl3SlRJd0xtMXZaSFZzWVhSbEtHOXpZeWd5TVNVeVF6QXVNalVsTWtNd0tTa2xNRUVsTWpBbE1qQXViVzlrZFd4aGRHVlRZMkZzWlNodmMyTW9NelFwS1NVd1FTVXlNQ1V5TUM1dGIyUjFiR0YwWlV0aGJHVnBaQ2h2YzJNb05UVXBKVEpETUM0eEpUSkRNU2tsTUVFbE1qQWxNakF1YjNWMEtDaz1cIlxufSxcbntcblwic2tldGNoX2lkXCI6IFwiYWxleGFuZHJlXzBcIixcblwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd0pUSXlkR2hsTFhkaGJHd2xNaklsTUVFbE1rWWxNa1lsTWpCQmJHVjRZVzVrY21VbE1qQlNZVzVuWld3bE1FRWxNa1lsTWtZbE1qQjNkM2N1WVd4bGVHRnVaSEpsY21GdVoyVnNMbUZ5ZEM1aWNpVXlSbWg1WkhKaExtaDBiV3dsTUVFbE1FRnpjR1ZsWkNVelJDNHdNakl5SlRCQmIzTmpLRFE0SlRKRExTNHhKVEpETUNrdWRHaHlaWE5vS0NVMVFpNHpKVEpETGpjbE5VUXVabUZ6ZENndU56VXBKVEpETUNrdVkyOXNiM0lvTUNVeVF6QWxNa014S1NVd1FTVXdRUzVoWkdRb0pUQkJKVEl3SlRJd0pUSXdKVEl3YjNOaktESTRKVEpETGpFbE1rTXdLUzUwYUhKbGMyZ29KVFZDTGpNbE1rTXVOeVUxUkM1bVlYTjBLQzQzTlNrbE1rTXdLUzV5YjNSaGRHVW9NeTR4TkNVeVJqUXBKVEJCSlRJd0pUSXdKVEl3SlRJd0xtTnZiRzl5S0RFbE1rTXdKVEpETUNrbE1FRWxNakFsTWpBbE1qQWxNakF1Ylc5a2RXeGhkR1ZUWTJGc1pTZ2xNakJ2YzJNb05qUWxNa010TGpBeEpUSkRNQ2t1ZEdoeVpYTm9LQ1UxUWk0ekpUSkRMamNsTlVRdVptRnpkQ2d1TnpVcEpUSkRNQ2tsTWpBcEpUQkJLU1V3UVM1a2FXWm1LQ1V3UVNVeU1DVXlNQ1V5TUNVeU1HOXpZeWd5T0NVeVF5NHhKVEpETUNrdWRHaHlaWE5vS0NVMVFpNHpKVEpETGpjbE5VUXVabUZ6ZENndU5Ta2xNa013S1M1eWIzUmhkR1VvTXk0eE5DVXlSaklwSlRCQkpUSXdKVEl3SlRJd0pUSXdMbU52Ykc5eUtERWxNa013SlRKRE1Ta2xNRUVsTWpBbE1qQWxNakFsTWpBdWJXOWtkV3hoZEdWVFkyRnNaU2dsTWpCdmMyTW9OalFsTWtNdExqQXhOU1V5UXpBcExuUm9jbVZ6YUNnbE5VSXVNeVV5UXk0M0pUVkVMbVpoYzNRb0xqVXBKVEpETUNrbE1qQXBKVEJCS1NVd1FTNXRiMlIxYkdGMFpWSnZkR0YwWlNnbE1qQnZjMk1vTlRRbE1rTXRMakF3TlNVeVF6QXBMblJvY21WemFDZ2xOVUl1TXlVeVF5NDNKVFZFTG1aaGMzUW9MakkxS1NVeVF6QXBKVEl3S1NVd1FTNXRiMlIxYkdGMFpWTmpZV3hsS0NVeU1HOXpZeWcwTkNVeVF5MHVNREl3SlRKRE1Da3VkR2h5WlhOb0tDVTFRaTR6SlRKRExqY2xOVVF1Wm1GemRDZ3VNalVwSlRKRE1Da2xNakFwSlRCQkxtTnZiRzl5WVcxaEtDVXlNQ2dwSlRORUpUTkZUV0YwYUM1emFXNG9kR2x0WlNVeVJqSTNLU291TURFeU1qSWxNa0k1TGpnNUtTVXdRUzV6WTJGc1pTZ3lMakV5TWlrbE1FRWxNRUV1YjNWMEtDaz1cIlxufSxcbntcblwic2tldGNoX2lkXCI6IFwiYWxleGFuZHJlXzFcIixcblwiY29kZVwiOiBcIkpUQkJKVEl3SlRKR0pUSkdKVEl3SlRJeVpYbGxKVEl3YjJZbE1qQjBhR1VsTWpCaVpXaHZiR1JsY2lVeU1pVXdRU1V5UmlVeVJpVXlNRUZzWlhoaGJtUnlaU1V5TUZKaGJtZGxiQ1V3UVNVeVJpVXlSaVV5TUhkM2R5NWhiR1Y0WVc1a2NtVnlZVzVuWld3dVlYSjBMbUp5SlRKR2FIbGtjbUV1YUhSdGJDVXdRU1V3UVc1dmFYTmxLRFlsTWtNdU1EVXBKVEJCTG0xMWJIUW9KVEl3YjNOaktEa2xNa013SlRKREpUSXdLQ2tsTTBRbE0wVk5ZWFJvTG5OcGJpaDBhVzFsSlRKR01TNDFLU1V5UWpJbE1qQXBKVEl3S1NVd1FTNXRkV3gwS0NVd1FTVXlNQ1V5TUNVeU1DVXlNRzV2YVhObEtEa2xNa011TURNcExtSnlhV2RvZEc1bGMzTW9NUzR5S1M1amIyNTBjbUZ6ZENneUtTVXdRU1V5TUNVeU1DVXlNQ1V5TUM1dGRXeDBLQ1V5TUc5ell5ZzVKVEpETUNVeVF5VXlNQ2dwSlRORUpUTkZUV0YwYUM1emFXNG9kR2x0WlNVeVJqTXBKVEpDTVRNbE1qQXBKVEl3S1NVd1FTa2xNRUV1WkdsbVppZ2xNRUVsTWpBbE1qQWxNakFsTWpCdWIybHpaU2d4TlNVeVF5NHdOQ2t1WW5KcFoyaDBibVZ6Y3lndU1pa3VZMjl1ZEhKaGMzUW9NUzR6S1NVd1FTVXlNQ1V5TUNVeU1DVXlNQzV0ZFd4MEtDVXlNRzl6WXlnNUpUSkRNQ1V5UXlVeU1DZ3BKVE5FSlRORlRXRjBhQzV6YVc0b2RHbHRaU1V5UmpVcEpUSkNNVE1sTWpBcEpUSXdLU1V3UVNVeU1DVXlNQ1V5TUNVeU1DNXliM1JoZEdVb0pUSXdLQ2tsTTBRbE0wVjBhVzFsSlRKR016TWxNakFwSlRCQktTVXdRUzV6WTJGc1pTZ2xNakFvS1NVelJDVXpSVTFoZEdndWMybHVLSFJwYldVbE1rWTJMaklwS2k0eE1pVXlRaTR4TlNVeU1Da2xNRUV1Ylc5a2RXeGhkR1ZUWTJGc1pTZ2xNRUVsTWpBbE1qQWxNakFsTWpCdmMyTW9NeVV5UXpBbE1rTXdLUzV0ZFd4MEtDVXlNRzl6WXlnekpUSkRNQ1V5UXpBcExuSnZkR0YwWlNnekxqRTBKVEpHTWlrbE1qQXBKVEJCSlRJd0pUSXdKVEl3SlRJd0xuSnZkR0YwWlNnbE1qQW9LU1V6UkNVelJYUnBiV1VsTWtZeU5TVXlNQ2t1YzJOaGJHVW9Mak01S1M1elkyRnNaU2d4SlRKRExqWWxNa014S1M1cGJuWmxjblFvS1NVd1FTVXlNQ1V5TUNVeU1DVXlNQ1V5UXlVeU1DZ3BKVE5FSlRORlRXRjBhQzV6YVc0b2RHbHRaU1V5UmpVdU15a3FNUzQxSlRKQ015VXlNQ1V5TUNrbE1FRXVjbTkwWVhSbEtDVXlNQ2dwSlRORUpUTkZkR2x0WlNVeVJqSXlKVEl3S1NVd1FTNXRkV3gwS0NVeU1ITm9ZWEJsS0RFd01DVXlReTQ1SlRKRExqQXhLUzV6WTJGc1pTZ3hKVEpETGpZbE1rTXhLU1V5TUNrbE1FRXViM1YwS0NrPVwiXG59LFxue1xuXCJza2V0Y2hfaWRcIjogXCJhbGV4YW5kcmVfMlwiLFxuXCJjb2RlXCI6IFwiSlRKR0pUSkdKVEl3SlRJeVpXZG5KVEl3YjJZbE1qQjBhR1VsTWpCd2FHOWxibWw0SlRJeUpUQkJKVEpHSlRKR0pUSXdRV3hsZUdGdVpISmxKVEl3VW1GdVoyVnNKVEJCSlRKR0pUSkdKVEl3ZDNkM0xtRnNaWGhoYm1SeVpYSmhibWRsYkM1aGNuUXVZbklsTWtab2VXUnlZUzVvZEcxc0pUQkJKVEJCYzNCbFpXUWxNMFF4TGpJbE1FRnphR0Z3WlNnNU9TVXlReTR4TlNVeVF5NDFLUzVqYjJ4dmNpZ3dKVEpETVNVeVF6SXBKVEJCSlRCQkxtUnBabVlvSlRJd2MyaGhjR1VvTWpRd0pUSkRMalVsTWtNd0tTNXpZM0p2Ykd4WUtDNHdOU2t1Y205MFlYUmxLQ1V5TUNncEpUTkVKVE5GZEdsdFpTVXlSakV3SlRJd0tTNWpiMnh2Y2lneEpUSkRNQ1V5UXk0M05Ta2xNakFwSlRCQkxtUnBabVlvSlRJd2MyaGhjR1VvT1RrbE1rTXVOQ1V5UXk0d01ESXBMbk5qY205c2JGZ29MakV3S1M1eWIzUmhkR1VvSlRJd0tDa2xNMFFsTTBWMGFXMWxKVEpHTWpBbE1qQXBMbU52Ykc5eUtERWxNa013SlRKRExqYzFLU1V5TUNrbE1FRXVaR2xtWmlnbE1qQnphR0Z3WlNnNU9TVXlReTR6SlRKRExqQXdNaWt1YzJOeWIyeHNXQ2d1TVRVcExuSnZkR0YwWlNnbE1qQW9LU1V6UkNVelJYUnBiV1VsTWtZek1DVXlNQ2t1WTI5c2IzSW9NU1V5UXpBbE1rTXVOelVwSlRJd0tTVXdRUzVrYVdabUtDVXlNSE5vWVhCbEtEazVKVEpETGpJbE1rTXVNREF5S1M1elkzSnZiR3hZS0M0eU1Da3VjbTkwWVhSbEtDVXlNQ2dwSlRORUpUTkZkR2x0WlNVeVJqUXdKVEl3S1M1amIyeHZjaWd4SlRKRE1DVXlReTQzTlNrbE1qQXBKVEJCTG1ScFptWW9KVEl3YzJoaGNHVW9PVGtsTWtNdU1TVXlReTR3TURJcExuTmpjbTlzYkZnb0xqSTFLUzV5YjNSaGRHVW9KVEl3S0NrbE0wUWxNMFYwYVcxbEpUSkdOVEFsTWpBcExtTnZiRzl5S0RFbE1rTXdKVEpETGpjMUtTVXlNQ2tsTUVFbE1FRXViVzlrZFd4aGRHVlRZMkZzWlNnbE1FRWxNakFsTWpCemFHRndaU2d5TkRBbE1rTXVOU1V5UXpBcExuTmpjbTlzYkZnb0xqQTFLUzV5YjNSaGRHVW9KVEl3S0NrbE0wUWxNMFYwYVcxbEpUSkdNVEFsTWpBcEpUQkJKVEl3SlRJd0pUSkRKVEl3S0NrbE0wUWxNMFVvVFdGMGFDNXphVzRvZEdsdFpTVXlSak1wS2k0eUtTVXlRaTR5SlRJd0tTVXdRU1V3UVM1elkyRnNaU2d4TGpZbE1rTXVOaVV5UXpFcEpUQkJMbTkxZENncFwiXG59LHtcblwic2tldGNoX2lkXCI6IFwiYWZhbGZsXzBcIixcblwiY29kZVwiOiBcIkpUSkdKVEpHWm1sc1pYUWxNakJ0YVdkdWIyNGxNRUVsTWtZbE1rWWxNakJCUmtGTVJrd2xNRUVsTWtZbE1rWWxNakJwYm5OMFlXZHlZVzBsTWtaaFgyWmZZV3htYkNVeU1DVXdRU1V3UVc5ell5Z3hNREFsTWtNdE1DNHdNREU0SlRKRE1DNHhOeWt1WkdsbVppaHZjMk1vTWpBbE1rTXdMakF3TURBNEtTNXliM1JoZEdVb1RXRjBhQzVRU1NVeVJqQXVNREF3TURNcEtTVXdRUzV0YjJSMWJHRjBaVk5qWVd4bEtHNXZhWE5sS0RFdU5TVXlRekF1TVRncExtMXZaSFZzWVhSbFUyTmhiR1VvYjNOaktERXpLUzV5YjNSaGRHVW9LQ2tsTTBRbE0wVk5ZWFJvTG5OcGJpaDBhVzFsSlRKR01qSXBLU2tsTWtNektTVXdRUzVqYjJ4dmNpZ3hNU1V5UXpBdU5TVXlRekF1TkNVeVF5VXlNREF1T1NVeVF5VXlNREF1TWlVeVF5VXlNREF1TURFeEpUSkRKVEl3TlNVeVF5VXlNREl5SlRKREpUSXdKVEl3TUM0MUpUSkRKVEl3TFRFcExtTnZiblJ5WVhOMEtERXVOQ2tsTUVFdVlXUmtLSE55WXlodk1Da3ViVzlrZFd4aGRHVW9iekFsTWtNdU1EUXBKVEpETGpZbE1rTWxNakF1T1NrbE1FRWxNakFsTWpBbE1rWWxNa1l1Y0dsNFpXeGhkR1VvTUM0MEpUSkRKVEl3TUM0eUpUSkRKVEl3TUM0eEtTVXdRUzVwYm5abGNuUW9LUzVpY21sbmFIUnVaWE56S0RBdU1EQXdNeVV5UXlVeU1ESXBMbU52Ym5SeVlYTjBLQ1V5TURBdU5TVXlReVV5TURJbE1rTWxNakF3TGpFbE1rTWxNakF5S1M1amIyeHZjaWcwSlRKREpUSXdMVElsTWtNbE1qQXdMakVwSlRCQkxtMXZaSFZzWVhSbFUyTmhiR1VvYjNOaktESXBKVEpETFRBdU1pVXlReVV5TURJbE1rTWxNakF4SlRKREpUSXdNQzR6S1NVd1FTVXlNQzV3YjNOMFpYSnBlbVVvTWpBd0tTVXlNQzV5YjNSaGRHVW9NU1V5UXlVeU1EQXVNaVV5UXlVeU1EQXVNREVsTWtNbE1qQXdMakF3TVNrbE1FRWxNakF1WTI5c2IzSW9NaklsTWtNbE1qQXRNaVV5UXlVeU1EQXVOU1V5UXlVeU1EQXVOU1V5UXlVeU1EQXVNREF3TVNVeVF5VXlNQ1V5TURBdU1TVXlReVV5TURBdU1pVXlReVV5TURncExtTnZiblJ5WVhOMEtEQXVNVGdsTWtNbE1qQXdMak1sTWtNbE1qQXdMakVsTWtNbE1qQXdMaklsTWtNbE1qQXdMakF6SlRKREpUSXdNU2tsTWpBdUpUSXdZbkpwWjJoMGJtVnpjeWd3TGpBd01ERWxNa01sTWpBdE1TVXlReVV5TURFd0tTVXdRU1V3T1M1dmRYUW9LUT09XCJcbn0sXG57XG5cInNrZXRjaF9pZFwiOiBcImVlcmllX2Vhcl8wXCIsXG5cImNvZGVcIjogXCJKVEpHSlRKR0pUSXdaV1ZmTWlVeU1DNGxNakJOVlV4VVNWWkZVbE5GSlRJd0xpVXlNSFJwYldVbE1qQmhibVFsTWpCbVpXVmtZbUZqYXlVd1FTVXlSaVV5UmlVeU1HVmZaU1V5TUNVeVJpVXlSaVV5TUNVME1HVmxjbWxsWDJWaGNpVXdRWEJoZENVeU1DVXpSQ1V5TUNncEpUTkVKVE5GSlRCQmMyOXNhV1FvS1NVd1FTNXNZWGxsY2loemIyeHBaQ2dwTG1ScFptWW9KVEJCSlRJd0pUSXdiM05qS0NoMGFXMWxKVEpHTVRZcEpUSXdLaVV5TURFbE1rTWxNakFvZEdsdFpTVXlSakV3TURBcEpUSXdLaVV5TURBdU1pVXlNQ1V5TUNrbE1FRWxNakFsTWpBbE1qQWxNakF1YlhWc2RDaHZjMk1vS0hScGJXVWxNa1k0S1NVeU1Db2xNakF4SlRKREpUSXdLSFJwYldVbE1rWXhNREEyS1NVeU1Db2xNakF3TGpJbE1qQWxNakFwTG5KdmRHRjBaU2d4TGpVM0tTa2xNRUVsTWpBbE1qQWxNakFsTWpBdWJXOWtkV3hoZEdVb0tITm9ZWEJsS0RFd05pVXlRekVsTWtNd0xqQTFLU2twSlRCQkpUSXdKVEl3SlRJd0pUSXdMbTExYkhRb2MyaGhjR1VvTVRBMkpUSkRNU1V5UXpBdU1EVXBLU1V3UVNVeU1DVXlNQ2twSlRCQkpUSXdKVEl3TG0xdlpIVnNZWFJsVTJOaGJHVW9iM05qS0RJbE1rTXdMakV5TlNrbE1rTXdMakV5TlNrbE1FRWxNa1lsTWtZbE1FRnpiMnhwWkNncEpUQkJMbXhoZVdWeUtITnZiR2xrS0RFbE1rTXhKVEpETVNrbE1FRWxNakFsTWpBdWJYVnNkQ2h3WVhRb0tTVXdRU1V5TUNVeU1DNWthV1ptS0hOeVl5aHZNQ2t1YzJOaGJHVW9NQzR5S1M1dGRXeDBLSE52Ykdsa0tDa2xNa01sTlVJd0xqY2xNa013TGpZbE1rTXdMalFsTWtNd0xqWWxOVVFwTG10aGJHVnBaQ2d4TGpBeEtTNXpZWFIxY21GMFpTZ3dMak1wS1NVd1FTa2xNRUV1YkdGNVpYSW9jMjlzYVdRb01TVXlRekVsTWtNeEtTVXdRU1V5TUNVeU1DVXlNQ1V5TUM1dFlYTnJLQ1V3UVNVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUc1dmFYTmxLRElsTWtNd0xqQTFLU1V3UVNVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUM1cGJuWmxjblFvS1M1amIyeHZjbUZ0WVNneUtTNXdiM04wWlhKcGVtVW9PQ1V5UXpRcExteDFiV0VvTUM0eU5Ta3VkR2h5WlhOb0tEQXVOU2tsTUVFbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBdWJXOWtkV3hoZEdWU2IzUmhkR1VvYjNOaktERWxNa013TGpVcEtTVXdRU1V5TUNVeU1DVXlNQ1V5TUNrbE1FRWxNakFsTWpBbE1qQWxNakF1YlhWc2RDaG5jbUZrYVdWdWRDZ3dMalVwTG10aGJHVnBaQ2d4S1M1amIyeHZjbUZ0WVNneUtTNXpZWFIxY21GMFpTZ3hMakVwTG1OdmJuUnlZWE4wS0RFdU5pa3ViWFZzZENoemIyeHBaQ2dwSlRKRE1DNDBOU2twSlRCQkpUSXdKVEl3S1NrbE1FRWxNakFsTWpBdWIzVjBLQ2tsTUVFbE1rWWxNa1lsTUVGemNHVmxaQ1V6UkNVeU1EQXVOU1V3UVE9PVwiXG59LFxue1xuXCJza2V0Y2hfaWRcIjogXCJlZXJpZV9lYXJfMVwiLFxuXCJjb2RlXCI6IFwiSlRKR0pUSkdKVEl3WldWZk15VXlNQ1V5UmlVeVJreEpUa1ZUSlRCQkpUSkdKVEpHSlRJd1pWOWxKVEl3SlRKR0pUSkdKVEl3SlRRd1pXVnlhV1ZmWldGeUpUQkJKVEpHSlRKR0pUQkJKVEpHSlRKR1ltRnpaV1FsTWpCdmJpVXdRU1V5UmlVeVJpVTBNRzVoYjNSdlgyaHBaV1JoSlRCQkpUSkdKVEpHYUhSMGNITWxNMEVsTWtZbE1rWnVZVzkwYjJocFpXUmhMbU52YlNVeVJtSnNiMmNsTWtab2VXUnlZUzFpYjI5ckpUSkdKVEJCSlRKR0pUSkdKVEJCYmlVeU1DVXpSQ1V5TURnbE1FRmhKVEl3SlRORUpUSXdLQ2tsTWpBbE0wUWxNMFVsTWpCemFHRndaU2cwSlRKRE1DNHlOU1V5UXpBdU1EQTVLUzV5YjNSaGRHVW9LQ2tsTTBRbE0wVjBhVzFsSlRKR0xUUXdLUzV5WlhCbFlYUW9iaVV5UTI0cEpUQkJZU2dwTG1Ga1pDaGhLQ2t1YzJOeWIyeHNXQ2d3TGpVbE1rWnVLUzV6WTNKdmJHeFpLREF1TlNVeVJtNHBKVEpETVNrdWJXOWtkV3hoZEdVb2J6RWxNa013TGpFcExtMXZaSFZzWVhSbEtITnlZeWh2TVNrdVkyOXNiM0lvTVRBbE1rTXhNQ2t1WVdSa0tITnZiR2xrS0MweE5DVXlReTB4TkNrcExuSnZkR0YwWlNnb0tTVXpSQ1V6UlhScGJXVWxNa1kwTUNrbE1rTXdMakF3TlNrdVlXUmtLSE55WXlodk1Ta3VjMk55YjJ4c1dTZ3dMakF4TWlVeVF6QXVNRElwSlRKRE1DNDFLUzV2ZFhRb2J6RXBKVEJCYzNKaktHOHhLUzVqYjJ4dmNtRnRZU2d4TGpJcExuQnZjM1JsY21sNlpTZzBLUzV6WVhSMWNtRjBaU2d3TGpjcExtTnZiblJ5WVhOMEtEWXBMbTExYkhRb2MyOXNhV1FvS1NVeVF6QXVNVFVwTG05MWRDaHZNQ2tsTUVFbE1FRWxNRUU9XCJcbn0sXG57XG5cInNrZXRjaF9pZFwiOiBcImVlcmllX2Vhcl8yXCIsXG5cImNvZGVcIjogXCJKVEpHSlRKR1pXVmZOU1V5TUM0bE1qQkdWVWRKVkVsV1JTVXlNRWRGVDAxRlZGSlpKVEl3VmtoVEpUSXdMaVV5TUdGMVpHbHZjbVZoWTNScGRtVWxNakJ6YUdGd1pYTWxNakJoYm1RbE1qQm5jbUZrYVdWdWRITWxNRUVsTWtZbE1rWWxNakJsWDJVbE1qQWxNa1lsTWtZbE1qQWxOREJsWlhKcFpWOWxZWElsTUVFbE1rWWxNa1lsTUVGekpUTkVKVEl3S0NrbE0wUWxNMFVsTUVFbE1qQWxNakJ6YUdGd1pTZzBLU1V3UVM1elkzSnZiR3hZS0NVMVFpMHdMalVsTWtNdE1DNHlKVEpETUM0ekpUSkRMVEF1TVNVeVF5MHdMakVsTlVRdWMyMXZiM1JvS0RBdU1Ta3VabUZ6ZENnd0xqTXBLU1V3UVM1elkzSnZiR3haS0NVMVFqQXVNalVsTWtNdE1DNHlKVEpETUM0ekpUSkRMVEF1TVNVeVF6QXVNaVUxUkM1emJXOXZkR2dvTUM0NUtTNW1ZWE4wS0RBdU1UVXBLU1V3UVNVeVJpVXlSaVV3UVhOdmJHbGtLQ2tsTUVFdVlXUmtLR2R5WVdScFpXNTBLRE1sTWtNd0xqQTFLUzV5YjNSaGRHVW9NQzR3TlNVeVF5MHdMaklwTG5CdmMzUmxjbWw2WlNneUtTNWpiMjUwY21GemRDZ3dMallwSlRKREpUVkNNU1V5UXpBbE1rTXhKVEpETUM0MUpUSkRNQ1V5UXpBdU5pVTFSQzV6Ylc5dmRHZ29NQzQ1S1NrbE1FRXVZV1JrS0hNb0tTa2xNRUV1YlhWc2RDaHpLQ2t1YzJOaGJHVW9NQzQ0S1M1elkzSnZiR3hZS0RBdU1ERXBMbk5qY205c2JGa29MVEF1TURFcExuSnZkR0YwWlNnd0xqSWxNa013TGpBMktTNWhaR1FvWjNKaFpHbGxiblFvTXlrdVkyOXVkSEpoYzNRb01DNDJLU1V5UXlVMVFqRWxNa013SlRKRE1TVXlRekF1TlNVMVJDNXpiVzl2ZEdnb01DNDVLU1V5UXpBdU5Ta3ViWFZzZENoemNtTW9iekFwTG5OallXeGxLREF1T1RncEpUSkRLQ2tsTTBRbE0wVmhMbVptZENVMVFqQWxOVVFxT1NrbE1FRWxNakFsTWpBbE1qQWxNakFsTWpBcEpUQkJMbVJwWm1Zb2N5Z3BMbTF2WkhWc1lYUmxLSE5vWVhCbEtEVXdNQ2twTG5OallXeGxLQ1UxUWpFdU55VXlRekV1TWlVMVJDNXpiVzl2ZEdnb01DNDVLUzVtWVhOMEtEQXVNRFVwS1NrbE1FRXVZV1JrS0dkeVlXUnBaVzUwS0RJcExtbHVkbVZ5ZENncEpUSkRLQ2tsTTBRbE0wVmhMbVptZENVMVFqSWxOVVFwSlRCQkxtMTFiSFFvWjNKaFpHbGxiblFvS0NrbE0wUWxNMFZoTG1abWRDVTFRak1sTlVRcU9Da3BKVEJCTG1Kc1pXNWtLSE55WXlnb2J6QXBKVEpES0NrbE0wUWxNMFZoTG1abWRDVTFRakVsTlVRcU5EQXBLU1V3UVM1aFpHUW9kbTl5YjI1dmFTZ29LU1V6UkNVelJXRXVabVowSlRWQ01TVTFSQ1V5UXlncEpUTkVKVE5GWVM1bVpuUWxOVUl6SlRWRUpUSkRLQ2tsTTBRbE0wVmhMbVptZENVMVFqQWxOVVFwTG5Sb2NtVnphQ2d3TGpjcExuQnZjM1JsY21sNlpTZ3lKVEpETkNrdWJIVnRZU2d3TGprcExuTmpjbTlzYkZrb01TVXlReWdwSlRORUpUTkZZUzVtWm5RbE5VSXdKVFZFSlRKR016QXBMbU52Ykc5eVlXMWhLRE1wTG5Sb2NtVnphQ2dvS1NVelJDVXpSV0V1Wm1aMEpUVkNNU1UxUkNrdWMyTmhiR1VvS0NrbE0wUWxNMFZoTG1abWRDVTFRak1sTlVRcU1pa2xNa01vS1NVelJDVXpSV0V1Wm1aMEpUVkNNQ1UxUkNVeVJqSXBKVEJCSlRJd0pUSXdMbTkxZENncEpUQkJKVEpHSlRKR0pUQkJjM0JsWldRbE0wUWxNakF4SlRCQkpUQkJZUzV6WlhSVGJXOXZkR2dvTUM0NU5paz1cIlxufSxcbntcblwic2tldGNoX2lkXCI6IFwiZWVyaWVfZWFyXzNcIixcblwiY29kZVwiOiBcIkpUSkdKVEpHSlRJd1pXVmZNU1V5TUM0bE1qQkZXVVVsTWpCSlRpVXlNRlJJUlNVeU1GTkxXU1V3UVNVeVJpVXlSbVY0WVcxd2JHVWxNakJ2WmlVeU1HMWhjMnNsTWpCaGJtUWxNakJtZFc1amRHbHZiaVV5TUcxdlpIVnNZWFJwYjI0bE1FRWxNa1lsTWtZbE1qQmxYMlVsTWpBbE1rWWxNa1lsTWpBbE5EQmxaWEpwWlY5bFlYSWxNRUZ1YjJselpTZ3hPQ2tsTUVFbE1qQWxNakF1WTI5c2IzSmhiV0VvTVNrbE1FRWxNakFsTWpBdWNHOXpkR1Z5YVhwbEtESXBKVEJCSlRJd0pUSXdMbXRoYkdWcFpDZzFNQ2tsTUVFbE1qQWxNakF1YldGemF5Z2xNRUVsTWpBbE1qQWxNakFsTWpCemFHRndaU2d5TlNVeVF5VXlNREF1TWpVcExtMXZaSFZzWVhSbFUyTmhiR1VvSlRCQkpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2JtOXBjMlVvTkRBd0xqVWxNa01sTWpBd0xqVXBKVEJCSlRJd0pUSXdKVEl3SlRJd0tTVXdRU1V5TUNVeU1Da2xNRUVsTWpBbE1qQXViV0Z6YXloemFHRndaU2cwTURBbE1rTWxNakF4SlRKREpUSXdNaTR4TWpVcEtTVXdRU1V5TUNVeU1DNXRiMlIxYkdGMFpWTmpZV3hsS0c5ell5ZzJKVEpESlRJd01DNHhNalVsTWtNbE1qQXdMakExS1M1cllXeGxhV1FvTlRBcEtTVXdRU1V5TUNVeU1DNXRkV3gwS0c5ell5Z3lNQ1V5UXlVeU1EQXVNRFVsTWtNbE1qQXlMalFwTG10aGJHVnBaQ2cxTUNrbE1rTWxNakF3TGpJMUtTVXdRU1V5TUNVeU1DNXpZMkZzWlNneExqYzFKVEpESlRJd01DNDJOU1V5UXlVeU1EQXVOU2tsTUVFbE1qQWxNakF1Ylc5a2RXeGhkR1VvYm05cGMyVW9NQzQxS1NrbE1FRWxNakFsTWpBdWMyRjBkWEpoZEdVb05pa2xNRUVsTWpBbE1qQXVjRzl6ZEdWeWFYcGxLRFFsTWtNbE1qQXdMaklwSlRCQkpUSXdKVEl3TG5OallXeGxLREV1TlNrbE1FRWxNakFsTWpBdWIzVjBLQ2tsTTBJbE1FRT1cIlxufVxuXVxuIiwiY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoJ3N1cGVyYWdlbnQnKVxuY29uc3QgZXhhbXBsZXMgPSByZXF1aXJlKCcuL2V4YW1wbGVzLmpzb24nKVxuY29uc3Qgc2tldGNoZXMgPSBbXVxuXG5cbmNsYXNzIEdhbGxlcnkge1xuICBjb25zdHJ1Y3RvciAoY2FsbGJhY2spIHtcbiAgICB0aGlzLnNrZXRjaGVzID0gW11cbiAgICB0aGlzLmV4YW1wbGVzID0gW11cbiAgICB0aGlzLmN1cnJlbnQgPSBudWxsXG4gICAgdGhpcy5jb2RlID0gbnVsbFxuICAgIHRoaXMuZXhhbXBsZUluZGV4ID0gbnVsbFxuXG4gICAgLy8gcmVxdWVzdC5nZXQoJy9za2V0Y2hlcycpLmVuZCgoZXJyLCByZXMpID0+IHtcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdnb3Qgc2tldGNoZXMnLCByZXMudGV4dCwgZXJyKVxuICAgIC8vICAgaWYoZXJyKSB7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKCdlcnIgZ2V0dGluZyBza2V0Y2hlcycsIGVycilcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIHRoaXMuc2tldGNoZXMgPSBKU09OLnBhcnNlKHJlcy50ZXh0KVxuICAgIC8vICAgfVxuXG4gICAgICB0aGlzLmV4YW1wbGVzID0gZXhhbXBsZXNcbiAgICAgIHRoaXMuc2V0U2tldGNoRnJvbVVSTChjYWxsYmFjaylcbiAgICAvLyAgY2FsbGJhY2sodGhpcy5jb2RlLCB0aGlzLmZvdW5kU2tldGNoKVxuICAgIC8vIH0pXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvcHN0YXRlJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLnNldFNrZXRjaEZyb21VUkwoY2FsbGJhY2spXG4gICAgY29uc29sZS5sb2coXCJsb2NhdGlvbjogXCIgKyBkb2N1bWVudC5sb2NhdGlvbiArIFwiLCBzdGF0ZTogXCIgKyBKU09OLnN0cmluZ2lmeShldmVudC5zdGF0ZSkpO1xuICB9KTtcbiAgICB0aGlzLnNldFJhbmRvbVNrZXRjaCA9IHRoaXMuc2V0UmFuZG9tU2tldGNoLmJpbmQodGhpcylcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuY3VycmVudCA9IG51bGxcbiAgICB0aGlzLmNvZGUgPSBudWxsXG4gICAgLy90aGlzLmV4YW1wbGVJbmRleCA9IG51bGxcbiAgICBsZXQgbmV3dXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0ICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lXG4gICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHsgcGF0aDogbmV3dXJsIH0sICcnLCBuZXd1cmwpXG4gICAgdGhpcy51cmwgPSBuZXd1cmxcbiAgfVxuXG4gIHNldFNrZXRjaEZyb21VUkwoY2FsbGJhY2spIHtcbiAgICBodXNoKClcbiAgICByZW5kZXIobzApXG4gICAgbGV0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaClcbiAgICBsZXQgYmFzZTY0Q29kZSA9IHNlYXJjaFBhcmFtcy5nZXQoJ2NvZGUnKVxuICAvLyAgaWYoIWJhc2U2NENvZGUpIGJhc2U2NENvZGUgPSBzZWFyY2hQYXJhbXMuZ2V0KCdpZCcpIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciBmb3JtIG9mIG5hbWluZy4gaWQgaXMgbm93IGNhbGxlZCBjb2RlXG4gICAgbGV0IHNrZXRjaF9pZCA9IHNlYXJjaFBhcmFtcy5nZXQoJ3NrZXRjaF9pZCcpXG4gICAgbGV0IGNvZGUgPSAnJ1xuICAgIGNvbnNvbGUubG9nKFwiaWRcIiwgc2tldGNoX2lkLCBcImNvZGVcIiwgYmFzZTY0Q29kZSlcblxuICAgIC8vIGJvb2xlYW4gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBza2V0Y2ggd2FzIGZvdW5kIGJhc2VkIG9uIHRoZSBVUkwsIGVpdGhlciB0aHJvdWdoIGxvb2tpbmcgdGhyb3VnaCB0aGUgZGF0YWJhc2Ugb3IgcmVuZGVyaW5nIHRoZSBjb2RlXG4gICAgdGhpcy5mb3VuZFNrZXRjaCA9IGZhbHNlXG4gICAgLy8gaWYgY29udGFpbnMgYSBza2V0Y2ggaWQsIHNldCBza2V0Y2ggZnJvbSBpZFxuICAgIGlmKHNrZXRjaF9pZCkge1xuICAgICAgdmFyIHNrZXRjaCA9IHRoaXMuZ2V0RXhhbXBsZUJ5SWQoc2tldGNoX2lkKVxuICAgICAgaWYoc2tldGNoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdmb3VuZCcsIHNrZXRjaClcbiAgICAgICAgICB0aGlzLnNldFNrZXRjaChza2V0Y2gpXG4gICAgICAgICAgY2FsbGJhY2sodGhpcy5jb2RlLCBmYWxzZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3RcbiAgICAgICAgICAuZ2V0KCcvc2tldGNoQnlJZCcpXG4gICAgICAgICAgLnF1ZXJ5KHtza2V0Y2hfaWQ6IHNrZXRjaF9pZH0pXG4gICAgICAgICAgLmVuZCgoZXJyLCByZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnb3Qgc2tldGNoZXMnLCByZXMudGV4dCwgZXJyKVxuICAgICAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnIgZ2V0dGluZyBza2V0Y2hlcycsIGVycilcbiAgICAgICAgICAgICAgdGhpcy5zZXRTa2V0Y2hGcm9tQ29kZShiYXNlNjRDb2RlLCBjYWxsYmFjaylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2tldGNoZXMgPSBKU09OLnBhcnNlKHJlcy50ZXh0KVxuICAgICAgICAgICAgICBpZih0aGlzLnNrZXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNrZXRjaCh0aGlzLnNrZXRjaGVzWzBdKVxuICAgICAgICAgICAgICAgIC8vdGhpcy5jb2RlID0gdGhpcy5kZWNvZGVCYXNlNjQodGhpcy5za2V0Y2hlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuZm91bmRTa2V0Y2ggPSB0cnVlXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcy5jb2RlLCB0aGlzLmZvdW5kU2tldGNoKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2tldGNoRnJvbUNvZGUoYmFzZTY0Q29kZSwgY2FsbGJhY2spXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U2tldGNoRnJvbUNvZGUoYmFzZTY0Q29kZSwgY2FsbGJhY2spXG4gICAgICB9XG4gICAgLy9cbiAgICAvLyAgIC8vIGNvbnNvbGUubG9nKCdmb3VuZCAnLCBza2V0Y2gpXG4gICAgLy8gICAvLyBpZihza2V0Y2gpIHtcbiAgICAvLyAgIC8vICAgdGhpcy5zZXRTa2V0Y2goc2tldGNoKVxuICAgIC8vICAgLy8gICB0aGlzLiA9IHRydWUwXG4gICAgLy8gICAvLyB9IGVsc2UgaWYgKGJhc2U2NENvZGUpe1xuICAgIC8vICAgLy8gICB0aGlzLmNvZGUgPSB0aGlzLmRlY29kZUJhc2U2NChiYXNlNjRDb2RlKVxuICAgIC8vICAgLy8gICB0aGlzLmZvdW5kU2tldGNoID0gdHJ1ZVxuICAgIC8vICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIC8vICAgY29uc29sZS5sb2coJ2lkIG5vdCBmb3VuZCcsIHNrZXRjaF9pZClcbiAgICAvLyAgIC8vICAgdGhpcy5zZXRSYW5kb21Ta2V0Y2goKVxuICAgIC8vICAgLy8gfVxuICAgIC8vXG4gICAgLy8gLy8gLy8gYmFja3dhcmRzIGNvbWJhaXRiaWxpdHkgd2l0aCBlYXJsaWVyIHNoYXJlYWJsZSBVUkxTXG4gICAgLy8gfSBlbHNlIHtcbiAgICAvL1xuICAgIC8vICAgaWYgKGJhc2U2NENvZGUpIHtcbiAgICAvLyAgICAgdGhpcy5jb2RlID0gdGhpcy5kZWNvZGVCYXNlNjQoYmFzZTY0Q29kZSlcbiAgICAvLyAgICAgdGhpcy5mb3VuZFNrZXRjaCA9IHRydWVcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIHRoaXMuc2V0UmFuZG9tU2tldGNoKClcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gIH1cblxuICBzZXRTa2V0Y2hGcm9tQ29kZShiYXNlNjRDb2RlLCBjYWxsYmFjayl7XG4gICAgaWYgKGJhc2U2NENvZGUpIHtcbiAgICAgIHRoaXMuY29kZSA9IHRoaXMuZGVjb2RlQmFzZTY0KGJhc2U2NENvZGUpXG4gICAgICB0aGlzLmZvdW5kU2tldGNoID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFJhbmRvbVNrZXRjaCgpXG4gICAgfVxuICAgIGNhbGxiYWNrKHRoaXMuY29kZSwgdGhpcy5mb3VuZFNrZXRjaClcbiAgfVxuXG4gIHNhdmVJbWFnZSgpIHtcblxuICB9XG5cbiAgc2V0VG9VUkwocGFyYW1zKXtcbiAgICAvLyAgICAgICBjb25zb2xlLmxvZyhiYXNlNjQpXG4gICAgY29uc29sZS5sb2coJ3BhcmFtcycsIHBhcmFtcylcbiAgICAvLyBrZWVwIGNvZGUgaW4gdXJsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAvIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBsb2NhbCBhbmQgcHVibGljIHZlcnNpb25zXG4gICAgdmFyIHVybF9wYXJhbXNcbiAgICBpZihwYXJhbXMuc2tldGNoX2lkKSB7XG4gICAgICAgdXJsX3BhcmFtcyA9IGBza2V0Y2hfaWQ9JHtwYXJhbXMuc2tldGNoX2lkfWBcbiAgICB9IGVsc2Uge1xuICAgICAgdXJsX3BhcmFtcyA9IGBza2V0Y2hfaWQ9JHtwYXJhbXMuc2tldGNoX2lkfSZjb2RlPSR7cGFyYW1zLmNvZGV9YFxuICAgIH1cbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgdXJsX3BhcmFtcyA9IHBhcmFtcy5tYXAoIChwYXJhbSwgaW5kZXgpID0+IGAke3BhcmFtLmxhYmVsfT0ke3BhcmFtLnZhbHVlfWApLmpvaW4oJyYnKVxuICAgIC8vIH1cbiAgLy8gIGNvbnNvbGUubG9nKCd1cmwgcGFyYW1zJywgdXJsX3BhcmFtcylcbiAgICBsZXQgbmV3dXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArXG4gICAgd2luZG93LmxvY2F0aW9uLmhvc3QgKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyAnPycgKyB1cmxfcGFyYW1zXG4gIC8vICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG5ld3VybFxuXG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHsgcGF0aDogbmV3dXJsIH0sICcnLCBuZXd1cmwpXG4gICAgdGhpcy51cmwgPSBuZXd1cmxcbiAgfVxuXG4gIGVuY29kZUJhc2U2NCh0ZXh0KSB7XG4gICAgcmV0dXJuIGJ0b2EoZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpKVxuICB9XG4gIGRlY29kZUJhc2U2NChiYXNlNjRDb2RlKSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhdG9iKGJhc2U2NENvZGUpKVxuICB9XG5cbiAgc2V0U2tldGNoKHNrZXRjaCkge1xuICAgIHRoaXMuY29kZSA9IHRoaXMuZGVjb2RlQmFzZTY0KHNrZXRjaC5jb2RlKVxuICAgIHRoaXMuY3VycmVudCA9IHNrZXRjaFxuICAvLyAgdGhpcy5zZXRUb1VSTCgnc2tldGNoX2lkJywgc2tldGNoLl9pZClcbiAgICAvLyBsZXQgcGFyYW1zID0gT2JqZWN0LmtleXMoc2tldGNoKS5tYXAoIChrZXkpID0+IHtcbiAgICAvLyAgIHJldHVybiB7bGFiZWw6IGtleSwgdmFsdWU6IHNrZXRjaFtrZXldfVxuICAgIC8vIH0pXG4gICAgdGhpcy5zZXRUb1VSTChza2V0Y2gpXG4gIH1cblxuICBzZXRSYW5kb21Ta2V0Y2goKSB7XG4gICAgLy8gaWYgdGhlcmUgYXJlIHNrZXRjaGVzLCBzZXQgY29kZSBmcm9tIHNrZXRjaCwgb3RoZXJ3aXNlIGdlbmVyYXRlIHJhbmRvbVxuICAgIGNvbnNvbGUubG9nKFwiZXhhbXBsZXMgbGVuZ3RoXCIsIHRoaXMuZXhhbXBsZXMsIHRoaXMuZXhhbXBsZUluZGV4KVxuICAgIGlmKHRoaXMuZXhhbXBsZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGluZGV4XG4gICAgICAvLyBpZih0aGlzLmV4YW1wbGVJbmRleCA9PT0gbnVsbCkge1xuICAgICAgICBpbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuZXhhbXBsZXMubGVuZ3RoKVxuICAgICAgICB3aGlsZSAoaW5kZXggPT09IHRoaXMuZXhhbXBsZUluZGV4KSB7XG4gICAgICAgICAgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLmV4YW1wbGVzLmxlbmd0aClcbiAgICAgICAgfVxuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgaW5kZXggPSB0aGlzLmV4YW1wbGVJbmRleCArMVxuICAgICAgLy8gICBpZihpbmRleCA+PSB0aGlzLmV4YW1wbGVzLmxlbmd0aCkgaW5kZXggPSAwXG4gICAgICAvLyB9XG4gICAgICB0aGlzLmV4YW1wbGVJbmRleCA9IGluZGV4XG4gICAgLy8gIGNvbnNvbGUubG9nKCdleGFtcGxlIGlzJywgdGhpcy5leGFtcGxlc1tyYW5kXSlcbiAgICAgIHRoaXMuc2V0U2tldGNoKHRoaXMuZXhhbXBsZXNbaW5kZXhdKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3RhcnRTdHJpbmcgPSAnb3NjKCcgKyAyICsgTWF0aC5mbG9vcihNYXRoLnBvdygxMCwgTWF0aC5yYW5kb20oKSAqIDIpKSArICcpJ1xuICAgICAgc3RhcnRTdHJpbmcgKz0gJy5jb2xvcignICsgTWF0aC5yYW5kb20oKS50b0ZpeGVkKDIpICsgJywnICsgTWF0aC5yYW5kb20oKS50b0ZpeGVkKDIpICsgJywnICsgTWF0aC5yYW5kb20oKS50b0ZpeGVkKDIpKyAnKSdcbiAgICAgIHN0YXJ0U3RyaW5nICs9ICcucm90YXRlKCcgKyBNYXRoLnJhbmRvbSgpLnRvRml4ZWQoMikgKyAnKSdcbiAgICAgIHN0YXJ0U3RyaW5nICs9ICcub3V0KG8wKSdcbiAgICAgIHRoaXMuY29kZSA9IHN0YXJ0U3RyaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gc2hhcmVzIHZpYSB0d2l0dGVyXG4gIHNoYXJlU2tldGNoKGNvZGUsIGh5ZHJhLCBuYW1lKSB7XG4gICAgdGhpcy5zYXZlU2tldGNoKGNvZGUsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiVVJMIGlzXCIsIHRoaXMudXJsLCAnc2tldGNoIGlzJywgdGhpcy5jdXJyZW50KVxuICAgICAgaHlkcmEuZ2V0U2NyZWVuSW1hZ2UoKGltZykgPT4ge1xuICAgICAgICByZXF1ZXN0XG4gICAgICAgICAgLnBvc3QoJy9pbWFnZScpXG4gICAgICAgICAgLmF0dGFjaCgncHJldmlld0ltYWdlJywgaW1nKVxuICAgICAgICAgIC5xdWVyeSh7XG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgc2tldGNoX2lkOiB0aGlzLmN1cnJlbnQuc2tldGNoX2lkLFxuICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gLnNlbmQoe1xuICAgICAgICAgIC8vICAgY29kZTogYmFzZTY0XG4gICAgICAgICAgLy8gfSlcbiAgICAgICAgLy8gIC5xdWVyeShxdWVyeSlcbiAgICAgICAgICAuZW5kKChlcnIsIHJlcykgPT4ge1xuICAgICAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciBwb3N0aW5naW1hZ2UnLCBlcnIpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaW1hZ2UgcmVzcG9uc2UnLCByZXMudGV4dClcbiAgICAgICAgICAgIC8vICBzZWxmLnNldFRvVVJMKFsgeyBsYWJlbDogJ3NrZXRjaF9pZCcsIHZhbHVlOiByZXMudGV4dH0sIHtsYWJlbDogJ2NvZGUnLCB2YWx1ZTogYmFzZTY0fSBdKVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgLy8gdmFyIG9SZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgLy8gb1JlcS5vcGVuKFwiUE9TVFwiLCBcImh0dHBzOi8vbG9jYWxob3N0OjgwMDAvaW1hZ2VcIiwgdHJ1ZSk7XG4gICAgICAgIC8vIG9SZXEub25sb2FkID0gZnVuY3Rpb24gKG9FdmVudCkge1xuICAgICAgICAvLyAgIC8vIFVwbG9hZGVkLlxuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKFwidXBsb2FkZWRcIiwgb0V2ZW50KVxuICAgICAgICAvLyB9O1xuICAgICAgICAvLyBvUmVxLnNlbmQoaW1nKTtcbiAgICAgIC8vICBjb25zb2xlLmxvZygnZ290IGltYWdlJywgaW1nKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgc2F2ZVNrZXRjaChjb2RlLCBjYWxsYmFjaykge1xuICAgIGxldCBzZWxmID0gdGhpc1xuICAgIC8vY29uc29sZS5sb2coJ3NhdmluZyBpbiBnYWxsZXJ5JywgY29kZSlcbiAgICBsZXQgYmFzZTY0ID0gdGhpcy5lbmNvZGVCYXNlNjQoY29kZSlcbiAgLy8gIGNvbnNvbGUubG9nKCdjb2RlIGlzJywgYmFzZTY0KVxuXG4gICAgbGV0IHF1ZXJ5ID0ge1xuICAgICAgY29kZTogYmFzZTY0LFxuICAgICAgcGFyZW50OiB0aGlzLmN1cnJlbnQgPyB0aGlzLmN1cnJlbnQuc2tldGNoX2lkIDogbnVsbFxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdzYXZpbmcgaW4gZ2FsbGVyeScsIHF1ZXJ5KVxuICAgIHJlcXVlc3RcbiAgICAgIC5wb3N0KCcvc2tldGNoJylcbiAgICAgIC8vIC5zZW5kKHtcbiAgICAgIC8vICAgY29kZTogYmFzZTY0XG4gICAgICAvLyB9KVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLmVuZCgoZXJyLCByZXMpID0+IHtcbiAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHBvc3Rpbmcgc2tldGNoJywgZXJyKVxuICAgICAgICAgIGlmKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3Jlc3BvbnNlJywgcmVzLnRleHQpXG4gICAgICAgIC8vICBzZWxmLnNldFRvVVJMKFsgeyBsYWJlbDogJ3NrZXRjaF9pZCcsIHZhbHVlOiByZXMudGV4dH0sIHtsYWJlbDogJ2NvZGUnLCB2YWx1ZTogYmFzZTY0fSBdKVxuICAgICAgICAgIHNlbGYuc2V0U2tldGNoKHtcbiAgICAgICAgICAgIHNrZXRjaF9pZDogcmVzLnRleHQsXG4gICAgICAgICAgICBjb2RlOiBiYXNlNjRcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmKGNhbGxiYWNrKSBjYWxsYmFjayhudWxsKVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgc2F2ZUxvY2FsbHkoY29kZSkge1xuICAgIGxldCBiYXNlNjQgPSB0aGlzLmVuY29kZUJhc2U2NChjb2RlKVxuXG4gICAgLy8ga2VlcCBjb2RlIGluIHVybCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgLyBjb21wYXRpYmlsaXR5IGJldHdlZW4gbG9jYWwgYW5kIHB1YmxpYyB2ZXJzaW9uc1xuICAgIHZhciB1cmxfcGFyYW1zID0gYGNvZGU9JHtiYXNlNjR9YFxuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICB1cmxfcGFyYW1zID0gcGFyYW1zLm1hcCggKHBhcmFtLCBpbmRleCkgPT4gYCR7cGFyYW0ubGFiZWx9PSR7cGFyYW0udmFsdWV9YCkuam9pbignJicpXG4gICAgLy8gfVxuICAgIGNvbnNvbGUubG9nKCd1cmwgcGFyYW1zJywgdXJsX3BhcmFtcylcbiAgICBsZXQgbmV3dXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArXG4gICAgd2luZG93LmxvY2F0aW9uLmhvc3QgKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyAnPycgKyB1cmxfcGFyYW1zXG4gICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHsgcGF0aDogbmV3dXJsIH0sICcnLCBuZXd1cmwpXG4gICAgdGhpcy51cmwgPSBuZXd1cmxcbiAgfVxuXG4gIGdldEV4YW1wbGVCeUlkKGlkKSB7XG4gICAgY29uc29sZS5sb2coJ2xvb2tpbmcgZm9yJywgaWQsIHRoaXMuZXhhbXBsZXMsIHRoaXMuc2tldGNoZXMpXG4gICAgdmFyIHNrZXRjaGVzID0gIHRoaXMuZXhhbXBsZXMuZmlsdGVyKChza2V0Y2gpID0+IHNrZXRjaC5za2V0Y2hfaWQgPT09IGlkKVxuICAgIGlmKHNrZXRjaGVzLmxlbmd0aCA8PSAwKSBza2V0Y2hlcyA9IHRoaXMuc2tldGNoZXMuZmlsdGVyKChza2V0Y2gpID0+IHNrZXRjaC5za2V0Y2hfaWQgPT09IGlkKVxuICAgIHJldHVybiBza2V0Y2hlc1swXVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR2FsbGVyeVxuIiwidmFyIGxvZ0VsZW1lbnRcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGluaXQ6ICgpID0+IHtcbiAgICBsb2dFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBsb2dFbGVtZW50LmNsYXNzTmFtZSA9IFwiY29uc29sZSBjbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzXCJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxvZ0VsZW1lbnQpXG4gIH0sXG4gIGxvZzogKG1zZywgY2xhc3NOYW1lID0gXCJcIikgPT4ge1xuICAgIGlmKGxvZ0VsZW1lbnQpIGxvZ0VsZW1lbnQuaW5uZXJIVE1MID1gID4+IDxzcGFuIGNsYXNzPSR7Y2xhc3NOYW1lfT4gJHttc2d9IDwvc3Bhbj4gYFxuICB9LFxuICBoaWRlOiAoKSA9PiB7XG4gICAgaWYobG9nRWxlbWVudCkgbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gIH0sXG4gIHNob3c6ICgpID0+IHtcbiAgICBpZihsb2dFbGVtZW50KSBsb2dFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXG4gIH0sXG4gIHRvZ2dsZTogKCkgPT4ge1xuICAgIGlmKGxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9PSAnbm9uZScpIHtcbiAgICAgIGxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgfVxuICB9XG59XG4iLCJjb25zdCByZXBsID0gcmVxdWlyZSgnLi9yZXBsLmpzJylcbmNvbnN0IHByZXR0aWVyID0gcmVxdWlyZShcInByZXR0aWVyL3N0YW5kYWxvbmVcIilcbmNvbnN0IHBhcnNlckJhYmVsID0gcmVxdWlyZShcInByZXR0aWVyL3BhcnNlci1iYWJlbFwiKTtcblxuY2xhc3MgTWVudSB7XG4gIGNvbnN0cnVjdG9yIChvYmopIHtcbiAgICB0aGlzLnNrZXRjaGVzID0gb2JqLnNrZXRjaGVzXG4gICAgdGhpcy5lZGl0b3IgPSBvYmouZWRpdG9yXG4gICAgdGhpcy5oeWRyYSA9IG9iai5oeWRyYVxuXG4gICAgLy8gdmFyaWFibGVzIHJlbGF0ZWQgdG8gcG9wdXAgd2luZG93XG4gICAgdGhpcy5jbG9zZUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2xvc2UtaWNvblwiKVxuICAgIHRoaXMuY2xlYXJCdXR0b24gPSAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjbGVhci1pY29uXCIpXG4gICAgdGhpcy5zaGFyZUJ1dHRvbiA9ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNoYXJlLWljb25cIilcbiAgICB0aGlzLnNodWZmbGVCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNodWZmbGUtaWNvblwiKVxuICAgIHRoaXMubXV0YXRvckJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibXV0YXRvci1pY29uXCIpXG4gICAgdGhpcy5ydW5CdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJ1bi1pY29uXCIpXG4gICAgdGhpcy5lZGl0b3JUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnQ29kZU1pcnJvci1zY3JvbGwnKVswXVxuXG4gICAgdGhpcy5ydW5CdXR0b24ub25jbGljayA9IHRoaXMucnVuQWxsLmJpbmQodGhpcylcbiAgICB0aGlzLnNodWZmbGVCdXR0b24ub25jbGljayA9IHRoaXMuc2h1ZmZsZVNrZXRjaGVzLmJpbmQodGhpcylcbiAgICB0aGlzLnNoYXJlQnV0dG9uLm9uY2xpY2sgPSB0aGlzLnNoYXJlU2tldGNoLmJpbmQodGhpcylcbiAgICB0aGlzLmNsZWFyQnV0dG9uLm9uY2xpY2sgPSB0aGlzLmNsZWFyQWxsLmJpbmQodGhpcylcbiAgICB0aGlzLmNsb3NlQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICBpZighdGhpcy5pc0Nsb3NlZCkge1xuICAgICAgICB0aGlzLmNsb3NlTW9kYWwoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWwoKVxuICAgICAgfVxuICAgIH1cblxuXHQgICB0aGlzLm11dGF0b3JCdXR0b24ub25jbGljayA9IHRoaXMubXV0YXRlU2tldGNoLmJpbmQodGhpcyk7XG4gICAgdGhpcy5pc0Nsb3NlZCA9IGZhbHNlXG4gICAgdGhpcy5jbG9zZU1vZGFsKClcbiAgfVxuXG4gIHJ1bkFsbCgpIHtcbiAgICByZXBsLmV2YWwodGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSwgKHN0cmluZywgZXJyKSA9PiB7XG4gICAgLy8gIGNvbnNvbGUubG9nKCdldmFsJywgZXJyKVxuICAgICB0aGlzLmVkaXRvci5mbGFzaENvZGUoKVxuICAgICAgaWYoIWVycikgdGhpcy5za2V0Y2hlcy5zYXZlTG9jYWxseSh0aGlzLmVkaXRvci5nZXRWYWx1ZSgpKVxuICAgIH0pXG4gIH1cblxuICBzaHVmZmxlU2tldGNoZXMoKSB7XG4gICAgdGhpcy5jbGVhckFsbCgpXG4gICAgdGhpcy5za2V0Y2hlcy5zZXRSYW5kb21Ta2V0Y2goKVxuICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuc2tldGNoZXMuY29kZSlcbiAgICByZXBsLmV2YWwodGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSlcbiAgfVxuXG4gIGZvcm1hdENvZGUoKSB7XG4gICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUocHJldHRpZXIuZm9ybWF0KHRoaXMuZWRpdG9yLmdldFZhbHVlKCksIHtcbiAgICAgIHBhcnNlcjogXCJiYWJlbFwiLFxuICAgICAgcGx1Z2luczogW3BhcnNlckJhYmVsXSxcbiAgICAgIHByaW50V2lkdGg6IDUwXG4gICAgfSkpXG4gIH1cblxuICBzaGFyZVNrZXRjaCgpIHtcbiAgICAgIHJlcGwuZXZhbCh0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLCAoY29kZSwgZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2V2YWx1YXRlZCcsIGNvZGUsIGVycm9yKVxuICAgICAgICBpZighZXJyb3Ipe1xuICAgICAgICAgIHRoaXMuc2hvd0NvbmZpcm1hdGlvbiggKG5hbWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2tldGNoZXMuc2hhcmVTa2V0Y2goY29kZSwgdGhpcy5oeWRyYSwgbmFtZSlcbiAgICAgICAgICB9LCAoKSA9PiB0aGlzLmhpZGVDb25maXJtYXRpb24oKSApXG4gICAgICAgIH1cbiAgICAgIH0pXG4gIH1cblxuICBzaG93Q29uZmlybWF0aW9uKHN1Y2Nlc3NDYWxsYmFjaywgdGVybWluYXRlQ2FsbGJhY2spIHtcbiAgICB2YXIgYyA9IHByb21wdChcIlByZXNzaW5nIE9LIHdpbGwgc2hhcmUgdGhpcyBza2V0Y2ggdG8gXFxuaHR0cHM6Ly90d2l0dGVyLmNvbS9oeWRyYV9wYXR0ZXJucy5cXG5cXG5JbmNsdWRlIHlvdXIgbmFtZSBvciB0d2l0dGVyIGhhbmRsZSAob3B0aW9uYWwpOlwiKVxuICAgIGNvbnNvbGUubG9nKCdjb25maXJtIHZhbHVlJywgYylcbiAgICBpZiAoYyAhPT0gbnVsbCkge1xuICAgICAgc3VjY2Vzc0NhbGxiYWNrKGMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRlcm1pbmF0ZUNhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICBoaWRlQ29uZmlybWF0aW9uKCkge1xuXG4gIH1cblxuICBjbGVhckFsbCgpIHtcbiAgICBodXNoKClcbiAgICBzcGVlZCA9IDFcbiAgICB0aGlzLnNrZXRjaGVzLmNsZWFyKClcbiAgICB0aGlzLmVkaXRvci5jbGVhcigpXG4gICAgLy9AdG9kbzogYWRkIGNsZWFyL3Jlc2V0IGZ1bmN0aW9uIHRvIGh5ZHJhXG4gIH1cblxuICBjbG9zZU1vZGFsICgpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImluZm8tY29udGFpbmVyXCIpLmNsYXNzTmFtZSA9IFwiaGlkZGVuXCJcbiAgICB0aGlzLmNsb3NlQnV0dG9uLmNsYXNzTmFtZSA9IFwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSBpY29uXCJcbiAgICB0aGlzLnNoYXJlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpXG4gICAgdGhpcy5jbGVhckJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKVxuICAgIHRoaXMubXV0YXRvckJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICB0aGlzLnJ1bkJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICB0aGlzLmVkaXRvclRleHQuc3R5bGUub3BhY2l0eSA9IDFcbiAgICB0aGlzLmlzQ2xvc2VkID0gdHJ1ZVxuICB9XG5cbiAgb3Blbk1vZGFsICgpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImluZm8tY29udGFpbmVyXCIpLmNsYXNzTmFtZSA9IFwiXCJcbiAgICB0aGlzLmNsb3NlQnV0dG9uLmNsYXNzTmFtZSA9IFwiZmFzIGZhLXRpbWVzIGljb25cIlxuICAgIHRoaXMuc2hhcmVCdXR0b24uY2xhc3NMaXN0LmFkZCgnaGlkZGVuJylcbiAgICB0aGlzLmNsZWFyQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpXG4gICAgdGhpcy5tdXRhdG9yQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIHRoaXMucnVuQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIHRoaXMuZWRpdG9yVGV4dC5zdHlsZS5vcGFjaXR5ID0gMC4wXG4gICAgdGhpcy5pc0Nsb3NlZCA9IGZhbHNlXG4gIH1cblxuICBtdXRhdGVTa2V0Y2goZXZ0KSB7XG4gIFx0aWYgKGV2dC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5lZGl0b3IubXV0YXRvci5kb1VuZG8oKTtcbiAgXHR9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0b3IubXV0YXRvci5tdXRhdGUoe3Jlcm9sbDogZmFsc2V9KTtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNZW51XG4iLCIvLyd1c2UgYmFiZWwnXG5cbmNvbnN0IHA1bGliID0gcmVxdWlyZSgncDUnKVxucmVxdWlyZSgncDUvbGliL2FkZG9ucy9wNS5kb20nKVxuXG5jbGFzcyBQNSBleHRlbmRzIHA1bGlie1xuICBjb25zdHJ1Y3RvciAoe1xuICAgIHdpZHRoID0gd2luZG93LmlubmVyV2lkdGgsXG4gICAgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0LFxuICAgIG1vZGUgPSAnUDJEJ1xuICB9ID0ge30pIHtcbiAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVpbmcgY2FudmFzJywgd2lkdGgsIGhlaWdodCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodClcbiAgICBzdXBlcigoIHAgKSA9PiB7XG4gICAgICBwLnNldHVwID0gKCkgPT4geyBwLmNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0LCBwW21vZGVdKSB9XG4gIC8vICAgIHAuc2V0dXAgPSAoKSA9PiB7IHAuY3JlYXRlQ2FudmFzKCkgfVxuICAgICAgcC5kcmF3ID0gKCkgPT4geyB9XG4gICAgfSwgJ2h5ZHJhLXVpJylcbiAgICB0aGlzLndpZHRoID0gd2lkdGhcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodFxuICAgIHRoaXMubW9kZSA9IG1vZGVcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIlxuICAgIHRoaXMuY2FudmFzLnN0eWxlLnRvcCA9IFwiMHB4XCJcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5sZWZ0ID0gXCIwcHhcIlxuICAgIHRoaXMuY2FudmFzLnN0eWxlLnpJbmRleCA9IC0xXG4gICAgLy8gY29uc29sZS5sb2coJ3A1JywgdGhpcylcbiAgLy8gIHJldHVybiB0aGlzLnA1XG4gIH1cblxuICBzaG93KCkge1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLnpJbmRleCA9IC0xXG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLnpJbmRleCA9IC0xMFxuICB9XG5cbiAgLy8gcDUgY2xlYXIgZnVuY3Rpb24gbm90IGNvdmVyaW5nIGNhbnZhc1xuICBjbGVhcigpIHtcbiAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUDVcbiIsIi8qIGdsb2JhbHMgc2Vzc2lvblN0b3JhZ2UgKi9cbi8vIEV4dGVuZHMgcnRjLXBhdGNoLWJheSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIG5pY2tuYW1lcyBhbmQgcGVyc2lzdGVudCBzZXNzaW9uIHN0b3JhZ2VcblxudmFyIFBhdGNoQmF5ID0gcmVxdWlyZSgnLi9ydGMtcGF0Y2gtYmF5LmpzJylcbi8vdmFyIFBhdGNoQmF5ID0gcmVxdWlyZSgnLi8uLi8uLi8uLi8uLi9ydGMtcGF0Y2gtYmF5JylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcblxudmFyIFBCTGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXNzaW9uID0ge31cblxuICAvLyBsb29rdXAgdGFibGVzIGZvciBjb252ZXJ0aW5nIGlkIHRvIG5pY2tuYW1lXG4gIHRoaXMubmlja0Zyb21JZCA9IHt9XG4gIHRoaXMuaWRGcm9tTmljayA9IHt9XG5cbiAgdGhpcy5sb2FkRnJvbVN0b3JhZ2UoKVxufVxuLy8gaW5oZXJpdHMgZnJvbSBQYXRjaEJheSBtb2R1bGVcbmluaGVyaXRzKFBCTGl2ZSwgUGF0Y2hCYXkpXG5cblBCTGl2ZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIChzdHJlYW0sIG9wdHMpIHtcbiAgdGhpcy5zZXR0aW5ncyA9IHtcbiAgICBzZXJ2ZXI6IG9wdHMuc2VydmVyIHx8ICdodHRwczovL3BhdGNoLWJheS5nbGl0Y2gubWUvJyxcbiAgICByb29tOiBvcHRzLnJvb20gfHwgJ3BhdGNoLWJheScsXG4gICAgc3RyZWFtOiBzdHJlYW1cbiAgfVxuXG4gIHRoaXMubWFrZUdsb2JhbCA9IG9wdHMubWFrZUdsb2JhbCB8fCB0cnVlXG4gIHRoaXMuc2V0UGFnZVRpdGxlID0gb3B0cy5zZXRUaXRsZSB8fCB0cnVlXG5cbiAgaWYgKHRoaXMuc2Vzc2lvbi5pZCkgdGhpcy5zZXR0aW5ncy5pZCA9IHRoaXMuc2Vzc2lvbi5pZFxuXG4gIFBhdGNoQmF5LmNhbGwodGhpcywgdGhpcy5zZXR0aW5ncylcblxuICBpZiAodGhpcy5tYWtlR2xvYmFsKSB3aW5kb3cucGIgPSB0aGlzXG5cbiAgdGhpcy5vbigncmVhZHknLCAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLm5pY2spIHtcbiAgICAgIGlmICh0aGlzLnNlc3Npb24ubmljaykge1xuICAgICAgICB0aGlzLnNldE5hbWUodGhpcy5zZXNzaW9uLm5pY2spXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlc3Npb24uaWQgPSB0aGlzLmlkXG4gICAgICAgIHRoaXMuc2V0TmFtZSh0aGlzLnNlc3Npb24uaWQpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdjb25uZWN0ZWQgdG8gc2VydmVyICcgKyB0aGlzLnNldHRpbmdzLnNlcnZlciArICcgd2l0aCBuYW1lICcgKyB0aGlzLnNldHRpbmdzLmlkKVxuICB9KVxuICAvLyByZWNlaXZlZCBhIGJyb2FkY2FzdFxuICB0aGlzLm9uKCdicm9hZGNhc3QnLCB0aGlzLl9wcm9jZXNzQnJvYWRjYXN0LmJpbmQodGhpcykpXG4gIHRoaXMub24oJ25ldyBwZWVyJywgdGhpcy5oYW5kbGVOZXdQZWVyLmJpbmQodGhpcykpXG5cbiAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gKCkgPT4ge1xuICAgIHRoaXMuc2Vzc2lvbi5pZCA9IHdpbmRvdy5wYi5pZFxuICAgIHRoaXMuc2Vzc2lvbi5uaWNrID0gdGhpcy5uaWNrXG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgncGInLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlc3Npb24pKVxuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHRoaXMub24oJ3N0cmVhbScsIGZ1bmN0aW9uIChpZCwgc3RyZWFtKSB7XG4gICAgY29uc29sZS5sb2coJ2dvdCBzdHJlYW0hJywgaWQsIHN0cmVhbSlcbiAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJylcbiAgICBpZiAoJ3NyY09iamVjdCcgaW4gdmlkZW8pIHtcbiAgICAgIHZpZGVvLnNyY09iamVjdCA9IHN0cmVhbVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBdm9pZCB1c2luZyB0aGlzIGluIG5ldyBicm93c2VycywgYXMgaXQgaXMgZ29pbmcgYXdheS5cbiAgICAgIHZpZGVvLnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHN0cmVhbSlcbiAgICB9XG4gIC8vICB2aWRlby5zcmMgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChzdHJlYW0pXG4gICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICAvLyAgY29uc29sZS5sb2coXCJsb2FkZWQgbWV0YTIyXCIpXG4gICAgICB2aWRlby5wbGF5KClcbiAgICAgIHNlbGYudmlkZW8gPSB2aWRlb1xuICAgICAgc2VsZi5lbWl0KCdnb3QgdmlkZW8nLCBzZWxmLm5pY2tGcm9tSWRbaWRdLCB2aWRlbylcbiAgICB9KVxuICB9KVxufVxuXG5QQkxpdmUucHJvdG90eXBlLmxvYWRGcm9tU3RvcmFnZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3BiJykgIT09IG51bGwpIHtcbiAgICB0aGlzLnNlc3Npb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3BiJykpXG4gIH1cbn1cblxuUEJMaXZlLnByb3RvdHlwZS5pbml0U291cmNlID0gZnVuY3Rpb24gKG5pY2ssIGNhbGxiYWNrKSB7XG4gIHRoaXMuaW5pdENvbm5lY3Rpb25Gcm9tSWQodGhpcy5pZEZyb21OaWNrW25pY2tdLCBjYWxsYmFjaylcbi8vICB0aGlzLnBlZXJzW3RoaXMuaWRGcm9tTmlja1tuaWNrXV0uc3RyZWFtQ2FsbGJhY2sgPSBjYWxsYmFja1xufVxuXG4vLyBkZWZhdWx0IG5pY2tuYW1lIGlzIGp1c3QgcGVlciBpZC5cbi8vIHRvIGRvOiBzYXZlIG5pY2tuYW1lIGluZm9ybWF0aW9uIGJldHdlZW4gc2Vzc2lvbnNcblBCTGl2ZS5wcm90b3R5cGUuaGFuZGxlTmV3UGVlciA9IGZ1bmN0aW9uIChwZWVyKSB7XG4gIC8vIGNvbnNvbGUubG9nKFwibmV3IHBlZXJcIiwgcGVlcilcbiAgdGhpcy5uaWNrRnJvbUlkW3BlZXJdID0gcGVlclxuICB0aGlzLmlkRnJvbU5pY2tbcGVlcl0gPSBwZWVyXG4gIC8vIGNvbnNvbGUubG9nKFwiVEhJUyBJUyBUSEUgUEVFUlwiLCBwZWVyKVxuICAvLyB0byBkbzogb25seSBzZW5kIHRvIG5ldyBwZWVyLCBub3QgdG8gYWxsXG4gIGlmICh0aGlzLm5pY2spIHtcbiAgICB0aGlzLmJyb2FkY2FzdCh7XG4gICAgICB0eXBlOiAndXBkYXRlLW5pY2snLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBuaWNrOiB0aGlzLm5pY2tcbiAgICB9KVxuICB9XG59XG5cblBCTGl2ZS5wcm90b3R5cGUubGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGwgPSBPYmplY3Qua2V5cyh0aGlzLmlkRnJvbU5pY2spXG4gIGNvbnNvbGUubG9nKGwpXG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmlkRnJvbU5pY2spXG59XG5cbi8vIGNob29zZSBhbiBpZGVudGlmeWluZyBuYW1lXG5QQkxpdmUucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbiAobmljaykge1xuICB0aGlzLmJyb2FkY2FzdCh7XG4gICAgdHlwZTogJ3VwZGF0ZS1uaWNrJyxcbiAgICBpZDogdGhpcy5pZCxcbiAgICBuaWNrOiBuaWNrLFxuICAgIHByZXZpb3VzOiB0aGlzLm5pY2tcbiAgfSlcbiAgdGhpcy5uaWNrID0gbmlja1xuICBpZiAodGhpcy5zZXRQYWdlVGl0bGUpIGRvY3VtZW50LnRpdGxlID0gbmlja1xufVxuXG5QQkxpdmUucHJvdG90eXBlLl9wcm9jZXNzQnJvYWRjYXN0ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgaWYgKGRhdGEudHlwZSA9PT0gJ3VwZGF0ZS1uaWNrJykge1xuICAgIGlmIChkYXRhLnByZXZpb3VzICE9PSBkYXRhLm5pY2spIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmlkRnJvbU5pY2tbdGhpcy5uaWNrRnJvbUlkW2RhdGEuaWRdXVxuICAgICAgdGhpcy5uaWNrRnJvbUlkW2RhdGEuaWRdID0gZGF0YS5uaWNrXG4gICAgICB0aGlzLmlkRnJvbU5pY2tbZGF0YS5uaWNrXSA9IGRhdGEuaWRcbiAgICAgIGlmIChkYXRhLnByZXZpb3VzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGRhdGEucHJldmlvdXMgKyAnIGNoYW5nZWQgdG8gJyArIGRhdGEubmljaylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdjb25uZWN0ZWQgdG8gJyArIGRhdGEubmljaylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8vIFBCRXh0ZW5kZWQucHJvdG90eXBlLlxubW9kdWxlLmV4cG9ydHMgPSBQQkxpdmVcbiIsImNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vbG9nLmpzJykubG9nXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBldmFsOiAoYXJnLCBjYWxsYmFjaykgPT4ge1xuICAgIHZhciBzZWxmID0gdGhpc1xuICAgIHZhciBqc1N0cmluZyA9IGFyZ1xuICAgIHZhciBpc0Vycm9yID0gZmFsc2VcbiAgICB0cnkge1xuICAgICAgZXZhbChqc1N0cmluZylcbiAgICAgIC8vIGxvZyhqc1N0cmluZylcbiAgICAgIGxvZygnJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpc0Vycm9yID0gdHJ1ZVxuICAgICAgY29uc29sZS5sb2coXCJsb2dnaW5nXCIsIGUpXG4gICAgICAvLyB2YXIgZXJyID0gZS5jb25zdHJ1Y3RvcignRXJyb3IgaW4gRXZhbGVkIFNjcmlwdDogJyArIGUubWVzc2FnZSk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhlcnIubGluZU51bWJlcilcbiAgICAgIGxvZyhlLm1lc3NhZ2UsIFwibG9nLWVycm9yXCIpXG4gICAgICAvL2NvbnNvbGUubG9nKCdFUlJPUicsIEpTT04uc3RyaW5naWZ5KGUpKVxuICAgIH1cbiAgLy8gIGNvbnNvbGUubG9nKCdjYWxsYmFjayBpcycsIGNhbGxiYWNrKVxuICAgIGlmKGNhbGxiYWNrKSBjYWxsYmFjayhqc1N0cmluZywgaXNFcnJvcilcbiAgfVxufVxuIiwiLy8gTW9kdWxlIGZvciBoYW5kbGluZyBjb25uZWN0aW9ucyB0byBtdWx0aXBsZSBwZWVycy5cblxuXG52YXIgaW8gPSByZXF1aXJlKCdzb2NrZXQuaW8tY2xpZW50JylcbnZhciBTaW1wbGVQZWVyID0gcmVxdWlyZSgnc2ltcGxlLXBlZXInKVxudmFyIGV4dGVuZCA9IE9iamVjdC5hc3NpZ25cbnZhciBldmVudHMgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXJcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbmNvbnN0IHNob3J0aWQgPSByZXF1aXJlKCdzaG9ydGlkJylcblxudmFyIFBhdGNoQmF5ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbi8vIGNvbm5lY3QgdG8gd2Vic29ja2V0IHNpZ25hbGxpbmcgc2VydmVyLiBUbyBETzogZXJyb3IgdmFsaWRhdGlvblxuICB0aGlzLnNpZ25hbGxlciA9IGlvKG9wdGlvbnMuc2VydmVyKVxuXG4gIC8vYXNzaWduIHVuaXF1ZSBpZCB0byB0aGlzIHBlZXIsIG9yIHVzZSBpZCBwYXNzZWQgaW5cblxuICB0aGlzLmlkID0gb3B0aW9ucy5pZCB8fCBzaG9ydGlkLmdlbmVyYXRlKClcblxuICB0aGlzLnN0cmVhbSA9IG9wdGlvbnMuc3RyZWFtIHx8IG51bGxcblxuICAvL29wdGlvbnMgdG8gYmUgc2VudCB0byBzaW1wbGUgcGVlclxuICB0aGlzLl9wZWVyT3B0aW9ucyA9IG9wdGlvbnMucGVlck9wdGlvbnMgfHwge31cbiAgdGhpcy5fcm9vbSA9IG9wdGlvbnMucm9vbVxuXG5cbiAgdGhpcy5zZXR0aW5nc1snc2hhcmVNZWRpYVdoZW5SZXF1ZXN0ZWQnXSA9IHRydWVcbiAgdGhpcy5zZXR0aW5nc1snc2hhcmVNZWRpYVdoZW5Jbml0aWF0aW5nJ10gPSBmYWxzZVxuICB0aGlzLnNldHRpbmdzWydyZXF1ZXN0TWVkaWFXaGVuSW5pdGlhdGluZyddID0gdHJ1ZVxuICB0aGlzLnNldHRpbmdzWydhdXRvY29ubmVjdCddID0gZmFsc2VcblxuICAvL29iamVjdCBjb250YWluaW5nIEFMTCBwZWVycyBpbiByb29tXG4gIHRoaXMucGVlcnMgPSB7fVxuXG4gIC8vb2JqZWN0IGNvbnRhaW5pbmcgcGVlcnMgY29ubmVjdGVkIHZpYSB3ZWJydGNcbiAgdGhpcy5ydGNQZWVycyA9IHt9XG5cbiAgLy8gSGFuZGxlIGV2ZW50cyBmcm9tIHNpZ25hbGxpbmcgc2VydmVyXG4gIHRoaXMuc2lnbmFsbGVyLm9uKCdyZWFkeScsIHRoaXMuX3JlYWR5Rm9yU2lnbmFsbGluZy5iaW5kKHRoaXMpKVxuLy8gIHRoaXMuc2lnbmFsbGVyLm9uKCdwZWVycycsIClcbi8vICB0aGlzLnNpZ25hbGxlci5vbignc2lnbmFsJywgdGhpcy5faGFuZGxlU2lnbmFsLmJpbmQodGhpcykpXG4gIHRoaXMuc2lnbmFsbGVyLm9uKCdtZXNzYWdlJywgdGhpcy5faGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMpKVxuICAvLyBSZWNlaXZlZCBtZXNzYWdlIHZpYSB3ZWJzb2NrZXRzIHRvIGFsbCBwZWVycyBpbiByb29tXG4gIHRoaXMuc2lnbmFsbGVyLm9uKCdicm9hZGNhc3QnLCB0aGlzLl9yZWNlaXZlZEJyb2FkY2FzdC5iaW5kKHRoaXMpKVxuXG4gIC8vIGVtaXQgJ2pvaW4nIGV2ZW50IHRvIHNpZ25hbGxpbmcgc2VydmVyXG4gIHRoaXMuc2lnbmFsbGVyLmVtaXQoJ2pvaW4nLCB0aGlzLl9yb29tLCB7dXVpZDogdGhpcy5pZH0pXG5cbiAgdGhpcy5zaWduYWxsZXIub24oJ25ldyBwZWVyJywgdGhpcy5fbmV3UGVlci5iaW5kKHRoaXMpKVxufVxuLy8gaW5oZXJpdHMgZnJvbSBldmVudHMgbW9kdWxlIGluIG9yZGVyIHRvIHRyaWdnZXIgZXZlbnRzXG5pbmhlcml0cyhQYXRjaEJheSwgZXZlbnRzKVxuXG4vLyBzZW5kIGRhdGEgdG8gYWxsIGNvbm5lY3RlZCBwZWVycyB2aWEgZGF0YSBjaGFubmVsc1xuUGF0Y2hCYXkucHJvdG90eXBlLnNlbmRUb0FsbCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIE9iamVjdC5rZXlzKHRoaXMucnRjUGVlcnMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgdGhpcy5ydGNQZWVyc1tpZF0uc2VuZChkYXRhKVxuICB9LCB0aGlzKVxufVxuXG4vLyBzZW5kcyB0byBwZWVyIHNwZWNpZmllZCBiXG5QYXRjaEJheS5wcm90b3R5cGUuc2VuZFRvUGVlciA9IGZ1bmN0aW9uIChwZWVySWQsIGRhdGEpIHtcbiAgaWYgKHBlZXJJZCBpbiB0aGlzLnJ0Y1BlZXJzKSB7XG4gICAgdGhpcy5ydGNQZWVyc1twZWVySWRdLnNlbmQoZGF0YSlcbiAgfVxufVxuXG5QYXRjaEJheS5wcm90b3R5cGUucmVpbml0QWxsID0gZnVuY3Rpb24oKXtcbiAgT2JqZWN0LmtleXModGhpcy5ydGNQZWVycykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICB0aGlzLnJlaW5pdFBlZXIoaWQpXG4gIH0uYmluZCh0aGlzKSlcbi8vICB0aGlzLl9jb25uZWN0VG9QZWVycy5iaW5kKHRoaXMpXG59XG5cblBhdGNoQmF5LnByb3RvdHlwZS5pbml0UnRjUGVlciA9IGZ1bmN0aW9uKGlkLCBvcHRzKSB7XG4gIHRoaXMuZW1pdCgnbmV3IHBlZXInLCB7aWQ6IGlkfSlcbiAgdmFyIG5ld09wdGlvbnMgPSBvcHRzXG4gIGNvbnNvbGUubG9nKClcbiAgaWYodGhpcy5pY2VTZXJ2ZXJzKSB7XG4gICAgb3B0c1snY29uZmlnJ10gPSB7XG4gICAgICBpY2VTZXJ2ZXJzOiB0aGlzLmljZVNlcnZlcnNcbiAgICB9XG4gIH1cblxuICBpZihvcHRzLmluaXRpYXRvciA9PT0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLnN0cmVhbSAhPSBudWxsKSB7XG4gICAgICBpZih0aGlzLnNldHRpbmdzLnNoYXJlTWVkaWFXaGVuSW5pdGlhdGluZyA9PT0gdHJ1ZSl7XG4gICAgICAgIG5ld09wdGlvbnMuc3RyZWFtID0gdGhpcy5zdHJlYW1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYodGhpcy5zZXR0aW5ncy5yZXF1ZXN0TWVkaWFXaGVuSW5pdGlhdGluZyA9PT0gdHJ1ZSl7XG4gICAgICBuZXdPcHRpb25zLm9mZmVyQ29uc3RyYWludHMgPSB7XG4gICAgICAgIG9mZmVyVG9SZWNlaXZlVmlkZW86IHRydWUsXG4gICAgICAgIG9mZmVyVG9SZWNlaXZlQXVkaW86IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYodGhpcy5zZXR0aW5ncy5zaGFyZU1lZGlhV2hlblJlcXVlc3RlZCA9PT0gdHJ1ZSl7XG4gICAgICBpZiAodGhpcy5zdHJlYW0gIT0gbnVsbCkge1xuICAgICAgICBuZXdPcHRpb25zLnN0cmVhbSA9IHRoaXMuc3RyZWFtXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciBvcHRpb25zID0gZXh0ZW5kKHRoaXMuX3BlZXJPcHRpb25zLCBuZXdPcHRpb25zKVxuY29uc29sZS5sb2coXCJPUFRJT05TXCIsIG9wdGlvbnMpXG4gIHRoaXMucnRjUGVlcnNbaWRdID0gbmV3IFNpbXBsZVBlZXIob3B0aW9ucylcbiAgdGhpcy5fYXR0YWNoUGVlckV2ZW50cyh0aGlzLnJ0Y1BlZXJzW2lkXSwgaWQpXG59XG5cblBhdGNoQmF5LnByb3RvdHlwZS5yZWluaXRSdGNDb25uZWN0aW9uID0gZnVuY3Rpb24oaWQsIG9wdHMpe1xuICAvLyBCZWNhdXNlIHJlbmVnb3RpYXRpb24gaXMgbm90IGltcGxlbWVuZXRlZCBpbiBTaW1wbGVQZWVyLCByZWluaXRpYXRlIGNvbm5lY3Rpb24gd2hlbiBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkXG4gIHRoaXMucnRjUGVlcnNbaWRdLl9kZXN0cm95KG51bGwsIGZ1bmN0aW9uKGUpe1xuICAgICAgdGhpcy5pbml0UnRjUGVlcihpZCwge1xuICAgICAgICBzdHJlYW06IHRoaXMuc3RyZWFtLFxuICAgICAgICBpbml0aWF0b3I6IHRydWVcbiAgICAgIH0pXG4gIH0uYmluZCh0aGlzKSlcbn1cbi8vIC8vbmV3IHBlZXIgY29ubmVjdGVkIHRvIHNpZ25hbGxpbmcgc2VydmVyXG5QYXRjaEJheS5wcm90b3R5cGUuX25ld1BlZXIgPSBmdW5jdGlvbiAocGVlcil7XG4gICAgLy8gdGhpcy5jb25uZWN0ZWRJZHMucHVzaChwZWVyKVxuXG5cbiAgICAvLyBDb25maWd1cmF0aW9uIGZvciBzcGVjaWZpZWQgcGVlci5cbiAgICAvLyBJbmRpdmlkdWFsIGNvbmZpZ3VyYXRpb24gY29udHJvbHMgd2hldGhlciB3aWxsIHJlY2VpdmUgbWVkaWEgZnJvbVxuICAgIC8vIGFuZC9vciBzZW5kIG1lZGlhIHRvIGEgc3BlY2lmaWMgcGVlci5cblxuICAgIHRoaXMucGVlcnNbcGVlcl0gPSB7XG4gICAgICBydGNQZWVyOiBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5lbWl0KCduZXcgcGVlcicsIHBlZXIpXG4gICAgLy8gdGhpcy5lbWl0KCd1cGRhdGVkIHBlZXIgbGlzdCcsIHRoaXMuY29ubmVjdGVkSWRzKVxufVxuLy8gLy8gT25jZSB0aGUgbmV3IHBlZXIgcmVjZWl2ZXMgYSBsaXN0IG9mIGNvbm5lY3RlZCBwZWVycyBmcm9tIHRoZSBzZXJ2ZXIsXG4vLyAvLyBjcmVhdGVzIG5ldyBzaW1wbGUgcGVlciBvYmplY3QgZm9yIGVhY2ggY29ubmVjdGVkIHBlZXIuXG5QYXRjaEJheS5wcm90b3R5cGUuX3JlYWR5Rm9yU2lnbmFsbGluZyA9IGZ1bmN0aW9uICh7IHBlZXJzLCBzZXJ2ZXJzIH0pIHtcbi8vICBjb25zb2xlLmxvZyhcInJlY2VpdmVkIHBlZXIgbGlzdFwiLCBfdCwgdGhpcy5wZWVycylcblxuICBwZWVycy5mb3JFYWNoKChwZWVyKSA9PiB7XG4gICAgdGhpcy5fbmV3UGVlcihwZWVyKVxuICB9KVxuXG4gIC8vIGlmIHJlY2VpdmVkIGljZSBhbmQgdHVybiBzZXJ2ZXIgaW5mb3JtYXRpb24gZnJvbSBzaWduYWxsaW5nIHNlcnZlciwgdXNlIGluIGVzdGFibGlzaGluZ1xuICBpZihzZXJ2ZXJzKSB7XG4gICAgdGhpcy5pY2VTZXJ2ZXJzID0gc2VydmVyc1xuICB9XG4vLyAgdGhpcy5wZWVycyA9IHBlZXJzXG4gIHRoaXMuZW1pdCgncmVhZHknKVxufVxuXG4vLyBJbml0IGNvbm5lY3Rpb24gdG8gUkVDRUlWRSB2aWRlb1xuUGF0Y2hCYXkucHJvdG90eXBlLmluaXRDb25uZWN0aW9uRnJvbUlkID0gZnVuY3Rpb24oaWQsIGNhbGxiYWNrKXtcbi8vICBjb25zb2xlLmxvZyhcImluaXRpYW5pbmcgY29ubmVjdGlvblwiKVxuICBpZihpZCBpbiB0aGlzLnJ0Y1BlZXJzKXtcbiAgICBjb25zb2xlLmxvZyhcIkFscmVhZHkgY29ubmVjdGVkIHRvLi5cIiwgaWQsIHRoaXMucnRjUGVlcnMpXG4gICAgLy9pZiB0aGlzIHBlZXIgd2FzIG9yaWdpbmFsbHkgb25seSBzZW5kaW5nIGEgc3RyZWFtIChub3QgcmVjZWl2aW5nKSwgcmVjcmVhdGUgY29ubmVjdGluZyBidXQgdGhpcyB0aW1lIHR3by13YXlcbiAgICBpZih0aGlzLnJ0Y1BlZXJzW2lkXS5pbml0aWF0b3I9PT1mYWxzZSl7XG4gICAgICB0aGlzLnJlaW5pdFJ0Y0Nvbm5lY3Rpb24oaWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vYWxyZWFkeSBjb25uZWN0ZWQsIGRvIG5vdGhpbmdcblxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLmluaXRSdGNQZWVyKGlkLCB7XG4gICAgICBpbml0aWF0b3I6IHRydWVcbiAgICB9KVxuICB9XG59XG5cblxuLy8gcmVjZWl2ZSBzaWduYWwgZnJvbSBzaWduYWxsaW5nIHNlcnZlciwgZm9yd2FyZCB0byBzaW1wbGUtcGVlclxuUGF0Y2hCYXkucHJvdG90eXBlLl9oYW5kbGVNZXNzYWdlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgLy8gaWYgdGhlcmUgaXMgY3VycmVudGx5IG5vIHBlZXIgb2JqZWN0IGZvciBhIHBlZXIgaWQsIHRoYXQgcGVlciBpcyBpbml0aWF0aW5nIGEgbmV3IGNvbm5lY3Rpb24uXG5cbiAgaWYgKGRhdGEudHlwZSA9PT0gJ3NpZ25hbCcpe1xuICAgIHRoaXMuX2hhbmRsZVNpZ25hbChkYXRhKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGRhdGEpXG4gIH1cbn1cbi8vIHJlY2VpdmUgc2lnbmFsIGZyb20gc2lnbmFsbGluZyBzZXJ2ZXIsIGZvcndhcmQgdG8gc2ltcGxlLXBlZXJcblBhdGNoQmF5LnByb3RvdHlwZS5faGFuZGxlU2lnbmFsID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgLy8gaWYgdGhlcmUgaXMgY3VycmVudGx5IG5vIHBlZXIgb2JqZWN0IGZvciBhIHBlZXIgaWQsIHRoYXQgcGVlciBpcyBpbml0aWF0aW5nIGEgbmV3IGNvbm5lY3Rpb24uXG4gIGlmICghdGhpcy5ydGNQZWVyc1tkYXRhLmlkXSkge1xuICAgIC8vIHRoaXMuZW1pdCgnbmV3IHBlZXInLCBkYXRhKVxuICAgIC8vIHZhciBvcHRpb25zID0gZXh0ZW5kKHtzdHJlYW06IHRoaXMuc3RyZWFtfSwgdGhpcy5fcGVlck9wdGlvbnMpXG4gICAgLy8gdGhpcy5ydGNQZWVyc1tkYXRhLmlkXSA9IG5ldyBTaW1wbGVQZWVyKG9wdGlvbnMpXG4gICAgLy8gdGhpcy5fYXR0YWNoUGVlckV2ZW50cyh0aGlzLnJ0Y1BlZXJzW2RhdGEuaWRdLCBkYXRhLmlkKVxuXG4gICAgdGhpcy5pbml0UnRjUGVlcihkYXRhLmlkLCB7aW5pdGlhdG9yOiBmYWxzZX0pXG4gIH1cbiAgdGhpcy5ydGNQZWVyc1tkYXRhLmlkXS5zaWduYWwoZGF0YS5tZXNzYWdlKVxufVxuLy8gc2VuZFRvQWxsIHNlbmQgdGhyb3VnaCBydGMgY29ubmVjdGlvbnMsIHdoZXJlYXMgYnJvYWRjYXN0XG4vLyBzZW5kIHRocm91Z2ggdGhlIHNpZ25hbGxpbmcgc2VydmVyLiBVc2VmdWwgaW4gY2FzZXMgd2hlcmVcbi8vIG5vdCBhbGwgcGVlcnMgYXJlIGNvbm5lY3RlZCB2aWEgd2VicnRjIHdpdGggb3RoZXIgcGVlcnNcblBhdGNoQmF5LnByb3RvdHlwZS5fcmVjZWl2ZWRCcm9hZGNhc3QgPSBmdW5jdGlvbihkYXRhKSB7XG4gIC8vY29uc29sZS5sb2coXCJSRUNFSVZFRCBCUk9BRENBU1RcIiwgZGF0YSlcbiAgdGhpcy5lbWl0KCdicm9hZGNhc3QnLCBkYXRhKVxufVxuXG4vL3NlbmRzIHZpYSBzaWduYWxsaW5nIHNlcnZlclxuUGF0Y2hCYXkucHJvdG90eXBlLmJyb2FkY2FzdCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHRoaXMuc2lnbmFsbGVyLmVtaXQoJ2Jyb2FkY2FzdCcsIGRhdGEpXG59XG4vLyBoYW5kbGUgZXZlbnRzIGZvciBlYWNoIGNvbm5lY3RlZCBwZWVyXG5QYXRjaEJheS5wcm90b3R5cGUuX2F0dGFjaFBlZXJFdmVudHMgPSBmdW5jdGlvbiAocCwgX2lkKSB7XG4gIHAub24oJ3NpZ25hbCcsIGZ1bmN0aW9uIChpZCwgc2lnbmFsKSB7XG4gIC8vICBjb25zb2xlLmxvZygnc2lnbmFsJywgaWQsIHNpZ25hbClcbiAgICAvLyAgY29uc29sZS5sb2coXCJwZWVyIHNpZ25hbCBzZW5kaW5nIG92ZXIgc29ja2V0c1wiLCBpZCwgc2lnbmFsKVxuICAvLyAgdGhpcy5zaWduYWxsZXIuZW1pdCgnc2lnbmFsJywge2lkOiBpZCwgc2lnbmFsOiBzaWduYWx9KVxuICAgIHRoaXMuc2lnbmFsbGVyLmVtaXQoJ21lc3NhZ2UnLCB7aWQ6IGlkLCBtZXNzYWdlOiBzaWduYWwsIHR5cGU6ICdzaWduYWwnfSlcbiAgfS5iaW5kKHRoaXMsIF9pZCkpXG5cbiAgcC5vbignc3RyZWFtJywgZnVuY3Rpb24gKGlkLCBzdHJlYW0pIHtcbiAgICB0aGlzLnJ0Y1BlZXJzW2lkXS5zdHJlYW0gPSBzdHJlYW1cbiAgLy8gIGNvbnNvbGUubG9nKCdFOiBzdHJlYW0nLCBpZCwgc3RyZWFtKVxuICAgIC8vICBjb25zb2xlLmxvZyhcInJlY2VpdmVkIGEgc3RyZWFtXCIsIHN0cmVhbSlcbiAgICB0aGlzLmVtaXQoJ3N0cmVhbScsIGlkLCBzdHJlYW0pXG4gIH0uYmluZCh0aGlzLCBfaWQpKVxuXG4gIHAub24oJ2Nvbm5lY3QnLCBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gIGNvbnNvbGUubG9nKFwiY29ubmVjdGVkIHRvIFwiLCBpZClcbiAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBpZClcbiAgfS5iaW5kKHRoaXMsIF9pZCkpXG5cbiAgcC5vbignZGF0YScsIGZ1bmN0aW9uIChpZCwgZGF0YSkge1xuLy8gICAgY29uc29sZS5sb2coJ2RhdGEnLCBpZClcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCB7aWQ6IGlkLCBkYXRhOiBKU09OLnBhcnNlKGRhdGEpfSlcbiAgfS5iaW5kKHRoaXMsIF9pZCkpXG5cbiAgcC5vbignY2xvc2UnLCBmdW5jdGlvbiAoaWQpIHtcbiAgICAvL2NvbnNvbGUubG9nKCdDTE9TRUQnKVxuICAgIGRlbGV0ZSAodGhpcy5ydGNQZWVyc1tpZF0pXG4gICAgdGhpcy5lbWl0KCdjbG9zZScsIGlkKVxuICB9LmJpbmQodGhpcywgX2lkKSlcblxuICBwLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGUpe1xuICAgIGNvbnNvbGUubG9nKFwic2ltcGxlIHBlZXIgZXJyb3JcIiwgZSlcbiAgfSlcbn1cblxuUGF0Y2hCYXkucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICBPYmplY3QudmFsdWVzKHRoaXMucnRjUGVlcnMpLmZvckVhY2goIGZ1bmN0aW9uIChwZWVyKSB7XG4gICAgcGVlci5kZXN0cm95KClcbiAgfSlcbiAgdGhpcy5zaWduYWxsZXIuY2xvc2UoKVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gUGF0Y2hCYXlcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcblx0KGZhY3RvcnkoKGdsb2JhbC5hY29ybiA9IHt9KSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4vLyBSZXNlcnZlZCB3b3JkIGxpc3RzIGZvciB2YXJpb3VzIGRpYWxlY3RzIG9mIHRoZSBsYW5ndWFnZVxuXG52YXIgcmVzZXJ2ZWRXb3JkcyA9IHtcbiAgMzogXCJhYnN0cmFjdCBib29sZWFuIGJ5dGUgY2hhciBjbGFzcyBkb3VibGUgZW51bSBleHBvcnQgZXh0ZW5kcyBmaW5hbCBmbG9hdCBnb3RvIGltcGxlbWVudHMgaW1wb3J0IGludCBpbnRlcmZhY2UgbG9uZyBuYXRpdmUgcGFja2FnZSBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgc2hvcnQgc3RhdGljIHN1cGVyIHN5bmNocm9uaXplZCB0aHJvd3MgdHJhbnNpZW50IHZvbGF0aWxlXCIsXG4gIDU6IFwiY2xhc3MgZW51bSBleHRlbmRzIHN1cGVyIGNvbnN0IGV4cG9ydCBpbXBvcnRcIixcbiAgNjogXCJlbnVtXCIsXG4gIHN0cmljdDogXCJpbXBsZW1lbnRzIGludGVyZmFjZSBsZXQgcGFja2FnZSBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgc3RhdGljIHlpZWxkXCIsXG4gIHN0cmljdEJpbmQ6IFwiZXZhbCBhcmd1bWVudHNcIlxufTtcblxuLy8gQW5kIHRoZSBrZXl3b3Jkc1xuXG52YXIgZWNtYTVBbmRMZXNzS2V5d29yZHMgPSBcImJyZWFrIGNhc2UgY2F0Y2ggY29udGludWUgZGVidWdnZXIgZGVmYXVsdCBkbyBlbHNlIGZpbmFsbHkgZm9yIGZ1bmN0aW9uIGlmIHJldHVybiBzd2l0Y2ggdGhyb3cgdHJ5IHZhciB3aGlsZSB3aXRoIG51bGwgdHJ1ZSBmYWxzZSBpbnN0YW5jZW9mIHR5cGVvZiB2b2lkIGRlbGV0ZSBuZXcgaW4gdGhpc1wiO1xuXG52YXIga2V5d29yZHMgPSB7XG4gIDU6IGVjbWE1QW5kTGVzc0tleXdvcmRzLFxuICA2OiBlY21hNUFuZExlc3NLZXl3b3JkcyArIFwiIGNvbnN0IGNsYXNzIGV4dGVuZHMgZXhwb3J0IGltcG9ydCBzdXBlclwiXG59O1xuXG52YXIga2V5d29yZFJlbGF0aW9uYWxPcGVyYXRvciA9IC9eaW4oc3RhbmNlb2YpPyQvO1xuXG4vLyAjIyBDaGFyYWN0ZXIgY2F0ZWdvcmllc1xuXG4vLyBCaWcgdWdseSByZWd1bGFyIGV4cHJlc3Npb25zIHRoYXQgbWF0Y2ggY2hhcmFjdGVycyBpbiB0aGVcbi8vIHdoaXRlc3BhY2UsIGlkZW50aWZpZXIsIGFuZCBpZGVudGlmaWVyLXN0YXJ0IGNhdGVnb3JpZXMuIFRoZXNlXG4vLyBhcmUgb25seSBhcHBsaWVkIHdoZW4gYSBjaGFyYWN0ZXIgaXMgZm91bmQgdG8gYWN0dWFsbHkgaGF2ZSBhXG4vLyBjb2RlIHBvaW50IGFib3ZlIDEyOC5cbi8vIEdlbmVyYXRlZCBieSBgYmluL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNgLlxuXG52YXIgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyA9IFwiXFx4YWFcXHhiNVxceGJhXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyYzFcXHUwMmM2LVxcdTAyZDFcXHUwMmUwLVxcdTAyZTRcXHUwMmVjXFx1MDJlZVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3YS1cXHUwMzdkXFx1MDM3ZlxcdTAzODZcXHUwMzg4LVxcdTAzOGFcXHUwMzhjXFx1MDM4ZS1cXHUwM2ExXFx1MDNhMy1cXHUwM2Y1XFx1MDNmNy1cXHUwNDgxXFx1MDQ4YS1cXHUwNTJmXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjAtXFx1MDU4OFxcdTA1ZDAtXFx1MDVlYVxcdTA1ZWYtXFx1MDVmMlxcdTA2MjAtXFx1MDY0YVxcdTA2NmVcXHUwNjZmXFx1MDY3MS1cXHUwNmQzXFx1MDZkNVxcdTA2ZTVcXHUwNmU2XFx1MDZlZVxcdTA2ZWZcXHUwNmZhLVxcdTA2ZmNcXHUwNmZmXFx1MDcxMFxcdTA3MTItXFx1MDcyZlxcdTA3NGQtXFx1MDdhNVxcdTA3YjFcXHUwN2NhLVxcdTA3ZWFcXHUwN2Y0XFx1MDdmNVxcdTA3ZmFcXHUwODAwLVxcdTA4MTVcXHUwODFhXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwODYwLVxcdTA4NmFcXHUwOGEwLVxcdTA4YjRcXHUwOGI2LVxcdTA4YmRcXHUwOTA0LVxcdTA5MzlcXHUwOTNkXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Y1xcdTA5OGZcXHUwOTkwXFx1MDk5My1cXHUwOWE4XFx1MDlhYS1cXHUwOWIwXFx1MDliMlxcdTA5YjYtXFx1MDliOVxcdTA5YmRcXHUwOWNlXFx1MDlkY1xcdTA5ZGRcXHUwOWRmLVxcdTA5ZTFcXHUwOWYwXFx1MDlmMVxcdTA5ZmNcXHUwYTA1LVxcdTBhMGFcXHUwYTBmXFx1MGExMFxcdTBhMTMtXFx1MGEyOFxcdTBhMmEtXFx1MGEzMFxcdTBhMzJcXHUwYTMzXFx1MGEzNVxcdTBhMzZcXHUwYTM4XFx1MGEzOVxcdTBhNTktXFx1MGE1Y1xcdTBhNWVcXHUwYTcyLVxcdTBhNzRcXHUwYTg1LVxcdTBhOGRcXHUwYThmLVxcdTBhOTFcXHUwYTkzLVxcdTBhYThcXHUwYWFhLVxcdTBhYjBcXHUwYWIyXFx1MGFiM1xcdTBhYjUtXFx1MGFiOVxcdTBhYmRcXHUwYWQwXFx1MGFlMFxcdTBhZTFcXHUwYWY5XFx1MGIwNS1cXHUwYjBjXFx1MGIwZlxcdTBiMTBcXHUwYjEzLVxcdTBiMjhcXHUwYjJhLVxcdTBiMzBcXHUwYjMyXFx1MGIzM1xcdTBiMzUtXFx1MGIzOVxcdTBiM2RcXHUwYjVjXFx1MGI1ZFxcdTBiNWYtXFx1MGI2MVxcdTBiNzFcXHUwYjgzXFx1MGI4NS1cXHUwYjhhXFx1MGI4ZS1cXHUwYjkwXFx1MGI5Mi1cXHUwYjk1XFx1MGI5OVxcdTBiOWFcXHUwYjljXFx1MGI5ZVxcdTBiOWZcXHUwYmEzXFx1MGJhNFxcdTBiYTgtXFx1MGJhYVxcdTBiYWUtXFx1MGJiOVxcdTBiZDBcXHUwYzA1LVxcdTBjMGNcXHUwYzBlLVxcdTBjMTBcXHUwYzEyLVxcdTBjMjhcXHUwYzJhLVxcdTBjMzlcXHUwYzNkXFx1MGM1OC1cXHUwYzVhXFx1MGM2MFxcdTBjNjFcXHUwYzgwXFx1MGM4NS1cXHUwYzhjXFx1MGM4ZS1cXHUwYzkwXFx1MGM5Mi1cXHUwY2E4XFx1MGNhYS1cXHUwY2IzXFx1MGNiNS1cXHUwY2I5XFx1MGNiZFxcdTBjZGVcXHUwY2UwXFx1MGNlMVxcdTBjZjFcXHUwY2YyXFx1MGQwNS1cXHUwZDBjXFx1MGQwZS1cXHUwZDEwXFx1MGQxMi1cXHUwZDNhXFx1MGQzZFxcdTBkNGVcXHUwZDU0LVxcdTBkNTZcXHUwZDVmLVxcdTBkNjFcXHUwZDdhLVxcdTBkN2ZcXHUwZDg1LVxcdTBkOTZcXHUwZDlhLVxcdTBkYjFcXHUwZGIzLVxcdTBkYmJcXHUwZGJkXFx1MGRjMC1cXHUwZGM2XFx1MGUwMS1cXHUwZTMwXFx1MGUzMlxcdTBlMzNcXHUwZTQwLVxcdTBlNDZcXHUwZTgxXFx1MGU4MlxcdTBlODRcXHUwZTg3XFx1MGU4OFxcdTBlOGFcXHUwZThkXFx1MGU5NC1cXHUwZTk3XFx1MGU5OS1cXHUwZTlmXFx1MGVhMS1cXHUwZWEzXFx1MGVhNVxcdTBlYTdcXHUwZWFhXFx1MGVhYlxcdTBlYWQtXFx1MGViMFxcdTBlYjJcXHUwZWIzXFx1MGViZFxcdTBlYzAtXFx1MGVjNFxcdTBlYzZcXHUwZWRjLVxcdTBlZGZcXHUwZjAwXFx1MGY0MC1cXHUwZjQ3XFx1MGY0OS1cXHUwZjZjXFx1MGY4OC1cXHUwZjhjXFx1MTAwMC1cXHUxMDJhXFx1MTAzZlxcdTEwNTAtXFx1MTA1NVxcdTEwNWEtXFx1MTA1ZFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNmUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOGVcXHUxMGEwLVxcdTEwYzVcXHUxMGM3XFx1MTBjZFxcdTEwZDAtXFx1MTBmYVxcdTEwZmMtXFx1MTI0OFxcdTEyNGEtXFx1MTI0ZFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVhLVxcdTEyNWRcXHUxMjYwLVxcdTEyODhcXHUxMjhhLVxcdTEyOGRcXHUxMjkwLVxcdTEyYjBcXHUxMmIyLVxcdTEyYjVcXHUxMmI4LVxcdTEyYmVcXHUxMmMwXFx1MTJjMi1cXHUxMmM1XFx1MTJjOC1cXHUxMmQ2XFx1MTJkOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVhXFx1MTM4MC1cXHUxMzhmXFx1MTNhMC1cXHUxM2Y1XFx1MTNmOC1cXHUxM2ZkXFx1MTQwMS1cXHUxNjZjXFx1MTY2Zi1cXHUxNjdmXFx1MTY4MS1cXHUxNjlhXFx1MTZhMC1cXHUxNmVhXFx1MTZlZS1cXHUxNmY4XFx1MTcwMC1cXHUxNzBjXFx1MTcwZS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZjXFx1MTc2ZS1cXHUxNzcwXFx1MTc4MC1cXHUxN2IzXFx1MTdkN1xcdTE3ZGNcXHUxODIwLVxcdTE4NzhcXHUxODgwLVxcdTE4YThcXHUxOGFhXFx1MThiMC1cXHUxOGY1XFx1MTkwMC1cXHUxOTFlXFx1MTk1MC1cXHUxOTZkXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOWFiXFx1MTliMC1cXHUxOWM5XFx1MWEwMC1cXHUxYTE2XFx1MWEyMC1cXHUxYTU0XFx1MWFhN1xcdTFiMDUtXFx1MWIzM1xcdTFiNDUtXFx1MWI0YlxcdTFiODMtXFx1MWJhMFxcdTFiYWVcXHUxYmFmXFx1MWJiYS1cXHUxYmU1XFx1MWMwMC1cXHUxYzIzXFx1MWM0ZC1cXHUxYzRmXFx1MWM1YS1cXHUxYzdkXFx1MWM4MC1cXHUxYzg4XFx1MWM5MC1cXHUxY2JhXFx1MWNiZC1cXHUxY2JmXFx1MWNlOS1cXHUxY2VjXFx1MWNlZS1cXHUxY2YxXFx1MWNmNVxcdTFjZjZcXHUxZDAwLVxcdTFkYmZcXHUxZTAwLVxcdTFmMTVcXHUxZjE4LVxcdTFmMWRcXHUxZjIwLVxcdTFmNDVcXHUxZjQ4LVxcdTFmNGRcXHUxZjUwLVxcdTFmNTdcXHUxZjU5XFx1MWY1YlxcdTFmNWRcXHUxZjVmLVxcdTFmN2RcXHUxZjgwLVxcdTFmYjRcXHUxZmI2LVxcdTFmYmNcXHUxZmJlXFx1MWZjMi1cXHUxZmM0XFx1MWZjNi1cXHUxZmNjXFx1MWZkMC1cXHUxZmQzXFx1MWZkNi1cXHUxZmRiXFx1MWZlMC1cXHUxZmVjXFx1MWZmMi1cXHUxZmY0XFx1MWZmNi1cXHUxZmZjXFx1MjA3MVxcdTIwN2ZcXHUyMDkwLVxcdTIwOWNcXHUyMTAyXFx1MjEwN1xcdTIxMGEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMWRcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJhLVxcdTIxMzlcXHUyMTNjLVxcdTIxM2ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRlXFx1MjE2MC1cXHUyMTg4XFx1MmMwMC1cXHUyYzJlXFx1MmMzMC1cXHUyYzVlXFx1MmM2MC1cXHUyY2U0XFx1MmNlYi1cXHUyY2VlXFx1MmNmMlxcdTJjZjNcXHUyZDAwLVxcdTJkMjVcXHUyZDI3XFx1MmQyZFxcdTJkMzAtXFx1MmQ2N1xcdTJkNmZcXHUyZDgwLVxcdTJkOTZcXHUyZGEwLVxcdTJkYTZcXHUyZGE4LVxcdTJkYWVcXHUyZGIwLVxcdTJkYjZcXHUyZGI4LVxcdTJkYmVcXHUyZGMwLVxcdTJkYzZcXHUyZGM4LVxcdTJkY2VcXHUyZGQwLVxcdTJkZDZcXHUyZGQ4LVxcdTJkZGVcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM2NcXHUzMDQxLVxcdTMwOTZcXHUzMDliLVxcdTMwOWZcXHUzMGExLVxcdTMwZmFcXHUzMGZjLVxcdTMwZmZcXHUzMTA1LVxcdTMxMmZcXHUzMTMxLVxcdTMxOGVcXHUzMWEwLVxcdTMxYmFcXHUzMWYwLVxcdTMxZmZcXHUzNDAwLVxcdTRkYjVcXHU0ZTAwLVxcdTlmZWZcXHVhMDAwLVxcdWE0OGNcXHVhNGQwLVxcdWE0ZmRcXHVhNTAwLVxcdWE2MGNcXHVhNjEwLVxcdWE2MWZcXHVhNjJhXFx1YTYyYlxcdWE2NDAtXFx1YTY2ZVxcdWE2N2YtXFx1YTY5ZFxcdWE2YTAtXFx1YTZlZlxcdWE3MTctXFx1YTcxZlxcdWE3MjItXFx1YTc4OFxcdWE3OGItXFx1YTdiOVxcdWE3ZjctXFx1YTgwMVxcdWE4MDMtXFx1YTgwNVxcdWE4MDctXFx1YTgwYVxcdWE4MGMtXFx1YTgyMlxcdWE4NDAtXFx1YTg3M1xcdWE4ODItXFx1YThiM1xcdWE4ZjItXFx1YThmN1xcdWE4ZmJcXHVhOGZkXFx1YThmZVxcdWE5MGEtXFx1YTkyNVxcdWE5MzAtXFx1YTk0NlxcdWE5NjAtXFx1YTk3Y1xcdWE5ODQtXFx1YTliMlxcdWE5Y2ZcXHVhOWUwLVxcdWE5ZTRcXHVhOWU2LVxcdWE5ZWZcXHVhOWZhLVxcdWE5ZmVcXHVhYTAwLVxcdWFhMjhcXHVhYTQwLVxcdWFhNDJcXHVhYTQ0LVxcdWFhNGJcXHVhYTYwLVxcdWFhNzZcXHVhYTdhXFx1YWE3ZS1cXHVhYWFmXFx1YWFiMVxcdWFhYjVcXHVhYWI2XFx1YWFiOS1cXHVhYWJkXFx1YWFjMFxcdWFhYzJcXHVhYWRiLVxcdWFhZGRcXHVhYWUwLVxcdWFhZWFcXHVhYWYyLVxcdWFhZjRcXHVhYjAxLVxcdWFiMDZcXHVhYjA5LVxcdWFiMGVcXHVhYjExLVxcdWFiMTZcXHVhYjIwLVxcdWFiMjZcXHVhYjI4LVxcdWFiMmVcXHVhYjMwLVxcdWFiNWFcXHVhYjVjLVxcdWFiNjVcXHVhYjcwLVxcdWFiZTJcXHVhYzAwLVxcdWQ3YTNcXHVkN2IwLVxcdWQ3YzZcXHVkN2NiLVxcdWQ3ZmJcXHVmOTAwLVxcdWZhNmRcXHVmYTcwLVxcdWZhZDlcXHVmYjAwLVxcdWZiMDZcXHVmYjEzLVxcdWZiMTdcXHVmYjFkXFx1ZmIxZi1cXHVmYjI4XFx1ZmIyYS1cXHVmYjM2XFx1ZmIzOC1cXHVmYjNjXFx1ZmIzZVxcdWZiNDBcXHVmYjQxXFx1ZmI0M1xcdWZiNDRcXHVmYjQ2LVxcdWZiYjFcXHVmYmQzLVxcdWZkM2RcXHVmZDUwLVxcdWZkOGZcXHVmZDkyLVxcdWZkYzdcXHVmZGYwLVxcdWZkZmJcXHVmZTcwLVxcdWZlNzRcXHVmZTc2LVxcdWZlZmNcXHVmZjIxLVxcdWZmM2FcXHVmZjQxLVxcdWZmNWFcXHVmZjY2LVxcdWZmYmVcXHVmZmMyLVxcdWZmYzdcXHVmZmNhLVxcdWZmY2ZcXHVmZmQyLVxcdWZmZDdcXHVmZmRhLVxcdWZmZGNcIjtcbnZhciBub25BU0NJSWlkZW50aWZpZXJDaGFycyA9IFwiXFx1MjAwY1xcdTIwMGRcXHhiN1xcdTAzMDAtXFx1MDM2ZlxcdTAzODdcXHUwNDgzLVxcdTA0ODdcXHUwNTkxLVxcdTA1YmRcXHUwNWJmXFx1MDVjMVxcdTA1YzJcXHUwNWM0XFx1MDVjNVxcdTA1YzdcXHUwNjEwLVxcdTA2MWFcXHUwNjRiLVxcdTA2NjlcXHUwNjcwXFx1MDZkNi1cXHUwNmRjXFx1MDZkZi1cXHUwNmU0XFx1MDZlN1xcdTA2ZThcXHUwNmVhLVxcdTA2ZWRcXHUwNmYwLVxcdTA2ZjlcXHUwNzExXFx1MDczMC1cXHUwNzRhXFx1MDdhNi1cXHUwN2IwXFx1MDdjMC1cXHUwN2M5XFx1MDdlYi1cXHUwN2YzXFx1MDdmZFxcdTA4MTYtXFx1MDgxOVxcdTA4MWItXFx1MDgyM1xcdTA4MjUtXFx1MDgyN1xcdTA4MjktXFx1MDgyZFxcdTA4NTktXFx1MDg1YlxcdTA4ZDMtXFx1MDhlMVxcdTA4ZTMtXFx1MDkwM1xcdTA5M2EtXFx1MDkzY1xcdTA5M2UtXFx1MDk0ZlxcdTA5NTEtXFx1MDk1N1xcdTA5NjJcXHUwOTYzXFx1MDk2Ni1cXHUwOTZmXFx1MDk4MS1cXHUwOTgzXFx1MDliY1xcdTA5YmUtXFx1MDljNFxcdTA5YzdcXHUwOWM4XFx1MDljYi1cXHUwOWNkXFx1MDlkN1xcdTA5ZTJcXHUwOWUzXFx1MDllNi1cXHUwOWVmXFx1MDlmZVxcdTBhMDEtXFx1MGEwM1xcdTBhM2NcXHUwYTNlLVxcdTBhNDJcXHUwYTQ3XFx1MGE0OFxcdTBhNGItXFx1MGE0ZFxcdTBhNTFcXHUwYTY2LVxcdTBhNzFcXHUwYTc1XFx1MGE4MS1cXHUwYTgzXFx1MGFiY1xcdTBhYmUtXFx1MGFjNVxcdTBhYzctXFx1MGFjOVxcdTBhY2ItXFx1MGFjZFxcdTBhZTJcXHUwYWUzXFx1MGFlNi1cXHUwYWVmXFx1MGFmYS1cXHUwYWZmXFx1MGIwMS1cXHUwYjAzXFx1MGIzY1xcdTBiM2UtXFx1MGI0NFxcdTBiNDdcXHUwYjQ4XFx1MGI0Yi1cXHUwYjRkXFx1MGI1NlxcdTBiNTdcXHUwYjYyXFx1MGI2M1xcdTBiNjYtXFx1MGI2ZlxcdTBiODJcXHUwYmJlLVxcdTBiYzJcXHUwYmM2LVxcdTBiYzhcXHUwYmNhLVxcdTBiY2RcXHUwYmQ3XFx1MGJlNi1cXHUwYmVmXFx1MGMwMC1cXHUwYzA0XFx1MGMzZS1cXHUwYzQ0XFx1MGM0Ni1cXHUwYzQ4XFx1MGM0YS1cXHUwYzRkXFx1MGM1NVxcdTBjNTZcXHUwYzYyXFx1MGM2M1xcdTBjNjYtXFx1MGM2ZlxcdTBjODEtXFx1MGM4M1xcdTBjYmNcXHUwY2JlLVxcdTBjYzRcXHUwY2M2LVxcdTBjYzhcXHUwY2NhLVxcdTBjY2RcXHUwY2Q1XFx1MGNkNlxcdTBjZTJcXHUwY2UzXFx1MGNlNi1cXHUwY2VmXFx1MGQwMC1cXHUwZDAzXFx1MGQzYlxcdTBkM2NcXHUwZDNlLVxcdTBkNDRcXHUwZDQ2LVxcdTBkNDhcXHUwZDRhLVxcdTBkNGRcXHUwZDU3XFx1MGQ2MlxcdTBkNjNcXHUwZDY2LVxcdTBkNmZcXHUwZDgyXFx1MGQ4M1xcdTBkY2FcXHUwZGNmLVxcdTBkZDRcXHUwZGQ2XFx1MGRkOC1cXHUwZGRmXFx1MGRlNi1cXHUwZGVmXFx1MGRmMlxcdTBkZjNcXHUwZTMxXFx1MGUzNC1cXHUwZTNhXFx1MGU0Ny1cXHUwZTRlXFx1MGU1MC1cXHUwZTU5XFx1MGViMVxcdTBlYjQtXFx1MGViOVxcdTBlYmJcXHUwZWJjXFx1MGVjOC1cXHUwZWNkXFx1MGVkMC1cXHUwZWQ5XFx1MGYxOFxcdTBmMTlcXHUwZjIwLVxcdTBmMjlcXHUwZjM1XFx1MGYzN1xcdTBmMzlcXHUwZjNlXFx1MGYzZlxcdTBmNzEtXFx1MGY4NFxcdTBmODZcXHUwZjg3XFx1MGY4ZC1cXHUwZjk3XFx1MGY5OS1cXHUwZmJjXFx1MGZjNlxcdTEwMmItXFx1MTAzZVxcdTEwNDAtXFx1MTA0OVxcdTEwNTYtXFx1MTA1OVxcdTEwNWUtXFx1MTA2MFxcdTEwNjItXFx1MTA2NFxcdTEwNjctXFx1MTA2ZFxcdTEwNzEtXFx1MTA3NFxcdTEwODItXFx1MTA4ZFxcdTEwOGYtXFx1MTA5ZFxcdTEzNWQtXFx1MTM1ZlxcdTEzNjktXFx1MTM3MVxcdTE3MTItXFx1MTcxNFxcdTE3MzItXFx1MTczNFxcdTE3NTJcXHUxNzUzXFx1MTc3MlxcdTE3NzNcXHUxN2I0LVxcdTE3ZDNcXHUxN2RkXFx1MTdlMC1cXHUxN2U5XFx1MTgwYi1cXHUxODBkXFx1MTgxMC1cXHUxODE5XFx1MThhOVxcdTE5MjAtXFx1MTkyYlxcdTE5MzAtXFx1MTkzYlxcdTE5NDYtXFx1MTk0ZlxcdTE5ZDAtXFx1MTlkYVxcdTFhMTctXFx1MWExYlxcdTFhNTUtXFx1MWE1ZVxcdTFhNjAtXFx1MWE3Y1xcdTFhN2YtXFx1MWE4OVxcdTFhOTAtXFx1MWE5OVxcdTFhYjAtXFx1MWFiZFxcdTFiMDAtXFx1MWIwNFxcdTFiMzQtXFx1MWI0NFxcdTFiNTAtXFx1MWI1OVxcdTFiNmItXFx1MWI3M1xcdTFiODAtXFx1MWI4MlxcdTFiYTEtXFx1MWJhZFxcdTFiYjAtXFx1MWJiOVxcdTFiZTYtXFx1MWJmM1xcdTFjMjQtXFx1MWMzN1xcdTFjNDAtXFx1MWM0OVxcdTFjNTAtXFx1MWM1OVxcdTFjZDAtXFx1MWNkMlxcdTFjZDQtXFx1MWNlOFxcdTFjZWRcXHUxY2YyLVxcdTFjZjRcXHUxY2Y3LVxcdTFjZjlcXHUxZGMwLVxcdTFkZjlcXHUxZGZiLVxcdTFkZmZcXHUyMDNmXFx1MjA0MFxcdTIwNTRcXHUyMGQwLVxcdTIwZGNcXHUyMGUxXFx1MjBlNS1cXHUyMGYwXFx1MmNlZi1cXHUyY2YxXFx1MmQ3ZlxcdTJkZTAtXFx1MmRmZlxcdTMwMmEtXFx1MzAyZlxcdTMwOTlcXHUzMDlhXFx1YTYyMC1cXHVhNjI5XFx1YTY2ZlxcdWE2NzQtXFx1YTY3ZFxcdWE2OWVcXHVhNjlmXFx1YTZmMFxcdWE2ZjFcXHVhODAyXFx1YTgwNlxcdWE4MGJcXHVhODIzLVxcdWE4MjdcXHVhODgwXFx1YTg4MVxcdWE4YjQtXFx1YThjNVxcdWE4ZDAtXFx1YThkOVxcdWE4ZTAtXFx1YThmMVxcdWE4ZmYtXFx1YTkwOVxcdWE5MjYtXFx1YTkyZFxcdWE5NDctXFx1YTk1M1xcdWE5ODAtXFx1YTk4M1xcdWE5YjMtXFx1YTljMFxcdWE5ZDAtXFx1YTlkOVxcdWE5ZTVcXHVhOWYwLVxcdWE5ZjlcXHVhYTI5LVxcdWFhMzZcXHVhYTQzXFx1YWE0Y1xcdWFhNGRcXHVhYTUwLVxcdWFhNTlcXHVhYTdiLVxcdWFhN2RcXHVhYWIwXFx1YWFiMi1cXHVhYWI0XFx1YWFiN1xcdWFhYjhcXHVhYWJlXFx1YWFiZlxcdWFhYzFcXHVhYWViLVxcdWFhZWZcXHVhYWY1XFx1YWFmNlxcdWFiZTMtXFx1YWJlYVxcdWFiZWNcXHVhYmVkXFx1YWJmMC1cXHVhYmY5XFx1ZmIxZVxcdWZlMDAtXFx1ZmUwZlxcdWZlMjAtXFx1ZmUyZlxcdWZlMzNcXHVmZTM0XFx1ZmU0ZC1cXHVmZTRmXFx1ZmYxMC1cXHVmZjE5XFx1ZmYzZlwiO1xuXG52YXIgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnQgPSBuZXcgUmVnRXhwKFwiW1wiICsgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyArIFwiXVwiKTtcbnZhciBub25BU0NJSWlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKFwiW1wiICsgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyArIG5vbkFTQ0lJaWRlbnRpZmllckNoYXJzICsgXCJdXCIpO1xuXG5ub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzID0gbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMgPSBudWxsO1xuXG4vLyBUaGVzZSBhcmUgYSBydW4tbGVuZ3RoIGFuZCBvZmZzZXQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGVcbi8vID4weGZmZmYgY29kZSBwb2ludHMgdGhhdCBhcmUgYSB2YWxpZCBwYXJ0IG9mIGlkZW50aWZpZXJzLiBUaGVcbi8vIG9mZnNldCBzdGFydHMgYXQgMHgxMDAwMCwgYW5kIGVhY2ggcGFpciBvZiBudW1iZXJzIHJlcHJlc2VudHMgYW5cbi8vIG9mZnNldCB0byB0aGUgbmV4dCByYW5nZSwgYW5kIHRoZW4gYSBzaXplIG9mIHRoZSByYW5nZS4gVGhleSB3ZXJlXG4vLyBnZW5lcmF0ZWQgYnkgYmluL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbW1hLXNwYWNpbmdcbnZhciBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2RlcyA9IFswLDExLDIsMjUsMiwxOCwyLDEsMiwxNCwzLDEzLDM1LDEyMiw3MCw1MiwyNjgsMjgsNCw0OCw0OCwzMSwxNCwyOSw2LDM3LDExLDI5LDMsMzUsNSw3LDIsNCw0MywxNTcsMTksMzUsNSwzNSw1LDM5LDksNTEsMTU3LDMxMCwxMCwyMSwxMSw3LDE1Myw1LDMsMCwyLDQzLDIsMSw0LDAsMywyMiwxMSwyMiwxMCwzMCw2NiwxOCwyLDEsMTEsMjEsMTEsMjUsNzEsNTUsNywxLDY1LDAsMTYsMywyLDIsMiwyOCw0MywyOCw0LDI4LDM2LDcsMiwyNywyOCw1MywxMSwyMSwxMSwxOCwxNCwxNywxMTEsNzIsNTYsNTAsMTQsNTAsMTQsMzUsNDc3LDI4LDExLDAsOSwyMSwxOTAsNTIsNzYsNDQsMzMsMjQsMjcsMzUsMzAsMCwxMiwzNCw0LDAsMTMsNDcsMTUsMywyMiwwLDIsMCwzNiwxNywyLDI0LDg1LDYsMiwwLDIsMywyLDE0LDIsOSw4LDQ2LDM5LDcsMywxLDMsMjEsMiw2LDIsMSwyLDQsNCwwLDE5LDAsMTMsNCwxNTksNTIsMTksMyw1NCw0NywyMSwxLDIsMCwxODUsNDYsNDIsMywzNyw0NywyMSwwLDYwLDQyLDg2LDI2LDIzMCw0MywxMTcsNjMsMzIsMCwyNTcsMCwxMSwzOSw4LDAsMjIsMCwxMiwzOSwzLDMsMjAsMCwzNSw1NiwyNjQsOCwyLDM2LDE4LDAsNTAsMjksMTEzLDYsMiwxLDIsMzcsMjIsMCwyNiw1LDIsMSwyLDMxLDE1LDAsMzI4LDE4LDI3MCw5MjEsMTAzLDExMCwxOCwxOTUsMjc0OSwxMDcwLDQwNTAsNTgyLDg2MzQsNTY4LDgsMzAsMTE0LDI5LDE5LDQ3LDE3LDMsMzIsMjAsNiwxOCw2ODksNjMsMTI5LDY4LDEyLDAsNjcsMTIsNjUsMSwzMSw2MTI5LDE1LDc1NCw5NDg2LDI4Niw4MiwzOTUsMjMwOSwxMDYsNiwxMiw0LDgsOCw5LDU5OTEsODQsMiw3MCwyLDEsMywwLDMsMSwzLDMsMiwxMSwyLDAsMiw2LDIsNjQsMiwzLDMsNywyLDYsMiwyNywyLDMsMiw0LDIsMCw0LDYsMiwzMzksMywyNCwyLDI0LDIsMzAsMiwyNCwyLDMwLDIsMjQsMiwzMCwyLDI0LDIsMzAsMiwyNCwyLDcsNDE0OSwxOTYsNjAsNjcsMTIxMywzLDIsMjYsMiwxLDIsMCwzLDAsMiw5LDIsMywyLDAsMiwwLDcsMCw1LDAsMiwwLDIsMCwyLDIsMiwxLDIsMCwzLDAsMiwwLDIsMCwyLDAsMiwwLDIsMSwyLDAsMywzLDIsNiwyLDMsMiwzLDIsMCwyLDksMiwxNiw2LDIsMiw0LDIsMTYsNDQyMSw0MjcxMCw0Miw0MTQ4LDEyLDIyMSwzLDU3NjEsMTUsNzQ3MiwzMTA0LDU0MV07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21tYS1zcGFjaW5nXG52YXIgYXN0cmFsSWRlbnRpZmllckNvZGVzID0gWzUwOSwwLDIyNywwLDE1MCw0LDI5NCw5LDEzNjgsMiwyLDEsNiwzLDQxLDIsNSwwLDE2NiwxLDU3NCwzLDksOSw1MjUsMTAsMTc2LDIsNTQsMTQsMzIsOSwxNiwzLDQ2LDEwLDU0LDksNywyLDM3LDEzLDIsOSw2LDEsNDUsMCwxMywyLDQ5LDEzLDksMyw0LDksODMsMTEsNywwLDE2MSwxMSw2LDksNywzLDU2LDEsMiw2LDMsMSwzLDIsMTAsMCwxMSwxLDMsNiw0LDQsMTkzLDE3LDEwLDksNSwwLDgyLDE5LDEzLDksMjE0LDYsMyw4LDI4LDEsODMsMTYsMTYsOSw4MiwxMiw5LDksODQsMTQsNSw5LDI0MywxNCwxNjYsOSwyODAsOSw0MSw2LDIsMyw5LDAsMTAsMTAsNDcsMTUsNDA2LDcsMiw3LDE3LDksNTcsMjEsMiwxMywxMjMsNSw0LDAsMiwxLDIsNiwyLDAsOSw5LDQ5LDQsMiwxLDIsNCw5LDksMzMwLDMsMTkzMDYsOSwxMzUsNCw2MCw2LDI2LDksMTAxNiw0NSwxNywzLDE5NzIzLDEsNTMxOSw0LDQsNSw5LDcsMyw2LDMxLDMsMTQ5LDIsMTQxOCw0OSw1MTMsNTQsNSw0OSw5LDAsMTUsMCwyMyw0LDIsMTQsMTM2MSw2LDIsMTYsMyw2LDIsMSwyLDQsMjIxNCw2LDExMCw2LDYsOSw3OTI0ODcsMjM5XTtcblxuLy8gVGhpcyBoYXMgYSBjb21wbGV4aXR5IGxpbmVhciB0byB0aGUgdmFsdWUgb2YgdGhlIGNvZGUuIFRoZVxuLy8gYXNzdW1wdGlvbiBpcyB0aGF0IGxvb2tpbmcgdXAgYXN0cmFsIGlkZW50aWZpZXIgY2hhcmFjdGVycyBpc1xuLy8gcmFyZS5cbmZ1bmN0aW9uIGlzSW5Bc3RyYWxTZXQoY29kZSwgc2V0KSB7XG4gIHZhciBwb3MgPSAweDEwMDAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkgKz0gMikge1xuICAgIHBvcyArPSBzZXRbaV07XG4gICAgaWYgKHBvcyA+IGNvZGUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBwb3MgKz0gc2V0W2kgKyAxXTtcbiAgICBpZiAocG9zID49IGNvZGUpIHsgcmV0dXJuIHRydWUgfVxuICB9XG59XG5cbi8vIFRlc3Qgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBjb2RlIHN0YXJ0cyBhbiBpZGVudGlmaWVyLlxuXG5mdW5jdGlvbiBpc0lkZW50aWZpZXJTdGFydChjb2RlLCBhc3RyYWwpIHtcbiAgaWYgKGNvZGUgPCA2NSkgeyByZXR1cm4gY29kZSA9PT0gMzYgfVxuICBpZiAoY29kZSA8IDkxKSB7IHJldHVybiB0cnVlIH1cbiAgaWYgKGNvZGUgPCA5NykgeyByZXR1cm4gY29kZSA9PT0gOTUgfVxuICBpZiAoY29kZSA8IDEyMykgeyByZXR1cm4gdHJ1ZSB9XG4gIGlmIChjb2RlIDw9IDB4ZmZmZikgeyByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSkgfVxuICBpZiAoYXN0cmFsID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfVxuICByZXR1cm4gaXNJbkFzdHJhbFNldChjb2RlLCBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2Rlcylcbn1cblxuLy8gVGVzdCB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIHBhcnQgb2YgYW4gaWRlbnRpZmllci5cblxuZnVuY3Rpb24gaXNJZGVudGlmaWVyQ2hhcihjb2RlLCBhc3RyYWwpIHtcbiAgaWYgKGNvZGUgPCA0OCkgeyByZXR1cm4gY29kZSA9PT0gMzYgfVxuICBpZiAoY29kZSA8IDU4KSB7IHJldHVybiB0cnVlIH1cbiAgaWYgKGNvZGUgPCA2NSkgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoY29kZSA8IDkxKSB7IHJldHVybiB0cnVlIH1cbiAgaWYgKGNvZGUgPCA5NykgeyByZXR1cm4gY29kZSA9PT0gOTUgfVxuICBpZiAoY29kZSA8IDEyMykgeyByZXR1cm4gdHJ1ZSB9XG4gIGlmIChjb2RlIDw9IDB4ZmZmZikgeyByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllci50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkpIH1cbiAgaWYgKGFzdHJhbCA9PT0gZmFsc2UpIHsgcmV0dXJuIGZhbHNlIH1cbiAgcmV0dXJuIGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllclN0YXJ0Q29kZXMpIHx8IGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllckNvZGVzKVxufVxuXG4vLyAjIyBUb2tlbiB0eXBlc1xuXG4vLyBUaGUgYXNzaWdubWVudCBvZiBmaW5lLWdyYWluZWQsIGluZm9ybWF0aW9uLWNhcnJ5aW5nIHR5cGUgb2JqZWN0c1xuLy8gYWxsb3dzIHRoZSB0b2tlbml6ZXIgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGl0IGhhcyBhYm91dCBhXG4vLyB0b2tlbiBpbiBhIHdheSB0aGF0IGlzIHZlcnkgY2hlYXAgZm9yIHRoZSBwYXJzZXIgdG8gbG9vayB1cC5cblxuLy8gQWxsIHRva2VuIHR5cGUgdmFyaWFibGVzIHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZSwgdG8gbWFrZSB0aGVtXG4vLyBlYXN5IHRvIHJlY29nbml6ZS5cblxuLy8gVGhlIGBiZWZvcmVFeHByYCBwcm9wZXJ0eSBpcyB1c2VkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIHJlZ3VsYXJcbi8vIGV4cHJlc3Npb25zIGFuZCBkaXZpc2lvbnMuIEl0IGlzIHNldCBvbiBhbGwgdG9rZW4gdHlwZXMgdGhhdCBjYW5cbi8vIGJlIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gKHRodXMsIGEgc2xhc2ggYWZ0ZXIgdGhlbSB3b3VsZCBiZSBhXG4vLyByZWd1bGFyIGV4cHJlc3Npb24pLlxuLy9cbi8vIFRoZSBgc3RhcnRzRXhwcmAgcHJvcGVydHkgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgdG9rZW4gZW5kcyBhXG4vLyBgeWllbGRgIGV4cHJlc3Npb24uIEl0IGlzIHNldCBvbiBhbGwgdG9rZW4gdHlwZXMgdGhhdCBlaXRoZXIgY2FuXG4vLyBkaXJlY3RseSBzdGFydCBhbiBleHByZXNzaW9uIChsaWtlIGEgcXVvdGF0aW9uIG1hcmspIG9yIGNhblxuLy8gY29udGludWUgYW4gZXhwcmVzc2lvbiAobGlrZSB0aGUgYm9keSBvZiBhIHN0cmluZykuXG4vL1xuLy8gYGlzTG9vcGAgbWFya3MgYSBrZXl3b3JkIGFzIHN0YXJ0aW5nIGEgbG9vcCwgd2hpY2ggaXMgaW1wb3J0YW50XG4vLyB0byBrbm93IHdoZW4gcGFyc2luZyBhIGxhYmVsLCBpbiBvcmRlciB0byBhbGxvdyBvciBkaXNhbGxvd1xuLy8gY29udGludWUganVtcHMgdG8gdGhhdCBsYWJlbC5cblxudmFyIFRva2VuVHlwZSA9IGZ1bmN0aW9uIFRva2VuVHlwZShsYWJlbCwgY29uZikge1xuICBpZiAoIGNvbmYgPT09IHZvaWQgMCApIGNvbmYgPSB7fTtcblxuICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gIHRoaXMua2V5d29yZCA9IGNvbmYua2V5d29yZDtcbiAgdGhpcy5iZWZvcmVFeHByID0gISFjb25mLmJlZm9yZUV4cHI7XG4gIHRoaXMuc3RhcnRzRXhwciA9ICEhY29uZi5zdGFydHNFeHByO1xuICB0aGlzLmlzTG9vcCA9ICEhY29uZi5pc0xvb3A7XG4gIHRoaXMuaXNBc3NpZ24gPSAhIWNvbmYuaXNBc3NpZ247XG4gIHRoaXMucHJlZml4ID0gISFjb25mLnByZWZpeDtcbiAgdGhpcy5wb3N0Zml4ID0gISFjb25mLnBvc3RmaXg7XG4gIHRoaXMuYmlub3AgPSBjb25mLmJpbm9wIHx8IG51bGw7XG4gIHRoaXMudXBkYXRlQ29udGV4dCA9IG51bGw7XG59O1xuXG5mdW5jdGlvbiBiaW5vcChuYW1lLCBwcmVjKSB7XG4gIHJldHVybiBuZXcgVG9rZW5UeXBlKG5hbWUsIHtiZWZvcmVFeHByOiB0cnVlLCBiaW5vcDogcHJlY30pXG59XG52YXIgYmVmb3JlRXhwciA9IHtiZWZvcmVFeHByOiB0cnVlfTtcbnZhciBzdGFydHNFeHByID0ge3N0YXJ0c0V4cHI6IHRydWV9O1xuXG4vLyBNYXAga2V5d29yZCBuYW1lcyB0byB0b2tlbiB0eXBlcy5cblxudmFyIGtleXdvcmRzJDEgPSB7fTtcblxuLy8gU3VjY2luY3QgZGVmaW5pdGlvbnMgb2Yga2V5d29yZCB0b2tlbiB0eXBlc1xuZnVuY3Rpb24ga3cobmFtZSwgb3B0aW9ucykge1xuICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICBvcHRpb25zLmtleXdvcmQgPSBuYW1lO1xuICByZXR1cm4ga2V5d29yZHMkMVtuYW1lXSA9IG5ldyBUb2tlblR5cGUobmFtZSwgb3B0aW9ucylcbn1cblxudmFyIHR5cGVzID0ge1xuICBudW06IG5ldyBUb2tlblR5cGUoXCJudW1cIiwgc3RhcnRzRXhwciksXG4gIHJlZ2V4cDogbmV3IFRva2VuVHlwZShcInJlZ2V4cFwiLCBzdGFydHNFeHByKSxcbiAgc3RyaW5nOiBuZXcgVG9rZW5UeXBlKFwic3RyaW5nXCIsIHN0YXJ0c0V4cHIpLFxuICBuYW1lOiBuZXcgVG9rZW5UeXBlKFwibmFtZVwiLCBzdGFydHNFeHByKSxcbiAgZW9mOiBuZXcgVG9rZW5UeXBlKFwiZW9mXCIpLFxuXG4gIC8vIFB1bmN0dWF0aW9uIHRva2VuIHR5cGVzLlxuICBicmFja2V0TDogbmV3IFRva2VuVHlwZShcIltcIiwge2JlZm9yZUV4cHI6IHRydWUsIHN0YXJ0c0V4cHI6IHRydWV9KSxcbiAgYnJhY2tldFI6IG5ldyBUb2tlblR5cGUoXCJdXCIpLFxuICBicmFjZUw6IG5ldyBUb2tlblR5cGUoXCJ7XCIsIHtiZWZvcmVFeHByOiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gIGJyYWNlUjogbmV3IFRva2VuVHlwZShcIn1cIiksXG4gIHBhcmVuTDogbmV3IFRva2VuVHlwZShcIihcIiwge2JlZm9yZUV4cHI6IHRydWUsIHN0YXJ0c0V4cHI6IHRydWV9KSxcbiAgcGFyZW5SOiBuZXcgVG9rZW5UeXBlKFwiKVwiKSxcbiAgY29tbWE6IG5ldyBUb2tlblR5cGUoXCIsXCIsIGJlZm9yZUV4cHIpLFxuICBzZW1pOiBuZXcgVG9rZW5UeXBlKFwiO1wiLCBiZWZvcmVFeHByKSxcbiAgY29sb246IG5ldyBUb2tlblR5cGUoXCI6XCIsIGJlZm9yZUV4cHIpLFxuICBkb3Q6IG5ldyBUb2tlblR5cGUoXCIuXCIpLFxuICBxdWVzdGlvbjogbmV3IFRva2VuVHlwZShcIj9cIiwgYmVmb3JlRXhwciksXG4gIGFycm93OiBuZXcgVG9rZW5UeXBlKFwiPT5cIiwgYmVmb3JlRXhwciksXG4gIHRlbXBsYXRlOiBuZXcgVG9rZW5UeXBlKFwidGVtcGxhdGVcIiksXG4gIGludmFsaWRUZW1wbGF0ZTogbmV3IFRva2VuVHlwZShcImludmFsaWRUZW1wbGF0ZVwiKSxcbiAgZWxsaXBzaXM6IG5ldyBUb2tlblR5cGUoXCIuLi5cIiwgYmVmb3JlRXhwciksXG4gIGJhY2tRdW90ZTogbmV3IFRva2VuVHlwZShcImBcIiwgc3RhcnRzRXhwciksXG4gIGRvbGxhckJyYWNlTDogbmV3IFRva2VuVHlwZShcIiR7XCIsIHtiZWZvcmVFeHByOiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG5cbiAgLy8gT3BlcmF0b3JzLiBUaGVzZSBjYXJyeSBzZXZlcmFsIGtpbmRzIG9mIHByb3BlcnRpZXMgdG8gaGVscCB0aGVcbiAgLy8gcGFyc2VyIHVzZSB0aGVtIHByb3Blcmx5ICh0aGUgcHJlc2VuY2Ugb2YgdGhlc2UgcHJvcGVydGllcyBpc1xuICAvLyB3aGF0IGNhdGVnb3JpemVzIHRoZW0gYXMgb3BlcmF0b3JzKS5cbiAgLy9cbiAgLy8gYGJpbm9wYCwgd2hlbiBwcmVzZW50LCBzcGVjaWZpZXMgdGhhdCB0aGlzIG9wZXJhdG9yIGlzIGEgYmluYXJ5XG4gIC8vIG9wZXJhdG9yLCBhbmQgd2lsbCByZWZlciB0byBpdHMgcHJlY2VkZW5jZS5cbiAgLy9cbiAgLy8gYHByZWZpeGAgYW5kIGBwb3N0Zml4YCBtYXJrIHRoZSBvcGVyYXRvciBhcyBhIHByZWZpeCBvciBwb3N0Zml4XG4gIC8vIHVuYXJ5IG9wZXJhdG9yLlxuICAvL1xuICAvLyBgaXNBc3NpZ25gIG1hcmtzIGFsbCBvZiBgPWAsIGArPWAsIGAtPWAgZXRjZXRlcmEsIHdoaWNoIGFjdCBhc1xuICAvLyBiaW5hcnkgb3BlcmF0b3JzIHdpdGggYSB2ZXJ5IGxvdyBwcmVjZWRlbmNlLCB0aGF0IHNob3VsZCByZXN1bHRcbiAgLy8gaW4gQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZXMuXG5cbiAgZXE6IG5ldyBUb2tlblR5cGUoXCI9XCIsIHtiZWZvcmVFeHByOiB0cnVlLCBpc0Fzc2lnbjogdHJ1ZX0pLFxuICBhc3NpZ246IG5ldyBUb2tlblR5cGUoXCJfPVwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgaXNBc3NpZ246IHRydWV9KSxcbiAgaW5jRGVjOiBuZXcgVG9rZW5UeXBlKFwiKysvLS1cIiwge3ByZWZpeDogdHJ1ZSwgcG9zdGZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICBwcmVmaXg6IG5ldyBUb2tlblR5cGUoXCIhL35cIiwge2JlZm9yZUV4cHI6IHRydWUsIHByZWZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICBsb2dpY2FsT1I6IGJpbm9wKFwifHxcIiwgMSksXG4gIGxvZ2ljYWxBTkQ6IGJpbm9wKFwiJiZcIiwgMiksXG4gIGJpdHdpc2VPUjogYmlub3AoXCJ8XCIsIDMpLFxuICBiaXR3aXNlWE9SOiBiaW5vcChcIl5cIiwgNCksXG4gIGJpdHdpc2VBTkQ6IGJpbm9wKFwiJlwiLCA1KSxcbiAgZXF1YWxpdHk6IGJpbm9wKFwiPT0vIT0vPT09LyE9PVwiLCA2KSxcbiAgcmVsYXRpb25hbDogYmlub3AoXCI8Lz4vPD0vPj1cIiwgNyksXG4gIGJpdFNoaWZ0OiBiaW5vcChcIjw8Lz4+Lz4+PlwiLCA4KSxcbiAgcGx1c01pbjogbmV3IFRva2VuVHlwZShcIisvLVwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgYmlub3A6IDksIHByZWZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICBtb2R1bG86IGJpbm9wKFwiJVwiLCAxMCksXG4gIHN0YXI6IGJpbm9wKFwiKlwiLCAxMCksXG4gIHNsYXNoOiBiaW5vcChcIi9cIiwgMTApLFxuICBzdGFyc3RhcjogbmV3IFRva2VuVHlwZShcIioqXCIsIHtiZWZvcmVFeHByOiB0cnVlfSksXG5cbiAgLy8gS2V5d29yZCB0b2tlbiB0eXBlcy5cbiAgX2JyZWFrOiBrdyhcImJyZWFrXCIpLFxuICBfY2FzZToga3coXCJjYXNlXCIsIGJlZm9yZUV4cHIpLFxuICBfY2F0Y2g6IGt3KFwiY2F0Y2hcIiksXG4gIF9jb250aW51ZToga3coXCJjb250aW51ZVwiKSxcbiAgX2RlYnVnZ2VyOiBrdyhcImRlYnVnZ2VyXCIpLFxuICBfZGVmYXVsdDoga3coXCJkZWZhdWx0XCIsIGJlZm9yZUV4cHIpLFxuICBfZG86IGt3KFwiZG9cIiwge2lzTG9vcDogdHJ1ZSwgYmVmb3JlRXhwcjogdHJ1ZX0pLFxuICBfZWxzZToga3coXCJlbHNlXCIsIGJlZm9yZUV4cHIpLFxuICBfZmluYWxseToga3coXCJmaW5hbGx5XCIpLFxuICBfZm9yOiBrdyhcImZvclwiLCB7aXNMb29wOiB0cnVlfSksXG4gIF9mdW5jdGlvbjoga3coXCJmdW5jdGlvblwiLCBzdGFydHNFeHByKSxcbiAgX2lmOiBrdyhcImlmXCIpLFxuICBfcmV0dXJuOiBrdyhcInJldHVyblwiLCBiZWZvcmVFeHByKSxcbiAgX3N3aXRjaDoga3coXCJzd2l0Y2hcIiksXG4gIF90aHJvdzoga3coXCJ0aHJvd1wiLCBiZWZvcmVFeHByKSxcbiAgX3RyeToga3coXCJ0cnlcIiksXG4gIF92YXI6IGt3KFwidmFyXCIpLFxuICBfY29uc3Q6IGt3KFwiY29uc3RcIiksXG4gIF93aGlsZToga3coXCJ3aGlsZVwiLCB7aXNMb29wOiB0cnVlfSksXG4gIF93aXRoOiBrdyhcIndpdGhcIiksXG4gIF9uZXc6IGt3KFwibmV3XCIsIHtiZWZvcmVFeHByOiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gIF90aGlzOiBrdyhcInRoaXNcIiwgc3RhcnRzRXhwciksXG4gIF9zdXBlcjoga3coXCJzdXBlclwiLCBzdGFydHNFeHByKSxcbiAgX2NsYXNzOiBrdyhcImNsYXNzXCIsIHN0YXJ0c0V4cHIpLFxuICBfZXh0ZW5kczoga3coXCJleHRlbmRzXCIsIGJlZm9yZUV4cHIpLFxuICBfZXhwb3J0OiBrdyhcImV4cG9ydFwiKSxcbiAgX2ltcG9ydDoga3coXCJpbXBvcnRcIiksXG4gIF9udWxsOiBrdyhcIm51bGxcIiwgc3RhcnRzRXhwciksXG4gIF90cnVlOiBrdyhcInRydWVcIiwgc3RhcnRzRXhwciksXG4gIF9mYWxzZToga3coXCJmYWxzZVwiLCBzdGFydHNFeHByKSxcbiAgX2luOiBrdyhcImluXCIsIHtiZWZvcmVFeHByOiB0cnVlLCBiaW5vcDogN30pLFxuICBfaW5zdGFuY2VvZjoga3coXCJpbnN0YW5jZW9mXCIsIHtiZWZvcmVFeHByOiB0cnVlLCBiaW5vcDogN30pLFxuICBfdHlwZW9mOiBrdyhcInR5cGVvZlwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gIF92b2lkOiBrdyhcInZvaWRcIiwge2JlZm9yZUV4cHI6IHRydWUsIHByZWZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICBfZGVsZXRlOiBrdyhcImRlbGV0ZVwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSlcbn07XG5cbi8vIE1hdGNoZXMgYSB3aG9sZSBsaW5lIGJyZWFrICh3aGVyZSBDUkxGIGlzIGNvbnNpZGVyZWQgYSBzaW5nbGVcbi8vIGxpbmUgYnJlYWspLiBVc2VkIHRvIGNvdW50IGxpbmVzLlxuXG52YXIgbGluZUJyZWFrID0gL1xcclxcbj98XFxufFxcdTIwMjh8XFx1MjAyOS87XG52YXIgbGluZUJyZWFrRyA9IG5ldyBSZWdFeHAobGluZUJyZWFrLnNvdXJjZSwgXCJnXCIpO1xuXG5mdW5jdGlvbiBpc05ld0xpbmUoY29kZSwgZWNtYTIwMTlTdHJpbmcpIHtcbiAgcmV0dXJuIGNvZGUgPT09IDEwIHx8IGNvZGUgPT09IDEzIHx8ICghZWNtYTIwMTlTdHJpbmcgJiYgKGNvZGUgPT09IDB4MjAyOCB8fCBjb2RlID09PSAweDIwMjkpKVxufVxuXG52YXIgbm9uQVNDSUl3aGl0ZXNwYWNlID0gL1tcXHUxNjgwXFx1MjAwMC1cXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1ZmVmZl0vO1xuXG52YXIgc2tpcFdoaXRlU3BhY2UgPSAvKD86XFxzfFxcL1xcLy4qfFxcL1xcKlteXSo/XFwqXFwvKSovZztcblxudmFyIHJlZiA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgaGFzT3duUHJvcGVydHkgPSByZWYuaGFzT3duUHJvcGVydHk7XG52YXIgdG9TdHJpbmcgPSByZWYudG9TdHJpbmc7XG5cbi8vIENoZWNrcyBpZiBhbiBvYmplY3QgaGFzIGEgcHJvcGVydHkuXG5cbmZ1bmN0aW9uIGhhcyhvYmosIHByb3BOYW1lKSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcE5hbWUpXG59XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCAoZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gKFxuICB0b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBBcnJheV1cIlxuKTsgfSk7XG5cbmZ1bmN0aW9uIHdvcmRzUmVnZXhwKHdvcmRzKSB7XG4gIHJldHVybiBuZXcgUmVnRXhwKFwiXig/OlwiICsgd29yZHMucmVwbGFjZSgvIC9nLCBcInxcIikgKyBcIikkXCIpXG59XG5cbi8vIFRoZXNlIGFyZSB1c2VkIHdoZW4gYG9wdGlvbnMubG9jYXRpb25zYCBpcyBvbiwgZm9yIHRoZVxuLy8gYHN0YXJ0TG9jYCBhbmQgYGVuZExvY2AgcHJvcGVydGllcy5cblxudmFyIFBvc2l0aW9uID0gZnVuY3Rpb24gUG9zaXRpb24obGluZSwgY29sKSB7XG4gIHRoaXMubGluZSA9IGxpbmU7XG4gIHRoaXMuY29sdW1uID0gY29sO1xufTtcblxuUG9zaXRpb24ucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCAobikge1xuICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMubGluZSwgdGhpcy5jb2x1bW4gKyBuKVxufTtcblxudmFyIFNvdXJjZUxvY2F0aW9uID0gZnVuY3Rpb24gU291cmNlTG9jYXRpb24ocCwgc3RhcnQsIGVuZCkge1xuICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gIHRoaXMuZW5kID0gZW5kO1xuICBpZiAocC5zb3VyY2VGaWxlICE9PSBudWxsKSB7IHRoaXMuc291cmNlID0gcC5zb3VyY2VGaWxlOyB9XG59O1xuXG4vLyBUaGUgYGdldExpbmVJbmZvYCBmdW5jdGlvbiBpcyBtb3N0bHkgdXNlZnVsIHdoZW4gdGhlXG4vLyBgbG9jYXRpb25zYCBvcHRpb24gaXMgb2ZmIChmb3IgcGVyZm9ybWFuY2UgcmVhc29ucykgYW5kIHlvdVxuLy8gd2FudCB0byBmaW5kIHRoZSBsaW5lL2NvbHVtbiBwb3NpdGlvbiBmb3IgYSBnaXZlbiBjaGFyYWN0ZXJcbi8vIG9mZnNldC4gYGlucHV0YCBzaG91bGQgYmUgdGhlIGNvZGUgc3RyaW5nIHRoYXQgdGhlIG9mZnNldCByZWZlcnNcbi8vIGludG8uXG5cbmZ1bmN0aW9uIGdldExpbmVJbmZvKGlucHV0LCBvZmZzZXQpIHtcbiAgZm9yICh2YXIgbGluZSA9IDEsIGN1ciA9IDA7Oykge1xuICAgIGxpbmVCcmVha0cubGFzdEluZGV4ID0gY3VyO1xuICAgIHZhciBtYXRjaCA9IGxpbmVCcmVha0cuZXhlYyhpbnB1dCk7XG4gICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4IDwgb2Zmc2V0KSB7XG4gICAgICArK2xpbmU7XG4gICAgICBjdXIgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbihsaW5lLCBvZmZzZXQgLSBjdXIpXG4gICAgfVxuICB9XG59XG5cbi8vIEEgc2Vjb25kIG9wdGlvbmFsIGFyZ3VtZW50IGNhbiBiZSBnaXZlbiB0byBmdXJ0aGVyIGNvbmZpZ3VyZVxuLy8gdGhlIHBhcnNlciBwcm9jZXNzLiBUaGVzZSBvcHRpb25zIGFyZSByZWNvZ25pemVkOlxuXG52YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIC8vIGBlY21hVmVyc2lvbmAgaW5kaWNhdGVzIHRoZSBFQ01BU2NyaXB0IHZlcnNpb24gdG8gcGFyc2UuIE11c3QgYmVcbiAgLy8gZWl0aGVyIDMsIDUsIDYgKDIwMTUpLCA3ICgyMDE2KSwgOCAoMjAxNyksIDkgKDIwMTgpLCBvciAxMFxuICAvLyAoMjAxOSkuIFRoaXMgaW5mbHVlbmNlcyBzdXBwb3J0IGZvciBzdHJpY3QgbW9kZSwgdGhlIHNldCBvZlxuICAvLyByZXNlcnZlZCB3b3JkcywgYW5kIHN1cHBvcnQgZm9yIG5ldyBzeW50YXggZmVhdHVyZXMuIFRoZSBkZWZhdWx0XG4gIC8vIGlzIDkuXG4gIGVjbWFWZXJzaW9uOiA5LFxuICAvLyBgc291cmNlVHlwZWAgaW5kaWNhdGVzIHRoZSBtb2RlIHRoZSBjb2RlIHNob3VsZCBiZSBwYXJzZWQgaW4uXG4gIC8vIENhbiBiZSBlaXRoZXIgYFwic2NyaXB0XCJgIG9yIGBcIm1vZHVsZVwiYC4gVGhpcyBpbmZsdWVuY2VzIGdsb2JhbFxuICAvLyBzdHJpY3QgbW9kZSBhbmQgcGFyc2luZyBvZiBgaW1wb3J0YCBhbmQgYGV4cG9ydGAgZGVjbGFyYXRpb25zLlxuICBzb3VyY2VUeXBlOiBcInNjcmlwdFwiLFxuICAvLyBgb25JbnNlcnRlZFNlbWljb2xvbmAgY2FuIGJlIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZFxuICAvLyB3aGVuIGEgc2VtaWNvbG9uIGlzIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQuIEl0IHdpbGwgYmUgcGFzc2VkXG4gIC8vIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29tbWEgYXMgYW4gb2Zmc2V0LCBhbmQgaWYgYGxvY2F0aW9uc2AgaXNcbiAgLy8gZW5hYmxlZCwgaXQgaXMgZ2l2ZW4gdGhlIGxvY2F0aW9uIGFzIGEgYHtsaW5lLCBjb2x1bW59YCBvYmplY3RcbiAgLy8gYXMgc2Vjb25kIGFyZ3VtZW50LlxuICBvbkluc2VydGVkU2VtaWNvbG9uOiBudWxsLFxuICAvLyBgb25UcmFpbGluZ0NvbW1hYCBpcyBzaW1pbGFyIHRvIGBvbkluc2VydGVkU2VtaWNvbG9uYCwgYnV0IGZvclxuICAvLyB0cmFpbGluZyBjb21tYXMuXG4gIG9uVHJhaWxpbmdDb21tYTogbnVsbCxcbiAgLy8gQnkgZGVmYXVsdCwgcmVzZXJ2ZWQgd29yZHMgYXJlIG9ubHkgZW5mb3JjZWQgaWYgZWNtYVZlcnNpb24gPj0gNS5cbiAgLy8gU2V0IGBhbGxvd1Jlc2VydmVkYCB0byBhIGJvb2xlYW4gdmFsdWUgdG8gZXhwbGljaXRseSB0dXJuIHRoaXMgb25cbiAgLy8gYW4gb2ZmLiBXaGVuIHRoaXMgb3B0aW9uIGhhcyB0aGUgdmFsdWUgXCJuZXZlclwiLCByZXNlcnZlZCB3b3Jkc1xuICAvLyBhbmQga2V5d29yZHMgY2FuIGFsc28gbm90IGJlIHVzZWQgYXMgcHJvcGVydHkgbmFtZXMuXG4gIGFsbG93UmVzZXJ2ZWQ6IG51bGwsXG4gIC8vIFdoZW4gZW5hYmxlZCwgYSByZXR1cm4gYXQgdGhlIHRvcCBsZXZlbCBpcyBub3QgY29uc2lkZXJlZCBhblxuICAvLyBlcnJvci5cbiAgYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb246IGZhbHNlLFxuICAvLyBXaGVuIGVuYWJsZWQsIGltcG9ydC9leHBvcnQgc3RhdGVtZW50cyBhcmUgbm90IGNvbnN0cmFpbmVkIHRvXG4gIC8vIGFwcGVhcmluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtLlxuICBhbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmU6IGZhbHNlLFxuICAvLyBXaGVuIGVuYWJsZWQsIGF3YWl0IGlkZW50aWZpZXJzIGFyZSBhbGxvd2VkIHRvIGFwcGVhciBhdCB0aGUgdG9wLWxldmVsIHNjb3BlLFxuICAvLyBidXQgdGhleSBhcmUgc3RpbGwgbm90IGFsbG93ZWQgaW4gbm9uLWFzeW5jIGZ1bmN0aW9ucy5cbiAgYWxsb3dBd2FpdE91dHNpZGVGdW5jdGlvbjogZmFsc2UsXG4gIC8vIFdoZW4gZW5hYmxlZCwgaGFzaGJhbmcgZGlyZWN0aXZlIGluIHRoZSBiZWdpbm5pbmcgb2YgZmlsZVxuICAvLyBpcyBhbGxvd2VkIGFuZCB0cmVhdGVkIGFzIGEgbGluZSBjb21tZW50LlxuICBhbGxvd0hhc2hCYW5nOiBmYWxzZSxcbiAgLy8gV2hlbiBgbG9jYXRpb25zYCBpcyBvbiwgYGxvY2AgcHJvcGVydGllcyBob2xkaW5nIG9iamVjdHMgd2l0aFxuICAvLyBgc3RhcnRgIGFuZCBgZW5kYCBwcm9wZXJ0aWVzIGluIGB7bGluZSwgY29sdW1ufWAgZm9ybSAod2l0aFxuICAvLyBsaW5lIGJlaW5nIDEtYmFzZWQgYW5kIGNvbHVtbiAwLWJhc2VkKSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZVxuICAvLyBub2Rlcy5cbiAgbG9jYXRpb25zOiBmYWxzZSxcbiAgLy8gQSBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIGFzIGBvblRva2VuYCBvcHRpb24sIHdoaWNoIHdpbGxcbiAgLy8gY2F1c2UgQWNvcm4gdG8gY2FsbCB0aGF0IGZ1bmN0aW9uIHdpdGggb2JqZWN0IGluIHRoZSBzYW1lXG4gIC8vIGZvcm1hdCBhcyB0b2tlbnMgcmV0dXJuZWQgZnJvbSBgdG9rZW5pemVyKCkuZ2V0VG9rZW4oKWAuIE5vdGVcbiAgLy8gdGhhdCB5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNhbGwgdGhlIHBhcnNlciBmcm9tIHRoZVxuICAvLyBjYWxsYmFja+KAlHRoYXQgd2lsbCBjb3JydXB0IGl0cyBpbnRlcm5hbCBzdGF0ZS5cbiAgb25Ub2tlbjogbnVsbCxcbiAgLy8gQSBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIGFzIGBvbkNvbW1lbnRgIG9wdGlvbiwgd2hpY2ggd2lsbFxuICAvLyBjYXVzZSBBY29ybiB0byBjYWxsIHRoYXQgZnVuY3Rpb24gd2l0aCBgKGJsb2NrLCB0ZXh0LCBzdGFydCxcbiAgLy8gZW5kKWAgcGFyYW1ldGVycyB3aGVuZXZlciBhIGNvbW1lbnQgaXMgc2tpcHBlZC4gYGJsb2NrYCBpcyBhXG4gIC8vIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXMgYSBibG9jayAoYC8qICovYCkgY29tbWVudCxcbiAgLy8gYHRleHRgIGlzIHRoZSBjb250ZW50IG9mIHRoZSBjb21tZW50LCBhbmQgYHN0YXJ0YCBhbmQgYGVuZGAgYXJlXG4gIC8vIGNoYXJhY3RlciBvZmZzZXRzIHRoYXQgZGVub3RlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBjb21tZW50LlxuICAvLyBXaGVuIHRoZSBgbG9jYXRpb25zYCBvcHRpb24gaXMgb24sIHR3byBtb3JlIHBhcmFtZXRlcnMgYXJlXG4gIC8vIHBhc3NlZCwgdGhlIGZ1bGwgYHtsaW5lLCBjb2x1bW59YCBsb2NhdGlvbnMgb2YgdGhlIHN0YXJ0IGFuZFxuICAvLyBlbmQgb2YgdGhlIGNvbW1lbnRzLiBOb3RlIHRoYXQgeW91IGFyZSBub3QgYWxsb3dlZCB0byBjYWxsIHRoZVxuICAvLyBwYXJzZXIgZnJvbSB0aGUgY2FsbGJhY2vigJR0aGF0IHdpbGwgY29ycnVwdCBpdHMgaW50ZXJuYWwgc3RhdGUuXG4gIG9uQ29tbWVudDogbnVsbCxcbiAgLy8gTm9kZXMgaGF2ZSB0aGVpciBzdGFydCBhbmQgZW5kIGNoYXJhY3RlcnMgb2Zmc2V0cyByZWNvcmRlZCBpblxuICAvLyBgc3RhcnRgIGFuZCBgZW5kYCBwcm9wZXJ0aWVzIChkaXJlY3RseSBvbiB0aGUgbm9kZSwgcmF0aGVyIHRoYW5cbiAgLy8gdGhlIGBsb2NgIG9iamVjdCwgd2hpY2ggaG9sZHMgbGluZS9jb2x1bW4gZGF0YS4gVG8gYWxzbyBhZGQgYVxuICAvLyBbc2VtaS1zdGFuZGFyZGl6ZWRdW3JhbmdlXSBgcmFuZ2VgIHByb3BlcnR5IGhvbGRpbmcgYSBgW3N0YXJ0LFxuICAvLyBlbmRdYCBhcnJheSB3aXRoIHRoZSBzYW1lIG51bWJlcnMsIHNldCB0aGUgYHJhbmdlc2Agb3B0aW9uIHRvXG4gIC8vIGB0cnVlYC5cbiAgLy9cbiAgLy8gW3JhbmdlXTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1Njc4XG4gIHJhbmdlczogZmFsc2UsXG4gIC8vIEl0IGlzIHBvc3NpYmxlIHRvIHBhcnNlIG11bHRpcGxlIGZpbGVzIGludG8gYSBzaW5nbGUgQVNUIGJ5XG4gIC8vIHBhc3NpbmcgdGhlIHRyZWUgcHJvZHVjZWQgYnkgcGFyc2luZyB0aGUgZmlyc3QgZmlsZSBhc1xuICAvLyBgcHJvZ3JhbWAgb3B0aW9uIGluIHN1YnNlcXVlbnQgcGFyc2VzLiBUaGlzIHdpbGwgYWRkIHRoZVxuICAvLyB0b3BsZXZlbCBmb3JtcyBvZiB0aGUgcGFyc2VkIGZpbGUgdG8gdGhlIGBQcm9ncmFtYCAodG9wKSBub2RlXG4gIC8vIG9mIGFuIGV4aXN0aW5nIHBhcnNlIHRyZWUuXG4gIHByb2dyYW06IG51bGwsXG4gIC8vIFdoZW4gYGxvY2F0aW9uc2AgaXMgb24sIHlvdSBjYW4gcGFzcyB0aGlzIHRvIHJlY29yZCB0aGUgc291cmNlXG4gIC8vIGZpbGUgaW4gZXZlcnkgbm9kZSdzIGBsb2NgIG9iamVjdC5cbiAgc291cmNlRmlsZTogbnVsbCxcbiAgLy8gVGhpcyB2YWx1ZSwgaWYgZ2l2ZW4sIGlzIHN0b3JlZCBpbiBldmVyeSBub2RlLCB3aGV0aGVyXG4gIC8vIGBsb2NhdGlvbnNgIGlzIG9uIG9yIG9mZi5cbiAgZGlyZWN0U291cmNlRmlsZTogbnVsbCxcbiAgLy8gV2hlbiBlbmFibGVkLCBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25zIGFyZSByZXByZXNlbnRlZCBieVxuICAvLyAobm9uLXN0YW5kYXJkKSBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2Rlc1xuICBwcmVzZXJ2ZVBhcmVuczogZmFsc2Vcbn07XG5cbi8vIEludGVycHJldCBhbmQgZGVmYXVsdCBhbiBvcHRpb25zIG9iamVjdFxuXG5mdW5jdGlvbiBnZXRPcHRpb25zKG9wdHMpIHtcbiAgdmFyIG9wdGlvbnMgPSB7fTtcblxuICBmb3IgKHZhciBvcHQgaW4gZGVmYXVsdE9wdGlvbnMpXG4gICAgeyBvcHRpb25zW29wdF0gPSBvcHRzICYmIGhhcyhvcHRzLCBvcHQpID8gb3B0c1tvcHRdIDogZGVmYXVsdE9wdGlvbnNbb3B0XTsgfVxuXG4gIGlmIChvcHRpb25zLmVjbWFWZXJzaW9uID49IDIwMTUpXG4gICAgeyBvcHRpb25zLmVjbWFWZXJzaW9uIC09IDIwMDk7IH1cblxuICBpZiAob3B0aW9ucy5hbGxvd1Jlc2VydmVkID09IG51bGwpXG4gICAgeyBvcHRpb25zLmFsbG93UmVzZXJ2ZWQgPSBvcHRpb25zLmVjbWFWZXJzaW9uIDwgNTsgfVxuXG4gIGlmIChpc0FycmF5KG9wdGlvbnMub25Ub2tlbikpIHtcbiAgICB2YXIgdG9rZW5zID0gb3B0aW9ucy5vblRva2VuO1xuICAgIG9wdGlvbnMub25Ub2tlbiA9IGZ1bmN0aW9uICh0b2tlbikgeyByZXR1cm4gdG9rZW5zLnB1c2godG9rZW4pOyB9O1xuICB9XG4gIGlmIChpc0FycmF5KG9wdGlvbnMub25Db21tZW50KSlcbiAgICB7IG9wdGlvbnMub25Db21tZW50ID0gcHVzaENvbW1lbnQob3B0aW9ucywgb3B0aW9ucy5vbkNvbW1lbnQpOyB9XG5cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gcHVzaENvbW1lbnQob3B0aW9ucywgYXJyYXkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGJsb2NrLCB0ZXh0LCBzdGFydCwgZW5kLCBzdGFydExvYywgZW5kTG9jKSB7XG4gICAgdmFyIGNvbW1lbnQgPSB7XG4gICAgICB0eXBlOiBibG9jayA/IFwiQmxvY2tcIiA6IFwiTGluZVwiLFxuICAgICAgdmFsdWU6IHRleHQsXG4gICAgICBzdGFydDogc3RhcnQsXG4gICAgICBlbmQ6IGVuZFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMubG9jYXRpb25zKVxuICAgICAgeyBjb21tZW50LmxvYyA9IG5ldyBTb3VyY2VMb2NhdGlvbih0aGlzLCBzdGFydExvYywgZW5kTG9jKTsgfVxuICAgIGlmIChvcHRpb25zLnJhbmdlcylcbiAgICAgIHsgY29tbWVudC5yYW5nZSA9IFtzdGFydCwgZW5kXTsgfVxuICAgIGFycmF5LnB1c2goY29tbWVudCk7XG4gIH1cbn1cblxuLy8gRWFjaCBzY29wZSBnZXRzIGEgYml0c2V0IHRoYXQgbWF5IGNvbnRhaW4gdGhlc2UgZmxhZ3NcbnZhciBTQ09QRV9UT1AgPSAxO1xudmFyIFNDT1BFX0ZVTkNUSU9OID0gMjtcbnZhciBTQ09QRV9WQVIgPSBTQ09QRV9UT1AgfCBTQ09QRV9GVU5DVElPTjtcbnZhciBTQ09QRV9BU1lOQyA9IDQ7XG52YXIgU0NPUEVfR0VORVJBVE9SID0gODtcbnZhciBTQ09QRV9BUlJPVyA9IDE2O1xudmFyIFNDT1BFX1NJTVBMRV9DQVRDSCA9IDMyO1xudmFyIFNDT1BFX1NVUEVSID0gNjQ7XG52YXIgU0NPUEVfRElSRUNUX1NVUEVSID0gMTI4O1xuXG5mdW5jdGlvbiBmdW5jdGlvbkZsYWdzKGFzeW5jLCBnZW5lcmF0b3IpIHtcbiAgcmV0dXJuIFNDT1BFX0ZVTkNUSU9OIHwgKGFzeW5jID8gU0NPUEVfQVNZTkMgOiAwKSB8IChnZW5lcmF0b3IgPyBTQ09QRV9HRU5FUkFUT1IgOiAwKVxufVxuXG4vLyBVc2VkIGluIGNoZWNrTFZhbCBhbmQgZGVjbGFyZU5hbWUgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGEgYmluZGluZ1xudmFyIEJJTkRfTk9ORSA9IDA7XG52YXIgQklORF9WQVIgPSAxO1xudmFyIEJJTkRfTEVYSUNBTCA9IDI7XG52YXIgQklORF9GVU5DVElPTiA9IDM7XG52YXIgQklORF9TSU1QTEVfQ0FUQ0ggPSA0O1xudmFyIEJJTkRfT1VUU0lERSA9IDU7IC8vIFNwZWNpYWwgY2FzZSBmb3IgZnVuY3Rpb24gbmFtZXMgYXMgYm91bmQgaW5zaWRlIHRoZSBmdW5jdGlvblxuXG52YXIgUGFyc2VyID0gZnVuY3Rpb24gUGFyc2VyKG9wdGlvbnMsIGlucHV0LCBzdGFydFBvcykge1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgdGhpcy5zb3VyY2VGaWxlID0gb3B0aW9ucy5zb3VyY2VGaWxlO1xuICB0aGlzLmtleXdvcmRzID0gd29yZHNSZWdleHAoa2V5d29yZHNbb3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ID8gNiA6IDVdKTtcbiAgdmFyIHJlc2VydmVkID0gXCJcIjtcbiAgaWYgKCFvcHRpb25zLmFsbG93UmVzZXJ2ZWQpIHtcbiAgICBmb3IgKHZhciB2ID0gb3B0aW9ucy5lY21hVmVyc2lvbjs7IHYtLSlcbiAgICAgIHsgaWYgKHJlc2VydmVkID0gcmVzZXJ2ZWRXb3Jkc1t2XSkgeyBicmVhayB9IH1cbiAgICBpZiAob3B0aW9ucy5zb3VyY2VUeXBlID09PSBcIm1vZHVsZVwiKSB7IHJlc2VydmVkICs9IFwiIGF3YWl0XCI7IH1cbiAgfVxuICB0aGlzLnJlc2VydmVkV29yZHMgPSB3b3Jkc1JlZ2V4cChyZXNlcnZlZCk7XG4gIHZhciByZXNlcnZlZFN0cmljdCA9IChyZXNlcnZlZCA/IHJlc2VydmVkICsgXCIgXCIgOiBcIlwiKSArIHJlc2VydmVkV29yZHMuc3RyaWN0O1xuICB0aGlzLnJlc2VydmVkV29yZHNTdHJpY3QgPSB3b3Jkc1JlZ2V4cChyZXNlcnZlZFN0cmljdCk7XG4gIHRoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdEJpbmQgPSB3b3Jkc1JlZ2V4cChyZXNlcnZlZFN0cmljdCArIFwiIFwiICsgcmVzZXJ2ZWRXb3Jkcy5zdHJpY3RCaW5kKTtcbiAgdGhpcy5pbnB1dCA9IFN0cmluZyhpbnB1dCk7XG5cbiAgLy8gVXNlZCB0byBzaWduYWwgdG8gY2FsbGVycyBvZiBgcmVhZFdvcmQxYCB3aGV0aGVyIHRoZSB3b3JkXG4gIC8vIGNvbnRhaW5lZCBhbnkgZXNjYXBlIHNlcXVlbmNlcy4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3b3JkcyB3aXRoXG4gIC8vIGVzY2FwZSBzZXF1ZW5jZXMgbXVzdCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMga2V5d29yZHMuXG4gIHRoaXMuY29udGFpbnNFc2MgPSBmYWxzZTtcblxuICAvLyBTZXQgdXAgdG9rZW4gc3RhdGVcblxuICAvLyBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgdG9rZW5pemVyIGluIHRoZSBpbnB1dC5cbiAgaWYgKHN0YXJ0UG9zKSB7XG4gICAgdGhpcy5wb3MgPSBzdGFydFBvcztcbiAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5wdXQubGFzdEluZGV4T2YoXCJcXG5cIiwgc3RhcnRQb3MgLSAxKSArIDE7XG4gICAgdGhpcy5jdXJMaW5lID0gdGhpcy5pbnB1dC5zbGljZSgwLCB0aGlzLmxpbmVTdGFydCkuc3BsaXQobGluZUJyZWFrKS5sZW5ndGg7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5wb3MgPSB0aGlzLmxpbmVTdGFydCA9IDA7XG4gICAgdGhpcy5jdXJMaW5lID0gMTtcbiAgfVxuXG4gIC8vIFByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgdG9rZW46XG4gIC8vIEl0cyB0eXBlXG4gIHRoaXMudHlwZSA9IHR5cGVzLmVvZjtcbiAgLy8gRm9yIHRva2VucyB0aGF0IGluY2x1ZGUgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZWlyIHR5cGUsIHRoZSB2YWx1ZVxuICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgLy8gSXRzIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0XG4gIHRoaXMuc3RhcnQgPSB0aGlzLmVuZCA9IHRoaXMucG9zO1xuICAvLyBBbmQsIGlmIGxvY2F0aW9ucyBhcmUgdXNlZCwgdGhlIHtsaW5lLCBjb2x1bW59IG9iamVjdFxuICAvLyBjb3JyZXNwb25kaW5nIHRvIHRob3NlIG9mZnNldHNcbiAgdGhpcy5zdGFydExvYyA9IHRoaXMuZW5kTG9jID0gdGhpcy5jdXJQb3NpdGlvbigpO1xuXG4gIC8vIFBvc2l0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgcHJldmlvdXMgdG9rZW5cbiAgdGhpcy5sYXN0VG9rRW5kTG9jID0gdGhpcy5sYXN0VG9rU3RhcnRMb2MgPSBudWxsO1xuICB0aGlzLmxhc3RUb2tTdGFydCA9IHRoaXMubGFzdFRva0VuZCA9IHRoaXMucG9zO1xuXG4gIC8vIFRoZSBjb250ZXh0IHN0YWNrIGlzIHVzZWQgdG8gc3VwZXJmaWNpYWxseSB0cmFjayBzeW50YWN0aWNcbiAgLy8gY29udGV4dCB0byBwcmVkaWN0IHdoZXRoZXIgYSByZWd1bGFyIGV4cHJlc3Npb24gaXMgYWxsb3dlZCBpbiBhXG4gIC8vIGdpdmVuIHBvc2l0aW9uLlxuICB0aGlzLmNvbnRleHQgPSB0aGlzLmluaXRpYWxDb250ZXh0KCk7XG4gIHRoaXMuZXhwckFsbG93ZWQgPSB0cnVlO1xuXG4gIC8vIEZpZ3VyZSBvdXQgaWYgaXQncyBhIG1vZHVsZSBjb2RlLlxuICB0aGlzLmluTW9kdWxlID0gb3B0aW9ucy5zb3VyY2VUeXBlID09PSBcIm1vZHVsZVwiO1xuICB0aGlzLnN0cmljdCA9IHRoaXMuaW5Nb2R1bGUgfHwgdGhpcy5zdHJpY3REaXJlY3RpdmUodGhpcy5wb3MpO1xuXG4gIC8vIFVzZWQgdG8gc2lnbmlmeSB0aGUgc3RhcnQgb2YgYSBwb3RlbnRpYWwgYXJyb3cgZnVuY3Rpb25cbiAgdGhpcy5wb3RlbnRpYWxBcnJvd0F0ID0gLTE7XG5cbiAgLy8gUG9zaXRpb25zIHRvIGRlbGF5ZWQtY2hlY2sgdGhhdCB5aWVsZC9hd2FpdCBkb2VzIG5vdCBleGlzdCBpbiBkZWZhdWx0IHBhcmFtZXRlcnMuXG4gIHRoaXMueWllbGRQb3MgPSB0aGlzLmF3YWl0UG9zID0gdGhpcy5hd2FpdElkZW50UG9zID0gMDtcbiAgLy8gTGFiZWxzIGluIHNjb3BlLlxuICB0aGlzLmxhYmVscyA9IFtdO1xuICAvLyBUaHVzLWZhciB1bmRlZmluZWQgZXhwb3J0cy5cbiAgdGhpcy51bmRlZmluZWRFeHBvcnRzID0ge307XG5cbiAgLy8gSWYgZW5hYmxlZCwgc2tpcCBsZWFkaW5nIGhhc2hiYW5nIGxpbmUuXG4gIGlmICh0aGlzLnBvcyA9PT0gMCAmJiBvcHRpb25zLmFsbG93SGFzaEJhbmcgJiYgdGhpcy5pbnB1dC5zbGljZSgwLCAyKSA9PT0gXCIjIVwiKVxuICAgIHsgdGhpcy5za2lwTGluZUNvbW1lbnQoMik7IH1cblxuICAvLyBTY29wZSB0cmFja2luZyBmb3IgZHVwbGljYXRlIHZhcmlhYmxlIG5hbWVzIChzZWUgc2NvcGUuanMpXG4gIHRoaXMuc2NvcGVTdGFjayA9IFtdO1xuICB0aGlzLmVudGVyU2NvcGUoU0NPUEVfVE9QKTtcblxuICAvLyBGb3IgUmVnRXhwIHZhbGlkYXRpb25cbiAgdGhpcy5yZWdleHBTdGF0ZSA9IG51bGw7XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBpbkZ1bmN0aW9uOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGluR2VuZXJhdG9yOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGluQXN5bmM6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYWxsb3dTdXBlcjogeyBjb25maWd1cmFibGU6IHRydWUgfSxhbGxvd0RpcmVjdFN1cGVyOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHRyZWF0RnVuY3Rpb25zQXNWYXI6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlICgpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLm9wdGlvbnMucHJvZ3JhbSB8fCB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB0aGlzLm5leHRUb2tlbigpO1xuICByZXR1cm4gdGhpcy5wYXJzZVRvcExldmVsKG5vZGUpXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuaW5GdW5jdGlvbi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VmFyU2NvcGUoKS5mbGFncyAmIFNDT1BFX0ZVTkNUSU9OKSA+IDAgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5pbkdlbmVyYXRvci5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VmFyU2NvcGUoKS5mbGFncyAmIFNDT1BFX0dFTkVSQVRPUikgPiAwIH07XG5wcm90b3R5cGVBY2Nlc3NvcnMuaW5Bc3luYy5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VmFyU2NvcGUoKS5mbGFncyAmIFNDT1BFX0FTWU5DKSA+IDAgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5hbGxvd1N1cGVyLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmN1cnJlbnRUaGlzU2NvcGUoKS5mbGFncyAmIFNDT1BFX1NVUEVSKSA+IDAgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5hbGxvd0RpcmVjdFN1cGVyLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmN1cnJlbnRUaGlzU2NvcGUoKS5mbGFncyAmIFNDT1BFX0RJUkVDVF9TVVBFUikgPiAwIH07XG5wcm90b3R5cGVBY2Nlc3NvcnMudHJlYXRGdW5jdGlvbnNBc1Zhci5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnRyZWF0RnVuY3Rpb25zQXNWYXJJblNjb3BlKHRoaXMuY3VycmVudFNjb3BlKCkpIH07XG5cbi8vIFN3aXRjaCB0byBhIGdldHRlciBmb3IgNy4wLjAuXG5QYXJzZXIucHJvdG90eXBlLmluTm9uQXJyb3dGdW5jdGlvbiA9IGZ1bmN0aW9uIGluTm9uQXJyb3dGdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlKCkuZmxhZ3MgJiBTQ09QRV9GVU5DVElPTikgPiAwIH07XG5cblBhcnNlci5leHRlbmQgPSBmdW5jdGlvbiBleHRlbmQgKCkge1xuICAgIHZhciBwbHVnaW5zID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCBsZW4tLSApIHBsdWdpbnNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICB2YXIgY2xzID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7IGNscyA9IHBsdWdpbnNbaV0oY2xzKTsgfVxuICByZXR1cm4gY2xzXG59O1xuXG5QYXJzZXIucGFyc2UgPSBmdW5jdGlvbiBwYXJzZSAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKG9wdGlvbnMsIGlucHV0KS5wYXJzZSgpXG59O1xuXG5QYXJzZXIucGFyc2VFeHByZXNzaW9uQXQgPSBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb25BdCAoaW5wdXQsIHBvcywgb3B0aW9ucykge1xuICB2YXIgcGFyc2VyID0gbmV3IHRoaXMob3B0aW9ucywgaW5wdXQsIHBvcyk7XG4gIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgcmV0dXJuIHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKVxufTtcblxuUGFyc2VyLnRva2VuaXplciA9IGZ1bmN0aW9uIHRva2VuaXplciAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKG9wdGlvbnMsIGlucHV0KVxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFBhcnNlci5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG52YXIgcHAgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4vLyAjIyBQYXJzZXIgdXRpbGl0aWVzXG5cbnZhciBsaXRlcmFsID0gL14oPzonKCg/OlxcXFwufFteJ10pKj8pJ3xcIigoPzpcXFxcLnxbXlwiXSkqPylcIikvO1xucHAuc3RyaWN0RGlyZWN0aXZlID0gZnVuY3Rpb24oc3RhcnQpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgZm9yICg7Oykge1xuICAgIC8vIFRyeSB0byBmaW5kIHN0cmluZyBsaXRlcmFsLlxuICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHN0YXJ0O1xuICAgIHN0YXJ0ICs9IHNraXBXaGl0ZVNwYWNlLmV4ZWModGhpcyQxLmlucHV0KVswXS5sZW5ndGg7XG4gICAgdmFyIG1hdGNoID0gbGl0ZXJhbC5leGVjKHRoaXMkMS5pbnB1dC5zbGljZShzdGFydCkpO1xuICAgIGlmICghbWF0Y2gpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZiAoKG1hdGNoWzFdIHx8IG1hdGNoWzJdKSA9PT0gXCJ1c2Ugc3RyaWN0XCIpIHsgcmV0dXJuIHRydWUgfVxuICAgIHN0YXJ0ICs9IG1hdGNoWzBdLmxlbmd0aDtcblxuICAgIC8vIFNraXAgc2VtaWNvbG9uLCBpZiBhbnkuXG4gICAgc2tpcFdoaXRlU3BhY2UubGFzdEluZGV4ID0gc3RhcnQ7XG4gICAgc3RhcnQgKz0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzJDEuaW5wdXQpWzBdLmxlbmd0aDtcbiAgICBpZiAodGhpcyQxLmlucHV0W3N0YXJ0XSA9PT0gXCI7XCIpXG4gICAgICB7IHN0YXJ0Kys7IH1cbiAgfVxufTtcblxuLy8gUHJlZGljYXRlIHRoYXQgdGVzdHMgd2hldGhlciB0aGUgbmV4dCB0b2tlbiBpcyBvZiB0aGUgZ2l2ZW5cbi8vIHR5cGUsIGFuZCBpZiB5ZXMsIGNvbnN1bWVzIGl0IGFzIGEgc2lkZSBlZmZlY3QuXG5cbnBwLmVhdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZSkge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn07XG5cbi8vIFRlc3RzIHdoZXRoZXIgcGFyc2VkIHRva2VuIGlzIGEgY29udGV4dHVhbCBrZXl3b3JkLlxuXG5wcC5pc0NvbnRleHR1YWwgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiB0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUgJiYgdGhpcy52YWx1ZSA9PT0gbmFtZSAmJiAhdGhpcy5jb250YWluc0VzY1xufTtcblxuLy8gQ29uc3VtZXMgY29udGV4dHVhbCBrZXl3b3JkIGlmIHBvc3NpYmxlLlxuXG5wcC5lYXRDb250ZXh0dWFsID0gZnVuY3Rpb24obmFtZSkge1xuICBpZiAoIXRoaXMuaXNDb250ZXh0dWFsKG5hbWUpKSB7IHJldHVybiBmYWxzZSB9XG4gIHRoaXMubmV4dCgpO1xuICByZXR1cm4gdHJ1ZVxufTtcblxuLy8gQXNzZXJ0cyB0aGF0IGZvbGxvd2luZyB0b2tlbiBpcyBnaXZlbiBjb250ZXh0dWFsIGtleXdvcmQuXG5cbnBwLmV4cGVjdENvbnRleHR1YWwgPSBmdW5jdGlvbihuYW1lKSB7XG4gIGlmICghdGhpcy5lYXRDb250ZXh0dWFsKG5hbWUpKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG59O1xuXG4vLyBUZXN0IHdoZXRoZXIgYSBzZW1pY29sb24gY2FuIGJlIGluc2VydGVkIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuXG5wcC5jYW5JbnNlcnRTZW1pY29sb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudHlwZSA9PT0gdHlwZXMuZW9mIHx8XG4gICAgdGhpcy50eXBlID09PSB0eXBlcy5icmFjZVIgfHxcbiAgICBsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpXG59O1xuXG5wcC5pbnNlcnRTZW1pY29sb24gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm9uSW5zZXJ0ZWRTZW1pY29sb24pXG4gICAgICB7IHRoaXMub3B0aW9ucy5vbkluc2VydGVkU2VtaWNvbG9uKHRoaXMubGFzdFRva0VuZCwgdGhpcy5sYXN0VG9rRW5kTG9jKTsgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cbn07XG5cbi8vIENvbnN1bWUgYSBzZW1pY29sb24sIG9yLCBmYWlsaW5nIHRoYXQsIHNlZSBpZiB3ZSBhcmUgYWxsb3dlZCB0b1xuLy8gcHJldGVuZCB0aGF0IHRoZXJlIGlzIGEgc2VtaWNvbG9uIGF0IHRoaXMgcG9zaXRpb24uXG5cbnBwLnNlbWljb2xvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuZWF0KHR5cGVzLnNlbWkpICYmICF0aGlzLmluc2VydFNlbWljb2xvbigpKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG59O1xuXG5wcC5hZnRlclRyYWlsaW5nQ29tbWEgPSBmdW5jdGlvbih0b2tUeXBlLCBub3ROZXh0KSB7XG4gIGlmICh0aGlzLnR5cGUgPT09IHRva1R5cGUpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm9uVHJhaWxpbmdDb21tYSlcbiAgICAgIHsgdGhpcy5vcHRpb25zLm9uVHJhaWxpbmdDb21tYSh0aGlzLmxhc3RUb2tTdGFydCwgdGhpcy5sYXN0VG9rU3RhcnRMb2MpOyB9XG4gICAgaWYgKCFub3ROZXh0KVxuICAgICAgeyB0aGlzLm5leHQoKTsgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cbn07XG5cbi8vIEV4cGVjdCBhIHRva2VuIG9mIGEgZ2l2ZW4gdHlwZS4gSWYgZm91bmQsIGNvbnN1bWUgaXQsIG90aGVyd2lzZSxcbi8vIHJhaXNlIGFuIHVuZXhwZWN0ZWQgdG9rZW4gZXJyb3IuXG5cbnBwLmV4cGVjdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdGhpcy5lYXQodHlwZSkgfHwgdGhpcy51bmV4cGVjdGVkKCk7XG59O1xuXG4vLyBSYWlzZSBhbiB1bmV4cGVjdGVkIHRva2VuIGVycm9yLlxuXG5wcC51bmV4cGVjdGVkID0gZnVuY3Rpb24ocG9zKSB7XG4gIHRoaXMucmFpc2UocG9zICE9IG51bGwgPyBwb3MgOiB0aGlzLnN0YXJ0LCBcIlVuZXhwZWN0ZWQgdG9rZW5cIik7XG59O1xuXG5mdW5jdGlvbiBEZXN0cnVjdHVyaW5nRXJyb3JzKCkge1xuICB0aGlzLnNob3J0aGFuZEFzc2lnbiA9XG4gIHRoaXMudHJhaWxpbmdDb21tYSA9XG4gIHRoaXMucGFyZW50aGVzaXplZEFzc2lnbiA9XG4gIHRoaXMucGFyZW50aGVzaXplZEJpbmQgPVxuICB0aGlzLmRvdWJsZVByb3RvID1cbiAgICAtMTtcbn1cblxucHAuY2hlY2tQYXR0ZXJuRXJyb3JzID0gZnVuY3Rpb24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgaXNBc3NpZ24pIHtcbiAgaWYgKCFyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7IHJldHVybiB9XG4gIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPiAtMSlcbiAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEsIFwiQ29tbWEgaXMgbm90IHBlcm1pdHRlZCBhZnRlciB0aGUgcmVzdCBlbGVtZW50XCIpOyB9XG4gIHZhciBwYXJlbnMgPSBpc0Fzc2lnbiA/IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA6IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQ7XG4gIGlmIChwYXJlbnMgPiAtMSkgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUocGFyZW5zLCBcIlBhcmVudGhlc2l6ZWQgcGF0dGVyblwiKTsgfVxufTtcblxucHAuY2hlY2tFeHByZXNzaW9uRXJyb3JzID0gZnVuY3Rpb24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgYW5kVGhyb3cpIHtcbiAgaWYgKCFyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7IHJldHVybiBmYWxzZSB9XG4gIHZhciBzaG9ydGhhbmRBc3NpZ24gPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbjtcbiAgdmFyIGRvdWJsZVByb3RvID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5kb3VibGVQcm90bztcbiAgaWYgKCFhbmRUaHJvdykgeyByZXR1cm4gc2hvcnRoYW5kQXNzaWduID49IDAgfHwgZG91YmxlUHJvdG8gPj0gMCB9XG4gIGlmIChzaG9ydGhhbmRBc3NpZ24gPj0gMClcbiAgICB7IHRoaXMucmFpc2Uoc2hvcnRoYW5kQXNzaWduLCBcIlNob3J0aGFuZCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBhcmUgdmFsaWQgb25seSBpbiBkZXN0cnVjdHVyaW5nIHBhdHRlcm5zXCIpOyB9XG4gIGlmIChkb3VibGVQcm90byA+PSAwKVxuICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGRvdWJsZVByb3RvLCBcIlJlZGVmaW5pdGlvbiBvZiBfX3Byb3RvX18gcHJvcGVydHlcIik7IH1cbn07XG5cbnBwLmNoZWNrWWllbGRBd2FpdEluRGVmYXVsdFBhcmFtcyA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy55aWVsZFBvcyAmJiAoIXRoaXMuYXdhaXRQb3MgfHwgdGhpcy55aWVsZFBvcyA8IHRoaXMuYXdhaXRQb3MpKVxuICAgIHsgdGhpcy5yYWlzZSh0aGlzLnlpZWxkUG9zLCBcIllpZWxkIGV4cHJlc3Npb24gY2Fubm90IGJlIGEgZGVmYXVsdCB2YWx1ZVwiKTsgfVxuICBpZiAodGhpcy5hd2FpdFBvcylcbiAgICB7IHRoaXMucmFpc2UodGhpcy5hd2FpdFBvcywgXCJBd2FpdCBleHByZXNzaW9uIGNhbm5vdCBiZSBhIGRlZmF1bHQgdmFsdWVcIik7IH1cbn07XG5cbnBwLmlzU2ltcGxlQXNzaWduVGFyZ2V0ID0gZnVuY3Rpb24oZXhwcikge1xuICBpZiAoZXhwci50eXBlID09PSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIpXG4gICAgeyByZXR1cm4gdGhpcy5pc1NpbXBsZUFzc2lnblRhcmdldChleHByLmV4cHJlc3Npb24pIH1cbiAgcmV0dXJuIGV4cHIudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgfHwgZXhwci50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIlxufTtcblxudmFyIHBwJDEgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4vLyAjIyMgU3RhdGVtZW50IHBhcnNpbmdcblxuLy8gUGFyc2UgYSBwcm9ncmFtLiBJbml0aWFsaXplcyB0aGUgcGFyc2VyLCByZWFkcyBhbnkgbnVtYmVyIG9mXG4vLyBzdGF0ZW1lbnRzLCBhbmQgd3JhcHMgdGhlbSBpbiBhIFByb2dyYW0gbm9kZS4gIE9wdGlvbmFsbHkgdGFrZXMgYVxuLy8gYHByb2dyYW1gIGFyZ3VtZW50LiAgSWYgcHJlc2VudCwgdGhlIHN0YXRlbWVudHMgd2lsbCBiZSBhcHBlbmRlZFxuLy8gdG8gaXRzIGJvZHkgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBub2RlLlxuXG5wcCQxLnBhcnNlVG9wTGV2ZWwgPSBmdW5jdGlvbihub2RlKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBleHBvcnRzID0ge307XG4gIGlmICghbm9kZS5ib2R5KSB7IG5vZGUuYm9keSA9IFtdOyB9XG4gIHdoaWxlICh0aGlzLnR5cGUgIT09IHR5cGVzLmVvZikge1xuICAgIHZhciBzdG10ID0gdGhpcyQxLnBhcnNlU3RhdGVtZW50KG51bGwsIHRydWUsIGV4cG9ydHMpO1xuICAgIG5vZGUuYm9keS5wdXNoKHN0bXQpO1xuICB9XG4gIGlmICh0aGlzLmluTW9kdWxlKVxuICAgIHsgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBPYmplY3Qua2V5cyh0aGlzJDEudW5kZWZpbmVkRXhwb3J0cyk7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAge1xuICAgICAgICB2YXIgbmFtZSA9IGxpc3RbaV07XG5cbiAgICAgICAgdGhpcyQxLnJhaXNlUmVjb3ZlcmFibGUodGhpcyQxLnVuZGVmaW5lZEV4cG9ydHNbbmFtZV0uc3RhcnQsIChcIkV4cG9ydCAnXCIgKyBuYW1lICsgXCInIGlzIG5vdCBkZWZpbmVkXCIpKTtcbiAgICAgIH0gfVxuICB0aGlzLmFkYXB0RGlyZWN0aXZlUHJvbG9ndWUobm9kZS5ib2R5KTtcbiAgdGhpcy5uZXh0KCk7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgIG5vZGUuc291cmNlVHlwZSA9IHRoaXMub3B0aW9ucy5zb3VyY2VUeXBlO1xuICB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJQcm9ncmFtXCIpXG59O1xuXG52YXIgbG9vcExhYmVsID0ge2tpbmQ6IFwibG9vcFwifTtcbnZhciBzd2l0Y2hMYWJlbCA9IHtraW5kOiBcInN3aXRjaFwifTtcblxucHAkMS5pc0xldCA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDYgfHwgIXRoaXMuaXNDb250ZXh0dWFsKFwibGV0XCIpKSB7IHJldHVybiBmYWxzZSB9XG4gIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHRoaXMucG9zO1xuICB2YXIgc2tpcCA9IHNraXBXaGl0ZVNwYWNlLmV4ZWModGhpcy5pbnB1dCk7XG4gIHZhciBuZXh0ID0gdGhpcy5wb3MgKyBza2lwWzBdLmxlbmd0aCwgbmV4dENoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KG5leHQpO1xuICAvLyBGb3IgYW1iaWd1b3VzIGNhc2VzLCBkZXRlcm1pbmUgaWYgYSBMZXhpY2FsRGVjbGFyYXRpb24gKG9yIG9ubHkgYVxuICAvLyBTdGF0ZW1lbnQpIGlzIGFsbG93ZWQgaGVyZS4gSWYgY29udGV4dCBpcyBub3QgZW1wdHkgdGhlbiBvbmx5IGEgU3RhdGVtZW50XG4gIC8vIGlzIGFsbG93ZWQuIEhvd2V2ZXIsIGBsZXQgW2AgaXMgYW4gZXhwbGljaXQgbmVnYXRpdmUgbG9va2FoZWFkIGZvclxuICAvLyBFeHByZXNzaW9uU3RhdGVtZW50LCBzbyBzcGVjaWFsLWNhc2UgaXQgZmlyc3QuXG4gIGlmIChuZXh0Q2ggPT09IDkxKSB7IHJldHVybiB0cnVlIH0gLy8gJ1snXG4gIGlmIChjb250ZXh0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKG5leHRDaCA9PT0gMTIzKSB7IHJldHVybiB0cnVlIH0gLy8gJ3snXG4gIGlmIChpc0lkZW50aWZpZXJTdGFydChuZXh0Q2gsIHRydWUpKSB7XG4gICAgdmFyIHBvcyA9IG5leHQgKyAxO1xuICAgIHdoaWxlIChpc0lkZW50aWZpZXJDaGFyKHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MpLCB0cnVlKSkgeyArK3BvczsgfVxuICAgIHZhciBpZGVudCA9IHRoaXMuaW5wdXQuc2xpY2UobmV4dCwgcG9zKTtcbiAgICBpZiAoIWtleXdvcmRSZWxhdGlvbmFsT3BlcmF0b3IudGVzdChpZGVudCkpIHsgcmV0dXJuIHRydWUgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufTtcblxuLy8gY2hlY2sgJ2FzeW5jIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBmdW5jdGlvbidcbi8vIC0gJ2FzeW5jIC8qZm9vKi8gZnVuY3Rpb24nIGlzIE9LLlxuLy8gLSAnYXN5bmMgLypcXG4qLyBmdW5jdGlvbicgaXMgaW52YWxpZC5cbnBwJDEuaXNBc3luY0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPCA4IHx8ICF0aGlzLmlzQ29udGV4dHVhbChcImFzeW5jXCIpKVxuICAgIHsgcmV0dXJuIGZhbHNlIH1cblxuICBza2lwV2hpdGVTcGFjZS5sYXN0SW5kZXggPSB0aGlzLnBvcztcbiAgdmFyIHNraXAgPSBza2lwV2hpdGVTcGFjZS5leGVjKHRoaXMuaW5wdXQpO1xuICB2YXIgbmV4dCA9IHRoaXMucG9zICsgc2tpcFswXS5sZW5ndGg7XG4gIHJldHVybiAhbGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLnBvcywgbmV4dCkpICYmXG4gICAgdGhpcy5pbnB1dC5zbGljZShuZXh0LCBuZXh0ICsgOCkgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIChuZXh0ICsgOCA9PT0gdGhpcy5pbnB1dC5sZW5ndGggfHwgIWlzSWRlbnRpZmllckNoYXIodGhpcy5pbnB1dC5jaGFyQXQobmV4dCArIDgpKSlcbn07XG5cbi8vIFBhcnNlIGEgc2luZ2xlIHN0YXRlbWVudC5cbi8vXG4vLyBJZiBleHBlY3RpbmcgYSBzdGF0ZW1lbnQgYW5kIGZpbmRpbmcgYSBzbGFzaCBvcGVyYXRvciwgcGFyc2UgYVxuLy8gcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwuIFRoaXMgaXMgdG8gaGFuZGxlIGNhc2VzIGxpa2Vcbi8vIGBpZiAoZm9vKSAvYmxhaC8uZXhlYyhmb28pYCwgd2hlcmUgbG9va2luZyBhdCB0aGUgcHJldmlvdXMgdG9rZW5cbi8vIGRvZXMgbm90IGhlbHAuXG5cbnBwJDEucGFyc2VTdGF0ZW1lbnQgPSBmdW5jdGlvbihjb250ZXh0LCB0b3BMZXZlbCwgZXhwb3J0cykge1xuICB2YXIgc3RhcnR0eXBlID0gdGhpcy50eXBlLCBub2RlID0gdGhpcy5zdGFydE5vZGUoKSwga2luZDtcblxuICBpZiAodGhpcy5pc0xldChjb250ZXh0KSkge1xuICAgIHN0YXJ0dHlwZSA9IHR5cGVzLl92YXI7XG4gICAga2luZCA9IFwibGV0XCI7XG4gIH1cblxuICAvLyBNb3N0IHR5cGVzIG9mIHN0YXRlbWVudHMgYXJlIHJlY29nbml6ZWQgYnkgdGhlIGtleXdvcmQgdGhleVxuICAvLyBzdGFydCB3aXRoLiBNYW55IGFyZSB0cml2aWFsIHRvIHBhcnNlLCBzb21lIHJlcXVpcmUgYSBiaXQgb2ZcbiAgLy8gY29tcGxleGl0eS5cblxuICBzd2l0Y2ggKHN0YXJ0dHlwZSkge1xuICBjYXNlIHR5cGVzLl9icmVhazogY2FzZSB0eXBlcy5fY29udGludWU6IHJldHVybiB0aGlzLnBhcnNlQnJlYWtDb250aW51ZVN0YXRlbWVudChub2RlLCBzdGFydHR5cGUua2V5d29yZClcbiAgY2FzZSB0eXBlcy5fZGVidWdnZXI6IHJldHVybiB0aGlzLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQobm9kZSlcbiAgY2FzZSB0eXBlcy5fZG86IHJldHVybiB0aGlzLnBhcnNlRG9TdGF0ZW1lbnQobm9kZSlcbiAgY2FzZSB0eXBlcy5fZm9yOiByZXR1cm4gdGhpcy5wYXJzZUZvclN0YXRlbWVudChub2RlKVxuICBjYXNlIHR5cGVzLl9mdW5jdGlvbjpcbiAgICAvLyBGdW5jdGlvbiBhcyBzb2xlIGJvZHkgb2YgZWl0aGVyIGFuIGlmIHN0YXRlbWVudCBvciBhIGxhYmVsZWQgc3RhdGVtZW50XG4gICAgLy8gd29ya3MsIGJ1dCBub3Qgd2hlbiBpdCBpcyBwYXJ0IG9mIGEgbGFiZWxlZCBzdGF0ZW1lbnQgdGhhdCBpcyB0aGUgc29sZVxuICAgIC8vIGJvZHkgb2YgYW4gaWYgc3RhdGVtZW50LlxuICAgIGlmICgoY29udGV4dCAmJiAodGhpcy5zdHJpY3QgfHwgY29udGV4dCAhPT0gXCJpZlwiICYmIGNvbnRleHQgIT09IFwibGFiZWxcIikpICYmIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvblN0YXRlbWVudChub2RlLCBmYWxzZSwgIWNvbnRleHQpXG4gIGNhc2UgdHlwZXMuX2NsYXNzOlxuICAgIGlmIChjb250ZXh0KSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VDbGFzcyhub2RlLCB0cnVlKVxuICBjYXNlIHR5cGVzLl9pZjogcmV0dXJuIHRoaXMucGFyc2VJZlN0YXRlbWVudChub2RlKVxuICBjYXNlIHR5cGVzLl9yZXR1cm46IHJldHVybiB0aGlzLnBhcnNlUmV0dXJuU3RhdGVtZW50KG5vZGUpXG4gIGNhc2UgdHlwZXMuX3N3aXRjaDogcmV0dXJuIHRoaXMucGFyc2VTd2l0Y2hTdGF0ZW1lbnQobm9kZSlcbiAgY2FzZSB0eXBlcy5fdGhyb3c6IHJldHVybiB0aGlzLnBhcnNlVGhyb3dTdGF0ZW1lbnQobm9kZSlcbiAgY2FzZSB0eXBlcy5fdHJ5OiByZXR1cm4gdGhpcy5wYXJzZVRyeVN0YXRlbWVudChub2RlKVxuICBjYXNlIHR5cGVzLl9jb25zdDogY2FzZSB0eXBlcy5fdmFyOlxuICAgIGtpbmQgPSBraW5kIHx8IHRoaXMudmFsdWU7XG4gICAgaWYgKGNvbnRleHQgJiYga2luZCAhPT0gXCJ2YXJcIikgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlVmFyU3RhdGVtZW50KG5vZGUsIGtpbmQpXG4gIGNhc2UgdHlwZXMuX3doaWxlOiByZXR1cm4gdGhpcy5wYXJzZVdoaWxlU3RhdGVtZW50KG5vZGUpXG4gIGNhc2UgdHlwZXMuX3dpdGg6IHJldHVybiB0aGlzLnBhcnNlV2l0aFN0YXRlbWVudChub2RlKVxuICBjYXNlIHR5cGVzLmJyYWNlTDogcmV0dXJuIHRoaXMucGFyc2VCbG9jayh0cnVlLCBub2RlKVxuICBjYXNlIHR5cGVzLnNlbWk6IHJldHVybiB0aGlzLnBhcnNlRW1wdHlTdGF0ZW1lbnQobm9kZSlcbiAgY2FzZSB0eXBlcy5fZXhwb3J0OlxuICBjYXNlIHR5cGVzLl9pbXBvcnQ6XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuYWxsb3dJbXBvcnRFeHBvcnRFdmVyeXdoZXJlKSB7XG4gICAgICBpZiAoIXRvcExldmVsKVxuICAgICAgICB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCInaW1wb3J0JyBhbmQgJ2V4cG9ydCcgbWF5IG9ubHkgYXBwZWFyIGF0IHRoZSB0b3AgbGV2ZWxcIik7IH1cbiAgICAgIGlmICghdGhpcy5pbk1vZHVsZSlcbiAgICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiJ2ltcG9ydCcgYW5kICdleHBvcnQnIG1heSBhcHBlYXIgb25seSB3aXRoICdzb3VyY2VUeXBlOiBtb2R1bGUnXCIpOyB9XG4gICAgfVxuICAgIHJldHVybiBzdGFydHR5cGUgPT09IHR5cGVzLl9pbXBvcnQgPyB0aGlzLnBhcnNlSW1wb3J0KG5vZGUpIDogdGhpcy5wYXJzZUV4cG9ydChub2RlLCBleHBvcnRzKVxuXG4gICAgLy8gSWYgdGhlIHN0YXRlbWVudCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgc3RhdGVtZW50IGtleXdvcmQgb3IgYVxuICAgIC8vIGJyYWNlLCBpdCdzIGFuIEV4cHJlc3Npb25TdGF0ZW1lbnQgb3IgTGFiZWxlZFN0YXRlbWVudC4gV2VcbiAgICAvLyBzaW1wbHkgc3RhcnQgcGFyc2luZyBhbiBleHByZXNzaW9uLCBhbmQgYWZ0ZXJ3YXJkcywgaWYgdGhlXG4gICAgLy8gbmV4dCB0b2tlbiBpcyBhIGNvbG9uIGFuZCB0aGUgZXhwcmVzc2lvbiB3YXMgYSBzaW1wbGVcbiAgICAvLyBJZGVudGlmaWVyIG5vZGUsIHdlIHN3aXRjaCB0byBpbnRlcnByZXRpbmcgaXQgYXMgYSBsYWJlbC5cbiAgZGVmYXVsdDpcbiAgICBpZiAodGhpcy5pc0FzeW5jRnVuY3Rpb24oKSkge1xuICAgICAgaWYgKGNvbnRleHQpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvblN0YXRlbWVudChub2RlLCB0cnVlLCAhY29udGV4dClcbiAgICB9XG5cbiAgICB2YXIgbWF5YmVOYW1lID0gdGhpcy52YWx1ZSwgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgaWYgKHN0YXJ0dHlwZSA9PT0gdHlwZXMubmFtZSAmJiBleHByLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIHRoaXMuZWF0KHR5cGVzLmNvbG9uKSlcbiAgICAgIHsgcmV0dXJuIHRoaXMucGFyc2VMYWJlbGVkU3RhdGVtZW50KG5vZGUsIG1heWJlTmFtZSwgZXhwciwgY29udGV4dCkgfVxuICAgIGVsc2UgeyByZXR1cm4gdGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgZXhwcikgfVxuICB9XG59O1xuXG5wcCQxLnBhcnNlQnJlYWtDb250aW51ZVN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIGtleXdvcmQpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIGlzQnJlYWsgPSBrZXl3b3JkID09PSBcImJyZWFrXCI7XG4gIHRoaXMubmV4dCgpO1xuICBpZiAodGhpcy5lYXQodHlwZXMuc2VtaSkgfHwgdGhpcy5pbnNlcnRTZW1pY29sb24oKSkgeyBub2RlLmxhYmVsID0gbnVsbDsgfVxuICBlbHNlIGlmICh0aGlzLnR5cGUgIT09IHR5cGVzLm5hbWUpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgZWxzZSB7XG4gICAgbm9kZS5sYWJlbCA9IHRoaXMucGFyc2VJZGVudCgpO1xuICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gIH1cblxuICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhbiBhY3R1YWwgZGVzdGluYXRpb24gdG8gYnJlYWsgb3JcbiAgLy8gY29udGludWUgdG8uXG4gIHZhciBpID0gMDtcbiAgZm9yICg7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBsYWIgPSB0aGlzJDEubGFiZWxzW2ldO1xuICAgIGlmIChub2RlLmxhYmVsID09IG51bGwgfHwgbGFiLm5hbWUgPT09IG5vZGUubGFiZWwubmFtZSkge1xuICAgICAgaWYgKGxhYi5raW5kICE9IG51bGwgJiYgKGlzQnJlYWsgfHwgbGFiLmtpbmQgPT09IFwibG9vcFwiKSkgeyBicmVhayB9XG4gICAgICBpZiAobm9kZS5sYWJlbCAmJiBpc0JyZWFrKSB7IGJyZWFrIH1cbiAgICB9XG4gIH1cbiAgaWYgKGkgPT09IHRoaXMubGFiZWxzLmxlbmd0aCkgeyB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIFwiVW5zeW50YWN0aWMgXCIgKyBrZXl3b3JkKTsgfVxuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGlzQnJlYWsgPyBcIkJyZWFrU3RhdGVtZW50XCIgOiBcIkNvbnRpbnVlU3RhdGVtZW50XCIpXG59O1xuXG5wcCQxLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gIHRoaXMubmV4dCgpO1xuICB0aGlzLnNlbWljb2xvbigpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVidWdnZXJTdGF0ZW1lbnRcIilcbn07XG5cbnBwJDEucGFyc2VEb1N0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIHRoaXMubGFiZWxzLnB1c2gobG9vcExhYmVsKTtcbiAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudChcImRvXCIpO1xuICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgdGhpcy5leHBlY3QodHlwZXMuX3doaWxlKTtcbiAgbm9kZS50ZXN0ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpXG4gICAgeyB0aGlzLmVhdCh0eXBlcy5zZW1pKTsgfVxuICBlbHNlXG4gICAgeyB0aGlzLnNlbWljb2xvbigpOyB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJEb1doaWxlU3RhdGVtZW50XCIpXG59O1xuXG4vLyBEaXNhbWJpZ3VhdGluZyBiZXR3ZWVuIGEgYGZvcmAgYW5kIGEgYGZvcmAvYGluYCBvciBgZm9yYC9gb2ZgXG4vLyBsb29wIGlzIG5vbi10cml2aWFsLiBCYXNpY2FsbHksIHdlIGhhdmUgdG8gcGFyc2UgdGhlIGluaXQgYHZhcmBcbi8vIHN0YXRlbWVudCBvciBleHByZXNzaW9uLCBkaXNhbGxvd2luZyB0aGUgYGluYCBvcGVyYXRvciAoc2VlXG4vLyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBgcGFyc2VFeHByZXNzaW9uYCksIGFuZCB0aGVuIGNoZWNrXG4vLyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGlzIGBpbmAgb3IgYG9mYC4gV2hlbiB0aGVyZSBpcyBubyBpbml0XG4vLyBwYXJ0IChzZW1pY29sb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMpLCBpdFxuLy8gaXMgYSByZWd1bGFyIGBmb3JgIGxvb3AuXG5cbnBwJDEucGFyc2VGb3JTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gIHRoaXMubmV4dCgpO1xuICB2YXIgYXdhaXRBdCA9ICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSAmJiAodGhpcy5pbkFzeW5jIHx8ICghdGhpcy5pbkZ1bmN0aW9uICYmIHRoaXMub3B0aW9ucy5hbGxvd0F3YWl0T3V0c2lkZUZ1bmN0aW9uKSkgJiYgdGhpcy5lYXRDb250ZXh0dWFsKFwiYXdhaXRcIikpID8gdGhpcy5sYXN0VG9rU3RhcnQgOiAtMTtcbiAgdGhpcy5sYWJlbHMucHVzaChsb29wTGFiZWwpO1xuICB0aGlzLmVudGVyU2NvcGUoMCk7XG4gIHRoaXMuZXhwZWN0KHR5cGVzLnBhcmVuTCk7XG4gIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLnNlbWkpIHtcbiAgICBpZiAoYXdhaXRBdCA+IC0xKSB7IHRoaXMudW5leHBlY3RlZChhd2FpdEF0KTsgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsIG51bGwpXG4gIH1cbiAgdmFyIGlzTGV0ID0gdGhpcy5pc0xldCgpO1xuICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5fdmFyIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMuX2NvbnN0IHx8IGlzTGV0KSB7XG4gICAgdmFyIGluaXQkMSA9IHRoaXMuc3RhcnROb2RlKCksIGtpbmQgPSBpc0xldCA/IFwibGV0XCIgOiB0aGlzLnZhbHVlO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHRoaXMucGFyc2VWYXIoaW5pdCQxLCB0cnVlLCBraW5kKTtcbiAgICB0aGlzLmZpbmlzaE5vZGUoaW5pdCQxLCBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIik7XG4gICAgaWYgKCh0aGlzLnR5cGUgPT09IHR5cGVzLl9pbiB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkpICYmIGluaXQkMS5kZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICEoa2luZCAhPT0gXCJ2YXJcIiAmJiBpbml0JDEuZGVjbGFyYXRpb25zWzBdLmluaXQpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuX2luKSB7XG4gICAgICAgICAgaWYgKGF3YWl0QXQgPiAtMSkgeyB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7IH1cbiAgICAgICAgfSBlbHNlIHsgbm9kZS5hd2FpdCA9IGF3YWl0QXQgPiAtMTsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VGb3JJbihub2RlLCBpbml0JDEpXG4gICAgfVxuICAgIGlmIChhd2FpdEF0ID4gLTEpIHsgdGhpcy51bmV4cGVjdGVkKGF3YWl0QXQpOyB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGb3Iobm9kZSwgaW5pdCQxKVxuICB9XG4gIHZhciByZWZEZXN0cnVjdHVyaW5nRXJyb3JzID0gbmV3IERlc3RydWN0dXJpbmdFcnJvcnM7XG4gIHZhciBpbml0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24odHJ1ZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLl9pbiB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkpIHtcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLl9pbikge1xuICAgICAgICBpZiAoYXdhaXRBdCA+IC0xKSB7IHRoaXMudW5leHBlY3RlZChhd2FpdEF0KTsgfVxuICAgICAgfSBlbHNlIHsgbm9kZS5hd2FpdCA9IGF3YWl0QXQgPiAtMTsgfVxuICAgIH1cbiAgICB0aGlzLnRvQXNzaWduYWJsZShpbml0LCBmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgdGhpcy5jaGVja0xWYWwoaW5pdCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGb3JJbihub2RlLCBpbml0KVxuICB9IGVsc2Uge1xuICAgIHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHRydWUpO1xuICB9XG4gIGlmIChhd2FpdEF0ID4gLTEpIHsgdGhpcy51bmV4cGVjdGVkKGF3YWl0QXQpOyB9XG4gIHJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsIGluaXQpXG59O1xuXG5wcCQxLnBhcnNlRnVuY3Rpb25TdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBpc0FzeW5jLCBkZWNsYXJhdGlvblBvc2l0aW9uKSB7XG4gIHRoaXMubmV4dCgpO1xuICByZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uKG5vZGUsIEZVTkNfU1RBVEVNRU5UIHwgKGRlY2xhcmF0aW9uUG9zaXRpb24gPyAwIDogRlVOQ19IQU5HSU5HX1NUQVRFTUVOVCksIGZhbHNlLCBpc0FzeW5jKVxufTtcblxucHAkMS5wYXJzZUlmU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICB0aGlzLm5leHQoKTtcbiAgbm9kZS50ZXN0ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICAvLyBhbGxvdyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgaW4gYnJhbmNoZXMsIGJ1dCBvbmx5IGluIG5vbi1zdHJpY3QgbW9kZVxuICBub2RlLmNvbnNlcXVlbnQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KFwiaWZcIik7XG4gIG5vZGUuYWx0ZXJuYXRlID0gdGhpcy5lYXQodHlwZXMuX2Vsc2UpID8gdGhpcy5wYXJzZVN0YXRlbWVudChcImlmXCIpIDogbnVsbDtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIklmU3RhdGVtZW50XCIpXG59O1xuXG5wcCQxLnBhcnNlUmV0dXJuU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICBpZiAoIXRoaXMuaW5GdW5jdGlvbiAmJiAhdGhpcy5vcHRpb25zLmFsbG93UmV0dXJuT3V0c2lkZUZ1bmN0aW9uKVxuICAgIHsgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIidyZXR1cm4nIG91dHNpZGUgb2YgZnVuY3Rpb25cIik7IH1cbiAgdGhpcy5uZXh0KCk7XG5cbiAgLy8gSW4gYHJldHVybmAgKGFuZCBgYnJlYWtgL2Bjb250aW51ZWApLCB0aGUga2V5d29yZHMgd2l0aFxuICAvLyBvcHRpb25hbCBhcmd1bWVudHMsIHdlIGVhZ2VybHkgbG9vayBmb3IgYSBzZW1pY29sb24gb3IgdGhlXG4gIC8vIHBvc3NpYmlsaXR5IHRvIGluc2VydCBvbmUuXG5cbiAgaWYgKHRoaXMuZWF0KHR5cGVzLnNlbWkpIHx8IHRoaXMuaW5zZXJ0U2VtaWNvbG9uKCkpIHsgbm9kZS5hcmd1bWVudCA9IG51bGw7IH1cbiAgZWxzZSB7IG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpOyB0aGlzLnNlbWljb2xvbigpOyB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJSZXR1cm5TdGF0ZW1lbnRcIilcbn07XG5cbnBwJDEucGFyc2VTd2l0Y2hTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHRoaXMubmV4dCgpO1xuICBub2RlLmRpc2NyaW1pbmFudCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgbm9kZS5jYXNlcyA9IFtdO1xuICB0aGlzLmV4cGVjdCh0eXBlcy5icmFjZUwpO1xuICB0aGlzLmxhYmVscy5wdXNoKHN3aXRjaExhYmVsKTtcbiAgdGhpcy5lbnRlclNjb3BlKDApO1xuXG4gIC8vIFN0YXRlbWVudHMgdW5kZXIgbXVzdCBiZSBncm91cGVkIChieSBsYWJlbCkgaW4gU3dpdGNoQ2FzZVxuICAvLyBub2Rlcy4gYGN1cmAgaXMgdXNlZCB0byBrZWVwIHRoZSBub2RlIHRoYXQgd2UgYXJlIGN1cnJlbnRseVxuICAvLyBhZGRpbmcgc3RhdGVtZW50cyB0by5cblxuICB2YXIgY3VyO1xuICBmb3IgKHZhciBzYXdEZWZhdWx0ID0gZmFsc2U7IHRoaXMudHlwZSAhPT0gdHlwZXMuYnJhY2VSOykge1xuICAgIGlmICh0aGlzJDEudHlwZSA9PT0gdHlwZXMuX2Nhc2UgfHwgdGhpcyQxLnR5cGUgPT09IHR5cGVzLl9kZWZhdWx0KSB7XG4gICAgICB2YXIgaXNDYXNlID0gdGhpcyQxLnR5cGUgPT09IHR5cGVzLl9jYXNlO1xuICAgICAgaWYgKGN1cikgeyB0aGlzJDEuZmluaXNoTm9kZShjdXIsIFwiU3dpdGNoQ2FzZVwiKTsgfVxuICAgICAgbm9kZS5jYXNlcy5wdXNoKGN1ciA9IHRoaXMkMS5zdGFydE5vZGUoKSk7XG4gICAgICBjdXIuY29uc2VxdWVudCA9IFtdO1xuICAgICAgdGhpcyQxLm5leHQoKTtcbiAgICAgIGlmIChpc0Nhc2UpIHtcbiAgICAgICAgY3VyLnRlc3QgPSB0aGlzJDEucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2F3RGVmYXVsdCkgeyB0aGlzJDEucmFpc2VSZWNvdmVyYWJsZSh0aGlzJDEubGFzdFRva1N0YXJ0LCBcIk11bHRpcGxlIGRlZmF1bHQgY2xhdXNlc1wiKTsgfVxuICAgICAgICBzYXdEZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgY3VyLnRlc3QgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcyQxLmV4cGVjdCh0eXBlcy5jb2xvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY3VyKSB7IHRoaXMkMS51bmV4cGVjdGVkKCk7IH1cbiAgICAgIGN1ci5jb25zZXF1ZW50LnB1c2godGhpcyQxLnBhcnNlU3RhdGVtZW50KG51bGwpKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5leGl0U2NvcGUoKTtcbiAgaWYgKGN1cikgeyB0aGlzLmZpbmlzaE5vZGUoY3VyLCBcIlN3aXRjaENhc2VcIik7IH1cbiAgdGhpcy5uZXh0KCk7IC8vIENsb3NpbmcgYnJhY2VcbiAgdGhpcy5sYWJlbHMucG9wKCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJTd2l0Y2hTdGF0ZW1lbnRcIilcbn07XG5cbnBwJDEucGFyc2VUaHJvd1N0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIGlmIChsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpKVxuICAgIHsgdGhpcy5yYWlzZSh0aGlzLmxhc3RUb2tFbmQsIFwiSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93XCIpOyB9XG4gIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICB0aGlzLnNlbWljb2xvbigpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVGhyb3dTdGF0ZW1lbnRcIilcbn07XG5cbi8vIFJldXNlZCBlbXB0eSBhcnJheSBhZGRlZCBmb3Igbm9kZSBmaWVsZHMgdGhhdCBhcmUgYWx3YXlzIGVtcHR5LlxuXG52YXIgZW1wdHkgPSBbXTtcblxucHAkMS5wYXJzZVRyeVN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUuYmxvY2sgPSB0aGlzLnBhcnNlQmxvY2soKTtcbiAgbm9kZS5oYW5kbGVyID0gbnVsbDtcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuX2NhdGNoKSB7XG4gICAgdmFyIGNsYXVzZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLnBhcmVuTCkpIHtcbiAgICAgIGNsYXVzZS5wYXJhbSA9IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgICAgdmFyIHNpbXBsZSA9IGNsYXVzZS5wYXJhbS50eXBlID09PSBcIklkZW50aWZpZXJcIjtcbiAgICAgIHRoaXMuZW50ZXJTY29wZShzaW1wbGUgPyBTQ09QRV9TSU1QTEVfQ0FUQ0ggOiAwKTtcbiAgICAgIHRoaXMuY2hlY2tMVmFsKGNsYXVzZS5wYXJhbSwgc2ltcGxlID8gQklORF9TSU1QTEVfQ0FUQ0ggOiBCSU5EX0xFWElDQUwpO1xuICAgICAgdGhpcy5leHBlY3QodHlwZXMucGFyZW5SKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDEwKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICBjbGF1c2UucGFyYW0gPSBudWxsO1xuICAgICAgdGhpcy5lbnRlclNjb3BlKDApO1xuICAgIH1cbiAgICBjbGF1c2UuYm9keSA9IHRoaXMucGFyc2VCbG9jayhmYWxzZSk7XG4gICAgdGhpcy5leGl0U2NvcGUoKTtcbiAgICBub2RlLmhhbmRsZXIgPSB0aGlzLmZpbmlzaE5vZGUoY2xhdXNlLCBcIkNhdGNoQ2xhdXNlXCIpO1xuICB9XG4gIG5vZGUuZmluYWxpemVyID0gdGhpcy5lYXQodHlwZXMuX2ZpbmFsbHkpID8gdGhpcy5wYXJzZUJsb2NrKCkgOiBudWxsO1xuICBpZiAoIW5vZGUuaGFuZGxlciAmJiAhbm9kZS5maW5hbGl6ZXIpXG4gICAgeyB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIFwiTWlzc2luZyBjYXRjaCBvciBmaW5hbGx5IGNsYXVzZVwiKTsgfVxuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVHJ5U3RhdGVtZW50XCIpXG59O1xuXG5wcCQxLnBhcnNlVmFyU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwga2luZCkge1xuICB0aGlzLm5leHQoKTtcbiAgdGhpcy5wYXJzZVZhcihub2RlLCBmYWxzZSwga2luZCk7XG4gIHRoaXMuc2VtaWNvbG9uKCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpXG59O1xuXG5wcCQxLnBhcnNlV2hpbGVTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gIHRoaXMubmV4dCgpO1xuICBub2RlLnRlc3QgPSB0aGlzLnBhcnNlUGFyZW5FeHByZXNzaW9uKCk7XG4gIHRoaXMubGFiZWxzLnB1c2gobG9vcExhYmVsKTtcbiAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudChcIndoaWxlXCIpO1xuICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIldoaWxlU3RhdGVtZW50XCIpXG59O1xuXG5wcCQxLnBhcnNlV2l0aFN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgaWYgKHRoaXMuc3RyaWN0KSB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCInd2l0aCcgaW4gc3RyaWN0IG1vZGVcIik7IH1cbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUub2JqZWN0ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KFwid2l0aFwiKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIldpdGhTdGF0ZW1lbnRcIilcbn07XG5cbnBwJDEucGFyc2VFbXB0eVN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFbXB0eVN0YXRlbWVudFwiKVxufTtcblxucHAkMS5wYXJzZUxhYmVsZWRTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBtYXliZU5hbWUsIGV4cHIsIGNvbnRleHQpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgZm9yICh2YXIgaSQxID0gMCwgbGlzdCA9IHRoaXMkMS5sYWJlbHM7IGkkMSA8IGxpc3QubGVuZ3RoOyBpJDEgKz0gMSlcbiAgICB7XG4gICAgdmFyIGxhYmVsID0gbGlzdFtpJDFdO1xuXG4gICAgaWYgKGxhYmVsLm5hbWUgPT09IG1heWJlTmFtZSlcbiAgICAgIHsgdGhpcyQxLnJhaXNlKGV4cHIuc3RhcnQsIFwiTGFiZWwgJ1wiICsgbWF5YmVOYW1lICsgXCInIGlzIGFscmVhZHkgZGVjbGFyZWRcIik7XG4gIH0gfVxuICB2YXIga2luZCA9IHRoaXMudHlwZS5pc0xvb3AgPyBcImxvb3BcIiA6IHRoaXMudHlwZSA9PT0gdHlwZXMuX3N3aXRjaCA/IFwic3dpdGNoXCIgOiBudWxsO1xuICBmb3IgKHZhciBpID0gdGhpcy5sYWJlbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFiZWwkMSA9IHRoaXMkMS5sYWJlbHNbaV07XG4gICAgaWYgKGxhYmVsJDEuc3RhdGVtZW50U3RhcnQgPT09IG5vZGUuc3RhcnQpIHtcbiAgICAgIC8vIFVwZGF0ZSBpbmZvcm1hdGlvbiBhYm91dCBwcmV2aW91cyBsYWJlbHMgb24gdGhpcyBub2RlXG4gICAgICBsYWJlbCQxLnN0YXRlbWVudFN0YXJ0ID0gdGhpcyQxLnN0YXJ0O1xuICAgICAgbGFiZWwkMS5raW5kID0ga2luZDtcbiAgICB9IGVsc2UgeyBicmVhayB9XG4gIH1cbiAgdGhpcy5sYWJlbHMucHVzaCh7bmFtZTogbWF5YmVOYW1lLCBraW5kOiBraW5kLCBzdGF0ZW1lbnRTdGFydDogdGhpcy5zdGFydH0pO1xuICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KGNvbnRleHQgPyBjb250ZXh0LmluZGV4T2YoXCJsYWJlbFwiKSA9PT0gLTEgPyBjb250ZXh0ICsgXCJsYWJlbFwiIDogY29udGV4dCA6IFwibGFiZWxcIik7XG4gIHRoaXMubGFiZWxzLnBvcCgpO1xuICBub2RlLmxhYmVsID0gZXhwcjtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkxhYmVsZWRTdGF0ZW1lbnRcIilcbn07XG5cbnBwJDEucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgZXhwcikge1xuICBub2RlLmV4cHJlc3Npb24gPSBleHByO1xuICB0aGlzLnNlbWljb2xvbigpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKVxufTtcblxuLy8gUGFyc2UgYSBzZW1pY29sb24tZW5jbG9zZWQgYmxvY2sgb2Ygc3RhdGVtZW50cywgaGFuZGxpbmcgYFwidXNlXG4vLyBzdHJpY3RcImAgZGVjbGFyYXRpb25zIHdoZW4gYGFsbG93U3RyaWN0YCBpcyB0cnVlICh1c2VkIGZvclxuLy8gZnVuY3Rpb24gYm9kaWVzKS5cblxucHAkMS5wYXJzZUJsb2NrID0gZnVuY3Rpb24oY3JlYXRlTmV3TGV4aWNhbFNjb3BlLCBub2RlKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuICBpZiAoIGNyZWF0ZU5ld0xleGljYWxTY29wZSA9PT0gdm9pZCAwICkgY3JlYXRlTmV3TGV4aWNhbFNjb3BlID0gdHJ1ZTtcbiAgaWYgKCBub2RlID09PSB2b2lkIDAgKSBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICBub2RlLmJvZHkgPSBbXTtcbiAgdGhpcy5leHBlY3QodHlwZXMuYnJhY2VMKTtcbiAgaWYgKGNyZWF0ZU5ld0xleGljYWxTY29wZSkgeyB0aGlzLmVudGVyU2NvcGUoMCk7IH1cbiAgd2hpbGUgKCF0aGlzLmVhdCh0eXBlcy5icmFjZVIpKSB7XG4gICAgdmFyIHN0bXQgPSB0aGlzJDEucGFyc2VTdGF0ZW1lbnQobnVsbCk7XG4gICAgbm9kZS5ib2R5LnB1c2goc3RtdCk7XG4gIH1cbiAgaWYgKGNyZWF0ZU5ld0xleGljYWxTY29wZSkgeyB0aGlzLmV4aXRTY29wZSgpOyB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJCbG9ja1N0YXRlbWVudFwiKVxufTtcblxuLy8gUGFyc2UgYSByZWd1bGFyIGBmb3JgIGxvb3AuIFRoZSBkaXNhbWJpZ3VhdGlvbiBjb2RlIGluXG4vLyBgcGFyc2VTdGF0ZW1lbnRgIHdpbGwgYWxyZWFkeSBoYXZlIHBhcnNlZCB0aGUgaW5pdCBzdGF0ZW1lbnQgb3Jcbi8vIGV4cHJlc3Npb24uXG5cbnBwJDEucGFyc2VGb3IgPSBmdW5jdGlvbihub2RlLCBpbml0KSB7XG4gIG5vZGUuaW5pdCA9IGluaXQ7XG4gIHRoaXMuZXhwZWN0KHR5cGVzLnNlbWkpO1xuICBub2RlLnRlc3QgPSB0aGlzLnR5cGUgPT09IHR5cGVzLnNlbWkgPyBudWxsIDogdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgdGhpcy5leHBlY3QodHlwZXMuc2VtaSk7XG4gIG5vZGUudXBkYXRlID0gdGhpcy50eXBlID09PSB0eXBlcy5wYXJlblIgPyBudWxsIDogdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgdGhpcy5leHBlY3QodHlwZXMucGFyZW5SKTtcbiAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudChcImZvclwiKTtcbiAgdGhpcy5leGl0U2NvcGUoKTtcbiAgdGhpcy5sYWJlbHMucG9wKCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJGb3JTdGF0ZW1lbnRcIilcbn07XG5cbi8vIFBhcnNlIGEgYGZvcmAvYGluYCBhbmQgYGZvcmAvYG9mYCBsb29wLCB3aGljaCBhcmUgYWxtb3N0XG4vLyBzYW1lIGZyb20gcGFyc2VyJ3MgcGVyc3BlY3RpdmUuXG5cbnBwJDEucGFyc2VGb3JJbiA9IGZ1bmN0aW9uKG5vZGUsIGluaXQpIHtcbiAgdmFyIHR5cGUgPSB0aGlzLnR5cGUgPT09IHR5cGVzLl9pbiA/IFwiRm9ySW5TdGF0ZW1lbnRcIiA6IFwiRm9yT2ZTdGF0ZW1lbnRcIjtcbiAgdGhpcy5uZXh0KCk7XG4gIGlmICh0eXBlID09PSBcIkZvckluU3RhdGVtZW50XCIpIHtcbiAgICBpZiAoaW5pdC50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIgfHxcbiAgICAgIChpbml0LnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiICYmIGluaXQuZGVjbGFyYXRpb25zWzBdLmluaXQgIT0gbnVsbCAmJlxuICAgICAgICh0aGlzLnN0cmljdCB8fCBpbml0LmRlY2xhcmF0aW9uc1swXS5pZC50eXBlICE9PSBcIklkZW50aWZpZXJcIikpKVxuICAgICAgeyB0aGlzLnJhaXNlKGluaXQuc3RhcnQsIFwiSW52YWxpZCBhc3NpZ25tZW50IGluIGZvci1pbiBsb29wIGhlYWRcIik7IH1cbiAgfVxuICBub2RlLmxlZnQgPSBpbml0O1xuICBub2RlLnJpZ2h0ID0gdHlwZSA9PT0gXCJGb3JJblN0YXRlbWVudFwiID8gdGhpcy5wYXJzZUV4cHJlc3Npb24oKSA6IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO1xuICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KFwiZm9yXCIpO1xuICB0aGlzLmV4aXRTY29wZSgpO1xuICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCB0eXBlKVxufTtcblxuLy8gUGFyc2UgYSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy5cblxucHAkMS5wYXJzZVZhciA9IGZ1bmN0aW9uKG5vZGUsIGlzRm9yLCBraW5kKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIG5vZGUuZGVjbGFyYXRpb25zID0gW107XG4gIG5vZGUua2luZCA9IGtpbmQ7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgZGVjbCA9IHRoaXMkMS5zdGFydE5vZGUoKTtcbiAgICB0aGlzJDEucGFyc2VWYXJJZChkZWNsLCBraW5kKTtcbiAgICBpZiAodGhpcyQxLmVhdCh0eXBlcy5lcSkpIHtcbiAgICAgIGRlY2wuaW5pdCA9IHRoaXMkMS5wYXJzZU1heWJlQXNzaWduKGlzRm9yKTtcbiAgICB9IGVsc2UgaWYgKGtpbmQgPT09IFwiY29uc3RcIiAmJiAhKHRoaXMkMS50eXBlID09PSB0eXBlcy5faW4gfHwgKHRoaXMkMS5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcyQxLmlzQ29udGV4dHVhbChcIm9mXCIpKSkpIHtcbiAgICAgIHRoaXMkMS51bmV4cGVjdGVkKCk7XG4gICAgfSBlbHNlIGlmIChkZWNsLmlkLnR5cGUgIT09IFwiSWRlbnRpZmllclwiICYmICEoaXNGb3IgJiYgKHRoaXMkMS50eXBlID09PSB0eXBlcy5faW4gfHwgdGhpcyQxLmlzQ29udGV4dHVhbChcIm9mXCIpKSkpIHtcbiAgICAgIHRoaXMkMS5yYWlzZSh0aGlzJDEubGFzdFRva0VuZCwgXCJDb21wbGV4IGJpbmRpbmcgcGF0dGVybnMgcmVxdWlyZSBhbiBpbml0aWFsaXphdGlvbiB2YWx1ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVjbC5pbml0ID0gbnVsbDtcbiAgICB9XG4gICAgbm9kZS5kZWNsYXJhdGlvbnMucHVzaCh0aGlzJDEuZmluaXNoTm9kZShkZWNsLCBcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSk7XG4gICAgaWYgKCF0aGlzJDEuZWF0KHR5cGVzLmNvbW1hKSkgeyBicmVhayB9XG4gIH1cbiAgcmV0dXJuIG5vZGVcbn07XG5cbnBwJDEucGFyc2VWYXJJZCA9IGZ1bmN0aW9uKGRlY2wsIGtpbmQpIHtcbiAgaWYgKChraW5kID09PSBcImNvbnN0XCIgfHwga2luZCA9PT0gXCJsZXRcIikgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJsZXRcIikpIHtcbiAgICB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJsZXQgaXMgZGlzYWxsb3dlZCBhcyBhIGxleGljYWxseSBib3VuZCBuYW1lXCIpO1xuICB9XG4gIGRlY2wuaWQgPSB0aGlzLnBhcnNlQmluZGluZ0F0b20oKTtcbiAgdGhpcy5jaGVja0xWYWwoZGVjbC5pZCwga2luZCA9PT0gXCJ2YXJcIiA/IEJJTkRfVkFSIDogQklORF9MRVhJQ0FMLCBmYWxzZSk7XG59O1xuXG52YXIgRlVOQ19TVEFURU1FTlQgPSAxO1xudmFyIEZVTkNfSEFOR0lOR19TVEFURU1FTlQgPSAyO1xudmFyIEZVTkNfTlVMTEFCTEVfSUQgPSA0O1xuXG4vLyBQYXJzZSBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIG9yIGxpdGVyYWwgKGRlcGVuZGluZyBvbiB0aGVcbi8vIGBzdGF0ZW1lbnQgJiBGVU5DX1NUQVRFTUVOVGApLlxuXG4vLyBSZW1vdmUgYGFsbG93RXhwcmVzc2lvbkJvZHlgIGZvciA3LjAuMCwgYXMgaXQgaXMgb25seSBjYWxsZWQgd2l0aCBmYWxzZVxucHAkMS5wYXJzZUZ1bmN0aW9uID0gZnVuY3Rpb24obm9kZSwgc3RhdGVtZW50LCBhbGxvd0V4cHJlc3Npb25Cb2R5LCBpc0FzeW5jKSB7XG4gIHRoaXMuaW5pdEZ1bmN0aW9uKG5vZGUpO1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgfHwgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgIWlzQXN5bmMpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5zdGFyICYmIChzdGF0ZW1lbnQgJiBGVU5DX0hBTkdJTkdfU1RBVEVNRU5UKSlcbiAgICAgIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICBub2RlLmdlbmVyYXRvciA9IHRoaXMuZWF0KHR5cGVzLnN0YXIpO1xuICB9XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOClcbiAgICB7IG5vZGUuYXN5bmMgPSAhIWlzQXN5bmM7IH1cblxuICBpZiAoc3RhdGVtZW50ICYgRlVOQ19TVEFURU1FTlQpIHtcbiAgICBub2RlLmlkID0gKHN0YXRlbWVudCAmIEZVTkNfTlVMTEFCTEVfSUQpICYmIHRoaXMudHlwZSAhPT0gdHlwZXMubmFtZSA/IG51bGwgOiB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICBpZiAobm9kZS5pZCAmJiAhKHN0YXRlbWVudCAmIEZVTkNfSEFOR0lOR19TVEFURU1FTlQpKVxuICAgICAgLy8gSWYgaXQgaXMgYSByZWd1bGFyIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGluIHNsb3BweSBtb2RlLCB0aGVuIGl0IGlzXG4gICAgICAvLyBzdWJqZWN0IHRvIEFubmV4IEIgc2VtYW50aWNzIChCSU5EX0ZVTkNUSU9OKS4gT3RoZXJ3aXNlLCB0aGUgYmluZGluZ1xuICAgICAgLy8gbW9kZSBkZXBlbmRzIG9uIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgc2NvcGUgKHNlZVxuICAgICAgLy8gdHJlYXRGdW5jdGlvbnNBc1ZhcikuXG4gICAgICB7IHRoaXMuY2hlY2tMVmFsKG5vZGUuaWQsICh0aGlzLnN0cmljdCB8fCBub2RlLmdlbmVyYXRvciB8fCBub2RlLmFzeW5jKSA/IHRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhciA/IEJJTkRfVkFSIDogQklORF9MRVhJQ0FMIDogQklORF9GVU5DVElPTik7IH1cbiAgfVxuXG4gIHZhciBvbGRZaWVsZFBvcyA9IHRoaXMueWllbGRQb3MsIG9sZEF3YWl0UG9zID0gdGhpcy5hd2FpdFBvcywgb2xkQXdhaXRJZGVudFBvcyA9IHRoaXMuYXdhaXRJZGVudFBvcztcbiAgdGhpcy55aWVsZFBvcyA9IDA7XG4gIHRoaXMuYXdhaXRQb3MgPSAwO1xuICB0aGlzLmF3YWl0SWRlbnRQb3MgPSAwO1xuICB0aGlzLmVudGVyU2NvcGUoZnVuY3Rpb25GbGFncyhub2RlLmFzeW5jLCBub2RlLmdlbmVyYXRvcikpO1xuXG4gIGlmICghKHN0YXRlbWVudCAmIEZVTkNfU1RBVEVNRU5UKSlcbiAgICB7IG5vZGUuaWQgPSB0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUgPyB0aGlzLnBhcnNlSWRlbnQoKSA6IG51bGw7IH1cblxuICB0aGlzLnBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZSk7XG4gIHRoaXMucGFyc2VGdW5jdGlvbkJvZHkobm9kZSwgYWxsb3dFeHByZXNzaW9uQm9keSwgZmFsc2UpO1xuXG4gIHRoaXMueWllbGRQb3MgPSBvbGRZaWVsZFBvcztcbiAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zO1xuICB0aGlzLmF3YWl0SWRlbnRQb3MgPSBvbGRBd2FpdElkZW50UG9zO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIChzdGF0ZW1lbnQgJiBGVU5DX1NUQVRFTUVOVCkgPyBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiA6IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpXG59O1xuXG5wcCQxLnBhcnNlRnVuY3Rpb25QYXJhbXMgPSBmdW5jdGlvbihub2RlKSB7XG4gIHRoaXMuZXhwZWN0KHR5cGVzLnBhcmVuTCk7XG4gIG5vZGUucGFyYW1zID0gdGhpcy5wYXJzZUJpbmRpbmdMaXN0KHR5cGVzLnBhcmVuUiwgZmFsc2UsIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4KTtcbiAgdGhpcy5jaGVja1lpZWxkQXdhaXRJbkRlZmF1bHRQYXJhbXMoKTtcbn07XG5cbi8vIFBhcnNlIGEgY2xhc3MgZGVjbGFyYXRpb24gb3IgbGl0ZXJhbCAoZGVwZW5kaW5nIG9uIHRoZVxuLy8gYGlzU3RhdGVtZW50YCBwYXJhbWV0ZXIpLlxuXG5wcCQxLnBhcnNlQ2xhc3MgPSBmdW5jdGlvbihub2RlLCBpc1N0YXRlbWVudCkge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB0aGlzLm5leHQoKTtcblxuICAvLyBlY21hLTI2MiAxNC42IENsYXNzIERlZmluaXRpb25zXG4gIC8vIEEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbHdheXMgc3RyaWN0IG1vZGUgY29kZS5cbiAgdmFyIG9sZFN0cmljdCA9IHRoaXMuc3RyaWN0O1xuICB0aGlzLnN0cmljdCA9IHRydWU7XG5cbiAgdGhpcy5wYXJzZUNsYXNzSWQobm9kZSwgaXNTdGF0ZW1lbnQpO1xuICB0aGlzLnBhcnNlQ2xhc3NTdXBlcihub2RlKTtcbiAgdmFyIGNsYXNzQm9keSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gIHZhciBoYWRDb25zdHJ1Y3RvciA9IGZhbHNlO1xuICBjbGFzc0JvZHkuYm9keSA9IFtdO1xuICB0aGlzLmV4cGVjdCh0eXBlcy5icmFjZUwpO1xuICB3aGlsZSAoIXRoaXMuZWF0KHR5cGVzLmJyYWNlUikpIHtcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMkMS5wYXJzZUNsYXNzRWxlbWVudChub2RlLnN1cGVyQ2xhc3MgIT09IG51bGwpO1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBjbGFzc0JvZHkuYm9keS5wdXNoKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJNZXRob2REZWZpbml0aW9uXCIgJiYgZWxlbWVudC5raW5kID09PSBcImNvbnN0cnVjdG9yXCIpIHtcbiAgICAgICAgaWYgKGhhZENvbnN0cnVjdG9yKSB7IHRoaXMkMS5yYWlzZShlbGVtZW50LnN0YXJ0LCBcIkR1cGxpY2F0ZSBjb25zdHJ1Y3RvciBpbiB0aGUgc2FtZSBjbGFzc1wiKTsgfVxuICAgICAgICBoYWRDb25zdHJ1Y3RvciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG5vZGUuYm9keSA9IHRoaXMuZmluaXNoTm9kZShjbGFzc0JvZHksIFwiQ2xhc3NCb2R5XCIpO1xuICB0aGlzLnN0cmljdCA9IG9sZFN0cmljdDtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBpc1N0YXRlbWVudCA/IFwiQ2xhc3NEZWNsYXJhdGlvblwiIDogXCJDbGFzc0V4cHJlc3Npb25cIilcbn07XG5cbnBwJDEucGFyc2VDbGFzc0VsZW1lbnQgPSBmdW5jdGlvbihjb25zdHJ1Y3RvckFsbG93c1N1cGVyKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmICh0aGlzLmVhdCh0eXBlcy5zZW1pKSkgeyByZXR1cm4gbnVsbCB9XG5cbiAgdmFyIG1ldGhvZCA9IHRoaXMuc3RhcnROb2RlKCk7XG4gIHZhciB0cnlDb250ZXh0dWFsID0gZnVuY3Rpb24gKGssIG5vTGluZUJyZWFrKSB7XG4gICAgaWYgKCBub0xpbmVCcmVhayA9PT0gdm9pZCAwICkgbm9MaW5lQnJlYWsgPSBmYWxzZTtcblxuICAgIHZhciBzdGFydCA9IHRoaXMkMS5zdGFydCwgc3RhcnRMb2MgPSB0aGlzJDEuc3RhcnRMb2M7XG4gICAgaWYgKCF0aGlzJDEuZWF0Q29udGV4dHVhbChrKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIGlmICh0aGlzJDEudHlwZSAhPT0gdHlwZXMucGFyZW5MICYmICghbm9MaW5lQnJlYWsgfHwgIXRoaXMkMS5jYW5JbnNlcnRTZW1pY29sb24oKSkpIHsgcmV0dXJuIHRydWUgfVxuICAgIGlmIChtZXRob2Qua2V5KSB7IHRoaXMkMS51bmV4cGVjdGVkKCk7IH1cbiAgICBtZXRob2QuY29tcHV0ZWQgPSBmYWxzZTtcbiAgICBtZXRob2Qua2V5ID0gdGhpcyQxLnN0YXJ0Tm9kZUF0KHN0YXJ0LCBzdGFydExvYyk7XG4gICAgbWV0aG9kLmtleS5uYW1lID0gaztcbiAgICB0aGlzJDEuZmluaXNoTm9kZShtZXRob2Qua2V5LCBcIklkZW50aWZpZXJcIik7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuICBtZXRob2Quc3RhdGljID0gdHJ5Q29udGV4dHVhbChcInN0YXRpY1wiKTtcbiAgdmFyIGlzR2VuZXJhdG9yID0gdGhpcy5lYXQodHlwZXMuc3Rhcik7XG4gIHZhciBpc0FzeW5jID0gZmFsc2U7XG4gIGlmICghaXNHZW5lcmF0b3IpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDggJiYgdHJ5Q29udGV4dHVhbChcImFzeW5jXCIsIHRydWUpKSB7XG4gICAgICBpc0FzeW5jID0gdHJ1ZTtcbiAgICAgIGlzR2VuZXJhdG9yID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgdGhpcy5lYXQodHlwZXMuc3Rhcik7XG4gICAgfSBlbHNlIGlmICh0cnlDb250ZXh0dWFsKFwiZ2V0XCIpKSB7XG4gICAgICBtZXRob2Qua2luZCA9IFwiZ2V0XCI7XG4gICAgfSBlbHNlIGlmICh0cnlDb250ZXh0dWFsKFwic2V0XCIpKSB7XG4gICAgICBtZXRob2Qua2luZCA9IFwic2V0XCI7XG4gICAgfVxuICB9XG4gIGlmICghbWV0aG9kLmtleSkgeyB0aGlzLnBhcnNlUHJvcGVydHlOYW1lKG1ldGhvZCk7IH1cbiAgdmFyIGtleSA9IG1ldGhvZC5rZXk7XG4gIHZhciBhbGxvd3NEaXJlY3RTdXBlciA9IGZhbHNlO1xuICBpZiAoIW1ldGhvZC5jb21wdXRlZCAmJiAhbWV0aG9kLnN0YXRpYyAmJiAoa2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIGtleS5uYW1lID09PSBcImNvbnN0cnVjdG9yXCIgfHxcbiAgICAgIGtleS50eXBlID09PSBcIkxpdGVyYWxcIiAmJiBrZXkudmFsdWUgPT09IFwiY29uc3RydWN0b3JcIikpIHtcbiAgICBpZiAobWV0aG9kLmtpbmQgIT09IFwibWV0aG9kXCIpIHsgdGhpcy5yYWlzZShrZXkuc3RhcnQsIFwiQ29uc3RydWN0b3IgY2FuJ3QgaGF2ZSBnZXQvc2V0IG1vZGlmaWVyXCIpOyB9XG4gICAgaWYgKGlzR2VuZXJhdG9yKSB7IHRoaXMucmFpc2Uoa2V5LnN0YXJ0LCBcIkNvbnN0cnVjdG9yIGNhbid0IGJlIGEgZ2VuZXJhdG9yXCIpOyB9XG4gICAgaWYgKGlzQXN5bmMpIHsgdGhpcy5yYWlzZShrZXkuc3RhcnQsIFwiQ29uc3RydWN0b3IgY2FuJ3QgYmUgYW4gYXN5bmMgbWV0aG9kXCIpOyB9XG4gICAgbWV0aG9kLmtpbmQgPSBcImNvbnN0cnVjdG9yXCI7XG4gICAgYWxsb3dzRGlyZWN0U3VwZXIgPSBjb25zdHJ1Y3RvckFsbG93c1N1cGVyO1xuICB9IGVsc2UgaWYgKG1ldGhvZC5zdGF0aWMgJiYga2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIGtleS5uYW1lID09PSBcInByb3RvdHlwZVwiKSB7XG4gICAgdGhpcy5yYWlzZShrZXkuc3RhcnQsIFwiQ2xhc3NlcyBtYXkgbm90IGhhdmUgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgcHJvdG90eXBlXCIpO1xuICB9XG4gIHRoaXMucGFyc2VDbGFzc01ldGhvZChtZXRob2QsIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd3NEaXJlY3RTdXBlcik7XG4gIGlmIChtZXRob2Qua2luZCA9PT0gXCJnZXRcIiAmJiBtZXRob2QudmFsdWUucGFyYW1zLmxlbmd0aCAhPT0gMClcbiAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShtZXRob2QudmFsdWUuc3RhcnQsIFwiZ2V0dGVyIHNob3VsZCBoYXZlIG5vIHBhcmFtc1wiKTsgfVxuICBpZiAobWV0aG9kLmtpbmQgPT09IFwic2V0XCIgJiYgbWV0aG9kLnZhbHVlLnBhcmFtcy5sZW5ndGggIT09IDEpXG4gICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobWV0aG9kLnZhbHVlLnN0YXJ0LCBcInNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbVwiKTsgfVxuICBpZiAobWV0aG9kLmtpbmQgPT09IFwic2V0XCIgJiYgbWV0aG9kLnZhbHVlLnBhcmFtc1swXS50eXBlID09PSBcIlJlc3RFbGVtZW50XCIpXG4gICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobWV0aG9kLnZhbHVlLnBhcmFtc1swXS5zdGFydCwgXCJTZXR0ZXIgY2Fubm90IHVzZSByZXN0IHBhcmFtc1wiKTsgfVxuICByZXR1cm4gbWV0aG9kXG59O1xuXG5wcCQxLnBhcnNlQ2xhc3NNZXRob2QgPSBmdW5jdGlvbihtZXRob2QsIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd3NEaXJlY3RTdXBlcikge1xuICBtZXRob2QudmFsdWUgPSB0aGlzLnBhcnNlTWV0aG9kKGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd3NEaXJlY3RTdXBlcik7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobWV0aG9kLCBcIk1ldGhvZERlZmluaXRpb25cIilcbn07XG5cbnBwJDEucGFyc2VDbGFzc0lkID0gZnVuY3Rpb24obm9kZSwgaXNTdGF0ZW1lbnQpIHtcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMubmFtZSkge1xuICAgIG5vZGUuaWQgPSB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICBpZiAoaXNTdGF0ZW1lbnQpXG4gICAgICB7IHRoaXMuY2hlY2tMVmFsKG5vZGUuaWQsIEJJTkRfTEVYSUNBTCwgZmFsc2UpOyB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzU3RhdGVtZW50ID09PSB0cnVlKVxuICAgICAgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgIG5vZGUuaWQgPSBudWxsO1xuICB9XG59O1xuXG5wcCQxLnBhcnNlQ2xhc3NTdXBlciA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgbm9kZS5zdXBlckNsYXNzID0gdGhpcy5lYXQodHlwZXMuX2V4dGVuZHMpID8gdGhpcy5wYXJzZUV4cHJTdWJzY3JpcHRzKCkgOiBudWxsO1xufTtcblxuLy8gUGFyc2VzIG1vZHVsZSBleHBvcnQgZGVjbGFyYXRpb24uXG5cbnBwJDEucGFyc2VFeHBvcnQgPSBmdW5jdGlvbihub2RlLCBleHBvcnRzKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHRoaXMubmV4dCgpO1xuICAvLyBleHBvcnQgKiBmcm9tICcuLi4nXG4gIGlmICh0aGlzLmVhdCh0eXBlcy5zdGFyKSkge1xuICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbChcImZyb21cIik7XG4gICAgaWYgKHRoaXMudHlwZSAhPT0gdHlwZXMuc3RyaW5nKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgbm9kZS5zb3VyY2UgPSB0aGlzLnBhcnNlRXhwckF0b20oKTtcbiAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiKVxuICB9XG4gIGlmICh0aGlzLmVhdCh0eXBlcy5fZGVmYXVsdCkpIHsgLy8gZXhwb3J0IGRlZmF1bHQgLi4uXG4gICAgdGhpcy5jaGVja0V4cG9ydChleHBvcnRzLCBcImRlZmF1bHRcIiwgdGhpcy5sYXN0VG9rU3RhcnQpO1xuICAgIHZhciBpc0FzeW5jO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLl9mdW5jdGlvbiB8fCAoaXNBc3luYyA9IHRoaXMuaXNBc3luY0Z1bmN0aW9uKCkpKSB7XG4gICAgICB2YXIgZk5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBpZiAoaXNBc3luYykgeyB0aGlzLm5leHQoKTsgfVxuICAgICAgbm9kZS5kZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VGdW5jdGlvbihmTm9kZSwgRlVOQ19TVEFURU1FTlQgfCBGVU5DX05VTExBQkxFX0lELCBmYWxzZSwgaXNBc3luYyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLl9jbGFzcykge1xuICAgICAgdmFyIGNOb2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIG5vZGUuZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlQ2xhc3MoY05vZGUsIFwibnVsbGFibGVJRFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5kZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiKVxuICB9XG4gIC8vIGV4cG9ydCB2YXJ8Y29uc3R8bGV0fGZ1bmN0aW9ufGNsYXNzIC4uLlxuICBpZiAodGhpcy5zaG91bGRQYXJzZUV4cG9ydFN0YXRlbWVudCgpKSB7XG4gICAgbm9kZS5kZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VTdGF0ZW1lbnQobnVsbCk7XG4gICAgaWYgKG5vZGUuZGVjbGFyYXRpb24udHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpXG4gICAgICB7IHRoaXMuY2hlY2tWYXJpYWJsZUV4cG9ydChleHBvcnRzLCBub2RlLmRlY2xhcmF0aW9uLmRlY2xhcmF0aW9ucyk7IH1cbiAgICBlbHNlXG4gICAgICB7IHRoaXMuY2hlY2tFeHBvcnQoZXhwb3J0cywgbm9kZS5kZWNsYXJhdGlvbi5pZC5uYW1lLCBub2RlLmRlY2xhcmF0aW9uLmlkLnN0YXJ0KTsgfVxuICAgIG5vZGUuc3BlY2lmaWVycyA9IFtdO1xuICAgIG5vZGUuc291cmNlID0gbnVsbDtcbiAgfSBlbHNlIHsgLy8gZXhwb3J0IHsgeCwgeSBhcyB6IH0gW2Zyb20gJy4uLiddXG4gICAgbm9kZS5kZWNsYXJhdGlvbiA9IG51bGw7XG4gICAgbm9kZS5zcGVjaWZpZXJzID0gdGhpcy5wYXJzZUV4cG9ydFNwZWNpZmllcnMoZXhwb3J0cyk7XG4gICAgaWYgKHRoaXMuZWF0Q29udGV4dHVhbChcImZyb21cIikpIHtcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09IHR5cGVzLnN0cmluZykgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgICAgbm9kZS5zb3VyY2UgPSB0aGlzLnBhcnNlRXhwckF0b20oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBub2RlLnNwZWNpZmllcnM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIC8vIGNoZWNrIGZvciBrZXl3b3JkcyB1c2VkIGFzIGxvY2FsIG5hbWVzXG4gICAgICAgIHZhciBzcGVjID0gbGlzdFtpXTtcblxuICAgICAgICB0aGlzJDEuY2hlY2tVbnJlc2VydmVkKHNwZWMubG9jYWwpO1xuICAgICAgICAvLyBjaGVjayBpZiBleHBvcnQgaXMgZGVmaW5lZFxuICAgICAgICB0aGlzJDEuY2hlY2tMb2NhbEV4cG9ydChzcGVjLmxvY2FsKTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zb3VyY2UgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnNlbWljb2xvbigpO1xuICB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCIpXG59O1xuXG5wcCQxLmNoZWNrRXhwb3J0ID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgcG9zKSB7XG4gIGlmICghZXhwb3J0cykgeyByZXR1cm4gfVxuICBpZiAoaGFzKGV4cG9ydHMsIG5hbWUpKVxuICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHBvcywgXCJEdXBsaWNhdGUgZXhwb3J0ICdcIiArIG5hbWUgKyBcIidcIik7IH1cbiAgZXhwb3J0c1tuYW1lXSA9IHRydWU7XG59O1xuXG5wcCQxLmNoZWNrUGF0dGVybkV4cG9ydCA9IGZ1bmN0aW9uKGV4cG9ydHMsIHBhdCkge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgdHlwZSA9IHBhdC50eXBlO1xuICBpZiAodHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpXG4gICAgeyB0aGlzLmNoZWNrRXhwb3J0KGV4cG9ydHMsIHBhdC5uYW1lLCBwYXQuc3RhcnQpOyB9XG4gIGVsc2UgaWYgKHR5cGUgPT09IFwiT2JqZWN0UGF0dGVyblwiKVxuICAgIHsgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBwYXQucHJvcGVydGllczsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpXG4gICAgICB7XG4gICAgICAgIHZhciBwcm9wID0gbGlzdFtpXTtcblxuICAgICAgICB0aGlzJDEuY2hlY2tQYXR0ZXJuRXhwb3J0KGV4cG9ydHMsIHByb3ApO1xuICAgICAgfSB9XG4gIGVsc2UgaWYgKHR5cGUgPT09IFwiQXJyYXlQYXR0ZXJuXCIpXG4gICAgeyBmb3IgKHZhciBpJDEgPSAwLCBsaXN0JDEgPSBwYXQuZWxlbWVudHM7IGkkMSA8IGxpc3QkMS5sZW5ndGg7IGkkMSArPSAxKSB7XG4gICAgICB2YXIgZWx0ID0gbGlzdCQxW2kkMV07XG5cbiAgICAgICAgaWYgKGVsdCkgeyB0aGlzJDEuY2hlY2tQYXR0ZXJuRXhwb3J0KGV4cG9ydHMsIGVsdCk7IH1cbiAgICB9IH1cbiAgZWxzZSBpZiAodHlwZSA9PT0gXCJQcm9wZXJ0eVwiKVxuICAgIHsgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgcGF0LnZhbHVlKTsgfVxuICBlbHNlIGlmICh0eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpXG4gICAgeyB0aGlzLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLCBwYXQubGVmdCk7IH1cbiAgZWxzZSBpZiAodHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiKVxuICAgIHsgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgcGF0LmFyZ3VtZW50KTsgfVxuICBlbHNlIGlmICh0eXBlID09PSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIpXG4gICAgeyB0aGlzLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLCBwYXQuZXhwcmVzc2lvbik7IH1cbn07XG5cbnBwJDEuY2hlY2tWYXJpYWJsZUV4cG9ydCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlY2xzKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmICghZXhwb3J0cykgeyByZXR1cm4gfVxuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IGRlY2xzOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSlcbiAgICB7XG4gICAgdmFyIGRlY2wgPSBsaXN0W2ldO1xuXG4gICAgdGhpcyQxLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLCBkZWNsLmlkKTtcbiAgfVxufTtcblxucHAkMS5zaG91bGRQYXJzZUV4cG9ydFN0YXRlbWVudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy50eXBlLmtleXdvcmQgPT09IFwidmFyXCIgfHxcbiAgICB0aGlzLnR5cGUua2V5d29yZCA9PT0gXCJjb25zdFwiIHx8XG4gICAgdGhpcy50eXBlLmtleXdvcmQgPT09IFwiY2xhc3NcIiB8fFxuICAgIHRoaXMudHlwZS5rZXl3b3JkID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0aGlzLmlzTGV0KCkgfHxcbiAgICB0aGlzLmlzQXN5bmNGdW5jdGlvbigpXG59O1xuXG4vLyBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgZXhwb3J0cy5cblxucHAkMS5wYXJzZUV4cG9ydFNwZWNpZmllcnMgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBub2RlcyA9IFtdLCBmaXJzdCA9IHRydWU7XG4gIC8vIGV4cG9ydCB7IHgsIHkgYXMgeiB9IFtmcm9tICcuLi4nXVxuICB0aGlzLmV4cGVjdCh0eXBlcy5icmFjZUwpO1xuICB3aGlsZSAoIXRoaXMuZWF0KHR5cGVzLmJyYWNlUikpIHtcbiAgICBpZiAoIWZpcnN0KSB7XG4gICAgICB0aGlzJDEuZXhwZWN0KHR5cGVzLmNvbW1hKTtcbiAgICAgIGlmICh0aGlzJDEuYWZ0ZXJUcmFpbGluZ0NvbW1hKHR5cGVzLmJyYWNlUikpIHsgYnJlYWsgfVxuICAgIH0gZWxzZSB7IGZpcnN0ID0gZmFsc2U7IH1cblxuICAgIHZhciBub2RlID0gdGhpcyQxLnN0YXJ0Tm9kZSgpO1xuICAgIG5vZGUubG9jYWwgPSB0aGlzJDEucGFyc2VJZGVudCh0cnVlKTtcbiAgICBub2RlLmV4cG9ydGVkID0gdGhpcyQxLmVhdENvbnRleHR1YWwoXCJhc1wiKSA/IHRoaXMkMS5wYXJzZUlkZW50KHRydWUpIDogbm9kZS5sb2NhbDtcbiAgICB0aGlzJDEuY2hlY2tFeHBvcnQoZXhwb3J0cywgbm9kZS5leHBvcnRlZC5uYW1lLCBub2RlLmV4cG9ydGVkLnN0YXJ0KTtcbiAgICBub2Rlcy5wdXNoKHRoaXMkMS5maW5pc2hOb2RlKG5vZGUsIFwiRXhwb3J0U3BlY2lmaWVyXCIpKTtcbiAgfVxuICByZXR1cm4gbm9kZXNcbn07XG5cbi8vIFBhcnNlcyBpbXBvcnQgZGVjbGFyYXRpb24uXG5cbnBwJDEucGFyc2VJbXBvcnQgPSBmdW5jdGlvbihub2RlKSB7XG4gIHRoaXMubmV4dCgpO1xuICAvLyBpbXBvcnQgJy4uLidcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc3RyaW5nKSB7XG4gICAgbm9kZS5zcGVjaWZpZXJzID0gZW1wdHk7XG4gICAgbm9kZS5zb3VyY2UgPSB0aGlzLnBhcnNlRXhwckF0b20oKTtcbiAgfSBlbHNlIHtcbiAgICBub2RlLnNwZWNpZmllcnMgPSB0aGlzLnBhcnNlSW1wb3J0U3BlY2lmaWVycygpO1xuICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbChcImZyb21cIik7XG4gICAgbm9kZS5zb3VyY2UgPSB0aGlzLnR5cGUgPT09IHR5cGVzLnN0cmluZyA/IHRoaXMucGFyc2VFeHByQXRvbSgpIDogdGhpcy51bmV4cGVjdGVkKCk7XG4gIH1cbiAgdGhpcy5zZW1pY29sb24oKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydERlY2xhcmF0aW9uXCIpXG59O1xuXG4vLyBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgaW1wb3J0cy5cblxucHAkMS5wYXJzZUltcG9ydFNwZWNpZmllcnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIG5vZGVzID0gW10sIGZpcnN0ID0gdHJ1ZTtcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMubmFtZSkge1xuICAgIC8vIGltcG9ydCBkZWZhdWx0T2JqLCB7IHgsIHkgYXMgeiB9IGZyb20gJy4uLidcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgbm9kZS5sb2NhbCA9IHRoaXMucGFyc2VJZGVudCgpO1xuICAgIHRoaXMuY2hlY2tMVmFsKG5vZGUubG9jYWwsIEJJTkRfTEVYSUNBTCk7XG4gICAgbm9kZXMucHVzaCh0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpKTtcbiAgICBpZiAoIXRoaXMuZWF0KHR5cGVzLmNvbW1hKSkgeyByZXR1cm4gbm9kZXMgfVxuICB9XG4gIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLnN0YXIpIHtcbiAgICB2YXIgbm9kZSQxID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwoXCJhc1wiKTtcbiAgICBub2RlJDEubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICB0aGlzLmNoZWNrTFZhbChub2RlJDEubG9jYWwsIEJJTkRfTEVYSUNBTCk7XG4gICAgbm9kZXMucHVzaCh0aGlzLmZpbmlzaE5vZGUobm9kZSQxLCBcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiKSk7XG4gICAgcmV0dXJuIG5vZGVzXG4gIH1cbiAgdGhpcy5leHBlY3QodHlwZXMuYnJhY2VMKTtcbiAgd2hpbGUgKCF0aGlzLmVhdCh0eXBlcy5icmFjZVIpKSB7XG4gICAgaWYgKCFmaXJzdCkge1xuICAgICAgdGhpcyQxLmV4cGVjdCh0eXBlcy5jb21tYSk7XG4gICAgICBpZiAodGhpcyQxLmFmdGVyVHJhaWxpbmdDb21tYSh0eXBlcy5icmFjZVIpKSB7IGJyZWFrIH1cbiAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICB2YXIgbm9kZSQyID0gdGhpcyQxLnN0YXJ0Tm9kZSgpO1xuICAgIG5vZGUkMi5pbXBvcnRlZCA9IHRoaXMkMS5wYXJzZUlkZW50KHRydWUpO1xuICAgIGlmICh0aGlzJDEuZWF0Q29udGV4dHVhbChcImFzXCIpKSB7XG4gICAgICBub2RlJDIubG9jYWwgPSB0aGlzJDEucGFyc2VJZGVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzJDEuY2hlY2tVbnJlc2VydmVkKG5vZGUkMi5pbXBvcnRlZCk7XG4gICAgICBub2RlJDIubG9jYWwgPSBub2RlJDIuaW1wb3J0ZWQ7XG4gICAgfVxuICAgIHRoaXMkMS5jaGVja0xWYWwobm9kZSQyLmxvY2FsLCBCSU5EX0xFWElDQUwpO1xuICAgIG5vZGVzLnB1c2godGhpcyQxLmZpbmlzaE5vZGUobm9kZSQyLCBcIkltcG9ydFNwZWNpZmllclwiKSk7XG4gIH1cbiAgcmV0dXJuIG5vZGVzXG59O1xuXG4vLyBTZXQgYEV4cHJlc3Npb25TdGF0ZW1lbnQjZGlyZWN0aXZlYCBwcm9wZXJ0eSBmb3IgZGlyZWN0aXZlIHByb2xvZ3Vlcy5cbnBwJDEuYWRhcHREaXJlY3RpdmVQcm9sb2d1ZSA9IGZ1bmN0aW9uKHN0YXRlbWVudHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzLmxlbmd0aCAmJiB0aGlzLmlzRGlyZWN0aXZlQ2FuZGlkYXRlKHN0YXRlbWVudHNbaV0pOyArK2kpIHtcbiAgICBzdGF0ZW1lbnRzW2ldLmRpcmVjdGl2ZSA9IHN0YXRlbWVudHNbaV0uZXhwcmVzc2lvbi5yYXcuc2xpY2UoMSwgLTEpO1xuICB9XG59O1xucHAkMS5pc0RpcmVjdGl2ZUNhbmRpZGF0ZSA9IGZ1bmN0aW9uKHN0YXRlbWVudCkge1xuICByZXR1cm4gKFxuICAgIHN0YXRlbWVudC50eXBlID09PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiAmJlxuICAgIHN0YXRlbWVudC5leHByZXNzaW9uLnR5cGUgPT09IFwiTGl0ZXJhbFwiICYmXG4gICAgdHlwZW9mIHN0YXRlbWVudC5leHByZXNzaW9uLnZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgLy8gUmVqZWN0IHBhcmVudGhlc2l6ZWQgc3RyaW5ncy5cbiAgICAodGhpcy5pbnB1dFtzdGF0ZW1lbnQuc3RhcnRdID09PSBcIlxcXCJcIiB8fCB0aGlzLmlucHV0W3N0YXRlbWVudC5zdGFydF0gPT09IFwiJ1wiKVxuICApXG59O1xuXG52YXIgcHAkMiA9IFBhcnNlci5wcm90b3R5cGU7XG5cbi8vIENvbnZlcnQgZXhpc3RpbmcgZXhwcmVzc2lvbiBhdG9tIHRvIGFzc2lnbmFibGUgcGF0dGVyblxuLy8gaWYgcG9zc2libGUuXG5cbnBwJDIudG9Bc3NpZ25hYmxlID0gZnVuY3Rpb24obm9kZSwgaXNCaW5kaW5nLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiBub2RlKSB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgaWYgKHRoaXMuaW5Bc3luYyAmJiBub2RlLm5hbWUgPT09IFwiYXdhaXRcIilcbiAgICAgICAgeyB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIFwiQ2Fubm90IHVzZSAnYXdhaXQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGFuIGFzeW5jIGZ1bmN0aW9uXCIpOyB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIk9iamVjdEV4cHJlc3Npb25cIjpcbiAgICAgIG5vZGUudHlwZSA9IFwiT2JqZWN0UGF0dGVyblwiO1xuICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHsgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7IH1cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gbm9kZS5wcm9wZXJ0aWVzOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgcHJvcCA9IGxpc3RbaV07XG5cbiAgICAgIHRoaXMkMS50b0Fzc2lnbmFibGUocHJvcCwgaXNCaW5kaW5nKTtcbiAgICAgICAgLy8gRWFybHkgZXJyb3I6XG4gICAgICAgIC8vICAgQXNzaWdubWVudFJlc3RQcm9wZXJ0eVtZaWVsZCwgQXdhaXRdIDpcbiAgICAgICAgLy8gICAgIGAuLi5gIERlc3RydWN0dXJpbmdBc3NpZ25tZW50VGFyZ2V0W1lpZWxkLCBBd2FpdF1cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICBJdCBpcyBhIFN5bnRheCBFcnJvciBpZiB8RGVzdHJ1Y3R1cmluZ0Fzc2lnbm1lbnRUYXJnZXR8IGlzIGFuIHxBcnJheUxpdGVyYWx8IG9yIGFuIHxPYmplY3RMaXRlcmFsfC5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3AudHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiICYmXG4gICAgICAgICAgKHByb3AuYXJndW1lbnQudHlwZSA9PT0gXCJBcnJheVBhdHRlcm5cIiB8fCBwcm9wLmFyZ3VtZW50LnR5cGUgPT09IFwiT2JqZWN0UGF0dGVyblwiKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzJDEucmFpc2UocHJvcC5hcmd1bWVudC5zdGFydCwgXCJVbmV4cGVjdGVkIHRva2VuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIlByb3BlcnR5XCI6XG4gICAgICAvLyBBc3NpZ25tZW50UHJvcGVydHkgaGFzIHR5cGUgPT09IFwiUHJvcGVydHlcIlxuICAgICAgaWYgKG5vZGUua2luZCAhPT0gXCJpbml0XCIpIHsgdGhpcy5yYWlzZShub2RlLmtleS5zdGFydCwgXCJPYmplY3QgcGF0dGVybiBjYW4ndCBjb250YWluIGdldHRlciBvciBzZXR0ZXJcIik7IH1cbiAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKG5vZGUudmFsdWUsIGlzQmluZGluZyk7XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIkFycmF5RXhwcmVzc2lvblwiOlxuICAgICAgbm9kZS50eXBlID0gXCJBcnJheVBhdHRlcm5cIjtcbiAgICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7IHRoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHRydWUpOyB9XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZUxpc3Qobm9kZS5lbGVtZW50cywgaXNCaW5kaW5nKTtcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiU3ByZWFkRWxlbWVudFwiOlxuICAgICAgbm9kZS50eXBlID0gXCJSZXN0RWxlbWVudFwiO1xuICAgICAgdGhpcy50b0Fzc2lnbmFibGUobm9kZS5hcmd1bWVudCwgaXNCaW5kaW5nKTtcbiAgICAgIGlmIChub2RlLmFyZ3VtZW50LnR5cGUgPT09IFwiQXNzaWdubWVudFBhdHRlcm5cIilcbiAgICAgICAgeyB0aGlzLnJhaXNlKG5vZGUuYXJndW1lbnQuc3RhcnQsIFwiUmVzdCBlbGVtZW50cyBjYW5ub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWVcIik7IH1cbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgIGlmIChub2RlLm9wZXJhdG9yICE9PSBcIj1cIikgeyB0aGlzLnJhaXNlKG5vZGUubGVmdC5lbmQsIFwiT25seSAnPScgb3BlcmF0b3IgY2FuIGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgZGVmYXVsdCB2YWx1ZS5cIik7IH1cbiAgICAgIG5vZGUudHlwZSA9IFwiQXNzaWdubWVudFBhdHRlcm5cIjtcbiAgICAgIGRlbGV0ZSBub2RlLm9wZXJhdG9yO1xuICAgICAgdGhpcy50b0Fzc2lnbmFibGUobm9kZS5sZWZ0LCBpc0JpbmRpbmcpO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaCB0byBBc3NpZ25tZW50UGF0dGVyblxuXG4gICAgY2FzZSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI6XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZShub2RlLmV4cHJlc3Npb24sIGlzQmluZGluZywgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgIGlmICghaXNCaW5kaW5nKSB7IGJyZWFrIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIFwiQXNzaWduaW5nIHRvIHJ2YWx1ZVwiKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykgeyB0aGlzLmNoZWNrUGF0dGVybkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0cnVlKTsgfVxuICByZXR1cm4gbm9kZVxufTtcblxuLy8gQ29udmVydCBsaXN0IG9mIGV4cHJlc3Npb24gYXRvbXMgdG8gYmluZGluZyBsaXN0LlxuXG5wcCQyLnRvQXNzaWduYWJsZUxpc3QgPSBmdW5jdGlvbihleHByTGlzdCwgaXNCaW5kaW5nKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBlbmQgPSBleHByTGlzdC5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgZWx0ID0gZXhwckxpc3RbaV07XG4gICAgaWYgKGVsdCkgeyB0aGlzJDEudG9Bc3NpZ25hYmxlKGVsdCwgaXNCaW5kaW5nKTsgfVxuICB9XG4gIGlmIChlbmQpIHtcbiAgICB2YXIgbGFzdCA9IGV4cHJMaXN0W2VuZCAtIDFdO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPT09IDYgJiYgaXNCaW5kaW5nICYmIGxhc3QgJiYgbGFzdC50eXBlID09PSBcIlJlc3RFbGVtZW50XCIgJiYgbGFzdC5hcmd1bWVudC50eXBlICE9PSBcIklkZW50aWZpZXJcIilcbiAgICAgIHsgdGhpcy51bmV4cGVjdGVkKGxhc3QuYXJndW1lbnQuc3RhcnQpOyB9XG4gIH1cbiAgcmV0dXJuIGV4cHJMaXN0XG59O1xuXG4vLyBQYXJzZXMgc3ByZWFkIGVsZW1lbnQuXG5cbnBwJDIucGFyc2VTcHJlYWQgPSBmdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3ByZWFkRWxlbWVudFwiKVxufTtcblxucHAkMi5wYXJzZVJlc3RCaW5kaW5nID0gZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgdGhpcy5uZXh0KCk7XG5cbiAgLy8gUmVzdEVsZW1lbnQgaW5zaWRlIG9mIGEgZnVuY3Rpb24gcGFyYW1ldGVyIG11c3QgYmUgYW4gaWRlbnRpZmllclxuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID09PSA2ICYmIHRoaXMudHlwZSAhPT0gdHlwZXMubmFtZSlcbiAgICB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG5cbiAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuXG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJSZXN0RWxlbWVudFwiKVxufTtcblxuLy8gUGFyc2VzIGx2YWx1ZSAoYXNzaWduYWJsZSkgYXRvbS5cblxucHAkMi5wYXJzZUJpbmRpbmdBdG9tID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgY2FzZSB0eXBlcy5icmFja2V0TDpcbiAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgbm9kZS5lbGVtZW50cyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdCh0eXBlcy5icmFja2V0UiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXJyYXlQYXR0ZXJuXCIpXG5cbiAgICBjYXNlIHR5cGVzLmJyYWNlTDpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqKHRydWUpXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzLnBhcnNlSWRlbnQoKVxufTtcblxucHAkMi5wYXJzZUJpbmRpbmdMaXN0ID0gZnVuY3Rpb24oY2xvc2UsIGFsbG93RW1wdHksIGFsbG93VHJhaWxpbmdDb21tYSkge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgZWx0cyA9IFtdLCBmaXJzdCA9IHRydWU7XG4gIHdoaWxlICghdGhpcy5lYXQoY2xvc2UpKSB7XG4gICAgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7IH1cbiAgICBlbHNlIHsgdGhpcyQxLmV4cGVjdCh0eXBlcy5jb21tYSk7IH1cbiAgICBpZiAoYWxsb3dFbXB0eSAmJiB0aGlzJDEudHlwZSA9PT0gdHlwZXMuY29tbWEpIHtcbiAgICAgIGVsdHMucHVzaChudWxsKTtcbiAgICB9IGVsc2UgaWYgKGFsbG93VHJhaWxpbmdDb21tYSAmJiB0aGlzJDEuYWZ0ZXJUcmFpbGluZ0NvbW1hKGNsb3NlKSkge1xuICAgICAgYnJlYWtcbiAgICB9IGVsc2UgaWYgKHRoaXMkMS50eXBlID09PSB0eXBlcy5lbGxpcHNpcykge1xuICAgICAgdmFyIHJlc3QgPSB0aGlzJDEucGFyc2VSZXN0QmluZGluZygpO1xuICAgICAgdGhpcyQxLnBhcnNlQmluZGluZ0xpc3RJdGVtKHJlc3QpO1xuICAgICAgZWx0cy5wdXNoKHJlc3QpO1xuICAgICAgaWYgKHRoaXMkMS50eXBlID09PSB0eXBlcy5jb21tYSkgeyB0aGlzJDEucmFpc2UodGhpcyQxLnN0YXJ0LCBcIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudFwiKTsgfVxuICAgICAgdGhpcyQxLmV4cGVjdChjbG9zZSk7XG4gICAgICBicmVha1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWxlbSA9IHRoaXMkMS5wYXJzZU1heWJlRGVmYXVsdCh0aGlzJDEuc3RhcnQsIHRoaXMkMS5zdGFydExvYyk7XG4gICAgICB0aGlzJDEucGFyc2VCaW5kaW5nTGlzdEl0ZW0oZWxlbSk7XG4gICAgICBlbHRzLnB1c2goZWxlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbHRzXG59O1xuXG5wcCQyLnBhcnNlQmluZGluZ0xpc3RJdGVtID0gZnVuY3Rpb24ocGFyYW0pIHtcbiAgcmV0dXJuIHBhcmFtXG59O1xuXG4vLyBQYXJzZXMgYXNzaWdubWVudCBwYXR0ZXJuIGFyb3VuZCBnaXZlbiBhdG9tIGlmIHBvc3NpYmxlLlxuXG5wcCQyLnBhcnNlTWF5YmVEZWZhdWx0ID0gZnVuY3Rpb24oc3RhcnRQb3MsIHN0YXJ0TG9jLCBsZWZ0KSB7XG4gIGxlZnQgPSBsZWZ0IHx8IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgNiB8fCAhdGhpcy5lYXQodHlwZXMuZXEpKSB7IHJldHVybiBsZWZ0IH1cbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gIG5vZGUubGVmdCA9IGxlZnQ7XG4gIG5vZGUucmlnaHQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpXG59O1xuXG4vLyBWZXJpZnkgdGhhdCBhIG5vZGUgaXMgYW4gbHZhbCDigJQgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGFzc2lnbmVkXG4vLyB0by5cbi8vIGJpbmRpbmdUeXBlIGNhbiBiZSBlaXRoZXI6XG4vLyAndmFyJyBpbmRpY2F0aW5nIHRoYXQgdGhlIGx2YWwgY3JlYXRlcyBhICd2YXInIGJpbmRpbmdcbi8vICdsZXQnIGluZGljYXRpbmcgdGhhdCB0aGUgbHZhbCBjcmVhdGVzIGEgbGV4aWNhbCAoJ2xldCcgb3IgJ2NvbnN0JykgYmluZGluZ1xuLy8gJ25vbmUnIGluZGljYXRpbmcgdGhhdCB0aGUgYmluZGluZyBzaG91bGQgYmUgY2hlY2tlZCBmb3IgaWxsZWdhbCBpZGVudGlmaWVycywgYnV0IG5vdCBmb3IgZHVwbGljYXRlIHJlZmVyZW5jZXNcblxucHAkMi5jaGVja0xWYWwgPSBmdW5jdGlvbihleHByLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuICBpZiAoIGJpbmRpbmdUeXBlID09PSB2b2lkIDAgKSBiaW5kaW5nVHlwZSA9IEJJTkRfTk9ORTtcblxuICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgIGlmICh0aGlzLnN0cmljdCAmJiB0aGlzLnJlc2VydmVkV29yZHNTdHJpY3RCaW5kLnRlc3QoZXhwci5uYW1lKSlcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGV4cHIuc3RhcnQsIChiaW5kaW5nVHlwZSA/IFwiQmluZGluZyBcIiA6IFwiQXNzaWduaW5nIHRvIFwiKSArIGV4cHIubmFtZSArIFwiIGluIHN0cmljdCBtb2RlXCIpOyB9XG4gICAgaWYgKGNoZWNrQ2xhc2hlcykge1xuICAgICAgaWYgKGhhcyhjaGVja0NsYXNoZXMsIGV4cHIubmFtZSkpXG4gICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGV4cHIuc3RhcnQsIFwiQXJndW1lbnQgbmFtZSBjbGFzaFwiKTsgfVxuICAgICAgY2hlY2tDbGFzaGVzW2V4cHIubmFtZV0gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoYmluZGluZ1R5cGUgIT09IEJJTkRfTk9ORSAmJiBiaW5kaW5nVHlwZSAhPT0gQklORF9PVVRTSURFKSB7IHRoaXMuZGVjbGFyZU5hbWUoZXhwci5uYW1lLCBiaW5kaW5nVHlwZSwgZXhwci5zdGFydCk7IH1cbiAgICBicmVha1xuXG4gIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgaWYgKGJpbmRpbmdUeXBlKSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCBcIkJpbmRpbmcgbWVtYmVyIGV4cHJlc3Npb25cIik7IH1cbiAgICBicmVha1xuXG4gIGNhc2UgXCJPYmplY3RQYXR0ZXJuXCI6XG4gICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBleHByLnByb3BlcnRpZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAge1xuICAgIHZhciBwcm9wID0gbGlzdFtpXTtcblxuICAgIHRoaXMkMS5jaGVja0xWYWwocHJvcCwgYmluZGluZ1R5cGUsIGNoZWNrQ2xhc2hlcyk7XG4gIH1cbiAgICBicmVha1xuXG4gIGNhc2UgXCJQcm9wZXJ0eVwiOlxuICAgIC8vIEFzc2lnbm1lbnRQcm9wZXJ0eSBoYXMgdHlwZSA9PT0gXCJQcm9wZXJ0eVwiXG4gICAgdGhpcy5jaGVja0xWYWwoZXhwci52YWx1ZSwgYmluZGluZ1R5cGUsIGNoZWNrQ2xhc2hlcyk7XG4gICAgYnJlYWtcblxuICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgZm9yICh2YXIgaSQxID0gMCwgbGlzdCQxID0gZXhwci5lbGVtZW50czsgaSQxIDwgbGlzdCQxLmxlbmd0aDsgaSQxICs9IDEpIHtcbiAgICAgIHZhciBlbGVtID0gbGlzdCQxW2kkMV07XG5cbiAgICBpZiAoZWxlbSkgeyB0aGlzJDEuY2hlY2tMVmFsKGVsZW0sIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpOyB9XG4gICAgfVxuICAgIGJyZWFrXG5cbiAgY2FzZSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI6XG4gICAgdGhpcy5jaGVja0xWYWwoZXhwci5sZWZ0LCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTtcbiAgICBicmVha1xuXG4gIGNhc2UgXCJSZXN0RWxlbWVudFwiOlxuICAgIHRoaXMuY2hlY2tMVmFsKGV4cHIuYXJndW1lbnQsIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpO1xuICAgIGJyZWFrXG5cbiAgY2FzZSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6XG4gICAgdGhpcy5jaGVja0xWYWwoZXhwci5leHByZXNzaW9uLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTtcbiAgICBicmVha1xuXG4gIGRlZmF1bHQ6XG4gICAgdGhpcy5yYWlzZShleHByLnN0YXJ0LCAoYmluZGluZ1R5cGUgPyBcIkJpbmRpbmdcIiA6IFwiQXNzaWduaW5nIHRvXCIpICsgXCIgcnZhbHVlXCIpO1xuICB9XG59O1xuXG4vLyBBIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciBvcGVyYXRlcyBieSBkZWZpbmluZyBmdW5jdGlvbnMgZm9yIGFsbFxuLy8gc3ludGFjdGljIGVsZW1lbnRzLCBhbmQgcmVjdXJzaXZlbHkgY2FsbGluZyB0aG9zZSwgZWFjaCBmdW5jdGlvblxuLy8gYWR2YW5jaW5nIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHJldHVybmluZyBhbiBBU1Qgbm9kZS4gUHJlY2VkZW5jZVxuLy8gb2YgY29uc3RydWN0cyAoZm9yIGV4YW1wbGUsIHRoZSBmYWN0IHRoYXQgYCF4WzFdYCBtZWFucyBgISh4WzFdKWBcbi8vIGluc3RlYWQgb2YgYCgheClbMV1gIGlzIGhhbmRsZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcGFyc2VyXG4vLyBmdW5jdGlvbiB0aGF0IHBhcnNlcyB1bmFyeSBwcmVmaXggb3BlcmF0b3JzIGlzIGNhbGxlZCBmaXJzdCwgYW5kXG4vLyBpbiB0dXJuIGNhbGxzIHRoZSBmdW5jdGlvbiB0aGF0IHBhcnNlcyBgW11gIHN1YnNjcmlwdHMg4oCUIHRoYXRcbi8vIHdheSwgaXQnbGwgcmVjZWl2ZSB0aGUgbm9kZSBmb3IgYHhbMV1gIGFscmVhZHkgcGFyc2VkLCBhbmQgd3JhcHNcbi8vICp0aGF0KiBpbiB0aGUgdW5hcnkgb3BlcmF0b3Igbm9kZS5cbi8vXG4vLyBBY29ybiB1c2VzIGFuIFtvcGVyYXRvciBwcmVjZWRlbmNlIHBhcnNlcl1bb3BwXSB0byBoYW5kbGUgYmluYXJ5XG4vLyBvcGVyYXRvciBwcmVjZWRlbmNlLCBiZWNhdXNlIGl0IGlzIG11Y2ggbW9yZSBjb21wYWN0IHRoYW4gdXNpbmdcbi8vIHRoZSB0ZWNobmlxdWUgb3V0bGluZWQgYWJvdmUsIHdoaWNoIHVzZXMgZGlmZmVyZW50LCBuZXN0aW5nXG4vLyBmdW5jdGlvbnMgdG8gc3BlY2lmeSBwcmVjZWRlbmNlLCBmb3IgYWxsIG9mIHRoZSB0ZW4gYmluYXJ5XG4vLyBwcmVjZWRlbmNlIGxldmVscyB0aGF0IEphdmFTY3JpcHQgZGVmaW5lcy5cbi8vXG4vLyBbb3BwXTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcGVyYXRvci1wcmVjZWRlbmNlX3BhcnNlclxuXG52YXIgcHAkMyA9IFBhcnNlci5wcm90b3R5cGU7XG5cbi8vIENoZWNrIGlmIHByb3BlcnR5IG5hbWUgY2xhc2hlcyB3aXRoIGFscmVhZHkgYWRkZWQuXG4vLyBPYmplY3QvY2xhc3MgZ2V0dGVycyBhbmQgc2V0dGVycyBhcmUgbm90IGFsbG93ZWQgdG8gY2xhc2gg4oCUXG4vLyBlaXRoZXIgd2l0aCBlYWNoIG90aGVyIG9yIHdpdGggYW4gaW5pdCBwcm9wZXJ0eSDigJQgYW5kIGluXG4vLyBzdHJpY3QgbW9kZSwgaW5pdCBwcm9wZXJ0aWVzIGFyZSBhbHNvIG5vdCBhbGxvd2VkIHRvIGJlIHJlcGVhdGVkLlxuXG5wcCQzLmNoZWNrUHJvcENsYXNoID0gZnVuY3Rpb24ocHJvcCwgcHJvcEhhc2gsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ICYmIHByb3AudHlwZSA9PT0gXCJTcHJlYWRFbGVtZW50XCIpXG4gICAgeyByZXR1cm4gfVxuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgKHByb3AuY29tcHV0ZWQgfHwgcHJvcC5tZXRob2QgfHwgcHJvcC5zaG9ydGhhbmQpKVxuICAgIHsgcmV0dXJuIH1cbiAgdmFyIGtleSA9IHByb3Aua2V5O1xuICB2YXIgbmFtZTtcbiAgc3dpdGNoIChrZXkudHlwZSkge1xuICBjYXNlIFwiSWRlbnRpZmllclwiOiBuYW1lID0ga2V5Lm5hbWU7IGJyZWFrXG4gIGNhc2UgXCJMaXRlcmFsXCI6IG5hbWUgPSBTdHJpbmcoa2V5LnZhbHVlKTsgYnJlYWtcbiAgZGVmYXVsdDogcmV0dXJuXG4gIH1cbiAgdmFyIGtpbmQgPSBwcm9wLmtpbmQ7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgIGlmIChuYW1lID09PSBcIl9fcHJvdG9fX1wiICYmIGtpbmQgPT09IFwiaW5pdFwiKSB7XG4gICAgICBpZiAocHJvcEhhc2gucHJvdG8pIHtcbiAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgJiYgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5kb3VibGVQcm90byA8IDApIHsgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5kb3VibGVQcm90byA9IGtleS5zdGFydDsgfVxuICAgICAgICAvLyBCYWNrd2FyZHMtY29tcGF0IGtsdWRnZS4gQ2FuIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiA2LjBcbiAgICAgICAgZWxzZSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShrZXkuc3RhcnQsIFwiUmVkZWZpbml0aW9uIG9mIF9fcHJvdG9fXyBwcm9wZXJ0eVwiKTsgfVxuICAgICAgfVxuICAgICAgcHJvcEhhc2gucHJvdG8gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBuYW1lID0gXCIkXCIgKyBuYW1lO1xuICB2YXIgb3RoZXIgPSBwcm9wSGFzaFtuYW1lXTtcbiAgaWYgKG90aGVyKSB7XG4gICAgdmFyIHJlZGVmaW5pdGlvbjtcbiAgICBpZiAoa2luZCA9PT0gXCJpbml0XCIpIHtcbiAgICAgIHJlZGVmaW5pdGlvbiA9IHRoaXMuc3RyaWN0ICYmIG90aGVyLmluaXQgfHwgb3RoZXIuZ2V0IHx8IG90aGVyLnNldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVkZWZpbml0aW9uID0gb3RoZXIuaW5pdCB8fCBvdGhlcltraW5kXTtcbiAgICB9XG4gICAgaWYgKHJlZGVmaW5pdGlvbilcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGtleS5zdGFydCwgXCJSZWRlZmluaXRpb24gb2YgcHJvcGVydHlcIik7IH1cbiAgfSBlbHNlIHtcbiAgICBvdGhlciA9IHByb3BIYXNoW25hbWVdID0ge1xuICAgICAgaW5pdDogZmFsc2UsXG4gICAgICBnZXQ6IGZhbHNlLFxuICAgICAgc2V0OiBmYWxzZVxuICAgIH07XG4gIH1cbiAgb3RoZXJba2luZF0gPSB0cnVlO1xufTtcblxuLy8gIyMjIEV4cHJlc3Npb24gcGFyc2luZ1xuXG4vLyBUaGVzZSBuZXN0LCBmcm9tIHRoZSBtb3N0IGdlbmVyYWwgZXhwcmVzc2lvbiB0eXBlIGF0IHRoZSB0b3AgdG9cbi8vICdhdG9taWMnLCBub25kaXZpc2libGUgZXhwcmVzc2lvbiB0eXBlcyBhdCB0aGUgYm90dG9tLiBNb3N0IG9mXG4vLyB0aGUgZnVuY3Rpb25zIHdpbGwgc2ltcGx5IGxldCB0aGUgZnVuY3Rpb24ocykgYmVsb3cgdGhlbSBwYXJzZSxcbi8vIGFuZCwgKmlmKiB0aGUgc3ludGFjdGljIGNvbnN0cnVjdCB0aGV5IGhhbmRsZSBpcyBwcmVzZW50LCB3cmFwXG4vLyB0aGUgQVNUIG5vZGUgdGhhdCB0aGUgaW5uZXIgcGFyc2VyIGdhdmUgdGhlbSBpbiBhbm90aGVyIG5vZGUuXG5cbi8vIFBhcnNlIGEgZnVsbCBleHByZXNzaW9uLiBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIGFyZSB1c2VkIHRvXG4vLyBmb3JiaWQgdGhlIGBpbmAgb3BlcmF0b3IgKGluIGZvciBsb29wcyBpbml0YWxpemF0aW9uIGV4cHJlc3Npb25zKVxuLy8gYW5kIHByb3ZpZGUgcmVmZXJlbmNlIGZvciBzdG9yaW5nICc9JyBvcGVyYXRvciBpbnNpZGUgc2hvcnRoYW5kXG4vLyBwcm9wZXJ0eSBhc3NpZ25tZW50IGluIGNvbnRleHRzIHdoZXJlIGJvdGggb2JqZWN0IGV4cHJlc3Npb25cbi8vIGFuZCBvYmplY3QgcGF0dGVybiBtaWdodCBhcHBlYXIgKHNvIGl0J3MgcG9zc2libGUgdG8gcmFpc2Vcbi8vIGRlbGF5ZWQgc3ludGF4IGVycm9yIGF0IGNvcnJlY3QgcG9zaXRpb24pLlxuXG5wcCQzLnBhcnNlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICB2YXIgZXhwciA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuY29tbWEpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICBub2RlLmV4cHJlc3Npb25zID0gW2V4cHJdO1xuICAgIHdoaWxlICh0aGlzLmVhdCh0eXBlcy5jb21tYSkpIHsgbm9kZS5leHByZXNzaW9ucy5wdXNoKHRoaXMkMS5wYXJzZU1heWJlQXNzaWduKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpKTsgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJTZXF1ZW5jZUV4cHJlc3Npb25cIilcbiAgfVxuICByZXR1cm4gZXhwclxufTtcblxuLy8gUGFyc2UgYW4gYXNzaWdubWVudCBleHByZXNzaW9uLiBUaGlzIGluY2x1ZGVzIGFwcGxpY2F0aW9ucyBvZlxuLy8gb3BlcmF0b3JzIGxpa2UgYCs9YC5cblxucHAkMy5wYXJzZU1heWJlQXNzaWduID0gZnVuY3Rpb24obm9JbiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgYWZ0ZXJMZWZ0UGFyc2UpIHtcbiAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKFwieWllbGRcIikpIHtcbiAgICBpZiAodGhpcy5pbkdlbmVyYXRvcikgeyByZXR1cm4gdGhpcy5wYXJzZVlpZWxkKG5vSW4pIH1cbiAgICAvLyBUaGUgdG9rZW5pemVyIHdpbGwgYXNzdW1lIGFuIGV4cHJlc3Npb24gaXMgYWxsb3dlZCBhZnRlclxuICAgIC8vIGB5aWVsZGAsIGJ1dCB0aGlzIGlzbid0IHRoYXQga2luZCBvZiB5aWVsZFxuICAgIGVsc2UgeyB0aGlzLmV4cHJBbGxvd2VkID0gZmFsc2U7IH1cbiAgfVxuXG4gIHZhciBvd25EZXN0cnVjdHVyaW5nRXJyb3JzID0gZmFsc2UsIG9sZFBhcmVuQXNzaWduID0gLTEsIG9sZFRyYWlsaW5nQ29tbWEgPSAtMSwgb2xkU2hvcnRoYW5kQXNzaWduID0gLTE7XG4gIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gICAgb2xkUGFyZW5Bc3NpZ24gPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ247XG4gICAgb2xkVHJhaWxpbmdDb21tYSA9IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYTtcbiAgICBvbGRTaG9ydGhhbmRBc3NpZ24gPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbjtcbiAgICByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ24gPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbiA9IC0xO1xuICB9IGVsc2Uge1xuICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgPSBuZXcgRGVzdHJ1Y3R1cmluZ0Vycm9ycztcbiAgICBvd25EZXN0cnVjdHVyaW5nRXJyb3JzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMucGFyZW5MIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMubmFtZSlcbiAgICB7IHRoaXMucG90ZW50aWFsQXJyb3dBdCA9IHRoaXMuc3RhcnQ7IH1cbiAgdmFyIGxlZnQgPSB0aGlzLnBhcnNlTWF5YmVDb25kaXRpb25hbChub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgaWYgKGFmdGVyTGVmdFBhcnNlKSB7IGxlZnQgPSBhZnRlckxlZnRQYXJzZS5jYWxsKHRoaXMsIGxlZnQsIHN0YXJ0UG9zLCBzdGFydExvYyk7IH1cbiAgaWYgKHRoaXMudHlwZS5pc0Fzc2lnbikge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUub3BlcmF0b3IgPSB0aGlzLnZhbHVlO1xuICAgIG5vZGUubGVmdCA9IHRoaXMudHlwZSA9PT0gdHlwZXMuZXEgPyB0aGlzLnRvQXNzaWduYWJsZShsZWZ0LCBmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykgOiBsZWZ0O1xuICAgIGlmICghb3duRGVzdHJ1Y3R1cmluZ0Vycm9ycykgeyBEZXN0cnVjdHVyaW5nRXJyb3JzLmNhbGwocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7IH1cbiAgICByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbiA9IC0xOyAvLyByZXNldCBiZWNhdXNlIHNob3J0aGFuZCBkZWZhdWx0IHdhcyB1c2VkIGNvcnJlY3RseVxuICAgIHRoaXMuY2hlY2tMVmFsKGxlZnQpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUucmlnaHQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24obm9Jbik7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIpXG4gIH0gZWxzZSB7XG4gICAgaWYgKG93bkRlc3RydWN0dXJpbmdFcnJvcnMpIHsgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7IH1cbiAgfVxuICBpZiAob2xkUGFyZW5Bc3NpZ24gPiAtMSkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ24gPSBvbGRQYXJlbkFzc2lnbjsgfVxuICBpZiAob2xkVHJhaWxpbmdDb21tYSA+IC0xKSB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA9IG9sZFRyYWlsaW5nQ29tbWE7IH1cbiAgaWYgKG9sZFNob3J0aGFuZEFzc2lnbiA+IC0xKSB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuc2hvcnRoYW5kQXNzaWduID0gb2xkU2hvcnRoYW5kQXNzaWduOyB9XG4gIHJldHVybiBsZWZ0XG59O1xuXG4vLyBQYXJzZSBhIHRlcm5hcnkgY29uZGl0aW9uYWwgKGA/OmApIG9wZXJhdG9yLlxuXG5wcCQzLnBhcnNlTWF5YmVDb25kaXRpb25hbCA9IGZ1bmN0aW9uKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICB2YXIgZXhwciA9IHRoaXMucGFyc2VFeHByT3BzKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICBpZiAodGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykpIHsgcmV0dXJuIGV4cHIgfVxuICBpZiAodGhpcy5lYXQodHlwZXMucXVlc3Rpb24pKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgbm9kZS50ZXN0ID0gZXhwcjtcbiAgICBub2RlLmNvbnNlcXVlbnQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5jb2xvbik7XG4gICAgbm9kZS5hbHRlcm5hdGUgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24obm9Jbik7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKVxuICB9XG4gIHJldHVybiBleHByXG59O1xuXG4vLyBTdGFydCB0aGUgcHJlY2VkZW5jZSBwYXJzZXIuXG5cbnBwJDMucGFyc2VFeHByT3BzID0gZnVuY3Rpb24obm9JbiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gIHZhciBleHByID0gdGhpcy5wYXJzZU1heWJlVW5hcnkocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgZmFsc2UpO1xuICBpZiAodGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykpIHsgcmV0dXJuIGV4cHIgfVxuICByZXR1cm4gZXhwci5zdGFydCA9PT0gc3RhcnRQb3MgJiYgZXhwci50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgPyBleHByIDogdGhpcy5wYXJzZUV4cHJPcChleHByLCBzdGFydFBvcywgc3RhcnRMb2MsIC0xLCBub0luKVxufTtcblxuLy8gUGFyc2UgYmluYXJ5IG9wZXJhdG9ycyB3aXRoIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlIHBhcnNpbmdcbi8vIGFsZ29yaXRobS4gYGxlZnRgIGlzIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IuXG4vLyBgbWluUHJlY2AgcHJvdmlkZXMgY29udGV4dCB0aGF0IGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gc3RvcCBhbmRcbi8vIGRlZmVyIGZ1cnRoZXIgcGFyc2VyIHRvIG9uZSBvZiBpdHMgY2FsbGVycyB3aGVuIGl0IGVuY291bnRlcnMgYW5cbi8vIG9wZXJhdG9yIHRoYXQgaGFzIGEgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIHRoZSBzZXQgaXQgaXMgcGFyc2luZy5cblxucHAkMy5wYXJzZUV4cHJPcCA9IGZ1bmN0aW9uKGxlZnQsIGxlZnRTdGFydFBvcywgbGVmdFN0YXJ0TG9jLCBtaW5QcmVjLCBub0luKSB7XG4gIHZhciBwcmVjID0gdGhpcy50eXBlLmJpbm9wO1xuICBpZiAocHJlYyAhPSBudWxsICYmICghbm9JbiB8fCB0aGlzLnR5cGUgIT09IHR5cGVzLl9pbikpIHtcbiAgICBpZiAocHJlYyA+IG1pblByZWMpIHtcbiAgICAgIHZhciBsb2dpY2FsID0gdGhpcy50eXBlID09PSB0eXBlcy5sb2dpY2FsT1IgfHwgdGhpcy50eXBlID09PSB0eXBlcy5sb2dpY2FsQU5EO1xuICAgICAgdmFyIG9wID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5wYXJzZUV4cHJPcCh0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCBmYWxzZSksIHN0YXJ0UG9zLCBzdGFydExvYywgcHJlYywgbm9Jbik7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuYnVpbGRCaW5hcnkobGVmdFN0YXJ0UG9zLCBsZWZ0U3RhcnRMb2MsIGxlZnQsIHJpZ2h0LCBvcCwgbG9naWNhbCk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJPcChub2RlLCBsZWZ0U3RhcnRQb3MsIGxlZnRTdGFydExvYywgbWluUHJlYywgbm9JbilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxlZnRcbn07XG5cbnBwJDMuYnVpbGRCaW5hcnkgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MsIGxlZnQsIHJpZ2h0LCBvcCwgbG9naWNhbCkge1xuICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgbm9kZS5sZWZ0ID0gbGVmdDtcbiAgbm9kZS5vcGVyYXRvciA9IG9wO1xuICBub2RlLnJpZ2h0ID0gcmlnaHQ7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgbG9naWNhbCA/IFwiTG9naWNhbEV4cHJlc3Npb25cIiA6IFwiQmluYXJ5RXhwcmVzc2lvblwiKVxufTtcblxuLy8gUGFyc2UgdW5hcnkgb3BlcmF0b3JzLCBib3RoIHByZWZpeCBhbmQgcG9zdGZpeC5cblxucHAkMy5wYXJzZU1heWJlVW5hcnkgPSBmdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBzYXdVbmFyeSkge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2MsIGV4cHI7XG4gIGlmICh0aGlzLmlzQ29udGV4dHVhbChcImF3YWl0XCIpICYmICh0aGlzLmluQXN5bmMgfHwgKCF0aGlzLmluRnVuY3Rpb24gJiYgdGhpcy5vcHRpb25zLmFsbG93QXdhaXRPdXRzaWRlRnVuY3Rpb24pKSkge1xuICAgIGV4cHIgPSB0aGlzLnBhcnNlQXdhaXQoKTtcbiAgICBzYXdVbmFyeSA9IHRydWU7XG4gIH0gZWxzZSBpZiAodGhpcy50eXBlLnByZWZpeCkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKSwgdXBkYXRlID0gdGhpcy50eXBlID09PSB0eXBlcy5pbmNEZWM7XG4gICAgbm9kZS5vcGVyYXRvciA9IHRoaXMudmFsdWU7XG4gICAgbm9kZS5wcmVmaXggPSB0cnVlO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCB0cnVlKTtcbiAgICB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0cnVlKTtcbiAgICBpZiAodXBkYXRlKSB7IHRoaXMuY2hlY2tMVmFsKG5vZGUuYXJndW1lbnQpOyB9XG4gICAgZWxzZSBpZiAodGhpcy5zdHJpY3QgJiYgbm9kZS5vcGVyYXRvciA9PT0gXCJkZWxldGVcIiAmJlxuICAgICAgICAgICAgIG5vZGUuYXJndW1lbnQudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShub2RlLnN0YXJ0LCBcIkRlbGV0aW5nIGxvY2FsIHZhcmlhYmxlIGluIHN0cmljdCBtb2RlXCIpOyB9XG4gICAgZWxzZSB7IHNhd1VuYXJ5ID0gdHJ1ZTsgfVxuICAgIGV4cHIgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgdXBkYXRlID8gXCJVcGRhdGVFeHByZXNzaW9uXCIgOiBcIlVuYXJ5RXhwcmVzc2lvblwiKTtcbiAgfSBlbHNlIHtcbiAgICBleHByID0gdGhpcy5wYXJzZUV4cHJTdWJzY3JpcHRzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIGlmICh0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSkgeyByZXR1cm4gZXhwciB9XG4gICAgd2hpbGUgKHRoaXMudHlwZS5wb3N0Zml4ICYmICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpKSB7XG4gICAgICB2YXIgbm9kZSQxID0gdGhpcyQxLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgICBub2RlJDEub3BlcmF0b3IgPSB0aGlzJDEudmFsdWU7XG4gICAgICBub2RlJDEucHJlZml4ID0gZmFsc2U7XG4gICAgICBub2RlJDEuYXJndW1lbnQgPSBleHByO1xuICAgICAgdGhpcyQxLmNoZWNrTFZhbChleHByKTtcbiAgICAgIHRoaXMkMS5uZXh0KCk7XG4gICAgICBleHByID0gdGhpcyQxLmZpbmlzaE5vZGUobm9kZSQxLCBcIlVwZGF0ZUV4cHJlc3Npb25cIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFzYXdVbmFyeSAmJiB0aGlzLmVhdCh0eXBlcy5zdGFyc3RhcikpXG4gICAgeyByZXR1cm4gdGhpcy5idWlsZEJpbmFyeShzdGFydFBvcywgc3RhcnRMb2MsIGV4cHIsIHRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsIGZhbHNlKSwgXCIqKlwiLCBmYWxzZSkgfVxuICBlbHNlXG4gICAgeyByZXR1cm4gZXhwciB9XG59O1xuXG4vLyBQYXJzZSBjYWxsLCBkb3QsIGFuZCBgW11gLXN1YnNjcmlwdCBleHByZXNzaW9ucy5cblxucHAkMy5wYXJzZUV4cHJTdWJzY3JpcHRzID0gZnVuY3Rpb24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHJBdG9tKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICB2YXIgc2tpcEFycm93U3Vic2NyaXB0cyA9IGV4cHIudHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiICYmIHRoaXMuaW5wdXQuc2xpY2UodGhpcy5sYXN0VG9rU3RhcnQsIHRoaXMubGFzdFRva0VuZCkgIT09IFwiKVwiO1xuICBpZiAodGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykgfHwgc2tpcEFycm93U3Vic2NyaXB0cykgeyByZXR1cm4gZXhwciB9XG4gIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlU3Vic2NyaXB0cyhleHByLCBzdGFydFBvcywgc3RhcnRMb2MpO1xuICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyAmJiByZXN1bHQudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduID49IHJlc3VsdC5zdGFydCkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ24gPSAtMTsgfVxuICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kID49IHJlc3VsdC5zdGFydCkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kID0gLTE7IH1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59O1xuXG5wcCQzLnBhcnNlU3Vic2NyaXB0cyA9IGZ1bmN0aW9uKGJhc2UsIHN0YXJ0UG9zLCBzdGFydExvYywgbm9DYWxscykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgbWF5YmVBc3luY0Fycm93ID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDggJiYgYmFzZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBiYXNlLm5hbWUgPT09IFwiYXN5bmNcIiAmJlxuICAgICAgdGhpcy5sYXN0VG9rRW5kID09PSBiYXNlLmVuZCAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSAmJiB0aGlzLmlucHV0LnNsaWNlKGJhc2Uuc3RhcnQsIGJhc2UuZW5kKSA9PT0gXCJhc3luY1wiO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcyQxLnBhcnNlU3Vic2NyaXB0KGJhc2UsIHN0YXJ0UG9zLCBzdGFydExvYywgbm9DYWxscywgbWF5YmVBc3luY0Fycm93KTtcbiAgICBpZiAoZWxlbWVudCA9PT0gYmFzZSB8fCBlbGVtZW50LnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIikgeyByZXR1cm4gZWxlbWVudCB9XG4gICAgYmFzZSA9IGVsZW1lbnQ7XG4gIH1cbn07XG5cbnBwJDMucGFyc2VTdWJzY3JpcHQgPSBmdW5jdGlvbihiYXNlLCBzdGFydFBvcywgc3RhcnRMb2MsIG5vQ2FsbHMsIG1heWJlQXN5bmNBcnJvdykge1xuICB2YXIgY29tcHV0ZWQgPSB0aGlzLmVhdCh0eXBlcy5icmFja2V0TCk7XG4gIGlmIChjb21wdXRlZCB8fCB0aGlzLmVhdCh0eXBlcy5kb3QpKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgbm9kZS5vYmplY3QgPSBiYXNlO1xuICAgIG5vZGUucHJvcGVydHkgPSBjb21wdXRlZCA/IHRoaXMucGFyc2VFeHByZXNzaW9uKCkgOiB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG4gICAgbm9kZS5jb21wdXRlZCA9ICEhY29tcHV0ZWQ7XG4gICAgaWYgKGNvbXB1dGVkKSB7IHRoaXMuZXhwZWN0KHR5cGVzLmJyYWNrZXRSKTsgfVxuICAgIGJhc2UgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJNZW1iZXJFeHByZXNzaW9uXCIpO1xuICB9IGVsc2UgaWYgKCFub0NhbGxzICYmIHRoaXMuZWF0KHR5cGVzLnBhcmVuTCkpIHtcbiAgICB2YXIgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyA9IG5ldyBEZXN0cnVjdHVyaW5nRXJyb3JzLCBvbGRZaWVsZFBvcyA9IHRoaXMueWllbGRQb3MsIG9sZEF3YWl0UG9zID0gdGhpcy5hd2FpdFBvcywgb2xkQXdhaXRJZGVudFBvcyA9IHRoaXMuYXdhaXRJZGVudFBvcztcbiAgICB0aGlzLnlpZWxkUG9zID0gMDtcbiAgICB0aGlzLmF3YWl0UG9zID0gMDtcbiAgICB0aGlzLmF3YWl0SWRlbnRQb3MgPSAwO1xuICAgIHZhciBleHByTGlzdCA9IHRoaXMucGFyc2VFeHByTGlzdCh0eXBlcy5wYXJlblIsIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4LCBmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgaWYgKG1heWJlQXN5bmNBcnJvdyAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSAmJiB0aGlzLmVhdCh0eXBlcy5hcnJvdykpIHtcbiAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGZhbHNlKTtcbiAgICAgIHRoaXMuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCk7XG4gICAgICBpZiAodGhpcy5hd2FpdElkZW50UG9zID4gMClcbiAgICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuYXdhaXRJZGVudFBvcywgXCJDYW5ub3QgdXNlICdhd2FpdCcgYXMgaWRlbnRpZmllciBpbnNpZGUgYW4gYXN5bmMgZnVuY3Rpb25cIik7IH1cbiAgICAgIHRoaXMueWllbGRQb3MgPSBvbGRZaWVsZFBvcztcbiAgICAgIHRoaXMuYXdhaXRQb3MgPSBvbGRBd2FpdFBvcztcbiAgICAgIHRoaXMuYXdhaXRJZGVudFBvcyA9IG9sZEF3YWl0SWRlbnRQb3M7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUFycm93RXhwcmVzc2lvbih0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyksIGV4cHJMaXN0LCB0cnVlKVxuICAgIH1cbiAgICB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0cnVlKTtcbiAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3MgfHwgdGhpcy55aWVsZFBvcztcbiAgICB0aGlzLmF3YWl0UG9zID0gb2xkQXdhaXRQb3MgfHwgdGhpcy5hd2FpdFBvcztcbiAgICB0aGlzLmF3YWl0SWRlbnRQb3MgPSBvbGRBd2FpdElkZW50UG9zIHx8IHRoaXMuYXdhaXRJZGVudFBvcztcbiAgICB2YXIgbm9kZSQxID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUkMS5jYWxsZWUgPSBiYXNlO1xuICAgIG5vZGUkMS5hcmd1bWVudHMgPSBleHByTGlzdDtcbiAgICBiYXNlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUkMSwgXCJDYWxsRXhwcmVzc2lvblwiKTtcbiAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLmJhY2tRdW90ZSkge1xuICAgIHZhciBub2RlJDIgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgbm9kZSQyLnRhZyA9IGJhc2U7XG4gICAgbm9kZSQyLnF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlKHtpc1RhZ2dlZDogdHJ1ZX0pO1xuICAgIGJhc2UgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSQyLCBcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiKTtcbiAgfVxuICByZXR1cm4gYmFzZVxufTtcblxuLy8gUGFyc2UgYW4gYXRvbWljIGV4cHJlc3Npb24g4oCUIGVpdGhlciBhIHNpbmdsZSB0b2tlbiB0aGF0IGlzIGFuXG4vLyBleHByZXNzaW9uLCBhbiBleHByZXNzaW9uIHN0YXJ0ZWQgYnkgYSBrZXl3b3JkIGxpa2UgYGZ1bmN0aW9uYCBvclxuLy8gYG5ld2AsIG9yIGFuIGV4cHJlc3Npb24gd3JhcHBlZCBpbiBwdW5jdHVhdGlvbiBsaWtlIGAoKWAsIGBbXWAsXG4vLyBvciBge31gLlxuXG5wcCQzLnBhcnNlRXhwckF0b20gPSBmdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIC8vIElmIGEgZGl2aXNpb24gb3BlcmF0b3IgYXBwZWFycyBpbiBhbiBleHByZXNzaW9uIHBvc2l0aW9uLCB0aGVcbiAgLy8gdG9rZW5pemVyIGdvdCBjb25mdXNlZCwgYW5kIHdlIGZvcmNlIGl0IHRvIHJlYWQgYSByZWdleHAgaW5zdGVhZC5cbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc2xhc2gpIHsgdGhpcy5yZWFkUmVnZXhwKCk7IH1cblxuICB2YXIgbm9kZSwgY2FuQmVBcnJvdyA9IHRoaXMucG90ZW50aWFsQXJyb3dBdCA9PT0gdGhpcy5zdGFydDtcbiAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgY2FzZSB0eXBlcy5fc3VwZXI6XG4gICAgaWYgKCF0aGlzLmFsbG93U3VwZXIpXG4gICAgICB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCInc3VwZXInIGtleXdvcmQgb3V0c2lkZSBhIG1ldGhvZFwiKTsgfVxuICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLnBhcmVuTCAmJiAhdGhpcy5hbGxvd0RpcmVjdFN1cGVyKVxuICAgICAgeyB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIFwic3VwZXIoKSBjYWxsIG91dHNpZGUgY29uc3RydWN0b3Igb2YgYSBzdWJjbGFzc1wiKTsgfVxuICAgIC8vIFRoZSBgc3VwZXJgIGtleXdvcmQgY2FuIGFwcGVhciBhdCBiZWxvdzpcbiAgICAvLyBTdXBlclByb3BlcnR5OlxuICAgIC8vICAgICBzdXBlciBbIEV4cHJlc3Npb24gXVxuICAgIC8vICAgICBzdXBlciAuIElkZW50aWZpZXJOYW1lXG4gICAgLy8gU3VwZXJDYWxsOlxuICAgIC8vICAgICBzdXBlciBBcmd1bWVudHNcbiAgICBpZiAodGhpcy50eXBlICE9PSB0eXBlcy5kb3QgJiYgdGhpcy50eXBlICE9PSB0eXBlcy5icmFja2V0TCAmJiB0aGlzLnR5cGUgIT09IHR5cGVzLnBhcmVuTClcbiAgICAgIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3VwZXJcIilcblxuICBjYXNlIHR5cGVzLl90aGlzOlxuICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUaGlzRXhwcmVzc2lvblwiKVxuXG4gIGNhc2UgdHlwZXMubmFtZTpcbiAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2MsIGNvbnRhaW5zRXNjID0gdGhpcy5jb250YWluc0VzYztcbiAgICB2YXIgaWQgPSB0aGlzLnBhcnNlSWRlbnQoZmFsc2UpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCAmJiAhY29udGFpbnNFc2MgJiYgaWQubmFtZSA9PT0gXCJhc3luY1wiICYmICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpICYmIHRoaXMuZWF0KHR5cGVzLl9mdW5jdGlvbikpXG4gICAgICB7IHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpLCAwLCBmYWxzZSwgdHJ1ZSkgfVxuICAgIGlmIChjYW5CZUFycm93ICYmICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpKSB7XG4gICAgICBpZiAodGhpcy5lYXQodHlwZXMuYXJyb3cpKVxuICAgICAgICB7IHJldHVybiB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKSwgW2lkXSwgZmFsc2UpIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCAmJiBpZC5uYW1lID09PSBcImFzeW5jXCIgJiYgdGhpcy50eXBlID09PSB0eXBlcy5uYW1lICYmICFjb250YWluc0VzYykge1xuICAgICAgICBpZCA9IHRoaXMucGFyc2VJZGVudChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmNhbkluc2VydFNlbWljb2xvbigpIHx8ICF0aGlzLmVhdCh0eXBlcy5hcnJvdykpXG4gICAgICAgICAgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUFycm93RXhwcmVzc2lvbih0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyksIFtpZF0sIHRydWUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpZFxuXG4gIGNhc2UgdHlwZXMucmVnZXhwOlxuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgbm9kZSA9IHRoaXMucGFyc2VMaXRlcmFsKHZhbHVlLnZhbHVlKTtcbiAgICBub2RlLnJlZ2V4ID0ge3BhdHRlcm46IHZhbHVlLnBhdHRlcm4sIGZsYWdzOiB2YWx1ZS5mbGFnc307XG4gICAgcmV0dXJuIG5vZGVcblxuICBjYXNlIHR5cGVzLm51bTogY2FzZSB0eXBlcy5zdHJpbmc6XG4gICAgcmV0dXJuIHRoaXMucGFyc2VMaXRlcmFsKHRoaXMudmFsdWUpXG5cbiAgY2FzZSB0eXBlcy5fbnVsbDogY2FzZSB0eXBlcy5fdHJ1ZTogY2FzZSB0eXBlcy5fZmFsc2U6XG4gICAgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgbm9kZS52YWx1ZSA9IHRoaXMudHlwZSA9PT0gdHlwZXMuX251bGwgPyBudWxsIDogdGhpcy50eXBlID09PSB0eXBlcy5fdHJ1ZTtcbiAgICBub2RlLnJhdyA9IHRoaXMudHlwZS5rZXl3b3JkO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJMaXRlcmFsXCIpXG5cbiAgY2FzZSB0eXBlcy5wYXJlbkw6XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5zdGFydCwgZXhwciA9IHRoaXMucGFyc2VQYXJlbkFuZERpc3Rpbmd1aXNoRXhwcmVzc2lvbihjYW5CZUFycm93KTtcbiAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA8IDAgJiYgIXRoaXMuaXNTaW1wbGVBc3NpZ25UYXJnZXQoZXhwcikpXG4gICAgICAgIHsgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduID0gc3RhcnQ7IH1cbiAgICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kIDwgMClcbiAgICAgICAgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kID0gc3RhcnQ7IH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cHJcblxuICBjYXNlIHR5cGVzLmJyYWNrZXRMOlxuICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUuZWxlbWVudHMgPSB0aGlzLnBhcnNlRXhwckxpc3QodHlwZXMuYnJhY2tldFIsIHRydWUsIHRydWUsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBcnJheUV4cHJlc3Npb25cIilcblxuICBjYXNlIHR5cGVzLmJyYWNlTDpcbiAgICByZXR1cm4gdGhpcy5wYXJzZU9iaihmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycylcblxuICBjYXNlIHR5cGVzLl9mdW5jdGlvbjpcbiAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uKG5vZGUsIDApXG5cbiAgY2FzZSB0eXBlcy5fY2xhc3M6XG4gICAgcmV0dXJuIHRoaXMucGFyc2VDbGFzcyh0aGlzLnN0YXJ0Tm9kZSgpLCBmYWxzZSlcblxuICBjYXNlIHR5cGVzLl9uZXc6XG4gICAgcmV0dXJuIHRoaXMucGFyc2VOZXcoKVxuXG4gIGNhc2UgdHlwZXMuYmFja1F1b3RlOlxuICAgIHJldHVybiB0aGlzLnBhcnNlVGVtcGxhdGUoKVxuXG4gIGRlZmF1bHQ6XG4gICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gIH1cbn07XG5cbnBwJDMucGFyc2VMaXRlcmFsID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICBub2RlLnZhbHVlID0gdmFsdWU7XG4gIG5vZGUucmF3ID0gdGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7XG4gIHRoaXMubmV4dCgpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTGl0ZXJhbFwiKVxufTtcblxucHAkMy5wYXJzZVBhcmVuRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlbkwpO1xuICB2YXIgdmFsID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgdGhpcy5leHBlY3QodHlwZXMucGFyZW5SKTtcbiAgcmV0dXJuIHZhbFxufTtcblxucHAkMy5wYXJzZVBhcmVuQW5kRGlzdGluZ3Vpc2hFeHByZXNzaW9uID0gZnVuY3Rpb24oY2FuQmVBcnJvdykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2MsIHZhbCwgYWxsb3dUcmFpbGluZ0NvbW1hID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDg7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgIHRoaXMubmV4dCgpO1xuXG4gICAgdmFyIGlubmVyU3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBpbm5lclN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICB2YXIgZXhwckxpc3QgPSBbXSwgZmlyc3QgPSB0cnVlLCBsYXN0SXNDb21tYSA9IGZhbHNlO1xuICAgIHZhciByZWZEZXN0cnVjdHVyaW5nRXJyb3JzID0gbmV3IERlc3RydWN0dXJpbmdFcnJvcnMsIG9sZFlpZWxkUG9zID0gdGhpcy55aWVsZFBvcywgb2xkQXdhaXRQb3MgPSB0aGlzLmF3YWl0UG9zLCBzcHJlYWRTdGFydDtcbiAgICB0aGlzLnlpZWxkUG9zID0gMDtcbiAgICB0aGlzLmF3YWl0UG9zID0gMDtcbiAgICAvLyBEbyBub3Qgc2F2ZSBhd2FpdElkZW50UG9zIHRvIGFsbG93IGNoZWNraW5nIGF3YWl0cyBuZXN0ZWQgaW4gcGFyYW1ldGVyc1xuICAgIHdoaWxlICh0aGlzLnR5cGUgIT09IHR5cGVzLnBhcmVuUikge1xuICAgICAgZmlyc3QgPyBmaXJzdCA9IGZhbHNlIDogdGhpcyQxLmV4cGVjdCh0eXBlcy5jb21tYSk7XG4gICAgICBpZiAoYWxsb3dUcmFpbGluZ0NvbW1hICYmIHRoaXMkMS5hZnRlclRyYWlsaW5nQ29tbWEodHlwZXMucGFyZW5SLCB0cnVlKSkge1xuICAgICAgICBsYXN0SXNDb21tYSA9IHRydWU7XG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2UgaWYgKHRoaXMkMS50eXBlID09PSB0eXBlcy5lbGxpcHNpcykge1xuICAgICAgICBzcHJlYWRTdGFydCA9IHRoaXMkMS5zdGFydDtcbiAgICAgICAgZXhwckxpc3QucHVzaCh0aGlzJDEucGFyc2VQYXJlbkl0ZW0odGhpcyQxLnBhcnNlUmVzdEJpbmRpbmcoKSkpO1xuICAgICAgICBpZiAodGhpcyQxLnR5cGUgPT09IHR5cGVzLmNvbW1hKSB7IHRoaXMkMS5yYWlzZSh0aGlzJDEuc3RhcnQsIFwiQ29tbWEgaXMgbm90IHBlcm1pdHRlZCBhZnRlciB0aGUgcmVzdCBlbGVtZW50XCIpOyB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHByTGlzdC5wdXNoKHRoaXMkMS5wYXJzZU1heWJlQXNzaWduKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0aGlzJDEucGFyc2VQYXJlbkl0ZW0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGlubmVyRW5kUG9zID0gdGhpcy5zdGFydCwgaW5uZXJFbmRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLnBhcmVuUik7XG5cbiAgICBpZiAoY2FuQmVBcnJvdyAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSAmJiB0aGlzLmVhdCh0eXBlcy5hcnJvdykpIHtcbiAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGZhbHNlKTtcbiAgICAgIHRoaXMuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCk7XG4gICAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3M7XG4gICAgICB0aGlzLmF3YWl0UG9zID0gb2xkQXdhaXRQb3M7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVBhcmVuQXJyb3dMaXN0KHN0YXJ0UG9zLCBzdGFydExvYywgZXhwckxpc3QpXG4gICAgfVxuXG4gICAgaWYgKCFleHByTGlzdC5sZW5ndGggfHwgbGFzdElzQ29tbWEpIHsgdGhpcy51bmV4cGVjdGVkKHRoaXMubGFzdFRva1N0YXJ0KTsgfVxuICAgIGlmIChzcHJlYWRTdGFydCkgeyB0aGlzLnVuZXhwZWN0ZWQoc3ByZWFkU3RhcnQpOyB9XG4gICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gICAgdGhpcy55aWVsZFBvcyA9IG9sZFlpZWxkUG9zIHx8IHRoaXMueWllbGRQb3M7XG4gICAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zIHx8IHRoaXMuYXdhaXRQb3M7XG5cbiAgICBpZiAoZXhwckxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgdmFsID0gdGhpcy5zdGFydE5vZGVBdChpbm5lclN0YXJ0UG9zLCBpbm5lclN0YXJ0TG9jKTtcbiAgICAgIHZhbC5leHByZXNzaW9ucyA9IGV4cHJMaXN0O1xuICAgICAgdGhpcy5maW5pc2hOb2RlQXQodmFsLCBcIlNlcXVlbmNlRXhwcmVzc2lvblwiLCBpbm5lckVuZFBvcywgaW5uZXJFbmRMb2MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWwgPSBleHByTGlzdFswXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICB9XG5cbiAgaWYgKHRoaXMub3B0aW9ucy5wcmVzZXJ2ZVBhcmVucykge1xuICAgIHZhciBwYXIgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgcGFyLmV4cHJlc3Npb24gPSB2YWw7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShwYXIsIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsXG4gIH1cbn07XG5cbnBwJDMucGFyc2VQYXJlbkl0ZW0gPSBmdW5jdGlvbihpdGVtKSB7XG4gIHJldHVybiBpdGVtXG59O1xuXG5wcCQzLnBhcnNlUGFyZW5BcnJvd0xpc3QgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MsIGV4cHJMaXN0KSB7XG4gIHJldHVybiB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKSwgZXhwckxpc3QpXG59O1xuXG4vLyBOZXcncyBwcmVjZWRlbmNlIGlzIHNsaWdodGx5IHRyaWNreS4gSXQgbXVzdCBhbGxvdyBpdHMgYXJndW1lbnQgdG9cbi8vIGJlIGEgYFtdYCBvciBkb3Qgc3Vic2NyaXB0IGV4cHJlc3Npb24sIGJ1dCBub3QgYSBjYWxsIOKAlCBhdCBsZWFzdCxcbi8vIG5vdCB3aXRob3V0IHdyYXBwaW5nIGl0IGluIHBhcmVudGhlc2VzLiBUaHVzLCBpdCB1c2VzIHRoZSBub0NhbGxzXG4vLyBhcmd1bWVudCB0byBwYXJzZVN1YnNjcmlwdHMgdG8gcHJldmVudCBpdCBmcm9tIGNvbnN1bWluZyB0aGVcbi8vIGFyZ3VtZW50IGxpc3QuXG5cbnZhciBlbXB0eSQxID0gW107XG5cbnBwJDMucGFyc2VOZXcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB2YXIgbWV0YSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIHRoaXMuZWF0KHR5cGVzLmRvdCkpIHtcbiAgICBub2RlLm1ldGEgPSBtZXRhO1xuICAgIHZhciBjb250YWluc0VzYyA9IHRoaXMuY29udGFpbnNFc2M7XG4gICAgbm9kZS5wcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcbiAgICBpZiAobm9kZS5wcm9wZXJ0eS5uYW1lICE9PSBcInRhcmdldFwiIHx8IGNvbnRhaW5zRXNjKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5wcm9wZXJ0eS5zdGFydCwgXCJUaGUgb25seSB2YWxpZCBtZXRhIHByb3BlcnR5IGZvciBuZXcgaXMgbmV3LnRhcmdldFwiKTsgfVxuICAgIGlmICghdGhpcy5pbk5vbkFycm93RnVuY3Rpb24oKSlcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIFwibmV3LnRhcmdldCBjYW4gb25seSBiZSB1c2VkIGluIGZ1bmN0aW9uc1wiKTsgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJNZXRhUHJvcGVydHlcIilcbiAgfVxuICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gIG5vZGUuY2FsbGVlID0gdGhpcy5wYXJzZVN1YnNjcmlwdHModGhpcy5wYXJzZUV4cHJBdG9tKCksIHN0YXJ0UG9zLCBzdGFydExvYywgdHJ1ZSk7XG4gIGlmICh0aGlzLmVhdCh0eXBlcy5wYXJlbkwpKSB7IG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUV4cHJMaXN0KHR5cGVzLnBhcmVuUiwgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDgsIGZhbHNlKTsgfVxuICBlbHNlIHsgbm9kZS5hcmd1bWVudHMgPSBlbXB0eSQxOyB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJOZXdFeHByZXNzaW9uXCIpXG59O1xuXG4vLyBQYXJzZSB0ZW1wbGF0ZSBleHByZXNzaW9uLlxuXG5wcCQzLnBhcnNlVGVtcGxhdGVFbGVtZW50ID0gZnVuY3Rpb24ocmVmKSB7XG4gIHZhciBpc1RhZ2dlZCA9IHJlZi5pc1RhZ2dlZDtcblxuICB2YXIgZWxlbSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLmludmFsaWRUZW1wbGF0ZSkge1xuICAgIGlmICghaXNUYWdnZWQpIHtcbiAgICAgIHRoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLnN0YXJ0LCBcIkJhZCBlc2NhcGUgc2VxdWVuY2UgaW4gdW50YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbFwiKTtcbiAgICB9XG4gICAgZWxlbS52YWx1ZSA9IHtcbiAgICAgIHJhdzogdGhpcy52YWx1ZSxcbiAgICAgIGNvb2tlZDogbnVsbFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZWxlbS52YWx1ZSA9IHtcbiAgICAgIHJhdzogdGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCkucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKSxcbiAgICAgIGNvb2tlZDogdGhpcy52YWx1ZVxuICAgIH07XG4gIH1cbiAgdGhpcy5uZXh0KCk7XG4gIGVsZW0udGFpbCA9IHRoaXMudHlwZSA9PT0gdHlwZXMuYmFja1F1b3RlO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGVsZW0sIFwiVGVtcGxhdGVFbGVtZW50XCIpXG59O1xuXG5wcCQzLnBhcnNlVGVtcGxhdGUgPSBmdW5jdGlvbihyZWYpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG4gIGlmICggcmVmID09PSB2b2lkIDAgKSByZWYgPSB7fTtcbiAgdmFyIGlzVGFnZ2VkID0gcmVmLmlzVGFnZ2VkOyBpZiAoIGlzVGFnZ2VkID09PSB2b2lkIDAgKSBpc1RhZ2dlZCA9IGZhbHNlO1xuXG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUuZXhwcmVzc2lvbnMgPSBbXTtcbiAgdmFyIGN1ckVsdCA9IHRoaXMucGFyc2VUZW1wbGF0ZUVsZW1lbnQoe2lzVGFnZ2VkOiBpc1RhZ2dlZH0pO1xuICBub2RlLnF1YXNpcyA9IFtjdXJFbHRdO1xuICB3aGlsZSAoIWN1ckVsdC50YWlsKSB7XG4gICAgaWYgKHRoaXMkMS50eXBlID09PSB0eXBlcy5lb2YpIHsgdGhpcyQxLnJhaXNlKHRoaXMkMS5wb3MsIFwiVW50ZXJtaW5hdGVkIHRlbXBsYXRlIGxpdGVyYWxcIik7IH1cbiAgICB0aGlzJDEuZXhwZWN0KHR5cGVzLmRvbGxhckJyYWNlTCk7XG4gICAgbm9kZS5leHByZXNzaW9ucy5wdXNoKHRoaXMkMS5wYXJzZUV4cHJlc3Npb24oKSk7XG4gICAgdGhpcyQxLmV4cGVjdCh0eXBlcy5icmFjZVIpO1xuICAgIG5vZGUucXVhc2lzLnB1c2goY3VyRWx0ID0gdGhpcyQxLnBhcnNlVGVtcGxhdGVFbGVtZW50KHtpc1RhZ2dlZDogaXNUYWdnZWR9KSk7XG4gIH1cbiAgdGhpcy5uZXh0KCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUZW1wbGF0ZUxpdGVyYWxcIilcbn07XG5cbnBwJDMuaXNBc3luY1Byb3AgPSBmdW5jdGlvbihwcm9wKSB7XG4gIHJldHVybiAhcHJvcC5jb21wdXRlZCAmJiBwcm9wLmtleS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBwcm9wLmtleS5uYW1lID09PSBcImFzeW5jXCIgJiZcbiAgICAodGhpcy50eXBlID09PSB0eXBlcy5uYW1lIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMubnVtIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMuc3RyaW5nIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMuYnJhY2tldEwgfHwgdGhpcy50eXBlLmtleXdvcmQgfHwgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ICYmIHRoaXMudHlwZSA9PT0gdHlwZXMuc3RhcikpICYmXG4gICAgIWxpbmVCcmVhay50ZXN0KHRoaXMuaW5wdXQuc2xpY2UodGhpcy5sYXN0VG9rRW5kLCB0aGlzLnN0YXJ0KSlcbn07XG5cbi8vIFBhcnNlIGFuIG9iamVjdCBsaXRlcmFsIG9yIGJpbmRpbmcgcGF0dGVybi5cblxucHAkMy5wYXJzZU9iaiA9IGZ1bmN0aW9uKGlzUGF0dGVybiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksIGZpcnN0ID0gdHJ1ZSwgcHJvcEhhc2ggPSB7fTtcbiAgbm9kZS5wcm9wZXJ0aWVzID0gW107XG4gIHRoaXMubmV4dCgpO1xuICB3aGlsZSAoIXRoaXMuZWF0KHR5cGVzLmJyYWNlUikpIHtcbiAgICBpZiAoIWZpcnN0KSB7XG4gICAgICB0aGlzJDEuZXhwZWN0KHR5cGVzLmNvbW1hKTtcbiAgICAgIGlmICh0aGlzJDEuYWZ0ZXJUcmFpbGluZ0NvbW1hKHR5cGVzLmJyYWNlUikpIHsgYnJlYWsgfVxuICAgIH0gZWxzZSB7IGZpcnN0ID0gZmFsc2U7IH1cblxuICAgIHZhciBwcm9wID0gdGhpcyQxLnBhcnNlUHJvcGVydHkoaXNQYXR0ZXJuLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICBpZiAoIWlzUGF0dGVybikgeyB0aGlzJDEuY2hlY2tQcm9wQ2xhc2gocHJvcCwgcHJvcEhhc2gsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpOyB9XG4gICAgbm9kZS5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBpc1BhdHRlcm4gPyBcIk9iamVjdFBhdHRlcm5cIiA6IFwiT2JqZWN0RXhwcmVzc2lvblwiKVxufTtcblxucHAkMy5wYXJzZVByb3BlcnR5ID0gZnVuY3Rpb24oaXNQYXR0ZXJuLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBwcm9wID0gdGhpcy5zdGFydE5vZGUoKSwgaXNHZW5lcmF0b3IsIGlzQXN5bmMsIHN0YXJ0UG9zLCBzdGFydExvYztcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ICYmIHRoaXMuZWF0KHR5cGVzLmVsbGlwc2lzKSkge1xuICAgIGlmIChpc1BhdHRlcm4pIHtcbiAgICAgIHByb3AuYXJndW1lbnQgPSB0aGlzLnBhcnNlSWRlbnQoZmFsc2UpO1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuY29tbWEpIHtcbiAgICAgICAgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcCwgXCJSZXN0RWxlbWVudFwiKVxuICAgIH1cbiAgICAvLyBUbyBkaXNhbGxvdyBwYXJlbnRoZXNpemVkIGlkZW50aWZpZXIgdmlhIGB0aGlzLnRvQXNzaWduYWJsZSgpYC5cbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5wYXJlbkwgJiYgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA8IDApIHtcbiAgICAgICAgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduID0gdGhpcy5zdGFydDtcbiAgICAgIH1cbiAgICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kIDwgMCkge1xuICAgICAgICByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kID0gdGhpcy5zdGFydDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUGFyc2UgYXJndW1lbnQuXG4gICAgcHJvcC5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgLy8gVG8gZGlzYWxsb3cgdHJhaWxpbmcgY29tbWEgdmlhIGB0aGlzLnRvQXNzaWduYWJsZSgpYC5cbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5jb21tYSAmJiByZWZEZXN0cnVjdHVyaW5nRXJyb3JzICYmIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA8IDApIHtcbiAgICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuICAgIC8vIEZpbmlzaFxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcCwgXCJTcHJlYWRFbGVtZW50XCIpXG4gIH1cbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgcHJvcC5tZXRob2QgPSBmYWxzZTtcbiAgICBwcm9wLnNob3J0aGFuZCA9IGZhbHNlO1xuICAgIGlmIChpc1BhdHRlcm4gfHwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0O1xuICAgICAgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIH1cbiAgICBpZiAoIWlzUGF0dGVybilcbiAgICAgIHsgaXNHZW5lcmF0b3IgPSB0aGlzLmVhdCh0eXBlcy5zdGFyKTsgfVxuICB9XG4gIHZhciBjb250YWluc0VzYyA9IHRoaXMuY29udGFpbnNFc2M7XG4gIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWUocHJvcCk7XG4gIGlmICghaXNQYXR0ZXJuICYmICFjb250YWluc0VzYyAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCAmJiAhaXNHZW5lcmF0b3IgJiYgdGhpcy5pc0FzeW5jUHJvcChwcm9wKSkge1xuICAgIGlzQXN5bmMgPSB0cnVlO1xuICAgIGlzR2VuZXJhdG9yID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgdGhpcy5lYXQodHlwZXMuc3Rhcik7XG4gICAgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgfSBlbHNlIHtcbiAgICBpc0FzeW5jID0gZmFsc2U7XG4gIH1cbiAgdGhpcy5wYXJzZVByb3BlcnR5VmFsdWUocHJvcCwgaXNQYXR0ZXJuLCBpc0dlbmVyYXRvciwgaXNBc3luYywgc3RhcnRQb3MsIHN0YXJ0TG9jLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBjb250YWluc0VzYyk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcCwgXCJQcm9wZXJ0eVwiKVxufTtcblxucHAkMy5wYXJzZVByb3BlcnR5VmFsdWUgPSBmdW5jdGlvbihwcm9wLCBpc1BhdHRlcm4sIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBzdGFydFBvcywgc3RhcnRMb2MsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGNvbnRhaW5zRXNjKSB7XG4gIGlmICgoaXNHZW5lcmF0b3IgfHwgaXNBc3luYykgJiYgdGhpcy50eXBlID09PSB0eXBlcy5jb2xvbilcbiAgICB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG5cbiAgaWYgKHRoaXMuZWF0KHR5cGVzLmNvbG9uKSkge1xuICAgIHByb3AudmFsdWUgPSBpc1BhdHRlcm4gPyB0aGlzLnBhcnNlTWF5YmVEZWZhdWx0KHRoaXMuc3RhcnQsIHRoaXMuc3RhcnRMb2MpIDogdGhpcy5wYXJzZU1heWJlQXNzaWduKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICBwcm9wLmtpbmQgPSBcImluaXRcIjtcbiAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLnBhcmVuTCkge1xuICAgIGlmIChpc1BhdHRlcm4pIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICBwcm9wLmtpbmQgPSBcImluaXRcIjtcbiAgICBwcm9wLm1ldGhvZCA9IHRydWU7XG4gICAgcHJvcC52YWx1ZSA9IHRoaXMucGFyc2VNZXRob2QoaXNHZW5lcmF0b3IsIGlzQXN5bmMpO1xuICB9IGVsc2UgaWYgKCFpc1BhdHRlcm4gJiYgIWNvbnRhaW5zRXNjICYmXG4gICAgICAgICAgICAgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDUgJiYgIXByb3AuY29tcHV0ZWQgJiYgcHJvcC5rZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgICAgICAocHJvcC5rZXkubmFtZSA9PT0gXCJnZXRcIiB8fCBwcm9wLmtleS5uYW1lID09PSBcInNldFwiKSAmJlxuICAgICAgICAgICAgICh0aGlzLnR5cGUgIT09IHR5cGVzLmNvbW1hICYmIHRoaXMudHlwZSAhPT0gdHlwZXMuYnJhY2VSKSkge1xuICAgIGlmIChpc0dlbmVyYXRvciB8fCBpc0FzeW5jKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgcHJvcC5raW5kID0gcHJvcC5rZXkubmFtZTtcbiAgICB0aGlzLnBhcnNlUHJvcGVydHlOYW1lKHByb3ApO1xuICAgIHByb3AudmFsdWUgPSB0aGlzLnBhcnNlTWV0aG9kKGZhbHNlKTtcbiAgICB2YXIgcGFyYW1Db3VudCA9IHByb3Aua2luZCA9PT0gXCJnZXRcIiA/IDAgOiAxO1xuICAgIGlmIChwcm9wLnZhbHVlLnBhcmFtcy5sZW5ndGggIT09IHBhcmFtQ291bnQpIHtcbiAgICAgIHZhciBzdGFydCA9IHByb3AudmFsdWUuc3RhcnQ7XG4gICAgICBpZiAocHJvcC5raW5kID09PSBcImdldFwiKVxuICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShzdGFydCwgXCJnZXR0ZXIgc2hvdWxkIGhhdmUgbm8gcGFyYW1zXCIpOyB9XG4gICAgICBlbHNlXG4gICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCBcInNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbVwiKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcC5raW5kID09PSBcInNldFwiICYmIHByb3AudmFsdWUucGFyYW1zWzBdLnR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIilcbiAgICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUocHJvcC52YWx1ZS5wYXJhbXNbMF0uc3RhcnQsIFwiU2V0dGVyIGNhbm5vdCB1c2UgcmVzdCBwYXJhbXNcIik7IH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgIXByb3AuY29tcHV0ZWQgJiYgcHJvcC5rZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICBpZiAoaXNHZW5lcmF0b3IgfHwgaXNBc3luYykgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgIHRoaXMuY2hlY2tVbnJlc2VydmVkKHByb3Aua2V5KTtcbiAgICBpZiAocHJvcC5rZXkubmFtZSA9PT0gXCJhd2FpdFwiICYmICF0aGlzLmF3YWl0SWRlbnRQb3MpXG4gICAgICB7IHRoaXMuYXdhaXRJZGVudFBvcyA9IHN0YXJ0UG9zOyB9XG4gICAgcHJvcC5raW5kID0gXCJpbml0XCI7XG4gICAgaWYgKGlzUGF0dGVybikge1xuICAgICAgcHJvcC52YWx1ZSA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQoc3RhcnRQb3MsIHN0YXJ0TG9jLCBwcm9wLmtleSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLmVxICYmIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbiA8IDApXG4gICAgICAgIHsgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5zaG9ydGhhbmRBc3NpZ24gPSB0aGlzLnN0YXJ0OyB9XG4gICAgICBwcm9wLnZhbHVlID0gdGhpcy5wYXJzZU1heWJlRGVmYXVsdChzdGFydFBvcywgc3RhcnRMb2MsIHByb3Aua2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcC52YWx1ZSA9IHByb3Aua2V5O1xuICAgIH1cbiAgICBwcm9wLnNob3J0aGFuZCA9IHRydWU7XG4gIH0gZWxzZSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG59O1xuXG5wcCQzLnBhcnNlUHJvcGVydHlOYW1lID0gZnVuY3Rpb24ocHJvcCkge1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHtcbiAgICBpZiAodGhpcy5lYXQodHlwZXMuYnJhY2tldEwpKSB7XG4gICAgICBwcm9wLmNvbXB1dGVkID0gdHJ1ZTtcbiAgICAgIHByb3Aua2V5ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgICB0aGlzLmV4cGVjdCh0eXBlcy5icmFja2V0Uik7XG4gICAgICByZXR1cm4gcHJvcC5rZXlcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcC5jb21wdXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJvcC5rZXkgPSB0aGlzLnR5cGUgPT09IHR5cGVzLm51bSB8fCB0aGlzLnR5cGUgPT09IHR5cGVzLnN0cmluZyA/IHRoaXMucGFyc2VFeHByQXRvbSgpIDogdGhpcy5wYXJzZUlkZW50KHRydWUpXG59O1xuXG4vLyBJbml0aWFsaXplIGVtcHR5IGZ1bmN0aW9uIG5vZGUuXG5cbnBwJDMuaW5pdEZ1bmN0aW9uID0gZnVuY3Rpb24obm9kZSkge1xuICBub2RlLmlkID0gbnVsbDtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7IG5vZGUuZ2VuZXJhdG9yID0gbm9kZS5leHByZXNzaW9uID0gZmFsc2U7IH1cbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4KSB7IG5vZGUuYXN5bmMgPSBmYWxzZTsgfVxufTtcblxuLy8gUGFyc2Ugb2JqZWN0IG9yIGNsYXNzIG1ldGhvZC5cblxucHAkMy5wYXJzZU1ldGhvZCA9IGZ1bmN0aW9uKGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd0RpcmVjdFN1cGVyKSB7XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKSwgb2xkWWllbGRQb3MgPSB0aGlzLnlpZWxkUG9zLCBvbGRBd2FpdFBvcyA9IHRoaXMuYXdhaXRQb3MsIG9sZEF3YWl0SWRlbnRQb3MgPSB0aGlzLmF3YWl0SWRlbnRQb3M7XG5cbiAgdGhpcy5pbml0RnVuY3Rpb24obm9kZSk7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNilcbiAgICB7IG5vZGUuZ2VuZXJhdG9yID0gaXNHZW5lcmF0b3I7IH1cbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4KVxuICAgIHsgbm9kZS5hc3luYyA9ICEhaXNBc3luYzsgfVxuXG4gIHRoaXMueWllbGRQb3MgPSAwO1xuICB0aGlzLmF3YWl0UG9zID0gMDtcbiAgdGhpcy5hd2FpdElkZW50UG9zID0gMDtcbiAgdGhpcy5lbnRlclNjb3BlKGZ1bmN0aW9uRmxhZ3MoaXNBc3luYywgbm9kZS5nZW5lcmF0b3IpIHwgU0NPUEVfU1VQRVIgfCAoYWxsb3dEaXJlY3RTdXBlciA/IFNDT1BFX0RJUkVDVF9TVVBFUiA6IDApKTtcblxuICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlbkwpO1xuICBub2RlLnBhcmFtcyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdCh0eXBlcy5wYXJlblIsIGZhbHNlLCB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCk7XG4gIHRoaXMuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCk7XG4gIHRoaXMucGFyc2VGdW5jdGlvbkJvZHkobm9kZSwgZmFsc2UsIHRydWUpO1xuXG4gIHRoaXMueWllbGRQb3MgPSBvbGRZaWVsZFBvcztcbiAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zO1xuICB0aGlzLmF3YWl0SWRlbnRQb3MgPSBvbGRBd2FpdElkZW50UG9zO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpXG59O1xuXG4vLyBQYXJzZSBhcnJvdyBmdW5jdGlvbiBleHByZXNzaW9uIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cblxucHAkMy5wYXJzZUFycm93RXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG5vZGUsIHBhcmFtcywgaXNBc3luYykge1xuICB2YXIgb2xkWWllbGRQb3MgPSB0aGlzLnlpZWxkUG9zLCBvbGRBd2FpdFBvcyA9IHRoaXMuYXdhaXRQb3MsIG9sZEF3YWl0SWRlbnRQb3MgPSB0aGlzLmF3YWl0SWRlbnRQb3M7XG5cbiAgdGhpcy5lbnRlclNjb3BlKGZ1bmN0aW9uRmxhZ3MoaXNBc3luYywgZmFsc2UpIHwgU0NPUEVfQVJST1cpO1xuICB0aGlzLmluaXRGdW5jdGlvbihub2RlKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4KSB7IG5vZGUuYXN5bmMgPSAhIWlzQXN5bmM7IH1cblxuICB0aGlzLnlpZWxkUG9zID0gMDtcbiAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gIHRoaXMuYXdhaXRJZGVudFBvcyA9IDA7XG5cbiAgbm9kZS5wYXJhbXMgPSB0aGlzLnRvQXNzaWduYWJsZUxpc3QocGFyYW1zLCB0cnVlKTtcbiAgdGhpcy5wYXJzZUZ1bmN0aW9uQm9keShub2RlLCB0cnVlLCBmYWxzZSk7XG5cbiAgdGhpcy55aWVsZFBvcyA9IG9sZFlpZWxkUG9zO1xuICB0aGlzLmF3YWl0UG9zID0gb2xkQXdhaXRQb3M7XG4gIHRoaXMuYXdhaXRJZGVudFBvcyA9IG9sZEF3YWl0SWRlbnRQb3M7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiKVxufTtcblxuLy8gUGFyc2UgZnVuY3Rpb24gYm9keSBhbmQgY2hlY2sgcGFyYW1ldGVycy5cblxucHAkMy5wYXJzZUZ1bmN0aW9uQm9keSA9IGZ1bmN0aW9uKG5vZGUsIGlzQXJyb3dGdW5jdGlvbiwgaXNNZXRob2QpIHtcbiAgdmFyIGlzRXhwcmVzc2lvbiA9IGlzQXJyb3dGdW5jdGlvbiAmJiB0aGlzLnR5cGUgIT09IHR5cGVzLmJyYWNlTDtcbiAgdmFyIG9sZFN0cmljdCA9IHRoaXMuc3RyaWN0LCB1c2VTdHJpY3QgPSBmYWxzZTtcblxuICBpZiAoaXNFeHByZXNzaW9uKSB7XG4gICAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgbm9kZS5leHByZXNzaW9uID0gdHJ1ZTtcbiAgICB0aGlzLmNoZWNrUGFyYW1zKG5vZGUsIGZhbHNlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbm9uU2ltcGxlID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDcgJiYgIXRoaXMuaXNTaW1wbGVQYXJhbUxpc3Qobm9kZS5wYXJhbXMpO1xuICAgIGlmICghb2xkU3RyaWN0IHx8IG5vblNpbXBsZSkge1xuICAgICAgdXNlU3RyaWN0ID0gdGhpcy5zdHJpY3REaXJlY3RpdmUodGhpcy5lbmQpO1xuICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0cmljdCBtb2RlIGZ1bmN0aW9uLCB2ZXJpZnkgdGhhdCBhcmd1bWVudCBuYW1lc1xuICAgICAgLy8gYXJlIG5vdCByZXBlYXRlZCwgYW5kIGl0IGRvZXMgbm90IHRyeSB0byBiaW5kIHRoZSB3b3JkcyBgZXZhbGBcbiAgICAgIC8vIG9yIGBhcmd1bWVudHNgLlxuICAgICAgaWYgKHVzZVN0cmljdCAmJiBub25TaW1wbGUpXG4gICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIFwiSWxsZWdhbCAndXNlIHN0cmljdCcgZGlyZWN0aXZlIGluIGZ1bmN0aW9uIHdpdGggbm9uLXNpbXBsZSBwYXJhbWV0ZXIgbGlzdFwiKTsgfVxuICAgIH1cbiAgICAvLyBTdGFydCBhIG5ldyBzY29wZSB3aXRoIHJlZ2FyZCB0byBsYWJlbHMgYW5kIHRoZSBgaW5GdW5jdGlvbmBcbiAgICAvLyBmbGFnIChyZXN0b3JlIHRoZW0gdG8gdGhlaXIgb2xkIHZhbHVlIGFmdGVyd2FyZHMpLlxuICAgIHZhciBvbGRMYWJlbHMgPSB0aGlzLmxhYmVscztcbiAgICB0aGlzLmxhYmVscyA9IFtdO1xuICAgIGlmICh1c2VTdHJpY3QpIHsgdGhpcy5zdHJpY3QgPSB0cnVlOyB9XG5cbiAgICAvLyBBZGQgdGhlIHBhcmFtcyB0byB2YXJEZWNsYXJlZE5hbWVzIHRvIGVuc3VyZSB0aGF0IGFuIGVycm9yIGlzIHRocm93blxuICAgIC8vIGlmIGEgbGV0L2NvbnN0IGRlY2xhcmF0aW9uIGluIHRoZSBmdW5jdGlvbiBjbGFzaGVzIHdpdGggb25lIG9mIHRoZSBwYXJhbXMuXG4gICAgdGhpcy5jaGVja1BhcmFtcyhub2RlLCAhb2xkU3RyaWN0ICYmICF1c2VTdHJpY3QgJiYgIWlzQXJyb3dGdW5jdGlvbiAmJiAhaXNNZXRob2QgJiYgdGhpcy5pc1NpbXBsZVBhcmFtTGlzdChub2RlLnBhcmFtcykpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VCbG9jayhmYWxzZSk7XG4gICAgbm9kZS5leHByZXNzaW9uID0gZmFsc2U7XG4gICAgdGhpcy5hZGFwdERpcmVjdGl2ZVByb2xvZ3VlKG5vZGUuYm9keS5ib2R5KTtcbiAgICB0aGlzLmxhYmVscyA9IG9sZExhYmVscztcbiAgfVxuICB0aGlzLmV4aXRTY29wZSgpO1xuXG4gIC8vIEVuc3VyZSB0aGUgZnVuY3Rpb24gbmFtZSBpc24ndCBhIGZvcmJpZGRlbiBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlLCBlLmcuICdldmFsJ1xuICBpZiAodGhpcy5zdHJpY3QgJiYgbm9kZS5pZCkgeyB0aGlzLmNoZWNrTFZhbChub2RlLmlkLCBCSU5EX09VVFNJREUpOyB9XG4gIHRoaXMuc3RyaWN0ID0gb2xkU3RyaWN0O1xufTtcblxucHAkMy5pc1NpbXBsZVBhcmFtTGlzdCA9IGZ1bmN0aW9uKHBhcmFtcykge1xuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IHBhcmFtczsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpXG4gICAge1xuICAgIHZhciBwYXJhbSA9IGxpc3RbaV07XG5cbiAgICBpZiAocGFyYW0udHlwZSAhPT0gXCJJZGVudGlmaWVyXCIpIHsgcmV0dXJuIGZhbHNlXG4gIH0gfVxuICByZXR1cm4gdHJ1ZVxufTtcblxuLy8gQ2hlY2tzIGZ1bmN0aW9uIHBhcmFtcyBmb3IgdmFyaW91cyBkaXNhbGxvd2VkIHBhdHRlcm5zIHN1Y2ggYXMgdXNpbmcgXCJldmFsXCJcbi8vIG9yIFwiYXJndW1lbnRzXCIgYW5kIGR1cGxpY2F0ZSBwYXJhbWV0ZXJzLlxuXG5wcCQzLmNoZWNrUGFyYW1zID0gZnVuY3Rpb24obm9kZSwgYWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBuYW1lSGFzaCA9IHt9O1xuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IG5vZGUucGFyYW1zOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSlcbiAgICB7XG4gICAgdmFyIHBhcmFtID0gbGlzdFtpXTtcblxuICAgIHRoaXMkMS5jaGVja0xWYWwocGFyYW0sIEJJTkRfVkFSLCBhbGxvd0R1cGxpY2F0ZXMgPyBudWxsIDogbmFtZUhhc2gpO1xuICB9XG59O1xuXG4vLyBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucywgYW5kIHJldHVybnMgdGhlbSBhc1xuLy8gYW4gYXJyYXkuIGBjbG9zZWAgaXMgdGhlIHRva2VuIHR5cGUgdGhhdCBlbmRzIHRoZSBsaXN0LCBhbmRcbi8vIGBhbGxvd0VtcHR5YCBjYW4gYmUgdHVybmVkIG9uIHRvIGFsbG93IHN1YnNlcXVlbnQgY29tbWFzIHdpdGhcbi8vIG5vdGhpbmcgaW4gYmV0d2VlbiB0aGVtIHRvIGJlIHBhcnNlZCBhcyBgbnVsbGAgKHdoaWNoIGlzIG5lZWRlZFxuLy8gZm9yIGFycmF5IGxpdGVyYWxzKS5cblxucHAkMy5wYXJzZUV4cHJMaXN0ID0gZnVuY3Rpb24oY2xvc2UsIGFsbG93VHJhaWxpbmdDb21tYSwgYWxsb3dFbXB0eSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgZWx0cyA9IFtdLCBmaXJzdCA9IHRydWU7XG4gIHdoaWxlICghdGhpcy5lYXQoY2xvc2UpKSB7XG4gICAgaWYgKCFmaXJzdCkge1xuICAgICAgdGhpcyQxLmV4cGVjdCh0eXBlcy5jb21tYSk7XG4gICAgICBpZiAoYWxsb3dUcmFpbGluZ0NvbW1hICYmIHRoaXMkMS5hZnRlclRyYWlsaW5nQ29tbWEoY2xvc2UpKSB7IGJyZWFrIH1cbiAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICB2YXIgZWx0ID0gKHZvaWQgMCk7XG4gICAgaWYgKGFsbG93RW1wdHkgJiYgdGhpcyQxLnR5cGUgPT09IHR5cGVzLmNvbW1hKVxuICAgICAgeyBlbHQgPSBudWxsOyB9XG4gICAgZWxzZSBpZiAodGhpcyQxLnR5cGUgPT09IHR5cGVzLmVsbGlwc2lzKSB7XG4gICAgICBlbHQgPSB0aGlzJDEucGFyc2VTcHJlYWQocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyAmJiB0aGlzJDEudHlwZSA9PT0gdHlwZXMuY29tbWEgJiYgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hIDwgMClcbiAgICAgICAgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSB0aGlzJDEuc3RhcnQ7IH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWx0ID0gdGhpcyQxLnBhcnNlTWF5YmVBc3NpZ24oZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIH1cbiAgICBlbHRzLnB1c2goZWx0KTtcbiAgfVxuICByZXR1cm4gZWx0c1xufTtcblxucHAkMy5jaGVja1VucmVzZXJ2ZWQgPSBmdW5jdGlvbihyZWYpIHtcbiAgdmFyIHN0YXJ0ID0gcmVmLnN0YXJ0O1xuICB2YXIgZW5kID0gcmVmLmVuZDtcbiAgdmFyIG5hbWUgPSByZWYubmFtZTtcblxuICBpZiAodGhpcy5pbkdlbmVyYXRvciAmJiBuYW1lID09PSBcInlpZWxkXCIpXG4gICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIFwiQ2Fubm90IHVzZSAneWllbGQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGEgZ2VuZXJhdG9yXCIpOyB9XG4gIGlmICh0aGlzLmluQXN5bmMgJiYgbmFtZSA9PT0gXCJhd2FpdFwiKVxuICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCBcIkNhbm5vdCB1c2UgJ2F3YWl0JyBhcyBpZGVudGlmaWVyIGluc2lkZSBhbiBhc3luYyBmdW5jdGlvblwiKTsgfVxuICBpZiAodGhpcy5rZXl3b3Jkcy50ZXN0KG5hbWUpKVxuICAgIHsgdGhpcy5yYWlzZShzdGFydCwgKFwiVW5leHBlY3RlZCBrZXl3b3JkICdcIiArIG5hbWUgKyBcIidcIikpOyB9XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPCA2ICYmXG4gICAgdGhpcy5pbnB1dC5zbGljZShzdGFydCwgZW5kKS5pbmRleE9mKFwiXFxcXFwiKSAhPT0gLTEpIHsgcmV0dXJuIH1cbiAgdmFyIHJlID0gdGhpcy5zdHJpY3QgPyB0aGlzLnJlc2VydmVkV29yZHNTdHJpY3QgOiB0aGlzLnJlc2VydmVkV29yZHM7XG4gIGlmIChyZS50ZXN0KG5hbWUpKSB7XG4gICAgaWYgKCF0aGlzLmluQXN5bmMgJiYgbmFtZSA9PT0gXCJhd2FpdFwiKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIFwiQ2Fubm90IHVzZSBrZXl3b3JkICdhd2FpdCcgb3V0c2lkZSBhbiBhc3luYyBmdW5jdGlvblwiKTsgfVxuICAgIHRoaXMucmFpc2VSZWNvdmVyYWJsZShzdGFydCwgKFwiVGhlIGtleXdvcmQgJ1wiICsgbmFtZSArIFwiJyBpcyByZXNlcnZlZFwiKSk7XG4gIH1cbn07XG5cbi8vIFBhcnNlIHRoZSBuZXh0IHRva2VuIGFzIGFuIGlkZW50aWZpZXIuIElmIGBsaWJlcmFsYCBpcyB0cnVlICh1c2VkXG4vLyB3aGVuIHBhcnNpbmcgcHJvcGVydGllcyksIGl0IHdpbGwgYWxzbyBjb252ZXJ0IGtleXdvcmRzIGludG9cbi8vIGlkZW50aWZpZXJzLlxuXG5wcCQzLnBhcnNlSWRlbnQgPSBmdW5jdGlvbihsaWJlcmFsLCBpc0JpbmRpbmcpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICBpZiAobGliZXJhbCAmJiB0aGlzLm9wdGlvbnMuYWxsb3dSZXNlcnZlZCA9PT0gXCJuZXZlclwiKSB7IGxpYmVyYWwgPSBmYWxzZTsgfVxuICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5uYW1lKSB7XG4gICAgbm9kZS5uYW1lID0gdGhpcy52YWx1ZTtcbiAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2V5d29yZCkge1xuICAgIG5vZGUubmFtZSA9IHRoaXMudHlwZS5rZXl3b3JkO1xuXG4gICAgLy8gVG8gZml4IGh0dHBzOi8vZ2l0aHViLmNvbS9hY29ybmpzL2Fjb3JuL2lzc3Vlcy81NzVcbiAgICAvLyBgY2xhc3NgIGFuZCBgZnVuY3Rpb25gIGtleXdvcmRzIHB1c2ggbmV3IGNvbnRleHQgaW50byB0aGlzLmNvbnRleHQuXG4gICAgLy8gQnV0IHRoZXJlIGlzIG5vIGNoYW5jZSB0byBwb3AgdGhlIGNvbnRleHQgaWYgdGhlIGtleXdvcmQgaXMgY29uc3VtZWQgYXMgYW4gaWRlbnRpZmllciBzdWNoIGFzIGEgcHJvcGVydHkgbmFtZS5cbiAgICAvLyBJZiB0aGUgcHJldmlvdXMgdG9rZW4gaXMgYSBkb3QsIHRoaXMgZG9lcyBub3QgYXBwbHkgYmVjYXVzZSB0aGUgY29udGV4dC1tYW5hZ2luZyBjb2RlIGFscmVhZHkgaWdub3JlZCB0aGUga2V5d29yZFxuICAgIGlmICgobm9kZS5uYW1lID09PSBcImNsYXNzXCIgfHwgbm9kZS5uYW1lID09PSBcImZ1bmN0aW9uXCIpICYmXG4gICAgICAgICh0aGlzLmxhc3RUb2tFbmQgIT09IHRoaXMubGFzdFRva1N0YXJ0ICsgMSB8fCB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5sYXN0VG9rU3RhcnQpICE9PSA0NikpIHtcbiAgICAgIHRoaXMuY29udGV4dC5wb3AoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gIH1cbiAgdGhpcy5uZXh0KCk7XG4gIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIklkZW50aWZpZXJcIik7XG4gIGlmICghbGliZXJhbCkge1xuICAgIHRoaXMuY2hlY2tVbnJlc2VydmVkKG5vZGUpO1xuICAgIGlmIChub2RlLm5hbWUgPT09IFwiYXdhaXRcIiAmJiAhdGhpcy5hd2FpdElkZW50UG9zKVxuICAgICAgeyB0aGlzLmF3YWl0SWRlbnRQb3MgPSBub2RlLnN0YXJ0OyB9XG4gIH1cbiAgcmV0dXJuIG5vZGVcbn07XG5cbi8vIFBhcnNlcyB5aWVsZCBleHByZXNzaW9uIGluc2lkZSBnZW5lcmF0b3IuXG5cbnBwJDMucGFyc2VZaWVsZCA9IGZ1bmN0aW9uKG5vSW4pIHtcbiAgaWYgKCF0aGlzLnlpZWxkUG9zKSB7IHRoaXMueWllbGRQb3MgPSB0aGlzLnN0YXJ0OyB9XG5cbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB0aGlzLm5leHQoKTtcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc2VtaSB8fCB0aGlzLmNhbkluc2VydFNlbWljb2xvbigpIHx8ICh0aGlzLnR5cGUgIT09IHR5cGVzLnN0YXIgJiYgIXRoaXMudHlwZS5zdGFydHNFeHByKSkge1xuICAgIG5vZGUuZGVsZWdhdGUgPSBmYWxzZTtcbiAgICBub2RlLmFyZ3VtZW50ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBub2RlLmRlbGVnYXRlID0gdGhpcy5lYXQodHlwZXMuc3Rhcik7XG4gICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihub0luKTtcbiAgfVxuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiWWllbGRFeHByZXNzaW9uXCIpXG59O1xuXG5wcCQzLnBhcnNlQXdhaXQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmF3YWl0UG9zKSB7IHRoaXMuYXdhaXRQb3MgPSB0aGlzLnN0YXJ0OyB9XG5cbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB0aGlzLm5leHQoKTtcbiAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsIHRydWUpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXdhaXRFeHByZXNzaW9uXCIpXG59O1xuXG52YXIgcHAkNCA9IFBhcnNlci5wcm90b3R5cGU7XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByYWlzZSBleGNlcHRpb25zIG9uIHBhcnNlIGVycm9ycy4gSXRcbi8vIHRha2VzIGFuIG9mZnNldCBpbnRlZ2VyIChpbnRvIHRoZSBjdXJyZW50IGBpbnB1dGApIHRvIGluZGljYXRlXG4vLyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yLCBhdHRhY2hlcyB0aGUgcG9zaXRpb24gdG8gdGhlIGVuZFxuLy8gb2YgdGhlIGVycm9yIG1lc3NhZ2UsIGFuZCB0aGVuIHJhaXNlcyBhIGBTeW50YXhFcnJvcmAgd2l0aCB0aGF0XG4vLyBtZXNzYWdlLlxuXG5wcCQ0LnJhaXNlID0gZnVuY3Rpb24ocG9zLCBtZXNzYWdlKSB7XG4gIHZhciBsb2MgPSBnZXRMaW5lSW5mbyh0aGlzLmlucHV0LCBwb3MpO1xuICBtZXNzYWdlICs9IFwiIChcIiArIGxvYy5saW5lICsgXCI6XCIgKyBsb2MuY29sdW1uICsgXCIpXCI7XG4gIHZhciBlcnIgPSBuZXcgU3ludGF4RXJyb3IobWVzc2FnZSk7XG4gIGVyci5wb3MgPSBwb3M7IGVyci5sb2MgPSBsb2M7IGVyci5yYWlzZWRBdCA9IHRoaXMucG9zO1xuICB0aHJvdyBlcnJcbn07XG5cbnBwJDQucmFpc2VSZWNvdmVyYWJsZSA9IHBwJDQucmFpc2U7XG5cbnBwJDQuY3VyUG9zaXRpb24gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMuY3VyTGluZSwgdGhpcy5wb3MgLSB0aGlzLmxpbmVTdGFydClcbiAgfVxufTtcblxudmFyIHBwJDUgPSBQYXJzZXIucHJvdG90eXBlO1xuXG52YXIgU2NvcGUgPSBmdW5jdGlvbiBTY29wZShmbGFncykge1xuICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gIC8vIEEgbGlzdCBvZiB2YXItZGVjbGFyZWQgbmFtZXMgaW4gdGhlIGN1cnJlbnQgbGV4aWNhbCBzY29wZVxuICB0aGlzLnZhciA9IFtdO1xuICAvLyBBIGxpc3Qgb2YgbGV4aWNhbGx5LWRlY2xhcmVkIG5hbWVzIGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGVcbiAgdGhpcy5sZXhpY2FsID0gW107XG4gIC8vIEEgbGlzdCBvZiBsZXhpY2FsbHktZGVjbGFyZWQgRnVuY3Rpb25EZWNsYXJhdGlvbiBuYW1lcyBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlXG4gIHRoaXMuZnVuY3Rpb25zID0gW107XG59O1xuXG4vLyBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGtlZXAgdHJhY2sgb2YgZGVjbGFyZWQgdmFyaWFibGVzIGluIHRoZSBjdXJyZW50IHNjb3BlIGluIG9yZGVyIHRvIGRldGVjdCBkdXBsaWNhdGUgdmFyaWFibGUgbmFtZXMuXG5cbnBwJDUuZW50ZXJTY29wZSA9IGZ1bmN0aW9uKGZsYWdzKSB7XG4gIHRoaXMuc2NvcGVTdGFjay5wdXNoKG5ldyBTY29wZShmbGFncykpO1xufTtcblxucHAkNS5leGl0U2NvcGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zY29wZVN0YWNrLnBvcCgpO1xufTtcblxuLy8gVGhlIHNwZWMgc2F5czpcbi8vID4gQXQgdGhlIHRvcCBsZXZlbCBvZiBhIGZ1bmN0aW9uLCBvciBzY3JpcHQsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhcmVcbi8vID4gdHJlYXRlZCBsaWtlIHZhciBkZWNsYXJhdGlvbnMgcmF0aGVyIHRoYW4gbGlrZSBsZXhpY2FsIGRlY2xhcmF0aW9ucy5cbnBwJDUudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUgPSBmdW5jdGlvbihzY29wZSkge1xuICByZXR1cm4gKHNjb3BlLmZsYWdzICYgU0NPUEVfRlVOQ1RJT04pIHx8ICF0aGlzLmluTW9kdWxlICYmIChzY29wZS5mbGFncyAmIFNDT1BFX1RPUClcbn07XG5cbnBwJDUuZGVjbGFyZU5hbWUgPSBmdW5jdGlvbihuYW1lLCBiaW5kaW5nVHlwZSwgcG9zKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciByZWRlY2xhcmVkID0gZmFsc2U7XG4gIGlmIChiaW5kaW5nVHlwZSA9PT0gQklORF9MRVhJQ0FMKSB7XG4gICAgdmFyIHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGUoKTtcbiAgICByZWRlY2xhcmVkID0gc2NvcGUubGV4aWNhbC5pbmRleE9mKG5hbWUpID4gLTEgfHwgc2NvcGUuZnVuY3Rpb25zLmluZGV4T2YobmFtZSkgPiAtMSB8fCBzY29wZS52YXIuaW5kZXhPZihuYW1lKSA+IC0xO1xuICAgIHNjb3BlLmxleGljYWwucHVzaChuYW1lKTtcbiAgICBpZiAodGhpcy5pbk1vZHVsZSAmJiAoc2NvcGUuZmxhZ3MgJiBTQ09QRV9UT1ApKVxuICAgICAgeyBkZWxldGUgdGhpcy51bmRlZmluZWRFeHBvcnRzW25hbWVdOyB9XG4gIH0gZWxzZSBpZiAoYmluZGluZ1R5cGUgPT09IEJJTkRfU0lNUExFX0NBVENIKSB7XG4gICAgdmFyIHNjb3BlJDEgPSB0aGlzLmN1cnJlbnRTY29wZSgpO1xuICAgIHNjb3BlJDEubGV4aWNhbC5wdXNoKG5hbWUpO1xuICB9IGVsc2UgaWYgKGJpbmRpbmdUeXBlID09PSBCSU5EX0ZVTkNUSU9OKSB7XG4gICAgdmFyIHNjb3BlJDIgPSB0aGlzLmN1cnJlbnRTY29wZSgpO1xuICAgIGlmICh0aGlzLnRyZWF0RnVuY3Rpb25zQXNWYXIpXG4gICAgICB7IHJlZGVjbGFyZWQgPSBzY29wZSQyLmxleGljYWwuaW5kZXhPZihuYW1lKSA+IC0xOyB9XG4gICAgZWxzZVxuICAgICAgeyByZWRlY2xhcmVkID0gc2NvcGUkMi5sZXhpY2FsLmluZGV4T2YobmFtZSkgPiAtMSB8fCBzY29wZSQyLnZhci5pbmRleE9mKG5hbWUpID4gLTE7IH1cbiAgICBzY29wZSQyLmZ1bmN0aW9ucy5wdXNoKG5hbWUpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSB0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHZhciBzY29wZSQzID0gdGhpcyQxLnNjb3BlU3RhY2tbaV07XG4gICAgICBpZiAoc2NvcGUkMy5sZXhpY2FsLmluZGV4T2YobmFtZSkgPiAtMSAmJiAhKChzY29wZSQzLmZsYWdzICYgU0NPUEVfU0lNUExFX0NBVENIKSAmJiBzY29wZSQzLmxleGljYWxbMF0gPT09IG5hbWUpIHx8XG4gICAgICAgICAgIXRoaXMkMS50cmVhdEZ1bmN0aW9uc0FzVmFySW5TY29wZShzY29wZSQzKSAmJiBzY29wZSQzLmZ1bmN0aW9ucy5pbmRleE9mKG5hbWUpID4gLTEpIHtcbiAgICAgICAgcmVkZWNsYXJlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBzY29wZSQzLnZhci5wdXNoKG5hbWUpO1xuICAgICAgaWYgKHRoaXMkMS5pbk1vZHVsZSAmJiAoc2NvcGUkMy5mbGFncyAmIFNDT1BFX1RPUCkpXG4gICAgICAgIHsgZGVsZXRlIHRoaXMkMS51bmRlZmluZWRFeHBvcnRzW25hbWVdOyB9XG4gICAgICBpZiAoc2NvcGUkMy5mbGFncyAmIFNDT1BFX1ZBUikgeyBicmVhayB9XG4gICAgfVxuICB9XG4gIGlmIChyZWRlY2xhcmVkKSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShwb3MsIChcIklkZW50aWZpZXIgJ1wiICsgbmFtZSArIFwiJyBoYXMgYWxyZWFkeSBiZWVuIGRlY2xhcmVkXCIpKTsgfVxufTtcblxucHAkNS5jaGVja0xvY2FsRXhwb3J0ID0gZnVuY3Rpb24oaWQpIHtcbiAgLy8gc2NvcGUuZnVuY3Rpb25zIG11c3QgYmUgZW1wdHkgYXMgTW9kdWxlIGNvZGUgaXMgYWx3YXlzIHN0cmljdC5cbiAgaWYgKHRoaXMuc2NvcGVTdGFja1swXS5sZXhpY2FsLmluZGV4T2YoaWQubmFtZSkgPT09IC0xICYmXG4gICAgICB0aGlzLnNjb3BlU3RhY2tbMF0udmFyLmluZGV4T2YoaWQubmFtZSkgPT09IC0xKSB7XG4gICAgdGhpcy51bmRlZmluZWRFeHBvcnRzW2lkLm5hbWVdID0gaWQ7XG4gIH1cbn07XG5cbnBwJDUuY3VycmVudFNjb3BlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNjb3BlU3RhY2tbdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDFdXG59O1xuXG5wcCQ1LmN1cnJlbnRWYXJTY29wZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBmb3IgKHZhciBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7OyBpLS0pIHtcbiAgICB2YXIgc2NvcGUgPSB0aGlzJDEuc2NvcGVTdGFja1tpXTtcbiAgICBpZiAoc2NvcGUuZmxhZ3MgJiBTQ09QRV9WQVIpIHsgcmV0dXJuIHNjb3BlIH1cbiAgfVxufTtcblxuLy8gQ291bGQgYmUgdXNlZnVsIGZvciBgdGhpc2AsIGBuZXcudGFyZ2V0YCwgYHN1cGVyKClgLCBgc3VwZXIucHJvcGVydHlgLCBhbmQgYHN1cGVyW3Byb3BlcnR5XWAuXG5wcCQ1LmN1cnJlbnRUaGlzU2NvcGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgZm9yICh2YXIgaSA9IHRoaXMuc2NvcGVTdGFjay5sZW5ndGggLSAxOzsgaS0tKSB7XG4gICAgdmFyIHNjb3BlID0gdGhpcyQxLnNjb3BlU3RhY2tbaV07XG4gICAgaWYgKHNjb3BlLmZsYWdzICYgU0NPUEVfVkFSICYmICEoc2NvcGUuZmxhZ3MgJiBTQ09QRV9BUlJPVykpIHsgcmV0dXJuIHNjb3BlIH1cbiAgfVxufTtcblxudmFyIE5vZGUgPSBmdW5jdGlvbiBOb2RlKHBhcnNlciwgcG9zLCBsb2MpIHtcbiAgdGhpcy50eXBlID0gXCJcIjtcbiAgdGhpcy5zdGFydCA9IHBvcztcbiAgdGhpcy5lbmQgPSAwO1xuICBpZiAocGFyc2VyLm9wdGlvbnMubG9jYXRpb25zKVxuICAgIHsgdGhpcy5sb2MgPSBuZXcgU291cmNlTG9jYXRpb24ocGFyc2VyLCBsb2MpOyB9XG4gIGlmIChwYXJzZXIub3B0aW9ucy5kaXJlY3RTb3VyY2VGaWxlKVxuICAgIHsgdGhpcy5zb3VyY2VGaWxlID0gcGFyc2VyLm9wdGlvbnMuZGlyZWN0U291cmNlRmlsZTsgfVxuICBpZiAocGFyc2VyLm9wdGlvbnMucmFuZ2VzKVxuICAgIHsgdGhpcy5yYW5nZSA9IFtwb3MsIDBdOyB9XG59O1xuXG4vLyBTdGFydCBhbiBBU1Qgbm9kZSwgYXR0YWNoaW5nIGEgc3RhcnQgb2Zmc2V0LlxuXG52YXIgcHAkNiA9IFBhcnNlci5wcm90b3R5cGU7XG5cbnBwJDYuc3RhcnROb2RlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgTm9kZSh0aGlzLCB0aGlzLnN0YXJ0LCB0aGlzLnN0YXJ0TG9jKVxufTtcblxucHAkNi5zdGFydE5vZGVBdCA9IGZ1bmN0aW9uKHBvcywgbG9jKSB7XG4gIHJldHVybiBuZXcgTm9kZSh0aGlzLCBwb3MsIGxvYylcbn07XG5cbi8vIEZpbmlzaCBhbiBBU1Qgbm9kZSwgYWRkaW5nIGB0eXBlYCBhbmQgYGVuZGAgcHJvcGVydGllcy5cblxuZnVuY3Rpb24gZmluaXNoTm9kZUF0KG5vZGUsIHR5cGUsIHBvcywgbG9jKSB7XG4gIG5vZGUudHlwZSA9IHR5cGU7XG4gIG5vZGUuZW5kID0gcG9zO1xuICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucylcbiAgICB7IG5vZGUubG9jLmVuZCA9IGxvYzsgfVxuICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcylcbiAgICB7IG5vZGUucmFuZ2VbMV0gPSBwb3M7IH1cbiAgcmV0dXJuIG5vZGVcbn1cblxucHAkNi5maW5pc2hOb2RlID0gZnVuY3Rpb24obm9kZSwgdHlwZSkge1xuICByZXR1cm4gZmluaXNoTm9kZUF0LmNhbGwodGhpcywgbm9kZSwgdHlwZSwgdGhpcy5sYXN0VG9rRW5kLCB0aGlzLmxhc3RUb2tFbmRMb2MpXG59O1xuXG4vLyBGaW5pc2ggbm9kZSBhdCBnaXZlbiBwb3NpdGlvblxuXG5wcCQ2LmZpbmlzaE5vZGVBdCA9IGZ1bmN0aW9uKG5vZGUsIHR5cGUsIHBvcywgbG9jKSB7XG4gIHJldHVybiBmaW5pc2hOb2RlQXQuY2FsbCh0aGlzLCBub2RlLCB0eXBlLCBwb3MsIGxvYylcbn07XG5cbi8vIFRoZSBhbGdvcml0aG0gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHJlZ2V4cCBjYW4gYXBwZWFyIGF0IGFcbi8vIGdpdmVuIHBvaW50IGluIHRoZSBwcm9ncmFtIGlzIGxvb3NlbHkgYmFzZWQgb24gc3dlZXQuanMnIGFwcHJvYWNoLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3N3ZWV0LmpzL3dpa2kvZGVzaWduXG5cbnZhciBUb2tDb250ZXh0ID0gZnVuY3Rpb24gVG9rQ29udGV4dCh0b2tlbiwgaXNFeHByLCBwcmVzZXJ2ZVNwYWNlLCBvdmVycmlkZSwgZ2VuZXJhdG9yKSB7XG4gIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgdGhpcy5pc0V4cHIgPSAhIWlzRXhwcjtcbiAgdGhpcy5wcmVzZXJ2ZVNwYWNlID0gISFwcmVzZXJ2ZVNwYWNlO1xuICB0aGlzLm92ZXJyaWRlID0gb3ZlcnJpZGU7XG4gIHRoaXMuZ2VuZXJhdG9yID0gISFnZW5lcmF0b3I7XG59O1xuXG52YXIgdHlwZXMkMSA9IHtcbiAgYl9zdGF0OiBuZXcgVG9rQ29udGV4dChcIntcIiwgZmFsc2UpLFxuICBiX2V4cHI6IG5ldyBUb2tDb250ZXh0KFwie1wiLCB0cnVlKSxcbiAgYl90bXBsOiBuZXcgVG9rQ29udGV4dChcIiR7XCIsIGZhbHNlKSxcbiAgcF9zdGF0OiBuZXcgVG9rQ29udGV4dChcIihcIiwgZmFsc2UpLFxuICBwX2V4cHI6IG5ldyBUb2tDb250ZXh0KFwiKFwiLCB0cnVlKSxcbiAgcV90bXBsOiBuZXcgVG9rQ29udGV4dChcImBcIiwgdHJ1ZSwgdHJ1ZSwgZnVuY3Rpb24gKHApIHsgcmV0dXJuIHAudHJ5UmVhZFRlbXBsYXRlVG9rZW4oKTsgfSksXG4gIGZfc3RhdDogbmV3IFRva0NvbnRleHQoXCJmdW5jdGlvblwiLCBmYWxzZSksXG4gIGZfZXhwcjogbmV3IFRva0NvbnRleHQoXCJmdW5jdGlvblwiLCB0cnVlKSxcbiAgZl9leHByX2dlbjogbmV3IFRva0NvbnRleHQoXCJmdW5jdGlvblwiLCB0cnVlLCBmYWxzZSwgbnVsbCwgdHJ1ZSksXG4gIGZfZ2VuOiBuZXcgVG9rQ29udGV4dChcImZ1bmN0aW9uXCIsIGZhbHNlLCBmYWxzZSwgbnVsbCwgdHJ1ZSlcbn07XG5cbnZhciBwcCQ3ID0gUGFyc2VyLnByb3RvdHlwZTtcblxucHAkNy5pbml0aWFsQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gW3R5cGVzJDEuYl9zdGF0XVxufTtcblxucHAkNy5icmFjZUlzQmxvY2sgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5jdXJDb250ZXh0KCk7XG4gIGlmIChwYXJlbnQgPT09IHR5cGVzJDEuZl9leHByIHx8IHBhcmVudCA9PT0gdHlwZXMkMS5mX3N0YXQpXG4gICAgeyByZXR1cm4gdHJ1ZSB9XG4gIGlmIChwcmV2VHlwZSA9PT0gdHlwZXMuY29sb24gJiYgKHBhcmVudCA9PT0gdHlwZXMkMS5iX3N0YXQgfHwgcGFyZW50ID09PSB0eXBlcyQxLmJfZXhwcikpXG4gICAgeyByZXR1cm4gIXBhcmVudC5pc0V4cHIgfVxuXG4gIC8vIFRoZSBjaGVjayBmb3IgYHR0Lm5hbWUgJiYgZXhwckFsbG93ZWRgIGRldGVjdHMgd2hldGhlciB3ZSBhcmVcbiAgLy8gYWZ0ZXIgYSBgeWllbGRgIG9yIGBvZmAgY29uc3RydWN0LiBTZWUgdGhlIGB1cGRhdGVDb250ZXh0YCBmb3JcbiAgLy8gYHR0Lm5hbWVgLlxuICBpZiAocHJldlR5cGUgPT09IHR5cGVzLl9yZXR1cm4gfHwgcHJldlR5cGUgPT09IHR5cGVzLm5hbWUgJiYgdGhpcy5leHByQWxsb3dlZClcbiAgICB7IHJldHVybiBsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpIH1cbiAgaWYgKHByZXZUeXBlID09PSB0eXBlcy5fZWxzZSB8fCBwcmV2VHlwZSA9PT0gdHlwZXMuc2VtaSB8fCBwcmV2VHlwZSA9PT0gdHlwZXMuZW9mIHx8IHByZXZUeXBlID09PSB0eXBlcy5wYXJlblIgfHwgcHJldlR5cGUgPT09IHR5cGVzLmFycm93KVxuICAgIHsgcmV0dXJuIHRydWUgfVxuICBpZiAocHJldlR5cGUgPT09IHR5cGVzLmJyYWNlTClcbiAgICB7IHJldHVybiBwYXJlbnQgPT09IHR5cGVzJDEuYl9zdGF0IH1cbiAgaWYgKHByZXZUeXBlID09PSB0eXBlcy5fdmFyIHx8IHByZXZUeXBlID09PSB0eXBlcy5fY29uc3QgfHwgcHJldlR5cGUgPT09IHR5cGVzLm5hbWUpXG4gICAgeyByZXR1cm4gZmFsc2UgfVxuICByZXR1cm4gIXRoaXMuZXhwckFsbG93ZWRcbn07XG5cbnBwJDcuaW5HZW5lcmF0b3JDb250ZXh0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGZvciAodmFyIGkgPSB0aGlzLmNvbnRleHQubGVuZ3RoIC0gMTsgaSA+PSAxOyBpLS0pIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMkMS5jb250ZXh0W2ldO1xuICAgIGlmIChjb250ZXh0LnRva2VuID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICB7IHJldHVybiBjb250ZXh0LmdlbmVyYXRvciB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG5wcCQ3LnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICB2YXIgdXBkYXRlLCB0eXBlID0gdGhpcy50eXBlO1xuICBpZiAodHlwZS5rZXl3b3JkICYmIHByZXZUeXBlID09PSB0eXBlcy5kb3QpXG4gICAgeyB0aGlzLmV4cHJBbGxvd2VkID0gZmFsc2U7IH1cbiAgZWxzZSBpZiAodXBkYXRlID0gdHlwZS51cGRhdGVDb250ZXh0KVxuICAgIHsgdXBkYXRlLmNhbGwodGhpcywgcHJldlR5cGUpOyB9XG4gIGVsc2VcbiAgICB7IHRoaXMuZXhwckFsbG93ZWQgPSB0eXBlLmJlZm9yZUV4cHI7IH1cbn07XG5cbi8vIFRva2VuLXNwZWNpZmljIGNvbnRleHQgdXBkYXRlIGNvZGVcblxudHlwZXMucGFyZW5SLnVwZGF0ZUNvbnRleHQgPSB0eXBlcy5icmFjZVIudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5jb250ZXh0Lmxlbmd0aCA9PT0gMSkge1xuICAgIHRoaXMuZXhwckFsbG93ZWQgPSB0cnVlO1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvdXQgPSB0aGlzLmNvbnRleHQucG9wKCk7XG4gIGlmIChvdXQgPT09IHR5cGVzJDEuYl9zdGF0ICYmIHRoaXMuY3VyQ29udGV4dCgpLnRva2VuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBvdXQgPSB0aGlzLmNvbnRleHQucG9wKCk7XG4gIH1cbiAgdGhpcy5leHByQWxsb3dlZCA9ICFvdXQuaXNFeHByO1xufTtcblxudHlwZXMuYnJhY2VMLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICB0aGlzLmNvbnRleHQucHVzaCh0aGlzLmJyYWNlSXNCbG9jayhwcmV2VHlwZSkgPyB0eXBlcyQxLmJfc3RhdCA6IHR5cGVzJDEuYl9leHByKTtcbiAgdGhpcy5leHByQWxsb3dlZCA9IHRydWU7XG59O1xuXG50eXBlcy5kb2xsYXJCcmFjZUwudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNvbnRleHQucHVzaCh0eXBlcyQxLmJfdG1wbCk7XG4gIHRoaXMuZXhwckFsbG93ZWQgPSB0cnVlO1xufTtcblxudHlwZXMucGFyZW5MLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICB2YXIgc3RhdGVtZW50UGFyZW5zID0gcHJldlR5cGUgPT09IHR5cGVzLl9pZiB8fCBwcmV2VHlwZSA9PT0gdHlwZXMuX2ZvciB8fCBwcmV2VHlwZSA9PT0gdHlwZXMuX3dpdGggfHwgcHJldlR5cGUgPT09IHR5cGVzLl93aGlsZTtcbiAgdGhpcy5jb250ZXh0LnB1c2goc3RhdGVtZW50UGFyZW5zID8gdHlwZXMkMS5wX3N0YXQgOiB0eXBlcyQxLnBfZXhwcik7XG4gIHRoaXMuZXhwckFsbG93ZWQgPSB0cnVlO1xufTtcblxudHlwZXMuaW5jRGVjLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgLy8gdG9rRXhwckFsbG93ZWQgc3RheXMgdW5jaGFuZ2VkXG59O1xuXG50eXBlcy5fZnVuY3Rpb24udXBkYXRlQ29udGV4dCA9IHR5cGVzLl9jbGFzcy51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgaWYgKHByZXZUeXBlLmJlZm9yZUV4cHIgJiYgcHJldlR5cGUgIT09IHR5cGVzLnNlbWkgJiYgcHJldlR5cGUgIT09IHR5cGVzLl9lbHNlICYmXG4gICAgICAhKHByZXZUeXBlID09PSB0eXBlcy5fcmV0dXJuICYmIGxpbmVCcmVhay50ZXN0KHRoaXMuaW5wdXQuc2xpY2UodGhpcy5sYXN0VG9rRW5kLCB0aGlzLnN0YXJ0KSkpICYmXG4gICAgICAhKChwcmV2VHlwZSA9PT0gdHlwZXMuY29sb24gfHwgcHJldlR5cGUgPT09IHR5cGVzLmJyYWNlTCkgJiYgdGhpcy5jdXJDb250ZXh0KCkgPT09IHR5cGVzJDEuYl9zdGF0KSlcbiAgICB7IHRoaXMuY29udGV4dC5wdXNoKHR5cGVzJDEuZl9leHByKTsgfVxuICBlbHNlXG4gICAgeyB0aGlzLmNvbnRleHQucHVzaCh0eXBlcyQxLmZfc3RhdCk7IH1cbiAgdGhpcy5leHByQWxsb3dlZCA9IGZhbHNlO1xufTtcblxudHlwZXMuYmFja1F1b3RlLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuY3VyQ29udGV4dCgpID09PSB0eXBlcyQxLnFfdG1wbClcbiAgICB7IHRoaXMuY29udGV4dC5wb3AoKTsgfVxuICBlbHNlXG4gICAgeyB0aGlzLmNvbnRleHQucHVzaCh0eXBlcyQxLnFfdG1wbCk7IH1cbiAgdGhpcy5leHByQWxsb3dlZCA9IGZhbHNlO1xufTtcblxudHlwZXMuc3Rhci51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgaWYgKHByZXZUeXBlID09PSB0eXBlcy5fZnVuY3Rpb24pIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmNvbnRleHQubGVuZ3RoIC0gMTtcbiAgICBpZiAodGhpcy5jb250ZXh0W2luZGV4XSA9PT0gdHlwZXMkMS5mX2V4cHIpXG4gICAgICB7IHRoaXMuY29udGV4dFtpbmRleF0gPSB0eXBlcyQxLmZfZXhwcl9nZW47IH1cbiAgICBlbHNlXG4gICAgICB7IHRoaXMuY29udGV4dFtpbmRleF0gPSB0eXBlcyQxLmZfZ2VuOyB9XG4gIH1cbiAgdGhpcy5leHByQWxsb3dlZCA9IHRydWU7XG59O1xuXG50eXBlcy5uYW1lLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICB2YXIgYWxsb3dlZCA9IGZhbHNlO1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgcHJldlR5cGUgIT09IHR5cGVzLmRvdCkge1xuICAgIGlmICh0aGlzLnZhbHVlID09PSBcIm9mXCIgJiYgIXRoaXMuZXhwckFsbG93ZWQgfHxcbiAgICAgICAgdGhpcy52YWx1ZSA9PT0gXCJ5aWVsZFwiICYmIHRoaXMuaW5HZW5lcmF0b3JDb250ZXh0KCkpXG4gICAgICB7IGFsbG93ZWQgPSB0cnVlOyB9XG4gIH1cbiAgdGhpcy5leHByQWxsb3dlZCA9IGFsbG93ZWQ7XG59O1xuXG4vLyBUaGlzIGZpbGUgY29udGFpbnMgVW5pY29kZSBwcm9wZXJ0aWVzIGV4dHJhY3RlZCBmcm9tIHRoZSBFQ01BU2NyaXB0XG4vLyBzcGVjaWZpY2F0aW9uLiBUaGUgbGlzdHMgYXJlIGV4dHJhY3RlZCBsaWtlIHNvOlxuLy8gJCQoJyN0YWJsZS1iaW5hcnktdW5pY29kZS1wcm9wZXJ0aWVzID4gZmlndXJlID4gdGFibGUgPiB0Ym9keSA+IHRyID4gdGQ6bnRoLWNoaWxkKDEpIGNvZGUnKS5tYXAoZWwgPT4gZWwuaW5uZXJUZXh0KVxuXG4vLyAjdGFibGUtYmluYXJ5LXVuaWNvZGUtcHJvcGVydGllc1xudmFyIGVjbWE5QmluYXJ5UHJvcGVydGllcyA9IFwiQVNDSUkgQVNDSUlfSGV4X0RpZ2l0IEFIZXggQWxwaGFiZXRpYyBBbHBoYSBBbnkgQXNzaWduZWQgQmlkaV9Db250cm9sIEJpZGlfQyBCaWRpX01pcnJvcmVkIEJpZGlfTSBDYXNlX0lnbm9yYWJsZSBDSSBDYXNlZCBDaGFuZ2VzX1doZW5fQ2FzZWZvbGRlZCBDV0NGIENoYW5nZXNfV2hlbl9DYXNlbWFwcGVkIENXQ00gQ2hhbmdlc19XaGVuX0xvd2VyY2FzZWQgQ1dMIENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWQgQ1dLQ0YgQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWQgQ1dUIENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkIENXVSBEYXNoIERlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnQgREkgRGVwcmVjYXRlZCBEZXAgRGlhY3JpdGljIERpYSBFbW9qaSBFbW9qaV9Db21wb25lbnQgRW1vamlfTW9kaWZpZXIgRW1vamlfTW9kaWZpZXJfQmFzZSBFbW9qaV9QcmVzZW50YXRpb24gRXh0ZW5kZXIgRXh0IEdyYXBoZW1lX0Jhc2UgR3JfQmFzZSBHcmFwaGVtZV9FeHRlbmQgR3JfRXh0IEhleF9EaWdpdCBIZXggSURTX0JpbmFyeV9PcGVyYXRvciBJRFNCIElEU19UcmluYXJ5X09wZXJhdG9yIElEU1QgSURfQ29udGludWUgSURDIElEX1N0YXJ0IElEUyBJZGVvZ3JhcGhpYyBJZGVvIEpvaW5fQ29udHJvbCBKb2luX0MgTG9naWNhbF9PcmRlcl9FeGNlcHRpb24gTE9FIExvd2VyY2FzZSBMb3dlciBNYXRoIE5vbmNoYXJhY3Rlcl9Db2RlX1BvaW50IE5DaGFyIFBhdHRlcm5fU3ludGF4IFBhdF9TeW4gUGF0dGVybl9XaGl0ZV9TcGFjZSBQYXRfV1MgUXVvdGF0aW9uX01hcmsgUU1hcmsgUmFkaWNhbCBSZWdpb25hbF9JbmRpY2F0b3IgUkkgU2VudGVuY2VfVGVybWluYWwgU1Rlcm0gU29mdF9Eb3R0ZWQgU0QgVGVybWluYWxfUHVuY3R1YXRpb24gVGVybSBVbmlmaWVkX0lkZW9ncmFwaCBVSWRlbyBVcHBlcmNhc2UgVXBwZXIgVmFyaWF0aW9uX1NlbGVjdG9yIFZTIFdoaXRlX1NwYWNlIHNwYWNlIFhJRF9Db250aW51ZSBYSURDIFhJRF9TdGFydCBYSURTXCI7XG52YXIgdW5pY29kZUJpbmFyeVByb3BlcnRpZXMgPSB7XG4gIDk6IGVjbWE5QmluYXJ5UHJvcGVydGllcyxcbiAgMTA6IGVjbWE5QmluYXJ5UHJvcGVydGllcyArIFwiIEV4dGVuZGVkX1BpY3RvZ3JhcGhpY1wiXG59O1xuXG4vLyAjdGFibGUtdW5pY29kZS1nZW5lcmFsLWNhdGVnb3J5LXZhbHVlc1xudmFyIHVuaWNvZGVHZW5lcmFsQ2F0ZWdvcnlWYWx1ZXMgPSBcIkNhc2VkX0xldHRlciBMQyBDbG9zZV9QdW5jdHVhdGlvbiBQZSBDb25uZWN0b3JfUHVuY3R1YXRpb24gUGMgQ29udHJvbCBDYyBjbnRybCBDdXJyZW5jeV9TeW1ib2wgU2MgRGFzaF9QdW5jdHVhdGlvbiBQZCBEZWNpbWFsX051bWJlciBOZCBkaWdpdCBFbmNsb3NpbmdfTWFyayBNZSBGaW5hbF9QdW5jdHVhdGlvbiBQZiBGb3JtYXQgQ2YgSW5pdGlhbF9QdW5jdHVhdGlvbiBQaSBMZXR0ZXIgTCBMZXR0ZXJfTnVtYmVyIE5sIExpbmVfU2VwYXJhdG9yIFpsIExvd2VyY2FzZV9MZXR0ZXIgTGwgTWFyayBNIENvbWJpbmluZ19NYXJrIE1hdGhfU3ltYm9sIFNtIE1vZGlmaWVyX0xldHRlciBMbSBNb2RpZmllcl9TeW1ib2wgU2sgTm9uc3BhY2luZ19NYXJrIE1uIE51bWJlciBOIE9wZW5fUHVuY3R1YXRpb24gUHMgT3RoZXIgQyBPdGhlcl9MZXR0ZXIgTG8gT3RoZXJfTnVtYmVyIE5vIE90aGVyX1B1bmN0dWF0aW9uIFBvIE90aGVyX1N5bWJvbCBTbyBQYXJhZ3JhcGhfU2VwYXJhdG9yIFpwIFByaXZhdGVfVXNlIENvIFB1bmN0dWF0aW9uIFAgcHVuY3QgU2VwYXJhdG9yIFogU3BhY2VfU2VwYXJhdG9yIFpzIFNwYWNpbmdfTWFyayBNYyBTdXJyb2dhdGUgQ3MgU3ltYm9sIFMgVGl0bGVjYXNlX0xldHRlciBMdCBVbmFzc2lnbmVkIENuIFVwcGVyY2FzZV9MZXR0ZXIgTHVcIjtcblxuLy8gI3RhYmxlLXVuaWNvZGUtc2NyaXB0LXZhbHVlc1xudmFyIGVjbWE5U2NyaXB0VmFsdWVzID0gXCJBZGxhbSBBZGxtIEFob20gQWhvbSBBbmF0b2xpYW5fSGllcm9nbHlwaHMgSGx1dyBBcmFiaWMgQXJhYiBBcm1lbmlhbiBBcm1uIEF2ZXN0YW4gQXZzdCBCYWxpbmVzZSBCYWxpIEJhbXVtIEJhbXUgQmFzc2FfVmFoIEJhc3MgQmF0YWsgQmF0ayBCZW5nYWxpIEJlbmcgQmhhaWtzdWtpIEJoa3MgQm9wb21vZm8gQm9wbyBCcmFobWkgQnJhaCBCcmFpbGxlIEJyYWkgQnVnaW5lc2UgQnVnaSBCdWhpZCBCdWhkIENhbmFkaWFuX0Fib3JpZ2luYWwgQ2FucyBDYXJpYW4gQ2FyaSBDYXVjYXNpYW5fQWxiYW5pYW4gQWdoYiBDaGFrbWEgQ2FrbSBDaGFtIENoYW0gQ2hlcm9rZWUgQ2hlciBDb21tb24gWnl5eSBDb3B0aWMgQ29wdCBRYWFjIEN1bmVpZm9ybSBYc3V4IEN5cHJpb3QgQ3BydCBDeXJpbGxpYyBDeXJsIERlc2VyZXQgRHNydCBEZXZhbmFnYXJpIERldmEgRHVwbG95YW4gRHVwbCBFZ3lwdGlhbl9IaWVyb2dseXBocyBFZ3lwIEVsYmFzYW4gRWxiYSBFdGhpb3BpYyBFdGhpIEdlb3JnaWFuIEdlb3IgR2xhZ29saXRpYyBHbGFnIEdvdGhpYyBHb3RoIEdyYW50aGEgR3JhbiBHcmVlayBHcmVrIEd1amFyYXRpIEd1anIgR3VybXVraGkgR3VydSBIYW4gSGFuaSBIYW5ndWwgSGFuZyBIYW51bm9vIEhhbm8gSGF0cmFuIEhhdHIgSGVicmV3IEhlYnIgSGlyYWdhbmEgSGlyYSBJbXBlcmlhbF9BcmFtYWljIEFybWkgSW5oZXJpdGVkIFppbmggUWFhaSBJbnNjcmlwdGlvbmFsX1BhaGxhdmkgUGhsaSBJbnNjcmlwdGlvbmFsX1BhcnRoaWFuIFBydGkgSmF2YW5lc2UgSmF2YSBLYWl0aGkgS3RoaSBLYW5uYWRhIEtuZGEgS2F0YWthbmEgS2FuYSBLYXlhaF9MaSBLYWxpIEtoYXJvc2h0aGkgS2hhciBLaG1lciBLaG1yIEtob2praSBLaG9qIEtodWRhd2FkaSBTaW5kIExhbyBMYW9vIExhdGluIExhdG4gTGVwY2hhIExlcGMgTGltYnUgTGltYiBMaW5lYXJfQSBMaW5hIExpbmVhcl9CIExpbmIgTGlzdSBMaXN1IEx5Y2lhbiBMeWNpIEx5ZGlhbiBMeWRpIE1haGFqYW5pIE1haGogTWFsYXlhbGFtIE1seW0gTWFuZGFpYyBNYW5kIE1hbmljaGFlYW4gTWFuaSBNYXJjaGVuIE1hcmMgTWFzYXJhbV9Hb25kaSBHb25tIE1lZXRlaV9NYXllayBNdGVpIE1lbmRlX0tpa2FrdWkgTWVuZCBNZXJvaXRpY19DdXJzaXZlIE1lcmMgTWVyb2l0aWNfSGllcm9nbHlwaHMgTWVybyBNaWFvIFBscmQgTW9kaSBNb2RpIE1vbmdvbGlhbiBNb25nIE1ybyBNcm9vIE11bHRhbmkgTXVsdCBNeWFubWFyIE15bXIgTmFiYXRhZWFuIE5iYXQgTmV3X1RhaV9MdWUgVGFsdSBOZXdhIE5ld2EgTmtvIE5rb28gTnVzaHUgTnNodSBPZ2hhbSBPZ2FtIE9sX0NoaWtpIE9sY2sgT2xkX0h1bmdhcmlhbiBIdW5nIE9sZF9JdGFsaWMgSXRhbCBPbGRfTm9ydGhfQXJhYmlhbiBOYXJiIE9sZF9QZXJtaWMgUGVybSBPbGRfUGVyc2lhbiBYcGVvIE9sZF9Tb3V0aF9BcmFiaWFuIFNhcmIgT2xkX1R1cmtpYyBPcmtoIE9yaXlhIE9yeWEgT3NhZ2UgT3NnZSBPc21hbnlhIE9zbWEgUGFoYXdoX0htb25nIEhtbmcgUGFsbXlyZW5lIFBhbG0gUGF1X0Npbl9IYXUgUGF1YyBQaGFnc19QYSBQaGFnIFBob2VuaWNpYW4gUGhueCBQc2FsdGVyX1BhaGxhdmkgUGhscCBSZWphbmcgUmpuZyBSdW5pYyBSdW5yIFNhbWFyaXRhbiBTYW1yIFNhdXJhc2h0cmEgU2F1ciBTaGFyYWRhIFNocmQgU2hhdmlhbiBTaGF3IFNpZGRoYW0gU2lkZCBTaWduV3JpdGluZyBTZ253IFNpbmhhbGEgU2luaCBTb3JhX1NvbXBlbmcgU29yYSBTb3lvbWJvIFNveW8gU3VuZGFuZXNlIFN1bmQgU3lsb3RpX05hZ3JpIFN5bG8gU3lyaWFjIFN5cmMgVGFnYWxvZyBUZ2xnIFRhZ2JhbndhIFRhZ2IgVGFpX0xlIFRhbGUgVGFpX1RoYW0gTGFuYSBUYWlfVmlldCBUYXZ0IFRha3JpIFRha3IgVGFtaWwgVGFtbCBUYW5ndXQgVGFuZyBUZWx1Z3UgVGVsdSBUaGFhbmEgVGhhYSBUaGFpIFRoYWkgVGliZXRhbiBUaWJ0IFRpZmluYWdoIFRmbmcgVGlyaHV0YSBUaXJoIFVnYXJpdGljIFVnYXIgVmFpIFZhaWkgV2FyYW5nX0NpdGkgV2FyYSBZaSBZaWlpIFphbmFiYXphcl9TcXVhcmUgWmFuYlwiO1xudmFyIHVuaWNvZGVTY3JpcHRWYWx1ZXMgPSB7XG4gIDk6IGVjbWE5U2NyaXB0VmFsdWVzLFxuICAxMDogZWNtYTlTY3JpcHRWYWx1ZXMgKyBcIiBEb2dyYSBEb2dyIEd1bmphbGFfR29uZGkgR29uZyBIYW5pZmlfUm9oaW5neWEgUm9oZyBNYWthc2FyIE1ha2EgTWVkZWZhaWRyaW4gTWVkZiBPbGRfU29nZGlhbiBTb2dvIFNvZ2RpYW4gU29nZFwiXG59O1xuXG52YXIgZGF0YSA9IHt9O1xuZnVuY3Rpb24gYnVpbGRVbmljb2RlRGF0YShlY21hVmVyc2lvbikge1xuICB2YXIgZCA9IGRhdGFbZWNtYVZlcnNpb25dID0ge1xuICAgIGJpbmFyeTogd29yZHNSZWdleHAodW5pY29kZUJpbmFyeVByb3BlcnRpZXNbZWNtYVZlcnNpb25dICsgXCIgXCIgKyB1bmljb2RlR2VuZXJhbENhdGVnb3J5VmFsdWVzKSxcbiAgICBub25CaW5hcnk6IHtcbiAgICAgIEdlbmVyYWxfQ2F0ZWdvcnk6IHdvcmRzUmVnZXhwKHVuaWNvZGVHZW5lcmFsQ2F0ZWdvcnlWYWx1ZXMpLFxuICAgICAgU2NyaXB0OiB3b3Jkc1JlZ2V4cCh1bmljb2RlU2NyaXB0VmFsdWVzW2VjbWFWZXJzaW9uXSlcbiAgICB9XG4gIH07XG4gIGQubm9uQmluYXJ5LlNjcmlwdF9FeHRlbnNpb25zID0gZC5ub25CaW5hcnkuU2NyaXB0O1xuXG4gIGQubm9uQmluYXJ5LmdjID0gZC5ub25CaW5hcnkuR2VuZXJhbF9DYXRlZ29yeTtcbiAgZC5ub25CaW5hcnkuc2MgPSBkLm5vbkJpbmFyeS5TY3JpcHQ7XG4gIGQubm9uQmluYXJ5LnNjeCA9IGQubm9uQmluYXJ5LlNjcmlwdF9FeHRlbnNpb25zO1xufVxuYnVpbGRVbmljb2RlRGF0YSg5KTtcbmJ1aWxkVW5pY29kZURhdGEoMTApO1xuXG52YXIgcHAkOSA9IFBhcnNlci5wcm90b3R5cGU7XG5cbnZhciBSZWdFeHBWYWxpZGF0aW9uU3RhdGUgPSBmdW5jdGlvbiBSZWdFeHBWYWxpZGF0aW9uU3RhdGUocGFyc2VyKSB7XG4gIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICB0aGlzLnZhbGlkRmxhZ3MgPSBcImdpbVwiICsgKHBhcnNlci5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgPyBcInV5XCIgOiBcIlwiKSArIChwYXJzZXIub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ID8gXCJzXCIgOiBcIlwiKTtcbiAgdGhpcy51bmljb2RlUHJvcGVydGllcyA9IGRhdGFbcGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTAgPyAxMCA6IHBhcnNlci5vcHRpb25zLmVjbWFWZXJzaW9uXTtcbiAgdGhpcy5zb3VyY2UgPSBcIlwiO1xuICB0aGlzLmZsYWdzID0gXCJcIjtcbiAgdGhpcy5zdGFydCA9IDA7XG4gIHRoaXMuc3dpdGNoVSA9IGZhbHNlO1xuICB0aGlzLnN3aXRjaE4gPSBmYWxzZTtcbiAgdGhpcy5wb3MgPSAwO1xuICB0aGlzLmxhc3RJbnRWYWx1ZSA9IDA7XG4gIHRoaXMubGFzdFN0cmluZ1ZhbHVlID0gXCJcIjtcbiAgdGhpcy5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgPSBmYWxzZTtcbiAgdGhpcy5udW1DYXB0dXJpbmdQYXJlbnMgPSAwO1xuICB0aGlzLm1heEJhY2tSZWZlcmVuY2UgPSAwO1xuICB0aGlzLmdyb3VwTmFtZXMgPSBbXTtcbiAgdGhpcy5iYWNrUmVmZXJlbmNlTmFtZXMgPSBbXTtcbn07XG5cblJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCAoc3RhcnQsIHBhdHRlcm4sIGZsYWdzKSB7XG4gIHZhciB1bmljb2RlID0gZmxhZ3MuaW5kZXhPZihcInVcIikgIT09IC0xO1xuICB0aGlzLnN0YXJ0ID0gc3RhcnQgfCAwO1xuICB0aGlzLnNvdXJjZSA9IHBhdHRlcm4gKyBcIlwiO1xuICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gIHRoaXMuc3dpdGNoVSA9IHVuaWNvZGUgJiYgdGhpcy5wYXJzZXIub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2O1xuICB0aGlzLnN3aXRjaE4gPSB1bmljb2RlICYmIHRoaXMucGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOTtcbn07XG5cblJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUucmFpc2UgPSBmdW5jdGlvbiByYWlzZSAobWVzc2FnZSkge1xuICB0aGlzLnBhcnNlci5yYWlzZVJlY292ZXJhYmxlKHRoaXMuc3RhcnQsIChcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAvXCIgKyAodGhpcy5zb3VyY2UpICsgXCIvOiBcIiArIG1lc3NhZ2UpKTtcbn07XG5cbi8vIElmIHUgZmxhZyBpcyBnaXZlbiwgdGhpcyByZXR1cm5zIHRoZSBjb2RlIHBvaW50IGF0IHRoZSBpbmRleCAoaXQgY29tYmluZXMgYSBzdXJyb2dhdGUgcGFpcikuXG4vLyBPdGhlcndpc2UsIHRoaXMgcmV0dXJucyB0aGUgY29kZSB1bml0IG9mIHRoZSBpbmRleCAoY2FuIGJlIGEgcGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyKS5cblJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBhdCAoaSkge1xuICB2YXIgcyA9IHRoaXMuc291cmNlO1xuICB2YXIgbCA9IHMubGVuZ3RoO1xuICBpZiAoaSA+PSBsKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgdmFyIGMgPSBzLmNoYXJDb2RlQXQoaSk7XG4gIGlmICghdGhpcy5zd2l0Y2hVIHx8IGMgPD0gMHhEN0ZGIHx8IGMgPj0gMHhFMDAwIHx8IGkgKyAxID49IGwpIHtcbiAgICByZXR1cm4gY1xuICB9XG4gIHJldHVybiAoYyA8PCAxMCkgKyBzLmNoYXJDb2RlQXQoaSArIDEpIC0gMHgzNUZEQzAwXG59O1xuXG5SZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLm5leHRJbmRleCA9IGZ1bmN0aW9uIG5leHRJbmRleCAoaSkge1xuICB2YXIgcyA9IHRoaXMuc291cmNlO1xuICB2YXIgbCA9IHMubGVuZ3RoO1xuICBpZiAoaSA+PSBsKSB7XG4gICAgcmV0dXJuIGxcbiAgfVxuICB2YXIgYyA9IHMuY2hhckNvZGVBdChpKTtcbiAgaWYgKCF0aGlzLnN3aXRjaFUgfHwgYyA8PSAweEQ3RkYgfHwgYyA+PSAweEUwMDAgfHwgaSArIDEgPj0gbCkge1xuICAgIHJldHVybiBpICsgMVxuICB9XG4gIHJldHVybiBpICsgMlxufTtcblxuUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gY3VycmVudCAoKSB7XG4gIHJldHVybiB0aGlzLmF0KHRoaXMucG9zKVxufTtcblxuUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5sb29rYWhlYWQgPSBmdW5jdGlvbiBsb29rYWhlYWQgKCkge1xuICByZXR1cm4gdGhpcy5hdCh0aGlzLm5leHRJbmRleCh0aGlzLnBvcykpXG59O1xuXG5SZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLmFkdmFuY2UgPSBmdW5jdGlvbiBhZHZhbmNlICgpIHtcbiAgdGhpcy5wb3MgPSB0aGlzLm5leHRJbmRleCh0aGlzLnBvcyk7XG59O1xuXG5SZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLmVhdCA9IGZ1bmN0aW9uIGVhdCAoY2gpIHtcbiAgaWYgKHRoaXMuY3VycmVudCgpID09PSBjaCkge1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG5mdW5jdGlvbiBjb2RlUG9pbnRUb1N0cmluZyQxKGNoKSB7XG4gIGlmIChjaCA8PSAweEZGRkYpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpIH1cbiAgY2ggLT0gMHgxMDAwMDtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKGNoID4+IDEwKSArIDB4RDgwMCwgKGNoICYgMHgwM0ZGKSArIDB4REMwMClcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGUgZmxhZ3MgcGFydCBvZiBhIGdpdmVuIFJlZ0V4cExpdGVyYWwuXG4gKlxuICogQHBhcmFtIHtSZWdFeHBWYWxpZGF0aW9uU3RhdGV9IHN0YXRlIFRoZSBzdGF0ZSB0byB2YWxpZGF0ZSBSZWdFeHAuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xucHAkOS52YWxpZGF0ZVJlZ0V4cEZsYWdzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIHZhbGlkRmxhZ3MgPSBzdGF0ZS52YWxpZEZsYWdzO1xuICB2YXIgZmxhZ3MgPSBzdGF0ZS5mbGFncztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGZsYWcgPSBmbGFncy5jaGFyQXQoaSk7XG4gICAgaWYgKHZhbGlkRmxhZ3MuaW5kZXhPZihmbGFnKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMkMS5yYWlzZShzdGF0ZS5zdGFydCwgXCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFnXCIpO1xuICAgIH1cbiAgICBpZiAoZmxhZ3MuaW5kZXhPZihmbGFnLCBpICsgMSkgPiAtMSkge1xuICAgICAgdGhpcyQxLnJhaXNlKHN0YXRlLnN0YXJ0LCBcIkR1cGxpY2F0ZSByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ1wiKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogVmFsaWRhdGUgdGhlIHBhdHRlcm4gcGFydCBvZiBhIGdpdmVuIFJlZ0V4cExpdGVyYWwuXG4gKlxuICogQHBhcmFtIHtSZWdFeHBWYWxpZGF0aW9uU3RhdGV9IHN0YXRlIFRoZSBzdGF0ZSB0byB2YWxpZGF0ZSBSZWdFeHAuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xucHAkOS52YWxpZGF0ZVJlZ0V4cFBhdHRlcm4gPSBmdW5jdGlvbihzdGF0ZSkge1xuICB0aGlzLnJlZ2V4cF9wYXR0ZXJuKHN0YXRlKTtcblxuICAvLyBUaGUgZ29hbCBzeW1ib2wgZm9yIHRoZSBwYXJzZSBpcyB8UGF0dGVyblt+VSwgfk5dfC4gSWYgdGhlIHJlc3VsdCBvZlxuICAvLyBwYXJzaW5nIGNvbnRhaW5zIGEgfEdyb3VwTmFtZXwsIHJlcGFyc2Ugd2l0aCB0aGUgZ29hbCBzeW1ib2xcbiAgLy8gfFBhdHRlcm5bflUsICtOXXwgYW5kIHVzZSB0aGlzIHJlc3VsdCBpbnN0ZWFkLiBUaHJvdyBhICpTeW50YXhFcnJvcipcbiAgLy8gZXhjZXB0aW9uIGlmIF9QXyBkaWQgbm90IGNvbmZvcm0gdG8gdGhlIGdyYW1tYXIsIGlmIGFueSBlbGVtZW50cyBvZiBfUF9cbiAgLy8gd2VyZSBub3QgbWF0Y2hlZCBieSB0aGUgcGFyc2UsIG9yIGlmIGFueSBFYXJseSBFcnJvciBjb25kaXRpb25zIGV4aXN0LlxuICBpZiAoIXN0YXRlLnN3aXRjaE4gJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgc3RhdGUuZ3JvdXBOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgc3RhdGUuc3dpdGNoTiA9IHRydWU7XG4gICAgdGhpcy5yZWdleHBfcGF0dGVybihzdGF0ZSk7XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLVBhdHRlcm5cbnBwJDkucmVnZXhwX3BhdHRlcm4gPSBmdW5jdGlvbihzdGF0ZSkge1xuICBzdGF0ZS5wb3MgPSAwO1xuICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAwO1xuICBzdGF0ZS5sYXN0U3RyaW5nVmFsdWUgPSBcIlwiO1xuICBzdGF0ZS5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgPSBmYWxzZTtcbiAgc3RhdGUubnVtQ2FwdHVyaW5nUGFyZW5zID0gMDtcbiAgc3RhdGUubWF4QmFja1JlZmVyZW5jZSA9IDA7XG4gIHN0YXRlLmdyb3VwTmFtZXMubGVuZ3RoID0gMDtcbiAgc3RhdGUuYmFja1JlZmVyZW5jZU5hbWVzLmxlbmd0aCA9IDA7XG5cbiAgdGhpcy5yZWdleHBfZGlzanVuY3Rpb24oc3RhdGUpO1xuXG4gIGlmIChzdGF0ZS5wb3MgIT09IHN0YXRlLnNvdXJjZS5sZW5ndGgpIHtcbiAgICAvLyBNYWtlIHRoZSBzYW1lIG1lc3NhZ2VzIGFzIFY4LlxuICAgIGlmIChzdGF0ZS5lYXQoMHgyOSAvKiApICovKSkge1xuICAgICAgc3RhdGUucmFpc2UoXCJVbm1hdGNoZWQgJyknXCIpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuZWF0KDB4NUQgLyogWyAqLykgfHwgc3RhdGUuZWF0KDB4N0QgLyogfSAqLykpIHtcbiAgICAgIHN0YXRlLnJhaXNlKFwiTG9uZSBxdWFudGlmaWVyIGJyYWNrZXRzXCIpO1xuICAgIH1cbiAgfVxuICBpZiAoc3RhdGUubWF4QmFja1JlZmVyZW5jZSA+IHN0YXRlLm51bUNhcHR1cmluZ1BhcmVucykge1xuICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBlc2NhcGVcIik7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBzdGF0ZS5iYWNrUmVmZXJlbmNlTmFtZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIG5hbWUgPSBsaXN0W2ldO1xuXG4gICAgaWYgKHN0YXRlLmdyb3VwTmFtZXMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBuYW1lZCBjYXB0dXJlIHJlZmVyZW5jZWRcIik7XG4gICAgfVxuICB9XG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1EaXNqdW5jdGlvblxucHAkOS5yZWdleHBfZGlzanVuY3Rpb24gPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB0aGlzLnJlZ2V4cF9hbHRlcm5hdGl2ZShzdGF0ZSk7XG4gIHdoaWxlIChzdGF0ZS5lYXQoMHg3QyAvKiB8ICovKSkge1xuICAgIHRoaXMkMS5yZWdleHBfYWx0ZXJuYXRpdmUoc3RhdGUpO1xuICB9XG5cbiAgLy8gTWFrZSB0aGUgc2FtZSBtZXNzYWdlIGFzIFY4LlxuICBpZiAodGhpcy5yZWdleHBfZWF0UXVhbnRpZmllcihzdGF0ZSwgdHJ1ZSkpIHtcbiAgICBzdGF0ZS5yYWlzZShcIk5vdGhpbmcgdG8gcmVwZWF0XCIpO1xuICB9XG4gIGlmIChzdGF0ZS5lYXQoMHg3QiAvKiB7ICovKSkge1xuICAgIHN0YXRlLnJhaXNlKFwiTG9uZSBxdWFudGlmaWVyIGJyYWNrZXRzXCIpO1xuICB9XG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1BbHRlcm5hdGl2ZVxucHAkOS5yZWdleHBfYWx0ZXJuYXRpdmUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB3aGlsZSAoc3RhdGUucG9zIDwgc3RhdGUuc291cmNlLmxlbmd0aCAmJiB0aGlzLnJlZ2V4cF9lYXRUZXJtKHN0YXRlKSlcbiAgICB7ICB9XG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItVGVybVxucHAkOS5yZWdleHBfZWF0VGVybSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIGlmICh0aGlzLnJlZ2V4cF9lYXRBc3NlcnRpb24oc3RhdGUpKSB7XG4gICAgLy8gSGFuZGxlIGBRdWFudGlmaWFibGVBc3NlcnRpb24gUXVhbnRpZmllcmAgYWx0ZXJuYXRpdmUuXG4gICAgLy8gYHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZWAgaXMgdHJ1ZSBpZiB0aGUgbGFzdCBlYXRlbiBBc3NlcnRpb25cbiAgICAvLyBpcyBhIFF1YW50aWZpYWJsZUFzc2VydGlvbi5cbiAgICBpZiAoc3RhdGUubGFzdEFzc2VydGlvbklzUXVhbnRpZmlhYmxlICYmIHRoaXMucmVnZXhwX2VhdFF1YW50aWZpZXIoc3RhdGUpKSB7XG4gICAgICAvLyBNYWtlIHRoZSBzYW1lIG1lc3NhZ2UgYXMgVjguXG4gICAgICBpZiAoc3RhdGUuc3dpdGNoVSkge1xuICAgICAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgcXVhbnRpZmllclwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChzdGF0ZS5zd2l0Y2hVID8gdGhpcy5yZWdleHBfZWF0QXRvbShzdGF0ZSkgOiB0aGlzLnJlZ2V4cF9lYXRFeHRlbmRlZEF0b20oc3RhdGUpKSB7XG4gICAgdGhpcy5yZWdleHBfZWF0UXVhbnRpZmllcihzdGF0ZSk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufTtcblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtYW5uZXhCLUFzc2VydGlvblxucHAkOS5yZWdleHBfZWF0QXNzZXJ0aW9uID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICBzdGF0ZS5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgPSBmYWxzZTtcblxuICAvLyBeLCAkXG4gIGlmIChzdGF0ZS5lYXQoMHg1RSAvKiBeICovKSB8fCBzdGF0ZS5lYXQoMHgyNCAvKiAkICovKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBcXGIgXFxCXG4gIGlmIChzdGF0ZS5lYXQoMHg1QyAvKiBcXCAqLykpIHtcbiAgICBpZiAoc3RhdGUuZWF0KDB4NDIgLyogQiAqLykgfHwgc3RhdGUuZWF0KDB4NjIgLyogYiAqLykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICB9XG5cbiAgLy8gTG9va2FoZWFkIC8gTG9va2JlaGluZFxuICBpZiAoc3RhdGUuZWF0KDB4MjggLyogKCAqLykgJiYgc3RhdGUuZWF0KDB4M0YgLyogPyAqLykpIHtcbiAgICB2YXIgbG9va2JlaGluZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSkge1xuICAgICAgbG9va2JlaGluZCA9IHN0YXRlLmVhdCgweDNDIC8qIDwgKi8pO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuZWF0KDB4M0QgLyogPSAqLykgfHwgc3RhdGUuZWF0KDB4MjEgLyogISAqLykpIHtcbiAgICAgIHRoaXMucmVnZXhwX2Rpc2p1bmN0aW9uKHN0YXRlKTtcbiAgICAgIGlmICghc3RhdGUuZWF0KDB4MjkgLyogKSAqLykpIHtcbiAgICAgICAgc3RhdGUucmFpc2UoXCJVbnRlcm1pbmF0ZWQgZ3JvdXBcIik7XG4gICAgICB9XG4gICAgICBzdGF0ZS5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgPSAhbG9va2JlaGluZDtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIHJldHVybiBmYWxzZVxufTtcblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtUXVhbnRpZmllclxucHAkOS5yZWdleHBfZWF0UXVhbnRpZmllciA9IGZ1bmN0aW9uKHN0YXRlLCBub0Vycm9yKSB7XG4gIGlmICggbm9FcnJvciA9PT0gdm9pZCAwICkgbm9FcnJvciA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLnJlZ2V4cF9lYXRRdWFudGlmaWVyUHJlZml4KHN0YXRlLCBub0Vycm9yKSkge1xuICAgIHN0YXRlLmVhdCgweDNGIC8qID8gKi8pO1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1RdWFudGlmaWVyUHJlZml4XG5wcCQ5LnJlZ2V4cF9lYXRRdWFudGlmaWVyUHJlZml4ID0gZnVuY3Rpb24oc3RhdGUsIG5vRXJyb3IpIHtcbiAgcmV0dXJuIChcbiAgICBzdGF0ZS5lYXQoMHgyQSAvKiAqICovKSB8fFxuICAgIHN0YXRlLmVhdCgweDJCIC8qICsgKi8pIHx8XG4gICAgc3RhdGUuZWF0KDB4M0YgLyogPyAqLykgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRCcmFjZWRRdWFudGlmaWVyKHN0YXRlLCBub0Vycm9yKVxuICApXG59O1xucHAkOS5yZWdleHBfZWF0QnJhY2VkUXVhbnRpZmllciA9IGZ1bmN0aW9uKHN0YXRlLCBub0Vycm9yKSB7XG4gIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgaWYgKHN0YXRlLmVhdCgweDdCIC8qIHsgKi8pKSB7XG4gICAgdmFyIG1pbiA9IDAsIG1heCA9IC0xO1xuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXREZWNpbWFsRGlnaXRzKHN0YXRlKSkge1xuICAgICAgbWluID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgaWYgKHN0YXRlLmVhdCgweDJDIC8qICwgKi8pICYmIHRoaXMucmVnZXhwX2VhdERlY2ltYWxEaWdpdHMoc3RhdGUpKSB7XG4gICAgICAgIG1heCA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5lYXQoMHg3RCAvKiB9ICovKSkge1xuICAgICAgICAvLyBTeW50YXhFcnJvciBpbiBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jc2VjLXRlcm1cbiAgICAgICAgaWYgKG1heCAhPT0gLTEgJiYgbWF4IDwgbWluICYmICFub0Vycm9yKSB7XG4gICAgICAgICAgc3RhdGUucmFpc2UoXCJudW1iZXJzIG91dCBvZiBvcmRlciBpbiB7fSBxdWFudGlmaWVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGF0ZS5zd2l0Y2hVICYmICFub0Vycm9yKSB7XG4gICAgICBzdGF0ZS5yYWlzZShcIkluY29tcGxldGUgcXVhbnRpZmllclwiKTtcbiAgICB9XG4gICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1BdG9tXG5wcCQ5LnJlZ2V4cF9lYXRBdG9tID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgcmV0dXJuIChcbiAgICB0aGlzLnJlZ2V4cF9lYXRQYXR0ZXJuQ2hhcmFjdGVycyhzdGF0ZSkgfHxcbiAgICBzdGF0ZS5lYXQoMHgyRSAvKiAuICovKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdFJldmVyc2VTb2xpZHVzQXRvbUVzY2FwZShzdGF0ZSkgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJDbGFzcyhzdGF0ZSkgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRVbmNhcHR1cmluZ0dyb3VwKHN0YXRlKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdENhcHR1cmluZ0dyb3VwKHN0YXRlKVxuICApXG59O1xucHAkOS5yZWdleHBfZWF0UmV2ZXJzZVNvbGlkdXNBdG9tRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICBpZiAoc3RhdGUuZWF0KDB4NUMgLyogXFwgKi8pKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdEF0b21Fc2NhcGUoc3RhdGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5wcCQ5LnJlZ2V4cF9lYXRVbmNhcHR1cmluZ0dyb3VwID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICBpZiAoc3RhdGUuZWF0KDB4MjggLyogKCAqLykpIHtcbiAgICBpZiAoc3RhdGUuZWF0KDB4M0YgLyogPyAqLykgJiYgc3RhdGUuZWF0KDB4M0EgLyogOiAqLykpIHtcbiAgICAgIHRoaXMucmVnZXhwX2Rpc2p1bmN0aW9uKHN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZS5lYXQoMHgyOSAvKiApICovKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgc3RhdGUucmFpc2UoXCJVbnRlcm1pbmF0ZWQgZ3JvdXBcIik7XG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICB9XG4gIHJldHVybiBmYWxzZVxufTtcbnBwJDkucmVnZXhwX2VhdENhcHR1cmluZ0dyb3VwID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVhdCgweDI4IC8qICggKi8pKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5KSB7XG4gICAgICB0aGlzLnJlZ2V4cF9ncm91cFNwZWNpZmllcihzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5jdXJyZW50KCkgPT09IDB4M0YgLyogPyAqLykge1xuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGdyb3VwXCIpO1xuICAgIH1cbiAgICB0aGlzLnJlZ2V4cF9kaXNqdW5jdGlvbihzdGF0ZSk7XG4gICAgaWYgKHN0YXRlLmVhdCgweDI5IC8qICkgKi8pKSB7XG4gICAgICBzdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnMgKz0gMTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLnJhaXNlKFwiVW50ZXJtaW5hdGVkIGdyb3VwXCIpO1xuICB9XG4gIHJldHVybiBmYWxzZVxufTtcblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtYW5uZXhCLUV4dGVuZGVkQXRvbVxucHAkOS5yZWdleHBfZWF0RXh0ZW5kZWRBdG9tID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgcmV0dXJuIChcbiAgICBzdGF0ZS5lYXQoMHgyRSAvKiAuICovKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdFJldmVyc2VTb2xpZHVzQXRvbUVzY2FwZShzdGF0ZSkgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJDbGFzcyhzdGF0ZSkgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRVbmNhcHR1cmluZ0dyb3VwKHN0YXRlKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdENhcHR1cmluZ0dyb3VwKHN0YXRlKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdEludmFsaWRCcmFjZWRRdWFudGlmaWVyKHN0YXRlKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdEV4dGVuZGVkUGF0dGVybkNoYXJhY3RlcihzdGF0ZSlcbiAgKVxufTtcblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtYW5uZXhCLUludmFsaWRCcmFjZWRRdWFudGlmaWVyXG5wcCQ5LnJlZ2V4cF9lYXRJbnZhbGlkQnJhY2VkUXVhbnRpZmllciA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIGlmICh0aGlzLnJlZ2V4cF9lYXRCcmFjZWRRdWFudGlmaWVyKHN0YXRlLCB0cnVlKSkge1xuICAgIHN0YXRlLnJhaXNlKFwiTm90aGluZyB0byByZXBlYXRcIik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1TeW50YXhDaGFyYWN0ZXJcbnBwJDkucmVnZXhwX2VhdFN5bnRheENoYXJhY3RlciA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBjaCA9IHN0YXRlLmN1cnJlbnQoKTtcbiAgaWYgKGlzU3ludGF4Q2hhcmFjdGVyKGNoKSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufTtcbmZ1bmN0aW9uIGlzU3ludGF4Q2hhcmFjdGVyKGNoKSB7XG4gIHJldHVybiAoXG4gICAgY2ggPT09IDB4MjQgLyogJCAqLyB8fFxuICAgIGNoID49IDB4MjggLyogKCAqLyAmJiBjaCA8PSAweDJCIC8qICsgKi8gfHxcbiAgICBjaCA9PT0gMHgyRSAvKiAuICovIHx8XG4gICAgY2ggPT09IDB4M0YgLyogPyAqLyB8fFxuICAgIGNoID49IDB4NUIgLyogWyAqLyAmJiBjaCA8PSAweDVFIC8qIF4gKi8gfHxcbiAgICBjaCA+PSAweDdCIC8qIHsgKi8gJiYgY2ggPD0gMHg3RCAvKiB9ICovXG4gIClcbn1cblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtUGF0dGVybkNoYXJhY3RlclxuLy8gQnV0IGVhdCBlYWdlci5cbnBwJDkucmVnZXhwX2VhdFBhdHRlcm5DaGFyYWN0ZXJzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICB2YXIgY2ggPSAwO1xuICB3aGlsZSAoKGNoID0gc3RhdGUuY3VycmVudCgpKSAhPT0gLTEgJiYgIWlzU3ludGF4Q2hhcmFjdGVyKGNoKSkge1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgfVxuICByZXR1cm4gc3RhdGUucG9zICE9PSBzdGFydFxufTtcblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtYW5uZXhCLUV4dGVuZGVkUGF0dGVybkNoYXJhY3RlclxucHAkOS5yZWdleHBfZWF0RXh0ZW5kZWRQYXR0ZXJuQ2hhcmFjdGVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICBpZiAoXG4gICAgY2ggIT09IC0xICYmXG4gICAgY2ggIT09IDB4MjQgLyogJCAqLyAmJlxuICAgICEoY2ggPj0gMHgyOCAvKiAoICovICYmIGNoIDw9IDB4MkIgLyogKyAqLykgJiZcbiAgICBjaCAhPT0gMHgyRSAvKiAuICovICYmXG4gICAgY2ggIT09IDB4M0YgLyogPyAqLyAmJlxuICAgIGNoICE9PSAweDVCIC8qIFsgKi8gJiZcbiAgICBjaCAhPT0gMHg1RSAvKiBeICovICYmXG4gICAgY2ggIT09IDB4N0MgLyogfCAqL1xuICApIHtcbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIEdyb3VwU3BlY2lmaWVyW1VdIDo6XG4vLyAgIFtlbXB0eV1cbi8vICAgYD9gIEdyb3VwTmFtZVs/VV1cbnBwJDkucmVnZXhwX2dyb3VwU3BlY2lmaWVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVhdCgweDNGIC8qID8gKi8pKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdEdyb3VwTmFtZShzdGF0ZSkpIHtcbiAgICAgIGlmIChzdGF0ZS5ncm91cE5hbWVzLmluZGV4T2Yoc3RhdGUubGFzdFN0cmluZ1ZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgc3RhdGUucmFpc2UoXCJEdXBsaWNhdGUgY2FwdHVyZSBncm91cCBuYW1lXCIpO1xuICAgICAgfVxuICAgICAgc3RhdGUuZ3JvdXBOYW1lcy5wdXNoKHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSk7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGdyb3VwXCIpO1xuICB9XG59O1xuXG4vLyBHcm91cE5hbWVbVV0gOjpcbi8vICAgYDxgIFJlZ0V4cElkZW50aWZpZXJOYW1lWz9VXSBgPmBcbi8vIE5vdGU6IHRoaXMgdXBkYXRlcyBgc3RhdGUubGFzdFN0cmluZ1ZhbHVlYCBwcm9wZXJ0eSB3aXRoIHRoZSBlYXRlbiBuYW1lLlxucHAkOS5yZWdleHBfZWF0R3JvdXBOYW1lID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlID0gXCJcIjtcbiAgaWYgKHN0YXRlLmVhdCgweDNDIC8qIDwgKi8pKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdFJlZ0V4cElkZW50aWZpZXJOYW1lKHN0YXRlKSAmJiBzdGF0ZS5lYXQoMHgzRSAvKiA+ICovKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGNhcHR1cmUgZ3JvdXAgbmFtZVwiKTtcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIFJlZ0V4cElkZW50aWZpZXJOYW1lW1VdIDo6XG4vLyAgIFJlZ0V4cElkZW50aWZpZXJTdGFydFs/VV1cbi8vICAgUmVnRXhwSWRlbnRpZmllck5hbWVbP1VdIFJlZ0V4cElkZW50aWZpZXJQYXJ0Wz9VXVxuLy8gTm90ZTogdGhpcyB1cGRhdGVzIGBzdGF0ZS5sYXN0U3RyaW5nVmFsdWVgIHByb3BlcnR5IHdpdGggdGhlIGVhdGVuIG5hbWUuXG5wcCQ5LnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyTmFtZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSA9IFwiXCI7XG4gIGlmICh0aGlzLnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyU3RhcnQoc3RhdGUpKSB7XG4gICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nJDEoc3RhdGUubGFzdEludFZhbHVlKTtcbiAgICB3aGlsZSAodGhpcy5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllclBhcnQoc3RhdGUpKSB7XG4gICAgICBzdGF0ZS5sYXN0U3RyaW5nVmFsdWUgKz0gY29kZVBvaW50VG9TdHJpbmckMShzdGF0ZS5sYXN0SW50VmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufTtcblxuLy8gUmVnRXhwSWRlbnRpZmllclN0YXJ0W1VdIDo6XG4vLyAgIFVuaWNvZGVJRFN0YXJ0XG4vLyAgIGAkYFxuLy8gICBgX2Bcbi8vICAgYFxcYCBSZWdFeHBVbmljb2RlRXNjYXBlU2VxdWVuY2VbP1VdXG5wcCQ5LnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyU3RhcnQgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gIHZhciBjaCA9IHN0YXRlLmN1cnJlbnQoKTtcbiAgc3RhdGUuYWR2YW5jZSgpO1xuXG4gIGlmIChjaCA9PT0gMHg1QyAvKiBcXCAqLyAmJiB0aGlzLnJlZ2V4cF9lYXRSZWdFeHBVbmljb2RlRXNjYXBlU2VxdWVuY2Uoc3RhdGUpKSB7XG4gICAgY2ggPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gIH1cbiAgaWYgKGlzUmVnRXhwSWRlbnRpZmllclN0YXJ0KGNoKSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgcmV0dXJuIGZhbHNlXG59O1xuZnVuY3Rpb24gaXNSZWdFeHBJZGVudGlmaWVyU3RhcnQoY2gpIHtcbiAgcmV0dXJuIGlzSWRlbnRpZmllclN0YXJ0KGNoLCB0cnVlKSB8fCBjaCA9PT0gMHgyNCAvKiAkICovIHx8IGNoID09PSAweDVGIC8qIF8gKi9cbn1cblxuLy8gUmVnRXhwSWRlbnRpZmllclBhcnRbVV0gOjpcbi8vICAgVW5pY29kZUlEQ29udGludWVcbi8vICAgYCRgXG4vLyAgIGBfYFxuLy8gICBgXFxgIFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZVs/VV1cbi8vICAgPFpXTko+XG4vLyAgIDxaV0o+XG5wcCQ5LnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyUGFydCA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICBzdGF0ZS5hZHZhbmNlKCk7XG5cbiAgaWYgKGNoID09PSAweDVDIC8qIFxcICovICYmIHRoaXMucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZShzdGF0ZSkpIHtcbiAgICBjaCA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgfVxuICBpZiAoaXNSZWdFeHBJZGVudGlmaWVyUGFydChjaCkpIHtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBjaDtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIHJldHVybiBmYWxzZVxufTtcbmZ1bmN0aW9uIGlzUmVnRXhwSWRlbnRpZmllclBhcnQoY2gpIHtcbiAgcmV0dXJuIGlzSWRlbnRpZmllckNoYXIoY2gsIHRydWUpIHx8IGNoID09PSAweDI0IC8qICQgKi8gfHwgY2ggPT09IDB4NUYgLyogXyAqLyB8fCBjaCA9PT0gMHgyMDBDIC8qIDxaV05KPiAqLyB8fCBjaCA9PT0gMHgyMDBEIC8qIDxaV0o+ICovXG59XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1BdG9tRXNjYXBlXG5wcCQ5LnJlZ2V4cF9lYXRBdG9tRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgaWYgKFxuICAgIHRoaXMucmVnZXhwX2VhdEJhY2tSZWZlcmVuY2Uoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyRXNjYXBlKHN0YXRlKSB8fFxuICAgIChzdGF0ZS5zd2l0Y2hOICYmIHRoaXMucmVnZXhwX2VhdEtHcm91cE5hbWUoc3RhdGUpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgLy8gTWFrZSB0aGUgc2FtZSBtZXNzYWdlIGFzIFY4LlxuICAgIGlmIChzdGF0ZS5jdXJyZW50KCkgPT09IDB4NjMgLyogYyAqLykge1xuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIHVuaWNvZGUgZXNjYXBlXCIpO1xuICAgIH1cbiAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgZXNjYXBlXCIpO1xuICB9XG4gIHJldHVybiBmYWxzZVxufTtcbnBwJDkucmVnZXhwX2VhdEJhY2tSZWZlcmVuY2UgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gIGlmICh0aGlzLnJlZ2V4cF9lYXREZWNpbWFsRXNjYXBlKHN0YXRlKSkge1xuICAgIHZhciBuID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgICAvLyBGb3IgU3ludGF4RXJyb3IgaW4gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3NlYy1hdG9tZXNjYXBlXG4gICAgICBpZiAobiA+IHN0YXRlLm1heEJhY2tSZWZlcmVuY2UpIHtcbiAgICAgICAgc3RhdGUubWF4QmFja1JlZmVyZW5jZSA9IG47XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAobiA8PSBzdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnMpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICB9XG4gIHJldHVybiBmYWxzZVxufTtcbnBwJDkucmVnZXhwX2VhdEtHcm91cE5hbWUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICBpZiAoc3RhdGUuZWF0KDB4NkIgLyogayAqLykpIHtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0R3JvdXBOYW1lKHN0YXRlKSkge1xuICAgICAgc3RhdGUuYmFja1JlZmVyZW5jZU5hbWVzLnB1c2goc3RhdGUubGFzdFN0cmluZ1ZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBuYW1lZCByZWZlcmVuY2VcIik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQ2hhcmFjdGVyRXNjYXBlXG5wcCQ5LnJlZ2V4cF9lYXRDaGFyYWN0ZXJFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICByZXR1cm4gKFxuICAgIHRoaXMucmVnZXhwX2VhdENvbnRyb2xFc2NhcGUoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0Q0NvbnRyb2xMZXR0ZXIoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0WmVybyhzdGF0ZSkgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRIZXhFc2NhcGVTZXF1ZW5jZShzdGF0ZSkgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRSZWdFeHBVbmljb2RlRXNjYXBlU2VxdWVuY2Uoc3RhdGUpIHx8XG4gICAgKCFzdGF0ZS5zd2l0Y2hVICYmIHRoaXMucmVnZXhwX2VhdExlZ2FjeU9jdGFsRXNjYXBlU2VxdWVuY2Uoc3RhdGUpKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdElkZW50aXR5RXNjYXBlKHN0YXRlKVxuICApXG59O1xucHAkOS5yZWdleHBfZWF0Q0NvbnRyb2xMZXR0ZXIgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gIGlmIChzdGF0ZS5lYXQoMHg2MyAvKiBjICovKSkge1xuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRDb250cm9sTGV0dGVyKHN0YXRlKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xucHAkOS5yZWdleHBfZWF0WmVybyA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5jdXJyZW50KCkgPT09IDB4MzAgLyogMCAqLyAmJiAhaXNEZWNpbWFsRGlnaXQoc3RhdGUubG9va2FoZWFkKCkpKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMDtcbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUNvbnRyb2xFc2NhcGVcbnBwJDkucmVnZXhwX2VhdENvbnRyb2xFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gIGlmIChjaCA9PT0gMHg3NCAvKiB0ICovKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMHgwOTsgLyogXFx0ICovXG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKGNoID09PSAweDZFIC8qIG4gKi8pIHtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBBOyAvKiBcXG4gKi9cbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoY2ggPT09IDB4NzYgLyogdiAqLykge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDB4MEI7IC8qIFxcdiAqL1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmIChjaCA9PT0gMHg2NiAvKiBmICovKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMHgwQzsgLyogXFxmICovXG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKGNoID09PSAweDcyIC8qIHIgKi8pIHtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBEOyAvKiBcXHIgKi9cbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUNvbnRyb2xMZXR0ZXJcbnBwJDkucmVnZXhwX2VhdENvbnRyb2xMZXR0ZXIgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gIGlmIChpc0NvbnRyb2xMZXR0ZXIoY2gpKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gY2ggJSAweDIwO1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufTtcbmZ1bmN0aW9uIGlzQ29udHJvbExldHRlcihjaCkge1xuICByZXR1cm4gKFxuICAgIChjaCA+PSAweDQxIC8qIEEgKi8gJiYgY2ggPD0gMHg1QSAvKiBaICovKSB8fFxuICAgIChjaCA+PSAweDYxIC8qIGEgKi8gJiYgY2ggPD0gMHg3QSAvKiB6ICovKVxuICApXG59XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLVJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZVxucHAkOS5yZWdleHBfZWF0UmVnRXhwVW5pY29kZUVzY2FwZVNlcXVlbmNlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuXG4gIGlmIChzdGF0ZS5lYXQoMHg3NSAvKiB1ICovKSkge1xuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRGaXhlZEhleERpZ2l0cyhzdGF0ZSwgNCkpIHtcbiAgICAgIHZhciBsZWFkID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgaWYgKHN0YXRlLnN3aXRjaFUgJiYgbGVhZCA+PSAweEQ4MDAgJiYgbGVhZCA8PSAweERCRkYpIHtcbiAgICAgICAgdmFyIGxlYWRTdXJyb2dhdGVFbmQgPSBzdGF0ZS5wb3M7XG4gICAgICAgIGlmIChzdGF0ZS5lYXQoMHg1QyAvKiBcXCAqLykgJiYgc3RhdGUuZWF0KDB4NzUgLyogdSAqLykgJiYgdGhpcy5yZWdleHBfZWF0Rml4ZWRIZXhEaWdpdHMoc3RhdGUsIDQpKSB7XG4gICAgICAgICAgdmFyIHRyYWlsID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgICAgIGlmICh0cmFpbCA+PSAweERDMDAgJiYgdHJhaWwgPD0gMHhERkZGKSB7XG4gICAgICAgICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAobGVhZCAtIDB4RDgwMCkgKiAweDQwMCArICh0cmFpbCAtIDB4REMwMCkgKyAweDEwMDAwO1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUucG9zID0gbGVhZFN1cnJvZ2F0ZUVuZDtcbiAgICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gbGVhZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChcbiAgICAgIHN0YXRlLnN3aXRjaFUgJiZcbiAgICAgIHN0YXRlLmVhdCgweDdCIC8qIHsgKi8pICYmXG4gICAgICB0aGlzLnJlZ2V4cF9lYXRIZXhEaWdpdHMoc3RhdGUpICYmXG4gICAgICBzdGF0ZS5lYXQoMHg3RCAvKiB9ICovKSAmJlxuICAgICAgaXNWYWxpZFVuaWNvZGUoc3RhdGUubGFzdEludFZhbHVlKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKHN0YXRlLnN3aXRjaFUpIHtcbiAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCB1bmljb2RlIGVzY2FwZVwiKTtcbiAgICB9XG4gICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn07XG5mdW5jdGlvbiBpc1ZhbGlkVW5pY29kZShjaCkge1xuICByZXR1cm4gY2ggPj0gMCAmJiBjaCA8PSAweDEwRkZGRlxufVxuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItSWRlbnRpdHlFc2NhcGVcbnBwJDkucmVnZXhwX2VhdElkZW50aXR5RXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgaWYgKHN0YXRlLnN3aXRjaFUpIHtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0U3ludGF4Q2hhcmFjdGVyKHN0YXRlKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKHN0YXRlLmVhdCgweDJGIC8qIC8gKi8pKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDJGOyAvKiAvICovXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHZhciBjaCA9IHN0YXRlLmN1cnJlbnQoKTtcbiAgaWYgKGNoICE9PSAweDYzIC8qIGMgKi8gJiYgKCFzdGF0ZS5zd2l0Y2hOIHx8IGNoICE9PSAweDZCIC8qIGsgKi8pKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gY2g7XG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLURlY2ltYWxFc2NhcGVcbnBwJDkucmVnZXhwX2VhdERlY2ltYWxFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAwO1xuICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gIGlmIChjaCA+PSAweDMxIC8qIDEgKi8gJiYgY2ggPD0gMHgzOSAvKiA5ICovKSB7XG4gICAgZG8ge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMTAgKiBzdGF0ZS5sYXN0SW50VmFsdWUgKyAoY2ggLSAweDMwIC8qIDAgKi8pO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIH0gd2hpbGUgKChjaCA9IHN0YXRlLmN1cnJlbnQoKSkgPj0gMHgzMCAvKiAwICovICYmIGNoIDw9IDB4MzkgLyogOSAqLylcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufTtcblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQ2hhcmFjdGVyQ2xhc3NFc2NhcGVcbnBwJDkucmVnZXhwX2VhdENoYXJhY3RlckNsYXNzRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuXG4gIGlmIChpc0NoYXJhY3RlckNsYXNzRXNjYXBlKGNoKSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IC0xO1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKFxuICAgIHN0YXRlLnN3aXRjaFUgJiZcbiAgICB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSAmJlxuICAgIChjaCA9PT0gMHg1MCAvKiBQICovIHx8IGNoID09PSAweDcwIC8qIHAgKi8pXG4gICkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IC0xO1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICBpZiAoXG4gICAgICBzdGF0ZS5lYXQoMHg3QiAvKiB7ICovKSAmJlxuICAgICAgdGhpcy5yZWdleHBfZWF0VW5pY29kZVByb3BlcnR5VmFsdWVFeHByZXNzaW9uKHN0YXRlKSAmJlxuICAgICAgc3RhdGUuZWF0KDB4N0QgLyogfSAqLylcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBwcm9wZXJ0eSBuYW1lXCIpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59O1xuZnVuY3Rpb24gaXNDaGFyYWN0ZXJDbGFzc0VzY2FwZShjaCkge1xuICByZXR1cm4gKFxuICAgIGNoID09PSAweDY0IC8qIGQgKi8gfHxcbiAgICBjaCA9PT0gMHg0NCAvKiBEICovIHx8XG4gICAgY2ggPT09IDB4NzMgLyogcyAqLyB8fFxuICAgIGNoID09PSAweDUzIC8qIFMgKi8gfHxcbiAgICBjaCA9PT0gMHg3NyAvKiB3ICovIHx8XG4gICAgY2ggPT09IDB4NTcgLyogVyAqL1xuICApXG59XG5cbi8vIFVuaWNvZGVQcm9wZXJ0eVZhbHVlRXhwcmVzc2lvbiA6OlxuLy8gICBVbmljb2RlUHJvcGVydHlOYW1lIGA9YCBVbmljb2RlUHJvcGVydHlWYWx1ZVxuLy8gICBMb25lVW5pY29kZVByb3BlcnR5TmFtZU9yVmFsdWVcbnBwJDkucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBzdGFydCA9IHN0YXRlLnBvcztcblxuICAvLyBVbmljb2RlUHJvcGVydHlOYW1lIGA9YCBVbmljb2RlUHJvcGVydHlWYWx1ZVxuICBpZiAodGhpcy5yZWdleHBfZWF0VW5pY29kZVByb3BlcnR5TmFtZShzdGF0ZSkgJiYgc3RhdGUuZWF0KDB4M0QgLyogPSAqLykpIHtcbiAgICB2YXIgbmFtZSA9IHN0YXRlLmxhc3RTdHJpbmdWYWx1ZTtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0VW5pY29kZVByb3BlcnR5VmFsdWUoc3RhdGUpKSB7XG4gICAgICB2YXIgdmFsdWUgPSBzdGF0ZS5sYXN0U3RyaW5nVmFsdWU7XG4gICAgICB0aGlzLnJlZ2V4cF92YWxpZGF0ZVVuaWNvZGVQcm9wZXJ0eU5hbWVBbmRWYWx1ZShzdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgc3RhdGUucG9zID0gc3RhcnQ7XG5cbiAgLy8gTG9uZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlXG4gIGlmICh0aGlzLnJlZ2V4cF9lYXRMb25lVW5pY29kZVByb3BlcnR5TmFtZU9yVmFsdWUoc3RhdGUpKSB7XG4gICAgdmFyIG5hbWVPclZhbHVlID0gc3RhdGUubGFzdFN0cmluZ1ZhbHVlO1xuICAgIHRoaXMucmVnZXhwX3ZhbGlkYXRlVW5pY29kZVByb3BlcnR5TmFtZU9yVmFsdWUoc3RhdGUsIG5hbWVPclZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufTtcbnBwJDkucmVnZXhwX3ZhbGlkYXRlVW5pY29kZVByb3BlcnR5TmFtZUFuZFZhbHVlID0gZnVuY3Rpb24oc3RhdGUsIG5hbWUsIHZhbHVlKSB7XG4gIGlmICghaGFzKHN0YXRlLnVuaWNvZGVQcm9wZXJ0aWVzLm5vbkJpbmFyeSwgbmFtZSkpXG4gICAgeyBzdGF0ZS5yYWlzZShcIkludmFsaWQgcHJvcGVydHkgbmFtZVwiKTsgfVxuICBpZiAoIXN0YXRlLnVuaWNvZGVQcm9wZXJ0aWVzLm5vbkJpbmFyeVtuYW1lXS50ZXN0KHZhbHVlKSlcbiAgICB7IHN0YXRlLnJhaXNlKFwiSW52YWxpZCBwcm9wZXJ0eSB2YWx1ZVwiKTsgfVxufTtcbnBwJDkucmVnZXhwX3ZhbGlkYXRlVW5pY29kZVByb3BlcnR5TmFtZU9yVmFsdWUgPSBmdW5jdGlvbihzdGF0ZSwgbmFtZU9yVmFsdWUpIHtcbiAgaWYgKCFzdGF0ZS51bmljb2RlUHJvcGVydGllcy5iaW5hcnkudGVzdChuYW1lT3JWYWx1ZSkpXG4gICAgeyBzdGF0ZS5yYWlzZShcIkludmFsaWQgcHJvcGVydHkgbmFtZVwiKTsgfVxufTtcblxuLy8gVW5pY29kZVByb3BlcnR5TmFtZSA6OlxuLy8gICBVbmljb2RlUHJvcGVydHlOYW1lQ2hhcmFjdGVyc1xucHAkOS5yZWdleHBfZWF0VW5pY29kZVByb3BlcnR5TmFtZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBjaCA9IDA7XG4gIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSA9IFwiXCI7XG4gIHdoaWxlIChpc1VuaWNvZGVQcm9wZXJ0eU5hbWVDaGFyYWN0ZXIoY2ggPSBzdGF0ZS5jdXJyZW50KCkpKSB7XG4gICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nJDEoY2gpO1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgfVxuICByZXR1cm4gc3RhdGUubGFzdFN0cmluZ1ZhbHVlICE9PSBcIlwiXG59O1xuZnVuY3Rpb24gaXNVbmljb2RlUHJvcGVydHlOYW1lQ2hhcmFjdGVyKGNoKSB7XG4gIHJldHVybiBpc0NvbnRyb2xMZXR0ZXIoY2gpIHx8IGNoID09PSAweDVGIC8qIF8gKi9cbn1cblxuLy8gVW5pY29kZVByb3BlcnR5VmFsdWUgOjpcbi8vICAgVW5pY29kZVByb3BlcnR5VmFsdWVDaGFyYWN0ZXJzXG5wcCQ5LnJlZ2V4cF9lYXRVbmljb2RlUHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBjaCA9IDA7XG4gIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSA9IFwiXCI7XG4gIHdoaWxlIChpc1VuaWNvZGVQcm9wZXJ0eVZhbHVlQ2hhcmFjdGVyKGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSArPSBjb2RlUG9pbnRUb1N0cmluZyQxKGNoKTtcbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSAhPT0gXCJcIlxufTtcbmZ1bmN0aW9uIGlzVW5pY29kZVByb3BlcnR5VmFsdWVDaGFyYWN0ZXIoY2gpIHtcbiAgcmV0dXJuIGlzVW5pY29kZVByb3BlcnR5TmFtZUNoYXJhY3RlcihjaCkgfHwgaXNEZWNpbWFsRGlnaXQoY2gpXG59XG5cbi8vIExvbmVVbmljb2RlUHJvcGVydHlOYW1lT3JWYWx1ZSA6OlxuLy8gICBVbmljb2RlUHJvcGVydHlWYWx1ZUNoYXJhY3RlcnNcbnBwJDkucmVnZXhwX2VhdExvbmVVbmljb2RlUHJvcGVydHlOYW1lT3JWYWx1ZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHJldHVybiB0aGlzLnJlZ2V4cF9lYXRVbmljb2RlUHJvcGVydHlWYWx1ZShzdGF0ZSlcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUNoYXJhY3RlckNsYXNzXG5wcCQ5LnJlZ2V4cF9lYXRDaGFyYWN0ZXJDbGFzcyA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lYXQoMHg1QiAvKiBbICovKSkge1xuICAgIHN0YXRlLmVhdCgweDVFIC8qIF4gKi8pO1xuICAgIHRoaXMucmVnZXhwX2NsYXNzUmFuZ2VzKHN0YXRlKTtcbiAgICBpZiAoc3RhdGUuZWF0KDB4NUQgLyogWyAqLykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIFVucmVhY2hhYmxlIHNpbmNlIGl0IHRocmV3IFwidW50ZXJtaW5hdGVkIHJlZ3VsYXIgZXhwcmVzc2lvblwiIGVycm9yIGJlZm9yZS5cbiAgICBzdGF0ZS5yYWlzZShcIlVudGVybWluYXRlZCBjaGFyYWN0ZXIgY2xhc3NcIik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1DbGFzc1Jhbmdlc1xuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtTm9uZW1wdHlDbGFzc1Jhbmdlc1xuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtTm9uZW1wdHlDbGFzc1Jhbmdlc05vRGFzaFxucHAkOS5yZWdleHBfY2xhc3NSYW5nZXMgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB3aGlsZSAodGhpcy5yZWdleHBfZWF0Q2xhc3NBdG9tKHN0YXRlKSkge1xuICAgIHZhciBsZWZ0ID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgIGlmIChzdGF0ZS5lYXQoMHgyRCAvKiAtICovKSAmJiB0aGlzJDEucmVnZXhwX2VhdENsYXNzQXRvbShzdGF0ZSkpIHtcbiAgICAgIHZhciByaWdodCA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICAgIGlmIChzdGF0ZS5zd2l0Y2hVICYmIChsZWZ0ID09PSAtMSB8fCByaWdodCA9PT0gLTEpKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBjaGFyYWN0ZXIgY2xhc3NcIik7XG4gICAgICB9XG4gICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xICYmIGxlZnQgPiByaWdodCkge1xuICAgICAgICBzdGF0ZS5yYWlzZShcIlJhbmdlIG91dCBvZiBvcmRlciBpbiBjaGFyYWN0ZXIgY2xhc3NcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1DbGFzc0F0b21cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUNsYXNzQXRvbU5vRGFzaFxucHAkOS5yZWdleHBfZWF0Q2xhc3NBdG9tID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuXG4gIGlmIChzdGF0ZS5lYXQoMHg1QyAvKiBcXCAqLykpIHtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0Q2xhc3NFc2NhcGUoc3RhdGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoc3RhdGUuc3dpdGNoVSkge1xuICAgICAgLy8gTWFrZSB0aGUgc2FtZSBtZXNzYWdlIGFzIFY4LlxuICAgICAgdmFyIGNoJDEgPSBzdGF0ZS5jdXJyZW50KCk7XG4gICAgICBpZiAoY2gkMSA9PT0gMHg2MyAvKiBjICovIHx8IGlzT2N0YWxEaWdpdChjaCQxKSkge1xuICAgICAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgY2xhc3MgZXNjYXBlXCIpO1xuICAgICAgfVxuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGVzY2FwZVwiKTtcbiAgICB9XG4gICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIH1cblxuICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gIGlmIChjaCAhPT0gMHg1RCAvKiBbICovKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gY2g7XG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1DbGFzc0VzY2FwZVxucHAkOS5yZWdleHBfZWF0Q2xhc3NFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG5cbiAgaWYgKHN0YXRlLmVhdCgweDYyIC8qIGIgKi8pKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMHgwODsgLyogPEJTPiAqL1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoc3RhdGUuc3dpdGNoVSAmJiBzdGF0ZS5lYXQoMHgyRCAvKiAtICovKSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDB4MkQ7IC8qIC0gKi9cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKCFzdGF0ZS5zd2l0Y2hVICYmIHN0YXRlLmVhdCgweDYzIC8qIGMgKi8pKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdENsYXNzQ29udHJvbExldHRlcihzdGF0ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICB0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJDbGFzc0VzY2FwZShzdGF0ZSkgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJFc2NhcGUoc3RhdGUpXG4gIClcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1DbGFzc0NvbnRyb2xMZXR0ZXJcbnBwJDkucmVnZXhwX2VhdENsYXNzQ29udHJvbExldHRlciA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBjaCA9IHN0YXRlLmN1cnJlbnQoKTtcbiAgaWYgKGlzRGVjaW1hbERpZ2l0KGNoKSB8fCBjaCA9PT0gMHg1RiAvKiBfICovKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gY2ggJSAweDIwO1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufTtcblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtSGV4RXNjYXBlU2VxdWVuY2VcbnBwJDkucmVnZXhwX2VhdEhleEVzY2FwZVNlcXVlbmNlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICBpZiAoc3RhdGUuZWF0KDB4NzggLyogeCAqLykpIHtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0Rml4ZWRIZXhEaWdpdHMoc3RhdGUsIDIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoc3RhdGUuc3dpdGNoVSkge1xuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGVzY2FwZVwiKTtcbiAgICB9XG4gICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1EZWNpbWFsRGlnaXRzXG5wcCQ5LnJlZ2V4cF9lYXREZWNpbWFsRGlnaXRzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICB2YXIgY2ggPSAwO1xuICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAwO1xuICB3aGlsZSAoaXNEZWNpbWFsRGlnaXQoY2ggPSBzdGF0ZS5jdXJyZW50KCkpKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMTAgKiBzdGF0ZS5sYXN0SW50VmFsdWUgKyAoY2ggLSAweDMwIC8qIDAgKi8pO1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgfVxuICByZXR1cm4gc3RhdGUucG9zICE9PSBzdGFydFxufTtcbmZ1bmN0aW9uIGlzRGVjaW1hbERpZ2l0KGNoKSB7XG4gIHJldHVybiBjaCA+PSAweDMwIC8qIDAgKi8gJiYgY2ggPD0gMHgzOSAvKiA5ICovXG59XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUhleERpZ2l0c1xucHAkOS5yZWdleHBfZWF0SGV4RGlnaXRzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICB2YXIgY2ggPSAwO1xuICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAwO1xuICB3aGlsZSAoaXNIZXhEaWdpdChjaCA9IHN0YXRlLmN1cnJlbnQoKSkpIHtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAxNiAqIHN0YXRlLmxhc3RJbnRWYWx1ZSArIGhleFRvSW50KGNoKTtcbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnBvcyAhPT0gc3RhcnRcbn07XG5mdW5jdGlvbiBpc0hleERpZ2l0KGNoKSB7XG4gIHJldHVybiAoXG4gICAgKGNoID49IDB4MzAgLyogMCAqLyAmJiBjaCA8PSAweDM5IC8qIDkgKi8pIHx8XG4gICAgKGNoID49IDB4NDEgLyogQSAqLyAmJiBjaCA8PSAweDQ2IC8qIEYgKi8pIHx8XG4gICAgKGNoID49IDB4NjEgLyogYSAqLyAmJiBjaCA8PSAweDY2IC8qIGYgKi8pXG4gIClcbn1cbmZ1bmN0aW9uIGhleFRvSW50KGNoKSB7XG4gIGlmIChjaCA+PSAweDQxIC8qIEEgKi8gJiYgY2ggPD0gMHg0NiAvKiBGICovKSB7XG4gICAgcmV0dXJuIDEwICsgKGNoIC0gMHg0MSAvKiBBICovKVxuICB9XG4gIGlmIChjaCA+PSAweDYxIC8qIGEgKi8gJiYgY2ggPD0gMHg2NiAvKiBmICovKSB7XG4gICAgcmV0dXJuIDEwICsgKGNoIC0gMHg2MSAvKiBhICovKVxuICB9XG4gIHJldHVybiBjaCAtIDB4MzAgLyogMCAqL1xufVxuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItTGVnYWN5T2N0YWxFc2NhcGVTZXF1ZW5jZVxuLy8gQWxsb3dzIG9ubHkgMC0zNzcob2N0YWwpIGkuZS4gMC0yNTUoZGVjaW1hbCkuXG5wcCQ5LnJlZ2V4cF9lYXRMZWdhY3lPY3RhbEVzY2FwZVNlcXVlbmNlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgaWYgKHRoaXMucmVnZXhwX2VhdE9jdGFsRGlnaXQoc3RhdGUpKSB7XG4gICAgdmFyIG4xID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRPY3RhbERpZ2l0KHN0YXRlKSkge1xuICAgICAgdmFyIG4yID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgaWYgKG4xIDw9IDMgJiYgdGhpcy5yZWdleHBfZWF0T2N0YWxEaWdpdChzdGF0ZSkpIHtcbiAgICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gbjEgKiA2NCArIG4yICogOCArIHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IG4xICogOCArIG4yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBuMTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLU9jdGFsRGlnaXRcbnBwJDkucmVnZXhwX2VhdE9jdGFsRGlnaXQgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gIGlmIChpc09jdGFsRGlnaXQoY2gpKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gY2ggLSAweDMwOyAvKiAwICovXG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgc3RhdGUubGFzdEludFZhbHVlID0gMDtcbiAgcmV0dXJuIGZhbHNlXG59O1xuZnVuY3Rpb24gaXNPY3RhbERpZ2l0KGNoKSB7XG4gIHJldHVybiBjaCA+PSAweDMwIC8qIDAgKi8gJiYgY2ggPD0gMHgzNyAvKiA3ICovXG59XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUhleDREaWdpdHNcbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUhleERpZ2l0XG4vLyBBbmQgSGV4RGlnaXQgSGV4RGlnaXQgaW4gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtSGV4RXNjYXBlU2VxdWVuY2VcbnBwJDkucmVnZXhwX2VhdEZpeGVkSGV4RGlnaXRzID0gZnVuY3Rpb24oc3RhdGUsIGxlbmd0aCkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gICAgaWYgKCFpc0hleERpZ2l0KGNoKSkge1xuICAgICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMTYgKiBzdGF0ZS5sYXN0SW50VmFsdWUgKyBoZXhUb0ludChjaCk7XG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICB9XG4gIHJldHVybiB0cnVlXG59O1xuXG4vLyBPYmplY3QgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0b2tlbnMuIE5vdGUgdGhhdCBub3JtYWxseSwgdG9rZW5zXG4vLyBzaW1wbHkgZXhpc3QgYXMgcHJvcGVydGllcyBvbiB0aGUgcGFyc2VyIG9iamVjdC4gVGhpcyBpcyBvbmx5XG4vLyB1c2VkIGZvciB0aGUgb25Ub2tlbiBjYWxsYmFjayBhbmQgdGhlIGV4dGVybmFsIHRva2VuaXplci5cblxudmFyIFRva2VuID0gZnVuY3Rpb24gVG9rZW4ocCkge1xuICB0aGlzLnR5cGUgPSBwLnR5cGU7XG4gIHRoaXMudmFsdWUgPSBwLnZhbHVlO1xuICB0aGlzLnN0YXJ0ID0gcC5zdGFydDtcbiAgdGhpcy5lbmQgPSBwLmVuZDtcbiAgaWYgKHAub3B0aW9ucy5sb2NhdGlvbnMpXG4gICAgeyB0aGlzLmxvYyA9IG5ldyBTb3VyY2VMb2NhdGlvbihwLCBwLnN0YXJ0TG9jLCBwLmVuZExvYyk7IH1cbiAgaWYgKHAub3B0aW9ucy5yYW5nZXMpXG4gICAgeyB0aGlzLnJhbmdlID0gW3Auc3RhcnQsIHAuZW5kXTsgfVxufTtcblxuLy8gIyMgVG9rZW5pemVyXG5cbnZhciBwcCQ4ID0gUGFyc2VyLnByb3RvdHlwZTtcblxuLy8gTW92ZSB0byB0aGUgbmV4dCB0b2tlblxuXG5wcCQ4Lm5leHQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5vblRva2VuKVxuICAgIHsgdGhpcy5vcHRpb25zLm9uVG9rZW4obmV3IFRva2VuKHRoaXMpKTsgfVxuXG4gIHRoaXMubGFzdFRva0VuZCA9IHRoaXMuZW5kO1xuICB0aGlzLmxhc3RUb2tTdGFydCA9IHRoaXMuc3RhcnQ7XG4gIHRoaXMubGFzdFRva0VuZExvYyA9IHRoaXMuZW5kTG9jO1xuICB0aGlzLmxhc3RUb2tTdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gIHRoaXMubmV4dFRva2VuKCk7XG59O1xuXG5wcCQ4LmdldFRva2VuID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMubmV4dCgpO1xuICByZXR1cm4gbmV3IFRva2VuKHRoaXMpXG59O1xuXG4vLyBJZiB3ZSdyZSBpbiBhbiBFUzYgZW52aXJvbm1lbnQsIG1ha2UgcGFyc2VycyBpdGVyYWJsZVxuaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIpXG4gIHsgcHAkOFtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdG9rZW4gPSB0aGlzJDEuZ2V0VG9rZW4oKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkb25lOiB0b2tlbi50eXBlID09PSB0eXBlcy5lb2YsXG4gICAgICAgICAgdmFsdWU6IHRva2VuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07IH1cblxuLy8gVG9nZ2xlIHN0cmljdCBtb2RlLiBSZS1yZWFkcyB0aGUgbmV4dCBudW1iZXIgb3Igc3RyaW5nIHRvIHBsZWFzZVxuLy8gcGVkYW50aWMgdGVzdHMgKGBcInVzZSBzdHJpY3RcIjsgMDEwO2Agc2hvdWxkIGZhaWwpLlxuXG5wcCQ4LmN1ckNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY29udGV4dFt0aGlzLmNvbnRleHQubGVuZ3RoIC0gMV1cbn07XG5cbi8vIFJlYWQgYSBzaW5nbGUgdG9rZW4sIHVwZGF0aW5nIHRoZSBwYXJzZXIgb2JqZWN0J3MgdG9rZW4tcmVsYXRlZFxuLy8gcHJvcGVydGllcy5cblxucHAkOC5uZXh0VG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGN1ckNvbnRleHQgPSB0aGlzLmN1ckNvbnRleHQoKTtcbiAgaWYgKCFjdXJDb250ZXh0IHx8ICFjdXJDb250ZXh0LnByZXNlcnZlU3BhY2UpIHsgdGhpcy5za2lwU3BhY2UoKTsgfVxuXG4gIHRoaXMuc3RhcnQgPSB0aGlzLnBvcztcbiAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpIHsgdGhpcy5zdGFydExvYyA9IHRoaXMuY3VyUG9zaXRpb24oKTsgfVxuICBpZiAodGhpcy5wb3MgPj0gdGhpcy5pbnB1dC5sZW5ndGgpIHsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuZW9mKSB9XG5cbiAgaWYgKGN1ckNvbnRleHQub3ZlcnJpZGUpIHsgcmV0dXJuIGN1ckNvbnRleHQub3ZlcnJpZGUodGhpcykgfVxuICBlbHNlIHsgdGhpcy5yZWFkVG9rZW4odGhpcy5mdWxsQ2hhckNvZGVBdFBvcygpKTsgfVxufTtcblxucHAkOC5yZWFkVG9rZW4gPSBmdW5jdGlvbihjb2RlKSB7XG4gIC8vIElkZW50aWZpZXIgb3Iga2V5d29yZC4gJ1xcdVhYWFgnIHNlcXVlbmNlcyBhcmUgYWxsb3dlZCBpblxuICAvLyBpZGVudGlmaWVycywgc28gJ1xcJyBhbHNvIGRpc3BhdGNoZXMgdG8gdGhhdC5cbiAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KGNvZGUsIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB8fCBjb2RlID09PSA5MiAvKiAnXFwnICovKVxuICAgIHsgcmV0dXJuIHRoaXMucmVhZFdvcmQoKSB9XG5cbiAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gcm9tQ29kZShjb2RlKVxufTtcblxucHAkOC5mdWxsQ2hhckNvZGVBdFBvcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY29kZSA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyk7XG4gIGlmIChjb2RlIDw9IDB4ZDdmZiB8fCBjb2RlID49IDB4ZTAwMCkgeyByZXR1cm4gY29kZSB9XG4gIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gIHJldHVybiAoY29kZSA8PCAxMCkgKyBuZXh0IC0gMHgzNWZkYzAwXG59O1xuXG5wcCQ4LnNraXBCbG9ja0NvbW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIHN0YXJ0TG9jID0gdGhpcy5vcHRpb25zLm9uQ29tbWVudCAmJiB0aGlzLmN1clBvc2l0aW9uKCk7XG4gIHZhciBzdGFydCA9IHRoaXMucG9zLCBlbmQgPSB0aGlzLmlucHV0LmluZGV4T2YoXCIqL1wiLCB0aGlzLnBvcyArPSAyKTtcbiAgaWYgKGVuZCA9PT0gLTEpIHsgdGhpcy5yYWlzZSh0aGlzLnBvcyAtIDIsIFwiVW50ZXJtaW5hdGVkIGNvbW1lbnRcIik7IH1cbiAgdGhpcy5wb3MgPSBlbmQgKyAyO1xuICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgIGxpbmVCcmVha0cubGFzdEluZGV4ID0gc3RhcnQ7XG4gICAgdmFyIG1hdGNoO1xuICAgIHdoaWxlICgobWF0Y2ggPSBsaW5lQnJlYWtHLmV4ZWModGhpcy5pbnB1dCkpICYmIG1hdGNoLmluZGV4IDwgdGhpcy5wb3MpIHtcbiAgICAgICsrdGhpcyQxLmN1ckxpbmU7XG4gICAgICB0aGlzJDEubGluZVN0YXJ0ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgfVxuICB9XG4gIGlmICh0aGlzLm9wdGlvbnMub25Db21tZW50KVxuICAgIHsgdGhpcy5vcHRpb25zLm9uQ29tbWVudCh0cnVlLCB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0ICsgMiwgZW5kKSwgc3RhcnQsIHRoaXMucG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMb2MsIHRoaXMuY3VyUG9zaXRpb24oKSk7IH1cbn07XG5cbnBwJDguc2tpcExpbmVDb21tZW50ID0gZnVuY3Rpb24oc3RhcnRTa2lwKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBzdGFydCA9IHRoaXMucG9zO1xuICB2YXIgc3RhcnRMb2MgPSB0aGlzLm9wdGlvbnMub25Db21tZW50ICYmIHRoaXMuY3VyUG9zaXRpb24oKTtcbiAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICs9IHN0YXJ0U2tpcCk7XG4gIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMuaW5wdXQubGVuZ3RoICYmICFpc05ld0xpbmUoY2gpKSB7XG4gICAgY2ggPSB0aGlzJDEuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMkMS5wb3MpO1xuICB9XG4gIGlmICh0aGlzLm9wdGlvbnMub25Db21tZW50KVxuICAgIHsgdGhpcy5vcHRpb25zLm9uQ29tbWVudChmYWxzZSwgdGhpcy5pbnB1dC5zbGljZShzdGFydCArIHN0YXJ0U2tpcCwgdGhpcy5wb3MpLCBzdGFydCwgdGhpcy5wb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydExvYywgdGhpcy5jdXJQb3NpdGlvbigpKTsgfVxufTtcblxuLy8gQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFyc2UgYW5kIGFmdGVyIGV2ZXJ5IHRva2VuLiBTa2lwc1xuLy8gd2hpdGVzcGFjZSBhbmQgY29tbWVudHMsIGFuZC5cblxucHAkOC5za2lwU3BhY2UgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgbG9vcDogd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5pbnB1dC5sZW5ndGgpIHtcbiAgICB2YXIgY2ggPSB0aGlzJDEuaW5wdXQuY2hhckNvZGVBdCh0aGlzJDEucG9zKTtcbiAgICBzd2l0Y2ggKGNoKSB7XG4gICAgY2FzZSAzMjogY2FzZSAxNjA6IC8vICcgJ1xuICAgICAgKyt0aGlzJDEucG9zO1xuICAgICAgYnJlYWtcbiAgICBjYXNlIDEzOlxuICAgICAgaWYgKHRoaXMkMS5pbnB1dC5jaGFyQ29kZUF0KHRoaXMkMS5wb3MgKyAxKSA9PT0gMTApIHtcbiAgICAgICAgKyt0aGlzJDEucG9zO1xuICAgICAgfVxuICAgIGNhc2UgMTA6IGNhc2UgODIzMjogY2FzZSA4MjMzOlxuICAgICAgKyt0aGlzJDEucG9zO1xuICAgICAgaWYgKHRoaXMkMS5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgICAgICArK3RoaXMkMS5jdXJMaW5lO1xuICAgICAgICB0aGlzJDEubGluZVN0YXJ0ID0gdGhpcyQxLnBvcztcbiAgICAgIH1cbiAgICAgIGJyZWFrXG4gICAgY2FzZSA0NzogLy8gJy8nXG4gICAgICBzd2l0Y2ggKHRoaXMkMS5pbnB1dC5jaGFyQ29kZUF0KHRoaXMkMS5wb3MgKyAxKSkge1xuICAgICAgY2FzZSA0MjogLy8gJyonXG4gICAgICAgIHRoaXMkMS5za2lwQmxvY2tDb21tZW50KCk7XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDQ3OlxuICAgICAgICB0aGlzJDEuc2tpcExpbmVDb21tZW50KDIpO1xuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWsgbG9vcFxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKGNoID4gOCAmJiBjaCA8IDE0IHx8IGNoID49IDU3NjAgJiYgbm9uQVNDSUl3aGl0ZXNwYWNlLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpKSB7XG4gICAgICAgICsrdGhpcyQxLnBvcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrIGxvb3BcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIENhbGxlZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5IHRva2VuLiBTZXRzIGBlbmRgLCBgdmFsYCwgYW5kXG4vLyBtYWludGFpbnMgYGNvbnRleHRgIGFuZCBgZXhwckFsbG93ZWRgLCBhbmQgc2tpcHMgdGhlIHNwYWNlIGFmdGVyXG4vLyB0aGUgdG9rZW4sIHNvIHRoYXQgdGhlIG5leHQgb25lJ3MgYHN0YXJ0YCB3aWxsIHBvaW50IGF0IHRoZVxuLy8gcmlnaHQgcG9zaXRpb24uXG5cbnBwJDguZmluaXNoVG9rZW4gPSBmdW5jdGlvbih0eXBlLCB2YWwpIHtcbiAgdGhpcy5lbmQgPSB0aGlzLnBvcztcbiAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpIHsgdGhpcy5lbmRMb2MgPSB0aGlzLmN1clBvc2l0aW9uKCk7IH1cbiAgdmFyIHByZXZUeXBlID0gdGhpcy50eXBlO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnZhbHVlID0gdmFsO1xuXG4gIHRoaXMudXBkYXRlQ29udGV4dChwcmV2VHlwZSk7XG59O1xuXG4vLyAjIyMgVG9rZW4gcmVhZGluZ1xuXG4vLyBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBmZXRjaCB0aGUgbmV4dCB0b2tlbi4gSXRcbi8vIGlzIHNvbWV3aGF0IG9ic2N1cmUsIGJlY2F1c2UgaXQgd29ya3MgaW4gY2hhcmFjdGVyIGNvZGVzIHJhdGhlclxuLy8gdGhhbiBjaGFyYWN0ZXJzLCBhbmQgYmVjYXVzZSBvcGVyYXRvciBwYXJzaW5nIGhhcyBiZWVuIGlubGluZWRcbi8vIGludG8gaXQuXG4vL1xuLy8gQWxsIGluIHRoZSBuYW1lIG9mIHNwZWVkLlxuLy9cbnBwJDgucmVhZFRva2VuX2RvdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICBpZiAobmV4dCA+PSA0OCAmJiBuZXh0IDw9IDU3KSB7IHJldHVybiB0aGlzLnJlYWROdW1iZXIodHJ1ZSkgfVxuICB2YXIgbmV4dDIgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIG5leHQgPT09IDQ2ICYmIG5leHQyID09PSA0NikgeyAvLyA0NiA9IGRvdCAnLidcbiAgICB0aGlzLnBvcyArPSAzO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmVsbGlwc2lzKVxuICB9IGVsc2Uge1xuICAgICsrdGhpcy5wb3M7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuZG90KVxuICB9XG59O1xuXG5wcCQ4LnJlYWRUb2tlbl9zbGFzaCA9IGZ1bmN0aW9uKCkgeyAvLyAnLydcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgaWYgKHRoaXMuZXhwckFsbG93ZWQpIHsgKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMucmVhZFJlZ2V4cCgpIH1cbiAgaWYgKG5leHQgPT09IDYxKSB7IHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmFzc2lnbiwgMikgfVxuICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5zbGFzaCwgMSlcbn07XG5cbnBwJDgucmVhZFRva2VuX211bHRfbW9kdWxvX2V4cCA9IGZ1bmN0aW9uKGNvZGUpIHsgLy8gJyUqJ1xuICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICB2YXIgc2l6ZSA9IDE7XG4gIHZhciB0b2tlbnR5cGUgPSBjb2RlID09PSA0MiA/IHR5cGVzLnN0YXIgOiB0eXBlcy5tb2R1bG87XG5cbiAgLy8gZXhwb25lbnRpYXRpb24gb3BlcmF0b3IgKiogYW5kICoqPVxuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDcgJiYgY29kZSA9PT0gNDIgJiYgbmV4dCA9PT0gNDIpIHtcbiAgICArK3NpemU7XG4gICAgdG9rZW50eXBlID0gdHlwZXMuc3RhcnN0YXI7XG4gICAgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDIpO1xuICB9XG5cbiAgaWYgKG5leHQgPT09IDYxKSB7IHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmFzc2lnbiwgc2l6ZSArIDEpIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AodG9rZW50eXBlLCBzaXplKVxufTtcblxucHAkOC5yZWFkVG9rZW5fcGlwZV9hbXAgPSBmdW5jdGlvbihjb2RlKSB7IC8vICd8JidcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgaWYgKG5leHQgPT09IGNvZGUpIHsgcmV0dXJuIHRoaXMuZmluaXNoT3AoY29kZSA9PT0gMTI0ID8gdHlwZXMubG9naWNhbE9SIDogdHlwZXMubG9naWNhbEFORCwgMikgfVxuICBpZiAobmV4dCA9PT0gNjEpIHsgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYXNzaWduLCAyKSB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE9wKGNvZGUgPT09IDEyNCA/IHR5cGVzLmJpdHdpc2VPUiA6IHR5cGVzLmJpdHdpc2VBTkQsIDEpXG59O1xuXG5wcCQ4LnJlYWRUb2tlbl9jYXJldCA9IGZ1bmN0aW9uKCkgeyAvLyAnXidcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgaWYgKG5leHQgPT09IDYxKSB7IHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmFzc2lnbiwgMikgfVxuICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5iaXR3aXNlWE9SLCAxKVxufTtcblxucHAkOC5yZWFkVG9rZW5fcGx1c19taW4gPSBmdW5jdGlvbihjb2RlKSB7IC8vICcrLSdcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgaWYgKG5leHQgPT09IGNvZGUpIHtcbiAgICBpZiAobmV4dCA9PT0gNDUgJiYgIXRoaXMuaW5Nb2R1bGUgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMikgPT09IDYyICYmXG4gICAgICAgICh0aGlzLmxhc3RUb2tFbmQgPT09IDAgfHwgbGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLmxhc3RUb2tFbmQsIHRoaXMucG9zKSkpKSB7XG4gICAgICAvLyBBIGAtLT5gIGxpbmUgY29tbWVudFxuICAgICAgdGhpcy5za2lwTGluZUNvbW1lbnQoMyk7XG4gICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgICAgcmV0dXJuIHRoaXMubmV4dFRva2VuKClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuaW5jRGVjLCAyKVxuICB9XG4gIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIDIpIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMucGx1c01pbiwgMSlcbn07XG5cbnBwJDgucmVhZFRva2VuX2x0X2d0ID0gZnVuY3Rpb24oY29kZSkgeyAvLyAnPD4nXG4gIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gIHZhciBzaXplID0gMTtcbiAgaWYgKG5leHQgPT09IGNvZGUpIHtcbiAgICBzaXplID0gY29kZSA9PT0gNjIgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMikgPT09IDYyID8gMyA6IDI7XG4gICAgaWYgKHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIHNpemUpID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIHNpemUgKyAxKSB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYml0U2hpZnQsIHNpemUpXG4gIH1cbiAgaWYgKG5leHQgPT09IDMzICYmIGNvZGUgPT09IDYwICYmICF0aGlzLmluTW9kdWxlICYmIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDIpID09PSA0NSAmJlxuICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMykgPT09IDQ1KSB7XG4gICAgLy8gYDwhLS1gLCBhbiBYTUwtc3R5bGUgY29tbWVudCB0aGF0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIGxpbmUgY29tbWVudFxuICAgIHRoaXMuc2tpcExpbmVDb21tZW50KDQpO1xuICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgcmV0dXJuIHRoaXMubmV4dFRva2VuKClcbiAgfVxuICBpZiAobmV4dCA9PT0gNjEpIHsgc2l6ZSA9IDI7IH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMucmVsYXRpb25hbCwgc2l6ZSlcbn07XG5cbnBwJDgucmVhZFRva2VuX2VxX2V4Y2wgPSBmdW5jdGlvbihjb2RlKSB7IC8vICc9ISdcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgaWYgKG5leHQgPT09IDYxKSB7IHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmVxdWFsaXR5LCB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKSA9PT0gNjEgPyAzIDogMikgfVxuICBpZiAoY29kZSA9PT0gNjEgJiYgbmV4dCA9PT0gNjIgJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHsgLy8gJz0+J1xuICAgIHRoaXMucG9zICs9IDI7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYXJyb3cpXG4gIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AoY29kZSA9PT0gNjEgPyB0eXBlcy5lcSA6IHR5cGVzLnByZWZpeCwgMSlcbn07XG5cbnBwJDguZ2V0VG9rZW5Gcm9tQ29kZSA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgc3dpdGNoIChjb2RlKSB7XG4gIC8vIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBhIGRvdCBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaXMgZm9sbG93ZWRcbiAgLy8gYnkgYSBkaWdpdCBvciBhbm90aGVyIHR3byBkb3RzLlxuICBjYXNlIDQ2OiAvLyAnLidcbiAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fZG90KClcblxuICAvLyBQdW5jdHVhdGlvbiB0b2tlbnMuXG4gIGNhc2UgNDA6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLnBhcmVuTClcbiAgY2FzZSA0MTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMucGFyZW5SKVxuICBjYXNlIDU5OiArK3RoaXMucG9zOyByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5zZW1pKVxuICBjYXNlIDQ0OiArK3RoaXMucG9zOyByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5jb21tYSlcbiAgY2FzZSA5MTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2tldEwpXG4gIGNhc2UgOTM6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmJyYWNrZXRSKVxuICBjYXNlIDEyMzogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2VMKVxuICBjYXNlIDEyNTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2VSKVxuICBjYXNlIDU4OiArK3RoaXMucG9zOyByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5jb2xvbilcbiAgY2FzZSA2MzogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMucXVlc3Rpb24pXG5cbiAgY2FzZSA5NjogLy8gJ2AnXG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDYpIHsgYnJlYWsgfVxuICAgICsrdGhpcy5wb3M7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYmFja1F1b3RlKVxuXG4gIGNhc2UgNDg6IC8vICcwJ1xuICAgIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gICAgaWYgKG5leHQgPT09IDEyMCB8fCBuZXh0ID09PSA4OCkgeyByZXR1cm4gdGhpcy5yZWFkUmFkaXhOdW1iZXIoMTYpIH0gLy8gJzB4JywgJzBYJyAtIGhleCBudW1iZXJcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHtcbiAgICAgIGlmIChuZXh0ID09PSAxMTEgfHwgbmV4dCA9PT0gNzkpIHsgcmV0dXJuIHRoaXMucmVhZFJhZGl4TnVtYmVyKDgpIH0gLy8gJzBvJywgJzBPJyAtIG9jdGFsIG51bWJlclxuICAgICAgaWYgKG5leHQgPT09IDk4IHx8IG5leHQgPT09IDY2KSB7IHJldHVybiB0aGlzLnJlYWRSYWRpeE51bWJlcigyKSB9IC8vICcwYicsICcwQicgLSBiaW5hcnkgbnVtYmVyXG4gICAgfVxuXG4gIC8vIEFueXRoaW5nIGVsc2UgYmVnaW5uaW5nIHdpdGggYSBkaWdpdCBpcyBhbiBpbnRlZ2VyLCBvY3RhbFxuICAvLyBudW1iZXIsIG9yIGZsb2F0LlxuICBjYXNlIDQ5OiBjYXNlIDUwOiBjYXNlIDUxOiBjYXNlIDUyOiBjYXNlIDUzOiBjYXNlIDU0OiBjYXNlIDU1OiBjYXNlIDU2OiBjYXNlIDU3OiAvLyAxLTlcbiAgICByZXR1cm4gdGhpcy5yZWFkTnVtYmVyKGZhbHNlKVxuXG4gIC8vIFF1b3RlcyBwcm9kdWNlIHN0cmluZ3MuXG4gIGNhc2UgMzQ6IGNhc2UgMzk6IC8vICdcIicsIFwiJ1wiXG4gICAgcmV0dXJuIHRoaXMucmVhZFN0cmluZyhjb2RlKVxuXG4gIC8vIE9wZXJhdG9ycyBhcmUgcGFyc2VkIGlubGluZSBpbiB0aW55IHN0YXRlIG1hY2hpbmVzLiAnPScgKDYxKSBpc1xuICAvLyBvZnRlbiByZWZlcnJlZCB0by4gYGZpbmlzaE9wYCBzaW1wbHkgc2tpcHMgdGhlIGFtb3VudCBvZlxuICAvLyBjaGFyYWN0ZXJzIGl0IGlzIGdpdmVuIGFzIHNlY29uZCBhcmd1bWVudCwgYW5kIHJldHVybnMgYSB0b2tlblxuICAvLyBvZiB0aGUgdHlwZSBnaXZlbiBieSBpdHMgZmlyc3QgYXJndW1lbnQuXG5cbiAgY2FzZSA0NzogLy8gJy8nXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3NsYXNoKClcblxuICBjYXNlIDM3OiBjYXNlIDQyOiAvLyAnJSonXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX211bHRfbW9kdWxvX2V4cChjb2RlKVxuXG4gIGNhc2UgMTI0OiBjYXNlIDM4OiAvLyAnfCYnXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3BpcGVfYW1wKGNvZGUpXG5cbiAgY2FzZSA5NDogLy8gJ14nXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX2NhcmV0KClcblxuICBjYXNlIDQzOiBjYXNlIDQ1OiAvLyAnKy0nXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3BsdXNfbWluKGNvZGUpXG5cbiAgY2FzZSA2MDogY2FzZSA2MjogLy8gJzw+J1xuICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9sdF9ndChjb2RlKVxuXG4gIGNhc2UgNjE6IGNhc2UgMzM6IC8vICc9ISdcbiAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fZXFfZXhjbChjb2RlKVxuXG4gIGNhc2UgMTI2OiAvLyAnfidcbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5wcmVmaXgsIDEpXG4gIH1cblxuICB0aGlzLnJhaXNlKHRoaXMucG9zLCBcIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICdcIiArIGNvZGVQb2ludFRvU3RyaW5nKGNvZGUpICsgXCInXCIpO1xufTtcblxucHAkOC5maW5pc2hPcCA9IGZ1bmN0aW9uKHR5cGUsIHNpemUpIHtcbiAgdmFyIHN0ciA9IHRoaXMuaW5wdXQuc2xpY2UodGhpcy5wb3MsIHRoaXMucG9zICsgc2l6ZSk7XG4gIHRoaXMucG9zICs9IHNpemU7XG4gIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGUsIHN0cilcbn07XG5cbnBwJDgucmVhZFJlZ2V4cCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgZXNjYXBlZCwgaW5DbGFzcywgc3RhcnQgPSB0aGlzLnBvcztcbiAgZm9yICg7Oykge1xuICAgIGlmICh0aGlzJDEucG9zID49IHRoaXMkMS5pbnB1dC5sZW5ndGgpIHsgdGhpcyQxLnJhaXNlKHN0YXJ0LCBcIlVudGVybWluYXRlZCByZWd1bGFyIGV4cHJlc3Npb25cIik7IH1cbiAgICB2YXIgY2ggPSB0aGlzJDEuaW5wdXQuY2hhckF0KHRoaXMkMS5wb3MpO1xuICAgIGlmIChsaW5lQnJlYWsudGVzdChjaCkpIHsgdGhpcyQxLnJhaXNlKHN0YXJ0LCBcIlVudGVybWluYXRlZCByZWd1bGFyIGV4cHJlc3Npb25cIik7IH1cbiAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgIGlmIChjaCA9PT0gXCJbXCIpIHsgaW5DbGFzcyA9IHRydWU7IH1cbiAgICAgIGVsc2UgaWYgKGNoID09PSBcIl1cIiAmJiBpbkNsYXNzKSB7IGluQ2xhc3MgPSBmYWxzZTsgfVxuICAgICAgZWxzZSBpZiAoY2ggPT09IFwiL1wiICYmICFpbkNsYXNzKSB7IGJyZWFrIH1cbiAgICAgIGVzY2FwZWQgPSBjaCA9PT0gXCJcXFxcXCI7XG4gICAgfSBlbHNlIHsgZXNjYXBlZCA9IGZhbHNlOyB9XG4gICAgKyt0aGlzJDEucG9zO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5wb3MpO1xuICArK3RoaXMucG9zO1xuICB2YXIgZmxhZ3NTdGFydCA9IHRoaXMucG9zO1xuICB2YXIgZmxhZ3MgPSB0aGlzLnJlYWRXb3JkMSgpO1xuICBpZiAodGhpcy5jb250YWluc0VzYykgeyB0aGlzLnVuZXhwZWN0ZWQoZmxhZ3NTdGFydCk7IH1cblxuICAvLyBWYWxpZGF0ZSBwYXR0ZXJuXG4gIHZhciBzdGF0ZSA9IHRoaXMucmVnZXhwU3RhdGUgfHwgKHRoaXMucmVnZXhwU3RhdGUgPSBuZXcgUmVnRXhwVmFsaWRhdGlvblN0YXRlKHRoaXMpKTtcbiAgc3RhdGUucmVzZXQoc3RhcnQsIHBhdHRlcm4sIGZsYWdzKTtcbiAgdGhpcy52YWxpZGF0ZVJlZ0V4cEZsYWdzKHN0YXRlKTtcbiAgdGhpcy52YWxpZGF0ZVJlZ0V4cFBhdHRlcm4oc3RhdGUpO1xuXG4gIC8vIENyZWF0ZSBMaXRlcmFsI3ZhbHVlIHByb3BlcnR5IHZhbHVlLlxuICB2YXIgdmFsdWUgPSBudWxsO1xuICB0cnkge1xuICAgIHZhbHVlID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBmbGFncyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBFU1RyZWUgcmVxdWlyZXMgbnVsbCBpZiBpdCBmYWlsZWQgdG8gaW5zdGFudGlhdGUgUmVnRXhwIG9iamVjdC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZXN0cmVlL2VzdHJlZS9ibG9iL2EyNzAwM2FkZjRmZDdiZmFkNDRkZTljZWYzNzJhMmVhY2Q1MjdiMWMvZXM1Lm1kI3JlZ2V4cGxpdGVyYWxcbiAgfVxuXG4gIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLnJlZ2V4cCwge3BhdHRlcm46IHBhdHRlcm4sIGZsYWdzOiBmbGFncywgdmFsdWU6IHZhbHVlfSlcbn07XG5cbi8vIFJlYWQgYW4gaW50ZWdlciBpbiB0aGUgZ2l2ZW4gcmFkaXguIFJldHVybiBudWxsIGlmIHplcm8gZGlnaXRzXG4vLyB3ZXJlIHJlYWQsIHRoZSBpbnRlZ2VyIHZhbHVlIG90aGVyd2lzZS4gV2hlbiBgbGVuYCBpcyBnaXZlbiwgdGhpc1xuLy8gd2lsbCByZXR1cm4gYG51bGxgIHVubGVzcyB0aGUgaW50ZWdlciBoYXMgZXhhY3RseSBgbGVuYCBkaWdpdHMuXG5cbnBwJDgucmVhZEludCA9IGZ1bmN0aW9uKHJhZGl4LCBsZW4pIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIHN0YXJ0ID0gdGhpcy5wb3MsIHRvdGFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGUgPSBsZW4gPT0gbnVsbCA/IEluZmluaXR5IDogbGVuOyBpIDwgZTsgKytpKSB7XG4gICAgdmFyIGNvZGUgPSB0aGlzJDEuaW5wdXQuY2hhckNvZGVBdCh0aGlzJDEucG9zKSwgdmFsID0gKHZvaWQgMCk7XG4gICAgaWYgKGNvZGUgPj0gOTcpIHsgdmFsID0gY29kZSAtIDk3ICsgMTA7IH0gLy8gYVxuICAgIGVsc2UgaWYgKGNvZGUgPj0gNjUpIHsgdmFsID0gY29kZSAtIDY1ICsgMTA7IH0gLy8gQVxuICAgIGVsc2UgaWYgKGNvZGUgPj0gNDggJiYgY29kZSA8PSA1NykgeyB2YWwgPSBjb2RlIC0gNDg7IH0gLy8gMC05XG4gICAgZWxzZSB7IHZhbCA9IEluZmluaXR5OyB9XG4gICAgaWYgKHZhbCA+PSByYWRpeCkgeyBicmVhayB9XG4gICAgKyt0aGlzJDEucG9zO1xuICAgIHRvdGFsID0gdG90YWwgKiByYWRpeCArIHZhbDtcbiAgfVxuICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0IHx8IGxlbiAhPSBudWxsICYmIHRoaXMucG9zIC0gc3RhcnQgIT09IGxlbikgeyByZXR1cm4gbnVsbCB9XG5cbiAgcmV0dXJuIHRvdGFsXG59O1xuXG5wcCQ4LnJlYWRSYWRpeE51bWJlciA9IGZ1bmN0aW9uKHJhZGl4KSB7XG4gIHRoaXMucG9zICs9IDI7IC8vIDB4XG4gIHZhciB2YWwgPSB0aGlzLnJlYWRJbnQocmFkaXgpO1xuICBpZiAodmFsID09IG51bGwpIHsgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0ICsgMiwgXCJFeHBlY3RlZCBudW1iZXIgaW4gcmFkaXggXCIgKyByYWRpeCk7IH1cbiAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KHRoaXMuZnVsbENoYXJDb2RlQXRQb3MoKSkpIHsgdGhpcy5yYWlzZSh0aGlzLnBvcywgXCJJZGVudGlmaWVyIGRpcmVjdGx5IGFmdGVyIG51bWJlclwiKTsgfVxuICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5udW0sIHZhbClcbn07XG5cbi8vIFJlYWQgYW4gaW50ZWdlciwgb2N0YWwgaW50ZWdlciwgb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVyLlxuXG5wcCQ4LnJlYWROdW1iZXIgPSBmdW5jdGlvbihzdGFydHNXaXRoRG90KSB7XG4gIHZhciBzdGFydCA9IHRoaXMucG9zO1xuICBpZiAoIXN0YXJ0c1dpdGhEb3QgJiYgdGhpcy5yZWFkSW50KDEwKSA9PT0gbnVsbCkgeyB0aGlzLnJhaXNlKHN0YXJ0LCBcIkludmFsaWQgbnVtYmVyXCIpOyB9XG4gIHZhciBvY3RhbCA9IHRoaXMucG9zIC0gc3RhcnQgPj0gMiAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQoc3RhcnQpID09PSA0ODtcbiAgaWYgKG9jdGFsICYmIHRoaXMuc3RyaWN0KSB7IHRoaXMucmFpc2Uoc3RhcnQsIFwiSW52YWxpZCBudW1iZXJcIik7IH1cbiAgaWYgKG9jdGFsICYmIC9bODldLy50ZXN0KHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQsIHRoaXMucG9zKSkpIHsgb2N0YWwgPSBmYWxzZTsgfVxuICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyk7XG4gIGlmIChuZXh0ID09PSA0NiAmJiAhb2N0YWwpIHsgLy8gJy4nXG4gICAgKyt0aGlzLnBvcztcbiAgICB0aGlzLnJlYWRJbnQoMTApO1xuICAgIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICB9XG4gIGlmICgobmV4dCA9PT0gNjkgfHwgbmV4dCA9PT0gMTAxKSAmJiAhb2N0YWwpIHsgLy8gJ2VFJ1xuICAgIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnBvcyk7XG4gICAgaWYgKG5leHQgPT09IDQzIHx8IG5leHQgPT09IDQ1KSB7ICsrdGhpcy5wb3M7IH0gLy8gJystJ1xuICAgIGlmICh0aGlzLnJlYWRJbnQoMTApID09PSBudWxsKSB7IHRoaXMucmFpc2Uoc3RhcnQsIFwiSW52YWxpZCBudW1iZXJcIik7IH1cbiAgfVxuICBpZiAoaXNJZGVudGlmaWVyU3RhcnQodGhpcy5mdWxsQ2hhckNvZGVBdFBvcygpKSkgeyB0aGlzLnJhaXNlKHRoaXMucG9zLCBcIklkZW50aWZpZXIgZGlyZWN0bHkgYWZ0ZXIgbnVtYmVyXCIpOyB9XG5cbiAgdmFyIHN0ciA9IHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQsIHRoaXMucG9zKTtcbiAgdmFyIHZhbCA9IG9jdGFsID8gcGFyc2VJbnQoc3RyLCA4KSA6IHBhcnNlRmxvYXQoc3RyKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMubnVtLCB2YWwpXG59O1xuXG4vLyBSZWFkIGEgc3RyaW5nIHZhbHVlLCBpbnRlcnByZXRpbmcgYmFja3NsYXNoLWVzY2FwZXMuXG5cbnBwJDgucmVhZENvZGVQb2ludCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpLCBjb2RlO1xuXG4gIGlmIChjaCA9PT0gMTIzKSB7IC8vICd7J1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPCA2KSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgdmFyIGNvZGVQb3MgPSArK3RoaXMucG9zO1xuICAgIGNvZGUgPSB0aGlzLnJlYWRIZXhDaGFyKHRoaXMuaW5wdXQuaW5kZXhPZihcIn1cIiwgdGhpcy5wb3MpIC0gdGhpcy5wb3MpO1xuICAgICsrdGhpcy5wb3M7XG4gICAgaWYgKGNvZGUgPiAweDEwRkZGRikgeyB0aGlzLmludmFsaWRTdHJpbmdUb2tlbihjb2RlUG9zLCBcIkNvZGUgcG9pbnQgb3V0IG9mIGJvdW5kc1wiKTsgfVxuICB9IGVsc2Uge1xuICAgIGNvZGUgPSB0aGlzLnJlYWRIZXhDaGFyKDQpO1xuICB9XG4gIHJldHVybiBjb2RlXG59O1xuXG5mdW5jdGlvbiBjb2RlUG9pbnRUb1N0cmluZyhjb2RlKSB7XG4gIC8vIFVURi0xNiBEZWNvZGluZ1xuICBpZiAoY29kZSA8PSAweEZGRkYpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkgfVxuICBjb2RlIC09IDB4MTAwMDA7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlID4+IDEwKSArIDB4RDgwMCwgKGNvZGUgJiAxMDIzKSArIDB4REMwMClcbn1cblxucHAkOC5yZWFkU3RyaW5nID0gZnVuY3Rpb24ocXVvdGUpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIG91dCA9IFwiXCIsIGNodW5rU3RhcnQgPSArK3RoaXMucG9zO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKHRoaXMkMS5wb3MgPj0gdGhpcyQxLmlucHV0Lmxlbmd0aCkgeyB0aGlzJDEucmFpc2UodGhpcyQxLnN0YXJ0LCBcIlVudGVybWluYXRlZCBzdHJpbmcgY29uc3RhbnRcIik7IH1cbiAgICB2YXIgY2ggPSB0aGlzJDEuaW5wdXQuY2hhckNvZGVBdCh0aGlzJDEucG9zKTtcbiAgICBpZiAoY2ggPT09IHF1b3RlKSB7IGJyZWFrIH1cbiAgICBpZiAoY2ggPT09IDkyKSB7IC8vICdcXCdcbiAgICAgIG91dCArPSB0aGlzJDEuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcyQxLnBvcyk7XG4gICAgICBvdXQgKz0gdGhpcyQxLnJlYWRFc2NhcGVkQ2hhcihmYWxzZSk7XG4gICAgICBjaHVua1N0YXJ0ID0gdGhpcyQxLnBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzTmV3TGluZShjaCwgdGhpcyQxLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTApKSB7IHRoaXMkMS5yYWlzZSh0aGlzJDEuc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudFwiKTsgfVxuICAgICAgKyt0aGlzJDEucG9zO1xuICAgIH1cbiAgfVxuICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcysrKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuc3RyaW5nLCBvdXQpXG59O1xuXG4vLyBSZWFkcyB0ZW1wbGF0ZSBzdHJpbmcgdG9rZW5zLlxuXG52YXIgSU5WQUxJRF9URU1QTEFURV9FU0NBUEVfRVJST1IgPSB7fTtcblxucHAkOC50cnlSZWFkVGVtcGxhdGVUb2tlbiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmluVGVtcGxhdGVFbGVtZW50ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICB0aGlzLnJlYWRUbXBsVG9rZW4oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciA9PT0gSU5WQUxJRF9URU1QTEFURV9FU0NBUEVfRVJST1IpIHtcbiAgICAgIHRoaXMucmVhZEludmFsaWRUZW1wbGF0ZVRva2VuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIHRoaXMuaW5UZW1wbGF0ZUVsZW1lbnQgPSBmYWxzZTtcbn07XG5cbnBwJDguaW52YWxpZFN0cmluZ1Rva2VuID0gZnVuY3Rpb24ocG9zaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKHRoaXMuaW5UZW1wbGF0ZUVsZW1lbnQgJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkpIHtcbiAgICB0aHJvdyBJTlZBTElEX1RFTVBMQVRFX0VTQ0FQRV9FUlJPUlxuICB9IGVsc2Uge1xuICAgIHRoaXMucmFpc2UocG9zaXRpb24sIG1lc3NhZ2UpO1xuICB9XG59O1xuXG5wcCQ4LnJlYWRUbXBsVG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIG91dCA9IFwiXCIsIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgZm9yICg7Oykge1xuICAgIGlmICh0aGlzJDEucG9zID49IHRoaXMkMS5pbnB1dC5sZW5ndGgpIHsgdGhpcyQxLnJhaXNlKHRoaXMkMS5zdGFydCwgXCJVbnRlcm1pbmF0ZWQgdGVtcGxhdGVcIik7IH1cbiAgICB2YXIgY2ggPSB0aGlzJDEuaW5wdXQuY2hhckNvZGVBdCh0aGlzJDEucG9zKTtcbiAgICBpZiAoY2ggPT09IDk2IHx8IGNoID09PSAzNiAmJiB0aGlzJDEuaW5wdXQuY2hhckNvZGVBdCh0aGlzJDEucG9zICsgMSkgPT09IDEyMykgeyAvLyAnYCcsICckeydcbiAgICAgIGlmICh0aGlzJDEucG9zID09PSB0aGlzJDEuc3RhcnQgJiYgKHRoaXMkMS50eXBlID09PSB0eXBlcy50ZW1wbGF0ZSB8fCB0aGlzJDEudHlwZSA9PT0gdHlwZXMuaW52YWxpZFRlbXBsYXRlKSkge1xuICAgICAgICBpZiAoY2ggPT09IDM2KSB7XG4gICAgICAgICAgdGhpcyQxLnBvcyArPSAyO1xuICAgICAgICAgIHJldHVybiB0aGlzJDEuZmluaXNoVG9rZW4odHlwZXMuZG9sbGFyQnJhY2VMKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICsrdGhpcyQxLnBvcztcbiAgICAgICAgICByZXR1cm4gdGhpcyQxLmZpbmlzaFRva2VuKHR5cGVzLmJhY2tRdW90ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9IHRoaXMkMS5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzJDEucG9zKTtcbiAgICAgIHJldHVybiB0aGlzJDEuZmluaXNoVG9rZW4odHlwZXMudGVtcGxhdGUsIG91dClcbiAgICB9XG4gICAgaWYgKGNoID09PSA5MikgeyAvLyAnXFwnXG4gICAgICBvdXQgKz0gdGhpcyQxLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMkMS5wb3MpO1xuICAgICAgb3V0ICs9IHRoaXMkMS5yZWFkRXNjYXBlZENoYXIodHJ1ZSk7XG4gICAgICBjaHVua1N0YXJ0ID0gdGhpcyQxLnBvcztcbiAgICB9IGVsc2UgaWYgKGlzTmV3TGluZShjaCkpIHtcbiAgICAgIG91dCArPSB0aGlzJDEuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcyQxLnBvcyk7XG4gICAgICArK3RoaXMkMS5wb3M7XG4gICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICBpZiAodGhpcyQxLmlucHV0LmNoYXJDb2RlQXQodGhpcyQxLnBvcykgPT09IDEwKSB7ICsrdGhpcyQxLnBvczsgfVxuICAgICAgY2FzZSAxMDpcbiAgICAgICAgb3V0ICs9IFwiXFxuXCI7XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpZiAodGhpcyQxLm9wdGlvbnMubG9jYXRpb25zKSB7XG4gICAgICAgICsrdGhpcyQxLmN1ckxpbmU7XG4gICAgICAgIHRoaXMkMS5saW5lU3RhcnQgPSB0aGlzJDEucG9zO1xuICAgICAgfVxuICAgICAgY2h1bmtTdGFydCA9IHRoaXMkMS5wb3M7XG4gICAgfSBlbHNlIHtcbiAgICAgICsrdGhpcyQxLnBvcztcbiAgICB9XG4gIH1cbn07XG5cbi8vIFJlYWRzIGEgdGVtcGxhdGUgdG9rZW4gdG8gc2VhcmNoIGZvciB0aGUgZW5kLCB3aXRob3V0IHZhbGlkYXRpbmcgYW55IGVzY2FwZSBzZXF1ZW5jZXNcbnBwJDgucmVhZEludmFsaWRUZW1wbGF0ZVRva2VuID0gZnVuY3Rpb24oKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGZvciAoOyB0aGlzLnBvcyA8IHRoaXMuaW5wdXQubGVuZ3RoOyB0aGlzLnBvcysrKSB7XG4gICAgc3dpdGNoICh0aGlzJDEuaW5wdXRbdGhpcyQxLnBvc10pIHtcbiAgICBjYXNlIFwiXFxcXFwiOlxuICAgICAgKyt0aGlzJDEucG9zO1xuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCIkXCI6XG4gICAgICBpZiAodGhpcyQxLmlucHV0W3RoaXMkMS5wb3MgKyAxXSAhPT0gXCJ7XCIpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICBjYXNlIFwiYFwiOlxuICAgICAgcmV0dXJuIHRoaXMkMS5maW5pc2hUb2tlbih0eXBlcy5pbnZhbGlkVGVtcGxhdGUsIHRoaXMkMS5pbnB1dC5zbGljZSh0aGlzJDEuc3RhcnQsIHRoaXMkMS5wb3MpKVxuXG4gICAgLy8gbm8gZGVmYXVsdFxuICAgIH1cbiAgfVxuICB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHRlbXBsYXRlXCIpO1xufTtcblxuLy8gVXNlZCB0byByZWFkIGVzY2FwZWQgY2hhcmFjdGVyc1xuXG5wcCQ4LnJlYWRFc2NhcGVkQ2hhciA9IGZ1bmN0aW9uKGluVGVtcGxhdGUpIHtcbiAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5wb3MpO1xuICArK3RoaXMucG9zO1xuICBzd2l0Y2ggKGNoKSB7XG4gIGNhc2UgMTEwOiByZXR1cm4gXCJcXG5cIiAvLyAnbicgLT4gJ1xcbidcbiAgY2FzZSAxMTQ6IHJldHVybiBcIlxcclwiIC8vICdyJyAtPiAnXFxyJ1xuICBjYXNlIDEyMDogcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5yZWFkSGV4Q2hhcigyKSkgLy8gJ3gnXG4gIGNhc2UgMTE3OiByZXR1cm4gY29kZVBvaW50VG9TdHJpbmcodGhpcy5yZWFkQ29kZVBvaW50KCkpIC8vICd1J1xuICBjYXNlIDExNjogcmV0dXJuIFwiXFx0XCIgLy8gJ3QnIC0+ICdcXHQnXG4gIGNhc2UgOTg6IHJldHVybiBcIlxcYlwiIC8vICdiJyAtPiAnXFxiJ1xuICBjYXNlIDExODogcmV0dXJuIFwiXFx1MDAwYlwiIC8vICd2JyAtPiAnXFx1MDAwYidcbiAgY2FzZSAxMDI6IHJldHVybiBcIlxcZlwiIC8vICdmJyAtPiAnXFxmJ1xuICBjYXNlIDEzOiBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKSA9PT0gMTApIHsgKyt0aGlzLnBvczsgfSAvLyAnXFxyXFxuJ1xuICBjYXNlIDEwOiAvLyAnIFxcbidcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykgeyB0aGlzLmxpbmVTdGFydCA9IHRoaXMucG9zOyArK3RoaXMuY3VyTGluZTsgfVxuICAgIHJldHVybiBcIlwiXG4gIGRlZmF1bHQ6XG4gICAgaWYgKGNoID49IDQ4ICYmIGNoIDw9IDU1KSB7XG4gICAgICB2YXIgb2N0YWxTdHIgPSB0aGlzLmlucHV0LnN1YnN0cih0aGlzLnBvcyAtIDEsIDMpLm1hdGNoKC9eWzAtN10rLylbMF07XG4gICAgICB2YXIgb2N0YWwgPSBwYXJzZUludChvY3RhbFN0ciwgOCk7XG4gICAgICBpZiAob2N0YWwgPiAyNTUpIHtcbiAgICAgICAgb2N0YWxTdHIgPSBvY3RhbFN0ci5zbGljZSgwLCAtMSk7XG4gICAgICAgIG9jdGFsID0gcGFyc2VJbnQob2N0YWxTdHIsIDgpO1xuICAgICAgfVxuICAgICAgdGhpcy5wb3MgKz0gb2N0YWxTdHIubGVuZ3RoIC0gMTtcbiAgICAgIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICAgIGlmICgob2N0YWxTdHIgIT09IFwiMFwiIHx8IGNoID09PSA1NiB8fCBjaCA9PT0gNTcpICYmICh0aGlzLnN0cmljdCB8fCBpblRlbXBsYXRlKSkge1xuICAgICAgICB0aGlzLmludmFsaWRTdHJpbmdUb2tlbihcbiAgICAgICAgICB0aGlzLnBvcyAtIDEgLSBvY3RhbFN0ci5sZW5ndGgsXG4gICAgICAgICAgaW5UZW1wbGF0ZVxuICAgICAgICAgICAgPyBcIk9jdGFsIGxpdGVyYWwgaW4gdGVtcGxhdGUgc3RyaW5nXCJcbiAgICAgICAgICAgIDogXCJPY3RhbCBsaXRlcmFsIGluIHN0cmljdCBtb2RlXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG9jdGFsKVxuICAgIH1cbiAgICBpZiAoaXNOZXdMaW5lKGNoKSkge1xuICAgICAgLy8gVW5pY29kZSBuZXcgbGluZSBjaGFyYWN0ZXJzIGFmdGVyIFxcIGdldCByZW1vdmVkIGZyb20gb3V0cHV0IGluIGJvdGhcbiAgICAgIC8vIHRlbXBsYXRlIGxpdGVyYWxzIGFuZCBzdHJpbmdzXG4gICAgICByZXR1cm4gXCJcIlxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaClcbiAgfVxufTtcblxuLy8gVXNlZCB0byByZWFkIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzICgnXFx4JywgJ1xcdScsICdcXFUnKS5cblxucHAkOC5yZWFkSGV4Q2hhciA9IGZ1bmN0aW9uKGxlbikge1xuICB2YXIgY29kZVBvcyA9IHRoaXMucG9zO1xuICB2YXIgbiA9IHRoaXMucmVhZEludCgxNiwgbGVuKTtcbiAgaWYgKG4gPT09IG51bGwpIHsgdGhpcy5pbnZhbGlkU3RyaW5nVG9rZW4oY29kZVBvcywgXCJCYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZVwiKTsgfVxuICByZXR1cm4gblxufTtcblxuLy8gUmVhZCBhbiBpZGVudGlmaWVyLCBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nLiBTZXRzIGB0aGlzLmNvbnRhaW5zRXNjYFxuLy8gdG8gd2hldGhlciB0aGUgd29yZCBjb250YWluZWQgYSAnXFx1JyBlc2NhcGUuXG4vL1xuLy8gSW5jcmVtZW50YWxseSBhZGRzIG9ubHkgZXNjYXBlZCBjaGFycywgYWRkaW5nIG90aGVyIGNodW5rcyBhcy1pc1xuLy8gYXMgYSBtaWNyby1vcHRpbWl6YXRpb24uXG5cbnBwJDgucmVhZFdvcmQxID0gZnVuY3Rpb24oKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHRoaXMuY29udGFpbnNFc2MgPSBmYWxzZTtcbiAgdmFyIHdvcmQgPSBcIlwiLCBmaXJzdCA9IHRydWUsIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgdmFyIGFzdHJhbCA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2O1xuICB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLmlucHV0Lmxlbmd0aCkge1xuICAgIHZhciBjaCA9IHRoaXMkMS5mdWxsQ2hhckNvZGVBdFBvcygpO1xuICAgIGlmIChpc0lkZW50aWZpZXJDaGFyKGNoLCBhc3RyYWwpKSB7XG4gICAgICB0aGlzJDEucG9zICs9IGNoIDw9IDB4ZmZmZiA/IDEgOiAyO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09IDkyKSB7IC8vIFwiXFxcIlxuICAgICAgdGhpcyQxLmNvbnRhaW5zRXNjID0gdHJ1ZTtcbiAgICAgIHdvcmQgKz0gdGhpcyQxLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMkMS5wb3MpO1xuICAgICAgdmFyIGVzY1N0YXJ0ID0gdGhpcyQxLnBvcztcbiAgICAgIGlmICh0aGlzJDEuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMkMS5wb3MpICE9PSAxMTcpIC8vIFwidVwiXG4gICAgICAgIHsgdGhpcyQxLmludmFsaWRTdHJpbmdUb2tlbih0aGlzJDEucG9zLCBcIkV4cGVjdGluZyBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZSBcXFxcdVhYWFhcIik7IH1cbiAgICAgICsrdGhpcyQxLnBvcztcbiAgICAgIHZhciBlc2MgPSB0aGlzJDEucmVhZENvZGVQb2ludCgpO1xuICAgICAgaWYgKCEoZmlyc3QgPyBpc0lkZW50aWZpZXJTdGFydCA6IGlzSWRlbnRpZmllckNoYXIpKGVzYywgYXN0cmFsKSlcbiAgICAgICAgeyB0aGlzJDEuaW52YWxpZFN0cmluZ1Rva2VuKGVzY1N0YXJ0LCBcIkludmFsaWQgVW5pY29kZSBlc2NhcGVcIik7IH1cbiAgICAgIHdvcmQgKz0gY29kZVBvaW50VG9TdHJpbmcoZXNjKTtcbiAgICAgIGNodW5rU3RhcnQgPSB0aGlzJDEucG9zO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgICBmaXJzdCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB3b3JkICsgdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcylcbn07XG5cbi8vIFJlYWQgYW4gaWRlbnRpZmllciBvciBrZXl3b3JkIHRva2VuLiBXaWxsIGNoZWNrIGZvciByZXNlcnZlZFxuLy8gd29yZHMgd2hlbiBuZWNlc3NhcnkuXG5cbnBwJDgucmVhZFdvcmQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdvcmQgPSB0aGlzLnJlYWRXb3JkMSgpO1xuICB2YXIgdHlwZSA9IHR5cGVzLm5hbWU7XG4gIGlmICh0aGlzLmtleXdvcmRzLnRlc3Qod29yZCkpIHtcbiAgICBpZiAodGhpcy5jb250YWluc0VzYykgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJFc2NhcGUgc2VxdWVuY2UgaW4ga2V5d29yZCBcIiArIHdvcmQpOyB9XG4gICAgdHlwZSA9IGtleXdvcmRzJDFbd29yZF07XG4gIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZSwgd29yZClcbn07XG5cbi8vIEFjb3JuIGlzIGEgdGlueSwgZmFzdCBKYXZhU2NyaXB0IHBhcnNlciB3cml0dGVuIGluIEphdmFTY3JpcHQuXG4vL1xuLy8gQWNvcm4gd2FzIHdyaXR0ZW4gYnkgTWFyaWpuIEhhdmVyYmVrZSwgSW5ndmFyIFN0ZXBhbnlhbiwgYW5kXG4vLyB2YXJpb3VzIGNvbnRyaWJ1dG9ycyBhbmQgcmVsZWFzZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2UuXG4vL1xuLy8gR2l0IHJlcG9zaXRvcmllcyBmb3IgQWNvcm4gYXJlIGF2YWlsYWJsZSBhdFxuLy9cbi8vICAgICBodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9hY29yblxuLy8gICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hY29ybmpzL2Fjb3JuLmdpdFxuLy9cbi8vIFBsZWFzZSB1c2UgdGhlIFtnaXRodWIgYnVnIHRyYWNrZXJdW2doYnRdIHRvIHJlcG9ydCBpc3N1ZXMuXG4vL1xuLy8gW2doYnRdOiBodHRwczovL2dpdGh1Yi5jb20vYWNvcm5qcy9hY29ybi9pc3N1ZXNcbi8vXG4vLyBbd2Fsa106IHV0aWwvd2Fsay5qc1xuXG52YXIgdmVyc2lvbiA9IFwiNi4xLjFcIjtcblxuLy8gVGhlIG1haW4gZXhwb3J0ZWQgaW50ZXJmYWNlICh1bmRlciBgc2VsZi5hY29ybmAgd2hlbiBpbiB0aGVcbi8vIGJyb3dzZXIpIGlzIGEgYHBhcnNlYCBmdW5jdGlvbiB0aGF0IHRha2VzIGEgY29kZSBzdHJpbmcgYW5kXG4vLyByZXR1cm5zIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIGFzIHNwZWNpZmllZCBieSBbTW96aWxsYSBwYXJzZXJcbi8vIEFQSV1bYXBpXS5cbi8vXG4vLyBbYXBpXTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9TcGlkZXJNb25rZXkvUGFyc2VyX0FQSVxuXG5mdW5jdGlvbiBwYXJzZShpbnB1dCwgb3B0aW9ucykge1xuICByZXR1cm4gUGFyc2VyLnBhcnNlKGlucHV0LCBvcHRpb25zKVxufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHBhcnNlIGEgc2luZ2xlIGV4cHJlc3Npb24gYXQgYSBnaXZlblxuLy8gb2Zmc2V0IGluIGEgc3RyaW5nLiBVc2VmdWwgZm9yIHBhcnNpbmcgbWl4ZWQtbGFuZ3VhZ2UgZm9ybWF0c1xuLy8gdGhhdCBlbWJlZCBKYXZhU2NyaXB0IGV4cHJlc3Npb25zLlxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb25BdChpbnB1dCwgcG9zLCBvcHRpb25zKSB7XG4gIHJldHVybiBQYXJzZXIucGFyc2VFeHByZXNzaW9uQXQoaW5wdXQsIHBvcywgb3B0aW9ucylcbn1cblxuLy8gQWNvcm4gaXMgb3JnYW5pemVkIGFzIGEgdG9rZW5pemVyIGFuZCBhIHJlY3Vyc2l2ZS1kZXNjZW50IHBhcnNlci5cbi8vIFRoZSBgdG9rZW5pemVyYCBleHBvcnQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSB0b2tlbml6ZXIuXG5cbmZ1bmN0aW9uIHRva2VuaXplcihpbnB1dCwgb3B0aW9ucykge1xuICByZXR1cm4gUGFyc2VyLnRva2VuaXplcihpbnB1dCwgb3B0aW9ucylcbn1cblxuZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbjtcbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcbmV4cG9ydHMucGFyc2VFeHByZXNzaW9uQXQgPSBwYXJzZUV4cHJlc3Npb25BdDtcbmV4cG9ydHMudG9rZW5pemVyID0gdG9rZW5pemVyO1xuZXhwb3J0cy5QYXJzZXIgPSBQYXJzZXI7XG5leHBvcnRzLmRlZmF1bHRPcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG5leHBvcnRzLlBvc2l0aW9uID0gUG9zaXRpb247XG5leHBvcnRzLlNvdXJjZUxvY2F0aW9uID0gU291cmNlTG9jYXRpb247XG5leHBvcnRzLmdldExpbmVJbmZvID0gZ2V0TGluZUluZm87XG5leHBvcnRzLk5vZGUgPSBOb2RlO1xuZXhwb3J0cy5Ub2tlblR5cGUgPSBUb2tlblR5cGU7XG5leHBvcnRzLnRva1R5cGVzID0gdHlwZXM7XG5leHBvcnRzLmtleXdvcmRUeXBlcyA9IGtleXdvcmRzJDE7XG5leHBvcnRzLlRva0NvbnRleHQgPSBUb2tDb250ZXh0O1xuZXhwb3J0cy50b2tDb250ZXh0cyA9IHR5cGVzJDE7XG5leHBvcnRzLmlzSWRlbnRpZmllckNoYXIgPSBpc0lkZW50aWZpZXJDaGFyO1xuZXhwb3J0cy5pc0lkZW50aWZpZXJTdGFydCA9IGlzSWRlbnRpZmllclN0YXJ0O1xuZXhwb3J0cy5Ub2tlbiA9IFRva2VuO1xuZXhwb3J0cy5pc05ld0xpbmUgPSBpc05ld0xpbmU7XG5leHBvcnRzLmxpbmVCcmVhayA9IGxpbmVCcmVhaztcbmV4cG9ydHMubGluZUJyZWFrRyA9IGxpbmVCcmVha0c7XG5leHBvcnRzLm5vbkFTQ0lJd2hpdGVzcGFjZSA9IG5vbkFTQ0lJd2hpdGVzcGFjZTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFjb3JuLmpzLm1hcFxuIiwibW9kdWxlLmV4cG9ydHMgPSBhZnRlclxuXG5mdW5jdGlvbiBhZnRlcihjb3VudCwgY2FsbGJhY2ssIGVycl9jYikge1xuICAgIHZhciBiYWlsID0gZmFsc2VcbiAgICBlcnJfY2IgPSBlcnJfY2IgfHwgbm9vcFxuICAgIHByb3h5LmNvdW50ID0gY291bnRcblxuICAgIHJldHVybiAoY291bnQgPT09IDApID8gY2FsbGJhY2soKSA6IHByb3h5XG5cbiAgICBmdW5jdGlvbiBwcm94eShlcnIsIHJlc3VsdCkge1xuICAgICAgICBpZiAocHJveHkuY291bnQgPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZnRlciBjYWxsZWQgdG9vIG1hbnkgdGltZXMnKVxuICAgICAgICB9XG4gICAgICAgIC0tcHJveHkuY291bnRcblxuICAgICAgICAvLyBhZnRlciBmaXJzdCBlcnJvciwgcmVzdCBhcmUgcGFzc2VkIHRvIGVycl9jYlxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBiYWlsID0gdHJ1ZVxuICAgICAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgICAgICAgLy8gZnV0dXJlIGVycm9yIGNhbGxiYWNrcyB3aWxsIGdvIHRvIGVycm9yIGhhbmRsZXJcbiAgICAgICAgICAgIGNhbGxiYWNrID0gZXJyX2NiXG4gICAgICAgIH0gZWxzZSBpZiAocHJveHkuY291bnQgPT09IDAgJiYgIWJhaWwpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG4iLCIvKipcbiAqIEFuIGFic3RyYWN0aW9uIGZvciBzbGljaW5nIGFuIGFycmF5YnVmZmVyIGV2ZW4gd2hlblxuICogQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlIGlzIG5vdCBzdXBwb3J0ZWRcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYXJyYXlidWZmZXIsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYXJyYXlidWZmZXIuYnl0ZUxlbmd0aDtcbiAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICBlbmQgPSBlbmQgfHwgYnl0ZXM7XG5cbiAgaWYgKGFycmF5YnVmZmVyLnNsaWNlKSB7IHJldHVybiBhcnJheWJ1ZmZlci5zbGljZShzdGFydCwgZW5kKTsgfVxuXG4gIGlmIChzdGFydCA8IDApIHsgc3RhcnQgKz0gYnl0ZXM7IH1cbiAgaWYgKGVuZCA8IDApIHsgZW5kICs9IGJ5dGVzOyB9XG4gIGlmIChlbmQgPiBieXRlcykgeyBlbmQgPSBieXRlczsgfVxuXG4gIGlmIChzdGFydCA+PSBieXRlcyB8fCBzdGFydCA+PSBlbmQgfHwgYnl0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICB9XG5cbiAgdmFyIGFidiA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKTtcbiAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGVuZCAtIHN0YXJ0KTtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0LCBpaSA9IDA7IGkgPCBlbmQ7IGkrKywgaWkrKykge1xuICAgIHJlc3VsdFtpaV0gPSBhYnZbaV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5idWZmZXI7XG59O1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFsnZXhwb3J0cycsICcuL2RlZmF1bHRUcmF2ZWxlcicsICcuL2F0dGFjaENvbW1lbnRzJ10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCcuL2RlZmF1bHRUcmF2ZWxlcicpLCByZXF1aXJlKCcuL2F0dGFjaENvbW1lbnRzJykpO1xuICB9IGVsc2Uge1xuICAgIHZhciBtb2QgPSB7XG4gICAgICBleHBvcnRzOiB7fVxuICAgIH07XG4gICAgZmFjdG9yeShtb2QuZXhwb3J0cywgZ2xvYmFsLmRlZmF1bHRUcmF2ZWxlciwgZ2xvYmFsLmF0dGFjaENvbW1lbnRzKTtcbiAgICBnbG9iYWwuYXN0cmF2ZWwgPSBtb2QuZXhwb3J0cztcbiAgfVxufSkodGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsIF9kZWZhdWx0VHJhdmVsZXIsIF9hdHRhY2hDb21tZW50cykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbiAgZXhwb3J0cy5tYWtlVHJhdmVsZXIgPSBleHBvcnRzLmF0dGFjaENvbW1lbnRzID0gZXhwb3J0cy5kZWZhdWx0VHJhdmVsZXIgPSB1bmRlZmluZWQ7XG5cbiAgdmFyIF9kZWZhdWx0VHJhdmVsZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmYXVsdFRyYXZlbGVyKTtcblxuICB2YXIgX2F0dGFjaENvbW1lbnRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2F0dGFjaENvbW1lbnRzKTtcblxuICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgICBkZWZhdWx0OiBvYmpcbiAgICB9O1xuICB9XG5cbiAgLy8gQXN0cmF2ZWwgaXMgIHRpbnkgYW5kIGZhc3QgRVNUcmVlLWNvbXBsaWFudCBBU1Qgd2Fsa2VyIGFuZCBtb2RpZmllci5cbiAgLy9cbiAgLy8gQXN0cmF2ZWwgd2FzIHdyaXR0ZW4gYnkgRGF2aWQgQm9ubmV0IGFuZCByZWxlYXNlZCB1bmRlciBhbiBNSVQgbGljZW5zZS5cbiAgLy9cbiAgLy8gVGhlIEdpdCByZXBvc2l0b3J5IGZvciBBc3RyYXZlbCBpcyBhdmFpbGFibGUgYXQ6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZpZGJvbm5ldC9hc3RyYXZlbC5naXRcbiAgLy9cbiAgLy8gUGxlYXNlIHVzZSB0aGUgR2l0SHViIGJ1ZyB0cmFja2VyIHRvIHJlcG9ydCBpc3N1ZXM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZpZGJvbm5ldC9hc3RyYXZlbC9pc3N1ZXNcblxuICBmdW5jdGlvbiBtYWtlVHJhdmVsZXIocHJvcGVydGllcykge1xuICAgIC8qXG4gICAgUmV0dXJucyBhIGN1c3RvbSBBU1QgdHJhdmVsZXIgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBgZGVmYXVsdFRyYXZlbGVyYCB3aXRoIGl0cyBvd24gcHJvdmlkZWQgYHByb3BlcnRpZXNgIGFuZCB0aGUgcHJvcGVydHkgYHN1cGVyYCB0aGF0IHBvaW50cyB0byB0aGUgcGFyZW50IHRyYXZlbGVyIG9iamVjdC5cbiAgICAqL1xuICAgIHJldHVybiBfZGVmYXVsdFRyYXZlbGVyMi5kZWZhdWx0Lm1ha2VDaGlsZChwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIGV4cG9ydHMuZGVmYXVsdFRyYXZlbGVyID0gX2RlZmF1bHRUcmF2ZWxlcjIuZGVmYXVsdDtcbiAgZXhwb3J0cy5hdHRhY2hDb21tZW50cyA9IF9hdHRhY2hDb21tZW50czIuZGVmYXVsdDtcbiAgZXhwb3J0cy5tYWtlVHJhdmVsZXIgPSBtYWtlVHJhdmVsZXI7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzdHJhdmVsLmpzLm1hcCIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbJ2V4cG9ydHMnLCAnLi9kZWZhdWx0VHJhdmVsZXInXSwgZmFjdG9yeSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJy4vZGVmYXVsdFRyYXZlbGVyJykpO1xuICB9IGVsc2Uge1xuICAgIHZhciBtb2QgPSB7XG4gICAgICBleHBvcnRzOiB7fVxuICAgIH07XG4gICAgZmFjdG9yeShtb2QuZXhwb3J0cywgZ2xvYmFsLmRlZmF1bHRUcmF2ZWxlcik7XG4gICAgZ2xvYmFsLmF0dGFjaENvbW1lbnRzID0gbW9kLmV4cG9ydHM7XG4gIH1cbn0pKHRoaXMsIGZ1bmN0aW9uIChleHBvcnRzLCBfZGVmYXVsdFRyYXZlbGVyKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG4gIGV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChub2RlLCBjb21tZW50cykge1xuICAgIC8qXG4gICAgTW9kaWZpZXMgaW4tcGxhY2UgdGhlIEFTVCBzdGFydGluZyBhdCBgbm9kZWAgYnkgYXR0YWNoaW5nIHRoZSBwcm92aWRlZCBgY29tbWVudHNgIGFuZCByZXR1cm5zIHRoYXQgQVNULlxuICAgICovXG4gICAgY3VzdG9tVHJhdmVsZXJbbm9kZS50eXBlXShub2RlLCB7XG4gICAgICBjb21tZW50czogY29tbWVudHMsXG4gICAgICBpbmRleDogMFxuICAgIH0pO1xuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHZhciBfZGVmYXVsdFRyYXZlbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmF1bHRUcmF2ZWxlcik7XG5cbiAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgICAgZGVmYXVsdDogb2JqXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0dGFjaENvbW1lbnRzKHBhcmVudCwgY2hpbGRyZW4sIGZpbmRIZWFkaW5nQ29tbWVudHMsIHN0YXRlLCB0cmF2ZWxlcikge1xuICAgIHZhciBpbmRleCA9IHN0YXRlLmluZGV4LFxuICAgICAgICBjb21tZW50cyA9IHN0YXRlLmNvbW1lbnRzO1xuXG4gICAgdmFyIGNvbW1lbnQgPSBjb21tZW50c1tpbmRleF07XG4gICAgLy8gRGVmaW5lIHRoZW0gaW4gdGhlIGJsb2NrcyB3aGVyZSB0aGVyZSBhcmUgdXNlZCBvbmNlXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL21pbmlmeS9pc3N1ZXMvNDg1IGlzIHJlc29sdmVkXG4gICAgdmFyIGJvdW5kQ29tbWVudHMgPSB2b2lkIDAsXG4gICAgICAgIHRyYWlsaW5nQ29tbWVudHMgPSB2b2lkIDA7XG4gICAgaWYgKGNvbW1lbnQgIT0gbnVsbCkge1xuICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIE5vIGNoaWxkcmVuLCBhdHRhY2ggY29tbWVudHMgdG8gcGFyZW50XG4gICAgICAgIGJvdW5kQ29tbWVudHMgPSBwYXJlbnQuY29tbWVudHMgIT0gbnVsbCA/IHBhcmVudC5jb21tZW50cyA6IFtdO1xuICAgICAgICB3aGlsZSAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQuZW5kIDwgcGFyZW50LmVuZCkge1xuICAgICAgICAgIGJvdW5kQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbKytpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuaW5kZXggPSBpbmRleDtcbiAgICAgICAgaWYgKGJvdW5kQ29tbWVudHMubGVuZ3RoICE9PSAwICYmIHBhcmVudC5jb21tZW50cyA9PSBudWxsKSBwYXJlbnQuY29tbWVudHMgPSBib3VuZENvbW1lbnRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTG9vayBmb3IgaGVhZGluZyBibG9jayBjb21tZW50c1xuICAgICAgICBpZiAoZmluZEhlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgIGJvdW5kQ29tbWVudHMgPSBwYXJlbnQuY29tbWVudHMgIT0gbnVsbCA/IHBhcmVudC5jb21tZW50cyA6IFtdO1xuICAgICAgICAgIHZhciBzdGFydCA9IGNoaWxkcmVuWzBdLnN0YXJ0O1xuXG4gICAgICAgICAgd2hpbGUgKGNvbW1lbnQgIT0gbnVsbCAmJiBjb21tZW50LnR5cGVbMF0gPT09ICdCJyAmJiBjb21tZW50LmVuZCA8IHN0YXJ0KSB7XG4gICAgICAgICAgICBib3VuZENvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbKytpbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChib3VuZENvbW1lbnRzLmxlbmd0aCAhPT0gMCAmJiBwYXJlbnQuY29tbWVudHMgPT0gbnVsbCkgcGFyZW50LmNvbW1lbnRzID0gYm91bmRDb21tZW50cztcbiAgICAgICAgfVxuICAgICAgICAvLyBBdHRhY2ggY29tbWVudHMgdG8gY2hpbGRyZW5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgY29tbWVudCAhPSBudWxsICYmIGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgIGJvdW5kQ29tbWVudHMgPSBbXTtcbiAgICAgICAgICB3aGlsZSAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQuZW5kIDwgY2hpbGQuc3RhcnQpIHtcbiAgICAgICAgICAgIGJvdW5kQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50c1srK2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbmV4dCBjb21tZW50IGlzIGxpbmUgY29tbWVudCBhbmQgb24gdGhlIHNhbWUgbGluZVxuICAgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwgJiYgY29tbWVudC50eXBlWzBdID09PSAnTCcpIHtcbiAgICAgICAgICAgIGlmIChjb21tZW50LmxvYy5zdGFydC5saW5lID09PSBjaGlsZC5sb2MuZW5kLmxpbmUpIHtcbiAgICAgICAgICAgICAgYm91bmRDb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbKytpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChib3VuZENvbW1lbnRzLmxlbmd0aCAhPT0gMCkgY2hpbGQuY29tbWVudHMgPSBib3VuZENvbW1lbnRzO1xuICAgICAgICAgIC8vIFRyYXZlbCB0aHJvdWdoIGNoaWxkXG4gICAgICAgICAgc3RhdGUuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICB0cmF2ZWxlcltjaGlsZC50eXBlXShjaGlsZCwgc3RhdGUpO1xuICAgICAgICAgIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gICAgICAgICAgY29tbWVudCA9IGNvbW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICAvLyBMb29rIGZvciByZW1haW5pbmcgY29tbWVudHNcbiAgICAgICAgdHJhaWxpbmdDb21tZW50cyA9IFtdO1xuICAgICAgICB3aGlsZSAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQuZW5kIDwgcGFyZW50LmVuZCkge1xuICAgICAgICAgIHRyYWlsaW5nQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbKytpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWlsaW5nQ29tbWVudHMubGVuZ3RoICE9PSAwKSBwYXJlbnQudHJhaWxpbmdDb21tZW50cyA9IHRyYWlsaW5nQ29tbWVudHM7XG4gICAgICAgIHN0YXRlLmluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIFByb2dyYW0gPSB2b2lkIDA7XG5cbiAgdmFyIGN1c3RvbVRyYXZlbGVyID0gX2RlZmF1bHRUcmF2ZWxlcjIuZGVmYXVsdC5tYWtlQ2hpbGQoe1xuICAgIFByb2dyYW06IFByb2dyYW0gPSBmdW5jdGlvbiBQcm9ncmFtKG5vZGUsIHN0YXRlKSB7XG4gICAgICBhdHRhY2hDb21tZW50cyhub2RlLCBub2RlLmJvZHksIHRydWUsIHN0YXRlLCB0aGlzKTtcbiAgICB9LFxuICAgIEJsb2NrU3RhdGVtZW50OiBQcm9ncmFtLFxuICAgIE9iamVjdEV4cHJlc3Npb246IGZ1bmN0aW9uIE9iamVjdEV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICAgIGF0dGFjaENvbW1lbnRzKG5vZGUsIG5vZGUucHJvcGVydGllcywgdHJ1ZSwgc3RhdGUsIHRoaXMpO1xuICAgIH0sXG4gICAgQXJyYXlFeHByZXNzaW9uOiBmdW5jdGlvbiBBcnJheUV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICAgIGF0dGFjaENvbW1lbnRzKG5vZGUsIG5vZGUuZWxlbWVudHMsIHRydWUsIHN0YXRlLCB0aGlzKTtcbiAgICB9LFxuICAgIFN3aXRjaFN0YXRlbWVudDogZnVuY3Rpb24gU3dpdGNoU3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgICBhdHRhY2hDb21tZW50cyhub2RlLCBub2RlLmNhc2VzLCBmYWxzZSwgc3RhdGUsIHRoaXMpO1xuICAgIH0sXG4gICAgU3dpdGNoQ2FzZTogZnVuY3Rpb24gU3dpdGNoQ2FzZShub2RlLCBzdGF0ZSkge1xuICAgICAgYXR0YWNoQ29tbWVudHMobm9kZSwgbm9kZS5jb25zZXF1ZW50LCBmYWxzZSwgc3RhdGUsIHRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBUT0RPOiBDb25zaWRlciBBcnJheUV4cHJlc3Npb24gP1xuICApO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdHRhY2hDb21tZW50cy5qcy5tYXAiLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZmFjdG9yeShleHBvcnRzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbW9kID0ge1xuICAgICAgZXhwb3J0czoge31cbiAgICB9O1xuICAgIGZhY3RvcnkobW9kLmV4cG9ydHMpO1xuICAgIGdsb2JhbC5kZWZhdWx0VHJhdmVsZXIgPSBtb2QuZXhwb3J0cztcbiAgfVxufSkodGhpcywgZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbiAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBGb3JJblN0YXRlbWVudCA9IHZvaWQgMCxcbiAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb24gPSB2b2lkIDAsXG4gICAgICBSZXN0RWxlbWVudCA9IHZvaWQgMCxcbiAgICAgIEJpbmFyeUV4cHJlc3Npb24gPSB2b2lkIDAsXG4gICAgICBBcnJheUV4cHJlc3Npb24gPSB2b2lkIDA7XG5cbiAgdmFyIGlnbm9yZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuICB2YXIgRm91bmQgPSBmdW5jdGlvbiBGb3VuZChub2RlLCBzdGF0ZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb3VuZCk7XG5cbiAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgfTtcblxuICBleHBvcnRzLmRlZmF1bHQgPSB7XG4gICAgLy8gQmFzaWMgbWV0aG9kc1xuICAgIGdvOiBmdW5jdGlvbiBnbyhub2RlLCBzdGF0ZSkge1xuICAgICAgLypcbiAgICAgIFN0YXJ0cyB0cmF2ZWxsaW5nIHRocm91Z2ggdGhlIHNwZWNpZmllZCBBU1QgYG5vZGVgIHdpdGggdGhlIHByb3ZpZGVkIGBzdGF0ZWAuXG4gICAgICBUaGlzIG1ldGhvZCBpcyByZWN1cnNpdmVseSBjYWxsZWQgYnkgZWFjaCBub2RlIGhhbmRsZXIuXG4gICAgICAqL1xuICAgICAgdGhpc1tub2RlLnR5cGVdKG5vZGUsIHN0YXRlKTtcbiAgICB9LFxuICAgIGZpbmQ6IGZ1bmN0aW9uIGZpbmQocHJlZGljYXRlLCBub2RlLCBzdGF0ZSkge1xuICAgICAgLypcbiAgICAgIFJldHVybnMgeyBub2RlLCBzdGF0ZSB9IGZvciB3aGljaCBgcHJlZGljYXRlKG5vZGUsIHN0YXRlKWAgcmV0dXJucyB0cnV0aHksXG4gICAgICBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIEFTVCBgbm9kZWAgYW5kIHdpdGggdGhlIHByb3ZpZGVkIGBzdGF0ZWAuXG4gICAgICBPdGhlcndpc2UsIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gICAgICAqL1xuICAgICAgdmFyIGZpbmRlciA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICBmaW5kZXIuZ28gPSBmdW5jdGlvbiAobm9kZSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZShub2RlLCBzdGF0ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm91bmQobm9kZSwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXNbbm9kZS50eXBlXShub2RlLCBzdGF0ZSk7XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmluZGVyLmdvKG5vZGUsIHN0YXRlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvdW5kKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBtYWtlQ2hpbGQ6IGZ1bmN0aW9uIG1ha2VDaGlsZCgpIHtcbiAgICAgIHZhciBwcm9wZXJ0aWVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgICAgLypcbiAgICAgIFJldHVybnMgYSBjdXN0b20gQVNUIHRyYXZlbGVyIHRoYXQgaW5oZXJpdHMgZnJvbSBgdGhpc2AgdHJhdmVsZXIgd2l0aCBpdHMgb3duIHByb3ZpZGVkIGBwcm9wZXJ0aWVzYCBhbmQgdGhlIHByb3BlcnR5IGBzdXBlcmAgdGhhdCBwb2ludHMgdG8gdGhlIHBhcmVudCB0cmF2ZWxlciBvYmplY3QuXG4gICAgICAqL1xuICAgICAgdmFyIHRyYXZlbGVyID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICAgIHRyYXZlbGVyLnN1cGVyID0gdGhpcztcbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRyYXZlbGVyW2tleV0gPSBwcm9wZXJ0aWVzW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJhdmVsZXI7XG4gICAgfSxcblxuXG4gICAgLy8gSmF2YVNjcmlwdCA1XG4gICAgUHJvZ3JhbTogZnVuY3Rpb24gUHJvZ3JhbShub2RlLCBzdGF0ZSkge1xuICAgICAgdmFyIHN0YXRlbWVudHMgPSBub2RlLmJvZHksXG4gICAgICAgICAgbGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5nbyhzdGF0ZW1lbnRzW2ldLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQobm9kZSwgc3RhdGUpIHtcbiAgICAgIHZhciBzdGF0ZW1lbnRzID0gbm9kZS5ib2R5O1xuICAgICAgaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuZ28oc3RhdGVtZW50c1tpXSwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIEVtcHR5U3RhdGVtZW50OiBpZ25vcmUsXG4gICAgRXhwcmVzc2lvblN0YXRlbWVudDogZnVuY3Rpb24gRXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5nbyhub2RlLmV4cHJlc3Npb24sIHN0YXRlKTtcbiAgICB9LFxuICAgIElmU3RhdGVtZW50OiBmdW5jdGlvbiBJZlN0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5nbyhub2RlLnRlc3QsIHN0YXRlKTtcbiAgICAgIHRoaXMuZ28obm9kZS5jb25zZXF1ZW50LCBzdGF0ZSk7XG4gICAgICBpZiAobm9kZS5hbHRlcm5hdGUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdvKG5vZGUuYWx0ZXJuYXRlLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBMYWJlbGVkU3RhdGVtZW50OiBmdW5jdGlvbiBMYWJlbGVkU3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUubGFiZWwsIHN0YXRlKTtcbiAgICAgIHRoaXMuZ28obm9kZS5ib2R5LCBzdGF0ZSk7XG4gICAgfSxcbiAgICBCcmVha1N0YXRlbWVudDogZnVuY3Rpb24gQnJlYWtTdGF0ZW1lbnQobm9kZSwgc3RhdGUpIHtcbiAgICAgIGlmIChub2RlLmxhYmVsKSB7XG4gICAgICAgIHRoaXMuZ28obm9kZS5sYWJlbCwgc3RhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgQ29udGludWVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRpbnVlU3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgICBpZiAobm9kZS5sYWJlbCkge1xuICAgICAgICB0aGlzLmdvKG5vZGUubGFiZWwsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFdpdGhTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFdpdGhTdGF0ZW1lbnQobm9kZSwgc3RhdGUpIHtcbiAgICAgIHRoaXMuZ28obm9kZS5vYmplY3QsIHN0YXRlKTtcbiAgICAgIHRoaXMuZ28obm9kZS5ib2R5LCBzdGF0ZSk7XG4gICAgfSxcbiAgICBTd2l0Y2hTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFN3aXRjaFN0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5nbyhub2RlLmRpc2NyaW1pbmFudCwgc3RhdGUpO1xuICAgICAgdmFyIGNhc2VzID0gbm9kZS5jYXNlcyxcbiAgICAgICAgICBsZW5ndGggPSBjYXNlcy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5nbyhjYXNlc1tpXSwgc3RhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgU3dpdGNoQ2FzZTogZnVuY3Rpb24gU3dpdGNoQ2FzZShub2RlLCBzdGF0ZSkge1xuICAgICAgaWYgKG5vZGUudGVzdCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZ28obm9kZS50ZXN0LCBzdGF0ZSk7XG4gICAgICB9XG4gICAgICB2YXIgc3RhdGVtZW50cyA9IG5vZGUuY29uc2VxdWVudCxcbiAgICAgICAgICBsZW5ndGggPSBzdGF0ZW1lbnRzLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmdvKHN0YXRlbWVudHNbaV0sIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFJldHVyblN0YXRlbWVudDogZnVuY3Rpb24gUmV0dXJuU3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgICBpZiAobm9kZS5hcmd1bWVudCkge1xuICAgICAgICB0aGlzLmdvKG5vZGUuYXJndW1lbnQsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFRocm93U3RhdGVtZW50OiBmdW5jdGlvbiBUaHJvd1N0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5nbyhub2RlLmFyZ3VtZW50LCBzdGF0ZSk7XG4gICAgfSxcbiAgICBUcnlTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFRyeVN0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5nbyhub2RlLmJsb2NrLCBzdGF0ZSk7XG4gICAgICBpZiAobm9kZS5oYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5nbyhub2RlLmhhbmRsZXIsIHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmZpbmFsaXplciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZ28obm9kZS5maW5hbGl6ZXIsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIENhdGNoQ2xhdXNlOiBmdW5jdGlvbiBDYXRjaENsYXVzZShub2RlLCBzdGF0ZSkge1xuICAgICAgaWYgKG5vZGUucGFyYW0gIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdvKG5vZGUucGFyYW0sIHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ28obm9kZS5ib2R5LCBzdGF0ZSk7XG4gICAgfSxcbiAgICBXaGlsZVN0YXRlbWVudDogZnVuY3Rpb24gV2hpbGVTdGF0ZW1lbnQobm9kZSwgc3RhdGUpIHtcbiAgICAgIHRoaXMuZ28obm9kZS50ZXN0LCBzdGF0ZSk7XG4gICAgICB0aGlzLmdvKG5vZGUuYm9keSwgc3RhdGUpO1xuICAgIH0sXG4gICAgRG9XaGlsZVN0YXRlbWVudDogZnVuY3Rpb24gRG9XaGlsZVN0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5nbyhub2RlLmJvZHksIHN0YXRlKTtcbiAgICAgIHRoaXMuZ28obm9kZS50ZXN0LCBzdGF0ZSk7XG4gICAgfSxcbiAgICBGb3JTdGF0ZW1lbnQ6IGZ1bmN0aW9uIEZvclN0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgICAgaWYgKG5vZGUuaW5pdCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZ28obm9kZS5pbml0LCBzdGF0ZSk7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS50ZXN0ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5nbyhub2RlLnRlc3QsIHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLnVwZGF0ZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZ28obm9kZS51cGRhdGUsIHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ28obm9kZS5ib2R5LCBzdGF0ZSk7XG4gICAgfSxcblxuICAgIEZvckluU3RhdGVtZW50OiBGb3JJblN0YXRlbWVudCA9IGZ1bmN0aW9uIEZvckluU3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUubGVmdCwgc3RhdGUpO1xuICAgICAgdGhpcy5nbyhub2RlLnJpZ2h0LCBzdGF0ZSk7XG4gICAgICB0aGlzLmdvKG5vZGUuYm9keSwgc3RhdGUpO1xuICAgIH0sXG4gICAgRGVidWdnZXJTdGF0ZW1lbnQ6IGlnbm9yZSxcbiAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBGdW5jdGlvbkRlY2xhcmF0aW9uID0gZnVuY3Rpb24gRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlLCBzdGF0ZSkge1xuICAgICAgaWYgKG5vZGUuaWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdvKG5vZGUuaWQsIHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJhbXMgPSBub2RlLnBhcmFtcztcblxuICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBwYXJhbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmdvKHBhcmFtc1tpXSwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmdvKG5vZGUuYm9keSwgc3RhdGUpO1xuICAgIH0sXG4gICAgVmFyaWFibGVEZWNsYXJhdGlvbjogZnVuY3Rpb24gVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLCBzdGF0ZSkge1xuICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IG5vZGUuZGVjbGFyYXRpb25zLFxuICAgICAgICAgIGxlbmd0aCA9IGRlY2xhcmF0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5nbyhkZWNsYXJhdGlvbnNbaV0sIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFZhcmlhYmxlRGVjbGFyYXRvcjogZnVuY3Rpb24gVmFyaWFibGVEZWNsYXJhdG9yKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUuaWQsIHN0YXRlKTtcbiAgICAgIGlmIChub2RlLmluaXQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdvKG5vZGUuaW5pdCwgc3RhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IGZ1bmN0aW9uIEFycm93RnVuY3Rpb25FeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICB2YXIgcGFyYW1zID0gbm9kZS5wYXJhbXM7XG5cbiAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcGFyYW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5nbyhwYXJhbXNbaV0sIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5nbyhub2RlLmJvZHksIHN0YXRlKTtcbiAgICB9LFxuXG4gICAgVGhpc0V4cHJlc3Npb246IGlnbm9yZSxcbiAgICBBcnJheUV4cHJlc3Npb246IEFycmF5RXhwcmVzc2lvbiA9IGZ1bmN0aW9uIEFycmF5RXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgICAgdmFyIGVsZW1lbnRzID0gbm9kZS5lbGVtZW50cyxcbiAgICAgICAgICBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcbiAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuZ28oZWxlbWVudHNbaV0sIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgT2JqZWN0RXhwcmVzc2lvbjogZnVuY3Rpb24gT2JqZWN0RXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgICAgdmFyIHByb3BlcnRpZXMgPSBub2RlLnByb3BlcnRpZXMsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5nbyhwcm9wZXJ0aWVzW2ldLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBQcm9wZXJ0eTogZnVuY3Rpb24gUHJvcGVydHkobm9kZSwgc3RhdGUpIHtcbiAgICAgIHRoaXMuZ28obm9kZS5rZXksIHN0YXRlKTtcbiAgICAgIGlmICghbm9kZS5zaG9ydGhhbmQpIHtcbiAgICAgICAgdGhpcy5nbyhub2RlLnZhbHVlLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgICBTZXF1ZW5jZUV4cHJlc3Npb246IGZ1bmN0aW9uIFNlcXVlbmNlRXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgICAgdmFyIGV4cHJlc3Npb25zID0gbm9kZS5leHByZXNzaW9ucyxcbiAgICAgICAgICBsZW5ndGggPSBleHByZXNzaW9ucy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5nbyhleHByZXNzaW9uc1tpXSwgc3RhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgVW5hcnlFeHByZXNzaW9uOiBmdW5jdGlvbiBVbmFyeUV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICAgIHRoaXMuZ28obm9kZS5hcmd1bWVudCwgc3RhdGUpO1xuICAgIH0sXG4gICAgVXBkYXRlRXhwcmVzc2lvbjogZnVuY3Rpb24gVXBkYXRlRXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5nbyhub2RlLmFyZ3VtZW50LCBzdGF0ZSk7XG4gICAgfSxcbiAgICBBc3NpZ25tZW50RXhwcmVzc2lvbjogZnVuY3Rpb24gQXNzaWdubWVudEV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICAgIHRoaXMuZ28obm9kZS5sZWZ0LCBzdGF0ZSk7XG4gICAgICB0aGlzLmdvKG5vZGUucmlnaHQsIHN0YXRlKTtcbiAgICB9LFxuXG4gICAgQmluYXJ5RXhwcmVzc2lvbjogQmluYXJ5RXhwcmVzc2lvbiA9IGZ1bmN0aW9uIEJpbmFyeUV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICAgIHRoaXMuZ28obm9kZS5sZWZ0LCBzdGF0ZSk7XG4gICAgICB0aGlzLmdvKG5vZGUucmlnaHQsIHN0YXRlKTtcbiAgICB9LFxuICAgIExvZ2ljYWxFeHByZXNzaW9uOiBCaW5hcnlFeHByZXNzaW9uLFxuICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogZnVuY3Rpb24gQ29uZGl0aW9uYWxFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUudGVzdCwgc3RhdGUpO1xuICAgICAgdGhpcy5nbyhub2RlLmNvbnNlcXVlbnQsIHN0YXRlKTtcbiAgICAgIHRoaXMuZ28obm9kZS5hbHRlcm5hdGUsIHN0YXRlKTtcbiAgICB9LFxuICAgIE5ld0V4cHJlc3Npb246IGZ1bmN0aW9uIE5ld0V4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICAgIHRoaXMuQ2FsbEV4cHJlc3Npb24obm9kZSwgc3RhdGUpO1xuICAgIH0sXG4gICAgQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIENhbGxFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUuY2FsbGVlLCBzdGF0ZSk7XG4gICAgICB2YXIgYXJncyA9IG5vZGVbJ2FyZ3VtZW50cyddLFxuICAgICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZ28oYXJnc1tpXSwgc3RhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgTWVtYmVyRXhwcmVzc2lvbjogZnVuY3Rpb24gTWVtYmVyRXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5nbyhub2RlLm9iamVjdCwgc3RhdGUpO1xuICAgICAgdGhpcy5nbyhub2RlLnByb3BlcnR5LCBzdGF0ZSk7XG4gICAgfSxcblxuICAgIElkZW50aWZpZXI6IGlnbm9yZSxcbiAgICBMaXRlcmFsOiBpZ25vcmUsXG5cbiAgICAvLyBKYXZhU2NyaXB0IDZcbiAgICBGb3JPZlN0YXRlbWVudDogRm9ySW5TdGF0ZW1lbnQsXG4gICAgQ2xhc3NEZWNsYXJhdGlvbjogZnVuY3Rpb24gQ2xhc3NEZWNsYXJhdGlvbihub2RlLCBzdGF0ZSkge1xuICAgICAgaWYgKG5vZGUuaWQpIHtcbiAgICAgICAgdGhpcy5nbyhub2RlLmlkLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5zdXBlckNsYXNzKSB7XG4gICAgICAgIHRoaXMuZ28obm9kZS5zdXBlckNsYXNzLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmdvKG5vZGUuYm9keSwgc3RhdGUpO1xuICAgIH0sXG4gICAgQ2xhc3NCb2R5OiBmdW5jdGlvbiBDbGFzc0JvZHkobm9kZSwgc3RhdGUpIHtcbiAgICAgIHZhciBib2R5ID0gbm9kZS5ib2R5LFxuICAgICAgICAgIGxlbmd0aCA9IGJvZHkubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZ28oYm9keVtpXSwgc3RhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgSW1wb3J0RGVjbGFyYXRpb246IGZ1bmN0aW9uIEltcG9ydERlY2xhcmF0aW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICB2YXIgc3BlY2lmaWVycyA9IG5vZGUuc3BlY2lmaWVycyxcbiAgICAgICAgICBsZW5ndGggPSBzcGVjaWZpZXJzLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmdvKHNwZWNpZmllcnNbaV0sIHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ28obm9kZS5zb3VyY2UsIHN0YXRlKTtcbiAgICB9LFxuICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogZnVuY3Rpb24gSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUubG9jYWwsIHN0YXRlKTtcbiAgICB9LFxuICAgIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6IGZ1bmN0aW9uIEltcG9ydERlZmF1bHRTcGVjaWZpZXIobm9kZSwgc3RhdGUpIHtcbiAgICAgIHRoaXMuZ28obm9kZS5sb2NhbCwgc3RhdGUpO1xuICAgIH0sXG4gICAgSW1wb3J0U3BlY2lmaWVyOiBmdW5jdGlvbiBJbXBvcnRTcGVjaWZpZXIobm9kZSwgc3RhdGUpIHtcbiAgICAgIHRoaXMuZ28obm9kZS5pbXBvcnRlZCwgc3RhdGUpO1xuICAgICAgdGhpcy5nbyhub2RlLmxvY2FsLCBzdGF0ZSk7XG4gICAgfSxcbiAgICBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb246IGZ1bmN0aW9uIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihub2RlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5nbyhub2RlLmRlY2xhcmF0aW9uLCBzdGF0ZSk7XG4gICAgfSxcbiAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiBmdW5jdGlvbiBFeHBvcnROYW1lZERlY2xhcmF0aW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbikge1xuICAgICAgICB0aGlzLmdvKG5vZGUuZGVjbGFyYXRpb24sIHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHZhciBzcGVjaWZpZXJzID0gbm9kZS5zcGVjaWZpZXJzLFxuICAgICAgICAgIGxlbmd0aCA9IHNwZWNpZmllcnMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZ28oc3BlY2lmaWVyc1tpXSwgc3RhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuc291cmNlKSB7XG4gICAgICAgIHRoaXMuZ28obm9kZS5zb3VyY2UsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIEV4cG9ydFNwZWNpZmllcjogZnVuY3Rpb24gRXhwb3J0U3BlY2lmaWVyKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUubG9jYWwsIHN0YXRlKTtcbiAgICAgIHRoaXMuZ28obm9kZS5leHBvcnRlZCwgc3RhdGUpO1xuICAgIH0sXG4gICAgRXhwb3J0QWxsRGVjbGFyYXRpb246IGZ1bmN0aW9uIEV4cG9ydEFsbERlY2xhcmF0aW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUuc291cmNlLCBzdGF0ZSk7XG4gICAgfSxcbiAgICBNZXRob2REZWZpbml0aW9uOiBmdW5jdGlvbiBNZXRob2REZWZpbml0aW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUua2V5LCBzdGF0ZSk7XG4gICAgICB0aGlzLmdvKG5vZGUudmFsdWUsIHN0YXRlKTtcbiAgICB9LFxuICAgIENsYXNzRXhwcmVzc2lvbjogZnVuY3Rpb24gQ2xhc3NFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLkNsYXNzRGVjbGFyYXRpb24obm9kZSwgc3RhdGUpO1xuICAgIH0sXG5cbiAgICBTdXBlcjogaWdub3JlLFxuICAgIFJlc3RFbGVtZW50OiBSZXN0RWxlbWVudCA9IGZ1bmN0aW9uIFJlc3RFbGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUuYXJndW1lbnQsIHN0YXRlKTtcbiAgICB9LFxuICAgIFNwcmVhZEVsZW1lbnQ6IFJlc3RFbGVtZW50LFxuICAgIFlpZWxkRXhwcmVzc2lvbjogZnVuY3Rpb24gWWllbGRFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICBpZiAobm9kZS5hcmd1bWVudCkge1xuICAgICAgICB0aGlzLmdvKG5vZGUuYXJndW1lbnQsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbjogZnVuY3Rpb24gVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUudGFnLCBzdGF0ZSk7XG4gICAgICB0aGlzLmdvKG5vZGUucXVhc2ksIHN0YXRlKTtcbiAgICB9LFxuICAgIFRlbXBsYXRlTGl0ZXJhbDogZnVuY3Rpb24gVGVtcGxhdGVMaXRlcmFsKG5vZGUsIHN0YXRlKSB7XG4gICAgICB2YXIgcXVhc2lzID0gbm9kZS5xdWFzaXMsXG4gICAgICAgICAgZXhwcmVzc2lvbnMgPSBub2RlLmV4cHJlc3Npb25zO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZXhwcmVzc2lvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5nbyhleHByZXNzaW9uc1tpXSwgc3RhdGUpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgX2kgPSAwLCBfbGVuZ3RoID0gcXVhc2lzLmxlbmd0aDsgX2kgPCBfbGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHRoaXMuZ28ocXVhc2lzW19pXSwgc3RhdGUpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBUZW1wbGF0ZUVsZW1lbnQ6IGlnbm9yZSxcbiAgICBPYmplY3RQYXR0ZXJuOiBmdW5jdGlvbiBPYmplY3RQYXR0ZXJuKG5vZGUsIHN0YXRlKSB7XG4gICAgICB2YXIgcHJvcGVydGllcyA9IG5vZGUucHJvcGVydGllcyxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wZXJ0aWVzLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmdvKHByb3BlcnRpZXNbaV0sIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgQXJyYXlQYXR0ZXJuOiBBcnJheUV4cHJlc3Npb24sXG4gICAgQXNzaWdubWVudFBhdHRlcm46IGZ1bmN0aW9uIEFzc2lnbm1lbnRQYXR0ZXJuKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUubGVmdCwgc3RhdGUpO1xuICAgICAgdGhpcy5nbyhub2RlLnJpZ2h0LCBzdGF0ZSk7XG4gICAgfSxcbiAgICBNZXRhUHJvcGVydHk6IGZ1bmN0aW9uIE1ldGFQcm9wZXJ0eShub2RlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5nbyhub2RlLm1ldGEsIHN0YXRlKTtcbiAgICAgIHRoaXMuZ28obm9kZS5wcm9wZXJ0eSwgc3RhdGUpO1xuICAgIH0sXG5cblxuICAgIC8vIEphdmFTY3JpcHQgN1xuICAgIEF3YWl0RXhwcmVzc2lvbjogZnVuY3Rpb24gQXdhaXRFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgICB0aGlzLmdvKG5vZGUuYXJndW1lbnQsIHN0YXRlKTtcbiAgICB9XG4gIH07XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZmF1bHRUcmF2ZWxlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2VuZXJhdGUgPSBnZW5lcmF0ZTtcbmV4cG9ydHMuYmFzZUdlbmVyYXRvciA9IHZvaWQgMDtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG52YXIgc3RyaW5naWZ5ID0gSlNPTi5zdHJpbmdpZnk7XG5cbmlmICghU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdTdHJpbmcucHJvdG90eXBlLnJlcGVhdCBpcyB1bmRlZmluZWQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZGF2aWRib25uZXQvYXN0cmluZyNpbnN0YWxsYXRpb24nKTtcbn1cblxuaWYgKCFTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKSB7XG4gIHRocm93IG5ldyBFcnJvcignU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCBpcyB1bmRlZmluZWQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZGF2aWRib25uZXQvYXN0cmluZyNpbnN0YWxsYXRpb24nKTtcbn1cblxudmFyIE9QRVJBVE9SX1BSRUNFREVOQ0UgPSB7XG4gICd8fCc6IDMsXG4gICcmJic6IDQsXG4gICd8JzogNSxcbiAgJ14nOiA2LFxuICAnJic6IDcsXG4gICc9PSc6IDgsXG4gICchPSc6IDgsXG4gICc9PT0nOiA4LFxuICAnIT09JzogOCxcbiAgJzwnOiA5LFxuICAnPic6IDksXG4gICc8PSc6IDksXG4gICc+PSc6IDksXG4gIGluOiA5LFxuICBpbnN0YW5jZW9mOiA5LFxuICAnPDwnOiAxMCxcbiAgJz4+JzogMTAsXG4gICc+Pj4nOiAxMCxcbiAgJysnOiAxMSxcbiAgJy0nOiAxMSxcbiAgJyonOiAxMixcbiAgJyUnOiAxMixcbiAgJy8nOiAxMixcbiAgJyoqJzogMTNcbn07XG52YXIgTkVFRFNfUEFSRU5USEVTRVMgPSAxNztcbnZhciBFWFBSRVNTSU9OU19QUkVDRURFTkNFID0ge1xuICBBcnJheUV4cHJlc3Npb246IDIwLFxuICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246IDIwLFxuICBUaGlzRXhwcmVzc2lvbjogMjAsXG4gIElkZW50aWZpZXI6IDIwLFxuICBMaXRlcmFsOiAxOCxcbiAgVGVtcGxhdGVMaXRlcmFsOiAyMCxcbiAgU3VwZXI6IDIwLFxuICBTZXF1ZW5jZUV4cHJlc3Npb246IDIwLFxuICBNZW1iZXJFeHByZXNzaW9uOiAxOSxcbiAgQ2FsbEV4cHJlc3Npb246IDE5LFxuICBOZXdFeHByZXNzaW9uOiAxOSxcbiAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IE5FRURTX1BBUkVOVEhFU0VTLFxuICBDbGFzc0V4cHJlc3Npb246IE5FRURTX1BBUkVOVEhFU0VTLFxuICBGdW5jdGlvbkV4cHJlc3Npb246IE5FRURTX1BBUkVOVEhFU0VTLFxuICBPYmplY3RFeHByZXNzaW9uOiBORUVEU19QQVJFTlRIRVNFUyxcbiAgVXBkYXRlRXhwcmVzc2lvbjogMTYsXG4gIFVuYXJ5RXhwcmVzc2lvbjogMTUsXG4gIEJpbmFyeUV4cHJlc3Npb246IDE0LFxuICBMb2dpY2FsRXhwcmVzc2lvbjogMTMsXG4gIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogNCxcbiAgQXNzaWdubWVudEV4cHJlc3Npb246IDMsXG4gIEF3YWl0RXhwcmVzc2lvbjogMixcbiAgWWllbGRFeHByZXNzaW9uOiAyLFxuICBSZXN0RWxlbWVudDogMVxufTtcblxuZnVuY3Rpb24gZm9ybWF0U2VxdWVuY2Uoc3RhdGUsIG5vZGVzKSB7XG4gIHZhciBnZW5lcmF0b3IgPSBzdGF0ZS5nZW5lcmF0b3I7XG4gIHN0YXRlLndyaXRlKCcoJyk7XG5cbiAgaWYgKG5vZGVzICE9IG51bGwgJiYgbm9kZXMubGVuZ3RoID4gMCkge1xuICAgIGdlbmVyYXRvcltub2Rlc1swXS50eXBlXShub2Rlc1swXSwgc3RhdGUpO1xuICAgIHZhciBsZW5ndGggPSBub2Rlcy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFyYW0gPSBub2Rlc1tpXTtcbiAgICAgIHN0YXRlLndyaXRlKCcsICcpO1xuICAgICAgZ2VuZXJhdG9yW3BhcmFtLnR5cGVdKHBhcmFtLCBzdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUud3JpdGUoJyknKTtcbn1cblxuZnVuY3Rpb24gZXhwcmVzc2lvbk5lZWRzUGFyZW50aGVzaXMobm9kZSwgcGFyZW50Tm9kZSwgaXNSaWdodEhhbmQpIHtcbiAgdmFyIG5vZGVQcmVjZWRlbmNlID0gRVhQUkVTU0lPTlNfUFJFQ0VERU5DRVtub2RlLnR5cGVdO1xuXG4gIGlmIChub2RlUHJlY2VkZW5jZSA9PT0gTkVFRFNfUEFSRU5USEVTRVMpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwYXJlbnROb2RlUHJlY2VkZW5jZSA9IEVYUFJFU1NJT05TX1BSRUNFREVOQ0VbcGFyZW50Tm9kZS50eXBlXTtcblxuICBpZiAobm9kZVByZWNlZGVuY2UgIT09IHBhcmVudE5vZGVQcmVjZWRlbmNlKSB7XG4gICAgcmV0dXJuIG5vZGVQcmVjZWRlbmNlIDwgcGFyZW50Tm9kZVByZWNlZGVuY2U7XG4gIH1cblxuICBpZiAobm9kZVByZWNlZGVuY2UgIT09IDEzICYmIG5vZGVQcmVjZWRlbmNlICE9PSAxNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChub2RlLm9wZXJhdG9yID09PSAnKionICYmIHBhcmVudE5vZGUub3BlcmF0b3IgPT09ICcqKicpIHtcbiAgICByZXR1cm4gIWlzUmlnaHRIYW5kO1xuICB9XG5cbiAgaWYgKGlzUmlnaHRIYW5kKSB7XG4gICAgcmV0dXJuIE9QRVJBVE9SX1BSRUNFREVOQ0Vbbm9kZS5vcGVyYXRvcl0gPD0gT1BFUkFUT1JfUFJFQ0VERU5DRVtwYXJlbnROb2RlLm9wZXJhdG9yXTtcbiAgfVxuXG4gIHJldHVybiBPUEVSQVRPUl9QUkVDRURFTkNFW25vZGUub3BlcmF0b3JdIDwgT1BFUkFUT1JfUFJFQ0VERU5DRVtwYXJlbnROb2RlLm9wZXJhdG9yXTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0QmluYXJ5RXhwcmVzc2lvblBhcnQoc3RhdGUsIG5vZGUsIHBhcmVudE5vZGUsIGlzUmlnaHRIYW5kKSB7XG4gIHZhciBnZW5lcmF0b3IgPSBzdGF0ZS5nZW5lcmF0b3I7XG5cbiAgaWYgKGV4cHJlc3Npb25OZWVkc1BhcmVudGhlc2lzKG5vZGUsIHBhcmVudE5vZGUsIGlzUmlnaHRIYW5kKSkge1xuICAgIHN0YXRlLndyaXRlKCcoJyk7XG4gICAgZ2VuZXJhdG9yW25vZGUudHlwZV0obm9kZSwgc3RhdGUpO1xuICAgIHN0YXRlLndyaXRlKCcpJyk7XG4gIH0gZWxzZSB7XG4gICAgZ2VuZXJhdG9yW25vZGUudHlwZV0obm9kZSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlaW5kZW50KHN0YXRlLCB0ZXh0LCBpbmRlbnQsIGxpbmVFbmQpIHtcbiAgdmFyIGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gIHZhciBlbmQgPSBsaW5lcy5sZW5ndGggLSAxO1xuICBzdGF0ZS53cml0ZShsaW5lc1swXS50cmltKCkpO1xuXG4gIGlmIChlbmQgPiAwKSB7XG4gICAgc3RhdGUud3JpdGUobGluZUVuZCk7XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICBzdGF0ZS53cml0ZShpbmRlbnQgKyBsaW5lc1tpXS50cmltKCkgKyBsaW5lRW5kKTtcbiAgICB9XG5cbiAgICBzdGF0ZS53cml0ZShpbmRlbnQgKyBsaW5lc1tlbmRdLnRyaW0oKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0Q29tbWVudHMoc3RhdGUsIGNvbW1lbnRzLCBpbmRlbnQsIGxpbmVFbmQpIHtcbiAgdmFyIGxlbmd0aCA9IGNvbW1lbnRzLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbW1lbnQgPSBjb21tZW50c1tpXTtcbiAgICBzdGF0ZS53cml0ZShpbmRlbnQpO1xuXG4gICAgaWYgKGNvbW1lbnQudHlwZVswXSA9PT0gJ0wnKSB7XG4gICAgICBzdGF0ZS53cml0ZSgnLy8gJyArIGNvbW1lbnQudmFsdWUudHJpbSgpICsgJ1xcbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS53cml0ZSgnLyonKTtcbiAgICAgIHJlaW5kZW50KHN0YXRlLCBjb21tZW50LnZhbHVlLCBpbmRlbnQsIGxpbmVFbmQpO1xuICAgICAgc3RhdGUud3JpdGUoJyovJyArIGxpbmVFbmQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDYWxsRXhwcmVzc2lvbihub2RlKSB7XG4gIHZhciBjdXJyZW50Tm9kZSA9IG5vZGU7XG5cbiAgd2hpbGUgKGN1cnJlbnROb2RlICE9IG51bGwpIHtcbiAgICB2YXIgX2N1cnJlbnROb2RlID0gY3VycmVudE5vZGUsXG4gICAgICAgIHR5cGUgPSBfY3VycmVudE5vZGUudHlwZTtcblxuICAgIGlmICh0eXBlWzBdID09PSAnQycgJiYgdHlwZVsxXSA9PT0gJ2EnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVbMF0gPT09ICdNJyAmJiB0eXBlWzFdID09PSAnZScgJiYgdHlwZVsyXSA9PT0gJ20nKSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm9iamVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRWYXJpYWJsZURlY2xhcmF0aW9uKHN0YXRlLCBub2RlKSB7XG4gIHZhciBnZW5lcmF0b3IgPSBzdGF0ZS5nZW5lcmF0b3I7XG4gIHZhciBkZWNsYXJhdGlvbnMgPSBub2RlLmRlY2xhcmF0aW9ucztcbiAgc3RhdGUud3JpdGUobm9kZS5raW5kICsgJyAnKTtcbiAgdmFyIGxlbmd0aCA9IGRlY2xhcmF0aW9ucy5sZW5ndGg7XG5cbiAgaWYgKGxlbmd0aCA+IDApIHtcbiAgICBnZW5lcmF0b3IuVmFyaWFibGVEZWNsYXJhdG9yKGRlY2xhcmF0aW9uc1swXSwgc3RhdGUpO1xuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgc3RhdGUud3JpdGUoJywgJyk7XG4gICAgICBnZW5lcmF0b3IuVmFyaWFibGVEZWNsYXJhdG9yKGRlY2xhcmF0aW9uc1tpXSwgc3RhdGUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgRm9ySW5TdGF0ZW1lbnQsIEZ1bmN0aW9uRGVjbGFyYXRpb24sIFJlc3RFbGVtZW50LCBCaW5hcnlFeHByZXNzaW9uLCBBcnJheUV4cHJlc3Npb24sIEJsb2NrU3RhdGVtZW50O1xudmFyIGJhc2VHZW5lcmF0b3IgPSB7XG4gIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0obm9kZSwgc3RhdGUpIHtcbiAgICB2YXIgaW5kZW50ID0gc3RhdGUuaW5kZW50LnJlcGVhdChzdGF0ZS5pbmRlbnRMZXZlbCk7XG4gICAgdmFyIGxpbmVFbmQgPSBzdGF0ZS5saW5lRW5kLFxuICAgICAgICB3cml0ZUNvbW1lbnRzID0gc3RhdGUud3JpdGVDb21tZW50cztcblxuICAgIGlmICh3cml0ZUNvbW1lbnRzICYmIG5vZGUuY29tbWVudHMgIT0gbnVsbCkge1xuICAgICAgZm9ybWF0Q29tbWVudHMoc3RhdGUsIG5vZGUuY29tbWVudHMsIGluZGVudCwgbGluZUVuZCk7XG4gICAgfVxuXG4gICAgdmFyIHN0YXRlbWVudHMgPSBub2RlLmJvZHk7XG4gICAgdmFyIGxlbmd0aCA9IHN0YXRlbWVudHMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN0YXRlbWVudCA9IHN0YXRlbWVudHNbaV07XG5cbiAgICAgIGlmICh3cml0ZUNvbW1lbnRzICYmIHN0YXRlbWVudC5jb21tZW50cyAhPSBudWxsKSB7XG4gICAgICAgIGZvcm1hdENvbW1lbnRzKHN0YXRlLCBzdGF0ZW1lbnQuY29tbWVudHMsIGluZGVudCwgbGluZUVuZCk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLndyaXRlKGluZGVudCk7XG4gICAgICB0aGlzW3N0YXRlbWVudC50eXBlXShzdGF0ZW1lbnQsIHN0YXRlKTtcbiAgICAgIHN0YXRlLndyaXRlKGxpbmVFbmQpO1xuICAgIH1cblxuICAgIGlmICh3cml0ZUNvbW1lbnRzICYmIG5vZGUudHJhaWxpbmdDb21tZW50cyAhPSBudWxsKSB7XG4gICAgICBmb3JtYXRDb21tZW50cyhzdGF0ZSwgbm9kZS50cmFpbGluZ0NvbW1lbnRzLCBpbmRlbnQsIGxpbmVFbmQpO1xuICAgIH1cbiAgfSxcbiAgQmxvY2tTdGF0ZW1lbnQ6IEJsb2NrU3RhdGVtZW50ID0gZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQobm9kZSwgc3RhdGUpIHtcbiAgICB2YXIgaW5kZW50ID0gc3RhdGUuaW5kZW50LnJlcGVhdChzdGF0ZS5pbmRlbnRMZXZlbCsrKTtcbiAgICB2YXIgbGluZUVuZCA9IHN0YXRlLmxpbmVFbmQsXG4gICAgICAgIHdyaXRlQ29tbWVudHMgPSBzdGF0ZS53cml0ZUNvbW1lbnRzO1xuICAgIHZhciBzdGF0ZW1lbnRJbmRlbnQgPSBpbmRlbnQgKyBzdGF0ZS5pbmRlbnQ7XG4gICAgc3RhdGUud3JpdGUoJ3snKTtcbiAgICB2YXIgc3RhdGVtZW50cyA9IG5vZGUuYm9keTtcblxuICAgIGlmIChzdGF0ZW1lbnRzICE9IG51bGwgJiYgc3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBzdGF0ZS53cml0ZShsaW5lRW5kKTtcblxuICAgICAgaWYgKHdyaXRlQ29tbWVudHMgJiYgbm9kZS5jb21tZW50cyAhPSBudWxsKSB7XG4gICAgICAgIGZvcm1hdENvbW1lbnRzKHN0YXRlLCBub2RlLmNvbW1lbnRzLCBzdGF0ZW1lbnRJbmRlbnQsIGxpbmVFbmQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHN0YXRlbWVudCA9IHN0YXRlbWVudHNbaV07XG5cbiAgICAgICAgaWYgKHdyaXRlQ29tbWVudHMgJiYgc3RhdGVtZW50LmNvbW1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgICBmb3JtYXRDb21tZW50cyhzdGF0ZSwgc3RhdGVtZW50LmNvbW1lbnRzLCBzdGF0ZW1lbnRJbmRlbnQsIGxpbmVFbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUud3JpdGUoc3RhdGVtZW50SW5kZW50KTtcbiAgICAgICAgdGhpc1tzdGF0ZW1lbnQudHlwZV0oc3RhdGVtZW50LCBzdGF0ZSk7XG4gICAgICAgIHN0YXRlLndyaXRlKGxpbmVFbmQpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS53cml0ZShpbmRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAod3JpdGVDb21tZW50cyAmJiBub2RlLmNvbW1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgc3RhdGUud3JpdGUobGluZUVuZCk7XG4gICAgICAgIGZvcm1hdENvbW1lbnRzKHN0YXRlLCBub2RlLmNvbW1lbnRzLCBzdGF0ZW1lbnRJbmRlbnQsIGxpbmVFbmQpO1xuICAgICAgICBzdGF0ZS53cml0ZShpbmRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3cml0ZUNvbW1lbnRzICYmIG5vZGUudHJhaWxpbmdDb21tZW50cyAhPSBudWxsKSB7XG4gICAgICBmb3JtYXRDb21tZW50cyhzdGF0ZSwgbm9kZS50cmFpbGluZ0NvbW1lbnRzLCBzdGF0ZW1lbnRJbmRlbnQsIGxpbmVFbmQpO1xuICAgIH1cblxuICAgIHN0YXRlLndyaXRlKCd9Jyk7XG4gICAgc3RhdGUuaW5kZW50TGV2ZWwtLTtcbiAgfSxcbiAgQ2xhc3NCb2R5OiBCbG9ja1N0YXRlbWVudCxcbiAgRW1wdHlTdGF0ZW1lbnQ6IGZ1bmN0aW9uIEVtcHR5U3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJzsnKTtcbiAgfSxcbiAgRXhwcmVzc2lvblN0YXRlbWVudDogZnVuY3Rpb24gRXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgIHZhciBwcmVjZWRlbmNlID0gRVhQUkVTU0lPTlNfUFJFQ0VERU5DRVtub2RlLmV4cHJlc3Npb24udHlwZV07XG5cbiAgICBpZiAocHJlY2VkZW5jZSA9PT0gTkVFRFNfUEFSRU5USEVTRVMgfHwgcHJlY2VkZW5jZSA9PT0gMyAmJiBub2RlLmV4cHJlc3Npb24ubGVmdC50eXBlWzBdID09PSAnTycpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcoJyk7XG4gICAgICB0aGlzW25vZGUuZXhwcmVzc2lvbi50eXBlXShub2RlLmV4cHJlc3Npb24sIHN0YXRlKTtcbiAgICAgIHN0YXRlLndyaXRlKCcpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNbbm9kZS5leHByZXNzaW9uLnR5cGVdKG5vZGUuZXhwcmVzc2lvbiwgc3RhdGUpO1xuICAgIH1cblxuICAgIHN0YXRlLndyaXRlKCc7Jyk7XG4gIH0sXG4gIElmU3RhdGVtZW50OiBmdW5jdGlvbiBJZlN0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgIHN0YXRlLndyaXRlKCdpZiAoJyk7XG4gICAgdGhpc1tub2RlLnRlc3QudHlwZV0obm9kZS50ZXN0LCBzdGF0ZSk7XG4gICAgc3RhdGUud3JpdGUoJykgJyk7XG4gICAgdGhpc1tub2RlLmNvbnNlcXVlbnQudHlwZV0obm9kZS5jb25zZXF1ZW50LCBzdGF0ZSk7XG5cbiAgICBpZiAobm9kZS5hbHRlcm5hdGUgIT0gbnVsbCkge1xuICAgICAgc3RhdGUud3JpdGUoJyBlbHNlICcpO1xuICAgICAgdGhpc1tub2RlLmFsdGVybmF0ZS50eXBlXShub2RlLmFsdGVybmF0ZSwgc3RhdGUpO1xuICAgIH1cbiAgfSxcbiAgTGFiZWxlZFN0YXRlbWVudDogZnVuY3Rpb24gTGFiZWxlZFN0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgIHRoaXNbbm9kZS5sYWJlbC50eXBlXShub2RlLmxhYmVsLCBzdGF0ZSk7XG4gICAgc3RhdGUud3JpdGUoJzogJyk7XG4gICAgdGhpc1tub2RlLmJvZHkudHlwZV0obm9kZS5ib2R5LCBzdGF0ZSk7XG4gIH0sXG4gIEJyZWFrU3RhdGVtZW50OiBmdW5jdGlvbiBCcmVha1N0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgIHN0YXRlLndyaXRlKCdicmVhaycpO1xuXG4gICAgaWYgKG5vZGUubGFiZWwgIT0gbnVsbCkge1xuICAgICAgc3RhdGUud3JpdGUoJyAnKTtcbiAgICAgIHRoaXNbbm9kZS5sYWJlbC50eXBlXShub2RlLmxhYmVsLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgc3RhdGUud3JpdGUoJzsnKTtcbiAgfSxcbiAgQ29udGludWVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRpbnVlU3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ2NvbnRpbnVlJyk7XG5cbiAgICBpZiAobm9kZS5sYWJlbCAhPSBudWxsKSB7XG4gICAgICBzdGF0ZS53cml0ZSgnICcpO1xuICAgICAgdGhpc1tub2RlLmxhYmVsLnR5cGVdKG5vZGUubGFiZWwsIHN0YXRlKTtcbiAgICB9XG5cbiAgICBzdGF0ZS53cml0ZSgnOycpO1xuICB9LFxuICBXaXRoU3RhdGVtZW50OiBmdW5jdGlvbiBXaXRoU3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ3dpdGggKCcpO1xuICAgIHRoaXNbbm9kZS5vYmplY3QudHlwZV0obm9kZS5vYmplY3QsIHN0YXRlKTtcbiAgICBzdGF0ZS53cml0ZSgnKSAnKTtcbiAgICB0aGlzW25vZGUuYm9keS50eXBlXShub2RlLmJvZHksIHN0YXRlKTtcbiAgfSxcbiAgU3dpdGNoU3RhdGVtZW50OiBmdW5jdGlvbiBTd2l0Y2hTdGF0ZW1lbnQobm9kZSwgc3RhdGUpIHtcbiAgICB2YXIgaW5kZW50ID0gc3RhdGUuaW5kZW50LnJlcGVhdChzdGF0ZS5pbmRlbnRMZXZlbCsrKTtcbiAgICB2YXIgbGluZUVuZCA9IHN0YXRlLmxpbmVFbmQsXG4gICAgICAgIHdyaXRlQ29tbWVudHMgPSBzdGF0ZS53cml0ZUNvbW1lbnRzO1xuICAgIHN0YXRlLmluZGVudExldmVsKys7XG4gICAgdmFyIGNhc2VJbmRlbnQgPSBpbmRlbnQgKyBzdGF0ZS5pbmRlbnQ7XG4gICAgdmFyIHN0YXRlbWVudEluZGVudCA9IGNhc2VJbmRlbnQgKyBzdGF0ZS5pbmRlbnQ7XG4gICAgc3RhdGUud3JpdGUoJ3N3aXRjaCAoJyk7XG4gICAgdGhpc1tub2RlLmRpc2NyaW1pbmFudC50eXBlXShub2RlLmRpc2NyaW1pbmFudCwgc3RhdGUpO1xuICAgIHN0YXRlLndyaXRlKCcpIHsnICsgbGluZUVuZCk7XG4gICAgdmFyIG9jY3VyZW5jZXMgPSBub2RlLmNhc2VzO1xuICAgIHZhciBvY2N1cmVuY2VzQ291bnQgPSBvY2N1cmVuY2VzLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2NjdXJlbmNlc0NvdW50OyBpKyspIHtcbiAgICAgIHZhciBvY2N1cmVuY2UgPSBvY2N1cmVuY2VzW2ldO1xuXG4gICAgICBpZiAod3JpdGVDb21tZW50cyAmJiBvY2N1cmVuY2UuY29tbWVudHMgIT0gbnVsbCkge1xuICAgICAgICBmb3JtYXRDb21tZW50cyhzdGF0ZSwgb2NjdXJlbmNlLmNvbW1lbnRzLCBjYXNlSW5kZW50LCBsaW5lRW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9jY3VyZW5jZS50ZXN0KSB7XG4gICAgICAgIHN0YXRlLndyaXRlKGNhc2VJbmRlbnQgKyAnY2FzZSAnKTtcbiAgICAgICAgdGhpc1tvY2N1cmVuY2UudGVzdC50eXBlXShvY2N1cmVuY2UudGVzdCwgc3RhdGUpO1xuICAgICAgICBzdGF0ZS53cml0ZSgnOicgKyBsaW5lRW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLndyaXRlKGNhc2VJbmRlbnQgKyAnZGVmYXVsdDonICsgbGluZUVuZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb25zZXF1ZW50ID0gb2NjdXJlbmNlLmNvbnNlcXVlbnQ7XG4gICAgICB2YXIgY29uc2VxdWVudENvdW50ID0gY29uc2VxdWVudC5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBjb25zZXF1ZW50Q291bnQ7IF9pKyspIHtcbiAgICAgICAgdmFyIHN0YXRlbWVudCA9IGNvbnNlcXVlbnRbX2ldO1xuXG4gICAgICAgIGlmICh3cml0ZUNvbW1lbnRzICYmIHN0YXRlbWVudC5jb21tZW50cyAhPSBudWxsKSB7XG4gICAgICAgICAgZm9ybWF0Q29tbWVudHMoc3RhdGUsIHN0YXRlbWVudC5jb21tZW50cywgc3RhdGVtZW50SW5kZW50LCBsaW5lRW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLndyaXRlKHN0YXRlbWVudEluZGVudCk7XG4gICAgICAgIHRoaXNbc3RhdGVtZW50LnR5cGVdKHN0YXRlbWVudCwgc3RhdGUpO1xuICAgICAgICBzdGF0ZS53cml0ZShsaW5lRW5kKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS5pbmRlbnRMZXZlbCAtPSAyO1xuICAgIHN0YXRlLndyaXRlKGluZGVudCArICd9Jyk7XG4gIH0sXG4gIFJldHVyblN0YXRlbWVudDogZnVuY3Rpb24gUmV0dXJuU3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ3JldHVybicpO1xuXG4gICAgaWYgKG5vZGUuYXJndW1lbnQpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcgJyk7XG4gICAgICB0aGlzW25vZGUuYXJndW1lbnQudHlwZV0obm9kZS5hcmd1bWVudCwgc3RhdGUpO1xuICAgIH1cblxuICAgIHN0YXRlLndyaXRlKCc7Jyk7XG4gIH0sXG4gIFRocm93U3RhdGVtZW50OiBmdW5jdGlvbiBUaHJvd1N0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgIHN0YXRlLndyaXRlKCd0aHJvdyAnKTtcbiAgICB0aGlzW25vZGUuYXJndW1lbnQudHlwZV0obm9kZS5hcmd1bWVudCwgc3RhdGUpO1xuICAgIHN0YXRlLndyaXRlKCc7Jyk7XG4gIH0sXG4gIFRyeVN0YXRlbWVudDogZnVuY3Rpb24gVHJ5U3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ3RyeSAnKTtcbiAgICB0aGlzW25vZGUuYmxvY2sudHlwZV0obm9kZS5ibG9jaywgc3RhdGUpO1xuXG4gICAgaWYgKG5vZGUuaGFuZGxlcikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBub2RlLmhhbmRsZXI7XG5cbiAgICAgIGlmIChoYW5kbGVyLnBhcmFtID09IG51bGwpIHtcbiAgICAgICAgc3RhdGUud3JpdGUoJyBjYXRjaCAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLndyaXRlKCcgY2F0Y2ggKCcpO1xuICAgICAgICB0aGlzW2hhbmRsZXIucGFyYW0udHlwZV0oaGFuZGxlci5wYXJhbSwgc3RhdGUpO1xuICAgICAgICBzdGF0ZS53cml0ZSgnKSAnKTtcbiAgICAgIH1cblxuICAgICAgdGhpc1toYW5kbGVyLmJvZHkudHlwZV0oaGFuZGxlci5ib2R5LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuZmluYWxpemVyKSB7XG4gICAgICBzdGF0ZS53cml0ZSgnIGZpbmFsbHkgJyk7XG4gICAgICB0aGlzW25vZGUuZmluYWxpemVyLnR5cGVdKG5vZGUuZmluYWxpemVyLCBzdGF0ZSk7XG4gICAgfVxuICB9LFxuICBXaGlsZVN0YXRlbWVudDogZnVuY3Rpb24gV2hpbGVTdGF0ZW1lbnQobm9kZSwgc3RhdGUpIHtcbiAgICBzdGF0ZS53cml0ZSgnd2hpbGUgKCcpO1xuICAgIHRoaXNbbm9kZS50ZXN0LnR5cGVdKG5vZGUudGVzdCwgc3RhdGUpO1xuICAgIHN0YXRlLndyaXRlKCcpICcpO1xuICAgIHRoaXNbbm9kZS5ib2R5LnR5cGVdKG5vZGUuYm9keSwgc3RhdGUpO1xuICB9LFxuICBEb1doaWxlU3RhdGVtZW50OiBmdW5jdGlvbiBEb1doaWxlU3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ2RvICcpO1xuICAgIHRoaXNbbm9kZS5ib2R5LnR5cGVdKG5vZGUuYm9keSwgc3RhdGUpO1xuICAgIHN0YXRlLndyaXRlKCcgd2hpbGUgKCcpO1xuICAgIHRoaXNbbm9kZS50ZXN0LnR5cGVdKG5vZGUudGVzdCwgc3RhdGUpO1xuICAgIHN0YXRlLndyaXRlKCcpOycpO1xuICB9LFxuICBGb3JTdGF0ZW1lbnQ6IGZ1bmN0aW9uIEZvclN0YXRlbWVudChub2RlLCBzdGF0ZSkge1xuICAgIHN0YXRlLndyaXRlKCdmb3IgKCcpO1xuXG4gICAgaWYgKG5vZGUuaW5pdCAhPSBudWxsKSB7XG4gICAgICB2YXIgaW5pdCA9IG5vZGUuaW5pdDtcblxuICAgICAgaWYgKGluaXQudHlwZVswXSA9PT0gJ1YnKSB7XG4gICAgICAgIGZvcm1hdFZhcmlhYmxlRGVjbGFyYXRpb24oc3RhdGUsIGluaXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tpbml0LnR5cGVdKGluaXQsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS53cml0ZSgnOyAnKTtcblxuICAgIGlmIChub2RlLnRlc3QpIHtcbiAgICAgIHRoaXNbbm9kZS50ZXN0LnR5cGVdKG5vZGUudGVzdCwgc3RhdGUpO1xuICAgIH1cblxuICAgIHN0YXRlLndyaXRlKCc7ICcpO1xuXG4gICAgaWYgKG5vZGUudXBkYXRlKSB7XG4gICAgICB0aGlzW25vZGUudXBkYXRlLnR5cGVdKG5vZGUudXBkYXRlLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgc3RhdGUud3JpdGUoJykgJyk7XG4gICAgdGhpc1tub2RlLmJvZHkudHlwZV0obm9kZS5ib2R5LCBzdGF0ZSk7XG4gIH0sXG4gIEZvckluU3RhdGVtZW50OiBGb3JJblN0YXRlbWVudCA9IGZ1bmN0aW9uIEZvckluU3RhdGVtZW50KG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoXCJmb3IgXCIuY29uY2F0KG5vZGUuYXdhaXQgPyAnYXdhaXQgJyA6ICcnLCBcIihcIikpO1xuICAgIHZhciBsZWZ0ID0gbm9kZS5sZWZ0O1xuXG4gICAgaWYgKGxlZnQudHlwZVswXSA9PT0gJ1YnKSB7XG4gICAgICBmb3JtYXRWYXJpYWJsZURlY2xhcmF0aW9uKHN0YXRlLCBsZWZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1tsZWZ0LnR5cGVdKGxlZnQsIHN0YXRlKTtcbiAgICB9XG5cbiAgICBzdGF0ZS53cml0ZShub2RlLnR5cGVbM10gPT09ICdJJyA/ICcgaW4gJyA6ICcgb2YgJyk7XG4gICAgdGhpc1tub2RlLnJpZ2h0LnR5cGVdKG5vZGUucmlnaHQsIHN0YXRlKTtcbiAgICBzdGF0ZS53cml0ZSgnKSAnKTtcbiAgICB0aGlzW25vZGUuYm9keS50eXBlXShub2RlLmJvZHksIHN0YXRlKTtcbiAgfSxcbiAgRm9yT2ZTdGF0ZW1lbnQ6IEZvckluU3RhdGVtZW50LFxuICBEZWJ1Z2dlclN0YXRlbWVudDogZnVuY3Rpb24gRGVidWdnZXJTdGF0ZW1lbnQobm9kZSwgc3RhdGUpIHtcbiAgICBzdGF0ZS53cml0ZSgnZGVidWdnZXI7JyArIHN0YXRlLmxpbmVFbmQpO1xuICB9LFxuICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBGdW5jdGlvbkRlY2xhcmF0aW9uID0gZnVuY3Rpb24gRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlLCBzdGF0ZSkge1xuICAgIHN0YXRlLndyaXRlKChub2RlLmFzeW5jID8gJ2FzeW5jICcgOiAnJykgKyAobm9kZS5nZW5lcmF0b3IgPyAnZnVuY3Rpb24qICcgOiAnZnVuY3Rpb24gJykgKyAobm9kZS5pZCA/IG5vZGUuaWQubmFtZSA6ICcnKSwgbm9kZSk7XG4gICAgZm9ybWF0U2VxdWVuY2Uoc3RhdGUsIG5vZGUucGFyYW1zKTtcbiAgICBzdGF0ZS53cml0ZSgnICcpO1xuICAgIHRoaXNbbm9kZS5ib2R5LnR5cGVdKG5vZGUuYm9keSwgc3RhdGUpO1xuICB9LFxuICBGdW5jdGlvbkV4cHJlc3Npb246IEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIFZhcmlhYmxlRGVjbGFyYXRpb246IGZ1bmN0aW9uIFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSwgc3RhdGUpIHtcbiAgICBmb3JtYXRWYXJpYWJsZURlY2xhcmF0aW9uKHN0YXRlLCBub2RlKTtcbiAgICBzdGF0ZS53cml0ZSgnOycpO1xuICB9LFxuICBWYXJpYWJsZURlY2xhcmF0b3I6IGZ1bmN0aW9uIFZhcmlhYmxlRGVjbGFyYXRvcihub2RlLCBzdGF0ZSkge1xuICAgIHRoaXNbbm9kZS5pZC50eXBlXShub2RlLmlkLCBzdGF0ZSk7XG5cbiAgICBpZiAobm9kZS5pbml0ICE9IG51bGwpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcgPSAnKTtcbiAgICAgIHRoaXNbbm9kZS5pbml0LnR5cGVdKG5vZGUuaW5pdCwgc3RhdGUpO1xuICAgIH1cbiAgfSxcbiAgQ2xhc3NEZWNsYXJhdGlvbjogZnVuY3Rpb24gQ2xhc3NEZWNsYXJhdGlvbihub2RlLCBzdGF0ZSkge1xuICAgIHN0YXRlLndyaXRlKCdjbGFzcyAnICsgKG5vZGUuaWQgPyBcIlwiLmNvbmNhdChub2RlLmlkLm5hbWUsIFwiIFwiKSA6ICcnKSwgbm9kZSk7XG5cbiAgICBpZiAobm9kZS5zdXBlckNsYXNzKSB7XG4gICAgICBzdGF0ZS53cml0ZSgnZXh0ZW5kcyAnKTtcbiAgICAgIHRoaXNbbm9kZS5zdXBlckNsYXNzLnR5cGVdKG5vZGUuc3VwZXJDbGFzcywgc3RhdGUpO1xuICAgICAgc3RhdGUud3JpdGUoJyAnKTtcbiAgICB9XG5cbiAgICB0aGlzLkNsYXNzQm9keShub2RlLmJvZHksIHN0YXRlKTtcbiAgfSxcbiAgSW1wb3J0RGVjbGFyYXRpb246IGZ1bmN0aW9uIEltcG9ydERlY2xhcmF0aW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ2ltcG9ydCAnKTtcbiAgICB2YXIgc3BlY2lmaWVycyA9IG5vZGUuc3BlY2lmaWVycztcbiAgICB2YXIgbGVuZ3RoID0gc3BlY2lmaWVycy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgaWYgKGxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOykge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBzdGF0ZS53cml0ZSgnLCAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzcGVjaWZpZXIgPSBzcGVjaWZpZXJzW2ldO1xuICAgICAgICB2YXIgdHlwZSA9IHNwZWNpZmllci50eXBlWzZdO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnRCcpIHtcbiAgICAgICAgICBzdGF0ZS53cml0ZShzcGVjaWZpZXIubG9jYWwubmFtZSwgc3BlY2lmaWVyKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ04nKSB7XG4gICAgICAgICAgc3RhdGUud3JpdGUoJyogYXMgJyArIHNwZWNpZmllci5sb2NhbC5uYW1lLCBzcGVjaWZpZXIpO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICBzdGF0ZS53cml0ZSgneycpO1xuXG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICB2YXIgX3NwZWNpZmllciA9IHNwZWNpZmllcnNbaV07XG4gICAgICAgICAgdmFyIG5hbWUgPSBfc3BlY2lmaWVyLmltcG9ydGVkLm5hbWU7XG4gICAgICAgICAgc3RhdGUud3JpdGUobmFtZSwgX3NwZWNpZmllcik7XG5cbiAgICAgICAgICBpZiAobmFtZSAhPT0gX3NwZWNpZmllci5sb2NhbC5uYW1lKSB7XG4gICAgICAgICAgICBzdGF0ZS53cml0ZSgnIGFzICcgKyBfc3BlY2lmaWVyLmxvY2FsLm5hbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgrK2kgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIHN0YXRlLndyaXRlKCcsICcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS53cml0ZSgnfScpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS53cml0ZSgnIGZyb20gJyk7XG4gICAgfVxuXG4gICAgdGhpcy5MaXRlcmFsKG5vZGUuc291cmNlLCBzdGF0ZSk7XG4gICAgc3RhdGUud3JpdGUoJzsnKTtcbiAgfSxcbiAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uOiBmdW5jdGlvbiBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24obm9kZSwgc3RhdGUpIHtcbiAgICBzdGF0ZS53cml0ZSgnZXhwb3J0IGRlZmF1bHQgJyk7XG4gICAgdGhpc1tub2RlLmRlY2xhcmF0aW9uLnR5cGVdKG5vZGUuZGVjbGFyYXRpb24sIHN0YXRlKTtcblxuICAgIGlmIChFWFBSRVNTSU9OU19QUkVDRURFTkNFW25vZGUuZGVjbGFyYXRpb24udHlwZV0gJiYgbm9kZS5kZWNsYXJhdGlvbi50eXBlWzBdICE9PSAnRicpIHtcbiAgICAgIHN0YXRlLndyaXRlKCc7Jyk7XG4gICAgfVxuICB9LFxuICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiBmdW5jdGlvbiBFeHBvcnROYW1lZERlY2xhcmF0aW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ2V4cG9ydCAnKTtcblxuICAgIGlmIChub2RlLmRlY2xhcmF0aW9uKSB7XG4gICAgICB0aGlzW25vZGUuZGVjbGFyYXRpb24udHlwZV0obm9kZS5kZWNsYXJhdGlvbiwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS53cml0ZSgneycpO1xuICAgICAgdmFyIHNwZWNpZmllcnMgPSBub2RlLnNwZWNpZmllcnMsXG4gICAgICAgICAgbGVuZ3RoID0gc3BlY2lmaWVycy5sZW5ndGg7XG5cbiAgICAgIGlmIChsZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOzspIHtcbiAgICAgICAgICB2YXIgc3BlY2lmaWVyID0gc3BlY2lmaWVyc1tpXTtcbiAgICAgICAgICB2YXIgbmFtZSA9IHNwZWNpZmllci5sb2NhbC5uYW1lO1xuICAgICAgICAgIHN0YXRlLndyaXRlKG5hbWUsIHNwZWNpZmllcik7XG5cbiAgICAgICAgICBpZiAobmFtZSAhPT0gc3BlY2lmaWVyLmV4cG9ydGVkLm5hbWUpIHtcbiAgICAgICAgICAgIHN0YXRlLndyaXRlKCcgYXMgJyArIHNwZWNpZmllci5leHBvcnRlZC5uYW1lKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoKytpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBzdGF0ZS53cml0ZSgnLCAnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLndyaXRlKCd9Jyk7XG5cbiAgICAgIGlmIChub2RlLnNvdXJjZSkge1xuICAgICAgICBzdGF0ZS53cml0ZSgnIGZyb20gJyk7XG4gICAgICAgIHRoaXMuTGl0ZXJhbChub2RlLnNvdXJjZSwgc3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS53cml0ZSgnOycpO1xuICAgIH1cbiAgfSxcbiAgRXhwb3J0QWxsRGVjbGFyYXRpb246IGZ1bmN0aW9uIEV4cG9ydEFsbERlY2xhcmF0aW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ2V4cG9ydCAqIGZyb20gJyk7XG4gICAgdGhpcy5MaXRlcmFsKG5vZGUuc291cmNlLCBzdGF0ZSk7XG4gICAgc3RhdGUud3JpdGUoJzsnKTtcbiAgfSxcbiAgTWV0aG9kRGVmaW5pdGlvbjogZnVuY3Rpb24gTWV0aG9kRGVmaW5pdGlvbihub2RlLCBzdGF0ZSkge1xuICAgIGlmIChub2RlLnN0YXRpYykge1xuICAgICAgc3RhdGUud3JpdGUoJ3N0YXRpYyAnKTtcbiAgICB9XG5cbiAgICB2YXIga2luZCA9IG5vZGUua2luZFswXTtcblxuICAgIGlmIChraW5kID09PSAnZycgfHwga2luZCA9PT0gJ3MnKSB7XG4gICAgICBzdGF0ZS53cml0ZShub2RlLmtpbmQgKyAnICcpO1xuICAgIH1cblxuICAgIGlmIChub2RlLnZhbHVlLmFzeW5jKSB7XG4gICAgICBzdGF0ZS53cml0ZSgnYXN5bmMgJyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudmFsdWUuZ2VuZXJhdG9yKSB7XG4gICAgICBzdGF0ZS53cml0ZSgnKicpO1xuICAgIH1cblxuICAgIGlmIChub2RlLmNvbXB1dGVkKSB7XG4gICAgICBzdGF0ZS53cml0ZSgnWycpO1xuICAgICAgdGhpc1tub2RlLmtleS50eXBlXShub2RlLmtleSwgc3RhdGUpO1xuICAgICAgc3RhdGUud3JpdGUoJ10nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1tub2RlLmtleS50eXBlXShub2RlLmtleSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGZvcm1hdFNlcXVlbmNlKHN0YXRlLCBub2RlLnZhbHVlLnBhcmFtcyk7XG4gICAgc3RhdGUud3JpdGUoJyAnKTtcbiAgICB0aGlzW25vZGUudmFsdWUuYm9keS50eXBlXShub2RlLnZhbHVlLmJvZHksIHN0YXRlKTtcbiAgfSxcbiAgQ2xhc3NFeHByZXNzaW9uOiBmdW5jdGlvbiBDbGFzc0V4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICB0aGlzLkNsYXNzRGVjbGFyYXRpb24obm9kZSwgc3RhdGUpO1xuICB9LFxuICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICBzdGF0ZS53cml0ZShub2RlLmFzeW5jID8gJ2FzeW5jICcgOiAnJywgbm9kZSk7XG4gICAgdmFyIHBhcmFtcyA9IG5vZGUucGFyYW1zO1xuXG4gICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7XG4gICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMSAmJiBwYXJhbXNbMF0udHlwZVswXSA9PT0gJ0knKSB7XG4gICAgICAgIHN0YXRlLndyaXRlKHBhcmFtc1swXS5uYW1lLCBwYXJhbXNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybWF0U2VxdWVuY2Uoc3RhdGUsIG5vZGUucGFyYW1zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS53cml0ZSgnID0+ICcpO1xuXG4gICAgaWYgKG5vZGUuYm9keS50eXBlWzBdID09PSAnTycpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcoJyk7XG4gICAgICB0aGlzLk9iamVjdEV4cHJlc3Npb24obm9kZS5ib2R5LCBzdGF0ZSk7XG4gICAgICBzdGF0ZS53cml0ZSgnKScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW25vZGUuYm9keS50eXBlXShub2RlLmJvZHksIHN0YXRlKTtcbiAgICB9XG4gIH0sXG4gIFRoaXNFeHByZXNzaW9uOiBmdW5jdGlvbiBUaGlzRXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgIHN0YXRlLndyaXRlKCd0aGlzJywgbm9kZSk7XG4gIH0sXG4gIFN1cGVyOiBmdW5jdGlvbiBTdXBlcihub2RlLCBzdGF0ZSkge1xuICAgIHN0YXRlLndyaXRlKCdzdXBlcicsIG5vZGUpO1xuICB9LFxuICBSZXN0RWxlbWVudDogUmVzdEVsZW1lbnQgPSBmdW5jdGlvbiBSZXN0RWxlbWVudChub2RlLCBzdGF0ZSkge1xuICAgIHN0YXRlLndyaXRlKCcuLi4nKTtcbiAgICB0aGlzW25vZGUuYXJndW1lbnQudHlwZV0obm9kZS5hcmd1bWVudCwgc3RhdGUpO1xuICB9LFxuICBTcHJlYWRFbGVtZW50OiBSZXN0RWxlbWVudCxcbiAgWWllbGRFeHByZXNzaW9uOiBmdW5jdGlvbiBZaWVsZEV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICBzdGF0ZS53cml0ZShub2RlLmRlbGVnYXRlID8gJ3lpZWxkKicgOiAneWllbGQnKTtcblxuICAgIGlmIChub2RlLmFyZ3VtZW50KSB7XG4gICAgICBzdGF0ZS53cml0ZSgnICcpO1xuICAgICAgdGhpc1tub2RlLmFyZ3VtZW50LnR5cGVdKG5vZGUuYXJndW1lbnQsIHN0YXRlKTtcbiAgICB9XG4gIH0sXG4gIEF3YWl0RXhwcmVzc2lvbjogZnVuY3Rpb24gQXdhaXRFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ2F3YWl0ICcpO1xuXG4gICAgaWYgKG5vZGUuYXJndW1lbnQpIHtcbiAgICAgIHRoaXNbbm9kZS5hcmd1bWVudC50eXBlXShub2RlLmFyZ3VtZW50LCBzdGF0ZSk7XG4gICAgfVxuICB9LFxuICBUZW1wbGF0ZUxpdGVyYWw6IGZ1bmN0aW9uIFRlbXBsYXRlTGl0ZXJhbChub2RlLCBzdGF0ZSkge1xuICAgIHZhciBxdWFzaXMgPSBub2RlLnF1YXNpcyxcbiAgICAgICAgZXhwcmVzc2lvbnMgPSBub2RlLmV4cHJlc3Npb25zO1xuICAgIHN0YXRlLndyaXRlKCdgJyk7XG4gICAgdmFyIGxlbmd0aCA9IGV4cHJlc3Npb25zLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBleHByZXNzaW9uID0gZXhwcmVzc2lvbnNbaV07XG4gICAgICBzdGF0ZS53cml0ZShxdWFzaXNbaV0udmFsdWUucmF3KTtcbiAgICAgIHN0YXRlLndyaXRlKCckeycpO1xuICAgICAgdGhpc1tleHByZXNzaW9uLnR5cGVdKGV4cHJlc3Npb24sIHN0YXRlKTtcbiAgICAgIHN0YXRlLndyaXRlKCd9Jyk7XG4gICAgfVxuXG4gICAgc3RhdGUud3JpdGUocXVhc2lzW3F1YXNpcy5sZW5ndGggLSAxXS52YWx1ZS5yYXcpO1xuICAgIHN0YXRlLndyaXRlKCdgJyk7XG4gIH0sXG4gIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbjogZnVuY3Rpb24gVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgdGhpc1tub2RlLnRhZy50eXBlXShub2RlLnRhZywgc3RhdGUpO1xuICAgIHRoaXNbbm9kZS5xdWFzaS50eXBlXShub2RlLnF1YXNpLCBzdGF0ZSk7XG4gIH0sXG4gIEFycmF5RXhwcmVzc2lvbjogQXJyYXlFeHByZXNzaW9uID0gZnVuY3Rpb24gQXJyYXlFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ1snKTtcblxuICAgIGlmIChub2RlLmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBlbGVtZW50cyA9IG5vZGUuZWxlbWVudHMsXG4gICAgICAgICAgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDs7KSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07XG5cbiAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXNbZWxlbWVudC50eXBlXShlbGVtZW50LCBzdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKytpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgc3RhdGUud3JpdGUoJywgJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUud3JpdGUoJywgJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS53cml0ZSgnXScpO1xuICB9LFxuICBBcnJheVBhdHRlcm46IEFycmF5RXhwcmVzc2lvbixcbiAgT2JqZWN0RXhwcmVzc2lvbjogZnVuY3Rpb24gT2JqZWN0RXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgIHZhciBpbmRlbnQgPSBzdGF0ZS5pbmRlbnQucmVwZWF0KHN0YXRlLmluZGVudExldmVsKyspO1xuICAgIHZhciBsaW5lRW5kID0gc3RhdGUubGluZUVuZCxcbiAgICAgICAgd3JpdGVDb21tZW50cyA9IHN0YXRlLndyaXRlQ29tbWVudHM7XG4gICAgdmFyIHByb3BlcnR5SW5kZW50ID0gaW5kZW50ICsgc3RhdGUuaW5kZW50O1xuICAgIHN0YXRlLndyaXRlKCd7Jyk7XG5cbiAgICBpZiAobm9kZS5wcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0YXRlLndyaXRlKGxpbmVFbmQpO1xuXG4gICAgICBpZiAod3JpdGVDb21tZW50cyAmJiBub2RlLmNvbW1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgZm9ybWF0Q29tbWVudHMoc3RhdGUsIG5vZGUuY29tbWVudHMsIHByb3BlcnR5SW5kZW50LCBsaW5lRW5kKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbW1hID0gJywnICsgbGluZUVuZDtcbiAgICAgIHZhciBwcm9wZXJ0aWVzID0gbm9kZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDs7KSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07XG5cbiAgICAgICAgaWYgKHdyaXRlQ29tbWVudHMgJiYgcHJvcGVydHkuY29tbWVudHMgIT0gbnVsbCkge1xuICAgICAgICAgIGZvcm1hdENvbW1lbnRzKHN0YXRlLCBwcm9wZXJ0eS5jb21tZW50cywgcHJvcGVydHlJbmRlbnQsIGxpbmVFbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUud3JpdGUocHJvcGVydHlJbmRlbnQpO1xuICAgICAgICB0aGlzW3Byb3BlcnR5LnR5cGVdKHByb3BlcnR5LCBzdGF0ZSk7XG5cbiAgICAgICAgaWYgKCsraSA8IGxlbmd0aCkge1xuICAgICAgICAgIHN0YXRlLndyaXRlKGNvbW1hKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGF0ZS53cml0ZShsaW5lRW5kKTtcblxuICAgICAgaWYgKHdyaXRlQ29tbWVudHMgJiYgbm9kZS50cmFpbGluZ0NvbW1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgZm9ybWF0Q29tbWVudHMoc3RhdGUsIG5vZGUudHJhaWxpbmdDb21tZW50cywgcHJvcGVydHlJbmRlbnQsIGxpbmVFbmQpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS53cml0ZShpbmRlbnQgKyAnfScpO1xuICAgIH0gZWxzZSBpZiAod3JpdGVDb21tZW50cykge1xuICAgICAgaWYgKG5vZGUuY29tbWVudHMgIT0gbnVsbCkge1xuICAgICAgICBzdGF0ZS53cml0ZShsaW5lRW5kKTtcbiAgICAgICAgZm9ybWF0Q29tbWVudHMoc3RhdGUsIG5vZGUuY29tbWVudHMsIHByb3BlcnR5SW5kZW50LCBsaW5lRW5kKTtcblxuICAgICAgICBpZiAobm9kZS50cmFpbGluZ0NvbW1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgICBmb3JtYXRDb21tZW50cyhzdGF0ZSwgbm9kZS50cmFpbGluZ0NvbW1lbnRzLCBwcm9wZXJ0eUluZGVudCwgbGluZUVuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS53cml0ZShpbmRlbnQgKyAnfScpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRyYWlsaW5nQ29tbWVudHMgIT0gbnVsbCkge1xuICAgICAgICBzdGF0ZS53cml0ZShsaW5lRW5kKTtcbiAgICAgICAgZm9ybWF0Q29tbWVudHMoc3RhdGUsIG5vZGUudHJhaWxpbmdDb21tZW50cywgcHJvcGVydHlJbmRlbnQsIGxpbmVFbmQpO1xuICAgICAgICBzdGF0ZS53cml0ZShpbmRlbnQgKyAnfScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUud3JpdGUoJ30nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUud3JpdGUoJ30nKTtcbiAgICB9XG5cbiAgICBzdGF0ZS5pbmRlbnRMZXZlbC0tO1xuICB9LFxuICBQcm9wZXJ0eTogZnVuY3Rpb24gUHJvcGVydHkobm9kZSwgc3RhdGUpIHtcbiAgICBpZiAobm9kZS5tZXRob2QgfHwgbm9kZS5raW5kWzBdICE9PSAnaScpIHtcbiAgICAgIHRoaXMuTWV0aG9kRGVmaW5pdGlvbihub2RlLCBzdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghbm9kZS5zaG9ydGhhbmQpIHtcbiAgICAgICAgaWYgKG5vZGUuY29tcHV0ZWQpIHtcbiAgICAgICAgICBzdGF0ZS53cml0ZSgnWycpO1xuICAgICAgICAgIHRoaXNbbm9kZS5rZXkudHlwZV0obm9kZS5rZXksIHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZS53cml0ZSgnXScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXNbbm9kZS5rZXkudHlwZV0obm9kZS5rZXksIHN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLndyaXRlKCc6ICcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzW25vZGUudmFsdWUudHlwZV0obm9kZS52YWx1ZSwgc3RhdGUpO1xuICAgIH1cbiAgfSxcbiAgT2JqZWN0UGF0dGVybjogZnVuY3Rpb24gT2JqZWN0UGF0dGVybihub2RlLCBzdGF0ZSkge1xuICAgIHN0YXRlLndyaXRlKCd7Jyk7XG5cbiAgICBpZiAobm9kZS5wcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBwcm9wZXJ0aWVzID0gbm9kZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDs7KSB7XG4gICAgICAgIHRoaXNbcHJvcGVydGllc1tpXS50eXBlXShwcm9wZXJ0aWVzW2ldLCBzdGF0ZSk7XG5cbiAgICAgICAgaWYgKCsraSA8IGxlbmd0aCkge1xuICAgICAgICAgIHN0YXRlLndyaXRlKCcsICcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGUud3JpdGUoJ30nKTtcbiAgfSxcbiAgU2VxdWVuY2VFeHByZXNzaW9uOiBmdW5jdGlvbiBTZXF1ZW5jZUV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICBmb3JtYXRTZXF1ZW5jZShzdGF0ZSwgbm9kZS5leHByZXNzaW9ucyk7XG4gIH0sXG4gIFVuYXJ5RXhwcmVzc2lvbjogZnVuY3Rpb24gVW5hcnlFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgaWYgKG5vZGUucHJlZml4KSB7XG4gICAgICBzdGF0ZS53cml0ZShub2RlLm9wZXJhdG9yKTtcblxuICAgICAgaWYgKG5vZGUub3BlcmF0b3IubGVuZ3RoID4gMSkge1xuICAgICAgICBzdGF0ZS53cml0ZSgnICcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoRVhQUkVTU0lPTlNfUFJFQ0VERU5DRVtub2RlLmFyZ3VtZW50LnR5cGVdIDwgRVhQUkVTU0lPTlNfUFJFQ0VERU5DRS5VbmFyeUV4cHJlc3Npb24pIHtcbiAgICAgICAgc3RhdGUud3JpdGUoJygnKTtcbiAgICAgICAgdGhpc1tub2RlLmFyZ3VtZW50LnR5cGVdKG5vZGUuYXJndW1lbnQsIHN0YXRlKTtcbiAgICAgICAgc3RhdGUud3JpdGUoJyknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbbm9kZS5hcmd1bWVudC50eXBlXShub2RlLmFyZ3VtZW50LCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNbbm9kZS5hcmd1bWVudC50eXBlXShub2RlLmFyZ3VtZW50LCBzdGF0ZSk7XG4gICAgICBzdGF0ZS53cml0ZShub2RlLm9wZXJhdG9yKTtcbiAgICB9XG4gIH0sXG4gIFVwZGF0ZUV4cHJlc3Npb246IGZ1bmN0aW9uIFVwZGF0ZUV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICBpZiAobm9kZS5wcmVmaXgpIHtcbiAgICAgIHN0YXRlLndyaXRlKG5vZGUub3BlcmF0b3IpO1xuICAgICAgdGhpc1tub2RlLmFyZ3VtZW50LnR5cGVdKG5vZGUuYXJndW1lbnQsIHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1tub2RlLmFyZ3VtZW50LnR5cGVdKG5vZGUuYXJndW1lbnQsIHN0YXRlKTtcbiAgICAgIHN0YXRlLndyaXRlKG5vZGUub3BlcmF0b3IpO1xuICAgIH1cbiAgfSxcbiAgQXNzaWdubWVudEV4cHJlc3Npb246IGZ1bmN0aW9uIEFzc2lnbm1lbnRFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgdGhpc1tub2RlLmxlZnQudHlwZV0obm9kZS5sZWZ0LCBzdGF0ZSk7XG4gICAgc3RhdGUud3JpdGUoJyAnICsgbm9kZS5vcGVyYXRvciArICcgJyk7XG4gICAgdGhpc1tub2RlLnJpZ2h0LnR5cGVdKG5vZGUucmlnaHQsIHN0YXRlKTtcbiAgfSxcbiAgQXNzaWdubWVudFBhdHRlcm46IGZ1bmN0aW9uIEFzc2lnbm1lbnRQYXR0ZXJuKG5vZGUsIHN0YXRlKSB7XG4gICAgdGhpc1tub2RlLmxlZnQudHlwZV0obm9kZS5sZWZ0LCBzdGF0ZSk7XG4gICAgc3RhdGUud3JpdGUoJyA9ICcpO1xuICAgIHRoaXNbbm9kZS5yaWdodC50eXBlXShub2RlLnJpZ2h0LCBzdGF0ZSk7XG4gIH0sXG4gIEJpbmFyeUV4cHJlc3Npb246IEJpbmFyeUV4cHJlc3Npb24gPSBmdW5jdGlvbiBCaW5hcnlFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgaWYgKG5vZGUub3BlcmF0b3IgPT09ICdpbicpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcoJyk7XG4gICAgICBmb3JtYXRCaW5hcnlFeHByZXNzaW9uUGFydChzdGF0ZSwgbm9kZS5sZWZ0LCBub2RlLCBmYWxzZSk7XG4gICAgICBzdGF0ZS53cml0ZSgnICcgKyBub2RlLm9wZXJhdG9yICsgJyAnKTtcbiAgICAgIGZvcm1hdEJpbmFyeUV4cHJlc3Npb25QYXJ0KHN0YXRlLCBub2RlLnJpZ2h0LCBub2RlLCB0cnVlKTtcbiAgICAgIHN0YXRlLndyaXRlKCcpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1hdEJpbmFyeUV4cHJlc3Npb25QYXJ0KHN0YXRlLCBub2RlLmxlZnQsIG5vZGUsIGZhbHNlKTtcbiAgICAgIHN0YXRlLndyaXRlKCcgJyArIG5vZGUub3BlcmF0b3IgKyAnICcpO1xuICAgICAgZm9ybWF0QmluYXJ5RXhwcmVzc2lvblBhcnQoc3RhdGUsIG5vZGUucmlnaHQsIG5vZGUsIHRydWUpO1xuICAgIH1cbiAgfSxcbiAgTG9naWNhbEV4cHJlc3Npb246IEJpbmFyeUV4cHJlc3Npb24sXG4gIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogZnVuY3Rpb24gQ29uZGl0aW9uYWxFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgaWYgKEVYUFJFU1NJT05TX1BSRUNFREVOQ0Vbbm9kZS50ZXN0LnR5cGVdID4gRVhQUkVTU0lPTlNfUFJFQ0VERU5DRS5Db25kaXRpb25hbEV4cHJlc3Npb24pIHtcbiAgICAgIHRoaXNbbm9kZS50ZXN0LnR5cGVdKG5vZGUudGVzdCwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS53cml0ZSgnKCcpO1xuICAgICAgdGhpc1tub2RlLnRlc3QudHlwZV0obm9kZS50ZXN0LCBzdGF0ZSk7XG4gICAgICBzdGF0ZS53cml0ZSgnKScpO1xuICAgIH1cblxuICAgIHN0YXRlLndyaXRlKCcgPyAnKTtcbiAgICB0aGlzW25vZGUuY29uc2VxdWVudC50eXBlXShub2RlLmNvbnNlcXVlbnQsIHN0YXRlKTtcbiAgICBzdGF0ZS53cml0ZSgnIDogJyk7XG4gICAgdGhpc1tub2RlLmFsdGVybmF0ZS50eXBlXShub2RlLmFsdGVybmF0ZSwgc3RhdGUpO1xuICB9LFxuICBOZXdFeHByZXNzaW9uOiBmdW5jdGlvbiBOZXdFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUoJ25ldyAnKTtcblxuICAgIGlmIChFWFBSRVNTSU9OU19QUkVDRURFTkNFW25vZGUuY2FsbGVlLnR5cGVdIDwgRVhQUkVTU0lPTlNfUFJFQ0VERU5DRS5DYWxsRXhwcmVzc2lvbiB8fCBoYXNDYWxsRXhwcmVzc2lvbihub2RlLmNhbGxlZSkpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcoJyk7XG4gICAgICB0aGlzW25vZGUuY2FsbGVlLnR5cGVdKG5vZGUuY2FsbGVlLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS53cml0ZSgnKScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW25vZGUuY2FsbGVlLnR5cGVdKG5vZGUuY2FsbGVlLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0U2VxdWVuY2Uoc3RhdGUsIG5vZGVbJ2FyZ3VtZW50cyddKTtcbiAgfSxcbiAgQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIENhbGxFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgaWYgKEVYUFJFU1NJT05TX1BSRUNFREVOQ0Vbbm9kZS5jYWxsZWUudHlwZV0gPCBFWFBSRVNTSU9OU19QUkVDRURFTkNFLkNhbGxFeHByZXNzaW9uKSB7XG4gICAgICBzdGF0ZS53cml0ZSgnKCcpO1xuICAgICAgdGhpc1tub2RlLmNhbGxlZS50eXBlXShub2RlLmNhbGxlZSwgc3RhdGUpO1xuICAgICAgc3RhdGUud3JpdGUoJyknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1tub2RlLmNhbGxlZS50eXBlXShub2RlLmNhbGxlZSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGZvcm1hdFNlcXVlbmNlKHN0YXRlLCBub2RlWydhcmd1bWVudHMnXSk7XG4gIH0sXG4gIE1lbWJlckV4cHJlc3Npb246IGZ1bmN0aW9uIE1lbWJlckV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICBpZiAoRVhQUkVTU0lPTlNfUFJFQ0VERU5DRVtub2RlLm9iamVjdC50eXBlXSA8IEVYUFJFU1NJT05TX1BSRUNFREVOQ0UuTWVtYmVyRXhwcmVzc2lvbikge1xuICAgICAgc3RhdGUud3JpdGUoJygnKTtcbiAgICAgIHRoaXNbbm9kZS5vYmplY3QudHlwZV0obm9kZS5vYmplY3QsIHN0YXRlKTtcbiAgICAgIHN0YXRlLndyaXRlKCcpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNbbm9kZS5vYmplY3QudHlwZV0obm9kZS5vYmplY3QsIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5jb21wdXRlZCkge1xuICAgICAgc3RhdGUud3JpdGUoJ1snKTtcbiAgICAgIHRoaXNbbm9kZS5wcm9wZXJ0eS50eXBlXShub2RlLnByb3BlcnR5LCBzdGF0ZSk7XG4gICAgICBzdGF0ZS53cml0ZSgnXScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS53cml0ZSgnLicpO1xuICAgICAgdGhpc1tub2RlLnByb3BlcnR5LnR5cGVdKG5vZGUucHJvcGVydHksIHN0YXRlKTtcbiAgICB9XG4gIH0sXG4gIE1ldGFQcm9wZXJ0eTogZnVuY3Rpb24gTWV0YVByb3BlcnR5KG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUobm9kZS5tZXRhLm5hbWUgKyAnLicgKyBub2RlLnByb3BlcnR5Lm5hbWUsIG5vZGUpO1xuICB9LFxuICBJZGVudGlmaWVyOiBmdW5jdGlvbiBJZGVudGlmaWVyKG5vZGUsIHN0YXRlKSB7XG4gICAgc3RhdGUud3JpdGUobm9kZS5uYW1lLCBub2RlKTtcbiAgfSxcbiAgTGl0ZXJhbDogZnVuY3Rpb24gTGl0ZXJhbChub2RlLCBzdGF0ZSkge1xuICAgIGlmIChub2RlLnJhdyAhPSBudWxsKSB7XG4gICAgICBzdGF0ZS53cml0ZShub2RlLnJhdywgbm9kZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLnJlZ2V4ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuUmVnRXhwTGl0ZXJhbChub2RlLCBzdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLndyaXRlKHN0cmluZ2lmeShub2RlLnZhbHVlKSwgbm9kZSk7XG4gICAgfVxuICB9LFxuICBSZWdFeHBMaXRlcmFsOiBmdW5jdGlvbiBSZWdFeHBMaXRlcmFsKG5vZGUsIHN0YXRlKSB7XG4gICAgdmFyIHJlZ2V4ID0gbm9kZS5yZWdleDtcbiAgICBzdGF0ZS53cml0ZShcIi9cIi5jb25jYXQocmVnZXgucGF0dGVybiwgXCIvXCIpLmNvbmNhdChyZWdleC5mbGFncyksIG5vZGUpO1xuICB9XG59O1xuZXhwb3J0cy5iYXNlR2VuZXJhdG9yID0gYmFzZUdlbmVyYXRvcjtcbnZhciBFTVBUWV9PQkpFQ1QgPSB7fTtcblxudmFyIFN0YXRlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdGF0ZShvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXRlKTtcblxuICAgIHZhciBzZXR1cCA9IG9wdGlvbnMgPT0gbnVsbCA/IEVNUFRZX09CSkVDVCA6IG9wdGlvbnM7XG4gICAgdGhpcy5vdXRwdXQgPSAnJztcblxuICAgIGlmIChzZXR1cC5vdXRwdXQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5vdXRwdXQgPSBzZXR1cC5vdXRwdXQ7XG4gICAgICB0aGlzLndyaXRlID0gdGhpcy53cml0ZVRvU3RyZWFtO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm91dHB1dCA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gc2V0dXAuZ2VuZXJhdG9yICE9IG51bGwgPyBzZXR1cC5nZW5lcmF0b3IgOiBiYXNlR2VuZXJhdG9yO1xuICAgIHRoaXMuaW5kZW50ID0gc2V0dXAuaW5kZW50ICE9IG51bGwgPyBzZXR1cC5pbmRlbnQgOiAnICAnO1xuICAgIHRoaXMubGluZUVuZCA9IHNldHVwLmxpbmVFbmQgIT0gbnVsbCA/IHNldHVwLmxpbmVFbmQgOiAnXFxuJztcbiAgICB0aGlzLmluZGVudExldmVsID0gc2V0dXAuc3RhcnRpbmdJbmRlbnRMZXZlbCAhPSBudWxsID8gc2V0dXAuc3RhcnRpbmdJbmRlbnRMZXZlbCA6IDA7XG4gICAgdGhpcy53cml0ZUNvbW1lbnRzID0gc2V0dXAuY29tbWVudHMgPyBzZXR1cC5jb21tZW50cyA6IGZhbHNlO1xuXG4gICAgaWYgKHNldHVwLnNvdXJjZU1hcCAhPSBudWxsKSB7XG4gICAgICB0aGlzLndyaXRlID0gc2V0dXAub3V0cHV0ID09IG51bGwgPyB0aGlzLndyaXRlQW5kTWFwIDogdGhpcy53cml0ZVRvU3RyZWFtQW5kTWFwO1xuICAgICAgdGhpcy5zb3VyY2VNYXAgPSBzZXR1cC5zb3VyY2VNYXA7XG4gICAgICB0aGlzLmxpbmUgPSAxO1xuICAgICAgdGhpcy5jb2x1bW4gPSAwO1xuICAgICAgdGhpcy5saW5lRW5kU2l6ZSA9IHRoaXMubGluZUVuZC5zcGxpdCgnXFxuJykubGVuZ3RoIC0gMTtcbiAgICAgIHRoaXMubWFwcGluZyA9IHtcbiAgICAgICAgb3JpZ2luYWw6IG51bGwsXG4gICAgICAgIGdlbmVyYXRlZDogdGhpcyxcbiAgICAgICAgbmFtZTogdW5kZWZpbmVkLFxuICAgICAgICBzb3VyY2U6IHNldHVwLnNvdXJjZU1hcC5maWxlIHx8IHNldHVwLnNvdXJjZU1hcC5fZmlsZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU3RhdGUsIFt7XG4gICAga2V5OiBcIndyaXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdyaXRlKGNvZGUpIHtcbiAgICAgIHRoaXMub3V0cHV0ICs9IGNvZGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIndyaXRlVG9TdHJlYW1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JpdGVUb1N0cmVhbShjb2RlKSB7XG4gICAgICB0aGlzLm91dHB1dC53cml0ZShjb2RlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwid3JpdGVBbmRNYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JpdGVBbmRNYXAoY29kZSwgbm9kZSkge1xuICAgICAgdGhpcy5vdXRwdXQgKz0gY29kZTtcbiAgICAgIHRoaXMubWFwKGNvZGUsIG5vZGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ3cml0ZVRvU3RyZWFtQW5kTWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdyaXRlVG9TdHJlYW1BbmRNYXAoY29kZSwgbm9kZSkge1xuICAgICAgdGhpcy5vdXRwdXQud3JpdGUoY29kZSk7XG4gICAgICB0aGlzLm1hcChjb2RlLCBub2RlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChjb2RlLCBub2RlKSB7XG4gICAgICBpZiAobm9kZSAhPSBudWxsICYmIG5vZGUubG9jICE9IG51bGwpIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLm1hcHBpbmc7XG4gICAgICAgIG1hcHBpbmcub3JpZ2luYWwgPSBub2RlLmxvYy5zdGFydDtcbiAgICAgICAgbWFwcGluZy5uYW1lID0gbm9kZS5uYW1lO1xuICAgICAgICB0aGlzLnNvdXJjZU1hcC5hZGRNYXBwaW5nKG1hcHBpbmcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmVFbmRTaXplID4gMCkge1xuICAgICAgICAgIGlmIChjb2RlLmVuZHNXaXRoKHRoaXMubGluZUVuZCkpIHtcbiAgICAgICAgICAgIHRoaXMubGluZSArPSB0aGlzLmxpbmVFbmRTaXplO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSAwO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZVtjb2RlLmxlbmd0aCAtIDFdID09PSAnXFxuJykge1xuICAgICAgICAgICAgdGhpcy5saW5lKys7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbiA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uICs9IGNvZGUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY29kZVtjb2RlLmxlbmd0aCAtIDFdID09PSAnXFxuJykge1xuICAgICAgICAgICAgdGhpcy5saW5lKys7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbiA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uICs9IGNvZGUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLm91dHB1dDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3RhdGU7XG59KCk7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlKG5vZGUsIG9wdGlvbnMpIHtcbiAgdmFyIHN0YXRlID0gbmV3IFN0YXRlKG9wdGlvbnMpO1xuICBzdGF0ZS5nZW5lcmF0b3Jbbm9kZS50eXBlXShub2RlLCBzdGF0ZSk7XG4gIHJldHVybiBzdGF0ZS5vdXRwdXQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzdHJpbmcuanMubWFwIiwiXG4vKipcbiAqIEV4cG9zZSBgQmFja29mZmAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrb2ZmO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYmFja29mZiB0aW1lciB3aXRoIGBvcHRzYC5cbiAqXG4gKiAtIGBtaW5gIGluaXRpYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgWzEwMF1cbiAqIC0gYG1heGAgbWF4IHRpbWVvdXQgWzEwMDAwXVxuICogLSBgaml0dGVyYCBbMF1cbiAqIC0gYGZhY3RvcmAgWzJdXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gQmFja29mZihvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB0aGlzLm1zID0gb3B0cy5taW4gfHwgMTAwO1xuICB0aGlzLm1heCA9IG9wdHMubWF4IHx8IDEwMDAwO1xuICB0aGlzLmZhY3RvciA9IG9wdHMuZmFjdG9yIHx8IDI7XG4gIHRoaXMuaml0dGVyID0gb3B0cy5qaXR0ZXIgPiAwICYmIG9wdHMuaml0dGVyIDw9IDEgPyBvcHRzLmppdHRlciA6IDA7XG4gIHRoaXMuYXR0ZW1wdHMgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgYmFja29mZiBkdXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkJhY2tvZmYucHJvdG90eXBlLmR1cmF0aW9uID0gZnVuY3Rpb24oKXtcbiAgdmFyIG1zID0gdGhpcy5tcyAqIE1hdGgucG93KHRoaXMuZmFjdG9yLCB0aGlzLmF0dGVtcHRzKyspO1xuICBpZiAodGhpcy5qaXR0ZXIpIHtcbiAgICB2YXIgcmFuZCA9ICBNYXRoLnJhbmRvbSgpO1xuICAgIHZhciBkZXZpYXRpb24gPSBNYXRoLmZsb29yKHJhbmQgKiB0aGlzLmppdHRlciAqIG1zKTtcbiAgICBtcyA9IChNYXRoLmZsb29yKHJhbmQgKiAxMCkgJiAxKSA9PSAwICA/IG1zIC0gZGV2aWF0aW9uIDogbXMgKyBkZXZpYXRpb247XG4gIH1cbiAgcmV0dXJuIE1hdGgubWluKG1zLCB0aGlzLm1heCkgfCAwO1xufTtcblxuLyoqXG4gKiBSZXNldCB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQmFja29mZi5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpe1xuICB0aGlzLmF0dGVtcHRzID0gMDtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBtaW5pbXVtIGR1cmF0aW9uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5CYWNrb2ZmLnByb3RvdHlwZS5zZXRNaW4gPSBmdW5jdGlvbihtaW4pe1xuICB0aGlzLm1zID0gbWluO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIG1heGltdW0gZHVyYXRpb25cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkJhY2tvZmYucHJvdG90eXBlLnNldE1heCA9IGZ1bmN0aW9uKG1heCl7XG4gIHRoaXMubWF4ID0gbWF4O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGppdHRlclxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQmFja29mZi5wcm90b3R5cGUuc2V0Sml0dGVyID0gZnVuY3Rpb24oaml0dGVyKXtcbiAgdGhpcy5qaXR0ZXIgPSBqaXR0ZXI7XG59O1xuXG4iLCIvKlxuICogYmFzZTY0LWFycmF5YnVmZmVyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEyIE5pa2xhcyB2b24gSGVydHplblxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG4oZnVuY3Rpb24oKXtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIGNoYXJzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XG5cbiAgLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxuICB2YXIgbG9va3VwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG4gIH1cblxuICBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGFycmF5YnVmZmVyKSB7XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLFxuICAgIGksIGxlbiA9IGJ5dGVzLmxlbmd0aCwgYmFzZTY0ID0gXCJcIjtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrPTMpIHtcbiAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpXSA+PiAyXTtcbiAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTtcbiAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2kgKyAxXSAmIDE1KSA8PCAyKSB8IChieXRlc1tpICsgMl0gPj4gNildO1xuICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kgKyAyXSAmIDYzXTtcbiAgICB9XG5cbiAgICBpZiAoKGxlbiAlIDMpID09PSAyKSB7XG4gICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKDAsIGJhc2U2NC5sZW5ndGggLSAxKSArIFwiPVwiO1xuICAgIH0gZWxzZSBpZiAobGVuICUgMyA9PT0gMSkge1xuICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZygwLCBiYXNlNjQubGVuZ3RoIC0gMikgKyBcIj09XCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U2NDtcbiAgfTtcblxuICBleHBvcnRzLmRlY29kZSA9ICBmdW5jdGlvbihiYXNlNjQpIHtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gYmFzZTY0Lmxlbmd0aCAqIDAuNzUsXG4gICAgbGVuID0gYmFzZTY0Lmxlbmd0aCwgaSwgcCA9IDAsXG4gICAgZW5jb2RlZDEsIGVuY29kZWQyLCBlbmNvZGVkMywgZW5jb2RlZDQ7XG5cbiAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAxXSA9PT0gXCI9XCIpIHtcbiAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMl0gPT09IFwiPVwiKSB7XG4gICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhcnJheWJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXJMZW5ndGgpLFxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSs9NCkge1xuICAgICAgZW5jb2RlZDEgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgZW5jb2RlZDIgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSsxKV07XG4gICAgICBlbmNvZGVkMyA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpKzIpXTtcbiAgICAgIGVuY29kZWQ0ID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkrMyldO1xuXG4gICAgICBieXRlc1twKytdID0gKGVuY29kZWQxIDw8IDIpIHwgKGVuY29kZWQyID4+IDQpO1xuICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDIgJiAxNSkgPDwgNCkgfCAoZW5jb2RlZDMgPj4gMik7XG4gICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMyAmIDMpIDw8IDYpIHwgKGVuY29kZWQ0ICYgNjMpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheWJ1ZmZlcjtcbiAgfTtcbn0pKCk7XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBwbGFjZUhvbGRlcnNDb3VudCAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICByZXR1cm4gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIHJldHVybiAoYjY0Lmxlbmd0aCAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0NvdW50KGI2NClcbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgaSwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBwbGFjZUhvbGRlcnMgPSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG5cbiAgYXJyID0gbmV3IEFycigobGVuICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gNCkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgKyAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgKyAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIG91dHB1dCA9ICcnXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAyXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9PSdcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgKHVpbnQ4W2xlbiAtIDFdKVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDEwXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz0nXG4gIH1cblxuICBwYXJ0cy5wdXNoKG91dHB1dClcblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIi8qKlxuICogQ3JlYXRlIGEgYmxvYiBidWlsZGVyIGV2ZW4gd2hlbiB2ZW5kb3IgcHJlZml4ZXMgZXhpc3RcbiAqL1xuXG52YXIgQmxvYkJ1aWxkZXIgPSBnbG9iYWwuQmxvYkJ1aWxkZXJcbiAgfHwgZ2xvYmFsLldlYktpdEJsb2JCdWlsZGVyXG4gIHx8IGdsb2JhbC5NU0Jsb2JCdWlsZGVyXG4gIHx8IGdsb2JhbC5Nb3pCbG9iQnVpbGRlcjtcblxuLyoqXG4gKiBDaGVjayBpZiBCbG9iIGNvbnN0cnVjdG9yIGlzIHN1cHBvcnRlZFxuICovXG5cbnZhciBibG9iU3VwcG9ydGVkID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBhID0gbmV3IEJsb2IoWydoaSddKTtcbiAgICByZXR1cm4gYS5zaXplID09PSAyO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn0pKCk7XG5cbi8qKlxuICogQ2hlY2sgaWYgQmxvYiBjb25zdHJ1Y3RvciBzdXBwb3J0cyBBcnJheUJ1ZmZlclZpZXdzXG4gKiBGYWlscyBpbiBTYWZhcmkgNiwgc28gd2UgbmVlZCB0byBtYXAgdG8gQXJyYXlCdWZmZXJzIHRoZXJlLlxuICovXG5cbnZhciBibG9iU3VwcG9ydHNBcnJheUJ1ZmZlclZpZXcgPSBibG9iU3VwcG9ydGVkICYmIChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYiA9IG5ldyBCbG9iKFtuZXcgVWludDhBcnJheShbMSwyXSldKTtcbiAgICByZXR1cm4gYi5zaXplID09PSAyO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn0pKCk7XG5cbi8qKlxuICogQ2hlY2sgaWYgQmxvYkJ1aWxkZXIgaXMgc3VwcG9ydGVkXG4gKi9cblxudmFyIGJsb2JCdWlsZGVyU3VwcG9ydGVkID0gQmxvYkJ1aWxkZXJcbiAgJiYgQmxvYkJ1aWxkZXIucHJvdG90eXBlLmFwcGVuZFxuICAmJiBCbG9iQnVpbGRlci5wcm90b3R5cGUuZ2V0QmxvYjtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBtYXBzIEFycmF5QnVmZmVyVmlld3MgdG8gQXJyYXlCdWZmZXJzXG4gKiBVc2VkIGJ5IEJsb2JCdWlsZGVyIGNvbnN0cnVjdG9yIGFuZCBvbGQgYnJvd3NlcnMgdGhhdCBkaWRuJ3RcbiAqIHN1cHBvcnQgaXQgaW4gdGhlIEJsb2IgY29uc3RydWN0b3IuXG4gKi9cblxuZnVuY3Rpb24gbWFwQXJyYXlCdWZmZXJWaWV3cyhhcnkpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2h1bmsgPSBhcnlbaV07XG4gICAgaWYgKGNodW5rLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICB2YXIgYnVmID0gY2h1bmsuYnVmZmVyO1xuXG4gICAgICAvLyBpZiB0aGlzIGlzIGEgc3ViYXJyYXksIG1ha2UgYSBjb3B5IHNvIHdlIG9ubHlcbiAgICAgIC8vIGluY2x1ZGUgdGhlIHN1YmFycmF5IHJlZ2lvbiBmcm9tIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlclxuICAgICAgaWYgKGNodW5rLmJ5dGVMZW5ndGggIT09IGJ1Zi5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIHZhciBjb3B5ID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmsuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvcHkuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZiwgY2h1bmsuYnl0ZU9mZnNldCwgY2h1bmsuYnl0ZUxlbmd0aCkpO1xuICAgICAgICBidWYgPSBjb3B5LmJ1ZmZlcjtcbiAgICAgIH1cblxuICAgICAgYXJ5W2ldID0gYnVmO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBCbG9iQnVpbGRlckNvbnN0cnVjdG9yKGFyeSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICB2YXIgYmIgPSBuZXcgQmxvYkJ1aWxkZXIoKTtcbiAgbWFwQXJyYXlCdWZmZXJWaWV3cyhhcnkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgYmIuYXBwZW5kKGFyeVtpXSk7XG4gIH1cblxuICByZXR1cm4gKG9wdGlvbnMudHlwZSkgPyBiYi5nZXRCbG9iKG9wdGlvbnMudHlwZSkgOiBiYi5nZXRCbG9iKCk7XG59O1xuXG5mdW5jdGlvbiBCbG9iQ29uc3RydWN0b3IoYXJ5LCBvcHRpb25zKSB7XG4gIG1hcEFycmF5QnVmZmVyVmlld3MoYXJ5KTtcbiAgcmV0dXJuIG5ldyBCbG9iKGFyeSwgb3B0aW9ucyB8fCB7fSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgaWYgKGJsb2JTdXBwb3J0ZWQpIHtcbiAgICByZXR1cm4gYmxvYlN1cHBvcnRzQXJyYXlCdWZmZXJWaWV3ID8gZ2xvYmFsLkJsb2IgOiBCbG9iQ29uc3RydWN0b3I7XG4gIH0gZWxzZSBpZiAoYmxvYkJ1aWxkZXJTdXBwb3J0ZWQpIHtcbiAgICByZXR1cm4gQmxvYkJ1aWxkZXJDb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59KSgpO1xuIiwiIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IG9iamVjdENyZWF0ZVBvbHlmaWxsXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IG9iamVjdEtleXNQb2x5ZmlsbFxudmFyIGJpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBmdW5jdGlvbkJpbmRQb2x5ZmlsbFxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywgJ19ldmVudHMnKSkge1xuICAgIHRoaXMuX2V2ZW50cyA9IG9iamVjdENyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG52YXIgaGFzRGVmaW5lUHJvcGVydHk7XG50cnkge1xuICB2YXIgbyA9IHt9O1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgJ3gnLCB7IHZhbHVlOiAwIH0pO1xuICBoYXNEZWZpbmVQcm9wZXJ0eSA9IG8ueCA9PT0gMDtcbn0gY2F0Y2ggKGVycikgeyBoYXNEZWZpbmVQcm9wZXJ0eSA9IGZhbHNlIH1cbmlmIChoYXNEZWZpbmVQcm9wZXJ0eSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBpbnB1dCBpcyBhIHBvc2l0aXZlIG51bWJlciAod2hvc2UgdmFsdWUgaXMgemVybyBvclxuICAgICAgLy8gZ3JlYXRlciBhbmQgbm90IGEgTmFOKS5cbiAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IGFyZyAhPT0gYXJnKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gICAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG59XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJuXCIgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uICRnZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuICRnZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG4vLyBUaGVzZSBzdGFuZGFsb25lIGVtaXQqIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBvcHRpbWl6ZSBjYWxsaW5nIG9mIGV2ZW50XG4vLyBoYW5kbGVycyBmb3IgZmFzdCBjYXNlcyBiZWNhdXNlIGVtaXQoKSBpdHNlbGYgb2Z0ZW4gaGFzIGEgdmFyaWFibGUgbnVtYmVyIG9mXG4vLyBhcmd1bWVudHMgYW5kIGNhbiBiZSBkZW9wdGltaXplZCBiZWNhdXNlIG9mIHRoYXQuIFRoZXNlIGZ1bmN0aW9ucyBhbHdheXMgaGF2ZVxuLy8gdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgdGh1cyBkbyBub3QgZ2V0IGRlb3B0aW1pemVkLCBzbyB0aGUgY29kZVxuLy8gaW5zaWRlIHRoZW0gY2FuIGV4ZWN1dGUgZmFzdGVyLlxuZnVuY3Rpb24gZW1pdE5vbmUoaGFuZGxlciwgaXNGbiwgc2VsZikge1xuICBpZiAoaXNGbilcbiAgICBoYW5kbGVyLmNhbGwoc2VsZik7XG4gIGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmKTtcbiAgfVxufVxuZnVuY3Rpb24gZW1pdE9uZShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEpO1xuICB9XG59XG5mdW5jdGlvbiBlbWl0VHdvKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEsIGFyZzIpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEsIGFyZzIpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSwgYXJnMik7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRUaHJlZShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRNYW55KGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZ3MpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5hcHBseShzZWxmLCBhcmdzKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseShzZWxmLCBhcmdzKTtcbiAgfVxufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGV2ZW50cztcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT0gbnVsbCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKVxuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgXCJlcnJvclwiIGV2ZW50LiAoJyArIGVyICsgJyknKTtcbiAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKCFoYW5kbGVyKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB2YXIgaXNGbiA9IHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nO1xuICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICBzd2l0Y2ggKGxlbikge1xuICAgICAgLy8gZmFzdCBjYXNlc1xuICAgIGNhc2UgMTpcbiAgICAgIGVtaXROb25lKGhhbmRsZXIsIGlzRm4sIHRoaXMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgZW1pdE9uZShoYW5kbGVyLCBpc0ZuLCB0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgZW1pdFR3byhoYW5kbGVyLCBpc0ZuLCB0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICBlbWl0VGhyZWUoaGFuZGxlciwgaXNGbiwgdGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0sIGFyZ3VtZW50c1szXSk7XG4gICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgIGRlZmF1bHQ6XG4gICAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKVxuICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGVtaXRNYW55KGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoIWV2ZW50cykge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gb2JqZWN0Q3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKCFleGlzdGluZykge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgICBpZiAocHJlcGVuZCkge1xuICAgICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgaWYgKCFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIG0gPSAkZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgICBpZiAobSAmJiBtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtKSB7XG4gICAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyBcIicgKyBTdHJpbmcodHlwZSkgKyAnXCIgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdC4nKTtcbiAgICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSAnb2JqZWN0JyAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJyVzOiAlcycsIHcubmFtZSwgdy5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCwgYXJndW1lbnRzWzBdKTtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCwgYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0LCBhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSxcbiAgICAgICAgICAgIGFyZ3VtZW50c1syXSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKVxuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBiaW5kLmNhbGwob25jZVdyYXBwZXIsIHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoIWV2ZW50cylcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAoIWxpc3QpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gb2JqZWN0Q3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoIWV2ZW50cylcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmICghZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gb2JqZWN0Q3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0pIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IG9iamVjdENyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gb2JqZWN0Q3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmICghZXZlbnRzKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKCFldmxpc3RlbmVyKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgPyB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cykge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3Qub3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG4vLyBBYm91dCAxLjV4IGZhc3RlciB0aGFuIHRoZSB0d28tYXJnIHZlcnNpb24gb2YgQXJyYXkjc3BsaWNlKCkuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICh2YXIgaSA9IGluZGV4LCBrID0gaSArIDEsIG4gPSBsaXN0Lmxlbmd0aDsgayA8IG47IGkgKz0gMSwgayArPSAxKVxuICAgIGxpc3RbaV0gPSBsaXN0W2tdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9iamVjdENyZWF0ZVBvbHlmaWxsKHByb3RvKSB7XG4gIHZhciBGID0gZnVuY3Rpb24oKSB7fTtcbiAgRi5wcm90b3R5cGUgPSBwcm90bztcbiAgcmV0dXJuIG5ldyBGO1xufVxuZnVuY3Rpb24gb2JqZWN0S2V5c1BvbHlmaWxsKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrIGluIG9iaikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGspKSB7XG4gICAga2V5cy5wdXNoKGspO1xuICB9XG4gIHJldHVybiBrO1xufVxuZnVuY3Rpb24gZnVuY3Rpb25CaW5kUG9seWZpbGwoY29udGV4dCkge1xuICB2YXIgZm4gPSB0aGlzO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICB9O1xufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbnZhciBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MlxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdwYXJlbnQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1ZmZlclxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmIChpc0FycmF5QnVmZmVyKHZhbHVlKSB8fCAodmFsdWUgJiYgaXNBcnJheUJ1ZmZlcih2YWx1ZS5idWZmZXIpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzE0OFxuQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSBidWYud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIGJ1ZiA9IGJ1Zi5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBidWZbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyIChhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcIm9mZnNldFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wibGVuZ3RoXCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIHZhciBidWZcbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIGJ1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAob2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuKVxuXG4gICAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBidWZcbiAgICB9XG5cbiAgICBvYmouY29weShidWYsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gYnVmXG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhvYmopIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBudW1iZXJJc05hTihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IEtfTUFYX0xFTkdUSGAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsgS19NQVhfTEVOR1RILnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyID09PSB0cnVlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGJ1ZikpIHtcbiAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1ZilcbiAgICB9XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNBcnJheUJ1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIChhbmQgdGhlIGBpcy1idWZmZXJgIG5wbSBwYWNrYWdlKVxuLy8gdG8gZGV0ZWN0IGEgQnVmZmVyIGluc3RhbmNlLiBJdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGluc3RhbmNlb2YgQnVmZmVyYFxuLy8gcmVsaWFibHkgaW4gYSBicm93c2VyaWZ5IGNvbnRleHQgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBkaWZmZXJlbnRcbi8vIGNvcGllcyBvZiB0aGUgJ2J1ZmZlcicgcGFja2FnZSBpbiB1c2UuIFRoaXMgbWV0aG9kIHdvcmtzIGV2ZW4gZm9yIEJ1ZmZlclxuLy8gaW5zdGFuY2VzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gYW5vdGhlciBjb3B5IG9mIHRoZSBgYnVmZmVyYCBwYWNrYWdlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTU0XG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZ1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgKGJ5dGVzW2kgKyAxXSAqIDI1NikpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbiAgfSBlbHNlIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKChlbmNvZGluZyA9PT0gJ3V0ZjgnICYmIGNvZGUgPCAxMjgpIHx8XG4gICAgICAgICAgZW5jb2RpbmcgPT09ICdsYXRpbjEnKSB7XG4gICAgICAgIC8vIEZhc3QgcGF0aDogSWYgYHZhbGAgZml0cyBpbnRvIGEgc2luZ2xlIGJ5dGUsIHVzZSB0aGF0IG51bWVyaWMgdmFsdWUuXG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyB2YWwgK1xuICAgICAgICAnXCIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgXCJ2YWx1ZVwiJylcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSB0YWtlcyBlcXVhbCBzaWducyBhcyBlbmQgb2YgdGhlIEJhc2U2NCBlbmNvZGluZ1xuICBzdHIgPSBzdHIuc3BsaXQoJz0nKVswXVxuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbi8vIEFycmF5QnVmZmVycyBmcm9tIGFub3RoZXIgY29udGV4dCAoaS5lLiBhbiBpZnJhbWUpIGRvIG5vdCBwYXNzIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2tcbi8vIGJ1dCB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIGFzIHZhbGlkLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNjZcbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIgKG9iaikge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBcnJheUJ1ZmZlcicgJiZcbiAgICAgIHR5cGVvZiBvYmouYnl0ZUxlbmd0aCA9PT0gJ251bWJlcicpXG59XG5cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gb2JqIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBub09wdGlvbnMgPSB7fTtcbiAgdmFyIG5vbldTID0gL1teXFxzXFx1MDBhMF0vO1xuICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7XG5cbiAgZnVuY3Rpb24gZmlyc3ROb25XUyhzdHIpIHtcbiAgICB2YXIgZm91bmQgPSBzdHIuc2VhcmNoKG5vbldTKTtcbiAgICByZXR1cm4gZm91bmQgPT0gLTEgPyAwIDogZm91bmQ7XG4gIH1cblxuICBDb2RlTWlycm9yLmNvbW1hbmRzLnRvZ2dsZUNvbW1lbnQgPSBmdW5jdGlvbihjbSkge1xuICAgIGNtLnRvZ2dsZUNvbW1lbnQoKTtcbiAgfTtcblxuICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbihcInRvZ2dsZUNvbW1lbnRcIiwgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IG5vT3B0aW9ucztcbiAgICB2YXIgY20gPSB0aGlzO1xuICAgIHZhciBtaW5MaW5lID0gSW5maW5pdHksIHJhbmdlcyA9IHRoaXMubGlzdFNlbGVjdGlvbnMoKSwgbW9kZSA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IHJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZyb20gPSByYW5nZXNbaV0uZnJvbSgpLCB0byA9IHJhbmdlc1tpXS50bygpO1xuICAgICAgaWYgKGZyb20ubGluZSA+PSBtaW5MaW5lKSBjb250aW51ZTtcbiAgICAgIGlmICh0by5saW5lID49IG1pbkxpbmUpIHRvID0gUG9zKG1pbkxpbmUsIDApO1xuICAgICAgbWluTGluZSA9IGZyb20ubGluZTtcbiAgICAgIGlmIChtb2RlID09IG51bGwpIHtcbiAgICAgICAgaWYgKGNtLnVuY29tbWVudChmcm9tLCB0bywgb3B0aW9ucykpIG1vZGUgPSBcInVuXCI7XG4gICAgICAgIGVsc2UgeyBjbS5saW5lQ29tbWVudChmcm9tLCB0bywgb3B0aW9ucyk7IG1vZGUgPSBcImxpbmVcIjsgfVxuICAgICAgfSBlbHNlIGlmIChtb2RlID09IFwidW5cIikge1xuICAgICAgICBjbS51bmNvbW1lbnQoZnJvbSwgdG8sIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY20ubGluZUNvbW1lbnQoZnJvbSwgdG8sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gUm91Z2ggaGV1cmlzdGljIHRvIHRyeSBhbmQgZGV0ZWN0IGxpbmVzIHRoYXQgYXJlIHBhcnQgb2YgbXVsdGktbGluZSBzdHJpbmdcbiAgZnVuY3Rpb24gcHJvYmFibHlJbnNpZGVTdHJpbmcoY20sIHBvcywgbGluZSkge1xuICAgIHJldHVybiAvXFxic3RyaW5nXFxiLy50ZXN0KGNtLmdldFRva2VuVHlwZUF0KFBvcyhwb3MubGluZSwgMCkpKSAmJiAhL15bXFwnXFxcIlxcYF0vLnRlc3QobGluZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1vZGUoY20sIHBvcykge1xuICAgIHZhciBtb2RlID0gY20uZ2V0TW9kZSgpXG4gICAgcmV0dXJuIG1vZGUudXNlSW5uZXJDb21tZW50cyA9PT0gZmFsc2UgfHwgIW1vZGUuaW5uZXJNb2RlID8gbW9kZSA6IGNtLmdldE1vZGVBdChwb3MpXG4gIH1cblxuICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbihcImxpbmVDb21tZW50XCIsIGZ1bmN0aW9uKGZyb20sIHRvLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0gbm9PcHRpb25zO1xuICAgIHZhciBzZWxmID0gdGhpcywgbW9kZSA9IGdldE1vZGUoc2VsZiwgZnJvbSk7XG4gICAgdmFyIGZpcnN0TGluZSA9IHNlbGYuZ2V0TGluZShmcm9tLmxpbmUpO1xuICAgIGlmIChmaXJzdExpbmUgPT0gbnVsbCB8fCBwcm9iYWJseUluc2lkZVN0cmluZyhzZWxmLCBmcm9tLCBmaXJzdExpbmUpKSByZXR1cm47XG5cbiAgICB2YXIgY29tbWVudFN0cmluZyA9IG9wdGlvbnMubGluZUNvbW1lbnQgfHwgbW9kZS5saW5lQ29tbWVudDtcbiAgICBpZiAoIWNvbW1lbnRTdHJpbmcpIHtcbiAgICAgIGlmIChvcHRpb25zLmJsb2NrQ29tbWVudFN0YXJ0IHx8IG1vZGUuYmxvY2tDb21tZW50U3RhcnQpIHtcbiAgICAgICAgb3B0aW9ucy5mdWxsTGluZXMgPSB0cnVlO1xuICAgICAgICBzZWxmLmJsb2NrQ29tbWVudChmcm9tLCB0bywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IE1hdGgubWluKHRvLmNoICE9IDAgfHwgdG8ubGluZSA9PSBmcm9tLmxpbmUgPyB0by5saW5lICsgMSA6IHRvLmxpbmUsIHNlbGYubGFzdExpbmUoKSArIDEpO1xuICAgIHZhciBwYWQgPSBvcHRpb25zLnBhZGRpbmcgPT0gbnVsbCA/IFwiIFwiIDogb3B0aW9ucy5wYWRkaW5nO1xuICAgIHZhciBibGFua0xpbmVzID0gb3B0aW9ucy5jb21tZW50QmxhbmtMaW5lcyB8fCBmcm9tLmxpbmUgPT0gdG8ubGluZTtcblxuICAgIHNlbGYub3BlcmF0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7XG4gICAgICAgIHZhciBiYXNlU3RyaW5nID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20ubGluZTsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgICAgdmFyIGxpbmUgPSBzZWxmLmdldExpbmUoaSk7XG4gICAgICAgICAgdmFyIHdoaXRlc3BhY2UgPSBsaW5lLnNsaWNlKDAsIGZpcnN0Tm9uV1MobGluZSkpO1xuICAgICAgICAgIGlmIChiYXNlU3RyaW5nID09IG51bGwgfHwgYmFzZVN0cmluZy5sZW5ndGggPiB3aGl0ZXNwYWNlLmxlbmd0aCkge1xuICAgICAgICAgICAgYmFzZVN0cmluZyA9IHdoaXRlc3BhY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSBmcm9tLmxpbmU7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgIHZhciBsaW5lID0gc2VsZi5nZXRMaW5lKGkpLCBjdXQgPSBiYXNlU3RyaW5nLmxlbmd0aDtcbiAgICAgICAgICBpZiAoIWJsYW5rTGluZXMgJiYgIW5vbldTLnRlc3QobGluZSkpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChsaW5lLnNsaWNlKDAsIGN1dCkgIT0gYmFzZVN0cmluZykgY3V0ID0gZmlyc3ROb25XUyhsaW5lKTtcbiAgICAgICAgICBzZWxmLnJlcGxhY2VSYW5nZShiYXNlU3RyaW5nICsgY29tbWVudFN0cmluZyArIHBhZCwgUG9zKGksIDApLCBQb3MoaSwgY3V0KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBmcm9tLmxpbmU7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgIGlmIChibGFua0xpbmVzIHx8IG5vbldTLnRlc3Qoc2VsZi5nZXRMaW5lKGkpKSlcbiAgICAgICAgICAgIHNlbGYucmVwbGFjZVJhbmdlKGNvbW1lbnRTdHJpbmcgKyBwYWQsIFBvcyhpLCAwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oXCJibG9ja0NvbW1lbnRcIiwgZnVuY3Rpb24oZnJvbSwgdG8sIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSBub09wdGlvbnM7XG4gICAgdmFyIHNlbGYgPSB0aGlzLCBtb2RlID0gZ2V0TW9kZShzZWxmLCBmcm9tKTtcbiAgICB2YXIgc3RhcnRTdHJpbmcgPSBvcHRpb25zLmJsb2NrQ29tbWVudFN0YXJ0IHx8IG1vZGUuYmxvY2tDb21tZW50U3RhcnQ7XG4gICAgdmFyIGVuZFN0cmluZyA9IG9wdGlvbnMuYmxvY2tDb21tZW50RW5kIHx8IG1vZGUuYmxvY2tDb21tZW50RW5kO1xuICAgIGlmICghc3RhcnRTdHJpbmcgfHwgIWVuZFN0cmluZykge1xuICAgICAgaWYgKChvcHRpb25zLmxpbmVDb21tZW50IHx8IG1vZGUubGluZUNvbW1lbnQpICYmIG9wdGlvbnMuZnVsbExpbmVzICE9IGZhbHNlKVxuICAgICAgICBzZWxmLmxpbmVDb21tZW50KGZyb20sIHRvLCBvcHRpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKC9cXGJjb21tZW50XFxiLy50ZXN0KHNlbGYuZ2V0VG9rZW5UeXBlQXQoUG9zKGZyb20ubGluZSwgMCkpKSkgcmV0dXJuXG5cbiAgICB2YXIgZW5kID0gTWF0aC5taW4odG8ubGluZSwgc2VsZi5sYXN0TGluZSgpKTtcbiAgICBpZiAoZW5kICE9IGZyb20ubGluZSAmJiB0by5jaCA9PSAwICYmIG5vbldTLnRlc3Qoc2VsZi5nZXRMaW5lKGVuZCkpKSAtLWVuZDtcblxuICAgIHZhciBwYWQgPSBvcHRpb25zLnBhZGRpbmcgPT0gbnVsbCA/IFwiIFwiIDogb3B0aW9ucy5wYWRkaW5nO1xuICAgIGlmIChmcm9tLmxpbmUgPiBlbmQpIHJldHVybjtcblxuICAgIHNlbGYub3BlcmF0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKG9wdGlvbnMuZnVsbExpbmVzICE9IGZhbHNlKSB7XG4gICAgICAgIHZhciBsYXN0TGluZUhhc1RleHQgPSBub25XUy50ZXN0KHNlbGYuZ2V0TGluZShlbmQpKTtcbiAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UocGFkICsgZW5kU3RyaW5nLCBQb3MoZW5kKSk7XG4gICAgICAgIHNlbGYucmVwbGFjZVJhbmdlKHN0YXJ0U3RyaW5nICsgcGFkLCBQb3MoZnJvbS5saW5lLCAwKSk7XG4gICAgICAgIHZhciBsZWFkID0gb3B0aW9ucy5ibG9ja0NvbW1lbnRMZWFkIHx8IG1vZGUuYmxvY2tDb21tZW50TGVhZDtcbiAgICAgICAgaWYgKGxlYWQgIT0gbnVsbCkgZm9yICh2YXIgaSA9IGZyb20ubGluZSArIDE7IGkgPD0gZW5kOyArK2kpXG4gICAgICAgICAgaWYgKGkgIT0gZW5kIHx8IGxhc3RMaW5lSGFzVGV4dClcbiAgICAgICAgICAgIHNlbGYucmVwbGFjZVJhbmdlKGxlYWQgKyBwYWQsIFBvcyhpLCAwKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnJlcGxhY2VSYW5nZShlbmRTdHJpbmcsIHRvKTtcbiAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2Uoc3RhcnRTdHJpbmcsIGZyb20pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbihcInVuY29tbWVudFwiLCBmdW5jdGlvbihmcm9tLCB0bywgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IG5vT3B0aW9ucztcbiAgICB2YXIgc2VsZiA9IHRoaXMsIG1vZGUgPSBnZXRNb2RlKHNlbGYsIGZyb20pO1xuICAgIHZhciBlbmQgPSBNYXRoLm1pbih0by5jaCAhPSAwIHx8IHRvLmxpbmUgPT0gZnJvbS5saW5lID8gdG8ubGluZSA6IHRvLmxpbmUgLSAxLCBzZWxmLmxhc3RMaW5lKCkpLCBzdGFydCA9IE1hdGgubWluKGZyb20ubGluZSwgZW5kKTtcblxuICAgIC8vIFRyeSBmaW5kaW5nIGxpbmUgY29tbWVudHNcbiAgICB2YXIgbGluZVN0cmluZyA9IG9wdGlvbnMubGluZUNvbW1lbnQgfHwgbW9kZS5saW5lQ29tbWVudCwgbGluZXMgPSBbXTtcbiAgICB2YXIgcGFkID0gb3B0aW9ucy5wYWRkaW5nID09IG51bGwgPyBcIiBcIiA6IG9wdGlvbnMucGFkZGluZywgZGlkU29tZXRoaW5nO1xuICAgIGxpbmVDb21tZW50OiB7XG4gICAgICBpZiAoIWxpbmVTdHJpbmcpIGJyZWFrIGxpbmVDb21tZW50O1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgKytpKSB7XG4gICAgICAgIHZhciBsaW5lID0gc2VsZi5nZXRMaW5lKGkpO1xuICAgICAgICB2YXIgZm91bmQgPSBsaW5lLmluZGV4T2YobGluZVN0cmluZyk7XG4gICAgICAgIGlmIChmb3VuZCA+IC0xICYmICEvY29tbWVudC8udGVzdChzZWxmLmdldFRva2VuVHlwZUF0KFBvcyhpLCBmb3VuZCArIDEpKSkpIGZvdW5kID0gLTE7XG4gICAgICAgIGlmIChmb3VuZCA9PSAtMSAmJiBub25XUy50ZXN0KGxpbmUpKSBicmVhayBsaW5lQ29tbWVudDtcbiAgICAgICAgaWYgKGZvdW5kID4gLTEgJiYgbm9uV1MudGVzdChsaW5lLnNsaWNlKDAsIGZvdW5kKSkpIGJyZWFrIGxpbmVDb21tZW50O1xuICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgfVxuICAgICAgc2VsZi5vcGVyYXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8PSBlbmQ7ICsraSkge1xuICAgICAgICAgIHZhciBsaW5lID0gbGluZXNbaSAtIHN0YXJ0XTtcbiAgICAgICAgICB2YXIgcG9zID0gbGluZS5pbmRleE9mKGxpbmVTdHJpbmcpLCBlbmRQb3MgPSBwb3MgKyBsaW5lU3RyaW5nLmxlbmd0aDtcbiAgICAgICAgICBpZiAocG9zIDwgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKGxpbmUuc2xpY2UoZW5kUG9zLCBlbmRQb3MgKyBwYWQubGVuZ3RoKSA9PSBwYWQpIGVuZFBvcyArPSBwYWQubGVuZ3RoO1xuICAgICAgICAgIGRpZFNvbWV0aGluZyA9IHRydWU7XG4gICAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UoXCJcIiwgUG9zKGksIHBvcyksIFBvcyhpLCBlbmRQb3MpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoZGlkU29tZXRoaW5nKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgYmxvY2sgY29tbWVudHNcbiAgICB2YXIgc3RhcnRTdHJpbmcgPSBvcHRpb25zLmJsb2NrQ29tbWVudFN0YXJ0IHx8IG1vZGUuYmxvY2tDb21tZW50U3RhcnQ7XG4gICAgdmFyIGVuZFN0cmluZyA9IG9wdGlvbnMuYmxvY2tDb21tZW50RW5kIHx8IG1vZGUuYmxvY2tDb21tZW50RW5kO1xuICAgIGlmICghc3RhcnRTdHJpbmcgfHwgIWVuZFN0cmluZykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBsZWFkID0gb3B0aW9ucy5ibG9ja0NvbW1lbnRMZWFkIHx8IG1vZGUuYmxvY2tDb21tZW50TGVhZDtcbiAgICB2YXIgc3RhcnRMaW5lID0gc2VsZi5nZXRMaW5lKHN0YXJ0KSwgb3BlbiA9IHN0YXJ0TGluZS5pbmRleE9mKHN0YXJ0U3RyaW5nKVxuICAgIGlmIChvcGVuID09IC0xKSByZXR1cm4gZmFsc2VcbiAgICB2YXIgZW5kTGluZSA9IGVuZCA9PSBzdGFydCA/IHN0YXJ0TGluZSA6IHNlbGYuZ2V0TGluZShlbmQpXG4gICAgdmFyIGNsb3NlID0gZW5kTGluZS5pbmRleE9mKGVuZFN0cmluZywgZW5kID09IHN0YXJ0ID8gb3BlbiArIHN0YXJ0U3RyaW5nLmxlbmd0aCA6IDApO1xuICAgIHZhciBpbnNpZGVTdGFydCA9IFBvcyhzdGFydCwgb3BlbiArIDEpLCBpbnNpZGVFbmQgPSBQb3MoZW5kLCBjbG9zZSArIDEpXG4gICAgaWYgKGNsb3NlID09IC0xIHx8XG4gICAgICAgICEvY29tbWVudC8udGVzdChzZWxmLmdldFRva2VuVHlwZUF0KGluc2lkZVN0YXJ0KSkgfHxcbiAgICAgICAgIS9jb21tZW50Ly50ZXN0KHNlbGYuZ2V0VG9rZW5UeXBlQXQoaW5zaWRlRW5kKSkgfHxcbiAgICAgICAgc2VsZi5nZXRSYW5nZShpbnNpZGVTdGFydCwgaW5zaWRlRW5kLCBcIlxcblwiKS5pbmRleE9mKGVuZFN0cmluZykgPiAtMSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEF2b2lkIGtpbGxpbmcgYmxvY2sgY29tbWVudHMgY29tcGxldGVseSBvdXRzaWRlIHRoZSBzZWxlY3Rpb24uXG4gICAgLy8gUG9zaXRpb25zIG9mIHRoZSBsYXN0IHN0YXJ0U3RyaW5nIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiwgYW5kIHRoZSBmaXJzdCBlbmRTdHJpbmcgYWZ0ZXIgaXQuXG4gICAgdmFyIGxhc3RTdGFydCA9IHN0YXJ0TGluZS5sYXN0SW5kZXhPZihzdGFydFN0cmluZywgZnJvbS5jaCk7XG4gICAgdmFyIGZpcnN0RW5kID0gbGFzdFN0YXJ0ID09IC0xID8gLTEgOiBzdGFydExpbmUuc2xpY2UoMCwgZnJvbS5jaCkuaW5kZXhPZihlbmRTdHJpbmcsIGxhc3RTdGFydCArIHN0YXJ0U3RyaW5nLmxlbmd0aCk7XG4gICAgaWYgKGxhc3RTdGFydCAhPSAtMSAmJiBmaXJzdEVuZCAhPSAtMSAmJiBmaXJzdEVuZCArIGVuZFN0cmluZy5sZW5ndGggIT0gZnJvbS5jaCkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIFBvc2l0aW9ucyBvZiB0aGUgZmlyc3QgZW5kU3RyaW5nIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiwgYW5kIHRoZSBsYXN0IHN0YXJ0U3RyaW5nIGJlZm9yZSBpdC5cbiAgICBmaXJzdEVuZCA9IGVuZExpbmUuaW5kZXhPZihlbmRTdHJpbmcsIHRvLmNoKTtcbiAgICB2YXIgYWxtb3N0TGFzdFN0YXJ0ID0gZW5kTGluZS5zbGljZSh0by5jaCkubGFzdEluZGV4T2Yoc3RhcnRTdHJpbmcsIGZpcnN0RW5kIC0gdG8uY2gpO1xuICAgIGxhc3RTdGFydCA9IChmaXJzdEVuZCA9PSAtMSB8fCBhbG1vc3RMYXN0U3RhcnQgPT0gLTEpID8gLTEgOiB0by5jaCArIGFsbW9zdExhc3RTdGFydDtcbiAgICBpZiAoZmlyc3RFbmQgIT0gLTEgJiYgbGFzdFN0YXJ0ICE9IC0xICYmIGxhc3RTdGFydCAhPSB0by5jaCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgc2VsZi5vcGVyYXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLnJlcGxhY2VSYW5nZShcIlwiLCBQb3MoZW5kLCBjbG9zZSAtIChwYWQgJiYgZW5kTGluZS5zbGljZShjbG9zZSAtIHBhZC5sZW5ndGgsIGNsb3NlKSA9PSBwYWQgPyBwYWQubGVuZ3RoIDogMCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgUG9zKGVuZCwgY2xvc2UgKyBlbmRTdHJpbmcubGVuZ3RoKSk7XG4gICAgICB2YXIgb3BlbkVuZCA9IG9wZW4gKyBzdGFydFN0cmluZy5sZW5ndGg7XG4gICAgICBpZiAocGFkICYmIHN0YXJ0TGluZS5zbGljZShvcGVuRW5kLCBvcGVuRW5kICsgcGFkLmxlbmd0aCkgPT0gcGFkKSBvcGVuRW5kICs9IHBhZC5sZW5ndGg7XG4gICAgICBzZWxmLnJlcGxhY2VSYW5nZShcIlwiLCBQb3Moc3RhcnQsIG9wZW4pLCBQb3Moc3RhcnQsIG9wZW5FbmQpKTtcbiAgICAgIGlmIChsZWFkKSBmb3IgKHZhciBpID0gc3RhcnQgKyAxOyBpIDw9IGVuZDsgKytpKSB7XG4gICAgICAgIHZhciBsaW5lID0gc2VsZi5nZXRMaW5lKGkpLCBmb3VuZCA9IGxpbmUuaW5kZXhPZihsZWFkKTtcbiAgICAgICAgaWYgKGZvdW5kID09IC0xIHx8IG5vbldTLnRlc3QobGluZS5zbGljZSgwLCBmb3VuZCkpKSBjb250aW51ZTtcbiAgICAgICAgdmFyIGZvdW5kRW5kID0gZm91bmQgKyBsZWFkLmxlbmd0aDtcbiAgICAgICAgaWYgKHBhZCAmJiBsaW5lLnNsaWNlKGZvdW5kRW5kLCBmb3VuZEVuZCArIHBhZC5sZW5ndGgpID09IHBhZCkgZm91bmRFbmQgKz0gcGFkLmxlbmd0aDtcbiAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UoXCJcIiwgUG9zKGksIGZvdW5kKSwgUG9zKGksIGZvdW5kRW5kKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufSk7XG4iLCIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG4gIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvcztcblxuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZikge1xuICAgIGZvciAodmFyIGkgPSAwLCBlID0gYXJyLmxlbmd0aDsgaSA8IGU7ICsraSkgZihhcnJbaV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYXJyYXlDb250YWlucyhhcnIsIGl0ZW0pIHtcbiAgICBpZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XG4gICAgICB2YXIgaSA9IGFyci5sZW5ndGg7XG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGlmIChhcnJbaV0gPT09IGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyLmluZGV4T2YoaXRlbSkgIT0gLTE7XG4gIH1cblxuICBmdW5jdGlvbiBzY3JpcHRIaW50KGVkaXRvciwga2V5d29yZHMsIGdldFRva2VuLCBvcHRpb25zKSB7XG4gICAgLy8gRmluZCB0aGUgdG9rZW4gYXQgdGhlIGN1cnNvclxuICAgIHZhciBjdXIgPSBlZGl0b3IuZ2V0Q3Vyc29yKCksIHRva2VuID0gZ2V0VG9rZW4oZWRpdG9yLCBjdXIpO1xuICAgIGlmICgvXFxiKD86c3RyaW5nfGNvbW1lbnQpXFxiLy50ZXN0KHRva2VuLnR5cGUpKSByZXR1cm47XG4gICAgdmFyIGlubmVyTW9kZSA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGVkaXRvci5nZXRNb2RlKCksIHRva2VuLnN0YXRlKTtcbiAgICBpZiAoaW5uZXJNb2RlLm1vZGUuaGVscGVyVHlwZSA9PT0gXCJqc29uXCIpIHJldHVybjtcbiAgICB0b2tlbi5zdGF0ZSA9IGlubmVyTW9kZS5zdGF0ZTtcblxuICAgIC8vIElmIGl0J3Mgbm90IGEgJ3dvcmQtc3R5bGUnIHRva2VuLCBpZ25vcmUgdGhlIHRva2VuLlxuICAgIGlmICghL15bXFx3JF9dKiQvLnRlc3QodG9rZW4uc3RyaW5nKSkge1xuICAgICAgdG9rZW4gPSB7c3RhcnQ6IGN1ci5jaCwgZW5kOiBjdXIuY2gsIHN0cmluZzogXCJcIiwgc3RhdGU6IHRva2VuLnN0YXRlLFxuICAgICAgICAgICAgICAgdHlwZTogdG9rZW4uc3RyaW5nID09IFwiLlwiID8gXCJwcm9wZXJ0eVwiIDogbnVsbH07XG4gICAgfSBlbHNlIGlmICh0b2tlbi5lbmQgPiBjdXIuY2gpIHtcbiAgICAgIHRva2VuLmVuZCA9IGN1ci5jaDtcbiAgICAgIHRva2VuLnN0cmluZyA9IHRva2VuLnN0cmluZy5zbGljZSgwLCBjdXIuY2ggLSB0b2tlbi5zdGFydCk7XG4gICAgfVxuXG4gICAgdmFyIHRwcm9wID0gdG9rZW47XG4gICAgLy8gSWYgaXQgaXMgYSBwcm9wZXJ0eSwgZmluZCBvdXQgd2hhdCBpdCBpcyBhIHByb3BlcnR5IG9mLlxuICAgIHdoaWxlICh0cHJvcC50eXBlID09IFwicHJvcGVydHlcIikge1xuICAgICAgdHByb3AgPSBnZXRUb2tlbihlZGl0b3IsIFBvcyhjdXIubGluZSwgdHByb3Auc3RhcnQpKTtcbiAgICAgIGlmICh0cHJvcC5zdHJpbmcgIT0gXCIuXCIpIHJldHVybjtcbiAgICAgIHRwcm9wID0gZ2V0VG9rZW4oZWRpdG9yLCBQb3MoY3VyLmxpbmUsIHRwcm9wLnN0YXJ0KSk7XG4gICAgICBpZiAoIWNvbnRleHQpIHZhciBjb250ZXh0ID0gW107XG4gICAgICBjb250ZXh0LnB1c2godHByb3ApO1xuICAgIH1cbiAgICByZXR1cm4ge2xpc3Q6IGdldENvbXBsZXRpb25zKHRva2VuLCBjb250ZXh0LCBrZXl3b3Jkcywgb3B0aW9ucyksXG4gICAgICAgICAgICBmcm9tOiBQb3MoY3VyLmxpbmUsIHRva2VuLnN0YXJ0KSxcbiAgICAgICAgICAgIHRvOiBQb3MoY3VyLmxpbmUsIHRva2VuLmVuZCl9O1xuICB9XG5cbiAgZnVuY3Rpb24gamF2YXNjcmlwdEhpbnQoZWRpdG9yLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHNjcmlwdEhpbnQoZWRpdG9yLCBqYXZhc2NyaXB0S2V5d29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIGN1cikge3JldHVybiBlLmdldFRva2VuQXQoY3VyKTt9LFxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpO1xuICB9O1xuICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKFwiaGludFwiLCBcImphdmFzY3JpcHRcIiwgamF2YXNjcmlwdEhpbnQpO1xuXG4gIGZ1bmN0aW9uIGdldENvZmZlZVNjcmlwdFRva2VuKGVkaXRvciwgY3VyKSB7XG4gIC8vIFRoaXMgZ2V0VG9rZW4sIGl0IGlzIGZvciBjb2ZmZWVzY3JpcHQsIGltaXRhdGVzIHRoZSBiZWhhdmlvciBvZlxuICAvLyBnZXRUb2tlbkF0IG1ldGhvZCBpbiBqYXZhc2NyaXB0LmpzLCB0aGF0IGlzLCByZXR1cm5pbmcgXCJwcm9wZXJ0eVwiXG4gIC8vIHR5cGUgYW5kIHRyZWF0IFwiLlwiIGFzIGluZGVwZW5lbnQgdG9rZW4uXG4gICAgdmFyIHRva2VuID0gZWRpdG9yLmdldFRva2VuQXQoY3VyKTtcbiAgICBpZiAoY3VyLmNoID09IHRva2VuLnN0YXJ0ICsgMSAmJiB0b2tlbi5zdHJpbmcuY2hhckF0KDApID09ICcuJykge1xuICAgICAgdG9rZW4uZW5kID0gdG9rZW4uc3RhcnQ7XG4gICAgICB0b2tlbi5zdHJpbmcgPSAnLic7XG4gICAgICB0b2tlbi50eXBlID0gXCJwcm9wZXJ0eVwiO1xuICAgIH1cbiAgICBlbHNlIGlmICgvXlxcLltcXHckX10qJC8udGVzdCh0b2tlbi5zdHJpbmcpKSB7XG4gICAgICB0b2tlbi50eXBlID0gXCJwcm9wZXJ0eVwiO1xuICAgICAgdG9rZW4uc3RhcnQrKztcbiAgICAgIHRva2VuLnN0cmluZyA9IHRva2VuLnN0cmluZy5yZXBsYWNlKC9cXC4vLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvZmZlZXNjcmlwdEhpbnQoZWRpdG9yLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHNjcmlwdEhpbnQoZWRpdG9yLCBjb2ZmZWVzY3JpcHRLZXl3b3JkcywgZ2V0Q29mZmVlU2NyaXB0VG9rZW4sIG9wdGlvbnMpO1xuICB9XG4gIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoXCJoaW50XCIsIFwiY29mZmVlc2NyaXB0XCIsIGNvZmZlZXNjcmlwdEhpbnQpO1xuXG4gIHZhciBzdHJpbmdQcm9wcyA9IChcImNoYXJBdCBjaGFyQ29kZUF0IGluZGV4T2YgbGFzdEluZGV4T2Ygc3Vic3RyaW5nIHN1YnN0ciBzbGljZSB0cmltIHRyaW1MZWZ0IHRyaW1SaWdodCBcIiArXG4gICAgICAgICAgICAgICAgICAgICBcInRvVXBwZXJDYXNlIHRvTG93ZXJDYXNlIHNwbGl0IGNvbmNhdCBtYXRjaCByZXBsYWNlIHNlYXJjaFwiKS5zcGxpdChcIiBcIik7XG4gIHZhciBhcnJheVByb3BzID0gKFwibGVuZ3RoIGNvbmNhdCBqb2luIHNwbGljZSBwdXNoIHBvcCBzaGlmdCB1bnNoaWZ0IHNsaWNlIHJldmVyc2Ugc29ydCBpbmRleE9mIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJsYXN0SW5kZXhPZiBldmVyeSBzb21lIGZpbHRlciBmb3JFYWNoIG1hcCByZWR1Y2UgcmVkdWNlUmlnaHQgXCIpLnNwbGl0KFwiIFwiKTtcbiAgdmFyIGZ1bmNQcm9wcyA9IFwicHJvdG90eXBlIGFwcGx5IGNhbGwgYmluZFwiLnNwbGl0KFwiIFwiKTtcbiAgdmFyIGphdmFzY3JpcHRLZXl3b3JkcyA9IChcImJyZWFrIGNhc2UgY2F0Y2ggY2xhc3MgY29uc3QgY29udGludWUgZGVidWdnZXIgZGVmYXVsdCBkZWxldGUgZG8gZWxzZSBleHBvcnQgZXh0ZW5kcyBmYWxzZSBmaW5hbGx5IGZvciBmdW5jdGlvbiBcIiArXG4gICAgICAgICAgICAgICAgICBcImlmIGluIGltcG9ydCBpbnN0YW5jZW9mIG5ldyBudWxsIHJldHVybiBzdXBlciBzd2l0Y2ggdGhpcyB0aHJvdyB0cnVlIHRyeSB0eXBlb2YgdmFyIHZvaWQgd2hpbGUgd2l0aCB5aWVsZFwiKS5zcGxpdChcIiBcIik7XG4gIHZhciBjb2ZmZWVzY3JpcHRLZXl3b3JkcyA9IChcImFuZCBicmVhayBjYXRjaCBjbGFzcyBjb250aW51ZSBkZWxldGUgZG8gZWxzZSBleHRlbmRzIGZhbHNlIGZpbmFsbHkgZm9yIFwiICtcbiAgICAgICAgICAgICAgICAgIFwiaWYgaW4gaW5zdGFuY2VvZiBpc250IG5ldyBubyBub3QgbnVsbCBvZiBvZmYgb24gb3IgcmV0dXJuIHN3aXRjaCB0aGVuIHRocm93IHRydWUgdHJ5IHR5cGVvZiB1bnRpbCB2b2lkIHdoaWxlIHdpdGggeWVzXCIpLnNwbGl0KFwiIFwiKTtcblxuICBmdW5jdGlvbiBmb3JBbGxQcm9wcyhvYmosIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCAhT2JqZWN0LmdldFByb3RvdHlwZU9mKSB7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIG9iaikgY2FsbGJhY2sobmFtZSlcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgbyA9IG9iajsgbzsgbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKSlcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZm9yRWFjaChjYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRDb21wbGV0aW9ucyh0b2tlbiwgY29udGV4dCwga2V5d29yZHMsIG9wdGlvbnMpIHtcbiAgICB2YXIgZm91bmQgPSBbXSwgc3RhcnQgPSB0b2tlbi5zdHJpbmcsIGdsb2JhbCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5nbG9iYWxTY29wZSB8fCB3aW5kb3c7XG4gICAgZnVuY3Rpb24gbWF5YmVBZGQoc3RyKSB7XG4gICAgICBpZiAoc3RyLmxhc3RJbmRleE9mKHN0YXJ0LCAwKSA9PSAwICYmICFhcnJheUNvbnRhaW5zKGZvdW5kLCBzdHIpKSBmb3VuZC5wdXNoKHN0cik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdhdGhlckNvbXBsZXRpb25zKG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmogPT0gXCJzdHJpbmdcIikgZm9yRWFjaChzdHJpbmdQcm9wcywgbWF5YmVBZGQpO1xuICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpIGZvckVhY2goYXJyYXlQcm9wcywgbWF5YmVBZGQpO1xuICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRnVuY3Rpb24pIGZvckVhY2goZnVuY1Byb3BzLCBtYXliZUFkZCk7XG4gICAgICBmb3JBbGxQcm9wcyhvYmosIG1heWJlQWRkKVxuICAgIH1cblxuICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQubGVuZ3RoKSB7XG4gICAgICAvLyBJZiB0aGlzIGlzIGEgcHJvcGVydHksIHNlZSBpZiBpdCBiZWxvbmdzIHRvIHNvbWUgb2JqZWN0IHdlIGNhblxuICAgICAgLy8gZmluZCBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cbiAgICAgIHZhciBvYmogPSBjb250ZXh0LnBvcCgpLCBiYXNlO1xuICAgICAgaWYgKG9iai50eXBlICYmIG9iai50eXBlLmluZGV4T2YoXCJ2YXJpYWJsZVwiKSA9PT0gMCkge1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFkZGl0aW9uYWxDb250ZXh0KVxuICAgICAgICAgIGJhc2UgPSBvcHRpb25zLmFkZGl0aW9uYWxDb250ZXh0W29iai5zdHJpbmddO1xuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy51c2VHbG9iYWxTY29wZSAhPT0gZmFsc2UpXG4gICAgICAgICAgYmFzZSA9IGJhc2UgfHwgZ2xvYmFsW29iai5zdHJpbmddO1xuICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGJhc2UgPSBcIlwiO1xuICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PSBcImF0b21cIikge1xuICAgICAgICBiYXNlID0gMTtcbiAgICAgIH0gZWxzZSBpZiAob2JqLnR5cGUgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGlmIChnbG9iYWwualF1ZXJ5ICE9IG51bGwgJiYgKG9iai5zdHJpbmcgPT0gJyQnIHx8IG9iai5zdHJpbmcgPT0gJ2pRdWVyeScpICYmXG4gICAgICAgICAgICAodHlwZW9mIGdsb2JhbC5qUXVlcnkgPT0gJ2Z1bmN0aW9uJykpXG4gICAgICAgICAgYmFzZSA9IGdsb2JhbC5qUXVlcnkoKTtcbiAgICAgICAgZWxzZSBpZiAoZ2xvYmFsLl8gIT0gbnVsbCAmJiAob2JqLnN0cmluZyA9PSAnXycpICYmICh0eXBlb2YgZ2xvYmFsLl8gPT0gJ2Z1bmN0aW9uJykpXG4gICAgICAgICAgYmFzZSA9IGdsb2JhbC5fKCk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoYmFzZSAhPSBudWxsICYmIGNvbnRleHQubGVuZ3RoKVxuICAgICAgICBiYXNlID0gYmFzZVtjb250ZXh0LnBvcCgpLnN0cmluZ107XG4gICAgICBpZiAoYmFzZSAhPSBudWxsKSBnYXRoZXJDb21wbGV0aW9ucyhiYXNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgbm90LCBqdXN0IGxvb2sgaW4gdGhlIGdsb2JhbCBvYmplY3QgYW5kIGFueSBsb2NhbCBzY29wZVxuICAgICAgLy8gKHJlYWRpbmcgaW50byBKUyBtb2RlIGludGVybmFscyB0byBnZXQgYXQgdGhlIGxvY2FsIGFuZCBnbG9iYWwgdmFyaWFibGVzKVxuICAgICAgZm9yICh2YXIgdiA9IHRva2VuLnN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dCkgbWF5YmVBZGQodi5uYW1lKTtcbiAgICAgIGZvciAodmFyIHYgPSB0b2tlbi5zdGF0ZS5nbG9iYWxWYXJzOyB2OyB2ID0gdi5uZXh0KSBtYXliZUFkZCh2Lm5hbWUpO1xuICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudXNlR2xvYmFsU2NvcGUgIT09IGZhbHNlKVxuICAgICAgICBnYXRoZXJDb21wbGV0aW9ucyhnbG9iYWwpO1xuICAgICAgZm9yRWFjaChrZXl3b3JkcywgbWF5YmVBZGQpO1xuICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cbn0pO1xuIiwiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRVxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCIpKTtcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgLy8gQU1EXG4gICAgZGVmaW5lKFtcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgSElOVF9FTEVNRU5UX0NMQVNTICAgICAgICA9IFwiQ29kZU1pcnJvci1oaW50XCI7XG4gIHZhciBBQ1RJVkVfSElOVF9FTEVNRU5UX0NMQVNTID0gXCJDb2RlTWlycm9yLWhpbnQtYWN0aXZlXCI7XG5cbiAgLy8gVGhpcyBpcyB0aGUgb2xkIGludGVyZmFjZSwga2VwdCBhcm91bmQgZm9yIG5vdyB0byBzdGF5XG4gIC8vIGJhY2t3YXJkcy1jb21wYXRpYmxlLlxuICBDb2RlTWlycm9yLnNob3dIaW50ID0gZnVuY3Rpb24oY20sIGdldEhpbnRzLCBvcHRpb25zKSB7XG4gICAgaWYgKCFnZXRIaW50cykgcmV0dXJuIGNtLnNob3dIaW50KG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYXN5bmMpIGdldEhpbnRzLmFzeW5jID0gdHJ1ZTtcbiAgICB2YXIgbmV3T3B0cyA9IHtoaW50OiBnZXRIaW50c307XG4gICAgaWYgKG9wdGlvbnMpIGZvciAodmFyIHByb3AgaW4gb3B0aW9ucykgbmV3T3B0c1twcm9wXSA9IG9wdGlvbnNbcHJvcF07XG4gICAgcmV0dXJuIGNtLnNob3dIaW50KG5ld09wdHMpO1xuICB9O1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKFwic2hvd0hpbnRcIiwgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnModGhpcywgdGhpcy5nZXRDdXJzb3IoXCJzdGFydFwiKSwgb3B0aW9ucyk7XG4gICAgdmFyIHNlbGVjdGlvbnMgPSB0aGlzLmxpc3RTZWxlY3Rpb25zKClcbiAgICBpZiAoc2VsZWN0aW9ucy5sZW5ndGggPiAxKSByZXR1cm47XG4gICAgLy8gQnkgZGVmYXVsdCwgZG9uJ3QgYWxsb3cgY29tcGxldGlvbiB3aGVuIHNvbWV0aGluZyBpcyBzZWxlY3RlZC5cbiAgICAvLyBBIGhpbnQgZnVuY3Rpb24gY2FuIGhhdmUgYSBgc3VwcG9ydHNTZWxlY3Rpb25gIHByb3BlcnR5IHRvXG4gICAgLy8gaW5kaWNhdGUgdGhhdCBpdCBjYW4gaGFuZGxlIHNlbGVjdGlvbnMuXG4gICAgaWYgKHRoaXMuc29tZXRoaW5nU2VsZWN0ZWQoKSkge1xuICAgICAgaWYgKCFvcHRpb25zLmhpbnQuc3VwcG9ydHNTZWxlY3Rpb24pIHJldHVybjtcbiAgICAgIC8vIERvbid0IHRyeSB3aXRoIGNyb3NzLWxpbmUgc2VsZWN0aW9uc1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoc2VsZWN0aW9uc1tpXS5oZWFkLmxpbmUgIT0gc2VsZWN0aW9uc1tpXS5hbmNob3IubGluZSkgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLmNvbXBsZXRpb25BY3RpdmUpIHRoaXMuc3RhdGUuY29tcGxldGlvbkFjdGl2ZS5jbG9zZSgpO1xuICAgIHZhciBjb21wbGV0aW9uID0gdGhpcy5zdGF0ZS5jb21wbGV0aW9uQWN0aXZlID0gbmV3IENvbXBsZXRpb24odGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKCFjb21wbGV0aW9uLm9wdGlvbnMuaGludCkgcmV0dXJuO1xuXG4gICAgQ29kZU1pcnJvci5zaWduYWwodGhpcywgXCJzdGFydENvbXBsZXRpb25cIiwgdGhpcyk7XG4gICAgY29tcGxldGlvbi51cGRhdGUodHJ1ZSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIENvbXBsZXRpb24oY20sIG9wdGlvbnMpIHtcbiAgICB0aGlzLmNtID0gY207XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLndpZGdldCA9IG51bGw7XG4gICAgdGhpcy5kZWJvdW5jZSA9IDA7XG4gICAgdGhpcy50aWNrID0gMDtcbiAgICB0aGlzLnN0YXJ0UG9zID0gdGhpcy5jbS5nZXRDdXJzb3IoXCJzdGFydFwiKTtcbiAgICB0aGlzLnN0YXJ0TGVuID0gdGhpcy5jbS5nZXRMaW5lKHRoaXMuc3RhcnRQb3MubGluZSkubGVuZ3RoIC0gdGhpcy5jbS5nZXRTZWxlY3Rpb24oKS5sZW5ndGg7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgY20ub24oXCJjdXJzb3JBY3Rpdml0eVwiLCB0aGlzLmFjdGl2aXR5RnVuYyA9IGZ1bmN0aW9uKCkgeyBzZWxmLmN1cnNvckFjdGl2aXR5KCk7IH0pO1xuICB9XG5cbiAgdmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgZnVuY3Rpb24oZm4pIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChmbiwgMTAwMC82MCk7XG4gIH07XG4gIHZhciBjYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCBjbGVhclRpbWVvdXQ7XG5cbiAgQ29tcGxldGlvbi5wcm90b3R5cGUgPSB7XG4gICAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCF0aGlzLmFjdGl2ZSgpKSByZXR1cm47XG4gICAgICB0aGlzLmNtLnN0YXRlLmNvbXBsZXRpb25BY3RpdmUgPSBudWxsO1xuICAgICAgdGhpcy50aWNrID0gbnVsbDtcbiAgICAgIHRoaXMuY20ub2ZmKFwiY3Vyc29yQWN0aXZpdHlcIiwgdGhpcy5hY3Rpdml0eUZ1bmMpO1xuXG4gICAgICBpZiAodGhpcy53aWRnZXQgJiYgdGhpcy5kYXRhKSBDb2RlTWlycm9yLnNpZ25hbCh0aGlzLmRhdGEsIFwiY2xvc2VcIik7XG4gICAgICBpZiAodGhpcy53aWRnZXQpIHRoaXMud2lkZ2V0LmNsb3NlKCk7XG4gICAgICBDb2RlTWlycm9yLnNpZ25hbCh0aGlzLmNtLCBcImVuZENvbXBsZXRpb25cIiwgdGhpcy5jbSk7XG4gICAgfSxcblxuICAgIGFjdGl2ZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbS5zdGF0ZS5jb21wbGV0aW9uQWN0aXZlID09IHRoaXM7XG4gICAgfSxcblxuICAgIHBpY2s6IGZ1bmN0aW9uKGRhdGEsIGkpIHtcbiAgICAgIHZhciBjb21wbGV0aW9uID0gZGF0YS5saXN0W2ldO1xuICAgICAgaWYgKGNvbXBsZXRpb24uaGludCkgY29tcGxldGlvbi5oaW50KHRoaXMuY20sIGRhdGEsIGNvbXBsZXRpb24pO1xuICAgICAgZWxzZSB0aGlzLmNtLnJlcGxhY2VSYW5nZShnZXRUZXh0KGNvbXBsZXRpb24pLCBjb21wbGV0aW9uLmZyb20gfHwgZGF0YS5mcm9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uLnRvIHx8IGRhdGEudG8sIFwiY29tcGxldGVcIik7XG4gICAgICBDb2RlTWlycm9yLnNpZ25hbChkYXRhLCBcInBpY2tcIiwgY29tcGxldGlvbik7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfSxcblxuICAgIGN1cnNvckFjdGl2aXR5OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLmRlYm91bmNlKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZGVib3VuY2UpO1xuICAgICAgICB0aGlzLmRlYm91bmNlID0gMDtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvcyA9IHRoaXMuY20uZ2V0Q3Vyc29yKCksIGxpbmUgPSB0aGlzLmNtLmdldExpbmUocG9zLmxpbmUpO1xuICAgICAgaWYgKHBvcy5saW5lICE9IHRoaXMuc3RhcnRQb3MubGluZSB8fCBsaW5lLmxlbmd0aCAtIHBvcy5jaCAhPSB0aGlzLnN0YXJ0TGVuIC0gdGhpcy5zdGFydFBvcy5jaCB8fFxuICAgICAgICAgIHBvcy5jaCA8IHRoaXMuc3RhcnRQb3MuY2ggfHwgdGhpcy5jbS5zb21ldGhpbmdTZWxlY3RlZCgpIHx8XG4gICAgICAgICAgKHBvcy5jaCAmJiB0aGlzLm9wdGlvbnMuY2xvc2VDaGFyYWN0ZXJzLnRlc3QobGluZS5jaGFyQXQocG9zLmNoIC0gMSkpKSkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuZGVib3VuY2UgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7c2VsZi51cGRhdGUoKTt9KTtcbiAgICAgICAgaWYgKHRoaXMud2lkZ2V0KSB0aGlzLndpZGdldC5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHVwZGF0ZTogZnVuY3Rpb24oZmlyc3QpIHtcbiAgICAgIGlmICh0aGlzLnRpY2sgPT0gbnVsbCkgcmV0dXJuXG4gICAgICB2YXIgc2VsZiA9IHRoaXMsIG15VGljayA9ICsrdGhpcy50aWNrXG4gICAgICBmZXRjaEhpbnRzKHRoaXMub3B0aW9ucy5oaW50LCB0aGlzLmNtLCB0aGlzLm9wdGlvbnMsIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgaWYgKHNlbGYudGljayA9PSBteVRpY2spIHNlbGYuZmluaXNoVXBkYXRlKGRhdGEsIGZpcnN0KVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgZmluaXNoVXBkYXRlOiBmdW5jdGlvbihkYXRhLCBmaXJzdCkge1xuICAgICAgaWYgKHRoaXMuZGF0YSkgQ29kZU1pcnJvci5zaWduYWwodGhpcy5kYXRhLCBcInVwZGF0ZVwiKTtcblxuICAgICAgdmFyIHBpY2tlZCA9ICh0aGlzLndpZGdldCAmJiB0aGlzLndpZGdldC5waWNrZWQpIHx8IChmaXJzdCAmJiB0aGlzLm9wdGlvbnMuY29tcGxldGVTaW5nbGUpO1xuICAgICAgaWYgKHRoaXMud2lkZ2V0KSB0aGlzLndpZGdldC5jbG9zZSgpO1xuXG4gICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuXG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmxpc3QubGVuZ3RoKSB7XG4gICAgICAgIGlmIChwaWNrZWQgJiYgZGF0YS5saXN0Lmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgdGhpcy5waWNrKGRhdGEsIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMud2lkZ2V0ID0gbmV3IFdpZGdldCh0aGlzLCBkYXRhKTtcbiAgICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChkYXRhLCBcInNob3duXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHBhcnNlT3B0aW9ucyhjbSwgcG9zLCBvcHRpb25zKSB7XG4gICAgdmFyIGVkaXRvciA9IGNtLm9wdGlvbnMuaGludE9wdGlvbnM7XG4gICAgdmFyIG91dCA9IHt9O1xuICAgIGZvciAodmFyIHByb3AgaW4gZGVmYXVsdE9wdGlvbnMpIG91dFtwcm9wXSA9IGRlZmF1bHRPcHRpb25zW3Byb3BdO1xuICAgIGlmIChlZGl0b3IpIGZvciAodmFyIHByb3AgaW4gZWRpdG9yKVxuICAgICAgaWYgKGVkaXRvcltwcm9wXSAhPT0gdW5kZWZpbmVkKSBvdXRbcHJvcF0gPSBlZGl0b3JbcHJvcF07XG4gICAgaWYgKG9wdGlvbnMpIGZvciAodmFyIHByb3AgaW4gb3B0aW9ucylcbiAgICAgIGlmIChvcHRpb25zW3Byb3BdICE9PSB1bmRlZmluZWQpIG91dFtwcm9wXSA9IG9wdGlvbnNbcHJvcF07XG4gICAgaWYgKG91dC5oaW50LnJlc29sdmUpIG91dC5oaW50ID0gb3V0LmhpbnQucmVzb2x2ZShjbSwgcG9zKVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUZXh0KGNvbXBsZXRpb24pIHtcbiAgICBpZiAodHlwZW9mIGNvbXBsZXRpb24gPT0gXCJzdHJpbmdcIikgcmV0dXJuIGNvbXBsZXRpb247XG4gICAgZWxzZSByZXR1cm4gY29tcGxldGlvbi50ZXh0O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRLZXlNYXAoY29tcGxldGlvbiwgaGFuZGxlKSB7XG4gICAgdmFyIGJhc2VNYXAgPSB7XG4gICAgICBVcDogZnVuY3Rpb24oKSB7aGFuZGxlLm1vdmVGb2N1cygtMSk7fSxcbiAgICAgIERvd246IGZ1bmN0aW9uKCkge2hhbmRsZS5tb3ZlRm9jdXMoMSk7fSxcbiAgICAgIFBhZ2VVcDogZnVuY3Rpb24oKSB7aGFuZGxlLm1vdmVGb2N1cygtaGFuZGxlLm1lbnVTaXplKCkgKyAxLCB0cnVlKTt9LFxuICAgICAgUGFnZURvd246IGZ1bmN0aW9uKCkge2hhbmRsZS5tb3ZlRm9jdXMoaGFuZGxlLm1lbnVTaXplKCkgLSAxLCB0cnVlKTt9LFxuICAgICAgSG9tZTogZnVuY3Rpb24oKSB7aGFuZGxlLnNldEZvY3VzKDApO30sXG4gICAgICBFbmQ6IGZ1bmN0aW9uKCkge2hhbmRsZS5zZXRGb2N1cyhoYW5kbGUubGVuZ3RoIC0gMSk7fSxcbiAgICAgIEVudGVyOiBoYW5kbGUucGljayxcbiAgICAgIFRhYjogaGFuZGxlLnBpY2ssXG4gICAgICBFc2M6IGhhbmRsZS5jbG9zZVxuICAgIH07XG4gICAgdmFyIGN1c3RvbSA9IGNvbXBsZXRpb24ub3B0aW9ucy5jdXN0b21LZXlzO1xuICAgIHZhciBvdXJNYXAgPSBjdXN0b20gPyB7fSA6IGJhc2VNYXA7XG4gICAgZnVuY3Rpb24gYWRkQmluZGluZyhrZXksIHZhbCkge1xuICAgICAgdmFyIGJvdW5kO1xuICAgICAgaWYgKHR5cGVvZiB2YWwgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgYm91bmQgPSBmdW5jdGlvbihjbSkgeyByZXR1cm4gdmFsKGNtLCBoYW5kbGUpOyB9O1xuICAgICAgLy8gVGhpcyBtZWNoYW5pc20gaXMgZGVwcmVjYXRlZFxuICAgICAgZWxzZSBpZiAoYmFzZU1hcC5oYXNPd25Qcm9wZXJ0eSh2YWwpKVxuICAgICAgICBib3VuZCA9IGJhc2VNYXBbdmFsXTtcbiAgICAgIGVsc2VcbiAgICAgICAgYm91bmQgPSB2YWw7XG4gICAgICBvdXJNYXBba2V5XSA9IGJvdW5kO1xuICAgIH1cbiAgICBpZiAoY3VzdG9tKVxuICAgICAgZm9yICh2YXIga2V5IGluIGN1c3RvbSkgaWYgKGN1c3RvbS5oYXNPd25Qcm9wZXJ0eShrZXkpKVxuICAgICAgICBhZGRCaW5kaW5nKGtleSwgY3VzdG9tW2tleV0pO1xuICAgIHZhciBleHRyYSA9IGNvbXBsZXRpb24ub3B0aW9ucy5leHRyYUtleXM7XG4gICAgaWYgKGV4dHJhKVxuICAgICAgZm9yICh2YXIga2V5IGluIGV4dHJhKSBpZiAoZXh0cmEuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgYWRkQmluZGluZyhrZXksIGV4dHJhW2tleV0pO1xuICAgIHJldHVybiBvdXJNYXA7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRIaW50RWxlbWVudChoaW50c0VsZW1lbnQsIGVsKSB7XG4gICAgd2hpbGUgKGVsICYmIGVsICE9IGhpbnRzRWxlbWVudCkge1xuICAgICAgaWYgKGVsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTElcIiAmJiBlbC5wYXJlbnROb2RlID09IGhpbnRzRWxlbWVudCkgcmV0dXJuIGVsO1xuICAgICAgZWwgPSBlbC5wYXJlbnROb2RlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIFdpZGdldChjb21wbGV0aW9uLCBkYXRhKSB7XG4gICAgdGhpcy5jb21wbGV0aW9uID0gY29tcGxldGlvbjtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucGlja2VkID0gZmFsc2U7XG4gICAgdmFyIHdpZGdldCA9IHRoaXMsIGNtID0gY29tcGxldGlvbi5jbTtcblxuICAgIHZhciBoaW50cyA9IHRoaXMuaGludHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidWxcIik7XG4gICAgaGludHMuY2xhc3NOYW1lID0gXCJDb2RlTWlycm9yLWhpbnRzXCI7XG4gICAgdGhpcy5zZWxlY3RlZEhpbnQgPSBkYXRhLnNlbGVjdGVkSGludCB8fCAwO1xuXG4gICAgdmFyIGNvbXBsZXRpb25zID0gZGF0YS5saXN0O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcGxldGlvbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBlbHQgPSBoaW50cy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIikpLCBjdXIgPSBjb21wbGV0aW9uc1tpXTtcbiAgICAgIHZhciBjbGFzc05hbWUgPSBISU5UX0VMRU1FTlRfQ0xBU1MgKyAoaSAhPSB0aGlzLnNlbGVjdGVkSGludCA/IFwiXCIgOiBcIiBcIiArIEFDVElWRV9ISU5UX0VMRU1FTlRfQ0xBU1MpO1xuICAgICAgaWYgKGN1ci5jbGFzc05hbWUgIT0gbnVsbCkgY2xhc3NOYW1lID0gY3VyLmNsYXNzTmFtZSArIFwiIFwiICsgY2xhc3NOYW1lO1xuICAgICAgZWx0LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgIGlmIChjdXIucmVuZGVyKSBjdXIucmVuZGVyKGVsdCwgZGF0YSwgY3VyKTtcbiAgICAgIGVsc2UgZWx0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGN1ci5kaXNwbGF5VGV4dCB8fCBnZXRUZXh0KGN1cikpKTtcbiAgICAgIGVsdC5oaW50SWQgPSBpO1xuICAgIH1cblxuICAgIHZhciBwb3MgPSBjbS5jdXJzb3JDb29yZHMoY29tcGxldGlvbi5vcHRpb25zLmFsaWduV2l0aFdvcmQgPyBkYXRhLmZyb20gOiBudWxsKTtcbiAgICB2YXIgbGVmdCA9IHBvcy5sZWZ0LCB0b3AgPSBwb3MuYm90dG9tLCBiZWxvdyA9IHRydWU7XG4gICAgaGludHMuc3R5bGUubGVmdCA9IGxlZnQgKyBcInB4XCI7XG4gICAgaGludHMuc3R5bGUudG9wID0gdG9wICsgXCJweFwiO1xuICAgIC8vIElmIHdlJ3JlIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4sIHRoZW4gd2Ugd2FudCB0aGUgbWVudSB0byBhcHBlYXIgb24gdGhlIGxlZnQgb2YgdGhlIGN1cnNvci5cbiAgICB2YXIgd2luVyA9IHdpbmRvdy5pbm5lcldpZHRoIHx8IE1hdGgubWF4KGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGgsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCk7XG4gICAgdmFyIHdpbkggPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgTWF0aC5tYXgoZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpO1xuICAgIChjb21wbGV0aW9uLm9wdGlvbnMuY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKGhpbnRzKTtcbiAgICB2YXIgYm94ID0gaGludHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIG92ZXJsYXBZID0gYm94LmJvdHRvbSAtIHdpbkg7XG4gICAgdmFyIHNjcm9sbHMgPSBoaW50cy5zY3JvbGxIZWlnaHQgPiBoaW50cy5jbGllbnRIZWlnaHQgKyAxXG4gICAgdmFyIHN0YXJ0U2Nyb2xsID0gY20uZ2V0U2Nyb2xsSW5mbygpO1xuXG4gICAgaWYgKG92ZXJsYXBZID4gMCkge1xuICAgICAgdmFyIGhlaWdodCA9IGJveC5ib3R0b20gLSBib3gudG9wLCBjdXJUb3AgPSBwb3MudG9wIC0gKHBvcy5ib3R0b20gLSBib3gudG9wKTtcbiAgICAgIGlmIChjdXJUb3AgLSBoZWlnaHQgPiAwKSB7IC8vIEZpdHMgYWJvdmUgY3Vyc29yXG4gICAgICAgIGhpbnRzLnN0eWxlLnRvcCA9ICh0b3AgPSBwb3MudG9wIC0gaGVpZ2h0KSArIFwicHhcIjtcbiAgICAgICAgYmVsb3cgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0ID4gd2luSCkge1xuICAgICAgICBoaW50cy5zdHlsZS5oZWlnaHQgPSAod2luSCAtIDUpICsgXCJweFwiO1xuICAgICAgICBoaW50cy5zdHlsZS50b3AgPSAodG9wID0gcG9zLmJvdHRvbSAtIGJveC50b3ApICsgXCJweFwiO1xuICAgICAgICB2YXIgY3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7XG4gICAgICAgIGlmIChkYXRhLmZyb20uY2ggIT0gY3Vyc29yLmNoKSB7XG4gICAgICAgICAgcG9zID0gY20uY3Vyc29yQ29vcmRzKGN1cnNvcik7XG4gICAgICAgICAgaGludHMuc3R5bGUubGVmdCA9IChsZWZ0ID0gcG9zLmxlZnQpICsgXCJweFwiO1xuICAgICAgICAgIGJveCA9IGhpbnRzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvdmVybGFwWCA9IGJveC5yaWdodCAtIHdpblc7XG4gICAgaWYgKG92ZXJsYXBYID4gMCkge1xuICAgICAgaWYgKGJveC5yaWdodCAtIGJveC5sZWZ0ID4gd2luVykge1xuICAgICAgICBoaW50cy5zdHlsZS53aWR0aCA9ICh3aW5XIC0gNSkgKyBcInB4XCI7XG4gICAgICAgIG92ZXJsYXBYIC09IChib3gucmlnaHQgLSBib3gubGVmdCkgLSB3aW5XO1xuICAgICAgfVxuICAgICAgaGludHMuc3R5bGUubGVmdCA9IChsZWZ0ID0gcG9zLmxlZnQgLSBvdmVybGFwWCkgKyBcInB4XCI7XG4gICAgfVxuICAgIGlmIChzY3JvbGxzKSBmb3IgKHZhciBub2RlID0gaGludHMuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpXG4gICAgICBub2RlLnN0eWxlLnBhZGRpbmdSaWdodCA9IGNtLmRpc3BsYXkubmF0aXZlQmFyV2lkdGggKyBcInB4XCJcblxuICAgIGNtLmFkZEtleU1hcCh0aGlzLmtleU1hcCA9IGJ1aWxkS2V5TWFwKGNvbXBsZXRpb24sIHtcbiAgICAgIG1vdmVGb2N1czogZnVuY3Rpb24obiwgYXZvaWRXcmFwKSB7IHdpZGdldC5jaGFuZ2VBY3RpdmUod2lkZ2V0LnNlbGVjdGVkSGludCArIG4sIGF2b2lkV3JhcCk7IH0sXG4gICAgICBzZXRGb2N1czogZnVuY3Rpb24obikgeyB3aWRnZXQuY2hhbmdlQWN0aXZlKG4pOyB9LFxuICAgICAgbWVudVNpemU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gd2lkZ2V0LnNjcmVlbkFtb3VudCgpOyB9LFxuICAgICAgbGVuZ3RoOiBjb21wbGV0aW9ucy5sZW5ndGgsXG4gICAgICBjbG9zZTogZnVuY3Rpb24oKSB7IGNvbXBsZXRpb24uY2xvc2UoKTsgfSxcbiAgICAgIHBpY2s6IGZ1bmN0aW9uKCkgeyB3aWRnZXQucGljaygpOyB9LFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pKTtcblxuICAgIGlmIChjb21wbGV0aW9uLm9wdGlvbnMuY2xvc2VPblVuZm9jdXMpIHtcbiAgICAgIHZhciBjbG9zaW5nT25CbHVyO1xuICAgICAgY20ub24oXCJibHVyXCIsIHRoaXMub25CbHVyID0gZnVuY3Rpb24oKSB7IGNsb3NpbmdPbkJsdXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjb21wbGV0aW9uLmNsb3NlKCk7IH0sIDEwMCk7IH0pO1xuICAgICAgY20ub24oXCJmb2N1c1wiLCB0aGlzLm9uRm9jdXMgPSBmdW5jdGlvbigpIHsgY2xlYXJUaW1lb3V0KGNsb3NpbmdPbkJsdXIpOyB9KTtcbiAgICB9XG5cbiAgICBjbS5vbihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY3VyU2Nyb2xsID0gY20uZ2V0U2Nyb2xsSW5mbygpLCBlZGl0b3IgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIG5ld1RvcCA9IHRvcCArIHN0YXJ0U2Nyb2xsLnRvcCAtIGN1clNjcm9sbC50b3A7XG4gICAgICB2YXIgcG9pbnQgPSBuZXdUb3AgLSAod2luZG93LnBhZ2VZT2Zmc2V0IHx8IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wKTtcbiAgICAgIGlmICghYmVsb3cpIHBvaW50ICs9IGhpbnRzLm9mZnNldEhlaWdodDtcbiAgICAgIGlmIChwb2ludCA8PSBlZGl0b3IudG9wIHx8IHBvaW50ID49IGVkaXRvci5ib3R0b20pIHJldHVybiBjb21wbGV0aW9uLmNsb3NlKCk7XG4gICAgICBoaW50cy5zdHlsZS50b3AgPSBuZXdUb3AgKyBcInB4XCI7XG4gICAgICBoaW50cy5zdHlsZS5sZWZ0ID0gKGxlZnQgKyBzdGFydFNjcm9sbC5sZWZ0IC0gY3VyU2Nyb2xsLmxlZnQpICsgXCJweFwiO1xuICAgIH0pO1xuXG4gICAgQ29kZU1pcnJvci5vbihoaW50cywgXCJkYmxjbGlja1wiLCBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgdCA9IGdldEhpbnRFbGVtZW50KGhpbnRzLCBlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQpO1xuICAgICAgaWYgKHQgJiYgdC5oaW50SWQgIT0gbnVsbCkge3dpZGdldC5jaGFuZ2VBY3RpdmUodC5oaW50SWQpOyB3aWRnZXQucGljaygpO31cbiAgICB9KTtcblxuICAgIENvZGVNaXJyb3Iub24oaGludHMsIFwiY2xpY2tcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIHQgPSBnZXRIaW50RWxlbWVudChoaW50cywgZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50KTtcbiAgICAgIGlmICh0ICYmIHQuaGludElkICE9IG51bGwpIHtcbiAgICAgICAgd2lkZ2V0LmNoYW5nZUFjdGl2ZSh0LmhpbnRJZCk7XG4gICAgICAgIGlmIChjb21wbGV0aW9uLm9wdGlvbnMuY29tcGxldGVPblNpbmdsZUNsaWNrKSB3aWRnZXQucGljaygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgQ29kZU1pcnJvci5vbihoaW50cywgXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Y20uZm9jdXMoKTt9LCAyMCk7XG4gICAgfSk7XG5cbiAgICBDb2RlTWlycm9yLnNpZ25hbChkYXRhLCBcInNlbGVjdFwiLCBjb21wbGV0aW9uc1t0aGlzLnNlbGVjdGVkSGludF0sIGhpbnRzLmNoaWxkTm9kZXNbdGhpcy5zZWxlY3RlZEhpbnRdKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIFdpZGdldC5wcm90b3R5cGUgPSB7XG4gICAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY29tcGxldGlvbi53aWRnZXQgIT0gdGhpcykgcmV0dXJuO1xuICAgICAgdGhpcy5jb21wbGV0aW9uLndpZGdldCA9IG51bGw7XG4gICAgICB0aGlzLmhpbnRzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5oaW50cyk7XG4gICAgICB0aGlzLmNvbXBsZXRpb24uY20ucmVtb3ZlS2V5TWFwKHRoaXMua2V5TWFwKTtcblxuICAgICAgdmFyIGNtID0gdGhpcy5jb21wbGV0aW9uLmNtO1xuICAgICAgaWYgKHRoaXMuY29tcGxldGlvbi5vcHRpb25zLmNsb3NlT25VbmZvY3VzKSB7XG4gICAgICAgIGNtLm9mZihcImJsdXJcIiwgdGhpcy5vbkJsdXIpO1xuICAgICAgICBjbS5vZmYoXCJmb2N1c1wiLCB0aGlzLm9uRm9jdXMpO1xuICAgICAgfVxuICAgICAgY20ub2ZmKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuY29tcGxldGlvbi5jbS5yZW1vdmVLZXlNYXAodGhpcy5rZXlNYXApO1xuICAgICAgdmFyIHdpZGdldCA9IHRoaXM7XG4gICAgICB0aGlzLmtleU1hcCA9IHtFbnRlcjogZnVuY3Rpb24oKSB7IHdpZGdldC5waWNrZWQgPSB0cnVlOyB9fTtcbiAgICAgIHRoaXMuY29tcGxldGlvbi5jbS5hZGRLZXlNYXAodGhpcy5rZXlNYXApO1xuICAgIH0sXG5cbiAgICBwaWNrOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuY29tcGxldGlvbi5waWNrKHRoaXMuZGF0YSwgdGhpcy5zZWxlY3RlZEhpbnQpO1xuICAgIH0sXG5cbiAgICBjaGFuZ2VBY3RpdmU6IGZ1bmN0aW9uKGksIGF2b2lkV3JhcCkge1xuICAgICAgaWYgKGkgPj0gdGhpcy5kYXRhLmxpc3QubGVuZ3RoKVxuICAgICAgICBpID0gYXZvaWRXcmFwID8gdGhpcy5kYXRhLmxpc3QubGVuZ3RoIC0gMSA6IDA7XG4gICAgICBlbHNlIGlmIChpIDwgMClcbiAgICAgICAgaSA9IGF2b2lkV3JhcCA/IDAgIDogdGhpcy5kYXRhLmxpc3QubGVuZ3RoIC0gMTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSGludCA9PSBpKSByZXR1cm47XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuaGludHMuY2hpbGROb2Rlc1t0aGlzLnNlbGVjdGVkSGludF07XG4gICAgICBub2RlLmNsYXNzTmFtZSA9IG5vZGUuY2xhc3NOYW1lLnJlcGxhY2UoXCIgXCIgKyBBQ1RJVkVfSElOVF9FTEVNRU5UX0NMQVNTLCBcIlwiKTtcbiAgICAgIG5vZGUgPSB0aGlzLmhpbnRzLmNoaWxkTm9kZXNbdGhpcy5zZWxlY3RlZEhpbnQgPSBpXTtcbiAgICAgIG5vZGUuY2xhc3NOYW1lICs9IFwiIFwiICsgQUNUSVZFX0hJTlRfRUxFTUVOVF9DTEFTUztcbiAgICAgIGlmIChub2RlLm9mZnNldFRvcCA8IHRoaXMuaGludHMuc2Nyb2xsVG9wKVxuICAgICAgICB0aGlzLmhpbnRzLnNjcm9sbFRvcCA9IG5vZGUub2Zmc2V0VG9wIC0gMztcbiAgICAgIGVsc2UgaWYgKG5vZGUub2Zmc2V0VG9wICsgbm9kZS5vZmZzZXRIZWlnaHQgPiB0aGlzLmhpbnRzLnNjcm9sbFRvcCArIHRoaXMuaGludHMuY2xpZW50SGVpZ2h0KVxuICAgICAgICB0aGlzLmhpbnRzLnNjcm9sbFRvcCA9IG5vZGUub2Zmc2V0VG9wICsgbm9kZS5vZmZzZXRIZWlnaHQgLSB0aGlzLmhpbnRzLmNsaWVudEhlaWdodCArIDM7XG4gICAgICBDb2RlTWlycm9yLnNpZ25hbCh0aGlzLmRhdGEsIFwic2VsZWN0XCIsIHRoaXMuZGF0YS5saXN0W3RoaXMuc2VsZWN0ZWRIaW50XSwgbm9kZSk7XG4gICAgfSxcblxuICAgIHNjcmVlbkFtb3VudDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLmhpbnRzLmNsaWVudEhlaWdodCAvIHRoaXMuaGludHMuZmlyc3RDaGlsZC5vZmZzZXRIZWlnaHQpIHx8IDE7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGFwcGxpY2FibGVIZWxwZXJzKGNtLCBoZWxwZXJzKSB7XG4gICAgaWYgKCFjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSByZXR1cm4gaGVscGVyc1xuICAgIHZhciByZXN1bHQgPSBbXVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGVscGVycy5sZW5ndGg7IGkrKylcbiAgICAgIGlmIChoZWxwZXJzW2ldLnN1cHBvcnRzU2VsZWN0aW9uKSByZXN1bHQucHVzaChoZWxwZXJzW2ldKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoSGludHMoaGludCwgY20sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGhpbnQuYXN5bmMpIHtcbiAgICAgIGhpbnQoY20sIGNhbGxiYWNrLCBvcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0ID0gaGludChjbSwgb3B0aW9ucylcbiAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnRoZW4pIHJlc3VsdC50aGVuKGNhbGxiYWNrKVxuICAgICAgZWxzZSBjYWxsYmFjayhyZXN1bHQpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZUF1dG9IaW50cyhjbSwgcG9zKSB7XG4gICAgdmFyIGhlbHBlcnMgPSBjbS5nZXRIZWxwZXJzKHBvcywgXCJoaW50XCIpLCB3b3Jkc1xuICAgIGlmIChoZWxwZXJzLmxlbmd0aCkge1xuICAgICAgdmFyIHJlc29sdmVkID0gZnVuY3Rpb24oY20sIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBhcHAgPSBhcHBsaWNhYmxlSGVscGVycyhjbSwgaGVscGVycyk7XG4gICAgICAgIGZ1bmN0aW9uIHJ1bihpKSB7XG4gICAgICAgICAgaWYgKGkgPT0gYXBwLmxlbmd0aCkgcmV0dXJuIGNhbGxiYWNrKG51bGwpXG4gICAgICAgICAgZmV0Y2hIaW50cyhhcHBbaV0sIGNtLCBvcHRpb25zLCBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lmxpc3QubGVuZ3RoID4gMCkgY2FsbGJhY2socmVzdWx0KVxuICAgICAgICAgICAgZWxzZSBydW4oaSArIDEpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBydW4oMClcbiAgICAgIH1cbiAgICAgIHJlc29sdmVkLmFzeW5jID0gdHJ1ZVxuICAgICAgcmVzb2x2ZWQuc3VwcG9ydHNTZWxlY3Rpb24gPSB0cnVlXG4gICAgICByZXR1cm4gcmVzb2x2ZWRcbiAgICB9IGVsc2UgaWYgKHdvcmRzID0gY20uZ2V0SGVscGVyKGNtLmdldEN1cnNvcigpLCBcImhpbnRXb3Jkc1wiKSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7IHJldHVybiBDb2RlTWlycm9yLmhpbnQuZnJvbUxpc3QoY20sIHt3b3Jkczogd29yZHN9KSB9XG4gICAgfSBlbHNlIGlmIChDb2RlTWlycm9yLmhpbnQuYW55d29yZCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNtLCBvcHRpb25zKSB7IHJldHVybiBDb2RlTWlycm9yLmhpbnQuYW55d29yZChjbSwgb3B0aW9ucykgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7fVxuICAgIH1cbiAgfVxuXG4gIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoXCJoaW50XCIsIFwiYXV0b1wiLCB7XG4gICAgcmVzb2x2ZTogcmVzb2x2ZUF1dG9IaW50c1xuICB9KTtcblxuICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKFwiaGludFwiLCBcImZyb21MaXN0XCIsIGZ1bmN0aW9uKGNtLCBvcHRpb25zKSB7XG4gICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpLCB0b2tlbiA9IGNtLmdldFRva2VuQXQoY3VyKVxuICAgIHZhciB0ZXJtLCBmcm9tID0gQ29kZU1pcnJvci5Qb3MoY3VyLmxpbmUsIHRva2VuLnN0YXJ0KSwgdG8gPSBjdXJcbiAgICBpZiAodG9rZW4uc3RhcnQgPCBjdXIuY2ggJiYgL1xcdy8udGVzdCh0b2tlbi5zdHJpbmcuY2hhckF0KGN1ci5jaCAtIHRva2VuLnN0YXJ0IC0gMSkpKSB7XG4gICAgICB0ZXJtID0gdG9rZW4uc3RyaW5nLnN1YnN0cigwLCBjdXIuY2ggLSB0b2tlbi5zdGFydClcbiAgICB9IGVsc2Uge1xuICAgICAgdGVybSA9IFwiXCJcbiAgICAgIGZyb20gPSBjdXJcbiAgICB9XG4gICAgdmFyIGZvdW5kID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLndvcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgd29yZCA9IG9wdGlvbnMud29yZHNbaV07XG4gICAgICBpZiAod29yZC5zbGljZSgwLCB0ZXJtLmxlbmd0aCkgPT0gdGVybSlcbiAgICAgICAgZm91bmQucHVzaCh3b3JkKTtcbiAgICB9XG5cbiAgICBpZiAoZm91bmQubGVuZ3RoKSByZXR1cm4ge2xpc3Q6IGZvdW5kLCBmcm9tOiBmcm9tLCB0bzogdG99O1xuICB9KTtcblxuICBDb2RlTWlycm9yLmNvbW1hbmRzLmF1dG9jb21wbGV0ZSA9IENvZGVNaXJyb3Iuc2hvd0hpbnQ7XG5cbiAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIGhpbnQ6IENvZGVNaXJyb3IuaGludC5hdXRvLFxuICAgIGNvbXBsZXRlU2luZ2xlOiB0cnVlLFxuICAgIGFsaWduV2l0aFdvcmQ6IHRydWUsXG4gICAgY2xvc2VDaGFyYWN0ZXJzOiAvW1xccygpXFxbXFxde307Oj4sXS8sXG4gICAgY2xvc2VPblVuZm9jdXM6IHRydWUsXG4gICAgY29tcGxldGVPblNpbmdsZUNsaWNrOiB0cnVlLFxuICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICBjdXN0b21LZXlzOiBudWxsLFxuICAgIGV4dHJhS2V5czogbnVsbFxuICB9O1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKFwiaGludE9wdGlvbnNcIiwgbnVsbCk7XG59KTtcbiIsIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cDovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuLy8gQmVjYXVzZSBzb21ldGltZXMgeW91IG5lZWQgdG8gbWFyayB0aGUgc2VsZWN0ZWQgKnRleHQqLlxuLy9cbi8vIEFkZHMgYW4gb3B0aW9uICdzdHlsZVNlbGVjdGVkVGV4dCcgd2hpY2gsIHdoZW4gZW5hYmxlZCwgZ2l2ZXNcbi8vIHNlbGVjdGVkIHRleHQgdGhlIENTUyBjbGFzcyBnaXZlbiBhcyBvcHRpb24gdmFsdWUsIG9yXG4vLyBcIkNvZGVNaXJyb3Itc2VsZWN0ZWR0ZXh0XCIgd2hlbiB0aGUgdmFsdWUgaXMgbm90IGEgc3RyaW5nLlxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCIpKTtcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgLy8gQU1EXG4gICAgZGVmaW5lKFtcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbihcInN0eWxlU2VsZWN0ZWRUZXh0XCIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBvbGQpIHtcbiAgICB2YXIgcHJldiA9IG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0O1xuICAgIGlmICh2YWwgJiYgIXByZXYpIHtcbiAgICAgIGNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbiA9IFtdO1xuICAgICAgY20uc3RhdGUubWFya2VkU2VsZWN0aW9uU3R5bGUgPSB0eXBlb2YgdmFsID09IFwic3RyaW5nXCIgPyB2YWwgOiBcIkNvZGVNaXJyb3Itc2VsZWN0ZWR0ZXh0XCI7XG4gICAgICByZXNldChjbSk7XG4gICAgICBjbS5vbihcImN1cnNvckFjdGl2aXR5XCIsIG9uQ3Vyc29yQWN0aXZpdHkpO1xuICAgICAgY20ub24oXCJjaGFuZ2VcIiwgb25DaGFuZ2UpO1xuICAgIH0gZWxzZSBpZiAoIXZhbCAmJiBwcmV2KSB7XG4gICAgICBjbS5vZmYoXCJjdXJzb3JBY3Rpdml0eVwiLCBvbkN1cnNvckFjdGl2aXR5KTtcbiAgICAgIGNtLm9mZihcImNoYW5nZVwiLCBvbkNoYW5nZSk7XG4gICAgICBjbGVhcihjbSk7XG4gICAgICBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb24gPSBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb25TdHlsZSA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiBvbkN1cnNvckFjdGl2aXR5KGNtKSB7XG4gICAgaWYgKGNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbilcbiAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsgdXBkYXRlKGNtKTsgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkNoYW5nZShjbSkge1xuICAgIGlmIChjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb24gJiYgY20uc3RhdGUubWFya2VkU2VsZWN0aW9uLmxlbmd0aClcbiAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsgY2xlYXIoY20pOyB9KTtcbiAgfVxuXG4gIHZhciBDSFVOS19TSVpFID0gODtcbiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zO1xuICB2YXIgY21wID0gQ29kZU1pcnJvci5jbXBQb3M7XG5cbiAgZnVuY3Rpb24gY292ZXJSYW5nZShjbSwgZnJvbSwgdG8sIGFkZEF0KSB7XG4gICAgaWYgKGNtcChmcm9tLCB0bykgPT0gMCkgcmV0dXJuO1xuICAgIHZhciBhcnJheSA9IGNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbjtcbiAgICB2YXIgY2xzID0gY20uc3RhdGUubWFya2VkU2VsZWN0aW9uU3R5bGU7XG4gICAgZm9yICh2YXIgbGluZSA9IGZyb20ubGluZTs7KSB7XG4gICAgICB2YXIgc3RhcnQgPSBsaW5lID09IGZyb20ubGluZSA/IGZyb20gOiBQb3MobGluZSwgMCk7XG4gICAgICB2YXIgZW5kTGluZSA9IGxpbmUgKyBDSFVOS19TSVpFLCBhdEVuZCA9IGVuZExpbmUgPj0gdG8ubGluZTtcbiAgICAgIHZhciBlbmQgPSBhdEVuZCA/IHRvIDogUG9zKGVuZExpbmUsIDApO1xuICAgICAgdmFyIG1hcmsgPSBjbS5tYXJrVGV4dChzdGFydCwgZW5kLCB7Y2xhc3NOYW1lOiBjbHN9KTtcbiAgICAgIGlmIChhZGRBdCA9PSBudWxsKSBhcnJheS5wdXNoKG1hcmspO1xuICAgICAgZWxzZSBhcnJheS5zcGxpY2UoYWRkQXQrKywgMCwgbWFyayk7XG4gICAgICBpZiAoYXRFbmQpIGJyZWFrO1xuICAgICAgbGluZSA9IGVuZExpbmU7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXIoY20pIHtcbiAgICB2YXIgYXJyYXkgPSBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb247XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkgYXJyYXlbaV0uY2xlYXIoKTtcbiAgICBhcnJheS5sZW5ndGggPSAwO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXQoY20pIHtcbiAgICBjbGVhcihjbSk7XG4gICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICBjb3ZlclJhbmdlKGNtLCByYW5nZXNbaV0uZnJvbSgpLCByYW5nZXNbaV0udG8oKSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUoY20pIHtcbiAgICBpZiAoIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHJldHVybiBjbGVhcihjbSk7XG4gICAgaWYgKGNtLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoID4gMSkgcmV0dXJuIHJlc2V0KGNtKTtcblxuICAgIHZhciBmcm9tID0gY20uZ2V0Q3Vyc29yKFwic3RhcnRcIiksIHRvID0gY20uZ2V0Q3Vyc29yKFwiZW5kXCIpO1xuXG4gICAgdmFyIGFycmF5ID0gY20uc3RhdGUubWFya2VkU2VsZWN0aW9uO1xuICAgIGlmICghYXJyYXkubGVuZ3RoKSByZXR1cm4gY292ZXJSYW5nZShjbSwgZnJvbSwgdG8pO1xuXG4gICAgdmFyIGNvdmVyU3RhcnQgPSBhcnJheVswXS5maW5kKCksIGNvdmVyRW5kID0gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV0uZmluZCgpO1xuICAgIGlmICghY292ZXJTdGFydCB8fCAhY292ZXJFbmQgfHwgdG8ubGluZSAtIGZyb20ubGluZSA8PSBDSFVOS19TSVpFIHx8XG4gICAgICAgIGNtcChmcm9tLCBjb3ZlckVuZC50bykgPj0gMCB8fCBjbXAodG8sIGNvdmVyU3RhcnQuZnJvbSkgPD0gMClcbiAgICAgIHJldHVybiByZXNldChjbSk7XG5cbiAgICB3aGlsZSAoY21wKGZyb20sIGNvdmVyU3RhcnQuZnJvbSkgPiAwKSB7XG4gICAgICBhcnJheS5zaGlmdCgpLmNsZWFyKCk7XG4gICAgICBjb3ZlclN0YXJ0ID0gYXJyYXlbMF0uZmluZCgpO1xuICAgIH1cbiAgICBpZiAoY21wKGZyb20sIGNvdmVyU3RhcnQuZnJvbSkgPCAwKSB7XG4gICAgICBpZiAoY292ZXJTdGFydC50by5saW5lIC0gZnJvbS5saW5lIDwgQ0hVTktfU0laRSkge1xuICAgICAgICBhcnJheS5zaGlmdCgpLmNsZWFyKCk7XG4gICAgICAgIGNvdmVyUmFuZ2UoY20sIGZyb20sIGNvdmVyU3RhcnQudG8sIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY292ZXJSYW5nZShjbSwgZnJvbSwgY292ZXJTdGFydC5mcm9tLCAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3aGlsZSAoY21wKHRvLCBjb3ZlckVuZC50bykgPCAwKSB7XG4gICAgICBhcnJheS5wb3AoKS5jbGVhcigpO1xuICAgICAgY292ZXJFbmQgPSBhcnJheVthcnJheS5sZW5ndGggLSAxXS5maW5kKCk7XG4gICAgfVxuICAgIGlmIChjbXAodG8sIGNvdmVyRW5kLnRvKSA+IDApIHtcbiAgICAgIGlmICh0by5saW5lIC0gY292ZXJFbmQuZnJvbS5saW5lIDwgQ0hVTktfU0laRSkge1xuICAgICAgICBhcnJheS5wb3AoKS5jbGVhcigpO1xuICAgICAgICBjb3ZlclJhbmdlKGNtLCBjb3ZlckVuZC5mcm9tLCB0byk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3ZlclJhbmdlKGNtLCBjb3ZlckVuZC50bywgdG8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG4iLCIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbi8vIFRoaXMgaXMgQ29kZU1pcnJvciAoaHR0cDovL2NvZGVtaXJyb3IubmV0KSwgYSBjb2RlIGVkaXRvclxuLy8gaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCBvbiB0b3Agb2YgdGhlIGJyb3dzZXIncyBET00uXG4vL1xuLy8gWW91IGNhbiBmaW5kIHNvbWUgdGVjaG5pY2FsIGJhY2tncm91bmQgZm9yIHNvbWUgb2YgdGhlIGNvZGUgYmVsb3dcbi8vIGF0IGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvYmxvZy8jY20taW50ZXJuYWxzIC5cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuXHQoZ2xvYmFsLkNvZGVNaXJyb3IgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbi8vIEtsdWRnZXMgZm9yIGJ1Z3MgYW5kIGJlaGF2aW9yIGRpZmZlcmVuY2VzIHRoYXQgY2FuJ3QgYmUgZmVhdHVyZVxuLy8gZGV0ZWN0ZWQgYXJlIGVuYWJsZWQgYmFzZWQgb24gdXNlckFnZW50IGV0YyBzbmlmZmluZy5cbnZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xudmFyIHBsYXRmb3JtID0gbmF2aWdhdG9yLnBsYXRmb3JtO1xuXG52YXIgZ2Vja28gPSAvZ2Vja29cXC9cXGQvaS50ZXN0KHVzZXJBZ2VudCk7XG52YXIgaWVfdXB0bzEwID0gL01TSUUgXFxkLy50ZXN0KHVzZXJBZ2VudCk7XG52YXIgaWVfMTF1cCA9IC9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyh1c2VyQWdlbnQpO1xudmFyIGVkZ2UgPSAvRWRnZVxcLyhcXGQrKS8uZXhlYyh1c2VyQWdlbnQpO1xudmFyIGllID0gaWVfdXB0bzEwIHx8IGllXzExdXAgfHwgZWRnZTtcbnZhciBpZV92ZXJzaW9uID0gaWUgJiYgKGllX3VwdG8xMCA/IGRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCA2IDogKyhlZGdlIHx8IGllXzExdXApWzFdKTtcbnZhciB3ZWJraXQgPSAhZWRnZSAmJiAvV2ViS2l0XFwvLy50ZXN0KHVzZXJBZ2VudCk7XG52YXIgcXR3ZWJraXQgPSB3ZWJraXQgJiYgL1F0XFwvXFxkK1xcLlxcZCsvLnRlc3QodXNlckFnZW50KTtcbnZhciBjaHJvbWUgPSAhZWRnZSAmJiAvQ2hyb21lXFwvLy50ZXN0KHVzZXJBZ2VudCk7XG52YXIgcHJlc3RvID0gL09wZXJhXFwvLy50ZXN0KHVzZXJBZ2VudCk7XG52YXIgc2FmYXJpID0gL0FwcGxlIENvbXB1dGVyLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpO1xudmFyIG1hY19nZU1vdW50YWluTGlvbiA9IC9NYWMgT1MgWCAxXFxkXFxEKFs4LTldfFxcZFxcZClcXEQvLnRlc3QodXNlckFnZW50KTtcbnZhciBwaGFudG9tID0gL1BoYW50b21KUy8udGVzdCh1c2VyQWdlbnQpO1xuXG52YXIgaW9zID0gIWVkZ2UgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KHVzZXJBZ2VudCkgJiYgL01vYmlsZVxcL1xcdysvLnRlc3QodXNlckFnZW50KTtcbnZhciBhbmRyb2lkID0gL0FuZHJvaWQvLnRlc3QodXNlckFnZW50KTtcbi8vIFRoaXMgaXMgd29lZnVsbHkgaW5jb21wbGV0ZS4gU3VnZ2VzdGlvbnMgZm9yIGFsdGVybmF0aXZlIG1ldGhvZHMgd2VsY29tZS5cbnZhciBtb2JpbGUgPSBpb3MgfHwgYW5kcm9pZCB8fCAvd2ViT1N8QmxhY2tCZXJyeXxPcGVyYSBNaW5pfE9wZXJhIE1vYml8SUVNb2JpbGUvaS50ZXN0KHVzZXJBZ2VudCk7XG52YXIgbWFjID0gaW9zIHx8IC9NYWMvLnRlc3QocGxhdGZvcm0pO1xudmFyIGNocm9tZU9TID0gL1xcYkNyT1NcXGIvLnRlc3QodXNlckFnZW50KTtcbnZhciB3aW5kb3dzID0gL3dpbi9pLnRlc3QocGxhdGZvcm0pO1xuXG52YXIgcHJlc3RvX3ZlcnNpb24gPSBwcmVzdG8gJiYgdXNlckFnZW50Lm1hdGNoKC9WZXJzaW9uXFwvKFxcZCpcXC5cXGQqKS8pO1xuaWYgKHByZXN0b192ZXJzaW9uKSB7IHByZXN0b192ZXJzaW9uID0gTnVtYmVyKHByZXN0b192ZXJzaW9uWzFdKTsgfVxuaWYgKHByZXN0b192ZXJzaW9uICYmIHByZXN0b192ZXJzaW9uID49IDE1KSB7IHByZXN0byA9IGZhbHNlOyB3ZWJraXQgPSB0cnVlOyB9XG4vLyBTb21lIGJyb3dzZXJzIHVzZSB0aGUgd3JvbmcgZXZlbnQgcHJvcGVydGllcyB0byBzaWduYWwgY21kL2N0cmwgb24gT1MgWFxudmFyIGZsaXBDdHJsQ21kID0gbWFjICYmIChxdHdlYmtpdCB8fCBwcmVzdG8gJiYgKHByZXN0b192ZXJzaW9uID09IG51bGwgfHwgcHJlc3RvX3ZlcnNpb24gPCAxMi4xMSkpO1xudmFyIGNhcHR1cmVSaWdodENsaWNrID0gZ2Vja28gfHwgKGllICYmIGllX3ZlcnNpb24gPj0gOSk7XG5cbmZ1bmN0aW9uIGNsYXNzVGVzdChjbHMpIHsgcmV0dXJuIG5ldyBSZWdFeHAoXCIoXnxcXFxccylcIiArIGNscyArIFwiKD86JHxcXFxccylcXFxccypcIikgfVxuXG52YXIgcm1DbGFzcyA9IGZ1bmN0aW9uKG5vZGUsIGNscykge1xuICB2YXIgY3VycmVudCA9IG5vZGUuY2xhc3NOYW1lO1xuICB2YXIgbWF0Y2ggPSBjbGFzc1Rlc3QoY2xzKS5leGVjKGN1cnJlbnQpO1xuICBpZiAobWF0Y2gpIHtcbiAgICB2YXIgYWZ0ZXIgPSBjdXJyZW50LnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICBub2RlLmNsYXNzTmFtZSA9IGN1cnJlbnQuc2xpY2UoMCwgbWF0Y2guaW5kZXgpICsgKGFmdGVyID8gbWF0Y2hbMV0gKyBhZnRlciA6IFwiXCIpO1xuICB9XG59O1xuXG5mdW5jdGlvbiByZW1vdmVDaGlsZHJlbihlKSB7XG4gIGZvciAodmFyIGNvdW50ID0gZS5jaGlsZE5vZGVzLmxlbmd0aDsgY291bnQgPiAwOyAtLWNvdW50KVxuICAgIHsgZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpOyB9XG4gIHJldHVybiBlXG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkcmVuQW5kQWRkKHBhcmVudCwgZSkge1xuICByZXR1cm4gcmVtb3ZlQ2hpbGRyZW4ocGFyZW50KS5hcHBlbmRDaGlsZChlKVxufVxuXG5mdW5jdGlvbiBlbHQodGFnLCBjb250ZW50LCBjbGFzc05hbWUsIHN0eWxlKSB7XG4gIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICBpZiAoY2xhc3NOYW1lKSB7IGUuY2xhc3NOYW1lID0gY2xhc3NOYW1lOyB9XG4gIGlmIChzdHlsZSkgeyBlLnN0eWxlLmNzc1RleHQgPSBzdHlsZTsgfVxuICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gXCJzdHJpbmdcIikgeyBlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTsgfVxuICBlbHNlIGlmIChjb250ZW50KSB7IGZvciAodmFyIGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7ICsraSkgeyBlLmFwcGVuZENoaWxkKGNvbnRlbnRbaV0pOyB9IH1cbiAgcmV0dXJuIGVcbn1cbi8vIHdyYXBwZXIgZm9yIGVsdCwgd2hpY2ggcmVtb3ZlcyB0aGUgZWx0IGZyb20gdGhlIGFjY2Vzc2liaWxpdHkgdHJlZVxuZnVuY3Rpb24gZWx0UCh0YWcsIGNvbnRlbnQsIGNsYXNzTmFtZSwgc3R5bGUpIHtcbiAgdmFyIGUgPSBlbHQodGFnLCBjb250ZW50LCBjbGFzc05hbWUsIHN0eWxlKTtcbiAgZS5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwicHJlc2VudGF0aW9uXCIpO1xuICByZXR1cm4gZVxufVxuXG52YXIgcmFuZ2U7XG5pZiAoZG9jdW1lbnQuY3JlYXRlUmFuZ2UpIHsgcmFuZ2UgPSBmdW5jdGlvbihub2RlLCBzdGFydCwgZW5kLCBlbmROb2RlKSB7XG4gIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgci5zZXRFbmQoZW5kTm9kZSB8fCBub2RlLCBlbmQpO1xuICByLnNldFN0YXJ0KG5vZGUsIHN0YXJ0KTtcbiAgcmV0dXJuIHJcbn07IH1cbmVsc2UgeyByYW5nZSA9IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHIgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO1xuICB0cnkgeyByLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUucGFyZW50Tm9kZSk7IH1cbiAgY2F0Y2goZSkgeyByZXR1cm4gciB9XG4gIHIuY29sbGFwc2UodHJ1ZSk7XG4gIHIubW92ZUVuZChcImNoYXJhY3RlclwiLCBlbmQpO1xuICByLm1vdmVTdGFydChcImNoYXJhY3RlclwiLCBzdGFydCk7XG4gIHJldHVybiByXG59OyB9XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDMpIC8vIEFuZHJvaWQgYnJvd3NlciBhbHdheXMgcmV0dXJucyBmYWxzZSB3aGVuIGNoaWxkIGlzIGEgdGV4dG5vZGVcbiAgICB7IGNoaWxkID0gY2hpbGQucGFyZW50Tm9kZTsgfVxuICBpZiAocGFyZW50LmNvbnRhaW5zKVxuICAgIHsgcmV0dXJuIHBhcmVudC5jb250YWlucyhjaGlsZCkgfVxuICBkbyB7XG4gICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDExKSB7IGNoaWxkID0gY2hpbGQuaG9zdDsgfVxuICAgIGlmIChjaGlsZCA9PSBwYXJlbnQpIHsgcmV0dXJuIHRydWUgfVxuICB9IHdoaWxlIChjaGlsZCA9IGNoaWxkLnBhcmVudE5vZGUpXG59XG5cbmZ1bmN0aW9uIGFjdGl2ZUVsdCgpIHtcbiAgLy8gSUUgYW5kIEVkZ2UgbWF5IHRocm93IGFuIFwiVW5zcGVjaWZpZWQgRXJyb3JcIiB3aGVuIGFjY2Vzc2luZyBkb2N1bWVudC5hY3RpdmVFbGVtZW50LlxuICAvLyBJRSA8IDEwIHdpbGwgdGhyb3cgd2hlbiBhY2Nlc3NlZCB3aGlsZSB0aGUgcGFnZSBpcyBsb2FkaW5nIG9yIGluIGFuIGlmcmFtZS5cbiAgLy8gSUUgPiA5IGFuZCBFZGdlIHdpbGwgdGhyb3cgd2hlbiBhY2Nlc3NlZCBpbiBhbiBpZnJhbWUgaWYgZG9jdW1lbnQuYm9keSBpcyB1bmF2YWlsYWJsZS5cbiAgdmFyIGFjdGl2ZUVsZW1lbnQ7XG4gIHRyeSB7XG4gICAgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIH0gY2F0Y2goZSkge1xuICAgIGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5ib2R5IHx8IG51bGw7XG4gIH1cbiAgd2hpbGUgKGFjdGl2ZUVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudC5zaGFkb3dSb290ICYmIGFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50KVxuICAgIHsgYWN0aXZlRWxlbWVudCA9IGFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50OyB9XG4gIHJldHVybiBhY3RpdmVFbGVtZW50XG59XG5cbmZ1bmN0aW9uIGFkZENsYXNzKG5vZGUsIGNscykge1xuICB2YXIgY3VycmVudCA9IG5vZGUuY2xhc3NOYW1lO1xuICBpZiAoIWNsYXNzVGVzdChjbHMpLnRlc3QoY3VycmVudCkpIHsgbm9kZS5jbGFzc05hbWUgKz0gKGN1cnJlbnQgPyBcIiBcIiA6IFwiXCIpICsgY2xzOyB9XG59XG5mdW5jdGlvbiBqb2luQ2xhc3NlcyhhLCBiKSB7XG4gIHZhciBhcyA9IGEuc3BsaXQoXCIgXCIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFzLmxlbmd0aDsgaSsrKVxuICAgIHsgaWYgKGFzW2ldICYmICFjbGFzc1Rlc3QoYXNbaV0pLnRlc3QoYikpIHsgYiArPSBcIiBcIiArIGFzW2ldOyB9IH1cbiAgcmV0dXJuIGJcbn1cblxudmFyIHNlbGVjdElucHV0ID0gZnVuY3Rpb24obm9kZSkgeyBub2RlLnNlbGVjdCgpOyB9O1xuaWYgKGlvcykgLy8gTW9iaWxlIFNhZmFyaSBhcHBhcmVudGx5IGhhcyBhIGJ1ZyB3aGVyZSBzZWxlY3QoKSBpcyBicm9rZW4uXG4gIHsgc2VsZWN0SW5wdXQgPSBmdW5jdGlvbihub2RlKSB7IG5vZGUuc2VsZWN0aW9uU3RhcnQgPSAwOyBub2RlLnNlbGVjdGlvbkVuZCA9IG5vZGUudmFsdWUubGVuZ3RoOyB9OyB9XG5lbHNlIGlmIChpZSkgLy8gU3VwcHJlc3MgbXlzdGVyaW91cyBJRTEwIGVycm9yc1xuICB7IHNlbGVjdElucHV0ID0gZnVuY3Rpb24obm9kZSkgeyB0cnkgeyBub2RlLnNlbGVjdCgpOyB9IGNhdGNoKF9lKSB7fSB9OyB9XG5cbmZ1bmN0aW9uIGJpbmQoZikge1xuICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHJldHVybiBmdW5jdGlvbigpe3JldHVybiBmLmFwcGx5KG51bGwsIGFyZ3MpfVxufVxuXG5mdW5jdGlvbiBjb3B5T2JqKG9iaiwgdGFyZ2V0LCBvdmVyd3JpdGUpIHtcbiAgaWYgKCF0YXJnZXQpIHsgdGFyZ2V0ID0ge307IH1cbiAgZm9yICh2YXIgcHJvcCBpbiBvYmopXG4gICAgeyBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApICYmIChvdmVyd3JpdGUgIT09IGZhbHNlIHx8ICF0YXJnZXQuaGFzT3duUHJvcGVydHkocHJvcCkpKVxuICAgICAgeyB0YXJnZXRbcHJvcF0gPSBvYmpbcHJvcF07IH0gfVxuICByZXR1cm4gdGFyZ2V0XG59XG5cbi8vIENvdW50cyB0aGUgY29sdW1uIG9mZnNldCBpbiBhIHN0cmluZywgdGFraW5nIHRhYnMgaW50byBhY2NvdW50LlxuLy8gVXNlZCBtb3N0bHkgdG8gZmluZCBpbmRlbnRhdGlvbi5cbmZ1bmN0aW9uIGNvdW50Q29sdW1uKHN0cmluZywgZW5kLCB0YWJTaXplLCBzdGFydEluZGV4LCBzdGFydFZhbHVlKSB7XG4gIGlmIChlbmQgPT0gbnVsbCkge1xuICAgIGVuZCA9IHN0cmluZy5zZWFyY2goL1teXFxzXFx1MDBhMF0vKTtcbiAgICBpZiAoZW5kID09IC0xKSB7IGVuZCA9IHN0cmluZy5sZW5ndGg7IH1cbiAgfVxuICBmb3IgKHZhciBpID0gc3RhcnRJbmRleCB8fCAwLCBuID0gc3RhcnRWYWx1ZSB8fCAwOzspIHtcbiAgICB2YXIgbmV4dFRhYiA9IHN0cmluZy5pbmRleE9mKFwiXFx0XCIsIGkpO1xuICAgIGlmIChuZXh0VGFiIDwgMCB8fCBuZXh0VGFiID49IGVuZClcbiAgICAgIHsgcmV0dXJuIG4gKyAoZW5kIC0gaSkgfVxuICAgIG4gKz0gbmV4dFRhYiAtIGk7XG4gICAgbiArPSB0YWJTaXplIC0gKG4gJSB0YWJTaXplKTtcbiAgICBpID0gbmV4dFRhYiArIDE7XG4gIH1cbn1cblxudmFyIERlbGF5ZWQgPSBmdW5jdGlvbigpIHt0aGlzLmlkID0gbnVsbDt9O1xuRGVsYXllZC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKG1zLCBmKSB7XG4gIGNsZWFyVGltZW91dCh0aGlzLmlkKTtcbiAgdGhpcy5pZCA9IHNldFRpbWVvdXQoZiwgbXMpO1xufTtcblxuZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgZWx0KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyArK2kpXG4gICAgeyBpZiAoYXJyYXlbaV0gPT0gZWx0KSB7IHJldHVybiBpIH0gfVxuICByZXR1cm4gLTFcbn1cblxuLy8gTnVtYmVyIG9mIHBpeGVscyBhZGRlZCB0byBzY3JvbGxlciBhbmQgc2l6ZXIgdG8gaGlkZSBzY3JvbGxiYXJcbnZhciBzY3JvbGxlckdhcCA9IDMwO1xuXG4vLyBSZXR1cm5lZCBvciB0aHJvd24gYnkgdmFyaW91cyBwcm90b2NvbHMgdG8gc2lnbmFsICdJJ20gbm90XG4vLyBoYW5kbGluZyB0aGlzJy5cbnZhciBQYXNzID0ge3RvU3RyaW5nOiBmdW5jdGlvbigpe3JldHVybiBcIkNvZGVNaXJyb3IuUGFzc1wifX07XG5cbi8vIFJldXNlZCBvcHRpb24gb2JqZWN0cyBmb3Igc2V0U2VsZWN0aW9uICYgZnJpZW5kc1xudmFyIHNlbF9kb250U2Nyb2xsID0ge3Njcm9sbDogZmFsc2V9O1xudmFyIHNlbF9tb3VzZSA9IHtvcmlnaW46IFwiKm1vdXNlXCJ9O1xudmFyIHNlbF9tb3ZlID0ge29yaWdpbjogXCIrbW92ZVwifTtcblxuLy8gVGhlIGludmVyc2Ugb2YgY291bnRDb2x1bW4gLS0gZmluZCB0aGUgb2Zmc2V0IHRoYXQgY29ycmVzcG9uZHMgdG9cbi8vIGEgcGFydGljdWxhciBjb2x1bW4uXG5mdW5jdGlvbiBmaW5kQ29sdW1uKHN0cmluZywgZ29hbCwgdGFiU2l6ZSkge1xuICBmb3IgKHZhciBwb3MgPSAwLCBjb2wgPSAwOzspIHtcbiAgICB2YXIgbmV4dFRhYiA9IHN0cmluZy5pbmRleE9mKFwiXFx0XCIsIHBvcyk7XG4gICAgaWYgKG5leHRUYWIgPT0gLTEpIHsgbmV4dFRhYiA9IHN0cmluZy5sZW5ndGg7IH1cbiAgICB2YXIgc2tpcHBlZCA9IG5leHRUYWIgLSBwb3M7XG4gICAgaWYgKG5leHRUYWIgPT0gc3RyaW5nLmxlbmd0aCB8fCBjb2wgKyBza2lwcGVkID49IGdvYWwpXG4gICAgICB7IHJldHVybiBwb3MgKyBNYXRoLm1pbihza2lwcGVkLCBnb2FsIC0gY29sKSB9XG4gICAgY29sICs9IG5leHRUYWIgLSBwb3M7XG4gICAgY29sICs9IHRhYlNpemUgLSAoY29sICUgdGFiU2l6ZSk7XG4gICAgcG9zID0gbmV4dFRhYiArIDE7XG4gICAgaWYgKGNvbCA+PSBnb2FsKSB7IHJldHVybiBwb3MgfVxuICB9XG59XG5cbnZhciBzcGFjZVN0cnMgPSBbXCJcIl07XG5mdW5jdGlvbiBzcGFjZVN0cihuKSB7XG4gIHdoaWxlIChzcGFjZVN0cnMubGVuZ3RoIDw9IG4pXG4gICAgeyBzcGFjZVN0cnMucHVzaChsc3Qoc3BhY2VTdHJzKSArIFwiIFwiKTsgfVxuICByZXR1cm4gc3BhY2VTdHJzW25dXG59XG5cbmZ1bmN0aW9uIGxzdChhcnIpIHsgcmV0dXJuIGFyclthcnIubGVuZ3RoLTFdIH1cblxuZnVuY3Rpb24gbWFwKGFycmF5LCBmKSB7XG4gIHZhciBvdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeyBvdXRbaV0gPSBmKGFycmF5W2ldLCBpKTsgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIGluc2VydFNvcnRlZChhcnJheSwgdmFsdWUsIHNjb3JlKSB7XG4gIHZhciBwb3MgPSAwLCBwcmlvcml0eSA9IHNjb3JlKHZhbHVlKTtcbiAgd2hpbGUgKHBvcyA8IGFycmF5Lmxlbmd0aCAmJiBzY29yZShhcnJheVtwb3NdKSA8PSBwcmlvcml0eSkgeyBwb3MrKzsgfVxuICBhcnJheS5zcGxpY2UocG9zLCAwLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIG5vdGhpbmcoKSB7fVxuXG5mdW5jdGlvbiBjcmVhdGVPYmooYmFzZSwgcHJvcHMpIHtcbiAgdmFyIGluc3Q7XG4gIGlmIChPYmplY3QuY3JlYXRlKSB7XG4gICAgaW5zdCA9IE9iamVjdC5jcmVhdGUoYmFzZSk7XG4gIH0gZWxzZSB7XG4gICAgbm90aGluZy5wcm90b3R5cGUgPSBiYXNlO1xuICAgIGluc3QgPSBuZXcgbm90aGluZygpO1xuICB9XG4gIGlmIChwcm9wcykgeyBjb3B5T2JqKHByb3BzLCBpbnN0KTsgfVxuICByZXR1cm4gaW5zdFxufVxuXG52YXIgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIgPSAvW1xcdTAwZGZcXHUwNTg3XFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MzA0MC1cXHUzMDlmXFx1MzBhMC1cXHUzMGZmXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmNjXFx1YWMwMC1cXHVkN2FmXS87XG5mdW5jdGlvbiBpc1dvcmRDaGFyQmFzaWMoY2gpIHtcbiAgcmV0dXJuIC9cXHcvLnRlc3QoY2gpIHx8IGNoID4gXCJcXHg4MFwiICYmXG4gICAgKGNoLnRvVXBwZXJDYXNlKCkgIT0gY2gudG9Mb3dlckNhc2UoKSB8fCBub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhci50ZXN0KGNoKSlcbn1cbmZ1bmN0aW9uIGlzV29yZENoYXIoY2gsIGhlbHBlcikge1xuICBpZiAoIWhlbHBlcikgeyByZXR1cm4gaXNXb3JkQ2hhckJhc2ljKGNoKSB9XG4gIGlmIChoZWxwZXIuc291cmNlLmluZGV4T2YoXCJcXFxcd1wiKSA+IC0xICYmIGlzV29yZENoYXJCYXNpYyhjaCkpIHsgcmV0dXJuIHRydWUgfVxuICByZXR1cm4gaGVscGVyLnRlc3QoY2gpXG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkob2JqKSB7XG4gIGZvciAodmFyIG4gaW4gb2JqKSB7IGlmIChvYmouaGFzT3duUHJvcGVydHkobikgJiYgb2JqW25dKSB7IHJldHVybiBmYWxzZSB9IH1cbiAgcmV0dXJuIHRydWVcbn1cblxuLy8gRXh0ZW5kaW5nIHVuaWNvZGUgY2hhcmFjdGVycy4gQSBzZXJpZXMgb2YgYSBub24tZXh0ZW5kaW5nIGNoYXIgK1xuLy8gYW55IG51bWJlciBvZiBleHRlbmRpbmcgY2hhcnMgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IGFzIGZhclxuLy8gYXMgZWRpdGluZyBhbmQgbWVhc3VyaW5nIGlzIGNvbmNlcm5lZC4gVGhpcyBpcyBub3QgZnVsbHkgY29ycmVjdCxcbi8vIHNpbmNlIHNvbWUgc2NyaXB0cy9mb250cy9icm93c2VycyBhbHNvIHRyZWF0IG90aGVyIGNvbmZpZ3VyYXRpb25zXG4vLyBvZiBjb2RlIHBvaW50cyBhcyBhIGdyb3VwLlxudmFyIGV4dGVuZGluZ0NoYXJzID0gL1tcXHUwMzAwLVxcdTAzNmZcXHUwNDgzLVxcdTA0ODlcXHUwNTkxLVxcdTA1YmRcXHUwNWJmXFx1MDVjMVxcdTA1YzJcXHUwNWM0XFx1MDVjNVxcdTA1YzdcXHUwNjEwLVxcdTA2MWFcXHUwNjRiLVxcdTA2NWVcXHUwNjcwXFx1MDZkNi1cXHUwNmRjXFx1MDZkZS1cXHUwNmU0XFx1MDZlN1xcdTA2ZThcXHUwNmVhLVxcdTA2ZWRcXHUwNzExXFx1MDczMC1cXHUwNzRhXFx1MDdhNi1cXHUwN2IwXFx1MDdlYi1cXHUwN2YzXFx1MDgxNi1cXHUwODE5XFx1MDgxYi1cXHUwODIzXFx1MDgyNS1cXHUwODI3XFx1MDgyOS1cXHUwODJkXFx1MDkwMC1cXHUwOTAyXFx1MDkzY1xcdTA5NDEtXFx1MDk0OFxcdTA5NGRcXHUwOTUxLVxcdTA5NTVcXHUwOTYyXFx1MDk2M1xcdTA5ODFcXHUwOWJjXFx1MDliZVxcdTA5YzEtXFx1MDljNFxcdTA5Y2RcXHUwOWQ3XFx1MDllMlxcdTA5ZTNcXHUwYTAxXFx1MGEwMlxcdTBhM2NcXHUwYTQxXFx1MGE0MlxcdTBhNDdcXHUwYTQ4XFx1MGE0Yi1cXHUwYTRkXFx1MGE1MVxcdTBhNzBcXHUwYTcxXFx1MGE3NVxcdTBhODFcXHUwYTgyXFx1MGFiY1xcdTBhYzEtXFx1MGFjNVxcdTBhYzdcXHUwYWM4XFx1MGFjZFxcdTBhZTJcXHUwYWUzXFx1MGIwMVxcdTBiM2NcXHUwYjNlXFx1MGIzZlxcdTBiNDEtXFx1MGI0NFxcdTBiNGRcXHUwYjU2XFx1MGI1N1xcdTBiNjJcXHUwYjYzXFx1MGI4MlxcdTBiYmVcXHUwYmMwXFx1MGJjZFxcdTBiZDdcXHUwYzNlLVxcdTBjNDBcXHUwYzQ2LVxcdTBjNDhcXHUwYzRhLVxcdTBjNGRcXHUwYzU1XFx1MGM1NlxcdTBjNjJcXHUwYzYzXFx1MGNiY1xcdTBjYmZcXHUwY2MyXFx1MGNjNlxcdTBjY2NcXHUwY2NkXFx1MGNkNVxcdTBjZDZcXHUwY2UyXFx1MGNlM1xcdTBkM2VcXHUwZDQxLVxcdTBkNDRcXHUwZDRkXFx1MGQ1N1xcdTBkNjJcXHUwZDYzXFx1MGRjYVxcdTBkY2ZcXHUwZGQyLVxcdTBkZDRcXHUwZGQ2XFx1MGRkZlxcdTBlMzFcXHUwZTM0LVxcdTBlM2FcXHUwZTQ3LVxcdTBlNGVcXHUwZWIxXFx1MGViNC1cXHUwZWI5XFx1MGViYlxcdTBlYmNcXHUwZWM4LVxcdTBlY2RcXHUwZjE4XFx1MGYxOVxcdTBmMzVcXHUwZjM3XFx1MGYzOVxcdTBmNzEtXFx1MGY3ZVxcdTBmODAtXFx1MGY4NFxcdTBmODZcXHUwZjg3XFx1MGY5MC1cXHUwZjk3XFx1MGY5OS1cXHUwZmJjXFx1MGZjNlxcdTEwMmQtXFx1MTAzMFxcdTEwMzItXFx1MTAzN1xcdTEwMzlcXHUxMDNhXFx1MTAzZFxcdTEwM2VcXHUxMDU4XFx1MTA1OVxcdTEwNWUtXFx1MTA2MFxcdTEwNzEtXFx1MTA3NFxcdTEwODJcXHUxMDg1XFx1MTA4NlxcdTEwOGRcXHUxMDlkXFx1MTM1ZlxcdTE3MTItXFx1MTcxNFxcdTE3MzItXFx1MTczNFxcdTE3NTJcXHUxNzUzXFx1MTc3MlxcdTE3NzNcXHUxN2I3LVxcdTE3YmRcXHUxN2M2XFx1MTdjOS1cXHUxN2QzXFx1MTdkZFxcdTE4MGItXFx1MTgwZFxcdTE4YTlcXHUxOTIwLVxcdTE5MjJcXHUxOTI3XFx1MTkyOFxcdTE5MzJcXHUxOTM5LVxcdTE5M2JcXHUxYTE3XFx1MWExOFxcdTFhNTZcXHUxYTU4LVxcdTFhNWVcXHUxYTYwXFx1MWE2MlxcdTFhNjUtXFx1MWE2Y1xcdTFhNzMtXFx1MWE3Y1xcdTFhN2ZcXHUxYjAwLVxcdTFiMDNcXHUxYjM0XFx1MWIzNi1cXHUxYjNhXFx1MWIzY1xcdTFiNDJcXHUxYjZiLVxcdTFiNzNcXHUxYjgwXFx1MWI4MVxcdTFiYTItXFx1MWJhNVxcdTFiYThcXHUxYmE5XFx1MWMyYy1cXHUxYzMzXFx1MWMzNlxcdTFjMzdcXHUxY2QwLVxcdTFjZDJcXHUxY2Q0LVxcdTFjZTBcXHUxY2UyLVxcdTFjZThcXHUxY2VkXFx1MWRjMC1cXHUxZGU2XFx1MWRmZC1cXHUxZGZmXFx1MjAwY1xcdTIwMGRcXHUyMGQwLVxcdTIwZjBcXHUyY2VmLVxcdTJjZjFcXHUyZGUwLVxcdTJkZmZcXHUzMDJhLVxcdTMwMmZcXHUzMDk5XFx1MzA5YVxcdWE2NmYtXFx1YTY3MlxcdWE2N2NcXHVhNjdkXFx1YTZmMFxcdWE2ZjFcXHVhODAyXFx1YTgwNlxcdWE4MGJcXHVhODI1XFx1YTgyNlxcdWE4YzRcXHVhOGUwLVxcdWE4ZjFcXHVhOTI2LVxcdWE5MmRcXHVhOTQ3LVxcdWE5NTFcXHVhOTgwLVxcdWE5ODJcXHVhOWIzXFx1YTliNi1cXHVhOWI5XFx1YTliY1xcdWFhMjktXFx1YWEyZVxcdWFhMzFcXHVhYTMyXFx1YWEzNVxcdWFhMzZcXHVhYTQzXFx1YWE0Y1xcdWFhYjBcXHVhYWIyLVxcdWFhYjRcXHVhYWI3XFx1YWFiOFxcdWFhYmVcXHVhYWJmXFx1YWFjMVxcdWFiZTVcXHVhYmU4XFx1YWJlZFxcdWRjMDAtXFx1ZGZmZlxcdWZiMWVcXHVmZTAwLVxcdWZlMGZcXHVmZTIwLVxcdWZlMjZcXHVmZjllXFx1ZmY5Zl0vO1xuZnVuY3Rpb24gaXNFeHRlbmRpbmdDaGFyKGNoKSB7IHJldHVybiBjaC5jaGFyQ29kZUF0KDApID49IDc2OCAmJiBleHRlbmRpbmdDaGFycy50ZXN0KGNoKSB9XG5cbi8vIFJldHVybnMgYSBudW1iZXIgZnJvbSB0aGUgcmFuZ2UgW2AwYDsgYHN0ci5sZW5ndGhgXSB1bmxlc3MgYHBvc2AgaXMgb3V0c2lkZSB0aGF0IHJhbmdlLlxuZnVuY3Rpb24gc2tpcEV4dGVuZGluZ0NoYXJzKHN0ciwgcG9zLCBkaXIpIHtcbiAgd2hpbGUgKChkaXIgPCAwID8gcG9zID4gMCA6IHBvcyA8IHN0ci5sZW5ndGgpICYmIGlzRXh0ZW5kaW5nQ2hhcihzdHIuY2hhckF0KHBvcykpKSB7IHBvcyArPSBkaXI7IH1cbiAgcmV0dXJuIHBvc1xufVxuXG4vLyBSZXR1cm5zIHRoZSB2YWx1ZSBmcm9tIHRoZSByYW5nZSBbYGZyb21gOyBgdG9gXSB0aGF0IHNhdGlzZmllc1xuLy8gYHByZWRgIGFuZCBpcyBjbG9zZXN0IHRvIGBmcm9tYC4gQXNzdW1lcyB0aGF0IGF0IGxlYXN0IGB0b2Bcbi8vIHNhdGlzZmllcyBgcHJlZGAuIFN1cHBvcnRzIGBmcm9tYCBiZWluZyBncmVhdGVyIHRoYW4gYHRvYC5cbmZ1bmN0aW9uIGZpbmRGaXJzdChwcmVkLCBmcm9tLCB0bykge1xuICAvLyBBdCBhbnkgcG9pbnQgd2UgYXJlIGNlcnRhaW4gYHRvYCBzYXRpc2ZpZXMgYHByZWRgLCBkb24ndCBrbm93XG4gIC8vIHdoZXRoZXIgYGZyb21gIGRvZXMuXG4gIHZhciBkaXIgPSBmcm9tID4gdG8gPyAtMSA6IDE7XG4gIGZvciAoOzspIHtcbiAgICBpZiAoZnJvbSA9PSB0bykgeyByZXR1cm4gZnJvbSB9XG4gICAgdmFyIG1pZEYgPSAoZnJvbSArIHRvKSAvIDIsIG1pZCA9IGRpciA8IDAgPyBNYXRoLmNlaWwobWlkRikgOiBNYXRoLmZsb29yKG1pZEYpO1xuICAgIGlmIChtaWQgPT0gZnJvbSkgeyByZXR1cm4gcHJlZChtaWQpID8gZnJvbSA6IHRvIH1cbiAgICBpZiAocHJlZChtaWQpKSB7IHRvID0gbWlkOyB9XG4gICAgZWxzZSB7IGZyb20gPSBtaWQgKyBkaXI7IH1cbiAgfVxufVxuXG4vLyBUaGUgZGlzcGxheSBoYW5kbGVzIHRoZSBET00gaW50ZWdyYXRpb24sIGJvdGggZm9yIGlucHV0IHJlYWRpbmdcbi8vIGFuZCBjb250ZW50IGRyYXdpbmcuIEl0IGhvbGRzIHJlZmVyZW5jZXMgdG8gRE9NIG5vZGVzIGFuZFxuLy8gZGlzcGxheS1yZWxhdGVkIHN0YXRlLlxuXG5mdW5jdGlvbiBEaXNwbGF5KHBsYWNlLCBkb2MsIGlucHV0KSB7XG4gIHZhciBkID0gdGhpcztcbiAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gIC8vIENvdmVycyBib3R0b20tcmlnaHQgc3F1YXJlIHdoZW4gYm90aCBzY3JvbGxiYXJzIGFyZSBwcmVzZW50LlxuICBkLnNjcm9sbGJhckZpbGxlciA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3Itc2Nyb2xsYmFyLWZpbGxlclwiKTtcbiAgZC5zY3JvbGxiYXJGaWxsZXIuc2V0QXR0cmlidXRlKFwiY20tbm90LWNvbnRlbnRcIiwgXCJ0cnVlXCIpO1xuICAvLyBDb3ZlcnMgYm90dG9tIG9mIGd1dHRlciB3aGVuIGNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyIGlzIG9uXG4gIC8vIGFuZCBoIHNjcm9sbGJhciBpcyBwcmVzZW50LlxuICBkLmd1dHRlckZpbGxlciA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItZ3V0dGVyLWZpbGxlclwiKTtcbiAgZC5ndXR0ZXJGaWxsZXIuc2V0QXR0cmlidXRlKFwiY20tbm90LWNvbnRlbnRcIiwgXCJ0cnVlXCIpO1xuICAvLyBXaWxsIGNvbnRhaW4gdGhlIGFjdHVhbCBjb2RlLCBwb3NpdGlvbmVkIHRvIGNvdmVyIHRoZSB2aWV3cG9ydC5cbiAgZC5saW5lRGl2ID0gZWx0UChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItY29kZVwiKTtcbiAgLy8gRWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZXNlIHRvIHJlcHJlc2VudCBzZWxlY3Rpb24gYW5kIGN1cnNvcnMuXG4gIGQuc2VsZWN0aW9uRGl2ID0gZWx0KFwiZGl2XCIsIG51bGwsIG51bGwsIFwicG9zaXRpb246IHJlbGF0aXZlOyB6LWluZGV4OiAxXCIpO1xuICBkLmN1cnNvckRpdiA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItY3Vyc29yc1wiKTtcbiAgLy8gQSB2aXNpYmlsaXR5OiBoaWRkZW4gZWxlbWVudCB1c2VkIHRvIGZpbmQgdGhlIHNpemUgb2YgdGhpbmdzLlxuICBkLm1lYXN1cmUgPSBlbHQoXCJkaXZcIiwgbnVsbCwgXCJDb2RlTWlycm9yLW1lYXN1cmVcIik7XG4gIC8vIFdoZW4gbGluZXMgb3V0c2lkZSBvZiB0aGUgdmlld3BvcnQgYXJlIG1lYXN1cmVkLCB0aGV5IGFyZSBkcmF3biBpbiB0aGlzLlxuICBkLmxpbmVNZWFzdXJlID0gZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1tZWFzdXJlXCIpO1xuICAvLyBXcmFwcyBldmVyeXRoaW5nIHRoYXQgbmVlZHMgdG8gZXhpc3QgaW5zaWRlIHRoZSB2ZXJ0aWNhbGx5LXBhZGRlZCBjb29yZGluYXRlIHN5c3RlbVxuICBkLmxpbmVTcGFjZSA9IGVsdFAoXCJkaXZcIiwgW2QubWVhc3VyZSwgZC5saW5lTWVhc3VyZSwgZC5zZWxlY3Rpb25EaXYsIGQuY3Vyc29yRGl2LCBkLmxpbmVEaXZdLFxuICAgICAgICAgICAgICAgICAgICBudWxsLCBcInBvc2l0aW9uOiByZWxhdGl2ZTsgb3V0bGluZTogbm9uZVwiKTtcbiAgdmFyIGxpbmVzID0gZWx0UChcImRpdlwiLCBbZC5saW5lU3BhY2VdLCBcIkNvZGVNaXJyb3ItbGluZXNcIik7XG4gIC8vIE1vdmVkIGFyb3VuZCBpdHMgcGFyZW50IHRvIGNvdmVyIHZpc2libGUgdmlldy5cbiAgZC5tb3ZlciA9IGVsdChcImRpdlwiLCBbbGluZXNdLCBudWxsLCBcInBvc2l0aW9uOiByZWxhdGl2ZVwiKTtcbiAgLy8gU2V0IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGRvY3VtZW50LCBhbGxvd2luZyBzY3JvbGxpbmcuXG4gIGQuc2l6ZXIgPSBlbHQoXCJkaXZcIiwgW2QubW92ZXJdLCBcIkNvZGVNaXJyb3Itc2l6ZXJcIik7XG4gIGQuc2l6ZXJXaWR0aCA9IG51bGw7XG4gIC8vIEJlaGF2aW9yIG9mIGVsdHMgd2l0aCBvdmVyZmxvdzogYXV0byBhbmQgcGFkZGluZyBpc1xuICAvLyBpbmNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzLiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoZVxuICAvLyBzY3JvbGxhYmxlIGFyZWEgaXMgYmlnIGVub3VnaC5cbiAgZC5oZWlnaHRGb3JjZXIgPSBlbHQoXCJkaXZcIiwgbnVsbCwgbnVsbCwgXCJwb3NpdGlvbjogYWJzb2x1dGU7IGhlaWdodDogXCIgKyBzY3JvbGxlckdhcCArIFwicHg7IHdpZHRoOiAxcHg7XCIpO1xuICAvLyBXaWxsIGNvbnRhaW4gdGhlIGd1dHRlcnMsIGlmIGFueS5cbiAgZC5ndXR0ZXJzID0gZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1ndXR0ZXJzXCIpO1xuICBkLmxpbmVHdXR0ZXIgPSBudWxsO1xuICAvLyBBY3R1YWwgc2Nyb2xsYWJsZSBlbGVtZW50LlxuICBkLnNjcm9sbGVyID0gZWx0KFwiZGl2XCIsIFtkLnNpemVyLCBkLmhlaWdodEZvcmNlciwgZC5ndXR0ZXJzXSwgXCJDb2RlTWlycm9yLXNjcm9sbFwiKTtcbiAgZC5zY3JvbGxlci5zZXRBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiLCBcIi0xXCIpO1xuICAvLyBUaGUgZWxlbWVudCBpbiB3aGljaCB0aGUgZWRpdG9yIGxpdmVzLlxuICBkLndyYXBwZXIgPSBlbHQoXCJkaXZcIiwgW2Quc2Nyb2xsYmFyRmlsbGVyLCBkLmd1dHRlckZpbGxlciwgZC5zY3JvbGxlcl0sIFwiQ29kZU1pcnJvclwiKTtcblxuICAvLyBXb3JrIGFyb3VuZCBJRTcgei1pbmRleCBidWcgKG5vdCBwZXJmZWN0LCBoZW5jZSBJRTcgbm90IHJlYWxseSBiZWluZyBzdXBwb3J0ZWQpXG4gIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOCkgeyBkLmd1dHRlcnMuc3R5bGUuekluZGV4ID0gLTE7IGQuc2Nyb2xsZXIuc3R5bGUucGFkZGluZ1JpZ2h0ID0gMDsgfVxuICBpZiAoIXdlYmtpdCAmJiAhKGdlY2tvICYmIG1vYmlsZSkpIHsgZC5zY3JvbGxlci5kcmFnZ2FibGUgPSB0cnVlOyB9XG5cbiAgaWYgKHBsYWNlKSB7XG4gICAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKSB7IHBsYWNlLmFwcGVuZENoaWxkKGQud3JhcHBlcik7IH1cbiAgICBlbHNlIHsgcGxhY2UoZC53cmFwcGVyKTsgfVxuICB9XG5cbiAgLy8gQ3VycmVudCByZW5kZXJlZCByYW5nZSAobWF5IGJlIGJpZ2dlciB0aGFuIHRoZSB2aWV3IHdpbmRvdykuXG4gIGQudmlld0Zyb20gPSBkLnZpZXdUbyA9IGRvYy5maXJzdDtcbiAgZC5yZXBvcnRlZFZpZXdGcm9tID0gZC5yZXBvcnRlZFZpZXdUbyA9IGRvYy5maXJzdDtcbiAgLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlbmRlcmVkIGxpbmVzLlxuICBkLnZpZXcgPSBbXTtcbiAgZC5yZW5kZXJlZFZpZXcgPSBudWxsO1xuICAvLyBIb2xkcyBpbmZvIGFib3V0IGEgc2luZ2xlIHJlbmRlcmVkIGxpbmUgd2hlbiBpdCB3YXMgcmVuZGVyZWRcbiAgLy8gZm9yIG1lYXN1cmVtZW50LCB3aGlsZSBub3QgaW4gdmlldy5cbiAgZC5leHRlcm5hbE1lYXN1cmVkID0gbnVsbDtcbiAgLy8gRW1wdHkgc3BhY2UgKGluIHBpeGVscykgYWJvdmUgdGhlIHZpZXdcbiAgZC52aWV3T2Zmc2V0ID0gMDtcbiAgZC5sYXN0V3JhcEhlaWdodCA9IGQubGFzdFdyYXBXaWR0aCA9IDA7XG4gIGQudXBkYXRlTGluZU51bWJlcnMgPSBudWxsO1xuXG4gIGQubmF0aXZlQmFyV2lkdGggPSBkLmJhckhlaWdodCA9IGQuYmFyV2lkdGggPSAwO1xuICBkLnNjcm9sbGJhcnNDbGlwcGVkID0gZmFsc2U7XG5cbiAgLy8gVXNlZCB0byBvbmx5IHJlc2l6ZSB0aGUgbGluZSBudW1iZXIgZ3V0dGVyIHdoZW4gbmVjZXNzYXJ5ICh3aGVuXG4gIC8vIHRoZSBhbW91bnQgb2YgbGluZXMgY3Jvc3NlcyBhIGJvdW5kYXJ5IHRoYXQgbWFrZXMgaXRzIHdpZHRoIGNoYW5nZSlcbiAgZC5saW5lTnVtV2lkdGggPSBkLmxpbmVOdW1Jbm5lcldpZHRoID0gZC5saW5lTnVtQ2hhcnMgPSBudWxsO1xuICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIGEgbm9uLWhvcml6b250YWwtc2Nyb2xsaW5nIGxpbmUgd2lkZ2V0IGlzXG4gIC8vIGFkZGVkLiBBcyBhbiBvcHRpbWl6YXRpb24sIGxpbmUgd2lkZ2V0IGFsaWduaW5nIGlzIHNraXBwZWQgd2hlblxuICAvLyB0aGlzIGlzIGZhbHNlLlxuICBkLmFsaWduV2lkZ2V0cyA9IGZhbHNlO1xuXG4gIGQuY2FjaGVkQ2hhcldpZHRoID0gZC5jYWNoZWRUZXh0SGVpZ2h0ID0gZC5jYWNoZWRQYWRkaW5nSCA9IG51bGw7XG5cbiAgLy8gVHJhY2tzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIHNvIHRoYXQgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyXG4gIC8vIGNhbiBiZSBrZXB0IHN0YXRpYyB3aGVuIHNjcm9sbGluZy5cbiAgZC5tYXhMaW5lID0gbnVsbDtcbiAgZC5tYXhMaW5lTGVuZ3RoID0gMDtcbiAgZC5tYXhMaW5lQ2hhbmdlZCA9IGZhbHNlO1xuXG4gIC8vIFVzZWQgZm9yIG1lYXN1cmluZyB3aGVlbCBzY3JvbGxpbmcgZ3JhbnVsYXJpdHlcbiAgZC53aGVlbERYID0gZC53aGVlbERZID0gZC53aGVlbFN0YXJ0WCA9IGQud2hlZWxTdGFydFkgPSBudWxsO1xuXG4gIC8vIFRydWUgd2hlbiBzaGlmdCBpcyBoZWxkIGRvd24uXG4gIGQuc2hpZnQgPSBmYWxzZTtcblxuICAvLyBVc2VkIHRvIHRyYWNrIHdoZXRoZXIgYW55dGhpbmcgaGFwcGVuZWQgc2luY2UgdGhlIGNvbnRleHQgbWVudVxuICAvLyB3YXMgb3BlbmVkLlxuICBkLnNlbEZvckNvbnRleHRNZW51ID0gbnVsbDtcblxuICBkLmFjdGl2ZVRvdWNoID0gbnVsbDtcblxuICBpbnB1dC5pbml0KGQpO1xufVxuXG4vLyBGaW5kIHRoZSBsaW5lIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaW5lIG51bWJlci5cbmZ1bmN0aW9uIGdldExpbmUoZG9jLCBuKSB7XG4gIG4gLT0gZG9jLmZpcnN0O1xuICBpZiAobiA8IDAgfHwgbiA+PSBkb2Muc2l6ZSkgeyB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBsaW5lIFwiICsgKG4gKyBkb2MuZmlyc3QpICsgXCIgaW4gdGhlIGRvY3VtZW50LlwiKSB9XG4gIHZhciBjaHVuayA9IGRvYztcbiAgd2hpbGUgKCFjaHVuay5saW5lcykge1xuICAgIGZvciAodmFyIGkgPSAwOzsgKytpKSB7XG4gICAgICB2YXIgY2hpbGQgPSBjaHVuay5jaGlsZHJlbltpXSwgc3ogPSBjaGlsZC5jaHVua1NpemUoKTtcbiAgICAgIGlmIChuIDwgc3opIHsgY2h1bmsgPSBjaGlsZDsgYnJlYWsgfVxuICAgICAgbiAtPSBzejtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNodW5rLmxpbmVzW25dXG59XG5cbi8vIEdldCB0aGUgcGFydCBvZiBhIGRvY3VtZW50IGJldHdlZW4gdHdvIHBvc2l0aW9ucywgYXMgYW4gYXJyYXkgb2Zcbi8vIHN0cmluZ3MuXG5mdW5jdGlvbiBnZXRCZXR3ZWVuKGRvYywgc3RhcnQsIGVuZCkge1xuICB2YXIgb3V0ID0gW10sIG4gPSBzdGFydC5saW5lO1xuICBkb2MuaXRlcihzdGFydC5saW5lLCBlbmQubGluZSArIDEsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgdmFyIHRleHQgPSBsaW5lLnRleHQ7XG4gICAgaWYgKG4gPT0gZW5kLmxpbmUpIHsgdGV4dCA9IHRleHQuc2xpY2UoMCwgZW5kLmNoKTsgfVxuICAgIGlmIChuID09IHN0YXJ0LmxpbmUpIHsgdGV4dCA9IHRleHQuc2xpY2Uoc3RhcnQuY2gpOyB9XG4gICAgb3V0LnB1c2godGV4dCk7XG4gICAgKytuO1xuICB9KTtcbiAgcmV0dXJuIG91dFxufVxuLy8gR2V0IHRoZSBsaW5lcyBiZXR3ZWVuIGZyb20gYW5kIHRvLCBhcyBhcnJheSBvZiBzdHJpbmdzLlxuZnVuY3Rpb24gZ2V0TGluZXMoZG9jLCBmcm9tLCB0bykge1xuICB2YXIgb3V0ID0gW107XG4gIGRvYy5pdGVyKGZyb20sIHRvLCBmdW5jdGlvbiAobGluZSkgeyBvdXQucHVzaChsaW5lLnRleHQpOyB9KTsgLy8gaXRlciBhYm9ydHMgd2hlbiBjYWxsYmFjayByZXR1cm5zIHRydXRoeSB2YWx1ZVxuICByZXR1cm4gb3V0XG59XG5cbi8vIFVwZGF0ZSB0aGUgaGVpZ2h0IG9mIGEgbGluZSwgcHJvcGFnYXRpbmcgdGhlIGhlaWdodCBjaGFuZ2Vcbi8vIHVwd2FyZHMgdG8gcGFyZW50IG5vZGVzLlxuZnVuY3Rpb24gdXBkYXRlTGluZUhlaWdodChsaW5lLCBoZWlnaHQpIHtcbiAgdmFyIGRpZmYgPSBoZWlnaHQgLSBsaW5lLmhlaWdodDtcbiAgaWYgKGRpZmYpIHsgZm9yICh2YXIgbiA9IGxpbmU7IG47IG4gPSBuLnBhcmVudCkgeyBuLmhlaWdodCArPSBkaWZmOyB9IH1cbn1cblxuLy8gR2l2ZW4gYSBsaW5lIG9iamVjdCwgZmluZCBpdHMgbGluZSBudW1iZXIgYnkgd2Fsa2luZyB1cCB0aHJvdWdoXG4vLyBpdHMgcGFyZW50IGxpbmtzLlxuZnVuY3Rpb24gbGluZU5vKGxpbmUpIHtcbiAgaWYgKGxpbmUucGFyZW50ID09IG51bGwpIHsgcmV0dXJuIG51bGwgfVxuICB2YXIgY3VyID0gbGluZS5wYXJlbnQsIG5vID0gaW5kZXhPZihjdXIubGluZXMsIGxpbmUpO1xuICBmb3IgKHZhciBjaHVuayA9IGN1ci5wYXJlbnQ7IGNodW5rOyBjdXIgPSBjaHVuaywgY2h1bmsgPSBjaHVuay5wYXJlbnQpIHtcbiAgICBmb3IgKHZhciBpID0gMDs7ICsraSkge1xuICAgICAgaWYgKGNodW5rLmNoaWxkcmVuW2ldID09IGN1cikgeyBicmVhayB9XG4gICAgICBubyArPSBjaHVuay5jaGlsZHJlbltpXS5jaHVua1NpemUoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vICsgY3VyLmZpcnN0XG59XG5cbi8vIEZpbmQgdGhlIGxpbmUgYXQgdGhlIGdpdmVuIHZlcnRpY2FsIHBvc2l0aW9uLCB1c2luZyB0aGUgaGVpZ2h0XG4vLyBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnQgdHJlZS5cbmZ1bmN0aW9uIGxpbmVBdEhlaWdodChjaHVuaywgaCkge1xuICB2YXIgbiA9IGNodW5rLmZpcnN0O1xuICBvdXRlcjogZG8ge1xuICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNodW5rLmNoaWxkcmVuLmxlbmd0aDsgKytpJDEpIHtcbiAgICAgIHZhciBjaGlsZCA9IGNodW5rLmNoaWxkcmVuW2kkMV0sIGNoID0gY2hpbGQuaGVpZ2h0O1xuICAgICAgaWYgKGggPCBjaCkgeyBjaHVuayA9IGNoaWxkOyBjb250aW51ZSBvdXRlciB9XG4gICAgICBoIC09IGNoO1xuICAgICAgbiArPSBjaGlsZC5jaHVua1NpemUoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5cbiAgfSB3aGlsZSAoIWNodW5rLmxpbmVzKVxuICB2YXIgaSA9IDA7XG4gIGZvciAoOyBpIDwgY2h1bmsubGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgbGluZSA9IGNodW5rLmxpbmVzW2ldLCBsaCA9IGxpbmUuaGVpZ2h0O1xuICAgIGlmIChoIDwgbGgpIHsgYnJlYWsgfVxuICAgIGggLT0gbGg7XG4gIH1cbiAgcmV0dXJuIG4gKyBpXG59XG5cbmZ1bmN0aW9uIGlzTGluZShkb2MsIGwpIHtyZXR1cm4gbCA+PSBkb2MuZmlyc3QgJiYgbCA8IGRvYy5maXJzdCArIGRvYy5zaXplfVxuXG5mdW5jdGlvbiBsaW5lTnVtYmVyRm9yKG9wdGlvbnMsIGkpIHtcbiAgcmV0dXJuIFN0cmluZyhvcHRpb25zLmxpbmVOdW1iZXJGb3JtYXR0ZXIoaSArIG9wdGlvbnMuZmlyc3RMaW5lTnVtYmVyKSlcbn1cblxuLy8gQSBQb3MgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC5cbmZ1bmN0aW9uIFBvcyhsaW5lLCBjaCwgc3RpY2t5KSB7XG4gIGlmICggc3RpY2t5ID09PSB2b2lkIDAgKSBzdGlja3kgPSBudWxsO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQb3MpKSB7IHJldHVybiBuZXcgUG9zKGxpbmUsIGNoLCBzdGlja3kpIH1cbiAgdGhpcy5saW5lID0gbGluZTtcbiAgdGhpcy5jaCA9IGNoO1xuICB0aGlzLnN0aWNreSA9IHN0aWNreTtcbn1cblxuLy8gQ29tcGFyZSB0d28gcG9zaXRpb25zLCByZXR1cm4gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgYSBuZWdhdGl2ZVxuLy8gbnVtYmVyIHdoZW4gYSBpcyBsZXNzLCBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLlxuZnVuY3Rpb24gY21wKGEsIGIpIHsgcmV0dXJuIGEubGluZSAtIGIubGluZSB8fCBhLmNoIC0gYi5jaCB9XG5cbmZ1bmN0aW9uIGVxdWFsQ3Vyc29yUG9zKGEsIGIpIHsgcmV0dXJuIGEuc3RpY2t5ID09IGIuc3RpY2t5ICYmIGNtcChhLCBiKSA9PSAwIH1cblxuZnVuY3Rpb24gY29weVBvcyh4KSB7cmV0dXJuIFBvcyh4LmxpbmUsIHguY2gpfVxuZnVuY3Rpb24gbWF4UG9zKGEsIGIpIHsgcmV0dXJuIGNtcChhLCBiKSA8IDAgPyBiIDogYSB9XG5mdW5jdGlvbiBtaW5Qb3MoYSwgYikgeyByZXR1cm4gY21wKGEsIGIpIDwgMCA/IGEgOiBiIH1cblxuLy8gTW9zdCBvZiB0aGUgZXh0ZXJuYWwgQVBJIGNsaXBzIGdpdmVuIHBvc2l0aW9ucyB0byBtYWtlIHN1cmUgdGhleVxuLy8gYWN0dWFsbHkgZXhpc3Qgd2l0aGluIHRoZSBkb2N1bWVudC5cbmZ1bmN0aW9uIGNsaXBMaW5lKGRvYywgbikge3JldHVybiBNYXRoLm1heChkb2MuZmlyc3QsIE1hdGgubWluKG4sIGRvYy5maXJzdCArIGRvYy5zaXplIC0gMSkpfVxuZnVuY3Rpb24gY2xpcFBvcyhkb2MsIHBvcykge1xuICBpZiAocG9zLmxpbmUgPCBkb2MuZmlyc3QpIHsgcmV0dXJuIFBvcyhkb2MuZmlyc3QsIDApIH1cbiAgdmFyIGxhc3QgPSBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDE7XG4gIGlmIChwb3MubGluZSA+IGxhc3QpIHsgcmV0dXJuIFBvcyhsYXN0LCBnZXRMaW5lKGRvYywgbGFzdCkudGV4dC5sZW5ndGgpIH1cbiAgcmV0dXJuIGNsaXBUb0xlbihwb3MsIGdldExpbmUoZG9jLCBwb3MubGluZSkudGV4dC5sZW5ndGgpXG59XG5mdW5jdGlvbiBjbGlwVG9MZW4ocG9zLCBsaW5lbGVuKSB7XG4gIHZhciBjaCA9IHBvcy5jaDtcbiAgaWYgKGNoID09IG51bGwgfHwgY2ggPiBsaW5lbGVuKSB7IHJldHVybiBQb3MocG9zLmxpbmUsIGxpbmVsZW4pIH1cbiAgZWxzZSBpZiAoY2ggPCAwKSB7IHJldHVybiBQb3MocG9zLmxpbmUsIDApIH1cbiAgZWxzZSB7IHJldHVybiBwb3MgfVxufVxuZnVuY3Rpb24gY2xpcFBvc0FycmF5KGRvYywgYXJyYXkpIHtcbiAgdmFyIG91dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7IG91dFtpXSA9IGNsaXBQb3MoZG9jLCBhcnJheVtpXSk7IH1cbiAgcmV0dXJuIG91dFxufVxuXG4vLyBPcHRpbWl6ZSBzb21lIGNvZGUgd2hlbiB0aGVzZSBmZWF0dXJlcyBhcmUgbm90IHVzZWQuXG52YXIgc2F3UmVhZE9ubHlTcGFucyA9IGZhbHNlO1xudmFyIHNhd0NvbGxhcHNlZFNwYW5zID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNlZVJlYWRPbmx5U3BhbnMoKSB7XG4gIHNhd1JlYWRPbmx5U3BhbnMgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBzZWVDb2xsYXBzZWRTcGFucygpIHtcbiAgc2F3Q29sbGFwc2VkU3BhbnMgPSB0cnVlO1xufVxuXG4vLyBURVhUTUFSS0VSIFNQQU5TXG5cbmZ1bmN0aW9uIE1hcmtlZFNwYW4obWFya2VyLCBmcm9tLCB0bykge1xuICB0aGlzLm1hcmtlciA9IG1hcmtlcjtcbiAgdGhpcy5mcm9tID0gZnJvbTsgdGhpcy50byA9IHRvO1xufVxuXG4vLyBTZWFyY2ggYW4gYXJyYXkgb2Ygc3BhbnMgZm9yIGEgc3BhbiBtYXRjaGluZyB0aGUgZ2l2ZW4gbWFya2VyLlxuZnVuY3Rpb24gZ2V0TWFya2VkU3BhbkZvcihzcGFucywgbWFya2VyKSB7XG4gIGlmIChzcGFucykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHNwYW4gPSBzcGFuc1tpXTtcbiAgICBpZiAoc3Bhbi5tYXJrZXIgPT0gbWFya2VyKSB7IHJldHVybiBzcGFuIH1cbiAgfSB9XG59XG4vLyBSZW1vdmUgYSBzcGFuIGZyb20gYW4gYXJyYXksIHJldHVybmluZyB1bmRlZmluZWQgaWYgbm8gc3BhbnMgYXJlXG4vLyBsZWZ0ICh3ZSBkb24ndCBzdG9yZSBhcnJheXMgZm9yIGxpbmVzIHdpdGhvdXQgc3BhbnMpLlxuZnVuY3Rpb24gcmVtb3ZlTWFya2VkU3BhbihzcGFucywgc3Bhbikge1xuICB2YXIgcjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSlcbiAgICB7IGlmIChzcGFuc1tpXSAhPSBzcGFuKSB7IChyIHx8IChyID0gW10pKS5wdXNoKHNwYW5zW2ldKTsgfSB9XG4gIHJldHVybiByXG59XG4vLyBBZGQgYSBzcGFuIHRvIGEgbGluZS5cbmZ1bmN0aW9uIGFkZE1hcmtlZFNwYW4obGluZSwgc3Bhbikge1xuICBsaW5lLm1hcmtlZFNwYW5zID0gbGluZS5tYXJrZWRTcGFucyA/IGxpbmUubWFya2VkU3BhbnMuY29uY2F0KFtzcGFuXSkgOiBbc3Bhbl07XG4gIHNwYW4ubWFya2VyLmF0dGFjaExpbmUobGluZSk7XG59XG5cbi8vIFVzZWQgZm9yIHRoZSBhbGdvcml0aG0gdGhhdCBhZGp1c3RzIG1hcmtlcnMgZm9yIGEgY2hhbmdlIGluIHRoZVxuLy8gZG9jdW1lbnQuIFRoZXNlIGZ1bmN0aW9ucyBjdXQgYW4gYXJyYXkgb2Ygc3BhbnMgYXQgYSBnaXZlblxuLy8gY2hhcmFjdGVyIHBvc2l0aW9uLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgcmVtYWluaW5nIGNodW5rcyAob3Jcbi8vIHVuZGVmaW5lZCBpZiBub3RoaW5nIHJlbWFpbnMpLlxuZnVuY3Rpb24gbWFya2VkU3BhbnNCZWZvcmUob2xkLCBzdGFydENoLCBpc0luc2VydCkge1xuICB2YXIgbnc7XG4gIGlmIChvbGQpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGQubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgc3BhbiA9IG9sZFtpXSwgbWFya2VyID0gc3Bhbi5tYXJrZXI7XG4gICAgdmFyIHN0YXJ0c0JlZm9yZSA9IHNwYW4uZnJvbSA9PSBudWxsIHx8IChtYXJrZXIuaW5jbHVzaXZlTGVmdCA/IHNwYW4uZnJvbSA8PSBzdGFydENoIDogc3Bhbi5mcm9tIDwgc3RhcnRDaCk7XG4gICAgaWYgKHN0YXJ0c0JlZm9yZSB8fCBzcGFuLmZyb20gPT0gc3RhcnRDaCAmJiBtYXJrZXIudHlwZSA9PSBcImJvb2ttYXJrXCIgJiYgKCFpc0luc2VydCB8fCAhc3Bhbi5tYXJrZXIuaW5zZXJ0TGVmdCkpIHtcbiAgICAgIHZhciBlbmRzQWZ0ZXIgPSBzcGFuLnRvID09IG51bGwgfHwgKG1hcmtlci5pbmNsdXNpdmVSaWdodCA/IHNwYW4udG8gPj0gc3RhcnRDaCA6IHNwYW4udG8gPiBzdGFydENoKTsobncgfHwgKG53ID0gW10pKS5wdXNoKG5ldyBNYXJrZWRTcGFuKG1hcmtlciwgc3Bhbi5mcm9tLCBlbmRzQWZ0ZXIgPyBudWxsIDogc3Bhbi50bykpO1xuICAgIH1cbiAgfSB9XG4gIHJldHVybiBud1xufVxuZnVuY3Rpb24gbWFya2VkU3BhbnNBZnRlcihvbGQsIGVuZENoLCBpc0luc2VydCkge1xuICB2YXIgbnc7XG4gIGlmIChvbGQpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGQubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgc3BhbiA9IG9sZFtpXSwgbWFya2VyID0gc3Bhbi5tYXJrZXI7XG4gICAgdmFyIGVuZHNBZnRlciA9IHNwYW4udG8gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZVJpZ2h0ID8gc3Bhbi50byA+PSBlbmRDaCA6IHNwYW4udG8gPiBlbmRDaCk7XG4gICAgaWYgKGVuZHNBZnRlciB8fCBzcGFuLmZyb20gPT0gZW5kQ2ggJiYgbWFya2VyLnR5cGUgPT0gXCJib29rbWFya1wiICYmICghaXNJbnNlcnQgfHwgc3Bhbi5tYXJrZXIuaW5zZXJ0TGVmdCkpIHtcbiAgICAgIHZhciBzdGFydHNCZWZvcmUgPSBzcGFuLmZyb20gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZUxlZnQgPyBzcGFuLmZyb20gPD0gZW5kQ2ggOiBzcGFuLmZyb20gPCBlbmRDaCk7KG53IHx8IChudyA9IFtdKSkucHVzaChuZXcgTWFya2VkU3BhbihtYXJrZXIsIHN0YXJ0c0JlZm9yZSA/IG51bGwgOiBzcGFuLmZyb20gLSBlbmRDaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi50byA9PSBudWxsID8gbnVsbCA6IHNwYW4udG8gLSBlbmRDaCkpO1xuICAgIH1cbiAgfSB9XG4gIHJldHVybiBud1xufVxuXG4vLyBHaXZlbiBhIGNoYW5nZSBvYmplY3QsIGNvbXB1dGUgdGhlIG5ldyBzZXQgb2YgbWFya2VyIHNwYW5zIHRoYXRcbi8vIGNvdmVyIHRoZSBsaW5lIGluIHdoaWNoIHRoZSBjaGFuZ2UgdG9vayBwbGFjZS4gUmVtb3ZlcyBzcGFuc1xuLy8gZW50aXJlbHkgd2l0aGluIHRoZSBjaGFuZ2UsIHJlY29ubmVjdHMgc3BhbnMgYmVsb25naW5nIHRvIHRoZVxuLy8gc2FtZSBtYXJrZXIgdGhhdCBhcHBlYXIgb24gYm90aCBzaWRlcyBvZiB0aGUgY2hhbmdlLCBhbmQgY3V0cyBvZmZcbi8vIHNwYW5zIHBhcnRpYWxseSB3aXRoaW4gdGhlIGNoYW5nZS4gUmV0dXJucyBhbiBhcnJheSBvZiBzcGFuXG4vLyBhcnJheXMgd2l0aCBvbmUgZWxlbWVudCBmb3IgZWFjaCBsaW5lIGluIChhZnRlcikgdGhlIGNoYW5nZS5cbmZ1bmN0aW9uIHN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpIHtcbiAgaWYgKGNoYW5nZS5mdWxsKSB7IHJldHVybiBudWxsIH1cbiAgdmFyIG9sZEZpcnN0ID0gaXNMaW5lKGRvYywgY2hhbmdlLmZyb20ubGluZSkgJiYgZ2V0TGluZShkb2MsIGNoYW5nZS5mcm9tLmxpbmUpLm1hcmtlZFNwYW5zO1xuICB2YXIgb2xkTGFzdCA9IGlzTGluZShkb2MsIGNoYW5nZS50by5saW5lKSAmJiBnZXRMaW5lKGRvYywgY2hhbmdlLnRvLmxpbmUpLm1hcmtlZFNwYW5zO1xuICBpZiAoIW9sZEZpcnN0ICYmICFvbGRMYXN0KSB7IHJldHVybiBudWxsIH1cblxuICB2YXIgc3RhcnRDaCA9IGNoYW5nZS5mcm9tLmNoLCBlbmRDaCA9IGNoYW5nZS50by5jaCwgaXNJbnNlcnQgPSBjbXAoY2hhbmdlLmZyb20sIGNoYW5nZS50bykgPT0gMDtcbiAgLy8gR2V0IHRoZSBzcGFucyB0aGF0ICdzdGljayBvdXQnIG9uIGJvdGggc2lkZXNcbiAgdmFyIGZpcnN0ID0gbWFya2VkU3BhbnNCZWZvcmUob2xkRmlyc3QsIHN0YXJ0Q2gsIGlzSW5zZXJ0KTtcbiAgdmFyIGxhc3QgPSBtYXJrZWRTcGFuc0FmdGVyKG9sZExhc3QsIGVuZENoLCBpc0luc2VydCk7XG5cbiAgLy8gTmV4dCwgbWVyZ2UgdGhvc2UgdHdvIGVuZHNcbiAgdmFyIHNhbWVMaW5lID0gY2hhbmdlLnRleHQubGVuZ3RoID09IDEsIG9mZnNldCA9IGxzdChjaGFuZ2UudGV4dCkubGVuZ3RoICsgKHNhbWVMaW5lID8gc3RhcnRDaCA6IDApO1xuICBpZiAoZmlyc3QpIHtcbiAgICAvLyBGaXggdXAgLnRvIHByb3BlcnRpZXMgb2YgZmlyc3RcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpcnN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgc3BhbiA9IGZpcnN0W2ldO1xuICAgICAgaWYgKHNwYW4udG8gPT0gbnVsbCkge1xuICAgICAgICB2YXIgZm91bmQgPSBnZXRNYXJrZWRTcGFuRm9yKGxhc3QsIHNwYW4ubWFya2VyKTtcbiAgICAgICAgaWYgKCFmb3VuZCkgeyBzcGFuLnRvID0gc3RhcnRDaDsgfVxuICAgICAgICBlbHNlIGlmIChzYW1lTGluZSkgeyBzcGFuLnRvID0gZm91bmQudG8gPT0gbnVsbCA/IG51bGwgOiBmb3VuZC50byArIG9mZnNldDsgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobGFzdCkge1xuICAgIC8vIEZpeCB1cCAuZnJvbSBpbiBsYXN0IChvciBtb3ZlIHRoZW0gaW50byBmaXJzdCBpbiBjYXNlIG9mIHNhbWVMaW5lKVxuICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGxhc3QubGVuZ3RoOyArK2kkMSkge1xuICAgICAgdmFyIHNwYW4kMSA9IGxhc3RbaSQxXTtcbiAgICAgIGlmIChzcGFuJDEudG8gIT0gbnVsbCkgeyBzcGFuJDEudG8gKz0gb2Zmc2V0OyB9XG4gICAgICBpZiAoc3BhbiQxLmZyb20gPT0gbnVsbCkge1xuICAgICAgICB2YXIgZm91bmQkMSA9IGdldE1hcmtlZFNwYW5Gb3IoZmlyc3QsIHNwYW4kMS5tYXJrZXIpO1xuICAgICAgICBpZiAoIWZvdW5kJDEpIHtcbiAgICAgICAgICBzcGFuJDEuZnJvbSA9IG9mZnNldDtcbiAgICAgICAgICBpZiAoc2FtZUxpbmUpIHsgKGZpcnN0IHx8IChmaXJzdCA9IFtdKSkucHVzaChzcGFuJDEpOyB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYW4kMS5mcm9tICs9IG9mZnNldDtcbiAgICAgICAgaWYgKHNhbWVMaW5lKSB7IChmaXJzdCB8fCAoZmlyc3QgPSBbXSkpLnB1c2goc3BhbiQxKTsgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBNYWtlIHN1cmUgd2UgZGlkbid0IGNyZWF0ZSBhbnkgemVyby1sZW5ndGggc3BhbnNcbiAgaWYgKGZpcnN0KSB7IGZpcnN0ID0gY2xlYXJFbXB0eVNwYW5zKGZpcnN0KTsgfVxuICBpZiAobGFzdCAmJiBsYXN0ICE9IGZpcnN0KSB7IGxhc3QgPSBjbGVhckVtcHR5U3BhbnMobGFzdCk7IH1cblxuICB2YXIgbmV3TWFya2VycyA9IFtmaXJzdF07XG4gIGlmICghc2FtZUxpbmUpIHtcbiAgICAvLyBGaWxsIGdhcCB3aXRoIHdob2xlLWxpbmUtc3BhbnNcbiAgICB2YXIgZ2FwID0gY2hhbmdlLnRleHQubGVuZ3RoIC0gMiwgZ2FwTWFya2VycztcbiAgICBpZiAoZ2FwID4gMCAmJiBmaXJzdClcbiAgICAgIHsgZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgZmlyc3QubGVuZ3RoOyArK2kkMilcbiAgICAgICAgeyBpZiAoZmlyc3RbaSQyXS50byA9PSBudWxsKVxuICAgICAgICAgIHsgKGdhcE1hcmtlcnMgfHwgKGdhcE1hcmtlcnMgPSBbXSkpLnB1c2gobmV3IE1hcmtlZFNwYW4oZmlyc3RbaSQyXS5tYXJrZXIsIG51bGwsIG51bGwpKTsgfSB9IH1cbiAgICBmb3IgKHZhciBpJDMgPSAwOyBpJDMgPCBnYXA7ICsraSQzKVxuICAgICAgeyBuZXdNYXJrZXJzLnB1c2goZ2FwTWFya2Vycyk7IH1cbiAgICBuZXdNYXJrZXJzLnB1c2gobGFzdCk7XG4gIH1cbiAgcmV0dXJuIG5ld01hcmtlcnNcbn1cblxuLy8gUmVtb3ZlIHNwYW5zIHRoYXQgYXJlIGVtcHR5IGFuZCBkb24ndCBoYXZlIGEgY2xlYXJXaGVuRW1wdHlcbi8vIG9wdGlvbiBvZiBmYWxzZS5cbmZ1bmN0aW9uIGNsZWFyRW1wdHlTcGFucyhzcGFucykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHNwYW4gPSBzcGFuc1tpXTtcbiAgICBpZiAoc3Bhbi5mcm9tICE9IG51bGwgJiYgc3Bhbi5mcm9tID09IHNwYW4udG8gJiYgc3Bhbi5tYXJrZXIuY2xlYXJXaGVuRW1wdHkgIT09IGZhbHNlKVxuICAgICAgeyBzcGFucy5zcGxpY2UoaS0tLCAxKTsgfVxuICB9XG4gIGlmICghc3BhbnMubGVuZ3RoKSB7IHJldHVybiBudWxsIH1cbiAgcmV0dXJuIHNwYW5zXG59XG5cbi8vIFVzZWQgdG8gJ2NsaXAnIG91dCByZWFkT25seSByYW5nZXMgd2hlbiBtYWtpbmcgYSBjaGFuZ2UuXG5mdW5jdGlvbiByZW1vdmVSZWFkT25seVJhbmdlcyhkb2MsIGZyb20sIHRvKSB7XG4gIHZhciBtYXJrZXJzID0gbnVsbDtcbiAgZG9jLml0ZXIoZnJvbS5saW5lLCB0by5saW5lICsgMSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICBpZiAobGluZS5tYXJrZWRTcGFucykgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubWFya2VkU3BhbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBtYXJrID0gbGluZS5tYXJrZWRTcGFuc1tpXS5tYXJrZXI7XG4gICAgICBpZiAobWFyay5yZWFkT25seSAmJiAoIW1hcmtlcnMgfHwgaW5kZXhPZihtYXJrZXJzLCBtYXJrKSA9PSAtMSkpXG4gICAgICAgIHsgKG1hcmtlcnMgfHwgKG1hcmtlcnMgPSBbXSkpLnB1c2gobWFyayk7IH1cbiAgICB9IH1cbiAgfSk7XG4gIGlmICghbWFya2VycykgeyByZXR1cm4gbnVsbCB9XG4gIHZhciBwYXJ0cyA9IFt7ZnJvbTogZnJvbSwgdG86IHRvfV07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBtayA9IG1hcmtlcnNbaV0sIG0gPSBtay5maW5kKDApO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyArK2opIHtcbiAgICAgIHZhciBwID0gcGFydHNbal07XG4gICAgICBpZiAoY21wKHAudG8sIG0uZnJvbSkgPCAwIHx8IGNtcChwLmZyb20sIG0udG8pID4gMCkgeyBjb250aW51ZSB9XG4gICAgICB2YXIgbmV3UGFydHMgPSBbaiwgMV0sIGRmcm9tID0gY21wKHAuZnJvbSwgbS5mcm9tKSwgZHRvID0gY21wKHAudG8sIG0udG8pO1xuICAgICAgaWYgKGRmcm9tIDwgMCB8fCAhbWsuaW5jbHVzaXZlTGVmdCAmJiAhZGZyb20pXG4gICAgICAgIHsgbmV3UGFydHMucHVzaCh7ZnJvbTogcC5mcm9tLCB0bzogbS5mcm9tfSk7IH1cbiAgICAgIGlmIChkdG8gPiAwIHx8ICFtay5pbmNsdXNpdmVSaWdodCAmJiAhZHRvKVxuICAgICAgICB7IG5ld1BhcnRzLnB1c2goe2Zyb206IG0udG8sIHRvOiBwLnRvfSk7IH1cbiAgICAgIHBhcnRzLnNwbGljZS5hcHBseShwYXJ0cywgbmV3UGFydHMpO1xuICAgICAgaiArPSBuZXdQYXJ0cy5sZW5ndGggLSAzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFydHNcbn1cblxuLy8gQ29ubmVjdCBvciBkaXNjb25uZWN0IHNwYW5zIGZyb20gYSBsaW5lLlxuZnVuY3Rpb24gZGV0YWNoTWFya2VkU3BhbnMobGluZSkge1xuICB2YXIgc3BhbnMgPSBsaW5lLm1hcmtlZFNwYW5zO1xuICBpZiAoIXNwYW5zKSB7IHJldHVybiB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpXG4gICAgeyBzcGFuc1tpXS5tYXJrZXIuZGV0YWNoTGluZShsaW5lKTsgfVxuICBsaW5lLm1hcmtlZFNwYW5zID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGF0dGFjaE1hcmtlZFNwYW5zKGxpbmUsIHNwYW5zKSB7XG4gIGlmICghc3BhbnMpIHsgcmV0dXJuIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSlcbiAgICB7IHNwYW5zW2ldLm1hcmtlci5hdHRhY2hMaW5lKGxpbmUpOyB9XG4gIGxpbmUubWFya2VkU3BhbnMgPSBzcGFucztcbn1cblxuLy8gSGVscGVycyB1c2VkIHdoZW4gY29tcHV0aW5nIHdoaWNoIG92ZXJsYXBwaW5nIGNvbGxhcHNlZCBzcGFuXG4vLyBjb3VudHMgYXMgdGhlIGxhcmdlciBvbmUuXG5mdW5jdGlvbiBleHRyYUxlZnQobWFya2VyKSB7IHJldHVybiBtYXJrZXIuaW5jbHVzaXZlTGVmdCA/IC0xIDogMCB9XG5mdW5jdGlvbiBleHRyYVJpZ2h0KG1hcmtlcikgeyByZXR1cm4gbWFya2VyLmluY2x1c2l2ZVJpZ2h0ID8gMSA6IDAgfVxuXG4vLyBSZXR1cm5zIGEgbnVtYmVyIGluZGljYXRpbmcgd2hpY2ggb2YgdHdvIG92ZXJsYXBwaW5nIGNvbGxhcHNlZFxuLy8gc3BhbnMgaXMgbGFyZ2VyIChhbmQgdGh1cyBpbmNsdWRlcyB0aGUgb3RoZXIpLiBGYWxscyBiYWNrIHRvXG4vLyBjb21wYXJpbmcgaWRzIHdoZW4gdGhlIHNwYW5zIGNvdmVyIGV4YWN0bHkgdGhlIHNhbWUgcmFuZ2UuXG5mdW5jdGlvbiBjb21wYXJlQ29sbGFwc2VkTWFya2VycyhhLCBiKSB7XG4gIHZhciBsZW5EaWZmID0gYS5saW5lcy5sZW5ndGggLSBiLmxpbmVzLmxlbmd0aDtcbiAgaWYgKGxlbkRpZmYgIT0gMCkgeyByZXR1cm4gbGVuRGlmZiB9XG4gIHZhciBhUG9zID0gYS5maW5kKCksIGJQb3MgPSBiLmZpbmQoKTtcbiAgdmFyIGZyb21DbXAgPSBjbXAoYVBvcy5mcm9tLCBiUG9zLmZyb20pIHx8IGV4dHJhTGVmdChhKSAtIGV4dHJhTGVmdChiKTtcbiAgaWYgKGZyb21DbXApIHsgcmV0dXJuIC1mcm9tQ21wIH1cbiAgdmFyIHRvQ21wID0gY21wKGFQb3MudG8sIGJQb3MudG8pIHx8IGV4dHJhUmlnaHQoYSkgLSBleHRyYVJpZ2h0KGIpO1xuICBpZiAodG9DbXApIHsgcmV0dXJuIHRvQ21wIH1cbiAgcmV0dXJuIGIuaWQgLSBhLmlkXG59XG5cbi8vIEZpbmQgb3V0IHdoZXRoZXIgYSBsaW5lIGVuZHMgb3Igc3RhcnRzIGluIGEgY29sbGFwc2VkIHNwYW4uIElmXG4vLyBzbywgcmV0dXJuIHRoZSBtYXJrZXIgZm9yIHRoYXQgc3Bhbi5cbmZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdFNpZGUobGluZSwgc3RhcnQpIHtcbiAgdmFyIHNwcyA9IHNhd0NvbGxhcHNlZFNwYW5zICYmIGxpbmUubWFya2VkU3BhbnMsIGZvdW5kO1xuICBpZiAoc3BzKSB7IGZvciAodmFyIHNwID0gKHZvaWQgMCksIGkgPSAwOyBpIDwgc3BzLmxlbmd0aDsgKytpKSB7XG4gICAgc3AgPSBzcHNbaV07XG4gICAgaWYgKHNwLm1hcmtlci5jb2xsYXBzZWQgJiYgKHN0YXJ0ID8gc3AuZnJvbSA6IHNwLnRvKSA9PSBudWxsICYmXG4gICAgICAgICghZm91bmQgfHwgY29tcGFyZUNvbGxhcHNlZE1hcmtlcnMoZm91bmQsIHNwLm1hcmtlcikgPCAwKSlcbiAgICAgIHsgZm91bmQgPSBzcC5tYXJrZXI7IH1cbiAgfSB9XG4gIHJldHVybiBmb3VuZFxufVxuZnVuY3Rpb24gY29sbGFwc2VkU3BhbkF0U3RhcnQobGluZSkgeyByZXR1cm4gY29sbGFwc2VkU3BhbkF0U2lkZShsaW5lLCB0cnVlKSB9XG5mdW5jdGlvbiBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSkgeyByZXR1cm4gY29sbGFwc2VkU3BhbkF0U2lkZShsaW5lLCBmYWxzZSkgfVxuXG4vLyBUZXN0IHdoZXRoZXIgdGhlcmUgZXhpc3RzIGEgY29sbGFwc2VkIHNwYW4gdGhhdCBwYXJ0aWFsbHlcbi8vIG92ZXJsYXBzIChjb3ZlcnMgdGhlIHN0YXJ0IG9yIGVuZCwgYnV0IG5vdCBib3RoKSBvZiBhIG5ldyBzcGFuLlxuLy8gU3VjaCBvdmVybGFwIGlzIG5vdCBhbGxvd2VkLlxuZnVuY3Rpb24gY29uZmxpY3RpbmdDb2xsYXBzZWRSYW5nZShkb2MsIGxpbmVObyQkMSwgZnJvbSwgdG8sIG1hcmtlcikge1xuICB2YXIgbGluZSA9IGdldExpbmUoZG9jLCBsaW5lTm8kJDEpO1xuICB2YXIgc3BzID0gc2F3Q29sbGFwc2VkU3BhbnMgJiYgbGluZS5tYXJrZWRTcGFucztcbiAgaWYgKHNwcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBzcCA9IHNwc1tpXTtcbiAgICBpZiAoIXNwLm1hcmtlci5jb2xsYXBzZWQpIHsgY29udGludWUgfVxuICAgIHZhciBmb3VuZCA9IHNwLm1hcmtlci5maW5kKDApO1xuICAgIHZhciBmcm9tQ21wID0gY21wKGZvdW5kLmZyb20sIGZyb20pIHx8IGV4dHJhTGVmdChzcC5tYXJrZXIpIC0gZXh0cmFMZWZ0KG1hcmtlcik7XG4gICAgdmFyIHRvQ21wID0gY21wKGZvdW5kLnRvLCB0bykgfHwgZXh0cmFSaWdodChzcC5tYXJrZXIpIC0gZXh0cmFSaWdodChtYXJrZXIpO1xuICAgIGlmIChmcm9tQ21wID49IDAgJiYgdG9DbXAgPD0gMCB8fCBmcm9tQ21wIDw9IDAgJiYgdG9DbXAgPj0gMCkgeyBjb250aW51ZSB9XG4gICAgaWYgKGZyb21DbXAgPD0gMCAmJiAoc3AubWFya2VyLmluY2x1c2l2ZVJpZ2h0ICYmIG1hcmtlci5pbmNsdXNpdmVMZWZ0ID8gY21wKGZvdW5kLnRvLCBmcm9tKSA+PSAwIDogY21wKGZvdW5kLnRvLCBmcm9tKSA+IDApIHx8XG4gICAgICAgIGZyb21DbXAgPj0gMCAmJiAoc3AubWFya2VyLmluY2x1c2l2ZVJpZ2h0ICYmIG1hcmtlci5pbmNsdXNpdmVMZWZ0ID8gY21wKGZvdW5kLmZyb20sIHRvKSA8PSAwIDogY21wKGZvdW5kLmZyb20sIHRvKSA8IDApKVxuICAgICAgeyByZXR1cm4gdHJ1ZSB9XG4gIH0gfVxufVxuXG4vLyBBIHZpc3VhbCBsaW5lIGlzIGEgbGluZSBhcyBkcmF3biBvbiB0aGUgc2NyZWVuLiBGb2xkaW5nLCBmb3Jcbi8vIGV4YW1wbGUsIGNhbiBjYXVzZSBtdWx0aXBsZSBsb2dpY2FsIGxpbmVzIHRvIGFwcGVhciBvbiB0aGUgc2FtZVxuLy8gdmlzdWFsIGxpbmUuIFRoaXMgZmluZHMgdGhlIHN0YXJ0IG9mIHRoZSB2aXN1YWwgbGluZSB0aGF0IHRoZVxuLy8gZ2l2ZW4gbGluZSBpcyBwYXJ0IG9mICh1c3VhbGx5IHRoYXQgaXMgdGhlIGxpbmUgaXRzZWxmKS5cbmZ1bmN0aW9uIHZpc3VhbExpbmUobGluZSkge1xuICB2YXIgbWVyZ2VkO1xuICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0U3RhcnQobGluZSkpXG4gICAgeyBsaW5lID0gbWVyZ2VkLmZpbmQoLTEsIHRydWUpLmxpbmU7IH1cbiAgcmV0dXJuIGxpbmVcbn1cblxuZnVuY3Rpb24gdmlzdWFsTGluZUVuZChsaW5lKSB7XG4gIHZhciBtZXJnZWQ7XG4gIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSkpXG4gICAgeyBsaW5lID0gbWVyZ2VkLmZpbmQoMSwgdHJ1ZSkubGluZTsgfVxuICByZXR1cm4gbGluZVxufVxuXG4vLyBSZXR1cm5zIGFuIGFycmF5IG9mIGxvZ2ljYWwgbGluZXMgdGhhdCBjb250aW51ZSB0aGUgdmlzdWFsIGxpbmVcbi8vIHN0YXJ0ZWQgYnkgdGhlIGFyZ3VtZW50LCBvciB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggbGluZXMuXG5mdW5jdGlvbiB2aXN1YWxMaW5lQ29udGludWVkKGxpbmUpIHtcbiAgdmFyIG1lcmdlZCwgbGluZXM7XG4gIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSkpIHtcbiAgICBsaW5lID0gbWVyZ2VkLmZpbmQoMSwgdHJ1ZSkubGluZVxuICAgIDsobGluZXMgfHwgKGxpbmVzID0gW10pKS5wdXNoKGxpbmUpO1xuICB9XG4gIHJldHVybiBsaW5lc1xufVxuXG4vLyBHZXQgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzdGFydCBvZiB0aGUgdmlzdWFsIGxpbmUgdGhhdCB0aGVcbi8vIGdpdmVuIGxpbmUgbnVtYmVyIGlzIHBhcnQgb2YuXG5mdW5jdGlvbiB2aXN1YWxMaW5lTm8oZG9jLCBsaW5lTikge1xuICB2YXIgbGluZSA9IGdldExpbmUoZG9jLCBsaW5lTiksIHZpcyA9IHZpc3VhbExpbmUobGluZSk7XG4gIGlmIChsaW5lID09IHZpcykgeyByZXR1cm4gbGluZU4gfVxuICByZXR1cm4gbGluZU5vKHZpcylcbn1cblxuLy8gR2V0IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgc3RhcnQgb2YgdGhlIG5leHQgdmlzdWFsIGxpbmUgYWZ0ZXJcbi8vIHRoZSBnaXZlbiBsaW5lLlxuZnVuY3Rpb24gdmlzdWFsTGluZUVuZE5vKGRvYywgbGluZU4pIHtcbiAgaWYgKGxpbmVOID4gZG9jLmxhc3RMaW5lKCkpIHsgcmV0dXJuIGxpbmVOIH1cbiAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgbGluZU4pLCBtZXJnZWQ7XG4gIGlmICghbGluZUlzSGlkZGVuKGRvYywgbGluZSkpIHsgcmV0dXJuIGxpbmVOIH1cbiAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lKSlcbiAgICB7IGxpbmUgPSBtZXJnZWQuZmluZCgxLCB0cnVlKS5saW5lOyB9XG4gIHJldHVybiBsaW5lTm8obGluZSkgKyAxXG59XG5cbi8vIENvbXB1dGUgd2hldGhlciBhIGxpbmUgaXMgaGlkZGVuLiBMaW5lcyBjb3VudCBhcyBoaWRkZW4gd2hlbiB0aGV5XG4vLyBhcmUgcGFydCBvZiBhIHZpc3VhbCBsaW5lIHRoYXQgc3RhcnRzIHdpdGggYW5vdGhlciBsaW5lLCBvciB3aGVuXG4vLyB0aGV5IGFyZSBlbnRpcmVseSBjb3ZlcmVkIGJ5IGNvbGxhcHNlZCwgbm9uLXdpZGdldCBzcGFuLlxuZnVuY3Rpb24gbGluZUlzSGlkZGVuKGRvYywgbGluZSkge1xuICB2YXIgc3BzID0gc2F3Q29sbGFwc2VkU3BhbnMgJiYgbGluZS5tYXJrZWRTcGFucztcbiAgaWYgKHNwcykgeyBmb3IgKHZhciBzcCA9ICh2b2lkIDApLCBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkge1xuICAgIHNwID0gc3BzW2ldO1xuICAgIGlmICghc3AubWFya2VyLmNvbGxhcHNlZCkgeyBjb250aW51ZSB9XG4gICAgaWYgKHNwLmZyb20gPT0gbnVsbCkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgaWYgKHNwLm1hcmtlci53aWRnZXROb2RlKSB7IGNvbnRpbnVlIH1cbiAgICBpZiAoc3AuZnJvbSA9PSAwICYmIHNwLm1hcmtlci5pbmNsdXNpdmVMZWZ0ICYmIGxpbmVJc0hpZGRlbklubmVyKGRvYywgbGluZSwgc3ApKVxuICAgICAgeyByZXR1cm4gdHJ1ZSB9XG4gIH0gfVxufVxuZnVuY3Rpb24gbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBsaW5lLCBzcGFuKSB7XG4gIGlmIChzcGFuLnRvID09IG51bGwpIHtcbiAgICB2YXIgZW5kID0gc3Bhbi5tYXJrZXIuZmluZCgxLCB0cnVlKTtcbiAgICByZXR1cm4gbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBlbmQubGluZSwgZ2V0TWFya2VkU3BhbkZvcihlbmQubGluZS5tYXJrZWRTcGFucywgc3Bhbi5tYXJrZXIpKVxuICB9XG4gIGlmIChzcGFuLm1hcmtlci5pbmNsdXNpdmVSaWdodCAmJiBzcGFuLnRvID09IGxpbmUudGV4dC5sZW5ndGgpXG4gICAgeyByZXR1cm4gdHJ1ZSB9XG4gIGZvciAodmFyIHNwID0gKHZvaWQgMCksIGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkge1xuICAgIHNwID0gbGluZS5tYXJrZWRTcGFuc1tpXTtcbiAgICBpZiAoc3AubWFya2VyLmNvbGxhcHNlZCAmJiAhc3AubWFya2VyLndpZGdldE5vZGUgJiYgc3AuZnJvbSA9PSBzcGFuLnRvICYmXG4gICAgICAgIChzcC50byA9PSBudWxsIHx8IHNwLnRvICE9IHNwYW4uZnJvbSkgJiZcbiAgICAgICAgKHNwLm1hcmtlci5pbmNsdXNpdmVMZWZ0IHx8IHNwYW4ubWFya2VyLmluY2x1c2l2ZVJpZ2h0KSAmJlxuICAgICAgICBsaW5lSXNIaWRkZW5Jbm5lcihkb2MsIGxpbmUsIHNwKSkgeyByZXR1cm4gdHJ1ZSB9XG4gIH1cbn1cblxuLy8gRmluZCB0aGUgaGVpZ2h0IGFib3ZlIHRoZSBnaXZlbiBsaW5lLlxuZnVuY3Rpb24gaGVpZ2h0QXRMaW5lKGxpbmVPYmopIHtcbiAgbGluZU9iaiA9IHZpc3VhbExpbmUobGluZU9iaik7XG5cbiAgdmFyIGggPSAwLCBjaHVuayA9IGxpbmVPYmoucGFyZW50O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNodW5rLmxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGxpbmUgPSBjaHVuay5saW5lc1tpXTtcbiAgICBpZiAobGluZSA9PSBsaW5lT2JqKSB7IGJyZWFrIH1cbiAgICBlbHNlIHsgaCArPSBsaW5lLmhlaWdodDsgfVxuICB9XG4gIGZvciAodmFyIHAgPSBjaHVuay5wYXJlbnQ7IHA7IGNodW5rID0gcCwgcCA9IGNodW5rLnBhcmVudCkge1xuICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHAuY2hpbGRyZW4ubGVuZ3RoOyArK2kkMSkge1xuICAgICAgdmFyIGN1ciA9IHAuY2hpbGRyZW5baSQxXTtcbiAgICAgIGlmIChjdXIgPT0gY2h1bmspIHsgYnJlYWsgfVxuICAgICAgZWxzZSB7IGggKz0gY3VyLmhlaWdodDsgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaFxufVxuXG4vLyBDb21wdXRlIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIG9mIGEgbGluZSwgdGFraW5nIGludG8gYWNjb3VudFxuLy8gY29sbGFwc2VkIHJhbmdlcyAoc2VlIG1hcmtUZXh0KSB0aGF0IG1pZ2h0IGhpZGUgcGFydHMsIGFuZCBqb2luXG4vLyBvdGhlciBsaW5lcyBvbnRvIGl0LlxuZnVuY3Rpb24gbGluZUxlbmd0aChsaW5lKSB7XG4gIGlmIChsaW5lLmhlaWdodCA9PSAwKSB7IHJldHVybiAwIH1cbiAgdmFyIGxlbiA9IGxpbmUudGV4dC5sZW5ndGgsIG1lcmdlZCwgY3VyID0gbGluZTtcbiAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdFN0YXJ0KGN1cikpIHtcbiAgICB2YXIgZm91bmQgPSBtZXJnZWQuZmluZCgwLCB0cnVlKTtcbiAgICBjdXIgPSBmb3VuZC5mcm9tLmxpbmU7XG4gICAgbGVuICs9IGZvdW5kLmZyb20uY2ggLSBmb3VuZC50by5jaDtcbiAgfVxuICBjdXIgPSBsaW5lO1xuICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGN1cikpIHtcbiAgICB2YXIgZm91bmQkMSA9IG1lcmdlZC5maW5kKDAsIHRydWUpO1xuICAgIGxlbiAtPSBjdXIudGV4dC5sZW5ndGggLSBmb3VuZCQxLmZyb20uY2g7XG4gICAgY3VyID0gZm91bmQkMS50by5saW5lO1xuICAgIGxlbiArPSBjdXIudGV4dC5sZW5ndGggLSBmb3VuZCQxLnRvLmNoO1xuICB9XG4gIHJldHVybiBsZW5cbn1cblxuLy8gRmluZCB0aGUgbG9uZ2VzdCBsaW5lIGluIHRoZSBkb2N1bWVudC5cbmZ1bmN0aW9uIGZpbmRNYXhMaW5lKGNtKSB7XG4gIHZhciBkID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jO1xuICBkLm1heExpbmUgPSBnZXRMaW5lKGRvYywgZG9jLmZpcnN0KTtcbiAgZC5tYXhMaW5lTGVuZ3RoID0gbGluZUxlbmd0aChkLm1heExpbmUpO1xuICBkLm1heExpbmVDaGFuZ2VkID0gdHJ1ZTtcbiAgZG9jLml0ZXIoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICB2YXIgbGVuID0gbGluZUxlbmd0aChsaW5lKTtcbiAgICBpZiAobGVuID4gZC5tYXhMaW5lTGVuZ3RoKSB7XG4gICAgICBkLm1heExpbmVMZW5ndGggPSBsZW47XG4gICAgICBkLm1heExpbmUgPSBsaW5lO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEJJREkgSEVMUEVSU1xuXG5mdW5jdGlvbiBpdGVyYXRlQmlkaVNlY3Rpb25zKG9yZGVyLCBmcm9tLCB0bywgZikge1xuICBpZiAoIW9yZGVyKSB7IHJldHVybiBmKGZyb20sIHRvLCBcImx0clwiLCAwKSB9XG4gIHZhciBmb3VuZCA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnQgPSBvcmRlcltpXTtcbiAgICBpZiAocGFydC5mcm9tIDwgdG8gJiYgcGFydC50byA+IGZyb20gfHwgZnJvbSA9PSB0byAmJiBwYXJ0LnRvID09IGZyb20pIHtcbiAgICAgIGYoTWF0aC5tYXgocGFydC5mcm9tLCBmcm9tKSwgTWF0aC5taW4ocGFydC50bywgdG8pLCBwYXJ0LmxldmVsID09IDEgPyBcInJ0bFwiIDogXCJsdHJcIiwgaSk7XG4gICAgICBmb3VuZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmICghZm91bmQpIHsgZihmcm9tLCB0bywgXCJsdHJcIik7IH1cbn1cblxudmFyIGJpZGlPdGhlciA9IG51bGw7XG5mdW5jdGlvbiBnZXRCaWRpUGFydEF0KG9yZGVyLCBjaCwgc3RpY2t5KSB7XG4gIHZhciBmb3VuZDtcbiAgYmlkaU90aGVyID0gbnVsbDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7ICsraSkge1xuICAgIHZhciBjdXIgPSBvcmRlcltpXTtcbiAgICBpZiAoY3VyLmZyb20gPCBjaCAmJiBjdXIudG8gPiBjaCkgeyByZXR1cm4gaSB9XG4gICAgaWYgKGN1ci50byA9PSBjaCkge1xuICAgICAgaWYgKGN1ci5mcm9tICE9IGN1ci50byAmJiBzdGlja3kgPT0gXCJiZWZvcmVcIikgeyBmb3VuZCA9IGk7IH1cbiAgICAgIGVsc2UgeyBiaWRpT3RoZXIgPSBpOyB9XG4gICAgfVxuICAgIGlmIChjdXIuZnJvbSA9PSBjaCkge1xuICAgICAgaWYgKGN1ci5mcm9tICE9IGN1ci50byAmJiBzdGlja3kgIT0gXCJiZWZvcmVcIikgeyBmb3VuZCA9IGk7IH1cbiAgICAgIGVsc2UgeyBiaWRpT3RoZXIgPSBpOyB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3VuZCAhPSBudWxsID8gZm91bmQgOiBiaWRpT3RoZXJcbn1cblxuLy8gQmlkaXJlY3Rpb25hbCBvcmRlcmluZyBhbGdvcml0aG1cbi8vIFNlZSBodHRwOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjkvdHI5LTEzLmh0bWwgZm9yIHRoZSBhbGdvcml0aG1cbi8vIHRoYXQgdGhpcyAocGFydGlhbGx5KSBpbXBsZW1lbnRzLlxuXG4vLyBPbmUtY2hhciBjb2RlcyB1c2VkIGZvciBjaGFyYWN0ZXIgdHlwZXM6XG4vLyBMIChMKTogICBMZWZ0LXRvLVJpZ2h0XG4vLyBSIChSKTogICBSaWdodC10by1MZWZ0XG4vLyByIChBTCk6ICBSaWdodC10by1MZWZ0IEFyYWJpY1xuLy8gMSAoRU4pOiAgRXVyb3BlYW4gTnVtYmVyXG4vLyArIChFUyk6ICBFdXJvcGVhbiBOdW1iZXIgU2VwYXJhdG9yXG4vLyAlIChFVCk6ICBFdXJvcGVhbiBOdW1iZXIgVGVybWluYXRvclxuLy8gbiAoQU4pOiAgQXJhYmljIE51bWJlclxuLy8gLCAoQ1MpOiAgQ29tbW9uIE51bWJlciBTZXBhcmF0b3Jcbi8vIG0gKE5TTSk6IE5vbi1TcGFjaW5nIE1hcmtcbi8vIGIgKEJOKTogIEJvdW5kYXJ5IE5ldXRyYWxcbi8vIHMgKEIpOiAgIFBhcmFncmFwaCBTZXBhcmF0b3Jcbi8vIHQgKFMpOiAgIFNlZ21lbnQgU2VwYXJhdG9yXG4vLyB3IChXUyk6ICBXaGl0ZXNwYWNlXG4vLyBOIChPTik6ICBPdGhlciBOZXV0cmFsc1xuXG4vLyBSZXR1cm5zIG51bGwgaWYgY2hhcmFjdGVycyBhcmUgb3JkZXJlZCBhcyB0aGV5IGFwcGVhclxuLy8gKGxlZnQtdG8tcmlnaHQpLCBvciBhbiBhcnJheSBvZiBzZWN0aW9ucyAoe2Zyb20sIHRvLCBsZXZlbH1cbi8vIG9iamVjdHMpIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VyIHZpc3VhbGx5LlxudmFyIGJpZGlPcmRlcmluZyA9IChmdW5jdGlvbigpIHtcbiAgLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDAgdG8gMHhmZlxuICB2YXIgbG93VHlwZXMgPSBcImJiYmJiYmJiYnRzdHdzYmJiYmJiYmJiYmJiYmJzc3N0d05OJSUlTk5OTk5OLE4sTjExMTExMTExMTFOTk5OTk5OTExMTExMTExMTExMTExMTExMTExMTExMTExOTk5OTk5MTExMTExMTExMTExMTExMTExMTExMTExMTE5OTk5iYmJiYmJzYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIsTiUlJSVOTk5OTE5OTk5OJSUxMU5MTk5OMUxOTk5OTkxMTExMTExMTExMTExMTExMTExMTExMTkxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExOXCI7XG4gIC8vIENoYXJhY3RlciB0eXBlcyBmb3IgY29kZXBvaW50cyAweDYwMCB0byAweDZmOVxuICB2YXIgYXJhYmljVHlwZXMgPSBcIm5ubm5ubk5OciUlcixyTk5tbW1tbW1tbW1tbXJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycm1tbW1tbW1tbW1tbW1tbW1tbW1tbW5ubm5ubm5ubm4lbm5ycnJtcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJtbW1tbW1tbk5tbW1tbW1ycm1tTm1tbW1ycjExMTExMTExMTFcIjtcbiAgZnVuY3Rpb24gY2hhclR5cGUoY29kZSkge1xuICAgIGlmIChjb2RlIDw9IDB4ZjcpIHsgcmV0dXJuIGxvd1R5cGVzLmNoYXJBdChjb2RlKSB9XG4gICAgZWxzZSBpZiAoMHg1OTAgPD0gY29kZSAmJiBjb2RlIDw9IDB4NWY0KSB7IHJldHVybiBcIlJcIiB9XG4gICAgZWxzZSBpZiAoMHg2MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4NmY5KSB7IHJldHVybiBhcmFiaWNUeXBlcy5jaGFyQXQoY29kZSAtIDB4NjAwKSB9XG4gICAgZWxzZSBpZiAoMHg2ZWUgPD0gY29kZSAmJiBjb2RlIDw9IDB4OGFjKSB7IHJldHVybiBcInJcIiB9XG4gICAgZWxzZSBpZiAoMHgyMDAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDIwMGIpIHsgcmV0dXJuIFwid1wiIH1cbiAgICBlbHNlIGlmIChjb2RlID09IDB4MjAwYykgeyByZXR1cm4gXCJiXCIgfVxuICAgIGVsc2UgeyByZXR1cm4gXCJMXCIgfVxuICB9XG5cbiAgdmFyIGJpZGlSRSA9IC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXS87XG4gIHZhciBpc05ldXRyYWwgPSAvW3N0d05dLywgaXNTdHJvbmcgPSAvW0xScl0vLCBjb3VudHNBc0xlZnQgPSAvW0xiMW5dLywgY291bnRzQXNOdW0gPSAvWzFuXS87XG5cbiAgZnVuY3Rpb24gQmlkaVNwYW4obGV2ZWwsIGZyb20sIHRvKSB7XG4gICAgdGhpcy5sZXZlbCA9IGxldmVsO1xuICAgIHRoaXMuZnJvbSA9IGZyb207IHRoaXMudG8gPSB0bztcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihzdHIsIGRpcmVjdGlvbikge1xuICAgIHZhciBvdXRlclR5cGUgPSBkaXJlY3Rpb24gPT0gXCJsdHJcIiA/IFwiTFwiIDogXCJSXCI7XG5cbiAgICBpZiAoc3RyLmxlbmd0aCA9PSAwIHx8IGRpcmVjdGlvbiA9PSBcImx0clwiICYmICFiaWRpUkUudGVzdChzdHIpKSB7IHJldHVybiBmYWxzZSB9XG4gICAgdmFyIGxlbiA9IHN0ci5sZW5ndGgsIHR5cGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIHsgdHlwZXMucHVzaChjaGFyVHlwZShzdHIuY2hhckNvZGVBdChpKSkpOyB9XG5cbiAgICAvLyBXMS4gRXhhbWluZSBlYWNoIG5vbi1zcGFjaW5nIG1hcmsgKE5TTSkgaW4gdGhlIGxldmVsIHJ1biwgYW5kXG4gICAgLy8gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBOU00gdG8gdGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzXG4gICAgLy8gY2hhcmFjdGVyLiBJZiB0aGUgTlNNIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGV2ZWwgcnVuLCBpdCB3aWxsXG4gICAgLy8gZ2V0IHRoZSB0eXBlIG9mIHNvci5cbiAgICBmb3IgKHZhciBpJDEgPSAwLCBwcmV2ID0gb3V0ZXJUeXBlOyBpJDEgPCBsZW47ICsraSQxKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVzW2kkMV07XG4gICAgICBpZiAodHlwZSA9PSBcIm1cIikgeyB0eXBlc1tpJDFdID0gcHJldjsgfVxuICAgICAgZWxzZSB7IHByZXYgPSB0eXBlOyB9XG4gICAgfVxuXG4gICAgLy8gVzIuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyXG4gICAgLy8gdW50aWwgdGhlIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBBTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW5cbiAgICAvLyBBTCBpcyBmb3VuZCwgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gQXJhYmljXG4gICAgLy8gbnVtYmVyLlxuICAgIC8vIFczLiBDaGFuZ2UgYWxsIEFMcyB0byBSLlxuICAgIGZvciAodmFyIGkkMiA9IDAsIGN1ciA9IG91dGVyVHlwZTsgaSQyIDwgbGVuOyArK2kkMikge1xuICAgICAgdmFyIHR5cGUkMSA9IHR5cGVzW2kkMl07XG4gICAgICBpZiAodHlwZSQxID09IFwiMVwiICYmIGN1ciA9PSBcInJcIikgeyB0eXBlc1tpJDJdID0gXCJuXCI7IH1cbiAgICAgIGVsc2UgaWYgKGlzU3Ryb25nLnRlc3QodHlwZSQxKSkgeyBjdXIgPSB0eXBlJDE7IGlmICh0eXBlJDEgPT0gXCJyXCIpIHsgdHlwZXNbaSQyXSA9IFwiUlwiOyB9IH1cbiAgICB9XG5cbiAgICAvLyBXNC4gQSBzaW5nbGUgRXVyb3BlYW4gc2VwYXJhdG9yIGJldHdlZW4gdHdvIEV1cm9wZWFuIG51bWJlcnNcbiAgICAvLyBjaGFuZ2VzIHRvIGEgRXVyb3BlYW4gbnVtYmVyLiBBIHNpbmdsZSBjb21tb24gc2VwYXJhdG9yIGJldHdlZW5cbiAgICAvLyB0d28gbnVtYmVycyBvZiB0aGUgc2FtZSB0eXBlIGNoYW5nZXMgdG8gdGhhdCB0eXBlLlxuICAgIGZvciAodmFyIGkkMyA9IDEsIHByZXYkMSA9IHR5cGVzWzBdOyBpJDMgPCBsZW4gLSAxOyArK2kkMykge1xuICAgICAgdmFyIHR5cGUkMiA9IHR5cGVzW2kkM107XG4gICAgICBpZiAodHlwZSQyID09IFwiK1wiICYmIHByZXYkMSA9PSBcIjFcIiAmJiB0eXBlc1tpJDMrMV0gPT0gXCIxXCIpIHsgdHlwZXNbaSQzXSA9IFwiMVwiOyB9XG4gICAgICBlbHNlIGlmICh0eXBlJDIgPT0gXCIsXCIgJiYgcHJldiQxID09IHR5cGVzW2kkMysxXSAmJlxuICAgICAgICAgICAgICAgKHByZXYkMSA9PSBcIjFcIiB8fCBwcmV2JDEgPT0gXCJuXCIpKSB7IHR5cGVzW2kkM10gPSBwcmV2JDE7IH1cbiAgICAgIHByZXYkMSA9IHR5cGUkMjtcbiAgICB9XG5cbiAgICAvLyBXNS4gQSBzZXF1ZW5jZSBvZiBFdXJvcGVhbiB0ZXJtaW5hdG9ycyBhZGphY2VudCB0byBFdXJvcGVhblxuICAgIC8vIG51bWJlcnMgY2hhbmdlcyB0byBhbGwgRXVyb3BlYW4gbnVtYmVycy5cbiAgICAvLyBXNi4gT3RoZXJ3aXNlLCBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycyBjaGFuZ2UgdG8gT3RoZXJcbiAgICAvLyBOZXV0cmFsLlxuICAgIGZvciAodmFyIGkkNCA9IDA7IGkkNCA8IGxlbjsgKytpJDQpIHtcbiAgICAgIHZhciB0eXBlJDMgPSB0eXBlc1tpJDRdO1xuICAgICAgaWYgKHR5cGUkMyA9PSBcIixcIikgeyB0eXBlc1tpJDRdID0gXCJOXCI7IH1cbiAgICAgIGVsc2UgaWYgKHR5cGUkMyA9PSBcIiVcIikge1xuICAgICAgICB2YXIgZW5kID0gKHZvaWQgMCk7XG4gICAgICAgIGZvciAoZW5kID0gaSQ0ICsgMTsgZW5kIDwgbGVuICYmIHR5cGVzW2VuZF0gPT0gXCIlXCI7ICsrZW5kKSB7fVxuICAgICAgICB2YXIgcmVwbGFjZSA9IChpJDQgJiYgdHlwZXNbaSQ0LTFdID09IFwiIVwiKSB8fCAoZW5kIDwgbGVuICYmIHR5cGVzW2VuZF0gPT0gXCIxXCIpID8gXCIxXCIgOiBcIk5cIjtcbiAgICAgICAgZm9yICh2YXIgaiA9IGkkNDsgaiA8IGVuZDsgKytqKSB7IHR5cGVzW2pdID0gcmVwbGFjZTsgfVxuICAgICAgICBpJDQgPSBlbmQgLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFc3LiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlclxuICAgIC8vIHVudGlsIHRoZSBmaXJzdCBzdHJvbmcgdHlwZSAoUiwgTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW4gTCBpc1xuICAgIC8vIGZvdW5kLCB0aGVuIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgRXVyb3BlYW4gbnVtYmVyIHRvIEwuXG4gICAgZm9yICh2YXIgaSQ1ID0gMCwgY3VyJDEgPSBvdXRlclR5cGU7IGkkNSA8IGxlbjsgKytpJDUpIHtcbiAgICAgIHZhciB0eXBlJDQgPSB0eXBlc1tpJDVdO1xuICAgICAgaWYgKGN1ciQxID09IFwiTFwiICYmIHR5cGUkNCA9PSBcIjFcIikgeyB0eXBlc1tpJDVdID0gXCJMXCI7IH1cbiAgICAgIGVsc2UgaWYgKGlzU3Ryb25nLnRlc3QodHlwZSQ0KSkgeyBjdXIkMSA9IHR5cGUkNDsgfVxuICAgIH1cblxuICAgIC8vIE4xLiBBIHNlcXVlbmNlIG9mIG5ldXRyYWxzIHRha2VzIHRoZSBkaXJlY3Rpb24gb2YgdGhlXG4gICAgLy8gc3Vycm91bmRpbmcgc3Ryb25nIHRleHQgaWYgdGhlIHRleHQgb24gYm90aCBzaWRlcyBoYXMgdGhlIHNhbWVcbiAgICAvLyBkaXJlY3Rpb24uIEV1cm9wZWFuIGFuZCBBcmFiaWMgbnVtYmVycyBhY3QgYXMgaWYgdGhleSB3ZXJlIFIgaW5cbiAgICAvLyB0ZXJtcyBvZiB0aGVpciBpbmZsdWVuY2Ugb24gbmV1dHJhbHMuIFN0YXJ0LW9mLWxldmVsLXJ1biAoc29yKVxuICAgIC8vIGFuZCBlbmQtb2YtbGV2ZWwtcnVuIChlb3IpIGFyZSB1c2VkIGF0IGxldmVsIHJ1biBib3VuZGFyaWVzLlxuICAgIC8vIE4yLiBBbnkgcmVtYWluaW5nIG5ldXRyYWxzIHRha2UgdGhlIGVtYmVkZGluZyBkaXJlY3Rpb24uXG4gICAgZm9yICh2YXIgaSQ2ID0gMDsgaSQ2IDwgbGVuOyArK2kkNikge1xuICAgICAgaWYgKGlzTmV1dHJhbC50ZXN0KHR5cGVzW2kkNl0pKSB7XG4gICAgICAgIHZhciBlbmQkMSA9ICh2b2lkIDApO1xuICAgICAgICBmb3IgKGVuZCQxID0gaSQ2ICsgMTsgZW5kJDEgPCBsZW4gJiYgaXNOZXV0cmFsLnRlc3QodHlwZXNbZW5kJDFdKTsgKytlbmQkMSkge31cbiAgICAgICAgdmFyIGJlZm9yZSA9IChpJDYgPyB0eXBlc1tpJDYtMV0gOiBvdXRlclR5cGUpID09IFwiTFwiO1xuICAgICAgICB2YXIgYWZ0ZXIgPSAoZW5kJDEgPCBsZW4gPyB0eXBlc1tlbmQkMV0gOiBvdXRlclR5cGUpID09IFwiTFwiO1xuICAgICAgICB2YXIgcmVwbGFjZSQxID0gYmVmb3JlID09IGFmdGVyID8gKGJlZm9yZSA/IFwiTFwiIDogXCJSXCIpIDogb3V0ZXJUeXBlO1xuICAgICAgICBmb3IgKHZhciBqJDEgPSBpJDY7IGokMSA8IGVuZCQxOyArK2okMSkgeyB0eXBlc1tqJDFdID0gcmVwbGFjZSQxOyB9XG4gICAgICAgIGkkNiA9IGVuZCQxIC0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIZXJlIHdlIGRlcGFydCBmcm9tIHRoZSBkb2N1bWVudGVkIGFsZ29yaXRobSwgaW4gb3JkZXIgdG8gYXZvaWRcbiAgICAvLyBidWlsZGluZyB1cCBhbiBhY3R1YWwgbGV2ZWxzIGFycmF5LiBTaW5jZSB0aGVyZSBhcmUgb25seSB0aHJlZVxuICAgIC8vIGxldmVscyAoMCwgMSwgMikgaW4gYW4gaW1wbGVtZW50YXRpb24gdGhhdCBkb2Vzbid0IHRha2VcbiAgICAvLyBleHBsaWNpdCBlbWJlZGRpbmcgaW50byBhY2NvdW50LCB3ZSBjYW4gYnVpbGQgdXAgdGhlIG9yZGVyIG9uXG4gICAgLy8gdGhlIGZseSwgd2l0aG91dCBmb2xsb3dpbmcgdGhlIGxldmVsLWJhc2VkIGFsZ29yaXRobS5cbiAgICB2YXIgb3JkZXIgPSBbXSwgbTtcbiAgICBmb3IgKHZhciBpJDcgPSAwOyBpJDcgPCBsZW47KSB7XG4gICAgICBpZiAoY291bnRzQXNMZWZ0LnRlc3QodHlwZXNbaSQ3XSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gaSQ3O1xuICAgICAgICBmb3IgKCsraSQ3OyBpJDcgPCBsZW4gJiYgY291bnRzQXNMZWZ0LnRlc3QodHlwZXNbaSQ3XSk7ICsraSQ3KSB7fVxuICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbigwLCBzdGFydCwgaSQ3KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcG9zID0gaSQ3LCBhdCA9IG9yZGVyLmxlbmd0aDtcbiAgICAgICAgZm9yICgrK2kkNzsgaSQ3IDwgbGVuICYmIHR5cGVzW2kkN10gIT0gXCJMXCI7ICsraSQ3KSB7fVxuICAgICAgICBmb3IgKHZhciBqJDIgPSBwb3M7IGokMiA8IGkkNzspIHtcbiAgICAgICAgICBpZiAoY291bnRzQXNOdW0udGVzdCh0eXBlc1tqJDJdKSkge1xuICAgICAgICAgICAgaWYgKHBvcyA8IGokMikgeyBvcmRlci5zcGxpY2UoYXQsIDAsIG5ldyBCaWRpU3BhbigxLCBwb3MsIGokMikpOyB9XG4gICAgICAgICAgICB2YXIgbnN0YXJ0ID0gaiQyO1xuICAgICAgICAgICAgZm9yICgrK2okMjsgaiQyIDwgaSQ3ICYmIGNvdW50c0FzTnVtLnRlc3QodHlwZXNbaiQyXSk7ICsraiQyKSB7fVxuICAgICAgICAgICAgb3JkZXIuc3BsaWNlKGF0LCAwLCBuZXcgQmlkaVNwYW4oMiwgbnN0YXJ0LCBqJDIpKTtcbiAgICAgICAgICAgIHBvcyA9IGokMjtcbiAgICAgICAgICB9IGVsc2UgeyArK2okMjsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MgPCBpJDcpIHsgb3JkZXIuc3BsaWNlKGF0LCAwLCBuZXcgQmlkaVNwYW4oMSwgcG9zLCBpJDcpKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uID09IFwibHRyXCIpIHtcbiAgICAgIGlmIChvcmRlclswXS5sZXZlbCA9PSAxICYmIChtID0gc3RyLm1hdGNoKC9eXFxzKy8pKSkge1xuICAgICAgICBvcmRlclswXS5mcm9tID0gbVswXS5sZW5ndGg7XG4gICAgICAgIG9yZGVyLnVuc2hpZnQobmV3IEJpZGlTcGFuKDAsIDAsIG1bMF0ubGVuZ3RoKSk7XG4gICAgICB9XG4gICAgICBpZiAobHN0KG9yZGVyKS5sZXZlbCA9PSAxICYmIChtID0gc3RyLm1hdGNoKC9cXHMrJC8pKSkge1xuICAgICAgICBsc3Qob3JkZXIpLnRvIC09IG1bMF0ubGVuZ3RoO1xuICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbigwLCBsZW4gLSBtWzBdLmxlbmd0aCwgbGVuKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PSBcInJ0bFwiID8gb3JkZXIucmV2ZXJzZSgpIDogb3JkZXJcbiAgfVxufSkoKTtcblxuLy8gR2V0IHRoZSBiaWRpIG9yZGVyaW5nIGZvciB0aGUgZ2l2ZW4gbGluZSAoYW5kIGNhY2hlIGl0KS4gUmV0dXJuc1xuLy8gZmFsc2UgZm9yIGxpbmVzIHRoYXQgYXJlIGZ1bGx5IGxlZnQtdG8tcmlnaHQsIGFuZCBhbiBhcnJheSBvZlxuLy8gQmlkaVNwYW4gb2JqZWN0cyBvdGhlcndpc2UuXG5mdW5jdGlvbiBnZXRPcmRlcihsaW5lLCBkaXJlY3Rpb24pIHtcbiAgdmFyIG9yZGVyID0gbGluZS5vcmRlcjtcbiAgaWYgKG9yZGVyID09IG51bGwpIHsgb3JkZXIgPSBsaW5lLm9yZGVyID0gYmlkaU9yZGVyaW5nKGxpbmUudGV4dCwgZGlyZWN0aW9uKTsgfVxuICByZXR1cm4gb3JkZXJcbn1cblxuLy8gRVZFTlQgSEFORExJTkdcblxuLy8gTGlnaHR3ZWlnaHQgZXZlbnQgZnJhbWV3b3JrLiBvbi9vZmYgYWxzbyB3b3JrIG9uIERPTSBub2Rlcyxcbi8vIHJlZ2lzdGVyaW5nIG5hdGl2ZSBET00gaGFuZGxlcnMuXG5cbnZhciBub0hhbmRsZXJzID0gW107XG5cbnZhciBvbiA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUsIGYpIHtcbiAgaWYgKGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAoZW1pdHRlci5hdHRhY2hFdmVudCkge1xuICAgIGVtaXR0ZXIuYXR0YWNoRXZlbnQoXCJvblwiICsgdHlwZSwgZik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG1hcCQkMSA9IGVtaXR0ZXIuX2hhbmRsZXJzIHx8IChlbWl0dGVyLl9oYW5kbGVycyA9IHt9KTtcbiAgICBtYXAkJDFbdHlwZV0gPSAobWFwJCQxW3R5cGVdIHx8IG5vSGFuZGxlcnMpLmNvbmNhdChmKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0SGFuZGxlcnMoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5faGFuZGxlcnMgJiYgZW1pdHRlci5faGFuZGxlcnNbdHlwZV0gfHwgbm9IYW5kbGVyc1xufVxuXG5mdW5jdGlvbiBvZmYoZW1pdHRlciwgdHlwZSwgZikge1xuICBpZiAoZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGYsIGZhbHNlKTtcbiAgfSBlbHNlIGlmIChlbWl0dGVyLmRldGFjaEV2ZW50KSB7XG4gICAgZW1pdHRlci5kZXRhY2hFdmVudChcIm9uXCIgKyB0eXBlLCBmKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbWFwJCQxID0gZW1pdHRlci5faGFuZGxlcnMsIGFyciA9IG1hcCQkMSAmJiBtYXAkJDFbdHlwZV07XG4gICAgaWYgKGFycikge1xuICAgICAgdmFyIGluZGV4ID0gaW5kZXhPZihhcnIsIGYpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgIHsgbWFwJCQxW3R5cGVdID0gYXJyLnNsaWNlKDAsIGluZGV4KS5jb25jYXQoYXJyLnNsaWNlKGluZGV4ICsgMSkpOyB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNpZ25hbChlbWl0dGVyLCB0eXBlIC8qLCB2YWx1ZXMuLi4qLykge1xuICB2YXIgaGFuZGxlcnMgPSBnZXRIYW5kbGVycyhlbWl0dGVyLCB0eXBlKTtcbiAgaWYgKCFoYW5kbGVycy5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgKytpKSB7IGhhbmRsZXJzW2ldLmFwcGx5KG51bGwsIGFyZ3MpOyB9XG59XG5cbi8vIFRoZSBET00gZXZlbnRzIHRoYXQgQ29kZU1pcnJvciBoYW5kbGVzIGNhbiBiZSBvdmVycmlkZGVuIGJ5XG4vLyByZWdpc3RlcmluZyBhIChub24tRE9NKSBoYW5kbGVyIG9uIHRoZSBlZGl0b3IgZm9yIHRoZSBldmVudCBuYW1lLFxuLy8gYW5kIHByZXZlbnREZWZhdWx0LWluZyB0aGUgZXZlbnQgaW4gdGhhdCBoYW5kbGVyLlxuZnVuY3Rpb24gc2lnbmFsRE9NRXZlbnQoY20sIGUsIG92ZXJyaWRlKSB7XG4gIGlmICh0eXBlb2YgZSA9PSBcInN0cmluZ1wiKVxuICAgIHsgZSA9IHt0eXBlOiBlLCBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7IHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7IH19OyB9XG4gIHNpZ25hbChjbSwgb3ZlcnJpZGUgfHwgZS50eXBlLCBjbSwgZSk7XG4gIHJldHVybiBlX2RlZmF1bHRQcmV2ZW50ZWQoZSkgfHwgZS5jb2RlbWlycm9ySWdub3JlXG59XG5cbmZ1bmN0aW9uIHNpZ25hbEN1cnNvckFjdGl2aXR5KGNtKSB7XG4gIHZhciBhcnIgPSBjbS5faGFuZGxlcnMgJiYgY20uX2hhbmRsZXJzLmN1cnNvckFjdGl2aXR5O1xuICBpZiAoIWFycikgeyByZXR1cm4gfVxuICB2YXIgc2V0ID0gY20uY3VyT3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVycyB8fCAoY20uY3VyT3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVycyA9IFtdKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHsgaWYgKGluZGV4T2Yoc2V0LCBhcnJbaV0pID09IC0xKVxuICAgIHsgc2V0LnB1c2goYXJyW2ldKTsgfSB9XG59XG5cbmZ1bmN0aW9uIGhhc0hhbmRsZXIoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZ2V0SGFuZGxlcnMoZW1pdHRlciwgdHlwZSkubGVuZ3RoID4gMFxufVxuXG4vLyBBZGQgb24gYW5kIG9mZiBtZXRob2RzIHRvIGEgY29uc3RydWN0b3IncyBwcm90b3R5cGUsIHRvIG1ha2Vcbi8vIHJlZ2lzdGVyaW5nIGV2ZW50cyBvbiBzdWNoIG9iamVjdHMgbW9yZSBjb252ZW5pZW50LlxuZnVuY3Rpb24gZXZlbnRNaXhpbihjdG9yKSB7XG4gIGN0b3IucHJvdG90eXBlLm9uID0gZnVuY3Rpb24odHlwZSwgZikge29uKHRoaXMsIHR5cGUsIGYpO307XG4gIGN0b3IucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKHR5cGUsIGYpIHtvZmYodGhpcywgdHlwZSwgZik7fTtcbn1cblxuLy8gRHVlIHRvIHRoZSBmYWN0IHRoYXQgd2Ugc3RpbGwgc3VwcG9ydCBqdXJhc3NpYyBJRSB2ZXJzaW9ucywgc29tZVxuLy8gY29tcGF0aWJpbGl0eSB3cmFwcGVycyBhcmUgbmVlZGVkLlxuXG5mdW5jdGlvbiBlX3ByZXZlbnREZWZhdWx0KGUpIHtcbiAgaWYgKGUucHJldmVudERlZmF1bHQpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gIGVsc2UgeyBlLnJldHVyblZhbHVlID0gZmFsc2U7IH1cbn1cbmZ1bmN0aW9uIGVfc3RvcFByb3BhZ2F0aW9uKGUpIHtcbiAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IH1cbiAgZWxzZSB7IGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsgfVxufVxuZnVuY3Rpb24gZV9kZWZhdWx0UHJldmVudGVkKGUpIHtcbiAgcmV0dXJuIGUuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gZS5kZWZhdWx0UHJldmVudGVkIDogZS5yZXR1cm5WYWx1ZSA9PSBmYWxzZVxufVxuZnVuY3Rpb24gZV9zdG9wKGUpIHtlX3ByZXZlbnREZWZhdWx0KGUpOyBlX3N0b3BQcm9wYWdhdGlvbihlKTt9XG5cbmZ1bmN0aW9uIGVfdGFyZ2V0KGUpIHtyZXR1cm4gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50fVxuZnVuY3Rpb24gZV9idXR0b24oZSkge1xuICB2YXIgYiA9IGUud2hpY2g7XG4gIGlmIChiID09IG51bGwpIHtcbiAgICBpZiAoZS5idXR0b24gJiAxKSB7IGIgPSAxOyB9XG4gICAgZWxzZSBpZiAoZS5idXR0b24gJiAyKSB7IGIgPSAzOyB9XG4gICAgZWxzZSBpZiAoZS5idXR0b24gJiA0KSB7IGIgPSAyOyB9XG4gIH1cbiAgaWYgKG1hYyAmJiBlLmN0cmxLZXkgJiYgYiA9PSAxKSB7IGIgPSAzOyB9XG4gIHJldHVybiBiXG59XG5cbi8vIERldGVjdCBkcmFnLWFuZC1kcm9wXG52YXIgZHJhZ0FuZERyb3AgPSBmdW5jdGlvbigpIHtcbiAgLy8gVGhlcmUgaXMgKnNvbWUqIGtpbmQgb2YgZHJhZy1hbmQtZHJvcCBzdXBwb3J0IGluIElFNi04LCBidXQgSVxuICAvLyBjb3VsZG4ndCBnZXQgaXQgdG8gd29yayB5ZXQuXG4gIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSkgeyByZXR1cm4gZmFsc2UgfVxuICB2YXIgZGl2ID0gZWx0KCdkaXYnKTtcbiAgcmV0dXJuIFwiZHJhZ2dhYmxlXCIgaW4gZGl2IHx8IFwiZHJhZ0Ryb3BcIiBpbiBkaXZcbn0oKTtcblxudmFyIHp3c3BTdXBwb3J0ZWQ7XG5mdW5jdGlvbiB6ZXJvV2lkdGhFbGVtZW50KG1lYXN1cmUpIHtcbiAgaWYgKHp3c3BTdXBwb3J0ZWQgPT0gbnVsbCkge1xuICAgIHZhciB0ZXN0ID0gZWx0KFwic3BhblwiLCBcIlxcdTIwMGJcIik7XG4gICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQobWVhc3VyZSwgZWx0KFwic3BhblwiLCBbdGVzdCwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJ4XCIpXSkpO1xuICAgIGlmIChtZWFzdXJlLmZpcnN0Q2hpbGQub2Zmc2V0SGVpZ2h0ICE9IDApXG4gICAgICB7IHp3c3BTdXBwb3J0ZWQgPSB0ZXN0Lm9mZnNldFdpZHRoIDw9IDEgJiYgdGVzdC5vZmZzZXRIZWlnaHQgPiAyICYmICEoaWUgJiYgaWVfdmVyc2lvbiA8IDgpOyB9XG4gIH1cbiAgdmFyIG5vZGUgPSB6d3NwU3VwcG9ydGVkID8gZWx0KFwic3BhblwiLCBcIlxcdTIwMGJcIikgOlxuICAgIGVsdChcInNwYW5cIiwgXCJcXHUwMGEwXCIsIG51bGwsIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogMXB4OyBtYXJnaW4tcmlnaHQ6IC0xcHhcIik7XG4gIG5vZGUuc2V0QXR0cmlidXRlKFwiY20tdGV4dFwiLCBcIlwiKTtcbiAgcmV0dXJuIG5vZGVcbn1cblxuLy8gRmVhdHVyZS1kZXRlY3QgSUUncyBjcnVtbXkgY2xpZW50IHJlY3QgcmVwb3J0aW5nIGZvciBiaWRpIHRleHRcbnZhciBiYWRCaWRpUmVjdHM7XG5mdW5jdGlvbiBoYXNCYWRCaWRpUmVjdHMobWVhc3VyZSkge1xuICBpZiAoYmFkQmlkaVJlY3RzICE9IG51bGwpIHsgcmV0dXJuIGJhZEJpZGlSZWN0cyB9XG4gIHZhciB0eHQgPSByZW1vdmVDaGlsZHJlbkFuZEFkZChtZWFzdXJlLCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIkFcXHUwNjJlQVwiKSk7XG4gIHZhciByMCA9IHJhbmdlKHR4dCwgMCwgMSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciByMSA9IHJhbmdlKHR4dCwgMSwgMikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJlbW92ZUNoaWxkcmVuKG1lYXN1cmUpO1xuICBpZiAoIXIwIHx8IHIwLmxlZnQgPT0gcjAucmlnaHQpIHsgcmV0dXJuIGZhbHNlIH0gLy8gU2FmYXJpIHJldHVybnMgbnVsbCBpbiBzb21lIGNhc2VzICgjMjc4MClcbiAgcmV0dXJuIGJhZEJpZGlSZWN0cyA9IChyMS5yaWdodCAtIHIwLnJpZ2h0IDwgMylcbn1cblxuLy8gU2VlIGlmIFwiXCIuc3BsaXQgaXMgdGhlIGJyb2tlbiBJRSB2ZXJzaW9uLCBpZiBzbywgcHJvdmlkZSBhblxuLy8gYWx0ZXJuYXRpdmUgd2F5IHRvIHNwbGl0IGxpbmVzLlxudmFyIHNwbGl0TGluZXNBdXRvID0gXCJcXG5cXG5iXCIuc3BsaXQoL1xcbi8pLmxlbmd0aCAhPSAzID8gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgcG9zID0gMCwgcmVzdWx0ID0gW10sIGwgPSBzdHJpbmcubGVuZ3RoO1xuICB3aGlsZSAocG9zIDw9IGwpIHtcbiAgICB2YXIgbmwgPSBzdHJpbmcuaW5kZXhPZihcIlxcblwiLCBwb3MpO1xuICAgIGlmIChubCA9PSAtMSkgeyBubCA9IHN0cmluZy5sZW5ndGg7IH1cbiAgICB2YXIgbGluZSA9IHN0cmluZy5zbGljZShwb3MsIHN0cmluZy5jaGFyQXQobmwgLSAxKSA9PSBcIlxcclwiID8gbmwgLSAxIDogbmwpO1xuICAgIHZhciBydCA9IGxpbmUuaW5kZXhPZihcIlxcclwiKTtcbiAgICBpZiAocnQgIT0gLTEpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGxpbmUuc2xpY2UoMCwgcnQpKTtcbiAgICAgIHBvcyArPSBydCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKGxpbmUpO1xuICAgICAgcG9zID0gbmwgKyAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59IDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gc3RyaW5nLnNwbGl0KC9cXHJcXG4/fFxcbi8pOyB9O1xuXG52YXIgaGFzU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbiA/IGZ1bmN0aW9uICh0ZSkge1xuICB0cnkgeyByZXR1cm4gdGUuc2VsZWN0aW9uU3RhcnQgIT0gdGUuc2VsZWN0aW9uRW5kIH1cbiAgY2F0Y2goZSkgeyByZXR1cm4gZmFsc2UgfVxufSA6IGZ1bmN0aW9uICh0ZSkge1xuICB2YXIgcmFuZ2UkJDE7XG4gIHRyeSB7cmFuZ2UkJDEgPSB0ZS5vd25lckRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO31cbiAgY2F0Y2goZSkge31cbiAgaWYgKCFyYW5nZSQkMSB8fCByYW5nZSQkMS5wYXJlbnRFbGVtZW50KCkgIT0gdGUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgcmV0dXJuIHJhbmdlJCQxLmNvbXBhcmVFbmRQb2ludHMoXCJTdGFydFRvRW5kXCIsIHJhbmdlJCQxKSAhPSAwXG59O1xuXG52YXIgaGFzQ29weUV2ZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGUgPSBlbHQoXCJkaXZcIik7XG4gIGlmIChcIm9uY29weVwiIGluIGUpIHsgcmV0dXJuIHRydWUgfVxuICBlLnNldEF0dHJpYnV0ZShcIm9uY29weVwiLCBcInJldHVybjtcIik7XG4gIHJldHVybiB0eXBlb2YgZS5vbmNvcHkgPT0gXCJmdW5jdGlvblwiXG59KSgpO1xuXG52YXIgYmFkWm9vbWVkUmVjdHMgPSBudWxsO1xuZnVuY3Rpb24gaGFzQmFkWm9vbWVkUmVjdHMobWVhc3VyZSkge1xuICBpZiAoYmFkWm9vbWVkUmVjdHMgIT0gbnVsbCkgeyByZXR1cm4gYmFkWm9vbWVkUmVjdHMgfVxuICB2YXIgbm9kZSA9IHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIGVsdChcInNwYW5cIiwgXCJ4XCIpKTtcbiAgdmFyIG5vcm1hbCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBmcm9tUmFuZ2UgPSByYW5nZShub2RlLCAwLCAxKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIGJhZFpvb21lZFJlY3RzID0gTWF0aC5hYnMobm9ybWFsLmxlZnQgLSBmcm9tUmFuZ2UubGVmdCkgPiAxXG59XG5cbi8vIEtub3duIG1vZGVzLCBieSBuYW1lIGFuZCBieSBNSU1FXG52YXIgbW9kZXMgPSB7fTtcbnZhciBtaW1lTW9kZXMgPSB7fTtcblxuLy8gRXh0cmEgYXJndW1lbnRzIGFyZSBzdG9yZWQgYXMgdGhlIG1vZGUncyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzXG4vLyB1c2VkIGJ5IChsZWdhY3kpIG1lY2hhbmlzbXMgbGlrZSBsb2FkbW9kZS5qcyB0byBhdXRvbWF0aWNhbGx5XG4vLyBsb2FkIGEgbW9kZS4gKFByZWZlcnJlZCBtZWNoYW5pc20gaXMgdGhlIHJlcXVpcmUvZGVmaW5lIGNhbGxzLilcbmZ1bmN0aW9uIGRlZmluZU1vZGUobmFtZSwgbW9kZSkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpXG4gICAgeyBtb2RlLmRlcGVuZGVuY2llcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7IH1cbiAgbW9kZXNbbmFtZV0gPSBtb2RlO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVNSU1FKG1pbWUsIHNwZWMpIHtcbiAgbWltZU1vZGVzW21pbWVdID0gc3BlYztcbn1cblxuLy8gR2l2ZW4gYSBNSU1FIHR5cGUsIGEge25hbWUsIC4uLm9wdGlvbnN9IGNvbmZpZyBvYmplY3QsIG9yIGEgbmFtZVxuLy8gc3RyaW5nLCByZXR1cm4gYSBtb2RlIGNvbmZpZyBvYmplY3QuXG5mdW5jdGlvbiByZXNvbHZlTW9kZShzcGVjKSB7XG4gIGlmICh0eXBlb2Ygc3BlYyA9PSBcInN0cmluZ1wiICYmIG1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eShzcGVjKSkge1xuICAgIHNwZWMgPSBtaW1lTW9kZXNbc3BlY107XG4gIH0gZWxzZSBpZiAoc3BlYyAmJiB0eXBlb2Ygc3BlYy5uYW1lID09IFwic3RyaW5nXCIgJiYgbWltZU1vZGVzLmhhc093blByb3BlcnR5KHNwZWMubmFtZSkpIHtcbiAgICB2YXIgZm91bmQgPSBtaW1lTW9kZXNbc3BlYy5uYW1lXTtcbiAgICBpZiAodHlwZW9mIGZvdW5kID09IFwic3RyaW5nXCIpIHsgZm91bmQgPSB7bmFtZTogZm91bmR9OyB9XG4gICAgc3BlYyA9IGNyZWF0ZU9iaihmb3VuZCwgc3BlYyk7XG4gICAgc3BlYy5uYW1lID0gZm91bmQubmFtZTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3BlYyA9PSBcInN0cmluZ1wiICYmIC9eW1xcd1xcLV0rXFwvW1xcd1xcLV0rXFwreG1sJC8udGVzdChzcGVjKSkge1xuICAgIHJldHVybiByZXNvbHZlTW9kZShcImFwcGxpY2F0aW9uL3htbFwiKVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzcGVjID09IFwic3RyaW5nXCIgJiYgL15bXFx3XFwtXStcXC9bXFx3XFwtXStcXCtqc29uJC8udGVzdChzcGVjKSkge1xuICAgIHJldHVybiByZXNvbHZlTW9kZShcImFwcGxpY2F0aW9uL2pzb25cIilcbiAgfVxuICBpZiAodHlwZW9mIHNwZWMgPT0gXCJzdHJpbmdcIikgeyByZXR1cm4ge25hbWU6IHNwZWN9IH1cbiAgZWxzZSB7IHJldHVybiBzcGVjIHx8IHtuYW1lOiBcIm51bGxcIn0gfVxufVxuXG4vLyBHaXZlbiBhIG1vZGUgc3BlYyAoYW55dGhpbmcgdGhhdCByZXNvbHZlTW9kZSBhY2NlcHRzKSwgZmluZCBhbmRcbi8vIGluaXRpYWxpemUgYW4gYWN0dWFsIG1vZGUgb2JqZWN0LlxuZnVuY3Rpb24gZ2V0TW9kZShvcHRpb25zLCBzcGVjKSB7XG4gIHNwZWMgPSByZXNvbHZlTW9kZShzcGVjKTtcbiAgdmFyIG1mYWN0b3J5ID0gbW9kZXNbc3BlYy5uYW1lXTtcbiAgaWYgKCFtZmFjdG9yeSkgeyByZXR1cm4gZ2V0TW9kZShvcHRpb25zLCBcInRleHQvcGxhaW5cIikgfVxuICB2YXIgbW9kZU9iaiA9IG1mYWN0b3J5KG9wdGlvbnMsIHNwZWMpO1xuICBpZiAobW9kZUV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkoc3BlYy5uYW1lKSkge1xuICAgIHZhciBleHRzID0gbW9kZUV4dGVuc2lvbnNbc3BlYy5uYW1lXTtcbiAgICBmb3IgKHZhciBwcm9wIGluIGV4dHMpIHtcbiAgICAgIGlmICghZXh0cy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBjb250aW51ZSB9XG4gICAgICBpZiAobW9kZU9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBtb2RlT2JqW1wiX1wiICsgcHJvcF0gPSBtb2RlT2JqW3Byb3BdOyB9XG4gICAgICBtb2RlT2JqW3Byb3BdID0gZXh0c1twcm9wXTtcbiAgICB9XG4gIH1cbiAgbW9kZU9iai5uYW1lID0gc3BlYy5uYW1lO1xuICBpZiAoc3BlYy5oZWxwZXJUeXBlKSB7IG1vZGVPYmouaGVscGVyVHlwZSA9IHNwZWMuaGVscGVyVHlwZTsgfVxuICBpZiAoc3BlYy5tb2RlUHJvcHMpIHsgZm9yICh2YXIgcHJvcCQxIGluIHNwZWMubW9kZVByb3BzKVxuICAgIHsgbW9kZU9ialtwcm9wJDFdID0gc3BlYy5tb2RlUHJvcHNbcHJvcCQxXTsgfSB9XG5cbiAgcmV0dXJuIG1vZGVPYmpcbn1cblxuLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBhdHRhY2ggcHJvcGVydGllcyB0byBtb2RlIG9iamVjdHMgZnJvbVxuLy8gb3V0c2lkZSB0aGUgYWN0dWFsIG1vZGUgZGVmaW5pdGlvbi5cbnZhciBtb2RlRXh0ZW5zaW9ucyA9IHt9O1xuZnVuY3Rpb24gZXh0ZW5kTW9kZShtb2RlLCBwcm9wZXJ0aWVzKSB7XG4gIHZhciBleHRzID0gbW9kZUV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkobW9kZSkgPyBtb2RlRXh0ZW5zaW9uc1ttb2RlXSA6IChtb2RlRXh0ZW5zaW9uc1ttb2RlXSA9IHt9KTtcbiAgY29weU9iaihwcm9wZXJ0aWVzLCBleHRzKTtcbn1cblxuZnVuY3Rpb24gY29weVN0YXRlKG1vZGUsIHN0YXRlKSB7XG4gIGlmIChzdGF0ZSA9PT0gdHJ1ZSkgeyByZXR1cm4gc3RhdGUgfVxuICBpZiAobW9kZS5jb3B5U3RhdGUpIHsgcmV0dXJuIG1vZGUuY29weVN0YXRlKHN0YXRlKSB9XG4gIHZhciBuc3RhdGUgPSB7fTtcbiAgZm9yICh2YXIgbiBpbiBzdGF0ZSkge1xuICAgIHZhciB2YWwgPSBzdGF0ZVtuXTtcbiAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkpIHsgdmFsID0gdmFsLmNvbmNhdChbXSk7IH1cbiAgICBuc3RhdGVbbl0gPSB2YWw7XG4gIH1cbiAgcmV0dXJuIG5zdGF0ZVxufVxuXG4vLyBHaXZlbiBhIG1vZGUgYW5kIGEgc3RhdGUgKGZvciB0aGF0IG1vZGUpLCBmaW5kIHRoZSBpbm5lciBtb2RlIGFuZFxuLy8gc3RhdGUgYXQgdGhlIHBvc2l0aW9uIHRoYXQgdGhlIHN0YXRlIHJlZmVycyB0by5cbmZ1bmN0aW9uIGlubmVyTW9kZShtb2RlLCBzdGF0ZSkge1xuICB2YXIgaW5mbztcbiAgd2hpbGUgKG1vZGUuaW5uZXJNb2RlKSB7XG4gICAgaW5mbyA9IG1vZGUuaW5uZXJNb2RlKHN0YXRlKTtcbiAgICBpZiAoIWluZm8gfHwgaW5mby5tb2RlID09IG1vZGUpIHsgYnJlYWsgfVxuICAgIHN0YXRlID0gaW5mby5zdGF0ZTtcbiAgICBtb2RlID0gaW5mby5tb2RlO1xuICB9XG4gIHJldHVybiBpbmZvIHx8IHttb2RlOiBtb2RlLCBzdGF0ZTogc3RhdGV9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0U3RhdGUobW9kZSwgYTEsIGEyKSB7XG4gIHJldHVybiBtb2RlLnN0YXJ0U3RhdGUgPyBtb2RlLnN0YXJ0U3RhdGUoYTEsIGEyKSA6IHRydWVcbn1cblxuLy8gU1RSSU5HIFNUUkVBTVxuXG4vLyBGZWQgdG8gdGhlIG1vZGUgcGFyc2VycywgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byBtYWtlXG4vLyBwYXJzZXJzIG1vcmUgc3VjY2luY3QuXG5cbnZhciBTdHJpbmdTdHJlYW0gPSBmdW5jdGlvbihzdHJpbmcsIHRhYlNpemUsIGxpbmVPcmFjbGUpIHtcbiAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0ID0gMDtcbiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gIHRoaXMudGFiU2l6ZSA9IHRhYlNpemUgfHwgODtcbiAgdGhpcy5sYXN0Q29sdW1uUG9zID0gdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSAwO1xuICB0aGlzLmxpbmVTdGFydCA9IDA7XG4gIHRoaXMubGluZU9yYWNsZSA9IGxpbmVPcmFjbGU7XG59O1xuXG5TdHJpbmdTdHJlYW0ucHJvdG90eXBlLmVvbCA9IGZ1bmN0aW9uICgpIHtyZXR1cm4gdGhpcy5wb3MgPj0gdGhpcy5zdHJpbmcubGVuZ3RofTtcblN0cmluZ1N0cmVhbS5wcm90b3R5cGUuc29sID0gZnVuY3Rpb24gKCkge3JldHVybiB0aGlzLnBvcyA9PSB0aGlzLmxpbmVTdGFydH07XG5TdHJpbmdTdHJlYW0ucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAoKSB7cmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykgfHwgdW5kZWZpbmVkfTtcblN0cmluZ1N0cmVhbS5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucG9zIDwgdGhpcy5zdHJpbmcubGVuZ3RoKVxuICAgIHsgcmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcysrKSB9XG59O1xuU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5lYXQgPSBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgdmFyIGNoID0gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKTtcbiAgdmFyIG9rO1xuICBpZiAodHlwZW9mIG1hdGNoID09IFwic3RyaW5nXCIpIHsgb2sgPSBjaCA9PSBtYXRjaDsgfVxuICBlbHNlIHsgb2sgPSBjaCAmJiAobWF0Y2gudGVzdCA/IG1hdGNoLnRlc3QoY2gpIDogbWF0Y2goY2gpKTsgfVxuICBpZiAob2spIHsrK3RoaXMucG9zOyByZXR1cm4gY2h9XG59O1xuU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5lYXRXaGlsZSA9IGZ1bmN0aW9uIChtYXRjaCkge1xuICB2YXIgc3RhcnQgPSB0aGlzLnBvcztcbiAgd2hpbGUgKHRoaXMuZWF0KG1hdGNoKSl7fVxuICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydFxufTtcblN0cmluZ1N0cmVhbS5wcm90b3R5cGUuZWF0U3BhY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7XG4gIHdoaWxlICgvW1xcc1xcdTAwYTBdLy50ZXN0KHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykpKSB7ICsrdGhpcyQxLnBvczsgfVxuICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydFxufTtcblN0cmluZ1N0cmVhbS5wcm90b3R5cGUuc2tpcFRvRW5kID0gZnVuY3Rpb24gKCkge3RoaXMucG9zID0gdGhpcy5zdHJpbmcubGVuZ3RoO307XG5TdHJpbmdTdHJlYW0ucHJvdG90eXBlLnNraXBUbyA9IGZ1bmN0aW9uIChjaCkge1xuICB2YXIgZm91bmQgPSB0aGlzLnN0cmluZy5pbmRleE9mKGNoLCB0aGlzLnBvcyk7XG4gIGlmIChmb3VuZCA+IC0xKSB7dGhpcy5wb3MgPSBmb3VuZDsgcmV0dXJuIHRydWV9XG59O1xuU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5iYWNrVXAgPSBmdW5jdGlvbiAobikge3RoaXMucG9zIC09IG47fTtcblN0cmluZ1N0cmVhbS5wcm90b3R5cGUuY29sdW1uID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5sYXN0Q29sdW1uUG9zIDwgdGhpcy5zdGFydCkge1xuICAgIHRoaXMubGFzdENvbHVtblZhbHVlID0gY291bnRDb2x1bW4odGhpcy5zdHJpbmcsIHRoaXMuc3RhcnQsIHRoaXMudGFiU2l6ZSwgdGhpcy5sYXN0Q29sdW1uUG9zLCB0aGlzLmxhc3RDb2x1bW5WYWx1ZSk7XG4gICAgdGhpcy5sYXN0Q29sdW1uUG9zID0gdGhpcy5zdGFydDtcbiAgfVxuICByZXR1cm4gdGhpcy5sYXN0Q29sdW1uVmFsdWUgLSAodGhpcy5saW5lU3RhcnQgPyBjb3VudENvbHVtbih0aGlzLnN0cmluZywgdGhpcy5saW5lU3RhcnQsIHRoaXMudGFiU2l6ZSkgOiAwKVxufTtcblN0cmluZ1N0cmVhbS5wcm90b3R5cGUuaW5kZW50YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjb3VudENvbHVtbih0aGlzLnN0cmluZywgbnVsbCwgdGhpcy50YWJTaXplKSAtXG4gICAgKHRoaXMubGluZVN0YXJ0ID8gY291bnRDb2x1bW4odGhpcy5zdHJpbmcsIHRoaXMubGluZVN0YXJ0LCB0aGlzLnRhYlNpemUpIDogMClcbn07XG5TdHJpbmdTdHJlYW0ucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gKHBhdHRlcm4sIGNvbnN1bWUsIGNhc2VJbnNlbnNpdGl2ZSkge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gPT0gXCJzdHJpbmdcIikge1xuICAgIHZhciBjYXNlZCA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIGNhc2VJbnNlbnNpdGl2ZSA/IHN0ci50b0xvd2VyQ2FzZSgpIDogc3RyOyB9O1xuICAgIHZhciBzdWJzdHIgPSB0aGlzLnN0cmluZy5zdWJzdHIodGhpcy5wb3MsIHBhdHRlcm4ubGVuZ3RoKTtcbiAgICBpZiAoY2FzZWQoc3Vic3RyKSA9PSBjYXNlZChwYXR0ZXJuKSkge1xuICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKSB7IHRoaXMucG9zICs9IHBhdHRlcm4ubGVuZ3RoOyB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgbWF0Y2ggPSB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnBvcykubWF0Y2gocGF0dGVybik7XG4gICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ID4gMCkgeyByZXR1cm4gbnVsbCB9XG4gICAgaWYgKG1hdGNoICYmIGNvbnN1bWUgIT09IGZhbHNlKSB7IHRoaXMucG9zICs9IG1hdGNoWzBdLmxlbmd0aDsgfVxuICAgIHJldHVybiBtYXRjaFxuICB9XG59O1xuU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gKCl7cmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMucG9zKX07XG5TdHJpbmdTdHJlYW0ucHJvdG90eXBlLmhpZGVGaXJzdENoYXJzID0gZnVuY3Rpb24gKG4sIGlubmVyKSB7XG4gIHRoaXMubGluZVN0YXJ0ICs9IG47XG4gIHRyeSB7IHJldHVybiBpbm5lcigpIH1cbiAgZmluYWxseSB7IHRoaXMubGluZVN0YXJ0IC09IG47IH1cbn07XG5TdHJpbmdTdHJlYW0ucHJvdG90eXBlLmxvb2tBaGVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciBvcmFjbGUgPSB0aGlzLmxpbmVPcmFjbGU7XG4gIHJldHVybiBvcmFjbGUgJiYgb3JhY2xlLmxvb2tBaGVhZChuKVxufTtcblN0cmluZ1N0cmVhbS5wcm90b3R5cGUuYmFzZVRva2VuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgb3JhY2xlID0gdGhpcy5saW5lT3JhY2xlO1xuICByZXR1cm4gb3JhY2xlICYmIG9yYWNsZS5iYXNlVG9rZW4odGhpcy5wb3MpXG59O1xuXG52YXIgU2F2ZWRDb250ZXh0ID0gZnVuY3Rpb24oc3RhdGUsIGxvb2tBaGVhZCkge1xuICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gIHRoaXMubG9va0FoZWFkID0gbG9va0FoZWFkO1xufTtcblxudmFyIENvbnRleHQgPSBmdW5jdGlvbihkb2MsIHN0YXRlLCBsaW5lLCBsb29rQWhlYWQpIHtcbiAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICB0aGlzLmRvYyA9IGRvYztcbiAgdGhpcy5saW5lID0gbGluZTtcbiAgdGhpcy5tYXhMb29rQWhlYWQgPSBsb29rQWhlYWQgfHwgMDtcbiAgdGhpcy5iYXNlVG9rZW5zID0gbnVsbDtcbiAgdGhpcy5iYXNlVG9rZW5Qb3MgPSAxO1xufTtcblxuQ29udGV4dC5wcm90b3R5cGUubG9va0FoZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIGxpbmUgPSB0aGlzLmRvYy5nZXRMaW5lKHRoaXMubGluZSArIG4pO1xuICBpZiAobGluZSAhPSBudWxsICYmIG4gPiB0aGlzLm1heExvb2tBaGVhZCkgeyB0aGlzLm1heExvb2tBaGVhZCA9IG47IH1cbiAgcmV0dXJuIGxpbmVcbn07XG5cbkNvbnRleHQucHJvdG90eXBlLmJhc2VUb2tlbiA9IGZ1bmN0aW9uIChuKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKCF0aGlzLmJhc2VUb2tlbnMpIHsgcmV0dXJuIG51bGwgfVxuICB3aGlsZSAodGhpcy5iYXNlVG9rZW5zW3RoaXMuYmFzZVRva2VuUG9zXSA8PSBuKVxuICAgIHsgdGhpcyQxLmJhc2VUb2tlblBvcyArPSAyOyB9XG4gIHZhciB0eXBlID0gdGhpcy5iYXNlVG9rZW5zW3RoaXMuYmFzZVRva2VuUG9zICsgMV07XG4gIHJldHVybiB7dHlwZTogdHlwZSAmJiB0eXBlLnJlcGxhY2UoLyggfF4pb3ZlcmxheSAuKi8sIFwiXCIpLFxuICAgICAgICAgIHNpemU6IHRoaXMuYmFzZVRva2Vuc1t0aGlzLmJhc2VUb2tlblBvc10gLSBufVxufTtcblxuQ29udGV4dC5wcm90b3R5cGUubmV4dExpbmUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubGluZSsrO1xuICBpZiAodGhpcy5tYXhMb29rQWhlYWQgPiAwKSB7IHRoaXMubWF4TG9va0FoZWFkLS07IH1cbn07XG5cbkNvbnRleHQuZnJvbVNhdmVkID0gZnVuY3Rpb24gKGRvYywgc2F2ZWQsIGxpbmUpIHtcbiAgaWYgKHNhdmVkIGluc3RhbmNlb2YgU2F2ZWRDb250ZXh0KVxuICAgIHsgcmV0dXJuIG5ldyBDb250ZXh0KGRvYywgY29weVN0YXRlKGRvYy5tb2RlLCBzYXZlZC5zdGF0ZSksIGxpbmUsIHNhdmVkLmxvb2tBaGVhZCkgfVxuICBlbHNlXG4gICAgeyByZXR1cm4gbmV3IENvbnRleHQoZG9jLCBjb3B5U3RhdGUoZG9jLm1vZGUsIHNhdmVkKSwgbGluZSkgfVxufTtcblxuQ29udGV4dC5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIChjb3B5KSB7XG4gIHZhciBzdGF0ZSA9IGNvcHkgIT09IGZhbHNlID8gY29weVN0YXRlKHRoaXMuZG9jLm1vZGUsIHRoaXMuc3RhdGUpIDogdGhpcy5zdGF0ZTtcbiAgcmV0dXJuIHRoaXMubWF4TG9va0FoZWFkID4gMCA/IG5ldyBTYXZlZENvbnRleHQoc3RhdGUsIHRoaXMubWF4TG9va0FoZWFkKSA6IHN0YXRlXG59O1xuXG5cbi8vIENvbXB1dGUgYSBzdHlsZSBhcnJheSAoYW4gYXJyYXkgc3RhcnRpbmcgd2l0aCBhIG1vZGUgZ2VuZXJhdGlvblxuLy8gLS0gZm9yIGludmFsaWRhdGlvbiAtLSBmb2xsb3dlZCBieSBwYWlycyBvZiBlbmQgcG9zaXRpb25zIGFuZFxuLy8gc3R5bGUgc3RyaW5ncyksIHdoaWNoIGlzIHVzZWQgdG8gaGlnaGxpZ2h0IHRoZSB0b2tlbnMgb24gdGhlXG4vLyBsaW5lLlxuZnVuY3Rpb24gaGlnaGxpZ2h0TGluZShjbSwgbGluZSwgY29udGV4dCwgZm9yY2VUb0VuZCkge1xuICAvLyBBIHN0eWxlcyBhcnJheSBhbHdheXMgc3RhcnRzIHdpdGggYSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlXG4gIC8vIG1vZGUvb3ZlcmxheXMgdGhhdCBpdCBpcyBiYXNlZCBvbiAoZm9yIGVhc3kgaW52YWxpZGF0aW9uKS5cbiAgdmFyIHN0ID0gW2NtLnN0YXRlLm1vZGVHZW5dLCBsaW5lQ2xhc3NlcyA9IHt9O1xuICAvLyBDb21wdXRlIHRoZSBiYXNlIGFycmF5IG9mIHN0eWxlc1xuICBydW5Nb2RlKGNtLCBsaW5lLnRleHQsIGNtLmRvYy5tb2RlLCBjb250ZXh0LCBmdW5jdGlvbiAoZW5kLCBzdHlsZSkgeyByZXR1cm4gc3QucHVzaChlbmQsIHN0eWxlKTsgfSxcbiAgICAgICAgICBsaW5lQ2xhc3NlcywgZm9yY2VUb0VuZCk7XG4gIHZhciBzdGF0ZSA9IGNvbnRleHQuc3RhdGU7XG5cbiAgLy8gUnVuIG92ZXJsYXlzLCBhZGp1c3Qgc3R5bGUgYXJyYXkuXG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCBvICkge1xuICAgIGNvbnRleHQuYmFzZVRva2VucyA9IHN0O1xuICAgIHZhciBvdmVybGF5ID0gY20uc3RhdGUub3ZlcmxheXNbb10sIGkgPSAxLCBhdCA9IDA7XG4gICAgY29udGV4dC5zdGF0ZSA9IHRydWU7XG4gICAgcnVuTW9kZShjbSwgbGluZS50ZXh0LCBvdmVybGF5Lm1vZGUsIGNvbnRleHQsIGZ1bmN0aW9uIChlbmQsIHN0eWxlKSB7XG4gICAgICB2YXIgc3RhcnQgPSBpO1xuICAgICAgLy8gRW5zdXJlIHRoZXJlJ3MgYSB0b2tlbiBlbmQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24sIGFuZCB0aGF0IGkgcG9pbnRzIGF0IGl0XG4gICAgICB3aGlsZSAoYXQgPCBlbmQpIHtcbiAgICAgICAgdmFyIGlfZW5kID0gc3RbaV07XG4gICAgICAgIGlmIChpX2VuZCA+IGVuZClcbiAgICAgICAgICB7IHN0LnNwbGljZShpLCAxLCBlbmQsIHN0W2krMV0sIGlfZW5kKTsgfVxuICAgICAgICBpICs9IDI7XG4gICAgICAgIGF0ID0gTWF0aC5taW4oZW5kLCBpX2VuZCk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0eWxlKSB7IHJldHVybiB9XG4gICAgICBpZiAob3ZlcmxheS5vcGFxdWUpIHtcbiAgICAgICAgc3Quc3BsaWNlKHN0YXJ0LCBpIC0gc3RhcnQsIGVuZCwgXCJvdmVybGF5IFwiICsgc3R5bGUpO1xuICAgICAgICBpID0gc3RhcnQgKyAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICg7IHN0YXJ0IDwgaTsgc3RhcnQgKz0gMikge1xuICAgICAgICAgIHZhciBjdXIgPSBzdFtzdGFydCsxXTtcbiAgICAgICAgICBzdFtzdGFydCsxXSA9IChjdXIgPyBjdXIgKyBcIiBcIiA6IFwiXCIpICsgXCJvdmVybGF5IFwiICsgc3R5bGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBsaW5lQ2xhc3Nlcyk7XG4gICAgY29udGV4dC5zdGF0ZSA9IHN0YXRlO1xuICAgIGNvbnRleHQuYmFzZVRva2VucyA9IG51bGw7XG4gICAgY29udGV4dC5iYXNlVG9rZW5Qb3MgPSAxO1xuICB9O1xuXG4gIGZvciAodmFyIG8gPSAwOyBvIDwgY20uc3RhdGUub3ZlcmxheXMubGVuZ3RoOyArK28pIGxvb3AoIG8gKTtcblxuICByZXR1cm4ge3N0eWxlczogc3QsIGNsYXNzZXM6IGxpbmVDbGFzc2VzLmJnQ2xhc3MgfHwgbGluZUNsYXNzZXMudGV4dENsYXNzID8gbGluZUNsYXNzZXMgOiBudWxsfVxufVxuXG5mdW5jdGlvbiBnZXRMaW5lU3R5bGVzKGNtLCBsaW5lLCB1cGRhdGVGcm9udGllcikge1xuICBpZiAoIWxpbmUuc3R5bGVzIHx8IGxpbmUuc3R5bGVzWzBdICE9IGNtLnN0YXRlLm1vZGVHZW4pIHtcbiAgICB2YXIgY29udGV4dCA9IGdldENvbnRleHRCZWZvcmUoY20sIGxpbmVObyhsaW5lKSk7XG4gICAgdmFyIHJlc2V0U3RhdGUgPSBsaW5lLnRleHQubGVuZ3RoID4gY20ub3B0aW9ucy5tYXhIaWdobGlnaHRMZW5ndGggJiYgY29weVN0YXRlKGNtLmRvYy5tb2RlLCBjb250ZXh0LnN0YXRlKTtcbiAgICB2YXIgcmVzdWx0ID0gaGlnaGxpZ2h0TGluZShjbSwgbGluZSwgY29udGV4dCk7XG4gICAgaWYgKHJlc2V0U3RhdGUpIHsgY29udGV4dC5zdGF0ZSA9IHJlc2V0U3RhdGU7IH1cbiAgICBsaW5lLnN0YXRlQWZ0ZXIgPSBjb250ZXh0LnNhdmUoIXJlc2V0U3RhdGUpO1xuICAgIGxpbmUuc3R5bGVzID0gcmVzdWx0LnN0eWxlcztcbiAgICBpZiAocmVzdWx0LmNsYXNzZXMpIHsgbGluZS5zdHlsZUNsYXNzZXMgPSByZXN1bHQuY2xhc3NlczsgfVxuICAgIGVsc2UgaWYgKGxpbmUuc3R5bGVDbGFzc2VzKSB7IGxpbmUuc3R5bGVDbGFzc2VzID0gbnVsbDsgfVxuICAgIGlmICh1cGRhdGVGcm9udGllciA9PT0gY20uZG9jLmhpZ2hsaWdodEZyb250aWVyKVxuICAgICAgeyBjbS5kb2MubW9kZUZyb250aWVyID0gTWF0aC5tYXgoY20uZG9jLm1vZGVGcm9udGllciwgKytjbS5kb2MuaGlnaGxpZ2h0RnJvbnRpZXIpOyB9XG4gIH1cbiAgcmV0dXJuIGxpbmUuc3R5bGVzXG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRCZWZvcmUoY20sIG4sIHByZWNpc2UpIHtcbiAgdmFyIGRvYyA9IGNtLmRvYywgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gIGlmICghZG9jLm1vZGUuc3RhcnRTdGF0ZSkgeyByZXR1cm4gbmV3IENvbnRleHQoZG9jLCB0cnVlLCBuKSB9XG4gIHZhciBzdGFydCA9IGZpbmRTdGFydExpbmUoY20sIG4sIHByZWNpc2UpO1xuICB2YXIgc2F2ZWQgPSBzdGFydCA+IGRvYy5maXJzdCAmJiBnZXRMaW5lKGRvYywgc3RhcnQgLSAxKS5zdGF0ZUFmdGVyO1xuICB2YXIgY29udGV4dCA9IHNhdmVkID8gQ29udGV4dC5mcm9tU2F2ZWQoZG9jLCBzYXZlZCwgc3RhcnQpIDogbmV3IENvbnRleHQoZG9jLCBzdGFydFN0YXRlKGRvYy5tb2RlKSwgc3RhcnQpO1xuXG4gIGRvYy5pdGVyKHN0YXJ0LCBuLCBmdW5jdGlvbiAobGluZSkge1xuICAgIHByb2Nlc3NMaW5lKGNtLCBsaW5lLnRleHQsIGNvbnRleHQpO1xuICAgIHZhciBwb3MgPSBjb250ZXh0LmxpbmU7XG4gICAgbGluZS5zdGF0ZUFmdGVyID0gcG9zID09IG4gLSAxIHx8IHBvcyAlIDUgPT0gMCB8fCBwb3MgPj0gZGlzcGxheS52aWV3RnJvbSAmJiBwb3MgPCBkaXNwbGF5LnZpZXdUbyA/IGNvbnRleHQuc2F2ZSgpIDogbnVsbDtcbiAgICBjb250ZXh0Lm5leHRMaW5lKCk7XG4gIH0pO1xuICBpZiAocHJlY2lzZSkgeyBkb2MubW9kZUZyb250aWVyID0gY29udGV4dC5saW5lOyB9XG4gIHJldHVybiBjb250ZXh0XG59XG5cbi8vIExpZ2h0d2VpZ2h0IGZvcm0gb2YgaGlnaGxpZ2h0IC0tIHByb2NlZWQgb3ZlciB0aGlzIGxpbmUgYW5kXG4vLyB1cGRhdGUgc3RhdGUsIGJ1dCBkb24ndCBzYXZlIGEgc3R5bGUgYXJyYXkuIFVzZWQgZm9yIGxpbmVzIHRoYXRcbi8vIGFyZW4ndCBjdXJyZW50bHkgdmlzaWJsZS5cbmZ1bmN0aW9uIHByb2Nlc3NMaW5lKGNtLCB0ZXh0LCBjb250ZXh0LCBzdGFydEF0KSB7XG4gIHZhciBtb2RlID0gY20uZG9jLm1vZGU7XG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKHRleHQsIGNtLm9wdGlvbnMudGFiU2l6ZSwgY29udGV4dCk7XG4gIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3MgPSBzdGFydEF0IHx8IDA7XG4gIGlmICh0ZXh0ID09IFwiXCIpIHsgY2FsbEJsYW5rTGluZShtb2RlLCBjb250ZXh0LnN0YXRlKTsgfVxuICB3aGlsZSAoIXN0cmVhbS5lb2woKSkge1xuICAgIHJlYWRUb2tlbihtb2RlLCBzdHJlYW0sIGNvbnRleHQuc3RhdGUpO1xuICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbEJsYW5rTGluZShtb2RlLCBzdGF0ZSkge1xuICBpZiAobW9kZS5ibGFua0xpbmUpIHsgcmV0dXJuIG1vZGUuYmxhbmtMaW5lKHN0YXRlKSB9XG4gIGlmICghbW9kZS5pbm5lck1vZGUpIHsgcmV0dXJuIH1cbiAgdmFyIGlubmVyID0gaW5uZXJNb2RlKG1vZGUsIHN0YXRlKTtcbiAgaWYgKGlubmVyLm1vZGUuYmxhbmtMaW5lKSB7IHJldHVybiBpbm5lci5tb2RlLmJsYW5rTGluZShpbm5lci5zdGF0ZSkgfVxufVxuXG5mdW5jdGlvbiByZWFkVG9rZW4obW9kZSwgc3RyZWFtLCBzdGF0ZSwgaW5uZXIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgaWYgKGlubmVyKSB7IGlubmVyWzBdID0gaW5uZXJNb2RlKG1vZGUsIHN0YXRlKS5tb2RlOyB9XG4gICAgdmFyIHN0eWxlID0gbW9kZS50b2tlbihzdHJlYW0sIHN0YXRlKTtcbiAgICBpZiAoc3RyZWFtLnBvcyA+IHN0cmVhbS5zdGFydCkgeyByZXR1cm4gc3R5bGUgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIk1vZGUgXCIgKyBtb2RlLm5hbWUgKyBcIiBmYWlsZWQgdG8gYWR2YW5jZSBzdHJlYW0uXCIpXG59XG5cbnZhciBUb2tlbiA9IGZ1bmN0aW9uKHN0cmVhbSwgdHlwZSwgc3RhdGUpIHtcbiAgdGhpcy5zdGFydCA9IHN0cmVhbS5zdGFydDsgdGhpcy5lbmQgPSBzdHJlYW0ucG9zO1xuICB0aGlzLnN0cmluZyA9IHN0cmVhbS5jdXJyZW50KCk7XG4gIHRoaXMudHlwZSA9IHR5cGUgfHwgbnVsbDtcbiAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xufTtcblxuLy8gVXRpbGl0eSBmb3IgZ2V0VG9rZW5BdCBhbmQgZ2V0TGluZVRva2Vuc1xuZnVuY3Rpb24gdGFrZVRva2VuKGNtLCBwb3MsIHByZWNpc2UsIGFzQXJyYXkpIHtcbiAgdmFyIGRvYyA9IGNtLmRvYywgbW9kZSA9IGRvYy5tb2RlLCBzdHlsZTtcbiAgcG9zID0gY2xpcFBvcyhkb2MsIHBvcyk7XG4gIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIHBvcy5saW5lKSwgY29udGV4dCA9IGdldENvbnRleHRCZWZvcmUoY20sIHBvcy5saW5lLCBwcmVjaXNlKTtcbiAgdmFyIHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZS50ZXh0LCBjbS5vcHRpb25zLnRhYlNpemUsIGNvbnRleHQpLCB0b2tlbnM7XG4gIGlmIChhc0FycmF5KSB7IHRva2VucyA9IFtdOyB9XG4gIHdoaWxlICgoYXNBcnJheSB8fCBzdHJlYW0ucG9zIDwgcG9zLmNoKSAmJiAhc3RyZWFtLmVvbCgpKSB7XG4gICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvcztcbiAgICBzdHlsZSA9IHJlYWRUb2tlbihtb2RlLCBzdHJlYW0sIGNvbnRleHQuc3RhdGUpO1xuICAgIGlmIChhc0FycmF5KSB7IHRva2Vucy5wdXNoKG5ldyBUb2tlbihzdHJlYW0sIHN0eWxlLCBjb3B5U3RhdGUoZG9jLm1vZGUsIGNvbnRleHQuc3RhdGUpKSk7IH1cbiAgfVxuICByZXR1cm4gYXNBcnJheSA/IHRva2VucyA6IG5ldyBUb2tlbihzdHJlYW0sIHN0eWxlLCBjb250ZXh0LnN0YXRlKVxufVxuXG5mdW5jdGlvbiBleHRyYWN0TGluZUNsYXNzZXModHlwZSwgb3V0cHV0KSB7XG4gIGlmICh0eXBlKSB7IGZvciAoOzspIHtcbiAgICB2YXIgbGluZUNsYXNzID0gdHlwZS5tYXRjaCgvKD86XnxcXHMrKWxpbmUtKGJhY2tncm91bmQtKT8oXFxTKykvKTtcbiAgICBpZiAoIWxpbmVDbGFzcykgeyBicmVhayB9XG4gICAgdHlwZSA9IHR5cGUuc2xpY2UoMCwgbGluZUNsYXNzLmluZGV4KSArIHR5cGUuc2xpY2UobGluZUNsYXNzLmluZGV4ICsgbGluZUNsYXNzWzBdLmxlbmd0aCk7XG4gICAgdmFyIHByb3AgPSBsaW5lQ2xhc3NbMV0gPyBcImJnQ2xhc3NcIiA6IFwidGV4dENsYXNzXCI7XG4gICAgaWYgKG91dHB1dFtwcm9wXSA9PSBudWxsKVxuICAgICAgeyBvdXRwdXRbcHJvcF0gPSBsaW5lQ2xhc3NbMl07IH1cbiAgICBlbHNlIGlmICghKG5ldyBSZWdFeHAoXCIoPzpefFxccylcIiArIGxpbmVDbGFzc1syXSArIFwiKD86JHxcXHMpXCIpKS50ZXN0KG91dHB1dFtwcm9wXSkpXG4gICAgICB7IG91dHB1dFtwcm9wXSArPSBcIiBcIiArIGxpbmVDbGFzc1syXTsgfVxuICB9IH1cbiAgcmV0dXJuIHR5cGVcbn1cblxuLy8gUnVuIHRoZSBnaXZlbiBtb2RlJ3MgcGFyc2VyIG92ZXIgYSBsaW5lLCBjYWxsaW5nIGYgZm9yIGVhY2ggdG9rZW4uXG5mdW5jdGlvbiBydW5Nb2RlKGNtLCB0ZXh0LCBtb2RlLCBjb250ZXh0LCBmLCBsaW5lQ2xhc3NlcywgZm9yY2VUb0VuZCkge1xuICB2YXIgZmxhdHRlblNwYW5zID0gbW9kZS5mbGF0dGVuU3BhbnM7XG4gIGlmIChmbGF0dGVuU3BhbnMgPT0gbnVsbCkgeyBmbGF0dGVuU3BhbnMgPSBjbS5vcHRpb25zLmZsYXR0ZW5TcGFuczsgfVxuICB2YXIgY3VyU3RhcnQgPSAwLCBjdXJTdHlsZSA9IG51bGw7XG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKHRleHQsIGNtLm9wdGlvbnMudGFiU2l6ZSwgY29udGV4dCksIHN0eWxlO1xuICB2YXIgaW5uZXIgPSBjbS5vcHRpb25zLmFkZE1vZGVDbGFzcyAmJiBbbnVsbF07XG4gIGlmICh0ZXh0ID09IFwiXCIpIHsgZXh0cmFjdExpbmVDbGFzc2VzKGNhbGxCbGFua0xpbmUobW9kZSwgY29udGV4dC5zdGF0ZSksIGxpbmVDbGFzc2VzKTsgfVxuICB3aGlsZSAoIXN0cmVhbS5lb2woKSkge1xuICAgIGlmIChzdHJlYW0ucG9zID4gY20ub3B0aW9ucy5tYXhIaWdobGlnaHRMZW5ndGgpIHtcbiAgICAgIGZsYXR0ZW5TcGFucyA9IGZhbHNlO1xuICAgICAgaWYgKGZvcmNlVG9FbmQpIHsgcHJvY2Vzc0xpbmUoY20sIHRleHQsIGNvbnRleHQsIHN0cmVhbS5wb3MpOyB9XG4gICAgICBzdHJlYW0ucG9zID0gdGV4dC5sZW5ndGg7XG4gICAgICBzdHlsZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlID0gZXh0cmFjdExpbmVDbGFzc2VzKHJlYWRUb2tlbihtb2RlLCBzdHJlYW0sIGNvbnRleHQuc3RhdGUsIGlubmVyKSwgbGluZUNsYXNzZXMpO1xuICAgIH1cbiAgICBpZiAoaW5uZXIpIHtcbiAgICAgIHZhciBtTmFtZSA9IGlubmVyWzBdLm5hbWU7XG4gICAgICBpZiAobU5hbWUpIHsgc3R5bGUgPSBcIm0tXCIgKyAoc3R5bGUgPyBtTmFtZSArIFwiIFwiICsgc3R5bGUgOiBtTmFtZSk7IH1cbiAgICB9XG4gICAgaWYgKCFmbGF0dGVuU3BhbnMgfHwgY3VyU3R5bGUgIT0gc3R5bGUpIHtcbiAgICAgIHdoaWxlIChjdXJTdGFydCA8IHN0cmVhbS5zdGFydCkge1xuICAgICAgICBjdXJTdGFydCA9IE1hdGgubWluKHN0cmVhbS5zdGFydCwgY3VyU3RhcnQgKyA1MDAwKTtcbiAgICAgICAgZihjdXJTdGFydCwgY3VyU3R5bGUpO1xuICAgICAgfVxuICAgICAgY3VyU3R5bGUgPSBzdHlsZTtcbiAgICB9XG4gICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvcztcbiAgfVxuICB3aGlsZSAoY3VyU3RhcnQgPCBzdHJlYW0ucG9zKSB7XG4gICAgLy8gV2Via2l0IHNlZW1zIHRvIHJlZnVzZSB0byByZW5kZXIgdGV4dCBub2RlcyBsb25nZXIgdGhhbiA1NzQ0NFxuICAgIC8vIGNoYXJhY3RlcnMsIGFuZCByZXR1cm5zIGluYWNjdXJhdGUgbWVhc3VyZW1lbnRzIGluIG5vZGVzXG4gICAgLy8gc3RhcnRpbmcgYXJvdW5kIDUwMDAgY2hhcnMuXG4gICAgdmFyIHBvcyA9IE1hdGgubWluKHN0cmVhbS5wb3MsIGN1clN0YXJ0ICsgNTAwMCk7XG4gICAgZihwb3MsIGN1clN0eWxlKTtcbiAgICBjdXJTdGFydCA9IHBvcztcbiAgfVxufVxuXG4vLyBGaW5kcyB0aGUgbGluZSB0byBzdGFydCB3aXRoIHdoZW4gc3RhcnRpbmcgYSBwYXJzZS4gVHJpZXMgdG9cbi8vIGZpbmQgYSBsaW5lIHdpdGggYSBzdGF0ZUFmdGVyLCBzbyB0aGF0IGl0IGNhbiBzdGFydCB3aXRoIGFcbi8vIHZhbGlkIHN0YXRlLiBJZiB0aGF0IGZhaWxzLCBpdCByZXR1cm5zIHRoZSBsaW5lIHdpdGggdGhlXG4vLyBzbWFsbGVzdCBpbmRlbnRhdGlvbiwgd2hpY2ggdGVuZHMgdG8gbmVlZCB0aGUgbGVhc3QgY29udGV4dCB0b1xuLy8gcGFyc2UgY29ycmVjdGx5LlxuZnVuY3Rpb24gZmluZFN0YXJ0TGluZShjbSwgbiwgcHJlY2lzZSkge1xuICB2YXIgbWluaW5kZW50LCBtaW5saW5lLCBkb2MgPSBjbS5kb2M7XG4gIHZhciBsaW0gPSBwcmVjaXNlID8gLTEgOiBuIC0gKGNtLmRvYy5tb2RlLmlubmVyTW9kZSA/IDEwMDAgOiAxMDApO1xuICBmb3IgKHZhciBzZWFyY2ggPSBuOyBzZWFyY2ggPiBsaW07IC0tc2VhcmNoKSB7XG4gICAgaWYgKHNlYXJjaCA8PSBkb2MuZmlyc3QpIHsgcmV0dXJuIGRvYy5maXJzdCB9XG4gICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgc2VhcmNoIC0gMSksIGFmdGVyID0gbGluZS5zdGF0ZUFmdGVyO1xuICAgIGlmIChhZnRlciAmJiAoIXByZWNpc2UgfHwgc2VhcmNoICsgKGFmdGVyIGluc3RhbmNlb2YgU2F2ZWRDb250ZXh0ID8gYWZ0ZXIubG9va0FoZWFkIDogMCkgPD0gZG9jLm1vZGVGcm9udGllcikpXG4gICAgICB7IHJldHVybiBzZWFyY2ggfVxuICAgIHZhciBpbmRlbnRlZCA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgY20ub3B0aW9ucy50YWJTaXplKTtcbiAgICBpZiAobWlubGluZSA9PSBudWxsIHx8IG1pbmluZGVudCA+IGluZGVudGVkKSB7XG4gICAgICBtaW5saW5lID0gc2VhcmNoIC0gMTtcbiAgICAgIG1pbmluZGVudCA9IGluZGVudGVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWlubGluZVxufVxuXG5mdW5jdGlvbiByZXRyZWF0RnJvbnRpZXIoZG9jLCBuKSB7XG4gIGRvYy5tb2RlRnJvbnRpZXIgPSBNYXRoLm1pbihkb2MubW9kZUZyb250aWVyLCBuKTtcbiAgaWYgKGRvYy5oaWdobGlnaHRGcm9udGllciA8IG4gLSAxMCkgeyByZXR1cm4gfVxuICB2YXIgc3RhcnQgPSBkb2MuZmlyc3Q7XG4gIGZvciAodmFyIGxpbmUgPSBuIC0gMTsgbGluZSA+IHN0YXJ0OyBsaW5lLS0pIHtcbiAgICB2YXIgc2F2ZWQgPSBnZXRMaW5lKGRvYywgbGluZSkuc3RhdGVBZnRlcjtcbiAgICAvLyBjaGFuZ2UgaXMgb24gM1xuICAgIC8vIHN0YXRlIG9uIGxpbmUgMSBsb29rZWQgYWhlYWQgMiAtLSBzbyBzYXcgM1xuICAgIC8vIHRlc3QgMSArIDIgPCAzIHNob3VsZCBjb3ZlciB0aGlzXG4gICAgaWYgKHNhdmVkICYmICghKHNhdmVkIGluc3RhbmNlb2YgU2F2ZWRDb250ZXh0KSB8fCBsaW5lICsgc2F2ZWQubG9va0FoZWFkIDwgbikpIHtcbiAgICAgIHN0YXJ0ID0gbGluZSArIDE7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICBkb2MuaGlnaGxpZ2h0RnJvbnRpZXIgPSBNYXRoLm1pbihkb2MuaGlnaGxpZ2h0RnJvbnRpZXIsIHN0YXJ0KTtcbn1cblxuLy8gTElORSBEQVRBIFNUUlVDVFVSRVxuXG4vLyBMaW5lIG9iamVjdHMuIFRoZXNlIGhvbGQgc3RhdGUgcmVsYXRlZCB0byBhIGxpbmUsIGluY2x1ZGluZ1xuLy8gaGlnaGxpZ2h0aW5nIGluZm8gKHRoZSBzdHlsZXMgYXJyYXkpLlxudmFyIExpbmUgPSBmdW5jdGlvbih0ZXh0LCBtYXJrZWRTcGFucywgZXN0aW1hdGVIZWlnaHQpIHtcbiAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgYXR0YWNoTWFya2VkU3BhbnModGhpcywgbWFya2VkU3BhbnMpO1xuICB0aGlzLmhlaWdodCA9IGVzdGltYXRlSGVpZ2h0ID8gZXN0aW1hdGVIZWlnaHQodGhpcykgOiAxO1xufTtcblxuTGluZS5wcm90b3R5cGUubGluZU5vID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbGluZU5vKHRoaXMpIH07XG5ldmVudE1peGluKExpbmUpO1xuXG4vLyBDaGFuZ2UgdGhlIGNvbnRlbnQgKHRleHQsIG1hcmtlcnMpIG9mIGEgbGluZS4gQXV0b21hdGljYWxseVxuLy8gaW52YWxpZGF0ZXMgY2FjaGVkIGluZm9ybWF0aW9uIGFuZCB0cmllcyB0byByZS1lc3RpbWF0ZSB0aGVcbi8vIGxpbmUncyBoZWlnaHQuXG5mdW5jdGlvbiB1cGRhdGVMaW5lKGxpbmUsIHRleHQsIG1hcmtlZFNwYW5zLCBlc3RpbWF0ZUhlaWdodCkge1xuICBsaW5lLnRleHQgPSB0ZXh0O1xuICBpZiAobGluZS5zdGF0ZUFmdGVyKSB7IGxpbmUuc3RhdGVBZnRlciA9IG51bGw7IH1cbiAgaWYgKGxpbmUuc3R5bGVzKSB7IGxpbmUuc3R5bGVzID0gbnVsbDsgfVxuICBpZiAobGluZS5vcmRlciAhPSBudWxsKSB7IGxpbmUub3JkZXIgPSBudWxsOyB9XG4gIGRldGFjaE1hcmtlZFNwYW5zKGxpbmUpO1xuICBhdHRhY2hNYXJrZWRTcGFucyhsaW5lLCBtYXJrZWRTcGFucyk7XG4gIHZhciBlc3RIZWlnaHQgPSBlc3RpbWF0ZUhlaWdodCA/IGVzdGltYXRlSGVpZ2h0KGxpbmUpIDogMTtcbiAgaWYgKGVzdEhlaWdodCAhPSBsaW5lLmhlaWdodCkgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGVzdEhlaWdodCk7IH1cbn1cblxuLy8gRGV0YWNoIGEgbGluZSBmcm9tIHRoZSBkb2N1bWVudCB0cmVlIGFuZCBpdHMgbWFya2Vycy5cbmZ1bmN0aW9uIGNsZWFuVXBMaW5lKGxpbmUpIHtcbiAgbGluZS5wYXJlbnQgPSBudWxsO1xuICBkZXRhY2hNYXJrZWRTcGFucyhsaW5lKTtcbn1cblxuLy8gQ29udmVydCBhIHN0eWxlIGFzIHJldHVybmVkIGJ5IGEgbW9kZSAoZWl0aGVyIG51bGwsIG9yIGEgc3RyaW5nXG4vLyBjb250YWluaW5nIG9uZSBvciBtb3JlIHN0eWxlcykgdG8gYSBDU1Mgc3R5bGUuIFRoaXMgaXMgY2FjaGVkLFxuLy8gYW5kIGFsc28gbG9va3MgZm9yIGxpbmUtd2lkZSBzdHlsZXMuXG52YXIgc3R5bGVUb0NsYXNzQ2FjaGUgPSB7fTtcbnZhciBzdHlsZVRvQ2xhc3NDYWNoZVdpdGhNb2RlID0ge307XG5mdW5jdGlvbiBpbnRlcnByZXRUb2tlblN0eWxlKHN0eWxlLCBvcHRpb25zKSB7XG4gIGlmICghc3R5bGUgfHwgL15cXHMqJC8udGVzdChzdHlsZSkpIHsgcmV0dXJuIG51bGwgfVxuICB2YXIgY2FjaGUgPSBvcHRpb25zLmFkZE1vZGVDbGFzcyA/IHN0eWxlVG9DbGFzc0NhY2hlV2l0aE1vZGUgOiBzdHlsZVRvQ2xhc3NDYWNoZTtcbiAgcmV0dXJuIGNhY2hlW3N0eWxlXSB8fFxuICAgIChjYWNoZVtzdHlsZV0gPSBzdHlsZS5yZXBsYWNlKC9cXFMrL2csIFwiY20tJCZcIikpXG59XG5cbi8vIFJlbmRlciB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXh0IG9mIGEgbGluZS4gQWxzbyBidWlsZHNcbi8vIHVwIGEgJ2xpbmUgbWFwJywgd2hpY2ggcG9pbnRzIGF0IHRoZSBET00gbm9kZXMgdGhhdCByZXByZXNlbnRcbi8vIHNwZWNpZmljIHN0cmV0Y2hlcyBvZiB0ZXh0LCBhbmQgaXMgdXNlZCBieSB0aGUgbWVhc3VyaW5nIGNvZGUuXG4vLyBUaGUgcmV0dXJuZWQgb2JqZWN0IGNvbnRhaW5zIHRoZSBET00gbm9kZSwgdGhpcyBtYXAsIGFuZFxuLy8gaW5mb3JtYXRpb24gYWJvdXQgbGluZS13aWRlIHN0eWxlcyB0aGF0IHdlcmUgc2V0IGJ5IHRoZSBtb2RlLlxuZnVuY3Rpb24gYnVpbGRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpIHtcbiAgLy8gVGhlIHBhZGRpbmctcmlnaHQgZm9yY2VzIHRoZSBlbGVtZW50IHRvIGhhdmUgYSAnYm9yZGVyJywgd2hpY2hcbiAgLy8gaXMgbmVlZGVkIG9uIFdlYmtpdCB0byBiZSBhYmxlIHRvIGdldCBsaW5lLWxldmVsIGJvdW5kaW5nXG4gIC8vIHJlY3RhbmdsZXMgZm9yIGl0IChpbiBtZWFzdXJlQ2hhcikuXG4gIHZhciBjb250ZW50ID0gZWx0UChcInNwYW5cIiwgbnVsbCwgbnVsbCwgd2Via2l0ID8gXCJwYWRkaW5nLXJpZ2h0OiAuMXB4XCIgOiBudWxsKTtcbiAgdmFyIGJ1aWxkZXIgPSB7cHJlOiBlbHRQKFwicHJlXCIsIFtjb250ZW50XSwgXCJDb2RlTWlycm9yLWxpbmVcIiksIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgIGNvbDogMCwgcG9zOiAwLCBjbTogY20sXG4gICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICBzcGxpdFNwYWNlczogKGllIHx8IHdlYmtpdCkgJiYgY20uZ2V0T3B0aW9uKFwibGluZVdyYXBwaW5nXCIpfTtcbiAgbGluZVZpZXcubWVhc3VyZSA9IHt9O1xuXG4gIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbG9naWNhbCBsaW5lcyB0aGF0IG1ha2UgdXAgdGhpcyB2aXN1YWwgbGluZS5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gKGxpbmVWaWV3LnJlc3QgPyBsaW5lVmlldy5yZXN0Lmxlbmd0aCA6IDApOyBpKyspIHtcbiAgICB2YXIgbGluZSA9IGkgPyBsaW5lVmlldy5yZXN0W2kgLSAxXSA6IGxpbmVWaWV3LmxpbmUsIG9yZGVyID0gKHZvaWQgMCk7XG4gICAgYnVpbGRlci5wb3MgPSAwO1xuICAgIGJ1aWxkZXIuYWRkVG9rZW4gPSBidWlsZFRva2VuO1xuICAgIC8vIE9wdGlvbmFsbHkgd2lyZSBpbiBzb21lIGhhY2tzIGludG8gdGhlIHRva2VuLXJlbmRlcmluZ1xuICAgIC8vIGFsZ29yaXRobSwgdG8gZGVhbCB3aXRoIGJyb3dzZXIgcXVpcmtzLlxuICAgIGlmIChoYXNCYWRCaWRpUmVjdHMoY20uZGlzcGxheS5tZWFzdXJlKSAmJiAob3JkZXIgPSBnZXRPcmRlcihsaW5lLCBjbS5kb2MuZGlyZWN0aW9uKSkpXG4gICAgICB7IGJ1aWxkZXIuYWRkVG9rZW4gPSBidWlsZFRva2VuQmFkQmlkaShidWlsZGVyLmFkZFRva2VuLCBvcmRlcik7IH1cbiAgICBidWlsZGVyLm1hcCA9IFtdO1xuICAgIHZhciBhbGxvd0Zyb250aWVyVXBkYXRlID0gbGluZVZpZXcgIT0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkICYmIGxpbmVObyhsaW5lKTtcbiAgICBpbnNlcnRMaW5lQ29udGVudChsaW5lLCBidWlsZGVyLCBnZXRMaW5lU3R5bGVzKGNtLCBsaW5lLCBhbGxvd0Zyb250aWVyVXBkYXRlKSk7XG4gICAgaWYgKGxpbmUuc3R5bGVDbGFzc2VzKSB7XG4gICAgICBpZiAobGluZS5zdHlsZUNsYXNzZXMuYmdDbGFzcylcbiAgICAgICAgeyBidWlsZGVyLmJnQ2xhc3MgPSBqb2luQ2xhc3NlcyhsaW5lLnN0eWxlQ2xhc3Nlcy5iZ0NsYXNzLCBidWlsZGVyLmJnQ2xhc3MgfHwgXCJcIik7IH1cbiAgICAgIGlmIChsaW5lLnN0eWxlQ2xhc3Nlcy50ZXh0Q2xhc3MpXG4gICAgICAgIHsgYnVpbGRlci50ZXh0Q2xhc3MgPSBqb2luQ2xhc3NlcyhsaW5lLnN0eWxlQ2xhc3Nlcy50ZXh0Q2xhc3MsIGJ1aWxkZXIudGV4dENsYXNzIHx8IFwiXCIpOyB9XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGF0IGxlYXN0IGEgc2luZ2xlIG5vZGUgaXMgcHJlc2VudCwgZm9yIG1lYXN1cmluZy5cbiAgICBpZiAoYnVpbGRlci5tYXAubGVuZ3RoID09IDApXG4gICAgICB7IGJ1aWxkZXIubWFwLnB1c2goMCwgMCwgYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKHplcm9XaWR0aEVsZW1lbnQoY20uZGlzcGxheS5tZWFzdXJlKSkpOyB9XG5cbiAgICAvLyBTdG9yZSB0aGUgbWFwIGFuZCBhIGNhY2hlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgbG9naWNhbCBsaW5lXG4gICAgaWYgKGkgPT0gMCkge1xuICAgICAgbGluZVZpZXcubWVhc3VyZS5tYXAgPSBidWlsZGVyLm1hcDtcbiAgICAgIGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGUgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgKGxpbmVWaWV3Lm1lYXN1cmUubWFwcyB8fCAobGluZVZpZXcubWVhc3VyZS5tYXBzID0gW10pKS5wdXNoKGJ1aWxkZXIubWFwKVxuICAgICAgOyhsaW5lVmlldy5tZWFzdXJlLmNhY2hlcyB8fCAobGluZVZpZXcubWVhc3VyZS5jYWNoZXMgPSBbXSkpLnB1c2goe30pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlZSBpc3N1ZSAjMjkwMVxuICBpZiAod2Via2l0KSB7XG4gICAgdmFyIGxhc3QgPSBidWlsZGVyLmNvbnRlbnQubGFzdENoaWxkO1xuICAgIGlmICgvXFxiY20tdGFiXFxiLy50ZXN0KGxhc3QuY2xhc3NOYW1lKSB8fCAobGFzdC5xdWVyeVNlbGVjdG9yICYmIGxhc3QucXVlcnlTZWxlY3RvcihcIi5jbS10YWJcIikpKVxuICAgICAgeyBidWlsZGVyLmNvbnRlbnQuY2xhc3NOYW1lID0gXCJjbS10YWItd3JhcC1oYWNrXCI7IH1cbiAgfVxuXG4gIHNpZ25hbChjbSwgXCJyZW5kZXJMaW5lXCIsIGNtLCBsaW5lVmlldy5saW5lLCBidWlsZGVyLnByZSk7XG4gIGlmIChidWlsZGVyLnByZS5jbGFzc05hbWUpXG4gICAgeyBidWlsZGVyLnRleHRDbGFzcyA9IGpvaW5DbGFzc2VzKGJ1aWxkZXIucHJlLmNsYXNzTmFtZSwgYnVpbGRlci50ZXh0Q2xhc3MgfHwgXCJcIik7IH1cblxuICByZXR1cm4gYnVpbGRlclxufVxuXG5mdW5jdGlvbiBkZWZhdWx0U3BlY2lhbENoYXJQbGFjZWhvbGRlcihjaCkge1xuICB2YXIgdG9rZW4gPSBlbHQoXCJzcGFuXCIsIFwiXFx1MjAyMlwiLCBcImNtLWludmFsaWRjaGFyXCIpO1xuICB0b2tlbi50aXRsZSA9IFwiXFxcXHVcIiArIGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xuICB0b2tlbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHRva2VuLnRpdGxlKTtcbiAgcmV0dXJuIHRva2VuXG59XG5cbi8vIEJ1aWxkIHVwIHRoZSBET00gcmVwcmVzZW50YXRpb24gZm9yIGEgc2luZ2xlIHRva2VuLCBhbmQgYWRkIGl0IHRvXG4vLyB0aGUgbGluZSBtYXAuIFRha2VzIGNhcmUgdG8gcmVuZGVyIHNwZWNpYWwgY2hhcmFjdGVycyBzZXBhcmF0ZWx5LlxuZnVuY3Rpb24gYnVpbGRUb2tlbihidWlsZGVyLCB0ZXh0LCBzdHlsZSwgc3RhcnRTdHlsZSwgZW5kU3R5bGUsIHRpdGxlLCBjc3MpIHtcbiAgaWYgKCF0ZXh0KSB7IHJldHVybiB9XG4gIHZhciBkaXNwbGF5VGV4dCA9IGJ1aWxkZXIuc3BsaXRTcGFjZXMgPyBzcGxpdFNwYWNlcyh0ZXh0LCBidWlsZGVyLnRyYWlsaW5nU3BhY2UpIDogdGV4dDtcbiAgdmFyIHNwZWNpYWwgPSBidWlsZGVyLmNtLnN0YXRlLnNwZWNpYWxDaGFycywgbXVzdFdyYXAgPSBmYWxzZTtcbiAgdmFyIGNvbnRlbnQ7XG4gIGlmICghc3BlY2lhbC50ZXN0KHRleHQpKSB7XG4gICAgYnVpbGRlci5jb2wgKz0gdGV4dC5sZW5ndGg7XG4gICAgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRpc3BsYXlUZXh0KTtcbiAgICBidWlsZGVyLm1hcC5wdXNoKGJ1aWxkZXIucG9zLCBidWlsZGVyLnBvcyArIHRleHQubGVuZ3RoLCBjb250ZW50KTtcbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIHsgbXVzdFdyYXAgPSB0cnVlOyB9XG4gICAgYnVpbGRlci5wb3MgKz0gdGV4dC5sZW5ndGg7XG4gIH0gZWxzZSB7XG4gICAgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICB2YXIgcG9zID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgc3BlY2lhbC5sYXN0SW5kZXggPSBwb3M7XG4gICAgICB2YXIgbSA9IHNwZWNpYWwuZXhlYyh0ZXh0KTtcbiAgICAgIHZhciBza2lwcGVkID0gbSA/IG0uaW5kZXggLSBwb3MgOiB0ZXh0Lmxlbmd0aCAtIHBvcztcbiAgICAgIGlmIChza2lwcGVkKSB7XG4gICAgICAgIHZhciB0eHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkaXNwbGF5VGV4dC5zbGljZShwb3MsIHBvcyArIHNraXBwZWQpKTtcbiAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5KSB7IGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KFwic3BhblwiLCBbdHh0XSkpOyB9XG4gICAgICAgIGVsc2UgeyBjb250ZW50LmFwcGVuZENoaWxkKHR4dCk7IH1cbiAgICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyBza2lwcGVkLCB0eHQpO1xuICAgICAgICBidWlsZGVyLmNvbCArPSBza2lwcGVkO1xuICAgICAgICBidWlsZGVyLnBvcyArPSBza2lwcGVkO1xuICAgICAgfVxuICAgICAgaWYgKCFtKSB7IGJyZWFrIH1cbiAgICAgIHBvcyArPSBza2lwcGVkICsgMTtcbiAgICAgIHZhciB0eHQkMSA9ICh2b2lkIDApO1xuICAgICAgaWYgKG1bMF0gPT0gXCJcXHRcIikge1xuICAgICAgICB2YXIgdGFiU2l6ZSA9IGJ1aWxkZXIuY20ub3B0aW9ucy50YWJTaXplLCB0YWJXaWR0aCA9IHRhYlNpemUgLSBidWlsZGVyLmNvbCAlIHRhYlNpemU7XG4gICAgICAgIHR4dCQxID0gY29udGVudC5hcHBlbmRDaGlsZChlbHQoXCJzcGFuXCIsIHNwYWNlU3RyKHRhYldpZHRoKSwgXCJjbS10YWJcIikpO1xuICAgICAgICB0eHQkMS5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwicHJlc2VudGF0aW9uXCIpO1xuICAgICAgICB0eHQkMS5zZXRBdHRyaWJ1dGUoXCJjbS10ZXh0XCIsIFwiXFx0XCIpO1xuICAgICAgICBidWlsZGVyLmNvbCArPSB0YWJXaWR0aDtcbiAgICAgIH0gZWxzZSBpZiAobVswXSA9PSBcIlxcclwiIHx8IG1bMF0gPT0gXCJcXG5cIikge1xuICAgICAgICB0eHQkMSA9IGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KFwic3BhblwiLCBtWzBdID09IFwiXFxyXCIgPyBcIlxcdTI0MGRcIiA6IFwiXFx1MjQyNFwiLCBcImNtLWludmFsaWRjaGFyXCIpKTtcbiAgICAgICAgdHh0JDEuc2V0QXR0cmlidXRlKFwiY20tdGV4dFwiLCBtWzBdKTtcbiAgICAgICAgYnVpbGRlci5jb2wgKz0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR4dCQxID0gYnVpbGRlci5jbS5vcHRpb25zLnNwZWNpYWxDaGFyUGxhY2Vob2xkZXIobVswXSk7XG4gICAgICAgIHR4dCQxLnNldEF0dHJpYnV0ZShcImNtLXRleHRcIiwgbVswXSk7XG4gICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSkgeyBjb250ZW50LmFwcGVuZENoaWxkKGVsdChcInNwYW5cIiwgW3R4dCQxXSkpOyB9XG4gICAgICAgIGVsc2UgeyBjb250ZW50LmFwcGVuZENoaWxkKHR4dCQxKTsgfVxuICAgICAgICBidWlsZGVyLmNvbCArPSAxO1xuICAgICAgfVxuICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyAxLCB0eHQkMSk7XG4gICAgICBidWlsZGVyLnBvcysrO1xuICAgIH1cbiAgfVxuICBidWlsZGVyLnRyYWlsaW5nU3BhY2UgPSBkaXNwbGF5VGV4dC5jaGFyQ29kZUF0KHRleHQubGVuZ3RoIC0gMSkgPT0gMzI7XG4gIGlmIChzdHlsZSB8fCBzdGFydFN0eWxlIHx8IGVuZFN0eWxlIHx8IG11c3RXcmFwIHx8IGNzcykge1xuICAgIHZhciBmdWxsU3R5bGUgPSBzdHlsZSB8fCBcIlwiO1xuICAgIGlmIChzdGFydFN0eWxlKSB7IGZ1bGxTdHlsZSArPSBzdGFydFN0eWxlOyB9XG4gICAgaWYgKGVuZFN0eWxlKSB7IGZ1bGxTdHlsZSArPSBlbmRTdHlsZTsgfVxuICAgIHZhciB0b2tlbiA9IGVsdChcInNwYW5cIiwgW2NvbnRlbnRdLCBmdWxsU3R5bGUsIGNzcyk7XG4gICAgaWYgKHRpdGxlKSB7IHRva2VuLnRpdGxlID0gdGl0bGU7IH1cbiAgICByZXR1cm4gYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKHRva2VuKVxuICB9XG4gIGJ1aWxkZXIuY29udGVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcbn1cblxuZnVuY3Rpb24gc3BsaXRTcGFjZXModGV4dCwgdHJhaWxpbmdCZWZvcmUpIHtcbiAgaWYgKHRleHQubGVuZ3RoID4gMSAmJiAhLyAgLy50ZXN0KHRleHQpKSB7IHJldHVybiB0ZXh0IH1cbiAgdmFyIHNwYWNlQmVmb3JlID0gdHJhaWxpbmdCZWZvcmUsIHJlc3VsdCA9IFwiXCI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaCA9IHRleHQuY2hhckF0KGkpO1xuICAgIGlmIChjaCA9PSBcIiBcIiAmJiBzcGFjZUJlZm9yZSAmJiAoaSA9PSB0ZXh0Lmxlbmd0aCAtIDEgfHwgdGV4dC5jaGFyQ29kZUF0KGkgKyAxKSA9PSAzMikpXG4gICAgICB7IGNoID0gXCJcXHUwMGEwXCI7IH1cbiAgICByZXN1bHQgKz0gY2g7XG4gICAgc3BhY2VCZWZvcmUgPSBjaCA9PSBcIiBcIjtcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIFdvcmsgYXJvdW5kIG5vbnNlbnNlIGRpbWVuc2lvbnMgYmVpbmcgcmVwb3J0ZWQgZm9yIHN0cmV0Y2hlcyBvZlxuLy8gcmlnaHQtdG8tbGVmdCB0ZXh0LlxuZnVuY3Rpb24gYnVpbGRUb2tlbkJhZEJpZGkoaW5uZXIsIG9yZGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYnVpbGRlciwgdGV4dCwgc3R5bGUsIHN0YXJ0U3R5bGUsIGVuZFN0eWxlLCB0aXRsZSwgY3NzKSB7XG4gICAgc3R5bGUgPSBzdHlsZSA/IHN0eWxlICsgXCIgY20tZm9yY2UtYm9yZGVyXCIgOiBcImNtLWZvcmNlLWJvcmRlclwiO1xuICAgIHZhciBzdGFydCA9IGJ1aWxkZXIucG9zLCBlbmQgPSBzdGFydCArIHRleHQubGVuZ3RoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIC8vIEZpbmQgdGhlIHBhcnQgdGhhdCBvdmVybGFwcyB3aXRoIHRoZSBzdGFydCBvZiB0aGlzIHRleHRcbiAgICAgIHZhciBwYXJ0ID0gKHZvaWQgMCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBhcnQgPSBvcmRlcltpXTtcbiAgICAgICAgaWYgKHBhcnQudG8gPiBzdGFydCAmJiBwYXJ0LmZyb20gPD0gc3RhcnQpIHsgYnJlYWsgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcnQudG8gPj0gZW5kKSB7IHJldHVybiBpbm5lcihidWlsZGVyLCB0ZXh0LCBzdHlsZSwgc3RhcnRTdHlsZSwgZW5kU3R5bGUsIHRpdGxlLCBjc3MpIH1cbiAgICAgIGlubmVyKGJ1aWxkZXIsIHRleHQuc2xpY2UoMCwgcGFydC50byAtIHN0YXJ0KSwgc3R5bGUsIHN0YXJ0U3R5bGUsIG51bGwsIHRpdGxlLCBjc3MpO1xuICAgICAgc3RhcnRTdHlsZSA9IG51bGw7XG4gICAgICB0ZXh0ID0gdGV4dC5zbGljZShwYXJ0LnRvIC0gc3RhcnQpO1xuICAgICAgc3RhcnQgPSBwYXJ0LnRvO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwgc2l6ZSwgbWFya2VyLCBpZ25vcmVXaWRnZXQpIHtcbiAgdmFyIHdpZGdldCA9ICFpZ25vcmVXaWRnZXQgJiYgbWFya2VyLndpZGdldE5vZGU7XG4gIGlmICh3aWRnZXQpIHsgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyBzaXplLCB3aWRnZXQpOyB9XG4gIGlmICghaWdub3JlV2lkZ2V0ICYmIGJ1aWxkZXIuY20uZGlzcGxheS5pbnB1dC5uZWVkc0NvbnRlbnRBdHRyaWJ1dGUpIHtcbiAgICBpZiAoIXdpZGdldClcbiAgICAgIHsgd2lkZ2V0ID0gYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTsgfVxuICAgIHdpZGdldC5zZXRBdHRyaWJ1dGUoXCJjbS1tYXJrZXJcIiwgbWFya2VyLmlkKTtcbiAgfVxuICBpZiAod2lkZ2V0KSB7XG4gICAgYnVpbGRlci5jbS5kaXNwbGF5LmlucHV0LnNldFVuZWRpdGFibGUod2lkZ2V0KTtcbiAgICBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQod2lkZ2V0KTtcbiAgfVxuICBidWlsZGVyLnBvcyArPSBzaXplO1xuICBidWlsZGVyLnRyYWlsaW5nU3BhY2UgPSBmYWxzZTtcbn1cblxuLy8gT3V0cHV0cyBhIG51bWJlciBvZiBzcGFucyB0byBtYWtlIHVwIGEgbGluZSwgdGFraW5nIGhpZ2hsaWdodGluZ1xuLy8gYW5kIG1hcmtlZCB0ZXh0IGludG8gYWNjb3VudC5cbmZ1bmN0aW9uIGluc2VydExpbmVDb250ZW50KGxpbmUsIGJ1aWxkZXIsIHN0eWxlcykge1xuICB2YXIgc3BhbnMgPSBsaW5lLm1hcmtlZFNwYW5zLCBhbGxUZXh0ID0gbGluZS50ZXh0LCBhdCA9IDA7XG4gIGlmICghc3BhbnMpIHtcbiAgICBmb3IgKHZhciBpJDEgPSAxOyBpJDEgPCBzdHlsZXMubGVuZ3RoOyBpJDErPTIpXG4gICAgICB7IGJ1aWxkZXIuYWRkVG9rZW4oYnVpbGRlciwgYWxsVGV4dC5zbGljZShhdCwgYXQgPSBzdHlsZXNbaSQxXSksIGludGVycHJldFRva2VuU3R5bGUoc3R5bGVzW2kkMSsxXSwgYnVpbGRlci5jbS5vcHRpb25zKSk7IH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBsZW4gPSBhbGxUZXh0Lmxlbmd0aCwgcG9zID0gMCwgaSA9IDEsIHRleHQgPSBcIlwiLCBzdHlsZSwgY3NzO1xuICB2YXIgbmV4dENoYW5nZSA9IDAsIHNwYW5TdHlsZSwgc3BhbkVuZFN0eWxlLCBzcGFuU3RhcnRTdHlsZSwgdGl0bGUsIGNvbGxhcHNlZDtcbiAgZm9yICg7Oykge1xuICAgIGlmIChuZXh0Q2hhbmdlID09IHBvcykgeyAvLyBVcGRhdGUgY3VycmVudCBtYXJrZXIgc2V0XG4gICAgICBzcGFuU3R5bGUgPSBzcGFuRW5kU3R5bGUgPSBzcGFuU3RhcnRTdHlsZSA9IHRpdGxlID0gY3NzID0gXCJcIjtcbiAgICAgIGNvbGxhcHNlZCA9IG51bGw7IG5leHRDaGFuZ2UgPSBJbmZpbml0eTtcbiAgICAgIHZhciBmb3VuZEJvb2ttYXJrcyA9IFtdLCBlbmRTdHlsZXMgPSAodm9pZCAwKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3BhbnMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgdmFyIHNwID0gc3BhbnNbal0sIG0gPSBzcC5tYXJrZXI7XG4gICAgICAgIGlmIChtLnR5cGUgPT0gXCJib29rbWFya1wiICYmIHNwLmZyb20gPT0gcG9zICYmIG0ud2lkZ2V0Tm9kZSkge1xuICAgICAgICAgIGZvdW5kQm9va21hcmtzLnB1c2gobSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3AuZnJvbSA8PSBwb3MgJiYgKHNwLnRvID09IG51bGwgfHwgc3AudG8gPiBwb3MgfHwgbS5jb2xsYXBzZWQgJiYgc3AudG8gPT0gcG9zICYmIHNwLmZyb20gPT0gcG9zKSkge1xuICAgICAgICAgIGlmIChzcC50byAhPSBudWxsICYmIHNwLnRvICE9IHBvcyAmJiBuZXh0Q2hhbmdlID4gc3AudG8pIHtcbiAgICAgICAgICAgIG5leHRDaGFuZ2UgPSBzcC50bztcbiAgICAgICAgICAgIHNwYW5FbmRTdHlsZSA9IFwiXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtLmNsYXNzTmFtZSkgeyBzcGFuU3R5bGUgKz0gXCIgXCIgKyBtLmNsYXNzTmFtZTsgfVxuICAgICAgICAgIGlmIChtLmNzcykgeyBjc3MgPSAoY3NzID8gY3NzICsgXCI7XCIgOiBcIlwiKSArIG0uY3NzOyB9XG4gICAgICAgICAgaWYgKG0uc3RhcnRTdHlsZSAmJiBzcC5mcm9tID09IHBvcykgeyBzcGFuU3RhcnRTdHlsZSArPSBcIiBcIiArIG0uc3RhcnRTdHlsZTsgfVxuICAgICAgICAgIGlmIChtLmVuZFN0eWxlICYmIHNwLnRvID09IG5leHRDaGFuZ2UpIHsgKGVuZFN0eWxlcyB8fCAoZW5kU3R5bGVzID0gW10pKS5wdXNoKG0uZW5kU3R5bGUsIHNwLnRvKTsgfVxuICAgICAgICAgIGlmIChtLnRpdGxlICYmICF0aXRsZSkgeyB0aXRsZSA9IG0udGl0bGU7IH1cbiAgICAgICAgICBpZiAobS5jb2xsYXBzZWQgJiYgKCFjb2xsYXBzZWQgfHwgY29tcGFyZUNvbGxhcHNlZE1hcmtlcnMoY29sbGFwc2VkLm1hcmtlciwgbSkgPCAwKSlcbiAgICAgICAgICAgIHsgY29sbGFwc2VkID0gc3A7IH1cbiAgICAgICAgfSBlbHNlIGlmIChzcC5mcm9tID4gcG9zICYmIG5leHRDaGFuZ2UgPiBzcC5mcm9tKSB7XG4gICAgICAgICAgbmV4dENoYW5nZSA9IHNwLmZyb207XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbmRTdHlsZXMpIHsgZm9yICh2YXIgaiQxID0gMDsgaiQxIDwgZW5kU3R5bGVzLmxlbmd0aDsgaiQxICs9IDIpXG4gICAgICAgIHsgaWYgKGVuZFN0eWxlc1tqJDEgKyAxXSA9PSBuZXh0Q2hhbmdlKSB7IHNwYW5FbmRTdHlsZSArPSBcIiBcIiArIGVuZFN0eWxlc1tqJDFdOyB9IH0gfVxuXG4gICAgICBpZiAoIWNvbGxhcHNlZCB8fCBjb2xsYXBzZWQuZnJvbSA9PSBwb3MpIHsgZm9yICh2YXIgaiQyID0gMDsgaiQyIDwgZm91bmRCb29rbWFya3MubGVuZ3RoOyArK2okMilcbiAgICAgICAgeyBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwgMCwgZm91bmRCb29rbWFya3NbaiQyXSk7IH0gfVxuICAgICAgaWYgKGNvbGxhcHNlZCAmJiAoY29sbGFwc2VkLmZyb20gfHwgMCkgPT0gcG9zKSB7XG4gICAgICAgIGJ1aWxkQ29sbGFwc2VkU3BhbihidWlsZGVyLCAoY29sbGFwc2VkLnRvID09IG51bGwgPyBsZW4gKyAxIDogY29sbGFwc2VkLnRvKSAtIHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZC5tYXJrZXIsIGNvbGxhcHNlZC5mcm9tID09IG51bGwpO1xuICAgICAgICBpZiAoY29sbGFwc2VkLnRvID09IG51bGwpIHsgcmV0dXJuIH1cbiAgICAgICAgaWYgKGNvbGxhcHNlZC50byA9PSBwb3MpIHsgY29sbGFwc2VkID0gZmFsc2U7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvcyA+PSBsZW4pIHsgYnJlYWsgfVxuXG4gICAgdmFyIHVwdG8gPSBNYXRoLm1pbihsZW4sIG5leHRDaGFuZ2UpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB2YXIgZW5kID0gcG9zICsgdGV4dC5sZW5ndGg7XG4gICAgICAgIGlmICghY29sbGFwc2VkKSB7XG4gICAgICAgICAgdmFyIHRva2VuVGV4dCA9IGVuZCA+IHVwdG8gPyB0ZXh0LnNsaWNlKDAsIHVwdG8gLSBwb3MpIDogdGV4dDtcbiAgICAgICAgICBidWlsZGVyLmFkZFRva2VuKGJ1aWxkZXIsIHRva2VuVGV4dCwgc3R5bGUgPyBzdHlsZSArIHNwYW5TdHlsZSA6IHNwYW5TdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5TdGFydFN0eWxlLCBwb3MgKyB0b2tlblRleHQubGVuZ3RoID09IG5leHRDaGFuZ2UgPyBzcGFuRW5kU3R5bGUgOiBcIlwiLCB0aXRsZSwgY3NzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kID49IHVwdG8pIHt0ZXh0ID0gdGV4dC5zbGljZSh1cHRvIC0gcG9zKTsgcG9zID0gdXB0bzsgYnJlYWt9XG4gICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgc3BhblN0YXJ0U3R5bGUgPSBcIlwiO1xuICAgICAgfVxuICAgICAgdGV4dCA9IGFsbFRleHQuc2xpY2UoYXQsIGF0ID0gc3R5bGVzW2krK10pO1xuICAgICAgc3R5bGUgPSBpbnRlcnByZXRUb2tlblN0eWxlKHN0eWxlc1tpKytdLCBidWlsZGVyLmNtLm9wdGlvbnMpO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB2aXNpYmxlIChjdXJyZW50bHkgZHJhd24pXG4vLyBwYXJ0IG9mIHRoZSBkb2N1bWVudC4gQSBMaW5lVmlldyBtYXkgY29ycmVzcG9uZCB0byBtdWx0aXBsZVxuLy8gbG9naWNhbCBsaW5lcywgaWYgdGhvc2UgYXJlIGNvbm5lY3RlZCBieSBjb2xsYXBzZWQgcmFuZ2VzLlxuZnVuY3Rpb24gTGluZVZpZXcoZG9jLCBsaW5lLCBsaW5lTikge1xuICAvLyBUaGUgc3RhcnRpbmcgbGluZVxuICB0aGlzLmxpbmUgPSBsaW5lO1xuICAvLyBDb250aW51aW5nIGxpbmVzLCBpZiBhbnlcbiAgdGhpcy5yZXN0ID0gdmlzdWFsTGluZUNvbnRpbnVlZChsaW5lKTtcbiAgLy8gTnVtYmVyIG9mIGxvZ2ljYWwgbGluZXMgaW4gdGhpcyB2aXN1YWwgbGluZVxuICB0aGlzLnNpemUgPSB0aGlzLnJlc3QgPyBsaW5lTm8obHN0KHRoaXMucmVzdCkpIC0gbGluZU4gKyAxIDogMTtcbiAgdGhpcy5ub2RlID0gdGhpcy50ZXh0ID0gbnVsbDtcbiAgdGhpcy5oaWRkZW4gPSBsaW5lSXNIaWRkZW4oZG9jLCBsaW5lKTtcbn1cblxuLy8gQ3JlYXRlIGEgcmFuZ2Ugb2YgTGluZVZpZXcgb2JqZWN0cyBmb3IgdGhlIGdpdmVuIGxpbmVzLlxuZnVuY3Rpb24gYnVpbGRWaWV3QXJyYXkoY20sIGZyb20sIHRvKSB7XG4gIHZhciBhcnJheSA9IFtdLCBuZXh0UG9zO1xuICBmb3IgKHZhciBwb3MgPSBmcm9tOyBwb3MgPCB0bzsgcG9zID0gbmV4dFBvcykge1xuICAgIHZhciB2aWV3ID0gbmV3IExpbmVWaWV3KGNtLmRvYywgZ2V0TGluZShjbS5kb2MsIHBvcyksIHBvcyk7XG4gICAgbmV4dFBvcyA9IHBvcyArIHZpZXcuc2l6ZTtcbiAgICBhcnJheS5wdXNoKHZpZXcpO1xuICB9XG4gIHJldHVybiBhcnJheVxufVxuXG52YXIgb3BlcmF0aW9uR3JvdXAgPSBudWxsO1xuXG5mdW5jdGlvbiBwdXNoT3BlcmF0aW9uKG9wKSB7XG4gIGlmIChvcGVyYXRpb25Hcm91cCkge1xuICAgIG9wZXJhdGlvbkdyb3VwLm9wcy5wdXNoKG9wKTtcbiAgfSBlbHNlIHtcbiAgICBvcC5vd25zR3JvdXAgPSBvcGVyYXRpb25Hcm91cCA9IHtcbiAgICAgIG9wczogW29wXSxcbiAgICAgIGRlbGF5ZWRDYWxsYmFja3M6IFtdXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaXJlQ2FsbGJhY2tzRm9yT3BzKGdyb3VwKSB7XG4gIC8vIENhbGxzIGRlbGF5ZWQgY2FsbGJhY2tzIGFuZCBjdXJzb3JBY3Rpdml0eSBoYW5kbGVycyB1bnRpbCBub1xuICAvLyBuZXcgb25lcyBhcHBlYXJcbiAgdmFyIGNhbGxiYWNrcyA9IGdyb3VwLmRlbGF5ZWRDYWxsYmFja3MsIGkgPSAwO1xuICBkbyB7XG4gICAgZm9yICg7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspXG4gICAgICB7IGNhbGxiYWNrc1tpXS5jYWxsKG51bGwpOyB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBncm91cC5vcHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBvcCA9IGdyb3VwLm9wc1tqXTtcbiAgICAgIGlmIChvcC5jdXJzb3JBY3Rpdml0eUhhbmRsZXJzKVxuICAgICAgICB7IHdoaWxlIChvcC5jdXJzb3JBY3Rpdml0eUNhbGxlZCA8IG9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnMubGVuZ3RoKVxuICAgICAgICAgIHsgb3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVyc1tvcC5jdXJzb3JBY3Rpdml0eUNhbGxlZCsrXS5jYWxsKG51bGwsIG9wLmNtKTsgfSB9XG4gICAgfVxuICB9IHdoaWxlIChpIDwgY2FsbGJhY2tzLmxlbmd0aClcbn1cblxuZnVuY3Rpb24gZmluaXNoT3BlcmF0aW9uKG9wLCBlbmRDYikge1xuICB2YXIgZ3JvdXAgPSBvcC5vd25zR3JvdXA7XG4gIGlmICghZ3JvdXApIHsgcmV0dXJuIH1cblxuICB0cnkgeyBmaXJlQ2FsbGJhY2tzRm9yT3BzKGdyb3VwKTsgfVxuICBmaW5hbGx5IHtcbiAgICBvcGVyYXRpb25Hcm91cCA9IG51bGw7XG4gICAgZW5kQ2IoZ3JvdXApO1xuICB9XG59XG5cbnZhciBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzID0gbnVsbDtcblxuLy8gT2Z0ZW4sIHdlIHdhbnQgdG8gc2lnbmFsIGV2ZW50cyBhdCBhIHBvaW50IHdoZXJlIHdlIGFyZSBpbiB0aGVcbi8vIG1pZGRsZSBvZiBzb21lIHdvcmssIGJ1dCBkb24ndCB3YW50IHRoZSBoYW5kbGVyIHRvIHN0YXJ0IGNhbGxpbmdcbi8vIG90aGVyIG1ldGhvZHMgb24gdGhlIGVkaXRvciwgd2hpY2ggbWlnaHQgYmUgaW4gYW4gaW5jb25zaXN0ZW50XG4vLyBzdGF0ZSBvciBzaW1wbHkgbm90IGV4cGVjdCBhbnkgb3RoZXIgZXZlbnRzIHRvIGhhcHBlbi5cbi8vIHNpZ25hbExhdGVyIGxvb2tzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBoYW5kbGVycywgYW5kIHNjaGVkdWxlc1xuLy8gdGhlbSB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBsYXN0IG9wZXJhdGlvbiBlbmRzLCBvciwgaWYgbm9cbi8vIG9wZXJhdGlvbiBpcyBhY3RpdmUsIHdoZW4gYSB0aW1lb3V0IGZpcmVzLlxuZnVuY3Rpb24gc2lnbmFsTGF0ZXIoZW1pdHRlciwgdHlwZSAvKiwgdmFsdWVzLi4uKi8pIHtcbiAgdmFyIGFyciA9IGdldEhhbmRsZXJzKGVtaXR0ZXIsIHR5cGUpO1xuICBpZiAoIWFyci5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLCBsaXN0O1xuICBpZiAob3BlcmF0aW9uR3JvdXApIHtcbiAgICBsaXN0ID0gb3BlcmF0aW9uR3JvdXAuZGVsYXllZENhbGxiYWNrcztcbiAgfSBlbHNlIGlmIChvcnBoYW5EZWxheWVkQ2FsbGJhY2tzKSB7XG4gICAgbGlzdCA9IG9ycGhhbkRlbGF5ZWRDYWxsYmFja3M7XG4gIH0gZWxzZSB7XG4gICAgbGlzdCA9IG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MgPSBbXTtcbiAgICBzZXRUaW1lb3V0KGZpcmVPcnBoYW5EZWxheWVkLCAwKTtcbiAgfVxuICB2YXIgbG9vcCA9IGZ1bmN0aW9uICggaSApIHtcbiAgICBsaXN0LnB1c2goZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJyW2ldLmFwcGx5KG51bGwsIGFyZ3MpOyB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSlcbiAgICBsb29wKCBpICk7XG59XG5cbmZ1bmN0aW9uIGZpcmVPcnBoYW5EZWxheWVkKCkge1xuICB2YXIgZGVsYXllZCA9IG9ycGhhbkRlbGF5ZWRDYWxsYmFja3M7XG4gIG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MgPSBudWxsO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGF5ZWQubGVuZ3RoOyArK2kpIHsgZGVsYXllZFtpXSgpOyB9XG59XG5cbi8vIFdoZW4gYW4gYXNwZWN0IG9mIGEgbGluZSBjaGFuZ2VzLCBhIHN0cmluZyBpcyBhZGRlZCB0b1xuLy8gbGluZVZpZXcuY2hhbmdlcy4gVGhpcyB1cGRhdGVzIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBsaW5lJ3Ncbi8vIERPTSBzdHJ1Y3R1cmUuXG5mdW5jdGlvbiB1cGRhdGVMaW5lRm9yQ2hhbmdlcyhjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKSB7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgbGluZVZpZXcuY2hhbmdlcy5sZW5ndGg7IGorKykge1xuICAgIHZhciB0eXBlID0gbGluZVZpZXcuY2hhbmdlc1tqXTtcbiAgICBpZiAodHlwZSA9PSBcInRleHRcIikgeyB1cGRhdGVMaW5lVGV4dChjbSwgbGluZVZpZXcpOyB9XG4gICAgZWxzZSBpZiAodHlwZSA9PSBcImd1dHRlclwiKSB7IHVwZGF0ZUxpbmVHdXR0ZXIoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcyk7IH1cbiAgICBlbHNlIGlmICh0eXBlID09IFwiY2xhc3NcIikgeyB1cGRhdGVMaW5lQ2xhc3NlcyhjbSwgbGluZVZpZXcpOyB9XG4gICAgZWxzZSBpZiAodHlwZSA9PSBcIndpZGdldFwiKSB7IHVwZGF0ZUxpbmVXaWRnZXRzKGNtLCBsaW5lVmlldywgZGltcyk7IH1cbiAgfVxuICBsaW5lVmlldy5jaGFuZ2VzID0gbnVsbDtcbn1cblxuLy8gTGluZXMgd2l0aCBndXR0ZXIgZWxlbWVudHMsIHdpZGdldHMgb3IgYSBiYWNrZ3JvdW5kIGNsYXNzIG5lZWQgdG9cbi8vIGJlIHdyYXBwZWQsIGFuZCBoYXZlIHRoZSBleHRyYSBlbGVtZW50cyBhZGRlZCB0byB0aGUgd3JhcHBlciBkaXZcbmZ1bmN0aW9uIGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KSB7XG4gIGlmIChsaW5lVmlldy5ub2RlID09IGxpbmVWaWV3LnRleHQpIHtcbiAgICBsaW5lVmlldy5ub2RlID0gZWx0KFwiZGl2XCIsIG51bGwsIG51bGwsIFwicG9zaXRpb246IHJlbGF0aXZlXCIpO1xuICAgIGlmIChsaW5lVmlldy50ZXh0LnBhcmVudE5vZGUpXG4gICAgICB7IGxpbmVWaWV3LnRleHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobGluZVZpZXcubm9kZSwgbGluZVZpZXcudGV4dCk7IH1cbiAgICBsaW5lVmlldy5ub2RlLmFwcGVuZENoaWxkKGxpbmVWaWV3LnRleHQpO1xuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOCkgeyBsaW5lVmlldy5ub2RlLnN0eWxlLnpJbmRleCA9IDI7IH1cbiAgfVxuICByZXR1cm4gbGluZVZpZXcubm9kZVxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaW5lQmFja2dyb3VuZChjbSwgbGluZVZpZXcpIHtcbiAgdmFyIGNscyA9IGxpbmVWaWV3LmJnQ2xhc3MgPyBsaW5lVmlldy5iZ0NsYXNzICsgXCIgXCIgKyAobGluZVZpZXcubGluZS5iZ0NsYXNzIHx8IFwiXCIpIDogbGluZVZpZXcubGluZS5iZ0NsYXNzO1xuICBpZiAoY2xzKSB7IGNscyArPSBcIiBDb2RlTWlycm9yLWxpbmViYWNrZ3JvdW5kXCI7IH1cbiAgaWYgKGxpbmVWaWV3LmJhY2tncm91bmQpIHtcbiAgICBpZiAoY2xzKSB7IGxpbmVWaWV3LmJhY2tncm91bmQuY2xhc3NOYW1lID0gY2xzOyB9XG4gICAgZWxzZSB7IGxpbmVWaWV3LmJhY2tncm91bmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5lVmlldy5iYWNrZ3JvdW5kKTsgbGluZVZpZXcuYmFja2dyb3VuZCA9IG51bGw7IH1cbiAgfSBlbHNlIGlmIChjbHMpIHtcbiAgICB2YXIgd3JhcCA9IGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KTtcbiAgICBsaW5lVmlldy5iYWNrZ3JvdW5kID0gd3JhcC5pbnNlcnRCZWZvcmUoZWx0KFwiZGl2XCIsIG51bGwsIGNscyksIHdyYXAuZmlyc3RDaGlsZCk7XG4gICAgY20uZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKGxpbmVWaWV3LmJhY2tncm91bmQpO1xuICB9XG59XG5cbi8vIFdyYXBwZXIgYXJvdW5kIGJ1aWxkTGluZUNvbnRlbnQgd2hpY2ggd2lsbCByZXVzZSB0aGUgc3RydWN0dXJlXG4vLyBpbiBkaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgd2hlbiBwb3NzaWJsZS5cbmZ1bmN0aW9uIGdldExpbmVDb250ZW50KGNtLCBsaW5lVmlldykge1xuICB2YXIgZXh0ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkO1xuICBpZiAoZXh0ICYmIGV4dC5saW5lID09IGxpbmVWaWV3LmxpbmUpIHtcbiAgICBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBudWxsO1xuICAgIGxpbmVWaWV3Lm1lYXN1cmUgPSBleHQubWVhc3VyZTtcbiAgICByZXR1cm4gZXh0LmJ1aWx0XG4gIH1cbiAgcmV0dXJuIGJ1aWxkTGluZUNvbnRlbnQoY20sIGxpbmVWaWV3KVxufVxuXG4vLyBSZWRyYXcgdGhlIGxpbmUncyB0ZXh0LiBJbnRlcmFjdHMgd2l0aCB0aGUgYmFja2dyb3VuZCBhbmQgdGV4dFxuLy8gY2xhc3NlcyBiZWNhdXNlIHRoZSBtb2RlIG1heSBvdXRwdXQgdG9rZW5zIHRoYXQgaW5mbHVlbmNlIHRoZXNlXG4vLyBjbGFzc2VzLlxuZnVuY3Rpb24gdXBkYXRlTGluZVRleHQoY20sIGxpbmVWaWV3KSB7XG4gIHZhciBjbHMgPSBsaW5lVmlldy50ZXh0LmNsYXNzTmFtZTtcbiAgdmFyIGJ1aWx0ID0gZ2V0TGluZUNvbnRlbnQoY20sIGxpbmVWaWV3KTtcbiAgaWYgKGxpbmVWaWV3LnRleHQgPT0gbGluZVZpZXcubm9kZSkgeyBsaW5lVmlldy5ub2RlID0gYnVpbHQucHJlOyB9XG4gIGxpbmVWaWV3LnRleHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYnVpbHQucHJlLCBsaW5lVmlldy50ZXh0KTtcbiAgbGluZVZpZXcudGV4dCA9IGJ1aWx0LnByZTtcbiAgaWYgKGJ1aWx0LmJnQ2xhc3MgIT0gbGluZVZpZXcuYmdDbGFzcyB8fCBidWlsdC50ZXh0Q2xhc3MgIT0gbGluZVZpZXcudGV4dENsYXNzKSB7XG4gICAgbGluZVZpZXcuYmdDbGFzcyA9IGJ1aWx0LmJnQ2xhc3M7XG4gICAgbGluZVZpZXcudGV4dENsYXNzID0gYnVpbHQudGV4dENsYXNzO1xuICAgIHVwZGF0ZUxpbmVDbGFzc2VzKGNtLCBsaW5lVmlldyk7XG4gIH0gZWxzZSBpZiAoY2xzKSB7XG4gICAgbGluZVZpZXcudGV4dC5jbGFzc05hbWUgPSBjbHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTGluZUNsYXNzZXMoY20sIGxpbmVWaWV3KSB7XG4gIHVwZGF0ZUxpbmVCYWNrZ3JvdW5kKGNtLCBsaW5lVmlldyk7XG4gIGlmIChsaW5lVmlldy5saW5lLndyYXBDbGFzcylcbiAgICB7IGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KS5jbGFzc05hbWUgPSBsaW5lVmlldy5saW5lLndyYXBDbGFzczsgfVxuICBlbHNlIGlmIChsaW5lVmlldy5ub2RlICE9IGxpbmVWaWV3LnRleHQpXG4gICAgeyBsaW5lVmlldy5ub2RlLmNsYXNzTmFtZSA9IFwiXCI7IH1cbiAgdmFyIHRleHRDbGFzcyA9IGxpbmVWaWV3LnRleHRDbGFzcyA/IGxpbmVWaWV3LnRleHRDbGFzcyArIFwiIFwiICsgKGxpbmVWaWV3LmxpbmUudGV4dENsYXNzIHx8IFwiXCIpIDogbGluZVZpZXcubGluZS50ZXh0Q2xhc3M7XG4gIGxpbmVWaWV3LnRleHQuY2xhc3NOYW1lID0gdGV4dENsYXNzIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxpbmVHdXR0ZXIoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcykge1xuICBpZiAobGluZVZpZXcuZ3V0dGVyKSB7XG4gICAgbGluZVZpZXcubm9kZS5yZW1vdmVDaGlsZChsaW5lVmlldy5ndXR0ZXIpO1xuICAgIGxpbmVWaWV3Lmd1dHRlciA9IG51bGw7XG4gIH1cbiAgaWYgKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQpIHtcbiAgICBsaW5lVmlldy5ub2RlLnJlbW92ZUNoaWxkKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQpO1xuICAgIGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQgPSBudWxsO1xuICB9XG4gIGlmIChsaW5lVmlldy5saW5lLmd1dHRlckNsYXNzKSB7XG4gICAgdmFyIHdyYXAgPSBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldyk7XG4gICAgbGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZCA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItZ3V0dGVyLWJhY2tncm91bmQgXCIgKyBsaW5lVmlldy5saW5lLmd1dHRlckNsYXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwibGVmdDogXCIgKyAoY20ub3B0aW9ucy5maXhlZEd1dHRlciA/IGRpbXMuZml4ZWRQb3MgOiAtZGltcy5ndXR0ZXJUb3RhbFdpZHRoKSArIFwicHg7IHdpZHRoOiBcIiArIChkaW1zLmd1dHRlclRvdGFsV2lkdGgpICsgXCJweFwiKSk7XG4gICAgY20uZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQpO1xuICAgIHdyYXAuaW5zZXJ0QmVmb3JlKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQsIGxpbmVWaWV3LnRleHQpO1xuICB9XG4gIHZhciBtYXJrZXJzID0gbGluZVZpZXcubGluZS5ndXR0ZXJNYXJrZXJzO1xuICBpZiAoY20ub3B0aW9ucy5saW5lTnVtYmVycyB8fCBtYXJrZXJzKSB7XG4gICAgdmFyIHdyYXAkMSA9IGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KTtcbiAgICB2YXIgZ3V0dGVyV3JhcCA9IGxpbmVWaWV3Lmd1dHRlciA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItZ3V0dGVyLXdyYXBwZXJcIiwgKFwibGVmdDogXCIgKyAoY20ub3B0aW9ucy5maXhlZEd1dHRlciA/IGRpbXMuZml4ZWRQb3MgOiAtZGltcy5ndXR0ZXJUb3RhbFdpZHRoKSArIFwicHhcIikpO1xuICAgIGNtLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShndXR0ZXJXcmFwKTtcbiAgICB3cmFwJDEuaW5zZXJ0QmVmb3JlKGd1dHRlcldyYXAsIGxpbmVWaWV3LnRleHQpO1xuICAgIGlmIChsaW5lVmlldy5saW5lLmd1dHRlckNsYXNzKVxuICAgICAgeyBndXR0ZXJXcmFwLmNsYXNzTmFtZSArPSBcIiBcIiArIGxpbmVWaWV3LmxpbmUuZ3V0dGVyQ2xhc3M7IH1cbiAgICBpZiAoY20ub3B0aW9ucy5saW5lTnVtYmVycyAmJiAoIW1hcmtlcnMgfHwgIW1hcmtlcnNbXCJDb2RlTWlycm9yLWxpbmVudW1iZXJzXCJdKSlcbiAgICAgIHsgbGluZVZpZXcubGluZU51bWJlciA9IGd1dHRlcldyYXAuYXBwZW5kQ2hpbGQoXG4gICAgICAgIGVsdChcImRpdlwiLCBsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGxpbmVOKSxcbiAgICAgICAgICAgIFwiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdFwiLFxuICAgICAgICAgICAgKFwibGVmdDogXCIgKyAoZGltcy5ndXR0ZXJMZWZ0W1wiQ29kZU1pcnJvci1saW5lbnVtYmVyc1wiXSkgKyBcInB4OyB3aWR0aDogXCIgKyAoY20uZGlzcGxheS5saW5lTnVtSW5uZXJXaWR0aCkgKyBcInB4XCIpKSk7IH1cbiAgICBpZiAobWFya2VycykgeyBmb3IgKHZhciBrID0gMDsgayA8IGNtLm9wdGlvbnMuZ3V0dGVycy5sZW5ndGg7ICsraykge1xuICAgICAgdmFyIGlkID0gY20ub3B0aW9ucy5ndXR0ZXJzW2tdLCBmb3VuZCA9IG1hcmtlcnMuaGFzT3duUHJvcGVydHkoaWQpICYmIG1hcmtlcnNbaWRdO1xuICAgICAgaWYgKGZvdW5kKVxuICAgICAgICB7IGd1dHRlcldyYXAuYXBwZW5kQ2hpbGQoZWx0KFwiZGl2XCIsIFtmb3VuZF0sIFwiQ29kZU1pcnJvci1ndXR0ZXItZWx0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcImxlZnQ6IFwiICsgKGRpbXMuZ3V0dGVyTGVmdFtpZF0pICsgXCJweDsgd2lkdGg6IFwiICsgKGRpbXMuZ3V0dGVyV2lkdGhbaWRdKSArIFwicHhcIikpKTsgfVxuICAgIH0gfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxpbmVXaWRnZXRzKGNtLCBsaW5lVmlldywgZGltcykge1xuICBpZiAobGluZVZpZXcuYWxpZ25hYmxlKSB7IGxpbmVWaWV3LmFsaWduYWJsZSA9IG51bGw7IH1cbiAgZm9yICh2YXIgbm9kZSA9IGxpbmVWaWV3Lm5vZGUuZmlyc3RDaGlsZCwgbmV4dCA9ICh2b2lkIDApOyBub2RlOyBub2RlID0gbmV4dCkge1xuICAgIG5leHQgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIGlmIChub2RlLmNsYXNzTmFtZSA9PSBcIkNvZGVNaXJyb3ItbGluZXdpZGdldFwiKVxuICAgICAgeyBsaW5lVmlldy5ub2RlLnJlbW92ZUNoaWxkKG5vZGUpOyB9XG4gIH1cbiAgaW5zZXJ0TGluZVdpZGdldHMoY20sIGxpbmVWaWV3LCBkaW1zKTtcbn1cblxuLy8gQnVpbGQgYSBsaW5lJ3MgRE9NIHJlcHJlc2VudGF0aW9uIGZyb20gc2NyYXRjaFxuZnVuY3Rpb24gYnVpbGRMaW5lRWxlbWVudChjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKSB7XG4gIHZhciBidWlsdCA9IGdldExpbmVDb250ZW50KGNtLCBsaW5lVmlldyk7XG4gIGxpbmVWaWV3LnRleHQgPSBsaW5lVmlldy5ub2RlID0gYnVpbHQucHJlO1xuICBpZiAoYnVpbHQuYmdDbGFzcykgeyBsaW5lVmlldy5iZ0NsYXNzID0gYnVpbHQuYmdDbGFzczsgfVxuICBpZiAoYnVpbHQudGV4dENsYXNzKSB7IGxpbmVWaWV3LnRleHRDbGFzcyA9IGJ1aWx0LnRleHRDbGFzczsgfVxuXG4gIHVwZGF0ZUxpbmVDbGFzc2VzKGNtLCBsaW5lVmlldyk7XG4gIHVwZGF0ZUxpbmVHdXR0ZXIoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcyk7XG4gIGluc2VydExpbmVXaWRnZXRzKGNtLCBsaW5lVmlldywgZGltcyk7XG4gIHJldHVybiBsaW5lVmlldy5ub2RlXG59XG5cbi8vIEEgbGluZVZpZXcgbWF5IGNvbnRhaW4gbXVsdGlwbGUgbG9naWNhbCBsaW5lcyAod2hlbiBtZXJnZWQgYnlcbi8vIGNvbGxhcHNlZCBzcGFucykuIFRoZSB3aWRnZXRzIGZvciBhbGwgb2YgdGhlbSBuZWVkIHRvIGJlIGRyYXduLlxuZnVuY3Rpb24gaW5zZXJ0TGluZVdpZGdldHMoY20sIGxpbmVWaWV3LCBkaW1zKSB7XG4gIGluc2VydExpbmVXaWRnZXRzRm9yKGNtLCBsaW5lVmlldy5saW5lLCBsaW5lVmlldywgZGltcywgdHJ1ZSk7XG4gIGlmIChsaW5lVmlldy5yZXN0KSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVZpZXcucmVzdC5sZW5ndGg7IGkrKylcbiAgICB7IGluc2VydExpbmVXaWRnZXRzRm9yKGNtLCBsaW5lVmlldy5yZXN0W2ldLCBsaW5lVmlldywgZGltcywgZmFsc2UpOyB9IH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0TGluZVdpZGdldHNGb3IoY20sIGxpbmUsIGxpbmVWaWV3LCBkaW1zLCBhbGxvd0Fib3ZlKSB7XG4gIGlmICghbGluZS53aWRnZXRzKSB7IHJldHVybiB9XG4gIHZhciB3cmFwID0gZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpO1xuICBmb3IgKHZhciBpID0gMCwgd3MgPSBsaW5lLndpZGdldHM7IGkgPCB3cy5sZW5ndGg7ICsraSkge1xuICAgIHZhciB3aWRnZXQgPSB3c1tpXSwgbm9kZSA9IGVsdChcImRpdlwiLCBbd2lkZ2V0Lm5vZGVdLCBcIkNvZGVNaXJyb3ItbGluZXdpZGdldFwiKTtcbiAgICBpZiAoIXdpZGdldC5oYW5kbGVNb3VzZUV2ZW50cykgeyBub2RlLnNldEF0dHJpYnV0ZShcImNtLWlnbm9yZS1ldmVudHNcIiwgXCJ0cnVlXCIpOyB9XG4gICAgcG9zaXRpb25MaW5lV2lkZ2V0KHdpZGdldCwgbm9kZSwgbGluZVZpZXcsIGRpbXMpO1xuICAgIGNtLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShub2RlKTtcbiAgICBpZiAoYWxsb3dBYm92ZSAmJiB3aWRnZXQuYWJvdmUpXG4gICAgICB7IHdyYXAuaW5zZXJ0QmVmb3JlKG5vZGUsIGxpbmVWaWV3Lmd1dHRlciB8fCBsaW5lVmlldy50ZXh0KTsgfVxuICAgIGVsc2VcbiAgICAgIHsgd3JhcC5hcHBlbmRDaGlsZChub2RlKTsgfVxuICAgIHNpZ25hbExhdGVyKHdpZGdldCwgXCJyZWRyYXdcIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9zaXRpb25MaW5lV2lkZ2V0KHdpZGdldCwgbm9kZSwgbGluZVZpZXcsIGRpbXMpIHtcbiAgaWYgKHdpZGdldC5ub0hTY3JvbGwpIHtcbiAgICAobGluZVZpZXcuYWxpZ25hYmxlIHx8IChsaW5lVmlldy5hbGlnbmFibGUgPSBbXSkpLnB1c2gobm9kZSk7XG4gICAgdmFyIHdpZHRoID0gZGltcy53cmFwcGVyV2lkdGg7XG4gICAgbm9kZS5zdHlsZS5sZWZ0ID0gZGltcy5maXhlZFBvcyArIFwicHhcIjtcbiAgICBpZiAoIXdpZGdldC5jb3Zlckd1dHRlcikge1xuICAgICAgd2lkdGggLT0gZGltcy5ndXR0ZXJUb3RhbFdpZHRoO1xuICAgICAgbm9kZS5zdHlsZS5wYWRkaW5nTGVmdCA9IGRpbXMuZ3V0dGVyVG90YWxXaWR0aCArIFwicHhcIjtcbiAgICB9XG4gICAgbm9kZS5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuICB9XG4gIGlmICh3aWRnZXQuY292ZXJHdXR0ZXIpIHtcbiAgICBub2RlLnN0eWxlLnpJbmRleCA9IDU7XG4gICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICBpZiAoIXdpZGdldC5ub0hTY3JvbGwpIHsgbm9kZS5zdHlsZS5tYXJnaW5MZWZ0ID0gLWRpbXMuZ3V0dGVyVG90YWxXaWR0aCArIFwicHhcIjsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdpZGdldEhlaWdodCh3aWRnZXQpIHtcbiAgaWYgKHdpZGdldC5oZWlnaHQgIT0gbnVsbCkgeyByZXR1cm4gd2lkZ2V0LmhlaWdodCB9XG4gIHZhciBjbSA9IHdpZGdldC5kb2MuY207XG4gIGlmICghY20pIHsgcmV0dXJuIDAgfVxuICBpZiAoIWNvbnRhaW5zKGRvY3VtZW50LmJvZHksIHdpZGdldC5ub2RlKSkge1xuICAgIHZhciBwYXJlbnRTdHlsZSA9IFwicG9zaXRpb246IHJlbGF0aXZlO1wiO1xuICAgIGlmICh3aWRnZXQuY292ZXJHdXR0ZXIpXG4gICAgICB7IHBhcmVudFN0eWxlICs9IFwibWFyZ2luLWxlZnQ6IC1cIiArIGNtLmRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aCArIFwicHg7XCI7IH1cbiAgICBpZiAod2lkZ2V0Lm5vSFNjcm9sbClcbiAgICAgIHsgcGFyZW50U3R5bGUgKz0gXCJ3aWR0aDogXCIgKyBjbS5kaXNwbGF5LndyYXBwZXIuY2xpZW50V2lkdGggKyBcInB4O1wiOyB9XG4gICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoY20uZGlzcGxheS5tZWFzdXJlLCBlbHQoXCJkaXZcIiwgW3dpZGdldC5ub2RlXSwgbnVsbCwgcGFyZW50U3R5bGUpKTtcbiAgfVxuICByZXR1cm4gd2lkZ2V0LmhlaWdodCA9IHdpZGdldC5ub2RlLnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0XG59XG5cbi8vIFJldHVybiB0cnVlIHdoZW4gdGhlIGdpdmVuIG1vdXNlIGV2ZW50IGhhcHBlbmVkIGluIGEgd2lkZ2V0XG5mdW5jdGlvbiBldmVudEluV2lkZ2V0KGRpc3BsYXksIGUpIHtcbiAgZm9yICh2YXIgbiA9IGVfdGFyZ2V0KGUpOyBuICE9IGRpc3BsYXkud3JhcHBlcjsgbiA9IG4ucGFyZW50Tm9kZSkge1xuICAgIGlmICghbiB8fCAobi5ub2RlVHlwZSA9PSAxICYmIG4uZ2V0QXR0cmlidXRlKFwiY20taWdub3JlLWV2ZW50c1wiKSA9PSBcInRydWVcIikgfHxcbiAgICAgICAgKG4ucGFyZW50Tm9kZSA9PSBkaXNwbGF5LnNpemVyICYmIG4gIT0gZGlzcGxheS5tb3ZlcikpXG4gICAgICB7IHJldHVybiB0cnVlIH1cbiAgfVxufVxuXG4vLyBQT1NJVElPTiBNRUFTVVJFTUVOVFxuXG5mdW5jdGlvbiBwYWRkaW5nVG9wKGRpc3BsYXkpIHtyZXR1cm4gZGlzcGxheS5saW5lU3BhY2Uub2Zmc2V0VG9wfVxuZnVuY3Rpb24gcGFkZGluZ1ZlcnQoZGlzcGxheSkge3JldHVybiBkaXNwbGF5Lm1vdmVyLm9mZnNldEhlaWdodCAtIGRpc3BsYXkubGluZVNwYWNlLm9mZnNldEhlaWdodH1cbmZ1bmN0aW9uIHBhZGRpbmdIKGRpc3BsYXkpIHtcbiAgaWYgKGRpc3BsYXkuY2FjaGVkUGFkZGluZ0gpIHsgcmV0dXJuIGRpc3BsYXkuY2FjaGVkUGFkZGluZ0ggfVxuICB2YXIgZSA9IHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkubWVhc3VyZSwgZWx0KFwicHJlXCIsIFwieFwiKSk7XG4gIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlID8gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkgOiBlLmN1cnJlbnRTdHlsZTtcbiAgdmFyIGRhdGEgPSB7bGVmdDogcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQpLCByaWdodDogcGFyc2VJbnQoc3R5bGUucGFkZGluZ1JpZ2h0KX07XG4gIGlmICghaXNOYU4oZGF0YS5sZWZ0KSAmJiAhaXNOYU4oZGF0YS5yaWdodCkpIHsgZGlzcGxheS5jYWNoZWRQYWRkaW5nSCA9IGRhdGE7IH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuZnVuY3Rpb24gc2Nyb2xsR2FwKGNtKSB7IHJldHVybiBzY3JvbGxlckdhcCAtIGNtLmRpc3BsYXkubmF0aXZlQmFyV2lkdGggfVxuZnVuY3Rpb24gZGlzcGxheVdpZHRoKGNtKSB7XG4gIHJldHVybiBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoIC0gc2Nyb2xsR2FwKGNtKSAtIGNtLmRpc3BsYXkuYmFyV2lkdGhcbn1cbmZ1bmN0aW9uIGRpc3BsYXlIZWlnaHQoY20pIHtcbiAgcmV0dXJuIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0IC0gc2Nyb2xsR2FwKGNtKSAtIGNtLmRpc3BsYXkuYmFySGVpZ2h0XG59XG5cbi8vIEVuc3VyZSB0aGUgbGluZVZpZXcud3JhcHBpbmcuaGVpZ2h0cyBhcnJheSBpcyBwb3B1bGF0ZWQuIFRoaXMgaXNcbi8vIGFuIGFycmF5IG9mIGJvdHRvbSBvZmZzZXRzIGZvciB0aGUgbGluZXMgdGhhdCBtYWtlIHVwIGEgZHJhd25cbi8vIGxpbmUuIFdoZW4gbGluZVdyYXBwaW5nIGlzIG9uLCB0aGVyZSBtaWdodCBiZSBtb3JlIHRoYW4gb25lXG4vLyBoZWlnaHQuXG5mdW5jdGlvbiBlbnN1cmVMaW5lSGVpZ2h0cyhjbSwgbGluZVZpZXcsIHJlY3QpIHtcbiAgdmFyIHdyYXBwaW5nID0gY20ub3B0aW9ucy5saW5lV3JhcHBpbmc7XG4gIHZhciBjdXJXaWR0aCA9IHdyYXBwaW5nICYmIGRpc3BsYXlXaWR0aChjbSk7XG4gIGlmICghbGluZVZpZXcubWVhc3VyZS5oZWlnaHRzIHx8IHdyYXBwaW5nICYmIGxpbmVWaWV3Lm1lYXN1cmUud2lkdGggIT0gY3VyV2lkdGgpIHtcbiAgICB2YXIgaGVpZ2h0cyA9IGxpbmVWaWV3Lm1lYXN1cmUuaGVpZ2h0cyA9IFtdO1xuICAgIGlmICh3cmFwcGluZykge1xuICAgICAgbGluZVZpZXcubWVhc3VyZS53aWR0aCA9IGN1cldpZHRoO1xuICAgICAgdmFyIHJlY3RzID0gbGluZVZpZXcudGV4dC5maXJzdENoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICB2YXIgY3VyID0gcmVjdHNbaV0sIG5leHQgPSByZWN0c1tpICsgMV07XG4gICAgICAgIGlmIChNYXRoLmFicyhjdXIuYm90dG9tIC0gbmV4dC5ib3R0b20pID4gMilcbiAgICAgICAgICB7IGhlaWdodHMucHVzaCgoY3VyLmJvdHRvbSArIG5leHQudG9wKSAvIDIgLSByZWN0LnRvcCk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgaGVpZ2h0cy5wdXNoKHJlY3QuYm90dG9tIC0gcmVjdC50b3ApO1xuICB9XG59XG5cbi8vIEZpbmQgYSBsaW5lIG1hcCAobWFwcGluZyBjaGFyYWN0ZXIgb2Zmc2V0cyB0byB0ZXh0IG5vZGVzKSBhbmQgYVxuLy8gbWVhc3VyZW1lbnQgY2FjaGUgZm9yIHRoZSBnaXZlbiBsaW5lIG51bWJlci4gKEEgbGluZSB2aWV3IG1pZ2h0XG4vLyBjb250YWluIG11bHRpcGxlIGxpbmVzIHdoZW4gY29sbGFwc2VkIHJhbmdlcyBhcmUgcHJlc2VudC4pXG5mdW5jdGlvbiBtYXBGcm9tTGluZVZpZXcobGluZVZpZXcsIGxpbmUsIGxpbmVOKSB7XG4gIGlmIChsaW5lVmlldy5saW5lID09IGxpbmUpXG4gICAgeyByZXR1cm4ge21hcDogbGluZVZpZXcubWVhc3VyZS5tYXAsIGNhY2hlOiBsaW5lVmlldy5tZWFzdXJlLmNhY2hlfSB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVZpZXcucmVzdC5sZW5ndGg7IGkrKylcbiAgICB7IGlmIChsaW5lVmlldy5yZXN0W2ldID09IGxpbmUpXG4gICAgICB7IHJldHVybiB7bWFwOiBsaW5lVmlldy5tZWFzdXJlLm1hcHNbaV0sIGNhY2hlOiBsaW5lVmlldy5tZWFzdXJlLmNhY2hlc1tpXX0gfSB9XG4gIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGxpbmVWaWV3LnJlc3QubGVuZ3RoOyBpJDErKylcbiAgICB7IGlmIChsaW5lTm8obGluZVZpZXcucmVzdFtpJDFdKSA+IGxpbmVOKVxuICAgICAgeyByZXR1cm4ge21hcDogbGluZVZpZXcubWVhc3VyZS5tYXBzW2kkMV0sIGNhY2hlOiBsaW5lVmlldy5tZWFzdXJlLmNhY2hlc1tpJDFdLCBiZWZvcmU6IHRydWV9IH0gfVxufVxuXG4vLyBSZW5kZXIgYSBsaW5lIGludG8gdGhlIGhpZGRlbiBub2RlIGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZC4gVXNlZFxuLy8gd2hlbiBtZWFzdXJlbWVudCBpcyBuZWVkZWQgZm9yIGEgbGluZSB0aGF0J3Mgbm90IGluIHRoZSB2aWV3cG9ydC5cbmZ1bmN0aW9uIHVwZGF0ZUV4dGVybmFsTWVhc3VyZW1lbnQoY20sIGxpbmUpIHtcbiAgbGluZSA9IHZpc3VhbExpbmUobGluZSk7XG4gIHZhciBsaW5lTiA9IGxpbmVObyhsaW5lKTtcbiAgdmFyIHZpZXcgPSBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBuZXcgTGluZVZpZXcoY20uZG9jLCBsaW5lLCBsaW5lTik7XG4gIHZpZXcubGluZU4gPSBsaW5lTjtcbiAgdmFyIGJ1aWx0ID0gdmlldy5idWlsdCA9IGJ1aWxkTGluZUNvbnRlbnQoY20sIHZpZXcpO1xuICB2aWV3LnRleHQgPSBidWlsdC5wcmU7XG4gIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGNtLmRpc3BsYXkubGluZU1lYXN1cmUsIGJ1aWx0LnByZSk7XG4gIHJldHVybiB2aWV3XG59XG5cbi8vIEdldCBhIHt0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHR9IGJveCAoaW4gbGluZS1sb2NhbCBjb29yZGluYXRlcylcbi8vIGZvciBhIGdpdmVuIGNoYXJhY3Rlci5cbmZ1bmN0aW9uIG1lYXN1cmVDaGFyKGNtLCBsaW5lLCBjaCwgYmlhcykge1xuICByZXR1cm4gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lKSwgY2gsIGJpYXMpXG59XG5cbi8vIEZpbmQgYSBsaW5lIHZpZXcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gbGluZSBudW1iZXIuXG5mdW5jdGlvbiBmaW5kVmlld0ZvckxpbmUoY20sIGxpbmVOKSB7XG4gIGlmIChsaW5lTiA+PSBjbS5kaXNwbGF5LnZpZXdGcm9tICYmIGxpbmVOIDwgY20uZGlzcGxheS52aWV3VG8pXG4gICAgeyByZXR1cm4gY20uZGlzcGxheS52aWV3W2ZpbmRWaWV3SW5kZXgoY20sIGxpbmVOKV0gfVxuICB2YXIgZXh0ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkO1xuICBpZiAoZXh0ICYmIGxpbmVOID49IGV4dC5saW5lTiAmJiBsaW5lTiA8IGV4dC5saW5lTiArIGV4dC5zaXplKVxuICAgIHsgcmV0dXJuIGV4dCB9XG59XG5cbi8vIE1lYXN1cmVtZW50IGNhbiBiZSBzcGxpdCBpbiB0d28gc3RlcHMsIHRoZSBzZXQtdXAgd29yayB0aGF0XG4vLyBhcHBsaWVzIHRvIHRoZSB3aG9sZSBsaW5lLCBhbmQgdGhlIG1lYXN1cmVtZW50IG9mIHRoZSBhY3R1YWxcbi8vIGNoYXJhY3Rlci4gRnVuY3Rpb25zIGxpa2UgY29vcmRzQ2hhciwgdGhhdCBuZWVkIHRvIGRvIGEgbG90IG9mXG4vLyBtZWFzdXJlbWVudHMgaW4gYSByb3csIGNhbiB0aHVzIGVuc3VyZSB0aGF0IHRoZSBzZXQtdXAgd29yayBpc1xuLy8gb25seSBkb25lIG9uY2UuXG5mdW5jdGlvbiBwcmVwYXJlTWVhc3VyZUZvckxpbmUoY20sIGxpbmUpIHtcbiAgdmFyIGxpbmVOID0gbGluZU5vKGxpbmUpO1xuICB2YXIgdmlldyA9IGZpbmRWaWV3Rm9yTGluZShjbSwgbGluZU4pO1xuICBpZiAodmlldyAmJiAhdmlldy50ZXh0KSB7XG4gICAgdmlldyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodmlldyAmJiB2aWV3LmNoYW5nZXMpIHtcbiAgICB1cGRhdGVMaW5lRm9yQ2hhbmdlcyhjbSwgdmlldywgbGluZU4sIGdldERpbWVuc2lvbnMoY20pKTtcbiAgICBjbS5jdXJPcC5mb3JjZVVwZGF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCF2aWV3KVxuICAgIHsgdmlldyA9IHVwZGF0ZUV4dGVybmFsTWVhc3VyZW1lbnQoY20sIGxpbmUpOyB9XG5cbiAgdmFyIGluZm8gPSBtYXBGcm9tTGluZVZpZXcodmlldywgbGluZSwgbGluZU4pO1xuICByZXR1cm4ge1xuICAgIGxpbmU6IGxpbmUsIHZpZXc6IHZpZXcsIHJlY3Q6IG51bGwsXG4gICAgbWFwOiBpbmZvLm1hcCwgY2FjaGU6IGluZm8uY2FjaGUsIGJlZm9yZTogaW5mby5iZWZvcmUsXG4gICAgaGFzSGVpZ2h0czogZmFsc2VcbiAgfVxufVxuXG4vLyBHaXZlbiBhIHByZXBhcmVkIG1lYXN1cmVtZW50IG9iamVjdCwgbWVhc3VyZXMgdGhlIHBvc2l0aW9uIG9mIGFuXG4vLyBhY3R1YWwgY2hhcmFjdGVyIChvciBmZXRjaGVzIGl0IGZyb20gdGhlIGNhY2hlKS5cbmZ1bmN0aW9uIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkLCBjaCwgYmlhcywgdmFySGVpZ2h0KSB7XG4gIGlmIChwcmVwYXJlZC5iZWZvcmUpIHsgY2ggPSAtMTsgfVxuICB2YXIga2V5ID0gY2ggKyAoYmlhcyB8fCBcIlwiKSwgZm91bmQ7XG4gIGlmIChwcmVwYXJlZC5jYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgZm91bmQgPSBwcmVwYXJlZC5jYWNoZVtrZXldO1xuICB9IGVsc2Uge1xuICAgIGlmICghcHJlcGFyZWQucmVjdClcbiAgICAgIHsgcHJlcGFyZWQucmVjdCA9IHByZXBhcmVkLnZpZXcudGV4dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgfVxuICAgIGlmICghcHJlcGFyZWQuaGFzSGVpZ2h0cykge1xuICAgICAgZW5zdXJlTGluZUhlaWdodHMoY20sIHByZXBhcmVkLnZpZXcsIHByZXBhcmVkLnJlY3QpO1xuICAgICAgcHJlcGFyZWQuaGFzSGVpZ2h0cyA9IHRydWU7XG4gICAgfVxuICAgIGZvdW5kID0gbWVhc3VyZUNoYXJJbm5lcihjbSwgcHJlcGFyZWQsIGNoLCBiaWFzKTtcbiAgICBpZiAoIWZvdW5kLmJvZ3VzKSB7IHByZXBhcmVkLmNhY2hlW2tleV0gPSBmb3VuZDsgfVxuICB9XG4gIHJldHVybiB7bGVmdDogZm91bmQubGVmdCwgcmlnaHQ6IGZvdW5kLnJpZ2h0LFxuICAgICAgICAgIHRvcDogdmFySGVpZ2h0ID8gZm91bmQucnRvcCA6IGZvdW5kLnRvcCxcbiAgICAgICAgICBib3R0b206IHZhckhlaWdodCA/IGZvdW5kLnJib3R0b20gOiBmb3VuZC5ib3R0b219XG59XG5cbnZhciBudWxsUmVjdCA9IHtsZWZ0OiAwLCByaWdodDogMCwgdG9wOiAwLCBib3R0b206IDB9O1xuXG5mdW5jdGlvbiBub2RlQW5kT2Zmc2V0SW5MaW5lTWFwKG1hcCQkMSwgY2gsIGJpYXMpIHtcbiAgdmFyIG5vZGUsIHN0YXJ0LCBlbmQsIGNvbGxhcHNlLCBtU3RhcnQsIG1FbmQ7XG4gIC8vIEZpcnN0LCBzZWFyY2ggdGhlIGxpbmUgbWFwIGZvciB0aGUgdGV4dCBub2RlIGNvcnJlc3BvbmRpbmcgdG8sXG4gIC8vIG9yIGNsb3Nlc3QgdG8sIHRoZSB0YXJnZXQgY2hhcmFjdGVyLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcCQkMS5sZW5ndGg7IGkgKz0gMykge1xuICAgIG1TdGFydCA9IG1hcCQkMVtpXTtcbiAgICBtRW5kID0gbWFwJCQxW2kgKyAxXTtcbiAgICBpZiAoY2ggPCBtU3RhcnQpIHtcbiAgICAgIHN0YXJ0ID0gMDsgZW5kID0gMTtcbiAgICAgIGNvbGxhcHNlID0gXCJsZWZ0XCI7XG4gICAgfSBlbHNlIGlmIChjaCA8IG1FbmQpIHtcbiAgICAgIHN0YXJ0ID0gY2ggLSBtU3RhcnQ7XG4gICAgICBlbmQgPSBzdGFydCArIDE7XG4gICAgfSBlbHNlIGlmIChpID09IG1hcCQkMS5sZW5ndGggLSAzIHx8IGNoID09IG1FbmQgJiYgbWFwJCQxW2kgKyAzXSA+IGNoKSB7XG4gICAgICBlbmQgPSBtRW5kIC0gbVN0YXJ0O1xuICAgICAgc3RhcnQgPSBlbmQgLSAxO1xuICAgICAgaWYgKGNoID49IG1FbmQpIHsgY29sbGFwc2UgPSBcInJpZ2h0XCI7IH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0ICE9IG51bGwpIHtcbiAgICAgIG5vZGUgPSBtYXAkJDFbaSArIDJdO1xuICAgICAgaWYgKG1TdGFydCA9PSBtRW5kICYmIGJpYXMgPT0gKG5vZGUuaW5zZXJ0TGVmdCA/IFwibGVmdFwiIDogXCJyaWdodFwiKSlcbiAgICAgICAgeyBjb2xsYXBzZSA9IGJpYXM7IH1cbiAgICAgIGlmIChiaWFzID09IFwibGVmdFwiICYmIHN0YXJ0ID09IDApXG4gICAgICAgIHsgd2hpbGUgKGkgJiYgbWFwJCQxW2kgLSAyXSA9PSBtYXAkJDFbaSAtIDNdICYmIG1hcCQkMVtpIC0gMV0uaW5zZXJ0TGVmdCkge1xuICAgICAgICAgIG5vZGUgPSBtYXAkJDFbKGkgLT0gMykgKyAyXTtcbiAgICAgICAgICBjb2xsYXBzZSA9IFwibGVmdFwiO1xuICAgICAgICB9IH1cbiAgICAgIGlmIChiaWFzID09IFwicmlnaHRcIiAmJiBzdGFydCA9PSBtRW5kIC0gbVN0YXJ0KVxuICAgICAgICB7IHdoaWxlIChpIDwgbWFwJCQxLmxlbmd0aCAtIDMgJiYgbWFwJCQxW2kgKyAzXSA9PSBtYXAkJDFbaSArIDRdICYmICFtYXAkJDFbaSArIDVdLmluc2VydExlZnQpIHtcbiAgICAgICAgICBub2RlID0gbWFwJCQxWyhpICs9IDMpICsgMl07XG4gICAgICAgICAgY29sbGFwc2UgPSBcInJpZ2h0XCI7XG4gICAgICAgIH0gfVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtub2RlOiBub2RlLCBzdGFydDogc3RhcnQsIGVuZDogZW5kLCBjb2xsYXBzZTogY29sbGFwc2UsIGNvdmVyU3RhcnQ6IG1TdGFydCwgY292ZXJFbmQ6IG1FbmR9XG59XG5cbmZ1bmN0aW9uIGdldFVzZWZ1bFJlY3QocmVjdHMsIGJpYXMpIHtcbiAgdmFyIHJlY3QgPSBudWxsUmVjdDtcbiAgaWYgKGJpYXMgPT0gXCJsZWZ0XCIpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xuICAgIGlmICgocmVjdCA9IHJlY3RzW2ldKS5sZWZ0ICE9IHJlY3QucmlnaHQpIHsgYnJlYWsgfVxuICB9IH0gZWxzZSB7IGZvciAodmFyIGkkMSA9IHJlY3RzLmxlbmd0aCAtIDE7IGkkMSA+PSAwOyBpJDEtLSkge1xuICAgIGlmICgocmVjdCA9IHJlY3RzW2kkMV0pLmxlZnQgIT0gcmVjdC5yaWdodCkgeyBicmVhayB9XG4gIH0gfVxuICByZXR1cm4gcmVjdFxufVxuXG5mdW5jdGlvbiBtZWFzdXJlQ2hhcklubmVyKGNtLCBwcmVwYXJlZCwgY2gsIGJpYXMpIHtcbiAgdmFyIHBsYWNlID0gbm9kZUFuZE9mZnNldEluTGluZU1hcChwcmVwYXJlZC5tYXAsIGNoLCBiaWFzKTtcbiAgdmFyIG5vZGUgPSBwbGFjZS5ub2RlLCBzdGFydCA9IHBsYWNlLnN0YXJ0LCBlbmQgPSBwbGFjZS5lbmQsIGNvbGxhcHNlID0gcGxhY2UuY29sbGFwc2U7XG5cbiAgdmFyIHJlY3Q7XG4gIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHsgLy8gSWYgaXQgaXMgYSB0ZXh0IG5vZGUsIHVzZSBhIHJhbmdlIHRvIHJldHJpZXZlIHRoZSBjb29yZGluYXRlcy5cbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCA0OyBpJDErKykgeyAvLyBSZXRyeSBhIG1heGltdW0gb2YgNCB0aW1lcyB3aGVuIG5vbnNlbnNlIHJlY3RhbmdsZXMgYXJlIHJldHVybmVkXG4gICAgICB3aGlsZSAoc3RhcnQgJiYgaXNFeHRlbmRpbmdDaGFyKHByZXBhcmVkLmxpbmUudGV4dC5jaGFyQXQocGxhY2UuY292ZXJTdGFydCArIHN0YXJ0KSkpIHsgLS1zdGFydDsgfVxuICAgICAgd2hpbGUgKHBsYWNlLmNvdmVyU3RhcnQgKyBlbmQgPCBwbGFjZS5jb3ZlckVuZCAmJiBpc0V4dGVuZGluZ0NoYXIocHJlcGFyZWQubGluZS50ZXh0LmNoYXJBdChwbGFjZS5jb3ZlclN0YXJ0ICsgZW5kKSkpIHsgKytlbmQ7IH1cbiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSAmJiBzdGFydCA9PSAwICYmIGVuZCA9PSBwbGFjZS5jb3ZlckVuZCAtIHBsYWNlLmNvdmVyU3RhcnQpXG4gICAgICAgIHsgcmVjdCA9IG5vZGUucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgfVxuICAgICAgZWxzZVxuICAgICAgICB7IHJlY3QgPSBnZXRVc2VmdWxSZWN0KHJhbmdlKG5vZGUsIHN0YXJ0LCBlbmQpLmdldENsaWVudFJlY3RzKCksIGJpYXMpOyB9XG4gICAgICBpZiAocmVjdC5sZWZ0IHx8IHJlY3QucmlnaHQgfHwgc3RhcnQgPT0gMCkgeyBicmVhayB9XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gc3RhcnQgLSAxO1xuICAgICAgY29sbGFwc2UgPSBcInJpZ2h0XCI7XG4gICAgfVxuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgMTEpIHsgcmVjdCA9IG1heWJlVXBkYXRlUmVjdEZvclpvb21pbmcoY20uZGlzcGxheS5tZWFzdXJlLCByZWN0KTsgfVxuICB9IGVsc2UgeyAvLyBJZiBpdCBpcyBhIHdpZGdldCwgc2ltcGx5IGdldCB0aGUgYm94IGZvciB0aGUgd2hvbGUgd2lkZ2V0LlxuICAgIGlmIChzdGFydCA+IDApIHsgY29sbGFwc2UgPSBiaWFzID0gXCJyaWdodFwiOyB9XG4gICAgdmFyIHJlY3RzO1xuICAgIGlmIChjbS5vcHRpb25zLmxpbmVXcmFwcGluZyAmJiAocmVjdHMgPSBub2RlLmdldENsaWVudFJlY3RzKCkpLmxlbmd0aCA+IDEpXG4gICAgICB7IHJlY3QgPSByZWN0c1tiaWFzID09IFwicmlnaHRcIiA/IHJlY3RzLmxlbmd0aCAtIDEgOiAwXTsgfVxuICAgIGVsc2VcbiAgICAgIHsgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IH1cbiAgfVxuICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkgJiYgIXN0YXJ0ICYmICghcmVjdCB8fCAhcmVjdC5sZWZ0ICYmICFyZWN0LnJpZ2h0KSkge1xuICAgIHZhciByU3BhbiA9IG5vZGUucGFyZW50Tm9kZS5nZXRDbGllbnRSZWN0cygpWzBdO1xuICAgIGlmIChyU3BhbilcbiAgICAgIHsgcmVjdCA9IHtsZWZ0OiByU3Bhbi5sZWZ0LCByaWdodDogclNwYW4ubGVmdCArIGNoYXJXaWR0aChjbS5kaXNwbGF5KSwgdG9wOiByU3Bhbi50b3AsIGJvdHRvbTogclNwYW4uYm90dG9tfTsgfVxuICAgIGVsc2VcbiAgICAgIHsgcmVjdCA9IG51bGxSZWN0OyB9XG4gIH1cblxuICB2YXIgcnRvcCA9IHJlY3QudG9wIC0gcHJlcGFyZWQucmVjdC50b3AsIHJib3QgPSByZWN0LmJvdHRvbSAtIHByZXBhcmVkLnJlY3QudG9wO1xuICB2YXIgbWlkID0gKHJ0b3AgKyByYm90KSAvIDI7XG4gIHZhciBoZWlnaHRzID0gcHJlcGFyZWQudmlldy5tZWFzdXJlLmhlaWdodHM7XG4gIHZhciBpID0gMDtcbiAgZm9yICg7IGkgPCBoZWlnaHRzLmxlbmd0aCAtIDE7IGkrKylcbiAgICB7IGlmIChtaWQgPCBoZWlnaHRzW2ldKSB7IGJyZWFrIH0gfVxuICB2YXIgdG9wID0gaSA/IGhlaWdodHNbaSAtIDFdIDogMCwgYm90ID0gaGVpZ2h0c1tpXTtcbiAgdmFyIHJlc3VsdCA9IHtsZWZ0OiAoY29sbGFwc2UgPT0gXCJyaWdodFwiID8gcmVjdC5yaWdodCA6IHJlY3QubGVmdCkgLSBwcmVwYXJlZC5yZWN0LmxlZnQsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IChjb2xsYXBzZSA9PSBcImxlZnRcIiA/IHJlY3QubGVmdCA6IHJlY3QucmlnaHQpIC0gcHJlcGFyZWQucmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgIHRvcDogdG9wLCBib3R0b206IGJvdH07XG4gIGlmICghcmVjdC5sZWZ0ICYmICFyZWN0LnJpZ2h0KSB7IHJlc3VsdC5ib2d1cyA9IHRydWU7IH1cbiAgaWYgKCFjbS5vcHRpb25zLnNpbmdsZUN1cnNvckhlaWdodFBlckxpbmUpIHsgcmVzdWx0LnJ0b3AgPSBydG9wOyByZXN1bHQucmJvdHRvbSA9IHJib3Q7IH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIFdvcmsgYXJvdW5kIHByb2JsZW0gd2l0aCBib3VuZGluZyBjbGllbnQgcmVjdHMgb24gcmFuZ2VzIGJlaW5nXG4vLyByZXR1cm5lZCBpbmNvcnJlY3RseSB3aGVuIHpvb21lZCBvbiBJRTEwIGFuZCBiZWxvdy5cbmZ1bmN0aW9uIG1heWJlVXBkYXRlUmVjdEZvclpvb21pbmcobWVhc3VyZSwgcmVjdCkge1xuICBpZiAoIXdpbmRvdy5zY3JlZW4gfHwgc2NyZWVuLmxvZ2ljYWxYRFBJID09IG51bGwgfHxcbiAgICAgIHNjcmVlbi5sb2dpY2FsWERQSSA9PSBzY3JlZW4uZGV2aWNlWERQSSB8fCAhaGFzQmFkWm9vbWVkUmVjdHMobWVhc3VyZSkpXG4gICAgeyByZXR1cm4gcmVjdCB9XG4gIHZhciBzY2FsZVggPSBzY3JlZW4ubG9naWNhbFhEUEkgLyBzY3JlZW4uZGV2aWNlWERQSTtcbiAgdmFyIHNjYWxlWSA9IHNjcmVlbi5sb2dpY2FsWURQSSAvIHNjcmVlbi5kZXZpY2VZRFBJO1xuICByZXR1cm4ge2xlZnQ6IHJlY3QubGVmdCAqIHNjYWxlWCwgcmlnaHQ6IHJlY3QucmlnaHQgKiBzY2FsZVgsXG4gICAgICAgICAgdG9wOiByZWN0LnRvcCAqIHNjYWxlWSwgYm90dG9tOiByZWN0LmJvdHRvbSAqIHNjYWxlWX1cbn1cblxuZnVuY3Rpb24gY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZUZvcihsaW5lVmlldykge1xuICBpZiAobGluZVZpZXcubWVhc3VyZSkge1xuICAgIGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGUgPSB7fTtcbiAgICBsaW5lVmlldy5tZWFzdXJlLmhlaWdodHMgPSBudWxsO1xuICAgIGlmIChsaW5lVmlldy5yZXN0KSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVZpZXcucmVzdC5sZW5ndGg7IGkrKylcbiAgICAgIHsgbGluZVZpZXcubWVhc3VyZS5jYWNoZXNbaV0gPSB7fTsgfSB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZShjbSkge1xuICBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZSA9IG51bGw7XG4gIHJlbW92ZUNoaWxkcmVuKGNtLmRpc3BsYXkubGluZU1lYXN1cmUpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNtLmRpc3BsYXkudmlldy5sZW5ndGg7IGkrKylcbiAgICB7IGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGVGb3IoY20uZGlzcGxheS52aWV3W2ldKTsgfVxufVxuXG5mdW5jdGlvbiBjbGVhckNhY2hlcyhjbSkge1xuICBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlKGNtKTtcbiAgY20uZGlzcGxheS5jYWNoZWRDaGFyV2lkdGggPSBjbS5kaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgPSBjbS5kaXNwbGF5LmNhY2hlZFBhZGRpbmdIID0gbnVsbDtcbiAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgeyBjbS5kaXNwbGF5Lm1heExpbmVDaGFuZ2VkID0gdHJ1ZTsgfVxuICBjbS5kaXNwbGF5LmxpbmVOdW1DaGFycyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhZ2VTY3JvbGxYKCkge1xuICAvLyBXb3JrIGFyb3VuZCBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00ODkyMDZcbiAgLy8gd2hpY2ggY2F1c2VzIHBhZ2VfT2Zmc2V0IGFuZCBib3VuZGluZyBjbGllbnQgcmVjdHMgdG8gdXNlXG4gIC8vIGRpZmZlcmVudCByZWZlcmVuY2Ugdmlld3BvcnRzIGFuZCBpbnZhbGlkYXRlIG91ciBjYWxjdWxhdGlvbnMuXG4gIGlmIChjaHJvbWUgJiYgYW5kcm9pZCkgeyByZXR1cm4gLShkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLm1hcmdpbkxlZnQpKSB9XG4gIHJldHVybiB3aW5kb3cucGFnZVhPZmZzZXQgfHwgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0XG59XG5mdW5jdGlvbiBwYWdlU2Nyb2xsWSgpIHtcbiAgaWYgKGNocm9tZSAmJiBhbmRyb2lkKSB7IHJldHVybiAtKGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5tYXJnaW5Ub3ApKSB9XG4gIHJldHVybiB3aW5kb3cucGFnZVlPZmZzZXQgfHwgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3Bcbn1cblxuZnVuY3Rpb24gd2lkZ2V0VG9wSGVpZ2h0KGxpbmVPYmopIHtcbiAgdmFyIGhlaWdodCA9IDA7XG4gIGlmIChsaW5lT2JqLndpZGdldHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lT2JqLndpZGdldHMubGVuZ3RoOyArK2kpIHsgaWYgKGxpbmVPYmoud2lkZ2V0c1tpXS5hYm92ZSlcbiAgICB7IGhlaWdodCArPSB3aWRnZXRIZWlnaHQobGluZU9iai53aWRnZXRzW2ldKTsgfSB9IH1cbiAgcmV0dXJuIGhlaWdodFxufVxuXG4vLyBDb252ZXJ0cyBhIHt0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHR9IGJveCBmcm9tIGxpbmUtbG9jYWxcbi8vIGNvb3JkaW5hdGVzIGludG8gYW5vdGhlciBjb29yZGluYXRlIHN5c3RlbS4gQ29udGV4dCBtYXkgYmUgb25lIG9mXG4vLyBcImxpbmVcIiwgXCJkaXZcIiAoZGlzcGxheS5saW5lRGl2KSwgXCJsb2NhbFwiLi9udWxsIChlZGl0b3IpLCBcIndpbmRvd1wiLFxuLy8gb3IgXCJwYWdlXCIuXG5mdW5jdGlvbiBpbnRvQ29vcmRTeXN0ZW0oY20sIGxpbmVPYmosIHJlY3QsIGNvbnRleHQsIGluY2x1ZGVXaWRnZXRzKSB7XG4gIGlmICghaW5jbHVkZVdpZGdldHMpIHtcbiAgICB2YXIgaGVpZ2h0ID0gd2lkZ2V0VG9wSGVpZ2h0KGxpbmVPYmopO1xuICAgIHJlY3QudG9wICs9IGhlaWdodDsgcmVjdC5ib3R0b20gKz0gaGVpZ2h0O1xuICB9XG4gIGlmIChjb250ZXh0ID09IFwibGluZVwiKSB7IHJldHVybiByZWN0IH1cbiAgaWYgKCFjb250ZXh0KSB7IGNvbnRleHQgPSBcImxvY2FsXCI7IH1cbiAgdmFyIHlPZmYgPSBoZWlnaHRBdExpbmUobGluZU9iaik7XG4gIGlmIChjb250ZXh0ID09IFwibG9jYWxcIikgeyB5T2ZmICs9IHBhZGRpbmdUb3AoY20uZGlzcGxheSk7IH1cbiAgZWxzZSB7IHlPZmYgLT0gY20uZGlzcGxheS52aWV3T2Zmc2V0OyB9XG4gIGlmIChjb250ZXh0ID09IFwicGFnZVwiIHx8IGNvbnRleHQgPT0gXCJ3aW5kb3dcIikge1xuICAgIHZhciBsT2ZmID0gY20uZGlzcGxheS5saW5lU3BhY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgeU9mZiArPSBsT2ZmLnRvcCArIChjb250ZXh0ID09IFwid2luZG93XCIgPyAwIDogcGFnZVNjcm9sbFkoKSk7XG4gICAgdmFyIHhPZmYgPSBsT2ZmLmxlZnQgKyAoY29udGV4dCA9PSBcIndpbmRvd1wiID8gMCA6IHBhZ2VTY3JvbGxYKCkpO1xuICAgIHJlY3QubGVmdCArPSB4T2ZmOyByZWN0LnJpZ2h0ICs9IHhPZmY7XG4gIH1cbiAgcmVjdC50b3AgKz0geU9mZjsgcmVjdC5ib3R0b20gKz0geU9mZjtcbiAgcmV0dXJuIHJlY3Rcbn1cblxuLy8gQ292ZXJ0cyBhIGJveCBmcm9tIFwiZGl2XCIgY29vcmRzIHRvIGFub3RoZXIgY29vcmRpbmF0ZSBzeXN0ZW0uXG4vLyBDb250ZXh0IG1heSBiZSBcIndpbmRvd1wiLCBcInBhZ2VcIiwgXCJkaXZcIiwgb3IgXCJsb2NhbFwiLi9udWxsLlxuZnVuY3Rpb24gZnJvbUNvb3JkU3lzdGVtKGNtLCBjb29yZHMsIGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQgPT0gXCJkaXZcIikgeyByZXR1cm4gY29vcmRzIH1cbiAgdmFyIGxlZnQgPSBjb29yZHMubGVmdCwgdG9wID0gY29vcmRzLnRvcDtcbiAgLy8gRmlyc3QgbW92ZSBpbnRvIFwicGFnZVwiIGNvb3JkaW5hdGUgc3lzdGVtXG4gIGlmIChjb250ZXh0ID09IFwicGFnZVwiKSB7XG4gICAgbGVmdCAtPSBwYWdlU2Nyb2xsWCgpO1xuICAgIHRvcCAtPSBwYWdlU2Nyb2xsWSgpO1xuICB9IGVsc2UgaWYgKGNvbnRleHQgPT0gXCJsb2NhbFwiIHx8ICFjb250ZXh0KSB7XG4gICAgdmFyIGxvY2FsQm94ID0gY20uZGlzcGxheS5zaXplci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZWZ0ICs9IGxvY2FsQm94LmxlZnQ7XG4gICAgdG9wICs9IGxvY2FsQm94LnRvcDtcbiAgfVxuXG4gIHZhciBsaW5lU3BhY2VCb3ggPSBjbS5kaXNwbGF5LmxpbmVTcGFjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIHtsZWZ0OiBsZWZ0IC0gbGluZVNwYWNlQm94LmxlZnQsIHRvcDogdG9wIC0gbGluZVNwYWNlQm94LnRvcH1cbn1cblxuZnVuY3Rpb24gY2hhckNvb3JkcyhjbSwgcG9zLCBjb250ZXh0LCBsaW5lT2JqLCBiaWFzKSB7XG4gIGlmICghbGluZU9iaikgeyBsaW5lT2JqID0gZ2V0TGluZShjbS5kb2MsIHBvcy5saW5lKTsgfVxuICByZXR1cm4gaW50b0Nvb3JkU3lzdGVtKGNtLCBsaW5lT2JqLCBtZWFzdXJlQ2hhcihjbSwgbGluZU9iaiwgcG9zLmNoLCBiaWFzKSwgY29udGV4dClcbn1cblxuLy8gUmV0dXJucyBhIGJveCBmb3IgYSBnaXZlbiBjdXJzb3IgcG9zaXRpb24sIHdoaWNoIG1heSBoYXZlIGFuXG4vLyAnb3RoZXInIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmRhcnkgY3Vyc29yXG4vLyBvbiBhIGJpZGkgYm91bmRhcnkuXG4vLyBBIGN1cnNvciBQb3MobGluZSwgY2hhciwgXCJiZWZvcmVcIikgaXMgb24gdGhlIHNhbWUgdmlzdWFsIGxpbmUgYXMgYGNoYXIgLSAxYFxuLy8gYW5kIGFmdGVyIGBjaGFyIC0gMWAgaW4gd3JpdGluZyBvcmRlciBvZiBgY2hhciAtIDFgXG4vLyBBIGN1cnNvciBQb3MobGluZSwgY2hhciwgXCJhZnRlclwiKSBpcyBvbiB0aGUgc2FtZSB2aXN1YWwgbGluZSBhcyBgY2hhcmBcbi8vIGFuZCBiZWZvcmUgYGNoYXJgIGluIHdyaXRpbmcgb3JkZXIgb2YgYGNoYXJgXG4vLyBFeGFtcGxlcyAodXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBSVEwsIGxvd2VyLWNhc2UgYXJlIExUUik6XG4vLyAgICAgUG9zKDAsIDEsIC4uLilcbi8vICAgICBiZWZvcmUgICBhZnRlclxuLy8gYWIgICAgIGF8YiAgICAgYXxiXG4vLyBhQiAgICAgYXxCICAgICBhQnxcbi8vIEFiICAgICB8QWIgICAgIEF8YlxuLy8gQUIgICAgIEJ8QSAgICAgQnxBXG4vLyBFdmVyeSBwb3NpdGlvbiBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb24gYSBsaW5lIGlzIGNvbnNpZGVyZWQgdG8gc3RpY2tcbi8vIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvbiB0aGUgbGluZS5cbmZ1bmN0aW9uIGN1cnNvckNvb3JkcyhjbSwgcG9zLCBjb250ZXh0LCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUsIHZhckhlaWdodCkge1xuICBsaW5lT2JqID0gbGluZU9iaiB8fCBnZXRMaW5lKGNtLmRvYywgcG9zLmxpbmUpO1xuICBpZiAoIXByZXBhcmVkTWVhc3VyZSkgeyBwcmVwYXJlZE1lYXN1cmUgPSBwcmVwYXJlTWVhc3VyZUZvckxpbmUoY20sIGxpbmVPYmopOyB9XG4gIGZ1bmN0aW9uIGdldChjaCwgcmlnaHQpIHtcbiAgICB2YXIgbSA9IG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkTWVhc3VyZSwgY2gsIHJpZ2h0ID8gXCJyaWdodFwiIDogXCJsZWZ0XCIsIHZhckhlaWdodCk7XG4gICAgaWYgKHJpZ2h0KSB7IG0ubGVmdCA9IG0ucmlnaHQ7IH0gZWxzZSB7IG0ucmlnaHQgPSBtLmxlZnQ7IH1cbiAgICByZXR1cm4gaW50b0Nvb3JkU3lzdGVtKGNtLCBsaW5lT2JqLCBtLCBjb250ZXh0KVxuICB9XG4gIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmVPYmosIGNtLmRvYy5kaXJlY3Rpb24pLCBjaCA9IHBvcy5jaCwgc3RpY2t5ID0gcG9zLnN0aWNreTtcbiAgaWYgKGNoID49IGxpbmVPYmoudGV4dC5sZW5ndGgpIHtcbiAgICBjaCA9IGxpbmVPYmoudGV4dC5sZW5ndGg7XG4gICAgc3RpY2t5ID0gXCJiZWZvcmVcIjtcbiAgfSBlbHNlIGlmIChjaCA8PSAwKSB7XG4gICAgY2ggPSAwO1xuICAgIHN0aWNreSA9IFwiYWZ0ZXJcIjtcbiAgfVxuICBpZiAoIW9yZGVyKSB7IHJldHVybiBnZXQoc3RpY2t5ID09IFwiYmVmb3JlXCIgPyBjaCAtIDEgOiBjaCwgc3RpY2t5ID09IFwiYmVmb3JlXCIpIH1cblxuICBmdW5jdGlvbiBnZXRCaWRpKGNoLCBwYXJ0UG9zLCBpbnZlcnQpIHtcbiAgICB2YXIgcGFydCA9IG9yZGVyW3BhcnRQb3NdLCByaWdodCA9IHBhcnQubGV2ZWwgPT0gMTtcbiAgICByZXR1cm4gZ2V0KGludmVydCA/IGNoIC0gMSA6IGNoLCByaWdodCAhPSBpbnZlcnQpXG4gIH1cbiAgdmFyIHBhcnRQb3MgPSBnZXRCaWRpUGFydEF0KG9yZGVyLCBjaCwgc3RpY2t5KTtcbiAgdmFyIG90aGVyID0gYmlkaU90aGVyO1xuICB2YXIgdmFsID0gZ2V0QmlkaShjaCwgcGFydFBvcywgc3RpY2t5ID09IFwiYmVmb3JlXCIpO1xuICBpZiAob3RoZXIgIT0gbnVsbCkgeyB2YWwub3RoZXIgPSBnZXRCaWRpKGNoLCBvdGhlciwgc3RpY2t5ICE9IFwiYmVmb3JlXCIpOyB9XG4gIHJldHVybiB2YWxcbn1cblxuLy8gVXNlZCB0byBjaGVhcGx5IGVzdGltYXRlIHRoZSBjb29yZGluYXRlcyBmb3IgYSBwb3NpdGlvbi4gVXNlZCBmb3Jcbi8vIGludGVybWVkaWF0ZSBzY3JvbGwgdXBkYXRlcy5cbmZ1bmN0aW9uIGVzdGltYXRlQ29vcmRzKGNtLCBwb3MpIHtcbiAgdmFyIGxlZnQgPSAwO1xuICBwb3MgPSBjbGlwUG9zKGNtLmRvYywgcG9zKTtcbiAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgeyBsZWZ0ID0gY2hhcldpZHRoKGNtLmRpc3BsYXkpICogcG9zLmNoOyB9XG4gIHZhciBsaW5lT2JqID0gZ2V0TGluZShjbS5kb2MsIHBvcy5saW5lKTtcbiAgdmFyIHRvcCA9IGhlaWdodEF0TGluZShsaW5lT2JqKSArIHBhZGRpbmdUb3AoY20uZGlzcGxheSk7XG4gIHJldHVybiB7bGVmdDogbGVmdCwgcmlnaHQ6IGxlZnQsIHRvcDogdG9wLCBib3R0b206IHRvcCArIGxpbmVPYmouaGVpZ2h0fVxufVxuXG4vLyBQb3NpdGlvbnMgcmV0dXJuZWQgYnkgY29vcmRzQ2hhciBjb250YWluIHNvbWUgZXh0cmEgaW5mb3JtYXRpb24uXG4vLyB4UmVsIGlzIHRoZSByZWxhdGl2ZSB4IHBvc2l0aW9uIG9mIHRoZSBpbnB1dCBjb29yZGluYXRlcyBjb21wYXJlZFxuLy8gdG8gdGhlIGZvdW5kIHBvc2l0aW9uIChzbyB4UmVsID4gMCBtZWFucyB0aGUgY29vcmRpbmF0ZXMgYXJlIHRvXG4vLyB0aGUgcmlnaHQgb2YgdGhlIGNoYXJhY3RlciBwb3NpdGlvbiwgZm9yIGV4YW1wbGUpLiBXaGVuIG91dHNpZGVcbi8vIGlzIHRydWUsIHRoYXQgbWVhbnMgdGhlIGNvb3JkaW5hdGVzIGxpZSBvdXRzaWRlIHRoZSBsaW5lJ3Ncbi8vIHZlcnRpY2FsIHJhbmdlLlxuZnVuY3Rpb24gUG9zV2l0aEluZm8obGluZSwgY2gsIHN0aWNreSwgb3V0c2lkZSwgeFJlbCkge1xuICB2YXIgcG9zID0gUG9zKGxpbmUsIGNoLCBzdGlja3kpO1xuICBwb3MueFJlbCA9IHhSZWw7XG4gIGlmIChvdXRzaWRlKSB7IHBvcy5vdXRzaWRlID0gdHJ1ZTsgfVxuICByZXR1cm4gcG9zXG59XG5cbi8vIENvbXB1dGUgdGhlIGNoYXJhY3RlciBwb3NpdGlvbiBjbG9zZXN0IHRvIHRoZSBnaXZlbiBjb29yZGluYXRlcy5cbi8vIElucHV0IG11c3QgYmUgbGluZVNwYWNlLWxvY2FsIChcImRpdlwiIGNvb3JkaW5hdGUgc3lzdGVtKS5cbmZ1bmN0aW9uIGNvb3Jkc0NoYXIoY20sIHgsIHkpIHtcbiAgdmFyIGRvYyA9IGNtLmRvYztcbiAgeSArPSBjbS5kaXNwbGF5LnZpZXdPZmZzZXQ7XG4gIGlmICh5IDwgMCkgeyByZXR1cm4gUG9zV2l0aEluZm8oZG9jLmZpcnN0LCAwLCBudWxsLCB0cnVlLCAtMSkgfVxuICB2YXIgbGluZU4gPSBsaW5lQXRIZWlnaHQoZG9jLCB5KSwgbGFzdCA9IGRvYy5maXJzdCArIGRvYy5zaXplIC0gMTtcbiAgaWYgKGxpbmVOID4gbGFzdClcbiAgICB7IHJldHVybiBQb3NXaXRoSW5mbyhkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEsIGdldExpbmUoZG9jLCBsYXN0KS50ZXh0Lmxlbmd0aCwgbnVsbCwgdHJ1ZSwgMSkgfVxuICBpZiAoeCA8IDApIHsgeCA9IDA7IH1cblxuICB2YXIgbGluZU9iaiA9IGdldExpbmUoZG9jLCBsaW5lTik7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgZm91bmQgPSBjb29yZHNDaGFySW5uZXIoY20sIGxpbmVPYmosIGxpbmVOLCB4LCB5KTtcbiAgICB2YXIgbWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGxpbmVPYmopO1xuICAgIHZhciBtZXJnZWRQb3MgPSBtZXJnZWQgJiYgbWVyZ2VkLmZpbmQoMCwgdHJ1ZSk7XG4gICAgaWYgKG1lcmdlZCAmJiAoZm91bmQuY2ggPiBtZXJnZWRQb3MuZnJvbS5jaCB8fCBmb3VuZC5jaCA9PSBtZXJnZWRQb3MuZnJvbS5jaCAmJiBmb3VuZC54UmVsID4gMCkpXG4gICAgICB7IGxpbmVOID0gbGluZU5vKGxpbmVPYmogPSBtZXJnZWRQb3MudG8ubGluZSk7IH1cbiAgICBlbHNlXG4gICAgICB7IHJldHVybiBmb3VuZCB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JhcHBlZExpbmVFeHRlbnQoY20sIGxpbmVPYmosIHByZXBhcmVkTWVhc3VyZSwgeSkge1xuICB5IC09IHdpZGdldFRvcEhlaWdodChsaW5lT2JqKTtcbiAgdmFyIGVuZCA9IGxpbmVPYmoudGV4dC5sZW5ndGg7XG4gIHZhciBiZWdpbiA9IGZpbmRGaXJzdChmdW5jdGlvbiAoY2gpIHsgcmV0dXJuIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkTWVhc3VyZSwgY2ggLSAxKS5ib3R0b20gPD0geTsgfSwgZW5kLCAwKTtcbiAgZW5kID0gZmluZEZpcnN0KGZ1bmN0aW9uIChjaCkgeyByZXR1cm4gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWRNZWFzdXJlLCBjaCkudG9wID4geTsgfSwgYmVnaW4sIGVuZCk7XG4gIHJldHVybiB7YmVnaW46IGJlZ2luLCBlbmQ6IGVuZH1cbn1cblxuZnVuY3Rpb24gd3JhcHBlZExpbmVFeHRlbnRDaGFyKGNtLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUsIHRhcmdldCkge1xuICBpZiAoIXByZXBhcmVkTWVhc3VyZSkgeyBwcmVwYXJlZE1lYXN1cmUgPSBwcmVwYXJlTWVhc3VyZUZvckxpbmUoY20sIGxpbmVPYmopOyB9XG4gIHZhciB0YXJnZXRUb3AgPSBpbnRvQ29vcmRTeXN0ZW0oY20sIGxpbmVPYmosIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkTWVhc3VyZSwgdGFyZ2V0KSwgXCJsaW5lXCIpLnRvcDtcbiAgcmV0dXJuIHdyYXBwZWRMaW5lRXh0ZW50KGNtLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUsIHRhcmdldFRvcClcbn1cblxuLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzaWRlIG9mIGEgYm94IGlzIGFmdGVyIHRoZSBnaXZlblxuLy8gY29vcmRpbmF0ZXMsIGluIHRvcC10by1ib3R0b20sIGxlZnQtdG8tcmlnaHQgb3JkZXIuXG5mdW5jdGlvbiBib3hJc0FmdGVyKGJveCwgeCwgeSwgbGVmdCkge1xuICByZXR1cm4gYm94LmJvdHRvbSA8PSB5ID8gZmFsc2UgOiBib3gudG9wID4geSA/IHRydWUgOiAobGVmdCA/IGJveC5sZWZ0IDogYm94LnJpZ2h0KSA+IHhcbn1cblxuZnVuY3Rpb24gY29vcmRzQ2hhcklubmVyKGNtLCBsaW5lT2JqLCBsaW5lTm8kJDEsIHgsIHkpIHtcbiAgLy8gTW92ZSB5IGludG8gbGluZS1sb2NhbCBjb29yZGluYXRlIHNwYWNlXG4gIHkgLT0gaGVpZ2h0QXRMaW5lKGxpbmVPYmopO1xuICB2YXIgcHJlcGFyZWRNZWFzdXJlID0gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lT2JqKTtcbiAgLy8gV2hlbiBkaXJlY3RseSBjYWxsaW5nIGBtZWFzdXJlQ2hhclByZXBhcmVkYCwgd2UgaGF2ZSB0byBhZGp1c3RcbiAgLy8gZm9yIHRoZSB3aWRnZXRzIGF0IHRoaXMgbGluZS5cbiAgdmFyIHdpZGdldEhlaWdodCQkMSA9IHdpZGdldFRvcEhlaWdodChsaW5lT2JqKTtcbiAgdmFyIGJlZ2luID0gMCwgZW5kID0gbGluZU9iai50ZXh0Lmxlbmd0aCwgbHRyID0gdHJ1ZTtcblxuICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lT2JqLCBjbS5kb2MuZGlyZWN0aW9uKTtcbiAgLy8gSWYgdGhlIGxpbmUgaXNuJ3QgcGxhaW4gbGVmdC10by1yaWdodCB0ZXh0LCBmaXJzdCBmaWd1cmUgb3V0XG4gIC8vIHdoaWNoIGJpZGkgc2VjdGlvbiB0aGUgY29vcmRpbmF0ZXMgZmFsbCBpbnRvLlxuICBpZiAob3JkZXIpIHtcbiAgICB2YXIgcGFydCA9IChjbS5vcHRpb25zLmxpbmVXcmFwcGluZyA/IGNvb3Jkc0JpZGlQYXJ0V3JhcHBlZCA6IGNvb3Jkc0JpZGlQYXJ0KVxuICAgICAgICAgICAgICAgICAoY20sIGxpbmVPYmosIGxpbmVObyQkMSwgcHJlcGFyZWRNZWFzdXJlLCBvcmRlciwgeCwgeSk7XG4gICAgbHRyID0gcGFydC5sZXZlbCAhPSAxO1xuICAgIC8vIFRoZSBhd2t3YXJkIC0xIG9mZnNldHMgYXJlIG5lZWRlZCBiZWNhdXNlIGZpbmRGaXJzdCAoY2FsbGVkXG4gICAgLy8gb24gdGhlc2UgYmVsb3cpIHdpbGwgdHJlYXQgaXRzIGZpcnN0IGJvdW5kIGFzIGluY2x1c2l2ZSxcbiAgICAvLyBzZWNvbmQgYXMgZXhjbHVzaXZlLCBidXQgd2Ugd2FudCB0byBhY3R1YWxseSBhZGRyZXNzIHRoZVxuICAgIC8vIGNoYXJhY3RlcnMgaW4gdGhlIHBhcnQncyByYW5nZVxuICAgIGJlZ2luID0gbHRyID8gcGFydC5mcm9tIDogcGFydC50byAtIDE7XG4gICAgZW5kID0gbHRyID8gcGFydC50byA6IHBhcnQuZnJvbSAtIDE7XG4gIH1cblxuICAvLyBBIGJpbmFyeSBzZWFyY2ggdG8gZmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIHdob3NlIGJvdW5kaW5nIGJveFxuICAvLyBzdGFydHMgYWZ0ZXIgdGhlIGNvb3JkaW5hdGVzLiBJZiB3ZSBydW4gYWNyb3NzIGFueSB3aG9zZSBib3ggd3JhcFxuICAvLyB0aGUgY29vcmRpbmF0ZXMsIHN0b3JlIHRoYXQuXG4gIHZhciBjaEFyb3VuZCA9IG51bGwsIGJveEFyb3VuZCA9IG51bGw7XG4gIHZhciBjaCA9IGZpbmRGaXJzdChmdW5jdGlvbiAoY2gpIHtcbiAgICB2YXIgYm94ID0gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWRNZWFzdXJlLCBjaCk7XG4gICAgYm94LnRvcCArPSB3aWRnZXRIZWlnaHQkJDE7IGJveC5ib3R0b20gKz0gd2lkZ2V0SGVpZ2h0JCQxO1xuICAgIGlmICghYm94SXNBZnRlcihib3gsIHgsIHksIGZhbHNlKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIGlmIChib3gudG9wIDw9IHkgJiYgYm94LmxlZnQgPD0geCkge1xuICAgICAgY2hBcm91bmQgPSBjaDtcbiAgICAgIGJveEFyb3VuZCA9IGJveDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfSwgYmVnaW4sIGVuZCk7XG5cbiAgdmFyIGJhc2VYLCBzdGlja3ksIG91dHNpZGUgPSBmYWxzZTtcbiAgLy8gSWYgYSBib3ggYXJvdW5kIHRoZSBjb29yZGluYXRlcyB3YXMgZm91bmQsIHVzZSB0aGF0XG4gIGlmIChib3hBcm91bmQpIHtcbiAgICAvLyBEaXN0aW5ndWlzaCBjb29yZGluYXRlcyBuZWFyZXIgdG8gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBvZiB0aGUgYm94XG4gICAgdmFyIGF0TGVmdCA9IHggLSBib3hBcm91bmQubGVmdCA8IGJveEFyb3VuZC5yaWdodCAtIHgsIGF0U3RhcnQgPSBhdExlZnQgPT0gbHRyO1xuICAgIGNoID0gY2hBcm91bmQgKyAoYXRTdGFydCA/IDAgOiAxKTtcbiAgICBzdGlja3kgPSBhdFN0YXJ0ID8gXCJhZnRlclwiIDogXCJiZWZvcmVcIjtcbiAgICBiYXNlWCA9IGF0TGVmdCA/IGJveEFyb3VuZC5sZWZ0IDogYm94QXJvdW5kLnJpZ2h0O1xuICB9IGVsc2Uge1xuICAgIC8vIChBZGp1c3QgZm9yIGV4dGVuZGVkIGJvdW5kLCBpZiBuZWNlc3NhcnkuKVxuICAgIGlmICghbHRyICYmIChjaCA9PSBlbmQgfHwgY2ggPT0gYmVnaW4pKSB7IGNoKys7IH1cbiAgICAvLyBUbyBkZXRlcm1pbmUgd2hpY2ggc2lkZSB0byBhc3NvY2lhdGUgd2l0aCwgZ2V0IHRoZSBib3ggdG8gdGhlXG4gICAgLy8gbGVmdCBvZiB0aGUgY2hhcmFjdGVyIGFuZCBjb21wYXJlIGl0J3MgdmVydGljYWwgcG9zaXRpb24gdG8gdGhlXG4gICAgLy8gY29vcmRpbmF0ZXNcbiAgICBzdGlja3kgPSBjaCA9PSAwID8gXCJhZnRlclwiIDogY2ggPT0gbGluZU9iai50ZXh0Lmxlbmd0aCA/IFwiYmVmb3JlXCIgOlxuICAgICAgKG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkTWVhc3VyZSwgY2ggLSAobHRyID8gMSA6IDApKS5ib3R0b20gKyB3aWRnZXRIZWlnaHQkJDEgPD0geSkgPT0gbHRyID9cbiAgICAgIFwiYWZ0ZXJcIiA6IFwiYmVmb3JlXCI7XG4gICAgLy8gTm93IGdldCBhY2N1cmF0ZSBjb29yZGluYXRlcyBmb3IgdGhpcyBwbGFjZSwgaW4gb3JkZXIgdG8gZ2V0IGFcbiAgICAvLyBiYXNlIFggcG9zaXRpb25cbiAgICB2YXIgY29vcmRzID0gY3Vyc29yQ29vcmRzKGNtLCBQb3MobGluZU5vJCQxLCBjaCwgc3RpY2t5KSwgXCJsaW5lXCIsIGxpbmVPYmosIHByZXBhcmVkTWVhc3VyZSk7XG4gICAgYmFzZVggPSBjb29yZHMubGVmdDtcbiAgICBvdXRzaWRlID0geSA8IGNvb3Jkcy50b3AgfHwgeSA+PSBjb29yZHMuYm90dG9tO1xuICB9XG5cbiAgY2ggPSBza2lwRXh0ZW5kaW5nQ2hhcnMobGluZU9iai50ZXh0LCBjaCwgMSk7XG4gIHJldHVybiBQb3NXaXRoSW5mbyhsaW5lTm8kJDEsIGNoLCBzdGlja3ksIG91dHNpZGUsIHggLSBiYXNlWClcbn1cblxuZnVuY3Rpb24gY29vcmRzQmlkaVBhcnQoY20sIGxpbmVPYmosIGxpbmVObyQkMSwgcHJlcGFyZWRNZWFzdXJlLCBvcmRlciwgeCwgeSkge1xuICAvLyBCaWRpIHBhcnRzIGFyZSBzb3J0ZWQgbGVmdC10by1yaWdodCwgYW5kIGluIGEgbm9uLWxpbmUtd3JhcHBpbmdcbiAgLy8gc2l0dWF0aW9uLCB3ZSBjYW4gdGFrZSB0aGlzIG9yZGVyaW5nIHRvIGNvcnJlc3BvbmQgdG8gdGhlIHZpc3VhbFxuICAvLyBvcmRlcmluZy4gVGhpcyBmaW5kcyB0aGUgZmlyc3QgcGFydCB3aG9zZSBlbmQgaXMgYWZ0ZXIgdGhlIGdpdmVuXG4gIC8vIGNvb3JkaW5hdGVzLlxuICB2YXIgaW5kZXggPSBmaW5kRmlyc3QoZnVuY3Rpb24gKGkpIHtcbiAgICB2YXIgcGFydCA9IG9yZGVyW2ldLCBsdHIgPSBwYXJ0LmxldmVsICE9IDE7XG4gICAgcmV0dXJuIGJveElzQWZ0ZXIoY3Vyc29yQ29vcmRzKGNtLCBQb3MobGluZU5vJCQxLCBsdHIgPyBwYXJ0LnRvIDogcGFydC5mcm9tLCBsdHIgPyBcImJlZm9yZVwiIDogXCJhZnRlclwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCIsIGxpbmVPYmosIHByZXBhcmVkTWVhc3VyZSksIHgsIHksIHRydWUpXG4gIH0sIDAsIG9yZGVyLmxlbmd0aCAtIDEpO1xuICB2YXIgcGFydCA9IG9yZGVyW2luZGV4XTtcbiAgLy8gSWYgdGhpcyBpc24ndCB0aGUgZmlyc3QgcGFydCwgdGhlIHBhcnQncyBzdGFydCBpcyBhbHNvIGFmdGVyXG4gIC8vIHRoZSBjb29yZGluYXRlcywgYW5kIHRoZSBjb29yZGluYXRlcyBhcmVuJ3Qgb24gdGhlIHNhbWUgbGluZSBhc1xuICAvLyB0aGF0IHN0YXJ0LCBtb3ZlIG9uZSBwYXJ0IGJhY2suXG4gIGlmIChpbmRleCA+IDApIHtcbiAgICB2YXIgbHRyID0gcGFydC5sZXZlbCAhPSAxO1xuICAgIHZhciBzdGFydCA9IGN1cnNvckNvb3JkcyhjbSwgUG9zKGxpbmVObyQkMSwgbHRyID8gcGFydC5mcm9tIDogcGFydC50bywgbHRyID8gXCJhZnRlclwiIDogXCJiZWZvcmVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGluZVwiLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUpO1xuICAgIGlmIChib3hJc0FmdGVyKHN0YXJ0LCB4LCB5LCB0cnVlKSAmJiBzdGFydC50b3AgPiB5KVxuICAgICAgeyBwYXJ0ID0gb3JkZXJbaW5kZXggLSAxXTsgfVxuICB9XG4gIHJldHVybiBwYXJ0XG59XG5cbmZ1bmN0aW9uIGNvb3Jkc0JpZGlQYXJ0V3JhcHBlZChjbSwgbGluZU9iaiwgX2xpbmVObywgcHJlcGFyZWRNZWFzdXJlLCBvcmRlciwgeCwgeSkge1xuICAvLyBJbiBhIHdyYXBwZWQgbGluZSwgcnRsIHRleHQgb24gd3JhcHBpbmcgYm91bmRhcmllcyBjYW4gZG8gdGhpbmdzXG4gIC8vIHRoYXQgZG9uJ3QgY29ycmVzcG9uZCB0byB0aGUgb3JkZXJpbmcgaW4gb3VyIGBvcmRlcmAgYXJyYXkgYXRcbiAgLy8gYWxsLCBzbyBhIGJpbmFyeSBzZWFyY2ggZG9lc24ndCB3b3JrLCBhbmQgd2Ugd2FudCB0byByZXR1cm4gYVxuICAvLyBwYXJ0IHRoYXQgb25seSBzcGFucyBvbmUgbGluZSBzbyB0aGF0IHRoZSBiaW5hcnkgc2VhcmNoIGluXG4gIC8vIGNvb3Jkc0NoYXJJbm5lciBpcyBzYWZlLiBBcyBzdWNoLCB3ZSBmaXJzdCBmaW5kIHRoZSBleHRlbnQgb2YgdGhlXG4gIC8vIHdyYXBwZWQgbGluZSwgYW5kIHRoZW4gZG8gYSBmbGF0IHNlYXJjaCBpbiB3aGljaCB3ZSBkaXNjYXJkIGFueVxuICAvLyBzcGFucyB0aGF0IGFyZW4ndCBvbiB0aGUgbGluZS5cbiAgdmFyIHJlZiA9IHdyYXBwZWRMaW5lRXh0ZW50KGNtLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUsIHkpO1xuICB2YXIgYmVnaW4gPSByZWYuYmVnaW47XG4gIHZhciBlbmQgPSByZWYuZW5kO1xuICBpZiAoL1xccy8udGVzdChsaW5lT2JqLnRleHQuY2hhckF0KGVuZCAtIDEpKSkgeyBlbmQtLTsgfVxuICB2YXIgcGFydCA9IG51bGwsIGNsb3Nlc3REaXN0ID0gbnVsbDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwID0gb3JkZXJbaV07XG4gICAgaWYgKHAuZnJvbSA+PSBlbmQgfHwgcC50byA8PSBiZWdpbikgeyBjb250aW51ZSB9XG4gICAgdmFyIGx0ciA9IHAubGV2ZWwgIT0gMTtcbiAgICB2YXIgZW5kWCA9IG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkTWVhc3VyZSwgbHRyID8gTWF0aC5taW4oZW5kLCBwLnRvKSAtIDEgOiBNYXRoLm1heChiZWdpbiwgcC5mcm9tKSkucmlnaHQ7XG4gICAgLy8gV2VpZ2ggYWdhaW5zdCBzcGFucyBlbmRpbmcgYmVmb3JlIHRoaXMsIHNvIHRoYXQgdGhleSBhcmUgb25seVxuICAgIC8vIHBpY2tlZCBpZiBub3RoaW5nIGVuZHMgYWZ0ZXJcbiAgICB2YXIgZGlzdCA9IGVuZFggPCB4ID8geCAtIGVuZFggKyAxZTkgOiBlbmRYIC0geDtcbiAgICBpZiAoIXBhcnQgfHwgY2xvc2VzdERpc3QgPiBkaXN0KSB7XG4gICAgICBwYXJ0ID0gcDtcbiAgICAgIGNsb3Nlc3REaXN0ID0gZGlzdDtcbiAgICB9XG4gIH1cbiAgaWYgKCFwYXJ0KSB7IHBhcnQgPSBvcmRlcltvcmRlci5sZW5ndGggLSAxXTsgfVxuICAvLyBDbGlwIHRoZSBwYXJ0IHRvIHRoZSB3cmFwcGVkIGxpbmUuXG4gIGlmIChwYXJ0LmZyb20gPCBiZWdpbikgeyBwYXJ0ID0ge2Zyb206IGJlZ2luLCB0bzogcGFydC50bywgbGV2ZWw6IHBhcnQubGV2ZWx9OyB9XG4gIGlmIChwYXJ0LnRvID4gZW5kKSB7IHBhcnQgPSB7ZnJvbTogcGFydC5mcm9tLCB0bzogZW5kLCBsZXZlbDogcGFydC5sZXZlbH07IH1cbiAgcmV0dXJuIHBhcnRcbn1cblxudmFyIG1lYXN1cmVUZXh0O1xuLy8gQ29tcHV0ZSB0aGUgZGVmYXVsdCB0ZXh0IGhlaWdodC5cbmZ1bmN0aW9uIHRleHRIZWlnaHQoZGlzcGxheSkge1xuICBpZiAoZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0ICE9IG51bGwpIHsgcmV0dXJuIGRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodCB9XG4gIGlmIChtZWFzdXJlVGV4dCA9PSBudWxsKSB7XG4gICAgbWVhc3VyZVRleHQgPSBlbHQoXCJwcmVcIik7XG4gICAgLy8gTWVhc3VyZSBhIGJ1bmNoIG9mIGxpbmVzLCBmb3IgYnJvd3NlcnMgdGhhdCBjb21wdXRlXG4gICAgLy8gZnJhY3Rpb25hbCBoZWlnaHRzLlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDk7ICsraSkge1xuICAgICAgbWVhc3VyZVRleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJ4XCIpKTtcbiAgICAgIG1lYXN1cmVUZXh0LmFwcGVuZENoaWxkKGVsdChcImJyXCIpKTtcbiAgICB9XG4gICAgbWVhc3VyZVRleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJ4XCIpKTtcbiAgfVxuICByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5Lm1lYXN1cmUsIG1lYXN1cmVUZXh0KTtcbiAgdmFyIGhlaWdodCA9IG1lYXN1cmVUZXh0Lm9mZnNldEhlaWdodCAvIDUwO1xuICBpZiAoaGVpZ2h0ID4gMykgeyBkaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgPSBoZWlnaHQ7IH1cbiAgcmVtb3ZlQ2hpbGRyZW4oZGlzcGxheS5tZWFzdXJlKTtcbiAgcmV0dXJuIGhlaWdodCB8fCAxXG59XG5cbi8vIENvbXB1dGUgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIHdpZHRoLlxuZnVuY3Rpb24gY2hhcldpZHRoKGRpc3BsYXkpIHtcbiAgaWYgKGRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoICE9IG51bGwpIHsgcmV0dXJuIGRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoIH1cbiAgdmFyIGFuY2hvciA9IGVsdChcInNwYW5cIiwgXCJ4eHh4eHh4eHh4XCIpO1xuICB2YXIgcHJlID0gZWx0KFwicHJlXCIsIFthbmNob3JdKTtcbiAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5tZWFzdXJlLCBwcmUpO1xuICB2YXIgcmVjdCA9IGFuY2hvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgd2lkdGggPSAocmVjdC5yaWdodCAtIHJlY3QubGVmdCkgLyAxMDtcbiAgaWYgKHdpZHRoID4gMikgeyBkaXNwbGF5LmNhY2hlZENoYXJXaWR0aCA9IHdpZHRoOyB9XG4gIHJldHVybiB3aWR0aCB8fCAxMFxufVxuXG4vLyBEbyBhIGJ1bGstcmVhZCBvZiB0aGUgRE9NIHBvc2l0aW9ucyBhbmQgc2l6ZXMgbmVlZGVkIHRvIGRyYXcgdGhlXG4vLyB2aWV3LCBzbyB0aGF0IHdlIGRvbid0IGludGVybGVhdmUgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgRE9NLlxuZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhjbSkge1xuICB2YXIgZCA9IGNtLmRpc3BsYXksIGxlZnQgPSB7fSwgd2lkdGggPSB7fTtcbiAgdmFyIGd1dHRlckxlZnQgPSBkLmd1dHRlcnMuY2xpZW50TGVmdDtcbiAgZm9yICh2YXIgbiA9IGQuZ3V0dGVycy5maXJzdENoaWxkLCBpID0gMDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcsICsraSkge1xuICAgIGxlZnRbY20ub3B0aW9ucy5ndXR0ZXJzW2ldXSA9IG4ub2Zmc2V0TGVmdCArIG4uY2xpZW50TGVmdCArIGd1dHRlckxlZnQ7XG4gICAgd2lkdGhbY20ub3B0aW9ucy5ndXR0ZXJzW2ldXSA9IG4uY2xpZW50V2lkdGg7XG4gIH1cbiAgcmV0dXJuIHtmaXhlZFBvczogY29tcGVuc2F0ZUZvckhTY3JvbGwoZCksXG4gICAgICAgICAgZ3V0dGVyVG90YWxXaWR0aDogZC5ndXR0ZXJzLm9mZnNldFdpZHRoLFxuICAgICAgICAgIGd1dHRlckxlZnQ6IGxlZnQsXG4gICAgICAgICAgZ3V0dGVyV2lkdGg6IHdpZHRoLFxuICAgICAgICAgIHdyYXBwZXJXaWR0aDogZC53cmFwcGVyLmNsaWVudFdpZHRofVxufVxuXG4vLyBDb21wdXRlcyBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQgKyBkaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGgsXG4vLyBidXQgdXNpbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IHRvIGdldCBhIHN1Yi1waXhlbC1hY2N1cmF0ZVxuLy8gcmVzdWx0LlxuZnVuY3Rpb24gY29tcGVuc2F0ZUZvckhTY3JvbGwoZGlzcGxheSkge1xuICByZXR1cm4gZGlzcGxheS5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZGlzcGxheS5zaXplci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0XG59XG5cbi8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGVzdGltYXRlcyB0aGUgaGVpZ2h0IG9mIGEgbGluZSwgdG8gdXNlIGFzXG4vLyBmaXJzdCBhcHByb3hpbWF0aW9uIHVudGlsIHRoZSBsaW5lIGJlY29tZXMgdmlzaWJsZSAoYW5kIGlzIHRodXNcbi8vIHByb3Blcmx5IG1lYXN1cmFibGUpLlxuZnVuY3Rpb24gZXN0aW1hdGVIZWlnaHQoY20pIHtcbiAgdmFyIHRoID0gdGV4dEhlaWdodChjbS5kaXNwbGF5KSwgd3JhcHBpbmcgPSBjbS5vcHRpb25zLmxpbmVXcmFwcGluZztcbiAgdmFyIHBlckxpbmUgPSB3cmFwcGluZyAmJiBNYXRoLm1heCg1LCBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoIC8gY2hhcldpZHRoKGNtLmRpc3BsYXkpIC0gMyk7XG4gIHJldHVybiBmdW5jdGlvbiAobGluZSkge1xuICAgIGlmIChsaW5lSXNIaWRkZW4oY20uZG9jLCBsaW5lKSkgeyByZXR1cm4gMCB9XG5cbiAgICB2YXIgd2lkZ2V0c0hlaWdodCA9IDA7XG4gICAgaWYgKGxpbmUud2lkZ2V0cykgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUud2lkZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxpbmUud2lkZ2V0c1tpXS5oZWlnaHQpIHsgd2lkZ2V0c0hlaWdodCArPSBsaW5lLndpZGdldHNbaV0uaGVpZ2h0OyB9XG4gICAgfSB9XG5cbiAgICBpZiAod3JhcHBpbmcpXG4gICAgICB7IHJldHVybiB3aWRnZXRzSGVpZ2h0ICsgKE1hdGguY2VpbChsaW5lLnRleHQubGVuZ3RoIC8gcGVyTGluZSkgfHwgMSkgKiB0aCB9XG4gICAgZWxzZVxuICAgICAgeyByZXR1cm4gd2lkZ2V0c0hlaWdodCArIHRoIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlc3RpbWF0ZUxpbmVIZWlnaHRzKGNtKSB7XG4gIHZhciBkb2MgPSBjbS5kb2MsIGVzdCA9IGVzdGltYXRlSGVpZ2h0KGNtKTtcbiAgZG9jLml0ZXIoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICB2YXIgZXN0SGVpZ2h0ID0gZXN0KGxpbmUpO1xuICAgIGlmIChlc3RIZWlnaHQgIT0gbGluZS5oZWlnaHQpIHsgdXBkYXRlTGluZUhlaWdodChsaW5lLCBlc3RIZWlnaHQpOyB9XG4gIH0pO1xufVxuXG4vLyBHaXZlbiBhIG1vdXNlIGV2ZW50LCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIHBvc2l0aW9uLiBJZiBsaWJlcmFsXG4vLyBpcyBmYWxzZSwgaXQgY2hlY2tzIHdoZXRoZXIgYSBndXR0ZXIgb3Igc2Nyb2xsYmFyIHdhcyBjbGlja2VkLFxuLy8gYW5kIHJldHVybnMgbnVsbCBpZiBpdCB3YXMuIGZvclJlY3QgaXMgdXNlZCBieSByZWN0YW5ndWxhclxuLy8gc2VsZWN0aW9ucywgYW5kIHRyaWVzIHRvIGVzdGltYXRlIGEgY2hhcmFjdGVyIHBvc2l0aW9uIGV2ZW4gZm9yXG4vLyBjb29yZGluYXRlcyBiZXlvbmQgdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0LlxuZnVuY3Rpb24gcG9zRnJvbU1vdXNlKGNtLCBlLCBsaWJlcmFsLCBmb3JSZWN0KSB7XG4gIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgaWYgKCFsaWJlcmFsICYmIGVfdGFyZ2V0KGUpLmdldEF0dHJpYnV0ZShcImNtLW5vdC1jb250ZW50XCIpID09IFwidHJ1ZVwiKSB7IHJldHVybiBudWxsIH1cblxuICB2YXIgeCwgeSwgc3BhY2UgPSBkaXNwbGF5LmxpbmVTcGFjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgLy8gRmFpbHMgdW5wcmVkaWN0YWJseSBvbiBJRVs2N10gd2hlbiBtb3VzZSBpcyBkcmFnZ2VkIGFyb3VuZCBxdWlja2x5LlxuICB0cnkgeyB4ID0gZS5jbGllbnRYIC0gc3BhY2UubGVmdDsgeSA9IGUuY2xpZW50WSAtIHNwYWNlLnRvcDsgfVxuICBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbCB9XG4gIHZhciBjb29yZHMgPSBjb29yZHNDaGFyKGNtLCB4LCB5KSwgbGluZTtcbiAgaWYgKGZvclJlY3QgJiYgY29vcmRzLnhSZWwgPT0gMSAmJiAobGluZSA9IGdldExpbmUoY20uZG9jLCBjb29yZHMubGluZSkudGV4dCkubGVuZ3RoID09IGNvb3Jkcy5jaCkge1xuICAgIHZhciBjb2xEaWZmID0gY291bnRDb2x1bW4obGluZSwgbGluZS5sZW5ndGgsIGNtLm9wdGlvbnMudGFiU2l6ZSkgLSBsaW5lLmxlbmd0aDtcbiAgICBjb29yZHMgPSBQb3MoY29vcmRzLmxpbmUsIE1hdGgubWF4KDAsIE1hdGgucm91bmQoKHggLSBwYWRkaW5nSChjbS5kaXNwbGF5KS5sZWZ0KSAvIGNoYXJXaWR0aChjbS5kaXNwbGF5KSkgLSBjb2xEaWZmKSk7XG4gIH1cbiAgcmV0dXJuIGNvb3Jkc1xufVxuXG4vLyBGaW5kIHRoZSB2aWV3IGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGxpbmUuIFJldHVybiBudWxsXG4vLyB3aGVuIHRoZSBsaW5lIGlzbid0IHZpc2libGUuXG5mdW5jdGlvbiBmaW5kVmlld0luZGV4KGNtLCBuKSB7XG4gIGlmIChuID49IGNtLmRpc3BsYXkudmlld1RvKSB7IHJldHVybiBudWxsIH1cbiAgbiAtPSBjbS5kaXNwbGF5LnZpZXdGcm9tO1xuICBpZiAobiA8IDApIHsgcmV0dXJuIG51bGwgfVxuICB2YXIgdmlldyA9IGNtLmRpc3BsYXkudmlldztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgbiAtPSB2aWV3W2ldLnNpemU7XG4gICAgaWYgKG4gPCAwKSB7IHJldHVybiBpIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTZWxlY3Rpb24oY20pIHtcbiAgY20uZGlzcGxheS5pbnB1dC5zaG93U2VsZWN0aW9uKGNtLmRpc3BsYXkuaW5wdXQucHJlcGFyZVNlbGVjdGlvbigpKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVNlbGVjdGlvbihjbSwgcHJpbWFyeSkge1xuICBpZiAoIHByaW1hcnkgPT09IHZvaWQgMCApIHByaW1hcnkgPSB0cnVlO1xuXG4gIHZhciBkb2MgPSBjbS5kb2MsIHJlc3VsdCA9IHt9O1xuICB2YXIgY3VyRnJhZ21lbnQgPSByZXN1bHQuY3Vyc29ycyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgdmFyIHNlbEZyYWdtZW50ID0gcmVzdWx0LnNlbGVjdGlvbiA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFwcmltYXJ5ICYmIGkgPT0gZG9jLnNlbC5wcmltSW5kZXgpIHsgY29udGludWUgfVxuICAgIHZhciByYW5nZSQkMSA9IGRvYy5zZWwucmFuZ2VzW2ldO1xuICAgIGlmIChyYW5nZSQkMS5mcm9tKCkubGluZSA+PSBjbS5kaXNwbGF5LnZpZXdUbyB8fCByYW5nZSQkMS50bygpLmxpbmUgPCBjbS5kaXNwbGF5LnZpZXdGcm9tKSB7IGNvbnRpbnVlIH1cbiAgICB2YXIgY29sbGFwc2VkID0gcmFuZ2UkJDEuZW1wdHkoKTtcbiAgICBpZiAoY29sbGFwc2VkIHx8IGNtLm9wdGlvbnMuc2hvd0N1cnNvcldoZW5TZWxlY3RpbmcpXG4gICAgICB7IGRyYXdTZWxlY3Rpb25DdXJzb3IoY20sIHJhbmdlJCQxLmhlYWQsIGN1ckZyYWdtZW50KTsgfVxuICAgIGlmICghY29sbGFwc2VkKVxuICAgICAgeyBkcmF3U2VsZWN0aW9uUmFuZ2UoY20sIHJhbmdlJCQxLCBzZWxGcmFnbWVudCk7IH1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIERyYXdzIGEgY3Vyc29yIGZvciB0aGUgZ2l2ZW4gcmFuZ2VcbmZ1bmN0aW9uIGRyYXdTZWxlY3Rpb25DdXJzb3IoY20sIGhlYWQsIG91dHB1dCkge1xuICB2YXIgcG9zID0gY3Vyc29yQ29vcmRzKGNtLCBoZWFkLCBcImRpdlwiLCBudWxsLCBudWxsLCAhY20ub3B0aW9ucy5zaW5nbGVDdXJzb3JIZWlnaHRQZXJMaW5lKTtcblxuICB2YXIgY3Vyc29yID0gb3V0cHV0LmFwcGVuZENoaWxkKGVsdChcImRpdlwiLCBcIlxcdTAwYTBcIiwgXCJDb2RlTWlycm9yLWN1cnNvclwiKSk7XG4gIGN1cnNvci5zdHlsZS5sZWZ0ID0gcG9zLmxlZnQgKyBcInB4XCI7XG4gIGN1cnNvci5zdHlsZS50b3AgPSBwb3MudG9wICsgXCJweFwiO1xuICBjdXJzb3Iuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgoMCwgcG9zLmJvdHRvbSAtIHBvcy50b3ApICogY20ub3B0aW9ucy5jdXJzb3JIZWlnaHQgKyBcInB4XCI7XG5cbiAgaWYgKHBvcy5vdGhlcikge1xuICAgIC8vIFNlY29uZGFyeSBjdXJzb3IsIHNob3duIHdoZW4gb24gYSAnanVtcCcgaW4gYmktZGlyZWN0aW9uYWwgdGV4dFxuICAgIHZhciBvdGhlckN1cnNvciA9IG91dHB1dC5hcHBlbmRDaGlsZChlbHQoXCJkaXZcIiwgXCJcXHUwMGEwXCIsIFwiQ29kZU1pcnJvci1jdXJzb3IgQ29kZU1pcnJvci1zZWNvbmRhcnljdXJzb3JcIikpO1xuICAgIG90aGVyQ3Vyc29yLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgIG90aGVyQ3Vyc29yLnN0eWxlLmxlZnQgPSBwb3Mub3RoZXIubGVmdCArIFwicHhcIjtcbiAgICBvdGhlckN1cnNvci5zdHlsZS50b3AgPSBwb3Mub3RoZXIudG9wICsgXCJweFwiO1xuICAgIG90aGVyQ3Vyc29yLnN0eWxlLmhlaWdodCA9IChwb3Mub3RoZXIuYm90dG9tIC0gcG9zLm90aGVyLnRvcCkgKiAuODUgKyBcInB4XCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY21wQ29vcmRzKGEsIGIpIHsgcmV0dXJuIGEudG9wIC0gYi50b3AgfHwgYS5sZWZ0IC0gYi5sZWZ0IH1cblxuLy8gRHJhd3MgdGhlIGdpdmVuIHJhbmdlIGFzIGEgaGlnaGxpZ2h0ZWQgc2VsZWN0aW9uXG5mdW5jdGlvbiBkcmF3U2VsZWN0aW9uUmFuZ2UoY20sIHJhbmdlJCQxLCBvdXRwdXQpIHtcbiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2M7XG4gIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgdmFyIHBhZGRpbmcgPSBwYWRkaW5nSChjbS5kaXNwbGF5KSwgbGVmdFNpZGUgPSBwYWRkaW5nLmxlZnQ7XG4gIHZhciByaWdodFNpZGUgPSBNYXRoLm1heChkaXNwbGF5LnNpemVyV2lkdGgsIGRpc3BsYXlXaWR0aChjbSkgLSBkaXNwbGF5LnNpemVyLm9mZnNldExlZnQpIC0gcGFkZGluZy5yaWdodDtcbiAgdmFyIGRvY0xUUiA9IGRvYy5kaXJlY3Rpb24gPT0gXCJsdHJcIjtcblxuICBmdW5jdGlvbiBhZGQobGVmdCwgdG9wLCB3aWR0aCwgYm90dG9tKSB7XG4gICAgaWYgKHRvcCA8IDApIHsgdG9wID0gMDsgfVxuICAgIHRvcCA9IE1hdGgucm91bmQodG9wKTtcbiAgICBib3R0b20gPSBNYXRoLnJvdW5kKGJvdHRvbSk7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1zZWxlY3RlZFwiLCAoXCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IFwiICsgbGVmdCArIFwicHg7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IFwiICsgdG9wICsgXCJweDsgd2lkdGg6IFwiICsgKHdpZHRoID09IG51bGwgPyByaWdodFNpZGUgLSBsZWZ0IDogd2lkdGgpICsgXCJweDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogXCIgKyAoYm90dG9tIC0gdG9wKSArIFwicHhcIikpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRyYXdGb3JMaW5lKGxpbmUsIGZyb21BcmcsIHRvQXJnKSB7XG4gICAgdmFyIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbGluZSk7XG4gICAgdmFyIGxpbmVMZW4gPSBsaW5lT2JqLnRleHQubGVuZ3RoO1xuICAgIHZhciBzdGFydCwgZW5kO1xuICAgIGZ1bmN0aW9uIGNvb3JkcyhjaCwgYmlhcykge1xuICAgICAgcmV0dXJuIGNoYXJDb29yZHMoY20sIFBvcyhsaW5lLCBjaCksIFwiZGl2XCIsIGxpbmVPYmosIGJpYXMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd3JhcFgocG9zLCBkaXIsIHNpZGUpIHtcbiAgICAgIHZhciBleHRlbnQgPSB3cmFwcGVkTGluZUV4dGVudENoYXIoY20sIGxpbmVPYmosIG51bGwsIHBvcyk7XG4gICAgICB2YXIgcHJvcCA9IChkaXIgPT0gXCJsdHJcIikgPT0gKHNpZGUgPT0gXCJhZnRlclwiKSA/IFwibGVmdFwiIDogXCJyaWdodFwiO1xuICAgICAgdmFyIGNoID0gc2lkZSA9PSBcImFmdGVyXCIgPyBleHRlbnQuYmVnaW4gOiBleHRlbnQuZW5kIC0gKC9cXHMvLnRlc3QobGluZU9iai50ZXh0LmNoYXJBdChleHRlbnQuZW5kIC0gMSkpID8gMiA6IDEpO1xuICAgICAgcmV0dXJuIGNvb3JkcyhjaCwgcHJvcClbcHJvcF1cbiAgICB9XG5cbiAgICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lT2JqLCBkb2MuZGlyZWN0aW9uKTtcbiAgICBpdGVyYXRlQmlkaVNlY3Rpb25zKG9yZGVyLCBmcm9tQXJnIHx8IDAsIHRvQXJnID09IG51bGwgPyBsaW5lTGVuIDogdG9BcmcsIGZ1bmN0aW9uIChmcm9tLCB0bywgZGlyLCBpKSB7XG4gICAgICB2YXIgbHRyID0gZGlyID09IFwibHRyXCI7XG4gICAgICB2YXIgZnJvbVBvcyA9IGNvb3Jkcyhmcm9tLCBsdHIgPyBcImxlZnRcIiA6IFwicmlnaHRcIik7XG4gICAgICB2YXIgdG9Qb3MgPSBjb29yZHModG8gLSAxLCBsdHIgPyBcInJpZ2h0XCIgOiBcImxlZnRcIik7XG5cbiAgICAgIHZhciBvcGVuU3RhcnQgPSBmcm9tQXJnID09IG51bGwgJiYgZnJvbSA9PSAwLCBvcGVuRW5kID0gdG9BcmcgPT0gbnVsbCAmJiB0byA9PSBsaW5lTGVuO1xuICAgICAgdmFyIGZpcnN0ID0gaSA9PSAwLCBsYXN0ID0gIW9yZGVyIHx8IGkgPT0gb3JkZXIubGVuZ3RoIC0gMTtcbiAgICAgIGlmICh0b1Bvcy50b3AgLSBmcm9tUG9zLnRvcCA8PSAzKSB7IC8vIFNpbmdsZSBsaW5lXG4gICAgICAgIHZhciBvcGVuTGVmdCA9IChkb2NMVFIgPyBvcGVuU3RhcnQgOiBvcGVuRW5kKSAmJiBmaXJzdDtcbiAgICAgICAgdmFyIG9wZW5SaWdodCA9IChkb2NMVFIgPyBvcGVuRW5kIDogb3BlblN0YXJ0KSAmJiBsYXN0O1xuICAgICAgICB2YXIgbGVmdCA9IG9wZW5MZWZ0ID8gbGVmdFNpZGUgOiAobHRyID8gZnJvbVBvcyA6IHRvUG9zKS5sZWZ0O1xuICAgICAgICB2YXIgcmlnaHQgPSBvcGVuUmlnaHQgPyByaWdodFNpZGUgOiAobHRyID8gdG9Qb3MgOiBmcm9tUG9zKS5yaWdodDtcbiAgICAgICAgYWRkKGxlZnQsIGZyb21Qb3MudG9wLCByaWdodCAtIGxlZnQsIGZyb21Qb3MuYm90dG9tKTtcbiAgICAgIH0gZWxzZSB7IC8vIE11bHRpcGxlIGxpbmVzXG4gICAgICAgIHZhciB0b3BMZWZ0LCB0b3BSaWdodCwgYm90TGVmdCwgYm90UmlnaHQ7XG4gICAgICAgIGlmIChsdHIpIHtcbiAgICAgICAgICB0b3BMZWZ0ID0gZG9jTFRSICYmIG9wZW5TdGFydCAmJiBmaXJzdCA/IGxlZnRTaWRlIDogZnJvbVBvcy5sZWZ0O1xuICAgICAgICAgIHRvcFJpZ2h0ID0gZG9jTFRSID8gcmlnaHRTaWRlIDogd3JhcFgoZnJvbSwgZGlyLCBcImJlZm9yZVwiKTtcbiAgICAgICAgICBib3RMZWZ0ID0gZG9jTFRSID8gbGVmdFNpZGUgOiB3cmFwWCh0bywgZGlyLCBcImFmdGVyXCIpO1xuICAgICAgICAgIGJvdFJpZ2h0ID0gZG9jTFRSICYmIG9wZW5FbmQgJiYgbGFzdCA/IHJpZ2h0U2lkZSA6IHRvUG9zLnJpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvcExlZnQgPSAhZG9jTFRSID8gbGVmdFNpZGUgOiB3cmFwWChmcm9tLCBkaXIsIFwiYmVmb3JlXCIpO1xuICAgICAgICAgIHRvcFJpZ2h0ID0gIWRvY0xUUiAmJiBvcGVuU3RhcnQgJiYgZmlyc3QgPyByaWdodFNpZGUgOiBmcm9tUG9zLnJpZ2h0O1xuICAgICAgICAgIGJvdExlZnQgPSAhZG9jTFRSICYmIG9wZW5FbmQgJiYgbGFzdCA/IGxlZnRTaWRlIDogdG9Qb3MubGVmdDtcbiAgICAgICAgICBib3RSaWdodCA9ICFkb2NMVFIgPyByaWdodFNpZGUgOiB3cmFwWCh0bywgZGlyLCBcImFmdGVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGFkZCh0b3BMZWZ0LCBmcm9tUG9zLnRvcCwgdG9wUmlnaHQgLSB0b3BMZWZ0LCBmcm9tUG9zLmJvdHRvbSk7XG4gICAgICAgIGlmIChmcm9tUG9zLmJvdHRvbSA8IHRvUG9zLnRvcCkgeyBhZGQobGVmdFNpZGUsIGZyb21Qb3MuYm90dG9tLCBudWxsLCB0b1Bvcy50b3ApOyB9XG4gICAgICAgIGFkZChib3RMZWZ0LCB0b1Bvcy50b3AsIGJvdFJpZ2h0IC0gYm90TGVmdCwgdG9Qb3MuYm90dG9tKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdGFydCB8fCBjbXBDb29yZHMoZnJvbVBvcywgc3RhcnQpIDwgMCkgeyBzdGFydCA9IGZyb21Qb3M7IH1cbiAgICAgIGlmIChjbXBDb29yZHModG9Qb3MsIHN0YXJ0KSA8IDApIHsgc3RhcnQgPSB0b1BvczsgfVxuICAgICAgaWYgKCFlbmQgfHwgY21wQ29vcmRzKGZyb21Qb3MsIGVuZCkgPCAwKSB7IGVuZCA9IGZyb21Qb3M7IH1cbiAgICAgIGlmIChjbXBDb29yZHModG9Qb3MsIGVuZCkgPCAwKSB7IGVuZCA9IHRvUG9zOyB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtzdGFydDogc3RhcnQsIGVuZDogZW5kfVxuICB9XG5cbiAgdmFyIHNGcm9tID0gcmFuZ2UkJDEuZnJvbSgpLCBzVG8gPSByYW5nZSQkMS50bygpO1xuICBpZiAoc0Zyb20ubGluZSA9PSBzVG8ubGluZSkge1xuICAgIGRyYXdGb3JMaW5lKHNGcm9tLmxpbmUsIHNGcm9tLmNoLCBzVG8uY2gpO1xuICB9IGVsc2Uge1xuICAgIHZhciBmcm9tTGluZSA9IGdldExpbmUoZG9jLCBzRnJvbS5saW5lKSwgdG9MaW5lID0gZ2V0TGluZShkb2MsIHNUby5saW5lKTtcbiAgICB2YXIgc2luZ2xlVkxpbmUgPSB2aXN1YWxMaW5lKGZyb21MaW5lKSA9PSB2aXN1YWxMaW5lKHRvTGluZSk7XG4gICAgdmFyIGxlZnRFbmQgPSBkcmF3Rm9yTGluZShzRnJvbS5saW5lLCBzRnJvbS5jaCwgc2luZ2xlVkxpbmUgPyBmcm9tTGluZS50ZXh0Lmxlbmd0aCArIDEgOiBudWxsKS5lbmQ7XG4gICAgdmFyIHJpZ2h0U3RhcnQgPSBkcmF3Rm9yTGluZShzVG8ubGluZSwgc2luZ2xlVkxpbmUgPyAwIDogbnVsbCwgc1RvLmNoKS5zdGFydDtcbiAgICBpZiAoc2luZ2xlVkxpbmUpIHtcbiAgICAgIGlmIChsZWZ0RW5kLnRvcCA8IHJpZ2h0U3RhcnQudG9wIC0gMikge1xuICAgICAgICBhZGQobGVmdEVuZC5yaWdodCwgbGVmdEVuZC50b3AsIG51bGwsIGxlZnRFbmQuYm90dG9tKTtcbiAgICAgICAgYWRkKGxlZnRTaWRlLCByaWdodFN0YXJ0LnRvcCwgcmlnaHRTdGFydC5sZWZ0LCByaWdodFN0YXJ0LmJvdHRvbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGQobGVmdEVuZC5yaWdodCwgbGVmdEVuZC50b3AsIHJpZ2h0U3RhcnQubGVmdCAtIGxlZnRFbmQucmlnaHQsIGxlZnRFbmQuYm90dG9tKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxlZnRFbmQuYm90dG9tIDwgcmlnaHRTdGFydC50b3ApXG4gICAgICB7IGFkZChsZWZ0U2lkZSwgbGVmdEVuZC5ib3R0b20sIG51bGwsIHJpZ2h0U3RhcnQudG9wKTsgfVxuICB9XG5cbiAgb3V0cHV0LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbn1cblxuLy8gQ3Vyc29yLWJsaW5raW5nXG5mdW5jdGlvbiByZXN0YXJ0QmxpbmsoY20pIHtcbiAgaWYgKCFjbS5zdGF0ZS5mb2N1c2VkKSB7IHJldHVybiB9XG4gIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgY2xlYXJJbnRlcnZhbChkaXNwbGF5LmJsaW5rZXIpO1xuICB2YXIgb24gPSB0cnVlO1xuICBkaXNwbGF5LmN1cnNvckRpdi5zdHlsZS52aXNpYmlsaXR5ID0gXCJcIjtcbiAgaWYgKGNtLm9wdGlvbnMuY3Vyc29yQmxpbmtSYXRlID4gMClcbiAgICB7IGRpc3BsYXkuYmxpbmtlciA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRpc3BsYXkuY3Vyc29yRGl2LnN0eWxlLnZpc2liaWxpdHkgPSAob24gPSAhb24pID8gXCJcIiA6IFwiaGlkZGVuXCI7IH0sXG4gICAgICBjbS5vcHRpb25zLmN1cnNvckJsaW5rUmF0ZSk7IH1cbiAgZWxzZSBpZiAoY20ub3B0aW9ucy5jdXJzb3JCbGlua1JhdGUgPCAwKVxuICAgIHsgZGlzcGxheS5jdXJzb3JEaXYuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7IH1cbn1cblxuZnVuY3Rpb24gZW5zdXJlRm9jdXMoY20pIHtcbiAgaWYgKCFjbS5zdGF0ZS5mb2N1c2VkKSB7IGNtLmRpc3BsYXkuaW5wdXQuZm9jdXMoKTsgb25Gb2N1cyhjbSk7IH1cbn1cblxuZnVuY3Rpb24gZGVsYXlCbHVyRXZlbnQoY20pIHtcbiAgY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQgPSB0cnVlO1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaWYgKGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50KSB7XG4gICAgY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQgPSBmYWxzZTtcbiAgICBvbkJsdXIoY20pO1xuICB9IH0sIDEwMCk7XG59XG5cbmZ1bmN0aW9uIG9uRm9jdXMoY20sIGUpIHtcbiAgaWYgKGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50KSB7IGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50ID0gZmFsc2U7IH1cblxuICBpZiAoY20ub3B0aW9ucy5yZWFkT25seSA9PSBcIm5vY3Vyc29yXCIpIHsgcmV0dXJuIH1cbiAgaWYgKCFjbS5zdGF0ZS5mb2N1c2VkKSB7XG4gICAgc2lnbmFsKGNtLCBcImZvY3VzXCIsIGNtLCBlKTtcbiAgICBjbS5zdGF0ZS5mb2N1c2VkID0gdHJ1ZTtcbiAgICBhZGRDbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsIFwiQ29kZU1pcnJvci1mb2N1c2VkXCIpO1xuICAgIC8vIFRoaXMgdGVzdCBwcmV2ZW50cyB0aGlzIGZyb20gZmlyaW5nIHdoZW4gYSBjb250ZXh0XG4gICAgLy8gbWVudSBpcyBjbG9zZWQgKHNpbmNlIHRoZSBpbnB1dCByZXNldCB3b3VsZCBraWxsIHRoZVxuICAgIC8vIHNlbGVjdC1hbGwgZGV0ZWN0aW9uIGhhY2spXG4gICAgaWYgKCFjbS5jdXJPcCAmJiBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ICE9IGNtLmRvYy5zZWwpIHtcbiAgICAgIGNtLmRpc3BsYXkuaW5wdXQucmVzZXQoKTtcbiAgICAgIGlmICh3ZWJraXQpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBjbS5kaXNwbGF5LmlucHV0LnJlc2V0KHRydWUpOyB9LCAyMCk7IH0gLy8gSXNzdWUgIzE3MzBcbiAgICB9XG4gICAgY20uZGlzcGxheS5pbnB1dC5yZWNlaXZlZEZvY3VzKCk7XG4gIH1cbiAgcmVzdGFydEJsaW5rKGNtKTtcbn1cbmZ1bmN0aW9uIG9uQmx1cihjbSwgZSkge1xuICBpZiAoY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQpIHsgcmV0dXJuIH1cblxuICBpZiAoY20uc3RhdGUuZm9jdXNlZCkge1xuICAgIHNpZ25hbChjbSwgXCJibHVyXCIsIGNtLCBlKTtcbiAgICBjbS5zdGF0ZS5mb2N1c2VkID0gZmFsc2U7XG4gICAgcm1DbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsIFwiQ29kZU1pcnJvci1mb2N1c2VkXCIpO1xuICB9XG4gIGNsZWFySW50ZXJ2YWwoY20uZGlzcGxheS5ibGlua2VyKTtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlmICghY20uc3RhdGUuZm9jdXNlZCkgeyBjbS5kaXNwbGF5LnNoaWZ0ID0gZmFsc2U7IH0gfSwgMTUwKTtcbn1cblxuLy8gUmVhZCB0aGUgYWN0dWFsIGhlaWdodHMgb2YgdGhlIHJlbmRlcmVkIGxpbmVzLCBhbmQgdXBkYXRlIHRoZWlyXG4vLyBzdG9yZWQgaGVpZ2h0cyB0byBtYXRjaC5cbmZ1bmN0aW9uIHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0KGNtKSB7XG4gIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgdmFyIHByZXZCb3R0b20gPSBkaXNwbGF5LmxpbmVEaXYub2Zmc2V0VG9wO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BsYXkudmlldy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjdXIgPSBkaXNwbGF5LnZpZXdbaV0sIGhlaWdodCA9ICh2b2lkIDApO1xuICAgIGlmIChjdXIuaGlkZGVuKSB7IGNvbnRpbnVlIH1cbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIHtcbiAgICAgIHZhciBib3QgPSBjdXIubm9kZS5vZmZzZXRUb3AgKyBjdXIubm9kZS5vZmZzZXRIZWlnaHQ7XG4gICAgICBoZWlnaHQgPSBib3QgLSBwcmV2Qm90dG9tO1xuICAgICAgcHJldkJvdHRvbSA9IGJvdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJveCA9IGN1ci5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaGVpZ2h0ID0gYm94LmJvdHRvbSAtIGJveC50b3A7XG4gICAgfVxuICAgIHZhciBkaWZmID0gY3VyLmxpbmUuaGVpZ2h0IC0gaGVpZ2h0O1xuICAgIGlmIChoZWlnaHQgPCAyKSB7IGhlaWdodCA9IHRleHRIZWlnaHQoZGlzcGxheSk7IH1cbiAgICBpZiAoZGlmZiA+IC4wMDUgfHwgZGlmZiA8IC0uMDA1KSB7XG4gICAgICB1cGRhdGVMaW5lSGVpZ2h0KGN1ci5saW5lLCBoZWlnaHQpO1xuICAgICAgdXBkYXRlV2lkZ2V0SGVpZ2h0KGN1ci5saW5lKTtcbiAgICAgIGlmIChjdXIucmVzdCkgeyBmb3IgKHZhciBqID0gMDsgaiA8IGN1ci5yZXN0Lmxlbmd0aDsgaisrKVxuICAgICAgICB7IHVwZGF0ZVdpZGdldEhlaWdodChjdXIucmVzdFtqXSk7IH0gfVxuICAgIH1cbiAgfVxufVxuXG4vLyBSZWFkIGFuZCBzdG9yZSB0aGUgaGVpZ2h0IG9mIGxpbmUgd2lkZ2V0cyBhc3NvY2lhdGVkIHdpdGggdGhlXG4vLyBnaXZlbiBsaW5lLlxuZnVuY3Rpb24gdXBkYXRlV2lkZ2V0SGVpZ2h0KGxpbmUpIHtcbiAgaWYgKGxpbmUud2lkZ2V0cykgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUud2lkZ2V0cy5sZW5ndGg7ICsraSkge1xuICAgIHZhciB3ID0gbGluZS53aWRnZXRzW2ldLCBwYXJlbnQgPSB3Lm5vZGUucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50KSB7IHcuaGVpZ2h0ID0gcGFyZW50Lm9mZnNldEhlaWdodDsgfVxuICB9IH1cbn1cblxuLy8gQ29tcHV0ZSB0aGUgbGluZXMgdGhhdCBhcmUgdmlzaWJsZSBpbiBhIGdpdmVuIHZpZXdwb3J0IChkZWZhdWx0c1xuLy8gdGhlIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbikuIHZpZXdwb3J0IG1heSBjb250YWluIHRvcCxcbi8vIGhlaWdodCwgYW5kIGVuc3VyZSAoc2VlIG9wLnNjcm9sbFRvUG9zKSBwcm9wZXJ0aWVzLlxuZnVuY3Rpb24gdmlzaWJsZUxpbmVzKGRpc3BsYXksIGRvYywgdmlld3BvcnQpIHtcbiAgdmFyIHRvcCA9IHZpZXdwb3J0ICYmIHZpZXdwb3J0LnRvcCAhPSBudWxsID8gTWF0aC5tYXgoMCwgdmlld3BvcnQudG9wKSA6IGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wO1xuICB0b3AgPSBNYXRoLmZsb29yKHRvcCAtIHBhZGRpbmdUb3AoZGlzcGxheSkpO1xuICB2YXIgYm90dG9tID0gdmlld3BvcnQgJiYgdmlld3BvcnQuYm90dG9tICE9IG51bGwgPyB2aWV3cG9ydC5ib3R0b20gOiB0b3AgKyBkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0O1xuXG4gIHZhciBmcm9tID0gbGluZUF0SGVpZ2h0KGRvYywgdG9wKSwgdG8gPSBsaW5lQXRIZWlnaHQoZG9jLCBib3R0b20pO1xuICAvLyBFbnN1cmUgaXMgYSB7ZnJvbToge2xpbmUsIGNofSwgdG86IHtsaW5lLCBjaH19IG9iamVjdCwgYW5kXG4gIC8vIGZvcmNlcyB0aG9zZSBsaW5lcyBpbnRvIHRoZSB2aWV3cG9ydCAoaWYgcG9zc2libGUpLlxuICBpZiAodmlld3BvcnQgJiYgdmlld3BvcnQuZW5zdXJlKSB7XG4gICAgdmFyIGVuc3VyZUZyb20gPSB2aWV3cG9ydC5lbnN1cmUuZnJvbS5saW5lLCBlbnN1cmVUbyA9IHZpZXdwb3J0LmVuc3VyZS50by5saW5lO1xuICAgIGlmIChlbnN1cmVGcm9tIDwgZnJvbSkge1xuICAgICAgZnJvbSA9IGVuc3VyZUZyb207XG4gICAgICB0byA9IGxpbmVBdEhlaWdodChkb2MsIGhlaWdodEF0TGluZShnZXRMaW5lKGRvYywgZW5zdXJlRnJvbSkpICsgZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCk7XG4gICAgfSBlbHNlIGlmIChNYXRoLm1pbihlbnN1cmVUbywgZG9jLmxhc3RMaW5lKCkpID49IHRvKSB7XG4gICAgICBmcm9tID0gbGluZUF0SGVpZ2h0KGRvYywgaGVpZ2h0QXRMaW5lKGdldExpbmUoZG9jLCBlbnN1cmVUbykpIC0gZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCk7XG4gICAgICB0byA9IGVuc3VyZVRvO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge2Zyb206IGZyb20sIHRvOiBNYXRoLm1heCh0bywgZnJvbSArIDEpfVxufVxuXG4vLyBSZS1hbGlnbiBsaW5lIG51bWJlcnMgYW5kIGd1dHRlciBtYXJrcyB0byBjb21wZW5zYXRlIGZvclxuLy8gaG9yaXpvbnRhbCBzY3JvbGxpbmcuXG5mdW5jdGlvbiBhbGlnbkhvcml6b250YWxseShjbSkge1xuICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIHZpZXcgPSBkaXNwbGF5LnZpZXc7XG4gIGlmICghZGlzcGxheS5hbGlnbldpZGdldHMgJiYgKCFkaXNwbGF5Lmd1dHRlcnMuZmlyc3RDaGlsZCB8fCAhY20ub3B0aW9ucy5maXhlZEd1dHRlcikpIHsgcmV0dXJuIH1cbiAgdmFyIGNvbXAgPSBjb21wZW5zYXRlRm9ySFNjcm9sbChkaXNwbGF5KSAtIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCArIGNtLmRvYy5zY3JvbGxMZWZ0O1xuICB2YXIgZ3V0dGVyVyA9IGRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aCwgbGVmdCA9IGNvbXAgKyBcInB4XCI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykgeyBpZiAoIXZpZXdbaV0uaGlkZGVuKSB7XG4gICAgaWYgKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIpIHtcbiAgICAgIGlmICh2aWV3W2ldLmd1dHRlcilcbiAgICAgICAgeyB2aWV3W2ldLmd1dHRlci5zdHlsZS5sZWZ0ID0gbGVmdDsgfVxuICAgICAgaWYgKHZpZXdbaV0uZ3V0dGVyQmFja2dyb3VuZClcbiAgICAgICAgeyB2aWV3W2ldLmd1dHRlckJhY2tncm91bmQuc3R5bGUubGVmdCA9IGxlZnQ7IH1cbiAgICB9XG4gICAgdmFyIGFsaWduID0gdmlld1tpXS5hbGlnbmFibGU7XG4gICAgaWYgKGFsaWduKSB7IGZvciAodmFyIGogPSAwOyBqIDwgYWxpZ24ubGVuZ3RoOyBqKyspXG4gICAgICB7IGFsaWduW2pdLnN0eWxlLmxlZnQgPSBsZWZ0OyB9IH1cbiAgfSB9XG4gIGlmIChjbS5vcHRpb25zLmZpeGVkR3V0dGVyKVxuICAgIHsgZGlzcGxheS5ndXR0ZXJzLnN0eWxlLmxlZnQgPSAoY29tcCArIGd1dHRlclcpICsgXCJweFwiOyB9XG59XG5cbi8vIFVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxpbmUgbnVtYmVyIGd1dHRlciBpcyBzdGlsbCB0aGUgcmlnaHRcbi8vIHNpemUgZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50IHNpemUuIFJldHVybnMgdHJ1ZSB3aGVuIGFuIHVwZGF0ZVxuLy8gaXMgbmVlZGVkLlxuZnVuY3Rpb24gbWF5YmVVcGRhdGVMaW5lTnVtYmVyV2lkdGgoY20pIHtcbiAgaWYgKCFjbS5vcHRpb25zLmxpbmVOdW1iZXJzKSB7IHJldHVybiBmYWxzZSB9XG4gIHZhciBkb2MgPSBjbS5kb2MsIGxhc3QgPSBsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGRvYy5maXJzdCArIGRvYy5zaXplIC0gMSksIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICBpZiAobGFzdC5sZW5ndGggIT0gZGlzcGxheS5saW5lTnVtQ2hhcnMpIHtcbiAgICB2YXIgdGVzdCA9IGRpc3BsYXkubWVhc3VyZS5hcHBlbmRDaGlsZChlbHQoXCJkaXZcIiwgW2VsdChcImRpdlwiLCBsYXN0KV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdFwiKSk7XG4gICAgdmFyIGlubmVyVyA9IHRlc3QuZmlyc3RDaGlsZC5vZmZzZXRXaWR0aCwgcGFkZGluZyA9IHRlc3Qub2Zmc2V0V2lkdGggLSBpbm5lclc7XG4gICAgZGlzcGxheS5saW5lR3V0dGVyLnN0eWxlLndpZHRoID0gXCJcIjtcbiAgICBkaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoID0gTWF0aC5tYXgoaW5uZXJXLCBkaXNwbGF5LmxpbmVHdXR0ZXIub2Zmc2V0V2lkdGggLSBwYWRkaW5nKSArIDE7XG4gICAgZGlzcGxheS5saW5lTnVtV2lkdGggPSBkaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoICsgcGFkZGluZztcbiAgICBkaXNwbGF5LmxpbmVOdW1DaGFycyA9IGRpc3BsYXkubGluZU51bUlubmVyV2lkdGggPyBsYXN0Lmxlbmd0aCA6IC0xO1xuICAgIGRpc3BsYXkubGluZUd1dHRlci5zdHlsZS53aWR0aCA9IGRpc3BsYXkubGluZU51bVdpZHRoICsgXCJweFwiO1xuICAgIHVwZGF0ZUd1dHRlclNwYWNlKGNtKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBTQ1JPTExJTkcgVEhJTkdTIElOVE8gVklFV1xuXG4vLyBJZiBhbiBlZGl0b3Igc2l0cyBvbiB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgd2luZG93LCBwYXJ0aWFsbHlcbi8vIHNjcm9sbGVkIG91dCBvZiB2aWV3LCB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgY3Vyc29yIGlzIHZpc2libGUuXG5mdW5jdGlvbiBtYXliZVNjcm9sbFdpbmRvdyhjbSwgcmVjdCkge1xuICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIFwic2Nyb2xsQ3Vyc29ySW50b1ZpZXdcIikpIHsgcmV0dXJuIH1cblxuICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGJveCA9IGRpc3BsYXkuc2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvU2Nyb2xsID0gbnVsbDtcbiAgaWYgKHJlY3QudG9wICsgYm94LnRvcCA8IDApIHsgZG9TY3JvbGwgPSB0cnVlOyB9XG4gIGVsc2UgaWYgKHJlY3QuYm90dG9tICsgYm94LnRvcCA+ICh3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpIHsgZG9TY3JvbGwgPSBmYWxzZTsgfVxuICBpZiAoZG9TY3JvbGwgIT0gbnVsbCAmJiAhcGhhbnRvbSkge1xuICAgIHZhciBzY3JvbGxOb2RlID0gZWx0KFwiZGl2XCIsIFwiXFx1MjAwYlwiLCBudWxsLCAoXCJwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogXCIgKyAocmVjdC50b3AgLSBkaXNwbGF5LnZpZXdPZmZzZXQgLSBwYWRkaW5nVG9wKGNtLmRpc3BsYXkpKSArIFwicHg7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogXCIgKyAocmVjdC5ib3R0b20gLSByZWN0LnRvcCArIHNjcm9sbEdhcChjbSkgKyBkaXNwbGF5LmJhckhlaWdodCkgKyBcInB4O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBcIiArIChyZWN0LmxlZnQpICsgXCJweDsgd2lkdGg6IFwiICsgKE1hdGgubWF4KDIsIHJlY3QucmlnaHQgLSByZWN0LmxlZnQpKSArIFwicHg7XCIpKTtcbiAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5hcHBlbmRDaGlsZChzY3JvbGxOb2RlKTtcbiAgICBzY3JvbGxOb2RlLnNjcm9sbEludG9WaWV3KGRvU2Nyb2xsKTtcbiAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5yZW1vdmVDaGlsZChzY3JvbGxOb2RlKTtcbiAgfVxufVxuXG4vLyBTY3JvbGwgYSBnaXZlbiBwb3NpdGlvbiBpbnRvIHZpZXcgKGltbWVkaWF0ZWx5KSwgdmVyaWZ5aW5nIHRoYXRcbi8vIGl0IGFjdHVhbGx5IGJlY2FtZSB2aXNpYmxlIChhcyBsaW5lIGhlaWdodHMgYXJlIGFjY3VyYXRlbHlcbi8vIG1lYXN1cmVkLCB0aGUgcG9zaXRpb24gb2Ygc29tZXRoaW5nIG1heSAnZHJpZnQnIGR1cmluZyBkcmF3aW5nKS5cbmZ1bmN0aW9uIHNjcm9sbFBvc0ludG9WaWV3KGNtLCBwb3MsIGVuZCwgbWFyZ2luKSB7XG4gIGlmIChtYXJnaW4gPT0gbnVsbCkgeyBtYXJnaW4gPSAwOyB9XG4gIHZhciByZWN0O1xuICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nICYmIHBvcyA9PSBlbmQpIHtcbiAgICAvLyBTZXQgcG9zIGFuZCBlbmQgdG8gdGhlIGN1cnNvciBwb3NpdGlvbnMgYXJvdW5kIHRoZSBjaGFyYWN0ZXIgcG9zIHN0aWNrcyB0b1xuICAgIC8vIElmIHBvcy5zdGlja3kgPT0gXCJiZWZvcmVcIiwgdGhhdCBpcyBhcm91bmQgcG9zLmNoIC0gMSwgb3RoZXJ3aXNlIGFyb3VuZCBwb3MuY2hcbiAgICAvLyBJZiBwb3MgPT0gUG9zKF8sIDAsIFwiYmVmb3JlXCIpLCBwb3MgYW5kIGVuZCBhcmUgdW5jaGFuZ2VkXG4gICAgcG9zID0gcG9zLmNoID8gUG9zKHBvcy5saW5lLCBwb3Muc3RpY2t5ID09IFwiYmVmb3JlXCIgPyBwb3MuY2ggLSAxIDogcG9zLmNoLCBcImFmdGVyXCIpIDogcG9zO1xuICAgIGVuZCA9IHBvcy5zdGlja3kgPT0gXCJiZWZvcmVcIiA/IFBvcyhwb3MubGluZSwgcG9zLmNoICsgMSwgXCJiZWZvcmVcIikgOiBwb3M7XG4gIH1cbiAgZm9yICh2YXIgbGltaXQgPSAwOyBsaW1pdCA8IDU7IGxpbWl0KyspIHtcbiAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciBjb29yZHMgPSBjdXJzb3JDb29yZHMoY20sIHBvcyk7XG4gICAgdmFyIGVuZENvb3JkcyA9ICFlbmQgfHwgZW5kID09IHBvcyA/IGNvb3JkcyA6IGN1cnNvckNvb3JkcyhjbSwgZW5kKTtcbiAgICByZWN0ID0ge2xlZnQ6IE1hdGgubWluKGNvb3Jkcy5sZWZ0LCBlbmRDb29yZHMubGVmdCksXG4gICAgICAgICAgICB0b3A6IE1hdGgubWluKGNvb3Jkcy50b3AsIGVuZENvb3Jkcy50b3ApIC0gbWFyZ2luLFxuICAgICAgICAgICAgcmlnaHQ6IE1hdGgubWF4KGNvb3Jkcy5sZWZ0LCBlbmRDb29yZHMubGVmdCksXG4gICAgICAgICAgICBib3R0b206IE1hdGgubWF4KGNvb3Jkcy5ib3R0b20sIGVuZENvb3Jkcy5ib3R0b20pICsgbWFyZ2lufTtcbiAgICB2YXIgc2Nyb2xsUG9zID0gY2FsY3VsYXRlU2Nyb2xsUG9zKGNtLCByZWN0KTtcbiAgICB2YXIgc3RhcnRUb3AgPSBjbS5kb2Muc2Nyb2xsVG9wLCBzdGFydExlZnQgPSBjbS5kb2Muc2Nyb2xsTGVmdDtcbiAgICBpZiAoc2Nyb2xsUG9zLnNjcm9sbFRvcCAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVTY3JvbGxUb3AoY20sIHNjcm9sbFBvcy5zY3JvbGxUb3ApO1xuICAgICAgaWYgKE1hdGguYWJzKGNtLmRvYy5zY3JvbGxUb3AgLSBzdGFydFRvcCkgPiAxKSB7IGNoYW5nZWQgPSB0cnVlOyB9XG4gICAgfVxuICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsTGVmdCAhPSBudWxsKSB7XG4gICAgICBzZXRTY3JvbGxMZWZ0KGNtLCBzY3JvbGxQb3Muc2Nyb2xsTGVmdCk7XG4gICAgICBpZiAoTWF0aC5hYnMoY20uZG9jLnNjcm9sbExlZnQgLSBzdGFydExlZnQpID4gMSkgeyBjaGFuZ2VkID0gdHJ1ZTsgfVxuICAgIH1cbiAgICBpZiAoIWNoYW5nZWQpIHsgYnJlYWsgfVxuICB9XG4gIHJldHVybiByZWN0XG59XG5cbi8vIFNjcm9sbCBhIGdpdmVuIHNldCBvZiBjb29yZGluYXRlcyBpbnRvIHZpZXcgKGltbWVkaWF0ZWx5KS5cbmZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KGNtLCByZWN0KSB7XG4gIHZhciBzY3JvbGxQb3MgPSBjYWxjdWxhdGVTY3JvbGxQb3MoY20sIHJlY3QpO1xuICBpZiAoc2Nyb2xsUG9zLnNjcm9sbFRvcCAhPSBudWxsKSB7IHVwZGF0ZVNjcm9sbFRvcChjbSwgc2Nyb2xsUG9zLnNjcm9sbFRvcCk7IH1cbiAgaWYgKHNjcm9sbFBvcy5zY3JvbGxMZWZ0ICE9IG51bGwpIHsgc2V0U2Nyb2xsTGVmdChjbSwgc2Nyb2xsUG9zLnNjcm9sbExlZnQpOyB9XG59XG5cbi8vIENhbGN1bGF0ZSBhIG5ldyBzY3JvbGwgcG9zaXRpb24gbmVlZGVkIHRvIHNjcm9sbCB0aGUgZ2l2ZW5cbi8vIHJlY3RhbmdsZSBpbnRvIHZpZXcuIFJldHVybnMgYW4gb2JqZWN0IHdpdGggc2Nyb2xsVG9wIGFuZFxuLy8gc2Nyb2xsTGVmdCBwcm9wZXJ0aWVzLiBXaGVuIHRoZXNlIGFyZSB1bmRlZmluZWQsIHRoZVxuLy8gdmVydGljYWwvaG9yaXpvbnRhbCBwb3NpdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGFkanVzdGVkLlxuZnVuY3Rpb24gY2FsY3VsYXRlU2Nyb2xsUG9zKGNtLCByZWN0KSB7XG4gIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgc25hcE1hcmdpbiA9IHRleHRIZWlnaHQoY20uZGlzcGxheSk7XG4gIGlmIChyZWN0LnRvcCA8IDApIHsgcmVjdC50b3AgPSAwOyB9XG4gIHZhciBzY3JlZW50b3AgPSBjbS5jdXJPcCAmJiBjbS5jdXJPcC5zY3JvbGxUb3AgIT0gbnVsbCA/IGNtLmN1ck9wLnNjcm9sbFRvcCA6IGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wO1xuICB2YXIgc2NyZWVuID0gZGlzcGxheUhlaWdodChjbSksIHJlc3VsdCA9IHt9O1xuICBpZiAocmVjdC5ib3R0b20gLSByZWN0LnRvcCA+IHNjcmVlbikgeyByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgc2NyZWVuOyB9XG4gIHZhciBkb2NCb3R0b20gPSBjbS5kb2MuaGVpZ2h0ICsgcGFkZGluZ1ZlcnQoZGlzcGxheSk7XG4gIHZhciBhdFRvcCA9IHJlY3QudG9wIDwgc25hcE1hcmdpbiwgYXRCb3R0b20gPSByZWN0LmJvdHRvbSA+IGRvY0JvdHRvbSAtIHNuYXBNYXJnaW47XG4gIGlmIChyZWN0LnRvcCA8IHNjcmVlbnRvcCkge1xuICAgIHJlc3VsdC5zY3JvbGxUb3AgPSBhdFRvcCA/IDAgOiByZWN0LnRvcDtcbiAgfSBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IHNjcmVlbnRvcCArIHNjcmVlbikge1xuICAgIHZhciBuZXdUb3AgPSBNYXRoLm1pbihyZWN0LnRvcCwgKGF0Qm90dG9tID8gZG9jQm90dG9tIDogcmVjdC5ib3R0b20pIC0gc2NyZWVuKTtcbiAgICBpZiAobmV3VG9wICE9IHNjcmVlbnRvcCkgeyByZXN1bHQuc2Nyb2xsVG9wID0gbmV3VG9wOyB9XG4gIH1cblxuICB2YXIgc2NyZWVubGVmdCA9IGNtLmN1ck9wICYmIGNtLmN1ck9wLnNjcm9sbExlZnQgIT0gbnVsbCA/IGNtLmN1ck9wLnNjcm9sbExlZnQgOiBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQ7XG4gIHZhciBzY3JlZW53ID0gZGlzcGxheVdpZHRoKGNtKSAtIChjbS5vcHRpb25zLmZpeGVkR3V0dGVyID8gZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoIDogMCk7XG4gIHZhciB0b29XaWRlID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdCA+IHNjcmVlbnc7XG4gIGlmICh0b29XaWRlKSB7IHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBzY3JlZW53OyB9XG4gIGlmIChyZWN0LmxlZnQgPCAxMClcbiAgICB7IHJlc3VsdC5zY3JvbGxMZWZ0ID0gMDsgfVxuICBlbHNlIGlmIChyZWN0LmxlZnQgPCBzY3JlZW5sZWZ0KVxuICAgIHsgcmVzdWx0LnNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCByZWN0LmxlZnQgLSAodG9vV2lkZSA/IDAgOiAxMCkpOyB9XG4gIGVsc2UgaWYgKHJlY3QucmlnaHQgPiBzY3JlZW53ICsgc2NyZWVubGVmdCAtIDMpXG4gICAgeyByZXN1bHQuc2Nyb2xsTGVmdCA9IHJlY3QucmlnaHQgKyAodG9vV2lkZSA/IDAgOiAxMCkgLSBzY3JlZW53OyB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gU3RvcmUgYSByZWxhdGl2ZSBhZGp1c3RtZW50IHRvIHRoZSBzY3JvbGwgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnRcbi8vIG9wZXJhdGlvbiAodG8gYmUgYXBwbGllZCB3aGVuIHRoZSBvcGVyYXRpb24gZmluaXNoZXMpLlxuZnVuY3Rpb24gYWRkVG9TY3JvbGxUb3AoY20sIHRvcCkge1xuICBpZiAodG9wID09IG51bGwpIHsgcmV0dXJuIH1cbiAgcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKTtcbiAgY20uY3VyT3Auc2Nyb2xsVG9wID0gKGNtLmN1ck9wLnNjcm9sbFRvcCA9PSBudWxsID8gY20uZG9jLnNjcm9sbFRvcCA6IGNtLmN1ck9wLnNjcm9sbFRvcCkgKyB0b3A7XG59XG5cbi8vIE1ha2Ugc3VyZSB0aGF0IGF0IHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvbiB0aGUgY3VycmVudCBjdXJzb3IgaXNcbi8vIHNob3duLlxuZnVuY3Rpb24gZW5zdXJlQ3Vyc29yVmlzaWJsZShjbSkge1xuICByZXNvbHZlU2Nyb2xsVG9Qb3MoY20pO1xuICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7XG4gIGNtLmN1ck9wLnNjcm9sbFRvUG9zID0ge2Zyb206IGN1ciwgdG86IGN1ciwgbWFyZ2luOiBjbS5vcHRpb25zLmN1cnNvclNjcm9sbE1hcmdpbn07XG59XG5cbmZ1bmN0aW9uIHNjcm9sbFRvQ29vcmRzKGNtLCB4LCB5KSB7XG4gIGlmICh4ICE9IG51bGwgfHwgeSAhPSBudWxsKSB7IHJlc29sdmVTY3JvbGxUb1BvcyhjbSk7IH1cbiAgaWYgKHggIT0gbnVsbCkgeyBjbS5jdXJPcC5zY3JvbGxMZWZ0ID0geDsgfVxuICBpZiAoeSAhPSBudWxsKSB7IGNtLmN1ck9wLnNjcm9sbFRvcCA9IHk7IH1cbn1cblxuZnVuY3Rpb24gc2Nyb2xsVG9SYW5nZShjbSwgcmFuZ2UkJDEpIHtcbiAgcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKTtcbiAgY20uY3VyT3Auc2Nyb2xsVG9Qb3MgPSByYW5nZSQkMTtcbn1cblxuLy8gV2hlbiBhbiBvcGVyYXRpb24gaGFzIGl0cyBzY3JvbGxUb1BvcyBwcm9wZXJ0eSBzZXQsIGFuZCBhbm90aGVyXG4vLyBzY3JvbGwgYWN0aW9uIGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvbiwgdGhpc1xuLy8gJ3NpbXVsYXRlcycgc2Nyb2xsaW5nIHRoYXQgcG9zaXRpb24gaW50byB2aWV3IGluIGEgY2hlYXAgd2F5LCBzb1xuLy8gdGhhdCB0aGUgZWZmZWN0IG9mIGludGVybWVkaWF0ZSBzY3JvbGwgY29tbWFuZHMgaXMgbm90IGlnbm9yZWQuXG5mdW5jdGlvbiByZXNvbHZlU2Nyb2xsVG9Qb3MoY20pIHtcbiAgdmFyIHJhbmdlJCQxID0gY20uY3VyT3Auc2Nyb2xsVG9Qb3M7XG4gIGlmIChyYW5nZSQkMSkge1xuICAgIGNtLmN1ck9wLnNjcm9sbFRvUG9zID0gbnVsbDtcbiAgICB2YXIgZnJvbSA9IGVzdGltYXRlQ29vcmRzKGNtLCByYW5nZSQkMS5mcm9tKSwgdG8gPSBlc3RpbWF0ZUNvb3JkcyhjbSwgcmFuZ2UkJDEudG8pO1xuICAgIHNjcm9sbFRvQ29vcmRzUmFuZ2UoY20sIGZyb20sIHRvLCByYW5nZSQkMS5tYXJnaW4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjcm9sbFRvQ29vcmRzUmFuZ2UoY20sIGZyb20sIHRvLCBtYXJnaW4pIHtcbiAgdmFyIHNQb3MgPSBjYWxjdWxhdGVTY3JvbGxQb3MoY20sIHtcbiAgICBsZWZ0OiBNYXRoLm1pbihmcm9tLmxlZnQsIHRvLmxlZnQpLFxuICAgIHRvcDogTWF0aC5taW4oZnJvbS50b3AsIHRvLnRvcCkgLSBtYXJnaW4sXG4gICAgcmlnaHQ6IE1hdGgubWF4KGZyb20ucmlnaHQsIHRvLnJpZ2h0KSxcbiAgICBib3R0b206IE1hdGgubWF4KGZyb20uYm90dG9tLCB0by5ib3R0b20pICsgbWFyZ2luXG4gIH0pO1xuICBzY3JvbGxUb0Nvb3JkcyhjbSwgc1Bvcy5zY3JvbGxMZWZ0LCBzUG9zLnNjcm9sbFRvcCk7XG59XG5cbi8vIFN5bmMgdGhlIHNjcm9sbGFibGUgYXJlYSBhbmQgc2Nyb2xsYmFycywgZW5zdXJlIHRoZSB2aWV3cG9ydFxuLy8gY292ZXJzIHRoZSB2aXNpYmxlIGFyZWEuXG5mdW5jdGlvbiB1cGRhdGVTY3JvbGxUb3AoY20sIHZhbCkge1xuICBpZiAoTWF0aC5hYnMoY20uZG9jLnNjcm9sbFRvcCAtIHZhbCkgPCAyKSB7IHJldHVybiB9XG4gIGlmICghZ2Vja28pIHsgdXBkYXRlRGlzcGxheVNpbXBsZShjbSwge3RvcDogdmFsfSk7IH1cbiAgc2V0U2Nyb2xsVG9wKGNtLCB2YWwsIHRydWUpO1xuICBpZiAoZ2Vja28pIHsgdXBkYXRlRGlzcGxheVNpbXBsZShjbSk7IH1cbiAgc3RhcnRXb3JrZXIoY20sIDEwMCk7XG59XG5cbmZ1bmN0aW9uIHNldFNjcm9sbFRvcChjbSwgdmFsLCBmb3JjZVNjcm9sbCkge1xuICB2YWwgPSBNYXRoLm1pbihjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0LCB2YWwpO1xuICBpZiAoY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgPT0gdmFsICYmICFmb3JjZVNjcm9sbCkgeyByZXR1cm4gfVxuICBjbS5kb2Muc2Nyb2xsVG9wID0gdmFsO1xuICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsVG9wKHZhbCk7XG4gIGlmIChjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCAhPSB2YWwpIHsgY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgPSB2YWw7IH1cbn1cblxuLy8gU3luYyBzY3JvbGxlciBhbmQgc2Nyb2xsYmFyLCBlbnN1cmUgdGhlIGd1dHRlciBlbGVtZW50cyBhcmVcbi8vIGFsaWduZWQuXG5mdW5jdGlvbiBzZXRTY3JvbGxMZWZ0KGNtLCB2YWwsIGlzU2Nyb2xsZXIsIGZvcmNlU2Nyb2xsKSB7XG4gIHZhbCA9IE1hdGgubWluKHZhbCwgY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxXaWR0aCAtIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGgpO1xuICBpZiAoKGlzU2Nyb2xsZXIgPyB2YWwgPT0gY20uZG9jLnNjcm9sbExlZnQgOiBNYXRoLmFicyhjbS5kb2Muc2Nyb2xsTGVmdCAtIHZhbCkgPCAyKSAmJiAhZm9yY2VTY3JvbGwpIHsgcmV0dXJuIH1cbiAgY20uZG9jLnNjcm9sbExlZnQgPSB2YWw7XG4gIGFsaWduSG9yaXpvbnRhbGx5KGNtKTtcbiAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCAhPSB2YWwpIHsgY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0ID0gdmFsOyB9XG4gIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5zZXRTY3JvbGxMZWZ0KHZhbCk7XG59XG5cbi8vIFNDUk9MTEJBUlNcblxuLy8gUHJlcGFyZSBET00gcmVhZHMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgc2Nyb2xsYmFycy4gRG9uZSBpbiBvbmVcbi8vIHNob3QgdG8gbWluaW1pemUgdXBkYXRlL21lYXN1cmUgcm91bmR0cmlwcy5cbmZ1bmN0aW9uIG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKSB7XG4gIHZhciBkID0gY20uZGlzcGxheSwgZ3V0dGVyVyA9IGQuZ3V0dGVycy5vZmZzZXRXaWR0aDtcbiAgdmFyIGRvY0ggPSBNYXRoLnJvdW5kKGNtLmRvYy5oZWlnaHQgKyBwYWRkaW5nVmVydChjbS5kaXNwbGF5KSk7XG4gIHJldHVybiB7XG4gICAgY2xpZW50SGVpZ2h0OiBkLnNjcm9sbGVyLmNsaWVudEhlaWdodCxcbiAgICB2aWV3SGVpZ2h0OiBkLndyYXBwZXIuY2xpZW50SGVpZ2h0LFxuICAgIHNjcm9sbFdpZHRoOiBkLnNjcm9sbGVyLnNjcm9sbFdpZHRoLCBjbGllbnRXaWR0aDogZC5zY3JvbGxlci5jbGllbnRXaWR0aCxcbiAgICB2aWV3V2lkdGg6IGQud3JhcHBlci5jbGllbnRXaWR0aCxcbiAgICBiYXJMZWZ0OiBjbS5vcHRpb25zLmZpeGVkR3V0dGVyID8gZ3V0dGVyVyA6IDAsXG4gICAgZG9jSGVpZ2h0OiBkb2NILFxuICAgIHNjcm9sbEhlaWdodDogZG9jSCArIHNjcm9sbEdhcChjbSkgKyBkLmJhckhlaWdodCxcbiAgICBuYXRpdmVCYXJXaWR0aDogZC5uYXRpdmVCYXJXaWR0aCxcbiAgICBndXR0ZXJXaWR0aDogZ3V0dGVyV1xuICB9XG59XG5cbnZhciBOYXRpdmVTY3JvbGxiYXJzID0gZnVuY3Rpb24ocGxhY2UsIHNjcm9sbCwgY20pIHtcbiAgdGhpcy5jbSA9IGNtO1xuICB2YXIgdmVydCA9IHRoaXMudmVydCA9IGVsdChcImRpdlwiLCBbZWx0KFwiZGl2XCIsIG51bGwsIG51bGwsIFwibWluLXdpZHRoOiAxcHhcIildLCBcIkNvZGVNaXJyb3ItdnNjcm9sbGJhclwiKTtcbiAgdmFyIGhvcml6ID0gdGhpcy5ob3JpeiA9IGVsdChcImRpdlwiLCBbZWx0KFwiZGl2XCIsIG51bGwsIG51bGwsIFwiaGVpZ2h0OiAxMDAlOyBtaW4taGVpZ2h0OiAxcHhcIildLCBcIkNvZGVNaXJyb3ItaHNjcm9sbGJhclwiKTtcbiAgcGxhY2UodmVydCk7IHBsYWNlKGhvcml6KTtcblxuICBvbih2ZXJ0LCBcInNjcm9sbFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZlcnQuY2xpZW50SGVpZ2h0KSB7IHNjcm9sbCh2ZXJ0LnNjcm9sbFRvcCwgXCJ2ZXJ0aWNhbFwiKTsgfVxuICB9KTtcbiAgb24oaG9yaXosIFwic2Nyb2xsXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaG9yaXouY2xpZW50V2lkdGgpIHsgc2Nyb2xsKGhvcml6LnNjcm9sbExlZnQsIFwiaG9yaXpvbnRhbFwiKTsgfVxuICB9KTtcblxuICB0aGlzLmNoZWNrZWRaZXJvV2lkdGggPSBmYWxzZTtcbiAgLy8gTmVlZCB0byBzZXQgYSBtaW5pbXVtIHdpZHRoIHRvIHNlZSB0aGUgc2Nyb2xsYmFyIG9uIElFNyAoYnV0IG11c3Qgbm90IHNldCBpdCBvbiBJRTgpLlxuICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIHsgdGhpcy5ob3Jpei5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLnZlcnQuc3R5bGUubWluV2lkdGggPSBcIjE4cHhcIjsgfVxufTtcblxuTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKG1lYXN1cmUpIHtcbiAgdmFyIG5lZWRzSCA9IG1lYXN1cmUuc2Nyb2xsV2lkdGggPiBtZWFzdXJlLmNsaWVudFdpZHRoICsgMTtcbiAgdmFyIG5lZWRzViA9IG1lYXN1cmUuc2Nyb2xsSGVpZ2h0ID4gbWVhc3VyZS5jbGllbnRIZWlnaHQgKyAxO1xuICB2YXIgc1dpZHRoID0gbWVhc3VyZS5uYXRpdmVCYXJXaWR0aDtcblxuICBpZiAobmVlZHNWKSB7XG4gICAgdGhpcy52ZXJ0LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgdGhpcy52ZXJ0LnN0eWxlLmJvdHRvbSA9IG5lZWRzSCA/IHNXaWR0aCArIFwicHhcIiA6IFwiMFwiO1xuICAgIHZhciB0b3RhbEhlaWdodCA9IG1lYXN1cmUudmlld0hlaWdodCAtIChuZWVkc0ggPyBzV2lkdGggOiAwKTtcbiAgICAvLyBBIGJ1ZyBpbiBJRTggY2FuIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgbmVnYXRpdmUsIHNvIGd1YXJkIGl0LlxuICAgIHRoaXMudmVydC5maXJzdENoaWxkLnN0eWxlLmhlaWdodCA9XG4gICAgICBNYXRoLm1heCgwLCBtZWFzdXJlLnNjcm9sbEhlaWdodCAtIG1lYXN1cmUuY2xpZW50SGVpZ2h0ICsgdG90YWxIZWlnaHQpICsgXCJweFwiO1xuICB9IGVsc2Uge1xuICAgIHRoaXMudmVydC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbiAgICB0aGlzLnZlcnQuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQgPSBcIjBcIjtcbiAgfVxuXG4gIGlmIChuZWVkc0gpIHtcbiAgICB0aGlzLmhvcml6LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgdGhpcy5ob3Jpei5zdHlsZS5yaWdodCA9IG5lZWRzViA/IHNXaWR0aCArIFwicHhcIiA6IFwiMFwiO1xuICAgIHRoaXMuaG9yaXouc3R5bGUubGVmdCA9IG1lYXN1cmUuYmFyTGVmdCArIFwicHhcIjtcbiAgICB2YXIgdG90YWxXaWR0aCA9IG1lYXN1cmUudmlld1dpZHRoIC0gbWVhc3VyZS5iYXJMZWZ0IC0gKG5lZWRzViA/IHNXaWR0aCA6IDApO1xuICAgIHRoaXMuaG9yaXouZmlyc3RDaGlsZC5zdHlsZS53aWR0aCA9XG4gICAgICBNYXRoLm1heCgwLCBtZWFzdXJlLnNjcm9sbFdpZHRoIC0gbWVhc3VyZS5jbGllbnRXaWR0aCArIHRvdGFsV2lkdGgpICsgXCJweFwiO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaG9yaXouc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgdGhpcy5ob3Jpei5maXJzdENoaWxkLnN0eWxlLndpZHRoID0gXCIwXCI7XG4gIH1cblxuICBpZiAoIXRoaXMuY2hlY2tlZFplcm9XaWR0aCAmJiBtZWFzdXJlLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICBpZiAoc1dpZHRoID09IDApIHsgdGhpcy56ZXJvV2lkdGhIYWNrKCk7IH1cbiAgICB0aGlzLmNoZWNrZWRaZXJvV2lkdGggPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHtyaWdodDogbmVlZHNWID8gc1dpZHRoIDogMCwgYm90dG9tOiBuZWVkc0ggPyBzV2lkdGggOiAwfVxufTtcblxuTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUuc2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uIChwb3MpIHtcbiAgaWYgKHRoaXMuaG9yaXouc2Nyb2xsTGVmdCAhPSBwb3MpIHsgdGhpcy5ob3Jpei5zY3JvbGxMZWZ0ID0gcG9zOyB9XG4gIGlmICh0aGlzLmRpc2FibGVIb3JpeikgeyB0aGlzLmVuYWJsZVplcm9XaWR0aEJhcih0aGlzLmhvcml6LCB0aGlzLmRpc2FibGVIb3JpeiwgXCJob3JpelwiKTsgfVxufTtcblxuTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUuc2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gKHBvcykge1xuICBpZiAodGhpcy52ZXJ0LnNjcm9sbFRvcCAhPSBwb3MpIHsgdGhpcy52ZXJ0LnNjcm9sbFRvcCA9IHBvczsgfVxuICBpZiAodGhpcy5kaXNhYmxlVmVydCkgeyB0aGlzLmVuYWJsZVplcm9XaWR0aEJhcih0aGlzLnZlcnQsIHRoaXMuZGlzYWJsZVZlcnQsIFwidmVydFwiKTsgfVxufTtcblxuTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUuemVyb1dpZHRoSGFjayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHcgPSBtYWMgJiYgIW1hY19nZU1vdW50YWluTGlvbiA/IFwiMTJweFwiIDogXCIxOHB4XCI7XG4gIHRoaXMuaG9yaXouc3R5bGUuaGVpZ2h0ID0gdGhpcy52ZXJ0LnN0eWxlLndpZHRoID0gdztcbiAgdGhpcy5ob3Jpei5zdHlsZS5wb2ludGVyRXZlbnRzID0gdGhpcy52ZXJ0LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgdGhpcy5kaXNhYmxlSG9yaXogPSBuZXcgRGVsYXllZDtcbiAgdGhpcy5kaXNhYmxlVmVydCA9IG5ldyBEZWxheWVkO1xufTtcblxuTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUuZW5hYmxlWmVyb1dpZHRoQmFyID0gZnVuY3Rpb24gKGJhciwgZGVsYXksIHR5cGUpIHtcbiAgYmFyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIjtcbiAgZnVuY3Rpb24gbWF5YmVEaXNhYmxlKCkge1xuICAgIC8vIFRvIGZpbmQgb3V0IHdoZXRoZXIgdGhlIHNjcm9sbGJhciBpcyBzdGlsbCB2aXNpYmxlLCB3ZVxuICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIGVsZW1lbnQgdW5kZXIgdGhlIHBpeGVsIGluIHRoZSBib3R0b21cbiAgICAvLyByaWdodCBjb3JuZXIgb2YgdGhlIHNjcm9sbGJhciBib3ggaXMgdGhlIHNjcm9sbGJhciBib3hcbiAgICAvLyBpdHNlbGYgKHdoZW4gdGhlIGJhciBpcyBzdGlsbCB2aXNpYmxlKSBvciBpdHMgZmlsbGVyIGNoaWxkXG4gICAgLy8gKHdoZW4gdGhlIGJhciBpcyBoaWRkZW4pLiBJZiBpdCBpcyBzdGlsbCB2aXNpYmxlLCB3ZSBrZWVwXG4gICAgLy8gaXQgZW5hYmxlZCwgaWYgaXQncyBoaWRkZW4sIHdlIGRpc2FibGUgcG9pbnRlciBldmVudHMuXG4gICAgdmFyIGJveCA9IGJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgZWx0JCQxID0gdHlwZSA9PSBcInZlcnRcIiA/IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoYm94LnJpZ2h0IC0gMSwgKGJveC50b3AgKyBib3guYm90dG9tKSAvIDIpXG4gICAgICAgIDogZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCgoYm94LnJpZ2h0ICsgYm94LmxlZnQpIC8gMiwgYm94LmJvdHRvbSAtIDEpO1xuICAgIGlmIChlbHQkJDEgIT0gYmFyKSB7IGJhci5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7IH1cbiAgICBlbHNlIHsgZGVsYXkuc2V0KDEwMDAsIG1heWJlRGlzYWJsZSk7IH1cbiAgfVxuICBkZWxheS5zZXQoMTAwMCwgbWF5YmVEaXNhYmxlKTtcbn07XG5cbk5hdGl2ZVNjcm9sbGJhcnMucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5ob3Jpei5wYXJlbnROb2RlO1xuICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5ob3Jpeik7XG4gIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLnZlcnQpO1xufTtcblxudmFyIE51bGxTY3JvbGxiYXJzID0gZnVuY3Rpb24gKCkge307XG5cbk51bGxTY3JvbGxiYXJzLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7Ym90dG9tOiAwLCByaWdodDogMH0gfTtcbk51bGxTY3JvbGxiYXJzLnByb3RvdHlwZS5zZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24gKCkge307XG5OdWxsU2Nyb2xsYmFycy5wcm90b3R5cGUuc2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gKCkge307XG5OdWxsU2Nyb2xsYmFycy5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7fTtcblxuZnVuY3Rpb24gdXBkYXRlU2Nyb2xsYmFycyhjbSwgbWVhc3VyZSkge1xuICBpZiAoIW1lYXN1cmUpIHsgbWVhc3VyZSA9IG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKTsgfVxuICB2YXIgc3RhcnRXaWR0aCA9IGNtLmRpc3BsYXkuYmFyV2lkdGgsIHN0YXJ0SGVpZ2h0ID0gY20uZGlzcGxheS5iYXJIZWlnaHQ7XG4gIHVwZGF0ZVNjcm9sbGJhcnNJbm5lcihjbSwgbWVhc3VyZSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNCAmJiBzdGFydFdpZHRoICE9IGNtLmRpc3BsYXkuYmFyV2lkdGggfHwgc3RhcnRIZWlnaHQgIT0gY20uZGlzcGxheS5iYXJIZWlnaHQ7IGkrKykge1xuICAgIGlmIChzdGFydFdpZHRoICE9IGNtLmRpc3BsYXkuYmFyV2lkdGggJiYgY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpXG4gICAgICB7IHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0KGNtKTsgfVxuICAgIHVwZGF0ZVNjcm9sbGJhcnNJbm5lcihjbSwgbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pKTtcbiAgICBzdGFydFdpZHRoID0gY20uZGlzcGxheS5iYXJXaWR0aDsgc3RhcnRIZWlnaHQgPSBjbS5kaXNwbGF5LmJhckhlaWdodDtcbiAgfVxufVxuXG4vLyBSZS1zeW5jaHJvbml6ZSB0aGUgZmFrZSBzY3JvbGxiYXJzIHdpdGggdGhlIGFjdHVhbCBzaXplIG9mIHRoZVxuLy8gY29udGVudC5cbmZ1bmN0aW9uIHVwZGF0ZVNjcm9sbGJhcnNJbm5lcihjbSwgbWVhc3VyZSkge1xuICB2YXIgZCA9IGNtLmRpc3BsYXk7XG4gIHZhciBzaXplcyA9IGQuc2Nyb2xsYmFycy51cGRhdGUobWVhc3VyZSk7XG5cbiAgZC5zaXplci5zdHlsZS5wYWRkaW5nUmlnaHQgPSAoZC5iYXJXaWR0aCA9IHNpemVzLnJpZ2h0KSArIFwicHhcIjtcbiAgZC5zaXplci5zdHlsZS5wYWRkaW5nQm90dG9tID0gKGQuYmFySGVpZ2h0ID0gc2l6ZXMuYm90dG9tKSArIFwicHhcIjtcbiAgZC5oZWlnaHRGb3JjZXIuc3R5bGUuYm9yZGVyQm90dG9tID0gc2l6ZXMuYm90dG9tICsgXCJweCBzb2xpZCB0cmFuc3BhcmVudFwiO1xuXG4gIGlmIChzaXplcy5yaWdodCAmJiBzaXplcy5ib3R0b20pIHtcbiAgICBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgIGQuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmhlaWdodCA9IHNpemVzLmJvdHRvbSArIFwicHhcIjtcbiAgICBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS53aWR0aCA9IHNpemVzLnJpZ2h0ICsgXCJweFwiO1xuICB9IGVsc2UgeyBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5kaXNwbGF5ID0gXCJcIjsgfVxuICBpZiAoc2l6ZXMuYm90dG9tICYmIGNtLm9wdGlvbnMuY292ZXJHdXR0ZXJOZXh0VG9TY3JvbGxiYXIgJiYgY20ub3B0aW9ucy5maXhlZEd1dHRlcikge1xuICAgIGQuZ3V0dGVyRmlsbGVyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgZC5ndXR0ZXJGaWxsZXIuc3R5bGUuaGVpZ2h0ID0gc2l6ZXMuYm90dG9tICsgXCJweFwiO1xuICAgIGQuZ3V0dGVyRmlsbGVyLnN0eWxlLndpZHRoID0gbWVhc3VyZS5ndXR0ZXJXaWR0aCArIFwicHhcIjtcbiAgfSBlbHNlIHsgZC5ndXR0ZXJGaWxsZXIuc3R5bGUuZGlzcGxheSA9IFwiXCI7IH1cbn1cblxudmFyIHNjcm9sbGJhck1vZGVsID0ge1wibmF0aXZlXCI6IE5hdGl2ZVNjcm9sbGJhcnMsIFwibnVsbFwiOiBOdWxsU2Nyb2xsYmFyc307XG5cbmZ1bmN0aW9uIGluaXRTY3JvbGxiYXJzKGNtKSB7XG4gIGlmIChjbS5kaXNwbGF5LnNjcm9sbGJhcnMpIHtcbiAgICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuY2xlYXIoKTtcbiAgICBpZiAoY20uZGlzcGxheS5zY3JvbGxiYXJzLmFkZENsYXNzKVxuICAgICAgeyBybUNsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgY20uZGlzcGxheS5zY3JvbGxiYXJzLmFkZENsYXNzKTsgfVxuICB9XG5cbiAgY20uZGlzcGxheS5zY3JvbGxiYXJzID0gbmV3IHNjcm9sbGJhck1vZGVsW2NtLm9wdGlvbnMuc2Nyb2xsYmFyU3R5bGVdKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgY20uZGlzcGxheS53cmFwcGVyLmluc2VydEJlZm9yZShub2RlLCBjbS5kaXNwbGF5LnNjcm9sbGJhckZpbGxlcik7XG4gICAgLy8gUHJldmVudCBjbGlja3MgaW4gdGhlIHNjcm9sbGJhcnMgZnJvbSBraWxsaW5nIGZvY3VzXG4gICAgb24obm9kZSwgXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGNtLnN0YXRlLmZvY3VzZWQpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBjbS5kaXNwbGF5LmlucHV0LmZvY3VzKCk7IH0sIDApOyB9XG4gICAgfSk7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbS1ub3QtY29udGVudFwiLCBcInRydWVcIik7XG4gIH0sIGZ1bmN0aW9uIChwb3MsIGF4aXMpIHtcbiAgICBpZiAoYXhpcyA9PSBcImhvcml6b250YWxcIikgeyBzZXRTY3JvbGxMZWZ0KGNtLCBwb3MpOyB9XG4gICAgZWxzZSB7IHVwZGF0ZVNjcm9sbFRvcChjbSwgcG9zKTsgfVxuICB9LCBjbSk7XG4gIGlmIChjbS5kaXNwbGF5LnNjcm9sbGJhcnMuYWRkQ2xhc3MpXG4gICAgeyBhZGRDbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5hZGRDbGFzcyk7IH1cbn1cblxuLy8gT3BlcmF0aW9ucyBhcmUgdXNlZCB0byB3cmFwIGEgc2VyaWVzIG9mIGNoYW5nZXMgdG8gdGhlIGVkaXRvclxuLy8gc3RhdGUgaW4gc3VjaCBhIHdheSB0aGF0IGVhY2ggY2hhbmdlIHdvbid0IGhhdmUgdG8gdXBkYXRlIHRoZVxuLy8gY3Vyc29yIGFuZCBkaXNwbGF5ICh3aGljaCB3b3VsZCBiZSBhd2t3YXJkLCBzbG93LCBhbmRcbi8vIGVycm9yLXByb25lKS4gSW5zdGVhZCwgZGlzcGxheSB1cGRhdGVzIGFyZSBiYXRjaGVkIGFuZCB0aGVuIGFsbFxuLy8gY29tYmluZWQgYW5kIGV4ZWN1dGVkIGF0IG9uY2UuXG5cbnZhciBuZXh0T3BJZCA9IDA7XG4vLyBTdGFydCBhIG5ldyBvcGVyYXRpb24uXG5mdW5jdGlvbiBzdGFydE9wZXJhdGlvbihjbSkge1xuICBjbS5jdXJPcCA9IHtcbiAgICBjbTogY20sXG4gICAgdmlld0NoYW5nZWQ6IGZhbHNlLCAgICAgIC8vIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBsaW5lcyBtaWdodCBuZWVkIHRvIGJlIHJlZHJhd25cbiAgICBzdGFydEhlaWdodDogY20uZG9jLmhlaWdodCwgLy8gVXNlZCB0byBkZXRlY3QgbmVlZCB0byB1cGRhdGUgc2Nyb2xsYmFyXG4gICAgZm9yY2VVcGRhdGU6IGZhbHNlLCAgICAgIC8vIFVzZWQgdG8gZm9yY2UgYSByZWRyYXdcbiAgICB1cGRhdGVJbnB1dDogbnVsbCwgICAgICAgLy8gV2hldGhlciB0byByZXNldCB0aGUgaW5wdXQgdGV4dGFyZWFcbiAgICB0eXBpbmc6IGZhbHNlLCAgICAgICAgICAgLy8gV2hldGhlciB0aGlzIHJlc2V0IHNob3VsZCBiZSBjYXJlZnVsIHRvIGxlYXZlIGV4aXN0aW5nIHRleHQgKGZvciBjb21wb3NpdGluZylcbiAgICBjaGFuZ2VPYmpzOiBudWxsLCAgICAgICAgLy8gQWNjdW11bGF0ZWQgY2hhbmdlcywgZm9yIGZpcmluZyBjaGFuZ2UgZXZlbnRzXG4gICAgY3Vyc29yQWN0aXZpdHlIYW5kbGVyczogbnVsbCwgLy8gU2V0IG9mIGhhbmRsZXJzIHRvIGZpcmUgY3Vyc29yQWN0aXZpdHkgb25cbiAgICBjdXJzb3JBY3Rpdml0eUNhbGxlZDogMCwgLy8gVHJhY2tzIHdoaWNoIGN1cnNvckFjdGl2aXR5IGhhbmRsZXJzIGhhdmUgYmVlbiBjYWxsZWQgYWxyZWFkeVxuICAgIHNlbGVjdGlvbkNoYW5nZWQ6IGZhbHNlLCAvLyBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gbmVlZHMgdG8gYmUgcmVkcmF3blxuICAgIHVwZGF0ZU1heExpbmU6IGZhbHNlLCAgICAvLyBTZXQgd2hlbiB0aGUgd2lkZXN0IGxpbmUgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBhbmV3XG4gICAgc2Nyb2xsTGVmdDogbnVsbCwgc2Nyb2xsVG9wOiBudWxsLCAvLyBJbnRlcm1lZGlhdGUgc2Nyb2xsIHBvc2l0aW9uLCBub3QgcHVzaGVkIHRvIERPTSB5ZXRcbiAgICBzY3JvbGxUb1BvczogbnVsbCwgICAgICAgLy8gVXNlZCB0byBzY3JvbGwgdG8gYSBzcGVjaWZpYyBwb3NpdGlvblxuICAgIGZvY3VzOiBmYWxzZSxcbiAgICBpZDogKytuZXh0T3BJZCAgICAgICAgICAgLy8gVW5pcXVlIElEXG4gIH07XG4gIHB1c2hPcGVyYXRpb24oY20uY3VyT3ApO1xufVxuXG4vLyBGaW5pc2ggYW4gb3BlcmF0aW9uLCB1cGRhdGluZyB0aGUgZGlzcGxheSBhbmQgc2lnbmFsbGluZyBkZWxheWVkIGV2ZW50c1xuZnVuY3Rpb24gZW5kT3BlcmF0aW9uKGNtKSB7XG4gIHZhciBvcCA9IGNtLmN1ck9wO1xuICBmaW5pc2hPcGVyYXRpb24ob3AsIGZ1bmN0aW9uIChncm91cCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAub3BzLmxlbmd0aDsgaSsrKVxuICAgICAgeyBncm91cC5vcHNbaV0uY20uY3VyT3AgPSBudWxsOyB9XG4gICAgZW5kT3BlcmF0aW9ucyhncm91cCk7XG4gIH0pO1xufVxuXG4vLyBUaGUgRE9NIHVwZGF0ZXMgZG9uZSB3aGVuIGFuIG9wZXJhdGlvbiBmaW5pc2hlcyBhcmUgYmF0Y2hlZCBzb1xuLy8gdGhhdCB0aGUgbWluaW11bSBudW1iZXIgb2YgcmVsYXlvdXRzIGFyZSByZXF1aXJlZC5cbmZ1bmN0aW9uIGVuZE9wZXJhdGlvbnMoZ3JvdXApIHtcbiAgdmFyIG9wcyA9IGdyb3VwLm9wcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIC8vIFJlYWQgRE9NXG4gICAgeyBlbmRPcGVyYXRpb25fUjEob3BzW2ldKTsgfVxuICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBvcHMubGVuZ3RoOyBpJDErKykgLy8gV3JpdGUgRE9NIChtYXliZSlcbiAgICB7IGVuZE9wZXJhdGlvbl9XMShvcHNbaSQxXSk7IH1cbiAgZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgb3BzLmxlbmd0aDsgaSQyKyspIC8vIFJlYWQgRE9NXG4gICAgeyBlbmRPcGVyYXRpb25fUjIob3BzW2kkMl0pOyB9XG4gIGZvciAodmFyIGkkMyA9IDA7IGkkMyA8IG9wcy5sZW5ndGg7IGkkMysrKSAvLyBXcml0ZSBET00gKG1heWJlKVxuICAgIHsgZW5kT3BlcmF0aW9uX1cyKG9wc1tpJDNdKTsgfVxuICBmb3IgKHZhciBpJDQgPSAwOyBpJDQgPCBvcHMubGVuZ3RoOyBpJDQrKykgLy8gUmVhZCBET01cbiAgICB7IGVuZE9wZXJhdGlvbl9maW5pc2gob3BzW2kkNF0pOyB9XG59XG5cbmZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9SMShvcCkge1xuICB2YXIgY20gPSBvcC5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gIG1heWJlQ2xpcFNjcm9sbGJhcnMoY20pO1xuICBpZiAob3AudXBkYXRlTWF4TGluZSkgeyBmaW5kTWF4TGluZShjbSk7IH1cblxuICBvcC5tdXN0VXBkYXRlID0gb3Audmlld0NoYW5nZWQgfHwgb3AuZm9yY2VVcGRhdGUgfHwgb3Auc2Nyb2xsVG9wICE9IG51bGwgfHxcbiAgICBvcC5zY3JvbGxUb1BvcyAmJiAob3Auc2Nyb2xsVG9Qb3MuZnJvbS5saW5lIDwgZGlzcGxheS52aWV3RnJvbSB8fFxuICAgICAgICAgICAgICAgICAgICAgICBvcC5zY3JvbGxUb1Bvcy50by5saW5lID49IGRpc3BsYXkudmlld1RvKSB8fFxuICAgIGRpc3BsYXkubWF4TGluZUNoYW5nZWQgJiYgY20ub3B0aW9ucy5saW5lV3JhcHBpbmc7XG4gIG9wLnVwZGF0ZSA9IG9wLm11c3RVcGRhdGUgJiZcbiAgICBuZXcgRGlzcGxheVVwZGF0ZShjbSwgb3AubXVzdFVwZGF0ZSAmJiB7dG9wOiBvcC5zY3JvbGxUb3AsIGVuc3VyZTogb3Auc2Nyb2xsVG9Qb3N9LCBvcC5mb3JjZVVwZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9XMShvcCkge1xuICBvcC51cGRhdGVkRGlzcGxheSA9IG9wLm11c3RVcGRhdGUgJiYgdXBkYXRlRGlzcGxheUlmTmVlZGVkKG9wLmNtLCBvcC51cGRhdGUpO1xufVxuXG5mdW5jdGlvbiBlbmRPcGVyYXRpb25fUjIob3ApIHtcbiAgdmFyIGNtID0gb3AuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICBpZiAob3AudXBkYXRlZERpc3BsYXkpIHsgdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pOyB9XG5cbiAgb3AuYmFyTWVhc3VyZSA9IG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKTtcblxuICAvLyBJZiB0aGUgbWF4IGxpbmUgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBtZWFzdXJlZCwgbWVhc3VyZSBpdCxcbiAgLy8gYW5kIGVuc3VyZSB0aGUgZG9jdW1lbnQncyB3aWR0aCBtYXRjaGVzIGl0LlxuICAvLyB1cGRhdGVEaXNwbGF5X1cyIHdpbGwgdXNlIHRoZXNlIHByb3BlcnRpZXMgdG8gZG8gdGhlIGFjdHVhbCByZXNpemluZ1xuICBpZiAoZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCAmJiAhY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHtcbiAgICBvcC5hZGp1c3RXaWR0aFRvID0gbWVhc3VyZUNoYXIoY20sIGRpc3BsYXkubWF4TGluZSwgZGlzcGxheS5tYXhMaW5lLnRleHQubGVuZ3RoKS5sZWZ0ICsgMztcbiAgICBjbS5kaXNwbGF5LnNpemVyV2lkdGggPSBvcC5hZGp1c3RXaWR0aFRvO1xuICAgIG9wLmJhck1lYXN1cmUuc2Nyb2xsV2lkdGggPVxuICAgICAgTWF0aC5tYXgoZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCwgZGlzcGxheS5zaXplci5vZmZzZXRMZWZ0ICsgb3AuYWRqdXN0V2lkdGhUbyArIHNjcm9sbEdhcChjbSkgKyBjbS5kaXNwbGF5LmJhcldpZHRoKTtcbiAgICBvcC5tYXhTY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgZGlzcGxheS5zaXplci5vZmZzZXRMZWZ0ICsgb3AuYWRqdXN0V2lkdGhUbyAtIGRpc3BsYXlXaWR0aChjbSkpO1xuICB9XG5cbiAgaWYgKG9wLnVwZGF0ZWREaXNwbGF5IHx8IG9wLnNlbGVjdGlvbkNoYW5nZWQpXG4gICAgeyBvcC5wcmVwYXJlZFNlbGVjdGlvbiA9IGRpc3BsYXkuaW5wdXQucHJlcGFyZVNlbGVjdGlvbigpOyB9XG59XG5cbmZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9XMihvcCkge1xuICB2YXIgY20gPSBvcC5jbTtcblxuICBpZiAob3AuYWRqdXN0V2lkdGhUbyAhPSBudWxsKSB7XG4gICAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5XaWR0aCA9IG9wLmFkanVzdFdpZHRoVG8gKyBcInB4XCI7XG4gICAgaWYgKG9wLm1heFNjcm9sbExlZnQgPCBjbS5kb2Muc2Nyb2xsTGVmdClcbiAgICAgIHsgc2V0U2Nyb2xsTGVmdChjbSwgTWF0aC5taW4oY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0LCBvcC5tYXhTY3JvbGxMZWZ0KSwgdHJ1ZSk7IH1cbiAgICBjbS5kaXNwbGF5Lm1heExpbmVDaGFuZ2VkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgdGFrZUZvY3VzID0gb3AuZm9jdXMgJiYgb3AuZm9jdXMgPT0gYWN0aXZlRWx0KCk7XG4gIGlmIChvcC5wcmVwYXJlZFNlbGVjdGlvbilcbiAgICB7IGNtLmRpc3BsYXkuaW5wdXQuc2hvd1NlbGVjdGlvbihvcC5wcmVwYXJlZFNlbGVjdGlvbiwgdGFrZUZvY3VzKTsgfVxuICBpZiAob3AudXBkYXRlZERpc3BsYXkgfHwgb3Auc3RhcnRIZWlnaHQgIT0gY20uZG9jLmhlaWdodClcbiAgICB7IHVwZGF0ZVNjcm9sbGJhcnMoY20sIG9wLmJhck1lYXN1cmUpOyB9XG4gIGlmIChvcC51cGRhdGVkRGlzcGxheSlcbiAgICB7IHNldERvY3VtZW50SGVpZ2h0KGNtLCBvcC5iYXJNZWFzdXJlKTsgfVxuXG4gIGlmIChvcC5zZWxlY3Rpb25DaGFuZ2VkKSB7IHJlc3RhcnRCbGluayhjbSk7IH1cblxuICBpZiAoY20uc3RhdGUuZm9jdXNlZCAmJiBvcC51cGRhdGVJbnB1dClcbiAgICB7IGNtLmRpc3BsYXkuaW5wdXQucmVzZXQob3AudHlwaW5nKTsgfVxuICBpZiAodGFrZUZvY3VzKSB7IGVuc3VyZUZvY3VzKG9wLmNtKTsgfVxufVxuXG5mdW5jdGlvbiBlbmRPcGVyYXRpb25fZmluaXNoKG9wKSB7XG4gIHZhciBjbSA9IG9wLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jO1xuXG4gIGlmIChvcC51cGRhdGVkRGlzcGxheSkgeyBwb3N0VXBkYXRlRGlzcGxheShjbSwgb3AudXBkYXRlKTsgfVxuXG4gIC8vIEFib3J0IG1vdXNlIHdoZWVsIGRlbHRhIG1lYXN1cmVtZW50LCB3aGVuIHNjcm9sbGluZyBleHBsaWNpdGx5XG4gIGlmIChkaXNwbGF5LndoZWVsU3RhcnRYICE9IG51bGwgJiYgKG9wLnNjcm9sbFRvcCAhPSBudWxsIHx8IG9wLnNjcm9sbExlZnQgIT0gbnVsbCB8fCBvcC5zY3JvbGxUb1BvcykpXG4gICAgeyBkaXNwbGF5LndoZWVsU3RhcnRYID0gZGlzcGxheS53aGVlbFN0YXJ0WSA9IG51bGw7IH1cblxuICAvLyBQcm9wYWdhdGUgdGhlIHNjcm9sbCBwb3NpdGlvbiB0byB0aGUgYWN0dWFsIERPTSBzY3JvbGxlclxuICBpZiAob3Auc2Nyb2xsVG9wICE9IG51bGwpIHsgc2V0U2Nyb2xsVG9wKGNtLCBvcC5zY3JvbGxUb3AsIG9wLmZvcmNlU2Nyb2xsKTsgfVxuXG4gIGlmIChvcC5zY3JvbGxMZWZ0ICE9IG51bGwpIHsgc2V0U2Nyb2xsTGVmdChjbSwgb3Auc2Nyb2xsTGVmdCwgdHJ1ZSwgdHJ1ZSk7IH1cbiAgLy8gSWYgd2UgbmVlZCB0byBzY3JvbGwgYSBzcGVjaWZpYyBwb3NpdGlvbiBpbnRvIHZpZXcsIGRvIHNvLlxuICBpZiAob3Auc2Nyb2xsVG9Qb3MpIHtcbiAgICB2YXIgcmVjdCA9IHNjcm9sbFBvc0ludG9WaWV3KGNtLCBjbGlwUG9zKGRvYywgb3Auc2Nyb2xsVG9Qb3MuZnJvbSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUG9zKGRvYywgb3Auc2Nyb2xsVG9Qb3MudG8pLCBvcC5zY3JvbGxUb1Bvcy5tYXJnaW4pO1xuICAgIG1heWJlU2Nyb2xsV2luZG93KGNtLCByZWN0KTtcbiAgfVxuXG4gIC8vIEZpcmUgZXZlbnRzIGZvciBtYXJrZXJzIHRoYXQgYXJlIGhpZGRlbi91bmlkZGVuIGJ5IGVkaXRpbmcgb3JcbiAgLy8gdW5kb2luZ1xuICB2YXIgaGlkZGVuID0gb3AubWF5YmVIaWRkZW5NYXJrZXJzLCB1bmhpZGRlbiA9IG9wLm1heWJlVW5oaWRkZW5NYXJrZXJzO1xuICBpZiAoaGlkZGVuKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgaGlkZGVuLmxlbmd0aDsgKytpKVxuICAgIHsgaWYgKCFoaWRkZW5baV0ubGluZXMubGVuZ3RoKSB7IHNpZ25hbChoaWRkZW5baV0sIFwiaGlkZVwiKTsgfSB9IH1cbiAgaWYgKHVuaGlkZGVuKSB7IGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHVuaGlkZGVuLmxlbmd0aDsgKytpJDEpXG4gICAgeyBpZiAodW5oaWRkZW5baSQxXS5saW5lcy5sZW5ndGgpIHsgc2lnbmFsKHVuaGlkZGVuW2kkMV0sIFwidW5oaWRlXCIpOyB9IH0gfVxuXG4gIGlmIChkaXNwbGF5LndyYXBwZXIub2Zmc2V0SGVpZ2h0KVxuICAgIHsgZG9jLnNjcm9sbFRvcCA9IGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wOyB9XG5cbiAgLy8gRmlyZSBjaGFuZ2UgZXZlbnRzLCBhbmQgZGVsYXllZCBldmVudCBoYW5kbGVyc1xuICBpZiAob3AuY2hhbmdlT2JqcylcbiAgICB7IHNpZ25hbChjbSwgXCJjaGFuZ2VzXCIsIGNtLCBvcC5jaGFuZ2VPYmpzKTsgfVxuICBpZiAob3AudXBkYXRlKVxuICAgIHsgb3AudXBkYXRlLmZpbmlzaCgpOyB9XG59XG5cbi8vIFJ1biB0aGUgZ2l2ZW4gZnVuY3Rpb24gaW4gYW4gb3BlcmF0aW9uXG5mdW5jdGlvbiBydW5Jbk9wKGNtLCBmKSB7XG4gIGlmIChjbS5jdXJPcCkgeyByZXR1cm4gZigpIH1cbiAgc3RhcnRPcGVyYXRpb24oY20pO1xuICB0cnkgeyByZXR1cm4gZigpIH1cbiAgZmluYWxseSB7IGVuZE9wZXJhdGlvbihjbSk7IH1cbn1cbi8vIFdyYXBzIGEgZnVuY3Rpb24gaW4gYW4gb3BlcmF0aW9uLiBSZXR1cm5zIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLlxuZnVuY3Rpb24gb3BlcmF0aW9uKGNtLCBmKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAoY20uY3VyT3ApIHsgcmV0dXJuIGYuYXBwbHkoY20sIGFyZ3VtZW50cykgfVxuICAgIHN0YXJ0T3BlcmF0aW9uKGNtKTtcbiAgICB0cnkgeyByZXR1cm4gZi5hcHBseShjbSwgYXJndW1lbnRzKSB9XG4gICAgZmluYWxseSB7IGVuZE9wZXJhdGlvbihjbSk7IH1cbiAgfVxufVxuLy8gVXNlZCB0byBhZGQgbWV0aG9kcyB0byBlZGl0b3IgYW5kIGRvYyBpbnN0YW5jZXMsIHdyYXBwaW5nIHRoZW0gaW5cbi8vIG9wZXJhdGlvbnMuXG5mdW5jdGlvbiBtZXRob2RPcChmKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJPcCkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgICBzdGFydE9wZXJhdGlvbih0aGlzKTtcbiAgICB0cnkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgICBmaW5hbGx5IHsgZW5kT3BlcmF0aW9uKHRoaXMpOyB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRvY01ldGhvZE9wKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBjbSA9IHRoaXMuY207XG4gICAgaWYgKCFjbSB8fCBjbS5jdXJPcCkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgICBzdGFydE9wZXJhdGlvbihjbSk7XG4gICAgdHJ5IHsgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKSB9XG4gICAgZmluYWxseSB7IGVuZE9wZXJhdGlvbihjbSk7IH1cbiAgfVxufVxuXG4vLyBVcGRhdGVzIHRoZSBkaXNwbGF5LnZpZXcgZGF0YSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gY2hhbmdlIHRvIHRoZVxuLy8gZG9jdW1lbnQuIEZyb20gYW5kIHRvIGFyZSBpbiBwcmUtY2hhbmdlIGNvb3JkaW5hdGVzLiBMZW5kaWZmIGlzXG4vLyB0aGUgYW1vdW50IG9mIGxpbmVzIGFkZGVkIG9yIHN1YnRyYWN0ZWQgYnkgdGhlIGNoYW5nZS4gVGhpcyBpc1xuLy8gdXNlZCBmb3IgY2hhbmdlcyB0aGF0IHNwYW4gbXVsdGlwbGUgbGluZXMsIG9yIGNoYW5nZSB0aGUgd2F5XG4vLyBsaW5lcyBhcmUgZGl2aWRlZCBpbnRvIHZpc3VhbCBsaW5lcy4gcmVnTGluZUNoYW5nZSAoYmVsb3cpXG4vLyByZWdpc3RlcnMgc2luZ2xlLWxpbmUgY2hhbmdlcy5cbmZ1bmN0aW9uIHJlZ0NoYW5nZShjbSwgZnJvbSwgdG8sIGxlbmRpZmYpIHtcbiAgaWYgKGZyb20gPT0gbnVsbCkgeyBmcm9tID0gY20uZG9jLmZpcnN0OyB9XG4gIGlmICh0byA9PSBudWxsKSB7IHRvID0gY20uZG9jLmZpcnN0ICsgY20uZG9jLnNpemU7IH1cbiAgaWYgKCFsZW5kaWZmKSB7IGxlbmRpZmYgPSAwOyB9XG5cbiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICBpZiAobGVuZGlmZiAmJiB0byA8IGRpc3BsYXkudmlld1RvICYmXG4gICAgICAoZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA9PSBudWxsIHx8IGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPiBmcm9tKSlcbiAgICB7IGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPSBmcm9tOyB9XG5cbiAgY20uY3VyT3Audmlld0NoYW5nZWQgPSB0cnVlO1xuXG4gIGlmIChmcm9tID49IGRpc3BsYXkudmlld1RvKSB7IC8vIENoYW5nZSBhZnRlclxuICAgIGlmIChzYXdDb2xsYXBzZWRTcGFucyAmJiB2aXN1YWxMaW5lTm8oY20uZG9jLCBmcm9tKSA8IGRpc3BsYXkudmlld1RvKVxuICAgICAgeyByZXNldFZpZXcoY20pOyB9XG4gIH0gZWxzZSBpZiAodG8gPD0gZGlzcGxheS52aWV3RnJvbSkgeyAvLyBDaGFuZ2UgYmVmb3JlXG4gICAgaWYgKHNhd0NvbGxhcHNlZFNwYW5zICYmIHZpc3VhbExpbmVFbmRObyhjbS5kb2MsIHRvICsgbGVuZGlmZikgPiBkaXNwbGF5LnZpZXdGcm9tKSB7XG4gICAgICByZXNldFZpZXcoY20pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNwbGF5LnZpZXdGcm9tICs9IGxlbmRpZmY7XG4gICAgICBkaXNwbGF5LnZpZXdUbyArPSBsZW5kaWZmO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmcm9tIDw9IGRpc3BsYXkudmlld0Zyb20gJiYgdG8gPj0gZGlzcGxheS52aWV3VG8pIHsgLy8gRnVsbCBvdmVybGFwXG4gICAgcmVzZXRWaWV3KGNtKTtcbiAgfSBlbHNlIGlmIChmcm9tIDw9IGRpc3BsYXkudmlld0Zyb20pIHsgLy8gVG9wIG92ZXJsYXBcbiAgICB2YXIgY3V0ID0gdmlld0N1dHRpbmdQb2ludChjbSwgdG8sIHRvICsgbGVuZGlmZiwgMSk7XG4gICAgaWYgKGN1dCkge1xuICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKGN1dC5pbmRleCk7XG4gICAgICBkaXNwbGF5LnZpZXdGcm9tID0gY3V0LmxpbmVOO1xuICAgICAgZGlzcGxheS52aWV3VG8gKz0gbGVuZGlmZjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXRWaWV3KGNtKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodG8gPj0gZGlzcGxheS52aWV3VG8pIHsgLy8gQm90dG9tIG92ZXJsYXBcbiAgICB2YXIgY3V0JDEgPSB2aWV3Q3V0dGluZ1BvaW50KGNtLCBmcm9tLCBmcm9tLCAtMSk7XG4gICAgaWYgKGN1dCQxKSB7XG4gICAgICBkaXNwbGF5LnZpZXcgPSBkaXNwbGF5LnZpZXcuc2xpY2UoMCwgY3V0JDEuaW5kZXgpO1xuICAgICAgZGlzcGxheS52aWV3VG8gPSBjdXQkMS5saW5lTjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXRWaWV3KGNtKTtcbiAgICB9XG4gIH0gZWxzZSB7IC8vIEdhcCBpbiB0aGUgbWlkZGxlXG4gICAgdmFyIGN1dFRvcCA9IHZpZXdDdXR0aW5nUG9pbnQoY20sIGZyb20sIGZyb20sIC0xKTtcbiAgICB2YXIgY3V0Qm90ID0gdmlld0N1dHRpbmdQb2ludChjbSwgdG8sIHRvICsgbGVuZGlmZiwgMSk7XG4gICAgaWYgKGN1dFRvcCAmJiBjdXRCb3QpIHtcbiAgICAgIGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5zbGljZSgwLCBjdXRUb3AuaW5kZXgpXG4gICAgICAgIC5jb25jYXQoYnVpbGRWaWV3QXJyYXkoY20sIGN1dFRvcC5saW5lTiwgY3V0Qm90LmxpbmVOKSlcbiAgICAgICAgLmNvbmNhdChkaXNwbGF5LnZpZXcuc2xpY2UoY3V0Qm90LmluZGV4KSk7XG4gICAgICBkaXNwbGF5LnZpZXdUbyArPSBsZW5kaWZmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNldFZpZXcoY20pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBleHQgPSBkaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQ7XG4gIGlmIChleHQpIHtcbiAgICBpZiAodG8gPCBleHQubGluZU4pXG4gICAgICB7IGV4dC5saW5lTiArPSBsZW5kaWZmOyB9XG4gICAgZWxzZSBpZiAoZnJvbSA8IGV4dC5saW5lTiArIGV4dC5zaXplKVxuICAgICAgeyBkaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBudWxsOyB9XG4gIH1cbn1cblxuLy8gUmVnaXN0ZXIgYSBjaGFuZ2UgdG8gYSBzaW5nbGUgbGluZS4gVHlwZSBtdXN0IGJlIG9uZSBvZiBcInRleHRcIixcbi8vIFwiZ3V0dGVyXCIsIFwiY2xhc3NcIiwgXCJ3aWRnZXRcIlxuZnVuY3Rpb24gcmVnTGluZUNoYW5nZShjbSwgbGluZSwgdHlwZSkge1xuICBjbS5jdXJPcC52aWV3Q2hhbmdlZCA9IHRydWU7XG4gIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgZXh0ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkO1xuICBpZiAoZXh0ICYmIGxpbmUgPj0gZXh0LmxpbmVOICYmIGxpbmUgPCBleHQubGluZU4gKyBleHQuc2l6ZSlcbiAgICB7IGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCA9IG51bGw7IH1cblxuICBpZiAobGluZSA8IGRpc3BsYXkudmlld0Zyb20gfHwgbGluZSA+PSBkaXNwbGF5LnZpZXdUbykgeyByZXR1cm4gfVxuICB2YXIgbGluZVZpZXcgPSBkaXNwbGF5LnZpZXdbZmluZFZpZXdJbmRleChjbSwgbGluZSldO1xuICBpZiAobGluZVZpZXcubm9kZSA9PSBudWxsKSB7IHJldHVybiB9XG4gIHZhciBhcnIgPSBsaW5lVmlldy5jaGFuZ2VzIHx8IChsaW5lVmlldy5jaGFuZ2VzID0gW10pO1xuICBpZiAoaW5kZXhPZihhcnIsIHR5cGUpID09IC0xKSB7IGFyci5wdXNoKHR5cGUpOyB9XG59XG5cbi8vIENsZWFyIHRoZSB2aWV3LlxuZnVuY3Rpb24gcmVzZXRWaWV3KGNtKSB7XG4gIGNtLmRpc3BsYXkudmlld0Zyb20gPSBjbS5kaXNwbGF5LnZpZXdUbyA9IGNtLmRvYy5maXJzdDtcbiAgY20uZGlzcGxheS52aWV3ID0gW107XG4gIGNtLmRpc3BsYXkudmlld09mZnNldCA9IDA7XG59XG5cbmZ1bmN0aW9uIHZpZXdDdXR0aW5nUG9pbnQoY20sIG9sZE4sIG5ld04sIGRpcikge1xuICB2YXIgaW5kZXggPSBmaW5kVmlld0luZGV4KGNtLCBvbGROKSwgZGlmZiwgdmlldyA9IGNtLmRpc3BsYXkudmlldztcbiAgaWYgKCFzYXdDb2xsYXBzZWRTcGFucyB8fCBuZXdOID09IGNtLmRvYy5maXJzdCArIGNtLmRvYy5zaXplKVxuICAgIHsgcmV0dXJuIHtpbmRleDogaW5kZXgsIGxpbmVOOiBuZXdOfSB9XG4gIHZhciBuID0gY20uZGlzcGxheS52aWV3RnJvbTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmRleDsgaSsrKVxuICAgIHsgbiArPSB2aWV3W2ldLnNpemU7IH1cbiAgaWYgKG4gIT0gb2xkTikge1xuICAgIGlmIChkaXIgPiAwKSB7XG4gICAgICBpZiAoaW5kZXggPT0gdmlldy5sZW5ndGggLSAxKSB7IHJldHVybiBudWxsIH1cbiAgICAgIGRpZmYgPSAobiArIHZpZXdbaW5kZXhdLnNpemUpIC0gb2xkTjtcbiAgICAgIGluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpZmYgPSBuIC0gb2xkTjtcbiAgICB9XG4gICAgb2xkTiArPSBkaWZmOyBuZXdOICs9IGRpZmY7XG4gIH1cbiAgd2hpbGUgKHZpc3VhbExpbmVObyhjbS5kb2MsIG5ld04pICE9IG5ld04pIHtcbiAgICBpZiAoaW5kZXggPT0gKGRpciA8IDAgPyAwIDogdmlldy5sZW5ndGggLSAxKSkgeyByZXR1cm4gbnVsbCB9XG4gICAgbmV3TiArPSBkaXIgKiB2aWV3W2luZGV4IC0gKGRpciA8IDAgPyAxIDogMCldLnNpemU7XG4gICAgaW5kZXggKz0gZGlyO1xuICB9XG4gIHJldHVybiB7aW5kZXg6IGluZGV4LCBsaW5lTjogbmV3Tn1cbn1cblxuLy8gRm9yY2UgdGhlIHZpZXcgdG8gY292ZXIgYSBnaXZlbiByYW5nZSwgYWRkaW5nIGVtcHR5IHZpZXcgZWxlbWVudFxuLy8gb3IgY2xpcHBpbmcgb2ZmIGV4aXN0aW5nIG9uZXMgYXMgbmVlZGVkLlxuZnVuY3Rpb24gYWRqdXN0VmlldyhjbSwgZnJvbSwgdG8pIHtcbiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCB2aWV3ID0gZGlzcGxheS52aWV3O1xuICBpZiAodmlldy5sZW5ndGggPT0gMCB8fCBmcm9tID49IGRpc3BsYXkudmlld1RvIHx8IHRvIDw9IGRpc3BsYXkudmlld0Zyb20pIHtcbiAgICBkaXNwbGF5LnZpZXcgPSBidWlsZFZpZXdBcnJheShjbSwgZnJvbSwgdG8pO1xuICAgIGRpc3BsYXkudmlld0Zyb20gPSBmcm9tO1xuICB9IGVsc2Uge1xuICAgIGlmIChkaXNwbGF5LnZpZXdGcm9tID4gZnJvbSlcbiAgICAgIHsgZGlzcGxheS52aWV3ID0gYnVpbGRWaWV3QXJyYXkoY20sIGZyb20sIGRpc3BsYXkudmlld0Zyb20pLmNvbmNhdChkaXNwbGF5LnZpZXcpOyB9XG4gICAgZWxzZSBpZiAoZGlzcGxheS52aWV3RnJvbSA8IGZyb20pXG4gICAgICB7IGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5zbGljZShmaW5kVmlld0luZGV4KGNtLCBmcm9tKSk7IH1cbiAgICBkaXNwbGF5LnZpZXdGcm9tID0gZnJvbTtcbiAgICBpZiAoZGlzcGxheS52aWV3VG8gPCB0bylcbiAgICAgIHsgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LmNvbmNhdChidWlsZFZpZXdBcnJheShjbSwgZGlzcGxheS52aWV3VG8sIHRvKSk7IH1cbiAgICBlbHNlIGlmIChkaXNwbGF5LnZpZXdUbyA+IHRvKVxuICAgICAgeyBkaXNwbGF5LnZpZXcgPSBkaXNwbGF5LnZpZXcuc2xpY2UoMCwgZmluZFZpZXdJbmRleChjbSwgdG8pKTsgfVxuICB9XG4gIGRpc3BsYXkudmlld1RvID0gdG87XG59XG5cbi8vIENvdW50IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHZpZXcgd2hvc2UgRE9NIHJlcHJlc2VudGF0aW9uIGlzXG4vLyBvdXQgb2YgZGF0ZSAob3Igbm9uZXhpc3RlbnQpLlxuZnVuY3Rpb24gY291bnREaXJ0eVZpZXcoY20pIHtcbiAgdmFyIHZpZXcgPSBjbS5kaXNwbGF5LnZpZXcsIGRpcnR5ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxpbmVWaWV3ID0gdmlld1tpXTtcbiAgICBpZiAoIWxpbmVWaWV3LmhpZGRlbiAmJiAoIWxpbmVWaWV3Lm5vZGUgfHwgbGluZVZpZXcuY2hhbmdlcykpIHsgKytkaXJ0eTsgfVxuICB9XG4gIHJldHVybiBkaXJ0eVxufVxuXG4vLyBISUdITElHSFQgV09SS0VSXG5cbmZ1bmN0aW9uIHN0YXJ0V29ya2VyKGNtLCB0aW1lKSB7XG4gIGlmIChjbS5kb2MuaGlnaGxpZ2h0RnJvbnRpZXIgPCBjbS5kaXNwbGF5LnZpZXdUbylcbiAgICB7IGNtLnN0YXRlLmhpZ2hsaWdodC5zZXQodGltZSwgYmluZChoaWdobGlnaHRXb3JrZXIsIGNtKSk7IH1cbn1cblxuZnVuY3Rpb24gaGlnaGxpZ2h0V29ya2VyKGNtKSB7XG4gIHZhciBkb2MgPSBjbS5kb2M7XG4gIGlmIChkb2MuaGlnaGxpZ2h0RnJvbnRpZXIgPj0gY20uZGlzcGxheS52aWV3VG8pIHsgcmV0dXJuIH1cbiAgdmFyIGVuZCA9ICtuZXcgRGF0ZSArIGNtLm9wdGlvbnMud29ya1RpbWU7XG4gIHZhciBjb250ZXh0ID0gZ2V0Q29udGV4dEJlZm9yZShjbSwgZG9jLmhpZ2hsaWdodEZyb250aWVyKTtcbiAgdmFyIGNoYW5nZWRMaW5lcyA9IFtdO1xuXG4gIGRvYy5pdGVyKGNvbnRleHQubGluZSwgTWF0aC5taW4oZG9jLmZpcnN0ICsgZG9jLnNpemUsIGNtLmRpc3BsYXkudmlld1RvICsgNTAwKSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICBpZiAoY29udGV4dC5saW5lID49IGNtLmRpc3BsYXkudmlld0Zyb20pIHsgLy8gVmlzaWJsZVxuICAgICAgdmFyIG9sZFN0eWxlcyA9IGxpbmUuc3R5bGVzO1xuICAgICAgdmFyIHJlc2V0U3RhdGUgPSBsaW5lLnRleHQubGVuZ3RoID4gY20ub3B0aW9ucy5tYXhIaWdobGlnaHRMZW5ndGggPyBjb3B5U3RhdGUoZG9jLm1vZGUsIGNvbnRleHQuc3RhdGUpIDogbnVsbDtcbiAgICAgIHZhciBoaWdobGlnaHRlZCA9IGhpZ2hsaWdodExpbmUoY20sIGxpbmUsIGNvbnRleHQsIHRydWUpO1xuICAgICAgaWYgKHJlc2V0U3RhdGUpIHsgY29udGV4dC5zdGF0ZSA9IHJlc2V0U3RhdGU7IH1cbiAgICAgIGxpbmUuc3R5bGVzID0gaGlnaGxpZ2h0ZWQuc3R5bGVzO1xuICAgICAgdmFyIG9sZENscyA9IGxpbmUuc3R5bGVDbGFzc2VzLCBuZXdDbHMgPSBoaWdobGlnaHRlZC5jbGFzc2VzO1xuICAgICAgaWYgKG5ld0NscykgeyBsaW5lLnN0eWxlQ2xhc3NlcyA9IG5ld0NsczsgfVxuICAgICAgZWxzZSBpZiAob2xkQ2xzKSB7IGxpbmUuc3R5bGVDbGFzc2VzID0gbnVsbDsgfVxuICAgICAgdmFyIGlzY2hhbmdlID0gIW9sZFN0eWxlcyB8fCBvbGRTdHlsZXMubGVuZ3RoICE9IGxpbmUuc3R5bGVzLmxlbmd0aCB8fFxuICAgICAgICBvbGRDbHMgIT0gbmV3Q2xzICYmICghb2xkQ2xzIHx8ICFuZXdDbHMgfHwgb2xkQ2xzLmJnQ2xhc3MgIT0gbmV3Q2xzLmJnQ2xhc3MgfHwgb2xkQ2xzLnRleHRDbGFzcyAhPSBuZXdDbHMudGV4dENsYXNzKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyAhaXNjaGFuZ2UgJiYgaSA8IG9sZFN0eWxlcy5sZW5ndGg7ICsraSkgeyBpc2NoYW5nZSA9IG9sZFN0eWxlc1tpXSAhPSBsaW5lLnN0eWxlc1tpXTsgfVxuICAgICAgaWYgKGlzY2hhbmdlKSB7IGNoYW5nZWRMaW5lcy5wdXNoKGNvbnRleHQubGluZSk7IH1cbiAgICAgIGxpbmUuc3RhdGVBZnRlciA9IGNvbnRleHQuc2F2ZSgpO1xuICAgICAgY29udGV4dC5uZXh0TGluZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobGluZS50ZXh0Lmxlbmd0aCA8PSBjbS5vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aClcbiAgICAgICAgeyBwcm9jZXNzTGluZShjbSwgbGluZS50ZXh0LCBjb250ZXh0KTsgfVxuICAgICAgbGluZS5zdGF0ZUFmdGVyID0gY29udGV4dC5saW5lICUgNSA9PSAwID8gY29udGV4dC5zYXZlKCkgOiBudWxsO1xuICAgICAgY29udGV4dC5uZXh0TGluZSgpO1xuICAgIH1cbiAgICBpZiAoK25ldyBEYXRlID4gZW5kKSB7XG4gICAgICBzdGFydFdvcmtlcihjbSwgY20ub3B0aW9ucy53b3JrRGVsYXkpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH0pO1xuICBkb2MuaGlnaGxpZ2h0RnJvbnRpZXIgPSBjb250ZXh0LmxpbmU7XG4gIGRvYy5tb2RlRnJvbnRpZXIgPSBNYXRoLm1heChkb2MubW9kZUZyb250aWVyLCBjb250ZXh0LmxpbmUpO1xuICBpZiAoY2hhbmdlZExpbmVzLmxlbmd0aCkgeyBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VkTGluZXMubGVuZ3RoOyBpKyspXG4gICAgICB7IHJlZ0xpbmVDaGFuZ2UoY20sIGNoYW5nZWRMaW5lc1tpXSwgXCJ0ZXh0XCIpOyB9XG4gIH0pOyB9XG59XG5cbi8vIERJU1BMQVkgRFJBV0lOR1xuXG52YXIgRGlzcGxheVVwZGF0ZSA9IGZ1bmN0aW9uKGNtLCB2aWV3cG9ydCwgZm9yY2UpIHtcbiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuXG4gIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgLy8gU3RvcmUgc29tZSB2YWx1ZXMgdGhhdCB3ZSdsbCBuZWVkIGxhdGVyIChidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSBhIHJlbGF5b3V0IGZvcilcbiAgdGhpcy52aXNpYmxlID0gdmlzaWJsZUxpbmVzKGRpc3BsYXksIGNtLmRvYywgdmlld3BvcnQpO1xuICB0aGlzLmVkaXRvcklzSGlkZGVuID0gIWRpc3BsYXkud3JhcHBlci5vZmZzZXRXaWR0aDtcbiAgdGhpcy53cmFwcGVySGVpZ2h0ID0gZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodDtcbiAgdGhpcy53cmFwcGVyV2lkdGggPSBkaXNwbGF5LndyYXBwZXIuY2xpZW50V2lkdGg7XG4gIHRoaXMub2xkRGlzcGxheVdpZHRoID0gZGlzcGxheVdpZHRoKGNtKTtcbiAgdGhpcy5mb3JjZSA9IGZvcmNlO1xuICB0aGlzLmRpbXMgPSBnZXREaW1lbnNpb25zKGNtKTtcbiAgdGhpcy5ldmVudHMgPSBbXTtcbn07XG5cbkRpc3BsYXlVcGRhdGUucHJvdG90eXBlLnNpZ25hbCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIGlmIChoYXNIYW5kbGVyKGVtaXR0ZXIsIHR5cGUpKVxuICAgIHsgdGhpcy5ldmVudHMucHVzaChhcmd1bWVudHMpOyB9XG59O1xuRGlzcGxheVVwZGF0ZS5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ldmVudHMubGVuZ3RoOyBpKyspXG4gICAgeyBzaWduYWwuYXBwbHkobnVsbCwgdGhpcyQxLmV2ZW50c1tpXSk7IH1cbn07XG5cbmZ1bmN0aW9uIG1heWJlQ2xpcFNjcm9sbGJhcnMoY20pIHtcbiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICBpZiAoIWRpc3BsYXkuc2Nyb2xsYmFyc0NsaXBwZWQgJiYgZGlzcGxheS5zY3JvbGxlci5vZmZzZXRXaWR0aCkge1xuICAgIGRpc3BsYXkubmF0aXZlQmFyV2lkdGggPSBkaXNwbGF5LnNjcm9sbGVyLm9mZnNldFdpZHRoIC0gZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aDtcbiAgICBkaXNwbGF5LmhlaWdodEZvcmNlci5zdHlsZS5oZWlnaHQgPSBzY3JvbGxHYXAoY20pICsgXCJweFwiO1xuICAgIGRpc3BsYXkuc2l6ZXIuc3R5bGUubWFyZ2luQm90dG9tID0gLWRpc3BsYXkubmF0aXZlQmFyV2lkdGggKyBcInB4XCI7XG4gICAgZGlzcGxheS5zaXplci5zdHlsZS5ib3JkZXJSaWdodFdpZHRoID0gc2Nyb2xsR2FwKGNtKSArIFwicHhcIjtcbiAgICBkaXNwbGF5LnNjcm9sbGJhcnNDbGlwcGVkID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25TbmFwc2hvdChjbSkge1xuICBpZiAoY20uaGFzRm9jdXMoKSkgeyByZXR1cm4gbnVsbCB9XG4gIHZhciBhY3RpdmUgPSBhY3RpdmVFbHQoKTtcbiAgaWYgKCFhY3RpdmUgfHwgIWNvbnRhaW5zKGNtLmRpc3BsYXkubGluZURpdiwgYWN0aXZlKSkgeyByZXR1cm4gbnVsbCB9XG4gIHZhciByZXN1bHQgPSB7YWN0aXZlRWx0OiBhY3RpdmV9O1xuICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHNlbC5hbmNob3JOb2RlICYmIHNlbC5leHRlbmQgJiYgY29udGFpbnMoY20uZGlzcGxheS5saW5lRGl2LCBzZWwuYW5jaG9yTm9kZSkpIHtcbiAgICAgIHJlc3VsdC5hbmNob3JOb2RlID0gc2VsLmFuY2hvck5vZGU7XG4gICAgICByZXN1bHQuYW5jaG9yT2Zmc2V0ID0gc2VsLmFuY2hvck9mZnNldDtcbiAgICAgIHJlc3VsdC5mb2N1c05vZGUgPSBzZWwuZm9jdXNOb2RlO1xuICAgICAgcmVzdWx0LmZvY3VzT2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVTZWxlY3Rpb24oc25hcHNob3QpIHtcbiAgaWYgKCFzbmFwc2hvdCB8fCAhc25hcHNob3QuYWN0aXZlRWx0IHx8IHNuYXBzaG90LmFjdGl2ZUVsdCA9PSBhY3RpdmVFbHQoKSkgeyByZXR1cm4gfVxuICBzbmFwc2hvdC5hY3RpdmVFbHQuZm9jdXMoKTtcbiAgaWYgKHNuYXBzaG90LmFuY2hvck5vZGUgJiYgY29udGFpbnMoZG9jdW1lbnQuYm9keSwgc25hcHNob3QuYW5jaG9yTm9kZSkgJiYgY29udGFpbnMoZG9jdW1lbnQuYm9keSwgc25hcHNob3QuZm9jdXNOb2RlKSkge1xuICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCksIHJhbmdlJCQxID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZSQkMS5zZXRFbmQoc25hcHNob3QuYW5jaG9yTm9kZSwgc25hcHNob3QuYW5jaG9yT2Zmc2V0KTtcbiAgICByYW5nZSQkMS5jb2xsYXBzZShmYWxzZSk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSQkMSk7XG4gICAgc2VsLmV4dGVuZChzbmFwc2hvdC5mb2N1c05vZGUsIHNuYXBzaG90LmZvY3VzT2Zmc2V0KTtcbiAgfVxufVxuXG4vLyBEb2VzIHRoZSBhY3R1YWwgdXBkYXRpbmcgb2YgdGhlIGxpbmUgZGlzcGxheS4gQmFpbHMgb3V0XG4vLyAocmV0dXJuaW5nIGZhbHNlKSB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSBhbmQgZm9yY2VkIGlzXG4vLyBmYWxzZS5cbmZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlJZk5lZWRlZChjbSwgdXBkYXRlKSB7XG4gIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jO1xuXG4gIGlmICh1cGRhdGUuZWRpdG9ySXNIaWRkZW4pIHtcbiAgICByZXNldFZpZXcoY20pO1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gQmFpbCBvdXQgaWYgdGhlIHZpc2libGUgYXJlYSBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBub3RoaW5nIGNoYW5nZWQuXG4gIGlmICghdXBkYXRlLmZvcmNlICYmXG4gICAgICB1cGRhdGUudmlzaWJsZS5mcm9tID49IGRpc3BsYXkudmlld0Zyb20gJiYgdXBkYXRlLnZpc2libGUudG8gPD0gZGlzcGxheS52aWV3VG8gJiZcbiAgICAgIChkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID09IG51bGwgfHwgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA+PSBkaXNwbGF5LnZpZXdUbykgJiZcbiAgICAgIGRpc3BsYXkucmVuZGVyZWRWaWV3ID09IGRpc3BsYXkudmlldyAmJiBjb3VudERpcnR5VmlldyhjbSkgPT0gMClcbiAgICB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKG1heWJlVXBkYXRlTGluZU51bWJlcldpZHRoKGNtKSkge1xuICAgIHJlc2V0VmlldyhjbSk7XG4gICAgdXBkYXRlLmRpbXMgPSBnZXREaW1lbnNpb25zKGNtKTtcbiAgfVxuXG4gIC8vIENvbXB1dGUgYSBzdWl0YWJsZSBuZXcgdmlld3BvcnQgKGZyb20gJiB0bylcbiAgdmFyIGVuZCA9IGRvYy5maXJzdCArIGRvYy5zaXplO1xuICB2YXIgZnJvbSA9IE1hdGgubWF4KHVwZGF0ZS52aXNpYmxlLmZyb20gLSBjbS5vcHRpb25zLnZpZXdwb3J0TWFyZ2luLCBkb2MuZmlyc3QpO1xuICB2YXIgdG8gPSBNYXRoLm1pbihlbmQsIHVwZGF0ZS52aXNpYmxlLnRvICsgY20ub3B0aW9ucy52aWV3cG9ydE1hcmdpbik7XG4gIGlmIChkaXNwbGF5LnZpZXdGcm9tIDwgZnJvbSAmJiBmcm9tIC0gZGlzcGxheS52aWV3RnJvbSA8IDIwKSB7IGZyb20gPSBNYXRoLm1heChkb2MuZmlyc3QsIGRpc3BsYXkudmlld0Zyb20pOyB9XG4gIGlmIChkaXNwbGF5LnZpZXdUbyA+IHRvICYmIGRpc3BsYXkudmlld1RvIC0gdG8gPCAyMCkgeyB0byA9IE1hdGgubWluKGVuZCwgZGlzcGxheS52aWV3VG8pOyB9XG4gIGlmIChzYXdDb2xsYXBzZWRTcGFucykge1xuICAgIGZyb20gPSB2aXN1YWxMaW5lTm8oY20uZG9jLCBmcm9tKTtcbiAgICB0byA9IHZpc3VhbExpbmVFbmRObyhjbS5kb2MsIHRvKTtcbiAgfVxuXG4gIHZhciBkaWZmZXJlbnQgPSBmcm9tICE9IGRpc3BsYXkudmlld0Zyb20gfHwgdG8gIT0gZGlzcGxheS52aWV3VG8gfHxcbiAgICBkaXNwbGF5Lmxhc3RXcmFwSGVpZ2h0ICE9IHVwZGF0ZS53cmFwcGVySGVpZ2h0IHx8IGRpc3BsYXkubGFzdFdyYXBXaWR0aCAhPSB1cGRhdGUud3JhcHBlcldpZHRoO1xuICBhZGp1c3RWaWV3KGNtLCBmcm9tLCB0byk7XG5cbiAgZGlzcGxheS52aWV3T2Zmc2V0ID0gaGVpZ2h0QXRMaW5lKGdldExpbmUoY20uZG9jLCBkaXNwbGF5LnZpZXdGcm9tKSk7XG4gIC8vIFBvc2l0aW9uIHRoZSBtb3ZlciBkaXYgdG8gYWxpZ24gd2l0aCB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb25cbiAgY20uZGlzcGxheS5tb3Zlci5zdHlsZS50b3AgPSBkaXNwbGF5LnZpZXdPZmZzZXQgKyBcInB4XCI7XG5cbiAgdmFyIHRvVXBkYXRlID0gY291bnREaXJ0eVZpZXcoY20pO1xuICBpZiAoIWRpZmZlcmVudCAmJiB0b1VwZGF0ZSA9PSAwICYmICF1cGRhdGUuZm9yY2UgJiYgZGlzcGxheS5yZW5kZXJlZFZpZXcgPT0gZGlzcGxheS52aWV3ICYmXG4gICAgICAoZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA9PSBudWxsIHx8IGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPj0gZGlzcGxheS52aWV3VG8pKVxuICAgIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBGb3IgYmlnIGNoYW5nZXMsIHdlIGhpZGUgdGhlIGVuY2xvc2luZyBlbGVtZW50IGR1cmluZyB0aGVcbiAgLy8gdXBkYXRlLCBzaW5jZSB0aGF0IHNwZWVkcyB1cCB0aGUgb3BlcmF0aW9ucyBvbiBtb3N0IGJyb3dzZXJzLlxuICB2YXIgc2VsU25hcHNob3QgPSBzZWxlY3Rpb25TbmFwc2hvdChjbSk7XG4gIGlmICh0b1VwZGF0ZSA+IDQpIHsgZGlzcGxheS5saW5lRGl2LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjsgfVxuICBwYXRjaERpc3BsYXkoY20sIGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMsIHVwZGF0ZS5kaW1zKTtcbiAgaWYgKHRvVXBkYXRlID4gNCkgeyBkaXNwbGF5LmxpbmVEaXYuc3R5bGUuZGlzcGxheSA9IFwiXCI7IH1cbiAgZGlzcGxheS5yZW5kZXJlZFZpZXcgPSBkaXNwbGF5LnZpZXc7XG4gIC8vIFRoZXJlIG1pZ2h0IGhhdmUgYmVlbiBhIHdpZGdldCB3aXRoIGEgZm9jdXNlZCBlbGVtZW50IHRoYXQgZ290XG4gIC8vIGhpZGRlbiBvciB1cGRhdGVkLCBpZiBzbyByZS1mb2N1cyBpdC5cbiAgcmVzdG9yZVNlbGVjdGlvbihzZWxTbmFwc2hvdCk7XG5cbiAgLy8gUHJldmVudCBzZWxlY3Rpb24gYW5kIGN1cnNvcnMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIHRoZSBzY3JvbGxcbiAgLy8gd2lkdGggYW5kIGhlaWdodC5cbiAgcmVtb3ZlQ2hpbGRyZW4oZGlzcGxheS5jdXJzb3JEaXYpO1xuICByZW1vdmVDaGlsZHJlbihkaXNwbGF5LnNlbGVjdGlvbkRpdik7XG4gIGRpc3BsYXkuZ3V0dGVycy5zdHlsZS5oZWlnaHQgPSBkaXNwbGF5LnNpemVyLnN0eWxlLm1pbkhlaWdodCA9IDA7XG5cbiAgaWYgKGRpZmZlcmVudCkge1xuICAgIGRpc3BsYXkubGFzdFdyYXBIZWlnaHQgPSB1cGRhdGUud3JhcHBlckhlaWdodDtcbiAgICBkaXNwbGF5Lmxhc3RXcmFwV2lkdGggPSB1cGRhdGUud3JhcHBlcldpZHRoO1xuICAgIHN0YXJ0V29ya2VyKGNtLCA0MDApO1xuICB9XG5cbiAgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA9IG51bGw7XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gcG9zdFVwZGF0ZURpc3BsYXkoY20sIHVwZGF0ZSkge1xuICB2YXIgdmlld3BvcnQgPSB1cGRhdGUudmlld3BvcnQ7XG5cbiAgZm9yICh2YXIgZmlyc3QgPSB0cnVlOzsgZmlyc3QgPSBmYWxzZSkge1xuICAgIGlmICghZmlyc3QgfHwgIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nIHx8IHVwZGF0ZS5vbGREaXNwbGF5V2lkdGggPT0gZGlzcGxheVdpZHRoKGNtKSkge1xuICAgICAgLy8gQ2xpcCBmb3JjZWQgdmlld3BvcnQgdG8gYWN0dWFsIHNjcm9sbGFibGUgYXJlYS5cbiAgICAgIGlmICh2aWV3cG9ydCAmJiB2aWV3cG9ydC50b3AgIT0gbnVsbClcbiAgICAgICAgeyB2aWV3cG9ydCA9IHt0b3A6IE1hdGgubWluKGNtLmRvYy5oZWlnaHQgKyBwYWRkaW5nVmVydChjbS5kaXNwbGF5KSAtIGRpc3BsYXlIZWlnaHQoY20pLCB2aWV3cG9ydC50b3ApfTsgfVxuICAgICAgLy8gVXBkYXRlZCBsaW5lIGhlaWdodHMgbWlnaHQgcmVzdWx0IGluIHRoZSBkcmF3biBhcmVhIG5vdFxuICAgICAgLy8gYWN0dWFsbHkgY292ZXJpbmcgdGhlIHZpZXdwb3J0LiBLZWVwIGxvb3BpbmcgdW50aWwgaXQgZG9lcy5cbiAgICAgIHVwZGF0ZS52aXNpYmxlID0gdmlzaWJsZUxpbmVzKGNtLmRpc3BsYXksIGNtLmRvYywgdmlld3BvcnQpO1xuICAgICAgaWYgKHVwZGF0ZS52aXNpYmxlLmZyb20gPj0gY20uZGlzcGxheS52aWV3RnJvbSAmJiB1cGRhdGUudmlzaWJsZS50byA8PSBjbS5kaXNwbGF5LnZpZXdUbylcbiAgICAgICAgeyBicmVhayB9XG4gICAgfVxuICAgIGlmICghdXBkYXRlRGlzcGxheUlmTmVlZGVkKGNtLCB1cGRhdGUpKSB7IGJyZWFrIH1cbiAgICB1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSk7XG4gICAgdmFyIGJhck1lYXN1cmUgPSBtZWFzdXJlRm9yU2Nyb2xsYmFycyhjbSk7XG4gICAgdXBkYXRlU2VsZWN0aW9uKGNtKTtcbiAgICB1cGRhdGVTY3JvbGxiYXJzKGNtLCBiYXJNZWFzdXJlKTtcbiAgICBzZXREb2N1bWVudEhlaWdodChjbSwgYmFyTWVhc3VyZSk7XG4gICAgdXBkYXRlLmZvcmNlID0gZmFsc2U7XG4gIH1cblxuICB1cGRhdGUuc2lnbmFsKGNtLCBcInVwZGF0ZVwiLCBjbSk7XG4gIGlmIChjbS5kaXNwbGF5LnZpZXdGcm9tICE9IGNtLmRpc3BsYXkucmVwb3J0ZWRWaWV3RnJvbSB8fCBjbS5kaXNwbGF5LnZpZXdUbyAhPSBjbS5kaXNwbGF5LnJlcG9ydGVkVmlld1RvKSB7XG4gICAgdXBkYXRlLnNpZ25hbChjbSwgXCJ2aWV3cG9ydENoYW5nZVwiLCBjbSwgY20uZGlzcGxheS52aWV3RnJvbSwgY20uZGlzcGxheS52aWV3VG8pO1xuICAgIGNtLmRpc3BsYXkucmVwb3J0ZWRWaWV3RnJvbSA9IGNtLmRpc3BsYXkudmlld0Zyb207IGNtLmRpc3BsYXkucmVwb3J0ZWRWaWV3VG8gPSBjbS5kaXNwbGF5LnZpZXdUbztcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtLCB2aWV3cG9ydCkge1xuICB2YXIgdXBkYXRlID0gbmV3IERpc3BsYXlVcGRhdGUoY20sIHZpZXdwb3J0KTtcbiAgaWYgKHVwZGF0ZURpc3BsYXlJZk5lZWRlZChjbSwgdXBkYXRlKSkge1xuICAgIHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0KGNtKTtcbiAgICBwb3N0VXBkYXRlRGlzcGxheShjbSwgdXBkYXRlKTtcbiAgICB2YXIgYmFyTWVhc3VyZSA9IG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKTtcbiAgICB1cGRhdGVTZWxlY3Rpb24oY20pO1xuICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20sIGJhck1lYXN1cmUpO1xuICAgIHNldERvY3VtZW50SGVpZ2h0KGNtLCBiYXJNZWFzdXJlKTtcbiAgICB1cGRhdGUuZmluaXNoKCk7XG4gIH1cbn1cblxuLy8gU3luYyB0aGUgYWN0dWFsIGRpc3BsYXkgRE9NIHN0cnVjdHVyZSB3aXRoIGRpc3BsYXkudmlldywgcmVtb3Zpbmdcbi8vIG5vZGVzIGZvciBsaW5lcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdmlldywgYW5kIGNyZWF0aW5nIHRoZSBvbmVzXG4vLyB0aGF0IGFyZSBub3QgdGhlcmUgeWV0LCBhbmQgdXBkYXRpbmcgdGhlIG9uZXMgdGhhdCBhcmUgb3V0IG9mXG4vLyBkYXRlLlxuZnVuY3Rpb24gcGF0Y2hEaXNwbGF5KGNtLCB1cGRhdGVOdW1iZXJzRnJvbSwgZGltcykge1xuICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGxpbmVOdW1iZXJzID0gY20ub3B0aW9ucy5saW5lTnVtYmVycztcbiAgdmFyIGNvbnRhaW5lciA9IGRpc3BsYXkubGluZURpdiwgY3VyID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG5cbiAgZnVuY3Rpb24gcm0obm9kZSkge1xuICAgIHZhciBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICAvLyBXb3JrcyBhcm91bmQgYSB0aHJvdy1zY3JvbGwgYnVnIGluIE9TIFggV2Via2l0XG4gICAgaWYgKHdlYmtpdCAmJiBtYWMgJiYgY20uZGlzcGxheS5jdXJyZW50V2hlZWxUYXJnZXQgPT0gbm9kZSlcbiAgICAgIHsgbm9kZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7IH1cbiAgICBlbHNlXG4gICAgICB7IG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsgfVxuICAgIHJldHVybiBuZXh0XG4gIH1cblxuICB2YXIgdmlldyA9IGRpc3BsYXkudmlldywgbGluZU4gPSBkaXNwbGF5LnZpZXdGcm9tO1xuICAvLyBMb29wIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoZSB2aWV3LCBzeW5jaW5nIGN1ciAodGhlIERPTSBub2Rlc1xuICAvLyBpbiBkaXNwbGF5LmxpbmVEaXYpIHdpdGggdGhlIHZpZXcgYXMgd2UgZ28uXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsaW5lVmlldyA9IHZpZXdbaV07XG4gICAgaWYgKGxpbmVWaWV3LmhpZGRlbikge1xuICAgIH0gZWxzZSBpZiAoIWxpbmVWaWV3Lm5vZGUgfHwgbGluZVZpZXcubm9kZS5wYXJlbnROb2RlICE9IGNvbnRhaW5lcikgeyAvLyBOb3QgZHJhd24geWV0XG4gICAgICB2YXIgbm9kZSA9IGJ1aWxkTGluZUVsZW1lbnQoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcyk7XG4gICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIGN1cik7XG4gICAgfSBlbHNlIHsgLy8gQWxyZWFkeSBkcmF3blxuICAgICAgd2hpbGUgKGN1ciAhPSBsaW5lVmlldy5ub2RlKSB7IGN1ciA9IHJtKGN1cik7IH1cbiAgICAgIHZhciB1cGRhdGVOdW1iZXIgPSBsaW5lTnVtYmVycyAmJiB1cGRhdGVOdW1iZXJzRnJvbSAhPSBudWxsICYmXG4gICAgICAgIHVwZGF0ZU51bWJlcnNGcm9tIDw9IGxpbmVOICYmIGxpbmVWaWV3LmxpbmVOdW1iZXI7XG4gICAgICBpZiAobGluZVZpZXcuY2hhbmdlcykge1xuICAgICAgICBpZiAoaW5kZXhPZihsaW5lVmlldy5jaGFuZ2VzLCBcImd1dHRlclwiKSA+IC0xKSB7IHVwZGF0ZU51bWJlciA9IGZhbHNlOyB9XG4gICAgICAgIHVwZGF0ZUxpbmVGb3JDaGFuZ2VzKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZU51bWJlcikge1xuICAgICAgICByZW1vdmVDaGlsZHJlbihsaW5lVmlldy5saW5lTnVtYmVyKTtcbiAgICAgICAgbGluZVZpZXcubGluZU51bWJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGxpbmVOKSkpO1xuICAgICAgfVxuICAgICAgY3VyID0gbGluZVZpZXcubm9kZS5uZXh0U2libGluZztcbiAgICB9XG4gICAgbGluZU4gKz0gbGluZVZpZXcuc2l6ZTtcbiAgfVxuICB3aGlsZSAoY3VyKSB7IGN1ciA9IHJtKGN1cik7IH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlR3V0dGVyU3BhY2UoY20pIHtcbiAgdmFyIHdpZHRoID0gY20uZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoO1xuICBjbS5kaXNwbGF5LnNpemVyLnN0eWxlLm1hcmdpbkxlZnQgPSB3aWR0aCArIFwicHhcIjtcbn1cblxuZnVuY3Rpb24gc2V0RG9jdW1lbnRIZWlnaHQoY20sIG1lYXN1cmUpIHtcbiAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5IZWlnaHQgPSBtZWFzdXJlLmRvY0hlaWdodCArIFwicHhcIjtcbiAgY20uZGlzcGxheS5oZWlnaHRGb3JjZXIuc3R5bGUudG9wID0gbWVhc3VyZS5kb2NIZWlnaHQgKyBcInB4XCI7XG4gIGNtLmRpc3BsYXkuZ3V0dGVycy5zdHlsZS5oZWlnaHQgPSAobWVhc3VyZS5kb2NIZWlnaHQgKyBjbS5kaXNwbGF5LmJhckhlaWdodCArIHNjcm9sbEdhcChjbSkpICsgXCJweFwiO1xufVxuXG4vLyBSZWJ1aWxkIHRoZSBndXR0ZXIgZWxlbWVudHMsIGVuc3VyZSB0aGUgbWFyZ2luIHRvIHRoZSBsZWZ0IG9mIHRoZVxuLy8gY29kZSBtYXRjaGVzIHRoZWlyIHdpZHRoLlxuZnVuY3Rpb24gdXBkYXRlR3V0dGVycyhjbSkge1xuICB2YXIgZ3V0dGVycyA9IGNtLmRpc3BsYXkuZ3V0dGVycywgc3BlY3MgPSBjbS5vcHRpb25zLmd1dHRlcnM7XG4gIHJlbW92ZUNoaWxkcmVuKGd1dHRlcnMpO1xuICB2YXIgaSA9IDA7XG4gIGZvciAoOyBpIDwgc3BlY3MubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgZ3V0dGVyQ2xhc3MgPSBzcGVjc1tpXTtcbiAgICB2YXIgZ0VsdCA9IGd1dHRlcnMuYXBwZW5kQ2hpbGQoZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1ndXR0ZXIgXCIgKyBndXR0ZXJDbGFzcykpO1xuICAgIGlmIChndXR0ZXJDbGFzcyA9PSBcIkNvZGVNaXJyb3ItbGluZW51bWJlcnNcIikge1xuICAgICAgY20uZGlzcGxheS5saW5lR3V0dGVyID0gZ0VsdDtcbiAgICAgIGdFbHQuc3R5bGUud2lkdGggPSAoY20uZGlzcGxheS5saW5lTnVtV2lkdGggfHwgMSkgKyBcInB4XCI7XG4gICAgfVxuICB9XG4gIGd1dHRlcnMuc3R5bGUuZGlzcGxheSA9IGkgPyBcIlwiIDogXCJub25lXCI7XG4gIHVwZGF0ZUd1dHRlclNwYWNlKGNtKTtcbn1cblxuLy8gTWFrZSBzdXJlIHRoZSBndXR0ZXJzIG9wdGlvbnMgY29udGFpbnMgdGhlIGVsZW1lbnRcbi8vIFwiQ29kZU1pcnJvci1saW5lbnVtYmVyc1wiIHdoZW4gdGhlIGxpbmVOdW1iZXJzIG9wdGlvbiBpcyB0cnVlLlxuZnVuY3Rpb24gc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKG9wdGlvbnMpIHtcbiAgdmFyIGZvdW5kID0gaW5kZXhPZihvcHRpb25zLmd1dHRlcnMsIFwiQ29kZU1pcnJvci1saW5lbnVtYmVyc1wiKTtcbiAgaWYgKGZvdW5kID09IC0xICYmIG9wdGlvbnMubGluZU51bWJlcnMpIHtcbiAgICBvcHRpb25zLmd1dHRlcnMgPSBvcHRpb25zLmd1dHRlcnMuY29uY2F0KFtcIkNvZGVNaXJyb3ItbGluZW51bWJlcnNcIl0pO1xuICB9IGVsc2UgaWYgKGZvdW5kID4gLTEgJiYgIW9wdGlvbnMubGluZU51bWJlcnMpIHtcbiAgICBvcHRpb25zLmd1dHRlcnMgPSBvcHRpb25zLmd1dHRlcnMuc2xpY2UoMCk7XG4gICAgb3B0aW9ucy5ndXR0ZXJzLnNwbGljZShmb3VuZCwgMSk7XG4gIH1cbn1cblxuLy8gU2luY2UgdGhlIGRlbHRhIHZhbHVlcyByZXBvcnRlZCBvbiBtb3VzZSB3aGVlbCBldmVudHMgYXJlXG4vLyB1bnN0YW5kYXJkaXplZCBiZXR3ZWVuIGJyb3dzZXJzIGFuZCBldmVuIGJyb3dzZXIgdmVyc2lvbnMsIGFuZFxuLy8gZ2VuZXJhbGx5IGhvcnJpYmx5IHVucHJlZGljdGFibGUsIHRoaXMgY29kZSBzdGFydHMgYnkgbWVhc3VyaW5nXG4vLyB0aGUgc2Nyb2xsIGVmZmVjdCB0aGF0IHRoZSBmaXJzdCBmZXcgbW91c2Ugd2hlZWwgZXZlbnRzIGhhdmUsXG4vLyBhbmQsIGZyb20gdGhhdCwgZGV0ZWN0cyB0aGUgd2F5IGl0IGNhbiBjb252ZXJ0IGRlbHRhcyB0byBwaXhlbFxuLy8gb2Zmc2V0cyBhZnRlcndhcmRzLlxuLy9cbi8vIFRoZSByZWFzb24gd2Ugd2FudCB0byBrbm93IHRoZSBhbW91bnQgYSB3aGVlbCBldmVudCB3aWxsIHNjcm9sbFxuLy8gaXMgdGhhdCBpdCBnaXZlcyB1cyBhIGNoYW5jZSB0byB1cGRhdGUgdGhlIGRpc3BsYXkgYmVmb3JlIHRoZVxuLy8gYWN0dWFsIHNjcm9sbGluZyBoYXBwZW5zLCByZWR1Y2luZyBmbGlja2VyaW5nLlxuXG52YXIgd2hlZWxTYW1wbGVzID0gMDtcbnZhciB3aGVlbFBpeGVsc1BlclVuaXQgPSBudWxsO1xuLy8gRmlsbCBpbiBhIGJyb3dzZXItZGV0ZWN0ZWQgc3RhcnRpbmcgdmFsdWUgb24gYnJvd3NlcnMgd2hlcmUgd2Vcbi8vIGtub3cgb25lLiBUaGVzZSBkb24ndCBoYXZlIHRvIGJlIGFjY3VyYXRlIC0tIHRoZSByZXN1bHQgb2YgdGhlbVxuLy8gYmVpbmcgd3Jvbmcgd291bGQganVzdCBiZSBhIHNsaWdodCBmbGlja2VyIG9uIHRoZSBmaXJzdCB3aGVlbFxuLy8gc2Nyb2xsIChpZiBpdCBpcyBsYXJnZSBlbm91Z2gpLlxuaWYgKGllKSB7IHdoZWVsUGl4ZWxzUGVyVW5pdCA9IC0uNTM7IH1cbmVsc2UgaWYgKGdlY2tvKSB7IHdoZWVsUGl4ZWxzUGVyVW5pdCA9IDE1OyB9XG5lbHNlIGlmIChjaHJvbWUpIHsgd2hlZWxQaXhlbHNQZXJVbml0ID0gLS43OyB9XG5lbHNlIGlmIChzYWZhcmkpIHsgd2hlZWxQaXhlbHNQZXJVbml0ID0gLTEvMzsgfVxuXG5mdW5jdGlvbiB3aGVlbEV2ZW50RGVsdGEoZSkge1xuICB2YXIgZHggPSBlLndoZWVsRGVsdGFYLCBkeSA9IGUud2hlZWxEZWx0YVk7XG4gIGlmIChkeCA9PSBudWxsICYmIGUuZGV0YWlsICYmIGUuYXhpcyA9PSBlLkhPUklaT05UQUxfQVhJUykgeyBkeCA9IGUuZGV0YWlsOyB9XG4gIGlmIChkeSA9PSBudWxsICYmIGUuZGV0YWlsICYmIGUuYXhpcyA9PSBlLlZFUlRJQ0FMX0FYSVMpIHsgZHkgPSBlLmRldGFpbDsgfVxuICBlbHNlIGlmIChkeSA9PSBudWxsKSB7IGR5ID0gZS53aGVlbERlbHRhOyB9XG4gIHJldHVybiB7eDogZHgsIHk6IGR5fVxufVxuZnVuY3Rpb24gd2hlZWxFdmVudFBpeGVscyhlKSB7XG4gIHZhciBkZWx0YSA9IHdoZWVsRXZlbnREZWx0YShlKTtcbiAgZGVsdGEueCAqPSB3aGVlbFBpeGVsc1BlclVuaXQ7XG4gIGRlbHRhLnkgKj0gd2hlZWxQaXhlbHNQZXJVbml0O1xuICByZXR1cm4gZGVsdGFcbn1cblxuZnVuY3Rpb24gb25TY3JvbGxXaGVlbChjbSwgZSkge1xuICB2YXIgZGVsdGEgPSB3aGVlbEV2ZW50RGVsdGEoZSksIGR4ID0gZGVsdGEueCwgZHkgPSBkZWx0YS55O1xuXG4gIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgc2Nyb2xsID0gZGlzcGxheS5zY3JvbGxlcjtcbiAgLy8gUXVpdCBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gc2Nyb2xsIGhlcmVcbiAgdmFyIGNhblNjcm9sbFggPSBzY3JvbGwuc2Nyb2xsV2lkdGggPiBzY3JvbGwuY2xpZW50V2lkdGg7XG4gIHZhciBjYW5TY3JvbGxZID0gc2Nyb2xsLnNjcm9sbEhlaWdodCA+IHNjcm9sbC5jbGllbnRIZWlnaHQ7XG4gIGlmICghKGR4ICYmIGNhblNjcm9sbFggfHwgZHkgJiYgY2FuU2Nyb2xsWSkpIHsgcmV0dXJuIH1cblxuICAvLyBXZWJraXQgYnJvd3NlcnMgb24gT1MgWCBhYm9ydCBtb21lbnR1bSBzY3JvbGxzIHdoZW4gdGhlIHRhcmdldFxuICAvLyBvZiB0aGUgc2Nyb2xsIGV2ZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50LlxuICAvLyBUaGlzIGhhY2sgKHNlZSByZWxhdGVkIGNvZGUgaW4gcGF0Y2hEaXNwbGF5KSBtYWtlcyBzdXJlIHRoZVxuICAvLyBlbGVtZW50IGlzIGtlcHQgYXJvdW5kLlxuICBpZiAoZHkgJiYgbWFjICYmIHdlYmtpdCkge1xuICAgIG91dGVyOiBmb3IgKHZhciBjdXIgPSBlLnRhcmdldCwgdmlldyA9IGRpc3BsYXkudmlldzsgY3VyICE9IHNjcm9sbDsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodmlld1tpXS5ub2RlID09IGN1cikge1xuICAgICAgICAgIGNtLmRpc3BsYXkuY3VycmVudFdoZWVsVGFyZ2V0ID0gY3VyO1xuICAgICAgICAgIGJyZWFrIG91dGVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBPbiBzb21lIGJyb3dzZXJzLCBob3Jpem9udGFsIHNjcm9sbGluZyB3aWxsIGNhdXNlIHJlZHJhd3MgdG9cbiAgLy8gaGFwcGVuIGJlZm9yZSB0aGUgZ3V0dGVyIGhhcyBiZWVuIHJlYWxpZ25lZCwgY2F1c2luZyBpdCB0b1xuICAvLyB3cmlnZ2xlIGFyb3VuZCBpbiBhIG1vc3QgdW5zZWVtbHkgd2F5LiBXaGVuIHdlIGhhdmUgYW5cbiAgLy8gZXN0aW1hdGVkIHBpeGVscy9kZWx0YSB2YWx1ZSwgd2UganVzdCBoYW5kbGUgaG9yaXpvbnRhbFxuICAvLyBzY3JvbGxpbmcgZW50aXJlbHkgaGVyZS4gSXQnbGwgYmUgc2xpZ2h0bHkgb2ZmIGZyb20gbmF0aXZlLCBidXRcbiAgLy8gYmV0dGVyIHRoYW4gZ2xpdGNoaW5nIG91dC5cbiAgaWYgKGR4ICYmICFnZWNrbyAmJiAhcHJlc3RvICYmIHdoZWVsUGl4ZWxzUGVyVW5pdCAhPSBudWxsKSB7XG4gICAgaWYgKGR5ICYmIGNhblNjcm9sbFkpXG4gICAgICB7IHVwZGF0ZVNjcm9sbFRvcChjbSwgTWF0aC5tYXgoMCwgc2Nyb2xsLnNjcm9sbFRvcCArIGR5ICogd2hlZWxQaXhlbHNQZXJVbml0KSk7IH1cbiAgICBzZXRTY3JvbGxMZWZ0KGNtLCBNYXRoLm1heCgwLCBzY3JvbGwuc2Nyb2xsTGVmdCArIGR4ICogd2hlZWxQaXhlbHNQZXJVbml0KSk7XG4gICAgLy8gT25seSBwcmV2ZW50IGRlZmF1bHQgc2Nyb2xsaW5nIGlmIHZlcnRpY2FsIHNjcm9sbGluZyBpc1xuICAgIC8vIGFjdHVhbGx5IHBvc3NpYmxlLiBPdGhlcndpc2UsIGl0IGNhdXNlcyB2ZXJ0aWNhbCBzY3JvbGxcbiAgICAvLyBqaXR0ZXIgb24gT1NYIHRyYWNrcGFkcyB3aGVuIGRlbHRhWCBpcyBzbWFsbCBhbmQgZGVsdGFZXG4gICAgLy8gaXMgbGFyZ2UgKGlzc3VlICMzNTc5KVxuICAgIGlmICghZHkgfHwgKGR5ICYmIGNhblNjcm9sbFkpKVxuICAgICAgeyBlX3ByZXZlbnREZWZhdWx0KGUpOyB9XG4gICAgZGlzcGxheS53aGVlbFN0YXJ0WCA9IG51bGw7IC8vIEFib3J0IG1lYXN1cmVtZW50LCBpZiBpbiBwcm9ncmVzc1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gJ1Byb2plY3QnIHRoZSB2aXNpYmxlIHZpZXdwb3J0IHRvIGNvdmVyIHRoZSBhcmVhIHRoYXQgaXMgYmVpbmdcbiAgLy8gc2Nyb2xsZWQgaW50byB2aWV3IChpZiB3ZSBrbm93IGVub3VnaCB0byBlc3RpbWF0ZSBpdCkuXG4gIGlmIChkeSAmJiB3aGVlbFBpeGVsc1BlclVuaXQgIT0gbnVsbCkge1xuICAgIHZhciBwaXhlbHMgPSBkeSAqIHdoZWVsUGl4ZWxzUGVyVW5pdDtcbiAgICB2YXIgdG9wID0gY20uZG9jLnNjcm9sbFRvcCwgYm90ID0gdG9wICsgZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodDtcbiAgICBpZiAocGl4ZWxzIDwgMCkgeyB0b3AgPSBNYXRoLm1heCgwLCB0b3AgKyBwaXhlbHMgLSA1MCk7IH1cbiAgICBlbHNlIHsgYm90ID0gTWF0aC5taW4oY20uZG9jLmhlaWdodCwgYm90ICsgcGl4ZWxzICsgNTApOyB9XG4gICAgdXBkYXRlRGlzcGxheVNpbXBsZShjbSwge3RvcDogdG9wLCBib3R0b206IGJvdH0pO1xuICB9XG5cbiAgaWYgKHdoZWVsU2FtcGxlcyA8IDIwKSB7XG4gICAgaWYgKGRpc3BsYXkud2hlZWxTdGFydFggPT0gbnVsbCkge1xuICAgICAgZGlzcGxheS53aGVlbFN0YXJ0WCA9IHNjcm9sbC5zY3JvbGxMZWZ0OyBkaXNwbGF5LndoZWVsU3RhcnRZID0gc2Nyb2xsLnNjcm9sbFRvcDtcbiAgICAgIGRpc3BsYXkud2hlZWxEWCA9IGR4OyBkaXNwbGF5LndoZWVsRFkgPSBkeTtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZGlzcGxheS53aGVlbFN0YXJ0WCA9PSBudWxsKSB7IHJldHVybiB9XG4gICAgICAgIHZhciBtb3ZlZFggPSBzY3JvbGwuc2Nyb2xsTGVmdCAtIGRpc3BsYXkud2hlZWxTdGFydFg7XG4gICAgICAgIHZhciBtb3ZlZFkgPSBzY3JvbGwuc2Nyb2xsVG9wIC0gZGlzcGxheS53aGVlbFN0YXJ0WTtcbiAgICAgICAgdmFyIHNhbXBsZSA9IChtb3ZlZFkgJiYgZGlzcGxheS53aGVlbERZICYmIG1vdmVkWSAvIGRpc3BsYXkud2hlZWxEWSkgfHxcbiAgICAgICAgICAobW92ZWRYICYmIGRpc3BsYXkud2hlZWxEWCAmJiBtb3ZlZFggLyBkaXNwbGF5LndoZWVsRFgpO1xuICAgICAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gZGlzcGxheS53aGVlbFN0YXJ0WSA9IG51bGw7XG4gICAgICAgIGlmICghc2FtcGxlKSB7IHJldHVybiB9XG4gICAgICAgIHdoZWVsUGl4ZWxzUGVyVW5pdCA9ICh3aGVlbFBpeGVsc1BlclVuaXQgKiB3aGVlbFNhbXBsZXMgKyBzYW1wbGUpIC8gKHdoZWVsU2FtcGxlcyArIDEpO1xuICAgICAgICArK3doZWVsU2FtcGxlcztcbiAgICAgIH0sIDIwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3BsYXkud2hlZWxEWCArPSBkeDsgZGlzcGxheS53aGVlbERZICs9IGR5O1xuICAgIH1cbiAgfVxufVxuXG4vLyBTZWxlY3Rpb24gb2JqZWN0cyBhcmUgaW1tdXRhYmxlLiBBIG5ldyBvbmUgaXMgY3JlYXRlZCBldmVyeSB0aW1lXG4vLyB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuIEEgc2VsZWN0aW9uIGlzIG9uZSBvciBtb3JlIG5vbi1vdmVybGFwcGluZ1xuLy8gKGFuZCBub24tdG91Y2hpbmcpIHJhbmdlcywgc29ydGVkLCBhbmQgYW4gaW50ZWdlciB0aGF0IGluZGljYXRlc1xuLy8gd2hpY2ggb25lIGlzIHRoZSBwcmltYXJ5IHNlbGVjdGlvbiAodGhlIG9uZSB0aGF0J3Mgc2Nyb2xsZWQgaW50b1xuLy8gdmlldywgdGhhdCBnZXRDdXJzb3IgcmV0dXJucywgZXRjKS5cbnZhciBTZWxlY3Rpb24gPSBmdW5jdGlvbihyYW5nZXMsIHByaW1JbmRleCkge1xuICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgdGhpcy5wcmltSW5kZXggPSBwcmltSW5kZXg7XG59O1xuXG5TZWxlY3Rpb24ucHJvdG90eXBlLnByaW1hcnkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnJhbmdlc1t0aGlzLnByaW1JbmRleF0gfTtcblxuU2VsZWN0aW9uLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBpZiAob3RoZXIgPT0gdGhpcykgeyByZXR1cm4gdHJ1ZSB9XG4gIGlmIChvdGhlci5wcmltSW5kZXggIT0gdGhpcy5wcmltSW5kZXggfHwgb3RoZXIucmFuZ2VzLmxlbmd0aCAhPSB0aGlzLnJhbmdlcy5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBoZXJlID0gdGhpcyQxLnJhbmdlc1tpXSwgdGhlcmUgPSBvdGhlci5yYW5nZXNbaV07XG4gICAgaWYgKCFlcXVhbEN1cnNvclBvcyhoZXJlLmFuY2hvciwgdGhlcmUuYW5jaG9yKSB8fCAhZXF1YWxDdXJzb3JQb3MoaGVyZS5oZWFkLCB0aGVyZS5oZWFkKSkgeyByZXR1cm4gZmFsc2UgfVxuICB9XG4gIHJldHVybiB0cnVlXG59O1xuXG5TZWxlY3Rpb24ucHJvdG90eXBlLmRlZXBDb3B5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBvdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICB7IG91dFtpXSA9IG5ldyBSYW5nZShjb3B5UG9zKHRoaXMkMS5yYW5nZXNbaV0uYW5jaG9yKSwgY29weVBvcyh0aGlzJDEucmFuZ2VzW2ldLmhlYWQpKTsgfVxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihvdXQsIHRoaXMucHJpbUluZGV4KVxufTtcblxuU2VsZWN0aW9uLnByb3RvdHlwZS5zb21ldGhpbmdTZWxlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgIHsgaWYgKCF0aGlzJDEucmFuZ2VzW2ldLmVtcHR5KCkpIHsgcmV0dXJuIHRydWUgfSB9XG4gIHJldHVybiBmYWxzZVxufTtcblxuU2VsZWN0aW9uLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChwb3MsIGVuZCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmICghZW5kKSB7IGVuZCA9IHBvczsgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJhbmdlID0gdGhpcyQxLnJhbmdlc1tpXTtcbiAgICBpZiAoY21wKGVuZCwgcmFuZ2UuZnJvbSgpKSA+PSAwICYmIGNtcChwb3MsIHJhbmdlLnRvKCkpIDw9IDApXG4gICAgICB7IHJldHVybiBpIH1cbiAgfVxuICByZXR1cm4gLTFcbn07XG5cbnZhciBSYW5nZSA9IGZ1bmN0aW9uKGFuY2hvciwgaGVhZCkge1xuICB0aGlzLmFuY2hvciA9IGFuY2hvcjsgdGhpcy5oZWFkID0gaGVhZDtcbn07XG5cblJhbmdlLnByb3RvdHlwZS5mcm9tID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbWluUG9zKHRoaXMuYW5jaG9yLCB0aGlzLmhlYWQpIH07XG5SYW5nZS5wcm90b3R5cGUudG8gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBtYXhQb3ModGhpcy5hbmNob3IsIHRoaXMuaGVhZCkgfTtcblJhbmdlLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuaGVhZC5saW5lID09IHRoaXMuYW5jaG9yLmxpbmUgJiYgdGhpcy5oZWFkLmNoID09IHRoaXMuYW5jaG9yLmNoIH07XG5cbi8vIFRha2UgYW4gdW5zb3J0ZWQsIHBvdGVudGlhbGx5IG92ZXJsYXBwaW5nIHNldCBvZiByYW5nZXMsIGFuZFxuLy8gYnVpbGQgYSBzZWxlY3Rpb24gb3V0IG9mIGl0LiAnQ29uc3VtZXMnIHJhbmdlcyBhcnJheSAobW9kaWZ5aW5nXG4vLyBpdCkuXG5mdW5jdGlvbiBub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzLCBwcmltSW5kZXgpIHtcbiAgdmFyIHByaW0gPSByYW5nZXNbcHJpbUluZGV4XTtcbiAgcmFuZ2VzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGNtcChhLmZyb20oKSwgYi5mcm9tKCkpOyB9KTtcbiAgcHJpbUluZGV4ID0gaW5kZXhPZihyYW5nZXMsIHByaW0pO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjdXIgPSByYW5nZXNbaV0sIHByZXYgPSByYW5nZXNbaSAtIDFdO1xuICAgIGlmIChjbXAocHJldi50bygpLCBjdXIuZnJvbSgpKSA+PSAwKSB7XG4gICAgICB2YXIgZnJvbSA9IG1pblBvcyhwcmV2LmZyb20oKSwgY3VyLmZyb20oKSksIHRvID0gbWF4UG9zKHByZXYudG8oKSwgY3VyLnRvKCkpO1xuICAgICAgdmFyIGludiA9IHByZXYuZW1wdHkoKSA/IGN1ci5mcm9tKCkgPT0gY3VyLmhlYWQgOiBwcmV2LmZyb20oKSA9PSBwcmV2LmhlYWQ7XG4gICAgICBpZiAoaSA8PSBwcmltSW5kZXgpIHsgLS1wcmltSW5kZXg7IH1cbiAgICAgIHJhbmdlcy5zcGxpY2UoLS1pLCAyLCBuZXcgUmFuZ2UoaW52ID8gdG8gOiBmcm9tLCBpbnYgPyBmcm9tIDogdG8pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24ocmFuZ2VzLCBwcmltSW5kZXgpXG59XG5cbmZ1bmN0aW9uIHNpbXBsZVNlbGVjdGlvbihhbmNob3IsIGhlYWQpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW25ldyBSYW5nZShhbmNob3IsIGhlYWQgfHwgYW5jaG9yKV0sIDApXG59XG5cbi8vIENvbXB1dGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgYSBjaGFuZ2UgKGl0cyAndG8nIHByb3BlcnR5XG4vLyByZWZlcnMgdG8gdGhlIHByZS1jaGFuZ2UgZW5kKS5cbmZ1bmN0aW9uIGNoYW5nZUVuZChjaGFuZ2UpIHtcbiAgaWYgKCFjaGFuZ2UudGV4dCkgeyByZXR1cm4gY2hhbmdlLnRvIH1cbiAgcmV0dXJuIFBvcyhjaGFuZ2UuZnJvbS5saW5lICsgY2hhbmdlLnRleHQubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICBsc3QoY2hhbmdlLnRleHQpLmxlbmd0aCArIChjaGFuZ2UudGV4dC5sZW5ndGggPT0gMSA/IGNoYW5nZS5mcm9tLmNoIDogMCkpXG59XG5cbi8vIEFkanVzdCBhIHBvc2l0aW9uIHRvIHJlZmVyIHRvIHRoZSBwb3N0LWNoYW5nZSBwb3NpdGlvbiBvZiB0aGVcbi8vIHNhbWUgdGV4dCwgb3IgdGhlIGVuZCBvZiB0aGUgY2hhbmdlIGlmIHRoZSBjaGFuZ2UgY292ZXJzIGl0LlxuZnVuY3Rpb24gYWRqdXN0Rm9yQ2hhbmdlKHBvcywgY2hhbmdlKSB7XG4gIGlmIChjbXAocG9zLCBjaGFuZ2UuZnJvbSkgPCAwKSB7IHJldHVybiBwb3MgfVxuICBpZiAoY21wKHBvcywgY2hhbmdlLnRvKSA8PSAwKSB7IHJldHVybiBjaGFuZ2VFbmQoY2hhbmdlKSB9XG5cbiAgdmFyIGxpbmUgPSBwb3MubGluZSArIGNoYW5nZS50ZXh0Lmxlbmd0aCAtIChjaGFuZ2UudG8ubGluZSAtIGNoYW5nZS5mcm9tLmxpbmUpIC0gMSwgY2ggPSBwb3MuY2g7XG4gIGlmIChwb3MubGluZSA9PSBjaGFuZ2UudG8ubGluZSkgeyBjaCArPSBjaGFuZ2VFbmQoY2hhbmdlKS5jaCAtIGNoYW5nZS50by5jaDsgfVxuICByZXR1cm4gUG9zKGxpbmUsIGNoKVxufVxuXG5mdW5jdGlvbiBjb21wdXRlU2VsQWZ0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpIHtcbiAgdmFyIG91dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaV07XG4gICAgb3V0LnB1c2gobmV3IFJhbmdlKGFkanVzdEZvckNoYW5nZShyYW5nZS5hbmNob3IsIGNoYW5nZSksXG4gICAgICAgICAgICAgICAgICAgICAgIGFkanVzdEZvckNoYW5nZShyYW5nZS5oZWFkLCBjaGFuZ2UpKSk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZVNlbGVjdGlvbihvdXQsIGRvYy5zZWwucHJpbUluZGV4KVxufVxuXG5mdW5jdGlvbiBvZmZzZXRQb3MocG9zLCBvbGQsIG53KSB7XG4gIGlmIChwb3MubGluZSA9PSBvbGQubGluZSlcbiAgICB7IHJldHVybiBQb3MobncubGluZSwgcG9zLmNoIC0gb2xkLmNoICsgbncuY2gpIH1cbiAgZWxzZVxuICAgIHsgcmV0dXJuIFBvcyhudy5saW5lICsgKHBvcy5saW5lIC0gb2xkLmxpbmUpLCBwb3MuY2gpIH1cbn1cblxuLy8gVXNlZCBieSByZXBsYWNlU2VsZWN0aW9ucyB0byBhbGxvdyBtb3ZpbmcgdGhlIHNlbGVjdGlvbiB0byB0aGVcbi8vIHN0YXJ0IG9yIGFyb3VuZCB0aGUgcmVwbGFjZWQgdGVzdC4gSGludCBtYXkgYmUgXCJzdGFydFwiIG9yIFwiYXJvdW5kXCIuXG5mdW5jdGlvbiBjb21wdXRlUmVwbGFjZWRTZWwoZG9jLCBjaGFuZ2VzLCBoaW50KSB7XG4gIHZhciBvdXQgPSBbXTtcbiAgdmFyIG9sZFByZXYgPSBQb3MoZG9jLmZpcnN0LCAwKSwgbmV3UHJldiA9IG9sZFByZXY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuICAgIHZhciBmcm9tID0gb2Zmc2V0UG9zKGNoYW5nZS5mcm9tLCBvbGRQcmV2LCBuZXdQcmV2KTtcbiAgICB2YXIgdG8gPSBvZmZzZXRQb3MoY2hhbmdlRW5kKGNoYW5nZSksIG9sZFByZXYsIG5ld1ByZXYpO1xuICAgIG9sZFByZXYgPSBjaGFuZ2UudG87XG4gICAgbmV3UHJldiA9IHRvO1xuICAgIGlmIChoaW50ID09IFwiYXJvdW5kXCIpIHtcbiAgICAgIHZhciByYW5nZSA9IGRvYy5zZWwucmFuZ2VzW2ldLCBpbnYgPSBjbXAocmFuZ2UuaGVhZCwgcmFuZ2UuYW5jaG9yKSA8IDA7XG4gICAgICBvdXRbaV0gPSBuZXcgUmFuZ2UoaW52ID8gdG8gOiBmcm9tLCBpbnYgPyBmcm9tIDogdG8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRbaV0gPSBuZXcgUmFuZ2UoZnJvbSwgZnJvbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG91dCwgZG9jLnNlbC5wcmltSW5kZXgpXG59XG5cbi8vIFVzZWQgdG8gZ2V0IHRoZSBlZGl0b3IgaW50byBhIGNvbnNpc3RlbnQgc3RhdGUgYWdhaW4gd2hlbiBvcHRpb25zIGNoYW5nZS5cblxuZnVuY3Rpb24gbG9hZE1vZGUoY20pIHtcbiAgY20uZG9jLm1vZGUgPSBnZXRNb2RlKGNtLm9wdGlvbnMsIGNtLmRvYy5tb2RlT3B0aW9uKTtcbiAgcmVzZXRNb2RlU3RhdGUoY20pO1xufVxuXG5mdW5jdGlvbiByZXNldE1vZGVTdGF0ZShjbSkge1xuICBjbS5kb2MuaXRlcihmdW5jdGlvbiAobGluZSkge1xuICAgIGlmIChsaW5lLnN0YXRlQWZ0ZXIpIHsgbGluZS5zdGF0ZUFmdGVyID0gbnVsbDsgfVxuICAgIGlmIChsaW5lLnN0eWxlcykgeyBsaW5lLnN0eWxlcyA9IG51bGw7IH1cbiAgfSk7XG4gIGNtLmRvYy5tb2RlRnJvbnRpZXIgPSBjbS5kb2MuaGlnaGxpZ2h0RnJvbnRpZXIgPSBjbS5kb2MuZmlyc3Q7XG4gIHN0YXJ0V29ya2VyKGNtLCAxMDApO1xuICBjbS5zdGF0ZS5tb2RlR2VuKys7XG4gIGlmIChjbS5jdXJPcCkgeyByZWdDaGFuZ2UoY20pOyB9XG59XG5cbi8vIERPQ1VNRU5UIERBVEEgU1RSVUNUVVJFXG5cbi8vIEJ5IGRlZmF1bHQsIHVwZGF0ZXMgdGhhdCBzdGFydCBhbmQgZW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lXG4vLyBhcmUgdHJlYXRlZCBzcGVjaWFsbHksIGluIG9yZGVyIHRvIG1ha2UgdGhlIGFzc29jaWF0aW9uIG9mIGxpbmVcbi8vIHdpZGdldHMgYW5kIG1hcmtlciBlbGVtZW50cyB3aXRoIHRoZSB0ZXh0IGJlaGF2ZSBtb3JlIGludHVpdGl2ZS5cbmZ1bmN0aW9uIGlzV2hvbGVMaW5lVXBkYXRlKGRvYywgY2hhbmdlKSB7XG4gIHJldHVybiBjaGFuZ2UuZnJvbS5jaCA9PSAwICYmIGNoYW5nZS50by5jaCA9PSAwICYmIGxzdChjaGFuZ2UudGV4dCkgPT0gXCJcIiAmJlxuICAgICghZG9jLmNtIHx8IGRvYy5jbS5vcHRpb25zLndob2xlTGluZVVwZGF0ZUJlZm9yZSlcbn1cblxuLy8gUGVyZm9ybSBhIGNoYW5nZSBvbiB0aGUgZG9jdW1lbnQgZGF0YSBzdHJ1Y3R1cmUuXG5mdW5jdGlvbiB1cGRhdGVEb2MoZG9jLCBjaGFuZ2UsIG1hcmtlZFNwYW5zLCBlc3RpbWF0ZUhlaWdodCQkMSkge1xuICBmdW5jdGlvbiBzcGFuc0ZvcihuKSB7cmV0dXJuIG1hcmtlZFNwYW5zID8gbWFya2VkU3BhbnNbbl0gOiBudWxsfVxuICBmdW5jdGlvbiB1cGRhdGUobGluZSwgdGV4dCwgc3BhbnMpIHtcbiAgICB1cGRhdGVMaW5lKGxpbmUsIHRleHQsIHNwYW5zLCBlc3RpbWF0ZUhlaWdodCQkMSk7XG4gICAgc2lnbmFsTGF0ZXIobGluZSwgXCJjaGFuZ2VcIiwgbGluZSwgY2hhbmdlKTtcbiAgfVxuICBmdW5jdGlvbiBsaW5lc0ZvcihzdGFydCwgZW5kKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKVxuICAgICAgeyByZXN1bHQucHVzaChuZXcgTGluZSh0ZXh0W2ldLCBzcGFuc0ZvcihpKSwgZXN0aW1hdGVIZWlnaHQkJDEpKTsgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHZhciBmcm9tID0gY2hhbmdlLmZyb20sIHRvID0gY2hhbmdlLnRvLCB0ZXh0ID0gY2hhbmdlLnRleHQ7XG4gIHZhciBmaXJzdExpbmUgPSBnZXRMaW5lKGRvYywgZnJvbS5saW5lKSwgbGFzdExpbmUgPSBnZXRMaW5lKGRvYywgdG8ubGluZSk7XG4gIHZhciBsYXN0VGV4dCA9IGxzdCh0ZXh0KSwgbGFzdFNwYW5zID0gc3BhbnNGb3IodGV4dC5sZW5ndGggLSAxKSwgbmxpbmVzID0gdG8ubGluZSAtIGZyb20ubGluZTtcblxuICAvLyBBZGp1c3QgdGhlIGxpbmUgc3RydWN0dXJlXG4gIGlmIChjaGFuZ2UuZnVsbCkge1xuICAgIGRvYy5pbnNlcnQoMCwgbGluZXNGb3IoMCwgdGV4dC5sZW5ndGgpKTtcbiAgICBkb2MucmVtb3ZlKHRleHQubGVuZ3RoLCBkb2Muc2l6ZSAtIHRleHQubGVuZ3RoKTtcbiAgfSBlbHNlIGlmIChpc1dob2xlTGluZVVwZGF0ZShkb2MsIGNoYW5nZSkpIHtcbiAgICAvLyBUaGlzIGlzIGEgd2hvbGUtbGluZSByZXBsYWNlLiBUcmVhdGVkIHNwZWNpYWxseSB0byBtYWtlXG4gICAgLy8gc3VyZSBsaW5lIG9iamVjdHMgbW92ZSB0aGUgd2F5IHRoZXkgYXJlIHN1cHBvc2VkIHRvLlxuICAgIHZhciBhZGRlZCA9IGxpbmVzRm9yKDAsIHRleHQubGVuZ3RoIC0gMSk7XG4gICAgdXBkYXRlKGxhc3RMaW5lLCBsYXN0TGluZS50ZXh0LCBsYXN0U3BhbnMpO1xuICAgIGlmIChubGluZXMpIHsgZG9jLnJlbW92ZShmcm9tLmxpbmUsIG5saW5lcyk7IH1cbiAgICBpZiAoYWRkZWQubGVuZ3RoKSB7IGRvYy5pbnNlcnQoZnJvbS5saW5lLCBhZGRlZCk7IH1cbiAgfSBlbHNlIGlmIChmaXJzdExpbmUgPT0gbGFzdExpbmUpIHtcbiAgICBpZiAodGV4dC5sZW5ndGggPT0gMSkge1xuICAgICAgdXBkYXRlKGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyBsYXN0VGV4dCArIGZpcnN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgbGFzdFNwYW5zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFkZGVkJDEgPSBsaW5lc0ZvcigxLCB0ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgYWRkZWQkMS5wdXNoKG5ldyBMaW5lKGxhc3RUZXh0ICsgZmlyc3RMaW5lLnRleHQuc2xpY2UodG8uY2gpLCBsYXN0U3BhbnMsIGVzdGltYXRlSGVpZ2h0JCQxKSk7XG4gICAgICB1cGRhdGUoZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIHRleHRbMF0sIHNwYW5zRm9yKDApKTtcbiAgICAgIGRvYy5pbnNlcnQoZnJvbS5saW5lICsgMSwgYWRkZWQkMSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRleHQubGVuZ3RoID09IDEpIHtcbiAgICB1cGRhdGUoZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIHRleHRbMF0gKyBsYXN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgc3BhbnNGb3IoMCkpO1xuICAgIGRvYy5yZW1vdmUoZnJvbS5saW5lICsgMSwgbmxpbmVzKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUoZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIHRleHRbMF0sIHNwYW5zRm9yKDApKTtcbiAgICB1cGRhdGUobGFzdExpbmUsIGxhc3RUZXh0ICsgbGFzdExpbmUudGV4dC5zbGljZSh0by5jaCksIGxhc3RTcGFucyk7XG4gICAgdmFyIGFkZGVkJDIgPSBsaW5lc0ZvcigxLCB0ZXh0Lmxlbmd0aCAtIDEpO1xuICAgIGlmIChubGluZXMgPiAxKSB7IGRvYy5yZW1vdmUoZnJvbS5saW5lICsgMSwgbmxpbmVzIC0gMSk7IH1cbiAgICBkb2MuaW5zZXJ0KGZyb20ubGluZSArIDEsIGFkZGVkJDIpO1xuICB9XG5cbiAgc2lnbmFsTGF0ZXIoZG9jLCBcImNoYW5nZVwiLCBkb2MsIGNoYW5nZSk7XG59XG5cbi8vIENhbGwgZiBmb3IgYWxsIGxpbmtlZCBkb2N1bWVudHMuXG5mdW5jdGlvbiBsaW5rZWREb2NzKGRvYywgZiwgc2hhcmVkSGlzdE9ubHkpIHtcbiAgZnVuY3Rpb24gcHJvcGFnYXRlKGRvYywgc2tpcCwgc2hhcmVkSGlzdCkge1xuICAgIGlmIChkb2MubGlua2VkKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgZG9jLmxpbmtlZC5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHJlbCA9IGRvYy5saW5rZWRbaV07XG4gICAgICBpZiAocmVsLmRvYyA9PSBza2lwKSB7IGNvbnRpbnVlIH1cbiAgICAgIHZhciBzaGFyZWQgPSBzaGFyZWRIaXN0ICYmIHJlbC5zaGFyZWRIaXN0O1xuICAgICAgaWYgKHNoYXJlZEhpc3RPbmx5ICYmICFzaGFyZWQpIHsgY29udGludWUgfVxuICAgICAgZihyZWwuZG9jLCBzaGFyZWQpO1xuICAgICAgcHJvcGFnYXRlKHJlbC5kb2MsIGRvYywgc2hhcmVkKTtcbiAgICB9IH1cbiAgfVxuICBwcm9wYWdhdGUoZG9jLCBudWxsLCB0cnVlKTtcbn1cblxuLy8gQXR0YWNoIGEgZG9jdW1lbnQgdG8gYW4gZWRpdG9yLlxuZnVuY3Rpb24gYXR0YWNoRG9jKGNtLCBkb2MpIHtcbiAgaWYgKGRvYy5jbSkgeyB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGRvY3VtZW50IGlzIGFscmVhZHkgaW4gdXNlLlwiKSB9XG4gIGNtLmRvYyA9IGRvYztcbiAgZG9jLmNtID0gY207XG4gIGVzdGltYXRlTGluZUhlaWdodHMoY20pO1xuICBsb2FkTW9kZShjbSk7XG4gIHNldERpcmVjdGlvbkNsYXNzKGNtKTtcbiAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgeyBmaW5kTWF4TGluZShjbSk7IH1cbiAgY20ub3B0aW9ucy5tb2RlID0gZG9jLm1vZGVPcHRpb247XG4gIHJlZ0NoYW5nZShjbSk7XG59XG5cbmZ1bmN0aW9uIHNldERpcmVjdGlvbkNsYXNzKGNtKSB7XG4gIChjbS5kb2MuZGlyZWN0aW9uID09IFwicnRsXCIgPyBhZGRDbGFzcyA6IHJtQ2xhc3MpKGNtLmRpc3BsYXkubGluZURpdiwgXCJDb2RlTWlycm9yLXJ0bFwiKTtcbn1cblxuZnVuY3Rpb24gZGlyZWN0aW9uQ2hhbmdlZChjbSkge1xuICBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgc2V0RGlyZWN0aW9uQ2xhc3MoY20pO1xuICAgIHJlZ0NoYW5nZShjbSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBIaXN0b3J5KHN0YXJ0R2VuKSB7XG4gIC8vIEFycmF5cyBvZiBjaGFuZ2UgZXZlbnRzIGFuZCBzZWxlY3Rpb25zLiBEb2luZyBzb21ldGhpbmcgYWRkcyBhblxuICAvLyBldmVudCB0byBkb25lIGFuZCBjbGVhcnMgdW5kby4gVW5kb2luZyBtb3ZlcyBldmVudHMgZnJvbSBkb25lXG4gIC8vIHRvIHVuZG9uZSwgcmVkb2luZyBtb3ZlcyB0aGVtIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gIHRoaXMuZG9uZSA9IFtdOyB0aGlzLnVuZG9uZSA9IFtdO1xuICB0aGlzLnVuZG9EZXB0aCA9IEluZmluaXR5O1xuICAvLyBVc2VkIHRvIHRyYWNrIHdoZW4gY2hhbmdlcyBjYW4gYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgdW5kb1xuICAvLyBldmVudFxuICB0aGlzLmxhc3RNb2RUaW1lID0gdGhpcy5sYXN0U2VsVGltZSA9IDA7XG4gIHRoaXMubGFzdE9wID0gdGhpcy5sYXN0U2VsT3AgPSBudWxsO1xuICB0aGlzLmxhc3RPcmlnaW4gPSB0aGlzLmxhc3RTZWxPcmlnaW4gPSBudWxsO1xuICAvLyBVc2VkIGJ5IHRoZSBpc0NsZWFuKCkgbWV0aG9kXG4gIHRoaXMuZ2VuZXJhdGlvbiA9IHRoaXMubWF4R2VuZXJhdGlvbiA9IHN0YXJ0R2VuIHx8IDE7XG59XG5cbi8vIENyZWF0ZSBhIGhpc3RvcnkgY2hhbmdlIGV2ZW50IGZyb20gYW4gdXBkYXRlRG9jLXN0eWxlIGNoYW5nZVxuLy8gb2JqZWN0LlxuZnVuY3Rpb24gaGlzdG9yeUNoYW5nZUZyb21DaGFuZ2UoZG9jLCBjaGFuZ2UpIHtcbiAgdmFyIGhpc3RDaGFuZ2UgPSB7ZnJvbTogY29weVBvcyhjaGFuZ2UuZnJvbSksIHRvOiBjaGFuZ2VFbmQoY2hhbmdlKSwgdGV4dDogZ2V0QmV0d2Vlbihkb2MsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pfTtcbiAgYXR0YWNoTG9jYWxTcGFucyhkb2MsIGhpc3RDaGFuZ2UsIGNoYW5nZS5mcm9tLmxpbmUsIGNoYW5nZS50by5saW5lICsgMSk7XG4gIGxpbmtlZERvY3MoZG9jLCBmdW5jdGlvbiAoZG9jKSB7IHJldHVybiBhdHRhY2hMb2NhbFNwYW5zKGRvYywgaGlzdENoYW5nZSwgY2hhbmdlLmZyb20ubGluZSwgY2hhbmdlLnRvLmxpbmUgKyAxKTsgfSwgdHJ1ZSk7XG4gIHJldHVybiBoaXN0Q2hhbmdlXG59XG5cbi8vIFBvcCBhbGwgc2VsZWN0aW9uIGV2ZW50cyBvZmYgdGhlIGVuZCBvZiBhIGhpc3RvcnkgYXJyYXkuIFN0b3AgYXRcbi8vIGEgY2hhbmdlIGV2ZW50LlxuZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb25FdmVudHMoYXJyYXkpIHtcbiAgd2hpbGUgKGFycmF5Lmxlbmd0aCkge1xuICAgIHZhciBsYXN0ID0gbHN0KGFycmF5KTtcbiAgICBpZiAobGFzdC5yYW5nZXMpIHsgYXJyYXkucG9wKCk7IH1cbiAgICBlbHNlIHsgYnJlYWsgfVxuICB9XG59XG5cbi8vIEZpbmQgdGhlIHRvcCBjaGFuZ2UgZXZlbnQgaW4gdGhlIGhpc3RvcnkuIFBvcCBvZmYgc2VsZWN0aW9uXG4vLyBldmVudHMgdGhhdCBhcmUgaW4gdGhlIHdheS5cbmZ1bmN0aW9uIGxhc3RDaGFuZ2VFdmVudChoaXN0LCBmb3JjZSkge1xuICBpZiAoZm9yY2UpIHtcbiAgICBjbGVhclNlbGVjdGlvbkV2ZW50cyhoaXN0LmRvbmUpO1xuICAgIHJldHVybiBsc3QoaGlzdC5kb25lKVxuICB9IGVsc2UgaWYgKGhpc3QuZG9uZS5sZW5ndGggJiYgIWxzdChoaXN0LmRvbmUpLnJhbmdlcykge1xuICAgIHJldHVybiBsc3QoaGlzdC5kb25lKVxuICB9IGVsc2UgaWYgKGhpc3QuZG9uZS5sZW5ndGggPiAxICYmICFoaXN0LmRvbmVbaGlzdC5kb25lLmxlbmd0aCAtIDJdLnJhbmdlcykge1xuICAgIGhpc3QuZG9uZS5wb3AoKTtcbiAgICByZXR1cm4gbHN0KGhpc3QuZG9uZSlcbiAgfVxufVxuXG4vLyBSZWdpc3RlciBhIGNoYW5nZSBpbiB0aGUgaGlzdG9yeS4gTWVyZ2VzIGNoYW5nZXMgdGhhdCBhcmUgd2l0aGluXG4vLyBhIHNpbmdsZSBvcGVyYXRpb24sIG9yIGFyZSBjbG9zZSB0b2dldGhlciB3aXRoIGFuIG9yaWdpbiB0aGF0XG4vLyBhbGxvd3MgbWVyZ2luZyAoc3RhcnRpbmcgd2l0aCBcIitcIikgaW50byBhIHNpbmdsZSBldmVudC5cbmZ1bmN0aW9uIGFkZENoYW5nZVRvSGlzdG9yeShkb2MsIGNoYW5nZSwgc2VsQWZ0ZXIsIG9wSWQpIHtcbiAgdmFyIGhpc3QgPSBkb2MuaGlzdG9yeTtcbiAgaGlzdC51bmRvbmUubGVuZ3RoID0gMDtcbiAgdmFyIHRpbWUgPSArbmV3IERhdGUsIGN1cjtcbiAgdmFyIGxhc3Q7XG5cbiAgaWYgKChoaXN0Lmxhc3RPcCA9PSBvcElkIHx8XG4gICAgICAgaGlzdC5sYXN0T3JpZ2luID09IGNoYW5nZS5vcmlnaW4gJiYgY2hhbmdlLm9yaWdpbiAmJlxuICAgICAgICgoY2hhbmdlLm9yaWdpbi5jaGFyQXQoMCkgPT0gXCIrXCIgJiYgaGlzdC5sYXN0TW9kVGltZSA+IHRpbWUgLSAoZG9jLmNtID8gZG9jLmNtLm9wdGlvbnMuaGlzdG9yeUV2ZW50RGVsYXkgOiA1MDApKSB8fFxuICAgICAgICBjaGFuZ2Uub3JpZ2luLmNoYXJBdCgwKSA9PSBcIipcIikpICYmXG4gICAgICAoY3VyID0gbGFzdENoYW5nZUV2ZW50KGhpc3QsIGhpc3QubGFzdE9wID09IG9wSWQpKSkge1xuICAgIC8vIE1lcmdlIHRoaXMgY2hhbmdlIGludG8gdGhlIGxhc3QgZXZlbnRcbiAgICBsYXN0ID0gbHN0KGN1ci5jaGFuZ2VzKTtcbiAgICBpZiAoY21wKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pID09IDAgJiYgY21wKGNoYW5nZS5mcm9tLCBsYXN0LnRvKSA9PSAwKSB7XG4gICAgICAvLyBPcHRpbWl6ZWQgY2FzZSBmb3Igc2ltcGxlIGluc2VydGlvbiAtLSBkb24ndCB3YW50IHRvIGFkZFxuICAgICAgLy8gbmV3IGNoYW5nZXNldHMgZm9yIGV2ZXJ5IGNoYXJhY3RlciB0eXBlZFxuICAgICAgbGFzdC50byA9IGNoYW5nZUVuZChjaGFuZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgbmV3IHN1Yi1ldmVudFxuICAgICAgY3VyLmNoYW5nZXMucHVzaChoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsIGNoYW5nZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBDYW4gbm90IGJlIG1lcmdlZCwgc3RhcnQgYSBuZXcgZXZlbnQuXG4gICAgdmFyIGJlZm9yZSA9IGxzdChoaXN0LmRvbmUpO1xuICAgIGlmICghYmVmb3JlIHx8ICFiZWZvcmUucmFuZ2VzKVxuICAgICAgeyBwdXNoU2VsZWN0aW9uVG9IaXN0b3J5KGRvYy5zZWwsIGhpc3QuZG9uZSk7IH1cbiAgICBjdXIgPSB7Y2hhbmdlczogW2hpc3RvcnlDaGFuZ2VGcm9tQ2hhbmdlKGRvYywgY2hhbmdlKV0sXG4gICAgICAgICAgIGdlbmVyYXRpb246IGhpc3QuZ2VuZXJhdGlvbn07XG4gICAgaGlzdC5kb25lLnB1c2goY3VyKTtcbiAgICB3aGlsZSAoaGlzdC5kb25lLmxlbmd0aCA+IGhpc3QudW5kb0RlcHRoKSB7XG4gICAgICBoaXN0LmRvbmUuc2hpZnQoKTtcbiAgICAgIGlmICghaGlzdC5kb25lWzBdLnJhbmdlcykgeyBoaXN0LmRvbmUuc2hpZnQoKTsgfVxuICAgIH1cbiAgfVxuICBoaXN0LmRvbmUucHVzaChzZWxBZnRlcik7XG4gIGhpc3QuZ2VuZXJhdGlvbiA9ICsraGlzdC5tYXhHZW5lcmF0aW9uO1xuICBoaXN0Lmxhc3RNb2RUaW1lID0gaGlzdC5sYXN0U2VsVGltZSA9IHRpbWU7XG4gIGhpc3QubGFzdE9wID0gaGlzdC5sYXN0U2VsT3AgPSBvcElkO1xuICBoaXN0Lmxhc3RPcmlnaW4gPSBoaXN0Lmxhc3RTZWxPcmlnaW4gPSBjaGFuZ2Uub3JpZ2luO1xuXG4gIGlmICghbGFzdCkgeyBzaWduYWwoZG9jLCBcImhpc3RvcnlBZGRlZFwiKTsgfVxufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25FdmVudENhbkJlTWVyZ2VkKGRvYywgb3JpZ2luLCBwcmV2LCBzZWwpIHtcbiAgdmFyIGNoID0gb3JpZ2luLmNoYXJBdCgwKTtcbiAgcmV0dXJuIGNoID09IFwiKlwiIHx8XG4gICAgY2ggPT0gXCIrXCIgJiZcbiAgICBwcmV2LnJhbmdlcy5sZW5ndGggPT0gc2VsLnJhbmdlcy5sZW5ndGggJiZcbiAgICBwcmV2LnNvbWV0aGluZ1NlbGVjdGVkKCkgPT0gc2VsLnNvbWV0aGluZ1NlbGVjdGVkKCkgJiZcbiAgICBuZXcgRGF0ZSAtIGRvYy5oaXN0b3J5Lmxhc3RTZWxUaW1lIDw9IChkb2MuY20gPyBkb2MuY20ub3B0aW9ucy5oaXN0b3J5RXZlbnREZWxheSA6IDUwMClcbn1cblxuLy8gQ2FsbGVkIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcywgc2V0cyB0aGUgbmV3IHNlbGVjdGlvbiBhc1xuLy8gdGhlIHBlbmRpbmcgc2VsZWN0aW9uIGluIHRoZSBoaXN0b3J5LCBhbmQgcHVzaGVzIHRoZSBvbGQgcGVuZGluZ1xuLy8gc2VsZWN0aW9uIGludG8gdGhlICdkb25lJyBhcnJheSB3aGVuIGl0IHdhcyBzaWduaWZpY2FudGx5XG4vLyBkaWZmZXJlbnQgKGluIG51bWJlciBvZiBzZWxlY3RlZCByYW5nZXMsIGVtcHRpbmVzcywgb3IgdGltZSkuXG5mdW5jdGlvbiBhZGRTZWxlY3Rpb25Ub0hpc3RvcnkoZG9jLCBzZWwsIG9wSWQsIG9wdGlvbnMpIHtcbiAgdmFyIGhpc3QgPSBkb2MuaGlzdG9yeSwgb3JpZ2luID0gb3B0aW9ucyAmJiBvcHRpb25zLm9yaWdpbjtcblxuICAvLyBBIG5ldyBldmVudCBpcyBzdGFydGVkIHdoZW4gdGhlIHByZXZpb3VzIG9yaWdpbiBkb2VzIG5vdCBtYXRjaFxuICAvLyB0aGUgY3VycmVudCwgb3IgdGhlIG9yaWdpbnMgZG9uJ3QgYWxsb3cgbWF0Y2hpbmcuIE9yaWdpbnNcbiAgLy8gc3RhcnRpbmcgd2l0aCAqIGFyZSBhbHdheXMgbWVyZ2VkLCB0aG9zZSBzdGFydGluZyB3aXRoICsgYXJlXG4gIC8vIG1lcmdlZCB3aGVuIHNpbWlsYXIgYW5kIGNsb3NlIHRvZ2V0aGVyIGluIHRpbWUuXG4gIGlmIChvcElkID09IGhpc3QubGFzdFNlbE9wIHx8XG4gICAgICAob3JpZ2luICYmIGhpc3QubGFzdFNlbE9yaWdpbiA9PSBvcmlnaW4gJiZcbiAgICAgICAoaGlzdC5sYXN0TW9kVGltZSA9PSBoaXN0Lmxhc3RTZWxUaW1lICYmIGhpc3QubGFzdE9yaWdpbiA9PSBvcmlnaW4gfHxcbiAgICAgICAgc2VsZWN0aW9uRXZlbnRDYW5CZU1lcmdlZChkb2MsIG9yaWdpbiwgbHN0KGhpc3QuZG9uZSksIHNlbCkpKSlcbiAgICB7IGhpc3QuZG9uZVtoaXN0LmRvbmUubGVuZ3RoIC0gMV0gPSBzZWw7IH1cbiAgZWxzZVxuICAgIHsgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShzZWwsIGhpc3QuZG9uZSk7IH1cblxuICBoaXN0Lmxhc3RTZWxUaW1lID0gK25ldyBEYXRlO1xuICBoaXN0Lmxhc3RTZWxPcmlnaW4gPSBvcmlnaW47XG4gIGhpc3QubGFzdFNlbE9wID0gb3BJZDtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jbGVhclJlZG8gIT09IGZhbHNlKVxuICAgIHsgY2xlYXJTZWxlY3Rpb25FdmVudHMoaGlzdC51bmRvbmUpOyB9XG59XG5cbmZ1bmN0aW9uIHB1c2hTZWxlY3Rpb25Ub0hpc3Rvcnkoc2VsLCBkZXN0KSB7XG4gIHZhciB0b3AgPSBsc3QoZGVzdCk7XG4gIGlmICghKHRvcCAmJiB0b3AucmFuZ2VzICYmIHRvcC5lcXVhbHMoc2VsKSkpXG4gICAgeyBkZXN0LnB1c2goc2VsKTsgfVxufVxuXG4vLyBVc2VkIHRvIHN0b3JlIG1hcmtlZCBzcGFuIGluZm9ybWF0aW9uIGluIHRoZSBoaXN0b3J5LlxuZnVuY3Rpb24gYXR0YWNoTG9jYWxTcGFucyhkb2MsIGNoYW5nZSwgZnJvbSwgdG8pIHtcbiAgdmFyIGV4aXN0aW5nID0gY2hhbmdlW1wic3BhbnNfXCIgKyBkb2MuaWRdLCBuID0gMDtcbiAgZG9jLml0ZXIoTWF0aC5tYXgoZG9jLmZpcnN0LCBmcm9tKSwgTWF0aC5taW4oZG9jLmZpcnN0ICsgZG9jLnNpemUsIHRvKSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICBpZiAobGluZS5tYXJrZWRTcGFucylcbiAgICAgIHsgKGV4aXN0aW5nIHx8IChleGlzdGluZyA9IGNoYW5nZVtcInNwYW5zX1wiICsgZG9jLmlkXSA9IHt9KSlbbl0gPSBsaW5lLm1hcmtlZFNwYW5zOyB9XG4gICAgKytuO1xuICB9KTtcbn1cblxuLy8gV2hlbiB1bi9yZS1kb2luZyByZXN0b3JlcyB0ZXh0IGNvbnRhaW5pbmcgbWFya2VkIHNwYW5zLCB0aG9zZVxuLy8gdGhhdCBoYXZlIGJlZW4gZXhwbGljaXRseSBjbGVhcmVkIHNob3VsZCBub3QgYmUgcmVzdG9yZWQuXG5mdW5jdGlvbiByZW1vdmVDbGVhcmVkU3BhbnMoc3BhbnMpIHtcbiAgaWYgKCFzcGFucykgeyByZXR1cm4gbnVsbCB9XG4gIHZhciBvdXQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoc3BhbnNbaV0ubWFya2VyLmV4cGxpY2l0bHlDbGVhcmVkKSB7IGlmICghb3V0KSB7IG91dCA9IHNwYW5zLnNsaWNlKDAsIGkpOyB9IH1cbiAgICBlbHNlIGlmIChvdXQpIHsgb3V0LnB1c2goc3BhbnNbaV0pOyB9XG4gIH1cbiAgcmV0dXJuICFvdXQgPyBzcGFucyA6IG91dC5sZW5ndGggPyBvdXQgOiBudWxsXG59XG5cbi8vIFJldHJpZXZlIGFuZCBmaWx0ZXIgdGhlIG9sZCBtYXJrZWQgc3BhbnMgc3RvcmVkIGluIGEgY2hhbmdlIGV2ZW50LlxuZnVuY3Rpb24gZ2V0T2xkU3BhbnMoZG9jLCBjaGFuZ2UpIHtcbiAgdmFyIGZvdW5kID0gY2hhbmdlW1wic3BhbnNfXCIgKyBkb2MuaWRdO1xuICBpZiAoIWZvdW5kKSB7IHJldHVybiBudWxsIH1cbiAgdmFyIG53ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlLnRleHQubGVuZ3RoOyArK2kpXG4gICAgeyBudy5wdXNoKHJlbW92ZUNsZWFyZWRTcGFucyhmb3VuZFtpXSkpOyB9XG4gIHJldHVybiBud1xufVxuXG4vLyBVc2VkIGZvciB1bi9yZS1kb2luZyBjaGFuZ2VzIGZyb20gdGhlIGhpc3RvcnkuIENvbWJpbmVzIHRoZVxuLy8gcmVzdWx0IG9mIGNvbXB1dGluZyB0aGUgZXhpc3Rpbmcgc3BhbnMgd2l0aCB0aGUgc2V0IG9mIHNwYW5zIHRoYXRcbi8vIGV4aXN0ZWQgaW4gdGhlIGhpc3RvcnkgKHNvIHRoYXQgZGVsZXRpbmcgYXJvdW5kIGEgc3BhbiBhbmQgdGhlblxuLy8gdW5kb2luZyBicmluZ3MgYmFjayB0aGUgc3BhbikuXG5mdW5jdGlvbiBtZXJnZU9sZFNwYW5zKGRvYywgY2hhbmdlKSB7XG4gIHZhciBvbGQgPSBnZXRPbGRTcGFucyhkb2MsIGNoYW5nZSk7XG4gIHZhciBzdHJldGNoZWQgPSBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYywgY2hhbmdlKTtcbiAgaWYgKCFvbGQpIHsgcmV0dXJuIHN0cmV0Y2hlZCB9XG4gIGlmICghc3RyZXRjaGVkKSB7IHJldHVybiBvbGQgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb2xkLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIG9sZEN1ciA9IG9sZFtpXSwgc3RyZXRjaEN1ciA9IHN0cmV0Y2hlZFtpXTtcbiAgICBpZiAob2xkQ3VyICYmIHN0cmV0Y2hDdXIpIHtcbiAgICAgIHNwYW5zOiBmb3IgKHZhciBqID0gMDsgaiA8IHN0cmV0Y2hDdXIubGVuZ3RoOyArK2opIHtcbiAgICAgICAgdmFyIHNwYW4gPSBzdHJldGNoQ3VyW2pdO1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IG9sZEN1ci5sZW5ndGg7ICsraylcbiAgICAgICAgICB7IGlmIChvbGRDdXJba10ubWFya2VyID09IHNwYW4ubWFya2VyKSB7IGNvbnRpbnVlIHNwYW5zIH0gfVxuICAgICAgICBvbGRDdXIucHVzaChzcGFuKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0cmV0Y2hDdXIpIHtcbiAgICAgIG9sZFtpXSA9IHN0cmV0Y2hDdXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBvbGRcbn1cblxuLy8gVXNlZCBib3RoIHRvIHByb3ZpZGUgYSBKU09OLXNhZmUgb2JqZWN0IGluIC5nZXRIaXN0b3J5LCBhbmQsIHdoZW5cbi8vIGRldGFjaGluZyBhIGRvY3VtZW50LCB0byBzcGxpdCB0aGUgaGlzdG9yeSBpbiB0d29cbmZ1bmN0aW9uIGNvcHlIaXN0b3J5QXJyYXkoZXZlbnRzLCBuZXdHcm91cCwgaW5zdGFudGlhdGVTZWwpIHtcbiAgdmFyIGNvcHkgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgZXZlbnQgPSBldmVudHNbaV07XG4gICAgaWYgKGV2ZW50LnJhbmdlcykge1xuICAgICAgY29weS5wdXNoKGluc3RhbnRpYXRlU2VsID8gU2VsZWN0aW9uLnByb3RvdHlwZS5kZWVwQ29weS5jYWxsKGV2ZW50KSA6IGV2ZW50KTtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIHZhciBjaGFuZ2VzID0gZXZlbnQuY2hhbmdlcywgbmV3Q2hhbmdlcyA9IFtdO1xuICAgIGNvcHkucHVzaCh7Y2hhbmdlczogbmV3Q2hhbmdlc30pO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hhbmdlcy5sZW5ndGg7ICsraikge1xuICAgICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbal0sIG0gPSAodm9pZCAwKTtcbiAgICAgIG5ld0NoYW5nZXMucHVzaCh7ZnJvbTogY2hhbmdlLmZyb20sIHRvOiBjaGFuZ2UudG8sIHRleHQ6IGNoYW5nZS50ZXh0fSk7XG4gICAgICBpZiAobmV3R3JvdXApIHsgZm9yICh2YXIgcHJvcCBpbiBjaGFuZ2UpIHsgaWYgKG0gPSBwcm9wLm1hdGNoKC9ec3BhbnNfKFxcZCspJC8pKSB7XG4gICAgICAgIGlmIChpbmRleE9mKG5ld0dyb3VwLCBOdW1iZXIobVsxXSkpID4gLTEpIHtcbiAgICAgICAgICBsc3QobmV3Q2hhbmdlcylbcHJvcF0gPSBjaGFuZ2VbcHJvcF07XG4gICAgICAgICAgZGVsZXRlIGNoYW5nZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSB9IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvcHlcbn1cblxuLy8gVGhlICdzY3JvbGwnIHBhcmFtZXRlciBnaXZlbiB0byBtYW55IG9mIHRoZXNlIGluZGljYXRlZCB3aGV0aGVyXG4vLyB0aGUgbmV3IGN1cnNvciBwb3NpdGlvbiBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3IGFmdGVyXG4vLyBtb2RpZnlpbmcgdGhlIHNlbGVjdGlvbi5cblxuLy8gSWYgc2hpZnQgaXMgaGVsZCBvciB0aGUgZXh0ZW5kIGZsYWcgaXMgc2V0LCBleHRlbmRzIGEgcmFuZ2UgdG9cbi8vIGluY2x1ZGUgYSBnaXZlbiBwb3NpdGlvbiAoYW5kIG9wdGlvbmFsbHkgYSBzZWNvbmQgcG9zaXRpb24pLlxuLy8gT3RoZXJ3aXNlLCBzaW1wbHkgcmV0dXJucyB0aGUgcmFuZ2UgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9zaXRpb25zLlxuLy8gVXNlZCBmb3IgY3Vyc29yIG1vdGlvbiBhbmQgc3VjaC5cbmZ1bmN0aW9uIGV4dGVuZFJhbmdlKHJhbmdlLCBoZWFkLCBvdGhlciwgZXh0ZW5kKSB7XG4gIGlmIChleHRlbmQpIHtcbiAgICB2YXIgYW5jaG9yID0gcmFuZ2UuYW5jaG9yO1xuICAgIGlmIChvdGhlcikge1xuICAgICAgdmFyIHBvc0JlZm9yZSA9IGNtcChoZWFkLCBhbmNob3IpIDwgMDtcbiAgICAgIGlmIChwb3NCZWZvcmUgIT0gKGNtcChvdGhlciwgYW5jaG9yKSA8IDApKSB7XG4gICAgICAgIGFuY2hvciA9IGhlYWQ7XG4gICAgICAgIGhlYWQgPSBvdGhlcjtcbiAgICAgIH0gZWxzZSBpZiAocG9zQmVmb3JlICE9IChjbXAoaGVhZCwgb3RoZXIpIDwgMCkpIHtcbiAgICAgICAgaGVhZCA9IG90aGVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFJhbmdlKGFuY2hvciwgaGVhZClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IFJhbmdlKG90aGVyIHx8IGhlYWQsIGhlYWQpXG4gIH1cbn1cblxuLy8gRXh0ZW5kIHRoZSBwcmltYXJ5IHNlbGVjdGlvbiByYW5nZSwgZGlzY2FyZCB0aGUgcmVzdC5cbmZ1bmN0aW9uIGV4dGVuZFNlbGVjdGlvbihkb2MsIGhlYWQsIG90aGVyLCBvcHRpb25zLCBleHRlbmQpIHtcbiAgaWYgKGV4dGVuZCA9PSBudWxsKSB7IGV4dGVuZCA9IGRvYy5jbSAmJiAoZG9jLmNtLmRpc3BsYXkuc2hpZnQgfHwgZG9jLmV4dGVuZCk7IH1cbiAgc2V0U2VsZWN0aW9uKGRvYywgbmV3IFNlbGVjdGlvbihbZXh0ZW5kUmFuZ2UoZG9jLnNlbC5wcmltYXJ5KCksIGhlYWQsIG90aGVyLCBleHRlbmQpXSwgMCksIG9wdGlvbnMpO1xufVxuXG4vLyBFeHRlbmQgYWxsIHNlbGVjdGlvbnMgKHBvcyBpcyBhbiBhcnJheSBvZiBzZWxlY3Rpb25zIHdpdGggbGVuZ3RoXG4vLyBlcXVhbCB0aGUgbnVtYmVyIG9mIHNlbGVjdGlvbnMpXG5mdW5jdGlvbiBleHRlbmRTZWxlY3Rpb25zKGRvYywgaGVhZHMsIG9wdGlvbnMpIHtcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgZXh0ZW5kID0gZG9jLmNtICYmIChkb2MuY20uZGlzcGxheS5zaGlmdCB8fCBkb2MuZXh0ZW5kKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICB7IG91dFtpXSA9IGV4dGVuZFJhbmdlKGRvYy5zZWwucmFuZ2VzW2ldLCBoZWFkc1tpXSwgbnVsbCwgZXh0ZW5kKTsgfVxuICB2YXIgbmV3U2VsID0gbm9ybWFsaXplU2VsZWN0aW9uKG91dCwgZG9jLnNlbC5wcmltSW5kZXgpO1xuICBzZXRTZWxlY3Rpb24oZG9jLCBuZXdTZWwsIG9wdGlvbnMpO1xufVxuXG4vLyBVcGRhdGVzIGEgc2luZ2xlIHJhbmdlIGluIHRoZSBzZWxlY3Rpb24uXG5mdW5jdGlvbiByZXBsYWNlT25lU2VsZWN0aW9uKGRvYywgaSwgcmFuZ2UsIG9wdGlvbnMpIHtcbiAgdmFyIHJhbmdlcyA9IGRvYy5zZWwucmFuZ2VzLnNsaWNlKDApO1xuICByYW5nZXNbaV0gPSByYW5nZTtcbiAgc2V0U2VsZWN0aW9uKGRvYywgbm9ybWFsaXplU2VsZWN0aW9uKHJhbmdlcywgZG9jLnNlbC5wcmltSW5kZXgpLCBvcHRpb25zKTtcbn1cblxuLy8gUmVzZXQgdGhlIHNlbGVjdGlvbiB0byBhIHNpbmdsZSByYW5nZS5cbmZ1bmN0aW9uIHNldFNpbXBsZVNlbGVjdGlvbihkb2MsIGFuY2hvciwgaGVhZCwgb3B0aW9ucykge1xuICBzZXRTZWxlY3Rpb24oZG9jLCBzaW1wbGVTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSwgb3B0aW9ucyk7XG59XG5cbi8vIEdpdmUgYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIGhhbmRsZXJzIGEgY2hhbmdlIHRvIGluZmx1ZW5jZSBhXG4vLyBzZWxlY3Rpb24gdXBkYXRlLlxuZnVuY3Rpb24gZmlsdGVyU2VsZWN0aW9uQ2hhbmdlKGRvYywgc2VsLCBvcHRpb25zKSB7XG4gIHZhciBvYmogPSB7XG4gICAgcmFuZ2VzOiBzZWwucmFuZ2VzLFxuICAgIHVwZGF0ZTogZnVuY3Rpb24ocmFuZ2VzKSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgdGhpcy5yYW5nZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7IHRoaXMkMS5yYW5nZXNbaV0gPSBuZXcgUmFuZ2UoY2xpcFBvcyhkb2MsIHJhbmdlc1tpXS5hbmNob3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUG9zKGRvYywgcmFuZ2VzW2ldLmhlYWQpKTsgfVxuICAgIH0sXG4gICAgb3JpZ2luOiBvcHRpb25zICYmIG9wdGlvbnMub3JpZ2luXG4gIH07XG4gIHNpZ25hbChkb2MsIFwiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlXCIsIGRvYywgb2JqKTtcbiAgaWYgKGRvYy5jbSkgeyBzaWduYWwoZG9jLmNtLCBcImJlZm9yZVNlbGVjdGlvbkNoYW5nZVwiLCBkb2MuY20sIG9iaik7IH1cbiAgaWYgKG9iai5yYW5nZXMgIT0gc2VsLnJhbmdlcykgeyByZXR1cm4gbm9ybWFsaXplU2VsZWN0aW9uKG9iai5yYW5nZXMsIG9iai5yYW5nZXMubGVuZ3RoIC0gMSkgfVxuICBlbHNlIHsgcmV0dXJuIHNlbCB9XG59XG5cbmZ1bmN0aW9uIHNldFNlbGVjdGlvblJlcGxhY2VIaXN0b3J5KGRvYywgc2VsLCBvcHRpb25zKSB7XG4gIHZhciBkb25lID0gZG9jLmhpc3RvcnkuZG9uZSwgbGFzdCA9IGxzdChkb25lKTtcbiAgaWYgKGxhc3QgJiYgbGFzdC5yYW5nZXMpIHtcbiAgICBkb25lW2RvbmUubGVuZ3RoIC0gMV0gPSBzZWw7XG4gICAgc2V0U2VsZWN0aW9uTm9VbmRvKGRvYywgc2VsLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRTZWxlY3Rpb24oZG9jLCBzZWwsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8vIFNldCBhIG5ldyBzZWxlY3Rpb24uXG5mdW5jdGlvbiBzZXRTZWxlY3Rpb24oZG9jLCBzZWwsIG9wdGlvbnMpIHtcbiAgc2V0U2VsZWN0aW9uTm9VbmRvKGRvYywgc2VsLCBvcHRpb25zKTtcbiAgYWRkU2VsZWN0aW9uVG9IaXN0b3J5KGRvYywgZG9jLnNlbCwgZG9jLmNtID8gZG9jLmNtLmN1ck9wLmlkIDogTmFOLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gc2V0U2VsZWN0aW9uTm9VbmRvKGRvYywgc2VsLCBvcHRpb25zKSB7XG4gIGlmIChoYXNIYW5kbGVyKGRvYywgXCJiZWZvcmVTZWxlY3Rpb25DaGFuZ2VcIikgfHwgZG9jLmNtICYmIGhhc0hhbmRsZXIoZG9jLmNtLCBcImJlZm9yZVNlbGVjdGlvbkNoYW5nZVwiKSlcbiAgICB7IHNlbCA9IGZpbHRlclNlbGVjdGlvbkNoYW5nZShkb2MsIHNlbCwgb3B0aW9ucyk7IH1cblxuICB2YXIgYmlhcyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5iaWFzIHx8XG4gICAgKGNtcChzZWwucHJpbWFyeSgpLmhlYWQsIGRvYy5zZWwucHJpbWFyeSgpLmhlYWQpIDwgMCA/IC0xIDogMSk7XG4gIHNldFNlbGVjdGlvbklubmVyKGRvYywgc2tpcEF0b21pY0luU2VsZWN0aW9uKGRvYywgc2VsLCBiaWFzLCB0cnVlKSk7XG5cbiAgaWYgKCEob3B0aW9ucyAmJiBvcHRpb25zLnNjcm9sbCA9PT0gZmFsc2UpICYmIGRvYy5jbSlcbiAgICB7IGVuc3VyZUN1cnNvclZpc2libGUoZG9jLmNtKTsgfVxufVxuXG5mdW5jdGlvbiBzZXRTZWxlY3Rpb25Jbm5lcihkb2MsIHNlbCkge1xuICBpZiAoc2VsLmVxdWFscyhkb2Muc2VsKSkgeyByZXR1cm4gfVxuXG4gIGRvYy5zZWwgPSBzZWw7XG5cbiAgaWYgKGRvYy5jbSkge1xuICAgIGRvYy5jbS5jdXJPcC51cGRhdGVJbnB1dCA9IGRvYy5jbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTtcbiAgICBzaWduYWxDdXJzb3JBY3Rpdml0eShkb2MuY20pO1xuICB9XG4gIHNpZ25hbExhdGVyKGRvYywgXCJjdXJzb3JBY3Rpdml0eVwiLCBkb2MpO1xufVxuXG4vLyBWZXJpZnkgdGhhdCB0aGUgc2VsZWN0aW9uIGRvZXMgbm90IHBhcnRpYWxseSBzZWxlY3QgYW55IGF0b21pY1xuLy8gbWFya2VkIHJhbmdlcy5cbmZ1bmN0aW9uIHJlQ2hlY2tTZWxlY3Rpb24oZG9jKSB7XG4gIHNldFNlbGVjdGlvbklubmVyKGRvYywgc2tpcEF0b21pY0luU2VsZWN0aW9uKGRvYywgZG9jLnNlbCwgbnVsbCwgZmFsc2UpKTtcbn1cblxuLy8gUmV0dXJuIGEgc2VsZWN0aW9uIHRoYXQgZG9lcyBub3QgcGFydGlhbGx5IHNlbGVjdCBhbnkgYXRvbWljXG4vLyByYW5nZXMuXG5mdW5jdGlvbiBza2lwQXRvbWljSW5TZWxlY3Rpb24oZG9jLCBzZWwsIGJpYXMsIG1heUNsZWFyKSB7XG4gIHZhciBvdXQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByYW5nZSA9IHNlbC5yYW5nZXNbaV07XG4gICAgdmFyIG9sZCA9IHNlbC5yYW5nZXMubGVuZ3RoID09IGRvYy5zZWwucmFuZ2VzLmxlbmd0aCAmJiBkb2Muc2VsLnJhbmdlc1tpXTtcbiAgICB2YXIgbmV3QW5jaG9yID0gc2tpcEF0b21pYyhkb2MsIHJhbmdlLmFuY2hvciwgb2xkICYmIG9sZC5hbmNob3IsIGJpYXMsIG1heUNsZWFyKTtcbiAgICB2YXIgbmV3SGVhZCA9IHNraXBBdG9taWMoZG9jLCByYW5nZS5oZWFkLCBvbGQgJiYgb2xkLmhlYWQsIGJpYXMsIG1heUNsZWFyKTtcbiAgICBpZiAob3V0IHx8IG5ld0FuY2hvciAhPSByYW5nZS5hbmNob3IgfHwgbmV3SGVhZCAhPSByYW5nZS5oZWFkKSB7XG4gICAgICBpZiAoIW91dCkgeyBvdXQgPSBzZWwucmFuZ2VzLnNsaWNlKDAsIGkpOyB9XG4gICAgICBvdXRbaV0gPSBuZXcgUmFuZ2UobmV3QW5jaG9yLCBuZXdIZWFkKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dCA/IG5vcm1hbGl6ZVNlbGVjdGlvbihvdXQsIHNlbC5wcmltSW5kZXgpIDogc2VsXG59XG5cbmZ1bmN0aW9uIHNraXBBdG9taWNJbm5lcihkb2MsIHBvcywgb2xkUG9zLCBkaXIsIG1heUNsZWFyKSB7XG4gIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIHBvcy5saW5lKTtcbiAgaWYgKGxpbmUubWFya2VkU3BhbnMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLm1hcmtlZFNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHNwID0gbGluZS5tYXJrZWRTcGFuc1tpXSwgbSA9IHNwLm1hcmtlcjtcbiAgICBpZiAoKHNwLmZyb20gPT0gbnVsbCB8fCAobS5pbmNsdXNpdmVMZWZ0ID8gc3AuZnJvbSA8PSBwb3MuY2ggOiBzcC5mcm9tIDwgcG9zLmNoKSkgJiZcbiAgICAgICAgKHNwLnRvID09IG51bGwgfHwgKG0uaW5jbHVzaXZlUmlnaHQgPyBzcC50byA+PSBwb3MuY2ggOiBzcC50byA+IHBvcy5jaCkpKSB7XG4gICAgICBpZiAobWF5Q2xlYXIpIHtcbiAgICAgICAgc2lnbmFsKG0sIFwiYmVmb3JlQ3Vyc29yRW50ZXJcIik7XG4gICAgICAgIGlmIChtLmV4cGxpY2l0bHlDbGVhcmVkKSB7XG4gICAgICAgICAgaWYgKCFsaW5lLm1hcmtlZFNwYW5zKSB7IGJyZWFrIH1cbiAgICAgICAgICBlbHNlIHstLWk7IGNvbnRpbnVlfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW0uYXRvbWljKSB7IGNvbnRpbnVlIH1cblxuICAgICAgaWYgKG9sZFBvcykge1xuICAgICAgICB2YXIgbmVhciA9IG0uZmluZChkaXIgPCAwID8gMSA6IC0xKSwgZGlmZiA9ICh2b2lkIDApO1xuICAgICAgICBpZiAoZGlyIDwgMCA/IG0uaW5jbHVzaXZlUmlnaHQgOiBtLmluY2x1c2l2ZUxlZnQpXG4gICAgICAgICAgeyBuZWFyID0gbW92ZVBvcyhkb2MsIG5lYXIsIC1kaXIsIG5lYXIgJiYgbmVhci5saW5lID09IHBvcy5saW5lID8gbGluZSA6IG51bGwpOyB9XG4gICAgICAgIGlmIChuZWFyICYmIG5lYXIubGluZSA9PSBwb3MubGluZSAmJiAoZGlmZiA9IGNtcChuZWFyLCBvbGRQb3MpKSAmJiAoZGlyIDwgMCA/IGRpZmYgPCAwIDogZGlmZiA+IDApKVxuICAgICAgICAgIHsgcmV0dXJuIHNraXBBdG9taWNJbm5lcihkb2MsIG5lYXIsIHBvcywgZGlyLCBtYXlDbGVhcikgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZmFyID0gbS5maW5kKGRpciA8IDAgPyAtMSA6IDEpO1xuICAgICAgaWYgKGRpciA8IDAgPyBtLmluY2x1c2l2ZUxlZnQgOiBtLmluY2x1c2l2ZVJpZ2h0KVxuICAgICAgICB7IGZhciA9IG1vdmVQb3MoZG9jLCBmYXIsIGRpciwgZmFyLmxpbmUgPT0gcG9zLmxpbmUgPyBsaW5lIDogbnVsbCk7IH1cbiAgICAgIHJldHVybiBmYXIgPyBza2lwQXRvbWljSW5uZXIoZG9jLCBmYXIsIHBvcywgZGlyLCBtYXlDbGVhcikgOiBudWxsXG4gICAgfVxuICB9IH1cbiAgcmV0dXJuIHBvc1xufVxuXG4vLyBFbnN1cmUgYSBnaXZlbiBwb3NpdGlvbiBpcyBub3QgaW5zaWRlIGFuIGF0b21pYyByYW5nZS5cbmZ1bmN0aW9uIHNraXBBdG9taWMoZG9jLCBwb3MsIG9sZFBvcywgYmlhcywgbWF5Q2xlYXIpIHtcbiAgdmFyIGRpciA9IGJpYXMgfHwgMTtcbiAgdmFyIGZvdW5kID0gc2tpcEF0b21pY0lubmVyKGRvYywgcG9zLCBvbGRQb3MsIGRpciwgbWF5Q2xlYXIpIHx8XG4gICAgICAoIW1heUNsZWFyICYmIHNraXBBdG9taWNJbm5lcihkb2MsIHBvcywgb2xkUG9zLCBkaXIsIHRydWUpKSB8fFxuICAgICAgc2tpcEF0b21pY0lubmVyKGRvYywgcG9zLCBvbGRQb3MsIC1kaXIsIG1heUNsZWFyKSB8fFxuICAgICAgKCFtYXlDbGVhciAmJiBza2lwQXRvbWljSW5uZXIoZG9jLCBwb3MsIG9sZFBvcywgLWRpciwgdHJ1ZSkpO1xuICBpZiAoIWZvdW5kKSB7XG4gICAgZG9jLmNhbnRFZGl0ID0gdHJ1ZTtcbiAgICByZXR1cm4gUG9zKGRvYy5maXJzdCwgMClcbiAgfVxuICByZXR1cm4gZm91bmRcbn1cblxuZnVuY3Rpb24gbW92ZVBvcyhkb2MsIHBvcywgZGlyLCBsaW5lKSB7XG4gIGlmIChkaXIgPCAwICYmIHBvcy5jaCA9PSAwKSB7XG4gICAgaWYgKHBvcy5saW5lID4gZG9jLmZpcnN0KSB7IHJldHVybiBjbGlwUG9zKGRvYywgUG9zKHBvcy5saW5lIC0gMSkpIH1cbiAgICBlbHNlIHsgcmV0dXJuIG51bGwgfVxuICB9IGVsc2UgaWYgKGRpciA+IDAgJiYgcG9zLmNoID09IChsaW5lIHx8IGdldExpbmUoZG9jLCBwb3MubGluZSkpLnRleHQubGVuZ3RoKSB7XG4gICAgaWYgKHBvcy5saW5lIDwgZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxKSB7IHJldHVybiBQb3MocG9zLmxpbmUgKyAxLCAwKSB9XG4gICAgZWxzZSB7IHJldHVybiBudWxsIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IFBvcyhwb3MubGluZSwgcG9zLmNoICsgZGlyKVxuICB9XG59XG5cbmZ1bmN0aW9uIHNlbGVjdEFsbChjbSkge1xuICBjbS5zZXRTZWxlY3Rpb24oUG9zKGNtLmZpcnN0TGluZSgpLCAwKSwgUG9zKGNtLmxhc3RMaW5lKCkpLCBzZWxfZG9udFNjcm9sbCk7XG59XG5cbi8vIFVQREFUSU5HXG5cbi8vIEFsbG93IFwiYmVmb3JlQ2hhbmdlXCIgZXZlbnQgaGFuZGxlcnMgdG8gaW5mbHVlbmNlIGEgY2hhbmdlXG5mdW5jdGlvbiBmaWx0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UsIHVwZGF0ZSkge1xuICB2YXIgb2JqID0ge1xuICAgIGNhbmNlbGVkOiBmYWxzZSxcbiAgICBmcm9tOiBjaGFuZ2UuZnJvbSxcbiAgICB0bzogY2hhbmdlLnRvLFxuICAgIHRleHQ6IGNoYW5nZS50ZXh0LFxuICAgIG9yaWdpbjogY2hhbmdlLm9yaWdpbixcbiAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9iai5jYW5jZWxlZCA9IHRydWU7IH1cbiAgfTtcbiAgaWYgKHVwZGF0ZSkgeyBvYmoudXBkYXRlID0gZnVuY3Rpb24gKGZyb20sIHRvLCB0ZXh0LCBvcmlnaW4pIHtcbiAgICBpZiAoZnJvbSkgeyBvYmouZnJvbSA9IGNsaXBQb3MoZG9jLCBmcm9tKTsgfVxuICAgIGlmICh0bykgeyBvYmoudG8gPSBjbGlwUG9zKGRvYywgdG8pOyB9XG4gICAgaWYgKHRleHQpIHsgb2JqLnRleHQgPSB0ZXh0OyB9XG4gICAgaWYgKG9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7IG9iai5vcmlnaW4gPSBvcmlnaW47IH1cbiAgfTsgfVxuICBzaWduYWwoZG9jLCBcImJlZm9yZUNoYW5nZVwiLCBkb2MsIG9iaik7XG4gIGlmIChkb2MuY20pIHsgc2lnbmFsKGRvYy5jbSwgXCJiZWZvcmVDaGFuZ2VcIiwgZG9jLmNtLCBvYmopOyB9XG5cbiAgaWYgKG9iai5jYW5jZWxlZCkgeyByZXR1cm4gbnVsbCB9XG4gIHJldHVybiB7ZnJvbTogb2JqLmZyb20sIHRvOiBvYmoudG8sIHRleHQ6IG9iai50ZXh0LCBvcmlnaW46IG9iai5vcmlnaW59XG59XG5cbi8vIEFwcGx5IGEgY2hhbmdlIHRvIGEgZG9jdW1lbnQsIGFuZCBhZGQgaXQgdG8gdGhlIGRvY3VtZW50J3Ncbi8vIGhpc3RvcnksIGFuZCBwcm9wYWdhdGluZyBpdCB0byBhbGwgbGlua2VkIGRvY3VtZW50cy5cbmZ1bmN0aW9uIG1ha2VDaGFuZ2UoZG9jLCBjaGFuZ2UsIGlnbm9yZVJlYWRPbmx5KSB7XG4gIGlmIChkb2MuY20pIHtcbiAgICBpZiAoIWRvYy5jbS5jdXJPcCkgeyByZXR1cm4gb3BlcmF0aW9uKGRvYy5jbSwgbWFrZUNoYW5nZSkoZG9jLCBjaGFuZ2UsIGlnbm9yZVJlYWRPbmx5KSB9XG4gICAgaWYgKGRvYy5jbS5zdGF0ZS5zdXBwcmVzc0VkaXRzKSB7IHJldHVybiB9XG4gIH1cblxuICBpZiAoaGFzSGFuZGxlcihkb2MsIFwiYmVmb3JlQ2hhbmdlXCIpIHx8IGRvYy5jbSAmJiBoYXNIYW5kbGVyKGRvYy5jbSwgXCJiZWZvcmVDaGFuZ2VcIikpIHtcbiAgICBjaGFuZ2UgPSBmaWx0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UsIHRydWUpO1xuICAgIGlmICghY2hhbmdlKSB7IHJldHVybiB9XG4gIH1cblxuICAvLyBQb3NzaWJseSBzcGxpdCBvciBzdXBwcmVzcyB0aGUgdXBkYXRlIGJhc2VkIG9uIHRoZSBwcmVzZW5jZVxuICAvLyBvZiByZWFkLW9ubHkgc3BhbnMgaW4gaXRzIHJhbmdlLlxuICB2YXIgc3BsaXQgPSBzYXdSZWFkT25seVNwYW5zICYmICFpZ25vcmVSZWFkT25seSAmJiByZW1vdmVSZWFkT25seVJhbmdlcyhkb2MsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pO1xuICBpZiAoc3BsaXQpIHtcbiAgICBmb3IgKHZhciBpID0gc3BsaXQubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpXG4gICAgICB7IG1ha2VDaGFuZ2VJbm5lcihkb2MsIHtmcm9tOiBzcGxpdFtpXS5mcm9tLCB0bzogc3BsaXRbaV0udG8sIHRleHQ6IGkgPyBbXCJcIl0gOiBjaGFuZ2UudGV4dCwgb3JpZ2luOiBjaGFuZ2Uub3JpZ2lufSk7IH1cbiAgfSBlbHNlIHtcbiAgICBtYWtlQ2hhbmdlSW5uZXIoZG9jLCBjaGFuZ2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VDaGFuZ2VJbm5lcihkb2MsIGNoYW5nZSkge1xuICBpZiAoY2hhbmdlLnRleHQubGVuZ3RoID09IDEgJiYgY2hhbmdlLnRleHRbMF0gPT0gXCJcIiAmJiBjbXAoY2hhbmdlLmZyb20sIGNoYW5nZS50bykgPT0gMCkgeyByZXR1cm4gfVxuICB2YXIgc2VsQWZ0ZXIgPSBjb21wdXRlU2VsQWZ0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpO1xuICBhZGRDaGFuZ2VUb0hpc3RvcnkoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBkb2MuY20gPyBkb2MuY20uY3VyT3AuaWQgOiBOYU4pO1xuXG4gIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYywgY2hhbmdlKSk7XG4gIHZhciByZWJhc2VkID0gW107XG5cbiAgbGlua2VkRG9jcyhkb2MsIGZ1bmN0aW9uIChkb2MsIHNoYXJlZEhpc3QpIHtcbiAgICBpZiAoIXNoYXJlZEhpc3QgJiYgaW5kZXhPZihyZWJhc2VkLCBkb2MuaGlzdG9yeSkgPT0gLTEpIHtcbiAgICAgIHJlYmFzZUhpc3QoZG9jLmhpc3RvcnksIGNoYW5nZSk7XG4gICAgICByZWJhc2VkLnB1c2goZG9jLmhpc3RvcnkpO1xuICAgIH1cbiAgICBtYWtlQ2hhbmdlU2luZ2xlRG9jKGRvYywgY2hhbmdlLCBudWxsLCBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYywgY2hhbmdlKSk7XG4gIH0pO1xufVxuXG4vLyBSZXZlcnQgYSBjaGFuZ2Ugc3RvcmVkIGluIGEgZG9jdW1lbnQncyBoaXN0b3J5LlxuZnVuY3Rpb24gbWFrZUNoYW5nZUZyb21IaXN0b3J5KGRvYywgdHlwZSwgYWxsb3dTZWxlY3Rpb25Pbmx5KSB7XG4gIHZhciBzdXBwcmVzcyA9IGRvYy5jbSAmJiBkb2MuY20uc3RhdGUuc3VwcHJlc3NFZGl0cztcbiAgaWYgKHN1cHByZXNzICYmICFhbGxvd1NlbGVjdGlvbk9ubHkpIHsgcmV0dXJuIH1cblxuICB2YXIgaGlzdCA9IGRvYy5oaXN0b3J5LCBldmVudCwgc2VsQWZ0ZXIgPSBkb2Muc2VsO1xuICB2YXIgc291cmNlID0gdHlwZSA9PSBcInVuZG9cIiA/IGhpc3QuZG9uZSA6IGhpc3QudW5kb25lLCBkZXN0ID0gdHlwZSA9PSBcInVuZG9cIiA/IGhpc3QudW5kb25lIDogaGlzdC5kb25lO1xuXG4gIC8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgdXNlYWJsZSBldmVudCAoc28gdGhhdCBjdHJsLXogd29uJ3RcbiAgLy8gbmVlZGxlc3NseSBjbGVhciBzZWxlY3Rpb24gZXZlbnRzKVxuICB2YXIgaSA9IDA7XG4gIGZvciAoOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgZXZlbnQgPSBzb3VyY2VbaV07XG4gICAgaWYgKGFsbG93U2VsZWN0aW9uT25seSA/IGV2ZW50LnJhbmdlcyAmJiAhZXZlbnQuZXF1YWxzKGRvYy5zZWwpIDogIWV2ZW50LnJhbmdlcylcbiAgICAgIHsgYnJlYWsgfVxuICB9XG4gIGlmIChpID09IHNvdXJjZS5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgaGlzdC5sYXN0T3JpZ2luID0gaGlzdC5sYXN0U2VsT3JpZ2luID0gbnVsbDtcblxuICBmb3IgKDs7KSB7XG4gICAgZXZlbnQgPSBzb3VyY2UucG9wKCk7XG4gICAgaWYgKGV2ZW50LnJhbmdlcykge1xuICAgICAgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShldmVudCwgZGVzdCk7XG4gICAgICBpZiAoYWxsb3dTZWxlY3Rpb25Pbmx5ICYmICFldmVudC5lcXVhbHMoZG9jLnNlbCkpIHtcbiAgICAgICAgc2V0U2VsZWN0aW9uKGRvYywgZXZlbnQsIHtjbGVhclJlZG86IGZhbHNlfSk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc2VsQWZ0ZXIgPSBldmVudDtcbiAgICB9IGVsc2UgaWYgKHN1cHByZXNzKSB7XG4gICAgICBzb3VyY2UucHVzaChldmVudCk7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgeyBicmVhayB9XG4gIH1cblxuICAvLyBCdWlsZCB1cCBhIHJldmVyc2UgY2hhbmdlIG9iamVjdCB0byBhZGQgdG8gdGhlIG9wcG9zaXRlIGhpc3RvcnlcbiAgLy8gc3RhY2sgKHJlZG8gd2hlbiB1bmRvaW5nLCBhbmQgdmljZSB2ZXJzYSkuXG4gIHZhciBhbnRpQ2hhbmdlcyA9IFtdO1xuICBwdXNoU2VsZWN0aW9uVG9IaXN0b3J5KHNlbEFmdGVyLCBkZXN0KTtcbiAgZGVzdC5wdXNoKHtjaGFuZ2VzOiBhbnRpQ2hhbmdlcywgZ2VuZXJhdGlvbjogaGlzdC5nZW5lcmF0aW9ufSk7XG4gIGhpc3QuZ2VuZXJhdGlvbiA9IGV2ZW50LmdlbmVyYXRpb24gfHwgKytoaXN0Lm1heEdlbmVyYXRpb247XG5cbiAgdmFyIGZpbHRlciA9IGhhc0hhbmRsZXIoZG9jLCBcImJlZm9yZUNoYW5nZVwiKSB8fCBkb2MuY20gJiYgaGFzSGFuZGxlcihkb2MuY20sIFwiYmVmb3JlQ2hhbmdlXCIpO1xuXG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCBpICkge1xuICAgIHZhciBjaGFuZ2UgPSBldmVudC5jaGFuZ2VzW2ldO1xuICAgIGNoYW5nZS5vcmlnaW4gPSB0eXBlO1xuICAgIGlmIChmaWx0ZXIgJiYgIWZpbHRlckNoYW5nZShkb2MsIGNoYW5nZSwgZmFsc2UpKSB7XG4gICAgICBzb3VyY2UubGVuZ3RoID0gMDtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIGFudGlDaGFuZ2VzLnB1c2goaGlzdG9yeUNoYW5nZUZyb21DaGFuZ2UoZG9jLCBjaGFuZ2UpKTtcblxuICAgIHZhciBhZnRlciA9IGkgPyBjb21wdXRlU2VsQWZ0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpIDogbHN0KHNvdXJjZSk7XG4gICAgbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsIGNoYW5nZSwgYWZ0ZXIsIG1lcmdlT2xkU3BhbnMoZG9jLCBjaGFuZ2UpKTtcbiAgICBpZiAoIWkgJiYgZG9jLmNtKSB7IGRvYy5jbS5zY3JvbGxJbnRvVmlldyh7ZnJvbTogY2hhbmdlLmZyb20sIHRvOiBjaGFuZ2VFbmQoY2hhbmdlKX0pOyB9XG4gICAgdmFyIHJlYmFzZWQgPSBbXTtcblxuICAgIC8vIFByb3BhZ2F0ZSB0byB0aGUgbGlua2VkIGRvY3VtZW50c1xuICAgIGxpbmtlZERvY3MoZG9jLCBmdW5jdGlvbiAoZG9jLCBzaGFyZWRIaXN0KSB7XG4gICAgICBpZiAoIXNoYXJlZEhpc3QgJiYgaW5kZXhPZihyZWJhc2VkLCBkb2MuaGlzdG9yeSkgPT0gLTEpIHtcbiAgICAgICAgcmViYXNlSGlzdChkb2MuaGlzdG9yeSwgY2hhbmdlKTtcbiAgICAgICAgcmViYXNlZC5wdXNoKGRvYy5oaXN0b3J5KTtcbiAgICAgIH1cbiAgICAgIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIG51bGwsIG1lcmdlT2xkU3BhbnMoZG9jLCBjaGFuZ2UpKTtcbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBpJDEgPSBldmVudC5jaGFuZ2VzLmxlbmd0aCAtIDE7IGkkMSA+PSAwOyAtLWkkMSkge1xuICAgIHZhciByZXR1cm5lZCA9IGxvb3AoIGkkMSApO1xuXG4gICAgaWYgKCByZXR1cm5lZCApIHJldHVybiByZXR1cm5lZC52O1xuICB9XG59XG5cbi8vIFN1Yi12aWV3cyBuZWVkIHRoZWlyIGxpbmUgbnVtYmVycyBzaGlmdGVkIHdoZW4gdGV4dCBpcyBhZGRlZFxuLy8gYWJvdmUgb3IgYmVsb3cgdGhlbSBpbiB0aGUgcGFyZW50IGRvY3VtZW50LlxuZnVuY3Rpb24gc2hpZnREb2MoZG9jLCBkaXN0YW5jZSkge1xuICBpZiAoZGlzdGFuY2UgPT0gMCkgeyByZXR1cm4gfVxuICBkb2MuZmlyc3QgKz0gZGlzdGFuY2U7XG4gIGRvYy5zZWwgPSBuZXcgU2VsZWN0aW9uKG1hcChkb2Muc2VsLnJhbmdlcywgZnVuY3Rpb24gKHJhbmdlKSB7IHJldHVybiBuZXcgUmFuZ2UoXG4gICAgUG9zKHJhbmdlLmFuY2hvci5saW5lICsgZGlzdGFuY2UsIHJhbmdlLmFuY2hvci5jaCksXG4gICAgUG9zKHJhbmdlLmhlYWQubGluZSArIGRpc3RhbmNlLCByYW5nZS5oZWFkLmNoKVxuICApOyB9KSwgZG9jLnNlbC5wcmltSW5kZXgpO1xuICBpZiAoZG9jLmNtKSB7XG4gICAgcmVnQ2hhbmdlKGRvYy5jbSwgZG9jLmZpcnN0LCBkb2MuZmlyc3QgLSBkaXN0YW5jZSwgZGlzdGFuY2UpO1xuICAgIGZvciAodmFyIGQgPSBkb2MuY20uZGlzcGxheSwgbCA9IGQudmlld0Zyb207IGwgPCBkLnZpZXdUbzsgbCsrKVxuICAgICAgeyByZWdMaW5lQ2hhbmdlKGRvYy5jbSwgbCwgXCJndXR0ZXJcIik7IH1cbiAgfVxufVxuXG4vLyBNb3JlIGxvd2VyLWxldmVsIGNoYW5nZSBmdW5jdGlvbiwgaGFuZGxpbmcgb25seSBhIHNpbmdsZSBkb2N1bWVudFxuLy8gKG5vdCBsaW5rZWQgb25lcykuXG5mdW5jdGlvbiBtYWtlQ2hhbmdlU2luZ2xlRG9jKGRvYywgY2hhbmdlLCBzZWxBZnRlciwgc3BhbnMpIHtcbiAgaWYgKGRvYy5jbSAmJiAhZG9jLmNtLmN1ck9wKVxuICAgIHsgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1ha2VDaGFuZ2VTaW5nbGVEb2MpKGRvYywgY2hhbmdlLCBzZWxBZnRlciwgc3BhbnMpIH1cblxuICBpZiAoY2hhbmdlLnRvLmxpbmUgPCBkb2MuZmlyc3QpIHtcbiAgICBzaGlmdERvYyhkb2MsIGNoYW5nZS50ZXh0Lmxlbmd0aCAtIDEgLSAoY2hhbmdlLnRvLmxpbmUgLSBjaGFuZ2UuZnJvbS5saW5lKSk7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGNoYW5nZS5mcm9tLmxpbmUgPiBkb2MubGFzdExpbmUoKSkgeyByZXR1cm4gfVxuXG4gIC8vIENsaXAgdGhlIGNoYW5nZSB0byB0aGUgc2l6ZSBvZiB0aGlzIGRvY1xuICBpZiAoY2hhbmdlLmZyb20ubGluZSA8IGRvYy5maXJzdCkge1xuICAgIHZhciBzaGlmdCA9IGNoYW5nZS50ZXh0Lmxlbmd0aCAtIDEgLSAoZG9jLmZpcnN0IC0gY2hhbmdlLmZyb20ubGluZSk7XG4gICAgc2hpZnREb2MoZG9jLCBzaGlmdCk7XG4gICAgY2hhbmdlID0ge2Zyb206IFBvcyhkb2MuZmlyc3QsIDApLCB0bzogUG9zKGNoYW5nZS50by5saW5lICsgc2hpZnQsIGNoYW5nZS50by5jaCksXG4gICAgICAgICAgICAgIHRleHQ6IFtsc3QoY2hhbmdlLnRleHQpXSwgb3JpZ2luOiBjaGFuZ2Uub3JpZ2lufTtcbiAgfVxuICB2YXIgbGFzdCA9IGRvYy5sYXN0TGluZSgpO1xuICBpZiAoY2hhbmdlLnRvLmxpbmUgPiBsYXN0KSB7XG4gICAgY2hhbmdlID0ge2Zyb206IGNoYW5nZS5mcm9tLCB0bzogUG9zKGxhc3QsIGdldExpbmUoZG9jLCBsYXN0KS50ZXh0Lmxlbmd0aCksXG4gICAgICAgICAgICAgIHRleHQ6IFtjaGFuZ2UudGV4dFswXV0sIG9yaWdpbjogY2hhbmdlLm9yaWdpbn07XG4gIH1cblxuICBjaGFuZ2UucmVtb3ZlZCA9IGdldEJldHdlZW4oZG9jLCBjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKTtcblxuICBpZiAoIXNlbEFmdGVyKSB7IHNlbEFmdGVyID0gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKTsgfVxuICBpZiAoZG9jLmNtKSB7IG1ha2VDaGFuZ2VTaW5nbGVEb2NJbkVkaXRvcihkb2MuY20sIGNoYW5nZSwgc3BhbnMpOyB9XG4gIGVsc2UgeyB1cGRhdGVEb2MoZG9jLCBjaGFuZ2UsIHNwYW5zKTsgfVxuICBzZXRTZWxlY3Rpb25Ob1VuZG8oZG9jLCBzZWxBZnRlciwgc2VsX2RvbnRTY3JvbGwpO1xufVxuXG4vLyBIYW5kbGUgdGhlIGludGVyYWN0aW9uIG9mIGEgY2hhbmdlIHRvIGEgZG9jdW1lbnQgd2l0aCB0aGUgZWRpdG9yXG4vLyB0aGF0IHRoaXMgZG9jdW1lbnQgaXMgcGFydCBvZi5cbmZ1bmN0aW9uIG1ha2VDaGFuZ2VTaW5nbGVEb2NJbkVkaXRvcihjbSwgY2hhbmdlLCBzcGFucykge1xuICB2YXIgZG9jID0gY20uZG9jLCBkaXNwbGF5ID0gY20uZGlzcGxheSwgZnJvbSA9IGNoYW5nZS5mcm9tLCB0byA9IGNoYW5nZS50bztcblxuICB2YXIgcmVjb21wdXRlTWF4TGVuZ3RoID0gZmFsc2UsIGNoZWNrV2lkdGhTdGFydCA9IGZyb20ubGluZTtcbiAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykge1xuICAgIGNoZWNrV2lkdGhTdGFydCA9IGxpbmVObyh2aXN1YWxMaW5lKGdldExpbmUoZG9jLCBmcm9tLmxpbmUpKSk7XG4gICAgZG9jLml0ZXIoY2hlY2tXaWR0aFN0YXJ0LCB0by5saW5lICsgMSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChsaW5lID09IGRpc3BsYXkubWF4TGluZSkge1xuICAgICAgICByZWNvbXB1dGVNYXhMZW5ndGggPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRvYy5zZWwuY29udGFpbnMoY2hhbmdlLmZyb20sIGNoYW5nZS50bykgPiAtMSlcbiAgICB7IHNpZ25hbEN1cnNvckFjdGl2aXR5KGNtKTsgfVxuXG4gIHVwZGF0ZURvYyhkb2MsIGNoYW5nZSwgc3BhbnMsIGVzdGltYXRlSGVpZ2h0KGNtKSk7XG5cbiAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykge1xuICAgIGRvYy5pdGVyKGNoZWNrV2lkdGhTdGFydCwgZnJvbS5saW5lICsgY2hhbmdlLnRleHQubGVuZ3RoLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgdmFyIGxlbiA9IGxpbmVMZW5ndGgobGluZSk7XG4gICAgICBpZiAobGVuID4gZGlzcGxheS5tYXhMaW5lTGVuZ3RoKSB7XG4gICAgICAgIGRpc3BsYXkubWF4TGluZSA9IGxpbmU7XG4gICAgICAgIGRpc3BsYXkubWF4TGluZUxlbmd0aCA9IGxlbjtcbiAgICAgICAgZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHJlY29tcHV0ZU1heExlbmd0aCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChyZWNvbXB1dGVNYXhMZW5ndGgpIHsgY20uY3VyT3AudXBkYXRlTWF4TGluZSA9IHRydWU7IH1cbiAgfVxuXG4gIHJldHJlYXRGcm9udGllcihkb2MsIGZyb20ubGluZSk7XG4gIHN0YXJ0V29ya2VyKGNtLCA0MDApO1xuXG4gIHZhciBsZW5kaWZmID0gY2hhbmdlLnRleHQubGVuZ3RoIC0gKHRvLmxpbmUgLSBmcm9tLmxpbmUpIC0gMTtcbiAgLy8gUmVtZW1iZXIgdGhhdCB0aGVzZSBsaW5lcyBjaGFuZ2VkLCBmb3IgdXBkYXRpbmcgdGhlIGRpc3BsYXlcbiAgaWYgKGNoYW5nZS5mdWxsKVxuICAgIHsgcmVnQ2hhbmdlKGNtKTsgfVxuICBlbHNlIGlmIChmcm9tLmxpbmUgPT0gdG8ubGluZSAmJiBjaGFuZ2UudGV4dC5sZW5ndGggPT0gMSAmJiAhaXNXaG9sZUxpbmVVcGRhdGUoY20uZG9jLCBjaGFuZ2UpKVxuICAgIHsgcmVnTGluZUNoYW5nZShjbSwgZnJvbS5saW5lLCBcInRleHRcIik7IH1cbiAgZWxzZVxuICAgIHsgcmVnQ2hhbmdlKGNtLCBmcm9tLmxpbmUsIHRvLmxpbmUgKyAxLCBsZW5kaWZmKTsgfVxuXG4gIHZhciBjaGFuZ2VzSGFuZGxlciA9IGhhc0hhbmRsZXIoY20sIFwiY2hhbmdlc1wiKSwgY2hhbmdlSGFuZGxlciA9IGhhc0hhbmRsZXIoY20sIFwiY2hhbmdlXCIpO1xuICBpZiAoY2hhbmdlSGFuZGxlciB8fCBjaGFuZ2VzSGFuZGxlcikge1xuICAgIHZhciBvYmogPSB7XG4gICAgICBmcm9tOiBmcm9tLCB0bzogdG8sXG4gICAgICB0ZXh0OiBjaGFuZ2UudGV4dCxcbiAgICAgIHJlbW92ZWQ6IGNoYW5nZS5yZW1vdmVkLFxuICAgICAgb3JpZ2luOiBjaGFuZ2Uub3JpZ2luXG4gICAgfTtcbiAgICBpZiAoY2hhbmdlSGFuZGxlcikgeyBzaWduYWxMYXRlcihjbSwgXCJjaGFuZ2VcIiwgY20sIG9iaik7IH1cbiAgICBpZiAoY2hhbmdlc0hhbmRsZXIpIHsgKGNtLmN1ck9wLmNoYW5nZU9ianMgfHwgKGNtLmN1ck9wLmNoYW5nZU9ianMgPSBbXSkpLnB1c2gob2JqKTsgfVxuICB9XG4gIGNtLmRpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnUgPSBudWxsO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlUmFuZ2UoZG9jLCBjb2RlLCBmcm9tLCB0bywgb3JpZ2luKSB7XG4gIGlmICghdG8pIHsgdG8gPSBmcm9tOyB9XG4gIGlmIChjbXAodG8sIGZyb20pIDwgMCkgeyB2YXIgYXNzaWduO1xuICAgIChhc3NpZ24gPSBbdG8sIGZyb21dLCBmcm9tID0gYXNzaWduWzBdLCB0byA9IGFzc2lnblsxXSk7IH1cbiAgaWYgKHR5cGVvZiBjb2RlID09IFwic3RyaW5nXCIpIHsgY29kZSA9IGRvYy5zcGxpdExpbmVzKGNvZGUpOyB9XG4gIG1ha2VDaGFuZ2UoZG9jLCB7ZnJvbTogZnJvbSwgdG86IHRvLCB0ZXh0OiBjb2RlLCBvcmlnaW46IG9yaWdpbn0pO1xufVxuXG4vLyBSZWJhc2luZy9yZXNldHRpbmcgaGlzdG9yeSB0byBkZWFsIHdpdGggZXh0ZXJuYWxseS1zb3VyY2VkIGNoYW5nZXNcblxuZnVuY3Rpb24gcmViYXNlSGlzdFNlbFNpbmdsZShwb3MsIGZyb20sIHRvLCBkaWZmKSB7XG4gIGlmICh0byA8IHBvcy5saW5lKSB7XG4gICAgcG9zLmxpbmUgKz0gZGlmZjtcbiAgfSBlbHNlIGlmIChmcm9tIDwgcG9zLmxpbmUpIHtcbiAgICBwb3MubGluZSA9IGZyb207XG4gICAgcG9zLmNoID0gMDtcbiAgfVxufVxuXG4vLyBUcmllcyB0byByZWJhc2UgYW4gYXJyYXkgb2YgaGlzdG9yeSBldmVudHMgZ2l2ZW4gYSBjaGFuZ2UgaW4gdGhlXG4vLyBkb2N1bWVudC4gSWYgdGhlIGNoYW5nZSB0b3VjaGVzIHRoZSBzYW1lIGxpbmVzIGFzIHRoZSBldmVudCwgdGhlXG4vLyBldmVudCwgYW5kIGV2ZXJ5dGhpbmcgJ2JlaGluZCcgaXQsIGlzIGRpc2NhcmRlZC4gSWYgdGhlIGNoYW5nZSBpc1xuLy8gYmVmb3JlIHRoZSBldmVudCwgdGhlIGV2ZW50J3MgcG9zaXRpb25zIGFyZSB1cGRhdGVkLiBVc2VzIGFcbi8vIGNvcHktb24td3JpdGUgc2NoZW1lIGZvciB0aGUgcG9zaXRpb25zLCB0byBhdm9pZCBoYXZpbmcgdG9cbi8vIHJlYWxsb2NhdGUgdGhlbSBhbGwgb24gZXZlcnkgcmViYXNlLCBidXQgYWxzbyBhdm9pZCBwcm9ibGVtcyB3aXRoXG4vLyBzaGFyZWQgcG9zaXRpb24gb2JqZWN0cyBiZWluZyB1bnNhZmVseSB1cGRhdGVkLlxuZnVuY3Rpb24gcmViYXNlSGlzdEFycmF5KGFycmF5LCBmcm9tLCB0bywgZGlmZikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHN1YiA9IGFycmF5W2ldLCBvayA9IHRydWU7XG4gICAgaWYgKHN1Yi5yYW5nZXMpIHtcbiAgICAgIGlmICghc3ViLmNvcGllZCkgeyBzdWIgPSBhcnJheVtpXSA9IHN1Yi5kZWVwQ29weSgpOyBzdWIuY29waWVkID0gdHJ1ZTsgfVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdWIucmFuZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHJlYmFzZUhpc3RTZWxTaW5nbGUoc3ViLnJhbmdlc1tqXS5hbmNob3IsIGZyb20sIHRvLCBkaWZmKTtcbiAgICAgICAgcmViYXNlSGlzdFNlbFNpbmdsZShzdWIucmFuZ2VzW2pdLmhlYWQsIGZyb20sIHRvLCBkaWZmKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGZvciAodmFyIGokMSA9IDA7IGokMSA8IHN1Yi5jaGFuZ2VzLmxlbmd0aDsgKytqJDEpIHtcbiAgICAgIHZhciBjdXIgPSBzdWIuY2hhbmdlc1tqJDFdO1xuICAgICAgaWYgKHRvIDwgY3VyLmZyb20ubGluZSkge1xuICAgICAgICBjdXIuZnJvbSA9IFBvcyhjdXIuZnJvbS5saW5lICsgZGlmZiwgY3VyLmZyb20uY2gpO1xuICAgICAgICBjdXIudG8gPSBQb3MoY3VyLnRvLmxpbmUgKyBkaWZmLCBjdXIudG8uY2gpO1xuICAgICAgfSBlbHNlIGlmIChmcm9tIDw9IGN1ci50by5saW5lKSB7XG4gICAgICAgIG9rID0gZmFsc2U7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghb2spIHtcbiAgICAgIGFycmF5LnNwbGljZSgwLCBpICsgMSk7XG4gICAgICBpID0gMDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmViYXNlSGlzdChoaXN0LCBjaGFuZ2UpIHtcbiAgdmFyIGZyb20gPSBjaGFuZ2UuZnJvbS5saW5lLCB0byA9IGNoYW5nZS50by5saW5lLCBkaWZmID0gY2hhbmdlLnRleHQubGVuZ3RoIC0gKHRvIC0gZnJvbSkgLSAxO1xuICByZWJhc2VIaXN0QXJyYXkoaGlzdC5kb25lLCBmcm9tLCB0bywgZGlmZik7XG4gIHJlYmFzZUhpc3RBcnJheShoaXN0LnVuZG9uZSwgZnJvbSwgdG8sIGRpZmYpO1xufVxuXG4vLyBVdGlsaXR5IGZvciBhcHBseWluZyBhIGNoYW5nZSB0byBhIGxpbmUgYnkgaGFuZGxlIG9yIG51bWJlcixcbi8vIHJldHVybmluZyB0aGUgbnVtYmVyIGFuZCBvcHRpb25hbGx5IHJlZ2lzdGVyaW5nIHRoZSBsaW5lIGFzXG4vLyBjaGFuZ2VkLlxuZnVuY3Rpb24gY2hhbmdlTGluZShkb2MsIGhhbmRsZSwgY2hhbmdlVHlwZSwgb3ApIHtcbiAgdmFyIG5vID0gaGFuZGxlLCBsaW5lID0gaGFuZGxlO1xuICBpZiAodHlwZW9mIGhhbmRsZSA9PSBcIm51bWJlclwiKSB7IGxpbmUgPSBnZXRMaW5lKGRvYywgY2xpcExpbmUoZG9jLCBoYW5kbGUpKTsgfVxuICBlbHNlIHsgbm8gPSBsaW5lTm8oaGFuZGxlKTsgfVxuICBpZiAobm8gPT0gbnVsbCkgeyByZXR1cm4gbnVsbCB9XG4gIGlmIChvcChsaW5lLCBubykgJiYgZG9jLmNtKSB7IHJlZ0xpbmVDaGFuZ2UoZG9jLmNtLCBubywgY2hhbmdlVHlwZSk7IH1cbiAgcmV0dXJuIGxpbmVcbn1cblxuLy8gVGhlIGRvY3VtZW50IGlzIHJlcHJlc2VudGVkIGFzIGEgQlRyZWUgY29uc2lzdGluZyBvZiBsZWF2ZXMsIHdpdGhcbi8vIGNodW5rIG9mIGxpbmVzIGluIHRoZW0sIGFuZCBicmFuY2hlcywgd2l0aCB1cCB0byB0ZW4gbGVhdmVzIG9yXG4vLyBvdGhlciBicmFuY2ggbm9kZXMgYmVsb3cgdGhlbS4gVGhlIHRvcCBub2RlIGlzIGFsd2F5cyBhIGJyYW5jaFxuLy8gbm9kZSwgYW5kIGlzIHRoZSBkb2N1bWVudCBvYmplY3QgaXRzZWxmIChtZWFuaW5nIGl0IGhhc1xuLy8gYWRkaXRpb25hbCBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzKS5cbi8vXG4vLyBBbGwgbm9kZXMgaGF2ZSBwYXJlbnQgbGlua3MuIFRoZSB0cmVlIGlzIHVzZWQgYm90aCB0byBnbyBmcm9tXG4vLyBsaW5lIG51bWJlcnMgdG8gbGluZSBvYmplY3RzLCBhbmQgdG8gZ28gZnJvbSBvYmplY3RzIHRvIG51bWJlcnMuXG4vLyBJdCBhbHNvIGluZGV4ZXMgYnkgaGVpZ2h0LCBhbmQgaXMgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gaGVpZ2h0XG4vLyBhbmQgbGluZSBvYmplY3QsIGFuZCB0byBmaW5kIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhlIGRvY3VtZW50LlxuLy9cbi8vIFNlZSBhbHNvIGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvYmxvZy9jb2RlbWlycm9yLWxpbmUtdHJlZS5odG1sXG5cbmZ1bmN0aW9uIExlYWZDaHVuayhsaW5lcykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB0aGlzLmxpbmVzID0gbGluZXM7XG4gIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgdmFyIGhlaWdodCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICBsaW5lc1tpXS5wYXJlbnQgPSB0aGlzJDE7XG4gICAgaGVpZ2h0ICs9IGxpbmVzW2ldLmhlaWdodDtcbiAgfVxuICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbn1cblxuTGVhZkNodW5rLnByb3RvdHlwZSA9IHtcbiAgY2h1bmtTaXplOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubGluZXMubGVuZ3RoIH0sXG5cbiAgLy8gUmVtb3ZlIHRoZSBuIGxpbmVzIGF0IG9mZnNldCAnYXQnLlxuICByZW1vdmVJbm5lcjogZnVuY3Rpb24oYXQsIG4pIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGZvciAodmFyIGkgPSBhdCwgZSA9IGF0ICsgbjsgaSA8IGU7ICsraSkge1xuICAgICAgdmFyIGxpbmUgPSB0aGlzJDEubGluZXNbaV07XG4gICAgICB0aGlzJDEuaGVpZ2h0IC09IGxpbmUuaGVpZ2h0O1xuICAgICAgY2xlYW5VcExpbmUobGluZSk7XG4gICAgICBzaWduYWxMYXRlcihsaW5lLCBcImRlbGV0ZVwiKTtcbiAgICB9XG4gICAgdGhpcy5saW5lcy5zcGxpY2UoYXQsIG4pO1xuICB9LFxuXG4gIC8vIEhlbHBlciB1c2VkIHRvIGNvbGxhcHNlIGEgc21hbGwgYnJhbmNoIGludG8gYSBzaW5nbGUgbGVhZi5cbiAgY29sbGFwc2U6IGZ1bmN0aW9uKGxpbmVzKSB7XG4gICAgbGluZXMucHVzaC5hcHBseShsaW5lcywgdGhpcy5saW5lcyk7XG4gIH0sXG5cbiAgLy8gSW5zZXJ0IHRoZSBnaXZlbiBhcnJheSBvZiBsaW5lcyBhdCBvZmZzZXQgJ2F0JywgY291bnQgdGhlbSBhc1xuICAvLyBoYXZpbmcgdGhlIGdpdmVuIGhlaWdodC5cbiAgaW5zZXJ0SW5uZXI6IGZ1bmN0aW9uKGF0LCBsaW5lcywgaGVpZ2h0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB0aGlzLmhlaWdodCArPSBoZWlnaHQ7XG4gICAgdGhpcy5saW5lcyA9IHRoaXMubGluZXMuc2xpY2UoMCwgYXQpLmNvbmNhdChsaW5lcykuY29uY2F0KHRoaXMubGluZXMuc2xpY2UoYXQpKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7IGxpbmVzW2ldLnBhcmVudCA9IHRoaXMkMTsgfVxuICB9LFxuXG4gIC8vIFVzZWQgdG8gaXRlcmF0ZSBvdmVyIGEgcGFydCBvZiB0aGUgdHJlZS5cbiAgaXRlck46IGZ1bmN0aW9uKGF0LCBuLCBvcCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgZSA9IGF0ICsgbjsgYXQgPCBlOyArK2F0KVxuICAgICAgeyBpZiAob3AodGhpcyQxLmxpbmVzW2F0XSkpIHsgcmV0dXJuIHRydWUgfSB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIEJyYW5jaENodW5rKGNoaWxkcmVuKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgdmFyIHNpemUgPSAwLCBoZWlnaHQgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGNoID0gY2hpbGRyZW5baV07XG4gICAgc2l6ZSArPSBjaC5jaHVua1NpemUoKTsgaGVpZ2h0ICs9IGNoLmhlaWdodDtcbiAgICBjaC5wYXJlbnQgPSB0aGlzJDE7XG4gIH1cbiAgdGhpcy5zaXplID0gc2l6ZTtcbiAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIHRoaXMucGFyZW50ID0gbnVsbDtcbn1cblxuQnJhbmNoQ2h1bmsucHJvdG90eXBlID0ge1xuICBjaHVua1NpemU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5zaXplIH0sXG5cbiAgcmVtb3ZlSW5uZXI6IGZ1bmN0aW9uKGF0LCBuKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB0aGlzLnNpemUgLT0gbjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBjaGlsZCA9IHRoaXMkMS5jaGlsZHJlbltpXSwgc3ogPSBjaGlsZC5jaHVua1NpemUoKTtcbiAgICAgIGlmIChhdCA8IHN6KSB7XG4gICAgICAgIHZhciBybSA9IE1hdGgubWluKG4sIHN6IC0gYXQpLCBvbGRIZWlnaHQgPSBjaGlsZC5oZWlnaHQ7XG4gICAgICAgIGNoaWxkLnJlbW92ZUlubmVyKGF0LCBybSk7XG4gICAgICAgIHRoaXMkMS5oZWlnaHQgLT0gb2xkSGVpZ2h0IC0gY2hpbGQuaGVpZ2h0O1xuICAgICAgICBpZiAoc3ogPT0gcm0pIHsgdGhpcyQxLmNoaWxkcmVuLnNwbGljZShpLS0sIDEpOyBjaGlsZC5wYXJlbnQgPSBudWxsOyB9XG4gICAgICAgIGlmICgobiAtPSBybSkgPT0gMCkgeyBicmVhayB9XG4gICAgICAgIGF0ID0gMDtcbiAgICAgIH0gZWxzZSB7IGF0IC09IHN6OyB9XG4gICAgfVxuICAgIC8vIElmIHRoZSByZXN1bHQgaXMgc21hbGxlciB0aGFuIDI1IGxpbmVzLCBlbnN1cmUgdGhhdCBpdCBpcyBhXG4gICAgLy8gc2luZ2xlIGxlYWYgbm9kZS5cbiAgICBpZiAodGhpcy5zaXplIC0gbiA8IDI1ICYmXG4gICAgICAgICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEgfHwgISh0aGlzLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgTGVhZkNodW5rKSkpIHtcbiAgICAgIHZhciBsaW5lcyA9IFtdO1xuICAgICAgdGhpcy5jb2xsYXBzZShsaW5lcyk7XG4gICAgICB0aGlzLmNoaWxkcmVuID0gW25ldyBMZWFmQ2h1bmsobGluZXMpXTtcbiAgICAgIHRoaXMuY2hpbGRyZW5bMF0ucGFyZW50ID0gdGhpcztcbiAgICB9XG4gIH0sXG5cbiAgY29sbGFwc2U6IGZ1bmN0aW9uKGxpbmVzKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsgdGhpcyQxLmNoaWxkcmVuW2ldLmNvbGxhcHNlKGxpbmVzKTsgfVxuICB9LFxuXG4gIGluc2VydElubmVyOiBmdW5jdGlvbihhdCwgbGluZXMsIGhlaWdodCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdGhpcy5zaXplICs9IGxpbmVzLmxlbmd0aDtcbiAgICB0aGlzLmhlaWdodCArPSBoZWlnaHQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgY2hpbGQgPSB0aGlzJDEuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCk7XG4gICAgICBpZiAoYXQgPD0gc3opIHtcbiAgICAgICAgY2hpbGQuaW5zZXJ0SW5uZXIoYXQsIGxpbmVzLCBoZWlnaHQpO1xuICAgICAgICBpZiAoY2hpbGQubGluZXMgJiYgY2hpbGQubGluZXMubGVuZ3RoID4gNTApIHtcbiAgICAgICAgICAvLyBUbyBhdm9pZCBtZW1vcnkgdGhyYXNoaW5nIHdoZW4gY2hpbGQubGluZXMgaXMgaHVnZSAoZS5nLiBmaXJzdCB2aWV3IG9mIGEgbGFyZ2UgZmlsZSksIGl0J3MgbmV2ZXIgc3BsaWNlZC5cbiAgICAgICAgICAvLyBJbnN0ZWFkLCBzbWFsbCBzbGljZXMgYXJlIHRha2VuLiBUaGV5J3JlIHRha2VuIGluIG9yZGVyIGJlY2F1c2Ugc2VxdWVudGlhbCBtZW1vcnkgYWNjZXNzZXMgYXJlIGZhc3Rlc3QuXG4gICAgICAgICAgdmFyIHJlbWFpbmluZyA9IGNoaWxkLmxpbmVzLmxlbmd0aCAlIDI1ICsgMjU7XG4gICAgICAgICAgZm9yICh2YXIgcG9zID0gcmVtYWluaW5nOyBwb3MgPCBjaGlsZC5saW5lcy5sZW5ndGg7KSB7XG4gICAgICAgICAgICB2YXIgbGVhZiA9IG5ldyBMZWFmQ2h1bmsoY2hpbGQubGluZXMuc2xpY2UocG9zLCBwb3MgKz0gMjUpKTtcbiAgICAgICAgICAgIGNoaWxkLmhlaWdodCAtPSBsZWFmLmhlaWdodDtcbiAgICAgICAgICAgIHRoaXMkMS5jaGlsZHJlbi5zcGxpY2UoKytpLCAwLCBsZWFmKTtcbiAgICAgICAgICAgIGxlYWYucGFyZW50ID0gdGhpcyQxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZC5saW5lcyA9IGNoaWxkLmxpbmVzLnNsaWNlKDAsIHJlbWFpbmluZyk7XG4gICAgICAgICAgdGhpcyQxLm1heWJlU3BpbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgYXQgLT0gc3o7XG4gICAgfVxuICB9LFxuXG4gIC8vIFdoZW4gYSBub2RlIGhhcyBncm93biwgY2hlY2sgd2hldGhlciBpdCBzaG91bGQgYmUgc3BsaXQuXG4gIG1heWJlU3BpbGw6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA8PSAxMCkgeyByZXR1cm4gfVxuICAgIHZhciBtZSA9IHRoaXM7XG4gICAgZG8ge1xuICAgICAgdmFyIHNwaWxsZWQgPSBtZS5jaGlsZHJlbi5zcGxpY2UobWUuY2hpbGRyZW4ubGVuZ3RoIC0gNSwgNSk7XG4gICAgICB2YXIgc2libGluZyA9IG5ldyBCcmFuY2hDaHVuayhzcGlsbGVkKTtcbiAgICAgIGlmICghbWUucGFyZW50KSB7IC8vIEJlY29tZSB0aGUgcGFyZW50IG5vZGVcbiAgICAgICAgdmFyIGNvcHkgPSBuZXcgQnJhbmNoQ2h1bmsobWUuY2hpbGRyZW4pO1xuICAgICAgICBjb3B5LnBhcmVudCA9IG1lO1xuICAgICAgICBtZS5jaGlsZHJlbiA9IFtjb3B5LCBzaWJsaW5nXTtcbiAgICAgICAgbWUgPSBjb3B5O1xuICAgICB9IGVsc2Uge1xuICAgICAgICBtZS5zaXplIC09IHNpYmxpbmcuc2l6ZTtcbiAgICAgICAgbWUuaGVpZ2h0IC09IHNpYmxpbmcuaGVpZ2h0O1xuICAgICAgICB2YXIgbXlJbmRleCA9IGluZGV4T2YobWUucGFyZW50LmNoaWxkcmVuLCBtZSk7XG4gICAgICAgIG1lLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UobXlJbmRleCArIDEsIDAsIHNpYmxpbmcpO1xuICAgICAgfVxuICAgICAgc2libGluZy5wYXJlbnQgPSBtZS5wYXJlbnQ7XG4gICAgfSB3aGlsZSAobWUuY2hpbGRyZW4ubGVuZ3RoID4gMTApXG4gICAgbWUucGFyZW50Lm1heWJlU3BpbGwoKTtcbiAgfSxcblxuICBpdGVyTjogZnVuY3Rpb24oYXQsIG4sIG9wKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBjaGlsZCA9IHRoaXMkMS5jaGlsZHJlbltpXSwgc3ogPSBjaGlsZC5jaHVua1NpemUoKTtcbiAgICAgIGlmIChhdCA8IHN6KSB7XG4gICAgICAgIHZhciB1c2VkID0gTWF0aC5taW4obiwgc3ogLSBhdCk7XG4gICAgICAgIGlmIChjaGlsZC5pdGVyTihhdCwgdXNlZCwgb3ApKSB7IHJldHVybiB0cnVlIH1cbiAgICAgICAgaWYgKChuIC09IHVzZWQpID09IDApIHsgYnJlYWsgfVxuICAgICAgICBhdCA9IDA7XG4gICAgICB9IGVsc2UgeyBhdCAtPSBzejsgfVxuICAgIH1cbiAgfVxufTtcblxuLy8gTGluZSB3aWRnZXRzIGFyZSBibG9jayBlbGVtZW50cyBkaXNwbGF5ZWQgYWJvdmUgb3IgYmVsb3cgYSBsaW5lLlxuXG52YXIgTGluZVdpZGdldCA9IGZ1bmN0aW9uKGRvYywgbm9kZSwgb3B0aW9ucykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBpZiAob3B0aW9ucykgeyBmb3IgKHZhciBvcHQgaW4gb3B0aW9ucykgeyBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHQpKVxuICAgIHsgdGhpcyQxW29wdF0gPSBvcHRpb25zW29wdF07IH0gfSB9XG4gIHRoaXMuZG9jID0gZG9jO1xuICB0aGlzLm5vZGUgPSBub2RlO1xufTtcblxuTGluZVdpZGdldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIGNtID0gdGhpcy5kb2MuY20sIHdzID0gdGhpcy5saW5lLndpZGdldHMsIGxpbmUgPSB0aGlzLmxpbmUsIG5vID0gbGluZU5vKGxpbmUpO1xuICBpZiAobm8gPT0gbnVsbCB8fCAhd3MpIHsgcmV0dXJuIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB3cy5sZW5ndGg7ICsraSkgeyBpZiAod3NbaV0gPT0gdGhpcyQxKSB7IHdzLnNwbGljZShpLS0sIDEpOyB9IH1cbiAgaWYgKCF3cy5sZW5ndGgpIHsgbGluZS53aWRnZXRzID0gbnVsbDsgfVxuICB2YXIgaGVpZ2h0ID0gd2lkZ2V0SGVpZ2h0KHRoaXMpO1xuICB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIE1hdGgubWF4KDAsIGxpbmUuaGVpZ2h0IC0gaGVpZ2h0KSk7XG4gIGlmIChjbSkge1xuICAgIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFkanVzdFNjcm9sbFdoZW5BYm92ZVZpc2libGUoY20sIGxpbmUsIC1oZWlnaHQpO1xuICAgICAgcmVnTGluZUNoYW5nZShjbSwgbm8sIFwid2lkZ2V0XCIpO1xuICAgIH0pO1xuICAgIHNpZ25hbExhdGVyKGNtLCBcImxpbmVXaWRnZXRDbGVhcmVkXCIsIGNtLCB0aGlzLCBubyk7XG4gIH1cbn07XG5cbkxpbmVXaWRnZXQucHJvdG90eXBlLmNoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIG9sZEggPSB0aGlzLmhlaWdodCwgY20gPSB0aGlzLmRvYy5jbSwgbGluZSA9IHRoaXMubGluZTtcbiAgdGhpcy5oZWlnaHQgPSBudWxsO1xuICB2YXIgZGlmZiA9IHdpZGdldEhlaWdodCh0aGlzKSAtIG9sZEg7XG4gIGlmICghZGlmZikgeyByZXR1cm4gfVxuICB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGxpbmUuaGVpZ2h0ICsgZGlmZik7XG4gIGlmIChjbSkge1xuICAgIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIGFkanVzdFNjcm9sbFdoZW5BYm92ZVZpc2libGUoY20sIGxpbmUsIGRpZmYpO1xuICAgICAgc2lnbmFsTGF0ZXIoY20sIFwibGluZVdpZGdldENoYW5nZWRcIiwgY20sIHRoaXMkMSwgbGluZU5vKGxpbmUpKTtcbiAgICB9KTtcbiAgfVxufTtcbmV2ZW50TWl4aW4oTGluZVdpZGdldCk7XG5cbmZ1bmN0aW9uIGFkanVzdFNjcm9sbFdoZW5BYm92ZVZpc2libGUoY20sIGxpbmUsIGRpZmYpIHtcbiAgaWYgKGhlaWdodEF0TGluZShsaW5lKSA8ICgoY20uY3VyT3AgJiYgY20uY3VyT3Auc2Nyb2xsVG9wKSB8fCBjbS5kb2Muc2Nyb2xsVG9wKSlcbiAgICB7IGFkZFRvU2Nyb2xsVG9wKGNtLCBkaWZmKTsgfVxufVxuXG5mdW5jdGlvbiBhZGRMaW5lV2lkZ2V0KGRvYywgaGFuZGxlLCBub2RlLCBvcHRpb25zKSB7XG4gIHZhciB3aWRnZXQgPSBuZXcgTGluZVdpZGdldChkb2MsIG5vZGUsIG9wdGlvbnMpO1xuICB2YXIgY20gPSBkb2MuY207XG4gIGlmIChjbSAmJiB3aWRnZXQubm9IU2Nyb2xsKSB7IGNtLmRpc3BsYXkuYWxpZ25XaWRnZXRzID0gdHJ1ZTsgfVxuICBjaGFuZ2VMaW5lKGRvYywgaGFuZGxlLCBcIndpZGdldFwiLCBmdW5jdGlvbiAobGluZSkge1xuICAgIHZhciB3aWRnZXRzID0gbGluZS53aWRnZXRzIHx8IChsaW5lLndpZGdldHMgPSBbXSk7XG4gICAgaWYgKHdpZGdldC5pbnNlcnRBdCA9PSBudWxsKSB7IHdpZGdldHMucHVzaCh3aWRnZXQpOyB9XG4gICAgZWxzZSB7IHdpZGdldHMuc3BsaWNlKE1hdGgubWluKHdpZGdldHMubGVuZ3RoIC0gMSwgTWF0aC5tYXgoMCwgd2lkZ2V0Lmluc2VydEF0KSksIDAsIHdpZGdldCk7IH1cbiAgICB3aWRnZXQubGluZSA9IGxpbmU7XG4gICAgaWYgKGNtICYmICFsaW5lSXNIaWRkZW4oZG9jLCBsaW5lKSkge1xuICAgICAgdmFyIGFib3ZlVmlzaWJsZSA9IGhlaWdodEF0TGluZShsaW5lKSA8IGRvYy5zY3JvbGxUb3A7XG4gICAgICB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGxpbmUuaGVpZ2h0ICsgd2lkZ2V0SGVpZ2h0KHdpZGdldCkpO1xuICAgICAgaWYgKGFib3ZlVmlzaWJsZSkgeyBhZGRUb1Njcm9sbFRvcChjbSwgd2lkZ2V0LmhlaWdodCk7IH1cbiAgICAgIGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfSk7XG4gIGlmIChjbSkgeyBzaWduYWxMYXRlcihjbSwgXCJsaW5lV2lkZ2V0QWRkZWRcIiwgY20sIHdpZGdldCwgdHlwZW9mIGhhbmRsZSA9PSBcIm51bWJlclwiID8gaGFuZGxlIDogbGluZU5vKGhhbmRsZSkpOyB9XG4gIHJldHVybiB3aWRnZXRcbn1cblxuLy8gVEVYVE1BUktFUlNcblxuLy8gQ3JlYXRlZCB3aXRoIG1hcmtUZXh0IGFuZCBzZXRCb29rbWFyayBtZXRob2RzLiBBIFRleHRNYXJrZXIgaXMgYVxuLy8gaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2xlYXIgb3IgZmluZCBhIG1hcmtlZCBwb3NpdGlvbiBpbiB0aGVcbi8vIGRvY3VtZW50LiBMaW5lIG9iamVjdHMgaG9sZCBhcnJheXMgKG1hcmtlZFNwYW5zKSBjb250YWluaW5nXG4vLyB7ZnJvbSwgdG8sIG1hcmtlcn0gb2JqZWN0IHBvaW50aW5nIHRvIHN1Y2ggbWFya2VyIG9iamVjdHMsIGFuZFxuLy8gaW5kaWNhdGluZyB0aGF0IHN1Y2ggYSBtYXJrZXIgaXMgcHJlc2VudCBvbiB0aGF0IGxpbmUuIE11bHRpcGxlXG4vLyBsaW5lcyBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgbWFya2VyIHdoZW4gaXQgc3BhbnMgYWNyb3NzIGxpbmVzLlxuLy8gVGhlIHNwYW5zIHdpbGwgaGF2ZSBudWxsIGZvciB0aGVpciBmcm9tL3RvIHByb3BlcnRpZXMgd2hlbiB0aGVcbi8vIG1hcmtlciBjb250aW51ZXMgYmV5b25kIHRoZSBzdGFydC9lbmQgb2YgdGhlIGxpbmUuIE1hcmtlcnMgaGF2ZVxuLy8gbGlua3MgYmFjayB0byB0aGUgbGluZXMgdGhleSBjdXJyZW50bHkgdG91Y2guXG5cbi8vIENvbGxhcHNlZCBtYXJrZXJzIGhhdmUgdW5pcXVlIGlkcywgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBvcmRlclxuLy8gdGhlbSwgd2hpY2ggaXMgbmVlZGVkIGZvciB1bmlxdWVseSBkZXRlcm1pbmluZyBhbiBvdXRlciBtYXJrZXJcbi8vIHdoZW4gdGhleSBvdmVybGFwICh0aGV5IG1heSBuZXN0LCBidXQgbm90IHBhcnRpYWxseSBvdmVybGFwKS5cbnZhciBuZXh0TWFya2VySWQgPSAwO1xuXG52YXIgVGV4dE1hcmtlciA9IGZ1bmN0aW9uKGRvYywgdHlwZSkge1xuICB0aGlzLmxpbmVzID0gW107XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuZG9jID0gZG9jO1xuICB0aGlzLmlkID0gKytuZXh0TWFya2VySWQ7XG59O1xuXG4vLyBDbGVhciB0aGUgbWFya2VyLlxuVGV4dE1hcmtlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKHRoaXMuZXhwbGljaXRseUNsZWFyZWQpIHsgcmV0dXJuIH1cbiAgdmFyIGNtID0gdGhpcy5kb2MuY20sIHdpdGhPcCA9IGNtICYmICFjbS5jdXJPcDtcbiAgaWYgKHdpdGhPcCkgeyBzdGFydE9wZXJhdGlvbihjbSk7IH1cbiAgaWYgKGhhc0hhbmRsZXIodGhpcywgXCJjbGVhclwiKSkge1xuICAgIHZhciBmb3VuZCA9IHRoaXMuZmluZCgpO1xuICAgIGlmIChmb3VuZCkgeyBzaWduYWxMYXRlcih0aGlzLCBcImNsZWFyXCIsIGZvdW5kLmZyb20sIGZvdW5kLnRvKTsgfVxuICB9XG4gIHZhciBtaW4gPSBudWxsLCBtYXggPSBudWxsO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgbGluZSA9IHRoaXMkMS5saW5lc1tpXTtcbiAgICB2YXIgc3BhbiA9IGdldE1hcmtlZFNwYW5Gb3IobGluZS5tYXJrZWRTcGFucywgdGhpcyQxKTtcbiAgICBpZiAoY20gJiYgIXRoaXMkMS5jb2xsYXBzZWQpIHsgcmVnTGluZUNoYW5nZShjbSwgbGluZU5vKGxpbmUpLCBcInRleHRcIik7IH1cbiAgICBlbHNlIGlmIChjbSkge1xuICAgICAgaWYgKHNwYW4udG8gIT0gbnVsbCkgeyBtYXggPSBsaW5lTm8obGluZSk7IH1cbiAgICAgIGlmIChzcGFuLmZyb20gIT0gbnVsbCkgeyBtaW4gPSBsaW5lTm8obGluZSk7IH1cbiAgICB9XG4gICAgbGluZS5tYXJrZWRTcGFucyA9IHJlbW92ZU1hcmtlZFNwYW4obGluZS5tYXJrZWRTcGFucywgc3Bhbik7XG4gICAgaWYgKHNwYW4uZnJvbSA9PSBudWxsICYmIHRoaXMkMS5jb2xsYXBzZWQgJiYgIWxpbmVJc0hpZGRlbih0aGlzJDEuZG9jLCBsaW5lKSAmJiBjbSlcbiAgICAgIHsgdXBkYXRlTGluZUhlaWdodChsaW5lLCB0ZXh0SGVpZ2h0KGNtLmRpc3BsYXkpKTsgfVxuICB9XG4gIGlmIChjbSAmJiB0aGlzLmNvbGxhcHNlZCAmJiAhY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgdGhpcy5saW5lcy5sZW5ndGg7ICsraSQxKSB7XG4gICAgdmFyIHZpc3VhbCA9IHZpc3VhbExpbmUodGhpcyQxLmxpbmVzW2kkMV0pLCBsZW4gPSBsaW5lTGVuZ3RoKHZpc3VhbCk7XG4gICAgaWYgKGxlbiA+IGNtLmRpc3BsYXkubWF4TGluZUxlbmd0aCkge1xuICAgICAgY20uZGlzcGxheS5tYXhMaW5lID0gdmlzdWFsO1xuICAgICAgY20uZGlzcGxheS5tYXhMaW5lTGVuZ3RoID0gbGVuO1xuICAgICAgY20uZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9IH1cblxuICBpZiAobWluICE9IG51bGwgJiYgY20gJiYgdGhpcy5jb2xsYXBzZWQpIHsgcmVnQ2hhbmdlKGNtLCBtaW4sIG1heCArIDEpOyB9XG4gIHRoaXMubGluZXMubGVuZ3RoID0gMDtcbiAgdGhpcy5leHBsaWNpdGx5Q2xlYXJlZCA9IHRydWU7XG4gIGlmICh0aGlzLmF0b21pYyAmJiB0aGlzLmRvYy5jYW50RWRpdCkge1xuICAgIHRoaXMuZG9jLmNhbnRFZGl0ID0gZmFsc2U7XG4gICAgaWYgKGNtKSB7IHJlQ2hlY2tTZWxlY3Rpb24oY20uZG9jKTsgfVxuICB9XG4gIGlmIChjbSkgeyBzaWduYWxMYXRlcihjbSwgXCJtYXJrZXJDbGVhcmVkXCIsIGNtLCB0aGlzLCBtaW4sIG1heCk7IH1cbiAgaWYgKHdpdGhPcCkgeyBlbmRPcGVyYXRpb24oY20pOyB9XG4gIGlmICh0aGlzLnBhcmVudCkgeyB0aGlzLnBhcmVudC5jbGVhcigpOyB9XG59O1xuXG4vLyBGaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWFya2VyIGluIHRoZSBkb2N1bWVudC4gUmV0dXJucyBhIHtmcm9tLFxuLy8gdG99IG9iamVjdCBieSBkZWZhdWx0LiBTaWRlIGNhbiBiZSBwYXNzZWQgdG8gZ2V0IGEgc3BlY2lmaWMgc2lkZVxuLy8gLS0gMCAoYm90aCksIC0xIChsZWZ0KSwgb3IgMSAocmlnaHQpLiBXaGVuIGxpbmVPYmogaXMgdHJ1ZSwgdGhlXG4vLyBQb3Mgb2JqZWN0cyByZXR1cm5lZCBjb250YWluIGEgbGluZSBvYmplY3QsIHJhdGhlciB0aGFuIGEgbGluZVxuLy8gbnVtYmVyICh1c2VkIHRvIHByZXZlbnQgbG9va2luZyB1cCB0aGUgc2FtZSBsaW5lIHR3aWNlKS5cblRleHRNYXJrZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAoc2lkZSwgbGluZU9iaikge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmIChzaWRlID09IG51bGwgJiYgdGhpcy50eXBlID09IFwiYm9va21hcmtcIikgeyBzaWRlID0gMTsgfVxuICB2YXIgZnJvbSwgdG87XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBsaW5lID0gdGhpcyQxLmxpbmVzW2ldO1xuICAgIHZhciBzcGFuID0gZ2V0TWFya2VkU3BhbkZvcihsaW5lLm1hcmtlZFNwYW5zLCB0aGlzJDEpO1xuICAgIGlmIChzcGFuLmZyb20gIT0gbnVsbCkge1xuICAgICAgZnJvbSA9IFBvcyhsaW5lT2JqID8gbGluZSA6IGxpbmVObyhsaW5lKSwgc3Bhbi5mcm9tKTtcbiAgICAgIGlmIChzaWRlID09IC0xKSB7IHJldHVybiBmcm9tIH1cbiAgICB9XG4gICAgaWYgKHNwYW4udG8gIT0gbnVsbCkge1xuICAgICAgdG8gPSBQb3MobGluZU9iaiA/IGxpbmUgOiBsaW5lTm8obGluZSksIHNwYW4udG8pO1xuICAgICAgaWYgKHNpZGUgPT0gMSkgeyByZXR1cm4gdG8gfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZnJvbSAmJiB7ZnJvbTogZnJvbSwgdG86IHRvfVxufTtcblxuLy8gU2lnbmFscyB0aGF0IHRoZSBtYXJrZXIncyB3aWRnZXQgY2hhbmdlZCwgYW5kIHN1cnJvdW5kaW5nIGxheW91dFxuLy8gc2hvdWxkIGJlIHJlY29tcHV0ZWQuXG5UZXh0TWFya2VyLnByb3RvdHlwZS5jaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBwb3MgPSB0aGlzLmZpbmQoLTEsIHRydWUpLCB3aWRnZXQgPSB0aGlzLCBjbSA9IHRoaXMuZG9jLmNtO1xuICBpZiAoIXBvcyB8fCAhY20pIHsgcmV0dXJuIH1cbiAgcnVuSW5PcChjbSwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBsaW5lID0gcG9zLmxpbmUsIGxpbmVOID0gbGluZU5vKHBvcy5saW5lKTtcbiAgICB2YXIgdmlldyA9IGZpbmRWaWV3Rm9yTGluZShjbSwgbGluZU4pO1xuICAgIGlmICh2aWV3KSB7XG4gICAgICBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlRm9yKHZpZXcpO1xuICAgICAgY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCA9IGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgY20uY3VyT3AudXBkYXRlTWF4TGluZSA9IHRydWU7XG4gICAgaWYgKCFsaW5lSXNIaWRkZW4od2lkZ2V0LmRvYywgbGluZSkgJiYgd2lkZ2V0LmhlaWdodCAhPSBudWxsKSB7XG4gICAgICB2YXIgb2xkSGVpZ2h0ID0gd2lkZ2V0LmhlaWdodDtcbiAgICAgIHdpZGdldC5oZWlnaHQgPSBudWxsO1xuICAgICAgdmFyIGRIZWlnaHQgPSB3aWRnZXRIZWlnaHQod2lkZ2V0KSAtIG9sZEhlaWdodDtcbiAgICAgIGlmIChkSGVpZ2h0KVxuICAgICAgICB7IHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgbGluZS5oZWlnaHQgKyBkSGVpZ2h0KTsgfVxuICAgIH1cbiAgICBzaWduYWxMYXRlcihjbSwgXCJtYXJrZXJDaGFuZ2VkXCIsIGNtLCB0aGlzJDEpO1xuICB9KTtcbn07XG5cblRleHRNYXJrZXIucHJvdG90eXBlLmF0dGFjaExpbmUgPSBmdW5jdGlvbiAobGluZSkge1xuICBpZiAoIXRoaXMubGluZXMubGVuZ3RoICYmIHRoaXMuZG9jLmNtKSB7XG4gICAgdmFyIG9wID0gdGhpcy5kb2MuY20uY3VyT3A7XG4gICAgaWYgKCFvcC5tYXliZUhpZGRlbk1hcmtlcnMgfHwgaW5kZXhPZihvcC5tYXliZUhpZGRlbk1hcmtlcnMsIHRoaXMpID09IC0xKVxuICAgICAgeyAob3AubWF5YmVVbmhpZGRlbk1hcmtlcnMgfHwgKG9wLm1heWJlVW5oaWRkZW5NYXJrZXJzID0gW10pKS5wdXNoKHRoaXMpOyB9XG4gIH1cbiAgdGhpcy5saW5lcy5wdXNoKGxpbmUpO1xufTtcblxuVGV4dE1hcmtlci5wcm90b3R5cGUuZGV0YWNoTGluZSA9IGZ1bmN0aW9uIChsaW5lKSB7XG4gIHRoaXMubGluZXMuc3BsaWNlKGluZGV4T2YodGhpcy5saW5lcywgbGluZSksIDEpO1xuICBpZiAoIXRoaXMubGluZXMubGVuZ3RoICYmIHRoaXMuZG9jLmNtKSB7XG4gICAgdmFyIG9wID0gdGhpcy5kb2MuY20uY3VyT3A7KG9wLm1heWJlSGlkZGVuTWFya2VycyB8fCAob3AubWF5YmVIaWRkZW5NYXJrZXJzID0gW10pKS5wdXNoKHRoaXMpO1xuICB9XG59O1xuZXZlbnRNaXhpbihUZXh0TWFya2VyKTtcblxuLy8gQ3JlYXRlIGEgbWFya2VyLCB3aXJlIGl0IHVwIHRvIHRoZSByaWdodCBsaW5lcywgYW5kXG5mdW5jdGlvbiBtYXJrVGV4dChkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKSB7XG4gIC8vIFNoYXJlZCBtYXJrZXJzIChhY3Jvc3MgbGlua2VkIGRvY3VtZW50cykgYXJlIGhhbmRsZWQgc2VwYXJhdGVseVxuICAvLyAobWFya1RleHRTaGFyZWQgd2lsbCBjYWxsIG91dCB0byB0aGlzIGFnYWluLCBvbmNlIHBlclxuICAvLyBkb2N1bWVudCkuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc2hhcmVkKSB7IHJldHVybiBtYXJrVGV4dFNoYXJlZChkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKSB9XG4gIC8vIEVuc3VyZSB3ZSBhcmUgaW4gYW4gb3BlcmF0aW9uLlxuICBpZiAoZG9jLmNtICYmICFkb2MuY20uY3VyT3ApIHsgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1hcmtUZXh0KShkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKSB9XG5cbiAgdmFyIG1hcmtlciA9IG5ldyBUZXh0TWFya2VyKGRvYywgdHlwZSksIGRpZmYgPSBjbXAoZnJvbSwgdG8pO1xuICBpZiAob3B0aW9ucykgeyBjb3B5T2JqKG9wdGlvbnMsIG1hcmtlciwgZmFsc2UpOyB9XG4gIC8vIERvbid0IGNvbm5lY3QgZW1wdHkgbWFya2VycyB1bmxlc3MgY2xlYXJXaGVuRW1wdHkgaXMgZmFsc2VcbiAgaWYgKGRpZmYgPiAwIHx8IGRpZmYgPT0gMCAmJiBtYXJrZXIuY2xlYXJXaGVuRW1wdHkgIT09IGZhbHNlKVxuICAgIHsgcmV0dXJuIG1hcmtlciB9XG4gIGlmIChtYXJrZXIucmVwbGFjZWRXaXRoKSB7XG4gICAgLy8gU2hvd2luZyB1cCBhcyBhIHdpZGdldCBpbXBsaWVzIGNvbGxhcHNlZCAod2lkZ2V0IHJlcGxhY2VzIHRleHQpXG4gICAgbWFya2VyLmNvbGxhcHNlZCA9IHRydWU7XG4gICAgbWFya2VyLndpZGdldE5vZGUgPSBlbHRQKFwic3BhblwiLCBbbWFya2VyLnJlcGxhY2VkV2l0aF0sIFwiQ29kZU1pcnJvci13aWRnZXRcIik7XG4gICAgaWYgKCFvcHRpb25zLmhhbmRsZU1vdXNlRXZlbnRzKSB7IG1hcmtlci53aWRnZXROb2RlLnNldEF0dHJpYnV0ZShcImNtLWlnbm9yZS1ldmVudHNcIiwgXCJ0cnVlXCIpOyB9XG4gICAgaWYgKG9wdGlvbnMuaW5zZXJ0TGVmdCkgeyBtYXJrZXIud2lkZ2V0Tm9kZS5pbnNlcnRMZWZ0ID0gdHJ1ZTsgfVxuICB9XG4gIGlmIChtYXJrZXIuY29sbGFwc2VkKSB7XG4gICAgaWYgKGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLCBmcm9tLmxpbmUsIGZyb20sIHRvLCBtYXJrZXIpIHx8XG4gICAgICAgIGZyb20ubGluZSAhPSB0by5saW5lICYmIGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLCB0by5saW5lLCBmcm9tLCB0bywgbWFya2VyKSlcbiAgICAgIHsgdGhyb3cgbmV3IEVycm9yKFwiSW5zZXJ0aW5nIGNvbGxhcHNlZCBtYXJrZXIgcGFydGlhbGx5IG92ZXJsYXBwaW5nIGFuIGV4aXN0aW5nIG9uZVwiKSB9XG4gICAgc2VlQ29sbGFwc2VkU3BhbnMoKTtcbiAgfVxuXG4gIGlmIChtYXJrZXIuYWRkVG9IaXN0b3J5KVxuICAgIHsgYWRkQ2hhbmdlVG9IaXN0b3J5KGRvYywge2Zyb206IGZyb20sIHRvOiB0bywgb3JpZ2luOiBcIm1hcmtUZXh0XCJ9LCBkb2Muc2VsLCBOYU4pOyB9XG5cbiAgdmFyIGN1ckxpbmUgPSBmcm9tLmxpbmUsIGNtID0gZG9jLmNtLCB1cGRhdGVNYXhMaW5lO1xuICBkb2MuaXRlcihjdXJMaW5lLCB0by5saW5lICsgMSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICBpZiAoY20gJiYgbWFya2VyLmNvbGxhcHNlZCAmJiAhY20ub3B0aW9ucy5saW5lV3JhcHBpbmcgJiYgdmlzdWFsTGluZShsaW5lKSA9PSBjbS5kaXNwbGF5Lm1heExpbmUpXG4gICAgICB7IHVwZGF0ZU1heExpbmUgPSB0cnVlOyB9XG4gICAgaWYgKG1hcmtlci5jb2xsYXBzZWQgJiYgY3VyTGluZSAhPSBmcm9tLmxpbmUpIHsgdXBkYXRlTGluZUhlaWdodChsaW5lLCAwKTsgfVxuICAgIGFkZE1hcmtlZFNwYW4obGluZSwgbmV3IE1hcmtlZFNwYW4obWFya2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyTGluZSA9PSBmcm9tLmxpbmUgPyBmcm9tLmNoIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckxpbmUgPT0gdG8ubGluZSA/IHRvLmNoIDogbnVsbCkpO1xuICAgICsrY3VyTGluZTtcbiAgfSk7XG4gIC8vIGxpbmVJc0hpZGRlbiBkZXBlbmRzIG9uIHRoZSBwcmVzZW5jZSBvZiB0aGUgc3BhbnMsIHNvIG5lZWRzIGEgc2Vjb25kIHBhc3NcbiAgaWYgKG1hcmtlci5jb2xsYXBzZWQpIHsgZG9jLml0ZXIoZnJvbS5saW5lLCB0by5saW5lICsgMSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICBpZiAobGluZUlzSGlkZGVuKGRvYywgbGluZSkpIHsgdXBkYXRlTGluZUhlaWdodChsaW5lLCAwKTsgfVxuICB9KTsgfVxuXG4gIGlmIChtYXJrZXIuY2xlYXJPbkVudGVyKSB7IG9uKG1hcmtlciwgXCJiZWZvcmVDdXJzb3JFbnRlclwiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBtYXJrZXIuY2xlYXIoKTsgfSk7IH1cblxuICBpZiAobWFya2VyLnJlYWRPbmx5KSB7XG4gICAgc2VlUmVhZE9ubHlTcGFucygpO1xuICAgIGlmIChkb2MuaGlzdG9yeS5kb25lLmxlbmd0aCB8fCBkb2MuaGlzdG9yeS51bmRvbmUubGVuZ3RoKVxuICAgICAgeyBkb2MuY2xlYXJIaXN0b3J5KCk7IH1cbiAgfVxuICBpZiAobWFya2VyLmNvbGxhcHNlZCkge1xuICAgIG1hcmtlci5pZCA9ICsrbmV4dE1hcmtlcklkO1xuICAgIG1hcmtlci5hdG9taWMgPSB0cnVlO1xuICB9XG4gIGlmIChjbSkge1xuICAgIC8vIFN5bmMgZWRpdG9yIHN0YXRlXG4gICAgaWYgKHVwZGF0ZU1heExpbmUpIHsgY20uY3VyT3AudXBkYXRlTWF4TGluZSA9IHRydWU7IH1cbiAgICBpZiAobWFya2VyLmNvbGxhcHNlZClcbiAgICAgIHsgcmVnQ2hhbmdlKGNtLCBmcm9tLmxpbmUsIHRvLmxpbmUgKyAxKTsgfVxuICAgIGVsc2UgaWYgKG1hcmtlci5jbGFzc05hbWUgfHwgbWFya2VyLnRpdGxlIHx8IG1hcmtlci5zdGFydFN0eWxlIHx8IG1hcmtlci5lbmRTdHlsZSB8fCBtYXJrZXIuY3NzKVxuICAgICAgeyBmb3IgKHZhciBpID0gZnJvbS5saW5lOyBpIDw9IHRvLmxpbmU7IGkrKykgeyByZWdMaW5lQ2hhbmdlKGNtLCBpLCBcInRleHRcIik7IH0gfVxuICAgIGlmIChtYXJrZXIuYXRvbWljKSB7IHJlQ2hlY2tTZWxlY3Rpb24oY20uZG9jKTsgfVxuICAgIHNpZ25hbExhdGVyKGNtLCBcIm1hcmtlckFkZGVkXCIsIGNtLCBtYXJrZXIpO1xuICB9XG4gIHJldHVybiBtYXJrZXJcbn1cblxuLy8gU0hBUkVEIFRFWFRNQVJLRVJTXG5cbi8vIEEgc2hhcmVkIG1hcmtlciBzcGFucyBtdWx0aXBsZSBsaW5rZWQgZG9jdW1lbnRzLiBJdCBpc1xuLy8gaW1wbGVtZW50ZWQgYXMgYSBtZXRhLW1hcmtlci1vYmplY3QgY29udHJvbGxpbmcgbXVsdGlwbGUgbm9ybWFsXG4vLyBtYXJrZXJzLlxudmFyIFNoYXJlZFRleHRNYXJrZXIgPSBmdW5jdGlvbihtYXJrZXJzLCBwcmltYXJ5KSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHRoaXMubWFya2VycyA9IG1hcmtlcnM7XG4gIHRoaXMucHJpbWFyeSA9IHByaW1hcnk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7ICsraSlcbiAgICB7IG1hcmtlcnNbaV0ucGFyZW50ID0gdGhpcyQxOyB9XG59O1xuXG5TaGFyZWRUZXh0TWFya2VyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBpZiAodGhpcy5leHBsaWNpdGx5Q2xlYXJlZCkgeyByZXR1cm4gfVxuICB0aGlzLmV4cGxpY2l0bHlDbGVhcmVkID0gdHJ1ZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1hcmtlcnMubGVuZ3RoOyArK2kpXG4gICAgeyB0aGlzJDEubWFya2Vyc1tpXS5jbGVhcigpOyB9XG4gIHNpZ25hbExhdGVyKHRoaXMsIFwiY2xlYXJcIik7XG59O1xuXG5TaGFyZWRUZXh0TWFya2VyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKHNpZGUsIGxpbmVPYmopIHtcbiAgcmV0dXJuIHRoaXMucHJpbWFyeS5maW5kKHNpZGUsIGxpbmVPYmopXG59O1xuZXZlbnRNaXhpbihTaGFyZWRUZXh0TWFya2VyKTtcblxuZnVuY3Rpb24gbWFya1RleHRTaGFyZWQoZG9jLCBmcm9tLCB0bywgb3B0aW9ucywgdHlwZSkge1xuICBvcHRpb25zID0gY29weU9iaihvcHRpb25zKTtcbiAgb3B0aW9ucy5zaGFyZWQgPSBmYWxzZTtcbiAgdmFyIG1hcmtlcnMgPSBbbWFya1RleHQoZG9jLCBmcm9tLCB0bywgb3B0aW9ucywgdHlwZSldLCBwcmltYXJ5ID0gbWFya2Vyc1swXTtcbiAgdmFyIHdpZGdldCA9IG9wdGlvbnMud2lkZ2V0Tm9kZTtcbiAgbGlua2VkRG9jcyhkb2MsIGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAod2lkZ2V0KSB7IG9wdGlvbnMud2lkZ2V0Tm9kZSA9IHdpZGdldC5jbG9uZU5vZGUodHJ1ZSk7IH1cbiAgICBtYXJrZXJzLnB1c2gobWFya1RleHQoZG9jLCBjbGlwUG9zKGRvYywgZnJvbSksIGNsaXBQb3MoZG9jLCB0byksIG9wdGlvbnMsIHR5cGUpKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5saW5rZWQubGVuZ3RoOyArK2kpXG4gICAgICB7IGlmIChkb2MubGlua2VkW2ldLmlzUGFyZW50KSB7IHJldHVybiB9IH1cbiAgICBwcmltYXJ5ID0gbHN0KG1hcmtlcnMpO1xuICB9KTtcbiAgcmV0dXJuIG5ldyBTaGFyZWRUZXh0TWFya2VyKG1hcmtlcnMsIHByaW1hcnkpXG59XG5cbmZ1bmN0aW9uIGZpbmRTaGFyZWRNYXJrZXJzKGRvYykge1xuICByZXR1cm4gZG9jLmZpbmRNYXJrcyhQb3MoZG9jLmZpcnN0LCAwKSwgZG9jLmNsaXBQb3MoUG9zKGRvYy5sYXN0TGluZSgpKSksIGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLnBhcmVudDsgfSlcbn1cblxuZnVuY3Rpb24gY29weVNoYXJlZE1hcmtlcnMoZG9jLCBtYXJrZXJzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2ldLCBwb3MgPSBtYXJrZXIuZmluZCgpO1xuICAgIHZhciBtRnJvbSA9IGRvYy5jbGlwUG9zKHBvcy5mcm9tKSwgbVRvID0gZG9jLmNsaXBQb3MocG9zLnRvKTtcbiAgICBpZiAoY21wKG1Gcm9tLCBtVG8pKSB7XG4gICAgICB2YXIgc3ViTWFyayA9IG1hcmtUZXh0KGRvYywgbUZyb20sIG1UbywgbWFya2VyLnByaW1hcnksIG1hcmtlci5wcmltYXJ5LnR5cGUpO1xuICAgICAgbWFya2VyLm1hcmtlcnMucHVzaChzdWJNYXJrKTtcbiAgICAgIHN1Yk1hcmsucGFyZW50ID0gbWFya2VyO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hTaGFyZWRNYXJrZXJzKG1hcmtlcnMpIHtcbiAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoIGkgKSB7XG4gICAgdmFyIG1hcmtlciA9IG1hcmtlcnNbaV0sIGxpbmtlZCA9IFttYXJrZXIucHJpbWFyeS5kb2NdO1xuICAgIGxpbmtlZERvY3MobWFya2VyLnByaW1hcnkuZG9jLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gbGlua2VkLnB1c2goZCk7IH0pO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWFya2VyLm1hcmtlcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBzdWJNYXJrZXIgPSBtYXJrZXIubWFya2Vyc1tqXTtcbiAgICAgIGlmIChpbmRleE9mKGxpbmtlZCwgc3ViTWFya2VyLmRvYykgPT0gLTEpIHtcbiAgICAgICAgc3ViTWFya2VyLnBhcmVudCA9IG51bGw7XG4gICAgICAgIG1hcmtlci5tYXJrZXJzLnNwbGljZShqLS0sIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIGxvb3AoIGkgKTtcbn1cblxudmFyIG5leHREb2NJZCA9IDA7XG52YXIgRG9jID0gZnVuY3Rpb24odGV4dCwgbW9kZSwgZmlyc3RMaW5lLCBsaW5lU2VwLCBkaXJlY3Rpb24pIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERvYykpIHsgcmV0dXJuIG5ldyBEb2ModGV4dCwgbW9kZSwgZmlyc3RMaW5lLCBsaW5lU2VwLCBkaXJlY3Rpb24pIH1cbiAgaWYgKGZpcnN0TGluZSA9PSBudWxsKSB7IGZpcnN0TGluZSA9IDA7IH1cblxuICBCcmFuY2hDaHVuay5jYWxsKHRoaXMsIFtuZXcgTGVhZkNodW5rKFtuZXcgTGluZShcIlwiLCBudWxsKV0pXSk7XG4gIHRoaXMuZmlyc3QgPSBmaXJzdExpbmU7XG4gIHRoaXMuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxMZWZ0ID0gMDtcbiAgdGhpcy5jYW50RWRpdCA9IGZhbHNlO1xuICB0aGlzLmNsZWFuR2VuZXJhdGlvbiA9IDE7XG4gIHRoaXMubW9kZUZyb250aWVyID0gdGhpcy5oaWdobGlnaHRGcm9udGllciA9IGZpcnN0TGluZTtcbiAgdmFyIHN0YXJ0ID0gUG9zKGZpcnN0TGluZSwgMCk7XG4gIHRoaXMuc2VsID0gc2ltcGxlU2VsZWN0aW9uKHN0YXJ0KTtcbiAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkobnVsbCk7XG4gIHRoaXMuaWQgPSArK25leHREb2NJZDtcbiAgdGhpcy5tb2RlT3B0aW9uID0gbW9kZTtcbiAgdGhpcy5saW5lU2VwID0gbGluZVNlcDtcbiAgdGhpcy5kaXJlY3Rpb24gPSAoZGlyZWN0aW9uID09IFwicnRsXCIpID8gXCJydGxcIiA6IFwibHRyXCI7XG4gIHRoaXMuZXh0ZW5kID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiB0ZXh0ID09IFwic3RyaW5nXCIpIHsgdGV4dCA9IHRoaXMuc3BsaXRMaW5lcyh0ZXh0KTsgfVxuICB1cGRhdGVEb2ModGhpcywge2Zyb206IHN0YXJ0LCB0bzogc3RhcnQsIHRleHQ6IHRleHR9KTtcbiAgc2V0U2VsZWN0aW9uKHRoaXMsIHNpbXBsZVNlbGVjdGlvbihzdGFydCksIHNlbF9kb250U2Nyb2xsKTtcbn07XG5cbkRvYy5wcm90b3R5cGUgPSBjcmVhdGVPYmooQnJhbmNoQ2h1bmsucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiBEb2MsXG4gIC8vIEl0ZXJhdGUgb3ZlciB0aGUgZG9jdW1lbnQuIFN1cHBvcnRzIHR3byBmb3JtcyAtLSB3aXRoIG9ubHkgb25lXG4gIC8vIGFyZ3VtZW50LCBpdCBjYWxscyB0aGF0IGZvciBlYWNoIGxpbmUgaW4gdGhlIGRvY3VtZW50LiBXaXRoXG4gIC8vIHRocmVlLCBpdCBpdGVyYXRlcyBvdmVyIHRoZSByYW5nZSBnaXZlbiBieSB0aGUgZmlyc3QgdHdvICh3aXRoXG4gIC8vIHRoZSBzZWNvbmQgYmVpbmcgbm9uLWluY2x1c2l2ZSkuXG4gIGl0ZXI6IGZ1bmN0aW9uKGZyb20sIHRvLCBvcCkge1xuICAgIGlmIChvcCkgeyB0aGlzLml0ZXJOKGZyb20gLSB0aGlzLmZpcnN0LCB0byAtIGZyb20sIG9wKTsgfVxuICAgIGVsc2UgeyB0aGlzLml0ZXJOKHRoaXMuZmlyc3QsIHRoaXMuZmlyc3QgKyB0aGlzLnNpemUsIGZyb20pOyB9XG4gIH0sXG5cbiAgLy8gTm9uLXB1YmxpYyBpbnRlcmZhY2UgZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgbGluZXMuXG4gIGluc2VydDogZnVuY3Rpb24oYXQsIGxpbmVzKSB7XG4gICAgdmFyIGhlaWdodCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgeyBoZWlnaHQgKz0gbGluZXNbaV0uaGVpZ2h0OyB9XG4gICAgdGhpcy5pbnNlcnRJbm5lcihhdCAtIHRoaXMuZmlyc3QsIGxpbmVzLCBoZWlnaHQpO1xuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKGF0LCBuKSB7IHRoaXMucmVtb3ZlSW5uZXIoYXQgLSB0aGlzLmZpcnN0LCBuKTsgfSxcblxuICAvLyBGcm9tIGhlcmUsIHRoZSBtZXRob2RzIGFyZSBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiBNb3N0XG4gIC8vIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIENvZGVNaXJyb3IgKGVkaXRvcikgaW5zdGFuY2VzLlxuXG4gIGdldFZhbHVlOiBmdW5jdGlvbihsaW5lU2VwKSB7XG4gICAgdmFyIGxpbmVzID0gZ2V0TGluZXModGhpcywgdGhpcy5maXJzdCwgdGhpcy5maXJzdCArIHRoaXMuc2l6ZSk7XG4gICAgaWYgKGxpbmVTZXAgPT09IGZhbHNlKSB7IHJldHVybiBsaW5lcyB9XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4obGluZVNlcCB8fCB0aGlzLmxpbmVTZXBhcmF0b3IoKSlcbiAgfSxcbiAgc2V0VmFsdWU6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGNvZGUpIHtcbiAgICB2YXIgdG9wID0gUG9zKHRoaXMuZmlyc3QsIDApLCBsYXN0ID0gdGhpcy5maXJzdCArIHRoaXMuc2l6ZSAtIDE7XG4gICAgbWFrZUNoYW5nZSh0aGlzLCB7ZnJvbTogdG9wLCB0bzogUG9zKGxhc3QsIGdldExpbmUodGhpcywgbGFzdCkudGV4dC5sZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuc3BsaXRMaW5lcyhjb2RlKSwgb3JpZ2luOiBcInNldFZhbHVlXCIsIGZ1bGw6IHRydWV9LCB0cnVlKTtcbiAgICBpZiAodGhpcy5jbSkgeyBzY3JvbGxUb0Nvb3Jkcyh0aGlzLmNtLCAwLCAwKTsgfVxuICAgIHNldFNlbGVjdGlvbih0aGlzLCBzaW1wbGVTZWxlY3Rpb24odG9wKSwgc2VsX2RvbnRTY3JvbGwpO1xuICB9KSxcbiAgcmVwbGFjZVJhbmdlOiBmdW5jdGlvbihjb2RlLCBmcm9tLCB0bywgb3JpZ2luKSB7XG4gICAgZnJvbSA9IGNsaXBQb3ModGhpcywgZnJvbSk7XG4gICAgdG8gPSB0byA/IGNsaXBQb3ModGhpcywgdG8pIDogZnJvbTtcbiAgICByZXBsYWNlUmFuZ2UodGhpcywgY29kZSwgZnJvbSwgdG8sIG9yaWdpbik7XG4gIH0sXG4gIGdldFJhbmdlOiBmdW5jdGlvbihmcm9tLCB0bywgbGluZVNlcCkge1xuICAgIHZhciBsaW5lcyA9IGdldEJldHdlZW4odGhpcywgY2xpcFBvcyh0aGlzLCBmcm9tKSwgY2xpcFBvcyh0aGlzLCB0bykpO1xuICAgIGlmIChsaW5lU2VwID09PSBmYWxzZSkgeyByZXR1cm4gbGluZXMgfVxuICAgIHJldHVybiBsaW5lcy5qb2luKGxpbmVTZXAgfHwgdGhpcy5saW5lU2VwYXJhdG9yKCkpXG4gIH0sXG5cbiAgZ2V0TGluZTogZnVuY3Rpb24obGluZSkge3ZhciBsID0gdGhpcy5nZXRMaW5lSGFuZGxlKGxpbmUpOyByZXR1cm4gbCAmJiBsLnRleHR9LFxuXG4gIGdldExpbmVIYW5kbGU6IGZ1bmN0aW9uKGxpbmUpIHtpZiAoaXNMaW5lKHRoaXMsIGxpbmUpKSB7IHJldHVybiBnZXRMaW5lKHRoaXMsIGxpbmUpIH19LFxuICBnZXRMaW5lTnVtYmVyOiBmdW5jdGlvbihsaW5lKSB7cmV0dXJuIGxpbmVObyhsaW5lKX0sXG5cbiAgZ2V0TGluZUhhbmRsZVZpc3VhbFN0YXJ0OiBmdW5jdGlvbihsaW5lKSB7XG4gICAgaWYgKHR5cGVvZiBsaW5lID09IFwibnVtYmVyXCIpIHsgbGluZSA9IGdldExpbmUodGhpcywgbGluZSk7IH1cbiAgICByZXR1cm4gdmlzdWFsTGluZShsaW5lKVxuICB9LFxuXG4gIGxpbmVDb3VudDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc2l6ZX0sXG4gIGZpcnN0TGluZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZmlyc3R9LFxuICBsYXN0TGluZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZmlyc3QgKyB0aGlzLnNpemUgLSAxfSxcblxuICBjbGlwUG9zOiBmdW5jdGlvbihwb3MpIHtyZXR1cm4gY2xpcFBvcyh0aGlzLCBwb3MpfSxcblxuICBnZXRDdXJzb3I6IGZ1bmN0aW9uKHN0YXJ0KSB7XG4gICAgdmFyIHJhbmdlJCQxID0gdGhpcy5zZWwucHJpbWFyeSgpLCBwb3M7XG4gICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPT0gXCJoZWFkXCIpIHsgcG9zID0gcmFuZ2UkJDEuaGVhZDsgfVxuICAgIGVsc2UgaWYgKHN0YXJ0ID09IFwiYW5jaG9yXCIpIHsgcG9zID0gcmFuZ2UkJDEuYW5jaG9yOyB9XG4gICAgZWxzZSBpZiAoc3RhcnQgPT0gXCJlbmRcIiB8fCBzdGFydCA9PSBcInRvXCIgfHwgc3RhcnQgPT09IGZhbHNlKSB7IHBvcyA9IHJhbmdlJCQxLnRvKCk7IH1cbiAgICBlbHNlIHsgcG9zID0gcmFuZ2UkJDEuZnJvbSgpOyB9XG4gICAgcmV0dXJuIHBvc1xuICB9LFxuICBsaXN0U2VsZWN0aW9uczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnNlbC5yYW5nZXMgfSxcbiAgc29tZXRoaW5nU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnNlbC5zb21ldGhpbmdTZWxlY3RlZCgpfSxcblxuICBzZXRDdXJzb3I6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGxpbmUsIGNoLCBvcHRpb25zKSB7XG4gICAgc2V0U2ltcGxlU2VsZWN0aW9uKHRoaXMsIGNsaXBQb3ModGhpcywgdHlwZW9mIGxpbmUgPT0gXCJudW1iZXJcIiA/IFBvcyhsaW5lLCBjaCB8fCAwKSA6IGxpbmUpLCBudWxsLCBvcHRpb25zKTtcbiAgfSksXG4gIHNldFNlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oYW5jaG9yLCBoZWFkLCBvcHRpb25zKSB7XG4gICAgc2V0U2ltcGxlU2VsZWN0aW9uKHRoaXMsIGNsaXBQb3ModGhpcywgYW5jaG9yKSwgY2xpcFBvcyh0aGlzLCBoZWFkIHx8IGFuY2hvciksIG9wdGlvbnMpO1xuICB9KSxcbiAgZXh0ZW5kU2VsZWN0aW9uOiBkb2NNZXRob2RPcChmdW5jdGlvbihoZWFkLCBvdGhlciwgb3B0aW9ucykge1xuICAgIGV4dGVuZFNlbGVjdGlvbih0aGlzLCBjbGlwUG9zKHRoaXMsIGhlYWQpLCBvdGhlciAmJiBjbGlwUG9zKHRoaXMsIG90aGVyKSwgb3B0aW9ucyk7XG4gIH0pLFxuICBleHRlbmRTZWxlY3Rpb25zOiBkb2NNZXRob2RPcChmdW5jdGlvbihoZWFkcywgb3B0aW9ucykge1xuICAgIGV4dGVuZFNlbGVjdGlvbnModGhpcywgY2xpcFBvc0FycmF5KHRoaXMsIGhlYWRzKSwgb3B0aW9ucyk7XG4gIH0pLFxuICBleHRlbmRTZWxlY3Rpb25zQnk6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGYsIG9wdGlvbnMpIHtcbiAgICB2YXIgaGVhZHMgPSBtYXAodGhpcy5zZWwucmFuZ2VzLCBmKTtcbiAgICBleHRlbmRTZWxlY3Rpb25zKHRoaXMsIGNsaXBQb3NBcnJheSh0aGlzLCBoZWFkcyksIG9wdGlvbnMpO1xuICB9KSxcbiAgc2V0U2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24ocmFuZ2VzLCBwcmltYXJ5LCBvcHRpb25zKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAoIXJhbmdlcy5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgICB2YXIgb3V0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICB7IG91dFtpXSA9IG5ldyBSYW5nZShjbGlwUG9zKHRoaXMkMSwgcmFuZ2VzW2ldLmFuY2hvciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBvcyh0aGlzJDEsIHJhbmdlc1tpXS5oZWFkKSk7IH1cbiAgICBpZiAocHJpbWFyeSA9PSBudWxsKSB7IHByaW1hcnkgPSBNYXRoLm1pbihyYW5nZXMubGVuZ3RoIC0gMSwgdGhpcy5zZWwucHJpbUluZGV4KTsgfVxuICAgIHNldFNlbGVjdGlvbih0aGlzLCBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBwcmltYXJ5KSwgb3B0aW9ucyk7XG4gIH0pLFxuICBhZGRTZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGFuY2hvciwgaGVhZCwgb3B0aW9ucykge1xuICAgIHZhciByYW5nZXMgPSB0aGlzLnNlbC5yYW5nZXMuc2xpY2UoMCk7XG4gICAgcmFuZ2VzLnB1c2gobmV3IFJhbmdlKGNsaXBQb3ModGhpcywgYW5jaG9yKSwgY2xpcFBvcyh0aGlzLCBoZWFkIHx8IGFuY2hvcikpKTtcbiAgICBzZXRTZWxlY3Rpb24odGhpcywgbm9ybWFsaXplU2VsZWN0aW9uKHJhbmdlcywgcmFuZ2VzLmxlbmd0aCAtIDEpLCBvcHRpb25zKTtcbiAgfSksXG5cbiAgZ2V0U2VsZWN0aW9uOiBmdW5jdGlvbihsaW5lU2VwKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcmFuZ2VzID0gdGhpcy5zZWwucmFuZ2VzLCBsaW5lcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlbCA9IGdldEJldHdlZW4odGhpcyQxLCByYW5nZXNbaV0uZnJvbSgpLCByYW5nZXNbaV0udG8oKSk7XG4gICAgICBsaW5lcyA9IGxpbmVzID8gbGluZXMuY29uY2F0KHNlbCkgOiBzZWw7XG4gICAgfVxuICAgIGlmIChsaW5lU2VwID09PSBmYWxzZSkgeyByZXR1cm4gbGluZXMgfVxuICAgIGVsc2UgeyByZXR1cm4gbGluZXMuam9pbihsaW5lU2VwIHx8IHRoaXMubGluZVNlcGFyYXRvcigpKSB9XG4gIH0sXG4gIGdldFNlbGVjdGlvbnM6IGZ1bmN0aW9uKGxpbmVTZXApIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBwYXJ0cyA9IFtdLCByYW5nZXMgPSB0aGlzLnNlbC5yYW5nZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWwgPSBnZXRCZXR3ZWVuKHRoaXMkMSwgcmFuZ2VzW2ldLmZyb20oKSwgcmFuZ2VzW2ldLnRvKCkpO1xuICAgICAgaWYgKGxpbmVTZXAgIT09IGZhbHNlKSB7IHNlbCA9IHNlbC5qb2luKGxpbmVTZXAgfHwgdGhpcyQxLmxpbmVTZXBhcmF0b3IoKSk7IH1cbiAgICAgIHBhcnRzW2ldID0gc2VsO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHNcbiAgfSxcbiAgcmVwbGFjZVNlbGVjdGlvbjogZnVuY3Rpb24oY29kZSwgY29sbGFwc2UsIG9yaWdpbikge1xuICAgIHZhciBkdXAgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VsLnJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICAgIHsgZHVwW2ldID0gY29kZTsgfVxuICAgIHRoaXMucmVwbGFjZVNlbGVjdGlvbnMoZHVwLCBjb2xsYXBzZSwgb3JpZ2luIHx8IFwiK2lucHV0XCIpO1xuICB9LFxuICByZXBsYWNlU2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24oY29kZSwgY29sbGFwc2UsIG9yaWdpbikge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIGNoYW5nZXMgPSBbXSwgc2VsID0gdGhpcy5zZWw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmFuZ2UkJDEgPSBzZWwucmFuZ2VzW2ldO1xuICAgICAgY2hhbmdlc1tpXSA9IHtmcm9tOiByYW5nZSQkMS5mcm9tKCksIHRvOiByYW5nZSQkMS50bygpLCB0ZXh0OiB0aGlzJDEuc3BsaXRMaW5lcyhjb2RlW2ldKSwgb3JpZ2luOiBvcmlnaW59O1xuICAgIH1cbiAgICB2YXIgbmV3U2VsID0gY29sbGFwc2UgJiYgY29sbGFwc2UgIT0gXCJlbmRcIiAmJiBjb21wdXRlUmVwbGFjZWRTZWwodGhpcywgY2hhbmdlcywgY29sbGFwc2UpO1xuICAgIGZvciAodmFyIGkkMSA9IGNoYW5nZXMubGVuZ3RoIC0gMTsgaSQxID49IDA7IGkkMS0tKVxuICAgICAgeyBtYWtlQ2hhbmdlKHRoaXMkMSwgY2hhbmdlc1tpJDFdKTsgfVxuICAgIGlmIChuZXdTZWwpIHsgc2V0U2VsZWN0aW9uUmVwbGFjZUhpc3RvcnkodGhpcywgbmV3U2VsKTsgfVxuICAgIGVsc2UgaWYgKHRoaXMuY20pIHsgZW5zdXJlQ3Vyc29yVmlzaWJsZSh0aGlzLmNtKTsgfVxuICB9KSxcbiAgdW5kbzogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsIFwidW5kb1wiKTt9KSxcbiAgcmVkbzogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsIFwicmVkb1wiKTt9KSxcbiAgdW5kb1NlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsIFwidW5kb1wiLCB0cnVlKTt9KSxcbiAgcmVkb1NlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsIFwicmVkb1wiLCB0cnVlKTt9KSxcblxuICBzZXRFeHRlbmRpbmc6IGZ1bmN0aW9uKHZhbCkge3RoaXMuZXh0ZW5kID0gdmFsO30sXG4gIGdldEV4dGVuZGluZzogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZXh0ZW5kfSxcblxuICBoaXN0b3J5U2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhpc3QgPSB0aGlzLmhpc3RvcnksIGRvbmUgPSAwLCB1bmRvbmUgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGlzdC5kb25lLmxlbmd0aDsgaSsrKSB7IGlmICghaGlzdC5kb25lW2ldLnJhbmdlcykgeyArK2RvbmU7IH0gfVxuICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGhpc3QudW5kb25lLmxlbmd0aDsgaSQxKyspIHsgaWYgKCFoaXN0LnVuZG9uZVtpJDFdLnJhbmdlcykgeyArK3VuZG9uZTsgfSB9XG4gICAgcmV0dXJuIHt1bmRvOiBkb25lLCByZWRvOiB1bmRvbmV9XG4gIH0sXG4gIGNsZWFySGlzdG9yeTogZnVuY3Rpb24oKSB7dGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkodGhpcy5oaXN0b3J5Lm1heEdlbmVyYXRpb24pO30sXG5cbiAgbWFya0NsZWFuOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmNsZWFuR2VuZXJhdGlvbiA9IHRoaXMuY2hhbmdlR2VuZXJhdGlvbih0cnVlKTtcbiAgfSxcbiAgY2hhbmdlR2VuZXJhdGlvbjogZnVuY3Rpb24oZm9yY2VTcGxpdCkge1xuICAgIGlmIChmb3JjZVNwbGl0KVxuICAgICAgeyB0aGlzLmhpc3RvcnkubGFzdE9wID0gdGhpcy5oaXN0b3J5Lmxhc3RTZWxPcCA9IHRoaXMuaGlzdG9yeS5sYXN0T3JpZ2luID0gbnVsbDsgfVxuICAgIHJldHVybiB0aGlzLmhpc3RvcnkuZ2VuZXJhdGlvblxuICB9LFxuICBpc0NsZWFuOiBmdW5jdGlvbiAoZ2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5nZW5lcmF0aW9uID09IChnZW4gfHwgdGhpcy5jbGVhbkdlbmVyYXRpb24pXG4gIH0sXG5cbiAgZ2V0SGlzdG9yeTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtkb25lOiBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS5kb25lKSxcbiAgICAgICAgICAgIHVuZG9uZTogY29weUhpc3RvcnlBcnJheSh0aGlzLmhpc3RvcnkudW5kb25lKX1cbiAgfSxcbiAgc2V0SGlzdG9yeTogZnVuY3Rpb24oaGlzdERhdGEpIHtcbiAgICB2YXIgaGlzdCA9IHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KHRoaXMuaGlzdG9yeS5tYXhHZW5lcmF0aW9uKTtcbiAgICBoaXN0LmRvbmUgPSBjb3B5SGlzdG9yeUFycmF5KGhpc3REYXRhLmRvbmUuc2xpY2UoMCksIG51bGwsIHRydWUpO1xuICAgIGhpc3QudW5kb25lID0gY29weUhpc3RvcnlBcnJheShoaXN0RGF0YS51bmRvbmUuc2xpY2UoMCksIG51bGwsIHRydWUpO1xuICB9LFxuXG4gIHNldEd1dHRlck1hcmtlcjogZG9jTWV0aG9kT3AoZnVuY3Rpb24obGluZSwgZ3V0dGVySUQsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGNoYW5nZUxpbmUodGhpcywgbGluZSwgXCJndXR0ZXJcIiwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIHZhciBtYXJrZXJzID0gbGluZS5ndXR0ZXJNYXJrZXJzIHx8IChsaW5lLmd1dHRlck1hcmtlcnMgPSB7fSk7XG4gICAgICBtYXJrZXJzW2d1dHRlcklEXSA9IHZhbHVlO1xuICAgICAgaWYgKCF2YWx1ZSAmJiBpc0VtcHR5KG1hcmtlcnMpKSB7IGxpbmUuZ3V0dGVyTWFya2VycyA9IG51bGw7IH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSlcbiAgfSksXG5cbiAgY2xlYXJHdXR0ZXI6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGd1dHRlcklEKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB0aGlzLml0ZXIoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChsaW5lLmd1dHRlck1hcmtlcnMgJiYgbGluZS5ndXR0ZXJNYXJrZXJzW2d1dHRlcklEXSkge1xuICAgICAgICBjaGFuZ2VMaW5lKHRoaXMkMSwgbGluZSwgXCJndXR0ZXJcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxpbmUuZ3V0dGVyTWFya2Vyc1tndXR0ZXJJRF0gPSBudWxsO1xuICAgICAgICAgIGlmIChpc0VtcHR5KGxpbmUuZ3V0dGVyTWFya2VycykpIHsgbGluZS5ndXR0ZXJNYXJrZXJzID0gbnVsbDsgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KSxcblxuICBsaW5lSW5mbzogZnVuY3Rpb24obGluZSkge1xuICAgIHZhciBuO1xuICAgIGlmICh0eXBlb2YgbGluZSA9PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAoIWlzTGluZSh0aGlzLCBsaW5lKSkgeyByZXR1cm4gbnVsbCB9XG4gICAgICBuID0gbGluZTtcbiAgICAgIGxpbmUgPSBnZXRMaW5lKHRoaXMsIGxpbmUpO1xuICAgICAgaWYgKCFsaW5lKSB7IHJldHVybiBudWxsIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbiA9IGxpbmVObyhsaW5lKTtcbiAgICAgIGlmIChuID09IG51bGwpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgICByZXR1cm4ge2xpbmU6IG4sIGhhbmRsZTogbGluZSwgdGV4dDogbGluZS50ZXh0LCBndXR0ZXJNYXJrZXJzOiBsaW5lLmd1dHRlck1hcmtlcnMsXG4gICAgICAgICAgICB0ZXh0Q2xhc3M6IGxpbmUudGV4dENsYXNzLCBiZ0NsYXNzOiBsaW5lLmJnQ2xhc3MsIHdyYXBDbGFzczogbGluZS53cmFwQ2xhc3MsXG4gICAgICAgICAgICB3aWRnZXRzOiBsaW5lLndpZGdldHN9XG4gIH0sXG5cbiAgYWRkTGluZUNsYXNzOiBkb2NNZXRob2RPcChmdW5jdGlvbihoYW5kbGUsIHdoZXJlLCBjbHMpIHtcbiAgICByZXR1cm4gY2hhbmdlTGluZSh0aGlzLCBoYW5kbGUsIHdoZXJlID09IFwiZ3V0dGVyXCIgPyBcImd1dHRlclwiIDogXCJjbGFzc1wiLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgdmFyIHByb3AgPSB3aGVyZSA9PSBcInRleHRcIiA/IFwidGV4dENsYXNzXCJcbiAgICAgICAgICAgICAgIDogd2hlcmUgPT0gXCJiYWNrZ3JvdW5kXCIgPyBcImJnQ2xhc3NcIlxuICAgICAgICAgICAgICAgOiB3aGVyZSA9PSBcImd1dHRlclwiID8gXCJndXR0ZXJDbGFzc1wiIDogXCJ3cmFwQ2xhc3NcIjtcbiAgICAgIGlmICghbGluZVtwcm9wXSkgeyBsaW5lW3Byb3BdID0gY2xzOyB9XG4gICAgICBlbHNlIGlmIChjbGFzc1Rlc3QoY2xzKS50ZXN0KGxpbmVbcHJvcF0pKSB7IHJldHVybiBmYWxzZSB9XG4gICAgICBlbHNlIHsgbGluZVtwcm9wXSArPSBcIiBcIiArIGNsczsgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9KVxuICB9KSxcbiAgcmVtb3ZlTGluZUNsYXNzOiBkb2NNZXRob2RPcChmdW5jdGlvbihoYW5kbGUsIHdoZXJlLCBjbHMpIHtcbiAgICByZXR1cm4gY2hhbmdlTGluZSh0aGlzLCBoYW5kbGUsIHdoZXJlID09IFwiZ3V0dGVyXCIgPyBcImd1dHRlclwiIDogXCJjbGFzc1wiLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgdmFyIHByb3AgPSB3aGVyZSA9PSBcInRleHRcIiA/IFwidGV4dENsYXNzXCJcbiAgICAgICAgICAgICAgIDogd2hlcmUgPT0gXCJiYWNrZ3JvdW5kXCIgPyBcImJnQ2xhc3NcIlxuICAgICAgICAgICAgICAgOiB3aGVyZSA9PSBcImd1dHRlclwiID8gXCJndXR0ZXJDbGFzc1wiIDogXCJ3cmFwQ2xhc3NcIjtcbiAgICAgIHZhciBjdXIgPSBsaW5lW3Byb3BdO1xuICAgICAgaWYgKCFjdXIpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICAgIGVsc2UgaWYgKGNscyA9PSBudWxsKSB7IGxpbmVbcHJvcF0gPSBudWxsOyB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGZvdW5kID0gY3VyLm1hdGNoKGNsYXNzVGVzdChjbHMpKTtcbiAgICAgICAgaWYgKCFmb3VuZCkgeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICB2YXIgZW5kID0gZm91bmQuaW5kZXggKyBmb3VuZFswXS5sZW5ndGg7XG4gICAgICAgIGxpbmVbcHJvcF0gPSBjdXIuc2xpY2UoMCwgZm91bmQuaW5kZXgpICsgKCFmb3VuZC5pbmRleCB8fCBlbmQgPT0gY3VyLmxlbmd0aCA/IFwiXCIgOiBcIiBcIikgKyBjdXIuc2xpY2UoZW5kKSB8fCBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9KVxuICB9KSxcblxuICBhZGRMaW5lV2lkZ2V0OiBkb2NNZXRob2RPcChmdW5jdGlvbihoYW5kbGUsIG5vZGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gYWRkTGluZVdpZGdldCh0aGlzLCBoYW5kbGUsIG5vZGUsIG9wdGlvbnMpXG4gIH0pLFxuICByZW1vdmVMaW5lV2lkZ2V0OiBmdW5jdGlvbih3aWRnZXQpIHsgd2lkZ2V0LmNsZWFyKCk7IH0sXG5cbiAgbWFya1RleHQ6IGZ1bmN0aW9uKGZyb20sIHRvLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG1hcmtUZXh0KHRoaXMsIGNsaXBQb3ModGhpcywgZnJvbSksIGNsaXBQb3ModGhpcywgdG8pLCBvcHRpb25zLCBvcHRpb25zICYmIG9wdGlvbnMudHlwZSB8fCBcInJhbmdlXCIpXG4gIH0sXG4gIHNldEJvb2ttYXJrOiBmdW5jdGlvbihwb3MsIG9wdGlvbnMpIHtcbiAgICB2YXIgcmVhbE9wdHMgPSB7cmVwbGFjZWRXaXRoOiBvcHRpb25zICYmIChvcHRpb25zLm5vZGVUeXBlID09IG51bGwgPyBvcHRpb25zLndpZGdldCA6IG9wdGlvbnMpLFxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRMZWZ0OiBvcHRpb25zICYmIG9wdGlvbnMuaW5zZXJ0TGVmdCxcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJXaGVuRW1wdHk6IGZhbHNlLCBzaGFyZWQ6IG9wdGlvbnMgJiYgb3B0aW9ucy5zaGFyZWQsXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU1vdXNlRXZlbnRzOiBvcHRpb25zICYmIG9wdGlvbnMuaGFuZGxlTW91c2VFdmVudHN9O1xuICAgIHBvcyA9IGNsaXBQb3ModGhpcywgcG9zKTtcbiAgICByZXR1cm4gbWFya1RleHQodGhpcywgcG9zLCBwb3MsIHJlYWxPcHRzLCBcImJvb2ttYXJrXCIpXG4gIH0sXG4gIGZpbmRNYXJrc0F0OiBmdW5jdGlvbihwb3MpIHtcbiAgICBwb3MgPSBjbGlwUG9zKHRoaXMsIHBvcyk7XG4gICAgdmFyIG1hcmtlcnMgPSBbXSwgc3BhbnMgPSBnZXRMaW5lKHRoaXMsIHBvcy5saW5lKS5tYXJrZWRTcGFucztcbiAgICBpZiAoc3BhbnMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHNwYW4gPSBzcGFuc1tpXTtcbiAgICAgIGlmICgoc3Bhbi5mcm9tID09IG51bGwgfHwgc3Bhbi5mcm9tIDw9IHBvcy5jaCkgJiZcbiAgICAgICAgICAoc3Bhbi50byA9PSBudWxsIHx8IHNwYW4udG8gPj0gcG9zLmNoKSlcbiAgICAgICAgeyBtYXJrZXJzLnB1c2goc3Bhbi5tYXJrZXIucGFyZW50IHx8IHNwYW4ubWFya2VyKTsgfVxuICAgIH0gfVxuICAgIHJldHVybiBtYXJrZXJzXG4gIH0sXG4gIGZpbmRNYXJrczogZnVuY3Rpb24oZnJvbSwgdG8sIGZpbHRlcikge1xuICAgIGZyb20gPSBjbGlwUG9zKHRoaXMsIGZyb20pOyB0byA9IGNsaXBQb3ModGhpcywgdG8pO1xuICAgIHZhciBmb3VuZCA9IFtdLCBsaW5lTm8kJDEgPSBmcm9tLmxpbmU7XG4gICAgdGhpcy5pdGVyKGZyb20ubGluZSwgdG8ubGluZSArIDEsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICB2YXIgc3BhbnMgPSBsaW5lLm1hcmtlZFNwYW5zO1xuICAgICAgaWYgKHNwYW5zKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNwYW4gPSBzcGFuc1tpXTtcbiAgICAgICAgaWYgKCEoc3Bhbi50byAhPSBudWxsICYmIGxpbmVObyQkMSA9PSBmcm9tLmxpbmUgJiYgZnJvbS5jaCA+PSBzcGFuLnRvIHx8XG4gICAgICAgICAgICAgIHNwYW4uZnJvbSA9PSBudWxsICYmIGxpbmVObyQkMSAhPSBmcm9tLmxpbmUgfHxcbiAgICAgICAgICAgICAgc3Bhbi5mcm9tICE9IG51bGwgJiYgbGluZU5vJCQxID09IHRvLmxpbmUgJiYgc3Bhbi5mcm9tID49IHRvLmNoKSAmJlxuICAgICAgICAgICAgKCFmaWx0ZXIgfHwgZmlsdGVyKHNwYW4ubWFya2VyKSkpXG4gICAgICAgICAgeyBmb3VuZC5wdXNoKHNwYW4ubWFya2VyLnBhcmVudCB8fCBzcGFuLm1hcmtlcik7IH1cbiAgICAgIH0gfVxuICAgICAgKytsaW5lTm8kJDE7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvdW5kXG4gIH0sXG4gIGdldEFsbE1hcmtzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbWFya2VycyA9IFtdO1xuICAgIHRoaXMuaXRlcihmdW5jdGlvbiAobGluZSkge1xuICAgICAgdmFyIHNwcyA9IGxpbmUubWFya2VkU3BhbnM7XG4gICAgICBpZiAoc3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgc3BzLmxlbmd0aDsgKytpKVxuICAgICAgICB7IGlmIChzcHNbaV0uZnJvbSAhPSBudWxsKSB7IG1hcmtlcnMucHVzaChzcHNbaV0ubWFya2VyKTsgfSB9IH1cbiAgICB9KTtcbiAgICByZXR1cm4gbWFya2Vyc1xuICB9LFxuXG4gIHBvc0Zyb21JbmRleDogZnVuY3Rpb24ob2ZmKSB7XG4gICAgdmFyIGNoLCBsaW5lTm8kJDEgPSB0aGlzLmZpcnN0LCBzZXBTaXplID0gdGhpcy5saW5lU2VwYXJhdG9yKCkubGVuZ3RoO1xuICAgIHRoaXMuaXRlcihmdW5jdGlvbiAobGluZSkge1xuICAgICAgdmFyIHN6ID0gbGluZS50ZXh0Lmxlbmd0aCArIHNlcFNpemU7XG4gICAgICBpZiAoc3ogPiBvZmYpIHsgY2ggPSBvZmY7IHJldHVybiB0cnVlIH1cbiAgICAgIG9mZiAtPSBzejtcbiAgICAgICsrbGluZU5vJCQxO1xuICAgIH0pO1xuICAgIHJldHVybiBjbGlwUG9zKHRoaXMsIFBvcyhsaW5lTm8kJDEsIGNoKSlcbiAgfSxcbiAgaW5kZXhGcm9tUG9zOiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgY29vcmRzID0gY2xpcFBvcyh0aGlzLCBjb29yZHMpO1xuICAgIHZhciBpbmRleCA9IGNvb3Jkcy5jaDtcbiAgICBpZiAoY29vcmRzLmxpbmUgPCB0aGlzLmZpcnN0IHx8IGNvb3Jkcy5jaCA8IDApIHsgcmV0dXJuIDAgfVxuICAgIHZhciBzZXBTaXplID0gdGhpcy5saW5lU2VwYXJhdG9yKCkubGVuZ3RoO1xuICAgIHRoaXMuaXRlcih0aGlzLmZpcnN0LCBjb29yZHMubGluZSwgZnVuY3Rpb24gKGxpbmUpIHsgLy8gaXRlciBhYm9ydHMgd2hlbiBjYWxsYmFjayByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlXG4gICAgICBpbmRleCArPSBsaW5lLnRleHQubGVuZ3RoICsgc2VwU2l6ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gaW5kZXhcbiAgfSxcblxuICBjb3B5OiBmdW5jdGlvbihjb3B5SGlzdG9yeSkge1xuICAgIHZhciBkb2MgPSBuZXcgRG9jKGdldExpbmVzKHRoaXMsIHRoaXMuZmlyc3QsIHRoaXMuZmlyc3QgKyB0aGlzLnNpemUpLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZU9wdGlvbiwgdGhpcy5maXJzdCwgdGhpcy5saW5lU2VwLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgZG9jLnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsVG9wOyBkb2Muc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsTGVmdDtcbiAgICBkb2Muc2VsID0gdGhpcy5zZWw7XG4gICAgZG9jLmV4dGVuZCA9IGZhbHNlO1xuICAgIGlmIChjb3B5SGlzdG9yeSkge1xuICAgICAgZG9jLmhpc3RvcnkudW5kb0RlcHRoID0gdGhpcy5oaXN0b3J5LnVuZG9EZXB0aDtcbiAgICAgIGRvYy5zZXRIaXN0b3J5KHRoaXMuZ2V0SGlzdG9yeSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGRvY1xuICB9LFxuXG4gIGxpbmtlZERvYzogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgZnJvbSA9IHRoaXMuZmlyc3QsIHRvID0gdGhpcy5maXJzdCArIHRoaXMuc2l6ZTtcbiAgICBpZiAob3B0aW9ucy5mcm9tICE9IG51bGwgJiYgb3B0aW9ucy5mcm9tID4gZnJvbSkgeyBmcm9tID0gb3B0aW9ucy5mcm9tOyB9XG4gICAgaWYgKG9wdGlvbnMudG8gIT0gbnVsbCAmJiBvcHRpb25zLnRvIDwgdG8pIHsgdG8gPSBvcHRpb25zLnRvOyB9XG4gICAgdmFyIGNvcHkgPSBuZXcgRG9jKGdldExpbmVzKHRoaXMsIGZyb20sIHRvKSwgb3B0aW9ucy5tb2RlIHx8IHRoaXMubW9kZU9wdGlvbiwgZnJvbSwgdGhpcy5saW5lU2VwLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgaWYgKG9wdGlvbnMuc2hhcmVkSGlzdCkgeyBjb3B5Lmhpc3RvcnkgPSB0aGlzLmhpc3RvcnlcbiAgICA7IH0odGhpcy5saW5rZWQgfHwgKHRoaXMubGlua2VkID0gW10pKS5wdXNoKHtkb2M6IGNvcHksIHNoYXJlZEhpc3Q6IG9wdGlvbnMuc2hhcmVkSGlzdH0pO1xuICAgIGNvcHkubGlua2VkID0gW3tkb2M6IHRoaXMsIGlzUGFyZW50OiB0cnVlLCBzaGFyZWRIaXN0OiBvcHRpb25zLnNoYXJlZEhpc3R9XTtcbiAgICBjb3B5U2hhcmVkTWFya2Vycyhjb3B5LCBmaW5kU2hhcmVkTWFya2Vycyh0aGlzKSk7XG4gICAgcmV0dXJuIGNvcHlcbiAgfSxcbiAgdW5saW5rRG9jOiBmdW5jdGlvbihvdGhlcikge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQ29kZU1pcnJvciQxKSB7IG90aGVyID0gb3RoZXIuZG9jOyB9XG4gICAgaWYgKHRoaXMubGlua2VkKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saW5rZWQubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBsaW5rID0gdGhpcyQxLmxpbmtlZFtpXTtcbiAgICAgIGlmIChsaW5rLmRvYyAhPSBvdGhlcikgeyBjb250aW51ZSB9XG4gICAgICB0aGlzJDEubGlua2VkLnNwbGljZShpLCAxKTtcbiAgICAgIG90aGVyLnVubGlua0RvYyh0aGlzJDEpO1xuICAgICAgZGV0YWNoU2hhcmVkTWFya2VycyhmaW5kU2hhcmVkTWFya2Vycyh0aGlzJDEpKTtcbiAgICAgIGJyZWFrXG4gICAgfSB9XG4gICAgLy8gSWYgdGhlIGhpc3RvcmllcyB3ZXJlIHNoYXJlZCwgc3BsaXQgdGhlbSBhZ2FpblxuICAgIGlmIChvdGhlci5oaXN0b3J5ID09IHRoaXMuaGlzdG9yeSkge1xuICAgICAgdmFyIHNwbGl0SWRzID0gW290aGVyLmlkXTtcbiAgICAgIGxpbmtlZERvY3Mob3RoZXIsIGZ1bmN0aW9uIChkb2MpIHsgcmV0dXJuIHNwbGl0SWRzLnB1c2goZG9jLmlkKTsgfSwgdHJ1ZSk7XG4gICAgICBvdGhlci5oaXN0b3J5ID0gbmV3IEhpc3RvcnkobnVsbCk7XG4gICAgICBvdGhlci5oaXN0b3J5LmRvbmUgPSBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS5kb25lLCBzcGxpdElkcyk7XG4gICAgICBvdGhlci5oaXN0b3J5LnVuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkodGhpcy5oaXN0b3J5LnVuZG9uZSwgc3BsaXRJZHMpO1xuICAgIH1cbiAgfSxcbiAgaXRlckxpbmtlZERvY3M6IGZ1bmN0aW9uKGYpIHtsaW5rZWREb2NzKHRoaXMsIGYpO30sXG5cbiAgZ2V0TW9kZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMubW9kZX0sXG4gIGdldEVkaXRvcjogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuY219LFxuXG4gIHNwbGl0TGluZXM6IGZ1bmN0aW9uKHN0cikge1xuICAgIGlmICh0aGlzLmxpbmVTZXApIHsgcmV0dXJuIHN0ci5zcGxpdCh0aGlzLmxpbmVTZXApIH1cbiAgICByZXR1cm4gc3BsaXRMaW5lc0F1dG8oc3RyKVxuICB9LFxuICBsaW5lU2VwYXJhdG9yOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubGluZVNlcCB8fCBcIlxcblwiIH0sXG5cbiAgc2V0RGlyZWN0aW9uOiBkb2NNZXRob2RPcChmdW5jdGlvbiAoZGlyKSB7XG4gICAgaWYgKGRpciAhPSBcInJ0bFwiKSB7IGRpciA9IFwibHRyXCI7IH1cbiAgICBpZiAoZGlyID09IHRoaXMuZGlyZWN0aW9uKSB7IHJldHVybiB9XG4gICAgdGhpcy5kaXJlY3Rpb24gPSBkaXI7XG4gICAgdGhpcy5pdGVyKGZ1bmN0aW9uIChsaW5lKSB7IHJldHVybiBsaW5lLm9yZGVyID0gbnVsbDsgfSk7XG4gICAgaWYgKHRoaXMuY20pIHsgZGlyZWN0aW9uQ2hhbmdlZCh0aGlzLmNtKTsgfVxuICB9KVxufSk7XG5cbi8vIFB1YmxpYyBhbGlhcy5cbkRvYy5wcm90b3R5cGUuZWFjaExpbmUgPSBEb2MucHJvdG90eXBlLml0ZXI7XG5cbi8vIEtsdWRnZSB0byB3b3JrIGFyb3VuZCBzdHJhbmdlIElFIGJlaGF2aW9yIHdoZXJlIGl0J2xsIHNvbWV0aW1lc1xuLy8gcmUtZmlyZSBhIHNlcmllcyBvZiBkcmFnLXJlbGF0ZWQgZXZlbnRzIHJpZ2h0IGFmdGVyIHRoZSBkcm9wICgjMTU1MSlcbnZhciBsYXN0RHJvcCA9IDA7XG5cbmZ1bmN0aW9uIG9uRHJvcChlKSB7XG4gIHZhciBjbSA9IHRoaXM7XG4gIGNsZWFyRHJhZ0N1cnNvcihjbSk7XG4gIGlmIChzaWduYWxET01FdmVudChjbSwgZSkgfHwgZXZlbnRJbldpZGdldChjbS5kaXNwbGF5LCBlKSlcbiAgICB7IHJldHVybiB9XG4gIGVfcHJldmVudERlZmF1bHQoZSk7XG4gIGlmIChpZSkgeyBsYXN0RHJvcCA9ICtuZXcgRGF0ZTsgfVxuICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlLCB0cnVlKSwgZmlsZXMgPSBlLmRhdGFUcmFuc2Zlci5maWxlcztcbiAgaWYgKCFwb3MgfHwgY20uaXNSZWFkT25seSgpKSB7IHJldHVybiB9XG4gIC8vIE1pZ2h0IGJlIGEgZmlsZSBkcm9wLCBpbiB3aGljaCBjYXNlIHdlIHNpbXBseSBleHRyYWN0IHRoZSB0ZXh0XG4gIC8vIGFuZCBpbnNlcnQgaXQuXG4gIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggJiYgd2luZG93LkZpbGVSZWFkZXIgJiYgd2luZG93LkZpbGUpIHtcbiAgICB2YXIgbiA9IGZpbGVzLmxlbmd0aCwgdGV4dCA9IEFycmF5KG4pLCByZWFkID0gMDtcbiAgICB2YXIgbG9hZEZpbGUgPSBmdW5jdGlvbiAoZmlsZSwgaSkge1xuICAgICAgaWYgKGNtLm9wdGlvbnMuYWxsb3dEcm9wRmlsZVR5cGVzICYmXG4gICAgICAgICAgaW5kZXhPZihjbS5vcHRpb25zLmFsbG93RHJvcEZpbGVUeXBlcywgZmlsZS50eXBlKSA9PSAtMSlcbiAgICAgICAgeyByZXR1cm4gfVxuXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXI7XG4gICAgICByZWFkZXIub25sb2FkID0gb3BlcmF0aW9uKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb250ZW50ID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgaWYgKC9bXFx4MDAtXFx4MDhcXHgwZS1cXHgxZl17Mn0vLnRlc3QoY29udGVudCkpIHsgY29udGVudCA9IFwiXCI7IH1cbiAgICAgICAgdGV4dFtpXSA9IGNvbnRlbnQ7XG4gICAgICAgIGlmICgrK3JlYWQgPT0gbikge1xuICAgICAgICAgIHBvcyA9IGNsaXBQb3MoY20uZG9jLCBwb3MpO1xuICAgICAgICAgIHZhciBjaGFuZ2UgPSB7ZnJvbTogcG9zLCB0bzogcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogY20uZG9jLnNwbGl0TGluZXModGV4dC5qb2luKGNtLmRvYy5saW5lU2VwYXJhdG9yKCkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjogXCJwYXN0ZVwifTtcbiAgICAgICAgICBtYWtlQ2hhbmdlKGNtLmRvYywgY2hhbmdlKTtcbiAgICAgICAgICBzZXRTZWxlY3Rpb25SZXBsYWNlSGlzdG9yeShjbS5kb2MsIHNpbXBsZVNlbGVjdGlvbihwb3MsIGNoYW5nZUVuZChjaGFuZ2UpKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgeyBsb2FkRmlsZShmaWxlc1tpXSwgaSk7IH1cbiAgfSBlbHNlIHsgLy8gTm9ybWFsIGRyb3BcbiAgICAvLyBEb24ndCBkbyBhIHJlcGxhY2UgaWYgdGhlIGRyb3AgaGFwcGVuZWQgaW5zaWRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LlxuICAgIGlmIChjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgJiYgY20uZG9jLnNlbC5jb250YWlucyhwb3MpID4gLTEpIHtcbiAgICAgIGNtLnN0YXRlLmRyYWdnaW5nVGV4dChlKTtcbiAgICAgIC8vIEVuc3VyZSB0aGUgZWRpdG9yIGlzIHJlLWZvY3VzZWRcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gY20uZGlzcGxheS5pbnB1dC5mb2N1cygpOyB9LCAyMCk7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHZhciB0ZXh0JDEgPSBlLmRhdGFUcmFuc2Zlci5nZXREYXRhKFwiVGV4dFwiKTtcbiAgICAgIGlmICh0ZXh0JDEpIHtcbiAgICAgICAgdmFyIHNlbGVjdGVkO1xuICAgICAgICBpZiAoY20uc3RhdGUuZHJhZ2dpbmdUZXh0ICYmICFjbS5zdGF0ZS5kcmFnZ2luZ1RleHQuY29weSlcbiAgICAgICAgICB7IHNlbGVjdGVkID0gY20ubGlzdFNlbGVjdGlvbnMoKTsgfVxuICAgICAgICBzZXRTZWxlY3Rpb25Ob1VuZG8oY20uZG9jLCBzaW1wbGVTZWxlY3Rpb24ocG9zLCBwb3MpKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkKSB7IGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHNlbGVjdGVkLmxlbmd0aDsgKytpJDEpXG4gICAgICAgICAgeyByZXBsYWNlUmFuZ2UoY20uZG9jLCBcIlwiLCBzZWxlY3RlZFtpJDFdLmFuY2hvciwgc2VsZWN0ZWRbaSQxXS5oZWFkLCBcImRyYWdcIik7IH0gfVxuICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKHRleHQkMSwgXCJhcm91bmRcIiwgXCJwYXN0ZVwiKTtcbiAgICAgICAgY20uZGlzcGxheS5pbnB1dC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKXt9XG4gIH1cbn1cblxuZnVuY3Rpb24gb25EcmFnU3RhcnQoY20sIGUpIHtcbiAgaWYgKGllICYmICghY20uc3RhdGUuZHJhZ2dpbmdUZXh0IHx8ICtuZXcgRGF0ZSAtIGxhc3REcm9wIDwgMTAwKSkgeyBlX3N0b3AoZSk7IHJldHVybiB9XG4gIGlmIChzaWduYWxET01FdmVudChjbSwgZSkgfHwgZXZlbnRJbldpZGdldChjbS5kaXNwbGF5LCBlKSkgeyByZXR1cm4gfVxuXG4gIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJUZXh0XCIsIGNtLmdldFNlbGVjdGlvbigpKTtcbiAgZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IFwiY29weU1vdmVcIjtcblxuICAvLyBVc2UgZHVtbXkgaW1hZ2UgaW5zdGVhZCBvZiBkZWZhdWx0IGJyb3dzZXJzIGltYWdlLlxuICAvLyBSZWNlbnQgU2FmYXJpICh+Ni4wLjIpIGhhdmUgYSB0ZW5kZW5jeSB0byBzZWdmYXVsdCB3aGVuIHRoaXMgaGFwcGVucywgc28gd2UgZG9uJ3QgZG8gaXQgdGhlcmUuXG4gIGlmIChlLmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UgJiYgIXNhZmFyaSkge1xuICAgIHZhciBpbWcgPSBlbHQoXCJpbWdcIiwgbnVsbCwgbnVsbCwgXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IDA7IHRvcDogMDtcIik7XG4gICAgaW1nLnNyYyA9IFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT1cIjtcbiAgICBpZiAocHJlc3RvKSB7XG4gICAgICBpbWcud2lkdGggPSBpbWcuaGVpZ2h0ID0gMTtcbiAgICAgIGNtLmRpc3BsYXkud3JhcHBlci5hcHBlbmRDaGlsZChpbWcpO1xuICAgICAgLy8gRm9yY2UgYSByZWxheW91dCwgb3IgT3BlcmEgd29uJ3QgdXNlIG91ciBpbWFnZSBmb3Igc29tZSBvYnNjdXJlIHJlYXNvblxuICAgICAgaW1nLl90b3AgPSBpbWcub2Zmc2V0VG9wO1xuICAgIH1cbiAgICBlLmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UoaW1nLCAwLCAwKTtcbiAgICBpZiAocHJlc3RvKSB7IGltZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGltZyk7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvbkRyYWdPdmVyKGNtLCBlKSB7XG4gIHZhciBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUpO1xuICBpZiAoIXBvcykgeyByZXR1cm4gfVxuICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgZHJhd1NlbGVjdGlvbkN1cnNvcihjbSwgcG9zLCBmcmFnKTtcbiAgaWYgKCFjbS5kaXNwbGF5LmRyYWdDdXJzb3IpIHtcbiAgICBjbS5kaXNwbGF5LmRyYWdDdXJzb3IgPSBlbHQoXCJkaXZcIiwgbnVsbCwgXCJDb2RlTWlycm9yLWN1cnNvcnMgQ29kZU1pcnJvci1kcmFnY3Vyc29yc1wiKTtcbiAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5pbnNlcnRCZWZvcmUoY20uZGlzcGxheS5kcmFnQ3Vyc29yLCBjbS5kaXNwbGF5LmN1cnNvckRpdik7XG4gIH1cbiAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoY20uZGlzcGxheS5kcmFnQ3Vyc29yLCBmcmFnKTtcbn1cblxuZnVuY3Rpb24gY2xlYXJEcmFnQ3Vyc29yKGNtKSB7XG4gIGlmIChjbS5kaXNwbGF5LmRyYWdDdXJzb3IpIHtcbiAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5yZW1vdmVDaGlsZChjbS5kaXNwbGF5LmRyYWdDdXJzb3IpO1xuICAgIGNtLmRpc3BsYXkuZHJhZ0N1cnNvciA9IG51bGw7XG4gIH1cbn1cblxuLy8gVGhlc2UgbXVzdCBiZSBoYW5kbGVkIGNhcmVmdWxseSwgYmVjYXVzZSBuYWl2ZWx5IHJlZ2lzdGVyaW5nIGFcbi8vIGhhbmRsZXIgZm9yIGVhY2ggZWRpdG9yIHdpbGwgY2F1c2UgdGhlIGVkaXRvcnMgdG8gbmV2ZXIgYmVcbi8vIGdhcmJhZ2UgY29sbGVjdGVkLlxuXG5mdW5jdGlvbiBmb3JFYWNoQ29kZU1pcnJvcihmKSB7XG4gIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgeyByZXR1cm4gfVxuICB2YXIgYnlDbGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJDb2RlTWlycm9yXCIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5Q2xhc3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY20gPSBieUNsYXNzW2ldLkNvZGVNaXJyb3I7XG4gICAgaWYgKGNtKSB7IGYoY20pOyB9XG4gIH1cbn1cblxudmFyIGdsb2JhbHNSZWdpc3RlcmVkID0gZmFsc2U7XG5mdW5jdGlvbiBlbnN1cmVHbG9iYWxIYW5kbGVycygpIHtcbiAgaWYgKGdsb2JhbHNSZWdpc3RlcmVkKSB7IHJldHVybiB9XG4gIHJlZ2lzdGVyR2xvYmFsSGFuZGxlcnMoKTtcbiAgZ2xvYmFsc1JlZ2lzdGVyZWQgPSB0cnVlO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJHbG9iYWxIYW5kbGVycygpIHtcbiAgLy8gV2hlbiB0aGUgd2luZG93IHJlc2l6ZXMsIHdlIG5lZWQgdG8gcmVmcmVzaCBhY3RpdmUgZWRpdG9ycy5cbiAgdmFyIHJlc2l6ZVRpbWVyO1xuICBvbih3aW5kb3csIFwicmVzaXplXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmVzaXplVGltZXIgPT0gbnVsbCkgeyByZXNpemVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVzaXplVGltZXIgPSBudWxsO1xuICAgICAgZm9yRWFjaENvZGVNaXJyb3Iob25SZXNpemUpO1xuICAgIH0sIDEwMCk7IH1cbiAgfSk7XG4gIC8vIFdoZW4gdGhlIHdpbmRvdyBsb3NlcyBmb2N1cywgd2Ugd2FudCB0byBzaG93IHRoZSBlZGl0b3IgYXMgYmx1cnJlZFxuICBvbih3aW5kb3csIFwiYmx1clwiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmb3JFYWNoQ29kZU1pcnJvcihvbkJsdXIpOyB9KTtcbn1cbi8vIENhbGxlZCB3aGVuIHRoZSB3aW5kb3cgcmVzaXplc1xuZnVuY3Rpb24gb25SZXNpemUoY20pIHtcbiAgdmFyIGQgPSBjbS5kaXNwbGF5O1xuICBpZiAoZC5sYXN0V3JhcEhlaWdodCA9PSBkLndyYXBwZXIuY2xpZW50SGVpZ2h0ICYmIGQubGFzdFdyYXBXaWR0aCA9PSBkLndyYXBwZXIuY2xpZW50V2lkdGgpXG4gICAgeyByZXR1cm4gfVxuICAvLyBNaWdodCBiZSBhIHRleHQgc2NhbGluZyBvcGVyYXRpb24sIGNsZWFyIHNpemUgY2FjaGVzLlxuICBkLmNhY2hlZENoYXJXaWR0aCA9IGQuY2FjaGVkVGV4dEhlaWdodCA9IGQuY2FjaGVkUGFkZGluZ0ggPSBudWxsO1xuICBkLnNjcm9sbGJhcnNDbGlwcGVkID0gZmFsc2U7XG4gIGNtLnNldFNpemUoKTtcbn1cblxudmFyIGtleU5hbWVzID0ge1xuICAzOiBcIlBhdXNlXCIsIDg6IFwiQmFja3NwYWNlXCIsIDk6IFwiVGFiXCIsIDEzOiBcIkVudGVyXCIsIDE2OiBcIlNoaWZ0XCIsIDE3OiBcIkN0cmxcIiwgMTg6IFwiQWx0XCIsXG4gIDE5OiBcIlBhdXNlXCIsIDIwOiBcIkNhcHNMb2NrXCIsIDI3OiBcIkVzY1wiLCAzMjogXCJTcGFjZVwiLCAzMzogXCJQYWdlVXBcIiwgMzQ6IFwiUGFnZURvd25cIiwgMzU6IFwiRW5kXCIsXG4gIDM2OiBcIkhvbWVcIiwgMzc6IFwiTGVmdFwiLCAzODogXCJVcFwiLCAzOTogXCJSaWdodFwiLCA0MDogXCJEb3duXCIsIDQ0OiBcIlByaW50U2NyblwiLCA0NTogXCJJbnNlcnRcIixcbiAgNDY6IFwiRGVsZXRlXCIsIDU5OiBcIjtcIiwgNjE6IFwiPVwiLCA5MTogXCJNb2RcIiwgOTI6IFwiTW9kXCIsIDkzOiBcIk1vZFwiLFxuICAxMDY6IFwiKlwiLCAxMDc6IFwiPVwiLCAxMDk6IFwiLVwiLCAxMTA6IFwiLlwiLCAxMTE6IFwiL1wiLCAxMjc6IFwiRGVsZXRlXCIsIDE0NTogXCJTY3JvbGxMb2NrXCIsXG4gIDE3MzogXCItXCIsIDE4NjogXCI7XCIsIDE4NzogXCI9XCIsIDE4ODogXCIsXCIsIDE4OTogXCItXCIsIDE5MDogXCIuXCIsIDE5MTogXCIvXCIsIDE5MjogXCJgXCIsIDIxOTogXCJbXCIsIDIyMDogXCJcXFxcXCIsXG4gIDIyMTogXCJdXCIsIDIyMjogXCInXCIsIDYzMjMyOiBcIlVwXCIsIDYzMjMzOiBcIkRvd25cIiwgNjMyMzQ6IFwiTGVmdFwiLCA2MzIzNTogXCJSaWdodFwiLCA2MzI3MjogXCJEZWxldGVcIixcbiAgNjMyNzM6IFwiSG9tZVwiLCA2MzI3NTogXCJFbmRcIiwgNjMyNzY6IFwiUGFnZVVwXCIsIDYzMjc3OiBcIlBhZ2VEb3duXCIsIDYzMzAyOiBcIkluc2VydFwiXG59O1xuXG4vLyBOdW1iZXIga2V5c1xuZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7IGtleU5hbWVzW2kgKyA0OF0gPSBrZXlOYW1lc1tpICsgOTZdID0gU3RyaW5nKGkpOyB9XG4vLyBBbHBoYWJldGljIGtleXNcbmZvciAodmFyIGkkMSA9IDY1OyBpJDEgPD0gOTA7IGkkMSsrKSB7IGtleU5hbWVzW2kkMV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkkMSk7IH1cbi8vIEZ1bmN0aW9uIGtleXNcbmZvciAodmFyIGkkMiA9IDE7IGkkMiA8PSAxMjsgaSQyKyspIHsga2V5TmFtZXNbaSQyICsgMTExXSA9IGtleU5hbWVzW2kkMiArIDYzMjM1XSA9IFwiRlwiICsgaSQyOyB9XG5cbnZhciBrZXlNYXAgPSB7fTtcblxua2V5TWFwLmJhc2ljID0ge1xuICBcIkxlZnRcIjogXCJnb0NoYXJMZWZ0XCIsIFwiUmlnaHRcIjogXCJnb0NoYXJSaWdodFwiLCBcIlVwXCI6IFwiZ29MaW5lVXBcIiwgXCJEb3duXCI6IFwiZ29MaW5lRG93blwiLFxuICBcIkVuZFwiOiBcImdvTGluZUVuZFwiLCBcIkhvbWVcIjogXCJnb0xpbmVTdGFydFNtYXJ0XCIsIFwiUGFnZVVwXCI6IFwiZ29QYWdlVXBcIiwgXCJQYWdlRG93blwiOiBcImdvUGFnZURvd25cIixcbiAgXCJEZWxldGVcIjogXCJkZWxDaGFyQWZ0ZXJcIiwgXCJCYWNrc3BhY2VcIjogXCJkZWxDaGFyQmVmb3JlXCIsIFwiU2hpZnQtQmFja3NwYWNlXCI6IFwiZGVsQ2hhckJlZm9yZVwiLFxuICBcIlRhYlwiOiBcImRlZmF1bHRUYWJcIiwgXCJTaGlmdC1UYWJcIjogXCJpbmRlbnRBdXRvXCIsXG4gIFwiRW50ZXJcIjogXCJuZXdsaW5lQW5kSW5kZW50XCIsIFwiSW5zZXJ0XCI6IFwidG9nZ2xlT3ZlcndyaXRlXCIsXG4gIFwiRXNjXCI6IFwic2luZ2xlU2VsZWN0aW9uXCJcbn07XG4vLyBOb3RlIHRoYXQgdGhlIHNhdmUgYW5kIGZpbmQtcmVsYXRlZCBjb21tYW5kcyBhcmVuJ3QgZGVmaW5lZCBieVxuLy8gZGVmYXVsdC4gVXNlciBjb2RlIG9yIGFkZG9ucyBjYW4gZGVmaW5lIHRoZW0uIFVua25vd24gY29tbWFuZHNcbi8vIGFyZSBzaW1wbHkgaWdub3JlZC5cbmtleU1hcC5wY0RlZmF1bHQgPSB7XG4gIFwiQ3RybC1BXCI6IFwic2VsZWN0QWxsXCIsIFwiQ3RybC1EXCI6IFwiZGVsZXRlTGluZVwiLCBcIkN0cmwtWlwiOiBcInVuZG9cIiwgXCJTaGlmdC1DdHJsLVpcIjogXCJyZWRvXCIsIFwiQ3RybC1ZXCI6IFwicmVkb1wiLFxuICBcIkN0cmwtSG9tZVwiOiBcImdvRG9jU3RhcnRcIiwgXCJDdHJsLUVuZFwiOiBcImdvRG9jRW5kXCIsIFwiQ3RybC1VcFwiOiBcImdvTGluZVVwXCIsIFwiQ3RybC1Eb3duXCI6IFwiZ29MaW5lRG93blwiLFxuICBcIkN0cmwtTGVmdFwiOiBcImdvR3JvdXBMZWZ0XCIsIFwiQ3RybC1SaWdodFwiOiBcImdvR3JvdXBSaWdodFwiLCBcIkFsdC1MZWZ0XCI6IFwiZ29MaW5lU3RhcnRcIiwgXCJBbHQtUmlnaHRcIjogXCJnb0xpbmVFbmRcIixcbiAgXCJDdHJsLUJhY2tzcGFjZVwiOiBcImRlbEdyb3VwQmVmb3JlXCIsIFwiQ3RybC1EZWxldGVcIjogXCJkZWxHcm91cEFmdGVyXCIsIFwiQ3RybC1TXCI6IFwic2F2ZVwiLCBcIkN0cmwtRlwiOiBcImZpbmRcIixcbiAgXCJDdHJsLUdcIjogXCJmaW5kTmV4dFwiLCBcIlNoaWZ0LUN0cmwtR1wiOiBcImZpbmRQcmV2XCIsIFwiU2hpZnQtQ3RybC1GXCI6IFwicmVwbGFjZVwiLCBcIlNoaWZ0LUN0cmwtUlwiOiBcInJlcGxhY2VBbGxcIixcbiAgXCJDdHJsLVtcIjogXCJpbmRlbnRMZXNzXCIsIFwiQ3RybC1dXCI6IFwiaW5kZW50TW9yZVwiLFxuICBcIkN0cmwtVVwiOiBcInVuZG9TZWxlY3Rpb25cIiwgXCJTaGlmdC1DdHJsLVVcIjogXCJyZWRvU2VsZWN0aW9uXCIsIFwiQWx0LVVcIjogXCJyZWRvU2VsZWN0aW9uXCIsXG4gIGZhbGx0aHJvdWdoOiBcImJhc2ljXCJcbn07XG4vLyBWZXJ5IGJhc2ljIHJlYWRsaW5lL2VtYWNzLXN0eWxlIGJpbmRpbmdzLCB3aGljaCBhcmUgc3RhbmRhcmQgb24gTWFjLlxua2V5TWFwLmVtYWNzeSA9IHtcbiAgXCJDdHJsLUZcIjogXCJnb0NoYXJSaWdodFwiLCBcIkN0cmwtQlwiOiBcImdvQ2hhckxlZnRcIiwgXCJDdHJsLVBcIjogXCJnb0xpbmVVcFwiLCBcIkN0cmwtTlwiOiBcImdvTGluZURvd25cIixcbiAgXCJBbHQtRlwiOiBcImdvV29yZFJpZ2h0XCIsIFwiQWx0LUJcIjogXCJnb1dvcmRMZWZ0XCIsIFwiQ3RybC1BXCI6IFwiZ29MaW5lU3RhcnRcIiwgXCJDdHJsLUVcIjogXCJnb0xpbmVFbmRcIixcbiAgXCJDdHJsLVZcIjogXCJnb1BhZ2VEb3duXCIsIFwiU2hpZnQtQ3RybC1WXCI6IFwiZ29QYWdlVXBcIiwgXCJDdHJsLURcIjogXCJkZWxDaGFyQWZ0ZXJcIiwgXCJDdHJsLUhcIjogXCJkZWxDaGFyQmVmb3JlXCIsXG4gIFwiQWx0LURcIjogXCJkZWxXb3JkQWZ0ZXJcIiwgXCJBbHQtQmFja3NwYWNlXCI6IFwiZGVsV29yZEJlZm9yZVwiLCBcIkN0cmwtS1wiOiBcImtpbGxMaW5lXCIsIFwiQ3RybC1UXCI6IFwidHJhbnNwb3NlQ2hhcnNcIixcbiAgXCJDdHJsLU9cIjogXCJvcGVuTGluZVwiXG59O1xua2V5TWFwLm1hY0RlZmF1bHQgPSB7XG4gIFwiQ21kLUFcIjogXCJzZWxlY3RBbGxcIiwgXCJDbWQtRFwiOiBcImRlbGV0ZUxpbmVcIiwgXCJDbWQtWlwiOiBcInVuZG9cIiwgXCJTaGlmdC1DbWQtWlwiOiBcInJlZG9cIiwgXCJDbWQtWVwiOiBcInJlZG9cIixcbiAgXCJDbWQtSG9tZVwiOiBcImdvRG9jU3RhcnRcIiwgXCJDbWQtVXBcIjogXCJnb0RvY1N0YXJ0XCIsIFwiQ21kLUVuZFwiOiBcImdvRG9jRW5kXCIsIFwiQ21kLURvd25cIjogXCJnb0RvY0VuZFwiLCBcIkFsdC1MZWZ0XCI6IFwiZ29Hcm91cExlZnRcIixcbiAgXCJBbHQtUmlnaHRcIjogXCJnb0dyb3VwUmlnaHRcIiwgXCJDbWQtTGVmdFwiOiBcImdvTGluZUxlZnRcIiwgXCJDbWQtUmlnaHRcIjogXCJnb0xpbmVSaWdodFwiLCBcIkFsdC1CYWNrc3BhY2VcIjogXCJkZWxHcm91cEJlZm9yZVwiLFxuICBcIkN0cmwtQWx0LUJhY2tzcGFjZVwiOiBcImRlbEdyb3VwQWZ0ZXJcIiwgXCJBbHQtRGVsZXRlXCI6IFwiZGVsR3JvdXBBZnRlclwiLCBcIkNtZC1TXCI6IFwic2F2ZVwiLCBcIkNtZC1GXCI6IFwiZmluZFwiLFxuICBcIkNtZC1HXCI6IFwiZmluZE5leHRcIiwgXCJTaGlmdC1DbWQtR1wiOiBcImZpbmRQcmV2XCIsIFwiQ21kLUFsdC1GXCI6IFwicmVwbGFjZVwiLCBcIlNoaWZ0LUNtZC1BbHQtRlwiOiBcInJlcGxhY2VBbGxcIixcbiAgXCJDbWQtW1wiOiBcImluZGVudExlc3NcIiwgXCJDbWQtXVwiOiBcImluZGVudE1vcmVcIiwgXCJDbWQtQmFja3NwYWNlXCI6IFwiZGVsV3JhcHBlZExpbmVMZWZ0XCIsIFwiQ21kLURlbGV0ZVwiOiBcImRlbFdyYXBwZWRMaW5lUmlnaHRcIixcbiAgXCJDbWQtVVwiOiBcInVuZG9TZWxlY3Rpb25cIiwgXCJTaGlmdC1DbWQtVVwiOiBcInJlZG9TZWxlY3Rpb25cIiwgXCJDdHJsLVVwXCI6IFwiZ29Eb2NTdGFydFwiLCBcIkN0cmwtRG93blwiOiBcImdvRG9jRW5kXCIsXG4gIGZhbGx0aHJvdWdoOiBbXCJiYXNpY1wiLCBcImVtYWNzeVwiXVxufTtcbmtleU1hcFtcImRlZmF1bHRcIl0gPSBtYWMgPyBrZXlNYXAubWFjRGVmYXVsdCA6IGtleU1hcC5wY0RlZmF1bHQ7XG5cbi8vIEtFWU1BUCBESVNQQVRDSFxuXG5mdW5jdGlvbiBub3JtYWxpemVLZXlOYW1lKG5hbWUpIHtcbiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLyk7XG4gIG5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgdmFyIGFsdCwgY3RybCwgc2hpZnQsIGNtZDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICB2YXIgbW9kID0gcGFydHNbaV07XG4gICAgaWYgKC9eKGNtZHxtZXRhfG0pJC9pLnRlc3QobW9kKSkgeyBjbWQgPSB0cnVlOyB9XG4gICAgZWxzZSBpZiAoL15hKGx0KT8kL2kudGVzdChtb2QpKSB7IGFsdCA9IHRydWU7IH1cbiAgICBlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKSB7IGN0cmwgPSB0cnVlOyB9XG4gICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpIHsgc2hpZnQgPSB0cnVlOyB9XG4gICAgZWxzZSB7IHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiBcIiArIG1vZCkgfVxuICB9XG4gIGlmIChhbHQpIHsgbmFtZSA9IFwiQWx0LVwiICsgbmFtZTsgfVxuICBpZiAoY3RybCkgeyBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTsgfVxuICBpZiAoY21kKSB7IG5hbWUgPSBcIkNtZC1cIiArIG5hbWU7IH1cbiAgaWYgKHNoaWZ0KSB7IG5hbWUgPSBcIlNoaWZ0LVwiICsgbmFtZTsgfVxuICByZXR1cm4gbmFtZVxufVxuXG4vLyBUaGlzIGlzIGEga2x1ZGdlIHRvIGtlZXAga2V5bWFwcyBtb3N0bHkgd29ya2luZyBhcyByYXcgb2JqZWN0c1xuLy8gKGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIHN1cHBvcnQgZmVhdHVyZXNcbi8vIGxpa2Ugbm9ybWFsaXphdGlvbiBhbmQgbXVsdGktc3Ryb2tlIGtleSBiaW5kaW5ncy4gSXQgY29tcGlsZXMgYVxuLy8gbmV3IG5vcm1hbGl6ZWQga2V5bWFwLCBhbmQgdGhlbiB1cGRhdGVzIHRoZSBvbGQgb2JqZWN0IHRvIHJlZmxlY3Rcbi8vIHRoaXMuXG5mdW5jdGlvbiBub3JtYWxpemVLZXlNYXAoa2V5bWFwKSB7XG4gIHZhciBjb3B5ID0ge307XG4gIGZvciAodmFyIGtleW5hbWUgaW4ga2V5bWFwKSB7IGlmIChrZXltYXAuaGFzT3duUHJvcGVydHkoa2V5bmFtZSkpIHtcbiAgICB2YXIgdmFsdWUgPSBrZXltYXBba2V5bmFtZV07XG4gICAgaWYgKC9eKG5hbWV8ZmFsbHRocm91Z2h8KGRlfGF0KXRhY2gpJC8udGVzdChrZXluYW1lKSkgeyBjb250aW51ZSB9XG4gICAgaWYgKHZhbHVlID09IFwiLi4uXCIpIHsgZGVsZXRlIGtleW1hcFtrZXluYW1lXTsgY29udGludWUgfVxuXG4gICAgdmFyIGtleXMgPSBtYXAoa2V5bmFtZS5zcGxpdChcIiBcIiksIG5vcm1hbGl6ZUtleU5hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbCA9ICh2b2lkIDApLCBuYW1lID0gKHZvaWQgMCk7XG4gICAgICBpZiAoaSA9PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgbmFtZSA9IGtleXMuam9pbihcIiBcIik7XG4gICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGtleXMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCIgXCIpO1xuICAgICAgICB2YWwgPSBcIi4uLlwiO1xuICAgICAgfVxuICAgICAgdmFyIHByZXYgPSBjb3B5W25hbWVdO1xuICAgICAgaWYgKCFwcmV2KSB7IGNvcHlbbmFtZV0gPSB2YWw7IH1cbiAgICAgIGVsc2UgaWYgKHByZXYgIT0gdmFsKSB7IHRocm93IG5ldyBFcnJvcihcIkluY29uc2lzdGVudCBiaW5kaW5ncyBmb3IgXCIgKyBuYW1lKSB9XG4gICAgfVxuICAgIGRlbGV0ZSBrZXltYXBba2V5bmFtZV07XG4gIH0gfVxuICBmb3IgKHZhciBwcm9wIGluIGNvcHkpIHsga2V5bWFwW3Byb3BdID0gY29weVtwcm9wXTsgfVxuICByZXR1cm4ga2V5bWFwXG59XG5cbmZ1bmN0aW9uIGxvb2t1cEtleShrZXksIG1hcCQkMSwgaGFuZGxlLCBjb250ZXh0KSB7XG4gIG1hcCQkMSA9IGdldEtleU1hcChtYXAkJDEpO1xuICB2YXIgZm91bmQgPSBtYXAkJDEuY2FsbCA/IG1hcCQkMS5jYWxsKGtleSwgY29udGV4dCkgOiBtYXAkJDFba2V5XTtcbiAgaWYgKGZvdW5kID09PSBmYWxzZSkgeyByZXR1cm4gXCJub3RoaW5nXCIgfVxuICBpZiAoZm91bmQgPT09IFwiLi4uXCIpIHsgcmV0dXJuIFwibXVsdGlcIiB9XG4gIGlmIChmb3VuZCAhPSBudWxsICYmIGhhbmRsZShmb3VuZCkpIHsgcmV0dXJuIFwiaGFuZGxlZFwiIH1cblxuICBpZiAobWFwJCQxLmZhbGx0aHJvdWdoKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChtYXAkJDEuZmFsbHRocm91Z2gpICE9IFwiW29iamVjdCBBcnJheV1cIilcbiAgICAgIHsgcmV0dXJuIGxvb2t1cEtleShrZXksIG1hcCQkMS5mYWxsdGhyb3VnaCwgaGFuZGxlLCBjb250ZXh0KSB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXAkJDEuZmFsbHRocm91Z2gubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb29rdXBLZXkoa2V5LCBtYXAkJDEuZmFsbHRocm91Z2hbaV0sIGhhbmRsZSwgY29udGV4dCk7XG4gICAgICBpZiAocmVzdWx0KSB7IHJldHVybiByZXN1bHQgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBNb2RpZmllciBrZXkgcHJlc3NlcyBkb24ndCBjb3VudCBhcyAncmVhbCcga2V5IHByZXNzZXMgZm9yIHRoZVxuLy8gcHVycG9zZSBvZiBrZXltYXAgZmFsbHRocm91Z2guXG5mdW5jdGlvbiBpc01vZGlmaWVyS2V5KHZhbHVlKSB7XG4gIHZhciBuYW1lID0gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IGtleU5hbWVzW3ZhbHVlLmtleUNvZGVdO1xuICByZXR1cm4gbmFtZSA9PSBcIkN0cmxcIiB8fCBuYW1lID09IFwiQWx0XCIgfHwgbmFtZSA9PSBcIlNoaWZ0XCIgfHwgbmFtZSA9PSBcIk1vZFwiXG59XG5cbmZ1bmN0aW9uIGFkZE1vZGlmaWVyTmFtZXMobmFtZSwgZXZlbnQsIG5vU2hpZnQpIHtcbiAgdmFyIGJhc2UgPSBuYW1lO1xuICBpZiAoZXZlbnQuYWx0S2V5ICYmIGJhc2UgIT0gXCJBbHRcIikgeyBuYW1lID0gXCJBbHQtXCIgKyBuYW1lOyB9XG4gIGlmICgoZmxpcEN0cmxDbWQgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleSkgJiYgYmFzZSAhPSBcIkN0cmxcIikgeyBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTsgfVxuICBpZiAoKGZsaXBDdHJsQ21kID8gZXZlbnQuY3RybEtleSA6IGV2ZW50Lm1ldGFLZXkpICYmIGJhc2UgIT0gXCJDbWRcIikgeyBuYW1lID0gXCJDbWQtXCIgKyBuYW1lOyB9XG4gIGlmICghbm9TaGlmdCAmJiBldmVudC5zaGlmdEtleSAmJiBiYXNlICE9IFwiU2hpZnRcIikgeyBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7IH1cbiAgcmV0dXJuIG5hbWVcbn1cblxuLy8gTG9vayB1cCB0aGUgbmFtZSBvZiBhIGtleSBhcyBpbmRpY2F0ZWQgYnkgYW4gZXZlbnQgb2JqZWN0LlxuZnVuY3Rpb24ga2V5TmFtZShldmVudCwgbm9TaGlmdCkge1xuICBpZiAocHJlc3RvICYmIGV2ZW50LmtleUNvZGUgPT0gMzQgJiYgZXZlbnRbXCJjaGFyXCJdKSB7IHJldHVybiBmYWxzZSB9XG4gIHZhciBuYW1lID0ga2V5TmFtZXNbZXZlbnQua2V5Q29kZV07XG4gIGlmIChuYW1lID09IG51bGwgfHwgZXZlbnQuYWx0R3JhcGhLZXkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgLy8gQ3RybC1TY3JvbGxMb2NrIGhhcyBrZXlDb2RlIDMsIHNhbWUgYXMgQ3RybC1QYXVzZSxcbiAgLy8gc28gd2UnbGwgdXNlIGV2ZW50LmNvZGUgd2hlbiBhdmFpbGFibGUgKENocm9tZSA0OCssIEZGIDM4KywgU2FmYXJpIDEwLjErKVxuICBpZiAoZXZlbnQua2V5Q29kZSA9PSAzICYmIGV2ZW50LmNvZGUpIHsgbmFtZSA9IGV2ZW50LmNvZGU7IH1cbiAgcmV0dXJuIGFkZE1vZGlmaWVyTmFtZXMobmFtZSwgZXZlbnQsIG5vU2hpZnQpXG59XG5cbmZ1bmN0aW9uIGdldEtleU1hcCh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gXCJzdHJpbmdcIiA/IGtleU1hcFt2YWxdIDogdmFsXG59XG5cbi8vIEhlbHBlciBmb3IgZGVsZXRpbmcgdGV4dCBuZWFyIHRoZSBzZWxlY3Rpb24ocyksIHVzZWQgdG8gaW1wbGVtZW50XG4vLyBiYWNrc3BhY2UsIGRlbGV0ZSwgYW5kIHNpbWlsYXIgZnVuY3Rpb25hbGl0eS5cbmZ1bmN0aW9uIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGNvbXB1dGUpIHtcbiAgdmFyIHJhbmdlcyA9IGNtLmRvYy5zZWwucmFuZ2VzLCBraWxsID0gW107XG4gIC8vIEJ1aWxkIHVwIGEgc2V0IG9mIHJhbmdlcyB0byBraWxsIGZpcnN0LCBtZXJnaW5nIG92ZXJsYXBwaW5nXG4gIC8vIHJhbmdlcy5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG9LaWxsID0gY29tcHV0ZShyYW5nZXNbaV0pO1xuICAgIHdoaWxlIChraWxsLmxlbmd0aCAmJiBjbXAodG9LaWxsLmZyb20sIGxzdChraWxsKS50bykgPD0gMCkge1xuICAgICAgdmFyIHJlcGxhY2VkID0ga2lsbC5wb3AoKTtcbiAgICAgIGlmIChjbXAocmVwbGFjZWQuZnJvbSwgdG9LaWxsLmZyb20pIDwgMCkge1xuICAgICAgICB0b0tpbGwuZnJvbSA9IHJlcGxhY2VkLmZyb207XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGtpbGwucHVzaCh0b0tpbGwpO1xuICB9XG4gIC8vIE5leHQsIHJlbW92ZSB0aG9zZSBhY3R1YWwgcmFuZ2VzLlxuICBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgaSA9IGtpbGwubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICB7IHJlcGxhY2VSYW5nZShjbS5kb2MsIFwiXCIsIGtpbGxbaV0uZnJvbSwga2lsbFtpXS50bywgXCIrZGVsZXRlXCIpOyB9XG4gICAgZW5zdXJlQ3Vyc29yVmlzaWJsZShjbSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtb3ZlQ2hhckxvZ2ljYWxseShsaW5lLCBjaCwgZGlyKSB7XG4gIHZhciB0YXJnZXQgPSBza2lwRXh0ZW5kaW5nQ2hhcnMobGluZS50ZXh0LCBjaCArIGRpciwgZGlyKTtcbiAgcmV0dXJuIHRhcmdldCA8IDAgfHwgdGFyZ2V0ID4gbGluZS50ZXh0Lmxlbmd0aCA/IG51bGwgOiB0YXJnZXRcbn1cblxuZnVuY3Rpb24gbW92ZUxvZ2ljYWxseShsaW5lLCBzdGFydCwgZGlyKSB7XG4gIHZhciBjaCA9IG1vdmVDaGFyTG9naWNhbGx5KGxpbmUsIHN0YXJ0LmNoLCBkaXIpO1xuICByZXR1cm4gY2ggPT0gbnVsbCA/IG51bGwgOiBuZXcgUG9zKHN0YXJ0LmxpbmUsIGNoLCBkaXIgPCAwID8gXCJhZnRlclwiIDogXCJiZWZvcmVcIilcbn1cblxuZnVuY3Rpb24gZW5kT2ZMaW5lKHZpc3VhbGx5LCBjbSwgbGluZU9iaiwgbGluZU5vLCBkaXIpIHtcbiAgaWYgKHZpc3VhbGx5KSB7XG4gICAgdmFyIG9yZGVyID0gZ2V0T3JkZXIobGluZU9iaiwgY20uZG9jLmRpcmVjdGlvbik7XG4gICAgaWYgKG9yZGVyKSB7XG4gICAgICB2YXIgcGFydCA9IGRpciA8IDAgPyBsc3Qob3JkZXIpIDogb3JkZXJbMF07XG4gICAgICB2YXIgbW92ZUluU3RvcmFnZU9yZGVyID0gKGRpciA8IDApID09IChwYXJ0LmxldmVsID09IDEpO1xuICAgICAgdmFyIHN0aWNreSA9IG1vdmVJblN0b3JhZ2VPcmRlciA/IFwiYWZ0ZXJcIiA6IFwiYmVmb3JlXCI7XG4gICAgICB2YXIgY2g7XG4gICAgICAvLyBXaXRoIGEgd3JhcHBlZCBydGwgY2h1bmsgKHBvc3NpYmx5IHNwYW5uaW5nIG11bHRpcGxlIGJpZGkgcGFydHMpLFxuICAgICAgLy8gaXQgY291bGQgYmUgdGhhdCB0aGUgbGFzdCBiaWRpIHBhcnQgaXMgbm90IG9uIHRoZSBsYXN0IHZpc3VhbCBsaW5lLFxuICAgICAgLy8gc2luY2UgdmlzdWFsIGxpbmVzIGNvbnRhaW4gY29udGVudCBvcmRlci1jb25zZWN1dGl2ZSBjaHVua3MuXG4gICAgICAvLyBUaHVzLCBpbiBydGwsIHdlIGFyZSBsb29raW5nIGZvciB0aGUgZmlyc3QgKGNvbnRlbnQtb3JkZXIpIGNoYXJhY3RlclxuICAgICAgLy8gaW4gdGhlIHJ0bCBjaHVuayB0aGF0IGlzIG9uIHRoZSBsYXN0IGxpbmUgKHRoYXQgaXMsIHRoZSBzYW1lIGxpbmVcbiAgICAgIC8vIGFzIHRoZSBsYXN0IChjb250ZW50LW9yZGVyKSBjaGFyYWN0ZXIpLlxuICAgICAgaWYgKHBhcnQubGV2ZWwgPiAwIHx8IGNtLmRvYy5kaXJlY3Rpb24gPT0gXCJydGxcIikge1xuICAgICAgICB2YXIgcHJlcCA9IHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZU9iaik7XG4gICAgICAgIGNoID0gZGlyIDwgMCA/IGxpbmVPYmoudGV4dC5sZW5ndGggLSAxIDogMDtcbiAgICAgICAgdmFyIHRhcmdldFRvcCA9IG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXAsIGNoKS50b3A7XG4gICAgICAgIGNoID0gZmluZEZpcnN0KGZ1bmN0aW9uIChjaCkgeyByZXR1cm4gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcCwgY2gpLnRvcCA9PSB0YXJnZXRUb3A7IH0sIChkaXIgPCAwKSA9PSAocGFydC5sZXZlbCA9PSAxKSA/IHBhcnQuZnJvbSA6IHBhcnQudG8gLSAxLCBjaCk7XG4gICAgICAgIGlmIChzdGlja3kgPT0gXCJiZWZvcmVcIikgeyBjaCA9IG1vdmVDaGFyTG9naWNhbGx5KGxpbmVPYmosIGNoLCAxKTsgfVxuICAgICAgfSBlbHNlIHsgY2ggPSBkaXIgPCAwID8gcGFydC50byA6IHBhcnQuZnJvbTsgfVxuICAgICAgcmV0dXJuIG5ldyBQb3MobGluZU5vLCBjaCwgc3RpY2t5KVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IFBvcyhsaW5lTm8sIGRpciA8IDAgPyBsaW5lT2JqLnRleHQubGVuZ3RoIDogMCwgZGlyIDwgMCA/IFwiYmVmb3JlXCIgOiBcImFmdGVyXCIpXG59XG5cbmZ1bmN0aW9uIG1vdmVWaXN1YWxseShjbSwgbGluZSwgc3RhcnQsIGRpcikge1xuICB2YXIgYmlkaSA9IGdldE9yZGVyKGxpbmUsIGNtLmRvYy5kaXJlY3Rpb24pO1xuICBpZiAoIWJpZGkpIHsgcmV0dXJuIG1vdmVMb2dpY2FsbHkobGluZSwgc3RhcnQsIGRpcikgfVxuICBpZiAoc3RhcnQuY2ggPj0gbGluZS50ZXh0Lmxlbmd0aCkge1xuICAgIHN0YXJ0LmNoID0gbGluZS50ZXh0Lmxlbmd0aDtcbiAgICBzdGFydC5zdGlja3kgPSBcImJlZm9yZVwiO1xuICB9IGVsc2UgaWYgKHN0YXJ0LmNoIDw9IDApIHtcbiAgICBzdGFydC5jaCA9IDA7XG4gICAgc3RhcnQuc3RpY2t5ID0gXCJhZnRlclwiO1xuICB9XG4gIHZhciBwYXJ0UG9zID0gZ2V0QmlkaVBhcnRBdChiaWRpLCBzdGFydC5jaCwgc3RhcnQuc3RpY2t5KSwgcGFydCA9IGJpZGlbcGFydFBvc107XG4gIGlmIChjbS5kb2MuZGlyZWN0aW9uID09IFwibHRyXCIgJiYgcGFydC5sZXZlbCAlIDIgPT0gMCAmJiAoZGlyID4gMCA/IHBhcnQudG8gPiBzdGFydC5jaCA6IHBhcnQuZnJvbSA8IHN0YXJ0LmNoKSkge1xuICAgIC8vIENhc2UgMTogV2UgbW92ZSB3aXRoaW4gYW4gbHRyIHBhcnQgaW4gYW4gbHRyIGVkaXRvci4gRXZlbiB3aXRoIHdyYXBwZWQgbGluZXMsXG4gICAgLy8gbm90aGluZyBpbnRlcmVzdGluZyBoYXBwZW5zLlxuICAgIHJldHVybiBtb3ZlTG9naWNhbGx5KGxpbmUsIHN0YXJ0LCBkaXIpXG4gIH1cblxuICB2YXIgbXYgPSBmdW5jdGlvbiAocG9zLCBkaXIpIHsgcmV0dXJuIG1vdmVDaGFyTG9naWNhbGx5KGxpbmUsIHBvcyBpbnN0YW5jZW9mIFBvcyA/IHBvcy5jaCA6IHBvcywgZGlyKTsgfTtcbiAgdmFyIHByZXA7XG4gIHZhciBnZXRXcmFwcGVkTGluZUV4dGVudCA9IGZ1bmN0aW9uIChjaCkge1xuICAgIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsgcmV0dXJuIHtiZWdpbjogMCwgZW5kOiBsaW5lLnRleHQubGVuZ3RofSB9XG4gICAgcHJlcCA9IHByZXAgfHwgcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lKTtcbiAgICByZXR1cm4gd3JhcHBlZExpbmVFeHRlbnRDaGFyKGNtLCBsaW5lLCBwcmVwLCBjaClcbiAgfTtcbiAgdmFyIHdyYXBwZWRMaW5lRXh0ZW50ID0gZ2V0V3JhcHBlZExpbmVFeHRlbnQoc3RhcnQuc3RpY2t5ID09IFwiYmVmb3JlXCIgPyBtdihzdGFydCwgLTEpIDogc3RhcnQuY2gpO1xuXG4gIGlmIChjbS5kb2MuZGlyZWN0aW9uID09IFwicnRsXCIgfHwgcGFydC5sZXZlbCA9PSAxKSB7XG4gICAgdmFyIG1vdmVJblN0b3JhZ2VPcmRlciA9IChwYXJ0LmxldmVsID09IDEpID09IChkaXIgPCAwKTtcbiAgICB2YXIgY2ggPSBtdihzdGFydCwgbW92ZUluU3RvcmFnZU9yZGVyID8gMSA6IC0xKTtcbiAgICBpZiAoY2ggIT0gbnVsbCAmJiAoIW1vdmVJblN0b3JhZ2VPcmRlciA/IGNoID49IHBhcnQuZnJvbSAmJiBjaCA+PSB3cmFwcGVkTGluZUV4dGVudC5iZWdpbiA6IGNoIDw9IHBhcnQudG8gJiYgY2ggPD0gd3JhcHBlZExpbmVFeHRlbnQuZW5kKSkge1xuICAgICAgLy8gQ2FzZSAyOiBXZSBtb3ZlIHdpdGhpbiBhbiBydGwgcGFydCBvciBpbiBhbiBydGwgZWRpdG9yIG9uIHRoZSBzYW1lIHZpc3VhbCBsaW5lXG4gICAgICB2YXIgc3RpY2t5ID0gbW92ZUluU3RvcmFnZU9yZGVyID8gXCJiZWZvcmVcIiA6IFwiYWZ0ZXJcIjtcbiAgICAgIHJldHVybiBuZXcgUG9zKHN0YXJ0LmxpbmUsIGNoLCBzdGlja3kpXG4gICAgfVxuICB9XG5cbiAgLy8gQ2FzZSAzOiBDb3VsZCBub3QgbW92ZSB3aXRoaW4gdGhpcyBiaWRpIHBhcnQgaW4gdGhpcyB2aXN1YWwgbGluZSwgc28gbGVhdmVcbiAgLy8gdGhlIGN1cnJlbnQgYmlkaSBwYXJ0XG5cbiAgdmFyIHNlYXJjaEluVmlzdWFsTGluZSA9IGZ1bmN0aW9uIChwYXJ0UG9zLCBkaXIsIHdyYXBwZWRMaW5lRXh0ZW50KSB7XG4gICAgdmFyIGdldFJlcyA9IGZ1bmN0aW9uIChjaCwgbW92ZUluU3RvcmFnZU9yZGVyKSB7IHJldHVybiBtb3ZlSW5TdG9yYWdlT3JkZXJcbiAgICAgID8gbmV3IFBvcyhzdGFydC5saW5lLCBtdihjaCwgMSksIFwiYmVmb3JlXCIpXG4gICAgICA6IG5ldyBQb3Moc3RhcnQubGluZSwgY2gsIFwiYWZ0ZXJcIik7IH07XG5cbiAgICBmb3IgKDsgcGFydFBvcyA+PSAwICYmIHBhcnRQb3MgPCBiaWRpLmxlbmd0aDsgcGFydFBvcyArPSBkaXIpIHtcbiAgICAgIHZhciBwYXJ0ID0gYmlkaVtwYXJ0UG9zXTtcbiAgICAgIHZhciBtb3ZlSW5TdG9yYWdlT3JkZXIgPSAoZGlyID4gMCkgPT0gKHBhcnQubGV2ZWwgIT0gMSk7XG4gICAgICB2YXIgY2ggPSBtb3ZlSW5TdG9yYWdlT3JkZXIgPyB3cmFwcGVkTGluZUV4dGVudC5iZWdpbiA6IG12KHdyYXBwZWRMaW5lRXh0ZW50LmVuZCwgLTEpO1xuICAgICAgaWYgKHBhcnQuZnJvbSA8PSBjaCAmJiBjaCA8IHBhcnQudG8pIHsgcmV0dXJuIGdldFJlcyhjaCwgbW92ZUluU3RvcmFnZU9yZGVyKSB9XG4gICAgICBjaCA9IG1vdmVJblN0b3JhZ2VPcmRlciA/IHBhcnQuZnJvbSA6IG12KHBhcnQudG8sIC0xKTtcbiAgICAgIGlmICh3cmFwcGVkTGluZUV4dGVudC5iZWdpbiA8PSBjaCAmJiBjaCA8IHdyYXBwZWRMaW5lRXh0ZW50LmVuZCkgeyByZXR1cm4gZ2V0UmVzKGNoLCBtb3ZlSW5TdG9yYWdlT3JkZXIpIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gQ2FzZSAzYTogTG9vayBmb3Igb3RoZXIgYmlkaSBwYXJ0cyBvbiB0aGUgc2FtZSB2aXN1YWwgbGluZVxuICB2YXIgcmVzID0gc2VhcmNoSW5WaXN1YWxMaW5lKHBhcnRQb3MgKyBkaXIsIGRpciwgd3JhcHBlZExpbmVFeHRlbnQpO1xuICBpZiAocmVzKSB7IHJldHVybiByZXMgfVxuXG4gIC8vIENhc2UgM2I6IExvb2sgZm9yIG90aGVyIGJpZGkgcGFydHMgb24gdGhlIG5leHQgdmlzdWFsIGxpbmVcbiAgdmFyIG5leHRDaCA9IGRpciA+IDAgPyB3cmFwcGVkTGluZUV4dGVudC5lbmQgOiBtdih3cmFwcGVkTGluZUV4dGVudC5iZWdpbiwgLTEpO1xuICBpZiAobmV4dENoICE9IG51bGwgJiYgIShkaXIgPiAwICYmIG5leHRDaCA9PSBsaW5lLnRleHQubGVuZ3RoKSkge1xuICAgIHJlcyA9IHNlYXJjaEluVmlzdWFsTGluZShkaXIgPiAwID8gMCA6IGJpZGkubGVuZ3RoIC0gMSwgZGlyLCBnZXRXcmFwcGVkTGluZUV4dGVudChuZXh0Q2gpKTtcbiAgICBpZiAocmVzKSB7IHJldHVybiByZXMgfVxuICB9XG5cbiAgLy8gQ2FzZSA0OiBOb3doZXJlIHRvIG1vdmVcbiAgcmV0dXJuIG51bGxcbn1cblxuLy8gQ29tbWFuZHMgYXJlIHBhcmFtZXRlci1sZXNzIGFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGFuXG4vLyBlZGl0b3IsIG1vc3RseSB1c2VkIGZvciBrZXliaW5kaW5ncy5cbnZhciBjb21tYW5kcyA9IHtcbiAgc2VsZWN0QWxsOiBzZWxlY3RBbGwsXG4gIHNpbmdsZVNlbGVjdGlvbjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5zZXRTZWxlY3Rpb24oY20uZ2V0Q3Vyc29yKFwiYW5jaG9yXCIpLCBjbS5nZXRDdXJzb3IoXCJoZWFkXCIpLCBzZWxfZG9udFNjcm9sbCk7IH0sXG4gIGtpbGxMaW5lOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIGlmIChyYW5nZS5lbXB0eSgpKSB7XG4gICAgICB2YXIgbGVuID0gZ2V0TGluZShjbS5kb2MsIHJhbmdlLmhlYWQubGluZSkudGV4dC5sZW5ndGg7XG4gICAgICBpZiAocmFuZ2UuaGVhZC5jaCA9PSBsZW4gJiYgcmFuZ2UuaGVhZC5saW5lIDwgY20ubGFzdExpbmUoKSlcbiAgICAgICAgeyByZXR1cm4ge2Zyb206IHJhbmdlLmhlYWQsIHRvOiBQb3MocmFuZ2UuaGVhZC5saW5lICsgMSwgMCl9IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyByZXR1cm4ge2Zyb206IHJhbmdlLmhlYWQsIHRvOiBQb3MocmFuZ2UuaGVhZC5saW5lLCBsZW4pfSB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7ZnJvbTogcmFuZ2UuZnJvbSgpLCB0bzogcmFuZ2UudG8oKX1cbiAgICB9XG4gIH0pOyB9LFxuICBkZWxldGVMaW5lOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uIChyYW5nZSkgeyByZXR1cm4gKHtcbiAgICBmcm9tOiBQb3MocmFuZ2UuZnJvbSgpLmxpbmUsIDApLFxuICAgIHRvOiBjbGlwUG9zKGNtLmRvYywgUG9zKHJhbmdlLnRvKCkubGluZSArIDEsIDApKVxuICB9KTsgfSk7IH0sXG4gIGRlbExpbmVMZWZ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uIChyYW5nZSkgeyByZXR1cm4gKHtcbiAgICBmcm9tOiBQb3MocmFuZ2UuZnJvbSgpLmxpbmUsIDApLCB0bzogcmFuZ2UuZnJvbSgpXG4gIH0pOyB9KTsgfSxcbiAgZGVsV3JhcHBlZExpbmVMZWZ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHZhciB0b3AgPSBjbS5jaGFyQ29vcmRzKHJhbmdlLmhlYWQsIFwiZGl2XCIpLnRvcCArIDU7XG4gICAgdmFyIGxlZnRQb3MgPSBjbS5jb29yZHNDaGFyKHtsZWZ0OiAwLCB0b3A6IHRvcH0sIFwiZGl2XCIpO1xuICAgIHJldHVybiB7ZnJvbTogbGVmdFBvcywgdG86IHJhbmdlLmZyb20oKX1cbiAgfSk7IH0sXG4gIGRlbFdyYXBwZWRMaW5lUmlnaHQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gZGVsZXRlTmVhclNlbGVjdGlvbihjbSwgZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgdmFyIHRvcCA9IGNtLmNoYXJDb29yZHMocmFuZ2UuaGVhZCwgXCJkaXZcIikudG9wICsgNTtcbiAgICB2YXIgcmlnaHRQb3MgPSBjbS5jb29yZHNDaGFyKHtsZWZ0OiBjbS5kaXNwbGF5LmxpbmVEaXYub2Zmc2V0V2lkdGggKyAxMDAsIHRvcDogdG9wfSwgXCJkaXZcIik7XG4gICAgcmV0dXJuIHtmcm9tOiByYW5nZS5mcm9tKCksIHRvOiByaWdodFBvcyB9XG4gIH0pOyB9LFxuICB1bmRvOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnVuZG8oKTsgfSxcbiAgcmVkbzogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5yZWRvKCk7IH0sXG4gIHVuZG9TZWxlY3Rpb246IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20udW5kb1NlbGVjdGlvbigpOyB9LFxuICByZWRvU2VsZWN0aW9uOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnJlZG9TZWxlY3Rpb24oKTsgfSxcbiAgZ29Eb2NTdGFydDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb24oUG9zKGNtLmZpcnN0TGluZSgpLCAwKSk7IH0sXG4gIGdvRG9jRW5kOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbihQb3MoY20ubGFzdExpbmUoKSkpOyB9LFxuICBnb0xpbmVTdGFydDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7IHJldHVybiBsaW5lU3RhcnQoY20sIHJhbmdlLmhlYWQubGluZSk7IH0sXG4gICAge29yaWdpbjogXCIrbW92ZVwiLCBiaWFzOiAxfVxuICApOyB9LFxuICBnb0xpbmVTdGFydFNtYXJ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbiAocmFuZ2UpIHsgcmV0dXJuIGxpbmVTdGFydFNtYXJ0KGNtLCByYW5nZS5oZWFkKTsgfSxcbiAgICB7b3JpZ2luOiBcIittb3ZlXCIsIGJpYXM6IDF9XG4gICk7IH0sXG4gIGdvTGluZUVuZDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7IHJldHVybiBsaW5lRW5kKGNtLCByYW5nZS5oZWFkLmxpbmUpOyB9LFxuICAgIHtvcmlnaW46IFwiK21vdmVcIiwgYmlhczogLTF9XG4gICk7IH0sXG4gIGdvTGluZVJpZ2h0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICB2YXIgdG9wID0gY20uY3Vyc29yQ29vcmRzKHJhbmdlLmhlYWQsIFwiZGl2XCIpLnRvcCArIDU7XG4gICAgcmV0dXJuIGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IGNtLmRpc3BsYXkubGluZURpdi5vZmZzZXRXaWR0aCArIDEwMCwgdG9wOiB0b3B9LCBcImRpdlwiKVxuICB9LCBzZWxfbW92ZSk7IH0sXG4gIGdvTGluZUxlZnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHZhciB0b3AgPSBjbS5jdXJzb3JDb29yZHMocmFuZ2UuaGVhZCwgXCJkaXZcIikudG9wICsgNTtcbiAgICByZXR1cm4gY20uY29vcmRzQ2hhcih7bGVmdDogMCwgdG9wOiB0b3B9LCBcImRpdlwiKVxuICB9LCBzZWxfbW92ZSk7IH0sXG4gIGdvTGluZUxlZnRTbWFydDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgdmFyIHRvcCA9IGNtLmN1cnNvckNvb3JkcyhyYW5nZS5oZWFkLCBcImRpdlwiKS50b3AgKyA1O1xuICAgIHZhciBwb3MgPSBjbS5jb29yZHNDaGFyKHtsZWZ0OiAwLCB0b3A6IHRvcH0sIFwiZGl2XCIpO1xuICAgIGlmIChwb3MuY2ggPCBjbS5nZXRMaW5lKHBvcy5saW5lKS5zZWFyY2goL1xcUy8pKSB7IHJldHVybiBsaW5lU3RhcnRTbWFydChjbSwgcmFuZ2UuaGVhZCkgfVxuICAgIHJldHVybiBwb3NcbiAgfSwgc2VsX21vdmUpOyB9LFxuICBnb0xpbmVVcDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlVigtMSwgXCJsaW5lXCIpOyB9LFxuICBnb0xpbmVEb3duOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVWKDEsIFwibGluZVwiKTsgfSxcbiAgZ29QYWdlVXA6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZVYoLTEsIFwicGFnZVwiKTsgfSxcbiAgZ29QYWdlRG93bjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlVigxLCBcInBhZ2VcIik7IH0sXG4gIGdvQ2hhckxlZnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoLTEsIFwiY2hhclwiKTsgfSxcbiAgZ29DaGFyUmlnaHQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoMSwgXCJjaGFyXCIpOyB9LFxuICBnb0NvbHVtbkxlZnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoLTEsIFwiY29sdW1uXCIpOyB9LFxuICBnb0NvbHVtblJpZ2h0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVIKDEsIFwiY29sdW1uXCIpOyB9LFxuICBnb1dvcmRMZWZ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVIKC0xLCBcIndvcmRcIik7IH0sXG4gIGdvR3JvdXBSaWdodDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlSCgxLCBcImdyb3VwXCIpOyB9LFxuICBnb0dyb3VwTGVmdDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlSCgtMSwgXCJncm91cFwiKTsgfSxcbiAgZ29Xb3JkUmlnaHQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoMSwgXCJ3b3JkXCIpOyB9LFxuICBkZWxDaGFyQmVmb3JlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoLTEsIFwiY2hhclwiKTsgfSxcbiAgZGVsQ2hhckFmdGVyOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoMSwgXCJjaGFyXCIpOyB9LFxuICBkZWxXb3JkQmVmb3JlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoLTEsIFwid29yZFwiKTsgfSxcbiAgZGVsV29yZEFmdGVyOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoMSwgXCJ3b3JkXCIpOyB9LFxuICBkZWxHcm91cEJlZm9yZTogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5kZWxldGVIKC0xLCBcImdyb3VwXCIpOyB9LFxuICBkZWxHcm91cEFmdGVyOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoMSwgXCJncm91cFwiKTsgfSxcbiAgaW5kZW50QXV0bzogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5pbmRlbnRTZWxlY3Rpb24oXCJzbWFydFwiKTsgfSxcbiAgaW5kZW50TW9yZTogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5pbmRlbnRTZWxlY3Rpb24oXCJhZGRcIik7IH0sXG4gIGluZGVudExlc3M6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uaW5kZW50U2VsZWN0aW9uKFwic3VidHJhY3RcIik7IH0sXG4gIGluc2VydFRhYjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5yZXBsYWNlU2VsZWN0aW9uKFwiXFx0XCIpOyB9LFxuICBpbnNlcnRTb2Z0VGFiOiBmdW5jdGlvbiAoY20pIHtcbiAgICB2YXIgc3BhY2VzID0gW10sIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIHRhYlNpemUgPSBjbS5vcHRpb25zLnRhYlNpemU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwb3MgPSByYW5nZXNbaV0uZnJvbSgpO1xuICAgICAgdmFyIGNvbCA9IGNvdW50Q29sdW1uKGNtLmdldExpbmUocG9zLmxpbmUpLCBwb3MuY2gsIHRhYlNpemUpO1xuICAgICAgc3BhY2VzLnB1c2goc3BhY2VTdHIodGFiU2l6ZSAtIGNvbCAlIHRhYlNpemUpKTtcbiAgICB9XG4gICAgY20ucmVwbGFjZVNlbGVjdGlvbnMoc3BhY2VzKTtcbiAgfSxcbiAgZGVmYXVsdFRhYjogZnVuY3Rpb24gKGNtKSB7XG4gICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsgY20uaW5kZW50U2VsZWN0aW9uKFwiYWRkXCIpOyB9XG4gICAgZWxzZSB7IGNtLmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGFiXCIpOyB9XG4gIH0sXG4gIC8vIFN3YXAgdGhlIHR3byBjaGFycyBsZWZ0IGFuZCByaWdodCBvZiBlYWNoIHNlbGVjdGlvbidzIGhlYWQuXG4gIC8vIE1vdmUgY3Vyc29yIGJlaGluZCB0aGUgdHdvIHN3YXBwZWQgY2hhcmFjdGVycyBhZnRlcndhcmRzLlxuICAvL1xuICAvLyBEb2Vzbid0IGNvbnNpZGVyIGxpbmUgZmVlZHMgYSBjaGFyYWN0ZXIuXG4gIC8vIERvZXNuJ3Qgc2NhbiBtb3JlIHRoYW4gb25lIGxpbmUgYWJvdmUgdG8gZmluZCBhIGNoYXJhY3Rlci5cbiAgLy8gRG9lc24ndCBkbyBhbnl0aGluZyBvbiBhbiBlbXB0eSBsaW5lLlxuICAvLyBEb2Vzbid0IGRvIGFueXRoaW5nIHdpdGggbm9uLWVtcHR5IHNlbGVjdGlvbnMuXG4gIHRyYW5zcG9zZUNoYXJzOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgbmV3U2VsID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghcmFuZ2VzW2ldLmVtcHR5KCkpIHsgY29udGludWUgfVxuICAgICAgdmFyIGN1ciA9IHJhbmdlc1tpXS5oZWFkLCBsaW5lID0gZ2V0TGluZShjbS5kb2MsIGN1ci5saW5lKS50ZXh0O1xuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgaWYgKGN1ci5jaCA9PSBsaW5lLmxlbmd0aCkgeyBjdXIgPSBuZXcgUG9zKGN1ci5saW5lLCBjdXIuY2ggLSAxKTsgfVxuICAgICAgICBpZiAoY3VyLmNoID4gMCkge1xuICAgICAgICAgIGN1ciA9IG5ldyBQb3MoY3VyLmxpbmUsIGN1ci5jaCArIDEpO1xuICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZShsaW5lLmNoYXJBdChjdXIuY2ggLSAxKSArIGxpbmUuY2hhckF0KGN1ci5jaCAtIDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBQb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDIpLCBjdXIsIFwiK3RyYW5zcG9zZVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXIubGluZSA+IGNtLmRvYy5maXJzdCkge1xuICAgICAgICAgIHZhciBwcmV2ID0gZ2V0TGluZShjbS5kb2MsIGN1ci5saW5lIC0gMSkudGV4dDtcbiAgICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgY3VyID0gbmV3IFBvcyhjdXIubGluZSwgMSk7XG4gICAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UobGluZS5jaGFyQXQoMCkgKyBjbS5kb2MubGluZVNlcGFyYXRvcigpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmNoYXJBdChwcmV2Lmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcyhjdXIubGluZSAtIDEsIHByZXYubGVuZ3RoIC0gMSksIGN1ciwgXCIrdHJhbnNwb3NlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV3U2VsLnB1c2gobmV3IFJhbmdlKGN1ciwgY3VyKSk7XG4gICAgfVxuICAgIGNtLnNldFNlbGVjdGlvbnMobmV3U2VsKTtcbiAgfSk7IH0sXG4gIG5ld2xpbmVBbmRJbmRlbnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gcnVuSW5PcChjbSwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxzID0gY20ubGlzdFNlbGVjdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpID0gc2Vscy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgIHsgY20ucmVwbGFjZVJhbmdlKGNtLmRvYy5saW5lU2VwYXJhdG9yKCksIHNlbHNbaV0uYW5jaG9yLCBzZWxzW2ldLmhlYWQsIFwiK2lucHV0XCIpOyB9XG4gICAgc2VscyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgc2Vscy5sZW5ndGg7IGkkMSsrKVxuICAgICAgeyBjbS5pbmRlbnRMaW5lKHNlbHNbaSQxXS5mcm9tKCkubGluZSwgbnVsbCwgdHJ1ZSk7IH1cbiAgICBlbnN1cmVDdXJzb3JWaXNpYmxlKGNtKTtcbiAgfSk7IH0sXG4gIG9wZW5MaW5lOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnJlcGxhY2VTZWxlY3Rpb24oXCJcXG5cIiwgXCJzdGFydFwiKTsgfSxcbiAgdG9nZ2xlT3ZlcndyaXRlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnRvZ2dsZU92ZXJ3cml0ZSgpOyB9XG59O1xuXG5cbmZ1bmN0aW9uIGxpbmVTdGFydChjbSwgbGluZU4pIHtcbiAgdmFyIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgbGluZU4pO1xuICB2YXIgdmlzdWFsID0gdmlzdWFsTGluZShsaW5lKTtcbiAgaWYgKHZpc3VhbCAhPSBsaW5lKSB7IGxpbmVOID0gbGluZU5vKHZpc3VhbCk7IH1cbiAgcmV0dXJuIGVuZE9mTGluZSh0cnVlLCBjbSwgdmlzdWFsLCBsaW5lTiwgMSlcbn1cbmZ1bmN0aW9uIGxpbmVFbmQoY20sIGxpbmVOKSB7XG4gIHZhciBsaW5lID0gZ2V0TGluZShjbS5kb2MsIGxpbmVOKTtcbiAgdmFyIHZpc3VhbCA9IHZpc3VhbExpbmVFbmQobGluZSk7XG4gIGlmICh2aXN1YWwgIT0gbGluZSkgeyBsaW5lTiA9IGxpbmVObyh2aXN1YWwpOyB9XG4gIHJldHVybiBlbmRPZkxpbmUodHJ1ZSwgY20sIGxpbmUsIGxpbmVOLCAtMSlcbn1cbmZ1bmN0aW9uIGxpbmVTdGFydFNtYXJ0KGNtLCBwb3MpIHtcbiAgdmFyIHN0YXJ0ID0gbGluZVN0YXJ0KGNtLCBwb3MubGluZSk7XG4gIHZhciBsaW5lID0gZ2V0TGluZShjbS5kb2MsIHN0YXJ0LmxpbmUpO1xuICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lLCBjbS5kb2MuZGlyZWN0aW9uKTtcbiAgaWYgKCFvcmRlciB8fCBvcmRlclswXS5sZXZlbCA9PSAwKSB7XG4gICAgdmFyIGZpcnN0Tm9uV1MgPSBNYXRoLm1heCgwLCBsaW5lLnRleHQuc2VhcmNoKC9cXFMvKSk7XG4gICAgdmFyIGluV1MgPSBwb3MubGluZSA9PSBzdGFydC5saW5lICYmIHBvcy5jaCA8PSBmaXJzdE5vbldTICYmIHBvcy5jaDtcbiAgICByZXR1cm4gUG9zKHN0YXJ0LmxpbmUsIGluV1MgPyAwIDogZmlyc3ROb25XUywgc3RhcnQuc3RpY2t5KVxuICB9XG4gIHJldHVybiBzdGFydFxufVxuXG4vLyBSdW4gYSBoYW5kbGVyIHRoYXQgd2FzIGJvdW5kIHRvIGEga2V5LlxuZnVuY3Rpb24gZG9IYW5kbGVCaW5kaW5nKGNtLCBib3VuZCwgZHJvcFNoaWZ0KSB7XG4gIGlmICh0eXBlb2YgYm91bmQgPT0gXCJzdHJpbmdcIikge1xuICAgIGJvdW5kID0gY29tbWFuZHNbYm91bmRdO1xuICAgIGlmICghYm91bmQpIHsgcmV0dXJuIGZhbHNlIH1cbiAgfVxuICAvLyBFbnN1cmUgcHJldmlvdXMgaW5wdXQgaGFzIGJlZW4gcmVhZCwgc28gdGhhdCB0aGUgaGFuZGxlciBzZWVzIGFcbiAgLy8gY29uc2lzdGVudCB2aWV3IG9mIHRoZSBkb2N1bWVudFxuICBjbS5kaXNwbGF5LmlucHV0LmVuc3VyZVBvbGxlZCgpO1xuICB2YXIgcHJldlNoaWZ0ID0gY20uZGlzcGxheS5zaGlmdCwgZG9uZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIGlmIChjbS5pc1JlYWRPbmx5KCkpIHsgY20uc3RhdGUuc3VwcHJlc3NFZGl0cyA9IHRydWU7IH1cbiAgICBpZiAoZHJvcFNoaWZ0KSB7IGNtLmRpc3BsYXkuc2hpZnQgPSBmYWxzZTsgfVxuICAgIGRvbmUgPSBib3VuZChjbSkgIT0gUGFzcztcbiAgfSBmaW5hbGx5IHtcbiAgICBjbS5kaXNwbGF5LnNoaWZ0ID0gcHJldlNoaWZ0O1xuICAgIGNtLnN0YXRlLnN1cHByZXNzRWRpdHMgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gZG9uZVxufVxuXG5mdW5jdGlvbiBsb29rdXBLZXlGb3JFZGl0b3IoY20sIG5hbWUsIGhhbmRsZSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNtLnN0YXRlLmtleU1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVzdWx0ID0gbG9va3VwS2V5KG5hbWUsIGNtLnN0YXRlLmtleU1hcHNbaV0sIGhhbmRsZSwgY20pO1xuICAgIGlmIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdCB9XG4gIH1cbiAgcmV0dXJuIChjbS5vcHRpb25zLmV4dHJhS2V5cyAmJiBsb29rdXBLZXkobmFtZSwgY20ub3B0aW9ucy5leHRyYUtleXMsIGhhbmRsZSwgY20pKVxuICAgIHx8IGxvb2t1cEtleShuYW1lLCBjbS5vcHRpb25zLmtleU1hcCwgaGFuZGxlLCBjbSlcbn1cblxuLy8gTm90ZSB0aGF0LCBkZXNwaXRlIHRoZSBuYW1lLCB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCB0byBjaGVja1xuLy8gZm9yIGJvdW5kIG1vdXNlIGNsaWNrcy5cblxudmFyIHN0b3BTZXEgPSBuZXcgRGVsYXllZDtcblxuZnVuY3Rpb24gZGlzcGF0Y2hLZXkoY20sIG5hbWUsIGUsIGhhbmRsZSkge1xuICB2YXIgc2VxID0gY20uc3RhdGUua2V5U2VxO1xuICBpZiAoc2VxKSB7XG4gICAgaWYgKGlzTW9kaWZpZXJLZXkobmFtZSkpIHsgcmV0dXJuIFwiaGFuZGxlZFwiIH1cbiAgICBpZiAoL1xcJyQvLnRlc3QobmFtZSkpXG4gICAgICB7IGNtLnN0YXRlLmtleVNlcSA9IG51bGw7IH1cbiAgICBlbHNlXG4gICAgICB7IHN0b3BTZXEuc2V0KDUwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjbS5zdGF0ZS5rZXlTZXEgPT0gc2VxKSB7XG4gICAgICAgICAgY20uc3RhdGUua2V5U2VxID0gbnVsbDtcbiAgICAgICAgICBjbS5kaXNwbGF5LmlucHV0LnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pOyB9XG4gICAgaWYgKGRpc3BhdGNoS2V5SW5uZXIoY20sIHNlcSArIFwiIFwiICsgbmFtZSwgZSwgaGFuZGxlKSkgeyByZXR1cm4gdHJ1ZSB9XG4gIH1cbiAgcmV0dXJuIGRpc3BhdGNoS2V5SW5uZXIoY20sIG5hbWUsIGUsIGhhbmRsZSlcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hLZXlJbm5lcihjbSwgbmFtZSwgZSwgaGFuZGxlKSB7XG4gIHZhciByZXN1bHQgPSBsb29rdXBLZXlGb3JFZGl0b3IoY20sIG5hbWUsIGhhbmRsZSk7XG5cbiAgaWYgKHJlc3VsdCA9PSBcIm11bHRpXCIpXG4gICAgeyBjbS5zdGF0ZS5rZXlTZXEgPSBuYW1lOyB9XG4gIGlmIChyZXN1bHQgPT0gXCJoYW5kbGVkXCIpXG4gICAgeyBzaWduYWxMYXRlcihjbSwgXCJrZXlIYW5kbGVkXCIsIGNtLCBuYW1lLCBlKTsgfVxuXG4gIGlmIChyZXN1bHQgPT0gXCJoYW5kbGVkXCIgfHwgcmVzdWx0ID09IFwibXVsdGlcIikge1xuICAgIGVfcHJldmVudERlZmF1bHQoZSk7XG4gICAgcmVzdGFydEJsaW5rKGNtKTtcbiAgfVxuXG4gIHJldHVybiAhIXJlc3VsdFxufVxuXG4vLyBIYW5kbGUgYSBrZXkgZnJvbSB0aGUga2V5ZG93biBldmVudC5cbmZ1bmN0aW9uIGhhbmRsZUtleUJpbmRpbmcoY20sIGUpIHtcbiAgdmFyIG5hbWUgPSBrZXlOYW1lKGUsIHRydWUpO1xuICBpZiAoIW5hbWUpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAoZS5zaGlmdEtleSAmJiAhY20uc3RhdGUua2V5U2VxKSB7XG4gICAgLy8gRmlyc3QgdHJ5IHRvIHJlc29sdmUgZnVsbCBuYW1lIChpbmNsdWRpbmcgJ1NoaWZ0LScpLiBGYWlsaW5nXG4gICAgLy8gdGhhdCwgc2VlIGlmIHRoZXJlIGlzIGEgY3Vyc29yLW1vdGlvbiBjb21tYW5kIChzdGFydGluZyB3aXRoXG4gICAgLy8gJ2dvJykgYm91bmQgdG8gdGhlIGtleW5hbWUgd2l0aG91dCAnU2hpZnQtJy5cbiAgICByZXR1cm4gZGlzcGF0Y2hLZXkoY20sIFwiU2hpZnQtXCIgKyBuYW1lLCBlLCBmdW5jdGlvbiAoYikgeyByZXR1cm4gZG9IYW5kbGVCaW5kaW5nKGNtLCBiLCB0cnVlKTsgfSlcbiAgICAgICAgfHwgZGlzcGF0Y2hLZXkoY20sIG5hbWUsIGUsIGZ1bmN0aW9uIChiKSB7XG4gICAgICAgICAgICAgaWYgKHR5cGVvZiBiID09IFwic3RyaW5nXCIgPyAvXmdvW0EtWl0vLnRlc3QoYikgOiBiLm1vdGlvbilcbiAgICAgICAgICAgICAgIHsgcmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSwgYikgfVxuICAgICAgICAgICB9KVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBkaXNwYXRjaEtleShjbSwgbmFtZSwgZSwgZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSwgYik7IH0pXG4gIH1cbn1cblxuLy8gSGFuZGxlIGEga2V5IGZyb20gdGhlIGtleXByZXNzIGV2ZW50XG5mdW5jdGlvbiBoYW5kbGVDaGFyQmluZGluZyhjbSwgZSwgY2gpIHtcbiAgcmV0dXJuIGRpc3BhdGNoS2V5KGNtLCBcIidcIiArIGNoICsgXCInXCIsIGUsIGZ1bmN0aW9uIChiKSB7IHJldHVybiBkb0hhbmRsZUJpbmRpbmcoY20sIGIsIHRydWUpOyB9KVxufVxuXG52YXIgbGFzdFN0b3BwZWRLZXkgPSBudWxsO1xuZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgdmFyIGNtID0gdGhpcztcbiAgY20uY3VyT3AuZm9jdXMgPSBhY3RpdmVFbHQoKTtcbiAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSkgeyByZXR1cm4gfVxuICAvLyBJRSBkb2VzIHN0cmFuZ2UgdGhpbmdzIHdpdGggZXNjYXBlLlxuICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExICYmIGUua2V5Q29kZSA9PSAyNykgeyBlLnJldHVyblZhbHVlID0gZmFsc2U7IH1cbiAgdmFyIGNvZGUgPSBlLmtleUNvZGU7XG4gIGNtLmRpc3BsYXkuc2hpZnQgPSBjb2RlID09IDE2IHx8IGUuc2hpZnRLZXk7XG4gIHZhciBoYW5kbGVkID0gaGFuZGxlS2V5QmluZGluZyhjbSwgZSk7XG4gIGlmIChwcmVzdG8pIHtcbiAgICBsYXN0U3RvcHBlZEtleSA9IGhhbmRsZWQgPyBjb2RlIDogbnVsbDtcbiAgICAvLyBPcGVyYSBoYXMgbm8gY3V0IGV2ZW50Li4uIHdlIHRyeSB0byBhdCBsZWFzdCBjYXRjaCB0aGUga2V5IGNvbWJvXG4gICAgaWYgKCFoYW5kbGVkICYmIGNvZGUgPT0gODggJiYgIWhhc0NvcHlFdmVudCAmJiAobWFjID8gZS5tZXRhS2V5IDogZS5jdHJsS2V5KSlcbiAgICAgIHsgY20ucmVwbGFjZVNlbGVjdGlvbihcIlwiLCBudWxsLCBcImN1dFwiKTsgfVxuICB9XG5cbiAgLy8gVHVybiBtb3VzZSBpbnRvIGNyb3NzaGFpciB3aGVuIEFsdCBpcyBoZWxkIG9uIE1hYy5cbiAgaWYgKGNvZGUgPT0gMTggJiYgIS9cXGJDb2RlTWlycm9yLWNyb3NzaGFpclxcYi8udGVzdChjbS5kaXNwbGF5LmxpbmVEaXYuY2xhc3NOYW1lKSlcbiAgICB7IHNob3dDcm9zc0hhaXIoY20pOyB9XG59XG5cbmZ1bmN0aW9uIHNob3dDcm9zc0hhaXIoY20pIHtcbiAgdmFyIGxpbmVEaXYgPSBjbS5kaXNwbGF5LmxpbmVEaXY7XG4gIGFkZENsYXNzKGxpbmVEaXYsIFwiQ29kZU1pcnJvci1jcm9zc2hhaXJcIik7XG5cbiAgZnVuY3Rpb24gdXAoZSkge1xuICAgIGlmIChlLmtleUNvZGUgPT0gMTggfHwgIWUuYWx0S2V5KSB7XG4gICAgICBybUNsYXNzKGxpbmVEaXYsIFwiQ29kZU1pcnJvci1jcm9zc2hhaXJcIik7XG4gICAgICBvZmYoZG9jdW1lbnQsIFwia2V5dXBcIiwgdXApO1xuICAgICAgb2ZmKGRvY3VtZW50LCBcIm1vdXNlb3ZlclwiLCB1cCk7XG4gICAgfVxuICB9XG4gIG9uKGRvY3VtZW50LCBcImtleXVwXCIsIHVwKTtcbiAgb24oZG9jdW1lbnQsIFwibW91c2VvdmVyXCIsIHVwKTtcbn1cblxuZnVuY3Rpb24gb25LZXlVcChlKSB7XG4gIGlmIChlLmtleUNvZGUgPT0gMTYpIHsgdGhpcy5kb2Muc2VsLnNoaWZ0ID0gZmFsc2U7IH1cbiAgc2lnbmFsRE9NRXZlbnQodGhpcywgZSk7XG59XG5cbmZ1bmN0aW9uIG9uS2V5UHJlc3MoZSkge1xuICB2YXIgY20gPSB0aGlzO1xuICBpZiAoZXZlbnRJbldpZGdldChjbS5kaXNwbGF5LCBlKSB8fCBzaWduYWxET01FdmVudChjbSwgZSkgfHwgZS5jdHJsS2V5ICYmICFlLmFsdEtleSB8fCBtYWMgJiYgZS5tZXRhS2V5KSB7IHJldHVybiB9XG4gIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlLCBjaGFyQ29kZSA9IGUuY2hhckNvZGU7XG4gIGlmIChwcmVzdG8gJiYga2V5Q29kZSA9PSBsYXN0U3RvcHBlZEtleSkge2xhc3RTdG9wcGVkS2V5ID0gbnVsbDsgZV9wcmV2ZW50RGVmYXVsdChlKTsgcmV0dXJufVxuICBpZiAoKHByZXN0byAmJiAoIWUud2hpY2ggfHwgZS53aGljaCA8IDEwKSkgJiYgaGFuZGxlS2V5QmluZGluZyhjbSwgZSkpIHsgcmV0dXJuIH1cbiAgdmFyIGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSA9PSBudWxsID8ga2V5Q29kZSA6IGNoYXJDb2RlKTtcbiAgLy8gU29tZSBicm93c2VycyBmaXJlIGtleXByZXNzIGV2ZW50cyBmb3IgYmFja3NwYWNlXG4gIGlmIChjaCA9PSBcIlxceDA4XCIpIHsgcmV0dXJuIH1cbiAgaWYgKGhhbmRsZUNoYXJCaW5kaW5nKGNtLCBlLCBjaCkpIHsgcmV0dXJuIH1cbiAgY20uZGlzcGxheS5pbnB1dC5vbktleVByZXNzKGUpO1xufVxuXG52YXIgRE9VQkxFQ0xJQ0tfREVMQVkgPSA0MDA7XG5cbnZhciBQYXN0Q2xpY2sgPSBmdW5jdGlvbih0aW1lLCBwb3MsIGJ1dHRvbikge1xuICB0aGlzLnRpbWUgPSB0aW1lO1xuICB0aGlzLnBvcyA9IHBvcztcbiAgdGhpcy5idXR0b24gPSBidXR0b247XG59O1xuXG5QYXN0Q2xpY2sucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAodGltZSwgcG9zLCBidXR0b24pIHtcbiAgcmV0dXJuIHRoaXMudGltZSArIERPVUJMRUNMSUNLX0RFTEFZID4gdGltZSAmJlxuICAgIGNtcChwb3MsIHRoaXMucG9zKSA9PSAwICYmIGJ1dHRvbiA9PSB0aGlzLmJ1dHRvblxufTtcblxudmFyIGxhc3RDbGljaztcbnZhciBsYXN0RG91YmxlQ2xpY2s7XG5mdW5jdGlvbiBjbGlja1JlcGVhdChwb3MsIGJ1dHRvbikge1xuICB2YXIgbm93ID0gK25ldyBEYXRlO1xuICBpZiAobGFzdERvdWJsZUNsaWNrICYmIGxhc3REb3VibGVDbGljay5jb21wYXJlKG5vdywgcG9zLCBidXR0b24pKSB7XG4gICAgbGFzdENsaWNrID0gbGFzdERvdWJsZUNsaWNrID0gbnVsbDtcbiAgICByZXR1cm4gXCJ0cmlwbGVcIlxuICB9IGVsc2UgaWYgKGxhc3RDbGljayAmJiBsYXN0Q2xpY2suY29tcGFyZShub3csIHBvcywgYnV0dG9uKSkge1xuICAgIGxhc3REb3VibGVDbGljayA9IG5ldyBQYXN0Q2xpY2sobm93LCBwb3MsIGJ1dHRvbik7XG4gICAgbGFzdENsaWNrID0gbnVsbDtcbiAgICByZXR1cm4gXCJkb3VibGVcIlxuICB9IGVsc2Uge1xuICAgIGxhc3RDbGljayA9IG5ldyBQYXN0Q2xpY2sobm93LCBwb3MsIGJ1dHRvbik7XG4gICAgbGFzdERvdWJsZUNsaWNrID0gbnVsbDtcbiAgICByZXR1cm4gXCJzaW5nbGVcIlxuICB9XG59XG5cbi8vIEEgbW91c2UgZG93biBjYW4gYmUgYSBzaW5nbGUgY2xpY2ssIGRvdWJsZSBjbGljaywgdHJpcGxlIGNsaWNrLFxuLy8gc3RhcnQgb2Ygc2VsZWN0aW9uIGRyYWcsIHN0YXJ0IG9mIHRleHQgZHJhZywgbmV3IGN1cnNvclxuLy8gKGN0cmwtY2xpY2spLCByZWN0YW5nbGUgZHJhZyAoYWx0LWRyYWcpLCBvciB4d2luXG4vLyBtaWRkbGUtY2xpY2stcGFzdGUuIE9yIGl0IG1pZ2h0IGJlIGEgY2xpY2sgb24gc29tZXRoaW5nIHdlIHNob3VsZFxuLy8gbm90IGludGVyZmVyZSB3aXRoLCBzdWNoIGFzIGEgc2Nyb2xsYmFyIG9yIHdpZGdldC5cbmZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgdmFyIGNtID0gdGhpcywgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gIGlmIChzaWduYWxET01FdmVudChjbSwgZSkgfHwgZGlzcGxheS5hY3RpdmVUb3VjaCAmJiBkaXNwbGF5LmlucHV0LnN1cHBvcnRzVG91Y2goKSkgeyByZXR1cm4gfVxuICBkaXNwbGF5LmlucHV0LmVuc3VyZVBvbGxlZCgpO1xuICBkaXNwbGF5LnNoaWZ0ID0gZS5zaGlmdEtleTtcblxuICBpZiAoZXZlbnRJbldpZGdldChkaXNwbGF5LCBlKSkge1xuICAgIGlmICghd2Via2l0KSB7XG4gICAgICAvLyBCcmllZmx5IHR1cm4gb2ZmIGRyYWdnYWJpbGl0eSwgdG8gYWxsb3cgd2lkZ2V0cyB0byBkb1xuICAgICAgLy8gbm9ybWFsIGRyYWdnaW5nIHRoaW5ncy5cbiAgICAgIGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gdHJ1ZTsgfSwgMTAwKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGNsaWNrSW5HdXR0ZXIoY20sIGUpKSB7IHJldHVybiB9XG4gIHZhciBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUpLCBidXR0b24gPSBlX2J1dHRvbihlKSwgcmVwZWF0ID0gcG9zID8gY2xpY2tSZXBlYXQocG9zLCBidXR0b24pIDogXCJzaW5nbGVcIjtcbiAgd2luZG93LmZvY3VzKCk7XG5cbiAgLy8gIzMyNjE6IG1ha2Ugc3VyZSwgdGhhdCB3ZSdyZSBub3Qgc3RhcnRpbmcgYSBzZWNvbmQgc2VsZWN0aW9uXG4gIGlmIChidXR0b24gPT0gMSAmJiBjbS5zdGF0ZS5zZWxlY3RpbmdUZXh0KVxuICAgIHsgY20uc3RhdGUuc2VsZWN0aW5nVGV4dChlKTsgfVxuXG4gIGlmIChwb3MgJiYgaGFuZGxlTWFwcGVkQnV0dG9uKGNtLCBidXR0b24sIHBvcywgcmVwZWF0LCBlKSkgeyByZXR1cm4gfVxuXG4gIGlmIChidXR0b24gPT0gMSkge1xuICAgIGlmIChwb3MpIHsgbGVmdEJ1dHRvbkRvd24oY20sIHBvcywgcmVwZWF0LCBlKTsgfVxuICAgIGVsc2UgaWYgKGVfdGFyZ2V0KGUpID09IGRpc3BsYXkuc2Nyb2xsZXIpIHsgZV9wcmV2ZW50RGVmYXVsdChlKTsgfVxuICB9IGVsc2UgaWYgKGJ1dHRvbiA9PSAyKSB7XG4gICAgaWYgKHBvcykgeyBleHRlbmRTZWxlY3Rpb24oY20uZG9jLCBwb3MpOyB9XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBkaXNwbGF5LmlucHV0LmZvY3VzKCk7IH0sIDIwKTtcbiAgfSBlbHNlIGlmIChidXR0b24gPT0gMykge1xuICAgIGlmIChjYXB0dXJlUmlnaHRDbGljaykgeyBvbkNvbnRleHRNZW51KGNtLCBlKTsgfVxuICAgIGVsc2UgeyBkZWxheUJsdXJFdmVudChjbSk7IH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVNYXBwZWRCdXR0b24oY20sIGJ1dHRvbiwgcG9zLCByZXBlYXQsIGV2ZW50KSB7XG4gIHZhciBuYW1lID0gXCJDbGlja1wiO1xuICBpZiAocmVwZWF0ID09IFwiZG91YmxlXCIpIHsgbmFtZSA9IFwiRG91YmxlXCIgKyBuYW1lOyB9XG4gIGVsc2UgaWYgKHJlcGVhdCA9PSBcInRyaXBsZVwiKSB7IG5hbWUgPSBcIlRyaXBsZVwiICsgbmFtZTsgfVxuICBuYW1lID0gKGJ1dHRvbiA9PSAxID8gXCJMZWZ0XCIgOiBidXR0b24gPT0gMiA/IFwiTWlkZGxlXCIgOiBcIlJpZ2h0XCIpICsgbmFtZTtcblxuICByZXR1cm4gZGlzcGF0Y2hLZXkoY20sICBhZGRNb2RpZmllck5hbWVzKG5hbWUsIGV2ZW50KSwgZXZlbnQsIGZ1bmN0aW9uIChib3VuZCkge1xuICAgIGlmICh0eXBlb2YgYm91bmQgPT0gXCJzdHJpbmdcIikgeyBib3VuZCA9IGNvbW1hbmRzW2JvdW5kXTsgfVxuICAgIGlmICghYm91bmQpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBpZiAoY20uaXNSZWFkT25seSgpKSB7IGNtLnN0YXRlLnN1cHByZXNzRWRpdHMgPSB0cnVlOyB9XG4gICAgICBkb25lID0gYm91bmQoY20sIHBvcykgIT0gUGFzcztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY20uc3RhdGUuc3VwcHJlc3NFZGl0cyA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZG9uZVxuICB9KVxufVxuXG5mdW5jdGlvbiBjb25maWd1cmVNb3VzZShjbSwgcmVwZWF0LCBldmVudCkge1xuICB2YXIgb3B0aW9uID0gY20uZ2V0T3B0aW9uKFwiY29uZmlndXJlTW91c2VcIik7XG4gIHZhciB2YWx1ZSA9IG9wdGlvbiA/IG9wdGlvbihjbSwgcmVwZWF0LCBldmVudCkgOiB7fTtcbiAgaWYgKHZhbHVlLnVuaXQgPT0gbnVsbCkge1xuICAgIHZhciByZWN0ID0gY2hyb21lT1MgPyBldmVudC5zaGlmdEtleSAmJiBldmVudC5tZXRhS2V5IDogZXZlbnQuYWx0S2V5O1xuICAgIHZhbHVlLnVuaXQgPSByZWN0ID8gXCJyZWN0YW5nbGVcIiA6IHJlcGVhdCA9PSBcInNpbmdsZVwiID8gXCJjaGFyXCIgOiByZXBlYXQgPT0gXCJkb3VibGVcIiA/IFwid29yZFwiIDogXCJsaW5lXCI7XG4gIH1cbiAgaWYgKHZhbHVlLmV4dGVuZCA9PSBudWxsIHx8IGNtLmRvYy5leHRlbmQpIHsgdmFsdWUuZXh0ZW5kID0gY20uZG9jLmV4dGVuZCB8fCBldmVudC5zaGlmdEtleTsgfVxuICBpZiAodmFsdWUuYWRkTmV3ID09IG51bGwpIHsgdmFsdWUuYWRkTmV3ID0gbWFjID8gZXZlbnQubWV0YUtleSA6IGV2ZW50LmN0cmxLZXk7IH1cbiAgaWYgKHZhbHVlLm1vdmVPbkRyYWcgPT0gbnVsbCkgeyB2YWx1ZS5tb3ZlT25EcmFnID0gIShtYWMgPyBldmVudC5hbHRLZXkgOiBldmVudC5jdHJsS2V5KTsgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuZnVuY3Rpb24gbGVmdEJ1dHRvbkRvd24oY20sIHBvcywgcmVwZWF0LCBldmVudCkge1xuICBpZiAoaWUpIHsgc2V0VGltZW91dChiaW5kKGVuc3VyZUZvY3VzLCBjbSksIDApOyB9XG4gIGVsc2UgeyBjbS5jdXJPcC5mb2N1cyA9IGFjdGl2ZUVsdCgpOyB9XG5cbiAgdmFyIGJlaGF2aW9yID0gY29uZmlndXJlTW91c2UoY20sIHJlcGVhdCwgZXZlbnQpO1xuXG4gIHZhciBzZWwgPSBjbS5kb2Muc2VsLCBjb250YWluZWQ7XG4gIGlmIChjbS5vcHRpb25zLmRyYWdEcm9wICYmIGRyYWdBbmREcm9wICYmICFjbS5pc1JlYWRPbmx5KCkgJiZcbiAgICAgIHJlcGVhdCA9PSBcInNpbmdsZVwiICYmIChjb250YWluZWQgPSBzZWwuY29udGFpbnMocG9zKSkgPiAtMSAmJlxuICAgICAgKGNtcCgoY29udGFpbmVkID0gc2VsLnJhbmdlc1tjb250YWluZWRdKS5mcm9tKCksIHBvcykgPCAwIHx8IHBvcy54UmVsID4gMCkgJiZcbiAgICAgIChjbXAoY29udGFpbmVkLnRvKCksIHBvcykgPiAwIHx8IHBvcy54UmVsIDwgMCkpXG4gICAgeyBsZWZ0QnV0dG9uU3RhcnREcmFnKGNtLCBldmVudCwgcG9zLCBiZWhhdmlvcik7IH1cbiAgZWxzZVxuICAgIHsgbGVmdEJ1dHRvblNlbGVjdChjbSwgZXZlbnQsIHBvcywgYmVoYXZpb3IpOyB9XG59XG5cbi8vIFN0YXJ0IGEgdGV4dCBkcmFnLiBXaGVuIGl0IGVuZHMsIHNlZSBpZiBhbnkgZHJhZ2dpbmcgYWN0dWFsbHlcbi8vIGhhcHBlbiwgYW5kIHRyZWF0IGFzIGEgY2xpY2sgaWYgaXQgZGlkbid0LlxuZnVuY3Rpb24gbGVmdEJ1dHRvblN0YXJ0RHJhZyhjbSwgZXZlbnQsIHBvcywgYmVoYXZpb3IpIHtcbiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBtb3ZlZCA9IGZhbHNlO1xuICB2YXIgZHJhZ0VuZCA9IG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAod2Via2l0KSB7IGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gZmFsc2U7IH1cbiAgICBjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgPSBmYWxzZTtcbiAgICBvZmYoZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQsIFwibW91c2V1cFwiLCBkcmFnRW5kKTtcbiAgICBvZmYoZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIG1vdXNlTW92ZSk7XG4gICAgb2ZmKGRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJhZ3N0YXJ0XCIsIGRyYWdTdGFydCk7XG4gICAgb2ZmKGRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJvcFwiLCBkcmFnRW5kKTtcbiAgICBpZiAoIW1vdmVkKSB7XG4gICAgICBlX3ByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgaWYgKCFiZWhhdmlvci5hZGROZXcpXG4gICAgICAgIHsgZXh0ZW5kU2VsZWN0aW9uKGNtLmRvYywgcG9zLCBudWxsLCBudWxsLCBiZWhhdmlvci5leHRlbmQpOyB9XG4gICAgICAvLyBXb3JrIGFyb3VuZCB1bmV4cGxhaW5hYmxlIGZvY3VzIHByb2JsZW0gaW4gSUU5ICgjMjEyNykgYW5kIENocm9tZSAoIzMwODEpXG4gICAgICBpZiAod2Via2l0IHx8IGllICYmIGllX3ZlcnNpb24gPT0gOSlcbiAgICAgICAgeyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtkaXNwbGF5LndyYXBwZXIub3duZXJEb2N1bWVudC5ib2R5LmZvY3VzKCk7IGRpc3BsYXkuaW5wdXQuZm9jdXMoKTt9LCAyMCk7IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyBkaXNwbGF5LmlucHV0LmZvY3VzKCk7IH1cbiAgICB9XG4gIH0pO1xuICB2YXIgbW91c2VNb3ZlID0gZnVuY3Rpb24oZTIpIHtcbiAgICBtb3ZlZCA9IG1vdmVkIHx8IE1hdGguYWJzKGV2ZW50LmNsaWVudFggLSBlMi5jbGllbnRYKSArIE1hdGguYWJzKGV2ZW50LmNsaWVudFkgLSBlMi5jbGllbnRZKSA+PSAxMDtcbiAgfTtcbiAgdmFyIGRyYWdTdGFydCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vdmVkID0gdHJ1ZTsgfTtcbiAgLy8gTGV0IHRoZSBkcmFnIGhhbmRsZXIgaGFuZGxlIHRoaXMuXG4gIGlmICh3ZWJraXQpIHsgZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSB0cnVlOyB9XG4gIGNtLnN0YXRlLmRyYWdnaW5nVGV4dCA9IGRyYWdFbmQ7XG4gIGRyYWdFbmQuY29weSA9ICFiZWhhdmlvci5tb3ZlT25EcmFnO1xuICAvLyBJRSdzIGFwcHJvYWNoIHRvIGRyYWdnYWJsZVxuICBpZiAoZGlzcGxheS5zY3JvbGxlci5kcmFnRHJvcCkgeyBkaXNwbGF5LnNjcm9sbGVyLmRyYWdEcm9wKCk7IH1cbiAgb24oZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQsIFwibW91c2V1cFwiLCBkcmFnRW5kKTtcbiAgb24oZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIG1vdXNlTW92ZSk7XG4gIG9uKGRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJhZ3N0YXJ0XCIsIGRyYWdTdGFydCk7XG4gIG9uKGRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJvcFwiLCBkcmFnRW5kKTtcblxuICBkZWxheUJsdXJFdmVudChjbSk7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcGxheS5pbnB1dC5mb2N1cygpOyB9LCAyMCk7XG59XG5cbmZ1bmN0aW9uIHJhbmdlRm9yVW5pdChjbSwgcG9zLCB1bml0KSB7XG4gIGlmICh1bml0ID09IFwiY2hhclwiKSB7IHJldHVybiBuZXcgUmFuZ2UocG9zLCBwb3MpIH1cbiAgaWYgKHVuaXQgPT0gXCJ3b3JkXCIpIHsgcmV0dXJuIGNtLmZpbmRXb3JkQXQocG9zKSB9XG4gIGlmICh1bml0ID09IFwibGluZVwiKSB7IHJldHVybiBuZXcgUmFuZ2UoUG9zKHBvcy5saW5lLCAwKSwgY2xpcFBvcyhjbS5kb2MsIFBvcyhwb3MubGluZSArIDEsIDApKSkgfVxuICB2YXIgcmVzdWx0ID0gdW5pdChjbSwgcG9zKTtcbiAgcmV0dXJuIG5ldyBSYW5nZShyZXN1bHQuZnJvbSwgcmVzdWx0LnRvKVxufVxuXG4vLyBOb3JtYWwgc2VsZWN0aW9uLCBhcyBvcHBvc2VkIHRvIHRleHQgZHJhZ2dpbmcuXG5mdW5jdGlvbiBsZWZ0QnV0dG9uU2VsZWN0KGNtLCBldmVudCwgc3RhcnQsIGJlaGF2aW9yKSB7XG4gIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jO1xuICBlX3ByZXZlbnREZWZhdWx0KGV2ZW50KTtcblxuICB2YXIgb3VyUmFuZ2UsIG91ckluZGV4LCBzdGFydFNlbCA9IGRvYy5zZWwsIHJhbmdlcyA9IHN0YXJ0U2VsLnJhbmdlcztcbiAgaWYgKGJlaGF2aW9yLmFkZE5ldyAmJiAhYmVoYXZpb3IuZXh0ZW5kKSB7XG4gICAgb3VySW5kZXggPSBkb2Muc2VsLmNvbnRhaW5zKHN0YXJ0KTtcbiAgICBpZiAob3VySW5kZXggPiAtMSlcbiAgICAgIHsgb3VyUmFuZ2UgPSByYW5nZXNbb3VySW5kZXhdOyB9XG4gICAgZWxzZVxuICAgICAgeyBvdXJSYW5nZSA9IG5ldyBSYW5nZShzdGFydCwgc3RhcnQpOyB9XG4gIH0gZWxzZSB7XG4gICAgb3VyUmFuZ2UgPSBkb2Muc2VsLnByaW1hcnkoKTtcbiAgICBvdXJJbmRleCA9IGRvYy5zZWwucHJpbUluZGV4O1xuICB9XG5cbiAgaWYgKGJlaGF2aW9yLnVuaXQgPT0gXCJyZWN0YW5nbGVcIikge1xuICAgIGlmICghYmVoYXZpb3IuYWRkTmV3KSB7IG91clJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0LCBzdGFydCk7IH1cbiAgICBzdGFydCA9IHBvc0Zyb21Nb3VzZShjbSwgZXZlbnQsIHRydWUsIHRydWUpO1xuICAgIG91ckluZGV4ID0gLTE7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJhbmdlJCQxID0gcmFuZ2VGb3JVbml0KGNtLCBzdGFydCwgYmVoYXZpb3IudW5pdCk7XG4gICAgaWYgKGJlaGF2aW9yLmV4dGVuZClcbiAgICAgIHsgb3VyUmFuZ2UgPSBleHRlbmRSYW5nZShvdXJSYW5nZSwgcmFuZ2UkJDEuYW5jaG9yLCByYW5nZSQkMS5oZWFkLCBiZWhhdmlvci5leHRlbmQpOyB9XG4gICAgZWxzZVxuICAgICAgeyBvdXJSYW5nZSA9IHJhbmdlJCQxOyB9XG4gIH1cblxuICBpZiAoIWJlaGF2aW9yLmFkZE5ldykge1xuICAgIG91ckluZGV4ID0gMDtcbiAgICBzZXRTZWxlY3Rpb24oZG9jLCBuZXcgU2VsZWN0aW9uKFtvdXJSYW5nZV0sIDApLCBzZWxfbW91c2UpO1xuICAgIHN0YXJ0U2VsID0gZG9jLnNlbDtcbiAgfSBlbHNlIGlmIChvdXJJbmRleCA9PSAtMSkge1xuICAgIG91ckluZGV4ID0gcmFuZ2VzLmxlbmd0aDtcbiAgICBzZXRTZWxlY3Rpb24oZG9jLCBub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzLmNvbmNhdChbb3VyUmFuZ2VdKSwgb3VySW5kZXgpLFxuICAgICAgICAgICAgICAgICB7c2Nyb2xsOiBmYWxzZSwgb3JpZ2luOiBcIiptb3VzZVwifSk7XG4gIH0gZWxzZSBpZiAocmFuZ2VzLmxlbmd0aCA+IDEgJiYgcmFuZ2VzW291ckluZGV4XS5lbXB0eSgpICYmIGJlaGF2aW9yLnVuaXQgPT0gXCJjaGFyXCIgJiYgIWJlaGF2aW9yLmV4dGVuZCkge1xuICAgIHNldFNlbGVjdGlvbihkb2MsIG5vcm1hbGl6ZVNlbGVjdGlvbihyYW5nZXMuc2xpY2UoMCwgb3VySW5kZXgpLmNvbmNhdChyYW5nZXMuc2xpY2Uob3VySW5kZXggKyAxKSksIDApLFxuICAgICAgICAgICAgICAgICB7c2Nyb2xsOiBmYWxzZSwgb3JpZ2luOiBcIiptb3VzZVwifSk7XG4gICAgc3RhcnRTZWwgPSBkb2Muc2VsO1xuICB9IGVsc2Uge1xuICAgIHJlcGxhY2VPbmVTZWxlY3Rpb24oZG9jLCBvdXJJbmRleCwgb3VyUmFuZ2UsIHNlbF9tb3VzZSk7XG4gIH1cblxuICB2YXIgbGFzdFBvcyA9IHN0YXJ0O1xuICBmdW5jdGlvbiBleHRlbmRUbyhwb3MpIHtcbiAgICBpZiAoY21wKGxhc3RQb3MsIHBvcykgPT0gMCkgeyByZXR1cm4gfVxuICAgIGxhc3RQb3MgPSBwb3M7XG5cbiAgICBpZiAoYmVoYXZpb3IudW5pdCA9PSBcInJlY3RhbmdsZVwiKSB7XG4gICAgICB2YXIgcmFuZ2VzID0gW10sIHRhYlNpemUgPSBjbS5vcHRpb25zLnRhYlNpemU7XG4gICAgICB2YXIgc3RhcnRDb2wgPSBjb3VudENvbHVtbihnZXRMaW5lKGRvYywgc3RhcnQubGluZSkudGV4dCwgc3RhcnQuY2gsIHRhYlNpemUpO1xuICAgICAgdmFyIHBvc0NvbCA9IGNvdW50Q29sdW1uKGdldExpbmUoZG9jLCBwb3MubGluZSkudGV4dCwgcG9zLmNoLCB0YWJTaXplKTtcbiAgICAgIHZhciBsZWZ0ID0gTWF0aC5taW4oc3RhcnRDb2wsIHBvc0NvbCksIHJpZ2h0ID0gTWF0aC5tYXgoc3RhcnRDb2wsIHBvc0NvbCk7XG4gICAgICBmb3IgKHZhciBsaW5lID0gTWF0aC5taW4oc3RhcnQubGluZSwgcG9zLmxpbmUpLCBlbmQgPSBNYXRoLm1pbihjbS5sYXN0TGluZSgpLCBNYXRoLm1heChzdGFydC5saW5lLCBwb3MubGluZSkpO1xuICAgICAgICAgICBsaW5lIDw9IGVuZDsgbGluZSsrKSB7XG4gICAgICAgIHZhciB0ZXh0ID0gZ2V0TGluZShkb2MsIGxpbmUpLnRleHQsIGxlZnRQb3MgPSBmaW5kQ29sdW1uKHRleHQsIGxlZnQsIHRhYlNpemUpO1xuICAgICAgICBpZiAobGVmdCA9PSByaWdodClcbiAgICAgICAgICB7IHJhbmdlcy5wdXNoKG5ldyBSYW5nZShQb3MobGluZSwgbGVmdFBvcyksIFBvcyhsaW5lLCBsZWZ0UG9zKSkpOyB9XG4gICAgICAgIGVsc2UgaWYgKHRleHQubGVuZ3RoID4gbGVmdFBvcylcbiAgICAgICAgICB7IHJhbmdlcy5wdXNoKG5ldyBSYW5nZShQb3MobGluZSwgbGVmdFBvcyksIFBvcyhsaW5lLCBmaW5kQ29sdW1uKHRleHQsIHJpZ2h0LCB0YWJTaXplKSkpKTsgfVxuICAgICAgfVxuICAgICAgaWYgKCFyYW5nZXMubGVuZ3RoKSB7IHJhbmdlcy5wdXNoKG5ldyBSYW5nZShzdGFydCwgc3RhcnQpKTsgfVxuICAgICAgc2V0U2VsZWN0aW9uKGRvYywgbm9ybWFsaXplU2VsZWN0aW9uKHN0YXJ0U2VsLnJhbmdlcy5zbGljZSgwLCBvdXJJbmRleCkuY29uY2F0KHJhbmdlcyksIG91ckluZGV4KSxcbiAgICAgICAgICAgICAgICAgICB7b3JpZ2luOiBcIiptb3VzZVwiLCBzY3JvbGw6IGZhbHNlfSk7XG4gICAgICBjbS5zY3JvbGxJbnRvVmlldyhwb3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb2xkUmFuZ2UgPSBvdXJSYW5nZTtcbiAgICAgIHZhciByYW5nZSQkMSA9IHJhbmdlRm9yVW5pdChjbSwgcG9zLCBiZWhhdmlvci51bml0KTtcbiAgICAgIHZhciBhbmNob3IgPSBvbGRSYW5nZS5hbmNob3IsIGhlYWQ7XG4gICAgICBpZiAoY21wKHJhbmdlJCQxLmFuY2hvciwgYW5jaG9yKSA+IDApIHtcbiAgICAgICAgaGVhZCA9IHJhbmdlJCQxLmhlYWQ7XG4gICAgICAgIGFuY2hvciA9IG1pblBvcyhvbGRSYW5nZS5mcm9tKCksIHJhbmdlJCQxLmFuY2hvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFkID0gcmFuZ2UkJDEuYW5jaG9yO1xuICAgICAgICBhbmNob3IgPSBtYXhQb3Mob2xkUmFuZ2UudG8oKSwgcmFuZ2UkJDEuaGVhZCk7XG4gICAgICB9XG4gICAgICB2YXIgcmFuZ2VzJDEgPSBzdGFydFNlbC5yYW5nZXMuc2xpY2UoMCk7XG4gICAgICByYW5nZXMkMVtvdXJJbmRleF0gPSBiaWRpU2ltcGxpZnkoY20sIG5ldyBSYW5nZShjbGlwUG9zKGRvYywgYW5jaG9yKSwgaGVhZCkpO1xuICAgICAgc2V0U2VsZWN0aW9uKGRvYywgbm9ybWFsaXplU2VsZWN0aW9uKHJhbmdlcyQxLCBvdXJJbmRleCksIHNlbF9tb3VzZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVkaXRvclNpemUgPSBkaXNwbGF5LndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIC8vIFVzZWQgdG8gZW5zdXJlIHRpbWVvdXQgcmUtdHJpZXMgZG9uJ3QgZmlyZSB3aGVuIGFub3RoZXIgZXh0ZW5kXG4gIC8vIGhhcHBlbmVkIGluIHRoZSBtZWFudGltZSAoY2xlYXJUaW1lb3V0IGlzbid0IHJlbGlhYmxlIC0tIGF0XG4gIC8vIGxlYXN0IG9uIENocm9tZSwgdGhlIHRpbWVvdXRzIHN0aWxsIGhhcHBlbiBldmVuIHdoZW4gY2xlYXJlZCxcbiAgLy8gaWYgdGhlIGNsZWFyIGhhcHBlbnMgYWZ0ZXIgdGhlaXIgc2NoZWR1bGVkIGZpcmluZyB0aW1lKS5cbiAgdmFyIGNvdW50ZXIgPSAwO1xuXG4gIGZ1bmN0aW9uIGV4dGVuZChlKSB7XG4gICAgdmFyIGN1ckNvdW50ID0gKytjb3VudGVyO1xuICAgIHZhciBjdXIgPSBwb3NGcm9tTW91c2UoY20sIGUsIHRydWUsIGJlaGF2aW9yLnVuaXQgPT0gXCJyZWN0YW5nbGVcIik7XG4gICAgaWYgKCFjdXIpIHsgcmV0dXJuIH1cbiAgICBpZiAoY21wKGN1ciwgbGFzdFBvcykgIT0gMCkge1xuICAgICAgY20uY3VyT3AuZm9jdXMgPSBhY3RpdmVFbHQoKTtcbiAgICAgIGV4dGVuZFRvKGN1cik7XG4gICAgICB2YXIgdmlzaWJsZSA9IHZpc2libGVMaW5lcyhkaXNwbGF5LCBkb2MpO1xuICAgICAgaWYgKGN1ci5saW5lID49IHZpc2libGUudG8gfHwgY3VyLmxpbmUgPCB2aXNpYmxlLmZyb20pXG4gICAgICAgIHsgc2V0VGltZW91dChvcGVyYXRpb24oY20sIGZ1bmN0aW9uICgpIHtpZiAoY291bnRlciA9PSBjdXJDb3VudCkgeyBleHRlbmQoZSk7IH19KSwgMTUwKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb3V0c2lkZSA9IGUuY2xpZW50WSA8IGVkaXRvclNpemUudG9wID8gLTIwIDogZS5jbGllbnRZID4gZWRpdG9yU2l6ZS5ib3R0b20gPyAyMCA6IDA7XG4gICAgICBpZiAob3V0c2lkZSkgeyBzZXRUaW1lb3V0KG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY291bnRlciAhPSBjdXJDb3VudCkgeyByZXR1cm4gfVxuICAgICAgICBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCArPSBvdXRzaWRlO1xuICAgICAgICBleHRlbmQoZSk7XG4gICAgICB9KSwgNTApOyB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZG9uZShlKSB7XG4gICAgY20uc3RhdGUuc2VsZWN0aW5nVGV4dCA9IGZhbHNlO1xuICAgIGNvdW50ZXIgPSBJbmZpbml0eTtcbiAgICBlX3ByZXZlbnREZWZhdWx0KGUpO1xuICAgIGRpc3BsYXkuaW5wdXQuZm9jdXMoKTtcbiAgICBvZmYoZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIG1vdmUpO1xuICAgIG9mZihkaXNwbGF5LndyYXBwZXIub3duZXJEb2N1bWVudCwgXCJtb3VzZXVwXCIsIHVwKTtcbiAgICBkb2MuaGlzdG9yeS5sYXN0U2VsT3JpZ2luID0gbnVsbDtcbiAgfVxuXG4gIHZhciBtb3ZlID0gb3BlcmF0aW9uKGNtLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghZV9idXR0b24oZSkpIHsgZG9uZShlKTsgfVxuICAgIGVsc2UgeyBleHRlbmQoZSk7IH1cbiAgfSk7XG4gIHZhciB1cCA9IG9wZXJhdGlvbihjbSwgZG9uZSk7XG4gIGNtLnN0YXRlLnNlbGVjdGluZ1RleHQgPSB1cDtcbiAgb24oZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIG1vdmUpO1xuICBvbihkaXNwbGF5LndyYXBwZXIub3duZXJEb2N1bWVudCwgXCJtb3VzZXVwXCIsIHVwKTtcbn1cblxuLy8gVXNlZCB3aGVuIG1vdXNlLXNlbGVjdGluZyB0byBhZGp1c3QgdGhlIGFuY2hvciB0byB0aGUgcHJvcGVyIHNpZGVcbi8vIG9mIGEgYmlkaSBqdW1wIGRlcGVuZGluZyBvbiB0aGUgdmlzdWFsIHBvc2l0aW9uIG9mIHRoZSBoZWFkLlxuZnVuY3Rpb24gYmlkaVNpbXBsaWZ5KGNtLCByYW5nZSQkMSkge1xuICB2YXIgYW5jaG9yID0gcmFuZ2UkJDEuYW5jaG9yO1xuICB2YXIgaGVhZCA9IHJhbmdlJCQxLmhlYWQ7XG4gIHZhciBhbmNob3JMaW5lID0gZ2V0TGluZShjbS5kb2MsIGFuY2hvci5saW5lKTtcbiAgaWYgKGNtcChhbmNob3IsIGhlYWQpID09IDAgJiYgYW5jaG9yLnN0aWNreSA9PSBoZWFkLnN0aWNreSkgeyByZXR1cm4gcmFuZ2UkJDEgfVxuICB2YXIgb3JkZXIgPSBnZXRPcmRlcihhbmNob3JMaW5lKTtcbiAgaWYgKCFvcmRlcikgeyByZXR1cm4gcmFuZ2UkJDEgfVxuICB2YXIgaW5kZXggPSBnZXRCaWRpUGFydEF0KG9yZGVyLCBhbmNob3IuY2gsIGFuY2hvci5zdGlja3kpLCBwYXJ0ID0gb3JkZXJbaW5kZXhdO1xuICBpZiAocGFydC5mcm9tICE9IGFuY2hvci5jaCAmJiBwYXJ0LnRvICE9IGFuY2hvci5jaCkgeyByZXR1cm4gcmFuZ2UkJDEgfVxuICB2YXIgYm91bmRhcnkgPSBpbmRleCArICgocGFydC5mcm9tID09IGFuY2hvci5jaCkgPT0gKHBhcnQubGV2ZWwgIT0gMSkgPyAwIDogMSk7XG4gIGlmIChib3VuZGFyeSA9PSAwIHx8IGJvdW5kYXJ5ID09IG9yZGVyLmxlbmd0aCkgeyByZXR1cm4gcmFuZ2UkJDEgfVxuXG4gIC8vIENvbXB1dGUgdGhlIHJlbGF0aXZlIHZpc3VhbCBwb3NpdGlvbiBvZiB0aGUgaGVhZCBjb21wYXJlZCB0byB0aGVcbiAgLy8gYW5jaG9yICg8MCBpcyB0byB0aGUgbGVmdCwgPjAgdG8gdGhlIHJpZ2h0KVxuICB2YXIgbGVmdFNpZGU7XG4gIGlmIChoZWFkLmxpbmUgIT0gYW5jaG9yLmxpbmUpIHtcbiAgICBsZWZ0U2lkZSA9IChoZWFkLmxpbmUgLSBhbmNob3IubGluZSkgKiAoY20uZG9jLmRpcmVjdGlvbiA9PSBcImx0clwiID8gMSA6IC0xKSA+IDA7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGhlYWRJbmRleCA9IGdldEJpZGlQYXJ0QXQob3JkZXIsIGhlYWQuY2gsIGhlYWQuc3RpY2t5KTtcbiAgICB2YXIgZGlyID0gaGVhZEluZGV4IC0gaW5kZXggfHwgKGhlYWQuY2ggLSBhbmNob3IuY2gpICogKHBhcnQubGV2ZWwgPT0gMSA/IC0xIDogMSk7XG4gICAgaWYgKGhlYWRJbmRleCA9PSBib3VuZGFyeSAtIDEgfHwgaGVhZEluZGV4ID09IGJvdW5kYXJ5KVxuICAgICAgeyBsZWZ0U2lkZSA9IGRpciA8IDA7IH1cbiAgICBlbHNlXG4gICAgICB7IGxlZnRTaWRlID0gZGlyID4gMDsgfVxuICB9XG5cbiAgdmFyIHVzZVBhcnQgPSBvcmRlcltib3VuZGFyeSArIChsZWZ0U2lkZSA/IC0xIDogMCldO1xuICB2YXIgZnJvbSA9IGxlZnRTaWRlID09ICh1c2VQYXJ0LmxldmVsID09IDEpO1xuICB2YXIgY2ggPSBmcm9tID8gdXNlUGFydC5mcm9tIDogdXNlUGFydC50bywgc3RpY2t5ID0gZnJvbSA/IFwiYWZ0ZXJcIiA6IFwiYmVmb3JlXCI7XG4gIHJldHVybiBhbmNob3IuY2ggPT0gY2ggJiYgYW5jaG9yLnN0aWNreSA9PSBzdGlja3kgPyByYW5nZSQkMSA6IG5ldyBSYW5nZShuZXcgUG9zKGFuY2hvci5saW5lLCBjaCwgc3RpY2t5KSwgaGVhZClcbn1cblxuXG4vLyBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXZlbnQgaGFwcGVuZWQgaW4gdGhlIGd1dHRlciwgYW5kIGZpcmVzIHRoZVxuLy8gaGFuZGxlcnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50LlxuZnVuY3Rpb24gZ3V0dGVyRXZlbnQoY20sIGUsIHR5cGUsIHByZXZlbnQpIHtcbiAgdmFyIG1YLCBtWTtcbiAgaWYgKGUudG91Y2hlcykge1xuICAgIG1YID0gZS50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgbVkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTtcbiAgfSBlbHNlIHtcbiAgICB0cnkgeyBtWCA9IGUuY2xpZW50WDsgbVkgPSBlLmNsaWVudFk7IH1cbiAgICBjYXRjaChlKSB7IHJldHVybiBmYWxzZSB9XG4gIH1cbiAgaWYgKG1YID49IE1hdGguZmxvb3IoY20uZGlzcGxheS5ndXR0ZXJzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSkgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAocHJldmVudCkgeyBlX3ByZXZlbnREZWZhdWx0KGUpOyB9XG5cbiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICB2YXIgbGluZUJveCA9IGRpc3BsYXkubGluZURpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICBpZiAobVkgPiBsaW5lQm94LmJvdHRvbSB8fCAhaGFzSGFuZGxlcihjbSwgdHlwZSkpIHsgcmV0dXJuIGVfZGVmYXVsdFByZXZlbnRlZChlKSB9XG4gIG1ZIC09IGxpbmVCb3gudG9wIC0gZGlzcGxheS52aWV3T2Zmc2V0O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY20ub3B0aW9ucy5ndXR0ZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGcgPSBkaXNwbGF5Lmd1dHRlcnMuY2hpbGROb2Rlc1tpXTtcbiAgICBpZiAoZyAmJiBnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0ID49IG1YKSB7XG4gICAgICB2YXIgbGluZSA9IGxpbmVBdEhlaWdodChjbS5kb2MsIG1ZKTtcbiAgICAgIHZhciBndXR0ZXIgPSBjbS5vcHRpb25zLmd1dHRlcnNbaV07XG4gICAgICBzaWduYWwoY20sIHR5cGUsIGNtLCBsaW5lLCBndXR0ZXIsIGUpO1xuICAgICAgcmV0dXJuIGVfZGVmYXVsdFByZXZlbnRlZChlKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjbGlja0luR3V0dGVyKGNtLCBlKSB7XG4gIHJldHVybiBndXR0ZXJFdmVudChjbSwgZSwgXCJndXR0ZXJDbGlja1wiLCB0cnVlKVxufVxuXG4vLyBDT05URVhUIE1FTlUgSEFORExJTkdcblxuLy8gVG8gbWFrZSB0aGUgY29udGV4dCBtZW51IHdvcmssIHdlIG5lZWQgdG8gYnJpZWZseSB1bmhpZGUgdGhlXG4vLyB0ZXh0YXJlYSAobWFraW5nIGl0IGFzIHVub2J0cnVzaXZlIGFzIHBvc3NpYmxlKSB0byBsZXQgdGhlXG4vLyByaWdodC1jbGljayB0YWtlIGVmZmVjdCBvbiBpdC5cbmZ1bmN0aW9uIG9uQ29udGV4dE1lbnUoY20sIGUpIHtcbiAgaWYgKGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkgfHwgY29udGV4dE1lbnVJbkd1dHRlcihjbSwgZSkpIHsgcmV0dXJuIH1cbiAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlLCBcImNvbnRleHRtZW51XCIpKSB7IHJldHVybiB9XG4gIGNtLmRpc3BsYXkuaW5wdXQub25Db250ZXh0TWVudShlKTtcbn1cblxuZnVuY3Rpb24gY29udGV4dE1lbnVJbkd1dHRlcihjbSwgZSkge1xuICBpZiAoIWhhc0hhbmRsZXIoY20sIFwiZ3V0dGVyQ29udGV4dE1lbnVcIikpIHsgcmV0dXJuIGZhbHNlIH1cbiAgcmV0dXJuIGd1dHRlckV2ZW50KGNtLCBlLCBcImd1dHRlckNvbnRleHRNZW51XCIsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiB0aGVtZUNoYW5nZWQoY20pIHtcbiAgY20uZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZSA9IGNtLmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUucmVwbGFjZSgvXFxzKmNtLXMtXFxTKy9nLCBcIlwiKSArXG4gICAgY20ub3B0aW9ucy50aGVtZS5yZXBsYWNlKC8oXnxcXHMpXFxzKi9nLCBcIiBjbS1zLVwiKTtcbiAgY2xlYXJDYWNoZXMoY20pO1xufVxuXG52YXIgSW5pdCA9IHt0b1N0cmluZzogZnVuY3Rpb24oKXtyZXR1cm4gXCJDb2RlTWlycm9yLkluaXRcIn19O1xuXG52YXIgZGVmYXVsdHMgPSB7fTtcbnZhciBvcHRpb25IYW5kbGVycyA9IHt9O1xuXG5mdW5jdGlvbiBkZWZpbmVPcHRpb25zKENvZGVNaXJyb3IpIHtcbiAgdmFyIG9wdGlvbkhhbmRsZXJzID0gQ29kZU1pcnJvci5vcHRpb25IYW5kbGVycztcblxuICBmdW5jdGlvbiBvcHRpb24obmFtZSwgZGVmbHQsIGhhbmRsZSwgbm90T25Jbml0KSB7XG4gICAgQ29kZU1pcnJvci5kZWZhdWx0c1tuYW1lXSA9IGRlZmx0O1xuICAgIGlmIChoYW5kbGUpIHsgb3B0aW9uSGFuZGxlcnNbbmFtZV0gPVxuICAgICAgbm90T25Jbml0ID8gZnVuY3Rpb24gKGNtLCB2YWwsIG9sZCkge2lmIChvbGQgIT0gSW5pdCkgeyBoYW5kbGUoY20sIHZhbCwgb2xkKTsgfX0gOiBoYW5kbGU7IH1cbiAgfVxuXG4gIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uID0gb3B0aW9uO1xuXG4gIC8vIFBhc3NlZCB0byBvcHRpb24gaGFuZGxlcnMgd2hlbiB0aGVyZSBpcyBubyBvbGQgdmFsdWUuXG4gIENvZGVNaXJyb3IuSW5pdCA9IEluaXQ7XG5cbiAgLy8gVGhlc2UgdHdvIGFyZSwgb24gaW5pdCwgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yIGJlY2F1c2UgdGhleVxuICAvLyBoYXZlIHRvIGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgZWRpdG9yIGNhbiBzdGFydCBhdCBhbGwuXG4gIG9wdGlvbihcInZhbHVlXCIsIFwiXCIsIGZ1bmN0aW9uIChjbSwgdmFsKSB7IHJldHVybiBjbS5zZXRWYWx1ZSh2YWwpOyB9LCB0cnVlKTtcbiAgb3B0aW9uKFwibW9kZVwiLCBudWxsLCBmdW5jdGlvbiAoY20sIHZhbCkge1xuICAgIGNtLmRvYy5tb2RlT3B0aW9uID0gdmFsO1xuICAgIGxvYWRNb2RlKGNtKTtcbiAgfSwgdHJ1ZSk7XG5cbiAgb3B0aW9uKFwiaW5kZW50VW5pdFwiLCAyLCBsb2FkTW9kZSwgdHJ1ZSk7XG4gIG9wdGlvbihcImluZGVudFdpdGhUYWJzXCIsIGZhbHNlKTtcbiAgb3B0aW9uKFwic21hcnRJbmRlbnRcIiwgdHJ1ZSk7XG4gIG9wdGlvbihcInRhYlNpemVcIiwgNCwgZnVuY3Rpb24gKGNtKSB7XG4gICAgcmVzZXRNb2RlU3RhdGUoY20pO1xuICAgIGNsZWFyQ2FjaGVzKGNtKTtcbiAgICByZWdDaGFuZ2UoY20pO1xuICB9LCB0cnVlKTtcblxuICBvcHRpb24oXCJsaW5lU2VwYXJhdG9yXCIsIG51bGwsIGZ1bmN0aW9uIChjbSwgdmFsKSB7XG4gICAgY20uZG9jLmxpbmVTZXAgPSB2YWw7XG4gICAgaWYgKCF2YWwpIHsgcmV0dXJuIH1cbiAgICB2YXIgbmV3QnJlYWtzID0gW10sIGxpbmVObyA9IGNtLmRvYy5maXJzdDtcbiAgICBjbS5kb2MuaXRlcihmdW5jdGlvbiAobGluZSkge1xuICAgICAgZm9yICh2YXIgcG9zID0gMDs7KSB7XG4gICAgICAgIHZhciBmb3VuZCA9IGxpbmUudGV4dC5pbmRleE9mKHZhbCwgcG9zKTtcbiAgICAgICAgaWYgKGZvdW5kID09IC0xKSB7IGJyZWFrIH1cbiAgICAgICAgcG9zID0gZm91bmQgKyB2YWwubGVuZ3RoO1xuICAgICAgICBuZXdCcmVha3MucHVzaChQb3MobGluZU5vLCBmb3VuZCkpO1xuICAgICAgfVxuICAgICAgbGluZU5vKys7XG4gICAgfSk7XG4gICAgZm9yICh2YXIgaSA9IG5ld0JyZWFrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgIHsgcmVwbGFjZVJhbmdlKGNtLmRvYywgdmFsLCBuZXdCcmVha3NbaV0sIFBvcyhuZXdCcmVha3NbaV0ubGluZSwgbmV3QnJlYWtzW2ldLmNoICsgdmFsLmxlbmd0aCkpOyB9XG4gIH0pO1xuICBvcHRpb24oXCJzcGVjaWFsQ2hhcnNcIiwgL1tcXHUwMDAwLVxcdTAwMWZcXHUwMDdmLVxcdTAwOWZcXHUwMGFkXFx1MDYxY1xcdTIwMGItXFx1MjAwZlxcdTIwMjhcXHUyMDI5XFx1ZmVmZl0vZywgZnVuY3Rpb24gKGNtLCB2YWwsIG9sZCkge1xuICAgIGNtLnN0YXRlLnNwZWNpYWxDaGFycyA9IG5ldyBSZWdFeHAodmFsLnNvdXJjZSArICh2YWwudGVzdChcIlxcdFwiKSA/IFwiXCIgOiBcInxcXHRcIiksIFwiZ1wiKTtcbiAgICBpZiAob2xkICE9IEluaXQpIHsgY20ucmVmcmVzaCgpOyB9XG4gIH0pO1xuICBvcHRpb24oXCJzcGVjaWFsQ2hhclBsYWNlaG9sZGVyXCIsIGRlZmF1bHRTcGVjaWFsQ2hhclBsYWNlaG9sZGVyLCBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnJlZnJlc2goKTsgfSwgdHJ1ZSk7XG4gIG9wdGlvbihcImVsZWN0cmljQ2hhcnNcIiwgdHJ1ZSk7XG4gIG9wdGlvbihcImlucHV0U3R5bGVcIiwgbW9iaWxlID8gXCJjb250ZW50ZWRpdGFibGVcIiA6IFwidGV4dGFyZWFcIiwgZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImlucHV0U3R5bGUgY2FuIG5vdCAoeWV0KSBiZSBjaGFuZ2VkIGluIGEgcnVubmluZyBlZGl0b3JcIikgLy8gRklYTUVcbiAgfSwgdHJ1ZSk7XG4gIG9wdGlvbihcInNwZWxsY2hlY2tcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7IHJldHVybiBjbS5nZXRJbnB1dEZpZWxkKCkuc3BlbGxjaGVjayA9IHZhbDsgfSwgdHJ1ZSk7XG4gIG9wdGlvbihcInJ0bE1vdmVWaXN1YWxseVwiLCAhd2luZG93cyk7XG4gIG9wdGlvbihcIndob2xlTGluZVVwZGF0ZUJlZm9yZVwiLCB0cnVlKTtcblxuICBvcHRpb24oXCJ0aGVtZVwiLCBcImRlZmF1bHRcIiwgZnVuY3Rpb24gKGNtKSB7XG4gICAgdGhlbWVDaGFuZ2VkKGNtKTtcbiAgICBndXR0ZXJzQ2hhbmdlZChjbSk7XG4gIH0sIHRydWUpO1xuICBvcHRpb24oXCJrZXlNYXBcIiwgXCJkZWZhdWx0XCIsIGZ1bmN0aW9uIChjbSwgdmFsLCBvbGQpIHtcbiAgICB2YXIgbmV4dCA9IGdldEtleU1hcCh2YWwpO1xuICAgIHZhciBwcmV2ID0gb2xkICE9IEluaXQgJiYgZ2V0S2V5TWFwKG9sZCk7XG4gICAgaWYgKHByZXYgJiYgcHJldi5kZXRhY2gpIHsgcHJldi5kZXRhY2goY20sIG5leHQpOyB9XG4gICAgaWYgKG5leHQuYXR0YWNoKSB7IG5leHQuYXR0YWNoKGNtLCBwcmV2IHx8IG51bGwpOyB9XG4gIH0pO1xuICBvcHRpb24oXCJleHRyYUtleXNcIiwgbnVsbCk7XG4gIG9wdGlvbihcImNvbmZpZ3VyZU1vdXNlXCIsIG51bGwpO1xuXG4gIG9wdGlvbihcImxpbmVXcmFwcGluZ1wiLCBmYWxzZSwgd3JhcHBpbmdDaGFuZ2VkLCB0cnVlKTtcbiAgb3B0aW9uKFwiZ3V0dGVyc1wiLCBbXSwgZnVuY3Rpb24gKGNtKSB7XG4gICAgc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKGNtLm9wdGlvbnMpO1xuICAgIGd1dHRlcnNDaGFuZ2VkKGNtKTtcbiAgfSwgdHJ1ZSk7XG4gIG9wdGlvbihcImZpeGVkR3V0dGVyXCIsIHRydWUsIGZ1bmN0aW9uIChjbSwgdmFsKSB7XG4gICAgY20uZGlzcGxheS5ndXR0ZXJzLnN0eWxlLmxlZnQgPSB2YWwgPyBjb21wZW5zYXRlRm9ySFNjcm9sbChjbS5kaXNwbGF5KSArIFwicHhcIiA6IFwiMFwiO1xuICAgIGNtLnJlZnJlc2goKTtcbiAgfSwgdHJ1ZSk7XG4gIG9wdGlvbihcImNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyXCIsIGZhbHNlLCBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIHVwZGF0ZVNjcm9sbGJhcnMoY20pOyB9LCB0cnVlKTtcbiAgb3B0aW9uKFwic2Nyb2xsYmFyU3R5bGVcIiwgXCJuYXRpdmVcIiwgZnVuY3Rpb24gKGNtKSB7XG4gICAgaW5pdFNjcm9sbGJhcnMoY20pO1xuICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20pO1xuICAgIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5zZXRTY3JvbGxUb3AoY20uZG9jLnNjcm9sbFRvcCk7XG4gICAgY20uZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbExlZnQoY20uZG9jLnNjcm9sbExlZnQpO1xuICB9LCB0cnVlKTtcbiAgb3B0aW9uKFwibGluZU51bWJlcnNcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSkge1xuICAgIHNldEd1dHRlcnNGb3JMaW5lTnVtYmVycyhjbS5vcHRpb25zKTtcbiAgICBndXR0ZXJzQ2hhbmdlZChjbSk7XG4gIH0sIHRydWUpO1xuICBvcHRpb24oXCJmaXJzdExpbmVOdW1iZXJcIiwgMSwgZ3V0dGVyc0NoYW5nZWQsIHRydWUpO1xuICBvcHRpb24oXCJsaW5lTnVtYmVyRm9ybWF0dGVyXCIsIGZ1bmN0aW9uIChpbnRlZ2VyKSB7IHJldHVybiBpbnRlZ2VyOyB9LCBndXR0ZXJzQ2hhbmdlZCwgdHJ1ZSk7XG4gIG9wdGlvbihcInNob3dDdXJzb3JXaGVuU2VsZWN0aW5nXCIsIGZhbHNlLCB1cGRhdGVTZWxlY3Rpb24sIHRydWUpO1xuXG4gIG9wdGlvbihcInJlc2V0U2VsZWN0aW9uT25Db250ZXh0TWVudVwiLCB0cnVlKTtcbiAgb3B0aW9uKFwibGluZVdpc2VDb3B5Q3V0XCIsIHRydWUpO1xuICBvcHRpb24oXCJwYXN0ZUxpbmVzUGVyU2VsZWN0aW9uXCIsIHRydWUpO1xuXG4gIG9wdGlvbihcInJlYWRPbmx5XCIsIGZhbHNlLCBmdW5jdGlvbiAoY20sIHZhbCkge1xuICAgIGlmICh2YWwgPT0gXCJub2N1cnNvclwiKSB7XG4gICAgICBvbkJsdXIoY20pO1xuICAgICAgY20uZGlzcGxheS5pbnB1dC5ibHVyKCk7XG4gICAgfVxuICAgIGNtLmRpc3BsYXkuaW5wdXQucmVhZE9ubHlDaGFuZ2VkKHZhbCk7XG4gIH0pO1xuICBvcHRpb24oXCJkaXNhYmxlSW5wdXRcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7aWYgKCF2YWwpIHsgY20uZGlzcGxheS5pbnB1dC5yZXNldCgpOyB9fSwgdHJ1ZSk7XG4gIG9wdGlvbihcImRyYWdEcm9wXCIsIHRydWUsIGRyYWdEcm9wQ2hhbmdlZCk7XG4gIG9wdGlvbihcImFsbG93RHJvcEZpbGVUeXBlc1wiLCBudWxsKTtcblxuICBvcHRpb24oXCJjdXJzb3JCbGlua1JhdGVcIiwgNTMwKTtcbiAgb3B0aW9uKFwiY3Vyc29yU2Nyb2xsTWFyZ2luXCIsIDApO1xuICBvcHRpb24oXCJjdXJzb3JIZWlnaHRcIiwgMSwgdXBkYXRlU2VsZWN0aW9uLCB0cnVlKTtcbiAgb3B0aW9uKFwic2luZ2xlQ3Vyc29ySGVpZ2h0UGVyTGluZVwiLCB0cnVlLCB1cGRhdGVTZWxlY3Rpb24sIHRydWUpO1xuICBvcHRpb24oXCJ3b3JrVGltZVwiLCAxMDApO1xuICBvcHRpb24oXCJ3b3JrRGVsYXlcIiwgMTAwKTtcbiAgb3B0aW9uKFwiZmxhdHRlblNwYW5zXCIsIHRydWUsIHJlc2V0TW9kZVN0YXRlLCB0cnVlKTtcbiAgb3B0aW9uKFwiYWRkTW9kZUNsYXNzXCIsIGZhbHNlLCByZXNldE1vZGVTdGF0ZSwgdHJ1ZSk7XG4gIG9wdGlvbihcInBvbGxJbnRlcnZhbFwiLCAxMDApO1xuICBvcHRpb24oXCJ1bmRvRGVwdGhcIiwgMjAwLCBmdW5jdGlvbiAoY20sIHZhbCkgeyByZXR1cm4gY20uZG9jLmhpc3RvcnkudW5kb0RlcHRoID0gdmFsOyB9KTtcbiAgb3B0aW9uKFwiaGlzdG9yeUV2ZW50RGVsYXlcIiwgMTI1MCk7XG4gIG9wdGlvbihcInZpZXdwb3J0TWFyZ2luXCIsIDEwLCBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnJlZnJlc2goKTsgfSwgdHJ1ZSk7XG4gIG9wdGlvbihcIm1heEhpZ2hsaWdodExlbmd0aFwiLCAxMDAwMCwgcmVzZXRNb2RlU3RhdGUsIHRydWUpO1xuICBvcHRpb24oXCJtb3ZlSW5wdXRXaXRoQ3Vyc29yXCIsIHRydWUsIGZ1bmN0aW9uIChjbSwgdmFsKSB7XG4gICAgaWYgKCF2YWwpIHsgY20uZGlzcGxheS5pbnB1dC5yZXNldFBvc2l0aW9uKCk7IH1cbiAgfSk7XG5cbiAgb3B0aW9uKFwidGFiaW5kZXhcIiwgbnVsbCwgZnVuY3Rpb24gKGNtLCB2YWwpIHsgcmV0dXJuIGNtLmRpc3BsYXkuaW5wdXQuZ2V0RmllbGQoKS50YWJJbmRleCA9IHZhbCB8fCBcIlwiOyB9KTtcbiAgb3B0aW9uKFwiYXV0b2ZvY3VzXCIsIG51bGwpO1xuICBvcHRpb24oXCJkaXJlY3Rpb25cIiwgXCJsdHJcIiwgZnVuY3Rpb24gKGNtLCB2YWwpIHsgcmV0dXJuIGNtLmRvYy5zZXREaXJlY3Rpb24odmFsKTsgfSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGd1dHRlcnNDaGFuZ2VkKGNtKSB7XG4gIHVwZGF0ZUd1dHRlcnMoY20pO1xuICByZWdDaGFuZ2UoY20pO1xuICBhbGlnbkhvcml6b250YWxseShjbSk7XG59XG5cbmZ1bmN0aW9uIGRyYWdEcm9wQ2hhbmdlZChjbSwgdmFsdWUsIG9sZCkge1xuICB2YXIgd2FzT24gPSBvbGQgJiYgb2xkICE9IEluaXQ7XG4gIGlmICghdmFsdWUgIT0gIXdhc09uKSB7XG4gICAgdmFyIGZ1bmNzID0gY20uZGlzcGxheS5kcmFnRnVuY3Rpb25zO1xuICAgIHZhciB0b2dnbGUgPSB2YWx1ZSA/IG9uIDogb2ZmO1xuICAgIHRvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCBcImRyYWdzdGFydFwiLCBmdW5jcy5zdGFydCk7XG4gICAgdG9nZ2xlKGNtLmRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJhZ2VudGVyXCIsIGZ1bmNzLmVudGVyKTtcbiAgICB0b2dnbGUoY20uZGlzcGxheS5zY3JvbGxlciwgXCJkcmFnb3ZlclwiLCBmdW5jcy5vdmVyKTtcbiAgICB0b2dnbGUoY20uZGlzcGxheS5zY3JvbGxlciwgXCJkcmFnbGVhdmVcIiwgZnVuY3MubGVhdmUpO1xuICAgIHRvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCBcImRyb3BcIiwgZnVuY3MuZHJvcCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JhcHBpbmdDaGFuZ2VkKGNtKSB7XG4gIGlmIChjbS5vcHRpb25zLmxpbmVXcmFwcGluZykge1xuICAgIGFkZENsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgXCJDb2RlTWlycm9yLXdyYXBcIik7XG4gICAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5XaWR0aCA9IFwiXCI7XG4gICAgY20uZGlzcGxheS5zaXplcldpZHRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBybUNsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgXCJDb2RlTWlycm9yLXdyYXBcIik7XG4gICAgZmluZE1heExpbmUoY20pO1xuICB9XG4gIGVzdGltYXRlTGluZUhlaWdodHMoY20pO1xuICByZWdDaGFuZ2UoY20pO1xuICBjbGVhckNhY2hlcyhjbSk7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gdXBkYXRlU2Nyb2xsYmFycyhjbSk7IH0sIDEwMCk7XG59XG5cbi8vIEEgQ29kZU1pcnJvciBpbnN0YW5jZSByZXByZXNlbnRzIGFuIGVkaXRvci4gVGhpcyBpcyB0aGUgb2JqZWN0XG4vLyB0aGF0IHVzZXIgY29kZSBpcyB1c3VhbGx5IGRlYWxpbmcgd2l0aC5cblxuZnVuY3Rpb24gQ29kZU1pcnJvciQxKHBsYWNlLCBvcHRpb25zKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb2RlTWlycm9yJDEpKSB7IHJldHVybiBuZXcgQ29kZU1pcnJvciQxKHBsYWNlLCBvcHRpb25zKSB9XG5cbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA9IG9wdGlvbnMgPyBjb3B5T2JqKG9wdGlvbnMpIDoge307XG4gIC8vIERldGVybWluZSBlZmZlY3RpdmUgb3B0aW9ucyBiYXNlZCBvbiBnaXZlbiB2YWx1ZXMgYW5kIGRlZmF1bHRzLlxuICBjb3B5T2JqKGRlZmF1bHRzLCBvcHRpb25zLCBmYWxzZSk7XG4gIHNldEd1dHRlcnNGb3JMaW5lTnVtYmVycyhvcHRpb25zKTtcblxuICB2YXIgZG9jID0gb3B0aW9ucy52YWx1ZTtcbiAgaWYgKHR5cGVvZiBkb2MgPT0gXCJzdHJpbmdcIikgeyBkb2MgPSBuZXcgRG9jKGRvYywgb3B0aW9ucy5tb2RlLCBudWxsLCBvcHRpb25zLmxpbmVTZXBhcmF0b3IsIG9wdGlvbnMuZGlyZWN0aW9uKTsgfVxuICB0aGlzLmRvYyA9IGRvYztcblxuICB2YXIgaW5wdXQgPSBuZXcgQ29kZU1pcnJvciQxLmlucHV0U3R5bGVzW29wdGlvbnMuaW5wdXRTdHlsZV0odGhpcyk7XG4gIHZhciBkaXNwbGF5ID0gdGhpcy5kaXNwbGF5ID0gbmV3IERpc3BsYXkocGxhY2UsIGRvYywgaW5wdXQpO1xuICBkaXNwbGF5LndyYXBwZXIuQ29kZU1pcnJvciA9IHRoaXM7XG4gIHVwZGF0ZUd1dHRlcnModGhpcyk7XG4gIHRoZW1lQ2hhbmdlZCh0aGlzKTtcbiAgaWYgKG9wdGlvbnMubGluZVdyYXBwaW5nKVxuICAgIHsgdGhpcy5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lICs9IFwiIENvZGVNaXJyb3Itd3JhcFwiOyB9XG4gIGluaXRTY3JvbGxiYXJzKHRoaXMpO1xuXG4gIHRoaXMuc3RhdGUgPSB7XG4gICAga2V5TWFwczogW10sICAvLyBzdG9yZXMgbWFwcyBhZGRlZCBieSBhZGRLZXlNYXBcbiAgICBvdmVybGF5czogW10sIC8vIGhpZ2hsaWdodGluZyBvdmVybGF5cywgYXMgYWRkZWQgYnkgYWRkT3ZlcmxheVxuICAgIG1vZGVHZW46IDAsICAgLy8gYnVtcGVkIHdoZW4gbW9kZS9vdmVybGF5IGNoYW5nZXMsIHVzZWQgdG8gaW52YWxpZGF0ZSBoaWdobGlnaHRpbmcgaW5mb1xuICAgIG92ZXJ3cml0ZTogZmFsc2UsXG4gICAgZGVsYXlpbmdCbHVyRXZlbnQ6IGZhbHNlLFxuICAgIGZvY3VzZWQ6IGZhbHNlLFxuICAgIHN1cHByZXNzRWRpdHM6IGZhbHNlLCAvLyB1c2VkIHRvIGRpc2FibGUgZWRpdGluZyBkdXJpbmcga2V5IGhhbmRsZXJzIHdoZW4gaW4gcmVhZE9ubHkgbW9kZVxuICAgIHBhc3RlSW5jb21pbmc6IGZhbHNlLCBjdXRJbmNvbWluZzogZmFsc2UsIC8vIGhlbHAgcmVjb2duaXplIHBhc3RlL2N1dCBlZGl0cyBpbiBpbnB1dC5wb2xsXG4gICAgc2VsZWN0aW5nVGV4dDogZmFsc2UsXG4gICAgZHJhZ2dpbmdUZXh0OiBmYWxzZSxcbiAgICBoaWdobGlnaHQ6IG5ldyBEZWxheWVkKCksIC8vIHN0b3JlcyBoaWdobGlnaHQgd29ya2VyIHRpbWVvdXRcbiAgICBrZXlTZXE6IG51bGwsICAvLyBVbmZpbmlzaGVkIGtleSBzZXF1ZW5jZVxuICAgIHNwZWNpYWxDaGFyczogbnVsbFxuICB9O1xuXG4gIGlmIChvcHRpb25zLmF1dG9mb2N1cyAmJiAhbW9iaWxlKSB7IGRpc3BsYXkuaW5wdXQuZm9jdXMoKTsgfVxuXG4gIC8vIE92ZXJyaWRlIG1hZ2ljIHRleHRhcmVhIGNvbnRlbnQgcmVzdG9yZSB0aGF0IElFIHNvbWV0aW1lcyBkb2VzXG4gIC8vIG9uIG91ciBoaWRkZW4gdGV4dGFyZWEgb24gcmVsb2FkXG4gIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgMTEpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEuZGlzcGxheS5pbnB1dC5yZXNldCh0cnVlKTsgfSwgMjApOyB9XG5cbiAgcmVnaXN0ZXJFdmVudEhhbmRsZXJzKHRoaXMpO1xuICBlbnN1cmVHbG9iYWxIYW5kbGVycygpO1xuXG4gIHN0YXJ0T3BlcmF0aW9uKHRoaXMpO1xuICB0aGlzLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgYXR0YWNoRG9jKHRoaXMsIGRvYyk7XG5cbiAgaWYgKChvcHRpb25zLmF1dG9mb2N1cyAmJiAhbW9iaWxlKSB8fCB0aGlzLmhhc0ZvY3VzKCkpXG4gICAgeyBzZXRUaW1lb3V0KGJpbmQob25Gb2N1cywgdGhpcyksIDIwKTsgfVxuICBlbHNlXG4gICAgeyBvbkJsdXIodGhpcyk7IH1cblxuICBmb3IgKHZhciBvcHQgaW4gb3B0aW9uSGFuZGxlcnMpIHsgaWYgKG9wdGlvbkhhbmRsZXJzLmhhc093blByb3BlcnR5KG9wdCkpXG4gICAgeyBvcHRpb25IYW5kbGVyc1tvcHRdKHRoaXMkMSwgb3B0aW9uc1tvcHRdLCBJbml0KTsgfSB9XG4gIG1heWJlVXBkYXRlTGluZU51bWJlcldpZHRoKHRoaXMpO1xuICBpZiAob3B0aW9ucy5maW5pc2hJbml0KSB7IG9wdGlvbnMuZmluaXNoSW5pdCh0aGlzKTsgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRIb29rcy5sZW5ndGg7ICsraSkgeyBpbml0SG9va3NbaV0odGhpcyQxKTsgfVxuICBlbmRPcGVyYXRpb24odGhpcyk7XG4gIC8vIFN1cHByZXNzIG9wdGltaXplbGVnaWJpbGl0eSBpbiBXZWJraXQsIHNpbmNlIGl0IGJyZWFrcyB0ZXh0XG4gIC8vIG1lYXN1cmluZyBvbiBsaW5lIHdyYXBwaW5nIGJvdW5kYXJpZXMuXG4gIGlmICh3ZWJraXQgJiYgb3B0aW9ucy5saW5lV3JhcHBpbmcgJiZcbiAgICAgIGdldENvbXB1dGVkU3R5bGUoZGlzcGxheS5saW5lRGl2KS50ZXh0UmVuZGVyaW5nID09IFwib3B0aW1pemVsZWdpYmlsaXR5XCIpXG4gICAgeyBkaXNwbGF5LmxpbmVEaXYuc3R5bGUudGV4dFJlbmRlcmluZyA9IFwiYXV0b1wiOyB9XG59XG5cbi8vIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbkNvZGVNaXJyb3IkMS5kZWZhdWx0cyA9IGRlZmF1bHRzO1xuLy8gRnVuY3Rpb25zIHRvIHJ1biB3aGVuIG9wdGlvbnMgYXJlIGNoYW5nZWQuXG5Db2RlTWlycm9yJDEub3B0aW9uSGFuZGxlcnMgPSBvcHRpb25IYW5kbGVycztcblxuLy8gQXR0YWNoIHRoZSBuZWNlc3NhcnkgZXZlbnQgaGFuZGxlcnMgd2hlbiBpbml0aWFsaXppbmcgdGhlIGVkaXRvclxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudEhhbmRsZXJzKGNtKSB7XG4gIHZhciBkID0gY20uZGlzcGxheTtcbiAgb24oZC5zY3JvbGxlciwgXCJtb3VzZWRvd25cIiwgb3BlcmF0aW9uKGNtLCBvbk1vdXNlRG93bikpO1xuICAvLyBPbGRlciBJRSdzIHdpbGwgbm90IGZpcmUgYSBzZWNvbmQgbW91c2Vkb3duIGZvciBhIGRvdWJsZSBjbGlja1xuICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKVxuICAgIHsgb24oZC5zY3JvbGxlciwgXCJkYmxjbGlja1wiLCBvcGVyYXRpb24oY20sIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpKSB7IHJldHVybiB9XG4gICAgICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlKTtcbiAgICAgIGlmICghcG9zIHx8IGNsaWNrSW5HdXR0ZXIoY20sIGUpIHx8IGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkpIHsgcmV0dXJuIH1cbiAgICAgIGVfcHJldmVudERlZmF1bHQoZSk7XG4gICAgICB2YXIgd29yZCA9IGNtLmZpbmRXb3JkQXQocG9zKTtcbiAgICAgIGV4dGVuZFNlbGVjdGlvbihjbS5kb2MsIHdvcmQuYW5jaG9yLCB3b3JkLmhlYWQpO1xuICAgIH0pKTsgfVxuICBlbHNlXG4gICAgeyBvbihkLnNjcm9sbGVyLCBcImRibGNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBzaWduYWxET01FdmVudChjbSwgZSkgfHwgZV9wcmV2ZW50RGVmYXVsdChlKTsgfSk7IH1cbiAgLy8gU29tZSBicm93c2VycyBmaXJlIGNvbnRleHRtZW51ICphZnRlciogb3BlbmluZyB0aGUgbWVudSwgYXRcbiAgLy8gd2hpY2ggcG9pbnQgd2UgY2FuJ3QgbWVzcyB3aXRoIGl0IGFueW1vcmUuIENvbnRleHQgbWVudSBpc1xuICAvLyBoYW5kbGVkIGluIG9uTW91c2VEb3duIGZvciB0aGVzZSBicm93c2Vycy5cbiAgaWYgKCFjYXB0dXJlUmlnaHRDbGljaykgeyBvbihkLnNjcm9sbGVyLCBcImNvbnRleHRtZW51XCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBvbkNvbnRleHRNZW51KGNtLCBlKTsgfSk7IH1cblxuICAvLyBVc2VkIHRvIHN1cHByZXNzIG1vdXNlIGV2ZW50IGhhbmRsaW5nIHdoZW4gYSB0b3VjaCBoYXBwZW5zXG4gIHZhciB0b3VjaEZpbmlzaGVkLCBwcmV2VG91Y2ggPSB7ZW5kOiAwfTtcbiAgZnVuY3Rpb24gZmluaXNoVG91Y2goKSB7XG4gICAgaWYgKGQuYWN0aXZlVG91Y2gpIHtcbiAgICAgIHRvdWNoRmluaXNoZWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGQuYWN0aXZlVG91Y2ggPSBudWxsOyB9LCAxMDAwKTtcbiAgICAgIHByZXZUb3VjaCA9IGQuYWN0aXZlVG91Y2g7XG4gICAgICBwcmV2VG91Y2guZW5kID0gK25ldyBEYXRlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpc01vdXNlTGlrZVRvdWNoRXZlbnQoZSkge1xuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoICE9IDEpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgcmV0dXJuIHRvdWNoLnJhZGl1c1ggPD0gMSAmJiB0b3VjaC5yYWRpdXNZIDw9IDFcbiAgfVxuICBmdW5jdGlvbiBmYXJBd2F5KHRvdWNoLCBvdGhlcikge1xuICAgIGlmIChvdGhlci5sZWZ0ID09IG51bGwpIHsgcmV0dXJuIHRydWUgfVxuICAgIHZhciBkeCA9IG90aGVyLmxlZnQgLSB0b3VjaC5sZWZ0LCBkeSA9IG90aGVyLnRvcCAtIHRvdWNoLnRvcDtcbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHkgPiAyMCAqIDIwXG4gIH1cbiAgb24oZC5zY3JvbGxlciwgXCJ0b3VjaHN0YXJ0XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKCFzaWduYWxET01FdmVudChjbSwgZSkgJiYgIWlzTW91c2VMaWtlVG91Y2hFdmVudChlKSAmJiAhY2xpY2tJbkd1dHRlcihjbSwgZSkpIHtcbiAgICAgIGQuaW5wdXQuZW5zdXJlUG9sbGVkKCk7XG4gICAgICBjbGVhclRpbWVvdXQodG91Y2hGaW5pc2hlZCk7XG4gICAgICB2YXIgbm93ID0gK25ldyBEYXRlO1xuICAgICAgZC5hY3RpdmVUb3VjaCA9IHtzdGFydDogbm93LCBtb3ZlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgIHByZXY6IG5vdyAtIHByZXZUb3VjaC5lbmQgPD0gMzAwID8gcHJldlRvdWNoIDogbnVsbH07XG4gICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGQuYWN0aXZlVG91Y2gubGVmdCA9IGUudG91Y2hlc1swXS5wYWdlWDtcbiAgICAgICAgZC5hY3RpdmVUb3VjaC50b3AgPSBlLnRvdWNoZXNbMF0ucGFnZVk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgb24oZC5zY3JvbGxlciwgXCJ0b3VjaG1vdmVcIiwgZnVuY3Rpb24gKCkge1xuICAgIGlmIChkLmFjdGl2ZVRvdWNoKSB7IGQuYWN0aXZlVG91Y2gubW92ZWQgPSB0cnVlOyB9XG4gIH0pO1xuICBvbihkLnNjcm9sbGVyLCBcInRvdWNoZW5kXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHRvdWNoID0gZC5hY3RpdmVUb3VjaDtcbiAgICBpZiAodG91Y2ggJiYgIWV2ZW50SW5XaWRnZXQoZCwgZSkgJiYgdG91Y2gubGVmdCAhPSBudWxsICYmXG4gICAgICAgICF0b3VjaC5tb3ZlZCAmJiBuZXcgRGF0ZSAtIHRvdWNoLnN0YXJ0IDwgMzAwKSB7XG4gICAgICB2YXIgcG9zID0gY20uY29vcmRzQ2hhcihkLmFjdGl2ZVRvdWNoLCBcInBhZ2VcIiksIHJhbmdlO1xuICAgICAgaWYgKCF0b3VjaC5wcmV2IHx8IGZhckF3YXkodG91Y2gsIHRvdWNoLnByZXYpKSAvLyBTaW5nbGUgdGFwXG4gICAgICAgIHsgcmFuZ2UgPSBuZXcgUmFuZ2UocG9zLCBwb3MpOyB9XG4gICAgICBlbHNlIGlmICghdG91Y2gucHJldi5wcmV2IHx8IGZhckF3YXkodG91Y2gsIHRvdWNoLnByZXYucHJldikpIC8vIERvdWJsZSB0YXBcbiAgICAgICAgeyByYW5nZSA9IGNtLmZpbmRXb3JkQXQocG9zKTsgfVxuICAgICAgZWxzZSAvLyBUcmlwbGUgdGFwXG4gICAgICAgIHsgcmFuZ2UgPSBuZXcgUmFuZ2UoUG9zKHBvcy5saW5lLCAwKSwgY2xpcFBvcyhjbS5kb2MsIFBvcyhwb3MubGluZSArIDEsIDApKSk7IH1cbiAgICAgIGNtLnNldFNlbGVjdGlvbihyYW5nZS5hbmNob3IsIHJhbmdlLmhlYWQpO1xuICAgICAgY20uZm9jdXMoKTtcbiAgICAgIGVfcHJldmVudERlZmF1bHQoZSk7XG4gICAgfVxuICAgIGZpbmlzaFRvdWNoKCk7XG4gIH0pO1xuICBvbihkLnNjcm9sbGVyLCBcInRvdWNoY2FuY2VsXCIsIGZpbmlzaFRvdWNoKTtcblxuICAvLyBTeW5jIHNjcm9sbGluZyBiZXR3ZWVuIGZha2Ugc2Nyb2xsYmFycyBhbmQgcmVhbCBzY3JvbGxhYmxlXG4gIC8vIGFyZWEsIGVuc3VyZSB2aWV3cG9ydCBpcyB1cGRhdGVkIHdoZW4gc2Nyb2xsaW5nLlxuICBvbihkLnNjcm9sbGVyLCBcInNjcm9sbFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGQuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0KSB7XG4gICAgICB1cGRhdGVTY3JvbGxUb3AoY20sIGQuc2Nyb2xsZXIuc2Nyb2xsVG9wKTtcbiAgICAgIHNldFNjcm9sbExlZnQoY20sIGQuc2Nyb2xsZXIuc2Nyb2xsTGVmdCwgdHJ1ZSk7XG4gICAgICBzaWduYWwoY20sIFwic2Nyb2xsXCIsIGNtKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIExpc3RlbiB0byB3aGVlbCBldmVudHMgaW4gb3JkZXIgdG8gdHJ5IGFuZCB1cGRhdGUgdGhlIHZpZXdwb3J0IG9uIHRpbWUuXG4gIG9uKGQuc2Nyb2xsZXIsIFwibW91c2V3aGVlbFwiLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gb25TY3JvbGxXaGVlbChjbSwgZSk7IH0pO1xuICBvbihkLnNjcm9sbGVyLCBcIkRPTU1vdXNlU2Nyb2xsXCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBvblNjcm9sbFdoZWVsKGNtLCBlKTsgfSk7XG5cbiAgLy8gUHJldmVudCB3cmFwcGVyIGZyb20gZXZlciBzY3JvbGxpbmdcbiAgb24oZC53cmFwcGVyLCBcInNjcm9sbFwiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBkLndyYXBwZXIuc2Nyb2xsVG9wID0gZC53cmFwcGVyLnNjcm9sbExlZnQgPSAwOyB9KTtcblxuICBkLmRyYWdGdW5jdGlvbnMgPSB7XG4gICAgZW50ZXI6IGZ1bmN0aW9uIChlKSB7aWYgKCFzaWduYWxET01FdmVudChjbSwgZSkpIHsgZV9zdG9wKGUpOyB9fSxcbiAgICBvdmVyOiBmdW5jdGlvbiAoZSkge2lmICghc2lnbmFsRE9NRXZlbnQoY20sIGUpKSB7IG9uRHJhZ092ZXIoY20sIGUpOyBlX3N0b3AoZSk7IH19LFxuICAgIHN0YXJ0OiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gb25EcmFnU3RhcnQoY20sIGUpOyB9LFxuICAgIGRyb3A6IG9wZXJhdGlvbihjbSwgb25Ecm9wKSxcbiAgICBsZWF2ZTogZnVuY3Rpb24gKGUpIHtpZiAoIXNpZ25hbERPTUV2ZW50KGNtLCBlKSkgeyBjbGVhckRyYWdDdXJzb3IoY20pOyB9fVxuICB9O1xuXG4gIHZhciBpbnAgPSBkLmlucHV0LmdldEZpZWxkKCk7XG4gIG9uKGlucCwgXCJrZXl1cFwiLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gb25LZXlVcC5jYWxsKGNtLCBlKTsgfSk7XG4gIG9uKGlucCwgXCJrZXlkb3duXCIsIG9wZXJhdGlvbihjbSwgb25LZXlEb3duKSk7XG4gIG9uKGlucCwgXCJrZXlwcmVzc1wiLCBvcGVyYXRpb24oY20sIG9uS2V5UHJlc3MpKTtcbiAgb24oaW5wLCBcImZvY3VzXCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBvbkZvY3VzKGNtLCBlKTsgfSk7XG4gIG9uKGlucCwgXCJibHVyXCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBvbkJsdXIoY20sIGUpOyB9KTtcbn1cblxudmFyIGluaXRIb29rcyA9IFtdO1xuQ29kZU1pcnJvciQxLmRlZmluZUluaXRIb29rID0gZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGluaXRIb29rcy5wdXNoKGYpOyB9O1xuXG4vLyBJbmRlbnQgdGhlIGdpdmVuIGxpbmUuIFRoZSBob3cgcGFyYW1ldGVyIGNhbiBiZSBcInNtYXJ0XCIsXG4vLyBcImFkZFwiL251bGwsIFwic3VidHJhY3RcIiwgb3IgXCJwcmV2XCIuIFdoZW4gYWdncmVzc2l2ZSBpcyBmYWxzZVxuLy8gKHR5cGljYWxseSBzZXQgdG8gdHJ1ZSBmb3IgZm9yY2VkIHNpbmdsZS1saW5lIGluZGVudHMpLCBlbXB0eVxuLy8gbGluZXMgYXJlIG5vdCBpbmRlbnRlZCwgYW5kIHBsYWNlcyB3aGVyZSB0aGUgbW9kZSByZXR1cm5zIFBhc3Ncbi8vIGFyZSBsZWZ0IGFsb25lLlxuZnVuY3Rpb24gaW5kZW50TGluZShjbSwgbiwgaG93LCBhZ2dyZXNzaXZlKSB7XG4gIHZhciBkb2MgPSBjbS5kb2MsIHN0YXRlO1xuICBpZiAoaG93ID09IG51bGwpIHsgaG93ID0gXCJhZGRcIjsgfVxuICBpZiAoaG93ID09IFwic21hcnRcIikge1xuICAgIC8vIEZhbGwgYmFjayB0byBcInByZXZcIiB3aGVuIHRoZSBtb2RlIGRvZXNuJ3QgaGF2ZSBhbiBpbmRlbnRhdGlvblxuICAgIC8vIG1ldGhvZC5cbiAgICBpZiAoIWRvYy5tb2RlLmluZGVudCkgeyBob3cgPSBcInByZXZcIjsgfVxuICAgIGVsc2UgeyBzdGF0ZSA9IGdldENvbnRleHRCZWZvcmUoY20sIG4pLnN0YXRlOyB9XG4gIH1cblxuICB2YXIgdGFiU2l6ZSA9IGNtLm9wdGlvbnMudGFiU2l6ZTtcbiAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgbiksIGN1clNwYWNlID0gY291bnRDb2x1bW4obGluZS50ZXh0LCBudWxsLCB0YWJTaXplKTtcbiAgaWYgKGxpbmUuc3RhdGVBZnRlcikgeyBsaW5lLnN0YXRlQWZ0ZXIgPSBudWxsOyB9XG4gIHZhciBjdXJTcGFjZVN0cmluZyA9IGxpbmUudGV4dC5tYXRjaCgvXlxccyovKVswXSwgaW5kZW50YXRpb247XG4gIGlmICghYWdncmVzc2l2ZSAmJiAhL1xcUy8udGVzdChsaW5lLnRleHQpKSB7XG4gICAgaW5kZW50YXRpb24gPSAwO1xuICAgIGhvdyA9IFwibm90XCI7XG4gIH0gZWxzZSBpZiAoaG93ID09IFwic21hcnRcIikge1xuICAgIGluZGVudGF0aW9uID0gZG9jLm1vZGUuaW5kZW50KHN0YXRlLCBsaW5lLnRleHQuc2xpY2UoY3VyU3BhY2VTdHJpbmcubGVuZ3RoKSwgbGluZS50ZXh0KTtcbiAgICBpZiAoaW5kZW50YXRpb24gPT0gUGFzcyB8fCBpbmRlbnRhdGlvbiA+IDE1MCkge1xuICAgICAgaWYgKCFhZ2dyZXNzaXZlKSB7IHJldHVybiB9XG4gICAgICBob3cgPSBcInByZXZcIjtcbiAgICB9XG4gIH1cbiAgaWYgKGhvdyA9PSBcInByZXZcIikge1xuICAgIGlmIChuID4gZG9jLmZpcnN0KSB7IGluZGVudGF0aW9uID0gY291bnRDb2x1bW4oZ2V0TGluZShkb2MsIG4tMSkudGV4dCwgbnVsbCwgdGFiU2l6ZSk7IH1cbiAgICBlbHNlIHsgaW5kZW50YXRpb24gPSAwOyB9XG4gIH0gZWxzZSBpZiAoaG93ID09IFwiYWRkXCIpIHtcbiAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlICsgY20ub3B0aW9ucy5pbmRlbnRVbml0O1xuICB9IGVsc2UgaWYgKGhvdyA9PSBcInN1YnRyYWN0XCIpIHtcbiAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlIC0gY20ub3B0aW9ucy5pbmRlbnRVbml0O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBob3cgPT0gXCJudW1iZXJcIikge1xuICAgIGluZGVudGF0aW9uID0gY3VyU3BhY2UgKyBob3c7XG4gIH1cbiAgaW5kZW50YXRpb24gPSBNYXRoLm1heCgwLCBpbmRlbnRhdGlvbik7XG5cbiAgdmFyIGluZGVudFN0cmluZyA9IFwiXCIsIHBvcyA9IDA7XG4gIGlmIChjbS5vcHRpb25zLmluZGVudFdpdGhUYWJzKVxuICAgIHsgZm9yICh2YXIgaSA9IE1hdGguZmxvb3IoaW5kZW50YXRpb24gLyB0YWJTaXplKTsgaTsgLS1pKSB7cG9zICs9IHRhYlNpemU7IGluZGVudFN0cmluZyArPSBcIlxcdFwiO30gfVxuICBpZiAocG9zIDwgaW5kZW50YXRpb24pIHsgaW5kZW50U3RyaW5nICs9IHNwYWNlU3RyKGluZGVudGF0aW9uIC0gcG9zKTsgfVxuXG4gIGlmIChpbmRlbnRTdHJpbmcgIT0gY3VyU3BhY2VTdHJpbmcpIHtcbiAgICByZXBsYWNlUmFuZ2UoZG9jLCBpbmRlbnRTdHJpbmcsIFBvcyhuLCAwKSwgUG9zKG4sIGN1clNwYWNlU3RyaW5nLmxlbmd0aCksIFwiK2lucHV0XCIpO1xuICAgIGxpbmUuc3RhdGVBZnRlciA9IG51bGw7XG4gICAgcmV0dXJuIHRydWVcbiAgfSBlbHNlIHtcbiAgICAvLyBFbnN1cmUgdGhhdCwgaWYgdGhlIGN1cnNvciB3YXMgaW4gdGhlIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0XG4gICAgLy8gb2YgdGhlIGxpbmUsIGl0IGlzIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhhdCBzcGFjZS5cbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkkMSsrKSB7XG4gICAgICB2YXIgcmFuZ2UgPSBkb2Muc2VsLnJhbmdlc1tpJDFdO1xuICAgICAgaWYgKHJhbmdlLmhlYWQubGluZSA9PSBuICYmIHJhbmdlLmhlYWQuY2ggPCBjdXJTcGFjZVN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHBvcyQxID0gUG9zKG4sIGN1clNwYWNlU3RyaW5nLmxlbmd0aCk7XG4gICAgICAgIHJlcGxhY2VPbmVTZWxlY3Rpb24oZG9jLCBpJDEsIG5ldyBSYW5nZShwb3MkMSwgcG9zJDEpKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyB3aWxsIGJlIHNldCB0byBhIHtsaW5lV2lzZTogYm9vbCwgdGV4dDogW3N0cmluZ119IG9iamVjdCwgc29cbi8vIHRoYXQsIHdoZW4gcGFzdGluZywgd2Uga25vdyB3aGF0IGtpbmQgb2Ygc2VsZWN0aW9ucyB0aGUgY29waWVkXG4vLyB0ZXh0IHdhcyBtYWRlIG91dCBvZi5cbnZhciBsYXN0Q29waWVkID0gbnVsbDtcblxuZnVuY3Rpb24gc2V0TGFzdENvcGllZChuZXdMYXN0Q29waWVkKSB7XG4gIGxhc3RDb3BpZWQgPSBuZXdMYXN0Q29waWVkO1xufVxuXG5mdW5jdGlvbiBhcHBseVRleHRJbnB1dChjbSwgaW5zZXJ0ZWQsIGRlbGV0ZWQsIHNlbCwgb3JpZ2luKSB7XG4gIHZhciBkb2MgPSBjbS5kb2M7XG4gIGNtLmRpc3BsYXkuc2hpZnQgPSBmYWxzZTtcbiAgaWYgKCFzZWwpIHsgc2VsID0gZG9jLnNlbDsgfVxuXG4gIHZhciBwYXN0ZSA9IGNtLnN0YXRlLnBhc3RlSW5jb21pbmcgfHwgb3JpZ2luID09IFwicGFzdGVcIjtcbiAgdmFyIHRleHRMaW5lcyA9IHNwbGl0TGluZXNBdXRvKGluc2VydGVkKSwgbXVsdGlQYXN0ZSA9IG51bGw7XG4gIC8vIFdoZW4gcGFzdGluZyBOIGxpbmVzIGludG8gTiBzZWxlY3Rpb25zLCBpbnNlcnQgb25lIGxpbmUgcGVyIHNlbGVjdGlvblxuICBpZiAocGFzdGUgJiYgc2VsLnJhbmdlcy5sZW5ndGggPiAxKSB7XG4gICAgaWYgKGxhc3RDb3BpZWQgJiYgbGFzdENvcGllZC50ZXh0LmpvaW4oXCJcXG5cIikgPT0gaW5zZXJ0ZWQpIHtcbiAgICAgIGlmIChzZWwucmFuZ2VzLmxlbmd0aCAlIGxhc3RDb3BpZWQudGV4dC5sZW5ndGggPT0gMCkge1xuICAgICAgICBtdWx0aVBhc3RlID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdENvcGllZC50ZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgIHsgbXVsdGlQYXN0ZS5wdXNoKGRvYy5zcGxpdExpbmVzKGxhc3RDb3BpZWQudGV4dFtpXSkpOyB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0ZXh0TGluZXMubGVuZ3RoID09IHNlbC5yYW5nZXMubGVuZ3RoICYmIGNtLm9wdGlvbnMucGFzdGVMaW5lc1BlclNlbGVjdGlvbikge1xuICAgICAgbXVsdGlQYXN0ZSA9IG1hcCh0ZXh0TGluZXMsIGZ1bmN0aW9uIChsKSB7IHJldHVybiBbbF07IH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGVJbnB1dDtcbiAgLy8gTm9ybWFsIGJlaGF2aW9yIGlzIHRvIGluc2VydCB0aGUgbmV3IHRleHQgaW50byBldmVyeSBzZWxlY3Rpb25cbiAgZm9yICh2YXIgaSQxID0gc2VsLnJhbmdlcy5sZW5ndGggLSAxOyBpJDEgPj0gMDsgaSQxLS0pIHtcbiAgICB2YXIgcmFuZ2UkJDEgPSBzZWwucmFuZ2VzW2kkMV07XG4gICAgdmFyIGZyb20gPSByYW5nZSQkMS5mcm9tKCksIHRvID0gcmFuZ2UkJDEudG8oKTtcbiAgICBpZiAocmFuZ2UkJDEuZW1wdHkoKSkge1xuICAgICAgaWYgKGRlbGV0ZWQgJiYgZGVsZXRlZCA+IDApIC8vIEhhbmRsZSBkZWxldGlvblxuICAgICAgICB7IGZyb20gPSBQb3MoZnJvbS5saW5lLCBmcm9tLmNoIC0gZGVsZXRlZCk7IH1cbiAgICAgIGVsc2UgaWYgKGNtLnN0YXRlLm92ZXJ3cml0ZSAmJiAhcGFzdGUpIC8vIEhhbmRsZSBvdmVyd3JpdGVcbiAgICAgICAgeyB0byA9IFBvcyh0by5saW5lLCBNYXRoLm1pbihnZXRMaW5lKGRvYywgdG8ubGluZSkudGV4dC5sZW5ndGgsIHRvLmNoICsgbHN0KHRleHRMaW5lcykubGVuZ3RoKSk7IH1cbiAgICAgIGVsc2UgaWYgKGxhc3RDb3BpZWQgJiYgbGFzdENvcGllZC5saW5lV2lzZSAmJiBsYXN0Q29waWVkLnRleHQuam9pbihcIlxcblwiKSA9PSBpbnNlcnRlZClcbiAgICAgICAgeyBmcm9tID0gdG8gPSBQb3MoZnJvbS5saW5lLCAwKTsgfVxuICAgIH1cbiAgICB1cGRhdGVJbnB1dCA9IGNtLmN1ck9wLnVwZGF0ZUlucHV0O1xuICAgIHZhciBjaGFuZ2VFdmVudCA9IHtmcm9tOiBmcm9tLCB0bzogdG8sIHRleHQ6IG11bHRpUGFzdGUgPyBtdWx0aVBhc3RlW2kkMSAlIG11bHRpUGFzdGUubGVuZ3RoXSA6IHRleHRMaW5lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBvcmlnaW4gfHwgKHBhc3RlID8gXCJwYXN0ZVwiIDogY20uc3RhdGUuY3V0SW5jb21pbmcgPyBcImN1dFwiIDogXCIraW5wdXRcIil9O1xuICAgIG1ha2VDaGFuZ2UoY20uZG9jLCBjaGFuZ2VFdmVudCk7XG4gICAgc2lnbmFsTGF0ZXIoY20sIFwiaW5wdXRSZWFkXCIsIGNtLCBjaGFuZ2VFdmVudCk7XG4gIH1cbiAgaWYgKGluc2VydGVkICYmICFwYXN0ZSlcbiAgICB7IHRyaWdnZXJFbGVjdHJpYyhjbSwgaW5zZXJ0ZWQpOyB9XG5cbiAgZW5zdXJlQ3Vyc29yVmlzaWJsZShjbSk7XG4gIGNtLmN1ck9wLnVwZGF0ZUlucHV0ID0gdXBkYXRlSW5wdXQ7XG4gIGNtLmN1ck9wLnR5cGluZyA9IHRydWU7XG4gIGNtLnN0YXRlLnBhc3RlSW5jb21pbmcgPSBjbS5zdGF0ZS5jdXRJbmNvbWluZyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVQYXN0ZShlLCBjbSkge1xuICB2YXIgcGFzdGVkID0gZS5jbGlwYm9hcmREYXRhICYmIGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKTtcbiAgaWYgKHBhc3RlZCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIWNtLmlzUmVhZE9ubHkoKSAmJiAhY20ub3B0aW9ucy5kaXNhYmxlSW5wdXQpXG4gICAgICB7IHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFwcGx5VGV4dElucHV0KGNtLCBwYXN0ZWQsIDAsIG51bGwsIFwicGFzdGVcIik7IH0pOyB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyRWxlY3RyaWMoY20sIGluc2VydGVkKSB7XG4gIC8vIFdoZW4gYW4gJ2VsZWN0cmljJyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQsIGltbWVkaWF0ZWx5IHRyaWdnZXIgYSByZWluZGVudFxuICBpZiAoIWNtLm9wdGlvbnMuZWxlY3RyaWNDaGFycyB8fCAhY20ub3B0aW9ucy5zbWFydEluZGVudCkgeyByZXR1cm4gfVxuICB2YXIgc2VsID0gY20uZG9jLnNlbDtcblxuICBmb3IgKHZhciBpID0gc2VsLnJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciByYW5nZSQkMSA9IHNlbC5yYW5nZXNbaV07XG4gICAgaWYgKHJhbmdlJCQxLmhlYWQuY2ggPiAxMDAgfHwgKGkgJiYgc2VsLnJhbmdlc1tpIC0gMV0uaGVhZC5saW5lID09IHJhbmdlJCQxLmhlYWQubGluZSkpIHsgY29udGludWUgfVxuICAgIHZhciBtb2RlID0gY20uZ2V0TW9kZUF0KHJhbmdlJCQxLmhlYWQpO1xuICAgIHZhciBpbmRlbnRlZCA9IGZhbHNlO1xuICAgIGlmIChtb2RlLmVsZWN0cmljQ2hhcnMpIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbW9kZS5lbGVjdHJpY0NoYXJzLmxlbmd0aDsgaisrKVxuICAgICAgICB7IGlmIChpbnNlcnRlZC5pbmRleE9mKG1vZGUuZWxlY3RyaWNDaGFycy5jaGFyQXQoaikpID4gLTEpIHtcbiAgICAgICAgICBpbmRlbnRlZCA9IGluZGVudExpbmUoY20sIHJhbmdlJCQxLmhlYWQubGluZSwgXCJzbWFydFwiKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IH1cbiAgICB9IGVsc2UgaWYgKG1vZGUuZWxlY3RyaWNJbnB1dCkge1xuICAgICAgaWYgKG1vZGUuZWxlY3RyaWNJbnB1dC50ZXN0KGdldExpbmUoY20uZG9jLCByYW5nZSQkMS5oZWFkLmxpbmUpLnRleHQuc2xpY2UoMCwgcmFuZ2UkJDEuaGVhZC5jaCkpKVxuICAgICAgICB7IGluZGVudGVkID0gaW5kZW50TGluZShjbSwgcmFuZ2UkJDEuaGVhZC5saW5lLCBcInNtYXJ0XCIpOyB9XG4gICAgfVxuICAgIGlmIChpbmRlbnRlZCkgeyBzaWduYWxMYXRlcihjbSwgXCJlbGVjdHJpY0lucHV0XCIsIGNtLCByYW5nZSQkMS5oZWFkLmxpbmUpOyB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29weWFibGVSYW5nZXMoY20pIHtcbiAgdmFyIHRleHQgPSBbXSwgcmFuZ2VzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY20uZG9jLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGluZSA9IGNtLmRvYy5zZWwucmFuZ2VzW2ldLmhlYWQubGluZTtcbiAgICB2YXIgbGluZVJhbmdlID0ge2FuY2hvcjogUG9zKGxpbmUsIDApLCBoZWFkOiBQb3MobGluZSArIDEsIDApfTtcbiAgICByYW5nZXMucHVzaChsaW5lUmFuZ2UpO1xuICAgIHRleHQucHVzaChjbS5nZXRSYW5nZShsaW5lUmFuZ2UuYW5jaG9yLCBsaW5lUmFuZ2UuaGVhZCkpO1xuICB9XG4gIHJldHVybiB7dGV4dDogdGV4dCwgcmFuZ2VzOiByYW5nZXN9XG59XG5cbmZ1bmN0aW9uIGRpc2FibGVCcm93c2VyTWFnaWMoZmllbGQsIHNwZWxsY2hlY2spIHtcbiAgZmllbGQuc2V0QXR0cmlidXRlKFwiYXV0b2NvcnJlY3RcIiwgXCJvZmZcIik7XG4gIGZpZWxkLnNldEF0dHJpYnV0ZShcImF1dG9jYXBpdGFsaXplXCIsIFwib2ZmXCIpO1xuICBmaWVsZC5zZXRBdHRyaWJ1dGUoXCJzcGVsbGNoZWNrXCIsICEhc3BlbGxjaGVjayk7XG59XG5cbmZ1bmN0aW9uIGhpZGRlblRleHRhcmVhKCkge1xuICB2YXIgdGUgPSBlbHQoXCJ0ZXh0YXJlYVwiLCBudWxsLCBudWxsLCBcInBvc2l0aW9uOiBhYnNvbHV0ZTsgYm90dG9tOiAtMWVtOyBwYWRkaW5nOiAwOyB3aWR0aDogMXB4OyBoZWlnaHQ6IDFlbTsgb3V0bGluZTogbm9uZVwiKTtcbiAgdmFyIGRpdiA9IGVsdChcImRpdlwiLCBbdGVdLCBudWxsLCBcIm92ZXJmbG93OiBoaWRkZW47IHBvc2l0aW9uOiByZWxhdGl2ZTsgd2lkdGg6IDNweDsgaGVpZ2h0OiAwcHg7XCIpO1xuICAvLyBUaGUgdGV4dGFyZWEgaXMga2VwdCBwb3NpdGlvbmVkIG5lYXIgdGhlIGN1cnNvciB0byBwcmV2ZW50IHRoZVxuICAvLyBmYWN0IHRoYXQgaXQnbGwgYmUgc2Nyb2xsZWQgaW50byB2aWV3IG9uIGlucHV0IGZyb20gc2Nyb2xsaW5nXG4gIC8vIG91ciBmYWtlIGN1cnNvciBvdXQgb2Ygdmlldy4gT24gd2Via2l0LCB3aGVuIHdyYXA9b2ZmLCBwYXN0ZSBpc1xuICAvLyB2ZXJ5IHNsb3cuIFNvIG1ha2UgdGhlIGFyZWEgd2lkZSBpbnN0ZWFkLlxuICBpZiAod2Via2l0KSB7IHRlLnN0eWxlLndpZHRoID0gXCIxMDAwcHhcIjsgfVxuICBlbHNlIHsgdGUuc2V0QXR0cmlidXRlKFwid3JhcFwiLCBcIm9mZlwiKTsgfVxuICAvLyBJZiBib3JkZXI6IDA7IC0tIGlPUyBmYWlscyB0byBvcGVuIGtleWJvYXJkIChpc3N1ZSAjMTI4NylcbiAgaWYgKGlvcykgeyB0ZS5zdHlsZS5ib3JkZXIgPSBcIjFweCBzb2xpZCBibGFja1wiOyB9XG4gIGRpc2FibGVCcm93c2VyTWFnaWModGUpO1xuICByZXR1cm4gZGl2XG59XG5cbi8vIFRoZSBwdWJsaWNseSB2aXNpYmxlIEFQSS4gTm90ZSB0aGF0IG1ldGhvZE9wKGYpIG1lYW5zXG4vLyAnd3JhcCBmIGluIGFuIG9wZXJhdGlvbiwgcGVyZm9ybWVkIG9uIGl0cyBgdGhpc2AgcGFyYW1ldGVyJy5cblxuLy8gVGhpcyBpcyBub3QgdGhlIGNvbXBsZXRlIHNldCBvZiBlZGl0b3IgbWV0aG9kcy4gTW9zdCBvZiB0aGVcbi8vIG1ldGhvZHMgZGVmaW5lZCBvbiB0aGUgRG9jIHR5cGUgYXJlIGFsc28gaW5qZWN0ZWQgaW50b1xuLy8gQ29kZU1pcnJvci5wcm90b3R5cGUsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmRcbi8vIGNvbnZlbmllbmNlLlxuXG52YXIgYWRkRWRpdG9yTWV0aG9kcyA9IGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcbiAgdmFyIG9wdGlvbkhhbmRsZXJzID0gQ29kZU1pcnJvci5vcHRpb25IYW5kbGVycztcblxuICB2YXIgaGVscGVycyA9IENvZGVNaXJyb3IuaGVscGVycyA9IHt9O1xuXG4gIENvZGVNaXJyb3IucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb2RlTWlycm9yLFxuICAgIGZvY3VzOiBmdW5jdGlvbigpe3dpbmRvdy5mb2N1cygpOyB0aGlzLmRpc3BsYXkuaW5wdXQuZm9jdXMoKTt9LFxuXG4gICAgc2V0T3B0aW9uOiBmdW5jdGlvbihvcHRpb24sIHZhbHVlKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywgb2xkID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgaWYgKG9wdGlvbnNbb3B0aW9uXSA9PSB2YWx1ZSAmJiBvcHRpb24gIT0gXCJtb2RlXCIpIHsgcmV0dXJuIH1cbiAgICAgIG9wdGlvbnNbb3B0aW9uXSA9IHZhbHVlO1xuICAgICAgaWYgKG9wdGlvbkhhbmRsZXJzLmhhc093blByb3BlcnR5KG9wdGlvbikpXG4gICAgICAgIHsgb3BlcmF0aW9uKHRoaXMsIG9wdGlvbkhhbmRsZXJzW29wdGlvbl0pKHRoaXMsIHZhbHVlLCBvbGQpOyB9XG4gICAgICBzaWduYWwodGhpcywgXCJvcHRpb25DaGFuZ2VcIiwgdGhpcywgb3B0aW9uKTtcbiAgICB9LFxuXG4gICAgZ2V0T3B0aW9uOiBmdW5jdGlvbihvcHRpb24pIHtyZXR1cm4gdGhpcy5vcHRpb25zW29wdGlvbl19LFxuICAgIGdldERvYzogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZG9jfSxcblxuICAgIGFkZEtleU1hcDogZnVuY3Rpb24obWFwJCQxLCBib3R0b20pIHtcbiAgICAgIHRoaXMuc3RhdGUua2V5TWFwc1tib3R0b20gPyBcInB1c2hcIiA6IFwidW5zaGlmdFwiXShnZXRLZXlNYXAobWFwJCQxKSk7XG4gICAgfSxcbiAgICByZW1vdmVLZXlNYXA6IGZ1bmN0aW9uKG1hcCQkMSkge1xuICAgICAgdmFyIG1hcHMgPSB0aGlzLnN0YXRlLmtleU1hcHM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyArK2kpXG4gICAgICAgIHsgaWYgKG1hcHNbaV0gPT0gbWFwJCQxIHx8IG1hcHNbaV0ubmFtZSA9PSBtYXAkJDEpIHtcbiAgICAgICAgICBtYXBzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9IH1cbiAgICB9LFxuXG4gICAgYWRkT3ZlcmxheTogbWV0aG9kT3AoZnVuY3Rpb24oc3BlYywgb3B0aW9ucykge1xuICAgICAgdmFyIG1vZGUgPSBzcGVjLnRva2VuID8gc3BlYyA6IENvZGVNaXJyb3IuZ2V0TW9kZSh0aGlzLm9wdGlvbnMsIHNwZWMpO1xuICAgICAgaWYgKG1vZGUuc3RhcnRTdGF0ZSkgeyB0aHJvdyBuZXcgRXJyb3IoXCJPdmVybGF5cyBtYXkgbm90IGJlIHN0YXRlZnVsLlwiKSB9XG4gICAgICBpbnNlcnRTb3J0ZWQodGhpcy5zdGF0ZS5vdmVybGF5cyxcbiAgICAgICAgICAgICAgICAgICB7bW9kZTogbW9kZSwgbW9kZVNwZWM6IHNwZWMsIG9wYXF1ZTogb3B0aW9ucyAmJiBvcHRpb25zLm9wYXF1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IChvcHRpb25zICYmIG9wdGlvbnMucHJpb3JpdHkpIHx8IDB9LFxuICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChvdmVybGF5KSB7IHJldHVybiBvdmVybGF5LnByaW9yaXR5OyB9KTtcbiAgICAgIHRoaXMuc3RhdGUubW9kZUdlbisrO1xuICAgICAgcmVnQ2hhbmdlKHRoaXMpO1xuICAgIH0pLFxuICAgIHJlbW92ZU92ZXJsYXk6IG1ldGhvZE9wKGZ1bmN0aW9uKHNwZWMpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICB2YXIgb3ZlcmxheXMgPSB0aGlzLnN0YXRlLm92ZXJsYXlzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdmVybGF5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgY3VyID0gb3ZlcmxheXNbaV0ubW9kZVNwZWM7XG4gICAgICAgIGlmIChjdXIgPT0gc3BlYyB8fCB0eXBlb2Ygc3BlYyA9PSBcInN0cmluZ1wiICYmIGN1ci5uYW1lID09IHNwZWMpIHtcbiAgICAgICAgICBvdmVybGF5cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgdGhpcyQxLnN0YXRlLm1vZGVHZW4rKztcbiAgICAgICAgICByZWdDaGFuZ2UodGhpcyQxKTtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgaW5kZW50TGluZTogbWV0aG9kT3AoZnVuY3Rpb24obiwgZGlyLCBhZ2dyZXNzaXZlKSB7XG4gICAgICBpZiAodHlwZW9mIGRpciAhPSBcInN0cmluZ1wiICYmIHR5cGVvZiBkaXIgIT0gXCJudW1iZXJcIikge1xuICAgICAgICBpZiAoZGlyID09IG51bGwpIHsgZGlyID0gdGhpcy5vcHRpb25zLnNtYXJ0SW5kZW50ID8gXCJzbWFydFwiIDogXCJwcmV2XCI7IH1cbiAgICAgICAgZWxzZSB7IGRpciA9IGRpciA/IFwiYWRkXCIgOiBcInN1YnRyYWN0XCI7IH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0xpbmUodGhpcy5kb2MsIG4pKSB7IGluZGVudExpbmUodGhpcywgbiwgZGlyLCBhZ2dyZXNzaXZlKTsgfVxuICAgIH0pLFxuICAgIGluZGVudFNlbGVjdGlvbjogbWV0aG9kT3AoZnVuY3Rpb24oaG93KSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgdmFyIHJhbmdlcyA9IHRoaXMuZG9jLnNlbC5yYW5nZXMsIGVuZCA9IC0xO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJhbmdlJCQxID0gcmFuZ2VzW2ldO1xuICAgICAgICBpZiAoIXJhbmdlJCQxLmVtcHR5KCkpIHtcbiAgICAgICAgICB2YXIgZnJvbSA9IHJhbmdlJCQxLmZyb20oKSwgdG8gPSByYW5nZSQkMS50bygpO1xuICAgICAgICAgIHZhciBzdGFydCA9IE1hdGgubWF4KGVuZCwgZnJvbS5saW5lKTtcbiAgICAgICAgICBlbmQgPSBNYXRoLm1pbih0aGlzJDEubGFzdExpbmUoKSwgdG8ubGluZSAtICh0by5jaCA/IDAgOiAxKSkgKyAxO1xuICAgICAgICAgIGZvciAodmFyIGogPSBzdGFydDsgaiA8IGVuZDsgKytqKVxuICAgICAgICAgICAgeyBpbmRlbnRMaW5lKHRoaXMkMSwgaiwgaG93KTsgfVxuICAgICAgICAgIHZhciBuZXdSYW5nZXMgPSB0aGlzJDEuZG9jLnNlbC5yYW5nZXM7XG4gICAgICAgICAgaWYgKGZyb20uY2ggPT0gMCAmJiByYW5nZXMubGVuZ3RoID09IG5ld1Jhbmdlcy5sZW5ndGggJiYgbmV3UmFuZ2VzW2ldLmZyb20oKS5jaCA+IDApXG4gICAgICAgICAgICB7IHJlcGxhY2VPbmVTZWxlY3Rpb24odGhpcyQxLmRvYywgaSwgbmV3IFJhbmdlKGZyb20sIG5ld1Jhbmdlc1tpXS50bygpKSwgc2VsX2RvbnRTY3JvbGwpOyB9XG4gICAgICAgIH0gZWxzZSBpZiAocmFuZ2UkJDEuaGVhZC5saW5lID4gZW5kKSB7XG4gICAgICAgICAgaW5kZW50TGluZSh0aGlzJDEsIHJhbmdlJCQxLmhlYWQubGluZSwgaG93LCB0cnVlKTtcbiAgICAgICAgICBlbmQgPSByYW5nZSQkMS5oZWFkLmxpbmU7XG4gICAgICAgICAgaWYgKGkgPT0gdGhpcyQxLmRvYy5zZWwucHJpbUluZGV4KSB7IGVuc3VyZUN1cnNvclZpc2libGUodGhpcyQxKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvLyBGZXRjaCB0aGUgcGFyc2VyIHRva2VuIGZvciBhIGdpdmVuIGNoYXJhY3Rlci4gVXNlZnVsIGZvciBoYWNrc1xuICAgIC8vIHRoYXQgd2FudCB0byBpbnNwZWN0IHRoZSBtb2RlIHN0YXRlIChzYXksIGZvciBjb21wbGV0aW9uKS5cbiAgICBnZXRUb2tlbkF0OiBmdW5jdGlvbihwb3MsIHByZWNpc2UpIHtcbiAgICAgIHJldHVybiB0YWtlVG9rZW4odGhpcywgcG9zLCBwcmVjaXNlKVxuICAgIH0sXG5cbiAgICBnZXRMaW5lVG9rZW5zOiBmdW5jdGlvbihsaW5lLCBwcmVjaXNlKSB7XG4gICAgICByZXR1cm4gdGFrZVRva2VuKHRoaXMsIFBvcyhsaW5lKSwgcHJlY2lzZSwgdHJ1ZSlcbiAgICB9LFxuXG4gICAgZ2V0VG9rZW5UeXBlQXQ6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgcG9zID0gY2xpcFBvcyh0aGlzLmRvYywgcG9zKTtcbiAgICAgIHZhciBzdHlsZXMgPSBnZXRMaW5lU3R5bGVzKHRoaXMsIGdldExpbmUodGhpcy5kb2MsIHBvcy5saW5lKSk7XG4gICAgICB2YXIgYmVmb3JlID0gMCwgYWZ0ZXIgPSAoc3R5bGVzLmxlbmd0aCAtIDEpIC8gMiwgY2ggPSBwb3MuY2g7XG4gICAgICB2YXIgdHlwZTtcbiAgICAgIGlmIChjaCA9PSAwKSB7IHR5cGUgPSBzdHlsZXNbMl07IH1cbiAgICAgIGVsc2UgeyBmb3IgKDs7KSB7XG4gICAgICAgIHZhciBtaWQgPSAoYmVmb3JlICsgYWZ0ZXIpID4+IDE7XG4gICAgICAgIGlmICgobWlkID8gc3R5bGVzW21pZCAqIDIgLSAxXSA6IDApID49IGNoKSB7IGFmdGVyID0gbWlkOyB9XG4gICAgICAgIGVsc2UgaWYgKHN0eWxlc1ttaWQgKiAyICsgMV0gPCBjaCkgeyBiZWZvcmUgPSBtaWQgKyAxOyB9XG4gICAgICAgIGVsc2UgeyB0eXBlID0gc3R5bGVzW21pZCAqIDIgKyAyXTsgYnJlYWsgfVxuICAgICAgfSB9XG4gICAgICB2YXIgY3V0ID0gdHlwZSA/IHR5cGUuaW5kZXhPZihcIm92ZXJsYXkgXCIpIDogLTE7XG4gICAgICByZXR1cm4gY3V0IDwgMCA/IHR5cGUgOiBjdXQgPT0gMCA/IG51bGwgOiB0eXBlLnNsaWNlKDAsIGN1dCAtIDEpXG4gICAgfSxcblxuICAgIGdldE1vZGVBdDogZnVuY3Rpb24ocG9zKSB7XG4gICAgICB2YXIgbW9kZSA9IHRoaXMuZG9jLm1vZGU7XG4gICAgICBpZiAoIW1vZGUuaW5uZXJNb2RlKSB7IHJldHVybiBtb2RlIH1cbiAgICAgIHJldHVybiBDb2RlTWlycm9yLmlubmVyTW9kZShtb2RlLCB0aGlzLmdldFRva2VuQXQocG9zKS5zdGF0ZSkubW9kZVxuICAgIH0sXG5cbiAgICBnZXRIZWxwZXI6IGZ1bmN0aW9uKHBvcywgdHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0SGVscGVycyhwb3MsIHR5cGUpWzBdXG4gICAgfSxcblxuICAgIGdldEhlbHBlcnM6IGZ1bmN0aW9uKHBvcywgdHlwZSkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgIHZhciBmb3VuZCA9IFtdO1xuICAgICAgaWYgKCFoZWxwZXJzLmhhc093blByb3BlcnR5KHR5cGUpKSB7IHJldHVybiBmb3VuZCB9XG4gICAgICB2YXIgaGVscCA9IGhlbHBlcnNbdHlwZV0sIG1vZGUgPSB0aGlzLmdldE1vZGVBdChwb3MpO1xuICAgICAgaWYgKHR5cGVvZiBtb2RlW3R5cGVdID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKGhlbHBbbW9kZVt0eXBlXV0pIHsgZm91bmQucHVzaChoZWxwW21vZGVbdHlwZV1dKTsgfVxuICAgICAgfSBlbHNlIGlmIChtb2RlW3R5cGVdKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZVt0eXBlXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciB2YWwgPSBoZWxwW21vZGVbdHlwZV1baV1dO1xuICAgICAgICAgIGlmICh2YWwpIHsgZm91bmQucHVzaCh2YWwpOyB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobW9kZS5oZWxwZXJUeXBlICYmIGhlbHBbbW9kZS5oZWxwZXJUeXBlXSkge1xuICAgICAgICBmb3VuZC5wdXNoKGhlbHBbbW9kZS5oZWxwZXJUeXBlXSk7XG4gICAgICB9IGVsc2UgaWYgKGhlbHBbbW9kZS5uYW1lXSkge1xuICAgICAgICBmb3VuZC5wdXNoKGhlbHBbbW9kZS5uYW1lXSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBoZWxwLl9nbG9iYWwubGVuZ3RoOyBpJDErKykge1xuICAgICAgICB2YXIgY3VyID0gaGVscC5fZ2xvYmFsW2kkMV07XG4gICAgICAgIGlmIChjdXIucHJlZChtb2RlLCB0aGlzJDEpICYmIGluZGV4T2YoZm91bmQsIGN1ci52YWwpID09IC0xKVxuICAgICAgICAgIHsgZm91bmQucHVzaChjdXIudmFsKTsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZvdW5kXG4gICAgfSxcblxuICAgIGdldFN0YXRlQWZ0ZXI6IGZ1bmN0aW9uKGxpbmUsIHByZWNpc2UpIHtcbiAgICAgIHZhciBkb2MgPSB0aGlzLmRvYztcbiAgICAgIGxpbmUgPSBjbGlwTGluZShkb2MsIGxpbmUgPT0gbnVsbCA/IGRvYy5maXJzdCArIGRvYy5zaXplIC0gMTogbGluZSk7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dEJlZm9yZSh0aGlzLCBsaW5lICsgMSwgcHJlY2lzZSkuc3RhdGVcbiAgICB9LFxuXG4gICAgY3Vyc29yQ29vcmRzOiBmdW5jdGlvbihzdGFydCwgbW9kZSkge1xuICAgICAgdmFyIHBvcywgcmFuZ2UkJDEgPSB0aGlzLmRvYy5zZWwucHJpbWFyeSgpO1xuICAgICAgaWYgKHN0YXJ0ID09IG51bGwpIHsgcG9zID0gcmFuZ2UkJDEuaGVhZDsgfVxuICAgICAgZWxzZSBpZiAodHlwZW9mIHN0YXJ0ID09IFwib2JqZWN0XCIpIHsgcG9zID0gY2xpcFBvcyh0aGlzLmRvYywgc3RhcnQpOyB9XG4gICAgICBlbHNlIHsgcG9zID0gc3RhcnQgPyByYW5nZSQkMS5mcm9tKCkgOiByYW5nZSQkMS50bygpOyB9XG4gICAgICByZXR1cm4gY3Vyc29yQ29vcmRzKHRoaXMsIHBvcywgbW9kZSB8fCBcInBhZ2VcIilcbiAgICB9LFxuXG4gICAgY2hhckNvb3JkczogZnVuY3Rpb24ocG9zLCBtb2RlKSB7XG4gICAgICByZXR1cm4gY2hhckNvb3Jkcyh0aGlzLCBjbGlwUG9zKHRoaXMuZG9jLCBwb3MpLCBtb2RlIHx8IFwicGFnZVwiKVxuICAgIH0sXG5cbiAgICBjb29yZHNDaGFyOiBmdW5jdGlvbihjb29yZHMsIG1vZGUpIHtcbiAgICAgIGNvb3JkcyA9IGZyb21Db29yZFN5c3RlbSh0aGlzLCBjb29yZHMsIG1vZGUgfHwgXCJwYWdlXCIpO1xuICAgICAgcmV0dXJuIGNvb3Jkc0NoYXIodGhpcywgY29vcmRzLmxlZnQsIGNvb3Jkcy50b3ApXG4gICAgfSxcblxuICAgIGxpbmVBdEhlaWdodDogZnVuY3Rpb24oaGVpZ2h0LCBtb2RlKSB7XG4gICAgICBoZWlnaHQgPSBmcm9tQ29vcmRTeXN0ZW0odGhpcywge3RvcDogaGVpZ2h0LCBsZWZ0OiAwfSwgbW9kZSB8fCBcInBhZ2VcIikudG9wO1xuICAgICAgcmV0dXJuIGxpbmVBdEhlaWdodCh0aGlzLmRvYywgaGVpZ2h0ICsgdGhpcy5kaXNwbGF5LnZpZXdPZmZzZXQpXG4gICAgfSxcbiAgICBoZWlnaHRBdExpbmU6IGZ1bmN0aW9uKGxpbmUsIG1vZGUsIGluY2x1ZGVXaWRnZXRzKSB7XG4gICAgICB2YXIgZW5kID0gZmFsc2UsIGxpbmVPYmo7XG4gICAgICBpZiAodHlwZW9mIGxpbmUgPT0gXCJudW1iZXJcIikge1xuICAgICAgICB2YXIgbGFzdCA9IHRoaXMuZG9jLmZpcnN0ICsgdGhpcy5kb2Muc2l6ZSAtIDE7XG4gICAgICAgIGlmIChsaW5lIDwgdGhpcy5kb2MuZmlyc3QpIHsgbGluZSA9IHRoaXMuZG9jLmZpcnN0OyB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmUgPiBsYXN0KSB7IGxpbmUgPSBsYXN0OyBlbmQgPSB0cnVlOyB9XG4gICAgICAgIGxpbmVPYmogPSBnZXRMaW5lKHRoaXMuZG9jLCBsaW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVPYmogPSBsaW5lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGludG9Db29yZFN5c3RlbSh0aGlzLCBsaW5lT2JqLCB7dG9wOiAwLCBsZWZ0OiAwfSwgbW9kZSB8fCBcInBhZ2VcIiwgaW5jbHVkZVdpZGdldHMgfHwgZW5kKS50b3AgK1xuICAgICAgICAoZW5kID8gdGhpcy5kb2MuaGVpZ2h0IC0gaGVpZ2h0QXRMaW5lKGxpbmVPYmopIDogMClcbiAgICB9LFxuXG4gICAgZGVmYXVsdFRleHRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGV4dEhlaWdodCh0aGlzLmRpc3BsYXkpIH0sXG4gICAgZGVmYXVsdENoYXJXaWR0aDogZnVuY3Rpb24oKSB7IHJldHVybiBjaGFyV2lkdGgodGhpcy5kaXNwbGF5KSB9LFxuXG4gICAgZ2V0Vmlld3BvcnQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4ge2Zyb206IHRoaXMuZGlzcGxheS52aWV3RnJvbSwgdG86IHRoaXMuZGlzcGxheS52aWV3VG99fSxcblxuICAgIGFkZFdpZGdldDogZnVuY3Rpb24ocG9zLCBub2RlLCBzY3JvbGwsIHZlcnQsIGhvcml6KSB7XG4gICAgICB2YXIgZGlzcGxheSA9IHRoaXMuZGlzcGxheTtcbiAgICAgIHBvcyA9IGN1cnNvckNvb3Jkcyh0aGlzLCBjbGlwUG9zKHRoaXMuZG9jLCBwb3MpKTtcbiAgICAgIHZhciB0b3AgPSBwb3MuYm90dG9tLCBsZWZ0ID0gcG9zLmxlZnQ7XG4gICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbS1pZ25vcmUtZXZlbnRzXCIsIFwidHJ1ZVwiKTtcbiAgICAgIHRoaXMuZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKG5vZGUpO1xuICAgICAgZGlzcGxheS5zaXplci5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIGlmICh2ZXJ0ID09IFwib3ZlclwiKSB7XG4gICAgICAgIHRvcCA9IHBvcy50b3A7XG4gICAgICB9IGVsc2UgaWYgKHZlcnQgPT0gXCJhYm92ZVwiIHx8IHZlcnQgPT0gXCJuZWFyXCIpIHtcbiAgICAgICAgdmFyIHZzcGFjZSA9IE1hdGgubWF4KGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQsIHRoaXMuZG9jLmhlaWdodCksXG4gICAgICAgIGhzcGFjZSA9IE1hdGgubWF4KGRpc3BsYXkuc2l6ZXIuY2xpZW50V2lkdGgsIGRpc3BsYXkubGluZVNwYWNlLmNsaWVudFdpZHRoKTtcbiAgICAgICAgLy8gRGVmYXVsdCB0byBwb3NpdGlvbmluZyBhYm92ZSAoaWYgc3BlY2lmaWVkIGFuZCBwb3NzaWJsZSk7IG90aGVyd2lzZSBkZWZhdWx0IHRvIHBvc2l0aW9uaW5nIGJlbG93XG4gICAgICAgIGlmICgodmVydCA9PSAnYWJvdmUnIHx8IHBvcy5ib3R0b20gKyBub2RlLm9mZnNldEhlaWdodCA+IHZzcGFjZSkgJiYgcG9zLnRvcCA+IG5vZGUub2Zmc2V0SGVpZ2h0KVxuICAgICAgICAgIHsgdG9wID0gcG9zLnRvcCAtIG5vZGUub2Zmc2V0SGVpZ2h0OyB9XG4gICAgICAgIGVsc2UgaWYgKHBvcy5ib3R0b20gKyBub2RlLm9mZnNldEhlaWdodCA8PSB2c3BhY2UpXG4gICAgICAgICAgeyB0b3AgPSBwb3MuYm90dG9tOyB9XG4gICAgICAgIGlmIChsZWZ0ICsgbm9kZS5vZmZzZXRXaWR0aCA+IGhzcGFjZSlcbiAgICAgICAgICB7IGxlZnQgPSBoc3BhY2UgLSBub2RlLm9mZnNldFdpZHRoOyB9XG4gICAgICB9XG4gICAgICBub2RlLnN0eWxlLnRvcCA9IHRvcCArIFwicHhcIjtcbiAgICAgIG5vZGUuc3R5bGUubGVmdCA9IG5vZGUuc3R5bGUucmlnaHQgPSBcIlwiO1xuICAgICAgaWYgKGhvcml6ID09IFwicmlnaHRcIikge1xuICAgICAgICBsZWZ0ID0gZGlzcGxheS5zaXplci5jbGllbnRXaWR0aCAtIG5vZGUub2Zmc2V0V2lkdGg7XG4gICAgICAgIG5vZGUuc3R5bGUucmlnaHQgPSBcIjBweFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGhvcml6ID09IFwibGVmdFwiKSB7IGxlZnQgPSAwOyB9XG4gICAgICAgIGVsc2UgaWYgKGhvcml6ID09IFwibWlkZGxlXCIpIHsgbGVmdCA9IChkaXNwbGF5LnNpemVyLmNsaWVudFdpZHRoIC0gbm9kZS5vZmZzZXRXaWR0aCkgLyAyOyB9XG4gICAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGxlZnQgKyBcInB4XCI7XG4gICAgICB9XG4gICAgICBpZiAoc2Nyb2xsKVxuICAgICAgICB7IHNjcm9sbEludG9WaWV3KHRoaXMsIHtsZWZ0OiBsZWZ0LCB0b3A6IHRvcCwgcmlnaHQ6IGxlZnQgKyBub2RlLm9mZnNldFdpZHRoLCBib3R0b206IHRvcCArIG5vZGUub2Zmc2V0SGVpZ2h0fSk7IH1cbiAgICB9LFxuXG4gICAgdHJpZ2dlck9uS2V5RG93bjogbWV0aG9kT3Aob25LZXlEb3duKSxcbiAgICB0cmlnZ2VyT25LZXlQcmVzczogbWV0aG9kT3Aob25LZXlQcmVzcyksXG4gICAgdHJpZ2dlck9uS2V5VXA6IG9uS2V5VXAsXG4gICAgdHJpZ2dlck9uTW91c2VEb3duOiBtZXRob2RPcChvbk1vdXNlRG93biksXG5cbiAgICBleGVjQ29tbWFuZDogZnVuY3Rpb24oY21kKSB7XG4gICAgICBpZiAoY29tbWFuZHMuaGFzT3duUHJvcGVydHkoY21kKSlcbiAgICAgICAgeyByZXR1cm4gY29tbWFuZHNbY21kXS5jYWxsKG51bGwsIHRoaXMpIH1cbiAgICB9LFxuXG4gICAgdHJpZ2dlckVsZWN0cmljOiBtZXRob2RPcChmdW5jdGlvbih0ZXh0KSB7IHRyaWdnZXJFbGVjdHJpYyh0aGlzLCB0ZXh0KTsgfSksXG5cbiAgICBmaW5kUG9zSDogZnVuY3Rpb24oZnJvbSwgYW1vdW50LCB1bml0LCB2aXN1YWxseSkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgIHZhciBkaXIgPSAxO1xuICAgICAgaWYgKGFtb3VudCA8IDApIHsgZGlyID0gLTE7IGFtb3VudCA9IC1hbW91bnQ7IH1cbiAgICAgIHZhciBjdXIgPSBjbGlwUG9zKHRoaXMuZG9jLCBmcm9tKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW1vdW50OyArK2kpIHtcbiAgICAgICAgY3VyID0gZmluZFBvc0godGhpcyQxLmRvYywgY3VyLCBkaXIsIHVuaXQsIHZpc3VhbGx5KTtcbiAgICAgICAgaWYgKGN1ci5oaXRTaWRlKSB7IGJyZWFrIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJcbiAgICB9LFxuXG4gICAgbW92ZUg6IG1ldGhvZE9wKGZ1bmN0aW9uKGRpciwgdW5pdCkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgIHRoaXMuZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uIChyYW5nZSQkMSkge1xuICAgICAgICBpZiAodGhpcyQxLmRpc3BsYXkuc2hpZnQgfHwgdGhpcyQxLmRvYy5leHRlbmQgfHwgcmFuZ2UkJDEuZW1wdHkoKSlcbiAgICAgICAgICB7IHJldHVybiBmaW5kUG9zSCh0aGlzJDEuZG9jLCByYW5nZSQkMS5oZWFkLCBkaXIsIHVuaXQsIHRoaXMkMS5vcHRpb25zLnJ0bE1vdmVWaXN1YWxseSkgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgeyByZXR1cm4gZGlyIDwgMCA/IHJhbmdlJCQxLmZyb20oKSA6IHJhbmdlJCQxLnRvKCkgfVxuICAgICAgfSwgc2VsX21vdmUpO1xuICAgIH0pLFxuXG4gICAgZGVsZXRlSDogbWV0aG9kT3AoZnVuY3Rpb24oZGlyLCB1bml0KSB7XG4gICAgICB2YXIgc2VsID0gdGhpcy5kb2Muc2VsLCBkb2MgPSB0aGlzLmRvYztcbiAgICAgIGlmIChzZWwuc29tZXRoaW5nU2VsZWN0ZWQoKSlcbiAgICAgICAgeyBkb2MucmVwbGFjZVNlbGVjdGlvbihcIlwiLCBudWxsLCBcIitkZWxldGVcIik7IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyBkZWxldGVOZWFyU2VsZWN0aW9uKHRoaXMsIGZ1bmN0aW9uIChyYW5nZSQkMSkge1xuICAgICAgICAgIHZhciBvdGhlciA9IGZpbmRQb3NIKGRvYywgcmFuZ2UkJDEuaGVhZCwgZGlyLCB1bml0LCBmYWxzZSk7XG4gICAgICAgICAgcmV0dXJuIGRpciA8IDAgPyB7ZnJvbTogb3RoZXIsIHRvOiByYW5nZSQkMS5oZWFkfSA6IHtmcm9tOiByYW5nZSQkMS5oZWFkLCB0bzogb3RoZXJ9XG4gICAgICAgIH0pOyB9XG4gICAgfSksXG5cbiAgICBmaW5kUG9zVjogZnVuY3Rpb24oZnJvbSwgYW1vdW50LCB1bml0LCBnb2FsQ29sdW1uKSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgdmFyIGRpciA9IDEsIHggPSBnb2FsQ29sdW1uO1xuICAgICAgaWYgKGFtb3VudCA8IDApIHsgZGlyID0gLTE7IGFtb3VudCA9IC1hbW91bnQ7IH1cbiAgICAgIHZhciBjdXIgPSBjbGlwUG9zKHRoaXMuZG9jLCBmcm9tKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW1vdW50OyArK2kpIHtcbiAgICAgICAgdmFyIGNvb3JkcyA9IGN1cnNvckNvb3Jkcyh0aGlzJDEsIGN1ciwgXCJkaXZcIik7XG4gICAgICAgIGlmICh4ID09IG51bGwpIHsgeCA9IGNvb3Jkcy5sZWZ0OyB9XG4gICAgICAgIGVsc2UgeyBjb29yZHMubGVmdCA9IHg7IH1cbiAgICAgICAgY3VyID0gZmluZFBvc1YodGhpcyQxLCBjb29yZHMsIGRpciwgdW5pdCk7XG4gICAgICAgIGlmIChjdXIuaGl0U2lkZSkgeyBicmVhayB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY3VyXG4gICAgfSxcblxuICAgIG1vdmVWOiBtZXRob2RPcChmdW5jdGlvbihkaXIsIHVuaXQpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICB2YXIgZG9jID0gdGhpcy5kb2MsIGdvYWxzID0gW107XG4gICAgICB2YXIgY29sbGFwc2UgPSAhdGhpcy5kaXNwbGF5LnNoaWZ0ICYmICFkb2MuZXh0ZW5kICYmIGRvYy5zZWwuc29tZXRoaW5nU2VsZWN0ZWQoKTtcbiAgICAgIGRvYy5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlJCQxKSB7XG4gICAgICAgIGlmIChjb2xsYXBzZSlcbiAgICAgICAgICB7IHJldHVybiBkaXIgPCAwID8gcmFuZ2UkJDEuZnJvbSgpIDogcmFuZ2UkJDEudG8oKSB9XG4gICAgICAgIHZhciBoZWFkUG9zID0gY3Vyc29yQ29vcmRzKHRoaXMkMSwgcmFuZ2UkJDEuaGVhZCwgXCJkaXZcIik7XG4gICAgICAgIGlmIChyYW5nZSQkMS5nb2FsQ29sdW1uICE9IG51bGwpIHsgaGVhZFBvcy5sZWZ0ID0gcmFuZ2UkJDEuZ29hbENvbHVtbjsgfVxuICAgICAgICBnb2Fscy5wdXNoKGhlYWRQb3MubGVmdCk7XG4gICAgICAgIHZhciBwb3MgPSBmaW5kUG9zVih0aGlzJDEsIGhlYWRQb3MsIGRpciwgdW5pdCk7XG4gICAgICAgIGlmICh1bml0ID09IFwicGFnZVwiICYmIHJhbmdlJCQxID09IGRvYy5zZWwucHJpbWFyeSgpKVxuICAgICAgICAgIHsgYWRkVG9TY3JvbGxUb3AodGhpcyQxLCBjaGFyQ29vcmRzKHRoaXMkMSwgcG9zLCBcImRpdlwiKS50b3AgLSBoZWFkUG9zLnRvcCk7IH1cbiAgICAgICAgcmV0dXJuIHBvc1xuICAgICAgfSwgc2VsX21vdmUpO1xuICAgICAgaWYgKGdvYWxzLmxlbmd0aCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7IGRvYy5zZWwucmFuZ2VzW2ldLmdvYWxDb2x1bW4gPSBnb2Fsc1tpXTsgfSB9XG4gICAgfSksXG5cbiAgICAvLyBGaW5kIHRoZSB3b3JkIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiAoYXMgcmV0dXJuZWQgYnkgY29vcmRzQ2hhcikuXG4gICAgZmluZFdvcmRBdDogZnVuY3Rpb24ocG9zKSB7XG4gICAgICB2YXIgZG9jID0gdGhpcy5kb2MsIGxpbmUgPSBnZXRMaW5lKGRvYywgcG9zLmxpbmUpLnRleHQ7XG4gICAgICB2YXIgc3RhcnQgPSBwb3MuY2gsIGVuZCA9IHBvcy5jaDtcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIHZhciBoZWxwZXIgPSB0aGlzLmdldEhlbHBlcihwb3MsIFwid29yZENoYXJzXCIpO1xuICAgICAgICBpZiAoKHBvcy5zdGlja3kgPT0gXCJiZWZvcmVcIiB8fCBlbmQgPT0gbGluZS5sZW5ndGgpICYmIHN0YXJ0KSB7IC0tc3RhcnQ7IH0gZWxzZSB7ICsrZW5kOyB9XG4gICAgICAgIHZhciBzdGFydENoYXIgPSBsaW5lLmNoYXJBdChzdGFydCk7XG4gICAgICAgIHZhciBjaGVjayA9IGlzV29yZENoYXIoc3RhcnRDaGFyLCBoZWxwZXIpXG4gICAgICAgICAgPyBmdW5jdGlvbiAoY2gpIHsgcmV0dXJuIGlzV29yZENoYXIoY2gsIGhlbHBlcik7IH1cbiAgICAgICAgICA6IC9cXHMvLnRlc3Qoc3RhcnRDaGFyKSA/IGZ1bmN0aW9uIChjaCkgeyByZXR1cm4gL1xccy8udGVzdChjaCk7IH1cbiAgICAgICAgICA6IGZ1bmN0aW9uIChjaCkgeyByZXR1cm4gKCEvXFxzLy50ZXN0KGNoKSAmJiAhaXNXb3JkQ2hhcihjaCkpOyB9O1xuICAgICAgICB3aGlsZSAoc3RhcnQgPiAwICYmIGNoZWNrKGxpbmUuY2hhckF0KHN0YXJ0IC0gMSkpKSB7IC0tc3RhcnQ7IH1cbiAgICAgICAgd2hpbGUgKGVuZCA8IGxpbmUubGVuZ3RoICYmIGNoZWNrKGxpbmUuY2hhckF0KGVuZCkpKSB7ICsrZW5kOyB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKFBvcyhwb3MubGluZSwgc3RhcnQpLCBQb3MocG9zLmxpbmUsIGVuZCkpXG4gICAgfSxcblxuICAgIHRvZ2dsZU92ZXJ3cml0ZTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlID09IHRoaXMuc3RhdGUub3ZlcndyaXRlKSB7IHJldHVybiB9XG4gICAgICBpZiAodGhpcy5zdGF0ZS5vdmVyd3JpdGUgPSAhdGhpcy5zdGF0ZS5vdmVyd3JpdGUpXG4gICAgICAgIHsgYWRkQ2xhc3ModGhpcy5kaXNwbGF5LmN1cnNvckRpdiwgXCJDb2RlTWlycm9yLW92ZXJ3cml0ZVwiKTsgfVxuICAgICAgZWxzZVxuICAgICAgICB7IHJtQ2xhc3ModGhpcy5kaXNwbGF5LmN1cnNvckRpdiwgXCJDb2RlTWlycm9yLW92ZXJ3cml0ZVwiKTsgfVxuXG4gICAgICBzaWduYWwodGhpcywgXCJvdmVyd3JpdGVUb2dnbGVcIiwgdGhpcywgdGhpcy5zdGF0ZS5vdmVyd3JpdGUpO1xuICAgIH0sXG4gICAgaGFzRm9jdXM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCkgPT0gYWN0aXZlRWx0KCkgfSxcbiAgICBpc1JlYWRPbmx5OiBmdW5jdGlvbigpIHsgcmV0dXJuICEhKHRoaXMub3B0aW9ucy5yZWFkT25seSB8fCB0aGlzLmRvYy5jYW50RWRpdCkgfSxcblxuICAgIHNjcm9sbFRvOiBtZXRob2RPcChmdW5jdGlvbiAoeCwgeSkgeyBzY3JvbGxUb0Nvb3Jkcyh0aGlzLCB4LCB5KTsgfSksXG4gICAgZ2V0U2Nyb2xsSW5mbzogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2Nyb2xsZXIgPSB0aGlzLmRpc3BsYXkuc2Nyb2xsZXI7XG4gICAgICByZXR1cm4ge2xlZnQ6IHNjcm9sbGVyLnNjcm9sbExlZnQsIHRvcDogc2Nyb2xsZXIuc2Nyb2xsVG9wLFxuICAgICAgICAgICAgICBoZWlnaHQ6IHNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIHNjcm9sbEdhcCh0aGlzKSAtIHRoaXMuZGlzcGxheS5iYXJIZWlnaHQsXG4gICAgICAgICAgICAgIHdpZHRoOiBzY3JvbGxlci5zY3JvbGxXaWR0aCAtIHNjcm9sbEdhcCh0aGlzKSAtIHRoaXMuZGlzcGxheS5iYXJXaWR0aCxcbiAgICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBkaXNwbGF5SGVpZ2h0KHRoaXMpLCBjbGllbnRXaWR0aDogZGlzcGxheVdpZHRoKHRoaXMpfVxuICAgIH0sXG5cbiAgICBzY3JvbGxJbnRvVmlldzogbWV0aG9kT3AoZnVuY3Rpb24ocmFuZ2UkJDEsIG1hcmdpbikge1xuICAgICAgaWYgKHJhbmdlJCQxID09IG51bGwpIHtcbiAgICAgICAgcmFuZ2UkJDEgPSB7ZnJvbTogdGhpcy5kb2Muc2VsLnByaW1hcnkoKS5oZWFkLCB0bzogbnVsbH07XG4gICAgICAgIGlmIChtYXJnaW4gPT0gbnVsbCkgeyBtYXJnaW4gPSB0aGlzLm9wdGlvbnMuY3Vyc29yU2Nyb2xsTWFyZ2luOyB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiByYW5nZSQkMSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJhbmdlJCQxID0ge2Zyb206IFBvcyhyYW5nZSQkMSwgMCksIHRvOiBudWxsfTtcbiAgICAgIH0gZWxzZSBpZiAocmFuZ2UkJDEuZnJvbSA9PSBudWxsKSB7XG4gICAgICAgIHJhbmdlJCQxID0ge2Zyb206IHJhbmdlJCQxLCB0bzogbnVsbH07XG4gICAgICB9XG4gICAgICBpZiAoIXJhbmdlJCQxLnRvKSB7IHJhbmdlJCQxLnRvID0gcmFuZ2UkJDEuZnJvbTsgfVxuICAgICAgcmFuZ2UkJDEubWFyZ2luID0gbWFyZ2luIHx8IDA7XG5cbiAgICAgIGlmIChyYW5nZSQkMS5mcm9tLmxpbmUgIT0gbnVsbCkge1xuICAgICAgICBzY3JvbGxUb1JhbmdlKHRoaXMsIHJhbmdlJCQxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjcm9sbFRvQ29vcmRzUmFuZ2UodGhpcywgcmFuZ2UkJDEuZnJvbSwgcmFuZ2UkJDEudG8sIHJhbmdlJCQxLm1hcmdpbik7XG4gICAgICB9XG4gICAgfSksXG5cbiAgICBzZXRTaXplOiBtZXRob2RPcChmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgdmFyIGludGVycHJldCA9IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIHR5cGVvZiB2YWwgPT0gXCJudW1iZXJcIiB8fCAvXlxcZCskLy50ZXN0KFN0cmluZyh2YWwpKSA/IHZhbCArIFwicHhcIiA6IHZhbDsgfTtcbiAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7IHRoaXMuZGlzcGxheS53cmFwcGVyLnN0eWxlLndpZHRoID0gaW50ZXJwcmV0KHdpZHRoKTsgfVxuICAgICAgaWYgKGhlaWdodCAhPSBudWxsKSB7IHRoaXMuZGlzcGxheS53cmFwcGVyLnN0eWxlLmhlaWdodCA9IGludGVycHJldChoZWlnaHQpOyB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmxpbmVXcmFwcGluZykgeyBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlKHRoaXMpOyB9XG4gICAgICB2YXIgbGluZU5vJCQxID0gdGhpcy5kaXNwbGF5LnZpZXdGcm9tO1xuICAgICAgdGhpcy5kb2MuaXRlcihsaW5lTm8kJDEsIHRoaXMuZGlzcGxheS52aWV3VG8sIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIGlmIChsaW5lLndpZGdldHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLndpZGdldHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgeyBpZiAobGluZS53aWRnZXRzW2ldLm5vSFNjcm9sbCkgeyByZWdMaW5lQ2hhbmdlKHRoaXMkMSwgbGluZU5vJCQxLCBcIndpZGdldFwiKTsgYnJlYWsgfSB9IH1cbiAgICAgICAgKytsaW5lTm8kJDE7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgICAgc2lnbmFsKHRoaXMsIFwicmVmcmVzaFwiLCB0aGlzKTtcbiAgICB9KSxcblxuICAgIG9wZXJhdGlvbjogZnVuY3Rpb24oZil7cmV0dXJuIHJ1bkluT3AodGhpcywgZil9LFxuICAgIHN0YXJ0T3BlcmF0aW9uOiBmdW5jdGlvbigpe3JldHVybiBzdGFydE9wZXJhdGlvbih0aGlzKX0sXG4gICAgZW5kT3BlcmF0aW9uOiBmdW5jdGlvbigpe3JldHVybiBlbmRPcGVyYXRpb24odGhpcyl9LFxuXG4gICAgcmVmcmVzaDogbWV0aG9kT3AoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb2xkSGVpZ2h0ID0gdGhpcy5kaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQ7XG4gICAgICByZWdDaGFuZ2UodGhpcyk7XG4gICAgICB0aGlzLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIGNsZWFyQ2FjaGVzKHRoaXMpO1xuICAgICAgc2Nyb2xsVG9Db29yZHModGhpcywgdGhpcy5kb2Muc2Nyb2xsTGVmdCwgdGhpcy5kb2Muc2Nyb2xsVG9wKTtcbiAgICAgIHVwZGF0ZUd1dHRlclNwYWNlKHRoaXMpO1xuICAgICAgaWYgKG9sZEhlaWdodCA9PSBudWxsIHx8IE1hdGguYWJzKG9sZEhlaWdodCAtIHRleHRIZWlnaHQodGhpcy5kaXNwbGF5KSkgPiAuNSlcbiAgICAgICAgeyBlc3RpbWF0ZUxpbmVIZWlnaHRzKHRoaXMpOyB9XG4gICAgICBzaWduYWwodGhpcywgXCJyZWZyZXNoXCIsIHRoaXMpO1xuICAgIH0pLFxuXG4gICAgc3dhcERvYzogbWV0aG9kT3AoZnVuY3Rpb24oZG9jKSB7XG4gICAgICB2YXIgb2xkID0gdGhpcy5kb2M7XG4gICAgICBvbGQuY20gPSBudWxsO1xuICAgICAgYXR0YWNoRG9jKHRoaXMsIGRvYyk7XG4gICAgICBjbGVhckNhY2hlcyh0aGlzKTtcbiAgICAgIHRoaXMuZGlzcGxheS5pbnB1dC5yZXNldCgpO1xuICAgICAgc2Nyb2xsVG9Db29yZHModGhpcywgZG9jLnNjcm9sbExlZnQsIGRvYy5zY3JvbGxUb3ApO1xuICAgICAgdGhpcy5jdXJPcC5mb3JjZVNjcm9sbCA9IHRydWU7XG4gICAgICBzaWduYWxMYXRlcih0aGlzLCBcInN3YXBEb2NcIiwgdGhpcywgb2xkKTtcbiAgICAgIHJldHVybiBvbGRcbiAgICB9KSxcblxuICAgIGdldElucHV0RmllbGQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS5pbnB1dC5nZXRGaWVsZCgpfSxcbiAgICBnZXRXcmFwcGVyRWxlbWVudDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LndyYXBwZXJ9LFxuICAgIGdldFNjcm9sbGVyRWxlbWVudDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LnNjcm9sbGVyfSxcbiAgICBnZXRHdXR0ZXJFbGVtZW50OiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc3BsYXkuZ3V0dGVyc31cbiAgfTtcbiAgZXZlbnRNaXhpbihDb2RlTWlycm9yKTtcblxuICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoIWhlbHBlcnMuaGFzT3duUHJvcGVydHkodHlwZSkpIHsgaGVscGVyc1t0eXBlXSA9IENvZGVNaXJyb3JbdHlwZV0gPSB7X2dsb2JhbDogW119OyB9XG4gICAgaGVscGVyc1t0eXBlXVtuYW1lXSA9IHZhbHVlO1xuICB9O1xuICBDb2RlTWlycm9yLnJlZ2lzdGVyR2xvYmFsSGVscGVyID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgcHJlZGljYXRlLCB2YWx1ZSkge1xuICAgIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIodHlwZSwgbmFtZSwgdmFsdWUpO1xuICAgIGhlbHBlcnNbdHlwZV0uX2dsb2JhbC5wdXNoKHtwcmVkOiBwcmVkaWNhdGUsIHZhbDogdmFsdWV9KTtcbiAgfTtcbn07XG5cbi8vIFVzZWQgZm9yIGhvcml6b250YWwgcmVsYXRpdmUgbW90aW9uLiBEaXIgaXMgLTEgb3IgMSAobGVmdCBvclxuLy8gcmlnaHQpLCB1bml0IGNhbiBiZSBcImNoYXJcIiwgXCJjb2x1bW5cIiAobGlrZSBjaGFyLCBidXQgZG9lc24ndFxuLy8gY3Jvc3MgbGluZSBib3VuZGFyaWVzKSwgXCJ3b3JkXCIgKGFjcm9zcyBuZXh0IHdvcmQpLCBvciBcImdyb3VwXCIgKHRvXG4vLyB0aGUgc3RhcnQgb2YgbmV4dCBncm91cCBvZiB3b3JkIG9yIG5vbi13b3JkLW5vbi13aGl0ZXNwYWNlXG4vLyBjaGFycykuIFRoZSB2aXN1YWxseSBwYXJhbSBjb250cm9scyB3aGV0aGVyLCBpbiByaWdodC10by1sZWZ0XG4vLyB0ZXh0LCBkaXJlY3Rpb24gMSBtZWFucyB0byBtb3ZlIHRvd2FyZHMgdGhlIG5leHQgaW5kZXggaW4gdGhlXG4vLyBzdHJpbmcsIG9yIHRvd2FyZHMgdGhlIGNoYXJhY3RlciB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnJlbnRcbi8vIHBvc2l0aW9uLiBUaGUgcmVzdWx0aW5nIHBvc2l0aW9uIHdpbGwgaGF2ZSBhIGhpdFNpZGU9dHJ1ZVxuLy8gcHJvcGVydHkgaWYgaXQgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbmZ1bmN0aW9uIGZpbmRQb3NIKGRvYywgcG9zLCBkaXIsIHVuaXQsIHZpc3VhbGx5KSB7XG4gIHZhciBvbGRQb3MgPSBwb3M7XG4gIHZhciBvcmlnRGlyID0gZGlyO1xuICB2YXIgbGluZU9iaiA9IGdldExpbmUoZG9jLCBwb3MubGluZSk7XG4gIGZ1bmN0aW9uIGZpbmROZXh0TGluZSgpIHtcbiAgICB2YXIgbCA9IHBvcy5saW5lICsgZGlyO1xuICAgIGlmIChsIDwgZG9jLmZpcnN0IHx8IGwgPj0gZG9jLmZpcnN0ICsgZG9jLnNpemUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBwb3MgPSBuZXcgUG9zKGwsIHBvcy5jaCwgcG9zLnN0aWNreSk7XG4gICAgcmV0dXJuIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbClcbiAgfVxuICBmdW5jdGlvbiBtb3ZlT25jZShib3VuZFRvTGluZSkge1xuICAgIHZhciBuZXh0O1xuICAgIGlmICh2aXN1YWxseSkge1xuICAgICAgbmV4dCA9IG1vdmVWaXN1YWxseShkb2MuY20sIGxpbmVPYmosIHBvcywgZGlyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dCA9IG1vdmVMb2dpY2FsbHkobGluZU9iaiwgcG9zLCBkaXIpO1xuICAgIH1cbiAgICBpZiAobmV4dCA9PSBudWxsKSB7XG4gICAgICBpZiAoIWJvdW5kVG9MaW5lICYmIGZpbmROZXh0TGluZSgpKVxuICAgICAgICB7IHBvcyA9IGVuZE9mTGluZSh2aXN1YWxseSwgZG9jLmNtLCBsaW5lT2JqLCBwb3MubGluZSwgZGlyKTsgfVxuICAgICAgZWxzZVxuICAgICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcyA9IG5leHQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAodW5pdCA9PSBcImNoYXJcIikge1xuICAgIG1vdmVPbmNlKCk7XG4gIH0gZWxzZSBpZiAodW5pdCA9PSBcImNvbHVtblwiKSB7XG4gICAgbW92ZU9uY2UodHJ1ZSk7XG4gIH0gZWxzZSBpZiAodW5pdCA9PSBcIndvcmRcIiB8fCB1bml0ID09IFwiZ3JvdXBcIikge1xuICAgIHZhciBzYXdUeXBlID0gbnVsbCwgZ3JvdXAgPSB1bml0ID09IFwiZ3JvdXBcIjtcbiAgICB2YXIgaGVscGVyID0gZG9jLmNtICYmIGRvYy5jbS5nZXRIZWxwZXIocG9zLCBcIndvcmRDaGFyc1wiKTtcbiAgICBmb3IgKHZhciBmaXJzdCA9IHRydWU7OyBmaXJzdCA9IGZhbHNlKSB7XG4gICAgICBpZiAoZGlyIDwgMCAmJiAhbW92ZU9uY2UoIWZpcnN0KSkgeyBicmVhayB9XG4gICAgICB2YXIgY3VyID0gbGluZU9iai50ZXh0LmNoYXJBdChwb3MuY2gpIHx8IFwiXFxuXCI7XG4gICAgICB2YXIgdHlwZSA9IGlzV29yZENoYXIoY3VyLCBoZWxwZXIpID8gXCJ3XCJcbiAgICAgICAgOiBncm91cCAmJiBjdXIgPT0gXCJcXG5cIiA/IFwiblwiXG4gICAgICAgIDogIWdyb3VwIHx8IC9cXHMvLnRlc3QoY3VyKSA/IG51bGxcbiAgICAgICAgOiBcInBcIjtcbiAgICAgIGlmIChncm91cCAmJiAhZmlyc3QgJiYgIXR5cGUpIHsgdHlwZSA9IFwic1wiOyB9XG4gICAgICBpZiAoc2F3VHlwZSAmJiBzYXdUeXBlICE9IHR5cGUpIHtcbiAgICAgICAgaWYgKGRpciA8IDApIHtkaXIgPSAxOyBtb3ZlT25jZSgpOyBwb3Muc3RpY2t5ID0gXCJhZnRlclwiO31cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUpIHsgc2F3VHlwZSA9IHR5cGU7IH1cbiAgICAgIGlmIChkaXIgPiAwICYmICFtb3ZlT25jZSghZmlyc3QpKSB7IGJyZWFrIH1cbiAgICB9XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHNraXBBdG9taWMoZG9jLCBwb3MsIG9sZFBvcywgb3JpZ0RpciwgdHJ1ZSk7XG4gIGlmIChlcXVhbEN1cnNvclBvcyhvbGRQb3MsIHJlc3VsdCkpIHsgcmVzdWx0LmhpdFNpZGUgPSB0cnVlOyB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gRm9yIHJlbGF0aXZlIHZlcnRpY2FsIG1vdmVtZW50LiBEaXIgbWF5IGJlIC0xIG9yIDEuIFVuaXQgY2FuIGJlXG4vLyBcInBhZ2VcIiBvciBcImxpbmVcIi4gVGhlIHJlc3VsdGluZyBwb3NpdGlvbiB3aWxsIGhhdmUgYSBoaXRTaWRlPXRydWVcbi8vIHByb3BlcnR5IGlmIGl0IHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuXG5mdW5jdGlvbiBmaW5kUG9zVihjbSwgcG9zLCBkaXIsIHVuaXQpIHtcbiAgdmFyIGRvYyA9IGNtLmRvYywgeCA9IHBvcy5sZWZ0LCB5O1xuICBpZiAodW5pdCA9PSBcInBhZ2VcIikge1xuICAgIHZhciBwYWdlU2l6ZSA9IE1hdGgubWluKGNtLmRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcbiAgICB2YXIgbW92ZUFtb3VudCA9IE1hdGgubWF4KHBhZ2VTaXplIC0gLjUgKiB0ZXh0SGVpZ2h0KGNtLmRpc3BsYXkpLCAzKTtcbiAgICB5ID0gKGRpciA+IDAgPyBwb3MuYm90dG9tIDogcG9zLnRvcCkgKyBkaXIgKiBtb3ZlQW1vdW50O1xuXG4gIH0gZWxzZSBpZiAodW5pdCA9PSBcImxpbmVcIikge1xuICAgIHkgPSBkaXIgPiAwID8gcG9zLmJvdHRvbSArIDMgOiBwb3MudG9wIC0gMztcbiAgfVxuICB2YXIgdGFyZ2V0O1xuICBmb3IgKDs7KSB7XG4gICAgdGFyZ2V0ID0gY29vcmRzQ2hhcihjbSwgeCwgeSk7XG4gICAgaWYgKCF0YXJnZXQub3V0c2lkZSkgeyBicmVhayB9XG4gICAgaWYgKGRpciA8IDAgPyB5IDw9IDAgOiB5ID49IGRvYy5oZWlnaHQpIHsgdGFyZ2V0LmhpdFNpZGUgPSB0cnVlOyBicmVhayB9XG4gICAgeSArPSBkaXIgKiA1O1xuICB9XG4gIHJldHVybiB0YXJnZXRcbn1cblxuLy8gQ09OVEVOVEVESVRBQkxFIElOUFVUIFNUWUxFXG5cbnZhciBDb250ZW50RWRpdGFibGVJbnB1dCA9IGZ1bmN0aW9uKGNtKSB7XG4gIHRoaXMuY20gPSBjbTtcbiAgdGhpcy5sYXN0QW5jaG9yTm9kZSA9IHRoaXMubGFzdEFuY2hvck9mZnNldCA9IHRoaXMubGFzdEZvY3VzTm9kZSA9IHRoaXMubGFzdEZvY3VzT2Zmc2V0ID0gbnVsbDtcbiAgdGhpcy5wb2xsaW5nID0gbmV3IERlbGF5ZWQoKTtcbiAgdGhpcy5jb21wb3NpbmcgPSBudWxsO1xuICB0aGlzLmdyYWNlUGVyaW9kID0gZmFsc2U7XG4gIHRoaXMucmVhZERPTVRpbWVvdXQgPSBudWxsO1xufTtcblxuQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoZGlzcGxheSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBpbnB1dCA9IHRoaXMsIGNtID0gaW5wdXQuY207XG4gIHZhciBkaXYgPSBpbnB1dC5kaXYgPSBkaXNwbGF5LmxpbmVEaXY7XG4gIGRpc2FibGVCcm93c2VyTWFnaWMoZGl2LCBjbS5vcHRpb25zLnNwZWxsY2hlY2spO1xuXG4gIG9uKGRpdiwgXCJwYXN0ZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSkgfHwgaGFuZGxlUGFzdGUoZSwgY20pKSB7IHJldHVybiB9XG4gICAgLy8gSUUgZG9lc24ndCBmaXJlIGlucHV0IGV2ZW50cywgc28gd2Ugc2NoZWR1bGUgYSByZWFkIGZvciB0aGUgcGFzdGVkIGNvbnRlbnQgaW4gdGhpcyB3YXlcbiAgICBpZiAoaWVfdmVyc2lvbiA8PSAxMSkgeyBzZXRUaW1lb3V0KG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcyQxLnVwZGF0ZUZyb21ET00oKTsgfSksIDIwKTsgfVxuICB9KTtcblxuICBvbihkaXYsIFwiY29tcG9zaXRpb25zdGFydFwiLCBmdW5jdGlvbiAoZSkge1xuICAgIHRoaXMkMS5jb21wb3NpbmcgPSB7ZGF0YTogZS5kYXRhLCBkb25lOiBmYWxzZX07XG4gIH0pO1xuICBvbihkaXYsIFwiY29tcG9zaXRpb251cGRhdGVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIXRoaXMkMS5jb21wb3NpbmcpIHsgdGhpcyQxLmNvbXBvc2luZyA9IHtkYXRhOiBlLmRhdGEsIGRvbmU6IGZhbHNlfTsgfVxuICB9KTtcbiAgb24oZGl2LCBcImNvbXBvc2l0aW9uZW5kXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKHRoaXMkMS5jb21wb3NpbmcpIHtcbiAgICAgIGlmIChlLmRhdGEgIT0gdGhpcyQxLmNvbXBvc2luZy5kYXRhKSB7IHRoaXMkMS5yZWFkRnJvbURPTVNvb24oKTsgfVxuICAgICAgdGhpcyQxLmNvbXBvc2luZy5kb25lID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIG9uKGRpdiwgXCJ0b3VjaHN0YXJ0XCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlucHV0LmZvcmNlQ29tcG9zaXRpb25FbmQoKTsgfSk7XG5cbiAgb24oZGl2LCBcImlucHV0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMkMS5jb21wb3NpbmcpIHsgdGhpcyQxLnJlYWRGcm9tRE9NU29vbigpOyB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIG9uQ29weUN1dChlKSB7XG4gICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSkgeyByZXR1cm4gfVxuICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7XG4gICAgICBzZXRMYXN0Q29waWVkKHtsaW5lV2lzZTogZmFsc2UsIHRleHQ6IGNtLmdldFNlbGVjdGlvbnMoKX0pO1xuICAgICAgaWYgKGUudHlwZSA9PSBcImN1dFwiKSB7IGNtLnJlcGxhY2VTZWxlY3Rpb24oXCJcIiwgbnVsbCwgXCJjdXRcIik7IH1cbiAgICB9IGVsc2UgaWYgKCFjbS5vcHRpb25zLmxpbmVXaXNlQ29weUN1dCkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByYW5nZXMgPSBjb3B5YWJsZVJhbmdlcyhjbSk7XG4gICAgICBzZXRMYXN0Q29waWVkKHtsaW5lV2lzZTogdHJ1ZSwgdGV4dDogcmFuZ2VzLnRleHR9KTtcbiAgICAgIGlmIChlLnR5cGUgPT0gXCJjdXRcIikge1xuICAgICAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNtLnNldFNlbGVjdGlvbnMocmFuZ2VzLnJhbmdlcywgMCwgc2VsX2RvbnRTY3JvbGwpO1xuICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oXCJcIiwgbnVsbCwgXCJjdXRcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZS5jbGlwYm9hcmREYXRhKSB7XG4gICAgICBlLmNsaXBib2FyZERhdGEuY2xlYXJEYXRhKCk7XG4gICAgICB2YXIgY29udGVudCA9IGxhc3RDb3BpZWQudGV4dC5qb2luKFwiXFxuXCIpO1xuICAgICAgLy8gaU9TIGV4cG9zZXMgdGhlIGNsaXBib2FyZCBBUEksIGJ1dCBzZWVtcyB0byBkaXNjYXJkIGNvbnRlbnQgaW5zZXJ0ZWQgaW50byBpdFxuICAgICAgZS5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJUZXh0XCIsIGNvbnRlbnQpO1xuICAgICAgaWYgKGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKSA9PSBjb250ZW50KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIC8vIE9sZC1mYXNoaW9uZWQgYnJpZWZseS1mb2N1cy1hLXRleHRhcmVhIGhhY2tcbiAgICB2YXIga2x1ZGdlID0gaGlkZGVuVGV4dGFyZWEoKSwgdGUgPSBrbHVkZ2UuZmlyc3RDaGlsZDtcbiAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5pbnNlcnRCZWZvcmUoa2x1ZGdlLCBjbS5kaXNwbGF5LmxpbmVTcGFjZS5maXJzdENoaWxkKTtcbiAgICB0ZS52YWx1ZSA9IGxhc3RDb3BpZWQudGV4dC5qb2luKFwiXFxuXCIpO1xuICAgIHZhciBoYWRGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgc2VsZWN0SW5wdXQodGUpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY20uZGlzcGxheS5saW5lU3BhY2UucmVtb3ZlQ2hpbGQoa2x1ZGdlKTtcbiAgICAgIGhhZEZvY3VzLmZvY3VzKCk7XG4gICAgICBpZiAoaGFkRm9jdXMgPT0gZGl2KSB7IGlucHV0LnNob3dQcmltYXJ5U2VsZWN0aW9uKCk7IH1cbiAgICB9LCA1MCk7XG4gIH1cbiAgb24oZGl2LCBcImNvcHlcIiwgb25Db3B5Q3V0KTtcbiAgb24oZGl2LCBcImN1dFwiLCBvbkNvcHlDdXQpO1xufTtcblxuQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnByZXBhcmVTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByZXN1bHQgPSBwcmVwYXJlU2VsZWN0aW9uKHRoaXMuY20sIGZhbHNlKTtcbiAgcmVzdWx0LmZvY3VzID0gdGhpcy5jbS5zdGF0ZS5mb2N1c2VkO1xuICByZXR1cm4gcmVzdWx0XG59O1xuXG5Db250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc2hvd1NlbGVjdGlvbiA9IGZ1bmN0aW9uIChpbmZvLCB0YWtlRm9jdXMpIHtcbiAgaWYgKCFpbmZvIHx8ICF0aGlzLmNtLmRpc3BsYXkudmlldy5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgaWYgKGluZm8uZm9jdXMgfHwgdGFrZUZvY3VzKSB7IHRoaXMuc2hvd1ByaW1hcnlTZWxlY3Rpb24oKTsgfVxuICB0aGlzLnNob3dNdWx0aXBsZVNlbGVjdGlvbnMoaW5mbyk7XG59O1xuXG5Db250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc2hvd1ByaW1hcnlTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCksIGNtID0gdGhpcy5jbSwgcHJpbSA9IGNtLmRvYy5zZWwucHJpbWFyeSgpO1xuICB2YXIgZnJvbSA9IHByaW0uZnJvbSgpLCB0byA9IHByaW0udG8oKTtcblxuICBpZiAoY20uZGlzcGxheS52aWV3VG8gPT0gY20uZGlzcGxheS52aWV3RnJvbSB8fCBmcm9tLmxpbmUgPj0gY20uZGlzcGxheS52aWV3VG8gfHwgdG8ubGluZSA8IGNtLmRpc3BsYXkudmlld0Zyb20pIHtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgY3VyQW5jaG9yID0gZG9tVG9Qb3MoY20sIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KTtcbiAgdmFyIGN1ckZvY3VzID0gZG9tVG9Qb3MoY20sIHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCk7XG4gIGlmIChjdXJBbmNob3IgJiYgIWN1ckFuY2hvci5iYWQgJiYgY3VyRm9jdXMgJiYgIWN1ckZvY3VzLmJhZCAmJlxuICAgICAgY21wKG1pblBvcyhjdXJBbmNob3IsIGN1ckZvY3VzKSwgZnJvbSkgPT0gMCAmJlxuICAgICAgY21wKG1heFBvcyhjdXJBbmNob3IsIGN1ckZvY3VzKSwgdG8pID09IDApXG4gICAgeyByZXR1cm4gfVxuXG4gIHZhciB2aWV3ID0gY20uZGlzcGxheS52aWV3O1xuICB2YXIgc3RhcnQgPSAoZnJvbS5saW5lID49IGNtLmRpc3BsYXkudmlld0Zyb20gJiYgcG9zVG9ET00oY20sIGZyb20pKSB8fFxuICAgICAge25vZGU6IHZpZXdbMF0ubWVhc3VyZS5tYXBbMl0sIG9mZnNldDogMH07XG4gIHZhciBlbmQgPSB0by5saW5lIDwgY20uZGlzcGxheS52aWV3VG8gJiYgcG9zVG9ET00oY20sIHRvKTtcbiAgaWYgKCFlbmQpIHtcbiAgICB2YXIgbWVhc3VyZSA9IHZpZXdbdmlldy5sZW5ndGggLSAxXS5tZWFzdXJlO1xuICAgIHZhciBtYXAkJDEgPSBtZWFzdXJlLm1hcHMgPyBtZWFzdXJlLm1hcHNbbWVhc3VyZS5tYXBzLmxlbmd0aCAtIDFdIDogbWVhc3VyZS5tYXA7XG4gICAgZW5kID0ge25vZGU6IG1hcCQkMVttYXAkJDEubGVuZ3RoIC0gMV0sIG9mZnNldDogbWFwJCQxW21hcCQkMS5sZW5ndGggLSAyXSAtIG1hcCQkMVttYXAkJDEubGVuZ3RoIC0gM119O1xuICB9XG5cbiAgaWYgKCFzdGFydCB8fCAhZW5kKSB7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIG9sZCA9IHNlbC5yYW5nZUNvdW50ICYmIHNlbC5nZXRSYW5nZUF0KDApLCBybmc7XG4gIHRyeSB7IHJuZyA9IHJhbmdlKHN0YXJ0Lm5vZGUsIHN0YXJ0Lm9mZnNldCwgZW5kLm9mZnNldCwgZW5kLm5vZGUpOyB9XG4gIGNhdGNoKGUpIHt9IC8vIE91ciBtb2RlbCBvZiB0aGUgRE9NIG1pZ2h0IGJlIG91dGRhdGVkLCBpbiB3aGljaCBjYXNlIHRoZSByYW5nZSB3ZSB0cnkgdG8gc2V0IGNhbiBiZSBpbXBvc3NpYmxlXG4gIGlmIChybmcpIHtcbiAgICBpZiAoIWdlY2tvICYmIGNtLnN0YXRlLmZvY3VzZWQpIHtcbiAgICAgIHNlbC5jb2xsYXBzZShzdGFydC5ub2RlLCBzdGFydC5vZmZzZXQpO1xuICAgICAgaWYgKCFybmcuY29sbGFwc2VkKSB7XG4gICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsLmFkZFJhbmdlKHJuZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIHNlbC5hZGRSYW5nZShybmcpO1xuICAgIH1cbiAgICBpZiAob2xkICYmIHNlbC5hbmNob3JOb2RlID09IG51bGwpIHsgc2VsLmFkZFJhbmdlKG9sZCk7IH1cbiAgICBlbHNlIGlmIChnZWNrbykgeyB0aGlzLnN0YXJ0R3JhY2VQZXJpb2QoKTsgfVxuICB9XG4gIHRoaXMucmVtZW1iZXJTZWxlY3Rpb24oKTtcbn07XG5cbkNvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zdGFydEdyYWNlUGVyaW9kID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGNsZWFyVGltZW91dCh0aGlzLmdyYWNlUGVyaW9kKTtcbiAgdGhpcy5ncmFjZVBlcmlvZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRoaXMkMS5ncmFjZVBlcmlvZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzJDEuc2VsZWN0aW9uQ2hhbmdlZCgpKVxuICAgICAgeyB0aGlzJDEuY20ub3BlcmF0aW9uKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMkMS5jbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsgfSk7IH1cbiAgfSwgMjApO1xufTtcblxuQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnNob3dNdWx0aXBsZVNlbGVjdGlvbnMgPSBmdW5jdGlvbiAoaW5mbykge1xuICByZW1vdmVDaGlsZHJlbkFuZEFkZCh0aGlzLmNtLmRpc3BsYXkuY3Vyc29yRGl2LCBpbmZvLmN1cnNvcnMpO1xuICByZW1vdmVDaGlsZHJlbkFuZEFkZCh0aGlzLmNtLmRpc3BsYXkuc2VsZWN0aW9uRGl2LCBpbmZvLnNlbGVjdGlvbik7XG59O1xuXG5Db250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVtZW1iZXJTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIHRoaXMubGFzdEFuY2hvck5vZGUgPSBzZWwuYW5jaG9yTm9kZTsgdGhpcy5sYXN0QW5jaG9yT2Zmc2V0ID0gc2VsLmFuY2hvck9mZnNldDtcbiAgdGhpcy5sYXN0Rm9jdXNOb2RlID0gc2VsLmZvY3VzTm9kZTsgdGhpcy5sYXN0Rm9jdXNPZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQ7XG59O1xuXG5Db250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc2VsZWN0aW9uSW5FZGl0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmICghc2VsLnJhbmdlQ291bnQpIHsgcmV0dXJuIGZhbHNlIH1cbiAgdmFyIG5vZGUgPSBzZWwuZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgcmV0dXJuIGNvbnRhaW5zKHRoaXMuZGl2LCBub2RlKVxufTtcblxuQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbS5vcHRpb25zLnJlYWRPbmx5ICE9IFwibm9jdXJzb3JcIikge1xuICAgIGlmICghdGhpcy5zZWxlY3Rpb25JbkVkaXRvcigpKVxuICAgICAgeyB0aGlzLnNob3dTZWxlY3Rpb24odGhpcy5wcmVwYXJlU2VsZWN0aW9uKCksIHRydWUpOyB9XG4gICAgdGhpcy5kaXYuZm9jdXMoKTtcbiAgfVxufTtcbkNvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5ibHVyID0gZnVuY3Rpb24gKCkgeyB0aGlzLmRpdi5ibHVyKCk7IH07XG5Db250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuZ2V0RmllbGQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmRpdiB9O1xuXG5Db250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc3VwcG9ydHNUb3VjaCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWUgfTtcblxuQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnJlY2VpdmVkRm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpbnB1dCA9IHRoaXM7XG4gIGlmICh0aGlzLnNlbGVjdGlvbkluRWRpdG9yKCkpXG4gICAgeyB0aGlzLnBvbGxTZWxlY3Rpb24oKTsgfVxuICBlbHNlXG4gICAgeyBydW5Jbk9wKHRoaXMuY20sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlucHV0LmNtLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOyB9KTsgfVxuXG4gIGZ1bmN0aW9uIHBvbGwoKSB7XG4gICAgaWYgKGlucHV0LmNtLnN0YXRlLmZvY3VzZWQpIHtcbiAgICAgIGlucHV0LnBvbGxTZWxlY3Rpb24oKTtcbiAgICAgIGlucHV0LnBvbGxpbmcuc2V0KGlucHV0LmNtLm9wdGlvbnMucG9sbEludGVydmFsLCBwb2xsKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5wb2xsaW5nLnNldCh0aGlzLmNtLm9wdGlvbnMucG9sbEludGVydmFsLCBwb2xsKTtcbn07XG5cbkNvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zZWxlY3Rpb25DaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICByZXR1cm4gc2VsLmFuY2hvck5vZGUgIT0gdGhpcy5sYXN0QW5jaG9yTm9kZSB8fCBzZWwuYW5jaG9yT2Zmc2V0ICE9IHRoaXMubGFzdEFuY2hvck9mZnNldCB8fFxuICAgIHNlbC5mb2N1c05vZGUgIT0gdGhpcy5sYXN0Rm9jdXNOb2RlIHx8IHNlbC5mb2N1c09mZnNldCAhPSB0aGlzLmxhc3RGb2N1c09mZnNldFxufTtcblxuQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnBvbGxTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJlYWRET01UaW1lb3V0ICE9IG51bGwgfHwgdGhpcy5ncmFjZVBlcmlvZCB8fCAhdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCkpIHsgcmV0dXJuIH1cbiAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSwgY20gPSB0aGlzLmNtO1xuICAvLyBPbiBBbmRyb2lkIENocm9tZSAodmVyc2lvbiA1NiwgYXQgbGVhc3QpLCBiYWNrc3BhY2luZyBpbnRvIGFuXG4gIC8vIHVuZWRpdGFibGUgYmxvY2sgZWxlbWVudCB3aWxsIHB1dCB0aGUgY3Vyc29yIGluIHRoYXQgZWxlbWVudCxcbiAgLy8gYW5kIHRoZW4sIGJlY2F1c2UgaXQncyBub3QgZWRpdGFibGUsIGhpZGUgdGhlIHZpcnR1YWwga2V5Ym9hcmQuXG4gIC8vIEJlY2F1c2UgQW5kcm9pZCBkb2Vzbid0IGFsbG93IHVzIHRvIGFjdHVhbGx5IGRldGVjdCBiYWNrc3BhY2VcbiAgLy8gcHJlc3NlcyBpbiBhIHNhbmUgd2F5LCB0aGlzIGNvZGUgY2hlY2tzIGZvciB3aGVuIHRoYXQgaGFwcGVuc1xuICAvLyBhbmQgc2ltdWxhdGVzIGEgYmFja3NwYWNlIHByZXNzIGluIHRoaXMgY2FzZS5cbiAgaWYgKGFuZHJvaWQgJiYgY2hyb21lICYmIHRoaXMuY20ub3B0aW9ucy5ndXR0ZXJzLmxlbmd0aCAmJiBpc0luR3V0dGVyKHNlbC5hbmNob3JOb2RlKSkge1xuICAgIHRoaXMuY20udHJpZ2dlck9uS2V5RG93bih7dHlwZTogXCJrZXlkb3duXCIsIGtleUNvZGU6IDgsIHByZXZlbnREZWZhdWx0OiBNYXRoLmFic30pO1xuICAgIHRoaXMuYmx1cigpO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodGhpcy5jb21wb3NpbmcpIHsgcmV0dXJuIH1cbiAgdGhpcy5yZW1lbWJlclNlbGVjdGlvbigpO1xuICB2YXIgYW5jaG9yID0gZG9tVG9Qb3MoY20sIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KTtcbiAgdmFyIGhlYWQgPSBkb21Ub1BvcyhjbSwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgaWYgKGFuY2hvciAmJiBoZWFkKSB7IHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICBzZXRTZWxlY3Rpb24oY20uZG9jLCBzaW1wbGVTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSwgc2VsX2RvbnRTY3JvbGwpO1xuICAgIGlmIChhbmNob3IuYmFkIHx8IGhlYWQuYmFkKSB7IGNtLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOyB9XG4gIH0pOyB9XG59O1xuXG5Db250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucG9sbENvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJlYWRET01UaW1lb3V0ICE9IG51bGwpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWFkRE9NVGltZW91dCk7XG4gICAgdGhpcy5yZWFkRE9NVGltZW91dCA9IG51bGw7XG4gIH1cblxuICB2YXIgY20gPSB0aGlzLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheSwgc2VsID0gY20uZG9jLnNlbC5wcmltYXJ5KCk7XG4gIHZhciBmcm9tID0gc2VsLmZyb20oKSwgdG8gPSBzZWwudG8oKTtcbiAgaWYgKGZyb20uY2ggPT0gMCAmJiBmcm9tLmxpbmUgPiBjbS5maXJzdExpbmUoKSlcbiAgICB7IGZyb20gPSBQb3MoZnJvbS5saW5lIC0gMSwgZ2V0TGluZShjbS5kb2MsIGZyb20ubGluZSAtIDEpLmxlbmd0aCk7IH1cbiAgaWYgKHRvLmNoID09IGdldExpbmUoY20uZG9jLCB0by5saW5lKS50ZXh0Lmxlbmd0aCAmJiB0by5saW5lIDwgY20ubGFzdExpbmUoKSlcbiAgICB7IHRvID0gUG9zKHRvLmxpbmUgKyAxLCAwKTsgfVxuICBpZiAoZnJvbS5saW5lIDwgZGlzcGxheS52aWV3RnJvbSB8fCB0by5saW5lID4gZGlzcGxheS52aWV3VG8gLSAxKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgdmFyIGZyb21JbmRleCwgZnJvbUxpbmUsIGZyb21Ob2RlO1xuICBpZiAoZnJvbS5saW5lID09IGRpc3BsYXkudmlld0Zyb20gfHwgKGZyb21JbmRleCA9IGZpbmRWaWV3SW5kZXgoY20sIGZyb20ubGluZSkpID09IDApIHtcbiAgICBmcm9tTGluZSA9IGxpbmVObyhkaXNwbGF5LnZpZXdbMF0ubGluZSk7XG4gICAgZnJvbU5vZGUgPSBkaXNwbGF5LnZpZXdbMF0ubm9kZTtcbiAgfSBlbHNlIHtcbiAgICBmcm9tTGluZSA9IGxpbmVObyhkaXNwbGF5LnZpZXdbZnJvbUluZGV4XS5saW5lKTtcbiAgICBmcm9tTm9kZSA9IGRpc3BsYXkudmlld1tmcm9tSW5kZXggLSAxXS5ub2RlLm5leHRTaWJsaW5nO1xuICB9XG4gIHZhciB0b0luZGV4ID0gZmluZFZpZXdJbmRleChjbSwgdG8ubGluZSk7XG4gIHZhciB0b0xpbmUsIHRvTm9kZTtcbiAgaWYgKHRvSW5kZXggPT0gZGlzcGxheS52aWV3Lmxlbmd0aCAtIDEpIHtcbiAgICB0b0xpbmUgPSBkaXNwbGF5LnZpZXdUbyAtIDE7XG4gICAgdG9Ob2RlID0gZGlzcGxheS5saW5lRGl2Lmxhc3RDaGlsZDtcbiAgfSBlbHNlIHtcbiAgICB0b0xpbmUgPSBsaW5lTm8oZGlzcGxheS52aWV3W3RvSW5kZXggKyAxXS5saW5lKSAtIDE7XG4gICAgdG9Ob2RlID0gZGlzcGxheS52aWV3W3RvSW5kZXggKyAxXS5ub2RlLnByZXZpb3VzU2libGluZztcbiAgfVxuXG4gIGlmICghZnJvbU5vZGUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgdmFyIG5ld1RleHQgPSBjbS5kb2Muc3BsaXRMaW5lcyhkb21UZXh0QmV0d2VlbihjbSwgZnJvbU5vZGUsIHRvTm9kZSwgZnJvbUxpbmUsIHRvTGluZSkpO1xuICB2YXIgb2xkVGV4dCA9IGdldEJldHdlZW4oY20uZG9jLCBQb3MoZnJvbUxpbmUsIDApLCBQb3ModG9MaW5lLCBnZXRMaW5lKGNtLmRvYywgdG9MaW5lKS50ZXh0Lmxlbmd0aCkpO1xuICB3aGlsZSAobmV3VGV4dC5sZW5ndGggPiAxICYmIG9sZFRleHQubGVuZ3RoID4gMSkge1xuICAgIGlmIChsc3QobmV3VGV4dCkgPT0gbHN0KG9sZFRleHQpKSB7IG5ld1RleHQucG9wKCk7IG9sZFRleHQucG9wKCk7IHRvTGluZS0tOyB9XG4gICAgZWxzZSBpZiAobmV3VGV4dFswXSA9PSBvbGRUZXh0WzBdKSB7IG5ld1RleHQuc2hpZnQoKTsgb2xkVGV4dC5zaGlmdCgpOyBmcm9tTGluZSsrOyB9XG4gICAgZWxzZSB7IGJyZWFrIH1cbiAgfVxuXG4gIHZhciBjdXRGcm9udCA9IDAsIGN1dEVuZCA9IDA7XG4gIHZhciBuZXdUb3AgPSBuZXdUZXh0WzBdLCBvbGRUb3AgPSBvbGRUZXh0WzBdLCBtYXhDdXRGcm9udCA9IE1hdGgubWluKG5ld1RvcC5sZW5ndGgsIG9sZFRvcC5sZW5ndGgpO1xuICB3aGlsZSAoY3V0RnJvbnQgPCBtYXhDdXRGcm9udCAmJiBuZXdUb3AuY2hhckNvZGVBdChjdXRGcm9udCkgPT0gb2xkVG9wLmNoYXJDb2RlQXQoY3V0RnJvbnQpKVxuICAgIHsgKytjdXRGcm9udDsgfVxuICB2YXIgbmV3Qm90ID0gbHN0KG5ld1RleHQpLCBvbGRCb3QgPSBsc3Qob2xkVGV4dCk7XG4gIHZhciBtYXhDdXRFbmQgPSBNYXRoLm1pbihuZXdCb3QubGVuZ3RoIC0gKG5ld1RleHQubGVuZ3RoID09IDEgPyBjdXRGcm9udCA6IDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQm90Lmxlbmd0aCAtIChvbGRUZXh0Lmxlbmd0aCA9PSAxID8gY3V0RnJvbnQgOiAwKSk7XG4gIHdoaWxlIChjdXRFbmQgPCBtYXhDdXRFbmQgJiZcbiAgICAgICAgIG5ld0JvdC5jaGFyQ29kZUF0KG5ld0JvdC5sZW5ndGggLSBjdXRFbmQgLSAxKSA9PSBvbGRCb3QuY2hhckNvZGVBdChvbGRCb3QubGVuZ3RoIC0gY3V0RW5kIC0gMSkpXG4gICAgeyArK2N1dEVuZDsgfVxuICAvLyBUcnkgdG8gbW92ZSBzdGFydCBvZiBjaGFuZ2UgdG8gc3RhcnQgb2Ygc2VsZWN0aW9uIGlmIGFtYmlndW91c1xuICBpZiAobmV3VGV4dC5sZW5ndGggPT0gMSAmJiBvbGRUZXh0Lmxlbmd0aCA9PSAxICYmIGZyb21MaW5lID09IGZyb20ubGluZSkge1xuICAgIHdoaWxlIChjdXRGcm9udCAmJiBjdXRGcm9udCA+IGZyb20uY2ggJiZcbiAgICAgICAgICAgbmV3Qm90LmNoYXJDb2RlQXQobmV3Qm90Lmxlbmd0aCAtIGN1dEVuZCAtIDEpID09IG9sZEJvdC5jaGFyQ29kZUF0KG9sZEJvdC5sZW5ndGggLSBjdXRFbmQgLSAxKSkge1xuICAgICAgY3V0RnJvbnQtLTtcbiAgICAgIGN1dEVuZCsrO1xuICAgIH1cbiAgfVxuXG4gIG5ld1RleHRbbmV3VGV4dC5sZW5ndGggLSAxXSA9IG5ld0JvdC5zbGljZSgwLCBuZXdCb3QubGVuZ3RoIC0gY3V0RW5kKS5yZXBsYWNlKC9eXFx1MjAwYisvLCBcIlwiKTtcbiAgbmV3VGV4dFswXSA9IG5ld1RleHRbMF0uc2xpY2UoY3V0RnJvbnQpLnJlcGxhY2UoL1xcdTIwMGIrJC8sIFwiXCIpO1xuXG4gIHZhciBjaEZyb20gPSBQb3MoZnJvbUxpbmUsIGN1dEZyb250KTtcbiAgdmFyIGNoVG8gPSBQb3ModG9MaW5lLCBvbGRUZXh0Lmxlbmd0aCA/IGxzdChvbGRUZXh0KS5sZW5ndGggLSBjdXRFbmQgOiAwKTtcbiAgaWYgKG5ld1RleHQubGVuZ3RoID4gMSB8fCBuZXdUZXh0WzBdIHx8IGNtcChjaEZyb20sIGNoVG8pKSB7XG4gICAgcmVwbGFjZVJhbmdlKGNtLmRvYywgbmV3VGV4dCwgY2hGcm9tLCBjaFRvLCBcIitpbnB1dFwiKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59O1xuXG5Db250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuZW5zdXJlUG9sbGVkID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmZvcmNlQ29tcG9zaXRpb25FbmQoKTtcbn07XG5Db250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZm9yY2VDb21wb3NpdGlvbkVuZCgpO1xufTtcbkNvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5mb3JjZUNvbXBvc2l0aW9uRW5kID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY29tcG9zaW5nKSB7IHJldHVybiB9XG4gIGNsZWFyVGltZW91dCh0aGlzLnJlYWRET01UaW1lb3V0KTtcbiAgdGhpcy5jb21wb3NpbmcgPSBudWxsO1xuICB0aGlzLnVwZGF0ZUZyb21ET00oKTtcbiAgdGhpcy5kaXYuYmx1cigpO1xuICB0aGlzLmRpdi5mb2N1cygpO1xufTtcbkNvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5yZWFkRnJvbURPTVNvb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKHRoaXMucmVhZERPTVRpbWVvdXQgIT0gbnVsbCkgeyByZXR1cm4gfVxuICB0aGlzLnJlYWRET01UaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdGhpcyQxLnJlYWRET01UaW1lb3V0ID0gbnVsbDtcbiAgICBpZiAodGhpcyQxLmNvbXBvc2luZykge1xuICAgICAgaWYgKHRoaXMkMS5jb21wb3NpbmcuZG9uZSkgeyB0aGlzJDEuY29tcG9zaW5nID0gbnVsbDsgfVxuICAgICAgZWxzZSB7IHJldHVybiB9XG4gICAgfVxuICAgIHRoaXMkMS51cGRhdGVGcm9tRE9NKCk7XG4gIH0sIDgwKTtcbn07XG5cbkNvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS51cGRhdGVGcm9tRE9NID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmICh0aGlzLmNtLmlzUmVhZE9ubHkoKSB8fCAhdGhpcy5wb2xsQ29udGVudCgpKVxuICAgIHsgcnVuSW5PcCh0aGlzLmNtLCBmdW5jdGlvbiAoKSB7IHJldHVybiByZWdDaGFuZ2UodGhpcyQxLmNtKTsgfSk7IH1cbn07XG5cbkNvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zZXRVbmVkaXRhYmxlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgbm9kZS5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG59O1xuXG5Db250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUub25LZXlQcmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gIGlmIChlLmNoYXJDb2RlID09IDApIHsgcmV0dXJuIH1cbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICBpZiAoIXRoaXMuY20uaXNSZWFkT25seSgpKVxuICAgIHsgb3BlcmF0aW9uKHRoaXMuY20sIGFwcGx5VGV4dElucHV0KSh0aGlzLmNtLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGUgPT0gbnVsbCA/IGUua2V5Q29kZSA6IGUuY2hhckNvZGUpLCAwKTsgfVxufTtcblxuQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnJlYWRPbmx5Q2hhbmdlZCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgdGhpcy5kaXYuY29udGVudEVkaXRhYmxlID0gU3RyaW5nKHZhbCAhPSBcIm5vY3Vyc29yXCIpO1xufTtcblxuQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLm9uQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoKSB7fTtcbkNvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5yZXNldFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge307XG5cbkNvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5uZWVkc0NvbnRlbnRBdHRyaWJ1dGUgPSB0cnVlO1xuXG5mdW5jdGlvbiBwb3NUb0RPTShjbSwgcG9zKSB7XG4gIHZhciB2aWV3ID0gZmluZFZpZXdGb3JMaW5lKGNtLCBwb3MubGluZSk7XG4gIGlmICghdmlldyB8fCB2aWV3LmhpZGRlbikgeyByZXR1cm4gbnVsbCB9XG4gIHZhciBsaW5lID0gZ2V0TGluZShjbS5kb2MsIHBvcy5saW5lKTtcbiAgdmFyIGluZm8gPSBtYXBGcm9tTGluZVZpZXcodmlldywgbGluZSwgcG9zLmxpbmUpO1xuXG4gIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmUsIGNtLmRvYy5kaXJlY3Rpb24pLCBzaWRlID0gXCJsZWZ0XCI7XG4gIGlmIChvcmRlcikge1xuICAgIHZhciBwYXJ0UG9zID0gZ2V0QmlkaVBhcnRBdChvcmRlciwgcG9zLmNoKTtcbiAgICBzaWRlID0gcGFydFBvcyAlIDIgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjtcbiAgfVxuICB2YXIgcmVzdWx0ID0gbm9kZUFuZE9mZnNldEluTGluZU1hcChpbmZvLm1hcCwgcG9zLmNoLCBzaWRlKTtcbiAgcmVzdWx0Lm9mZnNldCA9IHJlc3VsdC5jb2xsYXBzZSA9PSBcInJpZ2h0XCIgPyByZXN1bHQuZW5kIDogcmVzdWx0LnN0YXJ0O1xuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGlzSW5HdXR0ZXIobm9kZSkge1xuICBmb3IgKHZhciBzY2FuID0gbm9kZTsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50Tm9kZSlcbiAgICB7IGlmICgvQ29kZU1pcnJvci1ndXR0ZXItd3JhcHBlci8udGVzdChzY2FuLmNsYXNzTmFtZSkpIHsgcmV0dXJuIHRydWUgfSB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBiYWRQb3MocG9zLCBiYWQpIHsgaWYgKGJhZCkgeyBwb3MuYmFkID0gdHJ1ZTsgfSByZXR1cm4gcG9zIH1cblxuZnVuY3Rpb24gZG9tVGV4dEJldHdlZW4oY20sIGZyb20sIHRvLCBmcm9tTGluZSwgdG9MaW5lKSB7XG4gIHZhciB0ZXh0ID0gXCJcIiwgY2xvc2luZyA9IGZhbHNlLCBsaW5lU2VwID0gY20uZG9jLmxpbmVTZXBhcmF0b3IoKTtcbiAgZnVuY3Rpb24gcmVjb2duaXplTWFya2VyKGlkKSB7IHJldHVybiBmdW5jdGlvbiAobWFya2VyKSB7IHJldHVybiBtYXJrZXIuaWQgPT0gaWQ7IH0gfVxuICBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICBpZiAoY2xvc2luZykge1xuICAgICAgdGV4dCArPSBsaW5lU2VwO1xuICAgICAgY2xvc2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhZGRUZXh0KHN0cikge1xuICAgIGlmIChzdHIpIHtcbiAgICAgIGNsb3NlKCk7XG4gICAgICB0ZXh0ICs9IHN0cjtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gd2Fsayhub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgdmFyIGNtVGV4dCA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY20tdGV4dFwiKTtcbiAgICAgIGlmIChjbVRleHQgIT0gbnVsbCkge1xuICAgICAgICBhZGRUZXh0KGNtVGV4dCB8fCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoL1xcdTIwMGIvZywgXCJcIikpO1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHZhciBtYXJrZXJJRCA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY20tbWFya2VyXCIpLCByYW5nZSQkMTtcbiAgICAgIGlmIChtYXJrZXJJRCkge1xuICAgICAgICB2YXIgZm91bmQgPSBjbS5maW5kTWFya3MoUG9zKGZyb21MaW5lLCAwKSwgUG9zKHRvTGluZSArIDEsIDApLCByZWNvZ25pemVNYXJrZXIoK21hcmtlcklEKSk7XG4gICAgICAgIGlmIChmb3VuZC5sZW5ndGggJiYgKHJhbmdlJCQxID0gZm91bmRbMF0uZmluZCgwKSkpXG4gICAgICAgICAgeyBhZGRUZXh0KGdldEJldHdlZW4oY20uZG9jLCByYW5nZSQkMS5mcm9tLCByYW5nZSQkMS50bykuam9pbihsaW5lU2VwKSk7IH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoXCJjb250ZW50ZWRpdGFibGVcIikgPT0gXCJmYWxzZVwiKSB7IHJldHVybiB9XG4gICAgICB2YXIgaXNCbG9jayA9IC9eKHByZXxkaXZ8cCkkL2kudGVzdChub2RlLm5vZGVOYW1lKTtcbiAgICAgIGlmIChpc0Jsb2NrKSB7IGNsb3NlKCk7IH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7IHdhbGsobm9kZS5jaGlsZE5vZGVzW2ldKTsgfVxuICAgICAgaWYgKGlzQmxvY2spIHsgY2xvc2luZyA9IHRydWU7IH1cbiAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgICAgYWRkVGV4dChub2RlLm5vZGVWYWx1ZSk7XG4gICAgfVxuICB9XG4gIGZvciAoOzspIHtcbiAgICB3YWxrKGZyb20pO1xuICAgIGlmIChmcm9tID09IHRvKSB7IGJyZWFrIH1cbiAgICBmcm9tID0gZnJvbS5uZXh0U2libGluZztcbiAgfVxuICByZXR1cm4gdGV4dFxufVxuXG5mdW5jdGlvbiBkb21Ub1BvcyhjbSwgbm9kZSwgb2Zmc2V0KSB7XG4gIHZhciBsaW5lTm9kZTtcbiAgaWYgKG5vZGUgPT0gY20uZGlzcGxheS5saW5lRGl2KSB7XG4gICAgbGluZU5vZGUgPSBjbS5kaXNwbGF5LmxpbmVEaXYuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgIGlmICghbGluZU5vZGUpIHsgcmV0dXJuIGJhZFBvcyhjbS5jbGlwUG9zKFBvcyhjbS5kaXNwbGF5LnZpZXdUbyAtIDEpKSwgdHJ1ZSkgfVxuICAgIG5vZGUgPSBudWxsOyBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIGZvciAobGluZU5vZGUgPSBub2RlOzsgbGluZU5vZGUgPSBsaW5lTm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAoIWxpbmVOb2RlIHx8IGxpbmVOb2RlID09IGNtLmRpc3BsYXkubGluZURpdikgeyByZXR1cm4gbnVsbCB9XG4gICAgICBpZiAobGluZU5vZGUucGFyZW50Tm9kZSAmJiBsaW5lTm9kZS5wYXJlbnROb2RlID09IGNtLmRpc3BsYXkubGluZURpdikgeyBicmVhayB9XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY20uZGlzcGxheS52aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxpbmVWaWV3ID0gY20uZGlzcGxheS52aWV3W2ldO1xuICAgIGlmIChsaW5lVmlldy5ub2RlID09IGxpbmVOb2RlKVxuICAgICAgeyByZXR1cm4gbG9jYXRlTm9kZUluTGluZVZpZXcobGluZVZpZXcsIG5vZGUsIG9mZnNldCkgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGxvY2F0ZU5vZGVJbkxpbmVWaWV3KGxpbmVWaWV3LCBub2RlLCBvZmZzZXQpIHtcbiAgdmFyIHdyYXBwZXIgPSBsaW5lVmlldy50ZXh0LmZpcnN0Q2hpbGQsIGJhZCA9IGZhbHNlO1xuICBpZiAoIW5vZGUgfHwgIWNvbnRhaW5zKHdyYXBwZXIsIG5vZGUpKSB7IHJldHVybiBiYWRQb3MoUG9zKGxpbmVObyhsaW5lVmlldy5saW5lKSwgMCksIHRydWUpIH1cbiAgaWYgKG5vZGUgPT0gd3JhcHBlcikge1xuICAgIGJhZCA9IHRydWU7XG4gICAgbm9kZSA9IHdyYXBwZXIuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgIG9mZnNldCA9IDA7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICB2YXIgbGluZSA9IGxpbmVWaWV3LnJlc3QgPyBsc3QobGluZVZpZXcucmVzdCkgOiBsaW5lVmlldy5saW5lO1xuICAgICAgcmV0dXJuIGJhZFBvcyhQb3MobGluZU5vKGxpbmUpLCBsaW5lLnRleHQubGVuZ3RoKSwgYmFkKVxuICAgIH1cbiAgfVxuXG4gIHZhciB0ZXh0Tm9kZSA9IG5vZGUubm9kZVR5cGUgPT0gMyA/IG5vZGUgOiBudWxsLCB0b3BOb2RlID0gbm9kZTtcbiAgaWYgKCF0ZXh0Tm9kZSAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJiYgbm9kZS5maXJzdENoaWxkLm5vZGVUeXBlID09IDMpIHtcbiAgICB0ZXh0Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICBpZiAob2Zmc2V0KSB7IG9mZnNldCA9IHRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGg7IH1cbiAgfVxuICB3aGlsZSAodG9wTm9kZS5wYXJlbnROb2RlICE9IHdyYXBwZXIpIHsgdG9wTm9kZSA9IHRvcE5vZGUucGFyZW50Tm9kZTsgfVxuICB2YXIgbWVhc3VyZSA9IGxpbmVWaWV3Lm1lYXN1cmUsIG1hcHMgPSBtZWFzdXJlLm1hcHM7XG5cbiAgZnVuY3Rpb24gZmluZCh0ZXh0Tm9kZSwgdG9wTm9kZSwgb2Zmc2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IC0xOyBpIDwgKG1hcHMgPyBtYXBzLmxlbmd0aCA6IDApOyBpKyspIHtcbiAgICAgIHZhciBtYXAkJDEgPSBpIDwgMCA/IG1lYXN1cmUubWFwIDogbWFwc1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWFwJCQxLmxlbmd0aDsgaiArPSAzKSB7XG4gICAgICAgIHZhciBjdXJOb2RlID0gbWFwJCQxW2ogKyAyXTtcbiAgICAgICAgaWYgKGN1ck5vZGUgPT0gdGV4dE5vZGUgfHwgY3VyTm9kZSA9PSB0b3BOb2RlKSB7XG4gICAgICAgICAgdmFyIGxpbmUgPSBsaW5lTm8oaSA8IDAgPyBsaW5lVmlldy5saW5lIDogbGluZVZpZXcucmVzdFtpXSk7XG4gICAgICAgICAgdmFyIGNoID0gbWFwJCQxW2pdICsgb2Zmc2V0O1xuICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IGN1ck5vZGUgIT0gdGV4dE5vZGUpIHsgY2ggPSBtYXAkJDFbaiArIChvZmZzZXQgPyAxIDogMCldOyB9XG4gICAgICAgICAgcmV0dXJuIFBvcyhsaW5lLCBjaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgZm91bmQgPSBmaW5kKHRleHROb2RlLCB0b3BOb2RlLCBvZmZzZXQpO1xuICBpZiAoZm91bmQpIHsgcmV0dXJuIGJhZFBvcyhmb3VuZCwgYmFkKSB9XG5cbiAgLy8gRklYTUUgdGhpcyBpcyBhbGwgcmVhbGx5IHNoYWt5LiBtaWdodCBoYW5kbGUgdGhlIGZldyBjYXNlcyBpdCBuZWVkcyB0byBoYW5kbGUsIGJ1dCBsaWtlbHkgdG8gY2F1c2UgcHJvYmxlbXNcbiAgZm9yICh2YXIgYWZ0ZXIgPSB0b3BOb2RlLm5leHRTaWJsaW5nLCBkaXN0ID0gdGV4dE5vZGUgPyB0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gb2Zmc2V0IDogMDsgYWZ0ZXI7IGFmdGVyID0gYWZ0ZXIubmV4dFNpYmxpbmcpIHtcbiAgICBmb3VuZCA9IGZpbmQoYWZ0ZXIsIGFmdGVyLmZpcnN0Q2hpbGQsIDApO1xuICAgIGlmIChmb3VuZClcbiAgICAgIHsgcmV0dXJuIGJhZFBvcyhQb3MoZm91bmQubGluZSwgZm91bmQuY2ggLSBkaXN0KSwgYmFkKSB9XG4gICAgZWxzZVxuICAgICAgeyBkaXN0ICs9IGFmdGVyLnRleHRDb250ZW50Lmxlbmd0aDsgfVxuICB9XG4gIGZvciAodmFyIGJlZm9yZSA9IHRvcE5vZGUucHJldmlvdXNTaWJsaW5nLCBkaXN0JDEgPSBvZmZzZXQ7IGJlZm9yZTsgYmVmb3JlID0gYmVmb3JlLnByZXZpb3VzU2libGluZykge1xuICAgIGZvdW5kID0gZmluZChiZWZvcmUsIGJlZm9yZS5maXJzdENoaWxkLCAtMSk7XG4gICAgaWYgKGZvdW5kKVxuICAgICAgeyByZXR1cm4gYmFkUG9zKFBvcyhmb3VuZC5saW5lLCBmb3VuZC5jaCArIGRpc3QkMSksIGJhZCkgfVxuICAgIGVsc2VcbiAgICAgIHsgZGlzdCQxICs9IGJlZm9yZS50ZXh0Q29udGVudC5sZW5ndGg7IH1cbiAgfVxufVxuXG4vLyBURVhUQVJFQSBJTlBVVCBTVFlMRVxuXG52YXIgVGV4dGFyZWFJbnB1dCA9IGZ1bmN0aW9uKGNtKSB7XG4gIHRoaXMuY20gPSBjbTtcbiAgLy8gU2VlIGlucHV0LnBvbGwgYW5kIGlucHV0LnJlc2V0XG4gIHRoaXMucHJldklucHV0ID0gXCJcIjtcblxuICAvLyBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgd2UgZXhwZWN0IGlucHV0IHRvIGFwcGVhciByZWFsIHNvb25cbiAgLy8gbm93IChhZnRlciBzb21lIGV2ZW50IGxpa2UgJ2tleXByZXNzJyBvciAnaW5wdXQnKSBhbmQgYXJlXG4gIC8vIHBvbGxpbmcgaW50ZW5zaXZlbHkuXG4gIHRoaXMucG9sbGluZ0Zhc3QgPSBmYWxzZTtcbiAgLy8gU2VsZi1yZXNldHRpbmcgdGltZW91dCBmb3IgdGhlIHBvbGxlclxuICB0aGlzLnBvbGxpbmcgPSBuZXcgRGVsYXllZCgpO1xuICAvLyBVc2VkIHRvIHdvcmsgYXJvdW5kIElFIGlzc3VlIHdpdGggc2VsZWN0aW9uIGJlaW5nIGZvcmdvdHRlbiB3aGVuIGZvY3VzIG1vdmVzIGF3YXkgZnJvbSB0ZXh0YXJlYVxuICB0aGlzLmhhc1NlbGVjdGlvbiA9IGZhbHNlO1xuICB0aGlzLmNvbXBvc2luZyA9IG51bGw7XG59O1xuXG5UZXh0YXJlYUlucHV0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKGRpc3BsYXkpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgaW5wdXQgPSB0aGlzLCBjbSA9IHRoaXMuY207XG4gIHRoaXMuY3JlYXRlRmllbGQoZGlzcGxheSk7XG4gIHZhciB0ZSA9IHRoaXMudGV4dGFyZWE7XG5cbiAgZGlzcGxheS53cmFwcGVyLmluc2VydEJlZm9yZSh0aGlzLndyYXBwZXIsIGRpc3BsYXkud3JhcHBlci5maXJzdENoaWxkKTtcblxuICAvLyBOZWVkZWQgdG8gaGlkZSBiaWcgYmx1ZSBibGlua2luZyBjdXJzb3Igb24gTW9iaWxlIFNhZmFyaSAoZG9lc24ndCBzZWVtIHRvIHdvcmsgaW4gaU9TIDggYW55bW9yZSlcbiAgaWYgKGlvcykgeyB0ZS5zdHlsZS53aWR0aCA9IFwiMHB4XCI7IH1cblxuICBvbih0ZSwgXCJpbnB1dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSAmJiB0aGlzJDEuaGFzU2VsZWN0aW9uKSB7IHRoaXMkMS5oYXNTZWxlY3Rpb24gPSBudWxsOyB9XG4gICAgaW5wdXQucG9sbCgpO1xuICB9KTtcblxuICBvbih0ZSwgXCJwYXN0ZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSkgfHwgaGFuZGxlUGFzdGUoZSwgY20pKSB7IHJldHVybiB9XG5cbiAgICBjbS5zdGF0ZS5wYXN0ZUluY29taW5nID0gdHJ1ZTtcbiAgICBpbnB1dC5mYXN0UG9sbCgpO1xuICB9KTtcblxuICBmdW5jdGlvbiBwcmVwYXJlQ29weUN1dChlKSB7XG4gICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSkgeyByZXR1cm4gfVxuICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7XG4gICAgICBzZXRMYXN0Q29waWVkKHtsaW5lV2lzZTogZmFsc2UsIHRleHQ6IGNtLmdldFNlbGVjdGlvbnMoKX0pO1xuICAgIH0gZWxzZSBpZiAoIWNtLm9wdGlvbnMubGluZVdpc2VDb3B5Q3V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJhbmdlcyA9IGNvcHlhYmxlUmFuZ2VzKGNtKTtcbiAgICAgIHNldExhc3RDb3BpZWQoe2xpbmVXaXNlOiB0cnVlLCB0ZXh0OiByYW5nZXMudGV4dH0pO1xuICAgICAgaWYgKGUudHlwZSA9PSBcImN1dFwiKSB7XG4gICAgICAgIGNtLnNldFNlbGVjdGlvbnMocmFuZ2VzLnJhbmdlcywgbnVsbCwgc2VsX2RvbnRTY3JvbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXQucHJldklucHV0ID0gXCJcIjtcbiAgICAgICAgdGUudmFsdWUgPSByYW5nZXMudGV4dC5qb2luKFwiXFxuXCIpO1xuICAgICAgICBzZWxlY3RJbnB1dCh0ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlLnR5cGUgPT0gXCJjdXRcIikgeyBjbS5zdGF0ZS5jdXRJbmNvbWluZyA9IHRydWU7IH1cbiAgfVxuICBvbih0ZSwgXCJjdXRcIiwgcHJlcGFyZUNvcHlDdXQpO1xuICBvbih0ZSwgXCJjb3B5XCIsIHByZXBhcmVDb3B5Q3V0KTtcblxuICBvbihkaXNwbGF5LnNjcm9sbGVyLCBcInBhc3RlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGV2ZW50SW5XaWRnZXQoZGlzcGxheSwgZSkgfHwgc2lnbmFsRE9NRXZlbnQoY20sIGUpKSB7IHJldHVybiB9XG4gICAgY20uc3RhdGUucGFzdGVJbmNvbWluZyA9IHRydWU7XG4gICAgaW5wdXQuZm9jdXMoKTtcbiAgfSk7XG5cbiAgLy8gUHJldmVudCBub3JtYWwgc2VsZWN0aW9uIGluIHRoZSBlZGl0b3IgKHdlIGhhbmRsZSBvdXIgb3duKVxuICBvbihkaXNwbGF5LmxpbmVTcGFjZSwgXCJzZWxlY3RzdGFydFwiLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghZXZlbnRJbldpZGdldChkaXNwbGF5LCBlKSkgeyBlX3ByZXZlbnREZWZhdWx0KGUpOyB9XG4gIH0pO1xuXG4gIG9uKHRlLCBcImNvbXBvc2l0aW9uc3RhcnRcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFydCA9IGNtLmdldEN1cnNvcihcImZyb21cIik7XG4gICAgaWYgKGlucHV0LmNvbXBvc2luZykgeyBpbnB1dC5jb21wb3NpbmcucmFuZ2UuY2xlYXIoKTsgfVxuICAgIGlucHV0LmNvbXBvc2luZyA9IHtcbiAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgIHJhbmdlOiBjbS5tYXJrVGV4dChzdGFydCwgY20uZ2V0Q3Vyc29yKFwidG9cIiksIHtjbGFzc05hbWU6IFwiQ29kZU1pcnJvci1jb21wb3NpbmdcIn0pXG4gICAgfTtcbiAgfSk7XG4gIG9uKHRlLCBcImNvbXBvc2l0aW9uZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaW5wdXQuY29tcG9zaW5nKSB7XG4gICAgICBpbnB1dC5wb2xsKCk7XG4gICAgICBpbnB1dC5jb21wb3NpbmcucmFuZ2UuY2xlYXIoKTtcbiAgICAgIGlucHV0LmNvbXBvc2luZyA9IG51bGw7XG4gICAgfVxuICB9KTtcbn07XG5cblRleHRhcmVhSW5wdXQucHJvdG90eXBlLmNyZWF0ZUZpZWxkID0gZnVuY3Rpb24gKF9kaXNwbGF5KSB7XG4gIC8vIFdyYXBzIGFuZCBoaWRlcyBpbnB1dCB0ZXh0YXJlYVxuICB0aGlzLndyYXBwZXIgPSBoaWRkZW5UZXh0YXJlYSgpO1xuICAvLyBUaGUgc2VtaWhpZGRlbiB0ZXh0YXJlYSB0aGF0IGlzIGZvY3VzZWQgd2hlbiB0aGUgZWRpdG9yIGlzXG4gIC8vIGZvY3VzZWQsIGFuZCByZWNlaXZlcyBpbnB1dC5cbiAgdGhpcy50ZXh0YXJlYSA9IHRoaXMud3JhcHBlci5maXJzdENoaWxkO1xufTtcblxuVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUucHJlcGFyZVNlbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gUmVkcmF3IHRoZSBzZWxlY3Rpb24gYW5kL29yIGN1cnNvclxuICB2YXIgY20gPSB0aGlzLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jO1xuICB2YXIgcmVzdWx0ID0gcHJlcGFyZVNlbGVjdGlvbihjbSk7XG5cbiAgLy8gTW92ZSB0aGUgaGlkZGVuIHRleHRhcmVhIG5lYXIgdGhlIGN1cnNvciB0byBwcmV2ZW50IHNjcm9sbGluZyBhcnRpZmFjdHNcbiAgaWYgKGNtLm9wdGlvbnMubW92ZUlucHV0V2l0aEN1cnNvcikge1xuICAgIHZhciBoZWFkUG9zID0gY3Vyc29yQ29vcmRzKGNtLCBkb2Muc2VsLnByaW1hcnkoKS5oZWFkLCBcImRpdlwiKTtcbiAgICB2YXIgd3JhcE9mZiA9IGRpc3BsYXkud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgbGluZU9mZiA9IGRpc3BsYXkubGluZURpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXN1bHQudGVUb3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0IC0gMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZFBvcy50b3AgKyBsaW5lT2ZmLnRvcCAtIHdyYXBPZmYudG9wKSk7XG4gICAgcmVzdWx0LnRlTGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGRpc3BsYXkud3JhcHBlci5jbGllbnRXaWR0aCAtIDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkUG9zLmxlZnQgKyBsaW5lT2ZmLmxlZnQgLSB3cmFwT2ZmLmxlZnQpKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn07XG5cblRleHRhcmVhSW5wdXQucHJvdG90eXBlLnNob3dTZWxlY3Rpb24gPSBmdW5jdGlvbiAoZHJhd24pIHtcbiAgdmFyIGNtID0gdGhpcy5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkuY3Vyc29yRGl2LCBkcmF3bi5jdXJzb3JzKTtcbiAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5zZWxlY3Rpb25EaXYsIGRyYXduLnNlbGVjdGlvbik7XG4gIGlmIChkcmF3bi50ZVRvcCAhPSBudWxsKSB7XG4gICAgdGhpcy53cmFwcGVyLnN0eWxlLnRvcCA9IGRyYXduLnRlVG9wICsgXCJweFwiO1xuICAgIHRoaXMud3JhcHBlci5zdHlsZS5sZWZ0ID0gZHJhd24udGVMZWZ0ICsgXCJweFwiO1xuICB9XG59O1xuXG4vLyBSZXNldCB0aGUgaW5wdXQgdG8gY29ycmVzcG9uZCB0byB0aGUgc2VsZWN0aW9uIChvciB0byBiZSBlbXB0eSxcbi8vIHdoZW4gbm90IHR5cGluZyBhbmQgbm90aGluZyBpcyBzZWxlY3RlZClcblRleHRhcmVhSW5wdXQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKHR5cGluZykge1xuICBpZiAodGhpcy5jb250ZXh0TWVudVBlbmRpbmcgfHwgdGhpcy5jb21wb3NpbmcpIHsgcmV0dXJuIH1cbiAgdmFyIGNtID0gdGhpcy5jbTtcbiAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHtcbiAgICB0aGlzLnByZXZJbnB1dCA9IFwiXCI7XG4gICAgdmFyIGNvbnRlbnQgPSBjbS5nZXRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnRleHRhcmVhLnZhbHVlID0gY29udGVudDtcbiAgICBpZiAoY20uc3RhdGUuZm9jdXNlZCkgeyBzZWxlY3RJbnB1dCh0aGlzLnRleHRhcmVhKTsgfVxuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkpIHsgdGhpcy5oYXNTZWxlY3Rpb24gPSBjb250ZW50OyB9XG4gIH0gZWxzZSBpZiAoIXR5cGluZykge1xuICAgIHRoaXMucHJldklucHV0ID0gdGhpcy50ZXh0YXJlYS52YWx1ZSA9IFwiXCI7XG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSkgeyB0aGlzLmhhc1NlbGVjdGlvbiA9IG51bGw7IH1cbiAgfVxufTtcblxuVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuZ2V0RmllbGQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnRleHRhcmVhIH07XG5cblRleHRhcmVhSW5wdXQucHJvdG90eXBlLnN1cHBvcnRzVG91Y2ggPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZSB9O1xuXG5UZXh0YXJlYUlucHV0LnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY20ub3B0aW9ucy5yZWFkT25seSAhPSBcIm5vY3Vyc29yXCIgJiYgKCFtb2JpbGUgfHwgYWN0aXZlRWx0KCkgIT0gdGhpcy50ZXh0YXJlYSkpIHtcbiAgICB0cnkgeyB0aGlzLnRleHRhcmVhLmZvY3VzKCk7IH1cbiAgICBjYXRjaCAoZSkge30gLy8gSUU4IHdpbGwgdGhyb3cgaWYgdGhlIHRleHRhcmVhIGlzIGRpc3BsYXk6IG5vbmUgb3Igbm90IGluIERPTVxuICB9XG59O1xuXG5UZXh0YXJlYUlucHV0LnByb3RvdHlwZS5ibHVyID0gZnVuY3Rpb24gKCkgeyB0aGlzLnRleHRhcmVhLmJsdXIoKTsgfTtcblxuVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUucmVzZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy53cmFwcGVyLnN0eWxlLnRvcCA9IHRoaXMud3JhcHBlci5zdHlsZS5sZWZ0ID0gMDtcbn07XG5cblRleHRhcmVhSW5wdXQucHJvdG90eXBlLnJlY2VpdmVkRm9jdXMgPSBmdW5jdGlvbiAoKSB7IHRoaXMuc2xvd1BvbGwoKTsgfTtcblxuLy8gUG9sbCBmb3IgaW5wdXQgY2hhbmdlcywgdXNpbmcgdGhlIG5vcm1hbCByYXRlIG9mIHBvbGxpbmcuIFRoaXNcbi8vIHJ1bnMgYXMgbG9uZyBhcyB0aGUgZWRpdG9yIGlzIGZvY3VzZWQuXG5UZXh0YXJlYUlucHV0LnByb3RvdHlwZS5zbG93UG9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBpZiAodGhpcy5wb2xsaW5nRmFzdCkgeyByZXR1cm4gfVxuICB0aGlzLnBvbGxpbmcuc2V0KHRoaXMuY20ub3B0aW9ucy5wb2xsSW50ZXJ2YWwsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzJDEucG9sbCgpO1xuICAgIGlmICh0aGlzJDEuY20uc3RhdGUuZm9jdXNlZCkgeyB0aGlzJDEuc2xvd1BvbGwoKTsgfVxuICB9KTtcbn07XG5cbi8vIFdoZW4gYW4gZXZlbnQgaGFzIGp1c3QgY29tZSBpbiB0aGF0IGlzIGxpa2VseSB0byBhZGQgb3IgY2hhbmdlXG4vLyBzb21ldGhpbmcgaW4gdGhlIGlucHV0IHRleHRhcmVhLCB3ZSBwb2xsIGZhc3RlciwgdG8gZW5zdXJlIHRoYXRcbi8vIHRoZSBjaGFuZ2UgYXBwZWFycyBvbiB0aGUgc2NyZWVuIHF1aWNrbHkuXG5UZXh0YXJlYUlucHV0LnByb3RvdHlwZS5mYXN0UG9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG1pc3NlZCA9IGZhbHNlLCBpbnB1dCA9IHRoaXM7XG4gIGlucHV0LnBvbGxpbmdGYXN0ID0gdHJ1ZTtcbiAgZnVuY3Rpb24gcCgpIHtcbiAgICB2YXIgY2hhbmdlZCA9IGlucHV0LnBvbGwoKTtcbiAgICBpZiAoIWNoYW5nZWQgJiYgIW1pc3NlZCkge21pc3NlZCA9IHRydWU7IGlucHV0LnBvbGxpbmcuc2V0KDYwLCBwKTt9XG4gICAgZWxzZSB7aW5wdXQucG9sbGluZ0Zhc3QgPSBmYWxzZTsgaW5wdXQuc2xvd1BvbGwoKTt9XG4gIH1cbiAgaW5wdXQucG9sbGluZy5zZXQoMjAsIHApO1xufTtcblxuLy8gUmVhZCBpbnB1dCBmcm9tIHRoZSB0ZXh0YXJlYSwgYW5kIHVwZGF0ZSB0aGUgZG9jdW1lbnQgdG8gbWF0Y2guXG4vLyBXaGVuIHNvbWV0aGluZyBpcyBzZWxlY3RlZCwgaXQgaXMgcHJlc2VudCBpbiB0aGUgdGV4dGFyZWEsIGFuZFxuLy8gc2VsZWN0ZWQgKHVubGVzcyBpdCBpcyBodWdlLCBpbiB3aGljaCBjYXNlIGEgcGxhY2Vob2xkZXIgaXNcbi8vIHVzZWQpLiBXaGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIHRoZSBjdXJzb3Igc2l0cyBhZnRlciBwcmV2aW91c2x5XG4vLyBzZWVuIHRleHQgKGNhbiBiZSBlbXB0eSksIHdoaWNoIGlzIHN0b3JlZCBpbiBwcmV2SW5wdXQgKHdlIG11c3Rcbi8vIG5vdCByZXNldCB0aGUgdGV4dGFyZWEgd2hlbiB0eXBpbmcsIGJlY2F1c2UgdGhhdCBicmVha3MgSU1FKS5cblRleHRhcmVhSW5wdXQucHJvdG90eXBlLnBvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIGNtID0gdGhpcy5jbSwgaW5wdXQgPSB0aGlzLnRleHRhcmVhLCBwcmV2SW5wdXQgPSB0aGlzLnByZXZJbnB1dDtcbiAgLy8gU2luY2UgdGhpcyBpcyBjYWxsZWQgYSAqbG90KiwgdHJ5IHRvIGJhaWwgb3V0IGFzIGNoZWFwbHkgYXNcbiAgLy8gcG9zc2libGUgd2hlbiBpdCBpcyBjbGVhciB0aGF0IG5vdGhpbmcgaGFwcGVuZWQuIGhhc1NlbGVjdGlvblxuICAvLyB3aWxsIGJlIHRoZSBjYXNlIHdoZW4gdGhlcmUgaXMgYSBsb3Qgb2YgdGV4dCBpbiB0aGUgdGV4dGFyZWEsXG4gIC8vIGluIHdoaWNoIGNhc2UgcmVhZGluZyBpdHMgdmFsdWUgd291bGQgYmUgZXhwZW5zaXZlLlxuICBpZiAodGhpcy5jb250ZXh0TWVudVBlbmRpbmcgfHwgIWNtLnN0YXRlLmZvY3VzZWQgfHxcbiAgICAgIChoYXNTZWxlY3Rpb24oaW5wdXQpICYmICFwcmV2SW5wdXQgJiYgIXRoaXMuY29tcG9zaW5nKSB8fFxuICAgICAgY20uaXNSZWFkT25seSgpIHx8IGNtLm9wdGlvbnMuZGlzYWJsZUlucHV0IHx8IGNtLnN0YXRlLmtleVNlcSlcbiAgICB7IHJldHVybiBmYWxzZSB9XG5cbiAgdmFyIHRleHQgPSBpbnB1dC52YWx1ZTtcbiAgLy8gSWYgbm90aGluZyBjaGFuZ2VkLCBiYWlsLlxuICBpZiAodGV4dCA9PSBwcmV2SW5wdXQgJiYgIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgLy8gV29yayBhcm91bmQgbm9uc2Vuc2ljYWwgc2VsZWN0aW9uIHJlc2V0dGluZyBpbiBJRTkvMTAsIGFuZFxuICAvLyBpbmV4cGxpY2FibGUgYXBwZWFyYW5jZSBvZiBwcml2YXRlIGFyZWEgdW5pY29kZSBjaGFyYWN0ZXJzIG9uXG4gIC8vIHNvbWUga2V5IGNvbWJvcyBpbiBNYWMgKCMyNjg5KS5cbiAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSAmJiB0aGlzLmhhc1NlbGVjdGlvbiA9PT0gdGV4dCB8fFxuICAgICAgbWFjICYmIC9bXFx1ZjcwMC1cXHVmN2ZmXS8udGVzdCh0ZXh0KSkge1xuICAgIGNtLmRpc3BsYXkuaW5wdXQucmVzZXQoKTtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChjbS5kb2Muc2VsID09IGNtLmRpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnUpIHtcbiAgICB2YXIgZmlyc3QgPSB0ZXh0LmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKGZpcnN0ID09IDB4MjAwYiAmJiAhcHJldklucHV0KSB7IHByZXZJbnB1dCA9IFwiXFx1MjAwYlwiOyB9XG4gICAgaWYgKGZpcnN0ID09IDB4MjFkYSkgeyB0aGlzLnJlc2V0KCk7IHJldHVybiB0aGlzLmNtLmV4ZWNDb21tYW5kKFwidW5kb1wiKSB9XG4gIH1cbiAgLy8gRmluZCB0aGUgcGFydCBvZiB0aGUgaW5wdXQgdGhhdCBpcyBhY3R1YWxseSBuZXdcbiAgdmFyIHNhbWUgPSAwLCBsID0gTWF0aC5taW4ocHJldklucHV0Lmxlbmd0aCwgdGV4dC5sZW5ndGgpO1xuICB3aGlsZSAoc2FtZSA8IGwgJiYgcHJldklucHV0LmNoYXJDb2RlQXQoc2FtZSkgPT0gdGV4dC5jaGFyQ29kZUF0KHNhbWUpKSB7ICsrc2FtZTsgfVxuXG4gIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICBhcHBseVRleHRJbnB1dChjbSwgdGV4dC5zbGljZShzYW1lKSwgcHJldklucHV0Lmxlbmd0aCAtIHNhbWUsXG4gICAgICAgICAgICAgICAgICAgbnVsbCwgdGhpcyQxLmNvbXBvc2luZyA/IFwiKmNvbXBvc2VcIiA6IG51bGwpO1xuXG4gICAgLy8gRG9uJ3QgbGVhdmUgbG9uZyB0ZXh0IGluIHRoZSB0ZXh0YXJlYSwgc2luY2UgaXQgbWFrZXMgZnVydGhlciBwb2xsaW5nIHNsb3dcbiAgICBpZiAodGV4dC5sZW5ndGggPiAxMDAwIHx8IHRleHQuaW5kZXhPZihcIlxcblwiKSA+IC0xKSB7IGlucHV0LnZhbHVlID0gdGhpcyQxLnByZXZJbnB1dCA9IFwiXCI7IH1cbiAgICBlbHNlIHsgdGhpcyQxLnByZXZJbnB1dCA9IHRleHQ7IH1cblxuICAgIGlmICh0aGlzJDEuY29tcG9zaW5nKSB7XG4gICAgICB0aGlzJDEuY29tcG9zaW5nLnJhbmdlLmNsZWFyKCk7XG4gICAgICB0aGlzJDEuY29tcG9zaW5nLnJhbmdlID0gY20ubWFya1RleHQodGhpcyQxLmNvbXBvc2luZy5zdGFydCwgY20uZ2V0Q3Vyc29yKFwidG9cIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiQ29kZU1pcnJvci1jb21wb3NpbmdcIn0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0cnVlXG59O1xuXG5UZXh0YXJlYUlucHV0LnByb3RvdHlwZS5lbnN1cmVQb2xsZWQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnBvbGxpbmdGYXN0ICYmIHRoaXMucG9sbCgpKSB7IHRoaXMucG9sbGluZ0Zhc3QgPSBmYWxzZTsgfVxufTtcblxuVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUub25LZXlQcmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSkgeyB0aGlzLmhhc1NlbGVjdGlvbiA9IG51bGw7IH1cbiAgdGhpcy5mYXN0UG9sbCgpO1xufTtcblxuVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUub25Db250ZXh0TWVudSA9IGZ1bmN0aW9uIChlKSB7XG4gIHZhciBpbnB1dCA9IHRoaXMsIGNtID0gaW5wdXQuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCB0ZSA9IGlucHV0LnRleHRhcmVhO1xuICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlKSwgc2Nyb2xsUG9zID0gZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3A7XG4gIGlmICghcG9zIHx8IHByZXN0bykgeyByZXR1cm4gfSAvLyBPcGVyYSBpcyBkaWZmaWN1bHQuXG5cbiAgLy8gUmVzZXQgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gb25seSBpZiB0aGUgY2xpY2sgaXMgZG9uZSBvdXRzaWRlIG9mIHRoZSBzZWxlY3Rpb25cbiAgLy8gYW5kICdyZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnUnIG9wdGlvbiBpcyB0cnVlLlxuICB2YXIgcmVzZXQgPSBjbS5vcHRpb25zLnJlc2V0U2VsZWN0aW9uT25Db250ZXh0TWVudTtcbiAgaWYgKHJlc2V0ICYmIGNtLmRvYy5zZWwuY29udGFpbnMocG9zKSA9PSAtMSlcbiAgICB7IG9wZXJhdGlvbihjbSwgc2V0U2VsZWN0aW9uKShjbS5kb2MsIHNpbXBsZVNlbGVjdGlvbihwb3MpLCBzZWxfZG9udFNjcm9sbCk7IH1cblxuICB2YXIgb2xkQ1NTID0gdGUuc3R5bGUuY3NzVGV4dCwgb2xkV3JhcHBlckNTUyA9IGlucHV0LndyYXBwZXIuc3R5bGUuY3NzVGV4dDtcbiAgaW5wdXQud3JhcHBlci5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogYWJzb2x1dGVcIjtcbiAgdmFyIHdyYXBwZXJCb3ggPSBpbnB1dC53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB0ZS5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAzMHB4OyBoZWlnaHQ6IDMwcHg7XFxuICAgICAgdG9wOiBcIiArIChlLmNsaWVudFkgLSB3cmFwcGVyQm94LnRvcCAtIDUpICsgXCJweDsgbGVmdDogXCIgKyAoZS5jbGllbnRYIC0gd3JhcHBlckJveC5sZWZ0IC0gNSkgKyBcInB4O1xcbiAgICAgIHotaW5kZXg6IDEwMDA7IGJhY2tncm91bmQ6IFwiICsgKGllID8gXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIC4wNSlcIiA6IFwidHJhbnNwYXJlbnRcIikgKyBcIjtcXG4gICAgICBvdXRsaW5lOiBub25lOyBib3JkZXItd2lkdGg6IDA7IG91dGxpbmU6IG5vbmU7IG92ZXJmbG93OiBoaWRkZW47IG9wYWNpdHk6IC4wNTsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUpO1wiO1xuICB2YXIgb2xkU2Nyb2xsWTtcbiAgaWYgKHdlYmtpdCkgeyBvbGRTY3JvbGxZID0gd2luZG93LnNjcm9sbFk7IH0gLy8gV29yayBhcm91bmQgQ2hyb21lIGlzc3VlICgjMjcxMilcbiAgZGlzcGxheS5pbnB1dC5mb2N1cygpO1xuICBpZiAod2Via2l0KSB7IHdpbmRvdy5zY3JvbGxUbyhudWxsLCBvbGRTY3JvbGxZKTsgfVxuICBkaXNwbGF5LmlucHV0LnJlc2V0KCk7XG4gIC8vIEFkZHMgXCJTZWxlY3QgYWxsXCIgdG8gY29udGV4dCBtZW51IGluIEZGXG4gIGlmICghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgeyB0ZS52YWx1ZSA9IGlucHV0LnByZXZJbnB1dCA9IFwiIFwiOyB9XG4gIGlucHV0LmNvbnRleHRNZW51UGVuZGluZyA9IHRydWU7XG4gIGRpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnUgPSBjbS5kb2Muc2VsO1xuICBjbGVhclRpbWVvdXQoZGlzcGxheS5kZXRlY3RpbmdTZWxlY3RBbGwpO1xuXG4gIC8vIFNlbGVjdC1hbGwgd2lsbCBiZSBncmV5ZWQgb3V0IGlmIHRoZXJlJ3Mgbm90aGluZyB0byBzZWxlY3QsIHNvXG4gIC8vIHRoaXMgYWRkcyBhIHplcm8td2lkdGggc3BhY2Ugc28gdGhhdCB3ZSBjYW4gbGF0ZXIgY2hlY2sgd2hldGhlclxuICAvLyBpdCBnb3Qgc2VsZWN0ZWQuXG4gIGZ1bmN0aW9uIHByZXBhcmVTZWxlY3RBbGxIYWNrKCkge1xuICAgIGlmICh0ZS5zZWxlY3Rpb25TdGFydCAhPSBudWxsKSB7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSBjbS5zb21ldGhpbmdTZWxlY3RlZCgpO1xuICAgICAgdmFyIGV4dHZhbCA9IFwiXFx1MjAwYlwiICsgKHNlbGVjdGVkID8gdGUudmFsdWUgOiBcIlwiKTtcbiAgICAgIHRlLnZhbHVlID0gXCJcXHUyMWRhXCI7IC8vIFVzZWQgdG8gY2F0Y2ggY29udGV4dC1tZW51IHVuZG9cbiAgICAgIHRlLnZhbHVlID0gZXh0dmFsO1xuICAgICAgaW5wdXQucHJldklucHV0ID0gc2VsZWN0ZWQgPyBcIlwiIDogXCJcXHUyMDBiXCI7XG4gICAgICB0ZS5zZWxlY3Rpb25TdGFydCA9IDE7IHRlLnNlbGVjdGlvbkVuZCA9IGV4dHZhbC5sZW5ndGg7XG4gICAgICAvLyBSZS1zZXQgdGhpcywgaW4gY2FzZSBzb21lIG90aGVyIGhhbmRsZXIgdG91Y2hlZCB0aGVcbiAgICAgIC8vIHNlbGVjdGlvbiBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICBkaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gY20uZG9jLnNlbDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcmVoaWRlKCkge1xuICAgIGlucHV0LmNvbnRleHRNZW51UGVuZGluZyA9IGZhbHNlO1xuICAgIGlucHV0LndyYXBwZXIuc3R5bGUuY3NzVGV4dCA9IG9sZFdyYXBwZXJDU1M7XG4gICAgdGUuc3R5bGUuY3NzVGV4dCA9IG9sZENTUztcbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIHsgZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbFRvcChkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCA9IHNjcm9sbFBvcyk7IH1cblxuICAgIC8vIFRyeSB0byBkZXRlY3QgdGhlIHVzZXIgY2hvb3Npbmcgc2VsZWN0LWFsbFxuICAgIGlmICh0ZS5zZWxlY3Rpb25TdGFydCAhPSBudWxsKSB7XG4gICAgICBpZiAoIWllIHx8IChpZSAmJiBpZV92ZXJzaW9uIDwgOSkpIHsgcHJlcGFyZVNlbGVjdEFsbEhhY2soKTsgfVxuICAgICAgdmFyIGkgPSAwLCBwb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudSA9PSBjbS5kb2Muc2VsICYmIHRlLnNlbGVjdGlvblN0YXJ0ID09IDAgJiZcbiAgICAgICAgICAgIHRlLnNlbGVjdGlvbkVuZCA+IDAgJiYgaW5wdXQucHJldklucHV0ID09IFwiXFx1MjAwYlwiKSB7XG4gICAgICAgICAgb3BlcmF0aW9uKGNtLCBzZWxlY3RBbGwpKGNtKTtcbiAgICAgICAgfSBlbHNlIGlmIChpKysgPCAxMCkge1xuICAgICAgICAgIGRpc3BsYXkuZGV0ZWN0aW5nU2VsZWN0QWxsID0gc2V0VGltZW91dChwb2xsLCA1MDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnUgPSBudWxsO1xuICAgICAgICAgIGRpc3BsYXkuaW5wdXQucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGRpc3BsYXkuZGV0ZWN0aW5nU2VsZWN0QWxsID0gc2V0VGltZW91dChwb2xsLCAyMDApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkpIHsgcHJlcGFyZVNlbGVjdEFsbEhhY2soKTsgfVxuICBpZiAoY2FwdHVyZVJpZ2h0Q2xpY2spIHtcbiAgICBlX3N0b3AoZSk7XG4gICAgdmFyIG1vdXNldXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBvZmYod2luZG93LCBcIm1vdXNldXBcIiwgbW91c2V1cCk7XG4gICAgICBzZXRUaW1lb3V0KHJlaGlkZSwgMjApO1xuICAgIH07XG4gICAgb24od2luZG93LCBcIm1vdXNldXBcIiwgbW91c2V1cCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGltZW91dChyZWhpZGUsIDUwKTtcbiAgfVxufTtcblxuVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUucmVhZE9ubHlDaGFuZ2VkID0gZnVuY3Rpb24gKHZhbCkge1xuICBpZiAoIXZhbCkgeyB0aGlzLnJlc2V0KCk7IH1cbiAgdGhpcy50ZXh0YXJlYS5kaXNhYmxlZCA9IHZhbCA9PSBcIm5vY3Vyc29yXCI7XG59O1xuXG5UZXh0YXJlYUlucHV0LnByb3RvdHlwZS5zZXRVbmVkaXRhYmxlID0gZnVuY3Rpb24gKCkge307XG5cblRleHRhcmVhSW5wdXQucHJvdG90eXBlLm5lZWRzQ29udGVudEF0dHJpYnV0ZSA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmcm9tVGV4dEFyZWEodGV4dGFyZWEsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgPyBjb3B5T2JqKG9wdGlvbnMpIDoge307XG4gIG9wdGlvbnMudmFsdWUgPSB0ZXh0YXJlYS52YWx1ZTtcbiAgaWYgKCFvcHRpb25zLnRhYmluZGV4ICYmIHRleHRhcmVhLnRhYkluZGV4KVxuICAgIHsgb3B0aW9ucy50YWJpbmRleCA9IHRleHRhcmVhLnRhYkluZGV4OyB9XG4gIGlmICghb3B0aW9ucy5wbGFjZWhvbGRlciAmJiB0ZXh0YXJlYS5wbGFjZWhvbGRlcilcbiAgICB7IG9wdGlvbnMucGxhY2Vob2xkZXIgPSB0ZXh0YXJlYS5wbGFjZWhvbGRlcjsgfVxuICAvLyBTZXQgYXV0b2ZvY3VzIHRvIHRydWUgaWYgdGhpcyB0ZXh0YXJlYSBpcyBmb2N1c2VkLCBvciBpZiBpdCBoYXNcbiAgLy8gYXV0b2ZvY3VzIGFuZCBubyBvdGhlciBlbGVtZW50IGlzIGZvY3VzZWQuXG4gIGlmIChvcHRpb25zLmF1dG9mb2N1cyA9PSBudWxsKSB7XG4gICAgdmFyIGhhc0ZvY3VzID0gYWN0aXZlRWx0KCk7XG4gICAgb3B0aW9ucy5hdXRvZm9jdXMgPSBoYXNGb2N1cyA9PSB0ZXh0YXJlYSB8fFxuICAgICAgdGV4dGFyZWEuZ2V0QXR0cmlidXRlKFwiYXV0b2ZvY3VzXCIpICE9IG51bGwgJiYgaGFzRm9jdXMgPT0gZG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmUoKSB7dGV4dGFyZWEudmFsdWUgPSBjbS5nZXRWYWx1ZSgpO31cblxuICB2YXIgcmVhbFN1Ym1pdDtcbiAgaWYgKHRleHRhcmVhLmZvcm0pIHtcbiAgICBvbih0ZXh0YXJlYS5mb3JtLCBcInN1Ym1pdFwiLCBzYXZlKTtcbiAgICAvLyBEZXBsb3JhYmxlIGhhY2sgdG8gbWFrZSB0aGUgc3VibWl0IG1ldGhvZCBkbyB0aGUgcmlnaHQgdGhpbmcuXG4gICAgaWYgKCFvcHRpb25zLmxlYXZlU3VibWl0TWV0aG9kQWxvbmUpIHtcbiAgICAgIHZhciBmb3JtID0gdGV4dGFyZWEuZm9ybTtcbiAgICAgIHJlYWxTdWJtaXQgPSBmb3JtLnN1Ym1pdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB3cmFwcGVkU3VibWl0ID0gZm9ybS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2F2ZSgpO1xuICAgICAgICAgIGZvcm0uc3VibWl0ID0gcmVhbFN1Ym1pdDtcbiAgICAgICAgICBmb3JtLnN1Ym1pdCgpO1xuICAgICAgICAgIGZvcm0uc3VibWl0ID0gd3JhcHBlZFN1Ym1pdDtcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2goZSkge31cbiAgICB9XG4gIH1cblxuICBvcHRpb25zLmZpbmlzaEluaXQgPSBmdW5jdGlvbiAoY20pIHtcbiAgICBjbS5zYXZlID0gc2F2ZTtcbiAgICBjbS5nZXRUZXh0QXJlYSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRleHRhcmVhOyB9O1xuICAgIGNtLnRvVGV4dEFyZWEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjbS50b1RleHRBcmVhID0gaXNOYU47IC8vIFByZXZlbnQgdGhpcyBmcm9tIGJlaW5nIHJhbiB0d2ljZVxuICAgICAgc2F2ZSgpO1xuICAgICAgdGV4dGFyZWEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbS5nZXRXcmFwcGVyRWxlbWVudCgpKTtcbiAgICAgIHRleHRhcmVhLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgaWYgKHRleHRhcmVhLmZvcm0pIHtcbiAgICAgICAgb2ZmKHRleHRhcmVhLmZvcm0sIFwic3VibWl0XCIsIHNhdmUpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRhcmVhLmZvcm0uc3VibWl0ID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICB7IHRleHRhcmVhLmZvcm0uc3VibWl0ID0gcmVhbFN1Ym1pdDsgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgdGV4dGFyZWEuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICB2YXIgY20gPSBDb2RlTWlycm9yJDEoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHRleHRhcmVhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHRleHRhcmVhLm5leHRTaWJsaW5nKTsgfSxcbiAgICBvcHRpb25zKTtcbiAgcmV0dXJuIGNtXG59XG5cbmZ1bmN0aW9uIGFkZExlZ2FjeVByb3BzKENvZGVNaXJyb3IpIHtcbiAgQ29kZU1pcnJvci5vZmYgPSBvZmY7XG4gIENvZGVNaXJyb3Iub24gPSBvbjtcbiAgQ29kZU1pcnJvci53aGVlbEV2ZW50UGl4ZWxzID0gd2hlZWxFdmVudFBpeGVscztcbiAgQ29kZU1pcnJvci5Eb2MgPSBEb2M7XG4gIENvZGVNaXJyb3Iuc3BsaXRMaW5lcyA9IHNwbGl0TGluZXNBdXRvO1xuICBDb2RlTWlycm9yLmNvdW50Q29sdW1uID0gY291bnRDb2x1bW47XG4gIENvZGVNaXJyb3IuZmluZENvbHVtbiA9IGZpbmRDb2x1bW47XG4gIENvZGVNaXJyb3IuaXNXb3JkQ2hhciA9IGlzV29yZENoYXJCYXNpYztcbiAgQ29kZU1pcnJvci5QYXNzID0gUGFzcztcbiAgQ29kZU1pcnJvci5zaWduYWwgPSBzaWduYWw7XG4gIENvZGVNaXJyb3IuTGluZSA9IExpbmU7XG4gIENvZGVNaXJyb3IuY2hhbmdlRW5kID0gY2hhbmdlRW5kO1xuICBDb2RlTWlycm9yLnNjcm9sbGJhck1vZGVsID0gc2Nyb2xsYmFyTW9kZWw7XG4gIENvZGVNaXJyb3IuUG9zID0gUG9zO1xuICBDb2RlTWlycm9yLmNtcFBvcyA9IGNtcDtcbiAgQ29kZU1pcnJvci5tb2RlcyA9IG1vZGVzO1xuICBDb2RlTWlycm9yLm1pbWVNb2RlcyA9IG1pbWVNb2RlcztcbiAgQ29kZU1pcnJvci5yZXNvbHZlTW9kZSA9IHJlc29sdmVNb2RlO1xuICBDb2RlTWlycm9yLmdldE1vZGUgPSBnZXRNb2RlO1xuICBDb2RlTWlycm9yLm1vZGVFeHRlbnNpb25zID0gbW9kZUV4dGVuc2lvbnM7XG4gIENvZGVNaXJyb3IuZXh0ZW5kTW9kZSA9IGV4dGVuZE1vZGU7XG4gIENvZGVNaXJyb3IuY29weVN0YXRlID0gY29weVN0YXRlO1xuICBDb2RlTWlycm9yLnN0YXJ0U3RhdGUgPSBzdGFydFN0YXRlO1xuICBDb2RlTWlycm9yLmlubmVyTW9kZSA9IGlubmVyTW9kZTtcbiAgQ29kZU1pcnJvci5jb21tYW5kcyA9IGNvbW1hbmRzO1xuICBDb2RlTWlycm9yLmtleU1hcCA9IGtleU1hcDtcbiAgQ29kZU1pcnJvci5rZXlOYW1lID0ga2V5TmFtZTtcbiAgQ29kZU1pcnJvci5pc01vZGlmaWVyS2V5ID0gaXNNb2RpZmllcktleTtcbiAgQ29kZU1pcnJvci5sb29rdXBLZXkgPSBsb29rdXBLZXk7XG4gIENvZGVNaXJyb3Iubm9ybWFsaXplS2V5TWFwID0gbm9ybWFsaXplS2V5TWFwO1xuICBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbSA9IFN0cmluZ1N0cmVhbTtcbiAgQ29kZU1pcnJvci5TaGFyZWRUZXh0TWFya2VyID0gU2hhcmVkVGV4dE1hcmtlcjtcbiAgQ29kZU1pcnJvci5UZXh0TWFya2VyID0gVGV4dE1hcmtlcjtcbiAgQ29kZU1pcnJvci5MaW5lV2lkZ2V0ID0gTGluZVdpZGdldDtcbiAgQ29kZU1pcnJvci5lX3ByZXZlbnREZWZhdWx0ID0gZV9wcmV2ZW50RGVmYXVsdDtcbiAgQ29kZU1pcnJvci5lX3N0b3BQcm9wYWdhdGlvbiA9IGVfc3RvcFByb3BhZ2F0aW9uO1xuICBDb2RlTWlycm9yLmVfc3RvcCA9IGVfc3RvcDtcbiAgQ29kZU1pcnJvci5hZGRDbGFzcyA9IGFkZENsYXNzO1xuICBDb2RlTWlycm9yLmNvbnRhaW5zID0gY29udGFpbnM7XG4gIENvZGVNaXJyb3Iucm1DbGFzcyA9IHJtQ2xhc3M7XG4gIENvZGVNaXJyb3Iua2V5TmFtZXMgPSBrZXlOYW1lcztcbn1cblxuLy8gRURJVE9SIENPTlNUUlVDVE9SXG5cbmRlZmluZU9wdGlvbnMoQ29kZU1pcnJvciQxKTtcblxuYWRkRWRpdG9yTWV0aG9kcyhDb2RlTWlycm9yJDEpO1xuXG4vLyBTZXQgdXAgbWV0aG9kcyBvbiBDb2RlTWlycm9yJ3MgcHJvdG90eXBlIHRvIHJlZGlyZWN0IHRvIHRoZSBlZGl0b3IncyBkb2N1bWVudC5cbnZhciBkb250RGVsZWdhdGUgPSBcIml0ZXIgaW5zZXJ0IHJlbW92ZSBjb3B5IGdldEVkaXRvciBjb25zdHJ1Y3RvclwiLnNwbGl0KFwiIFwiKTtcbmZvciAodmFyIHByb3AgaW4gRG9jLnByb3RvdHlwZSkgeyBpZiAoRG9jLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBpbmRleE9mKGRvbnREZWxlZ2F0ZSwgcHJvcCkgPCAwKVxuICB7IENvZGVNaXJyb3IkMS5wcm90b3R5cGVbcHJvcF0gPSAoZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge3JldHVybiBtZXRob2QuYXBwbHkodGhpcy5kb2MsIGFyZ3VtZW50cyl9XG4gIH0pKERvYy5wcm90b3R5cGVbcHJvcF0pOyB9IH1cblxuZXZlbnRNaXhpbihEb2MpO1xuXG4vLyBJTlBVVCBIQU5ETElOR1xuXG5Db2RlTWlycm9yJDEuaW5wdXRTdHlsZXMgPSB7XCJ0ZXh0YXJlYVwiOiBUZXh0YXJlYUlucHV0LCBcImNvbnRlbnRlZGl0YWJsZVwiOiBDb250ZW50RWRpdGFibGVJbnB1dH07XG5cbi8vIE1PREUgREVGSU5JVElPTiBBTkQgUVVFUllJTkdcblxuLy8gRXh0cmEgYXJndW1lbnRzIGFyZSBzdG9yZWQgYXMgdGhlIG1vZGUncyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzXG4vLyB1c2VkIGJ5IChsZWdhY3kpIG1lY2hhbmlzbXMgbGlrZSBsb2FkbW9kZS5qcyB0byBhdXRvbWF0aWNhbGx5XG4vLyBsb2FkIGEgbW9kZS4gKFByZWZlcnJlZCBtZWNoYW5pc20gaXMgdGhlIHJlcXVpcmUvZGVmaW5lIGNhbGxzLilcbkNvZGVNaXJyb3IkMS5kZWZpbmVNb2RlID0gZnVuY3Rpb24obmFtZS8qLCBtb2RlLCDigKYqLykge1xuICBpZiAoIUNvZGVNaXJyb3IkMS5kZWZhdWx0cy5tb2RlICYmIG5hbWUgIT0gXCJudWxsXCIpIHsgQ29kZU1pcnJvciQxLmRlZmF1bHRzLm1vZGUgPSBuYW1lOyB9XG4gIGRlZmluZU1vZGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbkNvZGVNaXJyb3IkMS5kZWZpbmVNSU1FID0gZGVmaW5lTUlNRTtcblxuLy8gTWluaW1hbCBkZWZhdWx0IG1vZGUuXG5Db2RlTWlycm9yJDEuZGVmaW5lTW9kZShcIm51bGxcIiwgZnVuY3Rpb24gKCkgeyByZXR1cm4gKHt0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSkgeyByZXR1cm4gc3RyZWFtLnNraXBUb0VuZCgpOyB9fSk7IH0pO1xuQ29kZU1pcnJvciQxLmRlZmluZU1JTUUoXCJ0ZXh0L3BsYWluXCIsIFwibnVsbFwiKTtcblxuLy8gRVhURU5TSU9OU1xuXG5Db2RlTWlycm9yJDEuZGVmaW5lRXh0ZW5zaW9uID0gZnVuY3Rpb24gKG5hbWUsIGZ1bmMpIHtcbiAgQ29kZU1pcnJvciQxLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmM7XG59O1xuQ29kZU1pcnJvciQxLmRlZmluZURvY0V4dGVuc2lvbiA9IGZ1bmN0aW9uIChuYW1lLCBmdW5jKSB7XG4gIERvYy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jO1xufTtcblxuQ29kZU1pcnJvciQxLmZyb21UZXh0QXJlYSA9IGZyb21UZXh0QXJlYTtcblxuYWRkTGVnYWN5UHJvcHMoQ29kZU1pcnJvciQxKTtcblxuQ29kZU1pcnJvciQxLnZlcnNpb24gPSBcIjUuMzYuMFwiO1xuXG5yZXR1cm4gQ29kZU1pcnJvciQxO1xuXG59KSkpO1xuIiwiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRVxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCIpKTtcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgLy8gQU1EXG4gICAgZGVmaW5lKFtcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTW9kZShcImphdmFzY3JpcHRcIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHtcbiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDtcbiAgdmFyIHN0YXRlbWVudEluZGVudCA9IHBhcnNlckNvbmZpZy5zdGF0ZW1lbnRJbmRlbnQ7XG4gIHZhciBqc29ubGRNb2RlID0gcGFyc2VyQ29uZmlnLmpzb25sZDtcbiAgdmFyIGpzb25Nb2RlID0gcGFyc2VyQ29uZmlnLmpzb24gfHwganNvbmxkTW9kZTtcbiAgdmFyIGlzVFMgPSBwYXJzZXJDb25maWcudHlwZXNjcmlwdDtcbiAgdmFyIHdvcmRSRSA9IHBhcnNlckNvbmZpZy53b3JkQ2hhcmFjdGVycyB8fCAvW1xcdyRcXHhhMS1cXHVmZmZmXS87XG5cbiAgLy8gVG9rZW5pemVyXG5cbiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24oKXtcbiAgICBmdW5jdGlvbiBrdyh0eXBlKSB7cmV0dXJuIHt0eXBlOiB0eXBlLCBzdHlsZTogXCJrZXl3b3JkXCJ9O31cbiAgICB2YXIgQSA9IGt3KFwia2V5d29yZCBhXCIpLCBCID0ga3coXCJrZXl3b3JkIGJcIiksIEMgPSBrdyhcImtleXdvcmQgY1wiKSwgRCA9IGt3KFwia2V5d29yZCBkXCIpO1xuICAgIHZhciBvcGVyYXRvciA9IGt3KFwib3BlcmF0b3JcIiksIGF0b20gPSB7dHlwZTogXCJhdG9tXCIsIHN0eWxlOiBcImF0b21cIn07XG5cbiAgICByZXR1cm4ge1xuICAgICAgXCJpZlwiOiBrdyhcImlmXCIpLCBcIndoaWxlXCI6IEEsIFwid2l0aFwiOiBBLCBcImVsc2VcIjogQiwgXCJkb1wiOiBCLCBcInRyeVwiOiBCLCBcImZpbmFsbHlcIjogQixcbiAgICAgIFwicmV0dXJuXCI6IEQsIFwiYnJlYWtcIjogRCwgXCJjb250aW51ZVwiOiBELCBcIm5ld1wiOiBrdyhcIm5ld1wiKSwgXCJkZWxldGVcIjogQywgXCJ2b2lkXCI6IEMsIFwidGhyb3dcIjogQyxcbiAgICAgIFwiZGVidWdnZXJcIjoga3coXCJkZWJ1Z2dlclwiKSwgXCJ2YXJcIjoga3coXCJ2YXJcIiksIFwiY29uc3RcIjoga3coXCJ2YXJcIiksIFwibGV0XCI6IGt3KFwidmFyXCIpLFxuICAgICAgXCJmdW5jdGlvblwiOiBrdyhcImZ1bmN0aW9uXCIpLCBcImNhdGNoXCI6IGt3KFwiY2F0Y2hcIiksXG4gICAgICBcImZvclwiOiBrdyhcImZvclwiKSwgXCJzd2l0Y2hcIjoga3coXCJzd2l0Y2hcIiksIFwiY2FzZVwiOiBrdyhcImNhc2VcIiksIFwiZGVmYXVsdFwiOiBrdyhcImRlZmF1bHRcIiksXG4gICAgICBcImluXCI6IG9wZXJhdG9yLCBcInR5cGVvZlwiOiBvcGVyYXRvciwgXCJpbnN0YW5jZW9mXCI6IG9wZXJhdG9yLFxuICAgICAgXCJ0cnVlXCI6IGF0b20sIFwiZmFsc2VcIjogYXRvbSwgXCJudWxsXCI6IGF0b20sIFwidW5kZWZpbmVkXCI6IGF0b20sIFwiTmFOXCI6IGF0b20sIFwiSW5maW5pdHlcIjogYXRvbSxcbiAgICAgIFwidGhpc1wiOiBrdyhcInRoaXNcIiksIFwiY2xhc3NcIjoga3coXCJjbGFzc1wiKSwgXCJzdXBlclwiOiBrdyhcImF0b21cIiksXG4gICAgICBcInlpZWxkXCI6IEMsIFwiZXhwb3J0XCI6IGt3KFwiZXhwb3J0XCIpLCBcImltcG9ydFwiOiBrdyhcImltcG9ydFwiKSwgXCJleHRlbmRzXCI6IEMsXG4gICAgICBcImF3YWl0XCI6IENcbiAgICB9O1xuICB9KCk7XG5cbiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXFwtKiYlPTw+IT98fl5AXS87XG4gIHZhciBpc0pzb25sZEtleXdvcmQgPSAvXkAoY29udGV4dHxpZHx2YWx1ZXxsYW5ndWFnZXx0eXBlfGNvbnRhaW5lcnxsaXN0fHNldHxyZXZlcnNlfGluZGV4fGJhc2V8dm9jYWJ8Z3JhcGgpXCIvO1xuXG4gIGZ1bmN0aW9uIHJlYWRSZWdleHAoc3RyZWFtKSB7XG4gICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgaW5TZXQgPSBmYWxzZTtcbiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7XG4gICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgaWYgKG5leHQgPT0gXCIvXCIgJiYgIWluU2V0KSByZXR1cm47XG4gICAgICAgIGlmIChuZXh0ID09IFwiW1wiKSBpblNldCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGluU2V0ICYmIG5leHQgPT0gXCJdXCIpIGluU2V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSBcIlxcXFxcIjtcbiAgICB9XG4gIH1cblxuICAvLyBVc2VkIGFzIHNjcmF0Y2ggdmFyaWFibGVzIHRvIGNvbW11bmljYXRlIG11bHRpcGxlIHZhbHVlcyB3aXRob3V0XG4gIC8vIGNvbnNpbmcgdXAgdG9ucyBvZiBvYmplY3RzLlxuICB2YXIgdHlwZSwgY29udGVudDtcbiAgZnVuY3Rpb24gcmV0KHRwLCBzdHlsZSwgY29udCkge1xuICAgIHR5cGUgPSB0cDsgY29udGVudCA9IGNvbnQ7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG4gIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcbiAgICBpZiAoY2ggPT0gJ1wiJyB8fCBjaCA9PSBcIidcIikge1xuICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7XG4gICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIi5cIiAmJiBzdHJlYW0ubWF0Y2goL15cXGQrKD86W2VFXVsrXFwtXT9cXGQrKT8vKSkge1xuICAgICAgcmV0dXJuIHJldChcIm51bWJlclwiLCBcIm51bWJlclwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiLlwiICYmIHN0cmVhbS5tYXRjaChcIi4uXCIpKSB7XG4gICAgICByZXR1cm4gcmV0KFwic3ByZWFkXCIsIFwibWV0YVwiKTtcbiAgICB9IGVsc2UgaWYgKC9bXFxbXFxde31cXChcXCksO1xcOlxcLl0vLnRlc3QoY2gpKSB7XG4gICAgICByZXR1cm4gcmV0KGNoKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiPVwiICYmIHN0cmVhbS5lYXQoXCI+XCIpKSB7XG4gICAgICByZXR1cm4gcmV0KFwiPT5cIiwgXCJvcGVyYXRvclwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiMFwiICYmIHN0cmVhbS5lYXQoL3gvaSkpIHtcbiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcZGEtZl0vaSk7XG4gICAgICByZXR1cm4gcmV0KFwibnVtYmVyXCIsIFwibnVtYmVyXCIpO1xuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIwXCIgJiYgc3RyZWFtLmVhdCgvby9pKSkge1xuICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bMC03XS9pKTtcbiAgICAgIHJldHVybiByZXQoXCJudW1iZXJcIiwgXCJudW1iZXJcIik7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIjBcIiAmJiBzdHJlYW0uZWF0KC9iL2kpKSB7XG4gICAgICBzdHJlYW0uZWF0V2hpbGUoL1swMV0vaSk7XG4gICAgICByZXR1cm4gcmV0KFwibnVtYmVyXCIsIFwibnVtYmVyXCIpO1xuICAgIH0gZWxzZSBpZiAoL1xcZC8udGVzdChjaCkpIHtcbiAgICAgIHN0cmVhbS5tYXRjaCgvXlxcZCooPzpcXC5cXGQqKT8oPzpbZUVdWytcXC1dP1xcZCspPy8pO1xuICAgICAgcmV0dXJuIHJldChcIm51bWJlclwiLCBcIm51bWJlclwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiL1wiKSB7XG4gICAgICBpZiAoc3RyZWFtLmVhdChcIipcIikpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7XG4gICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoXCIvXCIpKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuIHJldChcImNvbW1lbnRcIiwgXCJjb21tZW50XCIpO1xuICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uQWxsb3dlZChzdHJlYW0sIHN0YXRlLCAxKSkge1xuICAgICAgICByZWFkUmVnZXhwKHN0cmVhbSk7XG4gICAgICAgIHN0cmVhbS5tYXRjaCgvXlxcYigoW2dpbXl1XSkoPyFbZ2lteXVdKlxcMikpK1xcYi8pO1xuICAgICAgICByZXR1cm4gcmV0KFwicmVnZXhwXCIsIFwic3RyaW5nLTJcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHJlYW0uZWF0KFwiPVwiKTtcbiAgICAgICAgcmV0dXJuIHJldChcIm9wZXJhdG9yXCIsIFwib3BlcmF0b3JcIiwgc3RyZWFtLmN1cnJlbnQoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcImBcIikge1xuICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblF1YXNpO1xuICAgICAgcmV0dXJuIHRva2VuUXVhc2koc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIiNcIikge1xuICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgcmV0dXJuIHJldChcImVycm9yXCIsIFwiZXJyb3JcIik7XG4gICAgfSBlbHNlIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkge1xuICAgICAgaWYgKGNoICE9IFwiPlwiIHx8ICFzdGF0ZS5sZXhpY2FsIHx8IHN0YXRlLmxleGljYWwudHlwZSAhPSBcIj5cIikge1xuICAgICAgICBpZiAoc3RyZWFtLmVhdChcIj1cIikpIHtcbiAgICAgICAgICBpZiAoY2ggPT0gXCIhXCIgfHwgY2ggPT0gXCI9XCIpIHN0cmVhbS5lYXQoXCI9XCIpXG4gICAgICAgIH0gZWxzZSBpZiAoL1s8PiorXFwtXS8udGVzdChjaCkpIHtcbiAgICAgICAgICBzdHJlYW0uZWF0KGNoKVxuICAgICAgICAgIGlmIChjaCA9PSBcIj5cIikgc3RyZWFtLmVhdChjaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJldChcIm9wZXJhdG9yXCIsIFwib3BlcmF0b3JcIiwgc3RyZWFtLmN1cnJlbnQoKSk7XG4gICAgfSBlbHNlIGlmICh3b3JkUkUudGVzdChjaCkpIHtcbiAgICAgIHN0cmVhbS5lYXRXaGlsZSh3b3JkUkUpO1xuICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpXG4gICAgICBpZiAoc3RhdGUubGFzdFR5cGUgIT0gXCIuXCIpIHtcbiAgICAgICAgaWYgKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKSB7XG4gICAgICAgICAgdmFyIGt3ID0ga2V5d29yZHNbd29yZF1cbiAgICAgICAgICByZXR1cm4gcmV0KGt3LnR5cGUsIGt3LnN0eWxlLCB3b3JkKVxuICAgICAgICB9XG4gICAgICAgIGlmICh3b3JkID09IFwiYXN5bmNcIiAmJiBzdHJlYW0ubWF0Y2goL14oXFxzfFxcL1xcKi4qP1xcKlxcLykqW1xcKFxcd10vLCBmYWxzZSkpXG4gICAgICAgICAgcmV0dXJuIHJldChcImFzeW5jXCIsIFwia2V5d29yZFwiLCB3b3JkKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJldChcInZhcmlhYmxlXCIsIFwidmFyaWFibGVcIiwgd29yZClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0O1xuICAgICAgaWYgKGpzb25sZE1vZGUgJiYgc3RyZWFtLnBlZWsoKSA9PSBcIkBcIiAmJiBzdHJlYW0ubWF0Y2goaXNKc29ubGRLZXl3b3JkKSl7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlO1xuICAgICAgICByZXR1cm4gcmV0KFwianNvbmxkLWtleXdvcmRcIiwgXCJtZXRhXCIpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgYnJlYWs7XG4gICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09IFwiXFxcXFwiO1xuICAgICAgfVxuICAgICAgaWYgKCFlc2NhcGVkKSBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTtcbiAgICAgIHJldHVybiByZXQoXCJzdHJpbmdcIiwgXCJzdHJpbmdcIik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoO1xuICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHtcbiAgICAgIGlmIChjaCA9PSBcIi9cIiAmJiBtYXliZUVuZCkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBtYXliZUVuZCA9IChjaCA9PSBcIipcIik7XG4gICAgfVxuICAgIHJldHVybiByZXQoXCJjb21tZW50XCIsIFwiY29tbWVudFwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuUXVhc2koc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQ7XG4gICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlc2NhcGVkICYmIChuZXh0ID09IFwiYFwiIHx8IG5leHQgPT0gXCIkXCIgJiYgc3RyZWFtLmVhdChcIntcIikpKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09IFwiXFxcXFwiO1xuICAgIH1cbiAgICByZXR1cm4gcmV0KFwicXVhc2lcIiwgXCJzdHJpbmctMlwiLCBzdHJlYW0uY3VycmVudCgpKTtcbiAgfVxuXG4gIHZhciBicmFja2V0cyA9IFwiKFt7fV0pXCI7XG4gIC8vIFRoaXMgaXMgYSBjcnVkZSBsb29rYWhlYWQgdHJpY2sgdG8gdHJ5IGFuZCBub3RpY2UgdGhhdCB3ZSdyZVxuICAvLyBwYXJzaW5nIHRoZSBhcmd1bWVudCBwYXR0ZXJucyBmb3IgYSBmYXQtYXJyb3cgZnVuY3Rpb24gYmVmb3JlIHdlXG4gIC8vIGFjdHVhbGx5IGhpdCB0aGUgYXJyb3cgdG9rZW4uIEl0IG9ubHkgd29ya3MgaWYgdGhlIGFycm93IGlzIG9uXG4gIC8vIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGFyZ3VtZW50cyBhbmQgdGhlcmUncyBubyBzdHJhbmdlIG5vaXNlXG4gIC8vIChjb21tZW50cykgaW4gYmV0d2Vlbi4gRmFsbGJhY2sgaXMgdG8gb25seSBub3RpY2Ugd2hlbiB3ZSBoaXQgdGhlXG4gIC8vIGFycm93LCBhbmQgbm90IGRlY2xhcmUgdGhlIGFyZ3VtZW50cyBhcyBsb2NhbHMgZm9yIHRoZSBhcnJvd1xuICAvLyBib2R5LlxuICBmdW5jdGlvbiBmaW5kRmF0QXJyb3coc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5mYXRBcnJvd0F0KSBzdGF0ZS5mYXRBcnJvd0F0ID0gbnVsbDtcbiAgICB2YXIgYXJyb3cgPSBzdHJlYW0uc3RyaW5nLmluZGV4T2YoXCI9PlwiLCBzdHJlYW0uc3RhcnQpO1xuICAgIGlmIChhcnJvdyA8IDApIHJldHVybjtcblxuICAgIGlmIChpc1RTKSB7IC8vIFRyeSB0byBza2lwIFR5cGVTY3JpcHQgcmV0dXJuIHR5cGUgZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBhcmd1bWVudHNcbiAgICAgIHZhciBtID0gLzpcXHMqKD86XFx3Kyg/OjxbXj5dKj58XFxbXFxdKT98XFx7W159XSpcXH0pXFxzKiQvLmV4ZWMoc3RyZWFtLnN0cmluZy5zbGljZShzdHJlYW0uc3RhcnQsIGFycm93KSlcbiAgICAgIGlmIChtKSBhcnJvdyA9IG0uaW5kZXhcbiAgICB9XG5cbiAgICB2YXIgZGVwdGggPSAwLCBzYXdTb21ldGhpbmcgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBwb3MgPSBhcnJvdyAtIDE7IHBvcyA+PSAwOyAtLXBvcykge1xuICAgICAgdmFyIGNoID0gc3RyZWFtLnN0cmluZy5jaGFyQXQocG9zKTtcbiAgICAgIHZhciBicmFja2V0ID0gYnJhY2tldHMuaW5kZXhPZihjaCk7XG4gICAgICBpZiAoYnJhY2tldCA+PSAwICYmIGJyYWNrZXQgPCAzKSB7XG4gICAgICAgIGlmICghZGVwdGgpIHsgKytwb3M7IGJyZWFrOyB9XG4gICAgICAgIGlmICgtLWRlcHRoID09IDApIHsgaWYgKGNoID09IFwiKFwiKSBzYXdTb21ldGhpbmcgPSB0cnVlOyBicmVhazsgfVxuICAgICAgfSBlbHNlIGlmIChicmFja2V0ID49IDMgJiYgYnJhY2tldCA8IDYpIHtcbiAgICAgICAgKytkZXB0aDtcbiAgICAgIH0gZWxzZSBpZiAod29yZFJFLnRlc3QoY2gpKSB7XG4gICAgICAgIHNhd1NvbWV0aGluZyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKC9bXCInXFwvXS8udGVzdChjaCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChzYXdTb21ldGhpbmcgJiYgIWRlcHRoKSB7XG4gICAgICAgICsrcG9zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNhd1NvbWV0aGluZyAmJiAhZGVwdGgpIHN0YXRlLmZhdEFycm93QXQgPSBwb3M7XG4gIH1cblxuICAvLyBQYXJzZXJcblxuICB2YXIgYXRvbWljVHlwZXMgPSB7XCJhdG9tXCI6IHRydWUsIFwibnVtYmVyXCI6IHRydWUsIFwidmFyaWFibGVcIjogdHJ1ZSwgXCJzdHJpbmdcIjogdHJ1ZSwgXCJyZWdleHBcIjogdHJ1ZSwgXCJ0aGlzXCI6IHRydWUsIFwianNvbmxkLWtleXdvcmRcIjogdHJ1ZX07XG5cbiAgZnVuY3Rpb24gSlNMZXhpY2FsKGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGFsaWduLCBwcmV2LCBpbmZvKSB7XG4gICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkO1xuICAgIHRoaXMuY29sdW1uID0gY29sdW1uO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5wcmV2ID0gcHJldjtcbiAgICB0aGlzLmluZm8gPSBpbmZvO1xuICAgIGlmIChhbGlnbiAhPSBudWxsKSB0aGlzLmFsaWduID0gYWxpZ247XG4gIH1cblxuICBmdW5jdGlvbiBpblNjb3BlKHN0YXRlLCB2YXJuYW1lKSB7XG4gICAgZm9yICh2YXIgdiA9IHN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dClcbiAgICAgIGlmICh2Lm5hbWUgPT0gdmFybmFtZSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgY3ggPSBzdGF0ZS5jb250ZXh0OyBjeDsgY3ggPSBjeC5wcmV2KSB7XG4gICAgICBmb3IgKHZhciB2ID0gY3gudmFyczsgdjsgdiA9IHYubmV4dClcbiAgICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUpTKHN0YXRlLCBzdHlsZSwgdHlwZSwgY29udGVudCwgc3RyZWFtKSB7XG4gICAgdmFyIGNjID0gc3RhdGUuY2M7XG4gICAgLy8gQ29tbXVuaWNhdGUgb3VyIGNvbnRleHQgdG8gdGhlIGNvbWJpbmF0b3JzLlxuICAgIC8vIChMZXNzIHdhc3RlZnVsIHRoYW4gY29uc2luZyB1cCBhIGh1bmRyZWQgY2xvc3VyZXMgb24gZXZlcnkgY2FsbC4pXG4gICAgY3guc3RhdGUgPSBzdGF0ZTsgY3guc3RyZWFtID0gc3RyZWFtOyBjeC5tYXJrZWQgPSBudWxsLCBjeC5jYyA9IGNjOyBjeC5zdHlsZSA9IHN0eWxlO1xuXG4gICAgaWYgKCFzdGF0ZS5sZXhpY2FsLmhhc093blByb3BlcnR5KFwiYWxpZ25cIikpXG4gICAgICBzdGF0ZS5sZXhpY2FsLmFsaWduID0gdHJ1ZTtcblxuICAgIHdoaWxlKHRydWUpIHtcbiAgICAgIHZhciBjb21iaW5hdG9yID0gY2MubGVuZ3RoID8gY2MucG9wKCkgOiBqc29uTW9kZSA/IGV4cHJlc3Npb24gOiBzdGF0ZW1lbnQ7XG4gICAgICBpZiAoY29tYmluYXRvcih0eXBlLCBjb250ZW50KSkge1xuICAgICAgICB3aGlsZShjYy5sZW5ndGggJiYgY2NbY2MubGVuZ3RoIC0gMV0ubGV4KVxuICAgICAgICAgIGNjLnBvcCgpKCk7XG4gICAgICAgIGlmIChjeC5tYXJrZWQpIHJldHVybiBjeC5tYXJrZWQ7XG4gICAgICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIiAmJiBpblNjb3BlKHN0YXRlLCBjb250ZW50KSkgcmV0dXJuIFwidmFyaWFibGUtMlwiO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tYmluYXRvciB1dGlsc1xuXG4gIHZhciBjeCA9IHtzdGF0ZTogbnVsbCwgY29sdW1uOiBudWxsLCBtYXJrZWQ6IG51bGwsIGNjOiBudWxsfTtcbiAgZnVuY3Rpb24gcGFzcygpIHtcbiAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBjeC5jYy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIH1cbiAgZnVuY3Rpb24gY29udCgpIHtcbiAgICBwYXNzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gcmVnaXN0ZXIodmFybmFtZSkge1xuICAgIGZ1bmN0aW9uIGluTGlzdChsaXN0KSB7XG4gICAgICBmb3IgKHZhciB2ID0gbGlzdDsgdjsgdiA9IHYubmV4dClcbiAgICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHN0YXRlID0gY3guc3RhdGU7XG4gICAgY3gubWFya2VkID0gXCJkZWZcIjtcbiAgICBpZiAoc3RhdGUuY29udGV4dCkge1xuICAgICAgaWYgKGluTGlzdChzdGF0ZS5sb2NhbFZhcnMpKSByZXR1cm47XG4gICAgICBzdGF0ZS5sb2NhbFZhcnMgPSB7bmFtZTogdmFybmFtZSwgbmV4dDogc3RhdGUubG9jYWxWYXJzfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGluTGlzdChzdGF0ZS5nbG9iYWxWYXJzKSkgcmV0dXJuO1xuICAgICAgaWYgKHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzKVxuICAgICAgICBzdGF0ZS5nbG9iYWxWYXJzID0ge25hbWU6IHZhcm5hbWUsIG5leHQ6IHN0YXRlLmdsb2JhbFZhcnN9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTW9kaWZpZXIobmFtZSkge1xuICAgIHJldHVybiBuYW1lID09IFwicHVibGljXCIgfHwgbmFtZSA9PSBcInByaXZhdGVcIiB8fCBuYW1lID09IFwicHJvdGVjdGVkXCIgfHwgbmFtZSA9PSBcImFic3RyYWN0XCIgfHwgbmFtZSA9PSBcInJlYWRvbmx5XCJcbiAgfVxuXG4gIC8vIENvbWJpbmF0b3JzXG5cbiAgdmFyIGRlZmF1bHRWYXJzID0ge25hbWU6IFwidGhpc1wiLCBuZXh0OiB7bmFtZTogXCJhcmd1bWVudHNcIn19O1xuICBmdW5jdGlvbiBwdXNoY29udGV4dCgpIHtcbiAgICBjeC5zdGF0ZS5jb250ZXh0ID0ge3ByZXY6IGN4LnN0YXRlLmNvbnRleHQsIHZhcnM6IGN4LnN0YXRlLmxvY2FsVmFyc307XG4gICAgY3guc3RhdGUubG9jYWxWYXJzID0gZGVmYXVsdFZhcnM7XG4gIH1cbiAgZnVuY3Rpb24gcG9wY29udGV4dCgpIHtcbiAgICBjeC5zdGF0ZS5sb2NhbFZhcnMgPSBjeC5zdGF0ZS5jb250ZXh0LnZhcnM7XG4gICAgY3guc3RhdGUuY29udGV4dCA9IGN4LnN0YXRlLmNvbnRleHQucHJldjtcbiAgfVxuICBmdW5jdGlvbiBwdXNobGV4KHR5cGUsIGluZm8pIHtcbiAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZSwgaW5kZW50ID0gc3RhdGUuaW5kZW50ZWQ7XG4gICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09IFwic3RhdFwiKSBpbmRlbnQgPSBzdGF0ZS5sZXhpY2FsLmluZGVudGVkO1xuICAgICAgZWxzZSBmb3IgKHZhciBvdXRlciA9IHN0YXRlLmxleGljYWw7IG91dGVyICYmIG91dGVyLnR5cGUgPT0gXCIpXCIgJiYgb3V0ZXIuYWxpZ247IG91dGVyID0gb3V0ZXIucHJldilcbiAgICAgICAgaW5kZW50ID0gb3V0ZXIuaW5kZW50ZWQ7XG4gICAgICBzdGF0ZS5sZXhpY2FsID0gbmV3IEpTTGV4aWNhbChpbmRlbnQsIGN4LnN0cmVhbS5jb2x1bW4oKSwgdHlwZSwgbnVsbCwgc3RhdGUubGV4aWNhbCwgaW5mbyk7XG4gICAgfTtcbiAgICByZXN1bHQubGV4ID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGZ1bmN0aW9uIHBvcGxleCgpIHtcbiAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTtcbiAgICBpZiAoc3RhdGUubGV4aWNhbC5wcmV2KSB7XG4gICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09IFwiKVwiKVxuICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7XG4gICAgICBzdGF0ZS5sZXhpY2FsID0gc3RhdGUubGV4aWNhbC5wcmV2O1xuICAgIH1cbiAgfVxuICBwb3BsZXgubGV4ID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBleHBlY3Qod2FudGVkKSB7XG4gICAgZnVuY3Rpb24gZXhwKHR5cGUpIHtcbiAgICAgIGlmICh0eXBlID09IHdhbnRlZCkgcmV0dXJuIGNvbnQoKTtcbiAgICAgIGVsc2UgaWYgKHdhbnRlZCA9PSBcIjtcIikgcmV0dXJuIHBhc3MoKTtcbiAgICAgIGVsc2UgcmV0dXJuIGNvbnQoZXhwKTtcbiAgICB9O1xuICAgIHJldHVybiBleHA7XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0ZW1lbnQodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhclwiKSByZXR1cm4gY29udChwdXNobGV4KFwidmFyZGVmXCIsIHZhbHVlLmxlbmd0aCksIHZhcmRlZiwgZXhwZWN0KFwiO1wiKSwgcG9wbGV4KTtcbiAgICBpZiAodHlwZSA9PSBcImtleXdvcmQgYVwiKSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgcGFyZW5FeHByLCBzdGF0ZW1lbnQsIHBvcGxleCk7XG4gICAgaWYgKHR5cGUgPT0gXCJrZXl3b3JkIGJcIikgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIHN0YXRlbWVudCwgcG9wbGV4KTtcbiAgICBpZiAodHlwZSA9PSBcImtleXdvcmQgZFwiKSByZXR1cm4gY3guc3RyZWFtLm1hdGNoKC9eXFxzKiQvLCBmYWxzZSkgPyBjb250KCkgOiBjb250KHB1c2hsZXgoXCJzdGF0XCIpLCBtYXliZWV4cHJlc3Npb24sIGV4cGVjdChcIjtcIiksIHBvcGxleCk7XG4gICAgaWYgKHR5cGUgPT0gXCJkZWJ1Z2dlclwiKSByZXR1cm4gY29udChleHBlY3QoXCI7XCIpKTtcbiAgICBpZiAodHlwZSA9PSBcIntcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIn1cIiksIGJsb2NrLCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwiO1wiKSByZXR1cm4gY29udCgpO1xuICAgIGlmICh0eXBlID09IFwiaWZcIikge1xuICAgICAgaWYgKGN4LnN0YXRlLmxleGljYWwuaW5mbyA9PSBcImVsc2VcIiAmJiBjeC5zdGF0ZS5jY1tjeC5zdGF0ZS5jYy5sZW5ndGggLSAxXSA9PSBwb3BsZXgpXG4gICAgICAgIGN4LnN0YXRlLmNjLnBvcCgpKCk7XG4gICAgICByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgcGFyZW5FeHByLCBzdGF0ZW1lbnQsIHBvcGxleCwgbWF5YmVlbHNlKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gY29udChmdW5jdGlvbmRlZik7XG4gICAgaWYgKHR5cGUgPT0gXCJmb3JcIikgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIGZvcnNwZWMsIHN0YXRlbWVudCwgcG9wbGV4KTtcbiAgICBpZiAodHlwZSA9PSBcImNsYXNzXCIgfHwgKGlzVFMgJiYgdmFsdWUgPT0gXCJpbnRlcmZhY2VcIikpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBjbGFzc05hbWUsIHBvcGxleCk7IH1cbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICAgIGlmIChpc1RTICYmIHZhbHVlID09IFwiZGVjbGFyZVwiKSB7XG4gICAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiXG4gICAgICAgIHJldHVybiBjb250KHN0YXRlbWVudClcbiAgICAgIH0gZWxzZSBpZiAoaXNUUyAmJiAodmFsdWUgPT0gXCJtb2R1bGVcIiB8fCB2YWx1ZSA9PSBcImVudW1cIiB8fCB2YWx1ZSA9PSBcInR5cGVcIikgJiYgY3guc3RyZWFtLm1hdGNoKC9eXFxzKlxcdy8sIGZhbHNlKSkge1xuICAgICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIlxuICAgICAgICBpZiAodmFsdWUgPT0gXCJlbnVtXCIpIHJldHVybiBjb250KGVudW1kZWYpO1xuICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSBcInR5cGVcIikgcmV0dXJuIGNvbnQodHlwZWV4cHIsIGV4cGVjdChcIm9wZXJhdG9yXCIpLCB0eXBlZXhwciwgZXhwZWN0KFwiO1wiKSk7XG4gICAgICAgIGVsc2UgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIHBhdHRlcm4sIGV4cGVjdChcIntcIiksIHB1c2hsZXgoXCJ9XCIpLCBibG9jaywgcG9wbGV4LCBwb3BsZXgpXG4gICAgICB9IGVsc2UgaWYgKGlzVFMgJiYgdmFsdWUgPT0gXCJuYW1lc3BhY2VcIikge1xuICAgICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIlxuICAgICAgICByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgZXhwcmVzc2lvbiwgYmxvY2ssIHBvcGxleClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCJzdGF0XCIpLCBtYXliZWxhYmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJzd2l0Y2hcIikgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIHBhcmVuRXhwciwgZXhwZWN0KFwie1wiKSwgcHVzaGxleChcIn1cIiwgXCJzd2l0Y2hcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLCBwb3BsZXgsIHBvcGxleCk7XG4gICAgaWYgKHR5cGUgPT0gXCJjYXNlXCIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdChcIjpcIikpO1xuICAgIGlmICh0eXBlID09IFwiZGVmYXVsdFwiKSByZXR1cm4gY29udChleHBlY3QoXCI6XCIpKTtcbiAgICBpZiAodHlwZSA9PSBcImNhdGNoXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBwdXNoY29udGV4dCwgZXhwZWN0KFwiKFwiKSwgZnVuYXJnLCBleHBlY3QoXCIpXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCwgcG9wbGV4LCBwb3Bjb250ZXh0KTtcbiAgICBpZiAodHlwZSA9PSBcImV4cG9ydFwiKSByZXR1cm4gY29udChwdXNobGV4KFwic3RhdFwiKSwgYWZ0ZXJFeHBvcnQsIHBvcGxleCk7XG4gICAgaWYgKHR5cGUgPT0gXCJpbXBvcnRcIikgcmV0dXJuIGNvbnQocHVzaGxleChcInN0YXRcIiksIGFmdGVySW1wb3J0LCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwiYXN5bmNcIikgcmV0dXJuIGNvbnQoc3RhdGVtZW50KVxuICAgIGlmICh2YWx1ZSA9PSBcIkBcIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgc3RhdGVtZW50KVxuICAgIHJldHVybiBwYXNzKHB1c2hsZXgoXCJzdGF0XCIpLCBleHByZXNzaW9uLCBleHBlY3QoXCI7XCIpLCBwb3BsZXgpO1xuICB9XG4gIGZ1bmN0aW9uIGV4cHJlc3Npb24odHlwZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbklubmVyKHR5cGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbiAgZnVuY3Rpb24gZXhwcmVzc2lvbk5vQ29tbWEodHlwZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbklubmVyKHR5cGUsIHZhbHVlLCB0cnVlKTtcbiAgfVxuICBmdW5jdGlvbiBwYXJlbkV4cHIodHlwZSkge1xuICAgIGlmICh0eXBlICE9IFwiKFwiKSByZXR1cm4gcGFzcygpXG4gICAgcmV0dXJuIGNvbnQocHVzaGxleChcIilcIiksIGV4cHJlc3Npb24sIGV4cGVjdChcIilcIiksIHBvcGxleClcbiAgfVxuICBmdW5jdGlvbiBleHByZXNzaW9uSW5uZXIodHlwZSwgdmFsdWUsIG5vQ29tbWEpIHtcbiAgICBpZiAoY3guc3RhdGUuZmF0QXJyb3dBdCA9PSBjeC5zdHJlYW0uc3RhcnQpIHtcbiAgICAgIHZhciBib2R5ID0gbm9Db21tYSA/IGFycm93Qm9keU5vQ29tbWEgOiBhcnJvd0JvZHk7XG4gICAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsIHB1c2hsZXgoXCIpXCIpLCBjb21tYXNlcChmdW5hcmcsIFwiKVwiKSwgcG9wbGV4LCBleHBlY3QoXCI9PlwiKSwgYm9keSwgcG9wY29udGV4dCk7XG4gICAgICBlbHNlIGlmICh0eXBlID09IFwidmFyaWFibGVcIikgcmV0dXJuIHBhc3MocHVzaGNvbnRleHQsIHBhdHRlcm4sIGV4cGVjdChcIj0+XCIpLCBib2R5LCBwb3Bjb250ZXh0KTtcbiAgICB9XG5cbiAgICB2YXIgbWF5YmVvcCA9IG5vQ29tbWEgPyBtYXliZW9wZXJhdG9yTm9Db21tYSA6IG1heWJlb3BlcmF0b3JDb21tYTtcbiAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIHJldHVybiBjb250KG1heWJlb3ApO1xuICAgIGlmICh0eXBlID09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYsIG1heWJlb3ApO1xuICAgIGlmICh0eXBlID09IFwiY2xhc3NcIiB8fCAoaXNUUyAmJiB2YWx1ZSA9PSBcImludGVyZmFjZVwiKSkgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIGNsYXNzRXhwcmVzc2lvbiwgcG9wbGV4KTsgfVxuICAgIGlmICh0eXBlID09IFwia2V5d29yZCBjXCIgfHwgdHlwZSA9PSBcImFzeW5jXCIpIHJldHVybiBjb250KG5vQ29tbWEgPyBleHByZXNzaW9uTm9Db21tYSA6IGV4cHJlc3Npb24pO1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udChwdXNobGV4KFwiKVwiKSwgbWF5YmVleHByZXNzaW9uLCBleHBlY3QoXCIpXCIpLCBwb3BsZXgsIG1heWJlb3ApO1xuICAgIGlmICh0eXBlID09IFwib3BlcmF0b3JcIiB8fCB0eXBlID09IFwic3ByZWFkXCIpIHJldHVybiBjb250KG5vQ29tbWEgPyBleHByZXNzaW9uTm9Db21tYSA6IGV4cHJlc3Npb24pO1xuICAgIGlmICh0eXBlID09IFwiW1wiKSByZXR1cm4gY29udChwdXNobGV4KFwiXVwiKSwgYXJyYXlMaXRlcmFsLCBwb3BsZXgsIG1heWJlb3ApO1xuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udENvbW1hc2VwKG9ianByb3AsIFwifVwiLCBudWxsLCBtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcInF1YXNpXCIpIHJldHVybiBwYXNzKHF1YXNpLCBtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcIm5ld1wiKSByZXR1cm4gY29udChtYXliZVRhcmdldChub0NvbW1hKSk7XG4gICAgaWYgKHR5cGUgPT0gXCJpbXBvcnRcIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIGNvbnQoKTtcbiAgfVxuICBmdW5jdGlvbiBtYXliZWV4cHJlc3Npb24odHlwZSkge1xuICAgIGlmICh0eXBlLm1hdGNoKC9bO1xcfVxcKVxcXSxdLykpIHJldHVybiBwYXNzKCk7XG4gICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbik7XG4gIH1cblxuICBmdW5jdGlvbiBtYXliZW9wZXJhdG9yQ29tbWEodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcIixcIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIG1heWJlb3BlcmF0b3JOb0NvbW1hKHR5cGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvck5vQ29tbWEodHlwZSwgdmFsdWUsIG5vQ29tbWEpIHtcbiAgICB2YXIgbWUgPSBub0NvbW1hID09IGZhbHNlID8gbWF5YmVvcGVyYXRvckNvbW1hIDogbWF5YmVvcGVyYXRvck5vQ29tbWE7XG4gICAgdmFyIGV4cHIgPSBub0NvbW1hID09IGZhbHNlID8gZXhwcmVzc2lvbiA6IGV4cHJlc3Npb25Ob0NvbW1hO1xuICAgIGlmICh0eXBlID09IFwiPT5cIikgcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsIG5vQ29tbWEgPyBhcnJvd0JvZHlOb0NvbW1hIDogYXJyb3dCb2R5LCBwb3Bjb250ZXh0KTtcbiAgICBpZiAodHlwZSA9PSBcIm9wZXJhdG9yXCIpIHtcbiAgICAgIGlmICgvXFwrXFwrfC0tLy50ZXN0KHZhbHVlKSB8fCBpc1RTICYmIHZhbHVlID09IFwiIVwiKSByZXR1cm4gY29udChtZSk7XG4gICAgICBpZiAoaXNUUyAmJiB2YWx1ZSA9PSBcIjxcIiAmJiBjeC5zdHJlYW0ubWF0Y2goL14oW14+XXw8Lio/PikqPlxccypcXCgvLCBmYWxzZSkpXG4gICAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlZXhwciwgXCI+XCIpLCBwb3BsZXgsIG1lKTtcbiAgICAgIGlmICh2YWx1ZSA9PSBcIj9cIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KFwiOlwiKSwgZXhwcik7XG4gICAgICByZXR1cm4gY29udChleHByKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJxdWFzaVwiKSB7IHJldHVybiBwYXNzKHF1YXNpLCBtZSk7IH1cbiAgICBpZiAodHlwZSA9PSBcIjtcIikgcmV0dXJuO1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udENvbW1hc2VwKGV4cHJlc3Npb25Ob0NvbW1hLCBcIilcIiwgXCJjYWxsXCIsIG1lKTtcbiAgICBpZiAodHlwZSA9PSBcIi5cIikgcmV0dXJuIGNvbnQocHJvcGVydHksIG1lKTtcbiAgICBpZiAodHlwZSA9PSBcIltcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIl1cIiksIG1heWJlZXhwcmVzc2lvbiwgZXhwZWN0KFwiXVwiKSwgcG9wbGV4LCBtZSk7XG4gICAgaWYgKGlzVFMgJiYgdmFsdWUgPT0gXCJhc1wiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udCh0eXBlZXhwciwgbWUpIH1cbiAgICBpZiAodHlwZSA9PSBcInJlZ2V4cFwiKSB7XG4gICAgICBjeC5zdGF0ZS5sYXN0VHlwZSA9IGN4Lm1hcmtlZCA9IFwib3BlcmF0b3JcIlxuICAgICAgY3guc3RyZWFtLmJhY2tVcChjeC5zdHJlYW0ucG9zIC0gY3guc3RyZWFtLnN0YXJ0IC0gMSlcbiAgICAgIHJldHVybiBjb250KGV4cHIpXG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHF1YXNpKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGUgIT0gXCJxdWFzaVwiKSByZXR1cm4gcGFzcygpO1xuICAgIGlmICh2YWx1ZS5zbGljZSh2YWx1ZS5sZW5ndGggLSAyKSAhPSBcIiR7XCIpIHJldHVybiBjb250KHF1YXNpKTtcbiAgICByZXR1cm4gY29udChleHByZXNzaW9uLCBjb250aW51ZVF1YXNpKTtcbiAgfVxuICBmdW5jdGlvbiBjb250aW51ZVF1YXNpKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIn1cIikge1xuICAgICAgY3gubWFya2VkID0gXCJzdHJpbmctMlwiO1xuICAgICAgY3guc3RhdGUudG9rZW5pemUgPSB0b2tlblF1YXNpO1xuICAgICAgcmV0dXJuIGNvbnQocXVhc2kpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhcnJvd0JvZHkodHlwZSkge1xuICAgIGZpbmRGYXRBcnJvdyhjeC5zdHJlYW0sIGN4LnN0YXRlKTtcbiAgICByZXR1cm4gcGFzcyh0eXBlID09IFwie1wiID8gc3RhdGVtZW50IDogZXhwcmVzc2lvbik7XG4gIH1cbiAgZnVuY3Rpb24gYXJyb3dCb2R5Tm9Db21tYSh0eXBlKSB7XG4gICAgZmluZEZhdEFycm93KGN4LnN0cmVhbSwgY3guc3RhdGUpO1xuICAgIHJldHVybiBwYXNzKHR5cGUgPT0gXCJ7XCIgPyBzdGF0ZW1lbnQgOiBleHByZXNzaW9uTm9Db21tYSk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVUYXJnZXQobm9Db21tYSkge1xuICAgIHJldHVybiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICBpZiAodHlwZSA9PSBcIi5cIikgcmV0dXJuIGNvbnQobm9Db21tYSA/IHRhcmdldE5vQ29tbWEgOiB0YXJnZXQpO1xuICAgICAgZWxzZSBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIgJiYgaXNUUykgcmV0dXJuIGNvbnQobWF5YmVUeXBlQXJncywgbm9Db21tYSA/IG1heWJlb3BlcmF0b3JOb0NvbW1hIDogbWF5YmVvcGVyYXRvckNvbW1hKVxuICAgICAgZWxzZSByZXR1cm4gcGFzcyhub0NvbW1hID8gZXhwcmVzc2lvbk5vQ29tbWEgOiBleHByZXNzaW9uKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHRhcmdldChfLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcInRhcmdldFwiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChtYXliZW9wZXJhdG9yQ29tbWEpOyB9XG4gIH1cbiAgZnVuY3Rpb24gdGFyZ2V0Tm9Db21tYShfLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcInRhcmdldFwiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChtYXliZW9wZXJhdG9yTm9Db21tYSk7IH1cbiAgfVxuICBmdW5jdGlvbiBtYXliZWxhYmVsKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIjpcIikgcmV0dXJuIGNvbnQocG9wbGV4LCBzdGF0ZW1lbnQpO1xuICAgIHJldHVybiBwYXNzKG1heWJlb3BlcmF0b3JDb21tYSwgZXhwZWN0KFwiO1wiKSwgcG9wbGV4KTtcbiAgfVxuICBmdW5jdGlvbiBwcm9wZXJ0eSh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSB7Y3gubWFya2VkID0gXCJwcm9wZXJ0eVwiOyByZXR1cm4gY29udCgpO31cbiAgfVxuICBmdW5jdGlvbiBvYmpwcm9wKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJhc3luY1wiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcInByb3BlcnR5XCI7XG4gICAgICByZXR1cm4gY29udChvYmpwcm9wKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiIHx8IGN4LnN0eWxlID09IFwia2V5d29yZFwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcInByb3BlcnR5XCI7XG4gICAgICBpZiAodmFsdWUgPT0gXCJnZXRcIiB8fCB2YWx1ZSA9PSBcInNldFwiKSByZXR1cm4gY29udChnZXR0ZXJTZXR0ZXIpO1xuICAgICAgdmFyIG0gLy8gV29yayBhcm91bmQgZmF0LWFycm93LWRldGVjdGlvbiBjb21wbGljYXRpb24gZm9yIGRldGVjdGluZyB0eXBlc2NyaXB0IHR5cGVkIGFycm93IHBhcmFtc1xuICAgICAgaWYgKGlzVFMgJiYgY3guc3RhdGUuZmF0QXJyb3dBdCA9PSBjeC5zdHJlYW0uc3RhcnQgJiYgKG0gPSBjeC5zdHJlYW0ubWF0Y2goL15cXHMqOlxccyovLCBmYWxzZSkpKVxuICAgICAgICBjeC5zdGF0ZS5mYXRBcnJvd0F0ID0gY3guc3RyZWFtLnBvcyArIG1bMF0ubGVuZ3RoXG4gICAgICByZXR1cm4gY29udChhZnRlcnByb3ApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIm51bWJlclwiIHx8IHR5cGUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgY3gubWFya2VkID0ganNvbmxkTW9kZSA/IFwicHJvcGVydHlcIiA6IChjeC5zdHlsZSArIFwiIHByb3BlcnR5XCIpO1xuICAgICAgcmV0dXJuIGNvbnQoYWZ0ZXJwcm9wKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJqc29ubGQta2V5d29yZFwiKSB7XG4gICAgICByZXR1cm4gY29udChhZnRlcnByb3ApO1xuICAgIH0gZWxzZSBpZiAoaXNUUyAmJiBpc01vZGlmaWVyKHZhbHVlKSkge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgIHJldHVybiBjb250KG9ianByb3ApXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiW1wiKSB7XG4gICAgICByZXR1cm4gY29udChleHByZXNzaW9uLCBtYXliZXR5cGUsIGV4cGVjdChcIl1cIiksIGFmdGVycHJvcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwic3ByZWFkXCIpIHtcbiAgICAgIHJldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hLCBhZnRlcnByb3ApO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gXCIqXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiO1xuICAgICAgcmV0dXJuIGNvbnQob2JqcHJvcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiOlwiKSB7XG4gICAgICByZXR1cm4gcGFzcyhhZnRlcnByb3ApXG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldHRlclNldHRlcih0eXBlKSB7XG4gICAgaWYgKHR5cGUgIT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gcGFzcyhhZnRlcnByb3ApO1xuICAgIGN4Lm1hcmtlZCA9IFwicHJvcGVydHlcIjtcbiAgICByZXR1cm4gY29udChmdW5jdGlvbmRlZik7XG4gIH1cbiAgZnVuY3Rpb24gYWZ0ZXJwcm9wKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIjpcIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbk5vQ29tbWEpO1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gcGFzcyhmdW5jdGlvbmRlZik7XG4gIH1cbiAgZnVuY3Rpb24gY29tbWFzZXAod2hhdCwgZW5kLCBzZXApIHtcbiAgICBmdW5jdGlvbiBwcm9jZWVkKHR5cGUsIHZhbHVlKSB7XG4gICAgICBpZiAoc2VwID8gc2VwLmluZGV4T2YodHlwZSkgPiAtMSA6IHR5cGUgPT0gXCIsXCIpIHtcbiAgICAgICAgdmFyIGxleCA9IGN4LnN0YXRlLmxleGljYWw7XG4gICAgICAgIGlmIChsZXguaW5mbyA9PSBcImNhbGxcIikgbGV4LnBvcyA9IChsZXgucG9zIHx8IDApICsgMTtcbiAgICAgICAgcmV0dXJuIGNvbnQoZnVuY3Rpb24odHlwZSwgdmFsdWUpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PSBlbmQgfHwgdmFsdWUgPT0gZW5kKSByZXR1cm4gcGFzcygpXG4gICAgICAgICAgcmV0dXJuIHBhc3Mod2hhdClcbiAgICAgICAgfSwgcHJvY2VlZCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PSBlbmQgfHwgdmFsdWUgPT0gZW5kKSByZXR1cm4gY29udCgpO1xuICAgICAgcmV0dXJuIGNvbnQoZXhwZWN0KGVuZCkpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24odHlwZSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlID09IGVuZCB8fCB2YWx1ZSA9PSBlbmQpIHJldHVybiBjb250KCk7XG4gICAgICByZXR1cm4gcGFzcyh3aGF0LCBwcm9jZWVkKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGNvbnRDb21tYXNlcCh3aGF0LCBlbmQsIGluZm8pIHtcbiAgICBmb3IgKHZhciBpID0gMzsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGN4LmNjLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICByZXR1cm4gY29udChwdXNobGV4KGVuZCwgaW5mbyksIGNvbW1hc2VwKHdoYXQsIGVuZCksIHBvcGxleCk7XG4gIH1cbiAgZnVuY3Rpb24gYmxvY2sodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwifVwiKSByZXR1cm4gY29udCgpO1xuICAgIHJldHVybiBwYXNzKHN0YXRlbWVudCwgYmxvY2spO1xuICB9XG4gIGZ1bmN0aW9uIG1heWJldHlwZSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmIChpc1RTKSB7XG4gICAgICBpZiAodHlwZSA9PSBcIjpcIikgcmV0dXJuIGNvbnQodHlwZWV4cHIpO1xuICAgICAgaWYgKHZhbHVlID09IFwiP1wiKSByZXR1cm4gY29udChtYXliZXR5cGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtYXliZXJldHR5cGUodHlwZSkge1xuICAgIGlmIChpc1RTICYmIHR5cGUgPT0gXCI6XCIpIHtcbiAgICAgIGlmIChjeC5zdHJlYW0ubWF0Y2goL15cXHMqXFx3K1xccytpc1xcYi8sIGZhbHNlKSkgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgaXNLVywgdHlwZWV4cHIpXG4gICAgICBlbHNlIHJldHVybiBjb250KHR5cGVleHByKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpc0tXKF8sIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiaXNcIikge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgIHJldHVybiBjb250KClcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdHlwZWV4cHIodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJrZXlvZlwiIHx8IHZhbHVlID09IFwidHlwZW9mXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiXG4gICAgICByZXR1cm4gY29udCh2YWx1ZSA9PSBcImtleW9mXCIgPyB0eXBlZXhwciA6IGV4cHJlc3Npb24pXG4gICAgfVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIiB8fCB2YWx1ZSA9PSBcInZvaWRcIikge1xuICAgICAgY3gubWFya2VkID0gXCJ0eXBlXCJcbiAgICAgIHJldHVybiBjb250KGFmdGVyVHlwZSlcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJzdHJpbmdcIiB8fCB0eXBlID09IFwibnVtYmVyXCIgfHwgdHlwZSA9PSBcImF0b21cIikgcmV0dXJuIGNvbnQoYWZ0ZXJUeXBlKTtcbiAgICBpZiAodHlwZSA9PSBcIltcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIl1cIiksIGNvbW1hc2VwKHR5cGVleHByLCBcIl1cIiwgXCIsXCIpLCBwb3BsZXgsIGFmdGVyVHlwZSlcbiAgICBpZiAodHlwZSA9PSBcIntcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIn1cIiksIGNvbW1hc2VwKHR5cGVwcm9wLCBcIn1cIiwgXCIsO1wiKSwgcG9wbGV4LCBhZnRlclR5cGUpXG4gICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBjb250KGNvbW1hc2VwKHR5cGVhcmcsIFwiKVwiKSwgbWF5YmVSZXR1cm5UeXBlKVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlUmV0dXJuVHlwZSh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCI9PlwiKSByZXR1cm4gY29udCh0eXBlZXhwcilcbiAgfVxuICBmdW5jdGlvbiB0eXBlcHJvcCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIiB8fCBjeC5zdHlsZSA9PSBcImtleXdvcmRcIikge1xuICAgICAgY3gubWFya2VkID0gXCJwcm9wZXJ0eVwiXG4gICAgICByZXR1cm4gY29udCh0eXBlcHJvcClcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09IFwiP1wiKSB7XG4gICAgICByZXR1cm4gY29udCh0eXBlcHJvcClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCI6XCIpIHtcbiAgICAgIHJldHVybiBjb250KHR5cGVleHByKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIltcIikge1xuICAgICAgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgbWF5YmV0eXBlLCBleHBlY3QoXCJdXCIpLCB0eXBlcHJvcClcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdHlwZWFyZyh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gY29udCh0eXBlYXJnKVxuICAgIGVsc2UgaWYgKHR5cGUgPT0gXCI6XCIpIHJldHVybiBjb250KHR5cGVleHByKVxuICB9XG4gIGZ1bmN0aW9uIGFmdGVyVHlwZSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIjxcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIj5cIiksIGNvbW1hc2VwKHR5cGVleHByLCBcIj5cIiksIHBvcGxleCwgYWZ0ZXJUeXBlKVxuICAgIGlmICh2YWx1ZSA9PSBcInxcIiB8fCB0eXBlID09IFwiLlwiIHx8IHZhbHVlID09IFwiJlwiKSByZXR1cm4gY29udCh0eXBlZXhwcilcbiAgICBpZiAodHlwZSA9PSBcIltcIikgcmV0dXJuIGNvbnQoZXhwZWN0KFwiXVwiKSwgYWZ0ZXJUeXBlKVxuICAgIGlmICh2YWx1ZSA9PSBcImV4dGVuZHNcIiB8fCB2YWx1ZSA9PSBcImltcGxlbWVudHNcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQodHlwZWV4cHIpIH1cbiAgfVxuICBmdW5jdGlvbiBtYXliZVR5cGVBcmdzKF8sIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiPFwiKSByZXR1cm4gY29udChwdXNobGV4KFwiPlwiKSwgY29tbWFzZXAodHlwZWV4cHIsIFwiPlwiKSwgcG9wbGV4LCBhZnRlclR5cGUpXG4gIH1cbiAgZnVuY3Rpb24gdHlwZXBhcmFtKCkge1xuICAgIHJldHVybiBwYXNzKHR5cGVleHByLCBtYXliZVR5cGVEZWZhdWx0KVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlVHlwZURlZmF1bHQoXywgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI9XCIpIHJldHVybiBjb250KHR5cGVleHByKVxuICB9XG4gIGZ1bmN0aW9uIHZhcmRlZihfLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcImVudW1cIikge2N4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChlbnVtZGVmKX1cbiAgICByZXR1cm4gcGFzcyhwYXR0ZXJuLCBtYXliZXR5cGUsIG1heWJlQXNzaWduLCB2YXJkZWZDb250KTtcbiAgfVxuICBmdW5jdGlvbiBwYXR0ZXJuKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKGlzVFMgJiYgaXNNb2RpZmllcih2YWx1ZSkpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KHBhdHRlcm4pIH1cbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHsgcmVnaXN0ZXIodmFsdWUpOyByZXR1cm4gY29udCgpOyB9XG4gICAgaWYgKHR5cGUgPT0gXCJzcHJlYWRcIikgcmV0dXJuIGNvbnQocGF0dGVybik7XG4gICAgaWYgKHR5cGUgPT0gXCJbXCIpIHJldHVybiBjb250Q29tbWFzZXAocGF0dGVybiwgXCJdXCIpO1xuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udENvbW1hc2VwKHByb3BwYXR0ZXJuLCBcIn1cIik7XG4gIH1cbiAgZnVuY3Rpb24gcHJvcHBhdHRlcm4odHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIgJiYgIWN4LnN0cmVhbS5tYXRjaCgvXlxccyo6LywgZmFsc2UpKSB7XG4gICAgICByZWdpc3Rlcih2YWx1ZSk7XG4gICAgICByZXR1cm4gY29udChtYXliZUFzc2lnbik7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikgY3gubWFya2VkID0gXCJwcm9wZXJ0eVwiO1xuICAgIGlmICh0eXBlID09IFwic3ByZWFkXCIpIHJldHVybiBjb250KHBhdHRlcm4pO1xuICAgIGlmICh0eXBlID09IFwifVwiKSByZXR1cm4gcGFzcygpO1xuICAgIHJldHVybiBjb250KGV4cGVjdChcIjpcIiksIHBhdHRlcm4sIG1heWJlQXNzaWduKTtcbiAgfVxuICBmdW5jdGlvbiBtYXliZUFzc2lnbihfdHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI9XCIpIHJldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hKTtcbiAgfVxuICBmdW5jdGlvbiB2YXJkZWZDb250KHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIixcIikgcmV0dXJuIGNvbnQodmFyZGVmKTtcbiAgfVxuICBmdW5jdGlvbiBtYXliZWVsc2UodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcImtleXdvcmQgYlwiICYmIHZhbHVlID09IFwiZWxzZVwiKSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiLCBcImVsc2VcIiksIHN0YXRlbWVudCwgcG9wbGV4KTtcbiAgfVxuICBmdW5jdGlvbiBmb3JzcGVjKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiYXdhaXRcIikgcmV0dXJuIGNvbnQoZm9yc3BlYyk7XG4gICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCIpXCIpLCBmb3JzcGVjMSwgZXhwZWN0KFwiKVwiKSwgcG9wbGV4KTtcbiAgfVxuICBmdW5jdGlvbiBmb3JzcGVjMSh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJcIikgcmV0dXJuIGNvbnQodmFyZGVmLCBleHBlY3QoXCI7XCIpLCBmb3JzcGVjMik7XG4gICAgaWYgKHR5cGUgPT0gXCI7XCIpIHJldHVybiBjb250KGZvcnNwZWMyKTtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHJldHVybiBjb250KGZvcm1heWJlaW5vZik7XG4gICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbiwgZXhwZWN0KFwiO1wiKSwgZm9yc3BlYzIpO1xuICB9XG4gIGZ1bmN0aW9uIGZvcm1heWJlaW5vZihfdHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJpblwiIHx8IHZhbHVlID09IFwib2ZcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7IH1cbiAgICByZXR1cm4gY29udChtYXliZW9wZXJhdG9yQ29tbWEsIGZvcnNwZWMyKTtcbiAgfVxuICBmdW5jdGlvbiBmb3JzcGVjMih0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwiO1wiKSByZXR1cm4gY29udChmb3JzcGVjMyk7XG4gICAgaWYgKHZhbHVlID09IFwiaW5cIiB8fCB2YWx1ZSA9PSBcIm9mXCIpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGV4cHJlc3Npb24pOyB9XG4gICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbiwgZXhwZWN0KFwiO1wiKSwgZm9yc3BlYzMpO1xuICB9XG4gIGZ1bmN0aW9uIGZvcnNwZWMzKHR5cGUpIHtcbiAgICBpZiAodHlwZSAhPSBcIilcIikgY29udChleHByZXNzaW9uKTtcbiAgfVxuICBmdW5jdGlvbiBmdW5jdGlvbmRlZih0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIipcIikge2N4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChmdW5jdGlvbmRlZik7fVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikge3JlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpO31cbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsIHB1c2hsZXgoXCIpXCIpLCBjb21tYXNlcChmdW5hcmcsIFwiKVwiKSwgcG9wbGV4LCBtYXliZXJldHR5cGUsIHN0YXRlbWVudCwgcG9wY29udGV4dCk7XG4gICAgaWYgKGlzVFMgJiYgdmFsdWUgPT0gXCI8XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlcGFyYW0sIFwiPlwiKSwgcG9wbGV4LCBmdW5jdGlvbmRlZilcbiAgfVxuICBmdW5jdGlvbiBmdW5hcmcodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJAXCIpIGNvbnQoZXhwcmVzc2lvbiwgZnVuYXJnKVxuICAgIGlmICh0eXBlID09IFwic3ByZWFkXCIpIHJldHVybiBjb250KGZ1bmFyZyk7XG4gICAgaWYgKGlzVFMgJiYgaXNNb2RpZmllcih2YWx1ZSkpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGZ1bmFyZyk7IH1cbiAgICByZXR1cm4gcGFzcyhwYXR0ZXJuLCBtYXliZXR5cGUsIG1heWJlQXNzaWduKTtcbiAgfVxuICBmdW5jdGlvbiBjbGFzc0V4cHJlc3Npb24odHlwZSwgdmFsdWUpIHtcbiAgICAvLyBDbGFzcyBleHByZXNzaW9ucyBtYXkgaGF2ZSBhbiBvcHRpb25hbCBuYW1lLlxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikgcmV0dXJuIGNsYXNzTmFtZSh0eXBlLCB2YWx1ZSk7XG4gICAgcmV0dXJuIGNsYXNzTmFtZUFmdGVyKHR5cGUsIHZhbHVlKTtcbiAgfVxuICBmdW5jdGlvbiBjbGFzc05hbWUodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHtyZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KGNsYXNzTmFtZUFmdGVyKTt9XG4gIH1cbiAgZnVuY3Rpb24gY2xhc3NOYW1lQWZ0ZXIodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI8XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlcGFyYW0sIFwiPlwiKSwgcG9wbGV4LCBjbGFzc05hbWVBZnRlcilcbiAgICBpZiAodmFsdWUgPT0gXCJleHRlbmRzXCIgfHwgdmFsdWUgPT0gXCJpbXBsZW1lbnRzXCIgfHwgKGlzVFMgJiYgdHlwZSA9PSBcIixcIikpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBcImltcGxlbWVudHNcIikgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7XG4gICAgICByZXR1cm4gY29udChpc1RTID8gdHlwZWV4cHIgOiBleHByZXNzaW9uLCBjbGFzc05hbWVBZnRlcik7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udChwdXNobGV4KFwifVwiKSwgY2xhc3NCb2R5LCBwb3BsZXgpO1xuICB9XG4gIGZ1bmN0aW9uIGNsYXNzQm9keSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwiYXN5bmNcIiB8fFxuICAgICAgICAodHlwZSA9PSBcInZhcmlhYmxlXCIgJiZcbiAgICAgICAgICh2YWx1ZSA9PSBcInN0YXRpY1wiIHx8IHZhbHVlID09IFwiZ2V0XCIgfHwgdmFsdWUgPT0gXCJzZXRcIiB8fCAoaXNUUyAmJiBpc01vZGlmaWVyKHZhbHVlKSkpICYmXG4gICAgICAgICBjeC5zdHJlYW0ubWF0Y2goL15cXHMrW1xcdyRcXHhhMS1cXHVmZmZmXS8sIGZhbHNlKSkpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiO1xuICAgICAgcmV0dXJuIGNvbnQoY2xhc3NCb2R5KTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiIHx8IGN4LnN0eWxlID09IFwia2V5d29yZFwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcInByb3BlcnR5XCI7XG4gICAgICByZXR1cm4gY29udChpc1RTID8gY2xhc3NmaWVsZCA6IGZ1bmN0aW9uZGVmLCBjbGFzc0JvZHkpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcIltcIilcbiAgICAgIHJldHVybiBjb250KGV4cHJlc3Npb24sIG1heWJldHlwZSwgZXhwZWN0KFwiXVwiKSwgaXNUUyA/IGNsYXNzZmllbGQgOiBmdW5jdGlvbmRlZiwgY2xhc3NCb2R5KVxuICAgIGlmICh2YWx1ZSA9PSBcIipcIikge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7XG4gICAgICByZXR1cm4gY29udChjbGFzc0JvZHkpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcIjtcIikgcmV0dXJuIGNvbnQoY2xhc3NCb2R5KTtcbiAgICBpZiAodHlwZSA9PSBcIn1cIikgcmV0dXJuIGNvbnQoKTtcbiAgICBpZiAodmFsdWUgPT0gXCJAXCIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGNsYXNzQm9keSlcbiAgfVxuICBmdW5jdGlvbiBjbGFzc2ZpZWxkKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiP1wiKSByZXR1cm4gY29udChjbGFzc2ZpZWxkKVxuICAgIGlmICh0eXBlID09IFwiOlwiKSByZXR1cm4gY29udCh0eXBlZXhwciwgbWF5YmVBc3NpZ24pXG4gICAgaWYgKHZhbHVlID09IFwiPVwiKSByZXR1cm4gY29udChleHByZXNzaW9uTm9Db21tYSlcbiAgICByZXR1cm4gcGFzcyhmdW5jdGlvbmRlZilcbiAgfVxuICBmdW5jdGlvbiBhZnRlckV4cG9ydCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIipcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQobWF5YmVGcm9tLCBleHBlY3QoXCI7XCIpKTsgfVxuICAgIGlmICh2YWx1ZSA9PSBcImRlZmF1bHRcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KFwiO1wiKSk7IH1cbiAgICBpZiAodHlwZSA9PSBcIntcIikgcmV0dXJuIGNvbnQoY29tbWFzZXAoZXhwb3J0RmllbGQsIFwifVwiKSwgbWF5YmVGcm9tLCBleHBlY3QoXCI7XCIpKTtcbiAgICByZXR1cm4gcGFzcyhzdGF0ZW1lbnQpO1xuICB9XG4gIGZ1bmN0aW9uIGV4cG9ydEZpZWxkKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiYXNcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQoZXhwZWN0KFwidmFyaWFibGVcIikpOyB9XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gcGFzcyhleHByZXNzaW9uTm9Db21tYSwgZXhwb3J0RmllbGQpO1xuICB9XG4gIGZ1bmN0aW9uIGFmdGVySW1wb3J0KHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udCgpO1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gcGFzcyhleHByZXNzaW9uKTtcbiAgICByZXR1cm4gcGFzcyhpbXBvcnRTcGVjLCBtYXliZU1vcmVJbXBvcnRzLCBtYXliZUZyb20pO1xuICB9XG4gIGZ1bmN0aW9uIGltcG9ydFNwZWModHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcIntcIikgcmV0dXJuIGNvbnRDb21tYXNlcChpbXBvcnRTcGVjLCBcIn1cIik7XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSByZWdpc3Rlcih2YWx1ZSk7XG4gICAgaWYgKHZhbHVlID09IFwiKlwiKSBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjtcbiAgICByZXR1cm4gY29udChtYXliZUFzKTtcbiAgfVxuICBmdW5jdGlvbiBtYXliZU1vcmVJbXBvcnRzKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIixcIikgcmV0dXJuIGNvbnQoaW1wb3J0U3BlYywgbWF5YmVNb3JlSW1wb3J0cylcbiAgfVxuICBmdW5jdGlvbiBtYXliZUFzKF90eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcImFzXCIpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGltcG9ydFNwZWMpOyB9XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVGcm9tKF90eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcImZyb21cIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7IH1cbiAgfVxuICBmdW5jdGlvbiBhcnJheUxpdGVyYWwodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwiXVwiKSByZXR1cm4gY29udCgpO1xuICAgIHJldHVybiBwYXNzKGNvbW1hc2VwKGV4cHJlc3Npb25Ob0NvbW1hLCBcIl1cIikpO1xuICB9XG4gIGZ1bmN0aW9uIGVudW1kZWYoKSB7XG4gICAgcmV0dXJuIHBhc3MocHVzaGxleChcImZvcm1cIiksIHBhdHRlcm4sIGV4cGVjdChcIntcIiksIHB1c2hsZXgoXCJ9XCIpLCBjb21tYXNlcChlbnVtbWVtYmVyLCBcIn1cIiksIHBvcGxleCwgcG9wbGV4KVxuICB9XG4gIGZ1bmN0aW9uIGVudW1tZW1iZXIoKSB7XG4gICAgcmV0dXJuIHBhc3MocGF0dGVybiwgbWF5YmVBc3NpZ24pO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNDb250aW51ZWRTdGF0ZW1lbnQoc3RhdGUsIHRleHRBZnRlcikge1xuICAgIHJldHVybiBzdGF0ZS5sYXN0VHlwZSA9PSBcIm9wZXJhdG9yXCIgfHwgc3RhdGUubGFzdFR5cGUgPT0gXCIsXCIgfHxcbiAgICAgIGlzT3BlcmF0b3JDaGFyLnRlc3QodGV4dEFmdGVyLmNoYXJBdCgwKSkgfHxcbiAgICAgIC9bLC5dLy50ZXN0KHRleHRBZnRlci5jaGFyQXQoMCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhwcmVzc2lvbkFsbG93ZWQoc3RyZWFtLCBzdGF0ZSwgYmFja1VwKSB7XG4gICAgcmV0dXJuIHN0YXRlLnRva2VuaXplID09IHRva2VuQmFzZSAmJlxuICAgICAgL14oPzpvcGVyYXRvcnxzb2Z8a2V5d29yZCBbYmNkXXxjYXNlfG5ld3xleHBvcnR8ZGVmYXVsdHxzcHJlYWR8W1xcW3t9XFwoLDs6XXw9PikkLy50ZXN0KHN0YXRlLmxhc3RUeXBlKSB8fFxuICAgICAgKHN0YXRlLmxhc3RUeXBlID09IFwicXVhc2lcIiAmJiAvXFx7XFxzKiQvLnRlc3Qoc3RyZWFtLnN0cmluZy5zbGljZSgwLCBzdHJlYW0ucG9zIC0gKGJhY2tVcCB8fCAwKSkpKVxuICB9XG5cbiAgLy8gSW50ZXJmYWNlXG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7XG4gICAgICB2YXIgc3RhdGUgPSB7XG4gICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsXG4gICAgICAgIGxhc3RUeXBlOiBcInNvZlwiLFxuICAgICAgICBjYzogW10sXG4gICAgICAgIGxleGljYWw6IG5ldyBKU0xleGljYWwoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCBcImJsb2NrXCIsIGZhbHNlKSxcbiAgICAgICAgbG9jYWxWYXJzOiBwYXJzZXJDb25maWcubG9jYWxWYXJzLFxuICAgICAgICBjb250ZXh0OiBwYXJzZXJDb25maWcubG9jYWxWYXJzICYmIHt2YXJzOiBwYXJzZXJDb25maWcubG9jYWxWYXJzfSxcbiAgICAgICAgaW5kZW50ZWQ6IGJhc2Vjb2x1bW4gfHwgMFxuICAgICAgfTtcbiAgICAgIGlmIChwYXJzZXJDb25maWcuZ2xvYmFsVmFycyAmJiB0eXBlb2YgcGFyc2VyQ29uZmlnLmdsb2JhbFZhcnMgPT0gXCJvYmplY3RcIilcbiAgICAgICAgc3RhdGUuZ2xvYmFsVmFycyA9IHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0sXG5cbiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgaWYgKHN0cmVhbS5zb2woKSkge1xuICAgICAgICBpZiAoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoXCJhbGlnblwiKSlcbiAgICAgICAgICBzdGF0ZS5sZXhpY2FsLmFsaWduID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7XG4gICAgICAgIGZpbmRGYXRBcnJvdyhzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkNvbW1lbnQgJiYgc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsO1xuICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBpZiAodHlwZSA9PSBcImNvbW1lbnRcIikgcmV0dXJuIHN0eWxlO1xuICAgICAgc3RhdGUubGFzdFR5cGUgPSB0eXBlID09IFwib3BlcmF0b3JcIiAmJiAoY29udGVudCA9PSBcIisrXCIgfHwgY29udGVudCA9PSBcIi0tXCIpID8gXCJpbmNkZWNcIiA6IHR5cGU7XG4gICAgICByZXR1cm4gcGFyc2VKUyhzdGF0ZSwgc3R5bGUsIHR5cGUsIGNvbnRlbnQsIHN0cmVhbSk7XG4gICAgfSxcblxuICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikge1xuICAgICAgaWYgKHN0YXRlLnRva2VuaXplID09IHRva2VuQ29tbWVudCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzcztcbiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UpIHJldHVybiAwO1xuICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApLCBsZXhpY2FsID0gc3RhdGUubGV4aWNhbCwgdG9wXG4gICAgICAvLyBLbHVkZ2UgdG8gcHJldmVudCAnbWF5YmVsc2UnIGZyb20gYmxvY2tpbmcgbGV4aWNhbCBzY29wZSBwb3BzXG4gICAgICBpZiAoIS9eXFxzKmVsc2VcXGIvLnRlc3QodGV4dEFmdGVyKSkgZm9yICh2YXIgaSA9IHN0YXRlLmNjLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBjID0gc3RhdGUuY2NbaV07XG4gICAgICAgIGlmIChjID09IHBvcGxleCkgbGV4aWNhbCA9IGxleGljYWwucHJldjtcbiAgICAgICAgZWxzZSBpZiAoYyAhPSBtYXliZWVsc2UpIGJyZWFrO1xuICAgICAgfVxuICAgICAgd2hpbGUgKChsZXhpY2FsLnR5cGUgPT0gXCJzdGF0XCIgfHwgbGV4aWNhbC50eXBlID09IFwiZm9ybVwiKSAmJlxuICAgICAgICAgICAgIChmaXJzdENoYXIgPT0gXCJ9XCIgfHwgKCh0b3AgPSBzdGF0ZS5jY1tzdGF0ZS5jYy5sZW5ndGggLSAxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvcCA9PSBtYXliZW9wZXJhdG9yQ29tbWEgfHwgdG9wID09IG1heWJlb3BlcmF0b3JOb0NvbW1hKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhL15bLFxcLj0rXFwtKjo/W1xcKF0vLnRlc3QodGV4dEFmdGVyKSkpKVxuICAgICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2O1xuICAgICAgaWYgKHN0YXRlbWVudEluZGVudCAmJiBsZXhpY2FsLnR5cGUgPT0gXCIpXCIgJiYgbGV4aWNhbC5wcmV2LnR5cGUgPT0gXCJzdGF0XCIpXG4gICAgICAgIGxleGljYWwgPSBsZXhpY2FsLnByZXY7XG4gICAgICB2YXIgdHlwZSA9IGxleGljYWwudHlwZSwgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSB0eXBlO1xuXG4gICAgICBpZiAodHlwZSA9PSBcInZhcmRlZlwiKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChzdGF0ZS5sYXN0VHlwZSA9PSBcIm9wZXJhdG9yXCIgfHwgc3RhdGUubGFzdFR5cGUgPT0gXCIsXCIgPyBsZXhpY2FsLmluZm8gKyAxIDogMCk7XG4gICAgICBlbHNlIGlmICh0eXBlID09IFwiZm9ybVwiICYmIGZpcnN0Q2hhciA9PSBcIntcIikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQ7XG4gICAgICBlbHNlIGlmICh0eXBlID09IFwiZm9ybVwiKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIGluZGVudFVuaXQ7XG4gICAgICBlbHNlIGlmICh0eXBlID09IFwic3RhdFwiKVxuICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChpc0NvbnRpbnVlZFN0YXRlbWVudChzdGF0ZSwgdGV4dEFmdGVyKSA/IHN0YXRlbWVudEluZGVudCB8fCBpbmRlbnRVbml0IDogMCk7XG4gICAgICBlbHNlIGlmIChsZXhpY2FsLmluZm8gPT0gXCJzd2l0Y2hcIiAmJiAhY2xvc2luZyAmJiBwYXJzZXJDb25maWcuZG91YmxlSW5kZW50U3dpdGNoICE9IGZhbHNlKVxuICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArICgvXig/OmNhc2V8ZGVmYXVsdClcXGIvLnRlc3QodGV4dEFmdGVyKSA/IGluZGVudFVuaXQgOiAyICogaW5kZW50VW5pdCk7XG4gICAgICBlbHNlIGlmIChsZXhpY2FsLmFsaWduKSByZXR1cm4gbGV4aWNhbC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTtcbiAgICAgIGVsc2UgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KTtcbiAgICB9LFxuXG4gICAgZWxlY3RyaWNJbnB1dDogL15cXHMqKD86Y2FzZSAuKj86fGRlZmF1bHQ6fFxce3xcXH0pJC8sXG4gICAgYmxvY2tDb21tZW50U3RhcnQ6IGpzb25Nb2RlID8gbnVsbCA6IFwiLypcIixcbiAgICBibG9ja0NvbW1lbnRFbmQ6IGpzb25Nb2RlID8gbnVsbCA6IFwiKi9cIixcbiAgICBibG9ja0NvbW1lbnRDb250aW51ZToganNvbk1vZGUgPyBudWxsIDogXCIgKiBcIixcbiAgICBsaW5lQ29tbWVudDoganNvbk1vZGUgPyBudWxsIDogXCIvL1wiLFxuICAgIGZvbGQ6IFwiYnJhY2VcIixcbiAgICBjbG9zZUJyYWNrZXRzOiBcIigpW117fScnXFxcIlxcXCJgYFwiLFxuXG4gICAgaGVscGVyVHlwZToganNvbk1vZGUgPyBcImpzb25cIiA6IFwiamF2YXNjcmlwdFwiLFxuICAgIGpzb25sZE1vZGU6IGpzb25sZE1vZGUsXG4gICAganNvbk1vZGU6IGpzb25Nb2RlLFxuXG4gICAgZXhwcmVzc2lvbkFsbG93ZWQ6IGV4cHJlc3Npb25BbGxvd2VkLFxuXG4gICAgc2tpcEV4cHJlc3Npb246IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgICB2YXIgdG9wID0gc3RhdGUuY2Nbc3RhdGUuY2MubGVuZ3RoIC0gMV1cbiAgICAgIGlmICh0b3AgPT0gZXhwcmVzc2lvbiB8fCB0b3AgPT0gZXhwcmVzc2lvbk5vQ29tbWEpIHN0YXRlLmNjLnBvcCgpXG4gICAgfVxuICB9O1xufSk7XG5cbkNvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoXCJ3b3JkQ2hhcnNcIiwgXCJqYXZhc2NyaXB0XCIsIC9bXFx3JF0vKTtcblxuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC9qYXZhc2NyaXB0XCIsIFwiamF2YXNjcmlwdFwiKTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQvZWNtYXNjcmlwdFwiLCBcImphdmFzY3JpcHRcIik7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIsIFwiamF2YXNjcmlwdFwiKTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiLCBcImphdmFzY3JpcHRcIik7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0XCIsIFwiamF2YXNjcmlwdFwiKTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL2pzb25cIiwge25hbWU6IFwiamF2YXNjcmlwdFwiLCBqc29uOiB0cnVlfSk7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi94LWpzb25cIiwge25hbWU6IFwiamF2YXNjcmlwdFwiLCBqc29uOiB0cnVlfSk7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi9sZCtqc29uXCIsIHtuYW1lOiBcImphdmFzY3JpcHRcIiwganNvbmxkOiB0cnVlfSk7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L3R5cGVzY3JpcHRcIiwgeyBuYW1lOiBcImphdmFzY3JpcHRcIiwgdHlwZXNjcmlwdDogdHJ1ZSB9KTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL3R5cGVzY3JpcHRcIiwgeyBuYW1lOiBcImphdmFzY3JpcHRcIiwgdHlwZXNjcmlwdDogdHJ1ZSB9KTtcblxufSk7XG4iLCIvKipcbiAqIFNsaWNlIHJlZmVyZW5jZS5cbiAqL1xuXG52YXIgc2xpY2UgPSBbXS5zbGljZTtcblxuLyoqXG4gKiBCaW5kIGBvYmpgIHRvIGBmbmAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZuIG9yIHN0cmluZ1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBmbil7XG4gIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZm4pIGZuID0gb2JqW2ZuXTtcbiAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIGZuKSB0aHJvdyBuZXcgRXJyb3IoJ2JpbmQoKSByZXF1aXJlcyBhIGZ1bmN0aW9uJyk7XG4gIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICByZXR1cm4gZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gZm4uYXBwbHkob2JqLCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgfVxufTtcbiIsIlxyXG4vKipcclxuICogRXhwb3NlIGBFbWl0dGVyYC5cclxuICovXHJcblxyXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICBtb2R1bGUuZXhwb3J0cyA9IEVtaXR0ZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbml0aWFsaXplIGEgbmV3IGBFbWl0dGVyYC5cclxuICpcclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5mdW5jdGlvbiBFbWl0dGVyKG9iaikge1xyXG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIE1peGluIHRoZSBlbWl0dGVyIHByb3BlcnRpZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcclxuICogQHJldHVybiB7T2JqZWN0fVxyXG4gKiBAYXBpIHByaXZhdGVcclxuICovXHJcblxyXG5mdW5jdGlvbiBtaXhpbihvYmopIHtcclxuICBmb3IgKHZhciBrZXkgaW4gRW1pdHRlci5wcm90b3R5cGUpIHtcclxuICAgIG9ialtrZXldID0gRW1pdHRlci5wcm90b3R5cGVba2V5XTtcclxuICB9XHJcbiAgcmV0dXJuIG9iajtcclxufVxyXG5cclxuLyoqXHJcbiAqIExpc3RlbiBvbiB0aGUgZ2l2ZW4gYGV2ZW50YCB3aXRoIGBmbmAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxyXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLm9uID1cclxuRW1pdHRlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG4gICh0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXSlcclxuICAgIC5wdXNoKGZuKTtcclxuICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGFuIGBldmVudGAgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgYSBzaW5nbGVcclxuICogdGltZSB0aGVuIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XHJcbiAgZnVuY3Rpb24gb24oKSB7XHJcbiAgICB0aGlzLm9mZihldmVudCwgb24pO1xyXG4gICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICB9XHJcblxyXG4gIG9uLmZuID0gZm47XHJcbiAgdGhpcy5vbihldmVudCwgb24pO1xyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGBldmVudGAgb3IgYWxsXHJcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cclxuICogQHJldHVybiB7RW1pdHRlcn1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5vZmYgPVxyXG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XHJcbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XHJcbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xyXG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcclxuXHJcbiAgLy8gYWxsXHJcbiAgaWYgKDAgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgdGhpcy5fY2FsbGJhY2tzID0ge307XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vIHNwZWNpZmljIGV2ZW50XHJcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XHJcbiAgaWYgKCFjYWxsYmFja3MpIHJldHVybiB0aGlzO1xyXG5cclxuICAvLyByZW1vdmUgYWxsIGhhbmRsZXJzXHJcbiAgaWYgKDEgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vIHJlbW92ZSBzcGVjaWZpYyBoYW5kbGVyXHJcbiAgdmFyIGNiO1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjYiA9IGNhbGxiYWNrc1tpXTtcclxuICAgIGlmIChjYiA9PT0gZm4gfHwgY2IuZm4gPT09IGZuKSB7XHJcbiAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBFbWl0IGBldmVudGAgd2l0aCB0aGUgZ2l2ZW4gYXJncy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEBwYXJhbSB7TWl4ZWR9IC4uLlxyXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXHJcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XHJcblxyXG4gIGlmIChjYWxsYmFja3MpIHtcclxuICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcclxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcclxuICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJuIGFycmF5IG9mIGNhbGxiYWNrcyBmb3IgYGV2ZW50YC5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEByZXR1cm4ge0FycmF5fVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcbiAgcmV0dXJuIHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gfHwgW107XHJcbn07XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhpcyBlbWl0dGVyIGhhcyBgZXZlbnRgIGhhbmRsZXJzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHJldHVybiB7Qm9vbGVhbn1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XHJcbiAgcmV0dXJuICEhIHRoaXMubGlzdGVuZXJzKGV2ZW50KS5sZW5ndGg7XHJcbn07XHJcbiIsIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhLCBiKXtcbiAgdmFyIGZuID0gZnVuY3Rpb24oKXt9O1xuICBmbi5wcm90b3R5cGUgPSBiLnByb3RvdHlwZTtcbiAgYS5wcm90b3R5cGUgPSBuZXcgZm47XG4gIGEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gYTtcbn07IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlcjtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKCg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgaWYgKG1zID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtcyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHJldHVybiBwbHVyYWwobXMsIGQsICdkYXknKSB8fFxuICAgIHBsdXJhbChtcywgaCwgJ2hvdXInKSB8fFxuICAgIHBsdXJhbChtcywgbSwgJ21pbnV0ZScpIHx8XG4gICAgcGx1cmFsKG1zLCBzLCAnc2Vjb25kJykgfHxcbiAgICBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbiwgbmFtZSkge1xuICBpZiAobXMgPCBuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChtcyA8IG4gKiAxLjUpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihtcyAvIG4pICsgJyAnICsgbmFtZTtcbiAgfVxuICByZXR1cm4gTWF0aC5jZWlsKG1zIC8gbikgKyAnICcgKyBuYW1lICsgJ3MnO1xufVxuIiwiLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGVidWcnKTtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lXG4gICAgICAgICAgICAgICAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lLnN0b3JhZ2VcbiAgICAgICAgICAgICAgICAgID8gY2hyb21lLnN0b3JhZ2UubG9jYWxcbiAgICAgICAgICAgICAgICAgIDogbG9jYWxzdG9yYWdlKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuICAnbGlnaHRzZWFncmVlbicsXG4gICdmb3Jlc3RncmVlbicsXG4gICdnb2xkZW5yb2QnLFxuICAnZG9kZ2VyYmx1ZScsXG4gICdkYXJrb3JjaGlkJyxcbiAgJ2NyaW1zb24nXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgLy8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuICAvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuICAvLyBleHBsaWNpdGx5XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBpcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuICAvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuICByZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcbiAgICAvLyBpcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG4gICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcbiAgICAvLyBpcyBmaXJlZm94ID49IHYzMT9cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcbiAgICAvLyBkb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbih2KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyLm1lc3NhZ2U7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcbiAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG4gIGFyZ3NbMF0gPSAodXNlQ29sb3JzID8gJyVjJyA6ICcnKVxuICAgICsgdGhpcy5uYW1lc3BhY2VcbiAgICArICh1c2VDb2xvcnMgPyAnICVjJyA6ICcgJylcbiAgICArIGFyZ3NbMF1cbiAgICArICh1c2VDb2xvcnMgPyAnJWMgJyA6ICcgJylcbiAgICArICcrJyArIGV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuICBpZiAoIXVzZUNvbG9ycykgcmV0dXJuO1xuXG4gIHZhciBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcbiAgYXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0JylcblxuICAvLyB0aGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuICAvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG4gIC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEMgPSAwO1xuICBhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICBpZiAoJyUlJyA9PT0gbWF0Y2gpIHJldHVybjtcbiAgICBpbmRleCsrO1xuICAgIGlmICgnJWMnID09PSBtYXRjaCkge1xuICAgICAgLy8gd2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG4gICAgICAvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuICAgICAgbGFzdEMgPSBpbmRleDtcbiAgICB9XG4gIH0pO1xuXG4gIGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmxvZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUubG9nYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBsb2coKSB7XG4gIC8vIHRoaXMgaGFja2VyeSBpcyByZXF1aXJlZCBmb3IgSUU4LzksIHdoZXJlXG4gIC8vIHRoZSBgY29uc29sZS5sb2dgIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSAnYXBwbHknXG4gIHJldHVybiAnb2JqZWN0JyA9PT0gdHlwZW9mIGNvbnNvbGVcbiAgICAmJiBjb25zb2xlLmxvZ1xuICAgICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGUubG9nLCBjb25zb2xlLCBhcmd1bWVudHMpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcbiAgdHJ5IHtcbiAgICBpZiAobnVsbCA9PSBuYW1lc3BhY2VzKSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLmRlYnVnID0gbmFtZXNwYWNlcztcbiAgICB9XG4gIH0gY2F0Y2goZSkge31cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuICB2YXIgcjtcbiAgdHJ5IHtcbiAgICByID0gZXhwb3J0cy5zdG9yYWdlLmRlYnVnO1xuICB9IGNhdGNoKGUpIHt9XG5cbiAgLy8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuICBpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcbiAgICByID0gcHJvY2Vzcy5lbnYuREVCVUc7XG4gIH1cblxuICByZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBFbmFibGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gYGxvY2FsU3RvcmFnZS5kZWJ1Z2AgaW5pdGlhbGx5LlxuICovXG5cbmV4cG9ydHMuZW5hYmxlKGxvYWQoKSk7XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICB9IGNhdGNoIChlKSB7fVxufVxuIiwiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWdbJ2RlZmF1bHQnXSA9IGNyZWF0ZURlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG4gKi9cblxuZXhwb3J0cy5uYW1lcyA9IFtdO1xuZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cbiAqXG4gKiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzID0ge307XG5cbi8qKlxuICogUHJldmlvdXMgbG9nIHRpbWVzdGFtcC5cbiAqL1xuXG52YXIgcHJldlRpbWU7XG5cbi8qKlxuICogU2VsZWN0IGEgY29sb3IuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcbiAgdmFyIGhhc2ggPSAwLCBpO1xuXG4gIGZvciAoaSBpbiBuYW1lc3BhY2UpIHtcbiAgICBoYXNoICA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGV4cG9ydHMuY29sb3JzLmxlbmd0aF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXG4gIGZ1bmN0aW9uIGRlYnVnKCkge1xuICAgIC8vIGRpc2FibGVkP1xuICAgIGlmICghZGVidWcuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgdmFyIHNlbGYgPSBkZWJ1ZztcblxuICAgIC8vIHNldCBgZGlmZmAgdGltZXN0YW1wXG4gICAgdmFyIGN1cnIgPSArbmV3IERhdGUoKTtcbiAgICB2YXIgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuICAgIHNlbGYuZGlmZiA9IG1zO1xuICAgIHNlbGYucHJldiA9IHByZXZUaW1lO1xuICAgIHNlbGYuY3VyciA9IGN1cnI7XG4gICAgcHJldlRpbWUgPSBjdXJyO1xuXG4gICAgLy8gdHVybiB0aGUgYGFyZ3VtZW50c2AgaW50byBhIHByb3BlciBBcnJheVxuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBhcmdzWzBdID0gZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7XG5cbiAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhcmdzWzBdKSB7XG4gICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuICAgICAgYXJncy51bnNoaWZ0KCclTycpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgZnVuY3Rpb24obWF0Y2gsIGZvcm1hdCkge1xuICAgICAgLy8gaWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuICAgICAgaWYgKG1hdGNoID09PSAnJSUnKSByZXR1cm4gbWF0Y2g7XG4gICAgICBpbmRleCsrO1xuICAgICAgdmFyIGZvcm1hdHRlciA9IGV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIHZhbCA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICBtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cbiAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICAvLyBhcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuICAgIGV4cG9ydHMuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG4gICAgdmFyIGxvZ0ZuID0gZGVidWcubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgbG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cblxuICBkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIGRlYnVnLmVuYWJsZWQgPSBleHBvcnRzLmVuYWJsZWQobmFtZXNwYWNlKTtcbiAgZGVidWcudXNlQ29sb3JzID0gZXhwb3J0cy51c2VDb2xvcnMoKTtcbiAgZGVidWcuY29sb3IgPSBzZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXG4gIC8vIGVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5pbml0KSB7XG4gICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcbiAgfVxuXG4gIHJldHVybiBkZWJ1Zztcbn1cblxuLyoqXG4gKiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG4gKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuICBleHBvcnRzLm5hbWVzID0gW107XG4gIGV4cG9ydHMuc2tpcHMgPSBbXTtcblxuICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3NcbiAgICBuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcbiAgICBpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG4gICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICBleHBvcnRzLmVuYWJsZSgnJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcbiAgdmFyIGksIGxlbjtcbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcbiAgcmV0dXJuIHZhbDtcbn1cbiIsIlxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3NvY2tldCcpO1xuXG4vKipcbiAqIEV4cG9ydHMgcGFyc2VyXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzLnBhcnNlciA9IHJlcXVpcmUoJ2VuZ2luZS5pby1wYXJzZXInKTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdHJhbnNwb3J0cyA9IHJlcXVpcmUoJy4vdHJhbnNwb3J0cy9pbmRleCcpO1xudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCdjb21wb25lbnQtZW1pdHRlcicpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZW5naW5lLmlvLWNsaWVudDpzb2NrZXQnKTtcbnZhciBpbmRleCA9IHJlcXVpcmUoJ2luZGV4b2YnKTtcbnZhciBwYXJzZXIgPSByZXF1aXJlKCdlbmdpbmUuaW8tcGFyc2VyJyk7XG52YXIgcGFyc2V1cmkgPSByZXF1aXJlKCdwYXJzZXVyaScpO1xudmFyIHBhcnNlcXMgPSByZXF1aXJlKCdwYXJzZXFzJyk7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBTb2NrZXQ7XG5cbi8qKlxuICogU29ja2V0IGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdXJpIG9yIG9wdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFNvY2tldCAodXJpLCBvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTb2NrZXQpKSByZXR1cm4gbmV3IFNvY2tldCh1cmksIG9wdHMpO1xuXG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIGlmICh1cmkgJiYgJ29iamVjdCcgPT09IHR5cGVvZiB1cmkpIHtcbiAgICBvcHRzID0gdXJpO1xuICAgIHVyaSA9IG51bGw7XG4gIH1cblxuICBpZiAodXJpKSB7XG4gICAgdXJpID0gcGFyc2V1cmkodXJpKTtcbiAgICBvcHRzLmhvc3RuYW1lID0gdXJpLmhvc3Q7XG4gICAgb3B0cy5zZWN1cmUgPSB1cmkucHJvdG9jb2wgPT09ICdodHRwcycgfHwgdXJpLnByb3RvY29sID09PSAnd3NzJztcbiAgICBvcHRzLnBvcnQgPSB1cmkucG9ydDtcbiAgICBpZiAodXJpLnF1ZXJ5KSBvcHRzLnF1ZXJ5ID0gdXJpLnF1ZXJ5O1xuICB9IGVsc2UgaWYgKG9wdHMuaG9zdCkge1xuICAgIG9wdHMuaG9zdG5hbWUgPSBwYXJzZXVyaShvcHRzLmhvc3QpLmhvc3Q7XG4gIH1cblxuICB0aGlzLnNlY3VyZSA9IG51bGwgIT0gb3B0cy5zZWN1cmUgPyBvcHRzLnNlY3VyZVxuICAgIDogKGdsb2JhbC5sb2NhdGlvbiAmJiAnaHR0cHM6JyA9PT0gbG9jYXRpb24ucHJvdG9jb2wpO1xuXG4gIGlmIChvcHRzLmhvc3RuYW1lICYmICFvcHRzLnBvcnQpIHtcbiAgICAvLyBpZiBubyBwb3J0IGlzIHNwZWNpZmllZCBtYW51YWxseSwgdXNlIHRoZSBwcm90b2NvbCBkZWZhdWx0XG4gICAgb3B0cy5wb3J0ID0gdGhpcy5zZWN1cmUgPyAnNDQzJyA6ICc4MCc7XG4gIH1cblxuICB0aGlzLmFnZW50ID0gb3B0cy5hZ2VudCB8fCBmYWxzZTtcbiAgdGhpcy5ob3N0bmFtZSA9IG9wdHMuaG9zdG5hbWUgfHxcbiAgICAoZ2xvYmFsLmxvY2F0aW9uID8gbG9jYXRpb24uaG9zdG5hbWUgOiAnbG9jYWxob3N0Jyk7XG4gIHRoaXMucG9ydCA9IG9wdHMucG9ydCB8fCAoZ2xvYmFsLmxvY2F0aW9uICYmIGxvY2F0aW9uLnBvcnRcbiAgICAgID8gbG9jYXRpb24ucG9ydFxuICAgICAgOiAodGhpcy5zZWN1cmUgPyA0NDMgOiA4MCkpO1xuICB0aGlzLnF1ZXJ5ID0gb3B0cy5xdWVyeSB8fCB7fTtcbiAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgdGhpcy5xdWVyeSkgdGhpcy5xdWVyeSA9IHBhcnNlcXMuZGVjb2RlKHRoaXMucXVlcnkpO1xuICB0aGlzLnVwZ3JhZGUgPSBmYWxzZSAhPT0gb3B0cy51cGdyYWRlO1xuICB0aGlzLnBhdGggPSAob3B0cy5wYXRoIHx8ICcvZW5naW5lLmlvJykucmVwbGFjZSgvXFwvJC8sICcnKSArICcvJztcbiAgdGhpcy5mb3JjZUpTT05QID0gISFvcHRzLmZvcmNlSlNPTlA7XG4gIHRoaXMuanNvbnAgPSBmYWxzZSAhPT0gb3B0cy5qc29ucDtcbiAgdGhpcy5mb3JjZUJhc2U2NCA9ICEhb3B0cy5mb3JjZUJhc2U2NDtcbiAgdGhpcy5lbmFibGVzWERSID0gISFvcHRzLmVuYWJsZXNYRFI7XG4gIHRoaXMudGltZXN0YW1wUGFyYW0gPSBvcHRzLnRpbWVzdGFtcFBhcmFtIHx8ICd0JztcbiAgdGhpcy50aW1lc3RhbXBSZXF1ZXN0cyA9IG9wdHMudGltZXN0YW1wUmVxdWVzdHM7XG4gIHRoaXMudHJhbnNwb3J0cyA9IG9wdHMudHJhbnNwb3J0cyB8fCBbJ3BvbGxpbmcnLCAnd2Vic29ja2V0J107XG4gIHRoaXMudHJhbnNwb3J0T3B0aW9ucyA9IG9wdHMudHJhbnNwb3J0T3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5yZWFkeVN0YXRlID0gJyc7XG4gIHRoaXMud3JpdGVCdWZmZXIgPSBbXTtcbiAgdGhpcy5wcmV2QnVmZmVyTGVuID0gMDtcbiAgdGhpcy5wb2xpY3lQb3J0ID0gb3B0cy5wb2xpY3lQb3J0IHx8IDg0MztcbiAgdGhpcy5yZW1lbWJlclVwZ3JhZGUgPSBvcHRzLnJlbWVtYmVyVXBncmFkZSB8fCBmYWxzZTtcbiAgdGhpcy5iaW5hcnlUeXBlID0gbnVsbDtcbiAgdGhpcy5vbmx5QmluYXJ5VXBncmFkZXMgPSBvcHRzLm9ubHlCaW5hcnlVcGdyYWRlcztcbiAgdGhpcy5wZXJNZXNzYWdlRGVmbGF0ZSA9IGZhbHNlICE9PSBvcHRzLnBlck1lc3NhZ2VEZWZsYXRlID8gKG9wdHMucGVyTWVzc2FnZURlZmxhdGUgfHwge30pIDogZmFsc2U7XG5cbiAgaWYgKHRydWUgPT09IHRoaXMucGVyTWVzc2FnZURlZmxhdGUpIHRoaXMucGVyTWVzc2FnZURlZmxhdGUgPSB7fTtcbiAgaWYgKHRoaXMucGVyTWVzc2FnZURlZmxhdGUgJiYgbnVsbCA9PSB0aGlzLnBlck1lc3NhZ2VEZWZsYXRlLnRocmVzaG9sZCkge1xuICAgIHRoaXMucGVyTWVzc2FnZURlZmxhdGUudGhyZXNob2xkID0gMTAyNDtcbiAgfVxuXG4gIC8vIFNTTCBvcHRpb25zIGZvciBOb2RlLmpzIGNsaWVudFxuICB0aGlzLnBmeCA9IG9wdHMucGZ4IHx8IG51bGw7XG4gIHRoaXMua2V5ID0gb3B0cy5rZXkgfHwgbnVsbDtcbiAgdGhpcy5wYXNzcGhyYXNlID0gb3B0cy5wYXNzcGhyYXNlIHx8IG51bGw7XG4gIHRoaXMuY2VydCA9IG9wdHMuY2VydCB8fCBudWxsO1xuICB0aGlzLmNhID0gb3B0cy5jYSB8fCBudWxsO1xuICB0aGlzLmNpcGhlcnMgPSBvcHRzLmNpcGhlcnMgfHwgbnVsbDtcbiAgdGhpcy5yZWplY3RVbmF1dGhvcml6ZWQgPSBvcHRzLnJlamVjdFVuYXV0aG9yaXplZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdHMucmVqZWN0VW5hdXRob3JpemVkO1xuICB0aGlzLmZvcmNlTm9kZSA9ICEhb3B0cy5mb3JjZU5vZGU7XG5cbiAgLy8gb3RoZXIgb3B0aW9ucyBmb3IgTm9kZS5qcyBjbGllbnRcbiAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG4gIGlmIChmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCkge1xuICAgIGlmIChvcHRzLmV4dHJhSGVhZGVycyAmJiBPYmplY3Qua2V5cyhvcHRzLmV4dHJhSGVhZGVycykubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5leHRyYUhlYWRlcnMgPSBvcHRzLmV4dHJhSGVhZGVycztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5sb2NhbEFkZHJlc3MpIHtcbiAgICAgIHRoaXMubG9jYWxBZGRyZXNzID0gb3B0cy5sb2NhbEFkZHJlc3M7XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0IG9uIGhhbmRzaGFrZVxuICB0aGlzLmlkID0gbnVsbDtcbiAgdGhpcy51cGdyYWRlcyA9IG51bGw7XG4gIHRoaXMucGluZ0ludGVydmFsID0gbnVsbDtcbiAgdGhpcy5waW5nVGltZW91dCA9IG51bGw7XG5cbiAgLy8gc2V0IG9uIGhlYXJ0YmVhdFxuICB0aGlzLnBpbmdJbnRlcnZhbFRpbWVyID0gbnVsbDtcbiAgdGhpcy5waW5nVGltZW91dFRpbWVyID0gbnVsbDtcblxuICB0aGlzLm9wZW4oKTtcbn1cblxuU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuXG4vKipcbiAqIE1peCBpbiBgRW1pdHRlcmAuXG4gKi9cblxuRW1pdHRlcihTb2NrZXQucHJvdG90eXBlKTtcblxuLyoqXG4gKiBQcm90b2NvbCB2ZXJzaW9uLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU29ja2V0LnByb3RvY29sID0gcGFyc2VyLnByb3RvY29sOyAvLyB0aGlzIGlzIGFuIGludFxuXG4vKipcbiAqIEV4cG9zZSBkZXBzIGZvciBsZWdhY3kgY29tcGF0aWJpbGl0eVxuICogYW5kIHN0YW5kYWxvbmUgYnJvd3NlciBhY2Nlc3MuXG4gKi9cblxuU29ja2V0LlNvY2tldCA9IFNvY2tldDtcblNvY2tldC5UcmFuc3BvcnQgPSByZXF1aXJlKCcuL3RyYW5zcG9ydCcpO1xuU29ja2V0LnRyYW5zcG9ydHMgPSByZXF1aXJlKCcuL3RyYW5zcG9ydHMvaW5kZXgnKTtcblNvY2tldC5wYXJzZXIgPSByZXF1aXJlKCdlbmdpbmUuaW8tcGFyc2VyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyB0cmFuc3BvcnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRyYW5zcG9ydCBuYW1lXG4gKiBAcmV0dXJuIHtUcmFuc3BvcnR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLmNyZWF0ZVRyYW5zcG9ydCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGRlYnVnKCdjcmVhdGluZyB0cmFuc3BvcnQgXCIlc1wiJywgbmFtZSk7XG4gIHZhciBxdWVyeSA9IGNsb25lKHRoaXMucXVlcnkpO1xuXG4gIC8vIGFwcGVuZCBlbmdpbmUuaW8gcHJvdG9jb2wgaWRlbnRpZmllclxuICBxdWVyeS5FSU8gPSBwYXJzZXIucHJvdG9jb2w7XG5cbiAgLy8gdHJhbnNwb3J0IG5hbWVcbiAgcXVlcnkudHJhbnNwb3J0ID0gbmFtZTtcblxuICAvLyBwZXItdHJhbnNwb3J0IG9wdGlvbnNcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLnRyYW5zcG9ydE9wdGlvbnNbbmFtZV0gfHwge307XG5cbiAgLy8gc2Vzc2lvbiBpZCBpZiB3ZSBhbHJlYWR5IGhhdmUgb25lXG4gIGlmICh0aGlzLmlkKSBxdWVyeS5zaWQgPSB0aGlzLmlkO1xuXG4gIHZhciB0cmFuc3BvcnQgPSBuZXcgdHJhbnNwb3J0c1tuYW1lXSh7XG4gICAgcXVlcnk6IHF1ZXJ5LFxuICAgIHNvY2tldDogdGhpcyxcbiAgICBhZ2VudDogb3B0aW9ucy5hZ2VudCB8fCB0aGlzLmFnZW50LFxuICAgIGhvc3RuYW1lOiBvcHRpb25zLmhvc3RuYW1lIHx8IHRoaXMuaG9zdG5hbWUsXG4gICAgcG9ydDogb3B0aW9ucy5wb3J0IHx8IHRoaXMucG9ydCxcbiAgICBzZWN1cmU6IG9wdGlvbnMuc2VjdXJlIHx8IHRoaXMuc2VjdXJlLFxuICAgIHBhdGg6IG9wdGlvbnMucGF0aCB8fCB0aGlzLnBhdGgsXG4gICAgZm9yY2VKU09OUDogb3B0aW9ucy5mb3JjZUpTT05QIHx8IHRoaXMuZm9yY2VKU09OUCxcbiAgICBqc29ucDogb3B0aW9ucy5qc29ucCB8fCB0aGlzLmpzb25wLFxuICAgIGZvcmNlQmFzZTY0OiBvcHRpb25zLmZvcmNlQmFzZTY0IHx8IHRoaXMuZm9yY2VCYXNlNjQsXG4gICAgZW5hYmxlc1hEUjogb3B0aW9ucy5lbmFibGVzWERSIHx8IHRoaXMuZW5hYmxlc1hEUixcbiAgICB0aW1lc3RhbXBSZXF1ZXN0czogb3B0aW9ucy50aW1lc3RhbXBSZXF1ZXN0cyB8fCB0aGlzLnRpbWVzdGFtcFJlcXVlc3RzLFxuICAgIHRpbWVzdGFtcFBhcmFtOiBvcHRpb25zLnRpbWVzdGFtcFBhcmFtIHx8IHRoaXMudGltZXN0YW1wUGFyYW0sXG4gICAgcG9saWN5UG9ydDogb3B0aW9ucy5wb2xpY3lQb3J0IHx8IHRoaXMucG9saWN5UG9ydCxcbiAgICBwZng6IG9wdGlvbnMucGZ4IHx8IHRoaXMucGZ4LFxuICAgIGtleTogb3B0aW9ucy5rZXkgfHwgdGhpcy5rZXksXG4gICAgcGFzc3BocmFzZTogb3B0aW9ucy5wYXNzcGhyYXNlIHx8IHRoaXMucGFzc3BocmFzZSxcbiAgICBjZXJ0OiBvcHRpb25zLmNlcnQgfHwgdGhpcy5jZXJ0LFxuICAgIGNhOiBvcHRpb25zLmNhIHx8IHRoaXMuY2EsXG4gICAgY2lwaGVyczogb3B0aW9ucy5jaXBoZXJzIHx8IHRoaXMuY2lwaGVycyxcbiAgICByZWplY3RVbmF1dGhvcml6ZWQ6IG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkIHx8IHRoaXMucmVqZWN0VW5hdXRob3JpemVkLFxuICAgIHBlck1lc3NhZ2VEZWZsYXRlOiBvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlIHx8IHRoaXMucGVyTWVzc2FnZURlZmxhdGUsXG4gICAgZXh0cmFIZWFkZXJzOiBvcHRpb25zLmV4dHJhSGVhZGVycyB8fCB0aGlzLmV4dHJhSGVhZGVycyxcbiAgICBmb3JjZU5vZGU6IG9wdGlvbnMuZm9yY2VOb2RlIHx8IHRoaXMuZm9yY2VOb2RlLFxuICAgIGxvY2FsQWRkcmVzczogb3B0aW9ucy5sb2NhbEFkZHJlc3MgfHwgdGhpcy5sb2NhbEFkZHJlc3MsXG4gICAgcmVxdWVzdFRpbWVvdXQ6IG9wdGlvbnMucmVxdWVzdFRpbWVvdXQgfHwgdGhpcy5yZXF1ZXN0VGltZW91dCxcbiAgICBwcm90b2NvbHM6IG9wdGlvbnMucHJvdG9jb2xzIHx8IHZvaWQgKDApXG4gIH0pO1xuXG4gIHJldHVybiB0cmFuc3BvcnQ7XG59O1xuXG5mdW5jdGlvbiBjbG9uZSAob2JqKSB7XG4gIHZhciBvID0ge307XG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgb1tpXSA9IG9ialtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG87XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdHJhbnNwb3J0IHRvIHVzZSBhbmQgc3RhcnRzIHByb2JlLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5Tb2NrZXQucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0cmFuc3BvcnQ7XG4gIGlmICh0aGlzLnJlbWVtYmVyVXBncmFkZSAmJiBTb2NrZXQucHJpb3JXZWJzb2NrZXRTdWNjZXNzICYmIHRoaXMudHJhbnNwb3J0cy5pbmRleE9mKCd3ZWJzb2NrZXQnKSAhPT0gLTEpIHtcbiAgICB0cmFuc3BvcnQgPSAnd2Vic29ja2V0JztcbiAgfSBlbHNlIGlmICgwID09PSB0aGlzLnRyYW5zcG9ydHMubGVuZ3RoKSB7XG4gICAgLy8gRW1pdCBlcnJvciBvbiBuZXh0IHRpY2sgc28gaXQgY2FuIGJlIGxpc3RlbmVkIHRvXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsICdObyB0cmFuc3BvcnRzIGF2YWlsYWJsZScpO1xuICAgIH0sIDApO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIHtcbiAgICB0cmFuc3BvcnQgPSB0aGlzLnRyYW5zcG9ydHNbMF07XG4gIH1cbiAgdGhpcy5yZWFkeVN0YXRlID0gJ29wZW5pbmcnO1xuXG4gIC8vIFJldHJ5IHdpdGggdGhlIG5leHQgdHJhbnNwb3J0IGlmIHRoZSB0cmFuc3BvcnQgaXMgZGlzYWJsZWQgKGpzb25wOiBmYWxzZSlcbiAgdHJ5IHtcbiAgICB0cmFuc3BvcnQgPSB0aGlzLmNyZWF0ZVRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy50cmFuc3BvcnRzLnNoaWZ0KCk7XG4gICAgdGhpcy5vcGVuKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJhbnNwb3J0Lm9wZW4oKTtcbiAgdGhpcy5zZXRUcmFuc3BvcnQodHJhbnNwb3J0KTtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgY3VycmVudCB0cmFuc3BvcnQuIERpc2FibGVzIHRoZSBleGlzdGluZyBvbmUgKGlmIGFueSkuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5zZXRUcmFuc3BvcnQgPSBmdW5jdGlvbiAodHJhbnNwb3J0KSB7XG4gIGRlYnVnKCdzZXR0aW5nIHRyYW5zcG9ydCAlcycsIHRyYW5zcG9ydC5uYW1lKTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGlmICh0aGlzLnRyYW5zcG9ydCkge1xuICAgIGRlYnVnKCdjbGVhcmluZyBleGlzdGluZyB0cmFuc3BvcnQgJXMnLCB0aGlzLnRyYW5zcG9ydC5uYW1lKTtcbiAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIHNldCB1cCB0cmFuc3BvcnRcbiAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG5cbiAgLy8gc2V0IHVwIHRyYW5zcG9ydCBsaXN0ZW5lcnNcbiAgdHJhbnNwb3J0XG4gIC5vbignZHJhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5vbkRyYWluKCk7XG4gIH0pXG4gIC5vbigncGFja2V0JywgZnVuY3Rpb24gKHBhY2tldCkge1xuICAgIHNlbGYub25QYWNrZXQocGFja2V0KTtcbiAgfSlcbiAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgc2VsZi5vbkVycm9yKGUpO1xuICB9KVxuICAub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIHNlbGYub25DbG9zZSgndHJhbnNwb3J0IGNsb3NlJyk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBQcm9iZXMgYSB0cmFuc3BvcnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRyYW5zcG9ydCBuYW1lXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLnByb2JlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgZGVidWcoJ3Byb2JpbmcgdHJhbnNwb3J0IFwiJXNcIicsIG5hbWUpO1xuICB2YXIgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobmFtZSwgeyBwcm9iZTogMSB9KTtcbiAgdmFyIGZhaWxlZCA9IGZhbHNlO1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIG9uVHJhbnNwb3J0T3BlbiAoKSB7XG4gICAgaWYgKHNlbGYub25seUJpbmFyeVVwZ3JhZGVzKSB7XG4gICAgICB2YXIgdXBncmFkZUxvc2VzQmluYXJ5ID0gIXRoaXMuc3VwcG9ydHNCaW5hcnkgJiYgc2VsZi50cmFuc3BvcnQuc3VwcG9ydHNCaW5hcnk7XG4gICAgICBmYWlsZWQgPSBmYWlsZWQgfHwgdXBncmFkZUxvc2VzQmluYXJ5O1xuICAgIH1cbiAgICBpZiAoZmFpbGVkKSByZXR1cm47XG5cbiAgICBkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBvcGVuZWQnLCBuYW1lKTtcbiAgICB0cmFuc3BvcnQuc2VuZChbeyB0eXBlOiAncGluZycsIGRhdGE6ICdwcm9iZScgfV0pO1xuICAgIHRyYW5zcG9ydC5vbmNlKCdwYWNrZXQnLCBmdW5jdGlvbiAobXNnKSB7XG4gICAgICBpZiAoZmFpbGVkKSByZXR1cm47XG4gICAgICBpZiAoJ3BvbmcnID09PSBtc2cudHlwZSAmJiAncHJvYmUnID09PSBtc2cuZGF0YSkge1xuICAgICAgICBkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBwb25nJywgbmFtZSk7XG4gICAgICAgIHNlbGYudXBncmFkaW5nID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5lbWl0KCd1cGdyYWRpbmcnLCB0cmFuc3BvcnQpO1xuICAgICAgICBpZiAoIXRyYW5zcG9ydCkgcmV0dXJuO1xuICAgICAgICBTb2NrZXQucHJpb3JXZWJzb2NrZXRTdWNjZXNzID0gJ3dlYnNvY2tldCcgPT09IHRyYW5zcG9ydC5uYW1lO1xuXG4gICAgICAgIGRlYnVnKCdwYXVzaW5nIGN1cnJlbnQgdHJhbnNwb3J0IFwiJXNcIicsIHNlbGYudHJhbnNwb3J0Lm5hbWUpO1xuICAgICAgICBzZWxmLnRyYW5zcG9ydC5wYXVzZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGZhaWxlZCkgcmV0dXJuO1xuICAgICAgICAgIGlmICgnY2xvc2VkJyA9PT0gc2VsZi5yZWFkeVN0YXRlKSByZXR1cm47XG4gICAgICAgICAgZGVidWcoJ2NoYW5naW5nIHRyYW5zcG9ydCBhbmQgc2VuZGluZyB1cGdyYWRlIHBhY2tldCcpO1xuXG4gICAgICAgICAgY2xlYW51cCgpO1xuXG4gICAgICAgICAgc2VsZi5zZXRUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICAgICAgICB0cmFuc3BvcnQuc2VuZChbeyB0eXBlOiAndXBncmFkZScgfV0pO1xuICAgICAgICAgIHNlbGYuZW1pdCgndXBncmFkZScsIHRyYW5zcG9ydCk7XG4gICAgICAgICAgdHJhbnNwb3J0ID0gbnVsbDtcbiAgICAgICAgICBzZWxmLnVwZ3JhZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHNlbGYuZmx1c2goKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBmYWlsZWQnLCBuYW1lKTtcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigncHJvYmUgZXJyb3InKTtcbiAgICAgICAgZXJyLnRyYW5zcG9ydCA9IHRyYW5zcG9ydC5uYW1lO1xuICAgICAgICBzZWxmLmVtaXQoJ3VwZ3JhZGVFcnJvcicsIGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBmcmVlemVUcmFuc3BvcnQgKCkge1xuICAgIGlmIChmYWlsZWQpIHJldHVybjtcblxuICAgIC8vIEFueSBjYWxsYmFjayBjYWxsZWQgYnkgdHJhbnNwb3J0IHNob3VsZCBiZSBpZ25vcmVkIHNpbmNlIG5vd1xuICAgIGZhaWxlZCA9IHRydWU7XG5cbiAgICBjbGVhbnVwKCk7XG5cbiAgICB0cmFuc3BvcnQuY2xvc2UoKTtcbiAgICB0cmFuc3BvcnQgPSBudWxsO1xuICB9XG5cbiAgLy8gSGFuZGxlIGFueSBlcnJvciB0aGF0IGhhcHBlbnMgd2hpbGUgcHJvYmluZ1xuICBmdW5jdGlvbiBvbmVycm9yIChlcnIpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ3Byb2JlIGVycm9yOiAnICsgZXJyKTtcbiAgICBlcnJvci50cmFuc3BvcnQgPSB0cmFuc3BvcnQubmFtZTtcblxuICAgIGZyZWV6ZVRyYW5zcG9ydCgpO1xuXG4gICAgZGVidWcoJ3Byb2JlIHRyYW5zcG9ydCBcIiVzXCIgZmFpbGVkIGJlY2F1c2Ugb2YgZXJyb3I6ICVzJywgbmFtZSwgZXJyKTtcblxuICAgIHNlbGYuZW1pdCgndXBncmFkZUVycm9yJywgZXJyb3IpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25UcmFuc3BvcnRDbG9zZSAoKSB7XG4gICAgb25lcnJvcigndHJhbnNwb3J0IGNsb3NlZCcpO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZCB3aGlsZSB3ZSdyZSBwcm9iaW5nXG4gIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgIG9uZXJyb3IoJ3NvY2tldCBjbG9zZWQnKTtcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIHNvY2tldCBpcyB1cGdyYWRlZCB3aGlsZSB3ZSdyZSBwcm9iaW5nXG4gIGZ1bmN0aW9uIG9udXBncmFkZSAodG8pIHtcbiAgICBpZiAodHJhbnNwb3J0ICYmIHRvLm5hbWUgIT09IHRyYW5zcG9ydC5uYW1lKSB7XG4gICAgICBkZWJ1ZygnXCIlc1wiIHdvcmtzIC0gYWJvcnRpbmcgXCIlc1wiJywgdG8ubmFtZSwgdHJhbnNwb3J0Lm5hbWUpO1xuICAgICAgZnJlZXplVHJhbnNwb3J0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtb3ZlIGFsbCBsaXN0ZW5lcnMgb24gdGhlIHRyYW5zcG9ydCBhbmQgb24gc2VsZlxuICBmdW5jdGlvbiBjbGVhbnVwICgpIHtcbiAgICB0cmFuc3BvcnQucmVtb3ZlTGlzdGVuZXIoJ29wZW4nLCBvblRyYW5zcG9ydE9wZW4pO1xuICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICB0cmFuc3BvcnQucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKCd1cGdyYWRpbmcnLCBvbnVwZ3JhZGUpO1xuICB9XG5cbiAgdHJhbnNwb3J0Lm9uY2UoJ29wZW4nLCBvblRyYW5zcG9ydE9wZW4pO1xuICB0cmFuc3BvcnQub25jZSgnZXJyb3InLCBvbmVycm9yKTtcbiAgdHJhbnNwb3J0Lm9uY2UoJ2Nsb3NlJywgb25UcmFuc3BvcnRDbG9zZSk7XG5cbiAgdGhpcy5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICB0aGlzLm9uY2UoJ3VwZ3JhZGluZycsIG9udXBncmFkZSk7XG5cbiAgdHJhbnNwb3J0Lm9wZW4oKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBkZWVtZWQgb3Blbi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNvY2tldC5wcm90b3R5cGUub25PcGVuID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1Zygnc29ja2V0IG9wZW4nKTtcbiAgdGhpcy5yZWFkeVN0YXRlID0gJ29wZW4nO1xuICBTb2NrZXQucHJpb3JXZWJzb2NrZXRTdWNjZXNzID0gJ3dlYnNvY2tldCcgPT09IHRoaXMudHJhbnNwb3J0Lm5hbWU7XG4gIHRoaXMuZW1pdCgnb3BlbicpO1xuICB0aGlzLmZsdXNoKCk7XG5cbiAgLy8gd2UgY2hlY2sgZm9yIGByZWFkeVN0YXRlYCBpbiBjYXNlIGFuIGBvcGVuYFxuICAvLyBsaXN0ZW5lciBhbHJlYWR5IGNsb3NlZCB0aGUgc29ja2V0XG4gIGlmICgnb3BlbicgPT09IHRoaXMucmVhZHlTdGF0ZSAmJiB0aGlzLnVwZ3JhZGUgJiYgdGhpcy50cmFuc3BvcnQucGF1c2UpIHtcbiAgICBkZWJ1Zygnc3RhcnRpbmcgdXBncmFkZSBwcm9iZXMnKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMudXBncmFkZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzLnByb2JlKHRoaXMudXBncmFkZXNbaV0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBIYW5kbGVzIGEgcGFja2V0LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25QYWNrZXQgPSBmdW5jdGlvbiAocGFja2V0KSB7XG4gIGlmICgnb3BlbmluZycgPT09IHRoaXMucmVhZHlTdGF0ZSB8fCAnb3BlbicgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgJ2Nsb3NpbmcnID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICBkZWJ1Zygnc29ja2V0IHJlY2VpdmU6IHR5cGUgXCIlc1wiLCBkYXRhIFwiJXNcIicsIHBhY2tldC50eXBlLCBwYWNrZXQuZGF0YSk7XG5cbiAgICB0aGlzLmVtaXQoJ3BhY2tldCcsIHBhY2tldCk7XG5cbiAgICAvLyBTb2NrZXQgaXMgbGl2ZSAtIGFueSBwYWNrZXQgY291bnRzXG4gICAgdGhpcy5lbWl0KCdoZWFydGJlYXQnKTtcblxuICAgIHN3aXRjaCAocGFja2V0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ29wZW4nOlxuICAgICAgICB0aGlzLm9uSGFuZHNoYWtlKEpTT04ucGFyc2UocGFja2V0LmRhdGEpKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3BvbmcnOlxuICAgICAgICB0aGlzLnNldFBpbmcoKTtcbiAgICAgICAgdGhpcy5lbWl0KCdwb25nJyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ3NlcnZlciBlcnJvcicpO1xuICAgICAgICBlcnIuY29kZSA9IHBhY2tldC5kYXRhO1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgICAgICB0aGlzLmVtaXQoJ2RhdGEnLCBwYWNrZXQuZGF0YSk7XG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlYnVnKCdwYWNrZXQgcmVjZWl2ZWQgd2l0aCBzb2NrZXQgcmVhZHlTdGF0ZSBcIiVzXCInLCB0aGlzLnJlYWR5U3RhdGUpO1xuICB9XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIGhhbmRzaGFrZSBjb21wbGV0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYW5kc2hha2Ugb2JqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLm9uSGFuZHNoYWtlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5lbWl0KCdoYW5kc2hha2UnLCBkYXRhKTtcbiAgdGhpcy5pZCA9IGRhdGEuc2lkO1xuICB0aGlzLnRyYW5zcG9ydC5xdWVyeS5zaWQgPSBkYXRhLnNpZDtcbiAgdGhpcy51cGdyYWRlcyA9IHRoaXMuZmlsdGVyVXBncmFkZXMoZGF0YS51cGdyYWRlcyk7XG4gIHRoaXMucGluZ0ludGVydmFsID0gZGF0YS5waW5nSW50ZXJ2YWw7XG4gIHRoaXMucGluZ1RpbWVvdXQgPSBkYXRhLnBpbmdUaW1lb3V0O1xuICB0aGlzLm9uT3BlbigpO1xuICAvLyBJbiBjYXNlIG9wZW4gaGFuZGxlciBjbG9zZXMgc29ja2V0XG4gIGlmICgnY2xvc2VkJyA9PT0gdGhpcy5yZWFkeVN0YXRlKSByZXR1cm47XG4gIHRoaXMuc2V0UGluZygpO1xuXG4gIC8vIFByb2xvbmcgbGl2ZW5lc3Mgb2Ygc29ja2V0IG9uIGhlYXJ0YmVhdFxuICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdoZWFydGJlYXQnLCB0aGlzLm9uSGVhcnRiZWF0KTtcbiAgdGhpcy5vbignaGVhcnRiZWF0JywgdGhpcy5vbkhlYXJ0YmVhdCk7XG59O1xuXG4vKipcbiAqIFJlc2V0cyBwaW5nIHRpbWVvdXQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5vbkhlYXJ0YmVhdCA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gIGNsZWFyVGltZW91dCh0aGlzLnBpbmdUaW1lb3V0VGltZXIpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucGluZ1RpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnY2xvc2VkJyA9PT0gc2VsZi5yZWFkeVN0YXRlKSByZXR1cm47XG4gICAgc2VsZi5vbkNsb3NlKCdwaW5nIHRpbWVvdXQnKTtcbiAgfSwgdGltZW91dCB8fCAoc2VsZi5waW5nSW50ZXJ2YWwgKyBzZWxmLnBpbmdUaW1lb3V0KSk7XG59O1xuXG4vKipcbiAqIFBpbmdzIHNlcnZlciBldmVyeSBgdGhpcy5waW5nSW50ZXJ2YWxgIGFuZCBleHBlY3RzIHJlc3BvbnNlXG4gKiB3aXRoaW4gYHRoaXMucGluZ1RpbWVvdXRgIG9yIGNsb3NlcyBjb25uZWN0aW9uLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUuc2V0UGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBjbGVhclRpbWVvdXQoc2VsZi5waW5nSW50ZXJ2YWxUaW1lcik7XG4gIHNlbGYucGluZ0ludGVydmFsVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JpdGluZyBwaW5nIHBhY2tldCAtIGV4cGVjdGluZyBwb25nIHdpdGhpbiAlc21zJywgc2VsZi5waW5nVGltZW91dCk7XG4gICAgc2VsZi5waW5nKCk7XG4gICAgc2VsZi5vbkhlYXJ0YmVhdChzZWxmLnBpbmdUaW1lb3V0KTtcbiAgfSwgc2VsZi5waW5nSW50ZXJ2YWwpO1xufTtcblxuLyoqXG4qIFNlbmRzIGEgcGluZyBwYWNrZXQuXG4qXG4qIEBhcGkgcHJpdmF0ZVxuKi9cblxuU29ja2V0LnByb3RvdHlwZS5waW5nID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuc2VuZFBhY2tldCgncGluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLmVtaXQoJ3BpbmcnKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIENhbGxlZCBvbiBgZHJhaW5gIGV2ZW50XG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5vbkRyYWluID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLndyaXRlQnVmZmVyLnNwbGljZSgwLCB0aGlzLnByZXZCdWZmZXJMZW4pO1xuXG4gIC8vIHNldHRpbmcgcHJldkJ1ZmZlckxlbiA9IDAgaXMgdmVyeSBpbXBvcnRhbnRcbiAgLy8gZm9yIGV4YW1wbGUsIHdoZW4gdXBncmFkaW5nLCB1cGdyYWRlIHBhY2tldCBpcyBzZW50IG92ZXIsXG4gIC8vIGFuZCBhIG5vbnplcm8gcHJldkJ1ZmZlckxlbiBjb3VsZCBjYXVzZSBwcm9ibGVtcyBvbiBgZHJhaW5gXG4gIHRoaXMucHJldkJ1ZmZlckxlbiA9IDA7XG5cbiAgaWYgKDAgPT09IHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgdGhpcy5lbWl0KCdkcmFpbicpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZmx1c2goKTtcbiAgfVxufTtcblxuLyoqXG4gKiBGbHVzaCB3cml0ZSBidWZmZXJzLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gIGlmICgnY2xvc2VkJyAhPT0gdGhpcy5yZWFkeVN0YXRlICYmIHRoaXMudHJhbnNwb3J0LndyaXRhYmxlICYmXG4gICAgIXRoaXMudXBncmFkaW5nICYmIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgZGVidWcoJ2ZsdXNoaW5nICVkIHBhY2tldHMgaW4gc29ja2V0JywgdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGgpO1xuICAgIHRoaXMudHJhbnNwb3J0LnNlbmQodGhpcy53cml0ZUJ1ZmZlcik7XG4gICAgLy8ga2VlcCB0cmFjayBvZiBjdXJyZW50IGxlbmd0aCBvZiB3cml0ZUJ1ZmZlclxuICAgIC8vIHNwbGljZSB3cml0ZUJ1ZmZlciBhbmQgY2FsbGJhY2tCdWZmZXIgb24gYGRyYWluYFxuICAgIHRoaXMucHJldkJ1ZmZlckxlbiA9IHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoO1xuICAgIHRoaXMuZW1pdCgnZmx1c2gnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kcyBhIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICogQHJldHVybiB7U29ja2V0fSBmb3IgY2hhaW5pbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNvY2tldC5wcm90b3R5cGUud3JpdGUgPVxuU29ja2V0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKG1zZywgb3B0aW9ucywgZm4pIHtcbiAgdGhpcy5zZW5kUGFja2V0KCdtZXNzYWdlJywgbXNnLCBvcHRpb25zLCBmbik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZW5kcyBhIHBhY2tldC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFja2V0IHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLnNlbmRQYWNrZXQgPSBmdW5jdGlvbiAodHlwZSwgZGF0YSwgb3B0aW9ucywgZm4pIHtcbiAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBkYXRhKSB7XG4gICAgZm4gPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9wdGlvbnMpIHtcbiAgICBmbiA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cblxuICBpZiAoJ2Nsb3NpbmcnID09PSB0aGlzLnJlYWR5U3RhdGUgfHwgJ2Nsb3NlZCcgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLmNvbXByZXNzID0gZmFsc2UgIT09IG9wdGlvbnMuY29tcHJlc3M7XG5cbiAgdmFyIHBhY2tldCA9IHtcbiAgICB0eXBlOiB0eXBlLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9O1xuICB0aGlzLmVtaXQoJ3BhY2tldENyZWF0ZScsIHBhY2tldCk7XG4gIHRoaXMud3JpdGVCdWZmZXIucHVzaChwYWNrZXQpO1xuICBpZiAoZm4pIHRoaXMub25jZSgnZmx1c2gnLCBmbik7XG4gIHRoaXMuZmx1c2goKTtcbn07XG5cbi8qKlxuICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICgnb3BlbmluZycgPT09IHRoaXMucmVhZHlTdGF0ZSB8fCAnb3BlbicgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgIHRoaXMucmVhZHlTdGF0ZSA9ICdjbG9zaW5nJztcblxuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmICh0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCkge1xuICAgICAgdGhpcy5vbmNlKCdkcmFpbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMudXBncmFkaW5nKSB7XG4gICAgICAgICAgd2FpdEZvclVwZ3JhZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudXBncmFkaW5nKSB7XG4gICAgICB3YWl0Rm9yVXBncmFkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlICgpIHtcbiAgICBzZWxmLm9uQ2xvc2UoJ2ZvcmNlZCBjbG9zZScpO1xuICAgIGRlYnVnKCdzb2NrZXQgY2xvc2luZyAtIHRlbGxpbmcgdHJhbnNwb3J0IHRvIGNsb3NlJyk7XG4gICAgc2VsZi50cmFuc3BvcnQuY2xvc2UoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFudXBBbmRDbG9zZSAoKSB7XG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcigndXBncmFkZScsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcigndXBncmFkZUVycm9yJywgY2xlYW51cEFuZENsb3NlKTtcbiAgICBjbG9zZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gd2FpdEZvclVwZ3JhZGUgKCkge1xuICAgIC8vIHdhaXQgZm9yIHVwZ3JhZGUgdG8gZmluaXNoIHNpbmNlIHdlIGNhbid0IHNlbmQgcGFja2V0cyB3aGlsZSBwYXVzaW5nIGEgdHJhbnNwb3J0XG4gICAgc2VsZi5vbmNlKCd1cGdyYWRlJywgY2xlYW51cEFuZENsb3NlKTtcbiAgICBzZWxmLm9uY2UoJ3VwZ3JhZGVFcnJvcicsIGNsZWFudXBBbmRDbG9zZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gdHJhbnNwb3J0IGVycm9yXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICBkZWJ1Zygnc29ja2V0IGVycm9yICVqJywgZXJyKTtcbiAgU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgdGhpcy5vbkNsb3NlKCd0cmFuc3BvcnQgZXJyb3InLCBlcnIpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgY2xvc2UuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5vbkNsb3NlID0gZnVuY3Rpb24gKHJlYXNvbiwgZGVzYykge1xuICBpZiAoJ29wZW5pbmcnID09PSB0aGlzLnJlYWR5U3RhdGUgfHwgJ29wZW4nID09PSB0aGlzLnJlYWR5U3RhdGUgfHwgJ2Nsb3NpbmcnID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICBkZWJ1Zygnc29ja2V0IGNsb3NlIHdpdGggcmVhc29uOiBcIiVzXCInLCByZWFzb24pO1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIGNsZWFyIHRpbWVyc1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnBpbmdJbnRlcnZhbFRpbWVyKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5waW5nVGltZW91dFRpbWVyKTtcblxuICAgIC8vIHN0b3AgZXZlbnQgZnJvbSBmaXJpbmcgYWdhaW4gZm9yIHRyYW5zcG9ydFxuICAgIHRoaXMudHJhbnNwb3J0LnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcblxuICAgIC8vIGVuc3VyZSB0cmFuc3BvcnQgd29uJ3Qgc3RheSBvcGVuXG4gICAgdGhpcy50cmFuc3BvcnQuY2xvc2UoKTtcblxuICAgIC8vIGlnbm9yZSBmdXJ0aGVyIHRyYW5zcG9ydCBjb21tdW5pY2F0aW9uXG4gICAgdGhpcy50cmFuc3BvcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBzZXQgcmVhZHkgc3RhdGVcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSAnY2xvc2VkJztcblxuICAgIC8vIGNsZWFyIHNlc3Npb24gaWRcbiAgICB0aGlzLmlkID0gbnVsbDtcblxuICAgIC8vIGVtaXQgY2xvc2UgZXZlbnRcbiAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgcmVhc29uLCBkZXNjKTtcblxuICAgIC8vIGNsZWFuIGJ1ZmZlcnMgYWZ0ZXIsIHNvIHVzZXJzIGNhbiBzdGlsbFxuICAgIC8vIGdyYWIgdGhlIGJ1ZmZlcnMgb24gYGNsb3NlYCBldmVudFxuICAgIHNlbGYud3JpdGVCdWZmZXIgPSBbXTtcbiAgICBzZWxmLnByZXZCdWZmZXJMZW4gPSAwO1xuICB9XG59O1xuXG4vKipcbiAqIEZpbHRlcnMgdXBncmFkZXMsIHJldHVybmluZyBvbmx5IHRob3NlIG1hdGNoaW5nIGNsaWVudCB0cmFuc3BvcnRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlcnZlciB1cGdyYWRlc1xuICogQGFwaSBwcml2YXRlXG4gKlxuICovXG5cblNvY2tldC5wcm90b3R5cGUuZmlsdGVyVXBncmFkZXMgPSBmdW5jdGlvbiAodXBncmFkZXMpIHtcbiAgdmFyIGZpbHRlcmVkVXBncmFkZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGogPSB1cGdyYWRlcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICBpZiAofmluZGV4KHRoaXMudHJhbnNwb3J0cywgdXBncmFkZXNbaV0pKSBmaWx0ZXJlZFVwZ3JhZGVzLnB1c2godXBncmFkZXNbaV0pO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZFVwZ3JhZGVzO1xufTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgcGFyc2VyID0gcmVxdWlyZSgnZW5naW5lLmlvLXBhcnNlcicpO1xudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCdjb21wb25lbnQtZW1pdHRlcicpO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNwb3J0O1xuXG4vKipcbiAqIFRyYW5zcG9ydCBhYnN0cmFjdCBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIFRyYW5zcG9ydCAob3B0cykge1xuICB0aGlzLnBhdGggPSBvcHRzLnBhdGg7XG4gIHRoaXMuaG9zdG5hbWUgPSBvcHRzLmhvc3RuYW1lO1xuICB0aGlzLnBvcnQgPSBvcHRzLnBvcnQ7XG4gIHRoaXMuc2VjdXJlID0gb3B0cy5zZWN1cmU7XG4gIHRoaXMucXVlcnkgPSBvcHRzLnF1ZXJ5O1xuICB0aGlzLnRpbWVzdGFtcFBhcmFtID0gb3B0cy50aW1lc3RhbXBQYXJhbTtcbiAgdGhpcy50aW1lc3RhbXBSZXF1ZXN0cyA9IG9wdHMudGltZXN0YW1wUmVxdWVzdHM7XG4gIHRoaXMucmVhZHlTdGF0ZSA9ICcnO1xuICB0aGlzLmFnZW50ID0gb3B0cy5hZ2VudCB8fCBmYWxzZTtcbiAgdGhpcy5zb2NrZXQgPSBvcHRzLnNvY2tldDtcbiAgdGhpcy5lbmFibGVzWERSID0gb3B0cy5lbmFibGVzWERSO1xuXG4gIC8vIFNTTCBvcHRpb25zIGZvciBOb2RlLmpzIGNsaWVudFxuICB0aGlzLnBmeCA9IG9wdHMucGZ4O1xuICB0aGlzLmtleSA9IG9wdHMua2V5O1xuICB0aGlzLnBhc3NwaHJhc2UgPSBvcHRzLnBhc3NwaHJhc2U7XG4gIHRoaXMuY2VydCA9IG9wdHMuY2VydDtcbiAgdGhpcy5jYSA9IG9wdHMuY2E7XG4gIHRoaXMuY2lwaGVycyA9IG9wdHMuY2lwaGVycztcbiAgdGhpcy5yZWplY3RVbmF1dGhvcml6ZWQgPSBvcHRzLnJlamVjdFVuYXV0aG9yaXplZDtcbiAgdGhpcy5mb3JjZU5vZGUgPSBvcHRzLmZvcmNlTm9kZTtcblxuICAvLyBvdGhlciBvcHRpb25zIGZvciBOb2RlLmpzIGNsaWVudFxuICB0aGlzLmV4dHJhSGVhZGVycyA9IG9wdHMuZXh0cmFIZWFkZXJzO1xuICB0aGlzLmxvY2FsQWRkcmVzcyA9IG9wdHMubG9jYWxBZGRyZXNzO1xufVxuXG4vKipcbiAqIE1peCBpbiBgRW1pdHRlcmAuXG4gKi9cblxuRW1pdHRlcihUcmFuc3BvcnQucHJvdG90eXBlKTtcblxuLyoqXG4gKiBFbWl0cyBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtUcmFuc3BvcnR9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5UcmFuc3BvcnQucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAobXNnLCBkZXNjKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgZXJyLnR5cGUgPSAnVHJhbnNwb3J0RXJyb3InO1xuICBlcnIuZGVzY3JpcHRpb24gPSBkZXNjO1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIE9wZW5zIHRoZSB0cmFuc3BvcnQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5UcmFuc3BvcnQucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICgnY2xvc2VkJyA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8ICcnID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSAnb3BlbmluZyc7XG4gICAgdGhpcy5kb09wZW4oKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5UcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICBpZiAoJ29wZW5pbmcnID09PSB0aGlzLnJlYWR5U3RhdGUgfHwgJ29wZW4nID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICB0aGlzLmRvQ2xvc2UoKTtcbiAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZW5kcyBtdWx0aXBsZSBwYWNrZXRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhY2tldHNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblRyYW5zcG9ydC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChwYWNrZXRzKSB7XG4gIGlmICgnb3BlbicgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgIHRoaXMud3JpdGUocGFja2V0cyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc3BvcnQgbm90IG9wZW4nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBvcGVuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuVHJhbnNwb3J0LnByb3RvdHlwZS5vbk9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucmVhZHlTdGF0ZSA9ICdvcGVuJztcbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gIHRoaXMuZW1pdCgnb3BlbicpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgd2l0aCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5UcmFuc3BvcnQucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHZhciBwYWNrZXQgPSBwYXJzZXIuZGVjb2RlUGFja2V0KGRhdGEsIHRoaXMuc29ja2V0LmJpbmFyeVR5cGUpO1xuICB0aGlzLm9uUGFja2V0KHBhY2tldCk7XG59O1xuXG4vKipcbiAqIENhbGxlZCB3aXRoIGEgZGVjb2RlZCBwYWNrZXQuXG4gKi9cblxuVHJhbnNwb3J0LnByb3RvdHlwZS5vblBhY2tldCA9IGZ1bmN0aW9uIChwYWNrZXQpIHtcbiAgdGhpcy5lbWl0KCdwYWNrZXQnLCBwYWNrZXQpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBjbG9zZS5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5UcmFuc3BvcnQucHJvdG90eXBlLm9uQ2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucmVhZHlTdGF0ZSA9ICdjbG9zZWQnO1xuICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG59O1xuIiwiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIFhNTEh0dHBSZXF1ZXN0ID0gcmVxdWlyZSgneG1saHR0cHJlcXVlc3Qtc3NsJyk7XG52YXIgWEhSID0gcmVxdWlyZSgnLi9wb2xsaW5nLXhocicpO1xudmFyIEpTT05QID0gcmVxdWlyZSgnLi9wb2xsaW5nLWpzb25wJyk7XG52YXIgd2Vic29ja2V0ID0gcmVxdWlyZSgnLi93ZWJzb2NrZXQnKTtcblxuLyoqXG4gKiBFeHBvcnQgdHJhbnNwb3J0cy5cbiAqL1xuXG5leHBvcnRzLnBvbGxpbmcgPSBwb2xsaW5nO1xuZXhwb3J0cy53ZWJzb2NrZXQgPSB3ZWJzb2NrZXQ7XG5cbi8qKlxuICogUG9sbGluZyB0cmFuc3BvcnQgcG9seW1vcnBoaWMgY29uc3RydWN0b3IuXG4gKiBEZWNpZGVzIG9uIHhociB2cyBqc29ucCBiYXNlZCBvbiBmZWF0dXJlIGRldGVjdGlvbi5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwb2xsaW5nIChvcHRzKSB7XG4gIHZhciB4aHI7XG4gIHZhciB4ZCA9IGZhbHNlO1xuICB2YXIgeHMgPSBmYWxzZTtcbiAgdmFyIGpzb25wID0gZmFsc2UgIT09IG9wdHMuanNvbnA7XG5cbiAgaWYgKGdsb2JhbC5sb2NhdGlvbikge1xuICAgIHZhciBpc1NTTCA9ICdodHRwczonID09PSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICB2YXIgcG9ydCA9IGxvY2F0aW9uLnBvcnQ7XG5cbiAgICAvLyBzb21lIHVzZXIgYWdlbnRzIGhhdmUgZW1wdHkgYGxvY2F0aW9uLnBvcnRgXG4gICAgaWYgKCFwb3J0KSB7XG4gICAgICBwb3J0ID0gaXNTU0wgPyA0NDMgOiA4MDtcbiAgICB9XG5cbiAgICB4ZCA9IG9wdHMuaG9zdG5hbWUgIT09IGxvY2F0aW9uLmhvc3RuYW1lIHx8IHBvcnQgIT09IG9wdHMucG9ydDtcbiAgICB4cyA9IG9wdHMuc2VjdXJlICE9PSBpc1NTTDtcbiAgfVxuXG4gIG9wdHMueGRvbWFpbiA9IHhkO1xuICBvcHRzLnhzY2hlbWUgPSB4cztcbiAgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KG9wdHMpO1xuXG4gIGlmICgnb3BlbicgaW4geGhyICYmICFvcHRzLmZvcmNlSlNPTlApIHtcbiAgICByZXR1cm4gbmV3IFhIUihvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWpzb25wKSB0aHJvdyBuZXcgRXJyb3IoJ0pTT05QIGRpc2FibGVkJyk7XG4gICAgcmV0dXJuIG5ldyBKU09OUChvcHRzKTtcbiAgfVxufVxuIiwiXG4vKipcbiAqIE1vZHVsZSByZXF1aXJlbWVudHMuXG4gKi9cblxudmFyIFBvbGxpbmcgPSByZXF1aXJlKCcuL3BvbGxpbmcnKTtcbnZhciBpbmhlcml0ID0gcmVxdWlyZSgnY29tcG9uZW50LWluaGVyaXQnKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IEpTT05QUG9sbGluZztcblxuLyoqXG4gKiBDYWNoZWQgcmVndWxhciBleHByZXNzaW9ucy5cbiAqL1xuXG52YXIgck5ld2xpbmUgPSAvXFxuL2c7XG52YXIgckVzY2FwZWROZXdsaW5lID0gL1xcXFxuL2c7XG5cbi8qKlxuICogR2xvYmFsIEpTT05QIGNhbGxiYWNrcy5cbiAqL1xuXG52YXIgY2FsbGJhY2tzO1xuXG4vKipcbiAqIE5vb3AuXG4gKi9cblxuZnVuY3Rpb24gZW1wdHkgKCkgeyB9XG5cbi8qKlxuICogSlNPTlAgUG9sbGluZyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gSlNPTlBQb2xsaW5nIChvcHRzKSB7XG4gIFBvbGxpbmcuY2FsbCh0aGlzLCBvcHRzKTtcblxuICB0aGlzLnF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcblxuICAvLyBkZWZpbmUgZ2xvYmFsIGNhbGxiYWNrcyBhcnJheSBpZiBub3QgcHJlc2VudFxuICAvLyB3ZSBkbyB0aGlzIGhlcmUgKGxhemlseSkgdG8gYXZvaWQgdW5uZWVkZWQgZ2xvYmFsIHBvbGx1dGlvblxuICBpZiAoIWNhbGxiYWNrcykge1xuICAgIC8vIHdlIG5lZWQgdG8gY29uc2lkZXIgbXVsdGlwbGUgZW5naW5lcyBpbiB0aGUgc2FtZSBwYWdlXG4gICAgaWYgKCFnbG9iYWwuX19fZWlvKSBnbG9iYWwuX19fZWlvID0gW107XG4gICAgY2FsbGJhY2tzID0gZ2xvYmFsLl9fX2VpbztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGlkZW50aWZpZXJcbiAgdGhpcy5pbmRleCA9IGNhbGxiYWNrcy5sZW5ndGg7XG5cbiAgLy8gYWRkIGNhbGxiYWNrIHRvIGpzb25wIGdsb2JhbFxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uIChtc2cpIHtcbiAgICBzZWxmLm9uRGF0YShtc2cpO1xuICB9KTtcblxuICAvLyBhcHBlbmQgdG8gcXVlcnkgc3RyaW5nXG4gIHRoaXMucXVlcnkuaiA9IHRoaXMuaW5kZXg7XG5cbiAgLy8gcHJldmVudCBzcHVyaW91cyBlcnJvcnMgZnJvbSBiZWluZyBlbWl0dGVkIHdoZW4gdGhlIHdpbmRvdyBpcyB1bmxvYWRlZFxuICBpZiAoZ2xvYmFsLmRvY3VtZW50ICYmIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLnNjcmlwdCkgc2VsZi5zY3JpcHQub25lcnJvciA9IGVtcHR5O1xuICAgIH0sIGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIEluaGVyaXRzIGZyb20gUG9sbGluZy5cbiAqL1xuXG5pbmhlcml0KEpTT05QUG9sbGluZywgUG9sbGluZyk7XG5cbi8qXG4gKiBKU09OUCBvbmx5IHN1cHBvcnRzIGJpbmFyeSBhcyBiYXNlNjQgZW5jb2RlZCBzdHJpbmdzXG4gKi9cblxuSlNPTlBQb2xsaW5nLnByb3RvdHlwZS5zdXBwb3J0c0JpbmFyeSA9IGZhbHNlO1xuXG4vKipcbiAqIENsb3NlcyB0aGUgc29ja2V0LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkpTT05QUG9sbGluZy5wcm90b3R5cGUuZG9DbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuc2NyaXB0KSB7XG4gICAgdGhpcy5zY3JpcHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnNjcmlwdCk7XG4gICAgdGhpcy5zY3JpcHQgPSBudWxsO1xuICB9XG5cbiAgaWYgKHRoaXMuZm9ybSkge1xuICAgIHRoaXMuZm9ybS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZm9ybSk7XG4gICAgdGhpcy5mb3JtID0gbnVsbDtcbiAgICB0aGlzLmlmcmFtZSA9IG51bGw7XG4gIH1cblxuICBQb2xsaW5nLnByb3RvdHlwZS5kb0Nsb3NlLmNhbGwodGhpcyk7XG59O1xuXG4vKipcbiAqIFN0YXJ0cyBhIHBvbGwgY3ljbGUuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuSlNPTlBQb2xsaW5nLnByb3RvdHlwZS5kb1BvbGwgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG4gIGlmICh0aGlzLnNjcmlwdCkge1xuICAgIHRoaXMuc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zY3JpcHQpO1xuICAgIHRoaXMuc2NyaXB0ID0gbnVsbDtcbiAgfVxuXG4gIHNjcmlwdC5hc3luYyA9IHRydWU7XG4gIHNjcmlwdC5zcmMgPSB0aGlzLnVyaSgpO1xuICBzY3JpcHQub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgc2VsZi5vbkVycm9yKCdqc29ucCBwb2xsIGVycm9yJywgZSk7XG4gIH07XG5cbiAgdmFyIGluc2VydEF0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICBpZiAoaW5zZXJ0QXQpIHtcbiAgICBpbnNlcnRBdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHQsIGluc2VydEF0KTtcbiAgfSBlbHNlIHtcbiAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5ib2R5KS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICB9XG4gIHRoaXMuc2NyaXB0ID0gc2NyaXB0O1xuXG4gIHZhciBpc1VBZ2Vja28gPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG5hdmlnYXRvciAmJiAvZ2Vja28vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4gIGlmIChpc1VBZ2Vja28pIHtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgICB9LCAxMDApO1xuICB9XG59O1xuXG4vKipcbiAqIFdyaXRlcyB3aXRoIGEgaGlkZGVuIGlmcmFtZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSB0byBzZW5kXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsZWQgdXBvbiBmbHVzaC5cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkpTT05QUG9sbGluZy5wcm90b3R5cGUuZG9Xcml0ZSA9IGZ1bmN0aW9uIChkYXRhLCBmbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCF0aGlzLmZvcm0pIHtcbiAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcbiAgICB2YXIgYXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdmFyIGlkID0gdGhpcy5pZnJhbWVJZCA9ICdlaW9faWZyYW1lXycgKyB0aGlzLmluZGV4O1xuICAgIHZhciBpZnJhbWU7XG5cbiAgICBmb3JtLmNsYXNzTmFtZSA9ICdzb2NrZXRpbyc7XG4gICAgZm9ybS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZm9ybS5zdHlsZS50b3AgPSAnLTEwMDBweCc7XG4gICAgZm9ybS5zdHlsZS5sZWZ0ID0gJy0xMDAwcHgnO1xuICAgIGZvcm0udGFyZ2V0ID0gaWQ7XG4gICAgZm9ybS5tZXRob2QgPSAnUE9TVCc7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ2FjY2VwdC1jaGFyc2V0JywgJ3V0Zi04Jyk7XG4gICAgYXJlYS5uYW1lID0gJ2QnO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoYXJlYSk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcblxuICAgIHRoaXMuZm9ybSA9IGZvcm07XG4gICAgdGhpcy5hcmVhID0gYXJlYTtcbiAgfVxuXG4gIHRoaXMuZm9ybS5hY3Rpb24gPSB0aGlzLnVyaSgpO1xuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlICgpIHtcbiAgICBpbml0SWZyYW1lKCk7XG4gICAgZm4oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRJZnJhbWUgKCkge1xuICAgIGlmIChzZWxmLmlmcmFtZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VsZi5mb3JtLnJlbW92ZUNoaWxkKHNlbGYuaWZyYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2VsZi5vbkVycm9yKCdqc29ucCBwb2xsaW5nIGlmcmFtZSByZW1vdmFsIGVycm9yJywgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGllNiBkeW5hbWljIGlmcmFtZXMgd2l0aCB0YXJnZXQ9XCJcIiBzdXBwb3J0ICh0aGFua3MgQ2hyaXMgTGFtYmFjaGVyKVxuICAgICAgdmFyIGh0bWwgPSAnPGlmcmFtZSBzcmM9XCJqYXZhc2NyaXB0OjBcIiBuYW1lPVwiJyArIHNlbGYuaWZyYW1lSWQgKyAnXCI+JztcbiAgICAgIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICBpZnJhbWUubmFtZSA9IHNlbGYuaWZyYW1lSWQ7XG4gICAgICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6MCc7XG4gICAgfVxuXG4gICAgaWZyYW1lLmlkID0gc2VsZi5pZnJhbWVJZDtcblxuICAgIHNlbGYuZm9ybS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAgIHNlbGYuaWZyYW1lID0gaWZyYW1lO1xuICB9XG5cbiAgaW5pdElmcmFtZSgpO1xuXG4gIC8vIGVzY2FwZSBcXG4gdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGNvbnZlcnRlZCBpbnRvIFxcclxcbiBieSBzb21lIFVBc1xuICAvLyBkb3VibGUgZXNjYXBpbmcgaXMgcmVxdWlyZWQgZm9yIGVzY2FwZWQgbmV3IGxpbmVzIGJlY2F1c2UgdW5lc2NhcGluZyBvZiBuZXcgbGluZXMgY2FuIGJlIGRvbmUgc2FmZWx5IG9uIHNlcnZlci1zaWRlXG4gIGRhdGEgPSBkYXRhLnJlcGxhY2UockVzY2FwZWROZXdsaW5lLCAnXFxcXFxcbicpO1xuICB0aGlzLmFyZWEudmFsdWUgPSBkYXRhLnJlcGxhY2Uock5ld2xpbmUsICdcXFxcbicpO1xuXG4gIHRyeSB7XG4gICAgdGhpcy5mb3JtLnN1Ym1pdCgpO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIGlmICh0aGlzLmlmcmFtZS5hdHRhY2hFdmVudCkge1xuICAgIHRoaXMuaWZyYW1lLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLmlmcmFtZS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmlmcmFtZS5vbmxvYWQgPSBjb21wbGV0ZTtcbiAgfVxufTtcbiIsIi8qKlxuICogTW9kdWxlIHJlcXVpcmVtZW50cy5cbiAqL1xuXG52YXIgWE1MSHR0cFJlcXVlc3QgPSByZXF1aXJlKCd4bWxodHRwcmVxdWVzdC1zc2wnKTtcbnZhciBQb2xsaW5nID0gcmVxdWlyZSgnLi9wb2xsaW5nJyk7XG52YXIgRW1pdHRlciA9IHJlcXVpcmUoJ2NvbXBvbmVudC1lbWl0dGVyJyk7XG52YXIgaW5oZXJpdCA9IHJlcXVpcmUoJ2NvbXBvbmVudC1pbmhlcml0Jyk7XG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdlbmdpbmUuaW8tY2xpZW50OnBvbGxpbmcteGhyJyk7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBYSFI7XG5tb2R1bGUuZXhwb3J0cy5SZXF1ZXN0ID0gUmVxdWVzdDtcblxuLyoqXG4gKiBFbXB0eSBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGVtcHR5ICgpIHt9XG5cbi8qKlxuICogWEhSIFBvbGxpbmcgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gWEhSIChvcHRzKSB7XG4gIFBvbGxpbmcuY2FsbCh0aGlzLCBvcHRzKTtcbiAgdGhpcy5yZXF1ZXN0VGltZW91dCA9IG9wdHMucmVxdWVzdFRpbWVvdXQ7XG4gIHRoaXMuZXh0cmFIZWFkZXJzID0gb3B0cy5leHRyYUhlYWRlcnM7XG5cbiAgaWYgKGdsb2JhbC5sb2NhdGlvbikge1xuICAgIHZhciBpc1NTTCA9ICdodHRwczonID09PSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICB2YXIgcG9ydCA9IGxvY2F0aW9uLnBvcnQ7XG5cbiAgICAvLyBzb21lIHVzZXIgYWdlbnRzIGhhdmUgZW1wdHkgYGxvY2F0aW9uLnBvcnRgXG4gICAgaWYgKCFwb3J0KSB7XG4gICAgICBwb3J0ID0gaXNTU0wgPyA0NDMgOiA4MDtcbiAgICB9XG5cbiAgICB0aGlzLnhkID0gb3B0cy5ob3N0bmFtZSAhPT0gZ2xvYmFsLmxvY2F0aW9uLmhvc3RuYW1lIHx8XG4gICAgICBwb3J0ICE9PSBvcHRzLnBvcnQ7XG4gICAgdGhpcy54cyA9IG9wdHMuc2VjdXJlICE9PSBpc1NTTDtcbiAgfVxufVxuXG4vKipcbiAqIEluaGVyaXRzIGZyb20gUG9sbGluZy5cbiAqL1xuXG5pbmhlcml0KFhIUiwgUG9sbGluZyk7XG5cbi8qKlxuICogWEhSIHN1cHBvcnRzIGJpbmFyeVxuICovXG5cblhIUi5wcm90b3R5cGUuc3VwcG9ydHNCaW5hcnkgPSB0cnVlO1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblhIUi5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICBvcHRzLnVyaSA9IHRoaXMudXJpKCk7XG4gIG9wdHMueGQgPSB0aGlzLnhkO1xuICBvcHRzLnhzID0gdGhpcy54cztcbiAgb3B0cy5hZ2VudCA9IHRoaXMuYWdlbnQgfHwgZmFsc2U7XG4gIG9wdHMuc3VwcG9ydHNCaW5hcnkgPSB0aGlzLnN1cHBvcnRzQmluYXJ5O1xuICBvcHRzLmVuYWJsZXNYRFIgPSB0aGlzLmVuYWJsZXNYRFI7XG5cbiAgLy8gU1NMIG9wdGlvbnMgZm9yIE5vZGUuanMgY2xpZW50XG4gIG9wdHMucGZ4ID0gdGhpcy5wZng7XG4gIG9wdHMua2V5ID0gdGhpcy5rZXk7XG4gIG9wdHMucGFzc3BocmFzZSA9IHRoaXMucGFzc3BocmFzZTtcbiAgb3B0cy5jZXJ0ID0gdGhpcy5jZXJ0O1xuICBvcHRzLmNhID0gdGhpcy5jYTtcbiAgb3B0cy5jaXBoZXJzID0gdGhpcy5jaXBoZXJzO1xuICBvcHRzLnJlamVjdFVuYXV0aG9yaXplZCA9IHRoaXMucmVqZWN0VW5hdXRob3JpemVkO1xuICBvcHRzLnJlcXVlc3RUaW1lb3V0ID0gdGhpcy5yZXF1ZXN0VGltZW91dDtcblxuICAvLyBvdGhlciBvcHRpb25zIGZvciBOb2RlLmpzIGNsaWVudFxuICBvcHRzLmV4dHJhSGVhZGVycyA9IHRoaXMuZXh0cmFIZWFkZXJzO1xuXG4gIHJldHVybiBuZXcgUmVxdWVzdChvcHRzKTtcbn07XG5cbi8qKlxuICogU2VuZHMgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSB0byBzZW5kLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGVkIHVwb24gZmx1c2guXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5YSFIucHJvdG90eXBlLmRvV3JpdGUgPSBmdW5jdGlvbiAoZGF0YSwgZm4pIHtcbiAgdmFyIGlzQmluYXJ5ID0gdHlwZW9mIGRhdGEgIT09ICdzdHJpbmcnICYmIGRhdGEgIT09IHVuZGVmaW5lZDtcbiAgdmFyIHJlcSA9IHRoaXMucmVxdWVzdCh7IG1ldGhvZDogJ1BPU1QnLCBkYXRhOiBkYXRhLCBpc0JpbmFyeTogaXNCaW5hcnkgfSk7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmVxLm9uKCdzdWNjZXNzJywgZm4pO1xuICByZXEub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIHNlbGYub25FcnJvcigneGhyIHBvc3QgZXJyb3InLCBlcnIpO1xuICB9KTtcbiAgdGhpcy5zZW5kWGhyID0gcmVxO1xufTtcblxuLyoqXG4gKiBTdGFydHMgYSBwb2xsIGN5Y2xlLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblhIUi5wcm90b3R5cGUuZG9Qb2xsID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygneGhyIHBvbGwnKTtcbiAgdmFyIHJlcSA9IHRoaXMucmVxdWVzdCgpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJlcS5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgc2VsZi5vbkRhdGEoZGF0YSk7XG4gIH0pO1xuICByZXEub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIHNlbGYub25FcnJvcigneGhyIHBvbGwgZXJyb3InLCBlcnIpO1xuICB9KTtcbiAgdGhpcy5wb2xsWGhyID0gcmVxO1xufTtcblxuLyoqXG4gKiBSZXF1ZXN0IGNvbnN0cnVjdG9yXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVxdWVzdCAob3B0cykge1xuICB0aGlzLm1ldGhvZCA9IG9wdHMubWV0aG9kIHx8ICdHRVQnO1xuICB0aGlzLnVyaSA9IG9wdHMudXJpO1xuICB0aGlzLnhkID0gISFvcHRzLnhkO1xuICB0aGlzLnhzID0gISFvcHRzLnhzO1xuICB0aGlzLmFzeW5jID0gZmFsc2UgIT09IG9wdHMuYXN5bmM7XG4gIHRoaXMuZGF0YSA9IHVuZGVmaW5lZCAhPT0gb3B0cy5kYXRhID8gb3B0cy5kYXRhIDogbnVsbDtcbiAgdGhpcy5hZ2VudCA9IG9wdHMuYWdlbnQ7XG4gIHRoaXMuaXNCaW5hcnkgPSBvcHRzLmlzQmluYXJ5O1xuICB0aGlzLnN1cHBvcnRzQmluYXJ5ID0gb3B0cy5zdXBwb3J0c0JpbmFyeTtcbiAgdGhpcy5lbmFibGVzWERSID0gb3B0cy5lbmFibGVzWERSO1xuICB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gb3B0cy5yZXF1ZXN0VGltZW91dDtcblxuICAvLyBTU0wgb3B0aW9ucyBmb3IgTm9kZS5qcyBjbGllbnRcbiAgdGhpcy5wZnggPSBvcHRzLnBmeDtcbiAgdGhpcy5rZXkgPSBvcHRzLmtleTtcbiAgdGhpcy5wYXNzcGhyYXNlID0gb3B0cy5wYXNzcGhyYXNlO1xuICB0aGlzLmNlcnQgPSBvcHRzLmNlcnQ7XG4gIHRoaXMuY2EgPSBvcHRzLmNhO1xuICB0aGlzLmNpcGhlcnMgPSBvcHRzLmNpcGhlcnM7XG4gIHRoaXMucmVqZWN0VW5hdXRob3JpemVkID0gb3B0cy5yZWplY3RVbmF1dGhvcml6ZWQ7XG5cbiAgLy8gb3RoZXIgb3B0aW9ucyBmb3IgTm9kZS5qcyBjbGllbnRcbiAgdGhpcy5leHRyYUhlYWRlcnMgPSBvcHRzLmV4dHJhSGVhZGVycztcblxuICB0aGlzLmNyZWF0ZSgpO1xufVxuXG4vKipcbiAqIE1peCBpbiBgRW1pdHRlcmAuXG4gKi9cblxuRW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgWEhSIG9iamVjdCBhbmQgc2VuZHMgdGhlIHJlcXVlc3QuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgb3B0cyA9IHsgYWdlbnQ6IHRoaXMuYWdlbnQsIHhkb21haW46IHRoaXMueGQsIHhzY2hlbWU6IHRoaXMueHMsIGVuYWJsZXNYRFI6IHRoaXMuZW5hYmxlc1hEUiB9O1xuXG4gIC8vIFNTTCBvcHRpb25zIGZvciBOb2RlLmpzIGNsaWVudFxuICBvcHRzLnBmeCA9IHRoaXMucGZ4O1xuICBvcHRzLmtleSA9IHRoaXMua2V5O1xuICBvcHRzLnBhc3NwaHJhc2UgPSB0aGlzLnBhc3NwaHJhc2U7XG4gIG9wdHMuY2VydCA9IHRoaXMuY2VydDtcbiAgb3B0cy5jYSA9IHRoaXMuY2E7XG4gIG9wdHMuY2lwaGVycyA9IHRoaXMuY2lwaGVycztcbiAgb3B0cy5yZWplY3RVbmF1dGhvcml6ZWQgPSB0aGlzLnJlamVjdFVuYXV0aG9yaXplZDtcblxuICB2YXIgeGhyID0gdGhpcy54aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3Qob3B0cyk7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICB0cnkge1xuICAgIGRlYnVnKCd4aHIgb3BlbiAlczogJXMnLCB0aGlzLm1ldGhvZCwgdGhpcy51cmkpO1xuICAgIHhoci5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVyaSwgdGhpcy5hc3luYyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmV4dHJhSGVhZGVycykge1xuICAgICAgICB4aHIuc2V0RGlzYWJsZUhlYWRlckNoZWNrICYmIHhoci5zZXREaXNhYmxlSGVhZGVyQ2hlY2sodHJ1ZSk7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5leHRyYUhlYWRlcnMpIHtcbiAgICAgICAgICBpZiAodGhpcy5leHRyYUhlYWRlcnMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGksIHRoaXMuZXh0cmFIZWFkZXJzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgaWYgKCdQT1NUJyA9PT0gdGhpcy5tZXRob2QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLmlzQmluYXJ5KSB7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJyovKicpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICBpZiAodGhpcy5zdXBwb3J0c0JpbmFyeSkge1xuICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgfVxuXG4gICAgLy8gaWU2IGNoZWNrXG4gICAgaWYgKCd3aXRoQ3JlZGVudGlhbHMnIGluIHhocikge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdFRpbWVvdXQpIHtcbiAgICAgIHhoci50aW1lb3V0ID0gdGhpcy5yZXF1ZXN0VGltZW91dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNYRFIoKSkge1xuICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5vbkxvYWQoKTtcbiAgICAgIH07XG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5vbkVycm9yKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSAyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBjb250ZW50VHlwZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1UeXBlJyk7XG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgIT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSB7XG4gICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuICAgICAgICBpZiAoNCAhPT0geGhyLnJlYWR5U3RhdGUpIHJldHVybjtcbiAgICAgICAgaWYgKDIwMCA9PT0geGhyLnN0YXR1cyB8fCAxMjIzID09PSB4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgc2VsZi5vbkxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGBlcnJvcmAgZXZlbnQgaGFuZGxlciB0aGF0J3MgdXNlci1zZXRcbiAgICAgICAgICAvLyBkb2VzIG5vdCB0aHJvdyBpbiB0aGUgc2FtZSB0aWNrIGFuZCBnZXRzIGNhdWdodCBoZXJlXG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLm9uRXJyb3IoeGhyLnN0YXR1cyk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgZGVidWcoJ3hociBkYXRhICVzJywgdGhpcy5kYXRhKTtcbiAgICB4aHIuc2VuZCh0aGlzLmRhdGEpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gTmVlZCB0byBkZWZlciBzaW5jZSAuY3JlYXRlKCkgaXMgY2FsbGVkIGRpcmVjdGx5IGZocm9tIHRoZSBjb25zdHJ1Y3RvclxuICAgIC8vIGFuZCB0aHVzIHRoZSAnZXJyb3InIGV2ZW50IGNhbiBvbmx5IGJlIG9ubHkgYm91bmQgKmFmdGVyKiB0aGlzIGV4Y2VwdGlvblxuICAgIC8vIG9jY3Vycy4gIFRoZXJlZm9yZSwgYWxzbywgd2UgY2Fubm90IHRocm93IGhlcmUgYXQgYWxsLlxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5vbkVycm9yKGUpO1xuICAgIH0sIDApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChnbG9iYWwuZG9jdW1lbnQpIHtcbiAgICB0aGlzLmluZGV4ID0gUmVxdWVzdC5yZXF1ZXN0c0NvdW50Kys7XG4gICAgUmVxdWVzdC5yZXF1ZXN0c1t0aGlzLmluZGV4XSA9IHRoaXM7XG4gIH1cbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCByZXNwb25zZS5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5vblN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnc3VjY2VzcycpO1xuICB0aGlzLmNsZWFudXAoKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIGlmIHdlIGhhdmUgZGF0YS5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoZGF0YSkge1xuICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKTtcbiAgdGhpcy5vblN1Y2Nlc3MoKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gZXJyb3IuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIHRoaXMuY2xlYW51cCh0cnVlKTtcbn07XG5cbi8qKlxuICogQ2xlYW5zIHVwIGhvdXNlLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNsZWFudXAgPSBmdW5jdGlvbiAoZnJvbUVycm9yKSB7XG4gIGlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIHRoaXMueGhyIHx8IG51bGwgPT09IHRoaXMueGhyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHhtbGh0dHByZXF1ZXN0XG4gIGlmICh0aGlzLmhhc1hEUigpKSB7XG4gICAgdGhpcy54aHIub25sb2FkID0gdGhpcy54aHIub25lcnJvciA9IGVtcHR5O1xuICB9IGVsc2Uge1xuICAgIHRoaXMueGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGVtcHR5O1xuICB9XG5cbiAgaWYgKGZyb21FcnJvcikge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnhoci5hYm9ydCgpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cblxuICBpZiAoZ2xvYmFsLmRvY3VtZW50KSB7XG4gICAgZGVsZXRlIFJlcXVlc3QucmVxdWVzdHNbdGhpcy5pbmRleF07XG4gIH1cblxuICB0aGlzLnhociA9IG51bGw7XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIGxvYWQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUub25Mb2FkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZGF0YTtcbiAgdHJ5IHtcbiAgICB2YXIgY29udGVudFR5cGU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRlbnRUeXBlID0gdGhpcy54aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtVHlwZScpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykge1xuICAgICAgaWYgKHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJ2FycmF5YnVmZmVyJykge1xuICAgICAgICBkYXRhID0gdGhpcy54aHIucmVzcG9uc2UgfHwgdGhpcy54aHIucmVzcG9uc2VUZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkodGhpcy54aHIucmVzcG9uc2UpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YSA9IHRoaXMueGhyLnJlc3BvbnNlVGV4dDtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aGlzLm9uRXJyb3IoZSk7XG4gIH1cbiAgaWYgKG51bGwgIT0gZGF0YSkge1xuICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGl0IGhhcyBYRG9tYWluUmVxdWVzdC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5oYXNYRFIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGdsb2JhbC5YRG9tYWluUmVxdWVzdCAmJiAhdGhpcy54cyAmJiB0aGlzLmVuYWJsZXNYRFI7XG59O1xuXG4vKipcbiAqIEFib3J0cyB0aGUgcmVxdWVzdC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNsZWFudXAoKTtcbn07XG5cbi8qKlxuICogQWJvcnRzIHBlbmRpbmcgcmVxdWVzdHMgd2hlbiB1bmxvYWRpbmcgdGhlIHdpbmRvdy4gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudFxuICogbWVtb3J5IGxlYWtzIChlLmcuIHdoZW4gdXNpbmcgSUUpIGFuZCB0byBlbnN1cmUgdGhhdCBubyBzcHVyaW91cyBlcnJvciBpc1xuICogZW1pdHRlZC5cbiAqL1xuXG5SZXF1ZXN0LnJlcXVlc3RzQ291bnQgPSAwO1xuUmVxdWVzdC5yZXF1ZXN0cyA9IHt9O1xuXG5pZiAoZ2xvYmFsLmRvY3VtZW50KSB7XG4gIGlmIChnbG9iYWwuYXR0YWNoRXZlbnQpIHtcbiAgICBnbG9iYWwuYXR0YWNoRXZlbnQoJ29udW5sb2FkJywgdW5sb2FkSGFuZGxlcik7XG4gIH0gZWxzZSBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgdW5sb2FkSGFuZGxlciwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVubG9hZEhhbmRsZXIgKCkge1xuICBmb3IgKHZhciBpIGluIFJlcXVlc3QucmVxdWVzdHMpIHtcbiAgICBpZiAoUmVxdWVzdC5yZXF1ZXN0cy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgUmVxdWVzdC5yZXF1ZXN0c1tpXS5hYm9ydCgpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBUcmFuc3BvcnQgPSByZXF1aXJlKCcuLi90cmFuc3BvcnQnKTtcbnZhciBwYXJzZXFzID0gcmVxdWlyZSgncGFyc2VxcycpO1xudmFyIHBhcnNlciA9IHJlcXVpcmUoJ2VuZ2luZS5pby1wYXJzZXInKTtcbnZhciBpbmhlcml0ID0gcmVxdWlyZSgnY29tcG9uZW50LWluaGVyaXQnKTtcbnZhciB5ZWFzdCA9IHJlcXVpcmUoJ3llYXN0Jyk7XG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdlbmdpbmUuaW8tY2xpZW50OnBvbGxpbmcnKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvbGxpbmc7XG5cbi8qKlxuICogSXMgWEhSMiBzdXBwb3J0ZWQ/XG4gKi9cblxudmFyIGhhc1hIUjIgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgWE1MSHR0cFJlcXVlc3QgPSByZXF1aXJlKCd4bWxodHRwcmVxdWVzdC1zc2wnKTtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCh7IHhkb21haW46IGZhbHNlIH0pO1xuICByZXR1cm4gbnVsbCAhPSB4aHIucmVzcG9uc2VUeXBlO1xufSkoKTtcblxuLyoqXG4gKiBQb2xsaW5nIGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gUG9sbGluZyAob3B0cykge1xuICB2YXIgZm9yY2VCYXNlNjQgPSAob3B0cyAmJiBvcHRzLmZvcmNlQmFzZTY0KTtcbiAgaWYgKCFoYXNYSFIyIHx8IGZvcmNlQmFzZTY0KSB7XG4gICAgdGhpcy5zdXBwb3J0c0JpbmFyeSA9IGZhbHNlO1xuICB9XG4gIFRyYW5zcG9ydC5jYWxsKHRoaXMsIG9wdHMpO1xufVxuXG4vKipcbiAqIEluaGVyaXRzIGZyb20gVHJhbnNwb3J0LlxuICovXG5cbmluaGVyaXQoUG9sbGluZywgVHJhbnNwb3J0KTtcblxuLyoqXG4gKiBUcmFuc3BvcnQgbmFtZS5cbiAqL1xuXG5Qb2xsaW5nLnByb3RvdHlwZS5uYW1lID0gJ3BvbGxpbmcnO1xuXG4vKipcbiAqIE9wZW5zIHRoZSBzb2NrZXQgKHRyaWdnZXJzIHBvbGxpbmcpLiBXZSB3cml0ZSBhIFBJTkcgbWVzc2FnZSB0byBkZXRlcm1pbmVcbiAqIHdoZW4gdGhlIHRyYW5zcG9ydCBpcyBvcGVuLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblBvbGxpbmcucHJvdG90eXBlLmRvT3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wb2xsKCk7XG59O1xuXG4vKipcbiAqIFBhdXNlcyBwb2xsaW5nLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHVwb24gYnVmZmVycyBhcmUgZmx1c2hlZCBhbmQgdHJhbnNwb3J0IGlzIHBhdXNlZFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUG9sbGluZy5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAob25QYXVzZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgdGhpcy5yZWFkeVN0YXRlID0gJ3BhdXNpbmcnO1xuXG4gIGZ1bmN0aW9uIHBhdXNlICgpIHtcbiAgICBkZWJ1ZygncGF1c2VkJyk7XG4gICAgc2VsZi5yZWFkeVN0YXRlID0gJ3BhdXNlZCc7XG4gICAgb25QYXVzZSgpO1xuICB9XG5cbiAgaWYgKHRoaXMucG9sbGluZyB8fCAhdGhpcy53cml0YWJsZSkge1xuICAgIHZhciB0b3RhbCA9IDA7XG5cbiAgICBpZiAodGhpcy5wb2xsaW5nKSB7XG4gICAgICBkZWJ1Zygnd2UgYXJlIGN1cnJlbnRseSBwb2xsaW5nIC0gd2FpdGluZyB0byBwYXVzZScpO1xuICAgICAgdG90YWwrKztcbiAgICAgIHRoaXMub25jZSgncG9sbENvbXBsZXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWJ1ZygncHJlLXBhdXNlIHBvbGxpbmcgY29tcGxldGUnKTtcbiAgICAgICAgLS10b3RhbCB8fCBwYXVzZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLndyaXRhYmxlKSB7XG4gICAgICBkZWJ1Zygnd2UgYXJlIGN1cnJlbnRseSB3cml0aW5nIC0gd2FpdGluZyB0byBwYXVzZScpO1xuICAgICAgdG90YWwrKztcbiAgICAgIHRoaXMub25jZSgnZHJhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlYnVnKCdwcmUtcGF1c2Ugd3JpdGluZyBjb21wbGV0ZScpO1xuICAgICAgICAtLXRvdGFsIHx8IHBhdXNlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGF1c2UoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTdGFydHMgcG9sbGluZyBjeWNsZS5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblBvbGxpbmcucHJvdG90eXBlLnBvbGwgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdwb2xsaW5nJyk7XG4gIHRoaXMucG9sbGluZyA9IHRydWU7XG4gIHRoaXMuZG9Qb2xsKCk7XG4gIHRoaXMuZW1pdCgncG9sbCcpO1xufTtcblxuLyoqXG4gKiBPdmVybG9hZHMgb25EYXRhIHRvIGRldGVjdCBwYXlsb2Fkcy5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Qb2xsaW5nLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoZGF0YSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGRlYnVnKCdwb2xsaW5nIGdvdCBkYXRhICVzJywgZGF0YSk7XG4gIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIChwYWNrZXQsIGluZGV4LCB0b3RhbCkge1xuICAgIC8vIGlmIGl0cyB0aGUgZmlyc3QgbWVzc2FnZSB3ZSBjb25zaWRlciB0aGUgdHJhbnNwb3J0IG9wZW5cbiAgICBpZiAoJ29wZW5pbmcnID09PSBzZWxmLnJlYWR5U3RhdGUpIHtcbiAgICAgIHNlbGYub25PcGVuKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgaXRzIGEgY2xvc2UgcGFja2V0LCB3ZSBjbG9zZSB0aGUgb25nb2luZyByZXF1ZXN0c1xuICAgIGlmICgnY2xvc2UnID09PSBwYWNrZXQudHlwZSkge1xuICAgICAgc2VsZi5vbkNsb3NlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gb3RoZXJ3aXNlIGJ5cGFzcyBvbkRhdGEgYW5kIGhhbmRsZSB0aGUgbWVzc2FnZVxuICAgIHNlbGYub25QYWNrZXQocGFja2V0KTtcbiAgfTtcblxuICAvLyBkZWNvZGUgcGF5bG9hZFxuICBwYXJzZXIuZGVjb2RlUGF5bG9hZChkYXRhLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlLCBjYWxsYmFjayk7XG5cbiAgLy8gaWYgYW4gZXZlbnQgZGlkIG5vdCB0cmlnZ2VyIGNsb3NpbmdcbiAgaWYgKCdjbG9zZWQnICE9PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAvLyBpZiB3ZSBnb3QgZGF0YSB3ZSdyZSBub3QgcG9sbGluZ1xuICAgIHRoaXMucG9sbGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncG9sbENvbXBsZXRlJyk7XG5cbiAgICBpZiAoJ29wZW4nID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgIHRoaXMucG9sbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZygnaWdub3JpbmcgcG9sbCAtIHRyYW5zcG9ydCBzdGF0ZSBcIiVzXCInLCB0aGlzLnJlYWR5U3RhdGUpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBGb3IgcG9sbGluZywgc2VuZCBhIGNsb3NlIHBhY2tldC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Qb2xsaW5nLnByb3RvdHlwZS5kb0Nsb3NlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgZnVuY3Rpb24gY2xvc2UgKCkge1xuICAgIGRlYnVnKCd3cml0aW5nIGNsb3NlIHBhY2tldCcpO1xuICAgIHNlbGYud3JpdGUoW3sgdHlwZTogJ2Nsb3NlJyB9XSk7XG4gIH1cblxuICBpZiAoJ29wZW4nID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICBkZWJ1ZygndHJhbnNwb3J0IG9wZW4gLSBjbG9zaW5nJyk7XG4gICAgY2xvc2UoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpbiBjYXNlIHdlJ3JlIHRyeWluZyB0byBjbG9zZSB3aGlsZVxuICAgIC8vIGhhbmRzaGFraW5nIGlzIGluIHByb2dyZXNzIChHSC0xNjQpXG4gICAgZGVidWcoJ3RyYW5zcG9ydCBub3Qgb3BlbiAtIGRlZmVycmluZyBjbG9zZScpO1xuICAgIHRoaXMub25jZSgnb3BlbicsIGNsb3NlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXcml0ZXMgYSBwYWNrZXRzIHBheWxvYWQuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gZGF0YSBwYWNrZXRzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkcmFpbiBjYWxsYmFja1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUG9sbGluZy5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAocGFja2V0cykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgdmFyIGNhbGxiYWNrZm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi53cml0YWJsZSA9IHRydWU7XG4gICAgc2VsZi5lbWl0KCdkcmFpbicpO1xuICB9O1xuXG4gIHBhcnNlci5lbmNvZGVQYXlsb2FkKHBhY2tldHMsIHRoaXMuc3VwcG9ydHNCaW5hcnksIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgc2VsZi5kb1dyaXRlKGRhdGEsIGNhbGxiYWNrZm4pO1xuICB9KTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHVyaSBmb3IgY29ubmVjdGlvbi5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Qb2xsaW5nLnByb3RvdHlwZS51cmkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBxdWVyeSA9IHRoaXMucXVlcnkgfHwge307XG4gIHZhciBzY2hlbWEgPSB0aGlzLnNlY3VyZSA/ICdodHRwcycgOiAnaHR0cCc7XG4gIHZhciBwb3J0ID0gJyc7XG5cbiAgLy8gY2FjaGUgYnVzdGluZyBpcyBmb3JjZWRcbiAgaWYgKGZhbHNlICE9PSB0aGlzLnRpbWVzdGFtcFJlcXVlc3RzKSB7XG4gICAgcXVlcnlbdGhpcy50aW1lc3RhbXBQYXJhbV0gPSB5ZWFzdCgpO1xuICB9XG5cbiAgaWYgKCF0aGlzLnN1cHBvcnRzQmluYXJ5ICYmICFxdWVyeS5zaWQpIHtcbiAgICBxdWVyeS5iNjQgPSAxO1xuICB9XG5cbiAgcXVlcnkgPSBwYXJzZXFzLmVuY29kZShxdWVyeSk7XG5cbiAgLy8gYXZvaWQgcG9ydCBpZiBkZWZhdWx0IGZvciBzY2hlbWFcbiAgaWYgKHRoaXMucG9ydCAmJiAoKCdodHRwcycgPT09IHNjaGVtYSAmJiBOdW1iZXIodGhpcy5wb3J0KSAhPT0gNDQzKSB8fFxuICAgICAoJ2h0dHAnID09PSBzY2hlbWEgJiYgTnVtYmVyKHRoaXMucG9ydCkgIT09IDgwKSkpIHtcbiAgICBwb3J0ID0gJzonICsgdGhpcy5wb3J0O1xuICB9XG5cbiAgLy8gcHJlcGVuZCA/IHRvIHF1ZXJ5XG4gIGlmIChxdWVyeS5sZW5ndGgpIHtcbiAgICBxdWVyeSA9ICc/JyArIHF1ZXJ5O1xuICB9XG5cbiAgdmFyIGlwdjYgPSB0aGlzLmhvc3RuYW1lLmluZGV4T2YoJzonKSAhPT0gLTE7XG4gIHJldHVybiBzY2hlbWEgKyAnOi8vJyArIChpcHY2ID8gJ1snICsgdGhpcy5ob3N0bmFtZSArICddJyA6IHRoaXMuaG9zdG5hbWUpICsgcG9ydCArIHRoaXMucGF0aCArIHF1ZXJ5O1xufTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi4vdHJhbnNwb3J0Jyk7XG52YXIgcGFyc2VyID0gcmVxdWlyZSgnZW5naW5lLmlvLXBhcnNlcicpO1xudmFyIHBhcnNlcXMgPSByZXF1aXJlKCdwYXJzZXFzJyk7XG52YXIgaW5oZXJpdCA9IHJlcXVpcmUoJ2NvbXBvbmVudC1pbmhlcml0Jyk7XG52YXIgeWVhc3QgPSByZXF1aXJlKCd5ZWFzdCcpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZW5naW5lLmlvLWNsaWVudDp3ZWJzb2NrZXQnKTtcbnZhciBCcm93c2VyV2ViU29ja2V0ID0gZ2xvYmFsLldlYlNvY2tldCB8fCBnbG9iYWwuTW96V2ViU29ja2V0O1xudmFyIE5vZGVXZWJTb2NrZXQ7XG5pZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgdHJ5IHtcbiAgICBOb2RlV2ViU29ja2V0ID0gcmVxdWlyZSgnd3MnKTtcbiAgfSBjYXRjaCAoZSkgeyB9XG59XG5cbi8qKlxuICogR2V0IGVpdGhlciB0aGUgYFdlYlNvY2tldGAgb3IgYE1veldlYlNvY2tldGAgZ2xvYmFsc1xuICogaW4gdGhlIGJyb3dzZXIgb3IgdHJ5IHRvIHJlc29sdmUgV2ViU29ja2V0LWNvbXBhdGlibGVcbiAqIGludGVyZmFjZSBleHBvc2VkIGJ5IGB3c2AgZm9yIE5vZGUtbGlrZSBlbnZpcm9ubWVudC5cbiAqL1xuXG52YXIgV2ViU29ja2V0ID0gQnJvd3NlcldlYlNvY2tldDtcbmlmICghV2ViU29ja2V0ICYmIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gIFdlYlNvY2tldCA9IE5vZGVXZWJTb2NrZXQ7XG59XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBXUztcblxuLyoqXG4gKiBXZWJTb2NrZXQgdHJhbnNwb3J0IGNvbnN0cnVjdG9yLlxuICpcbiAqIEBhcGkge09iamVjdH0gY29ubmVjdGlvbiBvcHRpb25zXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFdTIChvcHRzKSB7XG4gIHZhciBmb3JjZUJhc2U2NCA9IChvcHRzICYmIG9wdHMuZm9yY2VCYXNlNjQpO1xuICBpZiAoZm9yY2VCYXNlNjQpIHtcbiAgICB0aGlzLnN1cHBvcnRzQmluYXJ5ID0gZmFsc2U7XG4gIH1cbiAgdGhpcy5wZXJNZXNzYWdlRGVmbGF0ZSA9IG9wdHMucGVyTWVzc2FnZURlZmxhdGU7XG4gIHRoaXMudXNpbmdCcm93c2VyV2ViU29ja2V0ID0gQnJvd3NlcldlYlNvY2tldCAmJiAhb3B0cy5mb3JjZU5vZGU7XG4gIHRoaXMucHJvdG9jb2xzID0gb3B0cy5wcm90b2NvbHM7XG4gIGlmICghdGhpcy51c2luZ0Jyb3dzZXJXZWJTb2NrZXQpIHtcbiAgICBXZWJTb2NrZXQgPSBOb2RlV2ViU29ja2V0O1xuICB9XG4gIFRyYW5zcG9ydC5jYWxsKHRoaXMsIG9wdHMpO1xufVxuXG4vKipcbiAqIEluaGVyaXRzIGZyb20gVHJhbnNwb3J0LlxuICovXG5cbmluaGVyaXQoV1MsIFRyYW5zcG9ydCk7XG5cbi8qKlxuICogVHJhbnNwb3J0IG5hbWUuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5XUy5wcm90b3R5cGUubmFtZSA9ICd3ZWJzb2NrZXQnO1xuXG4vKlxuICogV2ViU29ja2V0cyBzdXBwb3J0IGJpbmFyeVxuICovXG5cbldTLnByb3RvdHlwZS5zdXBwb3J0c0JpbmFyeSA9IHRydWU7XG5cbi8qKlxuICogT3BlbnMgc29ja2V0LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbldTLnByb3RvdHlwZS5kb09wZW4gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jaGVjaygpKSB7XG4gICAgLy8gbGV0IHByb2JlIHRpbWVvdXRcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdXJpID0gdGhpcy51cmkoKTtcbiAgdmFyIHByb3RvY29scyA9IHRoaXMucHJvdG9jb2xzO1xuICB2YXIgb3B0cyA9IHtcbiAgICBhZ2VudDogdGhpcy5hZ2VudCxcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZTogdGhpcy5wZXJNZXNzYWdlRGVmbGF0ZVxuICB9O1xuXG4gIC8vIFNTTCBvcHRpb25zIGZvciBOb2RlLmpzIGNsaWVudFxuICBvcHRzLnBmeCA9IHRoaXMucGZ4O1xuICBvcHRzLmtleSA9IHRoaXMua2V5O1xuICBvcHRzLnBhc3NwaHJhc2UgPSB0aGlzLnBhc3NwaHJhc2U7XG4gIG9wdHMuY2VydCA9IHRoaXMuY2VydDtcbiAgb3B0cy5jYSA9IHRoaXMuY2E7XG4gIG9wdHMuY2lwaGVycyA9IHRoaXMuY2lwaGVycztcbiAgb3B0cy5yZWplY3RVbmF1dGhvcml6ZWQgPSB0aGlzLnJlamVjdFVuYXV0aG9yaXplZDtcbiAgaWYgKHRoaXMuZXh0cmFIZWFkZXJzKSB7XG4gICAgb3B0cy5oZWFkZXJzID0gdGhpcy5leHRyYUhlYWRlcnM7XG4gIH1cbiAgaWYgKHRoaXMubG9jYWxBZGRyZXNzKSB7XG4gICAgb3B0cy5sb2NhbEFkZHJlc3MgPSB0aGlzLmxvY2FsQWRkcmVzcztcbiAgfVxuXG4gIHRyeSB7XG4gICAgdGhpcy53cyA9IHRoaXMudXNpbmdCcm93c2VyV2ViU29ja2V0ID8gKHByb3RvY29scyA/IG5ldyBXZWJTb2NrZXQodXJpLCBwcm90b2NvbHMpIDogbmV3IFdlYlNvY2tldCh1cmkpKSA6IG5ldyBXZWJTb2NrZXQodXJpLCBwcm90b2NvbHMsIG9wdHMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cblxuICBpZiAodGhpcy53cy5iaW5hcnlUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnN1cHBvcnRzQmluYXJ5ID0gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy53cy5zdXBwb3J0cyAmJiB0aGlzLndzLnN1cHBvcnRzLmJpbmFyeSkge1xuICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSB0cnVlO1xuICAgIHRoaXMud3MuYmluYXJ5VHlwZSA9ICdub2RlYnVmZmVyJztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLndzLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICB9XG5cbiAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xufTtcblxuLyoqXG4gKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgc29ja2V0XG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuV1MucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgdGhpcy53cy5vbm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5vbk9wZW4oKTtcbiAgfTtcbiAgdGhpcy53cy5vbmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgIHNlbGYub25DbG9zZSgpO1xuICB9O1xuICB0aGlzLndzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldikge1xuICAgIHNlbGYub25EYXRhKGV2LmRhdGEpO1xuICB9O1xuICB0aGlzLndzLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgIHNlbGYub25FcnJvcignd2Vic29ja2V0IGVycm9yJywgZSk7XG4gIH07XG59O1xuXG4vKipcbiAqIFdyaXRlcyBkYXRhIHRvIHNvY2tldC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBwYWNrZXRzLlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuV1MucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHBhY2tldHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgLy8gZW5jb2RlUGFja2V0IGVmZmljaWVudCBhcyBpdCB1c2VzIFdTIGZyYW1pbmdcbiAgLy8gbm8gbmVlZCBmb3IgZW5jb2RlUGF5bG9hZFxuICB2YXIgdG90YWwgPSBwYWNrZXRzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB0b3RhbDsgaSA8IGw7IGkrKykge1xuICAgIChmdW5jdGlvbiAocGFja2V0KSB7XG4gICAgICBwYXJzZXIuZW5jb2RlUGFja2V0KHBhY2tldCwgc2VsZi5zdXBwb3J0c0JpbmFyeSwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKCFzZWxmLnVzaW5nQnJvd3NlcldlYlNvY2tldCkge1xuICAgICAgICAgIC8vIGFsd2F5cyBjcmVhdGUgYSBuZXcgb2JqZWN0IChHSC00MzcpXG4gICAgICAgICAgdmFyIG9wdHMgPSB7fTtcbiAgICAgICAgICBpZiAocGFja2V0Lm9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdHMuY29tcHJlc3MgPSBwYWNrZXQub3B0aW9ucy5jb21wcmVzcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VsZi5wZXJNZXNzYWdlRGVmbGF0ZSkge1xuICAgICAgICAgICAgdmFyIGxlbiA9ICdzdHJpbmcnID09PSB0eXBlb2YgZGF0YSA/IGdsb2JhbC5CdWZmZXIuYnl0ZUxlbmd0aChkYXRhKSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGxlbiA8IHNlbGYucGVyTWVzc2FnZURlZmxhdGUudGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgIG9wdHMuY29tcHJlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb21ldGltZXMgdGhlIHdlYnNvY2tldCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBidXQgdGhlIGJyb3dzZXIgZGlkbid0XG4gICAgICAgIC8vIGhhdmUgYSBjaGFuY2Ugb2YgaW5mb3JtaW5nIHVzIGFib3V0IGl0IHlldCwgaW4gdGhhdCBjYXNlIHNlbmQgd2lsbFxuICAgICAgICAvLyB0aHJvdyBhbiBlcnJvclxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChzZWxmLnVzaW5nQnJvd3NlcldlYlNvY2tldCkge1xuICAgICAgICAgICAgLy8gVHlwZUVycm9yIGlzIHRocm93biB3aGVuIHBhc3NpbmcgdGhlIHNlY29uZCBhcmd1bWVudCBvbiBTYWZhcmlcbiAgICAgICAgICAgIHNlbGYud3Muc2VuZChkYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi53cy5zZW5kKGRhdGEsIG9wdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGRlYnVnKCd3ZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSBvbmNsb3NlIGV2ZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAtLXRvdGFsIHx8IGRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pKHBhY2tldHNbaV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZG9uZSAoKSB7XG4gICAgc2VsZi5lbWl0KCdmbHVzaCcpO1xuXG4gICAgLy8gZmFrZSBkcmFpblxuICAgIC8vIGRlZmVyIHRvIG5leHQgdGljayB0byBhbGxvdyBTb2NrZXQgdG8gY2xlYXIgd3JpdGVCdWZmZXJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYud3JpdGFibGUgPSB0cnVlO1xuICAgICAgc2VsZi5lbWl0KCdkcmFpbicpO1xuICAgIH0sIDApO1xuICB9XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIGNsb3NlXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuV1MucHJvdG90eXBlLm9uQ2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIFRyYW5zcG9ydC5wcm90b3R5cGUub25DbG9zZS5jYWxsKHRoaXMpO1xufTtcblxuLyoqXG4gKiBDbG9zZXMgc29ja2V0LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbldTLnByb3RvdHlwZS5kb0Nsb3NlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIHRoaXMud3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy53cy5jbG9zZSgpO1xuICB9XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyB1cmkgZm9yIGNvbm5lY3Rpb24uXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuV1MucHJvdG90eXBlLnVyaSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcbiAgdmFyIHNjaGVtYSA9IHRoaXMuc2VjdXJlID8gJ3dzcycgOiAnd3MnO1xuICB2YXIgcG9ydCA9ICcnO1xuXG4gIC8vIGF2b2lkIHBvcnQgaWYgZGVmYXVsdCBmb3Igc2NoZW1hXG4gIGlmICh0aGlzLnBvcnQgJiYgKCgnd3NzJyA9PT0gc2NoZW1hICYmIE51bWJlcih0aGlzLnBvcnQpICE9PSA0NDMpIHx8XG4gICAgKCd3cycgPT09IHNjaGVtYSAmJiBOdW1iZXIodGhpcy5wb3J0KSAhPT0gODApKSkge1xuICAgIHBvcnQgPSAnOicgKyB0aGlzLnBvcnQ7XG4gIH1cblxuICAvLyBhcHBlbmQgdGltZXN0YW1wIHRvIFVSSVxuICBpZiAodGhpcy50aW1lc3RhbXBSZXF1ZXN0cykge1xuICAgIHF1ZXJ5W3RoaXMudGltZXN0YW1wUGFyYW1dID0geWVhc3QoKTtcbiAgfVxuXG4gIC8vIGNvbW11bmljYXRlIGJpbmFyeSBzdXBwb3J0IGNhcGFiaWxpdGllc1xuICBpZiAoIXRoaXMuc3VwcG9ydHNCaW5hcnkpIHtcbiAgICBxdWVyeS5iNjQgPSAxO1xuICB9XG5cbiAgcXVlcnkgPSBwYXJzZXFzLmVuY29kZShxdWVyeSk7XG5cbiAgLy8gcHJlcGVuZCA/IHRvIHF1ZXJ5XG4gIGlmIChxdWVyeS5sZW5ndGgpIHtcbiAgICBxdWVyeSA9ICc/JyArIHF1ZXJ5O1xuICB9XG5cbiAgdmFyIGlwdjYgPSB0aGlzLmhvc3RuYW1lLmluZGV4T2YoJzonKSAhPT0gLTE7XG4gIHJldHVybiBzY2hlbWEgKyAnOi8vJyArIChpcHY2ID8gJ1snICsgdGhpcy5ob3N0bmFtZSArICddJyA6IHRoaXMuaG9zdG5hbWUpICsgcG9ydCArIHRoaXMucGF0aCArIHF1ZXJ5O1xufTtcblxuLyoqXG4gKiBGZWF0dXJlIGRldGVjdGlvbiBmb3IgV2ViU29ja2V0LlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgYXZhaWxhYmxlLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5XUy5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhIVdlYlNvY2tldCAmJiAhKCdfX2luaXRpYWxpemUnIGluIFdlYlNvY2tldCAmJiB0aGlzLm5hbWUgPT09IFdTLnByb3RvdHlwZS5uYW1lKTtcbn07XG4iLCIvLyBicm93c2VyIHNoaW0gZm9yIHhtbGh0dHByZXF1ZXN0IG1vZHVsZVxuXG52YXIgaGFzQ09SUyA9IHJlcXVpcmUoJ2hhcy1jb3JzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgdmFyIHhkb21haW4gPSBvcHRzLnhkb21haW47XG5cbiAgLy8gc2NoZW1lIG11c3QgYmUgc2FtZSB3aGVuIHVzaWduIFhEb21haW5SZXF1ZXN0XG4gIC8vIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9iL2llaW50ZXJuYWxzL2FyY2hpdmUvMjAxMC8wNS8xMy94ZG9tYWlucmVxdWVzdC1yZXN0cmljdGlvbnMtbGltaXRhdGlvbnMtYW5kLXdvcmthcm91bmRzLmFzcHhcbiAgdmFyIHhzY2hlbWUgPSBvcHRzLnhzY2hlbWU7XG5cbiAgLy8gWERvbWFpblJlcXVlc3QgaGFzIGEgZmxvdyBvZiBub3Qgc2VuZGluZyBjb29raWUsIHRoZXJlZm9yZSBpdCBzaG91bGQgYmUgZGlzYWJsZWQgYXMgYSBkZWZhdWx0LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vQXV0b21hdHRpYy9lbmdpbmUuaW8tY2xpZW50L3B1bGwvMjE3XG4gIHZhciBlbmFibGVzWERSID0gb3B0cy5lbmFibGVzWERSO1xuXG4gIC8vIFhNTEh0dHBSZXF1ZXN0IGNhbiBiZSBkaXNhYmxlZCBvbiBJRVxuICB0cnkge1xuICAgIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICYmICgheGRvbWFpbiB8fCBoYXNDT1JTKSkge1xuICAgICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkgeyB9XG5cbiAgLy8gVXNlIFhEb21haW5SZXF1ZXN0IGZvciBJRTggaWYgZW5hYmxlc1hEUiBpcyB0cnVlXG4gIC8vIGJlY2F1c2UgbG9hZGluZyBiYXIga2VlcHMgZmxhc2hpbmcgd2hlbiB1c2luZyBqc29ucC1wb2xsaW5nXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS95dWppb3Nha2Evc29ja2UuaW8taWU4LWxvYWRpbmctZXhhbXBsZVxuICB0cnkge1xuICAgIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIFhEb21haW5SZXF1ZXN0ICYmICF4c2NoZW1lICYmIGVuYWJsZXNYRFIpIHtcbiAgICAgIHJldHVybiBuZXcgWERvbWFpblJlcXVlc3QoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHsgfVxuXG4gIGlmICgheGRvbWFpbikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IGdsb2JhbFtbJ0FjdGl2ZSddLmNvbmNhdCgnT2JqZWN0Jykuam9pbignWCcpXSgnTWljcm9zb2Z0LlhNTEhUVFAnKTtcbiAgICB9IGNhdGNoIChlKSB7IH1cbiAgfVxufTtcbiIsIi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZVxuICAgICAgICAgICAgICAgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZS5zdG9yYWdlXG4gICAgICAgICAgICAgICAgICA/IGNocm9tZS5zdG9yYWdlLmxvY2FsXG4gICAgICAgICAgICAgICAgICA6IGxvY2Fsc3RvcmFnZSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcbiAgJyMwMDAwQ0MnLCAnIzAwMDBGRicsICcjMDAzM0NDJywgJyMwMDMzRkYnLCAnIzAwNjZDQycsICcjMDA2NkZGJywgJyMwMDk5Q0MnLFxuICAnIzAwOTlGRicsICcjMDBDQzAwJywgJyMwMENDMzMnLCAnIzAwQ0M2NicsICcjMDBDQzk5JywgJyMwMENDQ0MnLCAnIzAwQ0NGRicsXG4gICcjMzMwMENDJywgJyMzMzAwRkYnLCAnIzMzMzNDQycsICcjMzMzM0ZGJywgJyMzMzY2Q0MnLCAnIzMzNjZGRicsICcjMzM5OUNDJyxcbiAgJyMzMzk5RkYnLCAnIzMzQ0MwMCcsICcjMzNDQzMzJywgJyMzM0NDNjYnLCAnIzMzQ0M5OScsICcjMzNDQ0NDJywgJyMzM0NDRkYnLFxuICAnIzY2MDBDQycsICcjNjYwMEZGJywgJyM2NjMzQ0MnLCAnIzY2MzNGRicsICcjNjZDQzAwJywgJyM2NkNDMzMnLCAnIzk5MDBDQycsXG4gICcjOTkwMEZGJywgJyM5OTMzQ0MnLCAnIzk5MzNGRicsICcjOTlDQzAwJywgJyM5OUNDMzMnLCAnI0NDMDAwMCcsICcjQ0MwMDMzJyxcbiAgJyNDQzAwNjYnLCAnI0NDMDA5OScsICcjQ0MwMENDJywgJyNDQzAwRkYnLCAnI0NDMzMwMCcsICcjQ0MzMzMzJywgJyNDQzMzNjYnLFxuICAnI0NDMzM5OScsICcjQ0MzM0NDJywgJyNDQzMzRkYnLCAnI0NDNjYwMCcsICcjQ0M2NjMzJywgJyNDQzk5MDAnLCAnI0NDOTkzMycsXG4gICcjQ0NDQzAwJywgJyNDQ0NDMzMnLCAnI0ZGMDAwMCcsICcjRkYwMDMzJywgJyNGRjAwNjYnLCAnI0ZGMDA5OScsICcjRkYwMENDJyxcbiAgJyNGRjAwRkYnLCAnI0ZGMzMwMCcsICcjRkYzMzMzJywgJyNGRjMzNjYnLCAnI0ZGMzM5OScsICcjRkYzM0NDJywgJyNGRjMzRkYnLFxuICAnI0ZGNjYwMCcsICcjRkY2NjMzJywgJyNGRjk5MDAnLCAnI0ZGOTkzMycsICcjRkZDQzAwJywgJyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgLy8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuICAvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuICAvLyBleHBsaWNpdGx5XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGlzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG4gIC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG4gIHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuICAgIC8vIGlzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuICAgIC8vIGlzIGZpcmVmb3ggPj0gdjMxP1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuICAgIC8vIGRvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uKHYpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnIubWVzc2FnZTtcbiAgfVxufTtcblxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuICB2YXIgdXNlQ29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cbiAgYXJnc1swXSA9ICh1c2VDb2xvcnMgPyAnJWMnIDogJycpXG4gICAgKyB0aGlzLm5hbWVzcGFjZVxuICAgICsgKHVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKVxuICAgICsgYXJnc1swXVxuICAgICsgKHVzZUNvbG9ycyA/ICclYyAnIDogJyAnKVxuICAgICsgJysnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG4gIGlmICghdXNlQ29sb3JzKSByZXR1cm47XG5cbiAgdmFyIGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuICBhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKVxuXG4gIC8vIHRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG4gIC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cbiAgLy8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0QyA9IDA7XG4gIGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIGlmICgnJSUnID09PSBtYXRjaCkgcmV0dXJuO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCclYycgPT09IG1hdGNoKSB7XG4gICAgICAvLyB3ZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcbiAgICAgIC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG4gICAgICBsYXN0QyA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgYXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUubG9nKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5sb2dgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgLy8gdGhpcyBoYWNrZXJ5IGlzIHJlcXVpcmVkIGZvciBJRTgvOSwgd2hlcmVcbiAgLy8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24gZG9lc24ndCBoYXZlICdhcHBseSdcbiAgcmV0dXJuICdvYmplY3QnID09PSB0eXBlb2YgY29uc29sZVxuICAgICYmIGNvbnNvbGUubG9nXG4gICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICB0cnkge1xuICAgIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UuZGVidWcgPSBuYW1lc3BhY2VzO1xuICAgIH1cbiAgfSBjYXRjaChlKSB7fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIHIgPSBleHBvcnRzLnN0b3JhZ2UuZGVidWc7XG4gIH0gY2F0Y2goZSkge31cblxuICAvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG4gIGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuICAgIHIgPSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfVxuXG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgbG9jYWxTdG9yYWdlLmRlYnVnYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gY3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Z1snZGVmYXVsdCddID0gY3JlYXRlRGVidWc7XG5leHBvcnRzLmNvZXJjZSA9IGNvZXJjZTtcbmV4cG9ydHMuZGlzYWJsZSA9IGRpc2FibGU7XG5leHBvcnRzLmVuYWJsZSA9IGVuYWJsZTtcbmV4cG9ydHMuZW5hYmxlZCA9IGVuYWJsZWQ7XG5leHBvcnRzLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblxuLyoqXG4gKiBBY3RpdmUgYGRlYnVnYCBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydHMuaW5zdGFuY2VzID0gW107XG5cbi8qKlxuICogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG4gKi9cblxuZXhwb3J0cy5uYW1lcyA9IFtdO1xuZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cbiAqXG4gKiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzID0ge307XG5cbi8qKlxuICogU2VsZWN0IGEgY29sb3IuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcbiAgdmFyIGhhc2ggPSAwLCBpO1xuXG4gIGZvciAoaSBpbiBuYW1lc3BhY2UpIHtcbiAgICBoYXNoICA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGV4cG9ydHMuY29sb3JzLmxlbmd0aF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXG4gIHZhciBwcmV2VGltZTtcblxuICBmdW5jdGlvbiBkZWJ1ZygpIHtcbiAgICAvLyBkaXNhYmxlZD9cbiAgICBpZiAoIWRlYnVnLmVuYWJsZWQpIHJldHVybjtcblxuICAgIHZhciBzZWxmID0gZGVidWc7XG5cbiAgICAvLyBzZXQgYGRpZmZgIHRpbWVzdGFtcFxuICAgIHZhciBjdXJyID0gK25ldyBEYXRlKCk7XG4gICAgdmFyIG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcbiAgICBzZWxmLmRpZmYgPSBtcztcbiAgICBzZWxmLnByZXYgPSBwcmV2VGltZTtcbiAgICBzZWxmLmN1cnIgPSBjdXJyO1xuICAgIHByZXZUaW1lID0gY3VycjtcblxuICAgIC8vIHR1cm4gdGhlIGBhcmd1bWVudHNgIGludG8gYSBwcm9wZXIgQXJyYXlcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgYXJnc1swXSA9IGV4cG9ydHMuY29lcmNlKGFyZ3NbMF0pO1xuXG4gICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgYXJnc1swXSkge1xuICAgICAgLy8gYW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cbiAgICAgIGFyZ3MudW5zaGlmdCgnJU8nKTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgYXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIGZ1bmN0aW9uKG1hdGNoLCBmb3JtYXQpIHtcbiAgICAgIC8vIGlmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcbiAgICAgIGlmIChtYXRjaCA9PT0gJyUlJykgcmV0dXJuIG1hdGNoO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHZhciBmb3JtYXR0ZXIgPSBleHBvcnRzLmZvcm1hdHRlcnNbZm9ybWF0XTtcbiAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZm9ybWF0dGVyKSB7XG4gICAgICAgIHZhciB2YWwgPSBhcmdzW2luZGV4XTtcbiAgICAgICAgbWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG4gICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcbiAgICAgICAgYXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpbmRleC0tO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuXG4gICAgLy8gYXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcbiAgICBleHBvcnRzLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuICAgIHZhciBsb2dGbiA9IGRlYnVnLmxvZyB8fCBleHBvcnRzLmxvZyB8fCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuICAgIGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICB9XG5cbiAgZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICBkZWJ1Zy5lbmFibGVkID0gZXhwb3J0cy5lbmFibGVkKG5hbWVzcGFjZSk7XG4gIGRlYnVnLnVzZUNvbG9ycyA9IGV4cG9ydHMudXNlQ29sb3JzKCk7XG4gIGRlYnVnLmNvbG9yID0gc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcbiAgZGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cbiAgLy8gZW52LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciBkZWJ1ZyBpbnN0YW5jZXNcbiAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBleHBvcnRzLmluaXQpIHtcbiAgICBleHBvcnRzLmluaXQoZGVidWcpO1xuICB9XG5cbiAgZXhwb3J0cy5pbnN0YW5jZXMucHVzaChkZWJ1Zyk7XG5cbiAgcmV0dXJuIGRlYnVnO1xufVxuXG5mdW5jdGlvbiBkZXN0cm95ICgpIHtcbiAgdmFyIGluZGV4ID0gZXhwb3J0cy5pbnN0YW5jZXMuaW5kZXhPZih0aGlzKTtcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIGV4cG9ydHMuaW5zdGFuY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuICogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuICBleHBvcnRzLnNhdmUobmFtZXNwYWNlcyk7XG5cbiAgZXhwb3J0cy5uYW1lcyA9IFtdO1xuICBleHBvcnRzLnNraXBzID0gW107XG5cbiAgdmFyIGk7XG4gIHZhciBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG4gIHZhciBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKCFzcGxpdFtpXSkgY29udGludWU7IC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG4gICAgbmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG4gICAgaWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuICAgICAgZXhwb3J0cy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0cy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCBleHBvcnRzLmluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpbnN0YW5jZSA9IGV4cG9ydHMuaW5zdGFuY2VzW2ldO1xuICAgIGluc3RhbmNlLmVuYWJsZWQgPSBleHBvcnRzLmVuYWJsZWQoaW5zdGFuY2UubmFtZXNwYWNlKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgZXhwb3J0cy5lbmFibGUoJycpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG4gIGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBpLCBsZW47XG4gIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZXhwb3J0cy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZXhwb3J0cy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvZXJjZSBgdmFsYC5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWxcbiAqIEByZXR1cm4ge01peGVkfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG4gIHJldHVybiB2YWw7XG59XG4iLCIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcbnZhciBoYXNCaW5hcnkgPSByZXF1aXJlKCdoYXMtYmluYXJ5MicpO1xudmFyIHNsaWNlQnVmZmVyID0gcmVxdWlyZSgnYXJyYXlidWZmZXIuc2xpY2UnKTtcbnZhciBhZnRlciA9IHJlcXVpcmUoJ2FmdGVyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xuXG52YXIgYmFzZTY0ZW5jb2RlcjtcbmlmIChnbG9iYWwgJiYgZ2xvYmFsLkFycmF5QnVmZmVyKSB7XG4gIGJhc2U2NGVuY29kZXIgPSByZXF1aXJlKCdiYXNlNjQtYXJyYXlidWZmZXInKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB3ZSBhcmUgcnVubmluZyBhbiBhbmRyb2lkIGJyb3dzZXIuIFRoYXQgcmVxdWlyZXMgdXMgdG8gdXNlXG4gKiBBcnJheUJ1ZmZlciB3aXRoIHBvbGxpbmcgdHJhbnNwb3J0cy4uLlxuICpcbiAqIGh0dHA6Ly9naGluZGEubmV0L2pwZWctYmxvYi1hamF4LWFuZHJvaWQvXG4gKi9cblxudmFyIGlzQW5kcm9pZCA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIC9BbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxuLyoqXG4gKiBDaGVjayBpZiB3ZSBhcmUgcnVubmluZyBpbiBQaGFudG9tSlMuXG4gKiBVcGxvYWRpbmcgYSBCbG9iIHdpdGggUGhhbnRvbUpTIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5LCBhcyByZXBvcnRlZCBoZXJlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyaXlhL3BoYW50b21qcy9pc3N1ZXMvMTEzOTVcbiAqIEB0eXBlIGJvb2xlYW5cbiAqL1xudmFyIGlzUGhhbnRvbUpTID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgL1BoYW50b21KUy9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogV2hlbiB0cnVlLCBhdm9pZHMgdXNpbmcgQmxvYnMgdG8gZW5jb2RlIHBheWxvYWRzLlxuICogQHR5cGUgYm9vbGVhblxuICovXG52YXIgZG9udFNlbmRCbG9icyA9IGlzQW5kcm9pZCB8fCBpc1BoYW50b21KUztcblxuLyoqXG4gKiBDdXJyZW50IHByb3RvY29sIHZlcnNpb24uXG4gKi9cblxuZXhwb3J0cy5wcm90b2NvbCA9IDM7XG5cbi8qKlxuICogUGFja2V0IHR5cGVzLlxuICovXG5cbnZhciBwYWNrZXRzID0gZXhwb3J0cy5wYWNrZXRzID0ge1xuICAgIG9wZW46ICAgICAwICAgIC8vIG5vbi13c1xuICAsIGNsb3NlOiAgICAxICAgIC8vIG5vbi13c1xuICAsIHBpbmc6ICAgICAyXG4gICwgcG9uZzogICAgIDNcbiAgLCBtZXNzYWdlOiAgNFxuICAsIHVwZ3JhZGU6ICA1XG4gICwgbm9vcDogICAgIDZcbn07XG5cbnZhciBwYWNrZXRzbGlzdCA9IGtleXMocGFja2V0cyk7XG5cbi8qKlxuICogUHJlbWFkZSBlcnJvciBwYWNrZXQuXG4gKi9cblxudmFyIGVyciA9IHsgdHlwZTogJ2Vycm9yJywgZGF0YTogJ3BhcnNlciBlcnJvcicgfTtcblxuLyoqXG4gKiBDcmVhdGUgYSBibG9iIGFwaSBldmVuIGZvciBibG9iIGJ1aWxkZXIgd2hlbiB2ZW5kb3IgcHJlZml4ZXMgZXhpc3RcbiAqL1xuXG52YXIgQmxvYiA9IHJlcXVpcmUoJ2Jsb2InKTtcblxuLyoqXG4gKiBFbmNvZGVzIGEgcGFja2V0LlxuICpcbiAqICAgICA8cGFja2V0IHR5cGUgaWQ+IFsgPGRhdGE+IF1cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICA1aGVsbG8gd29ybGRcbiAqICAgICAzXG4gKiAgICAgNFxuICpcbiAqIEJpbmFyeSBpcyBlbmNvZGVkIGluIGFuIGlkZW50aWNhbCBwcmluY2lwbGVcbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmVuY29kZVBhY2tldCA9IGZ1bmN0aW9uIChwYWNrZXQsIHN1cHBvcnRzQmluYXJ5LCB1dGY4ZW5jb2RlLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIHN1cHBvcnRzQmluYXJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBzdXBwb3J0c0JpbmFyeTtcbiAgICBzdXBwb3J0c0JpbmFyeSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB1dGY4ZW5jb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSB1dGY4ZW5jb2RlO1xuICAgIHV0ZjhlbmNvZGUgPSBudWxsO1xuICB9XG5cbiAgdmFyIGRhdGEgPSAocGFja2V0LmRhdGEgPT09IHVuZGVmaW5lZClcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogcGFja2V0LmRhdGEuYnVmZmVyIHx8IHBhY2tldC5kYXRhO1xuXG4gIGlmIChnbG9iYWwuQXJyYXlCdWZmZXIgJiYgZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGVuY29kZUFycmF5QnVmZmVyKHBhY2tldCwgc3VwcG9ydHNCaW5hcnksIGNhbGxiYWNrKTtcbiAgfSBlbHNlIGlmIChCbG9iICYmIGRhdGEgaW5zdGFuY2VvZiBnbG9iYWwuQmxvYikge1xuICAgIHJldHVybiBlbmNvZGVCbG9iKHBhY2tldCwgc3VwcG9ydHNCaW5hcnksIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vIG1pZ2h0IGJlIGFuIG9iamVjdCB3aXRoIHsgYmFzZTY0OiB0cnVlLCBkYXRhOiBkYXRhQXNCYXNlNjRTdHJpbmcgfVxuICBpZiAoZGF0YSAmJiBkYXRhLmJhc2U2NCkge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRPYmplY3QocGFja2V0LCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyBTZW5kaW5nIGRhdGEgYXMgYSB1dGYtOCBzdHJpbmdcbiAgdmFyIGVuY29kZWQgPSBwYWNrZXRzW3BhY2tldC50eXBlXTtcblxuICAvLyBkYXRhIGZyYWdtZW50IGlzIG9wdGlvbmFsXG4gIGlmICh1bmRlZmluZWQgIT09IHBhY2tldC5kYXRhKSB7XG4gICAgZW5jb2RlZCArPSB1dGY4ZW5jb2RlID8gdXRmOC5lbmNvZGUoU3RyaW5nKHBhY2tldC5kYXRhKSwgeyBzdHJpY3Q6IGZhbHNlIH0pIDogU3RyaW5nKHBhY2tldC5kYXRhKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsYmFjaygnJyArIGVuY29kZWQpO1xuXG59O1xuXG5mdW5jdGlvbiBlbmNvZGVCYXNlNjRPYmplY3QocGFja2V0LCBjYWxsYmFjaykge1xuICAvLyBwYWNrZXQgZGF0YSBpcyBhbiBvYmplY3QgeyBiYXNlNjQ6IHRydWUsIGRhdGE6IGRhdGFBc0Jhc2U2NFN0cmluZyB9XG4gIHZhciBtZXNzYWdlID0gJ2InICsgZXhwb3J0cy5wYWNrZXRzW3BhY2tldC50eXBlXSArIHBhY2tldC5kYXRhLmRhdGE7XG4gIHJldHVybiBjYWxsYmFjayhtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgcGFja2V0IGhlbHBlcnMgZm9yIGJpbmFyeSB0eXBlc1xuICovXG5cbmZ1bmN0aW9uIGVuY29kZUFycmF5QnVmZmVyKHBhY2tldCwgc3VwcG9ydHNCaW5hcnksIGNhbGxiYWNrKSB7XG4gIGlmICghc3VwcG9ydHNCaW5hcnkpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5lbmNvZGVCYXNlNjRQYWNrZXQocGFja2V0LCBjYWxsYmFjayk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHBhY2tldC5kYXRhO1xuICB2YXIgY29udGVudEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIHZhciByZXN1bHRCdWZmZXIgPSBuZXcgVWludDhBcnJheSgxICsgZGF0YS5ieXRlTGVuZ3RoKTtcblxuICByZXN1bHRCdWZmZXJbMF0gPSBwYWNrZXRzW3BhY2tldC50eXBlXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRCdWZmZXJbaSsxXSA9IGNvbnRlbnRBcnJheVtpXTtcbiAgfVxuXG4gIHJldHVybiBjYWxsYmFjayhyZXN1bHRCdWZmZXIuYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gZW5jb2RlQmxvYkFzQXJyYXlCdWZmZXIocGFja2V0LCBzdXBwb3J0c0JpbmFyeSwgY2FsbGJhY2spIHtcbiAgaWYgKCFzdXBwb3J0c0JpbmFyeSkge1xuICAgIHJldHVybiBleHBvcnRzLmVuY29kZUJhc2U2NFBhY2tldChwYWNrZXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHZhciBmciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIGZyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgIHBhY2tldC5kYXRhID0gZnIucmVzdWx0O1xuICAgIGV4cG9ydHMuZW5jb2RlUGFja2V0KHBhY2tldCwgc3VwcG9ydHNCaW5hcnksIHRydWUsIGNhbGxiYWNrKTtcbiAgfTtcbiAgcmV0dXJuIGZyLnJlYWRBc0FycmF5QnVmZmVyKHBhY2tldC5kYXRhKTtcbn1cblxuZnVuY3Rpb24gZW5jb2RlQmxvYihwYWNrZXQsIHN1cHBvcnRzQmluYXJ5LCBjYWxsYmFjaykge1xuICBpZiAoIXN1cHBvcnRzQmluYXJ5KSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuZW5jb2RlQmFzZTY0UGFja2V0KHBhY2tldCwgY2FsbGJhY2spO1xuICB9XG5cbiAgaWYgKGRvbnRTZW5kQmxvYnMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmxvYkFzQXJyYXlCdWZmZXIocGFja2V0LCBzdXBwb3J0c0JpbmFyeSwgY2FsbGJhY2spO1xuICB9XG5cbiAgdmFyIGxlbmd0aCA9IG5ldyBVaW50OEFycmF5KDEpO1xuICBsZW5ndGhbMF0gPSBwYWNrZXRzW3BhY2tldC50eXBlXTtcbiAgdmFyIGJsb2IgPSBuZXcgQmxvYihbbGVuZ3RoLmJ1ZmZlciwgcGFja2V0LmRhdGFdKTtcblxuICByZXR1cm4gY2FsbGJhY2soYmxvYik7XG59XG5cbi8qKlxuICogRW5jb2RlcyBhIHBhY2tldCB3aXRoIGJpbmFyeSBkYXRhIGluIGEgYmFzZTY0IHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXQsIGhhcyBgdHlwZWAgYW5kIGBkYXRhYFxuICogQHJldHVybiB7U3RyaW5nfSBiYXNlNjQgZW5jb2RlZCBtZXNzYWdlXG4gKi9cblxuZXhwb3J0cy5lbmNvZGVCYXNlNjRQYWNrZXQgPSBmdW5jdGlvbihwYWNrZXQsIGNhbGxiYWNrKSB7XG4gIHZhciBtZXNzYWdlID0gJ2InICsgZXhwb3J0cy5wYWNrZXRzW3BhY2tldC50eXBlXTtcbiAgaWYgKEJsb2IgJiYgcGFja2V0LmRhdGEgaW5zdGFuY2VvZiBnbG9iYWwuQmxvYikge1xuICAgIHZhciBmciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgZnIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYjY0ID0gZnIucmVzdWx0LnNwbGl0KCcsJylbMV07XG4gICAgICBjYWxsYmFjayhtZXNzYWdlICsgYjY0KTtcbiAgICB9O1xuICAgIHJldHVybiBmci5yZWFkQXNEYXRhVVJMKHBhY2tldC5kYXRhKTtcbiAgfVxuXG4gIHZhciBiNjRkYXRhO1xuICB0cnkge1xuICAgIGI2NGRhdGEgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KHBhY2tldC5kYXRhKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBpUGhvbmUgU2FmYXJpIGRvZXNuJ3QgbGV0IHlvdSBhcHBseSB3aXRoIHR5cGVkIGFycmF5c1xuICAgIHZhciB0eXBlZCA9IG5ldyBVaW50OEFycmF5KHBhY2tldC5kYXRhKTtcbiAgICB2YXIgYmFzaWMgPSBuZXcgQXJyYXkodHlwZWQubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBiYXNpY1tpXSA9IHR5cGVkW2ldO1xuICAgIH1cbiAgICBiNjRkYXRhID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBiYXNpYyk7XG4gIH1cbiAgbWVzc2FnZSArPSBnbG9iYWwuYnRvYShiNjRkYXRhKTtcbiAgcmV0dXJuIGNhbGxiYWNrKG1lc3NhZ2UpO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIGEgcGFja2V0LiBDaGFuZ2VzIGZvcm1hdCB0byBCbG9iIGlmIHJlcXVlc3RlZC5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IHdpdGggYHR5cGVgIGFuZCBgZGF0YWAgKGlmIGFueSlcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuZGVjb2RlUGFja2V0ID0gZnVuY3Rpb24gKGRhdGEsIGJpbmFyeVR5cGUsIHV0ZjhkZWNvZGUpIHtcbiAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlcnI7XG4gIH1cbiAgLy8gU3RyaW5nIGRhdGFcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGlmIChkYXRhLmNoYXJBdCgwKSA9PT0gJ2InKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZWNvZGVCYXNlNjRQYWNrZXQoZGF0YS5zdWJzdHIoMSksIGJpbmFyeVR5cGUpO1xuICAgIH1cblxuICAgIGlmICh1dGY4ZGVjb2RlKSB7XG4gICAgICBkYXRhID0gdHJ5RGVjb2RlKGRhdGEpO1xuICAgICAgaWYgKGRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBlcnI7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciB0eXBlID0gZGF0YS5jaGFyQXQoMCk7XG5cbiAgICBpZiAoTnVtYmVyKHR5cGUpICE9IHR5cGUgfHwgIXBhY2tldHNsaXN0W3R5cGVdKSB7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IHBhY2tldHNsaXN0W3R5cGVdLCBkYXRhOiBkYXRhLnN1YnN0cmluZygxKSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBwYWNrZXRzbGlzdFt0eXBlXSB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBhc0FycmF5ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIHZhciB0eXBlID0gYXNBcnJheVswXTtcbiAgdmFyIHJlc3QgPSBzbGljZUJ1ZmZlcihkYXRhLCAxKTtcbiAgaWYgKEJsb2IgJiYgYmluYXJ5VHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgcmVzdCA9IG5ldyBCbG9iKFtyZXN0XSk7XG4gIH1cbiAgcmV0dXJuIHsgdHlwZTogcGFja2V0c2xpc3RbdHlwZV0sIGRhdGE6IHJlc3QgfTtcbn07XG5cbmZ1bmN0aW9uIHRyeURlY29kZShkYXRhKSB7XG4gIHRyeSB7XG4gICAgZGF0YSA9IHV0ZjguZGVjb2RlKGRhdGEsIHsgc3RyaWN0OiBmYWxzZSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIGEgcGFja2V0IGVuY29kZWQgaW4gYSBiYXNlNjQgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGJhc2U2NCBlbmNvZGVkIG1lc3NhZ2VcbiAqIEByZXR1cm4ge09iamVjdH0gd2l0aCBgdHlwZWAgYW5kIGBkYXRhYCAoaWYgYW55KVxuICovXG5cbmV4cG9ydHMuZGVjb2RlQmFzZTY0UGFja2V0ID0gZnVuY3Rpb24obXNnLCBiaW5hcnlUeXBlKSB7XG4gIHZhciB0eXBlID0gcGFja2V0c2xpc3RbbXNnLmNoYXJBdCgwKV07XG4gIGlmICghYmFzZTY0ZW5jb2Rlcikge1xuICAgIHJldHVybiB7IHR5cGU6IHR5cGUsIGRhdGE6IHsgYmFzZTY0OiB0cnVlLCBkYXRhOiBtc2cuc3Vic3RyKDEpIH0gfTtcbiAgfVxuXG4gIHZhciBkYXRhID0gYmFzZTY0ZW5jb2Rlci5kZWNvZGUobXNnLnN1YnN0cigxKSk7XG5cbiAgaWYgKGJpbmFyeVR5cGUgPT09ICdibG9iJyAmJiBCbG9iKSB7XG4gICAgZGF0YSA9IG5ldyBCbG9iKFtkYXRhXSk7XG4gIH1cblxuICByZXR1cm4geyB0eXBlOiB0eXBlLCBkYXRhOiBkYXRhIH07XG59O1xuXG4vKipcbiAqIEVuY29kZXMgbXVsdGlwbGUgbWVzc2FnZXMgKHBheWxvYWQpLlxuICpcbiAqICAgICA8bGVuZ3RoPjpkYXRhXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAgMTE6aGVsbG8gd29ybGQyOmhpXG4gKlxuICogSWYgYW55IGNvbnRlbnRzIGFyZSBiaW5hcnksIHRoZXkgd2lsbCBiZSBlbmNvZGVkIGFzIGJhc2U2NCBzdHJpbmdzLiBCYXNlNjRcbiAqIGVuY29kZWQgc3RyaW5ncyBhcmUgbWFya2VkIHdpdGggYSBiIGJlZm9yZSB0aGUgbGVuZ3RoIHNwZWNpZmllclxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhY2tldHNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuZW5jb2RlUGF5bG9hZCA9IGZ1bmN0aW9uIChwYWNrZXRzLCBzdXBwb3J0c0JpbmFyeSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBzdXBwb3J0c0JpbmFyeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gc3VwcG9ydHNCaW5hcnk7XG4gICAgc3VwcG9ydHNCaW5hcnkgPSBudWxsO1xuICB9XG5cbiAgdmFyIGlzQmluYXJ5ID0gaGFzQmluYXJ5KHBhY2tldHMpO1xuXG4gIGlmIChzdXBwb3J0c0JpbmFyeSAmJiBpc0JpbmFyeSkge1xuICAgIGlmIChCbG9iICYmICFkb250U2VuZEJsb2JzKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5lbmNvZGVQYXlsb2FkQXNCbG9iKHBhY2tldHMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwb3J0cy5lbmNvZGVQYXlsb2FkQXNBcnJheUJ1ZmZlcihwYWNrZXRzLCBjYWxsYmFjayk7XG4gIH1cblxuICBpZiAoIXBhY2tldHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCcwOicpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0TGVuZ3RoSGVhZGVyKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gbWVzc2FnZS5sZW5ndGggKyAnOicgKyBtZXNzYWdlO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5jb2RlT25lKHBhY2tldCwgZG9uZUNhbGxiYWNrKSB7XG4gICAgZXhwb3J0cy5lbmNvZGVQYWNrZXQocGFja2V0LCAhaXNCaW5hcnkgPyBmYWxzZSA6IHN1cHBvcnRzQmluYXJ5LCBmYWxzZSwgZnVuY3Rpb24obWVzc2FnZSkge1xuICAgICAgZG9uZUNhbGxiYWNrKG51bGwsIHNldExlbmd0aEhlYWRlcihtZXNzYWdlKSk7XG4gICAgfSk7XG4gIH1cblxuICBtYXAocGFja2V0cywgZW5jb2RlT25lLCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0cy5qb2luKCcnKSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBBc3luYyBhcnJheSBtYXAgdXNpbmcgYWZ0ZXJcbiAqL1xuXG5mdW5jdGlvbiBtYXAoYXJ5LCBlYWNoLCBkb25lKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoYXJ5Lmxlbmd0aCk7XG4gIHZhciBuZXh0ID0gYWZ0ZXIoYXJ5Lmxlbmd0aCwgZG9uZSk7XG5cbiAgdmFyIGVhY2hXaXRoSW5kZXggPSBmdW5jdGlvbihpLCBlbCwgY2IpIHtcbiAgICBlYWNoKGVsLCBmdW5jdGlvbihlcnJvciwgbXNnKSB7XG4gICAgICByZXN1bHRbaV0gPSBtc2c7XG4gICAgICBjYihlcnJvciwgcmVzdWx0KTtcbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyeS5sZW5ndGg7IGkrKykge1xuICAgIGVhY2hXaXRoSW5kZXgoaSwgYXJ5W2ldLCBuZXh0KTtcbiAgfVxufVxuXG4vKlxuICogRGVjb2RlcyBkYXRhIHdoZW4gYSBwYXlsb2FkIGlzIG1heWJlIGV4cGVjdGVkLiBQb3NzaWJsZSBiaW5hcnkgY29udGVudHMgYXJlXG4gKiBkZWNvZGVkIGZyb20gdGhlaXIgYmFzZTY0IHJlcHJlc2VudGF0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEsIGNhbGxiYWNrIG1ldGhvZFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmRlY29kZVBheWxvYWQgPSBmdW5jdGlvbiAoZGF0YSwgYmluYXJ5VHlwZSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBleHBvcnRzLmRlY29kZVBheWxvYWRBc0JpbmFyeShkYXRhLCBiaW5hcnlUeXBlLCBjYWxsYmFjayk7XG4gIH1cblxuICBpZiAodHlwZW9mIGJpbmFyeVR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IGJpbmFyeVR5cGU7XG4gICAgYmluYXJ5VHlwZSA9IG51bGw7XG4gIH1cblxuICB2YXIgcGFja2V0O1xuICBpZiAoZGF0YSA9PT0gJycpIHtcbiAgICAvLyBwYXJzZXIgZXJyb3IgLSBpZ25vcmluZyBwYXlsb2FkXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgMCwgMSk7XG4gIH1cblxuICB2YXIgbGVuZ3RoID0gJycsIG4sIG1zZztcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGRhdGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGNociA9IGRhdGEuY2hhckF0KGkpO1xuXG4gICAgaWYgKGNociAhPT0gJzonKSB7XG4gICAgICBsZW5ndGggKz0gY2hyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGxlbmd0aCA9PT0gJycgfHwgKGxlbmd0aCAhPSAobiA9IE51bWJlcihsZW5ndGgpKSkpIHtcbiAgICAgIC8vIHBhcnNlciBlcnJvciAtIGlnbm9yaW5nIHBheWxvYWRcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIDAsIDEpO1xuICAgIH1cblxuICAgIG1zZyA9IGRhdGEuc3Vic3RyKGkgKyAxLCBuKTtcblxuICAgIGlmIChsZW5ndGggIT0gbXNnLmxlbmd0aCkge1xuICAgICAgLy8gcGFyc2VyIGVycm9yIC0gaWdub3JpbmcgcGF5bG9hZFxuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgMCwgMSk7XG4gICAgfVxuXG4gICAgaWYgKG1zZy5sZW5ndGgpIHtcbiAgICAgIHBhY2tldCA9IGV4cG9ydHMuZGVjb2RlUGFja2V0KG1zZywgYmluYXJ5VHlwZSwgZmFsc2UpO1xuXG4gICAgICBpZiAoZXJyLnR5cGUgPT09IHBhY2tldC50eXBlICYmIGVyci5kYXRhID09PSBwYWNrZXQuZGF0YSkge1xuICAgICAgICAvLyBwYXJzZXIgZXJyb3IgaW4gaW5kaXZpZHVhbCBwYWNrZXQgLSBpZ25vcmluZyBwYXlsb2FkXG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIDAsIDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmV0ID0gY2FsbGJhY2socGFja2V0LCBpICsgbiwgbCk7XG4gICAgICBpZiAoZmFsc2UgPT09IHJldCkgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGFkdmFuY2UgY3Vyc29yXG4gICAgaSArPSBuO1xuICAgIGxlbmd0aCA9ICcnO1xuICB9XG5cbiAgaWYgKGxlbmd0aCAhPT0gJycpIHtcbiAgICAvLyBwYXJzZXIgZXJyb3IgLSBpZ25vcmluZyBwYXlsb2FkXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgMCwgMSk7XG4gIH1cblxufTtcblxuLyoqXG4gKiBFbmNvZGVzIG11bHRpcGxlIG1lc3NhZ2VzIChwYXlsb2FkKSBhcyBiaW5hcnkuXG4gKlxuICogPDEgPSBiaW5hcnksIDAgPSBzdHJpbmc+PG51bWJlciBmcm9tIDAtOT48bnVtYmVyIGZyb20gMC05PlsuLi5dPG51bWJlclxuICogMjU1PjxkYXRhPlxuICpcbiAqIEV4YW1wbGU6XG4gKiAxIDMgMjU1IDEgMiAzLCBpZiB0aGUgYmluYXJ5IGNvbnRlbnRzIGFyZSBpbnRlcnByZXRlZCBhcyA4IGJpdCBpbnRlZ2Vyc1xuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhY2tldHNcbiAqIEByZXR1cm4ge0FycmF5QnVmZmVyfSBlbmNvZGVkIHBheWxvYWRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuZW5jb2RlUGF5bG9hZEFzQXJyYXlCdWZmZXIgPSBmdW5jdGlvbihwYWNrZXRzLCBjYWxsYmFjaykge1xuICBpZiAoIXBhY2tldHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBBcnJheUJ1ZmZlcigwKSk7XG4gIH1cblxuICBmdW5jdGlvbiBlbmNvZGVPbmUocGFja2V0LCBkb25lQ2FsbGJhY2spIHtcbiAgICBleHBvcnRzLmVuY29kZVBhY2tldChwYWNrZXQsIHRydWUsIHRydWUsIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHJldHVybiBkb25lQ2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICBtYXAocGFja2V0cywgZW5jb2RlT25lLCBmdW5jdGlvbihlcnIsIGVuY29kZWRQYWNrZXRzKSB7XG4gICAgdmFyIHRvdGFsTGVuZ3RoID0gZW5jb2RlZFBhY2tldHMucmVkdWNlKGZ1bmN0aW9uKGFjYywgcCkge1xuICAgICAgdmFyIGxlbjtcbiAgICAgIGlmICh0eXBlb2YgcCA9PT0gJ3N0cmluZycpe1xuICAgICAgICBsZW4gPSBwLmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbiA9IHAuYnl0ZUxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2MgKyBsZW4udG9TdHJpbmcoKS5sZW5ndGggKyBsZW4gKyAyOyAvLyBzdHJpbmcvYmluYXJ5IGlkZW50aWZpZXIgKyBzZXBhcmF0b3IgPSAyXG4gICAgfSwgMCk7XG5cbiAgICB2YXIgcmVzdWx0QXJyYXkgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG5cbiAgICB2YXIgYnVmZmVySW5kZXggPSAwO1xuICAgIGVuY29kZWRQYWNrZXRzLmZvckVhY2goZnVuY3Rpb24ocCkge1xuICAgICAgdmFyIGlzU3RyaW5nID0gdHlwZW9mIHAgPT09ICdzdHJpbmcnO1xuICAgICAgdmFyIGFiID0gcDtcbiAgICAgIGlmIChpc1N0cmluZykge1xuICAgICAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KHAubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmlld1tpXSA9IHAuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICBhYiA9IHZpZXcuYnVmZmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNTdHJpbmcpIHsgLy8gbm90IHRydWUgYmluYXJ5XG4gICAgICAgIHJlc3VsdEFycmF5W2J1ZmZlckluZGV4KytdID0gMDtcbiAgICAgIH0gZWxzZSB7IC8vIHRydWUgYmluYXJ5XG4gICAgICAgIHJlc3VsdEFycmF5W2J1ZmZlckluZGV4KytdID0gMTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxlblN0ciA9IGFiLmJ5dGVMZW5ndGgudG9TdHJpbmcoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuU3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdEFycmF5W2J1ZmZlckluZGV4KytdID0gcGFyc2VJbnQobGVuU3RyW2ldKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdEFycmF5W2J1ZmZlckluZGV4KytdID0gMjU1O1xuXG4gICAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGFiKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRBcnJheVtidWZmZXJJbmRleCsrXSA9IHZpZXdbaV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0QXJyYXkuYnVmZmVyKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEVuY29kZSBhcyBCbG9iXG4gKi9cblxuZXhwb3J0cy5lbmNvZGVQYXlsb2FkQXNCbG9iID0gZnVuY3Rpb24ocGFja2V0cywgY2FsbGJhY2spIHtcbiAgZnVuY3Rpb24gZW5jb2RlT25lKHBhY2tldCwgZG9uZUNhbGxiYWNrKSB7XG4gICAgZXhwb3J0cy5lbmNvZGVQYWNrZXQocGFja2V0LCB0cnVlLCB0cnVlLCBmdW5jdGlvbihlbmNvZGVkKSB7XG4gICAgICB2YXIgYmluYXJ5SWRlbnRpZmllciA9IG5ldyBVaW50OEFycmF5KDEpO1xuICAgICAgYmluYXJ5SWRlbnRpZmllclswXSA9IDE7XG4gICAgICBpZiAodHlwZW9mIGVuY29kZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZC5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuY29kZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2aWV3W2ldID0gZW5jb2RlZC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB9XG4gICAgICAgIGVuY29kZWQgPSB2aWV3LmJ1ZmZlcjtcbiAgICAgICAgYmluYXJ5SWRlbnRpZmllclswXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBsZW4gPSAoZW5jb2RlZCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVxuICAgICAgICA/IGVuY29kZWQuYnl0ZUxlbmd0aFxuICAgICAgICA6IGVuY29kZWQuc2l6ZTtcblxuICAgICAgdmFyIGxlblN0ciA9IGxlbi50b1N0cmluZygpO1xuICAgICAgdmFyIGxlbmd0aEFyeSA9IG5ldyBVaW50OEFycmF5KGxlblN0ci5sZW5ndGggKyAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuU3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxlbmd0aEFyeVtpXSA9IHBhcnNlSW50KGxlblN0cltpXSk7XG4gICAgICB9XG4gICAgICBsZW5ndGhBcnlbbGVuU3RyLmxlbmd0aF0gPSAyNTU7XG5cbiAgICAgIGlmIChCbG9iKSB7XG4gICAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW2JpbmFyeUlkZW50aWZpZXIuYnVmZmVyLCBsZW5ndGhBcnkuYnVmZmVyLCBlbmNvZGVkXSk7XG4gICAgICAgIGRvbmVDYWxsYmFjayhudWxsLCBibG9iKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG1hcChwYWNrZXRzLCBlbmNvZGVPbmUsIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgIHJldHVybiBjYWxsYmFjayhuZXcgQmxvYihyZXN1bHRzKSk7XG4gIH0pO1xufTtcblxuLypcbiAqIERlY29kZXMgZGF0YSB3aGVuIGEgcGF5bG9hZCBpcyBtYXliZSBleHBlY3RlZC4gU3RyaW5ncyBhcmUgZGVjb2RlZCBieVxuICogaW50ZXJwcmV0aW5nIGVhY2ggYnl0ZSBhcyBhIGtleSBjb2RlIGZvciBlbnRyaWVzIG1hcmtlZCB0byBzdGFydCB3aXRoIDAuIFNlZVxuICogZGVzY3JpcHRpb24gb2YgZW5jb2RlUGF5bG9hZEFzQmluYXJ5XG4gKlxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGF0YSwgY2FsbGJhY2sgbWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuZGVjb2RlUGF5bG9hZEFzQmluYXJ5ID0gZnVuY3Rpb24gKGRhdGEsIGJpbmFyeVR5cGUsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgYmluYXJ5VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gYmluYXJ5VHlwZTtcbiAgICBiaW5hcnlUeXBlID0gbnVsbDtcbiAgfVxuXG4gIHZhciBidWZmZXJUYWlsID0gZGF0YTtcbiAgdmFyIGJ1ZmZlcnMgPSBbXTtcblxuICB3aGlsZSAoYnVmZmVyVGFpbC5ieXRlTGVuZ3RoID4gMCkge1xuICAgIHZhciB0YWlsQXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmZXJUYWlsKTtcbiAgICB2YXIgaXNTdHJpbmcgPSB0YWlsQXJyYXlbMF0gPT09IDA7XG4gICAgdmFyIG1zZ0xlbmd0aCA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IDE7IDsgaSsrKSB7XG4gICAgICBpZiAodGFpbEFycmF5W2ldID09PSAyNTUpIGJyZWFrO1xuXG4gICAgICAvLyAzMTAgPSBjaGFyIGxlbmd0aCBvZiBOdW1iZXIuTUFYX1ZBTFVFXG4gICAgICBpZiAobXNnTGVuZ3RoLmxlbmd0aCA+IDMxMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCAwLCAxKTtcbiAgICAgIH1cblxuICAgICAgbXNnTGVuZ3RoICs9IHRhaWxBcnJheVtpXTtcbiAgICB9XG5cbiAgICBidWZmZXJUYWlsID0gc2xpY2VCdWZmZXIoYnVmZmVyVGFpbCwgMiArIG1zZ0xlbmd0aC5sZW5ndGgpO1xuICAgIG1zZ0xlbmd0aCA9IHBhcnNlSW50KG1zZ0xlbmd0aCk7XG5cbiAgICB2YXIgbXNnID0gc2xpY2VCdWZmZXIoYnVmZmVyVGFpbCwgMCwgbXNnTGVuZ3RoKTtcbiAgICBpZiAoaXNTdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1zZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkobXNnKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlQaG9uZSBTYWZhcmkgZG9lc24ndCBsZXQgeW91IGFwcGx5IHRvIHR5cGVkIGFycmF5c1xuICAgICAgICB2YXIgdHlwZWQgPSBuZXcgVWludDhBcnJheShtc2cpO1xuICAgICAgICBtc2cgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG1zZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHR5cGVkW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGJ1ZmZlcnMucHVzaChtc2cpO1xuICAgIGJ1ZmZlclRhaWwgPSBzbGljZUJ1ZmZlcihidWZmZXJUYWlsLCBtc2dMZW5ndGgpO1xuICB9XG5cbiAgdmFyIHRvdGFsID0gYnVmZmVycy5sZW5ndGg7XG4gIGJ1ZmZlcnMuZm9yRWFjaChmdW5jdGlvbihidWZmZXIsIGkpIHtcbiAgICBjYWxsYmFjayhleHBvcnRzLmRlY29kZVBhY2tldChidWZmZXIsIGJpbmFyeVR5cGUsIHRydWUpLCBpLCB0b3RhbCk7XG4gIH0pO1xufTtcbiIsIlxuLyoqXG4gKiBHZXRzIHRoZSBrZXlzIGZvciBhbiBvYmplY3QuXG4gKlxuICogQHJldHVybiB7QXJyYXl9IGtleXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyAob2JqKXtcbiAgdmFyIGFyciA9IFtdO1xuICB2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChoYXMuY2FsbChvYmosIGkpKSB7XG4gICAgICBhcnIucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycjtcbn07XG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3V0ZjhqcyB2Mi4xLjIgYnkgQG1hdGhpYXMgKi9cbjsoZnVuY3Rpb24ocm9vdCkge1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlcyBgZXhwb3J0c2Bcblx0dmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cztcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYFxuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0bW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMgJiYgbW9kdWxlO1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgLCBmcm9tIE5vZGUuanMgb3IgQnJvd3NlcmlmaWVkIGNvZGUsXG5cdC8vIGFuZCB1c2UgaXQgYXMgYHJvb3RgXG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fCBmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0dmFyIHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cblx0Ly8gVGFrZW4gZnJvbSBodHRwczovL210aHMuYmUvcHVueWNvZGVcblx0ZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0XHR2YXIgb3V0cHV0ID0gW107XG5cdFx0dmFyIGNvdW50ZXIgPSAwO1xuXHRcdHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuXHRcdHZhciB2YWx1ZTtcblx0XHR2YXIgZXh0cmE7XG5cdFx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdFx0Ly8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG5cdFx0XHRcdGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdFx0aWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIGxvdyBzdXJyb2dhdGVcblx0XHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZSBuZXh0XG5cdFx0XHRcdFx0Ly8gY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0XHRcdGNvdW50ZXItLTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9XG5cblx0Ly8gVGFrZW4gZnJvbSBodHRwczovL210aHMuYmUvcHVueWNvZGVcblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cdFx0dmFyIGluZGV4ID0gLTE7XG5cdFx0dmFyIHZhbHVlO1xuXHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHR3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuXHRcdFx0dmFsdWUgPSBhcnJheVtpbmRleF07XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9XG5cblx0ZnVuY3Rpb24gY2hlY2tTY2FsYXJWYWx1ZShjb2RlUG9pbnQsIHN0cmljdCkge1xuXHRcdGlmIChjb2RlUG9pbnQgPj0gMHhEODAwICYmIGNvZGVQb2ludCA8PSAweERGRkYpIHtcblx0XHRcdGlmIChzdHJpY3QpIHtcblx0XHRcdFx0dGhyb3cgRXJyb3IoXG5cdFx0XHRcdFx0J0xvbmUgc3Vycm9nYXRlIFUrJyArIGNvZGVQb2ludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArXG5cdFx0XHRcdFx0JyBpcyBub3QgYSBzY2FsYXIgdmFsdWUnXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZUJ5dGUoY29kZVBvaW50LCBzaGlmdCkge1xuXHRcdHJldHVybiBzdHJpbmdGcm9tQ2hhckNvZGUoKChjb2RlUG9pbnQgPj4gc2hpZnQpICYgMHgzRikgfCAweDgwKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGVuY29kZUNvZGVQb2ludChjb2RlUG9pbnQsIHN0cmljdCkge1xuXHRcdGlmICgoY29kZVBvaW50ICYgMHhGRkZGRkY4MCkgPT0gMCkgeyAvLyAxLWJ5dGUgc2VxdWVuY2Vcblx0XHRcdHJldHVybiBzdHJpbmdGcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcblx0XHR9XG5cdFx0dmFyIHN5bWJvbCA9ICcnO1xuXHRcdGlmICgoY29kZVBvaW50ICYgMHhGRkZGRjgwMCkgPT0gMCkgeyAvLyAyLWJ5dGUgc2VxdWVuY2Vcblx0XHRcdHN5bWJvbCA9IHN0cmluZ0Zyb21DaGFyQ29kZSgoKGNvZGVQb2ludCA+PiA2KSAmIDB4MUYpIHwgMHhDMCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKChjb2RlUG9pbnQgJiAweEZGRkYwMDAwKSA9PSAwKSB7IC8vIDMtYnl0ZSBzZXF1ZW5jZVxuXHRcdFx0aWYgKCFjaGVja1NjYWxhclZhbHVlKGNvZGVQb2ludCwgc3RyaWN0KSkge1xuXHRcdFx0XHRjb2RlUG9pbnQgPSAweEZGRkQ7XG5cdFx0XHR9XG5cdFx0XHRzeW1ib2wgPSBzdHJpbmdGcm9tQ2hhckNvZGUoKChjb2RlUG9pbnQgPj4gMTIpICYgMHgwRikgfCAweEUwKTtcblx0XHRcdHN5bWJvbCArPSBjcmVhdGVCeXRlKGNvZGVQb2ludCwgNik7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKChjb2RlUG9pbnQgJiAweEZGRTAwMDAwKSA9PSAwKSB7IC8vIDQtYnl0ZSBzZXF1ZW5jZVxuXHRcdFx0c3ltYm9sID0gc3RyaW5nRnJvbUNoYXJDb2RlKCgoY29kZVBvaW50ID4+IDE4KSAmIDB4MDcpIHwgMHhGMCk7XG5cdFx0XHRzeW1ib2wgKz0gY3JlYXRlQnl0ZShjb2RlUG9pbnQsIDEyKTtcblx0XHRcdHN5bWJvbCArPSBjcmVhdGVCeXRlKGNvZGVQb2ludCwgNik7XG5cdFx0fVxuXHRcdHN5bWJvbCArPSBzdHJpbmdGcm9tQ2hhckNvZGUoKGNvZGVQb2ludCAmIDB4M0YpIHwgMHg4MCk7XG5cdFx0cmV0dXJuIHN5bWJvbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHV0ZjhlbmNvZGUoc3RyaW5nLCBvcHRzKSB7XG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cdFx0dmFyIHN0cmljdCA9IGZhbHNlICE9PSBvcHRzLnN0cmljdDtcblxuXHRcdHZhciBjb2RlUG9pbnRzID0gdWNzMmRlY29kZShzdHJpbmcpO1xuXHRcdHZhciBsZW5ndGggPSBjb2RlUG9pbnRzLmxlbmd0aDtcblx0XHR2YXIgaW5kZXggPSAtMTtcblx0XHR2YXIgY29kZVBvaW50O1xuXHRcdHZhciBieXRlU3RyaW5nID0gJyc7XG5cdFx0d2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0XHRcdGNvZGVQb2ludCA9IGNvZGVQb2ludHNbaW5kZXhdO1xuXHRcdFx0Ynl0ZVN0cmluZyArPSBlbmNvZGVDb2RlUG9pbnQoY29kZVBvaW50LCBzdHJpY3QpO1xuXHRcdH1cblx0XHRyZXR1cm4gYnl0ZVN0cmluZztcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdGZ1bmN0aW9uIHJlYWRDb250aW51YXRpb25CeXRlKCkge1xuXHRcdGlmIChieXRlSW5kZXggPj0gYnl0ZUNvdW50KSB7XG5cdFx0XHR0aHJvdyBFcnJvcignSW52YWxpZCBieXRlIGluZGV4Jyk7XG5cdFx0fVxuXG5cdFx0dmFyIGNvbnRpbnVhdGlvbkJ5dGUgPSBieXRlQXJyYXlbYnl0ZUluZGV4XSAmIDB4RkY7XG5cdFx0Ynl0ZUluZGV4Kys7XG5cblx0XHRpZiAoKGNvbnRpbnVhdGlvbkJ5dGUgJiAweEMwKSA9PSAweDgwKSB7XG5cdFx0XHRyZXR1cm4gY29udGludWF0aW9uQnl0ZSAmIDB4M0Y7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZW5kIHVwIGhlcmUsIGl04oCZcyBub3QgYSBjb250aW51YXRpb24gYnl0ZVxuXHRcdHRocm93IEVycm9yKCdJbnZhbGlkIGNvbnRpbnVhdGlvbiBieXRlJyk7XG5cdH1cblxuXHRmdW5jdGlvbiBkZWNvZGVTeW1ib2woc3RyaWN0KSB7XG5cdFx0dmFyIGJ5dGUxO1xuXHRcdHZhciBieXRlMjtcblx0XHR2YXIgYnl0ZTM7XG5cdFx0dmFyIGJ5dGU0O1xuXHRcdHZhciBjb2RlUG9pbnQ7XG5cblx0XHRpZiAoYnl0ZUluZGV4ID4gYnl0ZUNvdW50KSB7XG5cdFx0XHR0aHJvdyBFcnJvcignSW52YWxpZCBieXRlIGluZGV4Jyk7XG5cdFx0fVxuXG5cdFx0aWYgKGJ5dGVJbmRleCA9PSBieXRlQ291bnQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBSZWFkIGZpcnN0IGJ5dGVcblx0XHRieXRlMSA9IGJ5dGVBcnJheVtieXRlSW5kZXhdICYgMHhGRjtcblx0XHRieXRlSW5kZXgrKztcblxuXHRcdC8vIDEtYnl0ZSBzZXF1ZW5jZSAobm8gY29udGludWF0aW9uIGJ5dGVzKVxuXHRcdGlmICgoYnl0ZTEgJiAweDgwKSA9PSAwKSB7XG5cdFx0XHRyZXR1cm4gYnl0ZTE7XG5cdFx0fVxuXG5cdFx0Ly8gMi1ieXRlIHNlcXVlbmNlXG5cdFx0aWYgKChieXRlMSAmIDB4RTApID09IDB4QzApIHtcblx0XHRcdGJ5dGUyID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtcblx0XHRcdGNvZGVQb2ludCA9ICgoYnl0ZTEgJiAweDFGKSA8PCA2KSB8IGJ5dGUyO1xuXHRcdFx0aWYgKGNvZGVQb2ludCA+PSAweDgwKSB7XG5cdFx0XHRcdHJldHVybiBjb2RlUG9pbnQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBFcnJvcignSW52YWxpZCBjb250aW51YXRpb24gYnl0ZScpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDMtYnl0ZSBzZXF1ZW5jZSAobWF5IGluY2x1ZGUgdW5wYWlyZWQgc3Vycm9nYXRlcylcblx0XHRpZiAoKGJ5dGUxICYgMHhGMCkgPT0gMHhFMCkge1xuXHRcdFx0Ynl0ZTIgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Ynl0ZTMgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Y29kZVBvaW50ID0gKChieXRlMSAmIDB4MEYpIDw8IDEyKSB8IChieXRlMiA8PCA2KSB8IGJ5dGUzO1xuXHRcdFx0aWYgKGNvZGVQb2ludCA+PSAweDA4MDApIHtcblx0XHRcdFx0cmV0dXJuIGNoZWNrU2NhbGFyVmFsdWUoY29kZVBvaW50LCBzdHJpY3QpID8gY29kZVBvaW50IDogMHhGRkZEO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgRXJyb3IoJ0ludmFsaWQgY29udGludWF0aW9uIGJ5dGUnKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA0LWJ5dGUgc2VxdWVuY2Vcblx0XHRpZiAoKGJ5dGUxICYgMHhGOCkgPT0gMHhGMCkge1xuXHRcdFx0Ynl0ZTIgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Ynl0ZTMgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Ynl0ZTQgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Y29kZVBvaW50ID0gKChieXRlMSAmIDB4MDcpIDw8IDB4MTIpIHwgKGJ5dGUyIDw8IDB4MEMpIHxcblx0XHRcdFx0KGJ5dGUzIDw8IDB4MDYpIHwgYnl0ZTQ7XG5cdFx0XHRpZiAoY29kZVBvaW50ID49IDB4MDEwMDAwICYmIGNvZGVQb2ludCA8PSAweDEwRkZGRikge1xuXHRcdFx0XHRyZXR1cm4gY29kZVBvaW50O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRocm93IEVycm9yKCdJbnZhbGlkIFVURi04IGRldGVjdGVkJyk7XG5cdH1cblxuXHR2YXIgYnl0ZUFycmF5O1xuXHR2YXIgYnl0ZUNvdW50O1xuXHR2YXIgYnl0ZUluZGV4O1xuXHRmdW5jdGlvbiB1dGY4ZGVjb2RlKGJ5dGVTdHJpbmcsIG9wdHMpIHtcblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblx0XHR2YXIgc3RyaWN0ID0gZmFsc2UgIT09IG9wdHMuc3RyaWN0O1xuXG5cdFx0Ynl0ZUFycmF5ID0gdWNzMmRlY29kZShieXRlU3RyaW5nKTtcblx0XHRieXRlQ291bnQgPSBieXRlQXJyYXkubGVuZ3RoO1xuXHRcdGJ5dGVJbmRleCA9IDA7XG5cdFx0dmFyIGNvZGVQb2ludHMgPSBbXTtcblx0XHR2YXIgdG1wO1xuXHRcdHdoaWxlICgodG1wID0gZGVjb2RlU3ltYm9sKHN0cmljdCkpICE9PSBmYWxzZSkge1xuXHRcdFx0Y29kZVBvaW50cy5wdXNoKHRtcCk7XG5cdFx0fVxuXHRcdHJldHVybiB1Y3MyZW5jb2RlKGNvZGVQb2ludHMpO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0dmFyIHV0ZjggPSB7XG5cdFx0J3ZlcnNpb24nOiAnMi4xLjInLFxuXHRcdCdlbmNvZGUnOiB1dGY4ZW5jb2RlLFxuXHRcdCdkZWNvZGUnOiB1dGY4ZGVjb2RlXG5cdH07XG5cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdXRmODtcblx0XHR9KTtcblx0fVx0ZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgIWZyZWVFeHBvcnRzLm5vZGVUeXBlKSB7XG5cdFx0aWYgKGZyZWVNb2R1bGUpIHsgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHV0Zjg7XG5cdFx0fSBlbHNlIHsgLy8gaW4gTmFyd2hhbCBvciBSaW5nb0pTIHYwLjcuMC1cblx0XHRcdHZhciBvYmplY3QgPSB7fTtcblx0XHRcdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcblx0XHRcdGZvciAodmFyIGtleSBpbiB1dGY4KSB7XG5cdFx0XHRcdGhhc093blByb3BlcnR5LmNhbGwodXRmOCwga2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHV0Zjhba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgeyAvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC51dGY4ID0gdXRmODtcblx0fVxuXG59KHRoaXMpKTtcbiIsIi8vIG9yaWdpbmFsbHkgcHVsbGVkIG91dCBvZiBzaW1wbGUtcGVlclxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldEJyb3dzZXJSVEMgKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsXG4gIHZhciB3cnRjID0ge1xuICAgIFJUQ1BlZXJDb25uZWN0aW9uOiB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gfHwgd2luZG93Lm1velJUQ1BlZXJDb25uZWN0aW9uIHx8XG4gICAgICB3aW5kb3cud2Via2l0UlRDUGVlckNvbm5lY3Rpb24sXG4gICAgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uOiB3aW5kb3cuUlRDU2Vzc2lvbkRlc2NyaXB0aW9uIHx8XG4gICAgICB3aW5kb3cubW96UlRDU2Vzc2lvbkRlc2NyaXB0aW9uIHx8IHdpbmRvdy53ZWJraXRSVENTZXNzaW9uRGVzY3JpcHRpb24sXG4gICAgUlRDSWNlQ2FuZGlkYXRlOiB3aW5kb3cuUlRDSWNlQ2FuZGlkYXRlIHx8IHdpbmRvdy5tb3pSVENJY2VDYW5kaWRhdGUgfHxcbiAgICAgIHdpbmRvdy53ZWJraXRSVENJY2VDYW5kaWRhdGVcbiAgfVxuICBpZiAoIXdydGMuUlRDUGVlckNvbm5lY3Rpb24pIHJldHVybiBudWxsXG4gIHJldHVybiB3cnRjXG59XG4iLCIvKiBnbG9iYWwgQmxvYiBGaWxlICovXG5cbi8qXG4gKiBNb2R1bGUgcmVxdWlyZW1lbnRzLlxuICovXG5cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHdpdGhOYXRpdmVCbG9iID0gdHlwZW9mIGdsb2JhbC5CbG9iID09PSAnZnVuY3Rpb24nIHx8IHRvU3RyaW5nLmNhbGwoZ2xvYmFsLkJsb2IpID09PSAnW29iamVjdCBCbG9iQ29uc3RydWN0b3JdJztcbnZhciB3aXRoTmF0aXZlRmlsZSA9IHR5cGVvZiBnbG9iYWwuRmlsZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0b1N0cmluZy5jYWxsKGdsb2JhbC5GaWxlKSA9PT0gJ1tvYmplY3QgRmlsZUNvbnN0cnVjdG9yXSc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNCaW5hcnk7XG5cbi8qKlxuICogQ2hlY2tzIGZvciBiaW5hcnkgZGF0YS5cbiAqXG4gKiBTdXBwb3J0cyBCdWZmZXIsIEFycmF5QnVmZmVyLCBCbG9iIGFuZCBGaWxlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhbnl0aGluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBoYXNCaW5hcnkgKG9iaikge1xuICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChoYXNCaW5hcnkob2JqW2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCh0eXBlb2YgZ2xvYmFsLkJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyICYmIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXIob2JqKSkgfHxcbiAgICAgKHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8XG4gICAgICh3aXRoTmF0aXZlQmxvYiAmJiBvYmogaW5zdGFuY2VvZiBCbG9iKSB8fFxuICAgICAod2l0aE5hdGl2ZUZpbGUgJiYgb2JqIGluc3RhbmNlb2YgRmlsZSlcbiAgICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL0F1dG9tYXR0aWMvaGFzLWJpbmFyeS9wdWxsLzRcbiAgaWYgKG9iai50b0pTT04gJiYgdHlwZW9mIG9iai50b0pTT04gPT09ICdmdW5jdGlvbicgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBoYXNCaW5hcnkob2JqLnRvSlNPTigpLCB0cnVlKTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSAmJiBoYXNCaW5hcnkob2JqW2tleV0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqXG4gKiBMb2dpYyBib3Jyb3dlZCBmcm9tIE1vZGVybml6cjpcbiAqXG4gKiAgIC0gaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2NvcnMuanNcbiAqL1xuXG50cnkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbn0gY2F0Y2ggKGVycikge1xuICAvLyBpZiBYTUxIdHRwIHN1cHBvcnQgaXMgZGlzYWJsZWQgaW4gSUUgdGhlbiBpdCB3aWxsIHRocm93XG4gIC8vIHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xufVxuIiwiY29uc3QgT3V0cHV0ID0gcmVxdWlyZSgnLi9zcmMvb3V0cHV0LmpzJylcbmNvbnN0IGxvb3AgPSByZXF1aXJlKCdyYWYtbG9vcCcpXG5jb25zdCBTb3VyY2UgPSByZXF1aXJlKCcuL3NyYy9oeWRyYS1zb3VyY2UuanMnKVxuY29uc3QgTW91c2UgPSByZXF1aXJlKCdtb3VzZS1jaGFuZ2UnKSgpXG5jb25zdCBBdWRpbyA9IHJlcXVpcmUoJy4vc3JjL2xpYi9hdWRpby5qcycpXG5jb25zdCBWaWRSZWNvcmRlciA9IHJlcXVpcmUoJy4vc3JjL2xpYi92aWRlby1yZWNvcmRlci5qcycpXG5jb25zdCBBcnJheVV0aWxzID0gcmVxdWlyZSgnLi9zcmMvbGliL2FycmF5LXV0aWxzLmpzJylcbmNvbnN0IFNhbmRib3ggPSByZXF1aXJlKCcuL3NyYy9ldmFsLXNhbmRib3guanMnKVxuXG5jb25zdCBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NyYy9nZW5lcmF0b3ItZmFjdG9yeS5qcycpXG5cbi8vIHRvIGRvOiBhZGQgYWJpbGl0eSB0byBwYXNzIGluIGNlcnRhaW4gdW5pZm9ybXMgYW5kIHRyYW5zZm9ybXNcbmNsYXNzIEh5ZHJhUmVuZGVyZXIge1xuXG4gIGNvbnN0cnVjdG9yICh7XG4gICAgcGIgPSBudWxsLFxuICAgIHdpZHRoID0gMTI4MCxcbiAgICBoZWlnaHQgPSA3MjAsXG4gICAgbnVtU291cmNlcyA9IDQsXG4gICAgbnVtT3V0cHV0cyA9IDQsXG4gICAgbWFrZUdsb2JhbCA9IHRydWUsXG4gICAgYXV0b0xvb3AgPSB0cnVlLFxuICAgIGRldGVjdEF1ZGlvID0gdHJ1ZSxcbiAgICBlbmFibGVTdHJlYW1DYXB0dXJlID0gdHJ1ZSxcbiAgICBjYW52YXMsXG4gICAgcHJlY2lzaW9uID0gJ21lZGl1bXAnLFxuICAgIGV4dGVuZFRyYW5zZm9ybXMgPSB7fSAvLyBhZGQgeW91ciBvd24gZnVuY3Rpb25zIG9uIGluaXRcbiAgfSA9IHt9KSB7XG5cbiAgICBBcnJheVV0aWxzLmluaXQoKVxuXG4gICAgdGhpcy5wYiA9IHBiXG5cbiAgICB0aGlzLndpZHRoID0gd2lkdGhcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodFxuICAgIHRoaXMucmVuZGVyQWxsID0gZmFsc2VcbiAgICB0aGlzLmRldGVjdEF1ZGlvID0gZGV0ZWN0QXVkaW9cblxuICAgIHRoaXMuX2luaXRDYW52YXMoY2FudmFzKVxuXG5cbiAgICAvLyBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgb24gdGhlIGdsb2JhbCBjb250ZXh0IGFuZCBkdXJpbmcgbG9jYWwgZXZhbHVhdGlvblxuICAgIHRoaXMuc3ludGggPSB7XG4gICAgICB0aW1lOiAwLFxuICAgICAgYnBtOiAzMCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIGZwczogdW5kZWZpbmVkLFxuICAgICAgc3RhdHM6IHtcbiAgICAgICAgZnBzOiAwXG4gICAgICB9LFxuICAgICAgc3BlZWQ6IDEsXG4gICAgICBtb3VzZTogTW91c2UsXG4gICAgICByZW5kZXI6IHRoaXMuX3JlbmRlci5iaW5kKHRoaXMpLFxuICAgICAgc2V0UmVzb2x1dGlvbjogdGhpcy5zZXRSZXNvbHV0aW9uLmJpbmQodGhpcyksXG4gICAgICB1cGRhdGU6IChkdCkgPT4ge30sLy8gdXNlciBkZWZpbmVkIHVwZGF0ZSBmdW5jdGlvblxuICAgICAgaHVzaDogdGhpcy5odXNoLmJpbmQodGhpcylcbiAgICB9XG5cbiAgICB0aGlzLnRpbWVTaW5jZUxhc3RVcGRhdGUgPSAwXG4gICAgdGhpcy5fdGltZSA9IDAgLy8gZm9yIGludGVybmFsIHVzZSwgb25seSB0byB1c2UgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVuZGVyIGZyYW1lc1xuXG4gIC8vICB3aW5kb3cuc3ludGggPSB0aGlzLnN5bnRoXG5cbiAgICAvLyBvbmx5IGFsbG93IHZhbGlkIHByZWNpc2lvbiBvcHRpb25zXG4gICAgbGV0IHByZWNpc2lvbk9wdGlvbnMgPSBbJ2xvd3AnLCdtZWRpdW1wJywnaGlnaHAnXVxuICAgIGxldCBwcmVjaXNpb25WYWxpZCA9IHByZWNpc2lvbk9wdGlvbnMuaW5jbHVkZXMocHJlY2lzaW9uLnRvTG93ZXJDYXNlKCkpXG5cbiAgICB0aGlzLnByZWNpc2lvbiA9IHByZWNpc2lvblZhbGlkID8gcHJlY2lzaW9uLnRvTG93ZXJDYXNlKCkgOiAnbWVkaXVtcCdcblxuICAgIGlmKCFwcmVjaXNpb25WYWxpZCl7XG4gICAgICBjb25zb2xlLndhcm4oJ1toeWRyYS1zeW50aCB3YXJuaW5nXVxcbkNvbnN0cnVjdG9yIHdhcyBwcm92aWRlZCBhbiBpbnZhbGlkIGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiB2YWx1ZSBvZiBcIicgKyBwcmVjaXNpb24gKyAnXCIuIFVzaW5nIGRlZmF1bHQgdmFsdWUgb2YgXCJtZWRpdW1wXCIgaW5zdGVhZC4nKVxuICAgIH1cblxuICAgIHRoaXMuZXh0ZW5kVHJhbnNmb3JtcyA9IGV4dGVuZFRyYW5zZm9ybXNcblxuICAgIC8vIGJvb2xlYW4gdG8gc3RvcmUgd2hlbiB0byBzYXZlIHNjcmVlbnNob3RcbiAgICB0aGlzLnNhdmVGcmFtZSA9IGZhbHNlXG5cbiAgICAvLyBpZiBzdHJlYW0gY2FwdHVyZSBpcyBlbmFibGVkLCB0aGlzIG9iamVjdCBjb250YWlucyB0aGUgY2FwdHVyZSBzdHJlYW1cbiAgICB0aGlzLmNhcHR1cmVTdHJlYW0gPSBudWxsXG5cbiAgICB0aGlzLmdlbmVyYXRvciA9IHVuZGVmaW5lZFxuXG4gICAgdGhpcy5faW5pdFJlZ2woKVxuICAgIHRoaXMuX2luaXRPdXRwdXRzKG51bU91dHB1dHMpXG4gICAgdGhpcy5faW5pdFNvdXJjZXMobnVtU291cmNlcylcbiAgICB0aGlzLl9nZW5lcmF0ZUdsc2xUcmFuc2Zvcm1zKClcblxuICAgIHRoaXMuc3ludGguc2NyZWVuY2FwID0gKCkgPT4ge1xuICAgICAgdGhpcy5zYXZlRnJhbWUgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGVuYWJsZVN0cmVhbUNhcHR1cmUpIHtcbiAgICAgIHRoaXMuY2FwdHVyZVN0cmVhbSA9IHRoaXMuY2FudmFzLmNhcHR1cmVTdHJlYW0oMjUpXG4gICAgICAvLyB0byBkbzogZW5hYmxlIGNhcHR1cmUgc3RyZWFtIG9mIHNwZWNpZmljIHNvdXJjZXMgYW5kIG91dHB1dHNcbiAgICAgIHRoaXMuc3ludGgudmlkUmVjb3JkZXIgPSBuZXcgVmlkUmVjb3JkZXIodGhpcy5jYXB0dXJlU3RyZWFtKVxuICAgIH1cblxuICAgIGlmKGRldGVjdEF1ZGlvKSB0aGlzLl9pbml0QXVkaW8oKVxuXG4gICAgaWYoYXV0b0xvb3ApIGxvb3AodGhpcy50aWNrLmJpbmQodGhpcykpLnN0YXJ0KClcblxuICAgIC8vIGZpbmFsIGFyZ3VtZW50IGlzIHByb3BlcnRpZXMgdGhhdCB0aGUgdXNlciBjYW4gc2V0LCBhbGwgb3RoZXJzIGFyZSB0cmVhdGVkIGFzIHJlYWQtb25seVxuICAgIHRoaXMuc2FuZGJveCA9IG5ldyBTYW5kYm94KHRoaXMuc3ludGgsIG1ha2VHbG9iYWwsIFsnc3BlZWQnLCAndXBkYXRlJywgJ2JwbScsICdmcHMnXSlcbiAgfVxuXG4gIGV2YWwoY29kZSkge1xuICAgIHRoaXMuc2FuZGJveC5ldmFsKGNvZGUpXG4gIH1cblxuICBnZXRTY3JlZW5JbWFnZShjYWxsYmFjaykge1xuICAgIHRoaXMuaW1hZ2VDYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgdGhpcy5zYXZlRnJhbWUgPSB0cnVlXG4gIH1cblxuICBodXNoKCkge1xuICAgIHRoaXMucy5mb3JFYWNoKChzb3VyY2UpID0+IHtcbiAgICAgIHNvdXJjZS5jbGVhcigpXG4gICAgfSlcbiAgICB0aGlzLm8uZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICB0aGlzLnN5bnRoLnNvbGlkKDEsIDEsIDEsIDApLm91dChvdXRwdXQpXG4gICAgfSlcbiAgfVxuXG4gIHNldFJlc29sdXRpb24od2lkdGgsIGhlaWdodCkge1xuICAvLyAgY29uc29sZS5sb2cod2lkdGgsIGhlaWdodClcbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHdpZHRoXG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoXG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHRcbiAgICB0aGlzLm8uZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBvdXRwdXQucmVzaXplKHdpZHRoLCBoZWlnaHQpXG4gICAgfSlcbiAgICB0aGlzLnMuZm9yRWFjaCgoc291cmNlKSA9PiB7XG4gICAgICBzb3VyY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpXG4gICAgfSlcbiAgICB0aGlzLnJlZ2wuX3JlZnJlc2goKVxuICAgICBjb25zb2xlLmxvZyh0aGlzLmNhbnZhcy53aWR0aClcbiAgfVxuXG4gIGNhbnZhc1RvSW1hZ2UgKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgIGEuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuXG4gICAgbGV0IGQgPSBuZXcgRGF0ZSgpXG4gICAgYS5kb3dubG9hZCA9IGBoeWRyYS0ke2QuZ2V0RnVsbFllYXIoKX0tJHtkLmdldE1vbnRoKCkgKyAxfS0ke2QuZ2V0RGF0ZSgpfS0ke2QuZ2V0SG91cnMoKX0uJHtkLmdldE1pbnV0ZXMoKX0uJHtkLmdldFNlY29uZHMoKX0ucG5nYFxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSlcbiAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICB0aGlzLmNhbnZhcy50b0Jsb2IoIChibG9iKSA9PiB7XG4gICAgICAgIGlmKHNlbGYuaW1hZ2VDYWxsYmFjayl7XG4gICAgICAgICAgc2VsZi5pbWFnZUNhbGxiYWNrKGJsb2IpXG4gICAgICAgICAgZGVsZXRlIHNlbGYuaW1hZ2VDYWxsYmFja1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgICAgICBjb25zb2xlLmxvZyhhLmhyZWYpXG4gICAgICAgICAgYS5jbGljaygpXG4gICAgICAgIH1cbiAgICB9LCAnaW1hZ2UvcG5nJylcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XG4gICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICBfaW5pdEF1ZGlvICgpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpc1xuICAgIHRoaXMuc3ludGguYSA9IG5ldyBBdWRpbyh7XG4gICAgICBudW1CaW5zOiA0LFxuICAgICAgLy8gY2hhbmdlTGlzdGVuZXI6ICh7YXVkaW99KSA9PiB7XG4gICAgICAvLyAgIHRoYXQuYSA9IGF1ZGlvLmJpbnMubWFwKChfLCBpbmRleCkgPT5cbiAgICAgIC8vICAgICAoc2NhbGUgPSAxLCBvZmZzZXQgPSAwKSA9PiAoKSA9PiAoYXVkaW8uZmZ0W2luZGV4XSAqIHNjYWxlICsgb2Zmc2V0KVxuICAgICAgLy8gICApXG4gICAgICAvL1xuICAgICAgLy8gICBpZiAodGhhdC5tYWtlR2xvYmFsKSB7XG4gICAgICAvLyAgICAgdGhhdC5hLmZvckVhY2goKGEsIGluZGV4KSA9PiB7XG4gICAgICAvLyAgICAgICBjb25zdCBhbmFtZSA9IGBhJHtpbmRleH1gXG4gICAgICAvLyAgICAgICB3aW5kb3dbYW5hbWVdID0gYVxuICAgICAgLy8gICAgIH0pXG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH1cbiAgICB9KVxuICB9XG5cbiAgLy8gY3JlYXRlIG1haW4gb3V0cHV0IGNhbnZhcyBhbmQgYWRkIHRvIHNjcmVlblxuICBfaW5pdENhbnZhcyAoY2FudmFzKSB7XG4gICAgaWYgKGNhbnZhcykge1xuICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXNcbiAgICAgIHRoaXMud2lkdGggPSBjYW52YXMud2lkdGhcbiAgICAgIHRoaXMuaGVpZ2h0ID0gY2FudmFzLmhlaWdodFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGhcbiAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0XG4gICAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJ1xuICAgICAgdGhpcy5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnXG4gICAgICB0aGlzLmNhbnZhcy5zdHlsZS5pbWFnZVJlbmRlcmluZyA9ICdwaXhlbGF0ZWQnXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuY2FudmFzKVxuICAgIH1cbiAgfVxuXG4gIF9pbml0UmVnbCAoKSB7XG4gICAgdGhpcy5yZWdsID0gcmVxdWlyZSgncmVnbCcpKHtcbiAgICAvLyAgcHJvZmlsZTogdHJ1ZSxcbiAgICAgIGNhbnZhczogdGhpcy5jYW52YXMsXG4gICAgICBwaXhlbFJhdGlvOiAxLy8sXG4gICAgICAvLyBleHRlbnNpb25zOiBbXG4gICAgICAvLyAgICdvZXNfdGV4dHVyZV9oYWxmX2Zsb2F0JyxcbiAgICAgIC8vICAgJ29lc190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJ1xuICAgICAgLy8gXSxcbiAgICAgIC8vIG9wdGlvbmFsRXh0ZW5zaW9uczogW1xuICAgICAgLy8gICAnb2VzX3RleHR1cmVfZmxvYXQnLFxuICAgICAgLy8gICAnb2VzX3RleHR1cmVfZmxvYXRfbGluZWFyJ1xuICAgICAvL11cbiAgIH0pXG5cbiAgICAvLyBUaGlzIGNsZWFycyB0aGUgY29sb3IgYnVmZmVyIHRvIGJsYWNrIGFuZCB0aGUgZGVwdGggYnVmZmVyIHRvIDFcbiAgICB0aGlzLnJlZ2wuY2xlYXIoe1xuICAgICAgY29sb3I6IFswLCAwLCAwLCAxXVxuICAgIH0pXG5cbiAgICB0aGlzLnJlbmRlckFsbCA9IHRoaXMucmVnbCh7XG4gICAgICBmcmFnOiBgXG4gICAgICBwcmVjaXNpb24gJHt0aGlzLnByZWNpc2lvbn0gZmxvYXQ7XG4gICAgICB2YXJ5aW5nIHZlYzIgdXY7XG4gICAgICB1bmlmb3JtIHNhbXBsZXIyRCB0ZXgwO1xuICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdGV4MTtcbiAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHRleDI7XG4gICAgICB1bmlmb3JtIHNhbXBsZXIyRCB0ZXgzO1xuXG4gICAgICB2b2lkIG1haW4gKCkge1xuICAgICAgICB2ZWMyIHN0ID0gdmVjMigxLjAgLSB1di54LCB1di55KTtcbiAgICAgICAgc3QqPSB2ZWMyKDIpO1xuICAgICAgICB2ZWMyIHEgPSBmbG9vcihzdCkueHkqKHZlYzIoMi4wLCAxLjApKTtcbiAgICAgICAgaW50IHF1YWQgPSBpbnQocS54KSArIGludChxLnkpO1xuICAgICAgICBzdC54ICs9IHN0ZXAoMS4sIG1vZChzdC55LDIuMCkpO1xuICAgICAgICBzdC55ICs9IHN0ZXAoMS4sIG1vZChzdC54LDIuMCkpO1xuICAgICAgICBzdCA9IGZyYWN0KHN0KTtcbiAgICAgICAgaWYocXVhZD09MCl7XG4gICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleDAsIHN0KTtcbiAgICAgICAgfSBlbHNlIGlmKHF1YWQ9PTEpe1xuICAgICAgICAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0ZXgxLCBzdCk7XG4gICAgICAgIH0gZWxzZSBpZiAocXVhZD09Mil7XG4gICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleDIsIHN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4Mywgc3QpO1xuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICAgIGAsXG4gICAgICB2ZXJ0OiBgXG4gICAgICBwcmVjaXNpb24gJHt0aGlzLnByZWNpc2lvbn0gZmxvYXQ7XG4gICAgICBhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjtcbiAgICAgIHZhcnlpbmcgdmVjMiB1djtcblxuICAgICAgdm9pZCBtYWluICgpIHtcbiAgICAgICAgdXYgPSBwb3NpdGlvbjtcbiAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDEuMCAtIDIuMCAqIHBvc2l0aW9uLCAwLCAxKTtcbiAgICAgIH1gLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBwb3NpdGlvbjogW1xuICAgICAgICAgIFstMiwgMF0sXG4gICAgICAgICAgWzAsIC0yXSxcbiAgICAgICAgICBbMiwgMl1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHRleDA6IHRoaXMucmVnbC5wcm9wKCd0ZXgwJyksXG4gICAgICAgIHRleDE6IHRoaXMucmVnbC5wcm9wKCd0ZXgxJyksXG4gICAgICAgIHRleDI6IHRoaXMucmVnbC5wcm9wKCd0ZXgyJyksXG4gICAgICAgIHRleDM6IHRoaXMucmVnbC5wcm9wKCd0ZXgzJylcbiAgICAgIH0sXG4gICAgICBjb3VudDogMyxcbiAgICAgIGRlcHRoOiB7IGVuYWJsZTogZmFsc2UgfVxuICAgIH0pXG5cbiAgICB0aGlzLnJlbmRlckZibyA9IHRoaXMucmVnbCh7XG4gICAgICBmcmFnOiBgXG4gICAgICBwcmVjaXNpb24gJHt0aGlzLnByZWNpc2lvbn0gZmxvYXQ7XG4gICAgICB2YXJ5aW5nIHZlYzIgdXY7XG4gICAgICB1bmlmb3JtIHZlYzIgcmVzb2x1dGlvbjtcbiAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHRleDA7XG5cbiAgICAgIHZvaWQgbWFpbiAoKSB7XG4gICAgICAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0ZXgwLCB2ZWMyKDEuMCAtIHV2LngsIHV2LnkpKTtcbiAgICAgIH1cbiAgICAgIGAsXG4gICAgICB2ZXJ0OiBgXG4gICAgICBwcmVjaXNpb24gJHt0aGlzLnByZWNpc2lvbn0gZmxvYXQ7XG4gICAgICBhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjtcbiAgICAgIHZhcnlpbmcgdmVjMiB1djtcblxuICAgICAgdm9pZCBtYWluICgpIHtcbiAgICAgICAgdXYgPSBwb3NpdGlvbjtcbiAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDEuMCAtIDIuMCAqIHBvc2l0aW9uLCAwLCAxKTtcbiAgICAgIH1gLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBwb3NpdGlvbjogW1xuICAgICAgICAgIFstMiwgMF0sXG4gICAgICAgICAgWzAsIC0yXSxcbiAgICAgICAgICBbMiwgMl1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHRleDA6IHRoaXMucmVnbC5wcm9wKCd0ZXgwJyksXG4gICAgICAgIHJlc29sdXRpb246IHRoaXMucmVnbC5wcm9wKCdyZXNvbHV0aW9uJylcbiAgICAgIH0sXG4gICAgICBjb3VudDogMyxcbiAgICAgIGRlcHRoOiB7IGVuYWJsZTogZmFsc2UgfVxuICAgIH0pXG4gIH1cblxuICBfaW5pdE91dHB1dHMgKG51bU91dHB1dHMpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgIHRoaXMubyA9IChBcnJheShudW1PdXRwdXRzKSkuZmlsbCgpLm1hcCgoZWwsIGluZGV4KSA9PiB7XG4gICAgICB2YXIgbyA9IG5ldyBPdXRwdXQoe1xuICAgICAgICByZWdsOiB0aGlzLnJlZ2wsXG4gICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgICBwcmVjaXNpb246IHRoaXMucHJlY2lzaW9uLFxuICAgICAgICBsYWJlbDogYG8ke2luZGV4fWBcbiAgICAgIH0pXG4gICAgLy8gIG8ucmVuZGVyKClcbiAgICAgIG8uaWQgPSBpbmRleFxuICAgICAgc2VsZi5zeW50aFsnbycraW5kZXhdID0gb1xuICAgICAgcmV0dXJuIG9cbiAgICB9KVxuXG4gICAgLy8gc2V0IGRlZmF1bHQgb3V0cHV0XG4gICAgdGhpcy5vdXRwdXQgPSB0aGlzLm9bMF1cbiAgfVxuXG4gIF9pbml0U291cmNlcyAobnVtU291cmNlcykge1xuICAgIHRoaXMucyA9IFtdXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG51bVNvdXJjZXM7IGkrKykge1xuICAgICAgdGhpcy5jcmVhdGVTb3VyY2UoaSlcbiAgICB9XG4gIH1cblxuICBjcmVhdGVTb3VyY2UgKGkpIHtcbiAgICBsZXQgcyA9IG5ldyBTb3VyY2Uoe3JlZ2w6IHRoaXMucmVnbCwgcGI6IHRoaXMucGIsIHdpZHRoOiB0aGlzLndpZHRoLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0LCBsYWJlbDogYHMke2l9YH0pXG4gICAgdGhpcy5zeW50aFsncycgKyB0aGlzLnMubGVuZ3RoXSA9IHNcbiAgICB0aGlzLnMucHVzaChzKVxuICAgIHJldHVybiBzXG4gIH1cblxuICBfZ2VuZXJhdGVHbHNsVHJhbnNmb3JtcyAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgdGhpcy5nZW5lcmF0b3IgPSBuZXcgR2VuZXJhdG9yKHtcbiAgICAgIGRlZmF1bHRPdXRwdXQ6IHRoaXMub1swXSxcbiAgICAgIGRlZmF1bHRVbmlmb3JtczogdGhpcy5vWzBdLnVuaWZvcm1zLFxuICAgICAgZXh0ZW5kVHJhbnNmb3JtczogdGhpcy5leHRlbmRUcmFuc2Zvcm1zLFxuICAgICAgY2hhbmdlTGlzdGVuZXI6ICh7dHlwZSwgbWV0aG9kLCBzeW50aH0pID0+IHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ2FkZCcpIHtcbiAgICAgICAgICAgIHNlbGYuc3ludGhbbWV0aG9kXSA9IHN5bnRoLmdlbmVyYXRvcnNbbWV0aG9kXVxuICAgICAgICAgICAgaWYoc2VsZi5zYW5kYm94KSBzZWxmLnNhbmRib3guYWRkKG1ldGhvZClcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyZW1vdmUnKSB7XG4gICAgICAgICAgICAvLyB3aGF0IHRvIGRvIGhlcmU/IGRhbmdlcm91c2x5IGRlbGV0aW5nIHdpbmRvdyBtZXRob2RzXG4gICAgICAgICAgICAvL2RlbGV0ZSB3aW5kb3dbbWV0aG9kXVxuICAgICAgICAgIH1cbiAgICAgIC8vICB9XG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLnN5bnRoLnNldEZ1bmN0aW9uID0gdGhpcy5nZW5lcmF0b3Iuc2V0RnVuY3Rpb24uYmluZCh0aGlzLmdlbmVyYXRvcilcbiAgfVxuXG4gIF9yZW5kZXIgKG91dHB1dCkge1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0XG4gICAgICB0aGlzLmlzUmVuZGVyaW5nQWxsID0gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc1JlbmRlcmluZ0FsbCA9IHRydWVcbiAgICB9XG4gIH1cblxuICAvLyBkdCBpbiBtc1xuICB0aWNrIChkdCwgdW5pZm9ybXMpIHtcbiAgICB0aGlzLnNhbmRib3gudGljaygpXG4gICAgaWYodGhpcy5kZXRlY3RBdWRpbyA9PT0gdHJ1ZSkgdGhpcy5zeW50aC5hLnRpY2soKVxuICAvLyAgbGV0IHVwZGF0ZUludGVydmFsID0gMTAwMC90aGlzLnN5bnRoLmZwcyAvLyBtc1xuICAgIGlmKHRoaXMuc3ludGgudXBkYXRlKSB7XG4gICAgICB0cnkgeyB0aGlzLnN5bnRoLnVwZGF0ZShkdCkgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmxvZyhlcnJvcikgfVxuICAgIH1cblxuICAgIHRoaXMuc2FuZGJveC5zZXQoJ3RpbWUnLCB0aGlzLnN5bnRoLnRpbWUgKz0gZHQgKiAwLjAwMSAqIHRoaXMuc3ludGguc3BlZWQpXG4gICAgdGhpcy50aW1lU2luY2VMYXN0VXBkYXRlICs9IGR0XG4gICAgaWYoIXRoaXMuc3ludGguZnBzIHx8IHRoaXMudGltZVNpbmNlTGFzdFVwZGF0ZSA+PSAxMDAwL3RoaXMuc3ludGguZnBzKSB7XG4gICAgLy8gIGNvbnNvbGUubG9nKDEwMDAvdGhpcy50aW1lU2luY2VMYXN0VXBkYXRlKVxuICAgICAgdGhpcy5zeW50aC5zdGF0cy5mcHMgPSBNYXRoLmNlaWwoMTAwMC90aGlzLnRpbWVTaW5jZUxhc3RVcGRhdGUpXG4gICAgLy8gIGNvbnNvbGUubG9nKHRoaXMuc3ludGguc3BlZWQsIHRoaXMuc3ludGgudGltZSlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuc1tpXS50aWNrKHRoaXMuc3ludGgudGltZSlcbiAgICAgIH1cbiAgICAvLyAgY29uc29sZS5sb2codGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodClcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMub1tpXS50aWNrKHtcbiAgICAgICAgICB0aW1lOiB0aGlzLnN5bnRoLnRpbWUsXG4gICAgICAgICAgbW91c2U6IHRoaXMuc3ludGgubW91c2UsXG4gICAgICAgICAgYnBtOiB0aGlzLnN5bnRoLmJwbSxcbiAgICAgICAgICByZXNvbHV0aW9uOiBbdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodF1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzUmVuZGVyaW5nQWxsKSB7XG4gICAgICAgIHRoaXMucmVuZGVyQWxsKHtcbiAgICAgICAgICB0ZXgwOiB0aGlzLm9bMF0uZ2V0Q3VycmVudCgpLFxuICAgICAgICAgIHRleDE6IHRoaXMub1sxXS5nZXRDdXJyZW50KCksXG4gICAgICAgICAgdGV4MjogdGhpcy5vWzJdLmdldEN1cnJlbnQoKSxcbiAgICAgICAgICB0ZXgzOiB0aGlzLm9bM10uZ2V0Q3VycmVudCgpLFxuICAgICAgICAgIHJlc29sdXRpb246IFt0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0XVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICB0aGlzLnJlbmRlckZibyh7XG4gICAgICAgICAgdGV4MDogdGhpcy5vdXRwdXQuZ2V0Q3VycmVudCgpLFxuICAgICAgICAgIHJlc29sdXRpb246IFt0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0XVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgdGhpcy50aW1lU2luY2VMYXN0VXBkYXRlID0gMFxuICAgIH1cbiAgICBpZih0aGlzLnNhdmVGcmFtZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jYW52YXNUb0ltYWdlKClcbiAgICAgIHRoaXMuc2F2ZUZyYW1lID0gZmFsc2VcbiAgICB9XG4gIC8vICB0aGlzLnJlZ2wucG9sbCgpXG4gIH1cblxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gSHlkcmFSZW5kZXJlclxuIiwiY29uc3QgU3ludGggPSByZXF1aXJlKCcuL2h5ZHJhLXN5bnRoLmpzJylcbi8vY29uc3QgU2hhZGVyR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9zaGFkZXItZ2VuZXJhdG9yLmpzJylcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aFxuIiwiLy8gaGFuZGxlcyBjb2RlIGV2YWx1YXRpb24gYW5kIGF0dGFjaGluZyByZWxldmFudCBvYmplY3RzIHRvIGdsb2JhbCBhbmQgZXZhbHVhdGlvbiBjb250ZXh0c1xuXG5jb25zdCBTYW5kYm94ID0gcmVxdWlyZSgnLi9saWIvc2FuZGJveC5qcycpXG5jb25zdCBBcnJheVV0aWxzID0gcmVxdWlyZSgnLi9saWIvYXJyYXktdXRpbHMuanMnKVxuXG5jbGFzcyBFdmFsU2FuZGJveCB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudCwgbWFrZUdsb2JhbCwgdXNlclByb3BzID0gW10pIHtcbiAgICB0aGlzLm1ha2VHbG9iYWwgPSBtYWtlR2xvYmFsXG4gICAgdGhpcy5zYW5kYm94ID0gU2FuZGJveChwYXJlbnQpXG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRcbiAgICB2YXIgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHBhcmVudClcbiAgICBwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5KSA9PiB0aGlzLmFkZChwcm9wZXJ0eSkpXG4gICAgdGhpcy51c2VyUHJvcHMgPSB1c2VyUHJvcHNcbiAgfVxuXG4gIGFkZChuYW1lKSB7XG4gICAgaWYodGhpcy5tYWtlR2xvYmFsKSB3aW5kb3dbbmFtZV0gPSB0aGlzLnBhcmVudFtuYW1lXVxuICAgIHRoaXMuc2FuZGJveC5hZGRUb0NvbnRleHQobmFtZSwgYHBhcmVudC4ke25hbWV9YClcbiAgfVxuXG4vLyBzZXRzIG9uIHdpbmRvdyBhcyB3ZWxsIGFzIHN5bnRoIG9iamVjdCBpZiBnbG9iYWwgKG5vdCBuZWVkZWQgZm9yIG9iamVjdHMsIHdoaWNoIGNhbiBiZSBzZXQgZGlyZWN0bHkpXG5cbiAgc2V0KHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIGlmKHRoaXMubWFrZUdsb2JhbCkge1xuICAgICAgd2luZG93W3Byb3BlcnR5XSA9IHZhbHVlXG4gICAgfVxuICAgIHRoaXMucGFyZW50W3Byb3BlcnR5XSA9IHZhbHVlXG4gIH1cblxuICB0aWNrKCkge1xuICAgIGlmKHRoaXMubWFrZUdsb2JhbCkge1xuICAgICAgdGhpcy51c2VyUHJvcHMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgdGhpcy5wYXJlbnRbcHJvcGVydHldID0gd2luZG93W3Byb3BlcnR5XVxuICAgICAgfSlcbiAgICAgIC8vICB0aGlzLnBhcmVudC5zcGVlZCA9IHdpbmRvdy5zcGVlZFxuICAgIH0gZWxzZSB7XG5cbiAgICB9XG4gIH1cblxuICBldmFsKGNvZGUpIHtcbiAgICB0aGlzLnNhbmRib3guZXZhbChjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRXZhbFNhbmRib3hcbiIsImNvbnN0IGdsc2xUcmFuc2Zvcm1zID0gcmVxdWlyZSgnLi9nbHNsL2dsc2wtZnVuY3Rpb25zLmpzJylcbmNvbnN0IEdsc2xTb3VyY2UgPSByZXF1aXJlKCcuL2dsc2wtc291cmNlLmpzJylcblxuY2xhc3MgR2VuZXJhdG9yRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yICh7XG4gICAgICBkZWZhdWx0VW5pZm9ybXMsXG4gICAgICBkZWZhdWx0T3V0cHV0LFxuICAgICAgZXh0ZW5kVHJhbnNmb3JtcyA9IFtdLFxuICAgICAgY2hhbmdlTGlzdGVuZXIgPSAoKCkgPT4ge30pXG4gICAgfSA9IHt9XG4gICAgKSB7XG4gICAgdGhpcy5kZWZhdWx0T3V0cHV0ID0gZGVmYXVsdE91dHB1dFxuICAgIHRoaXMuZGVmYXVsdFVuaWZvcm1zID0gZGVmYXVsdFVuaWZvcm1zXG4gICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IGNoYW5nZUxpc3RlbmVyXG4gICAgdGhpcy5leHRlbmRUcmFuc2Zvcm1zID0gZXh0ZW5kVHJhbnNmb3Jtc1xuICAgIHRoaXMuZ2VuZXJhdG9ycyA9IHt9XG4gICAgdGhpcy5pbml0KClcbiAgfVxuICBpbml0ICgpIHtcbiAgICB0aGlzLmdsc2xUcmFuc2Zvcm1zID0ge31cbiAgICB0aGlzLmdlbmVyYXRvcnMgPSBPYmplY3QuZW50cmllcyh0aGlzLmdlbmVyYXRvcnMpLnJlZHVjZSgocHJldiwgW21ldGhvZCwgdHJhbnNmb3JtXSkgPT4ge1xuICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcih7dHlwZTogJ3JlbW92ZScsIHN5bnRoOiB0aGlzLCBtZXRob2R9KVxuICAgICAgcmV0dXJuIHByZXZcbiAgICB9LCB7fSlcblxuICAgIHRoaXMuc291cmNlQ2xhc3MgPSAoKCkgPT4ge1xuICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgR2xzbFNvdXJjZSB7XG4gICAgICB9XG4gICAgfSkoKVxuXG4gICAgbGV0IGZ1bmN0aW9ucyA9IGdsc2xUcmFuc2Zvcm1zXG5cbiAgICAvLyBhZGQgdXNlciBkZWZpbmllZCB0cmFuc2Zvcm1zXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5leHRlbmRUcmFuc2Zvcm1zKSkge1xuICAgICAgZnVuY3Rpb25zLmNvbmNhdCh0aGlzLmV4dGVuZFRyYW5zZm9ybXMpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5leHRlbmRUcmFuc2Zvcm1zID09PSAnb2JqZWN0JyAmJiB0aGlzLmV4dGVuZFRyYW5zZm9ybXMudHlwZSkge1xuICAgICAgZnVuY3Rpb25zLnB1c2godGhpcy5leHRlbmRUcmFuc2Zvcm1zKVxuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbnMubWFwKCh0cmFuc2Zvcm0pID0+IHRoaXMuc2V0RnVuY3Rpb24odHJhbnNmb3JtKSlcbiB9XG5cbiBfYWRkTWV0aG9kIChtZXRob2QsIHRyYW5zZm9ybSkge1xuICAgIHRoaXMuZ2xzbFRyYW5zZm9ybXNbbWV0aG9kXSA9IHRyYW5zZm9ybVxuICAgIGlmICh0cmFuc2Zvcm0udHlwZSA9PT0gJ3NyYycpIHtcbiAgICAgIGNvbnN0IGZ1bmMgPSAoLi4uYXJncykgPT4gbmV3IHRoaXMuc291cmNlQ2xhc3Moe1xuICAgICAgICBuYW1lOiBtZXRob2QsXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgICAgICB1c2VyQXJnczogYXJncyxcbiAgICAgICAgZGVmYXVsdE91dHB1dDogdGhpcy5kZWZhdWx0T3V0cHV0LFxuICAgICAgICBkZWZhdWx0VW5pZm9ybXM6IHRoaXMuZGVmYXVsdFVuaWZvcm1zLFxuICAgICAgICBzeW50aDogdGhpc1xuICAgICAgfSlcbiAgICAgIHRoaXMuZ2VuZXJhdG9yc1ttZXRob2RdID0gZnVuY1xuICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcih7dHlwZTogJ2FkZCcsIHN5bnRoOiB0aGlzLCBtZXRob2R9KVxuICAgICAgcmV0dXJuIGZ1bmNcbiAgICB9IGVsc2UgIHtcbiAgICAgIHRoaXMuc291cmNlQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybXMucHVzaCh7bmFtZTogbWV0aG9kLCB0cmFuc2Zvcm06IHRyYW5zZm9ybSwgdXNlckFyZ3M6IGFyZ3N9KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBzZXRGdW5jdGlvbihvYmopIHtcbiAgICB2YXIgcHJvY2Vzc2VkR2xzbCA9IHByb2Nlc3NHbHNsKG9iailcbiAgICBpZihwcm9jZXNzZWRHbHNsKSB0aGlzLl9hZGRNZXRob2Qob2JqLm5hbWUsIHByb2Nlc3NlZEdsc2wpXG4gIH1cbn1cblxuY29uc3QgdHlwZUxvb2t1cCA9IHtcbiAgJ3NyYyc6IHtcbiAgICByZXR1cm5UeXBlOiAndmVjNCcsXG4gICAgYXJnczogWyd2ZWMyIF9zdCddXG4gIH0sXG4gICdjb29yZCc6IHtcbiAgICByZXR1cm5UeXBlOiAndmVjMicsXG4gICAgYXJnczogWyd2ZWMyIF9zdCddXG4gIH0sXG4gICdjb2xvcic6IHtcbiAgICByZXR1cm5UeXBlOiAndmVjNCcsXG4gICAgYXJnczogWyd2ZWM0IF9jMCddXG4gIH0sXG4gICdjb21iaW5lJzoge1xuICAgIHJldHVyblR5cGU6ICd2ZWM0JyxcbiAgICBhcmdzOiBbJ3ZlYzQgX2MwJywgJ3ZlYzQgX2MxJ11cbiAgfSxcbiAgJ2NvbWJpbmVDb29yZCc6IHtcbiAgICByZXR1cm5UeXBlOiAndmVjMicsXG4gICAgYXJnczogWyd2ZWMyIF9zdCcsICd2ZWM0IF9jMCddXG4gIH1cbn1cbi8vIGV4cGVjdHMgZ2xzbCBvZiBmb3JtYXRcbi8vIHtcbi8vICAgbmFtZTogJ29zYycsIC8vIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWNjZXNzIGZ1bmN0aW9uIGFzIHdlbGwgYXMgd2l0aGluIGdsc2xcbi8vICAgdHlwZTogJ3NyYycsIC8vIGNhbiBiZSBzcmM6IHZlYzQodmVjMiBfc3QpLCBjb29yZDogdmVjMih2ZWMyIF9zdCksIGNvbG9yOiB2ZWM0KHZlYzQgX2MwKSwgY29tYmluZTogdmVjNCh2ZWM0IF9jMCwgdmVjNCBfYzEpLCBjb21iaW5lQ29vcmQ6IHZlYzIodmVjMiBfc3QsIHZlYzQgX2MwKVxuLy8gICBpbnB1dHM6IFtcbi8vICAgICB7XG4vLyAgICAgICBuYW1lOiAnZnJlcScsXG4vLyAgICAgICB0eXBlOiAnZmxvYXQnLCAvLyAnZmxvYXQnICAgLy8sICd0ZXh0dXJlJywgJ3ZlYzQnXG4vLyAgICAgICBkZWZhdWx0OiAwLjJcbi8vICAgICB9LFxuLy8gICAgIHtcbi8vICAgICAgICAgICBuYW1lOiAnc3luYycsXG4vLyAgICAgICAgICAgdHlwZTogJ2Zsb2F0Jyxcbi8vICAgICAgICAgICBkZWZhdWx0OiAwLjFcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6ICdvZmZzZXQnLFxuLy8gICAgICAgICAgIHR5cGU6ICdmbG9hdCcsXG4vLyAgICAgICAgICAgZGVmYXVsdDogMC4wXG4vLyAgICAgICAgIH1cbi8vICAgXSxcbiAgIC8vICBnbHNsOiBgXG4gICAvLyAgICB2ZWMyIHN0ID0gX3N0O1xuICAgLy8gICAgZmxvYXQgciA9IHNpbigoc3QueC1vZmZzZXQqMi9mcmVxK3RpbWUqc3luYykqZnJlcSkqMC41ICArIDAuNTtcbiAgIC8vICAgIGZsb2F0IGcgPSBzaW4oKHN0LngrdGltZSpzeW5jKSpmcmVxKSowLjUgKyAwLjU7XG4gICAvLyAgICBmbG9hdCBiID0gc2luKChzdC54K29mZnNldC9mcmVxK3RpbWUqc3luYykqZnJlcSkqMC41ICArIDAuNTtcbiAgIC8vICAgIHJldHVybiB2ZWM0KHIsIGcsIGIsIDEuMCk7XG4gICAvLyBgXG4vLyB9XG5cbi8vIC8vIGdlbmVyYXRlcyBnbHNsIGZ1bmN0aW9uOlxuLy8gYHZlYzQgb3NjKHZlYzIgX3N0LCBmbG9hdCBmcmVxLCBmbG9hdCBzeW5jLCBmbG9hdCBvZmZzZXQpe1xuLy8gIHZlYzIgc3QgPSBfc3Q7XG4vLyAgZmxvYXQgciA9IHNpbigoc3QueC1vZmZzZXQqMi9mcmVxK3RpbWUqc3luYykqZnJlcSkqMC41ICArIDAuNTtcbi8vICBmbG9hdCBnID0gc2luKChzdC54K3RpbWUqc3luYykqZnJlcSkqMC41ICsgMC41O1xuLy8gIGZsb2F0IGIgPSBzaW4oKHN0Lngrb2Zmc2V0L2ZyZXErdGltZSpzeW5jKSpmcmVxKSowLjUgICsgMC41O1xuLy8gIHJldHVybiB2ZWM0KHIsIGcsIGIsIDEuMCk7XG4vLyB9YFxuXG5mdW5jdGlvbiBwcm9jZXNzR2xzbChvYmopIHtcbiAgbGV0IHQgPSB0eXBlTG9va3VwW29iai50eXBlXVxuICBpZih0KSB7XG4gIGxldCBiYXNlQXJncyA9IHQuYXJncy5tYXAoKGFyZykgPT4gYXJnKS5qb2luKFwiLCBcIilcbiAgLy8gQHRvZG86IG1ha2Ugc3VyZSB0aGlzIHdvcmtzIGZvciBhbGwgaW5wdXQgdHlwZXMsIGFkZCB2YWxpZGF0aW9uXG4gIGxldCBjdXN0b21BcmdzID0gb2JqLmlucHV0cy5tYXAoKGlucHV0KSA9PiBgJHtpbnB1dC50eXBlfSAke2lucHV0Lm5hbWV9YCkuam9pbignLCAnKVxuICBsZXQgYXJncyA9IGAke2Jhc2VBcmdzfSR7Y3VzdG9tQXJncy5sZW5ndGggPiAwID8gJywgJysgY3VzdG9tQXJnczogJyd9YFxuLy8gIGNvbnNvbGUubG9nKCdhcmdzIGFyZSAnLCBhcmdzKVxuXG4gICAgbGV0IGdsc2xGdW5jdGlvbiA9XG5gXG4gICR7dC5yZXR1cm5UeXBlfSAke29iai5uYW1lfSgke2FyZ3N9KSB7XG4gICAgICAke29iai5nbHNsfVxuICB9XG5gXG5cbiAgLy8gYWRkIGV4dHJhIGlucHV0IHRvIGJlZ2lubmluZyBmb3IgYmFja3dhcmQgY29tYmF0aWJpbGl0eSBAdG9kbyB1cGRhdGUgY29tcGlsZXIgc28gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5XG4gICAgaWYob2JqLnR5cGUgPT09ICdjb21iaW5lJyB8fCBvYmoudHlwZSA9PT0gJ2NvbWJpbmVDb29yZCcpIG9iai5pbnB1dHMudW5zaGlmdCh7XG4gICAgICAgIG5hbWU6ICdjb2xvcicsXG4gICAgICAgIHR5cGU6ICd2ZWM0J1xuICAgICAgfSlcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb2JqLCB7IGdsc2w6IGdsc2xGdW5jdGlvbn0pXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS53YXJuKGB0eXBlICR7b2JqLnR5cGV9IG5vdCByZWNvZ25pemVkYCwgb2JqKVxuICB9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHZW5lcmF0b3JGYWN0b3J5XG4iLCJjb25zdCBnZW5lcmF0ZUdsc2wgPSByZXF1aXJlKCcuL2dsc2wtdXRpbHMuanMnKS5nZW5lcmF0ZUdsc2xcbmNvbnN0IGZvcm1hdEFyZ3VtZW50cyA9IHJlcXVpcmUoJy4vZ2xzbC11dGlscy5qcycpLmZvcm1hdEFyZ3VtZW50c1xuXG4vLyBjb25zdCBnbHNsVHJhbnNmb3JtcyA9IHJlcXVpcmUoJy4vZ2xzbC9jb21wb3NhYmxlLWdsc2wtZnVuY3Rpb25zLmpzJylcbmNvbnN0IHV0aWxpdHlHbHNsID0gcmVxdWlyZSgnLi9nbHNsL3V0aWxpdHktZnVuY3Rpb25zLmpzJylcblxudmFyIEdsc2xTb3VyY2UgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHRoaXMudHJhbnNmb3JtcyA9IFtdXG4gIHRoaXMudHJhbnNmb3Jtcy5wdXNoKG9iailcbiAgdGhpcy5kZWZhdWx0T3V0cHV0ID0gb2JqLmRlZmF1bHRPdXRwdXRcbiAgdGhpcy5zeW50aCA9IG9iai5zeW50aFxuICB0aGlzLnR5cGUgPSAnR2xzbFNvdXJjZSdcbiAgdGhpcy5kZWZhdWx0VW5pZm9ybXMgPSBvYmouZGVmYXVsdFVuaWZvcm1zXG4gIHJldHVybiB0aGlzXG59XG5cbkdsc2xTb3VyY2UucHJvdG90eXBlLmFkZFRyYW5zZm9ybSA9IGZ1bmN0aW9uIChvYmopICB7XG4gICAgdGhpcy50cmFuc2Zvcm1zLnB1c2gob2JqKVxufVxuXG5HbHNsU291cmNlLnByb3RvdHlwZS5vdXQgPSBmdW5jdGlvbiAoX291dHB1dCkge1xuICB2YXIgb3V0cHV0ID0gX291dHB1dCB8fCB0aGlzLmRlZmF1bHRPdXRwdXRcbiAgdmFyIGdsc2wgPSB0aGlzLmdsc2wob3V0cHV0KVxuICB0aGlzLnN5bnRoLmN1cnJlbnRGdW5jdGlvbnMgPSBbXVxuIC8vIG91dHB1dC5yZW5kZXJQYXNzZXMoZ2xzbClcbiAgaWYob3V0cHV0KSB0cnl7XG4gICAgb3V0cHV0LnJlbmRlcihnbHNsKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUubG9nKCdzaGFkZXIgY291bGQgbm90IGNvbXBpbGUnLCBlcnJvcilcbiAgfVxufVxuXG5HbHNsU291cmNlLnByb3RvdHlwZS5nbHNsID0gZnVuY3Rpb24gKCkge1xuICAvL3ZhciBvdXRwdXQgPSBfb3V0cHV0IHx8IHRoaXMuZGVmYXVsdE91dHB1dFxuICB2YXIgc2VsZiA9IHRoaXNcbiAgLy8gdW5pZm9ybXMgaW5jbHVkZWQgaW4gYWxsIHNoYWRlcnNcbi8vICB0aGlzLmRlZmF1bHRVbmlmb3JtcyA9IG91dHB1dC51bmlmb3Jtc1xuICB2YXIgcGFzc2VzID0gW11cbiAgdmFyIHRyYW5zZm9ybXMgPSBbXVxuLy8gIGNvbnNvbGUubG9nKCdvdXRwdXQnLCBvdXRwdXQpXG4gIHRoaXMudHJhbnNmb3Jtcy5mb3JFYWNoKCh0cmFuc2Zvcm0pID0+IHtcbiAgICBpZih0cmFuc2Zvcm0udHJhbnNmb3JtLnR5cGUgPT09ICdyZW5kZXJwYXNzJyl7XG4gICAgICAvLyBpZiAodHJhbnNmb3Jtcy5sZW5ndGggPiAwKSBwYXNzZXMucHVzaCh0aGlzLmNvbXBpbGUodHJhbnNmb3Jtcywgb3V0cHV0KSlcbiAgICAgIC8vIHRyYW5zZm9ybXMgPSBbXVxuICAgICAgLy8gdmFyIHVuaWZvcm1zID0ge31cbiAgICAgIC8vIGNvbnN0IGlucHV0cyA9IGZvcm1hdEFyZ3VtZW50cyh0cmFuc2Zvcm0sIC0xKVxuICAgICAgLy8gaW5wdXRzLmZvckVhY2goKHVuaWZvcm0pID0+IHsgdW5pZm9ybXNbdW5pZm9ybS5uYW1lXSA9IHVuaWZvcm0udmFsdWUgfSlcbiAgICAgIC8vXG4gICAgICAvLyBwYXNzZXMucHVzaCh7XG4gICAgICAvLyAgIGZyYWc6IHRyYW5zZm9ybS50cmFuc2Zvcm0uZnJhZyxcbiAgICAgIC8vICAgdW5pZm9ybXM6IE9iamVjdC5hc3NpZ24oe30sIHNlbGYuZGVmYXVsdFVuaWZvcm1zLCB1bmlmb3JtcylcbiAgICAgIC8vIH0pXG4gICAgICAvLyB0cmFuc2Zvcm1zLnB1c2goe25hbWU6ICdwcmV2JywgdHJhbnNmb3JtOiAgZ2xzbFRyYW5zZm9ybXNbJ3ByZXYnXSwgc3ludGg6IHRoaXMuc3ludGh9KVxuICAgICAgY29uc29sZS53YXJuKCdubyBzdXBwb3J0IGZvciByZW5kZXJwYXNzJylcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhbnNmb3Jtcy5wdXNoKHRyYW5zZm9ybSlcbiAgICB9XG4gIH0pXG5cbiAgaWYgKHRyYW5zZm9ybXMubGVuZ3RoID4gMCkgcGFzc2VzLnB1c2godGhpcy5jb21waWxlKHRyYW5zZm9ybXMpKVxuXG4gIHJldHVybiBwYXNzZXNcbn1cblxuR2xzbFNvdXJjZS5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uICh0cmFuc2Zvcm1zKSB7XG5cbiAgdmFyIHNoYWRlckluZm8gPSBnZW5lcmF0ZUdsc2wodHJhbnNmb3JtcylcbiAgdmFyIHVuaWZvcm1zID0ge31cbiAgc2hhZGVySW5mby51bmlmb3Jtcy5mb3JFYWNoKCh1bmlmb3JtKSA9PiB7IHVuaWZvcm1zW3VuaWZvcm0ubmFtZV0gPSB1bmlmb3JtLnZhbHVlIH0pXG5cbiAgdmFyIGZyYWcgPSBgXG4gIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuICAke09iamVjdC52YWx1ZXMoc2hhZGVySW5mby51bmlmb3JtcykubWFwKCh1bmlmb3JtKSA9PiB7XG4gICAgbGV0IHR5cGUgPSB1bmlmb3JtLnR5cGVcbiAgICBzd2l0Y2ggKHVuaWZvcm0udHlwZSkge1xuICAgICAgY2FzZSAndGV4dHVyZSc6XG4gICAgICAgIHR5cGUgPSAnc2FtcGxlcjJEJ1xuICAgICAgICBicmVha1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgdW5pZm9ybSAke3R5cGV9ICR7dW5pZm9ybS5uYW1lfTtgXG4gIH0pLmpvaW4oJycpfVxuICB1bmlmb3JtIGZsb2F0IHRpbWU7XG4gIHVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xuICB2YXJ5aW5nIHZlYzIgdXY7XG4gIHVuaWZvcm0gc2FtcGxlcjJEIHByZXZCdWZmZXI7XG5cbiAgJHtPYmplY3QudmFsdWVzKHV0aWxpdHlHbHNsKS5tYXAoKHRyYW5zZm9ybSkgPT4ge1xuICAvLyAgY29uc29sZS5sb2codHJhbnNmb3JtLmdsc2wpXG4gICAgcmV0dXJuIGBcbiAgICAgICAgICAgICR7dHJhbnNmb3JtLmdsc2x9XG4gICAgICAgICAgYFxuICB9KS5qb2luKCcnKX1cblxuICAke3NoYWRlckluZm8uZ2xzbEZ1bmN0aW9ucy5tYXAoKHRyYW5zZm9ybSkgPT4ge1xuICAgIHJldHVybiBgXG4gICAgICAgICAgICAke3RyYW5zZm9ybS50cmFuc2Zvcm0uZ2xzbH1cbiAgICAgICAgICBgXG4gIH0pLmpvaW4oJycpfVxuXG4gIHZvaWQgbWFpbiAoKSB7XG4gICAgdmVjNCBjID0gdmVjNCgxLCAwLCAwLCAxKTtcbiAgICB2ZWMyIHN0ID0gZ2xfRnJhZ0Nvb3JkLnh5L3Jlc29sdXRpb24ueHk7XG4gICAgZ2xfRnJhZ0NvbG9yID0gJHtzaGFkZXJJbmZvLmZyYWdDb2xvcn07XG4gIH1cbiAgYFxuXG4gIHJldHVybiB7XG4gICAgZnJhZzogZnJhZyxcbiAgICB1bmlmb3JtczogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5kZWZhdWx0VW5pZm9ybXMsIHVuaWZvcm1zKVxuICB9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHbHNsU291cmNlXG4iLCIvLyBjb252ZXJ0cyBhIHRyZWUgb2YgamF2YXNjcmlwdCBmdW5jdGlvbnMgdG8gYSBzaGFkZXJcblxuLy8gQWRkIGV4dHJhIGZ1bmN0aW9uYWxpdHkgdG8gQXJyYXkucHJvdG90eXBlIGZvciBnZW5lcmF0aW5nIHNlcXVlbmNlcyBpbiB0aW1lXG5jb25zdCBhcnJheVV0aWxzID0gcmVxdWlyZSgnLi9saWIvYXJyYXktdXRpbHMuanMnKVxuXG4vLyBbV0lQXSBob3cgdG8gdHJlYXQgZGlmZmVyZW50IGRpbWVuc2lvbnMgKD8pXG5jb25zdCBERUZBVUxUX0NPTlZFUlNJT05TID0ge1xuICBmbG9hdDoge1xuICAgICd2ZWM0Jzoge25hbWU6ICdzdW0nLCBhcmdzOiBbWzEsIDEsIDEsIDFdXX0sXG4gICAgJ3ZlYzInOiB7bmFtZTogJ3N1bScsIGFyZ3M6IFtbMSwgMV1dfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZW5lcmF0ZUdsc2w6IGZ1bmN0aW9uICh0cmFuc2Zvcm1zKSB7XG4gICAgdmFyIHNoYWRlclBhcmFtcyA9IHtcbiAgICAgIHVuaWZvcm1zOiBbXSwgLy8gbGlzdCBvZiB1bmlmb3JtcyB1c2VkIGluIHNoYWRlclxuICAgICAgZ2xzbEZ1bmN0aW9uczogW10sIC8vIGxpc3Qgb2YgZnVuY3Rpb25zIHVzZWQgaW4gc2hhZGVyXG4gICAgICBmcmFnQ29sb3I6ICcnXG4gICAgfVxuXG4gICAgdmFyIGdlbiA9IGdlbmVyYXRlR2xzbCh0cmFuc2Zvcm1zLCBzaGFkZXJQYXJhbXMpKCdzdCcpXG4gICAgc2hhZGVyUGFyYW1zLmZyYWdDb2xvciA9IGdlblxuICAgIC8vIHJlbW92ZSB1bmlmb3JtcyB3aXRoIGR1cGxpY2F0ZSBuYW1lc1xuICAgIGxldCB1bmlmb3JtcyA9IHt9XG4gICAgc2hhZGVyUGFyYW1zLnVuaWZvcm1zLmZvckVhY2goKHVuaWZvcm0pID0+IHVuaWZvcm1zW3VuaWZvcm0ubmFtZV0gPSB1bmlmb3JtKVxuICAgIHNoYWRlclBhcmFtcy51bmlmb3JtcyA9IE9iamVjdC52YWx1ZXModW5pZm9ybXMpXG4gICAgcmV0dXJuIHNoYWRlclBhcmFtc1xuICB9LFxuICBmb3JtYXRBcmd1bWVudHM6IGZvcm1hdEFyZ3VtZW50c1xufVxuLy8gcmVjdXJzaXZlIGZ1bmN0aW9uIGZvciBnZW5lcmF0aW5nIHNoYWRlciBzdHJpbmcgZnJvbSBvYmplY3QgY29udGFpbmluZyBmdW5jdGlvbnMgYW5kIHVzZXIgYXJndW1lbnRzLiBPcmRlciBvZiBmdW5jdGlvbnMgaW4gc3RyaW5nIGRlcGVuZHMgb24gdHlwZSBvZiBmdW5jdGlvblxuLy8gdG8gZG86IGltcHJvdmUgdmFyaWFibGUgbmFtZXNcbmZ1bmN0aW9uIGdlbmVyYXRlR2xzbCAodHJhbnNmb3Jtcywgc2hhZGVyUGFyYW1zKSB7XG5cbiAgLy8gdHJhbnNmb3JtIGZ1bmN0aW9uIHRoYXQgb3V0cHV0cyBhIHNoYWRlciBzdHJpbmcgY29ycmVzcG9uZGluZyB0byBnbF9GcmFnQ29sb3JcbiAgdmFyIGZyYWdDb2xvciA9ICgpID0+ICcnXG4gIC8vIHZhciB1bmlmb3JtcyA9IFtdXG4gIC8vIHZhciBnbHNsRnVuY3Rpb25zID0gW11cbiAgdHJhbnNmb3Jtcy5mb3JFYWNoKCh0cmFuc2Zvcm0pID0+IHtcbiAgICB2YXIgaW5wdXRzID0gZm9ybWF0QXJndW1lbnRzKHRyYW5zZm9ybSwgc2hhZGVyUGFyYW1zLnVuaWZvcm1zLmxlbmd0aClcbiAgLy8gIGNvbnNvbGUubG9nKCdpbnB1dHMnLCBpbnB1dHMsIHRyYW5zZm9ybSlcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmKGlucHV0LmlzVW5pZm9ybSkgc2hhZGVyUGFyYW1zLnVuaWZvcm1zLnB1c2goaW5wdXQpXG4gICAgfSlcblxuICAgIC8vIGFkZCBuZXcgZ2xzbCBmdW5jdGlvbiB0byBydW5uaW5nIGxpc3Qgb2YgZnVuY3Rpb25zXG4gICAgaWYoIWNvbnRhaW5zKHRyYW5zZm9ybSwgc2hhZGVyUGFyYW1zLmdsc2xGdW5jdGlvbnMpKSBzaGFkZXJQYXJhbXMuZ2xzbEZ1bmN0aW9ucy5wdXNoKHRyYW5zZm9ybSlcblxuICAgIC8vIGN1cnJlbnQgZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgZnJhZyBjb2xvciBzaGFkZXIgY29kZVxuICAgIHZhciBmMCA9IGZyYWdDb2xvclxuICAgIGlmICh0cmFuc2Zvcm0udHJhbnNmb3JtLnR5cGUgPT09ICdzcmMnKSB7XG4gICAgICBmcmFnQ29sb3IgPSAodXYpID0+IGAke3NoYWRlclN0cmluZyh1diwgdHJhbnNmb3JtLm5hbWUsIGlucHV0cywgc2hhZGVyUGFyYW1zKX1gXG4gICAgfSBlbHNlIGlmICh0cmFuc2Zvcm0udHJhbnNmb3JtLnR5cGUgPT09ICdjb29yZCcpIHtcbiAgICAgIGZyYWdDb2xvciA9ICh1dikgPT4gYCR7ZjAoYCR7c2hhZGVyU3RyaW5nKHV2LCB0cmFuc2Zvcm0ubmFtZSwgaW5wdXRzLCBzaGFkZXJQYXJhbXMpfWApfWBcbiAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybS50cmFuc2Zvcm0udHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgZnJhZ0NvbG9yID0gKHV2KSA9PiAgYCR7c2hhZGVyU3RyaW5nKGAke2YwKHV2KX1gLCB0cmFuc2Zvcm0ubmFtZSwgaW5wdXRzLCBzaGFkZXJQYXJhbXMpfWBcbiAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybS50cmFuc2Zvcm0udHlwZSA9PT0gJ2NvbWJpbmUnKSB7XG4gICAgICAvLyBjb21iaW5pbmcgdHdvIGdlbmVyYXRlZCBzaGFkZXIgc3RyaW5ncyAoaS5lLiBmb3IgYmxlbmQsIG11bHQsIGFkZCBmdW50aW9ucylcbiAgICAgIHZhciBmMSA9IGlucHV0c1swXS52YWx1ZSAmJiBpbnB1dHNbMF0udmFsdWUudHJhbnNmb3JtcyA/XG4gICAgICAodXYpID0+IGAke2dlbmVyYXRlR2xzbChpbnB1dHNbMF0udmFsdWUudHJhbnNmb3Jtcywgc2hhZGVyUGFyYW1zKSh1dil9YCA6XG4gICAgICAoaW5wdXRzWzBdLmlzVW5pZm9ybSA/ICgpID0+IGlucHV0c1swXS5uYW1lIDogKCkgPT4gaW5wdXRzWzBdLnZhbHVlKVxuICAgICAgZnJhZ0NvbG9yID0gKHV2KSA9PiBgJHtzaGFkZXJTdHJpbmcoYCR7ZjAodXYpfSwgJHtmMSh1dil9YCwgdHJhbnNmb3JtLm5hbWUsIGlucHV0cy5zbGljZSgxKSwgc2hhZGVyUGFyYW1zKX1gXG4gICAgfSBlbHNlIGlmICh0cmFuc2Zvcm0udHJhbnNmb3JtLnR5cGUgPT09ICdjb21iaW5lQ29vcmQnKSB7XG4gICAgICAvLyBjb21iaW5pbmcgdHdvIGdlbmVyYXRlZCBzaGFkZXIgc3RyaW5ncyAoaS5lLiBmb3IgbW9kdWxhdGUgZnVuY3Rpb25zKVxuICAgICAgdmFyIGYxID0gaW5wdXRzWzBdLnZhbHVlICYmIGlucHV0c1swXS52YWx1ZS50cmFuc2Zvcm1zID9cbiAgICAgICh1dikgPT4gYCR7Z2VuZXJhdGVHbHNsKGlucHV0c1swXS52YWx1ZS50cmFuc2Zvcm1zLCBzaGFkZXJQYXJhbXMpKHV2KX1gIDpcbiAgICAgIChpbnB1dHNbMF0uaXNVbmlmb3JtID8gKCkgPT4gaW5wdXRzWzBdLm5hbWUgOiAoKSA9PiBpbnB1dHNbMF0udmFsdWUpXG4gICAgICBmcmFnQ29sb3IgPSAodXYpID0+IGAke2YwKGAke3NoYWRlclN0cmluZyhgJHt1dn0sICR7ZjEodXYpfWAsIHRyYW5zZm9ybS5uYW1lLCBpbnB1dHMuc2xpY2UoMSksIHNoYWRlclBhcmFtcyl9YCl9YFxuXG5cbiAgICB9XG4gIH0pXG4vLyAgY29uc29sZS5sb2coZnJhZ0NvbG9yKVxuICAvLyAgYnJlYWs7XG4gIHJldHVybiBmcmFnQ29sb3Jcbn1cblxuLy8gYXNzZW1ibGVzIGEgc2hhZGVyIHN0cmluZyBjb250YWluaW5nIHRoZSBhcmd1bWVudHMgYW5kIHRoZSBmdW5jdGlvbiBuYW1lLCBpLmUuICdvc2ModXYsIGZyZXF1ZW5jeSknXG5mdW5jdGlvbiBzaGFkZXJTdHJpbmcgKHV2LCBtZXRob2QsIGlucHV0cywgc2hhZGVyUGFyYW1zKSB7XG4gIGNvbnN0IHN0ciA9IGlucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgaWYgKGlucHV0LmlzVW5pZm9ybSkge1xuICAgICAgcmV0dXJuIGlucHV0Lm5hbWVcbiAgICB9IGVsc2UgaWYgKGlucHV0LnZhbHVlICYmIGlucHV0LnZhbHVlLnRyYW5zZm9ybXMpIHtcbiAgICAgIC8vIHRoaXMgYnkgZGVmaW5pdGlvbiBuZWVkcyB0byBiZSBhIGdlbmVyYXRvciwgaGVuY2Ugd2Ugc3RhcnQgd2l0aCAnc3QnIGFzIHRoZSBpbml0aWFsIHZhbHVlIGZvciBnZW5lcmF0aW5nIHRoZSBnbHNsIGZyYWdtZW50XG4gICAgICByZXR1cm4gYCR7Z2VuZXJhdGVHbHNsKGlucHV0LnZhbHVlLnRyYW5zZm9ybXMsIHNoYWRlclBhcmFtcykoJ3N0Jyl9YFxuICAgIH1cbiAgICByZXR1cm4gaW5wdXQudmFsdWVcbiAgfSkucmVkdWNlKChwLCBjKSA9PiBgJHtwfSwgJHtjfWAsICcnKVxuXG4gIHJldHVybiBgJHttZXRob2R9KCR7dXZ9JHtzdHJ9KWBcbn1cblxuLy8gbWVyZ2UgdHdvIGFycmF5cyBhbmQgcmVtb3ZlIGR1cGxpY2F0ZXNcbmZ1bmN0aW9uIG1lcmdlQXJyYXlzIChhLCBiKSB7XG4gIHJldHVybiBhLmNvbmNhdChiLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBhLmluZGV4T2YoaXRlbSkgPCAwO1xuICB9KSlcbn1cblxuLy8gY2hlY2sgd2hldGhlciBhcnJheVxuZnVuY3Rpb24gY29udGFpbnMob2JqZWN0LCBhcnIpIHtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKyl7XG4gICAgaWYob2JqZWN0Lm5hbWUgPT0gYXJyW2ldLm5hbWUpIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGZpbGxBcnJheVdpdGhEZWZhdWx0cyAoYXJyLCBsZW4pIHtcbiAgLy8gZmlsbCB0aGUgYXJyYXkgd2l0aCBkZWZhdWx0IHZhbHVlcyBpZiBpdCdzIHRvbyBzaG9ydFxuICB3aGlsZSAoYXJyLmxlbmd0aCA8IGxlbikge1xuICAgIGlmIChhcnIubGVuZ3RoID09PSAzKSB7IC8vIHB1c2ggYSAxIGFzIHRoZSBkZWZhdWx0IGZvciAuYSBpbiB2ZWM0XG4gICAgICBhcnIucHVzaCgxLjApXG4gICAgfSBlbHNlIHtcbiAgICAgIGFyci5wdXNoKDAuMClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFyci5zbGljZSgwLCBsZW4pXG59XG5cbmNvbnN0IGVuc3VyZV9kZWNpbWFsX2RvdCA9ICh2YWwpID0+IHtcbiAgdmFsID0gdmFsLnRvU3RyaW5nKClcbiAgaWYgKHZhbC5pbmRleE9mKCcuJykgPCAwKSB7XG4gICAgdmFsICs9ICcuJ1xuICB9XG4gIHJldHVybiB2YWxcbn1cblxuZnVuY3Rpb24gZm9ybWF0QXJndW1lbnRzICh0cmFuc2Zvcm0sIHN0YXJ0SW5kZXgpIHtcbiAgLy8gIGNvbnNvbGUubG9nKCdwcm9jZXNzaW5nIGFyZ3MnLCB0cmFuc2Zvcm0sIHN0YXJ0SW5kZXgpXG4gIGNvbnN0IGRlZmF1bHRBcmdzID0gdHJhbnNmb3JtLnRyYW5zZm9ybS5pbnB1dHNcbiAgY29uc3QgdXNlckFyZ3MgPSB0cmFuc2Zvcm0udXNlckFyZ3NcbiAgcmV0dXJuIGRlZmF1bHRBcmdzLm1hcCggKGlucHV0LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHR5cGVkQXJnID0ge1xuICAgICAgdmFsdWU6IGlucHV0LmRlZmF1bHQsXG4gICAgICB0eXBlOiBpbnB1dC50eXBlLCAvL1xuICAgICAgaXNVbmlmb3JtOiBmYWxzZSxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICB2ZWNMZW46IDBcbiAgICAgIC8vICBnZW5lcmF0ZUdsc2w6IG51bGwgLy8gZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGdsc2xcbiAgICB9XG5cbiAgICBpZih0eXBlZEFyZy50eXBlID09PSAnZmxvYXQnKSB0eXBlZEFyZy52YWx1ZSA9IGVuc3VyZV9kZWNpbWFsX2RvdChpbnB1dC5kZWZhdWx0KVxuICAgIGlmIChpbnB1dC50eXBlLnN0YXJ0c1dpdGgoJ3ZlYycpKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0eXBlZEFyZy52ZWNMZW4gPSBOdW1iZXIucGFyc2VJbnQoaW5wdXQudHlwZS5zdWJzdHIoMykpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciBkZXRlcm1pbmluZyBsZW5ndGggb2YgdmVjdG9yIGlucHV0IHR5cGUgJHtpbnB1dC50eXBlfSAoJHtpbnB1dC5uYW1lfSlgKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHVzZXIgaGFzIGlucHV0IHNvbWV0aGluZyBmb3IgdGhpcyBhcmd1bWVudFxuICAgIGlmKHVzZXJBcmdzLmxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB0eXBlZEFyZy52YWx1ZSA9IHVzZXJBcmdzW2luZGV4XVxuICAgICAgLy8gZG8gc29tZXRoaW5nIGlmIGEgY29tcG9zaXRlIG9yIHRyYW5zZm9ybVxuXG4gICAgICBpZiAodHlwZW9mIHVzZXJBcmdzW2luZGV4XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAodHlwZWRBcmcudmVjTGVuID4gMCkgeyAvLyBleHBlY3RlZCBpbnB1dCBpcyBhIHZlY3Rvciwgbm90IGEgc2NhbGFyXG4gICAgICAgICAgdHlwZWRBcmcudmFsdWUgPSAoY29udGV4dCwgcHJvcHMsIGJhdGNoSWQpID0+IChmaWxsQXJyYXlXaXRoRGVmYXVsdHModXNlckFyZ3NbaW5kZXhdKHByb3BzKSwgdHlwZWRBcmcudmVjTGVuKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0eXBlZEFyZy52YWx1ZSA9IChjb250ZXh0LCBwcm9wcywgYmF0Y2hJZCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVzZXJBcmdzW2luZGV4XShwcm9wcylcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJywgZSlcbiAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LmRlZmF1bHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0eXBlZEFyZy5pc1VuaWZvcm0gPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHVzZXJBcmdzW2luZGV4XS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHtcbiAgICAgICAgaWYgKHR5cGVkQXJnLnZlY0xlbiA+IDApIHsgLy8gZXhwZWN0ZWQgaW5wdXQgaXMgYSB2ZWN0b3IsIG5vdCBhIHNjYWxhclxuICAgICAgICAgIHR5cGVkQXJnLmlzVW5pZm9ybSA9IHRydWVcbiAgICAgICAgICB0eXBlZEFyZy52YWx1ZSA9IGZpbGxBcnJheVdpdGhEZWZhdWx0cyh0eXBlZEFyZy52YWx1ZSwgdHlwZWRBcmcudmVjTGVuKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhcImlzIEFycmF5XCIpXG4gICAgICAgICAgdHlwZWRBcmcudmFsdWUgPSAoY29udGV4dCwgcHJvcHMsIGJhdGNoSWQpID0+IGFycmF5VXRpbHMuZ2V0VmFsdWUodXNlckFyZ3NbaW5kZXhdKShwcm9wcylcbiAgICAgICAgICB0eXBlZEFyZy5pc1VuaWZvcm0gPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihzdGFydEluZGV4PCAwKXtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVkQXJnLnZhbHVlICYmIHR5cGVkQXJnLnZhbHVlLnRyYW5zZm9ybXMpIHtcbiAgICAgICAgY29uc3QgZmluYWxfdHJhbnNmb3JtID0gdHlwZWRBcmcudmFsdWUudHJhbnNmb3Jtc1t0eXBlZEFyZy52YWx1ZS50cmFuc2Zvcm1zLmxlbmd0aCAtIDFdXG5cbiAgICAgICAgaWYgKGZpbmFsX3RyYW5zZm9ybS50cmFuc2Zvcm0uZ2xzbF9yZXR1cm5fdHlwZSAhPT0gaW5wdXQudHlwZSkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRzID0gREVGQVVMVF9DT05WRVJTSU9OU1tpbnB1dC50eXBlXVxuICAgICAgICAgIGlmICh0eXBlb2YgZGVmYXVsdHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0X2RlZiA9IGRlZmF1bHRzW2ZpbmFsX3RyYW5zZm9ybS50cmFuc2Zvcm0uZ2xzbF9yZXR1cm5fdHlwZV1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGVmYXVsdF9kZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHtuYW1lLCBhcmdzfSA9IGRlZmF1bHRfZGVmXG4gICAgICAgICAgICAgIHR5cGVkQXJnLnZhbHVlID0gdHlwZWRBcmcudmFsdWVbbmFtZV0oLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0eXBlZEFyZy5pc1VuaWZvcm0gPSBmYWxzZVxuICAgICAgfSBlbHNlIGlmICh0eXBlZEFyZy50eXBlID09PSAnZmxvYXQnICYmIHR5cGVvZiB0eXBlZEFyZy52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdHlwZWRBcmcudmFsdWUgPSBlbnN1cmVfZGVjaW1hbF9kb3QodHlwZWRBcmcudmFsdWUpXG4gICAgICB9IGVsc2UgaWYgKHR5cGVkQXJnLnR5cGUuc3RhcnRzV2l0aCgndmVjJykgJiYgdHlwZW9mIHR5cGVkQXJnLnZhbHVlID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHR5cGVkQXJnLnZhbHVlKSkge1xuICAgICAgICB0eXBlZEFyZy5pc1VuaWZvcm0gPSBmYWxzZVxuICAgICAgICB0eXBlZEFyZy52YWx1ZSA9IGAke3R5cGVkQXJnLnR5cGV9KCR7dHlwZWRBcmcudmFsdWUubWFwKGVuc3VyZV9kZWNpbWFsX2RvdCkuam9pbignLCAnKX0pYFxuICAgICAgfSBlbHNlIGlmIChpbnB1dC50eXBlID09PSAnc2FtcGxlcjJEJykge1xuICAgICAgICAvLyB0eXBlZEFyZy50ZXggPSB0eXBlZEFyZy52YWx1ZVxuICAgICAgICB2YXIgeCA9IHR5cGVkQXJnLnZhbHVlXG4gICAgICAgIHR5cGVkQXJnLnZhbHVlID0gKCkgPT4gKHguZ2V0VGV4dHVyZSgpKVxuICAgICAgICB0eXBlZEFyZy5pc1VuaWZvcm0gPSB0cnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBwYXNzaW5nIGluIGEgdGV4dHVyZSByZWZlcmVuY2UsIHdoZW4gZnVuY3Rpb24gYXNrcyBmb3IgdmVjNCwgY29udmVydCB0byB2ZWM0XG4gICAgICAgIGlmICh0eXBlZEFyZy52YWx1ZS5nZXRUZXh0dXJlICYmIGlucHV0LnR5cGUgPT09ICd2ZWM0Jykge1xuICAgICAgICAgIHZhciB4MSA9IHR5cGVkQXJnLnZhbHVlXG4gICAgICAgICAgdHlwZWRBcmcudmFsdWUgPSBzcmMoeDEpXG4gICAgICAgICAgdHlwZWRBcmcuaXNVbmlmb3JtID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhZGQgdHAgdW5pZm9ybSBhcnJheSBpZiBpcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBwYXNzIGluIGEgZGlmZmVyZW50IHZhbHVlIG9uIGVhY2ggcmVuZGVyIGZyYW1lLFxuICAgICAgLy8gb3IgYSB0ZXh0dXJlLyBleHRlcm5hbCBzb3VyY2VcblxuICAgICAgaWYodHlwZWRBcmcuaXNVbmlmb3JtKSB7XG4gICAgICAgIHR5cGVkQXJnLm5hbWUgKz0gc3RhcnRJbmRleFxuICAgICAgICAvLyAgc2hhZGVyUGFyYW1zLnVuaWZvcm1zLnB1c2godHlwZWRBcmcpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0eXBlZEFyZ1xuICB9KVxufVxuIiwiLypcbkZvcm1hdCBmb3IgYWRkaW5nIGZ1bmN0aW9ucyB0byBoeWRyYS4gRm9yIGVhY2ggZW50cnkgaW4gdGhpcyBmaWxlLCBoeWRyYSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBhIGdsc2wgZnVuY3Rpb24gYW5kIGphdmFzY3JpcHQgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lLiBZb3UgY2FuIGFsc28gYXNzIGZ1bmN0aW9ucyBkeW5hbWljYWxseSB1c2luZyBzZXRGdW5jdGlvbihvYmplY3QpLlxuXG57XG4gIG5hbWU6ICdvc2MnLCAvLyBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFjY2VzcyBmdW5jdGlvbiBpbiBqcyBhcyB3ZWxsIGFzIGluIGdsc2xcbiAgdHlwZTogJ3NyYycsIC8vIGNhbiBiZSAnc3JjJywgJ2NvbG9yJywgJ2NvbWJpbmUnLCAnY29tYmluZUNvb3JkcycuIHNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdmcmVxJyxcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBkZWZhdWx0OiAwLjJcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdzeW5jJyxcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBkZWZhdWx0OiAwLjFcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIGRlZmF1bHQ6IDAuMFxuICAgIH1cbiAgXSxcbiAgICBnbHNsOiBgXG4gICAgICB2ZWMyIHN0ID0gX3N0O1xuICAgICAgZmxvYXQgciA9IHNpbigoc3QueC1vZmZzZXQqMi9mcmVxK3RpbWUqc3luYykqZnJlcSkqMC41ICArIDAuNTtcbiAgICAgIGZsb2F0IGcgPSBzaW4oKHN0LngrdGltZSpzeW5jKSpmcmVxKSowLjUgKyAwLjU7XG4gICAgICBmbG9hdCBiID0gc2luKChzdC54K29mZnNldC9mcmVxK3RpbWUqc3luYykqZnJlcSkqMC41ICArIDAuNTtcbiAgICAgIHJldHVybiB2ZWM0KHIsIGcsIGIsIDEuMCk7XG4gICBgXG59XG5cbi8vIFRoZSBhYm92ZSBjb2RlIGdlbmVyYXRlcyB0aGUgZ2xzbCBmdW5jdGlvbjpcbmB2ZWM0IG9zYyh2ZWMyIF9zdCwgZmxvYXQgZnJlcSwgZmxvYXQgc3luYywgZmxvYXQgb2Zmc2V0KXtcbiB2ZWMyIHN0ID0gX3N0O1xuIGZsb2F0IHIgPSBzaW4oKHN0Lngtb2Zmc2V0KjIvZnJlcSt0aW1lKnN5bmMpKmZyZXEpKjAuNSAgKyAwLjU7XG4gZmxvYXQgZyA9IHNpbigoc3QueCt0aW1lKnN5bmMpKmZyZXEpKjAuNSArIDAuNTtcbiBmbG9hdCBiID0gc2luKChzdC54K29mZnNldC9mcmVxK3RpbWUqc3luYykqZnJlcSkqMC41ICArIDAuNTtcbiByZXR1cm4gdmVjNChyLCBnLCBiLCAxLjApO1xufWBcblxuXG5UeXBlcyBhbmQgZGVmYXVsdCBhcmd1bWVudHMgZm9yIGh5ZHJhIGZ1bmN0aW9ucy5cblRoZSB2YWx1ZSBpbiB0aGUgJ3R5cGUnIGZpZWxkIGxldHMgdGhlIHBhcnNlciBrbm93IHdoaWNoIHR5cGUgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgcmV0dXJuZWQgYXMgd2VsbCBhcyBkZWZhdWx0IGFyZ3VtZW50cy5cblxuY29uc3QgdHlwZXMgPSB7XG4gICdzcmMnOiB7XG4gICAgcmV0dXJuVHlwZTogJ3ZlYzQnLFxuICAgIGFyZ3M6IFsndmVjMiBfc3QnXVxuICB9LFxuICAnY29vcmQnOiB7XG4gICAgcmV0dXJuVHlwZTogJ3ZlYzInLFxuICAgIGFyZ3M6IFsndmVjMiBfc3QnXVxuICB9LFxuICAnY29sb3InOiB7XG4gICAgcmV0dXJuVHlwZTogJ3ZlYzQnLFxuICAgIGFyZ3M6IFsndmVjNCBfYzAnXVxuICB9LFxuICAnY29tYmluZSc6IHtcbiAgICByZXR1cm5UeXBlOiAndmVjNCcsXG4gICAgYXJnczogWyd2ZWM0IF9jMCcsICd2ZWM0IF9jMSddXG4gIH0sXG4gICdjb21iaW5lQ29vcmQnOiB7XG4gICAgcmV0dXJuVHlwZTogJ3ZlYzInLFxuICAgIGFyZ3M6IFsndmVjMiBfc3QnLCAndmVjNCBfYzAnXVxuICB9XG59XG5cbiovXG5cbm1vZHVsZS5leHBvcnRzID0gW1xuICB7XG4gIG5hbWU6ICdub2lzZScsXG4gIHR5cGU6ICdzcmMnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3NjYWxlJyxcbiAgICAgIGRlZmF1bHQ6IDEwLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICBkZWZhdWx0OiAwLjEsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHJldHVybiB2ZWM0KHZlYzMoX25vaXNlKHZlYzMoX3N0KnNjYWxlLCBvZmZzZXQqdGltZSkpKSwgMS4wKTtgXG59LFxue1xuICBuYW1lOiAndm9yb25vaScsXG4gIHR5cGU6ICdzcmMnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3NjYWxlJyxcbiAgICAgIGRlZmF1bHQ6IDUsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc3BlZWQnLFxuICAgICAgZGVmYXVsdDogMC4zLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ2JsZW5kaW5nJyxcbiAgICAgIGRlZmF1bHQ6IDAuMyxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgdmVjMyBjb2xvciA9IHZlYzMoLjApO1xuICAgLy8gU2NhbGVcbiAgIF9zdCAqPSBzY2FsZTtcbiAgIC8vIFRpbGUgdGhlIHNwYWNlXG4gICB2ZWMyIGlfc3QgPSBmbG9vcihfc3QpO1xuICAgdmVjMiBmX3N0ID0gZnJhY3QoX3N0KTtcbiAgIGZsb2F0IG1fZGlzdCA9IDEwLjsgIC8vIG1pbmltdW4gZGlzdGFuY2VcbiAgIHZlYzIgbV9wb2ludDsgICAgICAgIC8vIG1pbmltdW0gcG9pbnRcbiAgIGZvciAoaW50IGo9LTE7IGo8PTE7IGorKyApIHtcbiAgIGZvciAoaW50IGk9LTE7IGk8PTE7IGkrKyApIHtcbiAgIHZlYzIgbmVpZ2hib3IgPSB2ZWMyKGZsb2F0KGkpLGZsb2F0KGopKTtcbiAgIHZlYzIgcCA9IGlfc3QgKyBuZWlnaGJvcjtcbiAgIHZlYzIgcG9pbnQgPSBmcmFjdChzaW4odmVjMihkb3QocCx2ZWMyKDEyNy4xLDMxMS43KSksZG90KHAsdmVjMigyNjkuNSwxODMuMykpKSkqNDM3NTguNTQ1Myk7XG4gICBwb2ludCA9IDAuNSArIDAuNSpzaW4odGltZSpzcGVlZCArIDYuMjgzMSpwb2ludCk7XG4gICB2ZWMyIGRpZmYgPSBuZWlnaGJvciArIHBvaW50IC0gZl9zdDtcbiAgIGZsb2F0IGRpc3QgPSBsZW5ndGgoZGlmZik7XG4gICBpZiggZGlzdCA8IG1fZGlzdCApIHtcbiAgIG1fZGlzdCA9IGRpc3Q7XG4gICBtX3BvaW50ID0gcG9pbnQ7XG4gICB9XG4gICB9XG4gICB9XG4gICAvLyBBc3NpZ24gYSBjb2xvciB1c2luZyB0aGUgY2xvc2VzdCBwb2ludCBwb3NpdGlvblxuICAgY29sb3IgKz0gZG90KG1fcG9pbnQsdmVjMiguMywuNikpO1xuICAgY29sb3IgKj0gMS4wIC0gYmxlbmRpbmcqbV9kaXN0O1xuICAgcmV0dXJuIHZlYzQoY29sb3IsIDEuMCk7YFxufSxcbntcbiAgbmFtZTogJ29zYycsXG4gIHR5cGU6ICdzcmMnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ2ZyZXF1ZW5jeScsXG4gICAgICBkZWZhdWx0OiA2MCxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdzeW5jJyxcbiAgICAgIGRlZmF1bHQ6IDAuMSxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgZGVmYXVsdDogMCxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgdmVjMiBzdCA9IF9zdDtcbiAgIGZsb2F0IHIgPSBzaW4oKHN0Lngtb2Zmc2V0L2ZyZXF1ZW5jeSt0aW1lKnN5bmMpKmZyZXF1ZW5jeSkqMC41ICArIDAuNTtcbiAgIGZsb2F0IGcgPSBzaW4oKHN0LngrdGltZSpzeW5jKSpmcmVxdWVuY3kpKjAuNSArIDAuNTtcbiAgIGZsb2F0IGIgPSBzaW4oKHN0Lngrb2Zmc2V0L2ZyZXF1ZW5jeSt0aW1lKnN5bmMpKmZyZXF1ZW5jeSkqMC41ICArIDAuNTtcbiAgIHJldHVybiB2ZWM0KHIsIGcsIGIsIDEuMCk7YFxufSxcbntcbiAgbmFtZTogJ3NoYXBlJyxcbiAgdHlwZTogJ3NyYycsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc2lkZXMnLFxuICAgICAgZGVmYXVsdDogMyxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdyYWRpdXMnLFxuICAgICAgZGVmYXVsdDogMC4zLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3Ntb290aGluZycsXG4gICAgICBkZWZhdWx0OiAwLjAxLFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICB2ZWMyIHN0ID0gX3N0ICogMi4gLSAxLjtcbiAgIC8vIEFuZ2xlIGFuZCByYWRpdXMgZnJvbSB0aGUgY3VycmVudCBwaXhlbFxuICAgZmxvYXQgYSA9IGF0YW4oc3QueCxzdC55KSszLjE0MTY7XG4gICBmbG9hdCByID0gKDIuKjMuMTQxNikvc2lkZXM7XG4gICBmbG9hdCBkID0gY29zKGZsb29yKC41K2Evcikqci1hKSpsZW5ndGgoc3QpO1xuICAgcmV0dXJuIHZlYzQodmVjMygxLjAtc21vb3Roc3RlcChyYWRpdXMscmFkaXVzICsgc21vb3RoaW5nLGQpKSwgMS4wKTtgXG59LFxue1xuICBuYW1lOiAnZ3JhZGllbnQnLFxuICB0eXBlOiAnc3JjJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdzcGVlZCcsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICByZXR1cm4gdmVjNChfc3QsIHNpbih0aW1lKnNwZWVkKSwgMS4wKTtgXG59LFxue1xuICBuYW1lOiAnc3JjJyxcbiAgdHlwZTogJ3NyYycsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdzYW1wbGVyMkQnLFxuICAgICAgbmFtZTogJ3RleCcsXG4gICAgICBkZWZhdWx0OiBOYU4sXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIC8vICB2ZWMyIHV2ID0gZ2xfRnJhZ0Nvb3JkLnh5L3ZlYzIoMTI4MC4sIDcyMC4pO1xuICAgcmV0dXJuIHRleHR1cmUyRCh0ZXgsIGZyYWN0KF9zdCkpO2Bcbn0sXG57XG4gIG5hbWU6ICdzb2xpZCcsXG4gIHR5cGU6ICdzcmMnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3InLFxuICAgICAgZGVmYXVsdDogMCxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdnJyxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnYicsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ2EnLFxuICAgICAgZGVmYXVsdDogMSxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgcmV0dXJuIHZlYzQociwgZywgYiwgYSk7YFxufSxcbntcbiAgbmFtZTogJ3JvdGF0ZScsXG4gIHR5cGU6ICdjb29yZCcsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnYW5nbGUnLFxuICAgICAgZGVmYXVsdDogMTAsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc3BlZWQnLFxuICAgICAgZGVmYXVsdDogMCxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgdmVjMiB4eSA9IF9zdCAtIHZlYzIoMC41KTtcbiAgIGZsb2F0IGFuZyA9IGFuZ2xlICsgc3BlZWQgKnRpbWU7XG4gICB4eSA9IG1hdDIoY29zKGFuZyksLXNpbihhbmcpLCBzaW4oYW5nKSxjb3MoYW5nKSkqeHk7XG4gICB4eSArPSAwLjU7XG4gICByZXR1cm4geHk7YFxufSxcbntcbiAgbmFtZTogJ3NjYWxlJyxcbiAgdHlwZTogJ2Nvb3JkJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdhbW91bnQnLFxuICAgICAgZGVmYXVsdDogMS41LFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3hNdWx0JyxcbiAgICAgIGRlZmF1bHQ6IDEsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAneU11bHQnLFxuICAgICAgZGVmYXVsdDogMSxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdvZmZzZXRYJyxcbiAgICAgIGRlZmF1bHQ6IDAuNSxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdvZmZzZXRZJyxcbiAgICAgIGRlZmF1bHQ6IDAuNSxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgdmVjMiB4eSA9IF9zdCAtIHZlYzIob2Zmc2V0WCwgb2Zmc2V0WSk7XG4gICB4eSo9KDEuMC92ZWMyKGFtb3VudCp4TXVsdCwgYW1vdW50KnlNdWx0KSk7XG4gICB4eSs9dmVjMihvZmZzZXRYLCBvZmZzZXRZKTtcbiAgIHJldHVybiB4eTtcbiAgIGBcbn0sXG57XG4gIG5hbWU6ICdwaXhlbGF0ZScsXG4gIHR5cGU6ICdjb29yZCcsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAncGl4ZWxYJyxcbiAgICAgIGRlZmF1bHQ6IDIwLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3BpeGVsWScsXG4gICAgICBkZWZhdWx0OiAyMCxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgdmVjMiB4eSA9IHZlYzIocGl4ZWxYLCBwaXhlbFkpO1xuICAgcmV0dXJuIChmbG9vcihfc3QgKiB4eSkgKyAwLjUpL3h5O2Bcbn0sXG57XG4gIG5hbWU6ICdwb3N0ZXJpemUnLFxuICB0eXBlOiAnY29sb3InLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ2JpbnMnLFxuICAgICAgZGVmYXVsdDogMyxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdnYW1tYScsXG4gICAgICBkZWZhdWx0OiAwLjYsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHZlYzQgYzIgPSBwb3coX2MwLCB2ZWM0KGdhbW1hKSk7XG4gICBjMiAqPSB2ZWM0KGJpbnMpO1xuICAgYzIgPSBmbG9vcihjMik7XG4gICBjMi89IHZlYzQoYmlucyk7XG4gICBjMiA9IHBvdyhjMiwgdmVjNCgxLjAvZ2FtbWEpKTtcbiAgIHJldHVybiB2ZWM0KGMyLnh5eiwgX2MwLmEpO2Bcbn0sXG57XG4gIG5hbWU6ICdzaGlmdCcsXG4gIHR5cGU6ICdjb2xvcicsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAncicsXG4gICAgICBkZWZhdWx0OiAwLjUsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnZycsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ2InLFxuICAgICAgZGVmYXVsdDogMCxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdhJyxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHZlYzQgYzIgPSB2ZWM0KF9jMCk7XG4gICBjMi5yID0gZnJhY3QoYzIuciArIHIpO1xuICAgYzIuZyA9IGZyYWN0KGMyLmcgKyBnKTtcbiAgIGMyLmIgPSBmcmFjdChjMi5iICsgYik7XG4gICBjMi5hID0gZnJhY3QoYzIuYSArIGEpO1xuICAgcmV0dXJuIHZlYzQoYzIucmdiYSk7YFxufSxcbntcbiAgbmFtZTogJ3JlcGVhdCcsXG4gIHR5cGU6ICdjb29yZCcsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAncmVwZWF0WCcsXG4gICAgICBkZWZhdWx0OiAzLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3JlcGVhdFknLFxuICAgICAgZGVmYXVsdDogMyxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdvZmZzZXRYJyxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnb2Zmc2V0WScsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICB2ZWMyIHN0ID0gX3N0ICogdmVjMihyZXBlYXRYLCByZXBlYXRZKTtcbiAgIHN0LnggKz0gc3RlcCgxLiwgbW9kKHN0LnksMi4wKSkgKiBvZmZzZXRYO1xuICAgc3QueSArPSBzdGVwKDEuLCBtb2Qoc3QueCwyLjApKSAqIG9mZnNldFk7XG4gICByZXR1cm4gZnJhY3Qoc3QpO2Bcbn0sXG57XG4gIG5hbWU6ICdtb2R1bGF0ZVJlcGVhdCcsXG4gIHR5cGU6ICdjb21iaW5lQ29vcmQnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3JlcGVhdFgnLFxuICAgICAgZGVmYXVsdDogMyxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdyZXBlYXRZJyxcbiAgICAgIGRlZmF1bHQ6IDMsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnb2Zmc2V0WCcsXG4gICAgICBkZWZhdWx0OiAwLjUsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnb2Zmc2V0WScsXG4gICAgICBkZWZhdWx0OiAwLjUsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHZlYzIgc3QgPSBfc3QgKiB2ZWMyKHJlcGVhdFgsIHJlcGVhdFkpO1xuICAgc3QueCArPSBzdGVwKDEuLCBtb2Qoc3QueSwyLjApKSArIF9jMC5yICogb2Zmc2V0WDtcbiAgIHN0LnkgKz0gc3RlcCgxLiwgbW9kKHN0LngsMi4wKSkgKyBfYzAuZyAqIG9mZnNldFk7XG4gICByZXR1cm4gZnJhY3Qoc3QpO2Bcbn0sXG57XG4gIG5hbWU6ICdyZXBlYXRYJyxcbiAgdHlwZTogJ2Nvb3JkJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdyZXBzJyxcbiAgICAgIGRlZmF1bHQ6IDMsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHZlYzIgc3QgPSBfc3QgKiB2ZWMyKHJlcHMsIDEuMCk7XG4gICAvLyAgZmxvYXQgZiA9ICBtb2QoX3N0LnksMi4wKTtcbiAgIHN0LnkgKz0gc3RlcCgxLiwgbW9kKHN0LngsMi4wKSkqIG9mZnNldDtcbiAgIHJldHVybiBmcmFjdChzdCk7YFxufSxcbntcbiAgbmFtZTogJ21vZHVsYXRlUmVwZWF0WCcsXG4gIHR5cGU6ICdjb21iaW5lQ29vcmQnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3JlcHMnLFxuICAgICAgZGVmYXVsdDogMyxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgZGVmYXVsdDogMC41LFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICB2ZWMyIHN0ID0gX3N0ICogdmVjMihyZXBzLCAxLjApO1xuICAgLy8gIGZsb2F0IGYgPSAgbW9kKF9zdC55LDIuMCk7XG4gICBzdC55ICs9IHN0ZXAoMS4sIG1vZChzdC54LDIuMCkpICsgX2MwLnIgKiBvZmZzZXQ7XG4gICByZXR1cm4gZnJhY3Qoc3QpO2Bcbn0sXG57XG4gIG5hbWU6ICdyZXBlYXRZJyxcbiAgdHlwZTogJ2Nvb3JkJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdyZXBzJyxcbiAgICAgIGRlZmF1bHQ6IDMsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHZlYzIgc3QgPSBfc3QgKiB2ZWMyKDEuMCwgcmVwcyk7XG4gICAvLyAgZmxvYXQgZiA9ICBtb2QoX3N0LnksMi4wKTtcbiAgIHN0LnggKz0gc3RlcCgxLiwgbW9kKHN0LnksMi4wKSkqIG9mZnNldDtcbiAgIHJldHVybiBmcmFjdChzdCk7YFxufSxcbntcbiAgbmFtZTogJ21vZHVsYXRlUmVwZWF0WScsXG4gIHR5cGU6ICdjb21iaW5lQ29vcmQnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3JlcHMnLFxuICAgICAgZGVmYXVsdDogMyxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgZGVmYXVsdDogMC41LFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICB2ZWMyIHN0ID0gX3N0ICogdmVjMihyZXBzLCAxLjApO1xuICAgLy8gIGZsb2F0IGYgPSAgbW9kKF9zdC55LDIuMCk7XG4gICBzdC54ICs9IHN0ZXAoMS4sIG1vZChzdC55LDIuMCkpICsgX2MwLnIgKiBvZmZzZXQ7XG4gICByZXR1cm4gZnJhY3Qoc3QpO2Bcbn0sXG57XG4gIG5hbWU6ICdrYWxlaWQnLFxuICB0eXBlOiAnY29vcmQnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ25TaWRlcycsXG4gICAgICBkZWZhdWx0OiA0LFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICB2ZWMyIHN0ID0gX3N0O1xuICAgc3QgLT0gMC41O1xuICAgZmxvYXQgciA9IGxlbmd0aChzdCk7XG4gICBmbG9hdCBhID0gYXRhbihzdC55LCBzdC54KTtcbiAgIGZsb2F0IHBpID0gMi4qMy4xNDE2O1xuICAgYSA9IG1vZChhLHBpL25TaWRlcyk7XG4gICBhID0gYWJzKGEtcGkvblNpZGVzLzIuKTtcbiAgIHJldHVybiByKnZlYzIoY29zKGEpLCBzaW4oYSkpO2Bcbn0sXG57XG4gIG5hbWU6ICdtb2R1bGF0ZUthbGVpZCcsXG4gIHR5cGU6ICdjb21iaW5lQ29vcmQnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ25TaWRlcycsXG4gICAgICBkZWZhdWx0OiA0LFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICB2ZWMyIHN0ID0gX3N0IC0gMC41O1xuICAgZmxvYXQgciA9IGxlbmd0aChzdCk7XG4gICBmbG9hdCBhID0gYXRhbihzdC55LCBzdC54KTtcbiAgIGZsb2F0IHBpID0gMi4qMy4xNDE2O1xuICAgYSA9IG1vZChhLHBpL25TaWRlcyk7XG4gICBhID0gYWJzKGEtcGkvblNpZGVzLzIuKTtcbiAgIHJldHVybiAoX2MwLnIrcikqdmVjMihjb3MoYSksIHNpbihhKSk7YFxufSxcbntcbiAgbmFtZTogJ3Njcm9sbCcsXG4gIHR5cGU6ICdjb29yZCcsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc2Nyb2xsWCcsXG4gICAgICBkZWZhdWx0OiAwLjUsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc2Nyb2xsWScsXG4gICAgICBkZWZhdWx0OiAwLjUsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc3BlZWRYJyxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc3BlZWRZJyxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYFxuICAgX3N0LnggKz0gc2Nyb2xsWCArIHRpbWUqc3BlZWRYO1xuICAgX3N0LnkgKz0gc2Nyb2xsWSArIHRpbWUqc3BlZWRZO1xuICAgcmV0dXJuIGZyYWN0KF9zdCk7YFxufSxcbntcbiAgbmFtZTogJ3Njcm9sbFgnLFxuICB0eXBlOiAnY29vcmQnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3Njcm9sbFgnLFxuICAgICAgZGVmYXVsdDogMC41LFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3NwZWVkJyxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIF9zdC54ICs9IHNjcm9sbFggKyB0aW1lKnNwZWVkO1xuICAgcmV0dXJuIGZyYWN0KF9zdCk7YFxufSxcbntcbiAgbmFtZTogJ21vZHVsYXRlU2Nyb2xsWCcsXG4gIHR5cGU6ICdjb21iaW5lQ29vcmQnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3Njcm9sbFgnLFxuICAgICAgZGVmYXVsdDogMC41LFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3NwZWVkJyxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIF9zdC54ICs9IF9jMC5yKmFtb3VudCArIHRpbWUqc3BlZWQ7XG4gICByZXR1cm4gZnJhY3QoX3N0KTtgXG59LFxue1xuICBuYW1lOiAnc2Nyb2xsWScsXG4gIHR5cGU6ICdjb29yZCcsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc2Nyb2xsWScsXG4gICAgICBkZWZhdWx0OiAwLjUsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc3BlZWQnLFxuICAgICAgZGVmYXVsdDogMCxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgX3N0LnkgKz0gc2Nyb2xsWSArIHRpbWUqc3BlZWQ7XG4gICByZXR1cm4gZnJhY3QoX3N0KTtgXG59LFxue1xuICBuYW1lOiAnbW9kdWxhdGVTY3JvbGxZJyxcbiAgdHlwZTogJ2NvbWJpbmVDb29yZCcsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc2Nyb2xsWScsXG4gICAgICBkZWZhdWx0OiAwLjUsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc3BlZWQnLFxuICAgICAgZGVmYXVsdDogMCxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgX3N0LnkgKz0gX2MwLnIqc2Nyb2xsWSArIHRpbWUqc3BlZWQ7XG4gICByZXR1cm4gZnJhY3QoX3N0KTtgXG59LFxue1xuICBuYW1lOiAnYWRkJyxcbiAgdHlwZTogJ2NvbWJpbmUnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ2Ftb3VudCcsXG4gICAgICBkZWZhdWx0OiAxLFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICByZXR1cm4gKF9jMCtfYzEpKmFtb3VudCArIF9jMCooMS4wLWFtb3VudCk7YFxufSxcbntcbiAgbmFtZTogJ3N1YicsXG4gIHR5cGU6ICdjb21iaW5lJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdhbW91bnQnLFxuICAgICAgZGVmYXVsdDogMSxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgcmV0dXJuIChfYzAtX2MxKSphbW91bnQgKyBfYzAqKDEuMC1hbW91bnQpO2Bcbn0sXG57XG4gIG5hbWU6ICdsYXllcicsXG4gIHR5cGU6ICdjb21iaW5lJyxcbiAgaW5wdXRzOiBbXG5cbiAgXSxcbiAgZ2xzbDpcbmAgICByZXR1cm4gdmVjNChtaXgoX2MwLnJnYiwgX2MxLnJnYiwgX2MxLmEpLCBfYzAuYStfYzEuYSk7YFxufSxcbntcbiAgbmFtZTogJ2JsZW5kJyxcbiAgdHlwZTogJ2NvbWJpbmUnLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ2Ftb3VudCcsXG4gICAgICBkZWZhdWx0OiAwLjUsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHJldHVybiBfYzAqKDEuMC1hbW91bnQpK19jMSphbW91bnQ7YFxufSxcbntcbiAgbmFtZTogJ211bHQnLFxuICB0eXBlOiAnY29tYmluZScsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnYW1vdW50JyxcbiAgICAgIGRlZmF1bHQ6IDEsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHJldHVybiBfYzAqKDEuMC1hbW91bnQpKyhfYzAqX2MxKSphbW91bnQ7YFxufSxcbntcbiAgbmFtZTogJ2RpZmYnLFxuICB0eXBlOiAnY29tYmluZScsXG4gIGlucHV0czogW1xuXG4gIF0sXG4gIGdsc2w6XG5gICAgcmV0dXJuIHZlYzQoYWJzKF9jMC5yZ2ItX2MxLnJnYiksIG1heChfYzAuYSwgX2MxLmEpKTtgXG59LFxue1xuICBuYW1lOiAnbW9kdWxhdGUnLFxuICB0eXBlOiAnY29tYmluZUNvb3JkJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdhbW91bnQnLFxuICAgICAgZGVmYXVsdDogMC4xLFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICAvLyAgcmV0dXJuIGZyYWN0KHN0KyhfYzAueHktMC41KSphbW91bnQpO1xuICAgcmV0dXJuIF9zdCArIF9jMC54eSphbW91bnQ7YFxufSxcbntcbiAgbmFtZTogJ21vZHVsYXRlU2NhbGUnLFxuICB0eXBlOiAnY29tYmluZUNvb3JkJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdtdWx0aXBsZScsXG4gICAgICBkZWZhdWx0OiAxLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICBkZWZhdWx0OiAxLFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICB2ZWMyIHh5ID0gX3N0IC0gdmVjMigwLjUpO1xuICAgeHkqPSgxLjAvdmVjMihvZmZzZXQgKyBtdWx0aXBsZSpfYzAuciwgb2Zmc2V0ICsgbXVsdGlwbGUqX2MwLmcpKTtcbiAgIHh5Kz12ZWMyKDAuNSk7XG4gICByZXR1cm4geHk7YFxufSxcbntcbiAgbmFtZTogJ21vZHVsYXRlUGl4ZWxhdGUnLFxuICB0eXBlOiAnY29tYmluZUNvb3JkJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdtdWx0aXBsZScsXG4gICAgICBkZWZhdWx0OiAxMCxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgZGVmYXVsdDogMyxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgdmVjMiB4eSA9IHZlYzIob2Zmc2V0ICsgX2MwLngqbXVsdGlwbGUsIG9mZnNldCArIF9jMC55Km11bHRpcGxlKTtcbiAgIHJldHVybiAoZmxvb3IoX3N0ICogeHkpICsgMC41KS94eTtgXG59LFxue1xuICBuYW1lOiAnbW9kdWxhdGVSb3RhdGUnLFxuICB0eXBlOiAnY29tYmluZUNvb3JkJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdtdWx0aXBsZScsXG4gICAgICBkZWZhdWx0OiAxLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICB2ZWMyIHh5ID0gX3N0IC0gdmVjMigwLjUpO1xuICAgZmxvYXQgYW5nbGUgPSBvZmZzZXQgKyBfYzAueCAqIG11bHRpcGxlO1xuICAgeHkgPSBtYXQyKGNvcyhhbmdsZSksLXNpbihhbmdsZSksIHNpbihhbmdsZSksY29zKGFuZ2xlKSkqeHk7XG4gICB4eSArPSAwLjU7XG4gICByZXR1cm4geHk7YFxufSxcbntcbiAgbmFtZTogJ21vZHVsYXRlSHVlJyxcbiAgdHlwZTogJ2NvbWJpbmVDb29yZCcsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnYW1vdW50JyxcbiAgICAgIGRlZmF1bHQ6IDEsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHJldHVybiBfc3QgKyAodmVjMihfYzAuZyAtIF9jMC5yLCBfYzAuYiAtIF9jMC5nKSAqIGFtb3VudCAqIDEuMC9yZXNvbHV0aW9uKTtgXG59LFxue1xuICBuYW1lOiAnaW52ZXJ0JyxcbiAgdHlwZTogJ2NvbG9yJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdhbW91bnQnLFxuICAgICAgZGVmYXVsdDogMSxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgcmV0dXJuIHZlYzQoKDEuMC1fYzAucmdiKSphbW91bnQgKyBfYzAucmdiKigxLjAtYW1vdW50KSwgX2MwLmEpO2Bcbn0sXG57XG4gIG5hbWU6ICdjb250cmFzdCcsXG4gIHR5cGU6ICdjb2xvcicsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnYW1vdW50JyxcbiAgICAgIGRlZmF1bHQ6IDEuNixcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgdmVjNCBjID0gKF9jMC12ZWM0KDAuNSkpKnZlYzQoYW1vdW50KSArIHZlYzQoMC41KTtcbiAgIHJldHVybiB2ZWM0KGMucmdiLCBfYzAuYSk7YFxufSxcbntcbiAgbmFtZTogJ2JyaWdodG5lc3MnLFxuICB0eXBlOiAnY29sb3InLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ2Ftb3VudCcsXG4gICAgICBkZWZhdWx0OiAwLjQsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHJldHVybiB2ZWM0KF9jMC5yZ2IgKyB2ZWMzKGFtb3VudCksIF9jMC5hKTtgXG59LFxue1xuICBuYW1lOiAnbWFzaycsXG4gIHR5cGU6ICdjb21iaW5lJyxcbiAgaW5wdXRzOiBbXG5cbiAgXSxcbiAgZ2xzbDpcbmAgICBmbG9hdCBhID0gX2x1bWluYW5jZShfYzEucmdiKTtcbiAgIHJldHVybiB2ZWM0KF9jMC5yZ2IqYSwgYSk7YFxufSxcbntcbiAgbmFtZTogJ2x1bWEnLFxuICB0eXBlOiAnY29sb3InLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3RocmVzaG9sZCcsXG4gICAgICBkZWZhdWx0OiAwLjUsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAndG9sZXJhbmNlJyxcbiAgICAgIGRlZmF1bHQ6IDAuMSxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgZmxvYXQgYSA9IHNtb290aHN0ZXAodGhyZXNob2xkLXRvbGVyYW5jZSwgdGhyZXNob2xkK3RvbGVyYW5jZSwgX2x1bWluYW5jZShfYzAucmdiKSk7XG4gICByZXR1cm4gdmVjNChfYzAucmdiKmEsIGEpO2Bcbn0sXG57XG4gIG5hbWU6ICd0aHJlc2gnLFxuICB0eXBlOiAnY29sb3InLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3RocmVzaG9sZCcsXG4gICAgICBkZWZhdWx0OiAwLjUsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAndG9sZXJhbmNlJyxcbiAgICAgIGRlZmF1bHQ6IDAuMDQsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHJldHVybiB2ZWM0KHZlYzMoc21vb3Roc3RlcCh0aHJlc2hvbGQtdG9sZXJhbmNlLCB0aHJlc2hvbGQrdG9sZXJhbmNlLCBfbHVtaW5hbmNlKF9jMC5yZ2IpKSksIF9jMC5hKTtgXG59LFxue1xuICBuYW1lOiAnY29sb3InLFxuICB0eXBlOiAnY29sb3InLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3InLFxuICAgICAgZGVmYXVsdDogMSxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdnJyxcbiAgICAgIGRlZmF1bHQ6IDEsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnYicsXG4gICAgICBkZWZhdWx0OiAxLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ2EnLFxuICAgICAgZGVmYXVsdDogMSxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgdmVjNCBjID0gdmVjNChyLCBnLCBiLCBhKTtcbiAgIHZlYzQgcG9zID0gc3RlcCgwLjAsIGMpOyAvLyBkZXRlY3Qgd2hldGhlciBuZWdhdGl2ZVxuICAgLy8gaWYgPiAwLCByZXR1cm4gciAqIF9jMFxuICAgLy8gaWYgPCAwIHJldHVybiAoMS4wLXIpICogX2MwXG4gICByZXR1cm4gdmVjNChtaXgoKDEuMC1fYzApKmFicyhjKSwgYypfYzAsIHBvcykpO2Bcbn0sXG57XG4gIG5hbWU6ICdzYXR1cmF0ZScsXG4gIHR5cGU6ICdjb2xvcicsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnYW1vdW50JyxcbiAgICAgIGRlZmF1bHQ6IDIsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIGNvbnN0IHZlYzMgVyA9IHZlYzMoMC4yMTI1LCAwLjcxNTQsIDAuMDcyMSk7XG4gICB2ZWMzIGludGVuc2l0eSA9IHZlYzMoZG90KF9jMC5yZ2IsIFcpKTtcbiAgIHJldHVybiB2ZWM0KG1peChpbnRlbnNpdHksIF9jMC5yZ2IsIGFtb3VudCksIF9jMC5hKTtgXG59LFxue1xuICBuYW1lOiAnaHVlJyxcbiAgdHlwZTogJ2NvbG9yJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdodWUnLFxuICAgICAgZGVmYXVsdDogMC40LFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICB2ZWMzIGMgPSBfcmdiVG9Ic3YoX2MwLnJnYik7XG4gICBjLnIgKz0gaHVlO1xuICAgLy8gIGMuciA9IGZyYWN0KGMucik7XG4gICByZXR1cm4gdmVjNChfaHN2VG9SZ2IoYyksIF9jMC5hKTtgXG59LFxue1xuICBuYW1lOiAnY29sb3JhbWEnLFxuICB0eXBlOiAnY29sb3InLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ2Ftb3VudCcsXG4gICAgICBkZWZhdWx0OiAwLjAwNSxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgdmVjMyBjID0gX3JnYlRvSHN2KF9jMC5yZ2IpO1xuICAgYyArPSB2ZWMzKGFtb3VudCk7XG4gICBjID0gX2hzdlRvUmdiKGMpO1xuICAgYyA9IGZyYWN0KGMpO1xuICAgcmV0dXJuIHZlYzQoYywgX2MwLmEpO2Bcbn0sXG57XG4gIG5hbWU6ICdwcmV2JyxcbiAgdHlwZTogJ3NyYycsXG4gIGlucHV0czogW1xuXG4gIF0sXG4gIGdsc2w6XG5gICAgcmV0dXJuIHRleHR1cmUyRChwcmV2QnVmZmVyLCBmcmFjdChfc3QpKTtgXG59LFxue1xuICBuYW1lOiAnc3VtJyxcbiAgdHlwZTogJ2NvbG9yJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ3ZlYzQnLFxuICAgICAgbmFtZTogJ3NjYWxlJyxcbiAgICAgIGRlZmF1bHQ6IDEsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHZlYzQgdiA9IF9jMCAqIHM7XG4gICByZXR1cm4gdi5yICsgdi5nICsgdi5iICsgdi5hO1xuICAgfVxuICAgZmxvYXQgc3VtKHZlYzIgX3N0LCB2ZWM0IHMpIHsgLy8gdmVjNCBpcyBub3QgYSB0eXBvLCBiZWNhdXNlIGFyZ3VtZW50IHR5cGUgaXMgbm90IG92ZXJsb2FkZWRcbiAgIHZlYzIgdiA9IF9zdC54eSAqIHMueHk7XG4gICByZXR1cm4gdi54ICsgdi55O2Bcbn0sXG57XG4gIG5hbWU6ICdyJyxcbiAgdHlwZTogJ2NvbG9yJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdzY2FsZScsXG4gICAgICBkZWZhdWx0OiAxLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICByZXR1cm4gdmVjNChfYzAuciAqIHNjYWxlICsgb2Zmc2V0KTtgXG59LFxue1xuICBuYW1lOiAnZycsXG4gIHR5cGU6ICdjb2xvcicsXG4gIGlucHV0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnc2NhbGUnLFxuICAgICAgZGVmYXVsdDogMSxcbiAgICB9LFxue1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgZGVmYXVsdDogMCxcbiAgICB9XG4gIF0sXG4gIGdsc2w6XG5gICAgcmV0dXJuIHZlYzQoX2MwLmcgKiBzY2FsZSArIG9mZnNldCk7YFxufSxcbntcbiAgbmFtZTogJ2InLFxuICB0eXBlOiAnY29sb3InLFxuICBpbnB1dHM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ3NjYWxlJyxcbiAgICAgIGRlZmF1bHQ6IDEsXG4gICAgfSxcbntcbiAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgfVxuICBdLFxuICBnbHNsOlxuYCAgIHJldHVybiB2ZWM0KF9jMC5iICogc2NhbGUgKyBvZmZzZXQpO2Bcbn0sXG57XG4gIG5hbWU6ICdhJyxcbiAgdHlwZTogJ2NvbG9yJyxcbiAgaW5wdXRzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgIG5hbWU6ICdzY2FsZScsXG4gICAgICBkZWZhdWx0OiAxLFxuICAgIH0sXG57XG4gICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgIH1cbiAgXSxcbiAgZ2xzbDpcbmAgICByZXR1cm4gdmVjNChfYzAuYSAqIHNjYWxlICsgb2Zmc2V0KTtgXG59XG5dXG4iLCIvLyBmdW5jdGlvbnMgdGhhdCBhcmUgb25seSB1c2VkIHdpdGhpbiBvdGhlciBmdW5jdGlvbnNcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIF9sdW1pbmFuY2U6IHtcbiAgICB0eXBlOiAndXRpbCcsXG4gICAgZ2xzbDogYGZsb2F0IF9sdW1pbmFuY2UodmVjMyByZ2Ipe1xuICAgICAgY29uc3QgdmVjMyBXID0gdmVjMygwLjIxMjUsIDAuNzE1NCwgMC4wNzIxKTtcbiAgICAgIHJldHVybiBkb3QocmdiLCBXKTtcbiAgICB9YFxuICB9LFxuICBfbm9pc2U6IHtcbiAgICB0eXBlOiAndXRpbCcsXG4gICAgZ2xzbDogYFxuICAgIC8vXHRTaW1wbGV4IDNEIE5vaXNlXG4gICAgLy9cdGJ5IElhbiBNY0V3YW4sIEFzaGltYSBBcnRzXG4gICAgdmVjNCBwZXJtdXRlKHZlYzQgeCl7cmV0dXJuIG1vZCgoKHgqMzQuMCkrMS4wKSp4LCAyODkuMCk7fVxuICB2ZWM0IHRheWxvckludlNxcnQodmVjNCByKXtyZXR1cm4gMS43OTI4NDI5MTQwMDE1OSAtIDAuODUzNzM0NzIwOTUzMTQgKiByO31cblxuICBmbG9hdCBfbm9pc2UodmVjMyB2KXtcbiAgICBjb25zdCB2ZWMyICBDID0gdmVjMigxLjAvNi4wLCAxLjAvMy4wKSA7XG4gICAgY29uc3QgdmVjNCAgRCA9IHZlYzQoMC4wLCAwLjUsIDEuMCwgMi4wKTtcblxuICAvLyBGaXJzdCBjb3JuZXJcbiAgICB2ZWMzIGkgID0gZmxvb3IodiArIGRvdCh2LCBDLnl5eSkgKTtcbiAgICB2ZWMzIHgwID0gICB2IC0gaSArIGRvdChpLCBDLnh4eCkgO1xuXG4gIC8vIE90aGVyIGNvcm5lcnNcbiAgICB2ZWMzIGcgPSBzdGVwKHgwLnl6eCwgeDAueHl6KTtcbiAgICB2ZWMzIGwgPSAxLjAgLSBnO1xuICAgIHZlYzMgaTEgPSBtaW4oIGcueHl6LCBsLnp4eSApO1xuICAgIHZlYzMgaTIgPSBtYXgoIGcueHl6LCBsLnp4eSApO1xuXG4gICAgLy8gIHgwID0geDAgLSAwLiArIDAuMCAqIENcbiAgICB2ZWMzIHgxID0geDAgLSBpMSArIDEuMCAqIEMueHh4O1xuICAgIHZlYzMgeDIgPSB4MCAtIGkyICsgMi4wICogQy54eHg7XG4gICAgdmVjMyB4MyA9IHgwIC0gMS4gKyAzLjAgKiBDLnh4eDtcblxuICAvLyBQZXJtdXRhdGlvbnNcbiAgICBpID0gbW9kKGksIDI4OS4wICk7XG4gICAgdmVjNCBwID0gcGVybXV0ZSggcGVybXV0ZSggcGVybXV0ZShcbiAgICAgICAgICAgICAgIGkueiArIHZlYzQoMC4wLCBpMS56LCBpMi56LCAxLjAgKSlcbiAgICAgICAgICAgICArIGkueSArIHZlYzQoMC4wLCBpMS55LCBpMi55LCAxLjAgKSlcbiAgICAgICAgICAgICArIGkueCArIHZlYzQoMC4wLCBpMS54LCBpMi54LCAxLjAgKSk7XG5cbiAgLy8gR3JhZGllbnRzXG4gIC8vICggTipOIHBvaW50cyB1bmlmb3JtbHkgb3ZlciBhIHNxdWFyZSwgbWFwcGVkIG9udG8gYW4gb2N0YWhlZHJvbi4pXG4gICAgZmxvYXQgbl8gPSAxLjAvNy4wOyAvLyBOPTdcbiAgICB2ZWMzICBucyA9IG5fICogRC53eXogLSBELnh6eDtcblxuICAgIHZlYzQgaiA9IHAgLSA0OS4wICogZmxvb3IocCAqIG5zLnogKm5zLnopOyAgLy8gIG1vZChwLE4qTilcblxuICAgIHZlYzQgeF8gPSBmbG9vcihqICogbnMueik7XG4gICAgdmVjNCB5XyA9IGZsb29yKGogLSA3LjAgKiB4XyApOyAgICAvLyBtb2QoaixOKVxuXG4gICAgdmVjNCB4ID0geF8gKm5zLnggKyBucy55eXl5O1xuICAgIHZlYzQgeSA9IHlfICpucy54ICsgbnMueXl5eTtcbiAgICB2ZWM0IGggPSAxLjAgLSBhYnMoeCkgLSBhYnMoeSk7XG5cbiAgICB2ZWM0IGIwID0gdmVjNCggeC54eSwgeS54eSApO1xuICAgIHZlYzQgYjEgPSB2ZWM0KCB4Lnp3LCB5Lnp3ICk7XG5cbiAgICB2ZWM0IHMwID0gZmxvb3IoYjApKjIuMCArIDEuMDtcbiAgICB2ZWM0IHMxID0gZmxvb3IoYjEpKjIuMCArIDEuMDtcbiAgICB2ZWM0IHNoID0gLXN0ZXAoaCwgdmVjNCgwLjApKTtcblxuICAgIHZlYzQgYTAgPSBiMC54enl3ICsgczAueHp5dypzaC54eHl5IDtcbiAgICB2ZWM0IGExID0gYjEueHp5dyArIHMxLnh6eXcqc2guenp3dyA7XG5cbiAgICB2ZWMzIHAwID0gdmVjMyhhMC54eSxoLngpO1xuICAgIHZlYzMgcDEgPSB2ZWMzKGEwLnp3LGgueSk7XG4gICAgdmVjMyBwMiA9IHZlYzMoYTEueHksaC56KTtcbiAgICB2ZWMzIHAzID0gdmVjMyhhMS56dyxoLncpO1xuXG4gIC8vTm9ybWFsaXNlIGdyYWRpZW50c1xuICAgIHZlYzQgbm9ybSA9IHRheWxvckludlNxcnQodmVjNChkb3QocDAscDApLCBkb3QocDEscDEpLCBkb3QocDIsIHAyKSwgZG90KHAzLHAzKSkpO1xuICAgIHAwICo9IG5vcm0ueDtcbiAgICBwMSAqPSBub3JtLnk7XG4gICAgcDIgKj0gbm9ybS56O1xuICAgIHAzICo9IG5vcm0udztcblxuICAvLyBNaXggZmluYWwgbm9pc2UgdmFsdWVcbiAgICB2ZWM0IG0gPSBtYXgoMC42IC0gdmVjNChkb3QoeDAseDApLCBkb3QoeDEseDEpLCBkb3QoeDIseDIpLCBkb3QoeDMseDMpKSwgMC4wKTtcbiAgICBtID0gbSAqIG07XG4gICAgcmV0dXJuIDQyLjAgKiBkb3QoIG0qbSwgdmVjNCggZG90KHAwLHgwKSwgZG90KHAxLHgxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3QocDIseDIpLCBkb3QocDMseDMpICkgKTtcbiAgfVxuICAgIGBcbiAgfSxcblxuXG4gIF9yZ2JUb0hzdjoge1xuICAgIHR5cGU6ICd1dGlsJyxcbiAgICBnbHNsOiBgdmVjMyBfcmdiVG9Ic3YodmVjMyBjKXtcbiAgICAgICAgICAgIHZlYzQgSyA9IHZlYzQoMC4wLCAtMS4wIC8gMy4wLCAyLjAgLyAzLjAsIC0xLjApO1xuICAgICAgICAgICAgdmVjNCBwID0gbWl4KHZlYzQoYy5iZywgSy53eiksIHZlYzQoYy5nYiwgSy54eSksIHN0ZXAoYy5iLCBjLmcpKTtcbiAgICAgICAgICAgIHZlYzQgcSA9IG1peCh2ZWM0KHAueHl3LCBjLnIpLCB2ZWM0KGMuciwgcC55engpLCBzdGVwKHAueCwgYy5yKSk7XG5cbiAgICAgICAgICAgIGZsb2F0IGQgPSBxLnggLSBtaW4ocS53LCBxLnkpO1xuICAgICAgICAgICAgZmxvYXQgZSA9IDEuMGUtMTA7XG4gICAgICAgICAgICByZXR1cm4gdmVjMyhhYnMocS56ICsgKHEudyAtIHEueSkgLyAoNi4wICogZCArIGUpKSwgZCAvIChxLnggKyBlKSwgcS54KTtcbiAgICAgICAgfWBcbiAgfSxcbiAgX2hzdlRvUmdiOiB7XG4gICAgdHlwZTogJ3V0aWwnLFxuICAgIGdsc2w6IGB2ZWMzIF9oc3ZUb1JnYih2ZWMzIGMpe1xuICAgICAgICB2ZWM0IEsgPSB2ZWM0KDEuMCwgMi4wIC8gMy4wLCAxLjAgLyAzLjAsIDMuMCk7XG4gICAgICAgIHZlYzMgcCA9IGFicyhmcmFjdChjLnh4eCArIEsueHl6KSAqIDYuMCAtIEsud3d3KTtcbiAgICAgICAgcmV0dXJuIGMueiAqIG1peChLLnh4eCwgY2xhbXAocCAtIEsueHh4LCAwLjAsIDEuMCksIGMueSk7XG4gICAgfWBcbiAgfVxufVxuIiwiY29uc3QgV2ViY2FtID0gcmVxdWlyZSgnLi9saWIvd2ViY2FtLmpzJylcbmNvbnN0IFNjcmVlbiA9IHJlcXVpcmUoJy4vbGliL3NjcmVlbm1lZGlhLmpzJylcblxuY2xhc3MgSHlkcmFTb3VyY2Uge1xuICBjb25zdHJ1Y3RvciAoeyByZWdsLCB3aWR0aCwgaGVpZ2h0LCBwYiwgbGFiZWwgPSBcIlwifSkge1xuICAgIHRoaXMubGFiZWwgPSBsYWJlbFxuICAgIHRoaXMucmVnbCA9IHJlZ2xcbiAgICB0aGlzLnNyYyA9IG51bGxcbiAgICB0aGlzLmR5bmFtaWMgPSB0cnVlXG4gICAgdGhpcy53aWR0aCA9IHdpZHRoXG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHRcbiAgICB0aGlzLnRleCA9IHRoaXMucmVnbC50ZXh0dXJlKHtcbiAgICAgIC8vICBzaGFwZTogW3dpZHRoLCBoZWlnaHRdXG4gICAgICBzaGFwZTogWyAxLCAxIF1cbiAgICB9KVxuICAgIHRoaXMucGIgPSBwYlxuICB9XG5cbiAgaW5pdCAob3B0cykge1xuICAgIGlmIChvcHRzLnNyYykge1xuICAgICAgdGhpcy5zcmMgPSBvcHRzLnNyY1xuICAgICAgdGhpcy50ZXggPSB0aGlzLnJlZ2wudGV4dHVyZSh0aGlzLnNyYylcbiAgICB9XG4gICAgaWYgKG9wdHMuZHluYW1pYykgdGhpcy5keW5hbWljID0gb3B0cy5keW5hbWljXG4gIH1cblxuICBpbml0Q2FtIChpbmRleCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgV2ViY2FtKGluZGV4KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBzZWxmLnNyYyA9IHJlc3BvbnNlLnZpZGVvXG4gICAgICAgIHNlbGYuZHluYW1pYyA9IHRydWVcbiAgICAgICAgc2VsZi50ZXggPSBzZWxmLnJlZ2wudGV4dHVyZShzZWxmLnNyYylcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IGNvbnNvbGUubG9nKCdjb3VsZCBub3QgZ2V0IGNhbWVyYScsIGVycikpXG4gIH1cblxuICBpbml0VmlkZW8gKHVybCA9ICcnKSB7XG4gICAgLy8gY29uc3Qgc2VsZiA9IHRoaXNcbiAgICBjb25zdCB2aWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpXG4gICAgdmlkLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cydcbiAgICB2aWQuYXV0b3BsYXkgPSB0cnVlXG4gICAgdmlkLmxvb3AgPSB0cnVlXG4gICAgdmlkLm11dGVkID0gdHJ1ZSAvLyBtdXRlIGluIG9yZGVyIHRvIGxvYWQgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uXG4gICAgdmlkLmFkZEV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCAoKSA9PiB7XG4gICAgICB0aGlzLnNyYyA9IHZpZFxuICAgICAgdmlkLnBsYXkoKVxuICAgICAgdGhpcy50ZXggPSB0aGlzLnJlZ2wudGV4dHVyZSh0aGlzLnNyYylcbiAgICAgIHRoaXMuZHluYW1pYyA9IHRydWVcbiAgICB9KVxuICAgIHZpZC5zcmMgPSB1cmxcbiAgfVxuXG4gIGluaXRJbWFnZSAodXJsID0gJycpIHtcbiAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKVxuICAgIGltZy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnXG4gICAgaW1nLnNyYyA9IHVybFxuICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNyYyA9IGltZ1xuICAgICAgdGhpcy5keW5hbWljID0gZmFsc2VcbiAgICAgIHRoaXMudGV4ID0gdGhpcy5yZWdsLnRleHR1cmUodGhpcy5zcmMpXG4gICAgfVxuICB9XG5cbiAgaW5pdFN0cmVhbSAoc3RyZWFtTmFtZSkge1xuICAgIC8vICBjb25zb2xlLmxvZyhcImluaXRpbmcgc3RyZWFtIVwiLCBzdHJlYW1OYW1lKVxuICAgIGxldCBzZWxmID0gdGhpc1xuICAgIGlmIChzdHJlYW1OYW1lICYmIHRoaXMucGIpIHtcbiAgICAgIHRoaXMucGIuaW5pdFNvdXJjZShzdHJlYW1OYW1lKVxuXG4gICAgICB0aGlzLnBiLm9uKCdnb3QgdmlkZW8nLCBmdW5jdGlvbiAobmljaywgdmlkZW8pIHtcbiAgICAgICAgaWYgKG5pY2sgPT09IHN0cmVhbU5hbWUpIHtcbiAgICAgICAgICBzZWxmLnNyYyA9IHZpZGVvXG4gICAgICAgICAgc2VsZi5keW5hbWljID0gdHJ1ZVxuICAgICAgICAgIHNlbGYudGV4ID0gc2VsZi5yZWdsLnRleHR1cmUoc2VsZi5zcmMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaW5pdFNjcmVlbiAoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICBTY3JlZW4oKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHNlbGYuc3JjID0gcmVzcG9uc2UudmlkZW9cbiAgICAgICAgc2VsZi50ZXggPSBzZWxmLnJlZ2wudGV4dHVyZShzZWxmLnNyYylcbiAgICAgICAgc2VsZi5keW5hbWljID0gdHJ1ZVxuICAgICAgICAvLyAgY29uc29sZS5sb2coXCJyZWNlaXZlZCBzY3JlZW4gaW5wdXRcIilcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IGNvbnNvbGUubG9nKCdjb3VsZCBub3QgZ2V0IHNjcmVlbicsIGVycikpXG4gIH1cblxuICByZXNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLndpZHRoID0gd2lkdGhcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodFxuICB9XG5cbiAgY2xlYXIgKCkge1xuICAgIGlmICh0aGlzLnNyYyAmJiB0aGlzLnNyYy5zcmNPYmplY3QpIHtcbiAgICAgIGlmICh0aGlzLnNyYy5zcmNPYmplY3QuZ2V0VHJhY2tzKSB7XG4gICAgICAgIHRoaXMuc3JjLnNyY09iamVjdC5nZXRUcmFja3MoKS5mb3JFYWNoKHRyYWNrID0+IHRyYWNrLnN0b3AoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zcmMgPSBudWxsXG4gICAgdGhpcy50ZXggPSB0aGlzLnJlZ2wudGV4dHVyZSh7IHNoYXBlOiBbIDEsIDEgXSB9KVxuICB9XG5cbiAgdGljayAodGltZSkge1xuICAgIC8vICBjb25zb2xlLmxvZyh0aGlzLnNyYywgdGhpcy50ZXgud2lkdGgsIHRoaXMudGV4LmhlaWdodClcbiAgICBpZiAodGhpcy5zcmMgIT09IG51bGwgJiYgdGhpcy5keW5hbWljID09PSB0cnVlKSB7XG4gICAgICBpZiAodGhpcy5zcmMudmlkZW9XaWR0aCAmJiB0aGlzLnNyYy52aWRlb1dpZHRoICE9PSB0aGlzLnRleC53aWR0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICB0aGlzLnNyYy52aWRlb1dpZHRoLFxuICAgICAgICAgIHRoaXMuc3JjLnZpZGVvSGVpZ2h0LFxuICAgICAgICAgIHRoaXMudGV4LndpZHRoLFxuICAgICAgICAgIHRoaXMudGV4LmhlaWdodFxuICAgICAgICApXG4gICAgICAgIHRoaXMudGV4LnJlc2l6ZSh0aGlzLnNyYy52aWRlb1dpZHRoLCB0aGlzLnNyYy52aWRlb0hlaWdodClcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3JjLndpZHRoICYmIHRoaXMuc3JjLndpZHRoICE9PSB0aGlzLnRleC53aWR0aCkge1xuICAgICAgICB0aGlzLnRleC5yZXNpemUodGhpcy5zcmMud2lkdGgsIHRoaXMuc3JjLmhlaWdodClcbiAgICAgIH1cblxuICAgICAgdGhpcy50ZXguc3ViaW1hZ2UodGhpcy5zcmMpXG4gICAgfVxuICB9XG5cbiAgZ2V0VGV4dHVyZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBIeWRyYVNvdXJjZVxuIiwiLy8gV0lQIHV0aWxzIGZvciB3b3JraW5nIHdpdGggYXJyYXlzXG4vLyBQb3NzaWJseSBzaG91bGQgYmUgaW50ZWdyYXRlZCB3aXRoIGxmbyBleHRlbnNpb24sIGV0Yy5cbi8vIHRvIGRvOiB0cmFuc2Zvcm0gdGltZSByYXRoZXIgdGhhbiBhcnJheSB2YWx1ZXMsIHNpbWlsYXIgdG8gd29ya2luZyB3aXRoIGNvb3JkaW5hdGVzIGluIGh5ZHJhXG5cbnZhciBlYXNpbmcgPSByZXF1aXJlKCcuL2Vhc2luZy1mdW5jdGlvbnMuanMnKVxuXG52YXIgbWFwID0gKG51bSwgaW5fbWluLCBpbl9tYXgsIG91dF9taW4sIG91dF9tYXgpID0+IHtcbiAgcmV0dXJuIChudW0gLSBpbl9taW4pICogKG91dF9tYXggLSBvdXRfbWluKSAvIChpbl9tYXggLSBpbl9taW4pICsgb3V0X21pbjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGluaXQ6ICgpID0+IHtcblxuICAgIEFycmF5LnByb3RvdHlwZS5mYXN0ID0gZnVuY3Rpb24oc3BlZWQgPSAxKSB7XG4gICAgICB0aGlzLl9zcGVlZCA9IHNwZWVkXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIEFycmF5LnByb3RvdHlwZS5zbW9vdGggPSBmdW5jdGlvbihzbW9vdGggPSAxKSB7XG4gICAgICB0aGlzLl9zbW9vdGggPSBzbW9vdGhcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmVhc2UgPSBmdW5jdGlvbihlYXNlID0gJ2xpbmVhcicpIHtcbiAgICAgIGlmICh0eXBlb2YgZWFzZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuX3Ntb290aCA9IDFcbiAgICAgICAgdGhpcy5fZWFzZSA9IGVhc2VcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGVhc2luZ1tlYXNlXSl7XG4gICAgICAgIHRoaXMuX3Ntb290aCA9IDFcbiAgICAgICAgdGhpcy5fZWFzZSA9IGVhc2luZ1tlYXNlXVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBBcnJheS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24ob2Zmc2V0ID0gMC41KSB7XG4gICAgICB0aGlzLl9vZmZzZXQgPSBvZmZzZXQlMS4wXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8vIEFycmF5LnByb3RvdHlwZS5ib3VuY2UgPSBmdW5jdGlvbigpIHtcbiAgICAvLyAgIHRoaXMubW9kaWZpZXJzLmJvdW5jZSA9IHRydWVcbiAgICAvLyAgIHJldHVybiB0aGlzXG4gICAgLy8gfVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZpdCA9IGZ1bmN0aW9uKGxvdyA9IDAsIGhpZ2ggPTEpIHtcbiAgICAgIGxldCBsb3dlc3QgPSBNYXRoLm1pbiguLi50aGlzKVxuICAgICAgbGV0IGhpZ2hlc3QgPSAgTWF0aC5tYXgoLi4udGhpcylcbiAgICAgIHZhciBuZXdBcnIgPSB0aGlzLm1hcCgobnVtKSA9PiBtYXAobnVtLCBsb3dlc3QsIGhpZ2hlc3QsIGxvdywgaGlnaCkpXG4gICAgICBuZXdBcnIuX3NwZWVkID0gdGhpcy5fc3BlZWRcbiAgICAgIG5ld0Fyci5fc21vb3RoID0gdGhpcy5fc21vb3RoXG4gICAgICBuZXdBcnIuX2Vhc2UgPSB0aGlzLl9lYXNlXG4gICAgICByZXR1cm4gbmV3QXJyXG4gICAgfVxuICB9LFxuXG4gIGdldFZhbHVlOiAoYXJyID0gW10pID0+ICh7dGltZSwgYnBtfSkgPT57XG4gICAgbGV0IHNwZWVkID0gYXJyLl9zcGVlZCA/IGFyci5fc3BlZWQgOiAxXG4gICAgbGV0IHNtb290aCA9IGFyci5fc21vb3RoID8gYXJyLl9zbW9vdGggOiAwXG4gICAgbGV0IGluZGV4ID0gdGltZSAqIHNwZWVkICogKGJwbSAvIDYwKSArIChhcnIuX29mZnNldCB8fCAwKVxuXG4gICAgaWYgKHNtb290aCE9PTApIHtcbiAgICAgIGxldCBlYXNlID0gYXJyLl9lYXNlID8gYXJyLl9lYXNlIDogZWFzaW5nWydsaW5lYXInXVxuICAgICAgbGV0IF9pbmRleCA9IGluZGV4IC0gKHNtb290aCAvIDIpXG4gICAgICBsZXQgY3VyclZhbHVlID0gYXJyW01hdGguZmxvb3IoX2luZGV4ICUgKGFyci5sZW5ndGgpKV1cbiAgICAgIGxldCBuZXh0VmFsdWUgPSBhcnJbTWF0aC5mbG9vcigoX2luZGV4ICsgMSkgJSAoYXJyLmxlbmd0aCkpXVxuICAgICAgbGV0IHQgPSBNYXRoLm1pbigoX2luZGV4JTEpL3Ntb290aCwxKVxuICAgICAgcmV0dXJuIGVhc2UodCkgKiAobmV4dFZhbHVlIC0gY3VyclZhbHVlKSArIGN1cnJWYWx1ZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBhcnJbTWF0aC5mbG9vcihpbmRleCAlIChhcnIubGVuZ3RoKSldXG4gICAgfVxuICB9XG59XG4iLCJjb25zdCBNZXlkYSA9IHJlcXVpcmUoJ21leWRhJylcblxuY2xhc3MgQXVkaW8ge1xuICBjb25zdHJ1Y3RvciAoe1xuICAgIG51bUJpbnMgPSA0LFxuICAgIGN1dG9mZiA9IDIsXG4gICAgc21vb3RoID0gMC40LFxuICAgIG1heCA9IDE1LFxuICAgIHNjYWxlID0gMTAsXG4gICAgaXNEcmF3aW5nID0gZmFsc2VcbiAgfSkge1xuICAgIHRoaXMudm9sID0gMFxuICAgIHRoaXMuc2NhbGUgPSBzY2FsZVxuICAgIHRoaXMubWF4ID0gbWF4XG4gICAgdGhpcy5jdXRvZmYgPSBjdXRvZmZcbiAgICB0aGlzLnNtb290aCA9IHNtb290aFxuICAgIHRoaXMuc2V0QmlucyhudW1CaW5zKVxuXG4gICAgLy8gYmVhdCBkZXRlY3Rpb24gZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3RoZXJld2FzYWd1eS9wNS1tdXNpYy12aXovYmxvYi9naC1wYWdlcy9kZW1vcy8wMWRfYmVhdF9kZXRlY3RfYW1wbGl0dWRlL3NrZXRjaC5qc1xuICAgIHRoaXMuYmVhdCA9IHtcbiAgICAgIGhvbGRGcmFtZXM6IDIwLFxuICAgICAgdGhyZXNob2xkOiA0MCxcbiAgICAgIF9jdXRvZmY6IDAsIC8vIGFkYXB0aXZlIGJhc2VkIG9uIHNvdW5kIHN0YXRlXG4gICAgICBkZWNheTogMC45OCxcbiAgICAgIF9mcmFtZXNTaW5jZUJlYXQ6IDAgLy8ga2VlcHMgdHJhY2sgb2YgZnJhbWVzXG4gICAgfVxuXG4gICAgdGhpcy5vbkJlYXQgPSAoKSA9PiB7XG4gICAgLy8gIGNvbnNvbGUubG9nKFwiYmVhdFwiKVxuICAgIH1cblxuICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IDEwMFxuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IDgwXG4gICAgdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSBcIjEwMHB4XCJcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBcIjgwcHhcIlxuICAgIHRoaXMuY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLnJpZ2h0ID0gJzBweCdcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5ib3R0b20gPSAnMHB4J1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpXG5cbiAgICB0aGlzLmlzRHJhd2luZyA9IGlzRHJhd2luZ1xuICAgIHRoaXMuY3R4ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIHRoaXMuY3R4LmZpbGxTdHlsZT1cIiNERkZGRkZcIlxuICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlPVwiIzBmZlwiXG4gICAgdGhpcy5jdHgubGluZVdpZHRoPTAuNVxuXG4gICAgd2luZG93Lm5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHt2aWRlbzogZmFsc2UsIGF1ZGlvOiB0cnVlfSlcbiAgICAgIC50aGVuKChzdHJlYW0pID0+IHtcbiAgICAgIC8vICBjb25zb2xlLmxvZygnZ290IG1pYyBzdHJlYW0nLCBzdHJlYW0pXG4gICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtXG4gICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBBdWRpb0NvbnRleHQoKVxuICAgICAgICAvLyAgdGhpcy5jb250ZXh0ID0gbmV3IEF1ZGlvQ29udGV4dCgpXG4gICAgICAgIGxldCBhdWRpb19zdHJlYW0gPSB0aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2Uoc3RyZWFtKVxuXG4gICAgICAvLyAgY29uc29sZS5sb2codGhpcy5jb250ZXh0KVxuICAgICAgICB0aGlzLm1leWRhID0gTWV5ZGEuY3JlYXRlTWV5ZGFBbmFseXplcih7XG4gICAgICAgICAgYXVkaW9Db250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgICAgICAgc291cmNlOiBhdWRpb19zdHJlYW0sXG4gICAgICAgICAgZmVhdHVyZUV4dHJhY3RvcnM6IFtcbiAgICAgICAgICAgICdsb3VkbmVzcycsXG4gICAgICAgICAgICAvLyAgJ3BlcmNlcHR1YWxTcHJlYWQnLFxuICAgICAgICAgICAgLy8gICdwZXJjZXB0dWFsU2hhcnBuZXNzJyxcbiAgICAgICAgICAgIC8vICAnc3BlY3RyYWxDZW50cm9pZCdcbiAgICAgICAgICBdXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUubG9nKCdFUlJPUicsIGVycikpXG4gIH1cblxuICBkZXRlY3RCZWF0IChsZXZlbCkge1xuICAgIC8vY29uc29sZS5sb2cobGV2ZWwsICAgdGhpcy5iZWF0Ll9jdXRvZmYpXG4gICAgaWYgKGxldmVsID4gdGhpcy5iZWF0Ll9jdXRvZmYgJiYgbGV2ZWwgPiB0aGlzLmJlYXQudGhyZXNob2xkKSB7XG4gICAgICB0aGlzLm9uQmVhdCgpXG4gICAgICB0aGlzLmJlYXQuX2N1dG9mZiA9IGxldmVsICoxLjJcbiAgICAgIHRoaXMuYmVhdC5fZnJhbWVzU2luY2VCZWF0ID0gMFxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5iZWF0Ll9mcmFtZXNTaW5jZUJlYXQgPD0gdGhpcy5iZWF0LmhvbGRGcmFtZXMpe1xuICAgICAgICB0aGlzLmJlYXQuX2ZyYW1lc1NpbmNlQmVhdCArKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYmVhdC5fY3V0b2ZmICo9IHRoaXMuYmVhdC5kZWNheVxuICAgICAgICB0aGlzLmJlYXQuX2N1dG9mZiA9IE1hdGgubWF4KCAgdGhpcy5iZWF0Ll9jdXRvZmYsIHRoaXMuYmVhdC50aHJlc2hvbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRpY2soKSB7XG4gICBpZih0aGlzLm1leWRhKXtcbiAgICAgdmFyIGZlYXR1cmVzID0gdGhpcy5tZXlkYS5nZXQoKVxuICAgICBpZihmZWF0dXJlcyAmJiBmZWF0dXJlcyAhPT0gbnVsbCl7XG4gICAgICAgdGhpcy52b2wgPSBmZWF0dXJlcy5sb3VkbmVzcy50b3RhbFxuICAgICAgIHRoaXMuZGV0ZWN0QmVhdCh0aGlzLnZvbClcbiAgICAgICAvLyByZWR1Y2UgbG91ZG5lc3MgYXJyYXkgdG8gbnVtYmVyIG9mIGJpbnNcbiAgICAgICBjb25zdCByZWR1Y2VyID0gKGFjY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+IGFjY3VtdWxhdG9yICsgY3VycmVudFZhbHVlO1xuICAgICAgIGxldCBzcGFjaW5nID0gTWF0aC5mbG9vcihmZWF0dXJlcy5sb3VkbmVzcy5zcGVjaWZpYy5sZW5ndGgvdGhpcy5iaW5zLmxlbmd0aClcbiAgICAgICB0aGlzLnByZXZCaW5zID0gdGhpcy5iaW5zLnNsaWNlKDApXG4gICAgICAgdGhpcy5iaW5zID0gdGhpcy5iaW5zLm1hcCgoYmluLCBpbmRleCkgPT4ge1xuICAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmxvdWRuZXNzLnNwZWNpZmljLnNsaWNlKGluZGV4ICogc3BhY2luZywgKGluZGV4ICsgMSkqc3BhY2luZykucmVkdWNlKHJlZHVjZXIpXG4gICAgICAgfSkubWFwKChiaW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAvLyBtYXAgdG8gc3BlY2lmaWVkIHJhbmdlXG5cbiAgICAgICAgLy8gcmV0dXJuIChiaW4gKiAoMS4wIC0gdGhpcy5zbW9vdGgpICsgdGhpcy5wcmV2Qmluc1tpbmRleF0gKiB0aGlzLnNtb290aClcbiAgICAgICAgICByZXR1cm4gKGJpbiAqICgxLjAgLSB0aGlzLnNldHRpbmdzW2luZGV4XS5zbW9vdGgpICsgdGhpcy5wcmV2Qmluc1tpbmRleF0gKiB0aGlzLnNldHRpbmdzW2luZGV4XS5zbW9vdGgpXG4gICAgICAgfSlcbiAgICAgICAvLyB2YXIgeSA9IHRoaXMuY2FudmFzLmhlaWdodCAtIHNjYWxlKnRoaXMuc2V0dGluZ3NbaW5kZXhdLmN1dG9mZlxuICAgICAgIC8vIHRoaXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgLy8gdGhpcy5jdHgubW92ZVRvKGluZGV4KnNwYWNpbmcsIHkpXG4gICAgICAgLy8gdGhpcy5jdHgubGluZVRvKChpbmRleCsxKSpzcGFjaW5nLCB5KVxuICAgICAgIC8vIHRoaXMuY3R4LnN0cm9rZSgpXG4gICAgICAgLy9cbiAgICAgICAvLyB2YXIgeU1heCA9IHRoaXMuY2FudmFzLmhlaWdodCAtIHNjYWxlKih0aGlzLnNldHRpbmdzW2luZGV4XS5zY2FsZSArIHRoaXMuc2V0dGluZ3NbaW5kZXhdLmN1dG9mZilcbiAgICAgICB0aGlzLmZmdCA9IHRoaXMuYmlucy5tYXAoKGJpbiwgaW5kZXgpID0+IChcbiAgICAgICAgLy8gTWF0aC5tYXgoMCwgKGJpbiAtIHRoaXMuY3V0b2ZmKSAvICh0aGlzLm1heCAtIHRoaXMuY3V0b2ZmKSlcbiAgICAgICAgIE1hdGgubWF4KDAsIChiaW4gLSB0aGlzLnNldHRpbmdzW2luZGV4XS5jdXRvZmYpL3RoaXMuc2V0dGluZ3NbaW5kZXhdLnNjYWxlKVxuICAgICAgICkpXG4gICAgICAgaWYodGhpcy5pc0RyYXdpbmcpIHRoaXMuZHJhdygpXG4gICAgIH1cbiAgIH1cbiAgfVxuXG4gIHNldEN1dG9mZiAoY3V0b2ZmKSB7XG4gICAgdGhpcy5jdXRvZmYgPSBjdXRvZmZcbiAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5zZXR0aW5ncy5tYXAoKGVsKSA9PiB7XG4gICAgICBlbC5jdXRvZmYgPSBjdXRvZmZcbiAgICAgIHJldHVybiBlbFxuICAgIH0pXG4gIH1cblxuICBzZXRTbW9vdGggKHNtb290aCkge1xuICAgIHRoaXMuc21vb3RoID0gc21vb3RoXG4gICAgdGhpcy5zZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MubWFwKChlbCkgPT4ge1xuICAgICAgZWwuc21vb3RoID0gc21vb3RoXG4gICAgICByZXR1cm4gZWxcbiAgICB9KVxuICB9XG5cbiAgc2V0QmlucyAobnVtQmlucykge1xuICAgIHRoaXMuYmlucyA9IEFycmF5KG51bUJpbnMpLmZpbGwoMClcbiAgICB0aGlzLnByZXZCaW5zID0gQXJyYXkobnVtQmlucykuZmlsbCgwKVxuICAgIHRoaXMuZmZ0ID0gQXJyYXkobnVtQmlucykuZmlsbCgwKVxuICAgIHRoaXMuc2V0dGluZ3MgPSBBcnJheShudW1CaW5zKS5maWxsKDApLm1hcCgoKSA9PiAoe1xuICAgICAgY3V0b2ZmOiB0aGlzLmN1dG9mZixcbiAgICAgIHNjYWxlOiB0aGlzLnNjYWxlLFxuICAgICAgc21vb3RoOiB0aGlzLnNtb290aFxuICAgIH0pKVxuICAgIC8vIHRvIGRvOiB3aGF0IHRvIGRvIGluIG5vbi1nbG9iYWwgbW9kZT9cbiAgICB0aGlzLmJpbnMuZm9yRWFjaCgoYmluLCBpbmRleCkgPT4ge1xuICAgICAgd2luZG93WydhJyArIGluZGV4XSA9IChzY2FsZSA9IDEsIG9mZnNldCA9IDApID0+ICgpID0+IChhLmZmdFtpbmRleF0gKiBzY2FsZSArIG9mZnNldClcbiAgICB9KVxuICAvLyAgY29uc29sZS5sb2codGhpcy5zZXR0aW5ncylcbiAgfVxuXG4gIHNldFNjYWxlKHNjYWxlKXtcbiAgICB0aGlzLnNjYWxlID0gc2NhbGVcbiAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5zZXR0aW5ncy5tYXAoKGVsKSA9PiB7XG4gICAgICBlbC5zY2FsZSA9IHNjYWxlXG4gICAgICByZXR1cm4gZWxcbiAgICB9KVxuICB9XG5cbiAgc2V0TWF4KG1heCkge1xuICAgIHRoaXMubWF4ID0gbWF4XG4gICAgY29uc29sZS5sb2coJ3NldCBtYXggaXMgZGVwcmVjYXRlZCcpXG4gIH1cbiAgaGlkZSgpIHtcbiAgICB0aGlzLmlzRHJhd2luZyA9IGZhbHNlXG4gICAgdGhpcy5jYW52YXMuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLmlzRHJhd2luZyA9IHRydWVcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuXG4gIH1cblxuICBkcmF3ICgpIHtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodClcbiAgICB2YXIgc3BhY2luZyA9IHRoaXMuY2FudmFzLndpZHRoIC8gdGhpcy5iaW5zLmxlbmd0aFxuICAgIHZhciBzY2FsZSA9IHRoaXMuY2FudmFzLmhlaWdodCAvICh0aGlzLm1heCAqIDIpXG4gIC8vICBjb25zb2xlLmxvZyh0aGlzLmJpbnMpXG4gICAgdGhpcy5iaW5zLmZvckVhY2goKGJpbiwgaW5kZXgpID0+IHtcblxuICAgICAgdmFyIGhlaWdodCA9IGJpbiAqIHNjYWxlXG5cbiAgICAgdGhpcy5jdHguZmlsbFJlY3QoaW5kZXggKiBzcGFjaW5nLCB0aGlzLmNhbnZhcy5oZWlnaHQgLSBoZWlnaHQsIHNwYWNpbmcsIGhlaWdodClcblxuICAvLyAgIGNvbnNvbGUubG9nKHRoaXMuc2V0dGluZ3NbaW5kZXhdKVxuICAgICB2YXIgeSA9IHRoaXMuY2FudmFzLmhlaWdodCAtIHNjYWxlKnRoaXMuc2V0dGluZ3NbaW5kZXhdLmN1dG9mZlxuICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKVxuICAgICB0aGlzLmN0eC5tb3ZlVG8oaW5kZXgqc3BhY2luZywgeSlcbiAgICAgdGhpcy5jdHgubGluZVRvKChpbmRleCsxKSpzcGFjaW5nLCB5KVxuICAgICB0aGlzLmN0eC5zdHJva2UoKVxuXG4gICAgIHZhciB5TWF4ID0gdGhpcy5jYW52YXMuaGVpZ2h0IC0gc2NhbGUqKHRoaXMuc2V0dGluZ3NbaW5kZXhdLnNjYWxlICsgdGhpcy5zZXR0aW5nc1tpbmRleF0uY3V0b2ZmKVxuICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKVxuICAgICB0aGlzLmN0eC5tb3ZlVG8oaW5kZXgqc3BhY2luZywgeU1heClcbiAgICAgdGhpcy5jdHgubGluZVRvKChpbmRleCsxKSpzcGFjaW5nLCB5TWF4KVxuICAgICB0aGlzLmN0eC5zdHJva2UoKVxuICAgIH0pXG5cblxuICAgIC8qdmFyIHkgPSB0aGlzLmNhbnZhcy5oZWlnaHQgLSBzY2FsZSp0aGlzLmN1dG9mZlxuICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgdGhpcy5jdHgubW92ZVRvKDAsIHkpXG4gICAgdGhpcy5jdHgubGluZVRvKHRoaXMuY2FudmFzLndpZHRoLCB5KVxuICAgIHRoaXMuY3R4LnN0cm9rZSgpXG4gICAgdmFyIHlNYXggPSB0aGlzLmNhbnZhcy5oZWlnaHQgLSBzY2FsZSp0aGlzLm1heFxuICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgdGhpcy5jdHgubW92ZVRvKDAsIHlNYXgpXG4gICAgdGhpcy5jdHgubGluZVRvKHRoaXMuY2FudmFzLndpZHRoLCB5TWF4KVxuICAgIHRoaXMuY3R4LnN0cm9rZSgpKi9cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEF1ZGlvXG4iLCIvLyBmcm9tIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2dyZS8xNjUwMjk0XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBubyBlYXNpbmcsIG5vIGFjY2VsZXJhdGlvblxuICBsaW5lYXI6IGZ1bmN0aW9uICh0KSB7IHJldHVybiB0IH0sXG4gIC8vIGFjY2VsZXJhdGluZyBmcm9tIHplcm8gdmVsb2NpdHlcbiAgZWFzZUluUXVhZDogZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQqdCB9LFxuICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICBlYXNlT3V0UXVhZDogZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQqKDItdCkgfSxcbiAgLy8gYWNjZWxlcmF0aW9uIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0aW9uXG4gIGVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uICh0KSB7IHJldHVybiB0PC41ID8gMip0KnQgOiAtMSsoNC0yKnQpKnQgfSxcbiAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICBlYXNlSW5DdWJpYzogZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQqdCp0IH0sXG4gIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gIGVhc2VPdXRDdWJpYzogZnVuY3Rpb24gKHQpIHsgcmV0dXJuICgtLXQpKnQqdCsxIH0sXG4gIC8vIGFjY2VsZXJhdGlvbiB1bnRpbCBoYWxmd2F5LCB0aGVuIGRlY2VsZXJhdGlvblxuICBlYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQ8LjUgPyA0KnQqdCp0IDogKHQtMSkqKDIqdC0yKSooMip0LTIpKzEgfSxcbiAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICBlYXNlSW5RdWFydDogZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQqdCp0KnQgfSxcbiAgLy8gZGVjZWxlcmF0aW5nIHRvIHplcm8gdmVsb2NpdHlcbiAgZWFzZU91dFF1YXJ0OiBmdW5jdGlvbiAodCkgeyByZXR1cm4gMS0oLS10KSp0KnQqdCB9LFxuICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgZWFzZUluT3V0UXVhcnQ6IGZ1bmN0aW9uICh0KSB7IHJldHVybiB0PC41ID8gOCp0KnQqdCp0IDogMS04KigtLXQpKnQqdCp0IH0sXG4gIC8vIGFjY2VsZXJhdGluZyBmcm9tIHplcm8gdmVsb2NpdHlcbiAgZWFzZUluUXVpbnQ6IGZ1bmN0aW9uICh0KSB7IHJldHVybiB0KnQqdCp0KnQgfSxcbiAgLy8gZGVjZWxlcmF0aW5nIHRvIHplcm8gdmVsb2NpdHlcbiAgZWFzZU91dFF1aW50OiBmdW5jdGlvbiAodCkgeyByZXR1cm4gMSsoLS10KSp0KnQqdCp0IH0sXG4gIC8vIGFjY2VsZXJhdGlvbiB1bnRpbCBoYWxmd2F5LCB0aGVuIGRlY2VsZXJhdGlvblxuICBlYXNlSW5PdXRRdWludDogZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQ8LjUgPyAxNip0KnQqdCp0KnQgOiAxKzE2KigtLXQpKnQqdCp0KnQgfSxcbiAgLy8gc2luIHNoYXBlXG4gIHNpbjogZnVuY3Rpb24gKHQpIHsgcmV0dXJuICgxICsgTWF0aC5zaW4oTWF0aC5QSSp0LU1hdGguUEkvMikpLzIgfVxufVxuIiwiLy8gYXR0ZW1wdCBjdXN0b20gZXZhbHVhdGlvbiBzYW5kYm94IGZvciBoeWRyYSBmdW5jdGlvbnNcbi8vIGZvciBub3csIGp1c3QgYXZvaWRzIHBvbGx1dGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZVxuLy8gc2hvdWxkIHByb2JhYmx5IGJlIHJlcGxhY2VkIHdpdGggYW4gYWJzdHJhY3Qgc3ludGF4IHRyZWVcblxubW9kdWxlLmV4cG9ydHMgPSAocGFyZW50KSA9PiB7XG4gIHZhciBpbml0aWFsQ29kZSA9IGBgXG5cbiAgdmFyIHNhbmRib3ggPSBjcmVhdGVTYW5kYm94KGluaXRpYWxDb2RlKVxuXG4gIHZhciBhZGRUb0NvbnRleHQgPSAobmFtZSwgb2JqZWN0KSA9PiB7XG4gICAgaW5pdGlhbENvZGUgKz0gYFxuICAgICAgdmFyICR7bmFtZX0gPSAke29iamVjdH1cbiAgICBgXG4gICAgc2FuZGJveCA9IGNyZWF0ZVNhbmRib3goaW5pdGlhbENvZGUpXG4gIH1cblxuXG4gIHJldHVybiB7XG4gICAgYWRkVG9Db250ZXh0OiBhZGRUb0NvbnRleHQsXG4gICAgZXZhbDogKGNvZGUpID0+IHNhbmRib3guZXZhbChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2FuZGJveCAoaW5pdGlhbCkge1xuICAgIGV2YWwoaW5pdGlhbClcbiAgICAvLyBvcHRpb25hbCBwYXJhbXNcbiAgICB2YXIgbG9jYWxFdmFsID0gZnVuY3Rpb24gKGNvZGUpICB7XG4gICAgICBldmFsKGNvZGUpXG4gICAgfVxuXG4gICAgLy8gQVBJL2RhdGEgZm9yIGVuZC11c2VyXG4gICAgcmV0dXJuIHtcbiAgICAgIGV2YWw6IGxvY2FsRXZhbFxuICAgIH1cbiAgfVxufVxuIiwiXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAvLyAgYXN5bmMgZnVuY3Rpb24gc3RhcnRDYXB0dXJlKGRpc3BsYXlNZWRpYU9wdGlvbnMpIHtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYShvcHRpb25zKS50aGVuKChzdHJlYW0pID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKVxuICAgICAgdmlkZW8uc3JjT2JqZWN0ID0gc3RyZWFtXG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsICgpID0+IHtcbiAgICAgICAgdmlkZW8ucGxheSgpXG4gICAgICAgIHJlc29sdmUoe3ZpZGVvOiB2aWRlb30pXG4gICAgICB9KVxuICAgIH0pLmNhdGNoKChlcnIpID0+IHJlamVjdChlcnIpKVxuICB9KVxufVxuIiwiY2xhc3MgVmlkZW9SZWNvcmRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHRoaXMubWVkaWFTb3VyY2UgPSBuZXcgTWVkaWFTb3VyY2UoKVxuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtXG5cbiAgICAvLyB0ZXN0aW5nIHVzaW5nIGEgcmVjb3JkaW5nIGFzIGlucHV0XG4gICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpXG4gICAgdGhpcy5vdXRwdXQuYXV0b3BsYXkgPSB0cnVlXG4gICAgdGhpcy5vdXRwdXQubG9vcCA9IHRydWVcblxuICAgIGxldCBzZWxmID0gdGhpc1xuICAgIHRoaXMubWVkaWFTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignc291cmNlb3BlbicsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdNZWRpYVNvdXJjZSBvcGVuZWQnKTtcbiAgICAgIHNlbGYuc291cmNlQnVmZmVyID0gc2VsZi5tZWRpYVNvdXJjZS5hZGRTb3VyY2VCdWZmZXIoJ3ZpZGVvL3dlYm07IGNvZGVjcz1cInZwOFwiJyk7XG4gICAgICBjb25zb2xlLmxvZygnU291cmNlIGJ1ZmZlcjogJywgc291cmNlQnVmZmVyKTtcbiAgICB9KVxuICB9XG5cbiAgc3RhcnQoKSB7XG4gIC8vICBsZXQgb3B0aW9ucyA9IHttaW1lVHlwZTogJ3ZpZGVvL3dlYm0nfTtcblxuLy8gICBsZXQgb3B0aW9ucyA9IHttaW1lVHlwZTogJ3ZpZGVvL3dlYm07Y29kZWNzPWgyNjQnfTtcbiAgIGxldCBvcHRpb25zID0ge21pbWVUeXBlOiAndmlkZW8vd2VibTtjb2RlY3M9dnA5J307XG5cbiAgICB0aGlzLnJlY29yZGVkQmxvYnMgPSBbXVxuICAgIHRyeSB7XG4gICAgIHRoaXMubWVkaWFSZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKHRoaXMuc3RyZWFtLCBvcHRpb25zKVxuICAgIH0gY2F0Y2ggKGUwKSB7XG4gICAgIGNvbnNvbGUubG9nKCdVbmFibGUgdG8gY3JlYXRlIE1lZGlhUmVjb3JkZXIgd2l0aCBvcHRpb25zIE9iamVjdDogJywgZTApXG4gICAgIHRyeSB7XG4gICAgICAgb3B0aW9ucyA9IHttaW1lVHlwZTogJ3ZpZGVvL3dlYm0sY29kZWNzPXZwOSd9XG4gICAgICAgdGhpcy5tZWRpYVJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIodGhpcy5zdHJlYW0sIG9wdGlvbnMpXG4gICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBjcmVhdGUgTWVkaWFSZWNvcmRlciB3aXRoIG9wdGlvbnMgT2JqZWN0OiAnLCBlMSlcbiAgICAgICB0cnkge1xuICAgICAgICAgb3B0aW9ucyA9ICd2aWRlby92cDgnIC8vIENocm9tZSA0N1xuICAgICAgICAgdGhpcy5tZWRpYVJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIodGhpcy5zdHJlYW0sIG9wdGlvbnMpXG4gICAgICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgICAgIGFsZXJ0KCdNZWRpYVJlY29yZGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxcblxcbicgK1xuICAgICAgICAgICAnVHJ5IEZpcmVmb3ggMjkgb3IgbGF0ZXIsIG9yIENocm9tZSA0NyBvciBsYXRlciwgJyArXG4gICAgICAgICAgICd3aXRoIEVuYWJsZSBleHBlcmltZW50YWwgV2ViIFBsYXRmb3JtIGZlYXR1cmVzIGVuYWJsZWQgZnJvbSBjaHJvbWU6Ly9mbGFncy4nKVxuICAgICAgICAgY29uc29sZS5lcnJvcignRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIE1lZGlhUmVjb3JkZXI6JywgZTIpXG4gICAgICAgICByZXR1cm5cbiAgICAgICB9XG4gICAgIH1cbiAgIH1cbiAgIGNvbnNvbGUubG9nKCdDcmVhdGVkIE1lZGlhUmVjb3JkZXInLCB0aGlzLm1lZGlhUmVjb3JkZXIsICd3aXRoIG9wdGlvbnMnLCBvcHRpb25zKTtcbiAgIHRoaXMubWVkaWFSZWNvcmRlci5vbnN0b3AgPSB0aGlzLl9oYW5kbGVTdG9wLmJpbmQodGhpcylcbiAgIHRoaXMubWVkaWFSZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSB0aGlzLl9oYW5kbGVEYXRhQXZhaWxhYmxlLmJpbmQodGhpcylcbiAgIHRoaXMubWVkaWFSZWNvcmRlci5zdGFydCgxMDApIC8vIGNvbGxlY3QgMTAwbXMgb2YgZGF0YVxuICAgY29uc29sZS5sb2coJ01lZGlhUmVjb3JkZXIgc3RhcnRlZCcsIHRoaXMubWVkaWFSZWNvcmRlcilcbiB9XG5cbiAgXG4gICBzdG9wKCl7XG4gICAgIHRoaXMubWVkaWFSZWNvcmRlci5zdG9wKClcbiAgIH1cblxuIF9oYW5kbGVTdG9wKCkge1xuICAgLy9jb25zdCBzdXBlckJ1ZmZlciA9IG5ldyBCbG9iKHJlY29yZGVkQmxvYnMsIHt0eXBlOiAndmlkZW8vd2VibSd9KVxuICAgLy8gY29uc3QgYmxvYiA9IG5ldyBCbG9iKHRoaXMucmVjb3JkZWRCbG9icywge3R5cGU6ICd2aWRlby93ZWJtO2NvZGVjcz1oMjY0J30pXG4gIGNvbnN0IGJsb2IgPSBuZXcgQmxvYih0aGlzLnJlY29yZGVkQmxvYnMsIHt0eXBlOiB0aGlzLm1lZGlhUmVjb3JkZXIubWltZVR5cGV9KVxuICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgIHRoaXMub3V0cHV0LnNyYyA9IHVybFxuXG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgIGEuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgIGEuaHJlZiA9IHVybFxuICAgIGxldCBkID0gbmV3IERhdGUoKVxuICAgIGEuZG93bmxvYWQgPSBgaHlkcmEtJHtkLmdldEZ1bGxZZWFyKCl9LSR7ZC5nZXRNb250aCgpICsgMX0tJHtkLmdldERhdGUoKX0tJHtkLmdldEhvdXJzKCl9LiR7ZC5nZXRNaW51dGVzKCl9LiR7ZC5nZXRTZWNvbmRzKCl9LndlYm1gXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKVxuICAgIGEuY2xpY2soKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIF9oYW5kbGVEYXRhQXZhaWxhYmxlKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YS5zaXplID4gMCkge1xuICAgICAgdGhpcy5yZWNvcmRlZEJsb2JzLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVmlkZW9SZWNvcmRlclxuIiwiLy9jb25zdCBlbnVtZXJhdGVEZXZpY2VzID0gcmVxdWlyZSgnZW51bWVyYXRlLWRldmljZXMnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkZXZpY2VJZCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKClcbiAgICAudGhlbihkZXZpY2VzID0+IGRldmljZXMuZmlsdGVyKGRldmljZXMgPT4gZGV2aWNlcy5raW5kID09PSAndmlkZW9pbnB1dCcpKVxuICAgIC50aGVuKGNhbWVyYXMgPT4ge1xuICAgICAgbGV0IGNvbnN0cmFpbnRzID0geyBhdWRpbzogZmFsc2UsIHZpZGVvOiB0cnVlfVxuICAgICAgaWYgKGNhbWVyYXNbZGV2aWNlSWRdKSB7XG4gICAgICAgIGNvbnN0cmFpbnRzWyd2aWRlbyddID0ge1xuICAgICAgICAgIGRldmljZUlkOiB7IGV4YWN0OiBjYW1lcmFzW2RldmljZUlkXS5kZXZpY2VJZCB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAvLyAgY29uc29sZS5sb2coY2FtZXJhcylcbiAgICAgIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoY29uc3RyYWludHMpXG4gICAgfSlcbiAgICAudGhlbihzdHJlYW0gPT4ge1xuICAgICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpXG4gICAgICAvLyAgdmlkZW8uc3JjID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKVxuICAgICAgdmlkZW8uc3JjT2JqZWN0ID0gc3RyZWFtXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsICgpID0+IHtcbiAgICAgICAgICB2aWRlby5wbGF5KCkudGhlbigoKSA9PiByZXNvbHZlKHt2aWRlbzogdmlkZW99KSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICAuY2F0Y2goY29uc29sZS5sb2cuYmluZChjb25zb2xlKSlcbn1cbiIsIi8vY29uc3QgdHJhbnNmb3JtcyA9IHJlcXVpcmUoJy4vZ2xzbC10cmFuc2Zvcm1zLmpzJylcblxudmFyIE91dHB1dCA9IGZ1bmN0aW9uICh7IHJlZ2wsIHByZWNpc2lvbiwgbGFiZWwgPSBcIlwiLCB3aWR0aCwgaGVpZ2h0fSkge1xuICB0aGlzLnJlZ2wgPSByZWdsXG4gIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uXG4gIHRoaXMubGFiZWwgPSBsYWJlbFxuICB0aGlzLnBvc2l0aW9uQnVmZmVyID0gdGhpcy5yZWdsLmJ1ZmZlcihbXG4gICAgWy0yLCAwXSxcbiAgICBbMCwgLTJdLFxuICAgIFsyLCAyXVxuICBdKVxuXG4gIHRoaXMuZHJhdyA9ICgpID0+IHt9XG4gIHRoaXMuaW5pdCgpXG4gIHRoaXMucGluZ1BvbmdJbmRleCA9IDBcblxuICAvLyBmb3IgZWFjaCBvdXRwdXQsIGNyZWF0ZSB0d28gZmJvcyBmb3IgcGluZ3BvbmdpbmdcbiAgdGhpcy5mYm9zID0gKEFycmF5KDIpKS5maWxsKCkubWFwKCgpID0+IHRoaXMucmVnbC5mcmFtZWJ1ZmZlcih7XG4gICAgY29sb3I6IHRoaXMucmVnbC50ZXh0dXJlKHtcbiAgICAgIG1hZzogJ25lYXJlc3QnLFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBmb3JtYXQ6ICdyZ2JhJ1xuICAgIH0pLFxuICAgIGRlcHRoU3RlbmNpbDogZmFsc2VcbiAgfSkpXG5cbiAgLy8gYXJyYXkgY29udGFpbmluZyByZW5kZXIgcGFzc2VzXG4vLyAgdGhpcy5wYXNzZXMgPSBbXVxufVxuXG5PdXRwdXQucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgdGhpcy5mYm9zLmZvckVhY2goKGZibykgPT4ge1xuICAgIGZiby5yZXNpemUod2lkdGgsIGhlaWdodClcbiAgfSlcbi8vICBjb25zb2xlLmxvZyh0aGlzKVxufVxuXG5cbk91dHB1dC5wcm90b3R5cGUuZ2V0Q3VycmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZmJvc1t0aGlzLnBpbmdQb25nSW5kZXhdXG59XG5cbk91dHB1dC5wcm90b3R5cGUuZ2V0VGV4dHVyZSA9IGZ1bmN0aW9uICgpIHtcbiAgIHZhciBpbmRleCA9IHRoaXMucGluZ1BvbmdJbmRleCA/IDAgOiAxXG4gIHJldHVybiB0aGlzLmZib3NbaW5kZXhdXG59XG5cbk91dHB1dC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbi8vICBjb25zb2xlLmxvZygnY2xlYXJpbmcnKVxuICB0aGlzLnRyYW5zZm9ybUluZGV4ID0gMFxuICB0aGlzLmZyYWdIZWFkZXIgPSBgXG4gIHByZWNpc2lvbiAke3RoaXMucHJlY2lzaW9ufSBmbG9hdDtcblxuICB1bmlmb3JtIGZsb2F0IHRpbWU7XG4gIHZhcnlpbmcgdmVjMiB1djtcbiAgYFxuICB0aGlzLmZyYWdCb2R5ID0gYGBcblxuICB0aGlzLnZlcnQgPSBgXG4gIHByZWNpc2lvbiAke3RoaXMucHJlY2lzaW9ufSBmbG9hdDtcbiAgYXR0cmlidXRlIHZlYzIgcG9zaXRpb247XG4gIHZhcnlpbmcgdmVjMiB1djtcblxuICB2b2lkIG1haW4gKCkge1xuICAgIHV2ID0gcG9zaXRpb247XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDIuMCAqIHBvc2l0aW9uIC0gMS4wLCAwLCAxKTtcbiAgfWBcblxuICB0aGlzLmF0dHJpYnV0ZXMgPSB7XG4gICAgcG9zaXRpb246IHRoaXMucG9zaXRpb25CdWZmZXJcbiAgfVxuICB0aGlzLnVuaWZvcm1zID0ge1xuICAgIHRpbWU6IHRoaXMucmVnbC5wcm9wKCd0aW1lJyksXG4gICAgcmVzb2x1dGlvbjogdGhpcy5yZWdsLnByb3AoJ3Jlc29sdXRpb24nKVxuICB9XG5cbiAgdGhpcy5mcmFnID0gYFxuICAgICAgICR7dGhpcy5mcmFnSGVhZGVyfVxuXG4gICAgICB2b2lkIG1haW4gKCkge1xuICAgICAgICB2ZWM0IGMgPSB2ZWM0KDAsIDAsIDAsIDApO1xuICAgICAgICB2ZWMyIHN0ID0gdXY7XG4gICAgICAgICR7dGhpcy5mcmFnQm9keX1cbiAgICAgICAgZ2xfRnJhZ0NvbG9yID0gYztcbiAgICAgIH1cbiAgYFxuICByZXR1cm4gdGhpc1xufVxuXG5cbk91dHB1dC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKHBhc3Nlcykge1xuICBsZXQgcGFzcyA9IHBhc3Nlc1swXVxuICAvL2NvbnNvbGUubG9nKCdwYXNzJywgcGFzcywgdGhpcy5waW5nUG9uZ0luZGV4KVxuICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgIHZhciB1bmlmb3JtcyA9IE9iamVjdC5hc3NpZ24ocGFzcy51bmlmb3JtcywgeyBwcmV2QnVmZmVyOiAgKCkgPT4gIHtcbiAgICAgICAgICAgICAvL3ZhciBpbmRleCA9IHRoaXMucGluZ1BvbmdJbmRleCA/IDAgOiAxXG4gICAgICAgICAgLy8gICB2YXIgaW5kZXggPSBzZWxmLnBpbmdQb25nWyhwYXNzSW5kZXgrMSklMl1cbiAgICAgICAgICAvLyAgY29uc29sZS5sb2coJ3BpbmcgcG9uZycsIHNlbGYucGluZ1BvbmdJbmRleClcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmZib3Nbc2VsZi5waW5nUG9uZ0luZGV4XVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICBzZWxmLmRyYXcgPSBzZWxmLnJlZ2woe1xuICAgIGZyYWc6IHBhc3MuZnJhZyxcbiAgICB2ZXJ0OiBzZWxmLnZlcnQsXG4gICAgYXR0cmlidXRlczogc2VsZi5hdHRyaWJ1dGVzLFxuICAgIHVuaWZvcm1zOiB1bmlmb3JtcyxcbiAgICBjb3VudDogMyxcbiAgICBmcmFtZWJ1ZmZlcjogKCkgPT4ge1xuICAgICAgc2VsZi5waW5nUG9uZ0luZGV4ID0gc2VsZi5waW5nUG9uZ0luZGV4ID8gMCA6IDFcbiAgICAgIHJldHVybiBzZWxmLmZib3Nbc2VsZi5waW5nUG9uZ0luZGV4XVxuICAgIH1cbiAgfSlcbn1cblxuXG5PdXRwdXQucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbiAocHJvcHMpIHtcbi8vICBjb25zb2xlLmxvZyhwcm9wcylcbiAgdGhpcy5kcmF3KHByb3BzKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE91dHB1dFxuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCJcbnZhciBpbmRleE9mID0gW10uaW5kZXhPZjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhcnIsIG9iail7XG4gIGlmIChpbmRleE9mKSByZXR1cm4gYXJyLmluZGV4T2Yob2JqKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoYXJyW2ldID09PSBvYmopIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn07IiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvKiFcbiAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXJcbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKVxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzQnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cbiIsIiFmdW5jdGlvbih0LHIpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXIoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLHIpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuTWV5ZGE9cigpOnQuTWV5ZGE9cigpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIobil7aWYoZVtuXSlyZXR1cm4gZVtuXS5leHBvcnRzO3ZhciBvPWVbbl09e2k6bixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W25dLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHIpLG8ubD0hMCxvLmV4cG9ydHN9dmFyIGU9e307cmV0dXJuIHIubT10LHIuYz1lLHIuaT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sci5kPWZ1bmN0aW9uKHQsZSxuKXtyLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Om59KX0sci5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiByLmQoZSxcImFcIixlKSxlfSxyLm89ZnVuY3Rpb24odCxyKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscil9LHIucD1cIlwiLHIoci5zPTIzKX0oW2Z1bmN0aW9uKHQscixlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgcj0wLGU9QXJyYXkodC5sZW5ndGgpO3I8dC5sZW5ndGg7cisrKWVbcl09dFtyXTtyZXR1cm4gZX1yZXR1cm4gQXJyYXkuZnJvbSh0KX1mdW5jdGlvbiBvKHQpe2Zvcig7dCUyPT0wJiZ0PjE7KXQvPTI7cmV0dXJuIDE9PT10fWZ1bmN0aW9uIGkodCxyKXtmb3IodmFyIGU9W10sbj0wO248TWF0aC5taW4odC5sZW5ndGgsci5sZW5ndGgpO24rKyllW25dPXRbbl0qcltuXTtyZXR1cm4gZX1mdW5jdGlvbiBhKHQscil7aWYoXCJyZWN0XCIhPT1yKXtpZihcIlwiIT09ciYmcnx8KHI9XCJoYW5uaW5nXCIpLGdbcl18fChnW3JdPXt9KSwhZ1tyXVt0Lmxlbmd0aF0pdHJ5e2dbcl1bdC5sZW5ndGhdPWJbcl0odC5sZW5ndGgpfWNhdGNoKHQpe3Rocm93IG5ldyBFcnJvcihcIkludmFsaWQgd2luZG93aW5nIGZ1bmN0aW9uXCIpfXQ9aSh0LGdbcl1bdC5sZW5ndGhdKX1yZXR1cm4gdH1mdW5jdGlvbiB1KHQscixlKXtmb3IodmFyIG49bmV3IEZsb2F0MzJBcnJheSh0KSxvPTA7bzxuLmxlbmd0aDtvKyspbltvXT1vKnIvZSxuW29dPTEzKk1hdGguYXRhbihuW29dLzEzMTUuOCkrMy41Kk1hdGguYXRhbihNYXRoLnBvdyhuW29dLzc1MTgsMikpO3JldHVybiBufWZ1bmN0aW9uIGModCl7cmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKHQpfWZ1bmN0aW9uIGYodCl7cmV0dXJuIDcwMCooTWF0aC5leHAodC8xMTI1KS0xKX1mdW5jdGlvbiBsKHQpe3JldHVybiAxMTI1Kk1hdGgubG9nKDErdC83MDApfWZ1bmN0aW9uIHModCxyLGUpe2Zvcih2YXIgbj1uZXcgRmxvYXQzMkFycmF5KHQrMiksbz1uZXcgRmxvYXQzMkFycmF5KHQrMiksaT1yLzIsYT1sKDApLHU9bChpKSxjPXUtYSxzPWMvKHQrMSkscD1BcnJheSh0KzIpLG09MDttPG4ubGVuZ3RoO20rKyluW21dPW0qcyxvW21dPWYoblttXSkscFttXT1NYXRoLmZsb29yKChlKzEpKm9bbV0vcik7Zm9yKHZhciB5PUFycmF5KHQpLGg9MDtoPHkubGVuZ3RoO2grKyl7eVtoXT1BcnJheS5hcHBseShudWxsLG5ldyBBcnJheShlLzIrMSkpLm1hcChOdW1iZXIucHJvdG90eXBlLnZhbHVlT2YsMCk7Zm9yKHZhciBiPXBbaF07YjxwW2grMV07YisrKXlbaF1bYl09KGItcFtoXSkvKHBbaCsxXS1wW2hdKTtmb3IodmFyIGc9cFtoKzFdO2c8cFtoKzJdO2crKyl5W2hdW2ddPShwW2grMl0tZykvKHBbaCsyXS1wW2grMV0pfXJldHVybiB5fWZ1bmN0aW9uIHAodCxyKXtyZXR1cm4gTWF0aC5sb2cyKDE2KnQvcil9ZnVuY3Rpb24gbSh0KXt2YXIgcj10WzBdLm1hcChmdW5jdGlvbigpe3JldHVybiAwfSksZT10LnJlZHVjZShmdW5jdGlvbih0LHIpe3JldHVybiByLmZvckVhY2goZnVuY3Rpb24ocixlKXt0W2VdKz1NYXRoLnBvdyhyLDIpfSksdH0scikubWFwKE1hdGguc3FydCk7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQscil7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQscil7cmV0dXJuIHQvKGVbcl18fDEpfSl9KX1mdW5jdGlvbiB5KHQscixlKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106NSxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XToyLGE9IShhcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XSl8fGFyZ3VtZW50c1s1XSx1PWFyZ3VtZW50cy5sZW5ndGg+NiYmdm9pZCAwIT09YXJndW1lbnRzWzZdP2FyZ3VtZW50c1s2XTo0NDAsYz1NYXRoLmZsb29yKGUvMikrMSxmPW5ldyBBcnJheShlKS5maWxsKDApLm1hcChmdW5jdGlvbihuLG8pe3JldHVybiB0KnAocipvL2UsdSl9KTtmWzBdPWZbMV0tMS41KnQ7dmFyIGw9Zi5zbGljZSgxKS5tYXAoZnVuY3Rpb24odCxyKXtyZXR1cm4gTWF0aC5tYXgodC1mW3JdKX0sMSkuY29uY2F0KFsxXSkscz1NYXRoLnJvdW5kKHQvMikseT1uZXcgQXJyYXkodCkuZmlsbCgwKS5tYXAoZnVuY3Rpb24ocixlKXtyZXR1cm4gZi5tYXAoZnVuY3Rpb24ocil7cmV0dXJuKDEwKnQrcytyLWUpJXQtc30pfSksaD15Lm1hcChmdW5jdGlvbih0LHIpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLmV4cCgtLjUqTWF0aC5wb3coMip5W3JdW2VdL2xbZV0sMikpfSl9KTtpZihoPW0oaCksaSl7dmFyIGI9Zi5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIE1hdGguZXhwKC0uNSpNYXRoLnBvdygoci90LW8pL2ksMikpfSk7aD1oLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxyKXtyZXR1cm4gdCpiW3JdfSl9KX1yZXR1cm4gYSYmKGg9W10uY29uY2F0KG4oaC5zbGljZSgzKSksbihoLnNsaWNlKDAsMykpKSksaC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UoMCxjKX0pfWZ1bmN0aW9uIGgodCxyLGUpe2lmKHQubGVuZ3RoPHIpdGhyb3cgbmV3IEVycm9yKFwiQnVmZmVyIGlzIHRvbyBzaG9ydCBmb3IgZnJhbWUgbGVuZ3RoXCIpO2lmKGU8MSl0aHJvdyBuZXcgRXJyb3IoXCJIb3AgbGVuZ3RoIGNhbm5vdCBiZSBsZXNzIHRoYXQgMVwiKTtpZihyPDEpdGhyb3cgbmV3IEVycm9yKFwiRnJhbWUgbGVuZ3RoIGNhbm5vdCBiZSBsZXNzIHRoYXQgMVwiKTt2YXIgbj0xK01hdGguZmxvb3IoKHQubGVuZ3RoLXIpL2UpO3JldHVybiBuZXcgQXJyYXkobikuZmlsbCgwKS5tYXAoZnVuY3Rpb24obixvKXtyZXR1cm4gdC5zbGljZShvKmUsbyplK3IpfSl9ci5iPW8sci5hPWEsci5jPXUsci5mPWMsci5kPXMsci5lPXksci5nPWg7dmFyIGI9ZSgyNSksZz17fX0sZnVuY3Rpb24odCxyLGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxyKXtmb3IodmFyIGU9MCxuPTAsbz0wO288ci5sZW5ndGg7bysrKWUrPU1hdGgucG93KG8sdCkqTWF0aC5hYnMocltvXSksbis9cltvXTtyZXR1cm4gZS9ufXIuYT1ufSxmdW5jdGlvbih0LHIsZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH07ci5hPWZ1bmN0aW9uKHQpe2lmKFwib2JqZWN0XCIhPT1uKHQuYW1wU3BlY3RydW0pfHxcIm9iamVjdFwiIT09bih0LmJhcmtTY2FsZSkpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgcj1uZXcgRmxvYXQzMkFycmF5KDI0KSxlPTAsbz10LmFtcFNwZWN0cnVtLGk9bmV3IEludDMyQXJyYXkoMjUpO2lbMF09MDtmb3IodmFyIGE9dC5iYXJrU2NhbGVbby5sZW5ndGgtMV0vMjQsdT0xLGM9MDtjPG8ubGVuZ3RoO2MrKylmb3IoO3QuYmFya1NjYWxlW2NdPmE7KWlbdSsrXT1jLGE9dSp0LmJhcmtTY2FsZVtvLmxlbmd0aC0xXS8yNDtpWzI0XT1vLmxlbmd0aC0xO2Zvcih2YXIgZj0wO2Y8MjQ7ZisrKXtmb3IodmFyIGw9MCxzPWlbZl07czxpW2YrMV07cysrKWwrPW9bc107cltmXT1NYXRoLnBvdyhsLC4yMyl9Zm9yKHZhciBwPTA7cDxyLmxlbmd0aDtwKyspZSs9cltwXTtyZXR1cm57c3BlY2lmaWM6cix0b3RhbDplfX19LGZ1bmN0aW9uKHQscixlKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fTtyLmE9ZnVuY3Rpb24oKXtpZihcIm9iamVjdFwiIT09bihhcmd1bWVudHNbMF0uYW1wU3BlY3RydW0pKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciB0PW5ldyBGbG9hdDMyQXJyYXkoYXJndW1lbnRzWzBdLmFtcFNwZWN0cnVtLmxlbmd0aCkscj0wO3I8dC5sZW5ndGg7cisrKXRbcl09TWF0aC5wb3coYXJndW1lbnRzWzBdLmFtcFNwZWN0cnVtW3JdLDIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxyLGUpe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuZChyLFwiYnVmZmVyXCIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLGUuZChyLFwiY29tcGxleFNwZWN0cnVtXCIsZnVuY3Rpb24oKXtyZXR1cm4gd30pLGUuZChyLFwiYW1wbGl0dWRlU3BlY3RydW1cIixmdW5jdGlvbigpe3JldHVybiB4fSk7dmFyIG49ZSgxMyksbz1lKDkpLGk9ZSgyMCksYT1lKDE0KSx1PWUoMTgpLGM9ZSgxNSksZj1lKDIxKSxsPWUoMTkpLHM9ZSgxNykscD1lKDIyKSxtPWUoMikseT1lKDEyKSxoPWUoMTEpLGI9ZSgxMCksZz1lKDgpLFM9ZSgzKSxkPWUoMTYpO2UuZChyLFwicm1zXCIsZnVuY3Rpb24oKXtyZXR1cm4gbi5hfSksZS5kKHIsXCJlbmVyZ3lcIixmdW5jdGlvbigpe3JldHVybiBvLmF9KSxlLmQocixcInNwZWN0cmFsU2xvcGVcIixmdW5jdGlvbigpe3JldHVybiBpLmF9KSxlLmQocixcInNwZWN0cmFsQ2VudHJvaWRcIixmdW5jdGlvbigpe3JldHVybiBhLmF9KSxlLmQocixcInNwZWN0cmFsUm9sbG9mZlwiLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYX0pLGUuZChyLFwic3BlY3RyYWxGbGF0bmVzc1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGMuYX0pLGUuZChyLFwic3BlY3RyYWxTcHJlYWRcIixmdW5jdGlvbigpe3JldHVybiBmLmF9KSxlLmQocixcInNwZWN0cmFsU2tld25lc3NcIixmdW5jdGlvbigpe3JldHVybiBsLmF9KSxlLmQocixcInNwZWN0cmFsS3VydG9zaXNcIixmdW5jdGlvbigpe3JldHVybiBzLmF9KSxlLmQocixcInpjclwiLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pLGUuZChyLFwibG91ZG5lc3NcIixmdW5jdGlvbigpe3JldHVybiBtLmF9KSxlLmQocixcInBlcmNlcHR1YWxTcHJlYWRcIixmdW5jdGlvbigpe3JldHVybiB5LmF9KSxlLmQocixcInBlcmNlcHR1YWxTaGFycG5lc3NcIixmdW5jdGlvbigpe3JldHVybiBoLmF9KSxlLmQocixcInBvd2VyU3BlY3RydW1cIixmdW5jdGlvbigpe3JldHVybiBTLmF9KSxlLmQocixcIm1mY2NcIixmdW5jdGlvbigpe3JldHVybiBiLmF9KSxlLmQocixcImNocm9tYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGcuYX0pLGUuZChyLFwic3BlY3RyYWxGbHV4XCIsZnVuY3Rpb24oKXtyZXR1cm4gZC5hfSk7dmFyIHY9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2lnbmFsfSx3PWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbXBsZXhTcGVjdHJ1bX0seD1mdW5jdGlvbih0KXtyZXR1cm4gdC5hbXBTcGVjdHJ1bX19LGZ1bmN0aW9uKHQscil7dmFyIGU7ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtlPWV8fEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKXx8KDAsZXZhbCkoXCJ0aGlzXCIpfWNhdGNoKHQpe1wib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJihlPXdpbmRvdyl9dC5leHBvcnRzPWV9LGZ1bmN0aW9uKHQscixlKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkocixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1lKDApLG89ZSg0KSxpPWUoMjgpLGE9KGUubihpKSxlKDI0KSksdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSxjPXthdWRpb0NvbnRleHQ6bnVsbCxzcG46bnVsbCxidWZmZXJTaXplOjUxMixzYW1wbGVSYXRlOjQ0MTAwLG1lbEJhbmRzOjI2LGNocm9tYUJhbmRzOjEyLGNhbGxiYWNrOm51bGwsd2luZG93aW5nRnVuY3Rpb246XCJoYW5uaW5nXCIsZmVhdHVyZUV4dHJhY3RvcnM6byxFWFRSQUNUSU9OX1NUQVJURUQ6ITEsX2ZlYXR1cmVzVG9FeHRyYWN0OltdLHdpbmRvd2luZzpuLmEsX2Vycm9yczp7bm90UG93MjpuZXcgRXJyb3IoXCJNZXlkYTogQnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIsIGUuZy4gNjQgb3IgNTEyXCIpLGZlYXR1cmVVbmRlZjpuZXcgRXJyb3IoXCJNZXlkYTogTm8gZmVhdHVyZXMgZGVmaW5lZC5cIiksaW52YWxpZEZlYXR1cmVGbXQ6bmV3IEVycm9yKFwiTWV5ZGE6IEludmFsaWQgZmVhdHVyZSBmb3JtYXRcIiksaW52YWxpZElucHV0Om5ldyBFcnJvcihcIk1leWRhOiBJbnZhbGlkIGlucHV0LlwiKSxub0FDOm5ldyBFcnJvcihcIk1leWRhOiBObyBBdWRpb0NvbnRleHQgc3BlY2lmaWVkLlwiKSxub1NvdXJjZTpuZXcgRXJyb3IoXCJNZXlkYTogTm8gc291cmNlIG5vZGUgc3BlY2lmaWVkLlwiKX0sY3JlYXRlTWV5ZGFBbmFseXplcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGEuYSh0LGMpfSxleHRyYWN0OmZ1bmN0aW9uKHQscixlKXtpZighcil0aHJvdyB0aGlzLl9lcnJvcnMuaW52YWxpZElucHV0O2lmKFwib2JqZWN0XCIhPSh2b2lkIDA9PT1yP1widW5kZWZpbmVkXCI6dShyKSkpdGhyb3cgdGhpcy5fZXJyb3JzLmludmFsaWRJbnB1dDtpZighdCl0aHJvdyB0aGlzLl9lcnJvcnMuZmVhdHVyZVVuZGVmO2lmKCFuLmIoci5sZW5ndGgpKXRocm93IHRoaXMuX2Vycm9ycy5ub3RQb3cyO3ZvaWQgMCE9PXRoaXMuYmFya1NjYWxlJiZ0aGlzLmJhcmtTY2FsZS5sZW5ndGg9PXRoaXMuYnVmZmVyU2l6ZXx8KHRoaXMuYmFya1NjYWxlPW4uYyh0aGlzLmJ1ZmZlclNpemUsdGhpcy5zYW1wbGVSYXRlLHRoaXMuYnVmZmVyU2l6ZSkpLHZvaWQgMCE9PXRoaXMubWVsRmlsdGVyQmFuayYmdGhpcy5iYXJrU2NhbGUubGVuZ3RoPT10aGlzLmJ1ZmZlclNpemUmJnRoaXMubWVsRmlsdGVyQmFuay5sZW5ndGg9PXRoaXMubWVsQmFuZHN8fCh0aGlzLm1lbEZpbHRlckJhbms9bi5kKHRoaXMubWVsQmFuZHMsdGhpcy5zYW1wbGVSYXRlLHRoaXMuYnVmZmVyU2l6ZSkpLHZvaWQgMCE9PXRoaXMuY2hyb21hRmlsdGVyQmFuayYmdGhpcy5jaHJvbWFGaWx0ZXJCYW5rLmxlbmd0aD09dGhpcy5jaHJvbWFCYW5kc3x8KHRoaXMuY2hyb21hRmlsdGVyQmFuaz1uLmUodGhpcy5jaHJvbWFCYW5kcyx0aGlzLnNhbXBsZVJhdGUsdGhpcy5idWZmZXJTaXplKSksdm9pZCAwPT09ci5idWZmZXI/dGhpcy5zaWduYWw9bi5mKHIpOnRoaXMuc2lnbmFsPXI7dmFyIG89ZihyLHRoaXMud2luZG93aW5nRnVuY3Rpb24sdGhpcy5idWZmZXJTaXplKTtpZih0aGlzLnNpZ25hbD1vLndpbmRvd2VkU2lnbmFsLHRoaXMuY29tcGxleFNwZWN0cnVtPW8uY29tcGxleFNwZWN0cnVtLHRoaXMuYW1wU3BlY3RydW09by5hbXBTcGVjdHJ1bSxlKXt2YXIgaT1mKGUsdGhpcy53aW5kb3dpbmdGdW5jdGlvbix0aGlzLmJ1ZmZlclNpemUpO3RoaXMucHJldmlvdXNTaWduYWw9aS53aW5kb3dlZFNpZ25hbCx0aGlzLnByZXZpb3VzQ29tcGxleFNwZWN0cnVtPWkuY29tcGxleFNwZWN0cnVtLHRoaXMucHJldmlvdXNBbXBTcGVjdHJ1bT1pLmFtcFNwZWN0cnVtfWlmKFwib2JqZWN0XCI9PT0odm9pZCAwPT09dD9cInVuZGVmaW5lZFwiOnUodCkpKXtmb3IodmFyIGE9e30sYz0wO2M8dC5sZW5ndGg7YysrKWFbdFtjXV09dGhpcy5mZWF0dXJlRXh0cmFjdG9yc1t0W2NdXSh7YW1wU3BlY3RydW06dGhpcy5hbXBTcGVjdHJ1bSxjaHJvbWFGaWx0ZXJCYW5rOnRoaXMuY2hyb21hRmlsdGVyQmFuayxjb21wbGV4U3BlY3RydW06dGhpcy5jb21wbGV4U3BlY3RydW0sc2lnbmFsOnRoaXMuc2lnbmFsLGJ1ZmZlclNpemU6dGhpcy5idWZmZXJTaXplLHNhbXBsZVJhdGU6dGhpcy5zYW1wbGVSYXRlLGJhcmtTY2FsZTp0aGlzLmJhcmtTY2FsZSxtZWxGaWx0ZXJCYW5rOnRoaXMubWVsRmlsdGVyQmFuayxwcmV2aW91c1NpZ25hbDp0aGlzLnByZXZpb3VzU2lnbmFsLHByZXZpb3VzQW1wU3BlY3RydW06dGhpcy5wcmV2aW91c0FtcFNwZWN0cnVtLHByZXZpb3VzQ29tcGxleFNwZWN0cnVtOnRoaXMucHJldmlvdXNDb21wbGV4U3BlY3RydW19KTtyZXR1cm4gYX1pZihcInN0cmluZ1wiPT10eXBlb2YgdClyZXR1cm4gdGhpcy5mZWF0dXJlRXh0cmFjdG9yc1t0XSh7YW1wU3BlY3RydW06dGhpcy5hbXBTcGVjdHJ1bSxjaHJvbWFGaWx0ZXJCYW5rOnRoaXMuY2hyb21hRmlsdGVyQmFuayxjb21wbGV4U3BlY3RydW06dGhpcy5jb21wbGV4U3BlY3RydW0sc2lnbmFsOnRoaXMuc2lnbmFsLGJ1ZmZlclNpemU6dGhpcy5idWZmZXJTaXplLHNhbXBsZVJhdGU6dGhpcy5zYW1wbGVSYXRlLGJhcmtTY2FsZTp0aGlzLmJhcmtTY2FsZSxtZWxGaWx0ZXJCYW5rOnRoaXMubWVsRmlsdGVyQmFuayxwcmV2aW91c1NpZ25hbDp0aGlzLnByZXZpb3VzU2lnbmFsLHByZXZpb3VzQW1wU3BlY3RydW06dGhpcy5wcmV2aW91c0FtcFNwZWN0cnVtLHByZXZpb3VzQ29tcGxleFNwZWN0cnVtOnRoaXMucHJldmlvdXNDb21wbGV4U3BlY3RydW19KTt0aHJvdyB0aGlzLl9lcnJvcnMuaW52YWxpZEZlYXR1cmVGbXR9fSxmPWZ1bmN0aW9uKHQscixvKXt2YXIgYT17fTt2b2lkIDA9PT10LmJ1ZmZlcj9hLnNpZ25hbD1uLmYodCk6YS5zaWduYWw9dCxhLndpbmRvd2VkU2lnbmFsPW4uYShhLnNpZ25hbCxyKSxhLmNvbXBsZXhTcGVjdHJ1bT1lLmkoaS5mZnQpKGEud2luZG93ZWRTaWduYWwpLGEuYW1wU3BlY3RydW09bmV3IEZsb2F0MzJBcnJheShvLzIpO2Zvcih2YXIgdT0wO3U8by8yO3UrKylhLmFtcFNwZWN0cnVtW3VdPU1hdGguc3FydChNYXRoLnBvdyhhLmNvbXBsZXhTcGVjdHJ1bS5yZWFsW3VdLDIpK01hdGgucG93KGEuY29tcGxleFNwZWN0cnVtLmltYWdbdV0sMikpO3JldHVybiBhfTtyLmRlZmF1bHQ9YyxcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYod2luZG93Lk1leWRhPWMpfSxmdW5jdGlvbih0LHIsZSl7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKHIpey8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbmZ1bmN0aW9uIG4odCxyKXtpZih0PT09cilyZXR1cm4gMDtmb3IodmFyIGU9dC5sZW5ndGgsbj1yLmxlbmd0aCxvPTAsaT1NYXRoLm1pbihlLG4pO288aTsrK28paWYodFtvXSE9PXJbb10pe2U9dFtvXSxuPXJbb107YnJlYWt9cmV0dXJuIGU8bj8tMTpuPGU/MTowfWZ1bmN0aW9uIG8odCl7cmV0dXJuIHIuQnVmZmVyJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiByLkJ1ZmZlci5pc0J1ZmZlcj9yLkJ1ZmZlci5pc0J1ZmZlcih0KTohKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIW8odCkmJihcImZ1bmN0aW9uXCI9PXR5cGVvZiByLkFycmF5QnVmZmVyJiYoXCJmdW5jdGlvblwiPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3P0FycmF5QnVmZmVyLmlzVmlldyh0KTohIXQmJih0IGluc3RhbmNlb2YgRGF0YVZpZXd8fCEhKHQuYnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkpKX1mdW5jdGlvbiB1KHQpe2lmKHYuaXNGdW5jdGlvbih0KSl7aWYoRSlyZXR1cm4gdC5uYW1lO3ZhciByPXQudG9TdHJpbmcoKSxlPXIubWF0Y2goTSk7cmV0dXJuIGUmJmVbMV19fWZ1bmN0aW9uIGModCxyKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdD90Lmxlbmd0aDxyP3Q6dC5zbGljZSgwLHIpOnR9ZnVuY3Rpb24gZih0KXtpZihFfHwhdi5pc0Z1bmN0aW9uKHQpKXJldHVybiB2Lmluc3BlY3QodCk7dmFyIHI9dSh0KTtyZXR1cm5cIltGdW5jdGlvblwiKyhyP1wiOiBcIityOlwiXCIpK1wiXVwifWZ1bmN0aW9uIGwodCl7cmV0dXJuIGMoZih0LmFjdHVhbCksMTI4KStcIiBcIit0Lm9wZXJhdG9yK1wiIFwiK2MoZih0LmV4cGVjdGVkKSwxMjgpfWZ1bmN0aW9uIHModCxyLGUsbixvKXt0aHJvdyBuZXcgXy5Bc3NlcnRpb25FcnJvcih7bWVzc2FnZTplLGFjdHVhbDp0LGV4cGVjdGVkOnIsb3BlcmF0b3I6bixzdGFja1N0YXJ0RnVuY3Rpb246b30pfWZ1bmN0aW9uIHAodCxyKXt0fHxzKHQsITAscixcIj09XCIsXy5vayl9ZnVuY3Rpb24gbSh0LHIsZSx1KXtpZih0PT09cilyZXR1cm4hMDtpZihvKHQpJiZvKHIpKXJldHVybiAwPT09bih0LHIpO2lmKHYuaXNEYXRlKHQpJiZ2LmlzRGF0ZShyKSlyZXR1cm4gdC5nZXRUaW1lKCk9PT1yLmdldFRpbWUoKTtpZih2LmlzUmVnRXhwKHQpJiZ2LmlzUmVnRXhwKHIpKXJldHVybiB0LnNvdXJjZT09PXIuc291cmNlJiZ0Lmdsb2JhbD09PXIuZ2xvYmFsJiZ0Lm11bHRpbGluZT09PXIubXVsdGlsaW5lJiZ0Lmxhc3RJbmRleD09PXIubGFzdEluZGV4JiZ0Lmlnbm9yZUNhc2U9PT1yLmlnbm9yZUNhc2U7aWYobnVsbCE9PXQmJlwib2JqZWN0XCI9PXR5cGVvZiB0fHxudWxsIT09ciYmXCJvYmplY3RcIj09dHlwZW9mIHIpe2lmKGEodCkmJmEocikmJmkodCk9PT1pKHIpJiYhKHQgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXl8fHQgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpKXJldHVybiAwPT09bihuZXcgVWludDhBcnJheSh0LmJ1ZmZlciksbmV3IFVpbnQ4QXJyYXkoci5idWZmZXIpKTtpZihvKHQpIT09byhyKSlyZXR1cm4hMTt1PXV8fHthY3R1YWw6W10sZXhwZWN0ZWQ6W119O3ZhciBjPXUuYWN0dWFsLmluZGV4T2YodCk7cmV0dXJuLTEhPT1jJiZjPT09dS5leHBlY3RlZC5pbmRleE9mKHIpfHwodS5hY3R1YWwucHVzaCh0KSx1LmV4cGVjdGVkLnB1c2gociksaCh0LHIsZSx1KSl9cmV0dXJuIGU/dD09PXI6dD09cn1mdW5jdGlvbiB5KHQpe3JldHVyblwiW29iamVjdCBBcmd1bWVudHNdXCI9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBoKHQscixlLG4pe2lmKG51bGw9PT10fHx2b2lkIDA9PT10fHxudWxsPT09cnx8dm9pZCAwPT09cilyZXR1cm4hMTtpZih2LmlzUHJpbWl0aXZlKHQpfHx2LmlzUHJpbWl0aXZlKHIpKXJldHVybiB0PT09cjtpZihlJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2YocikpcmV0dXJuITE7dmFyIG89eSh0KSxpPXkocik7aWYobyYmIWl8fCFvJiZpKXJldHVybiExO2lmKG8pcmV0dXJuIHQ9eC5jYWxsKHQpLHI9eC5jYWxsKHIpLG0odCxyLGUpO3ZhciBhLHUsYz1BKHQpLGY9QShyKTtpZihjLmxlbmd0aCE9PWYubGVuZ3RoKXJldHVybiExO2ZvcihjLnNvcnQoKSxmLnNvcnQoKSx1PWMubGVuZ3RoLTE7dT49MDt1LS0paWYoY1t1XSE9PWZbdV0pcmV0dXJuITE7Zm9yKHU9Yy5sZW5ndGgtMTt1Pj0wO3UtLSlpZihhPWNbdV0sIW0odFthXSxyW2FdLGUsbikpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gYih0LHIsZSl7bSh0LHIsITApJiZzKHQscixlLFwibm90RGVlcFN0cmljdEVxdWFsXCIsYil9ZnVuY3Rpb24gZyh0LHIpe2lmKCF0fHwhcilyZXR1cm4hMTtpZihcIltvYmplY3QgUmVnRXhwXVwiPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocikpcmV0dXJuIHIudGVzdCh0KTt0cnl7aWYodCBpbnN0YW5jZW9mIHIpcmV0dXJuITB9Y2F0Y2godCl7fXJldHVybiFFcnJvci5pc1Byb3RvdHlwZU9mKHIpJiYhMD09PXIuY2FsbCh7fSx0KX1mdW5jdGlvbiBTKHQpe3ZhciByO3RyeXt0KCl9Y2F0Y2godCl7cj10fXJldHVybiByfWZ1bmN0aW9uIGQodCxyLGUsbil7dmFyIG87aWYoXCJmdW5jdGlvblwiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJsb2NrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XCJzdHJpbmdcIj09dHlwZW9mIGUmJihuPWUsZT1udWxsKSxvPVMociksbj0oZSYmZS5uYW1lP1wiIChcIitlLm5hbWUrXCIpLlwiOlwiLlwiKSsobj9cIiBcIituOlwiLlwiKSx0JiYhbyYmcyhvLGUsXCJNaXNzaW5nIGV4cGVjdGVkIGV4Y2VwdGlvblwiK24pO3ZhciBpPVwic3RyaW5nXCI9PXR5cGVvZiBuLGE9IXQmJnYuaXNFcnJvcihvKSx1PSF0JiZvJiYhZTtpZigoYSYmaSYmZyhvLGUpfHx1KSYmcyhvLGUsXCJHb3QgdW53YW50ZWQgZXhjZXB0aW9uXCIrbiksdCYmbyYmZSYmIWcobyxlKXx8IXQmJm8pdGhyb3cgb312YXIgdj1lKDMzKSx3PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkseD1BcnJheS5wcm90b3R5cGUuc2xpY2UsRT1mdW5jdGlvbigpe3JldHVyblwiZm9vXCI9PT1mdW5jdGlvbigpe30ubmFtZX0oKSxfPXQuZXhwb3J0cz1wLE09L1xccypmdW5jdGlvblxccysoW15cXChcXHNdKilcXHMqLztfLkFzc2VydGlvbkVycm9yPWZ1bmN0aW9uKHQpe3RoaXMubmFtZT1cIkFzc2VydGlvbkVycm9yXCIsdGhpcy5hY3R1YWw9dC5hY3R1YWwsdGhpcy5leHBlY3RlZD10LmV4cGVjdGVkLHRoaXMub3BlcmF0b3I9dC5vcGVyYXRvcix0Lm1lc3NhZ2U/KHRoaXMubWVzc2FnZT10Lm1lc3NhZ2UsdGhpcy5nZW5lcmF0ZWRNZXNzYWdlPSExKToodGhpcy5tZXNzYWdlPWwodGhpcyksdGhpcy5nZW5lcmF0ZWRNZXNzYWdlPSEwKTt2YXIgcj10LnN0YWNrU3RhcnRGdW5jdGlvbnx8cztpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHIpO2Vsc2V7dmFyIGU9bmV3IEVycm9yO2lmKGUuc3RhY2spe3ZhciBuPWUuc3RhY2ssbz11KHIpLGk9bi5pbmRleE9mKFwiXFxuXCIrbyk7aWYoaT49MCl7dmFyIGE9bi5pbmRleE9mKFwiXFxuXCIsaSsxKTtuPW4uc3Vic3RyaW5nKGErMSl9dGhpcy5zdGFjaz1ufX19LHYuaW5oZXJpdHMoXy5Bc3NlcnRpb25FcnJvcixFcnJvciksXy5mYWlsPXMsXy5vaz1wLF8uZXF1YWw9ZnVuY3Rpb24odCxyLGUpe3QhPXImJnModCxyLGUsXCI9PVwiLF8uZXF1YWwpfSxfLm5vdEVxdWFsPWZ1bmN0aW9uKHQscixlKXt0PT1yJiZzKHQscixlLFwiIT1cIixfLm5vdEVxdWFsKX0sXy5kZWVwRXF1YWw9ZnVuY3Rpb24odCxyLGUpe20odCxyLCExKXx8cyh0LHIsZSxcImRlZXBFcXVhbFwiLF8uZGVlcEVxdWFsKX0sXy5kZWVwU3RyaWN0RXF1YWw9ZnVuY3Rpb24odCxyLGUpe20odCxyLCEwKXx8cyh0LHIsZSxcImRlZXBTdHJpY3RFcXVhbFwiLF8uZGVlcFN0cmljdEVxdWFsKX0sXy5ub3REZWVwRXF1YWw9ZnVuY3Rpb24odCxyLGUpe20odCxyLCExKSYmcyh0LHIsZSxcIm5vdERlZXBFcXVhbFwiLF8ubm90RGVlcEVxdWFsKX0sXy5ub3REZWVwU3RyaWN0RXF1YWw9YixfLnN0cmljdEVxdWFsPWZ1bmN0aW9uKHQscixlKXt0IT09ciYmcyh0LHIsZSxcIj09PVwiLF8uc3RyaWN0RXF1YWwpfSxfLm5vdFN0cmljdEVxdWFsPWZ1bmN0aW9uKHQscixlKXt0PT09ciYmcyh0LHIsZSxcIiE9PVwiLF8ubm90U3RyaWN0RXF1YWwpfSxfLnRocm93cz1mdW5jdGlvbih0LHIsZSl7ZCghMCx0LHIsZSl9LF8uZG9lc05vdFRocm93PWZ1bmN0aW9uKHQscixlKXtkKCExLHQscixlKX0sXy5pZkVycm9yPWZ1bmN0aW9uKHQpe2lmKHQpdGhyb3cgdH07dmFyIEE9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3ZhciByPVtdO2Zvcih2YXIgZSBpbiB0KXcuY2FsbCh0LGUpJiZyLnB1c2goZSk7cmV0dXJuIHJ9fSkuY2FsbChyLGUoNSkpfSxmdW5jdGlvbih0LHIsZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIHI9MCxlPUFycmF5KHQubGVuZ3RoKTtyPHQubGVuZ3RoO3IrKyllW3JdPXRbcl07cmV0dXJuIGV9cmV0dXJuIEFycmF5LmZyb20odCl9dmFyIG89KGUoMCksXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pO3IuYT1mdW5jdGlvbih0KXtpZihcIm9iamVjdFwiIT09byh0LmFtcFNwZWN0cnVtKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVmFsaWQgYW1wU3BlY3RydW0gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgY2hyb21hXCIpO2lmKFwib2JqZWN0XCIhPT1vKHQuY2hyb21hRmlsdGVyQmFuaykpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlZhbGlkIGNocm9tYUZpbHRlckJhbmsgaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgY2hyb21hXCIpO3ZhciByPXQuY2hyb21hRmlsdGVyQmFuay5tYXAoZnVuY3Rpb24ocixlKXtyZXR1cm4gdC5hbXBTcGVjdHJ1bS5yZWR1Y2UoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0K2UqcltuXX0sMCl9KSxlPU1hdGgubWF4LmFwcGx5KE1hdGgsbihyKSk7cmV0dXJuIGU/ci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQvZX0pOnJ9fSxmdW5jdGlvbih0LHIsZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZSg3KSxvPShlLm4obiksXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pO3IuYT1mdW5jdGlvbigpe2lmKFwib2JqZWN0XCIhPT1vKGFyZ3VtZW50c1swXS5zaWduYWwpKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciB0PTAscj0wO3I8YXJndW1lbnRzWzBdLnNpZ25hbC5sZW5ndGg7cisrKXQrPU1hdGgucG93KE1hdGguYWJzKGFyZ3VtZW50c1swXS5zaWduYWxbcl0pLDIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxyLGUpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoMyksbz0oZSgwKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSksaT1lKDI2KTtyLmE9ZnVuY3Rpb24odCl7aWYoXCJvYmplY3RcIiE9PW8odC5hbXBTcGVjdHJ1bSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlZhbGlkIGFtcFNwZWN0cnVtIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIE1GQ0NcIik7aWYoXCJvYmplY3RcIiE9PW8odC5tZWxGaWx0ZXJCYW5rKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVmFsaWQgbWVsRmlsdGVyQmFuayBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSBNRkNDXCIpO2Zvcih2YXIgcj1lLmkobi5hKSh0KSxhPXQubWVsRmlsdGVyQmFuay5sZW5ndGgsdT1BcnJheShhKSxjPW5ldyBGbG9hdDMyQXJyYXkoYSksZj0wO2Y8Yy5sZW5ndGg7ZisrKXt1W2ZdPW5ldyBGbG9hdDMyQXJyYXkodC5idWZmZXJTaXplLzIpLGNbZl09MDtmb3IodmFyIGw9MDtsPHQuYnVmZmVyU2l6ZS8yO2wrKyl1W2ZdW2xdPXQubWVsRmlsdGVyQmFua1tmXVtsXSpyW2xdLGNbZl0rPXVbZl1bbF07Y1tmXT1NYXRoLmxvZyhjW2ZdKzEpfXZhciBzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMpO3JldHVybiBpKHMpLnNsaWNlKDAsMTMpfX0sZnVuY3Rpb24odCxyLGUpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoMiksbz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fTtyLmE9ZnVuY3Rpb24oKXtpZihcIm9iamVjdFwiIT09byhhcmd1bWVudHNbMF0uc2lnbmFsKSl0aHJvdyBuZXcgVHlwZUVycm9yO2Zvcih2YXIgdD1lLmkobi5hKShhcmd1bWVudHNbMF0pLHI9dC5zcGVjaWZpYyxpPTAsYT0wO2E8ci5sZW5ndGg7YSsrKWkrPWE8MTU/KGErMSkqclthKzFdOi4wNjYqTWF0aC5leHAoLjE3MSooYSsxKSk7cmV0dXJuIGkqPS4xMS90LnRvdGFsfX0sZnVuY3Rpb24odCxyLGUpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoMiksbz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fTtyLmE9ZnVuY3Rpb24oKXtpZihcIm9iamVjdFwiIT09byhhcmd1bWVudHNbMF0uc2lnbmFsKSl0aHJvdyBuZXcgVHlwZUVycm9yO2Zvcih2YXIgdD1lLmkobi5hKShhcmd1bWVudHNbMF0pLHI9MCxpPTA7aTx0LnNwZWNpZmljLmxlbmd0aDtpKyspdC5zcGVjaWZpY1tpXT5yJiYocj10LnNwZWNpZmljW2ldKTtyZXR1cm4gTWF0aC5wb3coKHQudG90YWwtcikvdC50b3RhbCwyKX19LGZ1bmN0aW9uKHQscixlKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fTtyLmE9ZnVuY3Rpb24odCl7aWYoXCJvYmplY3RcIiE9PW4odC5zaWduYWwpKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciByPTAsZT0wO2U8dC5zaWduYWwubGVuZ3RoO2UrKylyKz1NYXRoLnBvdyh0LnNpZ25hbFtlXSwyKTtyZXR1cm4gci89dC5zaWduYWwubGVuZ3RoLHI9TWF0aC5zcXJ0KHIpfX0sZnVuY3Rpb24odCxyLGUpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoMSksbz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fTtyLmE9ZnVuY3Rpb24oKXtpZihcIm9iamVjdFwiIT09byhhcmd1bWVudHNbMF0uYW1wU3BlY3RydW0pKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIGUuaShuLmEpKDEsYXJndW1lbnRzWzBdLmFtcFNwZWN0cnVtKX19LGZ1bmN0aW9uKHQscixlKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fTtyLmE9ZnVuY3Rpb24oKXtpZihcIm9iamVjdFwiIT09bihhcmd1bWVudHNbMF0uYW1wU3BlY3RydW0pKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciB0PTAscj0wLGU9MDtlPGFyZ3VtZW50c1swXS5hbXBTcGVjdHJ1bS5sZW5ndGg7ZSsrKXQrPU1hdGgubG9nKGFyZ3VtZW50c1swXS5hbXBTcGVjdHJ1bVtlXSkscis9YXJndW1lbnRzWzBdLmFtcFNwZWN0cnVtW2VdO3JldHVybiBNYXRoLmV4cCh0L2FyZ3VtZW50c1swXS5hbXBTcGVjdHJ1bS5sZW5ndGgpKmFyZ3VtZW50c1swXS5hbXBTcGVjdHJ1bS5sZW5ndGgvcn19LGZ1bmN0aW9uKHQscixlKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fTtyLmE9ZnVuY3Rpb24odCl7aWYoXCJvYmplY3RcIiE9PW4odC5zaWduYWwpfHxcIm9iamVjdFwiIT1uKHQucHJldmlvdXNTaWduYWwpKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciByPTAsZT0tdC5idWZmZXJTaXplLzI7ZTxzaWduYWwubGVuZ3RoLzItMTtlKyspeD1NYXRoLmFicyh0LnNpZ25hbFtlXSktTWF0aC5hYnModC5wcmV2aW91c1NpZ25hbFtlXSkscis9KHgrTWF0aC5hYnMoeCkpLzI7cmV0dXJuIHJ9fSxmdW5jdGlvbih0LHIsZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZSgxKSxvPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9O3IuYT1mdW5jdGlvbigpe2lmKFwib2JqZWN0XCIhPT1vKGFyZ3VtZW50c1swXS5hbXBTcGVjdHJ1bSkpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgdD1hcmd1bWVudHNbMF0uYW1wU3BlY3RydW0scj1lLmkobi5hKSgxLHQpLGk9ZS5pKG4uYSkoMix0KSxhPWUuaShuLmEpKDMsdCksdT1lLmkobi5hKSg0LHQpO3JldHVybigtMypNYXRoLnBvdyhyLDQpKzYqcippLTQqciphK3UpL01hdGgucG93KE1hdGguc3FydChpLU1hdGgucG93KHIsMikpLDQpfX0sZnVuY3Rpb24odCxyLGUpe1widXNlIHN0cmljdFwiO3ZhciBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9O3IuYT1mdW5jdGlvbigpe2lmKFwib2JqZWN0XCIhPT1uKGFyZ3VtZW50c1swXS5hbXBTcGVjdHJ1bSkpdGhyb3cgbmV3IFR5cGVFcnJvcjtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLmFtcFNwZWN0cnVtLHI9YXJndW1lbnRzWzBdLnNhbXBsZVJhdGUvKDIqKHQubGVuZ3RoLTEpKSxlPTAsbz0wO288dC5sZW5ndGg7bysrKWUrPXRbb107Zm9yKHZhciBpPS45OSplLGE9dC5sZW5ndGgtMTtlPmkmJmE+PTA7KWUtPXRbYV0sLS1hO3JldHVybihhKzEpKnJ9fSxmdW5jdGlvbih0LHIsZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZSgxKSxvPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9O3IuYT1mdW5jdGlvbih0KXtpZihcIm9iamVjdFwiIT09byh0LmFtcFNwZWN0cnVtKSl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciByPWUuaShuLmEpKDEsdC5hbXBTcGVjdHJ1bSksaT1lLmkobi5hKSgyLHQuYW1wU3BlY3RydW0pLGE9ZS5pKG4uYSkoMyx0LmFtcFNwZWN0cnVtKTtyZXR1cm4oMipNYXRoLnBvdyhyLDMpLTMqcippK2EpL01hdGgucG93KE1hdGguc3FydChpLU1hdGgucG93KHIsMikpLDMpfX0sZnVuY3Rpb24odCxyLGUpe1widXNlIHN0cmljdFwiO3ZhciBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9O3IuYT1mdW5jdGlvbih0KXtpZihcIm9iamVjdFwiIT09bih0LmFtcFNwZWN0cnVtKSl0aHJvdyBuZXcgVHlwZUVycm9yO2Zvcih2YXIgcj0wLGU9MCxvPW5ldyBGbG9hdDMyQXJyYXkodC5hbXBTcGVjdHJ1bS5sZW5ndGgpLGk9MCxhPTAsdT0wO3U8dC5hbXBTcGVjdHJ1bS5sZW5ndGg7dSsrKXtyKz10LmFtcFNwZWN0cnVtW3VdO3ZhciBjPXUqdC5zYW1wbGVSYXRlL3QuYnVmZmVyU2l6ZTtvW3VdPWMsaSs9YypjLGUrPWMsYSs9Yyp0LmFtcFNwZWN0cnVtW3VdfXJldHVybih0LmFtcFNwZWN0cnVtLmxlbmd0aCphLWUqcikvKHIqKGktTWF0aC5wb3coZSwyKSkpfX0sZnVuY3Rpb24odCxyLGUpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoMSksbz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fTtyLmE9ZnVuY3Rpb24odCl7aWYoXCJvYmplY3RcIiE9PW8odC5hbXBTcGVjdHJ1bSkpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gTWF0aC5zcXJ0KGUuaShuLmEpKDIsdC5hbXBTcGVjdHJ1bSktTWF0aC5wb3coZS5pKG4uYSkoMSx0LmFtcFNwZWN0cnVtKSwyKSl9fSxmdW5jdGlvbih0LHIsZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH07ci5hPWZ1bmN0aW9uKCl7aWYoXCJvYmplY3RcIiE9PW4oYXJndW1lbnRzWzBdLnNpZ25hbCkpdGhyb3cgbmV3IFR5cGVFcnJvcjtmb3IodmFyIHQ9MCxyPTA7cjxhcmd1bWVudHNbMF0uc2lnbmFsLmxlbmd0aDtyKyspKGFyZ3VtZW50c1swXS5zaWduYWxbcl0+PTAmJmFyZ3VtZW50c1swXS5zaWduYWxbcisxXTwwfHxhcmd1bWVudHNbMF0uc2lnbmFsW3JdPDAmJmFyZ3VtZW50c1swXS5zaWduYWxbcisxXT49MCkmJnQrKztyZXR1cm4gdH19LGZ1bmN0aW9uKHQscixlKXt0LmV4cG9ydHM9ZSg2KS5kZWZhdWx0fSxmdW5jdGlvbih0LHIsZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZS5kKHIsXCJhXCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO3ZhciBvPWUoMCksaT1lKDQpLGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQscil7Zm9yKHZhciBlPTA7ZTxyLmxlbmd0aDtlKyspe3ZhciBuPXJbZV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24ocixlLG4pe3JldHVybiBlJiZ0KHIucHJvdG90eXBlLGUpLG4mJnQocixuKSxyfX0oKSx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChyLGUpe3ZhciBhPXRoaXM7aWYobih0aGlzLHQpLHRoaXMuX209ZSwhci5hdWRpb0NvbnRleHQpdGhyb3cgdGhpcy5fbS5lcnJvcnMubm9BQztpZihyLmJ1ZmZlclNpemUmJiFvLmIoci5idWZmZXJTaXplKSl0aHJvdyB0aGlzLl9tLl9lcnJvcnMubm90UG93MjtpZighci5zb3VyY2UpdGhyb3cgdGhpcy5fbS5fZXJyb3JzLm5vU291cmNlO3RoaXMuX20uYXVkaW9Db250ZXh0PXIuYXVkaW9Db250ZXh0LHRoaXMuX20uYnVmZmVyU2l6ZT1yLmJ1ZmZlclNpemV8fHRoaXMuX20uYnVmZmVyU2l6ZXx8MjU2LHRoaXMuX20uaG9wU2l6ZT1yLmhvcFNpemV8fHRoaXMuX20uaG9wU2l6ZXx8dGhpcy5fbS5idWZmZXJTaXplLHRoaXMuX20uc2FtcGxlUmF0ZT1yLnNhbXBsZVJhdGV8fHRoaXMuX20uYXVkaW9Db250ZXh0LnNhbXBsZVJhdGV8fDQ0MTAwLHRoaXMuX20uY2FsbGJhY2s9ci5jYWxsYmFjayx0aGlzLl9tLndpbmRvd2luZ0Z1bmN0aW9uPXIud2luZG93aW5nRnVuY3Rpb258fFwiaGFubmluZ1wiLHRoaXMuX20uZmVhdHVyZUV4dHJhY3RvcnM9aSx0aGlzLl9tLkVYVFJBQ1RJT05fU1RBUlRFRD1yLnN0YXJ0SW1tZWRpYXRlbHl8fCExLHRoaXMuX20uc3BuPXRoaXMuX20uYXVkaW9Db250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3Nvcih0aGlzLl9tLmJ1ZmZlclNpemUsMSwxKSx0aGlzLl9tLnNwbi5jb25uZWN0KHRoaXMuX20uYXVkaW9Db250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLl9tLl9mZWF0dXJlc1RvRXh0cmFjdD1yLmZlYXR1cmVFeHRyYWN0b3JzfHxbXSx0aGlzLl9tLmJhcmtTY2FsZT1vLmModGhpcy5fbS5idWZmZXJTaXplLHRoaXMuX20uc2FtcGxlUmF0ZSx0aGlzLl9tLmJ1ZmZlclNpemUpLHRoaXMuX20ubWVsRmlsdGVyQmFuaz1vLmQodGhpcy5fbS5tZWxCYW5kcyx0aGlzLl9tLnNhbXBsZVJhdGUsdGhpcy5fbS5idWZmZXJTaXplKSx0aGlzLl9tLmlucHV0RGF0YT1udWxsLHRoaXMuX20ucHJldmlvdXNJbnB1dERhdGE9bnVsbCx0aGlzLl9tLmZyYW1lPW51bGwsdGhpcy5fbS5wcmV2aW91c0ZyYW1lPW51bGwsdGhpcy5zZXRTb3VyY2Uoci5zb3VyY2UpLHRoaXMuX20uc3BuLm9uYXVkaW9wcm9jZXNzPWZ1bmN0aW9uKHQpe2lmKG51bGwhPT1hLl9tLmlucHV0RGF0YSYmKGEuX20ucHJldmlvdXNJbnB1dERhdGE9YS5fbS5pbnB1dERhdGEpLGEuX20uaW5wdXREYXRhPXQuaW5wdXRCdWZmZXIuZ2V0Q2hhbm5lbERhdGEoMCksYS5fbS5wcmV2aW91c0lucHV0RGF0YSl7dmFyIHI9bmV3IEZsb2F0MzJBcnJheShhLl9tLnByZXZpb3VzSW5wdXREYXRhLmxlbmd0aCthLl9tLmlucHV0RGF0YS5sZW5ndGgtYS5fbS5ob3BTaXplKTtyLnNldChhLl9tLnByZXZpb3VzSW5wdXREYXRhLnNsaWNlKGEuX20uaG9wU2l6ZSkpLHIuc2V0KGEuX20uaW5wdXREYXRhLGEuX20ucHJldmlvdXNJbnB1dERhdGEubGVuZ3RoLWEuX20uaG9wU2l6ZSl9ZWxzZSB2YXIgcj1hLl9tLmlucHV0RGF0YTtvLmcocixhLl9tLmJ1ZmZlclNpemUsYS5fbS5ob3BTaXplKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2EuX20uZnJhbWU9dDt2YXIgcj1hLl9tLmV4dHJhY3QoYS5fbS5fZmVhdHVyZXNUb0V4dHJhY3QsYS5fbS5mcmFtZSxhLl9tLnByZXZpb3VzRnJhbWUpO1wiZnVuY3Rpb25cIj09dHlwZW9mIGEuX20uY2FsbGJhY2smJmEuX20uRVhUUkFDVElPTl9TVEFSVEVEJiZhLl9tLmNhbGxiYWNrKHIpLGEuX20ucHJldmlvdXNGcmFtZT1hLl9tLmZyYW1lfSl9fXJldHVybiBhKHQsW3trZXk6XCJzdGFydFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuX20uX2ZlYXR1cmVzVG9FeHRyYWN0PXR8fHRoaXMuX20uX2ZlYXR1cmVzVG9FeHRyYWN0LHRoaXMuX20uRVhUUkFDVElPTl9TVEFSVEVEPSEwfX0se2tleTpcInN0b3BcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX20uRVhUUkFDVElPTl9TVEFSVEVEPSExfX0se2tleTpcInNldFNvdXJjZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3QuY29ubmVjdCh0aGlzLl9tLnNwbil9fSx7a2V5OlwiZ2V0XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX20uaW5wdXREYXRhP3RoaXMuX20uZXh0cmFjdCh0fHx0aGlzLl9tLl9mZWF0dXJlc1RvRXh0cmFjdCx0aGlzLl9tLmlucHV0RGF0YSx0aGlzLl9tLnByZXZpb3VzSW5wdXREYXRhKTpudWxsfX1dKSx0fSgpfSxmdW5jdGlvbih0LHIsZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIHI9bmV3IEZsb2F0MzJBcnJheSh0KSxlPTIqTWF0aC5QSS8odC0xKSxuPTIqZSxvPTA7bzx0LzI7bysrKXJbb109LjQyLS41Kk1hdGguY29zKG8qZSkrLjA4Kk1hdGguY29zKG8qbik7Zm9yKHZhciBpPXQvMjtpPjA7aS0tKXJbdC1pXT1yW2ktMV07cmV0dXJuIHJ9ZnVuY3Rpb24gbyh0KXtmb3IodmFyIHI9TWF0aC5QSS8odC0xKSxlPW5ldyBGbG9hdDMyQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1NYXRoLnNpbihyKm4pO3JldHVybiBlfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciByPW5ldyBGbG9hdDMyQXJyYXkodCksZT0wO2U8dDtlKyspcltlXT0uNS0uNSpNYXRoLmNvcygyKk1hdGguUEkqZS8odC0xKSk7cmV0dXJuIHJ9ZnVuY3Rpb24gYSh0KXtmb3IodmFyIHI9bmV3IEZsb2F0MzJBcnJheSh0KSxlPTA7ZTx0O2UrKylyW2VdPS41NC0uNDYqTWF0aC5jb3MoMipNYXRoLlBJKihlL3QtMSkpO3JldHVybiByfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHIuYmxhY2ttYW49bixyLnNpbmU9byxyLmhhbm5pbmc9aSxyLmhhbW1pbmc9YX0sZnVuY3Rpb24odCxyLGUpe3QuZXhwb3J0cz1lKDI3KX0sZnVuY3Rpb24odCxyKXtmdW5jdGlvbiBlKHQscil7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIHI9cnx8Mixjb3NNYXAmJmNvc01hcFtlXXx8bihlKSx0Lm1hcChmdW5jdGlvbigpe3JldHVybiAwfSkubWFwKGZ1bmN0aW9uKG4sbyl7cmV0dXJuIHIqdC5yZWR1Y2UoZnVuY3Rpb24odCxyLG4saSl7cmV0dXJuIHQrcipjb3NNYXBbZV1bbitvKmVdfSwwKX0pfWNvc01hcD1udWxsO3ZhciBuPWZ1bmN0aW9uKHQpe2Nvc01hcD1jb3NNYXB8fHt9LGNvc01hcFt0XT1uZXcgQXJyYXkodCp0KTtmb3IodmFyIHI9TWF0aC5QSS90LGU9MDtlPHQ7ZSsrKWZvcih2YXIgbj0wO248dDtuKyspY29zTWFwW3RdW24rZSp0XT1NYXRoLmNvcyhyKihuKy41KSplKX07dC5leHBvcnRzPWV9LGZ1bmN0aW9uKHQscixlKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1lKDI5KSxvPWZ1bmN0aW9uKHQpe3ZhciByPXt9O3ZvaWQgMD09PXQucmVhbHx8dm9pZCAwPT09dC5pbWFnP3I9bi5jb25zdHJ1Y3RDb21wbGV4QXJyYXkodCk6KHIucmVhbD10LnJlYWwuc2xpY2UoKSxyLmltYWc9dC5pbWFnLnNsaWNlKCkpO3ZhciBlPXIucmVhbC5sZW5ndGgsbz1NYXRoLmxvZzIoZSk7aWYoTWF0aC5yb3VuZChvKSE9byl0aHJvdyBuZXcgRXJyb3IoXCJJbnB1dCBzaXplIG11c3QgYmUgYSBwb3dlciBvZiAyLlwiKTtpZihyLnJlYWwubGVuZ3RoIT1yLmltYWcubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIlJlYWwgYW5kIGltYWdpbmFyeSBjb21wb25lbnRzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguXCIpO2Zvcih2YXIgaT1uLmJpdFJldmVyc2VBcnJheShlKSxhPXtyZWFsOltdLGltYWc6W119LHU9MDt1PGU7dSsrKWEucmVhbFtpW3VdXT1yLnJlYWxbdV0sYS5pbWFnW2lbdV1dPXIuaW1hZ1t1XTtmb3IodmFyIGM9MDtjPGU7YysrKXIucmVhbFtjXT1hLnJlYWxbY10sci5pbWFnW2NdPWEuaW1hZ1tjXTtmb3IodmFyIGY9MTtmPD1vO2YrKylmb3IodmFyIGw9TWF0aC5wb3coMixmKSxzPTA7czxsLzI7cysrKWZvcih2YXIgcD1uLmV1bGVyKHMsbCksbT0wO208ZS9sO20rKyl7dmFyIHk9bCptK3MsaD1sKm0rcytsLzIsYj17cmVhbDpyLnJlYWxbeV0saW1hZzpyLmltYWdbeV19LGc9e3JlYWw6ci5yZWFsW2hdLGltYWc6ci5pbWFnW2hdfSxTPW4ubXVsdGlwbHkocCxnKSxkPW4uc3VidHJhY3QoYixTKTtyLnJlYWxbaF09ZC5yZWFsLHIuaW1hZ1toXT1kLmltYWc7dmFyIHY9bi5hZGQoUyxiKTtyLnJlYWxbeV09di5yZWFsLHIuaW1hZ1t5XT12LmltYWd9cmV0dXJuIHJ9LGk9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dC5yZWFsfHx2b2lkIDA9PT10LmltYWcpdGhyb3cgbmV3IEVycm9yKFwiSUZGVCBvbmx5IGFjY2VwdHMgYSBjb21wbGV4IGlucHV0LlwiKTtmb3IodmFyIHI9dC5yZWFsLmxlbmd0aCxlPXtyZWFsOltdLGltYWc6W119LGk9MDtpPHI7aSsrKXt2YXIgYT17cmVhbDp0LnJlYWxbaV0saW1hZzp0LmltYWdbaV19LHU9bi5jb25qKGEpO2UucmVhbFtpXT11LnJlYWwsZS5pbWFnW2ldPXUuaW1hZ312YXIgYz1vKGUpO3JldHVybiBlLnJlYWw9Yy5yZWFsLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC9yfSksZS5pbWFnPWMuaW1hZy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQvcn0pLGV9O3QuZXhwb3J0cz17ZmZ0Om8saWZmdDppfX0sZnVuY3Rpb24odCxyLGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciByPTAsZT1BcnJheSh0Lmxlbmd0aCk7cjx0Lmxlbmd0aDtyKyspZVtyXT10W3JdO3JldHVybiBlfXJldHVybiBBcnJheS5mcm9tKHQpfXZhciBvPXt9LGk9e30sYT1mdW5jdGlvbih0KXt2YXIgcj17fTtyLnJlYWw9dm9pZCAwPT09dC5yZWFsP3Quc2xpY2UoKTp0LnJlYWwuc2xpY2UoKTt2YXIgZT1yLnJlYWwubGVuZ3RoO3JldHVybiB2b2lkIDA9PT1pW2VdJiYoaVtlXT1BcnJheS5hcHBseShudWxsLEFycmF5KGUpKS5tYXAoTnVtYmVyLnByb3RvdHlwZS52YWx1ZU9mLDApKSxyLmltYWc9aVtlXS5zbGljZSgpLHJ9LHU9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09b1t0XSl7Zm9yKHZhciByPSh0LTEpLnRvU3RyaW5nKDIpLmxlbmd0aCxlPVwiMFwiLnJlcGVhdChyKSxpPXt9LGE9MDthPHQ7YSsrKXt2YXIgdT1hLnRvU3RyaW5nKDIpO3U9ZS5zdWJzdHIodS5sZW5ndGgpK3UsdT1bXS5jb25jYXQobih1KSkucmV2ZXJzZSgpLmpvaW4oXCJcIiksaVthXT1wYXJzZUludCh1LDIpfW9bdF09aX1yZXR1cm4gb1t0XX0sYz1mdW5jdGlvbih0LHIpe3JldHVybntyZWFsOnQucmVhbCpyLnJlYWwtdC5pbWFnKnIuaW1hZyxpbWFnOnQucmVhbCpyLmltYWcrdC5pbWFnKnIucmVhbH19LGY9ZnVuY3Rpb24odCxyKXtyZXR1cm57cmVhbDp0LnJlYWwrci5yZWFsLGltYWc6dC5pbWFnK3IuaW1hZ319LGw9ZnVuY3Rpb24odCxyKXtyZXR1cm57cmVhbDp0LnJlYWwtci5yZWFsLGltYWc6dC5pbWFnLXIuaW1hZ319LHM9ZnVuY3Rpb24odCxyKXt2YXIgZT0tMipNYXRoLlBJKnQvcjtyZXR1cm57cmVhbDpNYXRoLmNvcyhlKSxpbWFnOk1hdGguc2luKGUpfX0scD1mdW5jdGlvbih0KXtyZXR1cm4gdC5pbWFnKj0tMSx0fTt0LmV4cG9ydHM9e2JpdFJldmVyc2VBcnJheTp1LG11bHRpcGx5OmMsYWRkOmYsc3VidHJhY3Q6bCxldWxlcjpzLGNvbmo6cCxjb25zdHJ1Y3RDb21wbGV4QXJyYXk6YX19LGZ1bmN0aW9uKHQscil7ZnVuY3Rpb24gZSgpe3Rocm93IG5ldyBFcnJvcihcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIil9ZnVuY3Rpb24gbigpe3Rocm93IG5ldyBFcnJvcihcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKX1mdW5jdGlvbiBvKHQpe2lmKGw9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KHQsMCk7aWYoKGw9PT1lfHwhbCkmJnNldFRpbWVvdXQpcmV0dXJuIGw9c2V0VGltZW91dCxzZXRUaW1lb3V0KHQsMCk7dHJ5e3JldHVybiBsKHQsMCl9Y2F0Y2gocil7dHJ5e3JldHVybiBsLmNhbGwobnVsbCx0LDApfWNhdGNoKHIpe3JldHVybiBsLmNhbGwodGhpcyx0LDApfX19ZnVuY3Rpb24gaSh0KXtpZihzPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKHM9PT1ufHwhcykmJmNsZWFyVGltZW91dClyZXR1cm4gcz1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHQpO3RyeXtyZXR1cm4gcyh0KX1jYXRjaChyKXt0cnl7cmV0dXJuIHMuY2FsbChudWxsLHQpfWNhdGNoKHIpe3JldHVybiBzLmNhbGwodGhpcyx0KX19fWZ1bmN0aW9uIGEoKXtoJiZtJiYoaD0hMSxtLmxlbmd0aD95PW0uY29uY2F0KHkpOmI9LTEseS5sZW5ndGgmJnUoKSl9ZnVuY3Rpb24gdSgpe2lmKCFoKXt2YXIgdD1vKGEpO2g9ITA7Zm9yKHZhciByPXkubGVuZ3RoO3I7KXtmb3IobT15LHk9W107KytiPHI7KW0mJm1bYl0ucnVuKCk7Yj0tMSxyPXkubGVuZ3RofW09bnVsbCxoPSExLGkodCl9fWZ1bmN0aW9uIGModCxyKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9cn1mdW5jdGlvbiBmKCl7fXZhciBsLHMscD10LmV4cG9ydHM9e307IWZ1bmN0aW9uKCl7dHJ5e2w9XCJmdW5jdGlvblwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmV9Y2F0Y2godCl7bD1lfXRyeXtzPVwiZnVuY3Rpb25cIj09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6bn1jYXRjaCh0KXtzPW59fSgpO3ZhciBtLHk9W10saD0hMSxiPS0xO3AubmV4dFRpY2s9ZnVuY3Rpb24odCl7dmFyIHI9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspcltlLTFdPWFyZ3VtZW50c1tlXTt5LnB1c2gobmV3IGModCxyKSksMSE9PXkubGVuZ3RofHxofHxvKHUpfSxjLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxwLnRpdGxlPVwiYnJvd3NlclwiLHAuYnJvd3Nlcj0hMCxwLmVudj17fSxwLmFyZ3Y9W10scC52ZXJzaW9uPVwiXCIscC52ZXJzaW9ucz17fSxwLm9uPWYscC5hZGRMaXN0ZW5lcj1mLHAub25jZT1mLHAub2ZmPWYscC5yZW1vdmVMaXN0ZW5lcj1mLHAucmVtb3ZlQWxsTGlzdGVuZXJzPWYscC5lbWl0PWYscC5wcmVwZW5kTGlzdGVuZXI9ZixwLnByZXBlbmRPbmNlTGlzdGVuZXI9ZixwLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm5bXX0scC5iaW5kaW5nPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXCIpfSxwLmN3ZD1mdW5jdGlvbigpe3JldHVyblwiL1wifSxwLmNoZGlyPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFwiKX0scC51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0sZnVuY3Rpb24odCxyKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3Quc3VwZXJfPXIsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9OnQuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3Quc3VwZXJfPXI7dmFyIGU9ZnVuY3Rpb24oKXt9O2UucHJvdG90eXBlPXIucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyBlLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9fSxmdW5jdGlvbih0LHIpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJvYmplY3RcIj09dHlwZW9mIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuY29weSYmXCJmdW5jdGlvblwiPT10eXBlb2YgdC5maWxsJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnJlYWRVSW50OH19LGZ1bmN0aW9uKHQscixlKXsoZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBvKHQsZSl7dmFyIG49e3NlZW46W10sc3R5bGl6ZTphfTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKG4uZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYobi5jb2xvcnM9YXJndW1lbnRzWzNdKSxoKGUpP24uc2hvd0hpZGRlbj1lOmUmJnIuX2V4dGVuZChuLGUpLHcobi5zaG93SGlkZGVuKSYmKG4uc2hvd0hpZGRlbj0hMSksdyhuLmRlcHRoKSYmKG4uZGVwdGg9MiksdyhuLmNvbG9ycykmJihuLmNvbG9ycz0hMSksdyhuLmN1c3RvbUluc3BlY3QpJiYobi5jdXN0b21JbnNwZWN0PSEwKSxuLmNvbG9ycyYmKG4uc3R5bGl6ZT1pKSxjKG4sdCxuLmRlcHRoKX1mdW5jdGlvbiBpKHQscil7dmFyIGU9by5zdHlsZXNbcl07cmV0dXJuIGU/XCJcdTAwMWJbXCIrby5jb2xvcnNbZV1bMF0rXCJtXCIrdCtcIlx1MDAxYltcIitvLmNvbG9yc1tlXVsxXStcIm1cIjp0fWZ1bmN0aW9uIGEodCxyKXtyZXR1cm4gdH1mdW5jdGlvbiB1KHQpe3ZhciByPXt9O3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCxlKXtyW3RdPSEwfSkscn1mdW5jdGlvbiBjKHQsZSxuKXtpZih0LmN1c3RvbUluc3BlY3QmJmUmJkEoZS5pbnNwZWN0KSYmZS5pbnNwZWN0IT09ci5pbnNwZWN0JiYoIWUuY29uc3RydWN0b3J8fGUuY29uc3RydWN0b3IucHJvdG90eXBlIT09ZSkpe3ZhciBvPWUuaW5zcGVjdChuLHQpO3JldHVybiBkKG8pfHwobz1jKHQsbyxuKSksb312YXIgaT1mKHQsZSk7aWYoaSlyZXR1cm4gaTt2YXIgYT1PYmplY3Qua2V5cyhlKSxoPXUoYSk7aWYodC5zaG93SGlkZGVuJiYoYT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksTShlKSYmKGEuaW5kZXhPZihcIm1lc3NhZ2VcIik+PTB8fGEuaW5kZXhPZihcImRlc2NyaXB0aW9uXCIpPj0wKSlyZXR1cm4gbChlKTtpZigwPT09YS5sZW5ndGgpe2lmKEEoZSkpe3ZhciBiPWUubmFtZT9cIjogXCIrZS5uYW1lOlwiXCI7cmV0dXJuIHQuc3R5bGl6ZShcIltGdW5jdGlvblwiK2IrXCJdXCIsXCJzcGVjaWFsXCIpfWlmKHgoZSkpcmV0dXJuIHQuc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksXCJyZWdleHBcIik7aWYoXyhlKSlyZXR1cm4gdC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksXCJkYXRlXCIpO2lmKE0oZSkpcmV0dXJuIGwoZSl9dmFyIGc9XCJcIixTPSExLHY9W1wie1wiLFwifVwiXTtpZih5KGUpJiYoUz0hMCx2PVtcIltcIixcIl1cIl0pLEEoZSkpe2c9XCIgW0Z1bmN0aW9uXCIrKGUubmFtZT9cIjogXCIrZS5uYW1lOlwiXCIpK1wiXVwifWlmKHgoZSkmJihnPVwiIFwiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSksXyhlKSYmKGc9XCIgXCIrRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbChlKSksTShlKSYmKGc9XCIgXCIrbChlKSksMD09PWEubGVuZ3RoJiYoIVN8fDA9PWUubGVuZ3RoKSlyZXR1cm4gdlswXStnK3ZbMV07aWYobjwwKXJldHVybiB4KGUpP3Quc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksXCJyZWdleHBcIik6dC5zdHlsaXplKFwiW09iamVjdF1cIixcInNwZWNpYWxcIik7dC5zZWVuLnB1c2goZSk7dmFyIHc7cmV0dXJuIHc9Uz9zKHQsZSxuLGgsYSk6YS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHAodCxlLG4saCxyLFMpfSksdC5zZWVuLnBvcCgpLG0odyxnLHYpfWZ1bmN0aW9uIGYodCxyKXtpZih3KHIpKXJldHVybiB0LnN0eWxpemUoXCJ1bmRlZmluZWRcIixcInVuZGVmaW5lZFwiKTtpZihkKHIpKXt2YXIgZT1cIidcIitKU09OLnN0cmluZ2lmeShyKS5yZXBsYWNlKC9eXCJ8XCIkL2csXCJcIikucmVwbGFjZSgvJy9nLFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csJ1wiJykrXCInXCI7cmV0dXJuIHQuc3R5bGl6ZShlLFwic3RyaW5nXCIpfXJldHVybiBTKHIpP3Quc3R5bGl6ZShcIlwiK3IsXCJudW1iZXJcIik6aChyKT90LnN0eWxpemUoXCJcIityLFwiYm9vbGVhblwiKTpiKHIpP3Quc3R5bGl6ZShcIm51bGxcIixcIm51bGxcIik6dm9pZCAwfWZ1bmN0aW9uIGwodCl7cmV0dXJuXCJbXCIrRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkrXCJdXCJ9ZnVuY3Rpb24gcyh0LHIsZSxuLG8pe2Zvcih2YXIgaT1bXSxhPTAsdT1yLmxlbmd0aDthPHU7KythKXoocixTdHJpbmcoYSkpP2kucHVzaChwKHQscixlLG4sU3RyaW5nKGEpLCEwKSk6aS5wdXNoKFwiXCIpO3JldHVybiBvLmZvckVhY2goZnVuY3Rpb24obyl7by5tYXRjaCgvXlxcZCskLyl8fGkucHVzaChwKHQscixlLG4sbywhMCkpfSksaX1mdW5jdGlvbiBwKHQscixlLG4sbyxpKXt2YXIgYSx1LGY7aWYoZj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsbyl8fHt2YWx1ZTpyW29dfSxmLmdldD91PWYuc2V0P3Quc3R5bGl6ZShcIltHZXR0ZXIvU2V0dGVyXVwiLFwic3BlY2lhbFwiKTp0LnN0eWxpemUoXCJbR2V0dGVyXVwiLFwic3BlY2lhbFwiKTpmLnNldCYmKHU9dC5zdHlsaXplKFwiW1NldHRlcl1cIixcInNwZWNpYWxcIikpLHoobixvKXx8KGE9XCJbXCIrbytcIl1cIiksdXx8KHQuc2Vlbi5pbmRleE9mKGYudmFsdWUpPDA/KHU9YihlKT9jKHQsZi52YWx1ZSxudWxsKTpjKHQsZi52YWx1ZSxlLTEpLHUuaW5kZXhPZihcIlxcblwiKT4tMSYmKHU9aT91LnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbih0KXtyZXR1cm5cIiAgXCIrdH0pLmpvaW4oXCJcXG5cIikuc3Vic3RyKDIpOlwiXFxuXCIrdS5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuXCIgICBcIit0fSkuam9pbihcIlxcblwiKSkpOnU9dC5zdHlsaXplKFwiW0NpcmN1bGFyXVwiLFwic3BlY2lhbFwiKSksdyhhKSl7aWYoaSYmby5tYXRjaCgvXlxcZCskLykpcmV0dXJuIHU7YT1KU09OLnN0cmluZ2lmeShcIlwiK28pLGEubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pPyhhPWEuc3Vic3RyKDEsYS5sZW5ndGgtMiksYT10LnN0eWxpemUoYSxcIm5hbWVcIikpOihhPWEucmVwbGFjZSgvJy9nLFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csJ1wiJykucmVwbGFjZSgvKF5cInxcIiQpL2csXCInXCIpLGE9dC5zdHlsaXplKGEsXCJzdHJpbmdcIikpfXJldHVybiBhK1wiOiBcIit1fWZ1bmN0aW9uIG0odCxyLGUpe3ZhciBuPTA7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKHQscil7cmV0dXJuIG4rKyxyLmluZGV4T2YoXCJcXG5cIik+PTAmJm4rKyx0K3IucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csXCJcIikubGVuZ3RoKzF9LDApPjYwP2VbMF0rKFwiXCI9PT1yP1wiXCI6citcIlxcbiBcIikrXCIgXCIrdC5qb2luKFwiLFxcbiAgXCIpK1wiIFwiK2VbMV06ZVswXStyK1wiIFwiK3Quam9pbihcIiwgXCIpK1wiIFwiK2VbMV19ZnVuY3Rpb24geSh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KX1mdW5jdGlvbiBoKHQpe3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgdH1mdW5jdGlvbiBiKHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBnKHQpe3JldHVybiBudWxsPT10fWZ1bmN0aW9uIFModCl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIHR9ZnVuY3Rpb24gZCh0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdH1mdW5jdGlvbiB2KHQpe3JldHVyblwic3ltYm9sXCI9PXR5cGVvZiB0fWZ1bmN0aW9uIHcodCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24geCh0KXtyZXR1cm4gRSh0KSYmXCJbb2JqZWN0IFJlZ0V4cF1cIj09PVQodCl9ZnVuY3Rpb24gRSh0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmbnVsbCE9PXR9ZnVuY3Rpb24gXyh0KXtyZXR1cm4gRSh0KSYmXCJbb2JqZWN0IERhdGVdXCI9PT1UKHQpfWZ1bmN0aW9uIE0odCl7cmV0dXJuIEUodCkmJihcIltvYmplY3QgRXJyb3JdXCI9PT1UKHQpfHx0IGluc3RhbmNlb2YgRXJyb3IpfWZ1bmN0aW9uIEEodCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdH1mdW5jdGlvbiBqKHQpe3JldHVybiBudWxsPT09dHx8XCJib29sZWFuXCI9PXR5cGVvZiB0fHxcIm51bWJlclwiPT10eXBlb2YgdHx8XCJzdHJpbmdcIj09dHlwZW9mIHR8fFwic3ltYm9sXCI9PXR5cGVvZiB0fHx2b2lkIDA9PT10fWZ1bmN0aW9uIFQodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBGKHQpe3JldHVybiB0PDEwP1wiMFwiK3QudG9TdHJpbmcoMTApOnQudG9TdHJpbmcoMTApfWZ1bmN0aW9uIGsoKXt2YXIgdD1uZXcgRGF0ZSxyPVtGKHQuZ2V0SG91cnMoKSksRih0LmdldE1pbnV0ZXMoKSksRih0LmdldFNlY29uZHMoKSldLmpvaW4oXCI6XCIpO3JldHVyblt0LmdldERhdGUoKSxSW3QuZ2V0TW9udGgoKV0scl0uam9pbihcIiBcIil9ZnVuY3Rpb24geih0LHIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKX12YXIgTz0vJVtzZGolXS9nO3IuZm9ybWF0PWZ1bmN0aW9uKHQpe2lmKCFkKHQpKXtmb3IodmFyIHI9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspci5wdXNoKG8oYXJndW1lbnRzW2VdKSk7cmV0dXJuIHIuam9pbihcIiBcIil9Zm9yKHZhciBlPTEsbj1hcmd1bWVudHMsaT1uLmxlbmd0aCxhPVN0cmluZyh0KS5yZXBsYWNlKE8sZnVuY3Rpb24odCl7aWYoXCIlJVwiPT09dClyZXR1cm5cIiVcIjtpZihlPj1pKXJldHVybiB0O3N3aXRjaCh0KXtjYXNlXCIlc1wiOnJldHVybiBTdHJpbmcobltlKytdKTtjYXNlXCIlZFwiOnJldHVybiBOdW1iZXIobltlKytdKTtjYXNlXCIlalwiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobltlKytdKX1jYXRjaCh0KXtyZXR1cm5cIltDaXJjdWxhcl1cIn1kZWZhdWx0OnJldHVybiB0fX0pLHU9bltlXTtlPGk7dT1uWysrZV0pYih1KXx8IUUodSk/YSs9XCIgXCIrdTphKz1cIiBcIitvKHUpO3JldHVybiBhfSxyLmRlcHJlY2F0ZT1mdW5jdGlvbihlLG8pe2Z1bmN0aW9uIGkoKXtpZighYSl7aWYobi50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihvKTtuLnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShvKTpjb25zb2xlLmVycm9yKG8pLGE9ITB9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWlmKHcodC5wcm9jZXNzKSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gci5kZXByZWNhdGUoZSxvKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2lmKCEwPT09bi5ub0RlcHJlY2F0aW9uKXJldHVybiBlO3ZhciBhPSExO3JldHVybiBpfTt2YXIgQixEPXt9O3IuZGVidWdsb2c9ZnVuY3Rpb24odCl7aWYodyhCKSYmKEI9bi5lbnYuTk9ERV9ERUJVR3x8XCJcIiksdD10LnRvVXBwZXJDYXNlKCksIURbdF0paWYobmV3IFJlZ0V4cChcIlxcXFxiXCIrdCtcIlxcXFxiXCIsXCJpXCIpLnRlc3QoQikpe3ZhciBlPW4ucGlkO0RbdF09ZnVuY3Rpb24oKXt2YXIgbj1yLmZvcm1hdC5hcHBseShyLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcihcIiVzICVkOiAlc1wiLHQsZSxuKX19ZWxzZSBEW3RdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gRFt0XX0sci5pbnNwZWN0PW8sby5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LG8uc3R5bGVzPXtzcGVjaWFsOlwiY3lhblwiLG51bWJlcjpcInllbGxvd1wiLGJvb2xlYW46XCJ5ZWxsb3dcIix1bmRlZmluZWQ6XCJncmV5XCIsbnVsbDpcImJvbGRcIixzdHJpbmc6XCJncmVlblwiLGRhdGU6XCJtYWdlbnRhXCIscmVnZXhwOlwicmVkXCJ9LHIuaXNBcnJheT15LHIuaXNCb29sZWFuPWgsci5pc051bGw9YixyLmlzTnVsbE9yVW5kZWZpbmVkPWcsci5pc051bWJlcj1TLHIuaXNTdHJpbmc9ZCxyLmlzU3ltYm9sPXYsci5pc1VuZGVmaW5lZD13LHIuaXNSZWdFeHA9eCxyLmlzT2JqZWN0PUUsci5pc0RhdGU9XyxyLmlzRXJyb3I9TSxyLmlzRnVuY3Rpb249QSxyLmlzUHJpbWl0aXZlPWosci5pc0J1ZmZlcj1lKDMyKTt2YXIgUj1bXCJKYW5cIixcIkZlYlwiLFwiTWFyXCIsXCJBcHJcIixcIk1heVwiLFwiSnVuXCIsXCJKdWxcIixcIkF1Z1wiLFwiU2VwXCIsXCJPY3RcIixcIk5vdlwiLFwiRGVjXCJdO3IubG9nPWZ1bmN0aW9uKCl7Y29uc29sZS5sb2coXCIlcyAtICVzXCIsaygpLHIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKSl9LHIuaW5oZXJpdHM9ZSgzMSksci5fZXh0ZW5kPWZ1bmN0aW9uKHQscil7aWYoIXJ8fCFFKHIpKXJldHVybiB0O2Zvcih2YXIgZT1PYmplY3Qua2V5cyhyKSxuPWUubGVuZ3RoO24tLTspdFtlW25dXT1yW2Vbbl1dO3JldHVybiB0fX0pLmNhbGwocixlKDUpLGUoMzApKX1dKX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWV5ZGEubWluLm1hcCIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1vdXNlTGlzdGVuXG5cbnZhciBtb3VzZSA9IHJlcXVpcmUoJ21vdXNlLWV2ZW50JylcblxuZnVuY3Rpb24gbW91c2VMaXN0ZW4gKGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gIGlmICghY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGVsZW1lbnRcbiAgICBlbGVtZW50ID0gd2luZG93XG4gIH1cblxuICB2YXIgYnV0dG9uU3RhdGUgPSAwXG4gIHZhciB4ID0gMFxuICB2YXIgeSA9IDBcbiAgdmFyIG1vZHMgPSB7XG4gICAgc2hpZnQ6IGZhbHNlLFxuICAgIGFsdDogZmFsc2UsXG4gICAgY29udHJvbDogZmFsc2UsXG4gICAgbWV0YTogZmFsc2VcbiAgfVxuICB2YXIgYXR0YWNoZWQgPSBmYWxzZVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZU1vZHMgKGV2KSB7XG4gICAgdmFyIGNoYW5nZWQgPSBmYWxzZVxuICAgIGlmICgnYWx0S2V5JyBpbiBldikge1xuICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgZXYuYWx0S2V5ICE9PSBtb2RzLmFsdFxuICAgICAgbW9kcy5hbHQgPSAhIWV2LmFsdEtleVxuICAgIH1cbiAgICBpZiAoJ3NoaWZ0S2V5JyBpbiBldikge1xuICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgZXYuc2hpZnRLZXkgIT09IG1vZHMuc2hpZnRcbiAgICAgIG1vZHMuc2hpZnQgPSAhIWV2LnNoaWZ0S2V5XG4gICAgfVxuICAgIGlmICgnY3RybEtleScgaW4gZXYpIHtcbiAgICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHx8IGV2LmN0cmxLZXkgIT09IG1vZHMuY29udHJvbFxuICAgICAgbW9kcy5jb250cm9sID0gISFldi5jdHJsS2V5XG4gICAgfVxuICAgIGlmICgnbWV0YUtleScgaW4gZXYpIHtcbiAgICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHx8IGV2Lm1ldGFLZXkgIT09IG1vZHMubWV0YVxuICAgICAgbW9kcy5tZXRhID0gISFldi5tZXRhS2V5XG4gICAgfVxuICAgIHJldHVybiBjaGFuZ2VkXG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVFdmVudCAobmV4dEJ1dHRvbnMsIGV2KSB7XG4gICAgdmFyIG5leHRYID0gbW91c2UueChldilcbiAgICB2YXIgbmV4dFkgPSBtb3VzZS55KGV2KVxuICAgIGlmICgnYnV0dG9ucycgaW4gZXYpIHtcbiAgICAgIG5leHRCdXR0b25zID0gZXYuYnV0dG9ucyB8IDBcbiAgICB9XG4gICAgaWYgKG5leHRCdXR0b25zICE9PSBidXR0b25TdGF0ZSB8fFxuICAgICAgbmV4dFggIT09IHggfHxcbiAgICAgIG5leHRZICE9PSB5IHx8XG4gICAgICB1cGRhdGVNb2RzKGV2KSkge1xuICAgICAgYnV0dG9uU3RhdGUgPSBuZXh0QnV0dG9ucyB8IDBcbiAgICAgIHggPSBuZXh0WCB8fCAwXG4gICAgICB5ID0gbmV4dFkgfHwgMFxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soYnV0dG9uU3RhdGUsIHgsIHksIG1vZHMpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJTdGF0ZSAoZXYpIHtcbiAgICBoYW5kbGVFdmVudCgwLCBldilcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUJsdXIgKCkge1xuICAgIGlmIChidXR0b25TdGF0ZSB8fFxuICAgICAgeCB8fFxuICAgICAgeSB8fFxuICAgICAgbW9kcy5zaGlmdCB8fFxuICAgICAgbW9kcy5hbHQgfHxcbiAgICAgIG1vZHMubWV0YSB8fFxuICAgICAgbW9kcy5jb250cm9sKSB7XG4gICAgICB4ID0geSA9IDBcbiAgICAgIGJ1dHRvblN0YXRlID0gMFxuICAgICAgbW9kcy5zaGlmdCA9IG1vZHMuYWx0ID0gbW9kcy5jb250cm9sID0gbW9kcy5tZXRhID0gZmFsc2VcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKDAsIDAsIDAsIG1vZHMpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTW9kcyAoZXYpIHtcbiAgICBpZiAodXBkYXRlTW9kcyhldikpIHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGJ1dHRvblN0YXRlLCB4LCB5LCBtb2RzKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZSAoZXYpIHtcbiAgICBpZiAobW91c2UuYnV0dG9ucyhldikgPT09IDApIHtcbiAgICAgIGhhbmRsZUV2ZW50KDAsIGV2KVxuICAgIH0gZWxzZSB7XG4gICAgICBoYW5kbGVFdmVudChidXR0b25TdGF0ZSwgZXYpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duIChldikge1xuICAgIGhhbmRsZUV2ZW50KGJ1dHRvblN0YXRlIHwgbW91c2UuYnV0dG9ucyhldiksIGV2KVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTW91c2VVcCAoZXYpIHtcbiAgICBoYW5kbGVFdmVudChidXR0b25TdGF0ZSAmIH5tb3VzZS5idXR0b25zKGV2KSwgZXYpXG4gIH1cblxuICBmdW5jdGlvbiBhdHRhY2hMaXN0ZW5lcnMgKCkge1xuICAgIGlmIChhdHRhY2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGF0dGFjaGVkID0gdHJ1ZVxuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpXG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZU1vdXNlRG93bilcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApXG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBjbGVhclN0YXRlKVxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIGNsZWFyU3RhdGUpXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGNsZWFyU3RhdGUpXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBjbGVhclN0YXRlKVxuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgaGFuZGxlQmx1cilcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBoYW5kbGVNb2RzKVxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZU1vZHMpXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIGhhbmRsZU1vZHMpXG5cbiAgICBpZiAoZWxlbWVudCAhPT0gd2luZG93KSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGhhbmRsZUJsdXIpXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGhhbmRsZU1vZHMpXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZU1vZHMpXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBoYW5kbGVNb2RzKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRldGFjaExpc3RlbmVycyAoKSB7XG4gICAgaWYgKCFhdHRhY2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGF0dGFjaGVkID0gZmFsc2VcblxuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKVxuXG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBoYW5kbGVNb3VzZURvd24pXG5cbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKVxuXG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgY2xlYXJTdGF0ZSlcbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBjbGVhclN0YXRlKVxuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBjbGVhclN0YXRlKVxuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgY2xlYXJTdGF0ZSlcblxuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIGhhbmRsZUJsdXIpXG5cbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgaGFuZGxlTW9kcylcbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVNb2RzKVxuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBoYW5kbGVNb2RzKVxuXG4gICAgaWYgKGVsZW1lbnQgIT09IHdpbmRvdykge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBoYW5kbGVCbHVyKVxuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBoYW5kbGVNb2RzKVxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVNb2RzKVxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgaGFuZGxlTW9kcylcbiAgICB9XG4gIH1cblxuICAvLyBBdHRhY2ggbGlzdGVuZXJzXG4gIGF0dGFjaExpc3RlbmVycygpXG5cbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBlbGVtZW50OiBlbGVtZW50XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIHtcbiAgICBlbmFibGVkOiB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGF0dGFjaGVkIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIGlmIChmKSB7XG4gICAgICAgICAgYXR0YWNoTGlzdGVuZXJzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXRhY2hMaXN0ZW5lcnMoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH0sXG4gICAgYnV0dG9uczoge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBidXR0b25TdGF0ZSB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH0sXG4gICAgeDoge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB4IH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfSxcbiAgICB5OiB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHkgfSxcbiAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9LFxuICAgIG1vZHM6IHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbW9kcyB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gcmVzdWx0XG59XG4iLCIndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gbW91c2VCdXR0b25zKGV2KSB7XG4gIGlmKHR5cGVvZiBldiA9PT0gJ29iamVjdCcpIHtcbiAgICBpZignYnV0dG9ucycgaW4gZXYpIHtcbiAgICAgIHJldHVybiBldi5idXR0b25zXG4gICAgfSBlbHNlIGlmKCd3aGljaCcgaW4gZXYpIHtcbiAgICAgIHZhciBiID0gZXYud2hpY2hcbiAgICAgIGlmKGIgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIDRcbiAgICAgIH0gZWxzZSBpZihiID09PSAzKSB7XG4gICAgICAgIHJldHVybiAyXG4gICAgICB9IGVsc2UgaWYoYiA+IDApIHtcbiAgICAgICAgcmV0dXJuIDE8PChiLTEpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmKCdidXR0b24nIGluIGV2KSB7XG4gICAgICB2YXIgYiA9IGV2LmJ1dHRvblxuICAgICAgaWYoYiA9PT0gMSkge1xuICAgICAgICByZXR1cm4gNFxuICAgICAgfSBlbHNlIGlmKGIgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIDJcbiAgICAgIH0gZWxzZSBpZihiID49IDApIHtcbiAgICAgICAgcmV0dXJuIDE8PGJcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDBcbn1cbmV4cG9ydHMuYnV0dG9ucyA9IG1vdXNlQnV0dG9uc1xuXG5mdW5jdGlvbiBtb3VzZUVsZW1lbnQoZXYpIHtcbiAgcmV0dXJuIGV2LnRhcmdldCB8fCBldi5zcmNFbGVtZW50IHx8IHdpbmRvd1xufVxuZXhwb3J0cy5lbGVtZW50ID0gbW91c2VFbGVtZW50XG5cbmZ1bmN0aW9uIG1vdXNlUmVsYXRpdmVYKGV2KSB7XG4gIGlmKHR5cGVvZiBldiA9PT0gJ29iamVjdCcpIHtcbiAgICBpZignb2Zmc2V0WCcgaW4gZXYpIHtcbiAgICAgIHJldHVybiBldi5vZmZzZXRYXG4gICAgfVxuICAgIHZhciB0YXJnZXQgPSBtb3VzZUVsZW1lbnQoZXYpXG4gICAgdmFyIGJvdW5kcyA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIHJldHVybiBldi5jbGllbnRYIC0gYm91bmRzLmxlZnRcbiAgfVxuICByZXR1cm4gMFxufVxuZXhwb3J0cy54ID0gbW91c2VSZWxhdGl2ZVhcblxuZnVuY3Rpb24gbW91c2VSZWxhdGl2ZVkoZXYpIHtcbiAgaWYodHlwZW9mIGV2ID09PSAnb2JqZWN0Jykge1xuICAgIGlmKCdvZmZzZXRZJyBpbiBldikge1xuICAgICAgcmV0dXJuIGV2Lm9mZnNldFlcbiAgICB9XG4gICAgdmFyIHRhcmdldCA9IG1vdXNlRWxlbWVudChldilcbiAgICB2YXIgYm91bmRzID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgcmV0dXJuIGV2LmNsaWVudFkgLSBib3VuZHMudG9wXG4gIH1cbiAgcmV0dXJuIDBcbn1cbmV4cG9ydHMueSA9IG1vdXNlUmVsYXRpdmVZXG4iLCIvKiEgcDUuZG9tLmpzIHYwLjMuNCBKYW4gMTksIDIwMTcgKi9cbi8qKlxuICogPHA+VGhlIHdlYiBpcyBtdWNoIG1vcmUgdGhhbiBqdXN0IGNhbnZhcyBhbmQgcDUuZG9tIG1ha2VzIGl0IGVhc3kgdG8gaW50ZXJhY3RcbiAqIHdpdGggb3RoZXIgSFRNTDUgb2JqZWN0cywgaW5jbHVkaW5nIHRleHQsIGh5cGVybGluaywgaW1hZ2UsIGlucHV0LCB2aWRlbyxcbiAqIGF1ZGlvLCBhbmQgd2ViY2FtLjwvcD5cbiAqIDxwPlRoZXJlIGlzIGEgc2V0IG9mIGNyZWF0aW9uIG1ldGhvZHMsIERPTSBtYW5pcHVsYXRpb24gbWV0aG9kcywgYW5kXG4gKiBhbiBleHRlbmRlZCBwNS5FbGVtZW50IHRoYXQgc3VwcG9ydHMgYSByYW5nZSBvZiBIVE1MIGVsZW1lbnRzLiBTZWUgdGhlXG4gKiA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy9wNS5qcy93aWtpL0JleW9uZC10aGUtY2FudmFzJz5cbiAqIGJleW9uZCB0aGUgY2FudmFzIHR1dG9yaWFsPC9hPiBmb3IgYSBmdWxsIG92ZXJ2aWV3IG9mIGhvdyB0aGlzIGFkZG9uIHdvcmtzLlxuICpcbiAqIDxwPk1ldGhvZHMgYW5kIHByb3BlcnRpZXMgc2hvd24gaW4gYmxhY2sgYXJlIHBhcnQgb2YgdGhlIHA1LmpzIGNvcmUsIGl0ZW1zIGluXG4gKiBibHVlIGFyZSBwYXJ0IG9mIHRoZSBwNS5kb20gbGlicmFyeS4gWW91IHdpbGwgbmVlZCB0byBpbmNsdWRlIGFuIGV4dHJhIGZpbGVcbiAqIGluIG9yZGVyIHRvIGFjY2VzcyB0aGUgYmx1ZSBmdW5jdGlvbnMuIFNlZSB0aGVcbiAqIDxhIGhyZWY9J2h0dHA6Ly9wNWpzLm9yZy9saWJyYXJpZXMvI3VzaW5nLWEtbGlicmFyeSc+dXNpbmcgYSBsaWJyYXJ5PC9hPlxuICogc2VjdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGluY2x1ZGUgdGhpcyBsaWJyYXJ5LiBwNS5kb20gY29tZXMgd2l0aFxuICogPGEgaHJlZj0naHR0cDovL3A1anMub3JnL2Rvd25sb2FkJz5wNSBjb21wbGV0ZTwvYT4gb3IgeW91IGNhbiBkb3dubG9hZCB0aGUgc2luZ2xlIGZpbGVcbiAqIDxhIGhyZWY9J2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9sbWNjYXJ0L3A1LmpzL21hc3Rlci9saWIvYWRkb25zL3A1LmRvbS5qcyc+XG4gKiBoZXJlPC9hPi48L3A+XG4gKiA8cD5TZWUgPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmcvcDUuanMvd2lraS9CZXlvbmQtdGhlLWNhbnZhcyc+dHV0b3JpYWw6IGJleW9uZCB0aGUgY2FudmFzPC9hPlxuICogZm9yIG1vcmUgaW5mbyBvbiBob3cgdG8gdXNlIHRoaXMgbGliYXJ5LjwvYT5cbiAqXG4gKiBAbW9kdWxlIHA1LmRvbVxuICogQHN1Ym1vZHVsZSBwNS5kb21cbiAqIEBmb3IgcDUuZG9tXG4gKiBAbWFpblxuICovXG5cbihmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG4gICAgZGVmaW5lKCdwNS5kb20nLCBbJ3A1J10sIGZ1bmN0aW9uKHA1KSB7XG4gICAgICBmYWN0b3J5KHA1KTtcbiAgICB9KTtcbiAgZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSBmYWN0b3J5KHJlcXVpcmUoJy4uL3A1JykpO1xuICBlbHNlIGZhY3Rvcnkocm9vdFsncDUnXSk7XG59KSh0aGlzLCBmdW5jdGlvbihwNSkge1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBwNSBhZGRpdGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU2VhcmNoZXMgdGhlIHBhZ2UgZm9yIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gSUQsIGNsYXNzLCBvciB0YWcgbmFtZSAodXNpbmcgdGhlICcjJyBvciAnLidcbiAgICogcHJlZml4ZXMgdG8gc3BlY2lmeSBhbiBJRCBvciBjbGFzcyByZXNwZWN0aXZlbHksIGFuZCBub25lIGZvciBhIHRhZykgYW5kIHJldHVybnMgaXQgYXNcbiAgICogYSBwNS5FbGVtZW50LiBJZiBhIGNsYXNzIG9yIHRhZyBuYW1lIGlzIGdpdmVuIHdpdGggbW9yZSB0aGFuIDEgZWxlbWVudCxcbiAgICogb25seSB0aGUgZmlyc3QgZWxlbWVudCB3aWxsIGJlIHJldHVybmVkLlxuICAgKiBUaGUgRE9NIG5vZGUgaXRzZWxmIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIC5lbHQuXG4gICAqIFJldHVybnMgbnVsbCBpZiBub25lIGZvdW5kLiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhIGNvbnRhaW5lciB0byBzZWFyY2ggd2l0aGluLlxuICAgKlxuICAgKiBAbWV0aG9kIHNlbGVjdFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWUgaWQsIGNsYXNzLCBvciB0YWcgbmFtZSBvZiBlbGVtZW50IHRvIHNlYXJjaCBmb3JcbiAgICogQHBhcmFtICB7U3RyaW5nfHA1LkVsZW1lbnR8SFRNTEVsZW1lbnR9IFtjb250YWluZXJdIGlkLCBwNS5FbGVtZW50LCBvclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUwgZWxlbWVudCB0byBzZWFyY2ggd2l0aGluXG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fG51bGx9IHA1LkVsZW1lbnQgY29udGFpbmluZyBub2RlIGZvdW5kXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXYgPjxjb2RlIGNsYXNzPSdub3JlbmRlcic+XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gICAqICAgLy90cmFuc2xhdGVzIGNhbnZhcyA1MHB4IGRvd25cbiAgICogICBzZWxlY3QoJ2NhbnZhcycpLnBvc2l0aW9uKDEwMCwgMTAwKTtcbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqIDxkaXY+PGNvZGUgY2xhc3M9J25vcmVuZGVyJz5cbiAgICogLy8gdGhlc2UgYXJlIGFsbCB2YWxpZCBjYWxscyB0byBzZWxlY3QoKVxuICAgKiB2YXIgYSA9IHNlbGVjdCgnI21vbycpO1xuICAgKiB2YXIgYiA9IHNlbGVjdCgnI2JsYWgnLCAnI215Q29udGFpbmVyJyk7XG4gICAqIHZhciBjLCBlO1xuICAgKiBpZiAoYikge1xuICAgKiAgIGMgPSBzZWxlY3QoJyNmb28nLCBiKTtcbiAgICogfVxuICAgKiB2YXIgZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZWVwJyk7XG4gICAqIGlmIChkKSB7XG4gICAqICAgZSA9IHNlbGVjdCgncCcsIGQpO1xuICAgKiB9XG4gICAqIFthLCBiLCBjLCBkLCBlXTsgLy8gdW51c2VkXG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICpcbiAgICovXG4gIHA1LnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihlLCBwKSB7XG4gICAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnc2VsZWN0JywgYXJndW1lbnRzKTtcbiAgICB2YXIgcmVzID0gbnVsbDtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKHApO1xuICAgIGlmIChlWzBdID09PSAnLicpIHtcbiAgICAgIGUgPSBlLnNsaWNlKDEpO1xuICAgICAgcmVzID0gY29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSk7XG4gICAgICBpZiAocmVzLmxlbmd0aCkge1xuICAgICAgICByZXMgPSByZXNbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXMgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZVswXSA9PT0gJyMnKSB7XG4gICAgICBlID0gZS5zbGljZSgxKTtcbiAgICAgIHJlcyA9IGNvbnRhaW5lci5nZXRFbGVtZW50QnlJZChlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0gY29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO1xuICAgICAgaWYgKHJlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzID0gcmVzWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlcykge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyYXBFbGVtZW50KHJlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2VhcmNoZXMgdGhlIHBhZ2UgZm9yIGVsZW1lbnRzIHdpdGggdGhlIGdpdmVuIGNsYXNzIG9yIHRhZyBuYW1lICh1c2luZyB0aGUgJy4nIHByZWZpeFxuICAgKiB0byBzcGVjaWZ5IGEgY2xhc3MgYW5kIG5vIHByZWZpeCBmb3IgYSB0YWcpIGFuZCByZXR1cm5zIHRoZW0gYXMgcDUuRWxlbWVudHNcbiAgICogaW4gYW4gYXJyYXkuXG4gICAqIFRoZSBET00gbm9kZSBpdHNlbGYgY2FuIGJlIGFjY2Vzc2VkIHdpdGggLmVsdC5cbiAgICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiBub25lIGZvdW5kLlxuICAgKiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhIGNvbnRhaW5lciB0byBzZWFyY2ggd2l0aGluLlxuICAgKlxuICAgKiBAbWV0aG9kIHNlbGVjdEFsbFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWUgY2xhc3Mgb3IgdGFnIG5hbWUgb2YgZWxlbWVudHMgdG8gc2VhcmNoIGZvclxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IFtjb250YWluZXJdIGlkLCBwNS5FbGVtZW50LCBvciBIVE1MIGVsZW1lbnQgdG8gc2VhcmNoIHdpdGhpblxuICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgcDUuRWxlbWVudHMgY29udGFpbmluZyBub2RlcyBmb3VuZFxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIGNyZWF0ZUJ1dHRvbignYnRuJyk7XG4gICAqICAgY3JlYXRlQnV0dG9uKCcybmQgYnRuJyk7XG4gICAqICAgY3JlYXRlQnV0dG9uKCczcmQgYnRuJyk7XG4gICAqICAgdmFyIGJ1dHRvbnMgPSBzZWxlY3RBbGwoJ2J1dHRvbicpO1xuICAgKlxuICAgKiAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7IGkrKykge1xuICAgKiAgICAgYnV0dG9uc1tpXS5zaXplKDEwMCwgMTAwKTtcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gICAqIC8vIHRoZXNlIGFyZSBhbGwgdmFsaWQgY2FsbHMgdG8gc2VsZWN0QWxsKClcbiAgICogdmFyIGEgPSBzZWxlY3RBbGwoJy5tb28nKTtcbiAgICogYSA9IHNlbGVjdEFsbCgnZGl2Jyk7XG4gICAqIGEgPSBzZWxlY3RBbGwoJ2J1dHRvbicsICcjbXlDb250YWluZXInKTtcbiAgICpcbiAgICogdmFyIGQgPSBzZWxlY3QoJyNjb250YWluZXInKTtcbiAgICogYSA9IHNlbGVjdEFsbCgncCcsIGQpO1xuICAgKlxuICAgKiB2YXIgZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZWVwJyk7XG4gICAqIGEgPSBzZWxlY3QoJy5ibGFoJywgZik7XG4gICAqXG4gICAqIGE7IC8vIHVudXNlZFxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqXG4gICAqL1xuICBwNS5wcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oZSwgcCkge1xuICAgIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3NlbGVjdEFsbCcsIGFyZ3VtZW50cyk7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIHZhciByZXM7XG4gICAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihwKTtcbiAgICBpZiAoZVswXSA9PT0gJy4nKSB7XG4gICAgICBlID0gZS5zbGljZSgxKTtcbiAgICAgIHJlcyA9IGNvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBjb250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7XG4gICAgfVxuICAgIGlmIChyZXMpIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBvYmogPSB0aGlzLl93cmFwRWxlbWVudChyZXNbal0pO1xuICAgICAgICBhcnIucHVzaChvYmopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHNlbGVjdCBhbmQgc2VsZWN0QWxsXG4gICAqL1xuICBmdW5jdGlvbiBnZXRDb250YWluZXIocCkge1xuICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudDtcbiAgICBpZiAodHlwZW9mIHAgPT09ICdzdHJpbmcnICYmIHBbMF0gPT09ICcjJykge1xuICAgICAgcCA9IHAuc2xpY2UoMSk7XG4gICAgICBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwKSB8fCBkb2N1bWVudDtcbiAgICB9IGVsc2UgaWYgKHAgaW5zdGFuY2VvZiBwNS5FbGVtZW50KSB7XG4gICAgICBjb250YWluZXIgPSBwLmVsdDtcbiAgICB9IGVsc2UgaWYgKHAgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgY29udGFpbmVyID0gcDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGdldEVsZW1lbnQgYW5kIGdldEVsZW1lbnRzLlxuICAgKi9cbiAgcDUucHJvdG90eXBlLl93cmFwRWxlbWVudCA9IGZ1bmN0aW9uKGVsdCkge1xuICAgIHZhciBjaGlsZHJlbiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGVsdC5jaGlsZHJlbik7XG4gICAgaWYgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGVsdC50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICB2YXIgY29udmVydGVkID0gbmV3IHA1LkVsZW1lbnQoZWx0KTtcbiAgICAgIGNvbnZlcnRlZC5jaGVja2VkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWx0LmNoZWNrZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzWzBdKSB7XG4gICAgICAgICAgdGhpcy5lbHQuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbHQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBjb252ZXJ0ZWQ7XG4gICAgfSBlbHNlIGlmIChlbHQudGFnTmFtZSA9PT0gJ1ZJREVPJyB8fCBlbHQudGFnTmFtZSA9PT0gJ0FVRElPJykge1xuICAgICAgcmV0dXJuIG5ldyBwNS5NZWRpYUVsZW1lbnQoZWx0KTtcbiAgICB9IGVsc2UgaWYgKGVsdC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2VsZWN0KG5ldyBwNS5FbGVtZW50KGVsdCkpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjaGlsZHJlbi5sZW5ndGggPiAwICYmXG4gICAgICBjaGlsZHJlbi5ldmVyeShmdW5jdGlvbihjKSB7XG4gICAgICAgIHJldHVybiBjLnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgYy50YWdOYW1lID09PSAnTEFCRUwnO1xuICAgICAgfSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJhZGlvKG5ldyBwNS5FbGVtZW50KGVsdCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IHA1LkVsZW1lbnQoZWx0KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGNyZWF0ZWQgYnkgcDUsIGV4Y2VwdCBhbnkgY2FudmFzIC8gZ3JhcGhpY3NcbiAgICogZWxlbWVudHMgY3JlYXRlZCBieSBjcmVhdGVDYW52YXMgb3IgY3JlYXRlR3JhcGhpY3MuXG4gICAqIEV2ZW50IGhhbmRsZXJzIGFyZSByZW1vdmVkLCBhbmQgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIERPTS5cbiAgICogQG1ldGhvZCByZW1vdmVFbGVtZW50c1xuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gICAqICAgY3JlYXRlRGl2KCd0aGlzIGlzIHNvbWUgdGV4dCcpO1xuICAgKiAgIGNyZWF0ZVAoJ3RoaXMgaXMgYSBwYXJhZ3JhcGgnKTtcbiAgICogfVxuICAgKiBmdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XG4gICAqICAgcmVtb3ZlRWxlbWVudHMoKTsgLy8gdGhpcyB3aWxsIHJlbW92ZSB0aGUgZGl2IGFuZCBwLCBub3QgY2FudmFzXG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKlxuICAgKi9cbiAgcDUucHJvdG90eXBlLnJlbW92ZUVsZW1lbnRzID0gZnVuY3Rpb24oZSkge1xuICAgIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3JlbW92ZUVsZW1lbnRzJywgYXJndW1lbnRzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoISh0aGlzLl9lbGVtZW50c1tpXS5lbHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudHNbaV0ucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXJzIGZvciBjcmVhdGUgbWV0aG9kcy5cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEVsZW1lbnQoZWx0LCBwSW5zdCwgbWVkaWEpIHtcbiAgICB2YXIgbm9kZSA9IHBJbnN0Ll91c2VyTm9kZSA/IHBJbnN0Ll91c2VyTm9kZSA6IGRvY3VtZW50LmJvZHk7XG4gICAgbm9kZS5hcHBlbmRDaGlsZChlbHQpO1xuICAgIHZhciBjID0gbWVkaWEgPyBuZXcgcDUuTWVkaWFFbGVtZW50KGVsdCkgOiBuZXcgcDUuRWxlbWVudChlbHQpO1xuICAgIHBJbnN0Ll9lbGVtZW50cy5wdXNoKGMpO1xuICAgIHJldHVybiBjO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSAmbHQ7ZGl2Jmd0OyZsdDsvZGl2Jmd0OyBlbGVtZW50IGluIHRoZSBET00gd2l0aCBnaXZlbiBpbm5lciBIVE1MLlxuICAgKiBBcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2VcbiAgICogYXBwZW5kcyB0byBib2R5LlxuICAgKlxuICAgKiBAbWV0aG9kIGNyZWF0ZURpdlxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IFtodG1sXSBpbm5lciBIVE1MIGZvciBlbGVtZW50IGNyZWF0ZWRcbiAgICogQHJldHVybiB7T2JqZWN0fHA1LkVsZW1lbnR9IHBvaW50ZXIgdG8gcDUuRWxlbWVudCBob2xkaW5nIGNyZWF0ZWQgbm9kZVxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gICAqIGNyZWF0ZURpdigndGhpcyBpcyBzb21lIHRleHQnKTtcbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cblxuICAvKipcbiAgICogQ3JlYXRlcyBhICZsdDtwJmd0OyZsdDsvcCZndDsgZWxlbWVudCBpbiB0aGUgRE9NIHdpdGggZ2l2ZW4gaW5uZXIgSFRNTC4gVXNlZFxuICAgKiBmb3IgcGFyYWdyYXBoIGxlbmd0aCB0ZXh0LlxuICAgKiBBcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2VcbiAgICogYXBwZW5kcyB0byBib2R5LlxuICAgKlxuICAgKiBAbWV0aG9kIGNyZWF0ZVBcbiAgICogQHBhcmFtICB7U3RyaW5nfSBbaHRtbF0gaW5uZXIgSFRNTCBmb3IgZWxlbWVudCBjcmVhdGVkXG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fSBwb2ludGVyIHRvIHA1LkVsZW1lbnQgaG9sZGluZyBjcmVhdGVkIG5vZGVcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiBjcmVhdGVQKCd0aGlzIGlzIHNvbWUgdGV4dCcpO1xuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgJmx0O3NwYW4mZ3Q7Jmx0Oy9zcGFuJmd0OyBlbGVtZW50IGluIHRoZSBET00gd2l0aCBnaXZlbiBpbm5lciBIVE1MLlxuICAgKiBBcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2VcbiAgICogYXBwZW5kcyB0byBib2R5LlxuICAgKlxuICAgKiBAbWV0aG9kIGNyZWF0ZVNwYW5cbiAgICogQHBhcmFtICB7U3RyaW5nfSBbaHRtbF0gaW5uZXIgSFRNTCBmb3IgZWxlbWVudCBjcmVhdGVkXG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fSBwb2ludGVyIHRvIHA1LkVsZW1lbnQgaG9sZGluZyBjcmVhdGVkIG5vZGVcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiBjcmVhdGVTcGFuKCd0aGlzIGlzIHNvbWUgdGV4dCcpO1xuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICB2YXIgdGFncyA9IFsnZGl2JywgJ3AnLCAnc3BhbiddO1xuICB0YWdzLmZvckVhY2goZnVuY3Rpb24odGFnKSB7XG4gICAgdmFyIG1ldGhvZCA9ICdjcmVhdGUnICsgdGFnLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGFnLnNsaWNlKDEpO1xuICAgIHA1LnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oaHRtbCkge1xuICAgICAgdmFyIGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICAgIGVsdC5pbm5lckhUTUwgPSB0eXBlb2YgaHRtbCA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6IGh0bWw7XG4gICAgICByZXR1cm4gYWRkRWxlbWVudChlbHQsIHRoaXMpO1xuICAgIH07XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuICZsdDtpbWcmZ3Q7IGVsZW1lbnQgaW4gdGhlIERPTSB3aXRoIGdpdmVuIHNyYyBhbmRcbiAgICogYWx0ZXJuYXRlIHRleHQuXG4gICAqIEFwcGVuZHMgdG8gdGhlIGNvbnRhaW5lciBub2RlIGlmIG9uZSBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZVxuICAgKiBhcHBlbmRzIHRvIGJvZHkuXG4gICAqXG4gICAqIEBtZXRob2QgY3JlYXRlSW1nXG4gICAqIEBwYXJhbSAge1N0cmluZ30gc3JjIHNyYyBwYXRoIG9yIHVybCBmb3IgaW1hZ2VcbiAgICogQHBhcmFtICB7U3RyaW5nfSBbYWx0XSBhbHRlcm5hdGUgdGV4dCB0byBiZSB1c2VkIGlmIGltYWdlIGRvZXMgbm90IGxvYWRcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IFtzdWNjZXNzQ2FsbGJhY2tdIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbmNlIGltYWdlIGRhdGEgaXMgbG9hZGVkXG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fSBwb2ludGVyIHRvIHA1LkVsZW1lbnQgaG9sZGluZyBjcmVhdGVkIG5vZGVcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiBjcmVhdGVJbWcoJ2h0dHA6Ly9wNWpzLm9yZy9pbWcvYXN0ZXJpc2stMDEucG5nJyk7XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1LnByb3RvdHlwZS5jcmVhdGVJbWcgPSBmdW5jdGlvbigpIHtcbiAgICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjcmVhdGVJbWcnLCBhcmd1bWVudHMpO1xuICAgIHZhciBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgc2VsZjtcbiAgICB2YXIgc2V0QXR0cnMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYud2lkdGggPSBlbHQub2Zmc2V0V2lkdGggfHwgZWx0LndpZHRoO1xuICAgICAgc2VsZi5oZWlnaHQgPSBlbHQub2Zmc2V0SGVpZ2h0IHx8IGVsdC5oZWlnaHQ7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPiAxICYmIHR5cGVvZiBhcmdzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHNlbGYuZm4gPSBhcmdzWzFdO1xuICAgICAgICBzZWxmLmZuKCk7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID4gMSAmJiB0eXBlb2YgYXJnc1syXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzZWxmLmZuID0gYXJnc1syXTtcbiAgICAgICAgc2VsZi5mbigpO1xuICAgICAgfVxuICAgIH07XG4gICAgZWx0LnNyYyA9IGFyZ3NbMF07XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSAmJiB0eXBlb2YgYXJnc1sxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVsdC5hbHQgPSBhcmdzWzFdO1xuICAgIH1cbiAgICBlbHQub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZXRBdHRycygpO1xuICAgIH07XG4gICAgc2VsZiA9IGFkZEVsZW1lbnQoZWx0LCB0aGlzKTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiAmbHQ7YSZndDsmbHQ7L2EmZ3Q7IGVsZW1lbnQgaW4gdGhlIERPTSBmb3IgaW5jbHVkaW5nIGEgaHlwZXJsaW5rLlxuICAgKiBBcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2VcbiAgICogYXBwZW5kcyB0byBib2R5LlxuICAgKlxuICAgKiBAbWV0aG9kIGNyZWF0ZUFcbiAgICogQHBhcmFtICB7U3RyaW5nfSBocmVmICAgICAgIHVybCBvZiBwYWdlIHRvIGxpbmsgdG9cbiAgICogQHBhcmFtICB7U3RyaW5nfSBodG1sICAgICAgIGlubmVyIGh0bWwgb2YgbGluayBlbGVtZW50IHRvIGRpc3BsYXlcbiAgICogQHBhcmFtICB7U3RyaW5nfSBbdGFyZ2V0XSAgIHRhcmdldCB3aGVyZSBuZXcgbGluayBzaG91bGQgb3BlbixcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIGJlIF9ibGFuaywgX3NlbGYsIF9wYXJlbnQsIF90b3AuXG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fSBwb2ludGVyIHRvIHA1LkVsZW1lbnQgaG9sZGluZyBjcmVhdGVkIG5vZGVcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiBjcmVhdGVBKCdodHRwOi8vcDVqcy5vcmcvJywgJ3RoaXMgaXMgYSBsaW5rJyk7XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1LnByb3RvdHlwZS5jcmVhdGVBID0gZnVuY3Rpb24oaHJlZiwgaHRtbCwgdGFyZ2V0KSB7XG4gICAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnY3JlYXRlQScsIGFyZ3VtZW50cyk7XG4gICAgdmFyIGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBlbHQuaHJlZiA9IGhyZWY7XG4gICAgZWx0LmlubmVySFRNTCA9IGh0bWw7XG4gICAgaWYgKHRhcmdldCkgZWx0LnRhcmdldCA9IHRhcmdldDtcbiAgICByZXR1cm4gYWRkRWxlbWVudChlbHQsIHRoaXMpO1xuICB9O1xuXG4gIC8qKiBJTlBVVCAqKi9cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNsaWRlciAmbHQ7aW5wdXQmZ3Q7Jmx0Oy9pbnB1dCZndDsgZWxlbWVudCBpbiB0aGUgRE9NLlxuICAgKiBVc2UgLnNpemUoKSB0byBzZXQgdGhlIGRpc3BsYXkgbGVuZ3RoIG9mIHRoZSBzbGlkZXIuXG4gICAqIEFwcGVuZHMgdG8gdGhlIGNvbnRhaW5lciBub2RlIGlmIG9uZSBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZVxuICAgKiBhcHBlbmRzIHRvIGJvZHkuXG4gICAqXG4gICAqIEBtZXRob2QgY3JlYXRlU2xpZGVyXG4gICAqIEBwYXJhbSAge051bWJlcn0gbWluIG1pbmltdW0gdmFsdWUgb2YgdGhlIHNsaWRlclxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IG1heCBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzbGlkZXJcbiAgICogQHBhcmFtICB7TnVtYmVyfSBbdmFsdWVdIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNsaWRlclxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IFtzdGVwXSBzdGVwIHNpemUgZm9yIGVhY2ggdGljayBvZiB0aGUgc2xpZGVyIChpZiBzdGVwIGlzIHNldCB0byAwLCB0aGUgc2xpZGVyIHdpbGwgbW92ZSBjb250aW51b3VzbHkgZnJvbSB0aGUgbWluaW11bSB0byB0aGUgbWF4aW11bSB2YWx1ZSlcbiAgICogQHJldHVybiB7T2JqZWN0fHA1LkVsZW1lbnR9IHBvaW50ZXIgdG8gcDUuRWxlbWVudCBob2xkaW5nIGNyZWF0ZWQgbm9kZVxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiB2YXIgc2xpZGVyO1xuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICBzbGlkZXIgPSBjcmVhdGVTbGlkZXIoMCwgMjU1LCAxMDApO1xuICAgKiAgIHNsaWRlci5wb3NpdGlvbigxMCwgMTApO1xuICAgKiAgIHNsaWRlci5zdHlsZSgnd2lkdGgnLCAnODBweCcpO1xuICAgKiB9XG4gICAqXG4gICAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gICAqICAgdmFyIHZhbCA9IHNsaWRlci52YWx1ZSgpO1xuICAgKiAgIGJhY2tncm91bmQodmFsKTtcbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIHZhciBzbGlkZXI7XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIGNvbG9yTW9kZShIU0IpO1xuICAgKiAgIHNsaWRlciA9IGNyZWF0ZVNsaWRlcigwLCAzNjAsIDYwLCA0MCk7XG4gICAqICAgc2xpZGVyLnBvc2l0aW9uKDEwLCAxMCk7XG4gICAqICAgc2xpZGVyLnN0eWxlKCd3aWR0aCcsICc4MHB4Jyk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gZHJhdygpIHtcbiAgICogICB2YXIgdmFsID0gc2xpZGVyLnZhbHVlKCk7XG4gICAqICAgYmFja2dyb3VuZCh2YWwsIDEwMCwgMTAwLCAxKTtcbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5wcm90b3R5cGUuY3JlYXRlU2xpZGVyID0gZnVuY3Rpb24obWluLCBtYXgsIHZhbHVlLCBzdGVwKSB7XG4gICAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnY3JlYXRlU2xpZGVyJywgYXJndW1lbnRzKTtcbiAgICB2YXIgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBlbHQudHlwZSA9ICdyYW5nZSc7XG4gICAgZWx0Lm1pbiA9IG1pbjtcbiAgICBlbHQubWF4ID0gbWF4O1xuICAgIGlmIChzdGVwID09PSAwKSB7XG4gICAgICBlbHQuc3RlcCA9IDAuMDAwMDAwMDAwMDAwMDAwMDAxOyAvLyBzbWFsbGVzdCB2YWxpZCBzdGVwXG4gICAgfSBlbHNlIGlmIChzdGVwKSB7XG4gICAgICBlbHQuc3RlcCA9IHN0ZXA7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSBlbHQudmFsdWUgPSB2YWx1ZTtcbiAgICByZXR1cm4gYWRkRWxlbWVudChlbHQsIHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgJmx0O2J1dHRvbiZndDsmbHQ7L2J1dHRvbiZndDsgZWxlbWVudCBpbiB0aGUgRE9NLlxuICAgKiBVc2UgLnNpemUoKSB0byBzZXQgdGhlIGRpc3BsYXkgc2l6ZSBvZiB0aGUgYnV0dG9uLlxuICAgKiBVc2UgLm1vdXNlUHJlc3NlZCgpIHRvIHNwZWNpZnkgYmVoYXZpb3Igb24gcHJlc3MuXG4gICAqIEFwcGVuZHMgdG8gdGhlIGNvbnRhaW5lciBub2RlIGlmIG9uZSBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZVxuICAgKiBhcHBlbmRzIHRvIGJvZHkuXG4gICAqXG4gICAqIEBtZXRob2QgY3JlYXRlQnV0dG9uXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbGFiZWwgbGFiZWwgZGlzcGxheWVkIG9uIHRoZSBidXR0b25cbiAgICogQHBhcmFtICB7U3RyaW5nfSBbdmFsdWVdIHZhbHVlIG9mIHRoZSBidXR0b25cbiAgICogQHJldHVybiB7T2JqZWN0fHA1LkVsZW1lbnR9IHBvaW50ZXIgdG8gcDUuRWxlbWVudCBob2xkaW5nIGNyZWF0ZWQgbm9kZVxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gICAqIHZhciBidXR0b247XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gICAqICAgYmFja2dyb3VuZCgwKTtcbiAgICogICBidXR0b24gPSBjcmVhdGVCdXR0b24oJ2NsaWNrIG1lJyk7XG4gICAqICAgYnV0dG9uLnBvc2l0aW9uKDE5LCAxOSk7XG4gICAqICAgYnV0dG9uLm1vdXNlUHJlc3NlZChjaGFuZ2VCRyk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gY2hhbmdlQkcoKSB7XG4gICAqICAgdmFyIHZhbCA9IHJhbmRvbSgyNTUpO1xuICAgKiAgIGJhY2tncm91bmQodmFsKTtcbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5wcm90b3R5cGUuY3JlYXRlQnV0dG9uID0gZnVuY3Rpb24obGFiZWwsIHZhbHVlKSB7XG4gICAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnY3JlYXRlQnV0dG9uJywgYXJndW1lbnRzKTtcbiAgICB2YXIgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgZWx0LmlubmVySFRNTCA9IGxhYmVsO1xuICAgIGlmICh2YWx1ZSkgZWx0LnZhbHVlID0gdmFsdWU7XG4gICAgcmV0dXJuIGFkZEVsZW1lbnQoZWx0LCB0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoZWNrYm94ICZsdDtpbnB1dCZndDsmbHQ7L2lucHV0Jmd0OyBlbGVtZW50IGluIHRoZSBET00uXG4gICAqIENhbGxpbmcgLmNoZWNrZWQoKSBvbiBhIGNoZWNrYm94IHJldHVybnMgaWYgaXQgaXMgY2hlY2tlZCBvciBub3RcbiAgICpcbiAgICogQG1ldGhvZCBjcmVhdGVDaGVja2JveFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IFtsYWJlbF0gbGFiZWwgZGlzcGxheWVkIGFmdGVyIGNoZWNrYm94XG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IFt2YWx1ZV0gdmFsdWUgb2YgdGhlIGNoZWNrYm94OyBjaGVja2VkIGlzIHRydWUsIHVuY2hlY2tlZCBpcyBmYWxzZVxuICAgKiBAcmV0dXJuIHtPYmplY3R8cDUuRWxlbWVudH0gcG9pbnRlciB0byBwNS5FbGVtZW50IGhvbGRpbmcgY3JlYXRlZCBub2RlXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAgICogdmFyIGNoZWNrYm94O1xuICAgKlxuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICBjaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KCdsYWJlbCcsIGZhbHNlKTtcbiAgICogICBjaGVja2JveC5jaGFuZ2VkKG15Q2hlY2tlZEV2ZW50KTtcbiAgICogfVxuICAgKlxuICAgKiBmdW5jdGlvbiBteUNoZWNrZWRFdmVudCgpIHtcbiAgICogICBpZiAodGhpcy5jaGVja2VkKCkpIHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdDaGVja2luZyEnKTtcbiAgICogICB9IGVsc2Uge1xuICAgKiAgICAgY29uc29sZS5sb2coJ1VuY2hlY2tpbmchJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1LnByb3RvdHlwZS5jcmVhdGVDaGVja2JveCA9IGZ1bmN0aW9uKCkge1xuICAgIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2NyZWF0ZUNoZWNrYm94JywgYXJndW1lbnRzKTtcbiAgICB2YXIgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdmFyIGNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICBlbHQuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuICAgIC8vY2hlY2tib3ggbXVzdCBiZSB3cmFwcGVkIGluIHA1LkVsZW1lbnQgYmVmb3JlIGxhYmVsIHNvIHRoYXQgbGFiZWwgYXBwZWFycyBhZnRlclxuICAgIHZhciBzZWxmID0gYWRkRWxlbWVudChlbHQsIHRoaXMpO1xuICAgIHNlbGYuY2hlY2tlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNiID0gc2VsZi5lbHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF07XG4gICAgICBpZiAoY2IpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gY2IuY2hlY2tlZDtcbiAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICBjYi5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYi5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgdGhpcy52YWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgc2VsZi52YWx1ZSA9IHZhbDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgaWYgKGFyZ3VtZW50c1swXSkge1xuICAgICAgdmFyIHJhbiA9IE1hdGgucmFuZG9tKClcbiAgICAgICAgLnRvU3RyaW5nKDM2KVxuICAgICAgICAuc2xpY2UoMik7XG4gICAgICB2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgICAgY2hlY2tib3guc2V0QXR0cmlidXRlKCdpZCcsIHJhbik7XG4gICAgICBsYWJlbC5odG1sRm9yID0gcmFuO1xuICAgICAgc2VsZi52YWx1ZShhcmd1bWVudHNbMF0pO1xuICAgICAgbGFiZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYXJndW1lbnRzWzBdKSk7XG4gICAgICBlbHQuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICAgIH1cbiAgICBpZiAoYXJndW1lbnRzWzFdKSB7XG4gICAgICBjaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkcm9wZG93biBtZW51ICZsdDtzZWxlY3QmZ3Q7Jmx0Oy9zZWxlY3QmZ3Q7IGVsZW1lbnQgaW4gdGhlIERPTS5cbiAgICogSXQgYWxzbyBoZWxwcyB0byBhc3NpZ24gc2VsZWN0LWJveCBtZXRob2RzIHRvIHA1LkVsZW1lbnQgd2hlbiBzZWxlY3RpbmcgZXhpc3Rpbmcgc2VsZWN0IGJveFxuICAgKiBAbWV0aG9kIGNyZWF0ZVNlbGVjdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFttdWx0aXBsZV0gdHJ1ZSBpZiBkcm9wZG93biBzaG91bGQgc3VwcG9ydCBtdWx0aXBsZSBzZWxlY3Rpb25zXG4gICAqIEByZXR1cm4ge3A1LkVsZW1lbnR9XG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIHZhciBzZWw7XG4gICAqXG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIHRleHRBbGlnbihDRU5URVIpO1xuICAgKiAgIGJhY2tncm91bmQoMjAwKTtcbiAgICogICBzZWwgPSBjcmVhdGVTZWxlY3QoKTtcbiAgICogICBzZWwucG9zaXRpb24oMTAsIDEwKTtcbiAgICogICBzZWwub3B0aW9uKCdwZWFyJyk7XG4gICAqICAgc2VsLm9wdGlvbigna2l3aScpO1xuICAgKiAgIHNlbC5vcHRpb24oJ2dyYXBlJyk7XG4gICAqICAgc2VsLmNoYW5nZWQobXlTZWxlY3RFdmVudCk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gbXlTZWxlY3RFdmVudCgpIHtcbiAgICogICB2YXIgaXRlbSA9IHNlbC52YWx1ZSgpO1xuICAgKiAgIGJhY2tncm91bmQoMjAwKTtcbiAgICogICB0ZXh0KCdpdCBpcyBhJyArIGl0ZW0gKyAnIScsIDUwLCA1MCk7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgLyoqXG4gICAqIEBtZXRob2QgY3JlYXRlU2VsZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBleGlzdGluZyBET00gc2VsZWN0IGVsZW1lbnRcbiAgICogQHJldHVybiB7cDUuRWxlbWVudH1cbiAgICovXG5cbiAgcDUucHJvdG90eXBlLmNyZWF0ZVNlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICAgIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2NyZWF0ZVNlbGVjdCcsIGFyZ3VtZW50cyk7XG4gICAgdmFyIGVsdCwgc2VsZjtcbiAgICB2YXIgYXJnID0gYXJndW1lbnRzWzBdO1xuICAgIGlmICh0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcuZWx0Lm5vZGVOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgc2VsZiA9IGFyZztcbiAgICAgIGVsdCA9IHRoaXMuZWx0ID0gYXJnLmVsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7XG4gICAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJykge1xuICAgICAgICBlbHQuc2V0QXR0cmlidXRlKCdtdWx0aXBsZScsICd0cnVlJyk7XG4gICAgICB9XG4gICAgICBzZWxmID0gYWRkRWxlbWVudChlbHQsIHRoaXMpO1xuICAgIH1cbiAgICBzZWxmLm9wdGlvbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgaW5kZXg7XG4gICAgICAvL3NlZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIG9wdGlvbiB3aXRoIHRoaXMgbmFtZVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5lbHRbaV0uaW5uZXJIVE1MID09PSBuYW1lKSB7XG4gICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL2lmIHRoZXJlIGlzIGFuIG9wdGlvbiB3aXRoIHRoaXMgbmFtZSB3ZSB3aWxsIG1vZGlmeSBpdFxuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9pZiB0aGUgdXNlciBwYXNzZWQgaW4gZmFsc2UgdGhlbiBkZWxldGUgdGhhdCBvcHRpb25cbiAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMuZWx0LnJlbW92ZShpbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy9vdGhlcndpc2UgaWYgdGhlIG5hbWUgYW5kIHZhbHVlIGFyZSB0aGUgc2FtZSB0aGVuIGNoYW5nZSBib3RoXG4gICAgICAgICAgaWYgKHRoaXMuZWx0W2luZGV4XS5pbm5lckhUTUwgPT09IHRoaXMuZWx0W2luZGV4XS52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5lbHRbaW5kZXhdLmlubmVySFRNTCA9IHRoaXMuZWx0W2luZGV4XS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgLy9vdGhlcndpc2UganVzdCBjaGFuZ2UgdGhlIHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWx0W2luZGV4XS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9pZiBpdCBkb2Vzbid0IGV4aXN0IG1ha2UgaXRcbiAgICAgICAgdmFyIG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQuaW5uZXJIVE1MID0gbmFtZTtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSBvcHQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZWxzZSBvcHQudmFsdWUgPSBuYW1lO1xuICAgICAgICBlbHQuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYuc2VsZWN0ZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGFyciA9IFtdLFxuICAgICAgICBpO1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmVsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpID09PSB0aGlzLmVsdFtpXS52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5lbHQuc2VsZWN0ZWRJbmRleCA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuZWx0LmdldEF0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmVsdC5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuZWx0LnNlbGVjdGVkT3B0aW9uc1tpXS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhcnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJhZGlvIGJ1dHRvbiAmbHQ7aW5wdXQmZ3Q7Jmx0Oy9pbnB1dCZndDsgZWxlbWVudCBpbiB0aGUgRE9NLlxuICAgKiBUaGUgLm9wdGlvbigpIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzZXQgb3B0aW9ucyBmb3IgdGhlIHJhZGlvIGFmdGVyIGl0IGlzXG4gICAqIGNyZWF0ZWQuIFRoZSAudmFsdWUoKSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uXG4gICAqXG4gICAqIEBtZXRob2QgY3JlYXRlUmFkaW9cbiAgICogQHBhcmFtICB7U3RyaW5nfSBbZGl2SWRdIHRoZSBpZCBhbmQgbmFtZSBvZiB0aGUgY3JlYXRlZCBkaXYgYW5kIGlucHV0IGZpZWxkIHJlc3BlY3RpdmVseVxuICAgKiBAcmV0dXJuIHtPYmplY3R8cDUuRWxlbWVudH0gcG9pbnRlciB0byBwNS5FbGVtZW50IGhvbGRpbmcgY3JlYXRlZCBub2RlXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIHZhciByYWRpbztcbiAgICpcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgcmFkaW8gPSBjcmVhdGVSYWRpbygpO1xuICAgKiAgIHJhZGlvLm9wdGlvbignYmxhY2snKTtcbiAgICogICByYWRpby5vcHRpb24oJ3doaXRlJyk7XG4gICAqICAgcmFkaW8ub3B0aW9uKCdncmF5Jyk7XG4gICAqICAgcmFkaW8uc3R5bGUoJ3dpZHRoJywgJzYwcHgnKTtcbiAgICogICB0ZXh0QWxpZ24oQ0VOVEVSKTtcbiAgICogICBmaWxsKDI1NSwgMCwgMCk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gZHJhdygpIHtcbiAgICogICB2YXIgdmFsID0gcmFkaW8udmFsdWUoKTtcbiAgICogICBiYWNrZ3JvdW5kKHZhbCk7XG4gICAqICAgdGV4dCh2YWwsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiB2YXIgcmFkaW87XG4gICAqXG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIHJhZGlvID0gY3JlYXRlUmFkaW8oKTtcbiAgICogICByYWRpby5vcHRpb24oJ2FwcGxlJywgMSk7XG4gICAqICAgcmFkaW8ub3B0aW9uKCdicmVhZCcsIDIpO1xuICAgKiAgIHJhZGlvLm9wdGlvbignanVpY2UnLCAzKTtcbiAgICogICByYWRpby5zdHlsZSgnd2lkdGgnLCAnNjBweCcpO1xuICAgKiAgIHRleHRBbGlnbihDRU5URVIpO1xuICAgKiB9XG4gICAqXG4gICAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gICAqICAgYmFja2dyb3VuZCgyMDApO1xuICAgKiAgIHZhciB2YWwgPSByYWRpby52YWx1ZSgpO1xuICAgKiAgIGlmICh2YWwpIHtcbiAgICogICAgIHRleHQoJ2l0ZW0gY29zdCBpcyAkJyArIHZhbCwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUucHJvdG90eXBlLmNyZWF0ZVJhZGlvID0gZnVuY3Rpb24oZXhpc3RpbmdfcmFkaW9zKSB7XG4gICAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnY3JlYXRlUmFkaW8nLCBhcmd1bWVudHMpO1xuICAgIC8vIGRvIHNvbWUgcHJlcCBieSBjb3VudGluZyBudW1iZXIgb2YgcmFkaW9zIG9uIHBhZ2VcbiAgICB2YXIgcmFkaW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1yYWRpb10nKTtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIGlmIChyYWRpb3MubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIGxlbmd0aCA9IHJhZGlvcy5sZW5ndGg7XG4gICAgICB2YXIgcHJldiA9IHJhZGlvc1swXS5uYW1lO1xuICAgICAgdmFyIGN1cnJlbnQgPSByYWRpb3NbMV0ubmFtZTtcbiAgICAgIGNvdW50ID0gMTtcbiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY3VycmVudCA9IHJhZGlvc1tpXS5uYW1lO1xuICAgICAgICBpZiAocHJldiAhPT0gY3VycmVudCkge1xuICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgcHJldiA9IGN1cnJlbnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyYWRpb3MubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb3VudCA9IDE7XG4gICAgfVxuICAgIC8vIHNlZSBpZiB3ZSBnb3QgYW4gZXhpc3Rpbmcgc2V0IG9mIHJhZGlvcyBmcm9tIGNhbGxlZVxuICAgIHZhciBlbHQsIHNlbGY7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZ19yYWRpb3MgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyB1c2UgZXhpc3RpbmcgZWxlbWVudHNcbiAgICAgIHNlbGYgPSBleGlzdGluZ19yYWRpb3M7XG4gICAgICBlbHQgPSB0aGlzLmVsdCA9IGV4aXN0aW5nX3JhZGlvcy5lbHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNyZWF0ZSBhIHNldCBvZiByYWRpbyBidXR0b25zXG4gICAgICBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNlbGYgPSBhZGRFbGVtZW50KGVsdCwgdGhpcyk7XG4gICAgfVxuICAgIC8vIHNldHVwIG1lbWJlciBmdW5jdGlvbnNcbiAgICBzZWxmLl9nZXRJbnB1dENoaWxkcmVuQXJyYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmVsdC5jaGlsZHJlbikuZmlsdGVyKGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgcmV0dXJuIGMudGFnTmFtZSA9PT0gJ0lOUFVUJztcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgdGltZXMgPSAtMTtcbiAgICBzZWxmLm9wdGlvbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgIG9wdC50eXBlID0gJ3JhZGlvJztcbiAgICAgIG9wdC5pbm5lckhUTUwgPSBuYW1lO1xuICAgICAgaWYgKHZhbHVlKSBvcHQudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGVsc2Ugb3B0LnZhbHVlID0gbmFtZTtcbiAgICAgIG9wdC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnZGVmYXVsdHJhZGlvJyArIGNvdW50KTtcbiAgICAgIGVsdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgdGltZXMrKztcbiAgICAgICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICAgICAgb3B0LnNldEF0dHJpYnV0ZSgnaWQnLCAnZGVmYXVsdHJhZGlvJyArIGNvdW50ICsgJy0nICsgdGltZXMpO1xuICAgICAgICBsYWJlbC5odG1sRm9yID0gJ2RlZmF1bHRyYWRpbycgKyBjb3VudCArICctJyArIHRpbWVzO1xuICAgICAgICBsYWJlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuYW1lKSk7XG4gICAgICAgIGVsdC5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH07XG4gICAgc2VsZi5zZWxlY3RlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBpbnB1dENoaWxkcmVuID0gc2VsZi5fZ2V0SW5wdXRDaGlsZHJlbkFycmF5KCk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGlucHV0Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaW5wdXRDaGlsZHJlbltpXS52YWx1ZSA9PT0gdmFsdWUpIGlucHV0Q2hpbGRyZW5baV0uY2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXRDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChpbnB1dENoaWxkcmVuW2ldLmNoZWNrZWQgPT09IHRydWUpIHJldHVybiBpbnB1dENoaWxkcmVuW2ldLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBzZWxmLnZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGlucHV0Q2hpbGRyZW4gPSBzZWxmLl9nZXRJbnB1dENoaWxkcmVuQXJyYXkoKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXRDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChpbnB1dENoaWxkcmVuW2ldLnZhbHVlID09PSB2YWx1ZSkgaW5wdXRDaGlsZHJlbltpXS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnB1dENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGlucHV0Q2hpbGRyZW5baV0uY2hlY2tlZCA9PT0gdHJ1ZSkgcmV0dXJuIGlucHV0Q2hpbGRyZW5baV0udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gJmx0O2lucHV0Jmd0OyZsdDsvaW5wdXQmZ3Q7IGVsZW1lbnQgaW4gdGhlIERPTSBmb3IgdGV4dCBpbnB1dC5cbiAgICogVXNlIC5zaXplKCkgdG8gc2V0IHRoZSBkaXNwbGF5IGxlbmd0aCBvZiB0aGUgYm94LlxuICAgKiBBcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2VcbiAgICogYXBwZW5kcyB0byBib2R5LlxuICAgKlxuICAgKiBAbWV0aG9kIGNyZWF0ZUlucHV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGlucHV0IGJveFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3R5cGVdIHR5cGUgb2YgdGV4dCwgaWUgdGV4dCwgcGFzc3dvcmQgZXRjLiBEZWZhdWx0cyB0byB0ZXh0XG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fSBwb2ludGVyIHRvIHA1LkVsZW1lbnQgaG9sZGluZyBjcmVhdGVkIG5vZGVcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICB2YXIgaW5wID0gY3JlYXRlSW5wdXQoJycpO1xuICAgKiAgIGlucC5pbnB1dChteUlucHV0RXZlbnQpO1xuICAgKiB9XG4gICAqXG4gICAqIGZ1bmN0aW9uIG15SW5wdXRFdmVudCgpIHtcbiAgICogICBjb25zb2xlLmxvZygneW91IGFyZSB0eXBpbmc6ICcsIHRoaXMudmFsdWUoKSk7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUucHJvdG90eXBlLmNyZWF0ZUlucHV0ID0gZnVuY3Rpb24odmFsdWUsIHR5cGUpIHtcbiAgICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjcmVhdGVJbnB1dCcsIGFyZ3VtZW50cyk7XG4gICAgdmFyIGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgZWx0LnR5cGUgPSB0eXBlID8gdHlwZSA6ICd0ZXh0JztcbiAgICBpZiAodmFsdWUpIGVsdC52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiBhZGRFbGVtZW50KGVsdCwgdGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gJmx0O2lucHV0Jmd0OyZsdDsvaW5wdXQmZ3Q7IGVsZW1lbnQgaW4gdGhlIERPTSBvZiB0eXBlICdmaWxlJy5cbiAgICogVGhpcyBhbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGxvY2FsIGZpbGVzIGZvciB1c2UgaW4gYSBza2V0Y2guXG4gICAqXG4gICAqIEBtZXRob2QgY3JlYXRlRmlsZUlucHV0XG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB3aGVuIGEgZmlsZSBsb2FkZWRcbiAgICogQHBhcmFtICB7U3RyaW5nfSBbbXVsdGlwbGVdIG9wdGlvbmFsIHRvIGFsbG93IG11bHRpcGxlIGZpbGVzIHNlbGVjdGVkXG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fSBwb2ludGVyIHRvIHA1LkVsZW1lbnQgaG9sZGluZyBjcmVhdGVkIERPTSBlbGVtZW50XG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBpbnB1dDtcbiAgICogdmFyIGltZztcbiAgICpcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgaW5wdXQgPSBjcmVhdGVGaWxlSW5wdXQoaGFuZGxlRmlsZSk7XG4gICAqICAgaW5wdXQucG9zaXRpb24oMCwgMCk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gZHJhdygpIHtcbiAgICogICBpZiAoaW1nKSB7XG4gICAqICAgICBpbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBmdW5jdGlvbiBoYW5kbGVGaWxlKGZpbGUpIHtcbiAgICogICBwcmludChmaWxlKTtcbiAgICogICBpZiAoZmlsZS50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAqICAgICBpbWcgPSBjcmVhdGVJbWcoZmlsZS5kYXRhKTtcbiAgICogICAgIGltZy5oaWRlKCk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqL1xuICBwNS5wcm90b3R5cGUuY3JlYXRlRmlsZUlucHV0ID0gZnVuY3Rpb24oY2FsbGJhY2ssIG11bHRpcGxlKSB7XG4gICAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnY3JlYXRlRmlsZUlucHV0JywgYXJndW1lbnRzKTtcbiAgICAvLyBGdW5jdGlvbiB0byBoYW5kbGUgd2hlbiBhIGZpbGUgaXMgc2VsZWN0ZWRcbiAgICAvLyBXZSdyZSBzaW1wbGlmeWluZyBsaWZlIGFuZCBhc3N1bWluZyB0aGF0IHdlIGFsd2F5c1xuICAgIC8vIHdhbnQgdG8gbG9hZCBldmVyeSBzZWxlY3RlZCBmaWxlXG4gICAgZnVuY3Rpb24gaGFuZGxlRmlsZVNlbGVjdChldnQpIHtcbiAgICAgIGZ1bmN0aW9uIG1ha2VMb2FkZXIodGhlRmlsZSkge1xuICAgICAgICAvLyBNYWtpbmcgYSBwNS5GaWxlIG9iamVjdFxuICAgICAgICB2YXIgcDVmaWxlID0gbmV3IHA1LkZpbGUodGhlRmlsZSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgcDVmaWxlLmRhdGEgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgY2FsbGJhY2socDVmaWxlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZXNlIGFyZSB0aGUgZmlsZXNcbiAgICAgIHZhciBmaWxlcyA9IGV2dC50YXJnZXQuZmlsZXM7XG4gICAgICAvLyBMb2FkIGVhY2ggb25lIGFuZCB0cmlnZ2VyIGEgY2FsbGJhY2tcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGYgPSBmaWxlc1tpXTtcbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IG1ha2VMb2FkZXIoZik7XG5cbiAgICAgICAgLy8gVGV4dCBvciBkYXRhP1xuICAgICAgICAvLyBUaGlzIHNob3VsZCBsaWtlbHkgYmUgaW1wcm92ZWRcbiAgICAgICAgaWYgKGYudHlwZS5pbmRleE9mKCd0ZXh0JykgPiAtMSkge1xuICAgICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElzIHRoZSBmaWxlIHN0dWZmIHN1cHBvcnRlZD9cbiAgICBpZiAod2luZG93LkZpbGUgJiYgd2luZG93LkZpbGVSZWFkZXIgJiYgd2luZG93LkZpbGVMaXN0ICYmIHdpbmRvdy5CbG9iKSB7XG4gICAgICAvLyBZdXAsIHdlJ3JlIG9rIGFuZCBtYWtlIGFuIGlucHV0IGZpbGUgc2VsZWN0b3JcbiAgICAgIHZhciBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgZWx0LnR5cGUgPSAnZmlsZSc7XG5cbiAgICAgIC8vIElmIHdlIGdldCBhIHNlY29uZCBhcmd1bWVudCB0aGF0IGV2YWx1YXRlcyB0byB0cnVlXG4gICAgICAvLyB0aGVuIHdlIGFyZSBsb29raW5nIGZvciBtdWx0aXBsZSBmaWxlc1xuICAgICAgaWYgKG11bHRpcGxlKSB7XG4gICAgICAgIC8vIEFueXRoaW5nIGdldHMgdGhlIGpvYiBkb25lXG4gICAgICAgIGVsdC5tdWx0aXBsZSA9ICdtdWx0aXBsZSc7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdyBsZXQncyBoYW5kbGUgd2hlbiBhIGZpbGUgd2FzIHNlbGVjdGVkXG4gICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaGFuZGxlRmlsZVNlbGVjdCwgZmFsc2UpO1xuICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoZWx0LCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdUaGUgRmlsZSBBUElzIGFyZSBub3QgZnVsbHkgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3Nlci4gQ2Fubm90IGNyZWF0ZSBlbGVtZW50LidcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBWSURFTyBTVFVGRiAqKi9cblxuICBmdW5jdGlvbiBjcmVhdGVNZWRpYShwSW5zdCwgdHlwZSwgc3JjLCBjYWxsYmFjaykge1xuICAgIHZhciBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpO1xuXG4gICAgLy8gYWxsb3cgc3JjIHRvIGJlIGVtcHR5XG4gICAgc3JjID0gc3JjIHx8ICcnO1xuICAgIGlmICh0eXBlb2Ygc3JjID09PSAnc3RyaW5nJykge1xuICAgICAgc3JjID0gW3NyY107XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc291cmNlJyk7XG4gICAgICBzb3VyY2Uuc3JjID0gc3JjW2ldO1xuICAgICAgZWx0LmFwcGVuZENoaWxkKHNvdXJjZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgY2FsbGJhY2tIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIGVsdC5yZW1vdmVFdmVudExpc3RlbmVyKCdjYW5wbGF5dGhyb3VnaCcsIGNhbGxiYWNrSGFuZGxlcik7XG4gICAgICB9O1xuICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NhbnBsYXl0aHJvdWdoJywgY2FsbGJhY2tIYW5kbGVyKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IGFkZEVsZW1lbnQoZWx0LCBwSW5zdCwgdHJ1ZSk7XG4gICAgYy5sb2FkZWRtZXRhZGF0YSA9IGZhbHNlO1xuICAgIC8vIHNldCB3aWR0aCBhbmQgaGVpZ2h0IG9ubG9hZCBtZXRhZGF0YVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIGZ1bmN0aW9uKCkge1xuICAgICAgYy53aWR0aCA9IGVsdC52aWRlb1dpZHRoO1xuICAgICAgYy5oZWlnaHQgPSBlbHQudmlkZW9IZWlnaHQ7XG4gICAgICAvLyBzZXQgZWx0IHdpZHRoIGFuZCBoZWlnaHQgaWYgbm90IHNldFxuICAgICAgaWYgKGMuZWx0LndpZHRoID09PSAwKSBjLmVsdC53aWR0aCA9IGVsdC52aWRlb1dpZHRoO1xuICAgICAgaWYgKGMuZWx0LmhlaWdodCA9PT0gMCkgYy5lbHQuaGVpZ2h0ID0gZWx0LnZpZGVvSGVpZ2h0O1xuICAgICAgYy5sb2FkZWRtZXRhZGF0YSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYztcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBIVE1MNSAmbHQ7dmlkZW8mZ3Q7IGVsZW1lbnQgaW4gdGhlIERPTSBmb3Igc2ltcGxlIHBsYXliYWNrXG4gICAqIG9mIGF1ZGlvL3ZpZGVvLiBTaG93biBieSBkZWZhdWx0LCBjYW4gYmUgaGlkZGVuIHdpdGggLmhpZGUoKVxuICAgKiBhbmQgZHJhd24gaW50byBjYW52YXMgdXNpbmcgdmlkZW8oKS4gQXBwZW5kcyB0byB0aGUgY29udGFpbmVyXG4gICAqIG5vZGUgaWYgb25lIGlzIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGFwcGVuZHMgdG8gYm9keS4gVGhlIGZpcnN0IHBhcmFtZXRlclxuICAgKiBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHN0cmluZyBwYXRoIHRvIGEgdmlkZW8gZmlsZSwgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nXG4gICAqIHBhdGhzIHRvIGRpZmZlcmVudCBmb3JtYXRzIG9mIHRoZSBzYW1lIHZpZGVvLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZW5zdXJpbmdcbiAgICogdGhhdCB5b3VyIHZpZGVvIGNhbiBwbGF5IGFjcm9zcyBkaWZmZXJlbnQgYnJvd3NlcnMsIGFzIGVhY2ggc3VwcG9ydHNcbiAgICogZGlmZmVyZW50IGZvcm1hdHMuIFNlZSA8YSBocmVmPSdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML1N1cHBvcnRlZF9tZWRpYV9mb3JtYXRzJz50aGlzXG4gICAqIHBhZ2U8L2E+IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBvcnRlZCBmb3JtYXRzLlxuICAgKlxuICAgKiBAbWV0aG9kIGNyZWF0ZVZpZGVvXG4gICAqIEBwYXJhbSAge1N0cmluZ3xBcnJheX0gc3JjICBwYXRoIHRvIGEgdmlkZW8gZmlsZSwgb3IgYXJyYXkgb2YgcGF0aHMgZm9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nIGRpZmZlcmVudCBicm93c2Vyc1xuICAgKiBAcGFyYW0gIHtPYmplY3R9IFtjYWxsYmFja10gY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHVwb25cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYW5wbGF5dGhyb3VnaCcgZXZlbnQgZmlyZSwgdGhhdCBpcywgd2hlbiB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIgY2FuIHBsYXkgdGhlIG1lZGlhLCBhbmQgZXN0aW1hdGVzIHRoYXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVub3VnaCBkYXRhIGhhcyBiZWVuIGxvYWRlZCB0byBwbGF5IHRoZSBtZWRpYVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgdG8gaXRzIGVuZCB3aXRob3V0IGhhdmluZyB0byBzdG9wIGZvclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVydGhlciBidWZmZXJpbmcgb2YgY29udGVudFxuICAgKiBAcmV0dXJuIHtwNS5NZWRpYUVsZW1lbnR8cDUuRWxlbWVudH0gcG9pbnRlciB0byB2aWRlbyBwNS5FbGVtZW50XG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIHZhciB2aWQ7XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIHZpZCA9IGNyZWF0ZVZpZGVvKFsnc21hbGwubXA0JywgJ3NtYWxsLm9ndicsICdzbWFsbC53ZWJtJ10sIHZpZExvYWQpO1xuICAgKiB9XG4gICAqXG4gICAqIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHZpZGVvIGxvYWRzXG4gICAqIGZ1bmN0aW9uIHZpZExvYWQoKSB7XG4gICAqICAgdmlkLnBsYXkoKTtcbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5wcm90b3R5cGUuY3JlYXRlVmlkZW8gPSBmdW5jdGlvbihzcmMsIGNhbGxiYWNrKSB7XG4gICAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnY3JlYXRlVmlkZW8nLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiBjcmVhdGVNZWRpYSh0aGlzLCAndmlkZW8nLCBzcmMsIGNhbGxiYWNrKTtcbiAgfTtcblxuICAvKiogQVVESU8gU1RVRkYgKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBoaWRkZW4gSFRNTDUgJmx0O2F1ZGlvJmd0OyBlbGVtZW50IGluIHRoZSBET00gZm9yIHNpbXBsZSBhdWRpb1xuICAgKiBwbGF5YmFjay4gQXBwZW5kcyB0byB0aGUgY29udGFpbmVyIG5vZGUgaWYgb25lIGlzIHNwZWNpZmllZCxcbiAgICogb3RoZXJ3aXNlIGFwcGVuZHMgdG8gYm9keS4gVGhlIGZpcnN0IHBhcmFtZXRlclxuICAgKiBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHN0cmluZyBwYXRoIHRvIGEgYXVkaW8gZmlsZSwgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nXG4gICAqIHBhdGhzIHRvIGRpZmZlcmVudCBmb3JtYXRzIG9mIHRoZSBzYW1lIGF1ZGlvLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZW5zdXJpbmdcbiAgICogdGhhdCB5b3VyIGF1ZGlvIGNhbiBwbGF5IGFjcm9zcyBkaWZmZXJlbnQgYnJvd3NlcnMsIGFzIGVhY2ggc3VwcG9ydHNcbiAgICogZGlmZmVyZW50IGZvcm1hdHMuIFNlZSA8YSBocmVmPSdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML1N1cHBvcnRlZF9tZWRpYV9mb3JtYXRzJz50aGlzXG4gICAqIHBhZ2UgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcG9ydGVkIGZvcm1hdHM8L2E+LlxuICAgKlxuICAgKiBAbWV0aG9kIGNyZWF0ZUF1ZGlvXG4gICAqIEBwYXJhbSAge1N0cmluZ3xTdHJpbmdbXX0gW3NyY10gcGF0aCB0byBhbiBhdWRpbyBmaWxlLCBvciBhcnJheSBvZiBwYXRoc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHN1cHBvcnRpbmcgZGlmZmVyZW50IGJyb3dzZXJzXG4gICAqIEBwYXJhbSAge09iamVjdH0gW2NhbGxiYWNrXSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdXBvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhbnBsYXl0aHJvdWdoJyBldmVudCBmaXJlLCB0aGF0IGlzLCB3aGVuIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlciBjYW4gcGxheSB0aGUgbWVkaWEsIGFuZCBlc3RpbWF0ZXMgdGhhdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5vdWdoIGRhdGEgaGFzIGJlZW4gbG9hZGVkIHRvIHBsYXkgdGhlIG1lZGlhXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCB0byBpdHMgZW5kIHdpdGhvdXQgaGF2aW5nIHRvIHN0b3AgZm9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXJ0aGVyIGJ1ZmZlcmluZyBvZiBjb250ZW50XG4gICAqIEByZXR1cm4ge3A1Lk1lZGlhRWxlbWVudHxwNS5FbGVtZW50fSBwb2ludGVyIHRvIGF1ZGlvIHA1LkVsZW1lbnQgIC8qKlxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiB2YXIgZWxlO1xuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICBlbGUgPSBjcmVhdGVBdWRpbygnYXNzZXRzL2JlYXQubXAzJyk7XG4gICAqXG4gICAqICAgLy8gaGVyZSB3ZSBzZXQgdGhlIGVsZW1lbnQgdG8gYXV0b3BsYXlcbiAgICogICAvLyBUaGUgZWxlbWVudCB3aWxsIHBsYXkgYXMgc29vblxuICAgKiAgIC8vIGFzIGl0IGlzIGFibGUgdG8gZG8gc28uXG4gICAqICAgZWxlLmF1dG9wbGF5KHRydWUpO1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1LnByb3RvdHlwZS5jcmVhdGVBdWRpbyA9IGZ1bmN0aW9uKHNyYywgY2FsbGJhY2spIHtcbiAgICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjcmVhdGVBdWRpbycsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGNyZWF0ZU1lZGlhKHRoaXMsICdhdWRpbycsIHNyYywgY2FsbGJhY2spO1xuICB9O1xuXG4gIC8qKiBDQU1FUkEgU1RVRkYgKiovXG5cbiAgcDUucHJvdG90eXBlLlZJREVPID0gJ3ZpZGVvJztcbiAgcDUucHJvdG90eXBlLkFVRElPID0gJ2F1ZGlvJztcblxuICAvLyBmcm9tOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTWVkaWFEZXZpY2VzL2dldFVzZXJNZWRpYVxuICAvLyBPbGRlciBicm93c2VycyBtaWdodCBub3QgaW1wbGVtZW50IG1lZGlhRGV2aWNlcyBhdCBhbGwsIHNvIHdlIHNldCBhbiBlbXB0eSBvYmplY3QgZmlyc3RcbiAgaWYgKG5hdmlnYXRvci5tZWRpYURldmljZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMgPSB7fTtcbiAgfVxuXG4gIC8vIFNvbWUgYnJvd3NlcnMgcGFydGlhbGx5IGltcGxlbWVudCBtZWRpYURldmljZXMuIFdlIGNhbid0IGp1c3QgYXNzaWduIGFuIG9iamVjdFxuICAvLyB3aXRoIGdldFVzZXJNZWRpYSBhcyBpdCB3b3VsZCBvdmVyd3JpdGUgZXhpc3RpbmcgcHJvcGVydGllcy5cbiAgLy8gSGVyZSwgd2Ugd2lsbCBqdXN0IGFkZCB0aGUgZ2V0VXNlck1lZGlhIHByb3BlcnR5IGlmIGl0J3MgbWlzc2luZy5cbiAgaWYgKG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhID09PSB1bmRlZmluZWQpIHtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSA9IGZ1bmN0aW9uKGNvbnN0cmFpbnRzKSB7XG4gICAgICAvLyBGaXJzdCBnZXQgYWhvbGQgb2YgdGhlIGxlZ2FjeSBnZXRVc2VyTWVkaWEsIGlmIHByZXNlbnRcbiAgICAgIHZhciBnZXRVc2VyTWVkaWEgPVxuICAgICAgICBuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhIHx8IG5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWE7XG5cbiAgICAgIC8vIFNvbWUgYnJvd3NlcnMganVzdCBkb24ndCBpbXBsZW1lbnQgaXQgLSByZXR1cm4gYSByZWplY3RlZCBwcm9taXNlIHdpdGggYW4gZXJyb3JcbiAgICAgIC8vIHRvIGtlZXAgYSBjb25zaXN0ZW50IGludGVyZmFjZVxuICAgICAgaWYgKCFnZXRVc2VyTWVkaWEpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcignZ2V0VXNlck1lZGlhIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGJyb3dzZXInKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlcndpc2UsIHdyYXAgdGhlIGNhbGwgdG8gdGhlIG9sZCBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhIHdpdGggYSBQcm9taXNlXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGdldFVzZXJNZWRpYS5jYWxsKG5hdmlnYXRvciwgY29uc3RyYWludHMsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIDxwPkNyZWF0ZXMgYSBuZXcgSFRNTDUgJmx0O3ZpZGVvJmd0OyBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGF1ZGlvL3ZpZGVvXG4gICAqIGZlZWQgZnJvbSBhIHdlYmNhbS4gVGhlIGVsZW1lbnQgaXMgc2VwYXJhdGUgZnJvbSB0aGUgY2FudmFzIGFuZCBpc1xuICAgKiBkaXNwbGF5ZWQgYnkgZGVmYXVsdC4gVGhlIGVsZW1lbnQgY2FuIGJlIGhpZGRlbiB1c2luZyAuaGlkZSgpLiBUaGUgZmVlZFxuICAgKiBjYW4gYmUgZHJhd24gb250byB0aGUgY2FudmFzIHVzaW5nIGltYWdlKCkuPC9wPlxuICAgKiA8cD5Nb3JlIHNwZWNpZmljIHByb3BlcnRpZXMgb2YgdGhlIGZlZWQgY2FuIGJlIHBhc3NpbmcgaW4gYSBDb25zdHJhaW50cyBvYmplY3QuXG4gICAqIFNlZSB0aGVcbiAgICogPGEgaHJlZj0naHR0cDovL3czYy5naXRodWIuaW8vbWVkaWFjYXB0dXJlLW1haW4vZ2V0dXNlcm1lZGlhLmh0bWwjbWVkaWEtdHJhY2stY29uc3RyYWludHMnPiBXM0NcbiAgICogc3BlYzwvYT4gZm9yIHBvc3NpYmxlIHByb3BlcnRpZXMuIE5vdGUgdGhhdCBub3QgYWxsIG9mIHRoZXNlIGFyZSBzdXBwb3J0ZWRcbiAgICogYnkgYWxsIGJyb3dzZXJzLjwvcD5cbiAgICogPHA+U2VjdXJpdHkgbm90ZTogQSBuZXcgYnJvd3NlciBzZWN1cml0eSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoYXQgZ2V0VXNlck1lZGlhLFxuICAgKiB3aGljaCBpcyBiZWhpbmQgY3JlYXRlQ2FwdHVyZSgpLCBvbmx5IHdvcmtzIHdoZW4geW91J3JlIHJ1bm5pbmcgdGhlIGNvZGUgbG9jYWxseSxcbiAgICogb3Igb24gSFRUUFMuIExlYXJuIG1vcmUgPGEgaHJlZj0naHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNDE5NzY1My9nZXR1c2VybWVkaWEtaW4tY2hyb21lLTQ3LXdpdGhvdXQtdXNpbmctaHR0cHMnPmhlcmU8L2E+XG4gICAqIGFuZCA8YSBocmVmPSdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTWVkaWFEZXZpY2VzL2dldFVzZXJNZWRpYSc+aGVyZTwvYT4uPC9wPlxuICAgKlxuICAgKiBAbWV0aG9kIGNyZWF0ZUNhcHR1cmVcbiAgICogQHBhcmFtICB7U3RyaW5nfENvbnN0YW50fE9iamVjdH0gICB0eXBlIHR5cGUgb2YgY2FwdHVyZSwgZWl0aGVyIFZJREVPIG9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJTyBpZiBub25lIHNwZWNpZmllZCwgZGVmYXVsdCBib3RoLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBDb25zdHJhaW50cyBvYmplY3RcbiAgICogQHBhcmFtICB7RnVuY3Rpb259ICAgICAgICAgICAgICAgICBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb25jZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGhhcyBsb2FkZWRcbiAgICogQHJldHVybiB7T2JqZWN0fHA1LkVsZW1lbnR9IGNhcHR1cmUgdmlkZW8gcDUuRWxlbWVudFxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlciBub3Rlc3QnPjxjb2RlPlxuICAgKiB2YXIgY2FwdHVyZTtcbiAgICpcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgY3JlYXRlQ2FudmFzKDQ4MCwgNDgwKTtcbiAgICogICBjYXB0dXJlID0gY3JlYXRlQ2FwdHVyZShWSURFTyk7XG4gICAqICAgY2FwdHVyZS5oaWRlKCk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gZHJhdygpIHtcbiAgICogICBpbWFnZShjYXB0dXJlLCAwLCAwLCB3aWR0aCwgd2lkdGggKiBjYXB0dXJlLmhlaWdodCAvIGNhcHR1cmUud2lkdGgpO1xuICAgKiAgIGZpbHRlcihJTlZFUlQpO1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz48Y29kZT5cbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgY3JlYXRlQ2FudmFzKDQ4MCwgMTIwKTtcbiAgICogICB2YXIgY29uc3RyYWludHMgPSB7XG4gICAqICAgICB2aWRlbzoge1xuICAgKiAgICAgICBtYW5kYXRvcnk6IHtcbiAgICogICAgICAgICBtaW5XaWR0aDogMTI4MCxcbiAgICogICAgICAgICBtaW5IZWlnaHQ6IDcyMFxuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBvcHRpb25hbDogW3sgbWF4RnJhbWVSYXRlOiAxMCB9XVxuICAgKiAgICAgfSxcbiAgICogICAgIGF1ZGlvOiB0cnVlXG4gICAqICAgfTtcbiAgICogICBjcmVhdGVDYXB0dXJlKGNvbnN0cmFpbnRzLCBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICogICAgIGNvbnNvbGUubG9nKHN0cmVhbSk7XG4gICAqICAgfSk7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUucHJvdG90eXBlLmNyZWF0ZUNhcHR1cmUgPSBmdW5jdGlvbigpIHtcbiAgICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjcmVhdGVDYXB0dXJlJywgYXJndW1lbnRzKTtcbiAgICB2YXIgdXNlVmlkZW8gPSB0cnVlO1xuICAgIHZhciB1c2VBdWRpbyA9IHRydWU7XG4gICAgdmFyIGNvbnN0cmFpbnRzO1xuICAgIHZhciBjYjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gcDUucHJvdG90eXBlLlZJREVPKSB7XG4gICAgICAgIHVzZUF1ZGlvID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50c1tpXSA9PT0gcDUucHJvdG90eXBlLkFVRElPKSB7XG4gICAgICAgIHVzZVZpZGVvID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0cmFpbnRzID0gYXJndW1lbnRzW2ldO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNiID0gYXJndW1lbnRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobmF2aWdhdG9yLmdldFVzZXJNZWRpYSkge1xuICAgICAgdmFyIGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG5cbiAgICAgIGlmICghY29uc3RyYWludHMpIHtcbiAgICAgICAgY29uc3RyYWludHMgPSB7IHZpZGVvOiB1c2VWaWRlbywgYXVkaW86IHVzZUF1ZGlvIH07XG4gICAgICB9XG5cbiAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKS50aGVuKFxuICAgICAgICBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCdzcmNPYmplY3QnIGluIGVsdCkge1xuICAgICAgICAgICAgICBlbHQuc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWx0LnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBlbHQuc3JjID0gc3RyZWFtO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICAgIGNiKHN0cmVhbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93ICdnZXRVc2VyTWVkaWEgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInO1xuICAgIH1cbiAgICB2YXIgYyA9IGFkZEVsZW1lbnQoZWx0LCB0aGlzLCB0cnVlKTtcbiAgICBjLmxvYWRlZG1ldGFkYXRhID0gZmFsc2U7XG4gICAgLy8gc2V0IHdpZHRoIGFuZCBoZWlnaHQgb25sb2FkIG1ldGFkYXRhXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgZnVuY3Rpb24oKSB7XG4gICAgICBlbHQucGxheSgpO1xuICAgICAgaWYgKGVsdC53aWR0aCkge1xuICAgICAgICBjLndpZHRoID0gZWx0LnZpZGVvV2lkdGggPSBlbHQud2lkdGg7XG4gICAgICAgIGMuaGVpZ2h0ID0gZWx0LnZpZGVvSGVpZ2h0ID0gZWx0LmhlaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGMud2lkdGggPSBjLmVsdC53aWR0aCA9IGVsdC52aWRlb1dpZHRoO1xuICAgICAgICBjLmhlaWdodCA9IGMuZWx0LmhlaWdodCA9IGVsdC52aWRlb0hlaWdodDtcbiAgICAgIH1cbiAgICAgIGMubG9hZGVkbWV0YWRhdGEgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiBjO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGVsZW1lbnQgd2l0aCBnaXZlbiB0YWcgaW4gdGhlIERPTSB3aXRoIGdpdmVuIGNvbnRlbnQuXG4gICAqIEFwcGVuZHMgdG8gdGhlIGNvbnRhaW5lciBub2RlIGlmIG9uZSBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZVxuICAgKiBhcHBlbmRzIHRvIGJvZHkuXG4gICAqXG4gICAqIEBtZXRob2QgY3JlYXRlRWxlbWVudFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHRhZyB0YWcgZm9yIHRoZSBuZXcgZWxlbWVudFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IFtjb250ZW50XSBodG1sIGNvbnRlbnQgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZWxlbWVudFxuICAgKiBAcmV0dXJuIHtPYmplY3R8cDUuRWxlbWVudH0gcG9pbnRlciB0byBwNS5FbGVtZW50IGhvbGRpbmcgY3JlYXRlZCBub2RlXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAgICogY3JlYXRlRWxlbWVudCgnaDInLCAnaW0gYW4gaDIgcDUuZWxlbWVudCEnKTtcbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbih0YWcsIGNvbnRlbnQpIHtcbiAgICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjcmVhdGVFbGVtZW50JywgYXJndW1lbnRzKTtcbiAgICB2YXIgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICAgIGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGVsdC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gYWRkRWxlbWVudChlbHQsIHRoaXMpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHA1LkVsZW1lbnQgYWRkaXRpb25zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKlxuICAgKiBBZGRzIHNwZWNpZmllZCBjbGFzcyB0byB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQGZvciBwNS5FbGVtZW50XG4gICAqIEBtZXRob2QgYWRkQ2xhc3NcbiAgICogQHBhcmFtICB7U3RyaW5nfSBjbGFzcyBuYW1lIG9mIGNsYXNzIHRvIGFkZFxuICAgKiBAcmV0dXJuIHtPYmplY3R8cDUuRWxlbWVudH1cbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiB2YXIgZGl2ID0gY3JlYXRlRGl2KCdkaXYnKTtcbiAgICogZGl2LmFkZENsYXNzKCdteUNsYXNzJyk7XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1LkVsZW1lbnQucHJvdG90eXBlLmFkZENsYXNzID0gZnVuY3Rpb24oYykge1xuICAgIGlmICh0aGlzLmVsdC5jbGFzc05hbWUpIHtcbiAgICAgIC8vIFBFTkQgZG9uJ3QgYWRkIGNsYXNzIG1vcmUgdGhhbiBvbmNlXG4gICAgICAvL3ZhciByZWdleCA9IG5ldyBSZWdFeHAoJ1teYS16QS1aXFxkOl0/JytjKydbXmEtekEtWlxcZDpdPycpO1xuICAgICAgLy9pZiAodGhpcy5lbHQuY2xhc3NOYW1lLnNlYXJjaCgvW15hLXpBLVpcXGQ6XT9oaVteYS16QS1aXFxkOl0/LykgPT09IC0xKSB7XG4gICAgICB0aGlzLmVsdC5jbGFzc05hbWUgPSB0aGlzLmVsdC5jbGFzc05hbWUgKyAnICcgKyBjO1xuICAgICAgLy99XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWx0LmNsYXNzTmFtZSA9IGM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBSZW1vdmVzIHNwZWNpZmllZCBjbGFzcyBmcm9tIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAbWV0aG9kIHJlbW92ZUNsYXNzXG4gICAqIEBwYXJhbSAge1N0cmluZ30gY2xhc3MgbmFtZSBvZiBjbGFzcyB0byByZW1vdmVcbiAgICogQHJldHVybiB7T2JqZWN0fHA1LkVsZW1lbnR9ICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gICAqIC8vIEluIHRoaXMgZXhhbXBsZSwgYSBjbGFzcyBpcyBzZXQgd2hlbiB0aGUgZGl2IGlzIGNyZWF0ZWRcbiAgICogLy8gYW5kIHJlbW92ZWQgd2hlbiBtb3VzZSBpcyBwcmVzc2VkLiBUaGlzIGNvdWxkIGxpbmsgdXBcbiAgICogLy8gd2l0aCBhIENTUyBzdHlsZSBydWxlIHRvIHRvZ2dsZSBzdHlsZSBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiB2YXIgZGl2O1xuICAgKlxuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICBkaXYgPSBjcmVhdGVEaXYoJ2RpdicpO1xuICAgKiAgIGRpdi5hZGRDbGFzcygnbXlDbGFzcycpO1xuICAgKiB9XG4gICAqXG4gICAqIGZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcbiAgICogICBkaXYucmVtb3ZlQ2xhc3MoJ215Q2xhc3MnKTtcbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5FbGVtZW50LnByb3RvdHlwZS5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uKGMpIHtcbiAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCcoPzpefFxcXFxzKScgKyBjICsgJyg/IVxcXFxTKScpO1xuICAgIHRoaXMuZWx0LmNsYXNzTmFtZSA9IHRoaXMuZWx0LmNsYXNzTmFtZS5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAgdGhpcy5lbHQuY2xhc3NOYW1lID0gdGhpcy5lbHQuY2xhc3NOYW1lLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTsgLy9wcmV0dGlmeSAob3B0aW9uYWwpXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqXG4gICAqIEF0dGFjaGVzIHRoZSBlbGVtZW50ICBhcyBhIGNoaWxkIHRvIHRoZSBwYXJlbnQgc3BlY2lmaWVkLlxuICAgKiBBY2NlcHRzIGVpdGhlciBhIHN0cmluZyBJRCwgRE9NIG5vZGUsIG9yIHA1LkVsZW1lbnQuXG4gICAqIElmIG5vIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgYW4gYXJyYXkgb2YgY2hpbGRyZW4gRE9NIG5vZGVzIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAbWV0aG9kIGNoaWxkXG4gICAqIEBwYXJhbSAge1N0cmluZ3xPYmplY3R8cDUuRWxlbWVudH0gW2NoaWxkXSB0aGUgSUQsIERPTSBub2RlLCBvciBwNS5FbGVtZW50XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFkZCB0byB0aGUgY3VycmVudCBlbGVtZW50XG4gICAqIEByZXR1cm4ge3A1LkVsZW1lbnR9XG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAgICogdmFyIGRpdjAgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIHBhcmVudCcpO1xuICAgKiB2YXIgZGl2MSA9IGNyZWF0ZURpdigndGhpcyBpcyB0aGUgY2hpbGQnKTtcbiAgICogZGl2MC5jaGlsZChkaXYxKTsgLy8gdXNlIHA1LkVsZW1lbnRcbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gICAqIHZhciBkaXYwID0gY3JlYXRlRGl2KCd0aGlzIGlzIHRoZSBwYXJlbnQnKTtcbiAgICogdmFyIGRpdjEgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIGNoaWxkJyk7XG4gICAqIGRpdjEuaWQoJ2FwcGxlcycpO1xuICAgKiBkaXYwLmNoaWxkKCdhcHBsZXMnKTsgLy8gdXNlIGlkXG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz48Y29kZT5cbiAgICogdmFyIGRpdjAgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIHBhcmVudCcpO1xuICAgKiB2YXIgZWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215Q2hpbGREaXYnKTtcbiAgICogZGl2MC5jaGlsZChlbHQpOyAvLyB1c2UgZWxlbWVudCBmcm9tIHBhZ2VcbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUuRWxlbWVudC5wcm90b3R5cGUuY2hpbGQgPSBmdW5jdGlvbihjKSB7XG4gICAgaWYgKHR5cGVvZiBjID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZWx0LmNoaWxkTm9kZXM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChjWzBdID09PSAnIycpIHtcbiAgICAgICAgYyA9IGMuc3Vic3RyaW5nKDEpO1xuICAgICAgfVxuICAgICAgYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGMpO1xuICAgIH0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIHA1LkVsZW1lbnQpIHtcbiAgICAgIGMgPSBjLmVsdDtcbiAgICB9XG4gICAgdGhpcy5lbHQuYXBwZW5kQ2hpbGQoYyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIENlbnRlcnMgYSBwNSBFbGVtZW50IGVpdGhlciB2ZXJ0aWNhbGx5LCBob3Jpem9udGFsbHksXG4gICAqIG9yIGJvdGgsIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgb3IgYWNjb3JkaW5nIHRvXG4gICAqIHRoZSBib2R5IGlmIHRoZSBFbGVtZW50IGhhcyBubyBwYXJlbnQuIElmIG5vIGFyZ3VtZW50IGlzIHBhc3NlZFxuICAgKiB0aGUgRWxlbWVudCBpcyBhbGlnbmVkIGJvdGggdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LlxuICAgKlxuICAgKiBAbWV0aG9kIGNlbnRlclxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IFthbGlnbl0gICAgICAgcGFzc2luZyAndmVydGljYWwnLCAnaG9yaXpvbnRhbCcgYWxpZ25zIGVsZW1lbnQgYWNjb3JkaW5nbHlcbiAgICogQHJldHVybiB7T2JqZWN0fHA1LkVsZW1lbnR9IHBvaW50ZXIgdG8gcDUuRWxlbWVudFxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICB2YXIgZGl2ID0gY3JlYXRlRGl2KCcnKS5zaXplKDEwLCAxMCk7XG4gICAqICAgZGl2LnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ29yYW5nZScpO1xuICAgKiAgIGRpdi5jZW50ZXIoKTtcbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5FbGVtZW50LnByb3RvdHlwZS5jZW50ZXIgPSBmdW5jdGlvbihhbGlnbikge1xuICAgIHZhciBzdHlsZSA9IHRoaXMuZWx0LnN0eWxlLmRpc3BsYXk7XG4gICAgdmFyIGhpZGRlbiA9IHRoaXMuZWx0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJztcbiAgICB2YXIgcGFyZW50SGlkZGVuID0gdGhpcy5wYXJlbnQoKS5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZSc7XG4gICAgdmFyIHBvcyA9IHsgeDogdGhpcy5lbHQub2Zmc2V0TGVmdCwgeTogdGhpcy5lbHQub2Zmc2V0VG9wIH07XG5cbiAgICBpZiAoaGlkZGVuKSB0aGlzLnNob3coKTtcblxuICAgIHRoaXMuZWx0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHRoaXMucG9zaXRpb24oMCwgMCk7XG5cbiAgICBpZiAocGFyZW50SGlkZGVuKSB0aGlzLnBhcmVudCgpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgdmFyIHdPZmZzZXQgPSBNYXRoLmFicyh0aGlzLnBhcmVudCgpLm9mZnNldFdpZHRoIC0gdGhpcy5lbHQub2Zmc2V0V2lkdGgpO1xuICAgIHZhciBoT2Zmc2V0ID0gTWF0aC5hYnModGhpcy5wYXJlbnQoKS5vZmZzZXRIZWlnaHQgLSB0aGlzLmVsdC5vZmZzZXRIZWlnaHQpO1xuICAgIHZhciB5ID0gcG9zLnk7XG4gICAgdmFyIHggPSBwb3MueDtcblxuICAgIGlmIChhbGlnbiA9PT0gJ2JvdGgnIHx8IGFsaWduID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucG9zaXRpb24od09mZnNldCAvIDIsIGhPZmZzZXQgLyAyKTtcbiAgICB9IGVsc2UgaWYgKGFsaWduID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIHRoaXMucG9zaXRpb24od09mZnNldCAvIDIsIHkpO1xuICAgIH0gZWxzZSBpZiAoYWxpZ24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIHRoaXMucG9zaXRpb24oeCwgaE9mZnNldCAvIDIpO1xuICAgIH1cblxuICAgIHRoaXMuc3R5bGUoJ2Rpc3BsYXknLCBzdHlsZSk7XG5cbiAgICBpZiAoaGlkZGVuKSB0aGlzLmhpZGUoKTtcblxuICAgIGlmIChwYXJlbnRIaWRkZW4pIHRoaXMucGFyZW50KCkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBJZiBhbiBhcmd1bWVudCBpcyBnaXZlbiwgc2V0cyB0aGUgaW5uZXIgSFRNTCBvZiB0aGUgZWxlbWVudCxcbiAgICogcmVwbGFjaW5nIGFueSBleGlzdGluZyBodG1sLiBJZiB0cnVlIGlzIGluY2x1ZGVkIGFzIGEgc2Vjb25kXG4gICAqIGFyZ3VtZW50LCBodG1sIGlzIGFwcGVuZGVkIGluc3RlYWQgb2YgcmVwbGFjaW5nIGV4aXN0aW5nIGh0bWwuXG4gICAqIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHJldHVybnNcbiAgICogdGhlIGlubmVyIEhUTUwgb2YgdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqIEBmb3IgcDUuRWxlbWVudFxuICAgKiBAbWV0aG9kIGh0bWxcbiAgICogQHBhcmFtICB7U3RyaW5nfSBbaHRtbF0gdGhlIEhUTUwgdG8gYmUgcGxhY2VkIGluc2lkZSB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gIHtib29sZWFufSBbYXBwZW5kXSB3aGV0aGVyIHRvIGFwcGVuZCBIVE1MIHRvIGV4aXN0aW5nXG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fFN0cmluZ31cbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiB2YXIgZGl2ID0gY3JlYXRlRGl2KCcnKS5zaXplKDEwMCwgMTAwKTtcbiAgICogZGl2Lmh0bWwoJ2hpJyk7XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiB2YXIgZGl2ID0gY3JlYXRlRGl2KCdIZWxsbyAnKS5zaXplKDEwMCwgMTAwKTtcbiAgICogZGl2Lmh0bWwoJ1dvcmxkJywgdHJ1ZSk7XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1LkVsZW1lbnQucHJvdG90eXBlLmh0bWwgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWx0LmlubmVySFRNTDtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50c1sxXSkge1xuICAgICAgdGhpcy5lbHQuaW5uZXJIVE1MICs9IGFyZ3VtZW50c1swXTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVsdC5pbm5lckhUTUwgPSBhcmd1bWVudHNbMF07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqXG4gICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IHJlbGF0aXZlIHRvICgwLCAwKSBvZiB0aGVcbiAgICogd2luZG93LiBFc3NlbnRpYWxseSwgc2V0cyBwb3NpdGlvbjphYnNvbHV0ZSBhbmQgbGVmdCBhbmQgdG9wXG4gICAqIHByb3BlcnRpZXMgb2Ygc3R5bGUuIElmIG5vIGFyZ3VtZW50cyBnaXZlbiByZXR1cm5zIHRoZSB4IGFuZCB5IHBvc2l0aW9uXG4gICAqIG9mIHRoZSBlbGVtZW50IGluIGFuIG9iamVjdC5cbiAgICpcbiAgICogQG1ldGhvZCBwb3NpdGlvblxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IFt4XSB4LXBvc2l0aW9uIHJlbGF0aXZlIHRvIHVwcGVyIGxlZnQgb2Ygd2luZG93XG4gICAqIEBwYXJhbSAge051bWJlcn0gW3ldIHktcG9zaXRpb24gcmVsYXRpdmUgdG8gdXBwZXIgbGVmdCBvZiB3aW5kb3dcbiAgICogQHJldHVybiB7T2JqZWN0fHA1LkVsZW1lbnR9XG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGUgY2xhc3M9J25vcmVuZGVyJz5cbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgdmFyIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gICAqICAgLy8gcG9zaXRpb25zIGNhbnZhcyA1MHB4IHRvIHRoZSByaWdodCBhbmQgMTAwcHhcbiAgICogICAvLyBiZWxvdyB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93XG4gICAqICAgY252LnBvc2l0aW9uKDUwLCAxMDApO1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1LkVsZW1lbnQucHJvdG90eXBlLnBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IHg6IHRoaXMuZWx0Lm9mZnNldExlZnQsIHk6IHRoaXMuZWx0Lm9mZnNldFRvcCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVsdC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICB0aGlzLmVsdC5zdHlsZS5sZWZ0ID0gYXJndW1lbnRzWzBdICsgJ3B4JztcbiAgICAgIHRoaXMuZWx0LnN0eWxlLnRvcCA9IGFyZ3VtZW50c1sxXSArICdweCc7XG4gICAgICB0aGlzLnggPSBhcmd1bWVudHNbMF07XG4gICAgICB0aGlzLnkgPSBhcmd1bWVudHNbMV07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH07XG5cbiAgLyogSGVscGVyIG1ldGhvZCBjYWxsZWQgYnkgcDUuRWxlbWVudC5zdHlsZSgpICovXG4gIHA1LkVsZW1lbnQucHJvdG90eXBlLl90cmFuc2xhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmVsdC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgLy8gc2F2ZSBvdXQgaW5pdGlhbCBub24tdHJhbnNsYXRlIHRyYW5zZm9ybSBzdHlsaW5nXG4gICAgdmFyIHRyYW5zZm9ybSA9ICcnO1xuICAgIGlmICh0aGlzLmVsdC5zdHlsZS50cmFuc2Zvcm0pIHtcbiAgICAgIHRyYW5zZm9ybSA9IHRoaXMuZWx0LnN0eWxlLnRyYW5zZm9ybS5yZXBsYWNlKC90cmFuc2xhdGUzZFxcKC4qXFwpL2csICcnKTtcbiAgICAgIHRyYW5zZm9ybSA9IHRyYW5zZm9ybS5yZXBsYWNlKC90cmFuc2xhdGVbWC1aXT9cXCguKlxcKS9nLCAnJyk7XG4gICAgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLmVsdC5zdHlsZS50cmFuc2Zvcm0gPVxuICAgICAgICAndHJhbnNsYXRlKCcgKyBhcmd1bWVudHNbMF0gKyAncHgsICcgKyBhcmd1bWVudHNbMV0gKyAncHgpJztcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICB0aGlzLmVsdC5zdHlsZS50cmFuc2Zvcm0gPVxuICAgICAgICAndHJhbnNsYXRlM2QoJyArXG4gICAgICAgIGFyZ3VtZW50c1swXSArXG4gICAgICAgICdweCwnICtcbiAgICAgICAgYXJndW1lbnRzWzFdICtcbiAgICAgICAgJ3B4LCcgK1xuICAgICAgICBhcmd1bWVudHNbMl0gK1xuICAgICAgICAncHgpJztcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHRoaXMuZWx0LnBhcmVudEVsZW1lbnQuc3R5bGUucGVyc3BlY3RpdmUgPSAnMTAwMHB4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWx0LnBhcmVudEVsZW1lbnQuc3R5bGUucGVyc3BlY3RpdmUgPSBhcmd1bWVudHNbM10gKyAncHgnO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgYW55IGV4dHJhIHRyYW5zZm9ybSBzdHlsaW5nIGJhY2sgb24gZW5kXG4gICAgdGhpcy5lbHQuc3R5bGUudHJhbnNmb3JtICs9IHRyYW5zZm9ybTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKiBIZWxwZXIgbWV0aG9kIGNhbGxlZCBieSBwNS5FbGVtZW50LnN0eWxlKCkgKi9cbiAgcDUuRWxlbWVudC5wcm90b3R5cGUuX3JvdGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIHNhdmUgb3V0IGluaXRpYWwgbm9uLXJvdGF0ZSB0cmFuc2Zvcm0gc3R5bGluZ1xuICAgIHZhciB0cmFuc2Zvcm0gPSAnJztcbiAgICBpZiAodGhpcy5lbHQuc3R5bGUudHJhbnNmb3JtKSB7XG4gICAgICB0cmFuc2Zvcm0gPSB0aGlzLmVsdC5zdHlsZS50cmFuc2Zvcm0ucmVwbGFjZSgvcm90YXRlM2RcXCguKlxcKS9nLCAnJyk7XG4gICAgICB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm0ucmVwbGFjZSgvcm90YXRlW1gtWl0/XFwoLipcXCkvZywgJycpO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLmVsdC5zdHlsZS50cmFuc2Zvcm0gPSAncm90YXRlKCcgKyBhcmd1bWVudHNbMF0gKyAnZGVnKSc7XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLmVsdC5zdHlsZS50cmFuc2Zvcm0gPVxuICAgICAgICAncm90YXRlKCcgKyBhcmd1bWVudHNbMF0gKyAnZGVnLCAnICsgYXJndW1lbnRzWzFdICsgJ2RlZyknO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgdGhpcy5lbHQuc3R5bGUudHJhbnNmb3JtID0gJ3JvdGF0ZVgoJyArIGFyZ3VtZW50c1swXSArICdkZWcpJztcbiAgICAgIHRoaXMuZWx0LnN0eWxlLnRyYW5zZm9ybSArPSAncm90YXRlWSgnICsgYXJndW1lbnRzWzFdICsgJ2RlZyknO1xuICAgICAgdGhpcy5lbHQuc3R5bGUudHJhbnNmb3JtICs9ICdyb3RhdGVaKCcgKyBhcmd1bWVudHNbMl0gKyAnZGVnKSc7XG4gICAgfVxuICAgIC8vIGFkZCByZW1haW5pbmcgdHJhbnNmb3JtIGJhY2sgb25cbiAgICB0aGlzLmVsdC5zdHlsZS50cmFuc2Zvcm0gKz0gdHJhbnNmb3JtO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnaXZlbiBzdHlsZSAoY3NzKSBwcm9wZXJ0eSAoMXN0IGFyZykgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGVcbiAgICogZ2l2ZW4gdmFsdWUgKDJuZCBhcmcpLiBJZiBhIHNpbmdsZSBhcmd1bWVudCBpcyBnaXZlbiwgLnN0eWxlKClcbiAgICogcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5OyBob3dldmVyLCBpZiB0aGUgc2luZ2xlIGFyZ3VtZW50XG4gICAqIGlzIGdpdmVuIGluIGNzcyBzeW50YXggKCd0ZXh0LWFsaWduOmNlbnRlcicpLCAuc3R5bGUoKSBzZXRzIHRoZSBjc3NcbiAgICogYXBwcm9wcmlhdGx5LiAuc3R5bGUoKSBhbHNvIGhhbmRsZXMgMmQgYW5kIDNkIGNzcyB0cmFuc2Zvcm1zLiBJZlxuICAgKiB0aGUgMXN0IGFyZyBpcyAncm90YXRlJywgJ3RyYW5zbGF0ZScsIG9yICdwb3NpdGlvbicsIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzXG4gICAqIGFjY2VwdCBOdW1iZXJzIGFzIHZhbHVlcy4gKCd0cmFuc2xhdGUnLCAxMCwgMTAwLCA1MCk7XG4gICAqXG4gICAqIEBtZXRob2Qgc3R5bGVcbiAgICogQHBhcmFtICB7U3RyaW5nfSBwcm9wZXJ0eSAgIHByb3BlcnR5IHRvIGJlIHNldFxuICAgKiBAcGFyYW0gIHtTdHJpbmd8TnVtYmVyfHA1LkNvbG9yfSBbdmFsdWVdICAgdmFsdWUgdG8gYXNzaWduIHRvIHByb3BlcnR5IChvbmx5IFN0cmluZ3xOdW1iZXIgZm9yIHJvdGF0ZS90cmFuc2xhdGUpXG4gICAqIEBwYXJhbSAge1N0cmluZ3xOdW1iZXJ8cDUuQ29sb3J9IFt2YWx1ZTJdICBwb3NpdGlvbiBjYW4gdGFrZSBhIDJuZCB2YWx1ZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd8TnVtYmVyfHA1LkNvbG9yfSBbdmFsdWUzXSAgdHJhbnNsYXRlIGNhbiB0YWtlIGEgMm5kICYgM3JkIHZhbHVlXG4gICAqIEByZXR1cm4ge1N0cmluZ3xPYmplY3R8cDUuRWxlbWVudH0gdmFsdWUgb2YgcHJvcGVydHksIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZFxuICAgKiBvciBwNS5FbGVtZW50XG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGUgY2xhc3M9J25vcmVuZGVyJz5cbiAgICogdmFyIG15RGl2ID0gY3JlYXRlRGl2KCdJIGxpa2UgcGFuZGFzLicpO1xuICAgKiBteURpdi5zdHlsZSgnZm9udC1zaXplJywgJzE4cHgnKTtcbiAgICogbXlEaXYuc3R5bGUoJ2NvbG9yJywgJyNmZjAwMDAnKTtcbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKiA8ZGl2Pjxjb2RlIGNsYXNzPSdub3JlbmRlcic+XG4gICAqIHZhciBjb2wgPSBjb2xvcigyNSwgMjMsIDIwMCwgNTApO1xuICAgKiB2YXIgYnV0dG9uID0gY3JlYXRlQnV0dG9uKCdidXR0b24nKTtcbiAgICogYnV0dG9uLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgY29sKTtcbiAgICogYnV0dG9uLnBvc2l0aW9uKDEwLCAxMCk7XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICogPGRpdj48Y29kZSBjbGFzcz0nbm9yZW5kZXInPlxuICAgKiB2YXIgbXlEaXYgPSBjcmVhdGVEaXYoJ0kgbGlrZSBsaXphcmRzLicpO1xuICAgKiBteURpdi5zdHlsZSgncG9zaXRpb24nLCAyMCwgMjApO1xuICAgKiBteURpdi5zdHlsZSgncm90YXRlJywgNDUpO1xuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqIDxkaXY+PGNvZGUgY2xhc3M9J25vcmVuZGVyJz5cbiAgICogdmFyIG15RGl2O1xuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gICAqICAgbXlEaXYgPSBjcmVhdGVEaXYoJ0kgbGlrZSBncmF5LicpO1xuICAgKiAgIG15RGl2LnBvc2l0aW9uKDIwLCAyMCk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gZHJhdygpIHtcbiAgICogICBteURpdi5zdHlsZSgnZm9udC1zaXplJywgbW91c2VYICsgJ3B4Jyk7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUuRWxlbWVudC5wcm90b3R5cGUuc3R5bGUgPSBmdW5jdGlvbihwcm9wLCB2YWwpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgcDUuQ29sb3IpIHtcbiAgICAgIHZhbCA9XG4gICAgICAgICdyZ2JhKCcgK1xuICAgICAgICB2YWwubGV2ZWxzWzBdICtcbiAgICAgICAgJywnICtcbiAgICAgICAgdmFsLmxldmVsc1sxXSArXG4gICAgICAgICcsJyArXG4gICAgICAgIHZhbC5sZXZlbHNbMl0gK1xuICAgICAgICAnLCcgK1xuICAgICAgICB2YWwubGV2ZWxzWzNdIC8gMjU1ICtcbiAgICAgICAgJyknO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHByb3AuaW5kZXhPZignOicpID09PSAtMSkge1xuICAgICAgICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc2VsZi5lbHQpO1xuICAgICAgICB2YXIgc3R5bGUgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKTtcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGF0dHJzID0gcHJvcC5zcGxpdCgnOycpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHBhcnRzID0gYXR0cnNbaV0uc3BsaXQoJzonKTtcbiAgICAgICAgICBpZiAocGFydHNbMF0gJiYgcGFydHNbMV0pIHtcbiAgICAgICAgICAgIHRoaXMuZWx0LnN0eWxlW3BhcnRzWzBdLnRyaW0oKV0gPSBwYXJ0c1sxXS50cmltKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wID09PSAncm90YXRlJyB8fCBwcm9wID09PSAndHJhbnNsYXRlJyB8fCBwcm9wID09PSAncG9zaXRpb24nKSB7XG4gICAgICAgIHZhciB0cmFucyA9IEFycmF5LnByb3RvdHlwZS5zaGlmdC5hcHBseShhcmd1bWVudHMpO1xuICAgICAgICB2YXIgZiA9IHRoaXNbdHJhbnNdIHx8IHRoaXNbJ18nICsgdHJhbnNdO1xuICAgICAgICBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsdC5zdHlsZVtwcm9wXSA9IHZhbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3AgPT09ICd3aWR0aCcgfHxcbiAgICAgICAgICBwcm9wID09PSAnaGVpZ2h0JyB8fFxuICAgICAgICAgIHByb3AgPT09ICdsZWZ0JyB8fFxuICAgICAgICAgIHByb3AgPT09ICd0b3AnXG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBudW1WYWwgPSB2YWwucmVwbGFjZSgvXFxEKy9nLCAnJyk7XG4gICAgICAgICAgdGhpc1twcm9wXSA9IHBhcnNlSW50KG51bVZhbCwgMTApOyAvLyBwZW5kOiBpcyB0aGlzIG5lY2Vzc2FyeT9cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICpcbiAgICogQWRkcyBhIG5ldyBhdHRyaWJ1dGUgb3IgY2hhbmdlcyB0aGUgdmFsdWUgb2YgYW4gZXhpc3RpbmcgYXR0cmlidXRlXG4gICAqIG9uIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCByZXR1cm5zIHRoZVxuICAgKiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlLCBvciBudWxsIGlmIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LlxuICAgKlxuICAgKiBAbWV0aG9kIGF0dHJpYnV0ZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGF0dHIgICAgICAgYXR0cmlidXRlIHRvIHNldFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IFt2YWx1ZV0gICAgdmFsdWUgdG8gYXNzaWduIHRvIGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJuIHtTdHJpbmd8T2JqZWN0fHA1LkVsZW1lbnR9IHZhbHVlIG9mIGF0dHJpYnV0ZSwgaWYgbm8gdmFsdWUgaXNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBvciBwNS5FbGVtZW50XG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAgICogdmFyIG15RGl2ID0gY3JlYXRlRGl2KCdJIGxpa2UgcGFuZGFzLicpO1xuICAgKiBteURpdi5hdHRyaWJ1dGUoJ2FsaWduJywgJ2NlbnRlcicpO1xuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5FbGVtZW50LnByb3RvdHlwZS5hdHRyaWJ1dGUgPSBmdW5jdGlvbihhdHRyLCB2YWx1ZSkge1xuICAgIC8vaGFuZGxpbmcgZm9yIGNoZWNrYm94ZXMgYW5kIHJhZGlvcyB0byBlbnN1cmUgb3B0aW9ucyBnZXRcbiAgICAvL2F0dHJpYnV0ZXMgbm90IGRpdnNcbiAgICBpZiAoXG4gICAgICB0aGlzLmVsdC5maXJzdENoaWxkICE9IG51bGwgJiZcbiAgICAgICh0aGlzLmVsdC5maXJzdENoaWxkLnR5cGUgPT09ICdjaGVja2JveCcgfHxcbiAgICAgICAgdGhpcy5lbHQuZmlyc3RDaGlsZC50eXBlID09PSAncmFkaW8nKVxuICAgICkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWx0LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsdC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5lbHQuY2hpbGROb2Rlc1tpXS5zZXRBdHRyaWJ1dGUoYXR0ciwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbHQuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVsdC5zZXRBdHRyaWJ1dGUoYXR0ciwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBSZW1vdmVzIGFuIGF0dHJpYnV0ZSBvbiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAqXG4gICAqIEBtZXRob2QgcmVtb3ZlQXR0cmlidXRlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gYXR0ciAgICAgICBhdHRyaWJ1dGUgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiB2YXIgYnV0dG9uO1xuICAgKiB2YXIgY2hlY2tib3g7XG4gICAqXG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIGNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goJ2VuYWJsZScsIHRydWUpO1xuICAgKiAgIGNoZWNrYm94LmNoYW5nZWQoZW5hYmxlQnV0dG9uKTtcbiAgICogICBidXR0b24gPSBjcmVhdGVCdXR0b24oJ2J1dHRvbicpO1xuICAgKiAgIGJ1dHRvbi5wb3NpdGlvbigxMCwgMTApO1xuICAgKiB9XG4gICAqXG4gICAqIGZ1bmN0aW9uIGVuYWJsZUJ1dHRvbigpIHtcbiAgICogICBpZiAodGhpcy5jaGVja2VkKCkpIHtcbiAgICogICAgIC8vIFJlLWVuYWJsZSB0aGUgYnV0dG9uXG4gICAqICAgICBidXR0b24ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgKiAgIH0gZWxzZSB7XG4gICAqICAgICAvLyBEaXNhYmxlIHRoZSBidXR0b25cbiAgICogICAgIGJ1dHRvbi5hdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5FbGVtZW50LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbihhdHRyKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5lbHQuZmlyc3RDaGlsZCAhPSBudWxsICYmXG4gICAgICAodGhpcy5lbHQuZmlyc3RDaGlsZC50eXBlID09PSAnY2hlY2tib3gnIHx8XG4gICAgICAgIHRoaXMuZWx0LmZpcnN0Q2hpbGQudHlwZSA9PT0gJ3JhZGlvJylcbiAgICApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbHQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmVsdC5jaGlsZE5vZGVzW2ldLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lbHQucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFaXRoZXIgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgaWYgbm8gYXJndW1lbnRzXG4gICAqIGdpdmVuLCBvciBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQG1ldGhvZCB2YWx1ZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd8TnVtYmVyfSAgICAgW3ZhbHVlXVxuICAgKiBAcmV0dXJuIHtTdHJpbmd8T2JqZWN0fHA1LkVsZW1lbnR9IHZhbHVlIG9mIGVsZW1lbnQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkIG9yIHA1LkVsZW1lbnRcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiAvLyBnZXRzIHRoZSB2YWx1ZVxuICAgKiB2YXIgaW5wO1xuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICBpbnAgPSBjcmVhdGVJbnB1dCgnJyk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xuICAgKiAgIHByaW50KGlucC52YWx1ZSgpKTtcbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAgICogLy8gc2V0cyB0aGUgdmFsdWVcbiAgICogdmFyIGlucDtcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgaW5wID0gY3JlYXRlSW5wdXQoJ215VmFsdWUnKTtcbiAgICogfVxuICAgKlxuICAgKiBmdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XG4gICAqICAgaW5wLnZhbHVlKCdteVZhbHVlJyk7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUuRWxlbWVudC5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZWx0LnZhbHVlID0gYXJndW1lbnRzWzBdO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmVsdC50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRoaXMuZWx0LnZhbHVlKTtcbiAgICAgIH0gZWxzZSByZXR1cm4gdGhpcy5lbHQudmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBTaG93cyB0aGUgY3VycmVudCBlbGVtZW50LiBFc3NlbnRpYWxseSwgc2V0dGluZyBkaXNwbGF5OmJsb2NrIGZvciB0aGUgc3R5bGUuXG4gICAqXG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKiBAcmV0dXJuIHtPYmplY3R8cDUuRWxlbWVudH1cbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiB2YXIgZGl2ID0gY3JlYXRlRGl2KCdkaXYnKTtcbiAgICogZGl2LnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICogZGl2LnNob3coKTsgLy8gdHVybnMgZGlzcGxheSB0byBibG9ja1xuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5FbGVtZW50LnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5lbHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBjdXJyZW50IGVsZW1lbnQuIEVzc2VudGlhbGx5LCBzZXR0aW5nIGRpc3BsYXk6bm9uZSBmb3IgdGhlIHN0eWxlLlxuICAgKlxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICogQHJldHVybiB7T2JqZWN0fHA1LkVsZW1lbnR9XG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAgICogdmFyIGRpdiA9IGNyZWF0ZURpdigndGhpcyBpcyBhIGRpdicpO1xuICAgKiBkaXYuaGlkZSgpO1xuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5FbGVtZW50LnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5lbHQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICpcbiAgICogU2V0cyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZWxlbWVudC4gQVVUTyBjYW4gYmUgdXNlZCB0b1xuICAgKiBvbmx5IGFkanVzdCBvbmUgZGltZW5zaW9uLiBJZiBubyBhcmd1bWVudHMgZ2l2ZW4gcmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodFxuICAgKiBvZiB0aGUgZWxlbWVudCBpbiBhbiBvYmplY3QuXG4gICAqXG4gICAqIEBtZXRob2Qgc2l6ZVxuICAgKiBAcGFyYW0gIHtOdW1iZXJ8Q29uc3RhbnR9IFt3XSB3aWR0aCBvZiB0aGUgZWxlbWVudCwgZWl0aGVyIEFVVE8sIG9yIGEgbnVtYmVyXG4gICAqIEBwYXJhbSAge051bWJlcnxDb25zdGFudH0gW2hdIGhlaWdodCBvZiB0aGUgZWxlbWVudCwgZWl0aGVyIEFVVE8sIG9yIGEgbnVtYmVyXG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fVxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gICAqIHZhciBkaXYgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgYSBkaXYnKTtcbiAgICogZGl2LnNpemUoMTAwLCAxMDApO1xuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5FbGVtZW50LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24odywgaCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogdGhpcy5lbHQub2Zmc2V0V2lkdGgsIGhlaWdodDogdGhpcy5lbHQub2Zmc2V0SGVpZ2h0IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhVyA9IHc7XG4gICAgICB2YXIgYUggPSBoO1xuICAgICAgdmFyIEFVVE8gPSBwNS5wcm90b3R5cGUuQVVUTztcbiAgICAgIGlmIChhVyAhPT0gQVVUTyB8fCBhSCAhPT0gQVVUTykge1xuICAgICAgICBpZiAoYVcgPT09IEFVVE8pIHtcbiAgICAgICAgICBhVyA9IGggKiB0aGlzLndpZHRoIC8gdGhpcy5oZWlnaHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoYUggPT09IEFVVE8pIHtcbiAgICAgICAgICBhSCA9IHcgKiB0aGlzLmhlaWdodCAvIHRoaXMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IGRpZmYgZm9yIGNudiB2cyBub3JtYWwgZGl2XG4gICAgICAgIGlmICh0aGlzLmVsdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGogPSB7fTtcbiAgICAgICAgICB2YXIgayA9IHRoaXMuZWx0LmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgdmFyIHByb3A7XG4gICAgICAgICAgZm9yIChwcm9wIGluIGspIHtcbiAgICAgICAgICAgIGpbcHJvcF0gPSBrW3Byb3BdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmVsdC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgYVcgKiB0aGlzLl9wSW5zdC5fcGl4ZWxEZW5zaXR5KTtcbiAgICAgICAgICB0aGlzLmVsdC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGFIICogdGhpcy5fcEluc3QuX3BpeGVsRGVuc2l0eSk7XG4gICAgICAgICAgdGhpcy5lbHQuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICd3aWR0aDonICsgYVcgKyAncHg7IGhlaWdodDonICsgYUggKyAncHgnXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9wSW5zdC5zY2FsZShcbiAgICAgICAgICAgIHRoaXMuX3BJbnN0Ll9waXhlbERlbnNpdHksXG4gICAgICAgICAgICB0aGlzLl9wSW5zdC5fcGl4ZWxEZW5zaXR5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBmb3IgKHByb3AgaW4gaikge1xuICAgICAgICAgICAgdGhpcy5lbHQuZ2V0Q29udGV4dCgnMmQnKVtwcm9wXSA9IGpbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWx0LnN0eWxlLndpZHRoID0gYVcgKyAncHgnO1xuICAgICAgICAgIHRoaXMuZWx0LnN0eWxlLmhlaWdodCA9IGFIICsgJ3B4JztcbiAgICAgICAgICB0aGlzLmVsdC53aWR0aCA9IGFXO1xuICAgICAgICAgIHRoaXMuZWx0LmhlaWdodCA9IGFIO1xuICAgICAgICAgIHRoaXMud2lkdGggPSBhVztcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IGFIO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuZWx0Lm9mZnNldFdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuZWx0Lm9mZnNldEhlaWdodDtcblxuICAgICAgICBpZiAodGhpcy5fcEluc3QpIHtcbiAgICAgICAgICAvLyBtYWluIGNhbnZhcyBhc3NvY2lhdGVkIHdpdGggcDUgaW5zdGFuY2VcbiAgICAgICAgICBpZiAodGhpcy5fcEluc3QuX2N1ckVsZW1lbnQuZWx0ID09PSB0aGlzLmVsdCkge1xuICAgICAgICAgICAgdGhpcy5fcEluc3QuX3NldFByb3BlcnR5KCd3aWR0aCcsIHRoaXMuZWx0Lm9mZnNldFdpZHRoKTtcbiAgICAgICAgICAgIHRoaXMuX3BJbnN0Ll9zZXRQcm9wZXJ0eSgnaGVpZ2h0JywgdGhpcy5lbHQub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgZWxlbWVudCBhbmQgZGVyZWdpc3RlcnMgYWxsIGxpc3RlbmVycy5cbiAgICogQG1ldGhvZCByZW1vdmVcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiB2YXIgbXlEaXYgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgc29tZSB0ZXh0Jyk7XG4gICAqIG15RGl2LnJlbW92ZSgpO1xuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5FbGVtZW50LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBkZXJlZ2lzdGVyIGV2ZW50c1xuICAgIGZvciAodmFyIGV2IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgdGhpcy5lbHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldiwgdGhpcy5fZXZlbnRzW2V2XSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmVsdC5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLmVsdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWx0KTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXM7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgcDUuTWVkaWFFbGVtZW50IGFkZGl0aW9uc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFeHRlbmRzIHA1LkVsZW1lbnQgdG8gaGFuZGxlIGF1ZGlvIGFuZCB2aWRlby4gSW4gYWRkaXRpb24gdG8gdGhlIG1ldGhvZHNcbiAgICogb2YgcDUuRWxlbWVudCwgaXQgYWxzbyBjb250YWlucyBtZXRob2RzIGZvciBjb250cm9sbGluZyBtZWRpYS4gSXQgaXMgbm90XG4gICAqIGNhbGxlZCBkaXJlY3RseSwgYnV0IHA1Lk1lZGlhRWxlbWVudHMgYXJlIGNyZWF0ZWQgYnkgY2FsbGluZyBjcmVhdGVWaWRlbyxcbiAgICogY3JlYXRlQXVkaW8sIGFuZCBjcmVhdGVDYXB0dXJlLlxuICAgKlxuICAgKiBAY2xhc3MgcDUuTWVkaWFFbGVtZW50XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gZWx0IERPTSBub2RlIHRoYXQgaXMgd3JhcHBlZFxuICAgKi9cbiAgcDUuTWVkaWFFbGVtZW50ID0gZnVuY3Rpb24oZWx0LCBwSW5zdCkge1xuICAgIHA1LkVsZW1lbnQuY2FsbCh0aGlzLCBlbHQsIHBJbnN0KTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmVsdC5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuXG4gICAgdGhpcy5fcHJldlRpbWUgPSAwO1xuICAgIHRoaXMuX2N1ZUlEQ291bnRlciA9IDA7XG4gICAgdGhpcy5fY3VlcyA9IFtdO1xuICAgIHRoaXMuX3BpeGVsRGVuc2l0eSA9IDE7XG4gICAgdGhpcy5fbW9kaWZpZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFBhdGggdG8gdGhlIG1lZGlhIGVsZW1lbnQgc291cmNlLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHNyY1xuICAgICAqIEByZXR1cm4ge1N0cmluZ30gc3JjXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiA8ZGl2Pjxjb2RlPlxuICAgICAqIHZhciBlbGU7XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICAgKiAgIGJhY2tncm91bmQoMjUwKTtcbiAgICAgKlxuICAgICAqICAgLy9wNS5NZWRpYUVsZW1lbnQgb2JqZWN0cyBhcmUgdXN1YWxseSBjcmVhdGVkXG4gICAgICogICAvL2J5IGNhbGxpbmcgdGhlIGNyZWF0ZUF1ZGlvKCksIGNyZWF0ZVZpZGVvKCksXG4gICAgICogICAvL2FuZCBjcmVhdGVDYXB0dXJlKCkgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogICAvL0luIHRoaXMgZXhhbXBsZSB3ZSBjcmVhdGVcbiAgICAgKiAgIC8vYSBuZXcgcDUuTWVkaWFFbGVtZW50IHZpYSBjcmVhdGVBdWRpbygpLlxuICAgICAqICAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9iZWF0Lm1wMycpO1xuICAgICAqXG4gICAgICogICAvL1dlJ2xsIHNldCB1cCBvdXIgZXhhbXBsZSBzbyB0aGF0XG4gICAgICogICAvL3doZW4geW91IGNsaWNrIG9uIHRoZSB0ZXh0LFxuICAgICAqICAgLy9hbiBhbGVydCBib3ggZGlzcGxheXMgdGhlIE1lZGlhRWxlbWVudCdzXG4gICAgICogICAvL3NyYyBmaWVsZC5cbiAgICAgKiAgIHRleHRBbGlnbihDRU5URVIpO1xuICAgICAqICAgdGV4dCgnQ2xpY2sgTWUhJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XG4gICAgICogICAvL2hlcmUgd2UgdGVzdCBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGVcbiAgICAgKiAgIC8vY2FudmFzIGVsZW1lbnQgd2hlbiBpdCdzIGNsaWNrZWRcbiAgICAgKiAgIGlmIChtb3VzZVggPj0gMCAmJiBtb3VzZVggPD0gd2lkdGggJiYgbW91c2VZID49IDAgJiYgbW91c2VZIDw9IGhlaWdodCkge1xuICAgICAqICAgICAvL1Nob3cgb3VyIHA1Lk1lZGlhRWxlbWVudCdzIHNyYyBmaWVsZFxuICAgICAqICAgICBhbGVydChlbGUuc3JjKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogPC9jb2RlPjwvZGl2PlxuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCAnc3JjJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGZpcnN0Q2hpbGRTcmMgPSBzZWxmLmVsdC5jaGlsZHJlblswXS5zcmM7XG4gICAgICAgIHZhciBzcmNWYWwgPSBzZWxmLmVsdC5zcmMgPT09IHdpbmRvdy5sb2NhdGlvbi5ocmVmID8gJycgOiBzZWxmLmVsdC5zcmM7XG4gICAgICAgIHZhciByZXQgPVxuICAgICAgICAgIGZpcnN0Q2hpbGRTcmMgPT09IHdpbmRvdy5sb2NhdGlvbi5ocmVmID8gc3JjVmFsIDogZmlyc3RDaGlsZFNyYztcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKG5ld1ZhbHVlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5lbHQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBzZWxmLmVsdC5yZW1vdmVDaGlsZChzZWxmLmVsdC5jaGlsZHJlbltpXSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNvdXJjZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NvdXJjZScpO1xuICAgICAgICBzb3VyY2Uuc3JjID0gbmV3VmFsdWU7XG4gICAgICAgIGVsdC5hcHBlbmRDaGlsZChzb3VyY2UpO1xuICAgICAgICBzZWxmLmVsdC5zcmMgPSBuZXdWYWx1ZTtcbiAgICAgICAgc2VsZi5tb2RpZmllZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBwcml2YXRlIF9vbmVuZGVkIGNhbGxiYWNrLCBzZXQgYnkgdGhlIG1ldGhvZDogb25lbmRlZChjYWxsYmFjaylcbiAgICBzZWxmLl9vbmVuZGVkID0gZnVuY3Rpb24oKSB7fTtcbiAgICBzZWxmLmVsdC5vbmVuZGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLl9vbmVuZGVkKHNlbGYpO1xuICAgIH07XG4gIH07XG4gIHA1Lk1lZGlhRWxlbWVudC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHA1LkVsZW1lbnQucHJvdG90eXBlKTtcblxuICAvKipcbiAgICogUGxheSBhbiBIVE1MNSBtZWRpYSBlbGVtZW50LlxuICAgKlxuICAgKiBAbWV0aG9kIHBsYXlcbiAgICogQHJldHVybiB7T2JqZWN0fHA1LkVsZW1lbnR9XG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIHZhciBlbGU7XG4gICAqXG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIC8vcDUuTWVkaWFFbGVtZW50IG9iamVjdHMgYXJlIHVzdWFsbHkgY3JlYXRlZFxuICAgKiAgIC8vYnkgY2FsbGluZyB0aGUgY3JlYXRlQXVkaW8oKSwgY3JlYXRlVmlkZW8oKSxcbiAgICogICAvL2FuZCBjcmVhdGVDYXB0dXJlKCkgZnVuY3Rpb25zLlxuICAgKlxuICAgKiAgIC8vSW4gdGhpcyBleGFtcGxlIHdlIGNyZWF0ZVxuICAgKiAgIC8vYSBuZXcgcDUuTWVkaWFFbGVtZW50IHZpYSBjcmVhdGVBdWRpbygpLlxuICAgKiAgIGVsZSA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvYmVhdC5tcDMnKTtcbiAgICpcbiAgICogICBiYWNrZ3JvdW5kKDI1MCk7XG4gICAqICAgdGV4dEFsaWduKENFTlRFUik7XG4gICAqICAgdGV4dCgnQ2xpY2sgdG8gUGxheSEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgKiB9XG4gICAqXG4gICAqIGZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcbiAgICogICAvL2hlcmUgd2UgdGVzdCBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGVcbiAgICogICAvL2NhbnZhcyBlbGVtZW50IHdoZW4gaXQncyBjbGlja2VkXG4gICAqICAgaWYgKG1vdXNlWCA+PSAwICYmIG1vdXNlWCA8PSB3aWR0aCAmJiBtb3VzZVkgPj0gMCAmJiBtb3VzZVkgPD0gaGVpZ2h0KSB7XG4gICAqICAgICAvL0hlcmUgd2UgY2FsbCB0aGUgcGxheSgpIGZ1bmN0aW9uIG9uXG4gICAqICAgICAvL3RoZSBwNS5NZWRpYUVsZW1lbnQgd2UgY3JlYXRlZCBhYm92ZS5cbiAgICogICAgIC8vVGhpcyB3aWxsIHN0YXJ0IHRoZSBhdWRpbyBzYW1wbGUuXG4gICAqICAgICBlbGUucGxheSgpO1xuICAgKlxuICAgKiAgICAgYmFja2dyb3VuZCgyMDApO1xuICAgKiAgICAgdGV4dCgnWW91IGNsaWNrZWQgUGxheSEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5NZWRpYUVsZW1lbnQucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5lbHQuY3VycmVudFRpbWUgPT09IHRoaXMuZWx0LmR1cmF0aW9uKSB7XG4gICAgICB0aGlzLmVsdC5jdXJyZW50VGltZSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWx0LnJlYWR5U3RhdGUgPiAxKSB7XG4gICAgICB0aGlzLmVsdC5wbGF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluIENocm9tZSwgcGxheWJhY2sgY2Fubm90IHJlc3VtZSBhZnRlciBiZWluZyBzdG9wcGVkIGFuZCBtdXN0IHJlbG9hZFxuICAgICAgdGhpcy5lbHQubG9hZCgpO1xuICAgICAgdGhpcy5lbHQucGxheSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU3RvcHMgYW4gSFRNTDUgbWVkaWEgZWxlbWVudCAoc2V0cyBjdXJyZW50IHRpbWUgdG8gemVybykuXG4gICAqXG4gICAqIEBtZXRob2Qgc3RvcFxuICAgKiBAcmV0dXJuIHtPYmplY3R8cDUuRWxlbWVudH1cbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogLy9UaGlzIGV4YW1wbGUgYm90aCBzdGFydHNcbiAgICogLy9hbmQgc3RvcHMgYSBzb3VuZCBzYW1wbGVcbiAgICogLy93aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgY2FudmFzXG4gICAqXG4gICAqIC8vV2Ugd2lsbCBzdG9yZSB0aGUgcDUuTWVkaWFFbGVtZW50XG4gICAqIC8vb2JqZWN0IGluIGhlcmVcbiAgICogdmFyIGVsZTtcbiAgICpcbiAgICogLy93aGlsZSBvdXIgYXVkaW8gaXMgcGxheWluZyxcbiAgICogLy90aGlzIHdpbGwgYmUgc2V0IHRvIHRydWVcbiAgICogdmFyIHNhbXBsZUlzUGxheWluZyA9IGZhbHNlO1xuICAgKlxuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICAvL0hlcmUgd2UgY3JlYXRlIGEgcDUuTWVkaWFFbGVtZW50IG9iamVjdFxuICAgKiAgIC8vdXNpbmcgdGhlIGNyZWF0ZUF1ZGlvKCkgZnVuY3Rpb24uXG4gICAqICAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9iZWF0Lm1wMycpO1xuICAgKiAgIGJhY2tncm91bmQoMjAwKTtcbiAgICogICB0ZXh0QWxpZ24oQ0VOVEVSKTtcbiAgICogICB0ZXh0KCdDbGljayB0byBwbGF5IScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gbW91c2VDbGlja2VkKCkge1xuICAgKiAgIC8vaGVyZSB3ZSB0ZXN0IGlmIHRoZSBtb3VzZSBpcyBvdmVyIHRoZVxuICAgKiAgIC8vY2FudmFzIGVsZW1lbnQgd2hlbiBpdCdzIGNsaWNrZWRcbiAgICogICBpZiAobW91c2VYID49IDAgJiYgbW91c2VYIDw9IHdpZHRoICYmIG1vdXNlWSA+PSAwICYmIG1vdXNlWSA8PSBoZWlnaHQpIHtcbiAgICogICAgIGJhY2tncm91bmQoMjAwKTtcbiAgICpcbiAgICogICAgIGlmIChzYW1wbGVJc1BsYXlpbmcpIHtcbiAgICogICAgICAgLy9pZiB0aGUgc2FtcGxlIGlzIGN1cnJlbnRseSBwbGF5aW5nXG4gICAqICAgICAgIC8vY2FsbGluZyB0aGUgc3RvcCgpIGZ1bmN0aW9uIG9uXG4gICAqICAgICAgIC8vb3VyIHA1Lk1lZGlhRWxlbWVudCB3aWxsIHN0b3BcbiAgICogICAgICAgLy9pdCBhbmQgcmVzZXQgaXRzIGN1cnJlbnRcbiAgICogICAgICAgLy90aW1lIHRvIDAgKGkuZS4gaXQgd2lsbCBzdGFydFxuICAgKiAgICAgICAvL2F0IHRoZSBiZWdpbm5pbmcgdGhlIG5leHQgdGltZVxuICAgKiAgICAgICAvL3lvdSBwbGF5IGl0KVxuICAgKiAgICAgICBlbGUuc3RvcCgpO1xuICAgKlxuICAgKiAgICAgICBzYW1wbGVJc1BsYXlpbmcgPSBmYWxzZTtcbiAgICogICAgICAgdGV4dCgnQ2xpY2sgdG8gcGxheSEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgKiAgICAgfSBlbHNlIHtcbiAgICogICAgICAgLy9sb29wIG91ciBzb3VuZCBlbGVtZW50IHVudGlsIHdlXG4gICAqICAgICAgIC8vY2FsbCBlbGUuc3RvcCgpIG9uIGl0LlxuICAgKiAgICAgICBlbGUubG9vcCgpO1xuICAgKlxuICAgKiAgICAgICBzYW1wbGVJc1BsYXlpbmcgPSB0cnVlO1xuICAgKiAgICAgICB0ZXh0KCdDbGljayB0byBzdG9wIScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1Lk1lZGlhRWxlbWVudC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZWx0LnBhdXNlKCk7XG4gICAgdGhpcy5lbHQuY3VycmVudFRpbWUgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQYXVzZXMgYW4gSFRNTDUgbWVkaWEgZWxlbWVudC5cbiAgICpcbiAgICogQG1ldGhvZCBwYXVzZVxuICAgKiBAcmV0dXJuIHtPYmplY3R8cDUuRWxlbWVudH1cbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogLy9UaGlzIGV4YW1wbGUgYm90aCBzdGFydHNcbiAgICogLy9hbmQgcGF1c2VzIGEgc291bmQgc2FtcGxlXG4gICAqIC8vd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNhbnZhc1xuICAgKlxuICAgKiAvL1dlIHdpbGwgc3RvcmUgdGhlIHA1Lk1lZGlhRWxlbWVudFxuICAgKiAvL29iamVjdCBpbiBoZXJlXG4gICAqIHZhciBlbGU7XG4gICAqXG4gICAqIC8vd2hpbGUgb3VyIGF1ZGlvIGlzIHBsYXlpbmcsXG4gICAqIC8vdGhpcyB3aWxsIGJlIHNldCB0byB0cnVlXG4gICAqIHZhciBzYW1wbGVJc1BsYXlpbmcgPSBmYWxzZTtcbiAgICpcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgLy9IZXJlIHdlIGNyZWF0ZSBhIHA1Lk1lZGlhRWxlbWVudCBvYmplY3RcbiAgICogICAvL3VzaW5nIHRoZSBjcmVhdGVBdWRpbygpIGZ1bmN0aW9uLlxuICAgKiAgIGVsZSA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvbHVja3lfZHJhZ29ucy5tcDMnKTtcbiAgICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gICAqICAgdGV4dEFsaWduKENFTlRFUik7XG4gICAqICAgdGV4dCgnQ2xpY2sgdG8gcGxheSEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgKiB9XG4gICAqXG4gICAqIGZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcbiAgICogICAvL2hlcmUgd2UgdGVzdCBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGVcbiAgICogICAvL2NhbnZhcyBlbGVtZW50IHdoZW4gaXQncyBjbGlja2VkXG4gICAqICAgaWYgKG1vdXNlWCA+PSAwICYmIG1vdXNlWCA8PSB3aWR0aCAmJiBtb3VzZVkgPj0gMCAmJiBtb3VzZVkgPD0gaGVpZ2h0KSB7XG4gICAqICAgICBiYWNrZ3JvdW5kKDIwMCk7XG4gICAqXG4gICAqICAgICBpZiAoc2FtcGxlSXNQbGF5aW5nKSB7XG4gICAqICAgICAgIC8vQ2FsbGluZyBwYXVzZSgpIG9uIG91clxuICAgKiAgICAgICAvL3A1Lk1lZGlhRWxlbWVudCB3aWxsIHN0b3AgaXRcbiAgICogICAgICAgLy9wbGF5aW5nLCBidXQgd2hlbiB3ZSBjYWxsIHRoZVxuICAgKiAgICAgICAvL2xvb3AoKSBvciBwbGF5KCkgZnVuY3Rpb25zXG4gICAqICAgICAgIC8vdGhlIHNhbXBsZSB3aWxsIHN0YXJ0IGZyb21cbiAgICogICAgICAgLy93aGVyZSB3ZSBwYXVzZWQgaXQuXG4gICAqICAgICAgIGVsZS5wYXVzZSgpO1xuICAgKlxuICAgKiAgICAgICBzYW1wbGVJc1BsYXlpbmcgPSBmYWxzZTtcbiAgICogICAgICAgdGV4dCgnQ2xpY2sgdG8gcmVzdW1lIScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAqICAgICB9IGVsc2Uge1xuICAgKiAgICAgICAvL2xvb3Agb3VyIHNvdW5kIGVsZW1lbnQgdW50aWwgd2VcbiAgICogICAgICAgLy9jYWxsIGVsZS5wYXVzZSgpIG9uIGl0LlxuICAgKiAgICAgICBlbGUubG9vcCgpO1xuICAgKlxuICAgKiAgICAgICBzYW1wbGVJc1BsYXlpbmcgPSB0cnVlO1xuICAgKiAgICAgICB0ZXh0KCdDbGljayB0byBwYXVzZSEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5NZWRpYUVsZW1lbnQucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5lbHQucGF1c2UoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU2V0ICdsb29wJyB0byB0cnVlIGZvciBhbiBIVE1MNSBtZWRpYSBlbGVtZW50LCBhbmQgc3RhcnRzIHBsYXlpbmcuXG4gICAqXG4gICAqIEBtZXRob2QgbG9vcFxuICAgKiBAcmV0dXJuIHtPYmplY3R8cDUuRWxlbWVudH1cbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogLy9DbGlja2luZyB0aGUgY2FudmFzIHdpbGwgbG9vcFxuICAgKiAvL3RoZSBhdWRpbyBzYW1wbGUgdW50aWwgdGhlIHVzZXJcbiAgICogLy9jbGlja3MgYWdhaW4gdG8gc3RvcCBpdFxuICAgKlxuICAgKiAvL1dlIHdpbGwgc3RvcmUgdGhlIHA1Lk1lZGlhRWxlbWVudFxuICAgKiAvL29iamVjdCBpbiBoZXJlXG4gICAqIHZhciBlbGU7XG4gICAqXG4gICAqIC8vd2hpbGUgb3VyIGF1ZGlvIGlzIHBsYXlpbmcsXG4gICAqIC8vdGhpcyB3aWxsIGJlIHNldCB0byB0cnVlXG4gICAqIHZhciBzYW1wbGVJc0xvb3BpbmcgPSBmYWxzZTtcbiAgICpcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgLy9IZXJlIHdlIGNyZWF0ZSBhIHA1Lk1lZGlhRWxlbWVudCBvYmplY3RcbiAgICogICAvL3VzaW5nIHRoZSBjcmVhdGVBdWRpbygpIGZ1bmN0aW9uLlxuICAgKiAgIGVsZSA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvbHVja3lfZHJhZ29ucy5tcDMnKTtcbiAgICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gICAqICAgdGV4dEFsaWduKENFTlRFUik7XG4gICAqICAgdGV4dCgnQ2xpY2sgdG8gbG9vcCEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgKiB9XG4gICAqXG4gICAqIGZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcbiAgICogICAvL2hlcmUgd2UgdGVzdCBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGVcbiAgICogICAvL2NhbnZhcyBlbGVtZW50IHdoZW4gaXQncyBjbGlja2VkXG4gICAqICAgaWYgKG1vdXNlWCA+PSAwICYmIG1vdXNlWCA8PSB3aWR0aCAmJiBtb3VzZVkgPj0gMCAmJiBtb3VzZVkgPD0gaGVpZ2h0KSB7XG4gICAqICAgICBiYWNrZ3JvdW5kKDIwMCk7XG4gICAqXG4gICAqICAgICBpZiAoIXNhbXBsZUlzTG9vcGluZykge1xuICAgKiAgICAgICAvL2xvb3Agb3VyIHNvdW5kIGVsZW1lbnQgdW50aWwgd2VcbiAgICogICAgICAgLy9jYWxsIGVsZS5zdG9wKCkgb24gaXQuXG4gICAqICAgICAgIGVsZS5sb29wKCk7XG4gICAqXG4gICAqICAgICAgIHNhbXBsZUlzTG9vcGluZyA9IHRydWU7XG4gICAqICAgICAgIHRleHQoJ0NsaWNrIHRvIHN0b3AhJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICogICAgIH0gZWxzZSB7XG4gICAqICAgICAgIGVsZS5zdG9wKCk7XG4gICAqXG4gICAqICAgICAgIHNhbXBsZUlzTG9vcGluZyA9IGZhbHNlO1xuICAgKiAgICAgICB0ZXh0KCdDbGljayB0byBsb29wIScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1Lk1lZGlhRWxlbWVudC5wcm90b3R5cGUubG9vcCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZWx0LnNldEF0dHJpYnV0ZSgnbG9vcCcsIHRydWUpO1xuICAgIHRoaXMucGxheSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogU2V0ICdsb29wJyB0byBmYWxzZSBmb3IgYW4gSFRNTDUgbWVkaWEgZWxlbWVudC4gRWxlbWVudCB3aWxsIHN0b3BcbiAgICogd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQuXG4gICAqXG4gICAqIEBtZXRob2Qgbm9Mb29wXG4gICAqIEByZXR1cm4ge09iamVjdHxwNS5FbGVtZW50fVxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiAvL1RoaXMgZXhhbXBsZSBib3RoIHN0YXJ0c1xuICAgKiAvL2FuZCBzdG9wcyBsb29wIG9mIHNvdW5kIHNhbXBsZVxuICAgKiAvL3doZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBjYW52YXNcbiAgICpcbiAgICogLy9XZSB3aWxsIHN0b3JlIHRoZSBwNS5NZWRpYUVsZW1lbnRcbiAgICogLy9vYmplY3QgaW4gaGVyZVxuICAgKiB2YXIgZWxlO1xuICAgKiAvL3doaWxlIG91ciBhdWRpbyBpcyBwbGF5aW5nLFxuICAgKiAvL3RoaXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZVxuICAgKiB2YXIgc2FtcGxlSXNQbGF5aW5nID0gZmFsc2U7XG4gICAqXG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIC8vSGVyZSB3ZSBjcmVhdGUgYSBwNS5NZWRpYUVsZW1lbnQgb2JqZWN0XG4gICAqICAgLy91c2luZyB0aGUgY3JlYXRlQXVkaW8oKSBmdW5jdGlvbi5cbiAgICogICBlbGUgPSBjcmVhdGVBdWRpbygnYXNzZXRzL2JlYXQubXAzJyk7XG4gICAqICAgYmFja2dyb3VuZCgyMDApO1xuICAgKiAgIHRleHRBbGlnbihDRU5URVIpO1xuICAgKiAgIHRleHQoJ0NsaWNrIHRvIHBsYXkhJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICogfVxuICAgKlxuICAgKiBmdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XG4gICAqICAgLy9oZXJlIHdlIHRlc3QgaWYgdGhlIG1vdXNlIGlzIG92ZXIgdGhlXG4gICAqICAgLy9jYW52YXMgZWxlbWVudCB3aGVuIGl0J3MgY2xpY2tlZFxuICAgKiAgIGlmIChtb3VzZVggPj0gMCAmJiBtb3VzZVggPD0gd2lkdGggJiYgbW91c2VZID49IDAgJiYgbW91c2VZIDw9IGhlaWdodCkge1xuICAgKiAgICAgYmFja2dyb3VuZCgyMDApO1xuICAgKlxuICAgKiAgICAgaWYgKHNhbXBsZUlzUGxheWluZykge1xuICAgKiAgICAgICBlbGUubm9Mb29wKCk7XG4gICAqICAgICAgIHRleHQoJ05vIG1vcmUgTG9vcHMhJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICogICAgIH0gZWxzZSB7XG4gICAqICAgICAgIGVsZS5sb29wKCk7XG4gICAqICAgICAgIHNhbXBsZUlzUGxheWluZyA9IHRydWU7XG4gICAqICAgICAgIHRleHQoJ0NsaWNrIHRvIHN0b3AgbG9vcGluZyEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqXG4gICAqL1xuICBwNS5NZWRpYUVsZW1lbnQucHJvdG90eXBlLm5vTG9vcCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZWx0LnNldEF0dHJpYnV0ZSgnbG9vcCcsIGZhbHNlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU2V0IEhUTUw1IG1lZGlhIGVsZW1lbnQgdG8gYXV0b3BsYXkgb3Igbm90LlxuICAgKlxuICAgKiBAbWV0aG9kIGF1dG9wbGF5XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXV0b3BsYXkgd2hldGhlciB0aGUgZWxlbWVudCBzaG91bGQgYXV0b3BsYXlcbiAgICogQHJldHVybiB7T2JqZWN0fHA1LkVsZW1lbnR9XG4gICAqL1xuICBwNS5NZWRpYUVsZW1lbnQucHJvdG90eXBlLmF1dG9wbGF5ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgdGhpcy5lbHQuc2V0QXR0cmlidXRlKCdhdXRvcGxheScsIHZhbCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgdm9sdW1lIGZvciB0aGlzIEhUTUw1IG1lZGlhIGVsZW1lbnQuIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLFxuICAgKiByZXR1cm5zIHRoZSBjdXJyZW50IHZvbHVtZS5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9ICAgICAgICAgICAgW3ZhbF0gdm9sdW1lIGJldHdlZW4gMC4wIGFuZCAxLjBcbiAgICogQHJldHVybiB7TnVtYmVyfHA1Lk1lZGlhRWxlbWVudH0gY3VycmVudCB2b2x1bWUgb3IgcDUuTWVkaWFFbGVtZW50XG4gICAqIEBtZXRob2Qgdm9sdW1lXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIHZhciBlbGU7XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIC8vIHA1Lk1lZGlhRWxlbWVudCBvYmplY3RzIGFyZSB1c3VhbGx5IGNyZWF0ZWRcbiAgICogICAvLyBieSBjYWxsaW5nIHRoZSBjcmVhdGVBdWRpbygpLCBjcmVhdGVWaWRlbygpLFxuICAgKiAgIC8vIGFuZCBjcmVhdGVDYXB0dXJlKCkgZnVuY3Rpb25zLlxuICAgKiAgIC8vIEluIHRoaXMgZXhhbXBsZSB3ZSBjcmVhdGVcbiAgICogICAvLyBhIG5ldyBwNS5NZWRpYUVsZW1lbnQgdmlhIGNyZWF0ZUF1ZGlvKCkuXG4gICAqICAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9sdWNreV9kcmFnb25zLm1wMycpO1xuICAgKiAgIGJhY2tncm91bmQoMjUwKTtcbiAgICogICB0ZXh0QWxpZ24oQ0VOVEVSKTtcbiAgICogICB0ZXh0KCdDbGljayB0byBQbGF5IScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAqIH1cbiAgICogZnVuY3Rpb24gbW91c2VDbGlja2VkKCkge1xuICAgKiAgIC8vIEhlcmUgd2UgY2FsbCB0aGUgdm9sdW1lKCkgZnVuY3Rpb25cbiAgICogICAvLyBvbiB0aGUgc291bmQgZWxlbWVudCB0byBzZXQgaXRzIHZvbHVtZVxuICAgKiAgIC8vIFZvbHVtZSBtdXN0IGJlIGJldHdlZW4gMC4wIGFuZCAxLjBcbiAgICogICBlbGUudm9sdW1lKDAuMik7XG4gICAqICAgZWxlLnBsYXkoKTtcbiAgICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gICAqICAgdGV4dCgnWW91IGNsaWNrZWQgUGxheSEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICogPGRpdj48Y29kZT5cbiAgICogdmFyIGF1ZGlvO1xuICAgKiB2YXIgY291bnRlciA9IDA7XG4gICAqXG4gICAqIGZ1bmN0aW9uIGxvYWRlZCgpIHtcbiAgICogICBhdWRpby5wbGF5KCk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgYXVkaW8gPSBjcmVhdGVBdWRpbygnYXNzZXRzL2x1Y2t5X2RyYWdvbnMubXAzJywgbG9hZGVkKTtcbiAgICogICB0ZXh0QWxpZ24oQ0VOVEVSKTtcbiAgICogfVxuICAgKlxuICAgKiBmdW5jdGlvbiBkcmF3KCkge1xuICAgKiAgIGlmIChjb3VudGVyID09PSAwKSB7XG4gICAqICAgICBiYWNrZ3JvdW5kKDAsIDI1NSwgMCk7XG4gICAqICAgICB0ZXh0KCd2b2x1bWUoMC45KScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAqICAgfSBlbHNlIGlmIChjb3VudGVyID09PSAxKSB7XG4gICAqICAgICBiYWNrZ3JvdW5kKDI1NSwgMjU1LCAwKTtcbiAgICogICAgIHRleHQoJ3ZvbHVtZSgwLjUpJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICogICB9IGVsc2UgaWYgKGNvdW50ZXIgPT09IDIpIHtcbiAgICogICAgIGJhY2tncm91bmQoMjU1LCAwLCAwKTtcbiAgICogICAgIHRleHQoJ3ZvbHVtZSgwLjEpJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xuICAgKiAgIGNvdW50ZXIrKztcbiAgICogICBpZiAoY291bnRlciA9PT0gMCkge1xuICAgKiAgICAgYXVkaW8udm9sdW1lKDAuOSk7XG4gICAqICAgfSBlbHNlIGlmIChjb3VudGVyID09PSAxKSB7XG4gICAqICAgICBhdWRpby52b2x1bWUoMC41KTtcbiAgICogICB9IGVsc2UgaWYgKGNvdW50ZXIgPT09IDIpIHtcbiAgICogICAgIGF1ZGlvLnZvbHVtZSgwLjEpO1xuICAgKiAgIH0gZWxzZSB7XG4gICAqICAgICBjb3VudGVyID0gMDtcbiAgICogICAgIGF1ZGlvLnZvbHVtZSgwLjkpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L2NvZGU+XG4gICAqIDwvZGl2PlxuICAgKi9cbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS52b2x1bWUgPSBmdW5jdGlvbih2YWwpIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsdC52b2x1bWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWx0LnZvbHVtZSA9IHZhbDtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHJldHVybnMgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgb2YgdGhlXG4gICAqIGVsZW1lbnQuIFRoZSBzcGVlZCBwYXJhbWV0ZXIgc2V0cyB0aGUgc3BlZWQgd2hlcmUgMi4wIHdpbGwgcGxheSB0aGVcbiAgICogZWxlbWVudCB0d2ljZSBhcyBmYXN0LCAwLjUgd2lsbCBwbGF5IGF0IGhhbGYgdGhlIHNwZWVkLCBhbmQgLTEgd2lsbCBwbGF5XG4gICAqIHRoZSBlbGVtZW50IGluIG5vcm1hbCBzcGVlZCBpbiByZXZlcnNlLihOb3RlIHRoYXQgbm90IGFsbCBicm93c2VycyBzdXBwb3J0XG4gICAqIGJhY2t3YXJkIHBsYXliYWNrIGFuZCBldmVuIGlmIHRoZXkgZG8sIHBsYXliYWNrIG1pZ2h0IG5vdCBiZSBzbW9vdGguKVxuICAgKlxuICAgKiBAbWV0aG9kIHNwZWVkXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbc3BlZWRdICBzcGVlZCBtdWx0aXBsaWVyIGZvciBlbGVtZW50IHBsYXliYWNrXG4gICAqIEByZXR1cm4ge051bWJlcnxPYmplY3R8cDUuTWVkaWFFbGVtZW50fSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIG9yIHA1Lk1lZGlhRWxlbWVudFxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlciBub3Rlc3QnPjxjb2RlPlxuICAgKiAvL0NsaWNraW5nIHRoZSBjYW52YXMgd2lsbCBsb29wXG4gICAqIC8vdGhlIGF1ZGlvIHNhbXBsZSB1bnRpbCB0aGUgdXNlclxuICAgKiAvL2NsaWNrcyBhZ2FpbiB0byBzdG9wIGl0XG4gICAqXG4gICAqIC8vV2Ugd2lsbCBzdG9yZSB0aGUgcDUuTWVkaWFFbGVtZW50XG4gICAqIC8vb2JqZWN0IGluIGhlcmVcbiAgICogdmFyIGVsZTtcbiAgICogdmFyIGJ1dHRvbjtcbiAgICpcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgY3JlYXRlQ2FudmFzKDcxMCwgNDAwKTtcbiAgICogICAvL0hlcmUgd2UgY3JlYXRlIGEgcDUuTWVkaWFFbGVtZW50IG9iamVjdFxuICAgKiAgIC8vdXNpbmcgdGhlIGNyZWF0ZUF1ZGlvKCkgZnVuY3Rpb24uXG4gICAqICAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9iZWF0Lm1wMycpO1xuICAgKiAgIGVsZS5sb29wKCk7XG4gICAqICAgYmFja2dyb3VuZCgyMDApO1xuICAgKlxuICAgKiAgIGJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbignMnggc3BlZWQnKTtcbiAgICogICBidXR0b24ucG9zaXRpb24oMTAwLCA2OCk7XG4gICAqICAgYnV0dG9uLm1vdXNlUHJlc3NlZCh0d2ljZV9zcGVlZCk7XG4gICAqXG4gICAqICAgYnV0dG9uID0gY3JlYXRlQnV0dG9uKCdoYWxmIHNwZWVkJyk7XG4gICAqICAgYnV0dG9uLnBvc2l0aW9uKDIwMCwgNjgpO1xuICAgKiAgIGJ1dHRvbi5tb3VzZVByZXNzZWQoaGFsZl9zcGVlZCk7XG4gICAqXG4gICAqICAgYnV0dG9uID0gY3JlYXRlQnV0dG9uKCdyZXZlcnNlIHBsYXknKTtcbiAgICogICBidXR0b24ucG9zaXRpb24oMzAwLCA2OCk7XG4gICAqICAgYnV0dG9uLm1vdXNlUHJlc3NlZChyZXZlcnNlX3NwZWVkKTtcbiAgICpcbiAgICogICBidXR0b24gPSBjcmVhdGVCdXR0b24oJ1NUT1AnKTtcbiAgICogICBidXR0b24ucG9zaXRpb24oNDAwLCA2OCk7XG4gICAqICAgYnV0dG9uLm1vdXNlUHJlc3NlZChzdG9wX3NvbmcpO1xuICAgKlxuICAgKiAgIGJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbignUExBWSEnKTtcbiAgICogICBidXR0b24ucG9zaXRpb24oNTAwLCA2OCk7XG4gICAqICAgYnV0dG9uLm1vdXNlUHJlc3NlZChwbGF5X3NwZWVkKTtcbiAgICogfVxuICAgKlxuICAgKiBmdW5jdGlvbiB0d2ljZV9zcGVlZCgpIHtcbiAgICogICBlbGUuc3BlZWQoMik7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gaGFsZl9zcGVlZCgpIHtcbiAgICogICBlbGUuc3BlZWQoMC41KTtcbiAgICogfVxuICAgKlxuICAgKiBmdW5jdGlvbiByZXZlcnNlX3NwZWVkKCkge1xuICAgKiAgIGVsZS5zcGVlZCgtMSk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gc3RvcF9zb25nKCkge1xuICAgKiAgIGVsZS5zdG9wKCk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gcGxheV9zcGVlZCgpIHtcbiAgICogICBlbGUucGxheSgpO1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1Lk1lZGlhRWxlbWVudC5wcm90b3R5cGUuc3BlZWQgPSBmdW5jdGlvbih2YWwpIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsdC5wbGF5YmFja1JhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWx0LnBsYXliYWNrUmF0ZSA9IHZhbDtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgZWxlbWVudC5cbiAgICogSWYgYW4gYXJndW1lbnQgaXMgZ2l2ZW4gdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgZWxlbWVudCBpcyBzZXQgdG8gaXQuXG4gICAqXG4gICAqIEBtZXRob2QgdGltZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW3RpbWVdIHRpbWUgdG8ganVtcCB0byAoaW4gc2Vjb25kcylcbiAgICogQHJldHVybiB7TnVtYmVyfE9iamVjdHxwNS5NZWRpYUVsZW1lbnR9IGN1cnJlbnQgdGltZSAoaW4gc2Vjb25kcylcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBwNS5NZWRpYUVsZW1lbnRcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogdmFyIGVsZTtcbiAgICogdmFyIGJlZ2lubmluZyA9IHRydWU7XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIC8vcDUuTWVkaWFFbGVtZW50IG9iamVjdHMgYXJlIHVzdWFsbHkgY3JlYXRlZFxuICAgKiAgIC8vYnkgY2FsbGluZyB0aGUgY3JlYXRlQXVkaW8oKSwgY3JlYXRlVmlkZW8oKSxcbiAgICogICAvL2FuZCBjcmVhdGVDYXB0dXJlKCkgZnVuY3Rpb25zLlxuICAgKlxuICAgKiAgIC8vSW4gdGhpcyBleGFtcGxlIHdlIGNyZWF0ZVxuICAgKiAgIC8vYSBuZXcgcDUuTWVkaWFFbGVtZW50IHZpYSBjcmVhdGVBdWRpbygpLlxuICAgKiAgIGVsZSA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvbHVja3lfZHJhZ29ucy5tcDMnKTtcbiAgICogICBiYWNrZ3JvdW5kKDI1MCk7XG4gICAqICAgdGV4dEFsaWduKENFTlRFUik7XG4gICAqICAgdGV4dCgnc3RhcnQgYXQgYmVnaW5uaW5nJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICogfVxuICAgKlxuICAgKiAvLyB0aGlzIGZ1bmN0aW9uIGZpcmVzIHdpdGggY2xpY2sgYW55d2hlcmVcbiAgICogZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xuICAgKiAgIGlmIChiZWdpbm5pbmcgPT09IHRydWUpIHtcbiAgICogICAgIC8vIGhlcmUgd2Ugc3RhcnQgdGhlIHNvdW5kIGF0IHRoZSBiZWdpbm5pbmdcbiAgICogICAgIC8vIHRpbWUoMCkgaXMgbm90IG5lY2Vzc2FyeSBoZXJlXG4gICAqICAgICAvLyBhcyB0aGlzIHByb2R1Y2VzIHRoZSBzYW1lIHJlc3VsdCBhc1xuICAgKiAgICAgLy8gcGxheSgpXG4gICAqICAgICBlbGUucGxheSgpLnRpbWUoMCk7XG4gICAqICAgICBiYWNrZ3JvdW5kKDIwMCk7XG4gICAqICAgICB0ZXh0KCdqdW1wIDIgc2VjIGluJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICogICAgIGJlZ2lubmluZyA9IGZhbHNlO1xuICAgKiAgIH0gZWxzZSB7XG4gICAqICAgICAvLyBoZXJlIHdlIGp1bXAgMiBzZWNvbmRzIGludG8gdGhlIHNvdW5kXG4gICAqICAgICBlbGUucGxheSgpLnRpbWUoMik7XG4gICAqICAgICBiYWNrZ3JvdW5kKDI1MCk7XG4gICAqICAgICB0ZXh0KCdzdGFydCBhdCBiZWdpbm5pbmcnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgKiAgICAgYmVnaW5uaW5nID0gdHJ1ZTtcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cblxuICBwNS5NZWRpYUVsZW1lbnQucHJvdG90eXBlLnRpbWUgPSBmdW5jdGlvbih2YWwpIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsdC5jdXJyZW50VGltZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbHQuY3VycmVudFRpbWUgPSB2YWw7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkdXJhdGlvbiBvZiB0aGUgSFRNTDUgbWVkaWEgZWxlbWVudC5cbiAgICpcbiAgICogQG1ldGhvZCBkdXJhdGlvblxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGR1cmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIHZhciBlbGU7XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIC8vcDUuTWVkaWFFbGVtZW50IG9iamVjdHMgYXJlIHVzdWFsbHkgY3JlYXRlZFxuICAgKiAgIC8vYnkgY2FsbGluZyB0aGUgY3JlYXRlQXVkaW8oKSwgY3JlYXRlVmlkZW8oKSxcbiAgICogICAvL2FuZCBjcmVhdGVDYXB0dXJlKCkgZnVuY3Rpb25zLlxuICAgKiAgIC8vSW4gdGhpcyBleGFtcGxlIHdlIGNyZWF0ZVxuICAgKiAgIC8vYSBuZXcgcDUuTWVkaWFFbGVtZW50IHZpYSBjcmVhdGVBdWRpbygpLlxuICAgKiAgIGVsZSA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvZG9vcmJlbGwubXAzJyk7XG4gICAqICAgYmFja2dyb3VuZCgyNTApO1xuICAgKiAgIHRleHRBbGlnbihDRU5URVIpO1xuICAgKiAgIHRleHQoJ0NsaWNrIHRvIGtub3cgdGhlIGR1cmF0aW9uIScsIDEwLCAyNSwgNzAsIDgwKTtcbiAgICogfVxuICAgKiBmdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XG4gICAqICAgZWxlLnBsYXkoKTtcbiAgICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gICAqICAgLy9lbGUuZHVyYXRpb24gZGlzbHBheXMgdGhlIGR1cmF0aW9uXG4gICAqICAgdGV4dChlbGUuZHVyYXRpb24oKSArICcgc2Vjb25kcycsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmVsdC5kdXJhdGlvbjtcbiAgfTtcbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS5waXhlbHMgPSBbXTtcbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS5sb2FkUGl4ZWxzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2FkZWRtZXRhZGF0YSkge1xuICAgICAgLy8gd2FpdCBmb3IgbWV0YWRhdGEgZm9yIHcvaFxuICAgICAgaWYgKHRoaXMuY2FudmFzLndpZHRoICE9PSB0aGlzLmVsdC53aWR0aCkge1xuICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuZWx0LndpZHRoO1xuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmVsdC5oZWlnaHQ7XG4gICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmNhbnZhcy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmNhbnZhcy5oZWlnaHQ7XG4gICAgICB9XG4gICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmRyYXdJbWFnZShcbiAgICAgICAgdGhpcy5lbHQsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoLFxuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHRcbiAgICAgICk7XG4gICAgICBwNS5SZW5kZXJlcjJELnByb3RvdHlwZS5sb2FkUGl4ZWxzLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuc2V0TW9kaWZpZWQodHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHA1Lk1lZGlhRWxlbWVudC5wcm90b3R5cGUudXBkYXRlUGl4ZWxzID0gZnVuY3Rpb24oeCwgeSwgdywgaCkge1xuICAgIGlmICh0aGlzLmxvYWRlZG1ldGFkYXRhKSB7XG4gICAgICAvLyB3YWl0IGZvciBtZXRhZGF0YVxuICAgICAgcDUuUmVuZGVyZXIyRC5wcm90b3R5cGUudXBkYXRlUGl4ZWxzLmNhbGwodGhpcywgeCwgeSwgdywgaCk7XG4gICAgfVxuICAgIHRoaXMuc2V0TW9kaWZpZWQodHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHA1Lk1lZGlhRWxlbWVudC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oeCwgeSwgdywgaCkge1xuICAgIGlmICh0aGlzLmxvYWRlZG1ldGFkYXRhKSB7XG4gICAgICAvLyB3YWl0IGZvciBtZXRhZGF0YVxuICAgICAgcmV0dXJuIHA1LlJlbmRlcmVyMkQucHJvdG90eXBlLmdldC5jYWxsKHRoaXMsIHgsIHksIHcsIGgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbmV3IHA1LkltYWdlKDEsIDEpO1xuICAgIH0gZWxzZSBpZiAodyA+IDEpIHtcbiAgICAgIHJldHVybiBuZXcgcDUuSW1hZ2UoeCwgeSwgdywgaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbMCwgMCwgMCwgMjU1XTtcbiAgICB9XG4gIH07XG4gIHA1Lk1lZGlhRWxlbWVudC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oeCwgeSwgaW1nT3JDb2wpIHtcbiAgICBpZiAodGhpcy5sb2FkZWRtZXRhZGF0YSkge1xuICAgICAgLy8gd2FpdCBmb3IgbWV0YWRhdGFcbiAgICAgIHA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnNldC5jYWxsKHRoaXMsIHgsIHksIGltZ09yQ29sKTtcbiAgICAgIHRoaXMuc2V0TW9kaWZpZWQodHJ1ZSk7XG4gICAgfVxuICB9O1xuICBwNS5NZWRpYUVsZW1lbnQucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICBwNS5SZW5kZXJlcjJELnByb3RvdHlwZS5jb3B5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG4gIHA1Lk1lZGlhRWxlbWVudC5wcm90b3R5cGUubWFzayA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMubG9hZFBpeGVscygpO1xuICAgIHRoaXMuc2V0TW9kaWZpZWQodHJ1ZSk7XG4gICAgcDUuSW1hZ2UucHJvdG90eXBlLm1hc2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgLyoqXG4gICAqIGhlbHBlciBtZXRob2QgZm9yIHdlYiBHTCBtb2RlIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIGVsZW1lbnRcbiAgICogaGFzIGJlZW4gbW9kaWZpZWQgYW5kIG1pZ2h0IG5lZWQgdG8gYmUgcmUtdXBsb2FkZWQgdG8gdGV4dHVyZVxuICAgKiBtZW1vcnkgYmV0d2VlbiBmcmFtZXMuXG4gICAqIEBtZXRob2QgaXNNb2RpZmllZFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHtib29sZWFufSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGVcbiAgICogaW1hZ2UgaGFzIGJlZW4gdXBkYXRlZCBvciBtb2RpZmllZCBzaW5jZSBsYXN0IHRleHR1cmUgdXBsb2FkLlxuICAgKi9cbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS5pc01vZGlmaWVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGlmaWVkO1xuICB9O1xuICAvKipcbiAgICogaGVscGVyIG1ldGhvZCBmb3Igd2ViIEdMIG1vZGUgdG8gaW5kaWNhdGUgdGhhdCBhbiBlbGVtZW50IGhhcyBiZWVuXG4gICAqIGNoYW5nZWQgb3IgdW5jaGFuZ2VkIHNpbmNlIGxhc3QgdXBsb2FkLiBnbCB0ZXh0dXJlIHVwbG9hZCB3aWxsXG4gICAqIHNldCB0aGlzIHZhbHVlIHRvIGZhbHNlIGFmdGVyIHVwbG9hZGluZyB0aGUgdGV4dHVyZTsgb3IgbWlnaHQgc2V0XG4gICAqIGl0IHRvIHRydWUgaWYgbWV0YWRhdGEgaGFzIGJlY29tZSBhdmFpbGFibGUgYnV0IHRoZXJlIGlzIG5vIGFjdHVhbFxuICAgKiB0ZXh0dXJlIGRhdGEgYXZhaWxhYmxlIHlldC4uXG4gICAqIEBtZXRob2Qgc2V0TW9kaWZpZWRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWwgc2V0cyB3aGV0aGVyIG9yIG5vdCB0aGUgZWxlbWVudCBoYXMgYmVlblxuICAgKiBtb2RpZmllZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHA1Lk1lZGlhRWxlbWVudC5wcm90b3R5cGUuc2V0TW9kaWZpZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMuX21vZGlmaWVkID0gdmFsdWU7XG4gIH07XG4gIC8qKlxuICAgKiBTY2hlZHVsZSBhbiBldmVudCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYXVkaW8gb3IgdmlkZW9cbiAgICogZWxlbWVudCByZWFjaGVzIHRoZSBlbmQuIElmIHRoZSBlbGVtZW50IGlzIGxvb3BpbmcsXG4gICAqIHRoaXMgd2lsbCBub3QgYmUgY2FsbGVkLiBUaGUgZWxlbWVudCBpcyBwYXNzZWQgaW5cbiAgICogYXMgdGhlIGFyZ3VtZW50IHRvIHRoZSBvbmVuZGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAbWV0aG9kICBvbmVuZGVkXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZGZpbGUgaGFzIGVuZGVkLiBUaGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhIGVsZW1lbnQgd2lsbCBiZSBwYXNzZWRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFzIHRoZSBhcmd1bWVudCB0byB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJuIHtPYmplY3R8cDUuTWVkaWFFbGVtZW50fVxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICB2YXIgYXVkaW9FbCA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvYmVhdC5tcDMnKTtcbiAgICogICBhdWRpb0VsLnNob3dDb250cm9scygpO1xuICAgKiAgIGF1ZGlvRWwub25lbmRlZChzYXlEb25lKTtcbiAgICogfVxuICAgKlxuICAgKiBmdW5jdGlvbiBzYXlEb25lKGVsdCkge1xuICAgKiAgIGFsZXJ0KCdkb25lIHBsYXlpbmcgJyArIGVsdC5zcmMpO1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIHA1Lk1lZGlhRWxlbWVudC5wcm90b3R5cGUub25lbmRlZCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25lbmRlZCA9IGNhbGxiYWNrO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKiogQ09OTkVDVCBUTyBXRUIgQVVESU8gQVBJIC8gcDUuc291bmQuanMgKioqL1xuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBhdWRpbyBvdXRwdXQgb2YgdGhpcyBlbGVtZW50IHRvIGEgc3BlY2lmaWVkIGF1ZGlvTm9kZSBvclxuICAgKiBwNS5zb3VuZCBvYmplY3QuIElmIG5vIGVsZW1lbnQgaXMgcHJvdmlkZWQsIGNvbm5lY3RzIHRvIHA1J3MgbWFzdGVyXG4gICAqIG91dHB1dC4gVGhhdCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHdoZW4gdGhpcyBtZXRob2QgaXMgZmlyc3QgY2FsbGVkLlxuICAgKiBBbGwgY29ubmVjdGlvbnMgYXJlIHJlbW92ZWQgYnkgdGhlIC5kaXNjb25uZWN0KCkgbWV0aG9kLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGggdGhlIHA1LnNvdW5kLmpzIGFkZG9uIGxpYnJhcnkuXG4gICAqXG4gICAqIEBtZXRob2QgIGNvbm5lY3RcbiAgICogQHBhcmFtICB7QXVkaW9Ob2RlfE9iamVjdH0gYXVkaW9Ob2RlIEF1ZGlvTm9kZSBmcm9tIHRoZSBXZWIgQXVkaW8gQVBJLFxuICAgKiBvciBhbiBvYmplY3QgZnJvbSB0aGUgcDUuc291bmQgbGlicmFyeVxuICAgKi9cbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIGF1ZGlvQ29udGV4dCwgbWFzdGVyT3V0cHV0O1xuXG4gICAgLy8gaWYgcDUuc291bmQgZXhpc3RzLCBzYW1lIGF1ZGlvIGNvbnRleHRcbiAgICBpZiAodHlwZW9mIHA1LnByb3RvdHlwZS5nZXRBdWRpb0NvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGF1ZGlvQ29udGV4dCA9IHA1LnByb3RvdHlwZS5nZXRBdWRpb0NvbnRleHQoKTtcbiAgICAgIG1hc3Rlck91dHB1dCA9IHA1LnNvdW5kT3V0LmlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBhdWRpb0NvbnRleHQgPSBvYmouY29udGV4dDtcbiAgICAgICAgbWFzdGVyT3V0cHV0ID0gYXVkaW9Db250ZXh0LmRlc3RpbmF0aW9uO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyAnY29ubmVjdCgpIGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aCBXZWIgQXVkaW8gQVBJIG9yIHA1LnNvdW5kLmpzJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgYSBXZWIgQXVkaW8gTWVkaWFFbGVtZW50QXVkaW9Tb3VyY2VOb2RlIGlmIG5vbmUgYWxyZWFkeSBleGlzdHNcbiAgICBpZiAoIXRoaXMuYXVkaW9Tb3VyY2VOb2RlKSB7XG4gICAgICB0aGlzLmF1ZGlvU291cmNlTm9kZSA9IGF1ZGlvQ29udGV4dC5jcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UodGhpcy5lbHQpO1xuXG4gICAgICAvLyBjb25uZWN0IHRvIG1hc3RlciBvdXRwdXQgd2hlbiB0aGlzIG1ldGhvZCBpcyBmaXJzdCBjYWxsZWRcbiAgICAgIHRoaXMuYXVkaW9Tb3VyY2VOb2RlLmNvbm5lY3QobWFzdGVyT3V0cHV0KTtcbiAgICB9XG5cbiAgICAvLyBjb25uZWN0IHRvIG9iamVjdCBpZiBwcm92aWRlZFxuICAgIGlmIChvYmopIHtcbiAgICAgIGlmIChvYmouaW5wdXQpIHtcbiAgICAgICAgdGhpcy5hdWRpb1NvdXJjZU5vZGUuY29ubmVjdChvYmouaW5wdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hdWRpb1NvdXJjZU5vZGUuY29ubmVjdChvYmopO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2UgY29ubmVjdCB0byBtYXN0ZXIgb3V0cHV0IG9mIHA1LnNvdW5kIC8gQXVkaW9Db250ZXh0XG4gICAgICB0aGlzLmF1ZGlvU291cmNlTm9kZS5jb25uZWN0KG1hc3Rlck91dHB1dCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0IGFsbCBXZWIgQXVkaW8gcm91dGluZywgaW5jbHVkaW5nIHRvIG1hc3RlciBvdXRwdXQuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJlLXJvdXRlIHRoZSBvdXRwdXQgdGhyb3VnaFxuICAgKiBhdWRpbyBlZmZlY3RzLCBmb3IgZXhhbXBsZS5cbiAgICpcbiAgICogQG1ldGhvZCAgZGlzY29ubmVjdFxuICAgKi9cbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuYXVkaW9Tb3VyY2VOb2RlKSB7XG4gICAgICB0aGlzLmF1ZGlvU291cmNlTm9kZS5kaXNjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93ICdub3RoaW5nIHRvIGRpc2Nvbm5lY3QnO1xuICAgIH1cbiAgfTtcblxuICAvKioqIFNIT1cgLyBISURFIENPTlRST0xTICoqKi9cblxuICAvKipcbiAgICogU2hvdyB0aGUgZGVmYXVsdCBNZWRpYUVsZW1lbnQgY29udHJvbHMsIGFzIGRldGVybWluZWQgYnkgdGhlIHdlYiBicm93c2VyLlxuICAgKlxuICAgKiBAbWV0aG9kICBzaG93Q29udHJvbHNcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogdmFyIGVsZTtcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgLy9wNS5NZWRpYUVsZW1lbnQgb2JqZWN0cyBhcmUgdXN1YWxseSBjcmVhdGVkXG4gICAqICAgLy9ieSBjYWxsaW5nIHRoZSBjcmVhdGVBdWRpbygpLCBjcmVhdGVWaWRlbygpLFxuICAgKiAgIC8vYW5kIGNyZWF0ZUNhcHR1cmUoKSBmdW5jdGlvbnMuXG4gICAqICAgLy9JbiB0aGlzIGV4YW1wbGUgd2UgY3JlYXRlXG4gICAqICAgLy9hIG5ldyBwNS5NZWRpYUVsZW1lbnQgdmlhIGNyZWF0ZUF1ZGlvKClcbiAgICogICBlbGUgPSBjcmVhdGVBdWRpbygnYXNzZXRzL2x1Y2t5X2RyYWdvbnMubXAzJyk7XG4gICAqICAgYmFja2dyb3VuZCgyMDApO1xuICAgKiAgIHRleHRBbGlnbihDRU5URVIpO1xuICAgKiAgIHRleHQoJ0NsaWNrIHRvIFNob3cgQ29udHJvbHMhJywgMTAsIDI1LCA3MCwgODApO1xuICAgKiB9XG4gICAqIGZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcbiAgICogICBlbGUuc2hvd0NvbnRyb2xzKCk7XG4gICAqICAgYmFja2dyb3VuZCgyMDApO1xuICAgKiAgIHRleHQoJ0NvbnRyb2xzIFNob3duJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICogfVxuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqL1xuICBwNS5NZWRpYUVsZW1lbnQucHJvdG90eXBlLnNob3dDb250cm9scyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIG11c3Qgc2V0IHN0eWxlIGZvciB0aGUgZWxlbWVudCB0byBzaG93IG9uIHRoZSBwYWdlXG4gICAgdGhpcy5lbHQuc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdpbmhlcml0JztcbiAgICB0aGlzLmVsdC5jb250cm9scyA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIGRlZmF1bHQgbWVkaWFFbGVtZW50IGNvbnRyb2xzLlxuICAgKiBAbWV0aG9kIGhpZGVDb250cm9sc1xuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiB2YXIgZWxlO1xuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICAvL3A1Lk1lZGlhRWxlbWVudCBvYmplY3RzIGFyZSB1c3VhbGx5IGNyZWF0ZWRcbiAgICogICAvL2J5IGNhbGxpbmcgdGhlIGNyZWF0ZUF1ZGlvKCksIGNyZWF0ZVZpZGVvKCksXG4gICAqICAgLy9hbmQgY3JlYXRlQ2FwdHVyZSgpIGZ1bmN0aW9ucy5cbiAgICogICAvL0luIHRoaXMgZXhhbXBsZSB3ZSBjcmVhdGVcbiAgICogICAvL2EgbmV3IHA1Lk1lZGlhRWxlbWVudCB2aWEgY3JlYXRlQXVkaW8oKVxuICAgKiAgIGVsZSA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvbHVja3lfZHJhZ29ucy5tcDMnKTtcbiAgICogICBlbGUuc2hvd0NvbnRyb2xzKCk7XG4gICAqICAgYmFja2dyb3VuZCgyMDApO1xuICAgKiAgIHRleHRBbGlnbihDRU5URVIpO1xuICAgKiAgIHRleHQoJ0NsaWNrIHRvIGhpZGUgQ29udHJvbHMhJywgMTAsIDI1LCA3MCwgODApO1xuICAgKiB9XG4gICAqIGZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcbiAgICogICBlbGUuaGlkZUNvbnRyb2xzKCk7XG4gICAqICAgYmFja2dyb3VuZCgyMDApO1xuICAgKiAgIHRleHQoJ0NvbnRyb2xzIGhpZGRlbicsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS5oaWRlQ29udHJvbHMgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmVsdC5jb250cm9scyA9IGZhbHNlO1xuICB9O1xuXG4gIC8qKiogU0NIRURVTEUgRVZFTlRTICoqKi9cblxuICAvLyBDdWUgaW5zcGlyZWQgYnkgSmF2YVNjcmlwdCBzZXRUaW1lb3V0LCBhbmQgdGhlXG4gIC8vIFRvbmUuanMgVHJhbnNwb3J0IFRpbWVsaW5lIEV2ZW50LCBNSVQgTGljZW5zZSBZb3RhbSBNYW5uIDIwMTUgdG9uZWpzLm9yZ1xuICB2YXIgQ3VlID0gZnVuY3Rpb24oY2FsbGJhY2ssIHRpbWUsIGlkLCB2YWwpIHtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy50aW1lID0gdGltZTtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy52YWwgPSB2YWw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlIGV2ZW50cyB0byB0cmlnZ2VyIGV2ZXJ5IHRpbWUgYSBNZWRpYUVsZW1lbnRcbiAgICogKGF1ZGlvL3ZpZGVvKSByZWFjaGVzIGEgcGxheWJhY2sgY3VlIHBvaW50LlxuICAgKlxuICAgKiBBY2NlcHRzIGEgY2FsbGJhY2sgZnVuY3Rpb24sIGEgdGltZSAoaW4gc2Vjb25kcykgYXQgd2hpY2ggdG8gdHJpZ2dlclxuICAgKiB0aGUgY2FsbGJhY2ssIGFuZCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgZm9yIHRoZSBjYWxsYmFjay5cbiAgICpcbiAgICogVGltZSB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbixcbiAgICogYW5kIHBhcmFtIHdpbGwgYmUgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG4gICAqXG4gICAqXG4gICAqIEBtZXRob2QgIGFkZEN1ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gICB0aW1lICAgICBUaW1lIGluIHNlY29uZHMsIHJlbGF0aXZlIHRvIHRoaXMgbWVkaWFcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQncyBwbGF5YmFjay4gRm9yIGV4YW1wbGUsIHRvIHRyaWdnZXJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGV2ZW50IGV2ZXJ5IHRpbWUgcGxheWJhY2sgcmVhY2hlcyB0d29cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMsIHBhc3MgaW4gdGhlIG51bWJlciAyLiBUaGlzIHdpbGwgYmVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIE5hbWUgb2YgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhdCB0aGUgZ2l2ZW4gdGltZS4gVGhlIGNhbGxiYWNrIHdpbGxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgdGltZSBhbmQgKG9wdGlvbmFsbHkpIHBhcmFtIGFzIGl0c1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbdmFsdWVdICAgIEFuIG9iamVjdCB0byBiZSBwYXNzZWQgYXMgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgcGFyYW1ldGVyIHRvIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge051bWJlcn0gaWQgSUQgb2YgdGhpcyBjdWUsXG4gICAqICAgICAgICAgICAgICAgICAgICAgdXNlZnVsIGZvciByZW1vdmVDdWUoaWQpXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIGJhY2tncm91bmQoMjU1LCAyNTUsIDI1NSk7XG4gICAqXG4gICAqICAgdmFyIGF1ZGlvRWwgPSBjcmVhdGVBdWRpbygnYXNzZXRzL2JlYXQubXAzJyk7XG4gICAqICAgYXVkaW9FbC5zaG93Q29udHJvbHMoKTtcbiAgICpcbiAgICogICAvLyBzY2hlZHVsZSB0aHJlZSBjYWxscyB0byBjaGFuZ2VCYWNrZ3JvdW5kXG4gICAqICAgYXVkaW9FbC5hZGRDdWUoMC41LCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigyNTUsIDAsIDApKTtcbiAgICogICBhdWRpb0VsLmFkZEN1ZSgxLjAsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDAsIDI1NSwgMCkpO1xuICAgKiAgIGF1ZGlvRWwuYWRkQ3VlKDIuNSwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMCwgMCwgMjU1KSk7XG4gICAqICAgYXVkaW9FbC5hZGRDdWUoMy4wLCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigwLCAyNTUsIDI1NSkpO1xuICAgKiAgIGF1ZGlvRWwuYWRkQ3VlKDQuMiwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMjU1LCAyNTUsIDApKTtcbiAgICogICBhdWRpb0VsLmFkZEN1ZSg1LjAsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDI1NSwgMjU1LCAwKSk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gY2hhbmdlQmFja2dyb3VuZCh2YWwpIHtcbiAgICogICBiYWNrZ3JvdW5kKHZhbCk7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS5hZGRDdWUgPSBmdW5jdGlvbih0aW1lLCBjYWxsYmFjaywgdmFsKSB7XG4gICAgdmFyIGlkID0gdGhpcy5fY3VlSURDb3VudGVyKys7XG5cbiAgICB2YXIgY3VlID0gbmV3IEN1ZShjYWxsYmFjaywgdGltZSwgaWQsIHZhbCk7XG4gICAgdGhpcy5fY3Vlcy5wdXNoKGN1ZSk7XG5cbiAgICBpZiAoIXRoaXMuZWx0Lm9udGltZXVwZGF0ZSkge1xuICAgICAgdGhpcy5lbHQub250aW1ldXBkYXRlID0gdGhpcy5fb25UaW1lVXBkYXRlLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjYWxsYmFjayBiYXNlZCBvbiBpdHMgSUQuIFRoZSBJRCBpcyByZXR1cm5lZCBieSB0aGVcbiAgICogYWRkQ3VlIG1ldGhvZC5cbiAgICogQG1ldGhvZCByZW1vdmVDdWVcbiAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBJRCBvZiB0aGUgY3VlLCBhcyByZXR1cm5lZCBieSBhZGRDdWVcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogdmFyIGF1ZGlvRWwsIGlkMSwgaWQyO1xuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICBiYWNrZ3JvdW5kKDI1NSwgMjU1LCAyNTUpO1xuICAgKiAgIGF1ZGlvRWwgPSBjcmVhdGVBdWRpbygnYXNzZXRzL2JlYXQubXAzJyk7XG4gICAqICAgYXVkaW9FbC5zaG93Q29udHJvbHMoKTtcbiAgICogICAvLyBzY2hlZHVsZSBmaXZlIGNhbGxzIHRvIGNoYW5nZUJhY2tncm91bmRcbiAgICogICBpZDEgPSBhdWRpb0VsLmFkZEN1ZSgwLjUsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDI1NSwgMCwgMCkpO1xuICAgKiAgIGF1ZGlvRWwuYWRkQ3VlKDEuMCwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMCwgMjU1LCAwKSk7XG4gICAqICAgYXVkaW9FbC5hZGRDdWUoMi41LCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigwLCAwLCAyNTUpKTtcbiAgICogICBhdWRpb0VsLmFkZEN1ZSgzLjAsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDAsIDI1NSwgMjU1KSk7XG4gICAqICAgaWQyID0gYXVkaW9FbC5hZGRDdWUoNC4yLCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigyNTUsIDI1NSwgMCkpO1xuICAgKiAgIHRleHQoJ0NsaWNrIHRvIHJlbW92ZSBmaXJzdCBhbmQgbGFzdCBDdWUhJywgMTAsIDI1LCA3MCwgODApO1xuICAgKiB9XG4gICAqIGZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcbiAgICogICBhdWRpb0VsLnJlbW92ZUN1ZShpZDEpO1xuICAgKiAgIGF1ZGlvRWwucmVtb3ZlQ3VlKGlkMik7XG4gICAqIH1cbiAgICogZnVuY3Rpb24gY2hhbmdlQmFja2dyb3VuZCh2YWwpIHtcbiAgICogICBiYWNrZ3JvdW5kKHZhbCk7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS5yZW1vdmVDdWUgPSBmdW5jdGlvbihpZCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fY3Vlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2N1ZXNbaV0uaWQgPT09IGlkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGlkKTtcbiAgICAgICAgdGhpcy5fY3Vlcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2N1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVsdC5vbnRpbWV1cGRhdGUgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBvZiB0aGUgY2FsbGJhY2tzIHRoYXQgaGFkIG9yaWdpbmFsbHkgYmVlbiBzY2hlZHVsZWRcbiAgICogdmlhIHRoZSBhZGRDdWUgbWV0aG9kLlxuICAgKiBAbWV0aG9kICBjbGVhckN1ZXNcbiAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBJRCBvZiB0aGUgY3VlLCBhcyByZXR1cm5lZCBieSBhZGRDdWVcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogdmFyIGF1ZGlvRWw7XG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIGJhY2tncm91bmQoMjU1LCAyNTUsIDI1NSk7XG4gICAqICAgYXVkaW9FbCA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvYmVhdC5tcDMnKTtcbiAgICogICAvL1Nob3cgdGhlIGRlZmF1bHQgTWVkaWFFbGVtZW50IGNvbnRyb2xzLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSB3ZWIgYnJvd3NlclxuICAgKiAgIGF1ZGlvRWwuc2hvd0NvbnRyb2xzKCk7XG4gICAqICAgLy8gc2NoZWR1bGUgY2FsbHMgdG8gY2hhbmdlQmFja2dyb3VuZFxuICAgKiAgIGJhY2tncm91bmQoMjAwKTtcbiAgICogICB0ZXh0KCdDbGljayB0byBjaGFuZ2UgQ3VlIScsIDEwLCAyNSwgNzAsIDgwKTtcbiAgICogICBhdWRpb0VsLmFkZEN1ZSgwLjUsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDI1NSwgMCwgMCkpO1xuICAgKiAgIGF1ZGlvRWwuYWRkQ3VlKDEuMCwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMCwgMjU1LCAwKSk7XG4gICAqICAgYXVkaW9FbC5hZGRDdWUoMi41LCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigwLCAwLCAyNTUpKTtcbiAgICogICBhdWRpb0VsLmFkZEN1ZSgzLjAsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDAsIDI1NSwgMjU1KSk7XG4gICAqICAgYXVkaW9FbC5hZGRDdWUoNC4yLCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigyNTUsIDI1NSwgMCkpO1xuICAgKiB9XG4gICAqIGZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcbiAgICogICAvLyBoZXJlIHdlIGNsZWFyIHRoZSBzY2hlZHVsZWQgY2FsbGJhY2tzXG4gICAqICAgYXVkaW9FbC5jbGVhckN1ZXMoKTtcbiAgICogICAvLyB0aGVuIHdlIGFkZCBzb21lIG1vcmUgY2FsbGJhY2tzXG4gICAqICAgYXVkaW9FbC5hZGRDdWUoMSwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMiwgMiwgMikpO1xuICAgKiAgIGF1ZGlvRWwuYWRkQ3VlKDMsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDI1NSwgMjU1LCAwKSk7XG4gICAqIH1cbiAgICogZnVuY3Rpb24gY2hhbmdlQmFja2dyb3VuZCh2YWwpIHtcbiAgICogICBiYWNrZ3JvdW5kKHZhbCk7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgcDUuTWVkaWFFbGVtZW50LnByb3RvdHlwZS5jbGVhckN1ZXMgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdWVzID0gW107XG4gICAgdGhpcy5lbHQub250aW1ldXBkYXRlID0gbnVsbDtcbiAgfTtcblxuICAvLyBwcml2YXRlIG1ldGhvZCB0aGF0IGNoZWNrcyBmb3IgY3VlcyB0byBiZSBmaXJlZCBpZiBldmVudHNcbiAgLy8gaGF2ZSBiZWVuIHNjaGVkdWxlZCB1c2luZyBhZGRDdWUoY2FsbGJhY2ssIHRpbWUpLlxuICBwNS5NZWRpYUVsZW1lbnQucHJvdG90eXBlLl9vblRpbWVVcGRhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGxheWJhY2tUaW1lID0gdGhpcy50aW1lKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2N1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjYWxsYmFja1RpbWUgPSB0aGlzLl9jdWVzW2ldLnRpbWU7XG4gICAgICB2YXIgdmFsID0gdGhpcy5fY3Vlc1tpXS52YWw7XG5cbiAgICAgIGlmICh0aGlzLl9wcmV2VGltZSA8IGNhbGxiYWNrVGltZSAmJiBjYWxsYmFja1RpbWUgPD0gcGxheWJhY2tUaW1lKSB7XG4gICAgICAgIC8vIHBhc3MgdGhlIHNjaGVkdWxlZCBjYWxsYmFja1RpbWUgYXMgcGFyYW1ldGVyIHRvIHRoZSBjYWxsYmFja1xuICAgICAgICB0aGlzLl9jdWVzW2ldLmNhbGxiYWNrKHZhbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fcHJldlRpbWUgPSBwbGF5YmFja1RpbWU7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgcDUuRmlsZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBCYXNlIGNsYXNzIGZvciBhIGZpbGVcbiAgICogVXNpbmcgdGhpcyBmb3IgY3JlYXRlRmlsZUlucHV0XG4gICAqXG4gICAqIEBjbGFzcyBwNS5GaWxlXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge0ZpbGV9IGZpbGUgRmlsZSB0aGF0IGlzIHdyYXBwZWRcbiAgICovXG4gIHA1LkZpbGUgPSBmdW5jdGlvbihmaWxlLCBwSW5zdCkge1xuICAgIC8qKlxuICAgICAqIFVuZGVybHlpbmcgRmlsZSBvYmplY3QuIEFsbCBub3JtYWwgRmlsZSBtZXRob2RzIGNhbiBiZSBjYWxsZWQgb24gdGhpcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBmaWxlXG4gICAgICovXG4gICAgdGhpcy5maWxlID0gZmlsZTtcblxuICAgIHRoaXMuX3BJbnN0ID0gcEluc3Q7XG5cbiAgICAvLyBTcGxpdHRpbmcgb3V0IHRoZSBmaWxlIHR5cGUgaW50byB0d28gY29tcG9uZW50c1xuICAgIC8vIFRoaXMgbWFrZXMgZGV0ZXJtaW5pbmcgaWYgaW1hZ2Ugb3IgdGV4dCBldGMgc2ltcGxlclxuICAgIHZhciB0eXBlTGlzdCA9IGZpbGUudHlwZS5zcGxpdCgnLycpO1xuICAgIC8qKlxuICAgICAqIEZpbGUgdHlwZSAoaW1hZ2UsIHRleHQsIGV0Yy4pXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgdHlwZVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IHR5cGVMaXN0WzBdO1xuICAgIC8qKlxuICAgICAqIEZpbGUgc3VidHlwZSAodXN1YWxseSB0aGUgZmlsZSBleHRlbnNpb24ganBnLCBwbmcsIHhtbCwgZXRjLilcbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBzdWJ0eXBlXG4gICAgICovXG4gICAgdGhpcy5zdWJ0eXBlID0gdHlwZUxpc3RbMV07XG4gICAgLyoqXG4gICAgICogRmlsZSBuYW1lXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgbmFtZVxuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IGZpbGUubmFtZTtcbiAgICAvKipcbiAgICAgKiBGaWxlIHNpemVcbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSBzaXplXG4gICAgICovXG4gICAgdGhpcy5zaXplID0gZmlsZS5zaXplO1xuXG4gICAgLyoqXG4gICAgICogVVJMIHN0cmluZyBjb250YWluaW5nIGltYWdlIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkgZGF0YVxuICAgICAqL1xuICAgIHRoaXMuZGF0YSA9IHVuZGVmaW5lZDtcbiAgfTtcbn0pO1xuIiwiLyohIHA1LmpzIHYwLjYuMSBBcHJpbCAyNywgMjAxOCAqL1xuKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09XCJvYmplY3RcIiYmdHlwZW9mIG1vZHVsZSE9PVwidW5kZWZpbmVkXCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQpe2RlZmluZShbXSxmKX1lbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiKXtnPXdpbmRvd31lbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIil7Zz1zZWxmfWVsc2V7Zz10aGlzfWcucDUgPSBmKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiAoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cz17XG4gICAgXCJwcm9qZWN0XCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwicDVcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL3Byb2Nlc3NpbmcvcDUuanMuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvcHJvY2Vzc2luZy9wNS5qcykgWyFbbnBtIHZlcnNpb25dKGh0dHBzOi8vYmFkZ2UuZnVyeS5pby9qcy9wNS5zdmcpXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9wNSlcIixcbiAgICAgICAgXCJ2ZXJzaW9uXCI6IFwiMC42LjFcIixcbiAgICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy9wNS5qcyNyZWFkbWVcIlxuICAgIH0sXG4gICAgXCJmaWxlc1wiOiB7XG4gICAgICAgIFwic3JjL2NvbG9yL2NvbG9yX2NvbnZlcnNpb24uanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL2NvbG9yL2NvbG9yX2NvbnZlcnNpb24uanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJDb2xvciBDb252ZXJzaW9uXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9jb2xvci9jcmVhdGluZ19yZWFkaW5nLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9jb2xvci9jcmVhdGluZ19yZWFkaW5nLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiQ3JlYXRpbmcgJiBSZWFkaW5nXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9jb2xvci9wNS5Db2xvci5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvY29sb3IvcDUuQ29sb3IuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5Db2xvclwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvY29sb3Ivc2V0dGluZy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvY29sb3Ivc2V0dGluZy5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIlNldHRpbmdcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL2NvcmUvMmRfcHJpbWl0aXZlcy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvY29yZS8yZF9wcmltaXRpdmVzLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiMkQgUHJpbWl0aXZlc1wiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvY29yZS9hdHRyaWJ1dGVzLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9jb3JlL2F0dHJpYnV0ZXMuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJBdHRyaWJ1dGVzXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9jb3JlL2NhbnZhcy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvY29yZS9jYW52YXMuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7fSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJDb25zdGFudHNcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL2NvcmUvY29yZS5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvY29yZS9jb3JlLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiU3RydWN0dXJlXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL2NvcmUvY3VydmVzLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9jb3JlL2N1cnZlcy5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkN1cnZlc1wiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvY29yZS9lbnZpcm9ubWVudC5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvY29yZS9lbnZpcm9ubWVudC5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkVudmlyb25tZW50XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9jb3JlL2Vycm9yX2hlbHBlcnMuanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL2NvcmUvZXJyb3JfaGVscGVycy5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvY29yZS9pbml0LmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9jb3JlL2luaXQuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7fSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL2NvcmUvcDUuRWxlbWVudC5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkRPTVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LkVsZW1lbnRcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5FbGVtZW50XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvY29yZS9wNS5HcmFwaGljcy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvY29yZS9wNS5HcmFwaGljcy5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIlJlbmRlcmluZ1wiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LkdyYXBoaWNzXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9jb3JlL3A1LlJlbmRlcmVyLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9jb3JlL3A1LlJlbmRlcmVyLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuUmVuZGVyZXJcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL2NvcmUvcDUuUmVuZGVyZXIyRC5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvY29yZS9wNS5SZW5kZXJlcjJELmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge30sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvY29yZS9yZW5kZXJpbmcuanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL2NvcmUvcmVuZGVyaW5nLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9jb3JlL3NoaW0uanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL2NvcmUvc2hpbS5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHt9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL2NvcmUvc3RydWN0dXJlLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9jb3JlL3N0cnVjdHVyZS5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvY29yZS90cmFuc2Zvcm0uanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL2NvcmUvdHJhbnNmb3JtLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiVHJhbnNmb3JtXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9jb3JlL3ZlcnRleC5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvY29yZS92ZXJ0ZXguanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJWZXJ0ZXhcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkRpY3Rpb25hcnlcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5UeXBlZERpY3RcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlN0cmluZ0RpY3RcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1Lk51bWJlckRpY3RcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5UeXBlZERpY3RcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkFjY2VsZXJhdGlvblwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvZXZlbnRzL2tleWJvYXJkLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9ldmVudHMva2V5Ym9hcmQuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJLZXlib2FyZFwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvZXZlbnRzL21vdXNlLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9ldmVudHMvbW91c2UuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJNb3VzZVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvZXZlbnRzL3RvdWNoLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9ldmVudHMvdG91Y2guanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJUb3VjaFwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvaW1hZ2UvZmlsdGVycy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvaW1hZ2UvZmlsdGVycy5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHt9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL2ltYWdlL2ltYWdlLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9pbWFnZS9pbWFnZS5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkltYWdlXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9pbWFnZS9sb2FkaW5nX2Rpc3BsYXlpbmcuanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkxvYWRpbmcgJiBEaXNwbGF5aW5nXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9pbWFnZS9wNS5JbWFnZS5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvaW1hZ2UvcDUuSW1hZ2UuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5JbWFnZVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHt9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL2ltYWdlL3BpeGVscy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvaW1hZ2UvcGl4ZWxzLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiUGl4ZWxzXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9pby9maWxlcy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvaW8vZmlsZXMuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJJbnB1dFwiOiAxLFxuICAgICAgICAgICAgICAgIFwiT3V0cHV0XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuUHJpbnRXcml0ZXJcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL2lvL3A1LlRhYmxlLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy9pby9wNS5UYWJsZS5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIlRhYmxlXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuVGFibGVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7fSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9pby9wNS5UYWJsZVJvdy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvaW8vcDUuVGFibGVSb3cuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5UYWJsZVJvd1wiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHt9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL2lvL3A1LlhNTC5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvaW8vcDUuWE1MLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiWE1MXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuWE1MXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge30sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvbWF0aC9jYWxjdWxhdGlvbi5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvbWF0aC9jYWxjdWxhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkNhbGN1bGF0aW9uXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9tYXRoL21hdGguanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL21hdGgvbWF0aC5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIk1hdGhcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL21hdGgvbm9pc2UuanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL21hdGgvbm9pc2UuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJOb2lzZVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvbWF0aC9wNS5WZWN0b3IuanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuVmVjdG9yXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge30sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvbWF0aC9yYW5kb20uanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL21hdGgvcmFuZG9tLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiUmFuZG9tXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy9tYXRoL3RyaWdvbm9tZXRyeS5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvbWF0aC90cmlnb25vbWV0cnkuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJUcmlnb25vbWV0cnlcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL3R5cG9ncmFwaHkvYXR0cmlidXRlcy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvdHlwb2dyYXBoeS9hdHRyaWJ1dGVzLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy90eXBvZ3JhcGh5L2xvYWRpbmdfZGlzcGxheWluZy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvdHlwb2dyYXBoeS9sb2FkaW5nX2Rpc3BsYXlpbmcuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL3R5cG9ncmFwaHkvcDUuRm9udC5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvdHlwb2dyYXBoeS9wNS5Gb250LmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiRm9udFwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LkZvbnRcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7fSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy91dGlsaXRpZXMvYXJyYXlfZnVuY3Rpb25zLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy91dGlsaXRpZXMvYXJyYXlfZnVuY3Rpb25zLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiQXJyYXkgRnVuY3Rpb25zXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy91dGlsaXRpZXMvY29udmVyc2lvbi5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvdXRpbGl0aWVzL2NvbnZlcnNpb24uanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJDb252ZXJzaW9uXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy91dGlsaXRpZXMvc3RyaW5nX2Z1bmN0aW9ucy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvdXRpbGl0aWVzL3N0cmluZ19mdW5jdGlvbnMuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJTdHJpbmcgRnVuY3Rpb25zXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy91dGlsaXRpZXMvdGltZV9kYXRlLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy91dGlsaXRpZXMvdGltZV9kYXRlLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiVGltZSAmIERhdGVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL3dlYmdsL2NhbWVyYS5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvd2ViZ2wvY2FtZXJhLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiQ2FtZXJhXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy93ZWJnbC9pbnRlcmFjdGlvbi5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvd2ViZ2wvaW50ZXJhY3Rpb24uanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL3dlYmdsL2xpZ2h0LmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy93ZWJnbC9saWdodC5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkxpZ2h0c1wiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvd2ViZ2wvbG9hZGluZy5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvd2ViZ2wvbG9hZGluZy5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIjNEIE1vZGVsc1wiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvd2ViZ2wvbWF0ZXJpYWwuanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL3dlYmdsL21hdGVyaWFsLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiTWF0ZXJpYWxcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL3dlYmdsL3A1Lkdlb21ldHJ5LmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy93ZWJnbC9wNS5HZW9tZXRyeS5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1Lkdlb21ldHJ5XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge30sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvd2ViZ2wvcDUuTWF0cml4LmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy93ZWJnbC9wNS5NYXRyaXguanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5NYXRyaXhcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7fSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLkltbWVkaWF0ZS5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvd2ViZ2wvcDUuUmVuZGVyZXJHTC5JbW1lZGlhdGUuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7fSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLlJldGFpbmVkLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLlJldGFpbmVkLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge30sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvd2ViZ2wvcDUuUmVuZGVyZXJHTC5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvd2ViZ2wvcDUuUmVuZGVyZXJHTC5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LlJlbmRlcmVyR0xcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL3dlYmdsL3A1LlNoYWRlci5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvd2ViZ2wvcDUuU2hhZGVyLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiU2hhZGVyc1wiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LlNoYWRlclwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcmMvd2ViZ2wvcDUuVGV4dHVyZS5qc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcmMvd2ViZ2wvcDUuVGV4dHVyZS5qc1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LlRleHR1cmVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3JjL3dlYmdsL3ByaW1pdGl2ZXMuanNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjL3dlYmdsL3ByaW1pdGl2ZXMuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCIzRCBQcmltaXRpdmVzXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuZG9tXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuTWVkaWFFbGVtZW50XCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5GaWxlXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuZG9tXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5FbGVtZW50XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5zb3VuZFwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LlNvdW5kRmlsZVwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuQW1wbGl0dWRlXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5GRlRcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlNpZ25hbFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuT3NjaWxsYXRvclwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuU2luT3NjXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5UcmlPc2NcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlNhd09zY1wiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuU3FyT3NjXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5FbnZcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlB1bHNlXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5Ob2lzZVwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuQXVkaW9JblwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuRWZmZWN0XCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5GaWx0ZXJcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1Lkxvd1Bhc3NcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LkhpZ2hQYXNzXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5CYW5kUGFzc1wiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuRVFcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlBhbm5lcjNEXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5EZWxheVwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuUmV2ZXJiXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5Db252b2x2ZXJcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlBocmFzZVwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuUGFydFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuU2NvcmVcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlNvdW5kTG9vcFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuQ29tcHJlc3NvclwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuU291bmRSZWNvcmRlclwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuUGVha0RldGVjdFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuR2FpblwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuQXVkaW9Wb2ljZVwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuTW9ub1N5bnRoXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5Qb2x5U3ludGhcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LkRpc3RvcnRpb25cIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5zb3VuZFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcImxpYi9hZGRvbnMvcDUuc291bmQubWluLmpzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQubWluLmpzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge30sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJtb2R1bGVzXCI6IHtcbiAgICAgICAgXCJDb252ZXJzaW9uXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNvbnZlcnNpb25cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJDb2xvciBDb252ZXJzaW9uXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvY29udmVyc2lvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcIkNvbG9yIENvbnZlcnNpb25cIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQ29sb3IgQ29udmVyc2lvblwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29udmVyc2lvblwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9jb2xvcl9jb252ZXJzaW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiQ29sb3JcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJDcmVhdGluZyAmIFJlYWRpbmdcIjogMSxcbiAgICAgICAgICAgICAgICBcIlNldHRpbmdcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZWxlbWVudHNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuQ29sb3JcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL3A1LkNvbG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTZcbiAgICAgICAgfSxcbiAgICAgICAgXCJDcmVhdGluZyAmIFJlYWRpbmdcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQ3JlYXRpbmcgJiBSZWFkaW5nXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LkNvbG9yXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaXNfc3VibW9kdWxlXCI6IDEsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL3A1LkNvbG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTYsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIixcbiAgICAgICAgICAgICAgICBcImNvbnN0YW50c1wiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkVhY2ggY29sb3Igc3RvcmVzIHRoZSBjb2xvciBtb2RlIGFuZCBsZXZlbCBtYXhlcyB0aGF0IGFwcGxpZWQgYXQgdGhlXFxudGltZSBvZiBpdHMgY29uc3RydWN0aW9uLiBUaGVzZSBhcmUgdXNlZCB0byBpbnRlcnByZXQgdGhlIGlucHV0IGFyZ3VtZW50c1xcbihhdCBjb25zdHJ1Y3Rpb24gYW5kIGxhdGVyIGZvciB0aGF0IGluc3RhbmNlIG9mIGNvbG9yKSBhbmQgdG8gZm9ybWF0IHRoZVxcbm91dHB1dCBlLmcuIHdoZW4gc2F0dXJhdGlvbigpIGlzIHJlcXVlc3RlZC48L3A+XFxuPHA+SW50ZXJuYWxseSB3ZSBzdG9yZSBhbiBhcnJheSByZXByZXNlbnRpbmcgdGhlIGlkZWFsIFJHQkEgdmFsdWVzIGluIGZsb2F0aW5nXFxucG9pbnQgZm9ybSwgbm9ybWFsaXplZCBmcm9tIDAgdG8gMS4gRnJvbSB0aGlzIHdlIGNhbGN1bGF0ZSB0aGUgY2xvc2VzdFxcbnNjcmVlbiBjb2xvciAoUkdCQSBsZXZlbHMgZnJvbSAwIHRvIDI1NSkgYW5kIGV4cG9zZSB0aGlzIHRvIHRoZSByZW5kZXJlci48L3A+XFxuPHA+V2UgYWxzbyBjYWNoZSBub3JtYWxpemVkLCBmbG9hdGluZyBwb2ludCBjb21wb25lbnRzIG9mIHRoZSBjb2xvciBpbiB2YXJpb3VzXFxucmVwcmVzZW50YXRpb25zIGFzIHRoZXkgYXJlIGNhbGN1bGF0ZWQuIFRoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHJlcGVhdGluZyBhXFxuY29udmVyc2lvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkLjwvcD5cXG5cIlxuICAgICAgICB9LFxuICAgICAgICBcIlNldHRpbmdcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiU2V0dGluZ1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3Ivc2V0dGluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIixcbiAgICAgICAgICAgICAgICBcImNvbnN0YW50c1wiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiU2hhcGVcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCIyRCBQcmltaXRpdmVzXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJDdXJ2ZXNcIjogMSxcbiAgICAgICAgICAgICAgICBcIlZlcnRleFwiOiAxLFxuICAgICAgICAgICAgICAgIFwiM0QgTW9kZWxzXCI6IDEsXG4gICAgICAgICAgICAgICAgXCIzRCBQcmltaXRpdmVzXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAgXCIyRCBQcmltaXRpdmVzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIjJEIFByaW1pdGl2ZXNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZWxlbWVudHNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaXNfc3VibW9kdWxlXCI6IDEsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvMmRfcHJpbWl0aXZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIixcbiAgICAgICAgICAgICAgICBcImNvbnN0YW50c1wiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiQXR0cmlidXRlc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUeXBvZ3JhcGh5XCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvYXR0cmlidXRlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIixcbiAgICAgICAgICAgICAgICBcImNvbnN0YW50c1wiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiQ29uc3RhbnRzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJTdHJ1Y3R1cmVcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiU3RydWN0dXJlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb3JlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29uc3RhbnRzXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJDdXJ2ZXNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQ3VydmVzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2N1cnZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcIkVudmlyb25tZW50XCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkVudmlyb25tZW50XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkVudmlyb25tZW50XCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9lbnZpcm9ubWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIixcbiAgICAgICAgICAgICAgICBcImNvbnN0YW50c1wiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiRE9NXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkRPTVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5FbGVtZW50XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuRWxlbWVudFwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5CYXNlIGNsYXNzIGZvciBhbGwgZWxlbWVudHMgYWRkZWQgdG8gYSBza2V0Y2gsIGluY2x1ZGluZyBjYW52YXMsXFxuZ3JhcGhpY3MgYnVmZmVycywgYW5kIG90aGVyIEhUTUwgZWxlbWVudHMuIE1ldGhvZHMgaW4gYmx1ZSBhcmVcXG5pbmNsdWRlZCBpbiB0aGUgY29yZSBmdW5jdGlvbmFsaXR5LCBtZXRob2RzIGluIGJyb3duIGFyZSBhZGRlZFxcbndpdGggdGhlIDxhIGhyZWY9XFxcImh0dHA6Ly9wNWpzLm9yZy9yZWZlcmVuY2UvIy9saWJyYXJpZXMvcDUuZG9tXFxcIj5wNS5kb21cXG5saWJyYXJ5PC9hPi5cXG5JdCBpcyBub3QgY2FsbGVkIGRpcmVjdGx5LCBidXQgcDUuRWxlbWVudFxcbm9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgY2FsbGluZyBjcmVhdGVDYW52YXMsIGNyZWF0ZUdyYXBoaWNzLFxcbm9yIGluIHRoZSBwNS5kb20gbGlicmFyeSwgY3JlYXRlRGl2LCBjcmVhdGVJbWcsIGNyZWF0ZUlucHV0LCBldGMuPC9wPlxcblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiUmVuZGVyaW5nXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlJlbmRlcmluZ1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcInVuZGVmaW5lZFwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5SZW5kZXJlckdMXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5HcmFwaGljc1wiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuUmVuZGVyZXJcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDM5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoaW4gd3JhcHBlciBhcm91bmQgYSByZW5kZXJlciwgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgYVxcbmdyYXBoaWNzIGJ1ZmZlciBvYmplY3QuIFVzZSB0aGlzIGNsYXNzIGlmIHlvdSBuZWVkXFxudG8gZHJhdyBpbnRvIGFuIG9mZi1zY3JlZW4gZ3JhcGhpY3MgYnVmZmVyLiBUaGUgdHdvIHBhcmFtZXRlcnMgZGVmaW5lIHRoZVxcbndpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIGZvciB0aGlzIGNsYXNzIGFyZVxcbmV4dGVuc2l2ZSwgYnV0IG1pcnJvciB0aGUgbm9ybWFsIGRyYXdpbmcgQVBJIGZvciBwNS48L3A+XFxuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJUcmFuc2Zvcm1cIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiVHJhbnNmb3JtXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlRyYW5zZm9ybVwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvdHJhbnNmb3JtLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiLFxuICAgICAgICAgICAgICAgIFwiY29uc3RhbnRzXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJWZXJ0ZXhcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiVmVydGV4XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3ZlcnRleC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIixcbiAgICAgICAgICAgICAgICBcImNvbnN0YW50c1wiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiRGF0YVwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiRGljdGlvbmFyeVwiOiAxLFxuICAgICAgICAgICAgICAgIFwiQXJyYXkgRnVuY3Rpb25zXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJTdHJpbmcgRnVuY3Rpb25zXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LlR5cGVkRGljdFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuU3RyaW5nRGljdFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuTnVtYmVyRGljdFwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LlR5cGVkRGljdFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQwN1xuICAgICAgICB9LFxuICAgICAgICBcIkRpY3Rpb25hcnlcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5UeXBlZERpY3RcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlN0cmluZ0RpY3RcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1Lk51bWJlckRpY3RcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5UeXBlZERpY3RcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDA3LFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXFxuXFxuVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgcDUgbWV0aG9kcyBmb3IgdGhlIHA1IERpY3Rpb25hcnkgY2xhc3Nlc1xcbnRoZXNlIGNsYXNzZXMgU3RyaW5nRGljdCBhbmQgTnVtYmVyRGljdCBhcmUgZm9yIHN0b3JpbmcgYW5kIHdvcmtpbmdcXG53aXRoIGtleVwiLFxuICAgICAgICAgICAgICAgIFwidmFsdWUgcGFpcnNcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5CYXNlIGNsYXNzIGZvciBhbGwgcDUuRGljdGlvbmFyeSB0eXBlcy4gTW9yZSBzcGVjaWZpY2FsbHlcXG4gdHlwZWQgRGljdGlvbmFyeSBvYmplY3RzIGluaGVyaXQgZnJvbSB0aGlzPC9wPlxcblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiRXZlbnRzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkFjY2VsZXJhdGlvblwiOiAxLFxuICAgICAgICAgICAgICAgIFwiS2V5Ym9hcmRcIjogMSxcbiAgICAgICAgICAgICAgICBcIk1vdXNlXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJUb3VjaFwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwiQWNjZWxlcmF0aW9uXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFjY2VsZXJhdGlvblwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9hY2NlbGVyYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxLFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJLZXlib2FyZFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJLZXlib2FyZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9rZXlib2FyZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcIk1vdXNlXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIk1vdXNlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiLFxuICAgICAgICAgICAgICAgIFwiY29uc3RhbnRzXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJUb3VjaFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJUb3VjaFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy90b3VjaC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcIkltYWdlXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiUGl4ZWxzXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LkltYWdlXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9wNS5JbWFnZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIzLFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhIG5ldyBwNS5JbWFnZS4gQSBwNS5JbWFnZSBpcyBhIGNhbnZhcyBiYWNrZWQgcmVwcmVzZW50YXRpb24gb2YgYW5cXG5pbWFnZS5cXG48YnI+PGJyPlxcbnA1IGNhbiBkaXNwbGF5IC5naWYsIC5qcGcgYW5kIC5wbmcgaW1hZ2VzLiBJbWFnZXMgbWF5IGJlIGRpc3BsYXllZFxcbmluIDJEIGFuZCAzRCBzcGFjZS4gQmVmb3JlIGFuIGltYWdlIGlzIHVzZWQsIGl0IG11c3QgYmUgbG9hZGVkIHdpdGggdGhlXFxubG9hZEltYWdlKCkgZnVuY3Rpb24uIFRoZSBwNS5JbWFnZSBjbGFzcyBjb250YWlucyBmaWVsZHMgZm9yIHRoZSB3aWR0aCBhbmRcXG5oZWlnaHQgb2YgdGhlIGltYWdlLCBhcyB3ZWxsIGFzIGFuIGFycmF5IGNhbGxlZCBwaXhlbHNbXSB0aGF0IGNvbnRhaW5zIHRoZVxcbnZhbHVlcyBmb3IgZXZlcnkgcGl4ZWwgaW4gdGhlIGltYWdlLlxcbjxicj48YnI+XFxuVGhlIG1ldGhvZHMgZGVzY3JpYmVkIGJlbG93IGFsbG93IGVhc3kgYWNjZXNzIHRvIHRoZSBpbWFnZSYjMzk7cyBwaXhlbHMgYW5kXFxuYWxwaGEgY2hhbm5lbCBhbmQgc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgY29tcG9zaXRpbmcuXFxuPGJyPjxicj5cXG5CZWZvcmUgdXNpbmcgdGhlIHBpeGVsc1tdIGFycmF5LCBiZSBzdXJlIHRvIHVzZSB0aGUgbG9hZFBpeGVscygpIG1ldGhvZCBvblxcbnRoZSBpbWFnZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcGl4ZWwgZGF0YSBpcyBwcm9wZXJseSBsb2FkZWQuPC9wPlxcblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiTG9hZGluZyAmIERpc3BsYXlpbmdcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiTG9hZGluZyAmIERpc3BsYXlpbmdcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZWxlbWVudHNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaXNfc3VibW9kdWxlXCI6IDEsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlR5cG9ncmFwaHlcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvbG9hZGluZ19kaXNwbGF5aW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiUGl4ZWxzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlBpeGVsc1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvcGl4ZWxzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiSU9cIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJTdHJ1Y3R1cmVcIjogMSxcbiAgICAgICAgICAgICAgICBcIklucHV0XCI6IDEsXG4gICAgICAgICAgICAgICAgXCJPdXRwdXRcIjogMSxcbiAgICAgICAgICAgICAgICBcIlRhYmxlXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJYTUxcIjogMSxcbiAgICAgICAgICAgICAgICBcIlRpbWUgJiBEYXRlXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5QcmludFdyaXRlclwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuVGFibGVcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlRhYmxlUm93XCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5YTUxcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlhNTC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExXG4gICAgICAgIH0sXG4gICAgICAgIFwiSW5wdXRcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiSW5wdXRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZWxlbWVudHNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaXNfc3VibW9kdWxlXCI6IDEsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL2ZpbGVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiT3V0cHV0XCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIk91dHB1dFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuUHJpbnRXcml0ZXJcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vZmlsZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTY5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoaXMgaXMgdGhlIHA1IGluc3RhbmNlIGNvbnN0cnVjdG9yLjwvcD5cXG48cD5BIHA1IGluc3RhbmNlIGhvbGRzIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcyByZWxhdGVkIHRvXFxuYSBwNSBza2V0Y2guICBJdCBleHBlY3RzIGFuIGluY29taW5nIHNrZXRjaCBjbG9zdXJlIGFuZCBpdCBjYW4gYWxzb1xcbnRha2UgYW4gb3B0aW9uYWwgbm9kZSBwYXJhbWV0ZXIgZm9yIGF0dGFjaGluZyB0aGUgZ2VuZXJhdGVkIHA1IGNhbnZhc1xcbnRvIGEgbm9kZS4gIFRoZSBza2V0Y2ggY2xvc3VyZSB0YWtlcyB0aGUgbmV3bHkgY3JlYXRlZCBwNSBpbnN0YW5jZSBhc1xcbml0cyBzb2xlIGFyZ3VtZW50IGFuZCBtYXkgb3B0aW9uYWxseSBzZXQgcHJlbG9hZCgpLCBzZXR1cCgpLCBhbmQvb3JcXG5kcmF3KCkgcHJvcGVydGllcyBvbiBpdCBmb3IgcnVubmluZyBhIHNrZXRjaC48L3A+XFxuPHA+QSBwNSBza2V0Y2ggY2FuIHJ1biBpbiAmcXVvdDtnbG9iYWwmcXVvdDsgb3IgJnF1b3Q7aW5zdGFuY2UmcXVvdDsgbW9kZTpcXG4mcXVvdDtnbG9iYWwmcXVvdDsgICAtIGFsbCBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGFyZSBhdHRhY2hlZCB0byB0aGUgd2luZG93XFxuJnF1b3Q7aW5zdGFuY2UmcXVvdDsgLSBhbGwgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBhcmUgYm91bmQgdG8gdGhpcyBwNSBvYmplY3Q8L3A+XFxuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJUYWJsZVwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJUYWJsZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5UYWJsZVwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuVGFibGVSb3dcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7fSxcbiAgICAgICAgICAgIFwiaXNfc3VibW9kdWxlXCI6IDEsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlUm93LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UYWJsZSBvYmplY3RzIHN0b3JlIGRhdGEgd2l0aCBtdWx0aXBsZSByb3dzIGFuZCBjb2x1bW5zLCBtdWNoXFxubGlrZSBpbiBhIHRyYWRpdGlvbmFsIHNwcmVhZHNoZWV0LiBUYWJsZXMgY2FuIGJlIGdlbmVyYXRlZCBmcm9tXFxuc2NyYXRjaCwgZHluYW1pY2FsbHksIG9yIHVzaW5nIGRhdGEgZnJvbSBhbiBleGlzdGluZyBmaWxlLjwvcD5cXG5cIlxuICAgICAgICB9LFxuICAgICAgICBcIlhNTFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJYTUxcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZWxlbWVudHNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuWE1MXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge30sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5YTUwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlhNTCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIFhNTCBvYmplY3QsIGFibGUgdG8gcGFyc2UgWE1MIGNvZGUuIFVzZVxcbmxvYWRYTUwoKSB0byBsb2FkIGV4dGVybmFsIFhNTCBmaWxlcyBhbmQgY3JlYXRlIFhNTCBvYmplY3RzLjwvcD5cXG5cIlxuICAgICAgICB9LFxuICAgICAgICBcIk1hdGhcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIkNhbGN1bGF0aW9uXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJOb2lzZVwiOiAxLFxuICAgICAgICAgICAgICAgIFwiUmFuZG9tXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJUcmlnb25vbWV0cnlcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZWxlbWVudHNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuVmVjdG9yXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTIsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BIGNsYXNzIHRvIGRlc2NyaWJlIGEgdHdvIG9yIHRocmVlIGRpbWVuc2lvbmFsIHZlY3Rvciwgc3BlY2lmaWNhbGx5XFxuYSBFdWNsaWRlYW4gKGFsc28ga25vd24gYXMgZ2VvbWV0cmljKSB2ZWN0b3IuIEEgdmVjdG9yIGlzIGFuIGVudGl0eVxcbnRoYXQgaGFzIGJvdGggbWFnbml0dWRlIGFuZCBkaXJlY3Rpb24uIFRoZSBkYXRhdHlwZSwgaG93ZXZlciwgc3RvcmVzXFxudGhlIGNvbXBvbmVudHMgb2YgdGhlIHZlY3RvciAoeCwgeSBmb3IgMkQsIGFuZCB4LCB5LCB6IGZvciAzRCkuIFRoZSBtYWduaXR1ZGVcXG5hbmQgZGlyZWN0aW9uIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG1ldGhvZHMgbWFnKCkgYW5kIGhlYWRpbmcoKS5cXG48YnI+PGJyPlxcbkluIG1hbnkgb2YgdGhlIHA1LmpzIGV4YW1wbGVzLCB5b3Ugd2lsbCBzZWUgcDUuVmVjdG9yIHVzZWQgdG8gZGVzY3JpYmUgYVxcbnBvc2l0aW9uLCB2ZWxvY2l0eSwgb3IgYWNjZWxlcmF0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91IGNvbnNpZGVyIGEgcmVjdGFuZ2xlXFxubW92aW5nIGFjcm9zcyB0aGUgc2NyZWVuLCBhdCBhbnkgZ2l2ZW4gaW5zdGFudCBpdCBoYXMgYSBwb3NpdGlvbiAoYSB2ZWN0b3JcXG50aGF0IHBvaW50cyBmcm9tIHRoZSBvcmlnaW4gdG8gaXRzIGxvY2F0aW9uKSwgYSB2ZWxvY2l0eSAodGhlIHJhdGUgYXQgd2hpY2hcXG50aGUgb2JqZWN0JiMzOTtzIHBvc2l0aW9uIGNoYW5nZXMgcGVyIHRpbWUgdW5pdCwgZXhwcmVzc2VkIGFzIGEgdmVjdG9yKSwgYW5kXFxuYWNjZWxlcmF0aW9uICh0aGUgcmF0ZSBhdCB3aGljaCB0aGUgb2JqZWN0JiMzOTtzIHZlbG9jaXR5IGNoYW5nZXMgcGVyIHRpbWVcXG51bml0LCBleHByZXNzZWQgYXMgYSB2ZWN0b3IpLlxcbjxicj48YnI+XFxuU2luY2UgdmVjdG9ycyByZXByZXNlbnQgZ3JvdXBpbmdzIG9mIHZhbHVlcywgd2UgY2Fubm90IHNpbXBseSB1c2VcXG50cmFkaXRpb25hbCBhZGRpdGlvbi9tdWx0aXBsaWNhdGlvbi9ldGMuIEluc3RlYWQsIHdlJiMzOTtsbCBuZWVkIHRvIGRvIHNvbWVcXG4mcXVvdDt2ZWN0b3ImcXVvdDsgbWF0aCwgd2hpY2ggaXMgbWFkZSBlYXN5IGJ5IHRoZSBtZXRob2RzIGluc2lkZSB0aGUgcDUuVmVjdG9yIGNsYXNzLjwvcD5cXG5cIlxuICAgICAgICB9LFxuICAgICAgICBcIkNhbGN1bGF0aW9uXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhbGN1bGF0aW9uXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvY2FsY3VsYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxLFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJOb2lzZVwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJOb2lzZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL25vaXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTQsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcIlJhbmRvbVwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJSYW5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZWxlbWVudHNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaXNfc3VibW9kdWxlXCI6IDEsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9yYW5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxLFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJUcmlnb25vbWV0cnlcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiVHJpZ29ub21ldHJ5XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvdHJpZ29ub21ldHJ5LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiLFxuICAgICAgICAgICAgICAgIFwiY29uc3RhbnRzXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJUeXBvZ3JhcGh5XCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlR5cG9ncmFwaHlcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJBdHRyaWJ1dGVzXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJMb2FkaW5nICYgRGlzcGxheWluZ1wiOiAxLFxuICAgICAgICAgICAgICAgIFwiRm9udFwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5Gb250XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy90eXBvZ3JhcGh5L3A1LkZvbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMVxuICAgICAgICB9LFxuICAgICAgICBcIkZvbnRcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRm9udFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5Gb250XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge30sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUeXBvZ3JhcGh5XCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3R5cG9ncmFwaHkvcDUuRm9udC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIHA1LkZvbnQgY2xhc3MgYW5kIGZ1bmN0aW9ucyBmb3JcXG5kcmF3aW5nIHRleHQgdG8gdGhlIGRpc3BsYXkgY2FudmFzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiLFxuICAgICAgICAgICAgICAgIFwiY29uc3RhbnRzXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJBcnJheSBGdW5jdGlvbnNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXJyYXkgRnVuY3Rpb25zXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9hcnJheV9mdW5jdGlvbnMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxLFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJTdHJpbmcgRnVuY3Rpb25zXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlN0cmluZyBGdW5jdGlvbnNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZWxlbWVudHNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaXNfc3VibW9kdWxlXCI6IDEsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdXRpbGl0aWVzL3N0cmluZ19mdW5jdGlvbnMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxLFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJUaW1lICYgRGF0ZVwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJUaW1lICYgRGF0ZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdXRpbGl0aWVzL3RpbWVfZGF0ZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcIkxpZ2h0cywgQ2FtZXJhXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkxpZ2h0cywgQ2FtZXJhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiQ2FtZXJhXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJMaWdodHNcIjogMSxcbiAgICAgICAgICAgICAgICBcIk1hdGVyaWFsXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJTaGFkZXJzXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1Lkdlb21ldHJ5XCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5NYXRyaXhcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlNoYWRlclwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuVGV4dHVyZVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcDUuVGV4dHVyZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEzXG4gICAgICAgIH0sXG4gICAgICAgIFwiQ2FtZXJhXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhbWVyYVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvY2FtZXJhLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiTGlnaHRzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkxpZ2h0c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvbGlnaHQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxLFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCIzRCBNb2RlbHNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiM0QgTW9kZWxzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlzX3N1Ym1vZHVsZVwiOiAxLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy93ZWJnbC9sb2FkaW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMSxcbiAgICAgICAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiY29yZVwiLFxuICAgICAgICAgICAgICAgIFwicDUuR2VvbWV0cnlcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcIk1hdGVyaWFsXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIk1hdGVyaWFsXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LlRleHR1cmVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcDUuVGV4dHVyZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEzLFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgcDUuVGV4dHVyZSBjbGFzczwvcD5cXG5cIlxuICAgICAgICB9LFxuICAgICAgICBcIlNoYWRlcnNcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiU2hhZGVyc1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5TaGFkZXJcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9yc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpc19zdWJtb2R1bGVcIjogMSxcbiAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcDUuU2hhZGVyLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgcDUuU2hhZGVyIGNsYXNzPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCIzRCBQcmltaXRpdmVzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIjNEIFByaW1pdGl2ZXNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZWxlbWVudHNcIjoge30sXG4gICAgICAgICAgICBcImNsYXNzZXNcIjoge30sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDVcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaXNfc3VibW9kdWxlXCI6IDEsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL3ByaW1pdGl2ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxLFxuICAgICAgICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJjb3JlXCIsXG4gICAgICAgICAgICAgICAgXCJwNS5HZW9tZXRyeVwiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwicDUuZG9tXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVzXCI6IHt9LFxuICAgICAgICAgICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICAgICAgICAgIFwiY2xhc3Nlc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJwNS5kb21cIjogMSxcbiAgICAgICAgICAgICAgICBcInA1Lk1lZGlhRWxlbWVudFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuRmlsZVwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LmRvbVwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuRWxlbWVudFwiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjg4NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD48cD5UaGUgd2ViIGlzIG11Y2ggbW9yZSB0aGFuIGp1c3QgY2FudmFzIGFuZCBwNS5kb20gbWFrZXMgaXQgZWFzeSB0byBpbnRlcmFjdFxcbndpdGggb3RoZXIgSFRNTDUgb2JqZWN0cywgaW5jbHVkaW5nIHRleHQsIGh5cGVybGluaywgaW1hZ2UsIGlucHV0LCB2aWRlbyxcXG5hdWRpbywgYW5kIHdlYmNhbS48L3A+PC9wPlxcbjxwPjxwPlRoZXJlIGlzIGEgc2V0IG9mIGNyZWF0aW9uIG1ldGhvZHMsIERPTSBtYW5pcHVsYXRpb24gbWV0aG9kcywgYW5kXFxuYW4gZXh0ZW5kZWQgcDUuRWxlbWVudCB0aGF0IHN1cHBvcnRzIGEgcmFuZ2Ugb2YgSFRNTCBlbGVtZW50cy4gU2VlIHRoZVxcbjxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzL3dpa2kvQmV5b25kLXRoZS1jYW52YXMnPlxcbmJleW9uZCB0aGUgY2FudmFzIHR1dG9yaWFsPC9hPiBmb3IgYSBmdWxsIG92ZXJ2aWV3IG9mIGhvdyB0aGlzIGFkZG9uIHdvcmtzLjwvcD5cXG48cD48cD5NZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHNob3duIGluIGJsYWNrIGFyZSBwYXJ0IG9mIHRoZSBwNS5qcyBjb3JlLCBpdGVtcyBpblxcbmJsdWUgYXJlIHBhcnQgb2YgdGhlIHA1LmRvbSBsaWJyYXJ5LiBZb3Ugd2lsbCBuZWVkIHRvIGluY2x1ZGUgYW4gZXh0cmEgZmlsZVxcbmluIG9yZGVyIHRvIGFjY2VzcyB0aGUgYmx1ZSBmdW5jdGlvbnMuIFNlZSB0aGVcXG48YSBocmVmPSdodHRwOi8vcDVqcy5vcmcvbGlicmFyaWVzLyN1c2luZy1hLWxpYnJhcnknPnVzaW5nIGEgbGlicmFyeTwvYT5cXG5zZWN0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaW5jbHVkZSB0aGlzIGxpYnJhcnkuIHA1LmRvbSBjb21lcyB3aXRoXFxuPGEgaHJlZj0naHR0cDovL3A1anMub3JnL2Rvd25sb2FkJz5wNSBjb21wbGV0ZTwvYT4gb3IgeW91IGNhbiBkb3dubG9hZCB0aGUgc2luZ2xlIGZpbGVcXG48YSBocmVmPSdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbG1jY2FydC9wNS5qcy9tYXN0ZXIvbGliL2FkZG9ucy9wNS5kb20uanMnPlxcbmhlcmU8L2E+LjwvcD48L3A+XFxuPHA+PHA+U2VlIDxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzL3dpa2kvQmV5b25kLXRoZS1jYW52YXMnPnR1dG9yaWFsOiBiZXlvbmQgdGhlIGNhbnZhczwvYT5cXG5mb3IgbW9yZSBpbmZvIG9uIGhvdyB0byB1c2UgdGhpcyBsaWJhcnkuPC9hPjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwidGFnXCI6IFwibWFpblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1haW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInA1LnNvdW5kXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZXNcIjoge30sXG4gICAgICAgICAgICBcImVsZW1lbnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgICAgICAgICBcInA1LnNvdW5kXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5Tb3VuZEZpbGVcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LkFtcGxpdHVkZVwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuRkZUXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5TaWduYWxcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1Lk9zY2lsbGF0b3JcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlNpbk9zY1wiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuVHJpT3NjXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5TYXdPc2NcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlNxck9zY1wiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuRW52XCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5QdWxzZVwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuTm9pc2VcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LkF1ZGlvSW5cIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LkVmZmVjdFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuRmlsdGVyXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5Mb3dQYXNzXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5IaWdoUGFzc1wiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuQmFuZFBhc3NcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LkVRXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5QYW5uZXIzRFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuRGVsYXlcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlJldmVyYlwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuQ29udm9sdmVyXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5QaHJhc2VcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlBhcnRcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlNjb3JlXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5Tb3VuZExvb3BcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LkNvbXByZXNzb3JcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlNvdW5kUmVjb3JkZXJcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LlBlYWtEZXRlY3RcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LkdhaW5cIjogMSxcbiAgICAgICAgICAgICAgICBcInA1LkF1ZGlvVm9pY2VcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1Lk1vbm9TeW50aFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicDUuUG9seVN5bnRoXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJwNS5EaXN0b3J0aW9uXCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcnNcIjoge1xuICAgICAgICAgICAgICAgIFwicDUuc291bmRcIjogMSxcbiAgICAgICAgICAgICAgICBcInA1XCI6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZXNcIjoge30sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTIyNDMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cDUuc291bmQgZXh0ZW5kcyBwNSB3aXRoIDxhIGhyZWY9XFxcImh0dHA6Ly9jYW5pdXNlLmNvbS9hdWRpby1hcGlcXFwiXFxudGFyZ2V0PVxcXCJfYmxhbmtcXFwiPldlYiBBdWRpbzwvYT4gZnVuY3Rpb25hbGl0eSBpbmNsdWRpbmcgYXVkaW8gaW5wdXQsXFxucGxheWJhY2ssIGFuYWx5c2lzIGFuZCBzeW50aGVzaXMuXFxuPGJyLz48YnIvPlxcbjxhIGhyZWY9XFxcIiMvcDUuU291bmRGaWxlXFxcIj48Yj5wNS5Tb3VuZEZpbGU8L2I+PC9hPjogTG9hZCBhbmQgcGxheSBzb3VuZCBmaWxlcy48YnIvPlxcbjxhIGhyZWY9XFxcIiMvcDUuQW1wbGl0dWRlXFxcIj48Yj5wNS5BbXBsaXR1ZGU8L2I+PC9hPjogR2V0IHRoZSBjdXJyZW50IHZvbHVtZSBvZiBhIHNvdW5kLjxici8+XFxuPGEgaHJlZj1cXFwiIy9wNS5BdWRpb0luXFxcIj48Yj5wNS5BdWRpb0luPC9iPjwvYT46IEdldCBzb3VuZCBmcm9tIGFuIGlucHV0IHNvdXJjZSwgdHlwaWNhbGx5XFxuICBhIGNvbXB1dGVyIG1pY3JvcGhvbmUuPGJyLz5cXG48YSBocmVmPVxcXCIjL3A1LkZGVFxcXCI+PGI+cDUuRkZUPC9iPjwvYT46IEFuYWx5emUgdGhlIGZyZXF1ZW5jeSBvZiBzb3VuZC4gUmV0dXJuc1xcbiAgcmVzdWx0cyBmcm9tIHRoZSBmcmVxdWVuY3kgc3BlY3RydW0gb3IgdGltZSBkb21haW4gKHdhdmVmb3JtKS48YnIvPlxcbjxhIGhyZWY9XFxcIiMvcDUuT3NjaWxsYXRvclxcXCI+PGI+cDUuT3NjaWxsYXRvcjwvYj48L2E+OiBHZW5lcmF0ZSBTaW5lLFxcbiAgVHJpYW5nbGUsIFNxdWFyZSBhbmQgU2F3dG9vdGggd2F2ZWZvcm1zLiBCYXNlIGNsYXNzIG9mXFxuICA8YSBocmVmPVxcXCIjL3A1Lk5vaXNlXFxcIj5wNS5Ob2lzZTwvYT4gYW5kIDxhIGhyZWY9XFxcIiMvcDUuUHVsc2VcXFwiPnA1LlB1bHNlPC9hPi5cXG4gIDxici8+XFxuPGEgaHJlZj1cXFwiIy9wNS5FbnZcXFwiPjxiPnA1LkVudjwvYj48L2E+OiBBbiBFbnZlbG9wZSBpcyBhIHNlcmllc1xcbiAgb2YgZmFkZXMgb3ZlciB0aW1lLiBPZnRlbiB1c2VkIHRvIGNvbnRyb2wgYW4gb2JqZWN0JiMzOTtzXFxuICBvdXRwdXQgZ2FpbiBsZXZlbCBhcyBhbiAmcXVvdDtBRFNSIEVudmVsb3BlJnF1b3Q7IChBdHRhY2ssIERlY2F5LFxcbiAgU3VzdGFpbiwgUmVsZWFzZSkuIENhbiBhbHNvIG1vZHVsYXRlIG90aGVyIHBhcmFtZXRlcnMuPGJyLz5cXG48YSBocmVmPVxcXCIjL3A1LkRlbGF5XFxcIj48Yj5wNS5EZWxheTwvYj48L2E+OiBBIGRlbGF5IGVmZmVjdCB3aXRoXFxuICBwYXJhbWV0ZXJzIGZvciBmZWVkYmFjaywgZGVsYXlUaW1lLCBhbmQgbG93cGFzcyBmaWx0ZXIuPGJyLz5cXG48YSBocmVmPVxcXCIjL3A1LkZpbHRlclxcXCI+PGI+cDUuRmlsdGVyPC9iPjwvYT46IEZpbHRlciB0aGUgZnJlcXVlbmN5IHJhbmdlIG9mIGFcXG4gIHNvdW5kLlxcbjxici8+XFxuPGEgaHJlZj1cXFwiIy9wNS5SZXZlcmJcXFwiPjxiPnA1LlJldmVyYjwvYj48L2E+OiBBZGQgcmV2ZXJiIHRvIGEgc291bmQgYnkgc3BlY2lmeWluZ1xcbiAgZHVyYXRpb24gYW5kIGRlY2F5LiA8YnIvPlxcbjxiPjxhIGhyZWY9XFxcIiMvcDUuQ29udm9sdmVyXFxcIj5wNS5Db252b2x2ZXI8L2E+OjwvYj4gRXh0ZW5kc1xcbjxhIGhyZWY9XFxcIiMvcDUuUmV2ZXJiXFxcIj5wNS5SZXZlcmI8L2E+IHRvIHNpbXVsYXRlIHRoZSBzb3VuZCBvZiByZWFsXFxuICBwaHlzaWNhbCBzcGFjZXMgdGhyb3VnaCBjb252b2x1dGlvbi48YnIvPlxcbjxiPjxhIGhyZWY9XFxcIiMvcDUuU291bmRSZWNvcmRlclxcXCI+cDUuU291bmRSZWNvcmRlcjwvYT48L2I+OiBSZWNvcmQgc291bmQgZm9yIHBsYXliYWNrXFxuICAvIHNhdmUgdGhlIC53YXYgZmlsZS5cXG48Yj48YSBocmVmPVxcXCIjL3A1LlBocmFzZVxcXCI+cDUuUGhyYXNlPC9hPjwvYj4sIDxiPjxhIGhyZWY9XFxcIiMvcDUuUGFydFxcXCI+cDUuUGFydDwvYT48L2I+IGFuZFxcbjxiPjxhIGhyZWY9XFxcIiMvcDUuU2NvcmVcXFwiPnA1LlNjb3JlPC9hPjwvYj46IENvbXBvc2UgbXVzaWNhbCBzZXF1ZW5jZXMuXFxuPGJyLz48YnIvPlxcbnA1LnNvdW5kIGlzIG9uIDxhIGhyZWY9XFxcImh0dHBzOi8vZ2l0aHViLmNvbS90aGVyZXdhc2FndXkvcDUuc291bmQvXFxcIj5HaXRIdWI8L2E+LlxcbkRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvblxcbjxhIGhyZWY9XFxcImh0dHBzOi8vZ2l0aHViLmNvbS90aGVyZXdhc2FndXkvcDUuc291bmQvYmxvYi9tYXN0ZXIvbGliL3A1LnNvdW5kLmpzXFxcIj5oZXJlPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcInRhZ1wiOiBcIm1haW5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtYWluXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJjbGFzc2VzXCI6IHtcbiAgICAgICAgXCJwNVwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJPdXRwdXRcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb3JlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhpcyBpcyB0aGUgcDUgaW5zdGFuY2UgY29uc3RydWN0b3IuPC9wPlxcbjxwPkEgcDUgaW5zdGFuY2UgaG9sZHMgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHJlbGF0ZWQgdG9cXG5hIHA1IHNrZXRjaC4gIEl0IGV4cGVjdHMgYW4gaW5jb21pbmcgc2tldGNoIGNsb3N1cmUgYW5kIGl0IGNhbiBhbHNvXFxudGFrZSBhbiBvcHRpb25hbCBub2RlIHBhcmFtZXRlciBmb3IgYXR0YWNoaW5nIHRoZSBnZW5lcmF0ZWQgcDUgY2FudmFzXFxudG8gYSBub2RlLiAgVGhlIHNrZXRjaCBjbG9zdXJlIHRha2VzIHRoZSBuZXdseSBjcmVhdGVkIHA1IGluc3RhbmNlIGFzXFxuaXRzIHNvbGUgYXJndW1lbnQgYW5kIG1heSBvcHRpb25hbGx5IHNldCBwcmVsb2FkKCksIHNldHVwKCksIGFuZC9vclxcbmRyYXcoKSBwcm9wZXJ0aWVzIG9uIGl0IGZvciBydW5uaW5nIGEgc2tldGNoLjwvcD5cXG48cD5BIHA1IHNrZXRjaCBjYW4gcnVuIGluICZxdW90O2dsb2JhbCZxdW90OyBvciAmcXVvdDtpbnN0YW5jZSZxdW90OyBtb2RlOlxcbiZxdW90O2dsb2JhbCZxdW90OyAgIC0gYWxsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgYXJlIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3dcXG4mcXVvdDtpbnN0YW5jZSZxdW90OyAtIGFsbCBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGFyZSBib3VuZCB0byB0aGlzIHA1IG9iamVjdDwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNrZXRjaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YSBjbG9zdXJlIHRoYXQgY2FuIHNldCBvcHRpb25hbCBwcmVsb2FkKCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cCgpLCBhbmQvb3IgZHJhdygpIHByb3BlcnRpZXMgb24gdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBwNSBpbnN0YW5jZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJub2RlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5lbGVtZW50IHRvIGF0dGFjaCBjYW52YXMgdG8sIGlmIGFcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpcyBwYXNzZWQgaW4gdXNlIGl0IGFzIHN5bmM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkhUTUxFbGVtZW50fEJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN5bmNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnN0YXJ0IHN5bmNocm9ub3VzbHkgKG9wdGlvbmFsKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhIHA1IGluc3RhbmNlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUDVcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInA1LkNvbG9yXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LkNvbG9yXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LkNvbG9yXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNyZWF0aW5nICYgUmVhZGluZ1wiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9wNS5Db2xvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkVhY2ggY29sb3Igc3RvcmVzIHRoZSBjb2xvciBtb2RlIGFuZCBsZXZlbCBtYXhlcyB0aGF0IGFwcGxpZWQgYXQgdGhlXFxudGltZSBvZiBpdHMgY29uc3RydWN0aW9uLiBUaGVzZSBhcmUgdXNlZCB0byBpbnRlcnByZXQgdGhlIGlucHV0IGFyZ3VtZW50c1xcbihhdCBjb25zdHJ1Y3Rpb24gYW5kIGxhdGVyIGZvciB0aGF0IGluc3RhbmNlIG9mIGNvbG9yKSBhbmQgdG8gZm9ybWF0IHRoZVxcbm91dHB1dCBlLmcuIHdoZW4gc2F0dXJhdGlvbigpIGlzIHJlcXVlc3RlZC48L3A+XFxuPHA+SW50ZXJuYWxseSB3ZSBzdG9yZSBhbiBhcnJheSByZXByZXNlbnRpbmcgdGhlIGlkZWFsIFJHQkEgdmFsdWVzIGluIGZsb2F0aW5nXFxucG9pbnQgZm9ybSwgbm9ybWFsaXplZCBmcm9tIDAgdG8gMS4gRnJvbSB0aGlzIHdlIGNhbGN1bGF0ZSB0aGUgY2xvc2VzdFxcbnNjcmVlbiBjb2xvciAoUkdCQSBsZXZlbHMgZnJvbSAwIHRvIDI1NSkgYW5kIGV4cG9zZSB0aGlzIHRvIHRoZSByZW5kZXJlci48L3A+XFxuPHA+V2UgYWxzbyBjYWNoZSBub3JtYWxpemVkLCBmbG9hdGluZyBwb2ludCBjb21wb25lbnRzIG9mIHRoZSBjb2xvciBpbiB2YXJpb3VzXFxucmVwcmVzZW50YXRpb25zIGFzIHRoZXkgYXJlIGNhbGN1bGF0ZWQuIFRoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHJlcGVhdGluZyBhXFxuY29udmVyc2lvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkLjwvcD5cXG5cIlxuICAgICAgICB9LFxuICAgICAgICBcInA1LkVsZW1lbnRcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRPTVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9wNS5FbGVtZW50LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QmFzZSBjbGFzcyBmb3IgYWxsIGVsZW1lbnRzIGFkZGVkIHRvIGEgc2tldGNoLCBpbmNsdWRpbmcgY2FudmFzLFxcbmdyYXBoaWNzIGJ1ZmZlcnMsIGFuZCBvdGhlciBIVE1MIGVsZW1lbnRzLiBNZXRob2RzIGluIGJsdWUgYXJlXFxuaW5jbHVkZWQgaW4gdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSwgbWV0aG9kcyBpbiBicm93biBhcmUgYWRkZWRcXG53aXRoIHRoZSA8YSBocmVmPVxcXCJodHRwOi8vcDVqcy5vcmcvcmVmZXJlbmNlLyMvbGlicmFyaWVzL3A1LmRvbVxcXCI+cDUuZG9tXFxubGlicmFyeTwvYT4uXFxuSXQgaXMgbm90IGNhbGxlZCBkaXJlY3RseSwgYnV0IHA1LkVsZW1lbnRcXG5vYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGNhbGxpbmcgY3JlYXRlQ2FudmFzLCBjcmVhdGVHcmFwaGljcyxcXG5vciBpbiB0aGUgcDUuZG9tIGxpYnJhcnksIGNyZWF0ZURpdiwgY3JlYXRlSW1nLCBjcmVhdGVJbnB1dCwgZXRjLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImVsdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RE9NIG5vZGUgdGhhdCBpcyB3cmFwcGVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwSW5zdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cG9pbnRlciB0byBwNSBpbnN0YW5jZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUDVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LkdyYXBoaWNzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LkdyYXBoaWNzXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LkdyYXBoaWNzXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlJlbmRlcmluZ1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9wNS5HcmFwaGljcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoaW4gd3JhcHBlciBhcm91bmQgYSByZW5kZXJlciwgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgYVxcbmdyYXBoaWNzIGJ1ZmZlciBvYmplY3QuIFVzZSB0aGlzIGNsYXNzIGlmIHlvdSBuZWVkXFxudG8gZHJhdyBpbnRvIGFuIG9mZi1zY3JlZW4gZ3JhcGhpY3MgYnVmZmVyLiBUaGUgdHdvIHBhcmFtZXRlcnMgZGVmaW5lIHRoZVxcbndpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIGZvciB0aGlzIGNsYXNzIGFyZVxcbmV4dGVuc2l2ZSwgYnV0IG1pcnJvciB0aGUgbm9ybWFsIGRyYXdpbmcgQVBJIGZvciBwNS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImV4dGVuZHNcIjogXCJwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ3XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD53aWR0aDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aGVpZ2h0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyZW5kZXJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHJlbmRlcmVyIHRvIHVzZSwgZWl0aGVyIFAyRCBvciBXRUJHTDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29uc3RhbnRcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwSW5zdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cG9pbnRlciB0byBwNSBpbnN0YW5jZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUDVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LlJlbmRlcmVyXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LlJlbmRlcmVyXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LlJlbmRlcmVyXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlJlbmRlcmluZ1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9wNS5SZW5kZXJlci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk1haW4gZ3JhcGhpY3MgYW5kIHJlbmRlcmluZyBjb250ZXh0LCBhcyB3ZWxsIGFzIHRoZSBiYXNlIEFQSVxcbmltcGxlbWVudGF0aW9uIGZvciBwNS5qcyAmcXVvdDtjb3JlJnF1b3Q7LiBUbyBiZSB1c2VkIGFzIHRoZSBzdXBlcmNsYXNzIGZvclxcblJlbmRlcmVyMkQgYW5kIFJlbmRlcmVyM0QgY2xhc3NlcywgcmVzcGVjaXR2ZWx5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwiZXh0ZW5kc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImVsdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RE9NIG5vZGUgdGhhdCBpcyB3cmFwcGVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwSW5zdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cG9pbnRlciB0byBwNSBpbnN0YW5jZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUDVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImlzTWFpbkNhbnZhc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+d2hldGhlciB3ZSYjMzk7cmUgdXNpbmcgaXQgYXMgbWFpbiBjYW52YXM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LlR5cGVkRGljdFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5UeXBlZERpY3RcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuVHlwZWREaWN0XCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkJhc2UgY2xhc3MgZm9yIGFsbCBwNS5EaWN0aW9uYXJ5IHR5cGVzLiBNb3JlIHNwZWNpZmljYWxseVxcbiB0eXBlZCBEaWN0aW9uYXJ5IG9iamVjdHMgaW5oZXJpdCBmcm9tIHRoaXM8L3A+XFxuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5TdHJpbmdEaWN0XCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LlN0cmluZ0RpY3RcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuU3RyaW5nRGljdFwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzODcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QSAgRGljdGlvbmFyeSBjbGFzcyBmb3IgU3RyaW5ncy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImV4dGVuZHNcIjogXCJwNS5UeXBlZERpY3RcIlxuICAgICAgICB9LFxuICAgICAgICBcInA1Lk51bWJlckRpY3RcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuTnVtYmVyRGljdFwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5OdW1iZXJEaWN0XCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQwNyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BIHNpbXBsZSBEaWN0aW9uYXJ5IGNsYXNzIGZvciBOdW1iZXJzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiZXh0ZW5kc1wiOiBcInA1LlR5cGVkRGljdFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicDUuSW1hZ2VcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuSW1hZ2VcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuSW1hZ2VcIixcbiAgICAgICAgICAgIFwiY2xhc3NpdGVtc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luc1wiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvcDUuSW1hZ2UuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DcmVhdGVzIGEgbmV3IHA1LkltYWdlLiBBIHA1LkltYWdlIGlzIGEgY2FudmFzIGJhY2tlZCByZXByZXNlbnRhdGlvbiBvZiBhblxcbmltYWdlLlxcbjxicj48YnI+XFxucDUgY2FuIGRpc3BsYXkgLmdpZiwgLmpwZyBhbmQgLnBuZyBpbWFnZXMuIEltYWdlcyBtYXkgYmUgZGlzcGxheWVkXFxuaW4gMkQgYW5kIDNEIHNwYWNlLiBCZWZvcmUgYW4gaW1hZ2UgaXMgdXNlZCwgaXQgbXVzdCBiZSBsb2FkZWQgd2l0aCB0aGVcXG5sb2FkSW1hZ2UoKSBmdW5jdGlvbi4gVGhlIHA1LkltYWdlIGNsYXNzIGNvbnRhaW5zIGZpZWxkcyBmb3IgdGhlIHdpZHRoIGFuZFxcbmhlaWdodCBvZiB0aGUgaW1hZ2UsIGFzIHdlbGwgYXMgYW4gYXJyYXkgY2FsbGVkIHBpeGVsc1tdIHRoYXQgY29udGFpbnMgdGhlXFxudmFsdWVzIGZvciBldmVyeSBwaXhlbCBpbiB0aGUgaW1hZ2UuXFxuPGJyPjxicj5cXG5UaGUgbWV0aG9kcyBkZXNjcmliZWQgYmVsb3cgYWxsb3cgZWFzeSBhY2Nlc3MgdG8gdGhlIGltYWdlJiMzOTtzIHBpeGVscyBhbmRcXG5hbHBoYSBjaGFubmVsIGFuZCBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiBjb21wb3NpdGluZy5cXG48YnI+PGJyPlxcbkJlZm9yZSB1c2luZyB0aGUgcGl4ZWxzW10gYXJyYXksIGJlIHN1cmUgdG8gdXNlIHRoZSBsb2FkUGl4ZWxzKCkgbWV0aG9kIG9uXFxudGhlIGltYWdlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwaXhlbCBkYXRhIGlzIHByb3Blcmx5IGxvYWRlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBpbWcgPSBjcmVhdGVJbWFnZSgxMDAsIDEwMCk7IC8vIHNhbWUgYXMgbmV3IHA1LkltYWdlKDEwMCwgMTAwKTtcXG4gIGltZy5sb2FkUGl4ZWxzKCk7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgYmFja2dyb3VuZCgwKTtcXG5cXG4gIC8vIGhlbHBlciBmb3Igd3JpdGluZyBjb2xvciB0byBhcnJheVxcbiAgZnVuY3Rpb24gd3JpdGVDb2xvcihpbWFnZSwgeCwgeSwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpIHtcXG4gICAgdmFyIGluZGV4ID0gKHggKyB5ICogd2lkdGgpICogNDtcXG4gICAgaW1hZ2UucGl4ZWxzW2luZGV4XSA9IHJlZDtcXG4gICAgaW1hZ2UucGl4ZWxzW2luZGV4ICsgMV0gPSBncmVlbjtcXG4gICAgaW1hZ2UucGl4ZWxzW2luZGV4ICsgMl0gPSBibHVlO1xcbiAgICBpbWFnZS5waXhlbHNbaW5kZXggKyAzXSA9IGFscGhhO1xcbiAgfVxcblxcbiAgdmFyIHgsIHk7XFxuICAvLyBmaWxsIHdpdGggcmFuZG9tIGNvbG9yc1xcbiAgZm9yICh5ID0gMDsgeSA8IGltZy5oZWlnaHQ7IHkrKykge1xcbiAgICBmb3IgKHggPSAwOyB4IDwgaW1nLndpZHRoOyB4KyspIHtcXG4gICAgICB2YXIgcmVkID0gcmFuZG9tKDI1NSk7XFxuICAgICAgdmFyIGdyZWVuID0gcmFuZG9tKDI1NSk7XFxuICAgICAgdmFyIGJsdWUgPSByYW5kb20oMjU1KTtcXG4gICAgICB2YXIgYWxwaGEgPSAyNTU7XFxuICAgICAgd3JpdGVDb2xvcihpbWcsIHgsIHksIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTtcXG4gICAgfVxcbiAgfVxcblxcbiAgLy8gZHJhdyBhIHJlZCBsaW5lXFxuICB5ID0gMDtcXG4gIGZvciAoeCA9IDA7IHggPCBpbWcud2lkdGg7IHgrKykge1xcbiAgICB3cml0ZUNvbG9yKGltZywgeCwgeSwgMjU1LCAwLCAwLCAyNTUpO1xcbiAgfVxcblxcbiAgLy8gZHJhdyBhIGdyZWVuIGxpbmVcXG4gIHkgPSBpbWcuaGVpZ2h0IC0gMTtcXG4gIGZvciAoeCA9IDA7IHggPCBpbWcud2lkdGg7IHgrKykge1xcbiAgICB3cml0ZUNvbG9yKGltZywgeCwgeSwgMCwgMjU1LCAwLCAyNTUpO1xcbiAgfVxcblxcbiAgaW1nLnVwZGF0ZVBpeGVscygpO1xcbiAgaW1hZ2UoaW1nLCAwLCAwKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid2lkdGhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJoZWlnaHRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5QcmludFdyaXRlclwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5QcmludFdyaXRlclwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5QcmludFdyaXRlclwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJPdXRwdXRcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vZmlsZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTY5LFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsZW5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJleHRlbnNpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LlRhYmxlXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGFibGUgb2JqZWN0cyBzdG9yZSBkYXRhIHdpdGggbXVsdGlwbGUgcm93cyBhbmQgY29sdW1ucywgbXVjaFxcbmxpa2UgaW4gYSB0cmFkaXRpb25hbCBzcHJlYWRzaGVldC4gVGFibGVzIGNhbiBiZSBnZW5lcmF0ZWQgZnJvbVxcbnNjcmF0Y2gsIGR5bmFtaWNhbGx5LCBvciB1c2luZyBkYXRhIGZyb20gYW4gZXhpc3RpbmcgZmlsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyb3dzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BbiBhcnJheSBvZiBwNS5UYWJsZVJvdyBvYmplY3RzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5UYWJsZVJvd1tdXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5UYWJsZVJvd1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5UYWJsZVJvd1wiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5UYWJsZVJvd1wiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZVJvdy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkEgVGFibGVSb3cgb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgcm93IG9mIGRhdGEgdmFsdWVzLFxcbnN0b3JlZCBpbiBjb2x1bW5zLCBmcm9tIGEgdGFibGUuPC9wPlxcbjxwPkEgVGFibGUgUm93IGNvbnRhaW5zIGJvdGggYW4gb3JkZXJlZCBhcnJheSwgYW5kIGFuIHVub3JkZXJlZFxcbkpTT04gb2JqZWN0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0clwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+b3B0aW9uYWw6IHBvcHVsYXRlIHRoZSByb3cgd2l0aCBhXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvZiB2YWx1ZXMsIHNlcGFyYXRlZCBieSB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNlcGFyYXRvclwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y29tbWEgc2VwYXJhdGVkIHZhbHVlcyAoY3N2KSBieSBkZWZhdWx0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LlhNTFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5YTUxcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuWE1MXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlhNTFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5YTUwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5YTUwgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbiBYTUwgb2JqZWN0LCBhYmxlIHRvIHBhcnNlIFhNTCBjb2RlLiBVc2VcXG5sb2FkWE1MKCkgdG8gbG9hZCBleHRlcm5hbCBYTUwgZmlsZXMgYW5kIGNyZWF0ZSBYTUwgb2JqZWN0cy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbi8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFxcXCJtYW1tYWxzLnhtbFxcXCIgaXMgcGFyc2VkXFxuLy8gaW4gdGhlIGNvZGUgYmVsb3cuXFxuLy9cXG4vLyA8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiPz5cXG4vLyAmbHQ7bWFtbWFscyZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjBcXFwiIHNwZWNpZXM9XFxcIkNhcHJhIGhpcmN1c1xcXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMVxcXCIgc3BlY2llcz1cXFwiUGFudGhlcmEgcGFyZHVzXFxcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIyXFxcIiBzcGVjaWVzPVxcXCJFcXV1cyB6ZWJyYVxcXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcXG4vLyAmbHQ7L21hbW1hbHMmZ3Q7XFxuXFxudmFyIHhtbDtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGNoaWxkcmVuID0geG1sLmdldENoaWxkcmVuKCdhbmltYWwnKTtcXG5cXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcXG4gICAgdmFyIGlkID0gY2hpbGRyZW5baV0uZ2V0TnVtKCdpZCcpO1xcbiAgICB2YXIgY29sb3JpbmcgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoJ3NwZWNpZXMnKTtcXG4gICAgdmFyIG5hbWUgPSBjaGlsZHJlbltpXS5nZXRDb250ZW50KCk7XFxuICAgIHByaW50KGlkICsgJywgJyArIGNvbG9yaW5nICsgJywgJyArIG5hbWUpO1xcbiAgfVxcbn1cXG5cXG4vLyBTa2V0Y2ggcHJpbnRzOlxcbi8vIDAsIENhcHJhIGhpcmN1cywgR29hdFxcbi8vIDEsIFBhbnRoZXJhIHBhcmR1cywgTGVvcGFyZFxcbi8vIDIsIEVxdXVzIHplYnJhLCBaZWJyYVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5WZWN0b3JcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LlZlY3RvclwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9wNS5WZWN0b3IuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BIGNsYXNzIHRvIGRlc2NyaWJlIGEgdHdvIG9yIHRocmVlIGRpbWVuc2lvbmFsIHZlY3Rvciwgc3BlY2lmaWNhbGx5XFxuYSBFdWNsaWRlYW4gKGFsc28ga25vd24gYXMgZ2VvbWV0cmljKSB2ZWN0b3IuIEEgdmVjdG9yIGlzIGFuIGVudGl0eVxcbnRoYXQgaGFzIGJvdGggbWFnbml0dWRlIGFuZCBkaXJlY3Rpb24uIFRoZSBkYXRhdHlwZSwgaG93ZXZlciwgc3RvcmVzXFxudGhlIGNvbXBvbmVudHMgb2YgdGhlIHZlY3RvciAoeCwgeSBmb3IgMkQsIGFuZCB4LCB5LCB6IGZvciAzRCkuIFRoZSBtYWduaXR1ZGVcXG5hbmQgZGlyZWN0aW9uIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG1ldGhvZHMgbWFnKCkgYW5kIGhlYWRpbmcoKS5cXG48YnI+PGJyPlxcbkluIG1hbnkgb2YgdGhlIHA1LmpzIGV4YW1wbGVzLCB5b3Ugd2lsbCBzZWUgcDUuVmVjdG9yIHVzZWQgdG8gZGVzY3JpYmUgYVxcbnBvc2l0aW9uLCB2ZWxvY2l0eSwgb3IgYWNjZWxlcmF0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91IGNvbnNpZGVyIGEgcmVjdGFuZ2xlXFxubW92aW5nIGFjcm9zcyB0aGUgc2NyZWVuLCBhdCBhbnkgZ2l2ZW4gaW5zdGFudCBpdCBoYXMgYSBwb3NpdGlvbiAoYSB2ZWN0b3JcXG50aGF0IHBvaW50cyBmcm9tIHRoZSBvcmlnaW4gdG8gaXRzIGxvY2F0aW9uKSwgYSB2ZWxvY2l0eSAodGhlIHJhdGUgYXQgd2hpY2hcXG50aGUgb2JqZWN0JiMzOTtzIHBvc2l0aW9uIGNoYW5nZXMgcGVyIHRpbWUgdW5pdCwgZXhwcmVzc2VkIGFzIGEgdmVjdG9yKSwgYW5kXFxuYWNjZWxlcmF0aW9uICh0aGUgcmF0ZSBhdCB3aGljaCB0aGUgb2JqZWN0JiMzOTtzIHZlbG9jaXR5IGNoYW5nZXMgcGVyIHRpbWVcXG51bml0LCBleHByZXNzZWQgYXMgYSB2ZWN0b3IpLlxcbjxicj48YnI+XFxuU2luY2UgdmVjdG9ycyByZXByZXNlbnQgZ3JvdXBpbmdzIG9mIHZhbHVlcywgd2UgY2Fubm90IHNpbXBseSB1c2VcXG50cmFkaXRpb25hbCBhZGRpdGlvbi9tdWx0aXBsaWNhdGlvbi9ldGMuIEluc3RlYWQsIHdlJiMzOTtsbCBuZWVkIHRvIGRvIHNvbWVcXG4mcXVvdDt2ZWN0b3ImcXVvdDsgbWF0aCwgd2hpY2ggaXMgbWFkZSBlYXN5IGJ5IHRoZSBtZXRob2RzIGluc2lkZSB0aGUgcDUuVmVjdG9yIGNsYXNzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eSBjb21wb25lbnQgb2YgdGhlIHZlY3RvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD56IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciB2MSA9IGNyZWF0ZVZlY3Rvcig0MCwgNTApO1xcbnZhciB2MiA9IGNyZWF0ZVZlY3Rvcig0MCwgNTApO1xcblxcbmVsbGlwc2UodjEueCwgdjEueSwgNTAsIDUwKTtcXG5lbGxpcHNlKHYyLngsIHYyLnksIDUwLCA1MCk7XFxudjEuYWRkKHYyKTtcXG5lbGxpcHNlKHYxLngsIHYxLnksIDUwLCA1MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCIyIHdoaXRlIGVsbGlwc2VzLiBPbmUgY2VudGVyLWxlZnQgdGhlIG90aGVyIGJvdHRvbSByaWdodCBhbmQgb2ZmIGNhbnZhc1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicDUuRm9udFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5Gb250XCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LkZvbnRcIixcbiAgICAgICAgICAgIFwiY2xhc3NpdGVtc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luc1wiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiVHlwb2dyYXBoeVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJGb250XCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3R5cG9ncmFwaHkvcDUuRm9udC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkJhc2UgY2xhc3MgZm9yIGZvbnQgaGFuZGxpbmc8L3A+XFxuXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwSW5zdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cG9pbnRlciB0byBwNSBpbnN0YW5jZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUDVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1Lkdlb21ldHJ5XCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1Lkdlb21ldHJ5XCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1Lkdlb21ldHJ5XCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkxpZ2h0cywgQ2FtZXJhXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL3A1Lkdlb21ldHJ5LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNSBHZW9tZXRyeSBjbGFzczwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZlcnREYXRhXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYWxsYmFjayBmdW5jdGlvbiBvciBPYmplY3RcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgcm91dGluZShzKSBmb3IgdmVydGV4IGRhdGEgZ2VuZXJhdGlvbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb24gfCBPYmplY3RcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZXRhaWxYXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgb2YgdmVydGljZXMgb24gaG9yaXpvbnRhbCBzdXJmYWNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZXRhaWxZXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgb2YgdmVydGljZXMgb24gaG9yaXpvbnRhbCBzdXJmYWNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gY2FsbCB1cG9uIG9iamVjdCBpbnN0YW50aWF0aW9uLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LlNoYWRlclwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5TaGFkZXJcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuU2hhZGVyXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkxpZ2h0cywgQ2FtZXJhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlNoYWRlcnNcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcDUuU2hhZGVyLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2hhZGVyIGNsYXNzIGZvciBXRUJHTCBNb2RlPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVuZGVyZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmFuIGluc3RhbmNlIG9mIHA1LlJlbmRlcmVyR0wgdGhhdFxcbndpbGwgcHJvdmlkZSB0aGUgR0wgY29udGV4dCBmb3IgdGhpcyBuZXcgcDUuU2hhZGVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5SZW5kZXJlckdMXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmVydFNyY1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c291cmNlIGNvZGUgZm9yIHRoZSB2ZXJ0ZXggc2hhZGVyIChhcyBhIHN0cmluZyk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZyYWdTcmNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNvdXJjZSBjb2RlIGZvciB0aGUgZnJhZ21lbnQgc2hhZGVyIChhcyBhIHN0cmluZyk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LmRvbVwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5NZWRpYUVsZW1lbnRcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuTWVkaWFFbGVtZW50XCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1Lk1lZGlhRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxODI5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkV4dGVuZHMgcDUuRWxlbWVudCB0byBoYW5kbGUgYXVkaW8gYW5kIHZpZGVvLiBJbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kc1xcbm9mIHA1LkVsZW1lbnQsIGl0IGFsc28gY29udGFpbnMgbWV0aG9kcyBmb3IgY29udHJvbGxpbmcgbWVkaWEuIEl0IGlzIG5vdFxcbmNhbGxlZCBkaXJlY3RseSwgYnV0IHA1Lk1lZGlhRWxlbWVudHMgYXJlIGNyZWF0ZWQgYnkgY2FsbGluZyBjcmVhdGVWaWRlbyxcXG5jcmVhdGVBdWRpbywgYW5kIGNyZWF0ZUNhcHR1cmUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpc19jb25zdHJ1Y3RvclwiOiAxLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZWx0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ET00gbm9kZSB0aGF0IGlzIHdyYXBwZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LkZpbGVcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuRmlsZVwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5GaWxlXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI4ODUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QmFzZSBjbGFzcyBmb3IgYSBmaWxlXFxuVXNpbmcgdGhpcyBmb3IgY3JlYXRlRmlsZUlucHV0PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpc19jb25zdHJ1Y3RvclwiOiAxLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RmlsZSB0aGF0IGlzIHdyYXBwZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZpbGVcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5zb3VuZFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcInA1LlNvdW5kRmlsZVwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc0MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Tb3VuZEZpbGUgb2JqZWN0IHdpdGggYSBwYXRoIHRvIGEgZmlsZS48L3A+XFxuXFxuPHA+VGhlIHA1LlNvdW5kRmlsZSBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseSBiZWNhdXNlXFxuaXQgbG9hZHMgdGhlIGZpbGUgaW5mb3JtYXRpb24gYXN5bmNocm9ub3VzbHkuPC9wPlxcblxcbjxwPlRvIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBzb3VuZCBhcyBzb29uIGFzIGl0IGxvYWRzXFxucGFzcyB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLjwvcD5cXG5cXG48cD5Pbmx5IG9uZSBmaWxlIHBhdGggaXMgcmVxdWlyZWQuIEhvd2V2ZXIsIGF1ZGlvIGZpbGUgZm9ybWF0c1xcbihpLmUuIG1wMywgb2dnLCB3YXYgYW5kIG00YS9hYWMpIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGFsbFxcbndlYiBicm93c2Vycy4gSWYgeW91IHdhbnQgdG8gZW5zdXJlIGNvbXBhdGFiaWxpdHksIGluc3RlYWQgb2YgYSBzaW5nbGVcXG5maWxlIHBhdGgsIHlvdSBtYXkgaW5jbHVkZSBhbiBBcnJheSBvZiBmaWxlcGF0aHMsIGFuZCB0aGUgYnJvd3NlciB3aWxsXFxuY2hvb3NlIGEgZm9ybWF0IHRoYXQgd29ya3MuPC9wPlwiLFxuICAgICAgICAgICAgXCJpc19jb25zdHJ1Y3RvclwiOiAxLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cGF0aCB0byBhIHNvdW5kIGZpbGUgKFN0cmluZykuIE9wdGlvbmFsbHksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UgbWF5IGluY2x1ZGUgbXVsdGlwbGUgZmlsZSBmb3JtYXRzIGluXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBhcnJheS4gQWx0ZXJuYXRlbHksIGFjY2VwdHMgYW4gb2JqZWN0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBIVE1MNSBGaWxlIEFQSSwgb3IgYSBwNS5GaWxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfEFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3VjY2Vzc0NhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OYW1lIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIGZpbGUgbG9hZHM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OYW1lIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCBpZiBmaWxlIGZhaWxzIHRvXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZC4gVGhpcyBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgYW4gZXJyb3Igb3JcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTEh0dHBSZXF1ZXN0IG9iamVjdCB3aXRoIGluZm9ybWF0aW9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm91dCB3aGF0IHdlbnQgd3JvbmcuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid2hpbGVMb2FkaW5nQ2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk5hbWUgb2YgYSBmdW5jdGlvbiB0byBjYWxsIHdoaWxlIGZpbGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbG9hZGluZy4gVGhhdCBmdW5jdGlvbiB3aWxsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgcHJvZ3Jlc3Mgb2YgdGhlIHJlcXVlc3QgdG9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCB0aGUgc291bmQgZmlsZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmV0d2VlbiAwIGFuZCAxKSBhcyBpdHMgZmlyc3RcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLiBUaGlzIHByb2dyZXNzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGFjY291bnQgZm9yIHRoZSBhZGRpdGlvbmFsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgbmVlZGVkIHRvIGRlY29kZSB0aGUgYXVkaW8gZGF0YS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgc291bmRGb3JtYXRzKCdtcDMnLCAnb2dnJyk7XFxuICBteVNvdW5kID0gbG9hZFNvdW5kKCdhc3NldHMvZG9vcmJlbGwubXAzJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgbXlTb3VuZC5zZXRWb2x1bWUoMC4xKTtcXG4gIG15U291bmQucGxheSgpO1xcbn1cXG5cXG4gPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwicDUuQW1wbGl0dWRlXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LkFtcGxpdHVkZVwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5BbXBsaXR1ZGVcIixcbiAgICAgICAgICAgIFwiY2xhc3NpdGVtc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luc1wiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjE1NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BbXBsaXR1ZGUgbWVhc3VyZXMgdm9sdW1lIGJldHdlZW4gMC4wIGFuZCAxLjAuXFxuTGlzdGVucyB0byBhbGwgcDVzb3VuZCBieSBkZWZhdWx0LCBvciB1c2Ugc2V0SW5wdXQoKVxcbnRvIGxpc3RlbiB0byBhIHNwZWNpZmljIHNvdW5kIHNvdXJjZS4gQWNjZXB0cyBhbiBvcHRpb25hbFxcbnNtb290aGluZyB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gMC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzbW9vdGhpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmJldHdlZW4gMC4wIGFuZCAuOTk5IHRvIHNtb290aFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtcGxpdHVkZSByZWFkaW5ncyAoZGVmYXVsdHMgdG8gMCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHNvdW5kLCBhbXBsaXR1ZGUsIGNudjtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCl7XFxuICBzb3VuZCA9IGxvYWRTb3VuZCgnYXNzZXRzL2JlYXQubXAzJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwxMDApO1xcbiAgYW1wbGl0dWRlID0gbmV3IHA1LkFtcGxpdHVkZSgpO1xcblxcbiAgLy8gc3RhcnQgLyBzdG9wIHRoZSBzb3VuZCB3aGVuIGNhbnZhcyBpcyBjbGlja2VkXFxuICBjbnYubW91c2VDbGlja2VkKGZ1bmN0aW9uKCkge1xcbiAgICBpZiAoc291bmQuaXNQbGF5aW5nKCkgKXtcXG4gICAgICBzb3VuZC5zdG9wKCk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgc291bmQucGxheSgpO1xcbiAgICB9XFxuICB9KTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMCk7XFxuICBmaWxsKDI1NSk7XFxuICB2YXIgbGV2ZWwgPSBhbXBsaXR1ZGUuZ2V0TGV2ZWwoKTtcXG4gIHZhciBzaXplID0gbWFwKGxldmVsLCAwLCAxLCAwLCAyMDApO1xcbiAgZWxsaXBzZSh3aWR0aC8yLCBoZWlnaHQvMiwgc2l6ZSwgc2l6ZSk7XFxufVxcblxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LkZGVFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5GRlRcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI0MjYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RkZUIChGYXN0IEZvdXJpZXIgVHJhbnNmb3JtKSBpcyBhbiBhbmFseXNpcyBhbGdvcml0aG0gdGhhdFxcbmlzb2xhdGVzIGluZGl2aWR1YWxcXG48YSBocmVmPVxcXCJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BdWRpb19mcmVxdWVuY3lcXFwiPlxcbmF1ZGlvIGZyZXF1ZW5jaWVzPC9hPiB3aXRoaW4gYSB3YXZlZm9ybS48L3A+XFxuXFxuPHA+T25jZSBpbnN0YW50aWF0ZWQsIGEgcDUuRkZUIG9iamVjdCBjYW4gcmV0dXJuIGFuIGFycmF5IGJhc2VkIG9uXFxudHdvIHR5cGVzIG9mIGFuYWx5c2VzOiA8YnI+IOKAoiA8Y29kZT5GRlQud2F2ZWZvcm0oKTwvY29kZT4gY29tcHV0ZXNcXG5hbXBsaXR1ZGUgdmFsdWVzIGFsb25nIHRoZSB0aW1lIGRvbWFpbi4gVGhlIGFycmF5IGluZGljZXMgY29ycmVzcG9uZFxcbnRvIHNhbXBsZXMgYWNyb3NzIGEgYnJpZWYgbW9tZW50IGluIHRpbWUuIEVhY2ggdmFsdWUgcmVwcmVzZW50c1xcbmFtcGxpdHVkZSBvZiB0aGUgd2F2ZWZvcm0gYXQgdGhhdCBzYW1wbGUgb2YgdGltZS48YnI+XFxu4oCiIDxjb2RlPkZGVC5hbmFseXplKCkgPC9jb2RlPiBjb21wdXRlcyBhbXBsaXR1ZGUgdmFsdWVzIGFsb25nIHRoZVxcbmZyZXF1ZW5jeSBkb21haW4uIFRoZSBhcnJheSBpbmRpY2VzIGNvcnJlc3BvbmQgdG8gZnJlcXVlbmNpZXMgKGkuZS5cXG5waXRjaGVzKSwgZnJvbSB0aGUgbG93ZXN0IHRvIHRoZSBoaWdoZXN0IHRoYXQgaHVtYW5zIGNhbiBoZWFyLiBFYWNoXFxudmFsdWUgcmVwcmVzZW50cyBhbXBsaXR1ZGUgYXQgdGhhdCBzbGljZSBvZiB0aGUgZnJlcXVlbmN5IHNwZWN0cnVtLlxcblVzZSB3aXRoIDxjb2RlPmdldEVuZXJneSgpPC9jb2RlPiB0byBtZWFzdXJlIGFtcGxpdHVkZSBhdCBzcGVjaWZpY1xcbmZyZXF1ZW5jaWVzLCBvciB3aXRoaW4gYSByYW5nZSBvZiBmcmVxdWVuY2llcy4gPC9wPlxcblxcbjxwPkZGVCBhbmFseXplcyBhIHZlcnkgc2hvcnQgc25hcHNob3Qgb2Ygc291bmQgY2FsbGVkIGEgc2FtcGxlXFxuYnVmZmVyLiBJdCByZXR1cm5zIGFuIGFycmF5IG9mIGFtcGxpdHVkZSBtZWFzdXJlbWVudHMsIHJlZmVycmVkXFxudG8gYXMgPGNvZGU+YmluczwvY29kZT4uIFRoZSBhcnJheSBpcyAxMDI0IGJpbnMgbG9uZyBieSBkZWZhdWx0LlxcbllvdSBjYW4gY2hhbmdlIHRoZSBiaW4gYXJyYXkgbGVuZ3RoLCBidXQgaXQgbXVzdCBiZSBhIHBvd2VyIG9mIDJcXG5iZXR3ZWVuIDE2IGFuZCAxMDI0IGluIG9yZGVyIGZvciB0aGUgRkZUIGFsZ29yaXRobSB0byBmdW5jdGlvblxcbmNvcnJlY3RseS4gVGhlIGFjdHVhbCBzaXplIG9mIHRoZSBGRlQgYnVmZmVyIGlzIHR3aWNlIHRoZVxcbm51bWJlciBvZiBiaW5zLCBzbyBnaXZlbiBhIHN0YW5kYXJkIHNhbXBsZSByYXRlLCB0aGUgYnVmZmVyIGlzXFxuMjA0OC80NDEwMCBzZWNvbmRzIGxvbmcuPC9wPlwiLFxuICAgICAgICAgICAgXCJpc19jb25zdHJ1Y3RvclwiOiAxLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic21vb3RoaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TbW9vdGggcmVzdWx0cyBvZiBGcmVxIFNwZWN0cnVtLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCAmbHQ7IHNtb290aGluZyAmbHQ7IDEuMC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byAwLjguPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImJpbnNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkxlbmd0aCBvZiByZXN1bHRpbmcgYXJyYXkuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGEgcG93ZXIgb2YgdHdvIGJldHdlZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDE2IGFuZCAxMDI0LiBEZWZhdWx0cyB0byAxMDI0LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5mdW5jdGlvbiBwcmVsb2FkKCl7XFxuICBzb3VuZCA9IGxvYWRTb3VuZCgnYXNzZXRzL0RhbXNjcmF5X0RhbmNpbmdUaWdlci5tcDMnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKXtcXG4gIHZhciBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLDEwMCk7XFxuICBjbnYubW91c2VDbGlja2VkKHRvZ2dsZVBsYXkpO1xcbiAgZmZ0ID0gbmV3IHA1LkZGVCgpO1xcbiAgc291bmQuYW1wKDAuMik7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKXtcXG4gIGJhY2tncm91bmQoMCk7XFxuXFxuICB2YXIgc3BlY3RydW0gPSBmZnQuYW5hbHl6ZSgpO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMCwyNTUsMCk7IC8vIHNwZWN0cnVtIGlzIGdyZWVuXFxuICBmb3IgKHZhciBpID0gMDsgaTwgc3BlY3RydW0ubGVuZ3RoOyBpKyspe1xcbiAgICB2YXIgeCA9IG1hcChpLCAwLCBzcGVjdHJ1bS5sZW5ndGgsIDAsIHdpZHRoKTtcXG4gICAgdmFyIGggPSAtaGVpZ2h0ICsgbWFwKHNwZWN0cnVtW2ldLCAwLCAyNTUsIGhlaWdodCwgMCk7XFxuICAgIHJlY3QoeCwgaGVpZ2h0LCB3aWR0aCAvIHNwZWN0cnVtLmxlbmd0aCwgaCApXFxuICB9XFxuXFxuICB2YXIgd2F2ZWZvcm0gPSBmZnQud2F2ZWZvcm0oKTtcXG4gIG5vRmlsbCgpO1xcbiAgYmVnaW5TaGFwZSgpO1xcbiAgc3Ryb2tlKDI1NSwwLDApOyAvLyB3YXZlZm9ybSBpcyByZWRcXG4gIHN0cm9rZVdlaWdodCgxKTtcXG4gIGZvciAodmFyIGkgPSAwOyBpPCB3YXZlZm9ybS5sZW5ndGg7IGkrKyl7XFxuICAgIHZhciB4ID0gbWFwKGksIDAsIHdhdmVmb3JtLmxlbmd0aCwgMCwgd2lkdGgpO1xcbiAgICB2YXIgeSA9IG1hcCggd2F2ZWZvcm1baV0sIC0xLCAxLCAwLCBoZWlnaHQpO1xcbiAgICB2ZXJ0ZXgoeCx5KTtcXG4gIH1cXG4gIGVuZFNoYXBlKCk7XFxuXFxuICB0ZXh0KCdjbGljayB0byBwbGF5L3BhdXNlJywgNCwgMTApO1xcbn1cXG5cXG4vLyBmYWRlIHNvdW5kIGlmIG1vdXNlIGlzIG92ZXIgY2FudmFzXFxuZnVuY3Rpb24gdG9nZ2xlUGxheSgpIHtcXG4gIGlmIChzb3VuZC5pc1BsYXlpbmcoKSkge1xcbiAgICBzb3VuZC5wYXVzZSgpO1xcbiAgfSBlbHNlIHtcXG4gICAgc291bmQubG9vcCgpO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5TaWduYWxcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuU2lnbmFsXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LlNpZ25hbFwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0ODI4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LlNpZ25hbCBpcyBhIGNvbnN0YW50IGF1ZGlvLXJhdGUgc2lnbmFsIHVzZWQgYnkgcDUuT3NjaWxsYXRvclxcbmFuZCBwNS5FbnZlbG9wZSBmb3IgbW9kdWxhdGlvbiBtYXRoLjwvcD5cXG5cXG48cD5UaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFdlYiBBdWRpbyBpcyBwcm9jZXNzZWQgb24gYSBzZXByYXRlIGNsb2NrLlxcbkZvciBleGFtcGxlLCB0aGUgcDUgZHJhdyBsb29wIHJ1bnMgYWJvdXQgNjAgdGltZXMgcGVyIHNlY29uZC4gQnV0XFxudGhlIGF1ZGlvIGNsb2NrIG11c3QgcHJvY2VzcyBzYW1wbGVzIDQ0MTAwIHRpbWVzIHBlciBzZWNvbmQuIElmIHdlXFxud2FudCB0byBhZGQgYSB2YWx1ZSB0byBlYWNoIG9mIHRob3NlIHNhbXBsZXMsIHdlIGNhbiYjMzk7dCBkbyBpdCBpbiB0aGVcXG5kcmF3IGxvb3AsIGJ1dCB3ZSBjYW4gZG8gaXQgYnkgYWRkaW5nIGEgY29uc3RhbnQtcmF0ZSBhdWRpbyBzaWduYWwuJmx0Oy9wLlxcblxcbjxwPlRoaXMgY2xhc3MgbW9zdGx5IGZ1bmN0aW9ucyBiZWhpbmQgdGhlIHNjZW5lcyBpbiBwNS5zb3VuZCwgYW5kIHJldHVybnNcXG5hIFRvbmUuU2lnbmFsIGZyb20gdGhlIFRvbmUuanMgbGlicmFyeSBieSBZb3RhbSBNYW5uLlxcbklmIHlvdSB3YW50IHRvIHdvcmsgZGlyZWN0bHkgd2l0aCBhdWRpbyBzaWduYWxzIGZvciBtb2R1bGFyXFxuc3ludGhlc2lzLCBjaGVjayBvdXRcXG48YSBocmVmPSdodHRwOi8vYml0Lmx5LzFvSW9FbmcnIHRhcmdldD1fJ2JsYW5rJz50b25lLmpzLjwvYT48L3A+XCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgU2lnbmFsIG9iamVjdCBmcm9tIHRoZSBUb25lLmpzIGxpYnJhcnlcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJUb25lLlNpZ25hbFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjYXJyaWVyID0gbmV3IHA1Lk9zY2lsbGF0b3IoJ3NpbmUnKTtcXG4gIGNhcnJpZXIuYW1wKDEpOyAvLyBzZXQgYW1wbGl0dWRlXFxuICBjYXJyaWVyLmZyZXEoMjIwKTsgLy8gc2V0IGZyZXF1ZW5jeVxcbiAgY2Fycmllci5zdGFydCgpOyAvLyBzdGFydCBvc2NpbGxhdGluZ1xcblxcbiAgbW9kdWxhdG9yID0gbmV3IHA1Lk9zY2lsbGF0b3IoJ3Nhd3Rvb3RoJyk7XFxuICBtb2R1bGF0b3IuZGlzY29ubmVjdCgpO1xcbiAgbW9kdWxhdG9yLmFtcCgxKTtcXG4gIG1vZHVsYXRvci5mcmVxKDQpO1xcbiAgbW9kdWxhdG9yLnN0YXJ0KCk7XFxuXFxuICAvLyBNb2R1bGF0b3IncyBkZWZhdWx0IGFtcGxpdHVkZSByYW5nZSBpcyAtMSB0byAxLlxcbiAgLy8gTXVsdGlwbHkgaXQgYnkgLTIwMCwgc28gdGhlIHJhbmdlIGlzIC0yMDAgdG8gMjAwXFxuICAvLyB0aGVuIGFkZCAyMjAgc28gdGhlIHJhbmdlIGlzIDIwIHRvIDQyMFxcbiAgY2Fycmllci5mcmVxKCBtb2R1bGF0b3IubXVsdCgtMjAwKS5hZGQoMjIwKSApO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5Pc2NpbGxhdG9yXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1Lk9zY2lsbGF0b3JcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuT3NjaWxsYXRvclwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0OTc0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgYSBzaWduYWwgdGhhdCBvc2NpbGxhdGVzIGJldHdlZW4gLTEuMCBhbmQgMS4wLlxcbkJ5IGRlZmF1bHQsIHRoZSBvc2NpbGxhdGlvbiB0YWtlcyB0aGUgZm9ybSBvZiBhIHNpbnVzb2lkYWxcXG5zaGFwZSAoJiMzOTtzaW5lJiMzOTspLiBBZGRpdGlvbmFsIHR5cGVzIGluY2x1ZGUgJiMzOTt0cmlhbmdsZSYjMzk7LFxcbiYjMzk7c2F3dG9vdGgmIzM5OyBhbmQgJiMzOTtzcXVhcmUmIzM5Oy4gVGhlIGZyZXF1ZW5jeSBkZWZhdWx0cyB0b1xcbjQ0MCBvc2NpbGxhdGlvbnMgcGVyIHNlY29uZCAoNDQwSHosIGVxdWFsIHRvIHRoZSBwaXRjaCBvZiBhblxcbiYjMzk7QSYjMzk7IG5vdGUpLjwvcD5cXG5cXG48cD5TZXQgdGhlIHR5cGUgb2Ygb3NjaWxsYXRpb24gd2l0aCBzZXRUeXBlKCksIG9yIGJ5IGluc3RhbnRpYXRpbmcgYVxcbnNwZWNpZmljIG9zY2lsbGF0b3I6IDxhIGhyZWY9XFxcIi9yZWZlcmVuY2UvIy9wNS5TaW5Pc2NcXFwiPnA1LlNpbk9zYzwvYT4sIDxhXFxuaHJlZj1cXFwiL3JlZmVyZW5jZS8jL3A1LlRyaU9zY1xcXCI+cDUuVHJpT3NjPC9hPiwgPGFcXG5ocmVmPVxcXCIvcmVmZXJlbmNlLyMvcDUuU3FyT3NjXFxcIj5wNS5TcXJPc2M8L2E+LCBvciA8YVxcbmhyZWY9XFxcIi9yZWZlcmVuY2UvIy9wNS5TYXdPc2NcXFwiPnA1LlNhd09zYzwvYT4uXFxuPC9wPlwiLFxuICAgICAgICAgICAgXCJpc19jb25zdHJ1Y3RvclwiOiAxLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnJlcVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnJlcXVlbmN5IGRlZmF1bHRzIHRvIDQ0MEh6PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnR5cGUgb2Ygb3NjaWxsYXRvci4gT3B0aW9uczpcXG4gICAgICAgICAgICAgICAgICAgICAgICYjMzk7c2luZSYjMzk7IChkZWZhdWx0KSwgJiMzOTt0cmlhbmdsZSYjMzk7LFxcbiAgICAgICAgICAgICAgICAgICAgICAgJiMzOTtzYXd0b290aCYjMzk7LCAmIzM5O3NxdWFyZSYjMzk7PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBvc2M7XFxudmFyIHBsYXlpbmcgPSBmYWxzZTtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGJhY2tncm91bmRDb2xvciA9IGNvbG9yKDI1NSwwLDI1NSk7XFxuICB0ZXh0QWxpZ24oQ0VOVEVSKTtcXG5cXG4gIG9zYyA9IG5ldyBwNS5Pc2NpbGxhdG9yKCk7XFxuICBvc2Muc2V0VHlwZSgnc2luZScpO1xcbiAgb3NjLmZyZXEoMjQwKTtcXG4gIG9zYy5hbXAoMCk7XFxuICBvc2Muc3RhcnQoKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKVxcbiAgdGV4dCgnY2xpY2sgdG8gcGxheScsIHdpZHRoLzIsIGhlaWdodC8yKTtcXG59XFxuXFxuZnVuY3Rpb24gbW91c2VDbGlja2VkKCkge1xcbiAgaWYgKG1vdXNlWCA+IDAgJiYgbW91c2VYIDwgd2lkdGggJiYgbW91c2VZIDwgaGVpZ2h0ICYmIG1vdXNlWSA+IDApIHtcXG4gICAgaWYgKCFwbGF5aW5nKSB7XFxuICAgICAgLy8gcmFtcCBhbXBsaXR1ZGUgdG8gMC41IG92ZXIgMC4wNSBzZWNvbmRzXFxuICAgICAgb3NjLmFtcCgwLjUsIDAuMDUpO1xcbiAgICAgIHBsYXlpbmcgPSB0cnVlO1xcbiAgICAgIGJhY2tncm91bmRDb2xvciA9IGNvbG9yKDAsMjU1LDI1NSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgLy8gcmFtcCBhbXBsaXR1ZGUgdG8gMCBvdmVyIDAuNSBzZWNvbmRzXFxuICAgICAgb3NjLmFtcCgwLCAwLjUpO1xcbiAgICAgIHBsYXlpbmcgPSBmYWxzZTtcXG4gICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcigyNTUsMCwyNTUpO1xcbiAgICB9XFxuICB9XFxufVxcbjwvY29kZT4gPC9kaXY+XCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5TaW5Pc2NcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuU2luT3NjXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LlNpbk9zY1wiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1NDA5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnN0cnVjdG9yOiA8Y29kZT5uZXcgcDUuU2luT3NjKCk8L2NvZGU+LlxcblRoaXMgY3JlYXRlcyBhIFNpbmUgV2F2ZSBPc2NpbGxhdG9yIGFuZCBpc1xcbmVxdWl2YWxlbnQgdG8gPGNvZGU+IG5ldyBwNS5Pc2NpbGxhdG9yKCYjMzk7c2luZSYjMzk7KVxcbjwvY29kZT4gb3IgY3JlYXRpbmcgYSBwNS5Pc2NpbGxhdG9yIGFuZCB0aGVuIGNhbGxpbmdcXG5pdHMgbWV0aG9kIDxjb2RlPnNldFR5cGUoJiMzOTtzaW5lJiMzOTspPC9jb2RlPi5cXG5TZWUgcDUuT3NjaWxsYXRvciBmb3IgbWV0aG9kcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcImV4dGVuZHNcIjogXCJwNS5Pc2NpbGxhdG9yXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmcmVxXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIGZyZXF1ZW5jeTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5UcmlPc2NcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuVHJpT3NjXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LlRyaU9zY1wiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1NDI2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnN0cnVjdG9yOiA8Y29kZT5uZXcgcDUuVHJpT3NjKCk8L2NvZGU+LlxcblRoaXMgY3JlYXRlcyBhIFRyaWFuZ2xlIFdhdmUgT3NjaWxsYXRvciBhbmQgaXNcXG5lcXVpdmFsZW50IHRvIDxjb2RlPm5ldyBwNS5Pc2NpbGxhdG9yKCYjMzk7dHJpYW5nbGUmIzM5OylcXG48L2NvZGU+IG9yIGNyZWF0aW5nIGEgcDUuT3NjaWxsYXRvciBhbmQgdGhlbiBjYWxsaW5nXFxuaXRzIG1ldGhvZCA8Y29kZT5zZXRUeXBlKCYjMzk7dHJpYW5nbGUmIzM5Oyk8L2NvZGU+LlxcblNlZSBwNS5Pc2NpbGxhdG9yIGZvciBtZXRob2RzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwiZXh0ZW5kc1wiOiBcInA1Lk9zY2lsbGF0b3JcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZyZXFcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgZnJlcXVlbmN5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LlNhd09zY1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5TYXdPc2NcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuU2F3T3NjXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU0NDMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29uc3RydWN0b3I6IDxjb2RlPm5ldyBwNS5TYXdPc2MoKTwvY29kZT4uXFxuVGhpcyBjcmVhdGVzIGEgU2F3VG9vdGggV2F2ZSBPc2NpbGxhdG9yIGFuZCBpc1xcbmVxdWl2YWxlbnQgdG8gPGNvZGU+IG5ldyBwNS5Pc2NpbGxhdG9yKCYjMzk7c2F3dG9vdGgmIzM5OylcXG48L2NvZGU+IG9yIGNyZWF0aW5nIGEgcDUuT3NjaWxsYXRvciBhbmQgdGhlbiBjYWxsaW5nXFxuaXRzIG1ldGhvZCA8Y29kZT5zZXRUeXBlKCYjMzk7c2F3dG9vdGgmIzM5Oyk8L2NvZGU+LlxcblNlZSBwNS5Pc2NpbGxhdG9yIGZvciBtZXRob2RzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwiZXh0ZW5kc1wiOiBcInA1Lk9zY2lsbGF0b3JcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZyZXFcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgZnJlcXVlbmN5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LlNxck9zY1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5TcXJPc2NcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuU3FyT3NjXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU0NjAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29uc3RydWN0b3I6IDxjb2RlPm5ldyBwNS5TcXJPc2MoKTwvY29kZT4uXFxuVGhpcyBjcmVhdGVzIGEgU3F1YXJlIFdhdmUgT3NjaWxsYXRvciBhbmQgaXNcXG5lcXVpdmFsZW50IHRvIDxjb2RlPiBuZXcgcDUuT3NjaWxsYXRvcigmIzM5O3NxdWFyZSYjMzk7KVxcbjwvY29kZT4gb3IgY3JlYXRpbmcgYSBwNS5Pc2NpbGxhdG9yIGFuZCB0aGVuIGNhbGxpbmdcXG5pdHMgbWV0aG9kIDxjb2RlPnNldFR5cGUoJiMzOTtzcXVhcmUmIzM5Oyk8L2NvZGU+LlxcblNlZSBwNS5Pc2NpbGxhdG9yIGZvciBtZXRob2RzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwiZXh0ZW5kc1wiOiBcInA1Lk9zY2lsbGF0b3JcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZyZXFcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgZnJlcXVlbmN5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LkVudlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5FbnZcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU5MTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RW52ZWxvcGVzIGFyZSBwcmUtZGVmaW5lZCBhbXBsaXR1ZGUgZGlzdHJpYnV0aW9uIG92ZXIgdGltZS5cXG5UeXBpY2FsbHksIGVudmVsb3BlcyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBvdXRwdXQgdm9sdW1lXFxub2YgYW4gb2JqZWN0LCBhIHNlcmllcyBvZiBmYWRlcyByZWZlcnJlZCB0byBhcyBBdHRhY2ssIERlY2F5LFxcblN1c3RhaW4gYW5kIFJlbGVhc2UgKFxcbjxhIGhyZWY9XFxcImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvZS9lYS9BRFNSX3BhcmFtZXRlci5zdmdcXFwiPkFEU1I8L2E+XFxuKS4gRW52ZWxvcGVzIGNhbiBhbHNvIGNvbnRyb2wgb3RoZXIgV2ViIEF1ZGlvIFBhcmFtZXRlcnPigJRmb3IgZXhhbXBsZSwgYSBwNS5FbnYgY2FuXFxuY29udHJvbCBhbiBPc2NpbGxhdG9yJiMzOTtzIGZyZXF1ZW5jeSBsaWtlIHRoaXM6IDxjb2RlPm9zYy5mcmVxKGVudik8L2NvZGU+LjwvcD5cXG48cD5Vc2UgPGNvZGU+PGEgaHJlZj1cXFwiIy9wNS5FbnYvc2V0UmFuZ2VcXFwiPnNldFJhbmdlPC9hPjwvY29kZT4gdG8gY2hhbmdlIHRoZSBhdHRhY2svcmVsZWFzZSBsZXZlbC5cXG5Vc2UgPGNvZGU+PGEgaHJlZj1cXFwiIy9wNS5FbnYvc2V0QURTUlxcXCI+c2V0QURTUjwvYT48L2NvZGU+IHRvIGNoYW5nZSBhdHRhY2tUaW1lLCBkZWNheVRpbWUsIHN1c3RhaW5QZXJjZW50IGFuZCByZWxlYXNlVGltZS48L3A+XFxuPHA+VXNlIHRoZSA8Y29kZT48YSBocmVmPVxcXCIjL3A1LkVudi9wbGF5XFxcIj5wbGF5PC9hPjwvY29kZT4gbWV0aG9kIHRvIHBsYXkgdGhlIGVudGlyZSBlbnZlbG9wZSxcXG50aGUgPGNvZGU+PGEgaHJlZj1cXFwiIy9wNS5FbnYvcmFtcFxcXCI+cmFtcDwvYT48L2NvZGU+IG1ldGhvZCBmb3IgYSBwaW5nYWJsZSB0cmlnZ2VyLFxcbm9yIDxjb2RlPjxhIGhyZWY9XFxcIiMvcDUuRW52L3RyaWdnZXJBdHRhY2tcXFwiPnRyaWdnZXJBdHRhY2s8L2E+PC9jb2RlPi9cXG48Y29kZT48YSBocmVmPVxcXCIjL3A1LkVudi90cmlnZ2VyUmVsZWFzZVxcXCI+dHJpZ2dlclJlbGVhc2U8L2E+PC9jb2RlPiB0byB0cmlnZ2VyIG5vdGVPbi9ub3RlT2ZmLjwvcD5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBhdHRhY2tMZXZlbCA9IDEuMDtcXG52YXIgcmVsZWFzZUxldmVsID0gMDtcXG5cXG52YXIgYXR0YWNrVGltZSA9IDAuMDAxXFxudmFyIGRlY2F5VGltZSA9IDAuMjtcXG52YXIgc3VzUGVyY2VudCA9IDAuMjtcXG52YXIgcmVsZWFzZVRpbWUgPSAwLjU7XFxuXFxudmFyIGVudiwgdHJpT3NjO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuXFxuICB0ZXh0QWxpZ24oQ0VOVEVSKTtcXG4gIHRleHQoJ2NsaWNrIHRvIHBsYXknLCB3aWR0aC8yLCBoZWlnaHQvMik7XFxuXFxuICBlbnYgPSBuZXcgcDUuRW52KCk7XFxuICBlbnYuc2V0QURTUihhdHRhY2tUaW1lLCBkZWNheVRpbWUsIHN1c1BlcmNlbnQsIHJlbGVhc2VUaW1lKTtcXG4gIGVudi5zZXRSYW5nZShhdHRhY2tMZXZlbCwgcmVsZWFzZUxldmVsKTtcXG5cXG4gIHRyaU9zYyA9IG5ldyBwNS5Pc2NpbGxhdG9yKCd0cmlhbmdsZScpO1xcbiAgdHJpT3NjLmFtcChlbnYpO1xcbiAgdHJpT3NjLnN0YXJ0KCk7XFxuICB0cmlPc2MuZnJlcSgyMjApO1xcblxcbiAgY252Lm1vdXNlUHJlc3NlZChwbGF5RW52KTtcXG59XFxuXFxuZnVuY3Rpb24gcGxheUVudigpe1xcbiAgZW52LnBsYXkoKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwicDUuUHVsc2VcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuUHVsc2VcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuUHVsc2VcIixcbiAgICAgICAgICAgIFwiY2xhc3NpdGVtc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luc1wiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjcwOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DcmVhdGVzIGEgUHVsc2Ugb2JqZWN0LCBhbiBvc2NpbGxhdG9yIHRoYXQgaW1wbGVtZW50c1xcblB1bHNlIFdpZHRoIE1vZHVsYXRpb24uXFxuVGhlIHB1bHNlIGlzIGNyZWF0ZWQgd2l0aCB0d28gb3NjaWxsYXRvcnMuXFxuQWNjZXB0cyBhIHBhcmFtZXRlciBmb3IgZnJlcXVlbmN5LCBhbmQgdG8gc2V0IHRoZVxcbndpZHRoIGJldHdlZW4gdGhlIHB1bHNlcy4gU2VlIDxhIGhyZWY9XFxcIlxcbmh0dHA6Ly9wNWpzLm9yZy9yZWZlcmVuY2UvIy9wNS5Pc2NpbGxhdG9yXFxcIj5cXG48Y29kZT5wNS5Pc2NpbGxhdG9yPC9jb2RlPiBmb3IgYSBmdWxsIGxpc3Qgb2YgbWV0aG9kcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImV4dGVuZHNcIjogXCJwNS5Pc2NpbGxhdG9yXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmcmVxXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5GcmVxdWVuY3kgaW4gb3NjaWxsYXRpb25zIHBlciBzZWNvbmQgKEh6KTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ3XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5XaWR0aCBiZXR3ZWVuIHRoZSBwdWxzZXMgKDAgdG8gMS4wLFxcbiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gMCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHB1bHNlO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZCgwKTtcXG5cXG4gIC8vIENyZWF0ZSBhbmQgc3RhcnQgdGhlIHB1bHNlIHdhdmUgb3NjaWxsYXRvclxcbiAgcHVsc2UgPSBuZXcgcDUuUHVsc2UoKTtcXG4gIHB1bHNlLmFtcCgwLjUpO1xcbiAgcHVsc2UuZnJlcSgyMjApO1xcbiAgcHVsc2Uuc3RhcnQoKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIHZhciB3ID0gbWFwKG1vdXNlWCwgMCwgd2lkdGgsIDAsIDEpO1xcbiAgdyA9IGNvbnN0cmFpbih3LCAwLCAxKTtcXG4gIHB1bHNlLndpZHRoKHcpXFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1Lk5vaXNlXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1Lk5vaXNlXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1Lk5vaXNlXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDY4ODYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Tm9pc2UgaXMgYSB0eXBlIG9mIG9zY2lsbGF0b3IgdGhhdCBnZW5lcmF0ZXMgYSBidWZmZXIgd2l0aCByYW5kb20gdmFsdWVzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiZXh0ZW5kc1wiOiBcInA1Lk9zY2lsbGF0b3JcIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlR5cGUgb2Ygbm9pc2UgY2FuIGJlICYjMzk7d2hpdGUmIzM5OyAoZGVmYXVsdCksXFxuICAgICAgICAgICAgICAgICAgICAgJiMzOTticm93biYjMzk7IG9yICYjMzk7cGluayYjMzk7LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwicDUuQXVkaW9JblwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5BdWRpb0luXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LkF1ZGlvSW5cIixcbiAgICAgICAgICAgIFwiY2xhc3NpdGVtc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luc1wiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzA3NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5HZXQgYXVkaW8gZnJvbSBhbiBpbnB1dCwgaS5lLiB5b3VyIGNvbXB1dGVyJiMzOTtzIG1pY3JvcGhvbmUuPC9wPlxcblxcbjxwPlR1cm4gdGhlIG1pYyBvbi9vZmYgd2l0aCB0aGUgc3RhcnQoKSBhbmQgc3RvcCgpIG1ldGhvZHMuIFdoZW4gdGhlIG1pY1xcbmlzIG9uLCBpdHMgdm9sdW1lIGNhbiBiZSBtZWFzdXJlZCB3aXRoIGdldExldmVsIG9yIGJ5IGNvbm5lY3RpbmcgYW5cXG5GRlQgb2JqZWN0LjwvcD5cXG5cXG48cD5JZiB5b3Ugd2FudCB0byBoZWFyIHRoZSBBdWRpb0luLCB1c2UgdGhlIC5jb25uZWN0KCkgbWV0aG9kLlxcbkF1ZGlvSW4gZG9lcyBub3QgY29ubmVjdCB0byBwNS5zb3VuZCBvdXRwdXQgYnkgZGVmYXVsdCB0byBwcmV2ZW50XFxuZmVlZGJhY2suPC9wPlxcblxcbjxwPjxlbT5Ob3RlOiBUaGlzIHVzZXMgdGhlIDxhIGhyZWY9XFxcImh0dHA6Ly9jYW5pdXNlLmNvbS9zdHJlYW1cXFwiPmdldFVzZXJNZWRpYS9cXG5TdHJlYW08L2E+IEFQSSwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSBjZXJ0YWluIGJyb3dzZXJzLiBBY2Nlc3MgaW4gQ2hyb21lIGJyb3dzZXJcXG5pcyBsaW1pdGVkIHRvIGxvY2FsaG9zdCBhbmQgaHR0cHMsIGJ1dCBhY2Nlc3Mgb3ZlciBodHRwIG1heSBiZSBsaW1pdGVkLjwvZW0+PC9wPlwiLFxuICAgICAgICAgICAgXCJpc19jb25zdHJ1Y3RvclwiOiAxLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXJyb3JDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QSBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZXJlIGlzIGFuIGVycm9yXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2luZyB0aGUgQXVkaW9Jbi4gRm9yIGV4YW1wbGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmFyaSBhbmQgaU9TIGRldmljZXMgZG8gbm90XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBhbGxvdyBtaWNyb3Bob25lIGFjY2Vzcy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgbWljO1xcbmZ1bmN0aW9uIHNldHVwKCl7XFxuICBtaWMgPSBuZXcgcDUuQXVkaW9JbigpXFxuICBtaWMuc3RhcnQoKTtcXG59XFxuZnVuY3Rpb24gZHJhdygpe1xcbiAgYmFja2dyb3VuZCgwKTtcXG4gIG1pY0xldmVsID0gbWljLmdldExldmVsKCk7XFxuICBlbGxpcHNlKHdpZHRoLzIsIGNvbnN0cmFpbihoZWlnaHQtbWljTGV2ZWwqaGVpZ2h0KjUsIDAsIGhlaWdodCksIDEwLCAxMCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LkVmZmVjdFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5FZmZlY3RcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuRWZmZWN0XCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc5NzAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RWZmZWN0IGlzIGEgYmFzZSBjbGFzcyBmb3IgYXVkaW8gZWZmZWN0cyBpbiBwNS4gPGJyPlxcblRoaXMgbW9kdWxlIGhhbmRsZXMgdGhlIG5vZGVzIGFuZCBtZXRob2RzIHRoYXQgYXJlXFxuY29tbW9uIGFuZCB1c2VmdWwgZm9yIGN1cnJlbnQgYW5kIGZ1dHVyZSBlZmZlY3RzLjwvcD5cXG48cD5UaGlzIGNsYXNzIGlzIGV4dGVuZGVkIGJ5IDxhIGhyZWY9XFxcInJlZmVyZW5jZS8jL3A1LkRpc3RvcnRpb25cXFwiPnA1LkRpc3RvcnRpb248L2E+LFxcbjxhIGhyZWY9XFxcInJlZmVyZW5jZS8jL3A1LkNvbXByZXNzb3JcXFwiPnA1LkNvbXByZXNzb3I8L2E+LFxcbjxhIGhyZWY9XFxcInJlZmVyZW5jZS8jL3A1LkRlbGF5XFxcIj5wNS5EZWxheTwvYT4sXFxuPGEgaHJlZj1cXFwicmVmZXJlbmNlLyMvcDUuRmlsdGVyXFxcIj5wNS5GaWx0ZXI8L2E+LFxcbjxhIGhyZWY9XFxcInJlZmVyZW5jZS8jL3A1LlJldmVyYlxcXCI+cDUuUmV2ZXJiPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhY1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmVmZXJlbmNlIHRvIHRoZSBhdWRpbyBjb250ZXh0IG9mIHRoZSBwNSBvYmplY3Q8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaW5wdXRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdhaW4gTm9kZSBlZmZlY3Qgd3JhcHBlcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXVkaW9Ob2RlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdhaW4gTm9kZSBlZmZlY3Qgd3JhcHBlcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXVkaW9Ob2RlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJfZHJ5d2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Ub25lLkpTIENyb3NzRmFkZSBub2RlIChkZWZhdWx0cyB0byB2YWx1ZTogMSk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5FZmZlY3RzIHRoYXQgZXh0ZW5kIHRoaXMgY2xhc3Mgc2hvdWxkIGNvbm5lY3RcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSB3ZXQgc2lnbmFsIHRvIHRoaXMgZ2FpbiBub2RlLCBzbyB0aGF0IGRyeSBhbmQgd2V0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxzIGFyZSBtaXhlZCBwcm9wZXJseS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkF1ZGlvTm9kZVwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwicDUuRmlsdGVyXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LkZpbHRlclwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5GaWx0ZXJcIixcbiAgICAgICAgICAgIFwiY2xhc3NpdGVtc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luc1wiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODEwMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD48cD5BIHA1LkZpbHRlciB1c2VzIGEgV2ViIEF1ZGlvIEJpcXVhZCBGaWx0ZXIgdG8gZmlsdGVyXFxudGhlIGZyZXF1ZW5jeSByZXNwb25zZSBvZiBhbiBpbnB1dCBzb3VyY2UuIFN1YmNsYXNzZXNcXG5pbmNsdWRlOjwvcD48L3A+XFxuPHVsPlxcbjxsaT48YSBocmVmPVxcXCIvcmVmZXJlbmNlLyMvcDUuTG93UGFzc1xcXCI+PGNvZGU+cDUuTG93UGFzczwvY29kZT48L2E+OlxcbkFsbG93cyBmcmVxdWVuY2llcyBiZWxvdyB0aGUgY3V0b2ZmIGZyZXF1ZW5jeSB0byBwYXNzIHRocm91Z2gsXFxuYW5kIGF0dGVudWF0ZXMgZnJlcXVlbmNpZXMgYWJvdmUgdGhlIGN1dG9mZi48YnIvPjwvbGk+XFxuPGxpPjxhIGhyZWY9XFxcIi9yZWZlcmVuY2UvIy9wNS5IaWdoUGFzc1xcXCI+PGNvZGU+cDUuSGlnaFBhc3M8L2NvZGU+PC9hPjpcXG5UaGUgb3Bwb3NpdGUgb2YgYSBsb3dwYXNzIGZpbHRlci4gPGJyLz48L2xpPlxcbjxsaT48YSBocmVmPVxcXCIvcmVmZXJlbmNlLyMvcDUuQmFuZFBhc3NcXFwiPjxjb2RlPnA1LkJhbmRQYXNzPC9jb2RlPjwvYT46XFxuQWxsb3dzIGEgcmFuZ2Ugb2YgZnJlcXVlbmNpZXMgdG8gcGFzcyB0aHJvdWdoIGFuZCBhdHRlbnVhdGVzXFxudGhlIGZyZXF1ZW5jaWVzIGJlbG93IGFuZCBhYm92ZSB0aGlzIGZyZXF1ZW5jeSByYW5nZS48YnIvPjwvbGk+XFxuPC91bD5cXG48cD5UaGUgPGNvZGU+LnJlcygpPC9jb2RlPiBtZXRob2QgY29udHJvbHMgZWl0aGVyIHdpZHRoIG9mIHRoZVxcbmJhbmRwYXNzLCBvciByZXNvbmFuY2Ugb2YgdGhlIGxvdy9oaWdocGFzcyBjdXRvZmYgZnJlcXVlbmN5LjwvcD5cXG48cD5UaGlzIGNsYXNzIGV4dGVuZHMgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0XFxcIj5wNS5FZmZlY3Q8L2E+Llxcbk1ldGhvZHMgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2FtcFxcXCI+YW1wKCk8L2E+LCA8YSBocmVmID0gXFxcIi9yZWZlcmVuY2UvIy9wNS5FZmZlY3QvY2hhaW5cXFwiPmNoYWluKCk8L2E+LFxcbjxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9kcnl3ZXRcXFwiPmRyeXdldCgpPC9hPiwgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2Nvbm5lY3RcXFwiPmNvbm5lY3QoKTwvYT4sIGFuZFxcbjxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9kaXNjb25uZWN0XFxcIj5kaXNjb25uZWN0KCk8L2E+IGFyZSBhdmFpbGFibGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJleHRlbmRzXCI6IFwicDUuRWZmZWN0XCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0eXBlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD4mIzM5O2xvd3Bhc3MmIzM5OyAoZGVmYXVsdCksICYjMzk7aGlnaHBhc3MmIzM5OywgJiMzOTtiYW5kcGFzcyYjMzk7PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBmZnQsIG5vaXNlLCBmaWx0ZXI7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBmaWxsKDI1NSwgNDAsIDI1NSk7XFxuXFxuICBmaWx0ZXIgPSBuZXcgcDUuQmFuZFBhc3MoKTtcXG5cXG4gIG5vaXNlID0gbmV3IHA1Lk5vaXNlKCk7XFxuICAvLyBkaXNjb25uZWN0IHVuZmlsdGVyZWQgbm9pc2UsXFxuICAvLyBhbmQgY29ubmVjdCB0byBmaWx0ZXJcXG4gIG5vaXNlLmRpc2Nvbm5lY3QoKTtcXG4gIG5vaXNlLmNvbm5lY3QoZmlsdGVyKTtcXG4gIG5vaXNlLnN0YXJ0KCk7XFxuXFxuICBmZnQgPSBuZXcgcDUuRkZUKCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDMwKTtcXG5cXG4gIC8vIHNldCB0aGUgQmFuZFBhc3MgZnJlcXVlbmN5IGJhc2VkIG9uIG1vdXNlWFxcbiAgdmFyIGZyZXEgPSBtYXAobW91c2VYLCAwLCB3aWR0aCwgMjAsIDEwMDAwKTtcXG4gIGZpbHRlci5mcmVxKGZyZXEpO1xcbiAgLy8gZ2l2ZSB0aGUgZmlsdGVyIGEgbmFycm93IGJhbmQgKGxvd2VyIHJlcyA9IHdpZGVyIGJhbmRwYXNzKVxcbiAgZmlsdGVyLnJlcyg1MCk7XFxuXFxuICAvLyBkcmF3IGZpbHRlcmVkIHNwZWN0cnVtXFxuICB2YXIgc3BlY3RydW0gPSBmZnQuYW5hbHl6ZSgpO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3BlY3RydW0ubGVuZ3RoOyBpKyspIHtcXG4gICAgdmFyIHggPSBtYXAoaSwgMCwgc3BlY3RydW0ubGVuZ3RoLCAwLCB3aWR0aCk7XFxuICAgIHZhciBoID0gLWhlaWdodCArIG1hcChzcGVjdHJ1bVtpXSwgMCwgMjU1LCBoZWlnaHQsIDApO1xcbiAgICByZWN0KHgsIGhlaWdodCwgd2lkdGgvc3BlY3RydW0ubGVuZ3RoLCBoKTtcXG4gIH1cXG5cXG4gIGlzTW91c2VPdmVyQ2FudmFzKCk7XFxufVxcblxcbmZ1bmN0aW9uIGlzTW91c2VPdmVyQ2FudmFzKCkge1xcbiAgdmFyIG1YID0gbW91c2VYLCBtWSA9IG1vdXNlWTtcXG4gIGlmIChtWCA+IDAgJiYgbVggPCB3aWR0aCAmJiBtWSA8IGhlaWdodCAmJiBtWSA+IDApIHtcXG4gICAgbm9pc2UuYW1wKDAuNSwgMC4yKTtcXG4gIH0gZWxzZSB7XFxuICAgIG5vaXNlLmFtcCgwLCAwLjIpO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5Mb3dQYXNzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1Lkxvd1Bhc3NcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuTG93UGFzc1wiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4MzMyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnN0cnVjdG9yOiA8Y29kZT5uZXcgcDUuTG93UGFzcygpPC9jb2RlPiBGaWx0ZXIuXFxuVGhpcyBpcyB0aGUgc2FtZSBhcyBjcmVhdGluZyBhIHA1LkZpbHRlciBhbmQgdGhlbiBjYWxsaW5nXFxuaXRzIG1ldGhvZCA8Y29kZT5zZXRUeXBlKCYjMzk7bG93cGFzcyYjMzk7KTwvY29kZT4uXFxuU2VlIHA1LkZpbHRlciBmb3IgbWV0aG9kcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcImV4dGVuZHNcIjogXCJwNS5GaWx0ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcInA1LkhpZ2hQYXNzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LkhpZ2hQYXNzXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LkhpZ2hQYXNzXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgzNDYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29uc3RydWN0b3I6IDxjb2RlPm5ldyBwNS5IaWdoUGFzcygpPC9jb2RlPiBGaWx0ZXIuXFxuVGhpcyBpcyB0aGUgc2FtZSBhcyBjcmVhdGluZyBhIHA1LkZpbHRlciBhbmQgdGhlbiBjYWxsaW5nXFxuaXRzIG1ldGhvZCA8Y29kZT5zZXRUeXBlKCYjMzk7aGlnaHBhc3MmIzM5Oyk8L2NvZGU+LlxcblNlZSBwNS5GaWx0ZXIgZm9yIG1ldGhvZHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpc19jb25zdHJ1Y3RvclwiOiAxLFxuICAgICAgICAgICAgXCJleHRlbmRzXCI6IFwicDUuRmlsdGVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5CYW5kUGFzc1wiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5CYW5kUGFzc1wiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5CYW5kUGFzc1wiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4MzYwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnN0cnVjdG9yOiA8Y29kZT5uZXcgcDUuQmFuZFBhc3MoKTwvY29kZT4gRmlsdGVyLlxcblRoaXMgaXMgdGhlIHNhbWUgYXMgY3JlYXRpbmcgYSBwNS5GaWx0ZXIgYW5kIHRoZW4gY2FsbGluZ1xcbml0cyBtZXRob2QgPGNvZGU+c2V0VHlwZSgmIzM5O2JhbmRwYXNzJiMzOTspPC9jb2RlPi5cXG5TZWUgcDUuRmlsdGVyIGZvciBtZXRob2RzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwiZXh0ZW5kc1wiOiBcInA1LkZpbHRlclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicDUuRVFcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuRVFcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuRVFcIixcbiAgICAgICAgICAgIFwiY2xhc3NpdGVtc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luc1wiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODQyOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5FUSBpcyBhbiBhdWRpbyBlZmZlY3QgdGhhdCBwZXJmb3JtcyB0aGUgZnVuY3Rpb24gb2YgYSBtdWx0aWJhbmRcXG5hdWRpbyBlcXVhbGl6ZXIuIEVxdWFsaXphdGlvbiBpcyB1c2VkIHRvIGFkanVzdCB0aGUgYmFsYW5jZSBvZlxcbmZyZXF1ZW5jeSBjb21wb2VuZW50cyBvZiBhbiBhdWRpbyBzaWduYWwuIFRoaXMgcHJvY2VzcyBpcyBjb21tb25seSB1c2VkXFxuaW4gc291bmQgcHJvZHVjdGlvbiBhbmQgcmVjb3JkaW5nIHRvIGNoYW5nZSB0aGUgd2F2ZWZvcm0gYmVmb3JlIGl0IHJlYWNoZXNcXG5hIHNvdW5kIG91dHB1dCBkZXZpY2UuIEVRIGNhbiBhbHNvIGJlIHVzZWQgYXMgYW4gYXVkaW8gZWZmZWN0IHRvIGNyZWF0ZVxcbmludGVyZXN0aW5nIGRpc3RvcnRpb25zIGJ5IGZpbHRlcmluZyBvdXQgcGFydHMgb2YgdGhlIHNwZWN0cnVtLiBwNS5FUSBpc1xcbmJ1aWx0IHVzaW5nIGEgY2hhaW4gb2YgV2ViIEF1ZGlvIEJpcXVhZCBGaWx0ZXIgTm9kZXMgYW5kIGNhbiBiZVxcbmluc3RhbnRpYXRlZCB3aXRoIDMgb3IgOCBiYW5kcy4gQmFuZHMgY2FuIGJlIGFkZGVkIG9yIHJlbW92ZWQgZnJvbVxcbnRoZSBFUSBieSBkaXJlY3RseSBtb2RpZnlpbmcgcDUuRVEuYmFuZHMgKHRoZSBhcnJheSB0aGF0IHN0b3JlcyBmaWx0ZXJzKS48L3A+XFxuPHA+VGhpcyBjbGFzcyBleHRlbmRzIDxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdFxcXCI+cDUuRWZmZWN0PC9hPi5cXG5NZXRob2RzIDxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9hbXBcXFwiPmFtcCgpPC9hPiwgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2NoYWluXFxcIj5jaGFpbigpPC9hPixcXG48YSBocmVmID0gXFxcIi9yZWZlcmVuY2UvIy9wNS5FZmZlY3QvZHJ5d2V0XFxcIj5kcnl3ZXQoKTwvYT4sIDxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9jb25uZWN0XFxcIj5jb25uZWN0KCk8L2E+LCBhbmRcXG48YSBocmVmID0gXFxcIi9yZWZlcmVuY2UvIy9wNS5FZmZlY3QvZGlzY29ubmVjdFxcXCI+ZGlzY29ubmVjdCgpPC9hPiBhcmUgYXZhaWxhYmxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwiZXh0ZW5kc1wiOiBcInA1LkVmZmVjdFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiX2Vxc2l6ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29uc3RydWN0b3Igd2lsbCBhY2NlcHQgMyBvciA4LCBkZWZhdWx0cyB0byAzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicDUuRVEgb2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgZXE7XFxudmFyIGJhbmRfbmFtZXM7XFxudmFyIGJhbmRfaW5kZXg7XFxuXFxudmFyIHNvdW5kRmlsZSwgcGxheTtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgc291bmRGb3JtYXRzKCdtcDMnLCAnb2dnJyk7XFxuICBzb3VuZEZpbGUgPSBsb2FkU291bmQoJ2Fzc2V0cy9iZWF0Jyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgZXEgPSBuZXcgcDUuRVEoMyk7XFxuICBzb3VuZEZpbGUuZGlzY29ubmVjdCgpO1xcbiAgZXEucHJvY2Vzcyhzb3VuZEZpbGUpO1xcblxcbiAgYmFuZF9uYW1lcyA9IFsnbG93cycsJ21pZHMnLCdoaWdocyddO1xcbiAgYmFuZF9pbmRleCA9IDA7XFxuICBwbGF5ID0gZmFsc2U7XFxuICB0ZXh0QWxpZ24oQ0VOVEVSKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMzApO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMjU1KTtcXG4gIHRleHQoJ2NsaWNrIHRvIGtpbGwnLDUwLDI1KTtcXG5cXG4gIGZpbGwoMjU1LCA0MCwgMjU1KTtcXG4gIHRleHRTaXplKDI2KTtcXG4gIHRleHQoYmFuZF9uYW1lc1tiYW5kX2luZGV4XSw1MCw1NSk7XFxuXFxuICBmaWxsKDI1NSk7XFxuICB0ZXh0U2l6ZSg5KTtcXG4gIHRleHQoJ3NwYWNlID0gcGxheS9wYXVzZScsNTAsODApO1xcbn1cXG5cXG4vL0lmIG1vdXNlIGlzIG92ZXIgY2FudmFzLCBjeWNsZSB0byB0aGUgbmV4dCBiYW5kIGFuZCBraWxsIHRoZSBmcmVxdWVuY3lcXG5mdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVxLmJhbmRzLmxlbmd0aDsgaSsrKSB7XFxuICAgIGVxLmJhbmRzW2ldLmdhaW4oMCk7XFxuICB9XFxuICBlcS5iYW5kc1tiYW5kX2luZGV4XS5nYWluKC00MCk7XFxuICBpZiAobW91c2VYID4gMCAmJiBtb3VzZVggPCB3aWR0aCAmJiBtb3VzZVkgPCBoZWlnaHQgJiYgbW91c2VZID4gMCkge1xcbiAgICBiYW5kX2luZGV4ID09PSAyID8gYmFuZF9pbmRleCA9IDAgOiBiYW5kX2luZGV4Kys7XFxuICB9XFxufVxcblxcbi8vdXNlIHNwYWNlIGJhciB0byB0cmlnZ2VyIHBsYXkgLyBwYXVzZVxcbmZ1bmN0aW9uIGtleVByZXNzZWQoKSB7XFxuICBpZiAoa2V5PT09JyAnKSB7XFxuICAgIHBsYXkgPSAhcGxheVxcbiAgICBwbGF5ID8gc291bmRGaWxlLmxvb3AoKSA6IHNvdW5kRmlsZS5wYXVzZSgpO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5QYW5uZXIzRFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5QYW5uZXIzRFwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5QYW5uZXIzRFwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4NjE5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlBhbm5lcjNEIGlzIGJhc2VkIG9uIHRoZSA8YSB0aXRsZT1cXFwiV2ViIEF1ZGlvIFBhbm5lciBkb2NzXFxcIiAgaHJlZj1cXG5cXFwiaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bhbm5lck5vZGVcXFwiPlxcbldlYiBBdWRpbyBTcGF0aWFsIFBhbm5lciBOb2RlPC9hPi5cXG5UaGlzIHBhbm5lciBpcyBhIHNwYXRpYWwgcHJvY2Vzc2luZyBub2RlIHRoYXQgYWxsb3dzIGF1ZGlvIHRvIGJlIHBvc2l0aW9uZWRcXG5hbmQgb3JpZW50ZWQgaW4gM0Qgc3BhY2UuPC9wPlxcbjxwPlRoZSBwb3NpdGlvbiBpcyByZWxhdGl2ZSB0byBhbiA8YSB0aXRsZT1cXFwiV2ViIEF1ZGlvIExpc3RlbmVyIGRvY3NcXFwiIGhyZWY9XFxuXFxcImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BdWRpb0xpc3RlbmVyXFxcIj5cXG5BdWRpbyBDb250ZXh0IExpc3RlbmVyPC9hPiwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkXFxuYnkgPGNvZGU+cDUuc291bmRPdXQuYXVkaW9jb250ZXh0Lmxpc3RlbmVyPC9jb2RlPjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInA1LkRlbGF5XCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LkRlbGF5XCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LkRlbGF5XCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDkwNjgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RGVsYXkgaXMgYW4gZWNobyBlZmZlY3QuIEl0IHByb2Nlc3NlcyBhbiBleGlzdGluZyBzb3VuZCBzb3VyY2UsXFxuYW5kIG91dHB1dHMgYSBkZWxheWVkIHZlcnNpb24gb2YgdGhhdCBzb3VuZC4gVGhlIHA1LkRlbGF5IGNhblxcbnByb2R1Y2UgZGlmZmVyZW50IGVmZmVjdHMgZGVwZW5kaW5nIG9uIHRoZSBkZWxheVRpbWUsIGZlZWRiYWNrLFxcbmZpbHRlciwgYW5kIHR5cGUuIEluIHRoZSBleGFtcGxlIGJlbG93LCBhIGZlZWRiYWNrIG9mIDAuNSAodGhlXFxuZGVmYXVsIHZhbHVlKSB3aWxsIHByb2R1Y2UgYSBsb29waW5nIGRlbGF5IHRoYXQgZGVjcmVhc2VzIGluXFxudm9sdW1lIGJ5IDUwJSBlYWNoIHJlcGVhdC4gQSBmaWx0ZXIgd2lsbCBjdXQgb3V0IHRoZSBoaWdoXFxuZnJlcXVlbmNpZXMgc28gdGhhdCB0aGUgZGVsYXkgZG9lcyBub3Qgc291bmQgYXMgcGllcmNpbmcgYXMgdGhlXFxub3JpZ2luYWwgc291cmNlLjwvcD5cXG48cD5UaGlzIGNsYXNzIGV4dGVuZHMgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0XFxcIj5wNS5FZmZlY3Q8L2E+Llxcbk1ldGhvZHMgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2FtcFxcXCI+YW1wKCk8L2E+LCA8YSBocmVmID0gXFxcIi9yZWZlcmVuY2UvIy9wNS5FZmZlY3QvY2hhaW5cXFwiPmNoYWluKCk8L2E+LFxcbjxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9kcnl3ZXRcXFwiPmRyeXdldCgpPC9hPiwgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2Nvbm5lY3RcXFwiPmNvbm5lY3QoKTwvYT4sIGFuZFxcbjxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9kaXNjb25uZWN0XFxcIj5kaXNjb25uZWN0KCk8L2E+IGFyZSBhdmFpbGFibGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJleHRlbmRzXCI6IFwicDUuRWZmZWN0XCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgbm9pc2UsIGVudiwgZGVsYXk7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMjU1KTtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgdGV4dCgnY2xpY2sgdG8gcGxheScsIHdpZHRoLzIsIGhlaWdodC8yKTtcXG5cXG4gIG5vaXNlID0gbmV3IHA1Lk5vaXNlKCdicm93bicpO1xcbiAgbm9pc2UuYW1wKDApO1xcbiAgbm9pc2Uuc3RhcnQoKTtcXG5cXG4gIGRlbGF5ID0gbmV3IHA1LkRlbGF5KCk7XFxuXFxuICAvLyBkZWxheS5wcm9jZXNzKCkgYWNjZXB0cyA0IHBhcmFtZXRlcnM6XFxuICAvLyBzb3VyY2UsIGRlbGF5VGltZSwgZmVlZGJhY2ssIGZpbHRlciBmcmVxdWVuY3lcXG4gIC8vIHBsYXkgd2l0aCB0aGVzZSBudW1iZXJzISFcXG4gIGRlbGF5LnByb2Nlc3Mobm9pc2UsIC4xMiwgLjcsIDIzMDApO1xcblxcbiAgLy8gcGxheSB0aGUgbm9pc2Ugd2l0aCBhbiBlbnZlbG9wZSxcXG4gIC8vIGEgc2VyaWVzIG9mIGZhZGVzICggdGltZSAvIHZhbHVlIHBhaXJzIClcXG4gIGVudiA9IG5ldyBwNS5FbnYoLjAxLCAwLjIsIC4yLCAuMSk7XFxufVxcblxcbi8vIG1vdXNlQ2xpY2sgdHJpZ2dlcnMgZW52ZWxvcGVcXG5mdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XFxuICAvLyBpcyBtb3VzZSBvdmVyIGNhbnZhcz9cXG4gIGlmIChtb3VzZVggPiAwICYmIG1vdXNlWCA8IHdpZHRoICYmIG1vdXNlWSA+IDAgJiYgbW91c2VZIDwgaGVpZ2h0KSB7XFxuICAgIGVudi5wbGF5KG5vaXNlKTtcXG4gIH1cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwicDUuUmV2ZXJiXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LlJldmVyYlwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5SZXZlcmJcIixcbiAgICAgICAgICAgIFwiY2xhc3NpdGVtc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luc1wiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTM0NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXZlcmIgYWRkcyBkZXB0aCB0byBhIHNvdW5kIHRocm91Z2ggYSBsYXJnZSBudW1iZXIgb2YgZGVjYXlpbmdcXG5lY2hvZXMuIEl0IGNyZWF0ZXMgdGhlIHBlcmNlcHRpb24gdGhhdCBzb3VuZCBpcyBvY2N1cnJpbmcgaW4gYVxcbnBoeXNpY2FsIHNwYWNlLiBUaGUgcDUuUmV2ZXJiIGhhcyBwYXJhbXRlcnMgZm9yIFRpbWUgKGhvdyBsb25nIGRvZXMgdGhlXFxucmV2ZXJiIGxhc3QpIGFuZCBkZWNheVJhdGUgKGhvdyBtdWNoIHRoZSBzb3VuZCBkZWNheXMgd2l0aCBlYWNoIGVjaG8pXFxudGhhdCBjYW4gYmUgc2V0IHdpdGggdGhlIC5zZXQoKSBvciAucHJvY2VzcygpIG1ldGhvZHMuIFRoZSBwNS5Db252b2x2ZXJcXG5leHRlbmRzIHA1LlJldmVyYiBhbGxvd2luZyB5b3UgdG8gcmVjcmVhdGUgdGhlIHNvdW5kIG9mIGFjdHVhbCBwaHlzaWNhbFxcbnNwYWNlcyB0aHJvdWdoIGNvbnZvbHV0aW9uLjwvcD5cXG48cD5UaGlzIGNsYXNzIGV4dGVuZHMgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0XFxcIj5wNS5FZmZlY3Q8L2E+Llxcbk1ldGhvZHMgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2FtcFxcXCI+YW1wKCk8L2E+LCA8YSBocmVmID0gXFxcIi9yZWZlcmVuY2UvIy9wNS5FZmZlY3QvY2hhaW5cXFwiPmNoYWluKCk8L2E+LFxcbjxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9kcnl3ZXRcXFwiPmRyeXdldCgpPC9hPiwgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2Nvbm5lY3RcXFwiPmNvbm5lY3QoKTwvYT4sIGFuZFxcbjxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9kaXNjb25uZWN0XFxcIj5kaXNjb25uZWN0KCk8L2E+IGFyZSBhdmFpbGFibGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJleHRlbmRzXCI6IFwicDUuRWZmZWN0XCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgc291bmRGaWxlLCByZXZlcmI7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIHNvdW5kRmlsZSA9IGxvYWRTb3VuZCgnYXNzZXRzL0RhbXNjcmF5X0RhbmNpbmdUaWdlci5tcDMnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICByZXZlcmIgPSBuZXcgcDUuUmV2ZXJiKCk7XFxuICBzb3VuZEZpbGUuZGlzY29ubmVjdCgpOyAvLyBzbyB3ZSdsbCBvbmx5IGhlYXIgcmV2ZXJiLi4uXFxuXFxuICAvLyBjb25uZWN0IHNvdW5kRmlsZSB0byByZXZlcmIsIHByb2Nlc3Mgdy9cXG4gIC8vIDMgc2Vjb25kIHJldmVyYlRpbWUsIGRlY2F5UmF0ZSBvZiAyJVxcbiAgcmV2ZXJiLnByb2Nlc3Moc291bmRGaWxlLCAzLCAyKTtcXG4gIHNvdW5kRmlsZS5wbGF5KCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LkNvbnZvbHZlclwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5Db252b2x2ZXJcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuQ29udm9sdmVyXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDk1MDUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cDUuQ29udm9sdmVyIGV4dGVuZHMgcDUuUmV2ZXJiLiBJdCBjYW4gZW11bGF0ZSB0aGUgc291bmQgb2YgcmVhbFxcbnBoeXNpY2FsIHNwYWNlcyB0aHJvdWdoIGEgcHJvY2VzcyBjYWxsZWQgPGEgaHJlZj1cXFwiXFxuaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29udm9sdXRpb25fcmV2ZXJiI1JlYWxfc3BhY2Vfc2ltdWxhdGlvblxcXCI+XFxuY29udm9sdXRpb248L2E+LjwvcD5cXG5cXG48cD5Db252b2x1dGlvbiBtdWx0aXBsaWVzIGFueSBhdWRpbyBpbnB1dCBieSBhbiAmcXVvdDtpbXB1bHNlIHJlc3BvbnNlJnF1b3Q7XFxudG8gc2ltdWxhdGUgdGhlIGRpc3BlcnNpb24gb2Ygc291bmQgb3ZlciB0aW1lLiBUaGUgaW1wdWxzZSByZXNwb25zZSBpc1xcbmdlbmVyYXRlZCBmcm9tIGFuIGF1ZGlvIGZpbGUgdGhhdCB5b3UgcHJvdmlkZS4gT25lIHdheSB0b1xcbmdlbmVyYXRlIGFuIGltcHVsc2UgcmVzcG9uc2UgaXMgdG8gcG9wIGEgYmFsbG9vbiBpbiBhIHJldmVyYmVyYW50IHNwYWNlXFxuYW5kIHJlY29yZCB0aGUgZWNoby4gQ29udm9sdXRpb24gY2FuIGFsc28gYmUgdXNlZCB0byBleHBlcmltZW50IHdpdGhcXG5zb3VuZC48L3A+XFxuXFxuPHA+VXNlIHRoZSBtZXRob2QgPGNvZGU+Y3JlYXRlQ29udm9sdXRpb24ocGF0aCk8L2NvZGU+IHRvIGluc3RhbnRpYXRlIGFcXG5wNS5Db252b2x2ZXIgd2l0aCBhIHBhdGggdG8geW91ciBpbXB1bHNlIHJlc3BvbnNlIGF1ZGlvIGZpbGUuPC9wPlwiLFxuICAgICAgICAgICAgXCJleHRlbmRzXCI6IFwicDUuRWZmZWN0XCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRoXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wYXRoIHRvIGEgc291bmQgZmlsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBsb2FkaW5nIHN1Y2NlZWRzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXJyb3JDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gY2FsbCBpZiBsb2FkaW5nIGZhaWxzLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgYW4gZXJyb3Igb3JcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTEh0dHBSZXF1ZXN0IG9iamVjdCB3aXRoIGluZm9ybWF0aW9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm91dCB3aGF0IHdlbnQgd3JvbmcuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIGNWZXJiLCBzb3VuZDtcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgLy8gV2UgaGF2ZSBib3RoIE1QMyBhbmQgT0dHIHZlcnNpb25zIG9mIGFsbCBzb3VuZCBhc3NldHNcXG4gIHNvdW5kRm9ybWF0cygnb2dnJywgJ21wMycpO1xcblxcbiAgLy8gVHJ5IHJlcGxhY2luZyAnYngtc3ByaW5nJyB3aXRoIG90aGVyIHNvdW5kZmlsZXMgbGlrZVxcbiAgLy8gJ2NvbmNyZXRlLXR1bm5lbCcgJ3NtYWxsLXBsYXRlJyAnZHJ1bScgJ2JlYXRib3gnXFxuICBjVmVyYiA9IGNyZWF0ZUNvbnZvbHZlcignYXNzZXRzL2J4LXNwcmluZy5tcDMnKTtcXG5cXG4gIC8vIFRyeSByZXBsYWNpbmcgJ0RhbXNjcmF5X0RhbmNpbmdUaWdlcicgd2l0aFxcbiAgLy8gJ2JlYXQnLCAnZG9vcmJlbGwnLCBsdWNreV9kcmFnb25zJ1xcbiAgc291bmQgPSBsb2FkU291bmQoJ2Fzc2V0cy9EYW1zY3JheV9EYW5jaW5nVGlnZXIubXAzJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy8gZGlzY29ubmVjdCBmcm9tIG1hc3RlciBvdXRwdXQuLi5cXG4gIHNvdW5kLmRpc2Nvbm5lY3QoKTtcXG5cXG4gIC8vIC4uLmFuZCBwcm9jZXNzIHdpdGggY1ZlcmJcXG4gIC8vIHNvIHRoYXQgd2Ugb25seSBoZWFyIHRoZSBjb252b2x1dGlvblxcbiAgY1ZlcmIucHJvY2Vzcyhzb3VuZCk7XFxuXFxuICBzb3VuZC5wbGF5KCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LlBocmFzZVwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5QaHJhc2VcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuUGhyYXNlXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwMDU3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkEgcGhyYXNlIGlzIGEgcGF0dGVybiBvZiBtdXNpY2FsIGV2ZW50cyBvdmVyIHRpbWUsIGkuZS5cXG5hIHNlcmllcyBvZiBub3RlcyBhbmQgcmVzdHMuPC9wPlxcblxcbjxwPlBocmFzZXMgbXVzdCBiZSBhZGRlZCB0byBhIHA1LlBhcnQgZm9yIHBsYXliYWNrLCBhbmRcXG5lYWNoIHBhcnQgY2FuIHBsYXkgbXVsdGlwbGUgcGhyYXNlcyBhdCB0aGUgc2FtZSB0aW1lLlxcbkZvciBleGFtcGxlLCBvbmUgUGhyYXNlIG1pZ2h0IGJlIGEga2ljayBkcnVtLCBhbm90aGVyXFxuY291bGQgYmUgYSBzbmFyZSwgYW5kIGFub3RoZXIgY291bGQgYmUgdGhlIGJhc3NsaW5lLjwvcD5cXG5cXG48cD5UaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEgbmFtZSBzbyB0aGF0IHRoZSBwaHJhc2UgY2FuIGJlXFxubW9kaWZpZWQgb3IgZGVsZXRlZCBsYXRlci4gVGhlIGNhbGxiYWNrIGlzIGEgYSBmdW5jdGlvbiB0aGF0XFxudGhpcyBwaHJhc2Ugd2lsbCBjYWxsIGF0IGV2ZXJ5IHN0ZXDigJRmb3IgZXhhbXBsZSBpdCBtaWdodCBiZVxcbmNhbGxlZCA8Y29kZT5wbGF5Tm90ZSh2YWx1ZSl7fTwvY29kZT4uIFRoZSBhcnJheSBkZXRlcm1pbmVzXFxud2hpY2ggdmFsdWUgaXMgcGFzc2VkIGludG8gdGhlIGNhbGxiYWNrIGF0IGVhY2ggc3RlcCBvZiB0aGVcXG5waHJhc2UuIEl0IGNhbiBiZSBudW1iZXJzLCBhbiBvYmplY3Qgd2l0aCBtdWx0aXBsZSBudW1iZXJzLFxcbm9yIGEgemVybyAoMCkgaW5kaWNhdGVzIGEgcmVzdCBzbyB0aGUgY2FsbGJhY2sgd29uJiMzOTt0IGJlIGNhbGxlZCkuPC9wPlwiLFxuICAgICAgICAgICAgXCJpc19jb25zdHJ1Y3RvclwiOiAxLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TmFtZSBzbyB0aGF0IHlvdSBjYW4gYWNjZXNzIHRoZSBQaHJhc2UuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0aGF0IHRoaXMgcGhyYXNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBjYWxsLiBUeXBpY2FsbHkgaXQgd2lsbCBwbGF5IGEgc291bmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFjY2VwdCB0d28gcGFyYW1ldGVyczogYSB0aW1lIGF0IHdoaWNoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcGxheSB0aGUgc291bmQgKGluIHNlY29uZHMgZnJvbSBub3cpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhIHZhbHVlIGZyb20gdGhlIHNlcXVlbmNlIGFycmF5LiBUaGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGUgcGxheSgpIG9yXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQoKSBtZXRob2QgdG8gZW5zdXJlIHByZWNpc2lvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFycmF5IG9mIHZhbHVlcyB0byBwYXNzIGludG8gdGhlIGNhbGxiYWNrXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBlYWNoIHN0ZXAgb2YgdGhlIHBocmFzZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIG15U291bmQsIG15UGhyYXNlLCBteVBhcnQ7XFxudmFyIHBhdHRlcm4gPSBbMSwwLDAsMiwwLDIsMCwwXTtcXG52YXIgbXNnID0gJ2NsaWNrIHRvIHBsYXknO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBteVNvdW5kID0gbG9hZFNvdW5kKCdhc3NldHMvYmVhdGJveC5tcDMnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBub1N0cm9rZSgpO1xcbiAgZmlsbCgyNTUpO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICBtYXN0ZXJWb2x1bWUoMC4xKTtcXG5cXG4gIG15UGhyYXNlID0gbmV3IHA1LlBocmFzZSgnYmJveCcsIG1ha2VTb3VuZCwgcGF0dGVybik7XFxuICBteVBhcnQgPSBuZXcgcDUuUGFydCgpO1xcbiAgbXlQYXJ0LmFkZFBocmFzZShteVBocmFzZSk7XFxuICBteVBhcnQuc2V0QlBNKDYwKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMCk7XFxuICB0ZXh0KG1zZywgd2lkdGgvMiwgaGVpZ2h0LzIpO1xcbn1cXG5cXG5mdW5jdGlvbiBtYWtlU291bmQodGltZSwgcGxheWJhY2tSYXRlKSB7XFxuICBteVNvdW5kLnJhdGUocGxheWJhY2tSYXRlKTtcXG4gIG15U291bmQucGxheSh0aW1lKTtcXG59XFxuXFxuZnVuY3Rpb24gbW91c2VDbGlja2VkKCkge1xcbiAgaWYgKG1vdXNlWCA+IDAgJiYgbW91c2VYIDwgd2lkdGggJiYgbW91c2VZID4gMCAmJiBtb3VzZVkgPCBoZWlnaHQpIHtcXG4gICAgbXlQYXJ0LnN0YXJ0KCk7XFxuICAgIG1zZyA9ICdwbGF5aW5nIHBhdHRlcm4nO1xcbiAgfVxcbn1cXG5cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5QYXJ0XCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LlBhcnRcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuUGFydFwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDE0MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BIHA1LlBhcnQgcGxheXMgYmFjayBvbmUgb3IgbW9yZSBwNS5QaHJhc2VzLiBJbnN0YW50aWF0ZSBhIHBhcnRcXG53aXRoIHN0ZXBzIGFuZCB0YXR1bXMuIEJ5IGRlZmF1bHQsIGVhY2ggc3RlcCByZXByZXNlbnRzIDEvMTZ0aCBub3RlLjwvcD5cXG5cXG48cD5TZWUgcDUuUGhyYXNlIGZvciBtb3JlIGFib3V0IG11c2ljYWwgdGltaW5nLjwvcD5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0ZXBzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TdGVwcyBpbiB0aGUgcGFydDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0YXR1bXNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRpdmlzaW9ucyBvZiBhIGJlYXQgKGRlZmF1bHQgaXMgMS8xNiwgYSBxdWFydGVyIG5vdGUpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBib3gsIGRydW0sIG15UGFydDtcXG52YXIgYm94UGF0ID0gWzEsMCwwLDIsMCwyLDAsMF07XFxudmFyIGRydW1QYXQgPSBbMCwxLDEsMCwyLDAsMSwwXTtcXG52YXIgbXNnID0gJ2NsaWNrIHRvIHBsYXknO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBib3ggPSBsb2FkU291bmQoJ2Fzc2V0cy9iZWF0Ym94Lm1wMycpO1xcbiAgZHJ1bSA9IGxvYWRTb3VuZCgnYXNzZXRzL2RydW0ubXAzJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMjU1KTtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgbWFzdGVyVm9sdW1lKDAuMSk7XFxuXFxuICB2YXIgYm94UGhyYXNlID0gbmV3IHA1LlBocmFzZSgnYm94JywgcGxheUJveCwgYm94UGF0KTtcXG4gIHZhciBkcnVtUGhyYXNlID0gbmV3IHA1LlBocmFzZSgnZHJ1bScsIHBsYXlEcnVtLCBkcnVtUGF0KTtcXG4gIG15UGFydCA9IG5ldyBwNS5QYXJ0KCk7XFxuICBteVBhcnQuYWRkUGhyYXNlKGJveFBocmFzZSk7XFxuICBteVBhcnQuYWRkUGhyYXNlKGRydW1QaHJhc2UpO1xcbiAgbXlQYXJ0LnNldEJQTSg2MCk7XFxuICBtYXN0ZXJWb2x1bWUoMC4xKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMCk7XFxuICB0ZXh0KG1zZywgd2lkdGgvMiwgaGVpZ2h0LzIpO1xcbn1cXG5cXG5mdW5jdGlvbiBwbGF5Qm94KHRpbWUsIHBsYXliYWNrUmF0ZSkge1xcbiAgYm94LnJhdGUocGxheWJhY2tSYXRlKTtcXG4gIGJveC5wbGF5KHRpbWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBwbGF5RHJ1bSh0aW1lLCBwbGF5YmFja1JhdGUpIHtcXG4gIGRydW0ucmF0ZShwbGF5YmFja1JhdGUpO1xcbiAgZHJ1bS5wbGF5KHRpbWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XFxuICBpZiAobW91c2VYID4gMCAmJiBtb3VzZVggPCB3aWR0aCAmJiBtb3VzZVkgPiAwICYmIG1vdXNlWSA8IGhlaWdodCkge1xcbiAgICBteVBhcnQuc3RhcnQoKTtcXG4gICAgbXNnID0gJ3BsYXlpbmcgcGFydCc7XFxuICB9XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LlNjb3JlXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LlNjb3JlXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LlNjb3JlXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwMzk2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkEgU2NvcmUgY29uc2lzdHMgb2YgYSBzZXJpZXMgb2YgUGFydHMuIFRoZSBwYXJ0cyB3aWxsXFxuYmUgcGxheWVkIGJhY2sgaW4gb3JkZXIuIEZvciBleGFtcGxlLCB5b3UgY291bGQgaGF2ZSBhblxcbkEgcGFydCwgYSBCIHBhcnQsIGFuZCBhIEMgcGFydCwgYW5kIHBsYXkgdGhlbSBiYWNrIGluIHRoaXMgb3JkZXJcXG48Y29kZT5uZXcgcDUuU2NvcmUoYSwgYSwgYiwgYSwgYyk8L2NvZGU+PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpc19jb25zdHJ1Y3RvclwiOiAxLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGFydHNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk9uZSBvciBtdWx0aXBsZSBwYXJ0cywgdG8gYmUgcGxheWVkIGluIHNlcXVlbmNlLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuUGFydFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIFwibXVsdGlwbGVcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5Tb3VuZExvb3BcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuU291bmRMb29wXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LlNvdW5kTG9vcFwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDUyNyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Tb3VuZExvb3A8L3A+XFxuXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGl0ZXJhdGlvbiBvZiB0aGVsb29wPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImludGVydmFsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hbW91bnQgb2YgdGltZSBvciBiZWF0cyBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGhlIGxvb3BcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzIHRvIDE8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcnxTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBjbGljaztcXG52YXIgbG9vcGVyMTtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgY2xpY2sgPSBsb2FkU291bmQoJ2Fzc2V0cy9kcnVtLm1wMycpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIC8vdGhlIGxvb3BlcidzIGNhbGxiYWNrIGlzIHBhc3NlZCB0aGUgdGltZUZyb21Ob3dcXG4gIC8vdGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBwb2ludCBmcm9tXFxuICAvL3doaWNoIHRvIHNjaGVkdWxlIHNvdW5kc1xcbiAgbG9vcGVyMSA9IG5ldyBwNS5Tb3VuZExvb3AoZnVuY3Rpb24odGltZUZyb21Ob3cpe1xcbiAgICBjbGljay5wbGF5KHRpbWVGcm9tTm93KTtcXG4gICAgYmFja2dyb3VuZCgyNTUgKiAobG9vcGVyMS5pdGVyYXRpb25zICUgMikpO1xcbiAgICB9LCAyKTtcXG5cXG4gIC8vc3RvcCBhZnRlciAxMCBpdGVyYXRpb3M7XFxuICBsb29wZXIxLm1heEl0ZXJhdGlvbnMgPSAxMDtcXG4gIC8vc3RhcnQgdGhlIGxvb3BcXG4gIGxvb3BlcjEuc3RhcnQoKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwicDUuQ29tcHJlc3NvclwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5Db21wcmVzc29yXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LkNvbXByZXNzb3JcIixcbiAgICAgICAgICAgIFwiY2xhc3NpdGVtc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luc1wiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXSxcbiAgICAgICAgICAgIFwicGx1Z2luX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwiZXh0ZW5zaW9uX2ZvclwiOiBbXSxcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTA3ODYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29tcHJlc3NvciBpcyBhbiBhdWRpbyBlZmZlY3QgY2xhc3MgdGhhdCBwZXJmb3JtcyBkeW5hbWljcyBjb21wcmVzc2lvblxcbm9uIGFuIGF1ZGlvIGlucHV0IHNvdXJjZS4gVGhpcyBpcyBhIHZlcnkgY29tbW9ubHkgdXNlZCB0ZWNobmlxdWUgaW4gbXVzaWNcXG5hbmQgc291bmQgcHJvZHVjdGlvbi4gQ29tcHJlc3Npb24gY3JlYXRlcyBhbiBvdmVyYWxsIGxvdWRlciwgcmljaGVyLFxcbmFuZCBmdWxsZXIgc291bmQgYnkgbG93ZXJpbmcgdGhlIHZvbHVtZSBvZiBsb3VkcyBhbmQgcmFpc2luZyB0aGF0IG9mIHNvZnRzLlxcbkNvbXByZXNzaW9uIGNhbiBiZSB1c2VkIHRvIGF2b2lkIGNsaXBwaW5nIChzb3VuZCBkaXN0b3J0aW9uIGR1ZSB0b1xcbnBlYWtzIGluIHZvbHVtZSkgYW5kIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gbWFueSBzb3VuZHMgYXJlIHBsYXllZFxcbmF0IG9uY2UuIENvbXByZXNzaW9uIGNhbiBiZSB1c2VkIG9uIGluZGl2dWRhbCBzb3VuZCBzb3VyY2VzIGluIGFkZGl0aW9uXFxudG8gdGhlIG1hc3RlciBvdXRwdXQuPC9wPlxcbjxwPlRoaXMgY2xhc3MgZXh0ZW5kcyA8YSBocmVmID0gXFxcIi9yZWZlcmVuY2UvIy9wNS5FZmZlY3RcXFwiPnA1LkVmZmVjdDwvYT4uXFxuTWV0aG9kcyA8YSBocmVmID0gXFxcIi9yZWZlcmVuY2UvIy9wNS5FZmZlY3QvYW1wXFxcIj5hbXAoKTwvYT4sIDxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9jaGFpblxcXCI+Y2hhaW4oKTwvYT4sXFxuPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2RyeXdldFxcXCI+ZHJ5d2V0KCk8L2E+LCA8YSBocmVmID0gXFxcIi9yZWZlcmVuY2UvIy9wNS5FZmZlY3QvY29ubmVjdFxcXCI+Y29ubmVjdCgpPC9hPiwgYW5kXFxuPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2Rpc2Nvbm5lY3RcXFwiPmRpc2Nvbm5lY3QoKTwvYT4gYXJlIGF2YWlsYWJsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcImV4dGVuZHNcIjogXCJwNS5FZmZlY3RcIlxuICAgICAgICB9LFxuICAgICAgICBcInA1LlNvdW5kUmVjb3JkZXJcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuU291bmRSZWNvcmRlclwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5Tb3VuZFJlY29yZGVyXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwOTk0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlY29yZCBzb3VuZHMgZm9yIHBsYXliYWNrIGFuZC9vciB0byBzYXZlIGFzIGEgLndhdiBmaWxlLlxcblRoZSBwNS5Tb3VuZFJlY29yZGVyIHJlY29yZHMgYWxsIHNvdW5kIG91dHB1dCBmcm9tIHlvdXIgc2tldGNoLFxcbm9yIGNhbiBiZSBhc3NpZ25lZCBhIHNwZWNpZmljIHNvdXJjZSB3aXRoIHNldElucHV0KCkuPC9wPlxcbjxwPlRoZSByZWNvcmQoKSBtZXRob2QgYWNjZXB0cyBhIHA1LlNvdW5kRmlsZSBhcyBhIHBhcmFtZXRlci5cXG5XaGVuIHBsYXliYWNrIGlzIHN0b3BwZWQgKGVpdGhlciBhZnRlciB0aGUgZ2l2ZW4gYW1vdW50IG9mIHRpbWUsXFxub3Igd2l0aCB0aGUgc3RvcCgpIG1ldGhvZCksIHRoZSBwNS5Tb3VuZFJlY29yZGVyIHdpbGwgc2VuZCBpdHNcXG5yZWNvcmRpbmcgdG8gdGhhdCBwNS5Tb3VuZEZpbGUgZm9yIHBsYXliYWNrLjwvcD5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBtaWMsIHJlY29yZGVyLCBzb3VuZEZpbGU7XFxudmFyIHN0YXRlID0gMDtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIC8vIGNyZWF0ZSBhbiBhdWRpbyBpblxcbiAgbWljID0gbmV3IHA1LkF1ZGlvSW4oKTtcXG5cXG4gIC8vIHByb21wdHMgdXNlciB0byBlbmFibGUgdGhlaXIgYnJvd3NlciBtaWNcXG4gIG1pYy5zdGFydCgpO1xcblxcbiAgLy8gY3JlYXRlIGEgc291bmQgcmVjb3JkZXJcXG4gIHJlY29yZGVyID0gbmV3IHA1LlNvdW5kUmVjb3JkZXIoKTtcXG5cXG4gIC8vIGNvbm5lY3QgdGhlIG1pYyB0byB0aGUgcmVjb3JkZXJcXG4gIHJlY29yZGVyLnNldElucHV0KG1pYyk7XFxuXFxuICAvLyB0aGlzIHNvdW5kIGZpbGUgd2lsbCBiZSB1c2VkIHRvXFxuICAvLyBwbGF5YmFjayAmIHNhdmUgdGhlIHJlY29yZGluZ1xcbiAgc291bmRGaWxlID0gbmV3IHA1LlNvdW5kRmlsZSgpO1xcblxcbiAgdGV4dCgna2V5UHJlc3MgdG8gcmVjb3JkJywgMjAsIDIwKTtcXG59XFxuXFxuZnVuY3Rpb24ga2V5UHJlc3NlZCgpIHtcXG4gIC8vIG1ha2Ugc3VyZSB1c2VyIGVuYWJsZWQgdGhlIG1pY1xcbiAgaWYgKHN0YXRlID09PSAwICYmIG1pYy5lbmFibGVkKSB7XFxuXFxuICAgIC8vIHJlY29yZCB0byBvdXIgcDUuU291bmRGaWxlXFxuICAgIHJlY29yZGVyLnJlY29yZChzb3VuZEZpbGUpO1xcblxcbiAgICBiYWNrZ3JvdW5kKDI1NSwwLDApO1xcbiAgICB0ZXh0KCdSZWNvcmRpbmchJywgMjAsIDIwKTtcXG4gICAgc3RhdGUrKztcXG4gIH1cXG4gIGVsc2UgaWYgKHN0YXRlID09PSAxKSB7XFxuICAgIGJhY2tncm91bmQoMCwyNTUsMCk7XFxuXFxuICAgIC8vIHN0b3AgcmVjb3JkZXIgYW5kXFxuICAgIC8vIHNlbmQgcmVzdWx0IHRvIHNvdW5kRmlsZVxcbiAgICByZWNvcmRlci5zdG9wKCk7XFxuXFxuICAgIHRleHQoJ1N0b3BwZWQnLCAyMCwgMjApO1xcbiAgICBzdGF0ZSsrO1xcbiAgfVxcblxcbiAgZWxzZSBpZiAoc3RhdGUgPT09IDIpIHtcXG4gICAgc291bmRGaWxlLnBsYXkoKTsgLy8gcGxheSB0aGUgcmVzdWx0IVxcbiAgICBzYXZlKHNvdW5kRmlsZSwgJ215U291bmQud2F2Jyk7XFxuICAgIHN0YXRlKys7XFxuICB9XFxufVxcbjwvZGl2PjwvY29kZT5cIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LlBlYWtEZXRlY3RcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuUGVha0RldGVjdFwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5QZWFrRGV0ZWN0XCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExMjgzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlBlYWtEZXRlY3Qgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCBwNS5GRlQgdG9cXG5sb29rIGZvciBvbnNldHMgaW4gc29tZSBvciBhbGwgb2YgdGhlIGZyZXF1ZW5jeSBzcGVjdHJ1bS5cXG48L3A+XFxuPHA+XFxuVG8gdXNlIHA1LlBlYWtEZXRlY3QsIGNhbGwgPGNvZGU+dXBkYXRlPC9jb2RlPiBpbiB0aGUgZHJhdyBsb29wXFxuYW5kIHBhc3MgaW4gYSBwNS5GRlQgb2JqZWN0LlxcbjwvcD5cXG48cD5cXG5Zb3UgY2FuIGxpc3RlbiBmb3IgYSBzcGVjaWZpYyBwYXJ0IG9mIHRoZSBmcmVxdWVuY3kgc3BlY3RydW0gYnlcXG5zZXR0aW5nIHRoZSByYW5nZSBiZXR3ZWVuIDxjb2RlPmZyZXExPC9jb2RlPiBhbmQgPGNvZGU+ZnJlcTI8L2NvZGU+LlxcbjwvcD5cXG5cXG48cD48Y29kZT50aHJlc2hvbGQ8L2NvZGU+IGlzIHRoZSB0aHJlc2hvbGQgZm9yIGRldGVjdGluZyBhIHBlYWssXFxuc2NhbGVkIGJldHdlZW4gMCBhbmQgMS4gSXQgaXMgbG9nYXJpdGhtaWMsIHNvIDAuMSBpcyBoYWxmIGFzIGxvdWRcXG5hcyAxLjAuPC9wPlxcblxcbjxwPlxcblRoZSB1cGRhdGUgbWV0aG9kIGlzIG1lYW50IHRvIGJlIHJ1biBpbiB0aGUgZHJhdyBsb29wLCBhbmRcXG48Yj5mcmFtZXM8L2I+IGRldGVybWluZXMgaG93IG1hbnkgbG9vcHMgbXVzdCBwYXNzIGJlZm9yZVxcbmFub3RoZXIgcGVhayBjYW4gYmUgZGV0ZWN0ZWQuXFxuRm9yIGV4YW1wbGUsIGlmIHRoZSBmcmFtZVJhdGUoKSA9IDYwLCB5b3UgY291bGQgZGV0ZWN0IHRoZSBiZWF0IG9mIGFcXG4xMjAgYmVhdC1wZXItbWludXRlIHNvbmcgd2l0aCB0aGlzIGVxdWF0aW9uOlxcbjxjb2RlPiBmcmFtZXNQZXJQZWFrID0gNjAgLyAoZXN0aW1hdGVkQlBNIC8gNjAgKTs8L2NvZGU+XFxuPC9wPlxcblxcbjxwPlxcbkJhc2VkIG9uIGV4YW1wbGUgY29udHJpYnR1ZWQgYnkgQGIycmVuZ2VyLCBhbmQgYSBzaW1wbGUgYmVhdCBkZXRlY3Rpb25cXG5leHBsYW5hdGlvbiBieSA8YSBocmVmPVxcXCJhXFxuaHJlZj0mcXVvdDtodHRwOi8vd3d3LmFpcnRpZ2h0aW50ZXJhY3RpdmUuY29tLzIwMTMvMTAvbWFraW5nLWF1ZGlvLXJlYWN0aXZlLXZpc3VhbHMvJnF1b3Q7XFxudGFyZ2V0PSZxdW90O19ibGFuayZxdW90O1xcXCI+YVxcbmhyZWY9JnF1b3Q7aHR0cDovL3d3dy5haXJ0aWdodGludGVyYWN0aXZlLmNvbS8yMDEzLzEwL21ha2luZy1hdWRpby1yZWFjdGl2ZS12aXN1YWxzLyZxdW90O1xcbnRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDs8L2E+RmVsaXggVHVybmVyPC9hPi5cXG48L3A+XCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmcmVxMVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bG93RnJlcXVlbmN5IC0gZGVmYXVsdHMgdG8gMjBIejwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmcmVxMlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aGlnaEZyZXF1ZW5jeSAtIGRlZmF1bHRzIHRvIDIwMDAwIEh6PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRocmVzaG9sZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhyZXNob2xkIGZvciBkZXRlY3RpbmcgYSBiZWF0IGJldHdlZW4gMCBhbmQgMVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkIGxvZ2FyaXRobWljYWxseSB3aGVyZSAwLjEgaXMgMS8yIHRoZSBsb3VkbmVzc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgMS4wLiBEZWZhdWx0cyB0byAwLjM1LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmcmFtZXNQZXJQZWFrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EZWZhdWx0cyB0byAyMC48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuXFxudmFyIGNudiwgc291bmRGaWxlLCBmZnQsIHBlYWtEZXRlY3Q7XFxudmFyIGVsbGlwc2VXaWR0aCA9IDEwO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZCgwKTtcXG4gIG5vU3Ryb2tlKCk7XFxuICBmaWxsKDI1NSk7XFxuICB0ZXh0QWxpZ24oQ0VOVEVSKTtcXG5cXG4gIHNvdW5kRmlsZSA9IGxvYWRTb3VuZCgnYXNzZXRzL2JlYXQubXAzJyk7XFxuXFxuICAvLyBwNS5QZWFrRGV0ZWN0IHJlcXVpcmVzIGEgcDUuRkZUXFxuICBmZnQgPSBuZXcgcDUuRkZUKCk7XFxuICBwZWFrRGV0ZWN0ID0gbmV3IHA1LlBlYWtEZXRlY3QoKTtcXG5cXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMCk7XFxuICB0ZXh0KCdjbGljayB0byBwbGF5L3BhdXNlJywgd2lkdGgvMiwgaGVpZ2h0LzIpO1xcblxcbiAgLy8gcGVha0RldGVjdCBhY2NlcHRzIGFuIGZmdCBwb3N0LWFuYWx5c2lzXFxuICBmZnQuYW5hbHl6ZSgpO1xcbiAgcGVha0RldGVjdC51cGRhdGUoZmZ0KTtcXG5cXG4gIGlmICggcGVha0RldGVjdC5pc0RldGVjdGVkICkge1xcbiAgICBlbGxpcHNlV2lkdGggPSA1MDtcXG4gIH0gZWxzZSB7XFxuICAgIGVsbGlwc2VXaWR0aCAqPSAwLjk1O1xcbiAgfVxcblxcbiAgZWxsaXBzZSh3aWR0aC8yLCBoZWlnaHQvMiwgZWxsaXBzZVdpZHRoLCBlbGxpcHNlV2lkdGgpO1xcbn1cXG5cXG4vLyB0b2dnbGUgcGxheS9zdG9wIHdoZW4gY2FudmFzIGlzIGNsaWNrZWRcXG5mdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XFxuICBpZiAobW91c2VYID4gMCAmJiBtb3VzZVggPCB3aWR0aCAmJiBtb3VzZVkgPiAwICYmIG1vdXNlWSA8IGhlaWdodCkge1xcbiAgICBpZiAoc291bmRGaWxlLmlzUGxheWluZygpICkge1xcbiAgICAgIHNvdW5kRmlsZS5zdG9wKCk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgc291bmRGaWxlLnBsYXkoKTtcXG4gICAgfVxcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5HYWluXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LkdhaW5cIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuR2FpblwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTUwMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BIGdhaW4gbm9kZSBpcyB1c2VmdWxsIHRvIHNldCB0aGUgcmVsYXRpdmUgdm9sdW1lIG9mIHNvdW5kLlxcbkl0JiMzOTtzIHR5cGljYWxseSB1c2VkIHRvIGJ1aWxkIG1peGVycy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5cXG4gLy8gbG9hZCB0d28gc291bmRmaWxlIGFuZCBjcm9zc2ZhZGUgYmVldHdlZW4gdGhlbVxcbiB2YXIgc291bmQxLHNvdW5kMjtcXG4gdmFyIGdhaW4xLCBnYWluMiwgZ2FpbjM7XFxuXFxuIGZ1bmN0aW9uIHByZWxvYWQoKXtcXG4gc291bmRGb3JtYXRzKCdvZ2cnLCAnbXAzJyk7XFxuIHNvdW5kMSA9IGxvYWRTb3VuZCgnLi4vX2ZpbGVzL0RhbXNjcmF5XzAxJyk7XFxuIHNvdW5kMiA9IGxvYWRTb3VuZCgnLi4vX2ZpbGVzL2JlYXQubXAzJyk7XFxuIH1cXG5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuIGNyZWF0ZUNhbnZhcyg0MDAsMjAwKTtcXG5cXG4gLy8gY3JlYXRlIGEgJ21hc3RlcicgZ2FpbiB0byB3aGljaCB3ZSB3aWxsIGNvbm5lY3QgYm90aCBzb3VuZGZpbGVzXFxuIGdhaW4zID0gbmV3IHA1LkdhaW4oKTtcXG4gZ2FpbjMuY29ubmVjdCgpO1xcblxcbiAvLyBzZXR1cCBmaXJzdCBzb3VuZCBmb3IgcGxheWluZ1xcbiBzb3VuZDEucmF0ZSgxKTtcXG4gc291bmQxLmxvb3AoKTtcXG4gc291bmQxLmRpc2Nvbm5lY3QoKTsgLy8gZGljb25uZWN0IGZyb20gcDUgb3V0cHV0XFxuXFxuIGdhaW4xID0gbmV3IHA1LkdhaW4oKTsgLy8gc2V0dXAgYSBnYWluIG5vZGVcXG4gZ2FpbjEuc2V0SW5wdXQoc291bmQxKTsgLy8gY29ubmVjdCB0aGUgZmlyc3Qgc291bmQgdG8gaXRzIGlucHV0XFxuIGdhaW4xLmNvbm5lY3QoZ2FpbjMpOyAvLyBjb25uZWN0IGl0cyBvdXRwdXQgdG8gdGhlICdtYXN0ZXInXFxuXFxuIHNvdW5kMi5yYXRlKDEpO1xcbiBzb3VuZDIuZGlzY29ubmVjdCgpO1xcbiBzb3VuZDIubG9vcCgpO1xcblxcbiBnYWluMiA9IG5ldyBwNS5HYWluKCk7XFxuIGdhaW4yLnNldElucHV0KHNvdW5kMik7XFxuIGdhaW4yLmNvbm5lY3QoZ2FpbjMpO1xcblxcbiB9XFxuXFxuIGZ1bmN0aW9uIGRyYXcoKXtcXG4gYmFja2dyb3VuZCgxODApO1xcblxcbiAvLyBjYWxjdWxhdGUgdGhlIGhvcml6b250YWwgZGlzdGFuY2UgYmVldHdlZW4gdGhlIG1vdXNlIGFuZCB0aGUgcmlnaHQgb2YgdGhlIHNjcmVlblxcbiB2YXIgZCA9IGRpc3QobW91c2VYLDAsd2lkdGgsMCk7XFxuXFxuIC8vIG1hcCB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgbW91c2UgdG8gdmFsdWVzIHVzZWFibGUgZm9yIHZvbHVtZSBjb250cm9sIG9mIHNvdW5kMVxcbiB2YXIgdm9sMSA9IG1hcChtb3VzZVgsMCx3aWR0aCwwLDEpO1xcbiB2YXIgdm9sMiA9IDEtdm9sMTsgLy8gd2hlbiBzb3VuZDEgaXMgbG91ZCwgc291bmQyIGlzIHF1aWV0IGFuZCB2aWNlIHZlcnNhXFxuXFxuIGdhaW4xLmFtcCh2b2wxLDAuNSwwKTtcXG4gZ2FpbjIuYW1wKHZvbDIsMC41LDApO1xcblxcbiAvLyBtYXAgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSB0byB2YWx1ZXMgdXNlYWJsZSBmb3IgJ21hc3RlciB2b2x1bWUgY29udHJvbCdcXG4gdmFyIHZvbDMgPSBtYXAobW91c2VZLDAsaGVpZ2h0LDAsMSk7XFxuIGdhaW4zLmFtcCh2b2wzLDAuNSwwKTtcXG4gfVxcbjwvY29kZT48L2Rpdj5cXG5cIlxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBcInA1LkF1ZGlvVm9pY2VcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuQXVkaW9Wb2ljZVwiLFxuICAgICAgICAgICAgXCJzaG9ydG5hbWVcIjogXCJwNS5BdWRpb1ZvaWNlXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExNjM4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkJhc2UgY2xhc3MgZm9yIG1vbm9waG9uaWMgc3ludGhlc2l6ZXJzLiBBbnkgZXh0ZW5zaW9ucyBvZiB0aGlzIGNsYXNzXFxuc2hvdWxkIGZvbGxvdyB0aGUgQVBJIGFuZCBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgYmVsb3cgaW4gb3JkZXIgdG9cXG5yZW1haW4gY29tcGF0aWJsZSB3aXRoIHA1LlBvbHlTeW50aCgpOzwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXNfY29uc3RydWN0b3JcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInA1Lk1vbm9TeW50aFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwNS5Nb25vU3ludGhcIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuTW9ub1N5bnRoXCIsXG4gICAgICAgICAgICBcImNsYXNzaXRlbXNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbnNcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbnNcIjogW10sXG4gICAgICAgICAgICBcInBsdWdpbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcImV4dGVuc2lvbl9mb3JcIjogW10sXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExNzExLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFuIE1vbm9TeW50aCBpcyB1c2VkIGFzIGEgc2luZ2xlIHZvaWNlIGZvciBzb3VuZCBzeW50aGVzaXMuXFxuVGhpcyBpcyBhIGNsYXNzIHRvIGJlIHVzZWQgaW4gY29uam9uY3Rpb24gd2l0aCB0aGUgUG9seVN5bnRoXFxuY2xhc3MuIEN1c3RvbSBzeW50aGV0aXNlcnMgc2hvdWxkIGJlIGJ1aWx0IGluaGVyaXRpbmcgZnJvbVxcbnRoaXMgY2xhc3MuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpc19jb25zdHJ1Y3RvclwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIG1vbm9zeW50aDtcXG52YXIgeDtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIG1vbm9zeW50aCA9IG5ldyBwNS5Nb25vU3ludGgoKTtcXG4gIG1vbm9zeW50aC5sb2FkUHJlc2V0KCdzaW1wbGVCYXNzJyk7XFxuICBtb25vc3ludGgucGxheSg0NSwxLHg9MCwxKTtcXG4gIG1vbm9zeW50aC5wbGF5KDQ5LDEseCs9MSwwLjI1KTtcXG4gIG1vbm9zeW50aC5wbGF5KDUwLDEseCs9MC4yNSwwLjI1KTtcXG4gIG1vbm9zeW50aC5wbGF5KDQ5LDEseCs9MC41LDAuMjUpO1xcbiAgbW9ub3N5bnRoLnBsYXkoNTAsMSx4Kz0wLjI1LDAuMjUpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5Qb2x5U3ludGhcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwicDUuUG9seVN5bnRoXCIsXG4gICAgICAgICAgICBcInNob3J0bmFtZVwiOiBcInA1LlBvbHlTeW50aFwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTk0MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BbiBBdWRpb1ZvaWNlIGlzIHVzZWQgYXMgYSBzaW5nbGUgdm9pY2UgZm9yIHNvdW5kIHN5bnRoZXNpcy5cXG5UaGUgUG9seVN5bnRoIGNsYXNzIGhvbGRzIGFuIGFycmF5IG9mIEF1ZGlvVm9pY2UsIGFuZCBkZWFsc1xcbndpdGggdm9pY2VzIGFsbG9jYXRpb25zLCB3aXRoIHNldHRpbmcgbm90ZXMgdG8gYmUgcGxheWVkLCBhbmRcXG5wYXJhbWV0ZXJzIHRvIGJlIHNldC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzeW50aFZvaWNlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BIG1vbm9waG9uaWMgc3ludGggdm9pY2UgaW5oZXJpdGluZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQXVkaW9Wb2ljZSBjbGFzcy4gRGVmYXVsdHMgdG8gcDUuTW9ub1N5bnRoPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBvbHlWYWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TnVtYmVyIG9mIHZvaWNlcywgZGVmYXVsdHMgdG8gODs8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHBvbHlzeW50aDtcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHBvbHlzeW50aCA9IG5ldyBwNS5Qb2x5U3ludGgoKTtcXG4gIHBvbHlzeW50aC5wbGF5KDUzLDEsMCwzKTtcXG4gIHBvbHlzeW50aC5wbGF5KDYwLDEsMCwyLjkpO1xcbiAgcG9seXN5bnRoLnBsYXkoNjksMSwwLDMpO1xcbiAgcG9seXN5bnRoLnBsYXkoNzEsMSwwLDMpO1xcbiAgcG9seXN5bnRoLnBsYXkoNzQsMSwwLDMpO1xcbn1cXG48L2NvZGU+PC9kaXY+XFxuXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwNS5EaXN0b3J0aW9uXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInA1LkRpc3RvcnRpb25cIixcbiAgICAgICAgICAgIFwic2hvcnRuYW1lXCI6IFwicDUuRGlzdG9ydGlvblwiLFxuICAgICAgICAgICAgXCJjbGFzc2l0ZW1zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5zXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25zXCI6IFtdLFxuICAgICAgICAgICAgXCJwbHVnaW5fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlbnNpb25fZm9yXCI6IFtdLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjI0MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BIERpc3RvcnRpb24gZWZmZWN0IGNyZWF0ZWQgd2l0aCBhIFdhdmVzaGFwZXIgTm9kZSxcXG53aXRoIGFuIGFwcHJvYWNoIGFkYXB0ZWQgZnJvbVxcbjxhIGhyZWY9XFxcImh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjIzMTI4NDEvd2F2ZXNoYXBlci1ub2RlLWluLXdlYmF1ZGlvLWhvdy10by1lbXVsYXRlLWRpc3RvcnRpb25cXFwiPktldmluIEVubmlzPC9hPjwvcD5cXG48cD5UaGlzIGNsYXNzIGV4dGVuZHMgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0XFxcIj5wNS5FZmZlY3Q8L2E+Llxcbk1ldGhvZHMgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2FtcFxcXCI+YW1wKCk8L2E+LCA8YSBocmVmID0gXFxcIi9yZWZlcmVuY2UvIy9wNS5FZmZlY3QvY2hhaW5cXFwiPmNoYWluKCk8L2E+LFxcbjxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9kcnl3ZXRcXFwiPmRyeXdldCgpPC9hPiwgPGEgaHJlZiA9IFxcXCIvcmVmZXJlbmNlLyMvcDUuRWZmZWN0L2Nvbm5lY3RcXFwiPmNvbm5lY3QoKTwvYT4sIGFuZFxcbjxhIGhyZWYgPSBcXFwiL3JlZmVyZW5jZS8jL3A1LkVmZmVjdC9kaXNjb25uZWN0XFxcIj5kaXNjb25uZWN0KCk8L2E+IGFyZSBhdmFpbGFibGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJleHRlbmRzXCI6IFwicDUuRWZmZWN0XCIsXG4gICAgICAgICAgICBcImlzX2NvbnN0cnVjdG9yXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbW91bnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlVuYm91bmRlZCBkaXN0b3J0aW9uIGFtb3VudC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsIHZhbHVlcyByYW5nZSBmcm9tIDAtMS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0ZGVmYXVsdFwiOiBcIjAuMjVcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJvdmVyc2FtcGxlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD4mIzM5O25vbmUmIzM5OywgJiMzOTsyeCYjMzk7LCBvciAmIzM5OzR4JiMzOTsuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGRlZmF1bHRcIjogXCInbm9uZSdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJlbGVtZW50c1wiOiB7fSxcbiAgICBcImNsYXNzaXRlbXNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3IvY29sb3JfY29udmVyc2lvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnZlcnNpb25zIGFkYXB0ZWQgZnJvbSA8YSBocmVmPVxcXCJodHRwOi8vd3d3LmVhc3lyZ2IuY29tL2VuL21hdGgucGhwXFxcIj5odHRwOi8vd3d3LmVhc3lyZ2IuY29tL2VuL21hdGgucGhwPC9hPi48L3A+XFxuPHA+SW4gdGhlc2UgZnVuY3Rpb25zLCBodWUgaXMgYWx3YXlzIGluIHRoZSByYW5nZSBbMCwxKTsgYWxsIG90aGVyIGNvbXBvbmVudHNcXG5hcmUgaW4gdGhlIHJhbmdlIFswLDFdLiAmIzM5O0JyaWdodG5lc3MmIzM5OyBhbmQgJiMzOTt2YWx1ZSYjMzk7IGFyZSB1c2VkIGludGVyY2hhbmdlYWJseS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29udmVyc2lvblwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb2xvciBDb252ZXJzaW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL2NvbG9yX2NvbnZlcnNpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db252ZXJ0IGFuIEhTQkEgYXJyYXkgdG8gSFNMQS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29udmVyc2lvblwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb2xvciBDb252ZXJzaW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL2NvbG9yX2NvbnZlcnNpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0NixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db252ZXJ0IGFuIEhTQkEgYXJyYXkgdG8gUkdCQS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29udmVyc2lvblwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb2xvciBDb252ZXJzaW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL2NvbG9yX2NvbnZlcnNpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29udmVydCBhbiBIU0xBIGFycmF5IHRvIEhTQkEuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnZlcnNpb25cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29sb3IgQ29udmVyc2lvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9jb2xvcl9jb252ZXJzaW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTI0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnZlcnQgYW4gSFNMQSBhcnJheSB0byBSR0JBLjwvcD5cXG48cD5XZSBuZWVkIHRvIGNoYW5nZSBiYXNpcyBmcm9tIEhTTEEgdG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIG1vcmUgZWFzaWx5IGJlXFxucHJvamVjdGVkIG9udG8gUkdCQS4gV2Ugd2lsbCBjaG9vc2UgaHVlIGFuZCBicmlnaHRuZXNzIGFzIG91ciBmaXJzdCB0d29cXG5jb21wb25lbnRzLCBhbmQgcGljayBhIGNvbnZlbmllbnQgdGhpcmQgb25lICgmIzM5O3plc3QmIzM5Oykgc28gdGhhdCB3ZSBkb24mIzM5O3QgbmVlZFxcbnRvIGNhbGN1bGF0ZSBmb3JtYWwgSFNCQSBzYXR1cmF0aW9uLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb252ZXJzaW9uXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbG9yIENvbnZlcnNpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3IvY29sb3JfY29udmVyc2lvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE4OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db252ZXJ0IGFuIFJHQkEgYXJyYXkgdG8gSFNCQS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29udmVyc2lvblwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb2xvciBDb252ZXJzaW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL2NvbG9yX2NvbnZlcnNpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMjcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29udmVydCBhbiBSR0JBIGFycmF5IHRvIEhTTEEuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnZlcnNpb25cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29sb3IgQ29udmVyc2lvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9jcmVhdGluZ19yZWFkaW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RXh0cmFjdHMgdGhlIGFscGhhIHZhbHVlIGZyb20gYSBjb2xvciBvciBwaXhlbCBhcnJheS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhbHBoYVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LkNvbG9yIG9iamVjdCwgY29sb3IgY29tcG9uZW50cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgQ1NTIGNvbG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5Db2xvcnxOdW1iZXJbXXxTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBhbHBoYSB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxubm9TdHJva2UoKTtcXG52YXIgYyA9IGNvbG9yKDAsIDEyNiwgMjU1LCAxMDIpO1xcbmZpbGwoYyk7XFxucmVjdCgxNSwgMTUsIDM1LCA3MCk7XFxudmFyIHZhbHVlID0gYWxwaGEoYyk7IC8vIFNldHMgJ3ZhbHVlJyB0byAxMDJcXG5maWxsKHZhbHVlKTtcXG5yZWN0KDUwLCAxNSwgMzUsIDcwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIkxlZnQgaGFsZiBvZiBjYW52YXMgbGlnaHQgYmx1ZSBhbmQgcmlnaHQgaGFsZiBsaWdodCBjaGFyY29hbCBncmV5LlxcbkxlZnQgaGFsZiBvZiBjYW52YXMgbGlnaHQgcHVycGxlIGFuZCByaWdodCBoYWxmIGEgcm95YWwgYmx1ZS5cXG5MZWZ0IGhhbGYgb2YgY2FudmFzIHNhbG1vbiBwaW5rIGFuZCB0aGUgcmlnaHQgaGFsZiB3aGl0ZS5cXG5ZZWxsb3cgcmVjdCBpbiBtaWRkbGUgcmlnaHQgb2YgY2FudmFzLCB3aXRoIDU1IHBpeGVsIHdpZHRoIGFuZCBoZWlnaHQuXFxuWWVsbG93IGVsbGlwc2UgaW4gdG9wIGxlZnQgY2FudmFzLCBibGFjayBlbGxpcHNlIGluIGJvdHRvbSByaWdodCxib3RoIDgweDgwLlxcbkJyaWdodCBmdXNjaGlhIHJlY3QgaW4gbWlkZGxlIG9mIGNhbnZhcywgNjAgcGl4ZWwgd2lkdGggYW5kIGhlaWdodC5cXG5Ud28gYnJpZ2h0IGdyZWVuIHJlY3RzIG9uIG9wcG9zaXRlIHNpZGVzIG9mIHRoZSBjYW52YXMsIGJvdGggNDV4ODAuXFxuRm91ciBibHVlIHJlY3RzIGluIGVhY2ggY29ybmVyIG9mIHRoZSBjYW52YXMsIGVhY2ggYXJlIDM1eDM1LlxcbkJyaWdodCBzZWEgZ3JlZW4gcmVjdCBvbiBsZWZ0IGFuZCBkYXJrZXIgcmVjdCBvbiByaWdodCBvZiBjYW52YXMsIGJvdGggNDV4ODAuXFxuRGFyayBncmVlbiByZWN0IG9uIGxlZnQgYW5kIGxpZ2h0IGdyZWVuIHJlY3Qgb24gcmlnaHQgb2YgY2FudmFzLCBib3RoIDQ1eDgwLlxcbkRhcmsgYmx1ZSByZWN0IG9uIGxlZnQgYW5kIGxpZ2h0IHRlYWwgcmVjdCBvbiByaWdodCBvZiBjYW52YXMsIGJvdGggNDV4ODAuXFxuYmx1ZSByZWN0IG9uIGxlZnQgYW5kIGdyZWVuIG9uIHJpZ2h0LCBib3RoIHdpdGggYmxhY2sgb3V0bGluZXMgJiAzNXg2MC5cXG5zYWxtb24gcGluayByZWN0IG9uIGxlZnQgYW5kIGJsYWNrIG9uIHJpZ2h0LCBib3RoIDM1eDYwLlxcbjQgcmVjdHMsIHRhbiwgYnJvd24sIGJyb3duaXNoIHB1cnBsZSBhbmQgcHVycGxlLCB3aXRoIHdoaXRlIG91dGxpbmVzICYgMjB4NjAuXFxubGlnaHQgcGFzdGVsIGdyZWVuIHJlY3Qgb24gbGVmdCBhbmQgZGFyayBncmV5IHJlY3Qgb24gcmlnaHQsIGJvdGggMzV4NjAuXFxueWVsbG93IHJlY3Qgb24gbGVmdCBhbmQgcmVkIHJlY3Qgb24gcmlnaHQsIGJvdGggd2l0aCBibGFjayBvdXRsaW5lcyAmIDM1eDYwLlxcbmdyZXkgY2FudmFzXFxuZGVlcCBwaW5rIHJlY3Qgb24gbGVmdCBhbmQgZ3JleSByZWN0IG9uIHJpZ2h0LCBib3RoIDM1eDYwLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNyZWF0aW5nICYgUmVhZGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9jcmVhdGluZ19yZWFkaW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RXh0cmFjdHMgdGhlIGJsdWUgdmFsdWUgZnJvbSBhIGNvbG9yIG9yIHBpeGVsIGFycmF5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImJsdWVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbG9yXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5Db2xvciBvYmplY3QsIGNvbG9yIGNvbXBvbmVudHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENTUyBjb2xvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29sb3J8TnVtYmVyW118U3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgYmx1ZSB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGMgPSBjb2xvcigxNzUsIDEwMCwgMjIwKTsgLy8gRGVmaW5lIGNvbG9yICdjJ1xcbmZpbGwoYyk7IC8vIFVzZSBjb2xvciB2YXJpYWJsZSAnYycgYXMgZmlsbCBjb2xvclxcbnJlY3QoMTUsIDIwLCAzNSwgNjApOyAvLyBEcmF3IGxlZnQgcmVjdGFuZ2xlXFxuXFxudmFyIGJsdWVWYWx1ZSA9IGJsdWUoYyk7IC8vIEdldCBibHVlIGluICdjJ1xcbnByaW50KGJsdWVWYWx1ZSk7IC8vIFByaW50cyBcXFwiMjIwLjBcXFwiXFxuZmlsbCgwLCAwLCBibHVlVmFsdWUpOyAvLyBVc2UgJ2JsdWVWYWx1ZScgaW4gbmV3IGZpbGxcXG5yZWN0KDUwLCAyMCwgMzUsIDYwKTsgLy8gRHJhdyByaWdodCByZWN0YW5nbGVcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIkxlZnQgaGFsZiBvZiBjYW52YXMgbGlnaHQgcHVycGxlIGFuZCByaWdodCBoYWxmIGEgcm95YWwgYmx1ZS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb2xvclwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDcmVhdGluZyAmIFJlYWRpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3IvY3JlYXRpbmdfcmVhZGluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDkxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkV4dHJhY3RzIHRoZSBIU0IgYnJpZ2h0bmVzcyB2YWx1ZSBmcm9tIGEgY29sb3Igb3IgcGl4ZWwgYXJyYXkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYnJpZ2h0bmVzc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LkNvbG9yIG9iamVjdCwgY29sb3IgY29tcG9uZW50cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgQ1NTIGNvbG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5Db2xvcnxOdW1iZXJbXXxTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBicmlnaHRuZXNzIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5ub1N0cm9rZSgpO1xcbmNvbG9yTW9kZShIU0IsIDI1NSk7XFxudmFyIGMgPSBjb2xvcigwLCAxMjYsIDI1NSk7XFxuZmlsbChjKTtcXG5yZWN0KDE1LCAyMCwgMzUsIDYwKTtcXG52YXIgdmFsdWUgPSBicmlnaHRuZXNzKGMpOyAvLyBTZXRzICd2YWx1ZScgdG8gMjU1XFxuZmlsbCh2YWx1ZSk7XFxucmVjdCg1MCwgMjAsIDM1LCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJMZWZ0IGhhbGYgb2YgY2FudmFzIHNhbG1vbiBwaW5rIGFuZCB0aGUgcmlnaHQgaGFsZiB3aGl0ZS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb2xvclwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDcmVhdGluZyAmIFJlYWRpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3IvY3JlYXRpbmdfcmVhZGluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DcmVhdGVzIGNvbG9ycyBmb3Igc3RvcmluZyBpbiB2YXJpYWJsZXMgb2YgdGhlIGNvbG9yIGRhdGF0eXBlLiBUaGVcXG5wYXJhbWV0ZXJzIGFyZSBpbnRlcnByZXRlZCBhcyBSR0Igb3IgSFNCIHZhbHVlcyBkZXBlbmRpbmcgb24gdGhlXFxuY3VycmVudCBjb2xvck1vZGUoKS4gVGhlIGRlZmF1bHQgbW9kZSBpcyBSR0IgdmFsdWVzIGZyb20gMCB0byAyNTVcXG5hbmQsIHRoZXJlZm9yZSwgdGhlIGZ1bmN0aW9uIGNhbGwgY29sb3IoMjU1LCAyMDQsIDApIHdpbGwgcmV0dXJuIGFcXG5icmlnaHQgeWVsbG93IGNvbG9yLlxcbjxicj48YnI+XFxuTm90ZSB0aGF0IGlmIG9ubHkgb25lIHZhbHVlIGlzIHByb3ZpZGVkIHRvIGNvbG9yKCksIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWRcXG5hcyBhIGdyYXlzY2FsZSB2YWx1ZS4gQWRkIGEgc2Vjb25kIHZhbHVlLCBhbmQgaXQgd2lsbCBiZSB1c2VkIGZvciBhbHBoYVxcbnRyYW5zcGFyZW5jeS4gV2hlbiB0aHJlZSB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhleSBhcmUgaW50ZXJwcmV0ZWQgYXNcXG5laXRoZXIgUkdCIG9yIEhTQiB2YWx1ZXMuIEFkZGluZyBhIGZvdXJ0aCB2YWx1ZSBhcHBsaWVzIGFscGhhXFxudHJhbnNwYXJlbmN5Llxcbjxicj48YnI+XFxuSWYgYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBSR0IsIFJHQkEgYW5kIEhleCBDU1MgY29sb3JcXG5zdHJpbmdzIGFuZCBhbGwgbmFtZWQgY29sb3Igc3RyaW5ncyBhcmUgc3VwcG9ydGVkLiBJbiB0aGlzIGNhc2UsIGFuIGFscGhhXFxubnVtYmVyIHZhbHVlIGFzIGEgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBSR0JBIGZvcm0gc2hvdWxkIGJlXFxudXNlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjb2xvclwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyZXN1bHRpbmcgY29sb3JcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5Db2xvclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGMgPSBjb2xvcigyNTUsIDIwNCwgMCk7IC8vIERlZmluZSBjb2xvciAnYydcXG5maWxsKGMpOyAvLyBVc2UgY29sb3IgdmFyaWFibGUgJ2MnIGFzIGZpbGwgY29sb3JcXG5ub1N0cm9rZSgpOyAvLyBEb24ndCBkcmF3IGEgc3Ryb2tlIGFyb3VuZCBzaGFwZXNcXG5yZWN0KDMwLCAyMCwgNTUsIDU1KTsgLy8gRHJhdyByZWN0YW5nbGVcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgYyA9IGNvbG9yKDI1NSwgMjA0LCAwKTsgLy8gRGVmaW5lIGNvbG9yICdjJ1xcbmZpbGwoYyk7IC8vIFVzZSBjb2xvciB2YXJpYWJsZSAnYycgYXMgZmlsbCBjb2xvclxcbm5vU3Ryb2tlKCk7IC8vIERvbid0IGRyYXcgYSBzdHJva2UgYXJvdW5kIHNoYXBlc1xcbmVsbGlwc2UoMjUsIDI1LCA4MCwgODApOyAvLyBEcmF3IGxlZnQgY2lyY2xlXFxuXFxuLy8gVXNpbmcgb25seSBvbmUgdmFsdWUgd2l0aCBjb2xvcigpXFxuLy8gZ2VuZXJhdGVzIGEgZ3JheXNjYWxlIHZhbHVlLlxcbmMgPSBjb2xvcig2NSk7IC8vIFVwZGF0ZSAnYycgd2l0aCBncmF5c2NhbGUgdmFsdWVcXG5maWxsKGMpOyAvLyBVc2UgdXBkYXRlZCAnYycgYXMgZmlsbCBjb2xvclxcbmVsbGlwc2UoNzUsIDc1LCA4MCwgODApOyAvLyBEcmF3IHJpZ2h0IGNpcmNsZVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIE5hbWVkIFNWRyAmIENTUyBjb2xvcnMgbWF5IGJlIHVzZWQsXFxudmFyIGMgPSBjb2xvcignbWFnZW50YScpO1xcbmZpbGwoYyk7IC8vIFVzZSAnYycgYXMgZmlsbCBjb2xvclxcbm5vU3Ryb2tlKCk7IC8vIERvbid0IGRyYXcgYSBzdHJva2UgYXJvdW5kIHNoYXBlc1xcbnJlY3QoMjAsIDIwLCA2MCwgNjApOyAvLyBEcmF3IHJlY3RhbmdsZVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIGFzIGNhbiBoZXggY29sb3IgY29kZXM6XFxubm9TdHJva2UoKTsgLy8gRG9uJ3QgZHJhdyBhIHN0cm9rZSBhcm91bmQgc2hhcGVzXFxudmFyIGMgPSBjb2xvcignIzBmMCcpO1xcbmZpbGwoYyk7IC8vIFVzZSAnYycgYXMgZmlsbCBjb2xvclxcbnJlY3QoMCwgMTAsIDQ1LCA4MCk7IC8vIERyYXcgcmVjdGFuZ2xlXFxuXFxuYyA9IGNvbG9yKCcjMDBmZjAwJyk7XFxuZmlsbChjKTsgLy8gVXNlIHVwZGF0ZWQgJ2MnIGFzIGZpbGwgY29sb3JcXG5yZWN0KDU1LCAxMCwgNDUsIDgwKTsgLy8gRHJhdyByZWN0YW5nbGVcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBSR0IgYW5kIFJHQkEgY29sb3Igc3RyaW5ncyBhcmUgYWxzbyBzdXBwb3J0ZWQ6XFxuLy8gdGhlc2UgYWxsIHNldCB0byB0aGUgc2FtZSBjb2xvciAoc29saWQgYmx1ZSlcXG52YXIgYztcXG5ub1N0cm9rZSgpOyAvLyBEb24ndCBkcmF3IGEgc3Ryb2tlIGFyb3VuZCBzaGFwZXNcXG5jID0gY29sb3IoJ3JnYigwLDAsMjU1KScpO1xcbmZpbGwoYyk7IC8vIFVzZSAnYycgYXMgZmlsbCBjb2xvclxcbnJlY3QoMTAsIDEwLCAzNSwgMzUpOyAvLyBEcmF3IHJlY3RhbmdsZVxcblxcbmMgPSBjb2xvcigncmdiKDAlLCAwJSwgMTAwJSknKTtcXG5maWxsKGMpOyAvLyBVc2UgdXBkYXRlZCAnYycgYXMgZmlsbCBjb2xvclxcbnJlY3QoNTUsIDEwLCAzNSwgMzUpOyAvLyBEcmF3IHJlY3RhbmdsZVxcblxcbmMgPSBjb2xvcigncmdiYSgwLCAwLCAyNTUsIDEpJyk7XFxuZmlsbChjKTsgLy8gVXNlIHVwZGF0ZWQgJ2MnIGFzIGZpbGwgY29sb3JcXG5yZWN0KDEwLCA1NSwgMzUsIDM1KTsgLy8gRHJhdyByZWN0YW5nbGVcXG5cXG5jID0gY29sb3IoJ3JnYmEoMCUsIDAlLCAxMDAlLCAxKScpO1xcbmZpbGwoYyk7IC8vIFVzZSB1cGRhdGVkICdjJyBhcyBmaWxsIGNvbG9yXFxucmVjdCg1NSwgNTUsIDM1LCAzNSk7IC8vIERyYXcgcmVjdGFuZ2xlXFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gSFNMIGNvbG9yIGlzIGFsc28gc3VwcG9ydGVkIGFuZCBjYW4gYmUgc3BlY2lmaWVkXFxuLy8gYnkgdmFsdWVcXG52YXIgYztcXG5ub1N0cm9rZSgpOyAvLyBEb24ndCBkcmF3IGEgc3Ryb2tlIGFyb3VuZCBzaGFwZXNcXG5jID0gY29sb3IoJ2hzbCgxNjAsIDEwMCUsIDUwJSknKTtcXG5maWxsKGMpOyAvLyBVc2UgJ2MnIGFzIGZpbGwgY29sb3JcXG5yZWN0KDAsIDEwLCA0NSwgODApOyAvLyBEcmF3IHJlY3RhbmdsZVxcblxcbmMgPSBjb2xvcignaHNsYSgxNjAsIDEwMCUsIDUwJSwgMC41KScpO1xcbmZpbGwoYyk7IC8vIFVzZSB1cGRhdGVkICdjJyBhcyBmaWxsIGNvbG9yXFxucmVjdCg1NSwgMTAsIDQ1LCA4MCk7IC8vIERyYXcgcmVjdGFuZ2xlXFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gSFNCIGNvbG9yIGlzIGFsc28gc3VwcG9ydGVkIGFuZCBjYW4gYmUgc3BlY2lmaWVkXFxuLy8gYnkgdmFsdWVcXG52YXIgYztcXG5ub1N0cm9rZSgpOyAvLyBEb24ndCBkcmF3IGEgc3Ryb2tlIGFyb3VuZCBzaGFwZXNcXG5jID0gY29sb3IoJ2hzYigxNjAsIDEwMCUsIDUwJSknKTtcXG5maWxsKGMpOyAvLyBVc2UgJ2MnIGFzIGZpbGwgY29sb3JcXG5yZWN0KDAsIDEwLCA0NSwgODApOyAvLyBEcmF3IHJlY3RhbmdsZVxcblxcbmMgPSBjb2xvcignaHNiYSgxNjAsIDEwMCUsIDUwJSwgMC41KScpO1xcbmZpbGwoYyk7IC8vIFVzZSB1cGRhdGVkICdjJyBhcyBmaWxsIGNvbG9yXFxucmVjdCg1NSwgMTAsIDQ1LCA4MCk7IC8vIERyYXcgcmVjdGFuZ2xlXFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGM7IC8vIERlY2xhcmUgY29sb3IgJ2MnXFxubm9TdHJva2UoKTsgLy8gRG9uJ3QgZHJhdyBhIHN0cm9rZSBhcm91bmQgc2hhcGVzXFxuXFxuLy8gSWYgbm8gY29sb3JNb2RlIGlzIHNwZWNpZmllZCwgdGhlbiB0aGVcXG4vLyBkZWZhdWx0IG9mIFJHQiB3aXRoIHNjYWxlIG9mIDAtMjU1IGlzIHVzZWQuXFxuYyA9IGNvbG9yKDUwLCA1NSwgMTAwKTsgLy8gQ3JlYXRlIGEgY29sb3IgZm9yICdjJ1xcbmZpbGwoYyk7IC8vIFVzZSBjb2xvciB2YXJpYWJsZSAnYycgYXMgZmlsbCBjb2xvclxcbnJlY3QoMCwgMTAsIDQ1LCA4MCk7IC8vIERyYXcgbGVmdCByZWN0XFxuXFxuY29sb3JNb2RlKEhTQiwgMTAwKTsgLy8gVXNlIEhTQiB3aXRoIHNjYWxlIG9mIDAtMTAwXFxuYyA9IGNvbG9yKDUwLCA1NSwgMTAwKTsgLy8gVXBkYXRlICdjJyB3aXRoIG5ldyBjb2xvclxcbmZpbGwoYyk7IC8vIFVzZSB1cGRhdGVkICdjJyBhcyBmaWxsIGNvbG9yXFxucmVjdCg1NSwgMTAsIDQ1LCA4MCk7IC8vIERyYXcgcmlnaHQgcmVjdFxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiWWVsbG93IHJlY3QgaW4gbWlkZGxlIHJpZ2h0IG9mIGNhbnZhcywgd2l0aCA1NSBwaXhlbCB3aWR0aCBhbmQgaGVpZ2h0LlxcblllbGxvdyBlbGxpcHNlIGluIHRvcCBsZWZ0IG9mIGNhbnZhcywgYmxhY2sgZWxsaXBzZSBpbiBib3R0b20gcmlnaHQsYm90aCA4MHg4MC5cXG5CcmlnaHQgZnVzY2hpYSByZWN0IGluIG1pZGRsZSBvZiBjYW52YXMsIDYwIHBpeGVsIHdpZHRoIGFuZCBoZWlnaHQuXFxuVHdvIGJyaWdodCBncmVlbiByZWN0cyBvbiBvcHBvc2l0ZSBzaWRlcyBvZiB0aGUgY2FudmFzLCBib3RoIDQ1eDgwLlxcbkZvdXIgYmx1ZSByZWN0cyBpbiBlYWNoIGNvcm5lciBvZiB0aGUgY2FudmFzLCBlYWNoIGFyZSAzNXgzNS5cXG5CcmlnaHQgc2VhIGdyZWVuIHJlY3Qgb24gbGVmdCBhbmQgZGFya2VyIHJlY3Qgb24gcmlnaHQgb2YgY2FudmFzLCBib3RoIDQ1eDgwLlxcbkRhcmsgZ3JlZW4gcmVjdCBvbiBsZWZ0IGFuZCBsaWdodGVyIGdyZWVuIHJlY3Qgb24gcmlnaHQgb2YgY2FudmFzLCBib3RoIDQ1eDgwLlxcbkRhcmsgYmx1ZSByZWN0IG9uIGxlZnQgYW5kIGxpZ2h0IHRlYWwgcmVjdCBvbiByaWdodCBvZiBjYW52YXMsIGJvdGggNDV4ODAuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ3JlYXRpbmcgJiBSZWFkaW5nXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTIxLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ3JheVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBiZXR3ZWVuIHdoaXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYmxhY2suPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFscGhhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmFscGhhIHZhbHVlIHJlbGF0aXZlIHRvIGN1cnJlbnQgY29sb3IgcmFuZ2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IGlzIDAtMjU1KTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInJlc3VsdGluZyBjb2xvclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAyODAsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yZWQgb3IgaHVlIHZhbHVlIHJlbGF0aXZlIHRvXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBjb2xvciByYW5nZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ncmVlbiBvciBzYXR1cmF0aW9uIHZhbHVlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb2xvciByYW5nZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ibHVlIG9yIGJyaWdodG5lc3MgdmFsdWVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFscGhhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5Db2xvclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDI5MixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmEgY29sb3Igc3RyaW5nPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjk3LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHJlZCxncmVlbixibHVlICZhbXA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxwaGEgY29tcG9uZW50cyBvZiB0aGUgY29sb3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5Db2xvclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDMwMyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbG9yXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3IvY3JlYXRpbmdfcmVhZGluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMxOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5FeHRyYWN0cyB0aGUgZ3JlZW4gdmFsdWUgZnJvbSBhIGNvbG9yIG9yIHBpeGVsIGFycmF5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdyZWVuXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2xvclwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cDUuQ29sb3Igb2JqZWN0LCBjb2xvciBjb21wb25lbnRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBDU1MgY29sb3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LkNvbG9yfE51bWJlcltdfFN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIGdyZWVuIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgYyA9IGNvbG9yKDIwLCA3NSwgMjAwKTsgLy8gRGVmaW5lIGNvbG9yICdjJ1xcbmZpbGwoYyk7IC8vIFVzZSBjb2xvciB2YXJpYWJsZSAnYycgYXMgZmlsbCBjb2xvclxcbnJlY3QoMTUsIDIwLCAzNSwgNjApOyAvLyBEcmF3IGxlZnQgcmVjdGFuZ2xlXFxuXFxudmFyIGdyZWVuVmFsdWUgPSBncmVlbihjKTsgLy8gR2V0IGdyZWVuIGluICdjJ1xcbnByaW50KGdyZWVuVmFsdWUpOyAvLyBQcmludCBcXFwiNzUuMFxcXCJcXG5maWxsKDAsIGdyZWVuVmFsdWUsIDApOyAvLyBVc2UgJ2dyZWVuVmFsdWUnIGluIG5ldyBmaWxsXFxucmVjdCg1MCwgMjAsIDM1LCA2MCk7IC8vIERyYXcgcmlnaHQgcmVjdGFuZ2xlXFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJibHVlIHJlY3Qgb24gbGVmdCBhbmQgZ3JlZW4gb24gcmlnaHQsIGJvdGggd2l0aCBibGFjayBvdXRsaW5lcyAmIDM1eDYwLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNyZWF0aW5nICYgUmVhZGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9jcmVhdGluZ19yZWFkaW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzUwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkV4dHJhY3RzIHRoZSBodWUgdmFsdWUgZnJvbSBhIGNvbG9yIG9yIHBpeGVsIGFycmF5LjwvcD5cXG48cD5IdWUgZXhpc3RzIGluIGJvdGggSFNCIGFuZCBIU0wuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlXFxuSFNCLW5vcm1hbGl6ZWQgaHVlIHdoZW4gc3VwcGxpZWQgd2l0aCBhbiBIU0IgY29sb3Igb2JqZWN0IChvciB3aGVuIHN1cHBsaWVkXFxud2l0aCBhIHBpeGVsIGFycmF5IHdoaWxlIHRoZSBjb2xvciBtb2RlIGlzIEhTQiksIGJ1dCB3aWxsIGRlZmF1bHQgdG8gdGhlXFxuSFNMLW5vcm1hbGl6ZWQgaHVlIG90aGVyd2lzZS4gKFRoZSB2YWx1ZXMgd2lsbCBvbmx5IGJlIGRpZmZlcmVudCBpZiB0aGVcXG5tYXhpbXVtIGh1ZSBzZXR0aW5nIGZvciBlYWNoIHN5c3RlbSBpcyBkaWZmZXJlbnQuKTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImh1ZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LkNvbG9yIG9iamVjdCwgY29sb3IgY29tcG9uZW50cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgQ1NTIGNvbG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5Db2xvcnxOdW1iZXJbXXxTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBodWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbm5vU3Ryb2tlKCk7XFxuY29sb3JNb2RlKEhTQiwgMjU1KTtcXG52YXIgYyA9IGNvbG9yKDAsIDEyNiwgMjU1KTtcXG5maWxsKGMpO1xcbnJlY3QoMTUsIDIwLCAzNSwgNjApO1xcbnZhciB2YWx1ZSA9IGh1ZShjKTsgLy8gU2V0cyAndmFsdWUnIHRvIFxcXCIwXFxcIlxcbmZpbGwodmFsdWUpO1xcbnJlY3QoNTAsIDIwLCAzNSwgNjApO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwic2FsbW9uIHBpbmsgcmVjdCBvbiBsZWZ0IGFuZCBibGFjayBvbiByaWdodCwgYm90aCAzNXg2MC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb2xvclwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDcmVhdGluZyAmIFJlYWRpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3IvY3JlYXRpbmdfcmVhZGluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM4NyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5CbGVuZHMgdHdvIGNvbG9ycyB0byBmaW5kIGEgdGhpcmQgY29sb3Igc29tZXdoZXJlIGJldHdlZW4gdGhlbS4gVGhlIGFtdFxcbnBhcmFtZXRlciBpcyB0aGUgYW1vdW50IHRvIGludGVycG9sYXRlIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgd2hlcmUgMC4wXFxuZXF1YWwgdG8gdGhlIGZpcnN0IGNvbG9yLCAwLjEgaXMgdmVyeSBuZWFyIHRoZSBmaXJzdCBjb2xvciwgMC41IGlzIGhhbGZ3YXlcXG5pbiBiZXR3ZWVuLCBldGMuIEFuIGFtb3VudCBiZWxvdyAwIHdpbGwgYmUgdHJlYXRlZCBhcyAwLiBMaWtld2lzZSwgYW1vdW50c1xcbmFib3ZlIDEgd2lsbCBiZSBjYXBwZWQgYXQgMS4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYmVoYXZpb3Igb2YgbGVycCgpLFxcbmJ1dCBuZWNlc3NhcnkgYmVjYXVzZSBvdGhlcndpc2UgbnVtYmVycyBvdXRzaWRlIHRoZSByYW5nZSB3aWxsIHByb2R1Y2VcXG5zdHJhbmdlIGFuZCB1bmV4cGVjdGVkIGNvbG9ycy5cXG48YnI+PGJyPlxcblRoZSB3YXkgdGhhdCBjb2xvdXJzIGFyZSBpbnRlcnBvbGF0ZWQgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBjb2xvciBtb2RlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxlcnBDb2xvclwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYzFcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmludGVycG9sYXRlIGZyb20gdGhpcyBjb2xvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29sb3JcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjMlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW50ZXJwb2xhdGUgdG8gdGhpcyBjb2xvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29sb3JcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbXRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBiZXR3ZWVuIDAgYW5kIDE8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaW50ZXJwb2xhdGVkIGNvbG9yXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29sb3JcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmNvbG9yTW9kZShSR0IpO1xcbnN0cm9rZSgyNTUpO1xcbmJhY2tncm91bmQoNTEpO1xcbnZhciBmcm9tID0gY29sb3IoMjE4LCAxNjUsIDMyKTtcXG52YXIgdG8gPSBjb2xvcig3MiwgNjEsIDEzOSk7XFxuY29sb3JNb2RlKFJHQik7IC8vIFRyeSBjaGFuZ2luZyB0byBIU0IuXFxudmFyIGludGVyQSA9IGxlcnBDb2xvcihmcm9tLCB0bywgMC4zMyk7XFxudmFyIGludGVyQiA9IGxlcnBDb2xvcihmcm9tLCB0bywgMC42Nik7XFxuZmlsbChmcm9tKTtcXG5yZWN0KDEwLCAyMCwgMjAsIDYwKTtcXG5maWxsKGludGVyQSk7XFxucmVjdCgzMCwgMjAsIDIwLCA2MCk7XFxuZmlsbChpbnRlckIpO1xcbnJlY3QoNTAsIDIwLCAyMCwgNjApO1xcbmZpbGwodG8pO1xcbnJlY3QoNzAsIDIwLCAyMCwgNjApO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiNCByZWN0cyBvbmUgdGFuLCBicm93biwgYnJvd25pc2ggcHVycGxlLCBwdXJwbGUsIHdpdGggd2hpdGUgb3V0bGluZXMgJiAyMHg2MFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNyZWF0aW5nICYgUmVhZGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9jcmVhdGluZ19yZWFkaW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDg0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkV4dHJhY3RzIHRoZSBIU0wgbGlnaHRuZXNzIHZhbHVlIGZyb20gYSBjb2xvciBvciBwaXhlbCBhcnJheS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJsaWdodG5lc3NcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbG9yXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5Db2xvciBvYmplY3QsIGNvbG9yIGNvbXBvbmVudHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENTUyBjb2xvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29sb3J8TnVtYmVyW118U3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbGlnaHRuZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5ub1N0cm9rZSgpO1xcbmNvbG9yTW9kZShIU0wpO1xcbnZhciBjID0gY29sb3IoMTU2LCAxMDAsIDUwLCAxKTtcXG5maWxsKGMpO1xcbnJlY3QoMTUsIDIwLCAzNSwgNjApO1xcbnZhciB2YWx1ZSA9IGxpZ2h0bmVzcyhjKTsgLy8gU2V0cyAndmFsdWUnIHRvIDUwXFxuZmlsbCh2YWx1ZSk7XFxucmVjdCg1MCwgMjAsIDM1LCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJsaWdodCBwYXN0ZWwgZ3JlZW4gcmVjdCBvbiBsZWZ0IGFuZCBkYXJrIGdyZXkgcmVjdCBvbiByaWdodCwgYm90aCAzNXg2MC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb2xvclwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDcmVhdGluZyAmIFJlYWRpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3IvY3JlYXRpbmdfcmVhZGluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUxNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5FeHRyYWN0cyB0aGUgcmVkIHZhbHVlIGZyb20gYSBjb2xvciBvciBwaXhlbCBhcnJheS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyZWRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbG9yXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5Db2xvciBvYmplY3QsIGNvbG9yIGNvbXBvbmVudHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENTUyBjb2xvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29sb3J8TnVtYmVyW118U3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgcmVkIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgYyA9IGNvbG9yKDI1NSwgMjA0LCAwKTsgLy8gRGVmaW5lIGNvbG9yICdjJ1xcbmZpbGwoYyk7IC8vIFVzZSBjb2xvciB2YXJpYWJsZSAnYycgYXMgZmlsbCBjb2xvclxcbnJlY3QoMTUsIDIwLCAzNSwgNjApOyAvLyBEcmF3IGxlZnQgcmVjdGFuZ2xlXFxuXFxudmFyIHJlZFZhbHVlID0gcmVkKGMpOyAvLyBHZXQgcmVkIGluICdjJ1xcbnByaW50KHJlZFZhbHVlKTsgLy8gUHJpbnQgXFxcIjI1NS4wXFxcIlxcbmZpbGwocmVkVmFsdWUsIDAsIDApOyAvLyBVc2UgJ3JlZFZhbHVlJyBpbiBuZXcgZmlsbFxcbnJlY3QoNTAsIDIwLCAzNSwgNjApOyAvLyBEcmF3IHJpZ2h0IHJlY3RhbmdsZVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmNvbG9yTW9kZShSR0IsIDI1NSk7XFxudmFyIGMgPSBjb2xvcigxMjcsIDI1NSwgMCk7XFxuY29sb3JNb2RlKFJHQiwgMSk7XFxudmFyIG15Q29sb3IgPSByZWQoYyk7XFxucHJpbnQobXlDb2xvcik7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ5ZWxsb3cgcmVjdCBvbiBsZWZ0IGFuZCByZWQgcmVjdCBvbiByaWdodCwgYm90aCB3aXRoIGJsYWNrIG91dGxpbmVzIGFuZCAzNXg2MC5cXG5ncmV5IGNhbnZhc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNyZWF0aW5nICYgUmVhZGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9jcmVhdGluZ19yZWFkaW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTU0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkV4dHJhY3RzIHRoZSBzYXR1cmF0aW9uIHZhbHVlIGZyb20gYSBjb2xvciBvciBwaXhlbCBhcnJheS48L3A+XFxuPHA+U2F0dXJhdGlvbiBpcyBzY2FsZWQgZGlmZmVyZW50bHkgaW4gSFNCIGFuZCBIU0wuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm5cXG50aGUgSFNCIHNhdHVyYXRpb24gd2hlbiBzdXBwbGllZCB3aXRoIGFuIEhTQiBjb2xvciBvYmplY3QgKG9yIHdoZW4gc3VwcGxpZWRcXG53aXRoIGEgcGl4ZWwgYXJyYXkgd2hpbGUgdGhlIGNvbG9yIG1vZGUgaXMgSFNCKSwgYnV0IHdpbGwgZGVmYXVsdCB0byB0aGVcXG5IU0wgc2F0dXJhdGlvbiBvdGhlcndpc2UuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2F0dXJhdGlvblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LkNvbG9yIG9iamVjdCwgY29sb3IgY29tcG9uZW50cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgQ1NTIGNvbG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5Db2xvcnxOdW1iZXJbXXxTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBzYXR1cmF0aW9uIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5ub1N0cm9rZSgpO1xcbmNvbG9yTW9kZShIU0IsIDI1NSk7XFxudmFyIGMgPSBjb2xvcigwLCAxMjYsIDI1NSk7XFxuZmlsbChjKTtcXG5yZWN0KDE1LCAyMCwgMzUsIDYwKTtcXG52YXIgdmFsdWUgPSBzYXR1cmF0aW9uKGMpOyAvLyBTZXRzICd2YWx1ZScgdG8gMTI2XFxuZmlsbCh2YWx1ZSk7XFxucmVjdCg1MCwgMjAsIDM1LCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJkZWVwIHBpbmsgcmVjdCBvbiBsZWZ0IGFuZCBncmV5IHJlY3Qgb24gcmlnaHQsIGJvdGggMzV4NjAuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ3JlYXRpbmcgJiBSZWFkaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL3A1LkNvbG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb2xvciBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcuIFRoaXMgY2FuIGJlIHVzZWZ1bFxcbmZvciBkZWJ1Z2dpbmcsIG9yIGZvciB1c2luZyBwNS5qcyB3aXRoIG90aGVyIGxpYnJhcmllcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0b1N0cmluZ1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Ib3cgdGhlIGNvbG9yIHN0cmluZyB3aWxsIGJlIGZvcm1hdHRlZC5cXG5MZWF2aW5nIHRoaXMgZW1wdHkgZm9ybWF0cyB0aGUgc3RyaW5nIGFzIHJnYmEociwgZywgYiwgYSkuXFxuJiMzOTsjcmdiJiMzOTsgJiMzOTsjcmdiYSYjMzk7ICYjMzk7I3JyZ2diYiYjMzk7IGFuZCAmIzM5OyNycmdnYmJhYSYjMzk7IGZvcm1hdCBhcyBoZXhhZGVjaW1hbCBjb2xvciBjb2Rlcy5cXG4mIzM5O3JnYiYjMzk7ICYjMzk7aHNiJiMzOTsgYW5kICYjMzk7aHNsJiMzOTsgcmV0dXJuIHRoZSBjb2xvciBmb3JtYXR0ZWQgaW4gdGhlIHNwZWNpZmllZCBjb2xvciBtb2RlLlxcbiYjMzk7cmdiYSYjMzk7ICYjMzk7aHNiYSYjMzk7IGFuZCAmIzM5O2hzbGEmIzM5OyBhcmUgdGhlIHNhbWUgYXMgYWJvdmUgYnV0IHdpdGggYWxwaGEgY2hhbm5lbHMuXFxuJiMzOTtyZ2IlJiMzOTsgJiMzOTtoc2IlJiMzOTsgJiMzOTtoc2wlJiMzOTsgJiMzOTtyZ2JhJSYjMzk7ICYjMzk7aHNiYSUmIzM5OyBhbmQgJiMzOTtoc2xhJSYjMzk7IGZvcm1hdCBhcyBwZXJjZW50YWdlcy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgZm9ybWF0dGVkIHN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIG15Q29sb3I7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMjAwLCAyMDApO1xcbiAgc3Ryb2tlKDI1NSk7XFxuICBteUNvbG9yID0gY29sb3IoMTAwLCAxMDAsIDI1MCk7XFxuICBmaWxsKG15Q29sb3IpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgdGV4dChteUNvbG9yLnRvU3RyaW5nKCksIDEwLCAxMCk7XFxuICB0ZXh0KG15Q29sb3IudG9TdHJpbmcoJyNycmdnYmInKSwgMTAsIDk1KTtcXG4gIHRleHQobXlDb2xvci50b1N0cmluZygncmdiYSUnKSwgMTAsIDE4MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiY2FudmFzIHdpdGggdGV4dCByZXByZXNlbnRhdGlvbiBvZiBjb2xvclwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNyZWF0aW5nICYgUmVhZGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9wNS5Db2xvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI0NyxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFJlZFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgbmV3IHJlZCB2YWx1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGJhY2tncm91bmRDb2xvcjtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGJhY2tncm91bmRDb2xvciA9IGNvbG9yKDEwMCwgNTAsIDE1MCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kQ29sb3Iuc2V0UmVkKDEyOCArIDEyOCAqIHNpbihtaWxsaXMoKSAvIDEwMDApKTtcXG4gIGJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJjYW52YXMgd2l0aCBncmFkdWFsbHkgY2hhbmdpbmcgYmFja2dyb3VuZCBjb2xvclwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNyZWF0aW5nICYgUmVhZGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9wNS5Db2xvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI3NCxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldEdyZWVuXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJncmVlblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIG5ldyBncmVlbiB2YWx1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGJhY2tncm91bmRDb2xvcjtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGJhY2tncm91bmRDb2xvciA9IGNvbG9yKDEwMCwgNTAsIDE1MCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kQ29sb3Iuc2V0R3JlZW4oMTI4ICsgMTI4ICogc2luKG1pbGxpcygpIC8gMTAwMCkpO1xcbiAgYmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImNhbnZhcyB3aXRoIGdyYWR1YWxseSBjaGFuZ2luZyBiYWNrZ3JvdW5kIGNvbG9yXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQ29sb3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ3JlYXRpbmcgJiBSZWFkaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL3A1LkNvbG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzAxLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0Qmx1ZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYmx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIG5ldyBibHVlIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgYmFja2dyb3VuZENvbG9yO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZENvbG9yID0gY29sb3IoMTAwLCA1MCwgMTUwKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmRDb2xvci5zZXRCbHVlKDEyOCArIDEyOCAqIHNpbihtaWxsaXMoKSAvIDEwMDApKTtcXG4gIGJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJjYW52YXMgd2l0aCBncmFkdWFsbHkgY2hhbmdpbmcgYmFja2dyb3VuZCBjb2xvclwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNyZWF0aW5nICYgUmVhZGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9wNS5Db2xvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMyOCxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldEFscGhhXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbHBoYVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIG5ldyBhbHBoYSB2YWx1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIHNxdWFyZUNvbG9yO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgZWxsaXBzZU1vZGUoQ09STkVSUyk7XFxuICBzdHJva2VXZWlnaHQoNCk7XFxuICBzcXVhcmVDb2xvciA9IGNvbG9yKDEwMCwgNTAsIDE1MCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDI1NSk7XFxuXFxuICBub0ZpbGwoKTtcXG4gIHN0cm9rZSgwKTtcXG4gIGVsbGlwc2UoMTAsIDEwLCB3aWR0aCAtIDEwLCBoZWlnaHQgLSAxMCk7XFxuXFxuICBzcXVhcmVDb2xvci5zZXRBbHBoYSgxMjggKyAxMjggKiBzaW4obWlsbGlzKCkgLyAxMDAwKSk7XFxuICBmaWxsKHNxdWFyZUNvbG9yKTtcXG4gIG5vU3Ryb2tlKCk7XFxuICByZWN0KDEzLCAxMywgd2lkdGggLSAyNiwgaGVpZ2h0IC0gMjYpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImNpcmNsZSBiZWhpbmQgYSBzcXVhcmUgd2l0aCBncmFkdWFsbHkgY2hhbmdpbmcgb3BhY2l0eVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNyZWF0aW5nICYgUmVhZGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9wNS5Db2xvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQwNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5IdWUgaXMgdGhlIHNhbWUgaW4gSFNCIGFuZCBIU0wsIGJ1dCB0aGUgbWF4aW11bSB2YWx1ZSBtYXkgYmUgZGlmZmVyZW50LlxcblRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIEhTQi1ub3JtYWxpemVkIHNhdHVyYXRpb24gd2hlbiBzdXBwbGllZCB3aXRoXFxuYW4gSFNCIGNvbG9yIG9iamVjdCwgYnV0IHdpbGwgZGVmYXVsdCB0byB0aGUgSFNMLW5vcm1hbGl6ZWQgc2F0dXJhdGlvblxcbm90aGVyd2lzZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQ29sb3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ3JlYXRpbmcgJiBSZWFkaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL3A1LkNvbG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDM3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNhdHVyYXRpb24gaXMgc2NhbGVkIGRpZmZlcmVudGx5IGluIEhTQiBhbmQgSFNMLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuXFxudGhlIEhTQiBzYXR1cmF0aW9uIHdoZW4gc3VwcGxpZWQgd2l0aCBhbiBIU0IgY29sb3Igb2JqZWN0LCBidXQgd2lsbCBkZWZhdWx0XFxudG8gdGhlIEhTTCBzYXR1cmF0aW9uIG90aGVyd2lzZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQ29sb3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ3JlYXRpbmcgJiBSZWFkaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL3A1LkNvbG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDU2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNTUyBuYW1lZCBjb2xvcnMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNyZWF0aW5nICYgUmVhZGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9wNS5Db2xvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDYwOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGVzZSByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBwYXR0ZXJucyBmb3IgbWF0Y2hpbmdcXG52aWFibGUgQ1NTIGNvbG9yIHN0cmluZ3M6IGZyYWdtZW50aW5nIHRoZSByZWdleGVzIGluIHRoaXMgd2F5IGluY3JlYXNlcyB0aGVcXG5sZWdpYmlsaXR5IGFuZCBjb21wcmVoZW5zaWJpbGl0eSBvZiB0aGUgY29kZS48L3A+XFxuPHA+Tm90ZSB0aGF0IFJHQiB2YWx1ZXMgb2YgLjkgYXJlIG5vdCBwYXJzZWQgYnkgSUUsIGJ1dCBhcmUgc3VwcG9ydGVkIGhlcmUgZm9yXFxuY29sb3Igc3RyaW5nIGNvbnNpc3RlbmN5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Db2xvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb2xvclwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDcmVhdGluZyAmIFJlYWRpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3IvcDUuQ29sb3IuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2MjIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RnVsbCBjb2xvciBzdHJpbmcgcGF0dGVybnMuIFRoZSBjYXB0dXJlIGdyb3VwcyBhcmUgbmVjZXNzYXJ5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Db2xvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb2xvclwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDcmVhdGluZyAmIFJlYWRpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3IvcDUuQ29sb3IuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5NzYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Rm9yIEhTQiBhbmQgSFNMLCBpbnRlcnByZXQgdGhlIGdyYXkgbGV2ZWwgYXMgYSBicmlnaHRuZXNzL2xpZ2h0bmVzc1xcbnZhbHVlICh0aGV5IGFyZSBlcXVpdmFsZW50IHdoZW4gY2hyb21hIGlzIHplcm8pLiBGb3IgUkdCLCBub3JtYWxpemUgdGhlXFxuZ3JheSBsZXZlbCBhY2NvcmRpbmcgdG8gdGhlIGJsdWUgbWF4aW11bS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQ29sb3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ3JlYXRpbmcgJiBSZWFkaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL3NldHRpbmcuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgYmFja2dyb3VuZCgpIGZ1bmN0aW9uIHNldHMgdGhlIGNvbG9yIHVzZWQgZm9yIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZVxcbnA1LmpzIGNhbnZhcy4gVGhlIGRlZmF1bHQgYmFja2dyb3VuZCBpcyBsaWdodCBncmF5LiBUaGlzIGZ1bmN0aW9uIGlzXFxudHlwaWNhbGx5IHVzZWQgd2l0aGluIGRyYXcoKSB0byBjbGVhciB0aGUgZGlzcGxheSB3aW5kb3cgYXQgdGhlIGJlZ2lubmluZ1xcbm9mIGVhY2ggZnJhbWUsIGJ1dCBpdCBjYW4gYmUgdXNlZCBpbnNpZGUgc2V0dXAoKSB0byBzZXQgdGhlIGJhY2tncm91bmQgb25cXG50aGUgZmlyc3QgZnJhbWUgb2YgYW5pbWF0aW9uIG9yIGlmIHRoZSBiYWNrZ3JvdW5kIG5lZWQgb25seSBiZSBzZXQgb25jZS5cXG48YnI+PGJyPlxcblRoZSBjb2xvciBpcyBlaXRoZXIgc3BlY2lmaWVkIGluIHRlcm1zIG9mIHRoZSBSR0IsIEhTQiwgb3IgSFNMIGNvbG9yXFxuZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbG9yTW9kZS4gKFRoZSBkZWZhdWx0IGNvbG9yIHNwYWNlIGlzIFJHQiwgd2l0aFxcbmVhY2ggdmFsdWUgaW4gdGhlIHJhbmdlIGZyb20gMCB0byAyNTUpLiBUaGUgYWxwaGEgcmFuZ2UgYnkgZGVmYXVsdCBpcyBhbHNvIDAgdG8gMjU1Llxcbjxicj48YnI+XFxuSWYgYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBSR0IsIFJHQkEgYW5kIEhleCBDU1MgY29sb3Igc3RyaW5nc1xcbmFuZCBhbGwgbmFtZWQgY29sb3Igc3RyaW5ncyBhcmUgc3VwcG9ydGVkLiBJbiB0aGlzIGNhc2UsIGFuIGFscGhhIG51bWJlclxcbnZhbHVlIGFzIGEgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBSR0JBIGZvcm0gc2hvdWxkIGJlIHVzZWQuXFxuPGJyPjxicj5cXG5BIHA1LkNvbG9yIG9iamVjdCBjYW4gYWxzbyBiZSBwcm92aWRlZCB0byBzZXQgdGhlIGJhY2tncm91bmQgY29sb3IuXFxuPGJyPjxicj5cXG5BIHA1LkltYWdlIGNhbiBhbHNvIGJlIHByb3ZpZGVkIHRvIHNldCB0aGUgYmFja2dyb3VuZCBpbWFnZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJiYWNrZ3JvdW5kXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gR3JheXNjYWxlIGludGVnZXIgdmFsdWVcXG5iYWNrZ3JvdW5kKDUxKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBSLCBHICYgQiBpbnRlZ2VyIHZhbHVlc1xcbmJhY2tncm91bmQoMjU1LCAyMDQsIDApO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIEgsIFMgJiBCIGludGVnZXIgdmFsdWVzXFxuY29sb3JNb2RlKEhTQik7XFxuYmFja2dyb3VuZCgyNTUsIDIwNCwgMTAwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBOYW1lZCBTVkcvQ1NTIGNvbG9yIHN0cmluZ1xcbmJhY2tncm91bmQoJ3JlZCcpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIHRocmVlLWRpZ2l0IGhleGFkZWNpbWFsIFJHQiBub3RhdGlvblxcbmJhY2tncm91bmQoJyNmYWUnKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBzaXgtZGlnaXQgaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uXFxuYmFja2dyb3VuZCgnIzIyMjIyMicpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIGludGVnZXIgUkdCIG5vdGF0aW9uXFxuYmFja2dyb3VuZCgncmdiKDAsMjU1LDApJyk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gaW50ZWdlciBSR0JBIG5vdGF0aW9uXFxuYmFja2dyb3VuZCgncmdiYSgwLDI1NSwwLCAwLjI1KScpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIHBlcmNlbnRhZ2UgUkdCIG5vdGF0aW9uXFxuYmFja2dyb3VuZCgncmdiKDEwMCUsMCUsMTAlKScpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIHBlcmNlbnRhZ2UgUkdCQSBub3RhdGlvblxcbmJhY2tncm91bmQoJ3JnYmEoMTAwJSwwJSwxMDAlLDAuNSknKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBwNSBDb2xvciBvYmplY3RcXG5iYWNrZ3JvdW5kKGNvbG9yKDAsIDAsIDI1NSkpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiY2FudmFzIHdpdGggZGFya2VzdCBjaGFyY29hbCBncmV5IGJhY2tncm91bmQuXFxuY2FudmFzIHdpdGggeWVsbG93IGJhY2tncm91bmQuXFxuY2FudmFzIHdpdGggcm95YWwgYmx1ZSBiYWNrZ3JvdW5kLlxcbmNhbnZhcyB3aXRoIHJlZCBiYWNrZ3JvdW5kLlxcbmNhbnZhcyB3aXRoIHBpbmsgYmFja2dyb3VuZC5cXG5jYW52YXMgd2l0aCBibGFjayBiYWNrZ3JvdW5kLlxcbmNhbnZhcyB3aXRoIGJyaWdodCBncmVlbiBiYWNrZ3JvdW5kLlxcbmNhbnZhcyB3aXRoIHNvZnQgZ3JlZW4gYmFja2dyb3VuZC5cXG5jYW52YXMgd2l0aCByZWQgYmFja2dyb3VuZC5cXG5jYW52YXMgd2l0aCBsaWdodCBwdXJwbGUgYmFja2dyb3VuZC5cXG5jYW52YXMgd2l0aCBibHVlIGJhY2tncm91bmQuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU2V0dGluZ1wiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE1LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YW55IHZhbHVlIGNyZWF0ZWQgYnkgdGhlIGNvbG9yKCkgZnVuY3Rpb248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxMzEsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2xvcnN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb2xvciBzdHJpbmcsIHBvc3NpYmxlIGZvcm1hdHMgaW5jbHVkZTogaW50ZWdlclxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJnYigpIG9yIHJnYmEoKSwgcGVyY2VudGFnZSByZ2IoKSBvciByZ2JhKCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgMy1kaWdpdCBoZXgsIDYtZGlnaXQgaGV4PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+b3BhY2l0eSBvZiB0aGUgYmFja2dyb3VuZCByZWxhdGl2ZSB0byBjdXJyZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIHJhbmdlIChkZWZhdWx0IGlzIDAtMjU1KTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTQxLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ3JheVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zcGVjaWZpZXMgYSB2YWx1ZSBiZXR3ZWVuIHdoaXRlIGFuZCBibGFjazwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxNDgsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yZWQgb3IgaHVlIHZhbHVlIChkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sb3JcXG4gICAgICAgICAgICAgICAgICAgICAgIG1vZGUpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWUgKGRlcGVuZGluZyBvbiB0aGUgY3VycmVudFxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgbW9kZSk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Ymx1ZSBvciBicmlnaHRuZXNzIHZhbHVlIChkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnRcXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIG1vZGUpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE2MCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hbiBhcnJheSBjb250YWluaW5nIHRoZSByZWQsZ3JlZW4sYmx1ZSAmYW1wO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFscGhhIGNvbXBvbmVudHMgb2YgdGhlIGNvbG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcltdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTY3LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW1hZ2UgY3JlYXRlZCB3aXRoIGxvYWRJbWFnZSgpIG9yIGNyZWF0ZUltYWdlKCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNldCBhcyBiYWNrZ3JvdW5kXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtdXN0IGJlIHNhbWUgc2l6ZSBhcyB0aGUgc2tldGNoIHdpbmRvdyk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuSW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3Ivc2V0dGluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE4NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DbGVhcnMgdGhlIHBpeGVscyB3aXRoaW4gYSBidWZmZXIuIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBvbiBwNS5DYW52YXNcXG5vYmplY3RzIGNyZWF0ZWQgd2l0aCB0aGUgY3JlYXRlQ2FudmFzKCkgZnVuY3Rpb247IGl0IHdvbiYjMzk7dCB3b3JrIHdpdGggdGhlXFxubWFpbiBkaXNwbGF5IHdpbmRvdy4gVW5saWtlIHRoZSBtYWluIGdyYXBoaWNzIGNvbnRleHQsIHBpeGVscyBpblxcbmFkZGl0aW9uYWwgZ3JhcGhpY3MgYXJlYXMgY3JlYXRlZCB3aXRoIGNyZWF0ZUdyYXBoaWNzKCkgY2FuIGJlIGVudGlyZWx5XFxub3IgcGFydGlhbGx5IHRyYW5zcGFyZW50LiBUaGlzIGZ1bmN0aW9uIGNsZWFycyBldmVyeXRoaW5nIHRvIG1ha2UgYWxsIG9mXFxudGhlIHBpeGVscyAxMDAlIHRyYW5zcGFyZW50LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNsZWFyXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gQ2xlYXIgdGhlIHNjcmVlbiBvbiBtb3VzZSBwcmVzcy5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBlbGxpcHNlKG1vdXNlWCwgbW91c2VZLCAyMCwgMjApO1xcbn1cXG5cXG5mdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XFxuICBjbGVhcigpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjIweDIwIHdoaXRlIGVsbGlwc2VzIGFyZSBjb250aW51YWxseSBkcmF3biBhdCBtb3VzZSB4IGFuZCB5IGNvb3JkaW5hdGVzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlNldHRpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29sb3Ivc2V0dGluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIyMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb2xvck1vZGUoKSBjaGFuZ2VzIHRoZSB3YXkgcDUuanMgaW50ZXJwcmV0cyBjb2xvciBkYXRhLiBCeSBkZWZhdWx0LCB0aGVcXG5wYXJhbWV0ZXJzIGZvciBmaWxsKCksIHN0cm9rZSgpLCBiYWNrZ3JvdW5kKCksIGFuZCBjb2xvcigpIGFyZSBkZWZpbmVkIGJ5XFxudmFsdWVzIGJldHdlZW4gMCBhbmQgMjU1IHVzaW5nIHRoZSBSR0IgY29sb3IgbW9kZWwuIFRoaXMgaXMgZXF1aXZhbGVudCB0b1xcbnNldHRpbmcgY29sb3JNb2RlKFJHQiwgMjU1KS4gU2V0dGluZyBjb2xvck1vZGUoSFNCKSBsZXRzIHlvdSB1c2UgdGhlIEhTQlxcbnN5c3RlbSBpbnN0ZWFkLiBCeSBkZWZhdWx0LCB0aGlzIGlzIGNvbG9yTW9kZShIU0IsIDM2MCwgMTAwLCAxMDAsIDEpLiBZb3VcXG5jYW4gYWxzbyB1c2UgSFNMLlxcbjxicj48YnI+XFxuTm90ZTogZXhpc3RpbmcgY29sb3Igb2JqZWN0cyByZW1lbWJlciB0aGUgbW9kZSB0aGF0IHRoZXkgd2VyZSBjcmVhdGVkIGluLFxcbnNvIHlvdSBjYW4gY2hhbmdlIG1vZGVzIGFzIHlvdSBsaWtlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZWlyIGFwcGVhcmFuY2UuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JNb2RlXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxubm9TdHJva2UoKTtcXG5jb2xvck1vZGUoUkdCLCAxMDApO1xcbmZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyBpKyspIHtcXG4gIGZvciAodmFyIGogPSAwOyBqIDwgMTAwOyBqKyspIHtcXG4gICAgc3Ryb2tlKGksIGosIDApO1xcbiAgICBwb2ludChpLCBqKTtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxubm9TdHJva2UoKTtcXG5jb2xvck1vZGUoSFNCLCAxMDApO1xcbmZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyBpKyspIHtcXG4gIGZvciAodmFyIGogPSAwOyBqIDwgMTAwOyBqKyspIHtcXG4gICAgc3Ryb2tlKGksIGosIDEwMCk7XFxuICAgIHBvaW50KGksIGopO1xcbiAgfVxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5jb2xvck1vZGUoUkdCLCAyNTUpO1xcbnZhciBjID0gY29sb3IoMTI3LCAyNTUsIDApO1xcblxcbmNvbG9yTW9kZShSR0IsIDEpO1xcbnZhciBteUNvbG9yID0gYy5fZ2V0UmVkKCk7XFxudGV4dChteUNvbG9yLCAxMCwgMTAsIDgwLCA4MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxubm9GaWxsKCk7XFxuY29sb3JNb2RlKFJHQiwgMjU1LCAyNTUsIDI1NSwgMSk7XFxuYmFja2dyb3VuZCgyNTUpO1xcblxcbnN0cm9rZVdlaWdodCg0KTtcXG5zdHJva2UoMjU1LCAwLCAxMCwgMC4zKTtcXG5lbGxpcHNlKDQwLCA0MCwgNTAsIDUwKTtcXG5lbGxpcHNlKDUwLCA1MCwgNDAsIDQwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIkdyZWVuIHRvIHJlZCBncmFkaWVudCBmcm9tIGJvdHRvbSBMIHRvIHRvcCBSLiBzaGFkaW5nIG9yaWdpbmF0ZXMgZnJvbSB0b3AgbGVmdC5cXG5SYWluYm93IGdyYWRpZW50IGZyb20gbGVmdCB0byByaWdodC4gQnJpZ2h0bmVzcyBpbmNyZWFzaW5nIHRvIHdoaXRlIGF0IHRvcC5cXG51bmtub3duIGltYWdlLlxcbjUweDUwIGVsbGlwc2UgYXQgbWlkZGxlIEwgJiA0MHg0MCBlbGxpcHNlIGF0IGNlbnRlci4gVHJhbnNsdXNjZW50IHBpbmsgb3V0bGluZXMuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU2V0dGluZ1wiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDIyMyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm1vZGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZWl0aGVyIFJHQiwgSFNCIG9yIEhTTCwgY29ycmVzcG9uZGluZyB0b1xcbiAgICAgICAgICAgICAgICAgICAgICAgICBSZWQvR3JlZW4vQmx1ZSBhbmQgSHVlL1NhdHVyYXRpb24vQnJpZ2h0bmVzc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAob3IgTGlnaHRuZXNzKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJDb25zdGFudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm1heFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yYW5nZSBmb3IgYWxsIHZhbHVlczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMzAwLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibW9kZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJDb25zdGFudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm1heDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cmFuZ2UgZm9yIHRoZSByZWQgb3IgaHVlIGRlcGVuZGluZyBvbiB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgY29sb3IgbW9kZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtYXgyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnJhbmdlIGZvciB0aGUgZ3JlZW4gb3Igc2F0dXJhdGlvbiBkZXBlbmRpbmdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBjdXJyZW50IGNvbG9yIG1vZGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibWF4M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yYW5nZSBmb3IgdGhlIGJsdWUgb3IgYnJpZ2h0bmVzcy9saWdobnRlc3NcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2xvciBtb2RlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm1heEFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cmFuZ2UgZm9yIHRoZSBhbHBoYTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL3NldHRpbmcuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzNDQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyB0aGUgY29sb3IgdXNlZCB0byBmaWxsIHNoYXBlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBydW5cXG5maWxsKDIwNCwgMTAyLCAwKSwgYWxsIHN1YnNlcXVlbnQgc2hhcGVzIHdpbGwgYmUgZmlsbGVkIHdpdGggb3JhbmdlLiBUaGlzXFxuY29sb3IgaXMgZWl0aGVyIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiB0aGUgUkdCIG9yIEhTQiBjb2xvciBkZXBlbmRpbmcgb25cXG50aGUgY3VycmVudCBjb2xvck1vZGUoKS4gKFRoZSBkZWZhdWx0IGNvbG9yIHNwYWNlIGlzIFJHQiwgd2l0aCBlYWNoIHZhbHVlXFxuaW4gdGhlIHJhbmdlIGZyb20gMCB0byAyNTUpLiBUaGUgYWxwaGEgcmFuZ2UgYnkgZGVmYXVsdCBpcyBhbHNvIDAgdG8gMjU1Llxcbjxicj48YnI+XFxuSWYgYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBSR0IsIFJHQkEgYW5kIEhleCBDU1MgY29sb3Igc3RyaW5nc1xcbmFuZCBhbGwgbmFtZWQgY29sb3Igc3RyaW5ncyBhcmUgc3VwcG9ydGVkLiBJbiB0aGlzIGNhc2UsIGFuIGFscGhhIG51bWJlclxcbnZhbHVlIGFzIGEgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBSR0JBIGZvcm0gc2hvdWxkIGJlIHVzZWQuXFxuPGJyPjxicj5cXG5BIHA1IENvbG9yIG9iamVjdCBjYW4gYWxzbyBiZSBwcm92aWRlZCB0byBzZXQgdGhlIGZpbGwgY29sb3IuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsbFwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbi8vIEdyYXlzY2FsZSBpbnRlZ2VyIHZhbHVlXFxuZmlsbCg1MSk7XFxucmVjdCgyMCwgMjAsIDYwLCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gUiwgRyAmIEIgaW50ZWdlciB2YWx1ZXNcXG5maWxsKDI1NSwgMjA0LCAwKTtcXG5yZWN0KDIwLCAyMCwgNjAsIDYwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBILCBTICYgQiBpbnRlZ2VyIHZhbHVlc1xcbmNvbG9yTW9kZShIU0IpO1xcbmZpbGwoMjU1LCAyMDQsIDEwMCk7XFxucmVjdCgyMCwgMjAsIDYwLCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gTmFtZWQgU1ZHL0NTUyBjb2xvciBzdHJpbmdcXG5maWxsKCdyZWQnKTtcXG5yZWN0KDIwLCAyMCwgNjAsIDYwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyB0aHJlZS1kaWdpdCBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb25cXG5maWxsKCcjZmFlJyk7XFxucmVjdCgyMCwgMjAsIDYwLCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gc2l4LWRpZ2l0IGhleGFkZWNpbWFsIFJHQiBub3RhdGlvblxcbmZpbGwoJyMyMjIyMjInKTtcXG5yZWN0KDIwLCAyMCwgNjAsIDYwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBpbnRlZ2VyIFJHQiBub3RhdGlvblxcbmZpbGwoJ3JnYigwLDI1NSwwKScpO1xcbnJlY3QoMjAsIDIwLCA2MCwgNjApO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIGludGVnZXIgUkdCQSBub3RhdGlvblxcbmZpbGwoJ3JnYmEoMCwyNTUsMCwgMC4yNSknKTtcXG5yZWN0KDIwLCAyMCwgNjAsIDYwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBwZXJjZW50YWdlIFJHQiBub3RhdGlvblxcbmZpbGwoJ3JnYigxMDAlLDAlLDEwJSknKTtcXG5yZWN0KDIwLCAyMCwgNjAsIDYwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBwZXJjZW50YWdlIFJHQkEgbm90YXRpb25cXG5maWxsKCdyZ2JhKDEwMCUsMCUsMTAwJSwwLjUpJyk7XFxucmVjdCgyMCwgMjAsIDYwLCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gcDUgQ29sb3Igb2JqZWN0XFxuZmlsbChjb2xvcigwLCAwLCAyNTUpKTtcXG5yZWN0KDIwLCAyMCwgNjAsIDYwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjYweDYwIGRhcmsgY2hhcmNvYWwgZ3JleSByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBpbiBjZW50ZXIgb2YgY2FudmFzLlxcbjYweDYwIHllbGxvdyByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBpbiBjZW50ZXIgb2YgY2FudmFzLlxcbjYweDYwIHJveWFsIGJsdWUgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cXG42MHg2MCByZWQgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cXG42MHg2MCBwaW5rIHJlY3Qgd2l0aCBibGFjayBvdXRsaW5lIGluIGNlbnRlciBvZiBjYW52YXMuXFxuNjB4NjAgYmxhY2sgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cXG42MHg2MCBsaWdodCBncmVlbiByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBpbiBjZW50ZXIgb2YgY2FudmFzLlxcbjYweDYwIHNvZnQgZ3JlZW4gcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cXG42MHg2MCByZWQgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cXG42MHg2MCBkYXJrIGZ1c2hjaWEgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cXG42MHg2MCBibHVlIHJlY3Qgd2l0aCBibGFjayBvdXRsaW5lIGluIGNlbnRlciBvZiBjYW52YXMuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU2V0dGluZ1wiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDM0NCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnJlZCBvciBodWUgdmFsdWUgcmVsYXRpdmUgdG9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmJsdWUgb3IgYnJpZ2h0bmVzcyB2YWx1ZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWxwaGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDQ2OSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmEgY29sb3Igc3RyaW5nPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDQ3NSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImdyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YSBncmF5IHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFscGhhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA0ODIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YW4gYXJyYXkgY29udGFpbmluZyB0aGUgcmVkLGdyZWVuLGJsdWUgJmFtcDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIHRoZSBjb2xvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJbXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDQ4OSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbG9yXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBmaWxsIGNvbG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvbG9yL3NldHRpbmcuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MDEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RGlzYWJsZXMgZmlsbGluZyBnZW9tZXRyeS4gSWYgYm90aCBub1N0cm9rZSgpIGFuZCBub0ZpbGwoKSBhcmUgY2FsbGVkLFxcbm5vdGhpbmcgd2lsbCBiZSBkcmF3biB0byB0aGUgc2NyZWVuLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vRmlsbFwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnJlY3QoMTUsIDEwLCA1NSwgNTUpO1xcbm5vRmlsbCgpO1xcbnJlY3QoMjAsIDIwLCA2MCwgNjApO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2IG1vZGVybml6cj0nd2ViZ2wnPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgbm9GaWxsKCk7XFxuICBzdHJva2UoMTAwLCAxMDAsIDI0MCk7XFxuICByb3RhdGVYKGZyYW1lQ291bnQgKiAwLjAxKTtcXG4gIHJvdGF0ZVkoZnJhbWVDb3VudCAqIDAuMDEpO1xcbiAgYm94KDQ1LCA0NSwgNDUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIndoaXRlIHJlY3QgdG9wIG1pZGRsZSBhbmQgbm9GaWxsIHJlY3QgY2VudGVyLiBCb3RoIDYweDYwIHdpdGggYmxhY2sgb3V0bGluZXMuXFxuYmxhY2sgY2FudmFzIHdpdGggcHVycGxlIGN1YmUgd2lyZWZyYW1lIHNwaW5uaW5nXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU2V0dGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9zZXR0aW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTQyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRpc2FibGVzIGRyYXdpbmcgdGhlIHN0cm9rZSAob3V0bGluZSkuIElmIGJvdGggbm9TdHJva2UoKSBhbmQgbm9GaWxsKClcXG5hcmUgY2FsbGVkLCBub3RoaW5nIHdpbGwgYmUgZHJhd24gdG8gdGhlIHNjcmVlbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJub1N0cm9rZVwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbm5vU3Ryb2tlKCk7XFxucmVjdCgyMCwgMjAsIDYwLCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXYgbW9kZXJuaXpyPSd3ZWJnbCc+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMCk7XFxuICBub1N0cm9rZSgpO1xcbiAgZmlsbCgyNDAsIDE1MCwgMTUwKTtcXG4gIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xcbiAgcm90YXRlWShmcmFtZUNvdW50ICogMC4wMSk7XFxuICBib3goNDUsIDQ1LCA0NSk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiNjB4NjAgd2hpdGUgcmVjdCBhdCBjZW50ZXIuIG5vIG91dGxpbmUuXFxuYmxhY2sgY2FudmFzIHdpdGggcGluayBjdWJlIHNwaW5uaW5nXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29sb3JcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU2V0dGluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb2xvci9zZXR0aW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTgyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldHMgdGhlIGNvbG9yIHVzZWQgdG8gZHJhdyBsaW5lcyBhbmQgYm9yZGVycyBhcm91bmQgc2hhcGVzLiBUaGlzIGNvbG9yXFxuaXMgZWl0aGVyIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiB0aGUgUkdCIG9yIEhTQiBjb2xvciBkZXBlbmRpbmcgb24gdGhlXFxuY3VycmVudCBjb2xvck1vZGUoKSAodGhlIGRlZmF1bHQgY29sb3Igc3BhY2UgaXMgUkdCLCB3aXRoIGVhY2ggdmFsdWUgaW5cXG50aGUgcmFuZ2UgZnJvbSAwIHRvIDI1NSkuIFRoZSBhbHBoYSByYW5nZSBieSBkZWZhdWx0IGlzIGFsc28gMCB0byAyNTUuXFxuPGJyPjxicj5cXG5JZiBhIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQgaXMgcHJvdmlkZWQsIFJHQiwgUkdCQSBhbmQgSGV4IENTUyBjb2xvclxcbnN0cmluZ3MgYW5kIGFsbCBuYW1lZCBjb2xvciBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQuIEluIHRoaXMgY2FzZSwgYW4gYWxwaGFcXG5udW1iZXIgdmFsdWUgYXMgYSBzZWNvbmQgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZCwgdGhlIFJHQkEgZm9ybSBzaG91bGQgYmVcXG51c2VkLlxcbjxicj48YnI+XFxuQSBwNSBDb2xvciBvYmplY3QgY2FuIGFsc28gYmUgcHJvdmlkZWQgdG8gc2V0IHRoZSBzdHJva2UgY29sb3IuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3Ryb2tlXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gR3JheXNjYWxlIGludGVnZXIgdmFsdWVcXG5zdHJva2VXZWlnaHQoNCk7XFxuc3Ryb2tlKDUxKTtcXG5yZWN0KDIwLCAyMCwgNjAsIDYwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBSLCBHICYgQiBpbnRlZ2VyIHZhbHVlc1xcbnN0cm9rZSgyNTUsIDIwNCwgMCk7XFxuc3Ryb2tlV2VpZ2h0KDQpO1xcbnJlY3QoMjAsIDIwLCA2MCwgNjApO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIEgsIFMgJiBCIGludGVnZXIgdmFsdWVzXFxuY29sb3JNb2RlKEhTQik7XFxuc3Ryb2tlV2VpZ2h0KDQpO1xcbnN0cm9rZSgyNTUsIDIwNCwgMTAwKTtcXG5yZWN0KDIwLCAyMCwgNjAsIDYwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBOYW1lZCBTVkcvQ1NTIGNvbG9yIHN0cmluZ1xcbnN0cm9rZSgncmVkJyk7XFxuc3Ryb2tlV2VpZ2h0KDQpO1xcbnJlY3QoMjAsIDIwLCA2MCwgNjApO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIHRocmVlLWRpZ2l0IGhleGFkZWNpbWFsIFJHQiBub3RhdGlvblxcbnN0cm9rZSgnI2ZhZScpO1xcbnN0cm9rZVdlaWdodCg0KTtcXG5yZWN0KDIwLCAyMCwgNjAsIDYwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBzaXgtZGlnaXQgaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uXFxuc3Ryb2tlKCcjMjIyMjIyJyk7XFxuc3Ryb2tlV2VpZ2h0KDQpO1xcbnJlY3QoMjAsIDIwLCA2MCwgNjApO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIGludGVnZXIgUkdCIG5vdGF0aW9uXFxuc3Ryb2tlKCdyZ2IoMCwyNTUsMCknKTtcXG5zdHJva2VXZWlnaHQoNCk7XFxucmVjdCgyMCwgMjAsIDYwLCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gaW50ZWdlciBSR0JBIG5vdGF0aW9uXFxuc3Ryb2tlKCdyZ2JhKDAsMjU1LDAsMC4yNSknKTtcXG5zdHJva2VXZWlnaHQoNCk7XFxucmVjdCgyMCwgMjAsIDYwLCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gcGVyY2VudGFnZSBSR0Igbm90YXRpb25cXG5zdHJva2UoJ3JnYigxMDAlLDAlLDEwJSknKTtcXG5zdHJva2VXZWlnaHQoNCk7XFxucmVjdCgyMCwgMjAsIDYwLCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gcGVyY2VudGFnZSBSR0JBIG5vdGF0aW9uXFxuc3Ryb2tlKCdyZ2JhKDEwMCUsMCUsMTAwJSwwLjUpJyk7XFxuc3Ryb2tlV2VpZ2h0KDQpO1xcbnJlY3QoMjAsIDIwLCA2MCwgNjApO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIHA1IENvbG9yIG9iamVjdFxcbnN0cm9rZShjb2xvcigwLCAwLCAyNTUpKTtcXG5zdHJva2VXZWlnaHQoNCk7XFxucmVjdCgyMCwgMjAsIDYwLCA2MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCI2MHg2MCB3aGl0ZSByZWN0IGF0IGNlbnRlci4gRGFyayBjaGFyY29hbCBncmV5IG91dGxpbmUuXFxuNjB4NjAgd2hpdGUgcmVjdCBhdCBjZW50ZXIuIFllbGxvdyBvdXRsaW5lLlxcbjYweDYwIHdoaXRlIHJlY3QgYXQgY2VudGVyLiBSb3lhbCBibHVlIG91dGxpbmUuXFxuNjB4NjAgd2hpdGUgcmVjdCBhdCBjZW50ZXIuIFJlZCBvdXRsaW5lLlxcbjYweDYwIHdoaXRlIHJlY3QgYXQgY2VudGVyLiBQaW5rIG91dGxpbmUuXFxuNjB4NjAgd2hpdGUgcmVjdCBhdCBjZW50ZXIuIEJsYWNrIG91dGxpbmUuXFxuNjB4NjAgd2hpdGUgcmVjdCBhdCBjZW50ZXIuIEJyaWdodCBncmVlbiBvdXRsaW5lLlxcbjYweDYwIHdoaXRlIHJlY3QgYXQgY2VudGVyLiBTb2Z0IGdyZWVuIG91dGxpbmUuXFxuNjB4NjAgd2hpdGUgcmVjdCBhdCBjZW50ZXIuIFJlZCBvdXRsaW5lLlxcbjYweDYwIHdoaXRlIHJlY3QgYXQgY2VudGVyLiBEYXJrIGZ1c2hjaWEgb3V0bGluZS5cXG42MHg2MCB3aGl0ZSByZWN0IGF0IGNlbnRlci4gQmx1ZSBvdXRsaW5lLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbG9yXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlNldHRpbmdcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA1ODIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yZWQgb3IgaHVlIHZhbHVlIHJlbGF0aXZlIHRvXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBjb2xvciByYW5nZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ncmVlbiBvciBzYXR1cmF0aW9uIHZhbHVlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb2xvciByYW5nZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ibHVlIG9yIGJyaWdodG5lc3MgdmFsdWVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFscGhhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA3MjEsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hIGNvbG9yIHN0cmluZzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA3MjcsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJncmF5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmEgZ3JheSB2YWx1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbHBoYVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNzM0LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHJlZCxncmVlbixibHVlICZhbXA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxwaGEgY29tcG9uZW50cyBvZiB0aGUgY29sb3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA3NDEsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2xvclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgc3Ryb2tlIGNvbG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvMmRfcHJpbWl0aXZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRyYXcgYW4gYXJjIHRvIHRoZSBzY3JlZW4uIElmIGNhbGxlZCB3aXRoIG9ubHkgeCwgeSwgdywgaCwgc3RhcnQsIGFuZFxcbnN0b3AsIHRoZSBhcmMgd2lsbCBiZSBkcmF3biBhbmQgZmlsbGVkIGFzIGFuIG9wZW4gcGllIHNlZ21lbnQuIElmIGEgbW9kZSBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIHRoZSBhcmNcXG53aWxsIGJlIGZpbGxlZCBsaWtlIGFuIG9wZW4gc2VtaS1jaXJjbGUgKE9QRU4pICwgYSBjbG9zZWQgc2VtaS1jaXJjbGUgKENIT1JEKSwgb3IgYXMgYSBjbG9zZWQgcGllIHNlZ21lbnQgKFBJRSkuIFRoZVxcbm9yaWdpbiBtYXkgYmUgY2hhbmdlZCB3aXRoIHRoZSBlbGxpcHNlTW9kZSgpIGZ1bmN0aW9uLjxicj48YnI+XFxuTm90ZSB0aGF0IGRyYXdpbmcgYSBmdWxsIGNpcmNsZSAoZXg6IDAgdG8gVFdPX1BJKSB3aWxsIGFwcGVhciBibGFua1xcbmJlY2F1c2UgMCBhbmQgVFdPX1BJIGFyZSB0aGUgc2FtZSBwb3NpdGlvbiBvbiB0aGUgdW5pdCBjaXJjbGUuIFRoZVxcbmJlc3Qgd2F5IHRvIGhhbmRsZSB0aGlzIGlzIGJ5IHVzaW5nIHRoZSBlbGxpcHNlKCkgZnVuY3Rpb24gaW5zdGVhZFxcbnRvIGNyZWF0ZSBhIGNsb3NlZCBlbGxpcHNlLCBhbmQgdG8gdXNlIHRoZSBhcmMoKSBmdW5jdGlvblxcbm9ubHkgdG8gZHJhdyBwYXJ0cyBvZiBhbiBlbGxpcHNlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFyY1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSBhcmMmIzM5O3MgZWxsaXBzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1jb29yZGluYXRlIG9mIHRoZSBhcmMmIzM5O3MgZWxsaXBzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+d2lkdGggb2YgdGhlIGFyYyYjMzk7cyBlbGxpcHNlIGJ5IGRlZmF1bHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmhlaWdodCBvZiB0aGUgYXJjJiMzOTtzIGVsbGlwc2UgYnkgZGVmYXVsdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmFuZ2xlIHRvIHN0YXJ0IHRoZSBhcmMsIHNwZWNpZmllZCBpbiByYWRpYW5zPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdG9wXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hbmdsZSB0byBzdG9wIHRoZSBhcmMsIHNwZWNpZmllZCBpbiByYWRpYW5zPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtb2RlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5vcHRpb25hbCBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHRoZSB3YXkgb2YgZHJhd2luZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcmMuIGVpdGhlciBDSE9SRCwgUElFIG9yIE9QRU48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkNvbnN0YW50XCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuYXJjKDUwLCA1NSwgNTAsIDUwLCAwLCBIQUxGX1BJKTtcXG5ub0ZpbGwoKTtcXG5hcmMoNTAsIDU1LCA2MCwgNjAsIEhBTEZfUEksIFBJKTtcXG5hcmMoNTAsIDU1LCA3MCwgNzAsIFBJLCBQSSArIFFVQVJURVJfUEkpO1xcbmFyYyg1MCwgNTUsIDgwLCA4MCwgUEkgKyBRVUFSVEVSX1BJLCBUV09fUEkpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmFyYyg1MCwgNTAsIDgwLCA4MCwgMCwgUEkgKyBRVUFSVEVSX1BJKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5hcmMoNTAsIDUwLCA4MCwgODAsIDAsIFBJICsgUVVBUlRFUl9QSSwgT1BFTik7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuYXJjKDUwLCA1MCwgODAsIDgwLCAwLCBQSSArIFFVQVJURVJfUEksIENIT1JEKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5hcmMoNTAsIDUwLCA4MCwgODAsIDAsIFBJICsgUVVBUlRFUl9QSSwgUElFKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInNoYXR0ZXJlZCBvdXRsaW5lIG9mIGFuIGVsbGlwc2Ugd2l0aCBhIHF1YXJ0ZXIgb2YgYSB3aGl0ZSBjaXJjbGUgYm90dG9tLXJpZ2h0LlxcbndoaXRlIGVsbGlwc2Ugd2l0aCB0b3AgcmlnaHQgcXVhcnRlciBtaXNzaW5nLlxcbndoaXRlIGVsbGlwc2Ugd2l0aCBibGFjayBvdXRsaW5lIHdpdGggdG9wIHJpZ2h0IG1pc3NpbmcuXFxud2hpdGUgZWxsaXBzZSB3aXRoIHRvcCByaWdodCBtaXNzaW5nIHdpdGggYmxhY2sgb3V0bGluZSBhcm91bmQgc2hhcGUuXFxud2hpdGUgZWxsaXBzZSB3aXRoIHRvcCByaWdodCBxdWFydGVyIG1pc3Npbmcgd2l0aCBibGFjayBvdXRsaW5lIGFyb3VuZCB0aGUgc2hhcGUuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiMkQgUHJpbWl0aXZlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlLzJkX3ByaW1pdGl2ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMzMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RHJhd3MgYW4gZWxsaXBzZSAob3ZhbCkgdG8gdGhlIHNjcmVlbi4gQW4gZWxsaXBzZSB3aXRoIGVxdWFsIHdpZHRoIGFuZFxcbmhlaWdodCBpcyBhIGNpcmNsZS4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIHNldCB0aGUgbG9jYXRpb24sXFxuYW5kIHRoZSB0aGlyZCBhbmQgZm91cnRoIHBhcmFtZXRlcnMgc2V0IHRoZSBzaGFwZSYjMzk7cyB3aWR0aCBhbmQgaGVpZ2h0LiBJZlxcbm5vIGhlaWdodCBpcyBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBvZiB3aWR0aCBpcyB1c2VkIGZvciBib3RoIHRoZSB3aWR0aCBhbmRcXG5oZWlnaHQuIElmIGEgbmVnYXRpdmUgaGVpZ2h0IG9yIHdpZHRoIGlzIHNwZWNpZmllZCwgdGhlIGFic29sdXRlIHZhbHVlIGlzIHRha2VuLlxcblRoZSBvcmlnaW4gbWF5IGJlIGNoYW5nZWQgd2l0aCB0aGUgZWxsaXBzZU1vZGUoKSBmdW5jdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJlbGxpcHNlXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZWxsaXBzZSg1NiwgNDYsIDU1LCA1NSk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ3aGl0ZSBlbGxpcHNlIHdpdGggYmxhY2sgb3V0bGluZSBpbiBtaWRkbGUtcmlnaHQgb2YgY2FudmFzIHRoYXQgaXMgNTV4NTUuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiMkQgUHJpbWl0aXZlc1wiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDEzMyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSBlbGxpcHNlLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktY29vcmRpbmF0ZSBvZiB0aGUgZWxsaXBzZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD53aWR0aCBvZiB0aGUgZWxsaXBzZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5oZWlnaHQgb2YgdGhlIGVsbGlwc2UuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxNTgsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRldGFpbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgb2YgcmFkaWFsIHNlY3RvcnMgdG8gZHJhdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvMmRfcHJpbWl0aXZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE4OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EcmF3cyBhIGxpbmUgKGEgZGlyZWN0IHBhdGggYmV0d2VlbiB0d28gcG9pbnRzKSB0byB0aGUgc2NyZWVuLiBUaGUgdmVyc2lvblxcbm9mIGxpbmUoKSB3aXRoIGZvdXIgcGFyYW1ldGVycyBkcmF3cyB0aGUgbGluZSBpbiAyRC4gVG8gY29sb3IgYSBsaW5lLCB1c2VcXG50aGUgc3Ryb2tlKCkgZnVuY3Rpb24uIEEgbGluZSBjYW5ub3QgYmUgZmlsbGVkLCB0aGVyZWZvcmUgdGhlIGZpbGwoKVxcbmZ1bmN0aW9uIHdpbGwgbm90IGFmZmVjdCB0aGUgY29sb3Igb2YgYSBsaW5lLiAyRCBsaW5lcyBhcmUgZHJhd24gd2l0aCBhXFxud2lkdGggb2Ygb25lIHBpeGVsIGJ5IGRlZmF1bHQsIGJ1dCB0aGlzIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlXFxuc3Ryb2tlV2VpZ2h0KCkgZnVuY3Rpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibGluZVwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmxpbmUoMzAsIDIwLCA4NSwgNzUpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmxpbmUoMzAsIDIwLCA4NSwgMjApO1xcbnN0cm9rZSgxMjYpO1xcbmxpbmUoODUsIDIwLCA4NSwgNzUpO1xcbnN0cm9rZSgyNTUpO1xcbmxpbmUoODUsIDc1LCAzMCwgNzUpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibGluZSA3OCBwaXhlbHMgbG9uZyBydW5uaW5nIGZyb20gbWlkLXRvcCB0byBib3R0b20tcmlnaHQgb2YgY2FudmFzLlxcbjMgbGluZXMgb2YgdmFyaW91cyBzdHJva2Ugc2l6ZXMuIEZvcm0gdG9wLCBib3R0b20gYW5kIHJpZ2h0IHNpZGVzIG9mIGEgc3F1YXJlLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIjJEIFByaW1pdGl2ZXNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxODgsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeC1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeS1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDIyNCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInkxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInoxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB6LWNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInkyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInoyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB6LWNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS8yZF9wcmltaXRpdmVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjQ0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRyYXdzIGEgcG9pbnQsIGEgY29vcmRpbmF0ZSBpbiBzcGFjZSBhdCB0aGUgZGltZW5zaW9uIG9mIG9uZSBwaXhlbC5cXG5UaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBob3Jpem9udGFsIHZhbHVlIGZvciB0aGUgcG9pbnQsIHRoZSBzZWNvbmRcXG52YWx1ZSBpcyB0aGUgdmVydGljYWwgdmFsdWUgZm9yIHRoZSBwb2ludC4gVGhlIGNvbG9yIG9mIHRoZSBwb2ludCBpc1xcbmRldGVybWluZWQgYnkgdGhlIGN1cnJlbnQgc3Ryb2tlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBvaW50XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeC1jb29yZGluYXRlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeS1jb29yZGluYXRlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgei1jb29yZGluYXRlIChmb3IgV0VCR0wgbW9kZSk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnBvaW50KDMwLCAyMCk7XFxucG9pbnQoODUsIDIwKTtcXG5wb2ludCg4NSwgNzUpO1xcbnBvaW50KDMwLCA3NSk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCI0IHBvaW50cyBjZW50ZXJlZCBpbiB0aGUgbWlkZGxlLXJpZ2h0IG9mIHRoZSBjYW52YXMuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiMkQgUHJpbWl0aXZlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlLzJkX3ByaW1pdGl2ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNzksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RHJhdyBhIHF1YWQuIEEgcXVhZCBpcyBhIHF1YWRyaWxhdGVyYWwsIGEgZm91ciBzaWRlZCBwb2x5Z29uLiBJdCBpc1xcbnNpbWlsYXIgdG8gYSByZWN0YW5nbGUsIGJ1dCB0aGUgYW5nbGVzIGJldHdlZW4gaXRzIGVkZ2VzIGFyZSBub3RcXG5jb25zdHJhaW5lZCB0byBuaW5ldHkgZGVncmVlcy4gVGhlIGZpcnN0IHBhaXIgb2YgcGFyYW1ldGVycyAoeDEseTEpXFxuc2V0cyB0aGUgZmlyc3QgdmVydGV4IGFuZCB0aGUgc3Vic2VxdWVudCBwYWlycyBzaG91bGQgcHJvY2VlZFxcbmNsb2Nrd2lzZSBvciBjb3VudGVyLWNsb2Nrd2lzZSBhcm91bmQgdGhlIGRlZmluZWQgc2hhcGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicXVhZFwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnF1YWQoMzgsIDMxLCA4NiwgMjAsIDY5LCA2MywgMzAsIDc2KTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImlycmVndWxhciB3aGl0ZSBxdWFkcmlsYXRlcmFsIHNoYXBlIHdpdGggYmxhY2sgb3V0bGluZSBtaWQtcmlnaHQgb2YgY2FudmFzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIjJEIFByaW1pdGl2ZXNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAyNzksXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeC1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeS1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInkzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIng0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGZvdXJ0aCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeS1jb29yZGluYXRlIG9mIHRoZSBmb3VydGggcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMzA3LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiejFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieDJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiejJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieDNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiejNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieDRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiejRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvMmRfcHJpbWl0aXZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMzMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EcmF3cyBhIHJlY3RhbmdsZSB0byB0aGUgc2NyZWVuLiBBIHJlY3RhbmdsZSBpcyBhIGZvdXItc2lkZWQgc2hhcGUgd2l0aFxcbmV2ZXJ5IGFuZ2xlIGF0IG5pbmV0eSBkZWdyZWVzLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgc2V0XFxudGhlIGxvY2F0aW9uIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciwgdGhlIHRoaXJkIHNldHMgdGhlIHdpZHRoLCBhbmQgdGhlXFxuZm91cnRoIHNldHMgdGhlIGhlaWdodC4gVGhlIHdheSB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBpbnRlcnByZXRlZCwgaG93ZXZlcixcXG5tYXkgYmUgY2hhbmdlZCB3aXRoIHRoZSByZWN0TW9kZSgpIGZ1bmN0aW9uLlxcbjxicj48YnI+XFxuVGhlIGZpZnRoLCBzaXh0aCwgc2V2ZW50aCBhbmQgZWlnaHRoIHBhcmFtZXRlcnMsIGlmIHNwZWNpZmllZCxcXG5kZXRlcm1pbmUgY29ybmVyIHJhZGl1cyBmb3IgdGhlIHRvcC1yaWdodCwgdG9wLWxlZnQsIGxvd2VyLXJpZ2h0IGFuZFxcbmxvd2VyLWxlZnQgY29ybmVycywgcmVzcGVjdGl2ZWx5LiBBbiBvbWl0dGVkIGNvcm5lciByYWRpdXMgcGFyYW1ldGVyIGlzIHNldFxcbnRvIHRoZSB2YWx1ZSBvZiB0aGUgcHJldmlvdXNseSBzcGVjaWZpZWQgcmFkaXVzIHZhbHVlIGluIHRoZSBwYXJhbWV0ZXIgbGlzdC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyZWN0XCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gRHJhdyBhIHJlY3RhbmdsZSBhdCBsb2NhdGlvbiAoMzAsIDIwKSB3aXRoIGEgd2lkdGggYW5kIGhlaWdodCBvZiA1NS5cXG5yZWN0KDMwLCAyMCwgNTUsIDU1KTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBEcmF3IGEgcmVjdGFuZ2xlIHdpdGggcm91bmRlZCBjb3JuZXJzLCBlYWNoIGhhdmluZyBhIHJhZGl1cyBvZiAyMC5cXG5yZWN0KDMwLCAyMCwgNTUsIDU1LCAyMCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gRHJhdyBhIHJlY3RhbmdsZSB3aXRoIHJvdW5kZWQgY29ybmVycyBoYXZpbmcgdGhlIGZvbGxvd2luZyByYWRpaTpcXG4vLyB0b3AtbGVmdCA9IDIwLCB0b3AtcmlnaHQgPSAxNSwgYm90dG9tLXJpZ2h0ID0gMTAsIGJvdHRvbS1sZWZ0ID0gNS5cXG5yZWN0KDMwLCAyMCwgNTUsIDU1LCAyMCwgMTUsIDEwLCA1KTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjU1eDU1IHdoaXRlIHJlY3Qgd2l0aCBibGFjayBvdXRsaW5lIGluIG1pZC1yaWdodCBvZiBjYW52YXMuXFxuNTV4NTUgd2hpdGUgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgYW5kIHJvdW5kZWQgZWRnZXMgaW4gbWlkLXJpZ2h0IG9mIGNhbnZhcy5cXG41NXg1NSB3aGl0ZSByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBhbmQgcm91bmRlZCBlZGdlcyBvZiBkaWZmZXJlbnQgcmFkaWkuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiMkQgUHJpbWl0aXZlc1wiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDMzMyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1jb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIndcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+d2lkdGggb2YgdGhlIHJlY3RhbmdsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5oZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+b3B0aW9uYWwgcmFkaXVzIG9mIHRvcC1sZWZ0IGNvcm5lci48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm9wdGlvbmFsIHJhZGl1cyBvZiB0b3AtcmlnaHQgY29ybmVyLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYnJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+b3B0aW9uYWwgcmFkaXVzIG9mIGJvdHRvbS1yaWdodCBjb3JuZXIuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJibFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5vcHRpb25hbCByYWRpdXMgb2YgYm90dG9tLWxlZnQgY29ybmVyLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMzgzLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIndcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZXRhaWxYXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgeC1kaXJlY3Rpb248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZXRhaWxZXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgeS1kaXJlY3Rpb248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS8yZF9wcmltaXRpdmVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDE2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkEgdHJpYW5nbGUgaXMgYSBwbGFuZSBjcmVhdGVkIGJ5IGNvbm5lY3RpbmcgdGhyZWUgcG9pbnRzLiBUaGUgZmlyc3QgdHdvXFxuYXJndW1lbnRzIHNwZWNpZnkgdGhlIGZpcnN0IHBvaW50LCB0aGUgbWlkZGxlIHR3byBhcmd1bWVudHMgc3BlY2lmeSB0aGVcXG5zZWNvbmQgcG9pbnQsIGFuZCB0aGUgbGFzdCB0d28gYXJndW1lbnRzIHNwZWNpZnkgdGhlIHRoaXJkIHBvaW50LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRyaWFuZ2xlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTFcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LWNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4M1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSB0aGlyZCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG50cmlhbmdsZSgzMCwgNzUsIDU4LCAyMCwgODYsIDc1KTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIndoaXRlIHRyaWFuZ2xlIHdpdGggYmxhY2sgb3V0bGluZSBpbiBtaWQtcmlnaHQgb2YgY2FudmFzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIjJEIFByaW1pdGl2ZXNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9hdHRyaWJ1dGVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TW9kaWZpZXMgdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggZWxsaXBzZXMgYXJlIGRyYXduIGJ5IGNoYW5naW5nIHRoZSB3YXlcXG5pbiB3aGljaCBwYXJhbWV0ZXJzIGdpdmVuIHRvIGVsbGlwc2UoKSBhcmUgaW50ZXJwcmV0ZWQuXFxuPGJyPjxicj5cXG5UaGUgZGVmYXVsdCBtb2RlIGlzIGVsbGlwc2VNb2RlKENFTlRFUiksIHdoaWNoIGludGVycHJldHMgdGhlIGZpcnN0IHR3b1xcbnBhcmFtZXRlcnMgb2YgZWxsaXBzZSgpIGFzIHRoZSBzaGFwZSYjMzk7cyBjZW50ZXIgcG9pbnQsIHdoaWxlIHRoZSB0aGlyZCBhbmRcXG5mb3VydGggcGFyYW1ldGVycyBhcmUgaXRzIHdpZHRoIGFuZCBoZWlnaHQuXFxuPGJyPjxicj5cXG5lbGxpcHNlTW9kZShSQURJVVMpIGFsc28gdXNlcyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgb2YgZWxsaXBzZSgpIGFzXFxudGhlIHNoYXBlJiMzOTtzIGNlbnRlciBwb2ludCwgYnV0IHVzZXMgdGhlIHRoaXJkIGFuZCBmb3VydGggcGFyYW1ldGVycyB0b1xcbnNwZWNpZnkgaGFsZiBvZiB0aGUgc2hhcGVzJiMzOTtzIHdpZHRoIGFuZCBoZWlnaHQuXFxuPGJyPjxicj5cXG5lbGxpcHNlTW9kZShDT1JORVIpIGludGVycHJldHMgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIG9mIGVsbGlwc2UoKSBhc1xcbnRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgc2hhcGUsIHdoaWxlIHRoZSB0aGlyZCBhbmQgZm91cnRoIHBhcmFtZXRlcnNcXG5hcmUgaXRzIHdpZHRoIGFuZCBoZWlnaHQuXFxuPGJyPjxicj5cXG5lbGxpcHNlTW9kZShDT1JORVJTKSBpbnRlcnByZXRzIHRoZSBmaXJzdCB0d28gcGFyYW1ldGVycyBvZiBlbGxpcHNlKCkgYXNcXG50aGUgbG9jYXRpb24gb2Ygb25lIGNvcm5lciBvZiB0aGUgZWxsaXBzZSYjMzk7cyBib3VuZGluZyBib3gsIGFuZCB0aGUgdGhpcmRcXG5hbmQgZm91cnRoIHBhcmFtZXRlcnMgYXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBvcHBvc2l0ZSBjb3JuZXIuXFxuPGJyPjxicj5cXG5UaGUgcGFyYW1ldGVyIG11c3QgYmUgd3JpdHRlbiBpbiBBTEwgQ0FQUyBiZWNhdXNlIEphdmFzY3JpcHQgaXMgYVxcbmNhc2Utc2Vuc2l0aXZlIGxhbmd1YWdlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImVsbGlwc2VNb2RlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtb2RlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5laXRoZXIgQ0VOVEVSLCBSQURJVVMsIENPUk5FUiwgb3IgQ09STkVSUzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29uc3RhbnRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZWxsaXBzZU1vZGUoUkFESVVTKTsgLy8gU2V0IGVsbGlwc2VNb2RlIHRvIFJBRElVU1xcbmZpbGwoMjU1KTsgLy8gU2V0IGZpbGwgdG8gd2hpdGVcXG5lbGxpcHNlKDUwLCA1MCwgMzAsIDMwKTsgLy8gRHJhdyB3aGl0ZSBlbGxpcHNlIHVzaW5nIFJBRElVUyBtb2RlXFxuXFxuZWxsaXBzZU1vZGUoQ0VOVEVSKTsgLy8gU2V0IGVsbGlwc2VNb2RlIHRvIENFTlRFUlxcbmZpbGwoMTAwKTsgLy8gU2V0IGZpbGwgdG8gZ3JheVxcbmVsbGlwc2UoNTAsIDUwLCAzMCwgMzApOyAvLyBEcmF3IGdyYXkgZWxsaXBzZSB1c2luZyBDRU5URVIgbW9kZVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmVsbGlwc2VNb2RlKENPUk5FUik7IC8vIFNldCBlbGxpcHNlTW9kZSBpcyBDT1JORVJcXG5maWxsKDI1NSk7IC8vIFNldCBmaWxsIHRvIHdoaXRlXFxuZWxsaXBzZSgyNSwgMjUsIDUwLCA1MCk7IC8vIERyYXcgd2hpdGUgZWxsaXBzZSB1c2luZyBDT1JORVIgbW9kZVxcblxcbmVsbGlwc2VNb2RlKENPUk5FUlMpOyAvLyBTZXQgZWxsaXBzZU1vZGUgdG8gQ09STkVSU1xcbmZpbGwoMTAwKTsgLy8gU2V0IGZpbGwgdG8gZ3JheVxcbmVsbGlwc2UoMjUsIDI1LCA1MCwgNTApOyAvLyBEcmF3IGdyYXkgZWxsaXBzZSB1c2luZyBDT1JORVJTIG1vZGVcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjYweDYwIHdoaXRlIGVsbGlwc2UgYW5kIDMweDMwIGdyZXkgZWxsaXBzZSB3aXRoIGJsYWNrIG91dGxpbmVzIGF0IGNlbnRlci5cXG42MHg2MCB3aGl0ZSBlbGxpcHNlIEBjZW50ZXIgYW5kIDMweDMwIGdyZXkgZWxsaXBzZSB0b3AtcmlnaHQsIGJsYWNrIG91dGxpbmVzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkF0dHJpYnV0ZXNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9hdHRyaWJ1dGVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RHJhd3MgYWxsIGdlb21ldHJ5IHdpdGggamFnZ2VkIChhbGlhc2VkKSBlZGdlcy4gTm90ZSB0aGF0IHNtb290aCgpIGlzXFxuYWN0aXZlIGJ5IGRlZmF1bHQsIHNvIGl0IGlzIG5lY2Vzc2FyeSB0byBjYWxsIG5vU21vb3RoKCkgdG8gZGlzYWJsZVxcbnNtb290aGluZyBvZiBnZW9tZXRyeSwgaW1hZ2VzLCBhbmQgZm9udHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibm9TbW9vdGhcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5iYWNrZ3JvdW5kKDApO1xcbm5vU3Ryb2tlKCk7XFxuc21vb3RoKCk7XFxuZWxsaXBzZSgzMCwgNDgsIDM2LCAzNik7XFxubm9TbW9vdGgoKTtcXG5lbGxpcHNlKDcwLCA0OCwgMzYsIDM2KTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjIgcGl4ZWxhdGVkIDM2eDM2IHdoaXRlIGVsbGlwc2VzIHRvIGxlZnQgJiByaWdodCBvZiBjZW50ZXIsIGJsYWNrIGJhY2tncm91bmRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBdHRyaWJ1dGVzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvYXR0cmlidXRlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Nb2RpZmllcyB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCByZWN0YW5nbGVzIGFyZSBkcmF3biBieSBjaGFuZ2luZyB0aGUgd2F5XFxuaW4gd2hpY2ggcGFyYW1ldGVycyBnaXZlbiB0byByZWN0KCkgYXJlIGludGVycHJldGVkLlxcbjxicj48YnI+XFxuVGhlIGRlZmF1bHQgbW9kZSBpcyByZWN0TW9kZShDT1JORVIpLCB3aGljaCBpbnRlcnByZXRzIHRoZSBmaXJzdCB0d29cXG5wYXJhbWV0ZXJzIG9mIHJlY3QoKSBhcyB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHNoYXBlLCB3aGlsZSB0aGVcXG50aGlyZCBhbmQgZm91cnRoIHBhcmFtZXRlcnMgYXJlIGl0cyB3aWR0aCBhbmQgaGVpZ2h0Llxcbjxicj48YnI+XFxucmVjdE1vZGUoQ09STkVSUykgaW50ZXJwcmV0cyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgb2YgcmVjdCgpIGFzIHRoZVxcbmxvY2F0aW9uIG9mIG9uZSBjb3JuZXIsIGFuZCB0aGUgdGhpcmQgYW5kIGZvdXJ0aCBwYXJhbWV0ZXJzIGFzIHRoZVxcbmxvY2F0aW9uIG9mIHRoZSBvcHBvc2l0ZSBjb3JuZXIuXFxuPGJyPjxicj5cXG5yZWN0TW9kZShDRU5URVIpIGludGVycHJldHMgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIG9mIHJlY3QoKSBhcyB0aGVcXG5zaGFwZSYjMzk7cyBjZW50ZXIgcG9pbnQsIHdoaWxlIHRoZSB0aGlyZCBhbmQgZm91cnRoIHBhcmFtZXRlcnMgYXJlIGl0c1xcbndpZHRoIGFuZCBoZWlnaHQuXFxuPGJyPjxicj5cXG5yZWN0TW9kZShSQURJVVMpIGFsc28gdXNlcyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgb2YgcmVjdCgpIGFzIHRoZVxcbnNoYXBlJiMzOTtzIGNlbnRlciBwb2ludCwgYnV0IHVzZXMgdGhlIHRoaXJkIGFuZCBmb3VydGggcGFyYW1ldGVycyB0byBzcGVjaWZ5XFxuaGFsZiBvZiB0aGUgc2hhcGVzJiMzOTtzIHdpZHRoIGFuZCBoZWlnaHQuXFxuPGJyPjxicj5cXG5UaGUgcGFyYW1ldGVyIG11c3QgYmUgd3JpdHRlbiBpbiBBTEwgQ0FQUyBiZWNhdXNlIEphdmFzY3JpcHQgaXMgYVxcbmNhc2Utc2Vuc2l0aXZlIGxhbmd1YWdlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlY3RNb2RlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtb2RlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5laXRoZXIgQ09STkVSLCBDT1JORVJTLCBDRU5URVIsIG9yIFJBRElVUzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29uc3RhbnRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxucmVjdE1vZGUoQ09STkVSKTsgLy8gRGVmYXVsdCByZWN0TW9kZSBpcyBDT1JORVJcXG5maWxsKDI1NSk7IC8vIFNldCBmaWxsIHRvIHdoaXRlXFxucmVjdCgyNSwgMjUsIDUwLCA1MCk7IC8vIERyYXcgd2hpdGUgcmVjdCB1c2luZyBDT1JORVIgbW9kZVxcblxcbnJlY3RNb2RlKENPUk5FUlMpOyAvLyBTZXQgcmVjdE1vZGUgdG8gQ09STkVSU1xcbmZpbGwoMTAwKTsgLy8gU2V0IGZpbGwgdG8gZ3JheVxcbnJlY3QoMjUsIDI1LCA1MCwgNTApOyAvLyBEcmF3IGdyYXkgcmVjdCB1c2luZyBDT1JORVJTIG1vZGVcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5yZWN0TW9kZShSQURJVVMpOyAvLyBTZXQgcmVjdE1vZGUgdG8gUkFESVVTXFxuZmlsbCgyNTUpOyAvLyBTZXQgZmlsbCB0byB3aGl0ZVxcbnJlY3QoNTAsIDUwLCAzMCwgMzApOyAvLyBEcmF3IHdoaXRlIHJlY3QgdXNpbmcgUkFESVVTIG1vZGVcXG5cXG5yZWN0TW9kZShDRU5URVIpOyAvLyBTZXQgcmVjdE1vZGUgdG8gQ0VOVEVSXFxuZmlsbCgxMDApOyAvLyBTZXQgZmlsbCB0byBncmF5XFxucmVjdCg1MCwgNTAsIDMwLCAzMCk7IC8vIERyYXcgZ3JheSByZWN0IHVzaW5nIENFTlRFUiBtb2RlXFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCI1MHg1MCB3aGl0ZSByZWN0IGF0IGNlbnRlciBhbmQgMjV4MjUgZ3JleSByZWN0IGluIHRoZSB0b3AgbGVmdCBvZiB0aGUgb3RoZXIuXFxuNTB4NTAgd2hpdGUgcmVjdCBhdCBjZW50ZXIgYW5kIDI1eDI1IGdyZXkgcmVjdCBpbiB0aGUgY2VudGVyIG9mIHRoZSBvdGhlci5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBdHRyaWJ1dGVzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvYXR0cmlidXRlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE4MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EcmF3cyBhbGwgZ2VvbWV0cnkgd2l0aCBzbW9vdGggKGFudGktYWxpYXNlZCkgZWRnZXMuIHNtb290aCgpIHdpbGwgYWxzb1xcbmltcHJvdmUgaW1hZ2UgcXVhbGl0eSBvZiByZXNpemVkIGltYWdlcy4gTm90ZSB0aGF0IHNtb290aCgpIGlzIGFjdGl2ZSBieVxcbmRlZmF1bHQ7IG5vU21vb3RoKCkgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBzbW9vdGhpbmcgb2YgZ2VvbWV0cnksXFxuaW1hZ2VzLCBhbmQgZm9udHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic21vb3RoXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuYmFja2dyb3VuZCgwKTtcXG5ub1N0cm9rZSgpO1xcbnNtb290aCgpO1xcbmVsbGlwc2UoMzAsIDQ4LCAzNiwgMzYpO1xcbm5vU21vb3RoKCk7XFxuZWxsaXBzZSg3MCwgNDgsIDM2LCAzNik7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCIyIHBpeGVsYXRlZCAzNngzNiB3aGl0ZSBlbGxpcHNlcyBvbmUgbGVmdCBvbmUgcmlnaHQgb2YgY2VudGVyLiBPbiBibGFjay5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBdHRyaWJ1dGVzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvYXR0cmlidXRlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIwOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXRzIHRoZSBzdHlsZSBmb3IgcmVuZGVyaW5nIGxpbmUgZW5kaW5ncy4gVGhlc2UgZW5kcyBhcmUgZWl0aGVyIHNxdWFyZWQsXFxuZXh0ZW5kZWQsIG9yIHJvdW5kZWQsIGVhY2ggb2Ygd2hpY2ggc3BlY2lmaWVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcXG5wYXJhbWV0ZXJzOiBTUVVBUkUsIFBST0pFQ1QsIGFuZCBST1VORC4gVGhlIGRlZmF1bHQgY2FwIGlzIFJPVU5ELjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInN0cm9rZUNhcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5laXRoZXIgU1FVQVJFLCBQUk9KRUNULCBvciBST1VORDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29uc3RhbnRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuc3Ryb2tlV2VpZ2h0KDEyLjApO1xcbnN0cm9rZUNhcChST1VORCk7XFxubGluZSgyMCwgMzAsIDgwLCAzMCk7XFxuc3Ryb2tlQ2FwKFNRVUFSRSk7XFxubGluZSgyMCwgNTAsIDgwLCA1MCk7XFxuc3Ryb2tlQ2FwKFBST0pFQ1QpO1xcbmxpbmUoMjAsIDcwLCA4MCwgNzApO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiMyBsaW5lcy4gVG9wIGxpbmU6IHJvdW5kZWQgZW5kcywgbWlkOiBzcXVhcmVkLCBib3R0b206bG9uZ2VyIHNxdWFyZWQgZW5kcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBdHRyaWJ1dGVzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvYXR0cmlidXRlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI0NixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXRzIHRoZSBzdHlsZSBvZiB0aGUgam9pbnRzIHdoaWNoIGNvbm5lY3QgbGluZSBzZWdtZW50cy4gVGhlc2Ugam9pbnRzXFxuYXJlIGVpdGhlciBtaXRlcmVkLCBiZXZlbGVkLCBvciByb3VuZGVkIGFuZCBzcGVjaWZpZWQgd2l0aCB0aGVcXG5jb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMgTUlURVIsIEJFVkVMLCBhbmQgUk9VTkQuIFRoZSBkZWZhdWx0IGpvaW50IGlzXFxuTUlURVIuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3Ryb2tlSm9pblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiam9pblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZWl0aGVyIE1JVEVSLCBCRVZFTCwgUk9VTkQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkNvbnN0YW50XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbm5vRmlsbCgpO1xcbnN0cm9rZVdlaWdodCgxMC4wKTtcXG5zdHJva2VKb2luKE1JVEVSKTtcXG5iZWdpblNoYXBlKCk7XFxudmVydGV4KDM1LCAyMCk7XFxudmVydGV4KDY1LCA1MCk7XFxudmVydGV4KDM1LCA4MCk7XFxuZW5kU2hhcGUoKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5ub0ZpbGwoKTtcXG5zdHJva2VXZWlnaHQoMTAuMCk7XFxuc3Ryb2tlSm9pbihCRVZFTCk7XFxuYmVnaW5TaGFwZSgpO1xcbnZlcnRleCgzNSwgMjApO1xcbnZlcnRleCg2NSwgNTApO1xcbnZlcnRleCgzNSwgODApO1xcbmVuZFNoYXBlKCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxubm9GaWxsKCk7XFxuc3Ryb2tlV2VpZ2h0KDEwLjApO1xcbnN0cm9rZUpvaW4oUk9VTkQpO1xcbmJlZ2luU2hhcGUoKTtcXG52ZXJ0ZXgoMzUsIDIwKTtcXG52ZXJ0ZXgoNjUsIDUwKTtcXG52ZXJ0ZXgoMzUsIDgwKTtcXG5lbmRTaGFwZSgpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiUmlnaHQtZmFjaW5nIGFycm93aGVhZCBzaGFwZSB3aXRoIHBvaW50ZWQgdGlwIGluIGNlbnRlciBvZiBjYW52YXMuXFxuUmlnaHQtZmFjaW5nIGFycm93aGVhZCBzaGFwZSB3aXRoIGZsYXQgdGlwIGluIGNlbnRlciBvZiBjYW52YXMuXFxuUmlnaHQtZmFjaW5nIGFycm93aGVhZCBzaGFwZSB3aXRoIHJvdW5kZWQgdGlwIGluIGNlbnRlciBvZiBjYW52YXMuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQXR0cmlidXRlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2F0dHJpYnV0ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzMTMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyB0aGUgd2lkdGggb2YgdGhlIHN0cm9rZSB1c2VkIGZvciBsaW5lcywgcG9pbnRzLCBhbmQgdGhlIGJvcmRlclxcbmFyb3VuZCBzaGFwZXMuIEFsbCB3aWR0aHMgYXJlIHNldCBpbiB1bml0cyBvZiBwaXhlbHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3Ryb2tlV2VpZ2h0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ3ZWlnaHRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB3ZWlnaHQgKGluIHBpeGVscykgb2YgdGhlIHN0cm9rZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnN0cm9rZVdlaWdodCgxKTsgLy8gRGVmYXVsdFxcbmxpbmUoMjAsIDIwLCA4MCwgMjApO1xcbnN0cm9rZVdlaWdodCg0KTsgLy8gVGhpY2tlclxcbmxpbmUoMjAsIDQwLCA4MCwgNDApO1xcbnN0cm9rZVdlaWdodCgxMCk7IC8vIEJlYXN0bHlcXG5saW5lKDIwLCA3MCwgODAsIDcwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjMgaG9yaXpvbnRhbCBibGFjayBsaW5lcy4gVG9wIGxpbmU6IHRoaW4sIG1pZDogbWVkaXVtLCBib3R0b206dGhpY2suXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQXR0cmlidXRlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NhbnZhcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvbnN0YW50c1wiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTMsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlAyRFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE4LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJXRUJHTFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkhBTEZfUEkgaXMgYSBtYXRoZW1hdGljYWwgY29uc3RhbnQgd2l0aCB0aGUgdmFsdWVcXG4xLjU3MDc5NjMyNjc5NDg5NjYxOTIzLiBJdCBpcyBoYWxmIHRoZSByYXRpbyBvZiB0aGVcXG5jaXJjdW1mZXJlbmNlIG9mIGEgY2lyY2xlIHRvIGl0cyBkaWFtZXRlci4gSXQgaXMgdXNlZnVsIGluXFxuY29tYmluYXRpb24gd2l0aCB0aGUgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgc2luKCkgYW5kIGNvcygpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiSEFMRl9QSVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5hcmMoNTAsIDUwLCA4MCwgODAsIDAsIEhBTEZfUEkpO1xcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiODB4ODAgd2hpdGUgcXVhcnRlci1jaXJjbGUgd2l0aCBjdXJ2ZSB0b3dhcmQgYm90dG9tIHJpZ2h0IG9mIGNhbnZhcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UEkgaXMgYSBtYXRoZW1hdGljYWwgY29uc3RhbnQgd2l0aCB0aGUgdmFsdWVcXG4zLjE0MTU5MjY1MzU4OTc5MzIzODQ2LiBJdCBpcyB0aGUgcmF0aW8gb2YgdGhlIGNpcmN1bWZlcmVuY2VcXG5vZiBhIGNpcmNsZSB0byBpdHMgZGlhbWV0ZXIuIEl0IGlzIHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoXFxudGhlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIHNpbigpIGFuZCBjb3MoKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlBJXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmFyYyg1MCwgNTAsIDgwLCA4MCwgMCwgUEkpO1xcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwid2hpdGUgaGFsZi1jaXJjbGUgd2l0aCBjdXJ2ZSB0b3dhcmQgYm90dG9tIG9mIGNhbnZhcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UVVBUlRFUl9QSSBpcyBhIG1hdGhlbWF0aWNhbCBjb25zdGFudCB3aXRoIHRoZSB2YWx1ZSAwLjc4NTM5ODIuXFxuSXQgaXMgb25lIHF1YXJ0ZXIgdGhlIHJhdGlvIG9mIHRoZSBjaXJjdW1mZXJlbmNlIG9mIGEgY2lyY2xlIHRvXFxuaXRzIGRpYW1ldGVyLiBJdCBpcyB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgdHJpZ29ub21ldHJpY1xcbmZ1bmN0aW9ucyBzaW4oKSBhbmQgY29zKCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJRVUFSVEVSX1BJXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmFyYyg1MCwgNTAsIDgwLCA4MCwgMCwgUVVBUlRFUl9QSSk7XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ3aGl0ZSBlaWdodGgtY2lyY2xlIHJvdGF0ZWQgYWJvdXQgNDAgZGVncmVlcyB3aXRoIGN1cnZlIGJvdHRvbSByaWdodCBjYW52YXMuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDkxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRBVSBpcyBhbiBhbGlhcyBmb3IgVFdPX1BJLCBhIG1hdGhlbWF0aWNhbCBjb25zdGFudCB3aXRoIHRoZVxcbnZhbHVlIDYuMjgzMTg1MzA3MTc5NTg2NDc2OTMuIEl0IGlzIHR3aWNlIHRoZSByYXRpbyBvZiB0aGVcXG5jaXJjdW1mZXJlbmNlIG9mIGEgY2lyY2xlIHRvIGl0cyBkaWFtZXRlci4gSXQgaXMgdXNlZnVsIGluXFxuY29tYmluYXRpb24gd2l0aCB0aGUgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgc2luKCkgYW5kIGNvcygpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiVEFVXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmFyYyg1MCwgNTAsIDgwLCA4MCwgMCwgVEFVKTtcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjgweDgwIHdoaXRlIGVsbGlwc2Ugc2hhcGUgaW4gY2VudGVyIG9mIGNhbnZhcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTEwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRXT19QSSBpcyBhIG1hdGhlbWF0aWNhbCBjb25zdGFudCB3aXRoIHRoZSB2YWx1ZVxcbjYuMjgzMTg1MzA3MTc5NTg2NDc2OTMuIEl0IGlzIHR3aWNlIHRoZSByYXRpbyBvZiB0aGVcXG5jaXJjdW1mZXJlbmNlIG9mIGEgY2lyY2xlIHRvIGl0cyBkaWFtZXRlci4gSXQgaXMgdXNlZnVsIGluXFxuY29tYmluYXRpb24gd2l0aCB0aGUgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgc2luKCkgYW5kIGNvcygpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiVFdPX1BJXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmFyYyg1MCwgNTAsIDgwLCA4MCwgMCwgVFdPX1BJKTtcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjgweDgwIHdoaXRlIGVsbGlwc2Ugc2hhcGUgaW4gY2VudGVyIG9mIGNhbnZhcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTI5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnN0YW50IHRvIGJlIHVzZWQgd2l0aCBhbmdsZU1vZGUoKSBmdW5jdGlvbiwgdG8gc2V0IHRoZSBtb2RlIHdoaWNoXFxucDUuanMgaW50ZXJwcmF0ZXMgYW5kIGNhbGN1bGF0ZXMgYW5nbGVzIChlaXRoZXIgREVHUkVFUyBvciBSQURJQU5TKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkRFR1JFRVNcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGFuZ2xlTW9kZShERUdSRUVTKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNDMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29uc3RhbnQgdG8gYmUgdXNlZCB3aXRoIGFuZ2xlTW9kZSgpIGZ1bmN0aW9uLCB0byBzZXQgdGhlIG1vZGUgd2hpY2hcXG5wNS5qcyBpbnRlcnByYXRlcyBhbmQgY2FsY3VsYXRlcyBhbmdsZXMgKGVpdGhlciBSQURJQU5TIG9yIERFR1JFRVMpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUkFESUFOU1wiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYW5nbGVNb2RlKFJBRElBTlMpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2MSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQ09STkVSXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTY2LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJDT1JORVJTXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTcxLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJSQURJVVNcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNzYsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlJJR0hUXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTgxLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJMRUZUXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTg2LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJDRU5URVJcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxOTEsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlRPUFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE5NixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQk9UVE9NXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjAxLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJCQVNFTElORVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJhbHBoYWJldGljXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIwNyxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUE9JTlRTXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIjB4MDAwMFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMTMsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkxJTkVTXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIjB4MDAwMVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMTksXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkxJTkVfU1RSSVBcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiMHgwMDAzXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIyNSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiTElORV9MT09QXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIjB4MDAwMlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMzEsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlRSSUFOR0xFU1wiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCIweDAwMDRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjM3LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJUUklBTkdMRV9GQU5cIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiMHgwMDA2XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI0MyxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiVFJJQU5HTEVfU1RSSVBcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiMHgwMDA1XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI0OSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUVVBRFNcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNTQsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlFVQURfU1RSSVBcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwicXVhZF9zdHJpcFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNjAsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNMT1NFXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjY1LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJPUEVOXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjcwLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJDSE9SRFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI3NSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUElFXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjgwLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQUk9KRUNUXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInNxdWFyZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyODYsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlNRVUFSRVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJidXR0XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI5MixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUk9VTkRcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyOTcsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkJFVkVMXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzAyLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJNSVRFUlwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMwOSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUkdCXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzE0LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJIU0JcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzMTksXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkhTTFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM0NSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQkxFTkRcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwic291cmNlLW92ZXJcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzUxLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBRERcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwibGlnaHRlclwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzNTksXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkRBUktFU1RcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzNjQsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkxJR0hURVNUXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcImxpZ2h0ZW5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzcwLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJESUZGRVJFTkNFXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzc1LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFWENMVVNJT05cIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzODAsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIk1VTFRJUExZXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzg1LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJTQ1JFRU5cIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzOTAsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlJFUExBQ0VcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiY29weVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzOTYsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIk9WRVJMQVlcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MDEsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkhBUkRfTElHSFRcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MDYsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlNPRlRfTElHSFRcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MTEsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkRPREdFXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcImNvbG9yLWRvZGdlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQxNyxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQlVSTlwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJjb2xvci1idXJuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQyNSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiVEhSRVNIT0xEXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDMwLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJHUkFZXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDM1LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJPUEFRVUVcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0NDAsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIklOVkVSVFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ0NSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUE9TVEVSSVpFXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDUwLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJESUxBVEVcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0NTUsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkVST0RFXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDYwLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJCTFVSXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDY3LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJOT1JNQUxcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJmaW5hbFwiOiAxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkNvbnN0YW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb25zdGFudHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jb25zdGFudHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0NzIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIklUQUxJQ1wiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ3NyxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQk9MRFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvbnN0YW50cy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUwMSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiTEFORFNDQVBFXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgIFwiZmluYWxcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJDb25zdGFudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29uc3RhbnRzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTA2LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQT1JUUkFJVFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcImZpbmFsXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiQ29uc3RhbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnN0YW50c1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2NvcmUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DYWxsZWQgZGlyZWN0bHkgYmVmb3JlIHNldHVwKCksIHRoZSBwcmVsb2FkKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBoYW5kbGVcXG5hc3luY2hyb25vdXMgbG9hZGluZyBvZiBleHRlcm5hbCBmaWxlcyBpbiBhIGJsb2NraW5nIHdheS4gSWYgYSBwcmVsb2FkIFxcbmZ1bmN0aW9uIGlzIGRlZmluZWQsIHNldHVwKCkgd2lsbCB3YWl0IHVudGlsIGFueSBsb2FkIGNhbGxzIHdpdGhpbiBoYXZlXFxuZmluaXNoZWQuIE5vdGhpbmcgYmVzaWRlcyBsb2FkIGNhbGxzIChsb2FkSW1hZ2UsIGxvYWRKU09OLCBsb2FkRm9udCxcXG5sb2FkU3RyaW5ncywgZXRjLikgc2hvdWxkIGJlIGluc2lkZSBwcmVsb2FkIGZ1bmN0aW9uLiBJZiBhc3luY2hyb25vdXNcXG5sb2FkaW5nIGlzIHByZWZlcnJlZCwgdGhlIGxvYWQgbWV0aG9kcyBjYW4gaW5zdGVhZCBiZSBjYWxsZWQgaW4gc2V0dXAoKVxcbm9yIGFueXdoZXJlIGVsc2Ugd2l0aCB0aGUgdXNlIG9mIGEgY2FsbGJhY2sgcGFyYW1ldGVyLlxcbjxicj48YnI+XFxuQnkgZGVmYXVsdCB0aGUgdGV4dCAmcXVvdDtsb2FkaW5nLi4uJnF1b3Q7IHdpbGwgYmUgZGlzcGxheWVkLiBUbyBtYWtlIHlvdXIgb3duXFxubG9hZGluZyBwYWdlLCBpbmNsdWRlIGFuIEhUTUwgZWxlbWVudCB3aXRoIGlkICZxdW90O3A1X2xvYWRpbmcmcXVvdDsgaW4geW91clxcbnBhZ2UuIE1vcmUgaW5mb3JtYXRpb24gPGEgaHJlZj1cXFwiaHR0cDovL2JpdC5seS8ya1E2TmlvXFxcIj5oZXJlPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwcmVsb2FkXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgaW1nO1xcbnZhciBjO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuIC8vIHByZWxvYWQoKSBydW5zIG9uY2VcXG4gIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2xhRGVmZW5zZS5qcGcnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuIC8vIHNldHVwKCkgd2FpdHMgdW50aWwgcHJlbG9hZCgpIGlzIGRvbmVcXG4gIGltZy5sb2FkUGl4ZWxzKCk7XFxuICAvLyBnZXQgY29sb3Igb2YgbWlkZGxlIHBpeGVsXFxuICBjID0gaW1nLmdldChpbWcud2lkdGggLyAyLCBpbWcuaGVpZ2h0IC8gMik7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKGMpO1xcbiAgaW1hZ2UoaW1nLCAyNSwgMjUsIDUwLCA1MCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm90aGluZyBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RydWN0dXJlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29yZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDkwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBzZXR1cCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIHdoZW4gdGhlIHByb2dyYW0gc3RhcnRzLiBJdCYjMzk7cyB1c2VkIHRvXFxuZGVmaW5lIGluaXRpYWwgZW52aXJvbm1lbnQgcHJvcGVydGllcyBzdWNoIGFzIHNjcmVlbiBzaXplIGFuZCBiYWNrZ3JvdW5kXFxuY29sb3IgYW5kIHRvIGxvYWQgbWVkaWEgc3VjaCBhcyBpbWFnZXMgYW5kIGZvbnRzIGFzIHRoZSBwcm9ncmFtIHN0YXJ0cy5cXG5UaGVyZSBjYW4gb25seSBiZSBvbmUgc2V0dXAoKSBmdW5jdGlvbiBmb3IgZWFjaCBwcm9ncmFtIGFuZCBpdCBzaG91bGRuJiMzOTt0XFxuYmUgY2FsbGVkIGFnYWluIGFmdGVyIGl0cyBpbml0aWFsIGV4ZWN1dGlvbi5cXG48YnI+PGJyPlxcbk5vdGU6IFZhcmlhYmxlcyBkZWNsYXJlZCB3aXRoaW4gc2V0dXAoKSBhcmUgbm90IGFjY2Vzc2libGUgd2l0aGluIG90aGVyXFxuZnVuY3Rpb25zLCBpbmNsdWRpbmcgZHJhdygpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldHVwXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgYSA9IDA7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMTAyKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIHJlY3QoYSsrICUgd2lkdGgsIDEwLCAyLCA4MCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm90aGluZyBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RydWN0dXJlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29yZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DYWxsZWQgZGlyZWN0bHkgYWZ0ZXIgc2V0dXAoKSwgdGhlIGRyYXcoKSBmdW5jdGlvbiBjb250aW51b3VzbHkgZXhlY3V0ZXNcXG50aGUgbGluZXMgb2YgY29kZSBjb250YWluZWQgaW5zaWRlIGl0cyBibG9jayB1bnRpbCB0aGUgcHJvZ3JhbSBpcyBzdG9wcGVkXFxub3Igbm9Mb29wKCkgaXMgY2FsbGVkLiBOb3RlIGlmIG5vTG9vcCgpIGlzIGNhbGxlZCBpbiBzZXR1cCgpLCBkcmF3KCkgd2lsbFxcbnN0aWxsIGJlIGV4ZWN1dGVkIG9uY2UgYmVmb3JlIHN0b3BwaW5nLiBkcmF3KCkgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYW5kXFxuc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBleHBsaWNpdGx5Llxcbjxicj48YnI+XFxuSXQgc2hvdWxkIGFsd2F5cyBiZSBjb250cm9sbGVkIHdpdGggbm9Mb29wKCksIHJlZHJhdygpIGFuZCBsb29wKCkuIEFmdGVyXFxubm9Mb29wKCkgc3RvcHMgdGhlIGNvZGUgaW4gZHJhdygpIGZyb20gZXhlY3V0aW5nLCByZWRyYXcoKSBjYXVzZXMgdGhlXFxuY29kZSBpbnNpZGUgZHJhdygpIHRvIGV4ZWN1dGUgb25jZSwgYW5kIGxvb3AoKSB3aWxsIGNhdXNlIHRoZSBjb2RlXFxuaW5zaWRlIGRyYXcoKSB0byByZXN1bWUgZXhlY3V0aW5nIGNvbnRpbnVvdXNseS5cXG48YnI+PGJyPlxcblRoZSBudW1iZXIgb2YgdGltZXMgZHJhdygpIGV4ZWN1dGVzIGluIGVhY2ggc2Vjb25kIG1heSBiZSBjb250cm9sbGVkIHdpdGhcXG50aGUgZnJhbWVSYXRlKCkgZnVuY3Rpb24uXFxuPGJyPjxicj5cXG5UaGVyZSBjYW4gb25seSBiZSBvbmUgZHJhdygpIGZ1bmN0aW9uIGZvciBlYWNoIHNrZXRjaCwgYW5kIGRyYXcoKSBtdXN0XFxuZXhpc3QgaWYgeW91IHdhbnQgdGhlIGNvZGUgdG8gcnVuIGNvbnRpbnVvdXNseSwgb3IgdG8gcHJvY2VzcyBldmVudHMgc3VjaFxcbmFzIG1vdXNlUHJlc3NlZCgpLiBTb21ldGltZXMsIHlvdSBtaWdodCBoYXZlIGFuIGVtcHR5IGNhbGwgdG8gZHJhdygpIGluXFxueW91ciBwcm9ncmFtLCBhcyBzaG93biBpbiB0aGUgYWJvdmUgZXhhbXBsZS5cXG48YnI+PGJyPlxcbkl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGRyYXdpbmcgY29vcmRpbmF0ZSBzeXN0ZW0gd2lsbCBiZSByZXNldFxcbmF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBkcmF3KCkgY2FsbC4gSWYgYW55IHRyYW5zZm9ybWF0aW9ucyBhcmUgcGVyZm9ybWVkXFxud2l0aGluIGRyYXcoKSAoZXg6IHNjYWxlLCByb3RhdGUsIHRyYW5zbGF0ZSksIHRoZWlyIGVmZmVjdHMgd2lsbCBiZVxcbnVuZG9uZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGRyYXcoKSwgc28gdHJhbnNmb3JtYXRpb25zIHdpbGwgbm90IGFjY3VtdWxhdGVcXG5vdmVyIHRpbWUuIE9uIHRoZSBvdGhlciBoYW5kLCBzdHlsaW5nIGFwcGxpZWQgKGV4OiBmaWxsLCBzdHJva2UsIGV0Yykgd2lsbFxcbnJlbWFpbiBpbiBlZmZlY3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHJhd1wiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHlQb3MgPSAwO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAvLyBzZXR1cCgpIHJ1bnMgb25jZVxcbiAgZnJhbWVSYXRlKDMwKTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gLy8gZHJhdygpIGxvb3BzIGZvcmV2ZXIsIHVudGlsIHN0b3BwZWRcXG4gIGJhY2tncm91bmQoMjA0KTtcXG4gIHlQb3MgPSB5UG9zIC0gMTtcXG4gIGlmICh5UG9zIDwgMCkge1xcbiAgICB5UG9zID0gaGVpZ2h0O1xcbiAgfVxcbiAgbGluZSgwLCB5UG9zLCB3aWR0aCwgeVBvcyk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm90aGluZyBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RydWN0dXJlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY29yZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQwNyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZW1vdmVzIHRoZSBlbnRpcmUgcDUgc2tldGNoLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBjYW52YXMgYW5kIGFueVxcbmVsZW1lbnRzIGNyZWF0ZWQgYnkgcDUuanMuIEl0IHdpbGwgYWxzbyBzdG9wIHRoZSBkcmF3IGxvb3AgYW5kIHVuYmluZFxcbmFueSBwcm9wZXJ0aWVzIG9yIG1ldGhvZHMgZnJvbSB0aGUgd2luZG93IGdsb2JhbCBzY29wZS4gSXQgd2lsbFxcbmxlYXZlIGEgdmFyaWFibGUgcDUgaW4gY2FzZSB5b3Ugd2FudGVkIHRvIGNyZWF0ZSBhIG5ldyBwNSBza2V0Y2guXFxuSWYgeW91IGxpa2UsIHlvdSBjYW4gc2V0IHA1ID0gbnVsbCB0byBlcmFzZSBpdC4gV2hpbGUgYWxsIGZ1bmN0aW9ucyBhbmRcXG52YXJpYWJsZXMgYW5kIG9iamVjdHMgY3JlYXRlZCBieSB0aGUgcDUgbGlicmFyeSB3aWxsIGJlIHJlbW92ZWQsIGFueVxcbm90aGVyIGdsb2JhbCB2YXJpYWJsZXMgY3JlYXRlZCBieSB5b3VyIGNvZGUgd2lsbCByZW1haW4uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBlbGxpcHNlKDUwLCA1MCwgMTAsIDEwKTtcXG59XFxuXFxuZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xcbiAgcmVtb3ZlKCk7IC8vIHJlbW92ZSB3aG9sZSBza2V0Y2ggb24gbW91c2UgcHJlc3NcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJub3RoaW5nIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJTdHJ1Y3R1cmVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jdXJ2ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EcmF3cyBhIGN1YmljIEJlemllciBjdXJ2ZSBvbiB0aGUgc2NyZWVuLiBUaGVzZSBjdXJ2ZXMgYXJlIGRlZmluZWQgYnkgYVxcbnNlcmllcyBvZiBhbmNob3IgYW5kIGNvbnRyb2wgcG9pbnRzLiBUaGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgc3BlY2lmeVxcbnRoZSBmaXJzdCBhbmNob3IgcG9pbnQgYW5kIHRoZSBsYXN0IHR3byBwYXJhbWV0ZXJzIHNwZWNpZnkgdGhlIG90aGVyXFxuYW5jaG9yIHBvaW50LCB3aGljaCBiZWNvbWUgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBvbiB0aGUgY3VydmUuIFRoZVxcbm1pZGRsZSBwYXJhbWV0ZXJzIHNwZWNpZnkgdGhlIHR3byBjb250cm9sIHBvaW50cyB3aGljaCBkZWZpbmUgdGhlIHNoYXBlXFxub2YgdGhlIGN1cnZlLiBBcHByb3hpbWF0ZWx5IHNwZWFraW5nLCBjb250cm9sIHBvaW50cyAmcXVvdDtwdWxsJnF1b3Q7IHRoZSBjdXJ2ZVxcbnRvd2FyZHMgdGhlbS48YnIgLz48YnIgLz5CZXppZXIgY3VydmVzIHdlcmUgZGV2ZWxvcGVkIGJ5IEZyZW5jaFxcbmF1dG9tb3RpdmUgZW5naW5lZXIgUGllcnJlIEJlemllciwgYW5kIGFyZSBjb21tb25seSB1c2VkIGluIGNvbXB1dGVyXFxuZ3JhcGhpY3MgdG8gZGVmaW5lIGdlbnRseSBzbG9waW5nIGN1cnZlcy4gU2VlIGFsc28gY3VydmUoKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJiZXppZXJcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5ub0ZpbGwoKTtcXG5zdHJva2UoMjU1LCAxMDIsIDApO1xcbmxpbmUoODUsIDIwLCAxMCwgMTApO1xcbmxpbmUoOTAsIDkwLCAxNSwgODApO1xcbnN0cm9rZSgwLCAwLCAwKTtcXG5iZXppZXIoODUsIDIwLCAxMCwgMTAsIDkwLCA5MCwgMTUsIDgwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5iYWNrZ3JvdW5kKDAsIDAsIDApO1xcbm5vRmlsbCgpO1xcbnN0cm9rZSgyNTUpO1xcbmJlemllcigyNTAsIDI1MCwgMCwgMTAwLCAxMDAsIDAsIDEwMCwgMCwgMCwgMCwgMTAwLCAwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInN0cmV0Y2hlZCBibGFjayBzLXNoYXBlIGluIGNlbnRlciB3aXRoIG9yYW5nZSBsaW5lcyBleHRlbmRpbmcgZnJvbSBlbmQgcG9pbnRzLlxcbnN0cmV0Y2hlZCBibGFjayBzLXNoYXBlIHdpdGggMTAgNXg1IHdoaXRlIGVsbGlwc2VzIGFsb25nIHRoZSBzaGFwZS5cXG5zdHJldGNoZWQgYmxhY2sgcy1zaGFwZSB3aXRoIDcgNXg1IGVsbGlwc2VzIGFuZCBvcmFuZ2UgbGluZXMgYWxvbmcgdGhlIHNoYXBlLlxcbnN0cmV0Y2hlZCBibGFjayBzLXNoYXBlIHdpdGggMTcgc21hbGwgb3JhbmdlIGxpbmVzIGV4dGVuZGluZyBmcm9tIHVuZGVyIHNoYXBlLlxcbmhvcnNlc2hvZSBzaGFwZSB3aXRoIG9yYW5nZSBlbmRzIGZhY2luZyBsZWZ0IGFuZCBibGFjayBjdXJ2ZWQgY2VudGVyLlxcbmhvcnNlc2hvZSBzaGFwZSB3aXRoIG9yYW5nZSBlbmRzIGZhY2luZyBsZWZ0IGFuZCBibGFjayBjdXJ2ZWQgY2VudGVyLlxcbkxpbmUgc2hhcGVkIGxpa2UgcmlnaHQtZmFjaW5nIGFycm93LHBvaW50cyBtb3ZlIHdpdGggbW91c2UteCBhbmQgd2FycCBzaGFwZS5cXG5ob3Jpem9udGFsIGxpbmUgdGhhdCBob29rcyBkb3dud2FyZCBvbiB0aGUgcmlnaHQgYW5kIDEzIDV4NSBlbGxpcHNlcyBhbG9uZyBpdC5cXG5yaWdodCBjdXJ2aW5nIGxpbmUgbWlkLXJpZ2h0IG9mIGNhbnZhcyB3aXRoIDcgc2hvcnQgbGluZXMgcmFkaWF0aW5nIGZyb20gaXQuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ3VydmVzXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTMsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBhbmNob3IgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1jb29yZGluYXRlIGZvciB0aGUgZmlyc3QgYW5jaG9yIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPngtY29vcmRpbmF0ZSBmb3IgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1jb29yZGluYXRlIGZvciB0aGUgZmlyc3QgY29udHJvbCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LWNvb3JkaW5hdGUgZm9yIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgZm9yIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LWNvb3JkaW5hdGUgZm9yIHRoZSBzZWNvbmQgYW5jaG9yIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInk0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktY29vcmRpbmF0ZSBmb3IgdGhlIHNlY29uZCBhbmNob3IgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNjYsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD56LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBhbmNob3IgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieDJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiejJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ei1jb29yZGluYXRlIGZvciB0aGUgZmlyc3QgY29udHJvbCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD56LWNvb3JkaW5hdGUgZm9yIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD56LWNvb3JkaW5hdGUgZm9yIHRoZSBzZWNvbmQgYW5jaG9yIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2N1cnZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDkyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldHMgdGhlIHJlc29sdXRpb24gYXQgd2hpY2ggQmV6aWVycyBkaXNwbGF5LjwvcD5cXG48cD5UaGUgZGVmYXVsdCB2YWx1ZSBpcyAyMC48L3A+XFxuPHA+VGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCB3aGVuIHVzaW5nIHRoZSBXRUJHTCByZW5kZXJlclxcbmFzIHRoZSBkZWZhdWx0IGNhbnZhcyByZW5kZXJlciBkb2VzIG5vdCB1c2UgdGhpcyBpbmZvcm1hdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJiZXppZXJEZXRhaWxcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRldGFpbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cmVzb2x1dGlvbiBvZiB0aGUgY3VydmVzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgbW9kZXJuaXpyPSd3ZWJnbCc+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG4gIG5vRmlsbCgpO1xcblxcbiAgYmV6aWVyRGV0YWlsKDUpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcblxcbiAgLy8gcHJldHRpZXItaWdub3JlXFxuICBiZXppZXIoLTQwLCAtNDAsIDAsXFxuICAgICAgICAgIDkwLCAtNDAsIDAsXFxuICAgICAgICAgLTkwLCAgNDAsIDAsXFxuICAgICAgICAgIDQwLCAgNDAsIDApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInN0cmV0Y2hlZCBibGFjayBzLXNoYXBlIHdpdGggYSBsb3cgbGV2ZWwgb2YgYmV6aWVyIGRldGFpbFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkN1cnZlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2N1cnZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEzNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5FdmFsdWF0ZXMgdGhlIEJlemllciBhdCBwb3NpdGlvbiB0IGZvciBwb2ludHMgYSwgYiwgYywgZC5cXG5UaGUgcGFyYW1ldGVycyBhIGFuZCBkIGFyZSB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnRzXFxub24gdGhlIGN1cnZlLCBhbmQgYiBhbmQgYyBhcmUgdGhlIGNvbnRyb2wgcG9pbnRzLlxcblRoZSBmaW5hbCBwYXJhbWV0ZXIgdCB2YXJpZXMgYmV0d2VlbiAwIGFuZCAxLlxcblRoaXMgY2FuIGJlIGRvbmUgb25jZSB3aXRoIHRoZSB4IGNvb3JkaW5hdGVzIGFuZCBhIHNlY29uZCB0aW1lXFxud2l0aCB0aGUgeSBjb29yZGluYXRlcyB0byBnZXQgdGhlIGxvY2F0aW9uIG9mIGEgYmV6aWVyIGN1cnZlIGF0IHQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYmV6aWVyUG9pbnRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnQgb24gdGhlIGN1cnZlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb29yZGluYXRlIG9mIGZpcnN0IGNvbnRyb2wgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvb3JkaW5hdGUgb2Ygc2Vjb25kIGNvbnRyb2wgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50IG9uIHRoZSBjdXJ2ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmFsdWUgYmV0d2VlbiAwIGFuZCAxPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSB2YWx1ZSBvZiB0aGUgQmV6aWVyIGF0IHBvc2l0aW9uIHRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbm5vRmlsbCgpO1xcbnZhciB4MSA9IDg1LFxcbiB4MiA9IDEwLFxcbiB4MyA9IDkwLFxcbiB4NCA9IDE1O1xcbnZhciB5MSA9IDIwLFxcbiB5MiA9IDEwLFxcbiB5MyA9IDkwLFxcbiB5NCA9IDgwO1xcbmJlemllcih4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpO1xcbmZpbGwoMjU1KTtcXG52YXIgc3RlcHMgPSAxMDtcXG5mb3IgKHZhciBpID0gMDsgaSA8PSBzdGVwczsgaSsrKSB7XFxuICB2YXIgdCA9IGkgLyBzdGVwcztcXG4gIHZhciB4ID0gYmV6aWVyUG9pbnQoeDEsIHgyLCB4MywgeDQsIHQpO1xcbiAgdmFyIHkgPSBiZXppZXJQb2ludCh5MSwgeTIsIHkzLCB5NCwgdCk7XFxuICBlbGxpcHNlKHgsIHksIDUsIDUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInN0cmV0Y2hlZCBibGFjayBzLXNoYXBlIHdpdGggMTcgc21hbGwgb3JhbmdlIGxpbmVzIGV4dGVuZGluZyBmcm9tIHVuZGVyIHNoYXBlLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkN1cnZlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2N1cnZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE5MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5FdmFsdWF0ZXMgdGhlIHRhbmdlbnQgdG8gdGhlIEJlemllciBhdCBwb3NpdGlvbiB0IGZvciBwb2ludHMgYSwgYiwgYywgZC5cXG5UaGUgcGFyYW1ldGVycyBhIGFuZCBkIGFyZSB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnRzXFxub24gdGhlIGN1cnZlLCBhbmQgYiBhbmQgYyBhcmUgdGhlIGNvbnRyb2wgcG9pbnRzLlxcblRoZSBmaW5hbCBwYXJhbWV0ZXIgdCB2YXJpZXMgYmV0d2VlbiAwIGFuZCAxLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImJlemllclRhbmdlbnRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnQgb24gdGhlIGN1cnZlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb29yZGluYXRlIG9mIGZpcnN0IGNvbnRyb2wgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvb3JkaW5hdGUgb2Ygc2Vjb25kIGNvbnRyb2wgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50IG9uIHRoZSBjdXJ2ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmFsdWUgYmV0d2VlbiAwIGFuZCAxPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSB0YW5nZW50IGF0IHBvc2l0aW9uIHRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbm5vRmlsbCgpO1xcbmJlemllcig4NSwgMjAsIDEwLCAxMCwgOTAsIDkwLCAxNSwgODApO1xcbnZhciBzdGVwcyA9IDY7XFxuZmlsbCgyNTUpO1xcbmZvciAodmFyIGkgPSAwOyBpIDw9IHN0ZXBzOyBpKyspIHtcXG4gIHZhciB0ID0gaSAvIHN0ZXBzO1xcbiAgLy8gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcG9pbnRcXG4gIHZhciB4ID0gYmV6aWVyUG9pbnQoODUsIDEwLCA5MCwgMTUsIHQpO1xcbiAgdmFyIHkgPSBiZXppZXJQb2ludCgyMCwgMTAsIDkwLCA4MCwgdCk7XFxuICAvLyBHZXQgdGhlIHRhbmdlbnQgcG9pbnRzXFxuICB2YXIgdHggPSBiZXppZXJUYW5nZW50KDg1LCAxMCwgOTAsIDE1LCB0KTtcXG4gIHZhciB0eSA9IGJlemllclRhbmdlbnQoMjAsIDEwLCA5MCwgODAsIHQpO1xcbiAgLy8gQ2FsY3VsYXRlIGFuIGFuZ2xlIGZyb20gdGhlIHRhbmdlbnQgcG9pbnRzXFxuICB2YXIgYSA9IGF0YW4yKHR5LCB0eCk7XFxuICBhICs9IFBJO1xcbiAgc3Ryb2tlKDI1NSwgMTAyLCAwKTtcXG4gIGxpbmUoeCwgeSwgY29zKGEpICogMzAgKyB4LCBzaW4oYSkgKiAzMCArIHkpO1xcbiAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIG9mIGNvZGUgbWFrZXMgYSBsaW5lXFxuICAvLyBpbnZlcnNlIG9mIHRoZSBhYm92ZSBsaW5lXFxuICAvL2xpbmUoeCwgeSwgY29zKGEpKi0zMCArIHgsIHNpbihhKSotMzAgKyB5KTtcXG4gIHN0cm9rZSgwKTtcXG4gIGVsbGlwc2UoeCwgeSwgNSwgNSk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbm5vRmlsbCgpO1xcbmJlemllcig4NSwgMjAsIDEwLCAxMCwgOTAsIDkwLCAxNSwgODApO1xcbnN0cm9rZSgyNTUsIDEwMiwgMCk7XFxudmFyIHN0ZXBzID0gMTY7XFxuZm9yICh2YXIgaSA9IDA7IGkgPD0gc3RlcHM7IGkrKykge1xcbiAgdmFyIHQgPSBpIC8gc3RlcHM7XFxuICB2YXIgeCA9IGJlemllclBvaW50KDg1LCAxMCwgOTAsIDE1LCB0KTtcXG4gIHZhciB5ID0gYmV6aWVyUG9pbnQoMjAsIDEwLCA5MCwgODAsIHQpO1xcbiAgdmFyIHR4ID0gYmV6aWVyVGFuZ2VudCg4NSwgMTAsIDkwLCAxNSwgdCk7XFxuICB2YXIgdHkgPSBiZXppZXJUYW5nZW50KDIwLCAxMCwgOTAsIDgwLCB0KTtcXG4gIHZhciBhID0gYXRhbjIodHksIHR4KTtcXG4gIGEgLT0gSEFMRl9QSTtcXG4gIGxpbmUoeCwgeSwgY29zKGEpICogOCArIHgsIHNpbihhKSAqIDggKyB5KTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJzLXNoYXBlZCBsaW5lIHdpdGggMTcgc2hvcnQgb3JhbmdlIGxpbmVzIGV4dGVuZGluZyBmcm9tIHVuZGVyc2lkZSBvZiBzaGFwZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkN1cnZlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2N1cnZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI2OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EcmF3cyBhIGN1cnZlZCBsaW5lIG9uIHRoZSBzY3JlZW4gYmV0d2VlbiB0d28gcG9pbnRzLCBnaXZlbiBhcyB0aGVcXG5taWRkbGUgZm91ciBwYXJhbWV0ZXJzLiBUaGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgYXJlIGEgY29udHJvbCBwb2ludCwgYXNcXG5pZiB0aGUgY3VydmUgY2FtZSBmcm9tIHRoaXMgcG9pbnQgZXZlbiB0aG91Z2ggaXQmIzM5O3Mgbm90IGRyYXduLiBUaGUgbGFzdFxcbnR3byBwYXJhbWV0ZXJzIHNpbWlsYXJseSBkZXNjcmliZSB0aGUgb3RoZXIgY29udHJvbCBwb2ludC4gPGJyIC8+PGJyIC8+XFxuTG9uZ2VyIGN1cnZlcyBjYW4gYmUgY3JlYXRlZCBieSBwdXR0aW5nIGEgc2VyaWVzIG9mIGN1cnZlKCkgZnVuY3Rpb25zXFxudG9nZXRoZXIgb3IgdXNpbmcgY3VydmVWZXJ0ZXgoKS4gQW4gYWRkaXRpb25hbCBmdW5jdGlvbiBjYWxsZWRcXG5jdXJ2ZVRpZ2h0bmVzcygpIHByb3ZpZGVzIGNvbnRyb2wgZm9yIHRoZSB2aXN1YWwgcXVhbGl0eSBvZiB0aGUgY3VydmUuXFxuVGhlIGN1cnZlKCkgZnVuY3Rpb24gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQ2F0bXVsbC1Sb20gc3BsaW5lcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjdXJ2ZVwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbm5vRmlsbCgpO1xcbnN0cm9rZSgyNTUsIDEwMiwgMCk7XFxuY3VydmUoNSwgMjYsIDUsIDI2LCA3MywgMjQsIDczLCA2MSk7XFxuc3Ryb2tlKDApO1xcbmN1cnZlKDUsIDI2LCA3MywgMjQsIDczLCA2MSwgMTUsIDY1KTtcXG5zdHJva2UoMjU1LCAxMDIsIDApO1xcbmN1cnZlKDczLCAyNCwgNzMsIDYxLCAxNSwgNjUsIDE1LCA2NSk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gRGVmaW5lIHRoZSBjdXJ2ZSBwb2ludHMgYXMgSmF2YVNjcmlwdCBvYmplY3RzXFxudmFyIHAxID0geyB4OiA1LCB5OiAyNiB9LFxcbiBwMiA9IHsgeDogNzMsIHk6IDI0IH07XFxudmFyIHAzID0geyB4OiA3MywgeTogNjEgfSxcXG4gcDQgPSB7IHg6IDE1LCB5OiA2NSB9O1xcbm5vRmlsbCgpO1xcbnN0cm9rZSgyNTUsIDEwMiwgMCk7XFxuY3VydmUocDEueCwgcDEueSwgcDEueCwgcDEueSwgcDIueCwgcDIueSwgcDMueCwgcDMueSk7XFxuc3Ryb2tlKDApO1xcbmN1cnZlKHAxLngsIHAxLnksIHAyLngsIHAyLnksIHAzLngsIHAzLnksIHA0LngsIHA0LnkpO1xcbnN0cm9rZSgyNTUsIDEwMiwgMCk7XFxuY3VydmUocDIueCwgcDIueSwgcDMueCwgcDMueSwgcDQueCwgcDQueSwgcDQueCwgcDQueSk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXY+XFxuPGNvZGU+XFxubm9GaWxsKCk7XFxuc3Ryb2tlKDI1NSwgMTAyLCAwKTtcXG5jdXJ2ZSg1LCAyNiwgMCwgNSwgMjYsIDAsIDczLCAyNCwgMCwgNzMsIDYxLCAwKTtcXG5zdHJva2UoMCk7XFxuY3VydmUoNSwgMjYsIDAsIDczLCAyNCwgMCwgNzMsIDYxLCAwLCAxNSwgNjUsIDApO1xcbnN0cm9rZSgyNTUsIDEwMiwgMCk7XFxuY3VydmUoNzMsIDI0LCAwLCA3MywgNjEsIDAsIDE1LCA2NSwgMCwgMTUsIDY1LCAwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImhvcnNlc2hvZSBzaGFwZSB3aXRoIG9yYW5nZSBlbmRzIGZhY2luZyBsZWZ0IGFuZCBibGFjayBjdXJ2ZWQgY2VudGVyLlxcbmhvcnNlc2hvZSBzaGFwZSB3aXRoIG9yYW5nZSBlbmRzIGZhY2luZyBsZWZ0IGFuZCBibGFjayBjdXJ2ZWQgY2VudGVyLlxcbmN1cnZpbmcgYmxhY2sgYW5kIG9yYW5nZSBsaW5lcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDdXJ2ZXNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAyNjksXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LWNvb3JkaW5hdGUgZm9yIHRoZSBiZWdpbm5pbmcgY29udHJvbCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgZm9yIHRoZSBiZWdpbm5pbmcgY29udHJvbCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LWNvb3JkaW5hdGUgZm9yIHRoZSBzZWNvbmQgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1jb29yZGluYXRlIGZvciB0aGUgc2Vjb25kIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIng0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPngtY29vcmRpbmF0ZSBmb3IgdGhlIGVuZGluZyBjb250cm9sIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInk0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktY29vcmRpbmF0ZSBmb3IgdGhlIGVuZGluZyBjb250cm9sIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDMzNCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInkxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInoxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnotY29vcmRpbmF0ZSBmb3IgdGhlIGJlZ2lubmluZyBjb250cm9sIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInkyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInoyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnotY29vcmRpbmF0ZSBmb3IgdGhlIGZpcnN0IHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInkzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInozXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnotY29vcmRpbmF0ZSBmb3IgdGhlIHNlY29uZCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD56LWNvb3JkaW5hdGUgZm9yIHRoZSBlbmRpbmcgY29udHJvbCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jdXJ2ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzNjAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyB0aGUgcmVzb2x1dGlvbiBhdCB3aGljaCBjdXJ2ZXMgZGlzcGxheS48L3A+XFxuPHA+VGhlIGRlZmF1bHQgdmFsdWUgaXMgMjAuPC9wPlxcbjxwPlRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgd2hlbiB1c2luZyB0aGUgV0VCR0wgcmVuZGVyZXJcXG5hcyB0aGUgZGVmYXVsdCBjYW52YXMgcmVuZGVyZXIgZG9lcyBub3QgdXNlIHRoaXNcXG5pbmZvcm1hdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjdXJ2ZURldGFpbFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVzb2x1dGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+b2YgdGhlIGN1cnZlczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IG1vZGVybml6cj0nd2ViZ2wnPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxuXFxuICBjdXJ2ZURldGFpbCg1KTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG5cXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxcbiAgY3VydmUoIDI1MCwgNjAwLCAwLFxcbiAgICAgICAgIC0zMCwgIDQwLCAwLFxcbiAgICAgICAgICAzMCwgIDMwLCAwLFxcbiAgICAgICAgLTI1MCwgNjAwLCAwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ3aGl0ZSBhcmNoIHNoYXBlIHdpdGggYSBsb3cgbGV2ZWwgb2YgY3VydmUgZGV0YWlsLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkN1cnZlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2N1cnZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQwMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Nb2RpZmllcyB0aGUgcXVhbGl0eSBvZiBmb3JtcyBjcmVhdGVkIHdpdGggY3VydmUoKSBhbmQgY3VydmVWZXJ0ZXgoKS5cXG5UaGUgcGFyYW1ldGVyIHRpZ2h0bmVzcyBkZXRlcm1pbmVzIGhvdyB0aGUgY3VydmUgZml0cyB0byB0aGUgdmVydGV4XFxucG9pbnRzLiBUaGUgdmFsdWUgMC4wIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aWdodG5lc3MgKHRoaXMgdmFsdWVcXG5kZWZpbmVzIHRoZSBjdXJ2ZXMgdG8gYmUgQ2F0bXVsbC1Sb20gc3BsaW5lcykgYW5kIHRoZSB2YWx1ZSAxLjAgY29ubmVjdHNcXG5hbGwgdGhlIHBvaW50cyB3aXRoIHN0cmFpZ2h0IGxpbmVzLiBWYWx1ZXMgd2l0aGluIHRoZSByYW5nZSAtNS4wIGFuZCA1LjBcXG53aWxsIGRlZm9ybSB0aGUgY3VydmVzIGJ1dCB3aWxsIGxlYXZlIHRoZW0gcmVjb2duaXphYmxlIGFuZCBhcyB2YWx1ZXNcXG5pbmNyZWFzZSBpbiBtYWduaXR1ZGUsIHRoZXkgd2lsbCBjb250aW51ZSB0byBkZWZvcm0uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3VydmVUaWdodG5lc3NcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFtb3VudFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+b2YgZGVmb3JtYXRpb24gZnJvbSB0aGUgb3JpZ2luYWwgdmVydGljZXM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBNb3ZlIHRoZSBtb3VzZSBsZWZ0IGFuZCByaWdodCB0byBzZWUgdGhlIGN1cnZlIGNoYW5nZVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIG5vRmlsbCgpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDQpO1xcbiAgdmFyIHQgPSBtYXAobW91c2VYLCAwLCB3aWR0aCwgLTUsIDUpO1xcbiAgY3VydmVUaWdodG5lc3ModCk7XFxuICBiZWdpblNoYXBlKCk7XFxuICBjdXJ2ZVZlcnRleCgxMCwgMjYpO1xcbiAgY3VydmVWZXJ0ZXgoMTAsIDI2KTtcXG4gIGN1cnZlVmVydGV4KDgzLCAyNCk7XFxuICBjdXJ2ZVZlcnRleCg4MywgNjEpO1xcbiAgY3VydmVWZXJ0ZXgoMjUsIDY1KTtcXG4gIGN1cnZlVmVydGV4KDI1LCA2NSk7XFxuICBlbmRTaGFwZSgpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIkxpbmUgc2hhcGVkIGxpa2UgcmlnaHQtZmFjaW5nIGFycm93LHBvaW50cyBtb3ZlIHdpdGggbW91c2UteCBhbmQgd2FycCBzaGFwZS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDdXJ2ZXNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9jdXJ2ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0NDgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RXZhbHVhdGVzIHRoZSBjdXJ2ZSBhdCBwb3NpdGlvbiB0IGZvciBwb2ludHMgYSwgYiwgYywgZC5cXG5UaGUgcGFyYW1ldGVyIHQgdmFyaWVzIGJldHdlZW4gMCBhbmQgMSwgYSBhbmQgZCBhcmUgcG9pbnRzXFxub24gdGhlIGN1cnZlLCBhbmQgYiBhbmQgYyBhcmUgdGhlIGNvbnRyb2wgcG9pbnRzLlxcblRoaXMgY2FuIGJlIGRvbmUgb25jZSB3aXRoIHRoZSB4IGNvb3JkaW5hdGVzIGFuZCBhIHNlY29uZCB0aW1lXFxud2l0aCB0aGUgeSBjb29yZGluYXRlcyB0byBnZXQgdGhlIGxvY2F0aW9uIG9mIGEgY3VydmUgYXQgdC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjdXJ2ZVBvaW50XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb29yZGluYXRlIG9mIGZpcnN0IHBvaW50IG9uIHRoZSBjdXJ2ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y29vcmRpbmF0ZSBvZiBmaXJzdCBjb250cm9sIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb29yZGluYXRlIG9mIHNlY29uZCBjb250cm9sIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb29yZGluYXRlIG9mIHNlY29uZCBwb2ludCBvbiB0aGUgY3VydmU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZhbHVlIGJldHdlZW4gMCBhbmQgMTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJiZXppZXIgdmFsdWUgYXQgcG9zaXRpb24gdFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxubm9GaWxsKCk7XFxuY3VydmUoNSwgMjYsIDUsIDI2LCA3MywgMjQsIDczLCA2MSk7XFxuY3VydmUoNSwgMjYsIDczLCAyNCwgNzMsIDYxLCAxNSwgNjUpO1xcbmZpbGwoMjU1KTtcXG5lbGxpcHNlTW9kZShDRU5URVIpO1xcbnZhciBzdGVwcyA9IDY7XFxuZm9yICh2YXIgaSA9IDA7IGkgPD0gc3RlcHM7IGkrKykge1xcbiAgdmFyIHQgPSBpIC8gc3RlcHM7XFxuICB2YXIgeCA9IGN1cnZlUG9pbnQoNSwgNSwgNzMsIDczLCB0KTtcXG4gIHZhciB5ID0gY3VydmVQb2ludCgyNiwgMjYsIDI0LCA2MSwgdCk7XFxuICBlbGxpcHNlKHgsIHksIDUsIDUpO1xcbiAgeCA9IGN1cnZlUG9pbnQoNSwgNzMsIDczLCAxNSwgdCk7XFxuICB5ID0gY3VydmVQb2ludCgyNiwgMjQsIDYxLCA2NSwgdCk7XFxuICBlbGxpcHNlKHgsIHksIDUsIDUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxubGluZSBob29raW5nIGRvd24gdG8gcmlnaHQtYm90dG9tIHdpdGggMTMgNXg1IHdoaXRlIGVsbGlwc2UgcG9pbnRzXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ3VydmVzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvY3VydmVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDk3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkV2YWx1YXRlcyB0aGUgdGFuZ2VudCB0byB0aGUgY3VydmUgYXQgcG9zaXRpb24gdCBmb3IgcG9pbnRzIGEsIGIsIGMsIGQuXFxuVGhlIHBhcmFtZXRlciB0IHZhcmllcyBiZXR3ZWVuIDAgYW5kIDEsIGEgYW5kIGQgYXJlIHBvaW50cyBvbiB0aGUgY3VydmUsXFxuYW5kIGIgYW5kIGMgYXJlIHRoZSBjb250cm9sIHBvaW50cy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjdXJ2ZVRhbmdlbnRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnQgb24gdGhlIGN1cnZlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb29yZGluYXRlIG9mIGZpcnN0IGNvbnRyb2wgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvb3JkaW5hdGUgb2Ygc2Vjb25kIGNvbnRyb2wgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50IG9uIHRoZSBjdXJ2ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmFsdWUgYmV0d2VlbiAwIGFuZCAxPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSB0YW5nZW50IGF0IHBvc2l0aW9uIHRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbm5vRmlsbCgpO1xcbmN1cnZlKDUsIDI2LCA3MywgMjQsIDczLCA2MSwgMTUsIDY1KTtcXG52YXIgc3RlcHMgPSA2O1xcbmZvciAodmFyIGkgPSAwOyBpIDw9IHN0ZXBzOyBpKyspIHtcXG4gIHZhciB0ID0gaSAvIHN0ZXBzO1xcbiAgdmFyIHggPSBjdXJ2ZVBvaW50KDUsIDczLCA3MywgMTUsIHQpO1xcbiAgdmFyIHkgPSBjdXJ2ZVBvaW50KDI2LCAyNCwgNjEsIDY1LCB0KTtcXG4gIC8vZWxsaXBzZSh4LCB5LCA1LCA1KTtcXG4gIHZhciB0eCA9IGN1cnZlVGFuZ2VudCg1LCA3MywgNzMsIDE1LCB0KTtcXG4gIHZhciB0eSA9IGN1cnZlVGFuZ2VudCgyNiwgMjQsIDYxLCA2NSwgdCk7XFxuICB2YXIgYSA9IGF0YW4yKHR5LCB0eCk7XFxuICBhIC09IFBJIC8gMi4wO1xcbiAgbGluZSh4LCB5LCBjb3MoYSkgKiA4ICsgeCwgc2luKGEpICogOCArIHkpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInJpZ2h0IGN1cnZpbmcgbGluZSBtaWQtcmlnaHQgb2YgY2FudmFzIHdpdGggNyBzaG9ydCBsaW5lcyByYWRpYXRpbmcgZnJvbSBpdC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDdXJ2ZXNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9lbnZpcm9ubWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBwcmludCgpIGZ1bmN0aW9uIHdyaXRlcyB0byB0aGUgY29uc29sZSBhcmVhIG9mIHlvdXIgYnJvd3Nlci5cXG5UaGlzIGZ1bmN0aW9uIGlzIG9mdGVuIGhlbHBmdWwgZm9yIGxvb2tpbmcgYXQgdGhlIGRhdGEgYSBwcm9ncmFtIGlzXFxucHJvZHVjaW5nLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgbGluZSBvZiB0ZXh0IGZvciBlYWNoIGNhbGwgdG9cXG50aGUgZnVuY3Rpb24uIEluZGl2aWR1YWwgZWxlbWVudHMgY2FuIGJlXFxuc2VwYXJhdGVkIHdpdGggcXVvdGVzICgmcXVvdDsmcXVvdDspIGFuZCBqb2luZWQgd2l0aCB0aGUgYWRkaXRpb24gb3BlcmF0b3IgKCspLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInByaW50XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb250ZW50c1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YW55IGNvbWJpbmF0aW9uIG9mIE51bWJlciwgU3RyaW5nLCBPYmplY3QsIEJvb2xlYW4sXFxuICAgICAgICAgICAgICAgICAgICAgIEFycmF5IHRvIHByaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBbnlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZSBjbGFzcz0nbm9yZW5kZXInPlxcbnZhciB4ID0gMTA7XFxucHJpbnQoJ1RoZSB2YWx1ZSBvZiB4IGlzICcgKyB4KTtcXG4vLyBwcmludHMgXFxcIlRoZSB2YWx1ZSBvZiB4IGlzIDEwXFxcIlxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiZGVmYXVsdCBncmV5IGNhbnZhc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkVudmlyb25tZW50XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkVudmlyb25tZW50XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvZW52aXJvbm1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgc3lzdGVtIHZhcmlhYmxlIGZyYW1lQ291bnQgY29udGFpbnMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCBoYXZlXFxuYmVlbiBkaXNwbGF5ZWQgc2luY2UgdGhlIHByb2dyYW0gc3RhcnRlZC4gSW5zaWRlIHNldHVwKCkgdGhlIHZhbHVlIGlzIDAsXFxuYWZ0ZXIgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvZiBkcmF3IGl0IGlzIDEsIGV0Yy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImZyYW1lQ291bnRcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgIFwicmVhZG9ubHlcIjogXCJcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gIDxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBmcmFtZVJhdGUoMzApO1xcbiAgdGV4dFNpemUoMjApO1xcbiAgdGV4dFNpemUoMzApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICB0ZXh0KGZyYW1lQ291bnQsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibnVtYmVycyByYXBpZGx5IGNvdW50aW5nIHVwd2FyZCB3aXRoIGZyYW1lIGNvdW50IHNldCB0byAzMC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2Vudmlyb25tZW50LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29uZmlybXMgaWYgdGhlIHdpbmRvdyBhIHA1LmpzIHByb2dyYW0gaXMgaW4gaXMgJnF1b3Q7Zm9jdXNlZCwmcXVvdDsgbWVhbmluZyB0aGF0XFxudGhlIHNrZXRjaCB3aWxsIGFjY2VwdCBtb3VzZSBvciBrZXlib2FyZCBpbnB1dC4gVGhpcyB2YXJpYWJsZSBpc1xcbiZxdW90O3RydWUmcXVvdDsgaWYgdGhlIHdpbmRvdyBpcyBmb2N1c2VkIGFuZCAmcXVvdDtmYWxzZSZxdW90OyBpZiBub3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJmb2N1c2VkXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG4vLyBUbyBkZW1vbnN0cmF0ZSwgcHV0IHR3byB3aW5kb3dzIHNpZGUgYnkgc2lkZS5cXG4vLyBDbGljayBvbiB0aGUgd2luZG93IHRoYXQgdGhlIHA1IHNrZXRjaCBpc24ndCBpbiFcXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMCwgMjAwLCAwKTtcXG4gIGVsbGlwc2UoMjUsIDI1LCA1MCwgNTApO1xcblxcbiAgaWYgKCFmb2N1c2VkKSB7XFxuICAgLy8gb3IgXFxcImlmIChmb2N1c2VkID09PSBmYWxzZSlcXFwiXFxuICAgIHN0cm9rZSgyMDAsIDAsIDApO1xcbiAgICBsaW5lKDAsIDAsIDEwMCwgMTAwKTtcXG4gICAgbGluZSgxMDAsIDAsIDAsIDEwMCk7XFxuICB9XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiZ3JlZW4gNTB4NTAgZWxsaXBzZSBhdCB0b3AgbGVmdC4gUmVkIFggY292ZXJzIGNhbnZhcyB3aGVuIHBhZ2UgZm9jdXMgY2hhbmdlc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkVudmlyb25tZW50XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkVudmlyb25tZW50XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvZW52aXJvbm1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyB0aGUgY3Vyc29yIHRvIGEgcHJlZGVmaW5lZCBzeW1ib2wgb3IgYW4gaW1hZ2UsIG9yIG1ha2VzIGl0IHZpc2libGVcXG5pZiBhbHJlYWR5IGhpZGRlbi4gSWYgeW91IGFyZSB0cnlpbmcgdG8gc2V0IGFuIGltYWdlIGFzIHRoZSBjdXJzb3IsIHRoZVxcbnJlY29tbWVuZGVkIHNpemUgaXMgMTZ4MTYgb3IgMzJ4MzIgcGl4ZWxzLiBJdCBpcyBub3QgcG9zc2libGUgdG8gbG9hZCBhblxcbmltYWdlIGFzIHRoZSBjdXJzb3IgaWYgeW91IGFyZSBleHBvcnRpbmcgeW91ciBwcm9ncmFtIGZvciB0aGUgV2ViLCBhbmQgbm90XFxuYWxsIE1PREVTIHdvcmsgd2l0aCBhbGwgYnJvd3NlcnMuIFRoZSB2YWx1ZXMgZm9yIHBhcmFtZXRlcnMgeCBhbmQgeSBtdXN0XFxuYmUgbGVzcyB0aGFuIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBpbWFnZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjdXJzb3JcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmVpdGhlciBBUlJPVywgQ1JPU1MsIEhBTkQsIE1PVkUsIFRFWFQsIG9yXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FJVCwgb3IgcGF0aCBmb3IgaW1hZ2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xDb25zdGFudFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBob3Jpem9udGFsIGFjdGl2ZSBzcG90IG9mIHRoZSBjdXJzb3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHZlcnRpY2FsIGFjdGl2ZSBzcG90IG9mIHRoZSBjdXJzb3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuLy8gTW92ZSB0aGUgbW91c2UgbGVmdCBhbmQgcmlnaHQgYWNyb3NzIHRoZSBpbWFnZVxcbi8vIHRvIHNlZSB0aGUgY3Vyc29yIGNoYW5nZSBmcm9tIGEgY3Jvc3MgdG8gYSBoYW5kXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGxpbmUod2lkdGggLyAyLCAwLCB3aWR0aCAvIDIsIGhlaWdodCk7XFxuICBpZiAobW91c2VYIDwgNTApIHtcXG4gICAgY3Vyc29yKENST1NTKTtcXG4gIH0gZWxzZSB7XFxuICAgIGN1cnNvcihIQU5EKTtcXG4gIH1cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJob3Jpem9udGFsIGxpbmUgZGl2aWRlcyBjYW52YXMuIGN1cnNvciBvbiBsZWZ0IGlzIGEgY3Jvc3MsIHJpZ2h0IGlzIGhhbmQuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRW52aXJvbm1lbnRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRW52aXJvbm1lbnRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9lbnZpcm9ubWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE3MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgZGlzcGxheWVkIGV2ZXJ5IHNlY29uZC4gRm9yIGV4YW1wbGUsXFxudGhlIGZ1bmN0aW9uIGNhbGwgZnJhbWVSYXRlKDMwKSB3aWxsIGF0dGVtcHQgdG8gcmVmcmVzaCAzMCB0aW1lcyBhIHNlY29uZC5cXG5JZiB0aGUgcHJvY2Vzc29yIGlzIG5vdCBmYXN0IGVub3VnaCB0byBtYWludGFpbiB0aGUgc3BlY2lmaWVkIHJhdGUsIHRoZVxcbmZyYW1lIHJhdGUgd2lsbCBub3QgYmUgYWNoaWV2ZWQuIFNldHRpbmcgdGhlIGZyYW1lIHJhdGUgd2l0aGluIHNldHVwKCkgaXNcXG5yZWNvbW1lbmRlZC4gVGhlIGRlZmF1bHQgcmF0ZSBpcyA2MCBmcmFtZXMgcGVyIHNlY29uZC4gVGhpcyBpcyB0aGUgc2FtZSBhc1xcbnNldEZyYW1lUmF0ZSh2YWwpLlxcbjxicj48YnI+XFxuQ2FsbGluZyBmcmFtZVJhdGUoKSB3aXRoIG5vIGFyZ3VtZW50cyByZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcmF0ZS4gVGhlXFxuZHJhdyBmdW5jdGlvbiBtdXN0IHJ1biBhdCBsZWFzdCBvbmNlIGJlZm9yZSBpdCB3aWxsIHJldHVybiBhIHZhbHVlLiBUaGlzXFxuaXMgdGhlIHNhbWUgYXMgZ2V0RnJhbWVSYXRlKCkuXFxuPGJyPjxicj5cXG5DYWxsaW5nIGZyYW1lUmF0ZSgpIHdpdGggYXJndW1lbnRzIHRoYXQgYXJlIG5vdCBvZiB0aGUgdHlwZSBudW1iZXJzXFxub3IgYXJlIG5vbiBwb3NpdGl2ZSBhbHNvIHJldHVybnMgY3VycmVudCBmcmFtZXJhdGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnJhbWVSYXRlXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcblxcbjxkaXY+PGNvZGU+XFxudmFyIHJlY3RYID0gMDtcXG52YXIgZnIgPSAzMDsgLy9zdGFydGluZyBGUFNcXG52YXIgY2xyO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgZnJhbWVSYXRlKGZyKTsgLy8gQXR0ZW1wdCB0byByZWZyZXNoIGF0IHN0YXJ0aW5nIEZQU1xcbiAgY2xyID0gY29sb3IoMjU1LCAwLCAwKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHJlY3RYID0gcmVjdFggKz0gMTsgLy8gTW92ZSBSZWN0YW5nbGVcXG5cXG4gIGlmIChyZWN0WCA+PSB3aWR0aCkge1xcbiAgIC8vIElmIHlvdSBnbyBvZmYgc2NyZWVuLlxcbiAgICBpZiAoZnIgPT09IDMwKSB7XFxuICAgICAgY2xyID0gY29sb3IoMCwgMCwgMjU1KTtcXG4gICAgICBmciA9IDEwO1xcbiAgICAgIGZyYW1lUmF0ZShmcik7IC8vIG1ha2UgZnJhbWVSYXRlIDEwIEZQU1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIGNsciA9IGNvbG9yKDI1NSwgMCwgMCk7XFxuICAgICAgZnIgPSAzMDtcXG4gICAgICBmcmFtZVJhdGUoZnIpOyAvLyBtYWtlIGZyYW1lUmF0ZSAzMCBGUFNcXG4gICAgfVxcbiAgICByZWN0WCA9IDA7XFxuICB9XFxuICBmaWxsKGNscik7XFxuICByZWN0KHJlY3RYLCA0MCwgMjAsIDIwKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJibHVlIHJlY3QgbW92ZXMgbGVmdCB0byByaWdodCwgZm9sbG93ZWQgYnkgcmVkIHJlY3QgbW92aW5nIGZhc3Rlci4gTG9vcHMuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRW52aXJvbm1lbnRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRW52aXJvbm1lbnRcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxNzAsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmcHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIG9mIGZyYW1lcyB0byBiZSBkaXNwbGF5ZWQgZXZlcnkgc2Vjb25kPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDIyOCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW10sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjdXJyZW50IGZyYW1lUmF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvZW52aXJvbm1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNjgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SGlkZXMgdGhlIGN1cnNvciBmcm9tIHZpZXcuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibm9DdXJzb3JcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgbm9DdXJzb3IoKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDEwLCAxMCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiY3Vyc29yIGJlY29tZXMgMTB4IDEwIHdoaXRlIGVsbGlwc2UgdGhlIG1vdmVzIHdpdGggbW91c2UgeCBhbmQgeS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2Vudmlyb25tZW50LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjkzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN5c3RlbSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgd2lkdGggb2YgdGhlIGVudGlyZSBzY3JlZW4gZGlzcGxheS4gVGhpc1xcbmlzIHVzZWQgdG8gcnVuIGEgZnVsbC1zY3JlZW4gcHJvZ3JhbSBvbiBhbnkgZGlzcGxheSBzaXplLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGlzcGxheVdpZHRoXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwicmVhZG9ubHlcIjogXCJcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+PGNvZGU+XFxuY3JlYXRlQ2FudmFzKGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJjdXJzb3IgYmVjb21lcyAxMHggMTAgd2hpdGUgZWxsaXBzZSB0aGUgbW92ZXMgd2l0aCBtb3VzZSB4IGFuZCB5LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkVudmlyb25tZW50XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkVudmlyb25tZW50XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvZW52aXJvbm1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzMTAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3lzdGVtIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSBoZWlnaHQgb2YgdGhlIGVudGlyZSBzY3JlZW4gZGlzcGxheS4gVGhpc1xcbmlzIHVzZWQgdG8gcnVuIGEgZnVsbC1zY3JlZW4gcHJvZ3JhbSBvbiBhbnkgZGlzcGxheSBzaXplLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGlzcGxheUhlaWdodFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPjxjb2RlPlxcbmNyZWF0ZUNhbnZhcyhkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpO1xcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gZGlzcGxheS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2Vudmlyb25tZW50LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzI3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN5c3RlbSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgd2lkdGggb2YgdGhlIGlubmVyIHdpbmRvdywgaXQgbWFwcyB0b1xcbndpbmRvdy5pbm5lcldpZHRoLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwid2luZG93V2lkdGhcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj48Y29kZT5cXG5jcmVhdGVDYW52YXMod2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCk7XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBkaXNwbGF5LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkVudmlyb25tZW50XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkVudmlyb25tZW50XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvZW52aXJvbm1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzNDMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3lzdGVtIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSBoZWlnaHQgb2YgdGhlIGlubmVyIHdpbmRvdywgaXQgbWFwcyB0b1xcbndpbmRvdy5pbm5lckhlaWdodC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIndpbmRvd0hlaWdodFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPjxjb2RlPlxcbmNyZWF0ZUNhbnZhcyh3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0KTtcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRW52aXJvbm1lbnRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRW52aXJvbm1lbnRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9lbnZpcm9ubWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM1OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgd2luZG93UmVzaXplZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGV2ZXJ5IHRpbWUgdGhlIGJyb3dzZXIgd2luZG93XFxuaXMgcmVzaXplZC4gVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gcmVzaXplIHRoZSBjYW52YXMgb3IgZG8gYW55IG90aGVyXFxuYWRqdXN0bWVudHMgdG8gYWNjb21tb2RhdGUgdGhlIG5ldyB3aW5kb3cgc2l6ZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dSZXNpemVkXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgwLCAxMDAsIDIwMCk7XFxufVxcblxcbmZ1bmN0aW9uIHdpbmRvd1Jlc2l6ZWQoKSB7XFxuICByZXNpemVDYW52YXMod2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gZGlzcGxheS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2Vudmlyb25tZW50LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDEzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN5c3RlbSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgd2lkdGggb2YgdGhlIGRyYXdpbmcgY2FudmFzLiBUaGlzIHZhbHVlXFxuaXMgc2V0IGJ5IHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhlIGNyZWF0ZUNhbnZhcygpIGZ1bmN0aW9uLlxcbkZvciBleGFtcGxlLCB0aGUgZnVuY3Rpb24gY2FsbCBjcmVhdGVDYW52YXMoMzIwLCAyNDApIHNldHMgdGhlIHdpZHRoXFxudmFyaWFibGUgdG8gdGhlIHZhbHVlIDMyMC4gVGhlIHZhbHVlIG9mIHdpZHRoIGRlZmF1bHRzIHRvIDEwMCBpZlxcbmNyZWF0ZUNhbnZhcygpIGlzIG5vdCB1c2VkIGluIGEgcHJvZ3JhbS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIndpZHRoXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwicmVhZG9ubHlcIjogXCJcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2Vudmlyb25tZW50LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDI1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN5c3RlbSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgaGVpZ2h0IG9mIHRoZSBkcmF3aW5nIGNhbnZhcy4gVGhpcyB2YWx1ZVxcbmlzIHNldCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiB0aGUgY3JlYXRlQ2FudmFzKCkgZnVuY3Rpb24uIEZvclxcbmV4YW1wbGUsIHRoZSBmdW5jdGlvbiBjYWxsIGNyZWF0ZUNhbnZhcygzMjAsIDI0MCkgc2V0cyB0aGUgaGVpZ2h0XFxudmFyaWFibGUgdG8gdGhlIHZhbHVlIDI0MC4gVGhlIHZhbHVlIG9mIGhlaWdodCBkZWZhdWx0cyB0byAxMDAgaWZcXG5jcmVhdGVDYW52YXMoKSBpcyBub3QgdXNlZCBpbiBhIHByb2dyYW0uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJoZWlnaHRcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkVudmlyb25tZW50XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkVudmlyb25tZW50XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvZW52aXJvbm1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MzcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SWYgYXJndW1lbnQgaXMgZ2l2ZW4sIHNldHMgdGhlIHNrZXRjaCB0byBmdWxsc2NyZWVuIG9yIG5vdCBiYXNlZCBvbiB0aGVcXG52YWx1ZSBvZiB0aGUgYXJndW1lbnQuIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm5zIHRoZSBjdXJyZW50XFxuZnVsbHNjcmVlbiBzdGF0ZS4gTm90ZSB0aGF0IGR1ZSB0byBicm93c2VyIHJlc3RyaWN0aW9ucyB0aGlzIGNhbiBvbmx5XFxuYmUgY2FsbGVkIG9uIHVzZXIgaW5wdXQsIGZvciBleGFtcGxlLCBvbiBtb3VzZSBwcmVzcyBsaWtlIHRoZSBleGFtcGxlXFxuYmVsb3cuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnVsbHNjcmVlblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD53aGV0aGVyIHRoZSBza2V0Y2ggc2hvdWxkIGJlIGluIGZ1bGxzY3JlZW4gbW9kZVxcbm9yIG5vdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjdXJyZW50IGZ1bGxzY3JlZW4gc3RhdGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBDbGlja2luZyBpbiB0aGUgYm94IHRvZ2dsZXMgZnVsbHNjcmVlbiBvbiBhbmQgb2ZmLlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbn1cXG5mdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XFxuICBpZiAobW91c2VYID4gMCAmJiBtb3VzZVggPCAxMDAgJiYgbW91c2VZID4gMCAmJiBtb3VzZVkgPCAxMDApIHtcXG4gICAgdmFyIGZzID0gZnVsbHNjcmVlbigpO1xcbiAgICBmdWxsc2NyZWVuKCFmcyk7XFxuICB9XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gZGlzcGxheS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2Vudmlyb25tZW50LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDg4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldHMgdGhlIHBpeGVsIHNjYWxpbmcgZm9yIGhpZ2ggcGl4ZWwgZGVuc2l0eSBkaXNwbGF5cy4gQnkgZGVmYXVsdFxcbnBpeGVsIGRlbnNpdHkgaXMgc2V0IHRvIG1hdGNoIGRpc3BsYXkgZGVuc2l0eSwgY2FsbCBwaXhlbERlbnNpdHkoMSlcXG50byB0dXJuIHRoaXMgb2ZmLiBDYWxsaW5nIHBpeGVsRGVuc2l0eSgpIHdpdGggbm8gYXJndW1lbnRzIHJldHVybnNcXG50aGUgY3VycmVudCBwaXhlbCBkZW5zaXR5IG9mIHRoZSBza2V0Y2guPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicGl4ZWxEZW5zaXR5XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPndoZXRoZXIgb3IgaG93IG11Y2ggdGhlIHNrZXRjaCBzaG91bGQgc2NhbGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjdXJyZW50IHBpeGVsIGRlbnNpdHkgb2YgdGhlIHNrZXRjaFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBwaXhlbERlbnNpdHkoMSk7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIDUwLCA1MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgcGl4ZWxEZW5zaXR5KDMuMCk7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIDUwLCA1MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiZnV6enkgNTB4NTAgd2hpdGUgZWxsaXBzZSB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cXG5zaGFycCA1MHg1MCB3aGl0ZSBlbGxpcHNlIHdpdGggYmxhY2sgb3V0bGluZSBpbiBjZW50ZXIgb2YgY2FudmFzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkVudmlyb25tZW50XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkVudmlyb25tZW50XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvZW52aXJvbm1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MzQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyB0aGUgcGl4ZWwgZGVuc2l0eSBvZiB0aGUgY3VycmVudCBkaXNwbGF5IHRoZSBza2V0Y2ggaXMgcnVubmluZyBvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkaXNwbGF5RGVuc2l0eVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjdXJyZW50IHBpeGVsIGRlbnNpdHkgb2YgdGhlIGRpc3BsYXlcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eSgpO1xcbiAgcGl4ZWxEZW5zaXR5KGRlbnNpdHkpO1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIGVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCA1MCwgNTApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjUweDUwIHdoaXRlIGVsbGlwc2Ugd2l0aCBibGFjayBvdXRsaW5lIGluIGNlbnRlciBvZiBjYW52YXMuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRW52aXJvbm1lbnRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRW52aXJvbm1lbnRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9lbnZpcm9ubWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU5MSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5HZXRzIHRoZSBjdXJyZW50IFVSTC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRVUkxcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgdXJsO1xcbnZhciB4ID0gMTAwO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgZmlsbCgwKTtcXG4gIG5vU3Ryb2tlKCk7XFxuICB1cmwgPSBnZXRVUkwoKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHRleHQodXJsLCB4LCBoZWlnaHQgLyAyKTtcXG4gIHgtLTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJjdXJyZW50IHVybCAoaHR0cDovL3A1anMub3JnL3JlZmVyZW5jZS8jL3A1L2dldFVSTCkgbW92ZXMgcmlnaHQgdG8gbGVmdC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2Vudmlyb25tZW50LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjIyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldHMgdGhlIGN1cnJlbnQgVVJMIHBhdGggYXMgYW4gYXJyYXkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0VVJMUGF0aFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwYXRoIGNvbXBvbmVudHNcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdbXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciB1cmxQYXRoID0gZ2V0VVJMUGF0aCgpO1xcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XFxuICAgIHRleHQodXJsUGF0aFtpXSwgMTAsIGkgKiAyMCArIDIwKTtcXG4gIH1cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBkaXNwbGF5XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRW52aXJvbm1lbnRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRW52aXJvbm1lbnRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9lbnZpcm9ubWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDY0NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5HZXRzIHRoZSBjdXJyZW50IFVSTCBwYXJhbXMgYXMgYW4gT2JqZWN0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldFVSTFBhcmFtc1wiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJVUkwgcGFyYW1zXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz5cXG48Y29kZT5cXG4vLyBFeGFtcGxlOiBodHRwOi8vcDVqcy5vcmc/eWVhcj0yMDE0Jm1vbnRoPU1heSZkYXk9MTVcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBwYXJhbXMgPSBnZXRVUkxQYXJhbXMoKTtcXG4gIHRleHQocGFyYW1zLmRheSwgMTAsIDIwKTtcXG4gIHRleHQocGFyYW1zLm1vbnRoLCAxMCwgNDApO1xcbiAgdGV4dChwYXJhbXMueWVhciwgMTAsIDYwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBkaXNwbGF5LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkVudmlyb25tZW50XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkVudmlyb25tZW50XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvZXJyb3JfaGVscGVycy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEsXG4gICAgICAgICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImNvcmVcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2Vycm9yX2hlbHBlcnMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MDUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VmFsaWRhdGVzIHBhcmFtZXRlcnNcXG5wYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgICBmdW5jICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvblxcbnBhcmFtICB7QXJyYXl9ICAgICAgICAgICAgICAgIGFyZ3MgICAgdXNlciBpbnB1dCBhcmd1bWVudHM8L3A+XFxuPHA+ZXhhbXBsZTpcXG4gdmFyIGE7XFxuIGVsbGlwc2UoMTAsMTAsYSw1KTtcXG5jb25zb2xlIG91cHV0OlxcbiAmcXVvdDtJdCBsb29rcyBsaWtlIGVsbGlwc2UgcmVjZWl2ZWQgYW4gZW1wdHkgdmFyaWFibGUgaW4gc3BvdCAjMi4mcXVvdDs8L3A+XFxuPHA+ZXhhbXBsZTpcXG4gZWxsaXBzZSgxMCwmcXVvdDtmb28mcXVvdDssNSw1KTtcXG5jb25zb2xlIG91dHB1dDpcXG4gJnF1b3Q7ZWxsaXBzZSB3YXMgZXhwZWN0aW5nIGEgbnVtYmVyIGZvciBwYXJhbWV0ZXIgIzEsXFxuICAgICAgICAgIHJlY2VpdmVkICZxdW90O2ZvbyZxdW90OyBpbnN0ZWFkLiZxdW90OzwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL2Vycm9yX2hlbHBlcnMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0NTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UHJpbnRzIG91dCBhbGwgdGhlIGNvbG9ycyBpbiB0aGUgY29sb3IgcGFsbGV0ZSB3aXRoIHdoaXRlIHRleHQuXFxuRm9yIGNvbG9yIGJsaW5kbmVzcyB0ZXN0aW5nLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFbnZpcm9ubWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5VbmRlcmx5aW5nIEhUTUwgZWxlbWVudC4gQWxsIG5vcm1hbCBIVE1MIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBvbiB0aGlzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmNyZWF0ZUNhbnZhcygzMDAsIDUwMCk7XFxuYmFja2dyb3VuZCgwLCAwLCAwLCAwKTtcXG52YXIgaW5wdXQgPSBjcmVhdGVJbnB1dCgpO1xcbmlucHV0LnBvc2l0aW9uKDIwLCAyMjUpO1xcbnZhciBpbnB1dEVsZW0gPSBuZXcgcDUuRWxlbWVudChpbnB1dC5lbHQpO1xcbmlucHV0RWxlbS5zdHlsZSgnd2lkdGg6NDUwcHg7Jyk7XFxuaW5wdXRFbGVtLnZhbHVlKCdzb21lIHN0cmluZycpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZWx0XCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRE9NXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcDUuRWxlbWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkF0dGFjaGVzIHRoZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQgc3BlY2lmaWVkLiBBIHdheSBvZiBzZXR0aW5nXFxuIHRoZSBjb250YWluZXIgZm9yIHRoZSBlbGVtZW50LiBBY2NlcHRzIGVpdGhlciBhIHN0cmluZyBJRCwgRE9NXFxuIG5vZGUsIG9yIHA1LkVsZW1lbnQuIElmIG5vIGFyZ3VtZW50cyBnaXZlbiwgcGFyZW50IG5vZGUgaXMgcmV0dXJuZWQuXFxuIEZvciBtb3JlIHdheXMgdG8gcG9zaXRpb24gdGhlIGNhbnZhcywgc2VlIHRoZVxcbiA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy9wNS5qcy93aWtpL1Bvc2l0aW9uaW5nLXlvdXItY2FudmFzJz5cXG4gcG9zaXRpb25pbmcgdGhlIGNhbnZhczwvYT4gd2lraSBwYWdlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBhcmVudFwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdiBjbGFzcz1cXFwibm9yZW5kZXIgbm90ZXN0XFxcIj48Y29kZT5cXG4gLy8gaW4gdGhlIGh0bWwgZmlsZTpcXG4gLy8gJmx0O2RpdiBpZD1cXFwibXlDb250YWluZXJcXFwiPiZsdDsvZGl2Plxcbi8vIGluIHRoZSBqcyBmaWxlOlxcbiB2YXIgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gY252LnBhcmVudCgnbXlDb250YWluZXInKTtcXG4gPC9jb2RlPjwvZGl2PlxcbiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuIHZhciBkaXYwID0gY3JlYXRlRGl2KCd0aGlzIGlzIHRoZSBwYXJlbnQnKTtcXG4gdmFyIGRpdjEgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIGNoaWxkJyk7XFxuIGRpdjEucGFyZW50KGRpdjApOyAvLyB1c2UgcDUuRWxlbWVudFxcbiA8L2NvZGU+PC9kaXY+XFxuIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4gdmFyIGRpdjAgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIHBhcmVudCcpO1xcbiBkaXYwLmlkKCdhcHBsZXMnKTtcXG4gdmFyIGRpdjEgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIGNoaWxkJyk7XFxuIGRpdjEucGFyZW50KCdhcHBsZXMnKTsgLy8gdXNlIGlkXFxuIDwvY29kZT48L2Rpdj5cXG4gPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz48Y29kZT5cXG4gdmFyIGVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteVBhcmVudERpdicpO1xcbiB2YXIgZGl2MSA9IGNyZWF0ZURpdigndGhpcyBpcyB0aGUgY2hpbGQnKTtcXG4gZGl2MS5wYXJlbnQoZWx0KTsgLy8gdXNlIGVsZW1lbnQgZnJvbSBwYWdlXFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gZGlzcGxheS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRPTVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA1MSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBhcmVudFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgSUQsIERPTSBub2RlLCBvciBwNS5FbGVtZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGRlc2lyZWQgcGFyZW50IGVsZW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfHA1LkVsZW1lbnR8T2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogOTQsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5FbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcDUuRWxlbWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXRzIHRoZSBJRCBvZiB0aGUgZWxlbWVudC4gSWYgbm8gSUQgYXJndW1lbnQgaXMgcGFzc2VkIGluLCBpdCBpbnN0ZWFkXFxuIHJldHVybnMgdGhlIGN1cnJlbnQgSUQgb2YgdGhlIGVsZW1lbnQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiaWRcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAgdmFyIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICAgLy8gQXNzaWducyBhIENTUyBzZWxlY3RvciBJRCB0b1xcbiAgIC8vIHRoZSBjYW52YXMgZWxlbWVudC5cXG4gICBjbnYuaWQoJ215Y2FudmFzJyk7XFxuIH1cXG4gPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBkaXNwbGF5LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRE9NXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRPTVwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDExNixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPklEIG9mIHRoZSBlbGVtZW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDEzOCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW10sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgaWQgb2YgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNTMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QWRkcyBnaXZlbiBjbGFzcyB0byB0aGUgZWxlbWVudC4gSWYgbm8gY2xhc3MgYXJndW1lbnQgaXMgcGFzc2VkIGluLCBpdFxcbiBpbnN0ZWFkIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VycmVudCBjbGFzcyhlcykgb2YgdGhlIGVsZW1lbnQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2xhc3NcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAgdmFyIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICAgLy8gQXNzaWducyBhIENTUyBzZWxlY3RvciBjbGFzcyAnc21hbGwnXFxuICAgLy8gdG8gdGhlIGNhbnZhcyBlbGVtZW50LlxcbiAgIGNudi5jbGFzcygnc21hbGwnKTtcXG4gfVxcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRE9NXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTUzLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2xhc3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y2xhc3MgdG8gYWRkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE3NSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW10sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgY2xhc3Mgb2YgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxODgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIC5tb3VzZVByZXNzZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBldmVyeSB0aW1lIGFcXG5tb3VzZSBidXR0b24gaXMgcHJlc3NlZCBvdmVyIHRoZSBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvXFxuYXR0YWNoIGVsZW1lbnQgc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXJzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1vdXNlUHJlc3NlZFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnhuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBmaXJlZCB3aGVuIG1vdXNlIGlzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzZWQgb3ZlciB0aGUgZWxlbWVudC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9ufEJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG52YXIgY252O1xcbnZhciBkO1xcbnZhciBnO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGNudi5tb3VzZVByZXNzZWQoY2hhbmdlR3JheSk7IC8vIGF0dGFjaCBsaXN0ZW5lciBmb3JcXG4gIC8vIGNhbnZhcyBjbGljayBvbmx5XFxuICBkID0gMTA7XFxuICBnID0gMTAwO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZChnKTtcXG4gIGVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCBkLCBkKTtcXG59XFxuXFxuLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyB3aXRoIGFueSBjbGljayBhbnl3aGVyZVxcbmZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcXG4gIGQgPSBkICsgMTA7XFxufVxcblxcbi8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgb25seSB3aGVuIGNudiBpcyBjbGlja2VkXFxuZnVuY3Rpb24gY2hhbmdlR3JheSgpIHtcXG4gIGcgPSByYW5kb20oMCwgMjU1KTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBkaXNwbGF5LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRE9NXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRPTVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMzgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIC5kb3VibGVDbGlja2VkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYWZ0ZXIgZXZlcnkgdGltZSBhXFxubW91c2UgYnV0dG9uIGlzIHByZXNzZWQgdHdpY2Ugb3ZlciB0aGUgZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0b1xcbmF0dGFjaCBlbGVtZW50IGFuZCBhY3Rpb24gc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXJzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRvdWJsZUNsaWNrZWRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZ4blwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiBtb3VzZSBpc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY2xpY2tlZCBvdmVyIHRoZSBlbGVtZW50LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcGFzc2VkIGluc3RlYWQsIHRoZSBwcmV2aW91c2x5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZyBmdW5jdGlvbiB3aWxsIG5vIGxvbmdlciBmaXJlLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb258Qm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG52YXIgY252O1xcbnZhciBkO1xcbnZhciBnO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGNudi5kb3VibGVDbGlja2VkKGNoYW5nZUdyYXkpOyAvLyBhdHRhY2ggbGlzdGVuZXIgZm9yXFxuICAvLyBjYW52YXMgZG91YmxlIGNsaWNrIG9ubHlcXG4gIGQgPSAxMDtcXG4gIGcgPSAxMDA7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKGcpO1xcbiAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGQsIGQpO1xcbn1cXG5cXG4vLyB0aGlzIGZ1bmN0aW9uIGZpcmVzIHdpdGggYW55IGRvdWJsZSBjbGljayBhbnl3aGVyZVxcbmZ1bmN0aW9uIGRvdWJsZUNsaWNrZWQoKSB7XFxuICBkID0gZCArIDEwO1xcbn1cXG5cXG4vLyB0aGlzIGZ1bmN0aW9uIGZpcmVzIG9ubHkgd2hlbiBjbnYgaXMgZG91YmxlIGNsaWNrZWRcXG5mdW5jdGlvbiBjaGFuZ2VHcmF5KCkge1xcbiAgZyA9IHJhbmRvbSgwLCAyNTUpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRE9NXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcDUuRWxlbWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI4NyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgLm1vdXNlV2hlZWwoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBldmVyeSB0aW1lIGFcXG5tb3VzZSB3aGVlbCBpcyBzY3JvbGxlZCBvdmVyIHRoZSBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvXFxuYXR0YWNoIGVsZW1lbnQgc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXJzLlxcbjxicj48YnI+XFxuVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBjYWxsYmFjayBmdW5jdGlvbiBhcyBhcmd1bWVudCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkXFxud2hlbiB0aGUgPGNvZGU+d2hlZWw8L2NvZGU+IGV2ZW50IGlzIHRyaWdnZXJlZCBvbiB0aGUgZWxlbWVudCwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzXFxucGFzc2VkIG9uZSBhcmd1bWVudCA8Y29kZT5ldmVudDwvY29kZT4uIFRoZSA8Y29kZT5ldmVudC5kZWx0YVk8L2NvZGU+IHByb3BlcnR5IHJldHVybnMgbmVnYXRpdmVcXG52YWx1ZXMgaWYgdGhlIG1vdXNlIHdoZWVsIGlzIHJvdGF0ZWQgdXAgb3IgYXdheSBmcm9tIHRoZSB1c2VyIGFuZCBwb3NpdGl2ZVxcbmluIHRoZSBvdGhlciBkaXJlY3Rpb24uIFRoZSA8Y29kZT5ldmVudC5kZWx0YVg8L2NvZGU+IGRvZXMgdGhlIHNhbWUgYXMgPGNvZGU+ZXZlbnQuZGVsdGFZPC9jb2RlPlxcbmV4Y2VwdCBpdCByZWFkcyB0aGUgaG9yaXpvbnRhbCB3aGVlbCBzY3JvbGwgb2YgdGhlIG1vdXNlIHdoZWVsLlxcbjxicj48YnI+XFxuT24gT1MgWCB3aXRoICZxdW90O25hdHVyYWwmcXVvdDsgc2Nyb2xsaW5nIGVuYWJsZWQsIHRoZSA8Y29kZT5ldmVudC5kZWx0YVk8L2NvZGU+IHZhbHVlcyBhcmVcXG5yZXZlcnNlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtb3VzZVdoZWVsXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmeG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gbW91c2UgaXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWQgb3ZlciB0aGUgZWxlbWVudC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9ufEJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG52YXIgY252O1xcbnZhciBkO1xcbnZhciBnO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGNudi5tb3VzZVdoZWVsKGNoYW5nZVNpemUpOyAvLyBhdHRhY2ggbGlzdGVuZXIgZm9yXFxuICAvLyBhY3Rpdml0eSBvbiBjYW52YXMgb25seVxcbiAgZCA9IDEwO1xcbiAgZyA9IDEwMDtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoZyk7XFxuICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZCwgZCk7XFxufVxcblxcbi8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgd2l0aCBtb3VzZXdoZWVsIG1vdmVtZW50XFxuLy8gYW55d2hlcmUgb24gc2NyZWVuXFxuZnVuY3Rpb24gbW91c2VXaGVlbCgpIHtcXG4gIGcgPSBnICsgMTA7XFxufVxcblxcbi8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgd2l0aCBtb3VzZXdoZWVsIG1vdmVtZW50XFxuLy8gb3ZlciBjYW52YXMgb25seVxcbmZ1bmN0aW9uIGNoYW5nZVNpemUoZXZlbnQpIHtcXG4gIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XFxuICAgIGQgPSBkICsgMTA7XFxuICB9IGVsc2Uge1xcbiAgICBkID0gZCAtIDEwO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRE9NXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcDUuRWxlbWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM1MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgLm1vdXNlUmVsZWFzZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBldmVyeSB0aW1lIGFcXG5tb3VzZSBidXR0b24gaXMgcmVsZWFzZWQgb3ZlciB0aGUgZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0b1xcbmF0dGFjaCBlbGVtZW50IHNwZWNpZmljIGV2ZW50IGxpc3RlbmVycy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtb3VzZVJlbGVhc2VkXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmeG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gbW91c2UgaXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZWQgb3ZlciB0aGUgZWxlbWVudC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9ufEJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG52YXIgY252O1xcbnZhciBkO1xcbnZhciBnO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGNudi5tb3VzZVJlbGVhc2VkKGNoYW5nZUdyYXkpOyAvLyBhdHRhY2ggbGlzdGVuZXIgZm9yXFxuICAvLyBhY3Rpdml0eSBvbiBjYW52YXMgb25seVxcbiAgZCA9IDEwO1xcbiAgZyA9IDEwMDtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoZyk7XFxuICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZCwgZCk7XFxufVxcblxcbi8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgYWZ0ZXIgdGhlIG1vdXNlIGhhcyBiZWVuXFxuLy8gcmVsZWFzZWRcXG5mdW5jdGlvbiBtb3VzZVJlbGVhc2VkKCkge1xcbiAgZCA9IGQgKyAxMDtcXG59XFxuXFxuLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyBhZnRlciB0aGUgbW91c2UgaGFzIGJlZW5cXG4vLyByZWxlYXNlZCB3aGlsZSBvbiBjYW52YXNcXG5mdW5jdGlvbiBjaGFuZ2VHcmF5KCkge1xcbiAgZyA9IHJhbmRvbSgwLCAyNTUpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRE9NXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcDUuRWxlbWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQwNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgLm1vdXNlQ2xpY2tlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGFmdGVyIGEgbW91c2UgYnV0dG9uIGlzXFxucHJlc3NlZCBhbmQgcmVsZWFzZWQgb3ZlciB0aGUgZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0b1xcbmF0dGFjaCBlbGVtZW50IHNwZWNpZmljIGV2ZW50IGxpc3RlbmVycy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtb3VzZUNsaWNrZWRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZ4blwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiBtb3VzZSBpc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja2VkIG92ZXIgdGhlIGVsZW1lbnQuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nIGZ1bmN0aW9uIHdpbGwgbm8gbG9uZ2VyIGZpcmUuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvbnxCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIGNudjtcXG52YXIgZDtcXG52YXIgZztcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBjbnYubW91c2VDbGlja2VkKGNoYW5nZUdyYXkpOyAvLyBhdHRhY2ggbGlzdGVuZXIgZm9yXFxuICAvLyBhY3Rpdml0eSBvbiBjYW52YXMgb25seVxcbiAgZCA9IDEwO1xcbiAgZyA9IDEwMDtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoZyk7XFxuICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZCwgZCk7XFxufVxcblxcbi8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgYWZ0ZXIgdGhlIG1vdXNlIGhhcyBiZWVuXFxuLy8gY2xpY2tlZCBhbnl3aGVyZVxcbmZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcXG4gIGQgPSBkICsgMTA7XFxufVxcblxcbi8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgYWZ0ZXIgdGhlIG1vdXNlIGhhcyBiZWVuXFxuLy8gY2xpY2tlZCBvbiBjYW52YXNcXG5mdW5jdGlvbiBjaGFuZ2VHcmF5KCkge1xcbiAgZyA9IHJhbmRvbSgwLCAyNTUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRE9NXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcDUuRWxlbWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ2MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgLm1vdXNlTW92ZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBldmVyeSB0aW1lIGFcXG5tb3VzZSBtb3ZlcyBvdmVyIHRoZSBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhblxcbmVsZW1lbnQgc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXIuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibW91c2VNb3ZlZFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnhuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBmaXJlZCB3aGVuIGEgbW91c2UgbW92ZXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlciB0aGUgZWxlbWVudC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9ufEJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG52YXIgY252O1xcbnZhciBkID0gMzA7XFxudmFyIGc7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgY252Lm1vdXNlTW92ZWQoY2hhbmdlU2l6ZSk7IC8vIGF0dGFjaCBsaXN0ZW5lciBmb3JcXG4gIC8vIGFjdGl2aXR5IG9uIGNhbnZhcyBvbmx5XFxuICBkID0gMTA7XFxuICBnID0gMTAwO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZChnKTtcXG4gIGZpbGwoMjAwKTtcXG4gIGVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCBkLCBkKTtcXG59XFxuXFxuLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyB3aGVuIG1vdXNlIG1vdmVzIGFueXdoZXJlIG9uXFxuLy8gcGFnZVxcbmZ1bmN0aW9uIG1vdXNlTW92ZWQoKSB7XFxuICBnID0gZyArIDU7XFxuICBpZiAoZyA+IDI1NSkge1xcbiAgICBnID0gMDtcXG4gIH1cXG59XFxuXFxuLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyB3aGVuIG1vdXNlIG1vdmVzIG92ZXIgY2FudmFzXFxuZnVuY3Rpb24gY2hhbmdlU2l6ZSgpIHtcXG4gIGQgPSBkICsgMjtcXG4gIGlmIChkID4gMTAwKSB7XFxuICAgIGQgPSAwO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRE9NXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcDUuRWxlbWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUxOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgLm1vdXNlT3ZlcigpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGFmdGVyIGV2ZXJ5IHRpbWUgYVxcbm1vdXNlIG1vdmVzIG9udG8gdGhlIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFuXFxuZWxlbWVudCBzcGVjaWZpYyBldmVudCBsaXN0ZW5lci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtb3VzZU92ZXJcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZ4blwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiBhIG1vdXNlIG1vdmVzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9udG8gdGhlIGVsZW1lbnQuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nIGZ1bmN0aW9uIHdpbGwgbm8gbG9uZ2VyIGZpcmUuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvbnxCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxudmFyIGNudjtcXG52YXIgZDtcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBjbnYubW91c2VPdmVyKGNoYW5nZUdyYXkpO1xcbiAgZCA9IDEwO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGQsIGQpO1xcbn1cXG5cXG5mdW5jdGlvbiBjaGFuZ2VHcmF5KCkge1xcbiAgZCA9IGQgKyAxMDtcXG4gIGlmIChkID4gMTAwKSB7XFxuICAgIGQgPSAwO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRE9NXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcDUuRWxlbWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU2MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgLmNoYW5nZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgYW5cXG5lbGVtZW50IGNoYW5nZXMuXFxuVGhpcyBjYW4gYmUgdXNlZCB0byBhdHRhY2ggYW4gZWxlbWVudCBzcGVjaWZpYyBldmVudCBsaXN0ZW5lci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjaGFuZ2VkXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmeG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gdGhlIHZhbHVlIG9mXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGVsZW1lbnQgY2hhbmdlcy5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9ufEJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHNlbDtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgc2VsID0gY3JlYXRlU2VsZWN0KCk7XFxuICBzZWwucG9zaXRpb24oMTAsIDEwKTtcXG4gIHNlbC5vcHRpb24oJ3BlYXInKTtcXG4gIHNlbC5vcHRpb24oJ2tpd2knKTtcXG4gIHNlbC5vcHRpb24oJ2dyYXBlJyk7XFxuICBzZWwuY2hhbmdlZChteVNlbGVjdEV2ZW50KTtcXG59XFxuXFxuZnVuY3Rpb24gbXlTZWxlY3RFdmVudCgpIHtcXG4gIHZhciBpdGVtID0gc2VsLnZhbHVlKCk7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICB0ZXh0KFxcXCJpdCdzIGEgXFxcIiArIGl0ZW0gKyAnIScsIDUwLCA1MCk7XFxufVxcbjwvY29kZT48L2Rpdj5cXG48ZGl2Pjxjb2RlPlxcbnZhciBjaGVja2JveDtcXG52YXIgY252O1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY2hlY2tib3ggPSBjcmVhdGVDaGVja2JveCgnIGZpbGwnKTtcXG4gIGNoZWNrYm94LmNoYW5nZWQoY2hhbmdlRmlsbCk7XFxuICBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgY252LnBvc2l0aW9uKDAsIDMwKTtcXG4gIG5vRmlsbCgpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgZWxsaXBzZSg1MCwgNTAsIDUwLCA1MCk7XFxufVxcblxcbmZ1bmN0aW9uIGNoYW5nZUZpbGwoKSB7XFxuICBpZiAoY2hlY2tib3guY2hlY2tlZCgpKSB7XFxuICAgIGZpbGwoMCk7XFxuICB9IGVsc2Uge1xcbiAgICBub0ZpbGwoKTtcXG4gIH1cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJkcm9wZG93bjogcGVhciwga2l3aSwgZ3JhcGUuIFdoZW4gc2VsZWN0ZWQgdGV4dCBcXFwiaXRzIGFcXFwiICsgc2VsZWN0aW9uIHNob3duLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRE9NXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRPTVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2MjksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIC5pbnB1dCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFueSB1c2VyIGlucHV0IGlzXFxuZGV0ZWN0ZWQgd2l0aCBhbiBlbGVtZW50LiBUaGUgaW5wdXQgZXZlbnQgaXMgb2Z0ZW4gdXNlZFxcbnRvIGRldGVjdCBrZXlzdHJva2VzIGluIGEgaW5wdXQgZWxlbWVudCwgb3IgY2hhbmdlcyBvbiBhXFxuc2xpZGVyIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFuIGVsZW1lbnQgc3BlY2lmaWNcXG5ldmVudCBsaXN0ZW5lci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJpbnB1dFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnhuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBmaXJlZCB3aGVuIGFueSB1c2VyIGlucHV0IGlzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGVkIHdpdGhpbiB0aGUgZWxlbWVudC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9ufEJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4vLyBPcGVuIHlvdXIgY29uc29sZSB0byBzZWUgdGhlIG91dHB1dFxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGlucCA9IGNyZWF0ZUlucHV0KCcnKTtcXG4gIGlucC5pbnB1dChteUlucHV0RXZlbnQpO1xcbn1cXG5cXG5mdW5jdGlvbiBteUlucHV0RXZlbnQoKSB7XFxuICBjb25zb2xlLmxvZygneW91IGFyZSB0eXBpbmc6ICcsIHRoaXMudmFsdWUoKSk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gZGlzcGxheS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRPTVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJET01cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9wNS5FbGVtZW50LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjY0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSAubW91c2VPdXQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBldmVyeSB0aW1lIGFcXG5tb3VzZSBtb3ZlcyBvZmYgdGhlIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFuXFxuZWxlbWVudCBzcGVjaWZpYyBldmVudCBsaXN0ZW5lci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtb3VzZU91dFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnhuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBmaXJlZCB3aGVuIGEgbW91c2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZXMgb2ZmIG9mIGFuIGVsZW1lbnQuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nIGZ1bmN0aW9uIHdpbGwgbm8gbG9uZ2VyIGZpcmUuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvbnxCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxudmFyIGNudjtcXG52YXIgZDtcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBjbnYubW91c2VPdXQoY2hhbmdlR3JheSk7XFxuICBkID0gMTA7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZCwgZCk7XFxufVxcblxcbmZ1bmN0aW9uIGNoYW5nZUdyYXkoKSB7XFxuICBkID0gZCArIDEwO1xcbiAgaWYgKGQgPiAxMDApIHtcXG4gICAgZCA9IDA7XFxuICB9XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gZGlzcGxheS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRPTVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJET01cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9wNS5FbGVtZW50LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzA2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSAudG91Y2hTdGFydGVkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYWZ0ZXIgZXZlcnkgdGltZSBhIHRvdWNoIGlzXFxucmVnaXN0ZXJlZC4gVGhpcyBjYW4gYmUgdXNlZCB0byBhdHRhY2ggZWxlbWVudCBzcGVjaWZpYyBldmVudCBsaXN0ZW5lcnMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidG91Y2hTdGFydGVkXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmeG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gYSB0b3VjaFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHMgb3ZlciB0aGUgZWxlbWVudC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9ufEJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG52YXIgY252O1xcbnZhciBkO1xcbnZhciBnO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGNudi50b3VjaFN0YXJ0ZWQoY2hhbmdlR3JheSk7IC8vIGF0dGFjaCBsaXN0ZW5lciBmb3JcXG4gIC8vIGNhbnZhcyBjbGljayBvbmx5XFxuICBkID0gMTA7XFxuICBnID0gMTAwO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZChnKTtcXG4gIGVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCBkLCBkKTtcXG59XFxuXFxuLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyB3aXRoIGFueSB0b3VjaCBhbnl3aGVyZVxcbmZ1bmN0aW9uIHRvdWNoU3RhcnRlZCgpIHtcXG4gIGQgPSBkICsgMTA7XFxufVxcblxcbi8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgb25seSB3aGVuIGNudiBpcyBjbGlja2VkXFxuZnVuY3Rpb24gY2hhbmdlR3JheSgpIHtcXG4gIGcgPSByYW5kb20oMCwgMjU1KTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBkaXNwbGF5LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRE9NXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRPTVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3NTUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIC50b3VjaE1vdmVkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYWZ0ZXIgZXZlcnkgdGltZSBhIHRvdWNoIG1vdmUgaXNcXG5yZWdpc3RlcmVkLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBlbGVtZW50IHNwZWNpZmljIGV2ZW50IGxpc3RlbmVycy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0b3VjaE1vdmVkXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmeG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gYSB0b3VjaCBtb3ZlcyBvdmVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbGVtZW50LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcGFzc2VkIGluc3RlYWQsIHRoZSBwcmV2aW91c2x5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZyBmdW5jdGlvbiB3aWxsIG5vIGxvbmdlciBmaXJlLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb258Qm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbnZhciBjbnY7XFxudmFyIGc7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgY252LnRvdWNoTW92ZWQoY2hhbmdlR3JheSk7IC8vIGF0dGFjaCBsaXN0ZW5lciBmb3JcXG4gIC8vIGNhbnZhcyBjbGljayBvbmx5XFxuICBnID0gMTAwO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZChnKTtcXG59XFxuXFxuLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyBvbmx5IHdoZW4gY252IGlzIGNsaWNrZWRcXG5mdW5jdGlvbiBjaGFuZ2VHcmF5KCkge1xcbiAgZyA9IHJhbmRvbSgwLCAyNTUpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJET01cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRE9NXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcDUuRWxlbWVudC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc5NixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgLnRvdWNoRW5kZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBldmVyeSB0aW1lIGEgdG91Y2ggaXNcXG5yZWdpc3RlcmVkLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBlbGVtZW50IHNwZWNpZmljIGV2ZW50IGxpc3RlbmVycy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0b3VjaEVuZGVkXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmeG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gYSB0b3VjaCBlbmRzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXIgdGhlIGVsZW1lbnQuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nIGZ1bmN0aW9uIHdpbGwgbm8gbG9uZ2VyIGZpcmUuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvbnxCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxudmFyIGNudjtcXG52YXIgZDtcXG52YXIgZztcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBjbnYudG91Y2hFbmRlZChjaGFuZ2VHcmF5KTsgLy8gYXR0YWNoIGxpc3RlbmVyIGZvclxcbiAgLy8gY2FudmFzIGNsaWNrIG9ubHlcXG4gIGQgPSAxMDtcXG4gIGcgPSAxMDA7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKGcpO1xcbiAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGQsIGQpO1xcbn1cXG5cXG4vLyB0aGlzIGZ1bmN0aW9uIGZpcmVzIHdpdGggYW55IHRvdWNoIGFueXdoZXJlXFxuZnVuY3Rpb24gdG91Y2hFbmRlZCgpIHtcXG4gIGQgPSBkICsgMTA7XFxufVxcblxcbi8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgb25seSB3aGVuIGNudiBpcyBjbGlja2VkXFxuZnVuY3Rpb24gY2hhbmdlR3JheSgpIHtcXG4gIGcgPSByYW5kb20oMCwgMjU1KTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBkaXNwbGF5LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRE9NXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRPTVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4NDYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIC5kcmFnT3ZlcigpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGFmdGVyIGV2ZXJ5IHRpbWUgYVxcbmZpbGUgaXMgZHJhZ2dlZCBvdmVyIHRoZSBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhblxcbmVsZW1lbnQgc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXIuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHJhZ092ZXJcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZ4blwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiBhIGZpbGUgaXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZCBvdmVyIHRoZSBlbGVtZW50LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcGFzc2VkIGluc3RlYWQsIHRoZSBwcmV2aW91c2x5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZyBmdW5jdGlvbiB3aWxsIG5vIGxvbmdlciBmaXJlLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb258Qm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG4vLyBUbyB0ZXN0IHRoaXMgc2tldGNoLCBzaW1wbHkgZHJhZyBhXFxuLy8gZmlsZSBvdmVyIHRoZSBjYW52YXNcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBjID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgdGV4dCgnRHJhZyBmaWxlJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG4gIGMuZHJhZ092ZXIoZHJhZ092ZXJDYWxsYmFjayk7XFxufVxcblxcbi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXJcXG4vLyBhIGZpbGUgaXMgZHJhZ2dlZCBvdmVyIHRoZSBjYW52YXNcXG5mdW5jdGlvbiBkcmFnT3ZlckNhbGxiYWNrKCkge1xcbiAgYmFja2dyb3VuZCgyNDApO1xcbiAgdGV4dCgnRHJhZ2dlZCBvdmVyJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJub3RoaW5nIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRE9NXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRPTVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4ODQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIC5kcmFnTGVhdmUoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBldmVyeSB0aW1lIGFcXG5kcmFnZ2VkIGZpbGUgbGVhdmVzIHRoZSBlbGVtZW50IGFyZWEuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFuXFxuZWxlbWVudCBzcGVjaWZpYyBldmVudCBsaXN0ZW5lci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkcmFnTGVhdmVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZ4blwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiBhIGZpbGUgaXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZCBvZmYgdGhlIGVsZW1lbnQuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nIGZ1bmN0aW9uIHdpbGwgbm8gbG9uZ2VyIGZpcmUuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvbnxCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbi8vIFRvIHRlc3QgdGhpcyBza2V0Y2gsIHNpbXBseSBkcmFnIGEgZmlsZVxcbi8vIG92ZXIgYW5kIHRoZW4gb3V0IG9mIHRoZSBjYW52YXMgYXJlYVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGMgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KCdEcmFnIGZpbGUnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbiAgYy5kcmFnTGVhdmUoZHJhZ0xlYXZlQ2FsbGJhY2spO1xcbn1cXG5cXG4vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyXFxuLy8gYSBmaWxlIGlzIGRyYWdnZWQgb3V0IG9mIHRoZSBjYW52YXNcXG5mdW5jdGlvbiBkcmFnTGVhdmVDYWxsYmFjaygpIHtcXG4gIGJhY2tncm91bmQoMjQwKTtcXG4gIHRleHQoJ0RyYWdnZWQgb2ZmJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJub3RoaW5nIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRE9NXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRPTVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5MjIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIC5kcm9wKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGZpbGUgZHJvcHBlZCBvbiB0aGUgZWxlbWVudC5cXG5JdCByZXF1aXJlcyBhIGNhbGxiYWNrIHRoYXQgaXMgcGFzc2VkIGEgcDUuRmlsZSBvYmplY3QuICBZb3UgY2FuXFxub3B0aW9uYWxseSBwYXNzIHR3byBjYWxsYmFja3MsIHRoZSBmaXJzdCBvbmUgKHJlcXVpcmVkKSBpcyB0cmlnZ2VyZWRcXG5mb3IgZWFjaCBmaWxlIGRyb3BwZWQgd2hlbiB0aGUgZmlsZSBpcyBsb2FkZWQuICBUaGUgc2Vjb25kIChvcHRpb25hbClcXG5pcyB0cmlnZ2VyZWQganVzdCBvbmNlIHdoZW4gYSBmaWxlIChvciBmaWxlcykgYXJlIGRyb3BwZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHJvcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNhbGxiYWNrIHRyaWdnZXJlZCB3aGVuIGZpbGVzIGFyZSBkcm9wcGVkLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmeG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNhbGxiYWNrIHRvIHJlY2VpdmUgbG9hZGVkIGZpbGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGMgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KCdkcm9wIGltYWdlJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG4gIGMuZHJvcChnb3RGaWxlKTtcXG59XFxuXFxuZnVuY3Rpb24gZ290RmlsZShmaWxlKSB7XFxuICB2YXIgaW1nID0gY3JlYXRlSW1nKGZpbGUuZGF0YSkuaGlkZSgpO1xcbiAgLy8gRHJhdyB0aGUgaW1hZ2Ugb250byB0aGUgY2FudmFzXFxuICBpbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIkNhbnZhcyB0dXJucyBpbnRvIHdoYXRldmVyIGltYWdlIGlzIGRyYWdnZWQvZHJvcHBlZCBvbnRvIGl0LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRE9NXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRPTVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3A1LkVsZW1lbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDU3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkhlbHBlciBmeG4gZm9yIHNoYXJpbmcgcGl4ZWwgbWV0aG9kczwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRPTVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJET01cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9wNS5HcmFwaGljcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDY1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlbW92ZXMgYSBHcmFwaGljcyBvYmplY3QgZnJvbSB0aGUgcGFnZSBhbmQgZnJlZXMgYW55IHJlc291cmNlc1xcbmFzc29jaWF0ZWQgd2l0aCBpdC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxudmFyIGJnO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmcgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgYmcuYmFja2dyb3VuZCgwKTtcXG4gIGltYWdlKGJnLCAwLCAwKTtcXG4gIGJnLnJlbW92ZSgpO1xcbn1cXG48L2NvZGU+PC9kaXY+XFxuXFxuPGRpdj48Y29kZT5cXG52YXIgYmc7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBwaXhlbERlbnNpdHkoMSk7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgc3Ryb2tlKDI1NSk7XFxuICBmaWxsKDApO1xcblxcbiAgLy8gY3JlYXRlIGFuZCBkcmF3IHRoZSBiYWNrZ3JvdW5kIGltYWdlXFxuICBiZyA9IGNyZWF0ZUdyYXBoaWNzKDEwMCwgMTAwKTtcXG4gIGJnLmJhY2tncm91bmQoMjAwKTtcXG4gIGJnLmVsbGlwc2UoNTAsIDUwLCA4MCwgODApO1xcbn1cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgdmFyIHQgPSBtaWxsaXMoKSAvIDEwMDA7XFxuICAvLyBkcmF3IHRoZSBiYWNrZ3JvdW5kXFxuICBpZiAoYmcpIHtcXG4gICAgaW1hZ2UoYmcsIGZyYW1lQ291bnQgJSAxMDAsIDApO1xcbiAgICBpbWFnZShiZywgZnJhbWVDb3VudCAlIDEwMCAtIDEwMCwgMCk7XFxuICB9XFxuICAvLyBkcmF3IHRoZSBmb3JlZ3JvdW5kXFxuICB2YXIgcCA9IHA1LlZlY3Rvci5mcm9tQW5nbGUodCwgMzUpLmFkZCg1MCwgNTApO1xcbiAgZWxsaXBzZShwLngsIHAueSwgMzApO1xcbn1cXG5mdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XFxuICAvLyByZW1vdmUgdGhlIGJhY2tncm91bmRcXG4gIGlmIChiZykge1xcbiAgICBiZy5yZW1vdmUoKTtcXG4gICAgYmcgPSBudWxsO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlXFxuYSBtdWx0aS1jb2xvcmVkIGNpcmNsZSBtb3ZpbmcgYmFjayBhbmQgZm9ydGggb3ZlciBhIHNjcm9sbGluZyBiYWNrZ3JvdW5kLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkdyYXBoaWNzXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlJlbmRlcmluZ1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9wNS5SZW5kZXJlci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXNpemUgb3VyIGNhbnZhcyBlbGVtZW50LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5SZW5kZXJlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiUmVuZGVyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcDUuUmVuZGVyZXIuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxODIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SGVscGVyIGZ4biB0byBjaGVjayBmb250IHR5cGUgKHN5c3RlbSBvciBvdGYpPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlJlbmRlcmVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlJlbmRlcmluZ1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9wNS5SZW5kZXJlci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIzNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5IZWxwZXIgZnhuIHRvIG1lYXN1cmUgYXNjZW50IGFuZCBkZXNjZW50LlxcbkFkYXB0ZWQgZnJvbSA8YSBocmVmPVxcXCJodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNTM1NTE3OFxcXCI+aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjUzNTUxNzg8L2E+PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlJlbmRlcmVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlJlbmRlcmluZ1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9wNS5SZW5kZXJlcjJELmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cDUuUmVuZGVyZXIyRFxcblRoZSAyRCBncmFwaGljcyBjYW52YXMgcmVuZGVyZXIgY2xhc3MuXFxuZXh0ZW5kcyBwNS5SZW5kZXJlcjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9wNS5SZW5kZXJlcjJELmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzk1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdlbmVyYXRlIGEgY3ViaWMgQmV6aWVyIHJlcHJlc2VudGluZyBhbiBhcmMgb24gdGhlIHVuaXQgY2lyY2xlIG9mIHRvdGFsXFxuYW5nbGUgPGNvZGU+c2l6ZTwvY29kZT4gcmFkaWFucywgYmVnaW5uaW5nIDxjb2RlPnN0YXJ0PC9jb2RlPiByYWRpYW5zIGFib3ZlIHRoZSB4LWF4aXMuIFVwIHRvXFxuZm91ciBvZiB0aGVzZSBjdXJ2ZXMgYXJlIGNvbWJpbmVkIHRvIG1ha2UgYSBmdWxsIGFyYy48L3A+XFxuPHA+U2VlIHd3dy5qb2VjcmlkZ2UubWUvYmV6aWVyLnBkZiBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIG1ldGhvZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiUmVuZGVyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcmVuZGVyaW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhIGNhbnZhcyBlbGVtZW50IGluIHRoZSBkb2N1bWVudCwgYW5kIHNldHMgdGhlIGRpbWVuc2lvbnMgb2YgaXRcXG5pbiBwaXhlbHMuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZSBzdGFydCBvZiBzZXR1cC5cXG5DYWxsaW5nIGNyZWF0ZUNhbnZhcyBtb3JlIHRoYW4gb25jZSBpbiBhIHNrZXRjaCB3aWxsIHJlc3VsdCBpbiB2ZXJ5XFxudW5wcmVkaWN0YWJsZSBiZWhhdmlvci4gSWYgeW91IHdhbnQgbW9yZSB0aGFuIG9uZSBkcmF3aW5nIGNhbnZhc1xcbnlvdSBjb3VsZCB1c2UgY3JlYXRlR3JhcGhpY3MgKGhpZGRlbiBieSBkZWZhdWx0IGJ1dCBpdCBjYW4gYmUgc2hvd24pLlxcbjxicj48YnI+XFxuVGhlIHN5c3RlbSB2YXJpYWJsZXMgd2lkdGggYW5kIGhlaWdodCBhcmUgc2V0IGJ5IHRoZSBwYXJhbWV0ZXJzIHBhc3NlZFxcbnRvIHRoaXMgZnVuY3Rpb24uIElmIGNyZWF0ZUNhbnZhcygpIGlzIG5vdCB1c2VkLCB0aGUgd2luZG93IHdpbGwgYmVcXG5naXZlbiBhIGRlZmF1bHQgc2l6ZSBvZiAxMDB4MTAwIHBpeGVscy5cXG48YnI+PGJyPlxcbkZvciBtb3JlIHdheXMgdG8gcG9zaXRpb24gdGhlIGNhbnZhcywgc2VlIHRoZVxcbjxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzL3dpa2kvUG9zaXRpb25pbmcteW91ci1jYW52YXMnPlxcbnBvc2l0aW9uaW5nIHRoZSBjYW52YXM8L2E+IHdpa2kgcGFnZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVDYW52YXNcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIndcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPndpZHRoIG9mIHRoZSBjYW52YXM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmhlaWdodCBvZiB0aGUgY2FudmFzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyZW5kZXJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZWl0aGVyIFAyRCBvciBXRUJHTDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29uc3RhbnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuUmVuZGVyZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgNTApO1xcbiAgYmFja2dyb3VuZCgxNTMpO1xcbiAgbGluZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJCbGFjayBsaW5lIGV4dGVuZGluZyBmcm9tIHRvcC1sZWZ0IG9mIGNhbnZhcyB0byBib3R0b20gcmlnaHQuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiUmVuZGVyaW5nXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlJlbmRlcmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3JlbmRlcmluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXNpemVzIHRoZSBjYW52YXMgdG8gZ2l2ZW4gd2lkdGggYW5kIGhlaWdodC4gVGhlIGNhbnZhcyB3aWxsIGJlIGNsZWFyZWRcXG5hbmQgZHJhdyB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSwgYWxsb3dpbmcgdGhlIHNrZXRjaCB0byByZS1yZW5kZXIgaXRzZWxmXFxuaW4gdGhlIHJlc2l6ZWQgY2FudmFzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlc2l6ZUNhbnZhc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+d2lkdGggb2YgdGhlIGNhbnZhczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aGVpZ2h0IG9mIHRoZSBjYW52YXM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vUmVkcmF3XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5kb24mIzM5O3QgcmVkcmF3IHRoZSBjYW52YXMgaW1tZWRpYXRlbHk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMod2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDAsIDEwMCwgMjAwKTtcXG59XFxuXFxuZnVuY3Rpb24gd2luZG93UmVzaXplZCgpIHtcXG4gIHJlc2l6ZUNhbnZhcyh3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0KTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJObyBpbWFnZSBkaXNwbGF5ZWQuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiUmVuZGVyaW5nXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlJlbmRlcmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3JlbmRlcmluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE3MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZW1vdmVzIHRoZSBkZWZhdWx0IGNhbnZhcyBmb3IgYSBwNSBza2V0Y2ggdGhhdCBkb2VzbiYjMzk7dFxcbnJlcXVpcmUgYSBjYW52YXM8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJub0NhbnZhc1wiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBub0NhbnZhcygpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlJlbmRlcmluZ1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9yZW5kZXJpbmcuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxOTUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBwNS5SZW5kZXJlciBvYmplY3QuIFVzZSB0aGlzIGNsYXNzIGlmIHlvdSBuZWVkXFxudG8gZHJhdyBpbnRvIGFuIG9mZi1zY3JlZW4gZ3JhcGhpY3MgYnVmZmVyLiBUaGUgdHdvIHBhcmFtZXRlcnMgZGVmaW5lIHRoZVxcbndpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNyZWF0ZUdyYXBoaWNzXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ3XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD53aWR0aCBvZiB0aGUgb2Zmc2NyZWVuIGdyYXBoaWNzIGJ1ZmZlcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aGVpZ2h0IG9mIHRoZSBvZmZzY3JlZW4gZ3JhcGhpY3MgYnVmZmVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyZW5kZXJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZWl0aGVyIFAyRCBvciBXRUJHTFxcbnVuZGVmaW5lZCBkZWZhdWx0cyB0byBwMmQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkNvbnN0YW50XCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9mZnNjcmVlbiBncmFwaGljcyBidWZmZXJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5HcmFwaGljc1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIHBnO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIHBnID0gY3JlYXRlR3JhcGhpY3MoMTAwLCAxMDApO1xcbn1cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgcGcuYmFja2dyb3VuZCgxMDApO1xcbiAgcGcubm9TdHJva2UoKTtcXG4gIHBnLmVsbGlwc2UocGcud2lkdGggLyAyLCBwZy5oZWlnaHQgLyAyLCA1MCwgNTApO1xcbiAgaW1hZ2UocGcsIDUwLCA1MCk7XFxuICBpbWFnZShwZywgMCwgMCwgNTAsIDUwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCI0IGdyZXkgc3F1YXJlcyBhbHRlcm5hdGluZyBsaWdodCBhbmQgZGFyayBncmV5LiBXaGl0ZSBxdWFydGVyIGNpcmNsZSBtaWQtbGVmdC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiUmVuZGVyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvcmVuZGVyaW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjM0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkJsZW5kcyB0aGUgcGl4ZWxzIGluIHRoZSBkaXNwbGF5IHdpbmRvdyBhY2NvcmRpbmcgdG8gdGhlIGRlZmluZWQgbW9kZS5cXG5UaGVyZSBpcyBhIGNob2ljZSBvZiB0aGUgZm9sbG93aW5nIG1vZGVzIHRvIGJsZW5kIHRoZSBzb3VyY2UgcGl4ZWxzIChBKVxcbndpdGggdGhlIG9uZXMgb2YgcGl4ZWxzIGFscmVhZHkgaW4gdGhlIGRpc3BsYXkgd2luZG93IChCKTo8L3A+XFxuPHVsPlxcbjxsaT48Y29kZT5CTEVORDwvY29kZT4gLSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBvZiBjb2xvdXJzOiBDID1cXG5BKmZhY3RvciArIEIuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmxlbmRpbmcgbW9kZS48L2xpPlxcbjxsaT48Y29kZT5BREQ8L2NvZGU+IC0gc3VtIG9mIEEgYW5kIEI8L2xpPlxcbjxsaT48Y29kZT5EQVJLRVNUPC9jb2RlPiAtIG9ubHkgdGhlIGRhcmtlc3QgY29sb3VyIHN1Y2NlZWRzOiBDID1cXG5taW4oQSpmYWN0b3IsIEIpLjwvbGk+XFxuPGxpPjxjb2RlPkxJR0hURVNUPC9jb2RlPiAtIG9ubHkgdGhlIGxpZ2h0ZXN0IGNvbG91ciBzdWNjZWVkczogQyA9XFxubWF4KEEqZmFjdG9yLCBCKS48L2xpPlxcbjxsaT48Y29kZT5ESUZGRVJFTkNFPC9jb2RlPiAtIHN1YnRyYWN0IGNvbG9ycyBmcm9tIHVuZGVybHlpbmcgaW1hZ2UuPC9saT5cXG48bGk+PGNvZGU+RVhDTFVTSU9OPC9jb2RlPiAtIHNpbWlsYXIgdG8gPGNvZGU+RElGRkVSRU5DRTwvY29kZT4sIGJ1dCBsZXNzXFxuZXh0cmVtZS48L2xpPlxcbjxsaT48Y29kZT5NVUxUSVBMWTwvY29kZT4gLSBtdWx0aXBseSB0aGUgY29sb3JzLCByZXN1bHQgd2lsbCBhbHdheXMgYmVcXG5kYXJrZXIuPC9saT5cXG48bGk+PGNvZGU+U0NSRUVOPC9jb2RlPiAtIG9wcG9zaXRlIG11bHRpcGx5LCB1c2VzIGludmVyc2UgdmFsdWVzIG9mIHRoZVxcbmNvbG9ycy48L2xpPlxcbjxsaT48Y29kZT5SRVBMQUNFPC9jb2RlPiAtIHRoZSBwaXhlbHMgZW50aXJlbHkgcmVwbGFjZSB0aGUgb3RoZXJzIGFuZFxcbmRvbiYjMzk7dCB1dGlsaXplIGFscGhhICh0cmFuc3BhcmVuY3kpIHZhbHVlcy48L2xpPlxcbjxsaT48Y29kZT5PVkVSTEFZPC9jb2RlPiAtIG1peCBvZiA8Y29kZT5NVUxUSVBMWTwvY29kZT4gYW5kIDxjb2RlPlNDUkVFTlxcbjwvY29kZT4uIE11bHRpcGxpZXMgZGFyayB2YWx1ZXMsIGFuZCBzY3JlZW5zIGxpZ2h0IHZhbHVlcy48L2xpPlxcbjxsaT48Y29kZT5IQVJEX0xJR0hUPC9jb2RlPiAtIDxjb2RlPlNDUkVFTjwvY29kZT4gd2hlbiBncmVhdGVyIHRoYW4gNTAlXFxuZ3JheSwgPGNvZGU+TVVMVElQTFk8L2NvZGU+IHdoZW4gbG93ZXIuPC9saT5cXG48bGk+PGNvZGU+U09GVF9MSUdIVDwvY29kZT4gLSBtaXggb2YgPGNvZGU+REFSS0VTVDwvY29kZT4gYW5kXFxuPGNvZGU+TElHSFRFU1Q8L2NvZGU+LiBXb3JrcyBsaWtlIDxjb2RlPk9WRVJMQVk8L2NvZGU+LCBidXQgbm90IGFzIGhhcnNoLlxcbjwvbGk+XFxuPGxpPjxjb2RlPkRPREdFPC9jb2RlPiAtIGxpZ2h0ZW5zIGxpZ2h0IHRvbmVzIGFuZCBpbmNyZWFzZXMgY29udHJhc3QsXFxuaWdub3JlcyBkYXJrcy48L2xpPlxcbjxsaT48Y29kZT5CVVJOPC9jb2RlPiAtIGRhcmtlciBhcmVhcyBhcmUgYXBwbGllZCwgaW5jcmVhc2luZyBjb250cmFzdCxcXG5pZ25vcmVzIGxpZ2h0cy48L2xpPlxcbjwvdWw+XCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJibGVuZE1vZGVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm1vZGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmJsZW5kIG1vZGUgdG8gc2V0IGZvciBjYW52YXMuXFxuICAgICAgICAgICAgICAgZWl0aGVyIEJMRU5ELCBEQVJLRVNULCBMSUdIVEVTVCwgRElGRkVSRU5DRSwgTVVMVElQTFksXFxuICAgICAgICAgICAgICAgRVhDTFVTSU9OLCBTQ1JFRU4sIFJFUExBQ0UsIE9WRVJMQVksIEhBUkRfTElHSFQsXFxuICAgICAgICAgICAgICAgU09GVF9MSUdIVCwgRE9ER0UsIEJVUk4sIEFERCBvciBOT1JNQUw8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkNvbnN0YW50XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuYmxlbmRNb2RlKExJR0hURVNUKTtcXG5zdHJva2VXZWlnaHQoMzApO1xcbnN0cm9rZSg4MCwgMTUwLCAyNTUpO1xcbmxpbmUoMjUsIDI1LCA3NSwgNzUpO1xcbnN0cm9rZSgyNTUsIDUwLCA1MCk7XFxubGluZSg3NSwgMjUsIDI1LCA3NSk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXY+XFxuPGNvZGU+XFxuYmxlbmRNb2RlKE1VTFRJUExZKTtcXG5zdHJva2VXZWlnaHQoMzApO1xcbnN0cm9rZSg4MCwgMTUwLCAyNTUpO1xcbmxpbmUoMjUsIDI1LCA3NSwgNzUpO1xcbnN0cm9rZSgyNTUsIDUwLCA1MCk7XFxubGluZSg3NSwgMjUsIDI1LCA3NSk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ0cmFuc2x1Y2VudCBpbWFnZSB0aGljayByZWQgJiBibHVlIGRpYWdvbmFsIHJvdW5kZWQgbGluZXMgaW50ZXJzZWN0aW5nIGNlbnRlclxcblRoaWNrIHJlZCAmIGJsdWUgZGlhZ29uYWwgcm91bmRlZCBsaW5lcyBpbnRlcnNlY3RpbmcgY2VudGVyLiBkYXJrIGF0IG92ZXJsYXBcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJSZW5kZXJpbmdcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiUmVuZGVyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvc2hpbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDcwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNoaW0gZm9yIFVpbnQ4Q2xhbXBlZEFycmF5LnNsaWNlXFxuKGFsbG93cyBhcnJheUNvcHkgdG8gd29yayB3aXRoIHBpeGVsc1tdKVxcbndpdGggdGhhbmtzIHRvIDxhIGhyZWY9XFxcImh0dHA6Ly9oYWxmcGFwc3R1ZGlvcy5jb20vYmxvZy90YWcvaHRtbDUtY2FudmFzL1xcXCI+aHR0cDovL2hhbGZwYXBzdHVkaW9zLmNvbS9ibG9nL3RhZy9odG1sNS1jYW52YXMvPC9hPlxcbkVudW1lcmFibGUgc2V0IHRvIGZhbHNlIHRvIHByb3RlY3QgZm9yLi4uaW4gZnJvbVxcblVpbnQ4Q2xhbXBlZEFycmF5LnByb3RvdHlwZSBwb2xsdXRpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlJlbmRlcmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3N0cnVjdHVyZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0b3BzIHA1LmpzIGZyb20gY29udGludW91c2x5IGV4ZWN1dGluZyB0aGUgY29kZSB3aXRoaW4gZHJhdygpLlxcbklmIGxvb3AoKSBpcyBjYWxsZWQsIHRoZSBjb2RlIGluIGRyYXcoKSBiZWdpbnMgdG8gcnVuIGNvbnRpbnVvdXNseSBhZ2Fpbi5cXG5JZiB1c2luZyBub0xvb3AoKSBpbiBzZXR1cCgpLCBpdCBzaG91bGQgYmUgdGhlIGxhc3QgbGluZSBpbnNpZGUgdGhlIGJsb2NrLlxcbjxicj48YnI+XFxuV2hlbiBub0xvb3AoKSBpcyB1c2VkLCBpdCYjMzk7cyBub3QgcG9zc2libGUgdG8gbWFuaXB1bGF0ZSBvciBhY2Nlc3MgdGhlXFxuc2NyZWVuIGluc2lkZSBldmVudCBoYW5kbGluZyBmdW5jdGlvbnMgc3VjaCBhcyBtb3VzZVByZXNzZWQoKSBvclxcbmtleVByZXNzZWQoKS4gSW5zdGVhZCwgdXNlIHRob3NlIGZ1bmN0aW9ucyB0byBjYWxsIHJlZHJhdygpIG9yIGxvb3AoKSxcXG53aGljaCB3aWxsIHJ1biBkcmF3KCksIHdoaWNoIGNhbiB1cGRhdGUgdGhlIHNjcmVlbiBwcm9wZXJseS4gVGhpcyBtZWFuc1xcbnRoYXQgd2hlbiBub0xvb3AoKSBoYXMgYmVlbiBjYWxsZWQsIG5vIGRyYXdpbmcgY2FuIGhhcHBlbiwgYW5kIGZ1bmN0aW9uc1xcbmxpa2Ugc2F2ZUZyYW1lKCkgb3IgbG9hZFBpeGVscygpIG1heSBub3QgYmUgdXNlZC5cXG48YnI+PGJyPlxcbk5vdGUgdGhhdCBpZiB0aGUgc2tldGNoIGlzIHJlc2l6ZWQsIHJlZHJhdygpIHdpbGwgYmUgY2FsbGVkIHRvIHVwZGF0ZVxcbnRoZSBza2V0Y2gsIGV2ZW4gYWZ0ZXIgbm9Mb29wKCkgaGFzIGJlZW4gc3BlY2lmaWVkLiBPdGhlcndpc2UsIHRoZSBza2V0Y2hcXG53b3VsZCBlbnRlciBhbiBvZGQgc3RhdGUgdW50aWwgbG9vcCgpIHdhcyBjYWxsZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibm9Mb29wXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICBub0xvb3AoKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGxpbmUoMTAsIDEwLCA5MCwgOTApO1xcbn1cXG48L2NvZGU+PC9kaXY+XFxuXFxuPGRpdj48Y29kZT5cXG52YXIgeCA9IDA7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDQpO1xcbiAgeCA9IHggKyAwLjE7XFxuICBpZiAoeCA+IHdpZHRoKSB7XFxuICAgIHggPSAwO1xcbiAgfVxcbiAgbGluZSh4LCAwLCB4LCBoZWlnaHQpO1xcbn1cXG5cXG5mdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XFxuICBub0xvb3AoKTtcXG59XFxuXFxuZnVuY3Rpb24gbW91c2VSZWxlYXNlZCgpIHtcXG4gIGxvb3AoKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCIxMTMgcGl4ZWwgbG9uZyBsaW5lIGV4dGVuZGluZyBmcm9tIHRvcC1sZWZ0IHRvIGJvdHRvbSByaWdodCBvZiBjYW52YXMuXFxuaG9yaXpvbnRhbCBsaW5lIG1vdmVzIHNsb3dseSBmcm9tIGxlZnQuIExvb3BzIGJ1dCBzdG9wcyBvbiBtb3VzZSBwcmVzcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RydWN0dXJlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvc3RydWN0dXJlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QnkgZGVmYXVsdCwgcDUuanMgbG9vcHMgdGhyb3VnaCBkcmF3KCkgY29udGludW91c2x5LCBleGVjdXRpbmcgdGhlIGNvZGVcXG53aXRoaW4gaXQuIEhvd2V2ZXIsIHRoZSBkcmF3KCkgbG9vcCBtYXkgYmUgc3RvcHBlZCBieSBjYWxsaW5nIG5vTG9vcCgpLlxcbkluIHRoYXQgY2FzZSwgdGhlIGRyYXcoKSBsb29wIGNhbiBiZSByZXN1bWVkIHdpdGggbG9vcCgpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxvb3BcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciB4ID0gMDtcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBub0xvb3AoKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjA0KTtcXG4gIHggPSB4ICsgMC4xO1xcbiAgaWYgKHggPiB3aWR0aCkge1xcbiAgICB4ID0gMDtcXG4gIH1cXG4gIGxpbmUoeCwgMCwgeCwgaGVpZ2h0KTtcXG59XFxuXFxuZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xcbiAgbG9vcCgpO1xcbn1cXG5cXG5mdW5jdGlvbiBtb3VzZVJlbGVhc2VkKCkge1xcbiAgbm9Mb29wKCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiaG9yaXpvbnRhbCBsaW5lIG1vdmVzIHNsb3dseSBmcm9tIGxlZnQuIExvb3BzIGJ1dCBzdG9wcyBvbiBtb3VzZSBwcmVzcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RydWN0dXJlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvc3RydWN0dXJlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTMyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBwdXNoKCkgZnVuY3Rpb24gc2F2ZXMgdGhlIGN1cnJlbnQgZHJhd2luZyBzdHlsZSBzZXR0aW5ncyBhbmRcXG50cmFuc2Zvcm1hdGlvbnMsIHdoaWxlIHBvcCgpIHJlc3RvcmVzIHRoZXNlIHNldHRpbmdzLiBOb3RlIHRoYXQgdGhlc2VcXG5mdW5jdGlvbnMgYXJlIGFsd2F5cyB1c2VkIHRvZ2V0aGVyLiBUaGV5IGFsbG93IHlvdSB0byBjaGFuZ2UgdGhlIHN0eWxlXFxuYW5kIHRyYW5zZm9ybWF0aW9uIHNldHRpbmdzIGFuZCBsYXRlciByZXR1cm4gdG8gd2hhdCB5b3UgaGFkLiBXaGVuIGEgbmV3XFxuc3RhdGUgaXMgc3RhcnRlZCB3aXRoIHB1c2goKSwgaXQgYnVpbGRzIG9uIHRoZSBjdXJyZW50IHN0eWxlIGFuZCB0cmFuc2Zvcm1cXG5pbmZvcm1hdGlvbi4gVGhlIHB1c2goKSBhbmQgcG9wKCkgZnVuY3Rpb25zIGNhbiBiZSBlbWJlZGRlZCB0byBwcm92aWRlXFxubW9yZSBjb250cm9sLiAoU2VlIHRoZSBzZWNvbmQgZXhhbXBsZSBmb3IgYSBkZW1vbnN0cmF0aW9uLilcXG48YnI+PGJyPlxcbnB1c2goKSBzdG9yZXMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiBzdGF0ZVxcbmFuZCBzdHlsZSBzZXR0aW5ncyBjb250cm9sbGVkIGJ5IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOiBmaWxsKCksXFxuc3Ryb2tlKCksIHRpbnQoKSwgc3Ryb2tlV2VpZ2h0KCksIHN0cm9rZUNhcCgpLCBzdHJva2VKb2luKCksXFxuaW1hZ2VNb2RlKCksIHJlY3RNb2RlKCksIGVsbGlwc2VNb2RlKCksIGNvbG9yTW9kZSgpLCB0ZXh0QWxpZ24oKSxcXG50ZXh0Rm9udCgpLCB0ZXh0TW9kZSgpLCB0ZXh0U2l6ZSgpLCB0ZXh0TGVhZGluZygpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInB1c2hcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmVsbGlwc2UoMCwgNTAsIDMzLCAzMyk7IC8vIExlZnQgY2lyY2xlXFxuXFxucHVzaCgpOyAvLyBTdGFydCBhIG5ldyBkcmF3aW5nIHN0YXRlXFxuc3Ryb2tlV2VpZ2h0KDEwKTtcXG5maWxsKDIwNCwgMTUzLCAwKTtcXG50cmFuc2xhdGUoNTAsIDApO1xcbmVsbGlwc2UoMCwgNTAsIDMzLCAzMyk7IC8vIE1pZGRsZSBjaXJjbGVcXG5wb3AoKTsgLy8gUmVzdG9yZSBvcmlnaW5hbCBzdGF0ZVxcblxcbmVsbGlwc2UoMTAwLCA1MCwgMzMsIDMzKTsgLy8gUmlnaHQgY2lyY2xlXFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXY+XFxuPGNvZGU+XFxuZWxsaXBzZSgwLCA1MCwgMzMsIDMzKTsgLy8gTGVmdCBjaXJjbGVcXG5cXG5wdXNoKCk7IC8vIFN0YXJ0IGEgbmV3IGRyYXdpbmcgc3RhdGVcXG5zdHJva2VXZWlnaHQoMTApO1xcbmZpbGwoMjA0LCAxNTMsIDApO1xcbmVsbGlwc2UoMzMsIDUwLCAzMywgMzMpOyAvLyBMZWZ0LW1pZGRsZSBjaXJjbGVcXG5cXG5wdXNoKCk7IC8vIFN0YXJ0IGFub3RoZXIgbmV3IGRyYXdpbmcgc3RhdGVcXG5zdHJva2UoMCwgMTAyLCAxNTMpO1xcbmVsbGlwc2UoNjYsIDUwLCAzMywgMzMpOyAvLyBSaWdodC1taWRkbGUgY2lyY2xlXFxucG9wKCk7IC8vIFJlc3RvcmUgcHJldmlvdXMgc3RhdGVcXG5cXG5wb3AoKTsgLy8gUmVzdG9yZSBvcmlnaW5hbCBzdGF0ZVxcblxcbmVsbGlwc2UoMTAwLCA1MCwgMzMsIDMzKTsgLy8gUmlnaHQgY2lyY2xlXFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJHb2xkIGVsbGlwc2UgKyB0aGljayBibGFjayBvdXRsaW5lIEBjZW50ZXIgMiB3aGl0ZSBlbGxpcHNlcyBvbiBsZWZ0IGFuZCByaWdodC5cXG4yIEdvbGQgZWxsaXBzZXMgbGVmdCBibGFjayByaWdodCBibHVlIHN0cm9rZS4gMiB3aGl0ZSBlbGxpcHNlcyBvbiBsZWZ0K3JpZ2h0LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJTdHJ1Y3R1cmVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS9zdHJ1Y3R1cmUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxOTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHB1c2goKSBmdW5jdGlvbiBzYXZlcyB0aGUgY3VycmVudCBkcmF3aW5nIHN0eWxlIHNldHRpbmdzIGFuZFxcbnRyYW5zZm9ybWF0aW9ucywgd2hpbGUgcG9wKCkgcmVzdG9yZXMgdGhlc2Ugc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGVzZVxcbmZ1bmN0aW9ucyBhcmUgYWx3YXlzIHVzZWQgdG9nZXRoZXIuIFRoZXkgYWxsb3cgeW91IHRvIGNoYW5nZSB0aGUgc3R5bGVcXG5hbmQgdHJhbnNmb3JtYXRpb24gc2V0dGluZ3MgYW5kIGxhdGVyIHJldHVybiB0byB3aGF0IHlvdSBoYWQuIFdoZW4gYSBuZXdcXG5zdGF0ZSBpcyBzdGFydGVkIHdpdGggcHVzaCgpLCBpdCBidWlsZHMgb24gdGhlIGN1cnJlbnQgc3R5bGUgYW5kIHRyYW5zZm9ybVxcbmluZm9ybWF0aW9uLiBUaGUgcHVzaCgpIGFuZCBwb3AoKSBmdW5jdGlvbnMgY2FuIGJlIGVtYmVkZGVkIHRvIHByb3ZpZGVcXG5tb3JlIGNvbnRyb2wuIChTZWUgdGhlIHNlY29uZCBleGFtcGxlIGZvciBhIGRlbW9uc3RyYXRpb24uKVxcbjxicj48YnI+XFxucHVzaCgpIHN0b3JlcyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHRyYW5zZm9ybWF0aW9uIHN0YXRlXFxuYW5kIHN0eWxlIHNldHRpbmdzIGNvbnRyb2xsZWQgYnkgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6IGZpbGwoKSxcXG5zdHJva2UoKSwgdGludCgpLCBzdHJva2VXZWlnaHQoKSwgc3Ryb2tlQ2FwKCksIHN0cm9rZUpvaW4oKSxcXG5pbWFnZU1vZGUoKSwgcmVjdE1vZGUoKSwgZWxsaXBzZU1vZGUoKSwgY29sb3JNb2RlKCksIHRleHRBbGlnbigpLFxcbnRleHRGb250KCksIHRleHRNb2RlKCksIHRleHRTaXplKCksIHRleHRMZWFkaW5nKCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicG9wXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5lbGxpcHNlKDAsIDUwLCAzMywgMzMpOyAvLyBMZWZ0IGNpcmNsZVxcblxcbnB1c2goKTsgLy8gU3RhcnQgYSBuZXcgZHJhd2luZyBzdGF0ZVxcbnRyYW5zbGF0ZSg1MCwgMCk7XFxuc3Ryb2tlV2VpZ2h0KDEwKTtcXG5maWxsKDIwNCwgMTUzLCAwKTtcXG5lbGxpcHNlKDAsIDUwLCAzMywgMzMpOyAvLyBNaWRkbGUgY2lyY2xlXFxucG9wKCk7IC8vIFJlc3RvcmUgb3JpZ2luYWwgc3RhdGVcXG5cXG5lbGxpcHNlKDEwMCwgNTAsIDMzLCAzMyk7IC8vIFJpZ2h0IGNpcmNsZVxcbjwvY29kZT5cXG48L2Rpdj5cXG48ZGl2Plxcbjxjb2RlPlxcbmVsbGlwc2UoMCwgNTAsIDMzLCAzMyk7IC8vIExlZnQgY2lyY2xlXFxuXFxucHVzaCgpOyAvLyBTdGFydCBhIG5ldyBkcmF3aW5nIHN0YXRlXFxuc3Ryb2tlV2VpZ2h0KDEwKTtcXG5maWxsKDIwNCwgMTUzLCAwKTtcXG5lbGxpcHNlKDMzLCA1MCwgMzMsIDMzKTsgLy8gTGVmdC1taWRkbGUgY2lyY2xlXFxuXFxucHVzaCgpOyAvLyBTdGFydCBhbm90aGVyIG5ldyBkcmF3aW5nIHN0YXRlXFxuc3Ryb2tlKDAsIDEwMiwgMTUzKTtcXG5lbGxpcHNlKDY2LCA1MCwgMzMsIDMzKTsgLy8gUmlnaHQtbWlkZGxlIGNpcmNsZVxcbnBvcCgpOyAvLyBSZXN0b3JlIHByZXZpb3VzIHN0YXRlXFxuXFxucG9wKCk7IC8vIFJlc3RvcmUgb3JpZ2luYWwgc3RhdGVcXG5cXG5lbGxpcHNlKDEwMCwgNTAsIDMzLCAzMyk7IC8vIFJpZ2h0IGNpcmNsZVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiR29sZCBlbGxpcHNlICsgdGhpY2sgYmxhY2sgb3V0bGluZSBAY2VudGVyIDIgd2hpdGUgZWxsaXBzZXMgb24gbGVmdCBhbmQgcmlnaHQuXFxuMiBHb2xkIGVsbGlwc2VzIGxlZnQgYmxhY2sgcmlnaHQgYmx1ZSBzdHJva2UuIDIgd2hpdGUgZWxsaXBzZXMgb24gbGVmdCtyaWdodC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RydWN0dXJlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvc3RydWN0dXJlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjcxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkV4ZWN1dGVzIHRoZSBjb2RlIHdpdGhpbiBkcmF3KCkgb25lIHRpbWUuIFRoaXMgZnVuY3Rpb25zIGFsbG93cyB0aGVcXG4gcHJvZ3JhbSB0byB1cGRhdGUgdGhlIGRpc3BsYXkgd2luZG93IG9ubHkgd2hlbiBuZWNlc3NhcnksIGZvciBleGFtcGxlXFxuIHdoZW4gYW4gZXZlbnQgcmVnaXN0ZXJlZCBieSBtb3VzZVByZXNzZWQoKSBvciBrZXlQcmVzc2VkKCkgb2NjdXJzLlxcbiA8YnI+PGJyPlxcbiBJbiBzdHJ1Y3R1cmluZyBhIHByb2dyYW0sIGl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gY2FsbCByZWRyYXcoKSB3aXRoaW5cXG4gZXZlbnRzIHN1Y2ggYXMgbW91c2VQcmVzc2VkKCkuIFRoaXMgaXMgYmVjYXVzZSByZWRyYXcoKSBkb2VzIG5vdCBydW5cXG4gZHJhdygpIGltbWVkaWF0ZWx5IChpdCBvbmx5IHNldHMgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIGFuIHVwZGF0ZSBpc1xcbiBuZWVkZWQpLlxcbiA8YnI+PGJyPlxcbiBUaGUgcmVkcmF3KCkgZnVuY3Rpb24gZG9lcyBub3Qgd29yayBwcm9wZXJseSB3aGVuIGNhbGxlZCBpbnNpZGUgZHJhdygpLlxcbiBUbyBlbmFibGUvZGlzYWJsZSBhbmltYXRpb25zLCB1c2UgbG9vcCgpIGFuZCBub0xvb3AoKS5cXG4gPGJyPjxicj5cXG4gSW4gYWRkaXRpb24geW91IGNhbiBzZXQgdGhlIG51bWJlciBvZiByZWRyYXdzIHBlciBtZXRob2QgY2FsbC4gSnVzdFxcbiBhZGQgYW4gaW50ZWdlciBhcyBzaW5nbGUgcGFyYW1ldGVyIGZvciB0aGUgbnVtYmVyIG9mIHJlZHJhd3MuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVkcmF3XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZWRyYXcgZm9yIG4tdGltZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXY+PGNvZGU+XFxuIHZhciB4ID0gMDtcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgIG5vTG9vcCgpO1xcbiB9XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gICBiYWNrZ3JvdW5kKDIwNCk7XFxuICAgbGluZSh4LCAwLCB4LCBoZWlnaHQpO1xcbiB9XFxuZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xcbiAgIHggKz0gMTtcXG4gICByZWRyYXcoKTtcXG4gfVxcbiA8L2NvZGU+PC9kaXY+XFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbiB2YXIgeCA9IDA7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gICBub0xvb3AoKTtcXG4gfVxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICAgYmFja2dyb3VuZCgyMDQpO1xcbiAgIHggKz0gMTtcXG4gICBsaW5lKHgsIDAsIHgsIGhlaWdodCk7XFxuIH1cXG5mdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XFxuICAgcmVkcmF3KDUpO1xcbiB9XFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiYmxhY2sgbGluZSBvbiBmYXIgbGVmdCBvZiBjYW52YXNcXG4gYmxhY2sgbGluZSBvbiBmYXIgbGVmdCBvZiBjYW52YXNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RydWN0dXJlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvdHJhbnNmb3JtLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TXVsdGlwbGllcyB0aGUgY3VycmVudCBtYXRyaXggYnkgdGhlIG9uZSBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgcGFyYW1ldGVycy5cXG5UaGlzIGlzIGEgcG93ZXJmdWwgb3BlcmF0aW9uIHRoYXQgY2FuIHBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgdHJhbnNsYXRlLFxcbnNjYWxlLCBzaGVhciBhbmQgcm90YXRlIGFsbCBhdCBvbmNlLiBZb3UgY2FuIGxlYXJuIG1vcmUgYWJvdXQgdHJhbnNmb3JtYXRpb25cXG5tYXRyaWNlcyBvbiA8YSBocmVmPVxcXCJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UcmFuc2Zvcm1hdGlvbl9tYXRyaXhcXFwiPlxcbldpa2lwZWRpYTwvYT4uPC9wPlxcbjxwPlRoZSBuYW1pbmcgb2YgdGhlIGFyZ3VtZW50cyBoZXJlIGZvbGxvd3MgdGhlIG5hbWluZyBvZiB0aGUgPGEgaHJlZj1cXG5cXFwiaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY2FudmFzLmh0bWwjZG9tLWNvbnRleHQtMmQtdHJhbnNmb3JtXFxcIj5cXG5XSEFUV0cgc3BlY2lmaWNhdGlvbjwvYT4gYW5kIGNvcnJlc3BvbmRzIHRvIGFcXG50cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2YgdGhlXFxuZm9ybTo8L3A+XFxuPGJsb2NrcXVvdGU+XFxuPHA+PGltZyBzdHlsZT1cXFwibWF4LXdpZHRoOiAxNTBweFxcXCIgc3JjPVxcXCJhc3NldHMvdHJhbnNmb3JtYXRpb24tbWF0cml4LnBuZ1xcXCJcXG5hbHQ9XFxcIlRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdXNlZCB3aGVuIGFwcGx5TWF0cml4IGlzIGNhbGxlZFxcXCIvPjwvcD5cXG48L2Jsb2NrcXVvdGU+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhcHBseU1hdHJpeFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVycyB3aGljaCBkZWZpbmUgdGhlIDJ4MyBtYXRyaXggdG8gYmUgbXVsdGlwbGllZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVycyB3aGljaCBkZWZpbmUgdGhlIDJ4MyBtYXRyaXggdG8gYmUgbXVsdGlwbGllZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVycyB3aGljaCBkZWZpbmUgdGhlIDJ4MyBtYXRyaXggdG8gYmUgbXVsdGlwbGllZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVycyB3aGljaCBkZWZpbmUgdGhlIDJ4MyBtYXRyaXggdG8gYmUgbXVsdGlwbGllZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVycyB3aGljaCBkZWZpbmUgdGhlIDJ4MyBtYXRyaXggdG8gYmUgbXVsdGlwbGllZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVycyB3aGljaCBkZWZpbmUgdGhlIDJ4MyBtYXRyaXggdG8gYmUgbXVsdGlwbGllZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgZnJhbWVSYXRlKDEwKTtcXG4gIHJlY3RNb2RlKENFTlRFUik7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICB2YXIgc3RlcCA9IGZyYW1lQ291bnQgJSAyMDtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIC8vIEVxdWl2YWxlbnQgdG8gdHJhbnNsYXRlKHgsIHkpO1xcbiAgYXBwbHlNYXRyaXgoMSwgMCwgMCwgMSwgNDAgKyBzdGVwLCA1MCk7XFxuICByZWN0KDAsIDAsIDUwLCA1MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgZnJhbWVSYXRlKDEwKTtcXG4gIHJlY3RNb2RlKENFTlRFUik7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICB2YXIgc3RlcCA9IGZyYW1lQ291bnQgJSAyMDtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHRyYW5zbGF0ZSg1MCwgNTApO1xcbiAgLy8gRXF1aXZhbGVudCB0byBzY2FsZSh4LCB5KTtcXG4gIGFwcGx5TWF0cml4KDEgLyBzdGVwLCAwLCAwLCAxIC8gc3RlcCwgMCwgMCk7XFxuICByZWN0KDAsIDAsIDUwLCA1MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgZnJhbWVSYXRlKDEwKTtcXG4gIHJlY3RNb2RlKENFTlRFUik7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICB2YXIgc3RlcCA9IGZyYW1lQ291bnQgJSAyMDtcXG4gIHZhciBhbmdsZSA9IG1hcChzdGVwLCAwLCAyMCwgMCwgVFdPX1BJKTtcXG4gIHZhciBjb3NfYSA9IGNvcyhhbmdsZSk7XFxuICB2YXIgc2luX2EgPSBzaW4oYW5nbGUpO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdHJhbnNsYXRlKDUwLCA1MCk7XFxuICAvLyBFcXVpdmFsZW50IHRvIHJvdGF0ZShhbmdsZSk7XFxuICBhcHBseU1hdHJpeChjb3NfYSwgc2luX2EsIC1zaW5fYSwgY29zX2EsIDAsIDApO1xcbiAgcmVjdCgwLCAwLCA1MCwgNTApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGZyYW1lUmF0ZSgxMCk7XFxuICByZWN0TW9kZShDRU5URVIpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgdmFyIHN0ZXAgPSBmcmFtZUNvdW50ICUgMjA7XFxuICB2YXIgYW5nbGUgPSBtYXAoc3RlcCwgMCwgMjAsIC1QSSAvIDQsIFBJIC8gNCk7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICB0cmFuc2xhdGUoNTAsIDUwKTtcXG4gIC8vIGVxdWl2YWxlbnQgdG8gc2hlYXJYKGFuZ2xlKTtcXG4gIHZhciBzaGVhcl9mYWN0b3IgPSAxIC8gdGFuKFBJIC8gMiAtIGFuZ2xlKTtcXG4gIGFwcGx5TWF0cml4KDEsIDAsIHNoZWFyX2ZhY3RvciwgMSwgMCwgMCk7XFxuICByZWN0KDAsIDAsIDUwLCA1MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiQSByZWN0YW5nbGUgdHJhbnNsYXRpbmcgdG8gdGhlIHJpZ2h0XFxuQSByZWN0YW5nbGUgc2hyaW5raW5nIHRvIHRoZSBjZW50ZXJcXG5BIHJlY3RhbmdsZSByb3RhdGluZyBjbG9ja3dpc2UgYWJvdXQgdGhlIGNlbnRlclxcbkEgcmVjdGFuZ2xlIHNoZWFyaW5nXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiVHJhbnNmb3JtXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRyYW5zZm9ybVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3RyYW5zZm9ybS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEzNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXBsYWNlcyB0aGUgY3VycmVudCBtYXRyaXggd2l0aCB0aGUgaWRlbnRpdHkgbWF0cml4LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlc2V0TWF0cml4XCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudHJhbnNsYXRlKDUwLCA1MCk7XFxuYXBwbHlNYXRyaXgoMC41LCAwLjUsIC0wLjUsIDAuNSwgMCwgMCk7XFxucmVjdCgwLCAwLCAyMCwgMjApO1xcbi8vIE5vdGUgdGhhdCB0aGUgdHJhbnNsYXRlIGlzIGFsc28gcmVzZXQuXFxucmVzZXRNYXRyaXgoKTtcXG5yZWN0KDAsIDAsIDIwLCAyMCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJBIHJvdGF0ZWQgcmV0YW5nbGUgaW4gdGhlIGNlbnRlciB3aXRoIGFub3RoZXIgYXQgdGhlIHRvcCBsZWZ0IGNvcm5lclwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlRyYW5zZm9ybVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUcmFuc2Zvcm1cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS90cmFuc2Zvcm0uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNjEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Um90YXRlcyBhIHNoYXBlIHRoZSBhbW91bnQgc3BlY2lmaWVkIGJ5IHRoZSBhbmdsZSBwYXJhbWV0ZXIuIFRoaXNcXG5mdW5jdGlvbiBhY2NvdW50cyBmb3IgYW5nbGVNb2RlLCBzbyBhbmdsZXMgY2FuIGJlIGVudGVyZWQgaW4gZWl0aGVyXFxuUkFESUFOUyBvciBERUdSRUVTLlxcbjxicj48YnI+XFxuT2JqZWN0cyBhcmUgYWx3YXlzIHJvdGF0ZWQgYXJvdW5kIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9uIHRvIHRoZVxcbm9yaWdpbiBhbmQgcG9zaXRpdmUgbnVtYmVycyByb3RhdGUgb2JqZWN0cyBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uXFxuVHJhbnNmb3JtYXRpb25zIGFwcGx5IHRvIGV2ZXJ5dGhpbmcgdGhhdCBoYXBwZW5zIGFmdGVyIGFuZCBzdWJzZXF1ZW50XFxuY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIGFjY3VtdWxhdGVzIHRoZSBlZmZlY3QuIEZvciBleGFtcGxlLCBjYWxsaW5nXFxucm90YXRlKEhBTEZfUEkpIGFuZCB0aGVuIHJvdGF0ZShIQUxGX1BJKSBpcyB0aGUgc2FtZSBhcyByb3RhdGUoUEkpLlxcbkFsbCB0cmFuZm9ybWF0aW9ucyBhcmUgcmVzZXQgd2hlbiBkcmF3KCkgYmVnaW5zIGFnYWluLlxcbjxicj48YnI+XFxuVGVjaG5pY2FsbHksIHJvdGF0ZSgpIG11bHRpcGxpZXMgdGhlIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24gbWF0cml4XFxuYnkgYSByb3RhdGlvbiBtYXRyaXguIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGZ1cnRoZXIgY29udHJvbGxlZCBieVxcbnRoZSBwdXNoKCkgYW5kIHBvcCgpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJvdGF0ZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW5nbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBhbmdsZSBvZiByb3RhdGlvbiwgc3BlY2lmaWVkIGluIHJhZGlhbnNcXG4gICAgICAgICAgICAgICAgICAgICAgIG9yIGRlZ3JlZXMsIGRlcGVuZGluZyBvbiBjdXJyZW50IGFuZ2xlTW9kZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXhpc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+KGluIDNkKSB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3J8TnVtYmVyW11cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG50cmFuc2xhdGUod2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG5yb3RhdGUoUEkgLyAzLjApO1xcbnJlY3QoLTI2LCAtMjYsIDUyLCA1Mik7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ3aGl0ZSA1Mng1MiByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBhdCBjZW50ZXIgcm90YXRlZCBjb3VudGVyIDQ1IGRlZ3JlZXNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUcmFuc2Zvcm1cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVHJhbnNmb3JtXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvdHJhbnNmb3JtLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjAxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJvdGF0ZXMgYXJvdW5kIFggYXhpcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyb3RhdGVYXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbmdsZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIGFuZ2xlIG9mIHJvdGF0aW9uLCBzcGVjaWZpZWQgaW4gcmFkaWFuc1xcbiAgICAgICAgICAgICAgICAgICAgICAgb3IgZGVncmVlcywgZGVwZW5kaW5nIG9uIGN1cnJlbnQgYW5nbGVNb2RlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgbW9kZXJuaXpyPSd3ZWJnbCc+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjU1KTtcXG4gIHJvdGF0ZVgobWlsbGlzKCkgLyAxMDAwKTtcXG4gIGJveCgpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjNkIGJveCByb3RhdGluZyBhcm91bmQgdGhlIHggYXhpcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUcmFuc2Zvcm1cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVHJhbnNmb3JtXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvdHJhbnNmb3JtLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjMxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJvdGF0ZXMgYXJvdW5kIFkgYXhpcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyb3RhdGVZXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbmdsZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIGFuZ2xlIG9mIHJvdGF0aW9uLCBzcGVjaWZpZWQgaW4gcmFkaWFuc1xcbiAgICAgICAgICAgICAgICAgICAgICAgb3IgZGVncmVlcywgZGVwZW5kaW5nIG9uIGN1cnJlbnQgYW5nbGVNb2RlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgbW9kZXJuaXpyPSd3ZWJnbCc+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjU1KTtcXG4gIHJvdGF0ZVkobWlsbGlzKCkgLyAxMDAwKTtcXG4gIGJveCgpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjNkIGJveCByb3RhdGluZyBhcm91bmQgdGhlIHkgYXhpcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUcmFuc2Zvcm1cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVHJhbnNmb3JtXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvdHJhbnNmb3JtLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjYxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJvdGF0ZXMgYXJvdW5kIFogYXhpcy4gV2ViZ2wgbW9kZSBvbmx5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJvdGF0ZVpcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFuZ2xlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgYW5nbGUgb2Ygcm90YXRpb24sIHNwZWNpZmllZCBpbiByYWRpYW5zXFxuICAgICAgICAgICAgICAgICAgICAgICBvciBkZWdyZWVzLCBkZXBlbmRpbmcgb24gY3VycmVudCBhbmdsZU1vZGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBtb2Rlcm5penI9J3dlYmdsJz5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xcbn1cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyNTUpO1xcbiAgcm90YXRlWihtaWxsaXMoKSAvIDEwMDApO1xcbiAgYm94KCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiM2QgYm94IHJvdGF0aW5nIGFyb3VuZCB0aGUgeiBheGlzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlRyYW5zZm9ybVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUcmFuc2Zvcm1cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS90cmFuc2Zvcm0uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyOTEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SW5jcmVhc2VzIG9yIGRlY3JlYXNlcyB0aGUgc2l6ZSBvZiBhIHNoYXBlIGJ5IGV4cGFuZGluZyBhbmQgY29udHJhY3RpbmdcXG52ZXJ0aWNlcy4gT2JqZWN0cyBhbHdheXMgc2NhbGUgZnJvbSB0aGVpciByZWxhdGl2ZSBvcmlnaW4gdG8gdGhlXFxuY29vcmRpbmF0ZSBzeXN0ZW0uIFNjYWxlIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGFzIGRlY2ltYWwgcGVyY2VudGFnZXMuXFxuRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiBjYWxsIHNjYWxlKDIuMCkgaW5jcmVhc2VzIHRoZSBkaW1lbnNpb24gb2YgYVxcbnNoYXBlIGJ5IDIwMCUuXFxuPGJyPjxicj5cXG5UcmFuc2Zvcm1hdGlvbnMgYXBwbHkgdG8gZXZlcnl0aGluZyB0aGF0IGhhcHBlbnMgYWZ0ZXIgYW5kIHN1YnNlcXVlbnRcXG5jYWxscyB0byB0aGUgZnVuY3Rpb24gbXVsdGlwbHkgdGhlIGVmZmVjdC4gRm9yIGV4YW1wbGUsIGNhbGxpbmcgc2NhbGUoMi4wKVxcbmFuZCB0aGVuIHNjYWxlKDEuNSkgaXMgdGhlIHNhbWUgYXMgc2NhbGUoMy4wKS4gSWYgc2NhbGUoKSBpcyBjYWxsZWRcXG53aXRoaW4gZHJhdygpLCB0aGUgdHJhbnNmb3JtYXRpb24gaXMgcmVzZXQgd2hlbiB0aGUgbG9vcCBiZWdpbnMgYWdhaW4uXFxuPGJyPjxicj5cXG5Vc2luZyB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIHogcGFyYW1ldGVyIGlzIG9ubHkgYXZhaWxhYmxlIGluIFdFQkdMIG1vZGUuXFxuVGhpcyBmdW5jdGlvbiBjYW4gYmUgZnVydGhlciBjb250cm9sbGVkIHdpdGggcHVzaCgpIGFuZCBwb3AoKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzY2FsZVwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnRyYW5zbGF0ZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbnJvdGF0ZShQSSAvIDMuMCk7XFxucmVjdCgtMjYsIC0yNiwgNTIsIDUyKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5yZWN0KDMwLCAyMCwgNTAsIDUwKTtcXG5zY2FsZSgwLjUsIDEuMyk7XFxucmVjdCgzMCwgMjAsIDUwLCA1MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ3aGl0ZSA1Mng1MiByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBhdCBjZW50ZXIgcm90YXRlZCBjb3VudGVyIDQ1IGRlZ3JlZXNcXG4yIHdoaXRlIHJlY3RzIHdpdGggYmxhY2sgb3V0bGluZS0gMSA1MHg1MCBhdCBjZW50ZXIuIG90aGVyIDI1eDY1IGJvdHRvbSBsZWZ0XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiVHJhbnNmb3JtXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRyYW5zZm9ybVwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDI5MSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cGVyY2VudCB0byBzY2FsZSB0aGUgb2JqZWN0LCBvciBwZXJjZW50YWdlIHRvXFxuICAgICAgICAgICAgICAgICAgICAgc2NhbGUgdGhlIG9iamVjdCBpbiB0aGUgeC1heGlzIGlmIG11bHRpcGxlIGFyZ3VtZW50c1xcbiAgICAgICAgICAgICAgICAgICAgIGFyZSBnaXZlbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8cDUuVmVjdG9yfE51bWJlcltdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wZXJjZW50IHRvIHNjYWxlIHRoZSBvYmplY3QgaW4gdGhlIHktYXhpczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwielwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wZXJjZW50IHRvIHNjYWxlIHRoZSBvYmplY3QgaW4gdGhlIHotYXhpcyAod2ViZ2wgb25seSk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDMzNixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNjYWxlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wZXItYXhpcyBwZXJjZW50cyB0byBzY2FsZSB0aGUgb2JqZWN0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvcnxOdW1iZXJbXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3RyYW5zZm9ybS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM2NixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TaGVhcnMgYSBzaGFwZSBhcm91bmQgdGhlIHgtYXhpcyB0aGUgYW1vdW50IHNwZWNpZmllZCBieSB0aGUgYW5nbGVcXG5wYXJhbWV0ZXIuIEFuZ2xlcyBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZSBjdXJyZW50IGFuZ2xlTW9kZS5cXG5PYmplY3RzIGFyZSBhbHdheXMgc2hlYXJlZCBhcm91bmQgdGhlaXIgcmVsYXRpdmUgcG9zaXRpb24gdG8gdGhlIG9yaWdpblxcbmFuZCBwb3NpdGl2ZSBudW1iZXJzIHNoZWFyIG9iamVjdHMgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uLlxcbjxicj48YnI+XFxuVHJhbnNmb3JtYXRpb25zIGFwcGx5IHRvIGV2ZXJ5dGhpbmcgdGhhdCBoYXBwZW5zIGFmdGVyIGFuZCBzdWJzZXF1ZW50XFxuY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIGFjY3VtdWxhdGVzIHRoZSBlZmZlY3QuIEZvciBleGFtcGxlLCBjYWxsaW5nXFxuc2hlYXJYKFBJLzIpIGFuZCB0aGVuIHNoZWFyWChQSS8yKSBpcyB0aGUgc2FtZSBhcyBzaGVhclgoUEkpLlxcbklmIHNoZWFyWCgpIGlzIGNhbGxlZCB3aXRoaW4gdGhlIGRyYXcoKSwgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHJlc2V0IHdoZW5cXG50aGUgbG9vcCBiZWdpbnMgYWdhaW4uXFxuPGJyPjxicj5cXG5UZWNobmljYWxseSwgc2hlYXJYKCkgbXVsdGlwbGllcyB0aGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYnkgYVxcbnJvdGF0aW9uIG1hdHJpeC4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgZnVydGhlciBjb250cm9sbGVkIGJ5IHRoZVxcbnB1c2goKSBhbmQgcG9wKCkgZnVuY3Rpb25zLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNoZWFyWFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW5nbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmFuZ2xlIG9mIHNoZWFyIHNwZWNpZmllZCBpbiByYWRpYW5zIG9yIGRlZ3JlZXMsXFxuICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gY3VycmVudCBhbmdsZU1vZGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG50cmFuc2xhdGUod2lkdGggLyA0LCBoZWlnaHQgLyA0KTtcXG5zaGVhclgoUEkgLyA0LjApO1xcbnJlY3QoMCwgMCwgMzAsIDMwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIndoaXRlIGlycmVndWxhciBxdWFkcmlsYXRlcmFsIHdpdGggYmxhY2sgb3V0bGluZSBhdCB0b3AgbWlkZGxlLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlRyYW5zZm9ybVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUcmFuc2Zvcm1cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS90cmFuc2Zvcm0uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MDUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2hlYXJzIGEgc2hhcGUgYXJvdW5kIHRoZSB5LWF4aXMgdGhlIGFtb3VudCBzcGVjaWZpZWQgYnkgdGhlIGFuZ2xlXFxucGFyYW1ldGVyLiBBbmdsZXMgc2hvdWxkIGJlIHNwZWNpZmllZCBpbiB0aGUgY3VycmVudCBhbmdsZU1vZGUuIE9iamVjdHNcXG5hcmUgYWx3YXlzIHNoZWFyZWQgYXJvdW5kIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9uIHRvIHRoZSBvcmlnaW4gYW5kXFxucG9zaXRpdmUgbnVtYmVycyBzaGVhciBvYmplY3RzIGluIGEgY2xvY2t3aXNlIGRpcmVjdGlvbi5cXG48YnI+PGJyPlxcblRyYW5zZm9ybWF0aW9ucyBhcHBseSB0byBldmVyeXRoaW5nIHRoYXQgaGFwcGVucyBhZnRlciBhbmQgc3Vic2VxdWVudFxcbmNhbGxzIHRvIHRoZSBmdW5jdGlvbiBhY2N1bXVsYXRlcyB0aGUgZWZmZWN0LiBGb3IgZXhhbXBsZSwgY2FsbGluZ1xcbnNoZWFyWShQSS8yKSBhbmQgdGhlbiBzaGVhclkoUEkvMikgaXMgdGhlIHNhbWUgYXMgc2hlYXJZKFBJKS4gSWZcXG5zaGVhclkoKSBpcyBjYWxsZWQgd2l0aGluIHRoZSBkcmF3KCksIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyByZXNldCB3aGVuXFxudGhlIGxvb3AgYmVnaW5zIGFnYWluLlxcbjxicj48YnI+XFxuVGVjaG5pY2FsbHksIHNoZWFyWSgpIG11bHRpcGxpZXMgdGhlIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24gbWF0cml4IGJ5IGFcXG5yb3RhdGlvbiBtYXRyaXguIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGZ1cnRoZXIgY29udHJvbGxlZCBieSB0aGVcXG5wdXNoKCkgYW5kIHBvcCgpIGZ1bmN0aW9ucy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzaGVhcllcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFuZ2xlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hbmdsZSBvZiBzaGVhciBzcGVjaWZpZWQgaW4gcmFkaWFucyBvciBkZWdyZWVzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIGN1cnJlbnQgYW5nbGVNb2RlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudHJhbnNsYXRlKHdpZHRoIC8gNCwgaGVpZ2h0IC8gNCk7XFxuc2hlYXJZKFBJIC8gNC4wKTtcXG5yZWN0KDAsIDAsIDMwLCAzMCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ3aGl0ZSBpcnJlZ3VsYXIgcXVhZHJpbGF0ZXJhbCB3aXRoIGJsYWNrIG91dGxpbmUgYXQgbWlkZGxlIGJvdHRvbS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUcmFuc2Zvcm1cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVHJhbnNmb3JtXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvdHJhbnNmb3JtLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDQ0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNwZWNpZmllcyBhbiBhbW91bnQgdG8gZGlzcGxhY2Ugb2JqZWN0cyB3aXRoaW4gdGhlIGRpc3BsYXkgd2luZG93LlxcblRoZSB4IHBhcmFtZXRlciBzcGVjaWZpZXMgbGVmdC9yaWdodCB0cmFuc2xhdGlvbiwgdGhlIHkgcGFyYW1ldGVyXFxuc3BlY2lmaWVzIHVwL2Rvd24gdHJhbnNsYXRpb24uXFxuPGJyPjxicj5cXG5UcmFuc2Zvcm1hdGlvbnMgYXJlIGN1bXVsYXRpdmUgYW5kIGFwcGx5IHRvIGV2ZXJ5dGhpbmcgdGhhdCBoYXBwZW5zIGFmdGVyXFxuYW5kIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIGFjY3VtdWxhdGVzIHRoZSBlZmZlY3QuIEZvciBleGFtcGxlLFxcbmNhbGxpbmcgdHJhbnNsYXRlKDUwLCAwKSBhbmQgdGhlbiB0cmFuc2xhdGUoMjAsIDApIGlzIHRoZSBzYW1lIGFzXFxudHJhbnNsYXRlKDcwLCAwKS4gSWYgdHJhbnNsYXRlKCkgaXMgY2FsbGVkIHdpdGhpbiBkcmF3KCksIHRoZVxcbnRyYW5zZm9ybWF0aW9uIGlzIHJlc2V0IHdoZW4gdGhlIGxvb3AgYmVnaW5zIGFnYWluLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZVxcbmZ1cnRoZXIgY29udHJvbGxlZCBieSB1c2luZyBwdXNoKCkgYW5kIHBvcCgpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRyYW5zbGF0ZVwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnRyYW5zbGF0ZSgzMCwgMjApO1xcbnJlY3QoMCwgMCwgNTUsIDU1KTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5yZWN0KDAsIDAsIDU1LCA1NSk7IC8vIERyYXcgcmVjdCBhdCBvcmlnaW5hbCAwLDBcXG50cmFuc2xhdGUoMzAsIDIwKTtcXG5yZWN0KDAsIDAsIDU1LCA1NSk7IC8vIERyYXcgcmVjdCBhdCBuZXcgMCwwXFxudHJhbnNsYXRlKDE0LCAxNCk7XFxucmVjdCgwLCAwLCA1NSwgNTUpOyAvLyBEcmF3IHJlY3QgYXQgbmV3IDAsMFxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICByZWN0TW9kZShDRU5URVIpO1xcbiAgdHJhbnNsYXRlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxuICB0cmFuc2xhdGUocDUuVmVjdG9yLmZyb21BbmdsZShtaWxsaXMoKSAvIDEwMDAsIDQwKSk7XFxuICByZWN0KDAsIDAsIDIwLCAyMCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwid2hpdGUgNTV4NTUgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgYXQgY2VudGVyIHJpZ2h0LlxcbjMgd2hpdGUgNTV4NTUgcmVjdHMgd2l0aCBibGFjayBvdXRsaW5lcyBhdCB0b3AtbCwgY2VudGVyLXIgYW5kIGJvdHRvbS1yLlxcbmEgMjB4MjAgd2hpdGUgcmVjdCBtb3ZpbmcgaW4gYSBjaXJjbGUgYXJvdW5kIHRoZSBjYW52YXNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUcmFuc2Zvcm1cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVHJhbnNmb3JtXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNDQ0LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5sZWZ0L3JpZ2h0IHRyYW5zbGF0aW9uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dXAvZG93biB0cmFuc2xhdGlvbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZvcndhcmQvYmFja3dhcmQgdHJhbnNsYXRpb24gKHdlYmdsIG9ubHkpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA0OTgsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2ZWN0b3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHZlY3RvciB0byB0cmFuc2xhdGUgYnk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvdmVydGV4LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VXNlIHRoZSBiZWdpbkNvbnRvdXIoKSBhbmQgZW5kQ29udG91cigpIGZ1bmN0aW9ucyB0byBjcmVhdGUgbmVnYXRpdmVcXG5zaGFwZXMgd2l0aGluIHNoYXBlcyBzdWNoIGFzIHRoZSBjZW50ZXIgb2YgdGhlIGxldHRlciAmIzM5O08mIzM5Oy4gYmVnaW5Db250b3VyKClcXG5iZWdpbnMgcmVjb3JkaW5nIHZlcnRpY2VzIGZvciB0aGUgc2hhcGUgYW5kIGVuZENvbnRvdXIoKSBzdG9wcyByZWNvcmRpbmcuXFxuVGhlIHZlcnRpY2VzIHRoYXQgZGVmaW5lIGEgbmVnYXRpdmUgc2hhcGUgbXVzdCAmcXVvdDt3aW5kJnF1b3Q7IGluIHRoZSBvcHBvc2l0ZVxcbmRpcmVjdGlvbiBmcm9tIHRoZSBleHRlcmlvciBzaGFwZS4gRmlyc3QgZHJhdyB2ZXJ0aWNlcyBmb3IgdGhlIGV4dGVyaW9yXFxuY2xvY2t3aXNlIG9yZGVyLCB0aGVuIGZvciBpbnRlcm5hbCBzaGFwZXMsIGRyYXcgdmVydGljZXNcXG5zaGFwZSBpbiBjb3VudGVyLWNsb2Nrd2lzZS5cXG48YnI+PGJyPlxcblRoZXNlIGZ1bmN0aW9ucyBjYW4gb25seSBiZSB1c2VkIHdpdGhpbiBhIGJlZ2luU2hhcGUoKS9lbmRTaGFwZSgpIHBhaXIgYW5kXFxudHJhbnNmb3JtYXRpb25zIHN1Y2ggYXMgdHJhbnNsYXRlKCksIHJvdGF0ZSgpLCBhbmQgc2NhbGUoKSBkbyBub3Qgd29ya1xcbndpdGhpbiBhIGJlZ2luQ29udG91cigpL2VuZENvbnRvdXIoKSBwYWlyLiBJdCBpcyBhbHNvIG5vdCBwb3NzaWJsZSB0byB1c2VcXG5vdGhlciBzaGFwZXMsIHN1Y2ggYXMgZWxsaXBzZSgpIG9yIHJlY3QoKSB3aXRoaW4uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYmVnaW5Db250b3VyXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudHJhbnNsYXRlKDUwLCA1MCk7XFxuc3Ryb2tlKDI1NSwgMCwgMCk7XFxuYmVnaW5TaGFwZSgpO1xcbi8vIEV4dGVyaW9yIHBhcnQgb2Ygc2hhcGUsIGNsb2Nrd2lzZSB3aW5kaW5nXFxudmVydGV4KC00MCwgLTQwKTtcXG52ZXJ0ZXgoNDAsIC00MCk7XFxudmVydGV4KDQwLCA0MCk7XFxudmVydGV4KC00MCwgNDApO1xcbi8vIEludGVyaW9yIHBhcnQgb2Ygc2hhcGUsIGNvdW50ZXItY2xvY2t3aXNlIHdpbmRpbmdcXG5iZWdpbkNvbnRvdXIoKTtcXG52ZXJ0ZXgoLTIwLCAtMjApO1xcbnZlcnRleCgtMjAsIDIwKTtcXG52ZXJ0ZXgoMjAsIDIwKTtcXG52ZXJ0ZXgoMjAsIC0yMCk7XFxuZW5kQ29udG91cigpO1xcbmVuZFNoYXBlKENMT1NFKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIndoaXRlIHJlY3QgYW5kIHNtYWxsZXIgZ3JleSByZWN0IHdpdGggcmVkIG91dGxpbmVzIGluIGNlbnRlciBvZiBjYW52YXMuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVmVydGV4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2NvcmUvdmVydGV4LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VXNpbmcgdGhlIGJlZ2luU2hhcGUoKSBhbmQgZW5kU2hhcGUoKSBmdW5jdGlvbnMgYWxsb3cgY3JlYXRpbmcgbW9yZVxcbmNvbXBsZXggZm9ybXMuIGJlZ2luU2hhcGUoKSBiZWdpbnMgcmVjb3JkaW5nIHZlcnRpY2VzIGZvciBhIHNoYXBlIGFuZFxcbmVuZFNoYXBlKCkgc3RvcHMgcmVjb3JkaW5nLiBUaGUgdmFsdWUgb2YgdGhlIGtpbmQgcGFyYW1ldGVyIHRlbGxzIGl0IHdoaWNoXFxudHlwZXMgb2Ygc2hhcGVzIHRvIGNyZWF0ZSBmcm9tIHRoZSBwcm92aWRlZCB2ZXJ0aWNlcy4gV2l0aCBubyBtb2RlXFxuc3BlY2lmaWVkLCB0aGUgc2hhcGUgY2FuIGJlIGFueSBpcnJlZ3VsYXIgcG9seWdvbi5cXG48YnI+PGJyPlxcblRoZSBwYXJhbWV0ZXJzIGF2YWlsYWJsZSBmb3IgYmVnaW5TaGFwZSgpIGFyZSBQT0lOVFMsIExJTkVTLCBUUklBTkdMRVMsXFxuVFJJQU5HTEVfRkFOLCBUUklBTkdMRV9TVFJJUCwgUVVBRFMsIGFuZCBRVUFEX1NUUklQLiBBZnRlciBjYWxsaW5nIHRoZVxcbmJlZ2luU2hhcGUoKSBmdW5jdGlvbiwgYSBzZXJpZXMgb2YgdmVydGV4KCkgY29tbWFuZHMgbXVzdCBmb2xsb3cuIFRvIHN0b3BcXG5kcmF3aW5nIHRoZSBzaGFwZSwgY2FsbCBlbmRTaGFwZSgpLiBFYWNoIHNoYXBlIHdpbGwgYmUgb3V0bGluZWQgd2l0aCB0aGVcXG5jdXJyZW50IHN0cm9rZSBjb2xvciBhbmQgZmlsbGVkIHdpdGggdGhlIGZpbGwgY29sb3IuXFxuPGJyPjxicj5cXG5UcmFuc2Zvcm1hdGlvbnMgc3VjaCBhcyB0cmFuc2xhdGUoKSwgcm90YXRlKCksIGFuZCBzY2FsZSgpIGRvIG5vdCB3b3JrXFxud2l0aGluIGJlZ2luU2hhcGUoKS4gSXQgaXMgYWxzbyBub3QgcG9zc2libGUgdG8gdXNlIG90aGVyIHNoYXBlcywgc3VjaCBhc1xcbmVsbGlwc2UoKSBvciByZWN0KCkgd2l0aGluIGJlZ2luU2hhcGUoKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJiZWdpblNoYXBlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJraW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5laXRoZXIgUE9JTlRTLCBMSU5FUywgVFJJQU5HTEVTLCBUUklBTkdMRV9GQU5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJJQU5HTEVfU1RSSVAsIFFVQURTLCBvciBRVUFEX1NUUklQPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJDb25zdGFudFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmJlZ2luU2hhcGUoKTtcXG52ZXJ0ZXgoMzAsIDIwKTtcXG52ZXJ0ZXgoODUsIDIwKTtcXG52ZXJ0ZXgoODUsIDc1KTtcXG52ZXJ0ZXgoMzAsIDc1KTtcXG5lbmRTaGFwZShDTE9TRSk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuYmVnaW5TaGFwZShQT0lOVFMpO1xcbnZlcnRleCgzMCwgMjApO1xcbnZlcnRleCg4NSwgMjApO1xcbnZlcnRleCg4NSwgNzUpO1xcbnZlcnRleCgzMCwgNzUpO1xcbmVuZFNoYXBlKCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuYmVnaW5TaGFwZShMSU5FUyk7XFxudmVydGV4KDMwLCAyMCk7XFxudmVydGV4KDg1LCAyMCk7XFxudmVydGV4KDg1LCA3NSk7XFxudmVydGV4KDMwLCA3NSk7XFxuZW5kU2hhcGUoKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5ub0ZpbGwoKTtcXG5iZWdpblNoYXBlKCk7XFxudmVydGV4KDMwLCAyMCk7XFxudmVydGV4KDg1LCAyMCk7XFxudmVydGV4KDg1LCA3NSk7XFxudmVydGV4KDMwLCA3NSk7XFxuZW5kU2hhcGUoKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5ub0ZpbGwoKTtcXG5iZWdpblNoYXBlKCk7XFxudmVydGV4KDMwLCAyMCk7XFxudmVydGV4KDg1LCAyMCk7XFxudmVydGV4KDg1LCA3NSk7XFxudmVydGV4KDMwLCA3NSk7XFxuZW5kU2hhcGUoQ0xPU0UpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmJlZ2luU2hhcGUoVFJJQU5HTEVTKTtcXG52ZXJ0ZXgoMzAsIDc1KTtcXG52ZXJ0ZXgoNDAsIDIwKTtcXG52ZXJ0ZXgoNTAsIDc1KTtcXG52ZXJ0ZXgoNjAsIDIwKTtcXG52ZXJ0ZXgoNzAsIDc1KTtcXG52ZXJ0ZXgoODAsIDIwKTtcXG5lbmRTaGFwZSgpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmJlZ2luU2hhcGUoVFJJQU5HTEVfU1RSSVApO1xcbnZlcnRleCgzMCwgNzUpO1xcbnZlcnRleCg0MCwgMjApO1xcbnZlcnRleCg1MCwgNzUpO1xcbnZlcnRleCg2MCwgMjApO1xcbnZlcnRleCg3MCwgNzUpO1xcbnZlcnRleCg4MCwgMjApO1xcbnZlcnRleCg5MCwgNzUpO1xcbmVuZFNoYXBlKCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuYmVnaW5TaGFwZShUUklBTkdMRV9GQU4pO1xcbnZlcnRleCg1Ny41LCA1MCk7XFxudmVydGV4KDU3LjUsIDE1KTtcXG52ZXJ0ZXgoOTIsIDUwKTtcXG52ZXJ0ZXgoNTcuNSwgODUpO1xcbnZlcnRleCgyMiwgNTApO1xcbnZlcnRleCg1Ny41LCAxNSk7XFxuZW5kU2hhcGUoKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5iZWdpblNoYXBlKFFVQURTKTtcXG52ZXJ0ZXgoMzAsIDIwKTtcXG52ZXJ0ZXgoMzAsIDc1KTtcXG52ZXJ0ZXgoNTAsIDc1KTtcXG52ZXJ0ZXgoNTAsIDIwKTtcXG52ZXJ0ZXgoNjUsIDIwKTtcXG52ZXJ0ZXgoNjUsIDc1KTtcXG52ZXJ0ZXgoODUsIDc1KTtcXG52ZXJ0ZXgoODUsIDIwKTtcXG5lbmRTaGFwZSgpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmJlZ2luU2hhcGUoUVVBRF9TVFJJUCk7XFxudmVydGV4KDMwLCAyMCk7XFxudmVydGV4KDMwLCA3NSk7XFxudmVydGV4KDUwLCAyMCk7XFxudmVydGV4KDUwLCA3NSk7XFxudmVydGV4KDY1LCAyMCk7XFxudmVydGV4KDY1LCA3NSk7XFxudmVydGV4KDg1LCAyMCk7XFxudmVydGV4KDg1LCA3NSk7XFxuZW5kU2hhcGUoKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5iZWdpblNoYXBlKCk7XFxudmVydGV4KDIwLCAyMCk7XFxudmVydGV4KDQwLCAyMCk7XFxudmVydGV4KDQwLCA0MCk7XFxudmVydGV4KDYwLCA0MCk7XFxudmVydGV4KDYwLCA2MCk7XFxudmVydGV4KDIwLCA2MCk7XFxuZW5kU2hhcGUoQ0xPU0UpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwid2hpdGUgc3F1YXJlLXNoYXBlIHdpdGggYmxhY2sgb3V0bGluZSBpbiBtaWRkbGUtcmlnaHQgb2YgY2FudmFzLlxcbjQgYmxhY2sgcG9pbnRzIGluIGEgc3F1YXJlIHNoYXBlIGluIG1pZGRsZS1yaWdodCBvZiBjYW52YXMuXFxuMiBob3Jpem9udGFsIGJsYWNrIGxpbmVzLiBJbiB0aGUgdG9wLXJpZ2h0IGFuZCBib3R0b20tcmlnaHQgb2YgY2FudmFzLlxcbjMgbGluZSBzaGFwZSB3aXRoIGhvcml6b250YWwgb24gdG9wLCB2ZXJ0aWNhbCBpbiBtaWRkbGUgYW5kIGhvcml6b250YWwgYm90dG9tLlxcbnNxdWFyZSBsaW5lIHNoYXBlIGluIG1pZGRsZS1yaWdodCBvZiBjYW52YXMuXFxuMiB3aGl0ZSB0cmlhbmdsZSBzaGFwZXMgbWlkLXJpZ2h0IGNhbnZhcy4gbGVmdCBvbmUgcG9pbnRpbmcgdXAgYW5kIHJpZ2h0IGRvd24uXFxuNSBob3Jpem9udGFsIGludGVybG9ja2luZyBhbmQgYWx0ZXJuYXRpbmcgd2hpdGUgdHJpYW5nbGVzIGluIG1pZC1yaWdodCBjYW52YXMuXFxuNCBpbnRlcmxvY2tpbmcgd2hpdGUgdHJpYW5nbGVzIGluIDQ1IGRlZ3JlZSByb3RhdGVkIHNxdWFyZS1zaGFwZS5cXG4yIHdoaXRlIHJlY3RhbmdsZSBzaGFwZXMgaW4gbWlkLXJpZ2h0IGNhbnZhcy4gQm90aCAyMHg1NS5cXG4zIHNpZGUtYnktc2lkZSB3aGl0ZSByZWN0YW5nbGVzIGNlbnRlciByZWN0IGlzIHNtYWxsZXIgaW4gbWlkLXJpZ2h0IGNhbnZhcy5cXG5UaGljayB3aGl0ZSBsLXNoYXBlIHdpdGggYmxhY2sgb3V0bGluZSBtaWQtdG9wLWxlZnQgb2YgY2FudmFzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlZlcnRleFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3ZlcnRleC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI3MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TcGVjaWZpZXMgdmVydGV4IGNvb3JkaW5hdGVzIGZvciBCZXppZXIgY3VydmVzLiBFYWNoIGNhbGwgdG9cXG5iZXppZXJWZXJ0ZXgoKSBkZWZpbmVzIHRoZSBwb3NpdGlvbiBvZiB0d28gY29udHJvbCBwb2ludHMgYW5kXFxub25lIGFuY2hvciBwb2ludCBvZiBhIEJlemllciBjdXJ2ZSwgYWRkaW5nIGEgbmV3IHNlZ21lbnQgdG8gYVxcbmxpbmUgb3Igc2hhcGUuXFxuPGJyPjxicj5cXG5UaGUgZmlyc3QgdGltZSBiZXppZXJWZXJ0ZXgoKSBpcyB1c2VkIHdpdGhpbiBhXFxuYmVnaW5TaGFwZSgpIGNhbGwsIGl0IG11c3QgYmUgcHJlZmFjZWQgd2l0aCBhIGNhbGwgdG8gdmVydGV4KClcXG50byBzZXQgdGhlIGZpcnN0IGFuY2hvciBwb2ludC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgYmV0d2VlblxcbmJlZ2luU2hhcGUoKSBhbmQgZW5kU2hhcGUoKSBhbmQgb25seSB3aGVuIHRoZXJlIGlzIG5vIE1PREVcXG5wYXJhbWV0ZXIgc3BlY2lmaWVkIHRvIGJlZ2luU2hhcGUoKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJiZXppZXJWZXJ0ZXhcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBjb250cm9sIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5MlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1jb29yZGluYXRlIGZvciB0aGUgZmlyc3QgY29udHJvbCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieDNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPngtY29vcmRpbmF0ZSBmb3IgdGhlIHNlY29uZCBjb250cm9sIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5M1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1jb29yZGluYXRlIGZvciB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIng0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LWNvb3JkaW5hdGUgZm9yIHRoZSBhbmNob3IgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInk0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgZm9yIHRoZSBhbmNob3IgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5zdHJva2VXZWlnaHQoNSk7XFxucG9pbnQoMzAsIDIwKTtcXG5wb2ludCg4MCwgMjApO1xcbnBvaW50KDgwLCA3NSk7XFxucG9pbnQoMzAsIDc1KTtcXG5cXG5zdHJva2VXZWlnaHQoMSk7XFxubm9GaWxsKCk7XFxuYmVnaW5TaGFwZSgpO1xcbnZlcnRleCgzMCwgMjApO1xcbmJlemllclZlcnRleCg4MCwgMjAsIDgwLCA3NSwgMzAsIDc1KTtcXG5lbmRTaGFwZSgpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbnN0cm9rZVdlaWdodCg1KTtcXG5wb2ludCgzMCwgMjApO1xcbnBvaW50KDgwLCAyMCk7XFxucG9pbnQoODAsIDc1KTtcXG5wb2ludCgzMCwgNzUpO1xcblxcbnN0cm9rZSgyNDQsIDEyMiwgMTU4KTtcXG5wb2ludCg1MCwgODApO1xcbnBvaW50KDYwLCAyNSk7XFxucG9pbnQoMzAsIDIwKTtcXG5cXG5zdHJva2UoMCk7XFxuc3Ryb2tlV2VpZ2h0KDEpO1xcbmJlZ2luU2hhcGUoKTtcXG52ZXJ0ZXgoMzAsIDIwKTtcXG5iZXppZXJWZXJ0ZXgoODAsIDIwLCA4MCwgNzUsIDMwLCA3NSk7XFxuYmV6aWVyVmVydGV4KDUwLCA4MCwgNjAsIDI1LCAzMCwgMjApO1xcbmVuZFNoYXBlKCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJjcmVzY2VudC1zaGFwZWQgbGluZSBpbiBtaWRkbGUgb2YgY2FudmFzLiBQb2ludHMgZmFjaW5nIGxlZnQuXFxud2hpdGUgY3Jlc2NlbnQgc2hhcGUgaW4gbWlkZGxlIG9mIGNhbnZhcy4gUG9pbnRzIGZhY2luZyBsZWZ0LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlZlcnRleFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3ZlcnRleC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM1NixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TcGVjaWZpZXMgdmVydGV4IGNvb3JkaW5hdGVzIGZvciBjdXJ2ZXMuIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHlcXG5iZSB1c2VkIGJldHdlZW4gYmVnaW5TaGFwZSgpIGFuZCBlbmRTaGFwZSgpIGFuZCBvbmx5IHdoZW4gdGhlcmVcXG5pcyBubyBNT0RFIHBhcmFtZXRlciBzcGVjaWZpZWQgdG8gYmVnaW5TaGFwZSgpLlxcbjxicj48YnI+XFxuVGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBpbiBhIHNlcmllcyBvZiBjdXJ2ZVZlcnRleCgpIGxpbmVzIHdpbGwgYmUgdXNlZCB0b1xcbmd1aWRlIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHRoZSBjdXJ2ZS4gQSBtaW5pbXVtIG9mIGZvdXJcXG5wb2ludHMgaXMgcmVxdWlyZWQgdG8gZHJhdyBhIHRpbnkgY3VydmUgYmV0d2VlbiB0aGUgc2Vjb25kIGFuZFxcbnRoaXJkIHBvaW50cy4gQWRkaW5nIGEgZmlmdGggcG9pbnQgd2l0aCBjdXJ2ZVZlcnRleCgpIHdpbGwgZHJhd1xcbnRoZSBjdXJ2ZSBiZXR3ZWVuIHRoZSBzZWNvbmQsIHRoaXJkLCBhbmQgZm91cnRoIHBvaW50cy4gVGhlXFxuY3VydmVWZXJ0ZXgoKSBmdW5jdGlvbiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBDYXRtdWxsLVJvbVxcbnNwbGluZXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3VydmVWZXJ0ZXhcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPngtY29vcmRpbmF0ZSBvZiB0aGUgdmVydGV4PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgb2YgdGhlIHZlcnRleDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnN0cm9rZVdlaWdodCg1KTtcXG5wb2ludCg4NCwgOTEpO1xcbnBvaW50KDY4LCAxOSk7XFxucG9pbnQoMjEsIDE3KTtcXG5wb2ludCgzMiwgOTEpO1xcbnN0cm9rZVdlaWdodCgxKTtcXG5cXG5ub0ZpbGwoKTtcXG5iZWdpblNoYXBlKCk7XFxuY3VydmVWZXJ0ZXgoODQsIDkxKTtcXG5jdXJ2ZVZlcnRleCg4NCwgOTEpO1xcbmN1cnZlVmVydGV4KDY4LCAxOSk7XFxuY3VydmVWZXJ0ZXgoMjEsIDE3KTtcXG5jdXJ2ZVZlcnRleCgzMiwgOTEpO1xcbmN1cnZlVmVydGV4KDMyLCA5MSk7XFxuZW5kU2hhcGUoKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIlVwc2lkZS1kb3duIHUtc2hhcGUgbGluZSwgbWlkIGNhbnZhcy4gbGVmdCBwb2ludCBleHRlbmRzIGJleW9uZCBjYW52YXMgdmlldy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJWZXJ0ZXhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS92ZXJ0ZXguanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MDcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VXNlIHRoZSBiZWdpbkNvbnRvdXIoKSBhbmQgZW5kQ29udG91cigpIGZ1bmN0aW9ucyB0byBjcmVhdGUgbmVnYXRpdmVcXG5zaGFwZXMgd2l0aGluIHNoYXBlcyBzdWNoIGFzIHRoZSBjZW50ZXIgb2YgdGhlIGxldHRlciAmIzM5O08mIzM5Oy4gYmVnaW5Db250b3VyKClcXG5iZWdpbnMgcmVjb3JkaW5nIHZlcnRpY2VzIGZvciB0aGUgc2hhcGUgYW5kIGVuZENvbnRvdXIoKSBzdG9wcyByZWNvcmRpbmcuXFxuVGhlIHZlcnRpY2VzIHRoYXQgZGVmaW5lIGEgbmVnYXRpdmUgc2hhcGUgbXVzdCAmcXVvdDt3aW5kJnF1b3Q7IGluIHRoZSBvcHBvc2l0ZVxcbmRpcmVjdGlvbiBmcm9tIHRoZSBleHRlcmlvciBzaGFwZS4gRmlyc3QgZHJhdyB2ZXJ0aWNlcyBmb3IgdGhlIGV4dGVyaW9yXFxuY2xvY2t3aXNlIG9yZGVyLCB0aGVuIGZvciBpbnRlcm5hbCBzaGFwZXMsIGRyYXcgdmVydGljZXNcXG5zaGFwZSBpbiBjb3VudGVyLWNsb2Nrd2lzZS5cXG48YnI+PGJyPlxcblRoZXNlIGZ1bmN0aW9ucyBjYW4gb25seSBiZSB1c2VkIHdpdGhpbiBhIGJlZ2luU2hhcGUoKS9lbmRTaGFwZSgpIHBhaXIgYW5kXFxudHJhbnNmb3JtYXRpb25zIHN1Y2ggYXMgdHJhbnNsYXRlKCksIHJvdGF0ZSgpLCBhbmQgc2NhbGUoKSBkbyBub3Qgd29ya1xcbndpdGhpbiBhIGJlZ2luQ29udG91cigpL2VuZENvbnRvdXIoKSBwYWlyLiBJdCBpcyBhbHNvIG5vdCBwb3NzaWJsZSB0byB1c2VcXG5vdGhlciBzaGFwZXMsIHN1Y2ggYXMgZWxsaXBzZSgpIG9yIHJlY3QoKSB3aXRoaW4uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZW5kQ29udG91clwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnRyYW5zbGF0ZSg1MCwgNTApO1xcbnN0cm9rZSgyNTUsIDAsIDApO1xcbmJlZ2luU2hhcGUoKTtcXG4vLyBFeHRlcmlvciBwYXJ0IG9mIHNoYXBlLCBjbG9ja3dpc2Ugd2luZGluZ1xcbnZlcnRleCgtNDAsIC00MCk7XFxudmVydGV4KDQwLCAtNDApO1xcbnZlcnRleCg0MCwgNDApO1xcbnZlcnRleCgtNDAsIDQwKTtcXG4vLyBJbnRlcmlvciBwYXJ0IG9mIHNoYXBlLCBjb3VudGVyLWNsb2Nrd2lzZSB3aW5kaW5nXFxuYmVnaW5Db250b3VyKCk7XFxudmVydGV4KC0yMCwgLTIwKTtcXG52ZXJ0ZXgoLTIwLCAyMCk7XFxudmVydGV4KDIwLCAyMCk7XFxudmVydGV4KDIwLCAtMjApO1xcbmVuZENvbnRvdXIoKTtcXG5lbmRTaGFwZShDTE9TRSk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ3aGl0ZSByZWN0IGFuZCBzbWFsbGVyIGdyZXkgcmVjdCB3aXRoIHJlZCBvdXRsaW5lcyBpbiBjZW50ZXIgb2YgY2FudmFzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlZlcnRleFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3ZlcnRleC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ2NyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgZW5kU2hhcGUoKSBmdW5jdGlvbiBpcyB0aGUgY29tcGFuaW9uIHRvIGJlZ2luU2hhcGUoKSBhbmQgbWF5IG9ubHkgYmVcXG5jYWxsZWQgYWZ0ZXIgYmVnaW5TaGFwZSgpLiBXaGVuIGVuZHNoYXBlKCkgaXMgY2FsbGVkLCBhbGwgb2YgaW1hZ2UgZGF0YVxcbmRlZmluZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwgdG8gYmVnaW5TaGFwZSgpIGlzIHdyaXR0ZW4gaW50byB0aGUgaW1hZ2VcXG5idWZmZXIuIFRoZSBjb25zdGFudCBDTE9TRSBhcyB0aGUgdmFsdWUgZm9yIHRoZSBNT0RFIHBhcmFtZXRlciB0byBjbG9zZVxcbnRoZSBzaGFwZSAodG8gY29ubmVjdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJlbmRTaGFwZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibW9kZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dXNlIENMT1NFIHRvIGNsb3NlIHRoZSBzaGFwZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29uc3RhbnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5ub0ZpbGwoKTtcXG5cXG5iZWdpblNoYXBlKCk7XFxudmVydGV4KDIwLCAyMCk7XFxudmVydGV4KDQ1LCAyMCk7XFxudmVydGV4KDQ1LCA4MCk7XFxuZW5kU2hhcGUoQ0xPU0UpO1xcblxcbmJlZ2luU2hhcGUoKTtcXG52ZXJ0ZXgoNTAsIDIwKTtcXG52ZXJ0ZXgoNzUsIDIwKTtcXG52ZXJ0ZXgoNzUsIDgwKTtcXG5lbmRTaGFwZSgpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiVHJpYW5nbGUgbGluZSBzaGFwZSB3aXRoIHNtYWxsZXN0IGludGVyaW9yIGFuZ2xlIG9uIGJvdHRvbSBhbmQgdXBzaWRlLWRvd24gTC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJWZXJ0ZXhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvY29yZS92ZXJ0ZXguanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1NTMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3BlY2lmaWVzIHZlcnRleCBjb29yZGluYXRlcyBmb3IgcXVhZHJhdGljIEJlemllciBjdXJ2ZXMuIEVhY2ggY2FsbCB0b1xcbnF1YWRyYXRpY1ZlcnRleCgpIGRlZmluZXMgdGhlIHBvc2l0aW9uIG9mIG9uZSBjb250cm9sIHBvaW50cyBhbmQgb25lXFxuYW5jaG9yIHBvaW50IG9mIGEgQmV6aWVyIGN1cnZlLCBhZGRpbmcgYSBuZXcgc2VnbWVudCB0byBhIGxpbmUgb3Igc2hhcGUuXFxuVGhlIGZpcnN0IHRpbWUgcXVhZHJhdGljVmVydGV4KCkgaXMgdXNlZCB3aXRoaW4gYSBiZWdpblNoYXBlKCkgY2FsbCwgaXRcXG5tdXN0IGJlIHByZWZhY2VkIHdpdGggYSBjYWxsIHRvIHZlcnRleCgpIHRvIHNldCB0aGUgZmlyc3QgYW5jaG9yIHBvaW50LlxcblRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIGJldHdlZW4gYmVnaW5TaGFwZSgpIGFuZCBlbmRTaGFwZSgpIGFuZCBvbmx5XFxud2hlbiB0aGVyZSBpcyBubyBNT0RFIHBhcmFtZXRlciBzcGVjaWZpZWQgdG8gYmVnaW5TaGFwZSgpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInF1YWRyYXRpY1ZlcnRleFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3hcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPngtY29vcmRpbmF0ZSBmb3IgdGhlIGNvbnRyb2wgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImN5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgZm9yIHRoZSBjb250cm9sIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4M1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIGZvciB0aGUgYW5jaG9yIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5M1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1jb29yZGluYXRlIGZvciB0aGUgYW5jaG9yIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuc3Ryb2tlV2VpZ2h0KDUpO1xcbnBvaW50KDIwLCAyMCk7XFxucG9pbnQoODAsIDIwKTtcXG5wb2ludCg1MCwgNTApO1xcblxcbm5vRmlsbCgpO1xcbnN0cm9rZVdlaWdodCgxKTtcXG5iZWdpblNoYXBlKCk7XFxudmVydGV4KDIwLCAyMCk7XFxucXVhZHJhdGljVmVydGV4KDgwLCAyMCwgNTAsIDUwKTtcXG5lbmRTaGFwZSgpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbnN0cm9rZVdlaWdodCg1KTtcXG5wb2ludCgyMCwgMjApO1xcbnBvaW50KDgwLCAyMCk7XFxucG9pbnQoNTAsIDUwKTtcXG5cXG5wb2ludCgyMCwgODApO1xcbnBvaW50KDgwLCA4MCk7XFxucG9pbnQoODAsIDYwKTtcXG5cXG5ub0ZpbGwoKTtcXG5zdHJva2VXZWlnaHQoMSk7XFxuYmVnaW5TaGFwZSgpO1xcbnZlcnRleCgyMCwgMjApO1xcbnF1YWRyYXRpY1ZlcnRleCg4MCwgMjAsIDUwLCA1MCk7XFxucXVhZHJhdGljVmVydGV4KDIwLCA4MCwgODAsIDgwKTtcXG52ZXJ0ZXgoODAsIDYwKTtcXG5lbmRTaGFwZSgpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiYXJjaGVkLXNoYXBlZCBibGFjayBsaW5lIHdpdGggNCBwaXhlbCB0aGljayBzdHJva2Ugd2VpZ2h0LlxcbmJhY2t3YXJkcyBzLXNoYXBlZCBibGFjayBsaW5lIHdpdGggNCBwaXhlbCB0aGljayBzdHJva2Ugd2VpZ2h0LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlZlcnRleFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9jb3JlL3ZlcnRleC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDY0NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BbGwgc2hhcGVzIGFyZSBjb25zdHJ1Y3RlZCBieSBjb25uZWN0aW5nIGEgc2VyaWVzIG9mIHZlcnRpY2VzLiB2ZXJ0ZXgoKVxcbmlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdmVydGV4IGNvb3JkaW5hdGVzIGZvciBwb2ludHMsIGxpbmVzLCB0cmlhbmdsZXMsXFxucXVhZHMsIGFuZCBwb2x5Z29ucy4gSXQgaXMgdXNlZCBleGNsdXNpdmVseSB3aXRoaW4gdGhlIGJlZ2luU2hhcGUoKSBhbmRcXG5lbmRTaGFwZSgpIGZ1bmN0aW9ucy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ2ZXJ0ZXhcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5zdHJva2VXZWlnaHQoMyk7XFxuYmVnaW5TaGFwZShQT0lOVFMpO1xcbnZlcnRleCgzMCwgMjApO1xcbnZlcnRleCg4NSwgMjApO1xcbnZlcnRleCg4NSwgNzUpO1xcbnZlcnRleCgzMCwgNzUpO1xcbmVuZFNoYXBlKCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCI4IHBvaW50cyBtYWtpbmcgNCBsaW5lc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlZlcnRleFwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDY0NSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSB2ZXJ0ZXg8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgb2YgdGhlIHZlcnRleDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA3MzIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwielwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD56LWNvb3JkaW5hdGUgb2YgdGhlIHZlcnRleDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgdmVydGV4JiMzOTtzIHRleHR1cmUgdS1jb29yZGluYXRlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB2ZXJ0ZXgmIzM5O3MgdGV4dHVyZSB2LWNvb3JkaW5hdGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgcDUuU3RyaW5nRGljdCB1c2luZyB0aGUga2V5LCB2YWx1ZSBwYWlyXFxuIG9yIG9iamVjdCB5b3UgcHJvdmlkZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVTdHJpbmdEaWN0XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlN0cmluZ0RpY3RcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbiA8Y29kZT5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZVN0cmluZ0RpY3QoJ3A1JywgJ2pzJyk7XFxuICAgcHJpbnQobXlEaWN0aW9uYXJ5Lmhhc0tleSgncDUnKSk7IC8vIGxvZ3MgdHJ1ZSB0byBjb25zb2xlXFxuIH1cXG4gPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwia2V5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlN0cmluZ0RpY3RcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAzNixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5vYmplY3Q8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuU3RyaW5nRGljdFwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgcDUuTnVtYmVyRGljdCB1c2luZyB0aGUga2V5LCB2YWx1ZSBwYWlyXFxuIG9yIG9iamVjdCB5b3UgcHJvdmlkZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVOdW1iZXJEaWN0XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1Lk51bWJlckRpY3RcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbiA8Y29kZT5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoMTAwLCA0Mik7XFxuICAgcHJpbnQobXlEaWN0aW9uYXJ5Lmhhc0tleSgxMDApKTsgLy8gbG9ncyB0cnVlIHRvIGNvbnNvbGVcXG4gfVxcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNDcsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJrZXlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuTnVtYmVyRGljdFwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDY3LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm9iamVjdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5OdW1iZXJEaWN0XCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBwYWlycyBjdXJyZW50bHkgaW4gRGljdGlvbmFyeSBvYmplY3Q8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzaXplXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIHBhaXJzIGluIERpY3Rpb25hcnkgb2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBteURpY3Rpb25hcnkgPSBjcmVhdGVOdW1iZXJEaWN0KDEsIDEwKTtcXG4gIG15RGljdGlvbmFyeS5jcmVhdGUoMiwgMjApO1xcbiAgbXlEaWN0aW9uYXJ5LmNyZWF0ZSgzLCAzMCk7XFxuICBwcmludChteURpY3Rpb25hcnkuc2l6ZSgpKTsgLy8gdmFsdWUgb2YgYW10IGlzIDNcXG59XFxuPC9jb2RlPjwvZGl2PlxcblwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlR5cGVkRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyB0cnVlIGlmIGtleSBleGlzdHMgaW4gRGljdGlvbmFyeVxcbm90aGVyd2lzZSByZXR1cm5zIGZhbHNlPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiaGFzS2V5XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJrZXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoYXQgeW91IHdhbnQgdG8gYWNjZXNzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8U3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ3aGV0aGVyIHRoYXQga2V5IGV4aXN0cyBpbiBEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBteURpY3Rpb25hcnkgPSBjcmVhdGVTdHJpbmdEaWN0KCdwNScsICdqcycpO1xcbiAgcHJpbnQobXlEaWN0aW9uYXJ5Lmhhc0tleSgncDUnKSk7IC8vIGxvZ3MgdHJ1ZSB0byBjb25zb2xlXFxufVxcbjwvY29kZT48L2Rpdj5cXG5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UeXBlZERpY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJEaWN0aW9uYXJ5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTQyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgdmFsdWUgc3RvcmVkIGF0IHN1cHBsaWVkIGtleS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImtleVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhhdCB5b3Ugd2FudCB0byBhY2Nlc3M8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcnxTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSB2YWx1ZSBzdG9yZWQgYXQgdGhhdCBrZXlcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8U3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZVN0cmluZ0RpY3QoJ3A1JywgJ2pzJyk7XFxuICB2YXIgbXlWYWx1ZSA9IG15RGljdGlvbmFyeS5nZXQoJ3A1Jyk7XFxuICBwcmludChteVZhbHVlID09PSAnanMnKTsgLy8gbG9ncyB0cnVlIHRvIGNvbnNvbGVcXG59XFxuPC9jb2RlPjwvZGl2PlxcblwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlR5cGVkRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNjksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2hhbmdlcyB0aGUgdmFsdWUgb2Yga2V5IGlmIGluIGl0IGFscmVhZHkgZXhpc3RzIGluXFxuaW4gdGhlIERpY3Rpb25hcnkgb3RoZXJ3aXNlIG1ha2VzIGEgbmV3IGtleS12YWx1ZSBwYWlyPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJrZXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8U3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8U3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBteURpY3Rpb25hcnkgPSBjcmVhdGVTdHJpbmdEaWN0KCdwNScsICdqcycpO1xcbiAgbXlEaWN0aW9uYXJ5LnNldCgncDUnLCAnSlMnKTtcXG4gIG15RGljdGlvbmFyeS5wcmludCgpO1xcbiAgLy8gYWJvdmUgbG9ncyBcXFwia2V5OiBwNSAtIHZhbHVlOiBKU1xcXCIgdG8gY29uc29sZVxcbn1cXG48L2NvZGU+PC9kaXY+XFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVHlwZWREaWN0XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRGljdGlvbmFyeVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE5OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHVzZXIgcGFzc2luZyBvYmplY3RzIGluXFxuZHVyaW5nIGNvbnN0cnVjdGlvbiBvciBjYWxscyB0byBjcmVhdGUoKTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UeXBlZERpY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJEaWN0aW9uYXJ5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjA5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgRGljdGlvbmFyeTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNyZWF0ZVwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBteURpY3Rpb25hcnkgPSBjcmVhdGVTdHJpbmdEaWN0KCdwNScsICdqcycpO1xcbiAgbXlEaWN0aW9uYXJ5LmNyZWF0ZSgnaGFwcHknLCAnY29kaW5nJyk7XFxuICBteURpY3Rpb25hcnkucHJpbnQoKTtcXG4gIC8vIGFib3ZlIGxvZ3MgXFxcImtleTogcDUgLSB2YWx1ZToganMsIGtleTogaGFwcHkgLSB2YWx1ZTogY29kaW5nXFxcIiB0byBjb25zb2xlXFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UeXBlZERpY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjA5LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwia2V5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcnxTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8U3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjI3LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwib2JqXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmtleS92YWx1ZSBwYWlyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI0NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5FbXB0aWVzIERpY3Rpb25hcnkgb2YgYWxsIGtleS12YWx1ZSBwYWlyczwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNsZWFyXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZVN0cmluZ0RpY3QoJ3A1JywgJ2pzJyk7XFxuICBwcmludChteURpY3Rpb25hcnkuaGFzS2V5KCdwNScpKTsgLy8gcHJpbnRzICd0cnVlJ1xcbiAgbXlEaWN0aW9uYXJ5LmNsZWFyKCk7XFxuICBwcmludChteURpY3Rpb25hcnkuaGFzS2V5KCdwNScpKTsgLy8gcHJpbnRzICdmYWxzZSdcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlR5cGVkRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNjUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSBEaWN0aW9uYXJ5PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJrZXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZvciB0aGUgcGFpciB0byByZW1vdmU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcnxTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZVN0cmluZ0RpY3QoJ3A1JywgJ2pzJyk7XFxuICBteURpY3Rpb25hcnkuY3JlYXRlKCdoYXBweScsICdjb2RpbmcnKTtcXG4gIG15RGljdGlvbmFyeS5wcmludCgpO1xcbiAgLy8gYWJvdmUgbG9ncyBcXFwia2V5OiBwNSAtIHZhbHVlOiBqcywga2V5OiBoYXBweSAtIHZhbHVlOiBjb2RpbmdcXFwiIHRvIGNvbnNvbGVcXG4gIG15RGljdGlvbmFyeS5yZW1vdmUoJ3A1Jyk7XFxuICBteURpY3Rpb25hcnkucHJpbnQoKTtcXG4gIC8vIGFib3ZlIGxvZ3MgXFxcImtleTogaGFwcHkgdmFsdWU6IGNvZGluZ1xcXCIgdG8gY29uc29sZVxcbn1cXG48L2NvZGU+PC9kaXY+XFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVHlwZWREaWN0XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRGljdGlvbmFyeVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI5NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Mb2dzIHRoZSBsaXN0IG9mIGl0ZW1zIGN1cnJlbnRseSBpbiB0aGUgRGljdGlvbmFyeSB0byB0aGUgY29uc29sZTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInByaW50XCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZVN0cmluZ0RpY3QoJ3A1JywgJ2pzJyk7XFxuICBteURpY3Rpb25hcnkuY3JlYXRlKCdoYXBweScsICdjb2RpbmcnKTtcXG4gIG15RGljdGlvbmFyeS5wcmludCgpO1xcbiAgLy8gYWJvdmUgbG9ncyBcXFwia2V5OiBwNSAtIHZhbHVlOiBqcywga2V5OiBoYXBweSAtIHZhbHVlOiBjb2RpbmdcXFwiIHRvIGNvbnNvbGVcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlR5cGVkRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzMTksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29udmVydHMgdGhlIERpY3Rpb25hcnkgaW50byBhIENTViBmaWxlIGZvciBsb2NhbFxcbnN0b3JhZ2UuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2F2ZVRhYmxlXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5jcmVhdGVCdXR0b24oJ3NhdmUnKVxcbiAgLnBvc2l0aW9uKDEwLCAxMClcXG4gIC5tb3VzZVByZXNzZWQoZnVuY3Rpb24oKSB7XFxuICAgIGNyZWF0ZVN0cmluZ0RpY3Qoe1xcbiAgICAgIGpvaG46IDE5NDAsXFxuICAgICBwYXVsOiAxOTQyLFxcbiAgICAgZ2VvcmdlOiAxOTQzLFxcbiAgICAgcmluZ286IDE5NDBcXG4gICAgfSkuc2F2ZVRhYmxlKCdiZWF0bGVzJyk7XFxuICB9KTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVHlwZWREaWN0XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRGljdGlvbmFyeVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM1MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db252ZXJ0cyB0aGUgRGljdGlvbmFyeSBpbnRvIGEgSlNPTiBmaWxlIGZvciBsb2NhbFxcbnN0b3JhZ2UuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2F2ZUpTT05cIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmNyZWF0ZUJ1dHRvbignc2F2ZScpXFxuICAucG9zaXRpb24oMTAsIDEwKVxcbiAgLm1vdXNlUHJlc3NlZChmdW5jdGlvbigpIHtcXG4gICAgY3JlYXRlU3RyaW5nRGljdCh7XFxuICAgICAgam9objogMTk0MCxcXG4gICAgIHBhdWw6IDE5NDIsXFxuICAgICBnZW9yZ2U6IDE5NDMsXFxuICAgICByaW5nbzogMTk0MFxcbiAgICB9KS5zYXZlSlNPTignYmVhdGxlcycpO1xcbiAgfSk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlR5cGVkRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzNzgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlIHVzZXIgcGFzc2VkIGluIHZhbGlkXFxudmFsdWVzIGZvciB0aGUgRGljdGlvbmFyeSB0eXBlPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlR5cGVkRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MjMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlIHVzZXIgcGFzc2VkIGluIHZhbGlkXFxudmFsdWVzIGZvciB0aGUgRGljdGlvbmFyeSB0eXBlPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk51bWJlckRpY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJEaWN0aW9uYXJ5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDMyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFkZCB0byBhIHZhbHVlIHN0b3JlZCBhdCBhIGNlcnRhaW4ga2V5XFxuVGhlIHN1bSBpcyBzdG9yZWQgaW4gdGhhdCBsb2NhdGlvbiBpbiB0aGUgRGljdGlvbmFyeS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhZGRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIktleVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Zm9yIHZhbHVlIHlvdSB3aXNoIHRvIGFkZCB0bzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1vdW50XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50byBhZGQgdG8gdGhlIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoMiwgNSk7XFxuICBteURpY3Rpb25hcnkuYWRkKDIsIDIpO1xcbiAgY29uc29sZS5sb2cobXlEaWN0aW9uYXJ5LmdldCgyKSk7IC8vIGxvZ3MgNyB0byBjb25zb2xlLlxcbn1cXG48L2NvZGU+PC9kaXY+XFxuXFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTnVtYmVyRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0NjAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3VidHJhY3QgZnJvbSBhIHZhbHVlIHN0b3JlZCBhdCBhIGNlcnRhaW4ga2V5XFxuVGhlIGRpZmZlcmVuY2UgaXMgc3RvcmVkIGluIHRoYXQgbG9jYXRpb24gaW4gdGhlIERpY3Rpb25hcnkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3ViXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJLZXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZvciB2YWx1ZSB5b3Ugd2lzaCB0byBzdWJ0cmFjdCBmcm9tPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJBbW91bnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRvIHN1YnRyYWN0IGZyb20gdGhlIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoMiwgNSk7XFxuICBteURpY3Rpb25hcnkuc3ViKDIsIDIpO1xcbiAgY29uc29sZS5sb2cobXlEaWN0aW9uYXJ5LmdldCgyKSk7IC8vIGxvZ3MgMyB0byBjb25zb2xlLlxcbn1cXG48L2NvZGU+PC9kaXY+XFxuXFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTnVtYmVyRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0ODQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TXVsdGlwbHkgYSB2YWx1ZSBzdG9yZWQgYXQgYSBjZXJ0YWluIGtleVxcblRoZSBwcm9kdWN0IGlzIHN0b3JlZCBpbiB0aGF0IGxvY2F0aW9uIGluIHRoZSBEaWN0aW9uYXJ5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm11bHRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIktleVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Zm9yIHZhbHVlIHlvdSB3aXNoIHRvIG11bHRpcGx5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJBbW91bnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRvIG11bHRpcGx5IHRoZSB2YWx1ZSBieTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBteURpY3Rpb25hcnkgPSBjcmVhdGVOdW1iZXJEaWN0KDIsIDQpO1xcbiAgbXlEaWN0aW9uYXJ5Lm11bHQoMiwgMik7XFxuICBjb25zb2xlLmxvZyhteURpY3Rpb25hcnkuZ2V0KDIpKTsgLy8gbG9ncyA4IHRvIGNvbnNvbGUuXFxufVxcbjwvY29kZT48L2Rpdj5cXG5cXG5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5OdW1iZXJEaWN0XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRGljdGlvbmFyeVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUxMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EaXZpZGUgYSB2YWx1ZSBzdG9yZWQgYXQgYSBjZXJ0YWluIGtleVxcblRoZSBxdW90aWVudCBpcyBzdG9yZWQgaW4gdGhhdCBsb2NhdGlvbiBpbiB0aGUgRGljdGlvbmFyeS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkaXZcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIktleVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Zm9yIHZhbHVlIHlvdSB3aXNoIHRvIGRpdmlkZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1vdW50XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50byBkaXZpZGUgdGhlIHZhbHVlIGJ5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoMiwgOCk7XFxuICBteURpY3Rpb25hcnkuZGl2KDIsIDIpO1xcbiAgY29uc29sZS5sb2cobXlEaWN0aW9uYXJ5LmdldCgyKSk7IC8vIGxvZ3MgNCB0byBjb25zb2xlLlxcbn1cXG48L2NvZGU+PC9kaXY+XFxuXFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTnVtYmVyRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1NDAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGZpbmRpbmcgbG93ZXN0IG9yIGhpZ2hlc3QgdmFsdWVcXG50aGUgYXJndW1lbnQgJiMzOTtmbGlwJiMzOTsgaXMgdXNlZCB0byBmbGlwIHRoZSBjb21wYXJpc29uIGFycm93XFxuZnJvbSAmIzM5O2xlc3MgdGhhbiYjMzk7IHRvICYjMzk7Z3JlYXRlciB0aGFuJiMzOTs8L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTnVtYmVyRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1NjMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJuIHRoZSBsb3dlc3QgdmFsdWUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibWluVmFsdWVcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoeyAyOiAtMTAsIDQ6IDAuNjUsIDEuMjogMyB9KTtcXG4gIHZhciBsb3dlc3RWYWx1ZSA9IG15RGljdGlvbmFyeS5taW5WYWx1ZSgpOyAvLyB2YWx1ZSBpcyAtMTBcXG4gIHByaW50KGxvd2VzdFZhbHVlKTtcXG59XFxuPC9jb2RlPjwvZGl2PlxcblwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk51bWJlckRpY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJEaWN0aW9uYXJ5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTg0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybiB0aGUgaGlnaGVzdCB2YWx1ZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtYXhWYWx1ZVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgbXlEaWN0aW9uYXJ5ID0gY3JlYXRlTnVtYmVyRGljdCh7IDI6IC0xMCwgNDogMC42NSwgMS4yOiAzIH0pO1xcbiAgdmFyIGhpZ2hlc3RWYWx1ZSA9IG15RGljdGlvbmFyeS5tYXhWYWx1ZSgpOyAvLyB2YWx1ZSBpcyAzXFxuICBwcmludChoaWdoZXN0VmFsdWUpO1xcbn1cXG48L2NvZGU+PC9kaXY+XFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTnVtYmVyRGljdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkRpY3Rpb25hcnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZGF0YS9wNS5UeXBlZERpY3QuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2MDUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGZpbmRpbmcgbG93ZXN0IG9yIGhpZ2hlc3Qga2V5XFxudGhlIGFyZ3VtZW50ICYjMzk7ZmxpcCYjMzk7IGlzIHVzZWQgdG8gZmxpcCB0aGUgY29tcGFyaXNvbiBhcnJvd1xcbmZyb20gJiMzOTtsZXNzIHRoYW4mIzM5OyB0byAmIzM5O2dyZWF0ZXIgdGhhbiYjMzk7PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk51bWJlckRpY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJEaWN0aW9uYXJ5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjI4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybiB0aGUgbG93ZXN0IGtleS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtaW5LZXlcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoeyAyOiA0LCA0OiA2LCAxLjI6IDMgfSk7XFxuICB2YXIgbG93ZXN0S2V5ID0gbXlEaWN0aW9uYXJ5Lm1pbktleSgpOyAvLyB2YWx1ZSBpcyAxLjJcXG4gIHByaW50KGxvd2VzdEtleSk7XFxufVxcbjwvY29kZT48L2Rpdj5cXG5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5OdW1iZXJEaWN0XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRGljdGlvbmFyeVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9kYXRhL3A1LlR5cGVkRGljdC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDY0OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm4gdGhlIGhpZ2hlc3Qga2V5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1heEtleVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgbXlEaWN0aW9uYXJ5ID0gY3JlYXRlTnVtYmVyRGljdCh7IDI6IDQsIDQ6IDYsIDEuMjogMyB9KTtcXG4gIHZhciBoaWdoZXN0S2V5ID0gbXlEaWN0aW9uYXJ5Lm1heEtleSgpOyAvLyB2YWx1ZSBpcyA0XFxuICBwcmludChoaWdoZXN0S2V5KTtcXG59XFxuPC9jb2RlPjwvZGl2PlxcblwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk51bWJlckRpY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJEaWN0aW9uYXJ5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9hY2NlbGVyYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgc3lzdGVtIHZhcmlhYmxlIGRldmljZU9yaWVudGF0aW9uIGFsd2F5cyBjb250YWlucyB0aGUgb3JpZW50YXRpb24gb2ZcXG50aGUgZGV2aWNlLiBUaGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSB3aWxsIGVpdGhlciBiZSBzZXQgJiMzOTtsYW5kc2NhcGUmIzM5O1xcbm9yICYjMzk7cG9ydHJhaXQmIzM5Oy4gSWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgaXQgd2lsbCBiZSBzZXQgdG8gJiMzOTt1bmRlZmluZWQmIzM5Oy5cXG5laXRoZXIgTEFORFNDQVBFIG9yIFBPUlRSQUlULjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGV2aWNlT3JpZW50YXRpb25cIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIkNvbnN0YW50XCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFjY2VsZXJhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHN5c3RlbSB2YXJpYWJsZSBhY2NlbGVyYXRpb25YIGFsd2F5cyBjb250YWlucyB0aGUgYWNjZWxlcmF0aW9uIG9mIHRoZVxcbmRldmljZSBhbG9uZyB0aGUgeCBheGlzLiBWYWx1ZSBpcyByZXByZXNlbnRlZCBhcyBtZXRlcnMgcGVyIHNlY29uZCBzcXVhcmVkLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWNjZWxlcmF0aW9uWFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFjY2VsZXJhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHN5c3RlbSB2YXJpYWJsZSBhY2NlbGVyYXRpb25ZIGFsd2F5cyBjb250YWlucyB0aGUgYWNjZWxlcmF0aW9uIG9mIHRoZVxcbmRldmljZSBhbG9uZyB0aGUgeSBheGlzLiBWYWx1ZSBpcyByZXByZXNlbnRlZCBhcyBtZXRlcnMgcGVyIHNlY29uZCBzcXVhcmVkLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWNjZWxlcmF0aW9uWVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFjY2VsZXJhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHN5c3RlbSB2YXJpYWJsZSBhY2NlbGVyYXRpb25aIGFsd2F5cyBjb250YWlucyB0aGUgYWNjZWxlcmF0aW9uIG9mIHRoZVxcbmRldmljZSBhbG9uZyB0aGUgeiBheGlzLiBWYWx1ZSBpcyByZXByZXNlbnRlZCBhcyBtZXRlcnMgcGVyIHNlY29uZCBzcXVhcmVkLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWNjZWxlcmF0aW9uWlwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFjY2VsZXJhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHN5c3RlbSB2YXJpYWJsZSBwQWNjZWxlcmF0aW9uWCBhbHdheXMgY29udGFpbnMgdGhlIGFjY2VsZXJhdGlvbiBvZiB0aGVcXG5kZXZpY2UgYWxvbmcgdGhlIHggYXhpcyBpbiB0aGUgZnJhbWUgcHJldmlvdXMgdG8gdGhlIGN1cnJlbnQgZnJhbWUuIFZhbHVlXFxuaXMgcmVwcmVzZW50ZWQgYXMgbWV0ZXJzIHBlciBzZWNvbmQgc3F1YXJlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBBY2NlbGVyYXRpb25YXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwicmVhZG9ubHlcIjogXCJcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQWNjZWxlcmF0aW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9hY2NlbGVyYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgc3lzdGVtIHZhcmlhYmxlIHBBY2NlbGVyYXRpb25ZIGFsd2F5cyBjb250YWlucyB0aGUgYWNjZWxlcmF0aW9uIG9mIHRoZVxcbmRldmljZSBhbG9uZyB0aGUgeSBheGlzIGluIHRoZSBmcmFtZSBwcmV2aW91cyB0byB0aGUgY3VycmVudCBmcmFtZS4gVmFsdWVcXG5pcyByZXByZXNlbnRlZCBhcyBtZXRlcnMgcGVyIHNlY29uZCBzcXVhcmVkLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicEFjY2VsZXJhdGlvbllcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBY2NlbGVyYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDcwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBzeXN0ZW0gdmFyaWFibGUgcEFjY2VsZXJhdGlvblogYWx3YXlzIGNvbnRhaW5zIHRoZSBhY2NlbGVyYXRpb24gb2YgdGhlXFxuZGV2aWNlIGFsb25nIHRoZSB6IGF4aXMgaW4gdGhlIGZyYW1lIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IGZyYW1lLiBWYWx1ZVxcbmlzIHJlcHJlc2VudGVkIGFzIG1ldGVycyBwZXIgc2Vjb25kIHNxdWFyZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwQWNjZWxlcmF0aW9uWlwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFjY2VsZXJhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHN5c3RlbSB2YXJpYWJsZSByb3RhdGlvblggYWx3YXlzIGNvbnRhaW5zIHRoZSByb3RhdGlvbiBvZiB0aGVcXG5kZXZpY2UgYWxvbmcgdGhlIHggYXhpcy4gVmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMgMCB0byArLy0xODAgZGVncmVlcy5cXG48YnI+PGJyPlxcbk5vdGU6IFRoZSBvcmRlciB0aGUgcm90YXRpb25zIGFyZSBjYWxsZWQgaXMgaW1wb3J0YW50LCBpZS4gaWYgdXNlZFxcbnRvZ2V0aGVyLCBpdCBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3JkZXIgWi1YLVkgb3IgdGhlcmUgbWlnaHQgYmVcXG51bmV4cGVjdGVkIGJlaGF2aW91ci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgLy9yb3RhdGVaKHJhZGlhbnMocm90YXRpb25aKSk7XFxuICByb3RhdGVYKHJhZGlhbnMocm90YXRpb25YKSk7XFxuICAvL3JvdGF0ZVkocmFkaWFucyhyb3RhdGlvblkpKTtcXG4gIGJveCgyMDAsIDIwMCwgMjAwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyb3RhdGlvblhcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJyZWQgaG9yaXpvbnRhbCBsaW5lIHJpZ2h0LCBncmVlbiB2ZXJ0aWNhbCBsaW5lIGJvdHRvbS4gYmxhY2sgYmFja2dyb3VuZC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQWNjZWxlcmF0aW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9hY2NlbGVyYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHN5c3RlbSB2YXJpYWJsZSByb3RhdGlvblkgYWx3YXlzIGNvbnRhaW5zIHRoZSByb3RhdGlvbiBvZiB0aGVcXG5kZXZpY2UgYWxvbmcgdGhlIHkgYXhpcy4gVmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMgMCB0byArLy05MCBkZWdyZWVzLlxcbjxicj48YnI+XFxuTm90ZTogVGhlIG9yZGVyIHRoZSByb3RhdGlvbnMgYXJlIGNhbGxlZCBpcyBpbXBvcnRhbnQsIGllLiBpZiB1c2VkXFxudG9nZXRoZXIsIGl0IG11c3QgYmUgY2FsbGVkIGluIHRoZSBvcmRlciBaLVgtWSBvciB0aGVyZSBtaWdodCBiZVxcbnVuZXhwZWN0ZWQgYmVoYXZpb3VyLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICAvL3JvdGF0ZVoocmFkaWFucyhyb3RhdGlvblopKTtcXG4gIC8vcm90YXRlWChyYWRpYW5zKHJvdGF0aW9uWCkpO1xcbiAgcm90YXRlWShyYWRpYW5zKHJvdGF0aW9uWSkpO1xcbiAgYm94KDIwMCwgMjAwLCAyMDApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJvdGF0aW9uWVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImFsdFwiOiBcInJlZCBob3Jpem9udGFsIGxpbmUgcmlnaHQsIGdyZWVuIHZlcnRpY2FsIGxpbmUgYm90dG9tLiBibGFjayBiYWNrZ3JvdW5kLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBY2NlbGVyYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE1OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgc3lzdGVtIHZhcmlhYmxlIHJvdGF0aW9uWiBhbHdheXMgY29udGFpbnMgdGhlIHJvdGF0aW9uIG9mIHRoZVxcbmRldmljZSBhbG9uZyB0aGUgeiBheGlzLiBWYWx1ZSBpcyByZXByZXNlbnRlZCBhcyAwIHRvIDM1OSBkZWdyZWVzLlxcbjxicj48YnI+XFxuVW5saWtlIHJvdGF0aW9uWCBhbmQgcm90YXRpb25ZLCB0aGlzIHZhcmlhYmxlIGlzIGF2YWlsYWJsZSBmb3IgZGV2aWNlc1xcbndpdGggYSBidWlsdC1pbiBjb21wYXNzIG9ubHkuXFxuPGJyPjxicj5cXG5Ob3RlOiBUaGUgb3JkZXIgdGhlIHJvdGF0aW9ucyBhcmUgY2FsbGVkIGlzIGltcG9ydGFudCwgaWUuIGlmIHVzZWRcXG50b2dldGhlciwgaXQgbXVzdCBiZSBjYWxsZWQgaW4gdGhlIG9yZGVyIFotWC1ZIG9yIHRoZXJlIG1pZ2h0IGJlXFxudW5leHBlY3RlZCBiZWhhdmlvdXIuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHJvdGF0ZVoocmFkaWFucyhyb3RhdGlvblopKTtcXG4gIC8vcm90YXRlWChyYWRpYW5zKHJvdGF0aW9uWCkpO1xcbiAgLy9yb3RhdGVZKHJhZGlhbnMocm90YXRpb25ZKSk7XFxuICBib3goMjAwLCAyMDAsIDIwMCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicm90YXRpb25aXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwicmVhZG9ubHlcIjogXCJcIixcbiAgICAgICAgICAgIFwiYWx0XCI6IFwicmVkIGhvcml6b250YWwgbGluZSByaWdodCwgZ3JlZW4gdmVydGljYWwgbGluZSBib3R0b20uIGJsYWNrIGJhY2tncm91bmQuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFjY2VsZXJhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTk0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBzeXN0ZW0gdmFyaWFibGUgcFJvdGF0aW9uWCBhbHdheXMgY29udGFpbnMgdGhlIHJvdGF0aW9uIG9mIHRoZVxcbmRldmljZSBhbG9uZyB0aGUgeCBheGlzIGluIHRoZSBmcmFtZSBwcmV2aW91cyB0byB0aGUgY3VycmVudCBmcmFtZS4gVmFsdWVcXG5pcyByZXByZXNlbnRlZCBhcyAwIHRvICsvLTE4MCBkZWdyZWVzLlxcbjxicj48YnI+XFxucFJvdGF0aW9uWCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggcm90YXRpb25YIHRvIGRldGVybWluZSB0aGUgcm90YXRlXFxuZGlyZWN0aW9uIG9mIHRoZSBkZXZpY2UgYWxvbmcgdGhlIFgtYXhpcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxcbjxjb2RlPlxcbi8vIEEgc2ltcGxlIGlmIHN0YXRlbWVudCBsb29raW5nIGF0IHdoZXRoZXJcXG4vLyByb3RhdGlvblggLSBwUm90YXRpb25YIDwgMCBpcyB0cnVlIG9yIG5vdCB3aWxsIGJlXFxuLy8gc3VmZmljaWVudCBmb3IgZGV0ZXJtaW5pbmcgdGhlIHJvdGF0ZSBkaXJlY3Rpb25cXG4vLyBpbiBtb3N0IGNhc2VzLlxcblxcbi8vIFNvbWUgZXh0cmEgbG9naWMgaXMgbmVlZGVkIHRvIGFjY291bnQgZm9yIGNhc2VzIHdoZXJlXFxuLy8gdGhlIGFuZ2xlcyB3cmFwIGFyb3VuZC5cXG52YXIgcm90YXRlRGlyZWN0aW9uID0gJ2Nsb2Nrd2lzZSc7XFxuXFxuLy8gU2ltcGxlIHJhbmdlIGNvbnZlcnNpb24gdG8gbWFrZSB0aGluZ3Mgc2ltcGxlci5cXG4vLyBUaGlzIGlzIG5vdCBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBidXQgdGhlIGxvZ2ljXFxuLy8gd2lsbCBiZSBkaWZmZXJlbnQgaW4gdGhhdCBjYXNlLlxcblxcbnZhciByWCA9IHJvdGF0aW9uWCArIDE4MDtcXG52YXIgcFJYID0gcFJvdGF0aW9uWCArIDE4MDtcXG5cXG5pZiAoKHJYIC0gcFJYID4gMCAmJiByWCAtIHBSWCA8IDI3MCkgfHwgclggLSBwUlggPCAtMjcwKSB7XFxuICByb3RhdGVEaXJlY3Rpb24gPSAnY2xvY2t3aXNlJztcXG59IGVsc2UgaWYgKHJYIC0gcFJYIDwgMCB8fCByWCAtIHBSWCA+IDI3MCkge1xcbiAgcm90YXRlRGlyZWN0aW9uID0gJ2NvdW50ZXItY2xvY2t3aXNlJztcXG59XFxuXFxucHJpbnQocm90YXRlRGlyZWN0aW9uKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIHRvIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBSb3RhdGlvblhcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBY2NlbGVyYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIzOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgc3lzdGVtIHZhcmlhYmxlIHBSb3RhdGlvblkgYWx3YXlzIGNvbnRhaW5zIHRoZSByb3RhdGlvbiBvZiB0aGVcXG5kZXZpY2UgYWxvbmcgdGhlIHkgYXhpcyBpbiB0aGUgZnJhbWUgcHJldmlvdXMgdG8gdGhlIGN1cnJlbnQgZnJhbWUuIFZhbHVlXFxuaXMgcmVwcmVzZW50ZWQgYXMgMCB0byArLy05MCBkZWdyZWVzLlxcbjxicj48YnI+XFxucFJvdGF0aW9uWSBjYW4gYWxzbyBiZSB1c2VkIHdpdGggcm90YXRpb25ZIHRvIGRldGVybWluZSB0aGUgcm90YXRlXFxuZGlyZWN0aW9uIG9mIHRoZSBkZXZpY2UgYWxvbmcgdGhlIFktYXhpcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxcbjxjb2RlPlxcbi8vIEEgc2ltcGxlIGlmIHN0YXRlbWVudCBsb29raW5nIGF0IHdoZXRoZXJcXG4vLyByb3RhdGlvblkgLSBwUm90YXRpb25ZIDwgMCBpcyB0cnVlIG9yIG5vdCB3aWxsIGJlXFxuLy8gc3VmZmljaWVudCBmb3IgZGV0ZXJtaW5pbmcgdGhlIHJvdGF0ZSBkaXJlY3Rpb25cXG4vLyBpbiBtb3N0IGNhc2VzLlxcblxcbi8vIFNvbWUgZXh0cmEgbG9naWMgaXMgbmVlZGVkIHRvIGFjY291bnQgZm9yIGNhc2VzIHdoZXJlXFxuLy8gdGhlIGFuZ2xlcyB3cmFwIGFyb3VuZC5cXG52YXIgcm90YXRlRGlyZWN0aW9uID0gJ2Nsb2Nrd2lzZSc7XFxuXFxuLy8gU2ltcGxlIHJhbmdlIGNvbnZlcnNpb24gdG8gbWFrZSB0aGluZ3Mgc2ltcGxlci5cXG4vLyBUaGlzIGlzIG5vdCBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBidXQgdGhlIGxvZ2ljXFxuLy8gd2lsbCBiZSBkaWZmZXJlbnQgaW4gdGhhdCBjYXNlLlxcblxcbnZhciByWSA9IHJvdGF0aW9uWSArIDE4MDtcXG52YXIgcFJZID0gcFJvdGF0aW9uWSArIDE4MDtcXG5cXG5pZiAoKHJZIC0gcFJZID4gMCAmJiByWSAtIHBSWSA8IDI3MCkgfHwgclkgLSBwUlkgPCAtMjcwKSB7XFxuICByb3RhdGVEaXJlY3Rpb24gPSAnY2xvY2t3aXNlJztcXG59IGVsc2UgaWYgKHJZIC0gcFJZIDwgMCB8fCByWSAtIHBSWSA+IDI3MCkge1xcbiAgcm90YXRlRGlyZWN0aW9uID0gJ2NvdW50ZXItY2xvY2t3aXNlJztcXG59XFxucHJpbnQocm90YXRlRGlyZWN0aW9uKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIHRvIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBSb3RhdGlvbllcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBY2NlbGVyYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI4MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgc3lzdGVtIHZhcmlhYmxlIHBSb3RhdGlvblogYWx3YXlzIGNvbnRhaW5zIHRoZSByb3RhdGlvbiBvZiB0aGVcXG5kZXZpY2UgYWxvbmcgdGhlIHogYXhpcyBpbiB0aGUgZnJhbWUgcHJldmlvdXMgdG8gdGhlIGN1cnJlbnQgZnJhbWUuIFZhbHVlXFxuaXMgcmVwcmVzZW50ZWQgYXMgMCB0byAzNTkgZGVncmVlcy5cXG48YnI+PGJyPlxcbnBSb3RhdGlvblogY2FuIGFsc28gYmUgdXNlZCB3aXRoIHJvdGF0aW9uWiB0byBkZXRlcm1pbmUgdGhlIHJvdGF0ZVxcbmRpcmVjdGlvbiBvZiB0aGUgZGV2aWNlIGFsb25nIHRoZSBaLWF4aXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz5cXG48Y29kZT5cXG4vLyBBIHNpbXBsZSBpZiBzdGF0ZW1lbnQgbG9va2luZyBhdCB3aGV0aGVyXFxuLy8gcm90YXRpb25aIC0gcFJvdGF0aW9uWiA8IDAgaXMgdHJ1ZSBvciBub3Qgd2lsbCBiZVxcbi8vIHN1ZmZpY2llbnQgZm9yIGRldGVybWluaW5nIHRoZSByb3RhdGUgZGlyZWN0aW9uXFxuLy8gaW4gbW9zdCBjYXNlcy5cXG5cXG4vLyBTb21lIGV4dHJhIGxvZ2ljIGlzIG5lZWRlZCB0byBhY2NvdW50IGZvciBjYXNlcyB3aGVyZVxcbi8vIHRoZSBhbmdsZXMgd3JhcCBhcm91bmQuXFxudmFyIHJvdGF0ZURpcmVjdGlvbiA9ICdjbG9ja3dpc2UnO1xcblxcbmlmIChcXG4gIChyb3RhdGlvblogLSBwUm90YXRpb25aID4gMCAmJiByb3RhdGlvblogLSBwUm90YXRpb25aIDwgMjcwKSB8fFxcbiAgcm90YXRpb25aIC0gcFJvdGF0aW9uWiA8IC0yNzBcXG4pIHtcXG4gIHJvdGF0ZURpcmVjdGlvbiA9ICdjbG9ja3dpc2UnO1xcbn0gZWxzZSBpZiAocm90YXRpb25aIC0gcFJvdGF0aW9uWiA8IDAgfHwgcm90YXRpb25aIC0gcFJvdGF0aW9uWiA+IDI3MCkge1xcbiAgcm90YXRlRGlyZWN0aW9uID0gJ2NvdW50ZXItY2xvY2t3aXNlJztcXG59XFxucHJpbnQocm90YXRlRGlyZWN0aW9uKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIHRvIGRpc3BsYXkuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBSb3RhdGlvblpcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBY2NlbGVyYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM0MSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidHVybkF4aXNcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBY2NlbGVyYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM1MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgc2V0TW92ZVRocmVzaG9sZCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBtb3ZlbWVudCB0aHJlc2hvbGQgZm9yXFxudGhlIGRldmljZU1vdmVkKCkgZnVuY3Rpb24uIFRoZSBkZWZhdWx0IHRocmVzaG9sZCBpcyBzZXQgdG8gMC41LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldE1vdmVUaHJlc2hvbGRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgdGhyZXNob2xkIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFjY2VsZXJhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzYyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBzZXRTaGFrZVRocmVzaG9sZCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBtb3ZlbWVudCB0aHJlc2hvbGQgZm9yXFxudGhlIGRldmljZVNoYWtlbigpIGZ1bmN0aW9uLiBUaGUgZGVmYXVsdCB0aHJlc2hvbGQgaXMgc2V0IHRvIDMwLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFNoYWtlVGhyZXNob2xkXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHRocmVzaG9sZCB2YWx1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBY2NlbGVyYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM3NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgZGV2aWNlTW92ZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIG1vdmVkIGJ5IG1vcmUgdGhhblxcbnRoZSB0aHJlc2hvbGQgdmFsdWUgYWxvbmcgWCwgWSBvciBaIGF4aXMuIFRoZSBkZWZhdWx0IHRocmVzaG9sZCBpcyBzZXQgdG9cXG4wLjUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGV2aWNlTW92ZWRcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuLy8gUnVuIHRoaXMgZXhhbXBsZSBvbiBhIG1vYmlsZSBkZXZpY2VcXG4vLyBNb3ZlIHRoZSBkZXZpY2UgYXJvdW5kXFxuLy8gdG8gY2hhbmdlIHRoZSB2YWx1ZS5cXG5cXG52YXIgdmFsdWUgPSAwO1xcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBmaWxsKHZhbHVlKTtcXG4gIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xcbn1cXG5mdW5jdGlvbiBkZXZpY2VNb3ZlZCgpIHtcXG4gIHZhbHVlID0gdmFsdWUgKyA1O1xcbiAgaWYgKHZhbHVlID4gMjU1KSB7XFxuICAgIHZhbHVlID0gMDtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCI1MHg1MCBibGFjayByZWN0IGluIGNlbnRlciBvZiBjYW52YXMuIHR1cm5zIHdoaXRlIG9uIG1vYmlsZSB3aGVuIGRldmljZSBtb3Zlc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBY2NlbGVyYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQwNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgZGV2aWNlVHVybmVkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGRldmljZSByb3RhdGVzIGJ5XFxubW9yZSB0aGFuIDkwIGRlZ3JlZXMgY29udGludW91c2x5Llxcbjxicj48YnI+XFxuVGhlIGF4aXMgdGhhdCB0cmlnZ2VycyB0aGUgZGV2aWNlVHVybmVkKCkgbWV0aG9kIGlzIHN0b3JlZCBpbiB0aGUgdHVybkF4aXNcXG52YXJpYWJsZS4gVGhlIGRldmljZVR1cm5lZCgpIG1ldGhvZCBjYW4gYmUgbG9ja2VkIHRvIHRyaWdnZXIgb24gYW55IGF4aXM6XFxuWCwgWSBvciBaIGJ5IGNvbXBhcmluZyB0aGUgdHVybkF4aXMgdmFyaWFibGUgdG8gJiMzOTtYJiMzOTssICYjMzk7WSYjMzk7IG9yICYjMzk7WiYjMzk7LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRldmljZVR1cm5lZFwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG4vLyBSdW4gdGhpcyBleGFtcGxlIG9uIGEgbW9iaWxlIGRldmljZVxcbi8vIFJvdGF0ZSB0aGUgZGV2aWNlIGJ5IDkwIGRlZ3JlZXNcXG4vLyB0byBjaGFuZ2UgdGhlIHZhbHVlLlxcblxcbnZhciB2YWx1ZSA9IDA7XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGZpbGwodmFsdWUpO1xcbiAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XFxufVxcbmZ1bmN0aW9uIGRldmljZVR1cm5lZCgpIHtcXG4gIGlmICh2YWx1ZSA9PT0gMCkge1xcbiAgICB2YWx1ZSA9IDI1NTtcXG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IDI1NSkge1xcbiAgICB2YWx1ZSA9IDA7XFxuICB9XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIFJ1biB0aGlzIGV4YW1wbGUgb24gYSBtb2JpbGUgZGV2aWNlXFxuLy8gUm90YXRlIHRoZSBkZXZpY2UgYnkgOTAgZGVncmVlcyBpbiB0aGVcXG4vLyBYLWF4aXMgdG8gY2hhbmdlIHRoZSB2YWx1ZS5cXG5cXG52YXIgdmFsdWUgPSAwO1xcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBmaWxsKHZhbHVlKTtcXG4gIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xcbn1cXG5mdW5jdGlvbiBkZXZpY2VUdXJuZWQoKSB7XFxuICBpZiAodHVybkF4aXMgPT09ICdYJykge1xcbiAgICBpZiAodmFsdWUgPT09IDApIHtcXG4gICAgICB2YWx1ZSA9IDI1NTtcXG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMjU1KSB7XFxuICAgICAgdmFsdWUgPSAwO1xcbiAgICB9XFxuICB9XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiNTB4NTAgYmxhY2sgcmVjdCBpbiBjZW50ZXIgb2YgY2FudmFzLiB0dXJucyB3aGl0ZSBvbiBtb2JpbGUgd2hlbiBkZXZpY2UgdHVybnNcXG41MHg1MCBibGFjayByZWN0IGluIGNlbnRlciBvZiBjYW52YXMuIHR1cm5zIHdoaXRlIG9uIG1vYmlsZSB3aGVuIHgtYXhpcyB0dXJuc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBY2NlbGVyYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ2NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgZGV2aWNlU2hha2VuKCkgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGRldmljZSB0b3RhbCBhY2NlbGVyYXRpb25cXG5jaGFuZ2VzIG9mIGFjY2VsZXJhdGlvblggYW5kIGFjY2VsZXJhdGlvblkgdmFsdWVzIGlzIG1vcmUgdGhhblxcbnRoZSB0aHJlc2hvbGQgdmFsdWUuIFRoZSBkZWZhdWx0IHRocmVzaG9sZCBpcyBzZXQgdG8gMzAuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGV2aWNlU2hha2VuXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbi8vIFJ1biB0aGlzIGV4YW1wbGUgb24gYSBtb2JpbGUgZGV2aWNlXFxuLy8gU2hha2UgdGhlIGRldmljZSB0byBjaGFuZ2UgdGhlIHZhbHVlLlxcblxcbnZhciB2YWx1ZSA9IDA7XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGZpbGwodmFsdWUpO1xcbiAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XFxufVxcbmZ1bmN0aW9uIGRldmljZVNoYWtlbigpIHtcXG4gIHZhbHVlID0gdmFsdWUgKyA1O1xcbiAgaWYgKHZhbHVlID4gMjU1KSB7XFxuICAgIHZhbHVlID0gMDtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCI1MHg1MCBibGFjayByZWN0IGluIGNlbnRlciBvZiBjYW52YXMuIHR1cm5zIHdoaXRlIG9uIG1vYmlsZSB3aGVuIGRldmljZSBzaGFrZXNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQWNjZWxlcmF0aW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9rZXlib2FyZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBib29sZWFuIHN5c3RlbSB2YXJpYWJsZSBrZXlJc1ByZXNzZWQgaXMgdHJ1ZSBpZiBhbnkga2V5IGlzIHByZXNzZWRcXG5hbmQgZmFsc2UgaWYgbm8ga2V5cyBhcmUgcHJlc3NlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImtleUlzUHJlc3NlZFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGlmIChrZXlJc1ByZXNzZWQgPT09IHRydWUpIHtcXG4gICAgZmlsbCgwKTtcXG4gIH0gZWxzZSB7XFxuICAgIGZpbGwoMjU1KTtcXG4gIH1cXG4gIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjUweDUwIHdoaXRlIHJlY3QgdGhhdCB0dXJucyBibGFjayBvbiBrZXlwcmVzcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiS2V5Ym9hcmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2tleWJvYXJkLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHN5c3RlbSB2YXJpYWJsZSBrZXkgYWx3YXlzIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgbW9zdCByZWNlbnRcXG5rZXkgb24gdGhlIGtleWJvYXJkIHRoYXQgd2FzIHR5cGVkLiBUbyBnZXQgdGhlIHByb3BlciBjYXBpdGFsaXphdGlvbiwgaXRcXG5pcyBiZXN0IHRvIHVzZSBpdCB3aXRoaW4ga2V5VHlwZWQoKS4gRm9yIG5vbi1BU0NJSSBrZXlzLCB1c2UgdGhlIGtleUNvZGVcXG52YXJpYWJsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImtleVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG4vLyBDbGljayBhbnkga2V5IHRvIGRpc3BsYXkgaXQhXFxuLy8gKE5vdCBHdWFyYW50ZWVkIHRvIGJlIENhc2UgU2Vuc2l0aXZlKVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgZmlsbCgyNDUsIDEyMywgMTU4KTtcXG4gIHRleHRTaXplKDUwKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHRleHQoa2V5LCAzMywgNjUpOyAvLyBEaXNwbGF5IGxhc3Qga2V5IHByZXNzZWQuXFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiY2FudmFzIGRpc3BsYXlzIGFueSBrZXkgdmFsdWUgdGhhdCBpcyBwcmVzc2VkIGluIHBpbmsgZm9udC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiS2V5Ym9hcmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2tleWJvYXJkLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHZhcmlhYmxlIGtleUNvZGUgaXMgdXNlZCB0byBkZXRlY3Qgc3BlY2lhbCBrZXlzIHN1Y2ggYXMgQkFDS1NQQUNFLFxcbkRFTEVURSwgRU5URVIsIFJFVFVSTiwgVEFCLCBFU0NBUEUsIFNISUZULCBDT05UUk9MLCBPUFRJT04sIEFMVCwgVVBfQVJST1csXFxuRE9XTl9BUlJPVywgTEVGVF9BUlJPVywgUklHSFRfQVJST1cuXFxuWW91IGNhbiBhbHNvIGNoZWNrIGZvciBjdXN0b20ga2V5cyBieSBsb29raW5nIHVwIHRoZSBrZXlDb2RlIG9mIGFueSBrZXlcXG5vbiBhIHNpdGUgbGlrZSB0aGlzOiA8YSBocmVmPVxcXCJodHRwOi8va2V5Y29kZS5pbmZvL1xcXCI+a2V5Y29kZS5pbmZvPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImtleUNvZGVcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgIFwicmVhZG9ubHlcIjogXCJcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBmaWxsVmFsID0gMTI2O1xcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBmaWxsKGZpbGxWYWwpO1xcbiAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XFxufVxcblxcbmZ1bmN0aW9uIGtleVByZXNzZWQoKSB7XFxuICBpZiAoa2V5Q29kZSA9PT0gVVBfQVJST1cpIHtcXG4gICAgZmlsbFZhbCA9IDI1NTtcXG4gIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gRE9XTl9BUlJPVykge1xcbiAgICBmaWxsVmFsID0gMDtcXG4gIH1cXG4gIHJldHVybiBmYWxzZTsgLy8gcHJldmVudCBkZWZhdWx0XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiR3JleSByZWN0IGNlbnRlci4gdHVybnMgd2hpdGUgd2hlbiB1cCBhcnJvdyBwcmVzc2VkIGFuZCBibGFjayB3aGVuIGRvd25cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiS2V5Ym9hcmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2tleWJvYXJkLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTA3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBrZXlQcmVzc2VkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZXZlcnkgdGltZSBhIGtleSBpcyBwcmVzc2VkLiBUaGVcXG5rZXlDb2RlIGZvciB0aGUga2V5IHRoYXQgd2FzIHByZXNzZWQgaXMgc3RvcmVkIGluIHRoZSBrZXlDb2RlIHZhcmlhYmxlLlxcbjxicj48YnI+XFxuRm9yIG5vbi1BU0NJSSBrZXlzLCB1c2UgdGhlIGtleUNvZGUgdmFyaWFibGUuIFlvdSBjYW4gY2hlY2sgaWYgdGhlIGtleUNvZGVcXG5lcXVhbHMgQkFDS1NQQUNFLCBERUxFVEUsIEVOVEVSLCBSRVRVUk4sIFRBQiwgRVNDQVBFLCBTSElGVCwgQ09OVFJPTCxcXG5PUFRJT04sIEFMVCwgVVBfQVJST1csIERPV05fQVJST1csIExFRlRfQVJST1csIFJJR0hUX0FSUk9XLlxcbjxicj48YnI+XFxuRm9yIEFTQ0lJIGtleXMgdGhhdCB3YXMgcHJlc3NlZCBpcyBzdG9yZWQgaW4gdGhlIGtleSB2YXJpYWJsZS4gSG93ZXZlciwgaXRcXG5kb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlLiBGb3IgdGhpcyByZWFzb24sIGl0XFxuaXMgcmVjb21tZW5kZWQgdG8gdXNlIGtleVR5cGVkKCkgdG8gcmVhZCB0aGUga2V5IHZhcmlhYmxlLCBpbiB3aGljaCB0aGVcXG5jYXNlIG9mIHRoZSB2YXJpYWJsZSB3aWxsIGJlIGRpc3Rpbmd1aXNoZWQuXFxuPGJyPjxicj5cXG5CZWNhdXNlIG9mIGhvdyBvcGVyYXRpbmcgc3lzdGVtcyBoYW5kbGUga2V5IHJlcGVhdHMsIGhvbGRpbmcgZG93biBhIGtleVxcbm1heSBjYXVzZSBtdWx0aXBsZSBjYWxscyB0byBrZXlUeXBlZCgpIChhbmQga2V5UmVsZWFzZWQoKSBhcyB3ZWxsKS4gVGhlXFxucmF0ZSBvZiByZXBlYXQgaXMgc2V0IGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBob3cgZWFjaCBjb21wdXRlciBpc1xcbmNvbmZpZ3VyZWQuPGJyPjxicj5cXG5Ccm93c2VycyBtYXkgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdFxcbmJlaGF2aW9ycyBhdHRhY2hlZCB0byB2YXJpb3VzIGtleSBldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHRcXG5iZWhhdmlvciBmb3IgdGhpcyBldmVudCwgYWRkICZxdW90O3JldHVybiBmYWxzZSZxdW90OyB0byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwia2V5UHJlc3NlZFwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIHZhbHVlID0gMDtcXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgZmlsbCh2YWx1ZSk7XFxuICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcXG59XFxuZnVuY3Rpb24ga2V5UHJlc3NlZCgpIHtcXG4gIGlmICh2YWx1ZSA9PT0gMCkge1xcbiAgICB2YWx1ZSA9IDI1NTtcXG4gIH0gZWxzZSB7XFxuICAgIHZhbHVlID0gMDtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIHZhbHVlID0gMDtcXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgZmlsbCh2YWx1ZSk7XFxuICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcXG59XFxuZnVuY3Rpb24ga2V5UHJlc3NlZCgpIHtcXG4gIGlmIChrZXlDb2RlID09PSBMRUZUX0FSUk9XKSB7XFxuICAgIHZhbHVlID0gMjU1O1xcbiAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBSSUdIVF9BUlJPVykge1xcbiAgICB2YWx1ZSA9IDA7XFxuICB9XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuZnVuY3Rpb24ga2V5UHJlc3NlZCgpIHtcXG4gIC8vIERvIHNvbWV0aGluZ1xcbiAgcmV0dXJuIGZhbHNlOyAvLyBwcmV2ZW50IGFueSBkZWZhdWx0IGJlaGF2aW91clxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImJsYWNrIHJlY3QgY2VudGVyLiB0dXJucyB3aGl0ZSB3aGVuIGtleSBwcmVzc2VkIGFuZCBibGFjayB3aGVuIHJlbGVhc2VkXFxuYmxhY2sgcmVjdCBjZW50ZXIuIHR1cm5zIHdoaXRlIHdoZW4gbGVmdCBhcnJvdyBwcmVzc2VkIGFuZCBibGFjayB3aGVuIHJpZ2h0LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJLZXlib2FyZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMva2V5Ym9hcmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxOTgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGtleVJlbGVhc2VkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZXZlcnkgdGltZSBhIGtleSBpcyByZWxlYXNlZC5cXG5TZWUga2V5IGFuZCBrZXlDb2RlIGZvciBtb3JlIGluZm9ybWF0aW9uLjxicj48YnI+XFxuQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHRcXG5iZWhhdmlvcnMgYXR0YWNoZWQgdG8gdmFyaW91cyBrZXkgZXZlbnRzLiBUbyBwcmV2ZW50IGFueSBkZWZhdWx0XFxuYmVoYXZpb3IgZm9yIHRoaXMgZXZlbnQsIGFkZCAmcXVvdDtyZXR1cm4gZmFsc2UmcXVvdDsgdG8gdGhlIGVuZCBvZiB0aGUgbWV0aG9kLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImtleVJlbGVhc2VkXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgdmFsdWUgPSAwO1xcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBmaWxsKHZhbHVlKTtcXG4gIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xcbn1cXG5mdW5jdGlvbiBrZXlSZWxlYXNlZCgpIHtcXG4gIGlmICh2YWx1ZSA9PT0gMCkge1xcbiAgICB2YWx1ZSA9IDI1NTtcXG4gIH0gZWxzZSB7XFxuICAgIHZhbHVlID0gMDtcXG4gIH1cXG4gIHJldHVybiBmYWxzZTsgLy8gcHJldmVudCBhbnkgZGVmYXVsdCBiZWhhdmlvclxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImJsYWNrIHJlY3QgY2VudGVyLiB0dXJucyB3aGl0ZSB3aGVuIGtleSBwcmVzc2VkIGFuZCBibGFjayB3aGVuIHByZXNzZWQgYWdhaW5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiS2V5Ym9hcmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2tleWJvYXJkLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjU0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBrZXlUeXBlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGV2ZXJ5IHRpbWUgYSBrZXkgaXMgcHJlc3NlZCwgYnV0XFxuYWN0aW9uIGtleXMgc3VjaCBhcyBDdHJsLCBTaGlmdCwgYW5kIEFsdCBhcmUgaWdub3JlZC4gVGhlIG1vc3QgcmVjZW50XFxua2V5IHByZXNzZWQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGtleSB2YXJpYWJsZS5cXG48YnI+PGJyPlxcbkJlY2F1c2Ugb2YgaG93IG9wZXJhdGluZyBzeXN0ZW1zIGhhbmRsZSBrZXkgcmVwZWF0cywgaG9sZGluZyBkb3duIGEga2V5XFxud2lsbCBjYXVzZSBtdWx0aXBsZSBjYWxscyB0byBrZXlUeXBlZCgpIChhbmQga2V5UmVsZWFzZWQoKSBhcyB3ZWxsKS4gVGhlXFxucmF0ZSBvZiByZXBlYXQgaXMgc2V0IGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBob3cgZWFjaCBjb21wdXRlciBpc1xcbmNvbmZpZ3VyZWQuPGJyPjxicj5cXG5Ccm93c2VycyBtYXkgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdCBiZWhhdmlvcnMgYXR0YWNoZWQgdG8gdmFyaW91cyBrZXlcXG5ldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHQgYmVoYXZpb3IgZm9yIHRoaXMgZXZlbnQsIGFkZCAmcXVvdDtyZXR1cm4gZmFsc2UmcXVvdDtcXG50byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwia2V5VHlwZWRcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciB2YWx1ZSA9IDA7XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGZpbGwodmFsdWUpO1xcbiAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XFxufVxcbmZ1bmN0aW9uIGtleVR5cGVkKCkge1xcbiAgaWYgKGtleSA9PT0gJ2EnKSB7XFxuICAgIHZhbHVlID0gMjU1O1xcbiAgfSBlbHNlIGlmIChrZXkgPT09ICdiJykge1xcbiAgICB2YWx1ZSA9IDA7XFxuICB9XFxuICAvLyB1bmNvbW1lbnQgdG8gcHJldmVudCBhbnkgZGVmYXVsdCBiZWhhdmlvclxcbiAgLy8gcmV0dXJuIGZhbHNlO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImJsYWNrIHJlY3QgY2VudGVyLiB0dXJucyB3aGl0ZSB3aGVuICdhJyBrZXkgdHlwZWQgYW5kIGJsYWNrIHdoZW4gJ2InIHByZXNzZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiS2V5Ym9hcmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL2tleWJvYXJkLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzA4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBvbmJsdXIgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgaXMgbm8gbG9uZ2VyIGZvY3VzZWRcXG5vbiB0aGUgcDUgZWxlbWVudC4gQmVjYXVzZSB0aGUga2V5dXAgZXZlbnRzIHdpbGwgbm90IGZpcmUgaWYgdGhlIHVzZXIgaXNcXG5ub3QgZm9jdXNlZCBvbiB0aGUgZWxlbWVudCB3ZSBtdXN0IGFzc3VtZSBhbGwga2V5cyBjdXJyZW50bHkgZG93biBoYXZlXFxuYmVlbiByZWxlYXNlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIktleWJvYXJkXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9rZXlib2FyZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMxOCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUga2V5SXNEb3duKCkgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBrZXkgaXMgY3VycmVudGx5IGRvd24sIGkuZS4gcHJlc3NlZC5cXG5JdCBjYW4gYmUgdXNlZCBpZiB5b3UgaGF2ZSBhbiBvYmplY3QgdGhhdCBtb3ZlcywgYW5kIHlvdSB3YW50IHNldmVyYWwga2V5c1xcbnRvIGJlIGFibGUgdG8gYWZmZWN0IGl0cyBiZWhhdmlvdXIgc2ltdWx0YW5lb3VzbHksIHN1Y2ggYXMgbW92aW5nIGFcXG5zcHJpdGUgZGlhZ29uYWxseS4gWW91IGNhbiBwdXQgaW4gYW55IG51bWJlciByZXByZXNlbnRpbmcgdGhlIGtleUNvZGUgb2ZcXG50aGUga2V5LCBvciB1c2UgYW55IG9mIHRoZSB2YXJpYWJsZSBrZXlDb2RlIG5hbWVzIGxpc3RlZFxcbjxhIGhyZWY9XFxcImh0dHA6Ly9wNWpzLm9yZy9yZWZlcmVuY2UvI3A1L2tleUNvZGVcXFwiPmhlcmU8L2E+LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImtleUlzRG93blwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29kZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGtleSB0byBjaGVjayBmb3IuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIndoZXRoZXIga2V5IGlzIGRvd24gb3Igbm90XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHggPSAxMDA7XFxudmFyIHkgPSAxMDA7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoNTEyLCA1MTIpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgaWYgKGtleUlzRG93bihMRUZUX0FSUk9XKSkge1xcbiAgICB4IC09IDU7XFxuICB9XFxuXFxuICBpZiAoa2V5SXNEb3duKFJJR0hUX0FSUk9XKSkge1xcbiAgICB4ICs9IDU7XFxuICB9XFxuXFxuICBpZiAoa2V5SXNEb3duKFVQX0FSUk9XKSkge1xcbiAgICB5IC09IDU7XFxuICB9XFxuXFxuICBpZiAoa2V5SXNEb3duKERPV05fQVJST1cpKSB7XFxuICAgIHkgKz0gNTtcXG4gIH1cXG5cXG4gIGNsZWFyKCk7XFxuICBmaWxsKDI1NSwgMCwgMCk7XFxuICBlbGxpcHNlKHgsIHksIDUwLCA1MCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiNTB4NTAgcmVkIGVsbGlwc2UgbW92ZXMgbGVmdCwgcmlnaHQsIHVwIGFuZCBkb3duIHdpdGggYXJyb3cgcHJlc3Nlcy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiS2V5Ym9hcmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHN5c3RlbSB2YXJpYWJsZSBtb3VzZVggYWx3YXlzIGNvbnRhaW5zIHRoZSBjdXJyZW50IGhvcml6b250YWxcXG5wb3NpdGlvbiBvZiB0aGUgbW91c2UsIHJlbGF0aXZlIHRvICgwLCAwKSBvZiB0aGUgY2FudmFzLiBJZiB0b3VjaCBpc1xcbnVzZWQgaW5zdGVhZCBvZiBtb3VzZSBpbnB1dCwgbW91c2VYIHdpbGwgaG9sZCB0aGUgeCB2YWx1ZSBvZiB0aGUgbW9zdFxcbnJlY2VudCB0b3VjaCBwb2ludC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1vdXNlWFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBNb3ZlIHRoZSBtb3VzZSBhY3Jvc3MgdGhlIGNhbnZhc1xcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDI0NCwgMjQ4LCAyNTIpO1xcbiAgbGluZShtb3VzZVgsIDAsIG1vdXNlWCwgMTAwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJob3Jpem9udGFsIGJsYWNrIGxpbmUgbW92ZXMgbGVmdCBhbmQgcmlnaHQgd2l0aCBtb3VzZSB4LXBvc2l0aW9uXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1vdXNlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9tb3VzZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBzeXN0ZW0gdmFyaWFibGUgbW91c2VZIGFsd2F5cyBjb250YWlucyB0aGUgY3VycmVudCB2ZXJ0aWNhbCBwb3NpdGlvblxcbm9mIHRoZSBtb3VzZSwgcmVsYXRpdmUgdG8gKDAsIDApIG9mIHRoZSBjYW52YXMuIElmIHRvdWNoIGlzXFxudXNlZCBpbnN0ZWFkIG9mIG1vdXNlIGlucHV0LCBtb3VzZVkgd2lsbCBob2xkIHRoZSB5IHZhbHVlIG9mIHRoZSBtb3N0XFxucmVjZW50IHRvdWNoIHBvaW50LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibW91c2VZXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwicmVhZG9ubHlcIjogXCJcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbi8vIE1vdmUgdGhlIG1vdXNlIGFjcm9zcyB0aGUgY2FudmFzXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjQ0LCAyNDgsIDI1Mik7XFxuICBsaW5lKDAsIG1vdXNlWSwgMTAwLCBtb3VzZVkpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInZlcnRpY2FsIGJsYWNrIGxpbmUgbW92ZXMgdXAgYW5kIGRvd24gd2l0aCBtb3VzZSB5LXBvc2l0aW9uXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1vdXNlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9tb3VzZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBzeXN0ZW0gdmFyaWFibGUgcG1vdXNlWCBhbHdheXMgY29udGFpbnMgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2ZcXG50aGUgbW91c2Ugb3IgZmluZ2VyIGluIHRoZSBmcmFtZSBwcmV2aW91cyB0byB0aGUgY3VycmVudCBmcmFtZSwgcmVsYXRpdmUgdG9cXG4oMCwgMCkgb2YgdGhlIGNhbnZhcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBtb3VzZVhcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gTW92ZSB0aGUgbW91c2UgYWNyb3NzIHRoZSBjYW52YXMgdG8gbGVhdmUgYSB0cmFpbFxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy9zbG93IGRvd24gdGhlIGZyYW1lUmF0ZSB0byBtYWtlIGl0IG1vcmUgdmlzaWJsZVxcbiAgZnJhbWVSYXRlKDEwKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjQ0LCAyNDgsIDI1Mik7XFxuICBsaW5lKG1vdXNlWCwgbW91c2VZLCBwbW91c2VYLCBwbW91c2VZKTtcXG4gIHByaW50KHBtb3VzZVggKyAnIC0+ICcgKyBtb3VzZVgpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImxpbmUgdHJhaWwgaXMgY3JlYXRlZCBmcm9tIGN1cnNvciBtb3ZlbWVudHMuIGZhc3RlciBtb3ZlbWVudCBtYWtlIGxvbmdlciBsaW5lLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNb3VzZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvbW91c2UuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHN5c3RlbSB2YXJpYWJsZSBwbW91c2VZIGFsd2F5cyBjb250YWlucyB0aGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlXFxubW91c2Ugb3IgZmluZ2VyIGluIHRoZSBmcmFtZSBwcmV2aW91cyB0byB0aGUgY3VycmVudCBmcmFtZSwgcmVsYXRpdmUgdG9cXG4oMCwgMCkgb2YgdGhlIGNhbnZhcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBtb3VzZVlcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjM3LCAzNCwgOTMpO1xcbiAgZmlsbCgwKTtcXG4gIC8vZHJhdyBhIHNxdWFyZSBvbmx5IGlmIHRoZSBtb3VzZSBpcyBub3QgbW92aW5nXFxuICBpZiAobW91c2VZID09PSBwbW91c2VZICYmIG1vdXNlWCA9PT0gcG1vdXNlWCkge1xcbiAgICByZWN0KDIwLCAyMCwgNjAsIDYwKTtcXG4gIH1cXG5cXG4gIHByaW50KHBtb3VzZVkgKyAnIC0+ICcgKyBtb3VzZVkpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjYweDYwIGJsYWNrIHJlY3QgY2VudGVyLCBmdXNjaGlhIGJhY2tncm91bmQuIHJlY3QgZmxpY2tlcnMgb24gbW91c2UgbW92ZW1lbnRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTW91c2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTM1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBzeXN0ZW0gdmFyaWFibGUgd2luTW91c2VYIGFsd2F5cyBjb250YWlucyB0aGUgY3VycmVudCBob3Jpem9udGFsXFxucG9zaXRpb24gb2YgdGhlIG1vdXNlLCByZWxhdGl2ZSB0byAoMCwgMCkgb2YgdGhlIHdpbmRvdy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIndpbk1vdXNlWFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgbXlDYW52YXM7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAvL3VzZSBhIHZhcmlhYmxlIHRvIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgY2FudmFzXFxuICBteUNhbnZhcyA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIzNywgMzQsIDkzKTtcXG4gIGZpbGwoMCk7XFxuXFxuICAvL21vdmUgdGhlIGNhbnZhcyB0byB0aGUgaG9yaXpvbnRhbCBtb3VzZSBwb3NpdGlvblxcbiAgLy9yZWxhICAgICAgICAgICAgICAgICAgICB0aXZlIHRvIHRoZSB3aW5kb3dcXG4gIG15Q2FudmFzLnBvc2l0aW9uKHdpbk1vdXNlWCArIDEsIHdpbmRvd0hlaWdodCAvIDIpO1xcblxcbiAgLy90aGUgeSBvZiB0aGUgc3F1YXJlIGlzIHJlbGF0aXZlIHRvIHRoZSBjYW52YXNcXG4gIHJlY3QoMjAsIG1vdXNlWSwgNjAsIDYwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCI2MHg2MCBibGFjayByZWN0IHkgbW92ZXMgd2l0aCBtb3VzZSB5IGFuZCBmdXNjaGlhIGNhbnZhcyBtb3ZlcyB3aXRoIG1vdXNlIHhcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTW91c2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTcyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBzeXN0ZW0gdmFyaWFibGUgd2luTW91c2VZIGFsd2F5cyBjb250YWlucyB0aGUgY3VycmVudCB2ZXJ0aWNhbFxcbnBvc2l0aW9uIG9mIHRoZSBtb3VzZSwgcmVsYXRpdmUgdG8gKDAsIDApIG9mIHRoZSB3aW5kb3cuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5Nb3VzZVlcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIG15Q2FudmFzO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy91c2UgYSB2YXJpYWJsZSB0byBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGNhbnZhc1xcbiAgbXlDYW52YXMgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMzcsIDM0LCA5Myk7XFxuICBmaWxsKDApO1xcblxcbiAgLy9tb3ZlIHRoZSBjYW52YXMgdG8gdGhlIHZlcnRpY2FsIG1vdXNlIHBvc2l0aW9uXFxuICAvL3JlbCAgICAgICAgICAgICAgICAgICAgYXRpdmUgdG8gdGhlIHdpbmRvd1xcbiAgbXlDYW52YXMucG9zaXRpb24od2luZG93V2lkdGggLyAyLCB3aW5Nb3VzZVkgKyAxKTtcXG5cXG4gIC8vdGhlIHggb2YgdGhlIHNxdWFyZSBpcyByZWxhdGl2ZSB0byB0aGUgY2FudmFzXFxuICByZWN0KG1vdXNlWCwgMjAsIDYwLCA2MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiNjB4NjAgYmxhY2sgcmVjdCB4IG1vdmVzIHdpdGggbW91c2UgeCBhbmQgZnVzY2hpYSBjYW52YXMgeSBtb3ZlcyB3aXRoIG1vdXNlIHlcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTW91c2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjA5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBzeXN0ZW0gdmFyaWFibGUgcHdpbk1vdXNlWCBhbHdheXMgY29udGFpbnMgdGhlIGhvcml6b250YWwgcG9zaXRpb25cXG5vZiB0aGUgbW91c2UgaW4gdGhlIGZyYW1lIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IGZyYW1lLCByZWxhdGl2ZSB0b1xcbigwLCAwKSBvZiB0aGUgd2luZG93LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicHdpbk1vdXNlWFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgbXlDYW52YXM7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAvL3VzZSBhIHZhcmlhYmxlIHRvIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgY2FudmFzXFxuICBteUNhbnZhcyA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBub1N0cm9rZSgpO1xcbiAgZmlsbCgyMzcsIDM0LCA5Myk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBjbGVhcigpO1xcbiAgLy90aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHByZXZpb3VzIGFuZFxcbiAgLy9jdXJyZW50IHggcG9zaXRpb24gaXMgdGhlIGhvcml6b250YWwgbW91c2Ugc3BlZWRcXG4gIHZhciBzcGVlZCA9IGFicyh3aW5Nb3VzZVggLSBwd2luTW91c2VYKTtcXG4gIC8vY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBjaXJjbGVcXG4gIC8vYWNjb3JkaW5nIHRvIHRoZSBob3Jpem9udGFsIHNwZWVkXFxuICBlbGxpcHNlKDUwLCA1MCwgMTAgKyBzcGVlZCAqIDUsIDEwICsgc3BlZWQgKiA1KTtcXG4gIC8vbW92ZSB0aGUgY2FudmFzIHRvIHRoZSBtb3VzZSBwb3NpdGlvblxcbiAgbXlDYW52YXMucG9zaXRpb24od2luTW91c2VYICsgMSwgd2luTW91c2VZICsgMSk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiZnVzY2hpYSBlbGxpcHNlIG1vdmVzIHdpdGggbW91c2UgeCBhbmQgeS4gR3Jvd3MgYW5kIHNocmlua3Mgd2l0aCBtb3VzZSBzcGVlZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNb3VzZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvbW91c2UuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNDksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHN5c3RlbSB2YXJpYWJsZSBwd2luTW91c2VZIGFsd2F5cyBjb250YWlucyB0aGUgdmVydGljYWwgcG9zaXRpb24gb2ZcXG50aGUgbW91c2UgaW4gdGhlIGZyYW1lIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IGZyYW1lLCByZWxhdGl2ZSB0byAoMCwgMClcXG5vZiB0aGUgd2luZG93LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicHdpbk1vdXNlWVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgbXlDYW52YXM7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAvL3VzZSBhIHZhcmlhYmxlIHRvIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgY2FudmFzXFxuICBteUNhbnZhcyA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBub1N0cm9rZSgpO1xcbiAgZmlsbCgyMzcsIDM0LCA5Myk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBjbGVhcigpO1xcbiAgLy90aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHByZXZpb3VzIGFuZFxcbiAgLy9jdXJyZW50IHkgcG9zaXRpb24gaXMgdGhlIHZlcnRpY2FsIG1vdXNlIHNwZWVkXFxuICB2YXIgc3BlZWQgPSBhYnMod2luTW91c2VZIC0gcHdpbk1vdXNlWSk7XFxuICAvL2NoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgY2lyY2xlXFxuICAvL2FjY29yZGluZyB0byB0aGUgdmVydGljYWwgc3BlZWRcXG4gIGVsbGlwc2UoNTAsIDUwLCAxMCArIHNwZWVkICogNSwgMTAgKyBzcGVlZCAqIDUpO1xcbiAgLy9tb3ZlIHRoZSBjYW52YXMgdG8gdGhlIG1vdXNlIHBvc2l0aW9uXFxuICBteUNhbnZhcy5wb3NpdGlvbih3aW5Nb3VzZVggKyAxLCB3aW5Nb3VzZVkgKyAxKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJmdXNjaGlhIGVsbGlwc2UgbW92ZXMgd2l0aCBtb3VzZSB4IGFuZCB5LiBHcm93cyBhbmQgc2hyaW5rcyB3aXRoIG1vdXNlIHNwZWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1vdXNlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9tb3VzZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI5MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Qcm9jZXNzaW5nIGF1dG9tYXRpY2FsbHkgdHJhY2tzIGlmIHRoZSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgd2hpY2hcXG5idXR0b24gaXMgcHJlc3NlZC4gVGhlIHZhbHVlIG9mIHRoZSBzeXN0ZW0gdmFyaWFibGUgbW91c2VCdXR0b24gaXMgZWl0aGVyXFxuTEVGVCwgUklHSFQsIG9yIENFTlRFUiBkZXBlbmRpbmcgb24gd2hpY2ggYnV0dG9uIHdhcyBwcmVzc2VkIGxhc3QuXFxuV2FybmluZzogZGlmZmVyZW50IGJyb3dzZXJzIG1heSB0cmFjayBtb3VzZUJ1dHRvbiBkaWZmZXJlbnRseS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1vdXNlQnV0dG9uXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJDb25zdGFudFwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjM3LCAzNCwgOTMpO1xcbiAgZmlsbCgwKTtcXG5cXG4gIGlmIChtb3VzZUlzUHJlc3NlZCkge1xcbiAgICBpZiAobW91c2VCdXR0b24gPT09IExFRlQpIHtcXG4gICAgICBlbGxpcHNlKDUwLCA1MCwgNTAsIDUwKTtcXG4gICAgfVxcbiAgICBpZiAobW91c2VCdXR0b24gPT09IFJJR0hUKSB7XFxuICAgICAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XFxuICAgIH1cXG4gICAgaWYgKG1vdXNlQnV0dG9uID09PSBDRU5URVIpIHtcXG4gICAgICB0cmlhbmdsZSgyMywgNzUsIDUwLCAyMCwgNzgsIDc1KTtcXG4gICAgfVxcbiAgfVxcblxcbiAgcHJpbnQobW91c2VCdXR0b24pO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjUweDUwIGJsYWNrIGVsbGlwc2UgYXBwZWFycyBvbiBjZW50ZXIgb2YgZnVzY2hpYSBjYW52YXMgb24gbW91c2UgY2xpY2svcHJlc3MuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1vdXNlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy9tb3VzZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMyOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgYm9vbGVhbiBzeXN0ZW0gdmFyaWFibGUgbW91c2VJc1ByZXNzZWQgaXMgdHJ1ZSBpZiB0aGUgbW91c2UgaXMgcHJlc3NlZFxcbmFuZCBmYWxzZSBpZiBub3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtb3VzZUlzUHJlc3NlZFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjM3LCAzNCwgOTMpO1xcbiAgZmlsbCgwKTtcXG5cXG4gIGlmIChtb3VzZUlzUHJlc3NlZCkge1xcbiAgICBlbGxpcHNlKDUwLCA1MCwgNTAsIDUwKTtcXG4gIH0gZWxzZSB7XFxuICAgIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xcbiAgfVxcblxcbiAgcHJpbnQobW91c2VJc1ByZXNzZWQpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImJsYWNrIDUweDUwIHJlY3QgYmVjb21lcyBlbGxpcHNlIHdpdGggbW91c2UgY2xpY2svcHJlc3MuIGZ1c2NoaWEgYmFja2dyb3VuZC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTW91c2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDE4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBtb3VzZU1vdmVkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIG1vdXNlIG1vdmVzIGFuZCBhIG1vdXNlXFxuYnV0dG9uIGlzIG5vdCBwcmVzc2VkLjxicj48YnI+XFxuQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHRcXG5iZWhhdmlvcnMgYXR0YWNoZWQgdG8gdmFyaW91cyBtb3VzZSBldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHRcXG5iZWhhdmlvciBmb3IgdGhpcyBldmVudCwgYWRkICZxdW90O3JldHVybiBmYWxzZSZxdW90OyB0byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibW91c2VNb3ZlZFwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gTW92ZSB0aGUgbW91c2UgYWNyb3NzIHRoZSBwYWdlXFxuLy8gdG8gY2hhbmdlIGl0cyB2YWx1ZVxcblxcbnZhciB2YWx1ZSA9IDA7XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGZpbGwodmFsdWUpO1xcbiAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XFxufVxcbmZ1bmN0aW9uIG1vdXNlTW92ZWQoKSB7XFxuICB2YWx1ZSA9IHZhbHVlICsgNTtcXG4gIGlmICh2YWx1ZSA+IDI1NSkge1xcbiAgICB2YWx1ZSA9IDA7XFxuICB9XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuZnVuY3Rpb24gbW91c2VNb3ZlZCgpIHtcXG4gIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDUsIDUpO1xcbiAgLy8gcHJldmVudCBkZWZhdWx0XFxuICByZXR1cm4gZmFsc2U7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiYmxhY2sgNTB4NTAgcmVjdCBiZWNvbWVzIGxpZ2h0ZXIgd2l0aCBtb3VzZSBtb3ZlbWVudHMgdW50aWwgd2hpdGUgdGhlbiByZXNldHNcXG5ubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTW91c2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDYyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBtb3VzZURyYWdnZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBldmVyeSB0aW1lIHRoZSBtb3VzZSBtb3ZlcyBhbmRcXG5hIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkLiBJZiBubyBtb3VzZURyYWdnZWQoKSBmdW5jdGlvbiBpcyBkZWZpbmVkLCB0aGVcXG50b3VjaE1vdmVkKCkgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW5zdGVhZCBpZiBpdCBpcyBkZWZpbmVkLjxicj48YnI+XFxuQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHRcXG5iZWhhdmlvcnMgYXR0YWNoZWQgdG8gdmFyaW91cyBtb3VzZSBldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHRcXG5iZWhhdmlvciBmb3IgdGhpcyBldmVudCwgYWRkICZxdW90O3JldHVybiBmYWxzZSZxdW90OyB0byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibW91c2VEcmFnZ2VkXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBEcmFnIHRoZSBtb3VzZSBhY3Jvc3MgdGhlIHBhZ2VcXG4vLyB0byBjaGFuZ2UgaXRzIHZhbHVlXFxuXFxudmFyIHZhbHVlID0gMDtcXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgZmlsbCh2YWx1ZSk7XFxuICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcXG59XFxuZnVuY3Rpb24gbW91c2VEcmFnZ2VkKCkge1xcbiAgdmFsdWUgPSB2YWx1ZSArIDU7XFxuICBpZiAodmFsdWUgPiAyNTUpIHtcXG4gICAgdmFsdWUgPSAwO1xcbiAgfVxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIG1vdXNlRHJhZ2dlZCgpIHtcXG4gIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDUsIDUpO1xcbiAgLy8gcHJldmVudCBkZWZhdWx0XFxuICByZXR1cm4gZmFsc2U7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiYmxhY2sgNTB4NTAgcmVjdCB0dXJucyBsaWdodGVyIHdpdGggbW91c2UgY2xpY2sgYW5kIGRyYWcgdW50aWwgd2hpdGUsIHJlc2V0c1xcbm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNb3VzZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvbW91c2UuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MzIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIG1vdXNlUHJlc3NlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGFmdGVyIGV2ZXJ5IHRpbWUgYSBtb3VzZSBidXR0b25cXG5pcyBwcmVzc2VkLiBUaGUgbW91c2VCdXR0b24gdmFyaWFibGUgKHNlZSB0aGUgcmVsYXRlZCByZWZlcmVuY2UgZW50cnkpXFxuY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLiBJZiBub1xcbm1vdXNlUHJlc3NlZCgpIGZ1bmN0aW9uIGlzIGRlZmluZWQsIHRoZSB0b3VjaFN0YXJ0ZWQoKSBmdW5jdGlvbiB3aWxsIGJlXFxuY2FsbGVkIGluc3RlYWQgaWYgaXQgaXMgZGVmaW5lZC48YnI+PGJyPlxcbkJyb3dzZXJzIG1heSBoYXZlIGRpZmZlcmVudCBkZWZhdWx0XFxuYmVoYXZpb3JzIGF0dGFjaGVkIHRvIHZhcmlvdXMgbW91c2UgZXZlbnRzLiBUbyBwcmV2ZW50IGFueSBkZWZhdWx0XFxuYmVoYXZpb3IgZm9yIHRoaXMgZXZlbnQsIGFkZCAmcXVvdDtyZXR1cm4gZmFsc2UmcXVvdDsgdG8gdGhlIGVuZCBvZiB0aGUgbWV0aG9kLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1vdXNlUHJlc3NlZFwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gQ2xpY2sgd2l0aGluIHRoZSBpbWFnZSB0byBjaGFuZ2VcXG4vLyB0aGUgdmFsdWUgb2YgdGhlIHJlY3RhbmdsZVxcblxcbnZhciB2YWx1ZSA9IDA7XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGZpbGwodmFsdWUpO1xcbiAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XFxufVxcbmZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcXG4gIGlmICh2YWx1ZSA9PT0gMCkge1xcbiAgICB2YWx1ZSA9IDI1NTtcXG4gIH0gZWxzZSB7XFxuICAgIHZhbHVlID0gMDtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG5mdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XFxuICBlbGxpcHNlKG1vdXNlWCwgbW91c2VZLCA1LCA1KTtcXG4gIC8vIHByZXZlbnQgZGVmYXVsdFxcbiAgcmV0dXJuIGZhbHNlO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImJsYWNrIDUweDUwIHJlY3QgdHVybnMgd2hpdGUgd2l0aCBtb3VzZSBjbGljay9wcmVzcy5cXG5ubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTW91c2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTk4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBtb3VzZVJlbGVhc2VkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBtb3VzZSBidXR0b24gaXNcXG5yZWxlYXNlZC4gSWYgbm8gbW91c2VSZWxlYXNlZCgpIGZ1bmN0aW9uIGlzIGRlZmluZWQsIHRoZSB0b3VjaEVuZGVkKClcXG5mdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpbnN0ZWFkIGlmIGl0IGlzIGRlZmluZWQuPGJyPjxicj5cXG5Ccm93c2VycyBtYXkgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdFxcbmJlaGF2aW9ycyBhdHRhY2hlZCB0byB2YXJpb3VzIG1vdXNlIGV2ZW50cy4gVG8gcHJldmVudCBhbnkgZGVmYXVsdFxcbmJlaGF2aW9yIGZvciB0aGlzIGV2ZW50LCBhZGQgJnF1b3Q7cmV0dXJuIGZhbHNlJnF1b3Q7IHRvIHRoZSBlbmQgb2YgdGhlIG1ldGhvZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtb3VzZVJlbGVhc2VkXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBDbGljayB3aXRoaW4gdGhlIGltYWdlIHRvIGNoYW5nZVxcbi8vIHRoZSB2YWx1ZSBvZiB0aGUgcmVjdGFuZ2xlXFxuLy8gYWZ0ZXIgdGhlIG1vdXNlIGhhcyBiZWVuIGNsaWNrZWRcXG5cXG52YXIgdmFsdWUgPSAwO1xcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBmaWxsKHZhbHVlKTtcXG4gIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xcbn1cXG5mdW5jdGlvbiBtb3VzZVJlbGVhc2VkKCkge1xcbiAgaWYgKHZhbHVlID09PSAwKSB7XFxuICAgIHZhbHVlID0gMjU1O1xcbiAgfSBlbHNlIHtcXG4gICAgdmFsdWUgPSAwO1xcbiAgfVxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIG1vdXNlUmVsZWFzZWQoKSB7XFxuICBlbGxpcHNlKG1vdXNlWCwgbW91c2VZLCA1LCA1KTtcXG4gIC8vIHByZXZlbnQgZGVmYXVsdFxcbiAgcmV0dXJuIGZhbHNlO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImJsYWNrIDUweDUwIHJlY3QgdHVybnMgd2hpdGUgd2l0aCBtb3VzZSBjbGljay9wcmVzcy5cXG5ubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTW91c2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjY1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBtb3VzZUNsaWNrZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBhIG1vdXNlIGJ1dHRvbiBoYXMgYmVlblxcbnByZXNzZWQgYW5kIHRoZW4gcmVsZWFzZWQuPGJyPjxicj5cXG5Ccm93c2VycyBoYW5kbGUgY2xpY2tzIGRpZmZlcmVudGx5LCBzbyB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZVxcbnJ1biB3aGVuIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbiBpcyBjbGlja2VkLiBUbyBoYW5kbGUgb3RoZXIgbW91c2UgYnV0dG9uc1xcbmJlaW5nIHByZXNzZWQgb3IgcmVsZWFzZWQsIHNlZSBtb3VzZVByZXNzZWQoKSBvciBtb3VzZVJlbGVhc2VkKCkuPGJyPjxicj5cXG5Ccm93c2VycyBtYXkgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdFxcbmJlaGF2aW9ycyBhdHRhY2hlZCB0byB2YXJpb3VzIG1vdXNlIGV2ZW50cy4gVG8gcHJldmVudCBhbnkgZGVmYXVsdFxcbmJlaGF2aW9yIGZvciB0aGlzIGV2ZW50LCBhZGQgJnF1b3Q7cmV0dXJuIGZhbHNlJnF1b3Q7IHRvIHRoZSBlbmQgb2YgdGhlIG1ldGhvZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtb3VzZUNsaWNrZWRcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbi8vIENsaWNrIHdpdGhpbiB0aGUgaW1hZ2UgdG8gY2hhbmdlXFxuLy8gdGhlIHZhbHVlIG9mIHRoZSByZWN0YW5nbGVcXG4vLyBhZnRlciB0aGUgbW91c2UgaGFzIGJlZW4gY2xpY2tlZFxcblxcbnZhciB2YWx1ZSA9IDA7XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGZpbGwodmFsdWUpO1xcbiAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XFxufVxcblxcbmZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcXG4gIGlmICh2YWx1ZSA9PT0gMCkge1xcbiAgICB2YWx1ZSA9IDI1NTtcXG4gIH0gZWxzZSB7XFxuICAgIHZhbHVlID0gMDtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG5mdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XFxuICBlbGxpcHNlKG1vdXNlWCwgbW91c2VZLCA1LCA1KTtcXG4gIC8vIHByZXZlbnQgZGVmYXVsdFxcbiAgcmV0dXJuIGZhbHNlO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImJsYWNrIDUweDUwIHJlY3QgdHVybnMgd2hpdGUgd2l0aCBtb3VzZSBjbGljay9wcmVzcy5cXG5ubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTW91c2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzI0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBkb3VibGVDbGlja2VkKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZXZlcnkgdGltZSBhIGV2ZW50XFxubGlzdGVuZXIgaGFzIGRldGVjdGVkIGEgZGJsY2xpY2sgZXZlbnQgd2hpY2ggaXMgYSBwYXJ0IG9mIHRoZVxcbkRPTSBMMyBzcGVjaWZpY2F0aW9uLiBUaGUgZG91YmxlQ2xpY2tlZCBldmVudCBpcyBmaXJlZCB3aGVuIGFcXG5wb2ludGluZyBkZXZpY2UgYnV0dG9uICh1c3VhbGx5IGEgbW91c2UmIzM5O3MgcHJpbWFyeSBidXR0b24pXFxuaXMgY2xpY2tlZCB0d2ljZSBvbiBhIHNpbmdsZSBlbGVtZW50LiBGb3IgbW9yZSBpbmZvIG9uIHRoZVxcbmRibGNsaWNrIGV2ZW50IHJlZmVyIHRvIG1vemlsbGEmIzM5O3MgZG9jdW1lbnRhdGlvbiBoZXJlOlxcbjxhIGhyZWY9XFxcImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy9kYmxjbGlja1xcXCI+aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2RibGNsaWNrPC9hPjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRvdWJsZUNsaWNrZWRcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbi8vIENsaWNrIHdpdGhpbiB0aGUgaW1hZ2UgdG8gY2hhbmdlXFxuLy8gdGhlIHZhbHVlIG9mIHRoZSByZWN0YW5nbGVcXG4vLyBhZnRlciB0aGUgbW91c2UgaGFzIGJlZW4gZG91YmxlIGNsaWNrZWRcXG5cXG52YXIgdmFsdWUgPSAwO1xcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBmaWxsKHZhbHVlKTtcXG4gIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xcbn1cXG5cXG5mdW5jdGlvbiBkb3VibGVDbGlja2VkKCkge1xcbiAgaWYgKHZhbHVlID09PSAwKSB7XFxuICAgIHZhbHVlID0gMjU1O1xcbiAgfSBlbHNlIHtcXG4gICAgdmFsdWUgPSAwO1xcbiAgfVxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIGRvdWJsZUNsaWNrZWQoKSB7XFxuICBlbGxpcHNlKG1vdXNlWCwgbW91c2VZLCA1LCA1KTtcXG4gIC8vIHByZXZlbnQgZGVmYXVsdFxcbiAgcmV0dXJuIGZhbHNlO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImJsYWNrIDUweDUwIHJlY3QgdHVybnMgd2hpdGUgd2l0aCBtb3VzZSBkb3VibGVDbGljay9wcmVzcy5cXG5ubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJFdmVudHNcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTW91c2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvZXZlbnRzL21vdXNlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzgyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBmdW5jdGlvbiBtb3VzZVdoZWVsKCkgaXMgZXhlY3V0ZWQgZXZlcnkgdGltZSBhIHZlcnRpY2FsIG1vdXNlIHdoZWVsXFxuZXZlbnQgaXMgZGV0ZWN0ZWQgZWl0aGVyIHRyaWdnZXJlZCBieSBhbiBhY3R1YWwgbW91c2Ugd2hlZWwgb3IgYnkgYVxcbnRvdWNocGFkLjxicj48YnI+XFxuVGhlIGV2ZW50LmRlbHRhIHByb3BlcnR5IHJldHVybnMgdGhlIGFtb3VudCB0aGUgbW91c2Ugd2hlZWxcXG5oYXZlIHNjcm9sbGVkLiBUaGUgdmFsdWVzIGNhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBkZXBlbmRpbmcgb24gdGhlXFxuc2Nyb2xsIGRpcmVjdGlvbiAob24gT1MgWCB3aXRoICZxdW90O25hdHVyYWwmcXVvdDsgc2Nyb2xsaW5nIGVuYWJsZWQsIHRoZSBzaWduc1xcbmFyZSBpbnZlcnRlZCkuPGJyPjxicj5cXG5Ccm93c2VycyBtYXkgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdCBiZWhhdmlvcnMgYXR0YWNoZWQgdG8gdmFyaW91c1xcbm1vdXNlIGV2ZW50cy4gVG8gcHJldmVudCBhbnkgZGVmYXVsdCBiZWhhdmlvciBmb3IgdGhpcyBldmVudCwgYWRkXFxuJnF1b3Q7cmV0dXJuIGZhbHNlJnF1b3Q7IHRvIHRoZSBlbmQgb2YgdGhlIG1ldGhvZC48YnI+PGJyPlxcbkR1ZSB0byB0aGUgY3VycmVudCBzdXBwb3J0IG9mIHRoZSAmcXVvdDt3aGVlbCZxdW90OyBldmVudCBvbiBTYWZhcmksIHRoZSBmdW5jdGlvblxcbm1heSBvbmx5IHdvcmsgYXMgZXhwZWN0ZWQgaWYgJnF1b3Q7cmV0dXJuIGZhbHNlJnF1b3Q7IGlzIGluY2x1ZGVkIHdoaWxlIHVzaW5nIFNhZmFyaS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtb3VzZVdoZWVsXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgcG9zID0gMjU7XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjM3LCAzNCwgOTMpO1xcbiAgZmlsbCgwKTtcXG4gIHJlY3QoMjUsIHBvcywgNTAsIDUwKTtcXG59XFxuXFxuZnVuY3Rpb24gbW91c2VXaGVlbChldmVudCkge1xcbiAgcHJpbnQoZXZlbnQuZGVsdGEpO1xcbiAgLy9tb3ZlIHRoZSBzcXVhcmUgYWNjb3JkaW5nIHRvIHRoZSB2ZXJ0aWNhbCBzY3JvbGwgYW1vdW50XFxuICBwb3MgKz0gZXZlbnQuZGVsdGE7XFxuICAvL3VuY29tbWVudCB0byBibG9jayBwYWdlIHNjcm9sbGluZ1xcbiAgLy9yZXR1cm4gZmFsc2U7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiYmxhY2sgNTB4NTAgcmVjdCBtb3ZlcyB1cCBhbmQgZG93biB3aXRoIHZlcnRpY2FsIHNjcm9sbC4gZnVzY2hpYSBiYWNrZ3JvdW5kXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1vdXNlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy90b3VjaC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBzeXN0ZW0gdmFyaWFibGUgdG91Y2hlc1tdIGNvbnRhaW5zIGFuIGFycmF5IG9mIHRoZSBwb3NpdGlvbnMgb2YgYWxsXFxuY3VycmVudCB0b3VjaCBwb2ludHMsIHJlbGF0aXZlIHRvICgwLCAwKSBvZiB0aGUgY2FudmFzLCBhbmQgSURzIGlkZW50aWZ5aW5nIGFcXG51bmlxdWUgdG91Y2ggYXMgaXQgbW92ZXMuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgYW4gb2JqZWN0IHdpdGggeCwgeSxcXG5hbmQgaWQgcHJvcGVydGllcy48L3A+XFxuPHA+VGhlIHRvdWNoZXNbXSBhcnJheSBpcyBub3Qgc3VwcG9ydGVkIG9uIFNhZmFyaSBhbmQgSUUgb24gdG91Y2gtYmFzZWRcXG5kZXNrdG9wcyAobGFwdG9wcykuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0b3VjaGVzXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RbXVwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUb3VjaFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvdG91Y2guanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1NyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgdG91Y2hTdGFydGVkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYWZ0ZXIgZXZlcnkgdGltZSBhIHRvdWNoIGlzXFxucmVnaXN0ZXJlZC4gSWYgbm8gdG91Y2hTdGFydGVkKCkgZnVuY3Rpb24gaXMgZGVmaW5lZCwgdGhlIG1vdXNlUHJlc3NlZCgpXFxuZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW5zdGVhZCBpZiBpdCBpcyBkZWZpbmVkLjxicj48YnI+XFxuQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHQgYmVoYXZpb3JzIGF0dGFjaGVkIHRvIHZhcmlvdXMgdG91Y2hcXG5ldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHQgYmVoYXZpb3IgZm9yIHRoaXMgZXZlbnQsIGFkZCAmcXVvdDtyZXR1cm4gZmFsc2UmcXVvdDtcXG50byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidG91Y2hTdGFydGVkXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBUb3VjaCB3aXRoaW4gdGhlIGltYWdlIHRvIGNoYW5nZVxcbi8vIHRoZSB2YWx1ZSBvZiB0aGUgcmVjdGFuZ2xlXFxuXFxudmFyIHZhbHVlID0gMDtcXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgZmlsbCh2YWx1ZSk7XFxuICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcXG59XFxuZnVuY3Rpb24gdG91Y2hTdGFydGVkKCkge1xcbiAgaWYgKHZhbHVlID09PSAwKSB7XFxuICAgIHZhbHVlID0gMjU1O1xcbiAgfSBlbHNlIHtcXG4gICAgdmFsdWUgPSAwO1xcbiAgfVxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHRvdWNoU3RhcnRlZCgpIHtcXG4gIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDUsIDUpO1xcbiAgLy8gcHJldmVudCBkZWZhdWx0XFxuICByZXR1cm4gZmFsc2U7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiNTB4NTAgYmxhY2sgcmVjdCB0dXJucyB3aGl0ZSB3aXRoIHRvdWNoIGV2ZW50Llxcbm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUb3VjaFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9ldmVudHMvdG91Y2guanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHRvdWNoTW92ZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSBhIHRvdWNoIG1vdmUgaXMgcmVnaXN0ZXJlZC5cXG5JZiBubyB0b3VjaE1vdmVkKCkgZnVuY3Rpb24gaXMgZGVmaW5lZCwgdGhlIG1vdXNlRHJhZ2dlZCgpIGZ1bmN0aW9uIHdpbGxcXG5iZSBjYWxsZWQgaW5zdGVhZCBpZiBpdCBpcyBkZWZpbmVkLjxicj48YnI+XFxuQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHQgYmVoYXZpb3JzIGF0dGFjaGVkIHRvIHZhcmlvdXMgdG91Y2hcXG5ldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHQgYmVoYXZpb3IgZm9yIHRoaXMgZXZlbnQsIGFkZCAmcXVvdDtyZXR1cm4gZmFsc2UmcXVvdDtcXG50byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidG91Y2hNb3ZlZFwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gTW92ZSB5b3VyIGZpbmdlciBhY3Jvc3MgdGhlIHBhZ2VcXG4vLyB0byBjaGFuZ2UgaXRzIHZhbHVlXFxuXFxudmFyIHZhbHVlID0gMDtcXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgZmlsbCh2YWx1ZSk7XFxuICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcXG59XFxuZnVuY3Rpb24gdG91Y2hNb3ZlZCgpIHtcXG4gIHZhbHVlID0gdmFsdWUgKyA1O1xcbiAgaWYgKHZhbHVlID4gMjU1KSB7XFxuICAgIHZhbHVlID0gMDtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG5mdW5jdGlvbiB0b3VjaE1vdmVkKCkge1xcbiAgZWxsaXBzZShtb3VzZVgsIG1vdXNlWSwgNSwgNSk7XFxuICAvLyBwcmV2ZW50IGRlZmF1bHRcXG4gIHJldHVybiBmYWxzZTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCI1MHg1MCBibGFjayByZWN0IHR1cm5zIGxpZ2h0ZXIgd2l0aCB0b3VjaCB1bnRpbCB3aGl0ZS4gcmVzZXRzXFxubm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRvdWNoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2V2ZW50cy90b3VjaC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE4MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgdG91Y2hFbmRlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBldmVyeSB0aW1lIGEgdG91Y2ggZW5kcy4gSWYgbm9cXG50b3VjaEVuZGVkKCkgZnVuY3Rpb24gaXMgZGVmaW5lZCwgdGhlIG1vdXNlUmVsZWFzZWQoKSBmdW5jdGlvbiB3aWxsIGJlXFxuY2FsbGVkIGluc3RlYWQgaWYgaXQgaXMgZGVmaW5lZC48YnI+PGJyPlxcbkJyb3dzZXJzIG1heSBoYXZlIGRpZmZlcmVudCBkZWZhdWx0IGJlaGF2aW9ycyBhdHRhY2hlZCB0byB2YXJpb3VzIHRvdWNoXFxuZXZlbnRzLiBUbyBwcmV2ZW50IGFueSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIGV2ZW50LCBhZGQgJnF1b3Q7cmV0dXJuIGZhbHNlJnF1b3Q7XFxudG8gdGhlIGVuZCBvZiB0aGUgbWV0aG9kLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRvdWNoRW5kZWRcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbi8vIFJlbGVhc2UgdG91Y2ggd2l0aGluIHRoZSBpbWFnZSB0b1xcbi8vIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHJlY3RhbmdsZVxcblxcbnZhciB2YWx1ZSA9IDA7XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGZpbGwodmFsdWUpO1xcbiAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XFxufVxcbmZ1bmN0aW9uIHRvdWNoRW5kZWQoKSB7XFxuICBpZiAodmFsdWUgPT09IDApIHtcXG4gICAgdmFsdWUgPSAyNTU7XFxuICB9IGVsc2Uge1xcbiAgICB2YWx1ZSA9IDA7XFxuICB9XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuZnVuY3Rpb24gdG91Y2hFbmRlZCgpIHtcXG4gIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDUsIDUpO1xcbiAgLy8gcHJldmVudCBkZWZhdWx0XFxuICByZXR1cm4gZmFsc2U7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiNTB4NTAgYmxhY2sgcmVjdCB0dXJucyB3aGl0ZSB3aXRoIHRvdWNoLlxcbm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkV2ZW50c1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUb3VjaFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9maWx0ZXJzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBmaWx0ZXJzIGZvciB1c2Ugd2l0aCBpbWFnZSBidWZmZXJzLjwvcD5cXG48cD5UaGlzIG1vZHVsZSBpcyBiYXNpY2FsbHkgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyBzdG9yZWQgaW4gYW4gb2JqZWN0XFxuYXMgb3Bwb3NlZCB0byBtb2R1bGVzLiBUaGUgZnVuY3Rpb25zIGFyZSBkZXN0cnVjdGl2ZSwgbW9kaWZ5aW5nXFxudGhlIHBhc3NlZCBpbiBjYW52YXMgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBjb3B5LjwvcD5cXG48cD5HZW5lcmFsbHkgc3BlYWtpbmcgdXNlcnMgb2YgdGhpcyBtb2R1bGUgd2lsbCB1c2UgdGhlIEZpbHRlcnMuYXBwbHkgbWV0aG9kXFxub24gYSBjYW52YXMgdG8gY3JlYXRlIGFuIGVmZmVjdC48L3A+XFxuPHA+QSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBib3Jyb3dlZC9hZGFwdGVkIGZyb21cXG48YSBocmVmPVxcXCJodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9jYW52YXMvaW1hZ2VmaWx0ZXJzL1xcXCI+aHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvY2FudmFzL2ltYWdlZmlsdGVycy88L2E+XFxub3IgdGhlIGphdmEgcHJvY2Vzc2luZyBpbXBsZW1lbnRhdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRXZlbnRzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL2ltYWdlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBwNSBtZXRob2RzIGZvciB0aGUgcDUuSW1hZ2UgY2xhc3NcXG5mb3IgZHJhd2luZyBpbWFnZXMgdG8gdGhlIG1haW4gZGlzcGxheSBjYW52YXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkltYWdlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL2ltYWdlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhIG5ldyBwNS5JbWFnZSAodGhlIGRhdGF0eXBlIGZvciBzdG9yaW5nIGltYWdlcykuIFRoaXMgcHJvdmlkZXMgYVxcbmZyZXNoIGJ1ZmZlciBvZiBwaXhlbHMgdG8gcGxheSB3aXRoLiBTZXQgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3aXRoIHRoZVxcbndpZHRoIGFuZCBoZWlnaHQgcGFyYW1ldGVycy5cXG48YnI+PGJyPlxcbi5waXhlbHMgZ2l2ZXMgYWNjZXNzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgYWxsIHRoZSBwaXhlbHNcXG5pbiB0aGUgZGlzcGxheSB3aW5kb3cuXFxuVGhlc2UgdmFsdWVzIGFyZSBudW1iZXJzLiBUaGlzIGFycmF5IGlzIHRoZSBzaXplIChpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGVcXG5mYWN0b3IgZm9yIHRoZSBwaXhlbERlbnNpdHkpIG9mIHRoZSBkaXNwbGF5IHdpbmRvdyB4NCxcXG5yZXByZXNlbnRpbmcgdGhlIFIsIEcsIEIsIEEgdmFsdWVzIGluIG9yZGVyIGZvciBlYWNoIHBpeGVsLCBtb3ZpbmcgZnJvbVxcbmxlZnQgdG8gcmlnaHQgYWNyb3NzIGVhY2ggcm93LCB0aGVuIGRvd24gZWFjaCBjb2x1bW4uIFNlZSAucGl4ZWxzIGZvclxcbm1vcmUgaW5mby4gSXQgbWF5IGFsc28gYmUgc2ltcGxlciB0byB1c2Ugc2V0KCkgb3IgZ2V0KCkuXFxuPGJyPjxicj5cXG5CZWZvcmUgYWNjZXNzaW5nIHRoZSBwaXhlbHMgb2YgYW4gaW1hZ2UsIHRoZSBkYXRhIG11c3QgbG9hZGVkIHdpdGggdGhlXFxubG9hZFBpeGVscygpIGZ1bmN0aW9uLiBBZnRlciB0aGUgYXJyYXkgZGF0YSBoYXMgYmVlbiBtb2RpZmllZCwgdGhlXFxudXBkYXRlUGl4ZWxzKCkgZnVuY3Rpb24gbXVzdCBiZSBydW4gdG8gdXBkYXRlIHRoZSBjaGFuZ2VzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNyZWF0ZUltYWdlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ3aWR0aFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+d2lkdGggaW4gcGl4ZWxzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaGVpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5oZWlnaHQgaW4gcGl4ZWxzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgcDUuSW1hZ2Ugb2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuSW1hZ2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBpbWcgPSBjcmVhdGVJbWFnZSg2NiwgNjYpO1xcbmltZy5sb2FkUGl4ZWxzKCk7XFxuZm9yICh2YXIgaSA9IDA7IGkgPCBpbWcud2lkdGg7IGkrKykge1xcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBpbWcuaGVpZ2h0OyBqKyspIHtcXG4gICAgaW1nLnNldChpLCBqLCBjb2xvcigwLCA5MCwgMTAyKSk7XFxuICB9XFxufVxcbmltZy51cGRhdGVQaXhlbHMoKTtcXG5pbWFnZShpbWcsIDE3LCAxNyk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZyA9IGNyZWF0ZUltYWdlKDY2LCA2Nik7XFxuaW1nLmxvYWRQaXhlbHMoKTtcXG5mb3IgKHZhciBpID0gMDsgaSA8IGltZy53aWR0aDsgaSsrKSB7XFxuICBmb3IgKHZhciBqID0gMDsgaiA8IGltZy5oZWlnaHQ7IGorKykge1xcbiAgICBpbWcuc2V0KGksIGosIGNvbG9yKDAsIDkwLCAxMDIsIChpICUgaW1nLndpZHRoKSAqIDIpKTtcXG4gIH1cXG59XFxuaW1nLnVwZGF0ZVBpeGVscygpO1xcbmltYWdlKGltZywgMTcsIDE3KTtcXG5pbWFnZShpbWcsIDM0LCAzNCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIHBpbmsgPSBjb2xvcigyNTUsIDEwMiwgMjA0KTtcXG52YXIgaW1nID0gY3JlYXRlSW1hZ2UoNjYsIDY2KTtcXG5pbWcubG9hZFBpeGVscygpO1xcbnZhciBkID0gcGl4ZWxEZW5zaXR5KCk7XFxudmFyIGhhbGZJbWFnZSA9IDQgKiAod2lkdGggKiBkKSAqIChoZWlnaHQgLyAyICogZCk7XFxuZm9yICh2YXIgaSA9IDA7IGkgPCBoYWxmSW1hZ2U7IGkgKz0gNCkge1xcbiAgaW1nLnBpeGVsc1tpXSA9IHJlZChwaW5rKTtcXG4gIGltZy5waXhlbHNbaSArIDFdID0gZ3JlZW4ocGluayk7XFxuICBpbWcucGl4ZWxzW2kgKyAyXSA9IGJsdWUocGluayk7XFxuICBpbWcucGl4ZWxzW2kgKyAzXSA9IGFscGhhKHBpbmspO1xcbn1cXG5pbWcudXBkYXRlUGl4ZWxzKCk7XFxuaW1hZ2UoaW1nLCAxNywgMTcpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiNjZ4NjYgZGFyayB0dXJxdW9pc2UgcmVjdCBpbiBjZW50ZXIgb2YgY2FudmFzLlxcbjIgZ3JhZGF0ZWQgZGFyayB0dXJxdW9pc2UgcmVjdHMgZmFkZSBsZWZ0LiAxIGNlbnRlciAxIGJvdHRvbSByaWdodCBvZiBjYW52YXNcXG5ubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJJbWFnZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9pbWFnZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDk4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNhdmUgdGhlIGN1cnJlbnQgY2FudmFzIGFzIGFuIGltYWdlLiBJbiBTYWZhcmksIHRoaXMgd2lsbCBvcGVuIHRoZVxcbmltYWdlIGluIHRoZSB3aW5kb3cgYW5kIHRoZSB1c2VyIG11c3QgcHJvdmlkZSB0aGVpciBvd25cXG5maWxlbmFtZSBvbiBzYXZlLWFzLiBPdGhlciBicm93c2VycyB3aWxsIGVpdGhlciBzYXZlIHRoZVxcbmZpbGUgaW1tZWRpYXRlbHksIG9yIHByb21wdCB0aGUgdXNlciB3aXRoIGEgZGlhbG9ndWUgd2luZG93LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNhdmVDYW52YXNcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz48Y29kZT5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuIHZhciBjID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gYmFja2dyb3VuZCgyNTUsIDAsIDApO1xcbiBzYXZlQ2FudmFzKGMsICdteUNhbnZhcycsICdqcGcnKTtcXG4gfVxcbiA8L2NvZGU+PC9kaXY+XFxuIDxkaXYgY2xhc3M9J25vcmVuZGVyIG5vdGVzdCc+PGNvZGU+XFxuIC8vIG5vdGUgdGhhdCB0aGlzIGV4YW1wbGUgaGFzIHRoZSBzYW1lIHJlc3VsdCBhcyBhYm92ZVxcbiAvLyBpZiBubyBjYW52YXMgaXMgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBtYWluIGNhbnZhc1xcbiBmdW5jdGlvbiBzZXR1cCgpIHtcXG4gdmFyIGMgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiBiYWNrZ3JvdW5kKDI1NSwgMCwgMCk7XFxuIHNhdmVDYW52YXMoJ215Q2FudmFzJywgJ2pwZycpO1xcblxcbiAvLyBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgdmFsaWRcXG4gc2F2ZUNhbnZhcyhjLCAnbXlDYW52YXMnLCAnanBnJyk7XFxuIHNhdmVDYW52YXMoYywgJ215Q2FudmFzLmpwZycpO1xcbiBzYXZlQ2FudmFzKGMsICdteUNhbnZhcycpO1xcbiBzYXZlQ2FudmFzKGMpO1xcbiBzYXZlQ2FudmFzKCdteUNhbnZhcycsICdwbmcnKTtcXG4gc2F2ZUNhbnZhcygnbXlDYW52YXMnKTtcXG4gc2F2ZUNhbnZhcygpO1xcbiB9XFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXFxuIG5vIGltYWdlIGRpc3BsYXllZFxcbiBubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDk4LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2VsZWN0ZWRDYW52YXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YSB2YXJpYWJsZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgaHRtbDUgY2FudmFzIChvcHRpb25hbCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZpbGVuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJleHRlbnNpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+JiMzOTtqcGcmIzM5OyBvciAmIzM5O3BuZyYjMzk7PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxNDIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmaWxlbmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXh0ZW5zaW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvaW1hZ2UuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxOTMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2FwdHVyZSBhIHNlcXVlbmNlIG9mIGZyYW1lcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIG1vdmllLlxcbkFjY2VwdHMgYSBjYWxsYmFjay4gRm9yIGV4YW1wbGUsIHlvdSBtYXkgd2lzaCB0byBzZW5kIHRoZSBmcmFtZXNcXG50byBhIHNlcnZlciB3aGVyZSB0aGV5IGNhbiBiZSBzdG9yZWQgb3IgY29udmVydGVkIGludG8gYSBtb3ZpZS5cXG5JZiBubyBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGJyb3dzZXIgd2lsbCBwb3AgdXAgc2F2ZSBkaWFsb2d1ZXMgaW4gYW5cXG5hdHRlbXB0IHRvIGRvd25sb2FkIGFsbCBvZiB0aGUgaW1hZ2VzIHRoYXQgaGF2ZSBqdXN0IGJlZW4gY3JlYXRlZC4gV2l0aCB0aGVcXG5jYWxsYmFjayBwcm92aWRlZCB0aGUgaW1hZ2UgZGF0YSBpc24mIzM5O3Qgc2F2ZWQgYnkgZGVmYXVsdCBidXQgaW5zdGVhZCBwYXNzZWRcXG5hcyBhbiBhcmd1bWVudCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gYXMgYW4gYXJyYXkgb2Ygb2JqZWN0cywgd2l0aCB0aGVcXG5zaXplIG9mIGFycmF5IGVxdWFsIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzLjwvcD5cXG48cD5Ob3RlIHRoYXQgc2F2ZUZyYW1lcygpIHdpbGwgb25seSBzYXZlIHRoZSBmaXJzdCAxNSBmcmFtZXMgb2YgYW4gYW5pbWF0aW9uLlxcblRvIGV4cG9ydCBsb25nZXIgYW5pbWF0aW9ucywgeW91IG1pZ2h0IGxvb2sgaW50byBhIGxpYnJhcnkgbGlrZVxcbjxhIGhyZWY9XFxcImh0dHBzOi8vZ2l0aHViLmNvbS9zcGl0ZS9jY2FwdHVyZS5qcy9cXFwiPmNjYXB0dXJlLmpzPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzYXZlRnJhbWVzXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmaWxlbmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImV4dGVuc2lvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+JiMzOTtqcGcmIzM5OyBvciAmIzM5O3BuZyYjMzk7PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RHVyYXRpb24gaW4gc2Vjb25kcyB0byBzYXZlIHRoZSBmcmFtZXMgZm9yLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnJhbWVyYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5GcmFtZXJhdGUgdG8gc2F2ZSB0aGUgZnJhbWVzIGluLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBoYW5kbGUgdGhlIGltYWdlIGRhdGEuIFRoaXMgZnVuY3Rpb25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBhY2NlcHQgYW4gYXJyYXkgYXMgYXJndW1lbnQuIFRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgd2lsbCBjb250YWluIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMgb2Ygb2JqZWN0cy4gRWFjaCBvYmplY3QgaGFzIHRocmVlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBpbWFnZURhdGEgLSBhblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Uvb2N0ZXQtc3RyZWFtLCBmaWxlbmFtZSBhbmQgZXh0ZW5zaW9uLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb24oQXJyYXkpXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG4gZnVuY3Rpb24gZHJhdygpIHtcXG4gYmFja2dyb3VuZChtb3VzZVgpO1xcbiB9XFxuXFxuIGZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcXG4gc2F2ZUZyYW1lcygnb3V0JywgJ3BuZycsIDEsIDI1LCBmdW5jdGlvbihkYXRhKSB7XFxuICAgcHJpbnQoZGF0YSk7XFxuIH0pO1xcbiB9XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJjYW52YXMgYmFja2dyb3VuZCBnb2VzIGZyb20gbGlnaHQgdG8gZGFyayB3aXRoIG1vdXNlIHguXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiSW1hZ2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvbG9hZGluZ19kaXNwbGF5aW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TG9hZHMgYW4gaW1hZ2UgZnJvbSBhIHBhdGggYW5kIGNyZWF0ZXMgYSBwNS5JbWFnZSBmcm9tIGl0Llxcbjxicj48YnI+XFxuVGhlIGltYWdlIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIGZvciByZW5kZXJpbmdcXG5JZiB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgaW1hZ2UgaXMgcmVhZHkgYmVmb3JlIGRvaW5nXFxuYW55dGhpbmcgd2l0aCBpdCwgcGxhY2UgdGhlIGxvYWRJbWFnZSgpIGNhbGwgaW4gcHJlbG9hZCgpLlxcbllvdSBtYXkgYWxzbyBzdXBwbHkgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIGltYWdlIHdoZW4gaXQmIzM5O3MgcmVhZHkuXFxuPGJyPjxicj5cXG5UaGUgcGF0aCB0byB0aGUgaW1hZ2Ugc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBIVE1MIGZpbGVcXG50aGF0IGxpbmtzIGluIHlvdXIgc2tldGNoLiBMb2FkaW5nIGFuIGltYWdlIGZyb20gYSBVUkwgb3Igb3RoZXJcXG5yZW1vdGUgbG9jYXRpb24gbWF5IGJlIGJsb2NrZWQgZHVlIHRvIHlvdXIgYnJvd3NlciYjMzk7cyBidWlsdC1pblxcbnNlY3VyaXR5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxvYWRJbWFnZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UGF0aCBvZiB0aGUgaW1hZ2UgdG8gYmUgbG9hZGVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdWNjZXNzQ2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbWFnZSBpcyBsb2FkZWQuIFdpbGwgYmUgcGFzc2VkIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwNS5JbWFnZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImZ1bmN0aW9uKHA1LkltYWdlKVwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmFpbHVyZUNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYWxsZWQgd2l0aCBldmVudCBlcnJvciBpZlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW1hZ2UgZmFpbHMgdG8gbG9hZC48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uKEV2ZW50KVwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgcDUuSW1hZ2Ugb2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuSW1hZ2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBpbWc7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2xhRGVmZW5zZS5qcGcnKTtcXG59XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBpbWFnZShpbWcsIDAsIDApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIC8vIGhlcmUgd2UgdXNlIGEgY2FsbGJhY2sgdG8gZGlzcGxheSB0aGUgaW1hZ2UgYWZ0ZXIgbG9hZGluZ1xcbiAgbG9hZEltYWdlKCdhc3NldHMvbGFEZWZlbnNlLmpwZycsIGZ1bmN0aW9uKGltZykge1xcbiAgICBpbWFnZShpbWcsIDAsIDApO1xcbiAgfSk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiaW1hZ2Ugb2YgdGhlIHVuZGVyc2lkZSBvZiBhIHdoaXRlIHVtYnJlbGxhIGFuZCBncmlkZWQgY2VpbGlsbmcgYWJvdmVcXG5pbWFnZSBvZiB0aGUgdW5kZXJzaWRlIG9mIGEgd2hpdGUgdW1icmVsbGEgYW5kIGdyaWRlZCBjZWlsaWxuZyBhYm92ZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkxvYWRpbmcgJiBEaXNwbGF5aW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EcmF3IGFuIGltYWdlIHRvIHRoZSBwNS5qcyBjYW52YXMuPC9wPlxcbjxwPlRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiBwYXJhbWV0ZXJzLiBUaGVcXG5zaW1wbGVzdCB1c2UgcmVxdWlyZXMgb25seSB0aHJlZSBwYXJhbWV0ZXJzOiBpbWcsIHgsIGFuZCB54oCUd2hlcmUgKHgsIHkpIGlzXFxudGhlIHBvc2l0aW9uIG9mIHRoZSBpbWFnZS4gVHdvIG1vcmUgcGFyYW1ldGVycyBjYW4gb3B0aW9uYWxseSBiZSBhZGRlZCB0b1xcbnNwZWNpZnkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGltYWdlLjwvcD5cXG48cD5UaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBhbGwgZWlnaHQgTnVtYmVyIHBhcmFtZXRlcnMuIFRvXFxuZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFsbCB0aGVzZSBwYXJhbWV0ZXJzLCBwNS5qcyB1c2VzIHRoZSBsYW5ndWFnZSBvZlxcbiZxdW90O2Rlc3RpbmF0aW9uIHJlY3RhbmdsZSZxdW90OyAod2hpY2ggY29ycmVzcG9uZHMgdG8gJnF1b3Q7ZHgmcXVvdDssICZxdW90O2R5JnF1b3Q7LCBldGMuKSBhbmQgJnF1b3Q7c291cmNlXFxuaW1hZ2UmcXVvdDsgKHdoaWNoIGNvcnJlc3BvbmRzIHRvICZxdW90O3N4JnF1b3Q7LCAmcXVvdDtzeSZxdW90OywgZXRjLikgYmVsb3cuIFNwZWNpZnlpbmcgdGhlXFxuJnF1b3Q7c291cmNlIGltYWdlJnF1b3Q7IGRpbWVuc2lvbnMgY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGRpc3BsYXkgYVxcbnN1YnNlY3Rpb24gb2YgdGhlIHNvdXJjZSBpbWFnZSBpbnN0ZWFkIG9mIHRoZSB3aG9sZSB0aGluZy4gSGVyZSYjMzk7cyBhIGRpYWdyYW1cXG50byBleHBsYWluIGZ1cnRoZXI6XFxuPGltZyBzcmM9XFxcImFzc2V0cy9kcmF3SW1hZ2UucG5nXFxcIj48L2ltZz48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJpbWFnZVwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvbGFEZWZlbnNlLmpwZycpO1xcbn1cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIC8vIFRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgaW1nIGlzIGF0ICgwLCAwKVxcbiAgLy8gV2lkdGggYW5kIGhlaWdodCBhcmUgdGhlIGltZydzIG9yaWdpbmFsIHdpZHRoIGFuZCBoZWlnaHRcXG4gIGltYWdlKGltZywgMCwgMCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBpbWc7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2xhRGVmZW5zZS5qcGcnKTtcXG59XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKDUwKTtcXG4gIC8vIFRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgaW1nIGlzIGF0ICgxMCwgMTApXFxuICAvLyBXaWR0aCBhbmQgaGVpZ2h0IGFyZSA1MCB4IDUwXFxuICBpbWFnZShpbWcsIDEwLCAxMCwgNTAsIDUwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAvLyBIZXJlLCB3ZSB1c2UgYSBjYWxsYmFjayB0byBkaXNwbGF5IHRoZSBpbWFnZSBhZnRlciBsb2FkaW5nXFxuICBsb2FkSW1hZ2UoJ2Fzc2V0cy9sYURlZmVuc2UuanBnJywgZnVuY3Rpb24oaW1nKSB7XFxuICAgIGltYWdlKGltZywgMCwgMCk7XFxuICB9KTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvZ3JhZGllbnQucG5nJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy8gMS4gQmFja2dyb3VuZCBpbWFnZVxcbiAgLy8gVG9wLWxlZnQgY29ybmVyIG9mIHRoZSBpbWcgaXMgYXQgKDAsIDApXFxuICAvLyBXaWR0aCBhbmQgaGVpZ2h0IGFyZSB0aGUgaW1nJ3Mgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCwgMTAwIHggMTAwXFxuICBpbWFnZShpbWcsIDAsIDApO1xcbiAgLy8gMi4gVG9wIHJpZ2h0IGltYWdlXFxuICAvLyBUb3AtbGVmdCBjb3JuZXIgb2YgZGVzdGluYXRpb24gcmVjdGFuZ2xlIGlzIGF0ICg1MCwgMClcXG4gIC8vIERlc3RpbmF0aW9uIHJlY3RhbmdsZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSA0MCB4IDIwXFxuICAvLyBUaGUgbmV4dCBwYXJhbWV0ZXJzIGFyZSByZWxhdGl2ZSB0byB0aGUgc291cmNlIGltYWdlOlxcbiAgLy8gLSBTdGFydGluZyBhdCBwb3NpdGlvbiAoNTAsIDUwKSBvbiB0aGUgc291cmNlIGltYWdlLCBjYXB0dXJlIGEgNTAgeCA1MFxcbiAgLy8gc3Vic2VjdGlvblxcbiAgLy8gLSBEcmF3IHRoaXMgc3Vic2VjdGlvbiB0byBmaWxsIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGVcXG4gIGltYWdlKGltZywgNTAsIDAsIDQwLCAyMCwgNTAsIDUwLCA1MCwgNTApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImltYWdlIG9mIHRoZSB1bmRlcnNpZGUgb2YgYSB3aGl0ZSB1bWJyZWxsYSBhbmQgZ3JpZGRlZCBjZWlsaW5nIGFib3ZlXFxuaW1hZ2Ugb2YgdGhlIHVuZGVyc2lkZSBvZiBhIHdoaXRlIHVtYnJlbGxhIGFuZCBncmlkZGVkIGNlaWxpbmcgYWJvdmVcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJMb2FkaW5nICYgRGlzcGxheWluZ1wiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDEyNSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImltZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgaW1hZ2UgdG8gZGlzcGxheTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5JbWFnZXxwNS5FbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeC1jb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ3aWR0aFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgd2lkdGggdG8gZHJhdyB0aGUgaW1hZ2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhlaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgaGVpZ2h0IHRvIGRyYXcgdGhlIGltYWdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAyMTMsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJpbWdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuSW1hZ2V8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGUgaW4gd2hpY2ggdG8gZHJhdyB0aGUgc291cmNlIGltYWdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGUgaW4gd2hpY2ggdG8gZHJhdyB0aGUgc291cmNlIGltYWdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRXaWR0aFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkSGVpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBoZWlnaHQgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzeFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeC1jb29yZGluYXRlIG9mIHRoZSBzdWJzZWN0aW9uIG9mIHRoZSBzb3VyY2VcXG5pbWFnZSB0byBkcmF3IGludG8gdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeS1jb29yZGluYXRlIG9mIHRoZSBzdWJzZWN0aW9uIG9mIHRoZSBzb3VyY2VcXG5pbWFnZSB0byBkcmF3IGludG8gdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzV2lkdGhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHdpZHRoIG9mIHRoZSBzdWJzZWN0aW9uIG9mIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGltYWdlIHRvIGRyYXcgaW50byB0aGUgZGVzdGluYXRpb25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RhbmdsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic0hlaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgaGVpZ2h0IG9mIHRoZSBzdWJzZWN0aW9uIG9mIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBpbWFnZSB0byBkcmF3IGludG8gdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI5NixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXRzIHRoZSBmaWxsIHZhbHVlIGZvciBkaXNwbGF5aW5nIGltYWdlcy4gSW1hZ2VzIGNhbiBiZSB0aW50ZWQgdG9cXG5zcGVjaWZpZWQgY29sb3JzIG9yIG1hZGUgdHJhbnNwYXJlbnQgYnkgaW5jbHVkaW5nIGFuIGFscGhhIHZhbHVlLlxcbjxicj48YnI+XFxuVG8gYXBwbHkgdHJhbnNwYXJlbmN5IHRvIGFuIGltYWdlIHdpdGhvdXQgYWZmZWN0aW5nIGl0cyBjb2xvciwgdXNlXFxud2hpdGUgYXMgdGhlIHRpbnQgY29sb3IgYW5kIHNwZWNpZnkgYW4gYWxwaGEgdmFsdWUuIEZvciBpbnN0YW5jZSxcXG50aW50KDI1NSwgMTI4KSB3aWxsIG1ha2UgYW4gaW1hZ2UgNTAlIHRyYW5zcGFyZW50IChhc3N1bWluZyB0aGUgZGVmYXVsdFxcbmFscGhhIHJhbmdlIG9mIDAtMjU1LCB3aGljaCBjYW4gYmUgY2hhbmdlZCB3aXRoIGNvbG9yTW9kZSgpKS5cXG48YnI+PGJyPlxcblRoZSB2YWx1ZSBmb3IgdGhlIGdyYXkgcGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50XFxubWF4aW11bSB2YWx1ZSBhcyBzcGVjaWZpZWQgYnkgY29sb3JNb2RlKCkuIFRoZSBkZWZhdWx0IG1heGltdW0gdmFsdWUgaXNcXG4yNTUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidGludFwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvbGFEZWZlbnNlLmpwZycpO1xcbn1cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGltYWdlKGltZywgMCwgMCk7XFxuICB0aW50KDAsIDE1MywgMjA0KTsgLy8gVGludCBibHVlXFxuICBpbWFnZShpbWcsIDUwLCAwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvbGFEZWZlbnNlLmpwZycpO1xcbn1cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGltYWdlKGltZywgMCwgMCk7XFxuICB0aW50KDAsIDE1MywgMjA0LCAxMjYpOyAvLyBUaW50IGJsdWUgYW5kIHNldCB0cmFuc3BhcmVuY3lcXG4gIGltYWdlKGltZywgNTAsIDApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgaW1nO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9sYURlZmVuc2UuanBnJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgaW1hZ2UoaW1nLCAwLCAwKTtcXG4gIHRpbnQoMjU1LCAxMjYpOyAvLyBBcHBseSB0cmFuc3BhcmVuY3kgd2l0aG91dCBjaGFuZ2luZyBjb2xvclxcbiAgaW1hZ2UoaW1nLCA1MCwgMCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiMiBzaWRlIGJ5IHNpZGUgaW1hZ2VzIG9mIHVtYnJlbGxhIGFuZCBjZWlsaW5nLCBvbmUgaW1hZ2Ugd2l0aCBibHVlIHRpbnRcXG5JbWFnZXMgb2YgdW1icmVsbGEgYW5kIGNlaWxpbmcsIG9uZSBoYWxmIG9mIGltYWdlIHdpdGggYmx1ZSB0aW50XFxuMiBzaWRlIGJ5IHNpZGUgaW1hZ2VzIG9mIHVtYnJlbGxhIGFuZCBjZWlsaW5nLCBvbmUgaW1hZ2UgdHJhbnNsdWNlbnRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJMb2FkaW5nICYgRGlzcGxheWluZ1wiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDI5NixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnJlZCBvciBodWUgdmFsdWUgcmVsYXRpdmUgdG9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmJsdWUgb3IgYnJpZ2h0bmVzcyB2YWx1ZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWxwaGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDM2OSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmEgY29sb3Igc3RyaW5nPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDM3NCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImdyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YSBncmF5IHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFscGhhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAzODAsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YW4gYXJyYXkgY29udGFpbmluZyB0aGUgcmVkLGdyZWVuLGJsdWUgJmFtcDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIHRoZSBjb2xvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJbXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDM4NixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbG9yXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB0aW50IGNvbG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM5NixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZW1vdmVzIHRoZSBjdXJyZW50IGZpbGwgdmFsdWUgZm9yIGRpc3BsYXlpbmcgaW1hZ2VzIGFuZCByZXZlcnRzIHRvXFxuZGlzcGxheWluZyBpbWFnZXMgd2l0aCB0aGVpciBvcmlnaW5hbCBodWVzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vVGludFwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzLmpwZycpO1xcbn1cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHRpbnQoMCwgMTUzLCAyMDQpOyAvLyBUaW50IGJsdWVcXG4gIGltYWdlKGltZywgMCwgMCk7XFxuICBub1RpbnQoKTsgLy8gRGlzYWJsZSB0aW50XFxuICBpbWFnZShpbWcsIDUwLCAwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCIyIHNpZGUgYnkgc2lkZSBpbWFnZXMgb2YgYnJpY2tzLCBsZWZ0IGltYWdlIHdpdGggYmx1ZSB0aW50XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTG9hZGluZyAmIERpc3BsYXlpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvbG9hZGluZ19kaXNwbGF5aW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDYyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCBpbWFnZSBtb2RlLiBNb2RpZmllcyB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCBpbWFnZXMgYXJlIGRyYXduIGJ5XFxuY2hhbmdpbmcgdGhlIHdheSBpbiB3aGljaCBwYXJhbWV0ZXJzIGdpdmVuIHRvIGltYWdlKCkgYXJlIGludGVycHJldGVkLlxcblRoZSBkZWZhdWx0IG1vZGUgaXMgaW1hZ2VNb2RlKENPUk5FUiksIHdoaWNoIGludGVycHJldHMgdGhlIHNlY29uZCBhbmRcXG50aGlyZCBwYXJhbWV0ZXJzIG9mIGltYWdlKCkgYXMgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZS4gSWZcXG50d28gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQsIHRoZXkgYXJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSYjMzk7c1xcbndpZHRoIGFuZCBoZWlnaHQuXFxuPGJyPjxicj5cXG5pbWFnZU1vZGUoQ09STkVSUykgaW50ZXJwcmV0cyB0aGUgc2Vjb25kIGFuZCB0aGlyZCBwYXJhbWV0ZXJzIG9mIGltYWdlKClcXG5hcyB0aGUgbG9jYXRpb24gb2Ygb25lIGNvcm5lciwgYW5kIHRoZSBmb3VydGggYW5kIGZpZnRoIHBhcmFtZXRlcnMgYXMgdGhlXFxub3Bwb3NpdGUgY29ybmVyLlxcbjxicj48YnI+XFxuaW1hZ2VNb2RlKENFTlRFUikgaW50ZXJwcmV0cyB0aGUgc2Vjb25kIGFuZCB0aGlyZCBwYXJhbWV0ZXJzIG9mIGltYWdlKClcXG5hcyB0aGUgaW1hZ2UmIzM5O3MgY2VudGVyIHBvaW50LiBJZiB0d28gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQsXFxudGhleSBhcmUgdXNlZCB0byBzZXQgdGhlIGltYWdlJiMzOTtzIHdpZHRoIGFuZCBoZWlnaHQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiaW1hZ2VNb2RlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtb2RlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5laXRoZXIgQ09STkVSLCBDT1JORVJTLCBvciBDRU5URVI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkNvbnN0YW50XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcblxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzLmpwZycpO1xcbn1cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGltYWdlTW9kZShDT1JORVIpO1xcbiAgaW1hZ2UoaW1nLCAxMCwgMTAsIDUwLCA1MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBpbWc7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrcy5qcGcnKTtcXG59XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBpbWFnZU1vZGUoQ09STkVSUyk7XFxuICBpbWFnZShpbWcsIDEwLCAxMCwgOTAsIDQwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzLmpwZycpO1xcbn1cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGltYWdlTW9kZShDRU5URVIpO1xcbiAgaW1hZ2UoaW1nLCA1MCwgNTAsIDgwLCA4MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwic21hbGwgc3F1YXJlIGltYWdlIG9mIGJyaWNrc1xcbmhvcml6b250YWwgcmVjdGFuZ2xlIGltYWdlIG9mIGJyaWNrc1xcbmxhcmdlIHNxdWFyZSBpbWFnZSBvZiBicmlja3NcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJMb2FkaW5nICYgRGlzcGxheWluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9wNS5JbWFnZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgcDUuSW1hZ2UgY2xhc3MgYW5kIFA1IG1ldGhvZHMgZm9yXFxuZHJhd2luZyBpbWFnZXMgdG8gdGhlIG1haW4gZGlzcGxheSBjYW52YXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkltYWdlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkltYWdlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL3A1LkltYWdlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SW1hZ2Ugd2lkdGguPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ3aWR0aFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcInJlYWRvbmx5XCI6IFwiXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgaW1nO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBpbWFnZShpbWcsIDAsIDApO1xcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWcud2lkdGg7IGkrKykge1xcbiAgICB2YXIgYyA9IGltZy5nZXQoaSwgaW1nLmhlaWdodCAvIDIpO1xcbiAgICBzdHJva2UoYyk7XFxuICAgIGxpbmUoaSwgaGVpZ2h0IC8gMiwgaSwgaGVpZ2h0KTtcXG4gIH1cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJyb2NreSBtb3VudGFpbnMgaW4gdG9wIGFuZCBob3Jpem9udGFsIGxpbmVzIGluIGNvcnJlc3BvbmRpbmcgY29sb3JzIGluIGJvdHRvbS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5JbWFnZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJJbWFnZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9wNS5JbWFnZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExNyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5JbWFnZSBoZWlnaHQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJoZWlnaHRcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiAgaW1hZ2UoaW1nLCAwLCAwKTtcXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW1nLmhlaWdodDsgaSsrKSB7XFxuICAgIHZhciBjID0gaW1nLmdldChpbWcud2lkdGggLyAyLCBpKTtcXG4gICAgc3Ryb2tlKGMpO1xcbiAgICBsaW5lKDAsIGksIHdpZHRoIC8gMiwgaSk7XFxuICB9XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwicm9ja3kgbW91bnRhaW5zIG9uIHJpZ2h0IGFuZCB2ZXJ0aWNhbCBsaW5lcyBpbiBjb3JyZXNwb25kaW5nIGNvbG9ycyBvbiBsZWZ0LlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkltYWdlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkltYWdlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL3A1LkltYWdlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTUxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgYWxsIHRoZSBwaXhlbHMgaW4gdGhlIGRpc3BsYXkgd2luZG93LlxcblRoZXNlIHZhbHVlcyBhcmUgbnVtYmVycy4gVGhpcyBhcnJheSBpcyB0aGUgc2l6ZSAoaW5jbHVkZSBhbiBhcHByb3ByaWF0ZVxcbmZhY3RvciBmb3IgcGl4ZWxEZW5zaXR5KSBvZiB0aGUgZGlzcGxheSB3aW5kb3cgeDQsXFxucmVwcmVzZW50aW5nIHRoZSBSLCBHLCBCLCBBIHZhbHVlcyBpbiBvcmRlciBmb3IgZWFjaCBwaXhlbCwgbW92aW5nIGZyb21cXG5sZWZ0IHRvIHJpZ2h0IGFjcm9zcyBlYWNoIHJvdywgdGhlbiBkb3duIGVhY2ggY29sdW1uLiBSZXRpbmEgYW5kIG90aGVyXFxuaGlnaCBkZW5pc3R5IGRpc3BsYXlzIG1heSBoYXZlIG1vcmUgcGl4ZWxzW10gKGJ5IGEgZmFjdG9yIG9mXFxucGl4ZWxEZW5zaXR5XjIpLlxcbkZvciBleGFtcGxlLCBpZiB0aGUgaW1hZ2UgaXMgMTAweDEwMCBwaXhlbHMsIHRoZXJlIHdpbGwgYmUgNDAsMDAwLiBXaXRoXFxucGl4ZWxEZW5zaXR5ID0gMiwgdGhlcmUgd2lsbCBiZSAxNjAsMDAwLiBUaGUgZmlyc3QgZm91ciB2YWx1ZXNcXG4oaW5kaWNlcyAwLTMpIGluIHRoZSBhcnJheSB3aWxsIGJlIHRoZSBSLCBHLCBCLCBBIHZhbHVlcyBvZiB0aGUgcGl4ZWwgYXRcXG4oMCwgMCkuIFRoZSBzZWNvbmQgZm91ciB2YWx1ZXMgKGluZGljZXMgNC03KSB3aWxsIGNvbnRhaW4gdGhlIFIsIEcsIEIsIEFcXG52YWx1ZXMgb2YgdGhlIHBpeGVsIGF0ICgxLCAwKS4gTW9yZSBnZW5lcmFsbHksIHRvIHNldCB2YWx1ZXMgZm9yIGEgcGl4ZWxcXG5hdCAoeCwgeSk6PC9wPlxcbjxwcmU+PGNvZGUgY2xhc3M9XFxcImxhbmctamF2YXNjcmlwdFxcXCI+dmFyIGQgPSBwaXhlbERlbnNpdHkoKTtcXG5mb3IgKHZhciBpID0gMDsgaSAmbHQ7IGQ7IGkrKykge1xcbiAgZm9yICh2YXIgaiA9IDA7IGogJmx0OyBkOyBqKyspIHtcXG4gICAgLy8gbG9vcCBvdmVyXFxuICAgIGlkeCA9IDQgKiAoKHkgKiBkICsgaikgKiB3aWR0aCAqIGQgKyAoeCAqIGQgKyBpKSk7XFxuICAgIHBpeGVsc1tpZHhdID0gcjtcXG4gICAgcGl4ZWxzW2lkeCsxXSA9IGc7XFxuICAgIHBpeGVsc1tpZHgrMl0gPSBiO1xcbiAgICBwaXhlbHNbaWR4KzNdID0gYTtcXG4gIH1cXG59XFxuPC9jb2RlPjwvcHJlPlxcbjxwPjxicj48YnI+XFxuQmVmb3JlIGFjY2Vzc2luZyB0aGlzIGFycmF5LCB0aGUgZGF0YSBtdXN0IGxvYWRlZCB3aXRoIHRoZSBsb2FkUGl4ZWxzKClcXG5mdW5jdGlvbi4gQWZ0ZXIgdGhlIGFycmF5IGRhdGEgaGFzIGJlZW4gbW9kaWZpZWQsIHRoZSB1cGRhdGVQaXhlbHMoKVxcbmZ1bmN0aW9uIG11c3QgYmUgcnVuIHRvIHVwZGF0ZSB0aGUgY2hhbmdlcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBpeGVsc1wiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW11cIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBpbWcgPSBjcmVhdGVJbWFnZSg2NiwgNjYpO1xcbmltZy5sb2FkUGl4ZWxzKCk7XFxuZm9yICh2YXIgaSA9IDA7IGkgPCBpbWcud2lkdGg7IGkrKykge1xcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBpbWcuaGVpZ2h0OyBqKyspIHtcXG4gICAgaW1nLnNldChpLCBqLCBjb2xvcigwLCA5MCwgMTAyKSk7XFxuICB9XFxufVxcbmltZy51cGRhdGVQaXhlbHMoKTtcXG5pbWFnZShpbWcsIDE3LCAxNyk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIHBpbmsgPSBjb2xvcigyNTUsIDEwMiwgMjA0KTtcXG52YXIgaW1nID0gY3JlYXRlSW1hZ2UoNjYsIDY2KTtcXG5pbWcubG9hZFBpeGVscygpO1xcbmZvciAodmFyIGkgPSAwOyBpIDwgNCAqICh3aWR0aCAqIGhlaWdodCAvIDIpOyBpICs9IDQpIHtcXG4gIGltZy5waXhlbHNbaV0gPSByZWQocGluayk7XFxuICBpbWcucGl4ZWxzW2kgKyAxXSA9IGdyZWVuKHBpbmspO1xcbiAgaW1nLnBpeGVsc1tpICsgMl0gPSBibHVlKHBpbmspO1xcbiAgaW1nLnBpeGVsc1tpICsgM10gPSBhbHBoYShwaW5rKTtcXG59XFxuaW1nLnVwZGF0ZVBpeGVscygpO1xcbmltYWdlKGltZywgMTcsIDE3KTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjY2eDY2IHR1cnF1b2lzZSByZWN0IGluIGNlbnRlciBvZiBjYW52YXNcXG42Nng2NiBwaW5rIHJlY3QgaW4gY2VudGVyIG9mIGNhbnZhc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkltYWdlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkltYWdlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL3A1LkltYWdlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjIxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkhlbHBlciBmeG4gZm9yIHNoYXJpbmcgcGl4ZWwgbWV0aG9kczwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5JbWFnZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJJbWFnZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9wNS5JbWFnZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIzMCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Mb2FkcyB0aGUgcGl4ZWxzIGRhdGEgZm9yIHRoaXMgaW1hZ2UgaW50byB0aGUgW3BpeGVsc10gYXR0cmlidXRlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxvYWRQaXhlbHNcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBteUltYWdlO1xcbnZhciBoYWxmSW1hZ2U7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIG15SW1hZ2UgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIG15SW1hZ2UubG9hZFBpeGVscygpO1xcbiAgaGFsZkltYWdlID0gNCAqIHdpZHRoICogaGVpZ2h0IC8gMjtcXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaGFsZkltYWdlOyBpKyspIHtcXG4gICAgbXlJbWFnZS5waXhlbHNbaSArIGhhbGZJbWFnZV0gPSBteUltYWdlLnBpeGVsc1tpXTtcXG4gIH1cXG4gIG15SW1hZ2UudXBkYXRlUGl4ZWxzKCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBpbWFnZShteUltYWdlLCAwLCAwKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCIyIGltYWdlcyBvZiByb2NreSBtb3VudGFpbnMgdmVydGljYWxseSBzdGFja2VkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuSW1hZ2VcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiSW1hZ2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvcDUuSW1hZ2UuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNjYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VXBkYXRlcyB0aGUgYmFja2luZyBjYW52YXMgZm9yIHRoaXMgaW1hZ2Ugd2l0aCB0aGUgY29udGVudHMgb2ZcXG50aGUgW3BpeGVsc10gYXJyYXkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidXBkYXRlUGl4ZWxzXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgbXlJbWFnZTtcXG52YXIgaGFsZkltYWdlO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBteUltYWdlID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBteUltYWdlLmxvYWRQaXhlbHMoKTtcXG4gIGhhbGZJbWFnZSA9IDQgKiB3aWR0aCAqIGhlaWdodCAvIDI7XFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbGZJbWFnZTsgaSsrKSB7XFxuICAgIG15SW1hZ2UucGl4ZWxzW2kgKyBoYWxmSW1hZ2VdID0gbXlJbWFnZS5waXhlbHNbaV07XFxuICB9XFxuICBteUltYWdlLnVwZGF0ZVBpeGVscygpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgaW1hZ2UobXlJbWFnZSwgMCwgMCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiMiBpbWFnZXMgb2Ygcm9ja3kgbW91bnRhaW5zIHZlcnRpY2FsbHkgc3RhY2tlZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkltYWdlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjY2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LW9mZnNldCBvZiB0aGUgdGFyZ2V0IHVwZGF0ZSBhcmVhIGZvciB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybHlpbmcgY2FudmFzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktb2Zmc2V0IG9mIHRoZSB0YXJnZXQgdXBkYXRlIGFyZWEgZm9yIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJseWluZyBjYW52YXM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIndcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aGVpZ2h0IG9mIHRoZSB0YXJnZXQgdXBkYXRlIGFyZWEgZm9yIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJseWluZyBjYW52YXM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aGVpZ2h0IG9mIHRoZSB0YXJnZXQgdXBkYXRlIGFyZWEgZm9yIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJseWluZyBjYW52YXM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDMwNixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9wNS5JbWFnZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMxNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5HZXQgYSByZWdpb24gb2YgcGl4ZWxzIGZyb20gYW4gaW1hZ2UuPC9wPlxcbjxwPklmIG5vIHBhcmFtcyBhcmUgcGFzc2VkLCB0aG9zZSB3aG9sZSBpbWFnZSBpcyByZXR1cm5lZCxcXG5pZiB4IGFuZCB5IGFyZSB0aGUgb25seSBwYXJhbXMgcGFzc2VkIGEgc2luZ2xlIHBpeGVsIGlzIGV4dHJhY3RlZFxcbmlmIGFsbCBwYXJhbXMgYXJlIHBhc3NlZCBhIHJlY3RhbmdsZSByZWdpb24gaXMgZXh0cmFjdGVkIGFuZCBhIHA1LkltYWdlXFxuaXMgcmV0dXJuZWQuPC9wPlxcbjxwPlJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSByZWdpb24gaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBpbWFnZTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSBwaXhlbDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIndcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPndpZHRoPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmhlaWdodDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImNvbG9yIG9mIHBpeGVsIGF0IHgseSBpbiBhcnJheSBmb3JtYXRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSLCBHLCBCLCBBXSBvciBwNS5JbWFnZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcltdfENvbG9yfHA1LkltYWdlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgbXlJbWFnZTtcXG52YXIgYztcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgbXlJbWFnZSA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZChteUltYWdlKTtcXG4gIG5vU3Ryb2tlKCk7XFxuICBjID0gbXlJbWFnZS5nZXQoNjAsIDkwKTtcXG4gIGZpbGwoYyk7XFxuICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcXG59XFxuXFxuLy9nZXQoKSByZXR1cm5zIGNvbG9yIGhlcmVcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImltYWdlIG9mIHJvY2t5IG1vdW50YWlucyB3aXRoIDUweDUwIGdyZWVuIHJlY3QgaW4gZnJvbnRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5JbWFnZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJJbWFnZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9wNS5JbWFnZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM1OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIGNvbG9yIG9mIGEgc2luZ2xlIHBpeGVsIG9yIHdyaXRlIGFuIGltYWdlIGludG9cXG50aGlzIHA1LkltYWdlLjwvcD5cXG48cD5Ob3RlIHRoYXQgZm9yIGEgbGFyZ2UgbnVtYmVyIG9mIHBpeGVscyB0aGlzIHdpbGxcXG5iZSBzbG93ZXIgdGhhbiBkaXJlY3RseSBtYW5pcHVsYXRpbmcgdGhlIHBpeGVscyBhcnJheVxcbmFuZCB0aGVuIGNhbGxpbmcgdXBkYXRlUGl4ZWxzKCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LWNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ncmF5c2NhbGUgdmFsdWUgfCBwaXhlbCBhcnJheSB8XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcDUuQ29sb3IgfCBpbWFnZSB0byBjb3B5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8TnVtYmVyW118T2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZyA9IGNyZWF0ZUltYWdlKDY2LCA2Nik7XFxuaW1nLmxvYWRQaXhlbHMoKTtcXG5mb3IgKHZhciBpID0gMDsgaSA8IGltZy53aWR0aDsgaSsrKSB7XFxuICBmb3IgKHZhciBqID0gMDsgaiA8IGltZy5oZWlnaHQ7IGorKykge1xcbiAgICBpbWcuc2V0KGksIGosIGNvbG9yKDAsIDkwLCAxMDIsIChpICUgaW1nLndpZHRoKSAqIDIpKTtcXG4gIH1cXG59XFxuaW1nLnVwZGF0ZVBpeGVscygpO1xcbmltYWdlKGltZywgMTcsIDE3KTtcXG5pbWFnZShpbWcsIDM0LCAzNCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCIyIGdyYWRhdGVkIGRhcmsgdHVycXVvaXNlIHJlY3RzIGZhZGUgbGVmdC4gMSBjZW50ZXIgMSBib3R0b20gcmlnaHQgb2YgY2FudmFzXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuSW1hZ2VcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiSW1hZ2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvcDUuSW1hZ2UuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzOTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmVzaXplIHRoZSBpbWFnZSB0byBhIG5ldyB3aWR0aCBhbmQgaGVpZ2h0LiBUbyBtYWtlIHRoZSBpbWFnZSBzY2FsZVxcbnByb3BvcnRpb25hbGx5LCB1c2UgMCBhcyB0aGUgdmFsdWUgZm9yIHRoZSB3aWRlIG9yIGhpZ2ggcGFyYW1ldGVyLlxcbkZvciBpbnN0YW5jZSwgdG8gbWFrZSB0aGUgd2lkdGggb2YgYW4gaW1hZ2UgMTUwIHBpeGVscywgYW5kIGNoYW5nZVxcbnRoZSBoZWlnaHQgdXNpbmcgdGhlIHNhbWUgcHJvcG9ydGlvbiwgdXNlIHJlc2l6ZSgxNTAsIDApLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlc2l6ZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid2lkdGhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSByZXNpemVkIGltYWdlIHdpZHRoPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJoZWlnaHRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSByZXNpemVkIGltYWdlIGhlaWdodDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIGltZztcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGltYWdlKGltZywgMCwgMCk7XFxufVxcblxcbmZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcXG4gIGltZy5yZXNpemUoNTAsIDEwMCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiaW1hZ2Ugb2Ygcm9ja3kgbW91bnRhaW5zLiB6b29tZWQgaW5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5JbWFnZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJJbWFnZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9wNS5JbWFnZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ4MSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db3BpZXMgYSByZWdpb24gb2YgcGl4ZWxzIGZyb20gb25lIGltYWdlIHRvIGFub3RoZXIuIElmIG5vXFxuc3JjSW1hZ2UgaXMgc3BlY2lmaWVkIHRoaXMgaXMgdXNlZCBhcyB0aGUgc291cmNlLiBJZiB0aGUgc291cmNlXFxuYW5kIGRlc3RpbmF0aW9uIHJlZ2lvbnMgYXJlbiYjMzk7dCB0aGUgc2FtZSBzaXplLCBpdCB3aWxsXFxuYXV0b21hdGljYWxseSByZXNpemUgc291cmNlIHBpeGVscyB0byBmaXQgdGhlIHNwZWNpZmllZFxcbnRhcmdldCByZWdpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29weVwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHBob3RvO1xcbnZhciBicmlja3M7XFxudmFyIHg7XFxudmFyIHk7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIHBob3RvID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG4gIGJyaWNrcyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrcy5qcGcnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB4ID0gYnJpY2tzLndpZHRoIC8gMjtcXG4gIHkgPSBicmlja3MuaGVpZ2h0IC8gMjtcXG4gIHBob3RvLmNvcHkoYnJpY2tzLCAwLCAwLCB4LCB5LCAwLCAwLCB4LCB5KTtcXG4gIGltYWdlKHBob3RvLCAwLCAwKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJpbWFnZSBvZiByb2NreSBtb3VudGFpbnMgYW5kIHNtYWxsZXIgaW1hZ2Ugb24gdG9wIG9mIGJyaWNrcyBhdCB0b3AgbGVmdFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkltYWdlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNDgxLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjSW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c291cmNlIGltYWdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LkltYWdlfHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzeFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5YIGNvb3JkaW5hdGUgb2YgdGhlIHNvdXJjZSYjMzk7cyB1cHBlciBsZWZ0IGNvcm5lcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3lcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+WSBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UmIzM5O3MgdXBwZXIgbGVmdCBjb3JuZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN3XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNvdXJjZSBpbWFnZSB3aWR0aDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c291cmNlIGltYWdlIGhlaWdodDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+WCBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbiYjMzk7cyB1cHBlciBsZWZ0IGNvcm5lcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+WSBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbiYjMzk7cyB1cHBlciBsZWZ0IGNvcm5lcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZGVzdGluYXRpb24gaW1hZ2Ugd2lkdGg8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmRlc3RpbmF0aW9uIGltYWdlIGhlaWdodDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNTIyLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvcDUuSW1hZ2UuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1NjEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TWFza3MgcGFydCBvZiBhbiBpbWFnZSBmcm9tIGRpc3BsYXlpbmcgYnkgbG9hZGluZyBhbm90aGVyXFxuaW1hZ2UgYW5kIHVzaW5nIGl0JiMzOTtzIGFscGhhIGNoYW5uZWwgYXMgYW4gYWxwaGEgY2hhbm5lbCBmb3JcXG50aGlzIGltYWdlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1hc2tcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNyY0ltYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zb3VyY2UgaW1hZ2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LkltYWdlXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHBob3RvLCBtYXNrSW1hZ2U7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIHBob3RvID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG4gIG1hc2tJbWFnZSA9IGxvYWRJbWFnZSgnYXNzZXRzL21hc2syLnBuZycpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBwaG90by5tYXNrKG1hc2tJbWFnZSk7XFxuICBpbWFnZShwaG90bywgMCwgMCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiaW1hZ2Ugb2Ygcm9ja3kgbW91bnRhaW5zIHdpdGggd2hpdGUgYXQgcmlnaHRcXG5cXG5cXG5odHRwOi8vYmxvZ3MuYWRvYmUuY29tL3dlYnBsYXRmb3JtLzIwMTMvMDEvMjgvYmxlbmRpbmctZmVhdHVyZXMtaW4tY2FudmFzL1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkltYWdlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkltYWdlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL3A1LkltYWdlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjI0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFwcGxpZXMgYW4gaW1hZ2UgZmlsdGVyIHRvIGEgcDUuSW1hZ2U8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJmaWx0ZXJcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZpbHRlclR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmVpdGhlciBUSFJFU0hPTEQsIEdSQVksIE9QQVFVRSwgSU5WRVJULFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1NURVJJWkUsIEJMVVIsIEVST0RFLCBESUxBVEUgb3IgQkxVUi5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIEZpbHRlcnMuanMgZm9yIGRvY3Mgb25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBhdmFpbGFibGUgZmlsdGVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJDb25zdGFudFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZpbHRlclBhcmFtXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hbiBvcHRpb25hbCBwYXJhbWV0ZXIgdW5pcXVlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGVhY2ggZmlsdGVyLCBzZWUgYWJvdmU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHBob3RvMTtcXG52YXIgcGhvdG8yO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBwaG90bzEgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xcbiAgcGhvdG8yID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBwaG90bzIuZmlsdGVyKCdncmF5Jyk7XFxuICBpbWFnZShwaG90bzEsIDAsIDApO1xcbiAgaW1hZ2UocGhvdG8yLCB3aWR0aCAvIDIsIDApO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjIgaW1hZ2VzIG9mIHJvY2t5IG1vdW50YWlucyBsZWZ0IG9uZSBpbiBjb2xvciwgcmlnaHQgaW4gYmxhY2sgYW5kIHdoaXRlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuSW1hZ2VcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiSW1hZ2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvcDUuSW1hZ2UuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2NjAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29waWVzIGEgcmVnaW9uIG9mIHBpeGVscyBmcm9tIG9uZSBpbWFnZSB0byBhbm90aGVyLCB1c2luZyBhIHNwZWNpZmllZFxcbmJsZW5kIG1vZGUgdG8gZG8gdGhlIG9wZXJhdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJibGVuZFwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIG1vdW50YWlucztcXG52YXIgYnJpY2tzO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBtb3VudGFpbnMgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xcbiAgYnJpY2tzID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzX3RoaXJkLmpwZycpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIG1vdW50YWlucy5ibGVuZChicmlja3MsIDAsIDAsIDMzLCAxMDAsIDY3LCAwLCAzMywgMTAwLCBBREQpO1xcbiAgaW1hZ2UobW91bnRhaW5zLCAwLCAwKTtcXG4gIGltYWdlKGJyaWNrcywgMCwgMCk7XFxufVxcbjwvY29kZT48L2Rpdj5cXG48ZGl2Pjxjb2RlPlxcbnZhciBtb3VudGFpbnM7XFxudmFyIGJyaWNrcztcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgbW91bnRhaW5zID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG4gIGJyaWNrcyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrc190aGlyZC5qcGcnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBtb3VudGFpbnMuYmxlbmQoYnJpY2tzLCAwLCAwLCAzMywgMTAwLCA2NywgMCwgMzMsIDEwMCwgREFSS0VTVCk7XFxuICBpbWFnZShtb3VudGFpbnMsIDAsIDApO1xcbiAgaW1hZ2UoYnJpY2tzLCAwLCAwKTtcXG59XFxuPC9jb2RlPjwvZGl2PlxcbjxkaXY+PGNvZGU+XFxudmFyIG1vdW50YWlucztcXG52YXIgYnJpY2tzO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBtb3VudGFpbnMgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xcbiAgYnJpY2tzID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzX3RoaXJkLmpwZycpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIG1vdW50YWlucy5ibGVuZChicmlja3MsIDAsIDAsIDMzLCAxMDAsIDY3LCAwLCAzMywgMTAwLCBMSUdIVEVTVCk7XFxuICBpbWFnZShtb3VudGFpbnMsIDAsIDApO1xcbiAgaW1hZ2UoYnJpY2tzLCAwLCAwKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJpbWFnZSBvZiByb2NreSBtb3VudGFpbnMuIEJyaWNrIGltYWdlcyBvbiBsZWZ0IGFuZCByaWdodC4gUmlnaHQgb3ZlcmV4cG9zZWRcXG5pbWFnZSBvZiByb2NraWVzLiBCcmlja3dhbGwgaW1hZ2VzIG9uIGxlZnQgYW5kIHJpZ2h0LiBSaWdodCBtb3J0YXIgdHJhbnNwYXJlbnRcXG5pbWFnZSBvZiByb2NraWVzLiBCcmlja3dhbGwgaW1hZ2VzIG9uIGxlZnQgYW5kIHJpZ2h0LiBSaWdodCB0cmFuc2x1Y2VudFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkltYWdlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNjYwLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjSW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c291cmNlIGltYWdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LkltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+WCBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UmIzM5O3MgdXBwZXIgbGVmdCBjb3JuZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlkgY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlJiMzOTtzIHVwcGVyIGxlZnQgY29ybmVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zb3VyY2UgaW1hZ2Ugd2lkdGg8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNvdXJjZSBpbWFnZSBoZWlnaHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlggY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24mIzM5O3MgdXBwZXIgbGVmdCBjb3JuZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlkgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24mIzM5O3MgdXBwZXIgbGVmdCBjb3JuZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR3XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmRlc3RpbmF0aW9uIGltYWdlIHdpZHRoPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5kZXN0aW5hdGlvbiBpbWFnZSBoZWlnaHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImJsZW5kTW9kZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgYmxlbmQgbW9kZS4gZWl0aGVyXFxuICAgIEJMRU5ELCBEQVJLRVNULCBMSUdIVEVTVCwgRElGRkVSRU5DRSxcXG4gICAgTVVMVElQTFksIEVYQ0xVU0lPTiwgU0NSRUVOLCBSRVBMQUNFLCBPVkVSTEFZLCBIQVJEX0xJR0hULFxcbiAgICBTT0ZUX0xJR0hULCBET0RHRSwgQlVSTiwgQUREIG9yIE5PUk1BTC48L3A+XFxuPHA+QXZhaWxhYmxlIGJsZW5kIG1vZGVzIGFyZTogbm9ybWFsIHwgbXVsdGlwbHkgfCBzY3JlZW4gfCBvdmVybGF5IHxcXG4gICAgICAgICAgIGRhcmtlbiB8IGxpZ2h0ZW4gfCBjb2xvci1kb2RnZSB8IGNvbG9yLWJ1cm4gfCBoYXJkLWxpZ2h0IHxcXG4gICAgICAgICAgIHNvZnQtbGlnaHQgfCBkaWZmZXJlbmNlIHwgZXhjbHVzaW9uIHwgaHVlIHwgc2F0dXJhdGlvbiB8XFxuICAgICAgICAgICBjb2xvciB8IGx1bWlub3NpdHk8L3A+XFxuPHA+PGEgaHJlZj1cXFwiaHR0cDovL2Jsb2dzLmFkb2JlLmNvbS93ZWJwbGF0Zm9ybS8yMDEzLzAxLzI4L2JsZW5kaW5nLWZlYXR1cmVzLWluLWNhbnZhcy9cXFwiPmh0dHA6Ly9ibG9ncy5hZG9iZS5jb20vd2VicGxhdGZvcm0vMjAxMy8wMS8yOC9ibGVuZGluZy1mZWF0dXJlcy1pbi1jYW52YXMvPC9hPjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJDb25zdGFudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDczOSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkeFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR3XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYmxlbmRNb2RlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkNvbnN0YW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL3A1LkltYWdlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzgyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNhdmVzIHRoZSBpbWFnZSB0byBhIGZpbGUgYW5kIGZvcmNlIHRoZSBicm93c2VyIHRvIGRvd25sb2FkIGl0LlxcbkFjY2VwdHMgdHdvIHN0cmluZ3MgZm9yIGZpbGVuYW1lIGFuZCBmaWxlIGV4dGVuc2lvblxcblN1cHBvcnRzIHBuZyAoZGVmYXVsdCkgYW5kIGpwZy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzYXZlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmaWxlbmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Z2l2ZSB5b3VyIGZpbGUgYSBuYW1lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJleHRlbnNpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPiYjMzk7cG5nJiMzOTsgb3IgJiMzOTtqcGcmIzM5OzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHBob3RvO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBwaG90byA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBpbWFnZShwaG90bywgMCwgMCk7XFxufVxcblxcbmZ1bmN0aW9uIGtleVR5cGVkKCkge1xcbiAgaWYgKGtleSA9PT0gJ3MnKSB7XFxuICAgIHBob3RvLnNhdmUoJ3Bob3RvJywgJ3BuZycpO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImltYWdlIG9mIHJvY2t5IG1vdW50YWlucy5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5JbWFnZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJJbWFnZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9waXhlbHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD48YSBocmVmPSdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZVxcbi9HbG9iYWxfT2JqZWN0cy9VaW50OENsYW1wZWRBcnJheScgdGFyZ2V0PSdfYmxhbmsnPlVpbnQ4Q2xhbXBlZEFycmF5PC9hPlxcbmNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgYWxsIHRoZSBwaXhlbHMgaW4gdGhlIGRpc3BsYXkgd2luZG93LlxcblRoZXNlIHZhbHVlcyBhcmUgbnVtYmVycy4gVGhpcyBhcnJheSBpcyB0aGUgc2l6ZSAoaW5jbHVkZSBhbiBhcHByb3ByaWF0ZVxcbmZhY3RvciBmb3IgcGl4ZWxEZW5zaXR5KSBvZiB0aGUgZGlzcGxheSB3aW5kb3cgeDQsXFxucmVwcmVzZW50aW5nIHRoZSBSLCBHLCBCLCBBIHZhbHVlcyBpbiBvcmRlciBmb3IgZWFjaCBwaXhlbCwgbW92aW5nIGZyb21cXG5sZWZ0IHRvIHJpZ2h0IGFjcm9zcyBlYWNoIHJvdywgdGhlbiBkb3duIGVhY2ggY29sdW1uLiBSZXRpbmEgYW5kIG90aGVyXFxuaGlnaCBkZW5zaXR5IGRpc3BsYXlzIHdpbGwgaGF2ZSBtb3JlIHBpeGVsc1tdIChieSBhIGZhY3RvciBvZlxcbnBpeGVsRGVuc2l0eV4yKS5cXG5Gb3IgZXhhbXBsZSwgaWYgdGhlIGltYWdlIGlzIDEwMHgxMDAgcGl4ZWxzLCB0aGVyZSB3aWxsIGJlIDQwLDAwMC4gT24gYVxcbnJldGluYSBkaXNwbGF5LCB0aGVyZSB3aWxsIGJlIDE2MCwwMDAuXFxuPGJyPjxicj5cXG5UaGUgZmlyc3QgZm91ciB2YWx1ZXMgKGluZGljZXMgMC0zKSBpbiB0aGUgYXJyYXkgd2lsbCBiZSB0aGUgUiwgRywgQiwgQVxcbnZhbHVlcyBvZiB0aGUgcGl4ZWwgYXQgKDAsIDApLiBUaGUgc2Vjb25kIGZvdXIgdmFsdWVzIChpbmRpY2VzIDQtNykgd2lsbFxcbmNvbnRhaW4gdGhlIFIsIEcsIEIsIEEgdmFsdWVzIG9mIHRoZSBwaXhlbCBhdCAoMSwgMCkuIE1vcmUgZ2VuZXJhbGx5LCB0b1xcbnNldCB2YWx1ZXMgZm9yIGEgcGl4ZWwgYXQgKHgsIHkpOjwvcD5cXG48cHJlPjxjb2RlIGNsYXNzPVxcXCJsYW5nLWphdmFzY3JpcHRcXFwiPnZhciBkID0gcGl4ZWxEZW5zaXR5KCk7XFxuZm9yICh2YXIgaSA9IDA7IGkgJmx0OyBkOyBpKyspIHtcXG4gIGZvciAodmFyIGogPSAwOyBqICZsdDsgZDsgaisrKSB7XFxuICAgIC8vIGxvb3Agb3ZlclxcbiAgICBpZHggPSA0ICogKCh5ICogZCArIGopICogd2lkdGggKiBkICsgKHggKiBkICsgaSkpO1xcbiAgICBwaXhlbHNbaWR4XSA9IHI7XFxuICAgIHBpeGVsc1tpZHgrMV0gPSBnO1xcbiAgICBwaXhlbHNbaWR4KzJdID0gYjtcXG4gICAgcGl4ZWxzW2lkeCszXSA9IGE7XFxuICB9XFxufVxcbjwvY29kZT48L3ByZT5cXG48cD5XaGlsZSB0aGUgYWJvdmUgbWV0aG9kIGlzIGNvbXBsZXgsIGl0IGlzIGZsZXhpYmxlIGVub3VnaCB0byB3b3JrIHdpdGhcXG5hbnkgcGl4ZWxEZW5zaXR5LiBOb3RlIHRoYXQgc2V0KCkgd2lsbCBhdXRvbWF0aWNhbGx5IHRha2UgY2FyZSBvZlxcbnNldHRpbmcgYWxsIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMgaW4gcGl4ZWxzW10gZm9yIGEgZ2l2ZW4gKHgsIHkpIGF0XFxuYW55IHBpeGVsRGVuc2l0eSwgYnV0IHRoZSBwZXJmb3JtYW5jZSBtYXkgbm90IGJlIGFzIGZhc3Qgd2hlbiBsb3RzIG9mXFxubW9kaWZpY2F0aW9ucyBhcmUgbWFkZSB0byB0aGUgcGl4ZWwgYXJyYXkuXFxuPGJyPjxicj5cXG5CZWZvcmUgYWNjZXNzaW5nIHRoaXMgYXJyYXksIHRoZSBkYXRhIG11c3QgbG9hZGVkIHdpdGggdGhlIGxvYWRQaXhlbHMoKVxcbmZ1bmN0aW9uLiBBZnRlciB0aGUgYXJyYXkgZGF0YSBoYXMgYmVlbiBtb2RpZmllZCwgdGhlIHVwZGF0ZVBpeGVscygpXFxuZnVuY3Rpb24gbXVzdCBiZSBydW4gdG8gdXBkYXRlIHRoZSBjaGFuZ2VzLlxcbjxicj48YnI+XFxuTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgc3RhbmRhcmQgamF2YXNjcmlwdCBhcnJheS4gIFRoaXMgbWVhbnMgdGhhdFxcbnN0YW5kYXJkIGphdmFzY3JpcHQgZnVuY3Rpb25zIHN1Y2ggYXMgPGNvZGU+c2xpY2UoKTwvY29kZT4gb3JcXG48Y29kZT5hcnJheUNvcHkoKTwvY29kZT4gZG8gbm90XFxud29yay48L3A+XCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBpeGVsc1wiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW11cIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBwaW5rID0gY29sb3IoMjU1LCAxMDIsIDIwNCk7XFxubG9hZFBpeGVscygpO1xcbnZhciBkID0gcGl4ZWxEZW5zaXR5KCk7XFxudmFyIGhhbGZJbWFnZSA9IDQgKiAod2lkdGggKiBkKSAqIChoZWlnaHQgLyAyICogZCk7XFxuZm9yICh2YXIgaSA9IDA7IGkgPCBoYWxmSW1hZ2U7IGkgKz0gNCkge1xcbiAgcGl4ZWxzW2ldID0gcmVkKHBpbmspO1xcbiAgcGl4ZWxzW2kgKyAxXSA9IGdyZWVuKHBpbmspO1xcbiAgcGl4ZWxzW2kgKyAyXSA9IGJsdWUocGluayk7XFxuICBwaXhlbHNbaSArIDNdID0gYWxwaGEocGluayk7XFxufVxcbnVwZGF0ZVBpeGVscygpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwidG9wIGhhbGYgb2YgY2FudmFzIHBpbmssIGJvdHRvbSBncmV5XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiUGl4ZWxzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL3BpeGVscy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvcGllcyBhIHJlZ2lvbiBvZiBwaXhlbHMgZnJvbSBvbmUgaW1hZ2UgdG8gYW5vdGhlciwgdXNpbmcgYSBzcGVjaWZpZWRcXG5ibGVuZCBtb2RlIHRvIGRvIHRoZSBvcGVyYXRpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYmxlbmRcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBpbWcwO1xcbnZhciBpbWcxO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBpbWcwID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG4gIGltZzEgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3NfdGhpcmQuanBnJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZChpbWcwKTtcXG4gIGltYWdlKGltZzEsIDAsIDApO1xcbiAgYmxlbmQoaW1nMSwgMCwgMCwgMzMsIDEwMCwgNjcsIDAsIDMzLCAxMDAsIExJR0hURVNUKTtcXG59XFxuPC9jb2RlPjwvZGl2PlxcbjxkaXY+PGNvZGU+XFxudmFyIGltZzA7XFxudmFyIGltZzE7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGltZzAgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xcbiAgaW1nMSA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrc190aGlyZC5qcGcnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKGltZzApO1xcbiAgaW1hZ2UoaW1nMSwgMCwgMCk7XFxuICBibGVuZChpbWcxLCAwLCAwLCAzMywgMTAwLCA2NywgMCwgMzMsIDEwMCwgREFSS0VTVCk7XFxufVxcbjwvY29kZT48L2Rpdj5cXG48ZGl2Pjxjb2RlPlxcbnZhciBpbWcwO1xcbnZhciBpbWcxO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBpbWcwID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG4gIGltZzEgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3NfdGhpcmQuanBnJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZChpbWcwKTtcXG4gIGltYWdlKGltZzEsIDAsIDApO1xcbiAgYmxlbmQoaW1nMSwgMCwgMCwgMzMsIDEwMCwgNjcsIDAsIDMzLCAxMDAsIEFERCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiaW1hZ2Ugb2Ygcm9ja3kgbW91bnRhaW5zLiBCcmljayBpbWFnZXMgb24gbGVmdCBhbmQgcmlnaHQuIFJpZ2h0IG92ZXJleHBvc2VkXFxuaW1hZ2Ugb2Ygcm9ja2llcy4gQnJpY2t3YWxsIGltYWdlcyBvbiBsZWZ0IGFuZCByaWdodC4gUmlnaHQgbW9ydGFyIHRyYW5zcGFyZW50XFxuaW1hZ2Ugb2Ygcm9ja2llcy4gQnJpY2t3YWxsIGltYWdlcyBvbiBsZWZ0IGFuZCByaWdodC4gUmlnaHQgdHJhbnNsdWNlbnRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJQaXhlbHNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA4MyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNyY0ltYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNvdXJjZSBpbWFnZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5JbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlggY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlJiMzOTtzIHVwcGVyIGxlZnQgY29ybmVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ZIGNvb3JkaW5hdGUgb2YgdGhlIHNvdXJjZSYjMzk7cyB1cHBlciBsZWZ0IGNvcm5lcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c291cmNlIGltYWdlIHdpZHRoPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zb3VyY2UgaW1hZ2UgaGVpZ2h0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkeFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5YIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uJiMzOTtzIHVwcGVyIGxlZnQgY29ybmVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ZIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uJiMzOTtzIHVwcGVyIGxlZnQgY29ybmVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5kZXN0aW5hdGlvbiBpbWFnZSB3aWR0aDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZGVzdGluYXRpb24gaW1hZ2UgaGVpZ2h0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJibGVuZE1vZGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIGJsZW5kIG1vZGUuIGVpdGhlclxcbiAgICBCTEVORCwgREFSS0VTVCwgTElHSFRFU1QsIERJRkZFUkVOQ0UsXFxuICAgIE1VTFRJUExZLCBFWENMVVNJT04sIFNDUkVFTiwgUkVQTEFDRSwgT1ZFUkxBWSwgSEFSRF9MSUdIVCxcXG4gICAgU09GVF9MSUdIVCwgRE9ER0UsIEJVUk4sIEFERCBvciBOT1JNQUwuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkNvbnN0YW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTU2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJibGVuZE1vZGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29uc3RhbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvcGl4ZWxzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTc3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvcGllcyBhIHJlZ2lvbiBvZiB0aGUgY2FudmFzIHRvIGFub3RoZXIgcmVnaW9uIG9mIHRoZSBjYW52YXNcXG5hbmQgY29waWVzIGEgcmVnaW9uIG9mIHBpeGVscyBmcm9tIGFuIGltYWdlIHVzZWQgYXMgdGhlIHNyY0ltZyBwYXJhbWV0ZXJcXG5pbnRvIHRoZSBjYW52YXMgc3JjSW1hZ2UgaXMgc3BlY2lmaWVkIHRoaXMgaXMgdXNlZCBhcyB0aGUgc291cmNlLiBJZlxcbnRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ2lvbnMgYXJlbiYjMzk7dCB0aGUgc2FtZSBzaXplLCBpdCB3aWxsXFxuYXV0b21hdGljYWxseSByZXNpemUgc291cmNlIHBpeGVscyB0byBmaXQgdGhlIHNwZWNpZmllZFxcbnRhcmdldCByZWdpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29weVwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIGltZztcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKGltZyk7XFxuICBjb3B5KGltZywgNywgMjIsIDEwLCAxMCwgMzUsIDI1LCA1MCwgNTApO1xcbiAgc3Ryb2tlKDI1NSk7XFxuICBub0ZpbGwoKTtcXG4gIC8vIFJlY3RhbmdsZSBzaG93cyBhcmVhIGJlaW5nIGNvcGllZFxcbiAgcmVjdCg3LCAyMiwgMTAsIDEwKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJpbWFnZSBvZiByb2NreSBtb3VudGFpbnMuIEJyaWNrIGltYWdlcyBvbiBsZWZ0IGFuZCByaWdodC4gUmlnaHQgb3ZlcmV4cG9zZWRcXG5pbWFnZSBvZiByb2NraWVzLiBCcmlja3dhbGwgaW1hZ2VzIG9uIGxlZnQgYW5kIHJpZ2h0LiBSaWdodCBtb3J0YXIgdHJhbnNwYXJlbnRcXG5pbWFnZSBvZiByb2NraWVzLiBCcmlja3dhbGwgaW1hZ2VzIG9uIGxlZnQgYW5kIHJpZ2h0LiBSaWdodCB0cmFuc2x1Y2VudFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlBpeGVsc1wiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE3NyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNyY0ltYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNvdXJjZSBpbWFnZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5JbWFnZXxwNS5FbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+WCBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UmIzM5O3MgdXBwZXIgbGVmdCBjb3JuZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlkgY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlJiMzOTtzIHVwcGVyIGxlZnQgY29ybmVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zb3VyY2UgaW1hZ2Ugd2lkdGg8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNvdXJjZSBpbWFnZSBoZWlnaHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlggY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24mIzM5O3MgdXBwZXIgbGVmdCBjb3JuZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlkgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24mIzM5O3MgdXBwZXIgbGVmdCBjb3JuZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR3XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmRlc3RpbmF0aW9uIGltYWdlIHdpZHRoPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5kZXN0aW5hdGlvbiBpbWFnZSBoZWlnaHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDIyMCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkeFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR3XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL3BpeGVscy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIzNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BcHBsaWVzIGEgZmlsdGVyIHRvIHRoZSBjYW52YXMuXFxuPGJyPjxicj48L3A+XFxuPHA+VGhlIHByZXNldHMgb3B0aW9ucyBhcmU6XFxuPGJyPjxicj48L3A+XFxuPHA+VEhSRVNIT0xEXFxuQ29udmVydHMgdGhlIGltYWdlIHRvIGJsYWNrIGFuZCB3aGl0ZSBwaXhlbHMgZGVwZW5kaW5nIGlmIHRoZXkgYXJlIGFib3ZlIG9yXFxuYmVsb3cgdGhlIHRocmVzaG9sZCBkZWZpbmVkIGJ5IHRoZSBsZXZlbCBwYXJhbWV0ZXIuIFRoZSBwYXJhbWV0ZXIgbXVzdCBiZVxcbmJldHdlZW4gMC4wIChibGFjaykgYW5kIDEuMCAod2hpdGUpLiBJZiBubyBsZXZlbCBpcyBzcGVjaWZpZWQsIDAuNSBpcyB1c2VkLlxcbjxicj48YnI+PC9wPlxcbjxwPkdSQVlcXG5Db252ZXJ0cyBhbnkgY29sb3JzIGluIHRoZSBpbWFnZSB0byBncmF5c2NhbGUgZXF1aXZhbGVudHMuIE5vIHBhcmFtZXRlclxcbmlzIHVzZWQuXFxuPGJyPjxicj48L3A+XFxuPHA+T1BBUVVFXFxuU2V0cyB0aGUgYWxwaGEgY2hhbm5lbCB0byBlbnRpcmVseSBvcGFxdWUuIE5vIHBhcmFtZXRlciBpcyB1c2VkLlxcbjxicj48YnI+PC9wPlxcbjxwPklOVkVSVFxcblNldHMgZWFjaCBwaXhlbCB0byBpdHMgaW52ZXJzZSB2YWx1ZS4gTm8gcGFyYW1ldGVyIGlzIHVzZWQuXFxuPGJyPjxicj48L3A+XFxuPHA+UE9TVEVSSVpFXFxuTGltaXRzIGVhY2ggY2hhbm5lbCBvZiB0aGUgaW1hZ2UgdG8gdGhlIG51bWJlciBvZiBjb2xvcnMgc3BlY2lmaWVkIGFzIHRoZVxcbnBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIHZhbHVlcyBiZXR3ZWVuIDIgYW5kIDI1NSwgYnV0XFxucmVzdWx0cyBhcmUgbW9zdCBub3RpY2VhYmxlIGluIHRoZSBsb3dlciByYW5nZXMuXFxuPGJyPjxicj48L3A+XFxuPHA+QkxVUlxcbkV4ZWN1dGVzIGEgR2F1c3NpYW4gYmx1ciB3aXRoIHRoZSBsZXZlbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgZXh0ZW50XFxub2YgdGhlIGJsdXJyaW5nLiBJZiBubyBwYXJhbWV0ZXIgaXMgdXNlZCwgdGhlIGJsdXIgaXMgZXF1aXZhbGVudCB0b1xcbkdhdXNzaWFuIGJsdXIgb2YgcmFkaXVzIDEuIExhcmdlciB2YWx1ZXMgaW5jcmVhc2UgdGhlIGJsdXIuXFxuPGJyPjxicj48L3A+XFxuPHA+RVJPREVcXG5SZWR1Y2VzIHRoZSBsaWdodCBhcmVhcy4gTm8gcGFyYW1ldGVyIGlzIHVzZWQuXFxuPGJyPjxicj48L3A+XFxuPHA+RElMQVRFXFxuSW5jcmVhc2VzIHRoZSBsaWdodCBhcmVhcy4gTm8gcGFyYW1ldGVyIGlzIHVzZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsdGVyXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmaWx0ZXJUeXBlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5laXRoZXIgVEhSRVNIT0xELCBHUkFZLCBPUEFRVUUsIElOVkVSVCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9TVEVSSVpFLCBCTFVSLCBFUk9ERSwgRElMQVRFIG9yIEJMVVIuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBGaWx0ZXJzLmpzIGZvciBkb2NzIG9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggYXZhaWxhYmxlIGZpbHRlcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29uc3RhbnRcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmaWx0ZXJQYXJhbVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YW4gb3B0aW9uYWwgcGFyYW1ldGVyIHVuaXF1ZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBlYWNoIGZpbHRlciwgc2VlIGFib3ZlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBpbWc7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrcy5qcGcnKTtcXG59XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBpbWFnZShpbWcsIDAsIDApO1xcbiAgZmlsdGVyKFRIUkVTSE9MRCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBpbWc7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrcy5qcGcnKTtcXG59XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBpbWFnZShpbWcsIDAsIDApO1xcbiAgZmlsdGVyKEdSQVkpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgaW1nO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3MuanBnJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgaW1hZ2UoaW1nLCAwLCAwKTtcXG4gIGZpbHRlcihPUEFRVUUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgaW1nO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3MuanBnJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgaW1hZ2UoaW1nLCAwLCAwKTtcXG4gIGZpbHRlcihJTlZFUlQpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgaW1nO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3MuanBnJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgaW1hZ2UoaW1nLCAwLCAwKTtcXG4gIGZpbHRlcihQT1NURVJJWkUsIDMpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgaW1nO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3MuanBnJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgaW1hZ2UoaW1nLCAwLCAwKTtcXG4gIGZpbHRlcihESUxBVEUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgaW1nO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3MuanBnJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgaW1hZ2UoaW1nLCAwLCAwKTtcXG4gIGZpbHRlcihCTFVSLCAzKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzLmpwZycpO1xcbn1cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGltYWdlKGltZywgMCwgMCk7XFxuICBmaWx0ZXIoRVJPREUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImJsYWNrIGFuZCB3aGl0ZSBpbWFnZSBvZiBhIGJyaWNrIHdhbGwuXFxuZ3JleXNjYWxlIGltYWdlIG9mIGEgYnJpY2t3YWxsXFxuaW1hZ2Ugb2YgYSBicmlja3dhbGxcXG5qYWRlIGNvbG9yZWQgaW1hZ2Ugb2YgYSBicmlja3dhbGxcXG5yZWQgYW5kIHBpbmsgaW1hZ2Ugb2YgYSBicmlja3dhbGxcXG5pbWFnZSBvZiBhIGJyaWNrd2FsbFxcbmJsdXJyeSBpbWFnZSBvZiBhIGJyaWNrd2FsbFxcbmltYWdlIG9mIGEgYnJpY2t3YWxsXFxuaW1hZ2Ugb2YgYSBicmlja3dhbGwgd2l0aCBsZXNzIGRldGFpbFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlBpeGVsc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9waXhlbHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MTUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyBhbiBhcnJheSBvZiBbUixHLEIsQV0gdmFsdWVzIGZvciBhbnkgcGl4ZWwgb3IgZ3JhYnMgYSBzZWN0aW9uIG9mXFxuYW4gaW1hZ2UuIElmIG5vIHBhcmFtZXRlcnMgYXJlIHNwZWNpZmllZCwgdGhlIGVudGlyZSBpbWFnZSBpcyByZXR1cm5lZC5cXG5Vc2UgdGhlIHggYW5kIHkgcGFyYW1ldGVycyB0byBnZXQgdGhlIHZhbHVlIG9mIG9uZSBwaXhlbC4gR2V0IGEgc2VjdGlvbiBvZlxcbnRoZSBkaXNwbGF5IHdpbmRvdyBieSBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdyBhbmQgaCBwYXJhbWV0ZXJzLiBXaGVuXFxuZ2V0dGluZyBhbiBpbWFnZSwgdGhlIHggYW5kIHkgcGFyYW1ldGVycyBkZWZpbmUgdGhlIGNvb3JkaW5hdGVzIGZvciB0aGVcXG51cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UsIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgaW1hZ2VNb2RlKCkuXFxuPGJyPjxicj5cXG5JZiB0aGUgcGl4ZWwgcmVxdWVzdGVkIGlzIG91dHNpZGUgb2YgdGhlIGltYWdlIHdpbmRvdywgWzAsMCwwLDI1NV0gaXNcXG5yZXR1cm5lZC4gVG8gZ2V0IHRoZSBudW1iZXJzIHNjYWxlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2VzXFxuYW5kIHRha2luZyBpbnRvIGFjY291bnQgY29sb3JNb2RlLCB1c2UgZ2V0Q29sb3IgaW5zdGVhZCBvZiBnZXQuXFxuPGJyPjxicj5cXG5HZXR0aW5nIHRoZSBjb2xvciBvZiBhIHNpbmdsZSBwaXhlbCB3aXRoIGdldCh4LCB5KSBpcyBlYXN5LCBidXQgbm90IGFzIGZhc3RcXG5hcyBncmFiYmluZyB0aGUgZGF0YSBkaXJlY3RseSBmcm9tIHBpeGVsc1tdLiBUaGUgZXF1aXZhbGVudCBzdGF0ZW1lbnQgdG9cXG5nZXQoeCwgeSkgdXNpbmcgcGl4ZWxzW10gd2l0aCBwaXhlbCBkZW5zaXR5IGQgaXNcXG48Y29kZT5cXG52YXIgeCwgeSwgZDsgLy8gc2V0IHRoZXNlIHRvIHRoZSBjb29yZGluYXRlc1xcbnZhciBvZmYgPSAoeSA8ZW0+IHdpZHRoICsgeCkgPC9lbT4gZCAqIDQ7XFxudmFyIGNvbXBvbmVudHMgPSBbXFxuICBwaXhlbHNbb2ZmXSxcXG4gIHBpeGVsc1tvZmYgKyAxXSxcXG4gIHBpeGVsc1tvZmYgKyAyXSxcXG4gIHBpeGVsc1tvZmYgKyAzXVxcbl07XFxucHJpbnQoY29tcG9uZW50cyk7XFxuPC9jb2RlPlxcbjxicj48YnI+XFxuU2VlIHRoZSByZWZlcmVuY2UgZm9yIHBpeGVsc1tdIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSBwaXhlbDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIndcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPndpZHRoPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmhlaWdodDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInZhbHVlcyBvZiBwaXhlbCBhdCB4LHkgaW4gYXJyYXkgZm9ybWF0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUiwgRywgQiwgQV0gb3IgcDUuSW1hZ2VcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJbXXxwNS5JbWFnZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG59XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBpbWFnZShpbWcsIDAsIDApO1xcbiAgdmFyIGMgPSBnZXQoKTtcXG4gIGltYWdlKGMsIHdpZHRoIC8gMiwgMCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBpbWc7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgaW1hZ2UoaW1nLCAwLCAwKTtcXG4gIHZhciBjID0gZ2V0KDUwLCA5MCk7XFxuICBmaWxsKGMpO1xcbiAgbm9TdHJva2UoKTtcXG4gIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjIgaW1hZ2VzIG9mIHRoZSByb2NreSBtb3VudGFpbnMsIHNpZGUtYnktc2lkZVxcbkltYWdlIG9mIHRoZSByb2NreSBtb3VudGFpbnMgd2l0aCA1MHg1MCBncmVlbiByZWN0IGluIGNlbnRlciBvZiBjYW52YXNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJbWFnZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJQaXhlbHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW1hZ2UvcGl4ZWxzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDkxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkxvYWRzIHRoZSBwaXhlbCBkYXRhIGZvciB0aGUgZGlzcGxheSB3aW5kb3cgaW50byB0aGUgcGl4ZWxzW10gYXJyYXkuIFRoaXNcXG5mdW5jdGlvbiBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgYmVmb3JlIHJlYWRpbmcgZnJvbSBvciB3cml0aW5nIHRvIHBpeGVsc1tdLlxcbk5vdGUgdGhhdCBvbmx5IGNoYW5nZXMgbWFkZSB3aXRoIHNldCgpIG9yIGRpcmVjdCBtYW5pcHVsYXRpb24gb2YgcGl4ZWxzW11cXG53aWxsIG9jY3VyLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxvYWRQaXhlbHNcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBpbWc7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgaW1hZ2UoaW1nLCAwLCAwKTtcXG4gIHZhciBkID0gcGl4ZWxEZW5zaXR5KCk7XFxuICB2YXIgaGFsZkltYWdlID0gNCAqIChpbWcud2lkdGggKiBkKSAqIChpbWcuaGVpZ2h0ICogZCAvIDIpO1xcbiAgbG9hZFBpeGVscygpO1xcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYWxmSW1hZ2U7IGkrKykge1xcbiAgICBwaXhlbHNbaSArIGhhbGZJbWFnZV0gPSBwaXhlbHNbaV07XFxuICB9XFxuICB1cGRhdGVQaXhlbHMoKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ0d28gaW1hZ2VzIG9mIHRoZSByb2NreSBtb3VudGFpbnMuIG9uZSBvbiB0b3AsIG9uZSBvbiBib3R0b20gb2YgY2FudmFzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkltYWdlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlBpeGVsc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pbWFnZS9waXhlbHMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MjgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2hhbmdlcyB0aGUgY29sb3Igb2YgYW55IHBpeGVsLCBvciB3cml0ZXMgYW4gaW1hZ2UgZGlyZWN0bHkgdG8gdGhlXFxuZGlzcGxheSB3aW5kb3cuPC9wPlxcbjxwPlRoZSB4IGFuZCB5IHBhcmFtZXRlcnMgc3BlY2lmeSB0aGUgcGl4ZWwgdG8gY2hhbmdlIGFuZCB0aGUgYyBwYXJhbWV0ZXJcXG5zcGVjaWZpZXMgdGhlIGNvbG9yIHZhbHVlLiBUaGlzIGNhbiBiZSBhIHA1LkNvbG9yIG9iamVjdCwgb3IgW1IsIEcsIEIsIEFdXFxucGl4ZWwgYXJyYXkuIEl0IGNhbiBhbHNvIGJlIGEgc2luZ2xlIGdyYXlzY2FsZSB2YWx1ZS5cXG5XaGVuIHNldHRpbmcgYW4gaW1hZ2UsIHRoZSB4IGFuZCB5IHBhcmFtZXRlcnMgZGVmaW5lIHRoZSBjb29yZGluYXRlcyBmb3JcXG50aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlLCByZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50IGltYWdlTW9kZSgpLlxcbjwvcD5cXG48cD5cXG5BZnRlciB1c2luZyBzZXQoKSwgeW91IG11c3QgY2FsbCB1cGRhdGVQaXhlbHMoKSBmb3IgeW91ciBjaGFuZ2VzIHRvIGFwcGVhci5cXG5UaGlzIHNob3VsZCBiZSBjYWxsZWQgb25jZSBhbGwgcGl4ZWxzIGhhdmUgYmVlbiBzZXQsIGFuZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmVcXG5jYWxsaW5nIC5nZXQoKSBvciBkcmF3aW5nIHRoZSBpbWFnZS5cXG48L3A+XFxuPHA+U2V0dGluZyB0aGUgY29sb3Igb2YgYSBzaW5nbGUgcGl4ZWwgd2l0aCBzZXQoeCwgeSkgaXMgZWFzeSwgYnV0IG5vdCBhc1xcbmZhc3QgYXMgcHV0dGluZyB0aGUgZGF0YSBkaXJlY3RseSBpbnRvIHBpeGVsc1tdLiBTZXR0aW5nIHRoZSBwaXhlbHNbXVxcbnZhbHVlcyBkaXJlY3RseSBtYXkgYmUgY29tcGxpY2F0ZWQgd2hlbiB3b3JraW5nIHdpdGggYSByZXRpbmEgZGlzcGxheSxcXG5idXQgd2lsbCBwZXJmb3JtIGJldHRlciB3aGVuIGxvdHMgb2YgcGl4ZWxzIG5lZWQgdG8gYmUgc2V0IGRpcmVjdGx5IG9uXFxuZXZlcnkgbG9vcC48L3A+XFxuPHA+U2VlIHRoZSByZWZlcmVuY2UgZm9yIHBpeGVsc1tdIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSBwaXhlbDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1jb29yZGluYXRlIG9mIHRoZSBwaXhlbDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5zZXJ0IGEgZ3JheXNjYWxlIHZhbHVlIHwgYSBwaXhlbCBhcnJheSB8XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcDUuQ29sb3Igb2JqZWN0IHwgYSBwNS5JbWFnZSB0byBjb3B5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8TnVtYmVyW118T2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGJsYWNrID0gY29sb3IoMCk7XFxuc2V0KDMwLCAyMCwgYmxhY2spO1xcbnNldCg4NSwgMjAsIGJsYWNrKTtcXG5zZXQoODUsIDc1LCBibGFjayk7XFxuc2V0KDMwLCA3NSwgYmxhY2spO1xcbnVwZGF0ZVBpeGVscygpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmZvciAodmFyIGkgPSAzMDsgaSA8IHdpZHRoIC0gMTU7IGkrKykge1xcbiAgZm9yICh2YXIgaiA9IDIwOyBqIDwgaGVpZ2h0IC0gMjU7IGorKykge1xcbiAgICB2YXIgYyA9IGNvbG9yKDIwNCAtIGosIDE1MyAtIGksIDApO1xcbiAgICBzZXQoaSwgaiwgYyk7XFxuICB9XFxufVxcbnVwZGF0ZVBpeGVscygpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBpbWc7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgc2V0KDAsIDAsIGltZyk7XFxuICB1cGRhdGVQaXhlbHMoKTtcXG4gIGxpbmUoMCwgMCwgd2lkdGgsIGhlaWdodCk7XFxuICBsaW5lKDAsIGhlaWdodCwgd2lkdGgsIDApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjQgYmxhY2sgcG9pbnRzIGluIHRoZSBzaGFwZSBvZiBhIHNxdWFyZSBtaWRkbGUtcmlnaHQgb2YgY2FudmFzLlxcbnNxdWFyZSB3aXRoIG9yYW5nZXktYnJvd24gZ3JhZGllbnQgbGlnaHRlbmluZyBhdCBib3R0b20gcmlnaHQuXFxuaW1hZ2Ugb2YgdGhlIHJvY2t5IG1vdW50YWlucy4gd2l0aCBsaW5lcyBsaWtlIGFuICd4JyB0aHJvdWdoIHRoZSBjZW50ZXIuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiUGl4ZWxzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2ltYWdlL3BpeGVscy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDYwMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5VcGRhdGVzIHRoZSBkaXNwbGF5IHdpbmRvdyB3aXRoIHRoZSBkYXRhIGluIHRoZSBwaXhlbHNbXSBhcnJheS5cXG5Vc2UgaW4gY29uanVuY3Rpb24gd2l0aCBsb2FkUGl4ZWxzKCkuIElmIHlvdSYjMzk7cmUgb25seSByZWFkaW5nIHBpeGVscyBmcm9tXFxudGhlIGFycmF5LCB0aGVyZSYjMzk7cyBubyBuZWVkIHRvIGNhbGwgdXBkYXRlUGl4ZWxzKCkg4oCUIHVwZGF0aW5nIGlzIG9ubHlcXG5uZWNlc3NhcnkgdG8gYXBwbHkgY2hhbmdlcy4gdXBkYXRlUGl4ZWxzKCkgc2hvdWxkIGJlIGNhbGxlZCBhbnl0aW1lIHRoZVxcbnBpeGVscyBhcnJheSBpcyBtYW5pcHVsYXRlZCBvciBzZXQoKSBpcyBjYWxsZWQsIGFuZCBvbmx5IGNoYW5nZXMgbWFkZSB3aXRoXFxuc2V0KCkgb3IgZGlyZWN0IGNoYW5nZXMgdG8gcGl4ZWxzW10gd2lsbCBvY2N1ci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ1cGRhdGVQaXhlbHNcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPngtY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgcmVnaW9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgdG8gdXBkYXRlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgcmVnaW9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgdG8gdXBkYXRlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIndcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPndpZHRoIG9mIHJlZ2lvbiB0byB1cGRhdGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aGVpZ2h0IG9mIHJlZ2lvbiB0byB1cGRhdGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGltZztcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBpbWFnZShpbWcsIDAsIDApO1xcbiAgdmFyIGQgPSBwaXhlbERlbnNpdHkoKTtcXG4gIHZhciBoYWxmSW1hZ2UgPSA0ICogKGltZy53aWR0aCAqIGQpICogKGltZy5oZWlnaHQgKiBkIC8gMik7XFxuICBsb2FkUGl4ZWxzKCk7XFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbGZJbWFnZTsgaSsrKSB7XFxuICAgIHBpeGVsc1tpICsgaGFsZkltYWdlXSA9IHBpeGVsc1tpXTtcXG4gIH1cXG4gIHVwZGF0ZVBpeGVscygpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInR3byBpbWFnZXMgb2YgdGhlIHJvY2t5IG1vdW50YWlucy4gb25lIG9uIHRvcCwgb25lIG9uIGJvdHRvbSBvZiBjYW52YXMuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSW1hZ2VcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiUGl4ZWxzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL2ZpbGVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TG9hZHMgYSBKU09OIGZpbGUgZnJvbSBhIGZpbGUgb3IgYSBVUkwsIGFuZCByZXR1cm5zIGFuIE9iamVjdC5cXG5Ob3RlIHRoYXQgZXZlbiBpZiB0aGUgSlNPTiBmaWxlIGNvbnRhaW5zIGFuIEFycmF5LCBhbiBPYmplY3Qgd2lsbCBiZVxcbnJldHVybmVkIHdpdGggaW5kZXggbnVtYmVycyBhcyBrZXlzLjwvcD5cXG48cD5UaGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMsIG1lYW5pbmcgaXQgbWF5IG5vdCBmaW5pc2ggYmVmb3JlIHRoZSBuZXh0XFxubGluZSBpbiB5b3VyIHNrZXRjaCBpcyBleGVjdXRlZC4gSlNPTlAgaXMgc3VwcG9ydGVkIHZpYSBhIHBvbHlmaWxsIGFuZCB5b3VcXG5jYW4gcGFzcyBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IGFuIG9iamVjdCB3aXRoIGRlZmluaXRpb25zIG9mIHRoZSBqc29uXFxuY2FsbGJhY2sgZm9sbG93aW5nIHRoZSBzeW50YXggc3BlY2lmaWVkIDxhIGhyZWY9XFxcImh0dHBzOi8vZ2l0aHViLmNvbS9jYW1zb25nL1xcbmZldGNoLWpzb25wXFxcIj5oZXJlPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJsb2FkSlNPTlwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJKU09OIGRhdGFcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8QXJyYXlcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG5cXG48cD5DYWxsaW5nIGxvYWRKU09OKCkgaW5zaWRlIHByZWxvYWQoKSBndWFyYW50ZWVzIHRvIGNvbXBsZXRlIHRoZVxcbm9wZXJhdGlvbiBiZWZvcmUgc2V0dXAoKSBhbmQgZHJhdygpIGFyZSBjYWxsZWQuPC9wPlxcblxcbjxkaXY+PGNvZGU+XFxuLy8gRXhhbXBsZXMgdXNlIFVTR1MgRWFydGhxdWFrZSBBUEk6XFxuLy8gICBodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZmRzbndzL2V2ZW50LzEvI21ldGhvZHNcXG52YXIgZWFydGhxdWFrZXM7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIC8vIEdldCB0aGUgbW9zdCByZWNlbnQgZWFydGhxdWFrZSBpbiB0aGUgZGF0YWJhc2VcXG4gIHZhciB1cmwgPVxcbiAgICdodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZWFydGhxdWFrZXMvZmVlZC92MS4wLycgK1xcbiAgICAnc3VtbWFyeS9hbGxfZGF5Lmdlb2pzb24nO1xcbiAgZWFydGhxdWFrZXMgPSBsb2FkSlNPTih1cmwpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIG5vTG9vcCgpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgLy8gR2V0IHRoZSBtYWduaXR1ZGUgYW5kIG5hbWUgb2YgdGhlIGVhcnRocXVha2Ugb3V0IG9mIHRoZSBsb2FkZWQgSlNPTlxcbiAgdmFyIGVhcnRocXVha2VNYWcgPSBlYXJ0aHF1YWtlcy5mZWF0dXJlc1swXS5wcm9wZXJ0aWVzLm1hZztcXG4gIHZhciBlYXJ0aHF1YWtlTmFtZSA9IGVhcnRocXVha2VzLmZlYXR1cmVzWzBdLnByb3BlcnRpZXMucGxhY2U7XFxuICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZWFydGhxdWFrZU1hZyAqIDEwLCBlYXJ0aHF1YWtlTWFnICogMTApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KGVhcnRocXVha2VOYW1lLCAwLCBoZWlnaHQgLSAzMCwgd2lkdGgsIDMwKTtcXG59XFxuPC9jb2RlPjwvZGl2PlxcblxcblxcbjxwPk91dHNpZGUgb2YgcHJlbG9hZCgpLCB5b3UgbWF5IHN1cHBseSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGVcXG5vYmplY3Q6PC9wPlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBub0xvb3AoKTtcXG4gIHZhciB1cmwgPVxcbiAgICdodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZWFydGhxdWFrZXMvZmVlZC92MS4wLycgK1xcbiAgICAnc3VtbWFyeS9hbGxfZGF5Lmdlb2pzb24nO1xcbiAgbG9hZEpTT04odXJsLCBkcmF3RWFydGhxdWFrZSk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXdFYXJ0aHF1YWtlKGVhcnRocXVha2VzKSB7XFxuICAvLyBHZXQgdGhlIG1hZ25pdHVkZSBhbmQgbmFtZSBvZiB0aGUgZWFydGhxdWFrZSBvdXQgb2YgdGhlIGxvYWRlZCBKU09OXFxuICB2YXIgZWFydGhxdWFrZU1hZyA9IGVhcnRocXVha2VzLmZlYXR1cmVzWzBdLnByb3BlcnRpZXMubWFnO1xcbiAgdmFyIGVhcnRocXVha2VOYW1lID0gZWFydGhxdWFrZXMuZmVhdHVyZXNbMF0ucHJvcGVydGllcy5wbGFjZTtcXG4gIGVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCBlYXJ0aHF1YWtlTWFnICogMTAsIGVhcnRocXVha2VNYWcgKiAxMCk7XFxuICB0ZXh0QWxpZ24oQ0VOVEVSKTtcXG4gIHRleHQoZWFydGhxdWFrZU5hbWUsIDAsIGhlaWdodCAtIDMwLCB3aWR0aCwgMzApO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjUweDUwIGVsbGlwc2UgdGhhdCBjaGFuZ2VzIGZyb20gYmxhY2sgdG8gd2hpdGUgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGh1bWlkaXR5XFxuNTB4NTAgZWxsaXBzZSB0aGF0IGNoYW5nZXMgZnJvbSBibGFjayB0byB3aGl0ZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgaHVtaWRpdHlcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJJbnB1dFwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE5LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5uYW1lIG9mIHRoZSBmaWxlIG9yIHVybCB0byBsb2FkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImpzb25wT3B0aW9uc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5vcHRpb25zIG9iamVjdCBmb3IganNvbnAgcmVsYXRlZCBzZXR0aW5nczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGF0YXR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+JnF1b3Q7anNvbiZxdW90OyBvciAmcXVvdDtqc29ucCZxdW90OzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRKU09OKCkgY29tcGxldGVzLCBkYXRhIGlzIHBhc3NlZFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXMgZmlyc3QgYXJndW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXJyb3JDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpZlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IsIHJlc3BvbnNlIGlzIHBhc3NlZFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXMgZmlyc3QgYXJndW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkpTT04gZGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fEFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTA0LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkYXRhdHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxBcnJheVwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDExMixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBhdGhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxBcnJheVwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9maWxlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE3MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZWFkcyB0aGUgY29udGVudHMgb2YgYSBmaWxlIGFuZCBjcmVhdGVzIGEgU3RyaW5nIGFycmF5IG9mIGl0cyBpbmRpdmlkdWFsXFxubGluZXMuIElmIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlzIHVzZWQgYXMgdGhlIHBhcmFtZXRlciwgYXMgaW4gdGhlIGFib3ZlXFxuZXhhbXBsZSwgdGhlIGZpbGUgbXVzdCBiZSBsb2NhdGVkIGluIHRoZSBza2V0Y2ggZGlyZWN0b3J5L2ZvbGRlci5cXG48YnI+PGJyPlxcbkFsdGVybmF0aXZlbHksIHRoZSBmaWxlIG1heWJlIGJlIGxvYWRlZCBmcm9tIGFueXdoZXJlIG9uIHRoZSBsb2NhbFxcbmNvbXB1dGVyIHVzaW5nIGFuIGFic29sdXRlIHBhdGggKHNvbWV0aGluZyB0aGF0IHN0YXJ0cyB3aXRoIC8gb24gVW5peCBhbmRcXG5MaW51eCwgb3IgYSBkcml2ZSBsZXR0ZXIgb24gV2luZG93cyksIG9yIHRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIgY2FuIGJlIGFcXG5VUkwgZm9yIGEgZmlsZSBmb3VuZCBvbiBhIG5ldHdvcmsuXFxuPGJyPjxicj5cXG5UaGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMsIG1lYW5pbmcgaXQgbWF5IG5vdCBmaW5pc2ggYmVmb3JlIHRoZSBuZXh0XFxubGluZSBpbiB5b3VyIHNrZXRjaCBpcyBleGVjdXRlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJsb2FkU3RyaW5nc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsZW5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm5hbWUgb2YgdGhlIGZpbGUgb3IgdXJsIHRvIGxvYWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciBsb2FkU3RyaW5ncygpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVzLCBBcnJheSBpcyBwYXNzZWQgaW4gYXMgZmlyc3RcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImVycm9yQ2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGlmXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IsIHJlc3BvbnNlIGlzIHBhc3NlZFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFzIGZpcnN0IGFyZ3VtZW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBcnJheSBvZiBTdHJpbmdzXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nW11cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG5cXG48cD5DYWxsaW5nIGxvYWRTdHJpbmdzKCkgaW5zaWRlIHByZWxvYWQoKSBndWFyYW50ZWVzIHRvIGNvbXBsZXRlIHRoZVxcbm9wZXJhdGlvbiBiZWZvcmUgc2V0dXAoKSBhbmQgZHJhdygpIGFyZSBjYWxsZWQuPC9wPlxcblxcbjxkaXY+PGNvZGU+XFxudmFyIHJlc3VsdDtcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgcmVzdWx0ID0gbG9hZFN0cmluZ3MoJ2Fzc2V0cy90ZXN0LnR4dCcpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHZhciBpbmQgPSBmbG9vcihyYW5kb20ocmVzdWx0Lmxlbmd0aCkpO1xcbiAgdGV4dChyZXN1bHRbaW5kXSwgMTAsIDEwLCA4MCwgODApO1xcbn1cXG48L2NvZGU+PC9kaXY+XFxuXFxuPHA+T3V0c2lkZSBvZiBwcmVsb2FkKCksIHlvdSBtYXkgc3VwcGx5IGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZVxcbm9iamVjdDo8L3A+XFxuXFxuPGRpdj48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGxvYWRTdHJpbmdzKCdhc3NldHMvdGVzdC50eHQnLCBwaWNrU3RyaW5nKTtcXG59XFxuXFxuZnVuY3Rpb24gcGlja1N0cmluZyhyZXN1bHQpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHZhciBpbmQgPSBmbG9vcihyYW5kb20ocmVzdWx0Lmxlbmd0aCkpO1xcbiAgdGV4dChyZXN1bHRbaW5kXSwgMTAsIDEwLCA4MCwgODApO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInJhbmRvbWx5IGdlbmVyYXRlZCB0ZXh0IGZyb20gYSBmaWxlLCBmb3IgZXhhbXBsZSBcXFwiaSBzbWVsbCBsaWtlIGJ1dHRlclxcXCJcXG5yYW5kb21seSBnZW5lcmF0ZWQgdGV4dCBmcm9tIGEgZmlsZSwgZm9yIGV4YW1wbGUgXFxcImkgaGF2ZSB0aHJlZSBmZWV0XFxcIlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIklucHV0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL2ZpbGVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjcxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlYWRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgb3IgVVJMIGFuZCBjcmVhdGVzIGEgcDUuVGFibGUgb2JqZWN0IHdpdGhcXG5pdHMgdmFsdWVzLiBJZiBhIGZpbGUgaXMgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIHNrZXRjaCYjMzk7c1xcbiZxdW90O2RhdGEmcXVvdDsgZm9sZGVyLiBUaGUgZmlsZW5hbWUgcGFyYW1ldGVyIGNhbiBhbHNvIGJlIGEgVVJMIHRvIGEgZmlsZSBmb3VuZFxcbm9ubGluZS4gQnkgZGVmYXVsdCwgdGhlIGZpbGUgaXMgYXNzdW1lZCB0byBiZSBjb21tYS1zZXBhcmF0ZWQgKGluIENTVlxcbmZvcm1hdCkuIFRhYmxlIG9ubHkgbG9va3MgZm9yIGEgaGVhZGVyIHJvdyBpZiB0aGUgJiMzOTtoZWFkZXImIzM5OyBvcHRpb24gaXNcXG5pbmNsdWRlZC48L3A+XFxuXFxuPHA+UG9zc2libGUgb3B0aW9ucyBpbmNsdWRlOlxcbjx1bD5cXG48bGk+Y3N2IC0gcGFyc2UgdGhlIHRhYmxlIGFzIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXM8L2xpPlxcbjxsaT50c3YgLSBwYXJzZSB0aGUgdGFibGUgYXMgdGFiLXNlcGFyYXRlZCB2YWx1ZXM8L2xpPlxcbjxsaT5oZWFkZXIgLSB0aGlzIHRhYmxlIGhhcyBhIGhlYWRlciAodGl0bGUpIHJvdzwvbGk+XFxuPC91bD5cXG48L3A+XFxuXFxuPHA+V2hlbiBwYXNzaW5nIGluIG11bHRpcGxlIG9wdGlvbnMsIHBhc3MgdGhlbSBpbiBhcyBzZXBhcmF0ZSBwYXJhbWV0ZXJzLFxcbnNlcGVyYXRlZCBieSBjb21tYXMuIEZvciBleGFtcGxlOlxcbjxicj48YnI+XFxuPGNvZGU+XFxubG9hZFRhYmxlKCYjMzk7bXlfY3N2X2ZpbGUuY3N2JiMzOTssICYjMzk7Y3N2JiMzOTssICYjMzk7aGVhZGVyJiMzOTspO1xcbjwvY29kZT5cXG48L3A+XFxuXFxuPHA+IEFsbCBmaWxlcyBsb2FkZWQgYW5kIHNhdmVkIHVzZSBVVEYtOCBlbmNvZGluZy48L3A+XFxuXFxuPHA+VGhpcyBtZXRob2QgaXMgYXN5bmNocm9ub3VzLCBtZWFuaW5nIGl0IG1heSBub3QgZmluaXNoIGJlZm9yZSB0aGUgbmV4dFxcbmxpbmUgaW4geW91ciBza2V0Y2ggaXMgZXhlY3V0ZWQuIENhbGxpbmcgbG9hZFRhYmxlKCkgaW5zaWRlIHByZWxvYWQoKVxcbmd1YXJhbnRlZXMgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbiBiZWZvcmUgc2V0dXAoKSBhbmQgZHJhdygpIGFyZSBjYWxsZWQuXFxuPHA+T3V0c2lkZSBvZiBwcmVsb2FkKCksIHlvdSBtYXkgc3VwcGx5IGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZVxcbm9iamVjdDo8L3A+XFxuPC9wPlwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibG9hZFRhYmxlXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlRhYmxlIG9iamVjdCBjb250YWluaW5nIGRhdGFcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuLy8gR2l2ZW4gdGhlIGZvbGxvd2luZyBDU1YgZmlsZSBjYWxsZWQgXFxcIm1hbW1hbHMuY3N2XFxcIlxcbi8vIGxvY2F0ZWQgaW4gdGhlIHByb2plY3QncyBcXFwiYXNzZXRzXFxcIiBmb2xkZXI6XFxuLy9cXG4vLyBpZCxzcGVjaWVzLG5hbWVcXG4vLyAwLENhcHJhIGhpcmN1cyxHb2F0XFxuLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxcbi8vIDIsRXF1dXMgemVicmEsWmVicmFcXG5cXG52YXIgdGFibGU7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFxcXCJjc3ZcXFwiXFxuICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcXG4gIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xcbiAgLy90aGUgZmlsZSBjYW4gYmUgcmVtb3RlXFxuICAvL3RhYmxlID0gbG9hZFRhYmxlKFxcXCJodHRwOi8vcDVqcy5vcmcvcmVmZXJlbmNlL2Fzc2V0cy9tYW1tYWxzLmNzdlxcXCIsXFxuICAvLyAgICAgICAgICAgICAgICAgIFxcXCJjc3ZcXFwiLCBcXFwiaGVhZGVyXFxcIik7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy9jb3VudCB0aGUgY29sdW1uc1xcbiAgcHJpbnQodGFibGUuZ2V0Um93Q291bnQoKSArICcgdG90YWwgcm93cyBpbiB0YWJsZScpO1xcbiAgcHJpbnQodGFibGUuZ2V0Q29sdW1uQ291bnQoKSArICcgdG90YWwgY29sdW1ucyBpbiB0YWJsZScpO1xcblxcbiAgcHJpbnQodGFibGUuZ2V0Q29sdW1uKCduYW1lJykpO1xcbiAgLy9bXFxcIkdvYXRcXFwiLCBcXFwiTGVvcGFyZFxcXCIsIFxcXCJaZWJyYVxcXCJdXFxuXFxuICAvL2N5Y2xlIHRocm91Z2ggdGhlIHRhYmxlXFxuICBmb3IgKHZhciByID0gMDsgciA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHIrKylcXG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOyBjKyspIHtcXG4gICAgICBwcmludCh0YWJsZS5nZXRTdHJpbmcociwgYykpO1xcbiAgICB9XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwicmFuZG9tbHkgZ2VuZXJhdGVkIHRleHQgZnJvbSBhIGZpbGUsIGZvciBleGFtcGxlIFxcXCJpIHNtZWxsIGxpa2UgYnV0dGVyXFxcIlxcbnJhbmRvbWx5IGdlbmVyYXRlZCB0ZXh0IGZyb20gYSBmaWxlLCBmb3IgZXhhbXBsZSBcXFwiaSBoYXZlIHRocmVlIGZlZXRcXFwiXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiSW5wdXRcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAyNzEsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmaWxlbmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5uYW1lIG9mIHRoZSBmaWxlIG9yIFVSTCB0byBsb2FkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm9wdGlvbnNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+JnF1b3Q7aGVhZGVyJnF1b3Q7ICZxdW90O2NzdiZxdW90OyAmcXVvdDt0c3YmcXVvdDs8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkVGFibGUoKSBjb21wbGV0ZXMuIE9uIHN1Y2Nlc3MsIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIG9iamVjdCBpcyBwYXNzZWQgaW4gYXMgdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgYXJndW1lbnQuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImVycm9yQ2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaWZcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhbiBlcnJvciwgcmVzcG9uc2UgaXMgcGFzc2VkXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXMgZmlyc3QgYXJndW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlRhYmxlIG9iamVjdCBjb250YWluaW5nIGRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDM2MCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZpbGVuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImVycm9yQ2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL2ZpbGVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjAzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlYWRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIG9iamVjdCB3aXRoIGl0cyB2YWx1ZXMuXFxuSWYgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaXMgdXNlZCBhcyB0aGUgcGFyYW1ldGVyLCBhcyBpbiB0aGUgYWJvdmUgZXhhbXBsZSxcXG50aGUgZmlsZSBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIHNrZXRjaCBkaXJlY3RvcnkvZm9sZGVyLjwvcD5cXG48cD5BbHRlcm5hdGl2ZWx5LCB0aGUgZmlsZSBtYXliZSBiZSBsb2FkZWQgZnJvbSBhbnl3aGVyZSBvbiB0aGUgbG9jYWxcXG5jb21wdXRlciB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoIChzb21ldGhpbmcgdGhhdCBzdGFydHMgd2l0aCAvIG9uIFVuaXggYW5kXFxuTGludXgsIG9yIGEgZHJpdmUgbGV0dGVyIG9uIFdpbmRvd3MpLCBvciB0aGUgZmlsZW5hbWUgcGFyYW1ldGVyIGNhbiBiZSBhXFxuVVJMIGZvciBhIGZpbGUgZm91bmQgb24gYSBuZXR3b3JrLjwvcD5cXG48cD5UaGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMsIG1lYW5pbmcgaXQgbWF5IG5vdCBmaW5pc2ggYmVmb3JlIHRoZSBuZXh0XFxubGluZSBpbiB5b3VyIHNrZXRjaCBpcyBleGVjdXRlZC4gQ2FsbGluZyBsb2FkWE1MKCkgaW5zaWRlIHByZWxvYWQoKVxcbmd1YXJhbnRlZXMgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbiBiZWZvcmUgc2V0dXAoKSBhbmQgZHJhdygpIGFyZSBjYWxsZWQuPC9wPlxcbjxwPk91dHNpZGUgb2YgcHJlbG9hZCgpLCB5b3UgbWF5IHN1cHBseSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGVcXG5vYmplY3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibG9hZFhNTFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsZW5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm5hbWUgb2YgdGhlIGZpbGUgb3IgVVJMIHRvIGxvYWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciBsb2FkWE1MKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZXMsIFhNTCBvYmplY3QgaXMgcGFzc2VkIGluIGFzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgYXJndW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpZlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGFuIGVycm9yLCByZXNwb25zZSBpcyBwYXNzZWRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhcyBmaXJzdCBhcmd1bWVudDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiWE1MIG9iamVjdCBjb250YWluaW5nIGRhdGFcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXFxcIm1hbW1hbHMueG1sXFxcIiBpcyBwYXJzZWRcXG4vLyBpbiB0aGUgY29kZSBiZWxvdy5cXG4vL1xcbi8vIDw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCI/Plxcbi8vICZsdDttYW1tYWxzJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMFxcXCIgc3BlY2llcz1cXFwiQ2FwcmEgaGlyY3VzXFxcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIxXFxcIiBzcGVjaWVzPVxcXCJQYW50aGVyYSBwYXJkdXNcXFwiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjJcXFwiIHNwZWNpZXM9XFxcIkVxdXVzIHplYnJhXFxcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xcbi8vICZsdDsvbWFtbWFscyZndDtcXG5cXG52YXIgeG1sO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgY2hpbGRyZW4gPSB4bWwuZ2V0Q2hpbGRyZW4oJ2FuaW1hbCcpO1xcblxcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xcbiAgICB2YXIgaWQgPSBjaGlsZHJlbltpXS5nZXROdW0oJ2lkJyk7XFxuICAgIHZhciBjb2xvcmluZyA9IGNoaWxkcmVuW2ldLmdldFN0cmluZygnc3BlY2llcycpO1xcbiAgICB2YXIgbmFtZSA9IGNoaWxkcmVuW2ldLmdldENvbnRlbnQoKTtcXG4gICAgcHJpbnQoaWQgKyAnLCAnICsgY29sb3JpbmcgKyAnLCAnICsgbmFtZSk7XFxuICB9XFxufVxcblxcbi8vIFNrZXRjaCBwcmludHM6XFxuLy8gMCwgQ2FwcmEgaGlyY3VzLCBHb2F0XFxuLy8gMSwgUGFudGhlcmEgcGFyZHVzLCBMZW9wYXJkXFxuLy8gMiwgRXF1dXMgemVicmEsIFplYnJhXFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJJbnB1dFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9maWxlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDcwNCxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxvYWRCeXRlc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bmFtZSBvZiB0aGUgZmlsZSBvciBVUkwgdG8gbG9hZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGxvYWRCeXRlcygpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZXM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpZiB0aGVyZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYW4gZXJyb3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFuIG9iamVjdCB3aG9zZSAnYnl0ZXMnIHByb3BlcnR5IHdpbGwgYmUgdGhlIGxvYWRlZCBidWZmZXJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxudmFyIGRhdGE7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGRhdGEgPSBsb2FkQnl0ZXMoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNTsgaSsrKSB7XFxuICAgIGNvbnNvbGUubG9nKGRhdGEuYnl0ZXNbaV0udG9TdHJpbmcoMTYpKTtcXG4gIH1cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJJbnB1dFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9maWxlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc1NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5NZXRob2QgZm9yIGV4ZWN1dGluZyBhbiBIVFRQIEdFVCByZXF1ZXN0LiBJZiBkYXRhIHR5cGUgaXMgbm90IHNwZWNpZmllZCxcXG5wNSB3aWxsIHRyeSB0byBndWVzcyBiYXNlZCBvbiB0aGUgVVJMLCBkZWZhdWx0aW5nIHRvIHRleHQuIFRoaXMgaXMgZXF1aXZhbGVudCB0b1xcbmNhbGxpbmcgPGNvZGU+aHR0cERvKHBhdGgsICYjMzk7R0VUJiMzOTspPC9jb2RlPi4gVGhlICYjMzk7YmluYXJ5JiMzOTsgZGF0YXR5cGUgd2lsbCByZXR1cm5cXG5hIEJsb2Igb2JqZWN0LCBhbmQgdGhlICYjMzk7YXJyYXlCdWZmZXImIzM5OyBkYXRhdHlwZSB3aWxsIHJldHVybiBhbiBBcnJheUJ1ZmZlclxcbndoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgdHlwZWQgYXJyYXlzIChzdWNoIGFzIFVpbnQ4QXJyYXkpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImh0dHBHZXRcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuLy8gRXhhbXBsZXMgdXNlIFVTR1MgRWFydGhxdWFrZSBBUEk6XFxuLy8gICBodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZmRzbndzL2V2ZW50LzEvI21ldGhvZHNcXG52YXIgZWFydGhxdWFrZXM7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIC8vIEdldCB0aGUgbW9zdCByZWNlbnQgZWFydGhxdWFrZSBpbiB0aGUgZGF0YWJhc2VcXG4gIHZhciB1cmwgPVxcbiAgICdodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZmRzbndzL2V2ZW50LzEvcXVlcnk/JyArXFxuICAgICdmb3JtYXQ9Z2VvanNvbiZsaW1pdD0xJm9yZGVyYnk9dGltZSc7XFxuICBodHRwR2V0KHVybCwgJ2pzb25wJywgZmFsc2UsIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XFxuICAgIC8vIHdoZW4gdGhlIEhUVFAgcmVxdWVzdCBjb21wbGV0ZXMsIHBvcHVsYXRlIHRoZSB2YXJpYWJsZSB0aGF0IGhvbGRzIHRoZVxcbiAgICAvLyBlYXJ0aHF1YWtlIGRhdGEgdXNlZCBpbiB0aGUgdmlzdWFsaXphdGlvbi5cXG4gICAgZWFydGhxdWFrZXMgPSByZXNwb25zZTtcXG4gIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgaWYgKCFlYXJ0aHF1YWtlcykge1xcbiAgICAvLyBXYWl0IHVudGlsIHRoZSBlYXJ0aHF1YWtlIGRhdGEgaGFzIGxvYWRlZCBiZWZvcmUgZHJhd2luZy5cXG4gICAgcmV0dXJuO1xcbiAgfVxcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgLy8gR2V0IHRoZSBtYWduaXR1ZGUgYW5kIG5hbWUgb2YgdGhlIGVhcnRocXVha2Ugb3V0IG9mIHRoZSBsb2FkZWQgSlNPTlxcbiAgdmFyIGVhcnRocXVha2VNYWcgPSBlYXJ0aHF1YWtlcy5mZWF0dXJlc1swXS5wcm9wZXJ0aWVzLm1hZztcXG4gIHZhciBlYXJ0aHF1YWtlTmFtZSA9IGVhcnRocXVha2VzLmZlYXR1cmVzWzBdLnByb3BlcnRpZXMucGxhY2U7XFxuICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZWFydGhxdWFrZU1hZyAqIDEwLCBlYXJ0aHF1YWtlTWFnICogMTApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KGVhcnRocXVha2VOYW1lLCAwLCBoZWlnaHQgLSAzMCwgd2lkdGgsIDMwKTtcXG4gIG5vTG9vcCgpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiSW5wdXRcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA3NTQsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm5hbWUgb2YgdGhlIGZpbGUgb3IgdXJsIHRvIGxvYWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGF0YXR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+JnF1b3Q7anNvbiZxdW90OywgJnF1b3Q7anNvbnAmcXVvdDssICZxdW90O2JpbmFyeSZxdW90OywgJnF1b3Q7YXJyYXlCdWZmZXImcXVvdDssXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdDt4bWwmcXVvdDssIG9yICZxdW90O3RleHQmcXVvdDs8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cGFyYW0gZGF0YSBwYXNzZWQgc2VudCB3aXRoIHJlcXVlc3Q8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fEJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBHZXQoKSBjb21wbGV0ZXMsIGRhdGEgaXMgcGFzc2VkIGluXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBmaXJzdCBhcmd1bWVudDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGlmXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhbiBlcnJvciwgcmVzcG9uc2UgaXMgcGFzc2VkXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhcyBmaXJzdCBhcmd1bWVudDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA4MDUsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fEJvb2xlYW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDgxMixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBhdGhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9maWxlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgyNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5NZXRob2QgZm9yIGV4ZWN1dGluZyBhbiBIVFRQIFBPU1QgcmVxdWVzdC4gSWYgZGF0YSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsXFxucDUgd2lsbCB0cnkgdG8gZ3Vlc3MgYmFzZWQgb24gdGhlIFVSTCwgZGVmYXVsdGluZyB0byB0ZXh0LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG9cXG5jYWxsaW5nIDxjb2RlPmh0dHBEbyhwYXRoLCAmIzM5O1BPU1QmIzM5Oyk8L2NvZGU+LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImh0dHBQb3N0XCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBFeGFtcGxlcyB1c2UganNvbnBsYWNlaG9sZGVyLnR5cGljb2RlLmNvbSBmb3IgYSBNb2NrIERhdGEgQVBJXFxuXFxudmFyIHVybCA9ICdodHRwczovL2pzb25wbGFjZWhvbGRlci50eXBpY29kZS5jb20vcG9zdHMnO1xcbnZhciBwb3N0RGF0YSA9IHsgdXNlcklkOiAxLCB0aXRsZTogJ3A1IENsaWNrZWQhJywgYm9keTogJ3A1LmpzIGlzIHdheSBjb29sLicgfTtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcyg4MDAsIDgwMCk7XFxufVxcblxcbmZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcXG4gIC8vIFBpY2sgbmV3IHJhbmRvbSBjb2xvciB2YWx1ZXNcXG4gIHZhciByID0gcmFuZG9tKDI1NSk7XFxuICB2YXIgZyA9IHJhbmRvbSgyNTUpO1xcbiAgdmFyIGIgPSByYW5kb20oMjU1KTtcXG5cXG4gIGh0dHBQb3N0KHVybCwgJ2pzb24nLCBwb3N0RGF0YSwgZnVuY3Rpb24ocmVzdWx0KSB7XFxuICAgIHN0cm9rZVdlaWdodCgyKTtcXG4gICAgc3Ryb2tlKHIsIGcsIGIpO1xcbiAgICBmaWxsKHIsIGcsIGIsIDEyNyk7XFxuICAgIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDIwMCwgMjAwKTtcXG4gICAgdGV4dChyZXN1bHQuYm9keSwgbW91c2VYLCBtb3VzZVkpO1xcbiAgfSk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG5cXG48ZGl2Pjxjb2RlPlxcbnZhciB1cmwgPSAnaHR0cHM6Ly9pbnZhbGlkVVJMJzsgLy8gQSBiYWQgVVJMIHRoYXQgd2lsbCBjYXVzZSBlcnJvcnNcXG52YXIgcG9zdERhdGEgPSB7IHRpdGxlOiAncDUgQ2xpY2tlZCEnLCBib2R5OiAncDUuanMgaXMgd2F5IGNvb2wuJyB9O1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDgwMCwgODAwKTtcXG59XFxuXFxuZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xcbiAgLy8gUGljayBuZXcgcmFuZG9tIGNvbG9yIHZhbHVlc1xcbiAgdmFyIHIgPSByYW5kb20oMjU1KTtcXG4gIHZhciBnID0gcmFuZG9tKDI1NSk7XFxuICB2YXIgYiA9IHJhbmRvbSgyNTUpO1xcblxcbiAgaHR0cFBvc3QoXFxuICAgIHVybCxcXG4gICAgJ2pzb24nLFxcbiAgICBwb3N0RGF0YSxcXG4gICAgZnVuY3Rpb24ocmVzdWx0KSB7XFxuICAgICAgLy8gLi4uIHdvbid0IGJlIGNhbGxlZFxcbiAgICB9LFxcbiAgICBmdW5jdGlvbihlcnJvcikge1xcbiAgICAgIHN0cm9rZVdlaWdodCgyKTtcXG4gICAgICBzdHJva2UociwgZywgYik7XFxuICAgICAgZmlsbChyLCBnLCBiLCAxMjcpO1xcbiAgICAgIHRleHQoZXJyb3IudG9TdHJpbmcoKSwgbW91c2VYLCBtb3VzZVkpO1xcbiAgICB9XFxuICApO1xcbn1cXG48L2NvZGU+PC9kaXY+XFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiSW5wdXRcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA4MjYsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm5hbWUgb2YgdGhlIGZpbGUgb3IgdXJsIHRvIGxvYWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGF0YXR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+JnF1b3Q7anNvbiZxdW90OywgJnF1b3Q7anNvbnAmcXVvdDssICZxdW90O3htbCZxdW90Oywgb3IgJnF1b3Q7dGV4dCZxdW90Oy5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIGh0dHBQb3N0KCkgd2lsbCBndWVzcy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cGFyYW0gZGF0YSBwYXNzZWQgc2VudCB3aXRoIHJlcXVlc3Q8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fEJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBQb3N0KCkgY29tcGxldGVzLCBkYXRhIGlzIHBhc3NlZCBpblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgZmlyc3QgYXJndW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXJyb3JDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpZlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IsIHJlc3BvbnNlIGlzIHBhc3NlZFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXMgZmlyc3QgYXJndW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogOTA1LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkYXRhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxCb29sZWFuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXJyb3JDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA5MTIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXJyb3JDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vZmlsZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5MjYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TWV0aG9kIGZvciBleGVjdXRpbmcgYW4gSFRUUCByZXF1ZXN0LiBJZiBkYXRhIHR5cGUgaXMgbm90IHNwZWNpZmllZCxcXG5wNSB3aWxsIHRyeSB0byBndWVzcyBiYXNlZCBvbiB0aGUgVVJMLCBkZWZhdWx0aW5nIHRvIHRleHQuPGJyPjxicj5cXG5Gb3IgbW9yZSBhZHZhbmNlZCB1c2UsIHlvdSBtYXkgYWxzbyBwYXNzIGluIHRoZSBwYXRoIGFzIHRoZSBmaXJzdCBhcmd1bWVudFxcbmFuZCBhIG9iamVjdCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCB0aGUgc2lnbmF0dXJlIGZvbGxvd3MgdGhlIG9uZSBzcGVjaWZpZWRcXG5pbiB0aGUgRmV0Y2ggQVBJIHNwZWNpZmljYXRpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiaHR0cERvXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBFeGFtcGxlcyB1c2UgVVNHUyBFYXJ0aHF1YWtlIEFQSTpcXG4vLyBodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZmRzbndzL2V2ZW50LzEvI21ldGhvZHNcXG5cXG4vLyBkaXNwbGF5cyBhbiBhbmltYXRpb24gb2YgYWxsIFVTR1MgZWFydGhxdWFrZXNcXG52YXIgZWFydGhxdWFrZXM7XFxudmFyIGVxRmVhdHVyZUluZGV4ID0gMDtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgdmFyIHVybCA9ICdodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZmRzbndzL2V2ZW50LzEvcXVlcnk/Zm9ybWF0PWdlb2pzb24nO1xcbiAgaHR0cERvKFxcbiAgICB1cmwsXFxuICAgIHtcXG4gICAgICBtZXRob2Q6ICdHRVQnLFxcbiAgICAgIC8vIE90aGVyIFJlcXVlc3Qgb3B0aW9ucywgbGlrZSBzcGVjaWFsIGhlYWRlcnMgZm9yIGFwaXNcXG4gICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246ICdCZWFyZXIgc2VjcmV0S2V5JyB9XFxuICAgIH0sXFxuICAgIGZ1bmN0aW9uKHJlcykge1xcbiAgICAgIGVhcnRocXVha2VzID0gcmVzO1xcbiAgICB9XFxuICApO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgLy8gd2FpdCB1bnRpbCB0aGUgZGF0YSBpcyBsb2FkZWRcXG4gIGlmICghZWFydGhxdWFrZXMgfHwgIWVhcnRocXVha2VzLmZlYXR1cmVzW2VxRmVhdHVyZUluZGV4XSkge1xcbiAgICByZXR1cm47XFxuICB9XFxuICBjbGVhcigpO1xcblxcbiAgdmFyIGZlYXR1cmUgPSBlYXJ0aHF1YWtlcy5mZWF0dXJlc1tlcUZlYXR1cmVJbmRleF07XFxuICB2YXIgbWFnID0gZmVhdHVyZS5wcm9wZXJ0aWVzLm1hZztcXG4gIHZhciByYWQgPSBtYWcgLyAxMSAqICgod2lkdGggKyBoZWlnaHQpIC8gMik7XFxuICBmaWxsKDI1NSwgMCwgMCwgMTAwKTtcXG4gIGVsbGlwc2Uod2lkdGggLyAyICsgcmFuZG9tKC0yLCAyKSwgaGVpZ2h0IC8gMiArIHJhbmRvbSgtMiwgMiksIHJhZCwgcmFkKTtcXG5cXG4gIGlmIChlcUZlYXR1cmVJbmRleCA+PSBlYXJ0aHF1YWtlcy5mZWF0dXJlcy5sZW5ndGgpIHtcXG4gICAgZXFGZWF0dXJlSW5kZXggPSAwO1xcbiAgfSBlbHNlIHtcXG4gICAgZXFGZWF0dXJlSW5kZXggKz0gMTtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIklucHV0XCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogOTI2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5uYW1lIG9mIHRoZSBmaWxlIG9yIHVybCB0byBsb2FkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5laXRoZXIgJnF1b3Q7R0VUJnF1b3Q7LCAmcXVvdDtQT1NUJnF1b3Q7LCBvciAmcXVvdDtQVVQmcXVvdDssXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0cyB0byAmcXVvdDtHRVQmcXVvdDs8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRhdGF0eXBlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPiZxdW90O2pzb24mcXVvdDssICZxdW90O2pzb25wJnF1b3Q7LCAmcXVvdDt4bWwmcXVvdDssIG9yICZxdW90O3RleHQmcXVvdDs8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cGFyYW0gZGF0YSBwYXNzZWQgc2VudCB3aXRoIHJlcXVlc3Q8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwR2V0KCkgY29tcGxldGVzLCBkYXRhIGlzIHBhc3NlZCBpblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgZmlyc3QgYXJndW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXJyb3JDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpZlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IsIHJlc3BvbnNlIGlzIHBhc3NlZFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXMgZmlyc3QgYXJndW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogOTk0LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJvcHRpb25zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlcXVlc3Qgb2JqZWN0IG9wdGlvbnMgYXMgZG9jdW1lbnRlZCBpbiB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdW90O2ZldGNoJnF1b3Q7IEFQSVxcbjxhIGhyZWY9XFxcImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0FQSS9GZXRjaF9BUElcXFwiPnJlZmVyZW5jZTwvYT48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXJyb3JDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vZmlsZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTMwLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3JlYXRlV3JpdGVyXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5uYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImV4dGVuc2lvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5QcmludFdyaXRlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuY3JlYXRlQnV0dG9uKCdzYXZlJylcXG4gIC5wb3NpdGlvbigxMCwgMTApXFxuICAubW91c2VQcmVzc2VkKGZ1bmN0aW9uKCkge1xcbiAgICB2YXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKCdzcXVhcmVzLnR4dCcpO1xcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcXG4gICAgICB3cml0ZXIucHJpbnQoaSAqIGkpO1xcbiAgICB9XFxuICAgIHdyaXRlci5jbG9zZSgpO1xcbiAgICB3cml0ZXIuY2xlYXIoKTtcXG4gIH0pO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJPdXRwdXRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vZmlsZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTc5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPldyaXRlcyBkYXRhIHRvIHRoZSBQcmludFdyaXRlciBzdHJlYW08L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ3cml0ZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YWxsIGRhdGEgdG8gYmUgd3JpdHRlbiBieSB0aGUgUHJpbnRXcml0ZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyIG5vdGVzdFxcXCI+XFxuPGNvZGU+XFxuLy8gY3JlYXRlcyBhIGZpbGUgY2FsbGVkICduZXdGaWxlLnR4dCdcXG52YXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKCduZXdGaWxlLnR4dCcpO1xcbi8vIHdyaXRlICdIZWxsbyB3b3JsZCEnJyB0byB0aGUgZmlsZVxcbndyaXRlci53cml0ZShbJ0hlbGxvIHdvcmxkISddKTtcXG4vLyBjbG9zZSB0aGUgUHJpbnRXcml0ZXIgYW5kIHNhdmUgdGhlIGZpbGVcXG53cml0ZXIuY2xvc2UoKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz5cXG48Y29kZT5cXG4vLyBjcmVhdGVzIGEgZmlsZSBjYWxsZWQgJ25ld0ZpbGUyLnR4dCdcXG52YXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKCduZXdGaWxlMi50eHQnKTtcXG4vLyB3cml0ZSAnYXBwbGVzLGJhbmFuYXMsMTIzJyB0byB0aGUgZmlsZVxcbndyaXRlci53cml0ZShbJ2FwcGxlcycsICdiYW5hbmFzJywgMTIzXSk7XFxuLy8gY2xvc2UgdGhlIFByaW50V3JpdGVyIGFuZCBzYXZlIHRoZSBmaWxlXFxud3JpdGVyLmNsb3NlKCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyIG5vdGVzdCc+XFxuPGNvZGU+XFxuLy8gY3JlYXRlcyBhIGZpbGUgY2FsbGVkICduZXdGaWxlMy50eHQnXFxudmFyIHdyaXRlciA9IGNyZWF0ZVdyaXRlcignbmV3RmlsZTMudHh0Jyk7XFxuLy8gd3JpdGUgJ015IG5hbWUgaXM6IFRlZGR5JyB0byB0aGUgZmlsZVxcbndyaXRlci53cml0ZSgnTXkgbmFtZSBpczonKTtcXG53cml0ZXIud3JpdGUoJyBUZWRkeScpO1xcbi8vIGNsb3NlIHRoZSBQcmludFdyaXRlciBhbmQgc2F2ZSB0aGUgZmlsZVxcbndyaXRlci5jbG9zZSgpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QcmludFdyaXRlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJPdXRwdXRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vZmlsZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjE5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPldyaXRlcyBkYXRhIHRvIHRoZSBQcmludFdyaXRlciBzdHJlYW0sIGFuZCBhZGRzIGEgbmV3IGxpbmUgYXQgdGhlIGVuZDwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInByaW50XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkYXRhXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hbGwgZGF0YSB0byBiZSBwcmludGVkIGJ5IHRoZSBQcmludFdyaXRlcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz5cXG48Y29kZT5cXG4vLyBjcmVhdGVzIGEgZmlsZSBjYWxsZWQgJ25ld0ZpbGUudHh0J1xcbnZhciB3cml0ZXIgPSBjcmVhdGVXcml0ZXIoJ25ld0ZpbGUudHh0Jyk7XFxuLy8gY3JlYXRlcyBhIGZpbGUgY29udGFpbmluZ1xcbi8vICBNeSBuYW1lIGlzOlxcbi8vICBUZWRkeVxcbndyaXRlci5wcmludCgnTXkgbmFtZSBpczonKTtcXG53cml0ZXIucHJpbnQoJ1RlZGR5Jyk7XFxuLy8gY2xvc2UgdGhlIFByaW50V3JpdGVyIGFuZCBzYXZlIHRoZSBmaWxlXFxud3JpdGVyLmNsb3NlKCk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyIG5vdGVzdCc+XFxuPGNvZGU+XFxudmFyIHdyaXRlcjtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcyg0MDAsIDQwMCk7XFxuICAvLyBjcmVhdGUgYSBQcmludFdyaXRlclxcbiAgd3JpdGVyID0gY3JlYXRlV3JpdGVyKCduZXdGaWxlLnR4dCcpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgLy8gcHJpbnQgYWxsIG1vdXNlWCBhbmQgbW91c2VZIGNvb3JkaW5hdGVzIHRvIHRoZSBzdHJlYW1cXG4gIHdyaXRlci5wcmludChbbW91c2VYLCBtb3VzZVldKTtcXG59XFxuXFxuZnVuY3Rpb24gbW91c2VDbGlja2VkKCkge1xcbiAgLy8gY2xvc2UgdGhlIFByaW50V3JpdGVyIGFuZCBzYXZlIHRoZSBmaWxlXFxuICB3cml0ZXIuY2xvc2UoKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlByaW50V3JpdGVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk91dHB1dFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9maWxlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyNjIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2xlYXJzIHRoZSBkYXRhIGFscmVhZHkgd3JpdHRlbiB0byB0aGUgUHJpbnRXcml0ZXIgb2JqZWN0PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2xlYXJcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzID1cXFwibm9yZW5kZXIgbm90ZXN0XFxcIj48Y29kZT5cXG4vLyBjcmVhdGUgd3JpdGVyIG9iamVjdFxcbnZhciB3cml0ZXIgPSBjcmVhdGVXcml0ZXIoJ25ld0ZpbGUudHh0Jyk7XFxud3JpdGVyLndyaXRlKFsnY2xlYXIgbWUnXSk7XFxuLy8gY2xlYXIgd3JpdGVyIG9iamVjdCBoZXJlXFxud3JpdGVyLmNsZWFyKCk7XFxuLy8gY2xvc2Ugd3JpdGVyXFxud3JpdGVyLmNsb3NlKCk7XFxuPC9jb2RlPjwvZGl2PlxcblwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlByaW50V3JpdGVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk91dHB1dFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9maWxlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyODAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2xvc2VzIHRoZSBQcmludFdyaXRlcjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNsb3NlXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXIgbm90ZXN0XFxcIj5cXG48Y29kZT5cXG4vLyBjcmVhdGUgYSBmaWxlIGNhbGxlZCAnbmV3RmlsZS50eHQnXFxudmFyIHdyaXRlciA9IGNyZWF0ZVdyaXRlcignbmV3RmlsZS50eHQnKTtcXG4vLyBjbG9zZSB0aGUgUHJpbnRXcml0ZXIgYW5kIHNhdmUgdGhlIGZpbGVcXG53cml0ZXIuY2xvc2UoKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz5cXG48Y29kZT5cXG4vLyBjcmVhdGUgYSBmaWxlIGNhbGxlZCAnbmV3RmlsZTIudHh0J1xcbnZhciB3cml0ZXIgPSBjcmVhdGVXcml0ZXIoJ25ld0ZpbGUyLnR4dCcpO1xcbi8vIHdyaXRlIHNvbWUgZGF0YSB0byB0aGUgZmlsZVxcbndyaXRlci53cml0ZShbMTAwLCAxMDEsIDEwMl0pO1xcbi8vIGNsb3NlIHRoZSBQcmludFdyaXRlciBhbmQgc2F2ZSB0aGUgZmlsZVxcbndyaXRlci5jbG9zZSgpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QcmludFdyaXRlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJPdXRwdXRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vZmlsZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMzI5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNhdmUgYW4gaW1hZ2UsIHRleHQsIGpzb24sIGNzdiwgd2F2LCBvciBodG1sLiBQcm9tcHRzIGRvd25sb2FkIHRvXFxudGhlIGNsaWVudCYjMzk7cyBjb21wdXRlci4gPGI+Tm90ZSB0aGF0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBjYWxsIHNhdmUoKVxcbndpdGhpbiBkcmF3IGlmIGl0JiMzOTtzIGxvb3BpbmcsIGFzIHRoZSBzYXZlKCkgZnVuY3Rpb24gd2lsbCBvcGVuIGEgbmV3IHNhdmVcXG5kaWFsb2cgZXZlcnkgZnJhbWUuPC9iPjwvcD5cXG48cD5UaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBzYXZlIHRoZSBjYW52YXMgYXMgYW4gaW1hZ2UuIFlvdSBjYW5cXG5vcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlbmFtZS5cXG5Gb3IgZXhhbXBsZTo8L3A+XFxuIDxwcmUgY2xhc3M9J2xhbmd1YWdlLWphdmFzY3JpcHQnPjxjb2RlPlxcbiBzYXZlKCk7XFxuIHNhdmUoJiMzOTtteUNhbnZhcy5qcGcmIzM5Oyk7IC8vIHNhdmUgYSBzcGVjaWZpYyBjYW52YXMgd2l0aCBhIGZpbGVuYW1lXFxuIDwvY29kZT48L3ByZT5cXG5cXG48cD5BbHRlcm5hdGVseSwgdGhlIGZpcnN0IHBhcmFtZXRlciBjYW4gYmUgYSBwb2ludGVyIHRvIGEgY2FudmFzXFxucDUuRWxlbWVudCwgYW4gQXJyYXkgb2YgU3RyaW5ncyxcXG5hbiBBcnJheSBvZiBKU09OLCBhIEpTT04gb2JqZWN0LCBhIHA1LlRhYmxlLCBhIHA1LkltYWdlLCBvciBhXFxucDUuU291bmRGaWxlIChyZXF1aXJlcyBwNS5zb3VuZCkuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgZmlsZW5hbWVcXG4oaW5jbHVkaW5nIGV4dGVuc2lvbikuIFRoZSB0aGlyZCBwYXJhbWV0ZXIgaXMgZm9yIG9wdGlvbnMgc3BlY2lmaWNcXG50byB0aGlzIHR5cGUgb2Ygb2JqZWN0LiBUaGlzIG1ldGhvZCB3aWxsIHNhdmUgYSBmaWxlIHRoYXQgZml0cyB0aGVcXG5naXZlbiBwYXJhbWF0ZXJzLiBGb3IgZXhhbXBsZTo8L3A+XFxuXFxuIDxwcmUgY2xhc3M9J2xhbmd1YWdlLWphdmFzY3JpcHQnPjxjb2RlPlxcbiAvLyBTYXZlcyBjYW52YXMgYXMgYW4gaW1hZ2VcXG4gc2F2ZSgnbXlDYW52YXMuanBnJyk7XFxuXFxuIC8vIFNhdmVzIHBJbWFnZSBhcyBhIHBuZyBpbWFnZVxcbiB2YXIgaW1nID0gY3JlYXRlSW1hZ2UoMTAsIDEwKTtcXG4gc2F2ZShpbWcsICdteS5wbmcnKTtcXG5cXG4gLy8gU2F2ZXMgY2FudmFzIGFzIGFuIGltYWdlXFxuIHZhciBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcbiBzYXZlKGNudiwgJ215Q2FudmFzLmpwZycpO1xcblxcbiAvLyBTYXZlcyBwNS5SZW5kZXJlciBvYmplY3QgYXMgYW4gaW1hZ2VcXG4gdmFyIGdiID0gY3JlYXRlR3JhcGhpY3MoMTAwLCAxMDApO1xcbiBzYXZlKGdiLCAnbXlHcmFwaGljcy5qcGcnKTtcXG5cXG4gdmFyIG15VGFibGUgPSBuZXcgcDUuVGFibGUoKTtcXG5cXG4gLy8gU2F2ZXMgdGFibGUgYXMgaHRtbCBmaWxlXFxuIHNhdmUobXlUYWJsZSwgJ215VGFibGUuaHRtbCcpO1xcblxcbiAvLyBDb21tYSBTZXBhcmF0ZWQgVmFsdWVzXFxuIHNhdmUobXlUYWJsZSwgJ215VGFibGUuY3N2Jyk7XFxuXFxuIC8vIFRhYiBTZXBhcmF0ZWQgVmFsdWVzXFxuIHNhdmUobXlUYWJsZSwgJ215VGFibGUudHN2Jyk7XFxuXFxuIHZhciBteUpTT04gPSB7IGE6IDEsIGI6IHRydWUgfTtcXG5cXG4gLy8gU2F2ZXMgcHJldHR5IEpTT05cXG4gc2F2ZShteUpTT04sICdteS5qc29uJyk7XFxuXFxuIC8vIE9wdGltaXplcyBKU09OIGZpbGVzaXplXFxuIHNhdmUobXlKU09OLCAnbXkuanNvbicsIHRydWUpO1xcblxcbiAvLyBTYXZlcyBhcnJheSBvZiBzdHJpbmdzIHRvIGEgdGV4dCBmaWxlIHdpdGggbGluZSBicmVha3MgYWZ0ZXIgZWFjaCBpdGVtXFxuIHZhciBhcnJheU9mU3RyaW5ncyA9IFsnYScsICdiJ107XFxuIHNhdmUoYXJyYXlPZlN0cmluZ3MsICdteS50eHQnKTtcXG4gPC9jb2RlPjwvcHJlPlwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2F2ZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwib2JqZWN0T3JGaWxlbmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SWYgZmlsZW5hbWUgaXMgcHJvdmlkZWQsIHdpbGxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZSBjYW52YXMgYXMgYW4gaW1hZ2Ugd2l0aFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgcG5nIG9yIGpwZyBleHRlbnNpb25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBmaWxlbmFtZS5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb2JqZWN0IGlzIHByb3ZpZGVkLCB3aWxsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmUgZGVwZW5kaW5nIG9uIHRoZSBvYmplY3RcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZpbGVuYW1lIChzZWUgZXhhbXBsZXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUpLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fFN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsZW5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPklmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBhcyB0aGUgZmlyc3RcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciwgdGhlbiB0aGUgc2Vjb25kIHBhcmFtZXRlclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBmaWxlbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzaG91bGQgaW5jbHVkZSBhbiBhcHByb3ByaWF0ZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBleHRlbnNpb24gKHNlZSBleGFtcGxlcyBhYm92ZSkuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm9wdGlvbnNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFkZGl0aW9uYWwgb3B0aW9ucyBkZXBlbmQgb25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGV0eXBlLiBGb3IgZXhhbXBsZSwgd2hlbiBzYXZpbmcgSlNPTixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGluZGljYXRlcyB0aGF0IHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHdpbGwgYmUgb3B0aW1pemVkIGZvciBmaWxlc2l6ZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIHJlYWRhYmlsaXR5LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhbnxTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJPdXRwdXRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vZmlsZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNDU3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPldyaXRlcyB0aGUgY29udGVudHMgb2YgYW4gQXJyYXkgb3IgYSBKU09OIG9iamVjdCB0byBhIC5qc29uIGZpbGUuXFxuVGhlIGZpbGUgc2F2aW5nIHByb2Nlc3MgYW5kIGxvY2F0aW9uIG9mIHRoZSBzYXZlZCBmaWxlIHdpbGxcXG52YXJ5IGJldHdlZW4gd2ViIGJyb3dzZXJzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNhdmVKU09OXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJqc29uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXl8T2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsZW5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJvcHRpbWl6ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SWYgdHJ1ZSwgcmVtb3ZlcyBsaW5lIGJyZWFrc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc3BhY2VzIGZyb20gdGhlIG91dHB1dFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHRvIG9wdGltaXplIGZpbGVzaXplXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidXQgbm90IHJlYWRhYmlsaXR5KS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdj48Y29kZT5cXG4gdmFyIGpzb24gPSB7fTsgLy8gbmV3ICBKU09OIE9iamVjdFxcblxcbiBqc29uLmlkID0gMDtcXG4ganNvbi5zcGVjaWVzID0gJ1BhbnRoZXJhIGxlbyc7XFxuIGpzb24ubmFtZSA9ICdMaW9uJztcXG5cXG4gY3JlYXRlQnV0dG9uKCdzYXZlJylcXG4gLnBvc2l0aW9uKDEwLCAxMClcXG4gLm1vdXNlUHJlc3NlZChmdW5jdGlvbigpIHtcXG4gICBzYXZlSlNPTihqc29uLCAnbGlvbi5qc29uJyk7XFxuIH0pO1xcblxcbiAvLyBzYXZlcyB0aGUgZm9sbG93aW5nIHRvIGEgZmlsZSBjYWxsZWQgXFxcImxpb24uanNvblxcXCI6XFxuIC8vIHtcXG4gLy8gICBcXFwiaWRcXFwiOiAwLFxcbiAvLyAgIFxcXCJzcGVjaWVzXFxcIjogXFxcIlBhbnRoZXJhIGxlb1xcXCIsXFxuIC8vICAgXFxcIm5hbWVcXFwiOiBcXFwiTGlvblxcXCJcXG4gLy8gfVxcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk91dHB1dFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9maWxlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE1MDksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+V3JpdGVzIGFuIGFycmF5IG9mIFN0cmluZ3MgdG8gYSB0ZXh0IGZpbGUsIG9uZSBsaW5lIHBlciBTdHJpbmcuXFxuVGhlIGZpbGUgc2F2aW5nIHByb2Nlc3MgYW5kIGxvY2F0aW9uIG9mIHRoZSBzYXZlZCBmaWxlIHdpbGxcXG52YXJ5IGJldHdlZW4gd2ViIGJyb3dzZXJzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNhdmVTdHJpbmdzXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zdHJpbmcgYXJyYXkgdG8gYmUgd3JpdHRlbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nW11cIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmaWxlbmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZmlsZW5hbWUgZm9yIG91dHB1dDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXh0ZW5zaW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgZmlsZW5hbWUmIzM5O3MgZXh0ZW5zaW9uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdj48Y29kZT5cXG4gdmFyIHdvcmRzID0gJ2FwcGxlIGJlYXIgY2F0IGRvZyc7XFxuXFxuIC8vIC5zcGxpdCgpIG91dHB1dHMgYW4gQXJyYXlcXG4gdmFyIGxpc3QgPSBzcGxpdCh3b3JkcywgJyAnKTtcXG5cXG4gY3JlYXRlQnV0dG9uKCdzYXZlJylcXG4gLnBvc2l0aW9uKDEwLCAxMClcXG4gLm1vdXNlUHJlc3NlZChmdW5jdGlvbigpIHtcXG4gICBzYXZlU3RyaW5ncyhsaXN0LCAnbm91bnMudHh0Jyk7XFxuIH0pO1xcblxcbiAvLyBTYXZlcyB0aGUgZm9sbG93aW5nIHRvIGEgZmlsZSBjYWxsZWQgJ25vdW5zLnR4dCc6XFxuIC8vXFxuIC8vIGFwcGxlXFxuIC8vIGJlYXJcXG4gLy8gY2F0XFxuIC8vIGRvZ1xcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk91dHB1dFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9maWxlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE1NzEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+V3JpdGVzIHRoZSBjb250ZW50cyBvZiBhIFRhYmxlIG9iamVjdCB0byBhIGZpbGUuIERlZmF1bHRzIHRvIGFcXG50ZXh0IGZpbGUgd2l0aCBjb21tYS1zZXBhcmF0ZWQtdmFsdWVzICgmIzM5O2NzdiYjMzk7KSBidXQgY2FuIGFsc29cXG51c2UgdGFiIHNlcGFyYXRpb24gKCYjMzk7dHN2JiMzOTspLCBvciBnZW5lcmF0ZSBhbiBIVE1MIHRhYmxlICgmIzM5O2h0bWwmIzM5OykuXFxuVGhlIGZpbGUgc2F2aW5nIHByb2Nlc3MgYW5kIGxvY2F0aW9uIG9mIHRoZSBzYXZlZCBmaWxlIHdpbGxcXG52YXJ5IGJldHdlZW4gd2ViIGJyb3dzZXJzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNhdmVUYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiVGFibGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBUYWJsZSBvYmplY3QgdG8gc2F2ZSB0byBhIGZpbGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlRhYmxlXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsZW5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBmaWxlbmFtZSB0byB3aGljaCB0aGUgVGFibGUgc2hvdWxkIGJlIHNhdmVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJvcHRpb25zXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYW4gYmUgb25lIG9mICZxdW90O3RzdiZxdW90OywgJnF1b3Q7Y3N2JnF1b3Q7LCBvciAmcXVvdDtodG1sJnF1b3Q7PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbiB2YXIgdGFibGU7XFxuXFxuIGZ1bmN0aW9uIHNldHVwKCkge1xcbiB0YWJsZSA9IG5ldyBwNS5UYWJsZSgpO1xcblxcbiB0YWJsZS5hZGRDb2x1bW4oJ2lkJyk7XFxuIHRhYmxlLmFkZENvbHVtbignc3BlY2llcycpO1xcbiB0YWJsZS5hZGRDb2x1bW4oJ25hbWUnKTtcXG5cXG4gdmFyIG5ld1JvdyA9IHRhYmxlLmFkZFJvdygpO1xcbiBuZXdSb3cuc2V0TnVtKCdpZCcsIHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTtcXG4gbmV3Um93LnNldFN0cmluZygnc3BlY2llcycsICdQYW50aGVyYSBsZW8nKTtcXG4gbmV3Um93LnNldFN0cmluZygnbmFtZScsICdMaW9uJyk7XFxuXFxuIC8vIFRvIHNhdmUsIHVuLWNvbW1lbnQgbmV4dCBsaW5lIHRoZW4gY2xpY2sgJ3J1bidcXG4gLy8gc2F2ZVRhYmxlKHRhYmxlLCAnbmV3LmNzdicpO1xcbiB9XFxuXFxuIC8vIFNhdmVzIHRoZSBmb2xsb3dpbmcgdG8gYSBmaWxlIGNhbGxlZCAnbmV3LmNzdic6XFxuIC8vIGlkLHNwZWNpZXMsbmFtZVxcbiAvLyAwLFBhbnRoZXJhIGxlbyxMaW9uXFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiT3V0cHV0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGFibGUgT3B0aW9uczwvcD5cXG48cD5HZW5lcmljIGNsYXNzIGZvciBoYW5kbGluZyB0YWJ1bGFyIGRhdGEsIHR5cGljYWxseSBmcm9tIGFcXG5DU1YsIFRTViwgb3Igb3RoZXIgc29ydCBvZiBzcHJlYWRzaGVldCBmaWxlLjwvcD5cXG48cD5DU1YgZmlsZXMgYXJlXFxuPGEgaHJlZj1cXFwiaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21tYS1zZXBhcmF0ZWRfdmFsdWVzXFxcIj5cXG5jb21tYSBzZXBhcmF0ZWQgdmFsdWVzPC9hPiwgb2Z0ZW4gd2l0aCB0aGUgZGF0YSBpbiBxdW90ZXMuIFRTVlxcbmZpbGVzIHVzZSB0YWJzIGFzIHNlcGFyYXRvcnMsIGFuZCB1c3VhbGx5IGRvbiYjMzk7dCBib3RoZXIgd2l0aCB0aGVcXG5xdW90ZXMuPC9wPlxcbjxwPkZpbGUgbmFtZXMgc2hvdWxkIGVuZCB3aXRoIC5jc3YgaWYgdGhleSYjMzk7cmUgY29tbWEgc2VwYXJhdGVkLjwvcD5cXG48cD5BIHJvdWdoICZxdW90O3NwZWMmcXVvdDsgZm9yIENTViBjYW4gYmUgZm91bmRcXG48YSBocmVmPVxcXCJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0MTgwXFxcIj5oZXJlPC9hPi48L3A+XFxuPHA+VG8gbG9hZCBmaWxlcywgdXNlIHRoZSBsb2FkVGFibGUgbWV0aG9kLjwvcD5cXG48cD5UbyBzYXZlIHRhYmxlcyB0byB5b3VyIGNvbXB1dGVyLCB1c2UgdGhlIHNhdmUgbWV0aG9kXFxuIG9yIHRoZSBzYXZlVGFibGUgbWV0aG9kLjwvcD5cXG5cXG48cD5Qb3NzaWJsZSBvcHRpb25zIGluY2x1ZGU6PC9wPlxcbjx1bD5cXG48bGk+Y3N2IC0gcGFyc2UgdGhlIHRhYmxlIGFzIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXNcXG48bGk+dHN2IC0gcGFyc2UgdGhlIHRhYmxlIGFzIHRhYi1zZXBhcmF0ZWQgdmFsdWVzXFxuPGxpPmhlYWRlciAtIHRoaXMgdGFibGUgaGFzIGEgaGVhZGVyICh0aXRsZSkgcm93XFxuPC91bD5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UYWJsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ1LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjb2x1bW5zXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdbXVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTAsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJvd3NcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlRhYmxlUm93W11cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UYWJsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlVzZSBhZGRSb3coKSB0byBhZGQgYSBuZXcgcm93IG9mIGRhdGEgdG8gYSBwNS5UYWJsZSBvYmplY3QuIEJ5IGRlZmF1bHQsXFxuYW4gZW1wdHkgcm93IGlzIGNyZWF0ZWQuIFR5cGljYWxseSwgeW91IHdvdWxkIHN0b3JlIGEgcmVmZXJlbmNlIHRvXFxudGhlIG5ldyByb3cgaW4gYSBUYWJsZVJvdyBvYmplY3QgKHNlZSBuZXdSb3cgaW4gdGhlIGV4YW1wbGUgYWJvdmUpLFxcbmFuZCB0aGVuIHNldCBpbmRpdmlkdWFsIHZhbHVlcyB1c2luZyBzZXQoKS48L3A+XFxuPHA+SWYgYSBwNS5UYWJsZVJvdyBvYmplY3QgaXMgaW5jbHVkZWQgYXMgYSBwYXJhbWV0ZXIsIHRoZW4gdGhhdCByb3cgaXNcXG5kdXBsaWNhdGVkIGFuZCBhZGRlZCB0byB0aGUgdGFibGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWRkUm93XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyb3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnJvdyB0byBiZSBhZGRlZCB0byB0aGUgdGFibGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlRhYmxlUm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG4gPGNvZGU+XFxuIC8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcXFwibWFtbWFscy5jc3ZcXFwiXFxuIC8vIGluIHRoZSBwcm9qZWN0J3MgXFxcImFzc2V0c1xcXCIgZm9sZGVyOlxcbiAvL1xcbiAvLyBpZCxzcGVjaWVzLG5hbWVcXG4gLy8gMCxDYXByYSBoaXJjdXMsR29hdFxcbiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXFxuIC8vIDIsRXF1dXMgemVicmEsWmVicmFcXG5cXG4gdmFyIHRhYmxlO1xcblxcbiBmdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcXFwiY3N2XFxcIlxcbiAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcXG4gdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XFxuIH1cXG5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuIC8vYWRkIGEgcm93XFxuIHZhciBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcXG4gbmV3Um93LnNldFN0cmluZygnaWQnLCB0YWJsZS5nZXRSb3dDb3VudCgpIC0gMSk7XFxuIG5ld1Jvdy5zZXRTdHJpbmcoJ3NwZWNpZXMnLCAnQ2FuaXMgTHVwdXMnKTtcXG4gbmV3Um93LnNldFN0cmluZygnbmFtZScsICdXb2xmJyk7XFxuXFxuIC8vcHJpbnQgdGhlIHJlc3VsdHNcXG4gZm9yICh2YXIgciA9IDA7IHIgPCB0YWJsZS5nZXRSb3dDb3VudCgpOyByKyspXFxuICAgZm9yICh2YXIgYyA9IDA7IGMgPCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOyBjKyspXFxuICAgICBwcmludCh0YWJsZS5nZXRTdHJpbmcociwgYykpO1xcbiB9XFxuIDwvY29kZT5cXG4gPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTE5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlbW92ZXMgYSByb3cgZnJvbSB0aGUgdGFibGUgb2JqZWN0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlbW92ZVJvd1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaWRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPklEIG51bWJlciBvZiB0aGUgcm93IHRvIHJlbW92ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuLy8gR2l2ZW4gdGhlIENTViBmaWxlIFxcXCJtYW1tYWxzLmNzdlxcXCJcXG4vLyBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4vL1xcbi8vIGlkLHNwZWNpZXMsbmFtZVxcbi8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4vLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXFxuLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxcblxcbnZhciB0YWJsZTtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXFxcImNzdlxcXCJcXG4gIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xcbiAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy9yZW1vdmUgdGhlIGZpcnN0IHJvd1xcbiAgdGFibGUucmVtb3ZlUm93KDApO1xcblxcbiAgLy9wcmludCB0aGUgcmVzdWx0c1xcbiAgZm9yICh2YXIgciA9IDA7IHIgPCB0YWJsZS5nZXRSb3dDb3VudCgpOyByKyspXFxuICAgIGZvciAodmFyIGMgPSAwOyBjIDwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsgYysrKVxcbiAgICAgIHByaW50KHRhYmxlLmdldFN0cmluZyhyLCBjKSk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNjcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgc3BlY2lmaWVkIHA1LlRhYmxlUm93LiBUaGUgcmVmZXJlbmNlXFxuY2FuIHRoZW4gYmUgdXNlZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgdGhlIHNlbGVjdGVkIHJvdy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRSb3dcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJvd0lEXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5JRCBudW1iZXIgb2YgdGhlIHJvdyB0byBnZXQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInA1LlRhYmxlUm93IG9iamVjdFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlRhYmxlUm93XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbi8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcXFwibWFtbWFscy5jc3ZcXFwiXFxuLy8gaW4gdGhlIHByb2plY3QncyBcXFwiYXNzZXRzXFxcIiBmb2xkZXI6XFxuLy9cXG4vLyBpZCxzcGVjaWVzLG5hbWVcXG4vLyAwLENhcHJhIGhpcmN1cyxHb2F0XFxuLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxcbi8vIDIsRXF1dXMgemVicmEsWmVicmFcXG5cXG52YXIgdGFibGU7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFxcXCJjc3ZcXFwiXFxuICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcXG4gIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciByb3cgPSB0YWJsZS5nZXRSb3coMSk7XFxuICAvL3ByaW50IGl0IGNvbHVtbiBieSBjb2x1bW5cXG4gIC8vbm90ZTogYSByb3cgaXMgYW4gb2JqZWN0LCBub3QgYW4gYXJyYXlcXG4gIGZvciAodmFyIGMgPSAwOyBjIDwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsgYysrKSB7XFxuICAgIHByaW50KHJvdy5nZXRTdHJpbmcoYykpO1xcbiAgfVxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjEzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldHMgYWxsIHJvd3MgZnJvbSB0aGUgdGFibGUuIFJldHVybnMgYW4gYXJyYXkgb2YgcDUuVGFibGVSb3dzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldFJvd3NcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQXJyYXkgb2YgcDUuVGFibGVSb3dzXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVGFibGVSb3dbXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuIDxjb2RlPlxcbiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIlxcbiAvLyBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4gLy9cXG4gLy8gaWQsc3BlY2llcyxuYW1lXFxuIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4gLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxcbiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXFxuXFxuIHZhciB0YWJsZTtcXG5cXG4gZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXFxcImNzdlxcXCJcXG4gLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXFxuIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xcbiB9XFxuXFxuIGZ1bmN0aW9uIHNldHVwKCkge1xcbiB2YXIgcm93cyA9IHRhYmxlLmdldFJvd3MoKTtcXG5cXG4gLy93YXJuaW5nOiByb3dzIGlzIGFuIGFycmF5IG9mIG9iamVjdHNcXG4gZm9yICh2YXIgciA9IDA7IHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XFxuICAgcm93c1tyXS5zZXQoJ25hbWUnLCAnVW5pY29ybicpO1xcbiB9XFxuXFxuIC8vcHJpbnQgdGhlIHJlc3VsdHNcXG4gZm9yIChyID0gMDsgciA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHIrKylcXG4gICBmb3IgKHZhciBjID0gMDsgYyA8IHRhYmxlLmdldENvbHVtbkNvdW50KCk7IGMrKylcXG4gICAgIHByaW50KHRhYmxlLmdldFN0cmluZyhyLCBjKSk7XFxuIH1cXG4gPC9jb2RlPlxcbiA8L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNjIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RmluZHMgdGhlIGZpcnN0IHJvdyBpbiB0aGUgVGFibGUgdGhhdCBjb250YWlucyB0aGUgdmFsdWVcXG5wcm92aWRlZCwgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhhdCByb3cuIEV2ZW4gaWZcXG5tdWx0aXBsZSByb3dzIGFyZSBwb3NzaWJsZSBtYXRjaGVzLCBvbmx5IHRoZSBmaXJzdCBtYXRjaGluZ1xcbnJvdyBpcyByZXR1cm5lZC4gVGhlIGNvbHVtbiB0byBzZWFyY2ggbWF5IGJlIHNwZWNpZmllZCBieVxcbmVpdGhlciBpdHMgSUQgb3IgdGl0bGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmluZFJvd1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSB2YWx1ZSB0byBtYXRjaDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5JRCBudW1iZXIgb3IgdGl0bGUgb2YgdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiB0byBzZWFyY2g8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJ8U3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5UYWJsZVJvd1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuIDxjb2RlPlxcbiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIlxcbiAvLyBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4gLy9cXG4gLy8gaWQsc3BlY2llcyxuYW1lXFxuIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4gLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxcbiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXFxuXFxuIHZhciB0YWJsZTtcXG5cXG4gZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXFxcImNzdlxcXCJcXG4gLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXFxuIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xcbiB9XFxuXFxuIGZ1bmN0aW9uIHNldHVwKCkge1xcbiAvL2ZpbmQgdGhlIGFuaW1hbCBuYW1lZCB6ZWJyYVxcbiB2YXIgcm93ID0gdGFibGUuZmluZFJvdygnWmVicmEnLCAnbmFtZScpO1xcbiAvL2ZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgc3BlY2llc1xcbiBwcmludChyb3cuZ2V0U3RyaW5nKCdzcGVjaWVzJykpO1xcbiB9XFxuIDwvY29kZT5cXG4gPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzI3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkZpbmRzIHRoZSByb3dzIGluIHRoZSBUYWJsZSB0aGF0IGNvbnRhaW4gdGhlIHZhbHVlXFxucHJvdmlkZWQsIGFuZCByZXR1cm5zIHJlZmVyZW5jZXMgdG8gdGhvc2Ugcm93cy4gUmV0dXJucyBhblxcbkFycmF5LCBzbyBmb3IgbXVzdCBiZSB1c2VkIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHJvd3MsXFxuYXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgYWJvdmUuIFRoZSBjb2x1bW4gdG8gc2VhcmNoIG1heSBiZVxcbnNwZWNpZmllZCBieSBlaXRoZXIgaXRzIElEIG9yIHRpdGxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImZpbmRSb3dzXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHZhbHVlIHRvIG1hdGNoPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPklEIG51bWJlciBvciB0aXRsZSBvZiB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uIHRvIHNlYXJjaDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlcnxTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkFuIEFycmF5IG9mIFRhYmxlUm93IG9iamVjdHNcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5UYWJsZVJvd1tdXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG4gPGNvZGU+XFxuIC8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcXFwibWFtbWFscy5jc3ZcXFwiXFxuIC8vIGluIHRoZSBwcm9qZWN0J3MgXFxcImFzc2V0c1xcXCIgZm9sZGVyOlxcbiAvL1xcbiAvLyBpZCxzcGVjaWVzLG5hbWVcXG4gLy8gMCxDYXByYSBoaXJjdXMsR29hdFxcbiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXFxuIC8vIDIsRXF1dXMgemVicmEsWmVicmFcXG5cXG4gdmFyIHRhYmxlO1xcblxcbiBmdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcXFwiY3N2XFxcIlxcbiAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcXG4gdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XFxuIH1cXG5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuIC8vYWRkIGFub3RoZXIgZ29hdFxcbiB2YXIgbmV3Um93ID0gdGFibGUuYWRkUm93KCk7XFxuIG5ld1Jvdy5zZXRTdHJpbmcoJ2lkJywgdGFibGUuZ2V0Um93Q291bnQoKSAtIDEpO1xcbiBuZXdSb3cuc2V0U3RyaW5nKCdzcGVjaWVzJywgJ1NjYXBlIEdvYXQnKTtcXG4gbmV3Um93LnNldFN0cmluZygnbmFtZScsICdHb2F0Jyk7XFxuXFxuIC8vZmluZCB0aGUgcm93cyBjb250YWluaW5nIGFuaW1hbHMgbmFtZWQgR29hdFxcbiB2YXIgcm93cyA9IHRhYmxlLmZpbmRSb3dzKCdHb2F0JywgJ25hbWUnKTtcXG4gcHJpbnQocm93cy5sZW5ndGggKyAnIEdvYXRzIGZvdW5kJyk7XFxuIH1cXG4gPC9jb2RlPlxcbiA8L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzOTYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RmluZHMgdGhlIGZpcnN0IHJvdyBpbiB0aGUgVGFibGUgdGhhdCBtYXRjaGVzIHRoZSByZWd1bGFyXFxuZXhwcmVzc2lvbiBwcm92aWRlZCwgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhhdCByb3cuXFxuRXZlbiBpZiBtdWx0aXBsZSByb3dzIGFyZSBwb3NzaWJsZSBtYXRjaGVzLCBvbmx5IHRoZSBmaXJzdFxcbm1hdGNoaW5nIHJvdyBpcyByZXR1cm5lZC4gVGhlIGNvbHVtbiB0byBzZWFyY2ggbWF5IGJlXFxuc3BlY2lmaWVkIGJ5IGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibWF0Y2hSb3dcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJlZ2V4cFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfFJlZ0V4cFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGNvbHVtbiBJRCAobnVtYmVyKSBvclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlIChzdHJpbmcpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8SW50ZWdlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiVGFibGVSb3cgb2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVGFibGVSb3dcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuLy8gR2l2ZW4gdGhlIENTViBmaWxlIFxcXCJtYW1tYWxzLmNzdlxcXCJcXG4vLyBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4vL1xcbi8vIGlkLHNwZWNpZXMsbmFtZVxcbi8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4vLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXFxuLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxcblxcbnZhciB0YWJsZTtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXFxcImNzdlxcXCJcXG4gIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xcbiAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy9TZWFyY2ggdXNpbmcgc3BlY2lmaWVkIHJlZ2V4IG9uIGEgZ2l2ZW4gY29sdW1uLCByZXR1cm4gVGFibGVSb3cgb2JqZWN0XFxuICB2YXIgbWFtbWFsID0gdGFibGUubWF0Y2hSb3cobmV3IFJlZ0V4cCgnYW50JyksIDEpO1xcbiAgcHJpbnQobWFtbWFsLmdldFN0cmluZygxKSk7XFxuICAvL091dHB1dCBcXFwiUGFudGhlcmEgcGFyZHVzXFxcIlxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0NTUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RmluZHMgdGhlIHJvd3MgaW4gdGhlIFRhYmxlIHRoYXQgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwcm92aWRlZCxcXG5hbmQgcmV0dXJucyByZWZlcmVuY2VzIHRvIHRob3NlIHJvd3MuIFJldHVybnMgYW4gYXJyYXksIHNvIGZvciBtdXN0IGJlXFxudXNlZCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSByb3dzLCBhcyBzaG93biBpbiB0aGUgZXhhbXBsZS4gVGhlXFxuY29sdW1uIHRvIHNlYXJjaCBtYXkgYmUgc3BlY2lmaWVkIGJ5IGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibWF0Y2hSb3dzXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyZWdleHBcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2g8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGNvbHVtbiBJRCAobnVtYmVyKSBvclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlIChzdHJpbmcpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8SW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBbiBBcnJheSBvZiBUYWJsZVJvdyBvYmplY3RzXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVGFibGVSb3dbXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG52YXIgdGFibGU7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB0YWJsZSA9IG5ldyBwNS5UYWJsZSgpO1xcblxcbiAgdGFibGUuYWRkQ29sdW1uKCduYW1lJyk7XFxuICB0YWJsZS5hZGRDb2x1bW4oJ3R5cGUnKTtcXG5cXG4gIHZhciBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcXG4gIG5ld1Jvdy5zZXRTdHJpbmcoJ25hbWUnLCAnTGlvbicpO1xcbiAgbmV3Um93LnNldFN0cmluZygndHlwZScsICdNYW1tYWwnKTtcXG5cXG4gIG5ld1JvdyA9IHRhYmxlLmFkZFJvdygpO1xcbiAgbmV3Um93LnNldFN0cmluZygnbmFtZScsICdTbmFrZScpO1xcbiAgbmV3Um93LnNldFN0cmluZygndHlwZScsICdSZXB0aWxlJyk7XFxuXFxuICBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcXG4gIG5ld1Jvdy5zZXRTdHJpbmcoJ25hbWUnLCAnTW9zcXVpdG8nKTtcXG4gIG5ld1Jvdy5zZXRTdHJpbmcoJ3R5cGUnLCAnSW5zZWN0Jyk7XFxuXFxuICBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcXG4gIG5ld1Jvdy5zZXRTdHJpbmcoJ25hbWUnLCAnTGl6YXJkJyk7XFxuICBuZXdSb3cuc2V0U3RyaW5nKCd0eXBlJywgJ1JlcHRpbGUnKTtcXG5cXG4gIHZhciByb3dzID0gdGFibGUubWF0Y2hSb3dzKCdSLionLCAndHlwZScpO1xcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XFxuICAgIHByaW50KHJvd3NbaV0uZ2V0U3RyaW5nKCduYW1lJykgKyAnOiAnICsgcm93c1tpXS5nZXRTdHJpbmcoJ3R5cGUnKSk7XFxuICB9XFxufVxcbi8vIFNrZXRjaCBwcmludHM6XFxuLy8gU25ha2U6IFJlcHRpbGVcXG4vLyBMaXphcmQ6IFJlcHRpbGVcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MjIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0cmlldmVzIGFsbCB2YWx1ZXMgaW4gdGhlIHNwZWNpZmllZCBjb2x1bW4sIGFuZCByZXR1cm5zIHRoZW1cXG5hcyBhbiBhcnJheS4gVGhlIGNvbHVtbiBtYXkgYmUgc3BlY2lmaWVkIGJ5IGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0Q29sdW1uXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0cmluZyBvciBOdW1iZXIgb2YgdGhlIGNvbHVtbiB0byByZXR1cm48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkFycmF5IG9mIGNvbHVtbiB2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuIDxjb2RlPlxcbiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIlxcbiAvLyBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4gLy9cXG4gLy8gaWQsc3BlY2llcyxuYW1lXFxuIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4gLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxcbiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXFxuXFxuIHZhciB0YWJsZTtcXG5cXG4gZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXFxcImNzdlxcXCJcXG4gLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXFxuIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xcbiB9XFxuXFxuIGZ1bmN0aW9uIHNldHVwKCkge1xcbiAvL2dldENvbHVtbiByZXR1cm5zIGFuIGFycmF5IHRoYXQgY2FuIGJlIHByaW50ZWQgZGlyZWN0bHlcXG4gcHJpbnQodGFibGUuZ2V0Q29sdW1uKCdzcGVjaWVzJykpO1xcbiAvL291dHB1dHMgW1xcXCJDYXByYSBoaXJjdXNcXFwiLCBcXFwiUGFudGhlcmEgcGFyZHVzXFxcIiwgXFxcIkVxdXVzIHplYnJhXFxcIl1cXG4gfVxcbiA8L2NvZGU+XFxuIDwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UYWJsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU3NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZW1vdmVzIGFsbCByb3dzIGZyb20gYSBUYWJsZS4gV2hpbGUgYWxsIHJvd3MgYXJlIHJlbW92ZWQsXFxuY29sdW1ucyBhbmQgY29sdW1uIHRpdGxlcyBhcmUgbWFpbnRhaW5lZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjbGVhclJvd3NcIixcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbiA8Y29kZT5cXG4gLy8gR2l2ZW4gdGhlIENTViBmaWxlIFxcXCJtYW1tYWxzLmNzdlxcXCJcXG4gLy8gaW4gdGhlIHByb2plY3QncyBcXFwiYXNzZXRzXFxcIiBmb2xkZXI6XFxuIC8vXFxuIC8vIGlkLHNwZWNpZXMsbmFtZVxcbiAvLyAwLENhcHJhIGhpcmN1cyxHb2F0XFxuIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcXG4gLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxcblxcbiB2YXIgdGFibGU7XFxuXFxuIGZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFxcXCJjc3ZcXFwiXFxuIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xcbiB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcXG4gfVxcblxcbiBmdW5jdGlvbiBzZXR1cCgpIHtcXG4gdGFibGUuY2xlYXJSb3dzKCk7XFxuIHByaW50KHRhYmxlLmdldFJvd0NvdW50KCkgKyAnIHRvdGFsIHJvd3MgaW4gdGFibGUnKTtcXG4gcHJpbnQodGFibGUuZ2V0Q29sdW1uQ291bnQoKSArICcgdG90YWwgY29sdW1ucyBpbiB0YWJsZScpO1xcbiB9XFxuIDwvY29kZT5cXG4gPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjE3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlVzZSBhZGRDb2x1bW4oKSB0byBhZGQgYSBuZXcgY29sdW1uIHRvIGEgVGFibGUgb2JqZWN0LlxcblR5cGljYWxseSwgeW91IHdpbGwgd2FudCB0byBzcGVjaWZ5IGEgdGl0bGUsIHNvIHRoZSBjb2x1bW5cXG5tYXkgYmUgZWFzaWx5IHJlZmVyZW5jZWQgbGF0ZXIgYnkgbmFtZS4gKElmIG5vIHRpdGxlIGlzXFxuc3BlY2lmaWVkLCB0aGUgbmV3IGNvbHVtbiYjMzk7cyB0aXRsZSB3aWxsIGJlIG51bGwuKTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFkZENvbHVtblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGl0bGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRpdGxlIG9mIHRoZSBnaXZlbiBjb2x1bW48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuIDxjb2RlPlxcbiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIlxcbiAvLyBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4gLy9cXG4gLy8gaWQsc3BlY2llcyxuYW1lXFxuIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4gLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxcbiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXFxuXFxuIHZhciB0YWJsZTtcXG5cXG4gZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXFxcImNzdlxcXCJcXG4gLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXFxuIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xcbiB9XFxuXFxuIGZ1bmN0aW9uIHNldHVwKCkge1xcbiB0YWJsZS5hZGRDb2x1bW4oJ2Nhcm5pdm9yZScpO1xcbiB0YWJsZS5zZXQoMCwgJ2Nhcm5pdm9yZScsICdubycpO1xcbiB0YWJsZS5zZXQoMSwgJ2Nhcm5pdm9yZScsICd5ZXMnKTtcXG4gdGFibGUuc2V0KDIsICdjYXJuaXZvcmUnLCAnbm8nKTtcXG5cXG4gLy9wcmludCB0aGUgcmVzdWx0c1xcbiBmb3IgKHZhciByID0gMDsgciA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHIrKylcXG4gICBmb3IgKHZhciBjID0gMDsgYyA8IHRhYmxlLmdldENvbHVtbkNvdW50KCk7IGMrKylcXG4gICAgIHByaW50KHRhYmxlLmdldFN0cmluZyhyLCBjKSk7XFxuIH1cXG4gPC9jb2RlPlxcbiA8L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2NjgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSBUYWJsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRDb2x1bW5Db3VudFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGlzIHRhYmxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2PlxcbiA8Y29kZT5cXG4gLy8gZ2l2ZW4gdGhlIGN2cyBmaWxlIFxcXCJibG9icy5jc3ZcXFwiIGluIC9hc3NldHMgZGlyZWN0b3J5XFxuIC8vIElELCBOYW1lLCBGbGF2b3IsIFNoYXBlLCBDb2xvclxcbiAvLyBCbG9iMSwgQmxvYmJ5LCBTd2VldCwgQmxvYiwgUGlua1xcbiAvLyBCbG9iMiwgU2FkZHksIFNhdm9yeSwgQmxvYiwgQmx1ZVxcblxcbiB2YXIgdGFibGU7XFxuXFxuIGZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvYmxvYnMuY3N2Jyk7XFxuIH1cXG5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuIGNyZWF0ZUNhbnZhcygyMDAsIDEwMCk7XFxuIHRleHRBbGlnbihDRU5URVIpO1xcbiBiYWNrZ3JvdW5kKDI1NSk7XFxuIH1cXG5cXG4gZnVuY3Rpb24gZHJhdygpIHtcXG4gdmFyIG51bU9mQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTtcXG4gdGV4dCgnVGhlcmUgYXJlICcgKyBudW1PZkNvbHVtbiArICcgY29sdW1ucyBpbiB0aGUgdGFibGUuJywgMTAwLCA1MCk7XFxuIH1cXG4gPC9jb2RlPlxcbiA8L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UYWJsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDcwNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyBpbiBhIFRhYmxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldFJvd0NvdW50XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk51bWJlciBvZiByb3dzIGluIHRoaXMgdGFibGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXY+XFxuIDxjb2RlPlxcbiAvLyBnaXZlbiB0aGUgY3ZzIGZpbGUgXFxcImJsb2JzLmNzdlxcXCIgaW4gL2Fzc2V0cyBkaXJlY3RvcnlcXG4gLy9cXG4gLy8gSUQsIE5hbWUsIEZsYXZvciwgU2hhcGUsIENvbG9yXFxuIC8vIEJsb2IxLCBCbG9iYnksIFN3ZWV0LCBCbG9iLCBQaW5rXFxuIC8vIEJsb2IyLCBTYWRkeSwgU2F2b3J5LCBCbG9iLCBCbHVlXFxuXFxuIHZhciB0YWJsZTtcXG5cXG4gZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9ibG9icy5jc3YnKTtcXG4gfVxcblxcbiBmdW5jdGlvbiBzZXR1cCgpIHtcXG4gY3JlYXRlQ2FudmFzKDIwMCwgMTAwKTtcXG4gdGV4dEFsaWduKENFTlRFUik7XFxuIGJhY2tncm91bmQoMjU1KTtcXG4gfVxcblxcbiBmdW5jdGlvbiBkcmF3KCkge1xcbiB0ZXh0KCdUaGVyZSBhcmUgJyArIHRhYmxlLmdldFJvd0NvdW50KCkgKyAnIHJvd3MgaW4gdGhlIHRhYmxlLicsIDEwMCwgNTApO1xcbiB9XFxuIDwvY29kZT5cXG4gPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3NDAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmVtb3ZlcyBhbnkgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXJzIChvciAmcXVvdDt0b2tlbnMmcXVvdDspLjwvcD5cXG5cXG48cD5JZiBubyBjb2x1bW4gaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSB2YWx1ZXMgaW4gYWxsIGNvbHVtbnMgYW5kXFxucm93cyBhcmUgcHJvY2Vzc2VkLiBBIHNwZWNpZmljIGNvbHVtbiBtYXkgYmUgcmVmZXJlbmNlZCBieVxcbmVpdGhlciBpdHMgSUQgb3IgdGl0bGUuPC9wPlwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVtb3ZlVG9rZW5zXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjaGFyc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3RyaW5nIGxpc3RpbmcgY2hhcmFjdGVycyB0byBiZSByZW1vdmVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbHVtbiBJRCAobnVtYmVyKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5hbWUgKHN0cmluZyk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xJbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj48Y29kZT5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuIHZhciB0YWJsZSA9IG5ldyBwNS5UYWJsZSgpO1xcblxcbiB0YWJsZS5hZGRDb2x1bW4oJ25hbWUnKTtcXG4gdGFibGUuYWRkQ29sdW1uKCd0eXBlJyk7XFxuXFxuIHZhciBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcXG4gbmV3Um93LnNldFN0cmluZygnbmFtZScsICcgICAkTGlvbiAgLCcpO1xcbiBuZXdSb3cuc2V0U3RyaW5nKCd0eXBlJywgJywsLE1hbW1hbCcpO1xcblxcbiBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcXG4gbmV3Um93LnNldFN0cmluZygnbmFtZScsICckU25ha2UgICcpO1xcbiBuZXdSb3cuc2V0U3RyaW5nKCd0eXBlJywgJywsLFJlcHRpbGUnKTtcXG5cXG4gdGFibGUucmVtb3ZlVG9rZW5zKCcsJCAnKTtcXG4gcHJpbnQodGFibGUuZ2V0QXJyYXkoKSk7XFxuIH1cXG5cXG4gLy8gcHJpbnRzOlxcbiAvLyAgMCAgXFxcIkxpb25cXFwiICAgXFxcIk1hbWFsXFxcIlxcbiAvLyAgMSAgXFxcIlNuYWtlXFxcIiAgXFxcIlJlcHRpbGVcXFwiXFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UYWJsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgxNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UcmltcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBzdWNoIGFzIHNwYWNlcyBhbmQgdGFicyxcXG5mcm9tIFN0cmluZyB0YWJsZSB2YWx1ZXMuIElmIG5vIGNvbHVtbiBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlXFxudmFsdWVzIGluIGFsbCBjb2x1bW5zIGFuZCByb3dzIGFyZSB0cmltbWVkLiBBIHNwZWNpZmljIGNvbHVtblxcbm1heSBiZSByZWZlcmVuY2VkIGJ5IGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidHJpbVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db2x1bW4gSUQgKG51bWJlcilcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBuYW1lIChzdHJpbmcpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8SW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+PGNvZGU+XFxuIGZ1bmN0aW9uIHNldHVwKCkge1xcbiB2YXIgdGFibGUgPSBuZXcgcDUuVGFibGUoKTtcXG5cXG4gdGFibGUuYWRkQ29sdW1uKCduYW1lJyk7XFxuIHRhYmxlLmFkZENvbHVtbigndHlwZScpO1xcblxcbiB2YXIgbmV3Um93ID0gdGFibGUuYWRkUm93KCk7XFxuIG5ld1Jvdy5zZXRTdHJpbmcoJ25hbWUnLCAnICAgTGlvbiAgLCcpO1xcbiBuZXdSb3cuc2V0U3RyaW5nKCd0eXBlJywgJyBNYW1tYWwgICcpO1xcblxcbiBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcXG4gbmV3Um93LnNldFN0cmluZygnbmFtZScsICcgIFNuYWtlICAnKTtcXG4gbmV3Um93LnNldFN0cmluZygndHlwZScsICcgIFJlcHRpbGUgICcpO1xcblxcbiB0YWJsZS50cmltKCk7XFxuIHByaW50KHRhYmxlLmdldEFycmF5KCkpO1xcbiB9XFxuXFxuIC8vIHByaW50czpcXG4gLy8gIDAgIFxcXCJMaW9uXFxcIiAgIFxcXCJNYW1hbFxcXCJcXG4gLy8gIDEgIFxcXCJTbmFrZVxcXCIgIFxcXCJSZXB0aWxlXFxcIlxcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4NzgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VXNlIHJlbW92ZUNvbHVtbigpIHRvIHJlbW92ZSBhbiBleGlzdGluZyBjb2x1bW4gZnJvbSBhIFRhYmxlXFxub2JqZWN0LiBUaGUgY29sdW1uIHRvIGJlIHJlbW92ZWQgbWF5IGJlIGlkZW50aWZpZWQgYnkgZWl0aGVyXFxuaXRzIHRpdGxlIChhIFN0cmluZykgb3IgaXRzIGluZGV4IHZhbHVlIChhbiBpbnQpLlxcbnJlbW92ZUNvbHVtbigwKSB3b3VsZCByZW1vdmUgdGhlIGZpcnN0IGNvbHVtbiwgcmVtb3ZlQ29sdW1uKDEpXFxud291bGQgcmVtb3ZlIHRoZSBzZWNvbmQgY29sdW1uLCBhbmQgc28gb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVtb3ZlQ29sdW1uXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvbHVtbk5hbWUgKHN0cmluZykgb3IgSUQgKG51bWJlcik8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuIDxjb2RlPlxcbiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIlxcbiAvLyBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4gLy9cXG4gLy8gaWQsc3BlY2llcyxuYW1lXFxuIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4gLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxcbiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXFxuXFxuIHZhciB0YWJsZTtcXG5cXG4gZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXFxcImNzdlxcXCJcXG4gLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXFxuIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xcbiB9XFxuXFxuIGZ1bmN0aW9uIHNldHVwKCkge1xcbiB0YWJsZS5yZW1vdmVDb2x1bW4oJ2lkJyk7XFxuIHByaW50KHRhYmxlLmdldENvbHVtbkNvdW50KCkpO1xcbiB9XFxuIDwvY29kZT5cXG4gPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTQ0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0b3JlcyBhIHZhbHVlIGluIHRoZSBUYWJsZSYjMzk7cyBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4uXFxuVGhlIHJvdyBpcyBzcGVjaWZpZWQgYnkgaXRzIElELCB3aGlsZSB0aGUgY29sdW1uIG1heSBiZSBzcGVjaWZpZWRcXG5ieSBlaXRoZXIgaXRzIElEIG9yIHRpdGxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yb3cgSUQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvbHVtbiBJRCAoTnVtYmVyKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRpdGxlIChTdHJpbmcpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8SW50ZWdlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52YWx1ZSB0byBhc3NpZ248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbi8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcXFwibWFtbWFscy5jc3ZcXFwiXFxuLy8gaW4gdGhlIHByb2plY3QncyBcXFwiYXNzZXRzXFxcIiBmb2xkZXI6XFxuLy9cXG4vLyBpZCxzcGVjaWVzLG5hbWVcXG4vLyAwLENhcHJhIGhpcmN1cyxHb2F0XFxuLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxcbi8vIDIsRXF1dXMgemVicmEsWmVicmFcXG5cXG52YXIgdGFibGU7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFxcXCJjc3ZcXFwiXFxuICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcXG4gIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHRhYmxlLnNldCgwLCAnc3BlY2llcycsICdDYW5pcyBMdXB1cycpO1xcbiAgdGFibGUuc2V0KDAsICduYW1lJywgJ1dvbGYnKTtcXG5cXG4gIC8vcHJpbnQgdGhlIHJlc3VsdHNcXG4gIGZvciAodmFyIHIgPSAwOyByIDwgdGFibGUuZ2V0Um93Q291bnQoKTsgcisrKVxcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IHRhYmxlLmdldENvbHVtbkNvdW50KCk7IGMrKylcXG4gICAgICBwcmludCh0YWJsZS5nZXRTdHJpbmcociwgYykpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTk0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0b3JlcyBhIEZsb2F0IHZhbHVlIGluIHRoZSBUYWJsZSYjMzk7cyBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4uXFxuVGhlIHJvdyBpcyBzcGVjaWZpZWQgYnkgaXRzIElELCB3aGlsZSB0aGUgY29sdW1uIG1heSBiZSBzcGVjaWZpZWRcXG5ieSBlaXRoZXIgaXRzIElEIG9yIHRpdGxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldE51bVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yb3cgSUQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvbHVtbiBJRCAoTnVtYmVyKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRpdGxlIChTdHJpbmcpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8SW50ZWdlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52YWx1ZSB0byBhc3NpZ248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuLy8gR2l2ZW4gdGhlIENTViBmaWxlIFxcXCJtYW1tYWxzLmNzdlxcXCJcXG4vLyBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4vL1xcbi8vIGlkLHNwZWNpZXMsbmFtZVxcbi8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4vLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXFxuLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxcblxcbnZhciB0YWJsZTtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXFxcImNzdlxcXCJcXG4gIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xcbiAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdGFibGUuc2V0TnVtKDEsICdpZCcsIDEpO1xcblxcbiAgcHJpbnQodGFibGUuZ2V0Q29sdW1uKDApKTtcXG4gIC8vW1xcXCIwXFxcIiwgMSwgXFxcIjJcXFwiXVxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTA0MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TdG9yZXMgYSBTdHJpbmcgdmFsdWUgaW4gdGhlIFRhYmxlJiMzOTtzIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbi5cXG5UaGUgcm93IGlzIHNwZWNpZmllZCBieSBpdHMgSUQsIHdoaWxlIHRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZFxcbmJ5IGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0U3RyaW5nXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyb3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnJvdyBJRDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y29sdW1uIElEIChOdW1iZXIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGl0bGUgKFN0cmluZyk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZhbHVlIHRvIGFzc2lnbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj48Y29kZT5cXG4vLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIiBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4vL1xcbi8vIGlkLHNwZWNpZXMsbmFtZVxcbi8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4vLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXFxuLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxcblxcbnZhciB0YWJsZTtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXFxcImNzdlxcXCJcXG4gIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xcbiAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy9hZGQgYSByb3dcXG4gIHZhciBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcXG4gIG5ld1Jvdy5zZXRTdHJpbmcoJ2lkJywgdGFibGUuZ2V0Um93Q291bnQoKSAtIDEpO1xcbiAgbmV3Um93LnNldFN0cmluZygnc3BlY2llcycsICdDYW5pcyBMdXB1cycpO1xcbiAgbmV3Um93LnNldFN0cmluZygnbmFtZScsICdXb2xmJyk7XFxuXFxuICBwcmludCh0YWJsZS5nZXRBcnJheSgpKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UYWJsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwODUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0cmlldmVzIGEgdmFsdWUgZnJvbSB0aGUgVGFibGUmIzM5O3Mgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uLlxcblRoZSByb3cgaXMgc3BlY2lmaWVkIGJ5IGl0cyBJRCwgd2hpbGUgdGhlIGNvbHVtbiBtYXkgYmUgc3BlY2lmaWVkIGJ5XFxuZWl0aGVyIGl0cyBJRCBvciB0aXRsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJvd1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cm93IElEPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb2x1bW5OYW1lIChzdHJpbmcpIG9yXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEIChudW1iZXIpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8SW50ZWdlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfE51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG4vLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIlxcbi8vIGluIHRoZSBwcm9qZWN0J3MgXFxcImFzc2V0c1xcXCIgZm9sZGVyOlxcbi8vXFxuLy8gaWQsc3BlY2llcyxuYW1lXFxuLy8gMCxDYXByYSBoaXJjdXMsR29hdFxcbi8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcXG4vLyAyLEVxdXVzIHplYnJhLFplYnJhXFxuXFxudmFyIHRhYmxlO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcXFwiY3N2XFxcIlxcbiAgLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXFxuICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBwcmludCh0YWJsZS5nZXQoMCwgMSkpO1xcbiAgLy9DYXByYSBoaXJjdXNcXG4gIHByaW50KHRhYmxlLmdldCgwLCAnc3BlY2llcycpKTtcXG4gIC8vQ2FwcmEgaGlyY3VzXFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTMyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHJpZXZlcyBhIEZsb2F0IHZhbHVlIGZyb20gdGhlIFRhYmxlJiMzOTtzIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbi5cXG5UaGUgcm93IGlzIHNwZWNpZmllZCBieSBpdHMgSUQsIHdoaWxlIHRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZCBieVxcbmVpdGhlciBpdHMgSUQgb3IgdGl0bGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0TnVtXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyb3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnJvdyBJRDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y29sdW1uTmFtZSAoc3RyaW5nKSBvclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRCAobnVtYmVyKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfEludGVnZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG4vLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIlxcbi8vIGluIHRoZSBwcm9qZWN0J3MgXFxcImFzc2V0c1xcXCIgZm9sZGVyOlxcbi8vXFxuLy8gaWQsc3BlY2llcyxuYW1lXFxuLy8gMCxDYXByYSBoaXJjdXMsR29hdFxcbi8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcXG4vLyAyLEVxdXVzIHplYnJhLFplYnJhXFxuXFxudmFyIHRhYmxlO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcXFwiY3N2XFxcIlxcbiAgLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXFxuICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBwcmludCh0YWJsZS5nZXROdW0oMSwgMCkgKyAxMDApO1xcbiAgLy9pZCAxICsgMTAwID0gMTAxXFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTc3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHJpZXZlcyBhIFN0cmluZyB2YWx1ZSBmcm9tIHRoZSBUYWJsZSYjMzk7cyBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4uXFxuVGhlIHJvdyBpcyBzcGVjaWZpZWQgYnkgaXRzIElELCB3aGlsZSB0aGUgY29sdW1uIG1heSBiZSBzcGVjaWZpZWQgYnlcXG5laXRoZXIgaXRzIElEIG9yIHRpdGxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldFN0cmluZ1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yb3cgSUQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvbHVtbk5hbWUgKHN0cmluZykgb3JcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgKG51bWJlcik8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuLy8gR2l2ZW4gdGhlIENTViBmaWxlIFxcXCJtYW1tYWxzLmNzdlxcXCJcXG4vLyBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4vL1xcbi8vIGlkLHNwZWNpZXMsbmFtZVxcbi8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4vLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXFxuLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxcblxcbnZhciB0YWJsZTtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgLy8gdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFxcXCJDU1ZcXFwiXFxuICAvLyBhbmQgaGFzIHNwZWNpZml5aW5nIGhlYWRlciBmb3IgY29sdW1uIGxhYmVsc1xcbiAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgcHJpbnQodGFibGUuZ2V0U3RyaW5nKDAsIDApKTsgLy8gMFxcbiAgcHJpbnQodGFibGUuZ2V0U3RyaW5nKDAsIDEpKTsgLy8gQ2FwcmEgaGlyY3VzXFxuICBwcmludCh0YWJsZS5nZXRTdHJpbmcoMCwgMikpOyAvLyBHb2F0XFxuICBwcmludCh0YWJsZS5nZXRTdHJpbmcoMSwgMCkpOyAvLyAxXFxuICBwcmludCh0YWJsZS5nZXRTdHJpbmcoMSwgMSkpOyAvLyBQYW50aGVyYSBwYXJkdXNcXG4gIHByaW50KHRhYmxlLmdldFN0cmluZygxLCAyKSk7IC8vIExlb3BhcmRcXG4gIHByaW50KHRhYmxlLmdldFN0cmluZygyLCAwKSk7IC8vIDJcXG4gIHByaW50KHRhYmxlLmdldFN0cmluZygyLCAxKSk7IC8vIEVxdXVzIHplYnJhXFxuICBwcmludCh0YWJsZS5nZXRTdHJpbmcoMiwgMikpOyAvLyBaZWJyYVxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlRhYmxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTIzMCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXRyaWV2ZXMgYWxsIHRhYmxlIGRhdGEgYW5kIHJldHVybnMgYXMgYW4gb2JqZWN0LiBJZiBhIGNvbHVtbiBuYW1lIGlzXFxucGFzc2VkIGluLCBlYWNoIHJvdyBvYmplY3Qgd2lsbCBiZSBzdG9yZWQgd2l0aCB0aGF0IGF0dHJpYnV0ZSBhcyBpdHNcXG50aXRsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRPYmplY3RcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhlYWRlckNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TmFtZSBvZiB0aGUgY29sdW1uIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSBlYWNoIHJvdyBvYmplY3QgKG9wdGlvbmFsKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG4vLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIlxcbi8vIGluIHRoZSBwcm9qZWN0J3MgXFxcImFzc2V0c1xcXCIgZm9sZGVyOlxcbi8vXFxuLy8gaWQsc3BlY2llcyxuYW1lXFxuLy8gMCxDYXByYSBoaXJjdXMsR29hdFxcbi8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcXG4vLyAyLEVxdXVzIHplYnJhLFplYnJhXFxuXFxudmFyIHRhYmxlO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcXFwiY3N2XFxcIlxcbiAgLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXFxuICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgdGFibGVPYmplY3QgPSB0YWJsZS5nZXRPYmplY3QoKTtcXG5cXG4gIHByaW50KHRhYmxlT2JqZWN0KTtcXG4gIC8vb3V0cHV0cyBhbiBvYmplY3RcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UYWJsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyOTQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0cmlldmVzIGFsbCB0YWJsZSBkYXRhIGFuZCByZXR1cm5zIGl0IGFzIGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRBcnJheVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG4vLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIlxcbi8vIGluIHRoZSBwcm9qZWN0J3MgXFxcImFzc2V0c1xcXCIgZm9sZGVyXFxuLy9cXG4vLyBpZCxzcGVjaWVzLG5hbWVcXG4vLyAwLENhcHJhIGhpcmN1cyxHb2F0XFxuLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGVyZFxcbi8vIDIsRXF1dXMgemVicmEsWmVicmFcXG5cXG52YXIgdGFibGU7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIC8vIHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcXFwiQ1NWXFxcIlxcbiAgLy8gYW5kIGhhcyBzcGVjaWZpeWluZyBoZWFkZXIgZm9yIGNvbHVtbiBsYWJlbHNcXG4gIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciB0YWJsZUFycmF5ID0gdGFibGUuZ2V0QXJyYXkoKTtcXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGFibGVBcnJheS5sZW5ndGg7IGkrKykge1xcbiAgICBwcmludCh0YWJsZUFycmF5W2ldKTtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UYWJsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZVJvdy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0b3JlcyBhIHZhbHVlIGluIHRoZSBUYWJsZVJvdyYjMzk7cyBzcGVjaWZpZWQgY29sdW1uLlxcblRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZCBieSBlaXRoZXIgaXRzIElEIG9yIHRpdGxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db2x1bW4gSUQgKE51bWJlcilcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBUaXRsZSAoU3RyaW5nKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfEludGVnZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHZhbHVlIHRvIGJlIHN0b3JlZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfE51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPjxjb2RlPlxcbiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXFxcIm1hbW1hbHMuY3N2XFxcIiBpbiB0aGUgcHJvamVjdCdzIFxcXCJhc3NldHNcXFwiIGZvbGRlcjpcXG4gLy9cXG4gLy8gaWQsc3BlY2llcyxuYW1lXFxuIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcXG4gLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxcbiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXFxuXFxuIHZhciB0YWJsZTtcXG5cXG4gZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXFxcImNzdlxcXCJcXG4gLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXFxuIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xcbiB9XFxuXFxuIGZ1bmN0aW9uIHNldHVwKCkge1xcbiB2YXIgcm93cyA9IHRhYmxlLmdldFJvd3MoKTtcXG4gZm9yICh2YXIgciA9IDA7IHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XFxuICAgcm93c1tyXS5zZXQoJ25hbWUnLCAnVW5pY29ybicpO1xcbiB9XFxuXFxuIC8vcHJpbnQgdGhlIHJlc3VsdHNcXG4gcHJpbnQodGFibGUuZ2V0QXJyYXkoKSk7XFxuIH1cXG4gPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UYWJsZVJvd1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZVJvdy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TdG9yZXMgYSBGbG9hdCB2YWx1ZSBpbiB0aGUgVGFibGVSb3cmIzM5O3Mgc3BlY2lmaWVkIGNvbHVtbi5cXG5UaGUgY29sdW1uIG1heSBiZSBzcGVjaWZpZWQgYnkgZWl0aGVyIGl0cyBJRCBvciB0aXRsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXROdW1cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29sdW1uIElEIChOdW1iZXIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgVGl0bGUgKFN0cmluZyk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSB2YWx1ZSB0byBiZSBzdG9yZWRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIEZsb2F0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8U3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+PGNvZGU+XFxuIC8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcXFwibWFtbWFscy5jc3ZcXFwiIGluIHRoZSBwcm9qZWN0J3MgXFxcImFzc2V0c1xcXCIgZm9sZGVyOlxcbiAvL1xcbiAvLyBpZCxzcGVjaWVzLG5hbWVcXG4gLy8gMCxDYXByYSBoaXJjdXMsR29hdFxcbiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXFxuIC8vIDIsRXF1dXMgemVicmEsWmVicmFcXG5cXG4gdmFyIHRhYmxlO1xcblxcbiBmdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcXFwiY3N2XFxcIlxcbiAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcXG4gdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XFxuIH1cXG5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuIHZhciByb3dzID0gdGFibGUuZ2V0Um93cygpO1xcbiBmb3IgKHZhciByID0gMDsgciA8IHJvd3MubGVuZ3RoOyByKyspIHtcXG4gICByb3dzW3JdLnNldE51bSgnaWQnLCByICsgMTApO1xcbiB9XFxuXFxuIHByaW50KHRhYmxlLmdldEFycmF5KCkpO1xcbiB9XFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVSb3dcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGVSb3cuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNDgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3RvcmVzIGEgU3RyaW5nIHZhbHVlIGluIHRoZSBUYWJsZVJvdyYjMzk7cyBzcGVjaWZpZWQgY29sdW1uLlxcblRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZCBieSBlaXRoZXIgaXRzIElEIG9yIHRpdGxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFN0cmluZ1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db2x1bW4gSUQgKE51bWJlcilcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBUaXRsZSAoU3RyaW5nKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfEludGVnZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHZhbHVlIHRvIGJlIHN0b3JlZFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgU3RyaW5nPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8TnVtYmVyfEJvb2xlYW58T2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+PGNvZGU+XFxuIC8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcXFwibWFtbWFscy5jc3ZcXFwiIGluIHRoZSBwcm9qZWN0J3MgXFxcImFzc2V0c1xcXCIgZm9sZGVyOlxcbiAvL1xcbiAvLyBpZCxzcGVjaWVzLG5hbWVcXG4gLy8gMCxDYXByYSBoaXJjdXMsR29hdFxcbiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXFxuIC8vIDIsRXF1dXMgemVicmEsWmVicmFcXG5cXG4gdmFyIHRhYmxlO1xcblxcbiBmdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcXFwiY3N2XFxcIlxcbiAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcXG4gdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XFxuIH1cXG5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuIHZhciByb3dzID0gdGFibGUuZ2V0Um93cygpO1xcbiBmb3IgKHZhciByID0gMDsgciA8IHJvd3MubGVuZ3RoOyByKyspIHtcXG4gICB2YXIgbmFtZSA9IHJvd3Nbcl0uZ2V0U3RyaW5nKCduYW1lJyk7XFxuICAgcm93c1tyXS5zZXRTdHJpbmcoJ25hbWUnLCAnQSAnICsgbmFtZSArICcgbmFtZWQgR2VvcmdlJyk7XFxuIH1cXG5cXG4gcHJpbnQodGFibGUuZ2V0QXJyYXkoKSk7XFxuIH1cXG4gPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJubyBpbWFnZSBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5UYWJsZVJvd1wiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5UYWJsZVJvdy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE5MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIHRoZSBUYWJsZVJvdyYjMzk7cyBzcGVjaWZpZWQgY29sdW1uLlxcblRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZCBieSBlaXRoZXIgaXRzIElEIG9yIHRpdGxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb2x1bW5OYW1lIChzdHJpbmcpIG9yXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgKG51bWJlcik8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8TnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj48Y29kZT5cXG4gLy8gR2l2ZW4gdGhlIENTViBmaWxlIFxcXCJtYW1tYWxzLmNzdlxcXCIgaW4gdGhlIHByb2plY3QncyBcXFwiYXNzZXRzXFxcIiBmb2xkZXI6XFxuIC8vXFxuIC8vIGlkLHNwZWNpZXMsbmFtZVxcbiAvLyAwLENhcHJhIGhpcmN1cyxHb2F0XFxuIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcXG4gLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxcblxcbiB2YXIgdGFibGU7XFxuXFxuIGZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFxcXCJjc3ZcXFwiXFxuIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xcbiB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcXG4gfVxcblxcbiBmdW5jdGlvbiBzZXR1cCgpIHtcXG4gdmFyIG5hbWVzID0gW107XFxuIHZhciByb3dzID0gdGFibGUuZ2V0Um93cygpO1xcbiBmb3IgKHZhciByID0gMDsgciA8IHJvd3MubGVuZ3RoOyByKyspIHtcXG4gICBuYW1lcy5wdXNoKHJvd3Nbcl0uZ2V0KCduYW1lJykpO1xcbiB9XFxuXFxuIHByaW50KG5hbWVzKTtcXG4gfVxcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlRhYmxlUm93XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlRhYmxlUm93LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjQxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHJpZXZlcyBhIEZsb2F0IHZhbHVlIGZyb20gdGhlIFRhYmxlUm93JiMzOTtzIHNwZWNpZmllZFxcbmNvbHVtbi4gVGhlIGNvbHVtbiBtYXkgYmUgc3BlY2lmaWVkIGJ5IGVpdGhlciBpdHMgSUQgb3JcXG50aXRsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXROdW1cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y29sdW1uTmFtZSAoc3RyaW5nKSBvclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEIChudW1iZXIpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8SW50ZWdlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiRmxvYXQgRmxvYXRpbmcgcG9pbnQgbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj48Y29kZT5cXG4gLy8gR2l2ZW4gdGhlIENTViBmaWxlIFxcXCJtYW1tYWxzLmNzdlxcXCIgaW4gdGhlIHByb2plY3QncyBcXFwiYXNzZXRzXFxcIiBmb2xkZXI6XFxuIC8vXFxuIC8vIGlkLHNwZWNpZXMsbmFtZVxcbiAvLyAwLENhcHJhIGhpcmN1cyxHb2F0XFxuIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcXG4gLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxcblxcbiB2YXIgdGFibGU7XFxuXFxuIGZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFxcXCJjc3ZcXFwiXFxuIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xcbiB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcXG4gfVxcblxcbiBmdW5jdGlvbiBzZXR1cCgpIHtcXG4gdmFyIHJvd3MgPSB0YWJsZS5nZXRSb3dzKCk7XFxuIHZhciBtaW5JZCA9IEluZmluaXR5O1xcbiB2YXIgbWF4SWQgPSAtSW5maW5pdHk7XFxuIGZvciAodmFyIHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xcbiAgIHZhciBpZCA9IHJvd3Nbcl0uZ2V0TnVtKCdpZCcpO1xcbiAgIG1pbklkID0gbWluKG1pbklkLCBpZCk7XFxuICAgbWF4SWQgPSBtaW4obWF4SWQsIGlkKTtcXG4gfVxcbiBwcmludCgnbWluaW11bSBpZCA9ICcgKyBtaW5JZCArICcsIG1heGltdW0gaWQgPSAnICsgbWF4SWQpO1xcbiB9XFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVSb3dcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuVGFibGVSb3cuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyOTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0cmlldmVzIGFuIFN0cmluZyB2YWx1ZSBmcm9tIHRoZSBUYWJsZVJvdyYjMzk7cyBzcGVjaWZpZWRcXG5jb2x1bW4uIFRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZCBieSBlaXRoZXIgaXRzIElEIG9yXFxudGl0bGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0U3RyaW5nXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvbHVtbk5hbWUgKHN0cmluZykgb3JcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRCAobnVtYmVyKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfEludGVnZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+PGNvZGU+XFxuIC8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcXFwibWFtbWFscy5jc3ZcXFwiIGluIHRoZSBwcm9qZWN0J3MgXFxcImFzc2V0c1xcXCIgZm9sZGVyOlxcbiAvL1xcbiAvLyBpZCxzcGVjaWVzLG5hbWVcXG4gLy8gMCxDYXByYSBoaXJjdXMsR29hdFxcbiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXFxuIC8vIDIsRXF1dXMgemVicmEsWmVicmFcXG5cXG4gdmFyIHRhYmxlO1xcblxcbiBmdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcXFwiY3N2XFxcIlxcbiAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcXG4gdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XFxuIH1cXG5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuIHZhciByb3dzID0gdGFibGUuZ2V0Um93cygpO1xcbiB2YXIgbG9uZ2VzdCA9ICcnO1xcbiBmb3IgKHZhciByID0gMDsgciA8IHJvd3MubGVuZ3RoOyByKyspIHtcXG4gICB2YXIgc3BlY2llcyA9IHJvd3Nbcl0uZ2V0U3RyaW5nKCdzcGVjaWVzJyk7XFxuICAgaWYgKGxvbmdlc3QubGVuZ3RoIDwgc3BlY2llcy5sZW5ndGgpIHtcXG4gICAgIGxvbmdlc3QgPSBzcGVjaWVzO1xcbiAgIH1cXG4gfVxcblxcbiBwcmludCgnbG9uZ2VzdDogJyArIGxvbmdlc3QpO1xcbiB9XFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibm8gaW1hZ2UgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVGFibGVSb3dcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGFibGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuWE1MLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+R2V0cyBhIGNvcHkgb2YgdGhlIGVsZW1lbnQmIzM5O3MgcGFyZW50LiBSZXR1cm5zIHRoZSBwYXJlbnQgYXMgYW5vdGhlclxcbnA1LlhNTCBvYmplY3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0UGFyZW50XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImVsZW1lbnQgcGFyZW50XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuWE1MXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbi8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFxcXCJtYW1tYWxzLnhtbFxcXCIgaXMgcGFyc2VkXFxuLy8gaW4gdGhlIGNvZGUgYmVsb3cuXFxuLy9cXG4vLyA8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiPz5cXG4vLyAmbHQ7bWFtbWFscyZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjBcXFwiIHNwZWNpZXM9XFxcIkNhcHJhIGhpcmN1c1xcXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMVxcXCIgc3BlY2llcz1cXFwiUGFudGhlcmEgcGFyZHVzXFxcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIyXFxcIiBzcGVjaWVzPVxcXCJFcXV1cyB6ZWJyYVxcXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcXG4vLyAmbHQ7L21hbW1hbHMmZ3Q7XFxuXFxudmFyIHhtbDtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGNoaWxkcmVuID0geG1sLmdldENoaWxkcmVuKCdhbmltYWwnKTtcXG4gIHZhciBwYXJlbnQgPSBjaGlsZHJlblsxXS5nZXRQYXJlbnQoKTtcXG4gIHByaW50KHBhcmVudC5nZXROYW1lKCkpO1xcbn1cXG5cXG4vLyBTa2V0Y2ggcHJpbnRzOlxcbi8vIG1hbW1hbHNcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuWE1MXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlhNTFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5YTUwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+R2V0cyB0aGUgZWxlbWVudCYjMzk7cyBmdWxsIG5hbWUsIHdoaWNoIGlzIHJldHVybmVkIGFzIGEgU3RyaW5nLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldE5hbWVcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIG5hbWUgb2YgdGhlIG5vZGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCImbHQ7YW5pbWFsXFxuIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4gLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXFxcIm1hbW1hbHMueG1sXFxcIiBpcyBwYXJzZWRcXG4gLy8gaW4gdGhlIGNvZGUgYmVsb3cuXFxuIC8vXFxuIC8vIDw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCI/PlxcbiAvLyAmbHQ7bWFtbWFscyZndDtcXG4gLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIwXFxcIiBzcGVjaWVzPVxcXCJDYXByYSBoaXJjdXNcXFwiPkdvYXQmbHQ7L2FuaW1hbCZndDtcXG4gLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIxXFxcIiBzcGVjaWVzPVxcXCJQYW50aGVyYSBwYXJkdXNcXFwiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcXG4gLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIyXFxcIiBzcGVjaWVzPVxcXCJFcXV1cyB6ZWJyYVxcXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcXG4gLy8gJmx0Oy9tYW1tYWxzJmd0O1xcblxcbiB2YXIgeG1sO1xcblxcbiBmdW5jdGlvbiBwcmVsb2FkKCkge1xcbiB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcXG4gfVxcblxcbiBmdW5jdGlvbiBzZXR1cCgpIHtcXG4gcHJpbnQoeG1sLmdldE5hbWUoKSk7XFxuIH1cXG5cXG4gLy8gU2tldGNoIHByaW50czpcXG4gLy8gbWFtbWFsc1xcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuWE1MXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlhNTFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5YTUwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMzcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyB0aGUgZWxlbWVudCYjMzk7cyBuYW1lLCB3aGljaCBpcyBzcGVjaWZpZWQgYXMgYSBTdHJpbmcuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0TmFtZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGhlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5uZXcgbmFtZSBvZiB0aGUgbm9kZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIiZsdDthbmltYWxcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXFxcIm1hbW1hbHMueG1sXFxcIiBpcyBwYXJzZWRcXG4vLyBpbiB0aGUgY29kZSBiZWxvdy5cXG4vL1xcbi8vIDw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCI/Plxcbi8vICZsdDttYW1tYWxzJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMFxcXCIgc3BlY2llcz1cXFwiQ2FwcmEgaGlyY3VzXFxcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIxXFxcIiBzcGVjaWVzPVxcXCJQYW50aGVyYSBwYXJkdXNcXFwiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjJcXFwiIHNwZWNpZXM9XFxcIkVxdXVzIHplYnJhXFxcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xcbi8vICZsdDsvbWFtbWFscyZndDtcXG5cXG52YXIgeG1sO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBwcmludCh4bWwuZ2V0TmFtZSgpKTtcXG4gIHhtbC5zZXROYW1lKCdmaXNoJyk7XFxuICBwcmludCh4bWwuZ2V0TmFtZSgpKTtcXG59XFxuXFxuLy8gU2tldGNoIHByaW50czpcXG4vLyBtYW1tYWxzXFxuLy8gZmlzaFxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5YTUxcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiWE1MXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlhNTC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE3NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DaGVja3Mgd2hldGhlciBvciBub3QgdGhlIGVsZW1lbnQgaGFzIGFueSBjaGlsZHJlbiwgYW5kIHJldHVybnMgdGhlIHJlc3VsdFxcbmFzIGEgYm9vbGVhbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJoYXNDaGlsZHJlblwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiJmx0O2FuaW1hbFxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4vLyBUaGUgZm9sbG93aW5nIHNob3J0IFhNTCBmaWxlIGNhbGxlZCBcXFwibWFtbWFscy54bWxcXFwiIGlzIHBhcnNlZFxcbi8vIGluIHRoZSBjb2RlIGJlbG93Llxcbi8vXFxuLy8gPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIj8+XFxuLy8gJmx0O21hbW1hbHMmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIwXFxcIiBzcGVjaWVzPVxcXCJDYXByYSBoaXJjdXNcXFwiPkdvYXQmbHQ7L2FuaW1hbCZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjFcXFwiIHNwZWNpZXM9XFxcIlBhbnRoZXJhIHBhcmR1c1xcXCI+TGVvcGFyZCZsdDsvYW5pbWFsJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMlxcXCIgc3BlY2llcz1cXFwiRXF1dXMgemVicmFcXFwiPlplYnJhJmx0Oy9hbmltYWwmZ3Q7XFxuLy8gJmx0Oy9tYW1tYWxzJmd0O1xcblxcbnZhciB4bWw7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHByaW50KHhtbC5oYXNDaGlsZHJlbigpKTtcXG59XFxuXFxuLy8gU2tldGNoIHByaW50czpcXG4vLyB0cnVlXFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlhNTFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJYTUxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuWE1MLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjExLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldCB0aGUgbmFtZXMgb2YgYWxsIG9mIHRoZSBlbGVtZW50JiMzOTtzIGNoaWxkcmVuLCBhbmQgcmV0dXJucyB0aGUgbmFtZXMgYXMgYW5cXG5hcnJheSBvZiBTdHJpbmdzLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGxvb3BpbmcgdGhyb3VnaCBhbmQgY2FsbGluZyBnZXROYW1lKClcXG5vbiBlYWNoIGNoaWxkIGVsZW1lbnQgaW5kaXZpZHVhbGx5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxpc3RDaGlsZHJlblwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJuYW1lcyBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdbXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIiZsdDthbmltYWxcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXFxcIm1hbW1hbHMueG1sXFxcIiBpcyBwYXJzZWRcXG4vLyBpbiB0aGUgY29kZSBiZWxvdy5cXG4vL1xcbi8vIDw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCI/Plxcbi8vICZsdDttYW1tYWxzJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMFxcXCIgc3BlY2llcz1cXFwiQ2FwcmEgaGlyY3VzXFxcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIxXFxcIiBzcGVjaWVzPVxcXCJQYW50aGVyYSBwYXJkdXNcXFwiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjJcXFwiIHNwZWNpZXM9XFxcIkVxdXVzIHplYnJhXFxcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xcbi8vICZsdDsvbWFtbWFscyZndDtcXG5cXG52YXIgeG1sO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBwcmludCh4bWwubGlzdENoaWxkcmVuKCkpO1xcbn1cXG5cXG4vLyBTa2V0Y2ggcHJpbnRzOlxcbi8vIFtcXFwiYW5pbWFsXFxcIiwgXFxcImFuaW1hbFxcXCIsIFxcXCJhbmltYWxcXFwiXVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5YTUxcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiWE1MXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlhNTC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI1MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIGFsbCBvZiB0aGUgZWxlbWVudCYjMzk7cyBjaGlsZHJlbiBhcyBhbiBhcnJheSBvZiBwNS5YTUwgb2JqZWN0cy4gV2hlblxcbnRoZSBuYW1lIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZW4gaXQgd2lsbCByZXR1cm4gYWxsIGNoaWxkcmVuIHRoYXQgbWF0Y2hcXG50aGF0IG5hbWUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0Q2hpbGRyZW5cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmVsZW1lbnQgbmFtZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImNoaWxkcmVuIG9mIHRoZSBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuWE1MW11cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCImbHQ7YW5pbWFsXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbi8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFxcXCJtYW1tYWxzLnhtbFxcXCIgaXMgcGFyc2VkXFxuLy8gaW4gdGhlIGNvZGUgYmVsb3cuXFxuLy9cXG4vLyA8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiPz5cXG4vLyAmbHQ7bWFtbWFscyZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjBcXFwiIHNwZWNpZXM9XFxcIkNhcHJhIGhpcmN1c1xcXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMVxcXCIgc3BlY2llcz1cXFwiUGFudGhlcmEgcGFyZHVzXFxcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIyXFxcIiBzcGVjaWVzPVxcXCJFcXV1cyB6ZWJyYVxcXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcXG4vLyAmbHQ7L21hbW1hbHMmZ3Q7XFxuXFxudmFyIHhtbDtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGFuaW1hbHMgPSB4bWwuZ2V0Q2hpbGRyZW4oJ2FuaW1hbCcpO1xcblxcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmltYWxzLmxlbmd0aDsgaSsrKSB7XFxuICAgIHByaW50KGFuaW1hbHNbaV0uZ2V0Q29udGVudCgpKTtcXG4gIH1cXG59XFxuXFxuLy8gU2tldGNoIHByaW50czpcXG4vLyBcXFwiR29hdFxcXCJcXG4vLyBcXFwiTGVvcGFyZFxcXCJcXG4vLyBcXFwiWmVicmFcXFwiXFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlhNTFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJYTUxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuWE1MLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzAwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgdGhlIGZpcnN0IG9mIHRoZSBlbGVtZW50JiMzOTtzIGNoaWxkcmVuIHRoYXQgbWF0Y2hlcyB0aGUgbmFtZSBwYXJhbWV0ZXJcXG5vciB0aGUgY2hpbGQgb2YgdGhlIGdpdmVuIGluZGV4Lkl0IHJldHVybnMgdW5kZWZpbmVkIGlmIG5vIG1hdGNoaW5nXFxuY2hpbGQgaXMgZm91bmQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0Q2hpbGRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmVsZW1lbnQgbmFtZSBvciBpbmRleDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfEludGVnZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlhNTFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIiZsdDthbmltYWxcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXFxcIm1hbW1hbHMueG1sXFxcIiBpcyBwYXJzZWRcXG4vLyBpbiB0aGUgY29kZSBiZWxvdy5cXG4vL1xcbi8vIDw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCI/Plxcbi8vICZsdDttYW1tYWxzJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMFxcXCIgc3BlY2llcz1cXFwiQ2FwcmEgaGlyY3VzXFxcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIxXFxcIiBzcGVjaWVzPVxcXCJQYW50aGVyYSBwYXJkdXNcXFwiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjJcXFwiIHNwZWNpZXM9XFxcIkVxdXVzIHplYnJhXFxcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xcbi8vICZsdDsvbWFtbWFscyZndDtcXG5cXG52YXIgeG1sO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgZmlyc3RDaGlsZCA9IHhtbC5nZXRDaGlsZCgnYW5pbWFsJyk7XFxuICBwcmludChmaXJzdENoaWxkLmdldENvbnRlbnQoKSk7XFxufVxcblxcbi8vIFNrZXRjaCBwcmludHM6XFxuLy8gXFxcIkdvYXRcXFwiXFxuPC9jb2RlPjwvZGl2PlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG52YXIgeG1sO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgc2Vjb25kQ2hpbGQgPSB4bWwuZ2V0Q2hpbGQoMSk7XFxuICBwcmludChzZWNvbmRDaGlsZC5nZXRDb250ZW50KCkpO1xcbn1cXG5cXG4vLyBTa2V0Y2ggcHJpbnRzOlxcbi8vIFxcXCJMZW9wYXJkXFxcIlxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5YTUxcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiWE1MXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlhNTC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM2MSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BcHBlbmRzIGEgbmV3IGNoaWxkIHRvIHRoZSBlbGVtZW50LiBUaGUgY2hpbGQgY2FuIGJlIHNwZWNpZmllZCB3aXRoXFxuZWl0aGVyIGEgU3RyaW5nLCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5ldyB0YWcmIzM5O3MgbmFtZSwgb3IgYXMgYVxcbnJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBwNS5YTUwgb2JqZWN0LlxcbkEgcmVmZXJlbmNlIHRvIHRoZSBuZXdseSBjcmVhdGVkIGNoaWxkIGlzIHJldHVybmVkIGFzIGFuIHA1LlhNTCBvYmplY3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWRkQ2hpbGRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vZGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmEgcDUuWE1MIE9iamVjdCB3aGljaCB3aWxsIGJlIHRoZSBjaGlsZCB0byBiZSBhZGRlZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuWE1MXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4vLyBUaGUgZm9sbG93aW5nIHNob3J0IFhNTCBmaWxlIGNhbGxlZCBcXFwibWFtbWFscy54bWxcXFwiIGlzIHBhcnNlZFxcbi8vIGluIHRoZSBjb2RlIGJlbG93Llxcbi8vXFxuLy8gPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIj8+XFxuLy8gJmx0O21hbW1hbHMmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIwXFxcIiBzcGVjaWVzPVxcXCJDYXByYSBoaXJjdXNcXFwiPkdvYXQmbHQ7L2FuaW1hbCZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjFcXFwiIHNwZWNpZXM9XFxcIlBhbnRoZXJhIHBhcmR1c1xcXCI+TGVvcGFyZCZsdDsvYW5pbWFsJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMlxcXCIgc3BlY2llcz1cXFwiRXF1dXMgemVicmFcXFwiPlplYnJhJmx0Oy9hbmltYWwmZ3Q7XFxuLy8gJmx0Oy9tYW1tYWxzJmd0O1xcblxcbnZhciB4bWw7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBjaGlsZCA9IG5ldyBwNS5YTUwoKTtcXG4gIGNoaWxkLnNldEF0dHJpYnV0ZSgnaWQnLCAnMycpO1xcbiAgY2hpbGQuc2V0QXR0cmlidXRlKCdzcGVjaWVzJywgJ09ybml0aG9yaHluY2h1cyBhbmF0aW51cycpO1xcbiAgY2hpbGQuc2V0Q29udGVudCgnUGxhdHlwdXMnKTtcXG4gIHhtbC5hZGRDaGlsZChjaGlsZCk7XFxuXFxuICB2YXIgYW5pbWFscyA9IHhtbC5nZXRDaGlsZHJlbignYW5pbWFsJyk7XFxuICBwcmludChhbmltYWxzW2FuaW1hbHMubGVuZ3RoIC0gMV0uZ2V0Q29udGVudCgpKTtcXG59XFxuXFxuLy8gU2tldGNoIHByaW50czpcXG4vLyBcXFwiR29hdFxcXCJcXG4vLyBcXFwiTGVvcGFyZFxcXCJcXG4vLyBcXFwiWmVicmFcXFwiXFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlhNTFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJYTUxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuWE1MLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDEyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlbW92ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IG5hbWUgb3IgaW5kZXguPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVtb3ZlQ2hpbGRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmVsZW1lbnQgbmFtZSBvciBpbmRleDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfEludGVnZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbi8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFxcXCJtYW1tYWxzLnhtbFxcXCIgaXMgcGFyc2VkXFxuLy8gaW4gdGhlIGNvZGUgYmVsb3cuXFxuLy9cXG4vLyA8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiPz5cXG4vLyAmbHQ7bWFtbWFscyZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjBcXFwiIHNwZWNpZXM9XFxcIkNhcHJhIGhpcmN1c1xcXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMVxcXCIgc3BlY2llcz1cXFwiUGFudGhlcmEgcGFyZHVzXFxcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIyXFxcIiBzcGVjaWVzPVxcXCJFcXV1cyB6ZWJyYVxcXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcXG4vLyAmbHQ7L21hbW1hbHMmZ3Q7XFxuXFxudmFyIHhtbDtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgeG1sLnJlbW92ZUNoaWxkKCdhbmltYWwnKTtcXG4gIHZhciBjaGlsZHJlbiA9IHhtbC5nZXRDaGlsZHJlbigpO1xcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xcbiAgICBwcmludChjaGlsZHJlbltpXS5nZXRDb250ZW50KCkpO1xcbiAgfVxcbn1cXG5cXG4vLyBTa2V0Y2ggcHJpbnRzOlxcbi8vIFxcXCJMZW9wYXJkXFxcIlxcbi8vIFxcXCJaZWJyYVxcXCJcXG48L2NvZGU+PC9kaXY+XFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbnZhciB4bWw7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHhtbC5yZW1vdmVDaGlsZCgxKTtcXG4gIHZhciBjaGlsZHJlbiA9IHhtbC5nZXRDaGlsZHJlbigpO1xcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xcbiAgICBwcmludChjaGlsZHJlbltpXS5nZXRDb250ZW50KCkpO1xcbiAgfVxcbn1cXG5cXG4vLyBTa2V0Y2ggcHJpbnRzOlxcbi8vIFxcXCJHb2F0XFxcIlxcbi8vIFxcXCJaZWJyYVxcXCJcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuWE1MXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlhNTFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5YTUwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0ODQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q291bnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCYjMzk7cyBudW1iZXIgb2YgYXR0cmlidXRlcywgcmV0dXJuZWQgYXMgYW4gTnVtYmVyLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldEF0dHJpYnV0ZUNvdW50XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXFxcIm1hbW1hbHMueG1sXFxcIiBpcyBwYXJzZWRcXG4vLyBpbiB0aGUgY29kZSBiZWxvdy5cXG4vL1xcbi8vIDw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCI/Plxcbi8vICZsdDttYW1tYWxzJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMFxcXCIgc3BlY2llcz1cXFwiQ2FwcmEgaGlyY3VzXFxcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIxXFxcIiBzcGVjaWVzPVxcXCJQYW50aGVyYSBwYXJkdXNcXFwiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjJcXFwiIHNwZWNpZXM9XFxcIkVxdXVzIHplYnJhXFxcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xcbi8vICZsdDsvbWFtbWFscyZndDtcXG5cXG52YXIgeG1sO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgZmlyc3RDaGlsZCA9IHhtbC5nZXRDaGlsZCgnYW5pbWFsJyk7XFxuICBwcmludChmaXJzdENoaWxkLmdldEF0dHJpYnV0ZUNvdW50KCkpO1xcbn1cXG5cXG4vLyBTa2V0Y2ggcHJpbnRzOlxcbi8vIDJcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuWE1MXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlhNTFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5YTUwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MjAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+R2V0cyBhbGwgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50JiMzOTtzIGF0dHJpYnV0ZXMsIGFuZCByZXR1cm5zIHRoZW0gYXMgYW5cXG5hcnJheSBvZiBTdHJpbmdzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxpc3RBdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFuIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYXR0cmlidXRlc1wiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1tdXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbi8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFxcXCJtYW1tYWxzLnhtbFxcXCIgaXMgcGFyc2VkXFxuLy8gaW4gdGhlIGNvZGUgYmVsb3cuXFxuLy9cXG4vLyA8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiPz5cXG4vLyAmbHQ7bWFtbWFscyZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjBcXFwiIHNwZWNpZXM9XFxcIkNhcHJhIGhpcmN1c1xcXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMVxcXCIgc3BlY2llcz1cXFwiUGFudGhlcmEgcGFyZHVzXFxcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIyXFxcIiBzcGVjaWVzPVxcXCJFcXV1cyB6ZWJyYVxcXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcXG4vLyAmbHQ7L21hbW1hbHMmZ3Q7XFxuXFxudmFyIHhtbDtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGZpcnN0Q2hpbGQgPSB4bWwuZ2V0Q2hpbGQoJ2FuaW1hbCcpO1xcbiAgcHJpbnQoZmlyc3RDaGlsZC5saXN0QXR0cmlidXRlcygpKTtcXG59XFxuXFxuLy8gU2tldGNoIHByaW50czpcXG4vLyBbXFxcImlkXFxcIiwgXFxcInNwZWNpZXNcXFwiXVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5YTUxcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiWE1MXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlhNTC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU1NyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DaGVja3Mgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiaGFzQXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmF0dHJpYnV0ZSB0byBiZSBjaGVja2VkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRydWUgaWYgYXR0cmlidXRlIGZvdW5kIGVsc2UgZmFsc2VcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4gLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXFxcIm1hbW1hbHMueG1sXFxcIiBpcyBwYXJzZWRcXG4gLy8gaW4gdGhlIGNvZGUgYmVsb3cuXFxuIC8vXFxuIC8vIDw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCI/PlxcbiAvLyAmbHQ7bWFtbWFscyZndDtcXG4gLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIwXFxcIiBzcGVjaWVzPVxcXCJDYXByYSBoaXJjdXNcXFwiPkdvYXQmbHQ7L2FuaW1hbCZndDtcXG4gLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIxXFxcIiBzcGVjaWVzPVxcXCJQYW50aGVyYSBwYXJkdXNcXFwiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcXG4gLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIyXFxcIiBzcGVjaWVzPVxcXCJFcXV1cyB6ZWJyYVxcXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcXG4gLy8gJmx0Oy9tYW1tYWxzJmd0O1xcblxcbiB2YXIgeG1sO1xcblxcbiBmdW5jdGlvbiBwcmVsb2FkKCkge1xcbiB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcXG4gfVxcblxcbiBmdW5jdGlvbiBzZXR1cCgpIHtcXG4gdmFyIGZpcnN0Q2hpbGQgPSB4bWwuZ2V0Q2hpbGQoJ2FuaW1hbCcpO1xcbiBwcmludChmaXJzdENoaWxkLmhhc0F0dHJpYnV0ZSgnc3BlY2llcycpKTtcXG4gcHJpbnQoZmlyc3RDaGlsZC5oYXNBdHRyaWJ1dGUoJ2NvbG9yJykpO1xcbiB9XFxuXFxuIC8vIFNrZXRjaCBwcmludHM6XFxuIC8vIHRydWVcXG4gLy8gZmFsc2VcXG4gPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlhNTFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJYTUxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuWE1MLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTk2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgYW4gYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFzIGFuIE51bWJlci4gSWYgdGhlIGRlZmF1bHRWYWx1ZVxcbnBhcmFtZXRlciBpcyBzcGVjaWZpZWQgYW5kIHRoZSBhdHRyaWJ1dGUgZG9lc24mIzM5O3QgZXhpc3QsIHRoZW4gZGVmYXVsdFZhbHVlXFxuaXMgcmV0dXJuZWQuIElmIG5vIGRlZmF1bHRWYWx1ZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBhdHRyaWJ1dGUgZG9lc24mIzM5O3RcXG5leGlzdCwgdGhlIHZhbHVlIDAgaXMgcmV0dXJuZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0TnVtXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgbm9uLW51bGwgZnVsbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRlZmF1bHRWYWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4vLyBUaGUgZm9sbG93aW5nIHNob3J0IFhNTCBmaWxlIGNhbGxlZCBcXFwibWFtbWFscy54bWxcXFwiIGlzIHBhcnNlZFxcbi8vIGluIHRoZSBjb2RlIGJlbG93Llxcbi8vXFxuLy8gPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIj8+XFxuLy8gJmx0O21hbW1hbHMmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIwXFxcIiBzcGVjaWVzPVxcXCJDYXByYSBoaXJjdXNcXFwiPkdvYXQmbHQ7L2FuaW1hbCZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjFcXFwiIHNwZWNpZXM9XFxcIlBhbnRoZXJhIHBhcmR1c1xcXCI+TGVvcGFyZCZsdDsvYW5pbWFsJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMlxcXCIgc3BlY2llcz1cXFwiRXF1dXMgemVicmFcXFwiPlplYnJhJmx0Oy9hbmltYWwmZ3Q7XFxuLy8gJmx0Oy9tYW1tYWxzJmd0O1xcblxcbnZhciB4bWw7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBmaXJzdENoaWxkID0geG1sLmdldENoaWxkKCdhbmltYWwnKTtcXG4gIHByaW50KGZpcnN0Q2hpbGQuZ2V0TnVtKCdpZCcpKTtcXG59XFxuXFxuLy8gU2tldGNoIHByaW50czpcXG4vLyAwXFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlhNTFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJYTUxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuWE1MLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjM3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgYW4gYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFzIGFuIFN0cmluZy4gSWYgdGhlIGRlZmF1bHRWYWx1ZVxcbnBhcmFtZXRlciBpcyBzcGVjaWZpZWQgYW5kIHRoZSBhdHRyaWJ1dGUgZG9lc24mIzM5O3QgZXhpc3QsIHRoZW4gZGVmYXVsdFZhbHVlXFxuaXMgcmV0dXJuZWQuIElmIG5vIGRlZmF1bHRWYWx1ZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBhdHRyaWJ1dGUgZG9lc24mIzM5O3RcXG5leGlzdCwgbnVsbCBpcyByZXR1cm5lZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRTdHJpbmdcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBub24tbnVsbCBmdWxsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGVmYXVsdFZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbi8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFxcXCJtYW1tYWxzLnhtbFxcXCIgaXMgcGFyc2VkXFxuLy8gaW4gdGhlIGNvZGUgYmVsb3cuXFxuLy9cXG4vLyA8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiPz5cXG4vLyAmbHQ7bWFtbWFscyZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjBcXFwiIHNwZWNpZXM9XFxcIkNhcHJhIGhpcmN1c1xcXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMVxcXCIgc3BlY2llcz1cXFwiUGFudGhlcmEgcGFyZHVzXFxcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIyXFxcIiBzcGVjaWVzPVxcXCJFcXV1cyB6ZWJyYVxcXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcXG4vLyAmbHQ7L21hbW1hbHMmZ3Q7XFxuXFxudmFyIHhtbDtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGZpcnN0Q2hpbGQgPSB4bWwuZ2V0Q2hpbGQoJ2FuaW1hbCcpO1xcbiAgcHJpbnQoZmlyc3RDaGlsZC5nZXRTdHJpbmcoJ3NwZWNpZXMnKSk7XFxufVxcblxcbi8vIFNrZXRjaCBwcmludHM6XFxuLy8gXFxcIkNhcHJhIGhpcmN1c1xcXCJcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuWE1MXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlhNTFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5YTUwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2NzgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyB0aGUgY29udGVudCBvZiBhbiBlbGVtZW50JiMzOTtzIGF0dHJpYnV0ZS4gVGhlIGZpcnN0IHBhcmFtZXRlciBzcGVjaWZpZXNcXG50aGUgYXR0cmlidXRlIG5hbWUsIHdoaWxlIHRoZSBzZWNvbmQgc3BlY2lmaWVzIHRoZSBuZXcgY29udGVudC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRBdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBmdWxsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8U3RyaW5nfEJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbi8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFxcXCJtYW1tYWxzLnhtbFxcXCIgaXMgcGFyc2VkXFxuLy8gaW4gdGhlIGNvZGUgYmVsb3cuXFxuLy9cXG4vLyA8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiPz5cXG4vLyAmbHQ7bWFtbWFscyZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjBcXFwiIHNwZWNpZXM9XFxcIkNhcHJhIGhpcmN1c1xcXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMVxcXCIgc3BlY2llcz1cXFwiUGFudGhlcmEgcGFyZHVzXFxcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIyXFxcIiBzcGVjaWVzPVxcXCJFcXV1cyB6ZWJyYVxcXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcXG4vLyAmbHQ7L21hbW1hbHMmZ3Q7XFxuXFxudmFyIHhtbDtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGZpcnN0Q2hpbGQgPSB4bWwuZ2V0Q2hpbGQoJ2FuaW1hbCcpO1xcbiAgcHJpbnQoZmlyc3RDaGlsZC5nZXRTdHJpbmcoJ3NwZWNpZXMnKSk7XFxuICBmaXJzdENoaWxkLnNldEF0dHJpYnV0ZSgnc3BlY2llcycsICdKYW1pZGVzIHplYnJhJyk7XFxuICBwcmludChmaXJzdENoaWxkLmdldFN0cmluZygnc3BlY2llcycpKTtcXG59XFxuXFxuLy8gU2tldGNoIHByaW50czpcXG4vLyBcXFwiQ2FwcmEgaGlyY3VzXFxcIlxcbi8vIFxcXCJKYW1pZGVzIHplYnJhXFxcIlxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5YTUxcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiWE1MXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlhNTC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDcyMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIHRoZSBjb250ZW50IG9mIGFuIGVsZW1lbnQuIElmIHRoZXJlIGlzIG5vIHN1Y2ggY29udGVudCxcXG5kZWZhdWx0VmFsdWUgaXMgcmV0dXJuZWQgaWYgc3BlY2lmaWVkLCBvdGhlcndpc2UgbnVsbCBpcyByZXR1cm5lZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRDb250ZW50XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZWZhdWx0VmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZhbHVlIHJldHVybmVkIGlmIG5vIGNvbnRlbnQgaXMgZm91bmQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXFxcIm1hbW1hbHMueG1sXFxcIiBpcyBwYXJzZWRcXG4vLyBpbiB0aGUgY29kZSBiZWxvdy5cXG4vL1xcbi8vIDw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCI/Plxcbi8vICZsdDttYW1tYWxzJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMFxcXCIgc3BlY2llcz1cXFwiQ2FwcmEgaGlyY3VzXFxcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIxXFxcIiBzcGVjaWVzPVxcXCJQYW50aGVyYSBwYXJkdXNcXFwiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjJcXFwiIHNwZWNpZXM9XFxcIkVxdXVzIHplYnJhXFxcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xcbi8vICZsdDsvbWFtbWFscyZndDtcXG5cXG52YXIgeG1sO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgZmlyc3RDaGlsZCA9IHhtbC5nZXRDaGlsZCgnYW5pbWFsJyk7XFxuICBwcmludChmaXJzdENoaWxkLmdldENvbnRlbnQoKSk7XFxufVxcblxcbi8vIFNrZXRjaCBwcmludHM6XFxuLy8gXFxcIkdvYXRcXFwiXFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlhNTFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJYTUxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvaW8vcDUuWE1MLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzU5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldHMgdGhlIGVsZW1lbnQmIzM5O3MgY29udGVudC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRDb250ZW50XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgbmV3IGNvbnRlbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXFxcIm1hbW1hbHMueG1sXFxcIiBpcyBwYXJzZWRcXG4vLyBpbiB0aGUgY29kZSBiZWxvdy5cXG4vL1xcbi8vIDw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCI/Plxcbi8vICZsdDttYW1tYWxzJmd0O1xcbi8vICAgJmx0O2FuaW1hbCBpZD1cXFwiMFxcXCIgc3BlY2llcz1cXFwiQ2FwcmEgaGlyY3VzXFxcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XFxuLy8gICAmbHQ7YW5pbWFsIGlkPVxcXCIxXFxcIiBzcGVjaWVzPVxcXCJQYW50aGVyYSBwYXJkdXNcXFwiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcXG4vLyAgICZsdDthbmltYWwgaWQ9XFxcIjJcXFwiIHNwZWNpZXM9XFxcIkVxdXVzIHplYnJhXFxcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xcbi8vICZsdDsvbWFtbWFscyZndDtcXG5cXG52YXIgeG1sO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgZmlyc3RDaGlsZCA9IHhtbC5nZXRDaGlsZCgnYW5pbWFsJyk7XFxuICBwcmludChmaXJzdENoaWxkLmdldENvbnRlbnQoKSk7XFxuICBmaXJzdENoaWxkLnNldENvbnRlbnQoJ01vdW50YWluIEdvYXQnKTtcXG4gIHByaW50KGZpcnN0Q2hpbGQuZ2V0Q29udGVudCgpKTtcXG59XFxuXFxuLy8gU2tldGNoIHByaW50czpcXG4vLyBcXFwiR29hdFxcXCJcXG4vLyBcXFwiTW91bnRhaW4gR29hdFxcXCJcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuWE1MXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlhNTFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9pby9wNS5YTUwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4MDEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoaWxlIHRoZSBwYXJzaW5nIG9mIFhNTCAod2hlbiBsb2FkWE1MKCkgaXNcXG5jYWxsZWQpLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCB0aGUgc2V0Q29udGVudCgpXFxubWV0aG9kIGRlZmluZWQgbGF0ZXIgaXMgdGhhdCB0aGlzIG9uZSBpcyB1c2VkIHRvIHNldCB0aGUgY29udGVudFxcbndoZW4gdGhlIG5vZGUgaW4gcXVlc3Rpb24gaGFzIG1vcmUgbm9kZXMgdW5kZXIgaXQgYW5kIHNvIG9uIGFuZFxcbm5vdCBkaXJlY3RseSB0ZXh0IGNvbnRlbnQuIFdoaWxlIGluIHRoZSBvdGhlciBvbmUgaXMgdXNlZCB3aGVuXFxudGhlIG5vZGUgaW4gcXVlc3Rpb24gZGlyZWN0bHkgaGFzIHRleHQgaW5zaWRlIGl0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5YTUxcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiWE1MXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL2lvL3A1LlhNTC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgxOCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgdGhlIHBhcnNpbmcgb2YgWE1MICh3aGVuIGxvYWRYTUwoKSBpc1xcbmNhbGxlZCkuIFRoZSBYTUwgbm9kZSBpcyBwYXNzZWQgYW5kIGl0cyBhdHRyaWJ1dGVzIGFyZSBzdG9yZWQgaW4gdGhlXFxucDUuWE1MJiMzOTtzIGF0dHJpYnV0ZSBPYmplY3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlhNTFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJYTUxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9jYWxjdWxhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgdGhlIGFic29sdXRlIHZhbHVlIChtYWduaXR1ZGUpIG9mIGEgbnVtYmVyLiBNYXBzIHRvIE1hdGguYWJzKCkuXFxuVGhlIGFic29sdXRlIHZhbHVlIG9mIGEgbnVtYmVyIGlzIGFsd2F5cyBwb3NpdGl2ZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhYnNcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciB0byBjb21wdXRlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFic29sdXRlIHZhbHVlIG9mIGdpdmVuIG51bWJlclwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3MgPSBcXFwibm9yZW5kZXJcXFwiPjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIHggPSAtMztcXG4gIHZhciB5ID0gYWJzKHgpO1xcblxcbiAgcHJpbnQoeCk7IC8vIC0zXFxuICBwcmludCh5KTsgLy8gM1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm5vIGltYWdlIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ2FsY3VsYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9jYWxjdWxhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgdGhlIGNsb3Nlc3QgaW50IHZhbHVlIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZVxcbnZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuIE1hcHMgdG8gTWF0aC5jZWlsKCkuIEZvciBleGFtcGxlLCBjZWlsKDkuMDMpXFxucmV0dXJucyB0aGUgdmFsdWUgMTAuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2VpbFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIHRvIHJvdW5kIHVwPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInJvdW5kZWQgdXAgbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIC8vIG1hcCwgbW91c2VYIGJldHdlZW4gMCBhbmQgNS5cXG4gIHZhciBheCA9IG1hcChtb3VzZVgsIDAsIDEwMCwgMCwgNSk7XFxuICB2YXIgYXkgPSA2NjtcXG5cXG4gIC8vR2V0IHRoZSBjZWlsaW5nIG9mIHRoZSBtYXBwZWQgbnVtYmVyLlxcbiAgdmFyIGJ4ID0gY2VpbChtYXAobW91c2VYLCAwLCAxMDAsIDAsIDUpKTtcXG4gIHZhciBieSA9IDMzO1xcblxcbiAgLy8gTXVsdGlwbHkgdGhlIG1hcHBlZCBudW1iZXJzIGJ5IDIwIHRvIG1vcmUgZWFzaWx5XFxuICAvLyBzZWUgdGhlIGNoYW5nZXMuXFxuICBzdHJva2UoMCk7XFxuICBmaWxsKDApO1xcbiAgbGluZSgwLCBheSwgYXggKiAyMCwgYXkpO1xcbiAgbGluZSgwLCBieSwgYnggKiAyMCwgYnkpO1xcblxcbiAgLy8gUmVmb3JtYXQgdGhlIGZsb2F0IHJldHVybmVkIGJ5IG1hcCBhbmQgZHJhdyBpdC5cXG4gIG5vU3Ryb2tlKCk7XFxuICB0ZXh0KG5mYyhheCwgMiksIGF4LCBheSAtIDUpO1xcbiAgdGV4dChuZmMoYngsIDEpLCBieCwgYnkgLSA1KTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCIyIGhvcml6b250YWwgbGluZXMgJiBudW1iZXIgc2V0cy4gaW5jcmVhc2Ugd2l0aCBtb3VzZSB4LiBib3R0b20gdG8gMiBkZWNpbWFsc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ2FsY3VsYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9jYWxjdWxhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnN0cmFpbnMgYSB2YWx1ZSBiZXR3ZWVuIGEgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjb25zdHJhaW5cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciB0byBjb25zdHJhaW48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImxvd1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bWluaW11bSBsaW1pdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaGlnaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bWF4aW11bSBsaW1pdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjb25zdHJhaW5lZCBudW1iZXJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuXFxuICB2YXIgbGVmdFdhbGwgPSAyNTtcXG4gIHZhciByaWdodFdhbGwgPSA3NTtcXG5cXG4gIC8vIHhtIGlzIGp1c3QgdGhlIG1vdXNlWCwgd2hpbGVcXG4gIC8vIHhjIGlzIHRoZSBtb3VzZVgsIGJ1dCBjb25zdHJhaW5lZFxcbiAgLy8gYmV0d2VlbiB0aGUgbGVmdFdhbGwgYW5kIHJpZ2h0V2FsbCFcXG4gIHZhciB4bSA9IG1vdXNlWDtcXG4gIHZhciB4YyA9IGNvbnN0cmFpbihtb3VzZVgsIGxlZnRXYWxsLCByaWdodFdhbGwpO1xcblxcbiAgLy8gRHJhdyB0aGUgd2FsbHMuXFxuICBzdHJva2UoMTUwKTtcXG4gIGxpbmUobGVmdFdhbGwsIDAsIGxlZnRXYWxsLCBoZWlnaHQpO1xcbiAgbGluZShyaWdodFdhbGwsIDAsIHJpZ2h0V2FsbCwgaGVpZ2h0KTtcXG5cXG4gIC8vIERyYXcgeG0gYW5kIHhjIGFzIGNpcmNsZXMuXFxuICBub1N0cm9rZSgpO1xcbiAgZmlsbCgxNTApO1xcbiAgZWxsaXBzZSh4bSwgMzMsIDksIDkpOyAvLyBOb3QgQ29uc3RyYWluZWRcXG4gIGZpbGwoMCk7XFxuICBlbGxpcHNlKHhjLCA2NiwgOSwgOSk7IC8vIENvbnN0cmFpbmVkXFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiMiB2ZXJ0aWNhbCBsaW5lcy4gMiBlbGxpcHNlcyBtb3ZlIHdpdGggbW91c2UgWCAxIGRvZXMgbm90IG1vdmUgcGFzc2VkIGxpbmVzXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDYWxjdWxhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL2NhbGN1bGF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTIxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkaXN0XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludHNcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbi8vIE1vdmUgeW91ciBtb3VzZSBpbnNpZGUgdGhlIGNhbnZhcyB0byBzZWUgdGhlXFxuLy8gY2hhbmdlIGluIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cyFcXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgZmlsbCgwKTtcXG5cXG4gIHZhciB4MSA9IDEwO1xcbiAgdmFyIHkxID0gOTA7XFxuICB2YXIgeDIgPSBtb3VzZVg7XFxuICB2YXIgeTIgPSBtb3VzZVk7XFxuXFxuICBsaW5lKHgxLCB5MSwgeDIsIHkyKTtcXG4gIGVsbGlwc2UoeDEsIHkxLCA3LCA3KTtcXG4gIGVsbGlwc2UoeDIsIHkyLCA3LCA3KTtcXG5cXG4gIC8vIGQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbGluZVxcbiAgLy8gdGhlIGRpc3RhbmNlIGZyb20gcG9pbnQgMSB0byBwb2ludCAyLlxcbiAgdmFyIGQgPSBpbnQoZGlzdCh4MSwgeTEsIHgyLCB5MikpO1xcblxcbiAgLy8gTGV0J3Mgd3JpdGUgZCBhbG9uZyB0aGUgbGluZSB3ZSBhcmUgZHJhd2luZyFcXG4gIHB1c2goKTtcXG4gIHRyYW5zbGF0ZSgoeDEgKyB4MikgLyAyLCAoeTEgKyB5MikgLyAyKTtcXG4gIHJvdGF0ZShhdGFuMih5MiAtIHkxLCB4MiAtIHgxKSk7XFxuICB0ZXh0KG5mYyhkLCAxKSwgMCwgLTUpO1xcbiAgcG9wKCk7XFxuICAvLyBGYW5jeSFcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCIyIGVsbGlwc2VzIGpvaW5lZCBieSBsaW5lLiAxIGVsbGlwc2UgbW92ZXMgd2l0aCBtb3VzZSBYJlkuIERpc3RhbmNlIGRpc3BsYXllZC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNhbGN1bGF0aW9uXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTIxLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPngtY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInkyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxNjUsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD56LWNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIngyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInkyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInoyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnotY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9jYWxjdWxhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE5MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIEV1bGVyJiMzOTtzIG51bWJlciBlICgyLjcxODI4Li4uKSByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIHRoZSBuXFxucGFyYW1ldGVyLiBNYXBzIHRvIE1hdGguZXhwKCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXhwXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5leHBvbmVudCB0byByYWlzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJlXm5cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuXFxuICAvLyBDb21wdXRlIHRoZSBleHAoKSBmdW5jdGlvbiB3aXRoIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyXFxuICB2YXIgeFZhbHVlID0gbWFwKG1vdXNlWCwgMCwgd2lkdGgsIDAsIDIpO1xcbiAgdmFyIHlWYWx1ZSA9IGV4cCh4VmFsdWUpO1xcblxcbiAgdmFyIHkgPSBtYXAoeVZhbHVlLCAwLCA4LCBoZWlnaHQsIDApO1xcblxcbiAgdmFyIGxlZ2VuZCA9ICdleHAgKCcgKyBuZmMoeFZhbHVlLCAzKSArICcpXFxcXG49ICcgKyBuZih5VmFsdWUsIDEsIDQpO1xcbiAgc3Ryb2tlKDE1MCk7XFxuICBsaW5lKG1vdXNlWCwgeSwgbW91c2VYLCBoZWlnaHQpO1xcbiAgZmlsbCgwKTtcXG4gIHRleHQobGVnZW5kLCA1LCAxNSk7XFxuICBub1N0cm9rZSgpO1xcbiAgZWxsaXBzZShtb3VzZVgsIHksIDcsIDcpO1xcblxcbiAgLy8gRHJhdyB0aGUgZXhwKHgpIGN1cnZlLFxcbiAgLy8gb3ZlciB0aGUgZG9tYWluIG9mIHggZnJvbSAwIHRvIDJcXG4gIG5vRmlsbCgpO1xcbiAgc3Ryb2tlKDApO1xcbiAgYmVnaW5TaGFwZSgpO1xcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XFxuICAgIHhWYWx1ZSA9IG1hcCh4LCAwLCB3aWR0aCwgMCwgMik7XFxuICAgIHlWYWx1ZSA9IGV4cCh4VmFsdWUpO1xcbiAgICB5ID0gbWFwKHlWYWx1ZSwgMCwgOCwgaGVpZ2h0LCAwKTtcXG4gICAgdmVydGV4KHgsIHkpO1xcbiAgfVxcblxcbiAgZW5kU2hhcGUoKTtcXG4gIGxpbmUoMCwgMCwgMCwgaGVpZ2h0KTtcXG4gIGxpbmUoMCwgaGVpZ2h0IC0gMSwgd2lkdGgsIGhlaWdodCAtIDEpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImVsbGlwc2UgbW92ZXMgYWxvbmcgYSBjdXJ2ZSB3aXRoIG1vdXNlIHguIGVebiBkaXNwbGF5ZWQuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDYWxjdWxhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL2NhbGN1bGF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjQwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgdGhlIGNsb3Nlc3QgaW50IHZhbHVlIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZVxcbnZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuIE1hcHMgdG8gTWF0aC5mbG9vcigpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImZsb29yXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgdG8gcm91bmQgZG93bjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyb3VuZGVkIGRvd24gbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIC8vbWFwLCBtb3VzZVggYmV0d2VlbiAwIGFuZCA1LlxcbiAgdmFyIGF4ID0gbWFwKG1vdXNlWCwgMCwgMTAwLCAwLCA1KTtcXG4gIHZhciBheSA9IDY2O1xcblxcbiAgLy9HZXQgdGhlIGZsb29yIG9mIHRoZSBtYXBwZWQgbnVtYmVyLlxcbiAgdmFyIGJ4ID0gZmxvb3IobWFwKG1vdXNlWCwgMCwgMTAwLCAwLCA1KSk7XFxuICB2YXIgYnkgPSAzMztcXG5cXG4gIC8vIE11bHRpcGx5IHRoZSBtYXBwZWQgbnVtYmVycyBieSAyMCB0byBtb3JlIGVhc2lseVxcbiAgLy8gc2VlIHRoZSBjaGFuZ2VzLlxcbiAgc3Ryb2tlKDApO1xcbiAgZmlsbCgwKTtcXG4gIGxpbmUoMCwgYXksIGF4ICogMjAsIGF5KTtcXG4gIGxpbmUoMCwgYnksIGJ4ICogMjAsIGJ5KTtcXG5cXG4gIC8vIFJlZm9ybWF0IHRoZSBmbG9hdCByZXR1cm5lZCBieSBtYXAgYW5kIGRyYXcgaXQuXFxuICBub1N0cm9rZSgpO1xcbiAgdGV4dChuZmMoYXgsIDIpLCBheCwgYXkgLSA1KTtcXG4gIHRleHQobmZjKGJ4LCAxKSwgYngsIGJ5IC0gNSk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiMiBob3Jpem9udGFsIGxpbmVzICYgbnVtYmVyIHNldHMuIGluY3JlYXNlIHdpdGggbW91c2UgeC4gYm90dG9tIHRvIDIgZGVjaW1hbHNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNhbGN1bGF0aW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvY2FsY3VsYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNzksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2FsY3VsYXRlcyBhIG51bWJlciBiZXR3ZWVuIHR3byBudW1iZXJzIGF0IGEgc3BlY2lmaWMgaW5jcmVtZW50LiBUaGUgYW10XFxucGFyYW1ldGVyIGlzIHRoZSBhbW91bnQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyB3aGVyZSAwLjBcXG5lcXVhbCB0byB0aGUgZmlyc3QgcG9pbnQsIDAuMSBpcyB2ZXJ5IG5lYXIgdGhlIGZpcnN0IHBvaW50LCAwLjUgaXNcXG5oYWxmLXdheSBpbiBiZXR3ZWVuLCBldGMuIFRoZSBsZXJwIGZ1bmN0aW9uIGlzIGNvbnZlbmllbnQgZm9yIGNyZWF0aW5nXFxubW90aW9uIGFsb25nIGEgc3RyYWlnaHQgcGF0aCBhbmQgZm9yIGRyYXdpbmcgZG90dGVkIGxpbmVzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxlcnBcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5maXJzdCB2YWx1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RvcFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c2Vjb25kIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbXRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBiZXR3ZWVuIDAuMCBhbmQgMS4wPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxlcnBlZCB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICB2YXIgYSA9IDIwO1xcbiAgdmFyIGIgPSA4MDtcXG4gIHZhciBjID0gbGVycChhLCBiLCAwLjIpO1xcbiAgdmFyIGQgPSBsZXJwKGEsIGIsIDAuNSk7XFxuICB2YXIgZSA9IGxlcnAoYSwgYiwgMC44KTtcXG5cXG4gIHZhciB5ID0gNTA7XFxuXFxuICBzdHJva2VXZWlnaHQoNSk7XFxuICBzdHJva2UoMCk7IC8vIERyYXcgdGhlIG9yaWdpbmFsIHBvaW50cyBpbiBibGFja1xcbiAgcG9pbnQoYSwgeSk7XFxuICBwb2ludChiLCB5KTtcXG5cXG4gIHN0cm9rZSgxMDApOyAvLyBEcmF3IHRoZSBsZXJwIHBvaW50cyBpbiBncmF5XFxuICBwb2ludChjLCB5KTtcXG4gIHBvaW50KGQsIHkpO1xcbiAgcG9pbnQoZSwgeSk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiNSBwb2ludHMgaG9yaXpvbnRhbGx5IHN0YWdnZXJlZCBtaWQtY2FudmFzLiBtaWQgMyBhcmUgZ3JleSwgb3V0ZXIgYmxhY2tcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNhbGN1bGF0aW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvY2FsY3VsYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzMjQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2FsY3VsYXRlcyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gKHRoZSBiYXNlLWUgbG9nYXJpdGhtKSBvZiBhIG51bWJlci4gVGhpc1xcbmZ1bmN0aW9uIGV4cGVjdHMgdGhlIG4gcGFyYW1ldGVyIHRvIGJlIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAuMC4gTWFwcyB0b1xcbk1hdGgubG9nKCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibG9nXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgZ3JlYXRlciB0aGFuIDA8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmF0dXJhbCBsb2dhcml0aG0gb2YgblwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHZhciBtYXhYID0gMi44O1xcbiAgdmFyIG1heFkgPSAxLjU7XFxuXFxuICAvLyBDb21wdXRlIHRoZSBuYXR1cmFsIGxvZyBvZiBhIHZhbHVlIGJldHdlZW4gMCBhbmQgbWF4WFxcbiAgdmFyIHhWYWx1ZSA9IG1hcChtb3VzZVgsIDAsIHdpZHRoLCAwLCBtYXhYKTtcXG4gIGlmICh4VmFsdWUgPiAwKSB7XFxuICAgLy8gQ2Fubm90IHRha2UgdGhlIGxvZyBvZiBhIG5lZ2F0aXZlIG51bWJlci5cXG4gICAgdmFyIHlWYWx1ZSA9IGxvZyh4VmFsdWUpO1xcbiAgICB2YXIgeSA9IG1hcCh5VmFsdWUsIC1tYXhZLCBtYXhZLCBoZWlnaHQsIDApO1xcblxcbiAgICAvLyBEaXNwbGF5IHRoZSBjYWxjdWxhdGlvbiBvY2N1cnJpbmcuXFxuICAgIHZhciBsZWdlbmQgPSAnbG9nKCcgKyBuZih4VmFsdWUsIDEsIDIpICsgJylcXFxcbj0gJyArIG5mKHlWYWx1ZSwgMSwgMyk7XFxuICAgIHN0cm9rZSgxNTApO1xcbiAgICBsaW5lKG1vdXNlWCwgeSwgbW91c2VYLCBoZWlnaHQpO1xcbiAgICBmaWxsKDApO1xcbiAgICB0ZXh0KGxlZ2VuZCwgNSwgMTUpO1xcbiAgICBub1N0cm9rZSgpO1xcbiAgICBlbGxpcHNlKG1vdXNlWCwgeSwgNywgNyk7XFxuICB9XFxuXFxuICAvLyBEcmF3IHRoZSBsb2coeCkgY3VydmUsXFxuICAvLyBvdmVyIHRoZSBkb21haW4gb2YgeCBmcm9tIDAgdG8gbWF4WFxcbiAgbm9GaWxsKCk7XFxuICBzdHJva2UoMCk7XFxuICBiZWdpblNoYXBlKCk7XFxuICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcXG4gICAgeFZhbHVlID0gbWFwKHgsIDAsIHdpZHRoLCAwLCBtYXhYKTtcXG4gICAgeVZhbHVlID0gbG9nKHhWYWx1ZSk7XFxuICAgIHkgPSBtYXAoeVZhbHVlLCAtbWF4WSwgbWF4WSwgaGVpZ2h0LCAwKTtcXG4gICAgdmVydGV4KHgsIHkpO1xcbiAgfVxcbiAgZW5kU2hhcGUoKTtcXG4gIGxpbmUoMCwgMCwgMCwgaGVpZ2h0KTtcXG4gIGxpbmUoMCwgaGVpZ2h0IC8gMiwgd2lkdGgsIGhlaWdodCAvIDIpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImVsbGlwc2UgbW92ZXMgYWxvbmcgYSBjdXJ2ZSB3aXRoIG1vdXNlIHguIG5hdHVyYWwgbG9nYXJpdGhtIG9mIG4gZGlzcGxheWVkLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ2FsY3VsYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9jYWxjdWxhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM3OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DYWxjdWxhdGVzIHRoZSBtYWduaXR1ZGUgKG9yIGxlbmd0aCkgb2YgYSB2ZWN0b3IuIEEgdmVjdG9yIGlzIGEgZGlyZWN0aW9uXFxuaW4gc3BhY2UgY29tbW9ubHkgdXNlZCBpbiBjb21wdXRlciBncmFwaGljcyBhbmQgbGluZWFyIGFsZ2VicmEuIEJlY2F1c2UgaXRcXG5oYXMgbm8gJnF1b3Q7c3RhcnQmcXVvdDsgcG9zaXRpb24sIHRoZSBtYWduaXR1ZGUgb2YgYSB2ZWN0b3IgY2FuIGJlIHRob3VnaHQgb2YgYXNcXG50aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29vcmRpbmF0ZSAwLDAgdG8gaXRzIHgseSB2YWx1ZS4gVGhlcmVmb3JlLCBtYWcoKSBpc1xcbmEgc2hvcnRjdXQgZm9yIHdyaXRpbmcgZGlzdCgwLCAwLCB4LCB5KS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtYWdcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZpcnN0IHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zZWNvbmQgdmFsdWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibWFnbml0dWRlIG9mIHZlY3RvciBmcm9tICgwLDApIHRvIChhLGIpXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciB4MSA9IDIwO1xcbiAgdmFyIHgyID0gODA7XFxuICB2YXIgeTEgPSAzMDtcXG4gIHZhciB5MiA9IDcwO1xcblxcbiAgbGluZSgwLCAwLCB4MSwgeTEpO1xcbiAgcHJpbnQobWFnKHgxLCB5MSkpOyAvLyBQcmludHMgXFxcIjM2LjA1NTUxMjc1NDYzOTg5XFxcIlxcbiAgbGluZSgwLCAwLCB4MiwgeTEpO1xcbiAgcHJpbnQobWFnKHgyLCB5MSkpOyAvLyBQcmludHMgXFxcIjg1LjQ0MDAzNzQ1MzE3NTMxXFxcIlxcbiAgbGluZSgwLCAwLCB4MSwgeTIpO1xcbiAgcHJpbnQobWFnKHgxLCB5MikpOyAvLyBQcmludHMgXFxcIjcyLjgwMTA5ODg5MjgwNTE5XFxcIlxcbiAgbGluZSgwLCAwLCB4MiwgeTIpO1xcbiAgcHJpbnQobWFnKHgyLCB5MikpOyAvLyBQcmludHMgXFxcIjEwNi4zMDE0NTgxMjczNDY1XFxcIlxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjQgbGluZXMgb2YgZGlmZmVyZW50IGxlbmd0aCByYWRpYXRlIGZyb20gdG9wIGxlZnQgb2YgY2FudmFzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ2FsY3VsYXRpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9jYWxjdWxhdGlvbi5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQxOCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZS1tYXBzIGEgbnVtYmVyIGZyb20gb25lIHJhbmdlIHRvIGFub3RoZXIuXFxuPGJyPjxicj5cXG5JbiB0aGUgZmlyc3QgZXhhbXBsZSBhYm92ZSwgdGhlIG51bWJlciAyNSBpcyBjb252ZXJ0ZWQgZnJvbSBhIHZhbHVlIGluIHRoZVxcbnJhbmdlIG9mIDAgdG8gMTAwIGludG8gYSB2YWx1ZSB0aGF0IHJhbmdlcyBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlXFxud2luZG93ICgwKSB0byB0aGUgcmlnaHQgZWRnZSAod2lkdGgpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1hcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBpbmNvbWluZyB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0YXJ0MVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bG93ZXIgYm91bmQgb2YgdGhlIHZhbHVlJiMzOTtzIGN1cnJlbnQgcmFuZ2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0b3AxXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD51cHBlciBib3VuZCBvZiB0aGUgdmFsdWUmIzM5O3MgY3VycmVudCByYW5nZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RhcnQyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5sb3dlciBib3VuZCBvZiB0aGUgdmFsdWUmIzM5O3MgdGFyZ2V0IHJhbmdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdG9wMlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dXBwZXIgYm91bmQgb2YgdGhlIHZhbHVlJiMzOTtzIHRhcmdldCByYW5nZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid2l0aGluQm91bmRzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb25zdHJhaW4gdGhlIHZhbHVlIHRvIHRoZSBuZXdseSBtYXBwZWQgcmFuZ2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicmVtYXBwZWQgbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuICA8ZGl2Pjxjb2RlPlxcbnZhciB2YWx1ZSA9IDI1O1xcbnZhciBtID0gbWFwKHZhbHVlLCAwLCAxMDAsIDAsIHdpZHRoKTtcXG5lbGxpcHNlKG0sIDUwLCAxMCwgMTApO1xcbjwvY29kZT48L2Rpdj5cXG5cXG4gIDxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBub1N0cm9rZSgpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDQpO1xcbiAgdmFyIHgxID0gbWFwKG1vdXNlWCwgMCwgd2lkdGgsIDI1LCA3NSk7XFxuICBlbGxpcHNlKHgxLCAyNSwgMjUsIDI1KTtcXG4gIC8vVGhpcyBlbGxpcHNlIGlzIGNvbnN0cmFpbmVkIHRvIHRoZSAwLTEwMCByYW5nZVxcbiAgLy9hZnRlciBzZXR0aW5nIHdpdGhpbkJvdW5kcyB0byB0cnVlXFxuICB2YXIgeDIgPSBtYXAobW91c2VYLCAwLCB3aWR0aCwgMCwgMTAwLCB0cnVlKTtcXG4gIGVsbGlwc2UoeDIsIDc1LCAyNSwgMjUpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjEwIGJ5IDEwIHdoaXRlIGVsbGlwc2Ugd2l0aCBpbiBtaWQgbGVmdCBjYW52YXNcXG4yIDI1IGJ5IDI1IHdoaXRlIGVsbGlwc2VzIG1vdmUgd2l0aCBtb3VzZSB4LiBCb3R0b20gaGFzIG1vcmUgcmFuZ2UgZnJvbSBYXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDYWxjdWxhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL2NhbGN1bGF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDc0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRldGVybWluZXMgdGhlIGxhcmdlc3QgdmFsdWUgaW4gYSBzZXF1ZW5jZSBvZiBudW1iZXJzLCBhbmQgdGhlbiByZXR1cm5zXFxudGhhdCB2YWx1ZS4gbWF4KCkgYWNjZXB0cyBhbnkgbnVtYmVyIG9mIE51bWJlciBwYXJhbWV0ZXJzLCBvciBhbiBBcnJheVxcbm9mIGFueSBsZW5ndGguPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibWF4XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm1heGltdW0gTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIC8vIENoYW5nZSB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IGFuZCBydW4gdGhlIHNrZXRjaFxcbiAgLy8gdG8gc2hvdyBob3cgbWF4KCkgd29ya3MhXFxuICB2YXIgbnVtQXJyYXkgPSBbMiwgMSwgNSwgNCwgOCwgOV07XFxuICBmaWxsKDApO1xcbiAgbm9TdHJva2UoKTtcXG4gIHRleHQoJ0FycmF5IEVsZW1lbnRzJywgMCwgMTApO1xcbiAgLy8gRHJhdyBhbGwgbnVtYmVycyBpbiB0aGUgYXJyYXlcXG4gIHZhciBzcGFjaW5nID0gMTU7XFxuICB2YXIgZWxlbXNZID0gMjU7XFxuICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUFycmF5Lmxlbmd0aDsgaSsrKSB7XFxuICAgIHRleHQobnVtQXJyYXlbaV0sIGkgKiBzcGFjaW5nLCBlbGVtc1kpO1xcbiAgfVxcbiAgdmFyIG1heFggPSAzMztcXG4gIHZhciBtYXhZID0gODA7XFxuICAvLyBEcmF3IHRoZSBNYXhpbXVtIHZhbHVlIGluIHRoZSBhcnJheS5cXG4gIHRleHRTaXplKDMyKTtcXG4gIHRleHQobWF4KG51bUFycmF5KSwgbWF4WCwgbWF4WSk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiU21hbGwgdGV4dCBhdCB0b3AgcmVhZHM6IEFycmF5IEVsZW1lbnRzIDIgMSA1IDQgOCA5LiBMYXJnZSB0ZXh0IGF0IGNlbnRlcjogOVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ2FsY3VsYXRpb25cIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA0NzQsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OdW1iZXIgdG8gY29tcGFyZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OdW1iZXIgdG8gY29tcGFyZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibWF4aW11bSBOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDUxMCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm51bXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TnVtYmVycyB0byBjb21wYXJlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcltdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvY2FsY3VsYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MjQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RGV0ZXJtaW5lcyB0aGUgc21hbGxlc3QgdmFsdWUgaW4gYSBzZXF1ZW5jZSBvZiBudW1iZXJzLCBhbmQgdGhlbiByZXR1cm5zXFxudGhhdCB2YWx1ZS4gbWluKCkgYWNjZXB0cyBhbnkgbnVtYmVyIG9mIE51bWJlciBwYXJhbWV0ZXJzLCBvciBhbiBBcnJheVxcbm9mIGFueSBsZW5ndGguPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibWluXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm1pbmltdW0gTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIC8vIENoYW5nZSB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IGFuZCBydW4gdGhlIHNrZXRjaFxcbiAgLy8gdG8gc2hvdyBob3cgbWluKCkgd29ya3MhXFxuICB2YXIgbnVtQXJyYXkgPSBbMiwgMSwgNSwgNCwgOCwgOV07XFxuICBmaWxsKDApO1xcbiAgbm9TdHJva2UoKTtcXG4gIHRleHQoJ0FycmF5IEVsZW1lbnRzJywgMCwgMTApO1xcbiAgLy8gRHJhdyBhbGwgbnVtYmVycyBpbiB0aGUgYXJyYXlcXG4gIHZhciBzcGFjaW5nID0gMTU7XFxuICB2YXIgZWxlbXNZID0gMjU7XFxuICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUFycmF5Lmxlbmd0aDsgaSsrKSB7XFxuICAgIHRleHQobnVtQXJyYXlbaV0sIGkgKiBzcGFjaW5nLCBlbGVtc1kpO1xcbiAgfVxcbiAgdmFyIG1heFggPSAzMztcXG4gIHZhciBtYXhZID0gODA7XFxuICAvLyBEcmF3IHRoZSBNaW5pbXVtIHZhbHVlIGluIHRoZSBhcnJheS5cXG4gIHRleHRTaXplKDMyKTtcXG4gIHRleHQobWluKG51bUFycmF5KSwgbWF4WCwgbWF4WSk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiU21hbGwgdGV4dCBhdCB0b3AgcmVhZHM6IEFycmF5IEVsZW1lbnRzIDIgMSA1IDQgOCA5LiBMYXJnZSB0ZXh0IGF0IGNlbnRlcjogMVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ2FsY3VsYXRpb25cIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA1MjQsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OdW1iZXIgdG8gY29tcGFyZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OdW1iZXIgdG8gY29tcGFyZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibWluaW11bSBOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDU2MCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm51bXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TnVtYmVycyB0byBjb21wYXJlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcltdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvY2FsY3VsYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1NzQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Tm9ybWFsaXplcyBhIG51bWJlciBmcm9tIGFub3RoZXIgcmFuZ2UgaW50byBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cXG5JZGVudGljYWwgdG8gbWFwKHZhbHVlLCBsb3csIGhpZ2gsIDAsIDEpLlxcbk51bWJlcnMgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgYXJlIG5vdCBjbGFtcGVkIHRvIDAgYW5kIDEsIGJlY2F1c2VcXG5vdXQtb2YtcmFuZ2UgdmFsdWVzIGFyZSBvZnRlbiBpbnRlbnRpb25hbCBhbmQgdXNlZnVsLiAoU2VlIHRoZSBzZWNvbmRcXG5leGFtcGxlIGFib3ZlLik8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJub3JtXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5jb21pbmcgdmFsdWUgdG8gYmUgbm9ybWFsaXplZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmxvd2VyIGJvdW5kIG9mIHRoZSB2YWx1ZSYjMzk7cyBjdXJyZW50IHJhbmdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdG9wXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD51cHBlciBib3VuZCBvZiB0aGUgdmFsdWUmIzM5O3MgY3VycmVudCByYW5nZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJub3JtYWxpemVkIG51bWJlclwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHZhciBjdXJyZW50TnVtID0gbW91c2VYO1xcbiAgdmFyIGxvd2VyQm91bmQgPSAwO1xcbiAgdmFyIHVwcGVyQm91bmQgPSB3aWR0aDsgLy8xMDA7XFxuICB2YXIgbm9ybWFsaXplZCA9IG5vcm0oY3VycmVudE51bSwgbG93ZXJCb3VuZCwgdXBwZXJCb3VuZCk7XFxuICB2YXIgbGluZVkgPSA3MDtcXG4gIGxpbmUoMCwgbGluZVksIHdpZHRoLCBsaW5lWSk7XFxuICAvL0RyYXcgYW4gZWxsaXBzZSBtYXBwZWQgdG8gdGhlIG5vbi1ub3JtYWxpemVkIHZhbHVlLlxcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoNTApO1xcbiAgdmFyIHMgPSA3OyAvLyBlbGxpcHNlIHNpemVcXG4gIGVsbGlwc2UoY3VycmVudE51bSwgbGluZVksIHMsIHMpO1xcblxcbiAgLy8gRHJhdyB0aGUgZ3VpZGVcXG4gIHZhciBndWlkZVkgPSBsaW5lWSArIDE1O1xcbiAgdGV4dCgnMCcsIDAsIGd1aWRlWSk7XFxuICB0ZXh0QWxpZ24oUklHSFQpO1xcbiAgdGV4dCgnMTAwJywgd2lkdGgsIGd1aWRlWSk7XFxuXFxuICAvLyBEcmF3IHRoZSBub3JtYWxpemVkIHZhbHVlXFxuICB0ZXh0QWxpZ24oTEVGVCk7XFxuICBmaWxsKDApO1xcbiAgdGV4dFNpemUoMzIpO1xcbiAgdmFyIG5vcm1hbFkgPSA0MDtcXG4gIHZhciBub3JtYWxYID0gMjA7XFxuICB0ZXh0KG5vcm1hbGl6ZWQsIG5vcm1hbFgsIG5vcm1hbFkpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImVsbGlwc2UgbW92ZXMgd2l0aCBtb3VzZS4gMCBzaG93biBsZWZ0ICYgMTAwIHJpZ2h0IGFuZCB1cGRhdGluZyB2YWx1ZXMgY2VudGVyXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDYWxjdWxhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL2NhbGN1bGF0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjI3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkZhY2lsaXRhdGVzIGV4cG9uZW50aWFsIGV4cHJlc3Npb25zLiBUaGUgcG93KCkgZnVuY3Rpb24gaXMgYW4gZWZmaWNpZW50XFxud2F5IG9mIG11bHRpcGx5aW5nIG51bWJlcnMgYnkgdGhlbXNlbHZlcyAob3IgdGhlaXIgcmVjaXByb2NhbHMpIGluIGxhcmdlXFxucXVhbnRpdGllcy4gRm9yIGV4YW1wbGUsIHBvdygzLCA1KSBpcyBlcXVpdmFsZW50IHRvIHRoZSBleHByZXNzaW9uXFxuMzxlbT4zPC9lbT4zPGVtPjM8L2VtPjMgYW5kIHBvdygzLCAtNSkgaXMgZXF1aXZhbGVudCB0byAxIC8gMzxlbT4zPC9lbT4zPGVtPjM8L2VtPjMuIE1hcHMgdG9cXG5NYXRoLnBvdygpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBvd1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YmFzZSBvZiB0aGUgZXhwb25lbnRpYWwgZXhwcmVzc2lvbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cG93ZXIgYnkgd2hpY2ggdG8gcmFpc2UgdGhlIGJhc2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibl5lXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIC8vRXhwb25lbnRpYWxseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiBhbiBlbGxpcHNlLlxcbiAgdmFyIGVTaXplID0gMzsgLy8gT3JpZ2luYWwgU2l6ZVxcbiAgdmFyIGVMb2MgPSAxMDsgLy8gT3JpZ2luYWwgTG9jYXRpb25cXG5cXG4gIGVsbGlwc2UoZUxvYywgZUxvYywgZVNpemUsIGVTaXplKTtcXG5cXG4gIGVsbGlwc2UoZUxvYyAqIDIsIGVMb2MgKiAyLCBwb3coZVNpemUsIDIpLCBwb3coZVNpemUsIDIpKTtcXG5cXG4gIGVsbGlwc2UoZUxvYyAqIDQsIGVMb2MgKiA0LCBwb3coZVNpemUsIDMpLCBwb3coZVNpemUsIDMpKTtcXG5cXG4gIGVsbGlwc2UoZUxvYyAqIDgsIGVMb2MgKiA4LCBwb3coZVNpemUsIDQpLCBwb3coZVNpemUsIDQpKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJzbWFsbCB0byBsYXJnZSBlbGxpcHNlcyByYWRpYXRpbmcgZnJvbSB0b3AgbGVmdCBvZiBjYW52YXNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNhbGN1bGF0aW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvY2FsY3VsYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2NjEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2FsY3VsYXRlcyB0aGUgaW50ZWdlciBjbG9zZXN0IHRvIHRoZSBuIHBhcmFtZXRlci4gRm9yIGV4YW1wbGUsXFxucm91bmQoMTMzLjgpIHJldHVybnMgdGhlIHZhbHVlIDEzNC4gTWFwcyB0byBNYXRoLnJvdW5kKCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicm91bmRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciB0byByb3VuZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyb3VuZGVkIG51bWJlclwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICAvL21hcCwgbW91c2VYIGJldHdlZW4gMCBhbmQgNS5cXG4gIHZhciBheCA9IG1hcChtb3VzZVgsIDAsIDEwMCwgMCwgNSk7XFxuICB2YXIgYXkgPSA2NjtcXG5cXG4gIC8vIFJvdW5kIHRoZSBtYXBwZWQgbnVtYmVyLlxcbiAgdmFyIGJ4ID0gcm91bmQobWFwKG1vdXNlWCwgMCwgMTAwLCAwLCA1KSk7XFxuICB2YXIgYnkgPSAzMztcXG5cXG4gIC8vIE11bHRpcGx5IHRoZSBtYXBwZWQgbnVtYmVycyBieSAyMCB0byBtb3JlIGVhc2lseVxcbiAgLy8gc2VlIHRoZSBjaGFuZ2VzLlxcbiAgc3Ryb2tlKDApO1xcbiAgZmlsbCgwKTtcXG4gIGxpbmUoMCwgYXksIGF4ICogMjAsIGF5KTtcXG4gIGxpbmUoMCwgYnksIGJ4ICogMjAsIGJ5KTtcXG5cXG4gIC8vIFJlZm9ybWF0IHRoZSBmbG9hdCByZXR1cm5lZCBieSBtYXAgYW5kIGRyYXcgaXQuXFxuICBub1N0cm9rZSgpO1xcbiAgdGV4dChuZmMoYXgsIDIpLCBheCwgYXkgLSA1KTtcXG4gIHRleHQobmZjKGJ4LCAxKSwgYngsIGJ5IC0gNSk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiaG9yaXpvbnRhbCBjZW50ZXIgbGluZSBzcXVhcmVkIHZhbHVlcyBkaXNwbGF5ZWQgb24gdG9wIGFuZCByZWd1bGFyIG9uIGJvdHRvbS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNhbGN1bGF0aW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvY2FsY3VsYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3MDAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3F1YXJlcyBhIG51bWJlciAobXVsdGlwbGllcyBhIG51bWJlciBieSBpdHNlbGYpLiBUaGUgcmVzdWx0IGlzIGFsd2F5cyBhXFxucG9zaXRpdmUgbnVtYmVyLCBhcyBtdWx0aXBseWluZyB0d28gbmVnYXRpdmUgbnVtYmVycyBhbHdheXMgeWllbGRzIGFcXG5wb3NpdGl2ZSByZXN1bHQuIEZvciBleGFtcGxlLCAtMSAqIC0xID0gMS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIHRvIHNxdWFyZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzcXVhcmVkIG51bWJlclwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHZhciBlU2l6ZSA9IDc7XFxuICB2YXIgeDEgPSBtYXAobW91c2VYLCAwLCB3aWR0aCwgMCwgMTApO1xcbiAgdmFyIHkxID0gODA7XFxuICB2YXIgeDIgPSBzcSh4MSk7XFxuICB2YXIgeTIgPSAyMDtcXG5cXG4gIC8vIERyYXcgdGhlIG5vbi1zcXVhcmVkLlxcbiAgbGluZSgwLCB5MSwgd2lkdGgsIHkxKTtcXG4gIGVsbGlwc2UoeDEsIHkxLCBlU2l6ZSwgZVNpemUpO1xcblxcbiAgLy8gRHJhdyB0aGUgc3F1YXJlZC5cXG4gIGxpbmUoMCwgeTIsIHdpZHRoLCB5Mik7XFxuICBlbGxpcHNlKHgyLCB5MiwgZVNpemUsIGVTaXplKTtcXG5cXG4gIC8vIERyYXcgZGl2aWRpbmcgbGluZS5cXG4gIHN0cm9rZSgxMDApO1xcbiAgbGluZSgwLCBoZWlnaHQgLyAyLCB3aWR0aCwgaGVpZ2h0IC8gMik7XFxuXFxuICAvLyBEcmF3IHRleHQuXFxuICB2YXIgc3BhY2luZyA9IDE1O1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMCk7XFxuICB0ZXh0KCd4ID0gJyArIHgxLCAwLCB5MSArIHNwYWNpbmcpO1xcbiAgdGV4dCgnc3EoeCkgPSAnICsgeDIsIDAsIHkyICsgc3BhY2luZyk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiaG9yaXpvbnRhbCBjZW50ZXIgbGluZSBzcXVhcmVkIHZhbHVlcyBkaXNwbGF5ZWQgb24gdG9wIGFuZCByZWd1bGFyIG9uIGJvdHRvbS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNhbGN1bGF0aW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvY2FsY3VsYXRpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3NDcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2FsY3VsYXRlcyB0aGUgc3F1YXJlIHJvb3Qgb2YgYSBudW1iZXIuIFRoZSBzcXVhcmUgcm9vdCBvZiBhIG51bWJlciBpc1xcbmFsd2F5cyBwb3NpdGl2ZSwgZXZlbiB0aG91Z2ggdGhlcmUgbWF5IGJlIGEgdmFsaWQgbmVnYXRpdmUgcm9vdC4gVGhlXFxuc3F1YXJlIHJvb3QgcyBvZiBudW1iZXIgYSBpcyBzdWNoIHRoYXQgcypzID0gYS4gSXQgaXMgdGhlIG9wcG9zaXRlIG9mXFxuc3F1YXJpbmcuIE1hcHMgdG8gTWF0aC5zcXJ0KCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3FydFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bm9uLW5lZ2F0aXZlIG51bWJlciB0byBzcXVhcmUgcm9vdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzcXVhcmUgcm9vdCBvZiBudW1iZXJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICB2YXIgZVNpemUgPSA3O1xcbiAgdmFyIHgxID0gbW91c2VYO1xcbiAgdmFyIHkxID0gODA7XFxuICB2YXIgeDIgPSBzcXJ0KHgxKTtcXG4gIHZhciB5MiA9IDIwO1xcblxcbiAgLy8gRHJhdyB0aGUgbm9uLXNxdWFyZWQuXFxuICBsaW5lKDAsIHkxLCB3aWR0aCwgeTEpO1xcbiAgZWxsaXBzZSh4MSwgeTEsIGVTaXplLCBlU2l6ZSk7XFxuXFxuICAvLyBEcmF3IHRoZSBzcXVhcmVkLlxcbiAgbGluZSgwLCB5Miwgd2lkdGgsIHkyKTtcXG4gIGVsbGlwc2UoeDIsIHkyLCBlU2l6ZSwgZVNpemUpO1xcblxcbiAgLy8gRHJhdyBkaXZpZGluZyBsaW5lLlxcbiAgc3Ryb2tlKDEwMCk7XFxuICBsaW5lKDAsIGhlaWdodCAvIDIsIHdpZHRoLCBoZWlnaHQgLyAyKTtcXG5cXG4gIC8vIERyYXcgdGV4dC5cXG4gIG5vU3Ryb2tlKCk7XFxuICBmaWxsKDApO1xcbiAgdmFyIHNwYWNpbmcgPSAxNTtcXG4gIHRleHQoJ3ggPSAnICsgeDEsIDAsIHkxICsgc3BhY2luZyk7XFxuICB0ZXh0KCdzcXJ0KHgpID0gJyArIHgyLCAwLCB5MiArIHNwYWNpbmcpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImhvcml6b250YWwgY2VudGVyIGxpbmUgc3F1YXJlcm9vdCB2YWx1ZXMgZGlzcGxheWVkIG9uIHRvcCBhbmQgcmVndWxhciBvbiBib3R0b20uXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDYWxjdWxhdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL21hdGguanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DcmVhdGVzIGEgbmV3IHA1LlZlY3RvciAodGhlIGRhdGF0eXBlIGZvciBzdG9yaW5nIHZlY3RvcnMpLiBUaGlzIHByb3ZpZGVzIGFcXG50d28gb3IgdGhyZWUgZGltZW5zaW9uYWwgdmVjdG9yLCBzcGVjaWZpY2FsbHkgYSBFdWNsaWRlYW4gKGFsc28ga25vd24gYXNcXG5nZW9tZXRyaWMpIHZlY3Rvci4gQSB2ZWN0b3IgaXMgYW4gZW50aXR5IHRoYXQgaGFzIGJvdGggbWFnbml0dWRlIGFuZFxcbmRpcmVjdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVWZWN0b3JcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eSBjb21wb25lbnQgb2YgdGhlIHZlY3RvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD56IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBtb2Rlcm5penI9J3dlYmdsJz48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMjU1LCAxMDIsIDIwNCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDI1NSk7XFxuICBwb2ludExpZ2h0KGNvbG9yKDI1NSksIGNyZWF0ZVZlY3RvcihzaW4obWlsbGlzKCkgLyAxMDAwKSAqIDIwLCAtNDAsIC0xMCkpO1xcbiAgc2NhbGUoMC43NSk7XFxuICBzcGhlcmUoKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJhIHB1cnBsZSBzcGhlcmUgbGl0IGJ5IGEgcG9pbnQgbGlnaHQgb3NjaWxsYXRpbmcgaG9yaXpvbnRhbGx5XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvbm9pc2UuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIHRoZSBQZXJsaW4gbm9pc2UgdmFsdWUgYXQgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLiBQZXJsaW4gbm9pc2UgaXNcXG5hIHJhbmRvbSBzZXF1ZW5jZSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgbW9yZSBuYXR1cmFsIG9yZGVyZWQsIGhhcm1vbmljXFxuc3VjY2Vzc2lvbiBvZiBudW1iZXJzIGNvbXBhcmVkIHRvIHRoZSBzdGFuZGFyZCA8Yj5yYW5kb20oKTwvYj4gZnVuY3Rpb24uXFxuSXQgd2FzIGludmVudGVkIGJ5IEtlbiBQZXJsaW4gaW4gdGhlIDE5ODBzIGFuZCBiZWVuIHVzZWQgc2luY2UgaW5cXG5ncmFwaGljYWwgYXBwbGljYXRpb25zIHRvIHByb2R1Y2UgcHJvY2VkdXJhbCB0ZXh0dXJlcywgbmF0dXJhbCBtb3Rpb24sXFxuc2hhcGVzLCB0ZXJyYWlucyBldGMuPGJyIC8+PGJyIC8+IFRoZSBtYWluIGRpZmZlcmVuY2UgdG8gdGhlXFxuPGI+cmFuZG9tKCk8L2I+IGZ1bmN0aW9uIGlzIHRoYXQgUGVybGluIG5vaXNlIGlzIGRlZmluZWQgaW4gYW4gaW5maW5pdGVcXG5uLWRpbWVuc2lvbmFsIHNwYWNlIHdoZXJlIGVhY2ggcGFpciBvZiBjb29yZGluYXRlcyBjb3JyZXNwb25kcyB0byBhXFxuZml4ZWQgc2VtaS1yYW5kb20gdmFsdWUgKGZpeGVkIG9ubHkgZm9yIHRoZSBsaWZlc3BhbiBvZiB0aGUgcHJvZ3JhbTsgc2VlXFxudGhlIG5vaXNlU2VlZCgpIGZ1bmN0aW9uKS4gcDUuanMgY2FuIGNvbXB1dGUgMUQsIDJEIGFuZCAzRCBub2lzZSxcXG5kZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBnaXZlbi4gVGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsXFxuYWx3YXlzIGJlIGJldHdlZW4gMC4wIGFuZCAxLjAuIFRoZSBub2lzZSB2YWx1ZSBjYW4gYmUgYW5pbWF0ZWQgYnkgbW92aW5nXFxudGhyb3VnaCB0aGUgbm9pc2Ugc3BhY2UgYXMgZGVtb25zdHJhdGVkIGluIHRoZSBleGFtcGxlIGFib3ZlLiBUaGUgMm5kXFxuYW5kIDNyZCBkaW1lbnNpb24gY2FuIGFsc28gYmUgaW50ZXJwcmV0ZWQgYXMgdGltZS48YnIgLz48YnIgLz5UaGUgYWN0dWFsXFxubm9pc2UgaXMgc3RydWN0dXJlZCBzaW1pbGFyIHRvIGFuIGF1ZGlvIHNpZ25hbCwgaW4gcmVzcGVjdCB0byB0aGVcXG5mdW5jdGlvbiYjMzk7cyB1c2Ugb2YgZnJlcXVlbmNpZXMuIFNpbWlsYXIgdG8gdGhlIGNvbmNlcHQgb2YgaGFybW9uaWNzIGluXFxucGh5c2ljcywgcGVybGluIG5vaXNlIGlzIGNvbXB1dGVkIG92ZXIgc2V2ZXJhbCBvY3RhdmVzIHdoaWNoIGFyZSBhZGRlZFxcbnRvZ2V0aGVyIGZvciB0aGUgZmluYWwgcmVzdWx0LiA8YnIgLz48YnIgLz5Bbm90aGVyIHdheSB0byBhZGp1c3QgdGhlXFxuY2hhcmFjdGVyIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UgaXMgdGhlIHNjYWxlIG9mIHRoZSBpbnB1dFxcbmNvb3JkaW5hdGVzLiBBcyB0aGUgZnVuY3Rpb24gd29ya3Mgd2l0aGluIGFuIGluZmluaXRlIHNwYWNlIHRoZSB2YWx1ZSBvZlxcbnRoZSBjb29yZGluYXRlcyBkb2VzbiYjMzk7dCBtYXR0ZXIgYXMgc3VjaCwgb25seSB0aGUgZGlzdGFuY2UgYmV0d2VlblxcbnN1Y2Nlc3NpdmUgY29vcmRpbmF0ZXMgZG9lcyAoZWcuIHdoZW4gdXNpbmcgPGI+bm9pc2UoKTwvYj4gd2l0aGluIGFcXG5sb29wKS4gQXMgYSBnZW5lcmFsIHJ1bGUgdGhlIHNtYWxsZXIgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb29yZGluYXRlcyxcXG50aGUgc21vb3RoZXIgdGhlIHJlc3VsdGluZyBub2lzZSBzZXF1ZW5jZSB3aWxsIGJlLiBTdGVwcyBvZiAwLjAwNS0wLjAzXFxud29yayBiZXN0IGZvciBtb3N0IGFwcGxpY2F0aW9ucywgYnV0IHRoaXMgd2lsbCBkaWZmZXIgZGVwZW5kaW5nIG9uIHVzZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJub2lzZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIGluIG5vaXNlIHNwYWNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LWNvb3JkaW5hdGUgaW4gbm9pc2Ugc3BhY2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwielwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ei1jb29yZGluYXRlIGluIG5vaXNlIHNwYWNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiUGVybGluIG5vaXNlIHZhbHVlIChiZXR3ZWVuIDAgYW5kIDEpIGF0IHNwZWNpZmllZFxcbiAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgeG9mZiA9IDAuMDtcXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDQpO1xcbiAgeG9mZiA9IHhvZmYgKyAwLjAxO1xcbiAgdmFyIG4gPSBub2lzZSh4b2ZmKSAqIHdpZHRoO1xcbiAgbGluZShuLCAwLCBuLCBoZWlnaHQpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuPGRpdj5cXG48Y29kZT52YXIgbm9pc2VTY2FsZT0wLjAyO1xcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgZm9yICh2YXIgeD0wOyB4IDwgd2lkdGg7IHgrKykge1xcbiAgICB2YXIgbm9pc2VWYWwgPSBub2lzZSgobW91c2VYK3gpKm5vaXNlU2NhbGUsIG1vdXNlWSpub2lzZVNjYWxlKTtcXG4gICAgc3Ryb2tlKG5vaXNlVmFsKjI1NSk7XFxuICAgIGxpbmUoeCwgbW91c2VZK25vaXNlVmFsKjgwLCB4LCBoZWlnaHQpO1xcbiAgfVxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInZlcnRpY2FsIGxpbmUgbW92ZXMgbGVmdCB0byByaWdodCB3aXRoIHVwZGF0aW5nIG5vaXNlIHZhbHVlcy5cXG5ob3Jpem9udGFsIHdhdmUgcGF0dGVybiBlZmZlY3RlZCBieSBtb3VzZSB4LXBvc2l0aW9uICYgdXBkYXRpbmcgbm9pc2UgdmFsdWVzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTm9pc2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9ub2lzZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE4NyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BZGp1c3RzIHRoZSBjaGFyYWN0ZXIgYW5kIGxldmVsIG9mIGRldGFpbCBwcm9kdWNlZCBieSB0aGUgUGVybGluIG5vaXNlXFxuIGZ1bmN0aW9uLiBTaW1pbGFyIHRvIGhhcm1vbmljcyBpbiBwaHlzaWNzLCBub2lzZSBpcyBjb21wdXRlZCBvdmVyXFxuIHNldmVyYWwgb2N0YXZlcy4gTG93ZXIgb2N0YXZlcyBjb250cmlidXRlIG1vcmUgdG8gdGhlIG91dHB1dCBzaWduYWwgYW5kXFxuIGFzIHN1Y2ggZGVmaW5lIHRoZSBvdmVyYWxsIGludGVuc2l0eSBvZiB0aGUgbm9pc2UsIHdoZXJlYXMgaGlnaGVyIG9jdGF2ZXNcXG4gY3JlYXRlIGZpbmVyIGdyYWluZWQgZGV0YWlscyBpbiB0aGUgbm9pc2Ugc2VxdWVuY2UuXFxuIDxicj48YnI+XFxuIEJ5IGRlZmF1bHQsIG5vaXNlIGlzIGNvbXB1dGVkIG92ZXIgNCBvY3RhdmVzIHdpdGggZWFjaCBvY3RhdmUgY29udHJpYnV0aW5nXFxuIGV4YWN0bHkgaGFsZiB0aGFuIGl0cyBwcmVkZWNlc3Nvciwgc3RhcnRpbmcgYXQgNTAlIHN0cmVuZ3RoIGZvciB0aGUgMXN0XFxuIG9jdGF2ZS4gVGhpcyBmYWxsb2ZmIGFtb3VudCBjYW4gYmUgY2hhbmdlZCBieSBhZGRpbmcgYW4gYWRkaXRpb25hbCBmdW5jdGlvblxcbiBwYXJhbWV0ZXIuIEVnLiBhIGZhbGxvZmYgZmFjdG9yIG9mIDAuNzUgbWVhbnMgZWFjaCBvY3RhdmUgd2lsbCBub3cgaGF2ZVxcbiA3NSUgaW1wYWN0ICgyNSUgbGVzcykgb2YgdGhlIHByZXZpb3VzIGxvd2VyIG9jdGF2ZS4gQW55IHZhbHVlIGJldHdlZW5cXG4gMC4wIGFuZCAxLjAgaXMgdmFsaWQsIGhvd2V2ZXIgbm90ZSB0aGF0IHZhbHVlcyBncmVhdGVyIHRoYW4gMC41IG1pZ2h0XFxuIHJlc3VsdCBpbiBncmVhdGVyIHRoYW4gMS4wIHZhbHVlcyByZXR1cm5lZCBieSA8Yj5ub2lzZSgpPC9iPi5cXG4gPGJyPjxicj5cXG4gQnkgY2hhbmdpbmcgdGhlc2UgcGFyYW1ldGVycywgdGhlIHNpZ25hbCBjcmVhdGVkIGJ5IHRoZSA8Yj5ub2lzZSgpPC9iPlxcbiBmdW5jdGlvbiBjYW4gYmUgYWRhcHRlZCB0byBmaXQgdmVyeSBzcGVjaWZpYyBuZWVkcyBhbmQgY2hhcmFjdGVyaXN0aWNzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vaXNlRGV0YWlsXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJsb2RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBvY3RhdmVzIHRvIGJlIHVzZWQgYnkgdGhlIG5vaXNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmYWxsb2ZmXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mYWxsb2ZmIGZhY3RvciBmb3IgZWFjaCBvY3RhdmU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdj5cXG4gPGNvZGU+XFxuIHZhciBub2lzZVZhbDtcXG4gdmFyIG5vaXNlU2NhbGUgPSAwLjAyO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuIH1cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgIGJhY2tncm91bmQoMCk7XFxuICAgZm9yICh2YXIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xcbiAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aCAvIDI7IHgrKykge1xcbiAgICAgICBub2lzZURldGFpbCgyLCAwLjIpO1xcbiAgICAgICBub2lzZVZhbCA9IG5vaXNlKChtb3VzZVggKyB4KSAqIG5vaXNlU2NhbGUsIChtb3VzZVkgKyB5KSAqIG5vaXNlU2NhbGUpO1xcbiAgICAgICBzdHJva2Uobm9pc2VWYWwgKiAyNTUpO1xcbiAgICAgICBwb2ludCh4LCB5KTtcXG4gICAgICAgbm9pc2VEZXRhaWwoOCwgMC42NSk7XFxuICAgICAgIG5vaXNlVmFsID0gbm9pc2UoXFxuICAgICAgICAgKG1vdXNlWCArIHggKyB3aWR0aCAvIDIpICogbm9pc2VTY2FsZSxcXG4gICAgICAgICAobW91c2VZICsgeSkgKiBub2lzZVNjYWxlXFxuICAgICAgICk7XFxuICAgICAgIHN0cm9rZShub2lzZVZhbCAqIDI1NSk7XFxuICAgICAgIHBvaW50KHggKyB3aWR0aCAvIDIsIHkpO1xcbiAgICAgfVxcbiAgIH1cXG4gfVxcbiA8L2NvZGU+XFxuIDwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCIyIHZlcnRpY2FsIGdyZXkgc21va2V5IHBhdHRlcm5zIGFmZmVjdGVkIG15IG1vdXNlIHgtcG9zaXRpb24gYW5kIG5vaXNlLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTm9pc2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9ub2lzZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI1MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXRzIHRoZSBzZWVkIHZhbHVlIGZvciA8Yj5ub2lzZSgpPC9iPi4gQnkgZGVmYXVsdCwgPGI+bm9pc2UoKTwvYj5cXG5wcm9kdWNlcyBkaWZmZXJlbnQgcmVzdWx0cyBlYWNoIHRpbWUgdGhlIHByb2dyYW0gaXMgcnVuLiBTZXQgdGhlXFxuPGI+dmFsdWU8L2I+IHBhcmFtZXRlciB0byBhIGNvbnN0YW50IHRvIHJldHVybiB0aGUgc2FtZSBwc2V1ZG8tcmFuZG9tXFxubnVtYmVycyBlYWNoIHRpbWUgdGhlIHNvZnR3YXJlIGlzIHJ1bi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJub2lzZVNlZWRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNlZWRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBzZWVkIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT52YXIgeG9mZiA9IDAuMDtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIG5vaXNlU2VlZCg5OSk7XFxuICBzdHJva2UoMCwgMTApO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgeG9mZiA9IHhvZmYgKyAuMDE7XFxuICB2YXIgbiA9IG5vaXNlKHhvZmYpICogd2lkdGg7XFxuICBsaW5lKG4sIDAsIG4sIGhlaWdodCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwidmVydGljYWwgZ3JleSBsaW5lcyBkcmF3aW5nIGluIHBhdHRlcm4gYWZmZWN0ZWQgYnkgbm9pc2UuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJOb2lzZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDY3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSB4IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ4XCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlZlY3RvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9wNS5WZWN0b3IuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3NyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvcjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwielwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDg0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3IgdiBieSBjYWxsaW5nIFN0cmluZyh2KVxcbm9yIHYudG9TdHJpbmcoKS4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBsb2dnaW5nIHZlY3RvcnMgaW4gdGhlXFxuY29uc29sZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0b1N0cmluZ1wiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzID0gXFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciB2ID0gY3JlYXRlVmVjdG9yKDIwLCAzMCk7XFxuICBwcmludChTdHJpbmcodikpOyAvLyBwcmludHMgXFxcInA1LlZlY3RvciBPYmplY3QgOiBbMjAsIDMwLCAwXVxcXCJcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjQwKTtcXG5cXG4gIHZhciB2MCA9IGNyZWF0ZVZlY3RvcigwLCAwKTtcXG4gIHZhciB2MSA9IGNyZWF0ZVZlY3Rvcihtb3VzZVgsIG1vdXNlWSk7XFxuICBkcmF3QXJyb3codjAsIHYxLCAnYmxhY2snKTtcXG5cXG4gIG5vU3Ryb2tlKCk7XFxuICB0ZXh0KHYxLnRvU3RyaW5nKCksIDEwLCAyNSwgOTAsIDc1KTtcXG59XFxuXFxuLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXFxuZnVuY3Rpb24gZHJhd0Fycm93KGJhc2UsIHZlYywgbXlDb2xvcikge1xcbiAgcHVzaCgpO1xcbiAgc3Ryb2tlKG15Q29sb3IpO1xcbiAgc3Ryb2tlV2VpZ2h0KDMpO1xcbiAgZmlsbChteUNvbG9yKTtcXG4gIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XFxuICBsaW5lKDAsIDAsIHZlYy54LCB2ZWMueSk7XFxuICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XFxuICB2YXIgYXJyb3dTaXplID0gNztcXG4gIHRyYW5zbGF0ZSh2ZWMubWFnKCkgLSBhcnJvd1NpemUsIDApO1xcbiAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XFxuICBwb3AoKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlZlY3RvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9wNS5WZWN0b3IuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMzQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyB0aGUgeCwgeSwgYW5kIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgdXNpbmcgdHdvIG9yIHRocmVlIHNlcGFyYXRlXFxudmFyaWFibGVzLCB0aGUgZGF0YSBmcm9tIGEgcDUuVmVjdG9yLCBvciB0aGUgdmFsdWVzIGZyb20gYSBmbG9hdCBhcnJheS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIHYgPSBjcmVhdGVWZWN0b3IoMSwgMiwgMyk7XFxuICB2LnNldCg0LCA1LCA2KTsgLy8gU2V0cyB2ZWN0b3IgdG8gWzQsIDUsIDZdXFxuXFxuICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMCwgMCwgMCk7XFxuICB2YXIgYXJyID0gWzEsIDIsIDNdO1xcbiAgdjEuc2V0KGFycik7IC8vIFNldHMgdmVjdG9yIHRvIFsxLCAyLCAzXVxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgdjAsIHYxO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG5cXG4gIHYwID0gY3JlYXRlVmVjdG9yKDAsIDApO1xcbiAgdjEgPSBjcmVhdGVWZWN0b3IoNTAsIDUwKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjQwKTtcXG5cXG4gIGRyYXdBcnJvdyh2MCwgdjEsICdibGFjaycpO1xcbiAgdjEuc2V0KHYxLnggKyByYW5kb20oLTEsIDEpLCB2MS55ICsgcmFuZG9tKC0xLCAxKSk7XFxuXFxuICBub1N0cm9rZSgpO1xcbiAgdGV4dCgneDogJyArIHJvdW5kKHYxLngpICsgJyB5OiAnICsgcm91bmQodjEueSksIDIwLCA5MCk7XFxufVxcblxcbi8vIGRyYXcgYW4gYXJyb3cgZm9yIGEgdmVjdG9yIGF0IGEgZ2l2ZW4gYmFzZSBwb3NpdGlvblxcbmZ1bmN0aW9uIGRyYXdBcnJvdyhiYXNlLCB2ZWMsIG15Q29sb3IpIHtcXG4gIHB1c2goKTtcXG4gIHN0cm9rZShteUNvbG9yKTtcXG4gIHN0cm9rZVdlaWdodCgzKTtcXG4gIGZpbGwobXlDb2xvcik7XFxuICB0cmFuc2xhdGUoYmFzZS54LCBiYXNlLnkpO1xcbiAgbGluZSgwLCAwLCB2ZWMueCwgdmVjLnkpO1xcbiAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xcbiAgdmFyIGFycm93U2l6ZSA9IDc7XFxuICB0cmFuc2xhdGUodmVjLm1hZygpIC0gYXJyb3dTaXplLCAwKTtcXG4gIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xcbiAgcG9wKCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTM0LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeSBjb21wb25lbnQgb2YgdGhlIHZlY3RvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwielwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTkzLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHZlY3RvciB0byBzZXQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yfE51bWJlcltdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjE3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldHMgYSBjb3B5IG9mIHRoZSB2ZWN0b3IsIHJldHVybnMgYSBwNS5WZWN0b3Igb2JqZWN0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNvcHlcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIGNvcHkgb2YgdGhlIHA1LlZlY3RvciBvYmplY3RcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHYxID0gY3JlYXRlVmVjdG9yKDEsIDIsIDMpO1xcbnZhciB2MiA9IHYxLmNvcHkoKTtcXG5wcmludCh2MS54ID09PSB2Mi54ICYmIHYxLnkgPT09IHYyLnkgJiYgdjEueiA9PT0gdjIueik7XFxuLy8gUHJpbnRzIFxcXCJ0cnVlXFxcIlxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjQwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFkZHMgeCwgeSwgYW5kIHogY29tcG9uZW50cyB0byBhIHZlY3RvciwgYWRkcyBvbmUgdmVjdG9yIHRvIGFub3RoZXIsIG9yXFxuYWRkcyB0d28gaW5kZXBlbmRlbnQgdmVjdG9ycyB0b2dldGhlci4gVGhlIHZlcnNpb24gb2YgdGhlIG1ldGhvZCB0aGF0IGFkZHNcXG50d28gdmVjdG9ycyB0b2dldGhlciBpcyBhIHN0YXRpYyBtZXRob2QgYW5kIHJldHVybnMgYSBwNS5WZWN0b3IsIHRoZSBvdGhlcnNcXG5hY3RzIGRpcmVjdGx5IG9uIHRoZSB2ZWN0b3IuIFNlZSB0aGUgZXhhbXBsZXMgZm9yIG1vcmUgY29udGV4dC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhZGRcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbnZhciB2ID0gY3JlYXRlVmVjdG9yKDEsIDIsIDMpO1xcbnYuYWRkKDQsIDUsIDYpO1xcbi8vIHYncyBjb21wb25lbnRzIGFyZSBzZXQgdG8gWzUsIDcsIDldXFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG4vLyBTdGF0aWMgbWV0aG9kXFxudmFyIHYxID0gY3JlYXRlVmVjdG9yKDEsIDIsIDMpO1xcbnZhciB2MiA9IGNyZWF0ZVZlY3RvcigyLCAzLCA0KTtcXG5cXG52YXIgdjMgPSBwNS5WZWN0b3IuYWRkKHYxLCB2Mik7XFxuLy8gdjMgaGFzIGNvbXBvbmVudHMgWzMsIDUsIDddXFxucHJpbnQodjMpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbi8vIHJlZCB2ZWN0b3IgKyBibHVlIHZlY3RvciA9IHB1cnBsZSB2ZWN0b3JcXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyNDApO1xcblxcbiAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDAsIDApO1xcbiAgdmFyIHYxID0gY3JlYXRlVmVjdG9yKG1vdXNlWCwgbW91c2VZKTtcXG4gIGRyYXdBcnJvdyh2MCwgdjEsICdyZWQnKTtcXG5cXG4gIHZhciB2MiA9IGNyZWF0ZVZlY3RvcigtMzAsIDIwKTtcXG4gIGRyYXdBcnJvdyh2MSwgdjIsICdibHVlJyk7XFxuXFxuICB2YXIgdjMgPSBwNS5WZWN0b3IuYWRkKHYxLCB2Mik7XFxuICBkcmF3QXJyb3codjAsIHYzLCAncHVycGxlJyk7XFxufVxcblxcbi8vIGRyYXcgYW4gYXJyb3cgZm9yIGEgdmVjdG9yIGF0IGEgZ2l2ZW4gYmFzZSBwb3NpdGlvblxcbmZ1bmN0aW9uIGRyYXdBcnJvdyhiYXNlLCB2ZWMsIG15Q29sb3IpIHtcXG4gIHB1c2goKTtcXG4gIHN0cm9rZShteUNvbG9yKTtcXG4gIHN0cm9rZVdlaWdodCgzKTtcXG4gIGZpbGwobXlDb2xvcik7XFxuICB0cmFuc2xhdGUoYmFzZS54LCBiYXNlLnkpO1xcbiAgbGluZSgwLCAwLCB2ZWMueCwgdmVjLnkpO1xcbiAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xcbiAgdmFyIGFycm93U2l6ZSA9IDc7XFxuICB0cmFuc2xhdGUodmVjLm1hZygpIC0gYXJyb3dTaXplLCAwKTtcXG4gIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xcbiAgcG9wKCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjQwLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciB0byBiZSBhZGRlZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHRvIGJlIGFkZGVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHRvIGJlIGFkZGVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAzMDYsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgdmVjdG9yIHRvIGFkZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3J8TnVtYmVyW11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxNTU2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YSBwNS5WZWN0b3IgdG8gYWRkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmEgcDUuVmVjdG9yIHRvIGFkZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0YXJnZXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHZlY3RvciB0byByZWNlaXZlIHRoZSByZXN1bHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJzdGF0aWNcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTU2MyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwic3RhdGljXCI6IDEsXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgcmVzdWx0aW5nIHA1LlZlY3RvclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzMwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN1YnRyYWN0cyB4LCB5LCBhbmQgeiBjb21wb25lbnRzIGZyb20gYSB2ZWN0b3IsIHN1YnRyYWN0cyBvbmUgdmVjdG9yIGZyb21cXG5hbm90aGVyLCBvciBzdWJ0cmFjdHMgdHdvIGluZGVwZW5kZW50IHZlY3RvcnMuIFRoZSB2ZXJzaW9uIG9mIHRoZSBtZXRob2RcXG50aGF0IHN1YnRyYWN0cyB0d28gdmVjdG9ycyBpcyBhIHN0YXRpYyBtZXRob2QgYW5kIHJldHVybnMgYSBwNS5WZWN0b3IsIHRoZVxcbm90aGVyIGFjdHMgZGlyZWN0bHkgb24gdGhlIHZlY3Rvci4gU2VlIHRoZSBleGFtcGxlcyBmb3IgbW9yZSBjb250ZXh0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInN1YlwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHYgPSBjcmVhdGVWZWN0b3IoNCwgNSwgNik7XFxudi5zdWIoMSwgMSwgMSk7XFxuLy8gdidzIGNvbXBvbmVudHMgYXJlIHNldCB0byBbMywgNCwgNV1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbi8vIFN0YXRpYyBtZXRob2RcXG52YXIgdjEgPSBjcmVhdGVWZWN0b3IoMiwgMywgNCk7XFxudmFyIHYyID0gY3JlYXRlVmVjdG9yKDEsIDIsIDMpO1xcblxcbnZhciB2MyA9IHA1LlZlY3Rvci5zdWIodjEsIHYyKTtcXG4vLyB2MyBoYXMgY29tcG9uZW50cyBbMSwgMSwgMV1cXG5wcmludCh2Myk7XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gcmVkIHZlY3RvciAtIGJsdWUgdmVjdG9yID0gcHVycGxlIHZlY3RvclxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDI0MCk7XFxuXFxuICB2YXIgdjAgPSBjcmVhdGVWZWN0b3IoMCwgMCk7XFxuICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoNzAsIDUwKTtcXG4gIGRyYXdBcnJvdyh2MCwgdjEsICdyZWQnKTtcXG5cXG4gIHZhciB2MiA9IGNyZWF0ZVZlY3Rvcihtb3VzZVgsIG1vdXNlWSk7XFxuICBkcmF3QXJyb3codjAsIHYyLCAnYmx1ZScpO1xcblxcbiAgdmFyIHYzID0gcDUuVmVjdG9yLnN1Yih2MSwgdjIpO1xcbiAgZHJhd0Fycm93KHYyLCB2MywgJ3B1cnBsZScpO1xcbn1cXG5cXG4vLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cXG5mdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XFxuICBwdXNoKCk7XFxuICBzdHJva2UobXlDb2xvcik7XFxuICBzdHJva2VXZWlnaHQoMyk7XFxuICBmaWxsKG15Q29sb3IpO1xcbiAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcXG4gIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcXG4gIHJvdGF0ZSh2ZWMuaGVhZGluZygpKTtcXG4gIHZhciBhcnJvd1NpemUgPSA3O1xcbiAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XFxuICB0cmlhbmdsZSgwLCBhcnJvd1NpemUgLyAyLCAwLCAtYXJyb3dTaXplIC8gMiwgYXJyb3dTaXplLCAwKTtcXG4gIHBvcCgpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDMzMCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgdG8gc3VidHJhY3Q8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeSBjb21wb25lbnQgb2YgdGhlIHZlY3RvciB0byBzdWJ0cmFjdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwielwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciB0byBzdWJ0cmFjdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMzk2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHZlY3RvciB0byBzdWJ0cmFjdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3J8TnVtYmVyW11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxNTg2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YSBwNS5WZWN0b3IgdG8gc3VidHJhY3QgZnJvbTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hIHA1LlZlY3RvciB0byBzdWJ0cmFjdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0YXJnZXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aWYgdW5kZWZpbmVkIGEgbmV3IHZlY3RvciB3aWxsIGJlIGNyZWF0ZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJzdGF0aWNcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTU5MyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwic3RhdGljXCI6IDEsXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgcmVzdWx0aW5nIHA1LlZlY3RvclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDIwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk11bHRpcGx5IHRoZSB2ZWN0b3IgYnkgYSBzY2FsYXIuIFRoZSBzdGF0aWMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZFxcbmNyZWF0ZXMgYSBuZXcgcDUuVmVjdG9yIHdoaWxlIHRoZSBub24gc3RhdGljIHZlcnNpb24gYWN0cyBvbiB0aGUgdmVjdG9yXFxuZGlyZWN0bHkuIFNlZSB0aGUgZXhhbXBsZXMgZm9yIG1vcmUgY29udGV4dC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtdWx0XCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG52YXIgdiA9IGNyZWF0ZVZlY3RvcigxLCAyLCAzKTtcXG52Lm11bHQoMik7XFxuLy8gdidzIGNvbXBvbmVudHMgYXJlIHNldCB0byBbMiwgNCwgNl1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbi8vIFN0YXRpYyBtZXRob2RcXG52YXIgdjEgPSBjcmVhdGVWZWN0b3IoMSwgMiwgMyk7XFxudmFyIHYyID0gcDUuVmVjdG9yLm11bHQodjEsIDIpO1xcbi8vIHYyIGhhcyBjb21wb25lbnRzIFsyLCA0LCA2XVxcbnByaW50KHYyKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyNDApO1xcblxcbiAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XFxuICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMjUsIC0yNSk7XFxuICBkcmF3QXJyb3codjAsIHYxLCAncmVkJyk7XFxuXFxuICB2YXIgbnVtID0gbWFwKG1vdXNlWCwgMCwgd2lkdGgsIC0yLCAyLCB0cnVlKTtcXG4gIHZhciB2MiA9IHA1LlZlY3Rvci5tdWx0KHYxLCBudW0pO1xcbiAgZHJhd0Fycm93KHYwLCB2MiwgJ2JsdWUnKTtcXG5cXG4gIG5vU3Ryb2tlKCk7XFxuICB0ZXh0KCdtdWx0aXBsaWVkIGJ5ICcgKyBudW0udG9GaXhlZCgyKSwgNSwgOTApO1xcbn1cXG5cXG4vLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cXG5mdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XFxuICBwdXNoKCk7XFxuICBzdHJva2UobXlDb2xvcik7XFxuICBzdHJva2VXZWlnaHQoMyk7XFxuICBmaWxsKG15Q29sb3IpO1xcbiAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcXG4gIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcXG4gIHJvdGF0ZSh2ZWMuaGVhZGluZygpKTtcXG4gIHZhciBhcnJvd1NpemUgPSA3O1xcbiAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XFxuICB0cmlhbmdsZSgwLCBhcnJvd1NpemUgLyAyLCAwLCAtYXJyb3dTaXplIC8gMiwgYXJyb3dTaXplLCAwKTtcXG4gIHBvcCgpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDQyMCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIG51bWJlciB0byBtdWx0aXBseSB3aXRoIHRoZSB2ZWN0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTYxNCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHZlY3RvciB0byBtdWx0aXBseTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRhcmdldFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5pZiB1bmRlZmluZWQgYSBuZXcgdmVjdG9yIHdpbGwgYmUgY3JlYXRlZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInN0YXRpY1wiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxNjIxLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwic3RhdGljXCI6IDEsXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgcmVzdWx0aW5nIG5ldyBwNS5WZWN0b3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ5NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EaXZpZGUgdGhlIHZlY3RvciBieSBhIHNjYWxhci4gVGhlIHN0YXRpYyB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYVxcbm5ldyBwNS5WZWN0b3Igd2hpbGUgdGhlIG5vbiBzdGF0aWMgdmVyc2lvbiBhY3RzIG9uIHRoZSB2ZWN0b3IgZGlyZWN0bHkuXFxuU2VlIHRoZSBleGFtcGxlcyBmb3IgbW9yZSBjb250ZXh0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRpdlwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHYgPSBjcmVhdGVWZWN0b3IoNiwgNCwgMik7XFxudi5kaXYoMik7IC8vdidzIGNvbXBvbmVudHMgYXJlIHNldCB0byBbMywgMiwgMV1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbi8vIFN0YXRpYyBtZXRob2RcXG52YXIgdjEgPSBjcmVhdGVWZWN0b3IoNiwgNCwgMik7XFxudmFyIHYyID0gcDUuVmVjdG9yLmRpdih2MSwgMik7XFxuLy8gdjIgaGFzIGNvbXBvbmVudHMgWzMsIDIsIDFdXFxucHJpbnQodjIpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDI0MCk7XFxuXFxuICB2YXIgdjAgPSBjcmVhdGVWZWN0b3IoMCwgMTAwKTtcXG4gIHZhciB2MSA9IGNyZWF0ZVZlY3Rvcig1MCwgLTUwKTtcXG4gIGRyYXdBcnJvdyh2MCwgdjEsICdyZWQnKTtcXG5cXG4gIHZhciBudW0gPSBtYXAobW91c2VYLCAwLCB3aWR0aCwgMTAsIDAuNSwgdHJ1ZSk7XFxuICB2YXIgdjIgPSBwNS5WZWN0b3IuZGl2KHYxLCBudW0pO1xcbiAgZHJhd0Fycm93KHYwLCB2MiwgJ2JsdWUnKTtcXG5cXG4gIG5vU3Ryb2tlKCk7XFxuICB0ZXh0KCdkaXZpZGVkIGJ5ICcgKyBudW0udG9GaXhlZCgyKSwgMTAsIDkwKTtcXG59XFxuXFxuLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXFxuZnVuY3Rpb24gZHJhd0Fycm93KGJhc2UsIHZlYywgbXlDb2xvcikge1xcbiAgcHVzaCgpO1xcbiAgc3Ryb2tlKG15Q29sb3IpO1xcbiAgc3Ryb2tlV2VpZ2h0KDMpO1xcbiAgZmlsbChteUNvbG9yKTtcXG4gIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XFxuICBsaW5lKDAsIDAsIHZlYy54LCB2ZWMueSk7XFxuICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XFxuICB2YXIgYXJyb3dTaXplID0gNztcXG4gIHRyYW5zbGF0ZSh2ZWMubWFnKCkgLSBhcnJvd1NpemUsIDApO1xcbiAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XFxuICBwb3AoKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlZlY3RvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA0OTUsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBudW1iZXIgdG8gZGl2aWRlIHRoZSB2ZWN0b3IgYnk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTY0MSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHZlY3RvciB0byBkaXZpZGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0YXJnZXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aWYgdW5kZWZpbmVkIGEgbmV3IHZlY3RvciB3aWxsIGJlIGNyZWF0ZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJzdGF0aWNcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTY0OCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInN0YXRpY1wiOiAxLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHJlc3VsdGluZyBuZXcgcDUuVmVjdG9yXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9wNS5WZWN0b3IuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1NzMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2FsY3VsYXRlcyB0aGUgbWFnbml0dWRlIChsZW5ndGgpIG9mIHRoZSB2ZWN0b3IgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhc1xcbmEgZmxvYXQgKHRoaXMgaXMgc2ltcGx5IHRoZSBlcXVhdGlvbiBzcXJ0KHg8ZW0+eCArIHk8L2VtPnkgKyB6KnopLik8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtYWdcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibWFnbml0dWRlIG9mIHRoZSB2ZWN0b3JcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDI0MCk7XFxuXFxuICB2YXIgdjAgPSBjcmVhdGVWZWN0b3IoMCwgMCk7XFxuICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IobW91c2VYLCBtb3VzZVkpO1xcbiAgZHJhd0Fycm93KHYwLCB2MSwgJ2JsYWNrJyk7XFxuXFxuICBub1N0cm9rZSgpO1xcbiAgdGV4dCgndmVjdG9yIGxlbmd0aDogJyArIHYxLm1hZygpLnRvRml4ZWQoMiksIDEwLCA3MCwgOTAsIDMwKTtcXG59XFxuXFxuLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXFxuZnVuY3Rpb24gZHJhd0Fycm93KGJhc2UsIHZlYywgbXlDb2xvcikge1xcbiAgcHVzaCgpO1xcbiAgc3Ryb2tlKG15Q29sb3IpO1xcbiAgc3Ryb2tlV2VpZ2h0KDMpO1xcbiAgZmlsbChteUNvbG9yKTtcXG4gIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XFxuICBsaW5lKDAsIDAsIHZlYy54LCB2ZWMueSk7XFxuICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XFxuICB2YXIgYXJyb3dTaXplID0gNztcXG4gIHRyYW5zbGF0ZSh2ZWMubWFnKCkgLSBhcnJvd1NpemUsIDApO1xcbiAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XFxuICBwb3AoKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG52YXIgdiA9IGNyZWF0ZVZlY3RvcigyMC4wLCAzMC4wLCA0MC4wKTtcXG52YXIgbSA9IHYubWFnKCk7XFxucHJpbnQobSk7IC8vIFByaW50cyBcXFwiNTMuODUxNjQ4MDcxMzQ1MDRcXFwiXFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlZlY3RvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA1NzMsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibWFnbml0dWRlIG9mIHRoZSB2ZWN0b3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE3MzgsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2ZWNUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB2ZWN0b3IgdG8gcmV0dXJuIHRoZSBtYWduaXR1ZGUgb2Y8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJzdGF0aWNcIjogMSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBtYWduaXR1ZGUgb2YgdmVjVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjIxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbWFnbml0dWRlIG9mIHRoZSB2ZWN0b3IgYW5kIHJldHVybnMgdGhlIHJlc3VsdFxcbmFzIGEgZmxvYXQgKHRoaXMgaXMgc2ltcGx5IHRoZSBlcXVhdGlvbiA8ZW0+KHg8ZW0+eCArIHk8L2VtPnkgKyB6KnopPC9lbT4uKVxcbkZhc3RlciBpZiB0aGUgcmVhbCBsZW5ndGggaXMgbm90IHJlcXVpcmVkIGluIHRoZVxcbmNhc2Ugb2YgY29tcGFyaW5nIHZlY3RvcnMsIGV0Yy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtYWdTcVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzcXVhcmVkIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbi8vIFN0YXRpYyBtZXRob2RcXG52YXIgdjEgPSBjcmVhdGVWZWN0b3IoNiwgNCwgMik7XFxucHJpbnQodjEubWFnU3EoKSk7IC8vIFByaW50cyBcXFwiNTZcXFwiXFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjQwKTtcXG5cXG4gIHZhciB2MCA9IGNyZWF0ZVZlY3RvcigwLCAwKTtcXG4gIHZhciB2MSA9IGNyZWF0ZVZlY3Rvcihtb3VzZVgsIG1vdXNlWSk7XFxuICBkcmF3QXJyb3codjAsIHYxLCAnYmxhY2snKTtcXG5cXG4gIG5vU3Ryb2tlKCk7XFxuICB0ZXh0KCd2ZWN0b3IgbGVuZ3RoIHNxdWFyZWQ6ICcgKyB2MS5tYWdTcSgpLnRvRml4ZWQoMiksIDEwLCA0NSwgOTAsIDU1KTtcXG59XFxuXFxuLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXFxuZnVuY3Rpb24gZHJhd0Fycm93KGJhc2UsIHZlYywgbXlDb2xvcikge1xcbiAgcHVzaCgpO1xcbiAgc3Ryb2tlKG15Q29sb3IpO1xcbiAgc3Ryb2tlV2VpZ2h0KDMpO1xcbiAgZmlsbChteUNvbG9yKTtcXG4gIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XFxuICBsaW5lKDAsIDAsIHZlYy54LCB2ZWMueSk7XFxuICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XFxuICB2YXIgYXJyb3dTaXplID0gNztcXG4gIHRyYW5zbGF0ZSh2ZWMubWFnKCkgLSBhcnJvd1NpemUsIDApO1xcbiAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XFxuICBwb3AoKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlZlY3RvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9wNS5WZWN0b3IuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2NzUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMuIFRoZSB2ZXJzaW9uIG9mIHRoZSBtZXRob2RcXG50aGF0IGNvbXB1dGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gaW5kZXBlbmRlbnQgdmVjdG9ycyBpcyBhIHN0YXRpY1xcbm1ldGhvZC4gU2VlIHRoZSBleGFtcGxlcyBmb3IgbW9yZSBjb250ZXh0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRvdFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgZG90IHByb2R1Y3RcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHYxID0gY3JlYXRlVmVjdG9yKDEsIDIsIDMpO1xcbnZhciB2MiA9IGNyZWF0ZVZlY3RvcigyLCAzLCA0KTtcXG5cXG5wcmludCh2MS5kb3QodjIpKTsgLy8gUHJpbnRzIFxcXCIyMFxcXCJcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbi8vU3RhdGljIG1ldGhvZFxcbnZhciB2MSA9IGNyZWF0ZVZlY3RvcigxLCAyLCAzKTtcXG52YXIgdjIgPSBjcmVhdGVWZWN0b3IoMywgMiwgMSk7XFxucHJpbnQocDUuVmVjdG9yLmRvdCh2MSwgdjIpKTsgLy8gUHJpbnRzIFxcXCIxMFxcXCJcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDY3NSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eCBjb21wb25lbnQgb2YgdGhlIHZlY3RvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInpcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eiBjb21wb25lbnQgb2YgdGhlIHZlY3RvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBkb3QgcHJvZHVjdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNzA2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmFsdWUgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3Igb3IgYSBwNS5WZWN0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTY2OCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBmaXJzdCBwNS5WZWN0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHNlY29uZCBwNS5WZWN0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJzdGF0aWNcIjogMSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBkb3QgcHJvZHVjdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzE4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgYW5kIHJldHVybnMgYSB2ZWN0b3IgY29tcG9zZWQgb2YgdGhlIGNyb3NzIHByb2R1Y3QgYmV0d2VlblxcbnR3byB2ZWN0b3JzLiBCb3RoIHRoZSBzdGF0aWMgYW5kIG5vbiBzdGF0aWMgbWV0aG9kcyByZXR1cm4gYSBuZXcgcDUuVmVjdG9yLlxcblNlZSB0aGUgZXhhbXBsZXMgZm9yIG1vcmUgY29udGV4dC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcm9zc1wiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwNS5WZWN0b3IgY29tcG9zZWQgb2YgY3Jvc3MgcHJvZHVjdFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG52YXIgdjEgPSBjcmVhdGVWZWN0b3IoMSwgMiwgMyk7XFxudmFyIHYyID0gY3JlYXRlVmVjdG9yKDEsIDIsIDMpO1xcblxcbnYxLmNyb3NzKHYyKTsgLy8gdidzIGNvbXBvbmVudHMgYXJlIFswLCAwLCAwXVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuLy8gU3RhdGljIG1ldGhvZFxcbnZhciB2MSA9IGNyZWF0ZVZlY3RvcigxLCAwLCAwKTtcXG52YXIgdjIgPSBjcmVhdGVWZWN0b3IoMCwgMSwgMCk7XFxuXFxudmFyIGNyb3NzUHJvZHVjdCA9IHA1LlZlY3Rvci5jcm9zcyh2MSwgdjIpO1xcbi8vIGNyb3NzUHJvZHVjdCBoYXMgY29tcG9uZW50cyBbMCwgMCwgMV1cXG5wcmludChjcm9zc1Byb2R1Y3QpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNzE4LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5WZWN0b3IgdG8gYmUgY3Jvc3NlZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicDUuVmVjdG9yIGNvbXBvc2VkIG9mIGNyb3NzIHByb2R1Y3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE2ODIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgZmlyc3QgcDUuVmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBzZWNvbmQgcDUuVmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwic3RhdGljXCI6IDEsXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgY3Jvc3MgcHJvZHVjdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzU5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMgKGNvbnNpZGVyaW5nIGFcXG5wb2ludCBhcyBhIHZlY3RvciBvYmplY3QpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRpc3RcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIGRpc3RhbmNlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbnZhciB2MSA9IGNyZWF0ZVZlY3RvcigxLCAwLCAwKTtcXG52YXIgdjIgPSBjcmVhdGVWZWN0b3IoMCwgMSwgMCk7XFxuXFxudmFyIGRpc3RhbmNlID0gdjEuZGlzdCh2Mik7IC8vIGRpc3RhbmNlIGlzIDEuNDE0Mi4uLlxcbnByaW50KGRpc3RhbmNlKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbi8vIFN0YXRpYyBtZXRob2RcXG52YXIgdjEgPSBjcmVhdGVWZWN0b3IoMSwgMCwgMCk7XFxudmFyIHYyID0gY3JlYXRlVmVjdG9yKDAsIDEsIDApO1xcblxcbnZhciBkaXN0YW5jZSA9IHA1LlZlY3Rvci5kaXN0KHYxLCB2Mik7XFxuLy8gZGlzdGFuY2UgaXMgMS40MTQyLi4uXFxucHJpbnQoZGlzdGFuY2UpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDI0MCk7XFxuXFxuICB2YXIgdjAgPSBjcmVhdGVWZWN0b3IoMCwgMCk7XFxuXFxuICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoNzAsIDUwKTtcXG4gIGRyYXdBcnJvdyh2MCwgdjEsICdyZWQnKTtcXG5cXG4gIHZhciB2MiA9IGNyZWF0ZVZlY3Rvcihtb3VzZVgsIG1vdXNlWSk7XFxuICBkcmF3QXJyb3codjAsIHYyLCAnYmx1ZScpO1xcblxcbiAgbm9TdHJva2UoKTtcXG4gIHRleHQoJ2Rpc3RhbmNlIGJldHdlZW4gdmVjdG9yczogJyArIHYyLmRpc3QodjEpLnRvRml4ZWQoMiksIDUsIDUwLCA5NSwgNTApO1xcbn1cXG5cXG4vLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cXG5mdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XFxuICBwdXNoKCk7XFxuICBzdHJva2UobXlDb2xvcik7XFxuICBzdHJva2VXZWlnaHQoMyk7XFxuICBmaWxsKG15Q29sb3IpO1xcbiAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcXG4gIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcXG4gIHJvdGF0ZSh2ZWMuaGVhZGluZygpKTtcXG4gIHZhciBhcnJvd1NpemUgPSA3O1xcbiAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XFxuICB0cmlhbmdsZSgwLCBhcnJvd1NpemUgLyAyLCAwLCAtYXJyb3dTaXplIC8gMiwgYXJyb3dTaXplLCAwKTtcXG4gIHBvcCgpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDc1OSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHgsIHksIGFuZCB6IGNvb3JkaW5hdGVzIG9mIGEgcDUuVmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgZGlzdGFuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE2OTcsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgZmlyc3QgcDUuVmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBzZWNvbmQgcDUuVmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwic3RhdGljXCI6IDEsXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgZGlzdGFuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgzMCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Ob3JtYWxpemUgdGhlIHZlY3RvciB0byBsZW5ndGggMSAobWFrZSBpdCBhIHVuaXQgdmVjdG9yKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJub3JtYWxpemVcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibm9ybWFsaXplZCBwNS5WZWN0b3JcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHYgPSBjcmVhdGVWZWN0b3IoMTAsIDIwLCAyKTtcXG4vLyB2IGhhcyBjb21wb25lbnRzIFsxMC4wLCAyMC4wLCAyLjBdXFxudi5ub3JtYWxpemUoKTtcXG4vLyB2J3MgY29tcG9uZW50cyBhcmUgc2V0IHRvXFxuLy8gWzAuNDQ1NDM1NCwgMC44OTA4NzA4LCAwLjA4OTA4NzA4NF1cXG48L2NvZGU+XFxuPC9kaXY+XFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyNDApO1xcblxcbiAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XFxuICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IobW91c2VYIC0gNTAsIG1vdXNlWSAtIDUwKTtcXG5cXG4gIGRyYXdBcnJvdyh2MCwgdjEsICdyZWQnKTtcXG4gIHYxLm5vcm1hbGl6ZSgpO1xcbiAgZHJhd0Fycm93KHYwLCB2MS5tdWx0KDM1KSwgJ2JsdWUnKTtcXG5cXG4gIG5vRmlsbCgpO1xcbiAgZWxsaXBzZSg1MCwgNTAsIDM1ICogMik7XFxufVxcblxcbi8vIGRyYXcgYW4gYXJyb3cgZm9yIGEgdmVjdG9yIGF0IGEgZ2l2ZW4gYmFzZSBwb3NpdGlvblxcbmZ1bmN0aW9uIGRyYXdBcnJvdyhiYXNlLCB2ZWMsIG15Q29sb3IpIHtcXG4gIHB1c2goKTtcXG4gIHN0cm9rZShteUNvbG9yKTtcXG4gIHN0cm9rZVdlaWdodCgzKTtcXG4gIGZpbGwobXlDb2xvcik7XFxuICB0cmFuc2xhdGUoYmFzZS54LCBiYXNlLnkpO1xcbiAgbGluZSgwLCAwLCB2ZWMueCwgdmVjLnkpO1xcbiAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xcbiAgdmFyIGFycm93U2l6ZSA9IDc7XFxuICB0cmFuc2xhdGUodmVjLm1hZygpIC0gYXJyb3dTaXplLCAwKTtcXG4gIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xcbiAgcG9wKCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODg2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkxpbWl0IHRoZSBtYWduaXR1ZGUgb2YgdGhpcyB2ZWN0b3IgdG8gdGhlIHZhbHVlIHVzZWQgZm9yIHRoZSA8Yj5tYXg8L2I+XFxucGFyYW1ldGVyLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxpbWl0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBtYXhpbXVtIG1hZ25pdHVkZSBmb3IgdGhlIHZlY3RvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHYgPSBjcmVhdGVWZWN0b3IoMTAsIDIwLCAyKTtcXG4vLyB2IGhhcyBjb21wb25lbnRzIFsxMC4wLCAyMC4wLCAyLjBdXFxudi5saW1pdCg1KTtcXG4vLyB2J3MgY29tcG9uZW50cyBhcmUgc2V0IHRvXFxuLy8gWzIuMjI3MTc3MSwgNC40NTQzNTQzLCAwLjQ0NTQzNTRdXFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjQwKTtcXG5cXG4gIHZhciB2MCA9IGNyZWF0ZVZlY3Rvcig1MCwgNTApO1xcbiAgdmFyIHYxID0gY3JlYXRlVmVjdG9yKG1vdXNlWCAtIDUwLCBtb3VzZVkgLSA1MCk7XFxuXFxuICBkcmF3QXJyb3codjAsIHYxLCAncmVkJyk7XFxuICBkcmF3QXJyb3codjAsIHYxLmxpbWl0KDM1KSwgJ2JsdWUnKTtcXG5cXG4gIG5vRmlsbCgpO1xcbiAgZWxsaXBzZSg1MCwgNTAsIDM1ICogMik7XFxufVxcblxcbi8vIGRyYXcgYW4gYXJyb3cgZm9yIGEgdmVjdG9yIGF0IGEgZ2l2ZW4gYmFzZSBwb3NpdGlvblxcbmZ1bmN0aW9uIGRyYXdBcnJvdyhiYXNlLCB2ZWMsIG15Q29sb3IpIHtcXG4gIHB1c2goKTtcXG4gIHN0cm9rZShteUNvbG9yKTtcXG4gIHN0cm9rZVdlaWdodCgzKTtcXG4gIGZpbGwobXlDb2xvcik7XFxuICB0cmFuc2xhdGUoYmFzZS54LCBiYXNlLnkpO1xcbiAgbGluZSgwLCAwLCB2ZWMueCwgdmVjLnkpO1xcbiAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xcbiAgdmFyIGFycm93U2l6ZSA9IDc7XFxuICB0cmFuc2xhdGUodmVjLm1hZygpIC0gYXJyb3dTaXplLCAwKTtcXG4gIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xcbiAgcG9wKCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTQ0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgbWFnbml0dWRlIG9mIHRoaXMgdmVjdG9yIHRvIHRoZSB2YWx1ZSB1c2VkIGZvciB0aGUgPGI+bGVuPC9iPlxcbnBhcmFtZXRlci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRNYWdcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImxlblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIG5ldyBsZW5ndGggZm9yIHRoaXMgdmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG52YXIgdiA9IGNyZWF0ZVZlY3RvcigxMCwgMjAsIDIpO1xcbi8vIHYgaGFzIGNvbXBvbmVudHMgWzEwLjAsIDIwLjAsIDIuMF1cXG52LnNldE1hZygxMCk7XFxuLy8gdidzIGNvbXBvbmVudHMgYXJlIHNldCB0byBbNi4wLCA4LjAsIDAuMF1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyNDApO1xcblxcbiAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDAsIDApO1xcbiAgdmFyIHYxID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XFxuXFxuICBkcmF3QXJyb3codjAsIHYxLCAncmVkJyk7XFxuXFxuICB2YXIgbGVuZ3RoID0gbWFwKG1vdXNlWCwgMCwgd2lkdGgsIDAsIDE0MSwgdHJ1ZSk7XFxuICB2MS5zZXRNYWcobGVuZ3RoKTtcXG4gIGRyYXdBcnJvdyh2MCwgdjEsICdibHVlJyk7XFxuXFxuICBub1N0cm9rZSgpO1xcbiAgdGV4dCgnbWFnbml0dWRlIHNldCB0bzogJyArIGxlbmd0aC50b0ZpeGVkKDIpLCAxMCwgNzAsIDkwLCAzMCk7XFxufVxcblxcbi8vIGRyYXcgYW4gYXJyb3cgZm9yIGEgdmVjdG9yIGF0IGEgZ2l2ZW4gYmFzZSBwb3NpdGlvblxcbmZ1bmN0aW9uIGRyYXdBcnJvdyhiYXNlLCB2ZWMsIG15Q29sb3IpIHtcXG4gIHB1c2goKTtcXG4gIHN0cm9rZShteUNvbG9yKTtcXG4gIHN0cm9rZVdlaWdodCgzKTtcXG4gIGZpbGwobXlDb2xvcik7XFxuICB0cmFuc2xhdGUoYmFzZS54LCBiYXNlLnkpO1xcbiAgbGluZSgwLCAwLCB2ZWMueCwgdmVjLnkpO1xcbiAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xcbiAgdmFyIGFycm93U2l6ZSA9IDc7XFxuICB0cmFuc2xhdGUodmVjLm1hZygpIC0gYXJyb3dTaXplLCAwKTtcXG4gIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xcbiAgcG9wKCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTAwMCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DYWxjdWxhdGUgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGZvciB0aGlzIHZlY3RvciAob25seSAyRCB2ZWN0b3JzKTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImhlYWRpbmdcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIGFuZ2xlIG9mIHJvdGF0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcyA9IFxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMzAsIDUwKTtcXG4gIHByaW50KHYxLmhlYWRpbmcoKSk7IC8vIDEuMDMwMzc2ODI2NTI0MzEyNVxcblxcbiAgdjEgPSBjcmVhdGVWZWN0b3IoNDAsIDUwKTtcXG4gIHByaW50KHYxLmhlYWRpbmcoKSk7IC8vIDAuODk2MDU1Mzg0NTcxMzQzOVxcblxcbiAgdjEgPSBjcmVhdGVWZWN0b3IoMzAsIDcwKTtcXG4gIHByaW50KHYxLmhlYWRpbmcoKSk7IC8vIDEuMTY1OTA0NTQwNTA5ODEzMlxcbn1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyNDApO1xcblxcbiAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XFxuICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IobW91c2VYIC0gNTAsIG1vdXNlWSAtIDUwKTtcXG5cXG4gIGRyYXdBcnJvdyh2MCwgdjEsICdibGFjaycpO1xcblxcbiAgdmFyIG15SGVhZGluZyA9IHYxLmhlYWRpbmcoKTtcXG4gIG5vU3Ryb2tlKCk7XFxuICB0ZXh0KFxcbiAgICAndmVjdG9yIGhlYWRpbmc6ICcgK1xcbiAgICAgIG15SGVhZGluZy50b0ZpeGVkKDIpICtcXG4gICAgICAnIHJhZGlhbnMgb3IgJyArXFxuICAgICAgZGVncmVlcyhteUhlYWRpbmcpLnRvRml4ZWQoMikgK1xcbiAgICAgICcgZGVncmVlcycsXFxuICAgIDEwLFxcbiAgICA1MCxcXG4gICAgOTAsXFxuICAgIDUwXFxuICApO1xcbn1cXG5cXG4vLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cXG5mdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XFxuICBwdXNoKCk7XFxuICBzdHJva2UobXlDb2xvcik7XFxuICBzdHJva2VXZWlnaHQoMyk7XFxuICBmaWxsKG15Q29sb3IpO1xcbiAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcXG4gIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcXG4gIHJvdGF0ZSh2ZWMuaGVhZGluZygpKTtcXG4gIHZhciBhcnJvd1NpemUgPSA3O1xcbiAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XFxuICB0cmlhbmdsZSgwLCBhcnJvd1NpemUgLyAyLCAwLCAtYXJyb3dTaXplIC8gMiwgYXJyb3dTaXplLCAwKTtcXG4gIHBvcCgpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwNjksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Um90YXRlIHRoZSB2ZWN0b3IgYnkgYW4gYW5nbGUgKG9ubHkgMkQgdmVjdG9ycyksIG1hZ25pdHVkZSByZW1haW5zIHRoZVxcbnNhbWU8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyb3RhdGVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFuZ2xlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgYW5nbGUgb2Ygcm90YXRpb248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz1cXFwibm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbnZhciB2ID0gY3JlYXRlVmVjdG9yKDEwLjAsIDIwLjApO1xcbi8vIHYgaGFzIGNvbXBvbmVudHMgWzEwLjAsIDIwLjAsIDAuMF1cXG52LnJvdGF0ZShIQUxGX1BJKTtcXG4vLyB2J3MgY29tcG9uZW50cyBhcmUgc2V0IHRvIFstMjAuMCwgOS45OTk5OTksIDAuMF1cXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgYW5nbGUgPSAwO1xcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDI0MCk7XFxuXFxuICB2YXIgdjAgPSBjcmVhdGVWZWN0b3IoNTAsIDUwKTtcXG4gIHZhciB2MSA9IGNyZWF0ZVZlY3Rvcig1MCwgMCk7XFxuXFxuICBkcmF3QXJyb3codjAsIHYxLnJvdGF0ZShhbmdsZSksICdibGFjaycpO1xcbiAgYW5nbGUgKz0gMC4wMTtcXG59XFxuXFxuLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXFxuZnVuY3Rpb24gZHJhd0Fycm93KGJhc2UsIHZlYywgbXlDb2xvcikge1xcbiAgcHVzaCgpO1xcbiAgc3Ryb2tlKG15Q29sb3IpO1xcbiAgc3Ryb2tlV2VpZ2h0KDMpO1xcbiAgZmlsbChteUNvbG9yKTtcXG4gIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XFxuICBsaW5lKDAsIDAsIHZlYy54LCB2ZWMueSk7XFxuICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XFxuICB2YXIgYXJyb3dTaXplID0gNztcXG4gIHRyYW5zbGF0ZSh2ZWMubWFnKCkgLSBhcnJvd1NpemUsIDApO1xcbiAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XFxuICBwb3AoKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlZlY3RvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9wNS5WZWN0b3IuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTI1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIGFuZ2xlIChpbiByYWRpYW5zKSBiZXR3ZWVuIHR3byB2ZWN0b3JzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFuZ2xlQmV0d2VlblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGhlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LCB5LCBhbmQgeiBjb21wb25lbnRzIG9mIGEgcDUuVmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBhbmdsZSBiZXR3ZWVuIChpbiByYWRpYW5zKVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG52YXIgdjEgPSBjcmVhdGVWZWN0b3IoMSwgMCwgMCk7XFxudmFyIHYyID0gY3JlYXRlVmVjdG9yKDAsIDEsIDApO1xcblxcbnZhciBhbmdsZSA9IHYxLmFuZ2xlQmV0d2Vlbih2Mik7XFxuLy8gYW5nbGUgaXMgUEkvMlxcbnByaW50KGFuZ2xlKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyNDApO1xcbiAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XFxuXFxuICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoNTAsIDApO1xcbiAgZHJhd0Fycm93KHYwLCB2MSwgJ3JlZCcpO1xcblxcbiAgdmFyIHYyID0gY3JlYXRlVmVjdG9yKG1vdXNlWCAtIDUwLCBtb3VzZVkgLSA1MCk7XFxuICBkcmF3QXJyb3codjAsIHYyLCAnYmx1ZScpO1xcblxcbiAgdmFyIGFuZ2xlQmV0d2VlbiA9IHYxLmFuZ2xlQmV0d2Vlbih2Mik7XFxuICBub1N0cm9rZSgpO1xcbiAgdGV4dChcXG4gICAgJ2FuZ2xlIGJldHdlZW46ICcgK1xcbiAgICAgIGFuZ2xlQmV0d2Vlbi50b0ZpeGVkKDIpICtcXG4gICAgICAnIHJhZGlhbnMgb3IgJyArXFxuICAgICAgZGVncmVlcyhhbmdsZUJldHdlZW4pLnRvRml4ZWQoMikgK1xcbiAgICAgICcgZGVncmVlcycsXFxuICAgIDEwLFxcbiAgICA1MCxcXG4gICAgOTAsXFxuICAgIDUwXFxuICApO1xcbn1cXG5cXG4vLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cXG5mdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XFxuICBwdXNoKCk7XFxuICBzdHJva2UobXlDb2xvcik7XFxuICBzdHJva2VXZWlnaHQoMyk7XFxuICBmaWxsKG15Q29sb3IpO1xcbiAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcXG4gIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcXG4gIHJvdGF0ZSh2ZWMuaGVhZGluZygpKTtcXG4gIHZhciBhcnJvd1NpemUgPSA3O1xcbiAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XFxuICB0cmlhbmdsZSgwLCBhcnJvd1NpemUgLyAyLCAwLCAtYXJyb3dTaXplIC8gMiwgYXJyb3dTaXplLCAwKTtcXG4gIHBvcCgpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExOTgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TGluZWFyIGludGVycG9sYXRlIHRoZSB2ZWN0b3IgdG8gYW5vdGhlciB2ZWN0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJsZXJwXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG52YXIgdiA9IGNyZWF0ZVZlY3RvcigxLCAxLCAwKTtcXG5cXG52LmxlcnAoMywgMywgMCwgMC41KTsgLy8gdiBub3cgaGFzIGNvbXBvbmVudHMgWzIsMiwwXVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHYxID0gY3JlYXRlVmVjdG9yKDAsIDAsIDApO1xcbnZhciB2MiA9IGNyZWF0ZVZlY3RvcigxMDAsIDEwMCwgMCk7XFxuXFxudmFyIHYzID0gcDUuVmVjdG9yLmxlcnAodjEsIHYyLCAwLjUpO1xcbi8vIHYzIGhhcyBjb21wb25lbnRzIFs1MCw1MCwwXVxcbnByaW50KHYzKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgc3RlcCA9IDAuMDE7XFxudmFyIGFtb3VudCA9IDA7XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjQwKTtcXG4gIHZhciB2MCA9IGNyZWF0ZVZlY3RvcigwLCAwKTtcXG5cXG4gIHZhciB2MSA9IGNyZWF0ZVZlY3Rvcihtb3VzZVgsIG1vdXNlWSk7XFxuICBkcmF3QXJyb3codjAsIHYxLCAncmVkJyk7XFxuXFxuICB2YXIgdjIgPSBjcmVhdGVWZWN0b3IoOTAsIDkwKTtcXG4gIGRyYXdBcnJvdyh2MCwgdjIsICdibHVlJyk7XFxuXFxuICBpZiAoYW1vdW50ID4gMSB8fCBhbW91bnQgPCAwKSB7XFxuICAgIHN0ZXAgKj0gLTE7XFxuICB9XFxuICBhbW91bnQgKz0gc3RlcDtcXG4gIHZhciB2MyA9IHA1LlZlY3Rvci5sZXJwKHYxLCB2MiwgYW1vdW50KTtcXG5cXG4gIGRyYXdBcnJvdyh2MCwgdjMsICdwdXJwbGUnKTtcXG59XFxuXFxuLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXFxuZnVuY3Rpb24gZHJhd0Fycm93KGJhc2UsIHZlYywgbXlDb2xvcikge1xcbiAgcHVzaCgpO1xcbiAgc3Ryb2tlKG15Q29sb3IpO1xcbiAgc3Ryb2tlV2VpZ2h0KDMpO1xcbiAgZmlsbChteUNvbG9yKTtcXG4gIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XFxuICBsaW5lKDAsIDAsIHZlYy54LCB2ZWMueSk7XFxuICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XFxuICB2YXIgYXJyb3dTaXplID0gNztcXG4gIHRyYW5zbGF0ZSh2ZWMubWFnKCkgLSBhcnJvd1NpemUsIDApO1xcbiAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XFxuICBwb3AoKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlZlY3RvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxMTk4LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeCBjb21wb25lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeSBjb21wb25lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwielwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgeiBjb21wb25lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW10XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBhbW91bnQgb2YgaW50ZXJwb2xhdGlvbjsgc29tZSB2YWx1ZSBiZXR3ZWVuIDAuMFxcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbGQgdmVjdG9yKSBhbmQgMS4wIChuZXcgdmVjdG9yKS4gMC45IGlzIHZlcnkgbmVhclxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXcgdmVjdG9yLiAwLjUgaXMgaGFsZndheSBpbiBiZXR3ZWVuLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxMjcxLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgcDUuVmVjdG9yIHRvIGxlcnAgdG88L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW10XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE3MTIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGFyZ2V0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmlmIHVuZGVmaW5lZCBhIG5ldyB2ZWN0b3Igd2lsbCBiZSBjcmVhdGVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwic3RhdGljXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE3MjAsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJzdGF0aWNcIjogMSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBsZXJwZWQgdmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyODcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2ZWN0b3IgYXMgYSBmbG9hdCBhcnJheS4gVGhpcyBpcyBvbmx5XFxuZm9yIHRlbXBvcmFyeSB1c2UuIElmIHVzZWQgaW4gYW55IG90aGVyIGZhc2hpb24sIHRoZSBjb250ZW50cyBzaG91bGQgYmVcXG5jb3BpZWQgYnkgdXNpbmcgdGhlIDxiPnA1LlZlY3Rvci5jb3B5KCk8L2I+IG1ldGhvZCB0byBjb3B5IGludG8geW91ciBvd25cXG5hcnJheS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhcnJheVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhbiBBcnJheSB3aXRoIHRoZSAzIHZhbHVlc1wiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcltdXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcyA9IFxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgdiA9IGNyZWF0ZVZlY3RvcigyMCwgMzApO1xcbiAgcHJpbnQodi5hcnJheSgpKTsgLy8gUHJpbnRzIDogQXJyYXkgWzIwLCAzMCwgMF1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG52YXIgdiA9IGNyZWF0ZVZlY3RvcigxMC4wLCAyMC4wLCAzMC4wKTtcXG52YXIgZiA9IHYuYXJyYXkoKTtcXG5wcmludChmWzBdKTsgLy8gUHJpbnRzIFxcXCIxMC4wXFxcIlxcbnByaW50KGZbMV0pOyAvLyBQcmludHMgXFxcIjIwLjBcXFwiXFxucHJpbnQoZlsyXSk7IC8vIFByaW50cyBcXFwiMzAuMFxcXCJcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEzMTksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RXF1YWxpdHkgY2hlY2sgYWdhaW5zdCBhIHA1LlZlY3RvcjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImVxdWFsc1wiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ3aGV0aGVyIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbHNcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcyA9IFxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHYxID0gY3JlYXRlVmVjdG9yKDUsIDEwLCAyMCk7XFxudmFyIHYyID0gY3JlYXRlVmVjdG9yKDUsIDEwLCAyMCk7XFxudmFyIHYzID0gY3JlYXRlVmVjdG9yKDEzLCAxMCwgMTkpO1xcblxcbnByaW50KHYxLmVxdWFscyh2Mi54LCB2Mi55LCB2Mi56KSk7IC8vIHRydWVcXG5wcmludCh2MS5lcXVhbHModjMueCwgdjMueSwgdjMueikpOyAvLyBmYWxzZVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHYxID0gY3JlYXRlVmVjdG9yKDEwLjAsIDIwLjAsIDMwLjApO1xcbnZhciB2MiA9IGNyZWF0ZVZlY3RvcigxMC4wLCAyMC4wLCAzMC4wKTtcXG52YXIgdjMgPSBjcmVhdGVWZWN0b3IoMC4wLCAwLjAsIDAuMCk7XFxucHJpbnQodjEuZXF1YWxzKHYyKSk7IC8vIHRydWVcXG5wcmludCh2MS5lcXVhbHModjMpKTsgLy8gZmFsc2VcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDEzMTksXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB4IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwid2hldGhlciB0aGUgdmVjdG9ycyBhcmUgZXF1YWxzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTM0OSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB2ZWN0b3IgdG8gY29tcGFyZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3J8QXJyYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTM3NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5NYWtlIGEgbmV3IDJEIHZlY3RvciBmcm9tIGFuIGFuZ2xlPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnJvbUFuZ2xlXCIsXG4gICAgICAgICAgICBcInN0YXRpY1wiOiAxLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW5nbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBkZXNpcmVkIGFuZ2xlLCBpbiByYWRpYW5zPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJsZW5ndGhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBsZW5ndGggb2YgdGhlIG5ldyB2ZWN0b3IgKGRlZmF1bHRzIHRvIDEpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIG5ldyBwNS5WZWN0b3Igb2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcblxcbiAgLy8gQ3JlYXRlIGEgdmFyaWFibGUsIHByb3BvcnRpb25hbCB0byB0aGUgbW91c2VYLFxcbiAgLy8gdmFyeWluZyBmcm9tIDAtMzYwLCB0byByZXByZXNlbnQgYW4gYW5nbGUgaW4gZGVncmVlcy5cXG4gIGFuZ2xlTW9kZShERUdSRUVTKTtcXG4gIHZhciBteURlZ3JlZXMgPSBtYXAobW91c2VYLCAwLCB3aWR0aCwgMCwgMzYwKTtcXG5cXG4gIC8vIERpc3BsYXkgdGhhdCB2YXJpYWJsZSBpbiBhbiBvbnNjcmVlbiB0ZXh0LlxcbiAgLy8gKE5vdGUgdGhlIG5mYygpIGZ1bmN0aW9uIHRvIHRydW5jYXRlIGFkZGl0aW9uYWwgZGVjaW1hbCBwbGFjZXMsXFxuICAvLyBhbmQgdGhlIFxcXCJcXFxceEIwXFxcIiBjaGFyYWN0ZXIgZm9yIHRoZSBkZWdyZWUgc3ltYm9sLilcXG4gIHZhciByZWFkb3V0ID0gJ2FuZ2xlID0gJyArIG5mYyhteURlZ3JlZXMsIDEpICsgJ1xcXFx4QjAnO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMCk7XFxuICB0ZXh0KHJlYWRvdXQsIDUsIDE1KTtcXG5cXG4gIC8vIENyZWF0ZSBhIHA1LlZlY3RvciB1c2luZyB0aGUgZnJvbUFuZ2xlIGZ1bmN0aW9uLFxcbiAgLy8gYW5kIGV4dHJhY3QgaXRzIHggYW5kIHkgY29tcG9uZW50cy5cXG4gIHZhciB2ID0gcDUuVmVjdG9yLmZyb21BbmdsZShyYWRpYW5zKG15RGVncmVlcyksIDMwKTtcXG4gIHZhciB2eCA9IHYueDtcXG4gIHZhciB2eSA9IHYueTtcXG5cXG4gIHB1c2goKTtcXG4gIHRyYW5zbGF0ZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbiAgbm9GaWxsKCk7XFxuICBzdHJva2UoMTUwKTtcXG4gIGxpbmUoMCwgMCwgMzAsIDApO1xcbiAgc3Ryb2tlKDApO1xcbiAgbGluZSgwLCAwLCB2eCwgdnkpO1xcbiAgcG9wKCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTQyNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5NYWtlIGEgbmV3IDNEIHZlY3RvciBmcm9tIGEgcGFpciBvZiBJU08gc3BoZXJpY2FsIGFuZ2xlczwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImZyb21BbmdsZXNcIixcbiAgICAgICAgICAgIFwic3RhdGljXCI6IDEsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aGV0YVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHBvbGFyIGFuZ2xlLCBpbiByYWRpYW5zICh6ZXJvIGlzIHVwKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGhpXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgYXppbXV0aGFsIGFuZ2xlLCBpbiByYWRpYW5zXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHplcm8gaXMgb3V0IG9mIHRoZSBzY3JlZW4pPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJsZW5ndGhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBsZW5ndGggb2YgdGhlIG5ldyB2ZWN0b3IgKGRlZmF1bHRzIHRvIDEpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIG5ldyBwNS5WZWN0b3Igb2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBtb2Rlcm5penI9J3dlYmdsJz5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xcbiAgZmlsbCgyNTUpO1xcbiAgbm9TdHJva2UoKTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjU1KTtcXG5cXG4gIHZhciB0ID0gbWlsbGlzKCkgLyAxMDAwO1xcblxcbiAgLy8gYWRkIHRocmVlIHBvaW50IGxpZ2h0c1xcbiAgcG9pbnRMaWdodChjb2xvcignI2YwMCcpLCBwNS5WZWN0b3IuZnJvbUFuZ2xlcyh0ICogMS4wLCB0ICogMS4zLCAxMDApKTtcXG4gIHBvaW50TGlnaHQoY29sb3IoJyMwZjAnKSwgcDUuVmVjdG9yLmZyb21BbmdsZXModCAqIDEuMSwgdCAqIDEuMiwgMTAwKSk7XFxuICBwb2ludExpZ2h0KGNvbG9yKCcjMDBmJyksIHA1LlZlY3Rvci5mcm9tQW5nbGVzKHQgKiAxLjIsIHQgKiAxLjEsIDEwMCkpO1xcblxcbiAgc3BoZXJlKDM1KTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlZlY3RvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9wNS5WZWN0b3IuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNDc1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk1ha2UgYSBuZXcgMkQgdW5pdCB2ZWN0b3IgZnJvbSBhIHJhbmRvbSBhbmdsZTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJhbmRvbTJEXCIsXG4gICAgICAgICAgICBcInN0YXRpY1wiOiAxLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbmV3IHA1LlZlY3RvciBvYmplY3RcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5WZWN0b3JcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPVxcXCJub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHYgPSBwNS5WZWN0b3IucmFuZG9tMkQoKTtcXG4vLyBNYXkgbWFrZSB2J3MgYXR0cmlidXRlcyBzb21ldGhpbmcgbGlrZTpcXG4vLyBbMC42MTU1NDYxNywgLTAuNTExOTU3NjUsIDAuMF0gb3JcXG4vLyBbLTAuNDY5NTg0MSwgLTAuMTQzNjY3MzEsIDAuMF0gb3JcXG4vLyBbMC42MDkxMDk3LCAtMC4yMjgwNTI3OCwgMC4wXVxcbnByaW50KHYpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgZnJhbWVSYXRlKDEpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyNDApO1xcblxcbiAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XFxuICB2YXIgdjEgPSBwNS5WZWN0b3IucmFuZG9tMkQoKTtcXG4gIGRyYXdBcnJvdyh2MCwgdjEubXVsdCg1MCksICdibGFjaycpO1xcbn1cXG5cXG4vLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cXG5mdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XFxuICBwdXNoKCk7XFxuICBzdHJva2UobXlDb2xvcik7XFxuICBzdHJva2VXZWlnaHQoMyk7XFxuICBmaWxsKG15Q29sb3IpO1xcbiAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcXG4gIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcXG4gIHJvdGF0ZSh2ZWMuaGVhZGluZygpKTtcXG4gIHZhciBhcnJvd1NpemUgPSA3O1xcbiAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XFxuICB0cmlhbmdsZSgwLCBhcnJvd1NpemUgLyAyLCAwLCAtYXJyb3dTaXplIC8gMiwgYXJyb3dTaXplLCAwKTtcXG4gIHBvcCgpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE1MjgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TWFrZSBhIG5ldyByYW5kb20gM0QgdW5pdCB2ZWN0b3IuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFuZG9tM0RcIixcbiAgICAgICAgICAgIFwic3RhdGljXCI6IDEsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBuZXcgcDUuVmVjdG9yIG9iamVjdFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG52YXIgdiA9IHA1LlZlY3Rvci5yYW5kb20zRCgpO1xcbi8vIE1heSBtYWtlIHYncyBhdHRyaWJ1dGVzIHNvbWV0aGluZyBsaWtlOlxcbi8vIFswLjYxNTU0NjE3LCAtMC41MTE5NTc2NSwgMC41OTkxNjhdIG9yXFxuLy8gWy0wLjQ2OTU4NDEsIC0wLjE0MzY2NzMxLCAtMC44NzExMjAyXSBvclxcbi8vIFswLjYwOTEwOTcsIC0wLjIyODA1Mjc4LCAtMC43NTk1OTAyXVxcbnByaW50KHYpO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTYxMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5NdWx0aXBsaWVzIGEgdmVjdG9yIGJ5IGEgc2NhbGFyIGFuZCByZXR1cm5zIGEgbmV3IHZlY3Rvci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2MzgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RGl2aWRlcyBhIHZlY3RvciBieSBhIHNjYWxhciBhbmQgcmV0dXJucyBhIG5ldyB2ZWN0b3IuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlZlY3RvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC9wNS5WZWN0b3IuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNjY1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTY3OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DYWxjdWxhdGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5WZWN0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvcDUuVmVjdG9yLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTY5MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DYWxjdWxhdGVzIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzIChjb25zaWRlcmluZyBhXFxucG9pbnQgYXMgYSB2ZWN0b3Igb2JqZWN0KS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3A1LlZlY3Rvci5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE3MDgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TGluZWFyIGludGVycG9sYXRlIGEgdmVjdG9yIHRvIGFub3RoZXIgdmVjdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhXFxubmV3IHZlY3Rvci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuVmVjdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0aFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3JhbmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldHMgdGhlIHNlZWQgdmFsdWUgZm9yIHJhbmRvbSgpLjwvcD5cXG48cD5CeSBkZWZhdWx0LCByYW5kb20oKSBwcm9kdWNlcyBkaWZmZXJlbnQgcmVzdWx0cyBlYWNoIHRpbWUgdGhlIHByb2dyYW1cXG5pcyBydW4uIFNldCB0aGUgc2VlZCBwYXJhbWV0ZXIgdG8gYSBjb25zdGFudCB0byByZXR1cm4gdGhlIHNhbWVcXG5wc2V1ZG8tcmFuZG9tIG51bWJlcnMgZWFjaCB0aW1lIHRoZSBzb2Z0d2FyZSBpcyBydW4uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFuZG9tU2VlZFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2VlZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHNlZWQgdmFsdWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnJhbmRvbVNlZWQoOTkpO1xcbmZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyBpKyspIHtcXG4gIHZhciByID0gcmFuZG9tKDAsIDI1NSk7XFxuICBzdHJva2Uocik7XFxuICBsaW5lKGksIDAsIGksIDEwMCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwibWFueSB2ZXJ0aWNhbCBsaW5lcyBkcmF3biBpbiB3aGl0ZSwgYmxhY2sgb3IgZ3JleS5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlJhbmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3JhbmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybiBhIHJhbmRvbSBmbG9hdGluZy1wb2ludCBudW1iZXIuPC9wPlxcbjxwPlRha2VzIGVpdGhlciAwLCAxIG9yIDIgYXJndW1lbnRzLjwvcD5cXG48cD5JZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJucyBhIHJhbmRvbSBudW1iZXIgZnJvbSAwXFxudXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSAxLjwvcD5cXG48cD5JZiBvbmUgYXJndW1lbnQgaXMgZ2l2ZW4gYW5kIGl0IGlzIGEgbnVtYmVyLCByZXR1cm5zIGEgcmFuZG9tIG51bWJlciBmcm9tIDBcXG51cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZSBudW1iZXIuPC9wPlxcbjxwPklmIG9uZSBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQgaXMgYW4gYXJyYXksIHJldHVybnMgYSByYW5kb20gZWxlbWVudCBmcm9tXFxudGhhdCBhcnJheS48L3A+XFxuPHA+SWYgdHdvIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHJldHVybnMgYSByYW5kb20gbnVtYmVyIGZyb20gdGhlXFxuZmlyc3QgYXJndW1lbnQgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgc2Vjb25kIGFyZ3VtZW50LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJhbmRvbVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgcmFuZG9tIG51bWJlclwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZm9yICh2YXIgaSA9IDA7IGkgPCAxMDA7IGkrKykge1xcbiAgdmFyIHIgPSByYW5kb20oNTApO1xcbiAgc3Ryb2tlKHIgKiA1KTtcXG4gIGxpbmUoNTAsIGksIDUwICsgciwgaSk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG48ZGl2Plxcbjxjb2RlPlxcbmZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyBpKyspIHtcXG4gIHZhciByID0gcmFuZG9tKC01MCwgNTApO1xcbiAgbGluZSg1MCwgaSwgNTAgKyByLCBpKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gR2V0IGEgcmFuZG9tIGVsZW1lbnQgZnJvbSBhbiBhcnJheSB1c2luZyB0aGUgcmFuZG9tKEFycmF5KSBzeW50YXhcXG52YXIgd29yZHMgPSBbJ2FwcGxlJywgJ2JlYXInLCAnY2F0JywgJ2RvZyddO1xcbnZhciB3b3JkID0gcmFuZG9tKHdvcmRzKTsgLy8gc2VsZWN0IHJhbmRvbSB3b3JkXFxudGV4dCh3b3JkLCAxMCwgNTApOyAvLyBkcmF3IHRoZSB3b3JkXFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCIxMDAgaG9yaXpvbnRhbCBsaW5lcyBmcm9tIGNlbnRlciBjYW52YXMgdG8gcmlnaHQuIHNpemUrZmlsbCBjaGFuZ2UgZWFjaCB0aW1lXFxuMTAwIGhvcml6b250YWwgbGluZXMgZnJvbSBjZW50ZXIgb2YgY2FudmFzLiBoZWlnaHQgJiBzaWRlIGNoYW5nZSBlYWNoIHJlbmRlclxcbndvcmQgZGlzcGxheWVkIGF0IHJhbmRvbS4gRWl0aGVyIGFwcGxlLCBiZWFyLCBjYXQsIG9yIGRvZ1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiUmFuZG9tXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNzksXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIGxvd2VyIGJvdW5kIChpbmNsdXNpdmUpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHVwcGVyIGJvdW5kIChleGNsdXNpdmUpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHJhbmRvbSBudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDEzMyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNob2ljZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIGFycmF5IHRvIGNob29zZSBmcm9tPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSByYW5kb20gZWxlbWVudCBmcm9tIHRoZSBhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiKlwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3JhbmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2NixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIGEgcmFuZG9tIG51bWJlciBmaXR0aW5nIGEgR2F1c3NpYW4sIG9yXFxuIG5vcm1hbCwgZGlzdHJpYnV0aW9uLiBUaGVyZSBpcyB0aGVvcmV0aWNhbGx5IG5vIG1pbmltdW0gb3IgbWF4aW11bVxcbiB2YWx1ZSB0aGF0IHJhbmRvbUdhdXNzaWFuKCkgbWlnaHQgcmV0dXJuLiBSYXRoZXIsIHRoZXJlIGlzXFxuIGp1c3QgYSB2ZXJ5IGxvdyBwcm9iYWJpbGl0eSB0aGF0IHZhbHVlcyBmYXIgZnJvbSB0aGUgbWVhbiB3aWxsIGJlXFxuIHJldHVybmVkOyBhbmQgYSBoaWdoZXIgcHJvYmFiaWxpdHkgdGhhdCBudW1iZXJzIG5lYXIgdGhlIG1lYW4gd2lsbFxcbiBiZSByZXR1cm5lZC5cXG4gPGJyPjxicj5cXG4gVGFrZXMgZWl0aGVyIDAsIDEgb3IgMiBhcmd1bWVudHMuPGJyPlxcbiBJZiBubyBhcmdzLCByZXR1cm5zIGEgbWVhbiBvZiAwIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMS48YnI+XFxuIElmIG9uZSBhcmcsIHRoYXQgYXJnIGlzIHRoZSBtZWFuIChzdGFuZGFyZCBkZXZpYXRpb24gaXMgMSkuPGJyPlxcbiBJZiB0d28gYXJncywgZmlyc3QgaXMgbWVhbiwgc2Vjb25kIGlzIHN0YW5kYXJkIGRldmlhdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyYW5kb21HYXVzc2lhblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibWVhblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIG1lYW48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgc3RhbmRhcmQgZGV2aWF0aW9uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSByYW5kb20gbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXY+XFxuIDxjb2RlPlxcbiBmb3IgKHZhciB5ID0gMDsgeSA8IDEwMDsgeSsrKSB7XFxuICAgdmFyIHggPSByYW5kb21HYXVzc2lhbig1MCwgMTUpO1xcbiAgIGxpbmUoNTAsIHksIHgsIHkpO1xcbiB9XFxuIDwvY29kZT5cXG4gPC9kaXY+XFxuIDxkaXY+XFxuIDxjb2RlPlxcbiB2YXIgZGlzdHJpYnV0aW9uID0gbmV3IEFycmF5KDM2MCk7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3RyaWJ1dGlvbi5sZW5ndGg7IGkrKykge1xcbiAgICAgZGlzdHJpYnV0aW9uW2ldID0gZmxvb3IocmFuZG9tR2F1c3NpYW4oMCwgMTUpKTtcXG4gICB9XFxuIH1cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgIGJhY2tncm91bmQoMjA0KTtcXG4gIHRyYW5zbGF0ZSh3aWR0aCAvIDIsIHdpZHRoIC8gMik7XFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3RyaWJ1dGlvbi5sZW5ndGg7IGkrKykge1xcbiAgICAgcm90YXRlKFRXT19QSSAvIGRpc3RyaWJ1dGlvbi5sZW5ndGgpO1xcbiAgICAgc3Ryb2tlKDApO1xcbiAgICAgdmFyIGRpc3QgPSBhYnMoZGlzdHJpYnV0aW9uW2ldKTtcXG4gICAgIGxpbmUoMCwgMCwgZGlzdCwgMCk7XFxuICAgfVxcbiB9XFxuIDwvY29kZT5cXG4gPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIjEwMCBob3Jpem9udGFsIGxpbmVzIGZyb20gY2VudGVyIG9mIGNhbnZhcy4gaGVpZ2h0ICYgc2lkZSBjaGFuZ2UgZWFjaCByZW5kZXJcXG4gYmxhY2sgbGluZXMgcmFkaWF0ZSBmcm9tIGNlbnRlciBvZiBjYW52YXMuIHNpemUgZGV0ZXJtaW5lZCBlYWNoIHJlbmRlclwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiUmFuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvdHJpZ29ub21ldHJ5LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGludmVyc2Ugb2YgY29zKCksIHJldHVybnMgdGhlIGFyYyBjb3NpbmUgb2YgYSB2YWx1ZS4gVGhpcyBmdW5jdGlvblxcbmV4cGVjdHMgdGhlIHZhbHVlcyBpbiB0aGUgcmFuZ2Ugb2YgLTEgdG8gMSBhbmQgdmFsdWVzIGFyZSByZXR1cm5lZCBpblxcbnRoZSByYW5nZSAwIHRvIFBJICgzLjE0MTU5MjcpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFjb3NcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgdmFsdWUgd2hvc2UgYXJjIGNvc2luZSBpcyB0byBiZSByZXR1cm5lZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgYXJjIGNvc2luZSBvZiB0aGUgZ2l2ZW4gdmFsdWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSDigJxub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIGEgPSBQSTtcXG52YXIgYyA9IGNvcyhhKTtcXG52YXIgYWMgPSBhY29zKGMpO1xcbi8vIFByaW50czogXFxcIjMuMTQxNTkyNyA6IC0xLjAgOiAzLjE0MTU5MjdcXFwiXFxucHJpbnQoYSArICcgOiAnICsgYyArICcgOiAnICsgYWMpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2IGNsYXNzPSDigJxub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIGEgPSBQSSArIFBJIC8gNC4wO1xcbnZhciBjID0gY29zKGEpO1xcbnZhciBhYyA9IGFjb3MoYyk7XFxuLy8gUHJpbnRzOiBcXFwiMy45MjY5OTEgOiAtMC43MDcxMDY2NSA6IDIuMzU2MTk0M1xcXCJcXG5wcmludChhICsgJyA6ICcgKyBjICsgJyA6ICcgKyBhYyk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVHJpZ29ub21ldHJ5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvdHJpZ29ub21ldHJ5LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGludmVyc2Ugb2Ygc2luKCksIHJldHVybnMgdGhlIGFyYyBzaW5lIG9mIGEgdmFsdWUuIFRoaXMgZnVuY3Rpb25cXG5leHBlY3RzIHRoZSB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIC0xIHRvIDEgYW5kIHZhbHVlcyBhcmUgcmV0dXJuZWRcXG5pbiB0aGUgcmFuZ2UgLVBJLzIgdG8gUEkvMi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhc2luXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHZhbHVlIHdob3NlIGFyYyBzaW5lIGlzIHRvIGJlIHJldHVybmVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBhcmMgc2luZSBvZiB0aGUgZ2l2ZW4gdmFsdWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSDigJxub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIGEgPSBQSSArIFBJIC8gMztcXG52YXIgcyA9IHNpbihhKTtcXG52YXIgYXMgPSBhc2luKHMpO1xcbi8vIFByaW50czogXFxcIjEuMDQ3MTk3NiA6IDAuODY2MDI1NDUgOiAxLjA0NzE5NzZcXFwiXFxucHJpbnQoYSArICcgOiAnICsgcyArICcgOiAnICsgYXMpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2IGNsYXNzPSDigJxub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIGEgPSBQSSArIFBJIC8gMy4wO1xcbnZhciBzID0gc2luKGEpO1xcbnZhciBhcyA9IGFzaW4ocyk7XFxuLy8gUHJpbnRzOiBcXFwiNC4xODg3OTAzIDogLTAuODY2MDI1NDUgOiAtMS4wNDcxOTc2XFxcIlxcbnByaW50KGEgKyAnIDogJyArIHMgKyAnIDogJyArIGFzKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUcmlnb25vbWV0cnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC90cmlnb25vbWV0cnkuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgaW52ZXJzZSBvZiB0YW4oKSwgcmV0dXJucyB0aGUgYXJjIHRhbmdlbnQgb2YgYSB2YWx1ZS4gVGhpcyBmdW5jdGlvblxcbmV4cGVjdHMgdGhlIHZhbHVlcyBpbiB0aGUgcmFuZ2Ugb2YgLUluZmluaXR5IHRvIEluZmluaXR5IChleGNsdXNpdmUpIGFuZFxcbnZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gdGhlIHJhbmdlIC1QSS8yIHRvIFBJLzIuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXRhblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSB2YWx1ZSB3aG9zZSBhcmMgdGFuZ2VudCBpcyB0byBiZSByZXR1cm5lZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgYXJjIHRhbmdlbnQgb2YgdGhlIGdpdmVuIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0g4oCcbm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbnZhciBhID0gUEkgKyBQSSAvIDM7XFxudmFyIHQgPSB0YW4oYSk7XFxudmFyIGF0ID0gYXRhbih0KTtcXG4vLyBQcmludHM6IFxcXCIxLjA0NzE5NzYgOiAxLjczMjA1MDkgOiAxLjA0NzE5NzZcXFwiXFxucHJpbnQoYSArICcgOiAnICsgdCArICcgOiAnICsgYXQpO1xcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2IGNsYXNzPSDigJxub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIGEgPSBQSSArIFBJIC8gMy4wO1xcbnZhciB0ID0gdGFuKGEpO1xcbnZhciBhdCA9IGF0YW4odCk7XFxuLy8gUHJpbnRzOiBcXFwiNC4xODg3OTAzIDogMS43MzIwNTEzIDogMS4wNDcxOTc3XFxcIlxcbnByaW50KGEgKyAnIDogJyArIHQgKyAnIDogJyArIGF0KTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUcmlnb25vbWV0cnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC90cmlnb25vbWV0cnkuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2FsY3VsYXRlcyB0aGUgYW5nbGUgKGluIHJhZGlhbnMpIGZyb20gYSBzcGVjaWZpZWQgcG9pbnQgdG8gdGhlIGNvb3JkaW5hdGVcXG5vcmlnaW4gYXMgbWVhc3VyZWQgZnJvbSB0aGUgcG9zaXRpdmUgeC1heGlzLiBWYWx1ZXMgYXJlIHJldHVybmVkIGFzIGFcXG5mbG9hdCBpbiB0aGUgcmFuZ2UgZnJvbSBQSSB0byAtUEkuIFRoZSBhdGFuMigpIGZ1bmN0aW9uIGlzIG1vc3Qgb2Z0ZW4gdXNlZFxcbmZvciBvcmllbnRpbmcgZ2VvbWV0cnkgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuXFxuPGJyPjxicj5cXG5Ob3RlOiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludCBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCBhbmQgdGhlXFxueC1jb29yZGluYXRlIGlzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLCBkdWUgdGhlIHRoZSBzdHJ1Y3R1cmUgb2YgY2FsY3VsYXRpbmdcXG50aGUgdGFuZ2VudC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhdGFuMlwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1jb29yZGluYXRlIG9mIHRoZSBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRoZSBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgYXJjIHRhbmdlbnQgb2YgdGhlIGdpdmVuIHBvaW50XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDQpO1xcbiAgdHJhbnNsYXRlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxuICB2YXIgYSA9IGF0YW4yKG1vdXNlWSAtIGhlaWdodCAvIDIsIG1vdXNlWCAtIHdpZHRoIC8gMik7XFxuICByb3RhdGUoYSk7XFxuICByZWN0KC0zMCwgLTUsIDYwLCAxMCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiNjAgYnkgMTAgcmVjdCBhdCBjZW50ZXIgb2YgY2FudmFzIHJvdGF0ZXMgd2l0aCBtb3VzZSBtb3ZlbWVudHNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRyaWdvbm9tZXRyeVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3RyaWdvbm9tZXRyeS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DYWxjdWxhdGVzIHRoZSBjb3NpbmUgb2YgYW4gYW5nbGUuIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW50byBhY2NvdW50IHRoZVxcbmN1cnJlbnQgYW5nbGVNb2RlLiBWYWx1ZXMgYXJlIHJldHVybmVkIGluIHRoZSByYW5nZSAtMSB0byAxLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNvc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW5nbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBhbmdsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgY29zaW5lIG9mIHRoZSBhbmdsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGEgPSAwLjA7XFxudmFyIGluYyA9IFRXT19QSSAvIDI1LjA7XFxuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTsgaSsrKSB7XFxuICBsaW5lKGkgKiA0LCA1MCwgaSAqIDQsIDUwICsgY29zKGEpICogNDAuMCk7XFxuICBhID0gYSArIGluYztcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ2ZXJ0aWNhbCBibGFjayBsaW5lcyBmb3JtIHdhdmUgcGF0dGVybnMsIGV4dGVuZC1kb3duIG9uIGxlZnQgYW5kIHJpZ2h0IHNpZGVcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRyaWdvbm9tZXRyeVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3RyaWdvbm9tZXRyeS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE4OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DYWxjdWxhdGVzIHRoZSBzaW5lIG9mIGFuIGFuZ2xlLiBUaGlzIGZ1bmN0aW9uIHRha2VzIGludG8gYWNjb3VudCB0aGVcXG5jdXJyZW50IGFuZ2xlTW9kZS4gVmFsdWVzIGFyZSByZXR1cm5lZCBpbiB0aGUgcmFuZ2UgLTEgdG8gMS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzaW5cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFuZ2xlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgYW5nbGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHNpbmUgb2YgdGhlIGFuZ2xlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgYSA9IDAuMDtcXG52YXIgaW5jID0gVFdPX1BJIC8gMjUuMDtcXG5mb3IgKHZhciBpID0gMDsgaSA8IDI1OyBpKyspIHtcXG4gIGxpbmUoaSAqIDQsIDUwLCBpICogNCwgNTAgKyBzaW4oYSkgKiA0MC4wKTtcXG4gIGEgPSBhICsgaW5jO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInZlcnRpY2FsIGJsYWNrIGxpbmVzIGV4dGVuZCBkb3duIGFuZCB1cCBmcm9tIGNlbnRlciB0byBmb3JtIHdhdmUgcGF0dGVyblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVHJpZ29ub21ldHJ5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvdHJpZ29ub21ldHJ5LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjE2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgdGhlIHRhbmdlbnQgb2YgYW4gYW5nbGUuIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW50byBhY2NvdW50XFxudGhlIGN1cnJlbnQgYW5nbGVNb2RlLiBWYWx1ZXMgYXJlIHJldHVybmVkIGluIHRoZSByYW5nZSAtMSB0byAxLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRhblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW5nbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBhbmdsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgdGFuZ2VudCBvZiB0aGUgYW5nbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBhID0gMC4wO1xcbnZhciBpbmMgPSBUV09fUEkgLyA1MC4wO1xcbmZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyBpID0gaSArIDIpIHtcXG4gIGxpbmUoaSwgNTAsIGksIDUwICsgdGFuKGEpICogMi4wKTtcXG4gIGEgPSBhICsgaW5jO1xcbn1cXG48L2NvZGU+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInZlcnRpY2FsIGJsYWNrIGxpbmVzIGVuZCBkb3duIGFuZCB1cCBmcm9tIGNlbnRlciB0byBmb3JtIHNwaWtlIHBhdHRlcm5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJNYXRoXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRyaWdvbm9tZXRyeVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy9tYXRoL3RyaWdvbm9tZXRyeS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI0NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db252ZXJ0cyBhIHJhZGlhbiBtZWFzdXJlbWVudCB0byBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBkZWdyZWVzLlxcblJhZGlhbnMgYW5kIGRlZ3JlZXMgYXJlIHR3byB3YXlzIG9mIG1lYXN1cmluZyB0aGUgc2FtZSB0aGluZy4gVGhlcmUgYXJlXFxuMzYwIGRlZ3JlZXMgaW4gYSBjaXJjbGUgYW5kIDIqUEkgcmFkaWFucyBpbiBhIGNpcmNsZS4gRm9yIGV4YW1wbGUsXFxuOTDCsCA9IFBJLzIgPSAxLjU3MDc5NjQuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlXFxuY3VycmVudCBhbmdsZU1vZGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGVncmVlc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFkaWFuc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHJhZGlhbnMgdmFsdWUgdG8gY29udmVydCB0byBkZWdyZWVzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBjb252ZXJ0ZWQgYW5nbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSDigJxub3JlbmRlclxcXCI+XFxuPGNvZGU+XFxudmFyIHJhZCA9IFBJIC8gNDtcXG52YXIgZGVnID0gZGVncmVlcyhyYWQpO1xcbnByaW50KHJhZCArICcgcmFkaWFucyBpcyAnICsgZGVnICsgJyBkZWdyZWVzJyk7XFxuLy8gUHJpbnRzOiAwLjc4NTM5ODE2MzM5NzQ0ODMgcmFkaWFucyBpcyA0NSBkZWdyZWVzXFxuPC9jb2RlPlxcbjwvZGl2PlxcblwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVHJpZ29ub21ldHJ5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL21hdGgvdHJpZ29ub21ldHJ5LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjcxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnZlcnRzIGEgZGVncmVlIG1lYXN1cmVtZW50IHRvIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHJhZGlhbnMuXFxuUmFkaWFucyBhbmQgZGVncmVlcyBhcmUgdHdvIHdheXMgb2YgbWVhc3VyaW5nIHRoZSBzYW1lIHRoaW5nLiBUaGVyZSBhcmVcXG4zNjAgZGVncmVlcyBpbiBhIGNpcmNsZSBhbmQgMipQSSByYWRpYW5zIGluIGEgY2lyY2xlLiBGb3IgZXhhbXBsZSxcXG45MMKwID0gUEkvMiA9IDEuNTcwNzk2NC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGVcXG5jdXJyZW50IGFuZ2xlTW9kZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyYWRpYW5zXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZWdyZWVzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgZGVncmVlIHZhbHVlIHRvIGNvbnZlcnQgdG8gcmFkaWFuczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgY29udmVydGVkIGFuZ2xlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0g4oCcbm9yZW5kZXJcXFwiPlxcbjxjb2RlPlxcbnZhciBkZWcgPSA0NS4wO1xcbnZhciByYWQgPSByYWRpYW5zKGRlZyk7XFxucHJpbnQoZGVnICsgJyBkZWdyZWVzIGlzICcgKyByYWQgKyAnIHJhZGlhbnMnKTtcXG4vLyBQcmludHM6IDQ1IGRlZ3JlZXMgaXMgMC43ODUzOTgxNjMzOTc0NDgzIHJhZGlhbnNcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTWF0aFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUcmlnb25vbWV0cnlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvbWF0aC90cmlnb25vbWV0cnkuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyOTYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyB0aGUgY3VycmVudCBtb2RlIG9mIHA1IHRvIGdpdmVuIG1vZGUuIERlZmF1bHQgbW9kZSBpcyBSQURJQU5TLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFuZ2xlTW9kZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibW9kZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZWl0aGVyIFJBRElBTlMgb3IgREVHUkVFUzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29uc3RhbnRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDQpO1xcbiAgYW5nbGVNb2RlKERFR1JFRVMpOyAvLyBDaGFuZ2UgdGhlIG1vZGUgdG8gREVHUkVFU1xcbiAgdmFyIGEgPSBhdGFuMihtb3VzZVkgLSBoZWlnaHQgLyAyLCBtb3VzZVggLSB3aWR0aCAvIDIpO1xcbiAgdHJhbnNsYXRlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxuICBwdXNoKCk7XFxuICByb3RhdGUoYSk7XFxuICByZWN0KC0yMCwgLTUsIDQwLCAxMCk7IC8vIExhcmdlciByZWN0YW5nbGUgaXMgcm90YXRpbmcgaW4gZGVncmVlc1xcbiAgcG9wKCk7XFxuICBhbmdsZU1vZGUoUkFESUFOUyk7IC8vIENoYW5nZSB0aGUgbW9kZSB0byBSQURJQU5TXFxuICByb3RhdGUoYSk7IC8vIHZhciBhIHN0YXlzIHRoZSBzYW1lXFxuICByZWN0KC00MCwgLTUsIDIwLCAxMCk7IC8vIFNtYWxsZXIgcmVjdGFuZ2xlIGlzIHJvdGF0aW5nIGluIHJhZGlhbnNcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCI0MCBieSAxMCByZWN0IGluIGNlbnRlciByb3RhdGVzIHdpdGggbW91c2UgbW92ZXMuIDIwIGJ5IDEwIHJlY3QgbW92ZXMgZmFzdGVyLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIk1hdGhcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVHJpZ29ub21ldHJ5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3R5cG9ncmFwaHkvYXR0cmlidXRlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldHMgdGhlIGN1cnJlbnQgYWxpZ25tZW50IGZvciBkcmF3aW5nIHRleHQuIEFjY2VwdHMgdHdvXFxuYXJndW1lbnRzOiBob3JpekFsaWduIChMRUZULCBDRU5URVIsIG9yIFJJR0hUKSBhbmRcXG52ZXJ0QWxpZ24gKFRPUCwgQk9UVE9NLCBDRU5URVIsIG9yIEJBU0VMSU5FKS48L3A+XFxuPHA+VGhlIGhvcml6QWxpZ24gcGFyYW1ldGVyIGlzIGluIHJlZmVyZW5jZSB0byB0aGUgeCB2YWx1ZVxcbm9mIHRoZSB0ZXh0KCkgZnVuY3Rpb24sIHdoaWxlIHRoZSB2ZXJ0QWxpZ24gcGFyYW1ldGVyIGlzXFxuaW4gcmVmZXJlbmNlIHRvIHRoZSB5IHZhbHVlLjwvcD5cXG48cD5TbyBpZiB5b3Ugd3JpdGUgdGV4dEFsaWduKExFRlQpLCB5b3UgYXJlIGFsaWduaW5nIHRoZSBsZWZ0XFxuZWRnZSBvZiB5b3VyIHRleHQgdG8gdGhlIHggdmFsdWUgeW91IGdpdmUgaW4gdGV4dCgpLiBJZiB5b3VcXG53cml0ZSB0ZXh0QWxpZ24oUklHSFQsIFRPUCksIHlvdSBhcmUgYWxpZ25pbmcgdGhlIHJpZ2h0IGVkZ2VcXG5vZiB5b3VyIHRleHQgdG8gdGhlIHggdmFsdWUgYW5kIHRoZSB0b3Agb2YgZWRnZSBvZiB0aGUgdGV4dFxcbnRvIHRoZSB5IHZhbHVlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRleHRBbGlnblwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnRleHRTaXplKDE2KTtcXG50ZXh0QWxpZ24oUklHSFQpO1xcbnRleHQoJ0FCQ0QnLCA1MCwgMzApO1xcbnRleHRBbGlnbihDRU5URVIpO1xcbnRleHQoJ0VGR0gnLCA1MCwgNTApO1xcbnRleHRBbGlnbihMRUZUKTtcXG50ZXh0KCdJSktMJywgNTAsIDcwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIkxldHRlcnMgQUJDRCBkaXNwbGF5ZWQgYXQgdG9wIHJpZ2h0LCBFRkdIIGF0IGNlbnRlciBhbmQgSUpLTCBhdCBib3R0b20gbGVmdC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUeXBvZ3JhcGh5XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkF0dHJpYnV0ZXNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxMyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhvcml6QWxpZ25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aG9yaXpvbnRhbCBhbGlnbm1lbnQsIGVpdGhlciBMRUZULFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTlRFUiwgb3IgUklHSFQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29uc3RhbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2ZXJ0QWxpZ25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmVydGljYWwgYWxpZ25tZW50LCBlaXRoZXIgVE9QLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPVFRPTSwgQ0VOVEVSLCBvciBCQVNFTElORTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJDb25zdGFudFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA1MSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW10sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy90eXBvZ3JhcGh5L2F0dHJpYnV0ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXRzL2dldHMgdGhlIHNwYWNpbmcsIGluIHBpeGVscywgYmV0d2VlbiBsaW5lcyBvZiB0ZXh0LiBUaGlzXFxuc2V0dGluZyB3aWxsIGJlIHVzZWQgaW4gYWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRleHQoKSBmdW5jdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0ZXh0TGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbi8vIFRleHQgdG8gZGlzcGxheS4gVGhlIFxcXCJcXFxcblxcXCIgaXMgYSBcXFwibmV3IGxpbmVcXFwiIGNoYXJhY3RlclxcbnZhciBsaW5lcyA9ICdMMVxcXFxuTDJcXFxcbkwzJztcXG50ZXh0U2l6ZSgxMik7XFxuXFxudGV4dExlYWRpbmcoMTApOyAvLyBTZXQgbGVhZGluZyB0byAxMFxcbnRleHQobGluZXMsIDEwLCAyNSk7XFxuXFxudGV4dExlYWRpbmcoMjApOyAvLyBTZXQgbGVhZGluZyB0byAyMFxcbnRleHQobGluZXMsIDQwLCAyNSk7XFxuXFxudGV4dExlYWRpbmcoMzApOyAvLyBTZXQgbGVhZGluZyB0byAzMFxcbnRleHQobGluZXMsIDcwLCAyNSk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJzZXQgTDEgTDIgJiBMMyBkaXNwbGF5ZWQgdmVydGljYWxseSAzIHRpbWVzLiBzcGFjaW5nIGluY3JlYXNlcyBmb3IgZWFjaCBzZXRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUeXBvZ3JhcGh5XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkF0dHJpYnV0ZXNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA2MCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImxlYWRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHNpemUgaW4gcGl4ZWxzIGZvciBzcGFjaW5nIGJldHdlZW4gbGluZXM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogODksXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdHlwb2dyYXBoeS9hdHRyaWJ1dGVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cy9nZXRzIHRoZSBjdXJyZW50IGZvbnQgc2l6ZS4gVGhpcyBzaXplIHdpbGwgYmUgdXNlZCBpbiBhbGwgc3Vic2VxdWVudFxcbmNhbGxzIHRvIHRoZSB0ZXh0KCkgZnVuY3Rpb24uIEZvbnQgc2l6ZSBpcyBtZWFzdXJlZCBpbiBwaXhlbHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidGV4dFNpemVcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG50ZXh0U2l6ZSgxMik7XFxudGV4dCgnRm9udCBTaXplIDEyJywgMTAsIDMwKTtcXG50ZXh0U2l6ZSgxNCk7XFxudGV4dCgnRm9udCBTaXplIDE0JywgMTAsIDYwKTtcXG50ZXh0U2l6ZSgxNik7XFxudGV4dCgnRm9udCBTaXplIDE2JywgMTAsIDkwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIkZvbnQgU2l6ZSAxMiBkaXNwbGF5ZWQgc21hbGwsIEZvbnQgU2l6ZSAxNCBtZWRpdW0gJiBGb250IFNpemUgMTYgbGFyZ2VcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUeXBvZ3JhcGh5XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkF0dHJpYnV0ZXNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA5OCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRoZVNpemVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHNpemUgb2YgdGhlIGxldHRlcnMgaW4gdW5pdHMgb2YgcGl4ZWxzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDEyMSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW10sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy90eXBvZ3JhcGh5L2F0dHJpYnV0ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMzAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cy9nZXRzIHRoZSBzdHlsZSBvZiB0aGUgdGV4dCBmb3Igc3lzdGVtIGZvbnRzIHRvIE5PUk1BTCwgSVRBTElDLCBvciBCT0xELlxcbk5vdGU6IHRoaXMgbWF5IGJlIGlzIG92ZXJyaWRkZW4gYnkgQ1NTIHN0eWxpbmcuIEZvciBub24tc3lzdGVtIGZvbnRzXFxuKG9wZW50eXBlLCB0cnVldHlwZSwgZXRjLikgcGxlYXNlIGxvYWQgc3R5bGVkIGZvbnRzIGluc3RlYWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidGV4dFN0eWxlXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuc3Ryb2tlV2VpZ2h0KDApO1xcbnRleHRTaXplKDEyKTtcXG50ZXh0U3R5bGUoTk9STUFMKTtcXG50ZXh0KCdGb250IFN0eWxlIE5vcm1hbCcsIDEwLCAzMCk7XFxudGV4dFN0eWxlKElUQUxJQyk7XFxudGV4dCgnRm9udCBTdHlsZSBJdGFsaWMnLCAxMCwgNjApO1xcbnRleHRTdHlsZShCT0xEKTtcXG50ZXh0KCdGb250IFN0eWxlIEJvbGQnLCAxMCwgOTApO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwid29yZHMgRm9udCBTdHlsZSBOb3JtYWwgZGlzcGxheWVkIG5vcm1hbGx5LCBJdGFsaWMgaW4gaXRhbGljIGFuZCBib2xkIGluIGJvbGRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUeXBvZ3JhcGh5XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkF0dHJpYnV0ZXNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxMzAsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aGVTdHlsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zdHlsaW5nIGZvciB0ZXh0LCBlaXRoZXIgTk9STUFMLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIElUQUxJQywgb3IgQk9MRDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJDb25zdGFudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE1NixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW10sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy90eXBvZ3JhcGh5L2F0dHJpYnV0ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNjUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgd2lkdGggb2YgYW55IGNoYXJhY3RlciBvciB0ZXh0IHN0cmluZy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0ZXh0V2lkdGhcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRoZVRleHRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBTdHJpbmcgb2YgY2hhcmFjdGVycyB0byBtZWFzdXJlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudGV4dFNpemUoMjgpO1xcblxcbnZhciBhQ2hhciA9ICdQJztcXG52YXIgY1dpZHRoID0gdGV4dFdpZHRoKGFDaGFyKTtcXG50ZXh0KGFDaGFyLCAwLCA0MCk7XFxubGluZShjV2lkdGgsIDAsIGNXaWR0aCwgNTApO1xcblxcbnZhciBhU3RyaW5nID0gJ3A1LmpzJztcXG52YXIgc1dpZHRoID0gdGV4dFdpZHRoKGFTdHJpbmcpO1xcbnRleHQoYVN0cmluZywgMCwgODUpO1xcbmxpbmUoc1dpZHRoLCA1MCwgc1dpZHRoLCAxMDApO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiTGV0dGVyIFAgYW5kIHA1LmpzIGFyZSBkaXNwbGF5ZWQgd2l0aCB2ZXJ0aWNhbCBsaW5lcyBhdCBlbmQuIFAgaXMgd2lkZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlR5cG9ncmFwaHlcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQXR0cmlidXRlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy90eXBvZ3JhcGh5L2F0dHJpYnV0ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMDAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyB0aGUgYXNjZW50IG9mIHRoZSBjdXJyZW50IGZvbnQgYXQgaXRzIGN1cnJlbnQgc2l6ZS4gVGhlIGFzY2VudFxcbnJlcHJlc2VudHMgdGhlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIG9mIHRoZSB0YWxsZXN0IGNoYXJhY3RlciBhYm92ZVxcbnRoZSBiYXNlbGluZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0ZXh0QXNjZW50XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGJhc2UgPSBoZWlnaHQgKiAwLjc1O1xcbnZhciBzY2FsYXIgPSAwLjg7IC8vIERpZmZlcmVudCBmb3IgZWFjaCBmb250XFxuXFxudGV4dFNpemUoMzIpOyAvLyBTZXQgaW5pdGlhbCB0ZXh0IHNpemVcXG52YXIgYXNjID0gdGV4dEFzY2VudCgpICogc2NhbGFyOyAvLyBDYWxjIGFzY2VudFxcbmxpbmUoMCwgYmFzZSAtIGFzYywgd2lkdGgsIGJhc2UgLSBhc2MpO1xcbnRleHQoJ2RwJywgMCwgYmFzZSk7IC8vIERyYXcgdGV4dCBvbiBiYXNlbGluZVxcblxcbnRleHRTaXplKDY0KTsgLy8gSW5jcmVhc2UgdGV4dCBzaXplXFxuYXNjID0gdGV4dEFzY2VudCgpICogc2NhbGFyOyAvLyBSZWNhbGMgYXNjZW50XFxubGluZSg0MCwgYmFzZSAtIGFzYywgd2lkdGgsIGJhc2UgLSBhc2MpO1xcbnRleHQoJ2RwJywgNDAsIGJhc2UpOyAvLyBEcmF3IHRleHQgb24gYmFzZWxpbmVcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiVHlwb2dyYXBoeVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBdHRyaWJ1dGVzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3R5cG9ncmFwaHkvYXR0cmlidXRlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIyOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIHRoZSBkZXNjZW50IG9mIHRoZSBjdXJyZW50IGZvbnQgYXQgaXRzIGN1cnJlbnQgc2l6ZS4gVGhlIGRlc2NlbnRcXG5yZXByZXNlbnRzIHRoZSBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBvZiB0aGUgY2hhcmFjdGVyIHdpdGggdGhlIGxvbmdlc3RcXG5kZXNjZW5kZXIgYmVsb3cgdGhlIGJhc2VsaW5lLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRleHREZXNjZW50XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIGJhc2UgPSBoZWlnaHQgKiAwLjc1O1xcbnZhciBzY2FsYXIgPSAwLjg7IC8vIERpZmZlcmVudCBmb3IgZWFjaCBmb250XFxuXFxudGV4dFNpemUoMzIpOyAvLyBTZXQgaW5pdGlhbCB0ZXh0IHNpemVcXG52YXIgZGVzYyA9IHRleHREZXNjZW50KCkgKiBzY2FsYXI7IC8vIENhbGMgYXNjZW50XFxubGluZSgwLCBiYXNlICsgZGVzYywgd2lkdGgsIGJhc2UgKyBkZXNjKTtcXG50ZXh0KCdkcCcsIDAsIGJhc2UpOyAvLyBEcmF3IHRleHQgb24gYmFzZWxpbmVcXG5cXG50ZXh0U2l6ZSg2NCk7IC8vIEluY3JlYXNlIHRleHQgc2l6ZVxcbmRlc2MgPSB0ZXh0RGVzY2VudCgpICogc2NhbGFyOyAvLyBSZWNhbGMgYXNjZW50XFxubGluZSg0MCwgYmFzZSArIGRlc2MsIHdpZHRoLCBiYXNlICsgZGVzYyk7XFxudGV4dCgnZHAnLCA0MCwgYmFzZSk7IC8vIERyYXcgdGV4dCBvbiBiYXNlbGluZVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJUeXBvZ3JhcGh5XCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkF0dHJpYnV0ZXNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdHlwb2dyYXBoeS9hdHRyaWJ1dGVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjU4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkhlbHBlciBmdW5jdGlvbiB0byBtZWFzdXJlIGFzY2VudCBhbmQgZGVzY2VudC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiVHlwb2dyYXBoeVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBdHRyaWJ1dGVzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3R5cG9ncmFwaHkvbG9hZGluZ19kaXNwbGF5aW5nLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TG9hZHMgYW4gb3BlbnR5cGUgZm9udCBmaWxlICgub3RmLCAudHRmKSBmcm9tIGEgZmlsZSBvciBhIFVSTCxcXG5hbmQgcmV0dXJucyBhIFBGb250IE9iamVjdC4gVGhpcyBtZXRob2QgaXMgYXN5bmNocm9ub3VzLFxcbm1lYW5pbmcgaXQgbWF5IG5vdCBmaW5pc2ggYmVmb3JlIHRoZSBuZXh0IGxpbmUgaW4geW91ciBza2V0Y2hcXG5pcyBleGVjdXRlZC5cXG48YnI+PGJyPlxcblRoZSBwYXRoIHRvIHRoZSBmb250IHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgSFRNTCBmaWxlXFxudGhhdCBsaW5rcyBpbiB5b3VyIHNrZXRjaC4gTG9hZGluZyBhbiBmcm9tIGEgVVJMIG9yIG90aGVyXFxucmVtb3RlIGxvY2F0aW9uIG1heSBiZSBibG9ja2VkIGR1ZSB0byB5b3VyIGJyb3dzZXImIzM5O3MgYnVpbHQtaW5cXG5zZWN1cml0eS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJsb2FkRm9udFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bmFtZSBvZiB0aGUgZmlsZSBvciB1cmwgdG8gbG9hZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRm9udCgpIGNvbXBsZXRlczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm9uRXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGlmXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBlcnJvciBvY2N1cnM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInA1LkZvbnQgb2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuRm9udFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcblxcbjxwPkNhbGxpbmcgbG9hZEZvbnQoKSBpbnNpZGUgcHJlbG9hZCgpIGd1YXJhbnRlZXMgdGhhdCB0aGUgbG9hZFxcbm9wZXJhdGlvbiB3aWxsIGhhdmUgY29tcGxldGVkIGJlZm9yZSBzZXR1cCgpIGFuZCBkcmF3KCkgYXJlIGNhbGxlZC48L3A+XFxuXFxuPGRpdj48Y29kZT5cXG52YXIgbXlGb250O1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBteUZvbnQgPSBsb2FkRm9udCgnYXNzZXRzL0F2ZW5pck5leHRMVFByby1EZW1pLm90ZicpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGZpbGwoJyNFRDIyNUQnKTtcXG4gIHRleHRGb250KG15Rm9udCk7XFxuICB0ZXh0U2l6ZSgzNik7XFxuICB0ZXh0KCdwNSpqcycsIDEwLCA1MCk7XFxufVxcbjwvY29kZT48L2Rpdj5cXG5cXG5PdXRzaWRlIG9mIHByZWxvYWQoKSwgeW91IG1heSBzdXBwbHkgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlXFxub2JqZWN0OlxcblxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBsb2FkRm9udCgnYXNzZXRzL0F2ZW5pck5leHRMVFByby1EZW1pLm90ZicsIGRyYXdUZXh0KTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhd1RleHQoZm9udCkge1xcbiAgZmlsbCgnI0VEMjI1RCcpO1xcbiAgdGV4dEZvbnQoZm9udCwgMzYpO1xcbiAgdGV4dCgncDUqanMnLCAxMCwgNTApO1xcbn1cXG48L2NvZGU+PC9kaXY+XFxuXFxuPHA+WW91IGNhbiBhbHNvIHVzZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIGZvbnQgdG8gc3R5bGUgb3RoZXIgSFRNTFxcbmVsZW1lbnRzLjwvcD5cXG5cXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBsb2FkRm9udCgnYXNzZXRzL0F2ZW5pci5vdGYnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgbXlEaXYgPSBjcmVhdGVEaXYoJ2hlbGxvIHRoZXJlJyk7XFxuICBteURpdi5zdHlsZSgnZm9udC1mYW1pbHknLCAnQXZlbmlyJyk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwicDUqanMgaW4gcDUncyB0aGVtZSBkYXJrIHBpbmtcXG5wNSpqcyBpbiBwNSdzIHRoZW1lIGRhcmsgcGlua1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlR5cG9ncmFwaHlcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTG9hZGluZyAmIERpc3BsYXlpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdHlwb2dyYXBoeS9sb2FkaW5nX2Rpc3BsYXlpbmcuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNDMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RHJhd3MgdGV4dCB0byB0aGUgc2NyZWVuLiBEaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gc3BlY2lmaWVkIGluIHRoZSBmaXJzdFxcbnBhcmFtZXRlciBvbiB0aGUgc2NyZWVuIGluIHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgYnkgdGhlIGFkZGl0aW9uYWxcXG5wYXJhbWV0ZXJzLiBBIGRlZmF1bHQgZm9udCB3aWxsIGJlIHVzZWQgdW5sZXNzIGEgZm9udCBpcyBzZXQgd2l0aCB0aGVcXG50ZXh0Rm9udCgpIGZ1bmN0aW9uIGFuZCBhIGRlZmF1bHQgc2l6ZSB3aWxsIGJlIHVzZWQgdW5sZXNzIGEgZm9udCBpcyBzZXRcXG53aXRoIHRleHRTaXplKCkuIENoYW5nZSB0aGUgY29sb3Igb2YgdGhlIHRleHQgd2l0aCB0aGUgZmlsbCgpIGZ1bmN0aW9uLlxcbkNoYW5nZSB0aGUgb3V0bGluZSBvZiB0aGUgdGV4dCB3aXRoIHRoZSBzdHJva2UoKSBhbmQgc3Ryb2tlV2VpZ2h0KClcXG5mdW5jdGlvbnMuXFxuPGJyPjxicj5cXG5UaGUgdGV4dCBkaXNwbGF5cyBpbiByZWxhdGlvbiB0byB0aGUgdGV4dEFsaWduKCkgZnVuY3Rpb24sIHdoaWNoIGdpdmVzIHRoZVxcbm9wdGlvbiB0byBkcmF3IHRvIHRoZSBsZWZ0LCByaWdodCwgYW5kIGNlbnRlciBvZiB0aGUgY29vcmRpbmF0ZXMuXFxuPGJyPjxicj5cXG5UaGUgeDIgYW5kIHkyIHBhcmFtZXRlcnMgZGVmaW5lIGEgcmVjdGFuZ3VsYXIgYXJlYSB0byBkaXNwbGF5IHdpdGhpbiBhbmRcXG5tYXkgb25seSBiZSB1c2VkIHdpdGggc3RyaW5nIGRhdGEuIFdoZW4gdGhlc2UgcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkLFxcbnRoZXkgYXJlIGludGVycHJldGVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlY3RNb2RlKCkgc2V0dGluZy4gVGV4dCB0aGF0XFxuZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgd2l0aGluIHRoZSByZWN0YW5nbGUgc3BlY2lmaWVkIHdpbGwgbm90IGJlIGRyYXduXFxudG8gdGhlIHNjcmVlbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0ZXh0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBhbHBoYW51bWVyaWNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbHMgdG8gYmUgZGlzcGxheWVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8T2JqZWN0fEFycmF5fE51bWJlcnxCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eC1jb29yZGluYXRlIG9mIHRleHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktY29vcmRpbmF0ZSBvZiB0ZXh0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4MlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YnkgZGVmYXVsdCwgdGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGJveCxcXG4gICAgICAgICAgICAgICAgICAgIHNlZSByZWN0TW9kZSgpIGZvciBtb3JlIGluZm88L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieTJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmJ5IGRlZmF1bHQsIHRoZSBoZWlnaHQgb2YgdGhlIHRleHQgYm94LFxcbiAgICAgICAgICAgICAgICAgICAgc2VlIHJlY3RNb2RlKCkgZm9yIG1vcmUgaW5mbzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudGV4dFNpemUoMzIpO1xcbnRleHQoJ3dvcmQnLCAxMCwgMzApO1xcbmZpbGwoMCwgMTAyLCAxNTMpO1xcbnRleHQoJ3dvcmQnLCAxMCwgNjApO1xcbmZpbGwoMCwgMTAyLCAxNTMsIDUxKTtcXG50ZXh0KCd3b3JkJywgMTAsIDkwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuPGRpdj5cXG48Y29kZT5cXG52YXIgcyA9ICdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5IGRvZy4nO1xcbmZpbGwoNTApO1xcbnRleHQocywgMTAsIDEwLCA3MCwgODApOyAvLyBUZXh0IHdyYXBzIHdpdGhpbiB0ZXh0IGJveFxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiJ3dvcmQnIGRpc3BsYXllZCAzIHRpbWVzIGdvaW5nIGZyb20gYmxhY2ssIGJsdWUgdG8gdHJhbnNsdWNlbnQgYmx1ZVxcblRoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlR5cG9ncmFwaHlcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTG9hZGluZyAmIERpc3BsYXlpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdHlwb2dyYXBoeS9sb2FkaW5nX2Rpc3BsYXlpbmcuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMDIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyB0aGUgY3VycmVudCBmb250IHRoYXQgd2lsbCBiZSBkcmF3biB3aXRoIHRoZSB0ZXh0KCkgZnVuY3Rpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidGV4dEZvbnRcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIGN1cnJlbnQgZm9udFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZmlsbCgwKTtcXG50ZXh0U2l6ZSgxMik7XFxudGV4dEZvbnQoJ0dlb3JnaWEnKTtcXG50ZXh0KCdHZW9yZ2lhJywgMTIsIDMwKTtcXG50ZXh0Rm9udCgnSGVsdmV0aWNhJyk7XFxudGV4dCgnSGVsdmV0aWNhJywgMTIsIDYwKTtcXG48L2NvZGU+XFxuPC9kaXY+XFxuPGRpdj5cXG48Y29kZT5cXG52YXIgZm9udFJlZ3VsYXIsIGZvbnRJdGFsaWMsIGZvbnRCb2xkO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBmb250UmVndWxhciA9IGxvYWRGb250KCdhc3NldHMvUmVndWxhci5vdGYnKTtcXG4gIGZvbnRJdGFsaWMgPSBsb2FkRm9udCgnYXNzZXRzL0l0YWxpYy50dGYnKTtcXG4gIGZvbnRCb2xkID0gbG9hZEZvbnQoJ2Fzc2V0cy9Cb2xkLnR0ZicpO1xcbn1cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGJhY2tncm91bmQoMjEwKTtcXG4gIGZpbGwoMClcXG4gICAuc3Ryb2tlV2VpZ2h0KDApXFxuICAgLnRleHRTaXplKDEwKTtcXG4gIHRleHRGb250KGZvbnRSZWd1bGFyKTtcXG4gIHRleHQoJ0ZvbnQgU3R5bGUgTm9ybWFsJywgMTAsIDMwKTtcXG4gIHRleHRGb250KGZvbnRJdGFsaWMpO1xcbiAgdGV4dCgnRm9udCBTdHlsZSBJdGFsaWMnLCAxMCwgNTApO1xcbiAgdGV4dEZvbnQoZm9udEJvbGQpO1xcbiAgdGV4dCgnRm9udCBTdHlsZSBCb2xkJywgMTAsIDcwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJ3b3JkcyBGb250IFN0eWxlIE5vcm1hbCBkaXNwbGF5ZWQgbm9ybWFsbHksIEl0YWxpYyBpbiBpdGFsaWMgYW5kIGJvbGQgaW4gYm9sZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlR5cG9ncmFwaHlcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTG9hZGluZyAmIERpc3BsYXlpbmdcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAyMDIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIGN1cnJlbnQgZm9udFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjQ1LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZm9udFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hIGZvbnQgbG9hZGVkIHZpYSBsb2FkRm9udCgpLCBvciBhIFN0cmluZ1xcbnJlcHJlc2VudGluZyBhIDxhIGhyZWY9XFxcImh0dHBzOi8vbXpsLmxhLzJkT3c4V0RcXFwiPndlYiBzYWZlIGZvbnQ8L2E+IChhIGZvbnRcXG50aGF0IGlzIGdlbmVyYWxseSBhdmFpbGFibGUgYWNyb3NzIGFsbCBzeXN0ZW1zKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8U3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2l6ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgZm9udCBzaXplIHRvIHVzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3R5cG9ncmFwaHkvcDUuRm9udC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlVuZGVybHlpbmcgb3BlbnR5cGUgZm9udCBpbXBsZW1lbnRhdGlvbjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZm9udFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkZvbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiVHlwb2dyYXBoeVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJGb250XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3R5cG9ncmFwaHkvcDUuRm9udC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgYSB0aWdodCBib3VuZGluZyBib3ggZm9yIHRoZSBnaXZlbiB0ZXh0IHN0cmluZyB1c2luZyB0aGlzXFxuZm9udCAoY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgc2luZ2xlIGxpbmVzKTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRleHRCb3VuZHNcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImxpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmEgbGluZSBvZiB0ZXh0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54LXBvc2l0aW9uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55LXBvc2l0aW9uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmb250U2l6ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Zm9udCBzaXplIHRvIHVzZSAob3B0aW9uYWwpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm9wdGlvbnNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm9wZW50eXBlIG9wdGlvbnMgKG9wdGlvbmFsKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImEgcmVjdGFuZ2xlIG9iamVjdCB3aXRoIHByb3BlcnRpZXM6IHgsIHksIHcsIGhcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBmb250O1xcbnZhciB0ZXh0U3RyaW5nID0gJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0Lic7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIGZvbnQgPSBsb2FkRm9udCgnLi9hc3NldHMvUmVndWxhci5vdGYnKTtcXG59XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKDIxMCk7XFxuXFxuICB2YXIgYmJveCA9IGZvbnQudGV4dEJvdW5kcyh0ZXh0U3RyaW5nLCAxMCwgMzAsIDEyKTtcXG4gIGZpbGwoMjU1KTtcXG4gIHN0cm9rZSgwKTtcXG4gIHJlY3QoYmJveC54LCBiYm94LnksIGJib3gudywgYmJveC5oKTtcXG4gIGZpbGwoMCk7XFxuICBub1N0cm9rZSgpO1xcblxcbiAgdGV4dEZvbnQoZm9udCk7XFxuICB0ZXh0U2l6ZSgxMik7XFxuICB0ZXh0KHRleHRTdHJpbmcsIDEwLCAzMCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwid29yZHMgTG9yZW0gaXBzdW0gZG9sIGdvIG9mZiBjYW52YXMgYW5kIGNvbnRhaW5lZCBieSB3aGl0ZSBib3VuZGluZyBib3hcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Gb250XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlR5cG9ncmFwaHlcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiRm9udFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy90eXBvZ3JhcGh5L3A1LkZvbnQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNTgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29tcHV0ZXMgYW4gYXJyYXkgb2YgcG9pbnRzIGZvbGxvd2luZyB0aGUgcGF0aCBmb3Igc3BlY2lmaWVkIHRleHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0ZXh0VG9Qb2ludHNcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInR4dFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YSBsaW5lIG9mIHRleHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPngtcG9zaXRpb248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnktcG9zaXRpb248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZvbnRTaXplXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mb250IHNpemUgdG8gdXNlIChvcHRpb25hbCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm9wdGlvbnNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmFuIChvcHRpb25hbCkgb2JqZWN0IHRoYXQgY2FuIGNvbnRhaW46PC9wPlxcbjxwPjxicj5zYW1wbGVGYWN0b3IgLSB0aGUgcmF0aW8gb2YgcGF0aC1sZW5ndGggdG8gbnVtYmVyIG9mIHNhbXBsZXNcXG4oZGVmYXVsdD0uMjUpOyBoaWdoZXIgdmFsdWVzIHlpZWxkIG1vcmUgcG9pbnRzIGFuZCBhcmUgdGhlcmVmb3JlXFxubW9yZSBwcmVjaXNlPC9wPlxcbjxwPjxicj5zaW1wbGlmeVRocmVzaG9sZCAtIGlmIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLCBjb2xsaW5lYXIgcG9pbnRzIHdpbGwgYmVcXG5iZSByZW1vdmVkIGZyb20gdGhlIHBvbHlnb247IHRoZSB2YWx1ZSByZXByZXNlbnRzIHRoZSB0aHJlc2hvbGQgYW5nbGUgdG8gdXNlXFxud2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIHR3byBlZGdlcyBhcmUgY29sbGluZWFyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYW4gYXJyYXkgb2YgcG9pbnRzLCBlYWNoIHdpdGggeCwgeSwgYWxwaGEgKHRoZSBwYXRoIGFuZ2xlKVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgZm9udDtcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgZm9udCA9IGxvYWRGb250KCcuL2Fzc2V0cy9BdmVuaXIub3RmJyk7XFxufVxcblxcbnZhciBwb2ludHM7XFxudmFyIGJvdW5kcztcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBzdHJva2UoMCk7XFxuICBmaWxsKDI1NSwgMTA0LCAyMDQpO1xcblxcbiAgcG9pbnRzID0gZm9udC50ZXh0VG9Qb2ludHMoJ3A1JywgMCwgMCwgMTAsIHtcXG4gICAgc2FtcGxlRmFjdG9yOiA1LFxcbiAgICBzaW1wbGlmeVRocmVzaG9sZDogMFxcbiAgfSk7XFxuICBib3VuZHMgPSBmb250LnRleHRCb3VuZHMoJyBwNSAnLCAwLCAwLCAxMCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDI1NSk7XFxuICBiZWdpblNoYXBlKCk7XFxuICB0cmFuc2xhdGUoLWJvdW5kcy54ICogd2lkdGggLyBib3VuZHMudywgLWJvdW5kcy55ICogaGVpZ2h0IC8gYm91bmRzLmgpO1xcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcXG4gICAgdmFyIHAgPSBwb2ludHNbaV07XFxuICAgIHZlcnRleChcXG4gICAgICBwLnggKiB3aWR0aCAvIGJvdW5kcy53ICtcXG4gICAgICAgIHNpbigyMCAqIHAueSAvIGJvdW5kcy5oICsgbWlsbGlzKCkgLyAxMDAwKSAqIHdpZHRoIC8gMzAsXFxuICAgICAgcC55ICogaGVpZ2h0IC8gYm91bmRzLmhcXG4gICAgKTtcXG4gIH1cXG4gIGVuZFNoYXBlKENMT1NFKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkZvbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiVHlwb2dyYXBoeVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJGb250XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9hcnJheV9mdW5jdGlvbnMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BZGRzIGEgdmFsdWUgdG8gdGhlIGVuZCBvZiBhbiBhcnJheS4gRXh0ZW5kcyB0aGUgbGVuZ3RoIG9mXFxudGhlIGFycmF5IGJ5IG9uZS4gTWFwcyB0byBBcnJheS5wdXNoKCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXBwZW5kXCIsXG4gICAgICAgICAgICBcImRlcHJlY2F0ZWRcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiZGVwcmVjYXRpb25NZXNzYWdlXCI6IFwiVXNlIDxhIGhyZWY9XFxcImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3B1c2hcXFwiPmFycmF5LnB1c2godmFsdWUpPC9hPiBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFycmF5IHRvIGFwcGVuZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dG8gYmUgYWRkZWQgdG8gdGhlIEFycmF5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBbnlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15QXJyYXkgPSBbJ01hbmdvJywgJ0FwcGxlJywgJ1BhcGF5YSddO1xcbiAgcHJpbnQobXlBcnJheSk7IC8vIFsnTWFuZ28nLCAnQXBwbGUnLCAnUGFwYXlhJ11cXG5cXG4gIGFwcGVuZChteUFycmF5LCAnUGVhY2gnKTtcXG4gIHByaW50KG15QXJyYXkpOyAvLyBbJ01hbmdvJywgJ0FwcGxlJywgJ1BhcGF5YScsICdQZWFjaCddXFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFycmF5IEZ1bmN0aW9uc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvYXJyYXlfZnVuY3Rpb25zLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29waWVzIGFuIGFycmF5IChvciBwYXJ0IG9mIGFuIGFycmF5KSB0byBhbm90aGVyIGFycmF5LiBUaGUgc3JjIGFycmF5IGlzXFxuY29waWVkIHRvIHRoZSBkc3QgYXJyYXksIGJlZ2lubmluZyBhdCB0aGUgcG9zaXRpb24gc3BlY2lmaWVkIGJ5XFxuc3JjUG9zaXRpb24gYW5kIGludG8gdGhlIHBvc2l0aW9uIHNwZWNpZmllZCBieSBkc3RQb3NpdGlvbi4gVGhlIG51bWJlciBvZlxcbmVsZW1lbnRzIHRvIGNvcHkgaXMgZGV0ZXJtaW5lZCBieSBsZW5ndGguIE5vdGUgdGhhdCBjb3B5aW5nIHZhbHVlc1xcbm92ZXJ3cml0ZXMgZXhpc3RpbmcgdmFsdWVzIGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4gVG8gYXBwZW5kIHZhbHVlc1xcbmluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgdGhlbSwgdXNlIGNvbmNhdCgpLlxcbjxicj48YnI+XFxuVGhlIHNpbXBsaWZpZWQgdmVyc2lvbiB3aXRoIG9ubHkgdHdvIGFyZ3VtZW50cywgYXJyYXlDb3B5KHNyYywgZHN0KSxcXG5jb3BpZXMgYW4gZW50aXJlIGFycmF5IHRvIGFub3RoZXIgb2YgdGhlIHNhbWUgc2l6ZS4gSXQgaXMgZXF1aXZhbGVudCB0b1xcbmFycmF5Q29weShzcmMsIDAsIGRzdCwgMCwgc3JjLmxlbmd0aCkuXFxuPGJyPjxicj5cXG5Vc2luZyB0aGlzIGZ1bmN0aW9uIGlzIGZhciBtb3JlIGVmZmljaWVudCBmb3IgY29weWluZyBhcnJheSBkYXRhIHRoYW5cXG5pdGVyYXRpbmcgdGhyb3VnaCBhIGZvcigpIGxvb3AgYW5kIGNvcHlpbmcgZWFjaCBlbGVtZW50IGluZGl2aWR1YWxseS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhcnJheUNvcHlcIixcbiAgICAgICAgICAgIFwiZGVwcmVjYXRlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG52YXIgc3JjID0gWydBJywgJ0InLCAnQyddO1xcbnZhciBkc3QgPSBbMSwgMiwgM107XFxudmFyIHNyY1Bvc2l0aW9uID0gMTtcXG52YXIgZHN0UG9zaXRpb24gPSAwO1xcbnZhciBsZW5ndGggPSAyO1xcblxcbnByaW50KHNyYyk7IC8vIFsnQScsICdCJywgJ0MnXVxcbnByaW50KGRzdCk7IC8vIFsgMSAsICAyICwgIDMgXVxcblxcbmFycmF5Q29weShzcmMsIHNyY1Bvc2l0aW9uLCBkc3QsIGRzdFBvc2l0aW9uLCBsZW5ndGgpO1xcbnByaW50KGRzdCk7IC8vIFsnQicsICdDJywgM11cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBcnJheSBGdW5jdGlvbnNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAzNixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNyY1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgc291cmNlIEFycmF5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjUG9zaXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBBcnJheTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBkZXN0aW5hdGlvbiBBcnJheTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRzdFBvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBkZXN0aW5hdGlvbiBBcnJheTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBBcnJheSBlbGVtZW50cyB0byBiZSBjb3BpZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDc0LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9hcnJheV9mdW5jdGlvbnMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29uY2F0ZW5hdGVzIHR3byBhcnJheXMsIG1hcHMgdG8gQXJyYXkuY29uY2F0KCkuIERvZXMgbm90IG1vZGlmeSB0aGVcXG5pbnB1dCBhcnJheXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29uY2F0XCIsXG4gICAgICAgICAgICBcImRlcHJlY2F0ZWRcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiZGVwcmVjYXRpb25NZXNzYWdlXCI6IFwiVXNlIDxhIGhyZWY9XFxcImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2NvbmNhdFxcXCI+YXJyMS5jb25jYXQoYXJyMik8L2E+IGluc3RlYWQuXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5maXJzdCBBcnJheSB0byBjb25jYXRlbmF0ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zZWNvbmQgQXJyYXkgdG8gY29uY2F0ZW5hdGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjb25jYXRlbmF0ZWQgYXJyYXlcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3MgPSAnbm9yZW5kZXInPjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGFycjEgPSBbJ0EnLCAnQicsICdDJ107XFxuICB2YXIgYXJyMiA9IFsxLCAyLCAzXTtcXG5cXG4gIHByaW50KGFycjEpOyAvLyBbJ0EnLCdCJywnQyddXFxuICBwcmludChhcnIyKTsgLy8gWzEsMiwzXVxcblxcbiAgdmFyIGFycjMgPSBjb25jYXQoYXJyMSwgYXJyMik7XFxuXFxuICBwcmludChhcnIxKTsgLy8gWydBJywnQicsJ0MnXVxcbiAgcHJpbnQoYXJyMik7IC8vIFsxLCAyLCAzXVxcbiAgcHJpbnQoYXJyMyk7IC8vIFsnQScsJ0InLCdDJywgMSwgMiwgM11cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQXJyYXkgRnVuY3Rpb25zXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9hcnJheV9mdW5jdGlvbnMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNDQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV2ZXJzZXMgdGhlIG9yZGVyIG9mIGFuIGFycmF5LCBtYXBzIHRvIEFycmF5LnJldmVyc2UoKTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJldmVyc2VcIixcbiAgICAgICAgICAgIFwiZGVwcmVjYXRlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJkZXByZWNhdGlvbk1lc3NhZ2VcIjogXCJVc2UgPGEgaHJlZj1cXFwiaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcmV2ZXJzZVxcXCI+YXJyYXkucmV2ZXJzZSgpPC9hPiBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXJyYXkgdG8gcmV2ZXJzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIG15QXJyYXkgPSBbJ0EnLCAnQicsICdDJ107XFxuICBwcmludChteUFycmF5KTsgLy8gWydBJywnQicsJ0MnXVxcblxcbiAgcmV2ZXJzZShteUFycmF5KTtcXG4gIHByaW50KG15QXJyYXkpOyAvLyBbJ0MnLCdCJywnQSddXFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFycmF5IEZ1bmN0aW9uc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvYXJyYXlfZnVuY3Rpb25zLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTY1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRlY3JlYXNlcyBhbiBhcnJheSBieSBvbmUgZWxlbWVudCBhbmQgcmV0dXJucyB0aGUgc2hvcnRlbmVkIGFycmF5LFxcbm1hcHMgdG8gQXJyYXkucG9wKCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2hvcnRlblwiLFxuICAgICAgICAgICAgXCJkZXByZWNhdGVkXCI6IHRydWUsXG4gICAgICAgICAgICBcImRlcHJlY2F0aW9uTWVzc2FnZVwiOiBcIlVzZSA8YSBocmVmPVxcXCJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9wb3BcXFwiPmFycmF5LnBvcCgpPC9hPiBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXJyYXkgdG8gc2hvcnRlbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInNob3J0ZW5lZCBBcnJheVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcyA9ICdub3JlbmRlcic+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgbXlBcnJheSA9IFsnQScsICdCJywgJ0MnXTtcXG4gIHByaW50KG15QXJyYXkpOyAvLyBbJ0EnLCAnQicsICdDJ11cXG4gIHZhciBuZXdBcnJheSA9IHNob3J0ZW4obXlBcnJheSk7XFxuICBwcmludChteUFycmF5KTsgLy8gWydBJywnQicsJ0MnXVxcbiAgcHJpbnQobmV3QXJyYXkpOyAvLyBbJ0EnLCdCJ11cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQXJyYXkgRnVuY3Rpb25zXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9hcnJheV9mdW5jdGlvbnMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxODksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmFuZG9taXplcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5LiBJbXBsZW1lbnRzXFxuPGEgaHJlZj0naHR0cDovL0Jvc3QuT2Nrcy5vcmcvbWlrZS9zaHVmZmxlLycgdGFyZ2V0PV9ibGFuaz5cXG5GaXNoZXItWWF0ZXMgU2h1ZmZsZSBBbGdvcml0aG08L2E+LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNodWZmbGVcIixcbiAgICAgICAgICAgIFwiZGVwcmVjYXRlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJkZXByZWNhdGlvbk1lc3NhZ2VcIjogXCJTZWUgPGEgaHJlZj1cXFwiaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjI3NDMzOS9ob3ctY2FuLWktc2h1ZmZsZS1hbi1hcnJheVxcXCI+c2h1ZmZsaW5nIGFuIGFycmF5IHdpdGggSlM8L2E+IGluc3RlYWQuXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXJyYXkgdG8gc2h1ZmZsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJib29sXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5tb2RpZnkgcGFzc2VkIGFycmF5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInNodWZmbGVkIEFycmF5XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIHJlZ3VsYXJBcnIgPSBbJ0FCQycsICdkZWYnLCBjcmVhdGVWZWN0b3IoKSwgVEFVLCBNYXRoLkVdO1xcbiAgcHJpbnQocmVndWxhckFycik7XFxuICBzaHVmZmxlKHJlZ3VsYXJBcnIsIHRydWUpOyAvLyBmb3JjZSBtb2RpZmljYXRpb25zIHRvIHBhc3NlZCBhcnJheVxcbiAgcHJpbnQocmVndWxhckFycik7XFxuXFxuICAvLyBCeSBkZWZhdWx0IHNodWZmbGUoKSByZXR1cm5zIGEgc2h1ZmZsZWQgY2xvbmVkIGFycmF5OlxcbiAgdmFyIG5ld0FyciA9IHNodWZmbGUocmVndWxhckFycik7XFxuICBwcmludChyZWd1bGFyQXJyKTtcXG4gIHByaW50KG5ld0Fycik7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFycmF5IEZ1bmN0aW9uc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvYXJyYXlfZnVuY3Rpb25zLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjMyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNvcnRzIGFuIGFycmF5IG9mIG51bWJlcnMgZnJvbSBzbWFsbGVzdCB0byBsYXJnZXN0LCBvciBwdXRzIGFuIGFycmF5IG9mXFxud29yZHMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLiBUaGUgb3JpZ2luYWwgYXJyYXkgaXMgbm90IG1vZGlmaWVkOyBhXFxucmUtb3JkZXJlZCBhcnJheSBpcyByZXR1cm5lZC4gVGhlIGNvdW50IHBhcmFtZXRlciBzdGF0ZXMgdGhlIG51bWJlciBvZlxcbmVsZW1lbnRzIHRvIHNvcnQuIEZvciBleGFtcGxlLCBpZiB0aGVyZSBhcmUgMTIgZWxlbWVudHMgaW4gYW4gYXJyYXkgYW5kXFxuY291bnQgaXMgc2V0IHRvIDUsIG9ubHkgdGhlIGZpcnN0IDUgZWxlbWVudHMgaW4gdGhlIGFycmF5IHdpbGwgYmUgc29ydGVkLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNvcnRcIixcbiAgICAgICAgICAgIFwiZGVwcmVjYXRlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJkZXByZWNhdGlvbk1lc3NhZ2VcIjogXCJVc2UgPGEgaHJlZj1cXFwiaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29ydFxcXCI+YXJyYXkuc29ydCgpPC9hPiBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXJyYXkgdG8gc29ydDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjb3VudFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNvcnQsIHN0YXJ0aW5nIGZyb20gMDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3MgPSAnbm9yZW5kZXInPjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIHdvcmRzID0gWydiYW5hbmEnLCAnYXBwbGUnLCAncGVhcicsICdsaW1lJ107XFxuICBwcmludCh3b3Jkcyk7IC8vIFsnYmFuYW5hJywgJ2FwcGxlJywgJ3BlYXInLCAnbGltZSddXFxuICB2YXIgY291bnQgPSA0OyAvLyBsZW5ndGggb2YgYXJyYXlcXG5cXG4gIHdvcmRzID0gc29ydCh3b3JkcywgY291bnQpO1xcbiAgcHJpbnQod29yZHMpOyAvLyBbJ2FwcGxlJywgJ2JhbmFuYScsICdsaW1lJywgJ3BlYXInXVxcbn1cXG48L2NvZGU+PC9kaXY+XFxuPGRpdiBjbGFzcyA9ICdub3JlbmRlcic+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgbnVtYmVycyA9IFsyLCA2LCAxLCA1LCAxNCwgOSwgOCwgMTJdO1xcbiAgcHJpbnQobnVtYmVycyk7IC8vIFsyLCA2LCAxLCA1LCAxNCwgOSwgOCwgMTJdXFxuICB2YXIgY291bnQgPSA1OyAvLyBMZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXlcXG5cXG4gIG51bWJlcnMgPSBzb3J0KG51bWJlcnMsIGNvdW50KTtcXG4gIHByaW50KG51bWJlcnMpOyAvLyBbMSwyLDUsNiwxNCw5LDgsMTJdXFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkFycmF5IEZ1bmN0aW9uc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvYXJyYXlfZnVuY3Rpb25zLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjc5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkluc2VydHMgYSB2YWx1ZSBvciBhbiBhcnJheSBvZiB2YWx1ZXMgaW50byBhbiBleGlzdGluZyBhcnJheS4gVGhlIGZpcnN0XFxucGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaW5pdGlhbCBhcnJheSB0byBiZSBtb2RpZmllZCwgYW5kIHRoZSBzZWNvbmRcXG5wYXJhbWV0ZXIgZGVmaW5lcyB0aGUgZGF0YSB0byBiZSBpbnNlcnRlZC4gVGhlIHRoaXJkIHBhcmFtZXRlciBpcyBhbiBpbmRleFxcbnZhbHVlIHdoaWNoIHNwZWNpZmllcyB0aGUgYXJyYXkgcG9zaXRpb24gZnJvbSB3aGljaCB0byBpbnNlcnQgZGF0YS5cXG4oUmVtZW1iZXIgdGhhdCBhcnJheSBpbmRleCBudW1iZXJpbmcgc3RhcnRzIGF0IHplcm8sIHNvIHRoZSBmaXJzdCBwb3NpdGlvblxcbmlzIDAsIHRoZSBzZWNvbmQgcG9zaXRpb24gaXMgMSwgYW5kIHNvIG9uLik8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcGxpY2VcIixcbiAgICAgICAgICAgIFwiZGVwcmVjYXRlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJkZXByZWNhdGlvbk1lc3NhZ2VcIjogXCJVc2UgPGEgaHJlZj1cXFwiaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc3BsaWNlXFxcIj5hcnJheS5zcGxpY2UoKTwvYT4gaW5zdGVhZC5cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFycmF5IHRvIHNwbGljZSBpbnRvPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52YWx1ZSB0byBiZSBzcGxpY2VkIGluPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBbnlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW4gdGhlIGFycmF5IGZyb20gd2hpY2ggdG8gaW5zZXJ0IGRhdGE8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcyA9ICdub3JlbmRlcic+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgbXlBcnJheSA9IFswLCAxLCAyLCAzLCA0XTtcXG4gIHZhciBpbnNBcnJheSA9IFsnQScsICdCJywgJ0MnXTtcXG4gIHByaW50KG15QXJyYXkpOyAvLyBbMCwgMSwgMiwgMywgNF1cXG4gIHByaW50KGluc0FycmF5KTsgLy8gWydBJywnQicsJ0MnXVxcblxcbiAgc3BsaWNlKG15QXJyYXksIGluc0FycmF5LCAzKTtcXG4gIHByaW50KG15QXJyYXkpOyAvLyBbMCwxLDIsJ0EnLCdCJywnQycsMyw0XVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJBcnJheSBGdW5jdGlvbnNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdXRpbGl0aWVzL2FycmF5X2Z1bmN0aW9ucy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMxMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5FeHRyYWN0cyBhbiBhcnJheSBvZiBlbGVtZW50cyBmcm9tIGFuIGV4aXN0aW5nIGFycmF5LiBUaGUgbGlzdCBwYXJhbWV0ZXJcXG5kZWZpbmVzIHRoZSBhcnJheSBmcm9tIHdoaWNoIHRoZSBlbGVtZW50cyB3aWxsIGJlIGNvcGllZCwgYW5kIHRoZSBzdGFydFxcbmFuZCBjb3VudCBwYXJhbWV0ZXJzIHNwZWNpZnkgd2hpY2ggZWxlbWVudHMgdG8gZXh0cmFjdC4gSWYgbm8gY291bnQgaXNcXG5naXZlbiwgZWxlbWVudHMgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgc3RhcnQgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuXFxuV2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCwgcmVtZW1iZXIgdGhhdCB0aGUgZmlyc3QgYXJyYXkgZWxlbWVudCBpcyAwLlxcblRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBzb3VyY2UgYXJyYXkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3Vic2V0XCIsXG4gICAgICAgICAgICBcImRlcHJlY2F0ZWRcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiZGVwcmVjYXRpb25NZXNzYWdlXCI6IFwiVXNlIDxhIGhyZWY9XFxcImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3NsaWNlXFxcIj5hcnJheS5zbGljZSgpPC9hPiBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXJyYXkgdG8gZXh0cmFjdCBmcm9tPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wb3NpdGlvbiB0byBiZWdpbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvdW50XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgb2YgdmFsdWVzIHRvIGV4dHJhY3Q8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQXJyYXkgb2YgZXh0cmFjdGVkIGVsZW1lbnRzXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzID0gJ25vcmVuZGVyJz48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBteUFycmF5ID0gWzEsIDIsIDMsIDQsIDVdO1xcbiAgcHJpbnQobXlBcnJheSk7IC8vIFsxLCAyLCAzLCA0LCA1XVxcblxcbiAgdmFyIHN1YjEgPSBzdWJzZXQobXlBcnJheSwgMCwgMyk7XFxuICB2YXIgc3ViMiA9IHN1YnNldChteUFycmF5LCAyLCAyKTtcXG4gIHByaW50KHN1YjEpOyAvLyBbMSwyLDNdXFxuICBwcmludChzdWIyKTsgLy8gWzMsNF1cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQXJyYXkgRnVuY3Rpb25zXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9jb252ZXJzaW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29udmVydHMgYSBzdHJpbmcgdG8gaXRzIGZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9uLiBUaGUgY29udGVudHMgb2YgYVxcbnN0cmluZyBtdXN0IHJlc2VtYmxlIGEgbnVtYmVyLCBvciBOYU4gKG5vdCBhIG51bWJlcikgd2lsbCBiZSByZXR1cm5lZC5cXG5Gb3IgZXhhbXBsZSwgZmxvYXQoJnF1b3Q7MTIzNC41NiZxdW90OykgZXZhbHVhdGVzIHRvIDEyMzQuNTYsIGJ1dCBmbG9hdCgmcXVvdDtnaXJhZmZlJnF1b3Q7KVxcbndpbGwgcmV0dXJuIE5hTi48L3A+XFxuPHA+V2hlbiBhbiBhcnJheSBvZiB2YWx1ZXMgaXMgcGFzc2VkIGluLCB0aGVuIGFuIGFycmF5IG9mIGZsb2F0cyBvZiB0aGUgc2FtZVxcbmxlbmd0aCBpcyByZXR1cm5lZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJmbG9hdFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mbG9hdCBzdHJpbmcgdG8gcGFyc2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZmxvYXRpbmcgcG9pbnQgcmVwcmVzZW50YXRpb24gb2Ygc3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgc3RyID0gJzIwJztcXG52YXIgZGlhbWV0ZXIgPSBmbG9hdChzdHIpO1xcbmVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCBkaWFtZXRlciwgZGlhbWV0ZXIpO1xcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiMjAgYnkgMjAgd2hpdGUgZWxsaXBzZSBpbiB0aGUgY2VudGVyIG9mIHRoZSBjYW52YXNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnZlcnNpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdXRpbGl0aWVzL2NvbnZlcnNpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db252ZXJ0cyBhIGJvb2xlYW4sIHN0cmluZywgb3IgZmxvYXQgdG8gaXRzIGludGVnZXIgcmVwcmVzZW50YXRpb24uXFxuV2hlbiBhbiBhcnJheSBvZiB2YWx1ZXMgaXMgcGFzc2VkIGluLCB0aGVuIGFuIGludCBhcnJheSBvZiB0aGUgc2FtZSBsZW5ndGhcXG5pcyByZXR1cm5lZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJpbnRcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG5wcmludChpbnQoJzEwJykpOyAvLyAxMFxcbnByaW50KGludCgxMC4zMSkpOyAvLyAxMFxcbnByaW50KGludCgtMTApKTsgLy8gLTEwXFxucHJpbnQoaW50KHRydWUpKTsgLy8gMVxcbnByaW50KGludChmYWxzZSkpOyAvLyAwXFxucHJpbnQoaW50KFtmYWxzZSwgdHJ1ZSwgJzEwLjMnLCA5LjhdKSk7IC8vIFswLCAxLCAxMCwgOV1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb252ZXJzaW9uXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNDIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZhbHVlIHRvIHBhcnNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xCb29sZWFufE51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJhZGl4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSByYWRpeCB0byBjb252ZXJ0IHRvIChkZWZhdWx0OiAxMCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNjIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52YWx1ZXMgdG8gcGFyc2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcltdXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9jb252ZXJzaW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29udmVydHMgYSBib29sZWFuLCBzdHJpbmcgb3IgbnVtYmVyIHRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uXFxuV2hlbiBhbiBhcnJheSBvZiB2YWx1ZXMgaXMgcGFzc2VkIGluLCB0aGVuIGFuIGFycmF5IG9mIHN0cmluZ3Mgb2YgdGhlIHNhbWVcXG5sZW5ndGggaXMgcmV0dXJuZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RyXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52YWx1ZSB0byBwYXJzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfEJvb2xlYW58TnVtYmVyfEFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxucHJpbnQoc3RyKCcxMCcpKTsgLy8gXFxcIjEwXFxcIlxcbnByaW50KHN0cigxMC4zMSkpOyAvLyBcXFwiMTAuMzFcXFwiXFxucHJpbnQoc3RyKC0xMCkpOyAvLyBcXFwiLTEwXFxcIlxcbnByaW50KHN0cih0cnVlKSk7IC8vIFxcXCJ0cnVlXFxcIlxcbnByaW50KHN0cihmYWxzZSkpOyAvLyBcXFwiZmFsc2VcXFwiXFxucHJpbnQoc3RyKFt0cnVlLCAnMTAuMycsIDkuOF0pKTsgLy8gWyBcXFwidHJ1ZVxcXCIsIFxcXCIxMC4zXFxcIiwgXFxcIjkuOFxcXCIgXVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnZlcnNpb25cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdXRpbGl0aWVzL2NvbnZlcnNpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29udmVydHMgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGl0cyBib29sZWFuIHJlcHJlc2VudGF0aW9uLlxcbkZvciBhIG51bWJlciwgYW55IG5vbi16ZXJvIHZhbHVlIChwb3NpdGl2ZSBvciBuZWdhdGl2ZSkgZXZhbHVhdGVzIHRvIHRydWUsXFxud2hpbGUgemVybyBldmFsdWF0ZXMgdG8gZmFsc2UuIEZvciBhIHN0cmluZywgdGhlIHZhbHVlICZxdW90O3RydWUmcXVvdDsgZXZhbHVhdGVzIHRvXFxudHJ1ZSwgd2hpbGUgYW55IG90aGVyIHZhbHVlIGV2YWx1YXRlcyB0byBmYWxzZS4gV2hlbiBhbiBhcnJheSBvZiBudW1iZXIgb3JcXG5zdHJpbmcgdmFsdWVzIGlzIHBhc3NlZCBpbiwgdGhlbiBhIGFycmF5IG9mIGJvb2xlYW5zIG9mIHRoZSBzYW1lIGxlbmd0aCBpc1xcbnJldHVybmVkLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZhbHVlIHRvIHBhcnNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8Qm9vbGVhbnxOdW1iZXJ8QXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImJvb2xlYW4gcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbnByaW50KGJvb2xlYW4oMCkpOyAvLyBmYWxzZVxcbnByaW50KGJvb2xlYW4oMSkpOyAvLyB0cnVlXFxucHJpbnQoYm9vbGVhbigndHJ1ZScpKTsgLy8gdHJ1ZVxcbnByaW50KGJvb2xlYW4oJ2FiY2QnKSk7IC8vIGZhbHNlXFxucHJpbnQoYm9vbGVhbihbMCwgMTIsICd0cnVlJ10pKTsgLy8gW2ZhbHNlLCB0cnVlLCBmYWxzZV1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb252ZXJzaW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9jb252ZXJzaW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTQwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnZlcnRzIGEgbnVtYmVyLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBudW1iZXIsIG9yIGJvb2xlYW4gdG8gaXRzIGJ5dGVcXG5yZXByZXNlbnRhdGlvbi4gQSBieXRlIGNhbiBiZSBvbmx5IGEgd2hvbGUgbnVtYmVyIGJldHdlZW4gLTEyOCBhbmQgMTI3LCBzb1xcbndoZW4gYSB2YWx1ZSBvdXRzaWRlIG9mIHRoaXMgcmFuZ2UgaXMgY29udmVydGVkLCBpdCB3cmFwcyBhcm91bmQgdG8gdGhlXFxuY29ycmVzcG9uZGluZyBieXRlIHJlcHJlc2VudGF0aW9uLiBXaGVuIGFuIGFycmF5IG9mIG51bWJlciwgc3RyaW5nIG9yIGJvb2xlYW5cXG52YWx1ZXMgaXMgcGFzc2VkIGluLCB0aGVuIGFuIGFycmF5IG9mIGJ5dGVzIHRoZSBzYW1lIGxlbmd0aCBpcyByZXR1cm5lZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJieXRlXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImJ5dGUgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxucHJpbnQoYnl0ZSgxMjcpKTsgLy8gMTI3XFxucHJpbnQoYnl0ZSgxMjgpKTsgLy8gLTEyOFxcbnByaW50KGJ5dGUoMjMuNCkpOyAvLyAyM1xcbnByaW50KGJ5dGUoJzIzLjQnKSk7IC8vIDIzXFxucHJpbnQoYnl0ZSgnaGVsbG8nKSk7IC8vIE5hTlxcbnByaW50KGJ5dGUodHJ1ZSkpOyAvLyAxXFxucHJpbnQoYnl0ZShbMCwgMjU1LCAnMTAwJ10pKTsgLy8gWzAsIC0xLCAxMDBdXFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ29udmVyc2lvblwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE0MCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmFsdWUgdG8gcGFyc2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfEJvb2xlYW58TnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImJ5dGUgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE2MixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZhbHVlcyB0byBwYXJzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhcnJheSBvZiBieXRlIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW11cIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdXRpbGl0aWVzL2NvbnZlcnNpb24uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNzYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29udmVydHMgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGl0cyBjb3JyZXNwb25kaW5nIHNpbmdsZS1jaGFyYWN0ZXJcXG5zdHJpbmcgcmVwcmVzZW50YXRpb24uIElmIGEgc3RyaW5nIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgaXQgaXMgZmlyc3RcXG5wYXJzZWQgYXMgYW4gaW50ZWdlciBhbmQgdGhlbiB0cmFuc2xhdGVkIGludG8gYSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZy5cXG5XaGVuIGFuIGFycmF5IG9mIG51bWJlciBvciBzdHJpbmcgdmFsdWVzIGlzIHBhc3NlZCBpbiwgdGhlbiBhbiBhcnJheSBvZlxcbnNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5ncyBvZiB0aGUgc2FtZSBsZW5ndGggaXMgcmV0dXJuZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2hhclwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxucHJpbnQoY2hhcig2NSkpOyAvLyBcXFwiQVxcXCJcXG5wcmludChjaGFyKCc2NScpKTsgLy8gXFxcIkFcXFwiXFxucHJpbnQoY2hhcihbNjUsIDY2LCA2N10pKTsgLy8gWyBcXFwiQVxcXCIsIFxcXCJCXFxcIiwgXFxcIkNcXFwiIF1cXG5wcmludChqb2luKGNoYXIoWzY1LCA2NiwgNjddKSwgJycpKTsgLy8gXFxcIkFCQ1xcXCJcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb252ZXJzaW9uXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTc2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52YWx1ZSB0byBwYXJzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8TnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTk1LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibnNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmFsdWVzIHRvIHBhcnNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFycmF5IG9mIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1tdXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9jb252ZXJzaW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjEwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnZlcnRzIGEgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaW50ZWdlclxcbnJlcHJlc2VudGF0aW9uLiBXaGVuIGFuIGFycmF5IG9mIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nIHZhbHVlcyBpcyBwYXNzZWRcXG5pbiwgdGhlbiBhbiBhcnJheSBvZiBpbnRlZ2VycyBvZiB0aGUgc2FtZSBsZW5ndGggaXMgcmV0dXJuZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5jaGFyXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxucHJpbnQodW5jaGFyKCdBJykpOyAvLyA2NVxcbnByaW50KHVuY2hhcihbJ0EnLCAnQicsICdDJ10pKTsgLy8gWyA2NSwgNjYsIDY3IF1cXG5wcmludCh1bmNoYXIoc3BsaXQoJ0FCQycsICcnKSkpOyAvLyBbIDY1LCA2NiwgNjcgXVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNvbnZlcnNpb25cIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAyMTAsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZhbHVlIHRvIHBhcnNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAyMjYsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52YWx1ZXMgdG8gcGFyc2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcltdXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9jb252ZXJzaW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjM5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnZlcnRzIGEgbnVtYmVyIHRvIGEgc3RyaW5nIGluIGl0cyBlcXVpdmFsZW50IGhleGFkZWNpbWFsIG5vdGF0aW9uLiBJZiBhXFxuc2Vjb25kIHBhcmFtZXRlciBpcyBwYXNzZWQsIGl0IGlzIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0b1xcbmdlbmVyYXRlIGluIHRoZSBoZXhhZGVjaW1hbCBub3RhdGlvbi4gV2hlbiBhbiBhcnJheSBpcyBwYXNzZWQgaW4sIGFuXFxuYXJyYXkgb2Ygc3RyaW5ncyBpbiBoZXhhZGVjaW1hbCBub3RhdGlvbiBvZiB0aGUgc2FtZSBsZW5ndGggaXMgcmV0dXJuZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiaGV4XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG5wcmludChoZXgoMjU1KSk7IC8vIFxcXCIwMDAwMDBGRlxcXCJcXG5wcmludChoZXgoMjU1LCA2KSk7IC8vIFxcXCIwMDAwRkZcXFwiXFxucHJpbnQoaGV4KFswLCAxMjcsIDI1NV0sIDYpKTsgLy8gWyBcXFwiMDAwMDAwXFxcIiwgXFxcIjAwMDA3RlxcXCIsIFxcXCIwMDAwRkZcXFwiIF1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb252ZXJzaW9uXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjM5LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52YWx1ZSB0byBwYXJzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkaWdpdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJoZXhhZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDI1NyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmFycmF5IG9mIHZhbHVlcyB0byBwYXJzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJbXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRpZ2l0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1tdXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9jb252ZXJzaW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjg2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnZlcnRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgaGV4YWRlY2ltYWwgbnVtYmVyIHRvIGl0cyBlcXVpdmFsZW50XFxuaW50ZWdlciB2YWx1ZS4gV2hlbiBhbiBhcnJheSBvZiBzdHJpbmdzIGluIGhleGFkZWNpbWFsIG5vdGF0aW9uIGlzIHBhc3NlZFxcbmluLCBhbiBhcnJheSBvZiBpbnRlZ2VycyBvZiB0aGUgc2FtZSBsZW5ndGggaXMgcmV0dXJuZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5oZXhcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBoZXhhZGVjaW1hbCB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG5wcmludCh1bmhleCgnQScpKTsgLy8gMTBcXG5wcmludCh1bmhleCgnRkYnKSk7IC8vIDI1NVxcbnByaW50KHVuaGV4KFsnRkYnLCAnQUEnLCAnMDAnXSkpOyAvLyBbIDI1NSwgMTcwLCAwIF1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDb252ZXJzaW9uXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjg2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52YWx1ZSB0byBwYXJzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBoZXhhZGVjaW1hbCB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMzAyLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibnNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmFsdWVzIHRvIHBhcnNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImludGVnZXIgcmVwcmVzZW50YXRpb25zIG9mIGhleGFkZWNpbWFsIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJbXVwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvc3RyaW5nX2Z1bmN0aW9ucy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbWJpbmVzIGFuIGFycmF5IG9mIFN0cmluZ3MgaW50byBvbmUgU3RyaW5nLCBlYWNoIHNlcGFyYXRlZCBieSB0aGVcXG5jaGFyYWN0ZXIocykgdXNlZCBmb3IgdGhlIHNlcGFyYXRvciBwYXJhbWV0ZXIuIFRvIGpvaW4gYXJyYXlzIG9mIGludHMgb3JcXG5mbG9hdHMsIGl0JiMzOTtzIG5lY2Vzc2FyeSB0byBmaXJzdCBjb252ZXJ0IHRoZW0gdG8gU3RyaW5ncyB1c2luZyBuZigpIG9yXFxubmZzKCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiam9pblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YXJyYXkgb2YgU3RyaW5ncyB0byBiZSBqb2luZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TdHJpbmcgdG8gYmUgcGxhY2VkIGJldHdlZW4gZWFjaCBpdGVtPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImpvaW5lZCBTdHJpbmdcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBhcnJheSA9IFsnSGVsbG8nLCAnd29ybGQhJ107XFxudmFyIHNlcGFyYXRvciA9ICcgJztcXG52YXIgbWVzc2FnZSA9IGpvaW4oYXJyYXksIHNlcGFyYXRvcik7XFxudGV4dChtZXNzYWdlLCA1LCA1MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJcXFwiaGVsbG8gd29ybGQhXFxcIiBkaXNwbGF5ZWQgbWlkZGxlIGxlZnQgb2YgY2FudmFzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RyaW5nIEZ1bmN0aW9uc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvc3RyaW5nX2Z1bmN0aW9ucy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhcHBseSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHBpZWNlIG9mIHRleHQsXFxuYW5kIHJldHVybiBtYXRjaGluZyBncm91cHMgKGVsZW1lbnRzIGZvdW5kIGluc2lkZSBwYXJlbnRoZXNlcykgYXMgYVxcblN0cmluZyBhcnJheS4gSWYgdGhlcmUgYXJlIG5vIG1hdGNoZXMsIGEgbnVsbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLlxcbklmIG5vIGdyb3VwcyBhcmUgc3BlY2lmaWVkIGluIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGJ1dCB0aGUgc2VxdWVuY2VcXG5tYXRjaGVzLCBhbiBhcnJheSBvZiBsZW5ndGggMSAod2l0aCB0aGUgbWF0Y2hlZCB0ZXh0IGFzIHRoZSBmaXJzdCBlbGVtZW50XFxub2YgdGhlIGFycmF5KSB3aWxsIGJlIHJldHVybmVkLlxcbjxicj48YnI+XFxuVG8gdXNlIHRoZSBmdW5jdGlvbiwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIHRoZSByZXN1bHQgaXMgbnVsbC4gSWYgdGhlXFxucmVzdWx0IGlzIG51bGwsIHRoZW4gdGhlIHNlcXVlbmNlIGRpZCBub3QgbWF0Y2ggYXQgYWxsLiBJZiB0aGUgc2VxdWVuY2VcXG5kaWQgbWF0Y2gsIGFuIGFycmF5IGlzIHJldHVybmVkLlxcbjxicj48YnI+XFxuSWYgdGhlcmUgYXJlIGdyb3VwcyAoc3BlY2lmaWVkIGJ5IHNldHMgb2YgcGFyZW50aGVzZXMpIGluIHRoZSByZWd1bGFyXFxuZXhwcmVzc2lvbiwgdGhlbiB0aGUgY29udGVudHMgb2YgZWFjaCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBhcnJheS5cXG5FbGVtZW50IFswXSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCByZXR1cm5zIHRoZSBlbnRpcmUgbWF0Y2hpbmdcXG5zdHJpbmcsIGFuZCB0aGUgbWF0Y2ggZ3JvdXBzIHN0YXJ0IGF0IGVsZW1lbnQgWzFdICh0aGUgZmlyc3QgZ3JvdXAgaXMgWzFdLFxcbnRoZSBzZWNvbmQgWzJdLCBhbmQgc28gb24pLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1hdGNoXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBTdHJpbmcgdG8gYmUgc2VhcmNoZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJlZ2V4cFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIHJlZ2V4cCB0byBiZSB1c2VkIGZvciBtYXRjaGluZzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBcnJheSBvZiBTdHJpbmdzIGZvdW5kXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nW11cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBzdHJpbmcgPSAnSGVsbG8gcDVqcyohJztcXG52YXIgcmVnZXhwID0gJ3A1anNcXFxcXFxcXConO1xcbnZhciBtID0gbWF0Y2goc3RyaW5nLCByZWdleHApO1xcbnRleHQobSwgNSwgNTApO1xcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiXFxcInA1anMqXFxcIiBkaXNwbGF5ZWQgbWlkZGxlIGxlZnQgb2YgY2FudmFzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RyaW5nIEZ1bmN0aW9uc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvc3RyaW5nX2Z1bmN0aW9ucy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDg1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhcHBseSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHBpZWNlIG9mIHRleHQsXFxuYW5kIHJldHVybiBhIGxpc3Qgb2YgbWF0Y2hpbmcgZ3JvdXBzIChlbGVtZW50cyBmb3VuZCBpbnNpZGUgcGFyZW50aGVzZXMpXFxuYXMgYSB0d28tZGltZW5zaW9uYWwgU3RyaW5nIGFycmF5LiBJZiB0aGVyZSBhcmUgbm8gbWF0Y2hlcywgYSBudWxsIHZhbHVlXFxud2lsbCBiZSByZXR1cm5lZC4gSWYgbm8gZ3JvdXBzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbixcXG5idXQgdGhlIHNlcXVlbmNlIG1hdGNoZXMsIGEgdHdvIGRpbWVuc2lvbmFsIGFycmF5IGlzIHN0aWxsIHJldHVybmVkLCBidXRcXG50aGUgc2Vjb25kIGRpbWVuc2lvbiBpcyBvbmx5IG9mIGxlbmd0aCBvbmUuXFxuPGJyPjxicj5cXG5UbyB1c2UgdGhlIGZ1bmN0aW9uLCBmaXJzdCBjaGVjayB0byBzZWUgaWYgdGhlIHJlc3VsdCBpcyBudWxsLiBJZiB0aGVcXG5yZXN1bHQgaXMgbnVsbCwgdGhlbiB0aGUgc2VxdWVuY2UgZGlkIG5vdCBtYXRjaCBhdCBhbGwuIElmIHRoZSBzZXF1ZW5jZVxcbmRpZCBtYXRjaCwgYSAyRCBhcnJheSBpcyByZXR1cm5lZC5cXG48YnI+PGJyPlxcbklmIHRoZXJlIGFyZSBncm91cHMgKHNwZWNpZmllZCBieSBzZXRzIG9mIHBhcmVudGhlc2VzKSBpbiB0aGUgcmVndWxhclxcbmV4cHJlc3Npb24sIHRoZW4gdGhlIGNvbnRlbnRzIG9mIGVhY2ggd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuXFxuQXNzdW1pbmcgYSBsb29wIHdpdGggY291bnRlciB2YXJpYWJsZSBpLCBlbGVtZW50IFtpXVswXSBvZiBhIHJlZ3VsYXJcXG5leHByZXNzaW9uIG1hdGNoIHJldHVybnMgdGhlIGVudGlyZSBtYXRjaGluZyBzdHJpbmcsIGFuZCB0aGUgbWF0Y2ggZ3JvdXBzXFxuc3RhcnQgYXQgZWxlbWVudCBbaV1bMV0gKHRoZSBmaXJzdCBncm91cCBpcyBbaV1bMV0sIHRoZSBzZWNvbmQgW2ldWzJdLFxcbmFuZCBzbyBvbikuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibWF0Y2hBbGxcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0clwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIFN0cmluZyB0byBiZSBzZWFyY2hlZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVnZXhwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgcmVnZXhwIHRvIGJlIHVzZWQgZm9yIG1hdGNoaW5nPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjJkIEFycmF5IG9mIFN0cmluZ3MgZm91bmRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdbXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9XFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG52YXIgc3RyaW5nID0gJ0hlbGxvIHA1anMqISBIZWxsbyB3b3JsZCEnO1xcbnZhciByZWdleHAgPSAnSGVsbG8nO1xcbm1hdGNoQWxsKHN0cmluZywgcmVnZXhwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJTdHJpbmcgRnVuY3Rpb25zXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9zdHJpbmdfZnVuY3Rpb25zLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTMyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlV0aWxpdHkgZnVuY3Rpb24gZm9yIGZvcm1hdHRpbmcgbnVtYmVycyBpbnRvIHN0cmluZ3MuIFRoZXJlIGFyZSB0d29cXG52ZXJzaW9uczogb25lIGZvciBmb3JtYXR0aW5nIGZsb2F0cywgYW5kIG9uZSBmb3IgZm9ybWF0dGluZyBpbnRzLlxcblRoZSB2YWx1ZXMgZm9yIHRoZSBkaWdpdHMsIGxlZnQsIGFuZCByaWdodCBwYXJhbWV0ZXJzIHNob3VsZCBhbHdheXNcXG5iZSBwb3NpdGl2ZSBpbnRlZ2Vycy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJuZlwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJmb3JtYXR0ZWQgU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHZhciBudW0gPSAxMTIuNTMxMDYxMTU7XFxuXFxuICBub1N0cm9rZSgpO1xcbiAgZmlsbCgwKTtcXG4gIHRleHRTaXplKDE0KTtcXG4gIC8vIERyYXcgZm9ybWF0dGVkIG51bWJlcnNcXG4gIHRleHQobmYobnVtLCA1LCAyKSwgMTAsIDIwKTtcXG5cXG4gIHRleHQobmYobnVtLCA0LCAzKSwgMTAsIDU1KTtcXG5cXG4gIHRleHQobmYobnVtLCAzLCA2KSwgMTAsIDg1KTtcXG5cXG4gIC8vIERyYXcgZGl2aWRpbmcgbGluZXNcXG4gIHN0cm9rZSgxMjApO1xcbiAgbGluZSgwLCAzMCwgd2lkdGgsIDMwKTtcXG4gIGxpbmUoMCwgNjUsIHdpZHRoLCA2NSk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiXFxcIjAwMTEyNTNcXFwiIHRvcCBsZWZ0LCBcXFwiMDExMi41MzFcXFwiIG1pZCBsZWZ0LCBcXFwiMTEyLjUzMTA2MVxcXCIgYm90dG9tIGxlZnQgY2FudmFzXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJTdHJpbmcgRnVuY3Rpb25zXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTMyLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibnVtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBOdW1iZXIgdG8gZm9ybWF0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcnxTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBkaWdpdHMgdG8gdGhlIGxlZnQgb2YgdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlcnxTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmlnaHRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIG9mIGRpZ2l0cyB0byB0aGUgcmlnaHQgb2YgdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlcnxTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImZvcm1hdHRlZCBTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE3NCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm51bXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIE51bWJlcnMgdG8gZm9ybWF0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibGVmdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyfFN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyfFN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZm9ybWF0dGVkIFN0cmluZ3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1tdXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9zdHJpbmdfZnVuY3Rpb25zLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjM3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlV0aWxpdHkgZnVuY3Rpb24gZm9yIGZvcm1hdHRpbmcgbnVtYmVycyBpbnRvIHN0cmluZ3MgYW5kIHBsYWNpbmdcXG5hcHByb3ByaWF0ZSBjb21tYXMgdG8gbWFyayB1bml0cyBvZiAxMDAwLiBUaGVyZSBhcmUgdHdvIHZlcnNpb25zOiBvbmVcXG5mb3IgZm9ybWF0dGluZyBpbnRzLCBhbmQgb25lIGZvciBmb3JtYXR0aW5nIGFuIGFycmF5IG9mIGludHMuIFRoZSB2YWx1ZVxcbmZvciB0aGUgcmlnaHQgcGFyYW1ldGVyIHNob3VsZCBhbHdheXMgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm5mY1wiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJmb3JtYXR0ZWQgU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHZhciBudW0gPSAxMTI1MzEwNi4xMTU7XFxuICB2YXIgbnVtQXJyID0gWzEsIDEsIDJdO1xcblxcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMCk7XFxuICB0ZXh0U2l6ZSgxMik7XFxuXFxuICAvLyBEcmF3IGZvcm1hdHRlZCBudW1iZXJzXFxuICB0ZXh0KG5mYyhudW0sIDQpLCAxMCwgMzApO1xcbiAgdGV4dChuZmMobnVtQXJyLCAyKSwgMTAsIDgwKTtcXG5cXG4gIC8vIERyYXcgZGl2aWRpbmcgbGluZVxcbiAgc3Ryb2tlKDEyMCk7XFxuICBsaW5lKDAsIDUwLCB3aWR0aCwgNTApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIlxcXCIxMSwyNTMsMTA2LjExNVxcXCIgdG9wIG1pZGRsZSBhbmQgXFxcIjEuMDAsMS4wMCwyLjAwXFxcIiBkaXNwbGF5ZWQgYm90dG9tIG1pZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RyaW5nIEZ1bmN0aW9uc1wiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDIzNyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm51bVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgTnVtYmVyIHRvIGZvcm1hdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8U3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmlnaHRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIG9mIGRpZ2l0cyB0byB0aGUgcmlnaHQgb2YgdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbCBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyfFN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZm9ybWF0dGVkIFN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjc1LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibnVtc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgTnVtYmVycyB0byBmb3JtYXQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyfFN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZm9ybWF0dGVkIFN0cmluZ3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1tdXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9zdHJpbmdfZnVuY3Rpb25zLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzEzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlV0aWxpdHkgZnVuY3Rpb24gZm9yIGZvcm1hdHRpbmcgbnVtYmVycyBpbnRvIHN0cmluZ3MuIFNpbWlsYXIgdG8gbmYoKSBidXRcXG5wdXRzIGEgJnF1b3Q7KyZxdW90OyBpbiBmcm9udCBvZiBwb3NpdGl2ZSBudW1iZXJzIGFuZCBhICZxdW90Oy0mcXVvdDsgaW4gZnJvbnQgb2YgbmVnYXRpdmVcXG5udW1iZXJzLiBUaGVyZSBhcmUgdHdvIHZlcnNpb25zOiBvbmUgZm9yIGZvcm1hdHRpbmcgZmxvYXRzLCBhbmQgb25lIGZvclxcbmZvcm1hdHRpbmcgaW50cy4gVGhlIHZhbHVlcyBmb3IgbGVmdCwgYW5kIHJpZ2h0IHBhcmFtZXRlcnNcXG5zaG91bGQgYWx3YXlzIGJlIHBvc2l0aXZlIGludGVnZXJzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm5mcFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJmb3JtYXR0ZWQgU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHZhciBudW0xID0gMTEyNTMxMDYuMTE1O1xcbiAgdmFyIG51bTIgPSAtMTEyNTMxMDYuMTE1O1xcblxcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMCk7XFxuICB0ZXh0U2l6ZSgxMik7XFxuXFxuICAvLyBEcmF3IGZvcm1hdHRlZCBudW1iZXJzXFxuICB0ZXh0KG5mcChudW0xLCA0LCAyKSwgMTAsIDMwKTtcXG4gIHRleHQobmZwKG51bTIsIDQsIDIpLCAxMCwgODApO1xcblxcbiAgLy8gRHJhdyBkaXZpZGluZyBsaW5lXFxuICBzdHJva2UoMTIwKTtcXG4gIGxpbmUoMCwgNTAsIHdpZHRoLCA1MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiXFxcIisxMTI1MzEwNi4xMVxcXCIgdG9wIG1pZGRsZSBhbmQgXFxcIi0xMTI1MzEwNi4xMVxcXCIgZGlzcGxheWVkIGJvdHRvbSBtaWRkbGVcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlN0cmluZyBGdW5jdGlvbnNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAzMTMsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJudW1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIE51bWJlciB0byBmb3JtYXQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibGVmdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgb2YgZGlnaXRzIHRvIHRoZSBsZWZ0IG9mIHRoZSBkZWNpbWFsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmlnaHRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIG9mIGRpZ2l0cyB0byB0aGUgcmlnaHQgb2YgdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgcG9pbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZm9ybWF0dGVkIFN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMzU0LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibnVtc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgTnVtYmVycyB0byBmb3JtYXQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmlnaHRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZm9ybWF0dGVkIFN0cmluZ3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1tdXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy9zdHJpbmdfZnVuY3Rpb25zLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzc1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlV0aWxpdHkgZnVuY3Rpb24gZm9yIGZvcm1hdHRpbmcgbnVtYmVycyBpbnRvIHN0cmluZ3MuIFNpbWlsYXIgdG8gbmYoKSBidXRcXG5wdXRzIGEgJnF1b3Q7ICZxdW90OyAoc3BhY2UpIGluIGZyb250IG9mIHBvc2l0aXZlIG51bWJlcnMgYW5kIGEgJnF1b3Q7LSZxdW90OyBpbiBmcm9udCBvZlxcbm5lZ2F0aXZlIG51bWJlcnMuIFRoZXJlIGFyZSB0d28gdmVyc2lvbnM6IG9uZSBmb3IgZm9ybWF0dGluZyBmbG9hdHMsIGFuZFxcbm9uZSBmb3IgZm9ybWF0dGluZyBpbnRzLiBUaGUgdmFsdWVzIGZvciB0aGUgZGlnaXRzLCBsZWZ0LCBhbmQgcmlnaHRcXG5wYXJhbWV0ZXJzIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmUgaW50ZWdlcnMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibmZzXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImZvcm1hdHRlZCBTdHJpbmdcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdmFyIG51bTEgPSAxMTI1MzEwNi4xMTU7XFxuICB2YXIgbnVtMiA9IC0xMTI1MzEwNi4xMTU7XFxuXFxuICBub1N0cm9rZSgpO1xcbiAgZmlsbCgwKTtcXG4gIHRleHRTaXplKDEyKTtcXG4gIC8vIERyYXcgZm9ybWF0dGVkIG51bWJlcnNcXG4gIHRleHQobmZzKG51bTEsIDQsIDIpLCAxMCwgMzApO1xcblxcbiAgdGV4dChuZnMobnVtMiwgNCwgMiksIDEwLCA4MCk7XFxuXFxuICAvLyBEcmF3IGRpdmlkaW5nIGxpbmVcXG4gIHN0cm9rZSgxMjApO1xcbiAgbGluZSgwLCA1MCwgd2lkdGgsIDUwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJcXFwiMTEyNTMxMDYuMTFcXFwiIHRvcCBtaWRkbGUgYW5kIFxcXCItMTEyNTMxMDYuMTFcXFwiIGRpc3BsYXllZCBib3R0b20gbWlkZGxlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiRGF0YVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJTdHJpbmcgRnVuY3Rpb25zXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMzc1LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibnVtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBOdW1iZXIgdG8gZm9ybWF0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIG9mIGRpZ2l0cyB0byB0aGUgbGVmdCBvZiB0aGUgZGVjaW1hbFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBkaWdpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsIHBvaW50PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImZvcm1hdHRlZCBTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDQxNixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm51bXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIE51bWJlcnMgdG8gZm9ybWF0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibGVmdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImZvcm1hdHRlZCBTdHJpbmdzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdbXVwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvc3RyaW5nX2Z1bmN0aW9ucy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQzNyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgc3BsaXQoKSBmdW5jdGlvbiBtYXBzIHRvIFN0cmluZy5zcGxpdCgpLCBpdCBicmVha3MgYSBTdHJpbmcgaW50b1xcbnBpZWNlcyB1c2luZyBhIGNoYXJhY3RlciBvciBzdHJpbmcgYXMgdGhlIGRlbGltaXRlci4gVGhlIGRlbGltIHBhcmFtZXRlclxcbnNwZWNpZmllcyB0aGUgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMgdGhhdCBtYXJrIHRoZSBib3VuZGFyaWVzIGJldHdlZW5cXG5lYWNoIHBpZWNlLiBBIFN0cmluZ1tdIGFycmF5IGlzIHJldHVybmVkIHRoYXQgY29udGFpbnMgZWFjaCBvZiB0aGUgcGllY2VzLjwvcD5cXG48cD5UaGUgc3BsaXRUb2tlbnMoKSBmdW5jdGlvbiB3b3JrcyBpbiBhIHNpbWlsYXIgZmFzaGlvbiwgZXhjZXB0IHRoYXQgaXRcXG5zcGxpdHMgdXNpbmcgYSByYW5nZSBvZiBjaGFyYWN0ZXJzIGluc3RlYWQgb2YgYSBzcGVjaWZpYyBjaGFyYWN0ZXIgb3JcXG5zZXF1ZW5jZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcGxpdFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBTdHJpbmcgdG8gYmUgc3BsaXQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRlbGltXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgU3RyaW5nIHVzZWQgdG8gc2VwYXJhdGUgdGhlIGRhdGE8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQXJyYXkgb2YgU3RyaW5nc1wiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1tdXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgbmFtZXMgPSAnUGF0LFhpbyxBbGV4JztcXG52YXIgc3BsaXRTdHJpbmcgPSBzcGxpdChuYW1lcywgJywnKTtcXG50ZXh0KHNwbGl0U3RyaW5nWzBdLCA1LCAzMCk7XFxudGV4dChzcGxpdFN0cmluZ1sxXSwgNSwgNTApO1xcbnRleHQoc3BsaXRTdHJpbmdbMl0sIDUsIDcwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIlxcXCJwYXRcXFwiIHRvcCBsZWZ0LCBcXFwiWGlvXFxcIiBtaWQgbGVmdCBhbmQgXFxcIkFsZXhcXFwiIGRpc3BsYXllZCBib3R0b20gbGVmdFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RyaW5nIEZ1bmN0aW9uc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvc3RyaW5nX2Z1bmN0aW9ucy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ3MSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgc3BsaXRUb2tlbnMoKSBmdW5jdGlvbiBzcGxpdHMgYSBTdHJpbmcgYXQgb25lIG9yIG1hbnkgY2hhcmFjdGVyXFxuZGVsaW1pdGVycyBvciAmcXVvdDt0b2tlbnMuJnF1b3Q7IFRoZSBkZWxpbSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXIgb3JcXG5jaGFyYWN0ZXJzIHRvIGJlIHVzZWQgYXMgYSBib3VuZGFyeS5cXG48YnI+PGJyPlxcbklmIG5vIGRlbGltIGNoYXJhY3RlcnMgYXJlIHNwZWNpZmllZCwgYW55IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHVzZWQgdG9cXG5zcGxpdC4gV2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluY2x1ZGUgdGFiIChcXFxcdCksIGxpbmUgZmVlZCAoXFxcXG4pLCBjYXJyaWFnZVxcbnJldHVybiAoXFxcXHIpLCBmb3JtIGZlZWQgKFxcXFxmKSwgYW5kIHNwYWNlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNwbGl0VG9rZW5zXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIFN0cmluZyB0byBiZSBzcGxpdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGVsaW1cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmxpc3Qgb2YgaW5kaXZpZHVhbCBTdHJpbmdzIHRoYXQgd2lsbCBiZSB1c2VkIGFzXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcnM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBcnJheSBvZiBTdHJpbmdzXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nW11cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzID0gXFxcIm5vcmVuZGVyXFxcIj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBteVN0ciA9ICdNYW5nbywgQmFuYW5hLCBMaW1lJztcXG4gIHZhciBteVN0ckFyciA9IHNwbGl0VG9rZW5zKG15U3RyLCAnLCcpO1xcblxcbiAgcHJpbnQobXlTdHJBcnIpOyAvLyBwcmludHMgOiBbXFxcIk1hbmdvXFxcIixcXFwiIEJhbmFuYVxcXCIsXFxcIiBMaW1lXFxcIl1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkRhdGFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiU3RyaW5nIEZ1bmN0aW9uc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvc3RyaW5nX2Z1bmN0aW9ucy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUyNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZW1vdmVzIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIFN0cmluZy4gSW5cXG5hZGRpdGlvbiB0byBzdGFuZGFyZCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgc3VjaCBhcyBzcGFjZSwgY2FycmlhZ2UgcmV0dXJuLFxcbmFuZCB0YWIsIHRoaXMgZnVuY3Rpb24gYWxzbyByZW1vdmVzIHRoZSBVbmljb2RlICZxdW90O25ic3AmcXVvdDsgY2hhcmFjdGVyLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRyaW1cIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYSB0cmltbWVkIFN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIHN0cmluZyA9IHRyaW0oJyAgTm8gbmV3IGxpbmVzXFxcXG4gICAnKTtcXG50ZXh0KHN0cmluZyArICcgaGVyZScsIDIsIDUwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIlxcXCJObyBuZXcgbGluZXMgaGVyZVxcXCIgZGlzcGxheWVkIGNlbnRlciBjYW52YXNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJEYXRhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlN0cmluZyBGdW5jdGlvbnNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiA1MjYsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YSBTdHJpbmcgdG8gYmUgdHJpbW1lZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYSB0cmltbWVkIFN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNTQ2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3Ryc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hbiBBcnJheSBvZiBTdHJpbmdzIHRvIGJlIHRyaW1tZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYW4gQXJyYXkgb2YgdHJpbW1lZCBTdHJpbmdzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdbXVwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvdGltZV9kYXRlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cDUuanMgY29tbXVuaWNhdGVzIHdpdGggdGhlIGNsb2NrIG9uIHlvdXIgY29tcHV0ZXIuIFRoZSBkYXkoKSBmdW5jdGlvblxcbnJldHVybnMgdGhlIGN1cnJlbnQgZGF5IGFzIGEgdmFsdWUgZnJvbSAxIC0gMzEuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGF5XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBjdXJyZW50IGRheVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBkID0gZGF5KCk7XFxudGV4dCgnQ3VycmVudCBkYXk6IFxcXFxuJyArIGQsIDUsIDUwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIkN1cnJlbnQgZGF5IGlzIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRpbWUgJiBEYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy90aW1lX2RhdGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5qcyBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgY2xvY2sgb24geW91ciBjb21wdXRlci4gVGhlIGhvdXIoKSBmdW5jdGlvblxcbnJldHVybnMgdGhlIGN1cnJlbnQgaG91ciBhcyBhIHZhbHVlIGZyb20gMCAtIDIzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImhvdXJcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIGN1cnJlbnQgaG91clwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBoID0gaG91cigpO1xcbnRleHQoJ0N1cnJlbnQgaG91cjpcXFxcbicgKyBoLCA1LCA1MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJDdXJyZW50IGhvdXIgaXMgZGlzcGxheWVkXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiSU9cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiVGltZSAmIERhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvdXRpbGl0aWVzL3RpbWVfZGF0ZS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LmpzIGNvbW11bmljYXRlcyB3aXRoIHRoZSBjbG9jayBvbiB5b3VyIGNvbXB1dGVyLiBUaGUgbWludXRlKCkgZnVuY3Rpb25cXG5yZXR1cm5zIHRoZSBjdXJyZW50IG1pbnV0ZSBhcyBhIHZhbHVlIGZyb20gMCAtIDU5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1pbnV0ZVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgY3VycmVudCBtaW51dGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgbSA9IG1pbnV0ZSgpO1xcbnRleHQoJ0N1cnJlbnQgbWludXRlOiBcXFxcbicgKyBtLCA1LCA1MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJDdXJyZW50IG1pbnV0ZSBpcyBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUaW1lICYgRGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvdGltZV9kYXRlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyAodGhvdXNhbmR0aHMgb2YgYSBzZWNvbmQpIHNpbmNlXFxuc3RhcnRpbmcgdGhlIHByb2dyYW0uIFRoaXMgaW5mb3JtYXRpb24gaXMgb2Z0ZW4gdXNlZCBmb3IgdGltaW5nIGV2ZW50cyBhbmRcXG5hbmltYXRpb24gc2VxdWVuY2VzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1pbGxpc1wiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBzdGFydGluZyB0aGUgcHJvZ3JhbVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIG1pbGxpc2Vjb25kID0gbWlsbGlzKCk7XFxudGV4dCgnTWlsbGlzZWNvbmRzIFxcXFxucnVubmluZzogXFxcXG4nICsgbWlsbGlzZWNvbmQsIDUsIDQwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIm51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgcHJvZ3JhbSBoYXMgc3RhcnRlZCBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUaW1lICYgRGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy91dGlsaXRpZXMvdGltZV9kYXRlLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTAxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LmpzIGNvbW11bmljYXRlcyB3aXRoIHRoZSBjbG9jayBvbiB5b3VyIGNvbXB1dGVyLiBUaGUgbW9udGgoKSBmdW5jdGlvblxcbnJldHVybnMgdGhlIGN1cnJlbnQgbW9udGggYXMgYSB2YWx1ZSBmcm9tIDEgLSAxMi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtb250aFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgY3VycmVudCBtb250aFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBtID0gbW9udGgoKTtcXG50ZXh0KCdDdXJyZW50IG1vbnRoOiBcXFxcbicgKyBtLCA1LCA1MCk7XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJDdXJyZW50IG1vbnRoIGlzIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRpbWUgJiBEYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy90aW1lX2RhdGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cDUuanMgY29tbXVuaWNhdGVzIHdpdGggdGhlIGNsb2NrIG9uIHlvdXIgY29tcHV0ZXIuIFRoZSBzZWNvbmQoKSBmdW5jdGlvblxcbnJldHVybnMgdGhlIGN1cnJlbnQgc2Vjb25kIGFzIGEgdmFsdWUgZnJvbSAwIC0gNTkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2Vjb25kXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBjdXJyZW50IHNlY29uZFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbnZhciBzID0gc2Vjb25kKCk7XFxudGV4dCgnQ3VycmVudCBzZWNvbmQ6IFxcXFxuJyArIHMsIDUsIDUwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIkN1cnJlbnQgc2Vjb25kIGlzIGRpc3BsYXllZFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIklPXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlRpbWUgJiBEYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3V0aWxpdGllcy90aW1lX2RhdGUuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNDUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cDUuanMgY29tbXVuaWNhdGVzIHdpdGggdGhlIGNsb2NrIG9uIHlvdXIgY29tcHV0ZXIuIFRoZSB5ZWFyKCkgZnVuY3Rpb25cXG5yZXR1cm5zIHRoZSBjdXJyZW50IHllYXIgYXMgYW4gaW50ZWdlciAoMjAxNCwgMjAxNSwgMjAxNiwgZXRjKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ5ZWFyXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBjdXJyZW50IHllYXJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgeSA9IHllYXIoKTtcXG50ZXh0KCdDdXJyZW50IHllYXI6IFxcXFxuJyArIHksIDUsIDUwKTtcXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIkN1cnJlbnQgeWVhciBpcyBkaXNwbGF5ZWRcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJJT1wiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJUaW1lICYgRGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy93ZWJnbC9jYW1lcmEuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXRzIGNhbWVyYSBwb3NpdGlvbiBmb3IgYSAzRCBza2V0Y2guIFRoZSBmdW5jdGlvbiBiZWhhdmVzIHNpbWlsYXJseVxcbmdsdUxvb2tBdCwgZXhjZXB0IHRoYXQgaXQgcmVwbGFjZXMgdGhlIGV4aXN0aW5nIG1vZGVsdmlldyBtYXRyaXggaW5zdGVhZFxcbm9mIGFwcGx5aW5nIGFueSB0cmFuc2Zvcm1hdGlvbnMgY2FsY3VsYXRlZCBoZXJlIG9uIHRvcCBvZiB0aGUgZXhpc3RpbmdcXG5tb2RlbCB2aWV3LlxcbldoZW4gY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCB0aGlzIGZ1bmN0aW9uXFxuc2V0cyBhIGRlZmF1bHQgY2FtZXJhIGVxdWl2YWxlbnQgdG8gY2FsbGluZ1xcbmNhbWVyYSgwLCAwLCAoaGVpZ2h0LzIuMCkgLyB0YW4oUEkqMzAuMCAvIDE4MC4wKSwgMCwgMCwgMCwgMCwgMSwgMCk7PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FtZXJhXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYW1lcmEgcG9zaXRpb24gdmFsdWUgb24geCBheGlzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNhbWVyYSBwb3NpdGlvbiB2YWx1ZSBvbiB5IGF4aXM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwielwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y2FtZXJhIHBvc2l0aW9uIHZhbHVlIG9uIHogYXhpczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjZW50ZXJYXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54IGNvb3JkaW5hdGUgcmVwcmVzZW50aW5nIGNlbnRlciBvZiB0aGUgc2tldGNoPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNlbnRlcllcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnkgY29vcmRpbmF0ZSByZXByZXNlbnRpbmcgY2VudGVyIG9mIHRoZSBza2V0Y2g8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2VudGVyWlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eiBjb29yZGluYXRlIHJlcHJlc2VudGluZyBjZW50ZXIgb2YgdGhlIHNrZXRjaDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ1cFhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnggY29tcG9uZW50IG9mIGRpcmVjdGlvbiAmIzM5O3VwJiMzOTsgZnJvbSBjYW1lcmE8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidXBZXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD55IGNvbXBvbmVudCBvZiBkaXJlY3Rpb24gJiMzOTt1cCYjMzk7IGZyb20gY2FtZXJhPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInVwWlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eiBjb21wb25lbnQgb2YgZGlyZWN0aW9uICYjMzk7dXAmIzM5OyBmcm9tIGNhbWVyYTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIC8vbW92ZSB0aGUgY2FtZXJhIGF3YXkgZnJvbSB0aGUgcGxhbmUgYnkgYSBzaW4gd2F2ZVxcbiAgY2FtZXJhKDAsIDAsIHNpbihmcmFtZUNvdW50ICogMC4wMSkgKiAxMDAsIDAsIDAsIDAsIDAsIDEsIDApO1xcbiAgcGxhbmUoMTIwLCAxMjApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImJsdWUgc3F1YXJlIHNocmlua3MgaW4gc2l6ZSBncm93cyB0byBmaWxsIGNhbnZhcy4gZGlzYXBwZWFycyB0aGVuIGxvb3BzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkxpZ2h0cywgQ2FtZXJhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIkNhbWVyYVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy93ZWJnbC9jYW1lcmEuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNjEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyBwZXJzcGVjdGl2ZSBjYW1lcmEuIFdoZW4gY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCB0aGUgZGVmYXVsdHNcXG5wcm92aWRlZCBhcmUgZXF1aXZhbGVudCB0b1xcbnBlcnNwZWN0aXZlKFBJLzMuMCwgd2lkdGgvaGVpZ2h0LCBjYW1lcmFaLzEwLjAsIGNhbWVyYVo8ZW0+MTAuMClcXG53aGVyZSBjYW1lcmFaIGlzICgoaGVpZ2h0LzIuMCkgLyB0YW4oUEk8L2VtPjYwLjAvMzYwLjApKTs8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwZXJzcGVjdGl2ZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZm92eVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y2FtZXJhIGZydXN0dW0gdmVydGljYWwgZmllbGQgb2YgdmlldyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYm90dG9tIHRvIHRvcCBvZiB2aWV3LCBpbiBhbmdsZU1vZGUgdW5pdHM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXNwZWN0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYW1lcmEgZnJ1c3R1bSBhc3BlY3QgcmF0aW88L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibmVhclwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnJ1c3R1bSBuZWFyIHBsYW5lIGxlbmd0aDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmYXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZydXN0dW0gZmFyIHBsYW5lIGxlbmd0aDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy9kcmFnIG1vdXNlIHRvIHRvZ2dsZSB0aGUgd29ybGQhXFxuLy95b3Ugd2lsbCBzZWUgdGhlcmUncyBhIHZhbmlzaCBwb2ludFxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxuICB2YXIgZm92ID0gNjAgLyAxODAgKiBQSTtcXG4gIHZhciBjYW1lcmFaID0gaGVpZ2h0IC8gMi4wIC8gdGFuKGZvdiAvIDIuMCk7XFxuICBwZXJzcGVjdGl2ZSg2MCAvIDE4MCAqIFBJLCB3aWR0aCAvIGhlaWdodCwgY2FtZXJhWiAqIDAuMSwgY2FtZXJhWiAqIDEwKTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIG9yYml0Q29udHJvbCgpO1xcbiAgZm9yICh2YXIgaSA9IC0xOyBpIDwgMjsgaSsrKSB7XFxuICAgIGZvciAodmFyIGogPSAtMjsgaiA8IDM7IGorKykge1xcbiAgICAgIHB1c2goKTtcXG4gICAgICB0cmFuc2xhdGUoaSAqIDE2MCwgMCwgaiAqIDE2MCk7XFxuICAgICAgYm94KDQwLCA0MCwgNDApO1xcbiAgICAgIHBvcCgpO1xcbiAgICB9XFxuICB9XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiY29sb3JlZCAzZCBib3hlcyB0b2dnbGVhYmxlIHdpdGggbW91c2UgcG9zaXRpb25cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJMaWdodHMsIENhbWVyYVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJDYW1lcmFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvY2FtZXJhLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjQzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldHVwIG9ydGhvIGNhbWVyYTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm9ydGhvXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYW1lcmEgZnJ1c3R1bSBsZWZ0IHBsYW5lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYW1lcmEgZnJ1c3R1bSByaWdodCBwbGFuZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJib3R0b21cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNhbWVyYSBmcnVzdHVtIGJvdHRvbSBwbGFuZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0b3BcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNhbWVyYSBmcnVzdHVtIHRvcCBwbGFuZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuZWFyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYW1lcmEgZnJ1c3R1bSBuZWFyIHBsYW5lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZhclwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y2FtZXJhIGZydXN0dW0gZmFyIHBsYW5lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vL2RyYWcgbW91c2UgdG8gdG9nZ2xlIHRoZSB3b3JsZCFcXG4vL3RoZXJlJ3Mgbm8gdmFuaXNoIHBvaW50XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG4gIG9ydGhvKC13aWR0aCAvIDIsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgLWhlaWdodCAvIDIsIDAsIDUwMCk7XFxufVxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICBvcmJpdENvbnRyb2woKTtcXG4gIHN0cm9rZVdlaWdodCgwLjEpO1xcbiAgZm9yICh2YXIgaSA9IC0xOyBpIDwgMjsgaSsrKSB7XFxuICAgIGZvciAodmFyIGogPSAtMjsgaiA8IDM7IGorKykge1xcbiAgICAgIHB1c2goKTtcXG4gICAgICB0cmFuc2xhdGUoaSAqIDE2MCwgMCwgaiAqIDE2MCk7XFxuICAgICAgYm94KDQwLCA0MCwgNDApO1xcbiAgICAgIHBvcCgpO1xcbiAgICB9XFxuICB9XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiMyAzZCBib3hlcywgcmV2ZWFsIHNldmVyYWwgbW9yZSBib3hlcyBvbiAzZCBwbGFuZSB3aGVuIG1vdXNlIHVzZWQgdG8gdG9nZ2xlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiQ2FtZXJhXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL2ludGVyYWN0aW9uLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm9yYml0Q29udHJvbFwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDUwKTtcXG4gIC8vIE9yYml0IGNvbnRyb2wgYWxsb3dzIHRoZSBjYW1lcmEgdG8gb3JiaXQgYXJvdW5kIGEgdGFyZ2V0LlxcbiAgb3JiaXRDb250cm9sKCk7XFxuICBib3goMzAsIDUwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJDYW1lcmEgb3JiaXRzIGFyb3VuZCBib3ggd2hlbiBtb3VzZSBpcyBob2xkLWNsaWNrZWQgJiB0aGVuIG1vdmVkLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkxpZ2h0cywgQ2FtZXJhXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL2xpZ2h0LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhbiBhbWJpZW50IGxpZ2h0IHdpdGggYSBjb2xvcjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFtYmllbnRMaWdodFwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxufVxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgYW1iaWVudExpZ2h0KDE1MCk7XFxuICBhbWJpZW50TWF0ZXJpYWwoMjUwKTtcXG4gIG5vU3Ryb2tlKCk7XFxuICBzcGhlcmUoMjUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImV2ZW5seSBkaXN0cmlidXRlZCBsaWdodCBhY3Jvc3MgYSBzcGhlcmVcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJMaWdodHMsIENhbWVyYVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJMaWdodHNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxMixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnJlZCBvciBodWUgdmFsdWUgcmVsYXRpdmUgdG9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmJsdWUgb3IgYnJpZ2h0bmVzcyB2YWx1ZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWxwaGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDQ2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YSBjb2xvciBzdHJpbmc8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNTIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJncmF5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmEgZ3JheSB2YWx1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbHBoYVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNTksXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YW4gYXJyYXkgY29udGFpbmluZyB0aGUgcmVkLGdyZWVuLGJsdWUgJmFtcDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIHRoZSBjb2xvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJbXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDY2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIGFtYmllbnQgbGlnaHQgY29sb3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvbGlnaHQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhIGRpcmVjdGlvbmFsIGxpZ2h0IHdpdGggYSBjb2xvciBhbmQgYSBkaXJlY3Rpb248L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkaXJlY3Rpb25hbExpZ2h0XCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMCk7XFxuICAvL21vdmUgeW91ciBtb3VzZSB0byBjaGFuZ2UgbGlnaHQgZGlyZWN0aW9uXFxuICB2YXIgZGlyWCA9IChtb3VzZVggLyB3aWR0aCAtIDAuNSkgKiAyO1xcbiAgdmFyIGRpclkgPSAobW91c2VZIC8gaGVpZ2h0IC0gMC41KSAqIDI7XFxuICBkaXJlY3Rpb25hbExpZ2h0KDI1MCwgMjUwLCAyNTAsIC1kaXJYLCAtZGlyWSwgMC4yNSk7XFxuICBhbWJpZW50TWF0ZXJpYWwoMjUwKTtcXG4gIG5vU3Ryb2tlKCk7XFxuICBzcGhlcmUoMjUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImxpZ2h0IHNvdXJjZSBvbiBjYW52YXMgY2hhbmdlYWJsZSB3aXRoIG1vdXNlIHBvc2l0aW9uXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTGlnaHRzXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTAxLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cmVkIG9yIGh1ZSB2YWx1ZSAoZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50XFxuY29sb3IgbW9kZSksPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Ymx1ZSBvciBicmlnaHRuZXNzIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBkaXJlY3Rpb24gb2YgdGhlIGxpZ2h0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlZlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDEzNCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbG9yXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNvbG9yIEFycmF5LCBDU1MgY29sb3Igc3RyaW5nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcDUuQ29sb3IgdmFsdWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW118U3RyaW5nfHA1LkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD54IGF4aXMgZGlyZWN0aW9uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eSBheGlzIGRpcmVjdGlvbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnogYXhpcyBkaXJlY3Rpb248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTQ0LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW118U3RyaW5nfHA1LkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicG9zaXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMTUxLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInpcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL2xpZ2h0LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjA3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgYSBwb2ludCBsaWdodCB3aXRoIGEgY29sb3IgYW5kIGEgbGlnaHQgcG9zaXRpb248L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwb2ludExpZ2h0XCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMCk7XFxuICAvL21vdmUgeW91ciBtb3VzZSB0byBjaGFuZ2UgbGlnaHQgcG9zaXRpb25cXG4gIHZhciBsb2NYID0gbW91c2VYIC0gd2lkdGggLyAyO1xcbiAgdmFyIGxvY1kgPSBtb3VzZVkgLSBoZWlnaHQgLyAyO1xcbiAgLy8gdG8gc2V0IHRoZSBsaWdodCBwb3NpdGlvbixcXG4gIC8vIHRoaW5rIG9mIHRoZSB3b3JsZCdzIGNvb3JkaW5hdGUgYXM6XFxuICAvLyAtd2lkdGgvMiwtaGVpZ2h0LzIgLS0tLS0tLS0gd2lkdGgvMiwtaGVpZ2h0LzJcXG4gIC8vICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XFxuICAvLyAgICAgICAgICAgICAgICB8ICAgICAwLDAgICAgfFxcbiAgLy8gICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcXG4gIC8vIC13aWR0aC8yLGhlaWdodC8yLS0tLS0tLS13aWR0aC8yLGhlaWdodC8yXFxuICBwb2ludExpZ2h0KDI1MCwgMjUwLCAyNTAsIGxvY1gsIGxvY1ksIDUwKTtcXG4gIGFtYmllbnRNYXRlcmlhbCgyNTApO1xcbiAgbm9TdHJva2UoKTtcXG4gIHNwaGVyZSgyNSk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwic3BvdCBsaWdodCBvbiBjYW52YXMgY2hhbmdlcyBwb3NpdGlvbiB3aXRoIG1vdXNlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTGlnaHRzXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjA3LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cmVkIG9yIGh1ZSB2YWx1ZSAoZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50XFxuY29sb3IgbW9kZSksPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Ymx1ZSBvciBicmlnaHRuZXNzIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eCBheGlzIHBvc2l0aW9uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eSBheGlzIHBvc2l0aW9uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInpcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eiBheGlzIHBvc2l0aW9uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDI0OSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBwb3NpdGlvbiBvZiB0aGUgbGlnaHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjU4LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y29sb3IgQXJyYXksIENTUyBjb2xvciBzdHJpbmcsXFxub3IgcDUuQ29sb3IgdmFsdWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW118U3RyaW5nfHA1LkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInpcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMjY4LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW118U3RyaW5nfHA1LkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicG9zaXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuVmVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL2xvYWRpbmcuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Mb2FkIGEgM2QgbW9kZWwgZnJvbSBhbiBPQkogZmlsZS5cXG48YnI+PGJyPlxcbk9uZSBvZiB0aGUgbGltaXRhdGlvbnMgb2YgdGhlIE9CSiBmb3JtYXQgaXMgdGhhdCBpdCBkb2VzbiYjMzk7dCBoYXZlIGEgYnVpbHQtaW5cXG5zZW5zZSBvZiBzY2FsZS4gVGhpcyBtZWFucyB0aGF0IG1vZGVscyBleHBvcnRlZCBmcm9tIGRpZmZlcmVudCBwcm9ncmFtcyBtaWdodFxcbmJlIHZlcnkgZGlmZmVyZW50IHNpemVzLiBJZiB5b3VyIG1vZGVsIGlzbiYjMzk7dCBkaXNwbGF5aW5nLCB0cnkgY2FsbGluZ1xcbmxvYWRNb2RlbCgpIHdpdGggdGhlIG5vcm1hbGl6ZWQgcGFyYW1ldGVyIHNldCB0byB0cnVlLiBUaGlzIHdpbGwgcmVzaXplIHRoZVxcbm1vZGVsIHRvIGEgc2NhbGUgYXBwcm9wcmlhdGUgZm9yIHA1LiBZb3UgY2FuIGFsc28gbWFrZSBhZGRpdGlvbmFsIGNoYW5nZXMgdG9cXG50aGUgZmluYWwgc2l6ZSBvZiB5b3VyIG1vZGVsIHdpdGggdGhlIHNjYWxlKCkgZnVuY3Rpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibG9hZE1vZGVsXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBwNS5HZW9tZXRyeSBvYmplY3RcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5HZW9tZXRyeVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy9kcmF3IGEgc3Bpbm5pbmcgdGVhcG90XFxudmFyIHRlYXBvdDtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgdGVhcG90ID0gbG9hZE1vZGVsKCdhc3NldHMvdGVhcG90Lm9iaicpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgcm90YXRlWChmcmFtZUNvdW50ICogMC4wMSk7XFxuICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAxKTtcXG4gIG1vZGVsKHRlYXBvdCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwiVmVydGljYWxseSByb3RhdGluZyAzLWQgdGVhcG90IHdpdGggcmVkLCBncmVlbiBhbmQgYmx1ZSBncmFkaWVudC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCIzRCBNb2RlbHNcIixcbiAgICAgICAgICAgIFwib3ZlcmxvYWRzXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBhdGhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UGF0aCBvZiB0aGUgbW9kZWwgdG8gYmUgbG9hZGVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vcm1hbGl6ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5JZiB0cnVlLCBzY2FsZSB0aGUgbW9kZWwgdG8gYVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZGl6ZWQgc2l6ZSB3aGVuIGxvYWRpbmc8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN1Y2Nlc3NDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5GdW5jdGlvbiB0byBiZSBjYWxsZWRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlIHRoZSBtb2RlbCBpcyBsb2FkZWQuIFdpbGwgYmUgcGFzc2VkXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDNEIG1vZGVsIG9iamVjdC48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZnVuY3Rpb24ocDUuR2VvbWV0cnkpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZhaWx1cmVDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYWxsZWQgd2l0aCBldmVudCBlcnJvciBpZlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW1hZ2UgZmFpbHMgdG8gbG9hZC48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb24oRXZlbnQpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgcDUuR2VvbWV0cnkgb2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5HZW9tZXRyeVwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDYxLFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdWNjZXNzQ2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZnVuY3Rpb24ocDUuR2VvbWV0cnkpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZhaWx1cmVDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvbihFdmVudClcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBwNS5HZW9tZXRyeSBvYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1Lkdlb21ldHJ5XCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL2xvYWRpbmcuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UGFyc2UgT0JKIGxpbmVzIGludG8gbW9kZWwuIEZvciByZWZlcmVuY2UsIHRoaXMgaXMgd2hhdCBhIHNpbXBsZSBtb2RlbCBvZiBhXFxuc3F1YXJlIG1pZ2h0IGxvb2sgbGlrZTo8L3A+XFxuPHA+diAtMC41IC0wLjUgMC41XFxudiAtMC41IC0wLjUgLTAuNVxcbnYgLTAuNSAwLjUgLTAuNVxcbnYgLTAuNSAwLjUgMC41PC9wPlxcbjxwPmYgNCAzIDIgMTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJTaGFwZVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCIzRCBNb2RlbHNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvbG9hZGluZy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIxNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZW5kZXIgYSAzZCBtb2RlbCB0byB0aGUgc2NyZWVuLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TG9hZGVkIDNkIG1vZGVsIHRvIGJlIHJlbmRlcmVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5HZW9tZXRyeVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbi8vZHJhdyBhIHNwaW5uaW5nIHRlYXBvdFxcbnZhciB0ZWFwb3Q7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIHRlYXBvdCA9IGxvYWRNb2RlbCgnYXNzZXRzL3RlYXBvdC5vYmonKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xcbiAgcm90YXRlWShmcmFtZUNvdW50ICogMC4wMSk7XFxuICBtb2RlbCh0ZWFwb3QpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIlZlcnRpY2FsbHkgcm90YXRpbmcgMy1kIHRlYXBvdCB3aXRoIHJlZCwgZ3JlZW4gYW5kIGJsdWUgZ3JhZGllbnQuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiM0QgTW9kZWxzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL21hdGVyaWFsLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TG9hZHMgYSBjdXN0b20gc2hhZGVyIGZyb20gdGhlIHByb3ZpZGVkIHZlcnRleCBhbmQgZnJhZ21lbnRcXG5zaGFkZXIgcGF0aHMuIFRoZSBzaGFkZXIgZmlsZXMgYXJlIGxvYWRlZCBhc3luY2hyb25vdXNseSBpbiB0aGVcXG5iYWNrZ3JvdW5kLCBzbyB0aGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbiBwcmVsb2FkKCkuPC9wPlxcbjxwPkZvciBub3csIHRoZXJlIGFyZSB0aHJlZSBtYWluIHR5cGVzIG9mIHNoYWRlcnMuIHA1IHdpbGwgYXV0b21hdGljYWxseVxcbnN1cHBseSBhcHByb3ByaWF0ZSB2ZXJ0aWNlcywgbm9ybWFscywgY29sb3JzLCBhbmQgbGlnaHRpbmcgYXR0cmlidXRlc1xcbmlmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZWQgaW4gdGhlIHNoYWRlciBtYXRjaCB0aGUgbmFtZXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibG9hZFNoYWRlclwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmVydEZpbGVuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wYXRoIHRvIGZpbGUgY29udGFpbmluZyB2ZXJ0ZXggc2hhZGVyXFxuc291cmNlIGNvZGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnJhZ0ZpbGVuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wYXRoIHRvIGZpbGUgY29udGFpbmluZyBmcmFnbWVudCBzaGFkZXJcXG5zb3VyY2UgY29kZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImEgc2hhZGVyIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIHByb3ZpZGVkXFxudmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgZmlsZXMuXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuU2hhZGVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0ZXJpYWxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvbWF0ZXJpYWwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1NyxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNyZWF0ZVNoYWRlclwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmVydFNyY1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c291cmNlIGNvZGUgZm9yIHRoZSB2ZXJ0ZXggc2hhZGVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmcmFnU3JjXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zb3VyY2UgY29kZSBmb3IgdGhlIGZyYWdtZW50IHNoYWRlcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhIHNoYWRlciBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBwcm92aWRlZFxcbnZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycy5cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5TaGFkZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IG1vZGVybml6cj0nd2ViZ2wnPlxcbjxjb2RlPlxcbi8vIHRoZSAndmFyeWluZydzIGFyZSBzaGFyZWQgYmV0d2VlbiBib3RoIHZlcnRleCAmIGZyYWdtZW50IHNoYWRlcnNcXG52YXIgdmFyeWluZyA9ICdwcmVjaXNpb24gaGlnaHAgZmxvYXQ7IHZhcnlpbmcgdmVjMiB2UG9zOyc7XFxuXFxuLy8gdGhlIHZlcnRleCBzaGFkZXIgaXMgY2FsbGVkIGZvciBlYWNoIHZlcnRleFxcbnZhciB2cyA9XFxuICB2YXJ5aW5nICtcXG4gICdhdHRyaWJ1dGUgdmVjMyBhUG9zaXRpb247JyArXFxuICAndm9pZCBtYWluKCkgeyB2UG9zID0gKGdsX1Bvc2l0aW9uID0gdmVjNChhUG9zaXRpb24sMS4wKSkueHk7IH0nO1xcblxcbi8vIHRoZSBmcmFnbWVudCBzaGFkZXIgaXMgY2FsbGVkIGZvciBlYWNoIHBpeGVsXFxudmFyIGZzID1cXG4gIHZhcnlpbmcgK1xcbiAgJ3VuaWZvcm0gdmVjMiBwOycgK1xcbiAgJ3VuaWZvcm0gZmxvYXQgcjsnICtcXG4gICdjb25zdCBpbnQgSSA9IDUwMDsnICtcXG4gICd2b2lkIG1haW4oKSB7JyArXFxuICAnICB2ZWMyIGMgPSBwICsgdlBvcyAqIHIsIHogPSBjOycgK1xcbiAgJyAgZmxvYXQgbiA9IDAuMDsnICtcXG4gICcgIGZvciAoaW50IGkgPSBJOyBpID4gMDsgaSAtLSkgeycgK1xcbiAgJyAgICBpZih6Lngqei54K3oueSp6LnkgPiA0LjApIHsnICtcXG4gICcgICAgICBuID0gZmxvYXQoaSkvZmxvYXQoSSk7JyArXFxuICAnICAgICAgYnJlYWs7JyArXFxuICAnICAgIH0nICtcXG4gICcgICAgeiA9IHZlYzIoei54KnoueC16Lnkqei55LCAyLjAqei54KnoueSkgKyBjOycgK1xcbiAgJyAgfScgK1xcbiAgJyAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjUtY29zKG4qMTcuMCkvMi4wLDAuNS1jb3MobioxMy4wKS8yLjAsMC41LWNvcyhuKjIzLjApLzIuMCwxLjApOycgK1xcbiAgJ30nO1xcblxcbnZhciBtYW5kZWw7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG5cXG4gIC8vIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc2hhZGVyXFxuICBtYW5kZWwgPSBjcmVhdGVTaGFkZXIodnMsIGZzKTtcXG4gIHNoYWRlcihtYW5kZWwpO1xcbiAgbm9TdHJva2UoKTtcXG5cXG4gIC8vICdwJyBpcyB0aGUgY2VudGVyIHBvaW50IG9mIHRoZSBNYW5kZWxicm90IGltYWdlXFxuICBtYW5kZWwuc2V0VW5pZm9ybSgncCcsIFstMC43NDM2NDM4ODcwMywgMC4xMzE4MjU5MDQyMV0pO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgLy8gJ3InIGlzIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBpbiBNYW5kZWxicm90LXNwYWNlXFxuICBtYW5kZWwuc2V0VW5pZm9ybSgncicsIDEuNSAqIGV4cCgtNi41ICogKDEgKyBzaW4obWlsbGlzKCkgLyAyMDAwKSkpKTtcXG4gIHF1YWQoLTEsIC0xLCAxLCAtMSwgMSwgMSwgLTEsIDEpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcInpvb21pbmcgTWFuZGVsYnJvdCBzZXQuIGEgY29sb3JmdWwsIGluZmluaXRlbHkgZGV0YWlsZWQgZnJhY3RhbC5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJMaWdodHMsIENhbWVyYVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRlcmlhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy93ZWJnbC9tYXRlcmlhbC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgc2hhZGVyKCkgZnVuY3Rpb24gbGV0cyB0aGUgdXNlciBwcm92aWRlIGEgY3VzdG9tIHNoYWRlclxcbnRvIGZpbGwgaW4gc2hhcGVzIGluIFdFQkdMIG1vZGUuIFVzZXJzIGNhbiBjcmVhdGUgdGhlaXJcXG5vd24gc2hhZGVycyBieSBsb2FkaW5nIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycyB3aXRoXFxubG9hZFNoYWRlcigpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNoYWRlclwiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBkZXNpcmVkIHA1LlNoYWRlciB0byB1c2UgZm9yIHJlbmRlcmluZ1xcbnNoYXBlcy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlNoYWRlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkxpZ2h0cywgQ2FtZXJhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGVyaWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL21hdGVyaWFsLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTUwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk5vcm1hbCBtYXRlcmlhbCBmb3IgZ2VvbWV0cnkuIFlvdSBjYW4gdmlldyBhbGxcXG5wb3NzaWJsZSBtYXRlcmlhbHMgaW4gdGhpc1xcbjxhIGhyZWY9XFxcImh0dHBzOi8vcDVqcy5vcmcvZXhhbXBsZXMvM2QtbWF0ZXJpYWxzLmh0bWxcXFwiPmV4YW1wbGU8L2E+LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vcm1hbE1hdGVyaWFsXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIG5vcm1hbE1hdGVyaWFsKCk7XFxuICBzcGhlcmUoNTApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIlJlZCwgZ3JlZW4gYW5kIGJsdWUgZ3JhZGllbnQuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0ZXJpYWxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvbWF0ZXJpYWwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxODUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGV4dHVyZSBmb3IgZ2VvbWV0cnkuICBZb3UgY2FuIHZpZXcgb3RoZXIgcG9zc2libGUgbWF0ZXJpYWxzIGluIHRoaXNcXG48YSBocmVmPVxcXCJodHRwczovL3A1anMub3JnL2V4YW1wbGVzLzNkLW1hdGVyaWFscy5odG1sXFxcIj5leGFtcGxlPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0ZXh0dXJlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0ZXhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPjItZGltZW5zaW9uYWwgZ3JhcGhpY3NcXG4gICAgICAgICAgICAgICAgICAgdG8gcmVuZGVyIGFzIHRleHR1cmU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LkltYWdlfHA1Lk1lZGlhRWxlbWVudHxwNS5HcmFwaGljc1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG52YXIgaW1nO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9sYURlZmVuc2UuanBnJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgcm90YXRlWihmcmFtZUNvdW50ICogMC4wMSk7XFxuICByb3RhdGVYKGZyYW1lQ291bnQgKiAwLjAxKTtcXG4gIHJvdGF0ZVkoZnJhbWVDb3VudCAqIDAuMDEpO1xcbiAgLy9wYXNzIGltYWdlIGFzIHRleHR1cmVcXG4gIHRleHR1cmUoaW1nKTtcXG4gIGJveCgyMDAsIDIwMCwgMjAwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxudmFyIHBnO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxuICBwZyA9IGNyZWF0ZUdyYXBoaWNzKDIwMCwgMjAwKTtcXG4gIHBnLnRleHRTaXplKDEwMCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgcGcuYmFja2dyb3VuZCgyNTUpO1xcbiAgcGcudGV4dCgnaGVsbG8hJywgMCwgMTAwKTtcXG4gIC8vcGFzcyBpbWFnZSBhcyB0ZXh0dXJlXFxuICB0ZXh0dXJlKHBnKTtcXG4gIHBsYW5lKDIwMCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG5cXG48ZGl2Plxcbjxjb2RlPlxcbnZhciB2aWQ7XFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIHZpZCA9IGNyZWF0ZVZpZGVvKCdhc3NldHMvZmluZ2Vycy5tb3YnKTtcXG4gIHZpZC5oaWRlKCk7XFxuICB2aWQubG9vcCgpO1xcbn1cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgwKTtcXG4gIC8vcGFzcyB2aWRlbyBmcmFtZSBhcyB0ZXh0dXJlXFxuICB0ZXh0dXJlKHZpZCk7XFxuICBwbGFuZSgyMDApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIlJvdGF0aW5nIHZpZXcgb2YgbWFueSBpbWFnZXMgdW1icmVsbGEgYW5kIGdyaWQgcm9vZiBvbiBhIDNkIHBsYW5lXFxuYmxhY2sgY2FudmFzXFxuYmxhY2sgY2FudmFzXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiTWF0ZXJpYWxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvbWF0ZXJpYWwuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNzUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QW1iaWVudCBtYXRlcmlhbCBmb3IgZ2VvbWV0cnkgd2l0aCBhIGdpdmVuIGNvbG9yLiBZb3UgY2FuIHZpZXcgYWxsXFxucG9zc2libGUgbWF0ZXJpYWxzIGluIHRoaXNcXG48YSBocmVmPVxcXCJodHRwczovL3A1anMub3JnL2V4YW1wbGVzLzNkLW1hdGVyaWFscy5odG1sXFxcIj5leGFtcGxlPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhbWJpZW50TWF0ZXJpYWxcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xcbn1cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgwKTtcXG4gIGFtYmllbnRMaWdodCgxMDApO1xcbiAgcG9pbnRMaWdodCgyNTAsIDI1MCwgMjUwLCAxMDAsIDEwMCwgMCk7XFxuICBhbWJpZW50TWF0ZXJpYWwoMjUwKTtcXG4gIHNwaGVyZSg1MCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiYWx0XCI6IFwicmFkaWF0aW5nIGxpZ2h0IHNvdXJjZSBmcm9tIHRvcCByaWdodCBvZiBjYW52YXNcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJMaWdodHMsIENhbWVyYVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJNYXRlcmlhbFwiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDI3NSxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmdyYXkgdmFsdWUsIHJlZCBvciBodWUgdmFsdWVcXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbG9yIG1vZGUpLDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ncmVlbiBvciBzYXR1cmF0aW9uIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ibHVlIG9yIGJyaWdodG5lc3MgdmFsdWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+b3BhY2l0eTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMzA2LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y29sb3IsIGNvbG9yIEFycmF5LCBvciBDU1MgY29sb3Igc3RyaW5nPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcltdfFN0cmluZ3xwNS5Db2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy93ZWJnbC9tYXRlcmlhbC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMyNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TcGVjdWxhciBtYXRlcmlhbCBmb3IgZ2VvbWV0cnkgd2l0aCBhIGdpdmVuIGNvbG9yLiBZb3UgY2FuIHZpZXcgYWxsXFxucG9zc2libGUgbWF0ZXJpYWxzIGluIHRoaXNcXG48YSBocmVmPVxcXCJodHRwczovL3A1anMub3JnL2V4YW1wbGVzLzNkLW1hdGVyaWFscy5odG1sXFxcIj5leGFtcGxlPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzcGVjdWxhck1hdGVyaWFsXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMCk7XFxuICBhbWJpZW50TGlnaHQoMTAwKTtcXG4gIHBvaW50TGlnaHQoMjUwLCAyNTAsIDI1MCwgMTAwLCAxMDAsIDApO1xcbiAgc3BlY3VsYXJNYXRlcmlhbCgyNTApO1xcbiAgc3BoZXJlKDUwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJkaWZmdXNlZCByYWRpYXRpbmcgbGlnaHQgc291cmNlIGZyb20gdG9wIHJpZ2h0IG9mIGNhbnZhc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIkxpZ2h0cywgQ2FtZXJhXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIk1hdGVyaWFsXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMzI0LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Z3JheSB2YWx1ZSwgcmVkIG9yIGh1ZSB2YWx1ZVxcbiAgICAgICAgICAgICAgICAgICAgICAoZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbG9yIG1vZGUpLDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ncmVlbiBvciBzYXR1cmF0aW9uIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2M1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5ibHVlIG9yIGJyaWdodG5lc3MgdmFsdWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+b3BhY2l0eTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogMzU1LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29sb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y29sb3IgQXJyYXksIG9yIENTUyBjb2xvciBzdHJpbmc8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyW118U3RyaW5nfHA1LkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL3A1Lkdlb21ldHJ5LmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjb21wdXRlRmFjZXNcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuR2VvbWV0cnlcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcDUuR2VvbWV0cnkuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jb21wdXRlcyBzbW9vdGggbm9ybWFscyBwZXIgdmVydGV4IGFzIGFuIGF2ZXJhZ2Ugb2YgZWFjaFxcbmZhY2UuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29tcHV0ZU5vcm1hbHNcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuR2VvbWV0cnlcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcDUuR2VvbWV0cnkuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMzMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXZlcmFnZXMgdGhlIHZlcnRleCBub3JtYWxzLiBVc2VkIGluIGN1cnZlZFxcbnN1cmZhY2VzPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXZlcmFnZU5vcm1hbHNcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuR2VvbWV0cnlcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcDUuR2VvbWV0cnkuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNTQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXZlcmFnZXMgcG9sZSBub3JtYWxzLiAgVXNlZCBpbiBzcGhlcmljYWwgcHJpbWl0aXZlczwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImF2ZXJhZ2VQb2xlTm9ybWFsc1wiLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5HZW9tZXRyeVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJMaWdodHMsIENhbWVyYVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy93ZWJnbC9wNS5HZW9tZXRyeS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI0NyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Nb2RpZmllcyBhbGwgdmVydGljZXMgdG8gYmUgY2VudGVyZWQgd2l0aGluIHRoZSByYW5nZSAtMTAwIHRvIDEwMC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJub3JtYWxpemVcIixcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuR2VvbWV0cnlcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiTGlnaHRzLCBDYW1lcmFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcDUuUmVuZGVyZXJHTC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE5NyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgYXR0cmlidXRlcyBmb3IgdGhlIFdlYkdMIERyYXdpbmcgY29udGV4dC5cXG5UaGlzIGlzIGEgd2F5IG9mIGFkanVzdGluZyB3YXlzIHRoYXQgdGhlIFdlYkdMXFxucmVuZGVyZXIgd29ya3MgdG8gZmluZS10dW5lIHRoZSBkaXNwbGF5IGFuZCBwZXJmb3JtYW5jZS5cXG5UaGlzIHNob3VsZCBiZSBwdXQgaW4gc2V0dXAoKS5cXG5UaGUgYXZhaWxhYmxlIGF0dHJpYnV0ZXMgYXJlOlxcbjxicj5cXG5hbHBoYSAtIGluZGljYXRlcyBpZiB0aGUgY2FudmFzIGNvbnRhaW5zIGFuIGFscGhhIGJ1ZmZlclxcbmRlZmF1bHQgaXMgdHJ1ZVxcbjxicj48YnI+XFxuZGVwdGggLSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZHJhd2luZyBidWZmZXIgaGFzIGEgZGVwdGggYnVmZmVyXFxub2YgYXQgbGVhc3QgMTYgYml0cyAtIGRlZmF1bHQgaXMgdHJ1ZVxcbjxicj48YnI+XFxuc3RlbmNpbCAtIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYSBzdGVuY2lsIGJ1ZmZlclxcbm9mIGF0IGxlYXN0IDggYml0c1xcbjxicj48YnI+XFxuYW50aWFsaWFzIC0gaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHBlcmZvcm0gYW50aS1hbGlhc2luZ1xcbmRlZmF1bHQgaXMgZmFsc2VcXG48YnI+PGJyPlxcbnByZW11bHRpcGxpZWRBbHBoYSAtIGluZGljYXRlcyB0aGF0IHRoZSBwYWdlIGNvbXBvc2l0b3Igd2lsbCBhc3N1bWVcXG50aGUgZHJhd2luZyBidWZmZXIgY29udGFpbnMgY29sb3JzIHdpdGggcHJlLW11bHRpcGxpZWQgYWxwaGFcXG5kZWZhdWx0IGlzIGZhbHNlXFxuPGJyPjxicj5cXG5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgLSBpZiB0cnVlIHRoZSBidWZmZXJzIHdpbGwgbm90IGJlIGNsZWFyZWQgYW5kXFxuYW5kIHdpbGwgcHJlc2VydmUgdGhlaXIgdmFsdWVzIHVudGlsIGNsZWFyZWQgb3Igb3ZlcndyaXR0ZW4gYnkgYXV0aG9yXFxuKG5vdGUgdGhhdCBwNSBjbGVhcnMgYXV0b21hdGljYWxseSBvbiBkcmF3IGxvb3ApXFxuZGVmYXVsdCBpcyB0cnVlXFxuPGJyPjxicj5cXG5wZXJQaXhlbExpZ2h0aW5nIC0gaWYgdHJ1ZSwgcGVyLXBpeGVsIGxpZ2h0aW5nIHdpbGwgYmUgdXNlZCBpbiB0aGVcXG5saWdodGluZyBzaGFkZXIuXFxuZGVmYXVsdCBpcyBmYWxzZVxcbjxicj48YnI+PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0QXR0cmlidXRlc1wiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjU1KTtcXG4gIHB1c2goKTtcXG4gIHJvdGF0ZVooZnJhbWVDb3VudCAqIDAuMDIpO1xcbiAgcm90YXRlWChmcmFtZUNvdW50ICogMC4wMik7XFxuICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAyKTtcXG4gIGZpbGwoMCwgMCwgMCk7XFxuICBib3goNTApO1xcbiAgcG9wKCk7XFxufVxcbjwvY29kZT5cXG48L2Rpdj5cXG48YnI+XFxuTm93IHdpdGggdGhlIGFudGlhbGlhcyBhdHRyaWJ1dGUgc2V0IHRvIHRydWUuXFxuPGJyPlxcbjxkaXY+XFxuPGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG4gIHNldEF0dHJpYnV0ZXMoJ2FudGlhbGlhcycsIHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyNTUpO1xcbiAgcHVzaCgpO1xcbiAgcm90YXRlWihmcmFtZUNvdW50ICogMC4wMik7XFxuICByb3RhdGVYKGZyYW1lQ291bnQgKiAwLjAyKTtcXG4gIHJvdGF0ZVkoZnJhbWVDb3VudCAqIDAuMDIpO1xcbiAgZmlsbCgwLCAwLCAwKTtcXG4gIGJveCg1MCk7XFxuICBwb3AoKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlxcblxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gcHJlc3MgdGhlIG1vdXNlIGJ1dHRvbiB0byBlbmFibGUgcGVyUGl4ZWxMaWdodGluZ1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxuICBub1N0cm9rZSgpO1xcbiAgZmlsbCgyNTUpO1xcbn1cXG5cXG52YXIgbGlnaHRzID0gW1xcbiAgeyBjOiAnI2YwMCcsIHQ6IDEuMTIsIHA6IDEuOTEsIHI6IDAuMiB9LFxcbiAgeyBjOiAnIzBmMCcsIHQ6IDEuMjEsIHA6IDEuMzEsIHI6IDAuMiB9LFxcbiAgeyBjOiAnIzAwZicsIHQ6IDEuMzcsIHA6IDEuNTcsIHI6IDAuMiB9LFxcbiAgeyBjOiAnI2ZmMCcsIHQ6IDEuMTIsIHA6IDEuOTEsIHI6IDAuNyB9LFxcbiAgeyBjOiAnIzBmZicsIHQ6IDEuMjEsIHA6IDEuMzEsIHI6IDAuNyB9LFxcbiAgeyBjOiAnI2YwZicsIHQ6IDEuMzcsIHA6IDEuNTcsIHI6IDAuNyB9XFxuXTtcXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgdmFyIHQgPSBtaWxsaXMoKSAvIDEwMDAgKyAxMDAwO1xcbiAgYmFja2dyb3VuZCgwKTtcXG4gIGRpcmVjdGlvbmFsTGlnaHQoY29sb3IoJyMyMjInKSwgMSwgMSwgMSk7XFxuXFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpZ2h0cy5sZW5ndGg7IGkrKykge1xcbiAgICB2YXIgbGlnaHQgPSBsaWdodHNbaV07XFxuICAgIHBvaW50TGlnaHQoXFxuICAgICAgY29sb3IobGlnaHQuYyksXFxuICAgICAgcDUuVmVjdG9yLmZyb21BbmdsZXModCAqIGxpZ2h0LnQsIHQgKiBsaWdodC5wLCB3aWR0aCAqIGxpZ2h0LnIpXFxuICAgICk7XFxuICB9XFxuXFxuICBzcGVjdWxhck1hdGVyaWFsKDI1NSk7XFxuICBzcGhlcmUod2lkdGggKiAwLjEpO1xcblxcbiAgcm90YXRlWCh0ICogMC43Nyk7XFxuICByb3RhdGVZKHQgKiAwLjgzKTtcXG4gIHJvdGF0ZVoodCAqIDAuOTEpO1xcbiAgdG9ydXMod2lkdGggKiAwLjMsIHdpZHRoICogMC4wNywgMzAsIDEwKTtcXG59XFxuXFxuZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xcbiAgc2V0QXR0cmlidXRlcygncGVyUGl4ZWxMaWdodGluZycsIHRydWUpO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMjU1KTtcXG59XFxuZnVuY3Rpb24gbW91c2VSZWxlYXNlZCgpIHtcXG4gIHNldEF0dHJpYnV0ZXMoJ3BlclBpeGVsTGlnaHRpbmcnLCBmYWxzZSk7XFxuICBub1N0cm9rZSgpO1xcbiAgZmlsbCgyNTUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcImEgcm90YXRpbmcgY3ViZSB3aXRoIHNtb290aGVyIGVkZ2VzXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiUmVuZGVyaW5nXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIlJlbmRlcmluZ1wiLFxuICAgICAgICAgICAgXCJvdmVybG9hZHNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDE5NyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImtleVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OYW1lIG9mIGF0dHJpYnV0ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OZXcgdmFsdWUgb2YgbmFtZWQgYXR0cmlidXRlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibGluZVwiOiAzMzAsXG4gICAgICAgICAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJvYmpcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+b2JqZWN0IHdpdGgga2V5LXZhbHVlIHBhaXJzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy93ZWJnbC9wNS5TaGFkZXIuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNzAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+V3JhcHBlciBhcm91bmQgZ2wudW5pZm9ybSBmdW5jdGlvbnMuXFxuQXMgd2Ugc3RvcmUgdW5pZm9ybSBpbmZvIGluIHRoZSBzaGFkZXIgd2UgY2FuIHVzZSB0aGF0XFxudG8gZG8gdHlwZSBjaGVja2luZyBvbiB0aGUgc3VwcGxpZWQgZGF0YSBhbmQgY2FsbFxcbnRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRVbmlmb3JtXCIsXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5pZm9ybU5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIGluIHRoZVxcbnNoYWRlciBwcm9ncmFtPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkYXRhXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgZGF0YSB0byBiZSBhc3NvY2lhdGVkXFxud2l0aCB0aGF0IHVuaWZvcm07IHR5cGUgdmFyaWVzIChjb3VsZCBiZSBhIHNpbmdsZSBudW1lcmljYWwgdmFsdWUsIGFycmF5LFxcbm1hdHJpeCwgb3IgdGV4dHVyZSAvIHNhbXBsZXIgcmVmZXJlbmNlKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fE51bWJlcnxCb29sZWFufE51bWJlcltdXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNoYWRlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJMaWdodHMsIENhbWVyYVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJTaGFkZXJzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwic3JjL3dlYmdsL3ByaW1pdGl2ZXMuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EcmF3IGEgcGxhbmUgd2l0aCBnaXZlbiBhIHdpZHRoIGFuZCBoZWlnaHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwbGFuZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid2lkdGhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPndpZHRoIG9mIHRoZSBwbGFuZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJoZWlnaHRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmhlaWdodCBvZiB0aGUgcGxhbmU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGV0YWlsWFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+T3B0aW9uYWwgbnVtYmVyIG9mIHRyaWFuZ2xlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmRpdmlzaW9ucyBpbiB4LWRpbWVuc2lvbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGV0YWlsWVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+T3B0aW9uYWwgbnVtYmVyIG9mIHRyaWFuZ2xlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmRpdmlzaW9ucyBpbiB5LWRpbWVuc2lvbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbi8vZHJhdyBhIHBsYW5lIHdpdGggd2lkdGggNTAgYW5kIGhlaWdodCA1MFxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICBwbGFuZSg1MCwgNTApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImFsdFwiOiBcIk5vdGhpbmcgZGlzcGxheWVkIG9uIGNhbnZhc1xcblJvdGF0aW5nIGludGVyaW9yIHZpZXcgb2YgYSBib3ggd2l0aCBzaWRlcyB0aGF0IGNoYW5nZSBjb2xvci5cXG4zZCByZWQgYW5kIGdyZWVuIGdyYWRpZW50LlxcblJvdGF0aW5nIGludGVyaW9yIHZpZXcgb2YgYSBjeWxpbmRlciB3aXRoIHNpZGVzIHRoYXQgY2hhbmdlIGNvbG9yLlxcblJvdGF0aW5nIHZpZXcgb2YgYSBjeWxpbmRlciB3aXRoIHNpZGVzIHRoYXQgY2hhbmdlIGNvbG9yLlxcbjNkIHJlZCBhbmQgZ3JlZW4gZ3JhZGllbnQuXFxucm90YXRpbmcgdmlldyBvZiBhIG11bHRpLWNvbG9yZWQgY3lsaW5kZXIgd2l0aCBjb25jYXZlIHNpZGVzLlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIjNEIFByaW1pdGl2ZXNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcHJpbWl0aXZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDk2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRyYXcgYSBib3ggd2l0aCBnaXZlbiB3aWR0aCwgaGVpZ2h0IGFuZCBkZXB0aDwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImJveFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid2lkdGhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPndpZHRoIG9mIHRoZSBib3g8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiSGVpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5oZWlnaHQgb2YgdGhlIGJveDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZXB0aFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZGVwdGggb2YgdGhlIGJveDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZXRhaWxYXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5PcHRpb25hbCBudW1iZXIgb2YgdHJpYW5nbGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJkaXZpc2lvbnMgaW4geC1kaW1lbnNpb248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRldGFpbFlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk9wdGlvbmFsIG51bWJlciBvZiB0cmlhbmdsZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmRpdmlzaW9ucyBpbiB5LWRpbWVuc2lvbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjaGFpbmFibGVcIjogMSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Plxcbjxjb2RlPlxcbi8vZHJhdyBhIHNwaW5uaW5nIGJveCB3aXRoIHdpZHRoLCBoZWlnaHQgYW5kIGRlcHRoIDIwMFxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICByb3RhdGVYKGZyYW1lQ291bnQgKiAwLjAxKTtcXG4gIHJvdGF0ZVkoZnJhbWVDb3VudCAqIDAuMDEpO1xcbiAgYm94KDUwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIjNEIFByaW1pdGl2ZXNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcHJpbWl0aXZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIxMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EcmF3IGEgc3BoZXJlIHdpdGggZ2l2ZW4gcmFkaXVzPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3BoZXJlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyYWRpdXNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnJhZGl1cyBvZiBjaXJjbGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGV0YWlsWFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIG9mIHNlZ21lbnRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHNtb290aGVyIGdlb21ldHJ5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIDI0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZXRhaWxZXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgb2Ygc2VnbWVudHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbW9yZSBzZWdtZW50cyB0aGUgc21vb3RoZXIgZ2VvbWV0cnlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMTY8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vLyBkcmF3IGEgc3BoZXJlIHdpdGggcmFkaXVzIDIwMFxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICBzcGhlcmUoNDApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiM0QgUHJpbWl0aXZlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy93ZWJnbC9wcmltaXRpdmVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzkxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRyYXcgYSBjeWxpbmRlciB3aXRoIGdpdmVuIHJhZGl1cyBhbmQgaGVpZ2h0PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3lsaW5kZXJcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJhZGl1c1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cmFkaXVzIG9mIHRoZSBzdXJmYWNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhlaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aGVpZ2h0IG9mIHRoZSBjeWxpbmRlcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZXRhaWxYXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgb2Ygc2VnbWVudHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHNtb290aGVyIGdlb21ldHJ5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyAyNDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGV0YWlsWVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIG9mIHNlZ21lbnRzIGluIHktZGltZW5zaW9uLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtb3JlIHNlZ21lbnRzIHRoZSBzbW9vdGhlciBnZW9tZXRyeVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYm90dG9tQ2FwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD53aGV0aGVyIHRvIGRyYXcgdGhlIGJvdHRvbSBvZiB0aGUgY3lsaW5kZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRvcENhcFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+d2hldGhlciB0byBkcmF3IHRoZSB0b3Agb2YgdGhlIGN5bGluZGVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy9kcmF3IGEgc3Bpbm5pbmcgY3lsaW5kZXIgd2l0aCByYWRpdXMgMjAgYW5kIGhlaWdodCA1MFxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICByb3RhdGVYKGZyYW1lQ291bnQgKiAwLjAxKTtcXG4gIHJvdGF0ZVooZnJhbWVDb3VudCAqIDAuMDEpO1xcbiAgY3lsaW5kZXIoMjAsIDUwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIjNEIFByaW1pdGl2ZXNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcHJpbWl0aXZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ4MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EcmF3IGEgY29uZSB3aXRoIGdpdmVuIHJhZGl1cyBhbmQgaGVpZ2h0PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29uZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFkaXVzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yYWRpdXMgb2YgdGhlIGJvdHRvbSBzdXJmYWNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhlaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aGVpZ2h0IG9mIHRoZSBjb25lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRldGFpbFhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBzZWdtZW50cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHNtb290aGVyIGdlb21ldHJ5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMjQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRldGFpbFlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBzZWdtZW50cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHNtb290aGVyIGdlb21ldHJ5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD53aGV0aGVyIHRvIGRyYXcgdGhlIGJhc2Ugb2YgdGhlIGNvbmU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vL2RyYXcgYSBzcGlubmluZyBjb25lIHdpdGggcmFkaXVzIDQwIGFuZCBoZWlnaHQgNzBcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgcm90YXRlWChmcmFtZUNvdW50ICogMC4wMSk7XFxuICByb3RhdGVaKGZyYW1lQ291bnQgKiAwLjAxKTtcXG4gIGNvbmUoNDAsIDcwKTtcXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcIlNoYXBlXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcIjNEIFByaW1pdGl2ZXNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJzcmMvd2ViZ2wvcHJpbWl0aXZlcy5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU1MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EcmF3IGFuIGVsbGlwc29pZCB3aXRoIGdpdmVuIHJhZGl1czwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImVsbGlwc29pZFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFkaXVzeFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eHJhZGl1cyBvZiBjaXJjbGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFkaXVzeVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eXJhZGl1cyBvZiBjaXJjbGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFkaXVzelwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+enJhZGl1cyBvZiBjaXJjbGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGV0YWlsWFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bnVtYmVyIG9mIHNlZ21lbnRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHNtb290aGVyIGdlb21ldHJ5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIDI0LiBBdm9pZCBkZXRhaWwgbnVtYmVyIGFib3ZlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAsIGl0IG1heSBjcmFzaCB0aGUgYnJvd3Nlci48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRldGFpbFlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBzZWdtZW50cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtb3JlIHNlZ21lbnRzIHRoZSBzbW9vdGhlciBnZW9tZXRyeVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyAxNi4gQXZvaWQgZGV0YWlsIG51bWJlciBhYm92ZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwLCBpdCBtYXkgY3Jhc2ggdGhlIGJyb3dzZXIuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJJbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNoYWluYWJsZVwiOiAxLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+XFxuPGNvZGU+XFxuLy8gZHJhdyBhbiBlbGxpcHNvaWQgd2l0aCByYWRpdXMgMjAsIDMwIGFuZCA0MC5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgZWxsaXBzb2lkKDIwLCAzMCwgNDApO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiM0QgUHJpbWl0aXZlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcInNyYy93ZWJnbC9wcmltaXRpdmVzLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjQzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRyYXcgYSB0b3J1cyB3aXRoIGdpdmVuIHJhZGl1cyBhbmQgdHViZSByYWRpdXM8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0b3J1c1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFkaXVzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yYWRpdXMgb2YgdGhlIHdob2xlIHJpbmc8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidHViZVJhZGl1c1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cmFkaXVzIG9mIHRoZSB0dWJlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRldGFpbFhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBzZWdtZW50cyBpbiB4LWRpbWVuc2lvbixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHNtb290aGVyIGdlb21ldHJ5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMjQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRldGFpbFlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm51bWJlciBvZiBzZWdtZW50cyBpbiB5LWRpbWVuc2lvbixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHNtb290aGVyIGdlb21ldHJ5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMTY8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2hhaW5hYmxlXCI6IDEsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj5cXG48Y29kZT5cXG4vL2RyYXcgYSBzcGlubmluZyB0b3J1cyB3aXRoIHJhZGl1cyAyMDAgYW5kIHR1YmUgcmFkaXVzIDYwXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xcbiAgcm90YXRlWShmcmFtZUNvdW50ICogMC4wMSk7XFxuICB0b3J1cyg1MCwgMTUpO1xcbn1cXG48L2NvZGU+XFxuPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwiU2hhcGVcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwiM0QgUHJpbWl0aXZlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2VhcmNoZXMgdGhlIHBhZ2UgZm9yIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gSUQsIGNsYXNzLCBvciB0YWcgbmFtZSAodXNpbmcgdGhlICYjMzk7IyYjMzk7IG9yICYjMzk7LiYjMzk7XFxucHJlZml4ZXMgdG8gc3BlY2lmeSBhbiBJRCBvciBjbGFzcyByZXNwZWN0aXZlbHksIGFuZCBub25lIGZvciBhIHRhZykgYW5kIHJldHVybnMgaXQgYXNcXG5hIHA1LkVsZW1lbnQuIElmIGEgY2xhc3Mgb3IgdGFnIG5hbWUgaXMgZ2l2ZW4gd2l0aCBtb3JlIHRoYW4gMSBlbGVtZW50LFxcbm9ubHkgdGhlIGZpcnN0IGVsZW1lbnQgd2lsbCBiZSByZXR1cm5lZC5cXG5UaGUgRE9NIG5vZGUgaXRzZWxmIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIC5lbHQuXFxuUmV0dXJucyBudWxsIGlmIG5vbmUgZm91bmQuIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgY29udGFpbmVyIHRvIHNlYXJjaCB3aXRoaW4uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2VsZWN0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5pZCwgY2xhc3MsIG9yIHRhZyBuYW1lIG9mIGVsZW1lbnQgdG8gc2VhcmNoIGZvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29udGFpbmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5pZCwgcDUuRWxlbWVudCwgb3JcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUwgZWxlbWVudCB0byBzZWFyY2ggd2l0aGluPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8cDUuRWxlbWVudHxIVE1MRWxlbWVudFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwNS5FbGVtZW50IGNvbnRhaW5pbmcgbm9kZSBmb3VuZFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxwNS5FbGVtZW50fG51bGxcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2ID48Y29kZSBjbGFzcz0nbm9yZW5kZXInPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIC8vdHJhbnNsYXRlcyBjYW52YXMgNTBweCBkb3duXFxuICBzZWxlY3QoJ2NhbnZhcycpLnBvc2l0aW9uKDEwMCwgMTAwKTtcXG59XFxuPC9jb2RlPjwvZGl2PlxcbjxkaXY+PGNvZGUgY2xhc3M9J25vcmVuZGVyJz5cXG4vLyB0aGVzZSBhcmUgYWxsIHZhbGlkIGNhbGxzIHRvIHNlbGVjdCgpXFxudmFyIGEgPSBzZWxlY3QoJyNtb28nKTtcXG52YXIgYiA9IHNlbGVjdCgnI2JsYWgnLCAnI215Q29udGFpbmVyJyk7XFxudmFyIGMsIGU7XFxuaWYgKGIpIHtcXG4gIGMgPSBzZWxlY3QoJyNmb28nLCBiKTtcXG59XFxudmFyIGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmVlcCcpO1xcbmlmIChkKSB7XFxuICBlID0gc2VsZWN0KCdwJywgZCk7XFxufVxcblthLCBiLCBjLCBkLCBlXTsgLy8gdW51c2VkXFxuPC9jb2RlPjwvZGl2PlxcblwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2VhcmNoZXMgdGhlIHBhZ2UgZm9yIGVsZW1lbnRzIHdpdGggdGhlIGdpdmVuIGNsYXNzIG9yIHRhZyBuYW1lICh1c2luZyB0aGUgJiMzOTsuJiMzOTsgcHJlZml4XFxudG8gc3BlY2lmeSBhIGNsYXNzIGFuZCBubyBwcmVmaXggZm9yIGEgdGFnKSBhbmQgcmV0dXJucyB0aGVtIGFzIHA1LkVsZW1lbnRzXFxuaW4gYW4gYXJyYXkuXFxuVGhlIERPTSBub2RlIGl0c2VsZiBjYW4gYmUgYWNjZXNzZWQgd2l0aCAuZWx0LlxcblJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZSBmb3VuZC5cXG5Zb3UgY2FuIGFsc28gc3BlY2lmeSBhIGNvbnRhaW5lciB0byBzZWFyY2ggd2l0aGluLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNlbGVjdEFsbFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y2xhc3Mgb3IgdGFnIG5hbWUgb2YgZWxlbWVudHMgdG8gc2VhcmNoIGZvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29udGFpbmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5pZCwgcDUuRWxlbWVudCwgb3IgSFRNTCBlbGVtZW50IHRvIHNlYXJjaCB3aXRoaW48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBcnJheSBvZiBwNS5FbGVtZW50cyBjb250YWluaW5nIG5vZGVzIGZvdW5kXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVCdXR0b24oJ2J0bicpO1xcbiAgY3JlYXRlQnV0dG9uKCcybmQgYnRuJyk7XFxuICBjcmVhdGVCdXR0b24oJzNyZCBidG4nKTtcXG4gIHZhciBidXR0b25zID0gc2VsZWN0QWxsKCdidXR0b24nKTtcXG5cXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7IGkrKykge1xcbiAgICBidXR0b25zW2ldLnNpemUoMTAwLCAxMDApO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbi8vIHRoZXNlIGFyZSBhbGwgdmFsaWQgY2FsbHMgdG8gc2VsZWN0QWxsKClcXG52YXIgYSA9IHNlbGVjdEFsbCgnLm1vbycpO1xcbmEgPSBzZWxlY3RBbGwoJ2RpdicpO1xcbmEgPSBzZWxlY3RBbGwoJ2J1dHRvbicsICcjbXlDb250YWluZXInKTtcXG5cXG52YXIgZCA9IHNlbGVjdCgnI2NvbnRhaW5lcicpO1xcbmEgPSBzZWxlY3RBbGwoJ3AnLCBkKTtcXG5cXG52YXIgZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZWVwJyk7XFxuYSA9IHNlbGVjdCgnLmJsYWgnLCBmKTtcXG5cXG5hOyAvLyB1bnVzZWRcXG48L2NvZGU+PC9kaXY+XFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5IZWxwZXIgZnVuY3Rpb24gZm9yIHNlbGVjdCBhbmQgc2VsZWN0QWxsPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxODQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SGVscGVyIGZ1bmN0aW9uIGZvciBnZXRFbGVtZW50IGFuZCBnZXRFbGVtZW50cy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIxOCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZW1vdmVzIGFsbCBlbGVtZW50cyBjcmVhdGVkIGJ5IHA1LCBleGNlcHQgYW55IGNhbnZhcyAvIGdyYXBoaWNzXFxuZWxlbWVudHMgY3JlYXRlZCBieSBjcmVhdGVDYW52YXMgb3IgY3JlYXRlR3JhcGhpY3MuXFxuRXZlbnQgaGFuZGxlcnMgYXJlIHJlbW92ZWQsIGFuZCBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlbW92ZUVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGNyZWF0ZURpdigndGhpcyBpcyBzb21lIHRleHQnKTtcXG4gIGNyZWF0ZVAoJ3RoaXMgaXMgYSBwYXJhZ3JhcGgnKTtcXG59XFxuZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xcbiAgcmVtb3ZlRWxlbWVudHMoKTsgLy8gdGhpcyB3aWxsIHJlbW92ZSB0aGUgZGl2IGFuZCBwLCBub3QgY2FudmFzXFxufVxcbjwvY29kZT48L2Rpdj5cXG5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjQ1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkhlbHBlcnMgZm9yIGNyZWF0ZSBtZXRob2RzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjU2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgYSAmbHQ7ZGl2Jmd0OyZsdDsvZGl2Jmd0OyBlbGVtZW50IGluIHRoZSBET00gd2l0aCBnaXZlbiBpbm5lciBIVE1MLlxcbkFwcGVuZHMgdG8gdGhlIGNvbnRhaW5lciBub2RlIGlmIG9uZSBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZVxcbmFwcGVuZHMgdG8gYm9keS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVEaXZcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImh0bWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmlubmVyIEhUTUwgZm9yIGVsZW1lbnQgY3JlYXRlZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInBvaW50ZXIgdG8gcDUuRWxlbWVudCBob2xkaW5nIGNyZWF0ZWQgbm9kZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxwNS5FbGVtZW50XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbmNyZWF0ZURpdigndGhpcyBpcyBzb21lIHRleHQnKTtcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI3MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DcmVhdGVzIGEgJmx0O3AmZ3Q7Jmx0Oy9wJmd0OyBlbGVtZW50IGluIHRoZSBET00gd2l0aCBnaXZlbiBpbm5lciBIVE1MLiBVc2VkXFxuZm9yIHBhcmFncmFwaCBsZW5ndGggdGV4dC5cXG5BcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2VcXG5hcHBlbmRzIHRvIGJvZHkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3JlYXRlUFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaHRtbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5uZXIgSFRNTCBmb3IgZWxlbWVudCBjcmVhdGVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicG9pbnRlciB0byBwNS5FbGVtZW50IGhvbGRpbmcgY3JlYXRlZCBub2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuY3JlYXRlUCgndGhpcyBpcyBzb21lIHRleHQnKTtcXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI4NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DcmVhdGVzIGEgJmx0O3NwYW4mZ3Q7Jmx0Oy9zcGFuJmd0OyBlbGVtZW50IGluIHRoZSBET00gd2l0aCBnaXZlbiBpbm5lciBIVE1MLlxcbkFwcGVuZHMgdG8gdGhlIGNvbnRhaW5lciBub2RlIGlmIG9uZSBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZVxcbmFwcGVuZHMgdG8gYm9keS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVTcGFuXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJodG1sXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5pbm5lciBIVE1MIGZvciBlbGVtZW50IGNyZWF0ZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb2ludGVyIHRvIHA1LkVsZW1lbnQgaG9sZGluZyBjcmVhdGVkIG5vZGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG5jcmVhdGVTcGFuKCd0aGlzIGlzIHNvbWUgdGV4dCcpO1xcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzA4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgYW4gJmx0O2ltZyZndDsgZWxlbWVudCBpbiB0aGUgRE9NIHdpdGggZ2l2ZW4gc3JjIGFuZFxcbmFsdGVybmF0ZSB0ZXh0LlxcbkFwcGVuZHMgdG8gdGhlIGNvbnRhaW5lciBub2RlIGlmIG9uZSBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZVxcbmFwcGVuZHMgdG8gYm9keS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVJbWdcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNyY1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c3JjIHBhdGggb3IgdXJsIGZvciBpbWFnZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWx0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hbHRlcm5hdGUgdGV4dCB0byBiZSB1c2VkIGlmIGltYWdlIGRvZXMgbm90IGxvYWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3VjY2Vzc0NhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYWxsYmFjayB0byBiZSBjYWxsZWQgb25jZSBpbWFnZSBkYXRhIGlzIGxvYWRlZDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicG9pbnRlciB0byBwNS5FbGVtZW50IGhvbGRpbmcgY3JlYXRlZCBub2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuY3JlYXRlSW1nKCdodHRwOi8vcDVqcy5vcmcvaW1nL2FzdGVyaXNrLTAxLnBuZycpO1xcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzUxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgYW4gJmx0O2EmZ3Q7Jmx0Oy9hJmd0OyBlbGVtZW50IGluIHRoZSBET00gZm9yIGluY2x1ZGluZyBhIGh5cGVybGluay5cXG5BcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2VcXG5hcHBlbmRzIHRvIGJvZHkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3JlYXRlQVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaHJlZlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dXJsIG9mIHBhZ2UgdG8gbGluayB0bzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaHRtbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5uZXIgaHRtbCBvZiBsaW5rIGVsZW1lbnQgdG8gZGlzcGxheTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGFyZ2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50YXJnZXQgd2hlcmUgbmV3IGxpbmsgc2hvdWxkIG9wZW4sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIGJlIF9ibGFuaywgX3NlbGYsIF9wYXJlbnQsIF90b3AuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicG9pbnRlciB0byBwNS5FbGVtZW50IGhvbGRpbmcgY3JlYXRlZCBub2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuY3JlYXRlQSgnaHR0cDovL3A1anMub3JnLycsICd0aGlzIGlzIGEgbGluaycpO1xcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzc2LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAzNzgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhIHNsaWRlciAmbHQ7aW5wdXQmZ3Q7Jmx0Oy9pbnB1dCZndDsgZWxlbWVudCBpbiB0aGUgRE9NLlxcblVzZSAuc2l6ZSgpIHRvIHNldCB0aGUgZGlzcGxheSBsZW5ndGggb2YgdGhlIHNsaWRlci5cXG5BcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2VcXG5hcHBlbmRzIHRvIGJvZHkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3JlYXRlU2xpZGVyXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm1pbmltdW0gdmFsdWUgb2YgdGhlIHNsaWRlcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibWF4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5tYXhpbXVtIHZhbHVlIG9mIHRoZSBzbGlkZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5kZWZhdWx0IHZhbHVlIG9mIHRoZSBzbGlkZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RlcFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c3RlcCBzaXplIGZvciBlYWNoIHRpY2sgb2YgdGhlIHNsaWRlciAoaWYgc3RlcCBpcyBzZXQgdG8gMCwgdGhlIHNsaWRlciB3aWxsIG1vdmUgY29udGludW91c2x5IGZyb20gdGhlIG1pbmltdW0gdG8gdGhlIG1heGltdW0gdmFsdWUpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicG9pbnRlciB0byBwNS5FbGVtZW50IGhvbGRpbmcgY3JlYXRlZCBub2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBzbGlkZXI7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBzbGlkZXIgPSBjcmVhdGVTbGlkZXIoMCwgMjU1LCAxMDApO1xcbiAgc2xpZGVyLnBvc2l0aW9uKDEwLCAxMCk7XFxuICBzbGlkZXIuc3R5bGUoJ3dpZHRoJywgJzgwcHgnKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIHZhciB2YWwgPSBzbGlkZXIudmFsdWUoKTtcXG4gIGJhY2tncm91bmQodmFsKTtcXG59XFxuPC9jb2RlPjwvZGl2PlxcblxcbjxkaXY+PGNvZGU+XFxudmFyIHNsaWRlcjtcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNvbG9yTW9kZShIU0IpO1xcbiAgc2xpZGVyID0gY3JlYXRlU2xpZGVyKDAsIDM2MCwgNjAsIDQwKTtcXG4gIHNsaWRlci5wb3NpdGlvbigxMCwgMTApO1xcbiAgc2xpZGVyLnN0eWxlKCd3aWR0aCcsICc4MHB4Jyk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICB2YXIgdmFsID0gc2xpZGVyLnZhbHVlKCk7XFxuICBiYWNrZ3JvdW5kKHZhbCwgMTAwLCAxMDAsIDEpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQzNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DcmVhdGVzIGEgJmx0O2J1dHRvbiZndDsmbHQ7L2J1dHRvbiZndDsgZWxlbWVudCBpbiB0aGUgRE9NLlxcblVzZSAuc2l6ZSgpIHRvIHNldCB0aGUgZGlzcGxheSBzaXplIG9mIHRoZSBidXR0b24uXFxuVXNlIC5tb3VzZVByZXNzZWQoKSB0byBzcGVjaWZ5IGJlaGF2aW9yIG9uIHByZXNzLlxcbkFwcGVuZHMgdG8gdGhlIGNvbnRhaW5lciBub2RlIGlmIG9uZSBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZVxcbmFwcGVuZHMgdG8gYm9keS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVCdXR0b25cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImxhYmVsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5sYWJlbCBkaXNwbGF5ZWQgb24gdGhlIGJ1dHRvbjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZhbHVlIG9mIHRoZSBidXR0b248L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb2ludGVyIHRvIHA1LkVsZW1lbnQgaG9sZGluZyBjcmVhdGVkIG5vZGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG52YXIgYnV0dG9uO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGJhY2tncm91bmQoMCk7XFxuICBidXR0b24gPSBjcmVhdGVCdXR0b24oJ2NsaWNrIG1lJyk7XFxuICBidXR0b24ucG9zaXRpb24oMTksIDE5KTtcXG4gIGJ1dHRvbi5tb3VzZVByZXNzZWQoY2hhbmdlQkcpO1xcbn1cXG5cXG5mdW5jdGlvbiBjaGFuZ2VCRygpIHtcXG4gIHZhciB2YWwgPSByYW5kb20oMjU1KTtcXG4gIGJhY2tncm91bmQodmFsKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0NzEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhIGNoZWNrYm94ICZsdDtpbnB1dCZndDsmbHQ7L2lucHV0Jmd0OyBlbGVtZW50IGluIHRoZSBET00uXFxuQ2FsbGluZyAuY2hlY2tlZCgpIG9uIGEgY2hlY2tib3ggcmV0dXJucyBpZiBpdCBpcyBjaGVja2VkIG9yIG5vdDwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNyZWF0ZUNoZWNrYm94XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJsYWJlbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bGFiZWwgZGlzcGxheWVkIGFmdGVyIGNoZWNrYm94PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52YWx1ZSBvZiB0aGUgY2hlY2tib3g7IGNoZWNrZWQgaXMgdHJ1ZSwgdW5jaGVja2VkIGlzIGZhbHNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInBvaW50ZXIgdG8gcDUuRWxlbWVudCBob2xkaW5nIGNyZWF0ZWQgbm9kZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxwNS5FbGVtZW50XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbnZhciBjaGVja2JveDtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIGNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goJ2xhYmVsJywgZmFsc2UpO1xcbiAgY2hlY2tib3guY2hhbmdlZChteUNoZWNrZWRFdmVudCk7XFxufVxcblxcbmZ1bmN0aW9uIG15Q2hlY2tlZEV2ZW50KCkge1xcbiAgaWYgKHRoaXMuY2hlY2tlZCgpKSB7XFxuICAgIGNvbnNvbGUubG9nKCdDaGVja2luZyEnKTtcXG4gIH0gZWxzZSB7XFxuICAgIGNvbnNvbGUubG9nKCdVbmNoZWNraW5nIScpO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUzOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DcmVhdGVzIGEgZHJvcGRvd24gbWVudSAmbHQ7c2VsZWN0Jmd0OyZsdDsvc2VsZWN0Jmd0OyBlbGVtZW50IGluIHRoZSBET00uXFxuSXQgYWxzbyBoZWxwcyB0byBhc3NpZ24gc2VsZWN0LWJveCBtZXRob2RzIHRvIHA1LkVsZW1lbnQgd2hlbiBzZWxlY3RpbmcgZXhpc3Rpbmcgc2VsZWN0IGJveDwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNyZWF0ZVNlbGVjdFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5FbGVtZW50XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgc2VsO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICBzZWwgPSBjcmVhdGVTZWxlY3QoKTtcXG4gIHNlbC5wb3NpdGlvbigxMCwgMTApO1xcbiAgc2VsLm9wdGlvbigncGVhcicpO1xcbiAgc2VsLm9wdGlvbigna2l3aScpO1xcbiAgc2VsLm9wdGlvbignZ3JhcGUnKTtcXG4gIHNlbC5jaGFuZ2VkKG15U2VsZWN0RXZlbnQpO1xcbn1cXG5cXG5mdW5jdGlvbiBteVNlbGVjdEV2ZW50KCkge1xcbiAgdmFyIGl0ZW0gPSBzZWwudmFsdWUoKTtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHRleHQoJ2l0IGlzIGEnICsgaXRlbSArICchJywgNTAsIDUwKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm92ZXJsb2Fkc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImxpbmVcIjogNTM5LFxuICAgICAgICAgICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibXVsdGlwbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dHJ1ZSBpZiBkcm9wZG93biBzaG91bGQgc3VwcG9ydCBtdWx0aXBsZSBzZWxlY3Rpb25zPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuRWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCI6IDU2NyxcbiAgICAgICAgICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImV4aXN0aW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRPTSBzZWxlY3QgZWxlbWVudDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5FbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2NDMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhIHJhZGlvIGJ1dHRvbiAmbHQ7aW5wdXQmZ3Q7Jmx0Oy9pbnB1dCZndDsgZWxlbWVudCBpbiB0aGUgRE9NLlxcblRoZSAub3B0aW9uKCkgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNldCBvcHRpb25zIGZvciB0aGUgcmFkaW8gYWZ0ZXIgaXQgaXNcXG5jcmVhdGVkLiBUaGUgLnZhbHVlKCkgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNyZWF0ZVJhZGlvXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkaXZJZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGhlIGlkIGFuZCBuYW1lIG9mIHRoZSBjcmVhdGVkIGRpdiBhbmQgaW5wdXQgZmllbGQgcmVzcGVjdGl2ZWx5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicG9pbnRlciB0byBwNS5FbGVtZW50IGhvbGRpbmcgY3JlYXRlZCBub2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciByYWRpbztcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHJhZGlvID0gY3JlYXRlUmFkaW8oKTtcXG4gIHJhZGlvLm9wdGlvbignYmxhY2snKTtcXG4gIHJhZGlvLm9wdGlvbignd2hpdGUnKTtcXG4gIHJhZGlvLm9wdGlvbignZ3JheScpO1xcbiAgcmFkaW8uc3R5bGUoJ3dpZHRoJywgJzYwcHgnKTtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgZmlsbCgyNTUsIDAsIDApO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgdmFyIHZhbCA9IHJhZGlvLnZhbHVlKCk7XFxuICBiYWNrZ3JvdW5kKHZhbCk7XFxuICB0ZXh0KHZhbCwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG59XFxuPC9jb2RlPjwvZGl2PlxcbjxkaXY+PGNvZGU+XFxudmFyIHJhZGlvO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgcmFkaW8gPSBjcmVhdGVSYWRpbygpO1xcbiAgcmFkaW8ub3B0aW9uKCdhcHBsZScsIDEpO1xcbiAgcmFkaW8ub3B0aW9uKCdicmVhZCcsIDIpO1xcbiAgcmFkaW8ub3B0aW9uKCdqdWljZScsIDMpO1xcbiAgcmFkaW8uc3R5bGUoJ3dpZHRoJywgJzYwcHgnKTtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdmFyIHZhbCA9IHJhZGlvLnZhbHVlKCk7XFxuICBpZiAodmFsKSB7XFxuICAgIHRleHQoJ2l0ZW0gY29zdCBpcyAkJyArIHZhbCwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG4gIH1cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3ODEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhbiAmbHQ7aW5wdXQmZ3Q7Jmx0Oy9pbnB1dCZndDsgZWxlbWVudCBpbiB0aGUgRE9NIGZvciB0ZXh0IGlucHV0LlxcblVzZSAuc2l6ZSgpIHRvIHNldCB0aGUgZGlzcGxheSBsZW5ndGggb2YgdGhlIGJveC5cXG5BcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2VcXG5hcHBlbmRzIHRvIGJvZHkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3JlYXRlSW5wdXRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5kZWZhdWx0IHZhbHVlIG9mIHRoZSBpbnB1dCBib3g8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dHlwZSBvZiB0ZXh0LCBpZSB0ZXh0LCBwYXNzd29yZCBldGMuIERlZmF1bHRzIHRvIHRleHQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb2ludGVyIHRvIHA1LkVsZW1lbnQgaG9sZGluZyBjcmVhdGVkIG5vZGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBpbnAgPSBjcmVhdGVJbnB1dCgnJyk7XFxuICBpbnAuaW5wdXQobXlJbnB1dEV2ZW50KTtcXG59XFxuXFxuZnVuY3Rpb24gbXlJbnB1dEV2ZW50KCkge1xcbiAgY29uc29sZS5sb2coJ3lvdSBhcmUgdHlwaW5nOiAnLCB0aGlzLnZhbHVlKCkpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgxMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DcmVhdGVzIGFuICZsdDtpbnB1dCZndDsmbHQ7L2lucHV0Jmd0OyBlbGVtZW50IGluIHRoZSBET00gb2YgdHlwZSAmIzM5O2ZpbGUmIzM5Oy5cXG5UaGlzIGFsbG93cyB1c2VycyB0byBzZWxlY3QgbG9jYWwgZmlsZXMgZm9yIHVzZSBpbiBhIHNrZXRjaC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVGaWxlSW5wdXRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiBhIGZpbGUgbG9hZGVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibXVsdGlwbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm9wdGlvbmFsIHRvIGFsbG93IG11bHRpcGxlIGZpbGVzIHNlbGVjdGVkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicG9pbnRlciB0byBwNS5FbGVtZW50IGhvbGRpbmcgY3JlYXRlZCBET00gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxwNS5FbGVtZW50XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxudmFyIGlucHV0O1xcbnZhciBpbWc7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBpbnB1dCA9IGNyZWF0ZUZpbGVJbnB1dChoYW5kbGVGaWxlKTtcXG4gIGlucHV0LnBvc2l0aW9uKDAsIDApO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgaWYgKGltZykge1xcbiAgICBpbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xcbiAgfVxcbn1cXG5cXG5mdW5jdGlvbiBoYW5kbGVGaWxlKGZpbGUpIHtcXG4gIHByaW50KGZpbGUpO1xcbiAgaWYgKGZpbGUudHlwZSA9PT0gJ2ltYWdlJykge1xcbiAgICBpbWcgPSBjcmVhdGVJbWcoZmlsZS5kYXRhKTtcXG4gICAgaW1nLmhpZGUoKTtcXG4gIH1cXG59XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDg5NyxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTM0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgYW4gSFRNTDUgJmx0O3ZpZGVvJmd0OyBlbGVtZW50IGluIHRoZSBET00gZm9yIHNpbXBsZSBwbGF5YmFja1xcbm9mIGF1ZGlvL3ZpZGVvLiBTaG93biBieSBkZWZhdWx0LCBjYW4gYmUgaGlkZGVuIHdpdGggLmhpZGUoKVxcbmFuZCBkcmF3biBpbnRvIGNhbnZhcyB1c2luZyB2aWRlbygpLiBBcHBlbmRzIHRvIHRoZSBjb250YWluZXJcXG5ub2RlIGlmIG9uZSBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZSBhcHBlbmRzIHRvIGJvZHkuIFRoZSBmaXJzdCBwYXJhbWV0ZXJcXG5jYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHN0cmluZyBwYXRoIHRvIGEgdmlkZW8gZmlsZSwgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nXFxucGF0aHMgdG8gZGlmZmVyZW50IGZvcm1hdHMgb2YgdGhlIHNhbWUgdmlkZW8uIFRoaXMgaXMgdXNlZnVsIGZvciBlbnN1cmluZ1xcbnRoYXQgeW91ciB2aWRlbyBjYW4gcGxheSBhY3Jvc3MgZGlmZmVyZW50IGJyb3dzZXJzLCBhcyBlYWNoIHN1cHBvcnRzXFxuZGlmZmVyZW50IGZvcm1hdHMuIFNlZSA8YSBocmVmPSdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML1N1cHBvcnRlZF9tZWRpYV9mb3JtYXRzJz50aGlzXFxucGFnZTwvYT4gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcG9ydGVkIGZvcm1hdHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3JlYXRlVmlkZW9cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNyY1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cGF0aCB0byBhIHZpZGVvIGZpbGUsIG9yIGFycmF5IG9mIHBhdGhzIGZvclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nIGRpZmZlcmVudCBicm93c2VyczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfEFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB1cG9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYjMzk7Y2FucGxheXRocm91Z2gmIzM5OyBldmVudCBmaXJlLCB0aGF0IGlzLCB3aGVuIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyIGNhbiBwbGF5IHRoZSBtZWRpYSwgYW5kIGVzdGltYXRlcyB0aGF0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVub3VnaCBkYXRhIGhhcyBiZWVuIGxvYWRlZCB0byBwbGF5IHRoZSBtZWRpYVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCB0byBpdHMgZW5kIHdpdGhvdXQgaGF2aW5nIHRvIHN0b3AgZm9yXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1cnRoZXIgYnVmZmVyaW5nIG9mIGNvbnRlbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb2ludGVyIHRvIHZpZGVvIHA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5NZWRpYUVsZW1lbnR8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHZpZDtcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZpZCA9IGNyZWF0ZVZpZGVvKFsnc21hbGwubXA0JywgJ3NtYWxsLm9ndicsICdzbWFsbC53ZWJtJ10sIHZpZExvYWQpO1xcbn1cXG5cXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB2aWRlbyBsb2Fkc1xcbmZ1bmN0aW9uIHZpZExvYWQoKSB7XFxuICB2aWQucGxheSgpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDk3MyxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTc1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgYSBoaWRkZW4gSFRNTDUgJmx0O2F1ZGlvJmd0OyBlbGVtZW50IGluIHRoZSBET00gZm9yIHNpbXBsZSBhdWRpb1xcbnBsYXliYWNrLiBBcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLFxcbm90aGVyd2lzZSBhcHBlbmRzIHRvIGJvZHkuIFRoZSBmaXJzdCBwYXJhbWV0ZXJcXG5jYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHN0cmluZyBwYXRoIHRvIGEgYXVkaW8gZmlsZSwgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nXFxucGF0aHMgdG8gZGlmZmVyZW50IGZvcm1hdHMgb2YgdGhlIHNhbWUgYXVkaW8uIFRoaXMgaXMgdXNlZnVsIGZvciBlbnN1cmluZ1xcbnRoYXQgeW91ciBhdWRpbyBjYW4gcGxheSBhY3Jvc3MgZGlmZmVyZW50IGJyb3dzZXJzLCBhcyBlYWNoIHN1cHBvcnRzXFxuZGlmZmVyZW50IGZvcm1hdHMuIFNlZSA8YSBocmVmPSdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML1N1cHBvcnRlZF9tZWRpYV9mb3JtYXRzJz50aGlzXFxucGFnZSBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwb3J0ZWQgZm9ybWF0czwvYT4uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3JlYXRlQXVkaW9cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNyY1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cGF0aCB0byBhbiBhdWRpbyBmaWxlLCBvciBhcnJheSBvZiBwYXRoc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3VwcG9ydGluZyBkaWZmZXJlbnQgYnJvd3NlcnM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xTdHJpbmdbXVwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB1cG9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYjMzk7Y2FucGxheXRocm91Z2gmIzM5OyBldmVudCBmaXJlLCB0aGF0IGlzLCB3aGVuIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyIGNhbiBwbGF5IHRoZSBtZWRpYSwgYW5kIGVzdGltYXRlcyB0aGF0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVub3VnaCBkYXRhIGhhcyBiZWVuIGxvYWRlZCB0byBwbGF5IHRoZSBtZWRpYVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCB0byBpdHMgZW5kIHdpdGhvdXQgaGF2aW5nIHRvIHN0b3AgZm9yXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1cnRoZXIgYnVmZmVyaW5nIG9mIGNvbnRlbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb2ludGVyIHRvIGF1ZGlvIHA1LkVsZW1lbnQgIC8qKlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1Lk1lZGlhRWxlbWVudHxwNS5FbGVtZW50XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgZWxlO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9iZWF0Lm1wMycpO1xcblxcbiAgLy8gaGVyZSB3ZSBzZXQgdGhlIGVsZW1lbnQgdG8gYXV0b3BsYXlcXG4gIC8vIFRoZSBlbGVtZW50IHdpbGwgcGxheSBhcyBzb29uXFxuICAvLyBhcyBpdCBpcyBhYmxlIHRvIGRvIHNvLlxcbiAgZWxlLmF1dG9wbGF5KHRydWUpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwMTMsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwNDgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3JlYXRlcyBhIG5ldyBIVE1MNSAmbHQ7dmlkZW8mZ3Q7IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgYXVkaW8vdmlkZW9cXG5mZWVkIGZyb20gYSB3ZWJjYW0uIFRoZSBlbGVtZW50IGlzIHNlcGFyYXRlIGZyb20gdGhlIGNhbnZhcyBhbmQgaXNcXG5kaXNwbGF5ZWQgYnkgZGVmYXVsdC4gVGhlIGVsZW1lbnQgY2FuIGJlIGhpZGRlbiB1c2luZyAuaGlkZSgpLiBUaGUgZmVlZFxcbmNhbiBiZSBkcmF3biBvbnRvIHRoZSBjYW52YXMgdXNpbmcgaW1hZ2UoKS48L3A+XFxuPHA+TW9yZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIG9mIHRoZSBmZWVkIGNhbiBiZSBwYXNzaW5nIGluIGEgQ29uc3RyYWludHMgb2JqZWN0LlxcblNlZSB0aGVcXG48YSBocmVmPSdodHRwOi8vdzNjLmdpdGh1Yi5pby9tZWRpYWNhcHR1cmUtbWFpbi9nZXR1c2VybWVkaWEuaHRtbCNtZWRpYS10cmFjay1jb25zdHJhaW50cyc+IFczQ1xcbnNwZWM8L2E+IGZvciBwb3NzaWJsZSBwcm9wZXJ0aWVzLiBOb3RlIHRoYXQgbm90IGFsbCBvZiB0aGVzZSBhcmUgc3VwcG9ydGVkXFxuYnkgYWxsIGJyb3dzZXJzLjwvcD5cXG48cD5TZWN1cml0eSBub3RlOiBBIG5ldyBicm93c2VyIHNlY3VyaXR5IHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdGhhdCBnZXRVc2VyTWVkaWEsXFxud2hpY2ggaXMgYmVoaW5kIGNyZWF0ZUNhcHR1cmUoKSwgb25seSB3b3JrcyB3aGVuIHlvdSYjMzk7cmUgcnVubmluZyB0aGUgY29kZSBsb2NhbGx5LFxcbm9yIG9uIEhUVFBTLiBMZWFybiBtb3JlIDxhIGhyZWY9J2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQxOTc2NTMvZ2V0dXNlcm1lZGlhLWluLWNocm9tZS00Ny13aXRob3V0LXVzaW5nLWh0dHBzJz5oZXJlPC9hPlxcbmFuZCA8YSBocmVmPSdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTWVkaWFEZXZpY2VzL2dldFVzZXJNZWRpYSc+aGVyZTwvYT4uPC9wPlwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3JlYXRlQ2FwdHVyZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dHlwZSBvZiBjYXB0dXJlLCBlaXRoZXIgVklERU8gb3JcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU8gaWYgbm9uZSBzcGVjaWZpZWQsIGRlZmF1bHQgYm90aCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBDb25zdHJhaW50cyBvYmplY3Q8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xDb25zdGFudHxPYmplY3RcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGhhcyBsb2FkZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjYXB0dXJlIHZpZGVvIHA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyIG5vdGVzdCc+PGNvZGU+XFxudmFyIGNhcHR1cmU7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoNDgwLCA0ODApO1xcbiAgY2FwdHVyZSA9IGNyZWF0ZUNhcHR1cmUoVklERU8pO1xcbiAgY2FwdHVyZS5oaWRlKCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBpbWFnZShjYXB0dXJlLCAwLCAwLCB3aWR0aCwgd2lkdGggKiBjYXB0dXJlLmhlaWdodCAvIGNhcHR1cmUud2lkdGgpO1xcbiAgZmlsdGVyKElOVkVSVCk7XFxufVxcbjwvY29kZT48L2Rpdj5cXG48ZGl2IGNsYXNzPSdub3JlbmRlciBub3Rlc3QnPjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY3JlYXRlQ2FudmFzKDQ4MCwgMTIwKTtcXG4gIHZhciBjb25zdHJhaW50cyA9IHtcXG4gICAgdmlkZW86IHtcXG4gICAgICBtYW5kYXRvcnk6IHtcXG4gICAgICAgIG1pbldpZHRoOiAxMjgwLFxcbiAgICAgICAgbWluSGVpZ2h0OiA3MjBcXG4gICAgICB9LFxcbiAgICAgIG9wdGlvbmFsOiBbeyBtYXhGcmFtZVJhdGU6IDEwIH1dXFxuICAgIH0sXFxuICAgIGF1ZGlvOiB0cnVlXFxuICB9O1xcbiAgY3JlYXRlQ2FwdHVyZShjb25zdHJhaW50cywgZnVuY3Rpb24oc3RyZWFtKSB7XFxuICAgIGNvbnNvbGUubG9nKHN0cmVhbSk7XFxuICB9KTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTY3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZXMgZWxlbWVudCB3aXRoIGdpdmVuIHRhZyBpbiB0aGUgRE9NIHdpdGggZ2l2ZW4gY29udGVudC5cXG5BcHBlbmRzIHRvIHRoZSBjb250YWluZXIgbm9kZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2VcXG5hcHBlbmRzIHRvIGJvZHkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3JlYXRlRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGFnXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50YWcgZm9yIHRoZSBuZXcgZWxlbWVudDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29udGVudFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aHRtbCBjb250ZW50IHRvIGJlIGluc2VydGVkIGludG8gdGhlIGVsZW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb2ludGVyIHRvIHA1LkVsZW1lbnQgaG9sZGluZyBjcmVhdGVkIG5vZGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG5jcmVhdGVFbGVtZW50KCdoMicsICdpbSBhbiBoMiBwNS5lbGVtZW50IScpO1xcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTE5MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BZGRzIHNwZWNpZmllZCBjbGFzcyB0byB0aGUgZWxlbWVudC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhZGRDbGFzc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2xhc3NcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm5hbWUgb2YgY2xhc3MgdG8gYWRkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxwNS5FbGVtZW50XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4gdmFyIGRpdiA9IGNyZWF0ZURpdignZGl2Jyk7XFxuIGRpdi5hZGRDbGFzcygnbXlDbGFzcycpO1xcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjIwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlbW92ZXMgc3BlY2lmaWVkIGNsYXNzIGZyb20gdGhlIGVsZW1lbnQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVtb3ZlQ2xhc3NcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNsYXNzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5uYW1lIG9mIGNsYXNzIHRvIHJlbW92ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCIqIEBleGFtcGxlXFxuIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4gLy8gSW4gdGhpcyBleGFtcGxlLCBhIGNsYXNzIGlzIHNldCB3aGVuIHRoZSBkaXYgaXMgY3JlYXRlZFxcbiAvLyBhbmQgcmVtb3ZlZCB3aGVuIG1vdXNlIGlzIHByZXNzZWQuIFRoaXMgY291bGQgbGluayB1cFxcbiAvLyB3aXRoIGEgQ1NTIHN0eWxlIHJ1bGUgdG8gdG9nZ2xlIHN0eWxlIHByb3BlcnRpZXMuXFxudmFyIGRpdjtcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gICBkaXYgPSBjcmVhdGVEaXYoJ2RpdicpO1xcbiAgIGRpdi5hZGRDbGFzcygnbXlDbGFzcycpO1xcbiB9XFxuZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xcbiAgIGRpdi5yZW1vdmVDbGFzcygnbXlDbGFzcycpO1xcbiB9XFxuIDwvY29kZT48L2Rpdj5cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTI1MSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BdHRhY2hlcyB0aGUgZWxlbWVudCAgYXMgYSBjaGlsZCB0byB0aGUgcGFyZW50IHNwZWNpZmllZC5cXG4gQWNjZXB0cyBlaXRoZXIgYSBzdHJpbmcgSUQsIERPTSBub2RlLCBvciBwNS5FbGVtZW50LlxcbiBJZiBubyBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIGFuIGFycmF5IG9mIGNoaWxkcmVuIERPTSBub2RlcyBpcyByZXR1cm5lZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjaGlsZFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2hpbGRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBJRCwgRE9NIG5vZGUsIG9yIHA1LkVsZW1lbnRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWRkIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xPYmplY3R8cDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5FbGVtZW50XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4gdmFyIGRpdjAgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIHBhcmVudCcpO1xcbiB2YXIgZGl2MSA9IGNyZWF0ZURpdigndGhpcyBpcyB0aGUgY2hpbGQnKTtcXG4gZGl2MC5jaGlsZChkaXYxKTsgLy8gdXNlIHA1LkVsZW1lbnRcXG4gPC9jb2RlPjwvZGl2PlxcbiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuIHZhciBkaXYwID0gY3JlYXRlRGl2KCd0aGlzIGlzIHRoZSBwYXJlbnQnKTtcXG4gdmFyIGRpdjEgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIGNoaWxkJyk7XFxuIGRpdjEuaWQoJ2FwcGxlcycpO1xcbiBkaXYwLmNoaWxkKCdhcHBsZXMnKTsgLy8gdXNlIGlkXFxuIDwvY29kZT48L2Rpdj5cXG4gPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz48Y29kZT5cXG4gdmFyIGRpdjAgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIHBhcmVudCcpO1xcbiB2YXIgZWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215Q2hpbGREaXYnKTtcXG4gZGl2MC5jaGlsZChlbHQpOyAvLyB1c2UgZWxlbWVudCBmcm9tIHBhZ2VcXG4gPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTI5NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DZW50ZXJzIGEgcDUgRWxlbWVudCBlaXRoZXIgdmVydGljYWxseSwgaG9yaXpvbnRhbGx5LFxcbm9yIGJvdGgsIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgb3IgYWNjb3JkaW5nIHRvXFxudGhlIGJvZHkgaWYgdGhlIEVsZW1lbnQgaGFzIG5vIHBhcmVudC4gSWYgbm8gYXJndW1lbnQgaXMgcGFzc2VkXFxudGhlIEVsZW1lbnQgaXMgYWxpZ25lZCBib3RoIHZlcnRpY2FsbHkgYW5kIGhvcml6b250YWxseS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFsaWduXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wYXNzaW5nICYjMzk7dmVydGljYWwmIzM5OywgJiMzOTtob3Jpem9udGFsJiMzOTsgYWxpZ25zIGVsZW1lbnQgYWNjb3JkaW5nbHk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb2ludGVyIHRvIHA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgZGl2ID0gY3JlYXRlRGl2KCcnKS5zaXplKDEwLCAxMCk7XFxuICBkaXYuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCAnb3JhbmdlJyk7XFxuICBkaXYuY2VudGVyKCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEzNDgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SWYgYW4gYXJndW1lbnQgaXMgZ2l2ZW4sIHNldHMgdGhlIGlubmVyIEhUTUwgb2YgdGhlIGVsZW1lbnQsXFxuIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgaHRtbC4gSWYgdHJ1ZSBpcyBpbmNsdWRlZCBhcyBhIHNlY29uZFxcbiBhcmd1bWVudCwgaHRtbCBpcyBhcHBlbmRlZCBpbnN0ZWFkIG9mIHJlcGxhY2luZyBleGlzdGluZyBodG1sLlxcbiBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCByZXR1cm5zXFxuIHRoZSBpbm5lciBIVE1MIG9mIHRoZSBlbGVtZW50LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImh0bWxcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImh0bWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRoZSBIVE1MIHRvIGJlIHBsYWNlZCBpbnNpZGUgdGhlIGVsZW1lbnQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXBwZW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD53aGV0aGVyIHRvIGFwcGVuZCBIVE1MIHRvIGV4aXN0aW5nPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxwNS5FbGVtZW50fFN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuIHZhciBkaXYgPSBjcmVhdGVEaXYoJycpLnNpemUoMTAwLCAxMDApO1xcbiBkaXYuaHRtbCgnaGknKTtcXG4gPC9jb2RlPjwvZGl2PlxcbiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuIHZhciBkaXYgPSBjcmVhdGVEaXYoJ0hlbGxvICcpLnNpemUoMTAwLCAxMDApO1xcbiBkaXYuaHRtbCgnV29ybGQnLCB0cnVlKTtcXG4gPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTM4MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCByZWxhdGl2ZSB0byAoMCwgMCkgb2YgdGhlXFxuIHdpbmRvdy4gRXNzZW50aWFsbHksIHNldHMgcG9zaXRpb246YWJzb2x1dGUgYW5kIGxlZnQgYW5kIHRvcFxcbiBwcm9wZXJ0aWVzIG9mIHN0eWxlLiBJZiBubyBhcmd1bWVudHMgZ2l2ZW4gcmV0dXJucyB0aGUgeCBhbmQgeSBwb3NpdGlvblxcbiBvZiB0aGUgZWxlbWVudCBpbiBhbiBvYmplY3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicG9zaXRpb25cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPngtcG9zaXRpb24gcmVsYXRpdmUgdG8gdXBwZXIgbGVmdCBvZiB3aW5kb3c8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+eS1wb3NpdGlvbiByZWxhdGl2ZSB0byB1cHBlciBsZWZ0IG9mIHdpbmRvdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxwNS5FbGVtZW50XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXY+PGNvZGUgY2xhc3M9J25vcmVuZGVyJz5cXG4gZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAgdmFyIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICAgLy8gcG9zaXRpb25zIGNhbnZhcyA1MHB4IHRvIHRoZSByaWdodCBhbmQgMTAwcHhcXG4gICAvLyBiZWxvdyB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93XFxuICAgY252LnBvc2l0aW9uKDUwLCAxMDApO1xcbiB9XFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE0NzMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0cyB0aGUgZ2l2ZW4gc3R5bGUgKGNzcykgcHJvcGVydHkgKDFzdCBhcmcpIG9mIHRoZSBlbGVtZW50IHdpdGggdGhlXFxuZ2l2ZW4gdmFsdWUgKDJuZCBhcmcpLiBJZiBhIHNpbmdsZSBhcmd1bWVudCBpcyBnaXZlbiwgLnN0eWxlKClcXG5yZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHk7IGhvd2V2ZXIsIGlmIHRoZSBzaW5nbGUgYXJndW1lbnRcXG5pcyBnaXZlbiBpbiBjc3Mgc3ludGF4ICgmIzM5O3RleHQtYWxpZ246Y2VudGVyJiMzOTspLCAuc3R5bGUoKSBzZXRzIHRoZSBjc3NcXG5hcHByb3ByaWF0bHkuIC5zdHlsZSgpIGFsc28gaGFuZGxlcyAyZCBhbmQgM2QgY3NzIHRyYW5zZm9ybXMuIElmXFxudGhlIDFzdCBhcmcgaXMgJiMzOTtyb3RhdGUmIzM5OywgJiMzOTt0cmFuc2xhdGUmIzM5Oywgb3IgJiMzOTtwb3NpdGlvbiYjMzk7LCB0aGUgZm9sbG93aW5nIGFyZ3VtZW50c1xcbmFjY2VwdCBOdW1iZXJzIGFzIHZhbHVlcy4gKCYjMzk7dHJhbnNsYXRlJiMzOTssIDEwLCAxMDAsIDUwKTs8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnByb3BlcnR5IHRvIGJlIHNldDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZhbHVlIHRvIGFzc2lnbiB0byBwcm9wZXJ0eSAob25seSBTdHJpbmd8TnVtYmVyIGZvciByb3RhdGUvdHJhbnNsYXRlKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfE51bWJlcnxwNS5Db2xvclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWUyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wb3NpdGlvbiBjYW4gdGFrZSBhIDJuZCB2YWx1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfE51bWJlcnxwNS5Db2xvclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWUzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50cmFuc2xhdGUgY2FuIHRha2UgYSAybmQgJmFtcDsgM3JkIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8TnVtYmVyfHA1LkNvbG9yXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInZhbHVlIG9mIHByb3BlcnR5LCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWRcXG5vciBwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfE9iamVjdHxwNS5FbGVtZW50XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZSBjbGFzcz0nbm9yZW5kZXInPlxcbnZhciBteURpdiA9IGNyZWF0ZURpdignSSBsaWtlIHBhbmRhcy4nKTtcXG5teURpdi5zdHlsZSgnZm9udC1zaXplJywgJzE4cHgnKTtcXG5teURpdi5zdHlsZSgnY29sb3InLCAnI2ZmMDAwMCcpO1xcbjwvY29kZT48L2Rpdj5cXG48ZGl2Pjxjb2RlIGNsYXNzPSdub3JlbmRlcic+XFxudmFyIGNvbCA9IGNvbG9yKDI1LCAyMywgMjAwLCA1MCk7XFxudmFyIGJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbignYnV0dG9uJyk7XFxuYnV0dG9uLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgY29sKTtcXG5idXR0b24ucG9zaXRpb24oMTAsIDEwKTtcXG48L2NvZGU+PC9kaXY+XFxuPGRpdj48Y29kZSBjbGFzcz0nbm9yZW5kZXInPlxcbnZhciBteURpdiA9IGNyZWF0ZURpdignSSBsaWtlIGxpemFyZHMuJyk7XFxubXlEaXYuc3R5bGUoJ3Bvc2l0aW9uJywgMjAsIDIwKTtcXG5teURpdi5zdHlsZSgncm90YXRlJywgNDUpO1xcbjwvY29kZT48L2Rpdj5cXG48ZGl2Pjxjb2RlIGNsYXNzPSdub3JlbmRlcic+XFxudmFyIG15RGl2O1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgbXlEaXYgPSBjcmVhdGVEaXYoJ0kgbGlrZSBncmF5LicpO1xcbiAgbXlEaXYucG9zaXRpb24oMjAsIDIwKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIG15RGl2LnN0eWxlKCdmb250LXNpemUnLCBtb3VzZVggKyAncHgnKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTU3MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BZGRzIGEgbmV3IGF0dHJpYnV0ZSBvciBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiBhbiBleGlzdGluZyBhdHRyaWJ1dGVcXG4gb24gdGhlIHNwZWNpZmllZCBlbGVtZW50LiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybnMgdGhlXFxuIHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUsIG9yIG51bGwgaWYgYXR0cmlidXRlIGlzIG5vdCBzZXQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhdHRyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hdHRyaWJ1dGUgdG8gc2V0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmFsdWUgdG8gYXNzaWduIHRvIGF0dHJpYnV0ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInZhbHVlIG9mIGF0dHJpYnV0ZSwgaWYgbm8gdmFsdWUgaXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBvciBwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nfE9iamVjdHxwNS5FbGVtZW50XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG4gdmFyIG15RGl2ID0gY3JlYXRlRGl2KCdJIGxpa2UgcGFuZGFzLicpO1xcbiBteURpdi5hdHRyaWJ1dGUoJ2FsaWduJywgJ2NlbnRlcicpO1xcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNjEwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlbW92ZXMgYW4gYXR0cmlidXRlIG9uIHRoZSBzcGVjaWZpZWQgZWxlbWVudC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyZW1vdmVBdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImF0dHJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmF0dHJpYnV0ZSB0byByZW1vdmU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdj48Y29kZT5cXG4gdmFyIGJ1dHRvbjtcXG4gdmFyIGNoZWNrYm94O1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgIGNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goJ2VuYWJsZScsIHRydWUpO1xcbiAgIGNoZWNrYm94LmNoYW5nZWQoZW5hYmxlQnV0dG9uKTtcXG4gICBidXR0b24gPSBjcmVhdGVCdXR0b24oJ2J1dHRvbicpO1xcbiAgIGJ1dHRvbi5wb3NpdGlvbigxMCwgMTApO1xcbiB9XFxuZnVuY3Rpb24gZW5hYmxlQnV0dG9uKCkge1xcbiAgIGlmICh0aGlzLmNoZWNrZWQoKSkge1xcbiAgICAgLy8gUmUtZW5hYmxlIHRoZSBidXR0b25cXG4gICAgIGJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XFxuICAgfSBlbHNlIHtcXG4gICAgIC8vIERpc2FibGUgdGhlIGJ1dHRvblxcbiAgICAgYnV0dG9uLmF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJyk7XFxuICAgfVxcbiB9XFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2NTUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RWl0aGVyIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGlmIG5vIGFyZ3VtZW50c1xcbmdpdmVuLCBvciBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8TnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInZhbHVlIG9mIGVsZW1lbnQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkIG9yIHA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8T2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuLy8gZ2V0cyB0aGUgdmFsdWVcXG52YXIgaW5wO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgaW5wID0gY3JlYXRlSW5wdXQoJycpO1xcbn1cXG5cXG5mdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XFxuICBwcmludChpbnAudmFsdWUoKSk7XFxufVxcbjwvY29kZT48L2Rpdj5cXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxuLy8gc2V0cyB0aGUgdmFsdWVcXG52YXIgaW5wO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgaW5wID0gY3JlYXRlSW5wdXQoJ215VmFsdWUnKTtcXG59XFxuXFxuZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xcbiAgaW5wLnZhbHVlKCdteVZhbHVlJyk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2OTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2hvd3MgdGhlIGN1cnJlbnQgZWxlbWVudC4gRXNzZW50aWFsbHksIHNldHRpbmcgZGlzcGxheTpibG9jayBmb3IgdGhlIHN0eWxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNob3dcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbiB2YXIgZGl2ID0gY3JlYXRlRGl2KCdkaXYnKTtcXG4gZGl2LnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcXG4gZGl2LnNob3coKTsgLy8gdHVybnMgZGlzcGxheSB0byBibG9ja1xcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNzE1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkhpZGVzIHRoZSBjdXJyZW50IGVsZW1lbnQuIEVzc2VudGlhbGx5LCBzZXR0aW5nIGRpc3BsYXk6bm9uZSBmb3IgdGhlIHN0eWxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImhpZGVcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XFxudmFyIGRpdiA9IGNyZWF0ZURpdigndGhpcyBpcyBhIGRpdicpO1xcbmRpdi5oaWRlKCk7XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTczMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXRzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBlbGVtZW50LiBBVVRPIGNhbiBiZSB1c2VkIHRvXFxuIG9ubHkgYWRqdXN0IG9uZSBkaW1lbnNpb24uIElmIG5vIGFyZ3VtZW50cyBnaXZlbiByZXR1cm5zIHRoZSB3aWR0aCBhbmQgaGVpZ2h0XFxuIG9mIHRoZSBlbGVtZW50IGluIGFuIG9iamVjdC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzaXplXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ3XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD53aWR0aCBvZiB0aGUgZWxlbWVudCwgZWl0aGVyIEFVVE8sIG9yIGEgbnVtYmVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8Q29uc3RhbnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmhlaWdodCBvZiB0aGUgZWxlbWVudCwgZWl0aGVyIEFVVE8sIG9yIGEgbnVtYmVyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8Q29uc3RhbnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG4gPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxcbiB2YXIgZGl2ID0gY3JlYXRlRGl2KCd0aGlzIGlzIGEgZGl2Jyk7XFxuIGRpdi5zaXplKDEwMCwgMTAwKTtcXG4gPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTgwNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZW1vdmVzIHRoZSBlbGVtZW50IGFuZCBkZXJlZ2lzdGVycyBhbGwgbGlzdGVuZXJzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cXG52YXIgbXlEaXYgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgc29tZSB0ZXh0Jyk7XFxubXlEaXYucmVtb3ZlKCk7XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTg1MSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5QYXRoIHRvIHRoZSBtZWRpYSBlbGVtZW50IHNvdXJjZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNyY1wiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzcmNcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBlbGU7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKDI1MCk7XFxuXFxuICAvL3A1Lk1lZGlhRWxlbWVudCBvYmplY3RzIGFyZSB1c3VhbGx5IGNyZWF0ZWRcXG4gIC8vYnkgY2FsbGluZyB0aGUgY3JlYXRlQXVkaW8oKSwgY3JlYXRlVmlkZW8oKSxcXG4gIC8vYW5kIGNyZWF0ZUNhcHR1cmUoKSBmdW5jdGlvbnMuXFxuXFxuICAvL0luIHRoaXMgZXhhbXBsZSB3ZSBjcmVhdGVcXG4gIC8vYSBuZXcgcDUuTWVkaWFFbGVtZW50IHZpYSBjcmVhdGVBdWRpbygpLlxcbiAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9iZWF0Lm1wMycpO1xcblxcbiAgLy9XZSdsbCBzZXQgdXAgb3VyIGV4YW1wbGUgc28gdGhhdFxcbiAgLy93aGVuIHlvdSBjbGljayBvbiB0aGUgdGV4dCxcXG4gIC8vYW4gYWxlcnQgYm94IGRpc3BsYXlzIHRoZSBNZWRpYUVsZW1lbnQnc1xcbiAgLy9zcmMgZmllbGQuXFxuICB0ZXh0QWxpZ24oQ0VOVEVSKTtcXG4gIHRleHQoJ0NsaWNrIE1lIScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxufVxcblxcbmZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcXG4gIC8vaGVyZSB3ZSB0ZXN0IGlmIHRoZSBtb3VzZSBpcyBvdmVyIHRoZVxcbiAgLy9jYW52YXMgZWxlbWVudCB3aGVuIGl0J3MgY2xpY2tlZFxcbiAgaWYgKG1vdXNlWCA+PSAwICYmIG1vdXNlWCA8PSB3aWR0aCAmJiBtb3VzZVkgPj0gMCAmJiBtb3VzZVkgPD0gaGVpZ2h0KSB7XFxuICAgIC8vU2hvdyBvdXIgcDUuTWVkaWFFbGVtZW50J3Mgc3JjIGZpZWxkXFxuICAgIGFsZXJ0KGVsZS5zcmMpO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTWVkaWFFbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE5MTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UGxheSBhbiBIVE1MNSBtZWRpYSBlbGVtZW50LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBsYXlcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBlbGU7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAvL3A1Lk1lZGlhRWxlbWVudCBvYmplY3RzIGFyZSB1c3VhbGx5IGNyZWF0ZWRcXG4gIC8vYnkgY2FsbGluZyB0aGUgY3JlYXRlQXVkaW8oKSwgY3JlYXRlVmlkZW8oKSxcXG4gIC8vYW5kIGNyZWF0ZUNhcHR1cmUoKSBmdW5jdGlvbnMuXFxuXFxuICAvL0luIHRoaXMgZXhhbXBsZSB3ZSBjcmVhdGVcXG4gIC8vYSBuZXcgcDUuTWVkaWFFbGVtZW50IHZpYSBjcmVhdGVBdWRpbygpLlxcbiAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9iZWF0Lm1wMycpO1xcblxcbiAgYmFja2dyb3VuZCgyNTApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KCdDbGljayB0byBQbGF5IScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxufVxcblxcbmZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcXG4gIC8vaGVyZSB3ZSB0ZXN0IGlmIHRoZSBtb3VzZSBpcyBvdmVyIHRoZVxcbiAgLy9jYW52YXMgZWxlbWVudCB3aGVuIGl0J3MgY2xpY2tlZFxcbiAgaWYgKG1vdXNlWCA+PSAwICYmIG1vdXNlWCA8PSB3aWR0aCAmJiBtb3VzZVkgPj0gMCAmJiBtb3VzZVkgPD0gaGVpZ2h0KSB7XFxuICAgIC8vSGVyZSB3ZSBjYWxsIHRoZSBwbGF5KCkgZnVuY3Rpb24gb25cXG4gICAgLy90aGUgcDUuTWVkaWFFbGVtZW50IHdlIGNyZWF0ZWQgYWJvdmUuXFxuICAgIC8vVGhpcyB3aWxsIHN0YXJ0IHRoZSBhdWRpbyBzYW1wbGUuXFxuICAgIGVsZS5wbGF5KCk7XFxuXFxuICAgIGJhY2tncm91bmQoMjAwKTtcXG4gICAgdGV4dCgnWW91IGNsaWNrZWQgUGxheSEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTWVkaWFFbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE5NzAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3RvcHMgYW4gSFRNTDUgbWVkaWEgZWxlbWVudCAoc2V0cyBjdXJyZW50IHRpbWUgdG8gemVybykuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RvcFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuLy9UaGlzIGV4YW1wbGUgYm90aCBzdGFydHNcXG4vL2FuZCBzdG9wcyBhIHNvdW5kIHNhbXBsZVxcbi8vd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNhbnZhc1xcblxcbi8vV2Ugd2lsbCBzdG9yZSB0aGUgcDUuTWVkaWFFbGVtZW50XFxuLy9vYmplY3QgaW4gaGVyZVxcbnZhciBlbGU7XFxuXFxuLy93aGlsZSBvdXIgYXVkaW8gaXMgcGxheWluZyxcXG4vL3RoaXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZVxcbnZhciBzYW1wbGVJc1BsYXlpbmcgPSBmYWxzZTtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIC8vSGVyZSB3ZSBjcmVhdGUgYSBwNS5NZWRpYUVsZW1lbnQgb2JqZWN0XFxuICAvL3VzaW5nIHRoZSBjcmVhdGVBdWRpbygpIGZ1bmN0aW9uLlxcbiAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9iZWF0Lm1wMycpO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KCdDbGljayB0byBwbGF5IScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxufVxcblxcbmZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcXG4gIC8vaGVyZSB3ZSB0ZXN0IGlmIHRoZSBtb3VzZSBpcyBvdmVyIHRoZVxcbiAgLy9jYW52YXMgZWxlbWVudCB3aGVuIGl0J3MgY2xpY2tlZFxcbiAgaWYgKG1vdXNlWCA+PSAwICYmIG1vdXNlWCA8PSB3aWR0aCAmJiBtb3VzZVkgPj0gMCAmJiBtb3VzZVkgPD0gaGVpZ2h0KSB7XFxuICAgIGJhY2tncm91bmQoMjAwKTtcXG5cXG4gICAgaWYgKHNhbXBsZUlzUGxheWluZykge1xcbiAgICAgIC8vaWYgdGhlIHNhbXBsZSBpcyBjdXJyZW50bHkgcGxheWluZ1xcbiAgICAgIC8vY2FsbGluZyB0aGUgc3RvcCgpIGZ1bmN0aW9uIG9uXFxuICAgICAgLy9vdXIgcDUuTWVkaWFFbGVtZW50IHdpbGwgc3RvcFxcbiAgICAgIC8vaXQgYW5kIHJlc2V0IGl0cyBjdXJyZW50XFxuICAgICAgLy90aW1lIHRvIDAgKGkuZS4gaXQgd2lsbCBzdGFydFxcbiAgICAgIC8vYXQgdGhlIGJlZ2lubmluZyB0aGUgbmV4dCB0aW1lXFxuICAgICAgLy95b3UgcGxheSBpdClcXG4gICAgICBlbGUuc3RvcCgpO1xcblxcbiAgICAgIHNhbXBsZUlzUGxheWluZyA9IGZhbHNlO1xcbiAgICAgIHRleHQoJ0NsaWNrIHRvIHBsYXkhJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAvL2xvb3Agb3VyIHNvdW5kIGVsZW1lbnQgdW50aWwgd2VcXG4gICAgICAvL2NhbGwgZWxlLnN0b3AoKSBvbiBpdC5cXG4gICAgICBlbGUubG9vcCgpO1xcblxcbiAgICAgIHNhbXBsZUlzUGxheWluZyA9IHRydWU7XFxuICAgICAgdGV4dCgnQ2xpY2sgdG8gc3RvcCEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbiAgICB9XFxuICB9XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5NZWRpYUVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjAzNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5QYXVzZXMgYW4gSFRNTDUgbWVkaWEgZWxlbWVudC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXVzZVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuLy9UaGlzIGV4YW1wbGUgYm90aCBzdGFydHNcXG4vL2FuZCBwYXVzZXMgYSBzb3VuZCBzYW1wbGVcXG4vL3doZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBjYW52YXNcXG5cXG4vL1dlIHdpbGwgc3RvcmUgdGhlIHA1Lk1lZGlhRWxlbWVudFxcbi8vb2JqZWN0IGluIGhlcmVcXG52YXIgZWxlO1xcblxcbi8vd2hpbGUgb3VyIGF1ZGlvIGlzIHBsYXlpbmcsXFxuLy90aGlzIHdpbGwgYmUgc2V0IHRvIHRydWVcXG52YXIgc2FtcGxlSXNQbGF5aW5nID0gZmFsc2U7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAvL0hlcmUgd2UgY3JlYXRlIGEgcDUuTWVkaWFFbGVtZW50IG9iamVjdFxcbiAgLy91c2luZyB0aGUgY3JlYXRlQXVkaW8oKSBmdW5jdGlvbi5cXG4gIGVsZSA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvbHVja3lfZHJhZ29ucy5tcDMnKTtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgdGV4dCgnQ2xpY2sgdG8gcGxheSEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbn1cXG5cXG5mdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XFxuICAvL2hlcmUgd2UgdGVzdCBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGVcXG4gIC8vY2FudmFzIGVsZW1lbnQgd2hlbiBpdCdzIGNsaWNrZWRcXG4gIGlmIChtb3VzZVggPj0gMCAmJiBtb3VzZVggPD0gd2lkdGggJiYgbW91c2VZID49IDAgJiYgbW91c2VZIDw9IGhlaWdodCkge1xcbiAgICBiYWNrZ3JvdW5kKDIwMCk7XFxuXFxuICAgIGlmIChzYW1wbGVJc1BsYXlpbmcpIHtcXG4gICAgICAvL0NhbGxpbmcgcGF1c2UoKSBvbiBvdXJcXG4gICAgICAvL3A1Lk1lZGlhRWxlbWVudCB3aWxsIHN0b3AgaXRcXG4gICAgICAvL3BsYXlpbmcsIGJ1dCB3aGVuIHdlIGNhbGwgdGhlXFxuICAgICAgLy9sb29wKCkgb3IgcGxheSgpIGZ1bmN0aW9uc1xcbiAgICAgIC8vdGhlIHNhbXBsZSB3aWxsIHN0YXJ0IGZyb21cXG4gICAgICAvL3doZXJlIHdlIHBhdXNlZCBpdC5cXG4gICAgICBlbGUucGF1c2UoKTtcXG5cXG4gICAgICBzYW1wbGVJc1BsYXlpbmcgPSBmYWxzZTtcXG4gICAgICB0ZXh0KCdDbGljayB0byByZXN1bWUhJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAvL2xvb3Agb3VyIHNvdW5kIGVsZW1lbnQgdW50aWwgd2VcXG4gICAgICAvL2NhbGwgZWxlLnBhdXNlKCkgb24gaXQuXFxuICAgICAgZWxlLmxvb3AoKTtcXG5cXG4gICAgICBzYW1wbGVJc1BsYXlpbmcgPSB0cnVlO1xcbiAgICAgIHRleHQoJ0NsaWNrIHRvIHBhdXNlIScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxuICAgIH1cXG4gIH1cXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1lZGlhRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMDk2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCAmIzM5O2xvb3AmIzM5OyB0byB0cnVlIGZvciBhbiBIVE1MNSBtZWRpYSBlbGVtZW50LCBhbmQgc3RhcnRzIHBsYXlpbmcuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibG9vcFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuLy9DbGlja2luZyB0aGUgY2FudmFzIHdpbGwgbG9vcFxcbi8vdGhlIGF1ZGlvIHNhbXBsZSB1bnRpbCB0aGUgdXNlclxcbi8vY2xpY2tzIGFnYWluIHRvIHN0b3AgaXRcXG5cXG4vL1dlIHdpbGwgc3RvcmUgdGhlIHA1Lk1lZGlhRWxlbWVudFxcbi8vb2JqZWN0IGluIGhlcmVcXG52YXIgZWxlO1xcblxcbi8vd2hpbGUgb3VyIGF1ZGlvIGlzIHBsYXlpbmcsXFxuLy90aGlzIHdpbGwgYmUgc2V0IHRvIHRydWVcXG52YXIgc2FtcGxlSXNMb29waW5nID0gZmFsc2U7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAvL0hlcmUgd2UgY3JlYXRlIGEgcDUuTWVkaWFFbGVtZW50IG9iamVjdFxcbiAgLy91c2luZyB0aGUgY3JlYXRlQXVkaW8oKSBmdW5jdGlvbi5cXG4gIGVsZSA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvbHVja3lfZHJhZ29ucy5tcDMnKTtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgdGV4dCgnQ2xpY2sgdG8gbG9vcCEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbn1cXG5cXG5mdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XFxuICAvL2hlcmUgd2UgdGVzdCBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGVcXG4gIC8vY2FudmFzIGVsZW1lbnQgd2hlbiBpdCdzIGNsaWNrZWRcXG4gIGlmIChtb3VzZVggPj0gMCAmJiBtb3VzZVggPD0gd2lkdGggJiYgbW91c2VZID49IDAgJiYgbW91c2VZIDw9IGhlaWdodCkge1xcbiAgICBiYWNrZ3JvdW5kKDIwMCk7XFxuXFxuICAgIGlmICghc2FtcGxlSXNMb29waW5nKSB7XFxuICAgICAgLy9sb29wIG91ciBzb3VuZCBlbGVtZW50IHVudGlsIHdlXFxuICAgICAgLy9jYWxsIGVsZS5zdG9wKCkgb24gaXQuXFxuICAgICAgZWxlLmxvb3AoKTtcXG5cXG4gICAgICBzYW1wbGVJc0xvb3BpbmcgPSB0cnVlO1xcbiAgICAgIHRleHQoJ0NsaWNrIHRvIHN0b3AhJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICBlbGUuc3RvcCgpO1xcblxcbiAgICAgIHNhbXBsZUlzTG9vcGluZyA9IGZhbHNlO1xcbiAgICAgIHRleHQoJ0NsaWNrIHRvIGxvb3AhJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG4gICAgfVxcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTWVkaWFFbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIxNTIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0ICYjMzk7bG9vcCYjMzk7IHRvIGZhbHNlIGZvciBhbiBIVE1MNSBtZWRpYSBlbGVtZW50LiBFbGVtZW50IHdpbGwgc3RvcFxcbndoZW4gaXQgcmVhY2hlcyB0aGUgZW5kLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vTG9vcFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3R8cDUuRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuLy9UaGlzIGV4YW1wbGUgYm90aCBzdGFydHNcXG4vL2FuZCBzdG9wcyBsb29wIG9mIHNvdW5kIHNhbXBsZVxcbi8vd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNhbnZhc1xcblxcbi8vV2Ugd2lsbCBzdG9yZSB0aGUgcDUuTWVkaWFFbGVtZW50XFxuLy9vYmplY3QgaW4gaGVyZVxcbnZhciBlbGU7XFxuLy93aGlsZSBvdXIgYXVkaW8gaXMgcGxheWluZyxcXG4vL3RoaXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZVxcbnZhciBzYW1wbGVJc1BsYXlpbmcgPSBmYWxzZTtcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIC8vSGVyZSB3ZSBjcmVhdGUgYSBwNS5NZWRpYUVsZW1lbnQgb2JqZWN0XFxuICAvL3VzaW5nIHRoZSBjcmVhdGVBdWRpbygpIGZ1bmN0aW9uLlxcbiAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9iZWF0Lm1wMycpO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KCdDbGljayB0byBwbGF5IScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxufVxcblxcbmZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcXG4gIC8vaGVyZSB3ZSB0ZXN0IGlmIHRoZSBtb3VzZSBpcyBvdmVyIHRoZVxcbiAgLy9jYW52YXMgZWxlbWVudCB3aGVuIGl0J3MgY2xpY2tlZFxcbiAgaWYgKG1vdXNlWCA+PSAwICYmIG1vdXNlWCA8PSB3aWR0aCAmJiBtb3VzZVkgPj0gMCAmJiBtb3VzZVkgPD0gaGVpZ2h0KSB7XFxuICAgIGJhY2tncm91bmQoMjAwKTtcXG5cXG4gICAgaWYgKHNhbXBsZUlzUGxheWluZykge1xcbiAgICAgIGVsZS5ub0xvb3AoKTtcXG4gICAgICB0ZXh0KCdObyBtb3JlIExvb3BzIScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgZWxlLmxvb3AoKTtcXG4gICAgICBzYW1wbGVJc1BsYXlpbmcgPSB0cnVlO1xcbiAgICAgIHRleHQoJ0NsaWNrIHRvIHN0b3AgbG9vcGluZyEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbiAgICB9XFxuICB9XFxufVxcbjwvY29kZT48L2Rpdj5cXG5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5NZWRpYUVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjIwNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgSFRNTDUgbWVkaWEgZWxlbWVudCB0byBhdXRvcGxheSBvciBub3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXV0b3BsYXlcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImF1dG9wbGF5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD53aGV0aGVyIHRoZSBlbGVtZW50IHNob3VsZCBhdXRvcGxheTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0fHA1LkVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5NZWRpYUVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjIxNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXRzIHZvbHVtZSBmb3IgdGhpcyBIVE1MNSBtZWRpYSBlbGVtZW50LiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbixcXG5yZXR1cm5zIHRoZSBjdXJyZW50IHZvbHVtZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZvbHVtZSBiZXR3ZWVuIDAuMCBhbmQgMS4wPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiY3VycmVudCB2b2x1bWUgb3IgcDUuTWVkaWFFbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyfHA1Lk1lZGlhRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidm9sdW1lXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgZWxlO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy8gcDUuTWVkaWFFbGVtZW50IG9iamVjdHMgYXJlIHVzdWFsbHkgY3JlYXRlZFxcbiAgLy8gYnkgY2FsbGluZyB0aGUgY3JlYXRlQXVkaW8oKSwgY3JlYXRlVmlkZW8oKSxcXG4gIC8vIGFuZCBjcmVhdGVDYXB0dXJlKCkgZnVuY3Rpb25zLlxcbiAgLy8gSW4gdGhpcyBleGFtcGxlIHdlIGNyZWF0ZVxcbiAgLy8gYSBuZXcgcDUuTWVkaWFFbGVtZW50IHZpYSBjcmVhdGVBdWRpbygpLlxcbiAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9sdWNreV9kcmFnb25zLm1wMycpO1xcbiAgYmFja2dyb3VuZCgyNTApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KCdDbGljayB0byBQbGF5IScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxufVxcbmZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcXG4gIC8vIEhlcmUgd2UgY2FsbCB0aGUgdm9sdW1lKCkgZnVuY3Rpb25cXG4gIC8vIG9uIHRoZSBzb3VuZCBlbGVtZW50IHRvIHNldCBpdHMgdm9sdW1lXFxuICAvLyBWb2x1bWUgbXVzdCBiZSBiZXR3ZWVuIDAuMCBhbmQgMS4wXFxuICBlbGUudm9sdW1lKDAuMik7XFxuICBlbGUucGxheSgpO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdGV4dCgnWW91IGNsaWNrZWQgUGxheSEnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbn1cXG48L2NvZGU+PC9kaXY+XFxuPGRpdj48Y29kZT5cXG52YXIgYXVkaW87XFxudmFyIGNvdW50ZXIgPSAwO1xcblxcbmZ1bmN0aW9uIGxvYWRlZCgpIHtcXG4gIGF1ZGlvLnBsYXkoKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBhdWRpbyA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvbHVja3lfZHJhZ29ucy5tcDMnLCBsb2FkZWQpO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBpZiAoY291bnRlciA9PT0gMCkge1xcbiAgICBiYWNrZ3JvdW5kKDAsIDI1NSwgMCk7XFxuICAgIHRleHQoJ3ZvbHVtZSgwLjkpJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG4gIH0gZWxzZSBpZiAoY291bnRlciA9PT0gMSkge1xcbiAgICBiYWNrZ3JvdW5kKDI1NSwgMjU1LCAwKTtcXG4gICAgdGV4dCgndm9sdW1lKDAuNSknLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbiAgfSBlbHNlIGlmIChjb3VudGVyID09PSAyKSB7XFxuICAgIGJhY2tncm91bmQoMjU1LCAwLCAwKTtcXG4gICAgdGV4dCgndm9sdW1lKDAuMSknLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbiAgfVxcbn1cXG5cXG5mdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XFxuICBjb3VudGVyKys7XFxuICBpZiAoY291bnRlciA9PT0gMCkge1xcbiAgICBhdWRpby52b2x1bWUoMC45KTtcXG4gIH0gZWxzZSBpZiAoY291bnRlciA9PT0gMSkge1xcbiAgICBhdWRpby52b2x1bWUoMC41KTtcXG4gIH0gZWxzZSBpZiAoY291bnRlciA9PT0gMikge1xcbiAgICBhdWRpby52b2x1bWUoMC4xKTtcXG4gIH0gZWxzZSB7XFxuICAgIGNvdW50ZXIgPSAwO1xcbiAgICBhdWRpby52b2x1bWUoMC45KTtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1lZGlhRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMjk4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPklmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHJldHVybnMgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgb2YgdGhlXFxuZWxlbWVudC4gVGhlIHNwZWVkIHBhcmFtZXRlciBzZXRzIHRoZSBzcGVlZCB3aGVyZSAyLjAgd2lsbCBwbGF5IHRoZVxcbmVsZW1lbnQgdHdpY2UgYXMgZmFzdCwgMC41IHdpbGwgcGxheSBhdCBoYWxmIHRoZSBzcGVlZCwgYW5kIC0xIHdpbGwgcGxheVxcbnRoZSBlbGVtZW50IGluIG5vcm1hbCBzcGVlZCBpbiByZXZlcnNlLihOb3RlIHRoYXQgbm90IGFsbCBicm93c2VycyBzdXBwb3J0XFxuYmFja3dhcmQgcGxheWJhY2sgYW5kIGV2ZW4gaWYgdGhleSBkbywgcGxheWJhY2sgbWlnaHQgbm90IGJlIHNtb290aC4pPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3BlZWRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNwZWVkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zcGVlZCBtdWx0aXBsaWVyIGZvciBlbGVtZW50IHBsYXliYWNrPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiY3VycmVudCBwbGF5YmFjayBzcGVlZCBvciBwNS5NZWRpYUVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8T2JqZWN0fHA1Lk1lZGlhRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXYgY2xhc3M9J25vcmVuZGVyIG5vdGVzdCc+PGNvZGU+XFxuLy9DbGlja2luZyB0aGUgY2FudmFzIHdpbGwgbG9vcFxcbi8vdGhlIGF1ZGlvIHNhbXBsZSB1bnRpbCB0aGUgdXNlclxcbi8vY2xpY2tzIGFnYWluIHRvIHN0b3AgaXRcXG5cXG4vL1dlIHdpbGwgc3RvcmUgdGhlIHA1Lk1lZGlhRWxlbWVudFxcbi8vb2JqZWN0IGluIGhlcmVcXG52YXIgZWxlO1xcbnZhciBidXR0b247XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBjcmVhdGVDYW52YXMoNzEwLCA0MDApO1xcbiAgLy9IZXJlIHdlIGNyZWF0ZSBhIHA1Lk1lZGlhRWxlbWVudCBvYmplY3RcXG4gIC8vdXNpbmcgdGhlIGNyZWF0ZUF1ZGlvKCkgZnVuY3Rpb24uXFxuICBlbGUgPSBjcmVhdGVBdWRpbygnYXNzZXRzL2JlYXQubXAzJyk7XFxuICBlbGUubG9vcCgpO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcblxcbiAgYnV0dG9uID0gY3JlYXRlQnV0dG9uKCcyeCBzcGVlZCcpO1xcbiAgYnV0dG9uLnBvc2l0aW9uKDEwMCwgNjgpO1xcbiAgYnV0dG9uLm1vdXNlUHJlc3NlZCh0d2ljZV9zcGVlZCk7XFxuXFxuICBidXR0b24gPSBjcmVhdGVCdXR0b24oJ2hhbGYgc3BlZWQnKTtcXG4gIGJ1dHRvbi5wb3NpdGlvbigyMDAsIDY4KTtcXG4gIGJ1dHRvbi5tb3VzZVByZXNzZWQoaGFsZl9zcGVlZCk7XFxuXFxuICBidXR0b24gPSBjcmVhdGVCdXR0b24oJ3JldmVyc2UgcGxheScpO1xcbiAgYnV0dG9uLnBvc2l0aW9uKDMwMCwgNjgpO1xcbiAgYnV0dG9uLm1vdXNlUHJlc3NlZChyZXZlcnNlX3NwZWVkKTtcXG5cXG4gIGJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbignU1RPUCcpO1xcbiAgYnV0dG9uLnBvc2l0aW9uKDQwMCwgNjgpO1xcbiAgYnV0dG9uLm1vdXNlUHJlc3NlZChzdG9wX3NvbmcpO1xcblxcbiAgYnV0dG9uID0gY3JlYXRlQnV0dG9uKCdQTEFZIScpO1xcbiAgYnV0dG9uLnBvc2l0aW9uKDUwMCwgNjgpO1xcbiAgYnV0dG9uLm1vdXNlUHJlc3NlZChwbGF5X3NwZWVkKTtcXG59XFxuXFxuZnVuY3Rpb24gdHdpY2Vfc3BlZWQoKSB7XFxuICBlbGUuc3BlZWQoMik7XFxufVxcblxcbmZ1bmN0aW9uIGhhbGZfc3BlZWQoKSB7XFxuICBlbGUuc3BlZWQoMC41KTtcXG59XFxuXFxuZnVuY3Rpb24gcmV2ZXJzZV9zcGVlZCgpIHtcXG4gIGVsZS5zcGVlZCgtMSk7XFxufVxcblxcbmZ1bmN0aW9uIHN0b3Bfc29uZygpIHtcXG4gIGVsZS5zdG9wKCk7XFxufVxcblxcbmZ1bmN0aW9uIHBsYXlfc3BlZWQoKSB7XFxuICBlbGUucGxheSgpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTWVkaWFFbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDIzNzcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgcmV0dXJucyB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSBlbGVtZW50LlxcbklmIGFuIGFyZ3VtZW50IGlzIGdpdmVuIHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIGVsZW1lbnQgaXMgc2V0IHRvIGl0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRpbWUgdG8ganVtcCB0byAoaW4gc2Vjb25kcyk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjdXJyZW50IHRpbWUgKGluIHNlY29uZHMpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBwNS5NZWRpYUVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8T2JqZWN0fHA1Lk1lZGlhRWxlbWVudFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIGVsZTtcXG52YXIgYmVnaW5uaW5nID0gdHJ1ZTtcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIC8vcDUuTWVkaWFFbGVtZW50IG9iamVjdHMgYXJlIHVzdWFsbHkgY3JlYXRlZFxcbiAgLy9ieSBjYWxsaW5nIHRoZSBjcmVhdGVBdWRpbygpLCBjcmVhdGVWaWRlbygpLFxcbiAgLy9hbmQgY3JlYXRlQ2FwdHVyZSgpIGZ1bmN0aW9ucy5cXG5cXG4gIC8vSW4gdGhpcyBleGFtcGxlIHdlIGNyZWF0ZVxcbiAgLy9hIG5ldyBwNS5NZWRpYUVsZW1lbnQgdmlhIGNyZWF0ZUF1ZGlvKCkuXFxuICBlbGUgPSBjcmVhdGVBdWRpbygnYXNzZXRzL2x1Y2t5X2RyYWdvbnMubXAzJyk7XFxuICBiYWNrZ3JvdW5kKDI1MCk7XFxuICB0ZXh0QWxpZ24oQ0VOVEVSKTtcXG4gIHRleHQoJ3N0YXJ0IGF0IGJlZ2lubmluZycsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxufVxcblxcbi8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgd2l0aCBjbGljayBhbnl3aGVyZVxcbmZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcXG4gIGlmIChiZWdpbm5pbmcgPT09IHRydWUpIHtcXG4gICAgLy8gaGVyZSB3ZSBzdGFydCB0aGUgc291bmQgYXQgdGhlIGJlZ2lubmluZ1xcbiAgICAvLyB0aW1lKDApIGlzIG5vdCBuZWNlc3NhcnkgaGVyZVxcbiAgICAvLyBhcyB0aGlzIHByb2R1Y2VzIHRoZSBzYW1lIHJlc3VsdCBhc1xcbiAgICAvLyBwbGF5KClcXG4gICAgZWxlLnBsYXkoKS50aW1lKDApO1xcbiAgICBiYWNrZ3JvdW5kKDIwMCk7XFxuICAgIHRleHQoJ2p1bXAgMiBzZWMgaW4nLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbiAgICBiZWdpbm5pbmcgPSBmYWxzZTtcXG4gIH0gZWxzZSB7XFxuICAgIC8vIGhlcmUgd2UganVtcCAyIHNlY29uZHMgaW50byB0aGUgc291bmRcXG4gICAgZWxlLnBsYXkoKS50aW1lKDIpO1xcbiAgICBiYWNrZ3JvdW5kKDI1MCk7XFxuICAgIHRleHQoJ3N0YXJ0IGF0IGJlZ2lubmluZycsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XFxuICAgIGJlZ2lubmluZyA9IHRydWU7XFxuICB9XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5NZWRpYUVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjQzMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIHRoZSBkdXJhdGlvbiBvZiB0aGUgSFRNTDUgbWVkaWEgZWxlbWVudC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIGVsZTtcXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIC8vcDUuTWVkaWFFbGVtZW50IG9iamVjdHMgYXJlIHVzdWFsbHkgY3JlYXRlZFxcbiAgLy9ieSBjYWxsaW5nIHRoZSBjcmVhdGVBdWRpbygpLCBjcmVhdGVWaWRlbygpLFxcbiAgLy9hbmQgY3JlYXRlQ2FwdHVyZSgpIGZ1bmN0aW9ucy5cXG4gIC8vSW4gdGhpcyBleGFtcGxlIHdlIGNyZWF0ZVxcbiAgLy9hIG5ldyBwNS5NZWRpYUVsZW1lbnQgdmlhIGNyZWF0ZUF1ZGlvKCkuXFxuICBlbGUgPSBjcmVhdGVBdWRpbygnYXNzZXRzL2Rvb3JiZWxsLm1wMycpO1xcbiAgYmFja2dyb3VuZCgyNTApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KCdDbGljayB0byBrbm93IHRoZSBkdXJhdGlvbiEnLCAxMCwgMjUsIDcwLCA4MCk7XFxufVxcbmZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcXG4gIGVsZS5wbGF5KCk7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICAvL2VsZS5kdXJhdGlvbiBkaXNscGF5cyB0aGUgZHVyYXRpb25cXG4gIHRleHQoZWxlLmR1cmF0aW9uKCkgKyAnIHNlY29uZHMnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTWVkaWFFbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI1NTAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2NoZWR1bGUgYW4gZXZlbnQgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG9yIHZpZGVvXFxuZWxlbWVudCByZWFjaGVzIHRoZSBlbmQuIElmIHRoZSBlbGVtZW50IGlzIGxvb3BpbmcsXFxudGhpcyB3aWxsIG5vdCBiZSBjYWxsZWQuIFRoZSBlbGVtZW50IGlzIHBhc3NlZCBpblxcbmFzIHRoZSBhcmd1bWVudCB0byB0aGUgb25lbmRlZCBjYWxsYmFjay48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJvbmVuZGVkXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZGZpbGUgaGFzIGVuZGVkLiBUaGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWEgZWxlbWVudCB3aWxsIGJlIHBhc3NlZFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhcyB0aGUgYXJndW1lbnQgdG8gdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdHxwNS5NZWRpYUVsZW1lbnRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGF1ZGlvRWwgPSBjcmVhdGVBdWRpbygnYXNzZXRzL2JlYXQubXAzJyk7XFxuICBhdWRpb0VsLnNob3dDb250cm9scygpO1xcbiAgYXVkaW9FbC5vbmVuZGVkKHNheURvbmUpO1xcbn1cXG5cXG5mdW5jdGlvbiBzYXlEb25lKGVsdCkge1xcbiAgYWxlcnQoJ2RvbmUgcGxheWluZyAnICsgZWx0LnNyYyk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5NZWRpYUVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjU4MSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5NZWRpYUVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjU4MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZW5kIHRoZSBhdWRpbyBvdXRwdXQgb2YgdGhpcyBlbGVtZW50IHRvIGEgc3BlY2lmaWVkIGF1ZGlvTm9kZSBvclxcbnA1LnNvdW5kIG9iamVjdC4gSWYgbm8gZWxlbWVudCBpcyBwcm92aWRlZCwgY29ubmVjdHMgdG8gcDUmIzM5O3MgbWFzdGVyXFxub3V0cHV0LiBUaGF0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgd2hlbiB0aGlzIG1ldGhvZCBpcyBmaXJzdCBjYWxsZWQuXFxuQWxsIGNvbm5lY3Rpb25zIGFyZSByZW1vdmVkIGJ5IHRoZSAuZGlzY29ubmVjdCgpIG1ldGhvZC48L3A+XFxuPHA+VGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoIHRoZSBwNS5zb3VuZC5qcyBhZGRvbiBsaWJyYXJ5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbm5lY3RcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImF1ZGlvTm9kZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXVkaW9Ob2RlIGZyb20gdGhlIFdlYiBBdWRpbyBBUEksXFxub3IgYW4gb2JqZWN0IGZyb20gdGhlIHA1LnNvdW5kIGxpYnJhcnk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkF1ZGlvTm9kZXxPYmplY3RcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTWVkaWFFbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI2MzIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RGlzY29ubmVjdCBhbGwgV2ViIEF1ZGlvIHJvdXRpbmcsIGluY2x1ZGluZyB0byBtYXN0ZXIgb3V0cHV0LlxcblRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJlLXJvdXRlIHRoZSBvdXRwdXQgdGhyb3VnaFxcbmF1ZGlvIGVmZmVjdHMsIGZvciBleGFtcGxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRpc2Nvbm5lY3RcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5NZWRpYUVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjY0NyxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5NZWRpYUVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjY0OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TaG93IHRoZSBkZWZhdWx0IE1lZGlhRWxlbWVudCBjb250cm9scywgYXMgZGV0ZXJtaW5lZCBieSB0aGUgd2ViIGJyb3dzZXIuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2hvd0NvbnRyb2xzXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgZWxlO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy9wNS5NZWRpYUVsZW1lbnQgb2JqZWN0cyBhcmUgdXN1YWxseSBjcmVhdGVkXFxuICAvL2J5IGNhbGxpbmcgdGhlIGNyZWF0ZUF1ZGlvKCksIGNyZWF0ZVZpZGVvKCksXFxuICAvL2FuZCBjcmVhdGVDYXB0dXJlKCkgZnVuY3Rpb25zLlxcbiAgLy9JbiB0aGlzIGV4YW1wbGUgd2UgY3JlYXRlXFxuICAvL2EgbmV3IHA1Lk1lZGlhRWxlbWVudCB2aWEgY3JlYXRlQXVkaW8oKVxcbiAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9sdWNreV9kcmFnb25zLm1wMycpO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KCdDbGljayB0byBTaG93IENvbnRyb2xzIScsIDEwLCAyNSwgNzAsIDgwKTtcXG59XFxuZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xcbiAgZWxlLnNob3dDb250cm9scygpO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdGV4dCgnQ29udHJvbHMgU2hvd24nLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTWVkaWFFbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI2ODAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SGlkZSB0aGUgZGVmYXVsdCBtZWRpYUVsZW1lbnQgY29udHJvbHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiaGlkZUNvbnRyb2xzXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgZWxlO1xcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgLy9wNS5NZWRpYUVsZW1lbnQgb2JqZWN0cyBhcmUgdXN1YWxseSBjcmVhdGVkXFxuICAvL2J5IGNhbGxpbmcgdGhlIGNyZWF0ZUF1ZGlvKCksIGNyZWF0ZVZpZGVvKCksXFxuICAvL2FuZCBjcmVhdGVDYXB0dXJlKCkgZnVuY3Rpb25zLlxcbiAgLy9JbiB0aGlzIGV4YW1wbGUgd2UgY3JlYXRlXFxuICAvL2EgbmV3IHA1Lk1lZGlhRWxlbWVudCB2aWEgY3JlYXRlQXVkaW8oKVxcbiAgZWxlID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9sdWNreV9kcmFnb25zLm1wMycpO1xcbiAgZWxlLnNob3dDb250cm9scygpO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KCdDbGljayB0byBoaWRlIENvbnRyb2xzIScsIDEwLCAyNSwgNzAsIDgwKTtcXG59XFxuZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xcbiAgZWxlLmhpZGVDb250cm9scygpO1xcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdGV4dCgnQ29udHJvbHMgaGlkZGVuJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1lZGlhRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNzA5LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1lZGlhRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNzIwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNjaGVkdWxlIGV2ZW50cyB0byB0cmlnZ2VyIGV2ZXJ5IHRpbWUgYSBNZWRpYUVsZW1lbnRcXG4oYXVkaW8vdmlkZW8pIHJlYWNoZXMgYSBwbGF5YmFjayBjdWUgcG9pbnQuPC9wPlxcbjxwPkFjY2VwdHMgYSBjYWxsYmFjayBmdW5jdGlvbiwgYSB0aW1lIChpbiBzZWNvbmRzKSBhdCB3aGljaCB0byB0cmlnZ2VyXFxudGhlIGNhbGxiYWNrLCBhbmQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGZvciB0aGUgY2FsbGJhY2suPC9wPlxcbjxwPlRpbWUgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sXFxuYW5kIHBhcmFtIHdpbGwgYmUgdGhlIHNlY29uZCBwYXJhbWV0ZXIuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWRkQ3VlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaW1lIGluIHNlY29uZHMsIHJlbGF0aXZlIHRvIHRoaXMgbWVkaWFcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCYjMzk7cyBwbGF5YmFjay4gRm9yIGV4YW1wbGUsIHRvIHRyaWdnZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZXZlbnQgZXZlcnkgdGltZSBwbGF5YmFjayByZWFjaGVzIHR3b1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzLCBwYXNzIGluIHRoZSBudW1iZXIgMi4gVGhpcyB3aWxsIGJlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OYW1lIG9mIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhdCB0aGUgZ2l2ZW4gdGltZS4gVGhlIGNhbGxiYWNrIHdpbGxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZSB0aW1lIGFuZCAob3B0aW9uYWxseSkgcGFyYW0gYXMgaXRzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3byBwYXJhbWV0ZXJzLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QW4gb2JqZWN0IHRvIGJlIHBhc3NlZCBhcyB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kIHBhcmFtZXRlciB0byB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaWQgSUQgb2YgdGhpcyBjdWUsXFxuICAgICAgICAgICAgICAgICAgICB1c2VmdWwgZm9yIHJlbW92ZUN1ZShpZClcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZCgyNTUsIDI1NSwgMjU1KTtcXG5cXG4gIHZhciBhdWRpb0VsID0gY3JlYXRlQXVkaW8oJ2Fzc2V0cy9iZWF0Lm1wMycpO1xcbiAgYXVkaW9FbC5zaG93Q29udHJvbHMoKTtcXG5cXG4gIC8vIHNjaGVkdWxlIHRocmVlIGNhbGxzIHRvIGNoYW5nZUJhY2tncm91bmRcXG4gIGF1ZGlvRWwuYWRkQ3VlKDAuNSwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMjU1LCAwLCAwKSk7XFxuICBhdWRpb0VsLmFkZEN1ZSgxLjAsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDAsIDI1NSwgMCkpO1xcbiAgYXVkaW9FbC5hZGRDdWUoMi41LCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigwLCAwLCAyNTUpKTtcXG4gIGF1ZGlvRWwuYWRkQ3VlKDMuMCwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMCwgMjU1LCAyNTUpKTtcXG4gIGF1ZGlvRWwuYWRkQ3VlKDQuMiwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMjU1LCAyNTUsIDApKTtcXG4gIGF1ZGlvRWwuYWRkQ3VlKDUuMCwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMjU1LCAyNTUsIDApKTtcXG59XFxuXFxuZnVuY3Rpb24gY2hhbmdlQmFja2dyb3VuZCh2YWwpIHtcXG4gIGJhY2tncm91bmQodmFsKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1lZGlhRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNzgyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlbW92ZSBhIGNhbGxiYWNrIGJhc2VkIG9uIGl0cyBJRC4gVGhlIElEIGlzIHJldHVybmVkIGJ5IHRoZVxcbmFkZEN1ZSBtZXRob2QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVtb3ZlQ3VlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJpZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SUQgb2YgdGhlIGN1ZSwgYXMgcmV0dXJuZWQgYnkgYWRkQ3VlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgYXVkaW9FbCwgaWQxLCBpZDI7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKDI1NSwgMjU1LCAyNTUpO1xcbiAgYXVkaW9FbCA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvYmVhdC5tcDMnKTtcXG4gIGF1ZGlvRWwuc2hvd0NvbnRyb2xzKCk7XFxuICAvLyBzY2hlZHVsZSBmaXZlIGNhbGxzIHRvIGNoYW5nZUJhY2tncm91bmRcXG4gIGlkMSA9IGF1ZGlvRWwuYWRkQ3VlKDAuNSwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMjU1LCAwLCAwKSk7XFxuICBhdWRpb0VsLmFkZEN1ZSgxLjAsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDAsIDI1NSwgMCkpO1xcbiAgYXVkaW9FbC5hZGRDdWUoMi41LCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigwLCAwLCAyNTUpKTtcXG4gIGF1ZGlvRWwuYWRkQ3VlKDMuMCwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMCwgMjU1LCAyNTUpKTtcXG4gIGlkMiA9IGF1ZGlvRWwuYWRkQ3VlKDQuMiwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMjU1LCAyNTUsIDApKTtcXG4gIHRleHQoJ0NsaWNrIHRvIHJlbW92ZSBmaXJzdCBhbmQgbGFzdCBDdWUhJywgMTAsIDI1LCA3MCwgODApO1xcbn1cXG5mdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XFxuICBhdWRpb0VsLnJlbW92ZUN1ZShpZDEpO1xcbiAgYXVkaW9FbC5yZW1vdmVDdWUoaWQyKTtcXG59XFxuZnVuY3Rpb24gY2hhbmdlQmFja2dyb3VuZCh2YWwpIHtcXG4gIGJhY2tncm91bmQodmFsKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1lZGlhRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyODI0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlbW92ZSBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhZCBvcmlnaW5hbGx5IGJlZW4gc2NoZWR1bGVkXFxudmlhIHRoZSBhZGRDdWUgbWV0aG9kLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNsZWFyQ3Vlc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaWRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPklEIG9mIHRoZSBjdWUsIGFzIHJldHVybmVkIGJ5IGFkZEN1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIGF1ZGlvRWw7XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKDI1NSwgMjU1LCAyNTUpO1xcbiAgYXVkaW9FbCA9IGNyZWF0ZUF1ZGlvKCdhc3NldHMvYmVhdC5tcDMnKTtcXG4gIC8vU2hvdyB0aGUgZGVmYXVsdCBNZWRpYUVsZW1lbnQgY29udHJvbHMsIGFzIGRldGVybWluZWQgYnkgdGhlIHdlYiBicm93c2VyXFxuICBhdWRpb0VsLnNob3dDb250cm9scygpO1xcbiAgLy8gc2NoZWR1bGUgY2FsbHMgdG8gY2hhbmdlQmFja2dyb3VuZFxcbiAgYmFja2dyb3VuZCgyMDApO1xcbiAgdGV4dCgnQ2xpY2sgdG8gY2hhbmdlIEN1ZSEnLCAxMCwgMjUsIDcwLCA4MCk7XFxuICBhdWRpb0VsLmFkZEN1ZSgwLjUsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDI1NSwgMCwgMCkpO1xcbiAgYXVkaW9FbC5hZGRDdWUoMS4wLCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigwLCAyNTUsIDApKTtcXG4gIGF1ZGlvRWwuYWRkQ3VlKDIuNSwgY2hhbmdlQmFja2dyb3VuZCwgY29sb3IoMCwgMCwgMjU1KSk7XFxuICBhdWRpb0VsLmFkZEN1ZSgzLjAsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDAsIDI1NSwgMjU1KSk7XFxuICBhdWRpb0VsLmFkZEN1ZSg0LjIsIGNoYW5nZUJhY2tncm91bmQsIGNvbG9yKDI1NSwgMjU1LCAwKSk7XFxufVxcbmZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcXG4gIC8vIGhlcmUgd2UgY2xlYXIgdGhlIHNjaGVkdWxlZCBjYWxsYmFja3NcXG4gIGF1ZGlvRWwuY2xlYXJDdWVzKCk7XFxuICAvLyB0aGVuIHdlIGFkZCBzb21lIG1vcmUgY2FsbGJhY2tzXFxuICBhdWRpb0VsLmFkZEN1ZSgxLCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigyLCAyLCAyKSk7XFxuICBhdWRpb0VsLmFkZEN1ZSgzLCBjaGFuZ2VCYWNrZ3JvdW5kLCBjb2xvcigyNTUsIDI1NSwgMCkpO1xcbn1cXG5mdW5jdGlvbiBjaGFuZ2VCYWNrZ3JvdW5kKHZhbCkge1xcbiAgYmFja2dyb3VuZCh2YWwpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTWVkaWFFbGVtZW50XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI4OTQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VW5kZXJseWluZyBGaWxlIG9iamVjdC4gQWxsIG5vcm1hbCBGaWxlIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBvbiB0aGlzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmlsZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjkwNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5GaWxlIHR5cGUgKGltYWdlLCB0ZXh0LCBldGMuKTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidHlwZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjkxMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5GaWxlIHN1YnR5cGUgKHVzdWFsbHkgdGhlIGZpbGUgZXh0ZW5zaW9uIGpwZywgcG5nLCB4bWwsIGV0Yy4pPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzdWJ0eXBlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5kb20uanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyOTE4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkZpbGUgbmFtZTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibmFtZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuZG9tXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LmRvbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuZG9tLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjkyNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5GaWxlIHNpemU8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNpemVcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5GaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LmRvbVwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5kb21cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LmRvbS5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI5MzEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VVJMIHN0cmluZyBjb250YWluaW5nIGltYWdlIGRhdGEuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkYXRhXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5kb21cIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuZG9tXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LnNvdW5kXFxuPGEgaHJlZj1cXFwiaHR0cHM6Ly9wNWpzLm9yZy9yZWZlcmVuY2UvIy9saWJyYXJpZXMvcDUuc291bmRcXFwiPmh0dHBzOi8vcDVqcy5vcmcvcmVmZXJlbmNlLyMvbGlicmFyaWVzL3A1LnNvdW5kPC9hPjwvcD5cXG48cD5Gcm9tIHRoZSBQcm9jZXNzaW5nIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xcbjxhIGhyZWY9XFxcImh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzLXNvdW5kL2dyYXBocy9jb250cmlidXRvcnNcXFwiPmh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzLXNvdW5kL2dyYXBocy9jb250cmlidXRvcnM8L2E+PC9wPlxcbjxwPk1JVCBMaWNlbnNlIChNSVQpXFxuPGEgaHJlZj1cXFwiaHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmcvcDUuanMtc291bmQvYmxvYi9tYXN0ZXIvTElDRU5TRVxcXCI+aHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmcvcDUuanMtc291bmQvYmxvYi9tYXN0ZXIvTElDRU5TRTwvYT48L3A+XFxuPHA+U29tZSBvZiB0aGUgbWFueSBhdWRpbyBsaWJyYXJpZXMgJmFtcDsgcmVzb3VyY2VzIHRoYXQgaW5zcGlyZSBwNS5zb3VuZDo8L3A+XFxuPHVsPlxcbjxsaT5UT05FLmpzIChjKSBZb3RhbSBNYW5uLiBMaWNlbnNlZCB1bmRlciBUaGUgTUlUIExpY2Vuc2UgKE1JVCkuIDxhIGhyZWY9XFxcImh0dHBzOi8vZ2l0aHViLmNvbS9UT05Fbm9UT05FL1RvbmUuanNcXFwiPmh0dHBzOi8vZ2l0aHViLmNvbS9UT05Fbm9UT05FL1RvbmUuanM8L2E+PC9saT5cXG48bGk+YnV6ei5qcyAoYykgSmF5IFNhbHZhdC4gTGljZW5zZWQgdW5kZXIgVGhlIE1JVCBMaWNlbnNlIChNSVQpLiA8YSBocmVmPVxcXCJodHRwOi8vYnV6ei5qYXlzYWx2YXQuY29tL1xcXCI+aHR0cDovL2J1enouamF5c2FsdmF0LmNvbS88L2E+PC9saT5cXG48bGk+Qm9yaXMgU211cyBXZWIgQXVkaW8gQVBJIGJvb2ssIDIwMTMuIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSA8YSBocmVmPVxcXCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcXFwiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT48L2xpPlxcbjxsaT53YXZlc3VyZmVyLmpzIDxhIGhyZWY9XFxcImh0dHBzOi8vZ2l0aHViLmNvbS9rYXRzcGF1Z2gvd2F2ZXN1cmZlci5qc1xcXCI+aHR0cHM6Ly9naXRodWIuY29tL2thdHNwYXVnaC93YXZlc3VyZmVyLmpzPC9hPjwvbGk+XFxuPGxpPldlYiBBdWRpbyBDb21wb25lbnRzIGJ5IEpvcmRhbiBTYW50ZWxsIDxhIGhyZWY9XFxcImh0dHBzOi8vZ2l0aHViLmNvbS93ZWItYXVkaW8tY29tcG9uZW50c1xcXCI+aHR0cHM6Ly9naXRodWIuY29tL3dlYi1hdWRpby1jb21wb25lbnRzPC9hPjwvbGk+XFxuPGxpPjxwPldpbG0gVGhvYmVuJiMzOTtzIFNvdW5kIGxpYnJhcnkgZm9yIFByb2Nlc3NpbmcgPGEgaHJlZj1cXFwiaHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmcvcHJvY2Vzc2luZy90cmVlL21hc3Rlci9qYXZhL2xpYnJhcmllcy9zb3VuZFxcXCI+aHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmcvcHJvY2Vzc2luZy90cmVlL21hc3Rlci9qYXZhL2xpYnJhcmllcy9zb3VuZDwvYT48L3A+XFxuPHA+V2ViIEF1ZGlvIEFQSTogPGEgaHJlZj1cXFwiaHR0cDovL3czLm9yZy9UUi93ZWJhdWRpby9cXFwiPmh0dHA6Ly93My5vcmcvVFIvd2ViYXVkaW8vPC9hPjwvcD5cXG48L2xpPlxcbjwvdWw+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjEyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgdGhlIEF1ZGlvIENvbnRleHQgZm9yIHRoaXMgc2tldGNoLiBVc2VmdWwgZm9yIHVzZXJzXFxud2hvIHdvdWxkIGxpa2UgdG8gZGlnIGRlZXBlciBpbnRvIHRoZSA8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj1cXG4naHR0cDovL3dlYmF1ZGlvLmdpdGh1Yi5pby93ZWItYXVkaW8tYXBpLyc+V2ViIEF1ZGlvIEFQSVxcbjwvYT4uPC9wPlwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0QXVkaW9Db250ZXh0XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkF1ZGlvQ29udGV4dCBmb3IgdGhpcyBza2V0Y2hcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMjYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RGV0ZXJtaW5lIHdoaWNoIGZpbGV0eXBlcyBhcmUgc3VwcG9ydGVkIChpbnNwaXJlZCBieSBidXp6LmpzKVxcblRoZSBhdWRpbyBlbGVtZW50IChlbCkgd2lsbCBvbmx5IGJlIHVzZWQgdG8gdGVzdCBicm93c2VyIHN1cHBvcnQgZm9yIHZhcmlvdXMgYXVkaW8gZm9ybWF0czwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyOTYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TWFzdGVyIGNvbnRhaW5zIEF1ZGlvQ29udGV4dCBhbmQgdGhlIG1hc3RlciBzb3VuZCBvdXRwdXQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMyOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIGEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgbWFzdGVyIGFtcGxpdHVkZSAodm9sdW1lKSBmb3Igc291bmRcXG5pbiB0aGlzIHNrZXRjaC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRNYXN0ZXJWb2x1bWVcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiTWFzdGVyIGFtcGxpdHVkZSAodm9sdW1lKSBmb3Igc291bmQgaW4gdGhpcyBza2V0Y2guXFxuICAgICAgICAgICAgICAgICBTaG91bGQgYmUgYmV0d2VlbiAwLjAgKHNpbGVuY2UpIGFuZCAxLjAuXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMzQwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNjYWxlIHRoZSBvdXRwdXQgb2YgYWxsIHNvdW5kIGluIHRoaXMgc2tldGNoPC9wPlxcblNjYWxlZCBiZXR3ZWVuIDAuMCAoc2lsZW5jZSkgYW5kIDEuMCAoZnVsbCB2b2x1bWUpLlxcbjEuMCBpcyB0aGUgbWF4aW11bSBhbXBsaXR1ZGUgb2YgYSBkaWdpdGFsIHNvdW5kLCBzbyBtdWx0aXBseWluZ1xcbmJ5IGdyZWF0ZXIgdGhhbiAxLjAgbWF5IGNhdXNlIGRpZ2l0YWwgZGlzdG9ydGlvbi4gVG9cXG5mYWRlLCBwcm92aWRlIGEgPGNvZGU+cmFtcFRpbWU8L2NvZGU+IHBhcmFtZXRlci4gRm9yIG1vcmVcXG5jb21wbGV4IGZhZGVzLCBzZWUgdGhlIEVudiBjbGFzcy5cXG5cXG5BbHRlcm5hdGVseSwgeW91IGNhbiBwYXNzIGluIGEgc2lnbmFsIHNvdXJjZSBzdWNoIGFzIGFuXFxub3NjaWxsYXRvciB0byBtb2R1bGF0ZSB0aGUgYW1wbGl0dWRlIHdpdGggYW4gYXVkaW8gc2lnbmFsLlxcblxcbjxwPjxiPkhvdyBUaGlzIFdvcmtzPC9iPjogV2hlbiB5b3UgbG9hZCB0aGUgcDUuc291bmQgbW9kdWxlLCBpdFxcbmNyZWF0ZXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgcDVzb3VuZC4gQWxsIHNvdW5kIG9iamVjdHMgaW4gdGhpc1xcbm1vZHVsZSBvdXRwdXQgdG8gcDVzb3VuZCBiZWZvcmUgcmVhY2hpbmcgeW91ciBjb21wdXRlciYjMzk7cyBvdXRwdXQuXFxuU28gaWYgeW91IGNoYW5nZSB0aGUgYW1wbGl0dWRlIG9mIHA1c291bmQsIGl0IGltcGFjdHMgYWxsIG9mIHRoZVxcbnNvdW5kIGluIHRoaXMgbW9kdWxlLjwvcD5cXG5cXG48cD5JZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgcmV0dXJucyBhIFdlYiBBdWRpbyBBUEkgR2FpbiBOb2RlPC9wPlwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibWFzdGVyVm9sdW1lXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2b2x1bWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlZvbHVtZSAoYW1wbGl0dWRlKSBiZXR3ZWVuIDAuMFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIDEuMCBvciBtb2R1bGF0aW5nIHNpZ25hbC9vc2NpbGxhdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8T2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFtcFRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkZhZGUgZm9yIHQgc2Vjb25kczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lRnJvbU5vd1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2NoZWR1bGUgdGhpcyBldmVudCB0byBoYXBwZW4gYXRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCBzZWNvbmRzIGluIHRoZSBmdXR1cmU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM4MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD48Y29kZT5wNS5zb3VuZE91dDwvY29kZT4gaXMgdGhlIHA1LnNvdW5kIG1hc3RlciBvdXRwdXQuIEl0IHNlbmRzIG91dHB1dCB0b1xcbnRoZSBkZXN0aW5hdGlvbiBvZiB0aGlzIHdpbmRvdyYjMzk7cyB3ZWIgYXVkaW8gY29udGV4dC4gSXQgY29udGFpbnNcXG5XZWIgQXVkaW8gQVBJIG5vZGVzIGluY2x1ZGluZyBhIGR5YW5taWNzQ29tcHJlc3NvciAoPGNvZGU+LmxpbWl0ZXI8L2NvZGU+KSxcXG5hbmQgR2FpbiBOb2RlcyBmb3IgPGNvZGU+LmlucHV0PC9jb2RlPiBhbmQgPGNvZGU+Lm91dHB1dDwvY29kZT4uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzb3VuZE91dFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDA3LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQxMCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIGEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgc2FtcGxlIHJhdGUsIGluIHNhbXBsZXMgcGVyIHNlY29uZCxcXG5vZiBhbGwgc291bmQgb2JqZWN0cyBpbiB0aGlzIGF1ZGlvIGNvbnRleHQuIEl0IGlzIGRldGVybWluZWQgYnkgdGhlXFxuc2FtcGxpbmcgcmF0ZSBvZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0mIzM5O3Mgc291bmQgY2FyZCwgYW5kIGl0IGlzIG5vdFxcbmN1cnJlbnRseSBwb3NzaWxlIHRvIGNoYW5nZS5cXG5JdCBpcyBvZnRlbiA0NDEwMCwgb3IgdHdpY2UgdGhlIHJhbmdlIG9mIGh1bWFuIGhlYXJpbmcuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2FtcGxlUmF0ZVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzYW1wbGVyYXRlIHNhbXBsZXMgcGVyIHNlY29uZFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQyMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIHRoZSBjbG9zZXN0IE1JREkgbm90ZSB2YWx1ZSBmb3JcXG5hIGdpdmVuIGZyZXF1ZW5jeS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJmcmVxVG9NaWRpXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmcmVxdWVuY3lcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkEgZnJlcWV1bmN5LCBmb3IgZXhhbXBsZSwgdGhlICZxdW90O0EmcXVvdDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSBNaWRkbGUgQyBpcyA0NDBIejwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJNSURJIG5vdGUgdmFsdWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0MzcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyB0aGUgZnJlcXVlbmN5IHZhbHVlIG9mIGEgTUlESSBub3RlIHZhbHVlLlxcbkdlbmVyYWwgTUlESSB0cmVhdHMgbm90ZXMgYXMgaW50ZWdlcnMgd2hlcmUgbWlkZGxlIENcXG5pcyA2MCwgQyMgaXMgNjEsIEQgaXMgNjIgZXRjLiBVc2VmdWwgZm9yIGdlbmVyYXRpbmdcXG5tdXNpY2FsIGZyZXF1ZW5jaWVzIHdpdGggb3NjaWxsYXRvcnMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibWlkaVRvRnJlcVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibWlkaU5vdGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBudW1iZXIgb2YgYSBNSURJIG5vdGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiRnJlcXVlbmN5IHZhbHVlIG9mIHRoZSBnaXZlbiBNSURJIG5vdGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBub3RlcyA9IFs2MCwgNjQsIDY3LCA3Ml07XFxudmFyIGkgPSAwO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgb3NjID0gbmV3IHA1Lk9zY2lsbGF0b3IoJ1RyaWFuZ2xlJyk7XFxuICBvc2Muc3RhcnQoKTtcXG4gIGZyYW1lUmF0ZSgxKTtcXG59XFxuXFxuZnVuY3Rpb24gZHJhdygpIHtcXG4gIHZhciBmcmVxID0gbWlkaVRvRnJlcShub3Rlc1tpXSk7XFxuICBvc2MuZnJlcShmcmVxKTtcXG4gIGkrKztcXG4gIGlmIChpID49IG5vdGVzLmxlbmd0aCl7XFxuICAgIGkgPSAwO1xcbiAgfVxcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNDcwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkxpc3QgdGhlIFNvdW5kRmlsZSBmb3JtYXRzIHRoYXQgeW91IHdpbGwgaW5jbHVkZS4gTG9hZFNvdW5kXFxud2lsbCBzZWFyY2ggeW91ciBkaXJlY3RvcnkgZm9yIHRoZXNlIGV4dGVuc2lvbnMsIGFuZCB3aWxsIHBpY2tcXG5hIGZvcm1hdCB0aGF0IGlzIGNvbXBhdGFibGUgd2l0aCB0aGUgY2xpZW50JiMzOTtzIHdlYiBicm93c2VyLlxcbjxhIGhyZWY9XFxcImh0dHA6Ly9tZWRpYS5pby9cXFwiPkhlcmU8L2E+IGlzIGEgZnJlZSBvbmxpbmUgZmlsZVxcbmNvbnZlcnRlci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzb3VuZEZvcm1hdHNcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZvcm1hdHNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmkuZS4gJiMzOTttcDMmIzM5OywgJiMzOTt3YXYmIzM5OywgJiMzOTtvZ2cmIzM5OzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJtdWx0aXBsZVwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICAvLyBzZXQgdGhlIGdsb2JhbCBzb3VuZCBmb3JtYXRzXFxuICBzb3VuZEZvcm1hdHMoJ21wMycsICdvZ2cnKTtcXG5cXG4gIC8vIGxvYWQgZWl0aGVyIGJlYXRib3gubXAzLCBvciAub2dnLCBkZXBlbmRpbmcgb24gYnJvd3NlclxcbiAgbXlTb3VuZCA9IGxvYWRTb3VuZCgnYXNzZXRzL2JlYXRib3gubXAzJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgbXlTb3VuZC5wbGF5KCk7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1ODMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VXNlZCBieSBPc2MgYW5kIEVudiB0byBjaGFpbiBzaWduYWwgbWF0aDwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4NTUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bG9hZFNvdW5kKCkgcmV0dXJucyBhIG5ldyBwNS5Tb3VuZEZpbGUgZnJvbSBhIHNwZWNpZmllZFxcbnBhdGguIElmIGNhbGxlZCBkdXJpbmcgcHJlbG9hZCgpLCB0aGUgcDUuU291bmRGaWxlIHdpbGwgYmUgcmVhZHlcXG50byBwbGF5IGluIHRpbWUgZm9yIHNldHVwKCkgYW5kIGRyYXcoKS4gSWYgY2FsbGVkIG91dHNpZGUgb2ZcXG5wcmVsb2FkLCB0aGUgcDUuU291bmRGaWxlIHdpbGwgbm90IGJlIHJlYWR5IGltbWVkaWF0ZWx5LCBzb1xcbmxvYWRTb3VuZCBhY2NlcHRzIGEgY2FsbGJhY2sgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIFVzaW5nIGFcXG48YSBocmVmPVxcXCJodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy9wNS5qcy93aWtpL0xvY2FsLXNlcnZlclxcXCI+XFxubG9jYWwgc2VydmVyPC9hPiBpcyByZWNvbW1lbmRlZCB3aGVuIGxvYWRpbmcgZXh0ZXJuYWwgZmlsZXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibG9hZFNvdW5kXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRoXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5QYXRoIHRvIHRoZSBzb3VuZCBmaWxlLCBvciBhbiBhcnJheSB3aXRoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzIHRvIHNvdW5kZmlsZXMgaW4gbXVsdGlwbGUgZm9ybWF0c1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmUuIFsmIzM5O3NvdW5kLm9nZyYjMzk7LCAmIzM5O3NvdW5kLm1wMyYjMzk7XS5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWx0ZXJuYXRlbHksIGFjY2VwdHMgYW4gb2JqZWN0OiBlaXRoZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgSFRNTDUgRmlsZSBBUEksIG9yIGEgcDUuRmlsZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xBcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN1Y2Nlc3NDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSBmaWxlIGxvYWRzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZXJyb3JDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlcmUgaXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBlcnJvciBsb2FkaW5nIHRoZSBmaWxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIndoaWxlTG9hZGluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgd2hpbGUgZmlsZSBpcyBsb2FkaW5nLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVjZWl2ZSB0aGUgcGVyY2VudGFnZSBsb2FkZWRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZmFyLCBmcm9tIDAuMCB0byAxLjAuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJSZXR1cm5zIGEgcDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU291bmRGaWxlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiBteVNvdW5kID0gbG9hZFNvdW5kKCdhc3NldHMvZG9vcmJlbGwubXAzJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgbXlTb3VuZC5zZXRWb2x1bWUoMC4xKTtcXG4gIG15U291bmQucGxheSgpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDk5NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIHRydWUgaWYgdGhlIHNvdW5kIGZpbGUgZmluaXNoZWQgbG9hZGluZyBzdWNjZXNzZnVsbHkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiaXNMb2FkZWRcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDA4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlBsYXkgdGhlIHA1LlNvdW5kRmlsZTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBsYXlcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0YXJ0VGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+KG9wdGlvbmFsKSBzY2hlZHVsZSBwbGF5YmFjayB0byBzdGFydCAoaW4gc2Vjb25kcyBmcm9tIG5vdykuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPihvcHRpb25hbCkgcGxheWJhY2sgcmF0ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbXBcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPihvcHRpb25hbCkgYW1wbGl0dWRlICh2b2x1bWUpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgcGxheWJhY2s8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3VlU3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPihvcHRpb25hbCkgY3VlIHN0YXJ0IHRpbWUgaW4gc2Vjb25kczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+KG9wdGlvbmFsKSBkdXJhdGlvbiBvZiBwbGF5YmFjayBpbiBzZWNvbmRzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTEwOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5Tb3VuZEZpbGUgaGFzIHR3byBwbGF5IG1vZGVzOiA8Y29kZT5yZXN0YXJ0PC9jb2RlPiBhbmRcXG48Y29kZT5zdXN0YWluPC9jb2RlPi4gUGxheSBNb2RlIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIGFcXG5wNS5Tb3VuZEZpbGUgaWYgaXQgaXMgdHJpZ2dlcmVkIHdoaWxlIGluIHRoZSBtaWRkbGUgb2YgcGxheWJhY2suXFxuSW4gc3VzdGFpbiBtb2RlLCBwbGF5YmFjayB3aWxsIGNvbnRpbnVlIHNpbXVsdGFuZW91cyB0byB0aGVcXG5uZXcgcGxheWJhY2suIEluIHJlc3RhcnQgbW9kZSwgcGxheSgpIHdpbGwgc3RvcCBwbGF5YmFja1xcbmFuZCBzdGFydCBvdmVyLiBXaXRoIHVudGlsRG9uZSwgYSBzb3VuZCB3aWxsIHBsYXkgb25seSBpZiBpdCYjMzk7c1xcbm5vdCBhbHJlYWR5IHBsYXlpbmcuIFN1c3RhaW4gaXMgdGhlIGRlZmF1bHQgbW9kZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwbGF5TW9kZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD4mIzM5O3Jlc3RhcnQmIzM5OyBvciAmIzM5O3N1c3RhaW4mIzM5OyBvciAmIzM5O3VudGlsRG9uZSYjMzk7PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG5mdW5jdGlvbiBzZXR1cCgpe1xcbiAgbXlTb3VuZCA9IGxvYWRTb3VuZCgnYXNzZXRzL0RhbXNjcmF5X0RhbmNpbmdUaWdlci5tcDMnKTtcXG59XFxuZnVuY3Rpb24gbW91c2VDbGlja2VkKCkge1xcbiAgbXlTb3VuZC5wbGF5TW9kZSgnc3VzdGFpbicpO1xcbiAgbXlTb3VuZC5wbGF5KCk7XFxufVxcbmZ1bmN0aW9uIGtleVByZXNzZWQoKSB7XFxuICBteVNvdW5kLnBsYXlNb2RlKCdyZXN0YXJ0Jyk7XFxuICBteVNvdW5kLnBsYXkoKTtcXG59XFxuXFxuIDwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTE1MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5QYXVzZXMgYSBmaWxlIHRoYXQgaXMgY3VycmVudGx5IHBsYXlpbmcuIElmIHRoZSBmaWxlIGlzIG5vdFxcbnBsYXlpbmcsIHRoZW4gbm90aGluZyB3aWxsIGhhcHBlbi48L3A+XFxuPHA+QWZ0ZXIgcGF1c2luZywgLnBsYXkoKSB3aWxsIHJlc3VtZSBmcm9tIHRoZSBwYXVzZWRcXG5wb3NpdGlvbi5cXG5JZiBwNS5Tb3VuZEZpbGUgaGFkIGJlZW4gc2V0IHRvIGxvb3AgYmVmb3JlIGl0IHdhcyBwYXVzZWQsXFxuaXQgd2lsbCBjb250aW51ZSB0byBsb29wIGFmdGVyIGl0IGlzIHVucGF1c2VkIHdpdGggLnBsYXkoKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXVzZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RhcnRUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD4ob3B0aW9uYWwpIHNjaGVkdWxlIGV2ZW50IHRvIG9jY3VyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzIGZyb20gbm93PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBzb3VuZEZpbGU7XFxuXFxuZnVuY3Rpb24gcHJlbG9hZCgpIHtcXG4gIHNvdW5kRm9ybWF0cygnb2dnJywgJ21wMycpO1xcbiAgc291bmRGaWxlID0gbG9hZFNvdW5kKCdhc3NldHMvRGFtc2NyYXlfMDIubXAzJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgYmFja2dyb3VuZCgwLCAyNTUsIDApO1xcbiAgc291bmRGaWxlLnNldFZvbHVtZSgwLjEpO1xcbiAgc291bmRGaWxlLmxvb3AoKTtcXG59XFxuZnVuY3Rpb24ga2V5VHlwZWQoKSB7XFxuICBpZiAoa2V5ID09ICdwJykge1xcbiAgICBzb3VuZEZpbGUucGF1c2UoKTtcXG4gICAgYmFja2dyb3VuZCgyNTUsIDAsIDApO1xcbiAgfVxcbn1cXG5cXG5mdW5jdGlvbiBrZXlSZWxlYXNlZCgpIHtcXG4gIGlmIChrZXkgPT0gJ3AnKSB7XFxuICAgIHNvdW5kRmlsZS5wbGF5KCk7XFxuICAgIGJhY2tncm91bmQoMCwgMjU1LCAwKTtcXG4gIH1cXG59XFxuPC9jb2RlPlxcbjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjA4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkxvb3AgdGhlIHA1LlNvdW5kRmlsZS4gQWNjZXB0cyBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHNldCB0aGVcXG5wbGF5YmFjayByYXRlLCBwbGF5YmFjayB2b2x1bWUsIGxvb3BTdGFydCwgbG9vcEVuZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJsb29wXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdGFydFRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPihvcHRpb25hbCkgc2NoZWR1bGUgZXZlbnQgdG8gb2NjdXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyBmcm9tIG5vdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD4ob3B0aW9uYWwpIHBsYXliYWNrIHJhdGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW1wXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD4ob3B0aW9uYWwpIHBsYXliYWNrIHZvbHVtZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjdWVMb29wU3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPihvcHRpb25hbCkgc3RhcnRUaW1lIGluIHNlY29uZHM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPihvcHRpb25hbCkgbG9vcCBkdXJhdGlvbiBpbiBzZWNvbmRzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTIyNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgYSBwNS5Tb3VuZEZpbGUmIzM5O3MgbG9vcGluZyBmbGFnIHRvIHRydWUgb3IgZmFsc2UuIElmIHRoZSBzb3VuZFxcbmlzIGN1cnJlbnRseSBwbGF5aW5nLCB0aGlzIGNoYW5nZSB3aWxsIHRha2UgZWZmZWN0IHdoZW4gaXRcXG5yZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcGxheWJhY2suPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0TG9vcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c2V0IGxvb3BpbmcgdG8gdHJ1ZSBvciBmYWxzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTI0NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zICYjMzk7dHJ1ZSYjMzk7IGlmIGEgcDUuU291bmRGaWxlIGlzIGN1cnJlbnRseSBsb29waW5nIGFuZCBwbGF5aW5nLCAmIzM5O2ZhbHNlJiMzOTsgaWYgbm90LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImlzTG9vcGluZ1wiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyNjAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyB0cnVlIGlmIGEgcDUuU291bmRGaWxlIGlzIHBsYXlpbmcsIGZhbHNlIGlmIG5vdCAoaS5lLlxcbnBhdXNlZCBvciBzdG9wcGVkKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJpc1BsYXlpbmdcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjcwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgdHJ1ZSBpZiBhIHA1LlNvdW5kRmlsZSBpcyBwYXVzZWQsIGZhbHNlIGlmIG5vdCAoaS5lLlxcbnBsYXlpbmcgb3Igc3RvcHBlZCkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiaXNQYXVzZWRcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjgwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0b3Agc291bmRmaWxlIHBsYXliYWNrLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInN0b3BcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN0YXJ0VGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+KG9wdGlvbmFsKSBzY2hlZHVsZSBldmVudCB0byBvY2N1clxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzZWNvbmRzIGZyb20gbm93PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTMyNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5NdWx0aXBseSB0aGUgb3V0cHV0IHZvbHVtZSAoYW1wbGl0dWRlKSBvZiBhIHNvdW5kIGZpbGVcXG5iZXR3ZWVuIDAuMCAoc2lsZW5jZSkgYW5kIDEuMCAoZnVsbCB2b2x1bWUpLlxcbjEuMCBpcyB0aGUgbWF4aW11bSBhbXBsaXR1ZGUgb2YgYSBkaWdpdGFsIHNvdW5kLCBzbyBtdWx0aXBseWluZ1xcbmJ5IGdyZWF0ZXIgdGhhbiAxLjAgbWF5IGNhdXNlIGRpZ2l0YWwgZGlzdG9ydGlvbi4gVG9cXG5mYWRlLCBwcm92aWRlIGEgPGNvZGU+cmFtcFRpbWU8L2NvZGU+IHBhcmFtZXRlci4gRm9yIG1vcmVcXG5jb21wbGV4IGZhZGVzLCBzZWUgdGhlIEVudiBjbGFzcy48L3A+XFxuPHA+QWx0ZXJuYXRlbHksIHlvdSBjYW4gcGFzcyBpbiBhIHNpZ25hbCBzb3VyY2Ugc3VjaCBhcyBhblxcbm9zY2lsbGF0b3IgdG8gbW9kdWxhdGUgdGhlIGFtcGxpdHVkZSB3aXRoIGFuIGF1ZGlvIHNpZ25hbC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRWb2x1bWVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZvbHVtZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Vm9sdW1lIChhbXBsaXR1ZGUpIGJldHdlZW4gMC4wXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgMS4wIG9yIG1vZHVsYXRpbmcgc2lnbmFsL29zY2lsbGF0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcnxPYmplY3RcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyYW1wVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RmFkZSBmb3IgdCBzZWNvbmRzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TY2hlZHVsZSB0aGlzIGV2ZW50IHRvIGhhcHBlbiBhdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0IHNlY29uZHMgaW4gdGhlIGZ1dHVyZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEzNjcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHRoZSBzdGVyZW8gcGFubmluZyBvZiBhIHA1LnNvdW5kIG9iamVjdCB0b1xcbmEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGJldHdlZW4gLTEuMCAobGVmdCkgYW5kIDEuMCAocmlnaHQpLlxcbkRlZmF1bHQgaXMgMC4wIChjZW50ZXIpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBhblwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGFuVmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgc3RlcmVvIHBhbm5lcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lRnJvbU5vd1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c2NoZWR1bGUgdGhpcyBldmVudCB0byBoYXBwZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgZnJvbSBub3c8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuXFxuIHZhciBiYWxsID0ge307XFxuIHZhciBzb3VuZEZpbGU7XFxuXFxuIGZ1bmN0aW9uIHNldHVwKCkge1xcbiAgIHNvdW5kRm9ybWF0cygnb2dnJywgJ21wMycpO1xcbiAgIHNvdW5kRmlsZSA9IGxvYWRTb3VuZCgnYXNzZXRzL2JlYXRib3gubXAzJyk7XFxuIH1cXG5cXG4gZnVuY3Rpb24gZHJhdygpIHtcXG4gICBiYWNrZ3JvdW5kKDApO1xcbiAgIGJhbGwueCA9IGNvbnN0cmFpbihtb3VzZVgsIDAsIHdpZHRoKTtcXG4gICBlbGxpcHNlKGJhbGwueCwgaGVpZ2h0LzIsIDIwLCAyMClcXG4gfVxcblxcbiBmdW5jdGlvbiBtb3VzZVByZXNzZWQoKXtcXG4gICAvLyBtYXAgdGhlIGJhbGwncyB4IGxvY2F0aW9uIHRvIGEgcGFubmluZyBkZWdyZWVcXG4gICAvLyBiZXR3ZWVuIC0xLjAgKGxlZnQpIGFuZCAxLjAgKHJpZ2h0KVxcbiAgIHZhciBwYW5uaW5nID0gbWFwKGJhbGwueCwgMC4sIHdpZHRoLC0xLjAsIDEuMCk7XFxuICAgc291bmRGaWxlLnBhbihwYW5uaW5nKTtcXG4gICBzb3VuZEZpbGUucGxheSgpO1xcbiB9XFxuIDwvZGl2PjwvY29kZT5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTQwNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIHRoZSBjdXJyZW50IHN0ZXJlbyBwYW4gcG9zaXRpb24gKC0xLjAgdG8gMS4wKTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldFBhblwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJSZXR1cm5zIHRoZSBzdGVyZW8gcGFuIHNldHRpbmcgb2YgdGhlIE9zY2lsbGF0b3JcXG4gICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBudW1iZXIgYmV0d2VlbiAtMS4wIChsZWZ0KSBhbmQgMS4wIChyaWdodCkuXFxuICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCBpcyBjZW50ZXIgYW5kIGRlZmF1bHQuXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE0MTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHRoZSBwbGF5YmFjayByYXRlIG9mIGEgc291bmQgZmlsZS4gV2lsbCBjaGFuZ2UgdGhlIHNwZWVkIGFuZCB0aGUgcGl0Y2guXFxuVmFsdWVzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgcmV2ZXJzZSB0aGUgYXVkaW8gYnVmZmVyLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJhdGVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBsYXliYWNrUmF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHRoZSBwbGF5YmFjayByYXRlLiAxLjAgaXMgbm9ybWFsLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLjUgaXMgaGFsZi1zcGVlZCwgMi4wIGlzIHR3aWNlIGFzIGZhc3QuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgbGVzcyB0aGFuIHplcm8gcGxheSBiYWNrd2FyZHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBzb25nO1xcblxcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICBzb25nID0gbG9hZFNvdW5kKCdhc3NldHMvRGFtc2NyYXlfRGFuY2luZ1RpZ2VyLm1wMycpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHNvbmcubG9vcCgpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMDApO1xcblxcbiAgLy8gU2V0IHRoZSByYXRlIHRvIGEgcmFuZ2UgYmV0d2VlbiAwLjEgYW5kIDRcXG4gIC8vIENoYW5naW5nIHRoZSByYXRlIGFsc28gYWx0ZXJzIHRoZSBwaXRjaFxcbiAgdmFyIHNwZWVkID0gbWFwKG1vdXNlWSwgMC4xLCBoZWlnaHQsIDAsIDIpO1xcbiAgc3BlZWQgPSBjb25zdHJhaW4oc3BlZWQsIDAuMDEsIDQpO1xcbiAgc29uZy5yYXRlKHNwZWVkKTtcXG5cXG4gIC8vIERyYXcgYSBjaXJjbGUgdG8gc2hvdyB3aGF0IGlzIGdvaW5nIG9uXFxuICBzdHJva2UoMCk7XFxuICBmaWxsKDUxLCAxMDApO1xcbiAgZWxsaXBzZShtb3VzZVgsIDEwMCwgNDgsIDQ4KTtcXG59XFxuXFxuIDwvY29kZT5cXG4gPC9kaXY+XFxuXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE0OTAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyB0aGUgZHVyYXRpb24gb2YgYSBzb3VuZCBmaWxlIGluIHNlY29uZHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZHVyYXRpb25cIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiVGhlIGR1cmF0aW9uIG9mIHRoZSBzb3VuZEZpbGUgaW4gc2Vjb25kcy5cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTUwNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHA1LlNvdW5kRmlsZSBwbGF5aGVhZCwgaW4gc2Vjb25kcy5cXG5UaW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBub3JtYWwgYnVmZmVyIGRpcmVjdGlvbiwgc28gaWYgPGNvZGU+cmV2ZXJzZUJ1ZmZlcjwvY29kZT5cXG5oYXMgYmVlbiBjYWxsZWQsIGN1cnJlbnRUaW1lIHdpbGwgY291bnQgYmFja3dhcmRzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImN1cnJlbnRUaW1lXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImN1cnJlbnRUaW1lIG9mIHRoZSBzb3VuZEZpbGUgaW4gc2Vjb25kcy5cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTUxNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Nb3ZlIHRoZSBwbGF5aGVhZCBvZiB0aGUgc29uZyB0byBhIHBvc2l0aW9uLCBpbiBzZWNvbmRzLiBTdGFydCB0aW1pbmdcXG5hbmQgcGxheWJhY2sgZHVyYXRpb24uIElmIG5vbmUgYXJlIGdpdmVuLCB3aWxsIHJlc2V0IHRoZSBmaWxlIHRvIHBsYXlcXG5lbnRpcmUgZHVyYXRpb24gZnJvbSBzdGFydCB0byBmaW5pc2guPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwianVtcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3VlVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y3VlVGltZSBvZiB0aGUgc291bmRGaWxlIGluIHNlY29uZHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZHVyYXRpb24gaW4gc2Vjb25kcy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTUzOCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm4gdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiBhIHNvdW5kIGZpbGUuXFxuRm9yIGV4YW1wbGUsIE1vbm8gPSAxLCBTdGVyZW8gPSAyLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNoYW5uZWxzXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIltjaGFubmVsc11cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTU0OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm4gdGhlIHNhbXBsZSByYXRlIG9mIHRoZSBzb3VuZCBmaWxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNhbXBsZVJhdGVcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiW3NhbXBsZVJhdGVdXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE1NTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiBhIHNvdW5kIGZpbGUuXFxuRXF1YWwgdG8gc2FtcGxlUmF0ZSAqIGR1cmF0aW9uLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImZyYW1lc1wiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJbc2FtcGxlQ291bnRdXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE1NjcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyBhbiBhcnJheSBvZiBhbXBsaXR1ZGUgcGVha3MgaW4gYSBwNS5Tb3VuZEZpbGUgdGhhdCBjYW4gYmVcXG51c2VkIHRvIGRyYXcgYSBzdGF0aWMgd2F2ZWZvcm0uIFNjYW5zIHRocm91Z2ggdGhlIHA1LlNvdW5kRmlsZSYjMzk7c1xcbmF1ZGlvIGJ1ZmZlciB0byBmaW5kIHRoZSBncmVhdGVzdCBhbXBsaXR1ZGVzLiBBY2NlcHRzIG9uZVxcbnBhcmFtZXRlciwgJiMzOTtsZW5ndGgmIzM5Oywgd2hpY2ggZGV0ZXJtaW5lcyBzaXplIG9mIHRoZSBhcnJheS5cXG5MYXJnZXIgYXJyYXlzIHJlc3VsdCBpbiBtb3JlIHByZWNpc2Ugd2F2ZWZvcm0gdmlzdWFsaXphdGlvbnMuPC9wPlxcbjxwPkluc3BpcmVkIGJ5IFdhdmVzdXJmZXIuanMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0UGVha3NcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImxlbmd0aFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bGVuZ3RoIGlzIHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBhcnJheS5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgTGFyZ2VyIGxlbmd0aCByZXN1bHRzIGluIG1vcmUgcHJlY2lzaW9uLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byA1KndpZHRoIG9mIHRoZSBicm93c2VyIHdpbmRvdy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBcnJheSBvZiBwZWFrcy5cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGbG9hdDMyQXJyYXlcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTYxOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXZlcnNlcyB0aGUgcDUuU291bmRGaWxlJiMzOTtzIGJ1ZmZlciBzb3VyY2UuXFxuUGxheWJhY2sgbXVzdCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkgKHNlZSBleGFtcGxlKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyZXZlcnNlQnVmZmVyXCIsXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgZHJ1bTtcXG5cXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgZHJ1bSA9IGxvYWRTb3VuZCgnYXNzZXRzL2RydW0ubXAzJyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgZHJ1bS5yZXZlcnNlQnVmZmVyKCk7XFxuICBkcnVtLnBsYXkoKTtcXG59XFxuXFxuIDwvY29kZT5cXG4gPC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE2NTksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2NoZWR1bGUgYW4gZXZlbnQgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHNvdW5kZmlsZVxcbnJlYWNoZXMgdGhlIGVuZCBvZiBhIGJ1ZmZlci4gSWYgdGhlIHNvdW5kZmlsZSBpc1xcbnBsYXlpbmcgdGhyb3VnaCBvbmNlLCB0aGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gaXRcXG5lbmRzLiBJZiBpdCBpcyBsb29waW5nLCBpdCB3aWxsIGJlIGNhbGxlZCB3aGVuXFxuc3RvcCBpcyBjYWxsZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwib25lbmRlZFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRmaWxlIGhhcyBlbmRlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNzEyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbm5lY3RzIHRoZSBvdXRwdXQgb2YgYSBwNXNvdW5kIG9iamVjdCB0byBpbnB1dCBvZiBhbm90aGVyXFxucDUuc291bmQgb2JqZWN0LiBGb3IgZXhhbXBsZSwgeW91IG1heSBjb25uZWN0IGEgcDUuU291bmRGaWxlIHRvIGFuXFxuRkZUIG9yIGFuIEVmZmVjdC4gSWYgbm8gcGFyYW1ldGVyIGlzIGdpdmVuLCBpdCB3aWxsIGNvbm5lY3QgdG9cXG50aGUgbWFzdGVyIG91dHB1dC4gTW9zdCBwNXNvdW5kIG9iamVjdHMgY29ubmVjdCB0byB0aGUgbWFzdGVyXFxub3V0cHV0IHdoZW4gdGhleSBhcmUgY3JlYXRlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjb25uZWN0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkF1ZGlvIG9iamVjdCB0aGF0IGFjY2VwdHMgYW4gaW5wdXQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxNzMzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRpc2Nvbm5lY3RzIHRoZSBvdXRwdXQgb2YgdGhpcyBwNXNvdW5kIG9iamVjdC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkaXNjb25uZWN0XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE3NDEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRGaWxlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDE3NDYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmVzZXQgdGhlIHNvdXJjZSBmb3IgdGhpcyBTb3VuZEZpbGUgdG8gYVxcbm5ldyBwYXRoIChVUkwpLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFBhdGhcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBhdGhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnBhdGggdG8gYXVkaW8gZmlsZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGxiYWNrPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTc1OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXBsYWNlIHRoZSBjdXJyZW50IEF1ZGlvIEJ1ZmZlciB3aXRoIGEgbmV3IEJ1ZmZlci48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRCdWZmZXJcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImJ1ZlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXJyYXkgb2YgRmxvYXQzMiBBcnJheShzKS4gMiBGbG9hdDMyIEFycmF5c1xcbiAgICAgICAgICAgICAgICAgICB3aWxsIGNyZWF0ZSBhIHN0ZXJlbyBzb3VyY2UuIDEgd2lsbCBjcmVhdGVcXG4gICAgICAgICAgICAgICAgICAgYSBtb25vIHNvdXJjZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxODMxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnByb2Nlc3NQZWFrcyByZXR1cm5zIGFuIGFycmF5IG9mIHRpbWVzdGFtcHMgd2hlcmUgaXQgdGhpbmtzIHRoZXJlIGlzIGEgYmVhdC48L3A+XFxuPHA+VGhpcyBpcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBwcm9jZXNzZXMgdGhlIHNvdW5kZmlsZSBpbiBhbiBvZmZsaW5lIGF1ZGlvIGNvbnRleHQsXFxuYW5kIHNlbmRzIHRoZSByZXN1bHRzIHRvIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24uPC9wPlxcbjxwPlRoZSBwcm9jZXNzIGludm9sdmVzIHJ1bm5pbmcgdGhlIHNvdW5kZmlsZSB0aHJvdWdoIGEgbG93cGFzcyBmaWx0ZXIsIGFuZCBmaW5kaW5nIGFsbCBvZiB0aGVcXG5wZWFrcyBhYm92ZSB0aGUgaW5pdGlhbCB0aHJlc2hvbGQuIElmIHRoZSB0b3RhbCBudW1iZXIgb2YgcGVha3MgYXJlIGJlbG93IHRoZSBtaW5pbXVtIG51bWJlciBvZiBwZWFrcyxcXG5pdCBkZWNyZWFzZXMgdGhlIHRocmVzaG9sZCBhbmQgcmUtcnVucyB0aGUgYW5hbHlzaXMgdW50aWwgZWl0aGVyIG1pblBlYWtzIG9yIG1pblRocmVzaG9sZCBhcmUgcmVhY2hlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwcm9jZXNzUGVha3NcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSB0aGlzIGRhdGEgaXMgcmV0dXJuZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaW5pdFRocmVzaG9sZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5pdGlhbCB0aHJlc2hvbGQgZGVmYXVsdHMgdG8gMC45PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm1pblRocmVzaG9sZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bWluaW11bSB0aHJlc2hvbGQgZGVmYXVsdHMgdG8gMC4yMjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJtaW5QZWFrc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bWluaW11bSBudW1iZXIgb2YgcGVha3MgZGVmYXVsdHMgdG8gMjAwPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQXJyYXkgb2YgdGltZXN0YW1wZWQgcGVha3NcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMDIyLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMDMxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNjaGVkdWxlIGV2ZW50cyB0byB0cmlnZ2VyIGV2ZXJ5IHRpbWUgYSBNZWRpYUVsZW1lbnRcXG4oYXVkaW8vdmlkZW8pIHJlYWNoZXMgYSBwbGF5YmFjayBjdWUgcG9pbnQuPC9wPlxcbjxwPkFjY2VwdHMgYSBjYWxsYmFjayBmdW5jdGlvbiwgYSB0aW1lIChpbiBzZWNvbmRzKSBhdCB3aGljaCB0byB0cmlnZ2VyXFxudGhlIGNhbGxiYWNrLCBhbmQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGZvciB0aGUgY2FsbGJhY2suPC9wPlxcbjxwPlRpbWUgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sXFxuYW5kIHBhcmFtIHdpbGwgYmUgdGhlIHNlY29uZCBwYXJhbWV0ZXIuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWRkQ3VlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaW1lIGluIHNlY29uZHMsIHJlbGF0aXZlIHRvIHRoaXMgbWVkaWFcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50JiMzOTtzIHBsYXliYWNrLiBGb3IgZXhhbXBsZSwgdG8gdHJpZ2dlclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGV2ZW50IGV2ZXJ5IHRpbWUgcGxheWJhY2sgcmVhY2hlcyB0d29cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzLCBwYXNzIGluIHRoZSBudW1iZXIgMi4gVGhpcyB3aWxsIGJlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TmFtZSBvZiBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhdCB0aGUgZ2l2ZW4gdGltZS4gVGhlIGNhbGxiYWNrIHdpbGxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlIHRpbWUgYW5kIChvcHRpb25hbGx5KSBwYXJhbSBhcyBpdHNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gcGFyYW1ldGVycy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFuIG9iamVjdCB0byBiZSBwYXNzZWQgYXMgdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kIHBhcmFtZXRlciB0byB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayBmdW5jdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJpZCBJRCBvZiB0aGlzIGN1ZSxcXG4gICAgICAgICAgICAgICAgICAgIHVzZWZ1bCBmb3IgcmVtb3ZlQ3VlKGlkKVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMjU1KTtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgdGV4dCgnY2xpY2sgdG8gcGxheScsIHdpZHRoLzIsIGhlaWdodC8yKTtcXG5cXG4gIG15U291bmQgPSBsb2FkU291bmQoJ2Fzc2V0cy9iZWF0Lm1wMycpO1xcblxcbiAgLy8gc2NoZWR1bGUgY2FsbHMgdG8gY2hhbmdlVGV4dFxcbiAgbXlTb3VuZC5hZGRDdWUoMC41MCwgY2hhbmdlVGV4dCwgXFxcImhlbGxvXFxcIiApO1xcbiAgbXlTb3VuZC5hZGRDdWUoMS4wMCwgY2hhbmdlVGV4dCwgXFxcInA1XFxcIiApO1xcbiAgbXlTb3VuZC5hZGRDdWUoMS41MCwgY2hhbmdlVGV4dCwgXFxcIndoYXRcXFwiICk7XFxuICBteVNvdW5kLmFkZEN1ZSgyLjAwLCBjaGFuZ2VUZXh0LCBcXFwiZG9cXFwiICk7XFxuICBteVNvdW5kLmFkZEN1ZSgyLjUwLCBjaGFuZ2VUZXh0LCBcXFwieW91XFxcIiApO1xcbiAgbXlTb3VuZC5hZGRDdWUoMy4wMCwgY2hhbmdlVGV4dCwgXFxcIndhbnRcXFwiICk7XFxuICBteVNvdW5kLmFkZEN1ZSg0LjAwLCBjaGFuZ2VUZXh0LCBcXFwidG9cXFwiICk7XFxuICBteVNvdW5kLmFkZEN1ZSg1LjAwLCBjaGFuZ2VUZXh0LCBcXFwibWFrZVxcXCIgKTtcXG4gIG15U291bmQuYWRkQ3VlKDYuMDAsIGNoYW5nZVRleHQsIFxcXCI/XFxcIiApO1xcbn1cXG5cXG5mdW5jdGlvbiBjaGFuZ2VUZXh0KHZhbCkge1xcbiAgYmFja2dyb3VuZCgwKTtcXG4gIHRleHQodmFsLCB3aWR0aC8yLCBoZWlnaHQvMik7XFxufVxcblxcbmZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcXG4gIGlmIChtb3VzZVggPiAwICYmIG1vdXNlWCA8IHdpZHRoICYmIG1vdXNlWSA+IDAgJiYgbW91c2VZIDwgaGVpZ2h0KSB7XFxuICAgIGlmIChteVNvdW5kLmlzUGxheWluZygpICkge1xcbiAgICAgIG15U291bmQuc3RvcCgpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIG15U291bmQucGxheSgpO1xcbiAgICB9XFxuICB9XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZEZpbGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjEwNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZW1vdmUgYSBjYWxsYmFjayBiYXNlZCBvbiBpdHMgSUQuIFRoZSBJRCBpcyByZXR1cm5lZCBieSB0aGVcXG5hZGRDdWUgbWV0aG9kLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlbW92ZUN1ZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaWRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPklEIG9mIHRoZSBjdWUsIGFzIHJldHVybmVkIGJ5IGFkZEN1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMTI0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlbW92ZSBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhZCBvcmlnaW5hbGx5IGJlZW4gc2NoZWR1bGVkXFxudmlhIHRoZSBhZGRDdWUgbWV0aG9kLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNsZWFyQ3Vlc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kRmlsZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMjMyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbm5lY3RzIHRvIHRoZSBwNXNvdW5kIGluc3RhbmNlIChtYXN0ZXIgb3V0cHV0KSBieSBkZWZhdWx0Llxcbk9wdGlvbmFsbHksIHlvdSBjYW4gcGFzcyBpbiBhIHNwZWNpZmljIHNvdXJjZSAoaS5lLiBhIHNvdW5kZmlsZSkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0SW5wdXRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNuZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c2V0IHRoZSBzb3VuZCBzb3VyY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsLCBkZWZhdWx0cyB0b1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXIgb3V0cHV0KTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU291bmRPYmplY3R8dW5kZWZpbmVkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzbW9vdGhpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmEgcmFuZ2UgYmV0d2VlbiAwLjAgYW5kIDEuMFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc21vb3RoIGFtcGxpdHVkZSByZWFkaW5nczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyfHVuZGVmaW5lZFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuZnVuY3Rpb24gcHJlbG9hZCgpe1xcbiAgc291bmQxID0gbG9hZFNvdW5kKCdhc3NldHMvYmVhdC5tcDMnKTtcXG4gIHNvdW5kMiA9IGxvYWRTb3VuZCgnYXNzZXRzL2RydW0ubXAzJyk7XFxufVxcbmZ1bmN0aW9uIHNldHVwKCl7XFxuICBhbXBsaXR1ZGUgPSBuZXcgcDUuQW1wbGl0dWRlKCk7XFxuICBzb3VuZDEucGxheSgpO1xcbiAgc291bmQyLnBsYXkoKTtcXG4gIGFtcGxpdHVkZS5zZXRJbnB1dChzb3VuZDIpO1xcbn1cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgwKTtcXG4gIGZpbGwoMjU1KTtcXG4gIHZhciBsZXZlbCA9IGFtcGxpdHVkZS5nZXRMZXZlbCgpO1xcbiAgdmFyIHNpemUgPSBtYXAobGV2ZWwsIDAsIDEsIDAsIDIwMCk7XFxuICBlbGxpcHNlKHdpZHRoLzIsIGhlaWdodC8yLCBzaXplLCBzaXplKTtcXG59XFxuZnVuY3Rpb24gbW91c2VDbGlja2VkKCl7XFxuICBzb3VuZDEuc3RvcCgpO1xcbiAgc291bmQyLnN0b3AoKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkFtcGxpdHVkZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMzM3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgYSBzaW5nbGUgQW1wbGl0dWRlIHJlYWRpbmcgYXQgdGhlIG1vbWVudCBpdCBpcyBjYWxsZWQuXFxuRm9yIGNvbnRpbnVvdXMgcmVhZGluZ3MsIHJ1biBpbiB0aGUgZHJhdyBsb29wLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldExldmVsXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjaGFubmVsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5PcHRpb25hbGx5IHJldHVybiBvbmx5IGNoYW5uZWwgMCAobGVmdCkgb3IgMSAocmlnaHQpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQW1wbGl0dWRlIGFzIGEgbnVtYmVyIGJldHdlZW4gMC4wIGFuZCAxLjBcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbmZ1bmN0aW9uIHByZWxvYWQoKXtcXG4gIHNvdW5kID0gbG9hZFNvdW5kKCdhc3NldHMvYmVhdC5tcDMnKTtcXG59XFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBhbXBsaXR1ZGUgPSBuZXcgcDUuQW1wbGl0dWRlKCk7XFxuICBzb3VuZC5wbGF5KCk7XFxufVxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgZmlsbCgyNTUpO1xcbiAgdmFyIGxldmVsID0gYW1wbGl0dWRlLmdldExldmVsKCk7XFxuICB2YXIgc2l6ZSA9IG1hcChsZXZlbCwgMCwgMSwgMCwgMjAwKTtcXG4gIGVsbGlwc2Uod2lkdGgvMiwgaGVpZ2h0LzIsIHNpemUsIHNpemUpO1xcbn1cXG5mdW5jdGlvbiBtb3VzZUNsaWNrZWQoKXtcXG4gIHNvdW5kLnN0b3AoKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkFtcGxpdHVkZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyMzc4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRldGVybWluZXMgd2hldGhlciB0aGUgcmVzdWx0cyBvZiBBbXBsaXR1ZGUucHJvY2VzcygpIHdpbGwgYmVcXG5Ob3JtYWxpemVkLiBUbyBub3JtYWxpemUsIEFtcGxpdHVkZSBmaW5kcyB0aGUgZGlmZmVyZW5jZSB0aGVcXG5sb3VkZXN0IHJlYWRpbmcgaXQgaGFzIHByb2Nlc3NlZCBhbmQgdGhlIG1heGltdW0gYW1wbGl0dWRlIG9mXFxuMS4wLiBBbXBsaXR1ZGUgYWRkcyB0aGlzIGRpZmZlcmVuY2UgdG8gYWxsIHZhbHVlcyB0byBwcm9kdWNlXFxucmVzdWx0cyB0aGF0IHdpbGwgcmVsaWFibHkgbWFwIGJldHdlZW4gMC4wIGFuZCAxLjAuIEhvd2V2ZXIsXFxuaWYgYSBsb3VkZXIgbW9tZW50IG9jY3VycywgdGhlIGFtb3VudCB0aGF0IE5vcm1hbGl6ZSBhZGRzIHRvXFxuYWxsIHRoZSB2YWx1ZXMgd2lsbCBjaGFuZ2UuIEFjY2VwdHMgYW4gb3B0aW9uYWwgYm9vbGVhbiBwYXJhbWV0ZXJcXG4odHJ1ZSBvciBmYWxzZSkuIE5vcm1hbGl6aW5nIGlzIG9mZiBieSBkZWZhdWx0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRvZ2dsZU5vcm1hbGl6ZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c2V0IG5vcm1hbGl6ZSB0byB0cnVlICgxKSBvciBmYWxzZSAoMCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5BbXBsaXR1ZGVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjM5OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TbW9vdGggQW1wbGl0dWRlIGFuYWx5c2lzIGJ5IGF2ZXJhZ2luZyB3aXRoIHRoZSBsYXN0IGFuYWx5c2lzXFxuZnJhbWUuIE9mZiBieSBkZWZhdWx0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNtb290aFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zbW9vdGhpbmcgZnJvbSAwLjAgJmx0Oz0gMTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkFtcGxpdHVkZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNTY3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgaW5wdXQgc291cmNlIGZvciB0aGUgRkZUIGFuYWx5c2lzLiBJZiBubyBzb3VyY2UgaXNcXG5wcm92aWRlZCwgRkZUIHdpbGwgYW5hbHl6ZSBhbGwgc291bmQgaW4gdGhlIHNrZXRjaC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRJbnB1dFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5zb3VuZCBvYmplY3QgKG9yIHdlYiBhdWRpbyBBUEkgc291cmNlIG5vZGUpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5GRlRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjU4NixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIGFuIGFycmF5IG9mIGFtcGxpdHVkZSB2YWx1ZXMgKGJldHdlZW4gLTEuMCBhbmQgKzEuMCkgdGhhdCByZXByZXNlbnRcXG5hIHNuYXBzaG90IG9mIGFtcGxpdHVkZSByZWFkaW5ncyBpbiBhIHNpbmdsZSBidWZmZXIuIExlbmd0aCB3aWxsIGJlXFxuZXF1YWwgdG8gYmlucyAoZGVmYXVsdHMgdG8gMTAyNCkuIENhbiBiZSB1c2VkIHRvIGRyYXcgdGhlIHdhdmVmb3JtXFxub2YgYSBzb3VuZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ3YXZlZm9ybVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYmluc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TXVzdCBiZSBhIHBvd2VyIG9mIHR3byBiZXR3ZWVuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAxNiBhbmQgMTAyNC4gRGVmYXVsdHMgdG8gMTAyNC48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicHJlY2lzaW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5JZiBhbnkgdmFsdWUgaXMgcHJvdmlkZWQsIHdpbGwgcmV0dXJuIHJlc3VsdHNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYSBGbG9hdDMyIEFycmF5IHdoaWNoIGlzIG1vcmUgcHJlY2lzZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIGEgcmVndWxhciBhcnJheS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBcnJheSAgICBBcnJheSBvZiBhbXBsaXR1ZGUgdmFsdWVzICgtMSB0byAxKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlciB0aW1lLiBBcnJheSBsZW5ndGggPSBiaW5zLlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI2MjksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmV0dXJucyBhbiBhcnJheSBvZiBhbXBsaXR1ZGUgdmFsdWVzIChiZXR3ZWVuIDAgYW5kIDI1NSlcXG5hY3Jvc3MgdGhlIGZyZXF1ZW5jeSBzcGVjdHJ1bS4gTGVuZ3RoIGlzIGVxdWFsIHRvIEZGVCBiaW5zXFxuKDEwMjQgYnkgZGVmYXVsdCkuIFRoZSBhcnJheSBpbmRpY2VzIGNvcnJlc3BvbmQgdG8gZnJlcXVlbmNpZXNcXG4oaS5lLiBwaXRjaGVzKSwgZnJvbSB0aGUgbG93ZXN0IHRvIHRoZSBoaWdoZXN0IHRoYXQgaHVtYW5zIGNhblxcbmhlYXIuIEVhY2ggdmFsdWUgcmVwcmVzZW50cyBhbXBsaXR1ZGUgYXQgdGhhdCBzbGljZSBvZiB0aGVcXG5mcmVxdWVuY3kgc3BlY3RydW0uIE11c3QgYmUgY2FsbGVkIHByaW9yIHRvIHVzaW5nXFxuPGNvZGU+Z2V0RW5lcmd5KCk8L2NvZGU+LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFuYWx5emVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImJpbnNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk11c3QgYmUgYSBwb3dlciBvZiB0d28gYmV0d2VlblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2IGFuZCAxMDI0LiBEZWZhdWx0cyB0byAxMDI0LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzY2FsZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SWYgJnF1b3Q7ZEIsJnF1b3Q7IHJldHVybnMgZGVjaWJlbFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1lYXN1cmVtZW50cyBiZXR3ZWVuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE0MCBhbmQgMCAobWF4KS5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgcmV0dXJucyBpbnRlZ2VycyBmcm9tIDAtMjU1LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInNwZWN0cnVtICAgIEFycmF5IG9mIGVuZXJneSAoYW1wbGl0dWRlL3ZvbHVtZSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGFjcm9zcyB0aGUgZnJlcXVlbmN5IHNwZWN0cnVtLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb3dlc3QgZW5lcmd5IChzaWxlbmNlKSA9IDAsIGhpZ2hlc3RcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgaXMgMjU1LlwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgb3NjO1xcbnZhciBmZnQ7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKXtcXG4gIGNyZWF0ZUNhbnZhcygxMDAsMTAwKTtcXG4gIG9zYyA9IG5ldyBwNS5Pc2NpbGxhdG9yKCk7XFxuICBvc2MuYW1wKDApO1xcbiAgb3NjLnN0YXJ0KCk7XFxuICBmZnQgPSBuZXcgcDUuRkZUKCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKXtcXG4gIGJhY2tncm91bmQoMCk7XFxuXFxuICB2YXIgZnJlcSA9IG1hcChtb3VzZVgsIDAsIDgwMCwgMjAsIDE1MDAwKTtcXG4gIGZyZXEgPSBjb25zdHJhaW4oZnJlcSwgMSwgMjAwMDApO1xcbiAgb3NjLmZyZXEoZnJlcSk7XFxuXFxuICB2YXIgc3BlY3RydW0gPSBmZnQuYW5hbHl6ZSgpO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMCwyNTUsMCk7IC8vIHNwZWN0cnVtIGlzIGdyZWVuXFxuICBmb3IgKHZhciBpID0gMDsgaTwgc3BlY3RydW0ubGVuZ3RoOyBpKyspe1xcbiAgICB2YXIgeCA9IG1hcChpLCAwLCBzcGVjdHJ1bS5sZW5ndGgsIDAsIHdpZHRoKTtcXG4gICAgdmFyIGggPSAtaGVpZ2h0ICsgbWFwKHNwZWN0cnVtW2ldLCAwLCAyNTUsIGhlaWdodCwgMCk7XFxuICAgIHJlY3QoeCwgaGVpZ2h0LCB3aWR0aCAvIHNwZWN0cnVtLmxlbmd0aCwgaCApO1xcbiAgfVxcblxcbiAgc3Ryb2tlKDI1NSk7XFxuICB0ZXh0KCdGcmVxOiAnICsgcm91bmQoZnJlcSkrJ0h6JywgMTAsIDEwKTtcXG5cXG4gIGlzTW91c2VPdmVyQ2FudmFzKCk7XFxufVxcblxcbi8vIG9ubHkgcGxheSBzb3VuZCB3aGVuIG1vdXNlIGlzIG92ZXIgY2FudmFzXFxuZnVuY3Rpb24gaXNNb3VzZU92ZXJDYW52YXMoKSB7XFxuICB2YXIgbVggPSBtb3VzZVgsIG1ZID0gbW91c2VZO1xcbiAgaWYgKG1YID4gMCAmJiBtWCA8IHdpZHRoICYmIG1ZIDwgaGVpZ2h0ICYmIG1ZID4gMCkge1xcbiAgICBvc2MuYW1wKDAuNSwgMC4yKTtcXG4gIH0gZWxzZSB7XFxuICAgIG9zYy5hbXAoMCwgMC4yKTtcXG4gIH1cXG59XFxuPC9jb2RlPjwvZGl2PlxcblxcblwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkZGVFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyNzIxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgdGhlIGFtb3VudCBvZiBlbmVyZ3kgKHZvbHVtZSkgYXQgYSBzcGVjaWZpY1xcbjxhIGhyZWY9XFxcImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0F1ZGlvX2ZyZXF1ZW5jeVxcXCIgdGFyZ2V0PVxcXCJfYmxhbmtcXFwiPlxcbmZyZXF1ZW5jeTwvYT4sIG9yIHRoZSBhdmVyYWdlIGFtb3VudCBvZiBlbmVyZ3kgYmV0d2VlbiB0d29cXG5mcmVxdWVuY2llcy4gQWNjZXB0cyBOdW1iZXIocykgY29ycmVzcG9uZGluZ1xcbnRvIGZyZXF1ZW5jeSAoaW4gSHopLCBvciBhIFN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHByZWRlZmluZWRcXG5mcmVxdWVuY3kgcmFuZ2VzICgmcXVvdDtiYXNzJnF1b3Q7LCAmcXVvdDtsb3dNaWQmcXVvdDssICZxdW90O21pZCZxdW90OywgJnF1b3Q7aGlnaE1pZCZxdW90OywgJnF1b3Q7dHJlYmxlJnF1b3Q7KS5cXG5SZXR1cm5zIGEgcmFuZ2UgYmV0d2VlbiAwIChubyBlbmVyZ3kvdm9sdW1lIGF0IHRoYXQgZnJlcXVlbmN5KSBhbmRcXG4yNTUgKG1heGltdW0gZW5lcmd5KS5cXG48ZW0+Tk9URTogYW5hbHl6ZSgpIG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGdldEVuZXJneSgpLiBBbmFseXplKClcXG50ZWxscyB0aGUgRkZUIHRvIGFuYWx5emUgZnJlcXVlbmN5IGRhdGEsIGFuZCBnZXRFbmVyZ3koKSB1c2VzXFxudGhlIHJlc3VsdHMgZGV0ZXJtaW5lIHRoZSB2YWx1ZSBhdCBhIHNwZWNpZmljIGZyZXF1ZW5jeSBvclxcbnJhbmdlIG9mIGZyZXF1ZW5jaWVzLjwvZW0+PC9wPjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldEVuZXJneVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnJlcXVlbmN5MVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+V2lsbCByZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmVyZ3kgYXQgdGhpcyBmcmVxdWVuY3kuIEFsdGVybmF0ZWx5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJpbmdzICZxdW90O2Jhc3MmcXVvdDssICZxdW90O2xvd01pZCZxdW90OyAmcXVvdDttaWQmcXVvdDssXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3Q7aGlnaE1pZCZxdW90OywgYW5kICZxdW90O3RyZWJsZSZxdW90OyB3aWxsIHJldHVyblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWQgZnJlcXVlbmN5IHJhbmdlcy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcnxTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmcmVxdWVuY3kyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5JZiBhIHNlY29uZCBmcmVxdWVuY3kgaXMgZ2l2ZW4sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCByZXR1cm4gYXZlcmFnZSBhbW91bnQgb2ZcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmVyZ3kgdGhhdCBleGlzdHMgYmV0d2VlbiB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gZnJlcXVlbmNpZXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiRW5lcmd5ICAgRW5lcmd5ICh2b2x1bWUvYW1wbGl0dWRlKSBmcm9tXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgYW5kIDI1NS5cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5GRlRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjgwMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIHRoZVxcbjxhIGhyZWY9XFxcImh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3BlY3RyYWxfY2VudHJvaWRcXFwiIHRhcmdldD1cXFwiX2JsYW5rXFxcIj5cXG5zcGVjdHJhbCBjZW50cm9pZDwvYT4gb2YgdGhlIGlucHV0IHNpZ25hbC5cXG48ZW0+Tk9URTogYW5hbHl6ZSgpIG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGdldENlbnRyb2lkKCkuIEFuYWx5emUoKVxcbnRlbGxzIHRoZSBGRlQgdG8gYW5hbHl6ZSBmcmVxdWVuY3kgZGF0YSwgYW5kIGdldENlbnRyb2lkKCkgdXNlc1xcbnRoZSByZXN1bHRzIGRldGVybWluZSB0aGUgc3BlY3RyYWwgY2VudHJvaWQuPC9lbT48L3A+PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0Q2VudHJvaWRcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiU3BlY3RyYWwgQ2VudHJvaWQgRnJlcXVlbmN5ICAgRnJlcXVlbmN5IG9mIHRoZSBzcGVjdHJhbCBjZW50cm9pZCBpbiBIei5cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcblxcblxcbmZ1bmN0aW9uIHNldHVwKCl7XFxuY252ID0gY3JlYXRlQ2FudmFzKDgwMCw0MDApO1xcbnNvdW5kID0gbmV3IHA1LkF1ZGlvSW4oKTtcXG5zb3VuZC5zdGFydCgpO1xcbmZmdCA9IG5ldyBwNS5GRlQoKTtcXG5zb3VuZC5jb25uZWN0KGZmdCk7XFxufVxcblxcblxcbmZ1bmN0aW9uIGRyYXcoKXtcXG5cXG52YXIgY2VudHJvaWRwbG90ID0gMC4wO1xcbnZhciBzcGVjdHJhbENlbnRyb2lkID0gMDtcXG5cXG5cXG5iYWNrZ3JvdW5kKDApO1xcbnN0cm9rZSgwLDI1NSwwKTtcXG52YXIgc3BlY3RydW0gPSBmZnQuYW5hbHl6ZSgpO1xcbmZpbGwoMCwyNTUsMCk7IC8vIHNwZWN0cnVtIGlzIGdyZWVuXFxuXFxuLy9kcmF3IHRoZSBzcGVjdHJ1bVxcblxcbmZvciAodmFyIGkgPSAwOyBpPCBzcGVjdHJ1bS5sZW5ndGg7IGkrKyl7XFxuICB2YXIgeCA9IG1hcChsb2coaSksIDAsIGxvZyhzcGVjdHJ1bS5sZW5ndGgpLCAwLCB3aWR0aCk7XFxuICB2YXIgaCA9IG1hcChzcGVjdHJ1bVtpXSwgMCwgMjU1LCAwLCBoZWlnaHQpO1xcbiAgdmFyIHJlY3RhbmdsZV93aWR0aCA9IChsb2coaSsxKS1sb2coaSkpKih3aWR0aC9sb2coc3BlY3RydW0ubGVuZ3RoKSk7XFxuICByZWN0KHgsIGhlaWdodCwgcmVjdGFuZ2xlX3dpZHRoLCAtaCApXFxufVxcblxcbnZhciBueXF1aXN0ID0gMjIwNTA7XFxuXFxuLy8gZ2V0IHRoZSBjZW50cm9pZFxcbnNwZWN0cmFsQ2VudHJvaWQgPSBmZnQuZ2V0Q2VudHJvaWQoKTtcXG5cXG4vLyB0aGUgbWVhbl9mcmVxX2luZGV4IGNhbGN1bGF0aW9uIGlzIGZvciB0aGUgZGlzcGxheS5cXG52YXIgbWVhbl9mcmVxX2luZGV4ID0gc3BlY3RyYWxDZW50cm9pZC8obnlxdWlzdC9zcGVjdHJ1bS5sZW5ndGgpO1xcblxcbmNlbnRyb2lkcGxvdCA9IG1hcChsb2cobWVhbl9mcmVxX2luZGV4KSwgMCwgbG9nKHNwZWN0cnVtLmxlbmd0aCksIDAsIHdpZHRoKTtcXG5cXG5cXG5zdHJva2UoMjU1LDAsMCk7IC8vIHRoZSBsaW5lIHNob3dpbmcgd2hlcmUgdGhlIGNlbnRyb2lkIGlzIHdpbGwgYmUgcmVkXFxuXFxucmVjdChjZW50cm9pZHBsb3QsIDAsIHdpZHRoIC8gc3BlY3RydW0ubGVuZ3RoLCBoZWlnaHQpXFxubm9TdHJva2UoKTtcXG5maWxsKDI1NSwyNTUsMjU1KTsgIC8vIHRleHQgaXMgd2hpdGVcXG50ZXh0U2l6ZSg0MCk7XFxudGV4dChcXFwiY2VudHJvaWQ6IFxcXCIrcm91bmQoc3BlY3RyYWxDZW50cm9pZCkrXFxcIiBIelxcXCIsIDEwLCA0MCk7XFxufVxcbiA8L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDI4ODQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U21vb3RoIEZGVCBhbmFseXNpcyBieSBhdmVyYWdpbmcgd2l0aCB0aGUgbGFzdCBhbmFseXNpcyBmcmFtZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzbW9vdGhcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNtb290aGluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+MC4wICZsdDsgc21vb3RoaW5nICZsdDsgMS4wLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gMC44LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkZGVFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyOTA0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgYW4gYXJyYXkgb2YgYXZlcmFnZSBhbXBsaXR1ZGUgdmFsdWVzIGZvciBhIGdpdmVuIG51bWJlclxcbm9mIGZyZXF1ZW5jeSBiYW5kcyBzcGxpdCBlcXVhbGx5LiBOIGRlZmF1bHRzIHRvIDE2LlxcbjxlbT5OT1RFOiBhbmFseXplKCkgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gbGluQXZlcmFnZXMoKS4gQW5hbHl6ZSgpXFxudGVsbHMgdGhlIEZGVCB0byBhbmFseXplIGZyZXF1ZW5jeSBkYXRhLCBhbmQgbGluQXZlcmFnZXMoKSB1c2VzXFxudGhlIHJlc3VsdHMgdG8gZ3JvdXAgdGhlbSBpbnRvIGEgc21hbGxlciBzZXQgb2YgYXZlcmFnZXMuPC9lbT48L3A+PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibGluQXZlcmFnZXNcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIk5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk51bWJlciBvZiByZXR1cm5lZCBmcmVxdWVuY3kgZ3JvdXBzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpbmVhckF2ZXJhZ2VzICAgQXJyYXkgb2YgYXZlcmFnZSBhbXBsaXR1ZGUgdmFsdWVzIGZvciBlYWNoIGdyb3VwXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5GRlRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMjkzNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm5zIGFuIGFycmF5IG9mIGF2ZXJhZ2UgYW1wbGl0dWRlIHZhbHVlcyBvZiB0aGUgc3BlY3RydW0sIGZvciBhIGdpdmVuXFxuc2V0IG9mIDxhIGhyZWY9XFxcImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09jdGF2ZV9iYW5kXFxcIiB0YXJnZXQ9XFxcIl9ibGFua1xcXCI+XFxuT2N0YXZlIEJhbmRzPC9hPlxcbjxlbT5OT1RFOiBhbmFseXplKCkgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gbG9nQXZlcmFnZXMoKS4gQW5hbHl6ZSgpXFxudGVsbHMgdGhlIEZGVCB0byBhbmFseXplIGZyZXF1ZW5jeSBkYXRhLCBhbmQgbG9nQXZlcmFnZXMoKSB1c2VzXFxudGhlIHJlc3VsdHMgdG8gZ3JvdXAgdGhlbSBpbnRvIGEgc21hbGxlciBzZXQgb2YgYXZlcmFnZXMuPC9lbT48L3A+PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibG9nQXZlcmFnZXNcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm9jdGF2ZUJhbmRzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BcnJheSBvZiBPY3RhdmUgQmFuZHMgb2JqZWN0cyBmb3IgZ3JvdXBpbmc8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsb2dBdmVyYWdlcyAgICBBcnJheSBvZiBhdmVyYWdlIGFtcGxpdHVkZSB2YWx1ZXMgZm9yIGVhY2ggZ3JvdXBcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkZGVFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAyOTY0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNhbGN1bGF0ZXMgYW5kIFJldHVybnMgdGhlIDEvTlxcbjxhIGhyZWY9XFxcImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09jdGF2ZV9iYW5kXFxcIiB0YXJnZXQ9XFxcIl9ibGFua1xcXCI+T2N0YXZlIEJhbmRzPC9hPlxcbk4gZGVmYXVsdHMgdG8gMyBhbmQgbWluaW11bSBjZW50cmFsIGZyZXF1ZW5jeSB0byAxNS42MjVIei5cXG4oMS8zIE9jdGF2ZSBCYW5kcyB+PSAzMSBGcmVxdWVuY3kgQmFuZHMpXFxuU2V0dGluZyBmQ3RyMCB0byBhIGNlbnRyYWwgdmFsdWUgb2YgYSBoaWdoZXIgb2N0YXZlIHdpbGwgaWdub3JlIHRoZSBsb3dlciBiYW5kc1xcbmFuZCBwcm9kdWNlIGxlc3MgZnJlcXVlbmN5IGdyb3Vwcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRPY3RhdmVCYW5kc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiTlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3BlY2lmaWVzIHRoZSAxL04gdHlwZSBvZiBnZW5lcmF0ZWQgb2N0YXZlIGJhbmRzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmQ3RyMFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TWluaW11bSBjZW50cmFsIGZyZXF1ZW5jeSBmb3IgdGhlIGxvd2VzdCBiYW5kPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9jdGF2ZUJhbmRzICAgQXJyYXkgb2Ygb2N0YXZlIGJhbmQgb2JqZWN0cyB3aXRoIHRoZWlyIGJvdW5kc1wiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMwMjIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDMzOTksXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM0MjAsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM0NzksXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM3OTcsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDM5NjksXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQxMjcsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQxNjgsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQyMzgsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ0MjYsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ0ODMsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ2NTEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ2OTksXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ3MzAsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ3NTEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ3NzEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRkZUXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ4NzMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RmFkZSB0byB2YWx1ZSwgZm9yIHNtb290aCB0cmFuc2l0aW9uczwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImZhZGVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5WYWx1ZSB0byBzZXQgdGhpcyBzaWduYWw8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNlY29uZHNGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5MZW5ndGggb2YgZmFkZSwgaW4gc2Vjb25kcyBmcm9tIG5vdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU2lnbmFsXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ4ODQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29ubmVjdCBhIHA1LnNvdW5kIG9iamVjdCBvciBXZWIgQXVkaW8gbm9kZSB0byB0aGlzXFxucDUuU2lnbmFsIHNvIHRoYXQgaXRzIGFtcGxpdHVkZSB2YWx1ZXMgY2FuIGJlIHNjYWxlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRJbnB1dFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaW5wdXRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU2lnbmFsXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ4OTgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QWRkIGEgY29uc3RhbnQgdmFsdWUgdG8gdGhpcyBhdWRpbyBzaWduYWwsXFxuYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIGF1ZGlvIHNpZ25hbC4gRG9lc1xcbm5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwsXFxuaW5zdGVhZCBpdCByZXR1cm5zIGEgbmV3IHA1LlNpZ25hbEFkZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhZGRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuU2lnbmFsXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU2lnbmFsXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDQ5MTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TXVsdGlwbHkgdGhpcyBzaWduYWwgYnkgYSBjb25zdGFudCB2YWx1ZSxcXG5hbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgYXVkaW8gc2lnbmFsLiBEb2VzXFxubm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCxcXG5pbnN0ZWFkIGl0IHJldHVybnMgYSBuZXcgcDUuU2lnbmFsTXVsdC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtdWx0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRvIG11bHRpcGx5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlNpZ25hbFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNpZ25hbFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA0OTM2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNjYWxlIHRoaXMgc2lnbmFsIHZhbHVlIHRvIGEgZ2l2ZW4gcmFuZ2UsXFxuYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGFuIGF1ZGlvIHNpZ25hbC4gRG9lc1xcbm5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwsXFxuaW5zdGVhZCBpdCByZXR1cm5zIGEgbmV3IHA1LlNpZ25hbFNjYWxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNjYWxlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRvIG11bHRpcGx5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJpbk1pblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5wdXQgcmFuZ2UgbWludW11bTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaW5NYXhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmlucHV0IHJhbmdlIG1heGltdW08L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm91dE1pblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5wdXQgcmFuZ2UgbWludW11bTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwib3V0TWF4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5pbnB1dCByYW5nZSBtYXhpbXVtPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlNpZ25hbFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNpZ25hbFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MDcwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0YXJ0IGFuIG9zY2lsbGF0b3IuIEFjY2VwdHMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRvXFxuZGV0ZXJtaW5lIGhvdyBsb25nIChpbiBzZWNvbmRzIGZyb20gbm93KSB1bnRpbCB0aGVcXG5vc2NpbGxhdG9yIHN0YXJ0cy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzdGFydFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c3RhcnRUaW1lIGluIHNlY29uZHMgZnJvbSBub3cuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZyZXF1ZW5jeVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnJlcXVlbmN5IGluIEh6LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuT3NjaWxsYXRvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MTEwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0b3AgYW4gb3NjaWxsYXRvci4gQWNjZXB0cyBhbiBvcHRpb25hbCBwYXJhbWV0ZXJcXG50byBkZXRlcm1pbmUgaG93IGxvbmcgKGluIHNlY29uZHMgZnJvbSBub3cpIHVudGlsIHRoZVxcbm9zY2lsbGF0b3Igc3RvcHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RvcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2Vjb25kc0Zyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRpbWUsIGluIHNlY29uZHMgZnJvbSBub3cuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuT3NjaWxsYXRvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MTI2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgYW1wbGl0dWRlIGJldHdlZW4gMCBhbmQgMS4wLiBPciwgcGFzcyBpbiBhbiBvYmplY3RcXG5zdWNoIGFzIGFuIG9zY2lsbGF0b3IgdG8gbW9kdWxhdGUgYW1wbGl0dWRlIHdpdGggYW4gYXVkaW8gc2lnbmFsLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFtcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidm9sXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5iZXR3ZWVuIDAgYW5kIDEuMFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhIG1vZHVsYXRpbmcgc2lnbmFsL29zY2lsbGF0b3I8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcnxPYmplY3RcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyYW1wVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y3JlYXRlIGEgZmFkZSB0aGF0IGxhc3RzIHJhbXBUaW1lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zY2hlZHVsZSB0aGlzIGV2ZW50IHRvIGhhcHBlblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgZnJvbSBub3c8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJnYWluICBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyB0aGUgV2ViIEF1ZGlvIEFQSVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtIHRoYXQgY29udHJvbHNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBvc2NpbGxhdG9yJ3NcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbi9hbXBsaXR1ZGUvdm9sdW1lKVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkF1ZGlvUGFyYW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Pc2NpbGxhdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUxNjEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IGZyZXF1ZW5jeSBvZiBhbiBvc2NpbGxhdG9yIHRvIGEgdmFsdWUuIE9yLCBwYXNzIGluIGFuIG9iamVjdFxcbnN1Y2ggYXMgYW4gb3NjaWxsYXRvciB0byBtb2R1bGF0ZSB0aGUgZnJlcXVlbmN5IHdpdGggYW4gYXVkaW8gc2lnbmFsLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImZyZXFcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkZyZXF1ZW5jeVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RnJlcXVlbmN5IGluIEh6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBtb2R1bGF0aW5nIHNpZ25hbC9vc2NpbGxhdG9yPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8T2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFtcFRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJhbXAgdGltZSAoaW4gc2Vjb25kcyk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZUZyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNjaGVkdWxlIHRoaXMgZXZlbnQgdG8gaGFwcGVuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgeCBzZWNvbmRzIGZyb20gbm93PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiRnJlcXVlbmN5IElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyB0aGUgV2ViIEF1ZGlvIEFQSVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbSB0aGF0IGNvbnRyb2xzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG9zY2lsbGF0b3IncyBmcmVxdWVuY3lcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBdWRpb1BhcmFtXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgb3NjID0gbmV3IHA1Lk9zY2lsbGF0b3IoMzAwKTtcXG5vc2Muc3RhcnQoKTtcXG5vc2MuZnJlcSg0MCwgMTApO1xcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Pc2NpbGxhdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUyMjAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHR5cGUgdG8gJiMzOTtzaW5lJiMzOTssICYjMzk7dHJpYW5nbGUmIzM5OywgJiMzOTtzYXd0b290aCYjMzk7IG9yICYjMzk7c3F1YXJlJiMzOTsuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0VHlwZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+JiMzOTtzaW5lJiMzOTssICYjMzk7dHJpYW5nbGUmIzM5OywgJiMzOTtzYXd0b290aCYjMzk7IG9yICYjMzk7c3F1YXJlJiMzOTsuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuT3NjaWxsYXRvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MjMyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbm5lY3QgdG8gYSBwNS5zb3VuZCAvIFdlYiBBdWRpbyBvYmplY3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29ubmVjdFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QSBwNS5zb3VuZCBvciBXZWIgQXVkaW8gb2JqZWN0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuT3NjaWxsYXRvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MjQ5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRpc2Nvbm5lY3QgYWxsIG91dHB1dHM8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkaXNjb25uZWN0XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuT3NjaWxsYXRvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1MjYwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlBhbiBiZXR3ZWVuIExlZnQgKC0xKSBhbmQgUmlnaHQgKDEpPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicGFuXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwYW5uaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OdW1iZXIgYmV0d2VlbiAtMSBhbmQgMTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZUZyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNjaGVkdWxlIHRoaXMgZXZlbnQgdG8gaGFwcGVuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyBmcm9tIG5vdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk9zY2lsbGF0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTI5MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIHBoYXNlIG9mIGFuIG9zY2lsbGF0b3IgYmV0d2VlbiAwLjAgYW5kIDEuMC5cXG5JbiB0aGlzIGltcGxlbWVudGF0aW9uLCBwaGFzZSBpcyBhIGRlbGF5IHRpbWVcXG5iYXNlZCBvbiB0aGUgb3NjaWxsYXRvciYjMzk7cyBjdXJyZW50IGZyZXF1ZW5jeS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwaGFzZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGhhc2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZsb2F0IGJldHdlZW4gMC4wIGFuZCAxLjA8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Pc2NpbGxhdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUzNDYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QWRkIGEgdmFsdWUgdG8gdGhlIHA1Lk9zY2lsbGF0b3ImIzM5O3Mgb3V0cHV0IGFtcGxpdHVkZSxcXG5hbmQgcmV0dXJuIHRoZSBvc2NpbGxhdG9yLiBDYWxsaW5nIHRoaXMgbWV0aG9kIGFnYWluXFxud2lsbCBvdmVycmlkZSB0aGUgaW5pdGlhbCBhZGQoKSB3aXRoIGEgbmV3IHZhbHVlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFkZFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db25zdGFudCBudW1iZXIgdG8gYWRkPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk9zY2lsbGF0b3IgUmV0dXJucyB0aGlzIG9zY2lsbGF0b3JcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc2NhbGVkIG91dHB1dFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1Lk9zY2lsbGF0b3JcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Pc2NpbGxhdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDUzNjMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TXVsdGlwbHkgdGhlIHA1Lk9zY2lsbGF0b3ImIzM5O3Mgb3V0cHV0IGFtcGxpdHVkZVxcbmJ5IGEgZml4ZWQgdmFsdWUgKGkuZS4gdHVybiBpdCB1cCEpLiBDYWxsaW5nIHRoaXMgbWV0aG9kXFxuYWdhaW4gd2lsbCBvdmVycmlkZSB0aGUgaW5pdGlhbCBtdWx0KCkgd2l0aCBhIG5ldyB2YWx1ZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJtdWx0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnN0YW50IG51bWJlciB0byBtdWx0aXBseTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJPc2NpbGxhdG9yIFJldHVybnMgdGhpcyBvc2NpbGxhdG9yXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG11bHRpcGxpZWQgb3V0cHV0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuT3NjaWxsYXRvclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk9zY2lsbGF0b3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTM3OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TY2FsZSB0aGlzIG9zY2lsbGF0b3ImIzM5O3MgYW1wbGl0dWRlIHZhbHVlcyB0byBhIGdpdmVuXFxucmFuZ2UsIGFuZCByZXR1cm4gdGhlIG9zY2lsbGF0b3IuIENhbGxpbmcgdGhpcyBtZXRob2RcXG5hZ2FpbiB3aWxsIG92ZXJyaWRlIHRoZSBpbml0aWFsIHNjYWxlKCkgd2l0aCBuZXcgdmFsdWVzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNjYWxlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJpbk1pblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5wdXQgcmFuZ2UgbWludW11bTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaW5NYXhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmlucHV0IHJhbmdlIG1heGltdW08L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm91dE1pblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5wdXQgcmFuZ2UgbWludW11bTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwib3V0TWF4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5pbnB1dCByYW5nZSBtYXhpbXVtPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk9zY2lsbGF0b3IgUmV0dXJucyB0aGlzIG9zY2lsbGF0b3JcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc2NhbGVkIG91dHB1dFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1Lk9zY2lsbGF0b3JcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Pc2NpbGxhdG9yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU0NzgsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU3FyT3NjXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU2ODEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU3FyT3NjXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU5NzAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGltZSB1bnRpbCBlbnZlbG9wZSByZWFjaGVzIGF0dGFja0xldmVsPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhdHRhY2tUaW1lXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU5NzUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TGV2ZWwgb25jZSBhdHRhY2sgaXMgY29tcGxldGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhdHRhY2tMZXZlbFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVudlwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA1OTgwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRpbWUgdW50aWwgZW52ZWxvcGUgcmVhY2hlcyBkZWNheUxldmVsLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGVjYXlUaW1lXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU5ODUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TGV2ZWwgYWZ0ZXIgZGVjYXkuIFRoZSBlbnZlbG9wZSB3aWxsIHN1c3RhaW4gaGVyZSB1bnRpbCBpdCBpcyByZWxlYXNlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRlY2F5TGV2ZWxcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbnZcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNTk5MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EdXJhdGlvbiBvZiB0aGUgcmVsZWFzZSBwb3J0aW9uIG9mIHRoZSBlbnZlbG9wZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlbGVhc2VUaW1lXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDU5OTUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TGV2ZWwgYXQgdGhlIGVuZCBvZiB0aGUgcmVsZWFzZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlbGVhc2VMZXZlbFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVudlwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2MDMxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlc2V0IHRoZSBlbnZlbG9wZSB3aXRoIGEgc2VyaWVzIG9mIHRpbWUvdmFsdWUgcGFpcnMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhdHRhY2tUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaW1lIChpbiBzZWNvbmRzKSBiZWZvcmUgbGV2ZWxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlcyBhdHRhY2tMZXZlbDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXR0YWNrTGV2ZWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlR5cGljYWxseSBhbiBhbXBsaXR1ZGUgYmV0d2VlblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAgYW5kIDEuMDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGVjYXlUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaW1lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZWNheUxldmVsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BbXBsaXR1ZGUgKEluIGEgc3RhbmRhcmQgQURTUiBlbnZlbG9wZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjYXlMZXZlbCA9IHN1c3RhaW5MZXZlbCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJlbGVhc2VUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZWxlYXNlIFRpbWUgKGluIHNlY29uZHMpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyZWxlYXNlTGV2ZWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFtcGxpdHVkZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIHQxID0gMC4xOyAvLyBhdHRhY2sgdGltZSBpbiBzZWNvbmRzXFxudmFyIGwxID0gMC43OyAvLyBhdHRhY2sgbGV2ZWwgMC4wIHRvIDEuMFxcbnZhciB0MiA9IDAuMzsgLy8gZGVjYXkgdGltZSBpbiBzZWNvbmRzXFxudmFyIGwyID0gMC4xOyAvLyBkZWNheSBsZXZlbCAgMC4wIHRvIDEuMFxcbnZhciB0MyA9IDAuMjsgLy8gc3VzdGFpbiB0aW1lIGluIHNlY29uZHNcXG52YXIgbDMgPSAwLjI7IC8vIHN1c3RhaW4gbGV2ZWwgIDAuMCB0byAxLjBcXG4vLyByZWxlYXNlIGxldmVsIGRlZmF1bHRzIHRvIHplcm9cXG5cXG52YXIgZW52O1xcbnZhciB0cmlPc2M7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgbm9TdHJva2UoKTtcXG4gIGZpbGwoMjU1KTtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgdGV4dCgnY2xpY2sgdG8gcGxheScsIHdpZHRoLzIsIGhlaWdodC8yKTtcXG5cXG4gIGVudiA9IG5ldyBwNS5FbnYodDEsIGwxLCB0MiwgbDIsIHQzLCBsMyk7XFxuICB0cmlPc2MgPSBuZXcgcDUuT3NjaWxsYXRvcigndHJpYW5nbGUnKTtcXG4gIHRyaU9zYy5hbXAoZW52KTsgLy8gZ2l2ZSB0aGUgZW52IGNvbnRyb2wgb2YgdGhlIHRyaU9zYydzIGFtcFxcbiAgdHJpT3NjLnN0YXJ0KCk7XFxufVxcblxcbi8vIG1vdXNlQ2xpY2sgdHJpZ2dlcnMgZW52ZWxvcGUgaWYgb3ZlciBjYW52YXNcXG5mdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XFxuICAvLyBpcyBtb3VzZSBvdmVyIGNhbnZhcz9cXG4gIGlmIChtb3VzZVggPiAwICYmIG1vdXNlWCA8IHdpZHRoICYmIG1vdXNlWSA+IDAgJiYgbW91c2VZIDwgaGVpZ2h0KSB7XFxuICAgIGVudi5wbGF5KHRyaU9zYyk7XFxuICB9XFxufVxcbjwvY29kZT48L2Rpdj5cXG5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbnZcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjA5MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdmFsdWVzIGxpa2UgYSB0cmFkaXRpb25hbFxcbjxhIGhyZWY9XFxcImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bnRoZXNpemVyIy9tZWRpYS9GaWxlOkFEU1JfcGFyYW1ldGVyLnN2Z1xcXCI+XFxuQURTUiBlbnZlbG9wZVxcbjwvYT4uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0QURTUlwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXR0YWNrVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGltZSAoaW4gc2Vjb25kcyBiZWZvcmUgZW52ZWxvcGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGVzIEF0dGFjayBMZXZlbDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGVjYXlUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaW1lIChpbiBzZWNvbmRzKSBiZWZvcmUgZW52ZWxvcGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGVzIERlY2F5L1N1c3RhaW4gTGV2ZWw8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3VzUmF0aW9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJhdGlvIGJldHdlZW4gYXR0YWNrTGV2ZWwgYW5kIHJlbGVhc2VMZXZlbCwgb24gYSBzY2FsZSBmcm9tIDAgdG8gMSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSAxLjAgPSBhdHRhY2tMZXZlbCwgMC4wID0gcmVsZWFzZUxldmVsLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdXNSYXRpbyBkZXRlcm1pbmVzIHRoZSBkZWNheUxldmVsIGFuZCB0aGUgbGV2ZWwgYXQgd2hpY2ggdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzdGFpbiBwb3J0aW9uIG9mIHRoZSBlbnZlbG9wZSB3aWxsIHN1c3RhaW4uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIGF0dGFja0xldmVsIGlzIDAuNCwgcmVsZWFzZUxldmVsIGlzIDAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN1c0FtdCBpcyAwLjUsIHRoZSBkZWNheUxldmVsIHdvdWxkIGJlIDAuMi4gSWYgYXR0YWNrTGV2ZWwgaXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZWFzZWQgdG8gMS4wICh1c2luZyA8Y29kZT5zZXRSYW5nZTwvY29kZT4pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZGVjYXlMZXZlbCB3b3VsZCBpbmNyZWFzZSBwcm9wb3J0aW9uYWxseSwgdG8gYmVjb21lIDAuNS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVsZWFzZVRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRpbWUgaW4gc2Vjb25kcyBmcm9tIG5vdyAoZGVmYXVsdHMgdG8gMCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIGF0dGFja0xldmVsID0gMS4wO1xcbnZhciByZWxlYXNlTGV2ZWwgPSAwO1xcblxcbnZhciBhdHRhY2tUaW1lID0gMC4wMDFcXG52YXIgZGVjYXlUaW1lID0gMC4yO1xcbnZhciBzdXNQZXJjZW50ID0gMC4yO1xcbnZhciByZWxlYXNlVGltZSA9IDAuNTtcXG5cXG52YXIgZW52LCB0cmlPc2M7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG5cXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgdGV4dCgnY2xpY2sgdG8gcGxheScsIHdpZHRoLzIsIGhlaWdodC8yKTtcXG5cXG4gIGVudiA9IG5ldyBwNS5FbnYoKTtcXG4gIGVudi5zZXRBRFNSKGF0dGFja1RpbWUsIGRlY2F5VGltZSwgc3VzUGVyY2VudCwgcmVsZWFzZVRpbWUpO1xcbiAgZW52LnNldFJhbmdlKGF0dGFja0xldmVsLCByZWxlYXNlTGV2ZWwpO1xcblxcbiAgdHJpT3NjID0gbmV3IHA1Lk9zY2lsbGF0b3IoJ3RyaWFuZ2xlJyk7XFxuICB0cmlPc2MuYW1wKGVudik7XFxuICB0cmlPc2Muc3RhcnQoKTtcXG4gIHRyaU9zYy5mcmVxKDIyMCk7XFxuXFxuICBjbnYubW91c2VQcmVzc2VkKHBsYXlFbnYpO1xcbn1cXG5cXG5mdW5jdGlvbiBwbGF5RW52KCl7XFxuICBlbnYucGxheSgpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDYxNTUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IG1heCAoYXR0YWNrTGV2ZWwpIGFuZCBtaW4gKHJlbGVhc2VMZXZlbCkgb2YgZW52ZWxvcGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0UmFuZ2VcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFMZXZlbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YXR0YWNrIGxldmVsIChkZWZhdWx0cyB0byAxKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwickxldmVsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yZWxlYXNlIGxldmVsIChkZWZhdWx0cyB0byAwKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIGF0dGFja0xldmVsID0gMS4wO1xcbnZhciByZWxlYXNlTGV2ZWwgPSAwO1xcblxcbnZhciBhdHRhY2tUaW1lID0gMC4wMDFcXG52YXIgZGVjYXlUaW1lID0gMC4yO1xcbnZhciBzdXNQZXJjZW50ID0gMC4yO1xcbnZhciByZWxlYXNlVGltZSA9IDAuNTtcXG5cXG52YXIgZW52LCB0cmlPc2M7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG5cXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgdGV4dCgnY2xpY2sgdG8gcGxheScsIHdpZHRoLzIsIGhlaWdodC8yKTtcXG5cXG4gIGVudiA9IG5ldyBwNS5FbnYoKTtcXG4gIGVudi5zZXRBRFNSKGF0dGFja1RpbWUsIGRlY2F5VGltZSwgc3VzUGVyY2VudCwgcmVsZWFzZVRpbWUpO1xcbiAgZW52LnNldFJhbmdlKGF0dGFja0xldmVsLCByZWxlYXNlTGV2ZWwpO1xcblxcbiAgdHJpT3NjID0gbmV3IHA1Lk9zY2lsbGF0b3IoJ3RyaWFuZ2xlJyk7XFxuICB0cmlPc2MuYW1wKGVudik7XFxuICB0cmlPc2Muc3RhcnQoKTtcXG4gIHRyaU9zYy5mcmVxKDIyMCk7XFxuXFxuICBjbnYubW91c2VQcmVzc2VkKHBsYXlFbnYpO1xcbn1cXG5cXG5mdW5jdGlvbiBwbGF5RW52KCl7XFxuICBlbnYucGxheSgpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDYyMzQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXNzaWduIGEgcGFyYW1ldGVyIHRvIGJlIGNvbnRyb2xsZWQgYnkgdGhpcyBlbnZlbG9wZS5cXG5JZiBhIHA1LlNvdW5kIG9iamVjdCBpcyBnaXZlbiwgdGhlbiB0aGUgcDUuRW52IHdpbGwgY29udHJvbCBpdHNcXG5vdXRwdXQgZ2Fpbi4gSWYgbXVsdGlwbGUgaW5wdXRzIGFyZSBwcm92aWRlZCwgdGhlIGVudiB3aWxsXFxuY29udHJvbCBhbGwgb2YgdGhlbS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRJbnB1dFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaW5wdXRzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BIHA1LnNvdW5kIG9iamVjdCBvclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYiBBdWRpbyBQYXJhbS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIFwibXVsdGlwbGVcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDYyNDksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHdoZXRoZXIgdGhlIGVudmVsb3BlIHJhbXAgaXMgbGluZWFyIChkZWZhdWx0KSBvciBleHBvbmVudGlhbC5cXG5FeHBvbmVudGlhbCByYW1wcyBjYW4gYmUgdXNlZnVsIGJlY2F1c2Ugd2UgcGVyY2VpdmUgYW1wbGl0dWRlXFxuYW5kIGZyZXF1ZW5jeSBsb2dhcml0aG1pY2FsbHkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0RXhwXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJpc0V4cFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dHJ1ZSBpcyBleHBvbmVudGlhbCwgZmFsc2UgaXMgbGluZWFyPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVudlwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2MjY3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlBsYXkgdGVsbHMgdGhlIGVudmVsb3BlIHRvIHN0YXJ0IGFjdGluZyBvbiBhIGdpdmVuIGlucHV0LlxcbklmIHRoZSBpbnB1dCBpcyBhIHA1LnNvdW5kIG9iamVjdCAoaS5lLiBBdWRpb0luLCBPc2NpbGxhdG9yLFxcblNvdW5kRmlsZSksIHRoZW4gRW52IHdpbGwgY29udHJvbCBpdHMgb3V0cHV0IHZvbHVtZS5cXG5FbnZlbG9wZXMgY2FuIGFsc28gYmUgdXNlZCB0byBjb250cm9sIGFueSA8YSBocmVmPVxcXCJcXG5odHRwOi8vZG9jcy53ZWJwbGF0Zm9ybS5vcmcvd2lraS9hcGlzL3dlYmF1ZGlvL0F1ZGlvUGFyYW1cXFwiPlxcbldlYiBBdWRpbyBBdWRpbyBQYXJhbS48L2E+PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicGxheVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QSBwNS5zb3VuZCBvYmplY3Qgb3JcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWIgQXVkaW8gUGFyYW0uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdGFydFRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRpbWUgZnJvbSBub3cgKGluIHNlY29uZHMpIGF0IHdoaWNoIHRvIHBsYXk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3VzdGFpblRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRpbWUgdG8gc3VzdGFpbiBiZWZvcmUgcmVsZWFzaW5nIHRoZSBlbnZlbG9wZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgYXR0YWNrTGV2ZWwgPSAxLjA7XFxudmFyIHJlbGVhc2VMZXZlbCA9IDA7XFxuXFxudmFyIGF0dGFja1RpbWUgPSAwLjAwMVxcbnZhciBkZWNheVRpbWUgPSAwLjI7XFxudmFyIHN1c1BlcmNlbnQgPSAwLjI7XFxudmFyIHJlbGVhc2VUaW1lID0gMC41O1xcblxcbnZhciBlbnYsIHRyaU9zYztcXG5cXG5mdW5jdGlvbiBzZXR1cCgpIHtcXG4gIHZhciBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xcblxcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuICB0ZXh0KCdjbGljayB0byBwbGF5Jywgd2lkdGgvMiwgaGVpZ2h0LzIpO1xcblxcbiAgZW52ID0gbmV3IHA1LkVudigpO1xcbiAgZW52LnNldEFEU1IoYXR0YWNrVGltZSwgZGVjYXlUaW1lLCBzdXNQZXJjZW50LCByZWxlYXNlVGltZSk7XFxuICBlbnYuc2V0UmFuZ2UoYXR0YWNrTGV2ZWwsIHJlbGVhc2VMZXZlbCk7XFxuXFxuICB0cmlPc2MgPSBuZXcgcDUuT3NjaWxsYXRvcigndHJpYW5nbGUnKTtcXG4gIHRyaU9zYy5hbXAoZW52KTtcXG4gIHRyaU9zYy5zdGFydCgpO1xcbiAgdHJpT3NjLmZyZXEoMjIwKTtcXG5cXG4gIGNudi5tb3VzZVByZXNzZWQocGxheUVudik7XFxufVxcblxcbmZ1bmN0aW9uIHBsYXlFbnYoKXtcXG4gIC8vIHRyaWdnZXIgZW52IG9uIHRyaU9zYywgMCBzZWNvbmRzIGZyb20gbm93XFxuICAvLyBBZnRlciBkZWNheSwgc3VzdGFpbiBmb3IgMC4yIHNlY29uZHMgYmVmb3JlIHJlbGVhc2VcXG4gIGVudi5wbGF5KHRyaU9zYywgMCwgMC4yKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVudlwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA2MzI4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRyaWdnZXIgdGhlIEF0dGFjaywgYW5kIERlY2F5IHBvcnRpb24gb2YgdGhlIEVudmVsb3BlLlxcblNpbWlsYXIgdG8gaG9sZGluZyBkb3duIGEga2V5IG9uIGEgcGlhbm8sIGJ1dCBpdCB3aWxsXFxuaG9sZCB0aGUgc3VzdGFpbiBsZXZlbCB1bnRpbCB5b3UgbGV0IGdvLiBJbnB1dCBjYW4gYmVcXG5hbnkgcDUuc291bmQgb2JqZWN0LCBvciBhIDxhIGhyZWY9XFxcIlxcbmh0dHA6Ly9kb2NzLndlYnBsYXRmb3JtLm9yZy93aWtpL2FwaXMvd2ViYXVkaW8vQXVkaW9QYXJhbVxcXCI+XFxuV2ViIEF1ZGlvIFBhcmFtPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0cmlnZ2VyQXR0YWNrXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ1bml0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5zb3VuZCBPYmplY3Qgb3IgV2ViIEF1ZGlvIFBhcmFtPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzZWNvbmRzRnJvbU5vd1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGltZSBmcm9tIG5vdyAoaW4gc2Vjb25kcyk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcblxcbnZhciBhdHRhY2tMZXZlbCA9IDEuMDtcXG52YXIgcmVsZWFzZUxldmVsID0gMDtcXG5cXG52YXIgYXR0YWNrVGltZSA9IDAuMDAxXFxudmFyIGRlY2F5VGltZSA9IDAuMztcXG52YXIgc3VzUGVyY2VudCA9IDAuNDtcXG52YXIgcmVsZWFzZVRpbWUgPSAwLjU7XFxuXFxudmFyIGVudiwgdHJpT3NjO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgdmFyIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICB0ZXh0QWxpZ24oQ0VOVEVSKTtcXG4gIHRleHQoJ2NsaWNrIHRvIHBsYXknLCB3aWR0aC8yLCBoZWlnaHQvMik7XFxuXFxuICBlbnYgPSBuZXcgcDUuRW52KCk7XFxuICBlbnYuc2V0QURTUihhdHRhY2tUaW1lLCBkZWNheVRpbWUsIHN1c1BlcmNlbnQsIHJlbGVhc2VUaW1lKTtcXG4gIGVudi5zZXRSYW5nZShhdHRhY2tMZXZlbCwgcmVsZWFzZUxldmVsKTtcXG5cXG4gIHRyaU9zYyA9IG5ldyBwNS5Pc2NpbGxhdG9yKCd0cmlhbmdsZScpO1xcbiAgdHJpT3NjLmFtcChlbnYpO1xcbiAgdHJpT3NjLnN0YXJ0KCk7XFxuICB0cmlPc2MuZnJlcSgyMjApO1xcblxcbiAgY252Lm1vdXNlUHJlc3NlZChlbnZBdHRhY2spO1xcbn1cXG5cXG5mdW5jdGlvbiBlbnZBdHRhY2soKXtcXG4gIGNvbnNvbGUubG9nKCd0cmlnZ2VyIGF0dGFjaycpO1xcbiAgZW52LnRyaWdnZXJBdHRhY2soKTtcXG5cXG4gIGJhY2tncm91bmQoMCwyNTUsMCk7XFxuICB0ZXh0KCdhdHRhY2shJywgd2lkdGgvMiwgaGVpZ2h0LzIpO1xcbn1cXG5cXG5mdW5jdGlvbiBtb3VzZVJlbGVhc2VkKCkge1xcbiAgZW52LnRyaWdnZXJSZWxlYXNlKCk7XFxuXFxuICBiYWNrZ3JvdW5kKDIwMCk7XFxuICB0ZXh0KCdjbGljayB0byBwbGF5Jywgd2lkdGgvMiwgaGVpZ2h0LzIpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDY0MzUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VHJpZ2dlciB0aGUgUmVsZWFzZSBvZiB0aGUgRW52ZWxvcGUuIFRoaXMgaXMgc2ltaWxhciB0byByZWxlYXNpbmdcXG50aGUga2V5IG9uIGEgcGlhbm8gYW5kIGxldHRpbmcgdGhlIHNvdW5kIGZhZGUgYWNjb3JkaW5nIHRvIHRoZVxcbnJlbGVhc2UgbGV2ZWwgYW5kIHJlbGVhc2UgdGltZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0cmlnZ2VyUmVsZWFzZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cDUuc291bmQgT2JqZWN0IG9yIFdlYiBBdWRpbyBQYXJhbTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2Vjb25kc0Zyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRpbWUgdG8gdHJpZ2dlciB0aGUgcmVsZWFzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxuXFxudmFyIGF0dGFja0xldmVsID0gMS4wO1xcbnZhciByZWxlYXNlTGV2ZWwgPSAwO1xcblxcbnZhciBhdHRhY2tUaW1lID0gMC4wMDFcXG52YXIgZGVjYXlUaW1lID0gMC4zO1xcbnZhciBzdXNQZXJjZW50ID0gMC40O1xcbnZhciByZWxlYXNlVGltZSA9IDAuNTtcXG5cXG52YXIgZW52LCB0cmlPc2M7XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICB2YXIgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHRleHRBbGlnbihDRU5URVIpO1xcbiAgdGV4dCgnY2xpY2sgdG8gcGxheScsIHdpZHRoLzIsIGhlaWdodC8yKTtcXG5cXG4gIGVudiA9IG5ldyBwNS5FbnYoKTtcXG4gIGVudi5zZXRBRFNSKGF0dGFja1RpbWUsIGRlY2F5VGltZSwgc3VzUGVyY2VudCwgcmVsZWFzZVRpbWUpO1xcbiAgZW52LnNldFJhbmdlKGF0dGFja0xldmVsLCByZWxlYXNlTGV2ZWwpO1xcblxcbiAgdHJpT3NjID0gbmV3IHA1Lk9zY2lsbGF0b3IoJ3RyaWFuZ2xlJyk7XFxuICB0cmlPc2MuYW1wKGVudik7XFxuICB0cmlPc2Muc3RhcnQoKTtcXG4gIHRyaU9zYy5mcmVxKDIyMCk7XFxuXFxuICBjbnYubW91c2VQcmVzc2VkKGVudkF0dGFjayk7XFxufVxcblxcbmZ1bmN0aW9uIGVudkF0dGFjaygpe1xcbiAgY29uc29sZS5sb2coJ3RyaWdnZXIgYXR0YWNrJyk7XFxuICBlbnYudHJpZ2dlckF0dGFjaygpO1xcblxcbiAgYmFja2dyb3VuZCgwLDI1NSwwKTtcXG4gIHRleHQoJ2F0dGFjayEnLCB3aWR0aC8yLCBoZWlnaHQvMik7XFxufVxcblxcbmZ1bmN0aW9uIG1vdXNlUmVsZWFzZWQoKSB7XFxuICBlbnYudHJpZ2dlclJlbGVhc2UoKTtcXG5cXG4gIGJhY2tncm91bmQoMjAwKTtcXG4gIHRleHQoJ2NsaWNrIHRvIHBsYXknLCB3aWR0aC8yLCBoZWlnaHQvMik7XFxufVxcbjwvY29kZT48L2Rpdj5cIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbnZcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjUzMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5FeHBvbmVudGlhbGx5IHJhbXAgdG8gYSB2YWx1ZSB1c2luZyB0aGUgZmlyc3QgdHdvXFxudmFsdWVzIGZyb20gPGNvZGU+PGEgaHJlZj1cXFwiIy9wNS5FbnYvc2V0QURTUlxcXCI+c2V0QURTUihhdHRhY2tUaW1lLCBkZWNheVRpbWUpPC9hPjwvY29kZT5cXG5hcyA8YSBocmVmPVxcXCJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SQ190aW1lX2NvbnN0YW50XFxcIj5cXG50aW1lIGNvbnN0YW50czwvYT4gZm9yIHNpbXBsZSBleHBvbmVudGlhbCByYW1wcy5cXG5JZiB0aGUgdmFsdWUgaXMgaGlnaGVyIHRoYW4gY3VycmVudCB2YWx1ZSwgaXQgdXNlcyBhdHRhY2tUaW1lLFxcbndoaWxlIGEgZGVjcmVhc2UgdXNlcyBkZWNheVRpbWUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFtcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cDUuc291bmQgT2JqZWN0IG9yIFdlYiBBdWRpbyBQYXJhbTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2Vjb25kc0Zyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPldoZW4gdG8gdHJpZ2dlciB0aGUgcmFtcDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGFyZ2V0IHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2Vjb25kIHRhcmdldCB2YWx1ZSAob3B0aW9uYWwpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBlbnYsIG9zYywgYW1wLCBjbnY7XFxuXFxudmFyIGF0dGFja1RpbWUgPSAwLjAwMTtcXG52YXIgZGVjYXlUaW1lID0gMC4yO1xcbnZhciBhdHRhY2tMZXZlbCA9IDE7XFxudmFyIGRlY2F5TGV2ZWwgPSAwO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcXG4gIGZpbGwoMCwyNTUsMCk7XFxuICBub1N0cm9rZSgpO1xcblxcbiAgZW52ID0gbmV3IHA1LkVudigpO1xcbiAgZW52LnNldEFEU1IoYXR0YWNrVGltZSwgZGVjYXlUaW1lKTtcXG5cXG4gIG9zYyA9IG5ldyBwNS5Pc2NpbGxhdG9yKCk7XFxuICBvc2MuYW1wKGVudik7XFxuICBvc2Muc3RhcnQoKTtcXG5cXG4gIGFtcCA9IG5ldyBwNS5BbXBsaXR1ZGUoKTtcXG5cXG4gIGNudi5tb3VzZVByZXNzZWQodHJpZ2dlclJhbXApO1xcbn1cXG5cXG5mdW5jdGlvbiB0cmlnZ2VyUmFtcCgpIHtcXG4gIGVudi5yYW1wKG9zYywgMCwgYXR0YWNrTGV2ZWwsIGRlY2F5TGV2ZWwpO1xcbn1cXG5cXG5mdW5jdGlvbiBkcmF3KCkge1xcbiAgYmFja2dyb3VuZCgyMCwyMCwyMCk7XFxuICB0ZXh0KCdjbGljayBtZScsIDEwLCAyMCk7XFxuICB2YXIgaCA9IG1hcChhbXAuZ2V0TGV2ZWwoKSwgMCwgMC40LCAwLCBoZWlnaHQpOztcXG5cXG4gIHJlY3QoMCwgaGVpZ2h0LCB3aWR0aCwgLWgpO1xcbn1cXG48L2NvZGU+PC9kaXY+XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDY2MzcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QWRkIGEgdmFsdWUgdG8gdGhlIHA1Lk9zY2lsbGF0b3ImIzM5O3Mgb3V0cHV0IGFtcGxpdHVkZSxcXG5hbmQgcmV0dXJuIHRoZSBvc2NpbGxhdG9yLiBDYWxsaW5nIHRoaXMgbWV0aG9kXFxuYWdhaW4gd2lsbCBvdmVycmlkZSB0aGUgaW5pdGlhbCBhZGQoKSB3aXRoIG5ldyB2YWx1ZXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYWRkXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnN0YW50IG51bWJlciB0byBhZGQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiRW52ZWxvcGUgUmV0dXJucyB0aGlzIGVudmVsb3BlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNjYWxlZCBvdXRwdXRcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5FbnZcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FbnZcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjY1MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5NdWx0aXBseSB0aGUgcDUuRW52JiMzOTtzIG91dHB1dCBhbXBsaXR1ZGVcXG5ieSBhIGZpeGVkIHZhbHVlLiBDYWxsaW5nIHRoaXMgbWV0aG9kXFxuYWdhaW4gd2lsbCBvdmVycmlkZSB0aGUgaW5pdGlhbCBtdWx0KCkgd2l0aCBuZXcgdmFsdWVzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm11bHRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29uc3RhbnQgbnVtYmVyIHRvIG11bHRpcGx5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkVudmVsb3BlIFJldHVybnMgdGhpcyBlbnZlbG9wZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBzY2FsZWQgb3V0cHV0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuRW52XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDY2NjksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2NhbGUgdGhpcyBlbnZlbG9wZSYjMzk7cyBhbXBsaXR1ZGUgdmFsdWVzIHRvIGEgZ2l2ZW5cXG5yYW5nZSwgYW5kIHJldHVybiB0aGUgZW52ZWxvcGUuIENhbGxpbmcgdGhpcyBtZXRob2RcXG5hZ2FpbiB3aWxsIG92ZXJyaWRlIHRoZSBpbml0aWFsIHNjYWxlKCkgd2l0aCBuZXcgdmFsdWVzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNjYWxlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJpbk1pblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5wdXQgcmFuZ2UgbWludW11bTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiaW5NYXhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmlucHV0IHJhbmdlIG1heGltdW08L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm91dE1pblwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aW5wdXQgcmFuZ2UgbWludW11bTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwib3V0TWF4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5pbnB1dCByYW5nZSBtYXhpbXVtPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkVudmVsb3BlIFJldHVybnMgdGhpcyBlbnZlbG9wZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBzY2FsZWQgb3V0cHV0XCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuRW52XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRW52XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDY3NzMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHRoZSB3aWR0aCBvZiBhIFB1bHNlIG9iamVjdCAoYW4gb3NjaWxsYXRvciB0aGF0IGltcGxlbWVudHNcXG5QdWxzZSBXaWR0aCBNb2R1bGF0aW9uKS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ3aWR0aFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwid2lkdGhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPldpZHRoIGJldHdlZW4gdGhlIHB1bHNlcyAoMCB0byAxLjAsXFxuICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0cyB0byAwKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUHVsc2VcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjk1OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdHlwZSBvZiBub2lzZSB0byAmIzM5O3doaXRlJiMzOTssICYjMzk7cGluayYjMzk7IG9yICYjMzk7YnJvd24mIzM5Oy5cXG5XaGl0ZSBpcyB0aGUgZGVmYXVsdC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRUeXBlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0eXBlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD4mIzM5O3doaXRlJiMzOTssICYjMzk7cGluayYjMzk7IG9yICYjMzk7YnJvd24mIzM5OzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTm9pc2VcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNjk4OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TdGFydCB0aGUgbm9pc2U8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzdGFydFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk5vaXNlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDcwMDUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3RvcCB0aGUgbm9pc2UuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RvcFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk5vaXNlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDcwMTcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UGFuIHRoZSBub2lzZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYW5cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBhbm5pbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk51bWJlciBiZXR3ZWVuIC0xIChsZWZ0KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgMSAocmlnaHQpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lRnJvbU5vd1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c2NoZWR1bGUgdGhpcyBldmVudCB0byBoYXBwZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzIGZyb20gbm93PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTm9pc2VcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzAyNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIGFtcGxpdHVkZSBvZiB0aGUgbm9pc2UgYmV0d2VlbiAwIGFuZCAxLjAuIE9yLFxcbm1vZHVsYXRlIGFtcGxpdHVkZSB3aXRoIGFuIGF1ZGlvIHNpZ25hbCBzdWNoIGFzIGFuIG9zY2lsbGF0b3IuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW1wXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2b2x1bWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmFtcGxpdHVkZSBiZXR3ZWVuIDAgYW5kIDEuMFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbW9kdWxhdGluZyBzaWduYWwvb3NjaWxsYXRvcjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyfE9iamVjdFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJhbXBUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jcmVhdGUgYSBmYWRlIHRoYXQgbGFzdHMgcmFtcFRpbWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZUZyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNjaGVkdWxlIHRoaXMgZXZlbnQgdG8gaGFwcGVuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyBmcm9tIG5vdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTm9pc2VcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzAzNyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZW5kIG91dHB1dCB0byBhIHA1LnNvdW5kIG9yIHdlYiBhdWRpbyBvYmplY3Q8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjb25uZWN0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ1bml0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk5vaXNlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDcwNDMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RGlzY29ubmVjdCBhbGwgb3V0cHV0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRpc2Nvbm5lY3RcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Ob2lzZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3MTE3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNsaWVudCBtdXN0IGFsbG93IGJyb3dzZXIgdG8gYWNjZXNzIHRoZWlyIG1pY3JvcGhvbmUgLyBhdWRpb2luIHNvdXJjZS5cXG5EZWZhdWx0OiBmYWxzZS4gV2lsbCBiZWNvbWUgdHJ1ZSB3aGVuIHRoZSBjbGllbnQgZW5hYmxlcyBhY2Nlcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImVuYWJsZWRcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5BdWRpb0luXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDcxMzMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3RhcnQgcHJvY2Vzc2luZyBhdWRpbyBpbnB1dC4gVGhpcyBlbmFibGVzIHRoZSB1c2Ugb2Ygb3RoZXJcXG5BdWRpb0luIG1ldGhvZHMgbGlrZSBnZXRMZXZlbCgpLiBOb3RlIHRoYXQgYnkgZGVmYXVsdCwgQXVkaW9JblxcbmlzIG5vdCBjb25uZWN0ZWQgdG8gcDUuc291bmQmIzM5O3Mgb3V0cHV0LiBTbyB5b3Ugd29uJiMzOTt0IGhlYXJcXG5hbnl0aGluZyB1bmxlc3MgeW91IHVzZSB0aGUgY29ubmVjdCgpIG1ldGhvZC48YnIvPjwvcD5cXG48cD5DZXJ0YWluIGJyb3dzZXJzIGxpbWl0IGFjY2VzcyB0byB0aGUgdXNlciYjMzk7cyBtaWNyb3Bob25lLiBGb3IgZXhhbXBsZSxcXG5DaHJvbWUgb25seSBhbGxvd3MgYWNjZXNzIGZyb20gbG9jYWxob3N0IGFuZCBvdmVyIGh0dHBzLiBGb3IgdGhpcyByZWFzb24sXFxueW91IG1heSB3YW50IHRvIGluY2x1ZGUgYW4gZXJyb3JDYWxsYmFja+KAlGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgaW4gY2FzZVxcbnRoZSBicm93c2VyIHdvbiYjMzk7dCBwcm92aWRlIG1pYyBhY2Nlc3MuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RhcnRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN1Y2Nlc3NDYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgb25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzcy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5OYW1lIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCBpZlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSB3YXMgYW4gZXJyb3IuIEZvciBleGFtcGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGJyb3dzZXJzIGRvIG5vdCBzdXBwb3J0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVzZXJNZWRpYS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQXVkaW9JblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3MTg2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlR1cm4gdGhlIEF1ZGlvSW4gb2ZmLiBJZiB0aGUgQXVkaW9JbiBpcyBzdG9wcGVkLCBpdCBjYW5ub3QgZ2V0TGV2ZWwoKS5cXG5JZiByZS1zdGFydGluZywgdGhlIHVzZXIgbWF5IGJlIHByb21wdGVkIGZvciBwZXJtaXNzaW9uIGFjY2Vzcy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzdG9wXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQXVkaW9JblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3MjAyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbm5lY3QgdG8gYW4gYXVkaW8gdW5pdC4gSWYgbm8gcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB3aWxsXFxuY29ubmVjdCB0byB0aGUgbWFzdGVyIG91dHB1dCAoaS5lLiB5b3VyIHNwZWFrZXJzKS48YnIvPjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbm5lY3RcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInVuaXRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFuIG9iamVjdCB0aGF0IGFjY2VwdHMgYXVkaW8gaW5wdXQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBhbiBGRlQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkF1ZGlvSW5cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzIyMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EaXNjb25uZWN0IHRoZSBBdWRpb0luIGZyb20gYWxsIGF1ZGlvIHVuaXRzLiBGb3IgZXhhbXBsZSwgaWZcXG5jb25uZWN0KCkgaGFkIGJlZW4gY2FsbGVkLCBkaXNjb25uZWN0KCkgd2lsbCBzdG9wIHNlbmRpbmdcXG5zaWduYWwgdG8geW91ciBzcGVha2Vycy48YnIvPjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRpc2Nvbm5lY3RcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5BdWRpb0luXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDcyMzUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmVhZCB0aGUgQW1wbGl0dWRlICh2b2x1bWUgbGV2ZWwpIG9mIGFuIEF1ZGlvSW4uIFRoZSBBdWRpb0luXFxuY2xhc3MgY29udGFpbnMgaXRzIG93biBpbnN0YW5jZSBvZiB0aGUgQW1wbGl0dWRlIGNsYXNzIHRvIGhlbHBcXG5tYWtlIGl0IGVhc3kgdG8gZ2V0IGEgbWljcm9waG9uZSYjMzk7cyB2b2x1bWUgbGV2ZWwuIEFjY2VwdHMgYW5cXG5vcHRpb25hbCBzbW9vdGhpbmcgdmFsdWUgKDAuMCAmbHQ7IDEuMCkuIDxlbT5OT1RFOiBBdWRpb0luIG11c3RcXG4uc3RhcnQoKSBiZWZvcmUgdXNpbmcgLmdldExldmVsKCkuPC9lbT48YnIvPjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdldExldmVsXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzbW9vdGhpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNtb290aGluZyBpcyAwLjAgYnkgZGVmYXVsdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtb290aHMgdmFsdWVzIGJhc2VkIG9uIHByZXZpb3VzIHZhbHVlcy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJWb2x1bWUgbGV2ZWwgKGJldHdlZW4gMC4wIGFuZCAxLjApXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQXVkaW9JblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3MjUzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCBhbXBsaXR1ZGUgKHZvbHVtZSkgb2YgYSBtaWMgaW5wdXQgYmV0d2VlbiAwIGFuZCAxLjAuIDxici8+PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW1wXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2b2xcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmJldHdlZW4gMCBhbmQgMS4wPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yYW1wIHRpbWUgKG9wdGlvbmFsKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQXVkaW9JblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3MjcyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgYSBsaXN0IG9mIGF2YWlsYWJsZSBpbnB1dCBzb3VyY2VzLiBUaGlzIGlzIGEgd3JhcHBlclxcbmZvciAmbHQ7YSB0aXRsZT0mcXVvdDtNZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpIC0gV2ViIEFQSXMgfCBNRE4mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyBocmVmPVxcbiAmcXVvdDs8YSBocmVmPVxcXCJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTWVkaWFEZXZpY2VzL2VudW1lcmF0ZURldmljZXNcXFwiPmh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9NZWRpYURldmljZXMvZW51bWVyYXRlRGV2aWNlczwvYT4mcXVvdDs8L3A+XFxuPGJsb2NrcXVvdGU+XFxuPHA+YW5kIGl0IHJldHVybnMgYSBQcm9taXNlLjwvcD5cXG48L2Jsb2NrcXVvdGU+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRTb3VyY2VzXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdWNjZXNzQ2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaGFuZGxlcyB0aGUgc291cmNlcyB3aGVuIHRoZXlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBiZWVuIGVudW1lcmF0ZWQuIFRoZSBjYWxsYmFjayBmdW5jdGlvblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcyB0aGUgZGV2aWNlTGlzdCBhcnJheSBhcyBpdHMgb25seSBhcmd1bWVudDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImVycm9yQ2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGVycm9yXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGFzIGl0cyBhcmd1bWVudC48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlJldHVybnMgYSBQcm9taXNlIHRoYXQgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGNhbGxiYWNrcywgc2ltaWxhclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBlbnVtZXJhdGVEZXZpY2VzKCkgbWV0aG9kXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuIDxkaXY+PGNvZGU+XFxuIHZhciBhdWRpb2dyYWI7XFxuXFxuIGZ1bmN0aW9uIHNldHVwKCl7XFxuICAgLy9uZXcgYXVkaW9JblxcbiAgIGF1ZGlvR3JhYiA9IG5ldyBwNS5BdWRpb0luKCk7XFxuXFxuICAgYXVkaW9HcmFiLmdldFNvdXJjZXMoZnVuY3Rpb24oZGV2aWNlTGlzdCkge1xcbiAgICAgLy9wcmludCBvdXQgdGhlIGFycmF5IG9mIGF2YWlsYWJsZSBzb3VyY2VzXFxuICAgICBjb25zb2xlLmxvZyhkZXZpY2VMaXN0KTtcXG4gICAgIC8vc2V0IHRoZSBzb3VyY2UgdG8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGRldmljZUxpc3QgYXJyYXlcXG4gICAgIGF1ZGlvR3JhYi5zZXRTb3VyY2UoMCk7XFxuICAgfSk7XFxuIH1cXG4gPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkF1ZGlvSW5cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzMyMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIGlucHV0IHNvdXJjZS4gQWNjZXB0cyBhIG51bWJlciByZXByZXNlbnRpbmcgYVxcbnBvc2l0aW9uIGluIHRoZSBhcnJheSByZXR1cm5lZCBieSBnZXRTb3VyY2VzKCkuXFxuVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBicm93c2VycyB0aGF0IHN1cHBvcnRcXG4mbHQ7YSB0aXRsZT0mcXVvdDtNZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpIC0gV2ViIEFQSXMgfCBNRE4mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyBocmVmPVxcbiZxdW90OzxhIGhyZWY9XFxcImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9NZWRpYURldmljZXMvZW51bWVyYXRlRGV2aWNlc1xcXCI+aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01lZGlhRGV2aWNlcy9lbnVtZXJhdGVEZXZpY2VzPC9hPiZxdW90OzwvcD5cXG48YmxvY2txdW90ZT5cXG48cD5uYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKTwvYT4uPGJyLz48L3A+XFxuPC9ibG9ja3F1b3RlPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0U291cmNlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJudW1cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnBvc2l0aW9uIG9mIGlucHV0IHNvdXJjZSBpbiB0aGUgYXJyYXk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5BdWRpb0luXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDczNjMsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQXVkaW9JblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3Mzc5LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkF1ZGlvSW5cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzQwMyxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5BdWRpb0luXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc0MjksXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQXVkaW9JblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3NDUxLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkF1ZGlvSW5cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzQ3MyxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5BdWRpb0luXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc1MTksXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQXVkaW9JblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3NTUwLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkF1ZGlvSW5cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogNzU2OCxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5BdWRpb0luXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDc5MDUsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQXVkaW9JblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA3OTI3LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkF1ZGlvSW5cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODAwMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5JbiBjbGFzc2VzIHRoYXQgZXh0ZW5kXFxucDUuRWZmZWN0LCBjb25uZWN0IGVmZmVjdCBub2Rlc1xcbnRvIHRoZSB3ZXQgcGFyYW1ldGVyPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVmZmVjdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4MDE2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgb3V0cHV0IHZvbHVtZSBvZiB0aGUgZmlsdGVyLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFtcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidm9sXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hbXBsaXR1ZGUgYmV0d2VlbiAwIGFuZCAxLjA8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFtcFRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmNyZWF0ZSBhIGZhZGUgdGhhdCBsYXN0cyB1bnRpbCByYW1wVGltZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0RnJvbU5vd1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c2NoZWR1bGUgdGhpcyBldmVudCB0byBoYXBwZW4gaW4gdEZyb21Ob3cgc2Vjb25kczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRWZmZWN0XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgwMzMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TGluayBlZmZlY3RzIHRvZ2V0aGVyIGluIGEgY2hhaW5cXG5FeGFtcGxlIHVzYWdlOiBmaWx0ZXIuY2hhaW4ocmV2ZXJiLCBkZWxheSwgcGFubmVyKTtcXG5NYXkgYmUgdXNlZCB3aXRoIGFuIG9wZW4tZW5kZWQgbnVtYmVyIG9mIGFyZ3VtZW50czwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNoYWluXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhcmd1bWVudHNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNoYWluIHRvZ2V0aGVyIG11bHRpcGxlIHNvdW5kIG9iamVjdHM8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVmZmVjdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4MDUwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFkanVzdCB0aGUgZHJ5L3dldCB2YWx1ZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkcnl3ZXRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZhZGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBkZXNpcmVkIGRyeXdldCB2YWx1ZSAoMCAtIDEuMCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVmZmVjdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4MDYyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNlbmQgb3V0cHV0IHRvIGEgcDUuanMtc291bmQsIFdlYiBBdWRpbyBOb2RlLCBvciB1c2Ugc2lnbmFsIHRvXFxuY29udHJvbCBhbiBBdWRpb1BhcmFtPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29ubmVjdFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5FZmZlY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODA3MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EaXNjb25uZWN0IGFsbCBvdXRwdXQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGlzY29ubmVjdFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVmZmVjdFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4MTgxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBwNS5GaWx0ZXIgaXMgYnVpbHQgd2l0aCBhXFxuPGEgaHJlZj1cXFwiaHR0cDovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI0JpcXVhZEZpbHRlck5vZGVcXFwiPlxcbldlYiBBdWRpbyBCaXF1YWRGaWx0ZXIgTm9kZTwvYT4uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJiaXF1YWRGaWx0ZXJcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIkRlbGF5Tm9kZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkZpbHRlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4MTk5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkZpbHRlciBhbiBhdWRpbyBzaWduYWwgYWNjb3JkaW5nIHRvIGEgc2V0XFxub2YgZmlsdGVyIHBhcmFtZXRlcnMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicHJvY2Vzc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiU2lnbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BbiBvYmplY3QgdGhhdCBvdXRwdXRzIGF1ZGlvPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmcmVxXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5GcmVxdWVuY3kgaW4gSHosIGZyb20gMTAgdG8gMjIwNTA8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXNvbmFuY2UvV2lkdGggb2YgdGhlIGZpbHRlciBmcmVxdWVuY3lcXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbSAwLjAwMSB0byAxMDAwPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5GaWx0ZXJcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODIxMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIGZyZXF1ZW5jeSBhbmQgdGhlIHJlc29uYW5jZSBvZiB0aGUgZmlsdGVyLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnJlcVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RnJlcXVlbmN5IGluIEh6LCBmcm9tIDEwIHRvIDIyMDUwPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmVzb25hbmNlIChRKSBmcm9tIDAuMDAxIHRvIDEwMDA8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZUZyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNjaGVkdWxlIHRoaXMgZXZlbnQgdG8gaGFwcGVuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyBmcm9tIG5vdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRmlsdGVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgyMzAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHRoZSBmaWx0ZXIgZnJlcXVlbmN5LCBpbiBIeiwgZnJvbSAxMCB0byAyMjA1MCAodGhlIHJhbmdlIG9mXFxuaHVtYW4gaGVhcmluZywgYWx0aG91Z2ggaW4gcmVhbGl0eSBtb3N0IHBlb3BsZSBoZWFyIGluIGEgbmFycm93ZXJcXG5yYW5nZSkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnJlcVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZnJlcVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RmlsdGVyIEZyZXF1ZW5jeTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZUZyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNjaGVkdWxlIHRoaXMgZXZlbnQgdG8gaGFwcGVuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyBmcm9tIG5vdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInZhbHVlICBSZXR1cm5zIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkZpbHRlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4MjU1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbnRyb2xzIGVpdGhlciB3aWR0aCBvZiBhIGJhbmRwYXNzIGZyZXF1ZW5jeSxcXG5vciB0aGUgcmVzb25hbmNlIG9mIGEgbG93L2hpZ2hwYXNzIGN1dG9mZiBmcmVxdWVuY3kuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVzXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyZXNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlc29uYW5jZS9XaWR0aCBvZiBmaWx0ZXIgZnJlcVxcbiAgICAgICAgICAgICAgICAgICAgIGZyb20gMC4wMDEgdG8gMTAwMDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZUZyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNjaGVkdWxlIHRoaXMgZXZlbnQgdG8gaGFwcGVuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyBmcm9tIG5vdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInZhbHVlIFJldHVybnMgdGhlIGN1cnJlbnQgcmVzIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRmlsdGVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgyNzcsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29udHJvbHMgdGhlIGdhaW4gYXR0cmlidXRlIG9mIGEgQmlxdWFkIEZpbHRlci5cXG5UaGlzIGlzIGRpc3RpbmN0bHkgZGlmZmVyZW50IGZyb20gLmFtcCgpIHdoaWNoIGlzIGluaGVyaXRlZCBmcm9tIHA1LkVmZmVjdFxcbi5hbXAoKSBjb250cm9scyB0aGUgdm9sdW1lIHZpYSB0aGUgb3V0cHV0IGdhaW4gbm9kZVxcbnA1LkZpbHRlci5nYWluKCkgY29udHJvbHMgdGhlIGdhaW4gcGFyYW1ldGVyIG9mIGEgQmlxdWFkIEZpbHRlciBub2RlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImdhaW5cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImdhaW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlJldHVybnMgdGhlIGN1cnJlbnQgb3IgdXBkYXRlZCBnYWluIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRmlsdGVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDgyOTgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VG9nZ2xlIGZ1bmN0aW9uLiBTd2l0Y2hlcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgYWxscGFzczwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRvZ2dsZVwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJbVG9nZ2xlIHZhbHVlXVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5GaWx0ZXJcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODMxMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIHR5cGUgb2YgYSBwNS5GaWx0ZXIuIFBvc3NpYmxlIHR5cGVzIGluY2x1ZGU6XFxuJnF1b3Q7bG93cGFzcyZxdW90OyAoZGVmYXVsdCksICZxdW90O2hpZ2hwYXNzJnF1b3Q7LCAmcXVvdDtiYW5kcGFzcyZxdW90OyxcXG4mcXVvdDtsb3dzaGVsZiZxdW90OywgJnF1b3Q7aGlnaHNoZWxmJnF1b3Q7LCAmcXVvdDtwZWFraW5nJnF1b3Q7LCAmcXVvdDtub3RjaCZxdW90OyxcXG4mcXVvdDthbGxwYXNzJnF1b3Q7LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFR5cGVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRmlsdGVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDg1MTYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHA1LkVRIGlzIGJ1aWx0IHdpdGggYWJzdHJhY3RlZCBwNS5GaWx0ZXIgb2JqZWN0cy5cXG5UbyBtb2RpZnkgYW55IGJhbmRzLCB1c2UgbWV0aG9kcyBvZiB0aGUgPGFcXG5ocmVmPVxcXCIvcmVmZXJlbmNlLyMvcDUuRmlsdGVyXFxcIiB0aXRsZT1cXFwicDUuRmlsdGVyIHJlZmVyZW5jZVxcXCI+XFxucDUuRmlsdGVyPC9hPiBBUEksIGVzcGVjaWFsbHkgPGNvZGU+Z2FpbjwvY29kZT4gYW5kIDxjb2RlPmZyZXE8L2NvZGU+LlxcbkJhbmRzIGFyZSBzdG9yZWQgaW4gYW4gYXJyYXksIHdpdGggaW5kaWNlcyAwIC0gMywgb3IgMCAtIDc8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImJhbmRzXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkVRXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDg1NTEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UHJvY2VzcyBhbiBpbnB1dCBieSBjb25uZWN0aW5nIGl0IHRvIHRoZSBFUTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInByb2Nlc3NcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNyY1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXVkaW8gc291cmNlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRVFcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODYzNyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD48YSB0aXRsZT1cXFwiV2ViIEF1ZGlvIFBhbm5lciBkb2NzXFxcIiAgaHJlZj1cXG5cXFwiaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bhbm5lck5vZGVcXFwiPlxcbldlYiBBdWRpbyBTcGF0aWFsIFBhbm5lciBOb2RlPC9hPjwvcD5cXG48cD5Qcm9wZXJ0aWVzIGluY2x1ZGU8L3A+XFxuPHVsPlxcbjxsaT4mbHQ7YSB0aXRsZT0mcXVvdDt3MyBzcGVjIGZvciBQYW5uaW5nIE1vZGVsJnF1b3Q7XFxuaHJlZj0mcXVvdDs8YSBocmVmPVxcXCJodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI2lkbC1kZWYtUGFubmluZ01vZGVsVHlwZVxcXCI+aHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1ZGlvLyNpZGwtZGVmLVBhbm5pbmdNb2RlbFR5cGU8L2E+JnF1b3Q7PGJsb2NrcXVvdGU+XFxuPHA+cGFubmluZ01vZGVsPC9hPjogJnF1b3Q7ZXF1YWwgcG93ZXImcXVvdDsgb3IgJnF1b3Q7SFJURiZxdW90OzwvcD5cXG48L2Jsb2NrcXVvdGU+XFxuPC9saT5cXG48bGk+Jmx0O2EgdGl0bGU9JnF1b3Q7dzMgc3BlYyBmb3IgRGlzdGFuY2UgTW9kZWwmcXVvdDtcXG5ocmVmPSZxdW90OzxhIGhyZWY9XFxcImh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdWRpby8jaWRsLWRlZi1EaXN0YW5jZU1vZGVsVHlwZVxcXCI+aHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1ZGlvLyNpZGwtZGVmLURpc3RhbmNlTW9kZWxUeXBlPC9hPiZxdW90OzxibG9ja3F1b3RlPlxcbjxwPmRpc3RhbmNlTW9kZWw8L2E+OiAmcXVvdDtsaW5lYXImcXVvdDssICZxdW90O2ludmVyc2UmcXVvdDssIG9yICZxdW90O2V4cG9uZW50aWFsJnF1b3Q7PC9wPlxcbjwvYmxvY2txdW90ZT5cXG48L2xpPlxcbjwvdWw+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBhbm5lclwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXVkaW9Ob2RlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFubmVyM0RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODY2MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db25uZWN0IGFuIGF1ZGlvIHNvcmNlPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicHJvY2Vzc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5JbnB1dCBzb3VyY2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QYW5uZXIzRFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4NjY5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgWCxZLFogcG9zaXRpb24gb2YgdGhlIFBhbm5lcjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwieFZhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInlWYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ6VmFsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiVXBkYXRlZCB4LCB5LCB6IHZhbHVlcyBhcyBhbiBhcnJheVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkFycmF5XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFubmVyM0RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODY4OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5HZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBwb3NpdGlvbiBjb29yZGluYXRlczwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBvc2l0aW9uWFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1cGRhdGVkIGNvb3JkaW5hdGUgdmFsdWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QYW5uZXIzRFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4NjkzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIHBvc2l0aW9uIGNvb3JkaW5hdGVzPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicG9zaXRpb25ZXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInVwZGF0ZWQgY29vcmRpbmF0ZSB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBhbm5lcjNEXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDg2OTgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+R2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgcG9zaXRpb24gY29vcmRpbmF0ZXM8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwb3NpdGlvblpcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidXBkYXRlZCBjb29yZGluYXRlIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFubmVyM0RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODczNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIFgsWSxaIHBvc2l0aW9uIG9mIHRoZSBQYW5uZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJvcmllbnRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInhWYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ5VmFsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwielZhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlVwZGF0ZWQgeCwgeSwgeiB2YWx1ZXMgYXMgYW4gYXJyYXlcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBhbm5lcjNEXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDg3NTUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+R2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3Igb3JpZW50IGNvb3JkaW5hdGVzPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwib3JpZW50WFwiLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1cGRhdGVkIGNvb3JkaW5hdGUgdmFsdWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QYW5uZXIzRFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4NzYwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIG9yaWVudCBjb29yZGluYXRlczwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm9yaWVudFlcIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidXBkYXRlZCBjb29yZGluYXRlIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFubmVyM0RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODc2NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5HZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBvcmllbnQgY29vcmRpbmF0ZXM8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJvcmllbnRaXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInVwZGF0ZWQgY29vcmRpbmF0ZSB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBhbm5lcjNEXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDg4MDMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHRoZSByb2xsb2ZmIGZhY3RvciBhbmQgbWF4IGRpc3RhbmNlPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0RmFsbG9mZlwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibWF4RGlzdGFuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJvbGxvZmZGYWN0b3JcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QYW5uZXIzRFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA4ODEzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk1heGl1bSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRoZSBsaXN0ZW5lcjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm1heERpc3RcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm1heERpc3RhbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1cGRhdGVkIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFubmVyM0RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogODgyNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Ib3cgcXVpY2tseSB0aGUgdm9sdW1lIGlzIHJlZHVjZWQgYXMgdGhlIHNvdXJjZSBtb3ZlcyBhd2F5IGZyb20gdGhlIGxpc3RlbmVyPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicm9sbG9mXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyb2xsb2ZmRmFjdG9yXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1cGRhdGVkIHZhbHVlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFubmVyM0RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTEyOCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgcDUuRGVsYXkgaXMgYnVpbHQgd2l0aCB0d29cXG48YSBocmVmPVxcXCJodHRwOi8vd3d3LnczLm9yZy9UUi93ZWJhdWRpby8jRGVsYXlOb2RlXFxcIj5cXG5XZWIgQXVkaW8gRGVsYXkgTm9kZXM8L2E+LCBvbmUgZm9yIGVhY2ggc3RlcmVvIGNoYW5uZWwuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJsZWZ0RGVsYXlcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIkRlbGF5Tm9kZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkRlbGF5XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDkxMzYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHA1LkRlbGF5IGlzIGJ1aWx0IHdpdGggdHdvXFxuPGEgaHJlZj1cXFwiaHR0cDovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI0RlbGF5Tm9kZVxcXCI+XFxuV2ViIEF1ZGlvIERlbGF5IE5vZGVzPC9hPiwgb25lIGZvciBlYWNoIHN0ZXJlbyBjaGFubmVsLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicmlnaHREZWxheVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRGVsYXlOb2RlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRGVsYXlcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTE2OCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BZGQgZGVsYXkgdG8gYW4gYXVkaW8gc2lnbmFsIGFjY29yZGluZyB0byBhIHNldFxcbm9mIGRlbGF5IHBhcmFtZXRlcnMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicHJvY2Vzc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiU2lnbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BbiBvYmplY3QgdGhhdCBvdXRwdXRzIGF1ZGlvPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZWxheVRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRpbWUgKGluIHNlY29uZHMpIG9mIHRoZSBkZWxheS9lY2hvLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZSBicm93c2VycyBsaW1pdCBkZWxheVRpbWUgdG9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgc2Vjb25kLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmZWVkYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c2VuZHMgdGhlIGRlbGF5IGJhY2sgdGhyb3VnaCBpdHNlbGZcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGEgbG9vcCB0aGF0IGRlY3JlYXNlcyBpbiB2b2x1bWVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggdGltZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibG93UGFzc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q3V0b2ZmIGZyZXF1ZW5jeS4gT25seSBmcmVxdWVuY2llc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cgdGhlIGxvd1Bhc3Mgd2lsbCBiZSBwYXJ0IG9mIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5EZWxheVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5MjAzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgZGVsYXkgKGVjaG8pIHRpbWUsIGluIHNlY29uZHMuIFVzdWFsbHkgdGhpcyB2YWx1ZSB3aWxsIGJlXFxuYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDEuMC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkZWxheVRpbWVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImRlbGF5VGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGltZSAoaW4gc2Vjb25kcykgb2YgdGhlIGRlbGF5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRGVsYXlcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTIyMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5GZWVkYmFjayBvY2N1cnMgd2hlbiBEZWxheSBzZW5kcyBpdHMgc2lnbmFsIGJhY2sgdGhyb3VnaCBpdHMgaW5wdXRcXG5pbiBhIGxvb3AuIFRoZSBmZWVkYmFjayBhbW91bnQgZGV0ZXJtaW5lcyBob3cgbXVjaCBzaWduYWwgdG8gc2VuZCBlYWNoXFxudGltZSB0aHJvdWdoIHRoZSBsb29wLiBBIGZlZWRiYWNrIGdyZWF0ZXIgdGhhbiAxLjAgaXMgbm90IGRlc2lyYWJsZSBiZWNhdXNlXFxuaXQgd2lsbCBpbmNyZWFzZSB0aGUgb3ZlcmFsbCBvdXRwdXQgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsXFxuY3JlYXRpbmcgYW4gaW5maW5pdGUgZmVlZGJhY2sgbG9vcC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC41PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZmVlZGJhY2tcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZlZWRiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD4wLjAgdG8gMS4wLCBvciBhbiBvYmplY3Qgc3VjaCBhcyBhblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3NjaWxsYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGF0ZSB0aGlzIHBhcmFtPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJ8T2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJyZXR1cm5cIjoge1xuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJGZWVkYmFjayB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkRlbGF5XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDkyNTAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IGEgbG93cGFzcyBmaWx0ZXIgZnJlcXVlbmN5IGZvciB0aGUgZGVsYXkuIEEgbG93cGFzcyBmaWx0ZXJcXG53aWxsIGN1dCBvZmYgYW55IGZyZXF1ZW5jaWVzIGhpZ2hlciB0aGFuIHRoZSBmaWx0ZXIgZnJlcXVlbmN5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImZpbHRlclwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY3V0b2ZmRnJlcVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QSBsb3dwYXNzIGZpbHRlciB3aWxsIGN1dCBvZmYgYW55XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzIGhpZ2hlciB0aGFuIHRoZSBmaWx0ZXIgZnJlcXVlbmN5LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyfE9iamVjdFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmVzb25hbmNlIG9mIHRoZSBmaWx0ZXIgZnJlcXVlbmN5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZiwgb3IgYW4gb2JqZWN0IChpLmUuIGEgcDUuT3NjaWxsYXRvcilcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjYW4gYmUgdXNlZCB0byBtb2R1bGF0ZSB0aGlzIHBhcmFtZXRlci5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlnaCBudW1iZXJzIChpLmUuIDE1KSB3aWxsIHByb2R1Y2UgYSByZXNvbmFuY2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdyBudW1iZXJzIChpLmUuIC4yKSB3aWxsIHByb2R1Y2UgYSBzbG9wZS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcnxPYmplY3RcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRGVsYXlcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTI2NyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5DaG9vc2UgYSBwcmVzZXQgdHlwZSBvZiBkZWxheS4gJiMzOTtwaW5nUG9uZyYjMzk7IGJvdW5jZXMgdGhlIHNpZ25hbFxcbmZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0IGNoYW5uZWwgdG8gcHJvZHVjZSBhIHN0ZXJlbyBlZmZlY3QuXFxuQW55IG90aGVyIHBhcmFtZXRlciB3aWxsIHJldmVydCB0byB0aGUgZGVmYXVsdCBkZWxheSBzZXR0aW5nLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFR5cGVcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPiYjMzk7cGluZ1BvbmcmIzM5OyAoMSkgb3IgJiMzOTtkZWZhdWx0JiMzOTsgKDApPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmd8TnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkRlbGF5XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDkzMDAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHRoZSBvdXRwdXQgbGV2ZWwgb2YgdGhlIGRlbGF5IGVmZmVjdC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhbXBcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZvbHVtZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YW1wbGl0dWRlIGJldHdlZW4gMCBhbmQgMS4wPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyYW1wVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y3JlYXRlIGEgZmFkZSB0aGF0IGxhc3RzIHJhbXBUaW1lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zY2hlZHVsZSB0aGlzIGV2ZW50IHRvIGhhcHBlblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgZnJvbSBub3c8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkRlbGF5XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDkzMDksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2VuZCBvdXRwdXQgdG8gYSBwNS5zb3VuZCBvciB3ZWIgYXVkaW8gb2JqZWN0PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29ubmVjdFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5EZWxheVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5MzE1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRpc2Nvbm5lY3QgYWxsIG91dHB1dC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkaXNjb25uZWN0XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRGVsYXlcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTM5NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db25uZWN0IGEgc291cmNlIHRvIHRoZSByZXZlcmIsIGFuZCBhc3NpZ24gcmV2ZXJiIHBhcmFtZXRlcnMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicHJvY2Vzc1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3JjXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5zb3VuZCAvIFdlYiBBdWRpbyBvYmplY3Qgd2l0aCBhIHNvdW5kXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNlY29uZHNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkR1cmF0aW9uIG9mIHRoZSByZXZlcmIsIGluIHNlY29uZHMuXFxuICAgICAgICAgICAgICAgICAgICAgICAgIE1pbjogMCwgTWF4OiAxMC4gRGVmYXVsdHMgdG8gMy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGVjYXlSYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5QZXJjZW50YWdlIG9mIGRlY2F5IHdpdGggZWFjaCBlY2hvLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTWluOiAwLCBNYXg6IDEwMC4gRGVmYXVsdHMgdG8gMi48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmV2ZXJzZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UGxheSB0aGUgcmV2ZXJiIGJhY2t3YXJkcyBvciBmb3J3YXJkcy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5SZXZlcmJcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTQyMyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIHJldmVyYiBzZXR0aW5ncy4gU2ltaWxhciB0byAucHJvY2VzcygpLCBidXQgd2l0aG91dFxcbmFzc2lnbmluZyBhIG5ldyBpbnB1dC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNlY29uZHNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkR1cmF0aW9uIG9mIHRoZSByZXZlcmIsIGluIHNlY29uZHMuXFxuICAgICAgICAgICAgICAgICAgICAgICAgIE1pbjogMCwgTWF4OiAxMC4gRGVmYXVsdHMgdG8gMy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGVjYXlSYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5QZXJjZW50YWdlIG9mIGRlY2F5IHdpdGggZWFjaCBlY2hvLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTWluOiAwLCBNYXg6IDEwMC4gRGVmYXVsdHMgdG8gMi48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmV2ZXJzZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UGxheSB0aGUgcmV2ZXJiIGJhY2t3YXJkcyBvciBmb3J3YXJkcy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5SZXZlcmJcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTQ1MSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIG91dHB1dCBsZXZlbCBvZiB0aGUgcmV2ZXJiIGVmZmVjdC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJhbXBcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZvbHVtZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+YW1wbGl0dWRlIGJldHdlZW4gMCBhbmQgMS4wPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyYW1wVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Y3JlYXRlIGEgZmFkZSB0aGF0IGxhc3RzIHJhbXBUaW1lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zY2hlZHVsZSB0aGlzIGV2ZW50IHRvIGhhcHBlblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgZnJvbSBub3c8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlJldmVyYlwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5NDYwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNlbmQgb3V0cHV0IHRvIGEgcDUuc291bmQgb3Igd2ViIGF1ZGlvIG9iamVjdDwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbm5lY3RcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInVuaXRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUmV2ZXJiXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDk0NjYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+RGlzY29ubmVjdCBhbGwgb3V0cHV0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRpc2Nvbm5lY3RcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5SZXZlcmJcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTU2MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5JbnRlcm5hbGx5LCB0aGUgcDUuQ29udm9sdmVyIHVzZXMgdGhlIGFcXG48YSBocmVmPVxcXCJodHRwOi8vd3d3LnczLm9yZy9UUi93ZWJhdWRpby8jQ29udm9sdmVyTm9kZVxcXCI+XFxuV2ViIEF1ZGlvIENvbnZvbHZlciBOb2RlPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbnZvbHZlck5vZFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ29udm9sdmVyTm9kZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbnZvbHZlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5NTg1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNyZWF0ZSBhIHA1LkNvbnZvbHZlci4gQWNjZXB0cyBhIHBhdGggdG8gYSBzb3VuZGZpbGVcXG50aGF0IHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhbiBpbXB1bHNlIHJlc3BvbnNlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNyZWF0ZUNvbnZvbHZlclwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cGF0aCB0byBhIHNvdW5kIGZpbGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBjYWxsIGlmIGxvYWRpbmcgaXMgc3VjY2Vzc2Z1bC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgb2JqZWN0IHdpbGwgYmUgcGFzc2VkIGluIGFzIHRoZSBhcmd1bWVudFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiB0byBjYWxsIGlmIGxvYWRpbmcgaXMgbm90IHN1Y2Nlc3NmdWwuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBjdXN0b20gZXJyb3Igd2lsbCBiZSBwYXNzZWQgaW4gYXMgdGhlIGFyZ3VtZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuQ29udm9sdmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImV4YW1wbGVcIjogW1xuICAgICAgICAgICAgICAgIFwiXFxuPGRpdj48Y29kZT5cXG52YXIgY1ZlcmIsIHNvdW5kO1xcbmZ1bmN0aW9uIHByZWxvYWQoKSB7XFxuICAvLyBXZSBoYXZlIGJvdGggTVAzIGFuZCBPR0cgdmVyc2lvbnMgb2YgYWxsIHNvdW5kIGFzc2V0c1xcbiAgc291bmRGb3JtYXRzKCdvZ2cnLCAnbXAzJyk7XFxuXFxuICAvLyBUcnkgcmVwbGFjaW5nICdieC1zcHJpbmcnIHdpdGggb3RoZXIgc291bmRmaWxlcyBsaWtlXFxuICAvLyAnY29uY3JldGUtdHVubmVsJyAnc21hbGwtcGxhdGUnICdkcnVtJyAnYmVhdGJveCdcXG4gIGNWZXJiID0gY3JlYXRlQ29udm9sdmVyKCdhc3NldHMvYngtc3ByaW5nLm1wMycpO1xcblxcbiAgLy8gVHJ5IHJlcGxhY2luZyAnRGFtc2NyYXlfRGFuY2luZ1RpZ2VyJyB3aXRoXFxuICAvLyAnYmVhdCcsICdkb29yYmVsbCcsIGx1Y2t5X2RyYWdvbnMnXFxuICBzb3VuZCA9IGxvYWRTb3VuZCgnYXNzZXRzL0RhbXNjcmF5X0RhbmNpbmdUaWdlci5tcDMnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAvLyBkaXNjb25uZWN0IGZyb20gbWFzdGVyIG91dHB1dC4uLlxcbiAgc291bmQuZGlzY29ubmVjdCgpO1xcblxcbiAgLy8gLi4uYW5kIHByb2Nlc3Mgd2l0aCBjVmVyYlxcbiAgLy8gc28gdGhhdCB3ZSBvbmx5IGhlYXIgdGhlIGNvbnZvbHV0aW9uXFxuICBjVmVyYi5wcm9jZXNzKHNvdW5kKTtcXG5cXG4gIHNvdW5kLnBsYXkoKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbnZvbHZlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5NzAxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbm5lY3QgYSBzb3VyY2UgdG8gdGhlIHJldmVyYiwgYW5kIGFzc2lnbiByZXZlcmIgcGFyYW1ldGVycy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwcm9jZXNzXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzcmNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LnNvdW5kIC8gV2ViIEF1ZGlvIG9iamVjdCB3aXRoIGEgc291bmRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJleGFtcGxlXCI6IFtcbiAgICAgICAgICAgICAgICBcIlxcbjxkaXY+PGNvZGU+XFxudmFyIGNWZXJiLCBzb3VuZDtcXG5mdW5jdGlvbiBwcmVsb2FkKCkge1xcbiAgc291bmRGb3JtYXRzKCdvZ2cnLCAnbXAzJyk7XFxuXFxuICBjVmVyYiA9IGNyZWF0ZUNvbnZvbHZlcignYXNzZXRzL2NvbmNyZXRlLXR1bm5lbC5tcDMnKTtcXG5cXG4gIHNvdW5kID0gbG9hZFNvdW5kKCdhc3NldHMvYmVhdC5tcDMnKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0dXAoKSB7XFxuICAvLyBkaXNjb25uZWN0IGZyb20gbWFzdGVyIG91dHB1dC4uLlxcbiAgc291bmQuZGlzY29ubmVjdCgpO1xcblxcbiAgLy8gLi4uYW5kIHByb2Nlc3Mgd2l0aCAoaS5lLiBjb25uZWN0IHRvKSBjVmVyYlxcbiAgLy8gc28gdGhhdCB3ZSBvbmx5IGhlYXIgdGhlIGNvbnZvbHV0aW9uXFxuICBjVmVyYi5wcm9jZXNzKHNvdW5kKTtcXG5cXG4gIHNvdW5kLnBsYXkoKTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbnZvbHZlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5NzMzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPklmIHlvdSBsb2FkIG11bHRpcGxlIGltcHVsc2UgZmlsZXMgdXNpbmcgdGhlIC5hZGRJbXB1bHNlIG1ldGhvZCxcXG50aGV5IHdpbGwgYmUgc3RvcmVkIGFzIE9iamVjdHMgaW4gdGhpcyBBcnJheS4gVG9nZ2xlIGJldHdlZW4gdGhlbVxcbndpdGggdGhlIDxjb2RlPnRvZ2dsZUltcHVsc2UoaWQpPC9jb2RlPiBtZXRob2QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJpbXB1bHNlc1wiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Db252b2x2ZXJcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTc0MSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Mb2FkIGFuZCBhc3NpZ24gYSBuZXcgSW1wdWxzZSBSZXNwb25zZSB0byB0aGUgcDUuQ29udm9sdmVyLlxcblRoZSBpbXB1bHNlIGlzIGFkZGVkIHRvIHRoZSA8Y29kZT4uaW1wdWxzZXM8L2NvZGU+IGFycmF5LiBQcmV2aW91c1xcbmltcHVsc2VzIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIHRoZSA8Y29kZT4udG9nZ2xlSW1wdWxzZShpZCk8L2NvZGU+XFxubWV0aG9kLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFkZEltcHVsc2VcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBhdGhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnBhdGggdG8gYSBzb3VuZCBmaWxlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+ZnVuY3Rpb24gKG9wdGlvbmFsKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJlcnJvckNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiAob3B0aW9uYWwpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Db252b2x2ZXJcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogOTc1OSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TaW1pbGFyIHRvIC5hZGRJbXB1bHNlLCBleGNlcHQgdGhhdCB0aGUgPGNvZGU+LmltcHVsc2VzPC9jb2RlPlxcbkFycmF5IGlzIHJlc2V0IHRvIHNhdmUgbWVtb3J5LiBBIG5ldyA8Y29kZT4uaW1wdWxzZXM8L2NvZGU+XFxuYXJyYXkgaXMgY3JlYXRlZCB3aXRoIHRoaXMgaW1wdWxzZSBhcyB0aGUgb25seSBpdGVtLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlc2V0SW1wdWxzZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+cGF0aCB0byBhIHNvdW5kIGZpbGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImNhbGxiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5mdW5jdGlvbiAob3B0aW9uYWwpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImVycm9yQ2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmZ1bmN0aW9uIChvcHRpb25hbCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIkZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbnZvbHZlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiA5Nzc3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPklmIHlvdSBoYXZlIHVzZWQgPGNvZGU+LmFkZEltcHVsc2UoKTwvY29kZT4gdG8gYWRkIG11bHRpcGxlIGltcHVsc2VzXFxudG8gYSBwNS5Db252b2x2ZXIsIHRoZW4geW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gdG9nZ2xlIGJldHdlZW5cXG50aGUgaXRlbXMgaW4gdGhlIDxjb2RlPi5pbXB1bHNlczwvY29kZT4gQXJyYXkuIEFjY2VwdHMgYSBwYXJhbWV0ZXJcXG50byBpZGVudGlmeSB3aGljaCBpbXB1bHNlIHlvdSB3aXNoIHRvIHVzZSwgaWRlbnRpZmllZCBlaXRoZXIgYnkgaXRzXFxub3JpZ2luYWwgZmlsZW5hbWUgKFN0cmluZykgb3IgYnkgaXRzIHBvc2l0aW9uIGluIHRoZSA8Y29kZT4uaW1wdWxzZXNcXG48L2NvZGU+IEFycmF5IChOdW1iZXIpLjxici8+XFxuWW91IGNhbiBhY2Nlc3MgdGhlIG9iamVjdHMgaW4gdGhlIC5pbXB1bHNlcyBBcnJheSBkaXJlY3RseS4gRWFjaFxcbk9iamVjdCBoYXMgdHdvIGF0dHJpYnV0ZXM6IGFuIDxjb2RlPi5hdWRpb0J1ZmZlcjwvY29kZT4gKHR5cGU6XFxuV2ViIEF1ZGlvIDxhIGhyZWY9XFxcIlxcbmh0dHA6Ly93ZWJhdWRpby5naXRodWIuaW8vd2ViLWF1ZGlvLWFwaS8jdGhlLWF1ZGlvYnVmZmVyLWludGVyZmFjZVxcXCI+XFxuQXVkaW9CdWZmZXIpPC9hPiBhbmQgYSA8Y29kZT4ubmFtZTwvY29kZT4sIGEgU3RyaW5nIHRoYXQgY29ycmVzcG9uZHNcXG53aXRoIHRoZSBvcmlnaW5hbCBmaWxlbmFtZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0b2dnbGVJbXB1bHNlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJpZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+SWRlbnRpZnkgdGhlIGltcHVsc2UgYnkgaXRzIG9yaWdpbmFsIGZpbGVuYW1lXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSwgb3IgYnkgaXRzIHBvc2l0aW9uIGluIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+LmltcHVsc2VzPC9jb2RlPiBBcnJheSAoTnVtYmVyKS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ3xOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQ29udm9sdmVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDk4MjEsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQ29udm9sdmVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDk4NDYsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQ29udm9sdmVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwMDQxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgZ2xvYmFsIHRlbXBvLCBpbiBiZWF0cyBwZXIgbWludXRlLCBmb3IgYWxsXFxucDUuUGFydHMuIFRoaXMgbWV0aG9kIHdpbGwgaW1wYWN0IGFsbCBhY3RpdmUgcDUuUGFydHMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0QlBNXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJCUE1cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkJlYXRzIFBlciBNaW51dGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJhbXBUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZWNvbmRzIGZyb20gbm93PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQ29udm9sdmVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwMTMxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFycmF5IG9mIHZhbHVlcyB0byBwYXNzIGludG8gdGhlIGNhbGxiYWNrXFxuYXQgZWFjaCBzdGVwIG9mIHRoZSBwaHJhc2UuIERlcGVuZGluZyBvbiB0aGUgY2FsbGJhY2tcXG5mdW5jdGlvbiYjMzk7cyByZXF1aXJlbWVudHMsIHRoZXNlIHZhbHVlcyBtYXkgYmUgbnVtYmVycyxcXG5zdHJpbmdzLCBvciBhbiBvYmplY3Qgd2l0aCBtdWx0aXBsZSBwYXJhbWV0ZXJzLlxcblplcm8gKDApIGluZGljYXRlcyBhIHJlc3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXF1ZW5jZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXJyYXlcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QaHJhc2VcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTAyMTksXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHRoZSB0ZW1wbyBvZiB0aGlzIHBhcnQsIGluIEJlYXRzIFBlciBNaW51dGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0QlBNXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJCUE1cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkJlYXRzIFBlciBNaW51dGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJhbXBUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZWNvbmRzIGZyb20gbm93PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QYXJ0XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwMjI5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybnMgdGhlIEJlYXRzIFBlciBNaW51dGUgb2YgdGhpcyBjdXJyZW50bHkgcGFydC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRCUE1cIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFydFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDIzOCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TdGFydCBwbGF5YmFjayBvZiB0aGlzIHBhcnQuIEl0IHdpbGwgcGxheVxcbnRocm91Z2ggYWxsIG9mIGl0cyBwaHJhc2VzIGF0IGEgc3BlZWRcXG5kZXRlcm1pbmVkIGJ5IHNldEJQTS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzdGFydFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+c2Vjb25kcyBmcm9tIG5vdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFydFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDI1NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Mb29wIHBsYXliYWNrIG9mIHRoaXMgcGFydC4gSXQgd2lsbCBiZWdpblxcbmxvb3BpbmcgdGhyb3VnaCBhbGwgb2YgaXRzIHBocmFzZXMgYXQgYSBzcGVlZFxcbmRldGVybWluZWQgYnkgc2V0QlBNLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImxvb3BcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNlY29uZHMgZnJvbSBub3c8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBhcnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTAyNzEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGVsbCB0aGUgcGFydCB0byBzdG9wIGxvb3BpbmcuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibm9Mb29wXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFydFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDI4MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TdG9wIHRoZSBwYXJ0IGFuZCBjdWUgaXQgdG8gc3RlcCAwLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInN0b3BcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNlY29uZHMgZnJvbSBub3c8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBhcnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTAyOTMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UGF1c2UgdGhlIHBhcnQuIFBsYXliYWNrIHdpbGwgcmVzdW1lXFxuZnJvbSB0aGUgY3VycmVudCBzdGVwLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBhdXNlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zZWNvbmRzIGZyb20gbm93PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFydFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDMwNSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BZGQgYSBwNS5QaHJhc2UgdG8gdGhpcyBQYXJ0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFkZFBocmFzZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGhyYXNlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5yZWZlcmVuY2UgdG8gYSBwNS5QaHJhc2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlBocmFzZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QYXJ0XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwMzI2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJlbW92ZSBhIHBocmFzZSBmcm9tIHRoaXMgcGFydCwgYmFzZWQgb24gdGhlIG5hbWUgaXQgd2FzXFxuZ2l2ZW4gd2hlbiBpdCB3YXMgY3JlYXRlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyZW1vdmVQaHJhc2VcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInBocmFzZU5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUGFydFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDM0MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5HZXQgYSBwaHJhc2UgZnJvbSB0aGlzIHBhcnQsIGJhc2VkIG9uIHRoZSBuYW1lIGl0IHdhc1xcbmdpdmVuIHdoZW4gaXQgd2FzIGNyZWF0ZWQuIE5vdyB5b3UgY2FuIG1vZGlmeSBpdHMgYXJyYXkuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0UGhyYXNlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwaHJhc2VOYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBhcnRcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTAzNTQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+R2V0IGEgcGhyYXNlIGZyb20gdGhpcyBwYXJ0LCBiYXNlZCBvbiB0aGUgbmFtZSBpdCB3YXNcXG5naXZlbiB3aGVuIGl0IHdhcyBjcmVhdGVkLiBOb3cgeW91IGNhbiBtb2RpZnkgaXRzIGFycmF5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlcGxhY2VTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicGhyYXNlTmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BcnJheSBvZiB2YWx1ZXMgdG8gcGFzcyBpbnRvIHRoZSBjYWxsYmFja1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgZWFjaCBzdGVwIG9mIHRoZSBwaHJhc2UuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QYXJ0XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwMzgyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkZpcmUgYSBjYWxsYmFjayBmdW5jdGlvbiBhdCBldmVyeSBzdGVwLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm9uU3RlcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBuYW1lIG9mIHRoZSBjYWxsYmFja1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3Ugd2FudCB0byBmaXJlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGV2ZXJ5IGJlYXQvdGF0dW0uPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJGdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5QYXJ0XCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwNDM1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0YXJ0IHBsYXliYWNrIG9mIHRoZSBzY29yZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzdGFydFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNjb3JlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwNDQ0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0b3AgcGxheWJhY2sgb2YgdGhlIHNjb3JlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInN0b3BcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5TY29yZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDQ1NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5QYXVzZSBwbGF5YmFjayBvZiB0aGUgc2NvcmUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF1c2VcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5TY29yZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDQ2MixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Mb29wIHBsYXliYWNrIG9mIHRoZSBzY29yZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJsb29wXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU2NvcmVcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTA0NzEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3RvcCBsb29waW5nIHBsYXliYWNrIG9mIHRoZSBzY29yZS4gSWYgaXRcXG5pcyBjdXJyZW50bHkgcGxheWluZywgdGhpcyB3aWxsIGdvIGludG8gZWZmZWN0XFxuYWZ0ZXIgdGhlIGN1cnJlbnQgcm91bmQgb2YgcGxheWJhY2sgY29tcGxldGVzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vTG9vcFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNjb3JlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwNDk2LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgdGVtcG8gZm9yIGFsbCBwYXJ0cyBpbiB0aGUgc2NvcmU8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRCUE1cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkJQTVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QmVhdHMgUGVyIE1pbnV0ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmFtcFRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNlY29uZHMgZnJvbSBub3c8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5TY29yZVwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDU2NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5tdXNpY2FsVGltZU1vZGUgdXNlcyA8YSBocmVmID0gXFxcImh0dHBzOi8vZ2l0aHViLmNvbS9Ub25lanMvVG9uZS5qcy93aWtpL1RpbWVcXFwiPlRvbmUuVGltZTwvYT4gY29udmVudGlvblxcbnRydWUgaWYgc3RyaW5nLCBmYWxzZSBpZiBudW1iZXI8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm11c2ljYWxUaW1lTW9kZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kTG9vcFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDU3MSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5tdXNpY2FsVGltZU1vZGUgdmFyaWFibGVzXFxubW9kaWZ5IHRoZXNlIG9ubHkgd2hlbiB0aGUgaW50ZXJ2YWwgaXMgc3BlY2lmaWVkIGluIG11c2ljYWxUaW1lIGZvcm1hdCBhcyBhIHN0cmluZzwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZExvb3BcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTA1NzgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IGEgbGltaXQgdG8gdGhlIG51bWJlciBvZiBsb29wcyB0byBwbGF5LiBkZWZhdWx0cyB0byBJbmZpbml0eTwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibWF4SXRlcmF0aW9uc1wiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRMb29wXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwNTg3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRvIG5vdCBpbml0aWF0ZSB0aGUgY2FsbGJhY2sgaWYgdGltZUZyb21Ob3cgaXMgJmx0OyAwXFxuVGhpcyB1c3VzdWFsbHkgb2NjdXJzIGZvciBhIGZldyBtaWxsaXNlY29uZHMgd2hlbiB0aGUgcGFnZVxcbmlzIG5vdCBmdWxseSBsb2FkZWQ8L3A+XFxuPHA+VGhlIGNhbGxiYWNrIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB1bnRpbCBtYXhJdGVyYXRpb25zIGlzIHJlYWNoZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRMb29wXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwNjAxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0YXJ0IHRoZSBsb29wPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RhcnRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zY2hlZHVsZSBhIHN0YXJ0aW5nIHRpbWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kTG9vcFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDYxNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TdG9wIHRoZSBsb29wPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic3RvcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZUZyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNjaGVkdWxlIGEgc3RvcHBpbmcgdGltZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRMb29wXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwNjI3LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlBhdXNlIHRoZSBsb29wPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicGF1c2VcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5zY2hlZHVsZSBhIHBhdXNpbmcgdGltZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRMb29wXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwNjM5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN5bmNocm9uaXplIGxvb3BzLiBVc2UgdGhpcyBtZXRob2QgdG8gc3RhcnQgdHdvIG1vcmUgbW9yZSBsb29wcyBpbiBzeW5jaHJvbml6YXRpb25cXG5vciB0byBzdGFydCBhIGxvb3AgaW4gc3luY2hyb25pemF0aW9uIHdpdGggYSBsb29wIHRoYXQgaXMgYWxyZWFkeSBwbGF5aW5nXFxuVGhpcyBtZXRob2Qgd2lsbCBzY2hlZHVsZSB0aGUgaW1wbGljaXQgbG9vcCBpbiBzeW5jIHdpdGggdGhlIGV4cGxpY2l0IG1hc3RlciBsb29wXFxuaS5lLiBsb29wVG9TdGFydC5zeW5jZWRTdGFydChsb29wVG9TeW5jV2l0aCk8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzeW5jZWRTdGFydFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwib3RoZXJMb29wXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hIHA1LlNvdW5kTG9vcCB0byBzeW5jIHdpdGg8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TdGFydCB0aGUgbG9vcHMgaW4gc3luYyBhZnRlciB0aW1lRnJvbU5vdyBzZWNvbmRzPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZExvb3BcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTA3MjAsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+R2V0dGVycyBhbmQgU2V0dGVycywgc2V0dGluZyBhbnkgcGFyYW10ZXIgd2lsbCByZXN1bHQgaW4gYSBjaGFuZ2UgaW4gdGhlIGNsb2NrJiMzOTtzXFxuZnJlcXVlbmN5LCB0aGF0IHdpbGwgYmUgcmVmbGVjdGVkIGFmdGVyIHRoZSBuZXh0IGNhbGxiYWNrXFxuYmVhdHMgcGVyIG1pbnV0ZSAoZGVmYXVsdHMgdG8gNjApPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJicG1cIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kTG9vcFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDczOCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5udW1iZXIgb2YgcXVhcnRlciBub3RlcyBpbiBhIG1lYXN1cmUgKGRlZmF1bHRzIHRvIDQpPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lU2lnbmF0dXJlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZExvb3BcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTA3NTQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bGVuZ3RoIG9mIHRoZSBsb29wcyBpbnRlcnZhbDwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiaW50ZXJ2YWxcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlcnxTdHJpbmdcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZExvb3BcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTA3NjgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aG93IG1hbnkgdGltZXMgdGhlIGNhbGxiYWNrIGhhcyBiZWVuIGNhbGxlZCBzbyBmYXI8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIml0ZXJhdGlvbnNcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJyZWFkb25seVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kTG9vcFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDgwOSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgcDUuQ29tcHJlc3NvciBpcyBidWlsdCB3aXRoIGEgPGEgaHJlZj1cXFwiaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1ZGlvLyN0aGUtZHluYW1pY3Njb21wcmVzc29ybm9kZS1pbnRlcmZhY2VcXFwiXFxuICB0YXJnZXQ9XFxcIl9ibGFua1xcXCIgdGl0bGU9XFxcIlczIHNwZWMgZm9yIER5bmFtaWNzIENvbXByZXNzb3IgTm9kZVxcXCI+V2ViIEF1ZGlvIER5bmFtaWNzIENvbXByZXNzb3IgTm9kZVxcbiAgPC9hPjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29tcHJlc3NvclwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQXVkaW9Ob2RlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQ29tcHJlc3NvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDgyMCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5QZXJmb3JtcyB0aGUgc2FtZSBmdW5jdGlvbiBhcyAuY29ubmVjdCwgYnV0IGFsc28gYWNjZXB0c1xcbm9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gc2V0IGNvbXByZXNzb3ImIzM5O3MgYXVkaW9QYXJhbXM8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwcm9jZXNzXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzcmNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNvdW5kIHNvdXJjZSB0byBiZSBjb25uZWN0ZWQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImF0dGFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGFtb3VudCBvZiB0aW1lIChpbiBzZWNvbmRzKSB0byByZWR1Y2UgdGhlIGdhaW4gYnkgMTBkQixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gLjAwMywgcmFuZ2UgMCAtIDE8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwia25lZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QSBkZWNpYmVsIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgcmFuZ2UgYWJvdmUgdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkIHdoZXJlIHRoZSBjdXJ2ZSBzbW9vdGhseSB0cmFuc2l0aW9ucyB0byB0aGUgJnF1b3Q7cmF0aW8mcXVvdDsgcG9ydGlvbi5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gMzAsIHJhbmdlIDAgLSA0MDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyYXRpb1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGFtb3VudCBvZiBkQiBjaGFuZ2UgaW4gaW5wdXQgZm9yIGEgMSBkQiBjaGFuZ2UgaW4gb3V0cHV0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA9IDEyLCByYW5nZSAxIC0gMjA8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGhyZXNob2xkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgZGVjaWJlbCB2YWx1ZSBhYm92ZSB3aGljaCB0aGUgY29tcHJlc3Npb24gd2lsbCBzdGFydCB0YWtpbmcgZWZmZWN0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA9IC0yNCwgcmFuZ2UgLTEwMCAtIDA8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVsZWFzZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGFtb3VudCBvZiB0aW1lIChpbiBzZWNvbmRzKSB0byBpbmNyZWFzZSB0aGUgZ2FpbiBieSAxMGRCXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA9IC4yNSwgcmFuZ2UgMCAtIDE8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbXByZXNzb3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTA4NDMsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2V0IHRoZSBwYXJhbXRlcnMgb2YgYSBjb21wcmVzc29yLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXR0YWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgYW1vdW50IG9mIHRpbWUgKGluIHNlY29uZHMpIHRvIHJlZHVjZSB0aGUgZ2FpbiBieSAxMGRCLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgPSAuMDAzLCByYW5nZSAwIC0gMTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwia25lZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QSBkZWNpYmVsIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgcmFuZ2UgYWJvdmUgdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkIHdoZXJlIHRoZSBjdXJ2ZSBzbW9vdGhseSB0cmFuc2l0aW9ucyB0byB0aGUgJnF1b3Q7cmF0aW8mcXVvdDsgcG9ydGlvbi5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gMzAsIHJhbmdlIDAgLSA0MDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmF0aW9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBhbW91bnQgb2YgZEIgY2hhbmdlIGluIGlucHV0IGZvciBhIDEgZEIgY2hhbmdlIGluIG91dHB1dFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgPSAxMiwgcmFuZ2UgMSAtIDIwPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aHJlc2hvbGRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBkZWNpYmVsIHZhbHVlIGFib3ZlIHdoaWNoIHRoZSBjb21wcmVzc2lvbiB3aWxsIHN0YXJ0IHRha2luZyBlZmZlY3RcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gLTI0LCByYW5nZSAtMTAwIC0gMDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVsZWFzZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGFtb3VudCBvZiB0aW1lIChpbiBzZWNvbmRzKSB0byBpbmNyZWFzZSB0aGUgZ2FpbiBieSAxMGRCXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA9IC4yNSwgcmFuZ2UgMCAtIDE8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Db21wcmVzc29yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwODc1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldCBjdXJyZW50IGF0dGFjayBvciBzZXQgdmFsdWUgdy8gdGltZSByYW1wPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXR0YWNrXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhdHRhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkF0dGFjayBpcyB0aGUgYW1vdW50IG9mIHRpbWUgKGluIHNlY29uZHMpIHRvIHJlZHVjZSB0aGUgZ2FpbiBieSAxMGRCLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gLjAwMywgcmFuZ2UgMCAtIDE8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QXNzaWduIHRpbWUgdmFsdWUgdG8gc2NoZWR1bGUgdGhlIGNoYW5nZSBpbiB2YWx1ZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuQ29tcHJlc3NvclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMDg5NSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5HZXQgY3VycmVudCBrbmVlIG9yIHNldCB2YWx1ZSB3LyB0aW1lIHJhbXA8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJrbmVlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJrbmVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BIGRlY2liZWwgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSByYW5nZSBhYm92ZSB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCB3aGVyZSB0aGUgY3VydmUgc21vb3RobHkgdHJhbnNpdGlvbnMgdG8gdGhlICZxdW90O3JhdGlvJnF1b3Q7IHBvcnRpb24uXFxuICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gMzAsIHJhbmdlIDAgLSA0MDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Bc3NpZ24gdGltZSB2YWx1ZSB0byBzY2hlZHVsZSB0aGUgY2hhbmdlIGluIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Db21wcmVzc29yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwOTE1LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldCBjdXJyZW50IHJhdGlvIG9yIHNldCB2YWx1ZSB3LyB0aW1lIHJhbXA8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyYXRpb1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmF0aW9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBhbW91bnQgb2YgZEIgY2hhbmdlIGluIGlucHV0IGZvciBhIDEgZEIgY2hhbmdlIGluIG91dHB1dFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgPSAxMiwgcmFuZ2UgMSAtIDIwPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFzc2lnbiB0aW1lIHZhbHVlIHRvIHNjaGVkdWxlIHRoZSBjaGFuZ2UgaW4gdmFsdWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbXByZXNzb3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTA5MzQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+R2V0IGN1cnJlbnQgdGhyZXNob2xkIG9yIHNldCB2YWx1ZSB3LyB0aW1lIHJhbXA8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ0aHJlc2hvbGRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRocmVzaG9sZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIGRlY2liZWwgdmFsdWUgYWJvdmUgd2hpY2ggdGhlIGNvbXByZXNzaW9uIHdpbGwgc3RhcnQgdGFraW5nIGVmZmVjdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgPSAtMjQsIHJhbmdlIC0xMDAgLSAwPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Bc3NpZ24gdGltZSB2YWx1ZSB0byBzY2hlZHVsZSB0aGUgY2hhbmdlIGluIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Db21wcmVzc29yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwOTUzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldCBjdXJyZW50IHJlbGVhc2Ugb3Igc2V0IHZhbHVlIHcvIHRpbWUgcmFtcDwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlbGVhc2VcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJlbGVhc2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBhbW91bnQgb2YgdGltZSAoaW4gc2Vjb25kcykgdG8gaW5jcmVhc2UgdGhlIGdhaW4gYnkgMTBkQlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgPSAuMjUsIHJhbmdlIDAgLSAxPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Bc3NpZ24gdGltZSB2YWx1ZSB0byBzY2hlZHVsZSB0aGUgY2hhbmdlIGluIHZhbHVlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Db21wcmVzc29yXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEwOTczLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJldHVybiB0aGUgY3VycmVudCByZWR1Y3Rpb24gdmFsdWU8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJyZWR1Y3Rpb25cIixcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiVmFsdWUgb2YgdGhlIGFtb3VudCBvZiBnYWluIHJlZHVjdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIHNpZ25hbFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkNvbXByZXNzb3JcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTEwODUsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29ubmVjdCBhIHNwZWNpZmljIGRldmljZSB0byB0aGUgcDUuU291bmRSZWNvcmRlci5cXG5JZiBubyBwYXJhbWV0ZXIgaXMgZ2l2ZW4sIHA1LlNvdW5kUmVjb3JlciB3aWxsIHJlY29yZFxcbmFsbCBhdWRpYmxlIHA1LnNvdW5kIGZyb20geW91ciBza2V0Y2guPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0SW5wdXRcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInVuaXRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LnNvdW5kIG9iamVjdCBvciBhIHdlYiBhdWRpbyB1bml0XFxuICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG91dHB1dHMgc291bmQ8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kUmVjb3JkZXJcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTExMDYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U3RhcnQgcmVjb3JkaW5nLiBUbyBhY2Nlc3MgdGhlIHJlY29yZGluZywgcHJvdmlkZVxcbmEgcDUuU291bmRGaWxlIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIFRoZSBwNS5Tb3VuZFJlY29yZGVyXFxud2lsbCBzZW5kIGl0cyByZWNvcmRpbmcgdG8gdGhhdCBwNS5Tb3VuZEZpbGUgZm9yIHBsYXliYWNrIG9uY2VcXG5yZWNvcmRpbmcgaXMgY29tcGxldGUuIE9wdGlvbmFsIHBhcmFtZXRlcnMgaW5jbHVkZSBkdXJhdGlvblxcbihpbiBzZWNvbmRzKSBvZiB0aGUgcmVjb3JkaW5nLCBhbmQgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0XFxud2lsbCBiZSBjYWxsZWQgb25jZSB0aGUgY29tcGxldGUgcmVjb3JkaW5nIGhhcyBiZWVuXFxudHJhbnNmZXJlZCB0byB0aGUgcDUuU291bmRGaWxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlY29yZFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic291bmRGaWxlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5Tb3VuZEZpbGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInA1LlNvdW5kRmlsZVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaW1lIChpbiBzZWNvbmRzKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJjYWxsYmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgb25jZSB0aGUgcmVjb3JkaW5nIGNvbXBsZXRlczwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Tb3VuZFJlY29yZGVyXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExMTM5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlN0b3AgdGhlIHJlY29yZGluZy4gT25jZSB0aGUgcmVjb3JkaW5nIGlzIHN0b3BwZWQsXFxudGhlIHJlc3VsdHMgd2lsbCBiZSBzZW50IHRvIHRoZSBwNS5Tb3VuZEZpbGUgdGhhdFxcbndhcyBnaXZlbiBvbiAucmVjb3JkKCksIGFuZCBpZiBhIGNhbGxiYWNrIGZ1bmN0aW9uXFxud2FzIHByb3ZpZGVkIG9uIHJlY29yZCwgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzdG9wXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuU291bmRSZWNvcmRlclwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTIxMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TYXZlIGEgcDUuU291bmRGaWxlIGFzIGEgLndhdiBhdWRpbyBmaWxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNhdmVTb3VuZFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic291bmRGaWxlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5wNS5Tb3VuZEZpbGUgdGhhdCB5b3Ugd2lzaCB0byBzYXZlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwNS5Tb3VuZEZpbGVcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5uYW1lIG9mIHRoZSByZXN1bHRpbmcgLndhdiBmaWxlLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlNvdW5kUmVjb3JkZXJcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTEzODgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+aXNEZXRlY3RlZCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIGEgcGVhayBpcyBkZXRlY3RlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwiYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJpc0RldGVjdGVkXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJmYWxzZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBlYWtEZXRlY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTE0MDEsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHVwZGF0ZSBtZXRob2QgaXMgcnVuIGluIHRoZSBkcmF3IGxvb3AuPC9wPlxcbjxwPkFjY2VwdHMgYW4gRkZUIG9iamVjdC4gWW91IG11c3QgY2FsbCAuYW5hbHl6ZSgpXFxub24gdGhlIEZGVCBvYmplY3QgcHJpb3IgdG8gdXBkYXRpbmcgdGhlIHBlYWtEZXRlY3RcXG5iZWNhdXNlIGl0IHJlbGllcyBvbiBhIGNvbXBsZXRlZCBGRlQgYW5hbHlzaXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJmZnRPYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkEgcDUuRkZUIG9iamVjdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicDUuRkZUXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBlYWtEZXRlY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTE0MzIsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+b25QZWFrIGFjY2VwdHMgdHdvIGFyZ3VtZW50czogYSBmdW5jdGlvbiB0byBjYWxsIHdoZW5cXG5hIHBlYWsgaXMgZGV0ZWN0ZWQuIFRoZSB2YWx1ZSBvZiB0aGUgcGVhayxcXG5iZXR3ZWVuIDAuMCBhbmQgMS4wLCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIm9uUGVha1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk5hbWUgb2YgYSBmdW5jdGlvbiB0aGF0IHdpbGxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIHdoZW4gYSBwZWFrIGlzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGVkLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2YWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk9wdGlvbmFsIHZhbHVlIHRvIHBhc3NcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byB0aGUgZnVuY3Rpb24gd2hlblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBlYWsgaXMgZGV0ZWN0ZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZXhhbXBsZVwiOiBbXG4gICAgICAgICAgICAgICAgXCJcXG48ZGl2Pjxjb2RlPlxcbnZhciBjbnYsIHNvdW5kRmlsZSwgZmZ0LCBwZWFrRGV0ZWN0O1xcbnZhciBlbGxpcHNlV2lkdGggPSAwO1xcblxcbmZ1bmN0aW9uIHNldHVwKCkge1xcbiAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwxMDApO1xcbiAgdGV4dEFsaWduKENFTlRFUik7XFxuXFxuICBzb3VuZEZpbGUgPSBsb2FkU291bmQoJ2Fzc2V0cy9iZWF0Lm1wMycpO1xcbiAgZmZ0ID0gbmV3IHA1LkZGVCgpO1xcbiAgcGVha0RldGVjdCA9IG5ldyBwNS5QZWFrRGV0ZWN0KCk7XFxuXFxuICBzZXR1cFNvdW5kKCk7XFxuXFxuICAvLyB3aGVuIGEgYmVhdCBpcyBkZXRlY3RlZCwgY2FsbCB0cmlnZ2VyQmVhdCgpXFxuICBwZWFrRGV0ZWN0Lm9uUGVhayh0cmlnZ2VyQmVhdCk7XFxufVxcblxcbmZ1bmN0aW9uIGRyYXcoKSB7XFxuICBiYWNrZ3JvdW5kKDApO1xcbiAgZmlsbCgyNTUpO1xcbiAgdGV4dCgnY2xpY2sgdG8gcGxheScsIHdpZHRoLzIsIGhlaWdodC8yKTtcXG5cXG4gIGZmdC5hbmFseXplKCk7XFxuICBwZWFrRGV0ZWN0LnVwZGF0ZShmZnQpO1xcblxcbiAgZWxsaXBzZVdpZHRoICo9IDAuOTU7XFxuICBlbGxpcHNlKHdpZHRoLzIsIGhlaWdodC8yLCBlbGxpcHNlV2lkdGgsIGVsbGlwc2VXaWR0aCk7XFxufVxcblxcbi8vIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHBlYWtEZXRlY3Qub25QZWFrXFxuZnVuY3Rpb24gdHJpZ2dlckJlYXQoKSB7XFxuICBlbGxpcHNlV2lkdGggPSA1MDtcXG59XFxuXFxuLy8gbW91c2VjbGljayBzdGFydHMvc3RvcHMgc291bmRcXG5mdW5jdGlvbiBzZXR1cFNvdW5kKCkge1xcbiAgY252Lm1vdXNlQ2xpY2tlZCggZnVuY3Rpb24oKSB7XFxuICAgIGlmIChzb3VuZEZpbGUuaXNQbGF5aW5nKCkgKSB7XFxuICAgICAgc291bmRGaWxlLnN0b3AoKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICBzb3VuZEZpbGUucGxheSgpO1xcbiAgICB9XFxuICB9KTtcXG59XFxuPC9jb2RlPjwvZGl2PlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBlYWtEZXRlY3RcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTE1NzgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29ubmVjdCBhIHNvdXJjZSB0byB0aGUgZ2FpbiBub2RlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInNldElucHV0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzcmNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnA1LnNvdW5kIC8gV2ViIEF1ZGlvIG9iamVjdCB3aXRoIGEgc291bmRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LkdhaW5cIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTE1ODgsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+U2VuZCBvdXRwdXQgdG8gYSBwNS5zb3VuZCBvciB3ZWIgYXVkaW8gb2JqZWN0PC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29ubmVjdFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5HYWluXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExNTk4LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRpc2Nvbm5lY3QgYWxsIG91dHB1dC48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkaXNjb25uZWN0XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuR2FpblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTYwNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIG91dHB1dCBsZXZlbCBvZiB0aGUgZ2FpbiBub2RlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImFtcFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidm9sdW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5hbXBsaXR1ZGUgYmV0d2VlbiAwIGFuZCAxLjA8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInJhbXBUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5jcmVhdGUgYSBmYWRlIHRoYXQgbGFzdHMgcmFtcFRpbWU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidGltZUZyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnNjaGVkdWxlIHRoaXMgZXZlbnQgdG8gaGFwcGVuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyBmcm9tIG5vdzwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuR2FpblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTY4NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db25uZWN0IHRvIHA1IG9iamVjdHMgb3IgV2ViIEF1ZGlvIE5vZGVzPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29ubmVjdFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk9iamVjdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5BdWRpb1ZvaWNlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExNjkzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRpc2Nvbm5lY3QgZnJvbSBzb3VuZE91dDwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRpc2Nvbm5lY3RcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5BdWRpb1ZvaWNlXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExNzYxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlBsYXkgdGVsbHMgdGhlIE1vbm9TeW50aCB0byBzdGFydCBwbGF5aW5nIGEgbm90ZS4gVGhpcyBtZXRob2Qgc2NoZWR1bGVzXFxudGhlIGNhbGxpbmcgb2YgLnRyaWdnZXJBdHRhY2sgYW5kIC50cmlnZ2VyUmVsZWFzZS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwbGF5XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJub3RlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgbm90ZSB5b3Ugd2FudCB0byBwbGF5LCBzcGVjaWZpZWQgYXMgYVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgaW4gSGVydHogKE51bWJlcikgb3IgYXMgYSBtaWRpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluIE5vdGUvT2N0YXZlIGZvcm1hdCAoJnF1b3Q7QzQmcXVvdDssICZxdW90O0ViMyZxdW90Oy4uLmV0YyZxdW90OylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIDxhIGhyZWYgPSBcXFwiaHR0cHM6Ly9naXRodWIuY29tL1RvbmVqcy9Ub25lLmpzL3dpa2kvSW5zdHJ1bWVudHNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb25lPC9hPi4gRGVmYXVsdHMgdG8gNDQwIGh6LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nIHwgTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidmVsb2NpdHlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnZlbG9jaXR5IG9mIHRoZSBub3RlIHRvIHBsYXkgKHJhbmdpbmcgZnJvbSAwIHRvIDEpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNlY29uZHNGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aW1lIGZyb20gbm93IChpbiBzZWNvbmRzKSBhdCB3aGljaCB0byBwbGF5PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN1c3RhaW5UaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aW1lIHRvIHN1c3RhaW4gYmVmb3JlIHJlbGVhc2luZyB0aGUgZW52ZWxvcGU8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1vbm9TeW50aFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTc4MyxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UcmlnZ2VyIHRoZSBBdHRhY2ssIGFuZCBEZWNheSBwb3J0aW9uIG9mIHRoZSBFbnZlbG9wZS5cXG5TaW1pbGFyIHRvIGhvbGRpbmcgZG93biBhIGtleSBvbiBhIHBpYW5vLCBidXQgaXQgd2lsbFxcbmhvbGQgdGhlIHN1c3RhaW4gbGV2ZWwgdW50aWwgeW91IGxldCBnby48L3A+XFxuXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJub3RlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aGUgbm90ZSB5b3Ugd2FudCB0byBwbGF5LCBzcGVjaWZpZWQgYXMgYVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgaW4gSGVydHogKE51bWJlcikgb3IgYXMgYSBtaWRpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluIE5vdGUvT2N0YXZlIGZvcm1hdCAoJnF1b3Q7QzQmcXVvdDssICZxdW90O0ViMyZxdW90Oy4uLmV0YyZxdW90OylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIDxhIGhyZWYgPSBcXFwiaHR0cHM6Ly9naXRodWIuY29tL1RvbmVqcy9Ub25lLmpzL3dpa2kvSW5zdHJ1bWVudHNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb25lPC9hPi4gRGVmYXVsdHMgdG8gNDQwIGh6PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmcgfCBOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2ZWxvY2l0eVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmVsb2NpdHkgb2YgdGhlIG5vdGUgdG8gcGxheSAocmFuZ2luZyBmcm9tIDAgdG8gMSk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2Vjb25kc0Zyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRpbWUgZnJvbSBub3cgKGluIHNlY29uZHMpIGF0IHdoaWNoIHRvIHBsYXk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwidHJpZ2dlckF0dGFja1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1vbm9TeW50aFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTgwNixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UcmlnZ2VyIHRoZSByZWxlYXNlIG9mIHRoZSBFbnZlbG9wZS4gVGhpcyBpcyBzaW1pbGFyIHRvIHJlbGVhc2luZ1xcbnRoZSBrZXkgb24gYSBwaWFubyBhbmQgbGV0dGluZyB0aGUgc291bmQgZmFkZSBhY2NvcmRpbmcgdG8gdGhlXFxucmVsZWFzZSBsZXZlbCBhbmQgcmVsZWFzZSB0aW1lLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNlY29uZHNGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aW1lIHRvIHRyaWdnZXIgdGhlIHJlbGVhc2U8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInRyaWdnZXJSZWxlYXNlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTW9ub1N5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExODE5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB2YWx1ZXMgbGlrZSBhIHRyYWRpdGlvbmFsXFxuPGEgaHJlZj1cXFwiaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ludGhlc2l6ZXIjL21lZGlhL0ZpbGU6QURTUl9wYXJhbWV0ZXIuc3ZnXFxcIj5cXG5BRFNSIGVudmVsb3BlXFxuPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzZXRBRFNSXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhdHRhY2tUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaW1lIChpbiBzZWNvbmRzIGJlZm9yZSBlbnZlbG9wZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoZXMgQXR0YWNrIExldmVsPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJkZWNheVRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRpbWUgKGluIHNlY29uZHMpIGJlZm9yZSBlbnZlbG9wZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoZXMgRGVjYXkvU3VzdGFpbiBMZXZlbDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdXNSYXRpb1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+UmF0aW8gYmV0d2VlbiBhdHRhY2tMZXZlbCBhbmQgcmVsZWFzZUxldmVsLCBvbiBhIHNjYWxlIGZyb20gMCB0byAxLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIDEuMCA9IGF0dGFja0xldmVsLCAwLjAgPSByZWxlYXNlTGV2ZWwuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHN1c1JhdGlvIGRldGVybWluZXMgdGhlIGRlY2F5TGV2ZWwgYW5kIHRoZSBsZXZlbCBhdCB3aGljaCB0aGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXN0YWluIHBvcnRpb24gb2YgdGhlIGVudmVsb3BlIHdpbGwgc3VzdGFpbi5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgYXR0YWNrTGV2ZWwgaXMgMC40LCByZWxlYXNlTGV2ZWwgaXMgMCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc3VzQW10IGlzIDAuNSwgdGhlIGRlY2F5TGV2ZWwgd291bGQgYmUgMC4yLiBJZiBhdHRhY2tMZXZlbCBpc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlYXNlZCB0byAxLjAgKHVzaW5nIDxjb2RlPnNldFJhbmdlPC9jb2RlPiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWNheUxldmVsIHdvdWxkIGluY3JlYXNlIHByb3BvcnRpb25hbGx5LCB0byBiZWNvbWUgMC41LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyZWxlYXNlVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGltZSBpbiBzZWNvbmRzIGZyb20gbm93IChkZWZhdWx0cyB0byAwKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTW9ub1N5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExODQzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldHRlcnMgYW5kIFNldHRlcnM8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImF0dGFja1wiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTW9ub1N5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExODQ3LFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkZWNheVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTW9ub1N5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExODUwLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJzdXN0YWluXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Nb25vU3ludGhcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTE4NTMsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInJlbGVhc2VcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1vbm9TeW50aFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTg5MCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Nb25vU3ludGggYW1wPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiYW1wXCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2b2xcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPmRlc2lyZWQgdm9sdW1lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyYW1wVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGltZSB0byByZWFjaCBuZXcgdm9sdW1lPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwicmV0dXJuXCI6IHtcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmV3IHZvbHVtZSB2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1vbm9TeW50aFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTkwNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db25uZWN0IHRvIGEgcDUuc291bmQgLyBXZWIgQXVkaW8gb2JqZWN0LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImNvbm5lY3RcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInVuaXRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkEgcDUuc291bmQgb3IgV2ViIEF1ZGlvIG9iamVjdDwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiT2JqZWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1vbm9TeW50aFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTkxNCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5EaXNjb25uZWN0IGFsbCBvdXRwdXRzPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGlzY29ubmVjdFwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1Lk1vbm9TeW50aFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTkyMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5HZXQgcmlkIG9mIHRoZSBNb25vU3ludGggYW5kIGZyZWUgdXAgaXRzIHJlc291cmNlcyAvIG1lbW9yeS48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkaXNwb3NlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuTW9ub1N5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExOTc0LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkFuIG9iamVjdCB0aGF0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIG5vdGVzIGhhdmUgYmVlbiBwbGF5ZWQgYW5kXFxud2hpY2ggbm90ZXMgYXJlIGN1cnJlbnRseSBiZWluZyBwbGF5ZWQuIE5ldyBub3RlcyBhcmUgYWRkZWQgYXMga2V5c1xcbm9uIHRoZSBmbHkuIFdoaWxlIGEgbm90ZSBoYXMgYmVlbiBhdHRhY2tlZCwgYnV0IG5vdCByZWxlYXNlZCwgdGhlIHZhbHVlIG9mIHRoZVxcbmtleSBpcyB0aGUgYXVkaW92b2ljZSB3aGljaCBpcyBnZW5lcmF0aW5nIHRoYXQgbm90ZS4gV2hlbiBub3RlcyBhcmUgcmVsZWFzZWQsXFxudGhlIHZhbHVlIG9mIHRoZSBrZXkgYmVjb21lcyB1bmRlZmluZWQuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcInByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJub3Rlc1wiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBvbHlTeW50aFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMTk4NixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5BIFBvbHlTeW50aCBtdXN0IGhhdmUgYXQgbGVhc3QgMSB2b2ljZSwgZGVmYXVsdHMgdG8gODwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicG9seXZhbHVlXCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUG9seVN5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDExOTkxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk1vbm9zeW50aCB0aGF0IGdlbmVyYXRlcyB0aGUgc291bmQgZm9yIGVhY2ggbm90ZSB0aGF0IGlzIHRyaWdnZXJlZC4gVGhlXFxucDUuUG9seVN5bnRoIGRlZmF1bHRzIHRvIHVzaW5nIHRoZSBwNS5Nb25vU3ludGggYXMgaXRzIHZvaWNlLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXVkaW9Wb2ljZVwiLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBvbHlTeW50aFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjAyMixcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5QbGF5IGEgbm90ZSBieSB0cmlnZ2VyaW5nIG5vdGVBdHRhY2sgYW5kIG5vdGVSZWxlYXNlIHdpdGggc3VzdGFpbiB0aW1lPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwicGxheVwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibm90ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bWlkaSBub3RlIHRvIHBsYXkgKHJhbmdpbmcgZnJvbSAwIHRvIDEyNyAtIDYwIGJlaW5nIGEgbWlkZGxlIEMpPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInZlbG9jaXR5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD52ZWxvY2l0eSBvZiB0aGUgbm90ZSB0byBwbGF5IChyYW5naW5nIGZyb20gMCB0byAxKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzZWNvbmRzRnJvbU5vd1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGltZSBmcm9tIG5vdyAoaW4gc2Vjb25kcykgYXQgd2hpY2ggdG8gcGxheTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJzdXN0YWluVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dGltZSB0byBzdXN0YWluIGJlZm9yZSByZWxlYXNpbmcgdGhlIGVudmVsb3BlPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Qb2x5U3ludGhcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTIwMzYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bm90ZUFEU1Igc2V0cyB0aGUgZW52ZWxvcGUgZm9yIGEgc3BlY2lmaWMgbm90ZSB0aGF0IGhhcyBqdXN0IGJlZW4gdHJpZ2dlcmVkLlxcblVzaW5nIHRoaXMgbWV0aG9kIG1vZGlmaWVzIHRoZSBlbnZlbG9wZSBvZiB3aGljaGV2ZXIgYXVkaW92b2ljZSBpcyBiZWluZyB1c2VkXFxudG8gcGxheSB0aGUgZGVzaXJlZCBub3RlLiBUaGUgZW52ZWxvcGUgc2hvdWxkIGJlIHJlc2V0IGJlZm9yZSBub3RlUmVsZWFzZSBpcyBjYWxsZWRcXG5pbiBvcmRlciB0byBwcmV2ZW50IHRoZSBtb2RpZmllZCBlbnZlbG9wZSBmcm9tIGJlaW5nIHVzZWQgb24gb3RoZXIgbm90ZXMuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibm90ZUFEU1JcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vdGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPk1pZGkgbm90ZSBvbiB3aGljaCBBRFNSIHNob3VsZCBiZSBzZXQuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImF0dGFja1RpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRpbWUgKGluIHNlY29uZHMgYmVmb3JlIGVudmVsb3BlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlcyBBdHRhY2sgTGV2ZWw8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGVjYXlUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaW1lIChpbiBzZWNvbmRzKSBiZWZvcmUgZW52ZWxvcGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGVzIERlY2F5L1N1c3RhaW4gTGV2ZWw8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic3VzUmF0aW9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlJhdGlvIGJldHdlZW4gYXR0YWNrTGV2ZWwgYW5kIHJlbGVhc2VMZXZlbCwgb24gYSBzY2FsZSBmcm9tIDAgdG8gMSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSAxLjAgPSBhdHRhY2tMZXZlbCwgMC4wID0gcmVsZWFzZUxldmVsLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdXNSYXRpbyBkZXRlcm1pbmVzIHRoZSBkZWNheUxldmVsIGFuZCB0aGUgbGV2ZWwgYXQgd2hpY2ggdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzdGFpbiBwb3J0aW9uIG9mIHRoZSBlbnZlbG9wZSB3aWxsIHN1c3RhaW4uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIGF0dGFja0xldmVsIGlzIDAuNCwgcmVsZWFzZUxldmVsIGlzIDAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN1c0FtdCBpcyAwLjUsIHRoZSBkZWNheUxldmVsIHdvdWxkIGJlIDAuMi4gSWYgYXR0YWNrTGV2ZWwgaXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZWFzZWQgdG8gMS4wICh1c2luZyA8Y29kZT5zZXRSYW5nZTwvY29kZT4pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZGVjYXlMZXZlbCB3b3VsZCBpbmNyZWFzZSBwcm9wb3J0aW9uYWxseSwgdG8gYmVjb21lIDAuNS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwicmVsZWFzZVRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRpbWUgaW4gc2Vjb25kcyBmcm9tIG5vdyAoZGVmYXVsdHMgdG8gMCk8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJjbGFzc1wiOiBcInA1LlBvbHlTeW50aFwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjA2NCxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5TZXQgdGhlIFBvbHlTeW50aHMgZ2xvYmFsIGVudmVsb3BlLiBUaGlzIG1ldGhvZCBtb2RpZmllcyB0aGUgZW52ZWxvcGVzIG9mIGVhY2hcXG5tb25vc3ludGggc28gdGhhdCBhbGwgbm90ZXMgYXJlIHBsYXllZCB3aXRoIHRoaXMgZW52ZWxvcGUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0QURTUlwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibm90ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+TWlkaSBub3RlIG9uIHdoaWNoIEFEU1Igc2hvdWxkIGJlIHNldC48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYXR0YWNrVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGltZSAoaW4gc2Vjb25kcyBiZWZvcmUgZW52ZWxvcGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlcyBBdHRhY2sgTGV2ZWw8L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiZGVjYXlUaW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaW1lIChpbiBzZWNvbmRzKSBiZWZvcmUgZW52ZWxvcGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlcyBEZWNheS9TdXN0YWluIExldmVsPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInN1c1JhdGlvXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SYXRpbyBiZXR3ZWVuIGF0dGFja0xldmVsIGFuZCByZWxlYXNlTGV2ZWwsIG9uIGEgc2NhbGUgZnJvbSAwIHRvIDEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIDEuMCA9IGF0dGFja0xldmVsLCAwLjAgPSByZWxlYXNlTGV2ZWwuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdXNSYXRpbyBkZXRlcm1pbmVzIHRoZSBkZWNheUxldmVsIGFuZCB0aGUgbGV2ZWwgYXQgd2hpY2ggdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3RhaW4gcG9ydGlvbiBvZiB0aGUgZW52ZWxvcGUgd2lsbCBzdXN0YWluLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgYXR0YWNrTGV2ZWwgaXMgMC40LCByZWxlYXNlTGV2ZWwgaXMgMCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN1c0FtdCBpcyAwLjUsIHRoZSBkZWNheUxldmVsIHdvdWxkIGJlIDAuMi4gSWYgYXR0YWNrTGV2ZWwgaXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVhc2VkIHRvIDEuMCAodXNpbmcgPGNvZGU+c2V0UmFuZ2U8L2NvZGU+KSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWNheUxldmVsIHdvdWxkIGluY3JlYXNlIHByb3BvcnRpb25hbGx5LCB0byBiZWNvbWUgMC41LjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJyZWxlYXNlVGltZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGltZSBpbiBzZWNvbmRzIGZyb20gbm93IChkZWZhdWx0cyB0byAwKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUG9seVN5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyMDg5LFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRyaWdnZXIgdGhlIEF0dGFjaywgYW5kIERlY2F5IHBvcnRpb24gb2YgYSBNb25vU3ludGguXFxuU2ltaWxhciB0byBob2xkaW5nIGRvd24gYSBrZXkgb24gYSBwaWFubywgYnV0IGl0IHdpbGxcXG5ob2xkIHRoZSBzdXN0YWluIGxldmVsIHVudGlsIHlvdSBsZXQgZ28uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibm90ZUF0dGFja1wiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwibm90ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+bWlkaSBub3RlIG9uIHdoaWNoIGF0dGFjayBzaG91bGQgYmUgdHJpZ2dlcmVkLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ2ZWxvY2l0eVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+dmVsb2NpdHkgb2YgdGhlIG5vdGUgdG8gcGxheSAocmFuZ2luZyBmcm9tIDAgdG8gMSkvPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInNlY29uZHNGcm9tTm93XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD50aW1lIGZyb20gbm93IChpbiBzZWNvbmRzKTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUG9seVN5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyMTYyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRyaWdnZXIgdGhlIFJlbGVhc2Ugb2YgYW4gQXVkaW9Wb2ljZSBub3RlLiBUaGlzIGlzIHNpbWlsYXIgdG8gcmVsZWFzaW5nXFxudGhlIGtleSBvbiBhIHBpYW5vIGFuZCBsZXR0aW5nIHRoZSBzb3VuZCBmYWRlIGFjY29yZGluZyB0byB0aGVcXG5yZWxlYXNlIGxldmVsIGFuZCByZWxlYXNlIHRpbWUuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwibm90ZVJlbGVhc2VcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm5vdGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPm1pZGkgbm90ZSBvbiB3aGljaCBhdHRhY2sgc2hvdWxkIGJlIHRyaWdnZXJlZC48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwic2Vjb25kc0Zyb21Ob3dcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPnRpbWUgdG8gdHJpZ2dlciB0aGUgcmVsZWFzZTwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUG9seVN5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyMTkyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbm5lY3QgdG8gYSBwNS5zb3VuZCAvIFdlYiBBdWRpbyBvYmplY3QuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiY29ubmVjdFwiLFxuICAgICAgICAgICAgXCJwYXJhbXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+QSBwNS5zb3VuZCBvciBXZWIgQXVkaW8gb2JqZWN0PC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJPYmplY3RcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUG9seVN5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyMjAyLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkRpc2Nvbm5lY3QgYWxsIG91dHB1dHM8L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJkaXNjb25uZWN0XCIsXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuUG9seVN5bnRoXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyMjEwLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkdldCByaWQgb2YgdGhlIE1vbm9TeW50aCBhbmQgZnJlZSB1cCBpdHMgcmVzb3VyY2VzIC8gbWVtb3J5LjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcImRpc3Bvc2VcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5Qb2x5U3ludGhcIixcbiAgICAgICAgICAgIFwibW9kdWxlXCI6IFwicDUuc291bmRcIixcbiAgICAgICAgICAgIFwic3VibW9kdWxlXCI6IFwicDUuc291bmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImZpbGVcIjogXCJsaWIvYWRkb25zL3A1LnNvdW5kLmpzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogMTIyNzYsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIHA1LkRpc3RvcnRpb24gaXMgYnVpbHQgd2l0aCBhXFxuPGEgaHJlZj1cXFwiaHR0cDovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI1dhdmVTaGFwZXJOb2RlXFxcIj5cXG5XZWIgQXVkaW8gV2F2ZVNoYXBlciBOb2RlPC9hPi48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwicHJvcGVydHlcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIldhdmVTaGFwZXJOb2RlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJBdWRpb05vZGVcIixcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5EaXN0b3J0aW9uXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyMjkxLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlByb2Nlc3MgYSBzb3VuZCBzb3VyY2UsIG9wdGlvbmFsbHkgc3BlY2lmeSBhbW91bnQgYW5kIG92ZXJzYW1wbGUgdmFsdWVzLjwvcD5cXG5cIixcbiAgICAgICAgICAgIFwiaXRlbXR5cGVcIjogXCJtZXRob2RcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInByb2Nlc3NcIixcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImFtb3VudFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VW5ib3VuZGVkIGRpc3RvcnRpb24gYW1vdW50LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWwgdmFsdWVzIHJhbmdlIGZyb20gMC0xLjwvcD5cXG5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0aW9uYWxcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRkZWZhdWx0XCI6IFwiMC4yNVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIm92ZXJzYW1wbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPiYjMzk7bm9uZSYjMzk7LCAmIzM5OzJ4JiMzOTssIG9yICYjMzk7NHgmIzM5Oy48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0ZGVmYXVsdFwiOiBcIidub25lJ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiY2xhc3NcIjogXCJwNS5EaXN0b3J0aW9uXCIsXG4gICAgICAgICAgICBcIm1vZHVsZVwiOiBcInA1LnNvdW5kXCIsXG4gICAgICAgICAgICBcInN1Ym1vZHVsZVwiOiBcInA1LnNvdW5kXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJmaWxlXCI6IFwibGliL2FkZG9ucy9wNS5zb3VuZC5qc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IDEyMzAzLFxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlNldCB0aGUgYW1vdW50IGFuZCBvdmVyc2FtcGxlIG9mIHRoZSB3YXZlc2hhcGVyIGRpc3RvcnRpb24uPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwic2V0XCIsXG4gICAgICAgICAgICBcInBhcmFtc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJhbW91bnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlVuYm91bmRlZCBkaXN0b3J0aW9uIGFtb3VudC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsIHZhbHVlcyByYW5nZSBmcm9tIDAtMS48L3A+XFxuXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbmFsXCI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIFwib3B0ZGVmYXVsdFwiOiBcIjAuMjVcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJvdmVyc2FtcGxlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD4mIzM5O25vbmUmIzM5OywgJiMzOTsyeCYjMzk7LCBvciAmIzM5OzR4JiMzOTsuPC9wPlxcblwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25hbFwiOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBcIm9wdGRlZmF1bHRcIjogXCInbm9uZSdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRGlzdG9ydGlvblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjMyMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm4gdGhlIGRpc3RvcnRpb24gYW1vdW50LCB0eXBpY2FsbHkgYmV0d2VlbiAwLTEuPC9wPlxcblwiLFxuICAgICAgICAgICAgXCJpdGVtdHlwZVwiOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0QW1vdW50XCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlVuYm91bmRlZCBkaXN0b3J0aW9uIGFtb3VudC5cXG4gICAgICAgICAgICAgICAgIE5vcm1hbCB2YWx1ZXMgcmFuZ2UgZnJvbSAwLTEuXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRGlzdG9ydGlvblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiZmlsZVwiOiBcImxpYi9hZGRvbnMvcDUuc291bmQuanNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiAxMjMzMSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5SZXR1cm4gdGhlIG92ZXJzYW1wbGluZy48L3A+XFxuXCIsXG4gICAgICAgICAgICBcIml0ZW10eXBlXCI6IFwibWV0aG9kXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJnZXRPdmVyc2FtcGxlXCIsXG4gICAgICAgICAgICBcInJldHVyblwiOiB7XG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk92ZXJzYW1wbGUgY2FuIGVpdGhlciBiZSAnbm9uZScsICcyeCcsIG9yICc0eCcuXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNsYXNzXCI6IFwicDUuRGlzdG9ydGlvblwiLFxuICAgICAgICAgICAgXCJtb2R1bGVcIjogXCJwNS5zb3VuZFwiLFxuICAgICAgICAgICAgXCJzdWJtb2R1bGVcIjogXCJwNS5zb3VuZFwiXG4gICAgICAgIH1cbiAgICBdLFxuICAgIFwid2FybmluZ3NcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL2NyZWF0aW5nX3JlYWRpbmcuanM6MTZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL2NyZWF0aW5nX3JlYWRpbmcuanM6NjFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL2NyZWF0aW5nX3JlYWRpbmcuanM6OTFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL2NyZWF0aW5nX3JlYWRpbmcuanM6MTIxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9jcmVhdGluZ19yZWFkaW5nLmpzOjMxOVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29sb3IvY3JlYXRpbmdfcmVhZGluZy5qczozNTBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL2NyZWF0aW5nX3JlYWRpbmcuanM6Mzg3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9jcmVhdGluZ19yZWFkaW5nLmpzOjQ4NFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29sb3IvY3JlYXRpbmdfcmVhZGluZy5qczo1MTRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL2NyZWF0aW5nX3JlYWRpbmcuanM6NTU0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9wNS5Db2xvci5qczo1MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29sb3IvcDUuQ29sb3IuanM6MjQ3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9wNS5Db2xvci5qczoyNzRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL3A1LkNvbG9yLmpzOjMwMVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29sb3IvcDUuQ29sb3IuanM6MzI4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9wNS5Db2xvci5qczo3NTlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL3NldHRpbmcuanM6MTVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL3NldHRpbmcuanM6MTg1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9zZXR0aW5nLmpzOjIyM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29sb3Ivc2V0dGluZy5qczozNDRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL3NldHRpbmcuanM6NTAxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9zZXR0aW5nLmpzOjU0MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29sb3Ivc2V0dGluZy5qczo1ODJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvMmRfcHJpbWl0aXZlcy5qczoxNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS8yZF9wcmltaXRpdmVzLmpzOjEzM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS8yZF9wcmltaXRpdmVzLmpzOjE4OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS8yZF9wcmltaXRpdmVzLmpzOjI0NFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS8yZF9wcmltaXRpdmVzLmpzOjI3OVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS8yZF9wcmltaXRpdmVzLmpzOjMzM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS8yZF9wcmltaXRpdmVzLmpzOjQxNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9hdHRyaWJ1dGVzLmpzOjE0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2F0dHJpYnV0ZXMuanM6ODNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvYXR0cmlidXRlcy5qczoxMTFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvYXR0cmlidXRlcy5qczoxODBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvYXR0cmlidXRlcy5qczoyMDlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvYXR0cmlidXRlcy5qczoyNDZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvYXR0cmlidXRlcy5qczozMTNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvY29uc3RhbnRzLmpzOjM0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2NvbnN0YW50cy5qczo1M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9jb25zdGFudHMuanM6NzJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvY29uc3RhbnRzLmpzOjkxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2NvbnN0YW50cy5qczoxMTBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvY29yZS5qczo0OVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9jb3JlLmpzOjkwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2NvcmUuanM6MTIxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2NvcmUuanM6NDA3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2N1cnZlcy5qczoxM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9jdXJ2ZXMuanM6OTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvY3VydmVzLmpzOjEzNVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9jdXJ2ZXMuanM6MTkwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2N1cnZlcy5qczoyNjlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvY3VydmVzLmpzOjM2MFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9jdXJ2ZXMuanM6NDAyXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2N1cnZlcy5qczo0OTdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvZW52aXJvbm1lbnQuanM6MjJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvZW52aXJvbm1lbnQuanM6NDlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvZW52aXJvbm1lbnQuanM6NzdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvZW52aXJvbm1lbnQuanM6MTA5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2Vudmlyb25tZW50LmpzOjE3MFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9lbnZpcm9ubWVudC5qczoyNjhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvZW52aXJvbm1lbnQuanM6MjkzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2Vudmlyb25tZW50LmpzOjMxMFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9lbnZpcm9ubWVudC5qczozMjdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvZW52aXJvbm1lbnQuanM6MzQzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2Vudmlyb25tZW50LmpzOjM1OVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9lbnZpcm9ubWVudC5qczo0MzdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJyZXBsYWNpbmcgaW5jb3JyZWN0IHRhZzogcmV0dXJucyB3aXRoIHJldHVyblwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2Vudmlyb25tZW50LmpzOjQ4OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9lbnZpcm9ubWVudC5qczo0ODhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJyZXBsYWNpbmcgaW5jb3JyZWN0IHRhZzogcmV0dXJucyB3aXRoIHJldHVyblwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2Vudmlyb25tZW50LmpzOjUzNFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9lbnZpcm9ubWVudC5qczo1MzRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvZW52aXJvbm1lbnQuanM6NTkxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2Vudmlyb25tZW50LmpzOjYyMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9lbnZpcm9ubWVudC5qczo2NDVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvcDUuRWxlbWVudC5qczo1MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjExNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjE1M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjE4OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjIzOFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjI4N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjM1M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjQwNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjQ2MFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjUxOVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjU2MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjYyOVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjY2NFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjcwNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjc1NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjc5NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjg0NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjg4NFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5FbGVtZW50LmpzOjkyMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5HcmFwaGljcy5qczo2NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9yZW5kZXJpbmcuanM6MTdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvcmVuZGVyaW5nLmpzOjExOVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9yZW5kZXJpbmcuanM6MTcyXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3JlbmRlcmluZy5qczoxOTVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvcmVuZGVyaW5nLmpzOjIzNFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9zdHJ1Y3R1cmUuanM6MTVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvc3RydWN0dXJlLmpzOjc3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3N0cnVjdHVyZS5qczoxMzJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvc3RydWN0dXJlLmpzOjE5N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9zdHJ1Y3R1cmUuanM6MjcxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3RyYW5zZm9ybS5qczoxM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS90cmFuc2Zvcm0uanM6MTM1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3RyYW5zZm9ybS5qczoxNjFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvdHJhbnNmb3JtLmpzOjIwMVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS90cmFuc2Zvcm0uanM6MjMxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3RyYW5zZm9ybS5qczoyNjFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvdHJhbnNmb3JtLmpzOjI5MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS90cmFuc2Zvcm0uanM6MzY2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3RyYW5zZm9ybS5qczo0MDVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvdHJhbnNmb3JtLmpzOjQ0NFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS92ZXJ0ZXguanM6MjJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvdmVydGV4LmpzOjcwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3ZlcnRleC5qczoyNzBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvdmVydGV4LmpzOjM1NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS92ZXJ0ZXguanM6NDA3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3ZlcnRleC5qczo0NjdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvdmVydGV4LmpzOjU1M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS92ZXJ0ZXguanM6NjQ1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3ZlcnRleC5qczo2NDVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvdmVydGV4LmpzOjY0NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS92ZXJ0ZXguanM6NjQ1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzOjkxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzOjEyNVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qczoxNThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9hY2NlbGVyYXRpb24uanM6MTk0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzOjIzOVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qczoyODNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9hY2NlbGVyYXRpb24uanM6Mzc0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9ldmVudHMvYWNjZWxlcmF0aW9uLmpzOjQwNVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qczo0NjRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9rZXlib2FyZC5qczoxOFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZXZlbnRzL2tleWJvYXJkLmpzOjQ1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9ldmVudHMva2V5Ym9hcmQuanM6NzRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9rZXlib2FyZC5qczoxMDdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9rZXlib2FyZC5qczoxOThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9rZXlib2FyZC5qczoyNTRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9rZXlib2FyZC5qczozMThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczoyMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZXZlbnRzL21vdXNlLmpzOjQ4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9ldmVudHMvbW91c2UuanM6NzRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczoxMDVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczoxMzVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczoxNzJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczoyMDlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczoyNDlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczoyOTBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczozMjlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczo0MThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczo0NjJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczo1MzJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczo1OThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczo2NjVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczo3MjRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9tb3VzZS5qczo3ODJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy90b3VjaC5qczo1N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZXZlbnRzL3RvdWNoLmpzOjEyMFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZXZlbnRzL3RvdWNoLmpzOjE4MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvaW1hZ2UuanM6MThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2ltYWdlLmpzOjk4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9pbWFnZS5qczoxOTNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qczoxN1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInJlcGxhY2luZyBpbmNvcnJlY3QgdGFnOiByZXR1cm5zIHdpdGggcmV0dXJuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qczoxMDhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qczoxMjVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qczoyOTZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qczozOTZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qczo0NjJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL3A1LkltYWdlLmpzOjkwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9wNS5JbWFnZS5qczoxMTdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL3A1LkltYWdlLmpzOjE1MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcDUuSW1hZ2UuanM6MjMwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9wNS5JbWFnZS5qczoyNjZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL3A1LkltYWdlLmpzOjMxNFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcDUuSW1hZ2UuanM6MzU5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9wNS5JbWFnZS5qczozOTdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL3A1LkltYWdlLmpzOjQ4MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcDUuSW1hZ2UuanM6NTYxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9wNS5JbWFnZS5qczo2MjRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL3A1LkltYWdlLmpzOjY2MFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcDUuSW1hZ2UuanM6NzgyXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9waXhlbHMuanM6MTRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL3BpeGVscy5qczo4M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcGl4ZWxzLmpzOjE3N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcGl4ZWxzLmpzOjIzNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcGl4ZWxzLmpzOjQxNVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcGl4ZWxzLmpzOjQ5MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcGl4ZWxzLmpzOjUyOFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcGl4ZWxzLmpzOjYwMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vZmlsZXMuanM6MTlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2lvL2ZpbGVzLmpzOjE3MFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vZmlsZXMuanM6MjcxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9maWxlcy5qczo2MDNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJyZXBsYWNpbmcgaW5jb3JyZWN0IHRhZzogcmV0dXJucyB3aXRoIHJldHVyblwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9maWxlcy5qczo3MDRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2lvL2ZpbGVzLmpzOjcwNFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vZmlsZXMuanM6MTQ1N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vZmlsZXMuanM6MTUwOVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vZmlsZXMuanM6MTU3MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vcDUuVGFibGUuanM6NTZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2lvL3A1LlRhYmxlLmpzOjExOVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vcDUuVGFibGUuanM6MTY3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZS5qczoyMTNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2lvL3A1LlRhYmxlLmpzOjI2MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vcDUuVGFibGUuanM6MzI3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZS5qczo1MjJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2lvL3A1LlRhYmxlLmpzOjU3NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vcDUuVGFibGUuanM6NjE3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZS5qczo4NzhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2lvL3A1LlRhYmxlLmpzOjk0NFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vcDUuVGFibGUuanM6OTk0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZS5qczoxMDQwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZS5qczoxMDg1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZS5qczoxMTMyXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZS5qczoxMTc3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZS5qczoxMjMwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZS5qczoxMjk0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZVJvdy5qczo0MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vcDUuVGFibGVSb3cuanM6MTA0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZVJvdy5qczoxNDhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2lvL3A1LlRhYmxlUm93LmpzOjE5M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vcDUuVGFibGVSb3cuanM6MjQxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5UYWJsZVJvdy5qczoyOTdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2lvL3A1LlhNTC5qczoxMVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9jYWxjdWxhdGlvbi5qczoxMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9jYWxjdWxhdGlvbi5qczozNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9jYWxjdWxhdGlvbi5qczo3NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9jYWxjdWxhdGlvbi5qczoxMjFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvY2FsY3VsYXRpb24uanM6MTkwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL2NhbGN1bGF0aW9uLmpzOjI0MFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9jYWxjdWxhdGlvbi5qczoyNzlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvY2FsY3VsYXRpb24uanM6MzI0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL2NhbGN1bGF0aW9uLmpzOjM3OVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9jYWxjdWxhdGlvbi5qczo0MThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvY2FsY3VsYXRpb24uanM6NDc0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL2NhbGN1bGF0aW9uLmpzOjUyNFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9jYWxjdWxhdGlvbi5qczo1NzRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvY2FsY3VsYXRpb24uanM6NjI3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL2NhbGN1bGF0aW9uLmpzOjY2MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9jYWxjdWxhdGlvbi5qczo3MDBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvY2FsY3VsYXRpb24uanM6NzQ3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL21hdGguanM6MTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvbm9pc2UuanM6NDBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvbm9pc2UuanM6MTg3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL25vaXNlLmpzOjI1M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9wNS5WZWN0b3IuanM6MTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvcmFuZG9tLmpzOjQ4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL3JhbmRvbS5qczo3OVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9yYW5kb20uanM6MTY2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL3RyaWdvbm9tZXRyeS5qczoxMjRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvdHJpZ29ub21ldHJ5LmpzOjE2MFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC90cmlnb25vbWV0cnkuanM6MTg4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL3RyaWdvbm9tZXRyeS5qczoyMTZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvdHJpZ29ub21ldHJ5LmpzOjI5NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInJlcGxhY2luZyBpbmNvcnJlY3QgdGFnOiByZXR1cm5zIHdpdGggcmV0dXJuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvdHJpZ29ub21ldHJ5LmpzOjMzMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInJlcGxhY2luZyBpbmNvcnJlY3QgdGFnOiByZXR1cm5zIHdpdGggcmV0dXJuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvdHJpZ29ub21ldHJ5LmpzOjM0N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInJlcGxhY2luZyBpbmNvcnJlY3QgdGFnOiByZXR1cm5zIHdpdGggcmV0dXJuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvdHJpZ29ub21ldHJ5LmpzOjM2MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvdHlwb2dyYXBoeS9hdHRyaWJ1dGVzLmpzOjEzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy90eXBvZ3JhcGh5L2F0dHJpYnV0ZXMuanM6NjBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3R5cG9ncmFwaHkvYXR0cmlidXRlcy5qczo5OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvdHlwb2dyYXBoeS9hdHRyaWJ1dGVzLmpzOjEzMFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvdHlwb2dyYXBoeS9hdHRyaWJ1dGVzLmpzOjE2NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvdHlwb2dyYXBoeS9sb2FkaW5nX2Rpc3BsYXlpbmcuanM6MTZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3R5cG9ncmFwaHkvbG9hZGluZ19kaXNwbGF5aW5nLmpzOjE0M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvdHlwb2dyYXBoeS9sb2FkaW5nX2Rpc3BsYXlpbmcuanM6MjAyXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy90eXBvZ3JhcGh5L3A1LkZvbnQuanM6NDNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3V0aWxpdGllcy9jb252ZXJzaW9uLmpzOjEyXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy91dGlsaXRpZXMvc3RyaW5nX2Z1bmN0aW9ucy5qczoxNVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvdXRpbGl0aWVzL3N0cmluZ19mdW5jdGlvbnMuanM6NDRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3V0aWxpdGllcy9zdHJpbmdfZnVuY3Rpb25zLmpzOjEzMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvdXRpbGl0aWVzL3N0cmluZ19mdW5jdGlvbnMuanM6MjM3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy91dGlsaXRpZXMvc3RyaW5nX2Z1bmN0aW9ucy5qczozMTNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3V0aWxpdGllcy9zdHJpbmdfZnVuY3Rpb25zLmpzOjM3NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvdXRpbGl0aWVzL3N0cmluZ19mdW5jdGlvbnMuanM6NDM3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy91dGlsaXRpZXMvc3RyaW5nX2Z1bmN0aW9ucy5qczo1MjZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3V0aWxpdGllcy90aW1lX2RhdGUuanM6MTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3V0aWxpdGllcy90aW1lX2RhdGUuanM6MzRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3V0aWxpdGllcy90aW1lX2RhdGUuanM6NTZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3V0aWxpdGllcy90aW1lX2RhdGUuanM6NzhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3V0aWxpdGllcy90aW1lX2RhdGUuanM6MTAxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy91dGlsaXRpZXMvdGltZV9kYXRlLmpzOjEyM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvdXRpbGl0aWVzL3RpbWVfZGF0ZS5qczoxNDVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL2NhbWVyYS5qczoxMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvY2FtZXJhLmpzOjE2MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvY2FtZXJhLmpzOjI0M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvaW50ZXJhY3Rpb24uanM6NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvbGlnaHQuanM6MTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL2xpZ2h0LmpzOjEwMVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvbGlnaHQuanM6MjA3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9sb2FkaW5nLmpzOjE0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9sb2FkaW5nLmpzOjIxNVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInJlcGxhY2luZyBpbmNvcnJlY3QgdGFnOiByZXR1cm5zIHdpdGggcmV0dXJuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL21hdGVyaWFsLmpzOjU3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9tYXRlcmlhbC5qczo1N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvbWF0ZXJpYWwuanM6MTUwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9tYXRlcmlhbC5qczoxODVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL21hdGVyaWFsLmpzOjI3NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvbWF0ZXJpYWwuanM6MzI0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLmpzOjE5N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvcDUuUmVuZGVyZXJHTC5qczo0MzlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJ1bmtub3duIHRhZzogYWx0XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL3A1LlJlbmRlcmVyR0wuanM6NDg2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwidW5rbm93biB0YWc6IGFsdFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLmpzOjUyNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInVua25vd24gdGFnOiBhbHRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvcHJpbWl0aXZlcy5qczoxNFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInJlcGxhY2luZyBpbmNvcnJlY3QgdGFnOiBwYXJhbXMgd2l0aCBwYXJhbVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6MTU2N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcInJlcGxhY2luZyBpbmNvcnJlY3QgdGFnOiByZXR1cm5zIHdpdGggcmV0dXJuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczoxNTY3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwicmVwbGFjaW5nIGluY29ycmVjdCB0YWc6IHJldHVybnMgd2l0aCByZXR1cm5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjcyNzJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJyZXBsYWNpbmcgaW5jb3JyZWN0IHRhZzogcmV0dXJucyB3aXRoIHJldHVyblwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6OTIyMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuQ29udmVyc2lvbnMgYWRhcHRlZCBmcm9tIDxodHRwOi8vd3d3LmVhc3lyZ2IuY29tL2VuL21hdGgucGhwPi5cXG5cXG5JbiB0aGVzZSBmdW5jdGlvbnMsIGh1ZSBpcyBhbHdheXMgaW4gdGhlIHJhbmdlIFswLDEpOyBhbGwgb3RoZXIgY29tcG9uZW50c1xcbmFyZSBpbiB0aGUgcmFuZ2UgWzAsMV0uICdCcmlnaHRuZXNzJyBhbmQgJ3ZhbHVlJyBhcmUgdXNlZCBpbnRlcmNoYW5nZWFibHkuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL2NvbG9yX2NvbnZlcnNpb24uanM6MTBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkNvbnZlcnQgYW4gSFNCQSBhcnJheSB0byBIU0xBLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9jb2xvcl9jb252ZXJzaW9uLmpzOjIwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5Db252ZXJ0IGFuIEhTQkEgYXJyYXkgdG8gUkdCQS5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29sb3IvY29sb3JfY29udmVyc2lvbi5qczo0NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuQ29udmVydCBhbiBIU0xBIGFycmF5IHRvIEhTQkEuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL2NvbG9yX2NvbnZlcnNpb24uanM6MTAxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5Db252ZXJ0IGFuIEhTTEEgYXJyYXkgdG8gUkdCQS5cXG5cXG5XZSBuZWVkIHRvIGNoYW5nZSBiYXNpcyBmcm9tIEhTTEEgdG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIG1vcmUgZWFzaWx5IGJlXFxucHJvamVjdGVkIG9udG8gUkdCQS4gV2Ugd2lsbCBjaG9vc2UgaHVlIGFuZCBicmlnaHRuZXNzIGFzIG91ciBmaXJzdCB0d29cXG5jb21wb25lbnRzLCBhbmQgcGljayBhIGNvbnZlbmllbnQgdGhpcmQgb25lICgnemVzdCcpIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZFxcbnRvIGNhbGN1bGF0ZSBmb3JtYWwgSFNCQSBzYXR1cmF0aW9uLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9jb2xvcl9jb252ZXJzaW9uLmpzOjEyNFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuQ29udmVydCBhbiBSR0JBIGFycmF5IHRvIEhTQkEuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL2NvbG9yX2NvbnZlcnNpb24uanM6MTg4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5Db252ZXJ0IGFuIFJHQkEgYXJyYXkgdG8gSFNMQS5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29sb3IvY29sb3JfY29udmVyc2lvbi5qczoyMjdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkh1ZSBpcyB0aGUgc2FtZSBpbiBIU0IgYW5kIEhTTCwgYnV0IHRoZSBtYXhpbXVtIHZhbHVlIG1heSBiZSBkaWZmZXJlbnQuXFxuVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgSFNCLW5vcm1hbGl6ZWQgc2F0dXJhdGlvbiB3aGVuIHN1cHBsaWVkIHdpdGhcXG5hbiBIU0IgY29sb3Igb2JqZWN0LCBidXQgd2lsbCBkZWZhdWx0IHRvIHRoZSBIU0wtbm9ybWFsaXplZCBzYXR1cmF0aW9uXFxub3RoZXJ3aXNlLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9wNS5Db2xvci5qczo0MDZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblNhdHVyYXRpb24gaXMgc2NhbGVkIGRpZmZlcmVudGx5IGluIEhTQiBhbmQgSFNMLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuXFxudGhlIEhTQiBzYXR1cmF0aW9uIHdoZW4gc3VwcGxpZWQgd2l0aCBhbiBIU0IgY29sb3Igb2JqZWN0LCBidXQgd2lsbCBkZWZhdWx0XFxudG8gdGhlIEhTTCBzYXR1cmF0aW9uIG90aGVyd2lzZS5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29sb3IvcDUuQ29sb3IuanM6NDM3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5DU1MgbmFtZWQgY29sb3JzLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9wNS5Db2xvci5qczo0NTZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblRoZXNlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIHBhdHRlcm5zIGZvciBtYXRjaGluZ1xcbnZpYWJsZSBDU1MgY29sb3Igc3RyaW5nczogZnJhZ21lbnRpbmcgdGhlIHJlZ2V4ZXMgaW4gdGhpcyB3YXkgaW5jcmVhc2VzIHRoZVxcbmxlZ2liaWxpdHkgYW5kIGNvbXByZWhlbnNpYmlsaXR5IG9mIHRoZSBjb2RlLlxcblxcbk5vdGUgdGhhdCBSR0IgdmFsdWVzIG9mIC45IGFyZSBub3QgcGFyc2VkIGJ5IElFLCBidXQgYXJlIHN1cHBvcnRlZCBoZXJlIGZvclxcbmNvbG9yIHN0cmluZyBjb25zaXN0ZW5jeS5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29sb3IvcDUuQ29sb3IuanM6NjA5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5GdWxsIGNvbG9yIHN0cmluZyBwYXR0ZXJucy4gVGhlIGNhcHR1cmUgZ3JvdXBzIGFyZSBuZWNlc3NhcnkuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL3A1LkNvbG9yLmpzOjYyMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuRm9yIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBpbnB1dHMsIHJldHVybnMgYSBjb2xvciBmb3JtYXR0ZWQgYXMgW3IsIGcsIGIsIGFdXFxuYXJyYXlzLCB3aXRoIGVhY2ggY29tcG9uZW50IG5vcm1hbGl6ZWQgYmV0d2VlbiAwIGFuZCAxLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb2xvci9wNS5Db2xvci5qczo3NTlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkZvciBIU0IgYW5kIEhTTCwgaW50ZXJwcmV0IHRoZSBncmF5IGxldmVsIGFzIGEgYnJpZ2h0bmVzcy9saWdodG5lc3NcXG52YWx1ZSAodGhleSBhcmUgZXF1aXZhbGVudCB3aGVuIGNocm9tYSBpcyB6ZXJvKS4gRm9yIFJHQiwgbm9ybWFsaXplIHRoZVxcbmdyYXkgbGV2ZWwgYWNjb3JkaW5nIHRvIHRoZSBibHVlIG1heGltdW0uXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvbG9yL3A1LkNvbG9yLmpzOjk3NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2NvcmUvY2FudmFzLmpzOjFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWVyYXRlLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2Vudmlyb25tZW50LmpzOjI0MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGRpc3BsYXllZCBldmVyeSBzZWNvbmQuIEZvciBleGFtcGxlLFxcbnRoZSBmdW5jdGlvbiBjYWxsIGZyYW1lUmF0ZSgzMCkgd2lsbCBhdHRlbXB0IHRvIHJlZnJlc2ggMzAgdGltZXMgYSBzZWNvbmQuXFxuSWYgdGhlIHByb2Nlc3NvciBpcyBub3QgZmFzdCBlbm91Z2ggdG8gbWFpbnRhaW4gdGhlIHNwZWNpZmllZCByYXRlLCB0aGVcXG5mcmFtZSByYXRlIHdpbGwgbm90IGJlIGFjaGlldmVkLiBTZXR0aW5nIHRoZSBmcmFtZSByYXRlIHdpdGhpbiBzZXR1cCgpIGlzXFxucmVjb21tZW5kZWQuIFRoZSBkZWZhdWx0IHJhdGUgaXMgNjAgZnJhbWVzIHBlciBzZWNvbmQuXFxuXFxuQ2FsbGluZyBmcmFtZVJhdGUoKSB3aXRoIG5vIGFyZ3VtZW50cyByZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcmF0ZS5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9lbnZpcm9ubWVudC5qczoyNTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2Vycm9yX2hlbHBlcnMuanM6MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuUHJpbnRzIG91dCBhIGZhbmN5LCBjb2xvcmZ1bCBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIGxvZ1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2Vycm9yX2hlbHBlcnMuanM6NjVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblZhbGlkYXRlcyBwYXJhbWV0ZXJzXFxucGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICAgZnVuYyAgICB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb25cXG5wYXJhbSAge0FycmF5fSAgICAgICAgICAgICAgICBhcmdzICAgIHVzZXIgaW5wdXQgYXJndW1lbnRzXFxuXFxuZXhhbXBsZTpcXG4gdmFyIGE7XFxuIGVsbGlwc2UoMTAsMTAsYSw1KTtcXG5jb25zb2xlIG91cHV0OlxcbiBcXFwiSXQgbG9va3MgbGlrZSBlbGxpcHNlIHJlY2VpdmVkIGFuIGVtcHR5IHZhcmlhYmxlIGluIHNwb3QgIzIuXFxcIlxcblxcbmV4YW1wbGU6XFxuIGVsbGlwc2UoMTAsXFxcImZvb1xcXCIsNSw1KTtcXG5jb25zb2xlIG91dHB1dDpcXG4gXFxcImVsbGlwc2Ugd2FzIGV4cGVjdGluZyBhIG51bWJlciBmb3IgcGFyYW1ldGVyICMxLFxcbiAgICAgICAgICByZWNlaXZlZCBcXFwiZm9vXFxcIiBpbnN0ZWFkLlxcXCJcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9lcnJvcl9oZWxwZXJzLmpzOjQwNVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuUHJpbnRzIG91dCBhbGwgdGhlIGNvbG9ycyBpbiB0aGUgY29sb3IgcGFsbGV0ZSB3aXRoIHdoaXRlIHRleHQuXFxuRm9yIGNvbG9yIGJsaW5kbmVzcyB0ZXN0aW5nLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL2Vycm9yX2hlbHBlcnMuanM6NDU3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5fZ2xvYmFsSW5pdFxcblxcblRPRE86ID8/P1xcbmlmIHNrZXRjaCBpcyBvbiB3aW5kb3dcXG5hc3N1bWUgXFxcImdsb2JhbFxcXCIgbW9kZVxcbmFuZCBpbnN0YW50aWF0ZSBwNSBhdXRvbWF0aWNhbGx5XFxub3RoZXJ3aXNlIGRvIG5vdGhpbmdcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9pbml0LmpzOjVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkhlbHBlciBmeG4gZm9yIHNoYXJpbmcgcGl4ZWwgbWV0aG9kc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3A1LkVsZW1lbnQuanM6MTA1N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuUmVzaXplIG91ciBjYW52YXMgZWxlbWVudC5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5SZW5kZXJlci5qczoxMTNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkhlbHBlciBmeG4gdG8gY2hlY2sgZm9udCB0eXBlIChzeXN0ZW0gb3Igb3RmKVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3A1LlJlbmRlcmVyLmpzOjE4MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuSGVscGVyIGZ4biB0byBtZWFzdXJlIGFzY2VudCBhbmQgZGVzY2VudC5cXG5BZGFwdGVkIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjUzNTUxNzhcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5SZW5kZXJlci5qczoyMzVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbnA1LlJlbmRlcmVyMkRcXG5UaGUgMkQgZ3JhcGhpY3MgY2FudmFzIHJlbmRlcmVyIGNsYXNzLlxcbmV4dGVuZHMgcDUuUmVuZGVyZXJcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvY29yZS9wNS5SZW5kZXJlcjJELmpzOjEwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5HZW5lcmF0ZSBhIGN1YmljIEJlemllciByZXByZXNlbnRpbmcgYW4gYXJjIG9uIHRoZSB1bml0IGNpcmNsZSBvZiB0b3RhbFxcbmFuZ2xlIGBzaXplYCByYWRpYW5zLCBiZWdpbm5pbmcgYHN0YXJ0YCByYWRpYW5zIGFib3ZlIHRoZSB4LWF4aXMuIFVwIHRvXFxuZm91ciBvZiB0aGVzZSBjdXJ2ZXMgYXJlIGNvbWJpbmVkIHRvIG1ha2UgYSBmdWxsIGFyYy5cXG5cXG5TZWUgd3d3LmpvZWNyaWRnZS5tZS9iZXppZXIucGRmIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgbWV0aG9kLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3A1LlJlbmRlcmVyMkQuanM6Mzk1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5zaGltIGZvciBVaW50OENsYW1wZWRBcnJheS5zbGljZVxcbihhbGxvd3MgYXJyYXlDb3B5IHRvIHdvcmsgd2l0aCBwaXhlbHNbXSlcXG53aXRoIHRoYW5rcyB0byBodHRwOi8vaGFsZnBhcHN0dWRpb3MuY29tL2Jsb2cvdGFnL2h0bWw1LWNhbnZhcy9cXG5FbnVtZXJhYmxlIHNldCB0byBmYWxzZSB0byBwcm90ZWN0IGZvci4uLmluIGZyb21cXG5VaW50OENsYW1wZWRBcnJheS5wcm90b3R5cGUgcG9sbHV0aW9uLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9jb3JlL3NoaW0uanM6NzBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbnByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgdXNlciBwYXNzaW5nIG9iamVjdHMgaW5cXG5kdXJpbmcgY29uc3RydWN0aW9uIG9yIGNhbGxzIHRvIGNyZWF0ZSgpXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzOjE5OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxucHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlIHVzZXIgcGFzc2VkIGluIHZhbGlkXFxudmFsdWVzIGZvciB0aGUgRGljdGlvbmFyeSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzOjM3OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxucHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlIHVzZXIgcGFzc2VkIGluIHZhbGlkXFxudmFsdWVzIGZvciB0aGUgRGljdGlvbmFyeSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2RhdGEvcDUuVHlwZWREaWN0LmpzOjQyM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxucHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGZpbmRpbmcgbG93ZXN0IG9yIGhpZ2hlc3QgdmFsdWVcXG50aGUgYXJndW1lbnQgJ2ZsaXAnIGlzIHVzZWQgdG8gZmxpcCB0aGUgY29tcGFyaXNvbiBhcnJvd1xcbmZyb20gJ2xlc3MgdGhhbicgdG8gJ2dyZWF0ZXIgdGhhbidcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZGF0YS9wNS5UeXBlZERpY3QuanM6NTQwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5wcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZmluZGluZyBsb3dlc3Qgb3IgaGlnaGVzdCBrZXlcXG50aGUgYXJndW1lbnQgJ2ZsaXAnIGlzIHVzZWQgdG8gZmxpcCB0aGUgY29tcGFyaXNvbiBhcnJvd1xcbmZyb20gJ2xlc3MgdGhhbicgdG8gJ2dyZWF0ZXIgdGhhbidcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZGF0YS9wNS5UeXBlZERpY3QuanM6NjA1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5fdXBkYXRlUEFjY2VsZXJhdGlvbnMgdXBkYXRlcyB0aGUgcEFjY2VsZXJhdGlvbiB2YWx1ZXNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZXZlbnRzL2FjY2VsZXJhdGlvbi5qczo4MFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuSG9sZHMgdGhlIGtleSBjb2RlcyBvZiBjdXJyZW50bHkgcHJlc3NlZCBrZXlzLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9ldmVudHMva2V5Ym9hcmQuanM6MTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblRoZSBvbmJsdXIgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgaXMgbm8gbG9uZ2VyIGZvY3VzZWRcXG5vbiB0aGUgcDUgZWxlbWVudC4gQmVjYXVzZSB0aGUga2V5dXAgZXZlbnRzIHdpbGwgbm90IGZpcmUgaWYgdGhlIHVzZXIgaXNcXG5ub3QgZm9jdXNlZCBvbiB0aGUgZWxlbWVudCB3ZSBtdXN0IGFzc3VtZSBhbGwga2V5cyBjdXJyZW50bHkgZG93biBoYXZlXFxuYmVlbiByZWxlYXNlZC5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvZXZlbnRzL2tleWJvYXJkLmpzOjMwOFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuVGhlIGNoZWNrRG93bktleXMgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gdHJ1ZSBpZiBhbnkga2V5cyBwcmVzc2VkXFxuYW5kIGEgZmFsc2UgaWYgbm8ga2V5cyBhcmUgY3VycmVudGx5IHByZXNzZWQuXFxuXFxuSGVscHMgYXZvaWQgaW5zdGFuY2VzIHdoZXJlIGEgbXVsdGlwbGUga2V5cyBhcmUgcHJlc3NlZCBzaW11bHRhbmVvdXNseSBhbmRcXG5yZWxlYXNpbmcgYSBzaW5nbGUga2V5IHdpbGwgdGhlbiBzd2l0Y2ggdGhlXFxua2V5SXNQcmVzc2VkIHByb3BlcnR5IHRvIHRydWUuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2V2ZW50cy9rZXlib2FyZC5qczozNzBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGZpbHRlcnMgZm9yIHVzZSB3aXRoIGltYWdlIGJ1ZmZlcnMuXFxuXFxuVGhpcyBtb2R1bGUgaXMgYmFzaWNhbGx5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgc3RvcmVkIGluIGFuIG9iamVjdFxcbmFzIG9wcG9zZWQgdG8gbW9kdWxlcy4gVGhlIGZ1bmN0aW9ucyBhcmUgZGVzdHJ1Y3RpdmUsIG1vZGlmeWluZ1xcbnRoZSBwYXNzZWQgaW4gY2FudmFzIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgY29weS5cXG5cXG5HZW5lcmFsbHkgc3BlYWtpbmcgdXNlcnMgb2YgdGhpcyBtb2R1bGUgd2lsbCB1c2UgdGhlIEZpbHRlcnMuYXBwbHkgbWV0aG9kXFxub24gYSBjYW52YXMgdG8gY3JlYXRlIGFuIGVmZmVjdC5cXG5cXG5BIG51bWJlciBvZiBmdW5jdGlvbnMgYXJlIGJvcnJvd2VkL2FkYXB0ZWQgZnJvbVxcbmh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2NhbnZhcy9pbWFnZWZpbHRlcnMvXFxub3IgdGhlIGphdmEgcHJvY2Vzc2luZyBpbXBsZW1lbnRhdGlvbi5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvZmlsdGVycy5qczozXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5SZXR1cm5zIHRoZSBwaXhlbCBidWZmZXIgZm9yIGEgY2FudmFzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2ZpbHRlcnMuanM6MjZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblJldHVybnMgYSAzMiBiaXQgbnVtYmVyIGNvbnRhaW5pbmcgQVJHQiBkYXRhIGF0IGl0aCBwaXhlbCBpbiB0aGVcXG4xRCBhcnJheSBjb250YWluaW5nIHBpeGVscyBkYXRhLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9maWx0ZXJzLmpzOjQ2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5Nb2RpZmllcyBwaXhlbHMgUkdCQSB2YWx1ZXMgdG8gdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBvYmplY3QuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2ZpbHRlcnMuanM6NjdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblJldHVybnMgdGhlIEltYWdlRGF0YSBvYmplY3QgZm9yIGEgY2FudmFzXFxuaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ltYWdlRGF0YVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9maWx0ZXJzLmpzOjg3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5SZXR1cm5zIGEgYmxhbmsgSW1hZ2VEYXRhIG9iamVjdC5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvZmlsdGVycy5qczoxMDdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkFwcGx5cyBhIGZpbHRlciBmdW5jdGlvbiB0byBhIGNhbnZhcy5cXG5cXG5UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHRoZSBhY3R1YWwgZmlsdGVyIGZ1bmN0aW9ucyBkZWZpbmVkIGJlbG93XFxuaXMgdGhhdCB0aGUgZmlsdGVyIGZ1bmN0aW9ucyBnZW5lcmFsbHkgbW9kaWZ5IHRoZSBwaXhlbCBidWZmZXIgYnV0IGRvXFxubm90IGFjdHVhbGx5IHB1dCB0aGF0IGRhdGEgYmFjayB0byB0aGUgY2FudmFzICh3aGVyZSBpdCB3b3VsZCBhY3R1YWxseVxcbnVwZGF0ZSB3aGF0IGlzIHZpc2libGUpLiBCeSBjb250cmFzdCB0aGlzIG1ldGhvZCBkb2VzIG1ha2UgdGhlIGNoYW5nZXNcXG5hY3R1YWxseSB2aXNpYmxlIGluIHRoZSBjYW52YXMuXFxuXFxuVGhlIGFwcGx5IG1ldGhvZCBpcyB0aGUgbWV0aG9kIHRoYXQgY2FsbGVycyBvZiB0aGlzIG1vZHVsZSB3b3VsZCBnZW5lcmFsbHlcXG51c2UuIEl0IGhhcyBiZWVuIHNlcGFyYXRlZCBmcm9tIHRoZSBhY3R1YWwgZmlsdGVycyB0byBzdXBwb3J0IGFuIGFkdmFuY2VkXFxudXNlIGNhc2Ugb2YgY3JlYXRpbmcgYSBmaWx0ZXIgY2hhaW4gdGhhdCBleGVjdXRlcyB3aXRob3V0IGFjdHVhbGx5IHVwZGF0aW5nXFxudGhlIGNhbnZhcyBpbiBiZXR3ZWVuIGV2ZXJ5c3RlcC5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvZmlsdGVycy5qczoxMjJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkNvbnZlcnRzIHRoZSBpbWFnZSB0byBibGFjayBhbmQgd2hpdGUgcGl4ZWxzIGRlcGVuZGluZyBpZiB0aGV5IGFyZSBhYm92ZSBvclxcbmJlbG93IHRoZSB0aHJlc2hvbGQgZGVmaW5lZCBieSB0aGUgbGV2ZWwgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIG11c3QgYmVcXG5iZXR3ZWVuIDAuMCAoYmxhY2spIGFuZCAxLjAgKHdoaXRlKS4gSWYgbm8gbGV2ZWwgaXMgc3BlY2lmaWVkLCAwLjUgaXMgdXNlZC5cXG5cXG5Cb3Jyb3dlZCBmcm9tIGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2NhbnZhcy9pbWFnZWZpbHRlcnMvXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2ZpbHRlcnMuanM6MTU5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5Db252ZXJ0cyBhbnkgY29sb3JzIGluIHRoZSBpbWFnZSB0byBncmF5c2NhbGUgZXF1aXZhbGVudHMuXFxuTm8gcGFyYW1ldGVyIGlzIHVzZWQuXFxuXFxuQm9ycm93ZWQgZnJvbSBodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9jYW52YXMvaW1hZ2VmaWx0ZXJzL1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9maWx0ZXJzLmpzOjE5M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuU2V0cyB0aGUgYWxwaGEgY2hhbm5lbCB0byBlbnRpcmVseSBvcGFxdWUuIE5vIHBhcmFtZXRlciBpcyB1c2VkLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9maWx0ZXJzLmpzOjIxNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuU2V0cyBlYWNoIHBpeGVsIHRvIGl0cyBpbnZlcnNlIHZhbHVlLiBObyBwYXJhbWV0ZXIgaXMgdXNlZC5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvZmlsdGVycy5qczoyMzJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkxpbWl0cyBlYWNoIGNoYW5uZWwgb2YgdGhlIGltYWdlIHRvIHRoZSBudW1iZXIgb2YgY29sb3JzIHNwZWNpZmllZCBhc1xcbnRoZSBwYXJhbWV0ZXIuIFRoZSBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byB2YWx1ZXMgYmV0d2VlbiAyIGFuZCAyNTUsIGJ1dFxcbnJlc3VsdHMgYXJlIG1vc3Qgbm90aWNlYWJsZSBpbiB0aGUgbG93ZXIgcmFuZ2VzLlxcblxcbkFkYXB0ZWQgZnJvbSBqYXZhIGJhc2VkIHByb2Nlc3NpbmcgaW1wbGVtZW50YXRpb25cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvZmlsdGVycy5qczoyNDdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbnJlZHVjZXMgdGhlIGJyaWdodCBhcmVhcyBpbiBhbiBpbWFnZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9maWx0ZXJzLmpzOjI3OVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuaW5jcmVhc2VzIHRoZSBicmlnaHQgYXJlYXMgaW4gYW4gaW1hZ2VcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvZmlsdGVycy5qczozNjdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIHA1IG1ldGhvZHMgZm9yIHRoZSBwNS5JbWFnZSBjbGFzc1xcbmZvciBkcmF3aW5nIGltYWdlcyB0byB0aGUgbWFpbiBkaXNwbGF5IGNhbnZhcy5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvaW1hZ2UuanM6OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuVmFsaWRhdGVzIGNsaXBwaW5nIHBhcmFtcy4gUGVyIGRyYXdJbWFnZSBzcGVjIHNXaWR0aCBhbmQgc0hpZ2h0IGNhbm5vdCBiZVxcbm5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiBpbWFnZSBpbnRyaW5zaWMgd2lkdGggYW5kIGhlaWdodFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9sb2FkaW5nX2Rpc3BsYXlpbmcuanM6MTA4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5BcHBseSB0aGUgY3VycmVudCB0aW50IGNvbG9yIHRvIHRoZSBpbnB1dCBpbWFnZSwgcmV0dXJuIHRoZSByZXN1bHRpbmdcXG5jYW52YXMuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2ltYWdlL2xvYWRpbmdfZGlzcGxheWluZy5qczo0MjVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIHA1LkltYWdlIGNsYXNzIGFuZCBQNSBtZXRob2RzIGZvclxcbmRyYXdpbmcgaW1hZ2VzIHRvIHRoZSBtYWluIGRpc3BsYXkgY2FudmFzLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pbWFnZS9wNS5JbWFnZS5qczo5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5IZWxwZXIgZnhuIGZvciBzaGFyaW5nIHBpeGVsIG1ldGhvZHNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW1hZ2UvcDUuSW1hZ2UuanM6MjIxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5HZW5lcmF0ZSBhIGJsb2Igb2YgZmlsZSBkYXRhIGFzIGEgdXJsIHRvIHByZXBhcmUgZm9yIGRvd25sb2FkLlxcbkFjY2VwdHMgYW4gYXJyYXkgb2YgZGF0YSwgYSBmaWxlbmFtZSwgYW5kIGFuIGV4dGVuc2lvbiAob3B0aW9uYWwpLlxcblRoaXMgaXMgYSBwcml2YXRlIGZ1bmN0aW9uIGJlY2F1c2UgaXQgZG9lcyBub3QgZG8gYW55IGZvcm1hdHRpbmcsXFxuYnV0IGl0IGlzIHVzZWQgYnkgc2F2ZVN0cmluZ3MsIHNhdmVKU09OLCBzYXZlVGFibGUgZXRjLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9maWxlcy5qczoxNjk3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5SZXR1cm5zIGEgZmlsZSBleHRlbnNpb24sIG9yIGFub3RoZXIgc3RyaW5nXFxuaWYgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciBoYXMgbm8gZXh0ZW5zaW9uLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9maWxlcy5qczoxNzY2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5SZXR1cm5zIHRydWUgaWYgdGhlIGJyb3dzZXIgaXMgU2FmYXJpLCBmYWxzZSBpZiBub3QuXFxuU2FmYXJpIG1ha2VzIHRyb3VibGUgZm9yIGRvd25sb2FkaW5nIGZpbGVzLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9maWxlcy5qczoxNzk5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5IZWxwZXIgZnVuY3Rpb24sIGEgY2FsbGJhY2sgZm9yIGRvd25sb2FkIHRoYXQgZGVsZXRlc1xcbmFuIGludmlzaWJsZSBhbmNob3IgZWxlbWVudCBmcm9tIHRoZSBET00gb25jZSB0aGUgZmlsZVxcbmhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgZG93bmxvYWRlZC5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvaW8vZmlsZXMuanM6MTgxMVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuVGFibGUgT3B0aW9uc1xcbjxwPkdlbmVyaWMgY2xhc3MgZm9yIGhhbmRsaW5nIHRhYnVsYXIgZGF0YSwgdHlwaWNhbGx5IGZyb20gYVxcbkNTViwgVFNWLCBvciBvdGhlciBzb3J0IG9mIHNwcmVhZHNoZWV0IGZpbGUuPC9wPlxcbjxwPkNTViBmaWxlcyBhcmVcXG48YSBocmVmPVxcXCJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbW1hLXNlcGFyYXRlZF92YWx1ZXNcXFwiPlxcbmNvbW1hIHNlcGFyYXRlZCB2YWx1ZXM8L2E+LCBvZnRlbiB3aXRoIHRoZSBkYXRhIGluIHF1b3Rlcy4gVFNWXFxuZmlsZXMgdXNlIHRhYnMgYXMgc2VwYXJhdG9ycywgYW5kIHVzdWFsbHkgZG9uJ3QgYm90aGVyIHdpdGggdGhlXFxucXVvdGVzLjwvcD5cXG48cD5GaWxlIG5hbWVzIHNob3VsZCBlbmQgd2l0aCAuY3N2IGlmIHRoZXkncmUgY29tbWEgc2VwYXJhdGVkLjwvcD5cXG48cD5BIHJvdWdoIFxcXCJzcGVjXFxcIiBmb3IgQ1NWIGNhbiBiZSBmb3VuZFxcbjxhIGhyZWY9XFxcImh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQxODBcXFwiPmhlcmU8L2E+LjwvcD5cXG48cD5UbyBsb2FkIGZpbGVzLCB1c2UgdGhlIGxvYWRUYWJsZSBtZXRob2QuPC9wPlxcbjxwPlRvIHNhdmUgdGFibGVzIHRvIHlvdXIgY29tcHV0ZXIsIHVzZSB0aGUgc2F2ZSBtZXRob2RcXG4gb3IgdGhlIHNhdmVUYWJsZSBtZXRob2QuPC9wPlxcblxcblBvc3NpYmxlIG9wdGlvbnMgaW5jbHVkZTpcXG48dWw+XFxuPGxpPmNzdiAtIHBhcnNlIHRoZSB0YWJsZSBhcyBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzXFxuPGxpPnRzdiAtIHBhcnNlIHRoZSB0YWJsZSBhcyB0YWItc2VwYXJhdGVkIHZhbHVlc1xcbjxsaT5oZWFkZXIgLSB0aGlzIHRhYmxlIGhhcyBhIGhlYWRlciAodGl0bGUpIHJvd1xcbjwvdWw+XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2lvL3A1LlRhYmxlLmpzOjExXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5UaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgdGhlIHBhcnNpbmcgb2YgWE1MICh3aGVuIGxvYWRYTUwoKSBpc1xcbmNhbGxlZCkuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIHRoZSBzZXRDb250ZW50KClcXG5tZXRob2QgZGVmaW5lZCBsYXRlciBpcyB0aGF0IHRoaXMgb25lIGlzIHVzZWQgdG8gc2V0IHRoZSBjb250ZW50XFxud2hlbiB0aGUgbm9kZSBpbiBxdWVzdGlvbiBoYXMgbW9yZSBub2RlcyB1bmRlciBpdCBhbmQgc28gb24gYW5kXFxubm90IGRpcmVjdGx5IHRleHQgY29udGVudC4gV2hpbGUgaW4gdGhlIG90aGVyIG9uZSBpcyB1c2VkIHdoZW5cXG50aGUgbm9kZSBpbiBxdWVzdGlvbiBkaXJlY3RseSBoYXMgdGV4dCBpbnNpZGUgaXQuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL2lvL3A1LlhNTC5qczo4MDFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGlsZSB0aGUgcGFyc2luZyBvZiBYTUwgKHdoZW4gbG9hZFhNTCgpIGlzXFxuY2FsbGVkKS4gVGhlIFhNTCBub2RlIGlzIHBhc3NlZCBhbmQgaXRzIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBpbiB0aGVcXG5wNS5YTUwncyBhdHRyaWJ1dGUgT2JqZWN0LlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9pby9wNS5YTUwuanM6ODE4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5NdWx0aXBsaWVzIGEgdmVjdG9yIGJ5IGEgc2NhbGFyIGFuZCByZXR1cm5zIGEgbmV3IHZlY3Rvci5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9wNS5WZWN0b3IuanM6MTYxMVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuRGl2aWRlcyBhIHZlY3RvciBieSBhIHNjYWxhciBhbmQgcmV0dXJucyBhIG5ldyB2ZWN0b3IuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL21hdGgvcDUuVmVjdG9yLmpzOjE2MzhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkNhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL3A1LlZlY3Rvci5qczoxNjY1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5DYWxjdWxhdGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy9tYXRoL3A1LlZlY3Rvci5qczoxNjc5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5DYWxjdWxhdGVzIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzIChjb25zaWRlcmluZyBhXFxucG9pbnQgYXMgYSB2ZWN0b3Igb2JqZWN0KS5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9wNS5WZWN0b3IuanM6MTY5M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuTGluZWFyIGludGVycG9sYXRlIGEgdmVjdG9yIHRvIGFub3RoZXIgdmVjdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhXFxubmV3IHZlY3Rvci5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvbWF0aC9wNS5WZWN0b3IuanM6MTcwOFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuSGVscGVyIGZ1bmN0aW9uIHRvIG1lYXN1cmUgYXNjZW50IGFuZCBkZXNjZW50LlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy90eXBvZ3JhcGh5L2F0dHJpYnV0ZXMuanM6MjU4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5SZXR1cm5zIHRoZSBzZXQgb2Ygb3BlbnR5cGUgZ2x5cGhzIGZvciB0aGUgc3VwcGxpZWQgc3RyaW5nLlxcblxcbk5vdGUgdGhhdCB0aGVyZSBpcyBub3QgYSBzdHJpY3Qgb25lLXRvLW9uZSBtYXBwaW5nIGJldHdlZW4gY2hhcmFjdGVyc1xcbmFuZCBnbHlwaHMsIHNvIHRoZSBsaXN0IG9mIHJldHVybmVkIGdseXBocyBjYW4gYmUgbGFyZ2VyIG9yIHNtYWxsZXJcXG4gdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBzdHJpbmcuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3R5cG9ncmFwaHkvcDUuRm9udC5qczoyNTdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblJldHVybnMgYW4gb3BlbnR5cGUgcGF0aCBmb3IgdGhlIHN1cHBsaWVkIHN0cmluZyBhbmQgcG9zaXRpb24uXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3R5cG9ncmFwaHkvcDUuRm9udC5qczoyNzJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblBhcnNlIE9CSiBsaW5lcyBpbnRvIG1vZGVsLiBGb3IgcmVmZXJlbmNlLCB0aGlzIGlzIHdoYXQgYSBzaW1wbGUgbW9kZWwgb2YgYVxcbnNxdWFyZSBtaWdodCBsb29rIGxpa2U6XFxuXFxudiAtMC41IC0wLjUgMC41XFxudiAtMC41IC0wLjUgLTAuNVxcbnYgLTAuNSAwLjUgLTAuNVxcbnYgLTAuNSAwLjUgMC41XFxuXFxuZiA0IDMgMiAxXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL2xvYWRpbmcuanM6MTA2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvbWF0ZXJpYWwuanM6MzczXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5DcmVhdGUgYSAyRCBhcnJheSBmb3IgZXN0YWJsaXNoaW5nIHN0cm9rZSBjb25uZWN0aW9uc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wNS5HZW9tZXRyeS5qczoxOTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkNyZWF0ZSA0IHZlcnRpY2VzIGZvciBlYWNoIHN0cm9rZSBsaW5lLCB0d28gYXQgdGhlIGJlZ2lubmluZyBwb3NpdGlvblxcbmFuZCB0d28gYXQgdGhlIGVuZCBwb3NpdGlvbi4gVGhlc2UgdmVydGljZXMgYXJlIGRpc3BsYWNlZCByZWxhdGl2ZSB0b1xcbnRoYXQgbGluZSdzIG5vcm1hbCBvbiB0aGUgR1BVXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL3A1Lkdlb21ldHJ5LmpzOjIxM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL3A1Lk1hdHJpeC5qczoxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5QUklWQVRFXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL3A1Lk1hdHJpeC5qczo2NzNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbldlbGNvbWUgdG8gUmVuZGVyZXJHTCBJbW1lZGlhdGUgTW9kZS5cXG5JbW1lZGlhdGUgbW9kZSBpcyB1c2VkIGZvciBkcmF3aW5nIGN1c3RvbSBzaGFwZXNcXG5mcm9tIGEgc2V0IG9mIHZlcnRpY2VzLiAgSW1tZWRpYXRlIE1vZGUgaXMgYWN0aXZhdGVkXFxud2hlbiB5b3UgY2FsbCBiZWdpblNoYXBlKCkgJiBkZS1hY3RpdmF0ZWQgd2hlbiB5b3UgY2FsbCBlbmRTaGFwZSgpLlxcbkltbWVkaWF0ZSBtb2RlIGlzIGEgc3R5bGUgb2YgcHJvZ3JhbW1pbmcgYm9ycm93ZWRcXG5mcm9tIE9wZW5HTCdzIChub3ctZGVwcmVjYXRlZCkgaW1tZWRpYXRlIG1vZGUuXFxuSXQgZGlmZmVycyBmcm9tIHA1LmpzJyBkZWZhdWx0LCBSZXRhaW5lZCBNb2RlLCB3aGljaCBjYWNoZXNcXG5nZW9tZXRyaWVzIGFuZCBidWZmZXJzIG9uIHRoZSBDUFUgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygd2ViZ2xcXG5kcmF3IGNhbGxzLiBSZXRhaW5lZCBtb2RlIGlzIG1vcmUgZWZmaWNpZW50ICYgcGVyZm9ybWF0aXZlLFxcbmhvd2V2ZXIsIEltbWVkaWF0ZSBNb2RlIGlzIHVzZWZ1bCBmb3Igc2tldGNoaW5nIHF1aWNrXFxuZ2VvbWV0cmljIGlkZWFzLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLkltbWVkaWF0ZS5qczoxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5FbmQgc2hhcGUgZHJhd2luZyBhbmQgcmVuZGVyIHZlcnRpY2VzIHRvIHNjcmVlbi5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvcDUuUmVuZGVyZXJHTC5JbW1lZGlhdGUuanM6MTA2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5pbml0aWFsaXplcyBidWZmZXIgZGVmYXVsdHMuIHJ1bnMgZWFjaCB0aW1lIGEgbmV3IGdlb21ldHJ5IGlzXFxucmVnaXN0ZXJlZFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLlJldGFpbmVkLmpzOjhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbmNyZWF0ZUJ1ZmZlcnMgZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvcDUuUmVuZGVyZXJHTC5SZXRhaW5lZC5qczo0N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuRHJhd3MgYnVmZmVycyBnaXZlbiBhIGdlb21ldHJ5IGtleSBJRFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLlJldGFpbmVkLmpzOjE5MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxubW9kZWwgdmlldywgcHJvamVjdGlvbiwgJiBub3JtYWxcXG5tYXRyaWNlc1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLmpzOjc3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5bYmFja2dyb3VuZCBkZXNjcmlwdGlvbl1cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvcDUuUmVuZGVyZXJHTC5qczo0MTdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbltyZXNpemUgZGVzY3JpcHRpb25dXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL3A1LlJlbmRlcmVyR0wuanM6NjU0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5jbGVhcnMgY29sb3IgYW5kIGRlcHRoIGJ1ZmZlcnNcXG53aXRoIHIsZyxiLGFcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBzcmMvd2ViZ2wvcDUuUmVuZGVyZXJHTC5qczo2ODRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblt0cmFuc2xhdGUgZGVzY3JpcHRpb25dXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL3A1LlJlbmRlcmVyR0wuanM6NzAyXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5TY2FsZXMgdGhlIE1vZGVsIFZpZXcgTWF0cml4IGJ5IGEgdmVjdG9yXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL3A1LlJlbmRlcmVyR0wuanM6NzIxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG50dXJuIGEgdHdvIGRpbWVuc2lvbmFsIGFycmF5IGludG8gb25lIGRpbWVuc2lvbmFsIGFycmF5XCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgc3JjL3dlYmdsL3A1LlJlbmRlcmVyR0wuanM6MTAwMVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxudHVybiBhIHA1LlZlY3RvciBBcnJheSBpbnRvIGEgb25lIGRpbWVuc2lvbmFsIG51bWJlciBhcnJheVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLmpzOjEwMzhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbmVuc3VyZXMgdGhhdCBwNSBpcyB1c2luZyBhIDNkIHJlbmRlcmVyLiB0aHJvd3MgYW4gZXJyb3IgaWYgbm90LlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wNS5SZW5kZXJlckdMLmpzOjEwNTRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wcmltaXRpdmVzLmpzOjI1N1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuRHJhdyBhIGxpbmUgZ2l2ZW4gdHdvIHBvaW50c1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIHNyYy93ZWJnbC9wcmltaXRpdmVzLmpzOjEwMzdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkhlbHBlciBmdW5jdGlvbiBmb3Igc2VsZWN0IGFuZCBzZWxlY3RBbGxcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LmRvbS5qczoxNjhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0RWxlbWVudCBhbmQgZ2V0RWxlbWVudHMuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5kb20uanM6MTg0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5IZWxwZXJzIGZvciBjcmVhdGUgbWV0aG9kcy5cIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LmRvbS5qczoyNDVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuZG9tLmpzOjM3NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5kb20uanM6ODk3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LmRvbS5qczo5NzNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuZG9tLmpzOjEwMTNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuZG9tLmpzOjI1ODFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuZG9tLmpzOjI2NDdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuZG9tLmpzOjI3MDlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbnA1LnNvdW5kXFxuaHR0cHM6Ly9wNWpzLm9yZy9yZWZlcmVuY2UvIy9saWJyYXJpZXMvcDUuc291bmRcXG5cXG5Gcm9tIHRoZSBQcm9jZXNzaW5nIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xcbmh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzLXNvdW5kL2dyYXBocy9jb250cmlidXRvcnNcXG5cXG5NSVQgTGljZW5zZSAoTUlUKVxcbmh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzLXNvdW5kL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcXG5cXG5Tb21lIG9mIHRoZSBtYW55IGF1ZGlvIGxpYnJhcmllcyAmIHJlc291cmNlcyB0aGF0IGluc3BpcmUgcDUuc291bmQ6XFxuIC0gVE9ORS5qcyAoYykgWW90YW0gTWFubi4gTGljZW5zZWQgdW5kZXIgVGhlIE1JVCBMaWNlbnNlIChNSVQpLiBodHRwczovL2dpdGh1Yi5jb20vVE9ORW5vVE9ORS9Ub25lLmpzXFxuIC0gYnV6ei5qcyAoYykgSmF5IFNhbHZhdC4gTGljZW5zZWQgdW5kZXIgVGhlIE1JVCBMaWNlbnNlIChNSVQpLiBodHRwOi8vYnV6ei5qYXlzYWx2YXQuY29tL1xcbiAtIEJvcmlzIFNtdXMgV2ViIEF1ZGlvIEFQSSBib29rLCAyMDEzLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXFxuIC0gd2F2ZXN1cmZlci5qcyBodHRwczovL2dpdGh1Yi5jb20va2F0c3BhdWdoL3dhdmVzdXJmZXIuanNcXG4gLSBXZWIgQXVkaW8gQ29tcG9uZW50cyBieSBKb3JkYW4gU2FudGVsbCBodHRwczovL2dpdGh1Yi5jb20vd2ViLWF1ZGlvLWNvbXBvbmVudHNcXG4gLSBXaWxtIFRob2JlbidzIFNvdW5kIGxpYnJhcnkgZm9yIFByb2Nlc3NpbmcgaHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmcvcHJvY2Vzc2luZy90cmVlL21hc3Rlci9qYXZhL2xpYnJhcmllcy9zb3VuZFxcblxcbiBXZWIgQXVkaW8gQVBJOiBodHRwOi8vdzMub3JnL1RSL3dlYmF1ZGlvL1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6NDZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkRldGVybWluZSB3aGljaCBmaWxldHlwZXMgYXJlIHN1cHBvcnRlZCAoaW5zcGlyZWQgYnkgYnV6ei5qcylcXG5UaGUgYXVkaW8gZWxlbWVudCAoZWwpIHdpbGwgb25seSBiZSB1c2VkIHRvIHRlc3QgYnJvd3NlciBzdXBwb3J0IGZvciB2YXJpb3VzIGF1ZGlvIGZvcm1hdHNcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjIyNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuTWFzdGVyIGNvbnRhaW5zIEF1ZGlvQ29udGV4dCBhbmQgdGhlIG1hc3RlciBzb3VuZCBvdXRwdXQuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczoyOTZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbmEgc2lsZW50IGNvbm5lY3Rpb24gdG8gdGhlIERlc2luYXRpb25Ob2RlXFxud2hpY2ggd2lsbCBlbnN1cmUgdGhhdCBhbnl0aGluZyBjb25uZWN0ZWQgdG8gaXRcXG53aWxsIG5vdCBiZSBnYXJiYWdlIGNvbGxlY3RlZFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6MzkxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjQwN1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuVXNlZCBieSBPc2MgYW5kIEVudiB0byBjaGFpbiBzaWduYWwgbWF0aFwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6NTgzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5UaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgdGhlIHA1LlNvdW5kRmlsZSBjYWxscyB0byBsb2FkXFxuaXRzZWxmLiBBY2NlcHRzIGEgY2FsbGJhY2sgKHRoZSBuYW1lIG9mIGFub3RoZXIgZnVuY3Rpb24pXFxuYXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLlwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6OTAzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5TdG9wIHBsYXliYWNrIG9uIGFsbCBvZiB0aGlzIHNvdW5kZmlsZSdzIHNvdXJjZXMuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczoxMzA0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjE3NDFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6MjAyMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczozMDIyXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjMzOTlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6MzQyMFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczozNDc5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjM3OTdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6Mzk2OVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo0MTI3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjQxNjhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6NDIzOFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo0NDI2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjQ0ODNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6NDY1MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo0Njk5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjQ3MzBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6NDc1MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo0NzcxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjU0NzhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6NTY4MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo3MzYzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjczNzlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6NzQwM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo3NDI5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjc0NTFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6NzQ3M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo3NTE5XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjc1NTBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6NzU2OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo3OTA1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjc5MjdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcblRoZSBwNS5FZmZlY3QgY2xhc3MgaXMgYnVpbHRcXG4gIHVzaW5nIFRvbmUuanMgQ3Jvc3NGYWRlXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo3OTk3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5JbiBjbGFzc2VzIHRoYXQgZXh0ZW5kXFxucDUuRWZmZWN0LCBjb25uZWN0IGVmZmVjdCBub2Rlc1xcbnRvIHRoZSB3ZXQgcGFyYW1ldGVyXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo4MDAzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5FUUZpbHRlciBleHRlbmRzIHA1LkZpbHRlciB3aXRoIGNvbnN0cmFpbnRzXFxubmVjZXNzYXJ5IGZvciB0aGUgcDUuRVFcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjgzODFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbkluc3BpcmVkIGJ5IFNpbXBsZSBSZXZlcmIgYnkgSm9yZGFuIFNhbnRlbGxcXG5odHRwczovL2dpdGh1Yi5jb20vd2ViLWF1ZGlvLWNvbXBvbmVudHMvc2ltcGxlLXJldmVyYi9ibG9iL21hc3Rlci9pbmRleC5qc1xcblxcblV0aWxpdHkgZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIGFuIGltcHVsc2UgcmVzcG9uc2VcXG5iYXNlZCBvbiB0aGUgbW9kdWxlIHBhcmFtZXRlcnMuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo5NDcxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5Qcml2YXRlIG1ldGhvZCB0byBsb2FkIGEgYnVmZmVyIGFzIGFuIEltcHVsc2UgUmVzcG9uc2UsXFxuYXNzaWduIGl0IHRvIHRoZSBjb252b2x2ZXJOb2RlLCBhbmQgYWRkIHRvIHRoZSBBcnJheSBvZiAuaW1wdWxzZXMuXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczo5NjM1XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjk4MjFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6OTg0NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxubXVzaWNhbFRpbWVNb2RlIHZhcmlhYmxlc1xcbm1vZGlmeSB0aGVzZSBvbmx5IHdoZW4gdGhlIGludGVydmFsIGlzIHNwZWNpZmllZCBpbiBtdXNpY2FsVGltZSBmb3JtYXQgYXMgYSBzdHJpbmdcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjEwNTcxXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5EbyBub3QgaW5pdGlhdGUgdGhlIGNhbGxiYWNrIGlmIHRpbWVGcm9tTm93IGlzIDwgMFxcblRoaXMgdXN1c3VhbGx5IG9jY3VycyBmb3IgYSBmZXcgbWlsbGlzZWNvbmRzIHdoZW4gdGhlIHBhZ2VcXG5pcyBub3QgZnVsbHkgbG9hZGVkXFxuXFxuVGhlIGNhbGxiYWNrIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB1bnRpbCBtYXhJdGVyYXRpb25zIGlzIHJlYWNoZWRcIixcbiAgICAgICAgICAgIFwibGluZVwiOiBcIiBsaWIvYWRkb25zL3A1LnNvdW5kLmpzOjEwNTg3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IFwiTWlzc2luZyBpdGVtIHR5cGVcXG5jYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHJlY29yZGluZyBpcyBvdmVyXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczoxMTA3MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuaW50ZXJuYWwgbWV0aG9kIGNhbGxlZCBvbiBhdWRpbyBwcm9jZXNzXCIsXG4gICAgICAgICAgICBcImxpbmVcIjogXCIgbGliL2FkZG9ucy9wNS5zb3VuZC5qczoxMTE1OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBcIk1pc3NpbmcgaXRlbSB0eXBlXFxuUHJpdmF0ZSBtZXRob2QgdG8gZW5zdXJlIGFjY3VyYXRlIHZhbHVlcyBvZiB0aGlzLl92b2ljZXNJblVzZVxcbkFueSB0aW1lIGEgbmV3IHZhbHVlIGlzIHNjaGVkdWxlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGluY3JlbWVudCBhbGwgc3Vic2VxdWVudFxcbnNjaGVkdWxlZFZhbHVlcyBhZnRlciBhdHRhY2ssIGFuZCBkZWNyZW1lbnQgYWxsIHN1YnNlcXVlbnRcXG5zY2hlZHVsZWRWYWx1ZXMgYWZ0ZXIgcmVsZWFzZVwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQuanM6MTIxNDJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcIm1lc3NhZ2VcIjogXCJNaXNzaW5nIGl0ZW0gdHlwZVxcbnA1LnNvdW5kXFxuaHR0cHM6Ly9wNWpzLm9yZy9yZWZlcmVuY2UvIy9saWJyYXJpZXMvcDUuc291bmRcXG5cXG5Gcm9tIHRoZSBQcm9jZXNzaW5nIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xcbmh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzLXNvdW5kL2dyYXBocy9jb250cmlidXRvcnNcXG5cXG5NSVQgTGljZW5zZSAoTUlUKVxcbmh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzLXNvdW5kL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcXG5cXG5Tb21lIG9mIHRoZSBtYW55IGF1ZGlvIGxpYnJhcmllcyAmIHJlc291cmNlcyB0aGF0IGluc3BpcmUgcDUuc291bmQ6XFxuIC0gVE9ORS5qcyAoYykgWW90YW0gTWFubi4gTGljZW5zZWQgdW5kZXIgVGhlIE1JVCBMaWNlbnNlIChNSVQpLiBodHRwczovL2dpdGh1Yi5jb20vVE9ORW5vVE9ORS9Ub25lLmpzXFxuIC0gYnV6ei5qcyAoYykgSmF5IFNhbHZhdC4gTGljZW5zZWQgdW5kZXIgVGhlIE1JVCBMaWNlbnNlIChNSVQpLiBodHRwOi8vYnV6ei5qYXlzYWx2YXQuY29tL1xcbiAtIEJvcmlzIFNtdXMgV2ViIEF1ZGlvIEFQSSBib29rLCAyMDEzLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXFxuIC0gd2F2ZXN1cmZlci5qcyBodHRwczovL2dpdGh1Yi5jb20va2F0c3BhdWdoL3dhdmVzdXJmZXIuanNcXG4gLSBXZWIgQXVkaW8gQ29tcG9uZW50cyBieSBKb3JkYW4gU2FudGVsbCBodHRwczovL2dpdGh1Yi5jb20vd2ViLWF1ZGlvLWNvbXBvbmVudHNcXG4gLSBXaWxtIFRob2JlbidzIFNvdW5kIGxpYnJhcnkgZm9yIFByb2Nlc3NpbmcgaHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmcvcHJvY2Vzc2luZy90cmVlL21hc3Rlci9qYXZhL2xpYnJhcmllcy9zb3VuZFxcblxcbiBXZWIgQXVkaW8gQVBJOiBodHRwOi8vdzMub3JnL1RSL3dlYmF1ZGlvL1wiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IFwiIGxpYi9hZGRvbnMvcDUuc291bmQubWluLmpzOjNcIlxuICAgICAgICB9XG4gICAgXSxcbiAgICBcImNvbnN0c1wiOiB7XG4gICAgICAgIFwiUkdCXCI6IFtcbiAgICAgICAgICAgIFwicDUuY29sb3JNb2RlXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJIU0JcIjogW1xuICAgICAgICAgICAgXCJwNS5jb2xvck1vZGVcIlxuICAgICAgICBdLFxuICAgICAgICBcIkhTTFwiOiBbXG4gICAgICAgICAgICBcInA1LmNvbG9yTW9kZVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiQ0hPUkRcIjogW1xuICAgICAgICAgICAgXCJwNS5hcmNcIlxuICAgICAgICBdLFxuICAgICAgICBcIlBJRVwiOiBbXG4gICAgICAgICAgICBcInA1LmFyY1wiXG4gICAgICAgIF0sXG4gICAgICAgIFwiT1BFTlwiOiBbXG4gICAgICAgICAgICBcInA1LmFyY1wiXG4gICAgICAgIF0sXG4gICAgICAgIFwiQ0VOVEVSXCI6IFtcbiAgICAgICAgICAgIFwicDUuZWxsaXBzZU1vZGVcIixcbiAgICAgICAgICAgIFwicDUucmVjdE1vZGVcIixcbiAgICAgICAgICAgIFwicDUuaW1hZ2VNb2RlXCIsXG4gICAgICAgICAgICBcInA1LnRleHRBbGlnblwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiUkFESVVTXCI6IFtcbiAgICAgICAgICAgIFwicDUuZWxsaXBzZU1vZGVcIixcbiAgICAgICAgICAgIFwicDUucmVjdE1vZGVcIlxuICAgICAgICBdLFxuICAgICAgICBcIkNPUk5FUlwiOiBbXG4gICAgICAgICAgICBcInA1LmVsbGlwc2VNb2RlXCIsXG4gICAgICAgICAgICBcInA1LnJlY3RNb2RlXCIsXG4gICAgICAgICAgICBcInA1LmltYWdlTW9kZVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiQ09STkVSU1wiOiBbXG4gICAgICAgICAgICBcInA1LmVsbGlwc2VNb2RlXCIsXG4gICAgICAgICAgICBcInA1LnJlY3RNb2RlXCIsXG4gICAgICAgICAgICBcInA1LmltYWdlTW9kZVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiU1FVQVJFXCI6IFtcbiAgICAgICAgICAgIFwicDUuc3Ryb2tlQ2FwXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJQUk9KRUNUXCI6IFtcbiAgICAgICAgICAgIFwicDUuc3Ryb2tlQ2FwXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJST1VORFwiOiBbXG4gICAgICAgICAgICBcInA1LnN0cm9rZUNhcFwiLFxuICAgICAgICAgICAgXCJwNS5zdHJva2VKb2luXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJNSVRFUlwiOiBbXG4gICAgICAgICAgICBcInA1LnN0cm9rZUpvaW5cIlxuICAgICAgICBdLFxuICAgICAgICBcIkJFVkVMXCI6IFtcbiAgICAgICAgICAgIFwicDUuc3Ryb2tlSm9pblwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiQVJST1dcIjogW1xuICAgICAgICAgICAgXCJwNS5jdXJzb3JcIlxuICAgICAgICBdLFxuICAgICAgICBcIkNST1NTXCI6IFtcbiAgICAgICAgICAgIFwicDUuY3Vyc29yXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJIQU5EXCI6IFtcbiAgICAgICAgICAgIFwicDUuY3Vyc29yXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJNT1ZFXCI6IFtcbiAgICAgICAgICAgIFwicDUuY3Vyc29yXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJURVhUXCI6IFtcbiAgICAgICAgICAgIFwicDUuY3Vyc29yXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJXQUlUXCI6IFtcbiAgICAgICAgICAgIFwicDUuY3Vyc29yXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJQMkRcIjogW1xuICAgICAgICAgICAgXCJwNS5jcmVhdGVDYW52YXNcIixcbiAgICAgICAgICAgIFwicDUuY3JlYXRlR3JhcGhpY3NcIlxuICAgICAgICBdLFxuICAgICAgICBcIldFQkdMXCI6IFtcbiAgICAgICAgICAgIFwicDUuY3JlYXRlQ2FudmFzXCIsXG4gICAgICAgICAgICBcInA1LmNyZWF0ZUdyYXBoaWNzXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJCTEVORFwiOiBbXG4gICAgICAgICAgICBcInA1LmJsZW5kTW9kZVwiLFxuICAgICAgICAgICAgXCJwNS5JbWFnZS5ibGVuZFwiLFxuICAgICAgICAgICAgXCJwNS5ibGVuZFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiREFSS0VTVFwiOiBbXG4gICAgICAgICAgICBcInA1LmJsZW5kTW9kZVwiLFxuICAgICAgICAgICAgXCJwNS5JbWFnZS5ibGVuZFwiLFxuICAgICAgICAgICAgXCJwNS5ibGVuZFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiTElHSFRFU1RcIjogW1xuICAgICAgICAgICAgXCJwNS5ibGVuZE1vZGVcIixcbiAgICAgICAgICAgIFwicDUuSW1hZ2UuYmxlbmRcIixcbiAgICAgICAgICAgIFwicDUuYmxlbmRcIlxuICAgICAgICBdLFxuICAgICAgICBcIkRJRkZFUkVOQ0VcIjogW1xuICAgICAgICAgICAgXCJwNS5ibGVuZE1vZGVcIixcbiAgICAgICAgICAgIFwicDUuSW1hZ2UuYmxlbmRcIixcbiAgICAgICAgICAgIFwicDUuYmxlbmRcIlxuICAgICAgICBdLFxuICAgICAgICBcIk1VTFRJUExZXCI6IFtcbiAgICAgICAgICAgIFwicDUuYmxlbmRNb2RlXCIsXG4gICAgICAgICAgICBcInA1LkltYWdlLmJsZW5kXCIsXG4gICAgICAgICAgICBcInA1LmJsZW5kXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJFWENMVVNJT05cIjogW1xuICAgICAgICAgICAgXCJwNS5ibGVuZE1vZGVcIixcbiAgICAgICAgICAgIFwicDUuSW1hZ2UuYmxlbmRcIixcbiAgICAgICAgICAgIFwicDUuYmxlbmRcIlxuICAgICAgICBdLFxuICAgICAgICBcIlNDUkVFTlwiOiBbXG4gICAgICAgICAgICBcInA1LmJsZW5kTW9kZVwiLFxuICAgICAgICAgICAgXCJwNS5JbWFnZS5ibGVuZFwiLFxuICAgICAgICAgICAgXCJwNS5ibGVuZFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiUkVQTEFDRVwiOiBbXG4gICAgICAgICAgICBcInA1LmJsZW5kTW9kZVwiLFxuICAgICAgICAgICAgXCJwNS5JbWFnZS5ibGVuZFwiLFxuICAgICAgICAgICAgXCJwNS5ibGVuZFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiT1ZFUkxBWVwiOiBbXG4gICAgICAgICAgICBcInA1LmJsZW5kTW9kZVwiLFxuICAgICAgICAgICAgXCJwNS5JbWFnZS5ibGVuZFwiLFxuICAgICAgICAgICAgXCJwNS5ibGVuZFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiSEFSRF9MSUdIVFwiOiBbXG4gICAgICAgICAgICBcInA1LmJsZW5kTW9kZVwiLFxuICAgICAgICAgICAgXCJwNS5JbWFnZS5ibGVuZFwiLFxuICAgICAgICAgICAgXCJwNS5ibGVuZFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiU09GVF9MSUdIVFwiOiBbXG4gICAgICAgICAgICBcInA1LmJsZW5kTW9kZVwiLFxuICAgICAgICAgICAgXCJwNS5JbWFnZS5ibGVuZFwiLFxuICAgICAgICAgICAgXCJwNS5ibGVuZFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiRE9ER0VcIjogW1xuICAgICAgICAgICAgXCJwNS5ibGVuZE1vZGVcIixcbiAgICAgICAgICAgIFwicDUuSW1hZ2UuYmxlbmRcIixcbiAgICAgICAgICAgIFwicDUuYmxlbmRcIlxuICAgICAgICBdLFxuICAgICAgICBcIkJVUk5cIjogW1xuICAgICAgICAgICAgXCJwNS5ibGVuZE1vZGVcIixcbiAgICAgICAgICAgIFwicDUuSW1hZ2UuYmxlbmRcIixcbiAgICAgICAgICAgIFwicDUuYmxlbmRcIlxuICAgICAgICBdLFxuICAgICAgICBcIkFERFwiOiBbXG4gICAgICAgICAgICBcInA1LmJsZW5kTW9kZVwiLFxuICAgICAgICAgICAgXCJwNS5JbWFnZS5ibGVuZFwiLFxuICAgICAgICAgICAgXCJwNS5ibGVuZFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiTk9STUFMXCI6IFtcbiAgICAgICAgICAgIFwicDUuYmxlbmRNb2RlXCIsXG4gICAgICAgICAgICBcInA1LkltYWdlLmJsZW5kXCIsXG4gICAgICAgICAgICBcInA1LmJsZW5kXCIsXG4gICAgICAgICAgICBcInA1LnRleHRTdHlsZVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiUE9JTlRTXCI6IFtcbiAgICAgICAgICAgIFwicDUuYmVnaW5TaGFwZVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiTElORVNcIjogW1xuICAgICAgICAgICAgXCJwNS5iZWdpblNoYXBlXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJUUklBTkdMRVNcIjogW1xuICAgICAgICAgICAgXCJwNS5iZWdpblNoYXBlXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJUUklBTkdMRV9GQU5cIjogW1xuICAgICAgICAgICAgXCJwNS5iZWdpblNoYXBlXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJUUklBTkdMRV9TVFJJUFwiOiBbXG4gICAgICAgICAgICBcInA1LmJlZ2luU2hhcGVcIlxuICAgICAgICBdLFxuICAgICAgICBcIlFVQURTXCI6IFtcbiAgICAgICAgICAgIFwicDUuYmVnaW5TaGFwZVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiUVVBRF9TVFJJUFwiOiBbXG4gICAgICAgICAgICBcInA1LmJlZ2luU2hhcGVcIlxuICAgICAgICBdLFxuICAgICAgICBcIkNMT1NFXCI6IFtcbiAgICAgICAgICAgIFwicDUuZW5kU2hhcGVcIlxuICAgICAgICBdLFxuICAgICAgICBcIlRIUkVTSE9MRFwiOiBbXG4gICAgICAgICAgICBcInA1LkltYWdlLmZpbHRlclwiLFxuICAgICAgICAgICAgXCJwNS5maWx0ZXJcIlxuICAgICAgICBdLFxuICAgICAgICBcIkdSQVlcIjogW1xuICAgICAgICAgICAgXCJwNS5JbWFnZS5maWx0ZXJcIixcbiAgICAgICAgICAgIFwicDUuZmlsdGVyXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJPUEFRVUVcIjogW1xuICAgICAgICAgICAgXCJwNS5JbWFnZS5maWx0ZXJcIixcbiAgICAgICAgICAgIFwicDUuZmlsdGVyXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJJTlZFUlRcIjogW1xuICAgICAgICAgICAgXCJwNS5JbWFnZS5maWx0ZXJcIixcbiAgICAgICAgICAgIFwicDUuZmlsdGVyXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJQT1NURVJJWkVcIjogW1xuICAgICAgICAgICAgXCJwNS5JbWFnZS5maWx0ZXJcIixcbiAgICAgICAgICAgIFwicDUuZmlsdGVyXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJCTFVSXCI6IFtcbiAgICAgICAgICAgIFwicDUuSW1hZ2UuZmlsdGVyXCIsXG4gICAgICAgICAgICBcInA1LmZpbHRlclwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiRVJPREVcIjogW1xuICAgICAgICAgICAgXCJwNS5JbWFnZS5maWx0ZXJcIixcbiAgICAgICAgICAgIFwicDUuZmlsdGVyXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJESUxBVEVcIjogW1xuICAgICAgICAgICAgXCJwNS5JbWFnZS5maWx0ZXJcIixcbiAgICAgICAgICAgIFwicDUuZmlsdGVyXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJSQURJQU5TXCI6IFtcbiAgICAgICAgICAgIFwicDUuYW5nbGVNb2RlXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJERUdSRUVTXCI6IFtcbiAgICAgICAgICAgIFwicDUuYW5nbGVNb2RlXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJMRUZUXCI6IFtcbiAgICAgICAgICAgIFwicDUudGV4dEFsaWduXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJSSUdIVFwiOiBbXG4gICAgICAgICAgICBcInA1LnRleHRBbGlnblwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiVE9QXCI6IFtcbiAgICAgICAgICAgIFwicDUudGV4dEFsaWduXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJCT1RUT01cIjogW1xuICAgICAgICAgICAgXCJwNS50ZXh0QWxpZ25cIlxuICAgICAgICBdLFxuICAgICAgICBcIkJBU0VMSU5FXCI6IFtcbiAgICAgICAgICAgIFwicDUudGV4dEFsaWduXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJJVEFMSUNcIjogW1xuICAgICAgICAgICAgXCJwNS50ZXh0U3R5bGVcIlxuICAgICAgICBdLFxuICAgICAgICBcIkJPTERcIjogW1xuICAgICAgICAgICAgXCJwNS50ZXh0U3R5bGVcIlxuICAgICAgICBdLFxuICAgICAgICBcIlZJREVPXCI6IFtcbiAgICAgICAgICAgIFwicDUuZG9tLmNyZWF0ZUNhcHR1cmVcIlxuICAgICAgICBdLFxuICAgICAgICBcIkFVRElPXCI6IFtcbiAgICAgICAgICAgIFwicDUuZG9tLmNyZWF0ZUNhcHR1cmVcIlxuICAgICAgICBdLFxuICAgICAgICBcIkFVVE9cIjogW1xuICAgICAgICAgICAgXCJwNS5FbGVtZW50LnNpemVcIlxuICAgICAgICBdXG4gICAgfVxufVxufSx7fV0sMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgbG9va3VwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG47KGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuICB2YXIgQXJyID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJylcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IEFycmF5XG5cblx0dmFyIFBMVVMgICA9ICcrJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSCAgPSAnLycuY2hhckNvZGVBdCgwKVxuXHR2YXIgTlVNQkVSID0gJzAnLmNoYXJDb2RlQXQoMClcblx0dmFyIExPV0VSICA9ICdhJy5jaGFyQ29kZUF0KDApXG5cdHZhciBVUFBFUiAgPSAnQScuY2hhckNvZGVBdCgwKVxuXHR2YXIgUExVU19VUkxfU0FGRSA9ICctJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSF9VUkxfU0FGRSA9ICdfJy5jaGFyQ29kZUF0KDApXG5cblx0ZnVuY3Rpb24gZGVjb2RlIChlbHQpIHtcblx0XHR2YXIgY29kZSA9IGVsdC5jaGFyQ29kZUF0KDApXG5cdFx0aWYgKGNvZGUgPT09IFBMVVMgfHxcblx0XHQgICAgY29kZSA9PT0gUExVU19VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MiAvLyAnKydcblx0XHRpZiAoY29kZSA9PT0gU0xBU0ggfHxcblx0XHQgICAgY29kZSA9PT0gU0xBU0hfVVJMX1NBRkUpXG5cdFx0XHRyZXR1cm4gNjMgLy8gJy8nXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIpXG5cdFx0XHRyZXR1cm4gLTEgLy9ubyBtYXRjaFxuXHRcdGlmIChjb2RlIDwgTlVNQkVSICsgMTApXG5cdFx0XHRyZXR1cm4gY29kZSAtIE5VTUJFUiArIDI2ICsgMjZcblx0XHRpZiAoY29kZSA8IFVQUEVSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIFVQUEVSXG5cdFx0aWYgKGNvZGUgPCBMT1dFUiArIDI2KVxuXHRcdFx0cmV0dXJuIGNvZGUgLSBMT1dFUiArIDI2XG5cdH1cblxuXHRmdW5jdGlvbiBiNjRUb0J5dGVBcnJheSAoYjY0KSB7XG5cdFx0dmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcblxuXHRcdGlmIChiNjQubGVuZ3RoICUgNCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG5cdFx0fVxuXG5cdFx0Ly8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcblx0XHQvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG5cdFx0Ly8gcmVwcmVzZW50IG9uZSBieXRlXG5cdFx0Ly8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG5cdFx0Ly8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuXHRcdHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cdFx0cGxhY2VIb2xkZXJzID0gJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDIpID8gMiA6ICc9JyA9PT0gYjY0LmNoYXJBdChsZW4gLSAxKSA/IDEgOiAwXG5cblx0XHQvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcblx0XHRhcnIgPSBuZXcgQXJyKGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuXHRcdC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblx0XHRsID0gcGxhY2VIb2xkZXJzID4gMCA/IGI2NC5sZW5ndGggLSA0IDogYjY0Lmxlbmd0aFxuXG5cdFx0dmFyIEwgPSAwXG5cblx0XHRmdW5jdGlvbiBwdXNoICh2KSB7XG5cdFx0XHRhcnJbTCsrXSA9IHZcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDE4KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpIDw8IDYpIHwgZGVjb2RlKGI2NC5jaGFyQXQoaSArIDMpKVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwMDApID4+IDE2KVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwKSA+PiA4KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH1cblxuXHRcdGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMikgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA+PiA0KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDEwKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPj4gMilcblx0XHRcdHB1c2goKHRtcCA+PiA4KSAmIDB4RkYpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFyclxuXHR9XG5cblx0ZnVuY3Rpb24gdWludDhUb0Jhc2U2NCAodWludDgpIHtcblx0XHR2YXIgaSxcblx0XHRcdGV4dHJhQnl0ZXMgPSB1aW50OC5sZW5ndGggJSAzLCAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuXHRcdFx0b3V0cHV0ID0gXCJcIixcblx0XHRcdHRlbXAsIGxlbmd0aFxuXG5cdFx0ZnVuY3Rpb24gZW5jb2RlIChudW0pIHtcblx0XHRcdHJldHVybiBsb29rdXAuY2hhckF0KG51bSlcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuXHRcdFx0cmV0dXJuIGVuY29kZShudW0gPj4gMTggJiAweDNGKSArIGVuY29kZShudW0gPj4gMTIgJiAweDNGKSArIGVuY29kZShudW0gPj4gNiAmIDB4M0YpICsgZW5jb2RlKG51bSAmIDB4M0YpXG5cdFx0fVxuXG5cdFx0Ly8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuXHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHVpbnQ4Lmxlbmd0aCAtIGV4dHJhQnl0ZXM7IGkgPCBsZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0dGVtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcblx0XHRcdG91dHB1dCArPSB0cmlwbGV0VG9CYXNlNjQodGVtcClcblx0XHR9XG5cblx0XHQvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cdFx0c3dpdGNoIChleHRyYUJ5dGVzKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHRlbXAgPSB1aW50OFt1aW50OC5sZW5ndGggLSAxXVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPT0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRlbXAgPSAodWludDhbdWludDgubGVuZ3RoIC0gMl0gPDwgOCkgKyAodWludDhbdWludDgubGVuZ3RoIC0gMV0pXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAxMClcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA+PiA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPDwgMikgJiAweDNGKVxuXHRcdFx0XHRvdXRwdXQgKz0gJz0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dFxuXHR9XG5cblx0ZXhwb3J0cy50b0J5dGVBcnJheSA9IGI2NFRvQnl0ZUFycmF5XG5cdGV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IHVpbnQ4VG9CYXNlNjRcbn0odHlwZW9mIGV4cG9ydHMgPT09ICd1bmRlZmluZWQnID8gKHRoaXMuYmFzZTY0anMgPSB7fSkgOiBleHBvcnRzKSlcblxufSx7fV0sMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cbn0se31dLDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uIChnbG9iYWwpe1xuLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSBfZGVyZXFfKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSBfZGVyZXFfKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gX2RlcmVxXygnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG52YXIgcm9vdFBhcmVudCA9IHt9XG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gU2FmYXJpIDUtNyBsYWNrcyBzdXBwb3J0IGZvciBjaGFuZ2luZyB0aGUgYE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3JgIHByb3BlcnR5XG4gKiAgICAgb24gb2JqZWN0cy5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIGZ1bmN0aW9uIEJhciAoKSB7fVxuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5mb28gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9XG4gICAgYXJyLmNvbnN0cnVjdG9yID0gQmFyXG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgYXJyLmNvbnN0cnVjdG9yID09PSBCYXIgJiYgLy8gY29uc3RydWN0b3IgY2FuIGJlIHNldFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG4vKipcbiAqIENsYXNzOiBCdWZmZXJcbiAqID09PT09PT09PT09PT1cbiAqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGFyZSBhdWdtZW50ZWRcbiAqIHdpdGggZnVuY3Rpb24gcHJvcGVydGllcyBmb3IgYWxsIHRoZSBub2RlIGBCdWZmZXJgIEFQSSBmdW5jdGlvbnMuIFdlIHVzZVxuICogYFVpbnQ4QXJyYXlgIHNvIHRoYXQgc3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXQgcmV0dXJuc1xuICogYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogQnkgYXVnbWVudGluZyB0aGUgaW5zdGFuY2VzLCB3ZSBjYW4gYXZvaWQgbW9kaWZ5aW5nIHRoZSBgVWludDhBcnJheWBcbiAqIHByb3RvdHlwZS5cbiAqL1xuZnVuY3Rpb24gQnVmZmVyIChhcmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAvLyBBdm9pZCBnb2luZyB0aHJvdWdoIGFuIEFyZ3VtZW50c0FkYXB0b3JUcmFtcG9saW5lIGluIHRoZSBjb21tb24gY2FzZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHJldHVybiBuZXcgQnVmZmVyKGFyZywgYXJndW1lbnRzWzFdKVxuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZylcbiAgfVxuXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmcm9tTnVtYmVyKHRoaXMsIGFyZylcbiAgfVxuXG4gIC8vIFNsaWdodGx5IGxlc3MgY29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoaXMsIGFyZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiAndXRmOCcpXG4gIH1cblxuICAvLyBVbnVzdWFsLlxuICByZXR1cm4gZnJvbU9iamVjdCh0aGlzLCBhcmcpXG59XG5cbmZ1bmN0aW9uIGZyb21OdW1iZXIgKHRoYXQsIGxlbmd0aCkge1xuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGxlbmd0aCkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgLy8gQXNzdW1wdGlvbjogYnl0ZUxlbmd0aCgpIHJldHVybiB2YWx1ZSBpcyBhbHdheXMgPCBrTWF4TGVuZ3RoLlxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcblxuICB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iamVjdCkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iamVjdCkpIHJldHVybiBmcm9tQnVmZmVyKHRoYXQsIG9iamVjdClcblxuICBpZiAoaXNBcnJheShvYmplY3QpKSByZXR1cm4gZnJvbUFycmF5KHRoYXQsIG9iamVjdClcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdXN0IHN0YXJ0IHdpdGggbnVtYmVyLCBidWZmZXIsIGFycmF5IG9yIHN0cmluZycpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChvYmplY3QuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmcm9tVHlwZWRBcnJheSh0aGF0LCBvYmplY3QpXG4gICAgfVxuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCBvYmplY3QpXG4gICAgfVxuICB9XG5cbiAgaWYgKG9iamVjdC5sZW5ndGgpIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iamVjdClcblxuICByZXR1cm4gZnJvbUpzb25PYmplY3QodGhhdCwgb2JqZWN0KVxufVxuXG5mdW5jdGlvbiBmcm9tQnVmZmVyICh0aGF0LCBidWZmZXIpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYnVmZmVyLmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGJ1ZmZlci5jb3B5KHRoYXQsIDAsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5ICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLy8gRHVwbGljYXRlIG9mIGZyb21BcnJheSgpIHRvIGtlZXAgZnJvbUFycmF5KCkgbW9ub21vcnBoaWMuXG5mdW5jdGlvbiBmcm9tVHlwZWRBcnJheSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgLy8gVHJ1bmNhdGluZyB0aGUgZWxlbWVudHMgaXMgcHJvYmFibHkgbm90IHdoYXQgcGVvcGxlIGV4cGVjdCBmcm9tIHR5cGVkXG4gIC8vIGFycmF5cyB3aXRoIEJZVEVTX1BFUl9FTEVNRU5UID4gMSBidXQgaXQncyBjb21wYXRpYmxlIHdpdGggdGhlIGJlaGF2aW9yXG4gIC8vIG9mIHRoZSBvbGQgQnVmZmVyIGNvbnN0cnVjdG9yLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSkge1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICBhcnJheS5ieXRlTGVuZ3RoXG4gICAgdGhhdCA9IEJ1ZmZlci5fYXVnbWVudChuZXcgVWludDhBcnJheShhcnJheSkpXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tVHlwZWRBcnJheSh0aGF0LCBuZXcgVWludDhBcnJheShhcnJheSkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8vIERlc2VyaWFsaXplIHsgdHlwZTogJ0J1ZmZlcicsIGRhdGE6IFsxLDIsMywuLi5dIH0gaW50byBhIEJ1ZmZlciBvYmplY3QuXG4vLyBSZXR1cm5zIGEgemVyby1sZW5ndGggYnVmZmVyIGZvciBpbnB1dHMgdGhhdCBkb24ndCBjb25mb3JtIHRvIHRoZSBzcGVjLlxuZnVuY3Rpb24gZnJvbUpzb25PYmplY3QgKHRoYXQsIG9iamVjdCkge1xuICB2YXIgYXJyYXlcbiAgdmFyIGxlbmd0aCA9IDBcblxuICBpZiAob2JqZWN0LnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqZWN0LmRhdGEpKSB7XG4gICAgYXJyYXkgPSBvYmplY3QuZGF0YVxuICAgIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgfVxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxufSBlbHNlIHtcbiAgLy8gcHJlLXNldCBmb3IgdmFsdWVzIHRoYXQgbWF5IGV4aXN0IGluIHRoZSBmdXR1cmVcbiAgQnVmZmVyLnByb3RvdHlwZS5sZW5ndGggPSB1bmRlZmluZWRcbiAgQnVmZmVyLnByb3RvdHlwZS5wYXJlbnQgPSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gYWxsb2NhdGUgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gQnVmZmVyLl9hdWdtZW50KG5ldyBVaW50OEFycmF5KGxlbmd0aCkpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gICAgdGhhdC5faXNCdWZmZXIgPSB0cnVlXG4gIH1cblxuICB2YXIgZnJvbVBvb2wgPSBsZW5ndGggIT09IDAgJiYgbGVuZ3RoIDw9IEJ1ZmZlci5wb29sU2l6ZSA+Pj4gMVxuICBpZiAoZnJvbVBvb2wpIHRoYXQucGFyZW50ID0gcm9vdFBhcmVudFxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAoc3ViamVjdCwgZW5jb2RpbmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNsb3dCdWZmZXIpKSByZXR1cm4gbmV3IFNsb3dCdWZmZXIoc3ViamVjdCwgZW5jb2RpbmcpXG5cbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoc3ViamVjdCwgZW5jb2RpbmcpXG4gIGRlbGV0ZSBidWYucGFyZW50XG4gIHJldHVybiBidWZcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIHZhciBpID0gMFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkgYnJlYWtcblxuICAgICsraVxuICB9XG5cbiAgaWYgKGkgIT09IGxlbikge1xuICAgIHggPSBhW2ldXG4gICAgeSA9IGJbaV1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAncmF3JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignbGlzdCBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMuJylcblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldXG4gICAgaXRlbS5jb3B5KGJ1ZiwgcG9zKVxuICAgIHBvcyArPSBpdGVtLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHN0cmluZyA9ICcnICsgc3RyaW5nXG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAvLyBEZXByZWNhdGVkXG4gICAgICBjYXNlICdyYXcnOlxuICAgICAgY2FzZSAncmF3cyc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgc3RhcnQgPSBzdGFydCB8IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID09PSBJbmZpbml0eSA/IHRoaXMubGVuZ3RoIDogZW5kIHwgMFxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG4gIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiAnJ1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGJpbmFyeVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gMFxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYilcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0KSB7XG4gIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgYnl0ZU9mZnNldCA+Pj0gMFxuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG4gIGlmIChieXRlT2Zmc2V0ID49IHRoaXMubGVuZ3RoKSByZXR1cm4gLTFcblxuICAvLyBOZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoICsgYnl0ZU9mZnNldCwgMClcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xIC8vIHNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nIGFsd2F5cyBmYWlsc1xuICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKHRoaXMsIFsgdmFsIF0sIGJ5dGVPZmZzZXQpXG4gIH1cblxuICBmdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0KSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAodmFyIGkgPSAwOyBieXRlT2Zmc2V0ICsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltieXRlT2Zmc2V0ICsgaV0gPT09IHZhbFtmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleF0pIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWwubGVuZ3RoKSByZXR1cm4gYnl0ZU9mZnNldCArIGZvdW5kSW5kZXhcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbi8vIGBnZXRgIGlzIGRlcHJlY2F0ZWRcbkJ1ZmZlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChvZmZzZXQpIHtcbiAgY29uc29sZS5sb2coJy5nZXQoKSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdXNpbmcgYXJyYXkgaW5kZXhlcyBpbnN0ZWFkLicpXG4gIHJldHVybiB0aGlzLnJlYWRVSW50OChvZmZzZXQpXG59XG5cbi8vIGBzZXRgIGlzIGRlcHJlY2F0ZWRcbkJ1ZmZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0ICh2LCBvZmZzZXQpIHtcbiAgY29uc29sZS5sb2coJy5zZXQoKSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdXNpbmcgYXJyYXkgaW5kZXhlcyBpbnN0ZWFkLicpXG4gIHJldHVybiB0aGlzLndyaXRlVUludDgodiwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJpbmFyeVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3dhcCA9IGVuY29kaW5nXG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBvZmZzZXQgPSBsZW5ndGggfCAwXG4gICAgbGVuZ3RoID0gc3dhcFxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBiaW5hcnlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGJpbmFyeVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSBCdWZmZXIuX2F1Z21lbnQodGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSlcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyBpKyspIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXdCdWYubGVuZ3RoKSBuZXdCdWYucGFyZW50ID0gdGhpcy5wYXJlbnQgfHwgdGhpc1xuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignYnVmZmVyIG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCd2YWx1ZSBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSwgMClcblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSwgMClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyBpKyspIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IHZhbHVlIDwgMCA/IDEgOiAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gdmFsdWUgPCAwID8gMSA6IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRhcmdldC5fc2V0KHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSwgdGFyZ2V0U3RhcnQpXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIGZpbGwodmFsdWUsIHN0YXJ0PTAsIGVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCF2YWx1ZSkgdmFsdWUgPSAwXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCkgZW5kID0gdGhpcy5sZW5ndGhcblxuICBpZiAoZW5kIDwgc3RhcnQpIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmQgPCBzdGFydCcpXG5cbiAgLy8gRmlsbCAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IHZhbHVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IHV0ZjhUb0J5dGVzKHZhbHVlLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBgQXJyYXlCdWZmZXJgIHdpdGggdGhlICpjb3BpZWQqIG1lbW9yeSBvZiB0aGUgYnVmZmVyIGluc3RhbmNlLlxuICogQWRkZWQgaW4gTm9kZSAwLjEyLiBPbmx5IGF2YWlsYWJsZSBpbiBicm93c2VycyB0aGF0IHN1cHBvcnQgQXJyYXlCdWZmZXIuXG4gKi9cbkJ1ZmZlci5wcm90b3R5cGUudG9BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIHRvQXJyYXlCdWZmZXIgKCkge1xuICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICByZXR1cm4gKG5ldyBCdWZmZXIodGhpcykpLmJ1ZmZlclxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5sZW5ndGgpXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGJ1ZltpXSA9IHRoaXNbaV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBidWYuYnVmZmVyXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0J1ZmZlci50b0FycmF5QnVmZmVyIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyJylcbiAgfVxufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBCUCA9IEJ1ZmZlci5wcm90b3R5cGVcblxuLyoqXG4gKiBBdWdtZW50IGEgVWludDhBcnJheSAqaW5zdGFuY2UqIChub3QgdGhlIFVpbnQ4QXJyYXkgY2xhc3MhKSB3aXRoIEJ1ZmZlciBtZXRob2RzXG4gKi9cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIF9hdWdtZW50IChhcnIpIHtcbiAgYXJyLmNvbnN0cnVjdG9yID0gQnVmZmVyXG4gIGFyci5faXNCdWZmZXIgPSB0cnVlXG5cbiAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gb3JpZ2luYWwgVWludDhBcnJheSBzZXQgbWV0aG9kIGJlZm9yZSBvdmVyd3JpdGluZ1xuICBhcnIuX3NldCA9IGFyci5zZXRcblxuICAvLyBkZXByZWNhdGVkXG4gIGFyci5nZXQgPSBCUC5nZXRcbiAgYXJyLnNldCA9IEJQLnNldFxuXG4gIGFyci53cml0ZSA9IEJQLndyaXRlXG4gIGFyci50b1N0cmluZyA9IEJQLnRvU3RyaW5nXG4gIGFyci50b0xvY2FsZVN0cmluZyA9IEJQLnRvU3RyaW5nXG4gIGFyci50b0pTT04gPSBCUC50b0pTT05cbiAgYXJyLmVxdWFscyA9IEJQLmVxdWFsc1xuICBhcnIuY29tcGFyZSA9IEJQLmNvbXBhcmVcbiAgYXJyLmluZGV4T2YgPSBCUC5pbmRleE9mXG4gIGFyci5jb3B5ID0gQlAuY29weVxuICBhcnIuc2xpY2UgPSBCUC5zbGljZVxuICBhcnIucmVhZFVJbnRMRSA9IEJQLnJlYWRVSW50TEVcbiAgYXJyLnJlYWRVSW50QkUgPSBCUC5yZWFkVUludEJFXG4gIGFyci5yZWFkVUludDggPSBCUC5yZWFkVUludDhcbiAgYXJyLnJlYWRVSW50MTZMRSA9IEJQLnJlYWRVSW50MTZMRVxuICBhcnIucmVhZFVJbnQxNkJFID0gQlAucmVhZFVJbnQxNkJFXG4gIGFyci5yZWFkVUludDMyTEUgPSBCUC5yZWFkVUludDMyTEVcbiAgYXJyLnJlYWRVSW50MzJCRSA9IEJQLnJlYWRVSW50MzJCRVxuICBhcnIucmVhZEludExFID0gQlAucmVhZEludExFXG4gIGFyci5yZWFkSW50QkUgPSBCUC5yZWFkSW50QkVcbiAgYXJyLnJlYWRJbnQ4ID0gQlAucmVhZEludDhcbiAgYXJyLnJlYWRJbnQxNkxFID0gQlAucmVhZEludDE2TEVcbiAgYXJyLnJlYWRJbnQxNkJFID0gQlAucmVhZEludDE2QkVcbiAgYXJyLnJlYWRJbnQzMkxFID0gQlAucmVhZEludDMyTEVcbiAgYXJyLnJlYWRJbnQzMkJFID0gQlAucmVhZEludDMyQkVcbiAgYXJyLnJlYWRGbG9hdExFID0gQlAucmVhZEZsb2F0TEVcbiAgYXJyLnJlYWRGbG9hdEJFID0gQlAucmVhZEZsb2F0QkVcbiAgYXJyLnJlYWREb3VibGVMRSA9IEJQLnJlYWREb3VibGVMRVxuICBhcnIucmVhZERvdWJsZUJFID0gQlAucmVhZERvdWJsZUJFXG4gIGFyci53cml0ZVVJbnQ4ID0gQlAud3JpdGVVSW50OFxuICBhcnIud3JpdGVVSW50TEUgPSBCUC53cml0ZVVJbnRMRVxuICBhcnIud3JpdGVVSW50QkUgPSBCUC53cml0ZVVJbnRCRVxuICBhcnIud3JpdGVVSW50MTZMRSA9IEJQLndyaXRlVUludDE2TEVcbiAgYXJyLndyaXRlVUludDE2QkUgPSBCUC53cml0ZVVJbnQxNkJFXG4gIGFyci53cml0ZVVJbnQzMkxFID0gQlAud3JpdGVVSW50MzJMRVxuICBhcnIud3JpdGVVSW50MzJCRSA9IEJQLndyaXRlVUludDMyQkVcbiAgYXJyLndyaXRlSW50TEUgPSBCUC53cml0ZUludExFXG4gIGFyci53cml0ZUludEJFID0gQlAud3JpdGVJbnRCRVxuICBhcnIud3JpdGVJbnQ4ID0gQlAud3JpdGVJbnQ4XG4gIGFyci53cml0ZUludDE2TEUgPSBCUC53cml0ZUludDE2TEVcbiAgYXJyLndyaXRlSW50MTZCRSA9IEJQLndyaXRlSW50MTZCRVxuICBhcnIud3JpdGVJbnQzMkxFID0gQlAud3JpdGVJbnQzMkxFXG4gIGFyci53cml0ZUludDMyQkUgPSBCUC53cml0ZUludDMyQkVcbiAgYXJyLndyaXRlRmxvYXRMRSA9IEJQLndyaXRlRmxvYXRMRVxuICBhcnIud3JpdGVGbG9hdEJFID0gQlAud3JpdGVGbG9hdEJFXG4gIGFyci53cml0ZURvdWJsZUxFID0gQlAud3JpdGVEb3VibGVMRVxuICBhcnIud3JpdGVEb3VibGVCRSA9IEJQLndyaXRlRG91YmxlQkVcbiAgYXJyLmZpbGwgPSBCUC5maWxsXG4gIGFyci5pbnNwZWN0ID0gQlAuaW5zcGVjdFxuICBhcnIudG9BcnJheUJ1ZmZlciA9IEJQLnRvQXJyYXlCdWZmZXJcblxuICByZXR1cm4gYXJyXG59XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbn0se1wiYmFzZTY0LWpzXCI6MixcImllZWU3NTRcIjo4LFwiaXNhcnJheVwiOjl9XSw1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbihmdW5jdGlvbiAocHJvY2VzcyxnbG9iYWwpe1xuLyohXG4gKiBAb3ZlcnZpZXcgZXM2LXByb21pc2UgLSBhIHRpbnkgaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZXMvQSsuXG4gKiBAY29weXJpZ2h0IENvcHlyaWdodCAoYykgMjAxNCBZZWh1ZGEgS2F0eiwgVG9tIERhbGUsIFN0ZWZhbiBQZW5uZXIgYW5kIGNvbnRyaWJ1dG9ycyAoQ29udmVyc2lvbiB0byBFUzYgQVBJIGJ5IEpha2UgQXJjaGliYWxkKVxuICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZVxuICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3N0ZWZhbnBlbm5lci9lczYtcHJvbWlzZS9tYXN0ZXIvTElDRU5TRVxuICogQHZlcnNpb24gICA0LjEuMVxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5FUzZQcm9taXNlID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBvYmplY3RPckZ1bmN0aW9uKHgpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgeDtcbiAgcmV0dXJuIHggIT09IG51bGwgJiYgKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdmdW5jdGlvbicpO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xufVxuXG52YXIgX2lzQXJyYXkgPSB1bmRlZmluZWQ7XG5pZiAoQXJyYXkuaXNBcnJheSkge1xuICBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG59IGVsc2Uge1xuICBfaXNBcnJheSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgfTtcbn1cblxudmFyIGlzQXJyYXkgPSBfaXNBcnJheTtcblxudmFyIGxlbiA9IDA7XG52YXIgdmVydHhOZXh0ID0gdW5kZWZpbmVkO1xudmFyIGN1c3RvbVNjaGVkdWxlckZuID0gdW5kZWZpbmVkO1xuXG52YXIgYXNhcCA9IGZ1bmN0aW9uIGFzYXAoY2FsbGJhY2ssIGFyZykge1xuICBxdWV1ZVtsZW5dID0gY2FsbGJhY2s7XG4gIHF1ZXVlW2xlbiArIDFdID0gYXJnO1xuICBsZW4gKz0gMjtcbiAgaWYgKGxlbiA9PT0gMikge1xuICAgIC8vIElmIGxlbiBpcyAyLCB0aGF0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBhc3luYyBmbHVzaC5cbiAgICAvLyBJZiBhZGRpdGlvbmFsIGNhbGxiYWNrcyBhcmUgcXVldWVkIGJlZm9yZSB0aGUgcXVldWUgaXMgZmx1c2hlZCwgdGhleVxuICAgIC8vIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgZmx1c2ggdGhhdCB3ZSBhcmUgc2NoZWR1bGluZy5cbiAgICBpZiAoY3VzdG9tU2NoZWR1bGVyRm4pIHtcbiAgICAgIGN1c3RvbVNjaGVkdWxlckZuKGZsdXNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVGbHVzaCgpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gc2V0U2NoZWR1bGVyKHNjaGVkdWxlRm4pIHtcbiAgY3VzdG9tU2NoZWR1bGVyRm4gPSBzY2hlZHVsZUZuO1xufVxuXG5mdW5jdGlvbiBzZXRBc2FwKGFzYXBGbikge1xuICBhc2FwID0gYXNhcEZuO1xufVxuXG52YXIgYnJvd3NlcldpbmRvdyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdW5kZWZpbmVkO1xudmFyIGJyb3dzZXJHbG9iYWwgPSBicm93c2VyV2luZG93IHx8IHt9O1xudmFyIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID0gYnJvd3Nlckdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGJyb3dzZXJHbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBpc05vZGUgPSB0eXBlb2Ygc2VsZiA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICh7fSkudG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nO1xuXG4vLyB0ZXN0IGZvciB3ZWIgd29ya2VyIGJ1dCBub3QgaW4gSUUxMFxudmFyIGlzV29ya2VyID0gdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgaW1wb3J0U2NyaXB0cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJztcblxuLy8gbm9kZVxuZnVuY3Rpb24gdXNlTmV4dFRpY2soKSB7XG4gIC8vIG5vZGUgdmVyc2lvbiAwLjEwLnggZGlzcGxheXMgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdoZW4gbmV4dFRpY2sgaXMgdXNlZCByZWN1cnNpdmVseVxuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2N1am9qcy93aGVuL2lzc3Vlcy80MTAgZm9yIGRldGFpbHNcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gIH07XG59XG5cbi8vIHZlcnR4XG5mdW5jdGlvbiB1c2VWZXJ0eFRpbWVyKCkge1xuICBpZiAodHlwZW9mIHZlcnR4TmV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmVydHhOZXh0KGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVzZVNldFRpbWVvdXQoKTtcbn1cblxuZnVuY3Rpb24gdXNlTXV0YXRpb25PYnNlcnZlcigpIHtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpO1xuICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBub2RlLmRhdGEgPSBpdGVyYXRpb25zID0gKytpdGVyYXRpb25zICUgMjtcbiAgfTtcbn1cblxuLy8gd2ViIHdvcmtlclxuZnVuY3Rpb24gdXNlTWVzc2FnZUNoYW5uZWwoKSB7XG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZmx1c2g7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVNldFRpbWVvdXQoKSB7XG4gIC8vIFN0b3JlIHNldFRpbWVvdXQgcmVmZXJlbmNlIHNvIGVzNi1wcm9taXNlIHdpbGwgYmUgdW5hZmZlY3RlZCBieVxuICAvLyBvdGhlciBjb2RlIG1vZGlmeWluZyBzZXRUaW1lb3V0IChsaWtlIHNpbm9uLnVzZUZha2VUaW1lcnMoKSlcbiAgdmFyIGdsb2JhbFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnbG9iYWxTZXRUaW1lb3V0KGZsdXNoLCAxKTtcbiAgfTtcbn1cblxudmFyIHF1ZXVlID0gbmV3IEFycmF5KDEwMDApO1xuZnVuY3Rpb24gZmx1c2goKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcbiAgICB2YXIgYXJnID0gcXVldWVbaSArIDFdO1xuXG4gICAgY2FsbGJhY2soYXJnKTtcblxuICAgIHF1ZXVlW2ldID0gdW5kZWZpbmVkO1xuICAgIHF1ZXVlW2kgKyAxXSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRWZXJ0eCgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgciA9IF9kZXJlcV87XG4gICAgdmFyIHZlcnR4ID0gcigndmVydHgnKTtcbiAgICB2ZXJ0eE5leHQgPSB2ZXJ0eC5ydW5Pbkxvb3AgfHwgdmVydHgucnVuT25Db250ZXh0O1xuICAgIHJldHVybiB1c2VWZXJ0eFRpbWVyKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdXNlU2V0VGltZW91dCgpO1xuICB9XG59XG5cbnZhciBzY2hlZHVsZUZsdXNoID0gdW5kZWZpbmVkO1xuLy8gRGVjaWRlIHdoYXQgYXN5bmMgbWV0aG9kIHRvIHVzZSB0byB0cmlnZ2VyaW5nIHByb2Nlc3Npbmcgb2YgcXVldWVkIGNhbGxiYWNrczpcbmlmIChpc05vZGUpIHtcbiAgc2NoZWR1bGVGbHVzaCA9IHVzZU5leHRUaWNrKCk7XG59IGVsc2UgaWYgKEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VNdXRhdGlvbk9ic2VydmVyKCk7XG59IGVsc2UgaWYgKGlzV29ya2VyKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VNZXNzYWdlQ2hhbm5lbCgpO1xufSBlbHNlIGlmIChicm93c2VyV2luZG93ID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIF9kZXJlcV8gPT09ICdmdW5jdGlvbicpIHtcbiAgc2NoZWR1bGVGbHVzaCA9IGF0dGVtcHRWZXJ0eCgpO1xufSBlbHNlIHtcbiAgc2NoZWR1bGVGbHVzaCA9IHVzZVNldFRpbWVvdXQoKTtcbn1cblxuZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICB2YXIgX2FyZ3VtZW50cyA9IGFyZ3VtZW50cztcblxuICB2YXIgcGFyZW50ID0gdGhpcztcblxuICB2YXIgY2hpbGQgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihub29wKTtcblxuICBpZiAoY2hpbGRbUFJPTUlTRV9JRF0gPT09IHVuZGVmaW5lZCkge1xuICAgIG1ha2VQcm9taXNlKGNoaWxkKTtcbiAgfVxuXG4gIHZhciBfc3RhdGUgPSBwYXJlbnQuX3N0YXRlO1xuXG4gIGlmIChfc3RhdGUpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNhbGxiYWNrID0gX2FyZ3VtZW50c1tfc3RhdGUgLSAxXTtcbiAgICAgIGFzYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaW52b2tlQ2FsbGJhY2soX3N0YXRlLCBjaGlsZCwgY2FsbGJhY2ssIHBhcmVudC5fcmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0pKCk7XG4gIH0gZWxzZSB7XG4gICAgc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZDtcbn1cblxuLyoqXG4gIGBQcm9taXNlLnJlc29sdmVgIHJldHVybnMgYSBwcm9taXNlIHRoYXQgd2lsbCBiZWNvbWUgcmVzb2x2ZWQgd2l0aCB0aGVcbiAgcGFzc2VkIGB2YWx1ZWAuIEl0IGlzIHNob3J0aGFuZCBmb3IgdGhlIGZvbGxvd2luZzpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICByZXNvbHZlKDEpO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgIC8vIHZhbHVlID09PSAxXG4gIH0pO1xuICBgYGBcblxuICBJbnN0ZWFkIG9mIHdyaXRpbmcgdGhlIGFib3ZlLCB5b3VyIGNvZGUgbm93IHNpbXBseSBiZWNvbWVzIHRoZSBmb2xsb3dpbmc6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgxKTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgIC8vIHZhbHVlID09PSAxXG4gIH0pO1xuICBgYGBcblxuICBAbWV0aG9kIHJlc29sdmVcbiAgQHN0YXRpY1xuICBAcGFyYW0ge0FueX0gdmFsdWUgdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJlc29sdmVkIHdpdGhcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCB3aWxsIGJlY29tZSBmdWxmaWxsZWQgd2l0aCB0aGUgZ2l2ZW5cbiAgYHZhbHVlYFxuKi9cbmZ1bmN0aW9uIHJlc29sdmUkMShvYmplY3QpIHtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICBpZiAob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gQ29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG5cbiAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3Iobm9vcCk7XG4gIHJlc29sdmUocHJvbWlzZSwgb2JqZWN0KTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbnZhciBQUk9NSVNFX0lEID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDE2KTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBQRU5ESU5HID0gdm9pZCAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xuXG52YXIgR0VUX1RIRU5fRVJST1IgPSBuZXcgRXJyb3JPYmplY3QoKTtcblxuZnVuY3Rpb24gc2VsZkZ1bGZpbGxtZW50KCkge1xuICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGZcIik7XG59XG5cbmZ1bmN0aW9uIGNhbm5vdFJldHVybk93bigpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGhlbihwcm9taXNlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb21pc2UudGhlbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBHRVRfVEhFTl9FUlJPUi5lcnJvciA9IGVycm9yO1xuICAgIHJldHVybiBHRVRfVEhFTl9FUlJPUjtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlUaGVuKHRoZW4kJDEsIHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHtcbiAgdHJ5IHtcbiAgICB0aGVuJCQxLmNhbGwodmFsdWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUsIHRoZW4kJDEpIHtcbiAgYXNhcChmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgIHZhciBzZWFsZWQgPSBmYWxzZTtcbiAgICB2YXIgZXJyb3IgPSB0cnlUaGVuKHRoZW4kJDEsIHRoZW5hYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChzZWFsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGVuYWJsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICBpZiAoc2VhbGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlYWxlZCA9IHRydWU7XG5cbiAgICAgIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgIH0sICdTZXR0bGU6ICcgKyAocHJvbWlzZS5fbGFiZWwgfHwgJyB1bmtub3duIHByb21pc2UnKSk7XG5cbiAgICBpZiAoIXNlYWxlZCAmJiBlcnJvcikge1xuICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgIHJlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgfVxuICB9LCBwcm9taXNlKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUpIHtcbiAgaWYgKHRoZW5hYmxlLl9zdGF0ZSA9PT0gRlVMRklMTEVEKSB7XG4gICAgZnVsZmlsbChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgfSBlbHNlIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IFJFSkVDVEVEKSB7XG4gICAgcmVqZWN0KHByb21pc2UsIHRoZW5hYmxlLl9yZXN1bHQpO1xuICB9IGVsc2Uge1xuICAgIHN1YnNjcmliZSh0aGVuYWJsZSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlLCB0aGVuJCQxKSB7XG4gIGlmIChtYXliZVRoZW5hYmxlLmNvbnN0cnVjdG9yID09PSBwcm9taXNlLmNvbnN0cnVjdG9yICYmIHRoZW4kJDEgPT09IHRoZW4gJiYgbWF5YmVUaGVuYWJsZS5jb25zdHJ1Y3Rvci5yZXNvbHZlID09PSByZXNvbHZlJDEpIHtcbiAgICBoYW5kbGVPd25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodGhlbiQkMSA9PT0gR0VUX1RIRU5fRVJST1IpIHtcbiAgICAgIHJlamVjdChwcm9taXNlLCBHRVRfVEhFTl9FUlJPUi5lcnJvcik7XG4gICAgICBHRVRfVEhFTl9FUlJPUi5lcnJvciA9IG51bGw7XG4gICAgfSBlbHNlIGlmICh0aGVuJCQxID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoZW4kJDEpKSB7XG4gICAgICBoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSwgdGhlbiQkMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpIHtcbiAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgcmVqZWN0KHByb21pc2UsIHNlbGZGdWxmaWxsbWVudCgpKTtcbiAgfSBlbHNlIGlmIChvYmplY3RPckZ1bmN0aW9uKHZhbHVlKSkge1xuICAgIGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgdmFsdWUsIGdldFRoZW4odmFsdWUpKTtcbiAgfSBlbHNlIHtcbiAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdWJsaXNoUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgaWYgKHByb21pc2UuX29uZXJyb3IpIHtcbiAgICBwcm9taXNlLl9vbmVycm9yKHByb21pc2UuX3Jlc3VsdCk7XG4gIH1cblxuICBwdWJsaXNoKHByb21pc2UpO1xufVxuXG5mdW5jdGlvbiBmdWxmaWxsKHByb21pc2UsIHZhbHVlKSB7XG4gIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVORElORykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb21pc2UuX3Jlc3VsdCA9IHZhbHVlO1xuICBwcm9taXNlLl9zdGF0ZSA9IEZVTEZJTExFRDtcblxuICBpZiAocHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNhcChwdWJsaXNoLCBwcm9taXNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVhc29uKSB7XG4gIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVORElORykge1xuICAgIHJldHVybjtcbiAgfVxuICBwcm9taXNlLl9zdGF0ZSA9IFJFSkVDVEVEO1xuICBwcm9taXNlLl9yZXN1bHQgPSByZWFzb247XG5cbiAgYXNhcChwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTtcbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gIHZhciBfc3Vic2NyaWJlcnMgPSBwYXJlbnQuX3N1YnNjcmliZXJzO1xuICB2YXIgbGVuZ3RoID0gX3N1YnNjcmliZXJzLmxlbmd0aDtcblxuICBwYXJlbnQuX29uZXJyb3IgPSBudWxsO1xuXG4gIF9zdWJzY3JpYmVyc1tsZW5ndGhdID0gY2hpbGQ7XG4gIF9zdWJzY3JpYmVyc1tsZW5ndGggKyBGVUxGSUxMRURdID0gb25GdWxmaWxsbWVudDtcbiAgX3N1YnNjcmliZXJzW2xlbmd0aCArIFJFSkVDVEVEXSA9IG9uUmVqZWN0aW9uO1xuXG4gIGlmIChsZW5ndGggPT09IDAgJiYgcGFyZW50Ll9zdGF0ZSkge1xuICAgIGFzYXAocHVibGlzaCwgcGFyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdWJsaXNoKHByb21pc2UpIHtcbiAgdmFyIHN1YnNjcmliZXJzID0gcHJvbWlzZS5fc3Vic2NyaWJlcnM7XG4gIHZhciBzZXR0bGVkID0gcHJvbWlzZS5fc3RhdGU7XG5cbiAgaWYgKHN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IHVuZGVmaW5lZCxcbiAgICAgIGNhbGxiYWNrID0gdW5kZWZpbmVkLFxuICAgICAgZGV0YWlsID0gcHJvbWlzZS5fcmVzdWx0O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICBjaGlsZCA9IHN1YnNjcmliZXJzW2ldO1xuICAgIGNhbGxiYWNrID0gc3Vic2NyaWJlcnNbaSArIHNldHRsZWRdO1xuXG4gICAgaWYgKGNoaWxkKSB7XG4gICAgICBpbnZva2VDYWxsYmFjayhzZXR0bGVkLCBjaGlsZCwgY2FsbGJhY2ssIGRldGFpbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgfVxuICB9XG5cbiAgcHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID0gMDtcbn1cblxuZnVuY3Rpb24gRXJyb3JPYmplY3QoKSB7XG4gIHRoaXMuZXJyb3IgPSBudWxsO1xufVxuXG52YXIgVFJZX0NBVENIX0VSUk9SID0gbmV3IEVycm9yT2JqZWN0KCk7XG5cbmZ1bmN0aW9uIHRyeUNhdGNoKGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZGV0YWlsKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIFRSWV9DQVRDSF9FUlJPUi5lcnJvciA9IGU7XG4gICAgcmV0dXJuIFRSWV9DQVRDSF9FUlJPUjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VDYWxsYmFjayhzZXR0bGVkLCBwcm9taXNlLCBjYWxsYmFjaywgZGV0YWlsKSB7XG4gIHZhciBoYXNDYWxsYmFjayA9IGlzRnVuY3Rpb24oY2FsbGJhY2spLFxuICAgICAgdmFsdWUgPSB1bmRlZmluZWQsXG4gICAgICBlcnJvciA9IHVuZGVmaW5lZCxcbiAgICAgIHN1Y2NlZWRlZCA9IHVuZGVmaW5lZCxcbiAgICAgIGZhaWxlZCA9IHVuZGVmaW5lZDtcblxuICBpZiAoaGFzQ2FsbGJhY2spIHtcbiAgICB2YWx1ZSA9IHRyeUNhdGNoKGNhbGxiYWNrLCBkZXRhaWwpO1xuXG4gICAgaWYgKHZhbHVlID09PSBUUllfQ0FUQ0hfRVJST1IpIHtcbiAgICAgIGZhaWxlZCA9IHRydWU7XG4gICAgICBlcnJvciA9IHZhbHVlLmVycm9yO1xuICAgICAgdmFsdWUuZXJyb3IgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgcmVqZWN0KHByb21pc2UsIGNhbm5vdFJldHVybk93bigpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBkZXRhaWw7XG4gICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVORElORykge1xuICAgIC8vIG5vb3BcbiAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVkZWQpIHtcbiAgICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZmFpbGVkKSB7XG4gICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gRlVMRklMTEVEKSB7XG4gICAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IFJFSkVDVEVEKSB7XG4gICAgICByZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHtcbiAgdHJ5IHtcbiAgICByZXNvbHZlcihmdW5jdGlvbiByZXNvbHZlUHJvbWlzZSh2YWx1ZSkge1xuICAgICAgcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHtcbiAgICAgIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVqZWN0KHByb21pc2UsIGUpO1xuICB9XG59XG5cbnZhciBpZCA9IDA7XG5mdW5jdGlvbiBuZXh0SWQoKSB7XG4gIHJldHVybiBpZCsrO1xufVxuXG5mdW5jdGlvbiBtYWtlUHJvbWlzZShwcm9taXNlKSB7XG4gIHByb21pc2VbUFJPTUlTRV9JRF0gPSBpZCsrO1xuICBwcm9taXNlLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgcHJvbWlzZS5fcmVzdWx0ID0gdW5kZWZpbmVkO1xuICBwcm9taXNlLl9zdWJzY3JpYmVycyA9IFtdO1xufVxuXG5mdW5jdGlvbiBFbnVtZXJhdG9yJDEoQ29uc3RydWN0b3IsIGlucHV0KSB7XG4gIHRoaXMuX2luc3RhbmNlQ29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgdGhpcy5wcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKG5vb3ApO1xuXG4gIGlmICghdGhpcy5wcm9taXNlW1BST01JU0VfSURdKSB7XG4gICAgbWFrZVByb21pc2UodGhpcy5wcm9taXNlKTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KGlucHV0KSkge1xuICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgIHRoaXMuX3JlbWFpbmluZyA9IGlucHV0Lmxlbmd0aDtcblxuICAgIHRoaXMuX3Jlc3VsdCA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGZ1bGZpbGwodGhpcy5wcm9taXNlLCB0aGlzLl9yZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDA7XG4gICAgICB0aGlzLl9lbnVtZXJhdGUoaW5wdXQpO1xuICAgICAgaWYgKHRoaXMuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICBmdWxmaWxsKHRoaXMucHJvbWlzZSwgdGhpcy5fcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KHRoaXMucHJvbWlzZSwgdmFsaWRhdGlvbkVycm9yKCkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRpb25FcnJvcigpIHtcbiAgcmV0dXJuIG5ldyBFcnJvcignQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5Jyk7XG59XG5cbkVudW1lcmF0b3IkMS5wcm90b3R5cGUuX2VudW1lcmF0ZSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICBmb3IgKHZhciBpID0gMDsgdGhpcy5fc3RhdGUgPT09IFBFTkRJTkcgJiYgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5fZWFjaEVudHJ5KGlucHV0W2ldLCBpKTtcbiAgfVxufTtcblxuRW51bWVyYXRvciQxLnByb3RvdHlwZS5fZWFjaEVudHJ5ID0gZnVuY3Rpb24gKGVudHJ5LCBpKSB7XG4gIHZhciBjID0gdGhpcy5faW5zdGFuY2VDb25zdHJ1Y3RvcjtcbiAgdmFyIHJlc29sdmUkJDEgPSBjLnJlc29sdmU7XG5cbiAgaWYgKHJlc29sdmUkJDEgPT09IHJlc29sdmUkMSkge1xuICAgIHZhciBfdGhlbiA9IGdldFRoZW4oZW50cnkpO1xuXG4gICAgaWYgKF90aGVuID09PSB0aGVuICYmIGVudHJ5Ll9zdGF0ZSAhPT0gUEVORElORykge1xuICAgICAgdGhpcy5fc2V0dGxlZEF0KGVudHJ5Ll9zdGF0ZSwgaSwgZW50cnkuX3Jlc3VsdCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgX3RoZW4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX3JlbWFpbmluZy0tO1xuICAgICAgdGhpcy5fcmVzdWx0W2ldID0gZW50cnk7XG4gICAgfSBlbHNlIGlmIChjID09PSBQcm9taXNlJDIpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IGMobm9vcCk7XG4gICAgICBoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIGVudHJ5LCBfdGhlbik7XG4gICAgICB0aGlzLl93aWxsU2V0dGxlQXQocHJvbWlzZSwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dpbGxTZXR0bGVBdChuZXcgYyhmdW5jdGlvbiAocmVzb2x2ZSQkMSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSQkMShlbnRyeSk7XG4gICAgICB9KSwgaSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMuX3dpbGxTZXR0bGVBdChyZXNvbHZlJCQxKGVudHJ5KSwgaSk7XG4gIH1cbn07XG5cbkVudW1lcmF0b3IkMS5wcm90b3R5cGUuX3NldHRsZWRBdCA9IGZ1bmN0aW9uIChzdGF0ZSwgaSwgdmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzLnByb21pc2U7XG5cbiAgaWYgKHByb21pc2UuX3N0YXRlID09PSBQRU5ESU5HKSB7XG4gICAgdGhpcy5fcmVtYWluaW5nLS07XG5cbiAgICBpZiAoc3RhdGUgPT09IFJFSkVDVEVEKSB7XG4gICAgICByZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXN1bHRbaV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgZnVsZmlsbChwcm9taXNlLCB0aGlzLl9yZXN1bHQpO1xuICB9XG59O1xuXG5FbnVtZXJhdG9yJDEucHJvdG90eXBlLl93aWxsU2V0dGxlQXQgPSBmdW5jdGlvbiAocHJvbWlzZSwgaSkge1xuICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgc3Vic2NyaWJlKHByb21pc2UsIHVuZGVmaW5lZCwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVudW1lcmF0b3IuX3NldHRsZWRBdChGVUxGSUxMRUQsIGksIHZhbHVlKTtcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIHJldHVybiBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoUkVKRUNURUQsIGksIHJlYXNvbik7XG4gIH0pO1xufTtcblxuLyoqXG4gIGBQcm9taXNlLmFsbGAgYWNjZXB0cyBhbiBhcnJheSBvZiBwcm9taXNlcywgYW5kIHJldHVybnMgYSBuZXcgcHJvbWlzZSB3aGljaFxuICBpcyBmdWxmaWxsZWQgd2l0aCBhbiBhcnJheSBvZiBmdWxmaWxsbWVudCB2YWx1ZXMgZm9yIHRoZSBwYXNzZWQgcHJvbWlzZXMsIG9yXG4gIHJlamVjdGVkIHdpdGggdGhlIHJlYXNvbiBvZiB0aGUgZmlyc3QgcGFzc2VkIHByb21pc2UgdG8gYmUgcmVqZWN0ZWQuIEl0IGNhc3RzIGFsbFxuICBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uXG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IHJlc29sdmUoMSk7XG4gIGxldCBwcm9taXNlMiA9IHJlc29sdmUoMik7XG4gIGxldCBwcm9taXNlMyA9IHJlc29sdmUoMyk7XG4gIGxldCBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdO1xuXG4gIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGFycmF5KXtcbiAgICAvLyBUaGUgYXJyYXkgaGVyZSB3b3VsZCBiZSBbIDEsIDIsIDMgXTtcbiAgfSk7XG4gIGBgYFxuXG4gIElmIGFueSBvZiB0aGUgYHByb21pc2VzYCBnaXZlbiB0byBgYWxsYCBhcmUgcmVqZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlXG4gIHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZXMnc1xuICByZWplY3Rpb24gaGFuZGxlci4gRm9yIGV4YW1wbGU6XG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IHJlc29sdmUoMSk7XG4gIGxldCBwcm9taXNlMiA9IHJlamVjdChuZXcgRXJyb3IoXCIyXCIpKTtcbiAgbGV0IHByb21pc2UzID0gcmVqZWN0KG5ldyBFcnJvcihcIjNcIikpO1xuICBsZXQgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTtcblxuICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbihhcnJheSl7XG4gICAgLy8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQgcHJvbWlzZXMhXG4gIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgLy8gZXJyb3IubWVzc2FnZSA9PT0gXCIyXCJcbiAgfSk7XG4gIGBgYFxuXG4gIEBtZXRob2QgYWxsXG4gIEBzdGF0aWNcbiAgQHBhcmFtIHtBcnJheX0gZW50cmllcyBhcnJheSBvZiBwcm9taXNlc1xuICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS5cbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIGBwcm9taXNlc2AgaGF2ZSBiZWVuXG4gIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQgaWYgYW55IG9mIHRoZW0gYmVjb21lIHJlamVjdGVkLlxuICBAc3RhdGljXG4qL1xuZnVuY3Rpb24gYWxsJDEoZW50cmllcykge1xuICByZXR1cm4gbmV3IEVudW1lcmF0b3IkMSh0aGlzLCBlbnRyaWVzKS5wcm9taXNlO1xufVxuXG4vKipcbiAgYFByb21pc2UucmFjZWAgcmV0dXJucyBhIG5ldyBwcm9taXNlIHdoaWNoIGlzIHNldHRsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZVxuICBmaXJzdCBwYXNzZWQgcHJvbWlzZSB0byBzZXR0bGUuXG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgcmVzb2x2ZSgncHJvbWlzZSAxJyk7XG4gICAgfSwgMjAwKTtcbiAgfSk7XG5cbiAgbGV0IHByb21pc2UyID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICByZXNvbHZlKCdwcm9taXNlIDInKTtcbiAgICB9LCAxMDApO1xuICB9KTtcblxuICBQcm9taXNlLnJhY2UoW3Byb21pc2UxLCBwcm9taXNlMl0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcbiAgICAvLyByZXN1bHQgPT09ICdwcm9taXNlIDInIGJlY2F1c2UgaXQgd2FzIHJlc29sdmVkIGJlZm9yZSBwcm9taXNlMVxuICAgIC8vIHdhcyByZXNvbHZlZC5cbiAgfSk7XG4gIGBgYFxuXG4gIGBQcm9taXNlLnJhY2VgIGlzIGRldGVybWluaXN0aWMgaW4gdGhhdCBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RcbiAgc2V0dGxlZCBwcm9taXNlIG1hdHRlcnMuIEZvciBleGFtcGxlLCBldmVuIGlmIG90aGVyIHByb21pc2VzIGdpdmVuIHRvIHRoZVxuICBgcHJvbWlzZXNgIGFycmF5IGFyZ3VtZW50IGFyZSByZXNvbHZlZCwgYnV0IHRoZSBmaXJzdCBzZXR0bGVkIHByb21pc2UgaGFzXG4gIGJlY29tZSByZWplY3RlZCBiZWZvcmUgdGhlIG90aGVyIHByb21pc2VzIGJlY2FtZSBmdWxmaWxsZWQsIHRoZSByZXR1cm5lZFxuICBwcm9taXNlIHdpbGwgYmVjb21lIHJlamVjdGVkOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UxID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICByZXNvbHZlKCdwcm9taXNlIDEnKTtcbiAgICB9LCAyMDApO1xuICB9KTtcblxuICBsZXQgcHJvbWlzZTIgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoJ3Byb21pc2UgMicpKTtcbiAgICB9LCAxMDApO1xuICB9KTtcblxuICBQcm9taXNlLnJhY2UoW3Byb21pc2UxLCBwcm9taXNlMl0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcbiAgICAvLyBDb2RlIGhlcmUgbmV2ZXIgcnVuc1xuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAncHJvbWlzZSAyJyBiZWNhdXNlIHByb21pc2UgMiBiZWNhbWUgcmVqZWN0ZWQgYmVmb3JlXG4gICAgLy8gcHJvbWlzZSAxIGJlY2FtZSBmdWxmaWxsZWRcbiAgfSk7XG4gIGBgYFxuXG4gIEFuIGV4YW1wbGUgcmVhbC13b3JsZCB1c2UgY2FzZSBpcyBpbXBsZW1lbnRpbmcgdGltZW91dHM6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBQcm9taXNlLnJhY2UoW2FqYXgoJ2Zvby5qc29uJyksIHRpbWVvdXQoNTAwMCldKVxuICBgYGBcblxuICBAbWV0aG9kIHJhY2VcbiAgQHN0YXRpY1xuICBAcGFyYW0ge0FycmF5fSBwcm9taXNlcyBhcnJheSBvZiBwcm9taXNlcyB0byBvYnNlcnZlXG4gIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHdoaWNoIHNldHRsZXMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBmaXJzdCBwYXNzZWRcbiAgcHJvbWlzZSB0byBzZXR0bGUuXG4qL1xuZnVuY3Rpb24gcmFjZSQxKGVudHJpZXMpIHtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICBpZiAoIWlzQXJyYXkoZW50cmllcykpIHtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIChfLCByZWplY3QpIHtcbiAgICAgIHJldHVybiByZWplY3QobmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgQ29uc3RydWN0b3IucmVzb2x2ZShlbnRyaWVzW2ldKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gIGBQcm9taXNlLnJlamVjdGAgcmV0dXJucyBhIHByb21pc2UgcmVqZWN0ZWQgd2l0aCB0aGUgcGFzc2VkIGByZWFzb25gLlxuICBJdCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xsb3dpbmc6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgcmVqZWN0KG5ldyBFcnJvcignV0hPT1BTJykpO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJ1xuICB9KTtcbiAgYGBgXG5cbiAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBhYm92ZSwgeW91ciBjb2RlIG5vdyBzaW1wbHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1dIT09QUycpKTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJ1xuICB9KTtcbiAgYGBgXG5cbiAgQG1ldGhvZCByZWplY3RcbiAgQHN0YXRpY1xuICBAcGFyYW0ge0FueX0gcmVhc29uIHZhbHVlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZCB3aXRoLlxuICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSBnaXZlbiBgcmVhc29uYC5cbiovXG5mdW5jdGlvbiByZWplY3QkMShyZWFzb24pIHtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcbiAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3Iobm9vcCk7XG4gIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNSZXNvbHZlcigpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xufVxuXG5mdW5jdGlvbiBuZWVkc05ldygpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbn1cblxuLyoqXG4gIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCwgd2hpY2hcbiAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGUgcmVhc29uXG4gIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gIFRlcm1pbm9sb2d5XG4gIC0tLS0tLS0tLS0tXG5cbiAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLlxuICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2FsIEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEgcHJvbWlzZSkuXG4gIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuXG4gIC0gYHNldHRsZWRgIHRoZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuXG4gIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZFxuICBzdGF0ZS4gIFByb21pc2VzIHRoYXQgYXJlIHJlamVjdGVkIGhhdmUgYSByZWplY3Rpb24gcmVhc29uIGFuZCBhcmUgaW4gdGhlXG4gIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gIFByb21pc2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIGFsc28gYVxuICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzXG4gIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aWxsXG4gIGl0c2VsZiBmdWxmaWxsLlxuXG5cbiAgQmFzaWMgVXNhZ2U6XG4gIC0tLS0tLS0tLS0tLVxuXG4gIGBgYGpzXG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgLy8gb24gc3VjY2Vzc1xuICAgIHJlc29sdmUodmFsdWUpO1xuXG4gICAgLy8gb24gZmFpbHVyZVxuICAgIHJlamVjdChyZWFzb24pO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAvLyBvbiBmdWxmaWxsbWVudFxuICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAvLyBvbiByZWplY3Rpb25cbiAgfSk7XG4gIGBgYFxuXG4gIEFkdmFuY2VkIFVzYWdlOlxuICAtLS0tLS0tLS0tLS0tLS1cblxuICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzXG4gIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gIGBgYGpzXG4gIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICBsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgIC8vIG9uIHJlamVjdGlvblxuICB9KTtcbiAgYGBgXG5cbiAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICBgYGBqc1xuICBQcm9taXNlLmFsbChbXG4gICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgZ2V0SlNPTignL2NvbW1lbnRzJylcbiAgXSkudGhlbihmdW5jdGlvbih2YWx1ZXMpe1xuICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICB2YWx1ZXNbMV0gLy8gPT4gY29tbWVudHNKU09OXG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9KTtcbiAgYGBgXG5cbiAgQGNsYXNzIFByb21pc2VcbiAgQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZXJcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAY29uc3RydWN0b3JcbiovXG5mdW5jdGlvbiBQcm9taXNlJDIocmVzb2x2ZXIpIHtcbiAgdGhpc1tQUk9NSVNFX0lEXSA9IG5leHRJZCgpO1xuICB0aGlzLl9yZXN1bHQgPSB0aGlzLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fc3Vic2NyaWJlcnMgPSBbXTtcblxuICBpZiAobm9vcCAhPT0gcmVzb2x2ZXIpIHtcbiAgICB0eXBlb2YgcmVzb2x2ZXIgIT09ICdmdW5jdGlvbicgJiYgbmVlZHNSZXNvbHZlcigpO1xuICAgIHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlJDIgPyBpbml0aWFsaXplUHJvbWlzZSh0aGlzLCByZXNvbHZlcikgOiBuZWVkc05ldygpO1xuICB9XG59XG5cblByb21pc2UkMi5hbGwgPSBhbGwkMTtcblByb21pc2UkMi5yYWNlID0gcmFjZSQxO1xuUHJvbWlzZSQyLnJlc29sdmUgPSByZXNvbHZlJDE7XG5Qcm9taXNlJDIucmVqZWN0ID0gcmVqZWN0JDE7XG5Qcm9taXNlJDIuX3NldFNjaGVkdWxlciA9IHNldFNjaGVkdWxlcjtcblByb21pc2UkMi5fc2V0QXNhcCA9IHNldEFzYXA7XG5Qcm9taXNlJDIuX2FzYXAgPSBhc2FwO1xuXG5Qcm9taXNlJDIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogUHJvbWlzZSQyLFxuXG4gIC8qKlxuICAgIFRoZSBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLFxuICAgIHdoaWNoIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlXG4gICAgcmVhc29uIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuICBcbiAgICBgYGBqc1xuICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXtcbiAgICAgIC8vIHVzZXIgaXMgYXZhaWxhYmxlXG4gICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5XG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIENoYWluaW5nXG4gICAgLS0tLS0tLS1cbiAgXG4gICAgVGhlIHJldHVybiB2YWx1ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJvbWlzZS4gIFRoaXMgc2Vjb25kLCAnZG93bnN0cmVhbSdcbiAgICBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3QgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gICAgb3IgcmVqZWN0aW9uIGhhbmRsZXIsIG9yIHJlamVjdGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24uXG4gIFxuICAgIGBgYGpzXG4gICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICByZXR1cm4gdXNlci5uYW1lO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJztcbiAgICB9KS50aGVuKGZ1bmN0aW9uICh1c2VyTmFtZSkge1xuICAgICAgLy8gSWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGB1c2VyTmFtZWAgd2lsbCBiZSB0aGUgdXNlcidzIG5hbWUsIG90aGVyd2lzZSBpdFxuICAgICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgXG4gICAgfSk7XG4gIFxuICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScpO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgLy8gaWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGByZWFzb25gIHdpbGwgYmUgJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jy5cbiAgICAgIC8vIElmIGBmaW5kVXNlcmAgcmVqZWN0ZWQsIGByZWFzb25gIHdpbGwgYmUgJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknLlxuICAgIH0pO1xuICAgIGBgYFxuICAgIElmIHRoZSBkb3duc3RyZWFtIHByb21pc2UgZG9lcyBub3Qgc3BlY2lmeSBhIHJlamVjdGlvbiBoYW5kbGVyLCByZWplY3Rpb24gcmVhc29ucyB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciBkb3duc3RyZWFtLlxuICBcbiAgICBgYGBqc1xuICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgdGhyb3cgbmV3IFBlZGFnb2dpY2FsRXhjZXB0aW9uKCdVcHN0cmVhbSBlcnJvcicpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAvLyBUaGUgYFBlZGdhZ29jaWFsRXhjZXB0aW9uYCBpcyBwcm9wYWdhdGVkIGFsbCB0aGUgd2F5IGRvd24gdG8gaGVyZVxuICAgIH0pO1xuICAgIGBgYFxuICBcbiAgICBBc3NpbWlsYXRpb25cbiAgICAtLS0tLS0tLS0tLS1cbiAgXG4gICAgU29tZXRpbWVzIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBwcm9wYWdhdGUgdG8gYSBkb3duc3RyZWFtIHByb21pc2UgY2FuIG9ubHkgYmVcbiAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3VzbHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJldHVybmluZyBhIHByb21pc2UgaW4gdGhlXG4gICAgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIGhhbmRsZXIuIFRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCB0aGVuIGJlIHBlbmRpbmdcbiAgICB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzZXR0bGVkLiBUaGlzIGlzIGNhbGxlZCAqYXNzaW1pbGF0aW9uKi5cbiAgXG4gICAgYGBganNcbiAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgLy8gVGhlIHVzZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWlsYWJsZVxuICAgIH0pO1xuICAgIGBgYFxuICBcbiAgICBJZiB0aGUgYXNzaW1saWF0ZWQgcHJvbWlzZSByZWplY3RzLCB0aGVuIHRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCBhbHNvIHJlamVjdC5cbiAgXG4gICAgYGBganNcbiAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCBmdWxmaWxscywgd2UnbGwgaGF2ZSB0aGUgdmFsdWUgaGVyZVxuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgcmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmVcbiAgICB9KTtcbiAgICBgYGBcbiAgXG4gICAgU2ltcGxlIEV4YW1wbGVcbiAgICAtLS0tLS0tLS0tLS0tLVxuICBcbiAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG4gIFxuICAgIGBgYGphdmFzY3JpcHRcbiAgICBsZXQgcmVzdWx0O1xuICBcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZmluZFJlc3VsdCgpO1xuICAgICAgLy8gc3VjY2Vzc1xuICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAvLyBmYWlsdXJlXG4gICAgfVxuICAgIGBgYFxuICBcbiAgICBFcnJiYWNrIEV4YW1wbGVcbiAgXG4gICAgYGBganNcbiAgICBmaW5kUmVzdWx0KGZ1bmN0aW9uKHJlc3VsdCwgZXJyKXtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfVxuICAgIH0pO1xuICAgIGBgYFxuICBcbiAgICBQcm9taXNlIEV4YW1wbGU7XG4gIFxuICAgIGBgYGphdmFzY3JpcHRcbiAgICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgICAgLy8gc3VjY2Vzc1xuICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAvLyBmYWlsdXJlXG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIEFkdmFuY2VkIEV4YW1wbGVcbiAgICAtLS0tLS0tLS0tLS0tLVxuICBcbiAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG4gIFxuICAgIGBgYGphdmFzY3JpcHRcbiAgICBsZXQgYXV0aG9yLCBib29rcztcbiAgXG4gICAgdHJ5IHtcbiAgICAgIGF1dGhvciA9IGZpbmRBdXRob3IoKTtcbiAgICAgIGJvb2tzICA9IGZpbmRCb29rc0J5QXV0aG9yKGF1dGhvcik7XG4gICAgICAvLyBzdWNjZXNzXG4gICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgIC8vIGZhaWx1cmVcbiAgICB9XG4gICAgYGBgXG4gIFxuICAgIEVycmJhY2sgRXhhbXBsZVxuICBcbiAgICBgYGBqc1xuICBcbiAgICBmdW5jdGlvbiBmb3VuZEJvb2tzKGJvb2tzKSB7XG4gIFxuICAgIH1cbiAgXG4gICAgZnVuY3Rpb24gZmFpbHVyZShyZWFzb24pIHtcbiAgXG4gICAgfVxuICBcbiAgICBmaW5kQXV0aG9yKGZ1bmN0aW9uKGF1dGhvciwgZXJyKXtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZpbmRCb29va3NCeUF1dGhvcihhdXRob3IsIGZ1bmN0aW9uKGJvb2tzLCBlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3VuZEJvb2tzKGJvb2tzKTtcbiAgICAgICAgICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9XG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIFByb21pc2UgRXhhbXBsZTtcbiAgXG4gICAgYGBgamF2YXNjcmlwdFxuICAgIGZpbmRBdXRob3IoKS5cbiAgICAgIHRoZW4oZmluZEJvb2tzQnlBdXRob3IpLlxuICAgICAgdGhlbihmdW5jdGlvbihib29rcyl7XG4gICAgICAgIC8vIGZvdW5kIGJvb2tzXG4gICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIEBtZXRob2QgdGhlblxuICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uRnVsZmlsbGVkXG4gICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3RlZFxuICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAqL1xuICB0aGVuOiB0aGVuLFxuXG4gIC8qKlxuICAgIGBjYXRjaGAgaXMgc2ltcGx5IHN1Z2FyIGZvciBgdGhlbih1bmRlZmluZWQsIG9uUmVqZWN0aW9uKWAgd2hpY2ggbWFrZXMgaXQgdGhlIHNhbWVcbiAgICBhcyB0aGUgY2F0Y2ggYmxvY2sgb2YgYSB0cnkvY2F0Y2ggc3RhdGVtZW50LlxuICBcbiAgICBgYGBqc1xuICAgIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGRuJ3QgZmluZCB0aGF0IGF1dGhvcicpO1xuICAgIH1cbiAgXG4gICAgLy8gc3luY2hyb25vdXNcbiAgICB0cnkge1xuICAgICAgZmluZEF1dGhvcigpO1xuICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIH1cbiAgXG4gICAgLy8gYXN5bmMgd2l0aCBwcm9taXNlc1xuICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICB9KTtcbiAgICBgYGBcbiAgXG4gICAgQG1ldGhvZCBjYXRjaFxuICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uXG4gICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICovXG4gICdjYXRjaCc6IGZ1bmN0aW9uIF9jYXRjaChvblJlamVjdGlvbikge1xuICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICB9XG59O1xuXG4vKmdsb2JhbCBzZWxmKi9cbmZ1bmN0aW9uIHBvbHlmaWxsJDEoKSB7XG4gICAgdmFyIGxvY2FsID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxvY2FsID0gZ2xvYmFsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxvY2FsID0gc2VsZjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BvbHlmaWxsIGZhaWxlZCBiZWNhdXNlIGdsb2JhbCBvYmplY3QgaXMgdW5hdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIFAgPSBsb2NhbC5Qcm9taXNlO1xuXG4gICAgaWYgKFApIHtcbiAgICAgICAgdmFyIHByb21pc2VUb1N0cmluZyA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcm9taXNlVG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUC5yZXNvbHZlKCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBzaWxlbnRseSBpZ25vcmVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvbWlzZVRvU3RyaW5nID09PSAnW29iamVjdCBQcm9taXNlXScgJiYgIVAuY2FzdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9jYWwuUHJvbWlzZSA9IFByb21pc2UkMjtcbn1cblxuLy8gU3RyYW5nZSBjb21wYXQuLlxuUHJvbWlzZSQyLnBvbHlmaWxsID0gcG9seWZpbGwkMTtcblByb21pc2UkMi5Qcm9taXNlID0gUHJvbWlzZSQyO1xuXG5yZXR1cm4gUHJvbWlzZSQyO1xuXG59KSkpO1xuXG5cblxufSkuY2FsbCh0aGlzLF9kZXJlcV8oJ19wcm9jZXNzJyksdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbn0se1wiX3Byb2Nlc3NcIjoxMX1dLDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbJ2V4cG9ydHMnLCAnbW9kdWxlJ10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGZhY3RvcnkoZXhwb3J0cywgbW9kdWxlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbW9kID0ge1xuICAgICAgZXhwb3J0czoge31cbiAgICB9O1xuICAgIGZhY3RvcnkobW9kLmV4cG9ydHMsIG1vZCk7XG4gICAgZ2xvYmFsLmZldGNoSnNvbnAgPSBtb2QuZXhwb3J0cztcbiAgfVxufSkodGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsIG1vZHVsZSkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAganNvbnBDYWxsYmFjazogJ2NhbGxiYWNrJyxcbiAgICBqc29ucENhbGxiYWNrRnVuY3Rpb246IG51bGxcbiAgfTtcblxuICBmdW5jdGlvbiBnZW5lcmF0ZUNhbGxiYWNrRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdqc29ucF8nICsgRGF0ZS5ub3coKSArICdfJyArIE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMTAwMDAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyRnVuY3Rpb24oZnVuY3Rpb25OYW1lKSB7XG4gICAgLy8gSUU4IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiB5b3UgdHJ5IHRvIGRlbGV0ZSBhIHByb3BlcnR5IG9uIHdpbmRvd1xuICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE4MjQyMjgvNzUxMDg5XG4gICAgdHJ5IHtcbiAgICAgIGRlbGV0ZSB3aW5kb3dbZnVuY3Rpb25OYW1lXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB3aW5kb3dbZnVuY3Rpb25OYW1lXSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVTY3JpcHQoc2NyaXB0SWQpIHtcbiAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2NyaXB0SWQpO1xuICAgIGlmIChzY3JpcHQpIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0ucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaEpzb25wKF91cmwpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzFdO1xuXG4gICAgLy8gdG8gYXZvaWQgcGFyYW0gcmVhc3NpZ25cbiAgICB2YXIgdXJsID0gX3VybDtcbiAgICB2YXIgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCB8fCBkZWZhdWx0T3B0aW9ucy50aW1lb3V0O1xuICAgIHZhciBqc29ucENhbGxiYWNrID0gb3B0aW9ucy5qc29ucENhbGxiYWNrIHx8IGRlZmF1bHRPcHRpb25zLmpzb25wQ2FsbGJhY2s7XG5cbiAgICB2YXIgdGltZW91dElkID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBjYWxsYmFja0Z1bmN0aW9uID0gb3B0aW9ucy5qc29ucENhbGxiYWNrRnVuY3Rpb24gfHwgZ2VuZXJhdGVDYWxsYmFja0Z1bmN0aW9uKCk7XG4gICAgICB2YXIgc2NyaXB0SWQgPSBqc29ucENhbGxiYWNrICsgJ18nICsgY2FsbGJhY2tGdW5jdGlvbjtcblxuICAgICAgd2luZG93W2NhbGxiYWNrRnVuY3Rpb25dID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgIC8vIGtlZXAgY29uc2lzdGVudCB3aXRoIGZldGNoIEFQSVxuICAgICAgICAgIGpzb246IGZ1bmN0aW9uIGpzb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aW1lb3V0SWQpIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuXG4gICAgICAgIHJlbW92ZVNjcmlwdChzY3JpcHRJZCk7XG5cbiAgICAgICAgY2xlYXJGdW5jdGlvbihjYWxsYmFja0Z1bmN0aW9uKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHNldCB0aGVpciBvd24gcGFyYW1zLCBhbmQgaWYgbm90IGFkZCBhID8gdG8gc3RhcnQgYSBsaXN0IG9mIHBhcmFtc1xuICAgICAgdXJsICs9IHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnO1xuXG4gICAgICB2YXIganNvbnBTY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgIGpzb25wU2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgJycgKyB1cmwgKyBqc29ucENhbGxiYWNrICsgJz0nICsgY2FsbGJhY2tGdW5jdGlvbik7XG4gICAgICBpZiAob3B0aW9ucy5jaGFyc2V0KSB7XG4gICAgICAgIGpzb25wU2NyaXB0LnNldEF0dHJpYnV0ZSgnY2hhcnNldCcsIG9wdGlvbnMuY2hhcnNldCk7XG4gICAgICB9XG4gICAgICBqc29ucFNjcmlwdC5pZCA9IHNjcmlwdElkO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChqc29ucFNjcmlwdCk7XG5cbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdKU09OUCByZXF1ZXN0IHRvICcgKyBfdXJsICsgJyB0aW1lZCBvdXQnKSk7XG5cbiAgICAgICAgY2xlYXJGdW5jdGlvbihjYWxsYmFja0Z1bmN0aW9uKTtcbiAgICAgICAgcmVtb3ZlU2NyaXB0KHNjcmlwdElkKTtcbiAgICAgICAgd2luZG93W2NhbGxiYWNrRnVuY3Rpb25dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNsZWFyRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlvbik7XG4gICAgICAgIH07XG4gICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgLy8gQ2F1Z2h0IGlmIGdvdCA0MDQvNTAwXG4gICAgICBqc29ucFNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdKU09OUCByZXF1ZXN0IHRvICcgKyBfdXJsICsgJyBmYWlsZWQnKSk7XG5cbiAgICAgICAgY2xlYXJGdW5jdGlvbihjYWxsYmFja0Z1bmN0aW9uKTtcbiAgICAgICAgcmVtb3ZlU2NyaXB0KHNjcmlwdElkKTtcbiAgICAgICAgaWYgKHRpbWVvdXRJZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZXhwb3J0IGFzIGdsb2JhbCBmdW5jdGlvblxuICAvKlxuICBsZXQgbG9jYWw7XG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gc2VsZjtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgfVxuICB9XG4gIGxvY2FsLmZldGNoSnNvbnAgPSBmZXRjaEpzb25wO1xuICAqL1xuXG4gIG1vZHVsZS5leHBvcnRzID0gZmV0Y2hKc29ucDtcbn0pO1xufSx7fV0sNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKiBGaWxlU2F2ZXIuanNcbiAqIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuICogMS4zLjJcbiAqIDIwMTYtMDYtMTYgMTg6MjU6MTlcbiAqXG4gKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4gKiBMaWNlbnNlOiBNSVRcbiAqICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcy9ibG9iL21hc3Rlci9MSUNFTlNFLm1kXG4gKi9cblxuLypnbG9iYWwgc2VsZiAqL1xuLypqc2xpbnQgYml0d2lzZTogdHJ1ZSwgaW5kZW50OiA0LCBsYXhicmVhazogdHJ1ZSwgbGF4Y29tbWE6IHRydWUsIHNtYXJ0dGFiczogdHJ1ZSwgcGx1c3BsdXM6IHRydWUgKi9cblxuLyohIEBzb3VyY2UgaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qcy9ibG9iL21hc3Rlci9GaWxlU2F2ZXIuanMgKi9cblxudmFyIHNhdmVBcyA9IHNhdmVBcyB8fCAoZnVuY3Rpb24odmlldykge1xuXHRcInVzZSBzdHJpY3RcIjtcblx0Ly8gSUUgPDEwIGlzIGV4cGxpY2l0bHkgdW5zdXBwb3J0ZWRcblx0aWYgKHR5cGVvZiB2aWV3ID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgL01TSUUgWzEtOV1cXC4vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyXG5cdFx0ICBkb2MgPSB2aWV3LmRvY3VtZW50XG5cdFx0ICAvLyBvbmx5IGdldCBVUkwgd2hlbiBuZWNlc3NhcnkgaW4gY2FzZSBCbG9iLmpzIGhhc24ndCBvdmVycmlkZGVuIGl0IHlldFxuXHRcdCwgZ2V0X1VSTCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHZpZXcuVVJMIHx8IHZpZXcud2Via2l0VVJMIHx8IHZpZXc7XG5cdFx0fVxuXHRcdCwgc2F2ZV9saW5rID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIiwgXCJhXCIpXG5cdFx0LCBjYW5fdXNlX3NhdmVfbGluayA9IFwiZG93bmxvYWRcIiBpbiBzYXZlX2xpbmtcblx0XHQsIGNsaWNrID0gZnVuY3Rpb24obm9kZSkge1xuXHRcdFx0dmFyIGV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiKTtcblx0XHRcdG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cdFx0fVxuXHRcdCwgaXNfc2FmYXJpID0gL2NvbnN0cnVjdG9yL2kudGVzdCh2aWV3LkhUTUxFbGVtZW50KSB8fCB2aWV3LnNhZmFyaVxuXHRcdCwgaXNfY2hyb21lX2lvcyA9L0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cdFx0LCB0aHJvd19vdXRzaWRlID0gZnVuY3Rpb24oZXgpIHtcblx0XHRcdCh2aWV3LnNldEltbWVkaWF0ZSB8fCB2aWV3LnNldFRpbWVvdXQpKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aHJvdyBleDtcblx0XHRcdH0sIDApO1xuXHRcdH1cblx0XHQsIGZvcmNlX3NhdmVhYmxlX3R5cGUgPSBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG5cdFx0Ly8gdGhlIEJsb2IgQVBJIGlzIGZ1bmRhbWVudGFsbHkgYnJva2VuIGFzIHRoZXJlIGlzIG5vIFwiZG93bmxvYWRmaW5pc2hlZFwiIGV2ZW50IHRvIHN1YnNjcmliZSB0b1xuXHRcdCwgYXJiaXRyYXJ5X3Jldm9rZV90aW1lb3V0ID0gMTAwMCAqIDQwIC8vIGluIG1zXG5cdFx0LCByZXZva2UgPSBmdW5jdGlvbihmaWxlKSB7XG5cdFx0XHR2YXIgcmV2b2tlciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIGZpbGUgPT09IFwic3RyaW5nXCIpIHsgLy8gZmlsZSBpcyBhbiBvYmplY3QgVVJMXG5cdFx0XHRcdFx0Z2V0X1VSTCgpLnJldm9rZU9iamVjdFVSTChmaWxlKTtcblx0XHRcdFx0fSBlbHNlIHsgLy8gZmlsZSBpcyBhIEZpbGVcblx0XHRcdFx0XHRmaWxlLnJlbW92ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0c2V0VGltZW91dChyZXZva2VyLCBhcmJpdHJhcnlfcmV2b2tlX3RpbWVvdXQpO1xuXHRcdH1cblx0XHQsIGRpc3BhdGNoID0gZnVuY3Rpb24oZmlsZXNhdmVyLCBldmVudF90eXBlcywgZXZlbnQpIHtcblx0XHRcdGV2ZW50X3R5cGVzID0gW10uY29uY2F0KGV2ZW50X3R5cGVzKTtcblx0XHRcdHZhciBpID0gZXZlbnRfdHlwZXMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGktLSkge1xuXHRcdFx0XHR2YXIgbGlzdGVuZXIgPSBmaWxlc2F2ZXJbXCJvblwiICsgZXZlbnRfdHlwZXNbaV1dO1xuXHRcdFx0XHRpZiAodHlwZW9mIGxpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0bGlzdGVuZXIuY2FsbChmaWxlc2F2ZXIsIGV2ZW50IHx8IGZpbGVzYXZlcik7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXgpIHtcblx0XHRcdFx0XHRcdHRocm93X291dHNpZGUoZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQsIGF1dG9fYm9tID0gZnVuY3Rpb24oYmxvYikge1xuXHRcdFx0Ly8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcblx0XHRcdC8vIG5vdGU6IHlvdXIgYnJvd3NlciB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCBVVEYtMTYgVStGRUZGIHRvIEVGIEJCIEJGXG5cdFx0XHRpZiAoL15cXHMqKD86dGV4dFxcL1xcUyp8YXBwbGljYXRpb25cXC94bWx8XFxTKlxcL1xcUypcXCt4bWwpXFxzKjsuKmNoYXJzZXRcXHMqPVxccyp1dGYtOC9pLnRlc3QoYmxvYi50eXBlKSkge1xuXHRcdFx0XHRyZXR1cm4gbmV3IEJsb2IoW1N0cmluZy5mcm9tQ2hhckNvZGUoMHhGRUZGKSwgYmxvYl0sIHt0eXBlOiBibG9iLnR5cGV9KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBibG9iO1xuXHRcdH1cblx0XHQsIEZpbGVTYXZlciA9IGZ1bmN0aW9uKGJsb2IsIG5hbWUsIG5vX2F1dG9fYm9tKSB7XG5cdFx0XHRpZiAoIW5vX2F1dG9fYm9tKSB7XG5cdFx0XHRcdGJsb2IgPSBhdXRvX2JvbShibG9iKTtcblx0XHRcdH1cblx0XHRcdC8vIEZpcnN0IHRyeSBhLmRvd25sb2FkLCB0aGVuIHdlYiBmaWxlc3lzdGVtLCB0aGVuIG9iamVjdCBVUkxzXG5cdFx0XHR2YXJcblx0XHRcdFx0ICBmaWxlc2F2ZXIgPSB0aGlzXG5cdFx0XHRcdCwgdHlwZSA9IGJsb2IudHlwZVxuXHRcdFx0XHQsIGZvcmNlID0gdHlwZSA9PT0gZm9yY2Vfc2F2ZWFibGVfdHlwZVxuXHRcdFx0XHQsIG9iamVjdF91cmxcblx0XHRcdFx0LCBkaXNwYXRjaF9hbGwgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkaXNwYXRjaChmaWxlc2F2ZXIsIFwid3JpdGVzdGFydCBwcm9ncmVzcyB3cml0ZSB3cml0ZWVuZFwiLnNwbGl0KFwiIFwiKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gb24gYW55IGZpbGVzeXMgZXJyb3JzIHJldmVydCB0byBzYXZpbmcgd2l0aCBvYmplY3QgVVJMc1xuXHRcdFx0XHQsIGZzX2Vycm9yID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKChpc19jaHJvbWVfaW9zIHx8IChmb3JjZSAmJiBpc19zYWZhcmkpKSAmJiB2aWV3LkZpbGVSZWFkZXIpIHtcblx0XHRcdFx0XHRcdC8vIFNhZmFyaSBkb2Vzbid0IGFsbG93IGRvd25sb2FkaW5nIG9mIGJsb2IgdXJsc1xuXHRcdFx0XHRcdFx0dmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cdFx0XHRcdFx0XHRyZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHZhciB1cmwgPSBpc19jaHJvbWVfaW9zID8gcmVhZGVyLnJlc3VsdCA6IHJlYWRlci5yZXN1bHQucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpO1xuXHRcdFx0XHRcdFx0XHR2YXIgcG9wdXAgPSB2aWV3Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG5cdFx0XHRcdFx0XHRcdGlmKCFwb3B1cCkgdmlldy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuXHRcdFx0XHRcdFx0XHR1cmw9dW5kZWZpbmVkOyAvLyByZWxlYXNlIHJlZmVyZW5jZSBiZWZvcmUgZGlzcGF0Y2hpbmdcblx0XHRcdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0XHRcdFx0ZGlzcGF0Y2hfYWxsKCk7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0cmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG5cdFx0XHRcdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5JTklUO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBkb24ndCBjcmVhdGUgbW9yZSBvYmplY3QgVVJMcyB0aGFuIG5lZWRlZFxuXHRcdFx0XHRcdGlmICghb2JqZWN0X3VybCkge1xuXHRcdFx0XHRcdFx0b2JqZWN0X3VybCA9IGdldF9VUkwoKS5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChmb3JjZSkge1xuXHRcdFx0XHRcdFx0dmlldy5sb2NhdGlvbi5ocmVmID0gb2JqZWN0X3VybDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dmFyIG9wZW5lZCA9IHZpZXcub3BlbihvYmplY3RfdXJsLCBcIl9ibGFua1wiKTtcblx0XHRcdFx0XHRcdGlmICghb3BlbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEFwcGxlIGRvZXMgbm90IGFsbG93IHdpbmRvdy5vcGVuLCBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvc2FmYXJpL2RvY3VtZW50YXRpb24vVG9vbHMvQ29uY2VwdHVhbC9TYWZhcmlFeHRlbnNpb25HdWlkZS9Xb3JraW5nd2l0aFdpbmRvd3NhbmRUYWJzL1dvcmtpbmd3aXRoV2luZG93c2FuZFRhYnMuaHRtbFxuXHRcdFx0XHRcdFx0XHR2aWV3LmxvY2F0aW9uLmhyZWYgPSBvYmplY3RfdXJsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5ET05FO1xuXHRcdFx0XHRcdGRpc3BhdGNoX2FsbCgpO1xuXHRcdFx0XHRcdHJldm9rZShvYmplY3RfdXJsKTtcblx0XHRcdFx0fVxuXHRcdFx0O1xuXHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuSU5JVDtcblxuXHRcdFx0aWYgKGNhbl91c2Vfc2F2ZV9saW5rKSB7XG5cdFx0XHRcdG9iamVjdF91cmwgPSBnZXRfVVJMKCkuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHNhdmVfbGluay5ocmVmID0gb2JqZWN0X3VybDtcblx0XHRcdFx0XHRzYXZlX2xpbmsuZG93bmxvYWQgPSBuYW1lO1xuXHRcdFx0XHRcdGNsaWNrKHNhdmVfbGluayk7XG5cdFx0XHRcdFx0ZGlzcGF0Y2hfYWxsKCk7XG5cdFx0XHRcdFx0cmV2b2tlKG9iamVjdF91cmwpO1xuXHRcdFx0XHRcdGZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLkRPTkU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZzX2Vycm9yKCk7XG5cdFx0fVxuXHRcdCwgRlNfcHJvdG8gPSBGaWxlU2F2ZXIucHJvdG90eXBlXG5cdFx0LCBzYXZlQXMgPSBmdW5jdGlvbihibG9iLCBuYW1lLCBub19hdXRvX2JvbSkge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWxlU2F2ZXIoYmxvYiwgbmFtZSB8fCBibG9iLm5hbWUgfHwgXCJkb3dubG9hZFwiLCBub19hdXRvX2JvbSk7XG5cdFx0fVxuXHQ7XG5cdC8vIElFIDEwKyAobmF0aXZlIHNhdmVBcylcblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oYmxvYiwgbmFtZSwgbm9fYXV0b19ib20pIHtcblx0XHRcdG5hbWUgPSBuYW1lIHx8IGJsb2IubmFtZSB8fCBcImRvd25sb2FkXCI7XG5cblx0XHRcdGlmICghbm9fYXV0b19ib20pIHtcblx0XHRcdFx0YmxvYiA9IGF1dG9fYm9tKGJsb2IpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJsb2IsIG5hbWUpO1xuXHRcdH07XG5cdH1cblxuXHRGU19wcm90by5hYm9ydCA9IGZ1bmN0aW9uKCl7fTtcblx0RlNfcHJvdG8ucmVhZHlTdGF0ZSA9IEZTX3Byb3RvLklOSVQgPSAwO1xuXHRGU19wcm90by5XUklUSU5HID0gMTtcblx0RlNfcHJvdG8uRE9ORSA9IDI7XG5cblx0RlNfcHJvdG8uZXJyb3IgPVxuXHRGU19wcm90by5vbndyaXRlc3RhcnQgPVxuXHRGU19wcm90by5vbnByb2dyZXNzID1cblx0RlNfcHJvdG8ub253cml0ZSA9XG5cdEZTX3Byb3RvLm9uYWJvcnQgPVxuXHRGU19wcm90by5vbmVycm9yID1cblx0RlNfcHJvdG8ub253cml0ZWVuZCA9XG5cdFx0bnVsbDtcblxuXHRyZXR1cm4gc2F2ZUFzO1xufShcblx0ICAgdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZlxuXHR8fCB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvd1xuXHR8fCB0aGlzLmNvbnRlbnRcbikpO1xuLy8gYHNlbGZgIGlzIHVuZGVmaW5lZCBpbiBGaXJlZm94IGZvciBBbmRyb2lkIGNvbnRlbnQgc2NyaXB0IGNvbnRleHRcbi8vIHdoaWxlIGB0aGlzYCBpcyBuc0lDb250ZW50RnJhbWVNZXNzYWdlTWFuYWdlclxuLy8gd2l0aCBhbiBhdHRyaWJ1dGUgYGNvbnRlbnRgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHdpbmRvd1xuXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cy5zYXZlQXMgPSBzYXZlQXM7XG59IGVsc2UgaWYgKCh0eXBlb2YgZGVmaW5lICE9PSBcInVuZGVmaW5lZFwiICYmIGRlZmluZSAhPT0gbnVsbCkgJiYgKGRlZmluZS5hbWQgIT09IG51bGwpKSB7XG4gIGRlZmluZShcIkZpbGVTYXZlci5qc1wiLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gc2F2ZUFzO1xuICB9KTtcbn1cblxufSx7fV0sODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cblxufSx7fV0sOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxufSx7fV0sMTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uIChCdWZmZXIpe1xuLyoqXG4gKiBodHRwczovL29wZW50eXBlLmpzLm9yZyB2MC43LjMgfCAoYykgRnJlZGVyaWsgRGUgQmxlc2VyIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBNSVQgTGljZW5zZSB8IFVzZXMgdGlueS1pbmZsYXRlIGJ5IERldm9uIEdvdmV0dFxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcblx0KGZhY3RvcnkoKGdsb2JhbC5vcGVudHlwZSA9IGdsb2JhbC5vcGVudHlwZSB8fCB7fSkpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxudmFyIFRJTkZfT0sgPSAwO1xudmFyIFRJTkZfREFUQV9FUlJPUiA9IC0zO1xuXG5mdW5jdGlvbiBUcmVlKCkge1xuICB0aGlzLnRhYmxlID0gbmV3IFVpbnQxNkFycmF5KDE2KTsgICAvKiB0YWJsZSBvZiBjb2RlIGxlbmd0aCBjb3VudHMgKi9cbiAgdGhpcy50cmFucyA9IG5ldyBVaW50MTZBcnJheSgyODgpOyAgLyogY29kZSAtPiBzeW1ib2wgdHJhbnNsYXRpb24gdGFibGUgKi9cbn1cblxuZnVuY3Rpb24gRGF0YShzb3VyY2UsIGRlc3QpIHtcbiAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIHRoaXMuc291cmNlSW5kZXggPSAwO1xuICB0aGlzLnRhZyA9IDA7XG4gIHRoaXMuYml0Y291bnQgPSAwO1xuICBcbiAgdGhpcy5kZXN0ID0gZGVzdDtcbiAgdGhpcy5kZXN0TGVuID0gMDtcbiAgXG4gIHRoaXMubHRyZWUgPSBuZXcgVHJlZSgpOyAgLyogZHluYW1pYyBsZW5ndGgvc3ltYm9sIHRyZWUgKi9cbiAgdGhpcy5kdHJlZSA9IG5ldyBUcmVlKCk7ICAvKiBkeW5hbWljIGRpc3RhbmNlIHRyZWUgKi9cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIHVuaW5pdGlhbGl6ZWQgZ2xvYmFsIGRhdGEgKHN0YXRpYyBzdHJ1Y3R1cmVzKSAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxudmFyIHNsdHJlZSA9IG5ldyBUcmVlKCk7XG52YXIgc2R0cmVlID0gbmV3IFRyZWUoKTtcblxuLyogZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgZm9yIGxlbmd0aCBjb2RlcyAqL1xudmFyIGxlbmd0aF9iaXRzID0gbmV3IFVpbnQ4QXJyYXkoMzApO1xudmFyIGxlbmd0aF9iYXNlID0gbmV3IFVpbnQxNkFycmF5KDMwKTtcblxuLyogZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgZm9yIGRpc3RhbmNlIGNvZGVzICovXG52YXIgZGlzdF9iaXRzID0gbmV3IFVpbnQ4QXJyYXkoMzApO1xudmFyIGRpc3RfYmFzZSA9IG5ldyBVaW50MTZBcnJheSgzMCk7XG5cbi8qIHNwZWNpYWwgb3JkZXJpbmcgb2YgY29kZSBsZW5ndGggY29kZXMgKi9cbnZhciBjbGNpZHggPSBuZXcgVWludDhBcnJheShbXG4gIDE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsXG4gIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLFxuICAxNCwgMSwgMTVcbl0pO1xuXG4vKiB1c2VkIGJ5IHRpbmZfZGVjb2RlX3RyZWVzLCBhdm9pZHMgYWxsb2NhdGlvbnMgZXZlcnkgY2FsbCAqL1xudmFyIGNvZGVfdHJlZSA9IG5ldyBUcmVlKCk7XG52YXIgbGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KDI4OCArIDMyKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gdXRpbGl0eSBmdW5jdGlvbnMgLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogYnVpbGQgZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgKi9cbmZ1bmN0aW9uIHRpbmZfYnVpbGRfYml0c19iYXNlKGJpdHMsIGJhc2UsIGRlbHRhLCBmaXJzdCkge1xuICB2YXIgaSwgc3VtO1xuXG4gIC8qIGJ1aWxkIGJpdHMgdGFibGUgKi9cbiAgZm9yIChpID0gMDsgaSA8IGRlbHRhOyArK2kpIHsgYml0c1tpXSA9IDA7IH1cbiAgZm9yIChpID0gMDsgaSA8IDMwIC0gZGVsdGE7ICsraSkgeyBiaXRzW2kgKyBkZWx0YV0gPSBpIC8gZGVsdGEgfCAwOyB9XG5cbiAgLyogYnVpbGQgYmFzZSB0YWJsZSAqL1xuICBmb3IgKHN1bSA9IGZpcnN0LCBpID0gMDsgaSA8IDMwOyArK2kpIHtcbiAgICBiYXNlW2ldID0gc3VtO1xuICAgIHN1bSArPSAxIDw8IGJpdHNbaV07XG4gIH1cbn1cblxuLyogYnVpbGQgdGhlIGZpeGVkIGh1ZmZtYW4gdHJlZXMgKi9cbmZ1bmN0aW9uIHRpbmZfYnVpbGRfZml4ZWRfdHJlZXMobHQsIGR0KSB7XG4gIHZhciBpO1xuXG4gIC8qIGJ1aWxkIGZpeGVkIGxlbmd0aCB0cmVlICovXG4gIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHsgbHQudGFibGVbaV0gPSAwOyB9XG5cbiAgbHQudGFibGVbN10gPSAyNDtcbiAgbHQudGFibGVbOF0gPSAxNTI7XG4gIGx0LnRhYmxlWzldID0gMTEyO1xuXG4gIGZvciAoaSA9IDA7IGkgPCAyNDsgKytpKSB7IGx0LnRyYW5zW2ldID0gMjU2ICsgaTsgfVxuICBmb3IgKGkgPSAwOyBpIDwgMTQ0OyArK2kpIHsgbHQudHJhbnNbMjQgKyBpXSA9IGk7IH1cbiAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeyBsdC50cmFuc1syNCArIDE0NCArIGldID0gMjgwICsgaTsgfVxuICBmb3IgKGkgPSAwOyBpIDwgMTEyOyArK2kpIHsgbHQudHJhbnNbMjQgKyAxNDQgKyA4ICsgaV0gPSAxNDQgKyBpOyB9XG5cbiAgLyogYnVpbGQgZml4ZWQgZGlzdGFuY2UgdHJlZSAqL1xuICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7IGR0LnRhYmxlW2ldID0gMDsgfVxuXG4gIGR0LnRhYmxlWzVdID0gMzI7XG5cbiAgZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHsgZHQudHJhbnNbaV0gPSBpOyB9XG59XG5cbi8qIGdpdmVuIGFuIGFycmF5IG9mIGNvZGUgbGVuZ3RocywgYnVpbGQgYSB0cmVlICovXG52YXIgb2ZmcyA9IG5ldyBVaW50MTZBcnJheSgxNik7XG5cbmZ1bmN0aW9uIHRpbmZfYnVpbGRfdHJlZSh0LCBsZW5ndGhzLCBvZmYsIG51bSkge1xuICB2YXIgaSwgc3VtO1xuXG4gIC8qIGNsZWFyIGNvZGUgbGVuZ3RoIGNvdW50IHRhYmxlICovXG4gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7IHQudGFibGVbaV0gPSAwOyB9XG5cbiAgLyogc2NhbiBzeW1ib2wgbGVuZ3RocywgYW5kIHN1bSBjb2RlIGxlbmd0aCBjb3VudHMgKi9cbiAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7IHQudGFibGVbbGVuZ3Roc1tvZmYgKyBpXV0rKzsgfVxuXG4gIHQudGFibGVbMF0gPSAwO1xuXG4gIC8qIGNvbXB1dGUgb2Zmc2V0IHRhYmxlIGZvciBkaXN0cmlidXRpb24gc29ydCAqL1xuICBmb3IgKHN1bSA9IDAsIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgIG9mZnNbaV0gPSBzdW07XG4gICAgc3VtICs9IHQudGFibGVbaV07XG4gIH1cblxuICAvKiBjcmVhdGUgY29kZS0+c3ltYm9sIHRyYW5zbGF0aW9uIHRhYmxlIChzeW1ib2xzIHNvcnRlZCBieSBjb2RlKSAqL1xuICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHtcbiAgICBpZiAobGVuZ3Roc1tvZmYgKyBpXSkgeyB0LnRyYW5zW29mZnNbbGVuZ3Roc1tvZmYgKyBpXV0rK10gPSBpOyB9XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSBkZWNvZGUgZnVuY3Rpb25zIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogZ2V0IG9uZSBiaXQgZnJvbSBzb3VyY2Ugc3RyZWFtICovXG5mdW5jdGlvbiB0aW5mX2dldGJpdChkKSB7XG4gIC8qIGNoZWNrIGlmIHRhZyBpcyBlbXB0eSAqL1xuICBpZiAoIWQuYml0Y291bnQtLSkge1xuICAgIC8qIGxvYWQgbmV4dCB0YWcgKi9cbiAgICBkLnRhZyA9IGQuc291cmNlW2Quc291cmNlSW5kZXgrK107XG4gICAgZC5iaXRjb3VudCA9IDc7XG4gIH1cblxuICAvKiBzaGlmdCBiaXQgb3V0IG9mIHRhZyAqL1xuICB2YXIgYml0ID0gZC50YWcgJiAxO1xuICBkLnRhZyA+Pj49IDE7XG5cbiAgcmV0dXJuIGJpdDtcbn1cblxuLyogcmVhZCBhIG51bSBiaXQgdmFsdWUgZnJvbSBhIHN0cmVhbSBhbmQgYWRkIGJhc2UgKi9cbmZ1bmN0aW9uIHRpbmZfcmVhZF9iaXRzKGQsIG51bSwgYmFzZSkge1xuICBpZiAoIW51bSlcbiAgICB7IHJldHVybiBiYXNlOyB9XG5cbiAgd2hpbGUgKGQuYml0Y291bnQgPCAyNCkge1xuICAgIGQudGFnIHw9IGQuc291cmNlW2Quc291cmNlSW5kZXgrK10gPDwgZC5iaXRjb3VudDtcbiAgICBkLmJpdGNvdW50ICs9IDg7XG4gIH1cblxuICB2YXIgdmFsID0gZC50YWcgJiAoMHhmZmZmID4+PiAoMTYgLSBudW0pKTtcbiAgZC50YWcgPj4+PSBudW07XG4gIGQuYml0Y291bnQgLT0gbnVtO1xuICByZXR1cm4gdmFsICsgYmFzZTtcbn1cblxuLyogZ2l2ZW4gYSBkYXRhIHN0cmVhbSBhbmQgYSB0cmVlLCBkZWNvZGUgYSBzeW1ib2wgKi9cbmZ1bmN0aW9uIHRpbmZfZGVjb2RlX3N5bWJvbChkLCB0KSB7XG4gIHdoaWxlIChkLmJpdGNvdW50IDwgMjQpIHtcbiAgICBkLnRhZyB8PSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4KytdIDw8IGQuYml0Y291bnQ7XG4gICAgZC5iaXRjb3VudCArPSA4O1xuICB9XG4gIFxuICB2YXIgc3VtID0gMCwgY3VyID0gMCwgbGVuID0gMDtcbiAgdmFyIHRhZyA9IGQudGFnO1xuXG4gIC8qIGdldCBtb3JlIGJpdHMgd2hpbGUgY29kZSB2YWx1ZSBpcyBhYm92ZSBzdW0gKi9cbiAgZG8ge1xuICAgIGN1ciA9IDIgKiBjdXIgKyAodGFnICYgMSk7XG4gICAgdGFnID4+Pj0gMTtcbiAgICArK2xlbjtcblxuICAgIHN1bSArPSB0LnRhYmxlW2xlbl07XG4gICAgY3VyIC09IHQudGFibGVbbGVuXTtcbiAgfSB3aGlsZSAoY3VyID49IDApO1xuICBcbiAgZC50YWcgPSB0YWc7XG4gIGQuYml0Y291bnQgLT0gbGVuO1xuXG4gIHJldHVybiB0LnRyYW5zW3N1bSArIGN1cl07XG59XG5cbi8qIGdpdmVuIGEgZGF0YSBzdHJlYW0sIGRlY29kZSBkeW5hbWljIHRyZWVzIGZyb20gaXQgKi9cbmZ1bmN0aW9uIHRpbmZfZGVjb2RlX3RyZWVzKGQsIGx0LCBkdCkge1xuICB2YXIgaGxpdCwgaGRpc3QsIGhjbGVuO1xuICB2YXIgaSwgbnVtLCBsZW5ndGg7XG5cbiAgLyogZ2V0IDUgYml0cyBITElUICgyNTctMjg2KSAqL1xuICBobGl0ID0gdGluZl9yZWFkX2JpdHMoZCwgNSwgMjU3KTtcblxuICAvKiBnZXQgNSBiaXRzIEhESVNUICgxLTMyKSAqL1xuICBoZGlzdCA9IHRpbmZfcmVhZF9iaXRzKGQsIDUsIDEpO1xuXG4gIC8qIGdldCA0IGJpdHMgSENMRU4gKDQtMTkpICovXG4gIGhjbGVuID0gdGluZl9yZWFkX2JpdHMoZCwgNCwgNCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IDE5OyArK2kpIHsgbGVuZ3Roc1tpXSA9IDA7IH1cblxuICAvKiByZWFkIGNvZGUgbGVuZ3RocyBmb3IgY29kZSBsZW5ndGggYWxwaGFiZXQgKi9cbiAgZm9yIChpID0gMDsgaSA8IGhjbGVuOyArK2kpIHtcbiAgICAvKiBnZXQgMyBiaXRzIGNvZGUgbGVuZ3RoICgwLTcpICovXG4gICAgdmFyIGNsZW4gPSB0aW5mX3JlYWRfYml0cyhkLCAzLCAwKTtcbiAgICBsZW5ndGhzW2NsY2lkeFtpXV0gPSBjbGVuO1xuICB9XG5cbiAgLyogYnVpbGQgY29kZSBsZW5ndGggdHJlZSAqL1xuICB0aW5mX2J1aWxkX3RyZWUoY29kZV90cmVlLCBsZW5ndGhzLCAwLCAxOSk7XG5cbiAgLyogZGVjb2RlIGNvZGUgbGVuZ3RocyBmb3IgdGhlIGR5bmFtaWMgdHJlZXMgKi9cbiAgZm9yIChudW0gPSAwOyBudW0gPCBobGl0ICsgaGRpc3Q7KSB7XG4gICAgdmFyIHN5bSA9IHRpbmZfZGVjb2RlX3N5bWJvbChkLCBjb2RlX3RyZWUpO1xuXG4gICAgc3dpdGNoIChzeW0pIHtcbiAgICAgIGNhc2UgMTY6XG4gICAgICAgIC8qIGNvcHkgcHJldmlvdXMgY29kZSBsZW5ndGggMy02IHRpbWVzIChyZWFkIDIgYml0cykgKi9cbiAgICAgICAgdmFyIHByZXYgPSBsZW5ndGhzW251bSAtIDFdO1xuICAgICAgICBmb3IgKGxlbmd0aCA9IHRpbmZfcmVhZF9iaXRzKGQsIDIsIDMpOyBsZW5ndGg7IC0tbGVuZ3RoKSB7XG4gICAgICAgICAgbGVuZ3Roc1tudW0rK10gPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNzpcbiAgICAgICAgLyogcmVwZWF0IGNvZGUgbGVuZ3RoIDAgZm9yIDMtMTAgdGltZXMgKHJlYWQgMyBiaXRzKSAqL1xuICAgICAgICBmb3IgKGxlbmd0aCA9IHRpbmZfcmVhZF9iaXRzKGQsIDMsIDMpOyBsZW5ndGg7IC0tbGVuZ3RoKSB7XG4gICAgICAgICAgbGVuZ3Roc1tudW0rK10gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODpcbiAgICAgICAgLyogcmVwZWF0IGNvZGUgbGVuZ3RoIDAgZm9yIDExLTEzOCB0aW1lcyAocmVhZCA3IGJpdHMpICovXG4gICAgICAgIGZvciAobGVuZ3RoID0gdGluZl9yZWFkX2JpdHMoZCwgNywgMTEpOyBsZW5ndGg7IC0tbGVuZ3RoKSB7XG4gICAgICAgICAgbGVuZ3Roc1tudW0rK10gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogdmFsdWVzIDAtMTUgcmVwcmVzZW50IHRoZSBhY3R1YWwgY29kZSBsZW5ndGhzICovXG4gICAgICAgIGxlbmd0aHNbbnVtKytdID0gc3ltO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKiBidWlsZCBkeW5hbWljIHRyZWVzICovXG4gIHRpbmZfYnVpbGRfdHJlZShsdCwgbGVuZ3RocywgMCwgaGxpdCk7XG4gIHRpbmZfYnVpbGRfdHJlZShkdCwgbGVuZ3RocywgaGxpdCwgaGRpc3QpO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSBibG9jayBpbmZsYXRlIGZ1bmN0aW9ucyAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiBnaXZlbiBhIHN0cmVhbSBhbmQgdHdvIHRyZWVzLCBpbmZsYXRlIGEgYmxvY2sgb2YgZGF0YSAqL1xuZnVuY3Rpb24gdGluZl9pbmZsYXRlX2Jsb2NrX2RhdGEoZCwgbHQsIGR0KSB7XG4gIHdoaWxlICgxKSB7XG4gICAgdmFyIHN5bSA9IHRpbmZfZGVjb2RlX3N5bWJvbChkLCBsdCk7XG5cbiAgICAvKiBjaGVjayBmb3IgZW5kIG9mIGJsb2NrICovXG4gICAgaWYgKHN5bSA9PT0gMjU2KSB7XG4gICAgICByZXR1cm4gVElORl9PSztcbiAgICB9XG5cbiAgICBpZiAoc3ltIDwgMjU2KSB7XG4gICAgICBkLmRlc3RbZC5kZXN0TGVuKytdID0gc3ltO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbGVuZ3RoLCBkaXN0LCBvZmZzO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIHN5bSAtPSAyNTc7XG5cbiAgICAgIC8qIHBvc3NpYmx5IGdldCBtb3JlIGJpdHMgZnJvbSBsZW5ndGggY29kZSAqL1xuICAgICAgbGVuZ3RoID0gdGluZl9yZWFkX2JpdHMoZCwgbGVuZ3RoX2JpdHNbc3ltXSwgbGVuZ3RoX2Jhc2Vbc3ltXSk7XG5cbiAgICAgIGRpc3QgPSB0aW5mX2RlY29kZV9zeW1ib2woZCwgZHQpO1xuXG4gICAgICAvKiBwb3NzaWJseSBnZXQgbW9yZSBiaXRzIGZyb20gZGlzdGFuY2UgY29kZSAqL1xuICAgICAgb2ZmcyA9IGQuZGVzdExlbiAtIHRpbmZfcmVhZF9iaXRzKGQsIGRpc3RfYml0c1tkaXN0XSwgZGlzdF9iYXNlW2Rpc3RdKTtcblxuICAgICAgLyogY29weSBtYXRjaCAqL1xuICAgICAgZm9yIChpID0gb2ZmczsgaSA8IG9mZnMgKyBsZW5ndGg7ICsraSkge1xuICAgICAgICBkLmRlc3RbZC5kZXN0TGVuKytdID0gZC5kZXN0W2ldO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBpbmZsYXRlIGFuIHVuY29tcHJlc3NlZCBibG9jayBvZiBkYXRhICovXG5mdW5jdGlvbiB0aW5mX2luZmxhdGVfdW5jb21wcmVzc2VkX2Jsb2NrKGQpIHtcbiAgdmFyIGxlbmd0aCwgaW52bGVuZ3RoO1xuICB2YXIgaTtcbiAgXG4gIC8qIHVucmVhZCBmcm9tIGJpdGJ1ZmZlciAqL1xuICB3aGlsZSAoZC5iaXRjb3VudCA+IDgpIHtcbiAgICBkLnNvdXJjZUluZGV4LS07XG4gICAgZC5iaXRjb3VudCAtPSA4O1xuICB9XG5cbiAgLyogZ2V0IGxlbmd0aCAqL1xuICBsZW5ndGggPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4ICsgMV07XG4gIGxlbmd0aCA9IDI1NiAqIGxlbmd0aCArIGQuc291cmNlW2Quc291cmNlSW5kZXhdO1xuXG4gIC8qIGdldCBvbmUncyBjb21wbGVtZW50IG9mIGxlbmd0aCAqL1xuICBpbnZsZW5ndGggPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4ICsgM107XG4gIGludmxlbmd0aCA9IDI1NiAqIGludmxlbmd0aCArIGQuc291cmNlW2Quc291cmNlSW5kZXggKyAyXTtcblxuICAvKiBjaGVjayBsZW5ndGggKi9cbiAgaWYgKGxlbmd0aCAhPT0gKH5pbnZsZW5ndGggJiAweDAwMDBmZmZmKSlcbiAgICB7IHJldHVybiBUSU5GX0RBVEFfRVJST1I7IH1cblxuICBkLnNvdXJjZUluZGV4ICs9IDQ7XG5cbiAgLyogY29weSBibG9jayAqL1xuICBmb3IgKGkgPSBsZW5ndGg7IGk7IC0taSlcbiAgICB7IGQuZGVzdFtkLmRlc3RMZW4rK10gPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4KytdOyB9XG5cbiAgLyogbWFrZSBzdXJlIHdlIHN0YXJ0IG5leHQgYmxvY2sgb24gYSBieXRlIGJvdW5kYXJ5ICovXG4gIGQuYml0Y291bnQgPSAwO1xuXG4gIHJldHVybiBUSU5GX09LO1xufVxuXG4vKiBpbmZsYXRlIHN0cmVhbSBmcm9tIHNvdXJjZSB0byBkZXN0ICovXG5mdW5jdGlvbiB0aW5mX3VuY29tcHJlc3Moc291cmNlLCBkZXN0KSB7XG4gIHZhciBkID0gbmV3IERhdGEoc291cmNlLCBkZXN0KTtcbiAgdmFyIGJmaW5hbCwgYnR5cGUsIHJlcztcblxuICBkbyB7XG4gICAgLyogcmVhZCBmaW5hbCBibG9jayBmbGFnICovXG4gICAgYmZpbmFsID0gdGluZl9nZXRiaXQoZCk7XG5cbiAgICAvKiByZWFkIGJsb2NrIHR5cGUgKDIgYml0cykgKi9cbiAgICBidHlwZSA9IHRpbmZfcmVhZF9iaXRzKGQsIDIsIDApO1xuXG4gICAgLyogZGVjb21wcmVzcyBibG9jayAqL1xuICAgIHN3aXRjaCAoYnR5cGUpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgLyogZGVjb21wcmVzcyB1bmNvbXByZXNzZWQgYmxvY2sgKi9cbiAgICAgICAgcmVzID0gdGluZl9pbmZsYXRlX3VuY29tcHJlc3NlZF9ibG9jayhkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIC8qIGRlY29tcHJlc3MgYmxvY2sgd2l0aCBmaXhlZCBodWZmbWFuIHRyZWVzICovXG4gICAgICAgIHJlcyA9IHRpbmZfaW5mbGF0ZV9ibG9ja19kYXRhKGQsIHNsdHJlZSwgc2R0cmVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIC8qIGRlY29tcHJlc3MgYmxvY2sgd2l0aCBkeW5hbWljIGh1ZmZtYW4gdHJlZXMgKi9cbiAgICAgICAgdGluZl9kZWNvZGVfdHJlZXMoZCwgZC5sdHJlZSwgZC5kdHJlZSk7XG4gICAgICAgIHJlcyA9IHRpbmZfaW5mbGF0ZV9ibG9ja19kYXRhKGQsIGQubHRyZWUsIGQuZHRyZWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJlcyA9IFRJTkZfREFUQV9FUlJPUjtcbiAgICB9XG5cbiAgICBpZiAocmVzICE9PSBUSU5GX09LKVxuICAgICAgeyB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgZXJyb3InKTsgfVxuXG4gIH0gd2hpbGUgKCFiZmluYWwpO1xuXG4gIGlmIChkLmRlc3RMZW4gPCBkLmRlc3QubGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiBkLmRlc3Quc2xpY2UgPT09ICdmdW5jdGlvbicpXG4gICAgICB7IHJldHVybiBkLmRlc3Quc2xpY2UoMCwgZC5kZXN0TGVuKTsgfVxuICAgIGVsc2VcbiAgICAgIHsgcmV0dXJuIGQuZGVzdC5zdWJhcnJheSgwLCBkLmRlc3RMZW4pOyB9XG4gIH1cbiAgXG4gIHJldHVybiBkLmRlc3Q7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIGluaXRpYWxpemF0aW9uIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdHJlZXMgKi9cbnRpbmZfYnVpbGRfZml4ZWRfdHJlZXMoc2x0cmVlLCBzZHRyZWUpO1xuXG4vKiBidWlsZCBleHRyYSBiaXRzIGFuZCBiYXNlIHRhYmxlcyAqL1xudGluZl9idWlsZF9iaXRzX2Jhc2UobGVuZ3RoX2JpdHMsIGxlbmd0aF9iYXNlLCA0LCAzKTtcbnRpbmZfYnVpbGRfYml0c19iYXNlKGRpc3RfYml0cywgZGlzdF9iYXNlLCAyLCAxKTtcblxuLyogZml4IGEgc3BlY2lhbCBjYXNlICovXG5sZW5ndGhfYml0c1syOF0gPSAwO1xubGVuZ3RoX2Jhc2VbMjhdID0gMjU4O1xuXG52YXIgaW5kZXggPSB0aW5mX3VuY29tcHJlc3M7XG5cbi8vIFRoZSBCb3VuZGluZyBCb3ggb2JqZWN0XG5cbmZ1bmN0aW9uIGRlcml2ZSh2MCwgdjEsIHYyLCB2MywgdCkge1xuICAgIHJldHVybiBNYXRoLnBvdygxIC0gdCwgMykgKiB2MCArXG4gICAgICAgIDMgKiBNYXRoLnBvdygxIC0gdCwgMikgKiB0ICogdjEgK1xuICAgICAgICAzICogKDEgLSB0KSAqIE1hdGgucG93KHQsIDIpICogdjIgK1xuICAgICAgICBNYXRoLnBvdyh0LCAzKSAqIHYzO1xufVxuLyoqXG4gKiBBIGJvdW5kaW5nIGJveCBpcyBhbiBlbmNsb3NpbmcgYm94IHRoYXQgZGVzY3JpYmVzIHRoZSBzbWFsbGVzdCBtZWFzdXJlIHdpdGhpbiB3aGljaCBhbGwgdGhlIHBvaW50cyBsaWUuXG4gKiBJdCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgYm91bmRpbmcgYm94IG9mIGEgZ2x5cGggb3IgdGV4dCBwYXRoLlxuICpcbiAqIE9uIGluaXRpYWxpemF0aW9uLCB4MS95MS94Mi95MiB3aWxsIGJlIE5hTi4gQ2hlY2sgaWYgdGhlIGJvdW5kaW5nIGJveCBpcyBlbXB0eSB1c2luZyBgaXNFbXB0eSgpYC5cbiAqXG4gKiBAZXhwb3J0cyBvcGVudHlwZS5Cb3VuZGluZ0JveFxuICogQGNsYXNzXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gQm91bmRpbmdCb3goKSB7XG4gICAgdGhpcy54MSA9IE51bWJlci5OYU47XG4gICAgdGhpcy55MSA9IE51bWJlci5OYU47XG4gICAgdGhpcy54MiA9IE51bWJlci5OYU47XG4gICAgdGhpcy55MiA9IE51bWJlci5OYU47XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBib3VuZGluZyBib3ggaXMgZW1wdHksIHRoYXQgaXMsIG5vIHBvaW50cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGJveCB5ZXQuXG4gKi9cbkJvdW5kaW5nQm94LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGlzTmFOKHRoaXMueDEpIHx8IGlzTmFOKHRoaXMueTEpIHx8IGlzTmFOKHRoaXMueDIpIHx8IGlzTmFOKHRoaXMueTIpO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIHBvaW50IHRvIHRoZSBib3VuZGluZyBib3guXG4gKiBUaGUgeDEveTEveDIveTIgY29vcmRpbmF0ZXMgb2YgdGhlIGJvdW5kaW5nIGJveCB3aWxsIG5vdyBlbmNvbXBhc3MgdGhlIGdpdmVuIHBvaW50LlxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuXG4gKi9cbkJvdW5kaW5nQm94LnByb3RvdHlwZS5hZGRQb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChpc05hTih0aGlzLngxKSB8fCBpc05hTih0aGlzLngyKSkge1xuICAgICAgICAgICAgdGhpcy54MSA9IHg7XG4gICAgICAgICAgICB0aGlzLngyID0geDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCA8IHRoaXMueDEpIHtcbiAgICAgICAgICAgIHRoaXMueDEgPSB4O1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID4gdGhpcy54Mikge1xuICAgICAgICAgICAgdGhpcy54MiA9IHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiB5ID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoaXNOYU4odGhpcy55MSkgfHwgaXNOYU4odGhpcy55MikpIHtcbiAgICAgICAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgICAgICAgdGhpcy55MiA9IHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHkgPCB0aGlzLnkxKSB7XG4gICAgICAgICAgICB0aGlzLnkxID0geTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeSA+IHRoaXMueTIpIHtcbiAgICAgICAgICAgIHRoaXMueTIgPSB5O1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKiBBZGQgYSBYIGNvb3JkaW5hdGUgdG8gdGhlIGJvdW5kaW5nIGJveC5cbiAqIFRoaXMgZXh0ZW5kcyB0aGUgYm91bmRpbmcgYm94IHRvIGluY2x1ZGUgdGhlIFggY29vcmRpbmF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IGluc2lkZSBvZiBhZGRCZXppZXIuXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICovXG5Cb3VuZGluZ0JveC5wcm90b3R5cGUuYWRkWCA9IGZ1bmN0aW9uKHgpIHtcbiAgICB0aGlzLmFkZFBvaW50KHgsIG51bGwpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBZIGNvb3JkaW5hdGUgdG8gdGhlIGJvdW5kaW5nIGJveC5cbiAqIFRoaXMgZXh0ZW5kcyB0aGUgYm91bmRpbmcgYm94IHRvIGluY2x1ZGUgdGhlIFkgY29vcmRpbmF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IGluc2lkZSBvZiBhZGRCZXppZXIuXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICovXG5Cb3VuZGluZ0JveC5wcm90b3R5cGUuYWRkWSA9IGZ1bmN0aW9uKHkpIHtcbiAgICB0aGlzLmFkZFBvaW50KG51bGwsIHkpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBCw6l6aWVyIGN1cnZlIHRvIHRoZSBib3VuZGluZyBib3guXG4gKiBUaGlzIGV4dGVuZHMgdGhlIGJvdW5kaW5nIGJveCB0byBpbmNsdWRlIHRoZSBlbnRpcmUgQsOpemllci5cbiAqIEBwYXJhbSB7bnVtYmVyfSB4MCAtIFRoZSBzdGFydGluZyBYIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0ge251bWJlcn0geTAgLSBUaGUgc3RhcnRpbmcgWSBjb29yZGluYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHgxIC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXG4gKiBAcGFyYW0ge251bWJlcn0geDIgLSBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5MiAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgZW5kaW5nIFggY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGVuZGluZyBZIGNvb3JkaW5hdGUuXG4gKi9cbkJvdW5kaW5nQm94LnByb3RvdHlwZS5hZGRCZXppZXIgPSBmdW5jdGlvbih4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gaHR0cDovL25pc2hpb2hpcm9rYXp1LmJsb2dzcG90LmNvbS8yMDA5LzA2L2hvdy10by1jYWxjdWxhdGUtYmV6aWVyLWN1cnZlcy1ib3VuZGluZy5odG1sXG4gICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9pY29uczgvc3ZnLXBhdGgtYm91bmRpbmctYm94XG5cbiAgICB2YXIgcDAgPSBbeDAsIHkwXTtcbiAgICB2YXIgcDEgPSBbeDEsIHkxXTtcbiAgICB2YXIgcDIgPSBbeDIsIHkyXTtcbiAgICB2YXIgcDMgPSBbeCwgeV07XG5cbiAgICB0aGlzLmFkZFBvaW50KHgwLCB5MCk7XG4gICAgdGhpcy5hZGRQb2ludCh4LCB5KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IDE7IGkrKykge1xuICAgICAgICB2YXIgYiA9IDYgKiBwMFtpXSAtIDEyICogcDFbaV0gKyA2ICogcDJbaV07XG4gICAgICAgIHZhciBhID0gLTMgKiBwMFtpXSArIDkgKiBwMVtpXSAtIDkgKiBwMltpXSArIDMgKiBwM1tpXTtcbiAgICAgICAgdmFyIGMgPSAzICogcDFbaV0gLSAzICogcDBbaV07XG5cbiAgICAgICAgaWYgKGEgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChiID09PSAwKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICB2YXIgdCA9IC1jIC8gYjtcbiAgICAgICAgICAgIGlmICgwIDwgdCAmJiB0IDwgMSkge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7IHRoaXMkMS5hZGRYKGRlcml2ZShwMFtpXSwgcDFbaV0sIHAyW2ldLCBwM1tpXSwgdCkpOyB9XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDEpIHsgdGhpcyQxLmFkZFkoZGVyaXZlKHAwW2ldLCBwMVtpXSwgcDJbaV0sIHAzW2ldLCB0KSk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGIyYWMgPSBNYXRoLnBvdyhiLCAyKSAtIDQgKiBjICogYTtcbiAgICAgICAgaWYgKGIyYWMgPCAwKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgIHZhciB0MSA9ICgtYiArIE1hdGguc3FydChiMmFjKSkgLyAoMiAqIGEpO1xuICAgICAgICBpZiAoMCA8IHQxICYmIHQxIDwgMSkge1xuICAgICAgICAgICAgaWYgKGkgPT09IDApIHsgdGhpcyQxLmFkZFgoZGVyaXZlKHAwW2ldLCBwMVtpXSwgcDJbaV0sIHAzW2ldLCB0MSkpOyB9XG4gICAgICAgICAgICBpZiAoaSA9PT0gMSkgeyB0aGlzJDEuYWRkWShkZXJpdmUocDBbaV0sIHAxW2ldLCBwMltpXSwgcDNbaV0sIHQxKSk7IH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdDIgPSAoLWIgLSBNYXRoLnNxcnQoYjJhYykpIC8gKDIgKiBhKTtcbiAgICAgICAgaWYgKDAgPCB0MiAmJiB0MiA8IDEpIHtcbiAgICAgICAgICAgIGlmIChpID09PSAwKSB7IHRoaXMkMS5hZGRYKGRlcml2ZShwMFtpXSwgcDFbaV0sIHAyW2ldLCBwM1tpXSwgdDIpKTsgfVxuICAgICAgICAgICAgaWYgKGkgPT09IDEpIHsgdGhpcyQxLmFkZFkoZGVyaXZlKHAwW2ldLCBwMVtpXSwgcDJbaV0sIHAzW2ldLCB0MikpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vKipcbiAqIEFkZCBhIHF1YWRyYXRpYyBjdXJ2ZSB0byB0aGUgYm91bmRpbmcgYm94LlxuICogVGhpcyBleHRlbmRzIHRoZSBib3VuZGluZyBib3ggdG8gaW5jbHVkZSB0aGUgZW50aXJlIHF1YWRyYXRpYyBjdXJ2ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB4MCAtIFRoZSBzdGFydGluZyBYIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0ge251bWJlcn0geTAgLSBUaGUgc3RhcnRpbmcgWSBjb29yZGluYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHgxIC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBlbmRpbmcgWCBjb29yZGluYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgZW5kaW5nIFkgY29vcmRpbmF0ZS5cbiAqL1xuQm91bmRpbmdCb3gucHJvdG90eXBlLmFkZFF1YWQgPSBmdW5jdGlvbih4MCwgeTAsIHgxLCB5MSwgeCwgeSkge1xuICAgIHZhciBjcDF4ID0geDAgKyAyIC8gMyAqICh4MSAtIHgwKTtcbiAgICB2YXIgY3AxeSA9IHkwICsgMiAvIDMgKiAoeTEgLSB5MCk7XG4gICAgdmFyIGNwMnggPSBjcDF4ICsgMSAvIDMgKiAoeCAtIHgwKTtcbiAgICB2YXIgY3AyeSA9IGNwMXkgKyAxIC8gMyAqICh5IC0geTApO1xuICAgIHRoaXMuYWRkQmV6aWVyKHgwLCB5MCwgY3AxeCwgY3AxeSwgY3AyeCwgY3AyeSwgeCwgeSk7XG59O1xuXG4vLyBHZW9tZXRyaWMgb2JqZWN0c1xuXG4vKipcbiAqIEEgYsOpemllciBwYXRoIGNvbnRhaW5pbmcgYSBzZXQgb2YgcGF0aCBjb21tYW5kcyBzaW1pbGFyIHRvIGEgU1ZHIHBhdGguXG4gKiBQYXRocyBjYW4gYmUgZHJhd24gb24gYSBjb250ZXh0IHVzaW5nIGBkcmF3YC5cbiAqIEBleHBvcnRzIG9wZW50eXBlLlBhdGhcbiAqIEBjbGFzc1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFBhdGgoKSB7XG4gICAgdGhpcy5jb21tYW5kcyA9IFtdO1xuICAgIHRoaXMuZmlsbCA9ICdibGFjayc7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgIHRoaXMuc3Ryb2tlV2lkdGggPSAxO1xufVxuXG4vKipcbiAqIEBwYXJhbSAge251bWJlcn0geFxuICogQHBhcmFtICB7bnVtYmVyfSB5XG4gKi9cblBhdGgucHJvdG90eXBlLm1vdmVUbyA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLmNvbW1hbmRzLnB1c2goe1xuICAgICAgICB0eXBlOiAnTScsXG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICB9KTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7bnVtYmVyfSB4XG4gKiBAcGFyYW0gIHtudW1iZXJ9IHlcbiAqL1xuUGF0aC5wcm90b3R5cGUubGluZVRvID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHRoaXMuY29tbWFuZHMucHVzaCh7XG4gICAgICAgIHR5cGU6ICdMJyxcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiBEcmF3cyBjdWJpYyBjdXJ2ZVxuICogQGZ1bmN0aW9uXG4gKiBjdXJ2ZVRvXG4gKiBAbWVtYmVyb2Ygb3BlbnR5cGUuUGF0aC5wcm90b3R5cGVcbiAqIEBwYXJhbSAge251bWJlcn0geDEgLSB4IG9mIGNvbnRyb2wgMVxuICogQHBhcmFtICB7bnVtYmVyfSB5MSAtIHkgb2YgY29udHJvbCAxXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHgyIC0geCBvZiBjb250cm9sIDJcbiAqIEBwYXJhbSAge251bWJlcn0geTIgLSB5IG9mIGNvbnRyb2wgMlxuICogQHBhcmFtICB7bnVtYmVyfSB4IC0geCBvZiBwYXRoIHBvaW50XG4gKiBAcGFyYW0gIHtudW1iZXJ9IHkgLSB5IG9mIHBhdGggcG9pbnRcbiAqL1xuXG4vKipcbiAqIERyYXdzIGN1YmljIGN1cnZlXG4gKiBAZnVuY3Rpb25cbiAqIGJlemllckN1cnZlVG9cbiAqIEBtZW1iZXJvZiBvcGVudHlwZS5QYXRoLnByb3RvdHlwZVxuICogQHBhcmFtICB7bnVtYmVyfSB4MSAtIHggb2YgY29udHJvbCAxXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHkxIC0geSBvZiBjb250cm9sIDFcbiAqIEBwYXJhbSAge251bWJlcn0geDIgLSB4IG9mIGNvbnRyb2wgMlxuICogQHBhcmFtICB7bnVtYmVyfSB5MiAtIHkgb2YgY29udHJvbCAyXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHggLSB4IG9mIHBhdGggcG9pbnRcbiAqIEBwYXJhbSAge251bWJlcn0geSAtIHkgb2YgcGF0aCBwb2ludFxuICogQHNlZSBjdXJ2ZVRvXG4gKi9cblBhdGgucHJvdG90eXBlLmN1cnZlVG8gPSBQYXRoLnByb3RvdHlwZS5iZXppZXJDdXJ2ZVRvID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHtcbiAgICB0aGlzLmNvbW1hbmRzLnB1c2goe1xuICAgICAgICB0eXBlOiAnQycsXG4gICAgICAgIHgxOiB4MSxcbiAgICAgICAgeTE6IHkxLFxuICAgICAgICB4MjogeDIsXG4gICAgICAgIHkyOiB5MixcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiBEcmF3cyBxdWFkcmF0aWMgY3VydmVcbiAqIEBmdW5jdGlvblxuICogcXVhZHJhdGljQ3VydmVUb1xuICogQG1lbWJlcm9mIG9wZW50eXBlLlBhdGgucHJvdG90eXBlXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHgxIC0geCBvZiBjb250cm9sXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHkxIC0geSBvZiBjb250cm9sXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHggLSB4IG9mIHBhdGggcG9pbnRcbiAqIEBwYXJhbSAge251bWJlcn0geSAtIHkgb2YgcGF0aCBwb2ludFxuICovXG5cbi8qKlxuICogRHJhd3MgcXVhZHJhdGljIGN1cnZlXG4gKiBAZnVuY3Rpb25cbiAqIHF1YWRUb1xuICogQG1lbWJlcm9mIG9wZW50eXBlLlBhdGgucHJvdG90eXBlXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHgxIC0geCBvZiBjb250cm9sXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHkxIC0geSBvZiBjb250cm9sXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHggLSB4IG9mIHBhdGggcG9pbnRcbiAqIEBwYXJhbSAge251bWJlcn0geSAtIHkgb2YgcGF0aCBwb2ludFxuICovXG5QYXRoLnByb3RvdHlwZS5xdWFkVG8gPSBQYXRoLnByb3RvdHlwZS5xdWFkcmF0aWNDdXJ2ZVRvID0gZnVuY3Rpb24oeDEsIHkxLCB4LCB5KSB7XG4gICAgdGhpcy5jb21tYW5kcy5wdXNoKHtcbiAgICAgICAgdHlwZTogJ1EnLFxuICAgICAgICB4MTogeDEsXG4gICAgICAgIHkxOiB5MSxcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiBDbG9zZXMgdGhlIHBhdGhcbiAqIEBmdW5jdGlvbiBjbG9zZVBhdGhcbiAqIEBtZW1iZXJvZiBvcGVudHlwZS5QYXRoLnByb3RvdHlwZVxuICovXG5cbi8qKlxuICogQ2xvc2UgdGhlIHBhdGhcbiAqIEBmdW5jdGlvbiBjbG9zZVxuICogQG1lbWJlcm9mIG9wZW50eXBlLlBhdGgucHJvdG90eXBlXG4gKi9cblBhdGgucHJvdG90eXBlLmNsb3NlID0gUGF0aC5wcm90b3R5cGUuY2xvc2VQYXRoID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5jb21tYW5kcy5wdXNoKHtcbiAgICAgICAgdHlwZTogJ1onXG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEFkZCB0aGUgZ2l2ZW4gcGF0aCBvciBsaXN0IG9mIGNvbW1hbmRzIHRvIHRoZSBjb21tYW5kcyBvZiB0aGlzIHBhdGguXG4gKiBAcGFyYW0gIHtBcnJheX0gcGF0aE9yQ29tbWFuZHMgLSBhbm90aGVyIG9wZW50eXBlLlBhdGgsIGFuIG9wZW50eXBlLkJvdW5kaW5nQm94LCBvciBhbiBhcnJheSBvZiBjb21tYW5kcy5cbiAqL1xuUGF0aC5wcm90b3R5cGUuZXh0ZW5kID0gZnVuY3Rpb24ocGF0aE9yQ29tbWFuZHMpIHtcbiAgICBpZiAocGF0aE9yQ29tbWFuZHMuY29tbWFuZHMpIHtcbiAgICAgICAgcGF0aE9yQ29tbWFuZHMgPSBwYXRoT3JDb21tYW5kcy5jb21tYW5kcztcbiAgICB9IGVsc2UgaWYgKHBhdGhPckNvbW1hbmRzIGluc3RhbmNlb2YgQm91bmRpbmdCb3gpIHtcbiAgICAgICAgdmFyIGJveCA9IHBhdGhPckNvbW1hbmRzO1xuICAgICAgICB0aGlzLm1vdmVUbyhib3gueDEsIGJveC55MSk7XG4gICAgICAgIHRoaXMubGluZVRvKGJveC54MiwgYm94LnkxKTtcbiAgICAgICAgdGhpcy5saW5lVG8oYm94LngyLCBib3gueTIpO1xuICAgICAgICB0aGlzLmxpbmVUbyhib3gueDEsIGJveC55Mik7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuY29tbWFuZHMsIHBhdGhPckNvbW1hbmRzKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHBhdGguXG4gKiBAcmV0dXJucyB7b3BlbnR5cGUuQm91bmRpbmdCb3h9XG4gKi9cblBhdGgucHJvdG90eXBlLmdldEJvdW5kaW5nQm94ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgYm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG5cbiAgICB2YXIgc3RhcnRYID0gMDtcbiAgICB2YXIgc3RhcnRZID0gMDtcbiAgICB2YXIgcHJldlggPSAwO1xuICAgIHZhciBwcmV2WSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjbWQgPSB0aGlzJDEuY29tbWFuZHNbaV07XG4gICAgICAgIHN3aXRjaCAoY21kLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGJveC5hZGRQb2ludChjbWQueCwgY21kLnkpO1xuICAgICAgICAgICAgICAgIHN0YXJ0WCA9IHByZXZYID0gY21kLng7XG4gICAgICAgICAgICAgICAgc3RhcnRZID0gcHJldlkgPSBjbWQueTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgICAgICAgIGJveC5hZGRQb2ludChjbWQueCwgY21kLnkpO1xuICAgICAgICAgICAgICAgIHByZXZYID0gY21kLng7XG4gICAgICAgICAgICAgICAgcHJldlkgPSBjbWQueTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGJveC5hZGRRdWFkKHByZXZYLCBwcmV2WSwgY21kLngxLCBjbWQueTEsIGNtZC54LCBjbWQueSk7XG4gICAgICAgICAgICAgICAgcHJldlggPSBjbWQueDtcbiAgICAgICAgICAgICAgICBwcmV2WSA9IGNtZC55O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQyc6XG4gICAgICAgICAgICAgICAgYm94LmFkZEJlemllcihwcmV2WCwgcHJldlksIGNtZC54MSwgY21kLnkxLCBjbWQueDIsIGNtZC55MiwgY21kLngsIGNtZC55KTtcbiAgICAgICAgICAgICAgICBwcmV2WCA9IGNtZC54O1xuICAgICAgICAgICAgICAgIHByZXZZID0gY21kLnk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdaJzpcbiAgICAgICAgICAgICAgICBwcmV2WCA9IHN0YXJ0WDtcbiAgICAgICAgICAgICAgICBwcmV2WSA9IHN0YXJ0WTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHBhdGggY29tbWFuZCAnICsgY21kLnR5cGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChib3guaXNFbXB0eSgpKSB7XG4gICAgICAgIGJveC5hZGRQb2ludCgwLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGJveDtcbn07XG5cbi8qKlxuICogRHJhdyB0aGUgcGF0aCB0byBhIDJEIGNvbnRleHQuXG4gKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY3R4IC0gQSAyRCBkcmF3aW5nIGNvbnRleHQuXG4gKi9cblBhdGgucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihjdHgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tbWFuZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGNtZCA9IHRoaXMkMS5jb21tYW5kc1tpXTtcbiAgICAgICAgaWYgKGNtZC50eXBlID09PSAnTScpIHtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oY21kLngsIGNtZC55KTtcbiAgICAgICAgfSBlbHNlIGlmIChjbWQudHlwZSA9PT0gJ0wnKSB7XG4gICAgICAgICAgICBjdHgubGluZVRvKGNtZC54LCBjbWQueSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY21kLnR5cGUgPT09ICdDJykge1xuICAgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oY21kLngxLCBjbWQueTEsIGNtZC54MiwgY21kLnkyLCBjbWQueCwgY21kLnkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNtZC50eXBlID09PSAnUScpIHtcbiAgICAgICAgICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNtZC54MSwgY21kLnkxLCBjbWQueCwgY21kLnkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNtZC50eXBlID09PSAnWicpIHtcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmZpbGwpIHtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHRoaXMuZmlsbDtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdHJva2UpIHtcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zdHJva2U7XG4gICAgICAgIGN0eC5saW5lV2lkdGggPSB0aGlzLnN0cm9rZVdpZHRoO1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBQYXRoIHRvIGEgc3RyaW5nIG9mIHBhdGggZGF0YSBpbnN0cnVjdGlvbnNcbiAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvcGF0aHMuaHRtbCNQYXRoRGF0YVxuICogQHBhcmFtICB7bnVtYmVyfSBbZGVjaW1hbFBsYWNlcz0yXSAtIFRoZSBhbW91bnQgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIGZsb2F0aW5nLXBvaW50IHZhbHVlc1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5QYXRoLnByb3RvdHlwZS50b1BhdGhEYXRhID0gZnVuY3Rpb24oZGVjaW1hbFBsYWNlcykge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgZGVjaW1hbFBsYWNlcyA9IGRlY2ltYWxQbGFjZXMgIT09IHVuZGVmaW5lZCA/IGRlY2ltYWxQbGFjZXMgOiAyO1xuXG4gICAgZnVuY3Rpb24gZmxvYXRUb1N0cmluZyh2KSB7XG4gICAgICAgIGlmIChNYXRoLnJvdW5kKHYpID09PSB2KSB7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBNYXRoLnJvdW5kKHYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHYudG9GaXhlZChkZWNpbWFsUGxhY2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhY2tWYWx1ZXMoKSB7XG4gICAgICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICAgICAgICB2YXIgcyA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIHYgPSBhcmd1bWVudHMkMVtpXTtcbiAgICAgICAgICAgIGlmICh2ID49IDAgJiYgaSA+IDApIHtcbiAgICAgICAgICAgICAgICBzICs9ICcgJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcyArPSBmbG9hdFRvU3RyaW5nKHYpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgdmFyIGQgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tbWFuZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGNtZCA9IHRoaXMkMS5jb21tYW5kc1tpXTtcbiAgICAgICAgaWYgKGNtZC50eXBlID09PSAnTScpIHtcbiAgICAgICAgICAgIGQgKz0gJ00nICsgcGFja1ZhbHVlcyhjbWQueCwgY21kLnkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNtZC50eXBlID09PSAnTCcpIHtcbiAgICAgICAgICAgIGQgKz0gJ0wnICsgcGFja1ZhbHVlcyhjbWQueCwgY21kLnkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNtZC50eXBlID09PSAnQycpIHtcbiAgICAgICAgICAgIGQgKz0gJ0MnICsgcGFja1ZhbHVlcyhjbWQueDEsIGNtZC55MSwgY21kLngyLCBjbWQueTIsIGNtZC54LCBjbWQueSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY21kLnR5cGUgPT09ICdRJykge1xuICAgICAgICAgICAgZCArPSAnUScgKyBwYWNrVmFsdWVzKGNtZC54MSwgY21kLnkxLCBjbWQueCwgY21kLnkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNtZC50eXBlID09PSAnWicpIHtcbiAgICAgICAgICAgIGQgKz0gJ1onO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGQ7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgdGhlIHBhdGggdG8gYW4gU1ZHIDxwYXRoPiBlbGVtZW50LCBhcyBhIHN0cmluZy5cbiAqIEBwYXJhbSAge251bWJlcn0gW2RlY2ltYWxQbGFjZXM9Ml0gLSBUaGUgYW1vdW50IG9mIGRlY2ltYWwgcGxhY2VzIGZvciBmbG9hdGluZy1wb2ludCB2YWx1ZXNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuUGF0aC5wcm90b3R5cGUudG9TVkcgPSBmdW5jdGlvbihkZWNpbWFsUGxhY2VzKSB7XG4gICAgdmFyIHN2ZyA9ICc8cGF0aCBkPVwiJztcbiAgICBzdmcgKz0gdGhpcy50b1BhdGhEYXRhKGRlY2ltYWxQbGFjZXMpO1xuICAgIHN2ZyArPSAnXCInO1xuICAgIGlmICh0aGlzLmZpbGwgJiYgdGhpcy5maWxsICE9PSAnYmxhY2snKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbGwgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHN2ZyArPSAnIGZpbGw9XCJub25lXCInO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ZnICs9ICcgZmlsbD1cIicgKyB0aGlzLmZpbGwgKyAnXCInO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICAgIHN2ZyArPSAnIHN0cm9rZT1cIicgKyB0aGlzLnN0cm9rZSArICdcIiBzdHJva2Utd2lkdGg9XCInICsgdGhpcy5zdHJva2VXaWR0aCArICdcIic7XG4gICAgfVxuXG4gICAgc3ZnICs9ICcvPic7XG4gICAgcmV0dXJuIHN2Zztcbn07XG5cbi8qKlxuICogQ29udmVydCB0aGUgcGF0aCB0byBhIERPTSBlbGVtZW50LlxuICogQHBhcmFtICB7bnVtYmVyfSBbZGVjaW1hbFBsYWNlcz0yXSAtIFRoZSBhbW91bnQgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIGZsb2F0aW5nLXBvaW50IHZhbHVlc1xuICogQHJldHVybiB7U1ZHUGF0aEVsZW1lbnR9XG4gKi9cblBhdGgucHJvdG90eXBlLnRvRE9NRWxlbWVudCA9IGZ1bmN0aW9uKGRlY2ltYWxQbGFjZXMpIHtcbiAgICB2YXIgdGVtcG9yYXJ5UGF0aCA9IHRoaXMudG9QYXRoRGF0YShkZWNpbWFsUGxhY2VzKTtcbiAgICB2YXIgbmV3UGF0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuXG4gICAgbmV3UGF0aC5zZXRBdHRyaWJ1dGUoJ2QnLCB0ZW1wb3JhcnlQYXRoKTtcblxuICAgIHJldHVybiBuZXdQYXRoO1xufTtcblxuLy8gUnVuLXRpbWUgY2hlY2tpbmcgb2YgcHJlY29uZGl0aW9ucy5cblxuZnVuY3Rpb24gZmFpbChtZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuXG4vLyBQcmVjb25kaXRpb24gZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgdGhlIGdpdmVuIHByZWRpY2F0ZSBpcyB0cnVlLlxuLy8gSWYgbm90LCBpdCB3aWxsIHRocm93IGFuIGVycm9yLlxuZnVuY3Rpb24gYXJndW1lbnQocHJlZGljYXRlLCBtZXNzYWdlKSB7XG4gICAgaWYgKCFwcmVkaWNhdGUpIHtcbiAgICAgICAgZmFpbChtZXNzYWdlKTtcbiAgICB9XG59XG5cbnZhciBjaGVjayA9IHsgZmFpbDogZmFpbCwgYXJndW1lbnQ6IGFyZ3VtZW50LCBhc3NlcnQ6IGFyZ3VtZW50IH07XG5cbi8vIERhdGEgdHlwZXMgdXNlZCBpbiB0aGUgT3BlblR5cGUgZm9udCBmaWxlLlxuLy8gQWxsIE9wZW5UeXBlIGZvbnRzIHVzZSBNb3Rvcm9sYS1zdHlsZSBieXRlIG9yZGVyaW5nIChCaWcgRW5kaWFuKVxuXG52YXIgTElNSVQxNiA9IDMyNzY4OyAvLyBUaGUgbGltaXQgYXQgd2hpY2ggYSAxNi1iaXQgbnVtYmVyIHN3aXRjaGVzIHNpZ25zID09IDJeMTVcbnZhciBMSU1JVDMyID0gMjE0NzQ4MzY0ODsgLy8gVGhlIGxpbWl0IGF0IHdoaWNoIGEgMzItYml0IG51bWJlciBzd2l0Y2hlcyBzaWducyA9PSAyIF4gMzFcblxuLyoqXG4gKiBAZXhwb3J0cyBvcGVudHlwZS5kZWNvZGVcbiAqIEBjbGFzc1xuICovXG52YXIgZGVjb2RlID0ge307XG4vKipcbiAqIEBleHBvcnRzIG9wZW50eXBlLmVuY29kZVxuICogQGNsYXNzXG4gKi9cbnZhciBlbmNvZGUgPSB7fTtcbi8qKlxuICogQGV4cG9ydHMgb3BlbnR5cGUuc2l6ZU9mXG4gKiBAY2xhc3NcbiAqL1xudmFyIHNpemVPZiA9IHt9O1xuXG4vLyBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIHZhbHVlLlxuZnVuY3Rpb24gY29uc3RhbnQodikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfTtcbn1cblxuLy8gT3BlblR5cGUgZGF0YSB0eXBlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBDb252ZXJ0IGFuIDgtYml0IHVuc2lnbmVkIGludGVnZXIgdG8gYSBsaXN0IG9mIDEgYnl0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5lbmNvZGUuQllURSA9IGZ1bmN0aW9uKHYpIHtcbiAgICBjaGVjay5hcmd1bWVudCh2ID49IDAgJiYgdiA8PSAyNTUsICdCeXRlIHZhbHVlIHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDI1NS4nKTtcbiAgICByZXR1cm4gW3ZdO1xufTtcbi8qKlxuICogQGNvbnN0YW50XG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5zaXplT2YuQllURSA9IGNvbnN0YW50KDEpO1xuXG4vKipcbiAqIENvbnZlcnQgYSA4LWJpdCBzaWduZWQgaW50ZWdlciB0byBhIGxpc3Qgb2YgMSBieXRlLlxuICogQHBhcmFtIHtzdHJpbmd9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmVuY29kZS5DSEFSID0gZnVuY3Rpb24odikge1xuICAgIHJldHVybiBbdi5jaGFyQ29kZUF0KDApXTtcbn07XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5zaXplT2YuQ0hBUiA9IGNvbnN0YW50KDEpO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgbGlzdCBvZiBieXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5lbmNvZGUuQ0hBUkFSUkFZID0gZnVuY3Rpb24odikge1xuICAgIHZhciBiID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGJbaV0gPSB2LmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGI7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5zaXplT2YuQ0hBUkFSUkFZID0gZnVuY3Rpb24odikge1xuICAgIHJldHVybiB2Lmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ29udmVydCBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGEgbGlzdCBvZiAyIGJ5dGVzLlxuICogQHBhcmFtIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmVuY29kZS5VU0hPUlQgPSBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIFsodiA+PiA4KSAmIDB4RkYsIHYgJiAweEZGXTtcbn07XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5zaXplT2YuVVNIT1JUID0gY29uc3RhbnQoMik7XG5cbi8qKlxuICogQ29udmVydCBhIDE2LWJpdCBzaWduZWQgaW50ZWdlciB0byBhIGxpc3Qgb2YgMiBieXRlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5lbmNvZGUuU0hPUlQgPSBmdW5jdGlvbih2KSB7XG4gICAgLy8gVHdvJ3MgY29tcGxlbWVudFxuICAgIGlmICh2ID49IExJTUlUMTYpIHtcbiAgICAgICAgdiA9IC0oMiAqIExJTUlUMTYgLSB2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gWyh2ID4+IDgpICYgMHhGRiwgdiAmIDB4RkZdO1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbnNpemVPZi5TSE9SVCA9IGNvbnN0YW50KDIpO1xuXG4vKipcbiAqIENvbnZlcnQgYSAyNC1iaXQgdW5zaWduZWQgaW50ZWdlciB0byBhIGxpc3Qgb2YgMyBieXRlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5lbmNvZGUuVUlOVDI0ID0gZnVuY3Rpb24odikge1xuICAgIHJldHVybiBbKHYgPj4gMTYpICYgMHhGRiwgKHYgPj4gOCkgJiAweEZGLCB2ICYgMHhGRl07XG59O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQHR5cGUge251bWJlcn1cbiAqL1xuc2l6ZU9mLlVJTlQyNCA9IGNvbnN0YW50KDMpO1xuXG4vKipcbiAqIENvbnZlcnQgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciB0byBhIGxpc3Qgb2YgNCBieXRlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5lbmNvZGUuVUxPTkcgPSBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIFsodiA+PiAyNCkgJiAweEZGLCAodiA+PiAxNikgJiAweEZGLCAodiA+PiA4KSAmIDB4RkYsIHYgJiAweEZGXTtcbn07XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5zaXplT2YuVUxPTkcgPSBjb25zdGFudCg0KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgdG8gYSBsaXN0IG9mIDQgYnl0ZXMuXG4gKiBAcGFyYW0ge251bWJlcn1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZW5jb2RlLkxPTkcgPSBmdW5jdGlvbih2KSB7XG4gICAgLy8gVHdvJ3MgY29tcGxlbWVudFxuICAgIGlmICh2ID49IExJTUlUMzIpIHtcbiAgICAgICAgdiA9IC0oMiAqIExJTUlUMzIgLSB2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gWyh2ID4+IDI0KSAmIDB4RkYsICh2ID4+IDE2KSAmIDB4RkYsICh2ID4+IDgpICYgMHhGRiwgdiAmIDB4RkZdO1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbnNpemVPZi5MT05HID0gY29uc3RhbnQoNCk7XG5cbmVuY29kZS5GSVhFRCA9IGVuY29kZS5VTE9ORztcbnNpemVPZi5GSVhFRCA9IHNpemVPZi5VTE9ORztcblxuZW5jb2RlLkZXT1JEID0gZW5jb2RlLlNIT1JUO1xuc2l6ZU9mLkZXT1JEID0gc2l6ZU9mLlNIT1JUO1xuXG5lbmNvZGUuVUZXT1JEID0gZW5jb2RlLlVTSE9SVDtcbnNpemVPZi5VRldPUkQgPSBzaXplT2YuVVNIT1JUO1xuXG4vKipcbiAqIENvbnZlcnQgYSAzMi1iaXQgQXBwbGUgTWFjIHRpbWVzdGFtcCBpbnRlZ2VyIHRvIGEgbGlzdCBvZiA4IGJ5dGVzLCA2NC1iaXQgdGltZXN0YW1wLlxuICogQHBhcmFtIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmVuY29kZS5MT05HREFURVRJTUUgPSBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIFswLCAwLCAwLCAwLCAodiA+PiAyNCkgJiAweEZGLCAodiA+PiAxNikgJiAweEZGLCAodiA+PiA4KSAmIDB4RkYsIHYgJiAweEZGXTtcbn07XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5zaXplT2YuTE9OR0RBVEVUSU1FID0gY29uc3RhbnQoOCk7XG5cbi8qKlxuICogQ29udmVydCBhIDQtY2hhciB0YWcgdG8gYSBsaXN0IG9mIDQgYnl0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ31cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZW5jb2RlLlRBRyA9IGZ1bmN0aW9uKHYpIHtcbiAgICBjaGVjay5hcmd1bWVudCh2Lmxlbmd0aCA9PT0gNCwgJ1RhZyBzaG91bGQgYmUgZXhhY3RseSA0IEFTQ0lJIGNoYXJhY3RlcnMuJyk7XG4gICAgcmV0dXJuIFt2LmNoYXJDb2RlQXQoMCksXG4gICAgICAgICAgICB2LmNoYXJDb2RlQXQoMSksXG4gICAgICAgICAgICB2LmNoYXJDb2RlQXQoMiksXG4gICAgICAgICAgICB2LmNoYXJDb2RlQXQoMyldO1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbnNpemVPZi5UQUcgPSBjb25zdGFudCg0KTtcblxuLy8gQ0ZGIGRhdGEgdHlwZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZW5jb2RlLkNhcmQ4ID0gZW5jb2RlLkJZVEU7XG5zaXplT2YuQ2FyZDggPSBzaXplT2YuQllURTtcblxuZW5jb2RlLkNhcmQxNiA9IGVuY29kZS5VU0hPUlQ7XG5zaXplT2YuQ2FyZDE2ID0gc2l6ZU9mLlVTSE9SVDtcblxuZW5jb2RlLk9mZlNpemUgPSBlbmNvZGUuQllURTtcbnNpemVPZi5PZmZTaXplID0gc2l6ZU9mLkJZVEU7XG5cbmVuY29kZS5TSUQgPSBlbmNvZGUuVVNIT1JUO1xuc2l6ZU9mLlNJRCA9IHNpemVPZi5VU0hPUlQ7XG5cbi8vIENvbnZlcnQgYSBudW1lcmljIG9wZXJhbmQgb3IgY2hhcnN0cmluZyBudW1iZXIgdG8gYSB2YXJpYWJsZS1zaXplIGxpc3Qgb2YgYnl0ZXMuXG4vKipcbiAqIENvbnZlcnQgYSBudW1lcmljIG9wZXJhbmQgb3IgY2hhcnN0cmluZyBudW1iZXIgdG8gYSB2YXJpYWJsZS1zaXplIGxpc3Qgb2YgYnl0ZXMuXG4gKiBAcGFyYW0ge251bWJlcn1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZW5jb2RlLk5VTUJFUiA9IGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAodiA+PSAtMTA3ICYmIHYgPD0gMTA3KSB7XG4gICAgICAgIHJldHVybiBbdiArIDEzOV07XG4gICAgfSBlbHNlIGlmICh2ID49IDEwOCAmJiB2IDw9IDExMzEpIHtcbiAgICAgICAgdiA9IHYgLSAxMDg7XG4gICAgICAgIHJldHVybiBbKHYgPj4gOCkgKyAyNDcsIHYgJiAweEZGXTtcbiAgICB9IGVsc2UgaWYgKHYgPj0gLTExMzEgJiYgdiA8PSAtMTA4KSB7XG4gICAgICAgIHYgPSAtdiAtIDEwODtcbiAgICAgICAgcmV0dXJuIFsodiA+PiA4KSArIDI1MSwgdiAmIDB4RkZdO1xuICAgIH0gZWxzZSBpZiAodiA+PSAtMzI3NjggJiYgdiA8PSAzMjc2Nykge1xuICAgICAgICByZXR1cm4gZW5jb2RlLk5VTUJFUjE2KHYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbmNvZGUuTlVNQkVSMzIodik7XG4gICAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbnNpemVPZi5OVU1CRVIgPSBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIGVuY29kZS5OVU1CRVIodikubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgc2lnbmVkIG51bWJlciBiZXR3ZWVuIC0zMjc2OCBhbmQgKzMyNzY3IHRvIGEgdGhyZWUtYnl0ZSB2YWx1ZS5cbiAqIFRoaXMgZW5zdXJlcyB3ZSBhbHdheXMgdXNlIHRocmVlIGJ5dGVzLCBidXQgaXMgbm90IHRoZSBtb3N0IGNvbXBhY3QgZm9ybWF0LlxuICogQHBhcmFtIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmVuY29kZS5OVU1CRVIxNiA9IGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gWzI4LCAodiA+PiA4KSAmIDB4RkYsIHYgJiAweEZGXTtcbn07XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5zaXplT2YuTlVNQkVSMTYgPSBjb25zdGFudCgzKTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgc2lnbmVkIG51bWJlciBiZXR3ZWVuIC0oMl4zMSkgYW5kICsoMl4zMS0xKSB0byBhIGZpdmUtYnl0ZSB2YWx1ZS5cbiAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGJlIHN1cmUgeW91IGFsd2F5cyB1c2UgZm91ciBieXRlcyxcbiAqIGF0IHRoZSBleHBlbnNlIG9mIHdhc3RpbmcgYSBmZXcgYnl0ZXMgZm9yIHNtYWxsZXIgbnVtYmVycy5cbiAqIEBwYXJhbSB7bnVtYmVyfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5lbmNvZGUuTlVNQkVSMzIgPSBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIFsyOSwgKHYgPj4gMjQpICYgMHhGRiwgKHYgPj4gMTYpICYgMHhGRiwgKHYgPj4gOCkgJiAweEZGLCB2ICYgMHhGRl07XG59O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQHR5cGUge251bWJlcn1cbiAqL1xuc2l6ZU9mLk5VTUJFUjMyID0gY29uc3RhbnQoNSk7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmVuY29kZS5SRUFMID0gZnVuY3Rpb24odikge1xuICAgIHZhciB2YWx1ZSA9IHYudG9TdHJpbmcoKTtcblxuICAgIC8vIFNvbWUgbnVtYmVycyB1c2UgYW4gZXBzaWxvbiB0byBlbmNvZGUgdGhlIHZhbHVlLiAoZS5nLiBKYXZhU2NyaXB0IHdpbGwgc3RvcmUgMC4wMDAwMDAxIGFzIDFlLTcpXG4gICAgLy8gVGhpcyBjb2RlIGNvbnZlcnRzIGl0IGJhY2sgdG8gYSBudW1iZXIgd2l0aG91dCB0aGUgZXBzaWxvbi5cbiAgICB2YXIgbSA9IC9cXC4oXFxkKj8pKD86OXs1LDIwfXwwezUsMjB9KVxcZHswLDJ9KD86ZSguKyl8JCkvLmV4ZWModmFsdWUpO1xuICAgIGlmIChtKSB7XG4gICAgICAgIHZhciBlcHNpbG9uID0gcGFyc2VGbG9hdCgnMWUnICsgKChtWzJdID8gK21bMl0gOiAwKSArIG1bMV0ubGVuZ3RoKSk7XG4gICAgICAgIHZhbHVlID0gKE1hdGgucm91bmQodiAqIGVwc2lsb24pIC8gZXBzaWxvbikudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICB2YXIgbmliYmxlcyA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHZhbHVlLmxlbmd0aDsgaSA8IGlpOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGMgPSB2YWx1ZVtpXTtcbiAgICAgICAgaWYgKGMgPT09ICdlJykge1xuICAgICAgICAgICAgbmliYmxlcyArPSB2YWx1ZVsrK2ldID09PSAnLScgPyAnYycgOiAnYic7XG4gICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJy4nKSB7XG4gICAgICAgICAgICBuaWJibGVzICs9ICdhJztcbiAgICAgICAgfSBlbHNlIGlmIChjID09PSAnLScpIHtcbiAgICAgICAgICAgIG5pYmJsZXMgKz0gJ2UnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmliYmxlcyArPSBjO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmliYmxlcyArPSAobmliYmxlcy5sZW5ndGggJiAxKSA/ICdmJyA6ICdmZic7XG4gICAgdmFyIG91dCA9IFszMF07XG4gICAgZm9yICh2YXIgaSQxID0gMCwgaWkkMSA9IG5pYmJsZXMubGVuZ3RoOyBpJDEgPCBpaSQxOyBpJDEgKz0gMikge1xuICAgICAgICBvdXQucHVzaChwYXJzZUludChuaWJibGVzLnN1YnN0cihpJDEsIDIpLCAxNikpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuc2l6ZU9mLlJFQUwgPSBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIGVuY29kZS5SRUFMKHYpLmxlbmd0aDtcbn07XG5cbmVuY29kZS5OQU1FID0gZW5jb2RlLkNIQVJBUlJBWTtcbnNpemVPZi5OQU1FID0gc2l6ZU9mLkNIQVJBUlJBWTtcblxuZW5jb2RlLlNUUklORyA9IGVuY29kZS5DSEFSQVJSQVk7XG5zaXplT2YuU1RSSU5HID0gc2l6ZU9mLkNIQVJBUlJBWTtcblxuLyoqXG4gKiBAcGFyYW0ge0RhdGFWaWV3fSBkYXRhXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcGFyYW0ge251bWJlcn0gbnVtQnl0ZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmRlY29kZS5VVEY4ID0gZnVuY3Rpb24oZGF0YSwgb2Zmc2V0LCBudW1CeXRlcykge1xuICAgIHZhciBjb2RlUG9pbnRzID0gW107XG4gICAgdmFyIG51bUNoYXJzID0gbnVtQnl0ZXM7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1DaGFyczsgaisrLCBvZmZzZXQgKz0gMSkge1xuICAgICAgICBjb2RlUG9pbnRzW2pdID0gZGF0YS5nZXRVaW50OChvZmZzZXQpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNvZGVQb2ludHMpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0RhdGFWaWV3fSBkYXRhXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcGFyYW0ge251bWJlcn0gbnVtQnl0ZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmRlY29kZS5VVEYxNiA9IGZ1bmN0aW9uKGRhdGEsIG9mZnNldCwgbnVtQnl0ZXMpIHtcbiAgICB2YXIgY29kZVBvaW50cyA9IFtdO1xuICAgIHZhciBudW1DaGFycyA9IG51bUJ5dGVzIC8gMjtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bUNoYXJzOyBqKyssIG9mZnNldCArPSAyKSB7XG4gICAgICAgIGNvZGVQb2ludHNbal0gPSBkYXRhLmdldFVpbnQxNihvZmZzZXQpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNvZGVQb2ludHMpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgSmF2YVNjcmlwdCBzdHJpbmcgdG8gVVRGMTYtQkUuXG4gKiBAcGFyYW0ge3N0cmluZ31cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZW5jb2RlLlVURjE2ID0gZnVuY3Rpb24odikge1xuICAgIHZhciBiID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjb2RlcG9pbnQgPSB2LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGJbYi5sZW5ndGhdID0gKGNvZGVwb2ludCA+PiA4KSAmIDB4RkY7XG4gICAgICAgIGJbYi5sZW5ndGhdID0gY29kZXBvaW50ICYgMHhGRjtcbiAgICB9XG5cbiAgICByZXR1cm4gYjtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5zaXplT2YuVVRGMTYgPSBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIHYubGVuZ3RoICogMjtcbn07XG5cbi8vIERhdGEgZm9yIGNvbnZlcnRpbmcgb2xkIGVpZ2h0LWJpdCBNYWNpbnRvc2ggZW5jb2RpbmdzIHRvIFVuaWNvZGUuXG4vLyBUaGlzIHJlcHJlc2VudGF0aW9uIGlzIG9wdGltaXplZCBmb3IgZGVjb2Rpbmc7IGVuY29kaW5nIGlzIHNsb3dlclxuLy8gYW5kIG5lZWRzIG1vcmUgbWVtb3J5LiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IGFsbCBvcGVudHlwZS5qcyB1c2Vyc1xuLy8gd2FudCB0byBvcGVuIGZvbnRzLCBidXQgc2F2aW5nIGEgZm9udCB3aWxsIGJlIGNvbXBhcmF0aXZlbHkgcmFyZVxuLy8gc28gaXQgY2FuIGJlIG1vcmUgZXhwZW5zaXZlLiBLZXllZCBieSBJQU5BIGNoYXJhY3RlciBzZXQgbmFtZS5cbi8vXG4vLyBQeXRob24gc2NyaXB0IGZvciBnZW5lcmF0aW5nIHRoZXNlIHN0cmluZ3M6XG4vL1xuLy8gICAgIHMgPSB1Jycuam9pbihbY2hyKGMpLmRlY29kZSgnbWFjX2dyZWVrJykgZm9yIGMgaW4gcmFuZ2UoMTI4LCAyNTYpXSlcbi8vICAgICBwcmludChzLmVuY29kZSgndXRmLTgnKSlcbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIGVpZ2h0Qml0TWFjRW5jb2RpbmdzID0ge1xuICAgICd4LW1hYy1jcm9hdGlhbic6ICAvLyBQeXRob246ICdtYWNfY3JvYXRpYW4nXG4gICAgJ8OEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zigKDCsMKiwqPCp+KAosK2w5/CrsWg4oSiwrTCqOKJoMW9w5jiiJ7CseKJpOKJpeKIhsK14oiC4oiR4oiPxaHiiKvCqsK6zqnFvsO4JyArXG4gICAgJ8K/wqHCrOKImsaS4omIxIbCq8SM4oCmwqDDgMODw5XFksWTxJDigJTigJzigJ3igJjigJnDt+KXiu+jv8Kp4oGE4oKs4oC54oC6w4bCu+KAk8K34oCa4oCe4oCww4LEh8OBxI3DiMONw47Dj8OMw5PDlMSRw5LDmsObw5nEscuGy5zCr8+Aw4vLmsK4w4rDpsuHJyxcbiAgICAneC1tYWMtY3lyaWxsaWMnOiAgLy8gUHl0aG9uOiAnbWFjX2N5cmlsbGljJ1xuICAgICfQkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv4oCgwrDSkMKjwqfigKLCttCGwq7CqeKEotCC0ZLiiaDQg9GT4oiewrHiiaTiiaXRlsK10pHQiNCE0ZTQh9GX0InRmdCK0ZonICtcbiAgICAn0ZjQhcKs4oiaxpLiiYjiiIbCq8K74oCmwqDQi9Gb0IzRnNGV4oCT4oCU4oCc4oCd4oCY4oCZw7figJ7QjtGe0I/Rn+KEltCB0ZHRj9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGOJyxcbiAgICAneC1tYWMtZ2FlbGljJzogLy8gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL0FQUExFL0dBRUxJQy5UWFRcbiAgICAnw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgw4bDmOG4gsKx4omk4oml4biDxIrEi+G4iuG4i+G4nuG4n8SgxKHhuYDDpsO4JyArXG4gICAgJ+G5geG5luG5l8m8xpLFv+G5oMKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnhuaHhupvDv8W44bmq4oKs4oC54oC6xbbFt+G5q8K34buy4buz4oGKw4LDisOBw4vDiMONw47Dj8OMw5PDlOKZo8OSw5rDm8OZxLHDncO9xbTFteG6hOG6heG6gOG6geG6guG6gycsXG4gICAgJ3gtbWFjLWdyZWVrJzogIC8vIFB5dGhvbjogJ21hY19ncmVlaydcbiAgICAnw4TCucKyw4nCs8OWw5zOhcOgw6LDpM6EwqjDp8Opw6jDqsOrwqPihKLDrsOv4oCiwr3igLDDtMO2wqbigqzDucO7w7zigKDOk86UzpjOm86ezqDDn8KuwqnOo86qwqfiiaDCsMK3zpHCseKJpOKJpcKlzpLOlc6WzpfOmc6azpzOps6rzqjOqScgK1xuICAgICfOrM6dwqzOn86h4omIzqTCq8K74oCmwqDOpc6nzobOiMWT4oCT4oCV4oCc4oCd4oCY4oCZw7fOic6KzozOjs6tzq7Or8+Mzo/Pjc6xzrLPiM60zrXPhs6zzrfOuc6+zrrOu868zr3Ov8+Az47Pgc+Dz4TOuM+Jz4LPh8+FzrbPis+LzpDOsFxcdTAwQUQnLFxuICAgICd4LW1hYy1pY2VsYW5kaWMnOiAgLy8gUHl0aG9uOiAnbWFjX2ljZWxhbmQnXG4gICAgJ8OEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zDncKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgw4bDmOKInsKx4omk4omlwqXCteKIguKIkeKIj8+A4oirwqrCus6pw6bDuCcgK1xuICAgICfCv8KhwqziiJrGkuKJiOKIhsKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnDt+KXisO/xbjigYTigqzDkMOww57DvsO9wrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU76O/w5LDmsObw5nEscuGy5zCr8uYy5nLmsK4y53Lm8uHJyxcbiAgICAneC1tYWMtaW51aXQnOiAvLyBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvSU5VSVQuVFhUXG4gICAgJ+GQg+GQhOGQheGQhuGQiuGQi+GQseGQsuGQs+GQtOGQuOGQueGRieGRjuGRj+GRkOGRkeGRleGRluGRpuGRreGRruGRr+GRsOGRsuGRs+GSg+GSi+GSjOGSjeGSjuGSkOGSkcKw4ZKh4ZKl4ZKm4oCiwrbhkqfCrsKp4oSi4ZKo4ZKq4ZKr4ZK74ZOC4ZOD4ZOE4ZOF4ZOH4ZOI4ZOQ4ZOv4ZOw4ZOx4ZOy4ZO04ZO14ZSF4ZOV4ZOW4ZOXJyArXG4gICAgJ+GTmOGTmuGTm+GTquGUqOGUqeGUquGUq+GUreKApsKg4ZSu4ZS+4ZWV4ZWW4ZWX4oCT4oCU4oCc4oCd4oCY4oCZ4ZWY4ZWZ4ZWa4ZWd4ZWG4ZWH4ZWI4ZWJ4ZWL4ZWM4ZWQ4ZW/4ZaA4ZaB4ZaC4ZaD4ZaE4ZaF4ZaP4ZaQ4ZaR4ZaS4ZaT4ZaU4ZaV4Zmx4Zmy4Zmz4Zm04Zm14Zm24ZaW4Zag4Zah4Zai4Zaj4Zak4Zal4Zam4ZW8xYHFgicsXG4gICAgJ3gtbWFjLWNlJzogIC8vIFB5dGhvbjogJ21hY19sYXRpbjInXG4gICAgJ8OExIDEgcOJxITDlsOcw6HEhcSMw6TEjcSGxIfDqcW5xbrEjsOtxI/EksSTxJbDs8SXw7TDtsO1w7rEmsSbw7zigKDCsMSYwqPCp+KAosK2w5/CrsKp4oSixJnCqOKJoMSjxK7Er8Sq4omk4omlxKvEtuKIguKIkcWCxLvEvMS9xL7EucS6xYUnICtcbiAgICAnxYbFg8Ks4oiaxYTFh+KIhsKrwrvigKbCoMWIxZDDlcWRxYzigJPigJTigJzigJ3igJjigJnDt+KXisWNxZTFlcWY4oC54oC6xZnFlsWXxaDigJrigJ7FocWaxZvDgcWkxaXDjcW9xb7FqsOTw5TFq8Wuw5rFr8WwxbHFssWzw53DvcS3xbvFgcW8xKLLhycsXG4gICAgbWFjaW50b3NoOiAgLy8gUHl0aG9uOiAnbWFjX3JvbWFuJ1xuICAgICfDhMOFw4fDicORw5bDnMOhw6DDosOkw6PDpcOnw6nDqMOqw6vDrcOsw67Dr8Oxw7PDssO0w7bDtcO6w7nDu8O84oCgwrDCosKjwqfigKLCtsOfwq7CqeKEosK0wqjiiaDDhsOY4oiewrHiiaTiiaXCpcK14oiC4oiR4oiPz4DiiKvCqsK6zqnDpsO4JyArXG4gICAgJ8K/wqHCrOKImsaS4omI4oiGwqvCu+KApsKgw4DDg8OVxZLFk+KAk+KAlOKAnOKAneKAmOKAmcO34peKw7/FuOKBhOKCrOKAueKAuu+sge+sguKAocK34oCa4oCe4oCww4LDisOBw4vDiMONw47Dj8OMw5PDlO+jv8OSw5rDm8OZxLHLhsucwq/LmMuZy5rCuMudy5vLhycsXG4gICAgJ3gtbWFjLXJvbWFuaWFuJzogIC8vIFB5dGhvbjogJ21hY19yb21hbmlhbidcbiAgICAnw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgxILImOKInsKx4omk4omlwqXCteKIguKIkeKIj8+A4oirwqrCus6pxIPImScgK1xuICAgICfCv8KhwqziiJrGkuKJiOKIhsKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnDt+KXisO/xbjigYTigqzigLnigLrImsib4oChwrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU76O/w5LDmsObw5nEscuGy5zCr8uYy5nLmsK4y53Lm8uHJyxcbiAgICAneC1tYWMtdHVya2lzaCc6ICAvLyBQeXRob246ICdtYWNfdHVya2lzaCdcbiAgICAnw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgw4bDmOKInsKx4omk4omlwqXCteKIguKIkeKIj8+A4oirwqrCus6pw6bDuCcgK1xuICAgICfCv8KhwqziiJrGkuKJiOKIhsKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnDt+KXisO/xbjEnsSfxLDEscWexZ/igKHCt+KAmuKAnuKAsMOCw4rDgcOLw4jDjcOOw4/DjMOTw5Tvo7/DksOaw5vDme+ioMuGy5zCr8uYy5nLmsK4y53Lm8uHJ1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIGFuIG9sZC1zdHlsZSBNYWNpbnRvc2ggc3RyaW5nLiBSZXR1cm5zIGVpdGhlciBhIFVuaWNvZGUgSmF2YVNjcmlwdFxuICogc3RyaW5nLCBvciAndW5kZWZpbmVkJyBpZiB0aGUgZW5jb2RpbmcgaXMgdW5zdXBwb3J0ZWQuIEZvciBleGFtcGxlLCB3ZSBkb1xuICogbm90IHN1cHBvcnQgQ2hpbmVzZSwgSmFwYW5lc2Ugb3IgS29yZWFuIGJlY2F1c2UgdGhlc2Ugd291bGQgbmVlZCBsYXJnZVxuICogbWFwcGluZyB0YWJsZXMuXG4gKiBAcGFyYW0ge0RhdGFWaWV3fSBkYXRhVmlld1xuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICogQHBhcmFtIHtudW1iZXJ9IGRhdGFMZW5ndGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZ1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZGVjb2RlLk1BQ1NUUklORyA9IGZ1bmN0aW9uKGRhdGFWaWV3LCBvZmZzZXQsIGRhdGFMZW5ndGgsIGVuY29kaW5nKSB7XG4gICAgdmFyIHRhYmxlID0gZWlnaHRCaXRNYWNFbmNvZGluZ3NbZW5jb2RpbmddO1xuICAgIGlmICh0YWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjID0gZGF0YVZpZXcuZ2V0VWludDgob2Zmc2V0ICsgaSk7XG4gICAgICAgIC8vIEluIGFsbCBlaWdodC1iaXQgTWFjIGVuY29kaW5ncywgdGhlIGNoYXJhY3RlcnMgMHgwMC4uMHg3RiBhcmVcbiAgICAgICAgLy8gbWFwcGVkIHRvIFUrMDAwMC4uVSswMDdGOyB3ZSBvbmx5IG5lZWQgdG8gbG9vayB1cCB0aGUgb3RoZXJzLlxuICAgICAgICBpZiAoYyA8PSAweDdGKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0YWJsZVtjICYgMHg3Rl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBlbmNvZGUuTUFDU1RSSU5HLiBSZXR1cm5zIGEgZGljdGlvbmFyeSBmb3IgbWFwcGluZ1xuLy8gVW5pY29kZSBjaGFyYWN0ZXIgY29kZXMgdG8gdGhlaXIgOC1iaXQgTWFjT1MgZXF1aXZhbGVudC4gVGhpcyB0YWJsZVxuLy8gaXMgbm90IGV4YWN0bHkgYSBzdXBlciBjaGVhcCBkYXRhIHN0cnVjdHVyZSwgYnV0IHdlIGRvIG5vdCBjYXJlIGJlY2F1c2Vcbi8vIGVuY29kaW5nIE1hY2ludG9zaCBzdHJpbmdzIGlzIG9ubHkgcmFyZWx5IG5lZWRlZCBpbiB0eXBpY2FsIGFwcGxpY2F0aW9ucy5cbnZhciBtYWNFbmNvZGluZ1RhYmxlQ2FjaGUgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBuZXcgV2Vha01hcCgpO1xudmFyIG1hY0VuY29kaW5nQ2FjaGVLZXlzO1xudmFyIGdldE1hY0VuY29kaW5nVGFibGUgPSBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgICAvLyBTaW5jZSB3ZSB1c2UgZW5jb2RpbmcgYXMgYSBjYWNoZSBrZXkgZm9yIFdlYWtNYXAsIGl0IGhhcyB0byBiZVxuICAgIC8vIGEgU3RyaW5nIG9iamVjdCBhbmQgbm90IGEgbGl0ZXJhbC4gQW5kIGF0IGxlYXN0IG9uIE5vZGVKUyAyLjEwLjEsXG4gICAgLy8gV2Vha01hcCByZXF1aXJlcyB0aGF0IHRoZSBzYW1lIFN0cmluZyBpbnN0YW5jZSBpcyBwYXNzZWQgZm9yIGNhY2hlIGhpdHMuXG4gICAgaWYgKCFtYWNFbmNvZGluZ0NhY2hlS2V5cykge1xuICAgICAgICBtYWNFbmNvZGluZ0NhY2hlS2V5cyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBlIGluIGVpZ2h0Qml0TWFjRW5jb2RpbmdzKSB7XG4gICAgICAgICAgICAvKmpzaGludCAtVzA1MyAqLyAgLy8gU3VwcHJlc3MgXCJEbyBub3QgdXNlIFN0cmluZyBhcyBhIGNvbnN0cnVjdG9yLlwiXG4gICAgICAgICAgICBtYWNFbmNvZGluZ0NhY2hlS2V5c1tlXSA9IG5ldyBTdHJpbmcoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2FjaGVLZXkgPSBtYWNFbmNvZGluZ0NhY2hlS2V5c1tlbmNvZGluZ107XG4gICAgaWYgKGNhY2hlS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBXZSBjYW4ndCBkbyBcImlmIChjYWNoZS5oYXMoa2V5KSkge3JldHVybiBjYWNoZS5nZXQoa2V5KX1cIiBoZXJlOlxuICAgIC8vIHNpbmNlIGdhcmJhZ2UgY29sbGVjdGlvbiBtYXkgcnVuIGF0IGFueSB0aW1lLCBpdCBjb3VsZCBhbHNvIGtpY2sgaW5cbiAgICAvLyBiZXR3ZWVuIHRoZSBjYWxscyB0byBjYWNoZS5oYXMoKSBhbmQgY2FjaGUuZ2V0KCkuIEluIHRoYXQgY2FzZSxcbiAgICAvLyB3ZSB3b3VsZCByZXR1cm4gJ3VuZGVmaW5lZCcgZXZlbiB0aG91Z2ggd2UgZG8gc3VwcG9ydCB0aGUgZW5jb2RpbmcuXG4gICAgaWYgKG1hY0VuY29kaW5nVGFibGVDYWNoZSkge1xuICAgICAgICB2YXIgY2FjaGVkVGFibGUgPSBtYWNFbmNvZGluZ1RhYmxlQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgaWYgKGNhY2hlZFRhYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRUYWJsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWNvZGluZ1RhYmxlID0gZWlnaHRCaXRNYWNFbmNvZGluZ3NbZW5jb2RpbmddO1xuICAgIGlmIChkZWNvZGluZ1RhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgZW5jb2RpbmdUYWJsZSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVjb2RpbmdUYWJsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBlbmNvZGluZ1RhYmxlW2RlY29kaW5nVGFibGUuY2hhckNvZGVBdChpKV0gPSBpICsgMHg4MDtcbiAgICB9XG5cbiAgICBpZiAobWFjRW5jb2RpbmdUYWJsZUNhY2hlKSB7XG4gICAgICAgIG1hY0VuY29kaW5nVGFibGVDYWNoZS5zZXQoY2FjaGVLZXksIGVuY29kaW5nVGFibGUpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmNvZGluZ1RhYmxlO1xufTtcblxuLyoqXG4gKiBFbmNvZGVzIGFuIG9sZC1zdHlsZSBNYWNpbnRvc2ggc3RyaW5nLiBSZXR1cm5zIGEgYnl0ZSBhcnJheSB1cG9uIHN1Y2Nlc3MuXG4gKiBJZiB0aGUgcmVxdWVzdGVkIGVuY29kaW5nIGlzIHVuc3VwcG9ydGVkLCBvciBpZiB0aGUgaW5wdXQgc3RyaW5nIGNvbnRhaW5zXG4gKiBhIGNoYXJhY3RlciB0aGF0IGNhbm5vdCBiZSBleHByZXNzZWQgaW4gdGhlIGVuY29kaW5nLCB0aGUgZnVuY3Rpb24gcmV0dXJuc1xuICogJ3VuZGVmaW5lZCcuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZW5jb2RlLk1BQ1NUUklORyA9IGZ1bmN0aW9uKHN0ciwgZW5jb2RpbmcpIHtcbiAgICB2YXIgdGFibGUgPSBnZXRNYWNFbmNvZGluZ1RhYmxlKGVuY29kaW5nKTtcbiAgICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgIC8vIEluIGFsbCBlaWdodC1iaXQgTWFjIGVuY29kaW5ncywgdGhlIGNoYXJhY3RlcnMgMHgwMC4uMHg3RiBhcmVcbiAgICAgICAgLy8gbWFwcGVkIHRvIFUrMDAwMC4uVSswMDdGOyB3ZSBvbmx5IG5lZWQgdG8gbG9vayB1cCB0aGUgb3RoZXJzLlxuICAgICAgICBpZiAoYyA+PSAweDgwKSB7XG4gICAgICAgICAgICBjID0gdGFibGVbY107XG4gICAgICAgICAgICBpZiAoYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyIGNvbnRhaW5zIGEgVW5pY29kZSBjaGFyYWN0ZXIgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZFxuICAgICAgICAgICAgICAgIC8vIGluIHRoZSByZXF1ZXN0ZWQgZW5jb2RpbmcuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbaV0gPSBjO1xuICAgICAgICAvLyByZXN1bHQucHVzaChjKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbnNpemVPZi5NQUNTVFJJTkcgPSBmdW5jdGlvbihzdHIsIGVuY29kaW5nKSB7XG4gICAgdmFyIGIgPSBlbmNvZGUuTUFDU1RSSU5HKHN0ciwgZW5jb2RpbmcpO1xuICAgIGlmIChiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGIubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn07XG5cbi8vIEhlbHBlciBmb3IgZW5jb2RlLlZBUkRFTFRBU1xuZnVuY3Rpb24gaXNCeXRlRW5jb2RhYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IC0xMjggJiYgdmFsdWUgPD0gMTI3O1xufVxuXG4vLyBIZWxwZXIgZm9yIGVuY29kZS5WQVJERUxUQVNcbmZ1bmN0aW9uIGVuY29kZVZhckRlbHRhUnVuQXNaZXJvZXMoZGVsdGFzLCBwb3MsIHJlc3VsdCkge1xuICAgIHZhciBydW5MZW5ndGggPSAwO1xuICAgIHZhciBudW1EZWx0YXMgPSBkZWx0YXMubGVuZ3RoO1xuICAgIHdoaWxlIChwb3MgPCBudW1EZWx0YXMgJiYgcnVuTGVuZ3RoIDwgNjQgJiYgZGVsdGFzW3Bvc10gPT09IDApIHtcbiAgICAgICAgKytwb3M7XG4gICAgICAgICsrcnVuTGVuZ3RoO1xuICAgIH1cbiAgICByZXN1bHQucHVzaCgweDgwIHwgKHJ1bkxlbmd0aCAtIDEpKTtcbiAgICByZXR1cm4gcG9zO1xufVxuXG4vLyBIZWxwZXIgZm9yIGVuY29kZS5WQVJERUxUQVNcbmZ1bmN0aW9uIGVuY29kZVZhckRlbHRhUnVuQXNCeXRlcyhkZWx0YXMsIG9mZnNldCwgcmVzdWx0KSB7XG4gICAgdmFyIHJ1bkxlbmd0aCA9IDA7XG4gICAgdmFyIG51bURlbHRhcyA9IGRlbHRhcy5sZW5ndGg7XG4gICAgdmFyIHBvcyA9IG9mZnNldDtcbiAgICB3aGlsZSAocG9zIDwgbnVtRGVsdGFzICYmIHJ1bkxlbmd0aCA8IDY0KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGRlbHRhc1twb3NdO1xuICAgICAgICBpZiAoIWlzQnl0ZUVuY29kYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2l0aGluIGEgYnl0ZS1lbmNvZGVkIHJ1biBvZiBkZWx0YXMsIGEgc2luZ2xlIHplcm8gaXMgYmVzdFxuICAgICAgICAvLyBzdG9yZWQgbGl0ZXJhbGx5IGFzIDB4MDAgdmFsdWUuIEhvd2V2ZXIsIGlmIHdlIGhhdmUgdHdvIG9yXG4gICAgICAgIC8vIG1vcmUgemVyb2VzIGluIGEgc2VxdWVuY2UsIGl0IGlzIGJldHRlciB0byBzdGFydCBhIG5ldyBydW4uXG4gICAgICAgIC8vIEZvcmUgZXhhbXBsZSwgdGhlIHNlcXVlbmNlIG9mIGRlbHRhcyBbMTUsIDE1LCAwLCAxNSwgMTVdXG4gICAgICAgIC8vIGJlY29tZXMgNiBieXRlcyAoMDQgMEYgMEYgMDAgMEYgMEYpIHdoZW4gc3RvcmluZyB0aGUgemVyb1xuICAgICAgICAvLyB3aXRoaW4gdGhlIGN1cnJlbnQgcnVuLCBidXQgNyBieXRlcyAoMDEgMEYgMEYgODAgMDEgMEYgMEYpXG4gICAgICAgIC8vIHdoZW4gc3RhcnRpbmcgYSBuZXcgcnVuLlxuICAgICAgICBpZiAodmFsdWUgPT09IDAgJiYgcG9zICsgMSA8IG51bURlbHRhcyAmJiBkZWx0YXNbcG9zICsgMV0gPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgKytwb3M7XG4gICAgICAgICsrcnVuTGVuZ3RoO1xuICAgIH1cbiAgICByZXN1bHQucHVzaChydW5MZW5ndGggLSAxKTtcbiAgICBmb3IgKHZhciBpID0gb2Zmc2V0OyBpIDwgcG9zOyArK2kpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goKGRlbHRhc1tpXSArIDI1NikgJiAweGZmKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvcztcbn1cblxuLy8gSGVscGVyIGZvciBlbmNvZGUuVkFSREVMVEFTXG5mdW5jdGlvbiBlbmNvZGVWYXJEZWx0YVJ1bkFzV29yZHMoZGVsdGFzLCBvZmZzZXQsIHJlc3VsdCkge1xuICAgIHZhciBydW5MZW5ndGggPSAwO1xuICAgIHZhciBudW1EZWx0YXMgPSBkZWx0YXMubGVuZ3RoO1xuICAgIHZhciBwb3MgPSBvZmZzZXQ7XG4gICAgd2hpbGUgKHBvcyA8IG51bURlbHRhcyAmJiBydW5MZW5ndGggPCA2NCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBkZWx0YXNbcG9zXTtcblxuICAgICAgICAvLyBXaXRoaW4gYSB3b3JkLWVuY29kZWQgcnVuIG9mIGRlbHRhcywgaXQgaXMgZWFzaWVzdCB0byBzdGFydFxuICAgICAgICAvLyBhIG5ldyBydW4gKHdpdGggYSBkaWZmZXJlbnQgZW5jb2RpbmcpIHdoZW5ldmVyIHdlIGVuY291bnRlclxuICAgICAgICAvLyBhIHplcm8gdmFsdWUuIEZvciBleGFtcGxlLCB0aGUgc2VxdWVuY2UgWzB4NjY2NiwgMCwgMHg3Nzc3XVxuICAgICAgICAvLyBuZWVkcyA3IGJ5dGVzIHdoZW4gc3RvcmluZyB0aGUgemVybyBpbnNpZGUgdGhlIGN1cnJlbnQgcnVuXG4gICAgICAgIC8vICg0MiA2NiA2NiAwMCAwMCA3NyA3NyksIGFuZCBlcXVhbGx5IDcgYnl0ZXMgd2hlbiBzdGFydGluZyBhXG4gICAgICAgIC8vIG5ldyBydW4gKDQwIDY2IDY2IDgwIDQwIDc3IDc3KS5cbiAgICAgICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdpdGhpbiBhIHdvcmQtZW5jb2RlZCBydW4gb2YgZGVsdGFzLCBhIHNpbmdsZSB2YWx1ZSBpbiB0aGVcbiAgICAgICAgLy8gcmFuZ2UgKC0xMjguLjEyNykgc2hvdWxkIGJlIGVuY29kZWQgd2l0aGluIHRoZSBjdXJyZW50IHJ1blxuICAgICAgICAvLyBiZWNhdXNlIGl0IGlzIG1vcmUgY29tcGFjdC4gRm9yIGV4YW1wbGUsIHRoZSBzZXF1ZW5jZVxuICAgICAgICAvLyBbMHg2NjY2LCAyLCAweDc3NzddIGJlY29tZXMgNyBieXRlcyB3aGVuIHN0b3JpbmcgdGhlIHZhbHVlXG4gICAgICAgIC8vIGxpdGVyYWxseSAoNDIgNjYgNjYgMDAgMDIgNzcgNzcpLCBidXQgOCBieXRlcyB3aGVuIHN0YXJ0aW5nXG4gICAgICAgIC8vIGEgbmV3IHJ1biAoNDAgNjYgNjYgMDAgMDIgNDAgNzcgNzcpLlxuICAgICAgICBpZiAoaXNCeXRlRW5jb2RhYmxlKHZhbHVlKSAmJiBwb3MgKyAxIDwgbnVtRGVsdGFzICYmIGlzQnl0ZUVuY29kYWJsZShkZWx0YXNbcG9zICsgMV0pKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICsrcG9zO1xuICAgICAgICArK3J1bkxlbmd0aDtcbiAgICB9XG4gICAgcmVzdWx0LnB1c2goMHg0MCB8IChydW5MZW5ndGggLSAxKSk7XG4gICAgZm9yICh2YXIgaSA9IG9mZnNldDsgaSA8IHBvczsgKytpKSB7XG4gICAgICAgIHZhciB2YWwgPSBkZWx0YXNbaV07XG4gICAgICAgIHJlc3VsdC5wdXNoKCgodmFsICsgMHgxMDAwMCkgPj4gOCkgJiAweGZmLCAodmFsICsgMHgxMDApICYgMHhmZik7XG4gICAgfVxuICAgIHJldHVybiBwb3M7XG59XG5cbi8qKlxuICogRW5jb2RlIGEgbGlzdCBvZiB2YXJpYXRpb24gYWRqdXN0bWVudCBkZWx0YXMuXG4gKlxuICogVmFyaWF0aW9uIGFkanVzdG1lbnQgZGVsdGFzIGFyZSB1c2VkIGluIOKAmGd2YXLigJkgYW5kIOKAmGN2YXLigJkgdGFibGVzLlxuICogVGhleSBpbmRpY2F0ZSBob3cgcG9pbnRzIChpbiDigJhndmFy4oCZKSBvciB2YWx1ZXMgKGluIOKAmGN2YXLigJkpIGdldCBhZGp1c3RlZFxuICogd2hlbiBnZW5lcmF0aW5nIGluc3RhbmNlcyBvZiB2YXJpYXRpb24gZm9udHMuXG4gKlxuICogQHNlZSBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL2d2YXIuaHRtXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDYvQ2hhcDZndmFyLmh0bWxcbiAqIEBwYXJhbSB7QXJyYXl9XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZW5jb2RlLlZBUkRFTFRBUyA9IGZ1bmN0aW9uKGRlbHRhcykge1xuICAgIHZhciBwb3MgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB3aGlsZSAocG9zIDwgZGVsdGFzLmxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBkZWx0YXNbcG9zXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICBwb3MgPSBlbmNvZGVWYXJEZWx0YVJ1bkFzWmVyb2VzKGRlbHRhcywgcG9zLCByZXN1bHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IC0xMjggJiYgdmFsdWUgPD0gMTI3KSB7XG4gICAgICAgICAgICBwb3MgPSBlbmNvZGVWYXJEZWx0YVJ1bkFzQnl0ZXMoZGVsdGFzLCBwb3MsIHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb3MgPSBlbmNvZGVWYXJEZWx0YVJ1bkFzV29yZHMoZGVsdGFzLCBwb3MsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIENvbnZlcnQgYSBsaXN0IG9mIHZhbHVlcyB0byBhIENGRiBJTkRFWCBzdHJ1Y3R1cmUuXG4vLyBUaGUgdmFsdWVzIHNob3VsZCBiZSBvYmplY3RzIGNvbnRhaW5pbmcgbmFtZSAvIHR5cGUgLyB2YWx1ZS5cbi8qKlxuICogQHBhcmFtIHtBcnJheX0gbFxuICogQHJldHVybnMge0FycmF5fVxuICovXG5lbmNvZGUuSU5ERVggPSBmdW5jdGlvbihsKSB7XG4gICAgLy92YXIgb2Zmc2V0LCBvZmZzZXRzLCBvZmZzZXRFbmNvZGVyLCBlbmNvZGVkT2Zmc2V0cywgZW5jb2RlZE9mZnNldCwgZGF0YSxcbiAgICAvLyAgICBpLCB2O1xuICAgIC8vIEJlY2F1c2Ugd2UgaGF2ZSB0byBrbm93IHdoaWNoIGRhdGEgdHlwZSB0byB1c2UgdG8gZW5jb2RlIHRoZSBvZmZzZXRzLFxuICAgIC8vIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCB0aGUgdmFsdWVzIHR3aWNlOiBvbmNlIHRvIGVuY29kZSB0aGUgZGF0YSBhbmRcbiAgICAvLyBjYWxjdWxhdGUgdGhlIG9mZnNldHMsIHRoZW4gYWdhaW4gdG8gZW5jb2RlIHRoZSBvZmZzZXRzIHVzaW5nIHRoZSBmaXR0aW5nIGRhdGEgdHlwZS5cbiAgICB2YXIgb2Zmc2V0ID0gMTsgLy8gRmlyc3Qgb2Zmc2V0IGlzIGFsd2F5cyAxLlxuICAgIHZhciBvZmZzZXRzID0gW29mZnNldF07XG4gICAgdmFyIGRhdGEgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGwubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIHYgPSBlbmNvZGUuT0JKRUNUKGxbaV0pO1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkYXRhLCB2KTtcbiAgICAgICAgb2Zmc2V0ICs9IHYubGVuZ3RoO1xuICAgICAgICBvZmZzZXRzLnB1c2gob2Zmc2V0KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFswLCAwXTtcbiAgICB9XG5cbiAgICB2YXIgZW5jb2RlZE9mZnNldHMgPSBbXTtcbiAgICB2YXIgb2ZmU2l6ZSA9ICgxICsgTWF0aC5mbG9vcihNYXRoLmxvZyhvZmZzZXQpIC8gTWF0aC5sb2coMikpIC8gOCkgfCAwO1xuICAgIHZhciBvZmZzZXRFbmNvZGVyID0gW3VuZGVmaW5lZCwgZW5jb2RlLkJZVEUsIGVuY29kZS5VU0hPUlQsIGVuY29kZS5VSU5UMjQsIGVuY29kZS5VTE9OR11bb2ZmU2l6ZV07XG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgb2Zmc2V0cy5sZW5ndGg7IGkkMSArPSAxKSB7XG4gICAgICAgIHZhciBlbmNvZGVkT2Zmc2V0ID0gb2Zmc2V0RW5jb2RlcihvZmZzZXRzW2kkMV0pO1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShlbmNvZGVkT2Zmc2V0cywgZW5jb2RlZE9mZnNldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoZW5jb2RlLkNhcmQxNihsLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGUuT2ZmU2l6ZShvZmZTaXplKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRPZmZzZXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5zaXplT2YuSU5ERVggPSBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIGVuY29kZS5JTkRFWCh2KS5sZW5ndGg7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGEgQ0ZGIERJQ1Qgc3RydWN0dXJlLlxuICogVGhlIGtleXMgc2hvdWxkIGJlIG51bWVyaWMuXG4gKiBUaGUgdmFsdWVzIHNob3VsZCBiZSBvYmplY3RzIGNvbnRhaW5pbmcgbmFtZSAvIHR5cGUgLyB2YWx1ZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBtXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmVuY29kZS5ESUNUID0gZnVuY3Rpb24obSkge1xuICAgIHZhciBkID0gW107XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhtKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIC8vIE9iamVjdC5rZXlzKCkgcmV0dXJuIHN0cmluZyBrZXlzLCBidXQgb3VyIGtleXMgYXJlIGFsd2F5cyBudW1lcmljLlxuICAgICAgICB2YXIgayA9IHBhcnNlSW50KGtleXNbaV0sIDApO1xuICAgICAgICB2YXIgdiA9IG1ba107XG4gICAgICAgIC8vIFZhbHVlIGNvbWVzIGJlZm9yZSB0aGUga2V5LlxuICAgICAgICBkID0gZC5jb25jYXQoZW5jb2RlLk9QRVJBTkQodi52YWx1ZSwgdi50eXBlKSk7XG4gICAgICAgIGQgPSBkLmNvbmNhdChlbmNvZGUuT1BFUkFUT1IoaykpO1xuICAgIH1cblxuICAgIHJldHVybiBkO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbnNpemVPZi5ESUNUID0gZnVuY3Rpb24obSkge1xuICAgIHJldHVybiBlbmNvZGUuRElDVChtKS5sZW5ndGg7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5lbmNvZGUuT1BFUkFUT1IgPSBmdW5jdGlvbih2KSB7XG4gICAgaWYgKHYgPCAxMjAwKSB7XG4gICAgICAgIHJldHVybiBbdl07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsxMiwgdiAtIDEyMDBdO1xuICAgIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheX0gdlxuICogQHBhcmFtIHtzdHJpbmd9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmVuY29kZS5PUEVSQU5EID0gZnVuY3Rpb24odiwgdHlwZSkge1xuICAgIHZhciBkID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjaGVjay5hcmd1bWVudCh2Lmxlbmd0aCA9PT0gdHlwZS5sZW5ndGgsICdOb3QgZW5vdWdoIGFyZ3VtZW50cyBnaXZlbiBmb3IgdHlwZScgKyB0eXBlKTtcbiAgICAgICAgICAgIGQgPSBkLmNvbmNhdChlbmNvZGUuT1BFUkFORCh2W2ldLCB0eXBlW2ldKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ1NJRCcpIHtcbiAgICAgICAgICAgIGQgPSBkLmNvbmNhdChlbmNvZGUuTlVNQkVSKHYpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2Zmc2V0Jykge1xuICAgICAgICAgICAgLy8gV2UgbWFrZSBpdCBlYXN5IGZvciBvdXJzZWx2ZXMgYW5kIGFsd2F5cyBlbmNvZGUgb2Zmc2V0cyBhc1xuICAgICAgICAgICAgLy8gNCBieXRlcy4gVGhpcyBtYWtlcyBvZmZzZXQgY2FsY3VsYXRpb24gZm9yIHRoZSB0b3AgZGljdCBlYXNpZXIuXG4gICAgICAgICAgICBkID0gZC5jb25jYXQoZW5jb2RlLk5VTUJFUjMyKHYpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgZCA9IGQuY29uY2F0KGVuY29kZS5OVU1CRVIodikpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyZWFsJykge1xuICAgICAgICAgICAgZCA9IGQuY29uY2F0KGVuY29kZS5SRUFMKHYpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBvcGVyYW5kIHR5cGUgJyArIHR5cGUpO1xuICAgICAgICAgICAgLy8gRklYTUUgQWRkIHN1cHBvcnQgZm9yIGJvb2xlYW5zXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZDtcbn07XG5cbmVuY29kZS5PUCA9IGVuY29kZS5CWVRFO1xuc2l6ZU9mLk9QID0gc2l6ZU9mLkJZVEU7XG5cbi8vIG1lbW9pemUgY2hhcnN0cmluZyBlbmNvZGluZyB1c2luZyBXZWFrTWFwIGlmIGF2YWlsYWJsZVxudmFyIHdtbSA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ29udmVydCBhIGxpc3Qgb2YgQ2hhclN0cmluZyBvcGVyYXRpb25zIHRvIGJ5dGVzLlxuICogQHBhcmFtIHtBcnJheX1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZW5jb2RlLkNIQVJTVFJJTkcgPSBmdW5jdGlvbihvcHMpIHtcbiAgICAvLyBTZWUgZW5jb2RlLk1BQ1NUUklORyBmb3Igd2h5IHdlIGRvbid0IGRvIFwiaWYgKHdtbSAmJiB3bW0uaGFzKG9wcykpXCIuXG4gICAgaWYgKHdtbSkge1xuICAgICAgICB2YXIgY2FjaGVkVmFsdWUgPSB3bW0uZ2V0KG9wcyk7XG4gICAgICAgIGlmIChjYWNoZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZCA9IFtdO1xuICAgIHZhciBsZW5ndGggPSBvcHMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgb3AgPSBvcHNbaV07XG4gICAgICAgIGQgPSBkLmNvbmNhdChlbmNvZGVbb3AudHlwZV0ob3AudmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAod21tKSB7XG4gICAgICAgIHdtbS5zZXQob3BzLCBkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheX1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbnNpemVPZi5DSEFSU1RSSU5HID0gZnVuY3Rpb24ob3BzKSB7XG4gICAgcmV0dXJuIGVuY29kZS5DSEFSU1RSSU5HKG9wcykubGVuZ3RoO1xufTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCBjb250YWluaW5nIG5hbWUgLyB0eXBlIC8gdmFsdWUgdG8gYnl0ZXMuXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZW5jb2RlLk9CSkVDVCA9IGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgZW5jb2RpbmdGdW5jdGlvbiA9IGVuY29kZVt2LnR5cGVdO1xuICAgIGNoZWNrLmFyZ3VtZW50KGVuY29kaW5nRnVuY3Rpb24gIT09IHVuZGVmaW5lZCwgJ05vIGVuY29kaW5nIGZ1bmN0aW9uIGZvciB0eXBlICcgKyB2LnR5cGUpO1xuICAgIHJldHVybiBlbmNvZGluZ0Z1bmN0aW9uKHYudmFsdWUpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbnNpemVPZi5PQkpFQ1QgPSBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHNpemVPZkZ1bmN0aW9uID0gc2l6ZU9mW3YudHlwZV07XG4gICAgY2hlY2suYXJndW1lbnQoc2l6ZU9mRnVuY3Rpb24gIT09IHVuZGVmaW5lZCwgJ05vIHNpemVPZiBmdW5jdGlvbiBmb3IgdHlwZSAnICsgdi50eXBlKTtcbiAgICByZXR1cm4gc2l6ZU9mRnVuY3Rpb24odi52YWx1ZSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgYSB0YWJsZSBvYmplY3QgdG8gYnl0ZXMuXG4gKiBBIHRhYmxlIGNvbnRhaW5zIGEgbGlzdCBvZiBmaWVsZHMgY29udGFpbmluZyB0aGUgbWV0YWRhdGEgKG5hbWUsIHR5cGUgYW5kIGRlZmF1bHQgdmFsdWUpLlxuICogVGhlIHRhYmxlIGl0c2VsZiBoYXMgdGhlIGZpZWxkIHZhbHVlcyBzZXQgYXMgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7b3BlbnR5cGUuVGFibGV9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmVuY29kZS5UQUJMRSA9IGZ1bmN0aW9uKHRhYmxlKSB7XG4gICAgdmFyIGQgPSBbXTtcbiAgICB2YXIgbGVuZ3RoID0gdGFibGUuZmllbGRzLmxlbmd0aDtcbiAgICB2YXIgc3VidGFibGVzID0gW107XG4gICAgdmFyIHN1YnRhYmxlT2Zmc2V0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgZmllbGQgPSB0YWJsZS5maWVsZHNbaV07XG4gICAgICAgIHZhciBlbmNvZGluZ0Z1bmN0aW9uID0gZW5jb2RlW2ZpZWxkLnR5cGVdO1xuICAgICAgICBjaGVjay5hcmd1bWVudChlbmNvZGluZ0Z1bmN0aW9uICE9PSB1bmRlZmluZWQsICdObyBlbmNvZGluZyBmdW5jdGlvbiBmb3IgZmllbGQgdHlwZSAnICsgZmllbGQudHlwZSArICcgKCcgKyBmaWVsZC5uYW1lICsgJyknKTtcbiAgICAgICAgdmFyIHZhbHVlID0gdGFibGVbZmllbGQubmFtZV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJ5dGVzID0gZW5jb2RpbmdGdW5jdGlvbih2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdUQUJMRScpIHtcbiAgICAgICAgICAgIHN1YnRhYmxlT2Zmc2V0cy5wdXNoKGQubGVuZ3RoKTtcbiAgICAgICAgICAgIGQgPSBkLmNvbmNhdChbMCwgMF0pO1xuICAgICAgICAgICAgc3VidGFibGVzLnB1c2goYnl0ZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZCA9IGQuY29uY2F0KGJ5dGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHN1YnRhYmxlcy5sZW5ndGg7IGkkMSArPSAxKSB7XG4gICAgICAgIHZhciBvID0gc3VidGFibGVPZmZzZXRzW2kkMV07XG4gICAgICAgIHZhciBvZmZzZXQgPSBkLmxlbmd0aDtcbiAgICAgICAgY2hlY2suYXJndW1lbnQob2Zmc2V0IDwgNjU1MzYsICdUYWJsZSAnICsgdGFibGUudGFibGVOYW1lICsgJyB0b28gYmlnLicpO1xuICAgICAgICBkW29dID0gb2Zmc2V0ID4+IDg7XG4gICAgICAgIGRbbyArIDFdID0gb2Zmc2V0ICYgMHhmZjtcbiAgICAgICAgZCA9IGQuY29uY2F0KHN1YnRhYmxlc1tpJDFdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvcGVudHlwZS5UYWJsZX1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbnNpemVPZi5UQUJMRSA9IGZ1bmN0aW9uKHRhYmxlKSB7XG4gICAgdmFyIG51bUJ5dGVzID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gdGFibGUuZmllbGRzLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGZpZWxkID0gdGFibGUuZmllbGRzW2ldO1xuICAgICAgICB2YXIgc2l6ZU9mRnVuY3Rpb24gPSBzaXplT2ZbZmllbGQudHlwZV07XG4gICAgICAgIGNoZWNrLmFyZ3VtZW50KHNpemVPZkZ1bmN0aW9uICE9PSB1bmRlZmluZWQsICdObyBzaXplT2YgZnVuY3Rpb24gZm9yIGZpZWxkIHR5cGUgJyArIGZpZWxkLnR5cGUgKyAnICgnICsgZmllbGQubmFtZSArICcpJyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRhYmxlW2ZpZWxkLm5hbWVdO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSBmaWVsZC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG51bUJ5dGVzICs9IHNpemVPZkZ1bmN0aW9uKHZhbHVlKTtcblxuICAgICAgICAvLyBTdWJ0YWJsZXMgdGFrZSAyIG1vcmUgYnl0ZXMgZm9yIG9mZnNldHMuXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnVEFCTEUnKSB7XG4gICAgICAgICAgICBudW1CeXRlcyArPSAyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bUJ5dGVzO1xufTtcblxuZW5jb2RlLlJFQ09SRCA9IGVuY29kZS5UQUJMRTtcbnNpemVPZi5SRUNPUkQgPSBzaXplT2YuVEFCTEU7XG5cbi8vIE1lcmdlIGluIGEgbGlzdCBvZiBieXRlcy5cbmVuY29kZS5MSVRFUkFMID0gZnVuY3Rpb24odikge1xuICAgIHJldHVybiB2O1xufTtcblxuc2l6ZU9mLkxJVEVSQUwgPSBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIHYubGVuZ3RoO1xufTtcblxuLy8gVGFibGUgbWV0YWRhdGFcblxuLyoqXG4gKiBAZXhwb3J0cyBvcGVudHlwZS5UYWJsZVxuICogQGNsYXNzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lXG4gKiBAcGFyYW0ge0FycmF5fSBmaWVsZHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVGFibGUodGFibGVOYW1lLCBmaWVsZHMsIG9wdGlvbnMpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgdGhpcyQxW2ZpZWxkLm5hbWVdID0gZmllbGQudmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZU5hbWUgPSB0YWJsZU5hbWU7XG4gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgb3B0aW9uS2V5cy5sZW5ndGg7IGkkMSArPSAxKSB7XG4gICAgICAgICAgICB2YXIgayA9IG9wdGlvbktleXNbaSQxXTtcbiAgICAgICAgICAgIHZhciB2ID0gb3B0aW9uc1trXTtcbiAgICAgICAgICAgIGlmICh0aGlzJDFba10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMkMVtrXSA9IHY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogRW5jb2RlcyB0aGUgdGFibGUgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYnl0ZXNcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5UYWJsZS5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGVuY29kZS5UQUJMRSh0aGlzKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBzaXplIG9mIHRoZSB0YWJsZS5cbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVGFibGUucHJvdG90eXBlLnNpemVPZiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBzaXplT2YuVEFCTEUodGhpcyk7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHVzaG9ydExpc3QoaXRlbU5hbWUsIGxpc3QsIGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY291bnQgPSBsaXN0Lmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIGZpZWxkcyA9IG5ldyBBcnJheShsaXN0Lmxlbmd0aCArIDEpO1xuICAgIGZpZWxkc1swXSA9IHtuYW1lOiBpdGVtTmFtZSArICdDb3VudCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogY291bnR9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBmaWVsZHNbaSArIDFdID0ge25hbWU6IGl0ZW1OYW1lICsgaSwgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiBsaXN0W2ldfTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0YWJsZUxpc3QoaXRlbU5hbWUsIHJlY29yZHMsIGl0ZW1DYWxsYmFjaykge1xuICAgIHZhciBjb3VudCA9IHJlY29yZHMubGVuZ3RoO1xuICAgIHZhciBmaWVsZHMgPSBuZXcgQXJyYXkoY291bnQgKyAxKTtcbiAgICBmaWVsZHNbMF0gPSB7bmFtZTogaXRlbU5hbWUgKyAnQ291bnQnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IGNvdW50fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgZmllbGRzW2kgKyAxXSA9IHtuYW1lOiBpdGVtTmFtZSArIGksIHR5cGU6ICdUQUJMRScsIHZhbHVlOiBpdGVtQ2FsbGJhY2socmVjb3Jkc1tpXSwgaSl9O1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRzO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY29yZExpc3QoaXRlbU5hbWUsIHJlY29yZHMsIGl0ZW1DYWxsYmFjaykge1xuICAgIHZhciBjb3VudCA9IHJlY29yZHMubGVuZ3RoO1xuICAgIHZhciBmaWVsZHMgPSBbXTtcbiAgICBmaWVsZHNbMF0gPSB7bmFtZTogaXRlbU5hbWUgKyAnQ291bnQnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IGNvdW50fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgZmllbGRzID0gZmllbGRzLmNvbmNhdChpdGVtQ2FsbGJhY2socmVjb3Jkc1tpXSwgaSkpO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRzO1xufVxuXG4vLyBDb21tb24gTGF5b3V0IFRhYmxlc1xuXG4vKipcbiAqIEBleHBvcnRzIG9wZW50eXBlLkNvdmVyYWdlXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7b3BlbnR5cGUuVGFibGV9XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIG9wZW50eXBlLlRhYmxlXG4gKi9cbmZ1bmN0aW9uIENvdmVyYWdlKGNvdmVyYWdlVGFibGUpIHtcbiAgICBpZiAoY292ZXJhZ2VUYWJsZS5mb3JtYXQgPT09IDEpIHtcbiAgICAgICAgVGFibGUuY2FsbCh0aGlzLCAnY292ZXJhZ2VUYWJsZScsXG4gICAgICAgICAgICBbe25hbWU6ICdjb3ZlcmFnZUZvcm1hdCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMX1dXG4gICAgICAgICAgICAuY29uY2F0KHVzaG9ydExpc3QoJ2dseXBoJywgY292ZXJhZ2VUYWJsZS5nbHlwaHMpKVxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrLmFzc2VydChmYWxzZSwgJ0NhblxcJ3QgY3JlYXRlIGNvdmVyYWdlIHRhYmxlIGZvcm1hdCAyIHlldC4nKTtcbiAgICB9XG59XG5Db3ZlcmFnZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFRhYmxlLnByb3RvdHlwZSk7XG5Db3ZlcmFnZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb3ZlcmFnZTtcblxuZnVuY3Rpb24gU2NyaXB0TGlzdChzY3JpcHRMaXN0VGFibGUpIHtcbiAgICBUYWJsZS5jYWxsKHRoaXMsICdzY3JpcHRMaXN0VGFibGUnLFxuICAgICAgICByZWNvcmRMaXN0KCdzY3JpcHRSZWNvcmQnLCBzY3JpcHRMaXN0VGFibGUsIGZ1bmN0aW9uKHNjcmlwdFJlY29yZCwgaSkge1xuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IHNjcmlwdFJlY29yZC5zY3JpcHQ7XG4gICAgICAgICAgICB2YXIgZGVmYXVsdExhbmdTeXMgPSBzY3JpcHQuZGVmYXVsdExhbmdTeXM7XG4gICAgICAgICAgICBjaGVjay5hc3NlcnQoISFkZWZhdWx0TGFuZ1N5cywgJ1VuYWJsZSB0byB3cml0ZSBHU1VCOiBzY3JpcHQgJyArIHNjcmlwdFJlY29yZC50YWcgKyAnIGhhcyBubyBkZWZhdWx0IGxhbmd1YWdlIHN5c3RlbS4nKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAge25hbWU6ICdzY3JpcHRUYWcnICsgaSwgdHlwZTogJ1RBRycsIHZhbHVlOiBzY3JpcHRSZWNvcmQudGFnfSxcbiAgICAgICAgICAgICAgICB7bmFtZTogJ3NjcmlwdCcgKyBpLCB0eXBlOiAnVEFCTEUnLCB2YWx1ZTogbmV3IFRhYmxlKCdzY3JpcHRUYWJsZScsIFtcbiAgICAgICAgICAgICAgICAgICAge25hbWU6ICdkZWZhdWx0TGFuZ1N5cycsIHR5cGU6ICdUQUJMRScsIHZhbHVlOiBuZXcgVGFibGUoJ2RlZmF1bHRMYW5nU3lzJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6ICdsb29rdXBPcmRlcicsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ3JlcUZlYXR1cmVJbmRleCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogZGVmYXVsdExhbmdTeXMucmVxRmVhdHVyZUluZGV4fV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodXNob3J0TGlzdCgnZmVhdHVyZUluZGV4JywgZGVmYXVsdExhbmdTeXMuZmVhdHVyZUluZGV4ZXMpKSl9XG4gICAgICAgICAgICAgICAgICAgIF0uY29uY2F0KHJlY29yZExpc3QoJ2xhbmdTeXMnLCBzY3JpcHQubGFuZ1N5c1JlY29yZHMsIGZ1bmN0aW9uKGxhbmdTeXNSZWNvcmQsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYW5nU3lzID0gbGFuZ1N5c1JlY29yZC5sYW5nU3lzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ2xhbmdTeXNUYWcnICsgaSwgdHlwZTogJ1RBRycsIHZhbHVlOiBsYW5nU3lzUmVjb3JkLnRhZ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6ICdsYW5nU3lzJyArIGksIHR5cGU6ICdUQUJMRScsIHZhbHVlOiBuZXcgVGFibGUoJ2xhbmdTeXMnLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOiAnbG9va3VwT3JkZXInLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ3JlcUZlYXR1cmVJbmRleCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogbGFuZ1N5cy5yZXFGZWF0dXJlSW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uY29uY2F0KHVzaG9ydExpc3QoJ2ZlYXR1cmVJbmRleCcsIGxhbmdTeXMuZmVhdHVyZUluZGV4ZXMpKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9KSkpfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSlcbiAgICApO1xufVxuU2NyaXB0TGlzdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFRhYmxlLnByb3RvdHlwZSk7XG5TY3JpcHRMaXN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNjcmlwdExpc3Q7XG5cbi8qKlxuICogQGV4cG9ydHMgb3BlbnR5cGUuRmVhdHVyZUxpc3RcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtvcGVudHlwZS5UYWJsZX1cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgb3BlbnR5cGUuVGFibGVcbiAqL1xuZnVuY3Rpb24gRmVhdHVyZUxpc3QoZmVhdHVyZUxpc3RUYWJsZSkge1xuICAgIFRhYmxlLmNhbGwodGhpcywgJ2ZlYXR1cmVMaXN0VGFibGUnLFxuICAgICAgICByZWNvcmRMaXN0KCdmZWF0dXJlUmVjb3JkJywgZmVhdHVyZUxpc3RUYWJsZSwgZnVuY3Rpb24oZmVhdHVyZVJlY29yZCwgaSkge1xuICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlUmVjb3JkLmZlYXR1cmU7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtuYW1lOiAnZmVhdHVyZVRhZycgKyBpLCB0eXBlOiAnVEFHJywgdmFsdWU6IGZlYXR1cmVSZWNvcmQudGFnfSxcbiAgICAgICAgICAgICAgICB7bmFtZTogJ2ZlYXR1cmUnICsgaSwgdHlwZTogJ1RBQkxFJywgdmFsdWU6IG5ldyBUYWJsZSgnZmVhdHVyZVRhYmxlJywgW1xuICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ2ZlYXR1cmVQYXJhbXMnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IGZlYXR1cmUuZmVhdHVyZVBhcmFtc30gXS5jb25jYXQodXNob3J0TGlzdCgnbG9va3VwTGlzdEluZGV4JywgZmVhdHVyZS5sb29rdXBMaXN0SW5kZXhlcykpKX1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH0pXG4gICAgKTtcbn1cbkZlYXR1cmVMaXN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVGFibGUucHJvdG90eXBlKTtcbkZlYXR1cmVMaXN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZlYXR1cmVMaXN0O1xuXG4vKipcbiAqIEBleHBvcnRzIG9wZW50eXBlLkxvb2t1cExpc3RcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtvcGVudHlwZS5UYWJsZX1cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBvcGVudHlwZS5UYWJsZVxuICovXG5mdW5jdGlvbiBMb29rdXBMaXN0KGxvb2t1cExpc3RUYWJsZSwgc3VidGFibGVNYWtlcnMpIHtcbiAgICBUYWJsZS5jYWxsKHRoaXMsICdsb29rdXBMaXN0VGFibGUnLCB0YWJsZUxpc3QoJ2xvb2t1cCcsIGxvb2t1cExpc3RUYWJsZSwgZnVuY3Rpb24obG9va3VwVGFibGUpIHtcbiAgICAgICAgdmFyIHN1YnRhYmxlQ2FsbGJhY2sgPSBzdWJ0YWJsZU1ha2Vyc1tsb29rdXBUYWJsZS5sb29rdXBUeXBlXTtcbiAgICAgICAgY2hlY2suYXNzZXJ0KCEhc3VidGFibGVDYWxsYmFjaywgJ1VuYWJsZSB0byB3cml0ZSBHU1VCIGxvb2t1cCB0eXBlICcgKyBsb29rdXBUYWJsZS5sb29rdXBUeXBlICsgJyB0YWJsZXMuJyk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGUoJ2xvb2t1cFRhYmxlJywgW1xuICAgICAgICAgICAge25hbWU6ICdsb29rdXBUeXBlJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiBsb29rdXBUYWJsZS5sb29rdXBUeXBlfSxcbiAgICAgICAgICAgIHtuYW1lOiAnbG9va3VwRmxhZycsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogbG9va3VwVGFibGUubG9va3VwRmxhZ31cbiAgICAgICAgXS5jb25jYXQodGFibGVMaXN0KCdzdWJ0YWJsZScsIGxvb2t1cFRhYmxlLnN1YnRhYmxlcywgc3VidGFibGVDYWxsYmFjaykpKTtcbiAgICB9KSk7XG59XG5Mb29rdXBMaXN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVGFibGUucHJvdG90eXBlKTtcbkxvb2t1cExpc3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9va3VwTGlzdDtcblxuLy8gUmVjb3JkID0gc2FtZSBhcyBUYWJsZSwgYnV0IGlubGluZWQgKGEgVGFibGUgaGFzIGFuIG9mZnNldCBhbmQgaXRzIGRhdGEgaXMgZnVydGhlciBpbiB0aGUgc3RyZWFtKVxuLy8gRG9uJ3QgdXNlIG9mZnNldHMgaW5zaWRlIFJlY29yZHMgKHByb2JhYmxlIGJ1ZyksIG9ubHkgaW4gVGFibGVzLlxudmFyIHRhYmxlID0ge1xuICAgIFRhYmxlOiBUYWJsZSxcbiAgICBSZWNvcmQ6IFRhYmxlLFxuICAgIENvdmVyYWdlOiBDb3ZlcmFnZSxcbiAgICBTY3JpcHRMaXN0OiBTY3JpcHRMaXN0LFxuICAgIEZlYXR1cmVMaXN0OiBGZWF0dXJlTGlzdCxcbiAgICBMb29rdXBMaXN0OiBMb29rdXBMaXN0LFxuICAgIHVzaG9ydExpc3Q6IHVzaG9ydExpc3QsXG4gICAgdGFibGVMaXN0OiB0YWJsZUxpc3QsXG4gICAgcmVjb3JkTGlzdDogcmVjb3JkTGlzdCxcbn07XG5cbi8vIFBhcnNpbmcgdXRpbGl0eSBmdW5jdGlvbnNcblxuLy8gUmV0cmlldmUgYW4gdW5zaWduZWQgYnl0ZSBmcm9tIHRoZSBEYXRhVmlldy5cbmZ1bmN0aW9uIGdldEJ5dGUoZGF0YVZpZXcsIG9mZnNldCkge1xuICAgIHJldHVybiBkYXRhVmlldy5nZXRVaW50OChvZmZzZXQpO1xufVxuXG4vLyBSZXRyaWV2ZSBhbiB1bnNpZ25lZCAxNi1iaXQgc2hvcnQgZnJvbSB0aGUgRGF0YVZpZXcuXG4vLyBUaGUgdmFsdWUgaXMgc3RvcmVkIGluIGJpZyBlbmRpYW4uXG5mdW5jdGlvbiBnZXRVU2hvcnQoZGF0YVZpZXcsIG9mZnNldCkge1xuICAgIHJldHVybiBkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0LCBmYWxzZSk7XG59XG5cbi8vIFJldHJpZXZlIGEgc2lnbmVkIDE2LWJpdCBzaG9ydCBmcm9tIHRoZSBEYXRhVmlldy5cbi8vIFRoZSB2YWx1ZSBpcyBzdG9yZWQgaW4gYmlnIGVuZGlhbi5cbmZ1bmN0aW9uIGdldFNob3J0KGRhdGFWaWV3LCBvZmZzZXQpIHtcbiAgICByZXR1cm4gZGF0YVZpZXcuZ2V0SW50MTYob2Zmc2V0LCBmYWxzZSk7XG59XG5cbi8vIFJldHJpZXZlIGFuIHVuc2lnbmVkIDMyLWJpdCBsb25nIGZyb20gdGhlIERhdGFWaWV3LlxuLy8gVGhlIHZhbHVlIGlzIHN0b3JlZCBpbiBiaWcgZW5kaWFuLlxuZnVuY3Rpb24gZ2V0VUxvbmcoZGF0YVZpZXcsIG9mZnNldCkge1xuICAgIHJldHVybiBkYXRhVmlldy5nZXRVaW50MzIob2Zmc2V0LCBmYWxzZSk7XG59XG5cbi8vIFJldHJpZXZlIGEgMzItYml0IHNpZ25lZCBmaXhlZC1wb2ludCBudW1iZXIgKDE2LjE2KSBmcm9tIHRoZSBEYXRhVmlldy5cbi8vIFRoZSB2YWx1ZSBpcyBzdG9yZWQgaW4gYmlnIGVuZGlhbi5cbmZ1bmN0aW9uIGdldEZpeGVkKGRhdGFWaWV3LCBvZmZzZXQpIHtcbiAgICB2YXIgZGVjaW1hbCA9IGRhdGFWaWV3LmdldEludDE2KG9mZnNldCwgZmFsc2UpO1xuICAgIHZhciBmcmFjdGlvbiA9IGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQgKyAyLCBmYWxzZSk7XG4gICAgcmV0dXJuIGRlY2ltYWwgKyBmcmFjdGlvbiAvIDY1NTM1O1xufVxuXG4vLyBSZXRyaWV2ZSBhIDQtY2hhcmFjdGVyIHRhZyBmcm9tIHRoZSBEYXRhVmlldy5cbi8vIFRhZ3MgYXJlIHVzZWQgdG8gaWRlbnRpZnkgdGFibGVzLlxuZnVuY3Rpb24gZ2V0VGFnKGRhdGFWaWV3LCBvZmZzZXQpIHtcbiAgICB2YXIgdGFnID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIDQ7IGkgKz0gMSkge1xuICAgICAgICB0YWcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhVmlldy5nZXRJbnQ4KGkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFnO1xufVxuXG4vLyBSZXRyaWV2ZSBhbiBvZmZzZXQgZnJvbSB0aGUgRGF0YVZpZXcuXG4vLyBPZmZzZXRzIGFyZSAxIHRvIDQgYnl0ZXMgaW4gbGVuZ3RoLCBkZXBlbmRpbmcgb24gdGhlIG9mZlNpemUgYXJndW1lbnQuXG5mdW5jdGlvbiBnZXRPZmZzZXQoZGF0YVZpZXcsIG9mZnNldCwgb2ZmU2l6ZSkge1xuICAgIHZhciB2ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9mZlNpemU7IGkgKz0gMSkge1xuICAgICAgICB2IDw8PSA4O1xuICAgICAgICB2ICs9IGRhdGFWaWV3LmdldFVpbnQ4KG9mZnNldCArIGkpO1xuICAgIH1cblxuICAgIHJldHVybiB2O1xufVxuXG4vLyBSZXRyaWV2ZSBhIG51bWJlciBvZiBieXRlcyBmcm9tIHN0YXJ0IG9mZnNldCB0byB0aGUgZW5kIG9mZnNldCBmcm9tIHRoZSBEYXRhVmlldy5cbmZ1bmN0aW9uIGdldEJ5dGVzKGRhdGFWaWV3LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KSB7XG4gICAgdmFyIGJ5dGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0T2Zmc2V0OyBpIDwgZW5kT2Zmc2V0OyBpICs9IDEpIHtcbiAgICAgICAgYnl0ZXMucHVzaChkYXRhVmlldy5nZXRVaW50OChpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vLyBDb252ZXJ0IHRoZSBsaXN0IG9mIGJ5dGVzIHRvIGEgc3RyaW5nLlxuZnVuY3Rpb24gYnl0ZXNUb1N0cmluZyhieXRlcykge1xuICAgIHZhciBzID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBzO1xufVxuXG52YXIgdHlwZU9mZnNldHMgPSB7XG4gICAgYnl0ZTogMSxcbiAgICB1U2hvcnQ6IDIsXG4gICAgc2hvcnQ6IDIsXG4gICAgdUxvbmc6IDQsXG4gICAgZml4ZWQ6IDQsXG4gICAgbG9uZ0RhdGVUaW1lOiA4LFxuICAgIHRhZzogNFxufTtcblxuLy8gQSBzdGF0ZWZ1bCBwYXJzZXIgdGhhdCBjaGFuZ2VzIHRoZSBvZmZzZXQgd2hlbmV2ZXIgYSB2YWx1ZSBpcyByZXRyaWV2ZWQuXG4vLyBUaGUgZGF0YSBpcyBhIERhdGFWaWV3LlxuZnVuY3Rpb24gUGFyc2VyKGRhdGEsIG9mZnNldCkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgdGhpcy5yZWxhdGl2ZU9mZnNldCA9IDA7XG59XG5cblBhcnNlci5wcm90b3R5cGUucGFyc2VCeXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB0aGlzLmRhdGEuZ2V0VWludDgodGhpcy5vZmZzZXQgKyB0aGlzLnJlbGF0aXZlT2Zmc2V0KTtcbiAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0ICs9IDE7XG4gICAgcmV0dXJuIHY7XG59O1xuXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlQ2hhciA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdGhpcy5kYXRhLmdldEludDgodGhpcy5vZmZzZXQgKyB0aGlzLnJlbGF0aXZlT2Zmc2V0KTtcbiAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0ICs9IDE7XG4gICAgcmV0dXJuIHY7XG59O1xuXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlQ2FyZDggPSBQYXJzZXIucHJvdG90eXBlLnBhcnNlQnl0ZTtcblxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVVTaG9ydCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdGhpcy5kYXRhLmdldFVpbnQxNih0aGlzLm9mZnNldCArIHRoaXMucmVsYXRpdmVPZmZzZXQpO1xuICAgIHRoaXMucmVsYXRpdmVPZmZzZXQgKz0gMjtcbiAgICByZXR1cm4gdjtcbn07XG5cblBhcnNlci5wcm90b3R5cGUucGFyc2VDYXJkMTYgPSBQYXJzZXIucHJvdG90eXBlLnBhcnNlVVNob3J0O1xuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNJRCA9IFBhcnNlci5wcm90b3R5cGUucGFyc2VVU2hvcnQ7XG5QYXJzZXIucHJvdG90eXBlLnBhcnNlT2Zmc2V0MTYgPSBQYXJzZXIucHJvdG90eXBlLnBhcnNlVVNob3J0O1xuXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlU2hvcnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHRoaXMuZGF0YS5nZXRJbnQxNih0aGlzLm9mZnNldCArIHRoaXMucmVsYXRpdmVPZmZzZXQpO1xuICAgIHRoaXMucmVsYXRpdmVPZmZzZXQgKz0gMjtcbiAgICByZXR1cm4gdjtcbn07XG5cblBhcnNlci5wcm90b3R5cGUucGFyc2VGMkRvdDE0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB0aGlzLmRhdGEuZ2V0SW50MTYodGhpcy5vZmZzZXQgKyB0aGlzLnJlbGF0aXZlT2Zmc2V0KSAvIDE2Mzg0O1xuICAgIHRoaXMucmVsYXRpdmVPZmZzZXQgKz0gMjtcbiAgICByZXR1cm4gdjtcbn07XG5cblBhcnNlci5wcm90b3R5cGUucGFyc2VVTG9uZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gZ2V0VUxvbmcodGhpcy5kYXRhLCB0aGlzLm9mZnNldCArIHRoaXMucmVsYXRpdmVPZmZzZXQpO1xuICAgIHRoaXMucmVsYXRpdmVPZmZzZXQgKz0gNDtcbiAgICByZXR1cm4gdjtcbn07XG5cblBhcnNlci5wcm90b3R5cGUucGFyc2VGaXhlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gZ2V0Rml4ZWQodGhpcy5kYXRhLCB0aGlzLm9mZnNldCArIHRoaXMucmVsYXRpdmVPZmZzZXQpO1xuICAgIHRoaXMucmVsYXRpdmVPZmZzZXQgKz0gNDtcbiAgICByZXR1cm4gdjtcbn07XG5cblBhcnNlci5wcm90b3R5cGUucGFyc2VTdHJpbmcgPSBmdW5jdGlvbihsZW5ndGgpIHtcbiAgICB2YXIgZGF0YVZpZXcgPSB0aGlzLmRhdGE7XG4gICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0ICsgdGhpcy5yZWxhdGl2ZU9mZnNldDtcbiAgICB2YXIgc3RyaW5nID0gJyc7XG4gICAgdGhpcy5yZWxhdGl2ZU9mZnNldCArPSBsZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhVmlldy5nZXRVaW50OChvZmZzZXQgKyBpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZztcbn07XG5cblBhcnNlci5wcm90b3R5cGUucGFyc2VUYWcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVN0cmluZyg0KTtcbn07XG5cbi8vIExPTkdEQVRFVElNRSBpcyBhIDY0LWJpdCBpbnRlZ2VyLlxuLy8gSmF2YVNjcmlwdCBhbmQgdW5peCB0aW1lc3RhbXBzIHRyYWRpdGlvbmFsbHkgdXNlIDMyIGJpdHMsIHNvIHdlXG4vLyBvbmx5IHRha2UgdGhlIGxhc3QgMzIgYml0cy5cbi8vICsgU2luY2UgdW50aWwgMjAzOCB0aG9zZSBiaXRzIHdpbGwgYmUgZmlsbGVkIGJ5IHplcm9zIHdlIGNhbiBpZ25vcmUgdGhlbS5cblBhcnNlci5wcm90b3R5cGUucGFyc2VMb25nRGF0ZVRpbWUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IGdldFVMb25nKHRoaXMuZGF0YSwgdGhpcy5vZmZzZXQgKyB0aGlzLnJlbGF0aXZlT2Zmc2V0ICsgNCk7XG4gICAgLy8gU3VidHJhY3Qgc2Vjb25kcyBiZXR3ZWVuIDAxLzAxLzE5MDQgYW5kIDAxLzAxLzE5NzBcbiAgICAvLyB0byBjb252ZXJ0IEFwcGxlIE1hYyB0aW1lc3RhbXAgdG8gU3RhbmRhcmQgVW5peCB0aW1lc3RhbXBcbiAgICB2IC09IDIwODI4NDQ4MDA7XG4gICAgdGhpcy5yZWxhdGl2ZU9mZnNldCArPSA4O1xuICAgIHJldHVybiB2O1xufTtcblxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVZlcnNpb24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbWFqb3IgPSBnZXRVU2hvcnQodGhpcy5kYXRhLCB0aGlzLm9mZnNldCArIHRoaXMucmVsYXRpdmVPZmZzZXQpO1xuXG4gICAgLy8gSG93IHRvIGludGVycHJldCB0aGUgbWlub3IgdmVyc2lvbiBpcyB2ZXJ5IHZhZ3VlIGluIHRoZSBzcGVjLiAweDUwMDAgaXMgNSwgMHgxMDAwIGlzIDFcbiAgICAvLyBUaGlzIHJldHVybnMgdGhlIGNvcnJlY3QgbnVtYmVyIGlmIG1pbm9yID0gMHhOMDAwIHdoZXJlIE4gaXMgMC05XG4gICAgdmFyIG1pbm9yID0gZ2V0VVNob3J0KHRoaXMuZGF0YSwgdGhpcy5vZmZzZXQgKyB0aGlzLnJlbGF0aXZlT2Zmc2V0ICsgMik7XG4gICAgdGhpcy5yZWxhdGl2ZU9mZnNldCArPSA0O1xuICAgIHJldHVybiBtYWpvciArIG1pbm9yIC8gMHgxMDAwIC8gMTA7XG59O1xuXG5QYXJzZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlLCBhbW91bnQpIHtcbiAgICBpZiAoYW1vdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYW1vdW50ID0gMTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0ICs9IHR5cGVPZmZzZXRzW3R5cGVdICogYW1vdW50O1xufTtcblxuLy8vLy8gUGFyc2luZyBsaXN0cyBhbmQgcmVjb3JkcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vIFBhcnNlIGEgbGlzdCBvZiAxNiBiaXQgdW5zaWduZWQgaW50ZWdlcnMuIFRoZSBsZW5ndGggb2YgdGhlIGxpc3QgY2FuIGJlIHJlYWQgb24gdGhlIHN0cmVhbVxuLy8gb3IgcHJvdmlkZWQgYXMgYW4gYXJndW1lbnQuXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlT2Zmc2V0MTZMaXN0ID1cblBhcnNlci5wcm90b3R5cGUucGFyc2VVU2hvcnRMaXN0ID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkgeyBjb3VudCA9IHRoaXMucGFyc2VVU2hvcnQoKTsgfVxuICAgIHZhciBvZmZzZXRzID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICB2YXIgZGF0YVZpZXcgPSB0aGlzLmRhdGE7XG4gICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0ICsgdGhpcy5yZWxhdGl2ZU9mZnNldDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgb2Zmc2V0c1tpXSA9IGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0ICs9IGNvdW50ICogMjtcbiAgICByZXR1cm4gb2Zmc2V0cztcbn07XG5cbi8vIFBhcnNlcyBhIGxpc3Qgb2YgMTYgYml0IHNpZ25lZCBpbnRlZ2Vycy5cblBhcnNlci5wcm90b3R5cGUucGFyc2VTaG9ydExpc3QgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIHZhciBsaXN0ID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICB2YXIgZGF0YVZpZXcgPSB0aGlzLmRhdGE7XG4gICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0ICsgdGhpcy5yZWxhdGl2ZU9mZnNldDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgbGlzdFtpXSA9IGRhdGFWaWV3LmdldEludDE2KG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSAyO1xuICAgIH1cblxuICAgIHRoaXMucmVsYXRpdmVPZmZzZXQgKz0gY291bnQgKiAyO1xuICAgIHJldHVybiBsaXN0O1xufTtcblxuLy8gUGFyc2VzIGEgbGlzdCBvZiBieXRlcy5cblBhcnNlci5wcm90b3R5cGUucGFyc2VCeXRlTGlzdCA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgdmFyIGxpc3QgPSBuZXcgQXJyYXkoY291bnQpO1xuICAgIHZhciBkYXRhVmlldyA9IHRoaXMuZGF0YTtcbiAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXQgKyB0aGlzLnJlbGF0aXZlT2Zmc2V0O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICBsaXN0W2ldID0gZGF0YVZpZXcuZ2V0VWludDgob2Zmc2V0KyspO1xuICAgIH1cblxuICAgIHRoaXMucmVsYXRpdmVPZmZzZXQgKz0gY291bnQ7XG4gICAgcmV0dXJuIGxpc3Q7XG59O1xuXG4vKipcbiAqIFBhcnNlIGEgbGlzdCBvZiBpdGVtcy5cbiAqIFJlY29yZCBjb3VudCBpcyBvcHRpb25hbCwgaWYgb21pdHRlZCBpdCBpcyByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAqIGl0ZW1DYWxsYmFjayBpcyBvbmUgb2YgdGhlIFBhcnNlciBtZXRob2RzLlxuICovXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlTGlzdCA9IGZ1bmN0aW9uKGNvdW50LCBpdGVtQ2FsbGJhY2spIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGlmICghaXRlbUNhbGxiYWNrKSB7XG4gICAgICAgIGl0ZW1DYWxsYmFjayA9IGNvdW50O1xuICAgICAgICBjb3VudCA9IHRoaXMucGFyc2VVU2hvcnQoKTtcbiAgICB9XG4gICAgdmFyIGxpc3QgPSBuZXcgQXJyYXkoY291bnQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICBsaXN0W2ldID0gaXRlbUNhbGxiYWNrLmNhbGwodGhpcyQxKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG59O1xuXG4vKipcbiAqIFBhcnNlIGEgbGlzdCBvZiByZWNvcmRzLlxuICogUmVjb3JkIGNvdW50IGlzIG9wdGlvbmFsLCBpZiBvbWl0dGVkIGl0IGlzIHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICogRXhhbXBsZSBvZiByZWNvcmREZXNjcmlwdGlvbjogeyBzZXF1ZW5jZUluZGV4OiBQYXJzZXIudVNob3J0LCBsb29rdXBMaXN0SW5kZXg6IFBhcnNlci51U2hvcnQgfVxuICovXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlUmVjb3JkTGlzdCA9IGZ1bmN0aW9uKGNvdW50LCByZWNvcmREZXNjcmlwdGlvbikge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgLy8gSWYgdGhlIGNvdW50IGFyZ3VtZW50IGlzIGFic2VudCwgcmVhZCBpdCBpbiB0aGUgc3RyZWFtLlxuICAgIGlmICghcmVjb3JkRGVzY3JpcHRpb24pIHtcbiAgICAgICAgcmVjb3JkRGVzY3JpcHRpb24gPSBjb3VudDtcbiAgICAgICAgY291bnQgPSB0aGlzLnBhcnNlVVNob3J0KCk7XG4gICAgfVxuICAgIHZhciByZWNvcmRzID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICB2YXIgZmllbGRzID0gT2JqZWN0LmtleXMocmVjb3JkRGVzY3JpcHRpb24pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICB2YXIgcmVjID0ge307XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmllbGRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgZmllbGROYW1lID0gZmllbGRzW2pdO1xuICAgICAgICAgICAgdmFyIGZpZWxkVHlwZSA9IHJlY29yZERlc2NyaXB0aW9uW2ZpZWxkTmFtZV07XG4gICAgICAgICAgICByZWNbZmllbGROYW1lXSA9IGZpZWxkVHlwZS5jYWxsKHRoaXMkMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3Jkc1tpXSA9IHJlYztcbiAgICB9XG4gICAgcmV0dXJuIHJlY29yZHM7XG59O1xuXG4vLyBQYXJzZSBhIGRhdGEgc3RydWN0dXJlIGludG8gYW4gb2JqZWN0XG4vLyBFeGFtcGxlIG9mIGRlc2NyaXB0aW9uOiB7IHNlcXVlbmNlSW5kZXg6IFBhcnNlci51U2hvcnQsIGxvb2t1cExpc3RJbmRleDogUGFyc2VyLnVTaG9ydCB9XG5QYXJzZXIucHJvdG90eXBlLnBhcnNlU3RydWN0ID0gZnVuY3Rpb24oZGVzY3JpcHRpb24pIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGlmICh0eXBlb2YgZGVzY3JpcHRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uLmNhbGwodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGZpZWxkcyA9IE9iamVjdC5rZXlzKGRlc2NyaXB0aW9uKTtcbiAgICAgICAgdmFyIHN0cnVjdCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZpZWxkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9IGZpZWxkc1tqXTtcbiAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBkZXNjcmlwdGlvbltmaWVsZE5hbWVdO1xuICAgICAgICAgICAgc3RydWN0W2ZpZWxkTmFtZV0gPSBmaWVsZFR5cGUuY2FsbCh0aGlzJDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJ1Y3Q7XG4gICAgfVxufTtcblxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVBvaW50ZXIgPSBmdW5jdGlvbihkZXNjcmlwdGlvbikge1xuICAgIHZhciBzdHJ1Y3RPZmZzZXQgPSB0aGlzLnBhcnNlT2Zmc2V0MTYoKTtcbiAgICBpZiAoc3RydWN0T2Zmc2V0ID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOVUxMIG9mZnNldCA9PiByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIHJldHVybiBuZXcgUGFyc2VyKHRoaXMuZGF0YSwgdGhpcy5vZmZzZXQgKyBzdHJ1Y3RPZmZzZXQpLnBhcnNlU3RydWN0KGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogUGFyc2UgYSBsaXN0IG9mIG9mZnNldHMgdG8gbGlzdHMgb2YgMTYtYml0IGludGVnZXJzLFxuICogb3IgYSBsaXN0IG9mIG9mZnNldHMgdG8gbGlzdHMgb2Ygb2Zmc2V0cyB0byBhbnkga2luZCBvZiBpdGVtcy5cbiAqIElmIGl0ZW1DYWxsYmFjayBpcyBub3QgcHJvdmlkZWQsIGEgbGlzdCBvZiBsaXN0IG9mIFVTaG9ydCBpcyBhc3N1bWVkLlxuICogSWYgcHJvdmlkZWQsIGl0ZW1DYWxsYmFjayBpcyBjYWxsZWQgb24gZWFjaCBpdGVtIGFuZCBtdXN0IHBhcnNlIHRoZSBpdGVtLlxuICogU2VlIGV4YW1wbGVzIGluIHRhYmxlcy9nc3ViLmpzXG4gKi9cblBhcnNlci5wcm90b3R5cGUucGFyc2VMaXN0T2ZMaXN0cyA9IGZ1bmN0aW9uKGl0ZW1DYWxsYmFjaykge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIG9mZnNldHMgPSB0aGlzLnBhcnNlT2Zmc2V0MTZMaXN0KCk7XG4gICAgdmFyIGNvdW50ID0gb2Zmc2V0cy5sZW5ndGg7XG4gICAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gdGhpcy5yZWxhdGl2ZU9mZnNldDtcbiAgICB2YXIgbGlzdCA9IG5ldyBBcnJheShjb3VudCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIHZhciBzdGFydCA9IG9mZnNldHNbaV07XG4gICAgICAgIGlmIChzdGFydCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgIC8vIE5VTEwgb2Zmc2V0XG4gICAgICAgICAgICBsaXN0W2ldID0gdW5kZWZpbmVkOyAgICAgICAgICAgIC8vIEFkZCBpIGFzIG93bmVkIHByb3BlcnR5IHRvIGxpc3QuIENvbnZlbmllbnQgd2l0aCBhc3NlcnQuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzJDEucmVsYXRpdmVPZmZzZXQgPSBzdGFydDtcbiAgICAgICAgaWYgKGl0ZW1DYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIHN1Yk9mZnNldHMgPSB0aGlzJDEucGFyc2VPZmZzZXQxNkxpc3QoKTtcbiAgICAgICAgICAgIHZhciBzdWJMaXN0ID0gbmV3IEFycmF5KHN1Yk9mZnNldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ViT2Zmc2V0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMkMS5yZWxhdGl2ZU9mZnNldCA9IHN0YXJ0ICsgc3ViT2Zmc2V0c1tqXTtcbiAgICAgICAgICAgICAgICBzdWJMaXN0W2pdID0gaXRlbUNhbGxiYWNrLmNhbGwodGhpcyQxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpc3RbaV0gPSBzdWJMaXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGlzdFtpXSA9IHRoaXMkMS5wYXJzZVVTaG9ydExpc3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0ID0gcmVsYXRpdmVPZmZzZXQ7XG4gICAgcmV0dXJuIGxpc3Q7XG59O1xuXG4vLy8vLyBDb21wbGV4IHRhYmxlcyBwYXJzaW5nIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8gUGFyc2UgYSBjb3ZlcmFnZSB0YWJsZSBpbiBhIEdTVUIsIEdQT1Mgb3IgR0RFRiB0YWJsZS5cbi8vIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PVFNQRUMvY2hhcHRlcjIuaHRtXG4vLyBwYXJzZXIub2Zmc2V0IG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSBjb3ZlcmFnZS5cblBhcnNlci5wcm90b3R5cGUucGFyc2VDb3ZlcmFnZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIHN0YXJ0T2Zmc2V0ID0gdGhpcy5vZmZzZXQgKyB0aGlzLnJlbGF0aXZlT2Zmc2V0O1xuICAgIHZhciBmb3JtYXQgPSB0aGlzLnBhcnNlVVNob3J0KCk7XG4gICAgdmFyIGNvdW50ID0gdGhpcy5wYXJzZVVTaG9ydCgpO1xuICAgIGlmIChmb3JtYXQgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogMSxcbiAgICAgICAgICAgIGdseXBoczogdGhpcy5wYXJzZVVTaG9ydExpc3QoY291bnQpXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDIpIHtcbiAgICAgICAgdmFyIHJhbmdlcyA9IG5ldyBBcnJheShjb3VudCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgcmFuZ2VzW2ldID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzJDEucGFyc2VVU2hvcnQoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IHRoaXMkMS5wYXJzZVVTaG9ydCgpLFxuICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzJDEucGFyc2VVU2hvcnQoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiAyLFxuICAgICAgICAgICAgcmFuZ2VzOiByYW5nZXNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCcweCcgKyBzdGFydE9mZnNldC50b1N0cmluZygxNikgKyAnOiBDb3ZlcmFnZSBmb3JtYXQgbXVzdCBiZSAxIG9yIDIuJyk7XG59O1xuXG4vLyBQYXJzZSBhIENsYXNzIERlZmluaXRpb24gVGFibGUgaW4gYSBHU1VCLCBHUE9TIG9yIEdERUYgdGFibGUuXG4vLyBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT1RTUEVDL2NoYXB0ZXIyLmh0bVxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNsYXNzRGVmID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YXJ0T2Zmc2V0ID0gdGhpcy5vZmZzZXQgKyB0aGlzLnJlbGF0aXZlT2Zmc2V0O1xuICAgIHZhciBmb3JtYXQgPSB0aGlzLnBhcnNlVVNob3J0KCk7XG4gICAgaWYgKGZvcm1hdCA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiAxLFxuICAgICAgICAgICAgc3RhcnRHbHlwaDogdGhpcy5wYXJzZVVTaG9ydCgpLFxuICAgICAgICAgICAgY2xhc3NlczogdGhpcy5wYXJzZVVTaG9ydExpc3QoKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IDIsXG4gICAgICAgICAgICByYW5nZXM6IHRoaXMucGFyc2VSZWNvcmRMaXN0KHtcbiAgICAgICAgICAgICAgICBzdGFydDogUGFyc2VyLnVTaG9ydCxcbiAgICAgICAgICAgICAgICBlbmQ6IFBhcnNlci51U2hvcnQsXG4gICAgICAgICAgICAgICAgY2xhc3NJZDogUGFyc2VyLnVTaG9ydFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCcweCcgKyBzdGFydE9mZnNldC50b1N0cmluZygxNikgKyAnOiBDbGFzc0RlZiBmb3JtYXQgbXVzdCBiZSAxIG9yIDIuJyk7XG59O1xuXG4vLy8vLyBTdGF0aWMgbWV0aG9kcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gVGhlc2UgY29udmVuaWVuY2UgbWV0aG9kcyBjYW4gYmUgdXNlZCBhcyBjYWxsYmFja3MgYW5kIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBcInRoaXNcIiBjb250ZXh0IHNldCB0byBhIFBhcnNlciBpbnN0YW5jZS5cblxuUGFyc2VyLmxpc3QgPSBmdW5jdGlvbihjb3VudCwgaXRlbUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpc3QoY291bnQsIGl0ZW1DYWxsYmFjayk7XG4gICAgfTtcbn07XG5cblBhcnNlci5yZWNvcmRMaXN0ID0gZnVuY3Rpb24oY291bnQsIHJlY29yZERlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlY29yZExpc3QoY291bnQsIHJlY29yZERlc2NyaXB0aW9uKTtcbiAgICB9O1xufTtcblxuUGFyc2VyLnBvaW50ZXIgPSBmdW5jdGlvbihkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VQb2ludGVyKGRlc2NyaXB0aW9uKTtcbiAgICB9O1xufTtcblxuUGFyc2VyLnRhZyA9IFBhcnNlci5wcm90b3R5cGUucGFyc2VUYWc7XG5QYXJzZXIuYnl0ZSA9IFBhcnNlci5wcm90b3R5cGUucGFyc2VCeXRlO1xuUGFyc2VyLnVTaG9ydCA9IFBhcnNlci5vZmZzZXQxNiA9IFBhcnNlci5wcm90b3R5cGUucGFyc2VVU2hvcnQ7XG5QYXJzZXIudVNob3J0TGlzdCA9IFBhcnNlci5wcm90b3R5cGUucGFyc2VVU2hvcnRMaXN0O1xuUGFyc2VyLnN0cnVjdCA9IFBhcnNlci5wcm90b3R5cGUucGFyc2VTdHJ1Y3Q7XG5QYXJzZXIuY292ZXJhZ2UgPSBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ292ZXJhZ2U7XG5QYXJzZXIuY2xhc3NEZWYgPSBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ2xhc3NEZWY7XG5cbi8vLy8vIFNjcmlwdCwgRmVhdHVyZSwgTG9va3VwIGxpc3RzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT1RTUEVDL2NoYXB0ZXIyLmh0bVxuXG52YXIgbGFuZ1N5c1RhYmxlID0ge1xuICAgIHJlc2VydmVkOiBQYXJzZXIudVNob3J0LFxuICAgIHJlcUZlYXR1cmVJbmRleDogUGFyc2VyLnVTaG9ydCxcbiAgICBmZWF0dXJlSW5kZXhlczogUGFyc2VyLnVTaG9ydExpc3Rcbn07XG5cblBhcnNlci5wcm90b3R5cGUucGFyc2VTY3JpcHRMaXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VQb2ludGVyKFBhcnNlci5yZWNvcmRMaXN0KHtcbiAgICAgICAgdGFnOiBQYXJzZXIudGFnLFxuICAgICAgICBzY3JpcHQ6IFBhcnNlci5wb2ludGVyKHtcbiAgICAgICAgICAgIGRlZmF1bHRMYW5nU3lzOiBQYXJzZXIucG9pbnRlcihsYW5nU3lzVGFibGUpLFxuICAgICAgICAgICAgbGFuZ1N5c1JlY29yZHM6IFBhcnNlci5yZWNvcmRMaXN0KHtcbiAgICAgICAgICAgICAgICB0YWc6IFBhcnNlci50YWcsXG4gICAgICAgICAgICAgICAgbGFuZ1N5czogUGFyc2VyLnBvaW50ZXIobGFuZ1N5c1RhYmxlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9KSk7XG59O1xuXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlRmVhdHVyZUxpc3QgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVBvaW50ZXIoUGFyc2VyLnJlY29yZExpc3Qoe1xuICAgICAgICB0YWc6IFBhcnNlci50YWcsXG4gICAgICAgIGZlYXR1cmU6IFBhcnNlci5wb2ludGVyKHtcbiAgICAgICAgICAgIGZlYXR1cmVQYXJhbXM6IFBhcnNlci5vZmZzZXQxNixcbiAgICAgICAgICAgIGxvb2t1cExpc3RJbmRleGVzOiBQYXJzZXIudVNob3J0TGlzdFxuICAgICAgICB9KVxuICAgIH0pKTtcbn07XG5cblBhcnNlci5wcm90b3R5cGUucGFyc2VMb29rdXBMaXN0ID0gZnVuY3Rpb24obG9va3VwVGFibGVQYXJzZXJzKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VQb2ludGVyKFBhcnNlci5saXN0KFBhcnNlci5wb2ludGVyKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbG9va3VwVHlwZSA9IHRoaXMucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgY2hlY2suYXJndW1lbnQoMSA8PSBsb29rdXBUeXBlICYmIGxvb2t1cFR5cGUgPD0gOCwgJ0dTVUIgbG9va3VwIHR5cGUgJyArIGxvb2t1cFR5cGUgKyAnIHVua25vd24uJyk7XG4gICAgICAgIHZhciBsb29rdXBGbGFnID0gdGhpcy5wYXJzZVVTaG9ydCgpO1xuICAgICAgICB2YXIgdXNlTWFya0ZpbHRlcmluZ1NldCA9IGxvb2t1cEZsYWcgJiAweDEwO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9va3VwVHlwZTogbG9va3VwVHlwZSxcbiAgICAgICAgICAgIGxvb2t1cEZsYWc6IGxvb2t1cEZsYWcsXG4gICAgICAgICAgICBzdWJ0YWJsZXM6IHRoaXMucGFyc2VMaXN0KFBhcnNlci5wb2ludGVyKGxvb2t1cFRhYmxlUGFyc2Vyc1tsb29rdXBUeXBlXSkpLFxuICAgICAgICAgICAgbWFya0ZpbHRlcmluZ1NldDogdXNlTWFya0ZpbHRlcmluZ1NldCA/IHRoaXMucGFyc2VVU2hvcnQoKSA6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgIH0pKSk7XG59O1xuXG52YXIgcGFyc2UgPSB7XG4gICAgZ2V0Qnl0ZTogZ2V0Qnl0ZSxcbiAgICBnZXRDYXJkODogZ2V0Qnl0ZSxcbiAgICBnZXRVU2hvcnQ6IGdldFVTaG9ydCxcbiAgICBnZXRDYXJkMTY6IGdldFVTaG9ydCxcbiAgICBnZXRTaG9ydDogZ2V0U2hvcnQsXG4gICAgZ2V0VUxvbmc6IGdldFVMb25nLFxuICAgIGdldEZpeGVkOiBnZXRGaXhlZCxcbiAgICBnZXRUYWc6IGdldFRhZyxcbiAgICBnZXRPZmZzZXQ6IGdldE9mZnNldCxcbiAgICBnZXRCeXRlczogZ2V0Qnl0ZXMsXG4gICAgYnl0ZXNUb1N0cmluZzogYnl0ZXNUb1N0cmluZyxcbiAgICBQYXJzZXI6IFBhcnNlcixcbn07XG5cbi8vIFRoZSBgY21hcGAgdGFibGUgc3RvcmVzIHRoZSBtYXBwaW5ncyBmcm9tIGNoYXJhY3RlcnMgdG8gZ2x5cGhzLlxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9jbWFwLmh0bVxuXG5mdW5jdGlvbiBwYXJzZUNtYXBUYWJsZUZvcm1hdDEyKGNtYXAsIHApIHtcbiAgICAvL1NraXAgcmVzZXJ2ZWQuXG4gICAgcC5wYXJzZVVTaG9ydCgpO1xuXG4gICAgLy8gTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBzdWItdGFibGVzLlxuICAgIGNtYXAubGVuZ3RoID0gcC5wYXJzZVVMb25nKCk7XG4gICAgY21hcC5sYW5ndWFnZSA9IHAucGFyc2VVTG9uZygpO1xuXG4gICAgdmFyIGdyb3VwQ291bnQ7XG4gICAgY21hcC5ncm91cENvdW50ID0gZ3JvdXBDb3VudCA9IHAucGFyc2VVTG9uZygpO1xuICAgIGNtYXAuZ2x5cGhJbmRleE1hcCA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cENvdW50OyBpICs9IDEpIHtcbiAgICAgICAgdmFyIHN0YXJ0Q2hhckNvZGUgPSBwLnBhcnNlVUxvbmcoKTtcbiAgICAgICAgdmFyIGVuZENoYXJDb2RlID0gcC5wYXJzZVVMb25nKCk7XG4gICAgICAgIHZhciBzdGFydEdseXBoSWQgPSBwLnBhcnNlVUxvbmcoKTtcblxuICAgICAgICBmb3IgKHZhciBjID0gc3RhcnRDaGFyQ29kZTsgYyA8PSBlbmRDaGFyQ29kZTsgYyArPSAxKSB7XG4gICAgICAgICAgICBjbWFwLmdseXBoSW5kZXhNYXBbY10gPSBzdGFydEdseXBoSWQ7XG4gICAgICAgICAgICBzdGFydEdseXBoSWQrKztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDbWFwVGFibGVGb3JtYXQ0KGNtYXAsIHAsIGRhdGEsIHN0YXJ0LCBvZmZzZXQpIHtcbiAgICAvLyBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHN1Yi10YWJsZXMuXG4gICAgY21hcC5sZW5ndGggPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgY21hcC5sYW5ndWFnZSA9IHAucGFyc2VVU2hvcnQoKTtcblxuICAgIC8vIHNlZ0NvdW50IGlzIHN0b3JlZCB4IDIuXG4gICAgdmFyIHNlZ0NvdW50O1xuICAgIGNtYXAuc2VnQ291bnQgPSBzZWdDb3VudCA9IHAucGFyc2VVU2hvcnQoKSA+PiAxO1xuXG4gICAgLy8gU2tpcCBzZWFyY2hSYW5nZSwgZW50cnlTZWxlY3RvciwgcmFuZ2VTaGlmdC5cbiAgICBwLnNraXAoJ3VTaG9ydCcsIDMpO1xuXG4gICAgLy8gVGhlIFwidW5yb2xsZWRcIiBtYXBwaW5nIGZyb20gY2hhcmFjdGVyIGNvZGVzIHRvIGdseXBoIGluZGljZXMuXG4gICAgY21hcC5nbHlwaEluZGV4TWFwID0ge307XG4gICAgdmFyIGVuZENvdW50UGFyc2VyID0gbmV3IHBhcnNlLlBhcnNlcihkYXRhLCBzdGFydCArIG9mZnNldCArIDE0KTtcbiAgICB2YXIgc3RhcnRDb3VudFBhcnNlciA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyAxNiArIHNlZ0NvdW50ICogMik7XG4gICAgdmFyIGlkRGVsdGFQYXJzZXIgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0ICsgb2Zmc2V0ICsgMTYgKyBzZWdDb3VudCAqIDQpO1xuICAgIHZhciBpZFJhbmdlT2Zmc2V0UGFyc2VyID0gbmV3IHBhcnNlLlBhcnNlcihkYXRhLCBzdGFydCArIG9mZnNldCArIDE2ICsgc2VnQ291bnQgKiA2KTtcbiAgICB2YXIgZ2x5cGhJbmRleE9mZnNldCA9IHN0YXJ0ICsgb2Zmc2V0ICsgMTYgKyBzZWdDb3VudCAqIDg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdDb3VudCAtIDE7IGkgKz0gMSkge1xuICAgICAgICB2YXIgZ2x5cGhJbmRleCA9ICh2b2lkIDApO1xuICAgICAgICB2YXIgZW5kQ291bnQgPSBlbmRDb3VudFBhcnNlci5wYXJzZVVTaG9ydCgpO1xuICAgICAgICB2YXIgc3RhcnRDb3VudCA9IHN0YXJ0Q291bnRQYXJzZXIucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgdmFyIGlkRGVsdGEgPSBpZERlbHRhUGFyc2VyLnBhcnNlU2hvcnQoKTtcbiAgICAgICAgdmFyIGlkUmFuZ2VPZmZzZXQgPSBpZFJhbmdlT2Zmc2V0UGFyc2VyLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIGZvciAodmFyIGMgPSBzdGFydENvdW50OyBjIDw9IGVuZENvdW50OyBjICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChpZFJhbmdlT2Zmc2V0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGlkUmFuZ2VPZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGlkUmFuZ2VPZmZzZXQgYXJyYXkuXG4gICAgICAgICAgICAgICAgLy8gVGFrZSB0aGUgY3VycmVudCBvZmZzZXQgaW4gdGhlIGlkUmFuZ2VPZmZzZXQgYXJyYXkuXG4gICAgICAgICAgICAgICAgZ2x5cGhJbmRleE9mZnNldCA9IChpZFJhbmdlT2Zmc2V0UGFyc2VyLm9mZnNldCArIGlkUmFuZ2VPZmZzZXRQYXJzZXIucmVsYXRpdmVPZmZzZXQgLSAyKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgdmFsdWUgb2YgdGhlIGlkUmFuZ2VPZmZzZXQsIHdoaWNoIHdpbGwgbW92ZSB1cyBpbnRvIHRoZSBnbHlwaEluZGV4IGFycmF5LlxuICAgICAgICAgICAgICAgIGdseXBoSW5kZXhPZmZzZXQgKz0gaWRSYW5nZU9mZnNldDtcblxuICAgICAgICAgICAgICAgIC8vIFRoZW4gYWRkIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGN1cnJlbnQgc2VnbWVudCwgbXVsdGlwbGllZCBieSAyIGZvciBVU0hPUlRzLlxuICAgICAgICAgICAgICAgIGdseXBoSW5kZXhPZmZzZXQgKz0gKGMgLSBzdGFydENvdW50KSAqIDI7XG4gICAgICAgICAgICAgICAgZ2x5cGhJbmRleCA9IHBhcnNlLmdldFVTaG9ydChkYXRhLCBnbHlwaEluZGV4T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoZ2x5cGhJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBnbHlwaEluZGV4ID0gKGdseXBoSW5kZXggKyBpZERlbHRhKSAmIDB4RkZGRjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdseXBoSW5kZXggPSAoYyArIGlkRGVsdGEpICYgMHhGRkZGO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbWFwLmdseXBoSW5kZXhNYXBbY10gPSBnbHlwaEluZGV4O1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBQYXJzZSB0aGUgYGNtYXBgIHRhYmxlLiBUaGlzIHRhYmxlIHN0b3JlcyB0aGUgbWFwcGluZ3MgZnJvbSBjaGFyYWN0ZXJzIHRvIGdseXBocy5cbi8vIFRoZXJlIGFyZSBtYW55IGF2YWlsYWJsZSBmb3JtYXRzLCBidXQgd2Ugb25seSBzdXBwb3J0IHRoZSBXaW5kb3dzIGZvcm1hdCA0IGFuZCAxMi5cbi8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGBDbWFwRW5jb2RpbmdgIG9iamVjdCBvciBudWxsIGlmIG5vIHN1cHBvcnRlZCBmb3JtYXQgY291bGQgYmUgZm91bmQuXG5mdW5jdGlvbiBwYXJzZUNtYXBUYWJsZShkYXRhLCBzdGFydCkge1xuICAgIHZhciBjbWFwID0ge307XG4gICAgY21hcC52ZXJzaW9uID0gcGFyc2UuZ2V0VVNob3J0KGRhdGEsIHN0YXJ0KTtcbiAgICBjaGVjay5hcmd1bWVudChjbWFwLnZlcnNpb24gPT09IDAsICdjbWFwIHRhYmxlIHZlcnNpb24gc2hvdWxkIGJlIDAuJyk7XG5cbiAgICAvLyBUaGUgY21hcCB0YWJsZSBjYW4gY29udGFpbiBtYW55IHN1Yi10YWJsZXMsIGVhY2ggd2l0aCB0aGVpciBvd24gZm9ybWF0LlxuICAgIC8vIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIFwicGxhdGZvcm0gM1wiIHRhYmxlLiBUaGlzIGlzIGEgV2luZG93cyBmb3JtYXQuXG4gICAgY21hcC5udW1UYWJsZXMgPSBwYXJzZS5nZXRVU2hvcnQoZGF0YSwgc3RhcnQgKyAyKTtcbiAgICB2YXIgb2Zmc2V0ID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IGNtYXAubnVtVGFibGVzIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgdmFyIHBsYXRmb3JtSWQgPSBwYXJzZS5nZXRVU2hvcnQoZGF0YSwgc3RhcnQgKyA0ICsgKGkgKiA4KSk7XG4gICAgICAgIHZhciBlbmNvZGluZ0lkID0gcGFyc2UuZ2V0VVNob3J0KGRhdGEsIHN0YXJ0ICsgNCArIChpICogOCkgKyAyKTtcbiAgICAgICAgaWYgKHBsYXRmb3JtSWQgPT09IDMgJiYgKGVuY29kaW5nSWQgPT09IDAgfHwgZW5jb2RpbmdJZCA9PT0gMSB8fCBlbmNvZGluZ0lkID09PSAxMCkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHBhcnNlLmdldFVMb25nKGRhdGEsIHN0YXJ0ICsgNCArIChpICogOCkgKyA0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9mZnNldCA9PT0gLTEpIHtcbiAgICAgICAgLy8gVGhlcmUgaXMgbm8gY21hcCB0YWJsZSBpbiB0aGUgZm9udCB0aGF0IHdlIHN1cHBvcnQuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdmFsaWQgY21hcCBzdWItdGFibGVzIGZvdW5kLicpO1xuICAgIH1cblxuICAgIHZhciBwID0gbmV3IHBhcnNlLlBhcnNlcihkYXRhLCBzdGFydCArIG9mZnNldCk7XG4gICAgY21hcC5mb3JtYXQgPSBwLnBhcnNlVVNob3J0KCk7XG5cbiAgICBpZiAoY21hcC5mb3JtYXQgPT09IDEyKSB7XG4gICAgICAgIHBhcnNlQ21hcFRhYmxlRm9ybWF0MTIoY21hcCwgcCk7XG4gICAgfSBlbHNlIGlmIChjbWFwLmZvcm1hdCA9PT0gNCkge1xuICAgICAgICBwYXJzZUNtYXBUYWJsZUZvcm1hdDQoY21hcCwgcCwgZGF0YSwgc3RhcnQsIG9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IGZvcm1hdCA0IGFuZCAxMiBjbWFwIHRhYmxlcyBhcmUgc3VwcG9ydGVkIChmb3VuZCBmb3JtYXQgJyArIGNtYXAuZm9ybWF0ICsgJykuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNtYXA7XG59XG5cbmZ1bmN0aW9uIGFkZFNlZ21lbnQodCwgY29kZSwgZ2x5cGhJbmRleCkge1xuICAgIHQuc2VnbWVudHMucHVzaCh7XG4gICAgICAgIGVuZDogY29kZSxcbiAgICAgICAgc3RhcnQ6IGNvZGUsXG4gICAgICAgIGRlbHRhOiAtKGNvZGUgLSBnbHlwaEluZGV4KSxcbiAgICAgICAgb2Zmc2V0OiAwXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFRlcm1pbmF0b3JTZWdtZW50KHQpIHtcbiAgICB0LnNlZ21lbnRzLnB1c2goe1xuICAgICAgICBlbmQ6IDB4RkZGRixcbiAgICAgICAgc3RhcnQ6IDB4RkZGRixcbiAgICAgICAgZGVsdGE6IDEsXG4gICAgICAgIG9mZnNldDogMFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBtYWtlQ21hcFRhYmxlKGdseXBocykge1xuICAgIHZhciB0ID0gbmV3IHRhYmxlLlRhYmxlKCdjbWFwJywgW1xuICAgICAgICB7bmFtZTogJ3ZlcnNpb24nLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ251bVRhYmxlcycsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMX0sXG4gICAgICAgIHtuYW1lOiAncGxhdGZvcm1JRCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogM30sXG4gICAgICAgIHtuYW1lOiAnZW5jb2RpbmdJRCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMX0sXG4gICAgICAgIHtuYW1lOiAnb2Zmc2V0JywgdHlwZTogJ1VMT05HJywgdmFsdWU6IDEyfSxcbiAgICAgICAge25hbWU6ICdmb3JtYXQnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDR9LFxuICAgICAgICB7bmFtZTogJ2xlbmd0aCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnbGFuZ3VhZ2UnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3NlZ0NvdW50WDInLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3NlYXJjaFJhbmdlJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdlbnRyeVNlbGVjdG9yJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdyYW5nZVNoaWZ0JywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiAwfVxuICAgIF0pO1xuXG4gICAgdC5zZWdtZW50cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBnbHlwaCA9IGdseXBocy5nZXQoaSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ2x5cGgudW5pY29kZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgIGFkZFNlZ21lbnQodCwgZ2x5cGgudW5pY29kZXNbal0sIGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdC5zZWdtZW50cyA9IHQuc2VnbWVudHMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5zdGFydCAtIGIuc3RhcnQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZFRlcm1pbmF0b3JTZWdtZW50KHQpO1xuXG4gICAgdmFyIHNlZ0NvdW50O1xuICAgIHNlZ0NvdW50ID0gdC5zZWdtZW50cy5sZW5ndGg7XG4gICAgdC5zZWdDb3VudFgyID0gc2VnQ291bnQgKiAyO1xuICAgIHQuc2VhcmNoUmFuZ2UgPSBNYXRoLnBvdygyLCBNYXRoLmZsb29yKE1hdGgubG9nKHNlZ0NvdW50KSAvIE1hdGgubG9nKDIpKSkgKiAyO1xuICAgIHQuZW50cnlTZWxlY3RvciA9IE1hdGgubG9nKHQuc2VhcmNoUmFuZ2UgLyAyKSAvIE1hdGgubG9nKDIpO1xuICAgIHQucmFuZ2VTaGlmdCA9IHQuc2VnQ291bnRYMiAtIHQuc2VhcmNoUmFuZ2U7XG5cbiAgICAvLyBTZXQgdXAgcGFyYWxsZWwgc2VnbWVudCBhcnJheXMuXG4gICAgdmFyIGVuZENvdW50cyA9IFtdO1xuICAgIHZhciBzdGFydENvdW50cyA9IFtdO1xuICAgIHZhciBpZERlbHRhcyA9IFtdO1xuICAgIHZhciBpZFJhbmdlT2Zmc2V0cyA9IFtdO1xuICAgIHZhciBnbHlwaElkcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgc2VnQ291bnQ7IGkkMSArPSAxKSB7XG4gICAgICAgIHZhciBzZWdtZW50ID0gdC5zZWdtZW50c1tpJDFdO1xuICAgICAgICBlbmRDb3VudHMgPSBlbmRDb3VudHMuY29uY2F0KHtuYW1lOiAnZW5kXycgKyBpJDEsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogc2VnbWVudC5lbmR9KTtcbiAgICAgICAgc3RhcnRDb3VudHMgPSBzdGFydENvdW50cy5jb25jYXQoe25hbWU6ICdzdGFydF8nICsgaSQxLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IHNlZ21lbnQuc3RhcnR9KTtcbiAgICAgICAgaWREZWx0YXMgPSBpZERlbHRhcy5jb25jYXQoe25hbWU6ICdpZERlbHRhXycgKyBpJDEsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiBzZWdtZW50LmRlbHRhfSk7XG4gICAgICAgIGlkUmFuZ2VPZmZzZXRzID0gaWRSYW5nZU9mZnNldHMuY29uY2F0KHtuYW1lOiAnaWRSYW5nZU9mZnNldF8nICsgaSQxLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IHNlZ21lbnQub2Zmc2V0fSk7XG4gICAgICAgIGlmIChzZWdtZW50LmdseXBoSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZ2x5cGhJZHMgPSBnbHlwaElkcy5jb25jYXQoe25hbWU6ICdnbHlwaF8nICsgaSQxLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IHNlZ21lbnQuZ2x5cGhJZH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdC5maWVsZHMgPSB0LmZpZWxkcy5jb25jYXQoZW5kQ291bnRzKTtcbiAgICB0LmZpZWxkcy5wdXNoKHtuYW1lOiAncmVzZXJ2ZWRQYWQnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9KTtcbiAgICB0LmZpZWxkcyA9IHQuZmllbGRzLmNvbmNhdChzdGFydENvdW50cyk7XG4gICAgdC5maWVsZHMgPSB0LmZpZWxkcy5jb25jYXQoaWREZWx0YXMpO1xuICAgIHQuZmllbGRzID0gdC5maWVsZHMuY29uY2F0KGlkUmFuZ2VPZmZzZXRzKTtcbiAgICB0LmZpZWxkcyA9IHQuZmllbGRzLmNvbmNhdChnbHlwaElkcyk7XG5cbiAgICB0Lmxlbmd0aCA9IDE0ICsgLy8gU3VidGFibGUgaGVhZGVyXG4gICAgICAgIGVuZENvdW50cy5sZW5ndGggKiAyICtcbiAgICAgICAgMiArIC8vIHJlc2VydmVkUGFkXG4gICAgICAgIHN0YXJ0Q291bnRzLmxlbmd0aCAqIDIgK1xuICAgICAgICBpZERlbHRhcy5sZW5ndGggKiAyICtcbiAgICAgICAgaWRSYW5nZU9mZnNldHMubGVuZ3RoICogMiArXG4gICAgICAgIGdseXBoSWRzLmxlbmd0aCAqIDI7XG5cbiAgICByZXR1cm4gdDtcbn1cblxudmFyIGNtYXAgPSB7IHBhcnNlOiBwYXJzZUNtYXBUYWJsZSwgbWFrZTogbWFrZUNtYXBUYWJsZSB9O1xuXG4vLyBHbHlwaCBlbmNvZGluZ1xuXG52YXIgY2ZmU3RhbmRhcmRTdHJpbmdzID0gW1xuICAgICcubm90ZGVmJywgJ3NwYWNlJywgJ2V4Y2xhbScsICdxdW90ZWRibCcsICdudW1iZXJzaWduJywgJ2RvbGxhcicsICdwZXJjZW50JywgJ2FtcGVyc2FuZCcsICdxdW90ZXJpZ2h0JyxcbiAgICAncGFyZW5sZWZ0JywgJ3BhcmVucmlnaHQnLCAnYXN0ZXJpc2snLCAncGx1cycsICdjb21tYScsICdoeXBoZW4nLCAncGVyaW9kJywgJ3NsYXNoJywgJ3plcm8nLCAnb25lJywgJ3R3bycsXG4gICAgJ3RocmVlJywgJ2ZvdXInLCAnZml2ZScsICdzaXgnLCAnc2V2ZW4nLCAnZWlnaHQnLCAnbmluZScsICdjb2xvbicsICdzZW1pY29sb24nLCAnbGVzcycsICdlcXVhbCcsICdncmVhdGVyJyxcbiAgICAncXVlc3Rpb24nLCAnYXQnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsXG4gICAgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnYnJhY2tldGxlZnQnLCAnYmFja3NsYXNoJywgJ2JyYWNrZXRyaWdodCcsICdhc2NpaWNpcmN1bScsICd1bmRlcnNjb3JlJyxcbiAgICAncXVvdGVsZWZ0JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsXG4gICAgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgJ2JyYWNlbGVmdCcsICdiYXInLCAnYnJhY2VyaWdodCcsICdhc2NpaXRpbGRlJywgJ2V4Y2xhbWRvd24nLCAnY2VudCcsICdzdGVybGluZycsXG4gICAgJ2ZyYWN0aW9uJywgJ3llbicsICdmbG9yaW4nLCAnc2VjdGlvbicsICdjdXJyZW5jeScsICdxdW90ZXNpbmdsZScsICdxdW90ZWRibGxlZnQnLCAnZ3VpbGxlbW90bGVmdCcsXG4gICAgJ2d1aWxzaW5nbGxlZnQnLCAnZ3VpbHNpbmdscmlnaHQnLCAnZmknLCAnZmwnLCAnZW5kYXNoJywgJ2RhZ2dlcicsICdkYWdnZXJkYmwnLCAncGVyaW9kY2VudGVyZWQnLCAncGFyYWdyYXBoJyxcbiAgICAnYnVsbGV0JywgJ3F1b3Rlc2luZ2xiYXNlJywgJ3F1b3RlZGJsYmFzZScsICdxdW90ZWRibHJpZ2h0JywgJ2d1aWxsZW1vdHJpZ2h0JywgJ2VsbGlwc2lzJywgJ3BlcnRob3VzYW5kJyxcbiAgICAncXVlc3Rpb25kb3duJywgJ2dyYXZlJywgJ2FjdXRlJywgJ2NpcmN1bWZsZXgnLCAndGlsZGUnLCAnbWFjcm9uJywgJ2JyZXZlJywgJ2RvdGFjY2VudCcsICdkaWVyZXNpcycsICdyaW5nJyxcbiAgICAnY2VkaWxsYScsICdodW5nYXJ1bWxhdXQnLCAnb2dvbmVrJywgJ2Nhcm9uJywgJ2VtZGFzaCcsICdBRScsICdvcmRmZW1pbmluZScsICdMc2xhc2gnLCAnT3NsYXNoJywgJ09FJyxcbiAgICAnb3JkbWFzY3VsaW5lJywgJ2FlJywgJ2RvdGxlc3NpJywgJ2xzbGFzaCcsICdvc2xhc2gnLCAnb2UnLCAnZ2VybWFuZGJscycsICdvbmVzdXBlcmlvcicsICdsb2dpY2Fsbm90JywgJ211JyxcbiAgICAndHJhZGVtYXJrJywgJ0V0aCcsICdvbmVoYWxmJywgJ3BsdXNtaW51cycsICdUaG9ybicsICdvbmVxdWFydGVyJywgJ2RpdmlkZScsICdicm9rZW5iYXInLCAnZGVncmVlJywgJ3Rob3JuJyxcbiAgICAndGhyZWVxdWFydGVycycsICd0d29zdXBlcmlvcicsICdyZWdpc3RlcmVkJywgJ21pbnVzJywgJ2V0aCcsICdtdWx0aXBseScsICd0aHJlZXN1cGVyaW9yJywgJ2NvcHlyaWdodCcsXG4gICAgJ0FhY3V0ZScsICdBY2lyY3VtZmxleCcsICdBZGllcmVzaXMnLCAnQWdyYXZlJywgJ0FyaW5nJywgJ0F0aWxkZScsICdDY2VkaWxsYScsICdFYWN1dGUnLCAnRWNpcmN1bWZsZXgnLFxuICAgICdFZGllcmVzaXMnLCAnRWdyYXZlJywgJ0lhY3V0ZScsICdJY2lyY3VtZmxleCcsICdJZGllcmVzaXMnLCAnSWdyYXZlJywgJ050aWxkZScsICdPYWN1dGUnLCAnT2NpcmN1bWZsZXgnLFxuICAgICdPZGllcmVzaXMnLCAnT2dyYXZlJywgJ090aWxkZScsICdTY2Fyb24nLCAnVWFjdXRlJywgJ1VjaXJjdW1mbGV4JywgJ1VkaWVyZXNpcycsICdVZ3JhdmUnLCAnWWFjdXRlJyxcbiAgICAnWWRpZXJlc2lzJywgJ1pjYXJvbicsICdhYWN1dGUnLCAnYWNpcmN1bWZsZXgnLCAnYWRpZXJlc2lzJywgJ2FncmF2ZScsICdhcmluZycsICdhdGlsZGUnLCAnY2NlZGlsbGEnLCAnZWFjdXRlJyxcbiAgICAnZWNpcmN1bWZsZXgnLCAnZWRpZXJlc2lzJywgJ2VncmF2ZScsICdpYWN1dGUnLCAnaWNpcmN1bWZsZXgnLCAnaWRpZXJlc2lzJywgJ2lncmF2ZScsICdudGlsZGUnLCAnb2FjdXRlJyxcbiAgICAnb2NpcmN1bWZsZXgnLCAnb2RpZXJlc2lzJywgJ29ncmF2ZScsICdvdGlsZGUnLCAnc2Nhcm9uJywgJ3VhY3V0ZScsICd1Y2lyY3VtZmxleCcsICd1ZGllcmVzaXMnLCAndWdyYXZlJyxcbiAgICAneWFjdXRlJywgJ3lkaWVyZXNpcycsICd6Y2Fyb24nLCAnZXhjbGFtc21hbGwnLCAnSHVuZ2FydW1sYXV0c21hbGwnLCAnZG9sbGFyb2xkc3R5bGUnLCAnZG9sbGFyc3VwZXJpb3InLFxuICAgICdhbXBlcnNhbmRzbWFsbCcsICdBY3V0ZXNtYWxsJywgJ3BhcmVubGVmdHN1cGVyaW9yJywgJ3BhcmVucmlnaHRzdXBlcmlvcicsICcyNjYgZmYnLCAnb25lZG90ZW5sZWFkZXInLFxuICAgICd6ZXJvb2xkc3R5bGUnLCAnb25lb2xkc3R5bGUnLCAndHdvb2xkc3R5bGUnLCAndGhyZWVvbGRzdHlsZScsICdmb3Vyb2xkc3R5bGUnLCAnZml2ZW9sZHN0eWxlJywgJ3NpeG9sZHN0eWxlJyxcbiAgICAnc2V2ZW5vbGRzdHlsZScsICdlaWdodG9sZHN0eWxlJywgJ25pbmVvbGRzdHlsZScsICdjb21tYXN1cGVyaW9yJywgJ3RocmVlcXVhcnRlcnNlbWRhc2gnLCAncGVyaW9kc3VwZXJpb3InLFxuICAgICdxdWVzdGlvbnNtYWxsJywgJ2FzdXBlcmlvcicsICdic3VwZXJpb3InLCAnY2VudHN1cGVyaW9yJywgJ2RzdXBlcmlvcicsICdlc3VwZXJpb3InLCAnaXN1cGVyaW9yJywgJ2xzdXBlcmlvcicsXG4gICAgJ21zdXBlcmlvcicsICduc3VwZXJpb3InLCAnb3N1cGVyaW9yJywgJ3JzdXBlcmlvcicsICdzc3VwZXJpb3InLCAndHN1cGVyaW9yJywgJ2ZmJywgJ2ZmaScsICdmZmwnLFxuICAgICdwYXJlbmxlZnRpbmZlcmlvcicsICdwYXJlbnJpZ2h0aW5mZXJpb3InLCAnQ2lyY3VtZmxleHNtYWxsJywgJ2h5cGhlbnN1cGVyaW9yJywgJ0dyYXZlc21hbGwnLCAnQXNtYWxsJyxcbiAgICAnQnNtYWxsJywgJ0NzbWFsbCcsICdEc21hbGwnLCAnRXNtYWxsJywgJ0ZzbWFsbCcsICdHc21hbGwnLCAnSHNtYWxsJywgJ0lzbWFsbCcsICdKc21hbGwnLCAnS3NtYWxsJywgJ0xzbWFsbCcsXG4gICAgJ01zbWFsbCcsICdOc21hbGwnLCAnT3NtYWxsJywgJ1BzbWFsbCcsICdRc21hbGwnLCAnUnNtYWxsJywgJ1NzbWFsbCcsICdUc21hbGwnLCAnVXNtYWxsJywgJ1ZzbWFsbCcsICdXc21hbGwnLFxuICAgICdYc21hbGwnLCAnWXNtYWxsJywgJ1pzbWFsbCcsICdjb2xvbm1vbmV0YXJ5JywgJ29uZWZpdHRlZCcsICdydXBpYWgnLCAnVGlsZGVzbWFsbCcsICdleGNsYW1kb3duc21hbGwnLFxuICAgICdjZW50b2xkc3R5bGUnLCAnTHNsYXNoc21hbGwnLCAnU2Nhcm9uc21hbGwnLCAnWmNhcm9uc21hbGwnLCAnRGllcmVzaXNzbWFsbCcsICdCcmV2ZXNtYWxsJywgJ0Nhcm9uc21hbGwnLFxuICAgICdEb3RhY2NlbnRzbWFsbCcsICdNYWNyb25zbWFsbCcsICdmaWd1cmVkYXNoJywgJ2h5cGhlbmluZmVyaW9yJywgJ09nb25la3NtYWxsJywgJ1JpbmdzbWFsbCcsICdDZWRpbGxhc21hbGwnLFxuICAgICdxdWVzdGlvbmRvd25zbWFsbCcsICdvbmVlaWdodGgnLCAndGhyZWVlaWdodGhzJywgJ2ZpdmVlaWdodGhzJywgJ3NldmVuZWlnaHRocycsICdvbmV0aGlyZCcsICd0d290aGlyZHMnLFxuICAgICd6ZXJvc3VwZXJpb3InLCAnZm91cnN1cGVyaW9yJywgJ2ZpdmVzdXBlcmlvcicsICdzaXhzdXBlcmlvcicsICdzZXZlbnN1cGVyaW9yJywgJ2VpZ2h0c3VwZXJpb3InLCAnbmluZXN1cGVyaW9yJyxcbiAgICAnemVyb2luZmVyaW9yJywgJ29uZWluZmVyaW9yJywgJ3R3b2luZmVyaW9yJywgJ3RocmVlaW5mZXJpb3InLCAnZm91cmluZmVyaW9yJywgJ2ZpdmVpbmZlcmlvcicsICdzaXhpbmZlcmlvcicsXG4gICAgJ3NldmVuaW5mZXJpb3InLCAnZWlnaHRpbmZlcmlvcicsICduaW5laW5mZXJpb3InLCAnY2VudGluZmVyaW9yJywgJ2RvbGxhcmluZmVyaW9yJywgJ3BlcmlvZGluZmVyaW9yJyxcbiAgICAnY29tbWFpbmZlcmlvcicsICdBZ3JhdmVzbWFsbCcsICdBYWN1dGVzbWFsbCcsICdBY2lyY3VtZmxleHNtYWxsJywgJ0F0aWxkZXNtYWxsJywgJ0FkaWVyZXNpc3NtYWxsJyxcbiAgICAnQXJpbmdzbWFsbCcsICdBRXNtYWxsJywgJ0NjZWRpbGxhc21hbGwnLCAnRWdyYXZlc21hbGwnLCAnRWFjdXRlc21hbGwnLCAnRWNpcmN1bWZsZXhzbWFsbCcsICdFZGllcmVzaXNzbWFsbCcsXG4gICAgJ0lncmF2ZXNtYWxsJywgJ0lhY3V0ZXNtYWxsJywgJ0ljaXJjdW1mbGV4c21hbGwnLCAnSWRpZXJlc2lzc21hbGwnLCAnRXRoc21hbGwnLCAnTnRpbGRlc21hbGwnLCAnT2dyYXZlc21hbGwnLFxuICAgICdPYWN1dGVzbWFsbCcsICdPY2lyY3VtZmxleHNtYWxsJywgJ090aWxkZXNtYWxsJywgJ09kaWVyZXNpc3NtYWxsJywgJ09Fc21hbGwnLCAnT3NsYXNoc21hbGwnLCAnVWdyYXZlc21hbGwnLFxuICAgICdVYWN1dGVzbWFsbCcsICdVY2lyY3VtZmxleHNtYWxsJywgJ1VkaWVyZXNpc3NtYWxsJywgJ1lhY3V0ZXNtYWxsJywgJ1Rob3Juc21hbGwnLCAnWWRpZXJlc2lzc21hbGwnLCAnMDAxLjAwMCcsXG4gICAgJzAwMS4wMDEnLCAnMDAxLjAwMicsICcwMDEuMDAzJywgJ0JsYWNrJywgJ0JvbGQnLCAnQm9vaycsICdMaWdodCcsICdNZWRpdW0nLCAnUmVndWxhcicsICdSb21hbicsICdTZW1pYm9sZCddO1xuXG52YXIgY2ZmU3RhbmRhcmRFbmNvZGluZyA9IFtcbiAgICAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJyxcbiAgICAnJywgJycsICcnLCAnJywgJ3NwYWNlJywgJ2V4Y2xhbScsICdxdW90ZWRibCcsICdudW1iZXJzaWduJywgJ2RvbGxhcicsICdwZXJjZW50JywgJ2FtcGVyc2FuZCcsICdxdW90ZXJpZ2h0JyxcbiAgICAncGFyZW5sZWZ0JywgJ3BhcmVucmlnaHQnLCAnYXN0ZXJpc2snLCAncGx1cycsICdjb21tYScsICdoeXBoZW4nLCAncGVyaW9kJywgJ3NsYXNoJywgJ3plcm8nLCAnb25lJywgJ3R3bycsXG4gICAgJ3RocmVlJywgJ2ZvdXInLCAnZml2ZScsICdzaXgnLCAnc2V2ZW4nLCAnZWlnaHQnLCAnbmluZScsICdjb2xvbicsICdzZW1pY29sb24nLCAnbGVzcycsICdlcXVhbCcsICdncmVhdGVyJyxcbiAgICAncXVlc3Rpb24nLCAnYXQnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsXG4gICAgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnYnJhY2tldGxlZnQnLCAnYmFja3NsYXNoJywgJ2JyYWNrZXRyaWdodCcsICdhc2NpaWNpcmN1bScsICd1bmRlcnNjb3JlJyxcbiAgICAncXVvdGVsZWZ0JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsXG4gICAgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgJ2JyYWNlbGVmdCcsICdiYXInLCAnYnJhY2VyaWdodCcsICdhc2NpaXRpbGRlJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLFxuICAgICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJyxcbiAgICAnZXhjbGFtZG93bicsICdjZW50JywgJ3N0ZXJsaW5nJywgJ2ZyYWN0aW9uJywgJ3llbicsICdmbG9yaW4nLCAnc2VjdGlvbicsICdjdXJyZW5jeScsICdxdW90ZXNpbmdsZScsXG4gICAgJ3F1b3RlZGJsbGVmdCcsICdndWlsbGVtb3RsZWZ0JywgJ2d1aWxzaW5nbGxlZnQnLCAnZ3VpbHNpbmdscmlnaHQnLCAnZmknLCAnZmwnLCAnJywgJ2VuZGFzaCcsICdkYWdnZXInLFxuICAgICdkYWdnZXJkYmwnLCAncGVyaW9kY2VudGVyZWQnLCAnJywgJ3BhcmFncmFwaCcsICdidWxsZXQnLCAncXVvdGVzaW5nbGJhc2UnLCAncXVvdGVkYmxiYXNlJywgJ3F1b3RlZGJscmlnaHQnLFxuICAgICdndWlsbGVtb3RyaWdodCcsICdlbGxpcHNpcycsICdwZXJ0aG91c2FuZCcsICcnLCAncXVlc3Rpb25kb3duJywgJycsICdncmF2ZScsICdhY3V0ZScsICdjaXJjdW1mbGV4JywgJ3RpbGRlJyxcbiAgICAnbWFjcm9uJywgJ2JyZXZlJywgJ2RvdGFjY2VudCcsICdkaWVyZXNpcycsICcnLCAncmluZycsICdjZWRpbGxhJywgJycsICdodW5nYXJ1bWxhdXQnLCAnb2dvbmVrJywgJ2Nhcm9uJyxcbiAgICAnZW1kYXNoJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICdBRScsICcnLCAnb3JkZmVtaW5pbmUnLCAnJywgJycsICcnLFxuICAgICcnLCAnTHNsYXNoJywgJ09zbGFzaCcsICdPRScsICdvcmRtYXNjdWxpbmUnLCAnJywgJycsICcnLCAnJywgJycsICdhZScsICcnLCAnJywgJycsICdkb3RsZXNzaScsICcnLCAnJyxcbiAgICAnbHNsYXNoJywgJ29zbGFzaCcsICdvZScsICdnZXJtYW5kYmxzJ107XG5cbnZhciBjZmZFeHBlcnRFbmNvZGluZyA9IFtcbiAgICAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJyxcbiAgICAnJywgJycsICcnLCAnJywgJ3NwYWNlJywgJ2V4Y2xhbXNtYWxsJywgJ0h1bmdhcnVtbGF1dHNtYWxsJywgJycsICdkb2xsYXJvbGRzdHlsZScsICdkb2xsYXJzdXBlcmlvcicsXG4gICAgJ2FtcGVyc2FuZHNtYWxsJywgJ0FjdXRlc21hbGwnLCAncGFyZW5sZWZ0c3VwZXJpb3InLCAncGFyZW5yaWdodHN1cGVyaW9yJywgJ3R3b2RvdGVubGVhZGVyJywgJ29uZWRvdGVubGVhZGVyJyxcbiAgICAnY29tbWEnLCAnaHlwaGVuJywgJ3BlcmlvZCcsICdmcmFjdGlvbicsICd6ZXJvb2xkc3R5bGUnLCAnb25lb2xkc3R5bGUnLCAndHdvb2xkc3R5bGUnLCAndGhyZWVvbGRzdHlsZScsXG4gICAgJ2ZvdXJvbGRzdHlsZScsICdmaXZlb2xkc3R5bGUnLCAnc2l4b2xkc3R5bGUnLCAnc2V2ZW5vbGRzdHlsZScsICdlaWdodG9sZHN0eWxlJywgJ25pbmVvbGRzdHlsZScsICdjb2xvbicsXG4gICAgJ3NlbWljb2xvbicsICdjb21tYXN1cGVyaW9yJywgJ3RocmVlcXVhcnRlcnNlbWRhc2gnLCAncGVyaW9kc3VwZXJpb3InLCAncXVlc3Rpb25zbWFsbCcsICcnLCAnYXN1cGVyaW9yJyxcbiAgICAnYnN1cGVyaW9yJywgJ2NlbnRzdXBlcmlvcicsICdkc3VwZXJpb3InLCAnZXN1cGVyaW9yJywgJycsICcnLCAnaXN1cGVyaW9yJywgJycsICcnLCAnbHN1cGVyaW9yJywgJ21zdXBlcmlvcicsXG4gICAgJ25zdXBlcmlvcicsICdvc3VwZXJpb3InLCAnJywgJycsICdyc3VwZXJpb3InLCAnc3N1cGVyaW9yJywgJ3RzdXBlcmlvcicsICcnLCAnZmYnLCAnZmknLCAnZmwnLCAnZmZpJywgJ2ZmbCcsXG4gICAgJ3BhcmVubGVmdGluZmVyaW9yJywgJycsICdwYXJlbnJpZ2h0aW5mZXJpb3InLCAnQ2lyY3VtZmxleHNtYWxsJywgJ2h5cGhlbnN1cGVyaW9yJywgJ0dyYXZlc21hbGwnLCAnQXNtYWxsJyxcbiAgICAnQnNtYWxsJywgJ0NzbWFsbCcsICdEc21hbGwnLCAnRXNtYWxsJywgJ0ZzbWFsbCcsICdHc21hbGwnLCAnSHNtYWxsJywgJ0lzbWFsbCcsICdKc21hbGwnLCAnS3NtYWxsJywgJ0xzbWFsbCcsXG4gICAgJ01zbWFsbCcsICdOc21hbGwnLCAnT3NtYWxsJywgJ1BzbWFsbCcsICdRc21hbGwnLCAnUnNtYWxsJywgJ1NzbWFsbCcsICdUc21hbGwnLCAnVXNtYWxsJywgJ1ZzbWFsbCcsICdXc21hbGwnLFxuICAgICdYc21hbGwnLCAnWXNtYWxsJywgJ1pzbWFsbCcsICdjb2xvbm1vbmV0YXJ5JywgJ29uZWZpdHRlZCcsICdydXBpYWgnLCAnVGlsZGVzbWFsbCcsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLFxuICAgICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsXG4gICAgJ2V4Y2xhbWRvd25zbWFsbCcsICdjZW50b2xkc3R5bGUnLCAnTHNsYXNoc21hbGwnLCAnJywgJycsICdTY2Fyb25zbWFsbCcsICdaY2Fyb25zbWFsbCcsICdEaWVyZXNpc3NtYWxsJyxcbiAgICAnQnJldmVzbWFsbCcsICdDYXJvbnNtYWxsJywgJycsICdEb3RhY2NlbnRzbWFsbCcsICcnLCAnJywgJ01hY3JvbnNtYWxsJywgJycsICcnLCAnZmlndXJlZGFzaCcsICdoeXBoZW5pbmZlcmlvcicsXG4gICAgJycsICcnLCAnT2dvbmVrc21hbGwnLCAnUmluZ3NtYWxsJywgJ0NlZGlsbGFzbWFsbCcsICcnLCAnJywgJycsICdvbmVxdWFydGVyJywgJ29uZWhhbGYnLCAndGhyZWVxdWFydGVycycsXG4gICAgJ3F1ZXN0aW9uZG93bnNtYWxsJywgJ29uZWVpZ2h0aCcsICd0aHJlZWVpZ2h0aHMnLCAnZml2ZWVpZ2h0aHMnLCAnc2V2ZW5laWdodGhzJywgJ29uZXRoaXJkJywgJ3R3b3RoaXJkcycsICcnLFxuICAgICcnLCAnemVyb3N1cGVyaW9yJywgJ29uZXN1cGVyaW9yJywgJ3R3b3N1cGVyaW9yJywgJ3RocmVlc3VwZXJpb3InLCAnZm91cnN1cGVyaW9yJywgJ2ZpdmVzdXBlcmlvcicsXG4gICAgJ3NpeHN1cGVyaW9yJywgJ3NldmVuc3VwZXJpb3InLCAnZWlnaHRzdXBlcmlvcicsICduaW5lc3VwZXJpb3InLCAnemVyb2luZmVyaW9yJywgJ29uZWluZmVyaW9yJywgJ3R3b2luZmVyaW9yJyxcbiAgICAndGhyZWVpbmZlcmlvcicsICdmb3VyaW5mZXJpb3InLCAnZml2ZWluZmVyaW9yJywgJ3NpeGluZmVyaW9yJywgJ3NldmVuaW5mZXJpb3InLCAnZWlnaHRpbmZlcmlvcicsXG4gICAgJ25pbmVpbmZlcmlvcicsICdjZW50aW5mZXJpb3InLCAnZG9sbGFyaW5mZXJpb3InLCAncGVyaW9kaW5mZXJpb3InLCAnY29tbWFpbmZlcmlvcicsICdBZ3JhdmVzbWFsbCcsXG4gICAgJ0FhY3V0ZXNtYWxsJywgJ0FjaXJjdW1mbGV4c21hbGwnLCAnQXRpbGRlc21hbGwnLCAnQWRpZXJlc2lzc21hbGwnLCAnQXJpbmdzbWFsbCcsICdBRXNtYWxsJywgJ0NjZWRpbGxhc21hbGwnLFxuICAgICdFZ3JhdmVzbWFsbCcsICdFYWN1dGVzbWFsbCcsICdFY2lyY3VtZmxleHNtYWxsJywgJ0VkaWVyZXNpc3NtYWxsJywgJ0lncmF2ZXNtYWxsJywgJ0lhY3V0ZXNtYWxsJyxcbiAgICAnSWNpcmN1bWZsZXhzbWFsbCcsICdJZGllcmVzaXNzbWFsbCcsICdFdGhzbWFsbCcsICdOdGlsZGVzbWFsbCcsICdPZ3JhdmVzbWFsbCcsICdPYWN1dGVzbWFsbCcsXG4gICAgJ09jaXJjdW1mbGV4c21hbGwnLCAnT3RpbGRlc21hbGwnLCAnT2RpZXJlc2lzc21hbGwnLCAnT0VzbWFsbCcsICdPc2xhc2hzbWFsbCcsICdVZ3JhdmVzbWFsbCcsICdVYWN1dGVzbWFsbCcsXG4gICAgJ1VjaXJjdW1mbGV4c21hbGwnLCAnVWRpZXJlc2lzc21hbGwnLCAnWWFjdXRlc21hbGwnLCAnVGhvcm5zbWFsbCcsICdZZGllcmVzaXNzbWFsbCddO1xuXG52YXIgc3RhbmRhcmROYW1lcyA9IFtcbiAgICAnLm5vdGRlZicsICcubnVsbCcsICdub25tYXJraW5ncmV0dXJuJywgJ3NwYWNlJywgJ2V4Y2xhbScsICdxdW90ZWRibCcsICdudW1iZXJzaWduJywgJ2RvbGxhcicsICdwZXJjZW50JyxcbiAgICAnYW1wZXJzYW5kJywgJ3F1b3Rlc2luZ2xlJywgJ3BhcmVubGVmdCcsICdwYXJlbnJpZ2h0JywgJ2FzdGVyaXNrJywgJ3BsdXMnLCAnY29tbWEnLCAnaHlwaGVuJywgJ3BlcmlvZCcsICdzbGFzaCcsXG4gICAgJ3plcm8nLCAnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJywgJ2ZpdmUnLCAnc2l4JywgJ3NldmVuJywgJ2VpZ2h0JywgJ25pbmUnLCAnY29sb24nLCAnc2VtaWNvbG9uJywgJ2xlc3MnLFxuICAgICdlcXVhbCcsICdncmVhdGVyJywgJ3F1ZXN0aW9uJywgJ2F0JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJyxcbiAgICAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywgJ2JyYWNrZXRsZWZ0JywgJ2JhY2tzbGFzaCcsICdicmFja2V0cmlnaHQnLFxuICAgICdhc2NpaWNpcmN1bScsICd1bmRlcnNjb3JlJywgJ2dyYXZlJywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJyxcbiAgICAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgJ2JyYWNlbGVmdCcsICdiYXInLCAnYnJhY2VyaWdodCcsICdhc2NpaXRpbGRlJyxcbiAgICAnQWRpZXJlc2lzJywgJ0FyaW5nJywgJ0NjZWRpbGxhJywgJ0VhY3V0ZScsICdOdGlsZGUnLCAnT2RpZXJlc2lzJywgJ1VkaWVyZXNpcycsICdhYWN1dGUnLCAnYWdyYXZlJyxcbiAgICAnYWNpcmN1bWZsZXgnLCAnYWRpZXJlc2lzJywgJ2F0aWxkZScsICdhcmluZycsICdjY2VkaWxsYScsICdlYWN1dGUnLCAnZWdyYXZlJywgJ2VjaXJjdW1mbGV4JywgJ2VkaWVyZXNpcycsXG4gICAgJ2lhY3V0ZScsICdpZ3JhdmUnLCAnaWNpcmN1bWZsZXgnLCAnaWRpZXJlc2lzJywgJ250aWxkZScsICdvYWN1dGUnLCAnb2dyYXZlJywgJ29jaXJjdW1mbGV4JywgJ29kaWVyZXNpcycsXG4gICAgJ290aWxkZScsICd1YWN1dGUnLCAndWdyYXZlJywgJ3VjaXJjdW1mbGV4JywgJ3VkaWVyZXNpcycsICdkYWdnZXInLCAnZGVncmVlJywgJ2NlbnQnLCAnc3RlcmxpbmcnLCAnc2VjdGlvbicsXG4gICAgJ2J1bGxldCcsICdwYXJhZ3JhcGgnLCAnZ2VybWFuZGJscycsICdyZWdpc3RlcmVkJywgJ2NvcHlyaWdodCcsICd0cmFkZW1hcmsnLCAnYWN1dGUnLCAnZGllcmVzaXMnLCAnbm90ZXF1YWwnLFxuICAgICdBRScsICdPc2xhc2gnLCAnaW5maW5pdHknLCAncGx1c21pbnVzJywgJ2xlc3NlcXVhbCcsICdncmVhdGVyZXF1YWwnLCAneWVuJywgJ211JywgJ3BhcnRpYWxkaWZmJywgJ3N1bW1hdGlvbicsXG4gICAgJ3Byb2R1Y3QnLCAncGknLCAnaW50ZWdyYWwnLCAnb3JkZmVtaW5pbmUnLCAnb3JkbWFzY3VsaW5lJywgJ09tZWdhJywgJ2FlJywgJ29zbGFzaCcsICdxdWVzdGlvbmRvd24nLFxuICAgICdleGNsYW1kb3duJywgJ2xvZ2ljYWxub3QnLCAncmFkaWNhbCcsICdmbG9yaW4nLCAnYXBwcm94ZXF1YWwnLCAnRGVsdGEnLCAnZ3VpbGxlbW90bGVmdCcsICdndWlsbGVtb3RyaWdodCcsXG4gICAgJ2VsbGlwc2lzJywgJ25vbmJyZWFraW5nc3BhY2UnLCAnQWdyYXZlJywgJ0F0aWxkZScsICdPdGlsZGUnLCAnT0UnLCAnb2UnLCAnZW5kYXNoJywgJ2VtZGFzaCcsICdxdW90ZWRibGxlZnQnLFxuICAgICdxdW90ZWRibHJpZ2h0JywgJ3F1b3RlbGVmdCcsICdxdW90ZXJpZ2h0JywgJ2RpdmlkZScsICdsb3plbmdlJywgJ3lkaWVyZXNpcycsICdZZGllcmVzaXMnLCAnZnJhY3Rpb24nLFxuICAgICdjdXJyZW5jeScsICdndWlsc2luZ2xsZWZ0JywgJ2d1aWxzaW5nbHJpZ2h0JywgJ2ZpJywgJ2ZsJywgJ2RhZ2dlcmRibCcsICdwZXJpb2RjZW50ZXJlZCcsICdxdW90ZXNpbmdsYmFzZScsXG4gICAgJ3F1b3RlZGJsYmFzZScsICdwZXJ0aG91c2FuZCcsICdBY2lyY3VtZmxleCcsICdFY2lyY3VtZmxleCcsICdBYWN1dGUnLCAnRWRpZXJlc2lzJywgJ0VncmF2ZScsICdJYWN1dGUnLFxuICAgICdJY2lyY3VtZmxleCcsICdJZGllcmVzaXMnLCAnSWdyYXZlJywgJ09hY3V0ZScsICdPY2lyY3VtZmxleCcsICdhcHBsZScsICdPZ3JhdmUnLCAnVWFjdXRlJywgJ1VjaXJjdW1mbGV4JyxcbiAgICAnVWdyYXZlJywgJ2RvdGxlc3NpJywgJ2NpcmN1bWZsZXgnLCAndGlsZGUnLCAnbWFjcm9uJywgJ2JyZXZlJywgJ2RvdGFjY2VudCcsICdyaW5nJywgJ2NlZGlsbGEnLCAnaHVuZ2FydW1sYXV0JyxcbiAgICAnb2dvbmVrJywgJ2Nhcm9uJywgJ0xzbGFzaCcsICdsc2xhc2gnLCAnU2Nhcm9uJywgJ3NjYXJvbicsICdaY2Fyb24nLCAnemNhcm9uJywgJ2Jyb2tlbmJhcicsICdFdGgnLCAnZXRoJyxcbiAgICAnWWFjdXRlJywgJ3lhY3V0ZScsICdUaG9ybicsICd0aG9ybicsICdtaW51cycsICdtdWx0aXBseScsICdvbmVzdXBlcmlvcicsICd0d29zdXBlcmlvcicsICd0aHJlZXN1cGVyaW9yJyxcbiAgICAnb25laGFsZicsICdvbmVxdWFydGVyJywgJ3RocmVlcXVhcnRlcnMnLCAnZnJhbmMnLCAnR2JyZXZlJywgJ2dicmV2ZScsICdJZG90YWNjZW50JywgJ1NjZWRpbGxhJywgJ3NjZWRpbGxhJyxcbiAgICAnQ2FjdXRlJywgJ2NhY3V0ZScsICdDY2Fyb24nLCAnY2Nhcm9uJywgJ2Rjcm9hdCddO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGZvbnRzIGNyZWF0ZWQgZnJvbSBzY3JhdGNoLlxuICogSXQgbG9vcHMgdGhyb3VnaCBhbGwgZ2x5cGhzIGFuZCBmaW5kcyB0aGUgYXBwcm9wcmlhdGUgdW5pY29kZSB2YWx1ZS5cbiAqIFNpbmNlIGl0J3MgbGluZWFyIHRpbWUsIG90aGVyIGVuY29kaW5ncyB3aWxsIGJlIGZhc3Rlci5cbiAqIEBleHBvcnRzIG9wZW50eXBlLkRlZmF1bHRFbmNvZGluZ1xuICogQGNsYXNzXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7b3BlbnR5cGUuRm9udH1cbiAqL1xuZnVuY3Rpb24gRGVmYXVsdEVuY29kaW5nKGZvbnQpIHtcbiAgICB0aGlzLmZvbnQgPSBmb250O1xufVxuXG5EZWZhdWx0RW5jb2RpbmcucHJvdG90eXBlLmNoYXJUb0dseXBoSW5kZXggPSBmdW5jdGlvbihjKSB7XG4gICAgdmFyIGNvZGUgPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIGdseXBocyA9IHRoaXMuZm9udC5nbHlwaHM7XG4gICAgaWYgKGdseXBocykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGdseXBoID0gZ2x5cGhzLmdldChpKTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ2x5cGgudW5pY29kZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2x5cGgudW5pY29kZXNbal0gPT09IGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBAZXhwb3J0cyBvcGVudHlwZS5DbWFwRW5jb2RpbmdcbiAqIEBjbGFzc1xuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gY21hcCAtIGEgb2JqZWN0IHdpdGggdGhlIGNtYXAgZW5jb2RlZCBkYXRhXG4gKi9cbmZ1bmN0aW9uIENtYXBFbmNvZGluZyhjbWFwKSB7XG4gICAgdGhpcy5jbWFwID0gY21hcDtcbn1cblxuLyoqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGMgLSB0aGUgY2hhcmFjdGVyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBnbHlwaCBpbmRleC5cbiAqL1xuQ21hcEVuY29kaW5nLnByb3RvdHlwZS5jaGFyVG9HbHlwaEluZGV4ID0gZnVuY3Rpb24oYykge1xuICAgIHJldHVybiB0aGlzLmNtYXAuZ2x5cGhJbmRleE1hcFtjLmNoYXJDb2RlQXQoMCldIHx8IDA7XG59O1xuXG4vKipcbiAqIEBleHBvcnRzIG9wZW50eXBlLkNmZkVuY29kaW5nXG4gKiBAY2xhc3NcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nIC0gVGhlIGVuY29kaW5nXG4gKiBAcGFyYW0ge0FycmF5fSBjaGFyc2V0IC0gVGhlIGNoYXJhY3RlciBzZXQuXG4gKi9cbmZ1bmN0aW9uIENmZkVuY29kaW5nKGVuY29kaW5nLCBjaGFyc2V0KSB7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgIHRoaXMuY2hhcnNldCA9IGNoYXJzZXQ7XG59XG5cbi8qKlxuICogQHBhcmFtICB7c3RyaW5nfSBzIC0gVGhlIGNoYXJhY3RlclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW5kZXguXG4gKi9cbkNmZkVuY29kaW5nLnByb3RvdHlwZS5jaGFyVG9HbHlwaEluZGV4ID0gZnVuY3Rpb24ocykge1xuICAgIHZhciBjb2RlID0gcy5jaGFyQ29kZUF0KDApO1xuICAgIHZhciBjaGFyTmFtZSA9IHRoaXMuZW5jb2RpbmdbY29kZV07XG4gICAgcmV0dXJuIHRoaXMuY2hhcnNldC5pbmRleE9mKGNoYXJOYW1lKTtcbn07XG5cbi8qKlxuICogQGV4cG9ydHMgb3BlbnR5cGUuR2x5cGhOYW1lc1xuICogQGNsYXNzXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBwb3N0XG4gKi9cbmZ1bmN0aW9uIEdseXBoTmFtZXMocG9zdCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgc3dpdGNoIChwb3N0LnZlcnNpb24pIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGhpcy5uYW1lcyA9IHN0YW5kYXJkTmFtZXMuc2xpY2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICB0aGlzLm5hbWVzID0gbmV3IEFycmF5KHBvc3QubnVtYmVyT2ZHbHlwaHMpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3N0Lm51bWJlck9mR2x5cGhzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zdC5nbHlwaE5hbWVJbmRleFtpXSA8IHN0YW5kYXJkTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMkMS5uYW1lc1tpXSA9IHN0YW5kYXJkTmFtZXNbcG9zdC5nbHlwaE5hbWVJbmRleFtpXV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcyQxLm5hbWVzW2ldID0gcG9zdC5uYW1lc1twb3N0LmdseXBoTmFtZUluZGV4W2ldIC0gc3RhbmRhcmROYW1lcy5sZW5ndGhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMi41OlxuICAgICAgICAgICAgdGhpcy5uYW1lcyA9IG5ldyBBcnJheShwb3N0Lm51bWJlck9mR2x5cGhzKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHBvc3QubnVtYmVyT2ZHbHlwaHM7IGkkMSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcyQxLm5hbWVzW2kkMV0gPSBzdGFuZGFyZE5hbWVzW2kkMSArIHBvc3QuZ2x5cGhOYW1lSW5kZXhbaSQxXV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0aGlzLm5hbWVzID0gW107XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRoaXMubmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBvZiBhIGdseXBoIGJ5IG5hbWUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgLSBUaGUgZ2x5cGggbmFtZVxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW5kZXhcbiAqL1xuR2x5cGhOYW1lcy5wcm90b3R5cGUubmFtZVRvR2x5cGhJbmRleCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5pbmRleE9mKG5hbWUpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtudW1iZXJ9IGdpZFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5HbHlwaE5hbWVzLnByb3RvdHlwZS5nbHlwaEluZGV4VG9OYW1lID0gZnVuY3Rpb24oZ2lkKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXNbZ2lkXTtcbn07XG5cbi8qKlxuICogQGFsaWFzIG9wZW50eXBlLmFkZEdseXBoTmFtZXNcbiAqIEBwYXJhbSB7b3BlbnR5cGUuRm9udH1cbiAqL1xuZnVuY3Rpb24gYWRkR2x5cGhOYW1lcyhmb250KSB7XG4gICAgdmFyIGdseXBoO1xuICAgIHZhciBnbHlwaEluZGV4TWFwID0gZm9udC50YWJsZXMuY21hcC5nbHlwaEluZGV4TWFwO1xuICAgIHZhciBjaGFyQ29kZXMgPSBPYmplY3Qua2V5cyhnbHlwaEluZGV4TWFwKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhckNvZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjID0gY2hhckNvZGVzW2ldO1xuICAgICAgICB2YXIgZ2x5cGhJbmRleCA9IGdseXBoSW5kZXhNYXBbY107XG4gICAgICAgIGdseXBoID0gZm9udC5nbHlwaHMuZ2V0KGdseXBoSW5kZXgpO1xuICAgICAgICBnbHlwaC5hZGRVbmljb2RlKHBhcnNlSW50KGMpKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBmb250LmdseXBocy5sZW5ndGg7IGkkMSArPSAxKSB7XG4gICAgICAgIGdseXBoID0gZm9udC5nbHlwaHMuZ2V0KGkkMSk7XG4gICAgICAgIGlmIChmb250LmNmZkVuY29kaW5nKSB7XG4gICAgICAgICAgICBpZiAoZm9udC5pc0NJREZvbnQpIHtcbiAgICAgICAgICAgICAgICBnbHlwaC5uYW1lID0gJ2dpZCcgKyBpJDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdseXBoLm5hbWUgPSBmb250LmNmZkVuY29kaW5nLmNoYXJzZXRbaSQxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmb250LmdseXBoTmFtZXMubmFtZXMpIHtcbiAgICAgICAgICAgIGdseXBoLm5hbWUgPSBmb250LmdseXBoTmFtZXMuZ2x5cGhJbmRleFRvTmFtZShpJDEpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBEcmF3aW5nIHV0aWxpdHkgZnVuY3Rpb25zLlxuXG4vLyBEcmF3IGEgbGluZSBvbiB0aGUgZ2l2ZW4gY29udGV4dCBmcm9tIHBvaW50IGB4MSx5MWAgdG8gcG9pbnQgYHgyLHkyYC5cbmZ1bmN0aW9uIGxpbmUoY3R4LCB4MSwgeTEsIHgyLCB5Mikge1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubW92ZVRvKHgxLCB5MSk7XG4gICAgY3R4LmxpbmVUbyh4MiwgeTIpO1xuICAgIGN0eC5zdHJva2UoKTtcbn1cblxudmFyIGRyYXcgPSB7IGxpbmU6IGxpbmUgfTtcblxuLy8gVGhlIGBnbHlmYCB0YWJsZSBkZXNjcmliZXMgdGhlIGdseXBocyBpbiBUcnVlVHlwZSBvdXRsaW5lIGZvcm1hdC5cbi8vIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9nbHlmLmh0bVxuXG4vLyBQYXJzZSB0aGUgY29vcmRpbmF0ZSBkYXRhIGZvciBhIGdseXBoLlxuZnVuY3Rpb24gcGFyc2VHbHlwaENvb3JkaW5hdGUocCwgZmxhZywgcHJldmlvdXNWYWx1ZSwgc2hvcnRWZWN0b3JCaXRNYXNrLCBzYW1lQml0TWFzaykge1xuICAgIHZhciB2O1xuICAgIGlmICgoZmxhZyAmIHNob3J0VmVjdG9yQml0TWFzaykgPiAwKSB7XG4gICAgICAgIC8vIFRoZSBjb29yZGluYXRlIGlzIDEgYnl0ZSBsb25nLlxuICAgICAgICB2ID0gcC5wYXJzZUJ5dGUoKTtcbiAgICAgICAgLy8gVGhlIGBzYW1lYCBiaXQgaXMgcmUtdXNlZCBmb3Igc2hvcnQgdmFsdWVzIHRvIHNpZ25pZnkgdGhlIHNpZ24gb2YgdGhlIHZhbHVlLlxuICAgICAgICBpZiAoKGZsYWcgJiBzYW1lQml0TWFzaykgPT09IDApIHtcbiAgICAgICAgICAgIHYgPSAtdjtcbiAgICAgICAgfVxuXG4gICAgICAgIHYgPSBwcmV2aW91c1ZhbHVlICsgdjtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgVGhlIGNvb3JkaW5hdGUgaXMgMiBieXRlcyBsb25nLlxuICAgICAgICAvLyBJZiB0aGUgYHNhbWVgIGJpdCBpcyBzZXQsIHRoZSBjb29yZGluYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBjb29yZGluYXRlLlxuICAgICAgICBpZiAoKGZsYWcgJiBzYW1lQml0TWFzaykgPiAwKSB7XG4gICAgICAgICAgICB2ID0gcHJldmlvdXNWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBjb29yZGluYXRlIGFzIGEgc2lnbmVkIDE2LWJpdCBkZWx0YSB2YWx1ZS5cbiAgICAgICAgICAgIHYgPSBwcmV2aW91c1ZhbHVlICsgcC5wYXJzZVNob3J0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdjtcbn1cblxuLy8gUGFyc2UgYSBUcnVlVHlwZSBnbHlwaC5cbmZ1bmN0aW9uIHBhcnNlR2x5cGgoZ2x5cGgsIGRhdGEsIHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICBnbHlwaC5udW1iZXJPZkNvbnRvdXJzID0gcC5wYXJzZVNob3J0KCk7XG4gICAgZ2x5cGguX3hNaW4gPSBwLnBhcnNlU2hvcnQoKTtcbiAgICBnbHlwaC5feU1pbiA9IHAucGFyc2VTaG9ydCgpO1xuICAgIGdseXBoLl94TWF4ID0gcC5wYXJzZVNob3J0KCk7XG4gICAgZ2x5cGguX3lNYXggPSBwLnBhcnNlU2hvcnQoKTtcbiAgICB2YXIgZmxhZ3M7XG4gICAgdmFyIGZsYWc7XG5cbiAgICBpZiAoZ2x5cGgubnVtYmVyT2ZDb250b3VycyA+IDApIHtcbiAgICAgICAgLy8gVGhpcyBnbHlwaCBpcyBub3QgYSBjb21wb3NpdGUuXG4gICAgICAgIHZhciBlbmRQb2ludEluZGljZXMgPSBnbHlwaC5lbmRQb2ludEluZGljZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaC5udW1iZXJPZkNvbnRvdXJzOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGVuZFBvaW50SW5kaWNlcy5wdXNoKHAucGFyc2VVU2hvcnQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBnbHlwaC5pbnN0cnVjdGlvbkxlbmd0aCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgZ2x5cGguaW5zdHJ1Y3Rpb25zID0gW107XG4gICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGdseXBoLmluc3RydWN0aW9uTGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgICAgICAgICAgZ2x5cGguaW5zdHJ1Y3Rpb25zLnB1c2gocC5wYXJzZUJ5dGUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbnVtYmVyT2ZDb29yZGluYXRlcyA9IGVuZFBvaW50SW5kaWNlc1tlbmRQb2ludEluZGljZXMubGVuZ3RoIC0gMV0gKyAxO1xuICAgICAgICBmbGFncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCBudW1iZXJPZkNvb3JkaW5hdGVzOyBpJDIgKz0gMSkge1xuICAgICAgICAgICAgZmxhZyA9IHAucGFyc2VCeXRlKCk7XG4gICAgICAgICAgICBmbGFncy5wdXNoKGZsYWcpO1xuICAgICAgICAgICAgLy8gSWYgYml0IDMgaXMgc2V0LCB3ZSByZXBlYXQgdGhpcyBmbGFnIG4gdGltZXMsIHdoZXJlIG4gaXMgdGhlIG5leHQgYnl0ZS5cbiAgICAgICAgICAgIGlmICgoZmxhZyAmIDgpID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciByZXBlYXRDb3VudCA9IHAucGFyc2VCeXRlKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZXBlYXRDb3VudDsgaiArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLnB1c2goZmxhZyk7XG4gICAgICAgICAgICAgICAgICAgIGkkMiArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrLmFyZ3VtZW50KGZsYWdzLmxlbmd0aCA9PT0gbnVtYmVyT2ZDb29yZGluYXRlcywgJ0JhZCBmbGFncy4nKTtcblxuICAgICAgICBpZiAoZW5kUG9pbnRJbmRpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICAgICAgICAgIHZhciBwb2ludDtcbiAgICAgICAgICAgIC8vIFgvWSBjb29yZGluYXRlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIHBvaW50LCBleGNlcHQgZm9yIHRoZSBmaXJzdCBwb2ludCB3aGljaCBpcyByZWxhdGl2ZSB0byAwLDAuXG4gICAgICAgICAgICBpZiAobnVtYmVyT2ZDb29yZGluYXRlcyA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDMgPSAwOyBpJDMgPCBudW1iZXJPZkNvb3JkaW5hdGVzOyBpJDMgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFnID0gZmxhZ3NbaSQzXTtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQub25DdXJ2ZSA9ICEhKGZsYWcgJiAxKTtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQubGFzdFBvaW50T2ZDb250b3VyID0gZW5kUG9pbnRJbmRpY2VzLmluZGV4T2YoaSQzKSA+PSAwO1xuICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChwb2ludCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHB4ID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDQgPSAwOyBpJDQgPCBudW1iZXJPZkNvb3JkaW5hdGVzOyBpJDQgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFnID0gZmxhZ3NbaSQ0XTtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQgPSBwb2ludHNbaSQ0XTtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IHBhcnNlR2x5cGhDb29yZGluYXRlKHAsIGZsYWcsIHB4LCAyLCAxNik7XG4gICAgICAgICAgICAgICAgICAgIHB4ID0gcG9pbnQueDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcHkgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkkNSA9IDA7IGkkNSA8IG51bWJlck9mQ29vcmRpbmF0ZXM7IGkkNSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWcgPSBmbGFnc1tpJDVdO1xuICAgICAgICAgICAgICAgICAgICBwb2ludCA9IHBvaW50c1tpJDVdO1xuICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gcGFyc2VHbHlwaENvb3JkaW5hdGUocCwgZmxhZywgcHksIDQsIDMyKTtcbiAgICAgICAgICAgICAgICAgICAgcHkgPSBwb2ludC55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2x5cGgucG9pbnRzID0gcG9pbnRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2x5cGgucG9pbnRzID0gW107XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGdseXBoLm51bWJlck9mQ29udG91cnMgPT09IDApIHtcbiAgICAgICAgZ2x5cGgucG9pbnRzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2x5cGguaXNDb21wb3NpdGUgPSB0cnVlO1xuICAgICAgICBnbHlwaC5wb2ludHMgPSBbXTtcbiAgICAgICAgZ2x5cGguY29tcG9uZW50cyA9IFtdO1xuICAgICAgICB2YXIgbW9yZUNvbXBvbmVudHMgPSB0cnVlO1xuICAgICAgICB3aGlsZSAobW9yZUNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGZsYWdzID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHtcbiAgICAgICAgICAgICAgICBnbHlwaEluZGV4OiBwLnBhcnNlVVNob3J0KCksXG4gICAgICAgICAgICAgICAgeFNjYWxlOiAxLFxuICAgICAgICAgICAgICAgIHNjYWxlMDE6IDAsXG4gICAgICAgICAgICAgICAgc2NhbGUxMDogMCxcbiAgICAgICAgICAgICAgICB5U2NhbGU6IDEsXG4gICAgICAgICAgICAgICAgZHg6IDAsXG4gICAgICAgICAgICAgICAgZHk6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgMSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGFyZ3VtZW50cyBhcmUgd29yZHNcbiAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgMikgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcmUgb2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5keCA9IHAucGFyc2VTaG9ydCgpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZHkgPSBwLnBhcnNlU2hvcnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgYXJlIG1hdGNoZWQgcG9pbnRzXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5tYXRjaGVkUG9pbnRzID0gW3AucGFyc2VVU2hvcnQoKSwgcC5wYXJzZVVTaG9ydCgpXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGFyZ3VtZW50cyBhcmUgYnl0ZXNcbiAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgMikgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcmUgb2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5keCA9IHAucGFyc2VDaGFyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5keSA9IHAucGFyc2VDaGFyKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGFyZSBtYXRjaGVkIHBvaW50c1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQubWF0Y2hlZFBvaW50cyA9IFtwLnBhcnNlQnl0ZSgpLCBwLnBhcnNlQnl0ZSgpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiA4KSA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgc2NhbGVcbiAgICAgICAgICAgICAgICBjb21wb25lbnQueFNjYWxlID0gY29tcG9uZW50LnlTY2FsZSA9IHAucGFyc2VGMkRvdDE0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIDY0KSA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGFuIFggLyBZIHNjYWxlXG4gICAgICAgICAgICAgICAgY29tcG9uZW50LnhTY2FsZSA9IHAucGFyc2VGMkRvdDE0KCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LnlTY2FsZSA9IHAucGFyc2VGMkRvdDE0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIDEyOCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIDJ4MiB0cmFuc2Zvcm1hdGlvblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC54U2NhbGUgPSBwLnBhcnNlRjJEb3QxNCgpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zY2FsZTAxID0gcC5wYXJzZUYyRG90MTQoKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuc2NhbGUxMCA9IHAucGFyc2VGMkRvdDE0KCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LnlTY2FsZSA9IHAucGFyc2VGMkRvdDE0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdseXBoLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICAgICAgbW9yZUNvbXBvbmVudHMgPSAhIShmbGFncyAmIDMyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxhZ3MgJiAweDEwMCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBpbnN0cnVjdGlvbnNcbiAgICAgICAgICAgIGdseXBoLmluc3RydWN0aW9uTGVuZ3RoID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgZ2x5cGguaW5zdHJ1Y3Rpb25zID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpJDYgPSAwOyBpJDYgPCBnbHlwaC5pbnN0cnVjdGlvbkxlbmd0aDsgaSQ2ICs9IDEpIHtcbiAgICAgICAgICAgICAgICBnbHlwaC5pbnN0cnVjdGlvbnMucHVzaChwLnBhcnNlQnl0ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gVHJhbnNmb3JtIGFuIGFycmF5IG9mIHBvaW50cyBhbmQgcmV0dXJuIGEgbmV3IGFycmF5LlxuZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnRzKHBvaW50cywgdHJhbnNmb3JtKSB7XG4gICAgdmFyIG5ld1BvaW50cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBwdCA9IHBvaW50c1tpXTtcbiAgICAgICAgdmFyIG5ld1B0ID0ge1xuICAgICAgICAgICAgeDogdHJhbnNmb3JtLnhTY2FsZSAqIHB0LnggKyB0cmFuc2Zvcm0uc2NhbGUwMSAqIHB0LnkgKyB0cmFuc2Zvcm0uZHgsXG4gICAgICAgICAgICB5OiB0cmFuc2Zvcm0uc2NhbGUxMCAqIHB0LnggKyB0cmFuc2Zvcm0ueVNjYWxlICogcHQueSArIHRyYW5zZm9ybS5keSxcbiAgICAgICAgICAgIG9uQ3VydmU6IHB0Lm9uQ3VydmUsXG4gICAgICAgICAgICBsYXN0UG9pbnRPZkNvbnRvdXI6IHB0Lmxhc3RQb2ludE9mQ29udG91clxuICAgICAgICB9O1xuICAgICAgICBuZXdQb2ludHMucHVzaChuZXdQdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1BvaW50cztcbn1cblxuZnVuY3Rpb24gZ2V0Q29udG91cnMocG9pbnRzKSB7XG4gICAgdmFyIGNvbnRvdXJzID0gW107XG4gICAgdmFyIGN1cnJlbnRDb250b3VyID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIHB0ID0gcG9pbnRzW2ldO1xuICAgICAgICBjdXJyZW50Q29udG91ci5wdXNoKHB0KTtcbiAgICAgICAgaWYgKHB0Lmxhc3RQb2ludE9mQ29udG91cikge1xuICAgICAgICAgICAgY29udG91cnMucHVzaChjdXJyZW50Q29udG91cik7XG4gICAgICAgICAgICBjdXJyZW50Q29udG91ciA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2suYXJndW1lbnQoY3VycmVudENvbnRvdXIubGVuZ3RoID09PSAwLCAnVGhlcmUgYXJlIHN0aWxsIHBvaW50cyBsZWZ0IGluIHRoZSBjdXJyZW50IGNvbnRvdXIuJyk7XG4gICAgcmV0dXJuIGNvbnRvdXJzO1xufVxuXG4vLyBDb252ZXJ0IHRoZSBUcnVlVHlwZSBnbHlwaCBvdXRsaW5lIHRvIGEgUGF0aC5cbmZ1bmN0aW9uIGdldFBhdGgocG9pbnRzKSB7XG4gICAgdmFyIHAgPSBuZXcgUGF0aCgpO1xuICAgIGlmICghcG9pbnRzKSB7XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIHZhciBjb250b3VycyA9IGdldENvbnRvdXJzKHBvaW50cyk7XG5cbiAgICBmb3IgKHZhciBjb250b3VySW5kZXggPSAwOyBjb250b3VySW5kZXggPCBjb250b3Vycy5sZW5ndGg7ICsrY29udG91ckluZGV4KSB7XG4gICAgICAgIHZhciBjb250b3VyID0gY29udG91cnNbY29udG91ckluZGV4XTtcblxuICAgICAgICB2YXIgcHJldiA9IG51bGw7XG4gICAgICAgIHZhciBjdXJyID0gY29udG91cltjb250b3VyLmxlbmd0aCAtIDFdO1xuICAgICAgICB2YXIgbmV4dCA9IGNvbnRvdXJbMF07XG5cbiAgICAgICAgaWYgKGN1cnIub25DdXJ2ZSkge1xuICAgICAgICAgICAgcC5tb3ZlVG8oY3Vyci54LCBjdXJyLnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5leHQub25DdXJ2ZSkge1xuICAgICAgICAgICAgICAgIHAubW92ZVRvKG5leHQueCwgbmV4dC55KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYm90aCBmaXJzdCBhbmQgbGFzdCBwb2ludHMgYXJlIG9mZi1jdXJ2ZSwgc3RhcnQgYXQgdGhlaXIgbWlkZGxlLlxuICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IHt4OiAoY3Vyci54ICsgbmV4dC54KSAqIDAuNSwgeTogKGN1cnIueSArIG5leHQueSkgKiAwLjV9O1xuICAgICAgICAgICAgICAgIHAubW92ZVRvKHN0YXJ0LngsIHN0YXJ0LnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250b3VyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBwcmV2ID0gY3VycjtcbiAgICAgICAgICAgIGN1cnIgPSBuZXh0O1xuICAgICAgICAgICAgbmV4dCA9IGNvbnRvdXJbKGkgKyAxKSAlIGNvbnRvdXIubGVuZ3RoXTtcblxuICAgICAgICAgICAgaWYgKGN1cnIub25DdXJ2ZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdHJhaWdodCBsaW5lLlxuICAgICAgICAgICAgICAgIHAubGluZVRvKGN1cnIueCwgY3Vyci55KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXYyID0gcHJldjtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dDIgPSBuZXh0O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2Lm9uQ3VydmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldjIgPSB7IHg6IChjdXJyLnggKyBwcmV2LngpICogMC41LCB5OiAoY3Vyci55ICsgcHJldi55KSAqIDAuNSB9O1xuICAgICAgICAgICAgICAgICAgICBwLmxpbmVUbyhwcmV2Mi54LCBwcmV2Mi55KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5leHQub25DdXJ2ZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0MiA9IHsgeDogKGN1cnIueCArIG5leHQueCkgKiAwLjUsIHk6IChjdXJyLnkgKyBuZXh0LnkpICogMC41IH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcC5saW5lVG8ocHJldjIueCwgcHJldjIueSk7XG4gICAgICAgICAgICAgICAgcC5xdWFkcmF0aWNDdXJ2ZVRvKGN1cnIueCwgY3Vyci55LCBuZXh0Mi54LCBuZXh0Mi55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHAuY2xvc2VQYXRoKCk7XG4gICAgfVxuICAgIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiBidWlsZFBhdGgoZ2x5cGhzLCBnbHlwaCkge1xuICAgIGlmIChnbHlwaC5pc0NvbXBvc2l0ZSkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdseXBoLmNvbXBvbmVudHMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSBnbHlwaC5jb21wb25lbnRzW2pdO1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudEdseXBoID0gZ2x5cGhzLmdldChjb21wb25lbnQuZ2x5cGhJbmRleCk7XG4gICAgICAgICAgICAvLyBGb3JjZSB0aGUgdHRmR2x5cGhMb2FkZXIgdG8gcGFyc2UgdGhlIGdseXBoLlxuICAgICAgICAgICAgY29tcG9uZW50R2x5cGguZ2V0UGF0aCgpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudEdseXBoLnBvaW50cykge1xuICAgICAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lZFBvaW50cyA9ICh2b2lkIDApO1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQubWF0Y2hlZFBvaW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBwb3NpdGlvbmVkIGJ5IG9mZnNldFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFBvaW50cyA9IHRyYW5zZm9ybVBvaW50cyhjb21wb25lbnRHbHlwaC5wb2ludHMsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IHBvc2l0aW9uZWQgYnkgbWF0Y2hlZCBwb2ludHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKChjb21wb25lbnQubWF0Y2hlZFBvaW50c1swXSA+IGdseXBoLnBvaW50cy5sZW5ndGggLSAxKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudC5tYXRjaGVkUG9pbnRzWzFdID4gY29tcG9uZW50R2x5cGgucG9pbnRzLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignTWF0Y2hlZCBwb2ludHMgb3V0IG9mIHJhbmdlIGluICcgKyBnbHlwaC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RQdCA9IGdseXBoLnBvaW50c1tjb21wb25lbnQubWF0Y2hlZFBvaW50c1swXV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWNvbmRQdCA9IGNvbXBvbmVudEdseXBoLnBvaW50c1tjb21wb25lbnQubWF0Y2hlZFBvaW50c1sxXV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2Zvcm0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4U2NhbGU6IGNvbXBvbmVudC54U2NhbGUsIHNjYWxlMDE6IGNvbXBvbmVudC5zY2FsZTAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUxMDogY29tcG9uZW50LnNjYWxlMTAsIHlTY2FsZTogY29tcG9uZW50LnlTY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGR4OiAwLCBkeTogMFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBzZWNvbmRQdCA9IHRyYW5zZm9ybVBvaW50cyhbc2Vjb25kUHRdLCB0cmFuc2Zvcm0pWzBdO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0uZHggPSBmaXJzdFB0LnggLSBzZWNvbmRQdC54O1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0uZHkgPSBmaXJzdFB0LnkgLSBzZWNvbmRQdC55O1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFBvaW50cyA9IHRyYW5zZm9ybVBvaW50cyhjb21wb25lbnRHbHlwaC5wb2ludHMsIHRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdseXBoLnBvaW50cyA9IGdseXBoLnBvaW50cy5jb25jYXQodHJhbnNmb3JtZWRQb2ludHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFBhdGgoZ2x5cGgucG9pbnRzKTtcbn1cblxuLy8gUGFyc2UgYWxsIHRoZSBnbHlwaHMgYWNjb3JkaW5nIHRvIHRoZSBvZmZzZXRzIGZyb20gdGhlIGBsb2NhYCB0YWJsZS5cbmZ1bmN0aW9uIHBhcnNlR2x5ZlRhYmxlKGRhdGEsIHN0YXJ0LCBsb2NhLCBmb250KSB7XG4gICAgdmFyIGdseXBocyA9IG5ldyBnbHlwaHNldC5HbHlwaFNldChmb250KTtcblxuICAgIC8vIFRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGxvY2EgdGFibGUgaXMgaW52YWxpZC5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvY2EubGVuZ3RoIC0gMTsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSBsb2NhW2ldO1xuICAgICAgICB2YXIgbmV4dE9mZnNldCA9IGxvY2FbaSArIDFdO1xuICAgICAgICBpZiAob2Zmc2V0ICE9PSBuZXh0T2Zmc2V0KSB7XG4gICAgICAgICAgICBnbHlwaHMucHVzaChpLCBnbHlwaHNldC50dGZHbHlwaExvYWRlcihmb250LCBpLCBwYXJzZUdseXBoLCBkYXRhLCBzdGFydCArIG9mZnNldCwgYnVpbGRQYXRoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbHlwaHMucHVzaChpLCBnbHlwaHNldC5nbHlwaExvYWRlcihmb250LCBpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGhzO1xufVxuXG52YXIgZ2x5ZiA9IHsgZ2V0UGF0aDogZ2V0UGF0aCwgcGFyc2U6IHBhcnNlR2x5ZlRhYmxlIH07XG5cbi8vIFRoZSBHbHlwaCBvYmplY3RcblxuZnVuY3Rpb24gZ2V0UGF0aERlZmluaXRpb24oZ2x5cGgsIHBhdGgpIHtcbiAgICB2YXIgX3BhdGggPSBwYXRoIHx8IHtjb21tYW5kczogW119O1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBfcGF0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIF9wYXRoID0gX3BhdGgoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9wYXRoO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldDogZnVuY3Rpb24ocCkge1xuICAgICAgICAgICAgX3BhdGggPSBwO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogQHR5cGVkZWYgR2x5cGhPcHRpb25zXG4gKiBAdHlwZSBPYmplY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBUaGUgZ2x5cGggbmFtZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt1bmljb2RlXVxuICogQHByb3BlcnR5IHtBcnJheX0gW3VuaWNvZGVzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt4TWluXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt5TWluXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt4TWF4XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt5TWF4XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFthZHZhbmNlV2lkdGhdXG4gKi9cblxuLy8gQSBHbHlwaCBpcyBhbiBpbmRpdmlkdWFsIG1hcmsgdGhhdCBvZnRlbiBjb3JyZXNwb25kcyB0byBhIGNoYXJhY3Rlci5cbi8vIFNvbWUgZ2x5cGhzLCBzdWNoIGFzIGxpZ2F0dXJlcywgYXJlIGEgY29tYmluYXRpb24gb2YgbWFueSBjaGFyYWN0ZXJzLlxuLy8gR2x5cGhzIGFyZSB0aGUgYmFzaWMgYnVpbGRpbmcgYmxvY2tzIG9mIGEgZm9udC5cbi8vXG4vLyBUaGUgYEdseXBoYCBjbGFzcyBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgZm9yIGRyYXdpbmcgdGhlIHBhdGggYW5kIGl0cyBwb2ludHMuXG4vKipcbiAqIEBleHBvcnRzIG9wZW50eXBlLkdseXBoXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7R2x5cGhPcHRpb25zfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEdseXBoKG9wdGlvbnMpIHtcbiAgICAvLyBCeSBwdXR0aW5nIGFsbCB0aGUgY29kZSBvbiBhIHByb3RvdHlwZSBmdW5jdGlvbiAod2hpY2ggaXMgb25seSBkZWNsYXJlZCBvbmNlKVxuICAgIC8vIHdlIHJlZHVjZSB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgbGFyZ2VyIGZvbnRzIGJ5IHNvbWUgMiVcbiAgICB0aGlzLmJpbmRDb25zdHJ1Y3RvclZhbHVlcyhvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gIHtHbHlwaE9wdGlvbnN9XG4gKi9cbkdseXBoLnByb3RvdHlwZS5iaW5kQ29uc3RydWN0b3JWYWx1ZXMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXggfHwgMDtcblxuICAgIC8vIFRoZXNlIHRocmVlIHZhbHVlcyBjYW5ub3QgYmUgZGVmZXJyZWQgZm9yIG1lbW9yeSBvcHRpbWl6YXRpb246XG4gICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lIHx8IG51bGw7XG4gICAgdGhpcy51bmljb2RlID0gb3B0aW9ucy51bmljb2RlIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVuaWNvZGVzID0gb3B0aW9ucy51bmljb2RlcyB8fCBvcHRpb25zLnVuaWNvZGUgIT09IHVuZGVmaW5lZCA/IFtvcHRpb25zLnVuaWNvZGVdIDogW107XG5cbiAgICAvLyBCdXQgYnkgYmluZGluZyB0aGVzZSB2YWx1ZXMgb25seSB3aGVuIG5lY2Vzc2FyeSwgd2UgcmVkdWNlIGNhblxuICAgIC8vIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGJ5IGFsbW9zdCAzJSBmb3IgbGFyZ2VyIGZvbnRzLlxuICAgIGlmIChvcHRpb25zLnhNaW4pIHtcbiAgICAgICAgdGhpcy54TWluID0gb3B0aW9ucy54TWluO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnlNaW4pIHtcbiAgICAgICAgdGhpcy55TWluID0gb3B0aW9ucy55TWluO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnhNYXgpIHtcbiAgICAgICAgdGhpcy54TWF4ID0gb3B0aW9ucy54TWF4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnlNYXgpIHtcbiAgICAgICAgdGhpcy55TWF4ID0gb3B0aW9ucy55TWF4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFkdmFuY2VXaWR0aCkge1xuICAgICAgICB0aGlzLmFkdmFuY2VXaWR0aCA9IG9wdGlvbnMuYWR2YW5jZVdpZHRoO1xuICAgIH1cblxuICAgIC8vIFRoZSBwYXRoIGZvciBhIGdseXBoIGlzIHRoZSBtb3N0IG1lbW9yeSBpbnRlbnNpdmUsIGFuZCBpcyBib3VuZCBhcyBhIHZhbHVlXG4gICAgLy8gd2l0aCBhIGdldHRlci9zZXR0ZXIgdG8gZW5zdXJlIHdlIGFjdHVhbGx5IGRvIHBhdGggcGFyc2luZyBvbmx5IG9uY2UgdGhlXG4gICAgLy8gcGF0aCBpcyBhY3R1YWxseSBuZWVkZWQgYnkgYW55dGhpbmcuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwYXRoJywgZ2V0UGF0aERlZmluaXRpb24odGhpcywgb3B0aW9ucy5wYXRoKSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfVxuICovXG5HbHlwaC5wcm90b3R5cGUuYWRkVW5pY29kZSA9IGZ1bmN0aW9uKHVuaWNvZGUpIHtcbiAgICBpZiAodGhpcy51bmljb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy51bmljb2RlID0gdW5pY29kZTtcbiAgICB9XG5cbiAgICB0aGlzLnVuaWNvZGVzLnB1c2godW5pY29kZSk7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbWluaW11bSBib3VuZGluZyBib3ggZm9yIHRoaXMgZ2x5cGguXG4gKiBAcmV0dXJuIHtvcGVudHlwZS5Cb3VuZGluZ0JveH1cbiAqL1xuR2x5cGgucHJvdG90eXBlLmdldEJvdW5kaW5nQm94ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aC5nZXRCb3VuZGluZ0JveCgpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBnbHlwaCB0byBhIFBhdGggd2UgY2FuIGRyYXcgb24gYSBkcmF3aW5nIGNvbnRleHQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFt4PTBdIC0gSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LlxuICogQHBhcmFtICB7bnVtYmVyfSBbeT0wXSAtIFZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSAqYmFzZWxpbmUqIG9mIHRoZSB0ZXh0LlxuICogQHBhcmFtICB7bnVtYmVyfSBbZm9udFNpemU9NzJdIC0gRm9udCBzaXplIGluIHBpeGVscy4gV2Ugc2NhbGUgdGhlIGdseXBoIHVuaXRzIGJ5IGAxIC8gdW5pdHNQZXJFbSAqIGZvbnRTaXplYC5cbiAqIEBwYXJhbSAge09iamVjdD19IG9wdGlvbnMgLSB4U2NhbGUsIHlTY2FsZSB0byBzdHJldGNoIHRoZSBnbHlwaC5cbiAqIEBwYXJhbSAge29wZW50eXBlLkZvbnR9IGlmIGhpbnRpbmcgaXMgdG8gYmUgdXNlZCwgdGhlIGZvbnRcbiAqIEByZXR1cm4ge29wZW50eXBlLlBhdGh9XG4gKi9cbkdseXBoLnByb3RvdHlwZS5nZXRQYXRoID0gZnVuY3Rpb24oeCwgeSwgZm9udFNpemUsIG9wdGlvbnMsIGZvbnQpIHtcbiAgICB4ID0geCAhPT0gdW5kZWZpbmVkID8geCA6IDA7XG4gICAgeSA9IHkgIT09IHVuZGVmaW5lZCA/IHkgOiAwO1xuICAgIGZvbnRTaXplID0gZm9udFNpemUgIT09IHVuZGVmaW5lZCA/IGZvbnRTaXplIDogNzI7XG4gICAgdmFyIGNvbW1hbmRzO1xuICAgIHZhciBoUG9pbnRzO1xuICAgIGlmICghb3B0aW9ucykgeyBvcHRpb25zID0geyB9OyB9XG4gICAgdmFyIHhTY2FsZSA9IG9wdGlvbnMueFNjYWxlO1xuICAgIHZhciB5U2NhbGUgPSBvcHRpb25zLnlTY2FsZTtcblxuICAgIGlmIChvcHRpb25zLmhpbnRpbmcgJiYgZm9udCAmJiBmb250LmhpbnRpbmcpIHtcbiAgICAgICAgLy8gaW4gY2FzZSBvZiBoaW50aW5nLCB0aGUgaGludGluZyBlbmdpbmUgdGFrZXMgY2FyZVxuICAgICAgICAvLyBvZiBzY2FsaW5nIHRoZSBwb2ludHMgKG5vdCB0aGUgcGF0aCkgYmVmb3JlIGhpbnRpbmcuXG4gICAgICAgIGhQb2ludHMgPSB0aGlzLnBhdGggJiYgZm9udC5oaW50aW5nLmV4ZWModGhpcywgZm9udFNpemUpO1xuICAgICAgICAvLyBpbiBjYXNlIHRoZSBoaW50aW5nIGVuZ2luZSBmYWlsZWQgaFBvaW50cyBpcyB1bmRlZmluZWRcbiAgICAgICAgLy8gYW5kIHRodXMgcmV2ZXJ0cyB0byBwbGFpbiByZW5kaW5nXG4gICAgfVxuXG4gICAgaWYgKGhQb2ludHMpIHtcbiAgICAgICAgY29tbWFuZHMgPSBnbHlmLmdldFBhdGgoaFBvaW50cykuY29tbWFuZHM7XG4gICAgICAgIHggPSBNYXRoLnJvdW5kKHgpO1xuICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcbiAgICAgICAgLy8gVE9ETyBpbiBjYXNlIG9mIGhpbnRpbmcgeHlTY2FsaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4gICAgICAgIHhTY2FsZSA9IHlTY2FsZSA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29tbWFuZHMgPSB0aGlzLnBhdGguY29tbWFuZHM7XG4gICAgICAgIHZhciBzY2FsZSA9IDEgLyB0aGlzLnBhdGgudW5pdHNQZXJFbSAqIGZvbnRTaXplO1xuICAgICAgICBpZiAoeFNjYWxlID09PSB1bmRlZmluZWQpIHsgeFNjYWxlID0gc2NhbGU7IH1cbiAgICAgICAgaWYgKHlTY2FsZSA9PT0gdW5kZWZpbmVkKSB7IHlTY2FsZSA9IHNjYWxlOyB9XG4gICAgfVxuXG4gICAgdmFyIHAgPSBuZXcgUGF0aCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGNtZCA9IGNvbW1hbmRzW2ldO1xuICAgICAgICBpZiAoY21kLnR5cGUgPT09ICdNJykge1xuICAgICAgICAgICAgcC5tb3ZlVG8oeCArIChjbWQueCAqIHhTY2FsZSksIHkgKyAoLWNtZC55ICogeVNjYWxlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY21kLnR5cGUgPT09ICdMJykge1xuICAgICAgICAgICAgcC5saW5lVG8oeCArIChjbWQueCAqIHhTY2FsZSksIHkgKyAoLWNtZC55ICogeVNjYWxlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY21kLnR5cGUgPT09ICdRJykge1xuICAgICAgICAgICAgcC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyAoY21kLngxICogeFNjYWxlKSwgeSArICgtY21kLnkxICogeVNjYWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICsgKGNtZC54ICogeFNjYWxlKSwgeSArICgtY21kLnkgKiB5U2NhbGUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjbWQudHlwZSA9PT0gJ0MnKSB7XG4gICAgICAgICAgICBwLmN1cnZlVG8oeCArIChjbWQueDEgKiB4U2NhbGUpLCB5ICsgKC1jbWQueTEgKiB5U2NhbGUpLFxuICAgICAgICAgICAgICAgICAgICAgIHggKyAoY21kLngyICogeFNjYWxlKSwgeSArICgtY21kLnkyICogeVNjYWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICB4ICsgKGNtZC54ICogeFNjYWxlKSwgeSArICgtY21kLnkgKiB5U2NhbGUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjbWQudHlwZSA9PT0gJ1onKSB7XG4gICAgICAgICAgICBwLmNsb3NlUGF0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHA7XG59O1xuXG4vKipcbiAqIFNwbGl0IHRoZSBnbHlwaCBpbnRvIGNvbnRvdXJzLlxuICogVGhpcyBmdW5jdGlvbiBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYW5kIHRvXG4gKiBwcm92aWRlIHJhdyBhY2Nlc3MgdG8gdGhlIFRydWVUeXBlIGdseXBoIG91dGxpbmVzLlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbkdseXBoLnByb3RvdHlwZS5nZXRDb250b3VycyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMucG9pbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHZhciBjb250b3VycyA9IFtdO1xuICAgIHZhciBjdXJyZW50Q29udG91ciA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wb2ludHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIHB0ID0gdGhpcyQxLnBvaW50c1tpXTtcbiAgICAgICAgY3VycmVudENvbnRvdXIucHVzaChwdCk7XG4gICAgICAgIGlmIChwdC5sYXN0UG9pbnRPZkNvbnRvdXIpIHtcbiAgICAgICAgICAgIGNvbnRvdXJzLnB1c2goY3VycmVudENvbnRvdXIpO1xuICAgICAgICAgICAgY3VycmVudENvbnRvdXIgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrLmFyZ3VtZW50KGN1cnJlbnRDb250b3VyLmxlbmd0aCA9PT0gMCwgJ1RoZXJlIGFyZSBzdGlsbCBwb2ludHMgbGVmdCBpbiB0aGUgY3VycmVudCBjb250b3VyLicpO1xuICAgIHJldHVybiBjb250b3Vycztcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSB4TWluL3lNaW4veE1heC95TWF4L2xzYi9yc2IgZm9yIGEgR2x5cGguXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbkdseXBoLnByb3RvdHlwZS5nZXRNZXRyaWNzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvbW1hbmRzID0gdGhpcy5wYXRoLmNvbW1hbmRzO1xuICAgIHZhciB4Q29vcmRzID0gW107XG4gICAgdmFyIHlDb29yZHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjbWQgPSBjb21tYW5kc1tpXTtcbiAgICAgICAgaWYgKGNtZC50eXBlICE9PSAnWicpIHtcbiAgICAgICAgICAgIHhDb29yZHMucHVzaChjbWQueCk7XG4gICAgICAgICAgICB5Q29vcmRzLnB1c2goY21kLnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNtZC50eXBlID09PSAnUScgfHwgY21kLnR5cGUgPT09ICdDJykge1xuICAgICAgICAgICAgeENvb3Jkcy5wdXNoKGNtZC54MSk7XG4gICAgICAgICAgICB5Q29vcmRzLnB1c2goY21kLnkxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbWQudHlwZSA9PT0gJ0MnKSB7XG4gICAgICAgICAgICB4Q29vcmRzLnB1c2goY21kLngyKTtcbiAgICAgICAgICAgIHlDb29yZHMucHVzaChjbWQueTIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1ldHJpY3MgPSB7XG4gICAgICAgIHhNaW46IE1hdGgubWluLmFwcGx5KG51bGwsIHhDb29yZHMpLFxuICAgICAgICB5TWluOiBNYXRoLm1pbi5hcHBseShudWxsLCB5Q29vcmRzKSxcbiAgICAgICAgeE1heDogTWF0aC5tYXguYXBwbHkobnVsbCwgeENvb3JkcyksXG4gICAgICAgIHlNYXg6IE1hdGgubWF4LmFwcGx5KG51bGwsIHlDb29yZHMpLFxuICAgICAgICBsZWZ0U2lkZUJlYXJpbmc6IHRoaXMubGVmdFNpZGVCZWFyaW5nXG4gICAgfTtcblxuICAgIGlmICghaXNGaW5pdGUobWV0cmljcy54TWluKSkge1xuICAgICAgICBtZXRyaWNzLnhNaW4gPSAwO1xuICAgIH1cblxuICAgIGlmICghaXNGaW5pdGUobWV0cmljcy54TWF4KSkge1xuICAgICAgICBtZXRyaWNzLnhNYXggPSB0aGlzLmFkdmFuY2VXaWR0aDtcbiAgICB9XG5cbiAgICBpZiAoIWlzRmluaXRlKG1ldHJpY3MueU1pbikpIHtcbiAgICAgICAgbWV0cmljcy55TWluID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIWlzRmluaXRlKG1ldHJpY3MueU1heCkpIHtcbiAgICAgICAgbWV0cmljcy55TWF4ID0gMDtcbiAgICB9XG5cbiAgICBtZXRyaWNzLnJpZ2h0U2lkZUJlYXJpbmcgPSB0aGlzLmFkdmFuY2VXaWR0aCAtIG1ldHJpY3MubGVmdFNpZGVCZWFyaW5nIC0gKG1ldHJpY3MueE1heCAtIG1ldHJpY3MueE1pbik7XG4gICAgcmV0dXJuIG1ldHJpY3M7XG59O1xuXG4vKipcbiAqIERyYXcgdGhlIGdseXBoIG9uIHRoZSBnaXZlbiBjb250ZXh0LlxuICogQHBhcmFtICB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHggLSBBIDJEIGRyYXdpbmcgY29udGV4dCwgbGlrZSBDYW52YXMuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFt4PTBdIC0gSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LlxuICogQHBhcmFtICB7bnVtYmVyfSBbeT0wXSAtIFZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSAqYmFzZWxpbmUqIG9mIHRoZSB0ZXh0LlxuICogQHBhcmFtICB7bnVtYmVyfSBbZm9udFNpemU9NzJdIC0gRm9udCBzaXplIGluIHBpeGVscy4gV2Ugc2NhbGUgdGhlIGdseXBoIHVuaXRzIGJ5IGAxIC8gdW5pdHNQZXJFbSAqIGZvbnRTaXplYC5cbiAqIEBwYXJhbSAge09iamVjdD19IG9wdGlvbnMgLSB4U2NhbGUsIHlTY2FsZSB0byBzdHJldGNoIHRoZSBnbHlwaC5cbiAqL1xuR2x5cGgucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihjdHgsIHgsIHksIGZvbnRTaXplLCBvcHRpb25zKSB7XG4gICAgdGhpcy5nZXRQYXRoKHgsIHksIGZvbnRTaXplLCBvcHRpb25zKS5kcmF3KGN0eCk7XG59O1xuXG4vKipcbiAqIERyYXcgdGhlIHBvaW50cyBvZiB0aGUgZ2x5cGguXG4gKiBPbi1jdXJ2ZSBwb2ludHMgd2lsbCBiZSBkcmF3biBpbiBibHVlLCBvZmYtY3VydmUgcG9pbnRzIHdpbGwgYmUgZHJhd24gaW4gcmVkLlxuICogQHBhcmFtICB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHggLSBBIDJEIGRyYXdpbmcgY29udGV4dCwgbGlrZSBDYW52YXMuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFt4PTBdIC0gSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LlxuICogQHBhcmFtICB7bnVtYmVyfSBbeT0wXSAtIFZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSAqYmFzZWxpbmUqIG9mIHRoZSB0ZXh0LlxuICogQHBhcmFtICB7bnVtYmVyfSBbZm9udFNpemU9NzJdIC0gRm9udCBzaXplIGluIHBpeGVscy4gV2Ugc2NhbGUgdGhlIGdseXBoIHVuaXRzIGJ5IGAxIC8gdW5pdHNQZXJFbSAqIGZvbnRTaXplYC5cbiAqL1xuR2x5cGgucHJvdG90eXBlLmRyYXdQb2ludHMgPSBmdW5jdGlvbihjdHgsIHgsIHksIGZvbnRTaXplKSB7XG4gICAgZnVuY3Rpb24gZHJhd0NpcmNsZXMobCwgeCwgeSwgc2NhbGUpIHtcbiAgICAgICAgdmFyIFBJX1NRID0gTWF0aC5QSSAqIDI7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICBjdHgubW92ZVRvKHggKyAobFtqXS54ICogc2NhbGUpLCB5ICsgKGxbal0ueSAqIHNjYWxlKSk7XG4gICAgICAgICAgICBjdHguYXJjKHggKyAobFtqXS54ICogc2NhbGUpLCB5ICsgKGxbal0ueSAqIHNjYWxlKSwgMiwgMCwgUElfU1EsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICB9XG5cbiAgICB4ID0geCAhPT0gdW5kZWZpbmVkID8geCA6IDA7XG4gICAgeSA9IHkgIT09IHVuZGVmaW5lZCA/IHkgOiAwO1xuICAgIGZvbnRTaXplID0gZm9udFNpemUgIT09IHVuZGVmaW5lZCA/IGZvbnRTaXplIDogMjQ7XG4gICAgdmFyIHNjYWxlID0gMSAvIHRoaXMucGF0aC51bml0c1BlckVtICogZm9udFNpemU7XG5cbiAgICB2YXIgYmx1ZUNpcmNsZXMgPSBbXTtcbiAgICB2YXIgcmVkQ2lyY2xlcyA9IFtdO1xuICAgIHZhciBwYXRoID0gdGhpcy5wYXRoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5jb21tYW5kcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgY21kID0gcGF0aC5jb21tYW5kc1tpXTtcbiAgICAgICAgaWYgKGNtZC54ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJsdWVDaXJjbGVzLnB1c2goe3g6IGNtZC54LCB5OiAtY21kLnl9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbWQueDEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVkQ2lyY2xlcy5wdXNoKHt4OiBjbWQueDEsIHk6IC1jbWQueTF9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbWQueDIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVkQ2lyY2xlcy5wdXNoKHt4OiBjbWQueDIsIHk6IC1jbWQueTJ9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGN0eC5maWxsU3R5bGUgPSAnYmx1ZSc7XG4gICAgZHJhd0NpcmNsZXMoYmx1ZUNpcmNsZXMsIHgsIHksIHNjYWxlKTtcbiAgICBjdHguZmlsbFN0eWxlID0gJ3JlZCc7XG4gICAgZHJhd0NpcmNsZXMocmVkQ2lyY2xlcywgeCwgeSwgc2NhbGUpO1xufTtcblxuLyoqXG4gKiBEcmF3IGxpbmVzIGluZGljYXRpbmcgaW1wb3J0YW50IGZvbnQgbWVhc3VyZW1lbnRzLlxuICogQmxhY2sgbGluZXMgaW5kaWNhdGUgdGhlIG9yaWdpbiBvZiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gKHBvaW50IDAsMCkuXG4gKiBCbHVlIGxpbmVzIGluZGljYXRlIHRoZSBnbHlwaCBib3VuZGluZyBib3guXG4gKiBHcmVlbiBsaW5lIGluZGljYXRlcyB0aGUgYWR2YW5jZSB3aWR0aCBvZiB0aGUgZ2x5cGguXG4gKiBAcGFyYW0gIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCAtIEEgMkQgZHJhd2luZyBjb250ZXh0LCBsaWtlIENhbnZhcy5cbiAqIEBwYXJhbSAge251bWJlcn0gW3g9MF0gLSBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFt5PTBdIC0gVmVydGljYWwgcG9zaXRpb24gb2YgdGhlICpiYXNlbGluZSogb2YgdGhlIHRleHQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFtmb250U2l6ZT03Ml0gLSBGb250IHNpemUgaW4gcGl4ZWxzLiBXZSBzY2FsZSB0aGUgZ2x5cGggdW5pdHMgYnkgYDEgLyB1bml0c1BlckVtICogZm9udFNpemVgLlxuICovXG5HbHlwaC5wcm90b3R5cGUuZHJhd01ldHJpY3MgPSBmdW5jdGlvbihjdHgsIHgsIHksIGZvbnRTaXplKSB7XG4gICAgdmFyIHNjYWxlO1xuICAgIHggPSB4ICE9PSB1bmRlZmluZWQgPyB4IDogMDtcbiAgICB5ID0geSAhPT0gdW5kZWZpbmVkID8geSA6IDA7XG4gICAgZm9udFNpemUgPSBmb250U2l6ZSAhPT0gdW5kZWZpbmVkID8gZm9udFNpemUgOiAyNDtcbiAgICBzY2FsZSA9IDEgLyB0aGlzLnBhdGgudW5pdHNQZXJFbSAqIGZvbnRTaXplO1xuICAgIGN0eC5saW5lV2lkdGggPSAxO1xuXG4gICAgLy8gRHJhdyB0aGUgb3JpZ2luXG4gICAgY3R4LnN0cm9rZVN0eWxlID0gJ2JsYWNrJztcbiAgICBkcmF3LmxpbmUoY3R4LCB4LCAtMTAwMDAsIHgsIDEwMDAwKTtcbiAgICBkcmF3LmxpbmUoY3R4LCAtMTAwMDAsIHksIDEwMDAwLCB5KTtcblxuICAgIC8vIFRoaXMgY29kZSBpcyBoZXJlIGR1ZSB0byBtZW1vcnkgb3B0aW1pemF0aW9uOiBieSBub3QgdXNpbmdcbiAgICAvLyBkZWZhdWx0cyBpbiB0aGUgY29uc3RydWN0b3IsIHdlIHNhdmUgYSBub3RhYmxlIGFtb3VudCBvZiBtZW1vcnkuXG4gICAgdmFyIHhNaW4gPSB0aGlzLnhNaW4gfHwgMDtcbiAgICB2YXIgeU1pbiA9IHRoaXMueU1pbiB8fCAwO1xuICAgIHZhciB4TWF4ID0gdGhpcy54TWF4IHx8IDA7XG4gICAgdmFyIHlNYXggPSB0aGlzLnlNYXggfHwgMDtcbiAgICB2YXIgYWR2YW5jZVdpZHRoID0gdGhpcy5hZHZhbmNlV2lkdGggfHwgMDtcblxuICAgIC8vIERyYXcgdGhlIGdseXBoIGJveFxuICAgIGN0eC5zdHJva2VTdHlsZSA9ICdibHVlJztcbiAgICBkcmF3LmxpbmUoY3R4LCB4ICsgKHhNaW4gKiBzY2FsZSksIC0xMDAwMCwgeCArICh4TWluICogc2NhbGUpLCAxMDAwMCk7XG4gICAgZHJhdy5saW5lKGN0eCwgeCArICh4TWF4ICogc2NhbGUpLCAtMTAwMDAsIHggKyAoeE1heCAqIHNjYWxlKSwgMTAwMDApO1xuICAgIGRyYXcubGluZShjdHgsIC0xMDAwMCwgeSArICgteU1pbiAqIHNjYWxlKSwgMTAwMDAsIHkgKyAoLXlNaW4gKiBzY2FsZSkpO1xuICAgIGRyYXcubGluZShjdHgsIC0xMDAwMCwgeSArICgteU1heCAqIHNjYWxlKSwgMTAwMDAsIHkgKyAoLXlNYXggKiBzY2FsZSkpO1xuXG4gICAgLy8gRHJhdyB0aGUgYWR2YW5jZSB3aWR0aFxuICAgIGN0eC5zdHJva2VTdHlsZSA9ICdncmVlbic7XG4gICAgZHJhdy5saW5lKGN0eCwgeCArIChhZHZhbmNlV2lkdGggKiBzY2FsZSksIC0xMDAwMCwgeCArIChhZHZhbmNlV2lkdGggKiBzY2FsZSksIDEwMDAwKTtcbn07XG5cbi8vIFRoZSBHbHlwaFNldCBvYmplY3RcblxuLy8gRGVmaW5lIGEgcHJvcGVydHkgb24gdGhlIGdseXBoIHRoYXQgZGVwZW5kcyBvbiB0aGUgcGF0aCBiZWluZyBsb2FkZWQuXG5mdW5jdGlvbiBkZWZpbmVEZXBlbmRlbnRQcm9wZXJ0eShnbHlwaCwgZXh0ZXJuYWxOYW1lLCBpbnRlcm5hbE5hbWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2x5cGgsIGV4dGVybmFsTmFtZSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gUmVxdWVzdCB0aGUgcGF0aCBwcm9wZXJ0eSB0byBtYWtlIHN1cmUgdGhlIHBhdGggaXMgbG9hZGVkLlxuICAgICAgICAgICAgZ2x5cGgucGF0aDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICByZXR1cm4gZ2x5cGhbaW50ZXJuYWxOYW1lXTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbihuZXdWYWx1ZSkge1xuICAgICAgICAgICAgZ2x5cGhbaW50ZXJuYWxOYW1lXSA9IG5ld1ZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIEdseXBoU2V0IHJlcHJlc2VudHMgYWxsIGdseXBocyBhdmFpbGFibGUgaW4gdGhlIGZvbnQsIGJ1dCBtb2RlbGxlZCB1c2luZ1xuICogYSBkZWZlcnJlZCBnbHlwaCBsb2FkZXIsIGZvciByZXRyaWV2aW5nIGdseXBocyBvbmx5IG9uY2UgdGhleSBhcmUgYWJzb2x1dGVseVxuICogbmVjZXNzYXJ5LCB0byBrZWVwIHRoZSBtZW1vcnkgZm9vdHByaW50IGRvd24uXG4gKiBAZXhwb3J0cyBvcGVudHlwZS5HbHlwaFNldFxuICogQGNsYXNzXG4gKiBAcGFyYW0ge29wZW50eXBlLkZvbnR9XG4gKiBAcGFyYW0ge0FycmF5fVxuICovXG5mdW5jdGlvbiBHbHlwaFNldChmb250LCBnbHlwaHMpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5nbHlwaHMgPSB7fTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShnbHlwaHMpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzJDEuZ2x5cGhzW2ldID0gZ2x5cGhzW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSAoZ2x5cGhzICYmIGdseXBocy5sZW5ndGgpIHx8IDA7XG59XG5cbi8qKlxuICogQHBhcmFtICB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7b3BlbnR5cGUuR2x5cGh9XG4gKi9cbkdseXBoU2V0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpbmRleCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5nbHlwaHNbaW5kZXhdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuZ2x5cGhzW2luZGV4XSA9IHRoaXMuZ2x5cGhzW2luZGV4XSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdseXBoc1tpbmRleF07XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSAge09iamVjdH1cbiAqL1xuR2x5cGhTZXQucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihpbmRleCwgbG9hZGVyKSB7XG4gICAgdGhpcy5nbHlwaHNbaW5kZXhdID0gbG9hZGVyO1xuICAgIHRoaXMubGVuZ3RoKys7XG59O1xuXG4vKipcbiAqIEBhbGlhcyBvcGVudHlwZS5nbHlwaExvYWRlclxuICogQHBhcmFtICB7b3BlbnR5cGUuRm9udH0gZm9udFxuICogQHBhcmFtICB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7b3BlbnR5cGUuR2x5cGh9XG4gKi9cbmZ1bmN0aW9uIGdseXBoTG9hZGVyKGZvbnQsIGluZGV4KSB7XG4gICAgcmV0dXJuIG5ldyBHbHlwaCh7aW5kZXg6IGluZGV4LCBmb250OiBmb250fSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBzdHViIGdseXBoIHRoYXQgY2FuIGJlIGZpbGxlZCB3aXRoIGFsbCBtZXRhZGF0YSAqZXhjZXB0KlxuICogdGhlIFwicG9pbnRzXCIgYW5kIFwicGF0aFwiIHByb3BlcnRpZXMsIHdoaWNoIG11c3QgYmUgbG9hZGVkIG9ubHkgb25jZVxuICogdGhlIGdseXBoJ3MgcGF0aCBpcyBhY3R1YWxseSByZXF1ZXN0ZWQgZm9yIHRleHQgc2hhcGluZy5cbiAqIEBhbGlhcyBvcGVudHlwZS50dGZHbHlwaExvYWRlclxuICogQHBhcmFtICB7b3BlbnR5cGUuRm9udH0gZm9udFxuICogQHBhcmFtICB7bnVtYmVyfSBpbmRleFxuICogQHBhcmFtICB7RnVuY3Rpb259IHBhcnNlR2x5cGhcbiAqIEBwYXJhbSAge09iamVjdH0gZGF0YVxuICogQHBhcmFtICB7bnVtYmVyfSBwb3NpdGlvblxuICogQHBhcmFtICB7RnVuY3Rpb259IGJ1aWxkUGF0aFxuICogQHJldHVybiB7b3BlbnR5cGUuR2x5cGh9XG4gKi9cbmZ1bmN0aW9uIHR0ZkdseXBoTG9hZGVyKGZvbnQsIGluZGV4LCBwYXJzZUdseXBoLCBkYXRhLCBwb3NpdGlvbiwgYnVpbGRQYXRoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZ2x5cGggPSBuZXcgR2x5cGgoe2luZGV4OiBpbmRleCwgZm9udDogZm9udH0pO1xuXG4gICAgICAgIGdseXBoLnBhdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHBhcnNlR2x5cGgoZ2x5cGgsIGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIHZhciBwYXRoID0gYnVpbGRQYXRoKGZvbnQuZ2x5cGhzLCBnbHlwaCk7XG4gICAgICAgICAgICBwYXRoLnVuaXRzUGVyRW0gPSBmb250LnVuaXRzUGVyRW07XG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfTtcblxuICAgICAgICBkZWZpbmVEZXBlbmRlbnRQcm9wZXJ0eShnbHlwaCwgJ3hNaW4nLCAnX3hNaW4nKTtcbiAgICAgICAgZGVmaW5lRGVwZW5kZW50UHJvcGVydHkoZ2x5cGgsICd4TWF4JywgJ194TWF4Jyk7XG4gICAgICAgIGRlZmluZURlcGVuZGVudFByb3BlcnR5KGdseXBoLCAneU1pbicsICdfeU1pbicpO1xuICAgICAgICBkZWZpbmVEZXBlbmRlbnRQcm9wZXJ0eShnbHlwaCwgJ3lNYXgnLCAnX3lNYXgnKTtcblxuICAgICAgICByZXR1cm4gZ2x5cGg7XG4gICAgfTtcbn1cbi8qKlxuICogQGFsaWFzIG9wZW50eXBlLmNmZkdseXBoTG9hZGVyXG4gKiBAcGFyYW0gIHtvcGVudHlwZS5Gb250fSBmb250XG4gKiBAcGFyYW0gIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gcGFyc2VDRkZDaGFyc3RyaW5nXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNoYXJzdHJpbmdcbiAqIEByZXR1cm4ge29wZW50eXBlLkdseXBofVxuICovXG5mdW5jdGlvbiBjZmZHbHlwaExvYWRlcihmb250LCBpbmRleCwgcGFyc2VDRkZDaGFyc3RyaW5nLCBjaGFyc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZ2x5cGggPSBuZXcgR2x5cGgoe2luZGV4OiBpbmRleCwgZm9udDogZm9udH0pO1xuXG4gICAgICAgIGdseXBoLnBhdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBwYXRoID0gcGFyc2VDRkZDaGFyc3RyaW5nKGZvbnQsIGdseXBoLCBjaGFyc3RyaW5nKTtcbiAgICAgICAgICAgIHBhdGgudW5pdHNQZXJFbSA9IGZvbnQudW5pdHNQZXJFbTtcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBnbHlwaDtcbiAgICB9O1xufVxuXG52YXIgZ2x5cGhzZXQgPSB7IEdseXBoU2V0OiBHbHlwaFNldCwgZ2x5cGhMb2FkZXI6IGdseXBoTG9hZGVyLCB0dGZHbHlwaExvYWRlcjogdHRmR2x5cGhMb2FkZXIsIGNmZkdseXBoTG9hZGVyOiBjZmZHbHlwaExvYWRlciB9O1xuXG4vLyBUaGUgYENGRmAgdGFibGUgY29udGFpbnMgdGhlIGdseXBoIG91dGxpbmVzIGluIFBvc3RTY3JpcHQgZm9ybWF0LlxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9jZmYuaHRtXG4vLyBodHRwOi8vZG93bmxvYWQubWljcm9zb2Z0LmNvbS9kb3dubG9hZC84LzAvMS84MDFhMTkxYy0wMjlkLTRhZjMtOTY0Mi01NTVmNmZlNTE0ZWUvY2ZmLnBkZlxuLy8gaHR0cDovL2Rvd25sb2FkLm1pY3Jvc29mdC5jb20vZG93bmxvYWQvOC8wLzEvODAxYTE5MWMtMDI5ZC00YWYzLTk2NDItNTU1ZjZmZTUxNGVlL3R5cGUyLnBkZlxuXG4vLyBDdXN0b20gZXF1YWxzIGZ1bmN0aW9uIHRoYXQgY2FuIGFsc28gY2hlY2sgbGlzdHMuXG5mdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKCFlcXVhbHMoYVtpXSwgYltpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBTdWJyb3V0aW5lcyBhcmUgZW5jb2RlZCB1c2luZyB0aGUgbmVnYXRpdmUgaGFsZiBvZiB0aGUgbnVtYmVyIHNwYWNlLlxuLy8gU2VlIHR5cGUgMiBjaGFwdGVyIDQuNyBcIlN1YnJvdXRpbmUgb3BlcmF0b3JzXCIuXG5mdW5jdGlvbiBjYWxjQ0ZGU3Vicm91dGluZUJpYXMoc3VicnMpIHtcbiAgICB2YXIgYmlhcztcbiAgICBpZiAoc3VicnMubGVuZ3RoIDwgMTI0MCkge1xuICAgICAgICBiaWFzID0gMTA3O1xuICAgIH0gZWxzZSBpZiAoc3VicnMubGVuZ3RoIDwgMzM5MDApIHtcbiAgICAgICAgYmlhcyA9IDExMzE7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYmlhcyA9IDMyNzY4O1xuICAgIH1cblxuICAgIHJldHVybiBiaWFzO1xufVxuXG4vLyBQYXJzZSBhIGBDRkZgIElOREVYIGFycmF5LlxuLy8gQW4gaW5kZXggYXJyYXkgY29uc2lzdHMgb2YgYSBsaXN0IG9mIG9mZnNldHMsIHRoZW4gYSBsaXN0IG9mIG9iamVjdHMgYXQgdGhvc2Ugb2Zmc2V0cy5cbmZ1bmN0aW9uIHBhcnNlQ0ZGSW5kZXgoZGF0YSwgc3RhcnQsIGNvbnZlcnNpb25Gbikge1xuICAgIHZhciBvZmZzZXRzID0gW107XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICB2YXIgY291bnQgPSBwYXJzZS5nZXRDYXJkMTYoZGF0YSwgc3RhcnQpO1xuICAgIHZhciBvYmplY3RPZmZzZXQ7XG4gICAgdmFyIGVuZE9mZnNldDtcbiAgICBpZiAoY291bnQgIT09IDApIHtcbiAgICAgICAgdmFyIG9mZnNldFNpemUgPSBwYXJzZS5nZXRCeXRlKGRhdGEsIHN0YXJ0ICsgMik7XG4gICAgICAgIG9iamVjdE9mZnNldCA9IHN0YXJ0ICsgKChjb3VudCArIDEpICogb2Zmc2V0U2l6ZSkgKyAyO1xuICAgICAgICB2YXIgcG9zID0gc3RhcnQgKyAzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50ICsgMTsgaSArPSAxKSB7XG4gICAgICAgICAgICBvZmZzZXRzLnB1c2gocGFyc2UuZ2V0T2Zmc2V0KGRhdGEsIHBvcywgb2Zmc2V0U2l6ZSkpO1xuICAgICAgICAgICAgcG9zICs9IG9mZnNldFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgaW5kZXggYXJyYXkgaXMgNCBoZWFkZXIgYnl0ZXMgKyB0aGUgdmFsdWUgb2YgdGhlIGxhc3Qgb2Zmc2V0LlxuICAgICAgICBlbmRPZmZzZXQgPSBvYmplY3RPZmZzZXQgKyBvZmZzZXRzW2NvdW50XTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBlbmRPZmZzZXQgPSBzdGFydCArIDI7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgb2Zmc2V0cy5sZW5ndGggLSAxOyBpJDEgKz0gMSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJzZS5nZXRCeXRlcyhkYXRhLCBvYmplY3RPZmZzZXQgKyBvZmZzZXRzW2kkMV0sIG9iamVjdE9mZnNldCArIG9mZnNldHNbaSQxICsgMV0pO1xuICAgICAgICBpZiAoY29udmVyc2lvbkZuKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGNvbnZlcnNpb25Gbih2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvYmplY3RzLnB1c2godmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7b2JqZWN0czogb2JqZWN0cywgc3RhcnRPZmZzZXQ6IHN0YXJ0LCBlbmRPZmZzZXQ6IGVuZE9mZnNldH07XG59XG5cbi8vIFBhcnNlIGEgYENGRmAgRElDVCByZWFsIHZhbHVlLlxuZnVuY3Rpb24gcGFyc2VGbG9hdE9wZXJhbmQocGFyc2VyKSB7XG4gICAgdmFyIHMgPSAnJztcbiAgICB2YXIgZW9mID0gMTU7XG4gICAgdmFyIGxvb2t1cCA9IFsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcuJywgJ0UnLCAnRS0nLCBudWxsLCAnLSddO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBiID0gcGFyc2VyLnBhcnNlQnl0ZSgpO1xuICAgICAgICB2YXIgbjEgPSBiID4+IDQ7XG4gICAgICAgIHZhciBuMiA9IGIgJiAxNTtcblxuICAgICAgICBpZiAobjEgPT09IGVvZikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzICs9IGxvb2t1cFtuMV07XG5cbiAgICAgICAgaWYgKG4yID09PSBlb2YpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcyArPSBsb29rdXBbbjJdO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZUZsb2F0KHMpO1xufVxuXG4vLyBQYXJzZSBhIGBDRkZgIERJQ1Qgb3BlcmFuZC5cbmZ1bmN0aW9uIHBhcnNlT3BlcmFuZChwYXJzZXIsIGIwKSB7XG4gICAgdmFyIGIxO1xuICAgIHZhciBiMjtcbiAgICB2YXIgYjM7XG4gICAgdmFyIGI0O1xuICAgIGlmIChiMCA9PT0gMjgpIHtcbiAgICAgICAgYjEgPSBwYXJzZXIucGFyc2VCeXRlKCk7XG4gICAgICAgIGIyID0gcGFyc2VyLnBhcnNlQnl0ZSgpO1xuICAgICAgICByZXR1cm4gYjEgPDwgOCB8IGIyO1xuICAgIH1cblxuICAgIGlmIChiMCA9PT0gMjkpIHtcbiAgICAgICAgYjEgPSBwYXJzZXIucGFyc2VCeXRlKCk7XG4gICAgICAgIGIyID0gcGFyc2VyLnBhcnNlQnl0ZSgpO1xuICAgICAgICBiMyA9IHBhcnNlci5wYXJzZUJ5dGUoKTtcbiAgICAgICAgYjQgPSBwYXJzZXIucGFyc2VCeXRlKCk7XG4gICAgICAgIHJldHVybiBiMSA8PCAyNCB8IGIyIDw8IDE2IHwgYjMgPDwgOCB8IGI0O1xuICAgIH1cblxuICAgIGlmIChiMCA9PT0gMzApIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXRPcGVyYW5kKHBhcnNlcik7XG4gICAgfVxuXG4gICAgaWYgKGIwID49IDMyICYmIGIwIDw9IDI0Nikge1xuICAgICAgICByZXR1cm4gYjAgLSAxMzk7XG4gICAgfVxuXG4gICAgaWYgKGIwID49IDI0NyAmJiBiMCA8PSAyNTApIHtcbiAgICAgICAgYjEgPSBwYXJzZXIucGFyc2VCeXRlKCk7XG4gICAgICAgIHJldHVybiAoYjAgLSAyNDcpICogMjU2ICsgYjEgKyAxMDg7XG4gICAgfVxuXG4gICAgaWYgKGIwID49IDI1MSAmJiBiMCA8PSAyNTQpIHtcbiAgICAgICAgYjEgPSBwYXJzZXIucGFyc2VCeXRlKCk7XG4gICAgICAgIHJldHVybiAtKGIwIC0gMjUxKSAqIDI1NiAtIGIxIC0gMTA4O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiMCAnICsgYjApO1xufVxuXG4vLyBDb252ZXJ0IHRoZSBlbnRyaWVzIHJldHVybmVkIGJ5IGBwYXJzZURpY3RgIHRvIGEgcHJvcGVyIGRpY3Rpb25hcnkuXG4vLyBJZiBhIHZhbHVlIGlzIGEgbGlzdCBvZiBvbmUsIGl0IGlzIHVucGFja2VkLlxuZnVuY3Rpb24gZW50cmllc1RvT2JqZWN0KGVudHJpZXMpIHtcbiAgICB2YXIgbyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIga2V5ID0gZW50cmllc1tpXVswXTtcbiAgICAgICAgdmFyIHZhbHVlcyA9IGVudHJpZXNbaV1bMV07XG4gICAgICAgIHZhciB2YWx1ZSA9ICh2b2lkIDApO1xuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvLmhhc093blByb3BlcnR5KGtleSkgJiYgIWlzTmFOKG9ba2V5XSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT2JqZWN0ICcgKyBvICsgJyBhbHJlYWR5IGhhcyBrZXkgJyArIGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBvW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbztcbn1cblxuLy8gUGFyc2UgYSBgQ0ZGYCBESUNUIG9iamVjdC5cbi8vIEEgZGljdGlvbmFyeSBjb250YWlucyBrZXktdmFsdWUgcGFpcnMgaW4gYSBjb21wYWN0IHRva2VuaXplZCBmb3JtYXQuXG5mdW5jdGlvbiBwYXJzZUNGRkRpY3QoZGF0YSwgc3RhcnQsIHNpemUpIHtcbiAgICBzdGFydCA9IHN0YXJ0ICE9PSB1bmRlZmluZWQgPyBzdGFydCA6IDA7XG4gICAgdmFyIHBhcnNlciA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgdmFyIG9wZXJhbmRzID0gW107XG4gICAgc2l6ZSA9IHNpemUgIT09IHVuZGVmaW5lZCA/IHNpemUgOiBkYXRhLmxlbmd0aDtcblxuICAgIHdoaWxlIChwYXJzZXIucmVsYXRpdmVPZmZzZXQgPCBzaXplKSB7XG4gICAgICAgIHZhciBvcCA9IHBhcnNlci5wYXJzZUJ5dGUoKTtcblxuICAgICAgICAvLyBUaGUgZmlyc3QgYnl0ZSBmb3IgZWFjaCBkaWN0IGl0ZW0gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIG9wZXJhdG9yIChrZXkpIGFuZCBvcGVyYW5kICh2YWx1ZSkuXG4gICAgICAgIC8vIFZhbHVlcyA8PSAyMSBhcmUgb3BlcmF0b3JzLlxuICAgICAgICBpZiAob3AgPD0gMjEpIHtcbiAgICAgICAgICAgIC8vIFR3by1ieXRlIG9wZXJhdG9ycyBoYXZlIGFuIGluaXRpYWwgZXNjYXBlIGJ5dGUgb2YgMTIuXG4gICAgICAgICAgICBpZiAob3AgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgb3AgPSAxMjAwICsgcGFyc2VyLnBhcnNlQnl0ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goW29wLCBvcGVyYW5kc10pO1xuICAgICAgICAgICAgb3BlcmFuZHMgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBvcGVyYW5kcyAodmFsdWVzKSBjb21lIGJlZm9yZSB0aGUgb3BlcmF0b3JzIChrZXlzKSwgd2Ugc3RvcmUgYWxsIG9wZXJhbmRzIGluIGEgbGlzdFxuICAgICAgICAgICAgLy8gdW50aWwgd2UgZW5jb3VudGVyIGFuIG9wZXJhdG9yLlxuICAgICAgICAgICAgb3BlcmFuZHMucHVzaChwYXJzZU9wZXJhbmQocGFyc2VyLCBvcCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXNUb09iamVjdChlbnRyaWVzKTtcbn1cblxuLy8gR2l2ZW4gYSBTdHJpbmcgSW5kZXggKFNJRCksIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHN0cmluZy5cbi8vIFN0cmluZ3MgYmVsb3cgaW5kZXggMzkyIGFyZSBzdGFuZGFyZCBDRkYgc3RyaW5ncyBhbmQgYXJlIG5vdCBlbmNvZGVkIGluIHRoZSBmb250LlxuZnVuY3Rpb24gZ2V0Q0ZGU3RyaW5nKHN0cmluZ3MsIGluZGV4KSB7XG4gICAgaWYgKGluZGV4IDw9IDM5MCkge1xuICAgICAgICBpbmRleCA9IGNmZlN0YW5kYXJkU3RyaW5nc1tpbmRleF07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXggPSBzdHJpbmdzW2luZGV4IC0gMzkxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXg7XG59XG5cbi8vIEludGVycHJldCBhIGRpY3Rpb25hcnkgYW5kIHJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IHdpdGggcmVhZGFibGUga2V5cyBhbmQgdmFsdWVzIGZvciBtaXNzaW5nIGVudHJpZXMuXG4vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGBtZXRhYCB3aGljaCBpcyBhIGxpc3Qgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBvcGVyYW5kYCwgYG5hbWVgIGFuZCBgZGVmYXVsdGAuXG5mdW5jdGlvbiBpbnRlcnByZXREaWN0KGRpY3QsIG1ldGEsIHN0cmluZ3MpIHtcbiAgICB2YXIgbmV3RGljdCA9IHt9O1xuICAgIHZhciB2YWx1ZTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYWxzbyB3YW50IHRvIGluY2x1ZGUgbWlzc2luZyB2YWx1ZXMsIHdlIHN0YXJ0IG91dCBmcm9tIHRoZSBtZXRhIGxpc3RcbiAgICAvLyBhbmQgbG9va3VwIHZhbHVlcyBpbiB0aGUgZGljdC5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG0gPSBtZXRhW2ldO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG0udHlwZSkpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIHZhbHVlcy5sZW5ndGggPSBtLnR5cGUubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtLnR5cGUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGRpY3RbbS5vcF0gIT09IHVuZGVmaW5lZCA/IGRpY3RbbS5vcF1bal0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgbS52YWx1ZVtqXSAhPT0gdW5kZWZpbmVkID8gbS52YWx1ZVtqXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtLnR5cGVbal0gPT09ICdTSUQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0Q0ZGU3RyaW5nKHN0cmluZ3MsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzW2pdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdEaWN0W20ubmFtZV0gPSB2YWx1ZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGRpY3RbbS5vcF07XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbS52YWx1ZSAhPT0gdW5kZWZpbmVkID8gbS52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtLnR5cGUgPT09ICdTSUQnKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRDRkZTdHJpbmcoc3RyaW5ncywgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3RGljdFttLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RGljdDtcbn1cblxuLy8gUGFyc2UgdGhlIENGRiBoZWFkZXIuXG5mdW5jdGlvbiBwYXJzZUNGRkhlYWRlcihkYXRhLCBzdGFydCkge1xuICAgIHZhciBoZWFkZXIgPSB7fTtcbiAgICBoZWFkZXIuZm9ybWF0TWFqb3IgPSBwYXJzZS5nZXRDYXJkOChkYXRhLCBzdGFydCk7XG4gICAgaGVhZGVyLmZvcm1hdE1pbm9yID0gcGFyc2UuZ2V0Q2FyZDgoZGF0YSwgc3RhcnQgKyAxKTtcbiAgICBoZWFkZXIuc2l6ZSA9IHBhcnNlLmdldENhcmQ4KGRhdGEsIHN0YXJ0ICsgMik7XG4gICAgaGVhZGVyLm9mZnNldFNpemUgPSBwYXJzZS5nZXRDYXJkOChkYXRhLCBzdGFydCArIDMpO1xuICAgIGhlYWRlci5zdGFydE9mZnNldCA9IHN0YXJ0O1xuICAgIGhlYWRlci5lbmRPZmZzZXQgPSBzdGFydCArIDQ7XG4gICAgcmV0dXJuIGhlYWRlcjtcbn1cblxudmFyIFRPUF9ESUNUX01FVEEgPSBbXG4gICAge25hbWU6ICd2ZXJzaW9uJywgb3A6IDAsIHR5cGU6ICdTSUQnfSxcbiAgICB7bmFtZTogJ25vdGljZScsIG9wOiAxLCB0eXBlOiAnU0lEJ30sXG4gICAge25hbWU6ICdjb3B5cmlnaHQnLCBvcDogMTIwMCwgdHlwZTogJ1NJRCd9LFxuICAgIHtuYW1lOiAnZnVsbE5hbWUnLCBvcDogMiwgdHlwZTogJ1NJRCd9LFxuICAgIHtuYW1lOiAnZmFtaWx5TmFtZScsIG9wOiAzLCB0eXBlOiAnU0lEJ30sXG4gICAge25hbWU6ICd3ZWlnaHQnLCBvcDogNCwgdHlwZTogJ1NJRCd9LFxuICAgIHtuYW1lOiAnaXNGaXhlZFBpdGNoJywgb3A6IDEyMDEsIHR5cGU6ICdudW1iZXInLCB2YWx1ZTogMH0sXG4gICAge25hbWU6ICdpdGFsaWNBbmdsZScsIG9wOiAxMjAyLCB0eXBlOiAnbnVtYmVyJywgdmFsdWU6IDB9LFxuICAgIHtuYW1lOiAndW5kZXJsaW5lUG9zaXRpb24nLCBvcDogMTIwMywgdHlwZTogJ251bWJlcicsIHZhbHVlOiAtMTAwfSxcbiAgICB7bmFtZTogJ3VuZGVybGluZVRoaWNrbmVzcycsIG9wOiAxMjA0LCB0eXBlOiAnbnVtYmVyJywgdmFsdWU6IDUwfSxcbiAgICB7bmFtZTogJ3BhaW50VHlwZScsIG9wOiAxMjA1LCB0eXBlOiAnbnVtYmVyJywgdmFsdWU6IDB9LFxuICAgIHtuYW1lOiAnY2hhcnN0cmluZ1R5cGUnLCBvcDogMTIwNiwgdHlwZTogJ251bWJlcicsIHZhbHVlOiAyfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdmb250TWF0cml4JyxcbiAgICAgICAgb3A6IDEyMDcsXG4gICAgICAgIHR5cGU6IFsncmVhbCcsICdyZWFsJywgJ3JlYWwnLCAncmVhbCcsICdyZWFsJywgJ3JlYWwnXSxcbiAgICAgICAgdmFsdWU6IFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdXG4gICAgfSxcbiAgICB7bmFtZTogJ3VuaXF1ZUlkJywgb3A6IDEzLCB0eXBlOiAnbnVtYmVyJ30sXG4gICAge25hbWU6ICdmb250QkJveCcsIG9wOiA1LCB0eXBlOiBbJ251bWJlcicsICdudW1iZXInLCAnbnVtYmVyJywgJ251bWJlciddLCB2YWx1ZTogWzAsIDAsIDAsIDBdfSxcbiAgICB7bmFtZTogJ3N0cm9rZVdpZHRoJywgb3A6IDEyMDgsIHR5cGU6ICdudW1iZXInLCB2YWx1ZTogMH0sXG4gICAge25hbWU6ICd4dWlkJywgb3A6IDE0LCB0eXBlOiBbXSwgdmFsdWU6IG51bGx9LFxuICAgIHtuYW1lOiAnY2hhcnNldCcsIG9wOiAxNSwgdHlwZTogJ29mZnNldCcsIHZhbHVlOiAwfSxcbiAgICB7bmFtZTogJ2VuY29kaW5nJywgb3A6IDE2LCB0eXBlOiAnb2Zmc2V0JywgdmFsdWU6IDB9LFxuICAgIHtuYW1lOiAnY2hhclN0cmluZ3MnLCBvcDogMTcsIHR5cGU6ICdvZmZzZXQnLCB2YWx1ZTogMH0sXG4gICAge25hbWU6ICdwcml2YXRlJywgb3A6IDE4LCB0eXBlOiBbJ251bWJlcicsICdvZmZzZXQnXSwgdmFsdWU6IFswLCAwXX0sXG4gICAge25hbWU6ICdyb3MnLCBvcDogMTIzMCwgdHlwZTogWydTSUQnLCAnU0lEJywgJ251bWJlciddfSxcbiAgICB7bmFtZTogJ2NpZEZvbnRWZXJzaW9uJywgb3A6IDEyMzEsIHR5cGU6ICdudW1iZXInLCB2YWx1ZTogMH0sXG4gICAge25hbWU6ICdjaWRGb250UmV2aXNpb24nLCBvcDogMTIzMiwgdHlwZTogJ251bWJlcicsIHZhbHVlOiAwfSxcbiAgICB7bmFtZTogJ2NpZEZvbnRUeXBlJywgb3A6IDEyMzMsIHR5cGU6ICdudW1iZXInLCB2YWx1ZTogMH0sXG4gICAge25hbWU6ICdjaWRDb3VudCcsIG9wOiAxMjM0LCB0eXBlOiAnbnVtYmVyJywgdmFsdWU6IDg3MjB9LFxuICAgIHtuYW1lOiAndWlkQmFzZScsIG9wOiAxMjM1LCB0eXBlOiAnbnVtYmVyJ30sXG4gICAge25hbWU6ICdmZEFycmF5Jywgb3A6IDEyMzYsIHR5cGU6ICdvZmZzZXQnfSxcbiAgICB7bmFtZTogJ2ZkU2VsZWN0Jywgb3A6IDEyMzcsIHR5cGU6ICdvZmZzZXQnfSxcbiAgICB7bmFtZTogJ2ZvbnROYW1lJywgb3A6IDEyMzgsIHR5cGU6ICdTSUQnfVxuXTtcblxudmFyIFBSSVZBVEVfRElDVF9NRVRBID0gW1xuICAgIHtuYW1lOiAnc3VicnMnLCBvcDogMTksIHR5cGU6ICdvZmZzZXQnLCB2YWx1ZTogMH0sXG4gICAge25hbWU6ICdkZWZhdWx0V2lkdGhYJywgb3A6IDIwLCB0eXBlOiAnbnVtYmVyJywgdmFsdWU6IDB9LFxuICAgIHtuYW1lOiAnbm9taW5hbFdpZHRoWCcsIG9wOiAyMSwgdHlwZTogJ251bWJlcicsIHZhbHVlOiAwfVxuXTtcblxuLy8gUGFyc2UgdGhlIENGRiB0b3AgZGljdGlvbmFyeS4gQSBDRkYgdGFibGUgY2FuIGNvbnRhaW4gbXVsdGlwbGUgZm9udHMsIGVhY2ggd2l0aCB0aGVpciBvd24gdG9wIGRpY3Rpb25hcnkuXG4vLyBUaGUgdG9wIGRpY3Rpb25hcnkgY29udGFpbnMgdGhlIGVzc2VudGlhbCBtZXRhZGF0YSBmb3IgdGhlIGZvbnQsIHRvZ2V0aGVyIHdpdGggdGhlIHByaXZhdGUgZGljdGlvbmFyeS5cbmZ1bmN0aW9uIHBhcnNlQ0ZGVG9wRGljdChkYXRhLCBzdHJpbmdzKSB7XG4gICAgdmFyIGRpY3QgPSBwYXJzZUNGRkRpY3QoZGF0YSwgMCwgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgICByZXR1cm4gaW50ZXJwcmV0RGljdChkaWN0LCBUT1BfRElDVF9NRVRBLCBzdHJpbmdzKTtcbn1cblxuLy8gUGFyc2UgdGhlIENGRiBwcml2YXRlIGRpY3Rpb25hcnkuIFdlIGRvbid0IGZ1bGx5IHBhcnNlIG91dCBhbGwgdGhlIHZhbHVlcywgb25seSB0aGUgb25lcyB3ZSBuZWVkLlxuZnVuY3Rpb24gcGFyc2VDRkZQcml2YXRlRGljdChkYXRhLCBzdGFydCwgc2l6ZSwgc3RyaW5ncykge1xuICAgIHZhciBkaWN0ID0gcGFyc2VDRkZEaWN0KGRhdGEsIHN0YXJ0LCBzaXplKTtcbiAgICByZXR1cm4gaW50ZXJwcmV0RGljdChkaWN0LCBQUklWQVRFX0RJQ1RfTUVUQSwgc3RyaW5ncyk7XG59XG5cbi8vIFJldHVybnMgYSBsaXN0IG9mIFwiVG9wIERJQ1RcInMgZm91bmQgdXNpbmcgYW4gSU5ERVggbGlzdC5cbi8vIFVzZWQgdG8gcmVhZCBib3RoIHRoZSB1c3VhbCBoaWdoLWxldmVsIFRvcCBESUNUcyBhbmQgYWxzbyB0aGUgRkRBcnJheVxuLy8gZGlzY292ZXJlZCBpbnNpZGUgQ0lELWtleWVkIGZvbnRzLiAgV2hlbiBhIFRvcCBESUNUIGhhcyBhIHJlZmVyZW5jZSB0b1xuLy8gYSBQcml2YXRlIERJQ1QgdGhhdCBpcyByZWFkIGFuZCBzYXZlZCBpbnRvIHRoZSBUb3AgRElDVC5cbi8vXG4vLyBJbiBhZGRpdGlvbiB0byB0aGUgZXhwZWN0ZWQvb3B0aW9uYWwgdmFsdWVzIGFzIG91dGxpbmVkIGluIFRPUF9ESUNUX01FVEFcbi8vIHRoZSBmb2xsb3dpbmcgdmFsdWVzIG1pZ2h0IGJlIHNhdmVkIGludG8gdGhlIFRvcCBESUNULlxuLy9cbi8vICAgIF9zdWJycyBbXSAgICAgICAgYXJyYXkgb2YgbG9jYWwgQ0ZGIHN1YnJvdXRpbmVzIGZyb20gUHJpdmF0ZSBESUNUXG4vLyAgICBfc3VicnNCaWFzICAgICAgIGJpYXMgdmFsdWUgY29tcHV0ZWQgZnJvbSBudW1iZXIgb2Ygc3Vicm91dGluZXNcbi8vICAgICAgICAgICAgICAgICAgICAgIChzZWUgY2FsY0NGRlN1YnJvdXRpbmVCaWFzKCkgYW5kIHBhcnNlQ0ZGQ2hhcnN0cmluZygpKVxuLy8gICAgX2RlZmF1bHRXaWR0aFggICBkZWZhdWx0IHdpZHRocyBmb3IgQ0ZGIGNoYXJhY3RlcnNcbi8vICAgIF9ub21pbmFsV2lkdGhYICAgYmlhcyBhZGRlZCB0byB3aWR0aCBlbWJlZGRlZCB3aXRoaW4gZ2x5cGggZGVzY3JpcHRpb25cbi8vXG4vLyAgICBfcHJpdmF0ZURpY3QgICAgIHNhdmVkIGNvcHkgb2YgcGFyc2VkIFByaXZhdGUgRElDVCBmcm9tIFRvcCBESUNUXG5mdW5jdGlvbiBnYXRoZXJDRkZUb3BEaWN0cyhkYXRhLCBzdGFydCwgY2ZmSW5kZXgsIHN0cmluZ3MpIHtcbiAgICB2YXIgdG9wRGljdEFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaVRvcERpY3QgPSAwOyBpVG9wRGljdCA8IGNmZkluZGV4Lmxlbmd0aDsgaVRvcERpY3QgKz0gMSkge1xuICAgICAgICB2YXIgdG9wRGljdERhdGEgPSBuZXcgRGF0YVZpZXcobmV3IFVpbnQ4QXJyYXkoY2ZmSW5kZXhbaVRvcERpY3RdKS5idWZmZXIpO1xuICAgICAgICB2YXIgdG9wRGljdCA9IHBhcnNlQ0ZGVG9wRGljdCh0b3BEaWN0RGF0YSwgc3RyaW5ncyk7XG4gICAgICAgIHRvcERpY3QuX3N1YnJzID0gW107XG4gICAgICAgIHRvcERpY3QuX3N1YnJzQmlhcyA9IDA7XG4gICAgICAgIHZhciBwcml2YXRlU2l6ZSA9IHRvcERpY3QucHJpdmF0ZVswXTtcbiAgICAgICAgdmFyIHByaXZhdGVPZmZzZXQgPSB0b3BEaWN0LnByaXZhdGVbMV07XG4gICAgICAgIGlmIChwcml2YXRlU2l6ZSAhPT0gMCAmJiBwcml2YXRlT2Zmc2V0ICE9PSAwKSB7XG4gICAgICAgICAgICB2YXIgcHJpdmF0ZURpY3QgPSBwYXJzZUNGRlByaXZhdGVEaWN0KGRhdGEsIHByaXZhdGVPZmZzZXQgKyBzdGFydCwgcHJpdmF0ZVNpemUsIHN0cmluZ3MpO1xuICAgICAgICAgICAgdG9wRGljdC5fZGVmYXVsdFdpZHRoWCA9IHByaXZhdGVEaWN0LmRlZmF1bHRXaWR0aFg7XG4gICAgICAgICAgICB0b3BEaWN0Ll9ub21pbmFsV2lkdGhYID0gcHJpdmF0ZURpY3Qubm9taW5hbFdpZHRoWDtcbiAgICAgICAgICAgIGlmIChwcml2YXRlRGljdC5zdWJycyAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBzdWJyT2Zmc2V0ID0gcHJpdmF0ZU9mZnNldCArIHByaXZhdGVEaWN0LnN1YnJzO1xuICAgICAgICAgICAgICAgIHZhciBzdWJySW5kZXggPSBwYXJzZUNGRkluZGV4KGRhdGEsIHN1YnJPZmZzZXQgKyBzdGFydCk7XG4gICAgICAgICAgICAgICAgdG9wRGljdC5fc3VicnMgPSBzdWJySW5kZXgub2JqZWN0cztcbiAgICAgICAgICAgICAgICB0b3BEaWN0Ll9zdWJyc0JpYXMgPSBjYWxjQ0ZGU3Vicm91dGluZUJpYXModG9wRGljdC5fc3VicnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9wRGljdC5fcHJpdmF0ZURpY3QgPSBwcml2YXRlRGljdDtcbiAgICAgICAgfVxuICAgICAgICB0b3BEaWN0QXJyYXkucHVzaCh0b3BEaWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRvcERpY3RBcnJheTtcbn1cblxuLy8gUGFyc2UgdGhlIENGRiBjaGFyc2V0IHRhYmxlLCB3aGljaCBjb250YWlucyBpbnRlcm5hbCBuYW1lcyBmb3IgYWxsIHRoZSBnbHlwaHMuXG4vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgbGlzdCBvZiBnbHlwaCBuYW1lcy5cbi8vIFNlZSBBZG9iZSBUTiAjNTE3NiBjaGFwdGVyIDEzLCBcIkNoYXJzZXRzXCIuXG5mdW5jdGlvbiBwYXJzZUNGRkNoYXJzZXQoZGF0YSwgc3RhcnQsIG5HbHlwaHMsIHN0cmluZ3MpIHtcbiAgICB2YXIgc2lkO1xuICAgIHZhciBjb3VudDtcbiAgICB2YXIgcGFyc2VyID0gbmV3IHBhcnNlLlBhcnNlcihkYXRhLCBzdGFydCk7XG5cbiAgICAvLyBUaGUgLm5vdGRlZiBnbHlwaCBpcyBub3QgaW5jbHVkZWQsIHNvIHN1YnRyYWN0IDEuXG4gICAgbkdseXBocyAtPSAxO1xuICAgIHZhciBjaGFyc2V0ID0gWycubm90ZGVmJ107XG5cbiAgICB2YXIgZm9ybWF0ID0gcGFyc2VyLnBhcnNlQ2FyZDgoKTtcbiAgICBpZiAoZm9ybWF0ID09PSAwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbkdseXBoczsgaSArPSAxKSB7XG4gICAgICAgICAgICBzaWQgPSBwYXJzZXIucGFyc2VTSUQoKTtcbiAgICAgICAgICAgIGNoYXJzZXQucHVzaChnZXRDRkZTdHJpbmcoc3RyaW5ncywgc2lkKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMSkge1xuICAgICAgICB3aGlsZSAoY2hhcnNldC5sZW5ndGggPD0gbkdseXBocykge1xuICAgICAgICAgICAgc2lkID0gcGFyc2VyLnBhcnNlU0lEKCk7XG4gICAgICAgICAgICBjb3VudCA9IHBhcnNlci5wYXJzZUNhcmQ4KCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPD0gY291bnQ7IGkkMSArPSAxKSB7XG4gICAgICAgICAgICAgICAgY2hhcnNldC5wdXNoKGdldENGRlN0cmluZyhzdHJpbmdzLCBzaWQpKTtcbiAgICAgICAgICAgICAgICBzaWQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAyKSB7XG4gICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBuR2x5cGhzKSB7XG4gICAgICAgICAgICBzaWQgPSBwYXJzZXIucGFyc2VTSUQoKTtcbiAgICAgICAgICAgIGNvdW50ID0gcGFyc2VyLnBhcnNlQ2FyZDE2KCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPD0gY291bnQ7IGkkMiArPSAxKSB7XG4gICAgICAgICAgICAgICAgY2hhcnNldC5wdXNoKGdldENGRlN0cmluZyhzdHJpbmdzLCBzaWQpKTtcbiAgICAgICAgICAgICAgICBzaWQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBjaGFyc2V0IGZvcm1hdCAnICsgZm9ybWF0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhcnNldDtcbn1cblxuLy8gUGFyc2UgdGhlIENGRiBlbmNvZGluZyBkYXRhLiBPbmx5IG9uZSBlbmNvZGluZyBjYW4gYmUgc3BlY2lmaWVkIHBlciBmb250LlxuLy8gU2VlIEFkb2JlIFROICM1MTc2IGNoYXB0ZXIgMTIsIFwiRW5jb2RpbmdzXCIuXG5mdW5jdGlvbiBwYXJzZUNGRkVuY29kaW5nKGRhdGEsIHN0YXJ0LCBjaGFyc2V0KSB7XG4gICAgdmFyIGNvZGU7XG4gICAgdmFyIGVuYyA9IHt9O1xuICAgIHZhciBwYXJzZXIgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICB2YXIgZm9ybWF0ID0gcGFyc2VyLnBhcnNlQ2FyZDgoKTtcbiAgICBpZiAoZm9ybWF0ID09PSAwKSB7XG4gICAgICAgIHZhciBuQ29kZXMgPSBwYXJzZXIucGFyc2VDYXJkOCgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5Db2RlczsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb2RlID0gcGFyc2VyLnBhcnNlQ2FyZDgoKTtcbiAgICAgICAgICAgIGVuY1tjb2RlXSA9IGk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMSkge1xuICAgICAgICB2YXIgblJhbmdlcyA9IHBhcnNlci5wYXJzZUNhcmQ4KCk7XG4gICAgICAgIGNvZGUgPSAxO1xuICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBuUmFuZ2VzOyBpJDEgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGZpcnN0ID0gcGFyc2VyLnBhcnNlQ2FyZDgoKTtcbiAgICAgICAgICAgIHZhciBuTGVmdCA9IHBhcnNlci5wYXJzZUNhcmQ4KCk7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gZmlyc3Q7IGogPD0gZmlyc3QgKyBuTGVmdDsgaiArPSAxKSB7XG4gICAgICAgICAgICAgICAgZW5jW2pdID0gY29kZTtcbiAgICAgICAgICAgICAgICBjb2RlICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2RpbmcgZm9ybWF0ICcgKyBmb3JtYXQpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ2ZmRW5jb2RpbmcoZW5jLCBjaGFyc2V0KTtcbn1cblxuLy8gVGFrZSBpbiBjaGFyc3RyaW5nIGNvZGUgYW5kIHJldHVybiBhIEdseXBoIG9iamVjdC5cbi8vIFRoZSBlbmNvZGluZyBpcyBkZXNjcmliZWQgaW4gdGhlIFR5cGUgMiBDaGFyc3RyaW5nIEZvcm1hdFxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9jaGFyc3RyMi5odG1cbmZ1bmN0aW9uIHBhcnNlQ0ZGQ2hhcnN0cmluZyhmb250LCBnbHlwaCwgY29kZSkge1xuICAgIHZhciBjMXg7XG4gICAgdmFyIGMxeTtcbiAgICB2YXIgYzJ4O1xuICAgIHZhciBjMnk7XG4gICAgdmFyIHAgPSBuZXcgUGF0aCgpO1xuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBuU3RlbXMgPSAwO1xuICAgIHZhciBoYXZlV2lkdGggPSBmYWxzZTtcbiAgICB2YXIgb3BlbiA9IGZhbHNlO1xuICAgIHZhciB4ID0gMDtcbiAgICB2YXIgeSA9IDA7XG4gICAgdmFyIHN1YnJzO1xuICAgIHZhciBzdWJyc0JpYXM7XG4gICAgdmFyIGRlZmF1bHRXaWR0aFg7XG4gICAgdmFyIG5vbWluYWxXaWR0aFg7XG4gICAgaWYgKGZvbnQuaXNDSURGb250KSB7XG4gICAgICAgIHZhciBmZEluZGV4ID0gZm9udC50YWJsZXMuY2ZmLnRvcERpY3QuX2ZkU2VsZWN0W2dseXBoLmluZGV4XTtcbiAgICAgICAgdmFyIGZkRGljdCA9IGZvbnQudGFibGVzLmNmZi50b3BEaWN0Ll9mZEFycmF5W2ZkSW5kZXhdO1xuICAgICAgICBzdWJycyA9IGZkRGljdC5fc3VicnM7XG4gICAgICAgIHN1YnJzQmlhcyA9IGZkRGljdC5fc3VicnNCaWFzO1xuICAgICAgICBkZWZhdWx0V2lkdGhYID0gZmREaWN0Ll9kZWZhdWx0V2lkdGhYO1xuICAgICAgICBub21pbmFsV2lkdGhYID0gZmREaWN0Ll9ub21pbmFsV2lkdGhYO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnJzID0gZm9udC50YWJsZXMuY2ZmLnRvcERpY3QuX3N1YnJzO1xuICAgICAgICBzdWJyc0JpYXMgPSBmb250LnRhYmxlcy5jZmYudG9wRGljdC5fc3VicnNCaWFzO1xuICAgICAgICBkZWZhdWx0V2lkdGhYID0gZm9udC50YWJsZXMuY2ZmLnRvcERpY3QuX2RlZmF1bHRXaWR0aFg7XG4gICAgICAgIG5vbWluYWxXaWR0aFggPSBmb250LnRhYmxlcy5jZmYudG9wRGljdC5fbm9taW5hbFdpZHRoWDtcbiAgICB9XG4gICAgdmFyIHdpZHRoID0gZGVmYXVsdFdpZHRoWDtcblxuICAgIGZ1bmN0aW9uIG5ld0NvbnRvdXIoeCwgeSkge1xuICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgICAgcC5jbG9zZVBhdGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHAubW92ZVRvKHgsIHkpO1xuICAgICAgICBvcGVuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVN0ZW1zKCkge1xuICAgICAgICB2YXIgaGFzV2lkdGhBcmc7XG5cbiAgICAgICAgLy8gVGhlIG51bWJlciBvZiBzdGVtIG9wZXJhdG9ycyBvbiB0aGUgc3RhY2sgaXMgYWx3YXlzIGV2ZW4uXG4gICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyB1bmV2ZW4sIHRoYXQgbWVhbnMgYSB3aWR0aCBpcyBzcGVjaWZpZWQuXG4gICAgICAgIGhhc1dpZHRoQXJnID0gc3RhY2subGVuZ3RoICUgMiAhPT0gMDtcbiAgICAgICAgaWYgKGhhc1dpZHRoQXJnICYmICFoYXZlV2lkdGgpIHtcbiAgICAgICAgICAgIHdpZHRoID0gc3RhY2suc2hpZnQoKSArIG5vbWluYWxXaWR0aFg7XG4gICAgICAgIH1cblxuICAgICAgICBuU3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7XG4gICAgICAgIHN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICAgIGhhdmVXaWR0aCA9IHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2UkJDEoY29kZSkge1xuICAgICAgICB2YXIgYjE7XG4gICAgICAgIHZhciBiMjtcbiAgICAgICAgdmFyIGIzO1xuICAgICAgICB2YXIgYjQ7XG4gICAgICAgIHZhciBjb2RlSW5kZXg7XG4gICAgICAgIHZhciBzdWJyQ29kZTtcbiAgICAgICAgdmFyIGpweDtcbiAgICAgICAgdmFyIGpweTtcbiAgICAgICAgdmFyIGMzeDtcbiAgICAgICAgdmFyIGMzeTtcbiAgICAgICAgdmFyIGM0eDtcbiAgICAgICAgdmFyIGM0eTtcblxuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgY29kZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciB2ID0gY29kZVtpXTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHN3aXRjaCAodikge1xuICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gaHN0ZW1cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VTdGVtcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6IC8vIHZzdGVtXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlU3RlbXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiAvLyB2bW92ZXRvXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAxICYmICFoYXZlV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gc3RhY2suc2hpZnQoKSArIG5vbWluYWxXaWR0aFg7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXZlV2lkdGggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgeSArPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udG91cih4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OiAvLyBybGluZXRvXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwLmxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjogLy8gaGxpbmV0b1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAubGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiAvLyB2bGluZXRvXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwLmxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6IC8vIHJyY3VydmV0b1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMXkgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gYzJ5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAuY3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDogLy8gY2FsbHN1YnJcbiAgICAgICAgICAgICAgICAgICAgY29kZUluZGV4ID0gc3RhY2sucG9wKCkgKyBzdWJyc0JpYXM7XG4gICAgICAgICAgICAgICAgICAgIHN1YnJDb2RlID0gc3VicnNbY29kZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnJDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSQkMShzdWJyQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOiAvLyByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgMTI6IC8vIGZsZXggb3BlcmF0b3JzXG4gICAgICAgICAgICAgICAgICAgIHYgPSBjb2RlW2ldO1xuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNTogLy8gZmxleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHwtIGR4MSBkeTEgZHgyIGR5MiBkeDMgZHkzIGR4NCBkeTQgZHg1IGR5NSBkeDYgZHk2IGZkIGZsZXggKDEyIDM1KSB8LVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxeCA9IHggICArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR4MVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxeSA9IHkgICArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR5MVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR4MlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR5MlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpweCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR4M1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpweSA9IGMyeSArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR5M1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMzeCA9IGpweCArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR4NFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMzeSA9IGpweSArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR5NFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM0eCA9IGMzeCArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR4NVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM0eSA9IGMzeSArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR5NVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBjNHggICArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR4NlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjNHkgICArIHN0YWNrLnNoaWZ0KCk7ICAgIC8vIGR5NlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnNoaWZ0KCk7ICAgICAgICAgICAgICAgIC8vIGZsZXggZGVwdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCBqcHgsIGpweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jdXJ2ZVRvKGMzeCwgYzN5LCBjNHgsIGM0eSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OiAvLyBoZmxleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHwtIGR4MSBkeDIgZHkyIGR4MyBkeDQgZHg1IGR4NiBoZmxleCAoMTIgMzQpIHwtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzF4ID0geCAgICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHgxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzF5ID0geTsgICAgICAgICAgICAgICAgICAgICAgLy8gZHkxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHgyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHkyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganB4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHgzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganB5ID0gYzJ5OyAgICAgICAgICAgICAgICAgICAgLy8gZHkzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzN4ID0ganB4ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHg0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzN5ID0gYzJ5OyAgICAgICAgICAgICAgICAgICAgLy8gZHk0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzR4ID0gYzN4ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHg1XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzR5ID0geTsgICAgICAgICAgICAgICAgICAgICAgLy8gZHk1XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGM0eCArIHN0YWNrLnNoaWZ0KCk7ICAgICAgLy8gZHg2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwganB4LCBqcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuY3VydmVUbyhjM3gsIGMzeSwgYzR4LCBjNHksIHgsIHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjogLy8gaGZsZXgxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfC0gZHgxIGR5MSBkeDIgZHkyIGR4MyBkeDQgZHg1IGR5NSBkeDYgaGZsZXgxICgxMiAzNikgfC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMXggPSB4ICAgKyBzdGFjay5zaGlmdCgpOyAgICAvLyBkeDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMXkgPSB5ICAgKyBzdGFjay5zaGlmdCgpOyAgICAvLyBkeTFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpOyAgICAvLyBkeDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpOyAgICAvLyBkeTJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcHggPSBjMnggKyBzdGFjay5zaGlmdCgpOyAgICAvLyBkeDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcHkgPSBjMnk7ICAgICAgICAgICAgICAgICAgICAvLyBkeTNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjM3ggPSBqcHggKyBzdGFjay5zaGlmdCgpOyAgICAvLyBkeDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjM3kgPSBjMnk7ICAgICAgICAgICAgICAgICAgICAvLyBkeTRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNHggPSBjM3ggKyBzdGFjay5zaGlmdCgpOyAgICAvLyBkeDVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNHkgPSBjM3kgKyBzdGFjay5zaGlmdCgpOyAgICAvLyBkeTVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gYzR4ICsgc3RhY2suc2hpZnQoKTsgICAgICAvLyBkeDZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCBqcHgsIGpweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jdXJ2ZVRvKGMzeCwgYzN5LCBjNHgsIGM0eSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OiAvLyBmbGV4MVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHwtIGR4MSBkeTEgZHgyIGR5MiBkeDMgZHkzIGR4NCBkeTQgZHg1IGR5NSBkNiBmbGV4MSAoMTIgMzcpIHwtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzF4ID0geCAgICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHgxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzF5ID0geSAgICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHkxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHgyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHkyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganB4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHgzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganB5ID0gYzJ5ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHkzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzN4ID0ganB4ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHg0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzN5ID0ganB5ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHk0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzR4ID0gYzN4ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHg1XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzR5ID0gYzN5ICsgc3RhY2suc2hpZnQoKTsgICAgLy8gZHk1XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGM0eCAtIHgpID4gTWF0aC5hYnMoYzR5IC0geSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGM0eCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGM0eSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwganB4LCBqcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuY3VydmVUbyhjM3gsIGMzeSwgYzR4LCBjNHksIHgsIHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2x5cGggJyArIGdseXBoLmluZGV4ICsgJzogdW5rbm93biBvcGVyYXRvciAnICsgMTIwMCArIHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDogLy8gZW5kY2hhclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCAmJiAhaGF2ZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHN0YWNrLnNoaWZ0KCkgKyBub21pbmFsV2lkdGhYO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwLmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxODogLy8gaHN0ZW1obVxuICAgICAgICAgICAgICAgICAgICBwYXJzZVN0ZW1zKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTk6IC8vIGhpbnRtYXNrXG4gICAgICAgICAgICAgICAgY2FzZSAyMDogLy8gY250cm1hc2tcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VTdGVtcygpO1xuICAgICAgICAgICAgICAgICAgICBpICs9IChuU3RlbXMgKyA3KSA+PiAzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIxOiAvLyBybW92ZXRvXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAyICYmICFoYXZlV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gc3RhY2suc2hpZnQoKSArIG5vbWluYWxXaWR0aFg7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXZlV2lkdGggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgeSArPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgeCArPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udG91cih4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMjogLy8gaG1vdmV0b1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMSAmJiAhaGF2ZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHN0YWNrLnNoaWZ0KCkgKyBub21pbmFsV2lkdGhYO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHggKz0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRvdXIoeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjM6IC8vIHZzdGVtaG1cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VTdGVtcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI0OiAvLyByY3VydmVsaW5lXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMXggPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMxeSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjMnkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcC5jdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgcC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjU6IC8vIHJsaW5lY3VydmVcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAubGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGMxeSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICB4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IGMyeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHAuY3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI2OiAvLyB2dmN1cnZldG9cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCAlIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMXggPSB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgYzF5ID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBjMng7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gYzJ5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAuY3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNzogLy8gaGhjdXJ2ZXRvXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggJSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMXkgPSB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjMnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwLmN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjg6IC8vIHNob3J0aW50XG4gICAgICAgICAgICAgICAgICAgIGIxID0gY29kZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgYjIgPSBjb2RlW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgoKGIxIDw8IDI0KSB8IChiMiA8PCAxNikpID4+IDE2KTtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI5OiAvLyBjYWxsZ3N1YnJcbiAgICAgICAgICAgICAgICAgICAgY29kZUluZGV4ID0gc3RhY2sucG9wKCkgKyBmb250LmdzdWJyc0JpYXM7XG4gICAgICAgICAgICAgICAgICAgIHN1YnJDb2RlID0gZm9udC5nc3VicnNbY29kZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnJDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSQkMShzdWJyQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDMwOiAvLyB2aGN1cnZldG9cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMxeCA9IHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMXkgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gYzJ5ICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAuY3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjMXggPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMxeSA9IHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjMnkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGMyeCArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwLmN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzE6IC8vIGh2Y3VydmV0b1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMXkgPSB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gYzJ5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBjMnggKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcC5jdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGMxeCA9IHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMXkgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gYzJ5ICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAuY3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPCAzMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dseXBoICcgKyBnbHlwaC5pbmRleCArICc6IHVua25vd24gb3BlcmF0b3IgJyArIHYpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPCAyNDcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godiAtIDEzOSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1MSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYjEgPSBjb2RlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgodiAtIDI0NykgKiAyNTYgKyBiMSArIDEwOCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1NSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYjEgPSBjb2RlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgtKHYgLSAyNTEpICogMjU2IC0gYjEgLSAxMDgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYjEgPSBjb2RlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSBjb2RlW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGIzID0gY29kZVtpICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBiNCA9IGNvZGVbaSArIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgoKGIxIDw8IDI0KSB8IChiMiA8PCAxNikgfCAoYjMgPDwgOCkgfCBiNCkgLyA2NTUzNik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlJCQxKGNvZGUpO1xuXG4gICAgZ2x5cGguYWR2YW5jZVdpZHRoID0gd2lkdGg7XG4gICAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ0ZGRkRTZWxlY3QoZGF0YSwgc3RhcnQsIG5HbHlwaHMsIGZkQXJyYXlDb3VudCkge1xuICAgIHZhciBmZFNlbGVjdCA9IFtdO1xuICAgIHZhciBmZEluZGV4O1xuICAgIHZhciBwYXJzZXIgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICB2YXIgZm9ybWF0ID0gcGFyc2VyLnBhcnNlQ2FyZDgoKTtcbiAgICBpZiAoZm9ybWF0ID09PSAwKSB7XG4gICAgICAgIC8vIFNpbXBsZSBsaXN0IG9mIG5HbHlwaHMgZWxlbWVudHNcbiAgICAgICAgZm9yICh2YXIgaUdpZCA9IDA7IGlHaWQgPCBuR2x5cGhzOyBpR2lkKyspIHtcbiAgICAgICAgICAgIGZkSW5kZXggPSBwYXJzZXIucGFyc2VDYXJkOCgpO1xuICAgICAgICAgICAgaWYgKGZkSW5kZXggPj0gZmRBcnJheUNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDRkYgdGFibGUgQ0lEIEZvbnQgRkRTZWxlY3QgaGFzIGJhZCBGRCBpbmRleCB2YWx1ZSAnICsgZmRJbmRleCArICcgKEZEIGNvdW50ICcgKyBmZEFycmF5Q291bnQgKyAnKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmRTZWxlY3QucHVzaChmZEluZGV4KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAzKSB7XG4gICAgICAgIC8vIFJhbmdlc1xuICAgICAgICB2YXIgblJhbmdlcyA9IHBhcnNlci5wYXJzZUNhcmQxNigpO1xuICAgICAgICB2YXIgZmlyc3QgPSBwYXJzZXIucGFyc2VDYXJkMTYoKTtcbiAgICAgICAgaWYgKGZpcnN0ICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NGRiBUYWJsZSBDSUQgRm9udCBGRFNlbGVjdCBmb3JtYXQgMyByYW5nZSBoYXMgYmFkIGluaXRpYWwgR0lEICcgKyBmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5leHQ7XG4gICAgICAgIGZvciAodmFyIGlSYW5nZSA9IDA7IGlSYW5nZSA8IG5SYW5nZXM7IGlSYW5nZSsrKSB7XG4gICAgICAgICAgICBmZEluZGV4ID0gcGFyc2VyLnBhcnNlQ2FyZDgoKTtcbiAgICAgICAgICAgIG5leHQgPSBwYXJzZXIucGFyc2VDYXJkMTYoKTtcbiAgICAgICAgICAgIGlmIChmZEluZGV4ID49IGZkQXJyYXlDb3VudCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ0ZGIHRhYmxlIENJRCBGb250IEZEU2VsZWN0IGhhcyBiYWQgRkQgaW5kZXggdmFsdWUgJyArIGZkSW5kZXggKyAnIChGRCBjb3VudCAnICsgZmRBcnJheUNvdW50ICsgJyknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0ID4gbkdseXBocykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ0ZGIFRhYmxlIENJRCBGb250IEZEU2VsZWN0IGZvcm1hdCAzIHJhbmdlIGhhcyBiYWQgR0lEICcgKyBuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOyBmaXJzdCA8IG5leHQ7IGZpcnN0KyspIHtcbiAgICAgICAgICAgICAgICBmZFNlbGVjdC5wdXNoKGZkSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlyc3QgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0ICE9PSBuR2x5cGhzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NGRiBUYWJsZSBDSUQgRm9udCBGRFNlbGVjdCBmb3JtYXQgMyByYW5nZSBoYXMgYmFkIGZpbmFsIEdJRCAnICsgbmV4dCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NGRiBUYWJsZSBDSUQgRm9udCBGRFNlbGVjdCB0YWJsZSBoYXMgdW5zdXBwb3J0ZWQgZm9ybWF0ICcgKyBmb3JtYXQpO1xuICAgIH1cbiAgICByZXR1cm4gZmRTZWxlY3Q7XG59XG5cbi8vIFBhcnNlIHRoZSBgQ0ZGYCB0YWJsZSwgd2hpY2ggY29udGFpbnMgdGhlIGdseXBoIG91dGxpbmVzIGluIFBvc3RTY3JpcHQgZm9ybWF0LlxuZnVuY3Rpb24gcGFyc2VDRkZUYWJsZShkYXRhLCBzdGFydCwgZm9udCkge1xuICAgIGZvbnQudGFibGVzLmNmZiA9IHt9O1xuICAgIHZhciBoZWFkZXIgPSBwYXJzZUNGRkhlYWRlcihkYXRhLCBzdGFydCk7XG4gICAgdmFyIG5hbWVJbmRleCA9IHBhcnNlQ0ZGSW5kZXgoZGF0YSwgaGVhZGVyLmVuZE9mZnNldCwgcGFyc2UuYnl0ZXNUb1N0cmluZyk7XG4gICAgdmFyIHRvcERpY3RJbmRleCA9IHBhcnNlQ0ZGSW5kZXgoZGF0YSwgbmFtZUluZGV4LmVuZE9mZnNldCk7XG4gICAgdmFyIHN0cmluZ0luZGV4ID0gcGFyc2VDRkZJbmRleChkYXRhLCB0b3BEaWN0SW5kZXguZW5kT2Zmc2V0LCBwYXJzZS5ieXRlc1RvU3RyaW5nKTtcbiAgICB2YXIgZ2xvYmFsU3VickluZGV4ID0gcGFyc2VDRkZJbmRleChkYXRhLCBzdHJpbmdJbmRleC5lbmRPZmZzZXQpO1xuICAgIGZvbnQuZ3N1YnJzID0gZ2xvYmFsU3VickluZGV4Lm9iamVjdHM7XG4gICAgZm9udC5nc3VicnNCaWFzID0gY2FsY0NGRlN1YnJvdXRpbmVCaWFzKGZvbnQuZ3N1YnJzKTtcblxuICAgIHZhciB0b3BEaWN0QXJyYXkgPSBnYXRoZXJDRkZUb3BEaWN0cyhkYXRhLCBzdGFydCwgdG9wRGljdEluZGV4Lm9iamVjdHMsIHN0cmluZ0luZGV4Lm9iamVjdHMpO1xuICAgIGlmICh0b3BEaWN0QXJyYXkubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ0ZGIHRhYmxlIGhhcyB0b28gbWFueSBmb250cyBpbiBcXCdGb250U2V0XFwnIC0gY291bnQgb2YgZm9udHMgTmFtZUluZGV4Lmxlbmd0aCA9ICcgKyB0b3BEaWN0QXJyYXkubGVuZ3RoKTtcbiAgICB9XG5cbiAgICB2YXIgdG9wRGljdCA9IHRvcERpY3RBcnJheVswXTtcbiAgICBmb250LnRhYmxlcy5jZmYudG9wRGljdCA9IHRvcERpY3Q7XG5cbiAgICBpZiAodG9wRGljdC5fcHJpdmF0ZURpY3QpIHtcbiAgICAgICAgZm9udC5kZWZhdWx0V2lkdGhYID0gdG9wRGljdC5fcHJpdmF0ZURpY3QuZGVmYXVsdFdpZHRoWDtcbiAgICAgICAgZm9udC5ub21pbmFsV2lkdGhYID0gdG9wRGljdC5fcHJpdmF0ZURpY3Qubm9taW5hbFdpZHRoWDtcbiAgICB9XG5cbiAgICBpZiAodG9wRGljdC5yb3NbMF0gIT09IHVuZGVmaW5lZCAmJiB0b3BEaWN0LnJvc1sxXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvbnQuaXNDSURGb250ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZm9udC5pc0NJREZvbnQpIHtcbiAgICAgICAgdmFyIGZkQXJyYXlPZmZzZXQgPSB0b3BEaWN0LmZkQXJyYXk7XG4gICAgICAgIHZhciBmZFNlbGVjdE9mZnNldCA9IHRvcERpY3QuZmRTZWxlY3Q7XG4gICAgICAgIGlmIChmZEFycmF5T2Zmc2V0ID09PSAwIHx8IGZkU2VsZWN0T2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvbnQgaXMgbWFya2VkIGFzIGEgQ0lEIGZvbnQsIGJ1dCBGREFycmF5IGFuZC9vciBGRFNlbGVjdCBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmRBcnJheU9mZnNldCArPSBzdGFydDtcbiAgICAgICAgdmFyIGZkQXJyYXlJbmRleCA9IHBhcnNlQ0ZGSW5kZXgoZGF0YSwgZmRBcnJheU9mZnNldCk7XG4gICAgICAgIHZhciBmZEFycmF5ID0gZ2F0aGVyQ0ZGVG9wRGljdHMoZGF0YSwgc3RhcnQsIGZkQXJyYXlJbmRleC5vYmplY3RzLCBzdHJpbmdJbmRleC5vYmplY3RzKTtcbiAgICAgICAgdG9wRGljdC5fZmRBcnJheSA9IGZkQXJyYXk7XG4gICAgICAgIGZkU2VsZWN0T2Zmc2V0ICs9IHN0YXJ0O1xuICAgICAgICB0b3BEaWN0Ll9mZFNlbGVjdCA9IHBhcnNlQ0ZGRkRTZWxlY3QoZGF0YSwgZmRTZWxlY3RPZmZzZXQsIGZvbnQubnVtR2x5cGhzLCBmZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgdmFyIHByaXZhdGVEaWN0T2Zmc2V0ID0gc3RhcnQgKyB0b3BEaWN0LnByaXZhdGVbMV07XG4gICAgdmFyIHByaXZhdGVEaWN0ID0gcGFyc2VDRkZQcml2YXRlRGljdChkYXRhLCBwcml2YXRlRGljdE9mZnNldCwgdG9wRGljdC5wcml2YXRlWzBdLCBzdHJpbmdJbmRleC5vYmplY3RzKTtcbiAgICBmb250LmRlZmF1bHRXaWR0aFggPSBwcml2YXRlRGljdC5kZWZhdWx0V2lkdGhYO1xuICAgIGZvbnQubm9taW5hbFdpZHRoWCA9IHByaXZhdGVEaWN0Lm5vbWluYWxXaWR0aFg7XG5cbiAgICBpZiAocHJpdmF0ZURpY3Quc3VicnMgIT09IDApIHtcbiAgICAgICAgdmFyIHN1YnJPZmZzZXQgPSBwcml2YXRlRGljdE9mZnNldCArIHByaXZhdGVEaWN0LnN1YnJzO1xuICAgICAgICB2YXIgc3VickluZGV4ID0gcGFyc2VDRkZJbmRleChkYXRhLCBzdWJyT2Zmc2V0KTtcbiAgICAgICAgZm9udC5zdWJycyA9IHN1YnJJbmRleC5vYmplY3RzO1xuICAgICAgICBmb250LnN1YnJzQmlhcyA9IGNhbGNDRkZTdWJyb3V0aW5lQmlhcyhmb250LnN1YnJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb250LnN1YnJzID0gW107XG4gICAgICAgIGZvbnQuc3VicnNCaWFzID0gMDtcbiAgICB9XG5cbiAgICAvLyBPZmZzZXRzIGluIHRoZSB0b3AgZGljdCBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgQ0ZGIGRhdGEsIHNvIGFkZCB0aGUgQ0ZGIHN0YXJ0IG9mZnNldC5cbiAgICB2YXIgY2hhclN0cmluZ3NJbmRleCA9IHBhcnNlQ0ZGSW5kZXgoZGF0YSwgc3RhcnQgKyB0b3BEaWN0LmNoYXJTdHJpbmdzKTtcbiAgICBmb250Lm5HbHlwaHMgPSBjaGFyU3RyaW5nc0luZGV4Lm9iamVjdHMubGVuZ3RoO1xuXG4gICAgdmFyIGNoYXJzZXQgPSBwYXJzZUNGRkNoYXJzZXQoZGF0YSwgc3RhcnQgKyB0b3BEaWN0LmNoYXJzZXQsIGZvbnQubkdseXBocywgc3RyaW5nSW5kZXgub2JqZWN0cyk7XG4gICAgaWYgKHRvcERpY3QuZW5jb2RpbmcgPT09IDApIHsgLy8gU3RhbmRhcmQgZW5jb2RpbmdcbiAgICAgICAgZm9udC5jZmZFbmNvZGluZyA9IG5ldyBDZmZFbmNvZGluZyhjZmZTdGFuZGFyZEVuY29kaW5nLCBjaGFyc2V0KTtcbiAgICB9IGVsc2UgaWYgKHRvcERpY3QuZW5jb2RpbmcgPT09IDEpIHsgLy8gRXhwZXJ0IGVuY29kaW5nXG4gICAgICAgIGZvbnQuY2ZmRW5jb2RpbmcgPSBuZXcgQ2ZmRW5jb2RpbmcoY2ZmRXhwZXJ0RW5jb2RpbmcsIGNoYXJzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvbnQuY2ZmRW5jb2RpbmcgPSBwYXJzZUNGRkVuY29kaW5nKGRhdGEsIHN0YXJ0ICsgdG9wRGljdC5lbmNvZGluZywgY2hhcnNldCk7XG4gICAgfVxuXG4gICAgLy8gUHJlZmVyIHRoZSBDTUFQIGVuY29kaW5nIHRvIHRoZSBDRkYgZW5jb2RpbmcuXG4gICAgZm9udC5lbmNvZGluZyA9IGZvbnQuZW5jb2RpbmcgfHwgZm9udC5jZmZFbmNvZGluZztcblxuICAgIGZvbnQuZ2x5cGhzID0gbmV3IGdseXBoc2V0LkdseXBoU2V0KGZvbnQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9udC5uR2x5cGhzOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGNoYXJTdHJpbmcgPSBjaGFyU3RyaW5nc0luZGV4Lm9iamVjdHNbaV07XG4gICAgICAgIGZvbnQuZ2x5cGhzLnB1c2goaSwgZ2x5cGhzZXQuY2ZmR2x5cGhMb2FkZXIoZm9udCwgaSwgcGFyc2VDRkZDaGFyc3RyaW5nLCBjaGFyU3RyaW5nKSk7XG4gICAgfVxufVxuXG4vLyBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgU3RyaW5nIElEIChTSUQpLlxuLy8gVGhlIGxpc3Qgb2Ygc3RyaW5ncyBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbmZ1bmN0aW9uIGVuY29kZVN0cmluZyhzLCBzdHJpbmdzKSB7XG4gICAgdmFyIHNpZDtcblxuICAgIC8vIElzIHRoZSBzdHJpbmcgaW4gdGhlIENGRiBzdGFuZGFyZCBzdHJpbmdzP1xuICAgIHZhciBpID0gY2ZmU3RhbmRhcmRTdHJpbmdzLmluZGV4T2Yocyk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgICBzaWQgPSBpO1xuICAgIH1cblxuICAgIC8vIElzIHRoZSBzdHJpbmcgYWxyZWFkeSBpbiB0aGUgc3RyaW5nIGluZGV4P1xuICAgIGkgPSBzdHJpbmdzLmluZGV4T2Yocyk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgICBzaWQgPSBpICsgY2ZmU3RhbmRhcmRTdHJpbmdzLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzaWQgPSBjZmZTdGFuZGFyZFN0cmluZ3MubGVuZ3RoICsgc3RyaW5ncy5sZW5ndGg7XG4gICAgICAgIHN0cmluZ3MucHVzaChzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lkO1xufVxuXG5mdW5jdGlvbiBtYWtlSGVhZGVyKCkge1xuICAgIHJldHVybiBuZXcgdGFibGUuUmVjb3JkKCdIZWFkZXInLCBbXG4gICAgICAgIHtuYW1lOiAnbWFqb3InLCB0eXBlOiAnQ2FyZDgnLCB2YWx1ZTogMX0sXG4gICAgICAgIHtuYW1lOiAnbWlub3InLCB0eXBlOiAnQ2FyZDgnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnaGRyU2l6ZScsIHR5cGU6ICdDYXJkOCcsIHZhbHVlOiA0fSxcbiAgICAgICAge25hbWU6ICdtYWpvcicsIHR5cGU6ICdDYXJkOCcsIHZhbHVlOiAxfVxuICAgIF0pO1xufVxuXG5mdW5jdGlvbiBtYWtlTmFtZUluZGV4KGZvbnROYW1lcykge1xuICAgIHZhciB0ID0gbmV3IHRhYmxlLlJlY29yZCgnTmFtZSBJTkRFWCcsIFtcbiAgICAgICAge25hbWU6ICduYW1lcycsIHR5cGU6ICdJTkRFWCcsIHZhbHVlOiBbXX1cbiAgICBdKTtcbiAgICB0Lm5hbWVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb250TmFtZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdC5uYW1lcy5wdXNoKHtuYW1lOiAnbmFtZV8nICsgaSwgdHlwZTogJ05BTUUnLCB2YWx1ZTogZm9udE5hbWVzW2ldfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG59XG5cbi8vIEdpdmVuIGEgZGljdGlvbmFyeSdzIG1ldGFkYXRhLCBjcmVhdGUgYSBESUNUIHN0cnVjdHVyZS5cbmZ1bmN0aW9uIG1ha2VEaWN0KG1ldGEsIGF0dHJzLCBzdHJpbmdzKSB7XG4gICAgdmFyIG0gPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gbWV0YVtpXTtcbiAgICAgICAgdmFyIHZhbHVlID0gYXR0cnNbZW50cnkubmFtZV07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcXVhbHModmFsdWUsIGVudHJ5LnZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICdTSUQnKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbmNvZGVTdHJpbmcodmFsdWUsIHN0cmluZ3MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtW2VudHJ5Lm9wXSA9IHtuYW1lOiBlbnRyeS5uYW1lLCB0eXBlOiBlbnRyeS50eXBlLCB2YWx1ZTogdmFsdWV9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG07XG59XG5cbi8vIFRoZSBUb3AgRElDVCBob3VzZXMgdGhlIGdsb2JhbCBmb250IGF0dHJpYnV0ZXMuXG5mdW5jdGlvbiBtYWtlVG9wRGljdChhdHRycywgc3RyaW5ncykge1xuICAgIHZhciB0ID0gbmV3IHRhYmxlLlJlY29yZCgnVG9wIERJQ1QnLCBbXG4gICAgICAgIHtuYW1lOiAnZGljdCcsIHR5cGU6ICdESUNUJywgdmFsdWU6IHt9fVxuICAgIF0pO1xuICAgIHQuZGljdCA9IG1ha2VEaWN0KFRPUF9ESUNUX01FVEEsIGF0dHJzLCBzdHJpbmdzKTtcbiAgICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gbWFrZVRvcERpY3RJbmRleCh0b3BEaWN0KSB7XG4gICAgdmFyIHQgPSBuZXcgdGFibGUuUmVjb3JkKCdUb3AgRElDVCBJTkRFWCcsIFtcbiAgICAgICAge25hbWU6ICd0b3BEaWN0cycsIHR5cGU6ICdJTkRFWCcsIHZhbHVlOiBbXX1cbiAgICBdKTtcbiAgICB0LnRvcERpY3RzID0gW3tuYW1lOiAndG9wRGljdF8wJywgdHlwZTogJ1RBQkxFJywgdmFsdWU6IHRvcERpY3R9XTtcbiAgICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gbWFrZVN0cmluZ0luZGV4KHN0cmluZ3MpIHtcbiAgICB2YXIgdCA9IG5ldyB0YWJsZS5SZWNvcmQoJ1N0cmluZyBJTkRFWCcsIFtcbiAgICAgICAge25hbWU6ICdzdHJpbmdzJywgdHlwZTogJ0lOREVYJywgdmFsdWU6IFtdfVxuICAgIF0pO1xuICAgIHQuc3RyaW5ncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB0LnN0cmluZ3MucHVzaCh7bmFtZTogJ3N0cmluZ18nICsgaSwgdHlwZTogJ1NUUklORycsIHZhbHVlOiBzdHJpbmdzW2ldfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VHbG9iYWxTdWJySW5kZXgoKSB7XG4gICAgLy8gQ3VycmVudGx5IHdlIGRvbid0IHVzZSBzdWJyb3V0aW5lcy5cbiAgICByZXR1cm4gbmV3IHRhYmxlLlJlY29yZCgnR2xvYmFsIFN1YnIgSU5ERVgnLCBbXG4gICAgICAgIHtuYW1lOiAnc3VicnMnLCB0eXBlOiAnSU5ERVgnLCB2YWx1ZTogW119XG4gICAgXSk7XG59XG5cbmZ1bmN0aW9uIG1ha2VDaGFyc2V0cyhnbHlwaE5hbWVzLCBzdHJpbmdzKSB7XG4gICAgdmFyIHQgPSBuZXcgdGFibGUuUmVjb3JkKCdDaGFyc2V0cycsIFtcbiAgICAgICAge25hbWU6ICdmb3JtYXQnLCB0eXBlOiAnQ2FyZDgnLCB2YWx1ZTogMH1cbiAgICBdKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBoTmFtZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGdseXBoTmFtZSA9IGdseXBoTmFtZXNbaV07XG4gICAgICAgIHZhciBnbHlwaFNJRCA9IGVuY29kZVN0cmluZyhnbHlwaE5hbWUsIHN0cmluZ3MpO1xuICAgICAgICB0LmZpZWxkcy5wdXNoKHtuYW1lOiAnZ2x5cGhfJyArIGksIHR5cGU6ICdTSUQnLCB2YWx1ZTogZ2x5cGhTSUR9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gZ2x5cGhUb09wcyhnbHlwaCkge1xuICAgIHZhciBvcHMgPSBbXTtcbiAgICB2YXIgcGF0aCA9IGdseXBoLnBhdGg7XG4gICAgb3BzLnB1c2goe25hbWU6ICd3aWR0aCcsIHR5cGU6ICdOVU1CRVInLCB2YWx1ZTogZ2x5cGguYWR2YW5jZVdpZHRofSk7XG4gICAgdmFyIHggPSAwO1xuICAgIHZhciB5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGguY29tbWFuZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGR4ID0gKHZvaWQgMCk7XG4gICAgICAgIHZhciBkeSA9ICh2b2lkIDApO1xuICAgICAgICB2YXIgY21kID0gcGF0aC5jb21tYW5kc1tpXTtcbiAgICAgICAgaWYgKGNtZC50eXBlID09PSAnUScpIHtcbiAgICAgICAgICAgIC8vIENGRiBvbmx5IHN1cHBvcnRzIGLDqXppZXIgY3VydmVzLCBzbyBjb252ZXJ0IHRoZSBxdWFkIHRvIGEgYsOpemllci5cbiAgICAgICAgICAgIHZhciBfMTMgPSAxIC8gMztcbiAgICAgICAgICAgIHZhciBfMjMgPSAyIC8gMztcblxuICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gY3JlYXRlIGEgbmV3IGNvbW1hbmQgc28gd2UgZG9uJ3QgY2hhbmdlIHRoZSBvcmlnaW5hbCBwYXRoLlxuICAgICAgICAgICAgY21kID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdDJyxcbiAgICAgICAgICAgICAgICB4OiBjbWQueCxcbiAgICAgICAgICAgICAgICB5OiBjbWQueSxcbiAgICAgICAgICAgICAgICB4MTogXzEzICogeCArIF8yMyAqIGNtZC54MSxcbiAgICAgICAgICAgICAgICB5MTogXzEzICogeSArIF8yMyAqIGNtZC55MSxcbiAgICAgICAgICAgICAgICB4MjogXzEzICogY21kLnggKyBfMjMgKiBjbWQueDEsXG4gICAgICAgICAgICAgICAgeTI6IF8xMyAqIGNtZC55ICsgXzIzICogY21kLnkxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNtZC50eXBlID09PSAnTScpIHtcbiAgICAgICAgICAgIGR4ID0gTWF0aC5yb3VuZChjbWQueCAtIHgpO1xuICAgICAgICAgICAgZHkgPSBNYXRoLnJvdW5kKGNtZC55IC0geSk7XG4gICAgICAgICAgICBvcHMucHVzaCh7bmFtZTogJ2R4JywgdHlwZTogJ05VTUJFUicsIHZhbHVlOiBkeH0pO1xuICAgICAgICAgICAgb3BzLnB1c2goe25hbWU6ICdkeScsIHR5cGU6ICdOVU1CRVInLCB2YWx1ZTogZHl9KTtcbiAgICAgICAgICAgIG9wcy5wdXNoKHtuYW1lOiAncm1vdmV0bycsIHR5cGU6ICdPUCcsIHZhbHVlOiAyMX0pO1xuICAgICAgICAgICAgeCA9IE1hdGgucm91bmQoY21kLngpO1xuICAgICAgICAgICAgeSA9IE1hdGgucm91bmQoY21kLnkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNtZC50eXBlID09PSAnTCcpIHtcbiAgICAgICAgICAgIGR4ID0gTWF0aC5yb3VuZChjbWQueCAtIHgpO1xuICAgICAgICAgICAgZHkgPSBNYXRoLnJvdW5kKGNtZC55IC0geSk7XG4gICAgICAgICAgICBvcHMucHVzaCh7bmFtZTogJ2R4JywgdHlwZTogJ05VTUJFUicsIHZhbHVlOiBkeH0pO1xuICAgICAgICAgICAgb3BzLnB1c2goe25hbWU6ICdkeScsIHR5cGU6ICdOVU1CRVInLCB2YWx1ZTogZHl9KTtcbiAgICAgICAgICAgIG9wcy5wdXNoKHtuYW1lOiAncmxpbmV0bycsIHR5cGU6ICdPUCcsIHZhbHVlOiA1fSk7XG4gICAgICAgICAgICB4ID0gTWF0aC5yb3VuZChjbWQueCk7XG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZChjbWQueSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY21kLnR5cGUgPT09ICdDJykge1xuICAgICAgICAgICAgdmFyIGR4MSA9IE1hdGgucm91bmQoY21kLngxIC0geCk7XG4gICAgICAgICAgICB2YXIgZHkxID0gTWF0aC5yb3VuZChjbWQueTEgLSB5KTtcbiAgICAgICAgICAgIHZhciBkeDIgPSBNYXRoLnJvdW5kKGNtZC54MiAtIGNtZC54MSk7XG4gICAgICAgICAgICB2YXIgZHkyID0gTWF0aC5yb3VuZChjbWQueTIgLSBjbWQueTEpO1xuICAgICAgICAgICAgZHggPSBNYXRoLnJvdW5kKGNtZC54IC0gY21kLngyKTtcbiAgICAgICAgICAgIGR5ID0gTWF0aC5yb3VuZChjbWQueSAtIGNtZC55Mik7XG4gICAgICAgICAgICBvcHMucHVzaCh7bmFtZTogJ2R4MScsIHR5cGU6ICdOVU1CRVInLCB2YWx1ZTogZHgxfSk7XG4gICAgICAgICAgICBvcHMucHVzaCh7bmFtZTogJ2R5MScsIHR5cGU6ICdOVU1CRVInLCB2YWx1ZTogZHkxfSk7XG4gICAgICAgICAgICBvcHMucHVzaCh7bmFtZTogJ2R4MicsIHR5cGU6ICdOVU1CRVInLCB2YWx1ZTogZHgyfSk7XG4gICAgICAgICAgICBvcHMucHVzaCh7bmFtZTogJ2R5MicsIHR5cGU6ICdOVU1CRVInLCB2YWx1ZTogZHkyfSk7XG4gICAgICAgICAgICBvcHMucHVzaCh7bmFtZTogJ2R4JywgdHlwZTogJ05VTUJFUicsIHZhbHVlOiBkeH0pO1xuICAgICAgICAgICAgb3BzLnB1c2goe25hbWU6ICdkeScsIHR5cGU6ICdOVU1CRVInLCB2YWx1ZTogZHl9KTtcbiAgICAgICAgICAgIG9wcy5wdXNoKHtuYW1lOiAncnJjdXJ2ZXRvJywgdHlwZTogJ09QJywgdmFsdWU6IDh9KTtcbiAgICAgICAgICAgIHggPSBNYXRoLnJvdW5kKGNtZC54KTtcbiAgICAgICAgICAgIHkgPSBNYXRoLnJvdW5kKGNtZC55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnRvdXJzIGFyZSBjbG9zZWQgYXV0b21hdGljYWxseS5cbiAgICB9XG5cbiAgICBvcHMucHVzaCh7bmFtZTogJ2VuZGNoYXInLCB0eXBlOiAnT1AnLCB2YWx1ZTogMTR9KTtcbiAgICByZXR1cm4gb3BzO1xufVxuXG5mdW5jdGlvbiBtYWtlQ2hhclN0cmluZ3NJbmRleChnbHlwaHMpIHtcbiAgICB2YXIgdCA9IG5ldyB0YWJsZS5SZWNvcmQoJ0NoYXJTdHJpbmdzIElOREVYJywgW1xuICAgICAgICB7bmFtZTogJ2NoYXJTdHJpbmdzJywgdHlwZTogJ0lOREVYJywgdmFsdWU6IFtdfVxuICAgIF0pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGdseXBoID0gZ2x5cGhzLmdldChpKTtcbiAgICAgICAgdmFyIG9wcyA9IGdseXBoVG9PcHMoZ2x5cGgpO1xuICAgICAgICB0LmNoYXJTdHJpbmdzLnB1c2goe25hbWU6IGdseXBoLm5hbWUsIHR5cGU6ICdDSEFSU1RSSU5HJywgdmFsdWU6IG9wc30pO1xuICAgIH1cblxuICAgIHJldHVybiB0O1xufVxuXG5mdW5jdGlvbiBtYWtlUHJpdmF0ZURpY3QoYXR0cnMsIHN0cmluZ3MpIHtcbiAgICB2YXIgdCA9IG5ldyB0YWJsZS5SZWNvcmQoJ1ByaXZhdGUgRElDVCcsIFtcbiAgICAgICAge25hbWU6ICdkaWN0JywgdHlwZTogJ0RJQ1QnLCB2YWx1ZToge319XG4gICAgXSk7XG4gICAgdC5kaWN0ID0gbWFrZURpY3QoUFJJVkFURV9ESUNUX01FVEEsIGF0dHJzLCBzdHJpbmdzKTtcbiAgICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gbWFrZUNGRlRhYmxlKGdseXBocywgb3B0aW9ucykge1xuICAgIHZhciB0ID0gbmV3IHRhYmxlLlRhYmxlKCdDRkYgJywgW1xuICAgICAgICB7bmFtZTogJ2hlYWRlcicsIHR5cGU6ICdSRUNPUkQnfSxcbiAgICAgICAge25hbWU6ICduYW1lSW5kZXgnLCB0eXBlOiAnUkVDT1JEJ30sXG4gICAgICAgIHtuYW1lOiAndG9wRGljdEluZGV4JywgdHlwZTogJ1JFQ09SRCd9LFxuICAgICAgICB7bmFtZTogJ3N0cmluZ0luZGV4JywgdHlwZTogJ1JFQ09SRCd9LFxuICAgICAgICB7bmFtZTogJ2dsb2JhbFN1YnJJbmRleCcsIHR5cGU6ICdSRUNPUkQnfSxcbiAgICAgICAge25hbWU6ICdjaGFyc2V0cycsIHR5cGU6ICdSRUNPUkQnfSxcbiAgICAgICAge25hbWU6ICdjaGFyU3RyaW5nc0luZGV4JywgdHlwZTogJ1JFQ09SRCd9LFxuICAgICAgICB7bmFtZTogJ3ByaXZhdGVEaWN0JywgdHlwZTogJ1JFQ09SRCd9XG4gICAgXSk7XG5cbiAgICB2YXIgZm9udFNjYWxlID0gMSAvIG9wdGlvbnMudW5pdHNQZXJFbTtcbiAgICAvLyBXZSB1c2Ugbm9uLXplcm8gdmFsdWVzIGZvciB0aGUgb2Zmc2V0cyBzbyB0aGF0IHRoZSBESUNUIGVuY29kZXMgdGhlbS5cbiAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSBzaXplIG9mIHRoZSBUb3AgRElDVCBwbGF5cyBhIHJvbGUgaW4gb2Zmc2V0IGNhbGN1bGF0aW9uLFxuICAgIC8vIGFuZCB0aGUgc2l6ZSBzaG91bGRuJ3QgY2hhbmdlIGFmdGVyIHdlJ3ZlIHdyaXR0ZW4gY29ycmVjdCBvZmZzZXRzLlxuICAgIHZhciBhdHRycyA9IHtcbiAgICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgICBmdWxsTmFtZTogb3B0aW9ucy5mdWxsTmFtZSxcbiAgICAgICAgZmFtaWx5TmFtZTogb3B0aW9ucy5mYW1pbHlOYW1lLFxuICAgICAgICB3ZWlnaHQ6IG9wdGlvbnMud2VpZ2h0TmFtZSxcbiAgICAgICAgZm9udEJCb3g6IG9wdGlvbnMuZm9udEJCb3ggfHwgWzAsIDAsIDAsIDBdLFxuICAgICAgICBmb250TWF0cml4OiBbZm9udFNjYWxlLCAwLCAwLCBmb250U2NhbGUsIDAsIDBdLFxuICAgICAgICBjaGFyc2V0OiA5OTksXG4gICAgICAgIGVuY29kaW5nOiAwLFxuICAgICAgICBjaGFyU3RyaW5nczogOTk5LFxuICAgICAgICBwcml2YXRlOiBbMCwgOTk5XVxuICAgIH07XG5cbiAgICB2YXIgcHJpdmF0ZUF0dHJzID0ge307XG5cbiAgICB2YXIgZ2x5cGhOYW1lcyA9IFtdO1xuICAgIHZhciBnbHlwaDtcblxuICAgIC8vIFNraXAgZmlyc3QgZ2x5cGggKC5ub3RkZWYpXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBnbHlwaHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgZ2x5cGggPSBnbHlwaHMuZ2V0KGkpO1xuICAgICAgICBnbHlwaE5hbWVzLnB1c2goZ2x5cGgubmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZ3MgPSBbXTtcblxuICAgIHQuaGVhZGVyID0gbWFrZUhlYWRlcigpO1xuICAgIHQubmFtZUluZGV4ID0gbWFrZU5hbWVJbmRleChbb3B0aW9ucy5wb3N0U2NyaXB0TmFtZV0pO1xuICAgIHZhciB0b3BEaWN0ID0gbWFrZVRvcERpY3QoYXR0cnMsIHN0cmluZ3MpO1xuICAgIHQudG9wRGljdEluZGV4ID0gbWFrZVRvcERpY3RJbmRleCh0b3BEaWN0KTtcbiAgICB0Lmdsb2JhbFN1YnJJbmRleCA9IG1ha2VHbG9iYWxTdWJySW5kZXgoKTtcbiAgICB0LmNoYXJzZXRzID0gbWFrZUNoYXJzZXRzKGdseXBoTmFtZXMsIHN0cmluZ3MpO1xuICAgIHQuY2hhclN0cmluZ3NJbmRleCA9IG1ha2VDaGFyU3RyaW5nc0luZGV4KGdseXBocyk7XG4gICAgdC5wcml2YXRlRGljdCA9IG1ha2VQcml2YXRlRGljdChwcml2YXRlQXR0cnMsIHN0cmluZ3MpO1xuXG4gICAgLy8gTmVlZHMgdG8gY29tZSBhdCB0aGUgZW5kLCB0byBlbmNvZGUgYWxsIGN1c3RvbSBzdHJpbmdzIHVzZWQgaW4gdGhlIGZvbnQuXG4gICAgdC5zdHJpbmdJbmRleCA9IG1ha2VTdHJpbmdJbmRleChzdHJpbmdzKTtcblxuICAgIHZhciBzdGFydE9mZnNldCA9IHQuaGVhZGVyLnNpemVPZigpICtcbiAgICAgICAgdC5uYW1lSW5kZXguc2l6ZU9mKCkgK1xuICAgICAgICB0LnRvcERpY3RJbmRleC5zaXplT2YoKSArXG4gICAgICAgIHQuc3RyaW5nSW5kZXguc2l6ZU9mKCkgK1xuICAgICAgICB0Lmdsb2JhbFN1YnJJbmRleC5zaXplT2YoKTtcbiAgICBhdHRycy5jaGFyc2V0ID0gc3RhcnRPZmZzZXQ7XG5cbiAgICAvLyBXZSB1c2UgdGhlIENGRiBzdGFuZGFyZCBlbmNvZGluZzsgcHJvcGVyIGVuY29kaW5nIHdpbGwgYmUgaGFuZGxlZCBpbiBjbWFwLlxuICAgIGF0dHJzLmVuY29kaW5nID0gMDtcbiAgICBhdHRycy5jaGFyU3RyaW5ncyA9IGF0dHJzLmNoYXJzZXQgKyB0LmNoYXJzZXRzLnNpemVPZigpO1xuICAgIGF0dHJzLnByaXZhdGVbMV0gPSBhdHRycy5jaGFyU3RyaW5ncyArIHQuY2hhclN0cmluZ3NJbmRleC5zaXplT2YoKTtcblxuICAgIC8vIFJlY3JlYXRlIHRoZSBUb3AgRElDVCBJTkRFWCB3aXRoIHRoZSBjb3JyZWN0IG9mZnNldHMuXG4gICAgdG9wRGljdCA9IG1ha2VUb3BEaWN0KGF0dHJzLCBzdHJpbmdzKTtcbiAgICB0LnRvcERpY3RJbmRleCA9IG1ha2VUb3BEaWN0SW5kZXgodG9wRGljdCk7XG5cbiAgICByZXR1cm4gdDtcbn1cblxudmFyIGNmZiA9IHsgcGFyc2U6IHBhcnNlQ0ZGVGFibGUsIG1ha2U6IG1ha2VDRkZUYWJsZSB9O1xuXG4vLyBUaGUgYGhlYWRgIHRhYmxlIGNvbnRhaW5zIGdsb2JhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZm9udC5cbi8vIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PVFNQRUMvaGVhZC5odG1cblxuLy8gUGFyc2UgdGhlIGhlYWRlciBgaGVhZGAgdGFibGVcbmZ1bmN0aW9uIHBhcnNlSGVhZFRhYmxlKGRhdGEsIHN0YXJ0KSB7XG4gICAgdmFyIGhlYWQgPSB7fTtcbiAgICB2YXIgcCA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIGhlYWQudmVyc2lvbiA9IHAucGFyc2VWZXJzaW9uKCk7XG4gICAgaGVhZC5mb250UmV2aXNpb24gPSBNYXRoLnJvdW5kKHAucGFyc2VGaXhlZCgpICogMTAwMCkgLyAxMDAwO1xuICAgIGhlYWQuY2hlY2tTdW1BZGp1c3RtZW50ID0gcC5wYXJzZVVMb25nKCk7XG4gICAgaGVhZC5tYWdpY051bWJlciA9IHAucGFyc2VVTG9uZygpO1xuICAgIGNoZWNrLmFyZ3VtZW50KGhlYWQubWFnaWNOdW1iZXIgPT09IDB4NUYwRjNDRjUsICdGb250IGhlYWRlciBoYXMgd3JvbmcgbWFnaWMgbnVtYmVyLicpO1xuICAgIGhlYWQuZmxhZ3MgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgaGVhZC51bml0c1BlckVtID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIGhlYWQuY3JlYXRlZCA9IHAucGFyc2VMb25nRGF0ZVRpbWUoKTtcbiAgICBoZWFkLm1vZGlmaWVkID0gcC5wYXJzZUxvbmdEYXRlVGltZSgpO1xuICAgIGhlYWQueE1pbiA9IHAucGFyc2VTaG9ydCgpO1xuICAgIGhlYWQueU1pbiA9IHAucGFyc2VTaG9ydCgpO1xuICAgIGhlYWQueE1heCA9IHAucGFyc2VTaG9ydCgpO1xuICAgIGhlYWQueU1heCA9IHAucGFyc2VTaG9ydCgpO1xuICAgIGhlYWQubWFjU3R5bGUgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgaGVhZC5sb3dlc3RSZWNQUEVNID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIGhlYWQuZm9udERpcmVjdGlvbkhpbnQgPSBwLnBhcnNlU2hvcnQoKTtcbiAgICBoZWFkLmluZGV4VG9Mb2NGb3JtYXQgPSBwLnBhcnNlU2hvcnQoKTtcbiAgICBoZWFkLmdseXBoRGF0YUZvcm1hdCA9IHAucGFyc2VTaG9ydCgpO1xuICAgIHJldHVybiBoZWFkO1xufVxuXG5mdW5jdGlvbiBtYWtlSGVhZFRhYmxlKG9wdGlvbnMpIHtcbiAgICAvLyBBcHBsZSBNYWMgdGltZXN0YW1wIGVwb2NoIGlzIDAxLzAxLzE5MDQgbm90IDAxLzAxLzE5NzBcbiAgICB2YXIgdGltZXN0YW1wID0gTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApICsgMjA4Mjg0NDgwMDtcbiAgICB2YXIgY3JlYXRlZFRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcblxuICAgIGlmIChvcHRpb25zLmNyZWF0ZWRUaW1lc3RhbXApIHtcbiAgICAgICAgY3JlYXRlZFRpbWVzdGFtcCA9IG9wdGlvbnMuY3JlYXRlZFRpbWVzdGFtcCArIDIwODI4NDQ4MDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyB0YWJsZS5UYWJsZSgnaGVhZCcsIFtcbiAgICAgICAge25hbWU6ICd2ZXJzaW9uJywgdHlwZTogJ0ZJWEVEJywgdmFsdWU6IDB4MDAwMTAwMDB9LFxuICAgICAgICB7bmFtZTogJ2ZvbnRSZXZpc2lvbicsIHR5cGU6ICdGSVhFRCcsIHZhbHVlOiAweDAwMDEwMDAwfSxcbiAgICAgICAge25hbWU6ICdjaGVja1N1bUFkanVzdG1lbnQnLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnbWFnaWNOdW1iZXInLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogMHg1RjBGM0NGNX0sXG4gICAgICAgIHtuYW1lOiAnZmxhZ3MnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3VuaXRzUGVyRW0nLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDEwMDB9LFxuICAgICAgICB7bmFtZTogJ2NyZWF0ZWQnLCB0eXBlOiAnTE9OR0RBVEVUSU1FJywgdmFsdWU6IGNyZWF0ZWRUaW1lc3RhbXB9LFxuICAgICAgICB7bmFtZTogJ21vZGlmaWVkJywgdHlwZTogJ0xPTkdEQVRFVElNRScsIHZhbHVlOiB0aW1lc3RhbXB9LFxuICAgICAgICB7bmFtZTogJ3hNaW4nLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAneU1pbicsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICd4TWF4JywgdHlwZTogJ1NIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3lNYXgnLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnbWFjU3R5bGUnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ2xvd2VzdFJlY1BQRU0nLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ2ZvbnREaXJlY3Rpb25IaW50JywgdHlwZTogJ1NIT1JUJywgdmFsdWU6IDJ9LFxuICAgICAgICB7bmFtZTogJ2luZGV4VG9Mb2NGb3JtYXQnLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnZ2x5cGhEYXRhRm9ybWF0JywgdHlwZTogJ1NIT1JUJywgdmFsdWU6IDB9XG4gICAgXSwgb3B0aW9ucyk7XG59XG5cbnZhciBoZWFkID0geyBwYXJzZTogcGFyc2VIZWFkVGFibGUsIG1ha2U6IG1ha2VIZWFkVGFibGUgfTtcblxuLy8gVGhlIGBoaGVhYCB0YWJsZSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgaG9yaXpvbnRhbCBsYXlvdXQuXG4vLyBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT1RTUEVDL2hoZWEuaHRtXG5cbi8vIFBhcnNlIHRoZSBob3Jpem9udGFsIGhlYWRlciBgaGhlYWAgdGFibGVcbmZ1bmN0aW9uIHBhcnNlSGhlYVRhYmxlKGRhdGEsIHN0YXJ0KSB7XG4gICAgdmFyIGhoZWEgPSB7fTtcbiAgICB2YXIgcCA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIGhoZWEudmVyc2lvbiA9IHAucGFyc2VWZXJzaW9uKCk7XG4gICAgaGhlYS5hc2NlbmRlciA9IHAucGFyc2VTaG9ydCgpO1xuICAgIGhoZWEuZGVzY2VuZGVyID0gcC5wYXJzZVNob3J0KCk7XG4gICAgaGhlYS5saW5lR2FwID0gcC5wYXJzZVNob3J0KCk7XG4gICAgaGhlYS5hZHZhbmNlV2lkdGhNYXggPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgaGhlYS5taW5MZWZ0U2lkZUJlYXJpbmcgPSBwLnBhcnNlU2hvcnQoKTtcbiAgICBoaGVhLm1pblJpZ2h0U2lkZUJlYXJpbmcgPSBwLnBhcnNlU2hvcnQoKTtcbiAgICBoaGVhLnhNYXhFeHRlbnQgPSBwLnBhcnNlU2hvcnQoKTtcbiAgICBoaGVhLmNhcmV0U2xvcGVSaXNlID0gcC5wYXJzZVNob3J0KCk7XG4gICAgaGhlYS5jYXJldFNsb3BlUnVuID0gcC5wYXJzZVNob3J0KCk7XG4gICAgaGhlYS5jYXJldE9mZnNldCA9IHAucGFyc2VTaG9ydCgpO1xuICAgIHAucmVsYXRpdmVPZmZzZXQgKz0gODtcbiAgICBoaGVhLm1ldHJpY0RhdGFGb3JtYXQgPSBwLnBhcnNlU2hvcnQoKTtcbiAgICBoaGVhLm51bWJlck9mSE1ldHJpY3MgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgcmV0dXJuIGhoZWE7XG59XG5cbmZ1bmN0aW9uIG1ha2VIaGVhVGFibGUob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgdGFibGUuVGFibGUoJ2hoZWEnLCBbXG4gICAgICAgIHtuYW1lOiAndmVyc2lvbicsIHR5cGU6ICdGSVhFRCcsIHZhbHVlOiAweDAwMDEwMDAwfSxcbiAgICAgICAge25hbWU6ICdhc2NlbmRlcicsIHR5cGU6ICdGV09SRCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdkZXNjZW5kZXInLCB0eXBlOiAnRldPUkQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnbGluZUdhcCcsIHR5cGU6ICdGV09SRCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdhZHZhbmNlV2lkdGhNYXgnLCB0eXBlOiAnVUZXT1JEJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ21pbkxlZnRTaWRlQmVhcmluZycsIHR5cGU6ICdGV09SRCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdtaW5SaWdodFNpZGVCZWFyaW5nJywgdHlwZTogJ0ZXT1JEJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3hNYXhFeHRlbnQnLCB0eXBlOiAnRldPUkQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnY2FyZXRTbG9wZVJpc2UnLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogMX0sXG4gICAgICAgIHtuYW1lOiAnY2FyZXRTbG9wZVJ1bicsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdjYXJldE9mZnNldCcsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdyZXNlcnZlZDEnLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAncmVzZXJ2ZWQyJywgdHlwZTogJ1NIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3Jlc2VydmVkMycsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdyZXNlcnZlZDQnLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnbWV0cmljRGF0YUZvcm1hdCcsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdudW1iZXJPZkhNZXRyaWNzJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiAwfVxuICAgIF0sIG9wdGlvbnMpO1xufVxuXG52YXIgaGhlYSA9IHsgcGFyc2U6IHBhcnNlSGhlYVRhYmxlLCBtYWtlOiBtYWtlSGhlYVRhYmxlIH07XG5cbi8vIFRoZSBgaG10eGAgdGFibGUgY29udGFpbnMgdGhlIGhvcml6b250YWwgbWV0cmljcyBmb3IgYWxsIGdseXBocy5cbi8vIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PVFNQRUMvaG10eC5odG1cblxuLy8gUGFyc2UgdGhlIGBobXR4YCB0YWJsZSwgd2hpY2ggY29udGFpbnMgdGhlIGhvcml6b250YWwgbWV0cmljcyBmb3IgYWxsIGdseXBocy5cbi8vIFRoaXMgZnVuY3Rpb24gYXVnbWVudHMgdGhlIGdseXBoIGFycmF5LCBhZGRpbmcgdGhlIGFkdmFuY2VXaWR0aCBhbmQgbGVmdFNpZGVCZWFyaW5nIHRvIGVhY2ggZ2x5cGguXG5mdW5jdGlvbiBwYXJzZUhtdHhUYWJsZShkYXRhLCBzdGFydCwgbnVtTWV0cmljcywgbnVtR2x5cGhzLCBnbHlwaHMpIHtcbiAgICB2YXIgYWR2YW5jZVdpZHRoO1xuICAgIHZhciBsZWZ0U2lkZUJlYXJpbmc7XG4gICAgdmFyIHAgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUdseXBoczsgaSArPSAxKSB7XG4gICAgICAgIC8vIElmIHRoZSBmb250IGlzIG1vbm9zcGFjZWQsIG9ubHkgb25lIGVudHJ5IGlzIG5lZWRlZC4gVGhpcyBsYXN0IGVudHJ5IGFwcGxpZXMgdG8gYWxsIHN1YnNlcXVlbnQgZ2x5cGhzLlxuICAgICAgICBpZiAoaSA8IG51bU1ldHJpY3MpIHtcbiAgICAgICAgICAgIGFkdmFuY2VXaWR0aCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgICAgIGxlZnRTaWRlQmVhcmluZyA9IHAucGFyc2VTaG9ydCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGdseXBoID0gZ2x5cGhzLmdldChpKTtcbiAgICAgICAgZ2x5cGguYWR2YW5jZVdpZHRoID0gYWR2YW5jZVdpZHRoO1xuICAgICAgICBnbHlwaC5sZWZ0U2lkZUJlYXJpbmcgPSBsZWZ0U2lkZUJlYXJpbmc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtYWtlSG10eFRhYmxlKGdseXBocykge1xuICAgIHZhciB0ID0gbmV3IHRhYmxlLlRhYmxlKCdobXR4JywgW10pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBnbHlwaCA9IGdseXBocy5nZXQoaSk7XG4gICAgICAgIHZhciBhZHZhbmNlV2lkdGggPSBnbHlwaC5hZHZhbmNlV2lkdGggfHwgMDtcbiAgICAgICAgdmFyIGxlZnRTaWRlQmVhcmluZyA9IGdseXBoLmxlZnRTaWRlQmVhcmluZyB8fCAwO1xuICAgICAgICB0LmZpZWxkcy5wdXNoKHtuYW1lOiAnYWR2YW5jZVdpZHRoXycgKyBpLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IGFkdmFuY2VXaWR0aH0pO1xuICAgICAgICB0LmZpZWxkcy5wdXNoKHtuYW1lOiAnbGVmdFNpZGVCZWFyaW5nXycgKyBpLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogbGVmdFNpZGVCZWFyaW5nfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG59XG5cbnZhciBobXR4ID0geyBwYXJzZTogcGFyc2VIbXR4VGFibGUsIG1ha2U6IG1ha2VIbXR4VGFibGUgfTtcblxuLy8gVGhlIGBsdGFnYCB0YWJsZSBzdG9yZXMgSUVURiBCQ1AtNDcgbGFuZ3VhZ2UgdGFncy4gSXQgYWxsb3dzIHN1cHBvcnRpbmdcbi8vIGxhbmd1YWdlcyBmb3Igd2hpY2ggVHJ1ZVR5cGUgZG9lcyBub3QgYXNzaWduIGEgbnVtZXJpYyBjb2RlLlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmx0YWcuaHRtbFxuLy8gaHR0cDovL3d3dy53My5vcmcvSW50ZXJuYXRpb25hbC9hcnRpY2xlcy9sYW5ndWFnZS10YWdzL1xuLy8gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnkvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5XG5cbmZ1bmN0aW9uIG1ha2VMdGFnVGFibGUodGFncykge1xuICAgIHZhciByZXN1bHQgPSBuZXcgdGFibGUuVGFibGUoJ2x0YWcnLCBbXG4gICAgICAgIHtuYW1lOiAndmVyc2lvbicsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiAxfSxcbiAgICAgICAge25hbWU6ICdmbGFncycsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdudW1UYWdzJywgdHlwZTogJ1VMT05HJywgdmFsdWU6IHRhZ3MubGVuZ3RofVxuICAgIF0pO1xuXG4gICAgdmFyIHN0cmluZ1Bvb2wgPSAnJztcbiAgICB2YXIgc3RyaW5nUG9vbE9mZnNldCA9IDEyICsgdGFncy5sZW5ndGggKiA0O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFncy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcG9zID0gc3RyaW5nUG9vbC5pbmRleE9mKHRhZ3NbaV0pO1xuICAgICAgICBpZiAocG9zIDwgMCkge1xuICAgICAgICAgICAgcG9zID0gc3RyaW5nUG9vbC5sZW5ndGg7XG4gICAgICAgICAgICBzdHJpbmdQb29sICs9IHRhZ3NbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQuZmllbGRzLnB1c2goe25hbWU6ICdvZmZzZXQgJyArIGksIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogc3RyaW5nUG9vbE9mZnNldCArIHBvc30pO1xuICAgICAgICByZXN1bHQuZmllbGRzLnB1c2goe25hbWU6ICdsZW5ndGggJyArIGksIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogdGFnc1tpXS5sZW5ndGh9KTtcbiAgICB9XG5cbiAgICByZXN1bHQuZmllbGRzLnB1c2goe25hbWU6ICdzdHJpbmdQb29sJywgdHlwZTogJ0NIQVJBUlJBWScsIHZhbHVlOiBzdHJpbmdQb29sfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcGFyc2VMdGFnVGFibGUoZGF0YSwgc3RhcnQpIHtcbiAgICB2YXIgcCA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIHZhciB0YWJsZVZlcnNpb24gPSBwLnBhcnNlVUxvbmcoKTtcbiAgICBjaGVjay5hcmd1bWVudCh0YWJsZVZlcnNpb24gPT09IDEsICdVbnN1cHBvcnRlZCBsdGFnIHRhYmxlIHZlcnNpb24uJyk7XG4gICAgLy8gVGhlICdsdGFnJyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGRlZmluZSBhbnkgZmxhZ3M7IHNraXAgdGhlIGZpZWxkLlxuICAgIHAuc2tpcCgndUxvbmcnLCAxKTtcbiAgICB2YXIgbnVtVGFncyA9IHAucGFyc2VVTG9uZygpO1xuXG4gICAgdmFyIHRhZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVRhZ3M7IGkrKykge1xuICAgICAgICB2YXIgdGFnID0gJyc7XG4gICAgICAgIHZhciBvZmZzZXQgPSBzdGFydCArIHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IG9mZnNldDsgaiA8IG9mZnNldCArIGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB0YWcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhLmdldEludDgoaikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFncy5wdXNoKHRhZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhZ3M7XG59XG5cbnZhciBsdGFnID0geyBtYWtlOiBtYWtlTHRhZ1RhYmxlLCBwYXJzZTogcGFyc2VMdGFnVGFibGUgfTtcblxuLy8gVGhlIGBtYXhwYCB0YWJsZSBlc3RhYmxpc2hlcyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgdGhlIGZvbnQuXG4vLyBXZSBuZWVkIGl0IGp1c3QgdG8gZ2V0IHRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSBmb250LlxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9tYXhwLmh0bVxuXG4vLyBQYXJzZSB0aGUgbWF4aW11bSBwcm9maWxlIGBtYXhwYCB0YWJsZS5cbmZ1bmN0aW9uIHBhcnNlTWF4cFRhYmxlKGRhdGEsIHN0YXJ0KSB7XG4gICAgdmFyIG1heHAgPSB7fTtcbiAgICB2YXIgcCA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIG1heHAudmVyc2lvbiA9IHAucGFyc2VWZXJzaW9uKCk7XG4gICAgbWF4cC5udW1HbHlwaHMgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgaWYgKG1heHAudmVyc2lvbiA9PT0gMS4wKSB7XG4gICAgICAgIG1heHAubWF4UG9pbnRzID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICBtYXhwLm1heENvbnRvdXJzID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICBtYXhwLm1heENvbXBvc2l0ZVBvaW50cyA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgbWF4cC5tYXhDb21wb3NpdGVDb250b3VycyA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgbWF4cC5tYXhab25lcyA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgbWF4cC5tYXhUd2lsaWdodFBvaW50cyA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgbWF4cC5tYXhTdG9yYWdlID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICBtYXhwLm1heEZ1bmN0aW9uRGVmcyA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgbWF4cC5tYXhJbnN0cnVjdGlvbkRlZnMgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIG1heHAubWF4U3RhY2tFbGVtZW50cyA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgbWF4cC5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIG1heHAubWF4Q29tcG9uZW50RWxlbWVudHMgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIG1heHAubWF4Q29tcG9uZW50RGVwdGggPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heHA7XG59XG5cbmZ1bmN0aW9uIG1ha2VNYXhwVGFibGUobnVtR2x5cGhzKSB7XG4gICAgcmV0dXJuIG5ldyB0YWJsZS5UYWJsZSgnbWF4cCcsIFtcbiAgICAgICAge25hbWU6ICd2ZXJzaW9uJywgdHlwZTogJ0ZJWEVEJywgdmFsdWU6IDB4MDAwMDUwMDB9LFxuICAgICAgICB7bmFtZTogJ251bUdseXBocycsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogbnVtR2x5cGhzfVxuICAgIF0pO1xufVxuXG52YXIgbWF4cCA9IHsgcGFyc2U6IHBhcnNlTWF4cFRhYmxlLCBtYWtlOiBtYWtlTWF4cFRhYmxlIH07XG5cbi8vIFRoZSBgbmFtZWAgbmFtaW5nIHRhYmxlLlxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9uYW1lLmh0bVxuXG4vLyBOYW1lSURzIGZvciB0aGUgbmFtZSB0YWJsZS5cbnZhciBuYW1lVGFibGVOYW1lcyA9IFtcbiAgICAnY29weXJpZ2h0JywgICAgICAgICAgICAgIC8vIDBcbiAgICAnZm9udEZhbWlseScsICAgICAgICAgICAgIC8vIDFcbiAgICAnZm9udFN1YmZhbWlseScsICAgICAgICAgIC8vIDJcbiAgICAndW5pcXVlSUQnLCAgICAgICAgICAgICAgIC8vIDNcbiAgICAnZnVsbE5hbWUnLCAgICAgICAgICAgICAgIC8vIDRcbiAgICAndmVyc2lvbicsICAgICAgICAgICAgICAgIC8vIDVcbiAgICAncG9zdFNjcmlwdE5hbWUnLCAgICAgICAgIC8vIDZcbiAgICAndHJhZGVtYXJrJywgICAgICAgICAgICAgIC8vIDdcbiAgICAnbWFudWZhY3R1cmVyJywgICAgICAgICAgIC8vIDhcbiAgICAnZGVzaWduZXInLCAgICAgICAgICAgICAgIC8vIDlcbiAgICAnZGVzY3JpcHRpb24nLCAgICAgICAgICAgIC8vIDEwXG4gICAgJ21hbnVmYWN0dXJlclVSTCcsICAgICAgICAvLyAxMVxuICAgICdkZXNpZ25lclVSTCcsICAgICAgICAgICAgLy8gMTJcbiAgICAnbGljZW5zZScsICAgICAgICAgICAgICAgIC8vIDEzXG4gICAgJ2xpY2Vuc2VVUkwnLCAgICAgICAgICAgICAvLyAxNFxuICAgICdyZXNlcnZlZCcsICAgICAgICAgICAgICAgLy8gMTVcbiAgICAncHJlZmVycmVkRmFtaWx5JywgICAgICAgIC8vIDE2XG4gICAgJ3ByZWZlcnJlZFN1YmZhbWlseScsICAgICAvLyAxN1xuICAgICdjb21wYXRpYmxlRnVsbE5hbWUnLCAgICAgLy8gMThcbiAgICAnc2FtcGxlVGV4dCcsICAgICAgICAgICAgIC8vIDE5XG4gICAgJ3Bvc3RTY3JpcHRGaW5kRm9udE5hbWUnLCAvLyAyMFxuICAgICd3d3NGYW1pbHknLCAgICAgICAgICAgICAgLy8gMjFcbiAgICAnd3dzU3ViZmFtaWx5JyAgICAgICAgICAgIC8vIDIyXG5dO1xuXG52YXIgbWFjTGFuZ3VhZ2VzID0ge1xuICAgIDA6ICdlbicsXG4gICAgMTogJ2ZyJyxcbiAgICAyOiAnZGUnLFxuICAgIDM6ICdpdCcsXG4gICAgNDogJ25sJyxcbiAgICA1OiAnc3YnLFxuICAgIDY6ICdlcycsXG4gICAgNzogJ2RhJyxcbiAgICA4OiAncHQnLFxuICAgIDk6ICdubycsXG4gICAgMTA6ICdoZScsXG4gICAgMTE6ICdqYScsXG4gICAgMTI6ICdhcicsXG4gICAgMTM6ICdmaScsXG4gICAgMTQ6ICdlbCcsXG4gICAgMTU6ICdpcycsXG4gICAgMTY6ICdtdCcsXG4gICAgMTc6ICd0cicsXG4gICAgMTg6ICdocicsXG4gICAgMTk6ICd6aC1IYW50JyxcbiAgICAyMDogJ3VyJyxcbiAgICAyMTogJ2hpJyxcbiAgICAyMjogJ3RoJyxcbiAgICAyMzogJ2tvJyxcbiAgICAyNDogJ2x0JyxcbiAgICAyNTogJ3BsJyxcbiAgICAyNjogJ2h1JyxcbiAgICAyNzogJ2VzJyxcbiAgICAyODogJ2x2JyxcbiAgICAyOTogJ3NlJyxcbiAgICAzMDogJ2ZvJyxcbiAgICAzMTogJ2ZhJyxcbiAgICAzMjogJ3J1JyxcbiAgICAzMzogJ3poJyxcbiAgICAzNDogJ25sLUJFJyxcbiAgICAzNTogJ2dhJyxcbiAgICAzNjogJ3NxJyxcbiAgICAzNzogJ3JvJyxcbiAgICAzODogJ2N6JyxcbiAgICAzOTogJ3NrJyxcbiAgICA0MDogJ3NpJyxcbiAgICA0MTogJ3lpJyxcbiAgICA0MjogJ3NyJyxcbiAgICA0MzogJ21rJyxcbiAgICA0NDogJ2JnJyxcbiAgICA0NTogJ3VrJyxcbiAgICA0NjogJ2JlJyxcbiAgICA0NzogJ3V6JyxcbiAgICA0ODogJ2trJyxcbiAgICA0OTogJ2F6LUN5cmwnLFxuICAgIDUwOiAnYXotQXJhYicsXG4gICAgNTE6ICdoeScsXG4gICAgNTI6ICdrYScsXG4gICAgNTM6ICdtbycsXG4gICAgNTQ6ICdreScsXG4gICAgNTU6ICd0ZycsXG4gICAgNTY6ICd0aycsXG4gICAgNTc6ICdtbi1DTicsXG4gICAgNTg6ICdtbicsXG4gICAgNTk6ICdwcycsXG4gICAgNjA6ICdrcycsXG4gICAgNjE6ICdrdScsXG4gICAgNjI6ICdzZCcsXG4gICAgNjM6ICdibycsXG4gICAgNjQ6ICduZScsXG4gICAgNjU6ICdzYScsXG4gICAgNjY6ICdtcicsXG4gICAgNjc6ICdibicsXG4gICAgNjg6ICdhcycsXG4gICAgNjk6ICdndScsXG4gICAgNzA6ICdwYScsXG4gICAgNzE6ICdvcicsXG4gICAgNzI6ICdtbCcsXG4gICAgNzM6ICdrbicsXG4gICAgNzQ6ICd0YScsXG4gICAgNzU6ICd0ZScsXG4gICAgNzY6ICdzaScsXG4gICAgNzc6ICdteScsXG4gICAgNzg6ICdrbScsXG4gICAgNzk6ICdsbycsXG4gICAgODA6ICd2aScsXG4gICAgODE6ICdpZCcsXG4gICAgODI6ICd0bCcsXG4gICAgODM6ICdtcycsXG4gICAgODQ6ICdtcy1BcmFiJyxcbiAgICA4NTogJ2FtJyxcbiAgICA4NjogJ3RpJyxcbiAgICA4NzogJ29tJyxcbiAgICA4ODogJ3NvJyxcbiAgICA4OTogJ3N3JyxcbiAgICA5MDogJ3J3JyxcbiAgICA5MTogJ3JuJyxcbiAgICA5MjogJ255JyxcbiAgICA5MzogJ21nJyxcbiAgICA5NDogJ2VvJyxcbiAgICAxMjg6ICdjeScsXG4gICAgMTI5OiAnZXUnLFxuICAgIDEzMDogJ2NhJyxcbiAgICAxMzE6ICdsYScsXG4gICAgMTMyOiAncXUnLFxuICAgIDEzMzogJ2duJyxcbiAgICAxMzQ6ICdheScsXG4gICAgMTM1OiAndHQnLFxuICAgIDEzNjogJ3VnJyxcbiAgICAxMzc6ICdkeicsXG4gICAgMTM4OiAnanYnLFxuICAgIDEzOTogJ3N1JyxcbiAgICAxNDA6ICdnbCcsXG4gICAgMTQxOiAnYWYnLFxuICAgIDE0MjogJ2JyJyxcbiAgICAxNDM6ICdpdScsXG4gICAgMTQ0OiAnZ2QnLFxuICAgIDE0NTogJ2d2JyxcbiAgICAxNDY6ICdnYScsXG4gICAgMTQ3OiAndG8nLFxuICAgIDE0ODogJ2VsLXBvbHl0b24nLFxuICAgIDE0OTogJ2tsJyxcbiAgICAxNTA6ICdheicsXG4gICAgMTUxOiAnbm4nXG59O1xuXG4vLyBNYWNPUyBsYW5ndWFnZSBJRCDihpIgTWFjT1Mgc2NyaXB0IElEXG4vL1xuLy8gTm90ZSB0aGF0IHRoZSBzY3JpcHQgSUQgaXMgbm90IHN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHdoYXQgZW5jb2Rpbmdcbi8vIHRvIHVzZSBpbiBUcnVlVHlwZSBmaWxlcy4gRm9yIHNvbWUgbGFuZ3VhZ2VzLCBNYWNPUyB1c2VkIGEgbW9kaWZpY2F0aW9uXG4vLyBvZiBhIG1haW5zdHJlYW0gc2NyaXB0LiBGb3IgZXhhbXBsZSwgYW4gSWNlbGFuZGljIG5hbWUgd291bGQgYmUgc3RvcmVkXG4vLyB3aXRoIHNtUm9tYW4gaW4gdGhlIFRydWVUeXBlIG5hbWluZyB0YWJsZSwgYnV0IHRoZSBhY3R1YWwgZW5jb2Rpbmdcbi8vIGlzIGEgc3BlY2lhbCBJY2VsYW5kaWMgdmVyc2lvbiBvZiB0aGUgbm9ybWFsIE1hY2ludG9zaCBSb21hbiBlbmNvZGluZy5cbi8vIEFzIGFub3RoZXIgZXhhbXBsZSwgSW51a3RpdHV0IHVzZXMgYW4gOC1iaXQgZW5jb2RpbmcgZm9yIENhbmFkaWFuIEFib3JpZ2luYWxcbi8vIFN5bGxhYmxlcyBidXQgTWFjT1MgaGFkIHJ1biBvdXQgb2YgYXZhaWxhYmxlIHNjcmlwdCBjb2Rlcywgc28gdGhpcyB3YXNcbi8vIGRvbmUgYXMgYSAocHJldHR5IHJhZGljYWwpIFwibW9kaWZpY2F0aW9uXCIgb2YgRXRoaW9waWMuXG4vL1xuLy8gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL0FQUExFL1JlYWRtZS50eHRcbnZhciBtYWNMYW5ndWFnZVRvU2NyaXB0ID0ge1xuICAgIDA6IDAsICAvLyBsYW5nRW5nbGlzaCDihpIgc21Sb21hblxuICAgIDE6IDAsICAvLyBsYW5nRnJlbmNoIOKGkiBzbVJvbWFuXG4gICAgMjogMCwgIC8vIGxhbmdHZXJtYW4g4oaSIHNtUm9tYW5cbiAgICAzOiAwLCAgLy8gbGFuZ0l0YWxpYW4g4oaSIHNtUm9tYW5cbiAgICA0OiAwLCAgLy8gbGFuZ0R1dGNoIOKGkiBzbVJvbWFuXG4gICAgNTogMCwgIC8vIGxhbmdTd2VkaXNoIOKGkiBzbVJvbWFuXG4gICAgNjogMCwgIC8vIGxhbmdTcGFuaXNoIOKGkiBzbVJvbWFuXG4gICAgNzogMCwgIC8vIGxhbmdEYW5pc2gg4oaSIHNtUm9tYW5cbiAgICA4OiAwLCAgLy8gbGFuZ1BvcnR1Z3Vlc2Ug4oaSIHNtUm9tYW5cbiAgICA5OiAwLCAgLy8gbGFuZ05vcndlZ2lhbiDihpIgc21Sb21hblxuICAgIDEwOiA1LCAgLy8gbGFuZ0hlYnJldyDihpIgc21IZWJyZXdcbiAgICAxMTogMSwgIC8vIGxhbmdKYXBhbmVzZSDihpIgc21KYXBhbmVzZVxuICAgIDEyOiA0LCAgLy8gbGFuZ0FyYWJpYyDihpIgc21BcmFiaWNcbiAgICAxMzogMCwgIC8vIGxhbmdGaW5uaXNoIOKGkiBzbVJvbWFuXG4gICAgMTQ6IDYsICAvLyBsYW5nR3JlZWsg4oaSIHNtR3JlZWtcbiAgICAxNTogMCwgIC8vIGxhbmdJY2VsYW5kaWMg4oaSIHNtUm9tYW4gKG1vZGlmaWVkKVxuICAgIDE2OiAwLCAgLy8gbGFuZ01hbHRlc2Ug4oaSIHNtUm9tYW5cbiAgICAxNzogMCwgIC8vIGxhbmdUdXJraXNoIOKGkiBzbVJvbWFuIChtb2RpZmllZClcbiAgICAxODogMCwgIC8vIGxhbmdDcm9hdGlhbiDihpIgc21Sb21hbiAobW9kaWZpZWQpXG4gICAgMTk6IDIsICAvLyBsYW5nVHJhZENoaW5lc2Ug4oaSIHNtVHJhZENoaW5lc2VcbiAgICAyMDogNCwgIC8vIGxhbmdVcmR1IOKGkiBzbUFyYWJpY1xuICAgIDIxOiA5LCAgLy8gbGFuZ0hpbmRpIOKGkiBzbURldmFuYWdhcmlcbiAgICAyMjogMjEsICAvLyBsYW5nVGhhaSDihpIgc21UaGFpXG4gICAgMjM6IDMsICAvLyBsYW5nS29yZWFuIOKGkiBzbUtvcmVhblxuICAgIDI0OiAyOSwgIC8vIGxhbmdMaXRodWFuaWFuIOKGkiBzbUNlbnRyYWxFdXJvUm9tYW5cbiAgICAyNTogMjksICAvLyBsYW5nUG9saXNoIOKGkiBzbUNlbnRyYWxFdXJvUm9tYW5cbiAgICAyNjogMjksICAvLyBsYW5nSHVuZ2FyaWFuIOKGkiBzbUNlbnRyYWxFdXJvUm9tYW5cbiAgICAyNzogMjksICAvLyBsYW5nRXN0b25pYW4g4oaSIHNtQ2VudHJhbEV1cm9Sb21hblxuICAgIDI4OiAyOSwgIC8vIGxhbmdMYXR2aWFuIOKGkiBzbUNlbnRyYWxFdXJvUm9tYW5cbiAgICAyOTogMCwgIC8vIGxhbmdTYW1pIOKGkiBzbVJvbWFuXG4gICAgMzA6IDAsICAvLyBsYW5nRmFyb2VzZSDihpIgc21Sb21hbiAobW9kaWZpZWQpXG4gICAgMzE6IDQsICAvLyBsYW5nRmFyc2kg4oaSIHNtQXJhYmljIChtb2RpZmllZClcbiAgICAzMjogNywgIC8vIGxhbmdSdXNzaWFuIOKGkiBzbUN5cmlsbGljXG4gICAgMzM6IDI1LCAgLy8gbGFuZ1NpbXBDaGluZXNlIOKGkiBzbVNpbXBDaGluZXNlXG4gICAgMzQ6IDAsICAvLyBsYW5nRmxlbWlzaCDihpIgc21Sb21hblxuICAgIDM1OiAwLCAgLy8gbGFuZ0lyaXNoR2FlbGljIOKGkiBzbVJvbWFuIChtb2RpZmllZClcbiAgICAzNjogMCwgIC8vIGxhbmdBbGJhbmlhbiDihpIgc21Sb21hblxuICAgIDM3OiAwLCAgLy8gbGFuZ1JvbWFuaWFuIOKGkiBzbVJvbWFuIChtb2RpZmllZClcbiAgICAzODogMjksICAvLyBsYW5nQ3plY2gg4oaSIHNtQ2VudHJhbEV1cm9Sb21hblxuICAgIDM5OiAyOSwgIC8vIGxhbmdTbG92YWsg4oaSIHNtQ2VudHJhbEV1cm9Sb21hblxuICAgIDQwOiAwLCAgLy8gbGFuZ1Nsb3ZlbmlhbiDihpIgc21Sb21hbiAobW9kaWZpZWQpXG4gICAgNDE6IDUsICAvLyBsYW5nWWlkZGlzaCDihpIgc21IZWJyZXdcbiAgICA0MjogNywgIC8vIGxhbmdTZXJiaWFuIOKGkiBzbUN5cmlsbGljXG4gICAgNDM6IDcsICAvLyBsYW5nTWFjZWRvbmlhbiDihpIgc21DeXJpbGxpY1xuICAgIDQ0OiA3LCAgLy8gbGFuZ0J1bGdhcmlhbiDihpIgc21DeXJpbGxpY1xuICAgIDQ1OiA3LCAgLy8gbGFuZ1VrcmFpbmlhbiDihpIgc21DeXJpbGxpYyAobW9kaWZpZWQpXG4gICAgNDY6IDcsICAvLyBsYW5nQnllbG9ydXNzaWFuIOKGkiBzbUN5cmlsbGljXG4gICAgNDc6IDcsICAvLyBsYW5nVXpiZWsg4oaSIHNtQ3lyaWxsaWNcbiAgICA0ODogNywgIC8vIGxhbmdLYXpha2gg4oaSIHNtQ3lyaWxsaWNcbiAgICA0OTogNywgIC8vIGxhbmdBemVyYmFpamFuaSDihpIgc21DeXJpbGxpY1xuICAgIDUwOiA0LCAgLy8gbGFuZ0F6ZXJiYWlqYW5BciDihpIgc21BcmFiaWNcbiAgICA1MTogMjQsICAvLyBsYW5nQXJtZW5pYW4g4oaSIHNtQXJtZW5pYW5cbiAgICA1MjogMjMsICAvLyBsYW5nR2VvcmdpYW4g4oaSIHNtR2VvcmdpYW5cbiAgICA1MzogNywgIC8vIGxhbmdNb2xkYXZpYW4g4oaSIHNtQ3lyaWxsaWNcbiAgICA1NDogNywgIC8vIGxhbmdLaXJnaGl6IOKGkiBzbUN5cmlsbGljXG4gICAgNTU6IDcsICAvLyBsYW5nVGFqaWtpIOKGkiBzbUN5cmlsbGljXG4gICAgNTY6IDcsICAvLyBsYW5nVHVya21lbiDihpIgc21DeXJpbGxpY1xuICAgIDU3OiAyNywgIC8vIGxhbmdNb25nb2xpYW4g4oaSIHNtTW9uZ29saWFuXG4gICAgNTg6IDcsICAvLyBsYW5nTW9uZ29saWFuQ3lyIOKGkiBzbUN5cmlsbGljXG4gICAgNTk6IDQsICAvLyBsYW5nUGFzaHRvIOKGkiBzbUFyYWJpY1xuICAgIDYwOiA0LCAgLy8gbGFuZ0t1cmRpc2gg4oaSIHNtQXJhYmljXG4gICAgNjE6IDQsICAvLyBsYW5nS2FzaG1pcmkg4oaSIHNtQXJhYmljXG4gICAgNjI6IDQsICAvLyBsYW5nU2luZGhpIOKGkiBzbUFyYWJpY1xuICAgIDYzOiAyNiwgIC8vIGxhbmdUaWJldGFuIOKGkiBzbVRpYmV0YW5cbiAgICA2NDogOSwgIC8vIGxhbmdOZXBhbGkg4oaSIHNtRGV2YW5hZ2FyaVxuICAgIDY1OiA5LCAgLy8gbGFuZ1NhbnNrcml0IOKGkiBzbURldmFuYWdhcmlcbiAgICA2NjogOSwgIC8vIGxhbmdNYXJhdGhpIOKGkiBzbURldmFuYWdhcmlcbiAgICA2NzogMTMsICAvLyBsYW5nQmVuZ2FsaSDihpIgc21CZW5nYWxpXG4gICAgNjg6IDEzLCAgLy8gbGFuZ0Fzc2FtZXNlIOKGkiBzbUJlbmdhbGlcbiAgICA2OTogMTEsICAvLyBsYW5nR3VqYXJhdGkg4oaSIHNtR3VqYXJhdGlcbiAgICA3MDogMTAsICAvLyBsYW5nUHVuamFiaSDihpIgc21HdXJtdWtoaVxuICAgIDcxOiAxMiwgIC8vIGxhbmdPcml5YSDihpIgc21Pcml5YVxuICAgIDcyOiAxNywgIC8vIGxhbmdNYWxheWFsYW0g4oaSIHNtTWFsYXlhbGFtXG4gICAgNzM6IDE2LCAgLy8gbGFuZ0thbm5hZGEg4oaSIHNtS2FubmFkYVxuICAgIDc0OiAxNCwgIC8vIGxhbmdUYW1pbCDihpIgc21UYW1pbFxuICAgIDc1OiAxNSwgIC8vIGxhbmdUZWx1Z3Ug4oaSIHNtVGVsdWd1XG4gICAgNzY6IDE4LCAgLy8gbGFuZ1NpbmhhbGVzZSDihpIgc21TaW5oYWxlc2VcbiAgICA3NzogMTksICAvLyBsYW5nQnVybWVzZSDihpIgc21CdXJtZXNlXG4gICAgNzg6IDIwLCAgLy8gbGFuZ0tobWVyIOKGkiBzbUtobWVyXG4gICAgNzk6IDIyLCAgLy8gbGFuZ0xhbyDihpIgc21MYW9cbiAgICA4MDogMzAsICAvLyBsYW5nVmlldG5hbWVzZSDihpIgc21WaWV0bmFtZXNlXG4gICAgODE6IDAsICAvLyBsYW5nSW5kb25lc2lhbiDihpIgc21Sb21hblxuICAgIDgyOiAwLCAgLy8gbGFuZ1RhZ2Fsb2cg4oaSIHNtUm9tYW5cbiAgICA4MzogMCwgIC8vIGxhbmdNYWxheVJvbWFuIOKGkiBzbVJvbWFuXG4gICAgODQ6IDQsICAvLyBsYW5nTWFsYXlBcmFiaWMg4oaSIHNtQXJhYmljXG4gICAgODU6IDI4LCAgLy8gbGFuZ0FtaGFyaWMg4oaSIHNtRXRoaW9waWNcbiAgICA4NjogMjgsICAvLyBsYW5nVGlncmlueWEg4oaSIHNtRXRoaW9waWNcbiAgICA4NzogMjgsICAvLyBsYW5nT3JvbW8g4oaSIHNtRXRoaW9waWNcbiAgICA4ODogMCwgIC8vIGxhbmdTb21hbGkg4oaSIHNtUm9tYW5cbiAgICA4OTogMCwgIC8vIGxhbmdTd2FoaWxpIOKGkiBzbVJvbWFuXG4gICAgOTA6IDAsICAvLyBsYW5nS2lueWFyd2FuZGEg4oaSIHNtUm9tYW5cbiAgICA5MTogMCwgIC8vIGxhbmdSdW5kaSDihpIgc21Sb21hblxuICAgIDkyOiAwLCAgLy8gbGFuZ055YW5qYSDihpIgc21Sb21hblxuICAgIDkzOiAwLCAgLy8gbGFuZ01hbGFnYXN5IOKGkiBzbVJvbWFuXG4gICAgOTQ6IDAsICAvLyBsYW5nRXNwZXJhbnRvIOKGkiBzbVJvbWFuXG4gICAgMTI4OiAwLCAgLy8gbGFuZ1dlbHNoIOKGkiBzbVJvbWFuIChtb2RpZmllZClcbiAgICAxMjk6IDAsICAvLyBsYW5nQmFzcXVlIOKGkiBzbVJvbWFuXG4gICAgMTMwOiAwLCAgLy8gbGFuZ0NhdGFsYW4g4oaSIHNtUm9tYW5cbiAgICAxMzE6IDAsICAvLyBsYW5nTGF0aW4g4oaSIHNtUm9tYW5cbiAgICAxMzI6IDAsICAvLyBsYW5nUXVlY2h1YSDihpIgc21Sb21hblxuICAgIDEzMzogMCwgIC8vIGxhbmdHdWFyYW5pIOKGkiBzbVJvbWFuXG4gICAgMTM0OiAwLCAgLy8gbGFuZ0F5bWFyYSDihpIgc21Sb21hblxuICAgIDEzNTogNywgIC8vIGxhbmdUYXRhciDihpIgc21DeXJpbGxpY1xuICAgIDEzNjogNCwgIC8vIGxhbmdVaWdodXIg4oaSIHNtQXJhYmljXG4gICAgMTM3OiAyNiwgIC8vIGxhbmdEem9uZ2toYSDihpIgc21UaWJldGFuXG4gICAgMTM4OiAwLCAgLy8gbGFuZ0phdmFuZXNlUm9tIOKGkiBzbVJvbWFuXG4gICAgMTM5OiAwLCAgLy8gbGFuZ1N1bmRhbmVzZVJvbSDihpIgc21Sb21hblxuICAgIDE0MDogMCwgIC8vIGxhbmdHYWxpY2lhbiDihpIgc21Sb21hblxuICAgIDE0MTogMCwgIC8vIGxhbmdBZnJpa2FhbnMg4oaSIHNtUm9tYW5cbiAgICAxNDI6IDAsICAvLyBsYW5nQnJldG9uIOKGkiBzbVJvbWFuIChtb2RpZmllZClcbiAgICAxNDM6IDI4LCAgLy8gbGFuZ0ludWt0aXR1dCDihpIgc21FdGhpb3BpYyAobW9kaWZpZWQpXG4gICAgMTQ0OiAwLCAgLy8gbGFuZ1Njb3R0aXNoR2FlbGljIOKGkiBzbVJvbWFuIChtb2RpZmllZClcbiAgICAxNDU6IDAsICAvLyBsYW5nTWFueEdhZWxpYyDihpIgc21Sb21hbiAobW9kaWZpZWQpXG4gICAgMTQ2OiAwLCAgLy8gbGFuZ0lyaXNoR2FlbGljU2NyaXB0IOKGkiBzbVJvbWFuIChtb2RpZmllZClcbiAgICAxNDc6IDAsICAvLyBsYW5nVG9uZ2FuIOKGkiBzbVJvbWFuXG4gICAgMTQ4OiA2LCAgLy8gbGFuZ0dyZWVrQW5jaWVudCDihpIgc21Sb21hblxuICAgIDE0OTogMCwgIC8vIGxhbmdHcmVlbmxhbmRpYyDihpIgc21Sb21hblxuICAgIDE1MDogMCwgIC8vIGxhbmdBemVyYmFpamFuUm9tYW4g4oaSIHNtUm9tYW5cbiAgICAxNTE6IDAgICAvLyBsYW5nTnlub3JzayDihpIgc21Sb21hblxufTtcblxuLy8gV2hpbGUgTWljcm9zb2Z0IGluZGljYXRlcyBhIHJlZ2lvbi9jb3VudHJ5IGZvciBhbGwgaXRzIGxhbmd1YWdlXG4vLyBJRHMsIHdlIG9taXQgdGhlIHJlZ2lvbiBjb2RlIGlmIGl0J3MgZXF1YWwgdG8gdGhlIFwibW9zdCBsaWtlbHlcbi8vIHJlZ2lvbiBzdWJ0YWdcIiBhY2NvcmRpbmcgdG8gVW5pY29kZSBDTERSLiBGb3Igc2NyaXB0cywgd2Ugb21pdFxuLy8gdGhlIHN1YnRhZyBpZiBpdCBpcyBlcXVhbCB0byB0aGUgU3VwcHJlc3MtU2NyaXB0IGVudHJ5IGluIHRoZVxuLy8gSUFOQSBsYW5ndWFnZSBzdWJ0YWcgcmVnaXN0cnkgZm9yIElFVEYgQkNQIDQ3LlxuLy9cbi8vIEZvciBleGFtcGxlLCBNaWNyb3NvZnQgc3RhdGVzIHRoYXQgaXRzIGxhbmd1YWdlIGNvZGUgMHgwNDFBIGlzXG4vLyBDcm9hdGlhbiBpbiBDcm9hdGlhLiBXZSB0cmFuc2Zvcm0gdGhpcyB0byB0aGUgQkNQIDQ3IGxhbmd1YWdlIGNvZGUgJ2hyJ1xuLy8gYW5kIG5vdCAnaHItSFInIGJlY2F1c2UgQ3JvYXRpYSBpcyB0aGUgZGVmYXVsdCBjb3VudHJ5IGZvciBDcm9hdGlhbixcbi8vIGFjY29yZGluZyB0byBVbmljb2RlIENMRFIuIEFzIGFub3RoZXIgZXhhbXBsZSwgTWljcm9zb2Z0IHN0YXRlc1xuLy8gdGhhdCAweDEwMUEgaXMgQ3JvYXRpYW4gKExhdGluKSBpbiBCb3NuaWEtSGVyemVnb3ZpbmEuIFdlIHRyYW5zZm9ybVxuLy8gdGhpcyB0byAnaHItQkEnIGFuZCBub3QgJ2hyLUxhdG4tQkEnIGJlY2F1c2UgTGF0aW4gaXMgdGhlIGRlZmF1bHQgc2NyaXB0XG4vLyBmb3IgdGhlIENyb2F0aWFuIGxhbmd1YWdlLCBhY2NvcmRpbmcgdG8gSUFOQS5cbi8vXG4vLyBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NsZHIvY2hhcnRzL2xhdGVzdC9zdXBwbGVtZW50YWwvbGlrZWx5X3N1YnRhZ3MuaHRtbFxuLy8gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnkvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5XG52YXIgd2luZG93c0xhbmd1YWdlcyA9IHtcbiAgICAweDA0MzY6ICdhZicsXG4gICAgMHgwNDFDOiAnc3EnLFxuICAgIDB4MDQ4NDogJ2dzdycsXG4gICAgMHgwNDVFOiAnYW0nLFxuICAgIDB4MTQwMTogJ2FyLURaJyxcbiAgICAweDNDMDE6ICdhci1CSCcsXG4gICAgMHgwQzAxOiAnYXInLFxuICAgIDB4MDgwMTogJ2FyLUlRJyxcbiAgICAweDJDMDE6ICdhci1KTycsXG4gICAgMHgzNDAxOiAnYXItS1cnLFxuICAgIDB4MzAwMTogJ2FyLUxCJyxcbiAgICAweDEwMDE6ICdhci1MWScsXG4gICAgMHgxODAxOiAnYXJ5JyxcbiAgICAweDIwMDE6ICdhci1PTScsXG4gICAgMHg0MDAxOiAnYXItUUEnLFxuICAgIDB4MDQwMTogJ2FyLVNBJyxcbiAgICAweDI4MDE6ICdhci1TWScsXG4gICAgMHgxQzAxOiAnYWViJyxcbiAgICAweDM4MDE6ICdhci1BRScsXG4gICAgMHgyNDAxOiAnYXItWUUnLFxuICAgIDB4MDQyQjogJ2h5JyxcbiAgICAweDA0NEQ6ICdhcycsXG4gICAgMHgwODJDOiAnYXotQ3lybCcsXG4gICAgMHgwNDJDOiAnYXonLFxuICAgIDB4MDQ2RDogJ2JhJyxcbiAgICAweDA0MkQ6ICdldScsXG4gICAgMHgwNDIzOiAnYmUnLFxuICAgIDB4MDg0NTogJ2JuJyxcbiAgICAweDA0NDU6ICdibi1JTicsXG4gICAgMHgyMDFBOiAnYnMtQ3lybCcsXG4gICAgMHgxNDFBOiAnYnMnLFxuICAgIDB4MDQ3RTogJ2JyJyxcbiAgICAweDA0MDI6ICdiZycsXG4gICAgMHgwNDAzOiAnY2EnLFxuICAgIDB4MEMwNDogJ3poLUhLJyxcbiAgICAweDE0MDQ6ICd6aC1NTycsXG4gICAgMHgwODA0OiAnemgnLFxuICAgIDB4MTAwNDogJ3poLVNHJyxcbiAgICAweDA0MDQ6ICd6aC1UVycsXG4gICAgMHgwNDgzOiAnY28nLFxuICAgIDB4MDQxQTogJ2hyJyxcbiAgICAweDEwMUE6ICdoci1CQScsXG4gICAgMHgwNDA1OiAnY3MnLFxuICAgIDB4MDQwNjogJ2RhJyxcbiAgICAweDA0OEM6ICdwcnMnLFxuICAgIDB4MDQ2NTogJ2R2JyxcbiAgICAweDA4MTM6ICdubC1CRScsXG4gICAgMHgwNDEzOiAnbmwnLFxuICAgIDB4MEMwOTogJ2VuLUFVJyxcbiAgICAweDI4MDk6ICdlbi1CWicsXG4gICAgMHgxMDA5OiAnZW4tQ0EnLFxuICAgIDB4MjQwOTogJ2VuLTAyOScsXG4gICAgMHg0MDA5OiAnZW4tSU4nLFxuICAgIDB4MTgwOTogJ2VuLUlFJyxcbiAgICAweDIwMDk6ICdlbi1KTScsXG4gICAgMHg0NDA5OiAnZW4tTVknLFxuICAgIDB4MTQwOTogJ2VuLU5aJyxcbiAgICAweDM0MDk6ICdlbi1QSCcsXG4gICAgMHg0ODA5OiAnZW4tU0cnLFxuICAgIDB4MUMwOTogJ2VuLVpBJyxcbiAgICAweDJDMDk6ICdlbi1UVCcsXG4gICAgMHgwODA5OiAnZW4tR0InLFxuICAgIDB4MDQwOTogJ2VuJyxcbiAgICAweDMwMDk6ICdlbi1aVycsXG4gICAgMHgwNDI1OiAnZXQnLFxuICAgIDB4MDQzODogJ2ZvJyxcbiAgICAweDA0NjQ6ICdmaWwnLFxuICAgIDB4MDQwQjogJ2ZpJyxcbiAgICAweDA4MEM6ICdmci1CRScsXG4gICAgMHgwQzBDOiAnZnItQ0EnLFxuICAgIDB4MDQwQzogJ2ZyJyxcbiAgICAweDE0MEM6ICdmci1MVScsXG4gICAgMHgxODBDOiAnZnItTUMnLFxuICAgIDB4MTAwQzogJ2ZyLUNIJyxcbiAgICAweDA0NjI6ICdmeScsXG4gICAgMHgwNDU2OiAnZ2wnLFxuICAgIDB4MDQzNzogJ2thJyxcbiAgICAweDBDMDc6ICdkZS1BVCcsXG4gICAgMHgwNDA3OiAnZGUnLFxuICAgIDB4MTQwNzogJ2RlLUxJJyxcbiAgICAweDEwMDc6ICdkZS1MVScsXG4gICAgMHgwODA3OiAnZGUtQ0gnLFxuICAgIDB4MDQwODogJ2VsJyxcbiAgICAweDA0NkY6ICdrbCcsXG4gICAgMHgwNDQ3OiAnZ3UnLFxuICAgIDB4MDQ2ODogJ2hhJyxcbiAgICAweDA0MEQ6ICdoZScsXG4gICAgMHgwNDM5OiAnaGknLFxuICAgIDB4MDQwRTogJ2h1JyxcbiAgICAweDA0MEY6ICdpcycsXG4gICAgMHgwNDcwOiAnaWcnLFxuICAgIDB4MDQyMTogJ2lkJyxcbiAgICAweDA0NUQ6ICdpdScsXG4gICAgMHgwODVEOiAnaXUtTGF0bicsXG4gICAgMHgwODNDOiAnZ2EnLFxuICAgIDB4MDQzNDogJ3hoJyxcbiAgICAweDA0MzU6ICd6dScsXG4gICAgMHgwNDEwOiAnaXQnLFxuICAgIDB4MDgxMDogJ2l0LUNIJyxcbiAgICAweDA0MTE6ICdqYScsXG4gICAgMHgwNDRCOiAna24nLFxuICAgIDB4MDQzRjogJ2trJyxcbiAgICAweDA0NTM6ICdrbScsXG4gICAgMHgwNDg2OiAncXVjJyxcbiAgICAweDA0ODc6ICdydycsXG4gICAgMHgwNDQxOiAnc3cnLFxuICAgIDB4MDQ1NzogJ2tvaycsXG4gICAgMHgwNDEyOiAna28nLFxuICAgIDB4MDQ0MDogJ2t5JyxcbiAgICAweDA0NTQ6ICdsbycsXG4gICAgMHgwNDI2OiAnbHYnLFxuICAgIDB4MDQyNzogJ2x0JyxcbiAgICAweDA4MkU6ICdkc2InLFxuICAgIDB4MDQ2RTogJ2xiJyxcbiAgICAweDA0MkY6ICdtaycsXG4gICAgMHgwODNFOiAnbXMtQk4nLFxuICAgIDB4MDQzRTogJ21zJyxcbiAgICAweDA0NEM6ICdtbCcsXG4gICAgMHgwNDNBOiAnbXQnLFxuICAgIDB4MDQ4MTogJ21pJyxcbiAgICAweDA0N0E6ICdhcm4nLFxuICAgIDB4MDQ0RTogJ21yJyxcbiAgICAweDA0N0M6ICdtb2gnLFxuICAgIDB4MDQ1MDogJ21uJyxcbiAgICAweDA4NTA6ICdtbi1DTicsXG4gICAgMHgwNDYxOiAnbmUnLFxuICAgIDB4MDQxNDogJ25iJyxcbiAgICAweDA4MTQ6ICdubicsXG4gICAgMHgwNDgyOiAnb2MnLFxuICAgIDB4MDQ0ODogJ29yJyxcbiAgICAweDA0NjM6ICdwcycsXG4gICAgMHgwNDE1OiAncGwnLFxuICAgIDB4MDQxNjogJ3B0JyxcbiAgICAweDA4MTY6ICdwdC1QVCcsXG4gICAgMHgwNDQ2OiAncGEnLFxuICAgIDB4MDQ2QjogJ3F1LUJPJyxcbiAgICAweDA4NkI6ICdxdS1FQycsXG4gICAgMHgwQzZCOiAncXUnLFxuICAgIDB4MDQxODogJ3JvJyxcbiAgICAweDA0MTc6ICdybScsXG4gICAgMHgwNDE5OiAncnUnLFxuICAgIDB4MjQzQjogJ3NtbicsXG4gICAgMHgxMDNCOiAnc21qLU5PJyxcbiAgICAweDE0M0I6ICdzbWonLFxuICAgIDB4MEMzQjogJ3NlLUZJJyxcbiAgICAweDA0M0I6ICdzZScsXG4gICAgMHgwODNCOiAnc2UtU0UnLFxuICAgIDB4MjAzQjogJ3NtcycsXG4gICAgMHgxODNCOiAnc21hLU5PJyxcbiAgICAweDFDM0I6ICdzbXMnLFxuICAgIDB4MDQ0RjogJ3NhJyxcbiAgICAweDFDMUE6ICdzci1DeXJsLUJBJyxcbiAgICAweDBDMUE6ICdzcicsXG4gICAgMHgxODFBOiAnc3ItTGF0bi1CQScsXG4gICAgMHgwODFBOiAnc3ItTGF0bicsXG4gICAgMHgwNDZDOiAnbnNvJyxcbiAgICAweDA0MzI6ICd0bicsXG4gICAgMHgwNDVCOiAnc2knLFxuICAgIDB4MDQxQjogJ3NrJyxcbiAgICAweDA0MjQ6ICdzbCcsXG4gICAgMHgyQzBBOiAnZXMtQVInLFxuICAgIDB4NDAwQTogJ2VzLUJPJyxcbiAgICAweDM0MEE6ICdlcy1DTCcsXG4gICAgMHgyNDBBOiAnZXMtQ08nLFxuICAgIDB4MTQwQTogJ2VzLUNSJyxcbiAgICAweDFDMEE6ICdlcy1ETycsXG4gICAgMHgzMDBBOiAnZXMtRUMnLFxuICAgIDB4NDQwQTogJ2VzLVNWJyxcbiAgICAweDEwMEE6ICdlcy1HVCcsXG4gICAgMHg0ODBBOiAnZXMtSE4nLFxuICAgIDB4MDgwQTogJ2VzLU1YJyxcbiAgICAweDRDMEE6ICdlcy1OSScsXG4gICAgMHgxODBBOiAnZXMtUEEnLFxuICAgIDB4M0MwQTogJ2VzLVBZJyxcbiAgICAweDI4MEE6ICdlcy1QRScsXG4gICAgMHg1MDBBOiAnZXMtUFInLFxuXG4gICAgLy8gTWljcm9zb2Z0IGhhcyBkZWZpbmVkIHR3byBkaWZmZXJlbnQgbGFuZ3VhZ2UgY29kZXMgZm9yXG4gICAgLy8g4oCcU3BhbmlzaCB3aXRoIG1vZGVybiBzb3J0aW5n4oCdIGFuZCDigJxTcGFuaXNoIHdpdGggdHJhZGl0aW9uYWxcbiAgICAvLyBzb3J0aW5n4oCdLiBUaGlzIG1ha2VzIHNlbnNlIGZvciBjb2xsYXRpb24gQVBJcywgYW5kIGl0IHdvdWxkIGJlXG4gICAgLy8gcG9zc2libGUgdG8gZXhwcmVzcyB0aGlzIGluIEJDUCA0NyBsYW5ndWFnZSB0YWdzIHZpYSBVbmljb2RlXG4gICAgLy8gZXh0ZW5zaW9ucyAoZWcuLCBlcy11LWNvLXRyYWQgaXMgU3BhbmlzaCB3aXRoIHRyYWRpdGlvbmFsXG4gICAgLy8gc29ydGluZykuIEhvd2V2ZXIsIGZvciBzdG9yaW5nIG5hbWVzIGluIGZvbnRzLCB0aGUgZGlzdGluY3Rpb25cbiAgICAvLyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBzbyB3ZSBnaXZlIOKAnGVz4oCdIGluIGJvdGggY2FzZXMuXG4gICAgMHgwQzBBOiAnZXMnLFxuICAgIDB4MDQwQTogJ2VzJyxcblxuICAgIDB4NTQwQTogJ2VzLVVTJyxcbiAgICAweDM4MEE6ICdlcy1VWScsXG4gICAgMHgyMDBBOiAnZXMtVkUnLFxuICAgIDB4MDgxRDogJ3N2LUZJJyxcbiAgICAweDA0MUQ6ICdzdicsXG4gICAgMHgwNDVBOiAnc3lyJyxcbiAgICAweDA0Mjg6ICd0ZycsXG4gICAgMHgwODVGOiAndHptJyxcbiAgICAweDA0NDk6ICd0YScsXG4gICAgMHgwNDQ0OiAndHQnLFxuICAgIDB4MDQ0QTogJ3RlJyxcbiAgICAweDA0MUU6ICd0aCcsXG4gICAgMHgwNDUxOiAnYm8nLFxuICAgIDB4MDQxRjogJ3RyJyxcbiAgICAweDA0NDI6ICd0aycsXG4gICAgMHgwNDgwOiAndWcnLFxuICAgIDB4MDQyMjogJ3VrJyxcbiAgICAweDA0MkU6ICdoc2InLFxuICAgIDB4MDQyMDogJ3VyJyxcbiAgICAweDA4NDM6ICd1ei1DeXJsJyxcbiAgICAweDA0NDM6ICd1eicsXG4gICAgMHgwNDJBOiAndmknLFxuICAgIDB4MDQ1MjogJ2N5JyxcbiAgICAweDA0ODg6ICd3bycsXG4gICAgMHgwNDg1OiAnc2FoJyxcbiAgICAweDA0Nzg6ICdpaScsXG4gICAgMHgwNDZBOiAneW8nXG59O1xuXG4vLyBSZXR1cm5zIGEgSUVURiBCQ1AgNDcgbGFuZ3VhZ2UgY29kZSwgZm9yIGV4YW1wbGUgJ3poLUhhbnQnXG4vLyBmb3IgJ0NoaW5lc2UgaW4gdGhlIHRyYWRpdGlvbmFsIHNjcmlwdCcuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUNvZGUocGxhdGZvcm1JRCwgbGFuZ3VhZ2VJRCwgbHRhZykge1xuICAgIHN3aXRjaCAocGxhdGZvcm1JRCkge1xuICAgICAgICBjYXNlIDA6ICAvLyBVbmljb2RlXG4gICAgICAgICAgICBpZiAobGFuZ3VhZ2VJRCA9PT0gMHhGRkZGKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd1bmQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsdGFnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGx0YWdbbGFuZ3VhZ2VJRF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTogIC8vIE1hY2ludG9zaFxuICAgICAgICAgICAgcmV0dXJuIG1hY0xhbmd1YWdlc1tsYW5ndWFnZUlEXTtcblxuICAgICAgICBjYXNlIDM6ICAvLyBXaW5kb3dzXG4gICAgICAgICAgICByZXR1cm4gd2luZG93c0xhbmd1YWdlc1tsYW5ndWFnZUlEXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG52YXIgdXRmMTYgPSAndXRmLTE2JztcblxuLy8gTWFjT1Mgc2NyaXB0IElEIOKGkiBlbmNvZGluZy4gVGhpcyB0YWJsZSBzdG9yZXMgdGhlIGRlZmF1bHQgY2FzZSxcbi8vIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGJ5IG1hY0xhbmd1YWdlRW5jb2RpbmdzLlxudmFyIG1hY1NjcmlwdEVuY29kaW5ncyA9IHtcbiAgICAwOiAnbWFjaW50b3NoJywgICAgICAgICAgIC8vIHNtUm9tYW5cbiAgICAxOiAneC1tYWMtamFwYW5lc2UnLCAgICAgIC8vIHNtSmFwYW5lc2VcbiAgICAyOiAneC1tYWMtY2hpbmVzZXRyYWQnLCAgIC8vIHNtVHJhZENoaW5lc2VcbiAgICAzOiAneC1tYWMta29yZWFuJywgICAgICAgIC8vIHNtS29yZWFuXG4gICAgNjogJ3gtbWFjLWdyZWVrJywgICAgICAgICAvLyBzbUdyZWVrXG4gICAgNzogJ3gtbWFjLWN5cmlsbGljJywgICAgICAvLyBzbUN5cmlsbGljXG4gICAgOTogJ3gtbWFjLWRldmFuYWdhaScsICAgICAvLyBzbURldmFuYWdhcmlcbiAgICAxMDogJ3gtbWFjLWd1cm11a2hpJywgICAgIC8vIHNtR3VybXVraGlcbiAgICAxMTogJ3gtbWFjLWd1amFyYXRpJywgICAgIC8vIHNtR3VqYXJhdGlcbiAgICAxMjogJ3gtbWFjLW9yaXlhJywgICAgICAgIC8vIHNtT3JpeWFcbiAgICAxMzogJ3gtbWFjLWJlbmdhbGknLCAgICAgIC8vIHNtQmVuZ2FsaVxuICAgIDE0OiAneC1tYWMtdGFtaWwnLCAgICAgICAgLy8gc21UYW1pbFxuICAgIDE1OiAneC1tYWMtdGVsdWd1JywgICAgICAgLy8gc21UZWx1Z3VcbiAgICAxNjogJ3gtbWFjLWthbm5hZGEnLCAgICAgIC8vIHNtS2FubmFkYVxuICAgIDE3OiAneC1tYWMtbWFsYXlhbGFtJywgICAgLy8gc21NYWxheWFsYW1cbiAgICAxODogJ3gtbWFjLXNpbmhhbGVzZScsICAgIC8vIHNtU2luaGFsZXNlXG4gICAgMTk6ICd4LW1hYy1idXJtZXNlJywgICAgICAvLyBzbUJ1cm1lc2VcbiAgICAyMDogJ3gtbWFjLWtobWVyJywgICAgICAgIC8vIHNtS2htZXJcbiAgICAyMTogJ3gtbWFjLXRoYWknLCAgICAgICAgIC8vIHNtVGhhaVxuICAgIDIyOiAneC1tYWMtbGFvJywgICAgICAgICAgLy8gc21MYW9cbiAgICAyMzogJ3gtbWFjLWdlb3JnaWFuJywgICAgIC8vIHNtR2VvcmdpYW5cbiAgICAyNDogJ3gtbWFjLWFybWVuaWFuJywgICAgIC8vIHNtQXJtZW5pYW5cbiAgICAyNTogJ3gtbWFjLWNoaW5lc2VzaW1wJywgIC8vIHNtU2ltcENoaW5lc2VcbiAgICAyNjogJ3gtbWFjLXRpYmV0YW4nLCAgICAgIC8vIHNtVGliZXRhblxuICAgIDI3OiAneC1tYWMtbW9uZ29saWFuJywgICAgLy8gc21Nb25nb2xpYW5cbiAgICAyODogJ3gtbWFjLWV0aGlvcGljJywgICAgIC8vIHNtRXRoaW9waWNcbiAgICAyOTogJ3gtbWFjLWNlJywgICAgICAgICAgIC8vIHNtQ2VudHJhbEV1cm9Sb21hblxuICAgIDMwOiAneC1tYWMtdmlldG5hbWVzZScsICAgLy8gc21WaWV0bmFtZXNlXG4gICAgMzE6ICd4LW1hYy1leHRhcmFiaWMnICAgICAvLyBzbUV4dEFyYWJpY1xufTtcblxuLy8gTWFjT1MgbGFuZ3VhZ2UgSUQg4oaSIGVuY29kaW5nLiBUaGlzIHRhYmxlIHN0b3JlcyB0aGUgZXhjZXB0aW9uYWxcbi8vIGNhc2VzLCB3aGljaCBvdmVycmlkZSBtYWNTY3JpcHRFbmNvZGluZ3MuIEZvciB3cml0aW5nIE1hY09TIG5hbWluZ1xuLy8gdGFibGVzLCB3ZSBuZWVkIHRvIGVtaXQgYSBNYWNPUyBzY3JpcHQgSUQuIFRoZXJlZm9yZSwgd2UgY2Fubm90XG4vLyBtZXJnZSBtYWNTY3JpcHRFbmNvZGluZ3MgaW50byBtYWNMYW5ndWFnZUVuY29kaW5ncy5cbi8vXG4vLyBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvUmVhZG1lLnR4dFxudmFyIG1hY0xhbmd1YWdlRW5jb2RpbmdzID0ge1xuICAgIDE1OiAneC1tYWMtaWNlbGFuZGljJywgICAgLy8gbGFuZ0ljZWxhbmRpY1xuICAgIDE3OiAneC1tYWMtdHVya2lzaCcsICAgICAgLy8gbGFuZ1R1cmtpc2hcbiAgICAxODogJ3gtbWFjLWNyb2F0aWFuJywgICAgIC8vIGxhbmdDcm9hdGlhblxuICAgIDI0OiAneC1tYWMtY2UnLCAgICAgICAgICAgLy8gbGFuZ0xpdGh1YW5pYW5cbiAgICAyNTogJ3gtbWFjLWNlJywgICAgICAgICAgIC8vIGxhbmdQb2xpc2hcbiAgICAyNjogJ3gtbWFjLWNlJywgICAgICAgICAgIC8vIGxhbmdIdW5nYXJpYW5cbiAgICAyNzogJ3gtbWFjLWNlJywgICAgICAgICAgIC8vIGxhbmdFc3RvbmlhblxuICAgIDI4OiAneC1tYWMtY2UnLCAgICAgICAgICAgLy8gbGFuZ0xhdHZpYW5cbiAgICAzMDogJ3gtbWFjLWljZWxhbmRpYycsICAgIC8vIGxhbmdGYXJvZXNlXG4gICAgMzc6ICd4LW1hYy1yb21hbmlhbicsICAgICAvLyBsYW5nUm9tYW5pYW5cbiAgICAzODogJ3gtbWFjLWNlJywgICAgICAgICAgIC8vIGxhbmdDemVjaFxuICAgIDM5OiAneC1tYWMtY2UnLCAgICAgICAgICAgLy8gbGFuZ1Nsb3Zha1xuICAgIDQwOiAneC1tYWMtY2UnLCAgICAgICAgICAgLy8gbGFuZ1Nsb3ZlbmlhblxuICAgIDE0MzogJ3gtbWFjLWludWl0JywgICAgICAgLy8gbGFuZ0ludWt0aXR1dFxuICAgIDE0NjogJ3gtbWFjLWdhZWxpYycgICAgICAgLy8gbGFuZ0lyaXNoR2FlbGljU2NyaXB0XG59O1xuXG5mdW5jdGlvbiBnZXRFbmNvZGluZyhwbGF0Zm9ybUlELCBlbmNvZGluZ0lELCBsYW5ndWFnZUlEKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybUlEKSB7XG4gICAgICAgIGNhc2UgMDogIC8vIFVuaWNvZGVcbiAgICAgICAgICAgIHJldHVybiB1dGYxNjtcblxuICAgICAgICBjYXNlIDE6ICAvLyBBcHBsZSBNYWNpbnRvc2hcbiAgICAgICAgICAgIHJldHVybiBtYWNMYW5ndWFnZUVuY29kaW5nc1tsYW5ndWFnZUlEXSB8fCBtYWNTY3JpcHRFbmNvZGluZ3NbZW5jb2RpbmdJRF07XG5cbiAgICAgICAgY2FzZSAzOiAgLy8gTWljcm9zb2Z0IFdpbmRvd3NcbiAgICAgICAgICAgIGlmIChlbmNvZGluZ0lEID09PSAxIHx8IGVuY29kaW5nSUQgPT09IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0ZjE2O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vLyBQYXJzZSB0aGUgbmFtaW5nIGBuYW1lYCB0YWJsZS5cbi8vIEZJWE1FOiBGb3JtYXQgMSBhZGRpdGlvbmFsIGZpZWxkcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuXG4vLyBsdGFnIGlzIHRoZSBjb250ZW50IG9mIHRoZSBgbHRhZycgdGFibGUsIHN1Y2ggYXMgWydlbicsICd6aC1IYW5zJywgJ2RlLUNILTE5MDQnXS5cbmZ1bmN0aW9uIHBhcnNlTmFtZVRhYmxlKGRhdGEsIHN0YXJ0LCBsdGFnKSB7XG4gICAgdmFyIG5hbWUgPSB7fTtcbiAgICB2YXIgcCA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIHZhciBmb3JtYXQgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgdmFyIGNvdW50ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIHZhciBzdHJpbmdPZmZzZXQgPSBwLm9mZnNldCArIHAucGFyc2VVU2hvcnQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgdmFyIHBsYXRmb3JtSUQgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIHZhciBlbmNvZGluZ0lEID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICB2YXIgbGFuZ3VhZ2VJRCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgdmFyIG5hbWVJRCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgdmFyIHByb3BlcnR5ID0gbmFtZVRhYmxlTmFtZXNbbmFtZUlEXSB8fCBuYW1lSUQ7XG4gICAgICAgIHZhciBieXRlTGVuZ3RoID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICB2YXIgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZUNvZGUocGxhdGZvcm1JRCwgbGFuZ3VhZ2VJRCwgbHRhZyk7XG4gICAgICAgIHZhciBlbmNvZGluZyA9IGdldEVuY29kaW5nKHBsYXRmb3JtSUQsIGVuY29kaW5nSUQsIGxhbmd1YWdlSUQpO1xuICAgICAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiBsYW5ndWFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgdGV4dCA9ICh2b2lkIDApO1xuICAgICAgICAgICAgaWYgKGVuY29kaW5nID09PSB1dGYxNikge1xuICAgICAgICAgICAgICAgIHRleHQgPSBkZWNvZGUuVVRGMTYoZGF0YSwgc3RyaW5nT2Zmc2V0ICsgb2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IGRlY29kZS5NQUNTVFJJTkcoZGF0YSwgc3RyaW5nT2Zmc2V0ICsgb2Zmc2V0LCBieXRlTGVuZ3RoLCBlbmNvZGluZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHRyYW5zbGF0aW9ucyA9IG5hbWVbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnMgPSBuYW1lW3Byb3BlcnR5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uc1tsYW5ndWFnZV0gPSB0ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhbmdUYWdDb3VudCA9IDA7XG4gICAgaWYgKGZvcm1hdCA9PT0gMSkge1xuICAgICAgICAvLyBGSVhNRTogQWxzbyBoYW5kbGUgTWljcm9zb2Z0J3MgJ25hbWUnIHRhYmxlIDEuXG4gICAgICAgIGxhbmdUYWdDb3VudCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZTtcbn1cblxuLy8gezIzOiAnZm9vJ30g4oaSIHsnZm9vJzogMjN9XG4vLyBbJ2JhcicsICdiYXonXSDihpIgeydiYXInOiAwLCAnYmF6JzogMX1cbmZ1bmN0aW9uIHJldmVyc2VEaWN0KGRpY3QpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIGRpY3QpIHtcbiAgICAgICAgcmVzdWx0W2RpY3Rba2V5XV0gPSBwYXJzZUludChrZXkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VOYW1lUmVjb3JkKHBsYXRmb3JtSUQsIGVuY29kaW5nSUQsIGxhbmd1YWdlSUQsIG5hbWVJRCwgbGVuZ3RoLCBvZmZzZXQpIHtcbiAgICByZXR1cm4gbmV3IHRhYmxlLlJlY29yZCgnTmFtZVJlY29yZCcsIFtcbiAgICAgICAge25hbWU6ICdwbGF0Zm9ybUlEJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiBwbGF0Zm9ybUlEfSxcbiAgICAgICAge25hbWU6ICdlbmNvZGluZ0lEJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiBlbmNvZGluZ0lEfSxcbiAgICAgICAge25hbWU6ICdsYW5ndWFnZUlEJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiBsYW5ndWFnZUlEfSxcbiAgICAgICAge25hbWU6ICduYW1lSUQnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IG5hbWVJRH0sXG4gICAgICAgIHtuYW1lOiAnbGVuZ3RoJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiBsZW5ndGh9LFxuICAgICAgICB7bmFtZTogJ29mZnNldCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogb2Zmc2V0fVxuICAgIF0pO1xufVxuXG4vLyBGaW5kcyB0aGUgcG9zaXRpb24gb2YgbmVlZGxlIGluIGhheXN0YWNrLCBvciAtMSBpZiBub3QgdGhlcmUuXG4vLyBMaWtlIFN0cmluZy5pbmRleE9mKCksIGJ1dCBmb3IgYXJyYXlzLlxuZnVuY3Rpb24gZmluZFN1YkFycmF5KG5lZWRsZSwgaGF5c3RhY2spIHtcbiAgICB2YXIgbmVlZGxlTGVuZ3RoID0gbmVlZGxlLmxlbmd0aDtcbiAgICB2YXIgbGltaXQgPSBoYXlzdGFjay5sZW5ndGggLSBuZWVkbGVMZW5ndGggKyAxO1xuXG4gICAgbG9vcDpcbiAgICBmb3IgKHZhciBwb3MgPSAwOyBwb3MgPCBsaW1pdDsgcG9zKyspIHtcbiAgICAgICAgZm9yICg7IHBvcyA8IGxpbWl0OyBwb3MrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBuZWVkbGVMZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGlmIChoYXlzdGFja1twb3MgKyBrXSAhPT0gbmVlZGxlW2tdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGxvb3A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBhZGRTdHJpbmdUb1Bvb2wocywgcG9vbCkge1xuICAgIHZhciBvZmZzZXQgPSBmaW5kU3ViQXJyYXkocywgcG9vbCk7XG4gICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgb2Zmc2V0ID0gcG9vbC5sZW5ndGg7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgdmFyIGxlbiA9IHMubGVuZ3RoO1xuICAgICAgICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBwb29sLnB1c2goc1tpXSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VOYW1lVGFibGUobmFtZXMsIGx0YWcpIHtcbiAgICB2YXIgbmFtZUlEO1xuICAgIHZhciBuYW1lSURzID0gW107XG5cbiAgICB2YXIgbmFtZXNXaXRoTnVtZXJpY0tleXMgPSB7fTtcbiAgICB2YXIgbmFtZVRhYmxlSWRzID0gcmV2ZXJzZURpY3QobmFtZVRhYmxlTmFtZXMpO1xuICAgIGZvciAodmFyIGtleSBpbiBuYW1lcykge1xuICAgICAgICB2YXIgaWQgPSBuYW1lVGFibGVJZHNba2V5XTtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlkID0ga2V5O1xuICAgICAgICB9XG5cbiAgICAgICAgbmFtZUlEID0gcGFyc2VJbnQoaWQpO1xuXG4gICAgICAgIGlmIChpc05hTihuYW1lSUQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hbWUgdGFibGUgZW50cnkgXCInICsga2V5ICsgJ1wiIGRvZXMgbm90IGV4aXN0LCBzZWUgbmFtZVRhYmxlTmFtZXMgZm9yIGNvbXBsZXRlIGxpc3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBuYW1lc1dpdGhOdW1lcmljS2V5c1tuYW1lSURdID0gbmFtZXNba2V5XTtcbiAgICAgICAgbmFtZUlEcy5wdXNoKG5hbWVJRCk7XG4gICAgfVxuXG4gICAgdmFyIG1hY0xhbmd1YWdlSWRzID0gcmV2ZXJzZURpY3QobWFjTGFuZ3VhZ2VzKTtcbiAgICB2YXIgd2luZG93c0xhbmd1YWdlSWRzID0gcmV2ZXJzZURpY3Qod2luZG93c0xhbmd1YWdlcyk7XG5cbiAgICB2YXIgbmFtZVJlY29yZHMgPSBbXTtcbiAgICB2YXIgc3RyaW5nUG9vbCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lSURzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5hbWVJRCA9IG5hbWVJRHNbaV07XG4gICAgICAgIHZhciB0cmFuc2xhdGlvbnMgPSBuYW1lc1dpdGhOdW1lcmljS2V5c1tuYW1lSURdO1xuICAgICAgICBmb3IgKHZhciBsYW5nIGluIHRyYW5zbGF0aW9ucykge1xuICAgICAgICAgICAgdmFyIHRleHQgPSB0cmFuc2xhdGlvbnNbbGFuZ107XG5cbiAgICAgICAgICAgIC8vIEZvciBNYWNPUywgd2UgdHJ5IHRvIGVtaXQgdGhlIG5hbWUgaW4gdGhlIGZvcm0gdGhhdCB3YXMgaW50cm9kdWNlZFxuICAgICAgICAgICAgLy8gaW4gdGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGUgVHJ1ZVR5cGUgc3BlYyAoaW4gdGhlIGxhdGUgMTk4MHMpLlxuICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhpcyBjYW4gZmFpbCBmb3IgdmFyaW91cyByZWFzb25zOiB0aGUgcmVxdWVzdGVkIEJDUCA0N1xuICAgICAgICAgICAgLy8gbGFuZ3VhZ2UgY29kZSBtaWdodCBub3QgaGF2ZSBhbiBvbGQtc3R5bGUgTWFjIGVxdWl2YWxlbnQ7XG4gICAgICAgICAgICAvLyB3ZSBtaWdodCBub3QgaGF2ZSBhIGNvZGVjIGZvciB0aGUgbmVlZGVkIGNoYXJhY3RlciBlbmNvZGluZztcbiAgICAgICAgICAgIC8vIG9yIHRoZSBuYW1lIG1pZ2h0IGNvbnRhaW4gY2hhcmFjdGVycyB0aGF0IGNhbm5vdCBiZSBleHByZXNzZWRcbiAgICAgICAgICAgIC8vIGluIHRoZSBvbGQtc3R5bGUgTWFjaW50b3NoIGVuY29kaW5nLiBJbiBjYXNlIG9mIGZhaWx1cmUsIHdlIGVtaXRcbiAgICAgICAgICAgIC8vIHRoZSBuYW1lIGluIGEgbW9yZSBtb2Rlcm4gZmFzaGlvbiAoVW5pY29kZSBlbmNvZGluZyB3aXRoIEJDUCA0N1xuICAgICAgICAgICAgLy8gbGFuZ3VhZ2UgdGFncykgdGhhdCBpcyByZWNvZ25pemVkIGJ5IE1hY09TIDEwLjUsIHJlbGVhc2VkIGluIDIwMDkuXG4gICAgICAgICAgICAvLyBJZiBmb250cyB3ZXJlIG9ubHkgcmVhZCBieSBvcGVyYXRpbmcgc3lzdGVtcywgd2UgY291bGQgc2ltcGx5XG4gICAgICAgICAgICAvLyBlbWl0IGFsbCBuYW1lcyBpbiB0aGUgbW9kZXJuIGZvcm07IHRoaXMgd291bGQgYmUgbXVjaCBlYXNpZXIuXG4gICAgICAgICAgICAvLyBIb3dldmVyLCB0aGVyZSBhcmUgbWFueSBhcHBsaWNhdGlvbnMgYW5kIGxpYnJhcmllcyB0aGF0IHJlYWRcbiAgICAgICAgICAgIC8vICduYW1lJyB0YWJsZXMgZGlyZWN0bHksIGFuZCB0aGVzZSB3aWxsIHVzdWFsbHkgb25seSByZWNvZ25pemVcbiAgICAgICAgICAgIC8vIHRoZSBhbmNpZW50IGZvcm0gKHNpbGVudGx5IHNraXBwaW5nIHRoZSB1bnJlY29nbml6ZWQgbmFtZXMpLlxuICAgICAgICAgICAgdmFyIG1hY1BsYXRmb3JtID0gMTsgIC8vIE1hY2ludG9zaFxuICAgICAgICAgICAgdmFyIG1hY0xhbmd1YWdlID0gbWFjTGFuZ3VhZ2VJZHNbbGFuZ107XG4gICAgICAgICAgICB2YXIgbWFjU2NyaXB0ID0gbWFjTGFuZ3VhZ2VUb1NjcmlwdFttYWNMYW5ndWFnZV07XG4gICAgICAgICAgICB2YXIgbWFjRW5jb2RpbmcgPSBnZXRFbmNvZGluZyhtYWNQbGF0Zm9ybSwgbWFjU2NyaXB0LCBtYWNMYW5ndWFnZSk7XG4gICAgICAgICAgICB2YXIgbWFjTmFtZSA9IGVuY29kZS5NQUNTVFJJTkcodGV4dCwgbWFjRW5jb2RpbmcpO1xuICAgICAgICAgICAgaWYgKG1hY05hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1hY1BsYXRmb3JtID0gMDsgIC8vIFVuaWNvZGVcbiAgICAgICAgICAgICAgICBtYWNMYW5ndWFnZSA9IGx0YWcuaW5kZXhPZihsYW5nKTtcbiAgICAgICAgICAgICAgICBpZiAobWFjTGFuZ3VhZ2UgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hY0xhbmd1YWdlID0gbHRhZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGx0YWcucHVzaChsYW5nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtYWNTY3JpcHQgPSA0OyAgLy8gVW5pY29kZSAyLjAgYW5kIGxhdGVyXG4gICAgICAgICAgICAgICAgbWFjTmFtZSA9IGVuY29kZS5VVEYxNih0ZXh0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG1hY05hbWVPZmZzZXQgPSBhZGRTdHJpbmdUb1Bvb2wobWFjTmFtZSwgc3RyaW5nUG9vbCk7XG4gICAgICAgICAgICBuYW1lUmVjb3Jkcy5wdXNoKG1ha2VOYW1lUmVjb3JkKG1hY1BsYXRmb3JtLCBtYWNTY3JpcHQsIG1hY0xhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lSUQsIG1hY05hbWUubGVuZ3RoLCBtYWNOYW1lT2Zmc2V0KSk7XG5cbiAgICAgICAgICAgIHZhciB3aW5MYW5ndWFnZSA9IHdpbmRvd3NMYW5ndWFnZUlkc1tsYW5nXTtcbiAgICAgICAgICAgIGlmICh3aW5MYW5ndWFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHdpbk5hbWUgPSBlbmNvZGUuVVRGMTYodGV4dCk7XG4gICAgICAgICAgICAgICAgdmFyIHdpbk5hbWVPZmZzZXQgPSBhZGRTdHJpbmdUb1Bvb2wod2luTmFtZSwgc3RyaW5nUG9vbCk7XG4gICAgICAgICAgICAgICAgbmFtZVJlY29yZHMucHVzaChtYWtlTmFtZVJlY29yZCgzLCAxLCB3aW5MYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJRCwgd2luTmFtZS5sZW5ndGgsIHdpbk5hbWVPZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5hbWVSZWNvcmRzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICByZXR1cm4gKChhLnBsYXRmb3JtSUQgLSBiLnBsYXRmb3JtSUQpIHx8XG4gICAgICAgICAgICAgICAgKGEuZW5jb2RpbmdJRCAtIGIuZW5jb2RpbmdJRCkgfHxcbiAgICAgICAgICAgICAgICAoYS5sYW5ndWFnZUlEIC0gYi5sYW5ndWFnZUlEKSB8fFxuICAgICAgICAgICAgICAgIChhLm5hbWVJRCAtIGIubmFtZUlEKSk7XG4gICAgfSk7XG5cbiAgICB2YXIgdCA9IG5ldyB0YWJsZS5UYWJsZSgnbmFtZScsIFtcbiAgICAgICAge25hbWU6ICdmb3JtYXQnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ2NvdW50JywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiBuYW1lUmVjb3Jkcy5sZW5ndGh9LFxuICAgICAgICB7bmFtZTogJ3N0cmluZ09mZnNldCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogNiArIG5hbWVSZWNvcmRzLmxlbmd0aCAqIDEyfVxuICAgIF0pO1xuXG4gICAgZm9yICh2YXIgciA9IDA7IHIgPCBuYW1lUmVjb3Jkcy5sZW5ndGg7IHIrKykge1xuICAgICAgICB0LmZpZWxkcy5wdXNoKHtuYW1lOiAncmVjb3JkXycgKyByLCB0eXBlOiAnUkVDT1JEJywgdmFsdWU6IG5hbWVSZWNvcmRzW3JdfSk7XG4gICAgfVxuXG4gICAgdC5maWVsZHMucHVzaCh7bmFtZTogJ3N0cmluZ3MnLCB0eXBlOiAnTElURVJBTCcsIHZhbHVlOiBzdHJpbmdQb29sfSk7XG4gICAgcmV0dXJuIHQ7XG59XG5cbnZhciBfbmFtZSA9IHsgcGFyc2U6IHBhcnNlTmFtZVRhYmxlLCBtYWtlOiBtYWtlTmFtZVRhYmxlIH07XG5cbi8vIFRoZSBgT1MvMmAgdGFibGUgY29udGFpbnMgbWV0cmljcyByZXF1aXJlZCBpbiBPcGVuVHlwZSBmb250cy5cbi8vIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PVFNQRUMvb3MyLmh0bVxuXG52YXIgdW5pY29kZVJhbmdlcyA9IFtcbiAgICB7YmVnaW46IDB4MDAwMCwgZW5kOiAweDAwN0Z9LCAvLyBCYXNpYyBMYXRpblxuICAgIHtiZWdpbjogMHgwMDgwLCBlbmQ6IDB4MDBGRn0sIC8vIExhdGluLTEgU3VwcGxlbWVudFxuICAgIHtiZWdpbjogMHgwMTAwLCBlbmQ6IDB4MDE3Rn0sIC8vIExhdGluIEV4dGVuZGVkLUFcbiAgICB7YmVnaW46IDB4MDE4MCwgZW5kOiAweDAyNEZ9LCAvLyBMYXRpbiBFeHRlbmRlZC1CXG4gICAge2JlZ2luOiAweDAyNTAsIGVuZDogMHgwMkFGfSwgLy8gSVBBIEV4dGVuc2lvbnNcbiAgICB7YmVnaW46IDB4MDJCMCwgZW5kOiAweDAyRkZ9LCAvLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnNcbiAgICB7YmVnaW46IDB4MDMwMCwgZW5kOiAweDAzNkZ9LCAvLyBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3NcbiAgICB7YmVnaW46IDB4MDM3MCwgZW5kOiAweDAzRkZ9LCAvLyBHcmVlayBhbmQgQ29wdGljXG4gICAge2JlZ2luOiAweDJDODAsIGVuZDogMHgyQ0ZGfSwgLy8gQ29wdGljXG4gICAge2JlZ2luOiAweDA0MDAsIGVuZDogMHgwNEZGfSwgLy8gQ3lyaWxsaWNcbiAgICB7YmVnaW46IDB4MDUzMCwgZW5kOiAweDA1OEZ9LCAvLyBBcm1lbmlhblxuICAgIHtiZWdpbjogMHgwNTkwLCBlbmQ6IDB4MDVGRn0sIC8vIEhlYnJld1xuICAgIHtiZWdpbjogMHhBNTAwLCBlbmQ6IDB4QTYzRn0sIC8vIFZhaVxuICAgIHtiZWdpbjogMHgwNjAwLCBlbmQ6IDB4MDZGRn0sIC8vIEFyYWJpY1xuICAgIHtiZWdpbjogMHgwN0MwLCBlbmQ6IDB4MDdGRn0sIC8vIE5Lb1xuICAgIHtiZWdpbjogMHgwOTAwLCBlbmQ6IDB4MDk3Rn0sIC8vIERldmFuYWdhcmlcbiAgICB7YmVnaW46IDB4MDk4MCwgZW5kOiAweDA5RkZ9LCAvLyBCZW5nYWxpXG4gICAge2JlZ2luOiAweDBBMDAsIGVuZDogMHgwQTdGfSwgLy8gR3VybXVraGlcbiAgICB7YmVnaW46IDB4MEE4MCwgZW5kOiAweDBBRkZ9LCAvLyBHdWphcmF0aVxuICAgIHtiZWdpbjogMHgwQjAwLCBlbmQ6IDB4MEI3Rn0sIC8vIE9yaXlhXG4gICAge2JlZ2luOiAweDBCODAsIGVuZDogMHgwQkZGfSwgLy8gVGFtaWxcbiAgICB7YmVnaW46IDB4MEMwMCwgZW5kOiAweDBDN0Z9LCAvLyBUZWx1Z3VcbiAgICB7YmVnaW46IDB4MEM4MCwgZW5kOiAweDBDRkZ9LCAvLyBLYW5uYWRhXG4gICAge2JlZ2luOiAweDBEMDAsIGVuZDogMHgwRDdGfSwgLy8gTWFsYXlhbGFtXG4gICAge2JlZ2luOiAweDBFMDAsIGVuZDogMHgwRTdGfSwgLy8gVGhhaVxuICAgIHtiZWdpbjogMHgwRTgwLCBlbmQ6IDB4MEVGRn0sIC8vIExhb1xuICAgIHtiZWdpbjogMHgxMEEwLCBlbmQ6IDB4MTBGRn0sIC8vIEdlb3JnaWFuXG4gICAge2JlZ2luOiAweDFCMDAsIGVuZDogMHgxQjdGfSwgLy8gQmFsaW5lc2VcbiAgICB7YmVnaW46IDB4MTEwMCwgZW5kOiAweDExRkZ9LCAvLyBIYW5ndWwgSmFtb1xuICAgIHtiZWdpbjogMHgxRTAwLCBlbmQ6IDB4MUVGRn0sIC8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWxcbiAgICB7YmVnaW46IDB4MUYwMCwgZW5kOiAweDFGRkZ9LCAvLyBHcmVlayBFeHRlbmRlZFxuICAgIHtiZWdpbjogMHgyMDAwLCBlbmQ6IDB4MjA2Rn0sIC8vIEdlbmVyYWwgUHVuY3R1YXRpb25cbiAgICB7YmVnaW46IDB4MjA3MCwgZW5kOiAweDIwOUZ9LCAvLyBTdXBlcnNjcmlwdHMgQW5kIFN1YnNjcmlwdHNcbiAgICB7YmVnaW46IDB4MjBBMCwgZW5kOiAweDIwQ0Z9LCAvLyBDdXJyZW5jeSBTeW1ib2xcbiAgICB7YmVnaW46IDB4MjBEMCwgZW5kOiAweDIwRkZ9LCAvLyBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgRm9yIFN5bWJvbHNcbiAgICB7YmVnaW46IDB4MjEwMCwgZW5kOiAweDIxNEZ9LCAvLyBMZXR0ZXJsaWtlIFN5bWJvbHNcbiAgICB7YmVnaW46IDB4MjE1MCwgZW5kOiAweDIxOEZ9LCAvLyBOdW1iZXIgRm9ybXNcbiAgICB7YmVnaW46IDB4MjE5MCwgZW5kOiAweDIxRkZ9LCAvLyBBcnJvd3NcbiAgICB7YmVnaW46IDB4MjIwMCwgZW5kOiAweDIyRkZ9LCAvLyBNYXRoZW1hdGljYWwgT3BlcmF0b3JzXG4gICAge2JlZ2luOiAweDIzMDAsIGVuZDogMHgyM0ZGfSwgLy8gTWlzY2VsbGFuZW91cyBUZWNobmljYWxcbiAgICB7YmVnaW46IDB4MjQwMCwgZW5kOiAweDI0M0Z9LCAvLyBDb250cm9sIFBpY3R1cmVzXG4gICAge2JlZ2luOiAweDI0NDAsIGVuZDogMHgyNDVGfSwgLy8gT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb25cbiAgICB7YmVnaW46IDB4MjQ2MCwgZW5kOiAweDI0RkZ9LCAvLyBFbmNsb3NlZCBBbHBoYW51bWVyaWNzXG4gICAge2JlZ2luOiAweDI1MDAsIGVuZDogMHgyNTdGfSwgLy8gQm94IERyYXdpbmdcbiAgICB7YmVnaW46IDB4MjU4MCwgZW5kOiAweDI1OUZ9LCAvLyBCbG9jayBFbGVtZW50c1xuICAgIHtiZWdpbjogMHgyNUEwLCBlbmQ6IDB4MjVGRn0sIC8vIEdlb21ldHJpYyBTaGFwZXNcbiAgICB7YmVnaW46IDB4MjYwMCwgZW5kOiAweDI2RkZ9LCAvLyBNaXNjZWxsYW5lb3VzIFN5bWJvbHNcbiAgICB7YmVnaW46IDB4MjcwMCwgZW5kOiAweDI3QkZ9LCAvLyBEaW5nYmF0c1xuICAgIHtiZWdpbjogMHgzMDAwLCBlbmQ6IDB4MzAzRn0sIC8vIENKSyBTeW1ib2xzIEFuZCBQdW5jdHVhdGlvblxuICAgIHtiZWdpbjogMHgzMDQwLCBlbmQ6IDB4MzA5Rn0sIC8vIEhpcmFnYW5hXG4gICAge2JlZ2luOiAweDMwQTAsIGVuZDogMHgzMEZGfSwgLy8gS2F0YWthbmFcbiAgICB7YmVnaW46IDB4MzEwMCwgZW5kOiAweDMxMkZ9LCAvLyBCb3BvbW9mb1xuICAgIHtiZWdpbjogMHgzMTMwLCBlbmQ6IDB4MzE4Rn0sIC8vIEhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW9cbiAgICB7YmVnaW46IDB4QTg0MCwgZW5kOiAweEE4N0Z9LCAvLyBQaGFncy1wYVxuICAgIHtiZWdpbjogMHgzMjAwLCBlbmQ6IDB4MzJGRn0sIC8vIEVuY2xvc2VkIENKSyBMZXR0ZXJzIEFuZCBNb250aHNcbiAgICB7YmVnaW46IDB4MzMwMCwgZW5kOiAweDMzRkZ9LCAvLyBDSksgQ29tcGF0aWJpbGl0eVxuICAgIHtiZWdpbjogMHhBQzAwLCBlbmQ6IDB4RDdBRn0sIC8vIEhhbmd1bCBTeWxsYWJsZXNcbiAgICB7YmVnaW46IDB4RDgwMCwgZW5kOiAweERGRkZ9LCAvLyBOb24tUGxhbmUgMCAqXG4gICAge2JlZ2luOiAweDEwOTAwLCBlbmQ6IDB4MTA5MUZ9LCAvLyBQaG9lbmljaWFcbiAgICB7YmVnaW46IDB4NEUwMCwgZW5kOiAweDlGRkZ9LCAvLyBDSksgVW5pZmllZCBJZGVvZ3JhcGhzXG4gICAge2JlZ2luOiAweEUwMDAsIGVuZDogMHhGOEZGfSwgLy8gUHJpdmF0ZSBVc2UgQXJlYSAocGxhbmUgMClcbiAgICB7YmVnaW46IDB4MzFDMCwgZW5kOiAweDMxRUZ9LCAvLyBDSksgU3Ryb2tlc1xuICAgIHtiZWdpbjogMHhGQjAwLCBlbmQ6IDB4RkI0Rn0sIC8vIEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zXG4gICAge2JlZ2luOiAweEZCNTAsIGVuZDogMHhGREZGfSwgLy8gQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BXG4gICAge2JlZ2luOiAweEZFMjAsIGVuZDogMHhGRTJGfSwgLy8gQ29tYmluaW5nIEhhbGYgTWFya3NcbiAgICB7YmVnaW46IDB4RkUxMCwgZW5kOiAweEZFMUZ9LCAvLyBWZXJ0aWNhbCBGb3Jtc1xuICAgIHtiZWdpbjogMHhGRTUwLCBlbmQ6IDB4RkU2Rn0sIC8vIFNtYWxsIEZvcm0gVmFyaWFudHNcbiAgICB7YmVnaW46IDB4RkU3MCwgZW5kOiAweEZFRkZ9LCAvLyBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUJcbiAgICB7YmVnaW46IDB4RkYwMCwgZW5kOiAweEZGRUZ9LCAvLyBIYWxmd2lkdGggQW5kIEZ1bGx3aWR0aCBGb3Jtc1xuICAgIHtiZWdpbjogMHhGRkYwLCBlbmQ6IDB4RkZGRn0sIC8vIFNwZWNpYWxzXG4gICAge2JlZ2luOiAweDBGMDAsIGVuZDogMHgwRkZGfSwgLy8gVGliZXRhblxuICAgIHtiZWdpbjogMHgwNzAwLCBlbmQ6IDB4MDc0Rn0sIC8vIFN5cmlhY1xuICAgIHtiZWdpbjogMHgwNzgwLCBlbmQ6IDB4MDdCRn0sIC8vIFRoYWFuYVxuICAgIHtiZWdpbjogMHgwRDgwLCBlbmQ6IDB4MERGRn0sIC8vIFNpbmhhbGFcbiAgICB7YmVnaW46IDB4MTAwMCwgZW5kOiAweDEwOUZ9LCAvLyBNeWFubWFyXG4gICAge2JlZ2luOiAweDEyMDAsIGVuZDogMHgxMzdGfSwgLy8gRXRoaW9waWNcbiAgICB7YmVnaW46IDB4MTNBMCwgZW5kOiAweDEzRkZ9LCAvLyBDaGVyb2tlZVxuICAgIHtiZWdpbjogMHgxNDAwLCBlbmQ6IDB4MTY3Rn0sIC8vIFVuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3NcbiAgICB7YmVnaW46IDB4MTY4MCwgZW5kOiAweDE2OUZ9LCAvLyBPZ2hhbVxuICAgIHtiZWdpbjogMHgxNkEwLCBlbmQ6IDB4MTZGRn0sIC8vIFJ1bmljXG4gICAge2JlZ2luOiAweDE3ODAsIGVuZDogMHgxN0ZGfSwgLy8gS2htZXJcbiAgICB7YmVnaW46IDB4MTgwMCwgZW5kOiAweDE4QUZ9LCAvLyBNb25nb2xpYW5cbiAgICB7YmVnaW46IDB4MjgwMCwgZW5kOiAweDI4RkZ9LCAvLyBCcmFpbGxlIFBhdHRlcm5zXG4gICAge2JlZ2luOiAweEEwMDAsIGVuZDogMHhBNDhGfSwgLy8gWWkgU3lsbGFibGVzXG4gICAge2JlZ2luOiAweDE3MDAsIGVuZDogMHgxNzFGfSwgLy8gVGFnYWxvZ1xuICAgIHtiZWdpbjogMHgxMDMwMCwgZW5kOiAweDEwMzJGfSwgLy8gT2xkIEl0YWxpY1xuICAgIHtiZWdpbjogMHgxMDMzMCwgZW5kOiAweDEwMzRGfSwgLy8gR290aGljXG4gICAge2JlZ2luOiAweDEwNDAwLCBlbmQ6IDB4MTA0NEZ9LCAvLyBEZXNlcmV0XG4gICAge2JlZ2luOiAweDFEMDAwLCBlbmQ6IDB4MUQwRkZ9LCAvLyBCeXphbnRpbmUgTXVzaWNhbCBTeW1ib2xzXG4gICAge2JlZ2luOiAweDFENDAwLCBlbmQ6IDB4MUQ3RkZ9LCAvLyBNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHNcbiAgICB7YmVnaW46IDB4RkYwMDAsIGVuZDogMHhGRkZGRH0sIC8vIFByaXZhdGUgVXNlIChwbGFuZSAxNSlcbiAgICB7YmVnaW46IDB4RkUwMCwgZW5kOiAweEZFMEZ9LCAvLyBWYXJpYXRpb24gU2VsZWN0b3JzXG4gICAge2JlZ2luOiAweEUwMDAwLCBlbmQ6IDB4RTAwN0Z9LCAvLyBUYWdzXG4gICAge2JlZ2luOiAweDE5MDAsIGVuZDogMHgxOTRGfSwgLy8gTGltYnVcbiAgICB7YmVnaW46IDB4MTk1MCwgZW5kOiAweDE5N0Z9LCAvLyBUYWkgTGVcbiAgICB7YmVnaW46IDB4MTk4MCwgZW5kOiAweDE5REZ9LCAvLyBOZXcgVGFpIEx1ZVxuICAgIHtiZWdpbjogMHgxQTAwLCBlbmQ6IDB4MUExRn0sIC8vIEJ1Z2luZXNlXG4gICAge2JlZ2luOiAweDJDMDAsIGVuZDogMHgyQzVGfSwgLy8gR2xhZ29saXRpY1xuICAgIHtiZWdpbjogMHgyRDMwLCBlbmQ6IDB4MkQ3Rn0sIC8vIFRpZmluYWdoXG4gICAge2JlZ2luOiAweDREQzAsIGVuZDogMHg0REZGfSwgLy8gWWlqaW5nIEhleGFncmFtIFN5bWJvbHNcbiAgICB7YmVnaW46IDB4QTgwMCwgZW5kOiAweEE4MkZ9LCAvLyBTeWxvdGkgTmFncmlcbiAgICB7YmVnaW46IDB4MTAwMDAsIGVuZDogMHgxMDA3Rn0sIC8vIExpbmVhciBCIFN5bGxhYmFyeVxuICAgIHtiZWdpbjogMHgxMDE0MCwgZW5kOiAweDEwMThGfSwgLy8gQW5jaWVudCBHcmVlayBOdW1iZXJzXG4gICAge2JlZ2luOiAweDEwMzgwLCBlbmQ6IDB4MTAzOUZ9LCAvLyBVZ2FyaXRpY1xuICAgIHtiZWdpbjogMHgxMDNBMCwgZW5kOiAweDEwM0RGfSwgLy8gT2xkIFBlcnNpYW5cbiAgICB7YmVnaW46IDB4MTA0NTAsIGVuZDogMHgxMDQ3Rn0sIC8vIFNoYXZpYW5cbiAgICB7YmVnaW46IDB4MTA0ODAsIGVuZDogMHgxMDRBRn0sIC8vIE9zbWFueWFcbiAgICB7YmVnaW46IDB4MTA4MDAsIGVuZDogMHgxMDgzRn0sIC8vIEN5cHJpb3QgU3lsbGFiYXJ5XG4gICAge2JlZ2luOiAweDEwQTAwLCBlbmQ6IDB4MTBBNUZ9LCAvLyBLaGFyb3NodGhpXG4gICAge2JlZ2luOiAweDFEMzAwLCBlbmQ6IDB4MUQzNUZ9LCAvLyBUYWkgWHVhbiBKaW5nIFN5bWJvbHNcbiAgICB7YmVnaW46IDB4MTIwMDAsIGVuZDogMHgxMjNGRn0sIC8vIEN1bmVpZm9ybVxuICAgIHtiZWdpbjogMHgxRDM2MCwgZW5kOiAweDFEMzdGfSwgLy8gQ291bnRpbmcgUm9kIE51bWVyYWxzXG4gICAge2JlZ2luOiAweDFCODAsIGVuZDogMHgxQkJGfSwgLy8gU3VuZGFuZXNlXG4gICAge2JlZ2luOiAweDFDMDAsIGVuZDogMHgxQzRGfSwgLy8gTGVwY2hhXG4gICAge2JlZ2luOiAweDFDNTAsIGVuZDogMHgxQzdGfSwgLy8gT2wgQ2hpa2lcbiAgICB7YmVnaW46IDB4QTg4MCwgZW5kOiAweEE4REZ9LCAvLyBTYXVyYXNodHJhXG4gICAge2JlZ2luOiAweEE5MDAsIGVuZDogMHhBOTJGfSwgLy8gS2F5YWggTGlcbiAgICB7YmVnaW46IDB4QTkzMCwgZW5kOiAweEE5NUZ9LCAvLyBSZWphbmdcbiAgICB7YmVnaW46IDB4QUEwMCwgZW5kOiAweEFBNUZ9LCAvLyBDaGFtXG4gICAge2JlZ2luOiAweDEwMTkwLCBlbmQ6IDB4MTAxQ0Z9LCAvLyBBbmNpZW50IFN5bWJvbHNcbiAgICB7YmVnaW46IDB4MTAxRDAsIGVuZDogMHgxMDFGRn0sIC8vIFBoYWlzdG9zIERpc2NcbiAgICB7YmVnaW46IDB4MTAyQTAsIGVuZDogMHgxMDJERn0sIC8vIENhcmlhblxuICAgIHtiZWdpbjogMHgxRjAzMCwgZW5kOiAweDFGMDlGfSAgLy8gRG9taW5vIFRpbGVzXG5dO1xuXG5mdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2UodW5pY29kZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdW5pY29kZVJhbmdlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgcmFuZ2UgPSB1bmljb2RlUmFuZ2VzW2ldO1xuICAgICAgICBpZiAodW5pY29kZSA+PSByYW5nZS5iZWdpbiAmJiB1bmljb2RlIDwgcmFuZ2UuZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn1cblxuLy8gUGFyc2UgdGhlIE9TLzIgYW5kIFdpbmRvd3MgbWV0cmljcyBgT1MvMmAgdGFibGVcbmZ1bmN0aW9uIHBhcnNlT1MyVGFibGUoZGF0YSwgc3RhcnQpIHtcbiAgICB2YXIgb3MyID0ge307XG4gICAgdmFyIHAgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICBvczIudmVyc2lvbiA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICBvczIueEF2Z0NoYXJXaWR0aCA9IHAucGFyc2VTaG9ydCgpO1xuICAgIG9zMi51c1dlaWdodENsYXNzID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIG9zMi51c1dpZHRoQ2xhc3MgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgb3MyLmZzVHlwZSA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICBvczIueVN1YnNjcmlwdFhTaXplID0gcC5wYXJzZVNob3J0KCk7XG4gICAgb3MyLnlTdWJzY3JpcHRZU2l6ZSA9IHAucGFyc2VTaG9ydCgpO1xuICAgIG9zMi55U3Vic2NyaXB0WE9mZnNldCA9IHAucGFyc2VTaG9ydCgpO1xuICAgIG9zMi55U3Vic2NyaXB0WU9mZnNldCA9IHAucGFyc2VTaG9ydCgpO1xuICAgIG9zMi55U3VwZXJzY3JpcHRYU2l6ZSA9IHAucGFyc2VTaG9ydCgpO1xuICAgIG9zMi55U3VwZXJzY3JpcHRZU2l6ZSA9IHAucGFyc2VTaG9ydCgpO1xuICAgIG9zMi55U3VwZXJzY3JpcHRYT2Zmc2V0ID0gcC5wYXJzZVNob3J0KCk7XG4gICAgb3MyLnlTdXBlcnNjcmlwdFlPZmZzZXQgPSBwLnBhcnNlU2hvcnQoKTtcbiAgICBvczIueVN0cmlrZW91dFNpemUgPSBwLnBhcnNlU2hvcnQoKTtcbiAgICBvczIueVN0cmlrZW91dFBvc2l0aW9uID0gcC5wYXJzZVNob3J0KCk7XG4gICAgb3MyLnNGYW1pbHlDbGFzcyA9IHAucGFyc2VTaG9ydCgpO1xuICAgIG9zMi5wYW5vc2UgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgb3MyLnBhbm9zZVtpXSA9IHAucGFyc2VCeXRlKCk7XG4gICAgfVxuXG4gICAgb3MyLnVsVW5pY29kZVJhbmdlMSA9IHAucGFyc2VVTG9uZygpO1xuICAgIG9zMi51bFVuaWNvZGVSYW5nZTIgPSBwLnBhcnNlVUxvbmcoKTtcbiAgICBvczIudWxVbmljb2RlUmFuZ2UzID0gcC5wYXJzZVVMb25nKCk7XG4gICAgb3MyLnVsVW5pY29kZVJhbmdlNCA9IHAucGFyc2VVTG9uZygpO1xuICAgIG9zMi5hY2hWZW5kSUQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHAucGFyc2VCeXRlKCksIHAucGFyc2VCeXRlKCksIHAucGFyc2VCeXRlKCksIHAucGFyc2VCeXRlKCkpO1xuICAgIG9zMi5mc1NlbGVjdGlvbiA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICBvczIudXNGaXJzdENoYXJJbmRleCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICBvczIudXNMYXN0Q2hhckluZGV4ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIG9zMi5zVHlwb0FzY2VuZGVyID0gcC5wYXJzZVNob3J0KCk7XG4gICAgb3MyLnNUeXBvRGVzY2VuZGVyID0gcC5wYXJzZVNob3J0KCk7XG4gICAgb3MyLnNUeXBvTGluZUdhcCA9IHAucGFyc2VTaG9ydCgpO1xuICAgIG9zMi51c1dpbkFzY2VudCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICBvczIudXNXaW5EZXNjZW50ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIGlmIChvczIudmVyc2lvbiA+PSAxKSB7XG4gICAgICAgIG9zMi51bENvZGVQYWdlUmFuZ2UxID0gcC5wYXJzZVVMb25nKCk7XG4gICAgICAgIG9zMi51bENvZGVQYWdlUmFuZ2UyID0gcC5wYXJzZVVMb25nKCk7XG4gICAgfVxuXG4gICAgaWYgKG9zMi52ZXJzaW9uID49IDIpIHtcbiAgICAgICAgb3MyLnN4SGVpZ2h0ID0gcC5wYXJzZVNob3J0KCk7XG4gICAgICAgIG9zMi5zQ2FwSGVpZ2h0ID0gcC5wYXJzZVNob3J0KCk7XG4gICAgICAgIG9zMi51c0RlZmF1bHRDaGFyID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICBvczIudXNCcmVha0NoYXIgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIG9zMi51c01heENvbnRlbnQgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9zMjtcbn1cblxuZnVuY3Rpb24gbWFrZU9TMlRhYmxlKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IHRhYmxlLlRhYmxlKCdPUy8yJywgW1xuICAgICAgICB7bmFtZTogJ3ZlcnNpb24nLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB4MDAwM30sXG4gICAgICAgIHtuYW1lOiAneEF2Z0NoYXJXaWR0aCcsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICd1c1dlaWdodENsYXNzJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICd1c1dpZHRoQ2xhc3MnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ2ZzVHlwZScsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAneVN1YnNjcmlwdFhTaXplJywgdHlwZTogJ1NIT1JUJywgdmFsdWU6IDY1MH0sXG4gICAgICAgIHtuYW1lOiAneVN1YnNjcmlwdFlTaXplJywgdHlwZTogJ1NIT1JUJywgdmFsdWU6IDY5OX0sXG4gICAgICAgIHtuYW1lOiAneVN1YnNjcmlwdFhPZmZzZXQnLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAneVN1YnNjcmlwdFlPZmZzZXQnLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogMTQwfSxcbiAgICAgICAge25hbWU6ICd5U3VwZXJzY3JpcHRYU2l6ZScsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiA2NTB9LFxuICAgICAgICB7bmFtZTogJ3lTdXBlcnNjcmlwdFlTaXplJywgdHlwZTogJ1NIT1JUJywgdmFsdWU6IDY5OX0sXG4gICAgICAgIHtuYW1lOiAneVN1cGVyc2NyaXB0WE9mZnNldCcsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICd5U3VwZXJzY3JpcHRZT2Zmc2V0JywgdHlwZTogJ1NIT1JUJywgdmFsdWU6IDQ3OX0sXG4gICAgICAgIHtuYW1lOiAneVN0cmlrZW91dFNpemUnLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogNDl9LFxuICAgICAgICB7bmFtZTogJ3lTdHJpa2VvdXRQb3NpdGlvbicsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAyNTh9LFxuICAgICAgICB7bmFtZTogJ3NGYW1pbHlDbGFzcycsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdiRmFtaWx5VHlwZScsIHR5cGU6ICdCWVRFJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ2JTZXJpZlN0eWxlJywgdHlwZTogJ0JZVEUnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnYldlaWdodCcsIHR5cGU6ICdCWVRFJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ2JQcm9wb3J0aW9uJywgdHlwZTogJ0JZVEUnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnYkNvbnRyYXN0JywgdHlwZTogJ0JZVEUnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnYlN0cm9rZVZhcmlhdGlvbicsIHR5cGU6ICdCWVRFJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ2JBcm1TdHlsZScsIHR5cGU6ICdCWVRFJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ2JMZXR0ZXJmb3JtJywgdHlwZTogJ0JZVEUnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnYk1pZGxpbmUnLCB0eXBlOiAnQllURScsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdiWEhlaWdodCcsIHR5cGU6ICdCWVRFJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3VsVW5pY29kZVJhbmdlMScsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICd1bFVuaWNvZGVSYW5nZTInLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAndWxVbmljb2RlUmFuZ2UzJywgdHlwZTogJ1VMT05HJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3VsVW5pY29kZVJhbmdlNCcsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdhY2hWZW5kSUQnLCB0eXBlOiAnQ0hBUkFSUkFZJywgdmFsdWU6ICdYWFhYJ30sXG4gICAgICAgIHtuYW1lOiAnZnNTZWxlY3Rpb24nLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3VzRmlyc3RDaGFySW5kZXgnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3VzTGFzdENoYXJJbmRleCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnc1R5cG9Bc2NlbmRlcicsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdzVHlwb0Rlc2NlbmRlcicsIHR5cGU6ICdTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdzVHlwb0xpbmVHYXAnLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAndXNXaW5Bc2NlbnQnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3VzV2luRGVzY2VudCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAndWxDb2RlUGFnZVJhbmdlMScsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICd1bENvZGVQYWdlUmFuZ2UyJywgdHlwZTogJ1VMT05HJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3N4SGVpZ2h0JywgdHlwZTogJ1NIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3NDYXBIZWlnaHQnLCB0eXBlOiAnU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAndXNEZWZhdWx0Q2hhcicsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAndXNCcmVha0NoYXInLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ3VzTWF4Q29udGV4dCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH1cbiAgICBdLCBvcHRpb25zKTtcbn1cblxudmFyIG9zMiA9IHsgcGFyc2U6IHBhcnNlT1MyVGFibGUsIG1ha2U6IG1ha2VPUzJUYWJsZSwgdW5pY29kZVJhbmdlczogdW5pY29kZVJhbmdlcywgZ2V0VW5pY29kZVJhbmdlOiBnZXRVbmljb2RlUmFuZ2UgfTtcblxuLy8gVGhlIGBwb3N0YCB0YWJsZSBzdG9yZXMgYWRkaXRpb25hbCBQb3N0U2NyaXB0IGluZm9ybWF0aW9uLCBzdWNoIGFzIGdseXBoIG5hbWVzLlxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9wb3N0Lmh0bVxuXG4vLyBQYXJzZSB0aGUgUG9zdFNjcmlwdCBgcG9zdGAgdGFibGVcbmZ1bmN0aW9uIHBhcnNlUG9zdFRhYmxlKGRhdGEsIHN0YXJ0KSB7XG4gICAgdmFyIHBvc3QgPSB7fTtcbiAgICB2YXIgcCA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIHBvc3QudmVyc2lvbiA9IHAucGFyc2VWZXJzaW9uKCk7XG4gICAgcG9zdC5pdGFsaWNBbmdsZSA9IHAucGFyc2VGaXhlZCgpO1xuICAgIHBvc3QudW5kZXJsaW5lUG9zaXRpb24gPSBwLnBhcnNlU2hvcnQoKTtcbiAgICBwb3N0LnVuZGVybGluZVRoaWNrbmVzcyA9IHAucGFyc2VTaG9ydCgpO1xuICAgIHBvc3QuaXNGaXhlZFBpdGNoID0gcC5wYXJzZVVMb25nKCk7XG4gICAgcG9zdC5taW5NZW1UeXBlNDIgPSBwLnBhcnNlVUxvbmcoKTtcbiAgICBwb3N0Lm1heE1lbVR5cGU0MiA9IHAucGFyc2VVTG9uZygpO1xuICAgIHBvc3QubWluTWVtVHlwZTEgPSBwLnBhcnNlVUxvbmcoKTtcbiAgICBwb3N0Lm1heE1lbVR5cGUxID0gcC5wYXJzZVVMb25nKCk7XG4gICAgc3dpdGNoIChwb3N0LnZlcnNpb24pIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcG9zdC5uYW1lcyA9IHN0YW5kYXJkTmFtZXMuc2xpY2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBwb3N0Lm51bWJlck9mR2x5cGhzID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgcG9zdC5nbHlwaE5hbWVJbmRleCA9IG5ldyBBcnJheShwb3N0Lm51bWJlck9mR2x5cGhzKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zdC5udW1iZXJPZkdseXBoczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcG9zdC5nbHlwaE5hbWVJbmRleFtpXSA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9zdC5uYW1lcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgcG9zdC5udW1iZXJPZkdseXBoczsgaSQxKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zdC5nbHlwaE5hbWVJbmRleFtpJDFdID49IHN0YW5kYXJkTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lTGVuZ3RoID0gcC5wYXJzZUNoYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zdC5uYW1lcy5wdXNoKHAucGFyc2VTdHJpbmcobmFtZUxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMi41OlxuICAgICAgICAgICAgcG9zdC5udW1iZXJPZkdseXBocyA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgICAgIHBvc3Qub2Zmc2V0ID0gbmV3IEFycmF5KHBvc3QubnVtYmVyT2ZHbHlwaHMpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgcG9zdC5udW1iZXJPZkdseXBoczsgaSQyKyspIHtcbiAgICAgICAgICAgICAgICBwb3N0Lm9mZnNldFtpJDJdID0gcC5wYXJzZUNoYXIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBwb3N0O1xufVxuXG5mdW5jdGlvbiBtYWtlUG9zdFRhYmxlKCkge1xuICAgIHJldHVybiBuZXcgdGFibGUuVGFibGUoJ3Bvc3QnLCBbXG4gICAgICAgIHtuYW1lOiAndmVyc2lvbicsIHR5cGU6ICdGSVhFRCcsIHZhbHVlOiAweDAwMDMwMDAwfSxcbiAgICAgICAge25hbWU6ICdpdGFsaWNBbmdsZScsIHR5cGU6ICdGSVhFRCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICd1bmRlcmxpbmVQb3NpdGlvbicsIHR5cGU6ICdGV09SRCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICd1bmRlcmxpbmVUaGlja25lc3MnLCB0eXBlOiAnRldPUkQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnaXNGaXhlZFBpdGNoJywgdHlwZTogJ1VMT05HJywgdmFsdWU6IDB9LFxuICAgICAgICB7bmFtZTogJ21pbk1lbVR5cGU0MicsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdtYXhNZW1UeXBlNDInLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnbWluTWVtVHlwZTEnLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnbWF4TWVtVHlwZTEnLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogMH1cbiAgICBdKTtcbn1cblxudmFyIHBvc3QgPSB7IHBhcnNlOiBwYXJzZVBvc3RUYWJsZSwgbWFrZTogbWFrZVBvc3RUYWJsZSB9O1xuXG4vLyBUaGUgYEdTVUJgIHRhYmxlIGNvbnRhaW5zIGxpZ2F0dXJlcywgYW1vbmcgb3RoZXIgdGhpbmdzLlxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9nc3ViLmh0bVxuXG52YXIgc3VidGFibGVQYXJzZXJzID0gbmV3IEFycmF5KDkpOyAgICAgICAgIC8vIHN1YnRhYmxlUGFyc2Vyc1swXSBpcyB1bnVzZWRcblxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9HU1VCLmh0bSNTU1xuc3VidGFibGVQYXJzZXJzWzFdID0gZnVuY3Rpb24gcGFyc2VMb29rdXAxKCkge1xuICAgIHZhciBzdGFydCA9IHRoaXMub2Zmc2V0ICsgdGhpcy5yZWxhdGl2ZU9mZnNldDtcbiAgICB2YXIgc3Vic3RGb3JtYXQgPSB0aGlzLnBhcnNlVVNob3J0KCk7XG4gICAgaWYgKHN1YnN0Rm9ybWF0ID09PSAxKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWJzdEZvcm1hdDogMSxcbiAgICAgICAgICAgIGNvdmVyYWdlOiB0aGlzLnBhcnNlUG9pbnRlcihQYXJzZXIuY292ZXJhZ2UpLFxuICAgICAgICAgICAgZGVsdGFHbHlwaElkOiB0aGlzLnBhcnNlVVNob3J0KClcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHN1YnN0Rm9ybWF0ID09PSAyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWJzdEZvcm1hdDogMixcbiAgICAgICAgICAgIGNvdmVyYWdlOiB0aGlzLnBhcnNlUG9pbnRlcihQYXJzZXIuY292ZXJhZ2UpLFxuICAgICAgICAgICAgc3Vic3RpdHV0ZTogdGhpcy5wYXJzZU9mZnNldDE2TGlzdCgpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNoZWNrLmFzc2VydChmYWxzZSwgJzB4JyArIHN0YXJ0LnRvU3RyaW5nKDE2KSArICc6IGxvb2t1cCB0eXBlIDEgZm9ybWF0IG11c3QgYmUgMSBvciAyLicpO1xufTtcblxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9HU1VCLmh0bSNNU1xuc3VidGFibGVQYXJzZXJzWzJdID0gZnVuY3Rpb24gcGFyc2VMb29rdXAyKCkge1xuICAgIHZhciBzdWJzdEZvcm1hdCA9IHRoaXMucGFyc2VVU2hvcnQoKTtcbiAgICBjaGVjay5hcmd1bWVudChzdWJzdEZvcm1hdCA9PT0gMSwgJ0dTVUIgTXVsdGlwbGUgU3Vic3RpdHV0aW9uIFN1YnRhYmxlIGlkZW50aWZpZXItZm9ybWF0IG11c3QgYmUgMScpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN1YnN0Rm9ybWF0OiBzdWJzdEZvcm1hdCxcbiAgICAgICAgY292ZXJhZ2U6IHRoaXMucGFyc2VQb2ludGVyKFBhcnNlci5jb3ZlcmFnZSksXG4gICAgICAgIHNlcXVlbmNlczogdGhpcy5wYXJzZUxpc3RPZkxpc3RzKClcbiAgICB9O1xufTtcblxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9HU1VCLmh0bSNBU1xuc3VidGFibGVQYXJzZXJzWzNdID0gZnVuY3Rpb24gcGFyc2VMb29rdXAzKCkge1xuICAgIHZhciBzdWJzdEZvcm1hdCA9IHRoaXMucGFyc2VVU2hvcnQoKTtcbiAgICBjaGVjay5hcmd1bWVudChzdWJzdEZvcm1hdCA9PT0gMSwgJ0dTVUIgQWx0ZXJuYXRlIFN1YnN0aXR1dGlvbiBTdWJ0YWJsZSBpZGVudGlmaWVyLWZvcm1hdCBtdXN0IGJlIDEnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzdEZvcm1hdDogc3Vic3RGb3JtYXQsXG4gICAgICAgIGNvdmVyYWdlOiB0aGlzLnBhcnNlUG9pbnRlcihQYXJzZXIuY292ZXJhZ2UpLFxuICAgICAgICBhbHRlcm5hdGVTZXRzOiB0aGlzLnBhcnNlTGlzdE9mTGlzdHMoKVxuICAgIH07XG59O1xuXG4vLyBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT1RTUEVDL0dTVUIuaHRtI0xTXG5zdWJ0YWJsZVBhcnNlcnNbNF0gPSBmdW5jdGlvbiBwYXJzZUxvb2t1cDQoKSB7XG4gICAgdmFyIHN1YnN0Rm9ybWF0ID0gdGhpcy5wYXJzZVVTaG9ydCgpO1xuICAgIGNoZWNrLmFyZ3VtZW50KHN1YnN0Rm9ybWF0ID09PSAxLCAnR1NVQiBsaWdhdHVyZSB0YWJsZSBpZGVudGlmaWVyLWZvcm1hdCBtdXN0IGJlIDEnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzdEZvcm1hdDogc3Vic3RGb3JtYXQsXG4gICAgICAgIGNvdmVyYWdlOiB0aGlzLnBhcnNlUG9pbnRlcihQYXJzZXIuY292ZXJhZ2UpLFxuICAgICAgICBsaWdhdHVyZVNldHM6IHRoaXMucGFyc2VMaXN0T2ZMaXN0cyhmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbGlnR2x5cGg6IHRoaXMucGFyc2VVU2hvcnQoKSxcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB0aGlzLnBhcnNlVVNob3J0TGlzdCh0aGlzLnBhcnNlVVNob3J0KCkgLSAxKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICB9O1xufTtcblxudmFyIGxvb2t1cFJlY29yZERlc2MgPSB7XG4gICAgc2VxdWVuY2VJbmRleDogUGFyc2VyLnVTaG9ydCxcbiAgICBsb29rdXBMaXN0SW5kZXg6IFBhcnNlci51U2hvcnRcbn07XG5cbi8vIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PVFNQRUMvR1NVQi5odG0jQ1NGXG5zdWJ0YWJsZVBhcnNlcnNbNV0gPSBmdW5jdGlvbiBwYXJzZUxvb2t1cDUoKSB7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5vZmZzZXQgKyB0aGlzLnJlbGF0aXZlT2Zmc2V0O1xuICAgIHZhciBzdWJzdEZvcm1hdCA9IHRoaXMucGFyc2VVU2hvcnQoKTtcblxuICAgIGlmIChzdWJzdEZvcm1hdCA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3Vic3RGb3JtYXQ6IHN1YnN0Rm9ybWF0LFxuICAgICAgICAgICAgY292ZXJhZ2U6IHRoaXMucGFyc2VQb2ludGVyKFBhcnNlci5jb3ZlcmFnZSksXG4gICAgICAgICAgICBydWxlU2V0czogdGhpcy5wYXJzZUxpc3RPZkxpc3RzKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBnbHlwaENvdW50ID0gdGhpcy5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgICAgIHZhciBzdWJzdENvdW50ID0gdGhpcy5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB0aGlzLnBhcnNlVVNob3J0TGlzdChnbHlwaENvdW50IC0gMSksXG4gICAgICAgICAgICAgICAgICAgIGxvb2t1cFJlY29yZHM6IHRoaXMucGFyc2VSZWNvcmRMaXN0KHN1YnN0Q291bnQsIGxvb2t1cFJlY29yZERlc2MpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChzdWJzdEZvcm1hdCA9PT0gMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3Vic3RGb3JtYXQ6IHN1YnN0Rm9ybWF0LFxuICAgICAgICAgICAgY292ZXJhZ2U6IHRoaXMucGFyc2VQb2ludGVyKFBhcnNlci5jb3ZlcmFnZSksXG4gICAgICAgICAgICBjbGFzc0RlZjogdGhpcy5wYXJzZVBvaW50ZXIoUGFyc2VyLmNsYXNzRGVmKSxcbiAgICAgICAgICAgIGNsYXNzU2V0czogdGhpcy5wYXJzZUxpc3RPZkxpc3RzKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBnbHlwaENvdW50ID0gdGhpcy5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgICAgIHZhciBzdWJzdENvdW50ID0gdGhpcy5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IHRoaXMucGFyc2VVU2hvcnRMaXN0KGdseXBoQ291bnQgLSAxKSxcbiAgICAgICAgICAgICAgICAgICAgbG9va3VwUmVjb3JkczogdGhpcy5wYXJzZVJlY29yZExpc3Qoc3Vic3RDb3VudCwgbG9va3VwUmVjb3JkRGVzYylcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHN1YnN0Rm9ybWF0ID09PSAzKSB7XG4gICAgICAgIHZhciBnbHlwaENvdW50ID0gdGhpcy5wYXJzZVVTaG9ydCgpO1xuICAgICAgICB2YXIgc3Vic3RDb3VudCA9IHRoaXMucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1YnN0Rm9ybWF0OiBzdWJzdEZvcm1hdCxcbiAgICAgICAgICAgIGNvdmVyYWdlczogdGhpcy5wYXJzZUxpc3QoZ2x5cGhDb3VudCwgUGFyc2VyLnBvaW50ZXIoUGFyc2VyLmNvdmVyYWdlKSksXG4gICAgICAgICAgICBsb29rdXBSZWNvcmRzOiB0aGlzLnBhcnNlUmVjb3JkTGlzdChzdWJzdENvdW50LCBsb29rdXBSZWNvcmREZXNjKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjaGVjay5hc3NlcnQoZmFsc2UsICcweCcgKyBzdGFydC50b1N0cmluZygxNikgKyAnOiBsb29rdXAgdHlwZSA1IGZvcm1hdCBtdXN0IGJlIDEsIDIgb3IgMy4nKTtcbn07XG5cbi8vIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PVFNQRUMvR1NVQi5odG0jQ0NcbnN1YnRhYmxlUGFyc2Vyc1s2XSA9IGZ1bmN0aW9uIHBhcnNlTG9va3VwNigpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLm9mZnNldCArIHRoaXMucmVsYXRpdmVPZmZzZXQ7XG4gICAgdmFyIHN1YnN0Rm9ybWF0ID0gdGhpcy5wYXJzZVVTaG9ydCgpO1xuICAgIGlmIChzdWJzdEZvcm1hdCA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3Vic3RGb3JtYXQ6IDEsXG4gICAgICAgICAgICBjb3ZlcmFnZTogdGhpcy5wYXJzZVBvaW50ZXIoUGFyc2VyLmNvdmVyYWdlKSxcbiAgICAgICAgICAgIGNoYWluUnVsZVNldHM6IHRoaXMucGFyc2VMaXN0T2ZMaXN0cyhmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBiYWNrdHJhY2s6IHRoaXMucGFyc2VVU2hvcnRMaXN0KCksXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB0aGlzLnBhcnNlVVNob3J0TGlzdCh0aGlzLnBhcnNlU2hvcnQoKSAtIDEpLFxuICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQ6IHRoaXMucGFyc2VVU2hvcnRMaXN0KCksXG4gICAgICAgICAgICAgICAgICAgIGxvb2t1cFJlY29yZHM6IHRoaXMucGFyc2VSZWNvcmRMaXN0KGxvb2t1cFJlY29yZERlc2MpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChzdWJzdEZvcm1hdCA9PT0gMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3Vic3RGb3JtYXQ6IDIsXG4gICAgICAgICAgICBjb3ZlcmFnZTogdGhpcy5wYXJzZVBvaW50ZXIoUGFyc2VyLmNvdmVyYWdlKSxcbiAgICAgICAgICAgIGJhY2t0cmFja0NsYXNzRGVmOiB0aGlzLnBhcnNlUG9pbnRlcihQYXJzZXIuY2xhc3NEZWYpLFxuICAgICAgICAgICAgaW5wdXRDbGFzc0RlZjogdGhpcy5wYXJzZVBvaW50ZXIoUGFyc2VyLmNsYXNzRGVmKSxcbiAgICAgICAgICAgIGxvb2thaGVhZENsYXNzRGVmOiB0aGlzLnBhcnNlUG9pbnRlcihQYXJzZXIuY2xhc3NEZWYpLFxuICAgICAgICAgICAgY2hhaW5DbGFzc1NldDogdGhpcy5wYXJzZUxpc3RPZkxpc3RzKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2t0cmFjazogdGhpcy5wYXJzZVVTaG9ydExpc3QoKSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHRoaXMucGFyc2VVU2hvcnRMaXN0KHRoaXMucGFyc2VTaG9ydCgpIC0gMSksXG4gICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZDogdGhpcy5wYXJzZVVTaG9ydExpc3QoKSxcbiAgICAgICAgICAgICAgICAgICAgbG9va3VwUmVjb3JkczogdGhpcy5wYXJzZVJlY29yZExpc3QobG9va3VwUmVjb3JkRGVzYylcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHN1YnN0Rm9ybWF0ID09PSAzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWJzdEZvcm1hdDogMyxcbiAgICAgICAgICAgIGJhY2t0cmFja0NvdmVyYWdlOiB0aGlzLnBhcnNlTGlzdChQYXJzZXIucG9pbnRlcihQYXJzZXIuY292ZXJhZ2UpKSxcbiAgICAgICAgICAgIGlucHV0Q292ZXJhZ2U6IHRoaXMucGFyc2VMaXN0KFBhcnNlci5wb2ludGVyKFBhcnNlci5jb3ZlcmFnZSkpLFxuICAgICAgICAgICAgbG9va2FoZWFkQ292ZXJhZ2U6IHRoaXMucGFyc2VMaXN0KFBhcnNlci5wb2ludGVyKFBhcnNlci5jb3ZlcmFnZSkpLFxuICAgICAgICAgICAgbG9va3VwUmVjb3JkczogdGhpcy5wYXJzZVJlY29yZExpc3QobG9va3VwUmVjb3JkRGVzYylcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2hlY2suYXNzZXJ0KGZhbHNlLCAnMHgnICsgc3RhcnQudG9TdHJpbmcoMTYpICsgJzogbG9va3VwIHR5cGUgNiBmb3JtYXQgbXVzdCBiZSAxLCAyIG9yIDMuJyk7XG59O1xuXG4vLyBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT1RTUEVDL0dTVUIuaHRtI0VTXG5zdWJ0YWJsZVBhcnNlcnNbN10gPSBmdW5jdGlvbiBwYXJzZUxvb2t1cDcoKSB7XG4gICAgLy8gRXh0ZW5zaW9uIFN1YnN0aXR1dGlvbiBzdWJ0YWJsZVxuICAgIHZhciBzdWJzdEZvcm1hdCA9IHRoaXMucGFyc2VVU2hvcnQoKTtcbiAgICBjaGVjay5hcmd1bWVudChzdWJzdEZvcm1hdCA9PT0gMSwgJ0dTVUIgRXh0ZW5zaW9uIFN1YnN0aXR1dGlvbiBzdWJ0YWJsZSBpZGVudGlmaWVyLWZvcm1hdCBtdXN0IGJlIDEnKTtcbiAgICB2YXIgZXh0ZW5zaW9uTG9va3VwVHlwZSA9IHRoaXMucGFyc2VVU2hvcnQoKTtcbiAgICB2YXIgZXh0ZW5zaW9uUGFyc2VyID0gbmV3IFBhcnNlcih0aGlzLmRhdGEsIHRoaXMub2Zmc2V0ICsgdGhpcy5wYXJzZVVMb25nKCkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN1YnN0Rm9ybWF0OiAxLFxuICAgICAgICBsb29rdXBUeXBlOiBleHRlbnNpb25Mb29rdXBUeXBlLFxuICAgICAgICBleHRlbnNpb246IHN1YnRhYmxlUGFyc2Vyc1tleHRlbnNpb25Mb29rdXBUeXBlXS5jYWxsKGV4dGVuc2lvblBhcnNlcilcbiAgICB9O1xufTtcblxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9HU1VCLmh0bSNSQ0NTXG5zdWJ0YWJsZVBhcnNlcnNbOF0gPSBmdW5jdGlvbiBwYXJzZUxvb2t1cDgoKSB7XG4gICAgdmFyIHN1YnN0Rm9ybWF0ID0gdGhpcy5wYXJzZVVTaG9ydCgpO1xuICAgIGNoZWNrLmFyZ3VtZW50KHN1YnN0Rm9ybWF0ID09PSAxLCAnR1NVQiBSZXZlcnNlIENoYWluaW5nIENvbnRleHR1YWwgU2luZ2xlIFN1YnN0aXR1dGlvbiBTdWJ0YWJsZSBpZGVudGlmaWVyLWZvcm1hdCBtdXN0IGJlIDEnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzdEZvcm1hdDogc3Vic3RGb3JtYXQsXG4gICAgICAgIGNvdmVyYWdlOiB0aGlzLnBhcnNlUG9pbnRlcihQYXJzZXIuY292ZXJhZ2UpLFxuICAgICAgICBiYWNrdHJhY2tDb3ZlcmFnZTogdGhpcy5wYXJzZUxpc3QoUGFyc2VyLnBvaW50ZXIoUGFyc2VyLmNvdmVyYWdlKSksXG4gICAgICAgIGxvb2thaGVhZENvdmVyYWdlOiB0aGlzLnBhcnNlTGlzdChQYXJzZXIucG9pbnRlcihQYXJzZXIuY292ZXJhZ2UpKSxcbiAgICAgICAgc3Vic3RpdHV0ZXM6IHRoaXMucGFyc2VVU2hvcnRMaXN0KClcbiAgICB9O1xufTtcblxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9nc3ViLmh0bVxuZnVuY3Rpb24gcGFyc2VHc3ViVGFibGUoZGF0YSwgc3RhcnQpIHtcbiAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgdmFyIHAgPSBuZXcgUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICB2YXIgdGFibGVWZXJzaW9uID0gcC5wYXJzZVZlcnNpb24oKTtcbiAgICBjaGVjay5hcmd1bWVudCh0YWJsZVZlcnNpb24gPT09IDEsICdVbnN1cHBvcnRlZCBHU1VCIHRhYmxlIHZlcnNpb24uJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmVyc2lvbjogdGFibGVWZXJzaW9uLFxuICAgICAgICBzY3JpcHRzOiBwLnBhcnNlU2NyaXB0TGlzdCgpLFxuICAgICAgICBmZWF0dXJlczogcC5wYXJzZUZlYXR1cmVMaXN0KCksXG4gICAgICAgIGxvb2t1cHM6IHAucGFyc2VMb29rdXBMaXN0KHN1YnRhYmxlUGFyc2VycylcbiAgICB9O1xufVxuXG4vLyBHU1VCIFdyaXRpbmcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xudmFyIHN1YnRhYmxlTWFrZXJzID0gbmV3IEFycmF5KDkpO1xuXG5zdWJ0YWJsZU1ha2Vyc1sxXSA9IGZ1bmN0aW9uIG1ha2VMb29rdXAxKHN1YnRhYmxlKSB7XG4gICAgaWYgKHN1YnRhYmxlLnN1YnN0Rm9ybWF0ID09PSAxKSB7XG4gICAgICAgIHJldHVybiBuZXcgdGFibGUuVGFibGUoJ3N1YnN0aXR1dGlvblRhYmxlJywgW1xuICAgICAgICAgICAge25hbWU6ICdzdWJzdEZvcm1hdCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMX0sXG4gICAgICAgICAgICB7bmFtZTogJ2NvdmVyYWdlJywgdHlwZTogJ1RBQkxFJywgdmFsdWU6IG5ldyB0YWJsZS5Db3ZlcmFnZShzdWJ0YWJsZS5jb3ZlcmFnZSl9LFxuICAgICAgICAgICAge25hbWU6ICdkZWx0YUdseXBoSUQnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IHN1YnRhYmxlLmRlbHRhR2x5cGhJZH1cbiAgICAgICAgXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0YWJsZS5UYWJsZSgnc3Vic3RpdHV0aW9uVGFibGUnLCBbXG4gICAgICAgICAgICB7bmFtZTogJ3N1YnN0Rm9ybWF0JywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiAyfSxcbiAgICAgICAgICAgIHtuYW1lOiAnY292ZXJhZ2UnLCB0eXBlOiAnVEFCTEUnLCB2YWx1ZTogbmV3IHRhYmxlLkNvdmVyYWdlKHN1YnRhYmxlLmNvdmVyYWdlKX1cbiAgICAgICAgXS5jb25jYXQodGFibGUudXNob3J0TGlzdCgnc3Vic3RpdHV0ZScsIHN1YnRhYmxlLnN1YnN0aXR1dGUpKSk7XG4gICAgfVxuICAgIGNoZWNrLmZhaWwoJ0xvb2t1cCB0eXBlIDEgc3Vic3RGb3JtYXQgbXVzdCBiZSAxIG9yIDIuJyk7XG59O1xuXG5zdWJ0YWJsZU1ha2Vyc1szXSA9IGZ1bmN0aW9uIG1ha2VMb29rdXAzKHN1YnRhYmxlKSB7XG4gICAgY2hlY2suYXNzZXJ0KHN1YnRhYmxlLnN1YnN0Rm9ybWF0ID09PSAxLCAnTG9va3VwIHR5cGUgMyBzdWJzdEZvcm1hdCBtdXN0IGJlIDEuJyk7XG4gICAgcmV0dXJuIG5ldyB0YWJsZS5UYWJsZSgnc3Vic3RpdHV0aW9uVGFibGUnLCBbXG4gICAgICAgIHtuYW1lOiAnc3Vic3RGb3JtYXQnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IDF9LFxuICAgICAgICB7bmFtZTogJ2NvdmVyYWdlJywgdHlwZTogJ1RBQkxFJywgdmFsdWU6IG5ldyB0YWJsZS5Db3ZlcmFnZShzdWJ0YWJsZS5jb3ZlcmFnZSl9XG4gICAgXS5jb25jYXQodGFibGUudGFibGVMaXN0KCdhbHRTZXQnLCBzdWJ0YWJsZS5hbHRlcm5hdGVTZXRzLCBmdW5jdGlvbihhbHRlcm5hdGVTZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0YWJsZS5UYWJsZSgnYWx0ZXJuYXRlU2V0VGFibGUnLCB0YWJsZS51c2hvcnRMaXN0KCdhbHRlcm5hdGUnLCBhbHRlcm5hdGVTZXQpKTtcbiAgICB9KSkpO1xufTtcblxuc3VidGFibGVNYWtlcnNbNF0gPSBmdW5jdGlvbiBtYWtlTG9va3VwNChzdWJ0YWJsZSkge1xuICAgIGNoZWNrLmFzc2VydChzdWJ0YWJsZS5zdWJzdEZvcm1hdCA9PT0gMSwgJ0xvb2t1cCB0eXBlIDQgc3Vic3RGb3JtYXQgbXVzdCBiZSAxLicpO1xuICAgIHJldHVybiBuZXcgdGFibGUuVGFibGUoJ3N1YnN0aXR1dGlvblRhYmxlJywgW1xuICAgICAgICB7bmFtZTogJ3N1YnN0Rm9ybWF0JywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiAxfSxcbiAgICAgICAge25hbWU6ICdjb3ZlcmFnZScsIHR5cGU6ICdUQUJMRScsIHZhbHVlOiBuZXcgdGFibGUuQ292ZXJhZ2Uoc3VidGFibGUuY292ZXJhZ2UpfVxuICAgIF0uY29uY2F0KHRhYmxlLnRhYmxlTGlzdCgnbGlnU2V0Jywgc3VidGFibGUubGlnYXR1cmVTZXRzLCBmdW5jdGlvbihsaWdhdHVyZVNldCkge1xuICAgICAgICByZXR1cm4gbmV3IHRhYmxlLlRhYmxlKCdsaWdhdHVyZVNldFRhYmxlJywgdGFibGUudGFibGVMaXN0KCdsaWdhdHVyZScsIGxpZ2F0dXJlU2V0LCBmdW5jdGlvbihsaWdhdHVyZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB0YWJsZS5UYWJsZSgnbGlnYXR1cmVUYWJsZScsXG4gICAgICAgICAgICAgICAgW3tuYW1lOiAnbGlnR2x5cGgnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IGxpZ2F0dXJlLmxpZ0dseXBofV1cbiAgICAgICAgICAgICAgICAuY29uY2F0KHRhYmxlLnVzaG9ydExpc3QoJ2NvbXBvbmVudCcsIGxpZ2F0dXJlLmNvbXBvbmVudHMsIGxpZ2F0dXJlLmNvbXBvbmVudHMubGVuZ3RoICsgMSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KSk7XG4gICAgfSkpKTtcbn07XG5cbmZ1bmN0aW9uIG1ha2VHc3ViVGFibGUoZ3N1Yikge1xuICAgIHJldHVybiBuZXcgdGFibGUuVGFibGUoJ0dTVUInLCBbXG4gICAgICAgIHtuYW1lOiAndmVyc2lvbicsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiAweDEwMDAwfSxcbiAgICAgICAge25hbWU6ICdzY3JpcHRzJywgdHlwZTogJ1RBQkxFJywgdmFsdWU6IG5ldyB0YWJsZS5TY3JpcHRMaXN0KGdzdWIuc2NyaXB0cyl9LFxuICAgICAgICB7bmFtZTogJ2ZlYXR1cmVzJywgdHlwZTogJ1RBQkxFJywgdmFsdWU6IG5ldyB0YWJsZS5GZWF0dXJlTGlzdChnc3ViLmZlYXR1cmVzKX0sXG4gICAgICAgIHtuYW1lOiAnbG9va3VwcycsIHR5cGU6ICdUQUJMRScsIHZhbHVlOiBuZXcgdGFibGUuTG9va3VwTGlzdChnc3ViLmxvb2t1cHMsIHN1YnRhYmxlTWFrZXJzKX1cbiAgICBdKTtcbn1cblxudmFyIGdzdWIgPSB7IHBhcnNlOiBwYXJzZUdzdWJUYWJsZSwgbWFrZTogbWFrZUdzdWJUYWJsZSB9O1xuXG4vLyBUaGUgYEdQT1NgIHRhYmxlIGNvbnRhaW5zIGtlcm5pbmcgcGFpcnMsIGFtb25nIG90aGVyIHRoaW5ncy5cbi8vIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PVFNQRUMvZ3Bvcy5odG1cblxuLy8gUGFyc2UgdGhlIG1ldGFkYXRhIGBtZXRhYCB0YWJsZS5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDYvQ2hhcDZtZXRhLmh0bWxcbmZ1bmN0aW9uIHBhcnNlTWV0YVRhYmxlKGRhdGEsIHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICB2YXIgdGFibGVWZXJzaW9uID0gcC5wYXJzZVVMb25nKCk7XG4gICAgY2hlY2suYXJndW1lbnQodGFibGVWZXJzaW9uID09PSAxLCAnVW5zdXBwb3J0ZWQgTUVUQSB0YWJsZSB2ZXJzaW9uLicpO1xuICAgIHAucGFyc2VVTG9uZygpOyAvLyBmbGFncyAtIGN1cnJlbnRseSB1bnVzZWQgYW5kIHNldCB0byAwXG4gICAgcC5wYXJzZVVMb25nKCk7IC8vIHRhYmxlT2Zmc2V0XG4gICAgdmFyIG51bURhdGFNYXBzID0gcC5wYXJzZVVMb25nKCk7XG5cbiAgICB2YXIgdGFncyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtRGF0YU1hcHM7IGkrKykge1xuICAgICAgICB2YXIgdGFnID0gcC5wYXJzZVRhZygpO1xuICAgICAgICB2YXIgZGF0YU9mZnNldCA9IHAucGFyc2VVTG9uZygpO1xuICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IHAucGFyc2VVTG9uZygpO1xuICAgICAgICB2YXIgdGV4dCA9IGRlY29kZS5VVEY4KGRhdGEsIHN0YXJ0ICsgZGF0YU9mZnNldCwgZGF0YUxlbmd0aCk7XG5cbiAgICAgICAgdGFnc1t0YWddID0gdGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ3M7XG59XG5cbmZ1bmN0aW9uIG1ha2VNZXRhVGFibGUodGFncykge1xuICAgIHZhciBudW1UYWdzID0gT2JqZWN0LmtleXModGFncykubGVuZ3RoO1xuICAgIHZhciBzdHJpbmdQb29sID0gJyc7XG4gICAgdmFyIHN0cmluZ1Bvb2xPZmZzZXQgPSAxNiArIG51bVRhZ3MgKiAxMjtcblxuICAgIHZhciByZXN1bHQgPSBuZXcgdGFibGUuVGFibGUoJ21ldGEnLCBbXG4gICAgICAgIHtuYW1lOiAndmVyc2lvbicsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiAxfSxcbiAgICAgICAge25hbWU6ICdmbGFncycsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdvZmZzZXQnLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogc3RyaW5nUG9vbE9mZnNldH0sXG4gICAgICAgIHtuYW1lOiAnbnVtVGFncycsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiBudW1UYWdzfVxuICAgIF0pO1xuXG4gICAgZm9yICh2YXIgdGFnIGluIHRhZ3MpIHtcbiAgICAgICAgdmFyIHBvcyA9IHN0cmluZ1Bvb2wubGVuZ3RoO1xuICAgICAgICBzdHJpbmdQb29sICs9IHRhZ3NbdGFnXTtcblxuICAgICAgICByZXN1bHQuZmllbGRzLnB1c2goe25hbWU6ICd0YWcgJyArIHRhZywgdHlwZTogJ1RBRycsIHZhbHVlOiB0YWd9KTtcbiAgICAgICAgcmVzdWx0LmZpZWxkcy5wdXNoKHtuYW1lOiAnb2Zmc2V0ICcgKyB0YWcsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiBzdHJpbmdQb29sT2Zmc2V0ICsgcG9zfSk7XG4gICAgICAgIHJlc3VsdC5maWVsZHMucHVzaCh7bmFtZTogJ2xlbmd0aCAnICsgdGFnLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogdGFnc1t0YWddLmxlbmd0aH0pO1xuICAgIH1cblxuICAgIHJlc3VsdC5maWVsZHMucHVzaCh7bmFtZTogJ3N0cmluZ1Bvb2wnLCB0eXBlOiAnQ0hBUkFSUkFZJywgdmFsdWU6IHN0cmluZ1Bvb2x9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBtZXRhID0geyBwYXJzZTogcGFyc2VNZXRhVGFibGUsIG1ha2U6IG1ha2VNZXRhVGFibGUgfTtcblxuLy8gVGhlIGBzZm50YCB3cmFwcGVyIHByb3ZpZGVzIG9yZ2FuaXphdGlvbiBmb3IgdGhlIHRhYmxlcyBpbiB0aGUgZm9udC5cbi8vIEl0IGlzIHRoZSB0b3AtbGV2ZWwgZGF0YSBzdHJ1Y3R1cmUgaW4gYSBmb250LlxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9vdGZmLmh0bVxuLy8gUmVjb21tZW5kYXRpb25zIGZvciBjcmVhdGluZyBPcGVuVHlwZSBGb250czpcbi8vIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYzE0MC9yZWNvbS5odG1cblxuZnVuY3Rpb24gbG9nMih2KSB7XG4gICAgcmV0dXJuIE1hdGgubG9nKHYpIC8gTWF0aC5sb2coMikgfCAwO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlQ2hlY2tTdW0oYnl0ZXMpIHtcbiAgICB3aGlsZSAoYnl0ZXMubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgICAgICBieXRlcy5wdXNoKDApO1xuICAgIH1cblxuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgc3VtICs9IChieXRlc1tpXSA8PCAyNCkgK1xuICAgICAgICAgICAgKGJ5dGVzW2kgKyAxXSA8PCAxNikgK1xuICAgICAgICAgICAgKGJ5dGVzW2kgKyAyXSA8PCA4KSArXG4gICAgICAgICAgICAoYnl0ZXNbaSArIDNdKTtcbiAgICB9XG5cbiAgICBzdW0gJT0gTWF0aC5wb3coMiwgMzIpO1xuICAgIHJldHVybiBzdW07XG59XG5cbmZ1bmN0aW9uIG1ha2VUYWJsZVJlY29yZCh0YWcsIGNoZWNrU3VtLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgdGFibGUuUmVjb3JkKCdUYWJsZSBSZWNvcmQnLCBbXG4gICAgICAgIHtuYW1lOiAndGFnJywgdHlwZTogJ1RBRycsIHZhbHVlOiB0YWcgIT09IHVuZGVmaW5lZCA/IHRhZyA6ICcnfSxcbiAgICAgICAge25hbWU6ICdjaGVja1N1bScsIHR5cGU6ICdVTE9ORycsIHZhbHVlOiBjaGVja1N1bSAhPT0gdW5kZWZpbmVkID8gY2hlY2tTdW0gOiAwfSxcbiAgICAgICAge25hbWU6ICdvZmZzZXQnLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogb2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBvZmZzZXQgOiAwfSxcbiAgICAgICAge25hbWU6ICdsZW5ndGgnLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogbGVuZ3RoICE9PSB1bmRlZmluZWQgPyBsZW5ndGggOiAwfVxuICAgIF0pO1xufVxuXG5mdW5jdGlvbiBtYWtlU2ZudFRhYmxlKHRhYmxlcykge1xuICAgIHZhciBzZm50ID0gbmV3IHRhYmxlLlRhYmxlKCdzZm50JywgW1xuICAgICAgICB7bmFtZTogJ3ZlcnNpb24nLCB0eXBlOiAnVEFHJywgdmFsdWU6ICdPVFRPJ30sXG4gICAgICAgIHtuYW1lOiAnbnVtVGFibGVzJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdzZWFyY2hSYW5nZScsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnZW50cnlTZWxlY3RvcicsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAncmFuZ2VTaGlmdCcsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH1cbiAgICBdKTtcbiAgICBzZm50LnRhYmxlcyA9IHRhYmxlcztcbiAgICBzZm50Lm51bVRhYmxlcyA9IHRhYmxlcy5sZW5ndGg7XG4gICAgdmFyIGhpZ2hlc3RQb3dlck9mMiA9IE1hdGgucG93KDIsIGxvZzIoc2ZudC5udW1UYWJsZXMpKTtcbiAgICBzZm50LnNlYXJjaFJhbmdlID0gMTYgKiBoaWdoZXN0UG93ZXJPZjI7XG4gICAgc2ZudC5lbnRyeVNlbGVjdG9yID0gbG9nMihoaWdoZXN0UG93ZXJPZjIpO1xuICAgIHNmbnQucmFuZ2VTaGlmdCA9IHNmbnQubnVtVGFibGVzICogMTYgLSBzZm50LnNlYXJjaFJhbmdlO1xuXG4gICAgdmFyIHJlY29yZEZpZWxkcyA9IFtdO1xuICAgIHZhciB0YWJsZUZpZWxkcyA9IFtdO1xuXG4gICAgdmFyIG9mZnNldCA9IHNmbnQuc2l6ZU9mKCkgKyAobWFrZVRhYmxlUmVjb3JkKCkuc2l6ZU9mKCkgKiBzZm50Lm51bVRhYmxlcyk7XG4gICAgd2hpbGUgKG9mZnNldCAlIDQgIT09IDApIHtcbiAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgIHRhYmxlRmllbGRzLnB1c2goe25hbWU6ICdwYWRkaW5nJywgdHlwZTogJ0JZVEUnLCB2YWx1ZTogMH0pO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFibGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciB0ID0gdGFibGVzW2ldO1xuICAgICAgICBjaGVjay5hcmd1bWVudCh0LnRhYmxlTmFtZS5sZW5ndGggPT09IDQsICdUYWJsZSBuYW1lJyArIHQudGFibGVOYW1lICsgJyBpcyBpbnZhbGlkLicpO1xuICAgICAgICB2YXIgdGFibGVMZW5ndGggPSB0LnNpemVPZigpO1xuICAgICAgICB2YXIgdGFibGVSZWNvcmQgPSBtYWtlVGFibGVSZWNvcmQodC50YWJsZU5hbWUsIGNvbXB1dGVDaGVja1N1bSh0LmVuY29kZSgpKSwgb2Zmc2V0LCB0YWJsZUxlbmd0aCk7XG4gICAgICAgIHJlY29yZEZpZWxkcy5wdXNoKHtuYW1lOiB0YWJsZVJlY29yZC50YWcgKyAnIFRhYmxlIFJlY29yZCcsIHR5cGU6ICdSRUNPUkQnLCB2YWx1ZTogdGFibGVSZWNvcmR9KTtcbiAgICAgICAgdGFibGVGaWVsZHMucHVzaCh7bmFtZTogdC50YWJsZU5hbWUgKyAnIHRhYmxlJywgdHlwZTogJ1JFQ09SRCcsIHZhbHVlOiB0fSk7XG4gICAgICAgIG9mZnNldCArPSB0YWJsZUxlbmd0aDtcbiAgICAgICAgY2hlY2suYXJndW1lbnQoIWlzTmFOKG9mZnNldCksICdTb21ldGhpbmcgd2VudCB3cm9uZyBjYWxjdWxhdGluZyB0aGUgb2Zmc2V0LicpO1xuICAgICAgICB3aGlsZSAob2Zmc2V0ICUgNCAhPT0gMCkge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB0YWJsZUZpZWxkcy5wdXNoKHtuYW1lOiAncGFkZGluZycsIHR5cGU6ICdCWVRFJywgdmFsdWU6IDB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRhYmxlIHJlY29yZHMgbmVlZCB0byBiZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuXG4gICAgcmVjb3JkRmllbGRzLnNvcnQoZnVuY3Rpb24ocjEsIHIyKSB7XG4gICAgICAgIGlmIChyMS52YWx1ZS50YWcgPiByMi52YWx1ZS50YWcpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBzZm50LmZpZWxkcyA9IHNmbnQuZmllbGRzLmNvbmNhdChyZWNvcmRGaWVsZHMpO1xuICAgIHNmbnQuZmllbGRzID0gc2ZudC5maWVsZHMuY29uY2F0KHRhYmxlRmllbGRzKTtcbiAgICByZXR1cm4gc2ZudDtcbn1cblxuLy8gR2V0IHRoZSBtZXRyaWNzIGZvciBhIGNoYXJhY3Rlci4gSWYgdGhlIHN0cmluZyBoYXMgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXJcbi8vIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBtZXRyaWNzIGZvciB0aGUgZmlyc3QgYXZhaWxhYmxlIGNoYXJhY3Rlci5cbi8vIFlvdSBjYW4gcHJvdmlkZSBvcHRpb25hbCBmYWxsYmFjayBtZXRyaWNzIGlmIG5vIGNoYXJhY3RlcnMgYXJlIGF2YWlsYWJsZS5cbmZ1bmN0aW9uIG1ldHJpY3NGb3JDaGFyKGZvbnQsIGNoYXJzLCBub3RGb3VuZE1ldHJpY3MpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBnbHlwaEluZGV4ID0gZm9udC5jaGFyVG9HbHlwaEluZGV4KGNoYXJzW2ldKTtcbiAgICAgICAgaWYgKGdseXBoSW5kZXggPiAwKSB7XG4gICAgICAgICAgICB2YXIgZ2x5cGggPSBmb250LmdseXBocy5nZXQoZ2x5cGhJbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gZ2x5cGguZ2V0TWV0cmljcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vdEZvdW5kTWV0cmljcztcbn1cblxuZnVuY3Rpb24gYXZlcmFnZSh2cykge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgc3VtICs9IHZzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBzdW0gLyB2cy5sZW5ndGg7XG59XG5cbi8vIENvbnZlcnQgdGhlIGZvbnQgb2JqZWN0IHRvIGEgU0ZOVCBkYXRhIHN0cnVjdHVyZS5cbi8vIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCB0aGUgbmVjZXNzYXJ5IHRhYmxlcyBhbmQgbWV0YWRhdGEgdG8gY3JlYXRlIGEgYmluYXJ5IE9URiBmaWxlLlxuZnVuY3Rpb24gZm9udFRvU2ZudFRhYmxlKGZvbnQpIHtcbiAgICB2YXIgeE1pbnMgPSBbXTtcbiAgICB2YXIgeU1pbnMgPSBbXTtcbiAgICB2YXIgeE1heHMgPSBbXTtcbiAgICB2YXIgeU1heHMgPSBbXTtcbiAgICB2YXIgYWR2YW5jZVdpZHRocyA9IFtdO1xuICAgIHZhciBsZWZ0U2lkZUJlYXJpbmdzID0gW107XG4gICAgdmFyIHJpZ2h0U2lkZUJlYXJpbmdzID0gW107XG4gICAgdmFyIGZpcnN0Q2hhckluZGV4O1xuICAgIHZhciBsYXN0Q2hhckluZGV4ID0gMDtcbiAgICB2YXIgdWxVbmljb2RlUmFuZ2UxID0gMDtcbiAgICB2YXIgdWxVbmljb2RlUmFuZ2UyID0gMDtcbiAgICB2YXIgdWxVbmljb2RlUmFuZ2UzID0gMDtcbiAgICB2YXIgdWxVbmljb2RlUmFuZ2U0ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9udC5nbHlwaHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGdseXBoID0gZm9udC5nbHlwaHMuZ2V0KGkpO1xuICAgICAgICB2YXIgdW5pY29kZSA9IGdseXBoLnVuaWNvZGUgfCAwO1xuXG4gICAgICAgIGlmIChpc05hTihnbHlwaC5hZHZhbmNlV2lkdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dseXBoICcgKyBnbHlwaC5uYW1lICsgJyAoJyArIGkgKyAnKTogYWR2YW5jZVdpZHRoIGlzIG5vdCBhIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaXJzdENoYXJJbmRleCA+IHVuaWNvZGUgfHwgZmlyc3RDaGFySW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gaWdub3JlIC5ub3RkZWYgY2hhclxuICAgICAgICAgICAgaWYgKHVuaWNvZGUgPiAwKSB7XG4gICAgICAgICAgICAgICAgZmlyc3RDaGFySW5kZXggPSB1bmljb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhc3RDaGFySW5kZXggPCB1bmljb2RlKSB7XG4gICAgICAgICAgICBsYXN0Q2hhckluZGV4ID0gdW5pY29kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwb3NpdGlvbiA9IG9zMi5nZXRVbmljb2RlUmFuZ2UodW5pY29kZSk7XG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDMyKSB7XG4gICAgICAgICAgICB1bFVuaWNvZGVSYW5nZTEgfD0gMSA8PCBwb3NpdGlvbjtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDY0KSB7XG4gICAgICAgICAgICB1bFVuaWNvZGVSYW5nZTIgfD0gMSA8PCBwb3NpdGlvbiAtIDMyO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgOTYpIHtcbiAgICAgICAgICAgIHVsVW5pY29kZVJhbmdlMyB8PSAxIDw8IHBvc2l0aW9uIC0gNjQ7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPCAxMjMpIHtcbiAgICAgICAgICAgIHVsVW5pY29kZVJhbmdlNCB8PSAxIDw8IHBvc2l0aW9uIC0gOTY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaWNvZGUgcmFuZ2VzIGJpdHMgPiAxMjMgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNraXAgbm9uLWltcG9ydGFudCBjaGFyYWN0ZXJzLlxuICAgICAgICBpZiAoZ2x5cGgubmFtZSA9PT0gJy5ub3RkZWYnKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgIHZhciBtZXRyaWNzID0gZ2x5cGguZ2V0TWV0cmljcygpO1xuICAgICAgICB4TWlucy5wdXNoKG1ldHJpY3MueE1pbik7XG4gICAgICAgIHlNaW5zLnB1c2gobWV0cmljcy55TWluKTtcbiAgICAgICAgeE1heHMucHVzaChtZXRyaWNzLnhNYXgpO1xuICAgICAgICB5TWF4cy5wdXNoKG1ldHJpY3MueU1heCk7XG4gICAgICAgIGxlZnRTaWRlQmVhcmluZ3MucHVzaChtZXRyaWNzLmxlZnRTaWRlQmVhcmluZyk7XG4gICAgICAgIHJpZ2h0U2lkZUJlYXJpbmdzLnB1c2gobWV0cmljcy5yaWdodFNpZGVCZWFyaW5nKTtcbiAgICAgICAgYWR2YW5jZVdpZHRocy5wdXNoKGdseXBoLmFkdmFuY2VXaWR0aCk7XG4gICAgfVxuXG4gICAgdmFyIGdsb2JhbHMgPSB7XG4gICAgICAgIHhNaW46IE1hdGgubWluLmFwcGx5KG51bGwsIHhNaW5zKSxcbiAgICAgICAgeU1pbjogTWF0aC5taW4uYXBwbHkobnVsbCwgeU1pbnMpLFxuICAgICAgICB4TWF4OiBNYXRoLm1heC5hcHBseShudWxsLCB4TWF4cyksXG4gICAgICAgIHlNYXg6IE1hdGgubWF4LmFwcGx5KG51bGwsIHlNYXhzKSxcbiAgICAgICAgYWR2YW5jZVdpZHRoTWF4OiBNYXRoLm1heC5hcHBseShudWxsLCBhZHZhbmNlV2lkdGhzKSxcbiAgICAgICAgYWR2YW5jZVdpZHRoQXZnOiBhdmVyYWdlKGFkdmFuY2VXaWR0aHMpLFxuICAgICAgICBtaW5MZWZ0U2lkZUJlYXJpbmc6IE1hdGgubWluLmFwcGx5KG51bGwsIGxlZnRTaWRlQmVhcmluZ3MpLFxuICAgICAgICBtYXhMZWZ0U2lkZUJlYXJpbmc6IE1hdGgubWF4LmFwcGx5KG51bGwsIGxlZnRTaWRlQmVhcmluZ3MpLFxuICAgICAgICBtaW5SaWdodFNpZGVCZWFyaW5nOiBNYXRoLm1pbi5hcHBseShudWxsLCByaWdodFNpZGVCZWFyaW5ncylcbiAgICB9O1xuICAgIGdsb2JhbHMuYXNjZW5kZXIgPSBmb250LmFzY2VuZGVyO1xuICAgIGdsb2JhbHMuZGVzY2VuZGVyID0gZm9udC5kZXNjZW5kZXI7XG5cbiAgICB2YXIgaGVhZFRhYmxlID0gaGVhZC5tYWtlKHtcbiAgICAgICAgZmxhZ3M6IDMsIC8vIDAwMDAwMDExIChiYXNlbGluZSBmb3IgZm9udCBhdCB5PTA7IGxlZnQgc2lkZWJlYXJpbmcgcG9pbnQgYXQgeD0wKVxuICAgICAgICB1bml0c1BlckVtOiBmb250LnVuaXRzUGVyRW0sXG4gICAgICAgIHhNaW46IGdsb2JhbHMueE1pbixcbiAgICAgICAgeU1pbjogZ2xvYmFscy55TWluLFxuICAgICAgICB4TWF4OiBnbG9iYWxzLnhNYXgsXG4gICAgICAgIHlNYXg6IGdsb2JhbHMueU1heCxcbiAgICAgICAgbG93ZXN0UmVjUFBFTTogMyxcbiAgICAgICAgY3JlYXRlZFRpbWVzdGFtcDogZm9udC5jcmVhdGVkVGltZXN0YW1wXG4gICAgfSk7XG5cbiAgICB2YXIgaGhlYVRhYmxlID0gaGhlYS5tYWtlKHtcbiAgICAgICAgYXNjZW5kZXI6IGdsb2JhbHMuYXNjZW5kZXIsXG4gICAgICAgIGRlc2NlbmRlcjogZ2xvYmFscy5kZXNjZW5kZXIsXG4gICAgICAgIGFkdmFuY2VXaWR0aE1heDogZ2xvYmFscy5hZHZhbmNlV2lkdGhNYXgsXG4gICAgICAgIG1pbkxlZnRTaWRlQmVhcmluZzogZ2xvYmFscy5taW5MZWZ0U2lkZUJlYXJpbmcsXG4gICAgICAgIG1pblJpZ2h0U2lkZUJlYXJpbmc6IGdsb2JhbHMubWluUmlnaHRTaWRlQmVhcmluZyxcbiAgICAgICAgeE1heEV4dGVudDogZ2xvYmFscy5tYXhMZWZ0U2lkZUJlYXJpbmcgKyAoZ2xvYmFscy54TWF4IC0gZ2xvYmFscy54TWluKSxcbiAgICAgICAgbnVtYmVyT2ZITWV0cmljczogZm9udC5nbHlwaHMubGVuZ3RoXG4gICAgfSk7XG5cbiAgICB2YXIgbWF4cFRhYmxlID0gbWF4cC5tYWtlKGZvbnQuZ2x5cGhzLmxlbmd0aCk7XG5cbiAgICB2YXIgb3MyVGFibGUgPSBvczIubWFrZSh7XG4gICAgICAgIHhBdmdDaGFyV2lkdGg6IE1hdGgucm91bmQoZ2xvYmFscy5hZHZhbmNlV2lkdGhBdmcpLFxuICAgICAgICB1c1dlaWdodENsYXNzOiBmb250LnRhYmxlcy5vczIudXNXZWlnaHRDbGFzcyxcbiAgICAgICAgdXNXaWR0aENsYXNzOiBmb250LnRhYmxlcy5vczIudXNXaWR0aENsYXNzLFxuICAgICAgICB1c0ZpcnN0Q2hhckluZGV4OiBmaXJzdENoYXJJbmRleCxcbiAgICAgICAgdXNMYXN0Q2hhckluZGV4OiBsYXN0Q2hhckluZGV4LFxuICAgICAgICB1bFVuaWNvZGVSYW5nZTE6IHVsVW5pY29kZVJhbmdlMSxcbiAgICAgICAgdWxVbmljb2RlUmFuZ2UyOiB1bFVuaWNvZGVSYW5nZTIsXG4gICAgICAgIHVsVW5pY29kZVJhbmdlMzogdWxVbmljb2RlUmFuZ2UzLFxuICAgICAgICB1bFVuaWNvZGVSYW5nZTQ6IHVsVW5pY29kZVJhbmdlNCxcbiAgICAgICAgZnNTZWxlY3Rpb246IGZvbnQudGFibGVzLm9zMi5mc1NlbGVjdGlvbiwgLy8gUkVHVUxBUlxuICAgICAgICAvLyBTZWUgaHR0cDovL3R5cG9waGlsZS5jb20vbm9kZS8xMzA4MSBmb3IgbW9yZSBpbmZvIG9uIHZlcnRpY2FsIG1ldHJpY3MuXG4gICAgICAgIC8vIFdlIGdldCBtZXRyaWNzIGZvciB0eXBpY2FsIGNoYXJhY3RlcnMgKHN1Y2ggYXMgXCJ4XCIgZm9yIHhIZWlnaHQpLlxuICAgICAgICAvLyBXZSBwcm92aWRlIHNvbWUgZmFsbGJhY2sgY2hhcmFjdGVycyBpZiBjaGFyYWN0ZXJzIGFyZSB1bmF2YWlsYWJsZTogdGhlaXJcbiAgICAgICAgLy8gb3JkZXJpbmcgd2FzIGNob3NlbiBleHBlcmltZW50YWxseS5cbiAgICAgICAgc1R5cG9Bc2NlbmRlcjogZ2xvYmFscy5hc2NlbmRlcixcbiAgICAgICAgc1R5cG9EZXNjZW5kZXI6IGdsb2JhbHMuZGVzY2VuZGVyLFxuICAgICAgICBzVHlwb0xpbmVHYXA6IDAsXG4gICAgICAgIHVzV2luQXNjZW50OiBnbG9iYWxzLnlNYXgsXG4gICAgICAgIHVzV2luRGVzY2VudDogTWF0aC5hYnMoZ2xvYmFscy55TWluKSxcbiAgICAgICAgdWxDb2RlUGFnZVJhbmdlMTogMSwgLy8gRklYTUU6IGhhcmQtY29kZSBMYXRpbiAxIHN1cHBvcnQgZm9yIG5vd1xuICAgICAgICBzeEhlaWdodDogbWV0cmljc0ZvckNoYXIoZm9udCwgJ3h5dncnLCB7eU1heDogTWF0aC5yb3VuZChnbG9iYWxzLmFzY2VuZGVyIC8gMil9KS55TWF4LFxuICAgICAgICBzQ2FwSGVpZ2h0OiBtZXRyaWNzRm9yQ2hhcihmb250LCAnSElLTEVGSk1OVFpCRFBSQUdPUVNVVldYWScsIGdsb2JhbHMpLnlNYXgsXG4gICAgICAgIHVzRGVmYXVsdENoYXI6IGZvbnQuaGFzQ2hhcignICcpID8gMzIgOiAwLCAvLyBVc2Ugc3BhY2UgYXMgdGhlIGRlZmF1bHQgY2hhcmFjdGVyLCBpZiBhdmFpbGFibGUuXG4gICAgICAgIHVzQnJlYWtDaGFyOiBmb250Lmhhc0NoYXIoJyAnKSA/IDMyIDogMCAvLyBVc2Ugc3BhY2UgYXMgdGhlIGJyZWFrIGNoYXJhY3RlciwgaWYgYXZhaWxhYmxlLlxuICAgIH0pO1xuXG4gICAgdmFyIGhtdHhUYWJsZSA9IGhtdHgubWFrZShmb250LmdseXBocyk7XG4gICAgdmFyIGNtYXBUYWJsZSA9IGNtYXAubWFrZShmb250LmdseXBocyk7XG5cbiAgICB2YXIgZW5nbGlzaEZhbWlseU5hbWUgPSBmb250LmdldEVuZ2xpc2hOYW1lKCdmb250RmFtaWx5Jyk7XG4gICAgdmFyIGVuZ2xpc2hTdHlsZU5hbWUgPSBmb250LmdldEVuZ2xpc2hOYW1lKCdmb250U3ViZmFtaWx5Jyk7XG4gICAgdmFyIGVuZ2xpc2hGdWxsTmFtZSA9IGVuZ2xpc2hGYW1pbHlOYW1lICsgJyAnICsgZW5nbGlzaFN0eWxlTmFtZTtcbiAgICB2YXIgcG9zdFNjcmlwdE5hbWUgPSBmb250LmdldEVuZ2xpc2hOYW1lKCdwb3N0U2NyaXB0TmFtZScpO1xuICAgIGlmICghcG9zdFNjcmlwdE5hbWUpIHtcbiAgICAgICAgcG9zdFNjcmlwdE5hbWUgPSBlbmdsaXNoRmFtaWx5TmFtZS5yZXBsYWNlKC9cXHMvZywgJycpICsgJy0nICsgZW5nbGlzaFN0eWxlTmFtZTtcbiAgICB9XG5cbiAgICB2YXIgbmFtZXMgPSB7fTtcbiAgICBmb3IgKHZhciBuIGluIGZvbnQubmFtZXMpIHtcbiAgICAgICAgbmFtZXNbbl0gPSBmb250Lm5hbWVzW25dO1xuICAgIH1cblxuICAgIGlmICghbmFtZXMudW5pcXVlSUQpIHtcbiAgICAgICAgbmFtZXMudW5pcXVlSUQgPSB7ZW46IGZvbnQuZ2V0RW5nbGlzaE5hbWUoJ21hbnVmYWN0dXJlcicpICsgJzonICsgZW5nbGlzaEZ1bGxOYW1lfTtcbiAgICB9XG5cbiAgICBpZiAoIW5hbWVzLnBvc3RTY3JpcHROYW1lKSB7XG4gICAgICAgIG5hbWVzLnBvc3RTY3JpcHROYW1lID0ge2VuOiBwb3N0U2NyaXB0TmFtZX07XG4gICAgfVxuXG4gICAgaWYgKCFuYW1lcy5wcmVmZXJyZWRGYW1pbHkpIHtcbiAgICAgICAgbmFtZXMucHJlZmVycmVkRmFtaWx5ID0gZm9udC5uYW1lcy5mb250RmFtaWx5O1xuICAgIH1cblxuICAgIGlmICghbmFtZXMucHJlZmVycmVkU3ViZmFtaWx5KSB7XG4gICAgICAgIG5hbWVzLnByZWZlcnJlZFN1YmZhbWlseSA9IGZvbnQubmFtZXMuZm9udFN1YmZhbWlseTtcbiAgICB9XG5cbiAgICB2YXIgbGFuZ3VhZ2VUYWdzID0gW107XG4gICAgdmFyIG5hbWVUYWJsZSA9IF9uYW1lLm1ha2UobmFtZXMsIGxhbmd1YWdlVGFncyk7XG4gICAgdmFyIGx0YWdUYWJsZSA9IChsYW5ndWFnZVRhZ3MubGVuZ3RoID4gMCA/IGx0YWcubWFrZShsYW5ndWFnZVRhZ3MpIDogdW5kZWZpbmVkKTtcblxuICAgIHZhciBwb3N0VGFibGUgPSBwb3N0Lm1ha2UoKTtcbiAgICB2YXIgY2ZmVGFibGUgPSBjZmYubWFrZShmb250LmdseXBocywge1xuICAgICAgICB2ZXJzaW9uOiBmb250LmdldEVuZ2xpc2hOYW1lKCd2ZXJzaW9uJyksXG4gICAgICAgIGZ1bGxOYW1lOiBlbmdsaXNoRnVsbE5hbWUsXG4gICAgICAgIGZhbWlseU5hbWU6IGVuZ2xpc2hGYW1pbHlOYW1lLFxuICAgICAgICB3ZWlnaHROYW1lOiBlbmdsaXNoU3R5bGVOYW1lLFxuICAgICAgICBwb3N0U2NyaXB0TmFtZTogcG9zdFNjcmlwdE5hbWUsXG4gICAgICAgIHVuaXRzUGVyRW06IGZvbnQudW5pdHNQZXJFbSxcbiAgICAgICAgZm9udEJCb3g6IFswLCBnbG9iYWxzLnlNaW4sIGdsb2JhbHMuYXNjZW5kZXIsIGdsb2JhbHMuYWR2YW5jZVdpZHRoTWF4XVxuICAgIH0pO1xuXG4gICAgdmFyIG1ldGFUYWJsZSA9IChmb250Lm1ldGFzICYmIE9iamVjdC5rZXlzKGZvbnQubWV0YXMpLmxlbmd0aCA+IDApID8gbWV0YS5tYWtlKGZvbnQubWV0YXMpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gVGhlIG9yZGVyIGRvZXMgbm90IG1hdHRlciBiZWNhdXNlIG1ha2VTZm50VGFibGUoKSB3aWxsIHNvcnQgdGhlbS5cbiAgICB2YXIgdGFibGVzID0gW2hlYWRUYWJsZSwgaGhlYVRhYmxlLCBtYXhwVGFibGUsIG9zMlRhYmxlLCBuYW1lVGFibGUsIGNtYXBUYWJsZSwgcG9zdFRhYmxlLCBjZmZUYWJsZSwgaG10eFRhYmxlXTtcbiAgICBpZiAobHRhZ1RhYmxlKSB7XG4gICAgICAgIHRhYmxlcy5wdXNoKGx0YWdUYWJsZSk7XG4gICAgfVxuICAgIC8vIE9wdGlvbmFsIHRhYmxlc1xuICAgIGlmIChmb250LnRhYmxlcy5nc3ViKSB7XG4gICAgICAgIHRhYmxlcy5wdXNoKGdzdWIubWFrZShmb250LnRhYmxlcy5nc3ViKSk7XG4gICAgfVxuICAgIGlmIChtZXRhVGFibGUpIHtcbiAgICAgICAgdGFibGVzLnB1c2gobWV0YVRhYmxlKTtcbiAgICB9XG5cbiAgICB2YXIgc2ZudFRhYmxlID0gbWFrZVNmbnRUYWJsZSh0YWJsZXMpO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgZm9udCdzIGNoZWNrU3VtIGFuZCBzdG9yZSBpdCBpbiBoZWFkLmNoZWNrU3VtQWRqdXN0bWVudC5cbiAgICB2YXIgYnl0ZXMgPSBzZm50VGFibGUuZW5jb2RlKCk7XG4gICAgdmFyIGNoZWNrU3VtID0gY29tcHV0ZUNoZWNrU3VtKGJ5dGVzKTtcbiAgICB2YXIgdGFibGVGaWVsZHMgPSBzZm50VGFibGUuZmllbGRzO1xuICAgIHZhciBjaGVja1N1bUFkanVzdGVkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgdGFibGVGaWVsZHMubGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgICAgICBpZiAodGFibGVGaWVsZHNbaSQxXS5uYW1lID09PSAnaGVhZCB0YWJsZScpIHtcbiAgICAgICAgICAgIHRhYmxlRmllbGRzW2kkMV0udmFsdWUuY2hlY2tTdW1BZGp1c3RtZW50ID0gMHhCMUIwQUZCQSAtIGNoZWNrU3VtO1xuICAgICAgICAgICAgY2hlY2tTdW1BZGp1c3RlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghY2hlY2tTdW1BZGp1c3RlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGhlYWQgdGFibGUgd2l0aCBjaGVja1N1bSB0byBhZGp1c3QuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNmbnRUYWJsZTtcbn1cblxudmFyIHNmbnQgPSB7IG1ha2U6IG1ha2VTZm50VGFibGUsIGZvbnRUb1RhYmxlOiBmb250VG9TZm50VGFibGUsIGNvbXB1dGVDaGVja1N1bTogY29tcHV0ZUNoZWNrU3VtIH07XG5cbi8vIFRoZSBMYXlvdXQgb2JqZWN0IGlzIHRoZSBwcm90b3R5cGUgb2YgU3Vic3RpdHV0aW9uIG9iamVjdHMsIGFuZCBwcm92aWRlc1xuLy8gdXRpbGl0eSBtZXRob2RzIHRvIG1hbmlwdWxhdGUgY29tbW9uIGxheW91dCB0YWJsZXMgKEdQT1MsIEdTVUIsIEdERUYuLi4pXG5cbmZ1bmN0aW9uIHNlYXJjaFRhZyhhcnIsIHRhZykge1xuICAgIC8qIGpzaGludCBiaXR3aXNlOiBmYWxzZSAqL1xuICAgIHZhciBpbWluID0gMDtcbiAgICB2YXIgaW1heCA9IGFyci5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChpbWluIDw9IGltYXgpIHtcbiAgICAgICAgdmFyIGltaWQgPSAoaW1pbiArIGltYXgpID4+PiAxO1xuICAgICAgICB2YXIgdmFsID0gYXJyW2ltaWRdLnRhZztcbiAgICAgICAgaWYgKHZhbCA9PT0gdGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW1pZDtcbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPCB0YWcpIHtcbiAgICAgICAgICAgIGltaW4gPSBpbWlkICsgMTtcbiAgICAgICAgfSBlbHNlIHsgaW1heCA9IGltaWQgLSAxOyB9XG4gICAgfVxuICAgIC8vIE5vdCBmb3VuZDogcmV0dXJuIC0xLWluc2VydGlvbiBwb2ludFxuICAgIHJldHVybiAtaW1pbiAtIDE7XG59XG5cbmZ1bmN0aW9uIGJpblNlYXJjaChhcnIsIHZhbHVlKSB7XG4gICAgLyoganNoaW50IGJpdHdpc2U6IGZhbHNlICovXG4gICAgdmFyIGltaW4gPSAwO1xuICAgIHZhciBpbWF4ID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKGltaW4gPD0gaW1heCkge1xuICAgICAgICB2YXIgaW1pZCA9IChpbWluICsgaW1heCkgPj4+IDE7XG4gICAgICAgIHZhciB2YWwgPSBhcnJbaW1pZF07XG4gICAgICAgIGlmICh2YWwgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gaW1pZDtcbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPCB2YWx1ZSkge1xuICAgICAgICAgICAgaW1pbiA9IGltaWQgKyAxO1xuICAgICAgICB9IGVsc2UgeyBpbWF4ID0gaW1pZCAtIDE7IH1cbiAgICB9XG4gICAgLy8gTm90IGZvdW5kOiByZXR1cm4gLTEtaW5zZXJ0aW9uIHBvaW50XG4gICAgcmV0dXJuIC1pbWluIC0gMTtcbn1cblxuLyoqXG4gKiBAZXhwb3J0cyBvcGVudHlwZS5MYXlvdXRcbiAqIEBjbGFzc1xuICovXG5mdW5jdGlvbiBMYXlvdXQoZm9udCwgdGFibGVOYW1lKSB7XG4gICAgdGhpcy5mb250ID0gZm9udDtcbiAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTtcbn1cblxuTGF5b3V0LnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIEJpbmFyeSBzZWFyY2ggYW4gb2JqZWN0IGJ5IFwidGFnXCIgcHJvcGVydHlcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZnVuY3Rpb24gc2VhcmNoVGFnXG4gICAgICogQG1lbWJlcm9mIG9wZW50eXBlLkxheW91dFxuICAgICAqIEBwYXJhbSAge0FycmF5fSBhcnJcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHRhZ1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBzZWFyY2hUYWc6IHNlYXJjaFRhZyxcblxuICAgIC8qKlxuICAgICAqIEJpbmFyeSBzZWFyY2ggaW4gYSBsaXN0IG9mIG51bWJlcnNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZnVuY3Rpb24gYmluU2VhcmNoXG4gICAgICogQG1lbWJlcm9mIG9wZW50eXBlLkxheW91dFxuICAgICAqIEBwYXJhbSAge0FycmF5fSBhcnJcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHZhbHVlXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGJpblNlYXJjaDogYmluU2VhcmNoLFxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yIGNyZWF0ZSB0aGUgTGF5b3V0IHRhYmxlIChHU1VCLCBHUE9TIGV0YykuXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbn0gY3JlYXRlIC0gV2hldGhlciB0byBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIEdTVUIgb3IgR1BPUyB0YWJsZS5cbiAgICAgKi9cbiAgICBnZXRUYWJsZTogZnVuY3Rpb24oY3JlYXRlKSB7XG4gICAgICAgIHZhciBsYXlvdXQgPSB0aGlzLmZvbnQudGFibGVzW3RoaXMudGFibGVOYW1lXTtcbiAgICAgICAgaWYgKCFsYXlvdXQgJiYgY3JlYXRlKSB7XG4gICAgICAgICAgICBsYXlvdXQgPSB0aGlzLmZvbnQudGFibGVzW3RoaXMudGFibGVOYW1lXSA9IHRoaXMuY3JlYXRlRGVmYXVsdFRhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgc2NyaXB0cyBpbiB0aGUgc3Vic3RpdHV0aW9uIHRhYmxlLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm4ge0FycmF5fVxuICAgICAqL1xuICAgIGdldFNjcmlwdE5hbWVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGxheW91dCA9IHRoaXMuZ2V0VGFibGUoKTtcbiAgICAgICAgaWYgKCFsYXlvdXQpIHsgcmV0dXJuIFtdOyB9XG4gICAgICAgIHJldHVybiBsYXlvdXQuc2NyaXB0cy5tYXAoZnVuY3Rpb24oc2NyaXB0KSB7XG4gICAgICAgICAgICByZXR1cm4gc2NyaXB0LnRhZztcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJlc3QgYmV0IGZvciBhIHNjcmlwdCBuYW1lLlxuICAgICAqIFJldHVybnMgJ0RGTFQnIGlmIGl0IGV4aXN0cy5cbiAgICAgKiBJZiBub3QsIHJldHVybnMgJ2xhdG4nIGlmIGl0IGV4aXN0cy5cbiAgICAgKiBJZiBuZWl0aGVyIGV4aXN0LCByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBnZXREZWZhdWx0U2NyaXB0TmFtZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsYXlvdXQgPSB0aGlzLmdldFRhYmxlKCk7XG4gICAgICAgIGlmICghbGF5b3V0KSB7IHJldHVybjsgfVxuICAgICAgICB2YXIgaGFzTGF0biA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dC5zY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IGxheW91dC5zY3JpcHRzW2ldLnRhZztcbiAgICAgICAgICAgIGlmIChuYW1lID09PSAnREZMVCcpIHsgcmV0dXJuIG5hbWU7IH1cbiAgICAgICAgICAgIGlmIChuYW1lID09PSAnbGF0bicpIHsgaGFzTGF0biA9IHRydWU7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzTGF0bikgeyByZXR1cm4gJ2xhdG4nOyB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIExhbmdTeXNSZWNvcmRzIGluIHRoZSBnaXZlbiBzY3JpcHQuXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzY3JpcHQ9J0RGTFQnXVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY3JlYXRlIC0gZm9yY2VzIHRoZSBjcmVhdGlvbiBvZiB0aGlzIHNjcmlwdCB0YWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IHdpdGggdGFnIGFuZCBzY3JpcHQgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBnZXRTY3JpcHRUYWJsZTogZnVuY3Rpb24oc2NyaXB0LCBjcmVhdGUpIHtcbiAgICAgICAgdmFyIGxheW91dCA9IHRoaXMuZ2V0VGFibGUoY3JlYXRlKTtcbiAgICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICAgICAgc2NyaXB0ID0gc2NyaXB0IHx8ICdERkxUJztcbiAgICAgICAgICAgIHZhciBzY3JpcHRzID0gbGF5b3V0LnNjcmlwdHM7XG4gICAgICAgICAgICB2YXIgcG9zID0gc2VhcmNoVGFnKGxheW91dC5zY3JpcHRzLCBzY3JpcHQpO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdHNbcG9zXS5zY3JpcHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciBzY3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRhZzogc2NyaXB0LFxuICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRMYW5nU3lzOiB7cmVzZXJ2ZWQ6IDAsIHJlcUZlYXR1cmVJbmRleDogMHhmZmZmLCBmZWF0dXJlSW5kZXhlczogW119LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ1N5c1JlY29yZHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHNjcmlwdHMuc3BsaWNlKC0xIC0gcG9zLCAwLCBzY3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzY3Iuc2NyaXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsYW5ndWFnZSBzeXN0ZW0gdGFibGVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NjcmlwdD0nREZMVCddXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtsYW5ndWFnZT0nZGxmdCddXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjcmVhdGUgLSBmb3JjZXMgdGhlIGNyZWF0aW9uIG9mIHRoaXMgbGFuZ1N5c1RhYmxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldExhbmdTeXNUYWJsZTogZnVuY3Rpb24oc2NyaXB0LCBsYW5ndWFnZSwgY3JlYXRlKSB7XG4gICAgICAgIHZhciBzY3JpcHRUYWJsZSA9IHRoaXMuZ2V0U2NyaXB0VGFibGUoc2NyaXB0LCBjcmVhdGUpO1xuICAgICAgICBpZiAoc2NyaXB0VGFibGUpIHtcbiAgICAgICAgICAgIGlmICghbGFuZ3VhZ2UgfHwgbGFuZ3VhZ2UgPT09ICdkZmx0JyB8fCBsYW5ndWFnZSA9PT0gJ0RGTFQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdFRhYmxlLmRlZmF1bHRMYW5nU3lzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBvcyA9IHNlYXJjaFRhZyhzY3JpcHRUYWJsZS5sYW5nU3lzUmVjb3JkcywgbGFuZ3VhZ2UpO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdFRhYmxlLmxhbmdTeXNSZWNvcmRzW3Bvc10ubGFuZ1N5cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhbmdTeXNSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRhZzogbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGxhbmdTeXM6IHtyZXNlcnZlZDogMCwgcmVxRmVhdHVyZUluZGV4OiAweGZmZmYsIGZlYXR1cmVJbmRleGVzOiBbXX1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHNjcmlwdFRhYmxlLmxhbmdTeXNSZWNvcmRzLnNwbGljZSgtMSAtIHBvcywgMCwgbGFuZ1N5c1JlY29yZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhbmdTeXNSZWNvcmQubGFuZ1N5cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyBmZWF0dXJlIHRhYmxlLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2NyaXB0PSdERkxUJ11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhbmd1YWdlPSdkbGZ0J11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmVhdHVyZSAtIE9uZSBvZiB0aGUgY29kZXMgbGlzdGVkIGF0IGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PVFNQRUMvZmVhdHVyZWxpc3QuaHRtXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjcmVhdGUgLSBmb3JjZXMgdGhlIGNyZWF0aW9uIG9mIHRoZSBmZWF0dXJlIHRhYmxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldEZlYXR1cmVUYWJsZTogZnVuY3Rpb24oc2NyaXB0LCBsYW5ndWFnZSwgZmVhdHVyZSwgY3JlYXRlKSB7XG4gICAgICAgIHZhciBsYW5nU3lzVGFibGUgPSB0aGlzLmdldExhbmdTeXNUYWJsZShzY3JpcHQsIGxhbmd1YWdlLCBjcmVhdGUpO1xuICAgICAgICBpZiAobGFuZ1N5c1RhYmxlKSB7XG4gICAgICAgICAgICB2YXIgZmVhdHVyZVJlY29yZDtcbiAgICAgICAgICAgIHZhciBmZWF0SW5kZXhlcyA9IGxhbmdTeXNUYWJsZS5mZWF0dXJlSW5kZXhlcztcbiAgICAgICAgICAgIHZhciBhbGxGZWF0dXJlcyA9IHRoaXMuZm9udC50YWJsZXNbdGhpcy50YWJsZU5hbWVdLmZlYXR1cmVzO1xuICAgICAgICAgICAgLy8gVGhlIEZlYXR1cmVJbmRleCBhcnJheSBvZiBpbmRpY2VzIGlzIGluIGFyYml0cmFyeSBvcmRlcixcbiAgICAgICAgICAgIC8vIGV2ZW4gaWYgYWxsRmVhdHVyZXMgaXMgc29ydGVkIGFscGhhYmV0aWNhbGx5IGJ5IGZlYXR1cmUgdGFnLlxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0SW5kZXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVSZWNvcmQgPSBhbGxGZWF0dXJlc1tmZWF0SW5kZXhlc1tpXV07XG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVSZWNvcmQudGFnID09PSBmZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmZWF0dXJlUmVjb3JkLmZlYXR1cmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGFsbEZlYXR1cmVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAvLyBBdXRvbWF0aWMgb3JkZXJpbmcgb2YgZmVhdHVyZXMgd291bGQgcmVxdWlyZSB0byBzaGlmdCBmZWF0dXJlIGluZGV4ZXMgaW4gdGhlIHNjcmlwdCBsaXN0LlxuICAgICAgICAgICAgICAgIGNoZWNrLmFzc2VydChpbmRleCA9PT0gMCB8fCBmZWF0dXJlID49IGFsbEZlYXR1cmVzW2luZGV4IC0gMV0udGFnLCAnRmVhdHVyZXMgbXVzdCBiZSBhZGRlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIuJyk7XG4gICAgICAgICAgICAgICAgZmVhdHVyZVJlY29yZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnOiBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiB7IHBhcmFtczogMCwgbG9va3VwTGlzdEluZGV4ZXM6IFtdIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFsbEZlYXR1cmVzLnB1c2goZmVhdHVyZVJlY29yZCk7XG4gICAgICAgICAgICAgICAgZmVhdEluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVSZWNvcmQuZmVhdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxvb2t1cCB0YWJsZXMgb2YgYSBnaXZlbiB0eXBlIGZvciBhIHNjcmlwdC9sYW5ndWFnZS9mZWF0dXJlLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2NyaXB0PSdERkxUJ11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhbmd1YWdlPSdkbGZ0J11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmVhdHVyZSAtIDQtbGV0dGVyIGZlYXR1cmUgY29kZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb29rdXBUeXBlIC0gMSB0byA4XG4gICAgICogQHBhcmFtIHtib29sZWFufSBjcmVhdGUgLSBmb3JjZXMgdGhlIGNyZWF0aW9uIG9mIHRoZSBsb29rdXAgdGFibGUgaWYgaXQgZG9lc24ndCBleGlzdCwgd2l0aCBubyBzdWJ0YWJsZXMuXG4gICAgICogQHJldHVybiB7T2JqZWN0W119XG4gICAgICovXG4gICAgZ2V0TG9va3VwVGFibGVzOiBmdW5jdGlvbihzY3JpcHQsIGxhbmd1YWdlLCBmZWF0dXJlLCBsb29rdXBUeXBlLCBjcmVhdGUpIHtcbiAgICAgICAgdmFyIGZlYXR1cmVUYWJsZSA9IHRoaXMuZ2V0RmVhdHVyZVRhYmxlKHNjcmlwdCwgbGFuZ3VhZ2UsIGZlYXR1cmUsIGNyZWF0ZSk7XG4gICAgICAgIHZhciB0YWJsZXMgPSBbXTtcbiAgICAgICAgaWYgKGZlYXR1cmVUYWJsZSkge1xuICAgICAgICAgICAgdmFyIGxvb2t1cFRhYmxlO1xuICAgICAgICAgICAgdmFyIGxvb2t1cExpc3RJbmRleGVzID0gZmVhdHVyZVRhYmxlLmxvb2t1cExpc3RJbmRleGVzO1xuICAgICAgICAgICAgdmFyIGFsbExvb2t1cHMgPSB0aGlzLmZvbnQudGFibGVzW3RoaXMudGFibGVOYW1lXS5sb29rdXBzO1xuICAgICAgICAgICAgLy8gbG9va3VwTGlzdEluZGV4ZXMgYXJlIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIHNvIHVzZSBuYWl2ZSBzZWFyY2guXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvb2t1cExpc3RJbmRleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbG9va3VwVGFibGUgPSBhbGxMb29rdXBzW2xvb2t1cExpc3RJbmRleGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAobG9va3VwVGFibGUubG9va3VwVHlwZSA9PT0gbG9va3VwVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICB0YWJsZXMucHVzaChsb29rdXBUYWJsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRhYmxlcy5sZW5ndGggPT09IDAgJiYgY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgbG9va3VwVGFibGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxvb2t1cFR5cGU6IGxvb2t1cFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGxvb2t1cEZsYWc6IDAsXG4gICAgICAgICAgICAgICAgICAgIHN1YnRhYmxlczogW10sXG4gICAgICAgICAgICAgICAgICAgIG1hcmtGaWx0ZXJpbmdTZXQ6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gYWxsTG9va3Vwcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYWxsTG9va3Vwcy5wdXNoKGxvb2t1cFRhYmxlKTtcbiAgICAgICAgICAgICAgICBsb29rdXBMaXN0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2xvb2t1cFRhYmxlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFibGVzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGdseXBoIGluZGV4ZXMgb2YgYSBjb3ZlcmFnZSB0YWJsZS5cbiAgICAgKiBGb3JtYXQgMTogdGhlIGxpc3QgaXMgc3RvcmVkIHJhd1xuICAgICAqIEZvcm1hdCAyOiBjb21wYWN0IGxpc3QgYXMgcmFuZ2UgcmVjb3Jkcy5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGNvdmVyYWdlVGFibGVcbiAgICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICAgKi9cbiAgICBleHBhbmRDb3ZlcmFnZTogZnVuY3Rpb24oY292ZXJhZ2VUYWJsZSkge1xuICAgICAgICBpZiAoY292ZXJhZ2VUYWJsZS5mb3JtYXQgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3ZlcmFnZVRhYmxlLmdseXBocztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBnbHlwaHMgPSBbXTtcbiAgICAgICAgICAgIHZhciByYW5nZXMgPSBjb3ZlcmFnZVRhYmxlLnJhbmdlcztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IHJhbmdlLnN0YXJ0O1xuICAgICAgICAgICAgICAgIHZhciBlbmQgPSByYW5nZS5lbmQ7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IHN0YXJ0OyBqIDw9IGVuZDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGdseXBocy5wdXNoKGopO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnbHlwaHM7XG4gICAgICAgIH1cbiAgICB9XG5cbn07XG5cbi8vIFRoZSBTdWJzdGl0dXRpb24gb2JqZWN0IHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyB0byBtYW5pcHVsYXRlXG4vLyB0aGUgR1NVQiBzdWJzdGl0dXRpb24gdGFibGUuXG5cbi8qKlxuICogQGV4cG9ydHMgb3BlbnR5cGUuU3Vic3RpdHV0aW9uXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIG9wZW50eXBlLkxheW91dFxuICogQHBhcmFtIHtvcGVudHlwZS5Gb250fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFN1YnN0aXR1dGlvbihmb250KSB7XG4gICAgTGF5b3V0LmNhbGwodGhpcywgZm9udCwgJ2dzdWInKTtcbn1cblxuLy8gQ2hlY2sgaWYgMiBhcnJheXMgb2YgcHJpbWl0aXZlcyBhcmUgZXF1YWwuXG5mdW5jdGlvbiBhcnJheXNFcXVhbChhcjEsIGFyMikge1xuICAgIHZhciBuID0gYXIxLmxlbmd0aDtcbiAgICBpZiAobiAhPT0gYXIyLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBpZiAoYXIxW2ldICE9PSBhcjJbaV0pIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBGaW5kIHRoZSBmaXJzdCBzdWJ0YWJsZSBvZiBhIGxvb2t1cCB0YWJsZSBpbiBhIHBhcnRpY3VsYXIgZm9ybWF0LlxuZnVuY3Rpb24gZ2V0U3Vic3RGb3JtYXQobG9va3VwVGFibGUsIGZvcm1hdCwgZGVmYXVsdFN1YnRhYmxlKSB7XG4gICAgdmFyIHN1YnRhYmxlcyA9IGxvb2t1cFRhYmxlLnN1YnRhYmxlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YnRhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3VidGFibGUgPSBzdWJ0YWJsZXNbaV07XG4gICAgICAgIGlmIChzdWJ0YWJsZS5zdWJzdEZvcm1hdCA9PT0gZm9ybWF0KSB7XG4gICAgICAgICAgICByZXR1cm4gc3VidGFibGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlZmF1bHRTdWJ0YWJsZSkge1xuICAgICAgICBzdWJ0YWJsZXMucHVzaChkZWZhdWx0U3VidGFibGUpO1xuICAgICAgICByZXR1cm4gZGVmYXVsdFN1YnRhYmxlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5TdWJzdGl0dXRpb24ucHJvdG90eXBlID0gTGF5b3V0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBDcmVhdGUgYSBkZWZhdWx0IEdTVUIgdGFibGUuXG4gKiBAcmV0dXJuIHtPYmplY3R9IGdzdWIgLSBUaGUgR1NVQiB0YWJsZS5cbiAqL1xuU3Vic3RpdHV0aW9uLnByb3RvdHlwZS5jcmVhdGVEZWZhdWx0VGFibGUgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBHZW5lcmF0ZSBhIGRlZmF1bHQgZW1wdHkgR1NVQiB0YWJsZSB3aXRoIGp1c3QgYSBERkxUIHNjcmlwdCBhbmQgZGZsdCBsYW5nIHN5cy5cbiAgICByZXR1cm4ge1xuICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICBzY3JpcHRzOiBbe1xuICAgICAgICAgICAgdGFnOiAnREZMVCcsXG4gICAgICAgICAgICBzY3JpcHQ6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0TGFuZ1N5czogeyByZXNlcnZlZDogMCwgcmVxRmVhdHVyZUluZGV4OiAweGZmZmYsIGZlYXR1cmVJbmRleGVzOiBbXSB9LFxuICAgICAgICAgICAgICAgIGxhbmdTeXNSZWNvcmRzOiBbXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XSxcbiAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgICBsb29rdXBzOiBbXVxuICAgIH07XG59O1xuXG4vKipcbiAqIExpc3QgYWxsIHNpbmdsZSBzdWJzdGl0dXRpb25zIChsb29rdXAgdHlwZSAxKSBmb3IgYSBnaXZlbiBzY3JpcHQsIGxhbmd1YWdlLCBhbmQgZmVhdHVyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2NyaXB0PSdERkxUJ11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFuZ3VhZ2U9J2RmbHQnXVxuICogQHBhcmFtIHtzdHJpbmd9IGZlYXR1cmUgLSA0LWNoYXJhY3RlciBmZWF0dXJlIG5hbWUgKCdhYWx0JywgJ3NhbHQnLCAnc3MwMScuLi4pXG4gKiBAcmV0dXJuIHtBcnJheX0gc3Vic3RpdHV0aW9ucyAtIFRoZSBsaXN0IG9mIHN1YnN0aXR1dGlvbnMuXG4gKi9cblN1YnN0aXR1dGlvbi5wcm90b3R5cGUuZ2V0U2luZ2xlID0gZnVuY3Rpb24oZmVhdHVyZSwgc2NyaXB0LCBsYW5ndWFnZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIHN1YnN0aXR1dGlvbnMgPSBbXTtcbiAgICB2YXIgbG9va3VwVGFibGVzID0gdGhpcy5nZXRMb29rdXBUYWJsZXMoc2NyaXB0LCBsYW5ndWFnZSwgZmVhdHVyZSwgMSk7XG4gICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbG9va3VwVGFibGVzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgdmFyIHN1YnRhYmxlcyA9IGxvb2t1cFRhYmxlc1tpZHhdLnN1YnRhYmxlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJ0YWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdWJ0YWJsZSA9IHN1YnRhYmxlc1tpXTtcbiAgICAgICAgICAgIHZhciBnbHlwaHMgPSB0aGlzJDEuZXhwYW5kQ292ZXJhZ2Uoc3VidGFibGUuY292ZXJhZ2UpO1xuICAgICAgICAgICAgdmFyIGogPSAodm9pZCAwKTtcbiAgICAgICAgICAgIGlmIChzdWJ0YWJsZS5zdWJzdEZvcm1hdCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IHN1YnRhYmxlLmRlbHRhR2x5cGhJZDtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2x5cGhzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0aW9ucy5wdXNoKHsgc3ViOiBnbHlwaCwgYnk6IGdseXBoICsgZGVsdGEgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgc3Vic3RpdHV0ZSA9IHN1YnRhYmxlLnN1YnN0aXR1dGU7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdseXBocy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBzdWJzdGl0dXRpb25zLnB1c2goeyBzdWI6IGdseXBoc1tqXSwgYnk6IHN1YnN0aXR1dGVbal0gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdWJzdGl0dXRpb25zO1xufTtcblxuLyoqXG4gKiBMaXN0IGFsbCBhbHRlcm5hdGVzIChsb29rdXAgdHlwZSAzKSBmb3IgYSBnaXZlbiBzY3JpcHQsIGxhbmd1YWdlLCBhbmQgZmVhdHVyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2NyaXB0PSdERkxUJ11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFuZ3VhZ2U9J2RmbHQnXVxuICogQHBhcmFtIHtzdHJpbmd9IGZlYXR1cmUgLSA0LWNoYXJhY3RlciBmZWF0dXJlIG5hbWUgKCdhYWx0JywgJ3NhbHQnLi4uKVxuICogQHJldHVybiB7QXJyYXl9IGFsdGVybmF0ZXMgLSBUaGUgbGlzdCBvZiBhbHRlcm5hdGVzXG4gKi9cblN1YnN0aXR1dGlvbi5wcm90b3R5cGUuZ2V0QWx0ZXJuYXRlcyA9IGZ1bmN0aW9uKGZlYXR1cmUsIHNjcmlwdCwgbGFuZ3VhZ2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBhbHRlcm5hdGVzID0gW107XG4gICAgdmFyIGxvb2t1cFRhYmxlcyA9IHRoaXMuZ2V0TG9va3VwVGFibGVzKHNjcmlwdCwgbGFuZ3VhZ2UsIGZlYXR1cmUsIDMpO1xuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxvb2t1cFRhYmxlcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIHZhciBzdWJ0YWJsZXMgPSBsb29rdXBUYWJsZXNbaWR4XS5zdWJ0YWJsZXM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VidGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3VidGFibGUgPSBzdWJ0YWJsZXNbaV07XG4gICAgICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcyQxLmV4cGFuZENvdmVyYWdlKHN1YnRhYmxlLmNvdmVyYWdlKTtcbiAgICAgICAgICAgIHZhciBhbHRlcm5hdGVTZXRzID0gc3VidGFibGUuYWx0ZXJuYXRlU2V0cztcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ2x5cGhzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgYWx0ZXJuYXRlcy5wdXNoKHsgc3ViOiBnbHlwaHNbal0sIGJ5OiBhbHRlcm5hdGVTZXRzW2pdIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbHRlcm5hdGVzO1xufTtcblxuLyoqXG4gKiBMaXN0IGFsbCBsaWdhdHVyZXMgKGxvb2t1cCB0eXBlIDQpIGZvciBhIGdpdmVuIHNjcmlwdCwgbGFuZ3VhZ2UsIGFuZCBmZWF0dXJlLlxuICogVGhlIHJlc3VsdCBpcyBhbiBhcnJheSBvZiBsaWdhdHVyZSBvYmplY3RzIGxpa2UgeyBzdWI6IFtpZHNdLCBieTogaWQgfVxuICogQHBhcmFtIHtzdHJpbmd9IGZlYXR1cmUgLSA0LWxldHRlciBmZWF0dXJlIG5hbWUgKCdsaWdhJywgJ3JsaWcnLCAnZGxpZycuLi4pXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NjcmlwdD0nREZMVCddXG4gKiBAcGFyYW0ge3N0cmluZ30gW2xhbmd1YWdlPSdkZmx0J11cbiAqIEByZXR1cm4ge0FycmF5fSBsaWdhdHVyZXMgLSBUaGUgbGlzdCBvZiBsaWdhdHVyZXMuXG4gKi9cblN1YnN0aXR1dGlvbi5wcm90b3R5cGUuZ2V0TGlnYXR1cmVzID0gZnVuY3Rpb24oZmVhdHVyZSwgc2NyaXB0LCBsYW5ndWFnZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIGxpZ2F0dXJlcyA9IFtdO1xuICAgIHZhciBsb29rdXBUYWJsZXMgPSB0aGlzLmdldExvb2t1cFRhYmxlcyhzY3JpcHQsIGxhbmd1YWdlLCBmZWF0dXJlLCA0KTtcbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsb29rdXBUYWJsZXMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICB2YXIgc3VidGFibGVzID0gbG9va3VwVGFibGVzW2lkeF0uc3VidGFibGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YnRhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHN1YnRhYmxlID0gc3VidGFibGVzW2ldO1xuICAgICAgICAgICAgdmFyIGdseXBocyA9IHRoaXMkMS5leHBhbmRDb3ZlcmFnZShzdWJ0YWJsZS5jb3ZlcmFnZSk7XG4gICAgICAgICAgICB2YXIgbGlnYXR1cmVTZXRzID0gc3VidGFibGUubGlnYXR1cmVTZXRzO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBnbHlwaHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRHbHlwaCA9IGdseXBoc1tqXTtcbiAgICAgICAgICAgICAgICB2YXIgbGlnU2V0ID0gbGlnYXR1cmVTZXRzW2pdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbGlnU2V0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsaWcgPSBsaWdTZXRba107XG4gICAgICAgICAgICAgICAgICAgIGxpZ2F0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YjogW3N0YXJ0R2x5cGhdLmNvbmNhdChsaWcuY29tcG9uZW50cyksXG4gICAgICAgICAgICAgICAgICAgICAgICBieTogbGlnLmxpZ0dseXBoXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGlnYXR1cmVzO1xufTtcblxuLyoqXG4gKiBBZGQgb3IgbW9kaWZ5IGEgc2luZ2xlIHN1YnN0aXR1dGlvbiAobG9va3VwIHR5cGUgMSlcbiAqIEZvcm1hdCAyLCBtb3JlIGZsZXhpYmxlLCBpcyBhbHdheXMgdXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmZWF0dXJlIC0gNC1sZXR0ZXIgZmVhdHVyZSBuYW1lICgnbGlnYScsICdybGlnJywgJ2RsaWcnLi4uKVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnN0aXR1dGlvbiAtIHsgc3ViOiBpZCwgZGVsdGE6IG51bWJlciB9IGZvciBmb3JtYXQgMSBvciB7IHN1YjogaWQsIGJ5OiBpZCB9IGZvciBmb3JtYXQgMi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2NyaXB0PSdERkxUJ11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFuZ3VhZ2U9J2RmbHQnXVxuICovXG5TdWJzdGl0dXRpb24ucHJvdG90eXBlLmFkZFNpbmdsZSA9IGZ1bmN0aW9uKGZlYXR1cmUsIHN1YnN0aXR1dGlvbiwgc2NyaXB0LCBsYW5ndWFnZSkge1xuICAgIHZhciBsb29rdXBUYWJsZSA9IHRoaXMuZ2V0TG9va3VwVGFibGVzKHNjcmlwdCwgbGFuZ3VhZ2UsIGZlYXR1cmUsIDEsIHRydWUpWzBdO1xuICAgIHZhciBzdWJ0YWJsZSA9IGdldFN1YnN0Rm9ybWF0KGxvb2t1cFRhYmxlLCAyLCB7ICAgICAgICAgICAgICAgIC8vIGxvb2t1cCB0eXBlIDEgc3VidGFibGUsIGZvcm1hdCAyLCBjb3ZlcmFnZSBmb3JtYXQgMVxuICAgICAgICBzdWJzdEZvcm1hdDogMixcbiAgICAgICAgY292ZXJhZ2U6IHtmb3JtYXQ6IDEsIGdseXBoczogW119LFxuICAgICAgICBzdWJzdGl0dXRlOiBbXVxuICAgIH0pO1xuICAgIGNoZWNrLmFzc2VydChzdWJ0YWJsZS5jb3ZlcmFnZS5mb3JtYXQgPT09IDEsICdMaWdhdHVyZTogdW5hYmxlIHRvIG1vZGlmeSBjb3ZlcmFnZSB0YWJsZSBmb3JtYXQgJyArIHN1YnRhYmxlLmNvdmVyYWdlLmZvcm1hdCk7XG4gICAgdmFyIGNvdmVyYWdlR2x5cGggPSBzdWJzdGl0dXRpb24uc3ViO1xuICAgIHZhciBwb3MgPSB0aGlzLmJpblNlYXJjaChzdWJ0YWJsZS5jb3ZlcmFnZS5nbHlwaHMsIGNvdmVyYWdlR2x5cGgpO1xuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICAgIHBvcyA9IC0xIC0gcG9zO1xuICAgICAgICBzdWJ0YWJsZS5jb3ZlcmFnZS5nbHlwaHMuc3BsaWNlKHBvcywgMCwgY292ZXJhZ2VHbHlwaCk7XG4gICAgICAgIHN1YnRhYmxlLnN1YnN0aXR1dGUuc3BsaWNlKHBvcywgMCwgMCk7XG4gICAgfVxuICAgIHN1YnRhYmxlLnN1YnN0aXR1dGVbcG9zXSA9IHN1YnN0aXR1dGlvbi5ieTtcbn07XG5cbi8qKlxuICogQWRkIG9yIG1vZGlmeSBhbiBhbHRlcm5hdGUgc3Vic3RpdHV0aW9uIChsb29rdXAgdHlwZSAxKVxuICogQHBhcmFtIHtzdHJpbmd9IGZlYXR1cmUgLSA0LWxldHRlciBmZWF0dXJlIG5hbWUgKCdsaWdhJywgJ3JsaWcnLCAnZGxpZycuLi4pXG4gKiBAcGFyYW0ge09iamVjdH0gc3Vic3RpdHV0aW9uIC0geyBzdWI6IGlkLCBieTogW2lkc10gfVxuICogQHBhcmFtIHtzdHJpbmd9IFtzY3JpcHQ9J0RGTFQnXVxuICogQHBhcmFtIHtzdHJpbmd9IFtsYW5ndWFnZT0nZGZsdCddXG4gKi9cblN1YnN0aXR1dGlvbi5wcm90b3R5cGUuYWRkQWx0ZXJuYXRlID0gZnVuY3Rpb24oZmVhdHVyZSwgc3Vic3RpdHV0aW9uLCBzY3JpcHQsIGxhbmd1YWdlKSB7XG4gICAgdmFyIGxvb2t1cFRhYmxlID0gdGhpcy5nZXRMb29rdXBUYWJsZXMoc2NyaXB0LCBsYW5ndWFnZSwgZmVhdHVyZSwgMywgdHJ1ZSlbMF07XG4gICAgdmFyIHN1YnRhYmxlID0gZ2V0U3Vic3RGb3JtYXQobG9va3VwVGFibGUsIDEsIHsgICAgICAgICAgICAgICAgLy8gbG9va3VwIHR5cGUgMyBzdWJ0YWJsZSwgZm9ybWF0IDEsIGNvdmVyYWdlIGZvcm1hdCAxXG4gICAgICAgIHN1YnN0Rm9ybWF0OiAxLFxuICAgICAgICBjb3ZlcmFnZToge2Zvcm1hdDogMSwgZ2x5cGhzOiBbXX0sXG4gICAgICAgIGFsdGVybmF0ZVNldHM6IFtdXG4gICAgfSk7XG4gICAgY2hlY2suYXNzZXJ0KHN1YnRhYmxlLmNvdmVyYWdlLmZvcm1hdCA9PT0gMSwgJ0xpZ2F0dXJlOiB1bmFibGUgdG8gbW9kaWZ5IGNvdmVyYWdlIHRhYmxlIGZvcm1hdCAnICsgc3VidGFibGUuY292ZXJhZ2UuZm9ybWF0KTtcbiAgICB2YXIgY292ZXJhZ2VHbHlwaCA9IHN1YnN0aXR1dGlvbi5zdWI7XG4gICAgdmFyIHBvcyA9IHRoaXMuYmluU2VhcmNoKHN1YnRhYmxlLmNvdmVyYWdlLmdseXBocywgY292ZXJhZ2VHbHlwaCk7XG4gICAgaWYgKHBvcyA8IDApIHtcbiAgICAgICAgcG9zID0gLTEgLSBwb3M7XG4gICAgICAgIHN1YnRhYmxlLmNvdmVyYWdlLmdseXBocy5zcGxpY2UocG9zLCAwLCBjb3ZlcmFnZUdseXBoKTtcbiAgICAgICAgc3VidGFibGUuYWx0ZXJuYXRlU2V0cy5zcGxpY2UocG9zLCAwLCAwKTtcbiAgICB9XG4gICAgc3VidGFibGUuYWx0ZXJuYXRlU2V0c1twb3NdID0gc3Vic3RpdHV0aW9uLmJ5O1xufTtcblxuLyoqXG4gKiBBZGQgYSBsaWdhdHVyZSAobG9va3VwIHR5cGUgNClcbiAqIExpZ2F0dXJlcyB3aXRoIG1vcmUgY29tcG9uZW50cyBtdXN0IGJlIHN0b3JlZCBhaGVhZCBvZiB0aG9zZSB3aXRoIGZld2VyIGNvbXBvbmVudHMgaW4gb3JkZXIgdG8gYmUgZm91bmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmZWF0dXJlIC0gNC1sZXR0ZXIgZmVhdHVyZSBuYW1lICgnbGlnYScsICdybGlnJywgJ2RsaWcnLi4uKVxuICogQHBhcmFtIHtPYmplY3R9IGxpZ2F0dXJlIC0geyBzdWI6IFtpZHNdLCBieTogaWQgfVxuICogQHBhcmFtIHtzdHJpbmd9IFtzY3JpcHQ9J0RGTFQnXVxuICogQHBhcmFtIHtzdHJpbmd9IFtsYW5ndWFnZT0nZGZsdCddXG4gKi9cblN1YnN0aXR1dGlvbi5wcm90b3R5cGUuYWRkTGlnYXR1cmUgPSBmdW5jdGlvbihmZWF0dXJlLCBsaWdhdHVyZSwgc2NyaXB0LCBsYW5ndWFnZSkge1xuICAgIHZhciBsb29rdXBUYWJsZSA9IHRoaXMuZ2V0TG9va3VwVGFibGVzKHNjcmlwdCwgbGFuZ3VhZ2UsIGZlYXR1cmUsIDQsIHRydWUpWzBdO1xuICAgIHZhciBzdWJ0YWJsZSA9IGxvb2t1cFRhYmxlLnN1YnRhYmxlc1swXTtcbiAgICBpZiAoIXN1YnRhYmxlKSB7XG4gICAgICAgIHN1YnRhYmxlID0geyAgICAgICAgICAgICAgICAvLyBsb29rdXAgdHlwZSA0IHN1YnRhYmxlLCBmb3JtYXQgMSwgY292ZXJhZ2UgZm9ybWF0IDFcbiAgICAgICAgICAgIHN1YnN0Rm9ybWF0OiAxLFxuICAgICAgICAgICAgY292ZXJhZ2U6IHsgZm9ybWF0OiAxLCBnbHlwaHM6IFtdIH0sXG4gICAgICAgICAgICBsaWdhdHVyZVNldHM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIGxvb2t1cFRhYmxlLnN1YnRhYmxlc1swXSA9IHN1YnRhYmxlO1xuICAgIH1cbiAgICBjaGVjay5hc3NlcnQoc3VidGFibGUuY292ZXJhZ2UuZm9ybWF0ID09PSAxLCAnTGlnYXR1cmU6IHVuYWJsZSB0byBtb2RpZnkgY292ZXJhZ2UgdGFibGUgZm9ybWF0ICcgKyBzdWJ0YWJsZS5jb3ZlcmFnZS5mb3JtYXQpO1xuICAgIHZhciBjb3ZlcmFnZUdseXBoID0gbGlnYXR1cmUuc3ViWzBdO1xuICAgIHZhciBsaWdDb21wb25lbnRzID0gbGlnYXR1cmUuc3ViLnNsaWNlKDEpO1xuICAgIHZhciBsaWdhdHVyZVRhYmxlID0ge1xuICAgICAgICBsaWdHbHlwaDogbGlnYXR1cmUuYnksXG4gICAgICAgIGNvbXBvbmVudHM6IGxpZ0NvbXBvbmVudHNcbiAgICB9O1xuICAgIHZhciBwb3MgPSB0aGlzLmJpblNlYXJjaChzdWJ0YWJsZS5jb3ZlcmFnZS5nbHlwaHMsIGNvdmVyYWdlR2x5cGgpO1xuICAgIGlmIChwb3MgPj0gMCkge1xuICAgICAgICAvLyBsaWdhdHVyZVNldCBhbHJlYWR5IGV4aXN0c1xuICAgICAgICB2YXIgbGlnYXR1cmVTZXQgPSBzdWJ0YWJsZS5saWdhdHVyZVNldHNbcG9zXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaWdhdHVyZVNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gSWYgbGlnYXR1cmUgYWxyZWFkeSBleGlzdHMsIHJldHVybi5cbiAgICAgICAgICAgIGlmIChhcnJheXNFcXVhbChsaWdhdHVyZVNldFtpXS5jb21wb25lbnRzLCBsaWdDb21wb25lbnRzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBsaWdhdHVyZSBkb2VzIG5vdCBleGlzdDogYWRkIGl0LlxuICAgICAgICBsaWdhdHVyZVNldC5wdXNoKGxpZ2F0dXJlVGFibGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBsaWdhdHVyZVNldCBhbmQgYWRkIGNvdmVyYWdlIGZvciB0aGUgZmlyc3QgZ2x5cGguXG4gICAgICAgIHBvcyA9IC0xIC0gcG9zO1xuICAgICAgICBzdWJ0YWJsZS5jb3ZlcmFnZS5nbHlwaHMuc3BsaWNlKHBvcywgMCwgY292ZXJhZ2VHbHlwaCk7XG4gICAgICAgIHN1YnRhYmxlLmxpZ2F0dXJlU2V0cy5zcGxpY2UocG9zLCAwLCBbbGlnYXR1cmVUYWJsZV0pO1xuICAgIH1cbn07XG5cbi8qKlxuICogTGlzdCBhbGwgZmVhdHVyZSBkYXRhIGZvciBhIGdpdmVuIHNjcmlwdCBhbmQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmVhdHVyZSAtIDQtbGV0dGVyIGZlYXR1cmUgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IFtzY3JpcHQ9J0RGTFQnXVxuICogQHBhcmFtIHtzdHJpbmd9IFtsYW5ndWFnZT0nZGZsdCddXG4gKiBAcmV0dXJuIHtBcnJheX0gc3Vic3RpdHV0aW9ucyAtIFRoZSBsaXN0IG9mIHN1YnN0aXR1dGlvbnMuXG4gKi9cblN1YnN0aXR1dGlvbi5wcm90b3R5cGUuZ2V0RmVhdHVyZSA9IGZ1bmN0aW9uKGZlYXR1cmUsIHNjcmlwdCwgbGFuZ3VhZ2UpIHtcbiAgICBpZiAoL3NzXFxkXFxkLy50ZXN0KGZlYXR1cmUpKSB7ICAgICAgICAgICAgICAgLy8gc3MwMSAtIHNzMjBcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2luZ2xlKGZlYXR1cmUsIHNjcmlwdCwgbGFuZ3VhZ2UpO1xuICAgIH1cbiAgICBzd2l0Y2ggKGZlYXR1cmUpIHtcbiAgICAgICAgY2FzZSAnYWFsdCc6XG4gICAgICAgIGNhc2UgJ3NhbHQnOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2luZ2xlKGZlYXR1cmUsIHNjcmlwdCwgbGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgICAgIC5jb25jYXQodGhpcy5nZXRBbHRlcm5hdGVzKGZlYXR1cmUsIHNjcmlwdCwgbGFuZ3VhZ2UpKTtcbiAgICAgICAgY2FzZSAnZGxpZyc6XG4gICAgICAgIGNhc2UgJ2xpZ2EnOlxuICAgICAgICBjYXNlICdybGlnJzogcmV0dXJuIHRoaXMuZ2V0TGlnYXR1cmVzKGZlYXR1cmUsIHNjcmlwdCwgbGFuZ3VhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBBZGQgYSBzdWJzdGl0dXRpb24gdG8gYSBmZWF0dXJlIGZvciBhIGdpdmVuIHNjcmlwdCBhbmQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmVhdHVyZSAtIDQtbGV0dGVyIGZlYXR1cmUgbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YiAtIHRoZSBzdWJzdGl0dXRpb24gdG8gYWRkIChhbiBvYmplY3QgbGlrZSB7IHN1YjogaWQgb3IgW2lkc10sIGJ5OiBpZCBvciBbaWRzXSB9KVxuICogQHBhcmFtIHtzdHJpbmd9IFtzY3JpcHQ9J0RGTFQnXVxuICogQHBhcmFtIHtzdHJpbmd9IFtsYW5ndWFnZT0nZGZsdCddXG4gKi9cblN1YnN0aXR1dGlvbi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oZmVhdHVyZSwgc3ViLCBzY3JpcHQsIGxhbmd1YWdlKSB7XG4gICAgaWYgKC9zc1xcZFxcZC8udGVzdChmZWF0dXJlKSkgeyAgICAgICAgICAgICAgIC8vIHNzMDEgLSBzczIwXG4gICAgICAgIHJldHVybiB0aGlzLmFkZFNpbmdsZShmZWF0dXJlLCBzdWIsIHNjcmlwdCwgbGFuZ3VhZ2UpO1xuICAgIH1cbiAgICBzd2l0Y2ggKGZlYXR1cmUpIHtcbiAgICAgICAgY2FzZSAnYWFsdCc6XG4gICAgICAgIGNhc2UgJ3NhbHQnOlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdWIuYnkgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkU2luZ2xlKGZlYXR1cmUsIHN1Yiwgc2NyaXB0LCBsYW5ndWFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGRBbHRlcm5hdGUoZmVhdHVyZSwgc3ViLCBzY3JpcHQsIGxhbmd1YWdlKTtcbiAgICAgICAgY2FzZSAnZGxpZyc6XG4gICAgICAgIGNhc2UgJ2xpZ2EnOlxuICAgICAgICBjYXNlICdybGlnJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZExpZ2F0dXJlKGZlYXR1cmUsIHN1Yiwgc2NyaXB0LCBsYW5ndWFnZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5mdW5jdGlvbiBpc0Jyb3dzZXIoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBub2RlQnVmZmVyVG9BcnJheUJ1ZmZlcihidWZmZXIpIHtcbiAgICB2YXIgYWIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmxlbmd0aCk7XG4gICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShhYik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmlld1tpXSA9IGJ1ZmZlcltpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWI7XG59XG5cbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9Ob2RlQnVmZmVyKGFiKSB7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBCdWZmZXIoYWIuYnl0ZUxlbmd0aCk7XG4gICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShhYik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgYnVmZmVyW2ldID0gdmlld1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyO1xufVxuXG5mdW5jdGlvbiBjaGVja0FyZ3VtZW50KGV4cHJlc3Npb24sIG1lc3NhZ2UpIHtcbiAgICBpZiAoIWV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbWVzc2FnZTtcbiAgICB9XG59XG5cbi8qIEEgVHJ1ZVR5cGUgZm9udCBoaW50aW5nIGludGVycHJldGVyLlxuKlxuKiAoYykgMjAxNyBBeGVsIEtpdHRlbmJlcmdlclxuKlxuKiBUaGlzIGludGVycHJldGVyIGhhcyBiZWVuIGltcGxlbWVudGVkIGFjY29yZGluZyB0byB0aGlzIGRvY3VtZW50YXRpb246XG4qIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDUvQ2hhcDUuaHRtbFxuKlxuKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24gRjI0RE9UNiB2YWx1ZXMgYXJlIHVzZWQgZm9yIHBpeGVscy5cbiogVGhhdCBtZWFucyBjYWxjdWxhdGlvbiBpcyAxLzY0IHBpeGVsIGFjY3VyYXRlIGFuZCB1c2VzIGludGVnZXIgb3BlcmF0aW9ucy5cbiogSG93ZXZlciwgSmF2YXNjcmlwdCBoYXMgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyBieSBkZWZhdWx0IGFuZCBvbmx5XG4qIHRob3NlIGFyZSBhdmFpbGFibGUuIE9uZSBjb3VsZCBtYWtlIGEgY2FzZSB0byBzaW11bGF0ZSB0aGUgMS82NCBhY2N1cmFjeVxuKiBleGFjdGx5IGJ5IHRydW5jYXRpbmcgYWZ0ZXIgZXZlcnkgZGl2aXNpb24gb3BlcmF0aW9uXG4qIChmb3IgZXhhbXBsZSB3aXRoIDw8IDApIHRvIGdldCBwaXhlbCBleGFjdGx5IHJlc3VsdHMgYXMgb3RoZXIgVHJ1ZVR5cGVcbiogaW1wbGVtZW50YXRpb25zLiBJdCBtYXkgbWFrZSBzZW5zZSBzaW5jZSBzb21lIGZvbnRzIGFyZSBwaXhlbCBvcHRpbWl6ZWRcbiogYnkgaGFuZCB1c2luZyBERUxUQVAgaW5zdHJ1Y3Rpb25zLiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0XG4qIGFuZCByYXRoZXIgdXNlcyBmdWxsIGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbi5cbipcbiogeFNjYWxlLCB5U2NhbGUgYW5kIHJvdGF0aW9uIGlzIGN1cnJlbnRseSBpZ25vcmVkLlxuKlxuKiBBIGZldyBub24tdHJpdmlhbCBpbnN0cnVjdGlvbnMgYXJlIG1pc3NpbmcgYXMgSSBkaWRuJ3QgZW5jb3VudGVyIHlldFxuKiBhIGZvbnQgdGhhdCB1c2VkIHRoZW0gdG8gdGVzdCBhIHBvc3NpYmxlIGltcGxlbWVudGF0aW9uLlxuKlxuKiBTb21lIGZvbnRzIHNlZW0gdG8gdXNlIHVuZG9jdW1lbnRlZCBmZWF0dXJlcyByZWdhcmRpbmcgdGhlIHR3aWxpZ2h0IHpvbmUuXG4qIE9ubHkgc29tZSBvZiB0aGVtIGFyZSBpbXBsZW1lbnRlZCBhcyB0aGV5IHdlcmUgZW5jb3VudGVyZWQuXG4qXG4qIFRoZSBleHBvcnRzLkRFQlVHIHN0YXRlbWVudHMgYXJlIHJlbW92ZWQgb24gdGhlIG1pbmlmaWVkIGRpc3RyaWJ1dGlvbiBmaWxlLlxuKi9cbnZhciBpbnN0cnVjdGlvblRhYmxlO1xudmFyIGV4ZWM7XG52YXIgZXhlY0dseXBoO1xudmFyIGV4ZWNDb21wb25lbnQ7XG5cbi8qXG4qIENyZWF0ZXMgYSBoaW50aW5nIG9iamVjdC5cbipcbiogVGhlcmUgb3VnaHQgdG8gYmUgZXhhY3RseSBvbmVcbiogZm9yIGVhY2ggdHJ1ZXR5cGUgZm9udCB0aGF0IGlzIHVzZWQgZm9yIGhpbnRpbmcuXG4qL1xuZnVuY3Rpb24gSGludGluZyhmb250KSB7XG4gICAgLy8gdGhlIGZvbnQgdGhpcyBoaW50aW5nIG9iamVjdCBpcyBmb3JcbiAgICB0aGlzLmZvbnQgPSBmb250O1xuXG4gICAgLy8gY2FjaGVkIHN0YXRlc1xuICAgIHRoaXMuX2ZwZ21TdGF0ZSAgPVxuICAgIHRoaXMuX3ByZXBTdGF0ZSAgPVxuICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAvLyBlcnJvclN0YXRlXG4gICAgLy8gMCAuLi4gYWxsIG9rYXlcbiAgICAvLyAxIC4uLiBoYWQgYW4gZXJyb3IgaW4gYSBnbHlmLFxuICAgIC8vICAgICAgIGNvbnRpbnVlIHdvcmtpbmcgYnV0IHN0b3Agc3BhbW1pbmdcbiAgICAvLyAgICAgICB0aGUgY29uc29sZVxuICAgIC8vIDIgLi4uIGVycm9yIGF0IHByZXAsIHN0b3AgaGludGluZyBhdCB0aGlzIHBwZW1cbiAgICAvLyAzIC4uLiBlcnJvciBhdCBmcGVnLCBzdG9wIGhpbnRpbmcgZm9yIHRoaXMgZm9udCBhdCBhbGxcbiAgICB0aGlzLl9lcnJvclN0YXRlID0gMDtcbn1cblxuLypcbiogTm90IHJvdW5kaW5nLlxuKi9cbmZ1bmN0aW9uIHJvdW5kT2ZmKHYpIHtcbiAgICByZXR1cm4gdjtcbn1cblxuLypcbiogUm91bmRpbmcgdG8gZ3JpZC5cbiovXG5mdW5jdGlvbiByb3VuZFRvR3JpZCh2KSB7XG4gICAgLy9Sb3VuZGluZyBpbiBUVCBpcyBzdXBwb3NlZCB0byBcInN5bW1ldHJpY2FsIGFyb3VuZCB6ZXJvXCJcbiAgICByZXR1cm4gTWF0aC5zaWduKHYpICogTWF0aC5yb3VuZChNYXRoLmFicyh2KSk7XG59XG5cbi8qXG4qIFJvdW5kaW5nIHRvIGRvdWJsZSBncmlkLlxuKi9cbmZ1bmN0aW9uIHJvdW5kVG9Eb3VibGVHcmlkKHYpIHtcbiAgICByZXR1cm4gTWF0aC5zaWduKHYpICogTWF0aC5yb3VuZChNYXRoLmFicyh2ICogMikpIC8gMjtcbn1cblxuLypcbiogUm91bmRpbmcgdG8gaGFsZiBncmlkLlxuKi9cbmZ1bmN0aW9uIHJvdW5kVG9IYWxmR3JpZCh2KSB7XG4gICAgcmV0dXJuIE1hdGguc2lnbih2KSAqIChNYXRoLnJvdW5kKE1hdGguYWJzKHYpICsgMC41KSAtIDAuNSk7XG59XG5cbi8qXG4qIFJvdW5kaW5nIHRvIHVwIHRvIGdyaWQuXG4qL1xuZnVuY3Rpb24gcm91bmRVcFRvR3JpZCh2KSB7XG4gICAgcmV0dXJuIE1hdGguc2lnbih2KSAqIE1hdGguY2VpbChNYXRoLmFicyh2KSk7XG59XG5cbi8qXG4qIFJvdW5kaW5nIHRvIGRvd24gdG8gZ3JpZC5cbiovXG5mdW5jdGlvbiByb3VuZERvd25Ub0dyaWQodikge1xuICAgIHJldHVybiBNYXRoLnNpZ24odikgKiBNYXRoLmZsb29yKE1hdGguYWJzKHYpKTtcbn1cblxuLypcbiogU3VwZXIgcm91bmRpbmcuXG4qL1xudmFyIHJvdW5kU3VwZXIgPSBmdW5jdGlvbiAodikge1xuICAgIHZhciBwZXJpb2QgPSB0aGlzLnNyUGVyaW9kO1xuICAgIHZhciBwaGFzZSA9IHRoaXMuc3JQaGFzZTtcbiAgICB2YXIgdGhyZXNob2xkID0gdGhpcy5zclRocmVzaG9sZDtcbiAgICB2YXIgc2lnbiA9IDE7XG5cbiAgICBpZiAodiA8IDApIHtcbiAgICAgICAgdiA9IC12O1xuICAgICAgICBzaWduID0gLTE7XG4gICAgfVxuXG4gICAgdiArPSB0aHJlc2hvbGQgLSBwaGFzZTtcblxuICAgIHYgPSBNYXRoLnRydW5jKHYgLyBwZXJpb2QpICogcGVyaW9kO1xuXG4gICAgdiArPSBwaGFzZTtcblxuICAgIC8vIGFjY29yZGluZyB0byBodHRwOi8veGdyaWRmaXQuc291cmNlZm9yZ2UubmV0L3JvdW5kLmh0bWxcbiAgICBpZiAoc2lnbiA+IDAgJiYgdiA8IDApIHsgcmV0dXJuIHBoYXNlOyB9XG4gICAgaWYgKHNpZ24gPCAwICYmIHYgPiAwKSB7IHJldHVybiAtcGhhc2U7IH1cblxuICAgIHJldHVybiB2ICogc2lnbjtcbn07XG5cbi8qXG4qIFVuaXQgdmVjdG9yIG9mIHgtYXhpcy5cbiovXG52YXIgeFVuaXRWZWN0b3IgPSB7XG4gICAgeDogMSxcblxuICAgIHk6IDAsXG5cbiAgICBheGlzOiAneCcsXG5cbiAgICAvLyBHZXRzIHRoZSBwcm9qZWN0ZWQgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLlxuICAgIC8vIG8xL28yIC4uLiBpZiB0cnVlLCByZXNwZWN0aXZlIG9yaWdpbmFsIHBvc2l0aW9uIGlzIHVzZWQuXG4gICAgZGlzdGFuY2U6IGZ1bmN0aW9uIChwMSwgcDIsIG8xLCBvMikge1xuICAgICAgICByZXR1cm4gKG8xID8gcDEueG8gOiBwMS54KSAtIChvMiA/IHAyLnhvIDogcDIueCk7XG4gICAgfSxcblxuICAgIC8vIE1vdmVzIHBvaW50IHAgc28gdGhlIG1vdmVkIHBvc2l0aW9uIGhhcyB0aGUgc2FtZSByZWxhdGl2ZVxuICAgIC8vIHBvc2l0aW9uIHRvIHRoZSBtb3ZlZCBwb3NpdGlvbnMgb2YgcnAxIGFuZCBycDIgdGhhbiB0aGVcbiAgICAvLyBvcmlnaW5hbCBwb3NpdGlvbnMgaGFkLlxuICAgIC8vXG4gICAgLy8gU2VlIEFQUEVORElYIG9uIElOVEVSUE9MQVRFIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlLlxuICAgIGludGVycG9sYXRlOiBmdW5jdGlvbiAocCwgcnAxLCBycDIsIHB2KSB7XG4gICAgICAgIHZhciBkbzE7XG4gICAgICAgIHZhciBkbzI7XG4gICAgICAgIHZhciBkb2ExO1xuICAgICAgICB2YXIgZG9hMjtcbiAgICAgICAgdmFyIGRtMTtcbiAgICAgICAgdmFyIGRtMjtcbiAgICAgICAgdmFyIGR0O1xuXG4gICAgICAgIGlmICghcHYgfHwgcHYgPT09IHRoaXMpIHtcbiAgICAgICAgICAgIGRvMSA9IHAueG8gLSBycDEueG87XG4gICAgICAgICAgICBkbzIgPSBwLnhvIC0gcnAyLnhvO1xuICAgICAgICAgICAgZG0xID0gcnAxLnggLSBycDEueG87XG4gICAgICAgICAgICBkbTIgPSBycDIueCAtIHJwMi54bztcbiAgICAgICAgICAgIGRvYTEgPSBNYXRoLmFicyhkbzEpO1xuICAgICAgICAgICAgZG9hMiA9IE1hdGguYWJzKGRvMik7XG4gICAgICAgICAgICBkdCA9IGRvYTEgKyBkb2EyO1xuXG4gICAgICAgICAgICBpZiAoZHQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBwLnggPSBwLnhvICsgKGRtMSArIGRtMikgLyAyO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcC54ID0gcC54byArIChkbTEgKiBkb2EyICsgZG0yICogZG9hMSkgLyBkdDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvMSA9IHB2LmRpc3RhbmNlKHAsIHJwMSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGRvMiA9IHB2LmRpc3RhbmNlKHAsIHJwMiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGRtMSA9IHB2LmRpc3RhbmNlKHJwMSwgcnAxLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGRtMiA9IHB2LmRpc3RhbmNlKHJwMiwgcnAyLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGRvYTEgPSBNYXRoLmFicyhkbzEpO1xuICAgICAgICBkb2EyID0gTWF0aC5hYnMoZG8yKTtcbiAgICAgICAgZHQgPSBkb2ExICsgZG9hMjtcblxuICAgICAgICBpZiAoZHQgPT09IDApIHtcbiAgICAgICAgICAgIHhVbml0VmVjdG9yLnNldFJlbGF0aXZlKHAsIHAsIChkbTEgKyBkbTIpIC8gMiwgcHYsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgeFVuaXRWZWN0b3Iuc2V0UmVsYXRpdmUocCwgcCwgKGRtMSAqIGRvYTIgKyBkbTIgKiBkb2ExKSAvIGR0LCBwdiwgdHJ1ZSk7XG4gICAgfSxcblxuICAgIC8vIFNsb3BlIG9mIGxpbmUgbm9ybWFsIHRvIHRoaXNcbiAgICBub3JtYWxTbG9wZTogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFxuXG4gICAgLy8gU2V0cyB0aGUgcG9pbnQgJ3AnIHJlbGF0aXZlIHRvIHBvaW50ICdycCdcbiAgICAvLyBieSB0aGUgZGlzdGFuY2UgJ2QnLlxuICAgIC8vXG4gICAgLy8gU2VlIEFQUEVORElYIG9uIFNFVFJFTEFUSVZFIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlLlxuICAgIC8vXG4gICAgLy8gcCAgIC4uLiBwb2ludCB0byBzZXRcbiAgICAvLyBycCAgLi4uIHJlZmVyZW5jZSBwb2ludFxuICAgIC8vIGQgICAuLi4gZGlzdGFuY2Ugb24gcHJvamVjdGlvbiB2ZWN0b3JcbiAgICAvLyBwdiAgLi4uIHByb2plY3Rpb24gdmVjdG9yICh1bmRlZmluZWQgPSB0aGlzKVxuICAgIC8vIG9yZyAuLi4gaWYgdHJ1ZSwgdXNlcyB0aGUgb3JpZ2luYWwgcG9zaXRpb24gb2YgcnAgYXMgcmVmZXJlbmNlLlxuICAgIHNldFJlbGF0aXZlOiBmdW5jdGlvbiAocCwgcnAsIGQsIHB2LCBvcmcpIHtcbiAgICAgICAgaWYgKCFwdiB8fCBwdiA9PT0gdGhpcykge1xuICAgICAgICAgICAgcC54ID0gKG9yZyA/IHJwLnhvIDogcnAueCkgKyBkO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJweCA9IG9yZyA/IHJwLnhvIDogcnAueDtcbiAgICAgICAgdmFyIHJweSA9IG9yZyA/IHJwLnlvIDogcnAueTtcbiAgICAgICAgdmFyIHJwZHggPSBycHggKyBkICogcHYueDtcbiAgICAgICAgdmFyIHJwZHkgPSBycHkgKyBkICogcHYueTtcblxuICAgICAgICBwLnggPSBycGR4ICsgKHAueSAtIHJwZHkpIC8gcHYubm9ybWFsU2xvcGU7XG4gICAgfSxcblxuICAgIC8vIFNsb3BlIG9mIHZlY3RvciBsaW5lLlxuICAgIHNsb3BlOiAwLFxuXG4gICAgLy8gVG91Y2hlcyB0aGUgcG9pbnQgcC5cbiAgICB0b3VjaDogZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcC54VG91Y2hlZCA9IHRydWU7XG4gICAgfSxcblxuICAgIC8vIFRlc3RzIGlmIGEgcG9pbnQgcCBpcyB0b3VjaGVkLlxuICAgIHRvdWNoZWQ6IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwLnhUb3VjaGVkO1xuICAgIH0sXG5cbiAgICAvLyBVbnRvdWNoZXMgdGhlIHBvaW50IHAuXG4gICAgdW50b3VjaDogZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcC54VG91Y2hlZCA9IGZhbHNlO1xuICAgIH1cbn07XG5cbi8qXG4qIFVuaXQgdmVjdG9yIG9mIHktYXhpcy5cbiovXG52YXIgeVVuaXRWZWN0b3IgPSB7XG4gICAgeDogMCxcblxuICAgIHk6IDEsXG5cbiAgICBheGlzOiAneScsXG5cbiAgICAvLyBHZXRzIHRoZSBwcm9qZWN0ZWQgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLlxuICAgIC8vIG8xL28yIC4uLiBpZiB0cnVlLCByZXNwZWN0aXZlIG9yaWdpbmFsIHBvc2l0aW9uIGlzIHVzZWQuXG4gICAgZGlzdGFuY2U6IGZ1bmN0aW9uIChwMSwgcDIsIG8xLCBvMikge1xuICAgICAgICByZXR1cm4gKG8xID8gcDEueW8gOiBwMS55KSAtIChvMiA/IHAyLnlvIDogcDIueSk7XG4gICAgfSxcblxuICAgIC8vIE1vdmVzIHBvaW50IHAgc28gdGhlIG1vdmVkIHBvc2l0aW9uIGhhcyB0aGUgc2FtZSByZWxhdGl2ZVxuICAgIC8vIHBvc2l0aW9uIHRvIHRoZSBtb3ZlZCBwb3NpdGlvbnMgb2YgcnAxIGFuZCBycDIgdGhhbiB0aGVcbiAgICAvLyBvcmlnaW5hbCBwb3NpdGlvbnMgaGFkLlxuICAgIC8vXG4gICAgLy8gU2VlIEFQUEVORElYIG9uIElOVEVSUE9MQVRFIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlLlxuICAgIGludGVycG9sYXRlOiBmdW5jdGlvbiAocCwgcnAxLCBycDIsIHB2KSB7XG4gICAgICAgIHZhciBkbzE7XG4gICAgICAgIHZhciBkbzI7XG4gICAgICAgIHZhciBkb2ExO1xuICAgICAgICB2YXIgZG9hMjtcbiAgICAgICAgdmFyIGRtMTtcbiAgICAgICAgdmFyIGRtMjtcbiAgICAgICAgdmFyIGR0O1xuXG4gICAgICAgIGlmICghcHYgfHwgcHYgPT09IHRoaXMpIHtcbiAgICAgICAgICAgIGRvMSA9IHAueW8gLSBycDEueW87XG4gICAgICAgICAgICBkbzIgPSBwLnlvIC0gcnAyLnlvO1xuICAgICAgICAgICAgZG0xID0gcnAxLnkgLSBycDEueW87XG4gICAgICAgICAgICBkbTIgPSBycDIueSAtIHJwMi55bztcbiAgICAgICAgICAgIGRvYTEgPSBNYXRoLmFicyhkbzEpO1xuICAgICAgICAgICAgZG9hMiA9IE1hdGguYWJzKGRvMik7XG4gICAgICAgICAgICBkdCA9IGRvYTEgKyBkb2EyO1xuXG4gICAgICAgICAgICBpZiAoZHQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBwLnkgPSBwLnlvICsgKGRtMSArIGRtMikgLyAyO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcC55ID0gcC55byArIChkbTEgKiBkb2EyICsgZG0yICogZG9hMSkgLyBkdDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvMSA9IHB2LmRpc3RhbmNlKHAsIHJwMSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGRvMiA9IHB2LmRpc3RhbmNlKHAsIHJwMiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGRtMSA9IHB2LmRpc3RhbmNlKHJwMSwgcnAxLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGRtMiA9IHB2LmRpc3RhbmNlKHJwMiwgcnAyLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGRvYTEgPSBNYXRoLmFicyhkbzEpO1xuICAgICAgICBkb2EyID0gTWF0aC5hYnMoZG8yKTtcbiAgICAgICAgZHQgPSBkb2ExICsgZG9hMjtcblxuICAgICAgICBpZiAoZHQgPT09IDApIHtcbiAgICAgICAgICAgIHlVbml0VmVjdG9yLnNldFJlbGF0aXZlKHAsIHAsIChkbTEgKyBkbTIpIC8gMiwgcHYsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgeVVuaXRWZWN0b3Iuc2V0UmVsYXRpdmUocCwgcCwgKGRtMSAqIGRvYTIgKyBkbTIgKiBkb2ExKSAvIGR0LCBwdiwgdHJ1ZSk7XG4gICAgfSxcblxuICAgIC8vIFNsb3BlIG9mIGxpbmUgbm9ybWFsIHRvIHRoaXMuXG4gICAgbm9ybWFsU2xvcGU6IDAsXG5cbiAgICAvLyBTZXRzIHRoZSBwb2ludCAncCcgcmVsYXRpdmUgdG8gcG9pbnQgJ3JwJ1xuICAgIC8vIGJ5IHRoZSBkaXN0YW5jZSAnZCdcbiAgICAvL1xuICAgIC8vIFNlZSBBUFBFTkRJWCBvbiBTRVRSRUxBVElWRSBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZS5cbiAgICAvL1xuICAgIC8vIHAgICAuLi4gcG9pbnQgdG8gc2V0XG4gICAgLy8gcnAgIC4uLiByZWZlcmVuY2UgcG9pbnRcbiAgICAvLyBkICAgLi4uIGRpc3RhbmNlIG9uIHByb2plY3Rpb24gdmVjdG9yXG4gICAgLy8gcHYgIC4uLiBwcm9qZWN0aW9uIHZlY3RvciAodW5kZWZpbmVkID0gdGhpcylcbiAgICAvLyBvcmcgLi4uIGlmIHRydWUsIHVzZXMgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIG9mIHJwIGFzIHJlZmVyZW5jZS5cbiAgICBzZXRSZWxhdGl2ZTogZnVuY3Rpb24gKHAsIHJwLCBkLCBwdiwgb3JnKSB7XG4gICAgICAgIGlmICghcHYgfHwgcHYgPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHAueSA9IChvcmcgPyBycC55byA6IHJwLnkpICsgZDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBycHggPSBvcmcgPyBycC54byA6IHJwLng7XG4gICAgICAgIHZhciBycHkgPSBvcmcgPyBycC55byA6IHJwLnk7XG4gICAgICAgIHZhciBycGR4ID0gcnB4ICsgZCAqIHB2Lng7XG4gICAgICAgIHZhciBycGR5ID0gcnB5ICsgZCAqIHB2Lnk7XG5cbiAgICAgICAgcC55ID0gcnBkeSArIHB2Lm5vcm1hbFNsb3BlICogKHAueCAtIHJwZHgpO1xuICAgIH0sXG5cbiAgICAvLyBTbG9wZSBvZiB2ZWN0b3IgbGluZS5cbiAgICBzbG9wZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXG4gICAgLy8gVG91Y2hlcyB0aGUgcG9pbnQgcC5cbiAgICB0b3VjaDogZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcC55VG91Y2hlZCA9IHRydWU7XG4gICAgfSxcblxuICAgIC8vIFRlc3RzIGlmIGEgcG9pbnQgcCBpcyB0b3VjaGVkLlxuICAgIHRvdWNoZWQ6IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwLnlUb3VjaGVkO1xuICAgIH0sXG5cbiAgICAvLyBVbnRvdWNoZXMgdGhlIHBvaW50IHAuXG4gICAgdW50b3VjaDogZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcC55VG91Y2hlZCA9IGZhbHNlO1xuICAgIH1cbn07XG5cbk9iamVjdC5mcmVlemUoeFVuaXRWZWN0b3IpO1xuT2JqZWN0LmZyZWV6ZSh5VW5pdFZlY3Rvcik7XG5cbi8qXG4qIENyZWF0ZXMgYSB1bml0IHZlY3RvciB0aGF0IGlzIG5vdCB4LSBvciB5LWF4aXMuXG4qL1xuZnVuY3Rpb24gVW5pdFZlY3Rvcih4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMuYXhpcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNsb3BlID0geSAvIHg7XG4gICAgdGhpcy5ub3JtYWxTbG9wZSA9IC14IC8geTtcbiAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xufVxuXG4vKlxuKiBHZXRzIHRoZSBwcm9qZWN0ZWQgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLlxuKiBvMS9vMiAuLi4gaWYgdHJ1ZSwgcmVzcGVjdGl2ZSBvcmlnaW5hbCBwb3NpdGlvbiBpcyB1c2VkLlxuKi9cblVuaXRWZWN0b3IucHJvdG90eXBlLmRpc3RhbmNlID0gZnVuY3Rpb24ocDEsIHAyLCBvMSwgbzIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnggKiB4VW5pdFZlY3Rvci5kaXN0YW5jZShwMSwgcDIsIG8xLCBvMikgK1xuICAgICAgICB0aGlzLnkgKiB5VW5pdFZlY3Rvci5kaXN0YW5jZShwMSwgcDIsIG8xLCBvMilcbiAgICApO1xufTtcblxuLypcbiogTW92ZXMgcG9pbnQgcCBzbyB0aGUgbW92ZWQgcG9zaXRpb24gaGFzIHRoZSBzYW1lIHJlbGF0aXZlXG4qIHBvc2l0aW9uIHRvIHRoZSBtb3ZlZCBwb3NpdGlvbnMgb2YgcnAxIGFuZCBycDIgdGhhbiB0aGVcbiogb3JpZ2luYWwgcG9zaXRpb25zIGhhZC5cbipcbiogU2VlIEFQUEVORElYIG9uIElOVEVSUE9MQVRFIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlLlxuKi9cblVuaXRWZWN0b3IucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24ocCwgcnAxLCBycDIsIHB2KSB7XG4gICAgdmFyIGRtMTtcbiAgICB2YXIgZG0yO1xuICAgIHZhciBkbzE7XG4gICAgdmFyIGRvMjtcbiAgICB2YXIgZG9hMTtcbiAgICB2YXIgZG9hMjtcbiAgICB2YXIgZHQ7XG5cbiAgICBkbzEgPSBwdi5kaXN0YW5jZShwLCBycDEsIHRydWUsIHRydWUpO1xuICAgIGRvMiA9IHB2LmRpc3RhbmNlKHAsIHJwMiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZG0xID0gcHYuZGlzdGFuY2UocnAxLCBycDEsIGZhbHNlLCB0cnVlKTtcbiAgICBkbTIgPSBwdi5kaXN0YW5jZShycDIsIHJwMiwgZmFsc2UsIHRydWUpO1xuICAgIGRvYTEgPSBNYXRoLmFicyhkbzEpO1xuICAgIGRvYTIgPSBNYXRoLmFicyhkbzIpO1xuICAgIGR0ID0gZG9hMSArIGRvYTI7XG5cbiAgICBpZiAoZHQgPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXRSZWxhdGl2ZShwLCBwLCAoZG0xICsgZG0yKSAvIDIsIHB2LCB0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0UmVsYXRpdmUocCwgcCwgKGRtMSAqIGRvYTIgKyBkbTIgKiBkb2ExKSAvIGR0LCBwdiwgdHJ1ZSk7XG59O1xuXG4vKlxuKiBTZXRzIHRoZSBwb2ludCAncCcgcmVsYXRpdmUgdG8gcG9pbnQgJ3JwJ1xuKiBieSB0aGUgZGlzdGFuY2UgJ2QnXG4qXG4qIFNlZSBBUFBFTkRJWCBvbiBTRVRSRUxBVElWRSBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZS5cbipcbiogcCAgIC4uLiAgcG9pbnQgdG8gc2V0XG4qIHJwICAuLi4gcmVmZXJlbmNlIHBvaW50XG4qIGQgICAuLi4gZGlzdGFuY2Ugb24gcHJvamVjdGlvbiB2ZWN0b3JcbiogcHYgIC4uLiBwcm9qZWN0aW9uIHZlY3RvciAodW5kZWZpbmVkID0gdGhpcylcbiogb3JnIC4uLiBpZiB0cnVlLCB1c2VzIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBvZiBycCBhcyByZWZlcmVuY2UuXG4qL1xuVW5pdFZlY3Rvci5wcm90b3R5cGUuc2V0UmVsYXRpdmUgPSBmdW5jdGlvbihwLCBycCwgZCwgcHYsIG9yZykge1xuICAgIHB2ID0gcHYgfHwgdGhpcztcblxuICAgIHZhciBycHggPSBvcmcgPyBycC54byA6IHJwLng7XG4gICAgdmFyIHJweSA9IG9yZyA/IHJwLnlvIDogcnAueTtcbiAgICB2YXIgcnBkeCA9IHJweCArIGQgKiBwdi54O1xuICAgIHZhciBycGR5ID0gcnB5ICsgZCAqIHB2Lnk7XG5cbiAgICB2YXIgcHZucyA9IHB2Lm5vcm1hbFNsb3BlO1xuICAgIHZhciBmdnMgPSB0aGlzLnNsb3BlO1xuXG4gICAgdmFyIHB4ID0gcC54O1xuICAgIHZhciBweSA9IHAueTtcblxuICAgIHAueCA9IChmdnMgKiBweCAtIHB2bnMgKiBycGR4ICsgcnBkeSAtIHB5KSAvIChmdnMgLSBwdm5zKTtcbiAgICBwLnkgPSBmdnMgKiAocC54IC0gcHgpICsgcHk7XG59O1xuXG4vKlxuKiBUb3VjaGVzIHRoZSBwb2ludCBwLlxuKi9cblVuaXRWZWN0b3IucHJvdG90eXBlLnRvdWNoID0gZnVuY3Rpb24ocCkge1xuICAgIHAueFRvdWNoZWQgPSB0cnVlO1xuICAgIHAueVRvdWNoZWQgPSB0cnVlO1xufTtcblxuLypcbiogUmV0dXJucyBhIHVuaXQgdmVjdG9yIHdpdGggeC95IGNvb3JkaW5hdGVzLlxuKi9cbmZ1bmN0aW9uIGdldFVuaXRWZWN0b3IoeCwgeSkge1xuICAgIHZhciBkID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuXG4gICAgeCAvPSBkO1xuICAgIHkgLz0gZDtcblxuICAgIGlmICh4ID09PSAxICYmIHkgPT09IDApIHsgcmV0dXJuIHhVbml0VmVjdG9yOyB9XG4gICAgZWxzZSBpZiAoeCA9PT0gMCAmJiB5ID09PSAxKSB7IHJldHVybiB5VW5pdFZlY3RvcjsgfVxuICAgIGVsc2UgeyByZXR1cm4gbmV3IFVuaXRWZWN0b3IoeCwgeSk7IH1cbn1cblxuLypcbiogQ3JlYXRlcyBhIHBvaW50IGluIHRoZSBoaW50aW5nIGVuZ2luZS5cbiovXG5mdW5jdGlvbiBIUG9pbnQoXG4gICAgeCxcbiAgICB5LFxuICAgIGxhc3RQb2ludE9mQ29udG91cixcbiAgICBvbkN1cnZlXG4pIHtcbiAgICB0aGlzLnggPSB0aGlzLnhvID0gTWF0aC5yb3VuZCh4ICogNjQpIC8gNjQ7IC8vIGhpbnRlZCB4IHZhbHVlIGFuZCBvcmlnaW5hbCB4LXZhbHVlXG4gICAgdGhpcy55ID0gdGhpcy55byA9IE1hdGgucm91bmQoeSAqIDY0KSAvIDY0OyAvLyBoaW50ZWQgeSB2YWx1ZSBhbmQgb3JpZ2luYWwgeS12YWx1ZVxuXG4gICAgdGhpcy5sYXN0UG9pbnRPZkNvbnRvdXIgPSBsYXN0UG9pbnRPZkNvbnRvdXI7XG4gICAgdGhpcy5vbkN1cnZlID0gb25DdXJ2ZTtcbiAgICB0aGlzLnByZXZQb2ludE9uQ29udG91ciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5leHRQb2ludE9uQ29udG91ciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnhUb3VjaGVkID0gZmFsc2U7XG4gICAgdGhpcy55VG91Y2hlZCA9IGZhbHNlO1xuXG4gICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHRoaXMpO1xufVxuXG4vKlxuKiBSZXR1cm5zIHRoZSBuZXh0IHRvdWNoZWQgcG9pbnQgb24gdGhlIGNvbnRvdXIuXG4qXG4qIHYgIC4uLiB1bml0IHZlY3RvciB0byB0ZXN0IHRvdWNoIGF4aXMuXG4qL1xuSFBvaW50LnByb3RvdHlwZS5uZXh0VG91Y2hlZCA9IGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcCA9IHRoaXMubmV4dFBvaW50T25Db250b3VyO1xuXG4gICAgd2hpbGUgKCF2LnRvdWNoZWQocCkgJiYgcCAhPT0gdGhpcykgeyBwID0gcC5uZXh0UG9pbnRPbkNvbnRvdXI7IH1cblxuICAgIHJldHVybiBwO1xufTtcblxuLypcbiogUmV0dXJucyB0aGUgcHJldmlvdXMgdG91Y2hlZCBwb2ludCBvbiB0aGUgY29udG91clxuKlxuKiB2ICAuLi4gdW5pdCB2ZWN0b3IgdG8gdGVzdCB0b3VjaCBheGlzLlxuKi9cbkhQb2ludC5wcm90b3R5cGUucHJldlRvdWNoZWQgPSBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHAgPSB0aGlzLnByZXZQb2ludE9uQ29udG91cjtcblxuICAgIHdoaWxlICghdi50b3VjaGVkKHApICYmIHAgIT09IHRoaXMpIHsgcCA9IHAucHJldlBvaW50T25Db250b3VyOyB9XG5cbiAgICByZXR1cm4gcDtcbn07XG5cbi8qXG4qIFRoZSB6ZXJvIHBvaW50LlxuKi9cbnZhciBIUFplcm8gPSBPYmplY3QuZnJlZXplKG5ldyBIUG9pbnQoMCwgMCkpO1xuXG4vKlxuKiBUaGUgZGVmYXVsdCBzdGF0ZSBvZiB0aGUgaW50ZXJwcmV0ZXIuXG4qXG4qIE5vdGU6IEZyZWV6aW5nIHRoZSBkZWZhdWx0U3RhdGUgYW5kIHRoZW4gZGVyaXZpbmcgZnJvbSBpdFxuKiBtYWtlcyB0aGUgVjggSmF2YXNjcmlwdCBlbmdpbmUgZ29pbmcgYXdrd2FyZCxcbiogc28gdGhpcyBpcyBhdm9pZGVkLCBhbGJlaXQgdGhlIGRlZmF1bHRTdGF0ZSBzaG91bGRuJ3RcbiogZXZlciBjaGFuZ2UuXG4qL1xudmFyIGRlZmF1bHRTdGF0ZSA9IHtcbiAgICBjdkN1dEluOiAxNyAvIDE2LCAgICAvLyBjb250cm9sIHZhbHVlIGN1dCBpblxuICAgIGRlbHRhQmFzZTogOSxcbiAgICBkZWx0YVNoaWZ0OiAwLjEyNSxcbiAgICBsb29wOiAxLCAgICAgICAgICAgICAvLyBsb29wcyBzb21lIGluc3RydWN0aW9uc1xuICAgIG1pbkRpczogMSwgICAgICAgICAgIC8vIG1pbmltdW0gZGlzdGFuY2VcbiAgICBhdXRvRmxpcDogdHJ1ZVxufTtcblxuLypcbiogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGludGVycHJldGVyLlxuKlxuKiBlbnYgIC4uLiAnZnBnbScgb3IgJ3ByZXAnIG9yICdnbHlmJ1xuKiBwcm9nIC4uLiB0aGUgcHJvZ3JhbVxuKi9cbmZ1bmN0aW9uIFN0YXRlKGVudiwgcHJvZykge1xuICAgIHRoaXMuZW52ID0gZW52O1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICB0aGlzLnByb2cgPSBwcm9nO1xuXG4gICAgc3dpdGNoIChlbnYpIHtcbiAgICAgICAgY2FzZSAnZ2x5ZicgOlxuICAgICAgICAgICAgdGhpcy56cDAgPSB0aGlzLnpwMSA9IHRoaXMuenAyID0gMTtcbiAgICAgICAgICAgIHRoaXMucnAwID0gdGhpcy5ycDEgPSB0aGlzLnJwMiA9IDA7XG4gICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAncHJlcCcgOlxuICAgICAgICAgICAgdGhpcy5mdiA9IHRoaXMucHYgPSB0aGlzLmRwdiA9IHhVbml0VmVjdG9yO1xuICAgICAgICAgICAgdGhpcy5yb3VuZCA9IHJvdW5kVG9HcmlkO1xuICAgIH1cbn1cblxuLypcbiogRXhlY3V0ZXMgYSBnbHlwaCBwcm9ncmFtLlxuKlxuKiBUaGlzIGRvZXMgdGhlIGhpbnRpbmcgZm9yIGVhY2ggZ2x5cGguXG4qXG4qIFJldHVybnMgYW4gYXJyYXkgb2YgbW92ZWQgcG9pbnRzLlxuKlxuKiBnbHlwaDogdGhlIGdseXBoIHRvIGhpbnRcbiogcHBlbTogdGhlIHNpemUgdGhlIGdseXBoIGlzIHJlbmRlcmVkIGZvclxuKi9cbkhpbnRpbmcucHJvdG90eXBlLmV4ZWMgPSBmdW5jdGlvbihnbHlwaCwgcHBlbSkge1xuICAgIGlmICh0eXBlb2YgcHBlbSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb2ludCBzaXplIGlzIG5vdCBhIG51bWJlciEnKTtcbiAgICB9XG5cbiAgICAvLyBSZWNlaXZlZCBhIGZhdGFsIGVycm9yLCBkb24ndCBkbyBhbnkgaGludGluZyBhbnltb3JlLlxuICAgIGlmICh0aGlzLl9lcnJvclN0YXRlID4gMikgeyByZXR1cm47IH1cblxuICAgIHZhciBmb250ID0gdGhpcy5mb250O1xuICAgIHZhciBwcmVwU3RhdGUgPSB0aGlzLl9wcmVwU3RhdGU7XG5cbiAgICBpZiAoIXByZXBTdGF0ZSB8fCBwcmVwU3RhdGUucHBlbSAhPT0gcHBlbSkge1xuICAgICAgICB2YXIgZnBnbVN0YXRlID0gdGhpcy5fZnBnbVN0YXRlO1xuXG4gICAgICAgIGlmICghZnBnbVN0YXRlKSB7XG4gICAgICAgICAgICAvLyBFeGVjdXRlcyB0aGUgZnBnbSBzdGF0ZS5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBieSBmb250cyB0byBkZWZpbmUgZnVuY3Rpb25zLlxuICAgICAgICAgICAgU3RhdGUucHJvdG90eXBlID0gZGVmYXVsdFN0YXRlO1xuXG4gICAgICAgICAgICBmcGdtU3RhdGUgPVxuICAgICAgICAgICAgdGhpcy5fZnBnbVN0YXRlID1cbiAgICAgICAgICAgICAgICBuZXcgU3RhdGUoJ2ZwZ20nLCBmb250LnRhYmxlcy5mcGdtKTtcblxuICAgICAgICAgICAgZnBnbVN0YXRlLmZ1bmNzID0gWyBdO1xuICAgICAgICAgICAgZnBnbVN0YXRlLmZvbnQgPSBmb250O1xuXG4gICAgICAgICAgICBpZiAoZXhwb3J0cy5ERUJVRykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCctLS1FWEVDIEZQR00tLS0nKTtcbiAgICAgICAgICAgICAgICBmcGdtU3RhdGUuc3RlcCA9IC0xO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGV4ZWMoZnBnbVN0YXRlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnSGludGluZyBlcnJvciBpbiBGUEdNOicgKyBlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvclN0YXRlID0gMztcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeGVjdXRlcyB0aGUgcHJlcCBwcm9ncmFtIGZvciB0aGlzIHBwZW0gc2V0dGluZy5cbiAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGJ5IGZvbnRzIHRvIHNldCBjdnQgdmFsdWVzXG4gICAgICAgIC8vIGRlcGVuZGluZyBvbiB0byBiZSByZW5kZXJlZCBmb250IHNpemUuXG5cbiAgICAgICAgU3RhdGUucHJvdG90eXBlID0gZnBnbVN0YXRlO1xuICAgICAgICBwcmVwU3RhdGUgPVxuICAgICAgICB0aGlzLl9wcmVwU3RhdGUgPVxuICAgICAgICAgICAgbmV3IFN0YXRlKCdwcmVwJywgZm9udC50YWJsZXMucHJlcCk7XG5cbiAgICAgICAgcHJlcFN0YXRlLnBwZW0gPSBwcGVtO1xuXG4gICAgICAgIC8vIENyZWF0ZXMgYSBjb3B5IG9mIHRoZSBjdnQgdGFibGVcbiAgICAgICAgLy8gYW5kIHNjYWxlcyBpdCB0byB0aGUgY3VycmVudCBwcGVtIHNldHRpbmcuXG4gICAgICAgIHZhciBvQ3Z0ID0gZm9udC50YWJsZXMuY3Z0O1xuICAgICAgICBpZiAob0N2dCkge1xuICAgICAgICAgICAgdmFyIGN2dCA9IHByZXBTdGF0ZS5jdnQgPSBuZXcgQXJyYXkob0N2dC5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHNjYWxlID0gcHBlbSAvIGZvbnQudW5pdHNQZXJFbTtcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgb0N2dC5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGN2dFtjXSA9IG9DdnRbY10gKiBzY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZXBTdGF0ZS5jdnQgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHBvcnRzLkRFQlVHKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tRVhFQyBQUkVQLS0tJyk7XG4gICAgICAgICAgICBwcmVwU3RhdGUuc3RlcCA9IC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGV4ZWMocHJlcFN0YXRlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Vycm9yU3RhdGUgPCAyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0hpbnRpbmcgZXJyb3IgaW4gUFJFUDonICsgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9lcnJvclN0YXRlID0gMjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9lcnJvclN0YXRlID4gMSkgeyByZXR1cm47IH1cblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBleGVjR2x5cGgoZ2x5cGgsIHByZXBTdGF0ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodGhpcy5fZXJyb3JTdGF0ZSA8IDEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdIaW50aW5nIGVycm9yOicgKyBlKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdOb3RlOiBmdXJ0aGVyIGhpbnRpbmcgZXJyb3JzIGFyZSBzaWxlbmNlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Vycm9yU3RhdGUgPSAxO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn07XG5cbi8qXG4qIEV4ZWN1dGVzIHRoZSBoaW50aW5nIHByb2dyYW0gZm9yIGEgZ2x5cGguXG4qL1xuZXhlY0dseXBoID0gZnVuY3Rpb24oZ2x5cGgsIHByZXBTdGF0ZSkge1xuICAgIC8vIG9yaWdpbmFsIHBvaW50IHBvc2l0aW9uc1xuICAgIHZhciB4U2NhbGUgPSBwcmVwU3RhdGUucHBlbSAvIHByZXBTdGF0ZS5mb250LnVuaXRzUGVyRW07XG4gICAgdmFyIHlTY2FsZSA9IHhTY2FsZTtcbiAgICB2YXIgY29tcG9uZW50cyA9IGdseXBoLmNvbXBvbmVudHM7XG4gICAgdmFyIGNvbnRvdXJzO1xuICAgIHZhciBnWm9uZTtcbiAgICB2YXIgc3RhdGU7XG5cbiAgICBTdGF0ZS5wcm90b3R5cGUgPSBwcmVwU3RhdGU7XG4gICAgaWYgKCFjb21wb25lbnRzKSB7XG4gICAgICAgIHN0YXRlID0gbmV3IFN0YXRlKCdnbHlmJywgZ2x5cGguaW5zdHJ1Y3Rpb25zKTtcbiAgICAgICAgaWYgKGV4cG9ydHMuREVCVUcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctLS1FWEVDIEdMWVBILS0tJyk7XG4gICAgICAgICAgICBzdGF0ZS5zdGVwID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY0NvbXBvbmVudChnbHlwaCwgc3RhdGUsIHhTY2FsZSwgeVNjYWxlKTtcbiAgICAgICAgZ1pvbmUgPSBzdGF0ZS5nWm9uZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZm9udCA9IHByZXBTdGF0ZS5mb250O1xuICAgICAgICBnWm9uZSA9IFtdO1xuICAgICAgICBjb250b3VycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjID0gY29tcG9uZW50c1tpXTtcbiAgICAgICAgICAgIHZhciBjZyA9IGZvbnQuZ2x5cGhzLmdldChjLmdseXBoSW5kZXgpO1xuXG4gICAgICAgICAgICBzdGF0ZSA9IG5ldyBTdGF0ZSgnZ2x5ZicsIGNnLmluc3RydWN0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmIChleHBvcnRzLkRFQlVHKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLUVYRUMgQ09NUCAnICsgaSArICctLS0nKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zdGVwID0gLTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4ZWNDb21wb25lbnQoY2csIHN0YXRlLCB4U2NhbGUsIHlTY2FsZSk7XG4gICAgICAgICAgICAvLyBhcHBlbmRzIHRoZSBjb21wdXRlZCBwb2ludHMgdG8gdGhlIHJlc3VsdCBhcnJheVxuICAgICAgICAgICAgLy8gcG9zdCBwcm9jZXNzZXMgdGhlIGNvbXBvbmVudCBwb2ludHNcbiAgICAgICAgICAgIHZhciBkeCA9IE1hdGgucm91bmQoYy5keCAqIHhTY2FsZSk7XG4gICAgICAgICAgICB2YXIgZHkgPSBNYXRoLnJvdW5kKGMuZHkgKiB5U2NhbGUpO1xuICAgICAgICAgICAgdmFyIGd6ID0gc3RhdGUuZ1pvbmU7XG4gICAgICAgICAgICB2YXIgY2MgPSBzdGF0ZS5jb250b3VycztcbiAgICAgICAgICAgIGZvciAodmFyIHBpID0gMDsgcGkgPCBnei5sZW5ndGg7IHBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcCA9IGd6W3BpXTtcbiAgICAgICAgICAgICAgICBwLnhUb3VjaGVkID0gcC55VG91Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHAueG8gPSBwLnggPSBwLnggKyBkeDtcbiAgICAgICAgICAgICAgICBwLnlvID0gcC55ID0gcC55ICsgZHk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBnTGVuID0gZ1pvbmUubGVuZ3RoO1xuICAgICAgICAgICAgZ1pvbmUucHVzaC5hcHBseShnWm9uZSwgZ3opO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjYy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnRvdXJzLnB1c2goY2Nbal0gKyBnTGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnbHlwaC5pbnN0cnVjdGlvbnMgJiYgIXN0YXRlLmluaGliaXRHcmlkRml0KSB7XG4gICAgICAgICAgICAvLyB0aGUgY29tcG9zaXRlIGhhcyBpbnN0cnVjdGlvbnMgb24gaXRzIG93blxuICAgICAgICAgICAgc3RhdGUgPSBuZXcgU3RhdGUoJ2dseWYnLCBnbHlwaC5pbnN0cnVjdGlvbnMpO1xuXG4gICAgICAgICAgICBzdGF0ZS5nWm9uZSA9IHN0YXRlLnowID0gc3RhdGUuejEgPSBzdGF0ZS56MiA9IGdab25lO1xuXG4gICAgICAgICAgICBzdGF0ZS5jb250b3VycyA9IGNvbnRvdXJzO1xuXG4gICAgICAgICAgICAvLyBub3RlOiBIUFplcm8gY2Fubm90IGJlIHVzZWQgaGVyZSwgc2luY2VcbiAgICAgICAgICAgIC8vICAgICAgIHRoZSBwb2ludCBtaWdodCBiZSBtb2RpZmllZFxuICAgICAgICAgICAgZ1pvbmUucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgSFBvaW50KDAsIDApLFxuICAgICAgICAgICAgICAgIG5ldyBIUG9pbnQoTWF0aC5yb3VuZChnbHlwaC5hZHZhbmNlV2lkdGggKiB4U2NhbGUpLCAwKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGV4cG9ydHMuREVCVUcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tRVhFQyBDT01QT1NJVEUtLS0nKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zdGVwID0gLTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4ZWMoc3RhdGUpO1xuXG4gICAgICAgICAgICBnWm9uZS5sZW5ndGggLT0gMjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBnWm9uZTtcbn07XG5cbi8qXG4qIEV4ZWN1dGVzIHRoZSBoaW50aW5nIHByb2dyYW0gZm9yIGEgY29tcG9uZW50IG9mIGEgbXVsdGktY29tcG9uZW50IGdseXBoXG4qIG9yIG9mIHRoZSBnbHlwaCBpdHNlbGYgYnkgYSBub24tY29tcG9uZW50IGdseXBoLlxuKi9cbmV4ZWNDb21wb25lbnQgPSBmdW5jdGlvbihnbHlwaCwgc3RhdGUsIHhTY2FsZSwgeVNjYWxlKVxue1xuICAgIHZhciBwb2ludHMgPSBnbHlwaC5wb2ludHMgfHwgW107XG4gICAgdmFyIHBMZW4gPSBwb2ludHMubGVuZ3RoO1xuICAgIHZhciBnWm9uZSA9IHN0YXRlLmdab25lID0gc3RhdGUuejAgPSBzdGF0ZS56MSA9IHN0YXRlLnoyID0gW107XG4gICAgdmFyIGNvbnRvdXJzID0gc3RhdGUuY29udG91cnMgPSBbXTtcblxuICAgIC8vIFNjYWxlcyB0aGUgb3JpZ2luYWwgcG9pbnRzIGFuZFxuICAgIC8vIG1ha2VzIGNvcGllcyBmb3IgdGhlIGhpbnRlZCBwb2ludHMuXG4gICAgdmFyIGNwOyAvLyBjdXJyZW50IHBvaW50XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwTGVuOyBpKyspIHtcbiAgICAgICAgY3AgPSBwb2ludHNbaV07XG5cbiAgICAgICAgZ1pvbmVbaV0gPSBuZXcgSFBvaW50KFxuICAgICAgICAgICAgY3AueCAqIHhTY2FsZSxcbiAgICAgICAgICAgIGNwLnkgKiB5U2NhbGUsXG4gICAgICAgICAgICBjcC5sYXN0UG9pbnRPZkNvbnRvdXIsXG4gICAgICAgICAgICBjcC5vbkN1cnZlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hhaW4gbGlua3MgdGhlIGNvbnRvdXJzLlxuICAgIHZhciBzcDsgLy8gc3RhcnQgcG9pbnRcbiAgICB2YXIgbnA7IC8vIG5leHQgcG9pbnRcblxuICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHBMZW47IGkkMSsrKSB7XG4gICAgICAgIGNwID0gZ1pvbmVbaSQxXTtcblxuICAgICAgICBpZiAoIXNwKSB7XG4gICAgICAgICAgICBzcCA9IGNwO1xuICAgICAgICAgICAgY29udG91cnMucHVzaChpJDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNwLmxhc3RQb2ludE9mQ29udG91cikge1xuICAgICAgICAgICAgY3AubmV4dFBvaW50T25Db250b3VyID0gc3A7XG4gICAgICAgICAgICBzcC5wcmV2UG9pbnRPbkNvbnRvdXIgPSBjcDtcbiAgICAgICAgICAgIHNwID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbnAgPSBnWm9uZVtpJDEgKyAxXTtcbiAgICAgICAgICAgIGNwLm5leHRQb2ludE9uQ29udG91ciA9IG5wO1xuICAgICAgICAgICAgbnAucHJldlBvaW50T25Db250b3VyID0gY3A7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuaW5oaWJpdEdyaWRGaXQpIHsgcmV0dXJuOyB9XG5cbiAgICBnWm9uZS5wdXNoKFxuICAgICAgICBuZXcgSFBvaW50KDAsIDApLFxuICAgICAgICBuZXcgSFBvaW50KE1hdGgucm91bmQoZ2x5cGguYWR2YW5jZVdpZHRoICogeFNjYWxlKSwgMClcbiAgICApO1xuXG4gICAgZXhlYyhzdGF0ZSk7XG5cbiAgICAvLyBSZW1vdmVzIHRoZSBleHRyYSBwb2ludHMuXG4gICAgZ1pvbmUubGVuZ3RoIC09IDI7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykge1xuICAgICAgICBjb25zb2xlLmxvZygnRklOSVNIRUQgR0xZUEgnLCBzdGF0ZS5zdGFjayk7XG4gICAgICAgIGZvciAodmFyIGkkMiA9IDA7IGkkMiA8IHBMZW47IGkkMisrKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhpJDIsIGdab25lW2kkMl0ueCwgZ1pvbmVbaSQyXS55KTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qXG4qIEV4ZWN1dGVzIHRoZSBwcm9ncmFtIGxvYWRlZCBpbiBzdGF0ZS5cbiovXG5leGVjID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgcHJvZyA9IHN0YXRlLnByb2c7XG5cbiAgICBpZiAoIXByb2cpIHsgcmV0dXJuOyB9XG5cbiAgICB2YXIgcExlbiA9IHByb2cubGVuZ3RoO1xuICAgIHZhciBpbnM7XG5cbiAgICBmb3IgKHN0YXRlLmlwID0gMDsgc3RhdGUuaXAgPCBwTGVuOyBzdGF0ZS5pcCsrKSB7XG4gICAgICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IHN0YXRlLnN0ZXArKzsgfVxuICAgICAgICBpbnMgPSBpbnN0cnVjdGlvblRhYmxlW3Byb2dbc3RhdGUuaXBdXTtcblxuICAgICAgICBpZiAoIWlucykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICd1bmtub3duIGluc3RydWN0aW9uOiAweCcgK1xuICAgICAgICAgICAgICAgIE51bWJlcihwcm9nW3N0YXRlLmlwXSkudG9TdHJpbmcoMTYpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5zKHN0YXRlKTtcblxuICAgICAgICAvLyB2ZXJ5IGV4dGVuc2l2ZSBkZWJ1Z2dpbmcgZm9yIGVhY2ggc3RlcFxuICAgICAgICAvKlxuICAgICAgICBpZiAoZXhwb3J0cy5ERUJVRykge1xuICAgICAgICAgICAgdmFyIGRhO1xuICAgICAgICAgICAgaWYgKHN0YXRlLmdab25lKSB7XG4gICAgICAgICAgICAgICAgZGEgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLmdab25lLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGEucHVzaChpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmdab25lW2ldLnggKiA2NCArICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5nWm9uZVtpXS55ICogNjQgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLmdab25lW2ldLnhUb3VjaGVkID8gJ3gnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS5nWm9uZVtpXS55VG91Y2hlZCA/ICd5JyA6ICcnKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR1onLCBkYSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZS50Wm9uZSkge1xuICAgICAgICAgICAgICAgIGRhID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0ZS50Wm9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBkYS5wdXNoKGkgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudFpvbmVbaV0ueCAqIDY0ICsgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnRab25lW2ldLnkgKiA2NCArICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUudFpvbmVbaV0ueFRvdWNoZWQgPyAneCcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLnRab25lW2ldLnlUb3VjaGVkID8gJ3knIDogJycpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUWicsIGRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0YXRlLnN0YWNrLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0YWNrLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgJy4uLicsIHN0YXRlLnN0YWNrLnNsaWNlKHN0YXRlLnN0YWNrLmxlbmd0aCAtIDEwKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHN0YXRlLnN0YWNrLmxlbmd0aCwgc3RhdGUuc3RhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICovXG4gICAgfVxufTtcblxuLypcbiogSW5pdGlhbGl6ZXMgdGhlIHR3aWxpZ2h0IHpvbmUuXG4qXG4qIFRoaXMgaXMgb25seSBkb25lIGlmIGEgU1pQeCBpbnN0cnVjdGlvblxuKiByZWZlcnMgdG8gdGhlIHR3aWxpZ2h0IHpvbmUuXG4qL1xuZnVuY3Rpb24gaW5pdFRab25lKHN0YXRlKVxue1xuICAgIHZhciB0Wm9uZSA9IHN0YXRlLnRab25lID0gbmV3IEFycmF5KHN0YXRlLmdab25lLmxlbmd0aCk7XG5cbiAgICAvLyBubyBpZGVhIGlmIHRoaXMgaXMgYWN0dWFsbHkgY29ycmVjdC4uLlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdFpvbmUubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICB0Wm9uZVtpXSA9IG5ldyBIUG9pbnQoMCwgMCk7XG4gICAgfVxufVxuXG4vKlxuKiBTa2lwcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhaGVhZCBvdmVyIGFuIElGL0VMU0UgYmxvY2suXG4qIGhhbmRsZUVsc2UgLi4gaWYgdHJ1ZSBicmVha3Mgb24gbWF0Y2hpbmcgRUxTRVxuKi9cbmZ1bmN0aW9uIHNraXAoc3RhdGUsIGhhbmRsZUVsc2UpXG57XG4gICAgdmFyIHByb2cgPSBzdGF0ZS5wcm9nO1xuICAgIHZhciBpcCA9IHN0YXRlLmlwO1xuICAgIHZhciBuZXN0aW5nID0gMTtcbiAgICB2YXIgaW5zO1xuXG4gICAgZG8ge1xuICAgICAgICBpbnMgPSBwcm9nWysraXBdO1xuICAgICAgICBpZiAoaW5zID09PSAweDU4KSAvLyBJRlxuICAgICAgICAgICAgeyBuZXN0aW5nKys7IH1cbiAgICAgICAgZWxzZSBpZiAoaW5zID09PSAweDU5KSAvLyBFSUZcbiAgICAgICAgICAgIHsgbmVzdGluZy0tOyB9XG4gICAgICAgIGVsc2UgaWYgKGlucyA9PT0gMHg0MCkgLy8gTlBVU0hCXG4gICAgICAgICAgICB7IGlwICs9IHByb2dbaXAgKyAxXSArIDE7IH1cbiAgICAgICAgZWxzZSBpZiAoaW5zID09PSAweDQxKSAvLyBOUFVTSFdcbiAgICAgICAgICAgIHsgaXAgKz0gMiAqIHByb2dbaXAgKyAxXSArIDE7IH1cbiAgICAgICAgZWxzZSBpZiAoaW5zID49IDB4QjAgJiYgaW5zIDw9IDB4QjcpIC8vIFBVU0hCXG4gICAgICAgICAgICB7IGlwICs9IGlucyAtIDB4QjAgKyAxOyB9XG4gICAgICAgIGVsc2UgaWYgKGlucyA+PSAweEI4ICYmIGlucyA8PSAweEJGKSAvLyBQVVNIV1xuICAgICAgICAgICAgeyBpcCArPSAoaW5zIC0gMHhCOCArIDEpICogMjsgfVxuICAgICAgICBlbHNlIGlmIChoYW5kbGVFbHNlICYmIG5lc3RpbmcgPT09IDEgJiYgaW5zID09PSAweDFCKSAvLyBFTFNFXG4gICAgICAgICAgICB7IGJyZWFrOyB9XG4gICAgfSB3aGlsZSAobmVzdGluZyA+IDApO1xuXG4gICAgc3RhdGUuaXAgPSBpcDtcbn1cblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlxuKiAgICAgICAgICBBbmQgdGhlbiBhIGxvdCBvZiBpbnN0cnVjdGlvbnMuLi4gICAgICAgICAgICAgICAgKlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vLyBTVlRDQVthXSBTZXQgZnJlZWRvbSBhbmQgcHJvamVjdGlvbiBWZWN0b3JzIFRvIENvb3JkaW5hdGUgQXhpc1xuLy8gMHgwMC0weDAxXG5mdW5jdGlvbiBTVlRDQSh2LCBzdGF0ZSkge1xuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTVlRDQVsnICsgdi5heGlzICsgJ10nKTsgfVxuXG4gICAgc3RhdGUuZnYgPSBzdGF0ZS5wdiA9IHN0YXRlLmRwdiA9IHY7XG59XG5cbi8vIFNQVlRDQVthXSBTZXQgUHJvamVjdGlvbiBWZWN0b3IgdG8gQ29vcmRpbmF0ZSBBeGlzXG4vLyAweDAyLTB4MDNcbmZ1bmN0aW9uIFNQVlRDQSh2LCBzdGF0ZSkge1xuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTUFZUQ0FbJyArIHYuYXhpcyArICddJyk7IH1cblxuICAgIHN0YXRlLnB2ID0gc3RhdGUuZHB2ID0gdjtcbn1cblxuLy8gU0ZWVENBW2FdIFNldCBGcmVlZG9tIFZlY3RvciB0byBDb29yZGluYXRlIEF4aXNcbi8vIDB4MDQtMHgwNVxuZnVuY3Rpb24gU0ZWVENBKHYsIHN0YXRlKSB7XG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1NGVlRDQVsnICsgdi5heGlzICsgJ10nKTsgfVxuXG4gICAgc3RhdGUuZnYgPSB2O1xufVxuXG4vLyBTUFZUTFthXSBTZXQgUHJvamVjdGlvbiBWZWN0b3IgVG8gTGluZVxuLy8gMHgwNi0weDA3XG5mdW5jdGlvbiBTUFZUTChhLCBzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBwMmkgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgcDFpID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHAyID0gc3RhdGUuejJbcDJpXTtcbiAgICB2YXIgcDEgPSBzdGF0ZS56MVtwMWldO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coJ1NQVlRMWycgKyBhICsgJ10nLCBwMmksIHAxaSk7IH1cblxuICAgIHZhciBkeDtcbiAgICB2YXIgZHk7XG5cbiAgICBpZiAoIWEpIHtcbiAgICAgICAgZHggPSBwMS54IC0gcDIueDtcbiAgICAgICAgZHkgPSBwMS55IC0gcDIueTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkeCA9IHAyLnkgLSBwMS55O1xuICAgICAgICBkeSA9IHAxLnggLSBwMi54O1xuICAgIH1cblxuICAgIHN0YXRlLnB2ID0gc3RhdGUuZHB2ID0gZ2V0VW5pdFZlY3RvcihkeCwgZHkpO1xufVxuXG4vLyBTRlZUTFthXSBTZXQgRnJlZWRvbSBWZWN0b3IgVG8gTGluZVxuLy8gMHgwOC0weDA5XG5mdW5jdGlvbiBTRlZUTChhLCBzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBwMmkgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgcDFpID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHAyID0gc3RhdGUuejJbcDJpXTtcbiAgICB2YXIgcDEgPSBzdGF0ZS56MVtwMWldO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coJ1NGVlRMWycgKyBhICsgJ10nLCBwMmksIHAxaSk7IH1cblxuICAgIHZhciBkeDtcbiAgICB2YXIgZHk7XG5cbiAgICBpZiAoIWEpIHtcbiAgICAgICAgZHggPSBwMS54IC0gcDIueDtcbiAgICAgICAgZHkgPSBwMS55IC0gcDIueTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkeCA9IHAyLnkgLSBwMS55O1xuICAgICAgICBkeSA9IHAxLnggLSBwMi54O1xuICAgIH1cblxuICAgIHN0YXRlLmZ2ID0gZ2V0VW5pdFZlY3RvcihkeCwgZHkpO1xufVxuXG4vLyBTUFZGU1tdIFNldCBQcm9qZWN0aW9uIFZlY3RvciBGcm9tIFN0YWNrXG4vLyAweDBBXG5mdW5jdGlvbiBTUFZGUyhzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciB5ID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHggPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTUFZGU1tdJywgeSwgeCk7IH1cblxuICAgIHN0YXRlLnB2ID0gc3RhdGUuZHB2ID0gZ2V0VW5pdFZlY3Rvcih4LCB5KTtcbn1cblxuLy8gU0ZWRlNbXSBTZXQgRnJlZWRvbSBWZWN0b3IgRnJvbSBTdGFja1xuLy8gMHgwQlxuZnVuY3Rpb24gU0ZWRlMoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgeSA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciB4ID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnU1BWRlNbXScsIHksIHgpOyB9XG5cbiAgICBzdGF0ZS5mdiA9IGdldFVuaXRWZWN0b3IoeCwgeSk7XG59XG5cbi8vIEdQVltdIEdldCBQcm9qZWN0aW9uIFZlY3RvclxuLy8gMHgwQ1xuZnVuY3Rpb24gR1BWKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIHB2ID0gc3RhdGUucHY7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnR1BWW10nKTsgfVxuXG4gICAgc3RhY2sucHVzaChwdi54ICogMHg0MDAwKTtcbiAgICBzdGFjay5wdXNoKHB2LnkgKiAweDQwMDApO1xufVxuXG4vLyBHRlZbXSBHZXQgRnJlZWRvbSBWZWN0b3Jcbi8vIDB4MENcbmZ1bmN0aW9uIEdGVihzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBmdiA9IHN0YXRlLmZ2O1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ0dGVltdJyk7IH1cblxuICAgIHN0YWNrLnB1c2goZnYueCAqIDB4NDAwMCk7XG4gICAgc3RhY2sucHVzaChmdi55ICogMHg0MDAwKTtcbn1cblxuLy8gU0ZWVFBWW10gU2V0IEZyZWVkb20gVmVjdG9yIFRvIFByb2plY3Rpb24gVmVjdG9yXG4vLyAweDBFXG5mdW5jdGlvbiBTRlZUUFYoc3RhdGUpIHtcbiAgICBzdGF0ZS5mdiA9IHN0YXRlLnB2O1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1NGVlRQVltdJyk7IH1cbn1cblxuLy8gSVNFQ1RbXSBtb3ZlcyBwb2ludCBwIHRvIHRoZSBJbnRlclNFQ1Rpb24gb2YgdHdvIGxpbmVzXG4vLyAweDBGXG5mdW5jdGlvbiBJU0VDVChzdGF0ZSlcbntcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgcGEwaSA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBwYTFpID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHBiMGkgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgcGIxaSA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBwaSA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciB6MCA9IHN0YXRlLnowO1xuICAgIHZhciB6MSA9IHN0YXRlLnoxO1xuICAgIHZhciBwYTAgPSB6MFtwYTBpXTtcbiAgICB2YXIgcGExID0gejBbcGExaV07XG4gICAgdmFyIHBiMCA9IHoxW3BiMGldO1xuICAgIHZhciBwYjEgPSB6MVtwYjFpXTtcbiAgICB2YXIgcCA9IHN0YXRlLnoyW3BpXTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKCdJU0VDVFtdLCAnLCBwYTBpLCBwYTFpLCBwYjBpLCBwYjFpLCBwaSk7IH1cblxuICAgIC8vIG1hdGggZnJvbVxuICAgIC8vIGVuLndpa2lwZWRpYS5vcmcvd2lraS9MaW5lJUUyJTgwJTkzbGluZV9pbnRlcnNlY3Rpb24jR2l2ZW5fdHdvX3BvaW50c19vbl9lYWNoX2xpbmVcblxuICAgIHZhciB4MSA9IHBhMC54O1xuICAgIHZhciB5MSA9IHBhMC55O1xuICAgIHZhciB4MiA9IHBhMS54O1xuICAgIHZhciB5MiA9IHBhMS55O1xuICAgIHZhciB4MyA9IHBiMC54O1xuICAgIHZhciB5MyA9IHBiMC55O1xuICAgIHZhciB4NCA9IHBiMS54O1xuICAgIHZhciB5NCA9IHBiMS55O1xuXG4gICAgdmFyIGRpdiA9ICh4MSAtIHgyKSAqICh5MyAtIHk0KSAtICh5MSAtIHkyKSAqICh4MyAtIHg0KTtcbiAgICB2YXIgZjEgPSB4MSAqIHkyIC0geTEgKiB4MjtcbiAgICB2YXIgZjIgPSB4MyAqIHk0IC0geTMgKiB4NDtcblxuICAgIHAueCA9IChmMSAqICh4MyAtIHg0KSAtIGYyICogKHgxIC0geDIpKSAvIGRpdjtcbiAgICBwLnkgPSAoZjEgKiAoeTMgLSB5NCkgLSBmMiAqICh5MSAtIHkyKSkgLyBkaXY7XG59XG5cbi8vIFNSUDBbXSBTZXQgUmVmZXJlbmNlIFBvaW50IDBcbi8vIDB4MTBcbmZ1bmN0aW9uIFNSUDAoc3RhdGUpIHtcbiAgICBzdGF0ZS5ycDAgPSBzdGF0ZS5zdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTUlAwW10nLCBzdGF0ZS5ycDApOyB9XG59XG5cbi8vIFNSUDFbXSBTZXQgUmVmZXJlbmNlIFBvaW50IDFcbi8vIDB4MTFcbmZ1bmN0aW9uIFNSUDEoc3RhdGUpIHtcbiAgICBzdGF0ZS5ycDEgPSBzdGF0ZS5zdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTUlAxW10nLCBzdGF0ZS5ycDEpOyB9XG59XG5cbi8vIFNSUDFbXSBTZXQgUmVmZXJlbmNlIFBvaW50IDJcbi8vIDB4MTJcbmZ1bmN0aW9uIFNSUDIoc3RhdGUpIHtcbiAgICBzdGF0ZS5ycDIgPSBzdGF0ZS5zdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTUlAyW10nLCBzdGF0ZS5ycDIpOyB9XG59XG5cbi8vIFNaUDBbXSBTZXQgWm9uZSBQb2ludGVyIDBcbi8vIDB4MTNcbmZ1bmN0aW9uIFNaUDAoc3RhdGUpIHtcbiAgICB2YXIgbiA9IHN0YXRlLnN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1NaUDBbXScsIG4pOyB9XG5cbiAgICBzdGF0ZS56cDAgPSBuO1xuXG4gICAgc3dpdGNoIChuKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGlmICghc3RhdGUudFpvbmUpIHsgaW5pdFRab25lKHN0YXRlKTsgfVxuICAgICAgICAgICAgc3RhdGUuejAgPSBzdGF0ZS50Wm9uZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEgOlxuICAgICAgICAgICAgc3RhdGUuejAgPSBzdGF0ZS5nWm9uZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0IDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB6b25lIHBvaW50ZXInKTtcbiAgICB9XG59XG5cbi8vIFNaUDFbXSBTZXQgWm9uZSBQb2ludGVyIDFcbi8vIDB4MTRcbmZ1bmN0aW9uIFNaUDEoc3RhdGUpIHtcbiAgICB2YXIgbiA9IHN0YXRlLnN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1NaUDFbXScsIG4pOyB9XG5cbiAgICBzdGF0ZS56cDEgPSBuO1xuXG4gICAgc3dpdGNoIChuKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGlmICghc3RhdGUudFpvbmUpIHsgaW5pdFRab25lKHN0YXRlKTsgfVxuICAgICAgICAgICAgc3RhdGUuejEgPSBzdGF0ZS50Wm9uZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEgOlxuICAgICAgICAgICAgc3RhdGUuejEgPSBzdGF0ZS5nWm9uZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0IDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB6b25lIHBvaW50ZXInKTtcbiAgICB9XG59XG5cbi8vIFNaUDJbXSBTZXQgWm9uZSBQb2ludGVyIDJcbi8vIDB4MTVcbmZ1bmN0aW9uIFNaUDIoc3RhdGUpIHtcbiAgICB2YXIgbiA9IHN0YXRlLnN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1NaUDJbXScsIG4pOyB9XG5cbiAgICBzdGF0ZS56cDIgPSBuO1xuXG4gICAgc3dpdGNoIChuKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGlmICghc3RhdGUudFpvbmUpIHsgaW5pdFRab25lKHN0YXRlKTsgfVxuICAgICAgICAgICAgc3RhdGUuejIgPSBzdGF0ZS50Wm9uZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEgOlxuICAgICAgICAgICAgc3RhdGUuejIgPSBzdGF0ZS5nWm9uZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0IDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB6b25lIHBvaW50ZXInKTtcbiAgICB9XG59XG5cbi8vIFNaUFNbXSBTZXQgWm9uZSBQb2ludGVyU1xuLy8gMHgxNlxuZnVuY3Rpb24gU1pQUyhzdGF0ZSkge1xuICAgIHZhciBuID0gc3RhdGUuc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnU1pQU1tdJywgbik7IH1cblxuICAgIHN0YXRlLnpwMCA9IHN0YXRlLnpwMSA9IHN0YXRlLnpwMiA9IG47XG5cbiAgICBzd2l0Y2ggKG4pIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaWYgKCFzdGF0ZS50Wm9uZSkgeyBpbml0VFpvbmUoc3RhdGUpOyB9XG4gICAgICAgICAgICBzdGF0ZS56MCA9IHN0YXRlLnoxID0gc3RhdGUuejIgPSBzdGF0ZS50Wm9uZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEgOlxuICAgICAgICAgICAgc3RhdGUuejAgPSBzdGF0ZS56MSA9IHN0YXRlLnoyID0gc3RhdGUuZ1pvbmU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdCA6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgem9uZSBwb2ludGVyJyk7XG4gICAgfVxufVxuXG4vLyBTTE9PUFtdIFNldCBMT09QIHZhcmlhYmxlXG4vLyAweDE3XG5mdW5jdGlvbiBTTE9PUChzdGF0ZSkge1xuICAgIHN0YXRlLmxvb3AgPSBzdGF0ZS5zdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTTE9PUFtdJywgc3RhdGUubG9vcCk7IH1cbn1cblxuLy8gUlRHW10gUm91bmQgVG8gR3JpZFxuLy8gMHgxOFxuZnVuY3Rpb24gUlRHKHN0YXRlKSB7XG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1JUR1tdJyk7IH1cblxuICAgIHN0YXRlLnJvdW5kID0gcm91bmRUb0dyaWQ7XG59XG5cbi8vIFJUSEdbXSBSb3VuZCBUbyBIYWxmIEdyaWRcbi8vIDB4MTlcbmZ1bmN0aW9uIFJUSEcoc3RhdGUpIHtcbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnUlRIR1tdJyk7IH1cblxuICAgIHN0YXRlLnJvdW5kID0gcm91bmRUb0hhbGZHcmlkO1xufVxuXG4vLyBTTURbXSBTZXQgTWluaW11bSBEaXN0YW5jZVxuLy8gMHgxQVxuZnVuY3Rpb24gU01EKHN0YXRlKSB7XG4gICAgdmFyIGQgPSBzdGF0ZS5zdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTTURbXScsIGQpOyB9XG5cbiAgICBzdGF0ZS5taW5EaXMgPSBkIC8gMHg0MDtcbn1cblxuLy8gRUxTRVtdIEVMU0UgY2xhdXNlXG4vLyAweDFCXG5mdW5jdGlvbiBFTFNFKHN0YXRlKSB7XG4gICAgLy8gVGhpcyBpbnN0cnVjdGlvbiBoYXMgYmVlbiByZWFjaGVkIGJ5IGV4ZWN1dGluZyBhIHRoZW4gYnJhbmNoXG4gICAgLy8gc28gaXQganVzdCBza2lwcyBhaGVhZCB1bnRpbCBtYXRjaGluZyBFSUYuXG4gICAgLy9cbiAgICAvLyBJbiBjYXNlIHRoZSBJRiB3YXMgbmVnYXRpdmUgdGhlIElGW10gaW5zdHJ1Y3Rpb24gYWxyZWFkeVxuICAgIC8vIHNraXBwZWQgZm9yd2FyZCBvdmVyIHRoZSBFTFNFW11cblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdFTFNFW10nKTsgfVxuXG4gICAgc2tpcChzdGF0ZSwgZmFsc2UpO1xufVxuXG4vLyBKTVBSW10gSnVNUCBSZWxhdGl2ZVxuLy8gMHgxQ1xuZnVuY3Rpb24gSk1QUihzdGF0ZSkge1xuICAgIHZhciBvID0gc3RhdGUuc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnSk1QUltdJywgbyk7IH1cblxuICAgIC8vIEEganVtcCBieSAxIHdvdWxkIGRvIG5vdGhpbmcuXG4gICAgc3RhdGUuaXAgKz0gbyAtIDE7XG59XG5cbi8vIFNDVlRDSVtdIFNldCBDb250cm9sIFZhbHVlIFRhYmxlIEN1dC1JblxuLy8gMHgxRFxuZnVuY3Rpb24gU0NWVENJKHN0YXRlKSB7XG4gICAgdmFyIG4gPSBzdGF0ZS5zdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTQ1ZUQ0lbXScsIG4pOyB9XG5cbiAgICBzdGF0ZS5jdkN1dEluID0gbiAvIDB4NDA7XG59XG5cbi8vIERVUFtdIERVUGxpY2F0ZSB0b3Agc3RhY2sgZWxlbWVudFxuLy8gMHgyMFxuZnVuY3Rpb24gRFVQKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnRFVQW10nKTsgfVxuXG4gICAgc3RhY2sucHVzaChzdGFja1tzdGFjay5sZW5ndGggLSAxXSk7XG59XG5cbi8vIFBPUFtdIFBPUCB0b3Agc3RhY2sgZWxlbWVudFxuLy8gMHgyMVxuZnVuY3Rpb24gUE9QKHN0YXRlKSB7XG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1BPUFtdJyk7IH1cblxuICAgIHN0YXRlLnN0YWNrLnBvcCgpO1xufVxuXG4vLyBDTEVBUltdIENMRUFSIHRoZSBzdGFja1xuLy8gMHgyMlxuZnVuY3Rpb24gQ0xFQVIoc3RhdGUpIHtcbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnQ0xFQVJbXScpOyB9XG5cbiAgICBzdGF0ZS5zdGFjay5sZW5ndGggPSAwO1xufVxuXG4vLyBTV0FQW10gU1dBUCB0aGUgdG9wIHR3byBlbGVtZW50cyBvbiB0aGUgc3RhY2tcbi8vIDB4MjNcbmZ1bmN0aW9uIFNXQVAoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcblxuICAgIHZhciBhID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIGIgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTV0FQW10nKTsgfVxuXG4gICAgc3RhY2sucHVzaChhKTtcbiAgICBzdGFjay5wdXNoKGIpO1xufVxuXG4vLyBERVBUSFtdIERFUFRIIG9mIHRoZSBzdGFja1xuLy8gMHgyNFxuZnVuY3Rpb24gREVQVEgoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdERVBUSFtdJyk7IH1cblxuICAgIHN0YWNrLnB1c2goc3RhY2subGVuZ3RoKTtcbn1cblxuLy8gTE9PUENBTExbXSBMT09QQ0FMTCBmdW5jdGlvblxuLy8gMHgyQVxuZnVuY3Rpb24gTE9PUENBTEwoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgZm4gPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgYyA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ0xPT1BDQUxMW10nLCBmbiwgYyk7IH1cblxuICAgIC8vIHNhdmVzIGNhbGxlcnMgcHJvZ3JhbVxuICAgIHZhciBjaXAgPSBzdGF0ZS5pcDtcbiAgICB2YXIgY3Byb2cgPSBzdGF0ZS5wcm9nO1xuXG4gICAgc3RhdGUucHJvZyA9IHN0YXRlLmZ1bmNzW2ZuXTtcblxuICAgIC8vIGV4ZWN1dGVzIHRoZSBmdW5jdGlvblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYzsgaSsrKSB7XG4gICAgICAgIGV4ZWMoc3RhdGUpO1xuXG4gICAgICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgKytzdGF0ZS5zdGVwLFxuICAgICAgICAgICAgaSArIDEgPCBjID8gJ25leHQgbG9vcGNhbGwnIDogJ2RvbmUgbG9vcGNhbGwnLFxuICAgICAgICAgICAgaVxuICAgICAgICApOyB9XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZXMgdGhlIGNhbGxlcnMgcHJvZ3JhbVxuICAgIHN0YXRlLmlwID0gY2lwO1xuICAgIHN0YXRlLnByb2cgPSBjcHJvZztcbn1cblxuLy8gQ0FMTFtdIENBTEwgZnVuY3Rpb25cbi8vIDB4MkJcbmZ1bmN0aW9uIENBTEwoc3RhdGUpIHtcbiAgICB2YXIgZm4gPSBzdGF0ZS5zdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdDQUxMW10nLCBmbik7IH1cblxuICAgIC8vIHNhdmVzIGNhbGxlcnMgcHJvZ3JhbVxuICAgIHZhciBjaXAgPSBzdGF0ZS5pcDtcbiAgICB2YXIgY3Byb2cgPSBzdGF0ZS5wcm9nO1xuXG4gICAgc3RhdGUucHJvZyA9IHN0YXRlLmZ1bmNzW2ZuXTtcblxuICAgIC8vIGV4ZWN1dGVzIHRoZSBmdW5jdGlvblxuICAgIGV4ZWMoc3RhdGUpO1xuXG4gICAgLy8gcmVzdG9yZXMgdGhlIGNhbGxlcnMgcHJvZ3JhbVxuICAgIHN0YXRlLmlwID0gY2lwO1xuICAgIHN0YXRlLnByb2cgPSBjcHJvZztcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKCsrc3RhdGUuc3RlcCwgJ3JldHVybmluZyBmcm9tJywgZm4pOyB9XG59XG5cbi8vIENJTkRFWFtdIENvcHkgdGhlIElOREVYZWQgZWxlbWVudCB0byB0aGUgdG9wIG9mIHRoZSBzdGFja1xuLy8gMHgyNVxuZnVuY3Rpb24gQ0lOREVYKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIGsgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdDSU5ERVhbXScsIGspOyB9XG5cbiAgICAvLyBJbiBjYXNlIG9mIGsgPT0gMSwgaXQgY29waWVzIHRoZSBsYXN0IGVsZW1lbnQgYWZ0ZXIgcG9wcGluZ1xuICAgIC8vIHRodXMgc3RhY2subGVuZ3RoIC0gay5cbiAgICBzdGFjay5wdXNoKHN0YWNrW3N0YWNrLmxlbmd0aCAtIGtdKTtcbn1cblxuLy8gTUlOREVYW10gTW92ZSB0aGUgSU5ERVhlZCBlbGVtZW50IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrXG4vLyAweDI2XG5mdW5jdGlvbiBNSU5ERVgoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgayA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ01JTkRFWFtdJywgayk7IH1cblxuICAgIHN0YWNrLnB1c2goc3RhY2suc3BsaWNlKHN0YWNrLmxlbmd0aCAtIGssIDEpWzBdKTtcbn1cblxuLy8gRkRFRltdIEZ1bmN0aW9uIERFRmluaXRpb25cbi8vIDB4MkNcbmZ1bmN0aW9uIEZERUYoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuZW52ICE9PSAnZnBnbScpIHsgdGhyb3cgbmV3IEVycm9yKCdGREVGIG5vdCBhbGxvd2VkIGhlcmUnKTsgfVxuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBwcm9nID0gc3RhdGUucHJvZztcbiAgICB2YXIgaXAgPSBzdGF0ZS5pcDtcblxuICAgIHZhciBmbiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBpcEJlZ2luID0gaXA7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnRkRFRltdJywgZm4pOyB9XG5cbiAgICB3aGlsZSAocHJvZ1srK2lwXSAhPT0gMHgyRCl7ICB9XG5cbiAgICBzdGF0ZS5pcCA9IGlwO1xuICAgIHN0YXRlLmZ1bmNzW2ZuXSA9IHByb2cuc2xpY2UoaXBCZWdpbiArIDEsIGlwKTtcbn1cblxuLy8gTURBUFthXSBNb3ZlIERpcmVjdCBBYnNvbHV0ZSBQb2ludFxuLy8gMHgyRS0weDJGXG5mdW5jdGlvbiBNREFQKHJvdW5kLCBzdGF0ZSkge1xuICAgIHZhciBwaSA9IHN0YXRlLnN0YWNrLnBvcCgpO1xuICAgIHZhciBwID0gc3RhdGUuejBbcGldO1xuICAgIHZhciBmdiA9IHN0YXRlLmZ2O1xuICAgIHZhciBwdiA9IHN0YXRlLnB2O1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ01EQVBbJyArIHJvdW5kICsgJ10nLCBwaSk7IH1cblxuICAgIHZhciBkID0gcHYuZGlzdGFuY2UocCwgSFBaZXJvKTtcblxuICAgIGlmIChyb3VuZCkgeyBkID0gc3RhdGUucm91bmQoZCk7IH1cblxuICAgIGZ2LnNldFJlbGF0aXZlKHAsIEhQWmVybywgZCwgcHYpO1xuICAgIGZ2LnRvdWNoKHApO1xuXG4gICAgc3RhdGUucnAwID0gc3RhdGUucnAxID0gcGk7XG59XG5cbi8vIElVUFthXSBJbnRlcnBvbGF0ZSBVbnRvdWNoZWQgUG9pbnRzIHRocm91Z2ggdGhlIG91dGxpbmVcbi8vIDB4MzBcbmZ1bmN0aW9uIElVUCh2LCBzdGF0ZSkge1xuICAgIHZhciB6MiA9IHN0YXRlLnoyO1xuICAgIHZhciBwTGVuID0gejIubGVuZ3RoIC0gMjtcbiAgICB2YXIgY3A7XG4gICAgdmFyIHBwO1xuICAgIHZhciBucDtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdJVVBbJyArIHYuYXhpcyArICddJyk7IH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcExlbjsgaSsrKSB7XG4gICAgICAgIGNwID0gejJbaV07IC8vIGN1cnJlbnQgcG9pbnRcblxuICAgICAgICAvLyBpZiB0aGlzIHBvaW50IGhhcyBiZWVuIHRvdWNoZWQgZ28gb25cbiAgICAgICAgaWYgKHYudG91Y2hlZChjcCkpIHsgY29udGludWU7IH1cblxuICAgICAgICBwcCA9IGNwLnByZXZUb3VjaGVkKHYpO1xuXG4gICAgICAgIC8vIG5vIHBvaW50IG9uIHRoZSBjb250b3VyIGhhcyBiZWVuIHRvdWNoZWQ/XG4gICAgICAgIGlmIChwcCA9PT0gY3ApIHsgY29udGludWU7IH1cblxuICAgICAgICBucCA9IGNwLm5leHRUb3VjaGVkKHYpO1xuXG4gICAgICAgIGlmIChwcCA9PT0gbnApIHtcbiAgICAgICAgICAgIC8vIG9ubHkgb25lIHBvaW50IG9uIHRoZSBjb250b3VyIGhhcyBiZWVuIHRvdWNoZWRcbiAgICAgICAgICAgIC8vIHNvIHNpbXBseSBtb3ZlcyB0aGUgcG9pbnQgbGlrZSB0aGF0XG5cbiAgICAgICAgICAgIHYuc2V0UmVsYXRpdmUoY3AsIGNwLCB2LmRpc3RhbmNlKHBwLCBwcCwgZmFsc2UsIHRydWUpLCB2LCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHYuaW50ZXJwb2xhdGUoY3AsIHBwLCBucCwgdik7XG4gICAgfVxufVxuXG4vLyBTSFBbXSBTSGlmdCBQb2ludCB1c2luZyByZWZlcmVuY2UgcG9pbnRcbi8vIDB4MzItMHgzM1xuZnVuY3Rpb24gU0hQKGEsIHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIHJwaSA9IGEgPyBzdGF0ZS5ycDEgOiBzdGF0ZS5ycDI7XG4gICAgdmFyIHJwID0gKGEgPyBzdGF0ZS56MCA6IHN0YXRlLnoxKVtycGldO1xuICAgIHZhciBmdiA9IHN0YXRlLmZ2O1xuICAgIHZhciBwdiA9IHN0YXRlLnB2O1xuICAgIHZhciBsb29wID0gc3RhdGUubG9vcDtcbiAgICB2YXIgejIgPSBzdGF0ZS56MjtcblxuICAgIHdoaWxlIChsb29wLS0pXG4gICAge1xuICAgICAgICB2YXIgcGkgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmFyIHAgPSB6MltwaV07XG5cbiAgICAgICAgdmFyIGQgPSBwdi5kaXN0YW5jZShycCwgcnAsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgZnYuc2V0UmVsYXRpdmUocCwgcCwgZCwgcHYpO1xuICAgICAgICBmdi50b3VjaChwKTtcblxuICAgICAgICBpZiAoZXhwb3J0cy5ERUJVRykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgc3RhdGUuc3RlcCxcbiAgICAgICAgICAgICAgICAoc3RhdGUubG9vcCA+IDEgP1xuICAgICAgICAgICAgICAgICAgICdsb29wICcgKyAoc3RhdGUubG9vcCAtIGxvb3ApICsgJzogJyA6XG4gICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgICAnU0hQWycgKyAoYSA/ICdycDEnIDogJ3JwMicpICsgJ10nLCBwaVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRlLmxvb3AgPSAxO1xufVxuXG4vLyBTSENbXSBTSGlmdCBDb250b3VyIHVzaW5nIHJlZmVyZW5jZSBwb2ludFxuLy8gMHgzNi0weDM3XG5mdW5jdGlvbiBTSEMoYSwgc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgcnBpID0gYSA/IHN0YXRlLnJwMSA6IHN0YXRlLnJwMjtcbiAgICB2YXIgcnAgPSAoYSA/IHN0YXRlLnowIDogc3RhdGUuejEpW3JwaV07XG4gICAgdmFyIGZ2ID0gc3RhdGUuZnY7XG4gICAgdmFyIHB2ID0gc3RhdGUucHY7XG4gICAgdmFyIGNpID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHNwID0gc3RhdGUuejJbc3RhdGUuY29udG91cnNbY2ldXTtcbiAgICB2YXIgcCA9IHNwO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1NIQ1snICsgYSArICddJywgY2kpOyB9XG5cbiAgICB2YXIgZCA9IHB2LmRpc3RhbmNlKHJwLCBycCwgZmFsc2UsIHRydWUpO1xuXG4gICAgZG8ge1xuICAgICAgICBpZiAocCAhPT0gcnApIHsgZnYuc2V0UmVsYXRpdmUocCwgcCwgZCwgcHYpOyB9XG4gICAgICAgIHAgPSBwLm5leHRQb2ludE9uQ29udG91cjtcbiAgICB9IHdoaWxlIChwICE9PSBzcCk7XG59XG5cbi8vIFNIWltdIFNIaWZ0IFpvbmUgdXNpbmcgcmVmZXJlbmNlIHBvaW50XG4vLyAweDM2LTB4MzdcbmZ1bmN0aW9uIFNIWihhLCBzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBycGkgPSBhID8gc3RhdGUucnAxIDogc3RhdGUucnAyO1xuICAgIHZhciBycCA9IChhID8gc3RhdGUuejAgOiBzdGF0ZS56MSlbcnBpXTtcbiAgICB2YXIgZnYgPSBzdGF0ZS5mdjtcbiAgICB2YXIgcHYgPSBzdGF0ZS5wdjtcblxuICAgIHZhciBlID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnU0haWycgKyBhICsgJ10nLCBlKTsgfVxuXG4gICAgdmFyIHo7XG4gICAgc3dpdGNoIChlKSB7XG4gICAgICAgIGNhc2UgMCA6IHogPSBzdGF0ZS50Wm9uZTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMSA6IHogPSBzdGF0ZS5nWm9uZTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQgOiB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgem9uZScpO1xuICAgIH1cblxuICAgIHZhciBwO1xuICAgIHZhciBkID0gcHYuZGlzdGFuY2UocnAsIHJwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgdmFyIHBMZW4gPSB6Lmxlbmd0aCAtIDI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwTGVuOyBpKyspXG4gICAge1xuICAgICAgICBwID0geltpXTtcbiAgICAgICAgaWYgKHAgIT09IHJwKSB7IGZ2LnNldFJlbGF0aXZlKHAsIHAsIGQsIHB2KTsgfVxuICAgIH1cbn1cblxuLy8gU0hQSVhbXSBTSGlmdCBwb2ludCBieSBhIFBJWGVsIGFtb3VudFxuLy8gMHgzOFxuZnVuY3Rpb24gU0hQSVgoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgbG9vcCA9IHN0YXRlLmxvb3A7XG4gICAgdmFyIGZ2ID0gc3RhdGUuZnY7XG4gICAgdmFyIGQgPSBzdGFjay5wb3AoKSAvIDB4NDA7XG4gICAgdmFyIHoyID0gc3RhdGUuejI7XG5cbiAgICB3aGlsZSAobG9vcC0tKSB7XG4gICAgICAgIHZhciBwaSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB2YXIgcCA9IHoyW3BpXTtcblxuICAgICAgICBpZiAoZXhwb3J0cy5ERUJVRykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgc3RhdGUuc3RlcCxcbiAgICAgICAgICAgICAgICAoc3RhdGUubG9vcCA+IDEgPyAnbG9vcCAnICsgKHN0YXRlLmxvb3AgLSBsb29wKSArICc6ICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICdTSFBJWFtdJywgcGksIGRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmdi5zZXRSZWxhdGl2ZShwLCBwLCBkKTtcbiAgICAgICAgZnYudG91Y2gocCk7XG4gICAgfVxuXG4gICAgc3RhdGUubG9vcCA9IDE7XG59XG5cbi8vIElQW10gSW50ZXJwb2xhdGUgUG9pbnRcbi8vIDB4MzlcbmZ1bmN0aW9uIElQKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIHJwMWkgPSBzdGF0ZS5ycDE7XG4gICAgdmFyIHJwMmkgPSBzdGF0ZS5ycDI7XG4gICAgdmFyIGxvb3AgPSBzdGF0ZS5sb29wO1xuICAgIHZhciBycDEgPSBzdGF0ZS56MFtycDFpXTtcbiAgICB2YXIgcnAyID0gc3RhdGUuejFbcnAyaV07XG4gICAgdmFyIGZ2ID0gc3RhdGUuZnY7XG4gICAgdmFyIHB2ID0gc3RhdGUuZHB2O1xuICAgIHZhciB6MiA9IHN0YXRlLnoyO1xuXG4gICAgd2hpbGUgKGxvb3AtLSkge1xuICAgICAgICB2YXIgcGkgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmFyIHAgPSB6MltwaV07XG5cbiAgICAgICAgaWYgKGV4cG9ydHMuREVCVUcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIHN0YXRlLnN0ZXAsXG4gICAgICAgICAgICAgICAgKHN0YXRlLmxvb3AgPiAxID8gJ2xvb3AgJyArIChzdGF0ZS5sb29wIC0gbG9vcCkgKyAnOiAnIDogJycpICtcbiAgICAgICAgICAgICAgICAnSVBbXScsIHBpLCBycDFpLCAnPC0+JywgcnAyaVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ2LmludGVycG9sYXRlKHAsIHJwMSwgcnAyLCBwdik7XG5cbiAgICAgICAgZnYudG91Y2gocCk7XG4gICAgfVxuXG4gICAgc3RhdGUubG9vcCA9IDE7XG59XG5cbi8vIE1TSVJQW2FdIE1vdmUgU3RhY2sgSW5kaXJlY3QgUmVsYXRpdmUgUG9pbnRcbi8vIDB4M0EtMHgzQlxuZnVuY3Rpb24gTVNJUlAoYSwgc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgZCA9IHN0YWNrLnBvcCgpIC8gNjQ7XG4gICAgdmFyIHBpID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHAgPSBzdGF0ZS56MVtwaV07XG4gICAgdmFyIHJwMCA9IHN0YXRlLnowW3N0YXRlLnJwMF07XG4gICAgdmFyIGZ2ID0gc3RhdGUuZnY7XG4gICAgdmFyIHB2ID0gc3RhdGUucHY7XG5cbiAgICBmdi5zZXRSZWxhdGl2ZShwLCBycDAsIGQsIHB2KTtcbiAgICBmdi50b3VjaChwKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdNU0lSUFsnICsgYSArICddJywgZCwgcGkpOyB9XG5cbiAgICBzdGF0ZS5ycDEgPSBzdGF0ZS5ycDA7XG4gICAgc3RhdGUucnAyID0gcGk7XG4gICAgaWYgKGEpIHsgc3RhdGUucnAwID0gcGk7IH1cbn1cblxuLy8gQUxJR05SUFtdIEFsaWduIHRvIHJlZmVyZW5jZSBwb2ludC5cbi8vIDB4M0NcbmZ1bmN0aW9uIEFMSUdOUlAoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgcnAwaSA9IHN0YXRlLnJwMDtcbiAgICB2YXIgcnAwID0gc3RhdGUuejBbcnAwaV07XG4gICAgdmFyIGxvb3AgPSBzdGF0ZS5sb29wO1xuICAgIHZhciBmdiA9IHN0YXRlLmZ2O1xuICAgIHZhciBwdiA9IHN0YXRlLnB2O1xuICAgIHZhciB6MSA9IHN0YXRlLnoxO1xuXG4gICAgd2hpbGUgKGxvb3AtLSkge1xuICAgICAgICB2YXIgcGkgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmFyIHAgPSB6MVtwaV07XG5cbiAgICAgICAgaWYgKGV4cG9ydHMuREVCVUcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIHN0YXRlLnN0ZXAsXG4gICAgICAgICAgICAgICAgKHN0YXRlLmxvb3AgPiAxID8gJ2xvb3AgJyArIChzdGF0ZS5sb29wIC0gbG9vcCkgKyAnOiAnIDogJycpICtcbiAgICAgICAgICAgICAgICAnQUxJR05SUFtdJywgcGlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmdi5zZXRSZWxhdGl2ZShwLCBycDAsIDAsIHB2KTtcbiAgICAgICAgZnYudG91Y2gocCk7XG4gICAgfVxuXG4gICAgc3RhdGUubG9vcCA9IDE7XG59XG5cbi8vIFJUR1tdIFJvdW5kIFRvIERvdWJsZSBHcmlkXG4vLyAweDNEXG5mdW5jdGlvbiBSVERHKHN0YXRlKSB7XG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1JUREdbXScpOyB9XG5cbiAgICBzdGF0ZS5yb3VuZCA9IHJvdW5kVG9Eb3VibGVHcmlkO1xufVxuXG4vLyBNSUFQW2FdIE1vdmUgSW5kaXJlY3QgQWJzb2x1dGUgUG9pbnRcbi8vIDB4M0UtMHgzRlxuZnVuY3Rpb24gTUlBUChyb3VuZCwgc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgbiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBwaSA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBwID0gc3RhdGUuejBbcGldO1xuICAgIHZhciBmdiA9IHN0YXRlLmZ2O1xuICAgIHZhciBwdiA9IHN0YXRlLnB2O1xuICAgIHZhciBjdiA9IHN0YXRlLmN2dFtuXTtcblxuICAgIC8vIFRPRE8gY3Z0Y3V0aW4gc2hvdWxkIGJlIGNvbnNpZGVyZWQgaGVyZVxuICAgIGlmIChyb3VuZCkgeyBjdiA9IHN0YXRlLnJvdW5kKGN2KTsgfVxuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBzdGF0ZS5zdGVwLFxuICAgICAgICAgICAgJ01JQVBbJyArIHJvdW5kICsgJ10nLFxuICAgICAgICAgICAgbiwgJygnLCBjdiwgJyknLCBwaVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ2LnNldFJlbGF0aXZlKHAsIEhQWmVybywgY3YsIHB2KTtcblxuICAgIGlmIChzdGF0ZS56cDAgPT09IDApIHtcbiAgICAgICAgcC54byA9IHAueDtcbiAgICAgICAgcC55byA9IHAueTtcbiAgICB9XG5cbiAgICBmdi50b3VjaChwKTtcblxuICAgIHN0YXRlLnJwMCA9IHN0YXRlLnJwMSA9IHBpO1xufVxuXG4vLyBOUFVTQltdIFBVU0ggTiBCeXRlc1xuLy8gMHg0MFxuZnVuY3Rpb24gTlBVU0hCKHN0YXRlKSB7XG4gICAgdmFyIHByb2cgPSBzdGF0ZS5wcm9nO1xuICAgIHZhciBpcCA9IHN0YXRlLmlwO1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuXG4gICAgdmFyIG4gPSBwcm9nWysraXBdO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ05QVVNIQltdJywgbik7IH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7IHN0YWNrLnB1c2gocHJvZ1srK2lwXSk7IH1cblxuICAgIHN0YXRlLmlwID0gaXA7XG59XG5cbi8vIE5QVVNIV1tdIFBVU0ggTiBXb3Jkc1xuLy8gMHg0MVxuZnVuY3Rpb24gTlBVU0hXKHN0YXRlKSB7XG4gICAgdmFyIGlwID0gc3RhdGUuaXA7XG4gICAgdmFyIHByb2cgPSBzdGF0ZS5wcm9nO1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBuID0gcHJvZ1srK2lwXTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdOUFVTSFdbXScsIG4pOyB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICB2YXIgdyA9IChwcm9nWysraXBdIDw8IDgpIHwgcHJvZ1srK2lwXTtcbiAgICAgICAgaWYgKHcgJiAweDgwMDApIHsgdyA9IC0oKHcgXiAweGZmZmYpICsgMSk7IH1cbiAgICAgICAgc3RhY2sucHVzaCh3KTtcbiAgICB9XG5cbiAgICBzdGF0ZS5pcCA9IGlwO1xufVxuXG4vLyBXU1tdIFdyaXRlIFN0b3JlXG4vLyAweDQyXG5mdW5jdGlvbiBXUyhzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBzdG9yZSA9IHN0YXRlLnN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZSkgeyBzdG9yZSA9IHN0YXRlLnN0b3JlID0gW107IH1cblxuICAgIHZhciB2ID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIGwgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdXUycsIHYsIGwpOyB9XG5cbiAgICBzdG9yZVtsXSA9IHY7XG59XG5cbi8vIFJTW10gUmVhZCBTdG9yZVxuLy8gMHg0M1xuZnVuY3Rpb24gUlMoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgc3RvcmUgPSBzdGF0ZS5zdG9yZTtcblxuICAgIHZhciBsID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnUlMnLCBsKTsgfVxuXG4gICAgdmFyIHYgPSAoc3RvcmUgJiYgc3RvcmVbbF0pIHx8IDA7XG5cbiAgICBzdGFjay5wdXNoKHYpO1xufVxuXG4vLyBXQ1ZUUFtdIFdyaXRlIENvbnRyb2wgVmFsdWUgVGFibGUgaW4gUGl4ZWwgdW5pdHNcbi8vIDB4NDRcbmZ1bmN0aW9uIFdDVlRQKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG5cbiAgICB2YXIgdiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBsID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnV0NWVFAnLCB2LCBsKTsgfVxuXG4gICAgc3RhdGUuY3Z0W2xdID0gdiAvIDB4NDA7XG59XG5cbi8vIFJDVlRbXSBSZWFkIENvbnRyb2wgVmFsdWUgVGFibGUgZW50cnlcbi8vIDB4NDVcbmZ1bmN0aW9uIFJDVlQoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgY3Z0ZSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1JDVlQnLCBjdnRlKTsgfVxuXG4gICAgc3RhY2sucHVzaChzdGF0ZS5jdnRbY3Z0ZV0gKiAweDQwKTtcbn1cblxuLy8gR0NbXSBHZXQgQ29vcmRpbmF0ZSBwcm9qZWN0ZWQgb250byB0aGUgcHJvamVjdGlvbiB2ZWN0b3Jcbi8vIDB4NDYtMHg0N1xuZnVuY3Rpb24gR0MoYSwgc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgcGkgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgcCA9IHN0YXRlLnoyW3BpXTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdHQ1snICsgYSArICddJywgcGkpOyB9XG5cbiAgICBzdGFjay5wdXNoKHN0YXRlLmRwdi5kaXN0YW5jZShwLCBIUFplcm8sIGEsIGZhbHNlKSAqIDB4NDApO1xufVxuXG4vLyBNRFthXSBNZWFzdXJlIERpc3RhbmNlXG4vLyAweDQ5LTB4NEFcbmZ1bmN0aW9uIE1EKGEsIHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIHBpMiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBwaTEgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgcDIgPSBzdGF0ZS56MVtwaTJdO1xuICAgIHZhciBwMSA9IHN0YXRlLnowW3BpMV07XG4gICAgdmFyIGQgPSBzdGF0ZS5kcHYuZGlzdGFuY2UocDEsIHAyLCBhLCBhKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdNRFsnICsgYSArICddJywgcGkyLCBwaTEsICctPicsIGQpOyB9XG5cbiAgICBzdGF0ZS5zdGFjay5wdXNoKE1hdGgucm91bmQoZCAqIDY0KSk7XG59XG5cbi8vIE1QUEVNW10gTWVhc3VyZSBQaXhlbHMgUGVyIEVNXG4vLyAweDRCXG5mdW5jdGlvbiBNUFBFTShzdGF0ZSkge1xuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdNUFBFTVtdJyk7IH1cbiAgICBzdGF0ZS5zdGFjay5wdXNoKHN0YXRlLnBwZW0pO1xufVxuXG4vLyBGTElQT05bXSBzZXQgdGhlIGF1dG8gRkxJUCBCb29sZWFuIHRvIE9OXG4vLyAweDREXG5mdW5jdGlvbiBGTElQT04oc3RhdGUpIHtcbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnRkxJUE9OW10nKTsgfVxuICAgIHN0YXRlLmF1dG9GbGlwID0gdHJ1ZTtcbn1cblxuLy8gTFRbXSBMZXNzIFRoYW5cbi8vIDB4NTBcbmZ1bmN0aW9uIExUKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIGUyID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIGUxID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnTFRbXScsIGUyLCBlMSk7IH1cblxuICAgIHN0YWNrLnB1c2goZTEgPCBlMiA/IDEgOiAwKTtcbn1cblxuLy8gTFRFUVtdIExlc3MgVGhhbiBvciBFUXVhbFxuLy8gMHg1M1xuZnVuY3Rpb24gTFRFUShzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBlMiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBlMSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ0xURVFbXScsIGUyLCBlMSk7IH1cblxuICAgIHN0YWNrLnB1c2goZTEgPD0gZTIgPyAxIDogMCk7XG59XG5cbi8vIEdURVFbXSBHcmVhdGVyIFRoYW5cbi8vIDB4NTJcbmZ1bmN0aW9uIEdUKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIGUyID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIGUxID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnR1RbXScsIGUyLCBlMSk7IH1cblxuICAgIHN0YWNrLnB1c2goZTEgPiBlMiA/IDEgOiAwKTtcbn1cblxuLy8gR1RFUVtdIEdyZWF0ZXIgVGhhbiBvciBFUXVhbFxuLy8gMHg1M1xuZnVuY3Rpb24gR1RFUShzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBlMiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBlMSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ0dURVFbXScsIGUyLCBlMSk7IH1cblxuICAgIHN0YWNrLnB1c2goZTEgPj0gZTIgPyAxIDogMCk7XG59XG5cbi8vIEVRW10gRVF1YWxcbi8vIDB4NTRcbmZ1bmN0aW9uIEVRKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIGUyID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIGUxID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnRVFbXScsIGUyLCBlMSk7IH1cblxuICAgIHN0YWNrLnB1c2goZTIgPT09IGUxID8gMSA6IDApO1xufVxuXG4vLyBORVFbXSBOb3QgRVF1YWxcbi8vIDB4NTVcbmZ1bmN0aW9uIE5FUShzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBlMiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBlMSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ05FUVtdJywgZTIsIGUxKTsgfVxuXG4gICAgc3RhY2sucHVzaChlMiAhPT0gZTEgPyAxIDogMCk7XG59XG5cbi8vIE9ERFtdIE9ERFxuLy8gMHg1NlxuZnVuY3Rpb24gT0REKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIG4gPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdPRERbXScsIG4pOyB9XG5cbiAgICBzdGFjay5wdXNoKE1hdGgudHJ1bmMobikgJSAyID8gMSA6IDApO1xufVxuXG4vLyBFVkVOW10gRVZFTlxuLy8gMHg1N1xuZnVuY3Rpb24gRVZFTihzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBuID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnRVZFTltdJywgbik7IH1cblxuICAgIHN0YWNrLnB1c2goTWF0aC50cnVuYyhuKSAlIDIgPyAwIDogMSk7XG59XG5cbi8vIElGW10gSUYgdGVzdFxuLy8gMHg1OFxuZnVuY3Rpb24gSUYoc3RhdGUpIHtcbiAgICB2YXIgdGVzdCA9IHN0YXRlLnN0YWNrLnBvcCgpO1xuICAgIHZhciBpbnM7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnSUZbXScsIHRlc3QpOyB9XG5cbiAgICAvLyBpZiB0ZXN0IGlzIHRydWUgaXQganVzdCBjb250aW51ZXNcbiAgICAvLyBpZiBub3QgdGhlIGlwIGlzIHNraXBwZWQgdW50aWwgbWF0Y2hpbmcgRUxTRSBvciBFSUZcbiAgICBpZiAoIXRlc3QpIHtcbiAgICAgICAgc2tpcChzdGF0ZSwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgaW5zID09PSAweDFCID8gJ0VMU0VbXScgOiAnRUlGW10nKTsgfVxuICAgIH1cbn1cblxuLy8gRUlGW10gRW5kIElGXG4vLyAweDU5XG5mdW5jdGlvbiBFSUYoc3RhdGUpIHtcbiAgICAvLyB0aGlzIGNhbiBiZSByZWFjaGVkIG5vcm1hbGx5IHdoZW5cbiAgICAvLyBleGVjdXRpbmcgYW4gZWxzZSBicmFuY2guXG4gICAgLy8gLT4ganVzdCBpZ25vcmUgaXRcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdFSUZbXScpOyB9XG59XG5cbi8vIEFORFtdIGxvZ2ljYWwgQU5EXG4vLyAweDVBXG5mdW5jdGlvbiBBTkQoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgZTIgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgZTEgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdBTkRbXScsIGUyLCBlMSk7IH1cblxuICAgIHN0YWNrLnB1c2goZTIgJiYgZTEgPyAxIDogMCk7XG59XG5cbi8vIE9SW10gbG9naWNhbCBPUlxuLy8gMHg1QlxuZnVuY3Rpb24gT1Ioc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgZTIgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgZTEgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdPUltdJywgZTIsIGUxKTsgfVxuXG4gICAgc3RhY2sucHVzaChlMiB8fCBlMSA/IDEgOiAwKTtcbn1cblxuLy8gTk9UW10gbG9naWNhbCBOT1Rcbi8vIDB4NUNcbmZ1bmN0aW9uIE5PVChzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBlID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnTk9UW10nLCBlKTsgfVxuXG4gICAgc3RhY2sucHVzaChlID8gMCA6IDEpO1xufVxuXG4vLyBERUxUQVAxW10gREVMVEEgZXhjZXB0aW9uIFAxXG4vLyBERUxUQVAyW10gREVMVEEgZXhjZXB0aW9uIFAyXG4vLyBERUxUQVAzW10gREVMVEEgZXhjZXB0aW9uIFAzXG4vLyAweDVELCAweDcxLCAweDcyXG5mdW5jdGlvbiBERUxUQVAxMjMoYiwgc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgbiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBmdiA9IHN0YXRlLmZ2O1xuICAgIHZhciBwdiA9IHN0YXRlLnB2O1xuICAgIHZhciBwcGVtID0gc3RhdGUucHBlbTtcbiAgICB2YXIgYmFzZSA9IHN0YXRlLmRlbHRhQmFzZSArIChiIC0gMSkgKiAxNjtcbiAgICB2YXIgZHMgPSBzdGF0ZS5kZWx0YVNoaWZ0O1xuICAgIHZhciB6MCA9IHN0YXRlLnowO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ0RFTFRBUFsnICsgYiArICddJywgbiwgc3RhY2spOyB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKylcbiAgICB7XG4gICAgICAgIHZhciBwaSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB2YXIgYXJnID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHZhciBhcHBlbSA9IGJhc2UgKyAoKGFyZyAmIDB4RjApID4+IDQpO1xuICAgICAgICBpZiAoYXBwZW0gIT09IHBwZW0pIHsgY29udGludWU7IH1cblxuICAgICAgICB2YXIgbWFnID0gKGFyZyAmIDB4MEYpIC0gODtcbiAgICAgICAgaWYgKG1hZyA+PSAwKSB7IG1hZysrOyB9XG4gICAgICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdERUxUQVBGSVgnLCBwaSwgJ2J5JywgbWFnICogZHMpOyB9XG5cbiAgICAgICAgdmFyIHAgPSB6MFtwaV07XG4gICAgICAgIGZ2LnNldFJlbGF0aXZlKHAsIHAsIG1hZyAqIGRzLCBwdik7XG4gICAgfVxufVxuXG4vLyBTREJbXSBTZXQgRGVsdGEgQmFzZSBpbiB0aGUgZ3JhcGhpY3Mgc3RhdGVcbi8vIDB4NUVcbmZ1bmN0aW9uIFNEQihzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBuID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnU0RCW10nLCBuKTsgfVxuXG4gICAgc3RhdGUuZGVsdGFCYXNlID0gbjtcbn1cblxuLy8gU0RTW10gU2V0IERlbHRhIFNoaWZ0IGluIHRoZSBncmFwaGljcyBzdGF0ZVxuLy8gMHg1RlxuZnVuY3Rpb24gU0RTKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIG4gPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTRFNbXScsIG4pOyB9XG5cbiAgICBzdGF0ZS5kZWx0YVNoaWZ0ID0gTWF0aC5wb3coMC41LCBuKTtcbn1cblxuLy8gQUREW10gQUREXG4vLyAweDYwXG5mdW5jdGlvbiBBREQoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgbjIgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgbjEgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdBRERbXScsIG4yLCBuMSk7IH1cblxuICAgIHN0YWNrLnB1c2gobjEgKyBuMik7XG59XG5cbi8vIFNVQltdIFNVQlxuLy8gMHg2MVxuZnVuY3Rpb24gU1VCKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIG4yID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIG4xID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnU1VCW10nLCBuMiwgbjEpOyB9XG5cbiAgICBzdGFjay5wdXNoKG4xIC0gbjIpO1xufVxuXG4vLyBESVZbXSBESVZcbi8vIDB4NjJcbmZ1bmN0aW9uIERJVihzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBuMiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBuMSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ0RJVltdJywgbjIsIG4xKTsgfVxuXG4gICAgc3RhY2sucHVzaChuMSAqIDY0IC8gbjIpO1xufVxuXG4vLyBNVUxbXSBNVUxcbi8vIDB4NjNcbmZ1bmN0aW9uIE1VTChzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBuMiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBuMSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ01VTFtdJywgbjIsIG4xKTsgfVxuXG4gICAgc3RhY2sucHVzaChuMSAqIG4yIC8gNjQpO1xufVxuXG4vLyBBQlNbXSBBQlNvbHV0ZSB2YWx1ZVxuLy8gMHg2NFxuZnVuY3Rpb24gQUJTKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIG4gPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdBQlNbXScsIG4pOyB9XG5cbiAgICBzdGFjay5wdXNoKE1hdGguYWJzKG4pKTtcbn1cblxuLy8gTkVHW10gTkVHYXRlXG4vLyAweDY1XG5mdW5jdGlvbiBORUcoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgbiA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ05FR1tdJywgbik7IH1cblxuICAgIHN0YWNrLnB1c2goLW4pO1xufVxuXG4vLyBGTE9PUltdIEZMT09SXG4vLyAweDY2XG5mdW5jdGlvbiBGTE9PUihzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBuID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnRkxPT1JbXScsIG4pOyB9XG5cbiAgICBzdGFjay5wdXNoKE1hdGguZmxvb3IobiAvIDB4NDApICogMHg0MCk7XG59XG5cbi8vIENFSUxJTkdbXSBDRUlMSU5HXG4vLyAweDY3XG5mdW5jdGlvbiBDRUlMSU5HKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIG4gPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdDRUlMSU5HW10nLCBuKTsgfVxuXG4gICAgc3RhY2sucHVzaChNYXRoLmNlaWwobiAvIDB4NDApICogMHg0MCk7XG59XG5cbi8vIFJPVU5EW2FiXSBST1VORCB2YWx1ZVxuLy8gMHg2OC0weDZCXG5mdW5jdGlvbiBST1VORChkdCwgc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgbiA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1JPVU5EW10nKTsgfVxuXG4gICAgc3RhY2sucHVzaChzdGF0ZS5yb3VuZChuIC8gMHg0MCkgKiAweDQwKTtcbn1cblxuLy8gV0NWVEZbXSBXcml0ZSBDb250cm9sIFZhbHVlIFRhYmxlIGluIEZ1bml0c1xuLy8gMHg3MFxuZnVuY3Rpb24gV0NWVEYoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgdiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBsID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnV0NWVEZbXScsIHYsIGwpOyB9XG5cbiAgICBzdGF0ZS5jdnRbbF0gPSB2ICogc3RhdGUucHBlbSAvIHN0YXRlLmZvbnQudW5pdHNQZXJFbTtcbn1cblxuLy8gREVMVEFDMVtdIERFTFRBIGV4Y2VwdGlvbiBDMVxuLy8gREVMVEFDMltdIERFTFRBIGV4Y2VwdGlvbiBDMlxuLy8gREVMVEFDM1tdIERFTFRBIGV4Y2VwdGlvbiBDM1xuLy8gMHg3MywgMHg3NCwgMHg3NVxuZnVuY3Rpb24gREVMVEFDMTIzKGIsIHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIG4gPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgcHBlbSA9IHN0YXRlLnBwZW07XG4gICAgdmFyIGJhc2UgPSBzdGF0ZS5kZWx0YUJhc2UgKyAoYiAtIDEpICogMTY7XG4gICAgdmFyIGRzID0gc3RhdGUuZGVsdGFTaGlmdDtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdERUxUQUNbJyArIGIgKyAnXScsIG4sIHN0YWNrKTsgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGMgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmFyIGFyZyA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB2YXIgYXBwZW0gPSBiYXNlICsgKChhcmcgJiAweEYwKSA+PiA0KTtcbiAgICAgICAgaWYgKGFwcGVtICE9PSBwcGVtKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgdmFyIG1hZyA9IChhcmcgJiAweDBGKSAtIDg7XG4gICAgICAgIGlmIChtYWcgPj0gMCkgeyBtYWcrKzsgfVxuXG4gICAgICAgIHZhciBkZWx0YSA9IG1hZyAqIGRzO1xuXG4gICAgICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdERUxUQUNGSVgnLCBjLCAnYnknLCBkZWx0YSk7IH1cblxuICAgICAgICBzdGF0ZS5jdnRbY10gKz0gZGVsdGE7XG4gICAgfVxufVxuXG4vLyBTUk9VTkRbXSBTdXBlciBST1VORFxuLy8gMHg3NlxuZnVuY3Rpb24gU1JPVU5EKHN0YXRlKSB7XG4gICAgdmFyIG4gPSBzdGF0ZS5zdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdTUk9VTkRbXScsIG4pOyB9XG5cbiAgICBzdGF0ZS5yb3VuZCA9IHJvdW5kU3VwZXI7XG5cbiAgICB2YXIgcGVyaW9kO1xuXG4gICAgc3dpdGNoIChuICYgMHhDMCkge1xuICAgICAgICBjYXNlIDB4MDA6XG4gICAgICAgICAgICBwZXJpb2QgPSAwLjU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAweDQwOlxuICAgICAgICAgICAgcGVyaW9kID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4ODA6XG4gICAgICAgICAgICBwZXJpb2QgPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgU1JPVU5EIHZhbHVlJyk7XG4gICAgfVxuXG4gICAgc3RhdGUuc3JQZXJpb2QgPSBwZXJpb2Q7XG5cbiAgICBzd2l0Y2ggKG4gJiAweDMwKSB7XG4gICAgICAgIGNhc2UgMHgwMDpcbiAgICAgICAgICAgIHN0YXRlLnNyUGhhc2UgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgxMDpcbiAgICAgICAgICAgIHN0YXRlLnNyUGhhc2UgPSAwLjI1ICogcGVyaW9kO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgyMDpcbiAgICAgICAgICAgIHN0YXRlLnNyUGhhc2UgPSAwLjUgICogcGVyaW9kO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgzMDpcbiAgICAgICAgICAgIHN0YXRlLnNyUGhhc2UgPSAwLjc1ICogcGVyaW9kO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcignaW52YWxpZCBTUk9VTkQgdmFsdWUnKTtcbiAgICB9XG5cbiAgICBuICY9IDB4MEY7XG5cbiAgICBpZiAobiA9PT0gMCkgeyBzdGF0ZS5zclRocmVzaG9sZCA9IDA7IH1cbiAgICBlbHNlIHsgc3RhdGUuc3JUaHJlc2hvbGQgPSAobiAvIDggLSAwLjUpICogcGVyaW9kOyB9XG59XG5cbi8vIFM0NVJPVU5EW10gU3VwZXIgUk9VTkQgNDUgZGVncmVlc1xuLy8gMHg3N1xuZnVuY3Rpb24gUzQ1Uk9VTkQoc3RhdGUpIHtcbiAgICB2YXIgbiA9IHN0YXRlLnN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1M0NVJPVU5EW10nLCBuKTsgfVxuXG4gICAgc3RhdGUucm91bmQgPSByb3VuZFN1cGVyO1xuXG4gICAgdmFyIHBlcmlvZDtcblxuICAgIHN3aXRjaCAobiAmIDB4QzApIHtcbiAgICAgICAgY2FzZSAweDAwOlxuICAgICAgICAgICAgcGVyaW9kID0gTWF0aC5zcXJ0KDIpIC8gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4NDA6XG4gICAgICAgICAgICBwZXJpb2QgPSBNYXRoLnNxcnQoMik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAweDgwOlxuICAgICAgICAgICAgcGVyaW9kID0gMiAqIE1hdGguc3FydCgyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIFM0NVJPVU5EIHZhbHVlJyk7XG4gICAgfVxuXG4gICAgc3RhdGUuc3JQZXJpb2QgPSBwZXJpb2Q7XG5cbiAgICBzd2l0Y2ggKG4gJiAweDMwKSB7XG4gICAgICAgIGNhc2UgMHgwMDpcbiAgICAgICAgICAgIHN0YXRlLnNyUGhhc2UgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgxMDpcbiAgICAgICAgICAgIHN0YXRlLnNyUGhhc2UgPSAwLjI1ICogcGVyaW9kO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgyMDpcbiAgICAgICAgICAgIHN0YXRlLnNyUGhhc2UgPSAwLjUgICogcGVyaW9kO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgzMDpcbiAgICAgICAgICAgIHN0YXRlLnNyUGhhc2UgPSAwLjc1ICogcGVyaW9kO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgUzQ1Uk9VTkQgdmFsdWUnKTtcbiAgICB9XG5cbiAgICBuICY9IDB4MEY7XG5cbiAgICBpZiAobiA9PT0gMCkgeyBzdGF0ZS5zclRocmVzaG9sZCA9IDA7IH1cbiAgICBlbHNlIHsgc3RhdGUuc3JUaHJlc2hvbGQgPSAobiAvIDggLSAwLjUpICogcGVyaW9kOyB9XG59XG5cbi8vIFJPRkZbXSBSb3VuZCBPZmZcbi8vIDB4N0FcbmZ1bmN0aW9uIFJPRkYoc3RhdGUpIHtcbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnUk9GRltdJyk7IH1cblxuICAgIHN0YXRlLnJvdW5kID0gcm91bmRPZmY7XG59XG5cbi8vIFJVVEdbXSBSb3VuZCBVcCBUbyBHcmlkXG4vLyAweDdDXG5mdW5jdGlvbiBSVVRHKHN0YXRlKSB7XG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1JVVEdbXScpOyB9XG5cbiAgICBzdGF0ZS5yb3VuZCA9IHJvdW5kVXBUb0dyaWQ7XG59XG5cbi8vIFJEVEdbXSBSb3VuZCBEb3duIFRvIEdyaWRcbi8vIDB4N0RcbmZ1bmN0aW9uIFJEVEcoc3RhdGUpIHtcbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnUkRUR1tdJyk7IH1cblxuICAgIHN0YXRlLnJvdW5kID0gcm91bmREb3duVG9HcmlkO1xufVxuXG4vLyBTQ0FOQ1RSTFtdIFNDQU4gY29udmVyc2lvbiBDb25UUm9MXG4vLyAweDg1XG5mdW5jdGlvbiBTQ0FOQ1RSTChzdGF0ZSkge1xuICAgIHZhciBuID0gc3RhdGUuc3RhY2sucG9wKCk7XG5cbiAgICAvLyBpZ25vcmVkIGJ5IG9wZW50eXBlLmpzXG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnU0NBTkNUUkxbXScsIG4pOyB9XG59XG5cbi8vIFNEUFZUTFthXSBTZXQgRHVhbCBQcm9qZWN0aW9uIFZlY3RvciBUbyBMaW5lXG4vLyAweDg2LTB4ODdcbmZ1bmN0aW9uIFNEUFZUTChhLCBzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBwMmkgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgcDFpID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHAyID0gc3RhdGUuejJbcDJpXTtcbiAgICB2YXIgcDEgPSBzdGF0ZS56MVtwMWldO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coJ1NEUFZUTFsnICsgYSArICddJywgcDJpLCBwMWkpOyB9XG5cbiAgICB2YXIgZHg7XG4gICAgdmFyIGR5O1xuXG4gICAgaWYgKCFhKSB7XG4gICAgICAgIGR4ID0gcDEueCAtIHAyLng7XG4gICAgICAgIGR5ID0gcDEueSAtIHAyLnk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZHggPSBwMi55IC0gcDEueTtcbiAgICAgICAgZHkgPSBwMS54IC0gcDIueDtcbiAgICB9XG5cbiAgICBzdGF0ZS5kcHYgPSBnZXRVbml0VmVjdG9yKGR4LCBkeSk7XG59XG5cbi8vIEdFVElORk9bXSBHRVQgSU5GT3JtYXRpb25cbi8vIDB4ODhcbmZ1bmN0aW9uIEdFVElORk8oc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgc2VsID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHIgPSAwO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ0dFVElORk9bXScsIHNlbCk7IH1cblxuICAgIC8vIHYzNSBhcyBpbiBubyBzdWJwaXhlbCBoaW50aW5nXG4gICAgaWYgKHNlbCAmIDB4MDEpIHsgciA9IDM1OyB9XG5cbiAgICAvLyBUT0RPIHJvdGF0aW9uIGFuZCBzdHJldGNoIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkXG4gICAgLy8gYW5kIHRodXMgdGhvc2UgR0VUSU5GTyBhcmUgYWx3YXlzIDAuXG5cbiAgICAvLyBvcGVudHlwZS5qcyBpcyBhbHdheXMgZ3JheSBzY2FsaW5nXG4gICAgaWYgKHNlbCAmIDB4MjApIHsgciB8PSAweDEwMDA7IH1cblxuICAgIHN0YWNrLnB1c2gocik7XG59XG5cbi8vIFJPTExbXSBST0xMIHRoZSB0b3AgdGhyZWUgc3RhY2sgZWxlbWVudHNcbi8vIDB4OEFcbmZ1bmN0aW9uIFJPTEwoc3RhdGUpIHtcbiAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjaztcbiAgICB2YXIgYSA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBiID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIGMgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChleHBvcnRzLkRFQlVHKSB7IGNvbnNvbGUubG9nKHN0YXRlLnN0ZXAsICdST0xMW10nKTsgfVxuXG4gICAgc3RhY2sucHVzaChiKTtcbiAgICBzdGFjay5wdXNoKGEpO1xuICAgIHN0YWNrLnB1c2goYyk7XG59XG5cbi8vIE1BWFtdIE1BWGltdW0gb2YgdG9wIHR3byBzdGFjayBlbGVtZW50c1xuLy8gMHg4QlxuZnVuY3Rpb24gTUFYKHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIGUyID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIGUxID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnTUFYW10nLCBlMiwgZTEpOyB9XG5cbiAgICBzdGFjay5wdXNoKE1hdGgubWF4KGUxLCBlMikpO1xufVxuXG4vLyBNSU5bXSBNSU5pbXVtIG9mIHRvcCB0d28gc3RhY2sgZWxlbWVudHNcbi8vIDB4OENcbmZ1bmN0aW9uIE1JTihzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBlMiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBlMSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ01JTltdJywgZTIsIGUxKTsgfVxuXG4gICAgc3RhY2sucHVzaChNYXRoLm1pbihlMSwgZTIpKTtcbn1cblxuLy8gU0NBTlRZUEVbXSBTQ0FOVFlQRVxuLy8gMHg4RFxuZnVuY3Rpb24gU0NBTlRZUEUoc3RhdGUpIHtcbiAgICB2YXIgbiA9IHN0YXRlLnN0YWNrLnBvcCgpO1xuICAgIC8vIGlnbm9yZWQgYnkgb3BlbnR5cGUuanNcbiAgICBpZiAoZXhwb3J0cy5ERUJVRykgeyBjb25zb2xlLmxvZyhzdGF0ZS5zdGVwLCAnU0NBTlRZUEVbXScsIG4pOyB9XG59XG5cbi8vIElOU1RDVFJMW10gSU5TVENUUkxcbi8vIDB4OERcbmZ1bmN0aW9uIElOU1RDVFJMKHN0YXRlKSB7XG4gICAgdmFyIHMgPSBzdGF0ZS5zdGFjay5wb3AoKTtcbiAgICB2YXIgdiA9IHN0YXRlLnN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ0lOU1RDVFJMW10nLCBzLCB2KTsgfVxuXG4gICAgc3dpdGNoIChzKSB7XG4gICAgICAgIGNhc2UgMSA6IHN0YXRlLmluaGliaXRHcmlkRml0ID0gISF2OyByZXR1cm47XG4gICAgICAgIGNhc2UgMiA6IHN0YXRlLmlnbm9yZUN2dCA9ICEhdjsgcmV0dXJuO1xuICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgSU5TVENUUkxbXSBzZWxlY3RvcicpO1xuICAgIH1cbn1cblxuLy8gUFVTSEJbYWJjXSBQVVNIIEJ5dGVzXG4vLyAweEIwLTB4QjdcbmZ1bmN0aW9uIFBVU0hCKG4sIHN0YXRlKSB7XG4gICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG4gICAgdmFyIHByb2cgPSBzdGF0ZS5wcm9nO1xuICAgIHZhciBpcCA9IHN0YXRlLmlwO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuc3RlcCwgJ1BVU0hCWycgKyBuICsgJ10nKTsgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsgc3RhY2sucHVzaChwcm9nWysraXBdKTsgfVxuXG4gICAgc3RhdGUuaXAgPSBpcDtcbn1cblxuLy8gUFVTSFdbYWJjXSBQVVNIIFdvcmRzXG4vLyAweEI4LTB4QkZcbmZ1bmN0aW9uIFBVU0hXKG4sIHN0YXRlKSB7XG4gICAgdmFyIGlwID0gc3RhdGUuaXA7XG4gICAgdmFyIHByb2cgPSBzdGF0ZS5wcm9nO1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuXG4gICAgaWYgKGV4cG9ydHMuREVCVUcpIHsgY29uc29sZS5sb2coc3RhdGUuaXAsICdQVVNIV1snICsgbiArICddJyk7IH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciB3ID0gKHByb2dbKytpcF0gPDwgOCkgfCBwcm9nWysraXBdO1xuICAgICAgICBpZiAodyAmIDB4ODAwMCkgeyB3ID0gLSgodyBeIDB4ZmZmZikgKyAxKTsgfVxuICAgICAgICBzdGFjay5wdXNoKHcpO1xuICAgIH1cblxuICAgIHN0YXRlLmlwID0gaXA7XG59XG5cbi8vIE1EUlBbYWJjZGVdIE1vdmUgRGlyZWN0IFJlbGF0aXZlIFBvaW50XG4vLyAweEQwLTB4RUZcbi8vIChpZiBpbmRpcmVjdCBpcyAwKVxuLy9cbi8vIGFuZFxuLy9cbi8vIE1JUlBbYWJjZGVdIE1vdmUgSW5kaXJlY3QgUmVsYXRpdmUgUG9pbnRcbi8vIDB4RTAtMHhGRlxuLy8gKGlmIGluZGlyZWN0IGlzIDEpXG5cbmZ1bmN0aW9uIE1EUlBfTUlSUChpbmRpcmVjdCwgc2V0UnAwLCBrZWVwRCwgcm8sIGR0LCBzdGF0ZSkge1xuICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrO1xuICAgIHZhciBjdnRlID0gaW5kaXJlY3QgJiYgc3RhY2sucG9wKCk7XG4gICAgdmFyIHBpID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHJwMGkgPSBzdGF0ZS5ycDA7XG4gICAgdmFyIHJwID0gc3RhdGUuejBbcnAwaV07XG4gICAgdmFyIHAgPSBzdGF0ZS56MVtwaV07XG5cbiAgICB2YXIgbWQgPSBzdGF0ZS5taW5EaXM7XG4gICAgdmFyIGZ2ID0gc3RhdGUuZnY7XG4gICAgdmFyIHB2ID0gc3RhdGUuZHB2O1xuICAgIHZhciBvZDsgLy8gb3JpZ2luYWwgZGlzdGFuY2VcbiAgICB2YXIgZDsgLy8gbW92aW5nIGRpc3RhbmNlXG4gICAgdmFyIHNpZ247IC8vIHNpZ24gb2YgZGlzdGFuY2VcbiAgICB2YXIgY3Y7XG5cbiAgICBkID0gb2QgPSBwdi5kaXN0YW5jZShwLCBycCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgc2lnbiA9IGQgPj0gMCA/IDEgOiAtMTsgLy8gTWF0aC5zaWduIHdvdWxkIGJlIDAgaW4gY2FzZSBvZiAwXG5cbiAgICAvLyBUT0RPIGNvbnNpZGVyIGF1dG9GbGlwXG4gICAgZCA9IE1hdGguYWJzKGQpO1xuXG4gICAgaWYgKGluZGlyZWN0KSB7XG4gICAgICAgIGN2ID0gc3RhdGUuY3Z0W2N2dGVdO1xuXG4gICAgICAgIGlmIChybyAmJiBNYXRoLmFicyhkIC0gY3YpIDwgc3RhdGUuY3ZDdXRJbikgeyBkID0gY3Y7IH1cbiAgICB9XG5cbiAgICBpZiAoa2VlcEQgJiYgZCA8IG1kKSB7IGQgPSBtZDsgfVxuXG4gICAgaWYgKHJvKSB7IGQgPSBzdGF0ZS5yb3VuZChkKTsgfVxuXG4gICAgZnYuc2V0UmVsYXRpdmUocCwgcnAsIHNpZ24gKiBkLCBwdik7XG4gICAgZnYudG91Y2gocCk7XG5cbiAgICBpZiAoZXhwb3J0cy5ERUJVRykge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIHN0YXRlLnN0ZXAsXG4gICAgICAgICAgICAoaW5kaXJlY3QgPyAnTUlSUFsnIDogJ01EUlBbJykgK1xuICAgICAgICAgICAgKHNldFJwMCA/ICdNJyA6ICdtJykgK1xuICAgICAgICAgICAgKGtlZXBEID8gJz4nIDogJ18nKSArXG4gICAgICAgICAgICAocm8gPyAnUicgOiAnXycpICtcbiAgICAgICAgICAgIChkdCA9PT0gMCA/ICdHcicgOiAoZHQgPT09IDEgPyAnQmwnIDogKGR0ID09PSAyID8gJ1doJyA6ICcnKSkpICtcbiAgICAgICAgICAgICddJyxcbiAgICAgICAgICAgIGluZGlyZWN0ID9cbiAgICAgICAgICAgICAgICBjdnRlICsgJygnICsgc3RhdGUuY3Z0W2N2dGVdICsgJywnICsgIGN2ICsgJyknIDpcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgIHBpLFxuICAgICAgICAgICAgJyhkID0nLCBvZCwgJy0+Jywgc2lnbiAqIGQsICcpJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRlLnJwMSA9IHN0YXRlLnJwMDtcbiAgICBzdGF0ZS5ycDIgPSBwaTtcbiAgICBpZiAoc2V0UnAwKSB7IHN0YXRlLnJwMCA9IHBpOyB9XG59XG5cbi8qXG4qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS5cbiovXG5pbnN0cnVjdGlvblRhYmxlID0gW1xuICAgIC8qIDB4MDAgKi8gU1ZUQ0EuYmluZCh1bmRlZmluZWQsIHlVbml0VmVjdG9yKSxcbiAgICAvKiAweDAxICovIFNWVENBLmJpbmQodW5kZWZpbmVkLCB4VW5pdFZlY3RvciksXG4gICAgLyogMHgwMiAqLyBTUFZUQ0EuYmluZCh1bmRlZmluZWQsIHlVbml0VmVjdG9yKSxcbiAgICAvKiAweDAzICovIFNQVlRDQS5iaW5kKHVuZGVmaW5lZCwgeFVuaXRWZWN0b3IpLFxuICAgIC8qIDB4MDQgKi8gU0ZWVENBLmJpbmQodW5kZWZpbmVkLCB5VW5pdFZlY3RvciksXG4gICAgLyogMHgwNSAqLyBTRlZUQ0EuYmluZCh1bmRlZmluZWQsIHhVbml0VmVjdG9yKSxcbiAgICAvKiAweDA2ICovIFNQVlRMLmJpbmQodW5kZWZpbmVkLCAwKSxcbiAgICAvKiAweDA3ICovIFNQVlRMLmJpbmQodW5kZWZpbmVkLCAxKSxcbiAgICAvKiAweDA4ICovIFNGVlRMLmJpbmQodW5kZWZpbmVkLCAwKSxcbiAgICAvKiAweDA5ICovIFNGVlRMLmJpbmQodW5kZWZpbmVkLCAxKSxcbiAgICAvKiAweDBBICovIFNQVkZTLFxuICAgIC8qIDB4MEIgKi8gU0ZWRlMsXG4gICAgLyogMHgwQyAqLyBHUFYsXG4gICAgLyogMHgwRCAqLyBHRlYsXG4gICAgLyogMHgwRSAqLyBTRlZUUFYsXG4gICAgLyogMHgwRiAqLyBJU0VDVCxcbiAgICAvKiAweDEwICovIFNSUDAsXG4gICAgLyogMHgxMSAqLyBTUlAxLFxuICAgIC8qIDB4MTIgKi8gU1JQMixcbiAgICAvKiAweDEzICovIFNaUDAsXG4gICAgLyogMHgxNCAqLyBTWlAxLFxuICAgIC8qIDB4MTUgKi8gU1pQMixcbiAgICAvKiAweDE2ICovIFNaUFMsXG4gICAgLyogMHgxNyAqLyBTTE9PUCxcbiAgICAvKiAweDE4ICovIFJURyxcbiAgICAvKiAweDE5ICovIFJUSEcsXG4gICAgLyogMHgxQSAqLyBTTUQsXG4gICAgLyogMHgxQiAqLyBFTFNFLFxuICAgIC8qIDB4MUMgKi8gSk1QUixcbiAgICAvKiAweDFEICovIFNDVlRDSSxcbiAgICAvKiAweDFFICovIHVuZGVmaW5lZCwgICAvLyBUT0RPIFNTV0NJXG4gICAgLyogMHgxRiAqLyB1bmRlZmluZWQsICAgLy8gVE9ETyBTU1dcbiAgICAvKiAweDIwICovIERVUCxcbiAgICAvKiAweDIxICovIFBPUCxcbiAgICAvKiAweDIyICovIENMRUFSLFxuICAgIC8qIDB4MjMgKi8gU1dBUCxcbiAgICAvKiAweDI0ICovIERFUFRILFxuICAgIC8qIDB4MjUgKi8gQ0lOREVYLFxuICAgIC8qIDB4MjYgKi8gTUlOREVYLFxuICAgIC8qIDB4MjcgKi8gdW5kZWZpbmVkLCAgIC8vIFRPRE8gQUxJR05QVFNcbiAgICAvKiAweDI4ICovIHVuZGVmaW5lZCxcbiAgICAvKiAweDI5ICovIHVuZGVmaW5lZCwgICAvLyBUT0RPIFVUUFxuICAgIC8qIDB4MkEgKi8gTE9PUENBTEwsXG4gICAgLyogMHgyQiAqLyBDQUxMLFxuICAgIC8qIDB4MkMgKi8gRkRFRixcbiAgICAvKiAweDJEICovIHVuZGVmaW5lZCwgICAvLyBFTkRGIChlYXRlbiBieSBGREVGKVxuICAgIC8qIDB4MkUgKi8gTURBUC5iaW5kKHVuZGVmaW5lZCwgMCksXG4gICAgLyogMHgyRiAqLyBNREFQLmJpbmQodW5kZWZpbmVkLCAxKSxcbiAgICAvKiAweDMwICovIElVUC5iaW5kKHVuZGVmaW5lZCwgeVVuaXRWZWN0b3IpLFxuICAgIC8qIDB4MzEgKi8gSVVQLmJpbmQodW5kZWZpbmVkLCB4VW5pdFZlY3RvciksXG4gICAgLyogMHgzMiAqLyBTSFAuYmluZCh1bmRlZmluZWQsIDApLFxuICAgIC8qIDB4MzMgKi8gU0hQLmJpbmQodW5kZWZpbmVkLCAxKSxcbiAgICAvKiAweDM0ICovIFNIQy5iaW5kKHVuZGVmaW5lZCwgMCksXG4gICAgLyogMHgzNSAqLyBTSEMuYmluZCh1bmRlZmluZWQsIDEpLFxuICAgIC8qIDB4MzYgKi8gU0haLmJpbmQodW5kZWZpbmVkLCAwKSxcbiAgICAvKiAweDM3ICovIFNIWi5iaW5kKHVuZGVmaW5lZCwgMSksXG4gICAgLyogMHgzOCAqLyBTSFBJWCxcbiAgICAvKiAweDM5ICovIElQLFxuICAgIC8qIDB4M0EgKi8gTVNJUlAuYmluZCh1bmRlZmluZWQsIDApLFxuICAgIC8qIDB4M0IgKi8gTVNJUlAuYmluZCh1bmRlZmluZWQsIDEpLFxuICAgIC8qIDB4M0MgKi8gQUxJR05SUCxcbiAgICAvKiAweDNEICovIFJUREcsXG4gICAgLyogMHgzRSAqLyBNSUFQLmJpbmQodW5kZWZpbmVkLCAwKSxcbiAgICAvKiAweDNGICovIE1JQVAuYmluZCh1bmRlZmluZWQsIDEpLFxuICAgIC8qIDB4NDAgKi8gTlBVU0hCLFxuICAgIC8qIDB4NDEgKi8gTlBVU0hXLFxuICAgIC8qIDB4NDIgKi8gV1MsXG4gICAgLyogMHg0MyAqLyBSUyxcbiAgICAvKiAweDQ0ICovIFdDVlRQLFxuICAgIC8qIDB4NDUgKi8gUkNWVCxcbiAgICAvKiAweDQ2ICovIEdDLmJpbmQodW5kZWZpbmVkLCAwKSxcbiAgICAvKiAweDQ3ICovIEdDLmJpbmQodW5kZWZpbmVkLCAxKSxcbiAgICAvKiAweDQ4ICovIHVuZGVmaW5lZCwgICAvLyBUT0RPIFNDRlNcbiAgICAvKiAweDQ5ICovIE1ELmJpbmQodW5kZWZpbmVkLCAwKSxcbiAgICAvKiAweDRBICovIE1ELmJpbmQodW5kZWZpbmVkLCAxKSxcbiAgICAvKiAweDRCICovIE1QUEVNLFxuICAgIC8qIDB4NEMgKi8gdW5kZWZpbmVkLCAgIC8vIFRPRE8gTVBTXG4gICAgLyogMHg0RCAqLyBGTElQT04sXG4gICAgLyogMHg0RSAqLyB1bmRlZmluZWQsICAgLy8gVE9ETyBGTElQT0ZGXG4gICAgLyogMHg0RiAqLyB1bmRlZmluZWQsICAgLy8gVE9ETyBERUJVR1xuICAgIC8qIDB4NTAgKi8gTFQsXG4gICAgLyogMHg1MSAqLyBMVEVRLFxuICAgIC8qIDB4NTIgKi8gR1QsXG4gICAgLyogMHg1MyAqLyBHVEVRLFxuICAgIC8qIDB4NTQgKi8gRVEsXG4gICAgLyogMHg1NSAqLyBORVEsXG4gICAgLyogMHg1NiAqLyBPREQsXG4gICAgLyogMHg1NyAqLyBFVkVOLFxuICAgIC8qIDB4NTggKi8gSUYsXG4gICAgLyogMHg1OSAqLyBFSUYsXG4gICAgLyogMHg1QSAqLyBBTkQsXG4gICAgLyogMHg1QiAqLyBPUixcbiAgICAvKiAweDVDICovIE5PVCxcbiAgICAvKiAweDVEICovIERFTFRBUDEyMy5iaW5kKHVuZGVmaW5lZCwgMSksXG4gICAgLyogMHg1RSAqLyBTREIsXG4gICAgLyogMHg1RiAqLyBTRFMsXG4gICAgLyogMHg2MCAqLyBBREQsXG4gICAgLyogMHg2MSAqLyBTVUIsXG4gICAgLyogMHg2MiAqLyBESVYsXG4gICAgLyogMHg2MyAqLyBNVUwsXG4gICAgLyogMHg2NCAqLyBBQlMsXG4gICAgLyogMHg2NSAqLyBORUcsXG4gICAgLyogMHg2NiAqLyBGTE9PUixcbiAgICAvKiAweDY3ICovIENFSUxJTkcsXG4gICAgLyogMHg2OCAqLyBST1VORC5iaW5kKHVuZGVmaW5lZCwgMCksXG4gICAgLyogMHg2OSAqLyBST1VORC5iaW5kKHVuZGVmaW5lZCwgMSksXG4gICAgLyogMHg2QSAqLyBST1VORC5iaW5kKHVuZGVmaW5lZCwgMiksXG4gICAgLyogMHg2QiAqLyBST1VORC5iaW5kKHVuZGVmaW5lZCwgMyksXG4gICAgLyogMHg2QyAqLyB1bmRlZmluZWQsICAgLy8gVE9ETyBOUk9VTkRbYWJdXG4gICAgLyogMHg2RCAqLyB1bmRlZmluZWQsICAgLy8gVE9ETyBOUk9VTkRbYWJdXG4gICAgLyogMHg2RSAqLyB1bmRlZmluZWQsICAgLy8gVE9ETyBOUk9VTkRbYWJdXG4gICAgLyogMHg2RiAqLyB1bmRlZmluZWQsICAgLy8gVE9ETyBOUk9VTkRbYWJdXG4gICAgLyogMHg3MCAqLyBXQ1ZURixcbiAgICAvKiAweDcxICovIERFTFRBUDEyMy5iaW5kKHVuZGVmaW5lZCwgMiksXG4gICAgLyogMHg3MiAqLyBERUxUQVAxMjMuYmluZCh1bmRlZmluZWQsIDMpLFxuICAgIC8qIDB4NzMgKi8gREVMVEFDMTIzLmJpbmQodW5kZWZpbmVkLCAxKSxcbiAgICAvKiAweDc0ICovIERFTFRBQzEyMy5iaW5kKHVuZGVmaW5lZCwgMiksXG4gICAgLyogMHg3NSAqLyBERUxUQUMxMjMuYmluZCh1bmRlZmluZWQsIDMpLFxuICAgIC8qIDB4NzYgKi8gU1JPVU5ELFxuICAgIC8qIDB4NzcgKi8gUzQ1Uk9VTkQsXG4gICAgLyogMHg3OCAqLyB1bmRlZmluZWQsICAgLy8gVE9ETyBKUk9UW11cbiAgICAvKiAweDc5ICovIHVuZGVmaW5lZCwgICAvLyBUT0RPIEpST0ZbXVxuICAgIC8qIDB4N0EgKi8gUk9GRixcbiAgICAvKiAweDdCICovIHVuZGVmaW5lZCxcbiAgICAvKiAweDdDICovIFJVVEcsXG4gICAgLyogMHg3RCAqLyBSRFRHLFxuICAgIC8qIDB4N0UgKi8gUE9QLCAvLyBhY3R1YWxseSBTQU5HVywgc3VwcG9zZWQgdG8gZG8gb25seSBhIHBvcCB0aG91Z2hcbiAgICAvKiAweDdGICovIFBPUCwgLy8gYWN0dWFsbHkgQUEsIHN1cHBvc2VkIHRvIGRvIG9ubHkgYSBwb3AgdGhvdWdoXG4gICAgLyogMHg4MCAqLyB1bmRlZmluZWQsICAgLy8gVE9ETyBGTElQUFRcbiAgICAvKiAweDgxICovIHVuZGVmaW5lZCwgICAvLyBUT0RPIEZMSVBSR09OXG4gICAgLyogMHg4MiAqLyB1bmRlZmluZWQsICAgLy8gVE9ETyBGTElQUkdPRkZcbiAgICAvKiAweDgzICovIHVuZGVmaW5lZCxcbiAgICAvKiAweDg0ICovIHVuZGVmaW5lZCxcbiAgICAvKiAweDg1ICovIFNDQU5DVFJMLFxuICAgIC8qIDB4ODYgKi8gU0RQVlRMLmJpbmQodW5kZWZpbmVkLCAwKSxcbiAgICAvKiAweDg3ICovIFNEUFZUTC5iaW5kKHVuZGVmaW5lZCwgMSksXG4gICAgLyogMHg4OCAqLyBHRVRJTkZPLFxuICAgIC8qIDB4ODkgKi8gdW5kZWZpbmVkLCAgIC8vIFRPRE8gSURFRlxuICAgIC8qIDB4OEEgKi8gUk9MTCxcbiAgICAvKiAweDhCICovIE1BWCxcbiAgICAvKiAweDhDICovIE1JTixcbiAgICAvKiAweDhEICovIFNDQU5UWVBFLFxuICAgIC8qIDB4OEUgKi8gSU5TVENUUkwsXG4gICAgLyogMHg4RiAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5MCAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5MSAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5MiAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5MyAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5NCAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5NSAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5NiAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5NyAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5OCAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5OSAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5QSAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5QiAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5QyAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5RCAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5RSAqLyB1bmRlZmluZWQsXG4gICAgLyogMHg5RiAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBMCAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBMSAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBMiAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBMyAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBNCAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBNSAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBNiAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBNyAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBOCAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBOSAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBQSAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBQiAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBQyAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBRCAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBRSAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhBRiAqLyB1bmRlZmluZWQsXG4gICAgLyogMHhCMCAqLyBQVVNIQi5iaW5kKHVuZGVmaW5lZCwgMSksXG4gICAgLyogMHhCMSAqLyBQVVNIQi5iaW5kKHVuZGVmaW5lZCwgMiksXG4gICAgLyogMHhCMiAqLyBQVVNIQi5iaW5kKHVuZGVmaW5lZCwgMyksXG4gICAgLyogMHhCMyAqLyBQVVNIQi5iaW5kKHVuZGVmaW5lZCwgNCksXG4gICAgLyogMHhCNCAqLyBQVVNIQi5iaW5kKHVuZGVmaW5lZCwgNSksXG4gICAgLyogMHhCNSAqLyBQVVNIQi5iaW5kKHVuZGVmaW5lZCwgNiksXG4gICAgLyogMHhCNiAqLyBQVVNIQi5iaW5kKHVuZGVmaW5lZCwgNyksXG4gICAgLyogMHhCNyAqLyBQVVNIQi5iaW5kKHVuZGVmaW5lZCwgOCksXG4gICAgLyogMHhCOCAqLyBQVVNIVy5iaW5kKHVuZGVmaW5lZCwgMSksXG4gICAgLyogMHhCOSAqLyBQVVNIVy5iaW5kKHVuZGVmaW5lZCwgMiksXG4gICAgLyogMHhCQSAqLyBQVVNIVy5iaW5kKHVuZGVmaW5lZCwgMyksXG4gICAgLyogMHhCQiAqLyBQVVNIVy5iaW5kKHVuZGVmaW5lZCwgNCksXG4gICAgLyogMHhCQyAqLyBQVVNIVy5iaW5kKHVuZGVmaW5lZCwgNSksXG4gICAgLyogMHhCRCAqLyBQVVNIVy5iaW5kKHVuZGVmaW5lZCwgNiksXG4gICAgLyogMHhCRSAqLyBQVVNIVy5iaW5kKHVuZGVmaW5lZCwgNyksXG4gICAgLyogMHhCRiAqLyBQVVNIVy5iaW5kKHVuZGVmaW5lZCwgOCksXG4gICAgLyogMHhDMCAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDAsIDAsIDAsIDApLFxuICAgIC8qIDB4QzEgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAwLCAwLCAwLCAxKSxcbiAgICAvKiAweEMyICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMCwgMCwgMCwgMCwgMiksXG4gICAgLyogMHhDMyAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDAsIDAsIDAsIDMpLFxuICAgIC8qIDB4QzQgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAwLCAwLCAxLCAwKSxcbiAgICAvKiAweEM1ICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMCwgMCwgMCwgMSwgMSksXG4gICAgLyogMHhDNiAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDAsIDAsIDEsIDIpLFxuICAgIC8qIDB4QzcgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAwLCAwLCAxLCAzKSxcbiAgICAvKiAweEM4ICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMCwgMCwgMSwgMCwgMCksXG4gICAgLyogMHhDOSAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDAsIDEsIDAsIDEpLFxuICAgIC8qIDB4Q0EgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAwLCAxLCAwLCAyKSxcbiAgICAvKiAweENCICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMCwgMCwgMSwgMCwgMyksXG4gICAgLyogMHhDQyAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDAsIDEsIDEsIDApLFxuICAgIC8qIDB4Q0QgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAwLCAxLCAxLCAxKSxcbiAgICAvKiAweENFICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMCwgMCwgMSwgMSwgMiksXG4gICAgLyogMHhDRiAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDAsIDEsIDEsIDMpLFxuICAgIC8qIDB4RDAgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAxLCAwLCAwLCAwKSxcbiAgICAvKiAweEQxICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMCwgMSwgMCwgMCwgMSksXG4gICAgLyogMHhEMiAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDEsIDAsIDAsIDIpLFxuICAgIC8qIDB4RDMgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAxLCAwLCAwLCAzKSxcbiAgICAvKiAweEQ0ICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMCwgMSwgMCwgMSwgMCksXG4gICAgLyogMHhENSAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDEsIDAsIDEsIDEpLFxuICAgIC8qIDB4RDYgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAxLCAwLCAxLCAyKSxcbiAgICAvKiAweEQ3ICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMCwgMSwgMCwgMSwgMyksXG4gICAgLyogMHhEOCAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDEsIDEsIDAsIDApLFxuICAgIC8qIDB4RDkgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAxLCAxLCAwLCAxKSxcbiAgICAvKiAweERBICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMCwgMSwgMSwgMCwgMiksXG4gICAgLyogMHhEQiAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDEsIDEsIDAsIDMpLFxuICAgIC8qIDB4REMgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAxLCAxLCAxLCAwKSxcbiAgICAvKiAweEREICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMCwgMSwgMSwgMSwgMSksXG4gICAgLyogMHhERSAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDAsIDEsIDEsIDEsIDIpLFxuICAgIC8qIDB4REYgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAwLCAxLCAxLCAxLCAzKSxcbiAgICAvKiAweEUwICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMCwgMCwgMCwgMCksXG4gICAgLyogMHhFMSAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDAsIDAsIDAsIDEpLFxuICAgIC8qIDB4RTIgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAxLCAwLCAwLCAwLCAyKSxcbiAgICAvKiAweEUzICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMCwgMCwgMCwgMyksXG4gICAgLyogMHhFNCAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDAsIDAsIDEsIDApLFxuICAgIC8qIDB4RTUgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAxLCAwLCAwLCAxLCAxKSxcbiAgICAvKiAweEU2ICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMCwgMCwgMSwgMiksXG4gICAgLyogMHhFNyAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDAsIDAsIDEsIDMpLFxuICAgIC8qIDB4RTggKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAxLCAwLCAxLCAwLCAwKSxcbiAgICAvKiAweEU5ICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMCwgMSwgMCwgMSksXG4gICAgLyogMHhFQSAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDAsIDEsIDAsIDIpLFxuICAgIC8qIDB4RUIgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAxLCAwLCAxLCAwLCAzKSxcbiAgICAvKiAweEVDICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMCwgMSwgMSwgMCksXG4gICAgLyogMHhFRCAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDAsIDEsIDEsIDEpLFxuICAgIC8qIDB4RUUgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAxLCAwLCAxLCAxLCAyKSxcbiAgICAvKiAweEVGICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMCwgMSwgMSwgMyksXG4gICAgLyogMHhGMCAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDEsIDAsIDAsIDApLFxuICAgIC8qIDB4RjEgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAxLCAxLCAwLCAwLCAxKSxcbiAgICAvKiAweEYyICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMSwgMCwgMCwgMiksXG4gICAgLyogMHhGMyAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDEsIDAsIDAsIDMpLFxuICAgIC8qIDB4RjQgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAxLCAxLCAwLCAxLCAwKSxcbiAgICAvKiAweEY1ICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMSwgMCwgMSwgMSksXG4gICAgLyogMHhGNiAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDEsIDAsIDEsIDIpLFxuICAgIC8qIDB4RjcgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAxLCAxLCAwLCAxLCAzKSxcbiAgICAvKiAweEY4ICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMSwgMSwgMCwgMCksXG4gICAgLyogMHhGOSAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDEsIDEsIDAsIDEpLFxuICAgIC8qIDB4RkEgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAxLCAxLCAxLCAwLCAyKSxcbiAgICAvKiAweEZCICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMSwgMSwgMCwgMyksXG4gICAgLyogMHhGQyAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDEsIDEsIDEsIDApLFxuICAgIC8qIDB4RkQgKi8gTURSUF9NSVJQLmJpbmQodW5kZWZpbmVkLCAxLCAxLCAxLCAxLCAxKSxcbiAgICAvKiAweEZFICovIE1EUlBfTUlSUC5iaW5kKHVuZGVmaW5lZCwgMSwgMSwgMSwgMSwgMiksXG4gICAgLyogMHhGRiAqLyBNRFJQX01JUlAuYmluZCh1bmRlZmluZWQsIDEsIDEsIDEsIDEsIDMpXG5dO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIE1hdGhlbWF0aWNhbCBDb25zaWRlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbmZ2IC4uLiByZWZlcnMgdG8gZnJlZWRvbSB2ZWN0b3JcbnB2IC4uLiByZWZlcnMgdG8gcHJvamVjdGlvbiB2ZWN0b3JcbnJwIC4uLiByZWZlcnMgdG8gcmVmZXJlbmNlIHBvaW50XG5wICAuLi4gcmVmZXJzIHRvIHRvIHBvaW50IGJlaW5nIG9wZXJhdGVkIG9uXG5kICAuLi4gcmVmZXJzIHRvIGRpc3RhbmNlXG5cblNFVFJFTEFUSVZFOlxuPT09PT09PT09PT09XG5cbmNhc2UgZnJlZWRvbSB2ZWN0b3IgPT0geC1heGlzOlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIChwdilcbiAgICAgICAgICAgICAgICAgICAgIC4tJ1xuICAgICAgICAgICAgICBycGQgLi0nXG4gICAgICAgICAgICAgICAuLSpcbiAgICAgICAgICBkIC4tJzkwwrAnXG4gICAgICAgICAuLScgICAgICAgJ1xuICAgICAgLi0nICAgICAgICAgICAnXG4gICAqLScgICAgICAgICAgICAgICAnIGJcbiAgcnAgICAgICAgICAgICAgICAgICAnXG4gICAgICAgICAgICAgICAgICAgICAgICdcbiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgICAgICAgICAgIHAgKi0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0gKGZ2KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbVxuXG4gIHJwZHggPSBycHggKyBkICogcHYueFxuICBycGR5ID0gcnB5ICsgZCAqIHB2LnlcblxuICBlcXVhdGlvbiBvZiBsaW5lIGJcblxuICAgeSAtIHJwZHkgPSBwdm5zICogKHgtIHJwZHgpXG5cbiAgIHkgPSBwLnlcblxuICAgeCA9IHJwZHggKyAoIHAueSAtIHJwZHkgKSAvIHB2bnNcblxuXG5jYXNlIGZyZWVkb20gdmVjdG9yID09IHktYXhpczpcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgKiBwbVxuICAgIHxcXFxuICAgIHwgXFxcbiAgICB8ICBcXFxuICAgIHwgICBcXFxuICAgIHwgICAgXFxcbiAgICB8ICAgICBcXFxuICAgIHwgICAgICBcXFxuICAgIHwgICAgICAgXFxcbiAgICB8ICAgICAgICBcXFxuICAgIHwgICAgICAgICBcXCBiXG4gICAgfCAgICAgICAgICBcXFxuICAgIHwgICAgICAgICAgIFxcXG4gICAgfCAgICAgICAgICAgIFxcICAgIC4tJyAocHYpXG4gICAgfCAgICAgICAgIDkwwrAgXFwuLSdcbiAgICB8ICAgICAgICAgICAuLScqIHJwZFxuICAgIHwgICAgICAgIC4tJ1xuICAgICogICAgICotJyAgZFxuICAgIHAgICAgIHJwXG5cbiAgcnBkeCA9IHJweCArIGQgKiBwdi54XG4gIHJwZHkgPSBycHkgKyBkICogcHYueVxuXG4gIGVxdWF0aW9uIG9mIGxpbmUgYjpcbiAgICAgICAgICAgcHZucyAuLi4gbm9ybWFsIHNsb3BlIHRvIHB2XG5cbiAgIHkgLSBycGR5ID0gcHZucyAqICh4IC0gcnBkeClcblxuICAgeCA9IHAueFxuXG4gICB5ID0gcnBkeSArICBwdm5zICogKHAueCAtIHJwZHgpXG5cblxuXG5nZW5lcmljIGNhc2U6XG4tLS0tLS0tLS0tLS0tXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLicoZnYpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLiogcG1cbiAgICAgICAgICAgICAgICAgICAgICAgIC4nICFcbiAgICAgICAgICAgICAgICAgICAgICAuJyAgICAuXG4gICAgICAgICAgICAgICAgICAgIC4nICAgICAgIVxuICAgICAgICAgICAgICAgICAgLicgICAgICAgICAuIGJcbiAgICAgICAgICAgICAgICAuJyAgICAgICAgICAgIVxuICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgLlxuICAgICAgICAgICAgICBwICAgICAgICAgICAgICAgIVxuICAgICAgICAgICAgICAgICAgICAgICAgIDkwwrAgICAuICAgIC4uLiAocHYpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4tKi0nJydcbiAgICAgICAgICAgICAgICAgIC4uLi0tLScnJyAgICBycGRcbiAgICAgICAgIC4uLi0tLScnJyAgIGRcbiAgICotLScnJ1xuICBycFxuXG4gICAgcnBkeCA9IHJweCArIGQgKiBwdi54XG4gICAgcnBkeSA9IHJweSArIGQgKiBwdi55XG5cbiBlcXVhdGlvbiBvZiBsaW5lIGI6XG4gICAgcHZucy4uLiBub3JtYWwgc2xvcGUgdG8gcHZcblxuICAgIHkgLSBycGR5ID0gcHZucyAqICh4IC0gcnBkeClcblxuIGVxdWF0aW9uIG9mIGZyZWVkb20gdmVjdG9yIGxpbmU6XG4gICAgZnZzIC4uLiBzbG9wZSBvZiBmcmVlZG9tIHZlY3RvciAoPWZ5L2Z4KVxuXG4gICAgeSAtIHB5ID0gZnZzICogKHggLSBweClcblxuXG4gIG9uIHBtIGJvdGggZXF1YXRpb25zIGFyZSB0cnVlIGZvciBzYW1lIHgveVxuXG4gICAgeSAtIHJwZHkgPSBwdm5zICogKHggLSBycGR4KVxuXG4gICAgeSAtIHB5ID0gZnZzICogKHggLSBweClcblxuICBmb3JtIHRvIHkgYW5kIHNldCBlcXVhbDpcblxuICAgIHB2bnMgKiAoeCAtIHJwZHgpICsgcnBkeSA9IGZ2cyAqICh4IC0gcHgpICsgcHlcblxuICBleHBhbmQ6XG5cbiAgICBwdm5zICogeCAtIHB2bnMgKiBycGR4ICsgcnBkeSA9IGZ2cyAqIHggLSBmdnMgKiBweCArIHB5XG5cbiAgc3dpdGNoOlxuXG4gICAgZnZzICogeCAtIGZ2cyAqIHB4ICsgcHkgPSBwdm5zICogeCAtIHB2bnMgKiBycGR4ICsgcnBkeVxuXG4gIHNvbHZlIGZvciB4OlxuXG4gICAgZnZzICogeCAtIHB2bnMgKiB4ID0gZnZzICogcHggLSBwdm5zICogcnBkeCAtIHB5ICsgcnBkeVxuXG5cblxuICAgICAgICAgIGZ2cyAqIHB4IC0gcHZucyAqIHJwZHggKyBycGR5IC0gcHlcbiAgICB4ID0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICAgICAgIGZ2cyAtIHB2bnNcblxuICBhbmQ6XG5cbiAgICB5ID0gZnZzICogKHggLSBweCkgKyBweVxuXG5cblxuSU5URVJQT0xBVEU6XG49PT09PT09PT09PT1cblxuRXhhbXBsZXMgb2YgcG9pbnQgaW50ZXJwb2xhdGlvbi5cblxuVGhlIHdlaWdodCBvZiB0aGUgbW92ZW1lbnQgb2YgdGhlIHJlZmVyZW5jZSBwb2ludCBnZXRzIGJpZ2dlclxudGhlIGZ1cnRoZXIgdGhlIG90aGVyIHJlZmVyZW5jZSBwb2ludCBpcyBhd2F5LCB0aHVzIHRoZSBzYWZlc3Rcbm9wdGlvbiAodGhhdCBpcyBhdm9pZGluZyAwLzAgZGl2aXNpb25zKSBpcyB0byB3ZWlnaHQgdGhlXG5vcmlnaW5hbCBkaXN0YW5jZSBvZiB0aGUgb3RoZXIgcG9pbnQgYnkgdGhlIHN1bSBvZiBib3RoIGRpc3RhbmNlcy5cblxuSWYgdGhlIHN1bSBvZiBib3RoIGRpc3RhbmNlcyBpcyAwLCB0aGVuIG1vdmUgdGhlIHBvaW50IGJ5IHRoZVxuYXJpdGhtZXRpYyBhdmVyYWdlIG9mIHRoZSBtb3ZlbWVudCBvZiBib3RoIHJlZmVyZW5jZSBwb2ludHMuXG5cblxuXG5cbiAgICAgICAgICAgKCs2KVxuICAgIHJwMW8gKi0tLS0+KnJwMVxuICAgICAgICAgLiAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgKCsxMilcbiAgICAgICAgIC4gICAgIC4gICAgICAgICAgICAgICAgICBycDJvICotLS0tLS0tLS0tPiogcnAyXG4gICAgICAgICAuICAgICAuICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAuXG4gICAgICAgICAuICAgICAuICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAuXG4gICAgICAgICAuICAgIDEwICAgICAgICAgIDIwICAgICAgICAgICAuICAgICAgICAgICAuXG4gICAgICAgICB8Li4uLi4uLi4ufC4uLi4uLi4uLi4uLi4uLi4uLi58ICAgICAgICAgICAuXG4gICAgICAgICAgICAgICAuICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuXG4gICAgICAgICAgICAgICAuICAgLiAoKzgpICAgICAgICAgICAgICAgICAgICAgICAgICAuXG4gICAgICAgICAgICAgICAgcG8gKi0tLS0tLT4qcCAgICAgICAgICAgICAgICAgICAgICAuXG4gICAgICAgICAgICAgICAuICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAuXG4gICAgICAgICAgICAgICAuICAgIDEyICAgICAuICAgICAgICAgIDI0ICAgICAgICAgICAuXG4gICAgICAgICAgICAgICB8Li4uLi4uLi4uLi58Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi58XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzZcblxuXG4tLS0tLS0tXG5cblxuXG4gICAgICAgICAgICgrMTApXG4gICAgcnAxbyAqLS0tLS0tLS0+KnJwMVxuICAgICAgICAgLiAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgKC0xMClcbiAgICAgICAgIC4gICAgICAgICAuICAgICAgICAgICAgICBycDIgKjwtLS0tLS0tLS0qIHJwbzJcbiAgICAgICAgIC4gICAgICAgICAuICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAuXG4gICAgICAgICAuICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAuICAgICAgICAgLlxuICAgICAgICAgLiAgICAxMCAgIC4gICAgICAgICAgMzAgICAgICAgLiAgICAgICAgIC5cbiAgICAgICAgIHwuLi4uLi4uLi58Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi58XG4gICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAuXG4gICAgICAgICAgICAgICAgICAgLiAoKzUpICAgICAgICAgICAgICAuXG4gICAgICAgICAgICAgICAgcG8gKi0tLT4qIHAgICAgICAgICAgICAuXG4gICAgICAgICAgICAgICAgICAgLiAgICAuICAgICAgICAgICAgICAuXG4gICAgICAgICAgICAgICAgICAgLiAgICAuICAgMjAgICAgICAgICAuXG4gICAgICAgICAgICAgICAgICAgfC4uLi58Li4uLi4uLi4uLi4uLi58XG4gICAgICAgICAgICAgICAgICAgICA1ICAgICAgICAxNVxuXG5cbi0tLS0tLS1cblxuXG4gICAgICAgICAgICgrMTApXG4gICAgcnAxbyAqLS0tLS0tLS0+KnJwMVxuICAgICAgICAgLiAgICAgICAgIC5cbiAgICAgICAgIC4gICAgICAgICAuXG4gICAgcnAybyAqLS0tLS0tLS0+KnJwMlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKzEwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbyAqLS0tLS0tLS0+KiBwXG5cbi0tLS0tLS1cblxuXG4gICAgICAgICAgICgrMTApXG4gICAgcnAxbyAqLS0tLS0tLS0+KnJwMVxuICAgICAgICAgLiAgICAgICAgIC5cbiAgICAgICAgIC4gICAgICAgICAuKCszMClcbiAgICBycDJvICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPipycDJcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCsyNSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcG8gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiogcFxuXG5cblxudmltOiBzZXQgdHM9NCBzdz00IGV4cGFuZHRhYjpcbioqKioqL1xuXG4vLyBUaGUgRm9udCBvYmplY3RcblxuLyoqXG4gKiBAdHlwZWRlZiBGb250T3B0aW9uc1xuICogQHR5cGUgT2JqZWN0XG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVtcHR5IC0gd2hldGhlciB0byBjcmVhdGUgYSBuZXcgZW1wdHkgZm9udFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhbWlseU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdHlsZU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gZnVsbE5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gcG9zdFNjcmlwdE5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gZGVzaWduZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gZGVzaWduZXJVUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gbWFudWZhY3R1cmVyXG4gKiBAcHJvcGVydHkge3N0cmluZz19IG1hbnVmYWN0dXJlclVSTFxuICogQHByb3BlcnR5IHtzdHJpbmc9fSBsaWNlbnNlXG4gKiBAcHJvcGVydHkge3N0cmluZz19IGxpY2Vuc2VVUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gdmVyc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmc9fSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmc9fSBjb3B5cmlnaHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gdHJhZGVtYXJrXG4gKiBAcHJvcGVydHkge051bWJlcn0gdW5pdHNQZXJFbVxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGFzY2VuZGVyXG4gKiBAcHJvcGVydHkge051bWJlcn0gZGVzY2VuZGVyXG4gKiBAcHJvcGVydHkge051bWJlcn0gY3JlYXRlZFRpbWVzdGFtcFxuICogQHByb3BlcnR5IHtzdHJpbmc9fSB3ZWlnaHRDbGFzc1xuICogQHByb3BlcnR5IHtzdHJpbmc9fSB3aWR0aENsYXNzXG4gKiBAcHJvcGVydHkge3N0cmluZz19IGZzU2VsZWN0aW9uXG4gKi9cblxuLyoqXG4gKiBBIEZvbnQgcmVwcmVzZW50cyBhIGxvYWRlZCBPcGVuVHlwZSBmb250IGZpbGUuXG4gKiBJdCBjb250YWlucyBhIHNldCBvZiBnbHlwaHMgYW5kIG1ldGhvZHMgdG8gZHJhdyB0ZXh0IG9uIGEgZHJhd2luZyBjb250ZXh0LFxuICogb3IgdG8gZ2V0IGEgcGF0aCByZXByZXNlbnRpbmcgdGhlIHRleHQuXG4gKiBAZXhwb3J0cyBvcGVudHlwZS5Gb250XG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7Rm9udE9wdGlvbnN9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gRm9udChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoIW9wdGlvbnMuZW1wdHkpIHtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSd2ZSBwcm92aWRlZCB0aGUgbWluaW11bSBzZXQgb2YgbmFtZXMuXG4gICAgICAgIGNoZWNrQXJndW1lbnQob3B0aW9ucy5mYW1pbHlOYW1lLCAnV2hlbiBjcmVhdGluZyBhIG5ldyBGb250IG9iamVjdCwgZmFtaWx5TmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgY2hlY2tBcmd1bWVudChvcHRpb25zLnN0eWxlTmFtZSwgJ1doZW4gY3JlYXRpbmcgYSBuZXcgRm9udCBvYmplY3QsIHN0eWxlTmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgY2hlY2tBcmd1bWVudChvcHRpb25zLnVuaXRzUGVyRW0sICdXaGVuIGNyZWF0aW5nIGEgbmV3IEZvbnQgb2JqZWN0LCB1bml0c1BlckVtIGlzIHJlcXVpcmVkLicpO1xuICAgICAgICBjaGVja0FyZ3VtZW50KG9wdGlvbnMuYXNjZW5kZXIsICdXaGVuIGNyZWF0aW5nIGEgbmV3IEZvbnQgb2JqZWN0LCBhc2NlbmRlciBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgY2hlY2tBcmd1bWVudChvcHRpb25zLmRlc2NlbmRlciwgJ1doZW4gY3JlYXRpbmcgYSBuZXcgRm9udCBvYmplY3QsIGRlc2NlbmRlciBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgY2hlY2tBcmd1bWVudChvcHRpb25zLmRlc2NlbmRlciA8IDAsICdEZXNjZW5kZXIgc2hvdWxkIGJlIG5lZ2F0aXZlIChlLmcuIC01MTIpLicpO1xuXG4gICAgICAgIC8vIE9TIFggd2lsbCBjb21wbGFpbiBpZiB0aGUgbmFtZXMgYXJlIGVtcHR5LCBzbyB3ZSBwdXQgYSBzaW5nbGUgc3BhY2UgZXZlcnl3aGVyZSBieSBkZWZhdWx0LlxuICAgICAgICB0aGlzLm5hbWVzID0ge1xuICAgICAgICAgICAgZm9udEZhbWlseToge2VuOiBvcHRpb25zLmZhbWlseU5hbWUgfHwgJyAnfSxcbiAgICAgICAgICAgIGZvbnRTdWJmYW1pbHk6IHtlbjogb3B0aW9ucy5zdHlsZU5hbWUgfHwgJyAnfSxcbiAgICAgICAgICAgIGZ1bGxOYW1lOiB7ZW46IG9wdGlvbnMuZnVsbE5hbWUgfHwgb3B0aW9ucy5mYW1pbHlOYW1lICsgJyAnICsgb3B0aW9ucy5zdHlsZU5hbWV9LFxuICAgICAgICAgICAgcG9zdFNjcmlwdE5hbWU6IHtlbjogb3B0aW9ucy5wb3N0U2NyaXB0TmFtZSB8fCBvcHRpb25zLmZhbWlseU5hbWUgKyBvcHRpb25zLnN0eWxlTmFtZX0sXG4gICAgICAgICAgICBkZXNpZ25lcjoge2VuOiBvcHRpb25zLmRlc2lnbmVyIHx8ICcgJ30sXG4gICAgICAgICAgICBkZXNpZ25lclVSTDoge2VuOiBvcHRpb25zLmRlc2lnbmVyVVJMIHx8ICcgJ30sXG4gICAgICAgICAgICBtYW51ZmFjdHVyZXI6IHtlbjogb3B0aW9ucy5tYW51ZmFjdHVyZXIgfHwgJyAnfSxcbiAgICAgICAgICAgIG1hbnVmYWN0dXJlclVSTDoge2VuOiBvcHRpb25zLm1hbnVmYWN0dXJlclVSTCB8fCAnICd9LFxuICAgICAgICAgICAgbGljZW5zZToge2VuOiBvcHRpb25zLmxpY2Vuc2UgfHwgJyAnfSxcbiAgICAgICAgICAgIGxpY2Vuc2VVUkw6IHtlbjogb3B0aW9ucy5saWNlbnNlVVJMIHx8ICcgJ30sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7ZW46IG9wdGlvbnMudmVyc2lvbiB8fCAnVmVyc2lvbiAwLjEnfSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB7ZW46IG9wdGlvbnMuZGVzY3JpcHRpb24gfHwgJyAnfSxcbiAgICAgICAgICAgIGNvcHlyaWdodDoge2VuOiBvcHRpb25zLmNvcHlyaWdodCB8fCAnICd9LFxuICAgICAgICAgICAgdHJhZGVtYXJrOiB7ZW46IG9wdGlvbnMudHJhZGVtYXJrIHx8ICcgJ31cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy51bml0c1BlckVtID0gb3B0aW9ucy51bml0c1BlckVtIHx8IDEwMDA7XG4gICAgICAgIHRoaXMuYXNjZW5kZXIgPSBvcHRpb25zLmFzY2VuZGVyO1xuICAgICAgICB0aGlzLmRlc2NlbmRlciA9IG9wdGlvbnMuZGVzY2VuZGVyO1xuICAgICAgICB0aGlzLmNyZWF0ZWRUaW1lc3RhbXAgPSBvcHRpb25zLmNyZWF0ZWRUaW1lc3RhbXA7XG4gICAgICAgIHRoaXMudGFibGVzID0geyBvczI6IHtcbiAgICAgICAgICAgIHVzV2VpZ2h0Q2xhc3M6IG9wdGlvbnMud2VpZ2h0Q2xhc3MgfHwgdGhpcy51c1dlaWdodENsYXNzZXMuTUVESVVNLFxuICAgICAgICAgICAgdXNXaWR0aENsYXNzOiBvcHRpb25zLndpZHRoQ2xhc3MgfHwgdGhpcy51c1dpZHRoQ2xhc3Nlcy5NRURJVU0sXG4gICAgICAgICAgICBmc1NlbGVjdGlvbjogb3B0aW9ucy5mc1NlbGVjdGlvbiB8fCB0aGlzLmZzU2VsZWN0aW9uVmFsdWVzLlJFR1VMQVJcbiAgICAgICAgfSB9O1xuICAgIH1cblxuICAgIHRoaXMuc3VwcG9ydGVkID0gdHJ1ZTsgLy8gRGVwcmVjYXRlZDogcGFyc2VCdWZmZXIgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBmb250IGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgdGhpcy5nbHlwaHMgPSBuZXcgZ2x5cGhzZXQuR2x5cGhTZXQodGhpcywgb3B0aW9ucy5nbHlwaHMgfHwgW10pO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBuZXcgRGVmYXVsdEVuY29kaW5nKHRoaXMpO1xuICAgIHRoaXMuc3Vic3RpdHV0aW9uID0gbmV3IFN1YnN0aXR1dGlvbih0aGlzKTtcbiAgICB0aGlzLnRhYmxlcyA9IHRoaXMudGFibGVzIHx8IHt9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoaW50aW5nJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hpbnRpbmcpIHsgcmV0dXJuIHRoaXMuX2hpbnRpbmc7IH1cbiAgICAgICAgICAgIGlmICh0aGlzLm91dGxpbmVzRm9ybWF0ID09PSAndHJ1ZXR5cGUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9oaW50aW5nID0gbmV3IEhpbnRpbmcodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGZvbnQgaGFzIGEgZ2x5cGggZm9yIHRoZSBnaXZlbiBjaGFyYWN0ZXIuXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5Gb250LnByb3RvdHlwZS5oYXNDaGFyID0gZnVuY3Rpb24oYykge1xuICAgIHJldHVybiB0aGlzLmVuY29kaW5nLmNoYXJUb0dseXBoSW5kZXgoYykgIT09IG51bGw7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgdGhlIGdpdmVuIGNoYXJhY3RlciB0byBhIHNpbmdsZSBnbHlwaCBpbmRleC5cbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBhIG9uZS10by1vbmUgbWFwcGluZyBiZXR3ZWVuXG4gKiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGFuZCBhIGdseXBoOyBmb3IgY29tcGxleCBzY3JpcHRzIHRoaXMgbWlnaHQgbm90IGJlIHRoZSBjYXNlLlxuICogQHBhcmFtICB7c3RyaW5nfVxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5Gb250LnByb3RvdHlwZS5jaGFyVG9HbHlwaEluZGV4ID0gZnVuY3Rpb24ocykge1xuICAgIHJldHVybiB0aGlzLmVuY29kaW5nLmNoYXJUb0dseXBoSW5kZXgocyk7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgdGhlIGdpdmVuIGNoYXJhY3RlciB0byBhIHNpbmdsZSBHbHlwaCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgYSBvbmUtdG8tb25lIG1hcHBpbmcgYmV0d2VlblxuICogdGhlIGdpdmVuIGNoYXJhY3RlciBhbmQgYSBnbHlwaDsgZm9yIGNvbXBsZXggc2NyaXB0cyB0aGlzIG1pZ2h0IG5vdCBiZSB0aGUgY2FzZS5cbiAqIEBwYXJhbSAge3N0cmluZ31cbiAqIEByZXR1cm4ge29wZW50eXBlLkdseXBofVxuICovXG5Gb250LnByb3RvdHlwZS5jaGFyVG9HbHlwaCA9IGZ1bmN0aW9uKGMpIHtcbiAgICB2YXIgZ2x5cGhJbmRleCA9IHRoaXMuY2hhclRvR2x5cGhJbmRleChjKTtcbiAgICB2YXIgZ2x5cGggPSB0aGlzLmdseXBocy5nZXQoZ2x5cGhJbmRleCk7XG4gICAgaWYgKCFnbHlwaCkge1xuICAgICAgICAvLyAubm90ZGVmXG4gICAgICAgIGdseXBoID0gdGhpcy5nbHlwaHMuZ2V0KDApO1xuICAgIH1cblxuICAgIHJldHVybiBnbHlwaDtcbn07XG5cbi8qKlxuICogQ29udmVydCB0aGUgZ2l2ZW4gdGV4dCB0byBhIGxpc3Qgb2YgR2x5cGggb2JqZWN0cy5cbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBzdHJpY3Qgb25lLXRvLW9uZSBtYXBwaW5nIGJldHdlZW4gY2hhcmFjdGVycyBhbmRcbiAqIGdseXBocywgc28gdGhlIGxpc3Qgb2YgcmV0dXJuZWQgZ2x5cGhzIGNhbiBiZSBsYXJnZXIgb3Igc21hbGxlciB0aGFuIHRoZVxuICogbGVuZ3RoIG9mIHRoZSBnaXZlbiBzdHJpbmcuXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcGFyYW0gIHtHbHlwaFJlbmRlck9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybiB7b3BlbnR5cGUuR2x5cGhbXX1cbiAqL1xuRm9udC5wcm90b3R5cGUuc3RyaW5nVG9HbHlwaHMgPSBmdW5jdGlvbihzLCBvcHRpb25zKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB0aGlzLmRlZmF1bHRSZW5kZXJPcHRpb25zO1xuICAgIC8vIEdldCBnbHlwaCBpbmRleGVzXG4gICAgdmFyIGluZGV4ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGMgPSBzW2ldO1xuICAgICAgICBpbmRleGVzLnB1c2godGhpcyQxLmNoYXJUb0dseXBoSW5kZXgoYykpO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gaW5kZXhlcy5sZW5ndGg7XG5cbiAgICAvLyBBcHBseSBzdWJzdGl0dXRpb25zIG9uIGdseXBoIGluZGV4ZXNcbiAgICBpZiAob3B0aW9ucy5mZWF0dXJlcykge1xuICAgICAgICB2YXIgc2NyaXB0ID0gb3B0aW9ucy5zY3JpcHQgfHwgdGhpcy5zdWJzdGl0dXRpb24uZ2V0RGVmYXVsdFNjcmlwdE5hbWUoKTtcbiAgICAgICAgdmFyIG1hbnlUb09uZSA9IFtdO1xuICAgICAgICBpZiAob3B0aW9ucy5mZWF0dXJlcy5saWdhKSB7IG1hbnlUb09uZSA9IG1hbnlUb09uZS5jb25jYXQodGhpcy5zdWJzdGl0dXRpb24uZ2V0RmVhdHVyZSgnbGlnYScsIHNjcmlwdCwgb3B0aW9ucy5sYW5ndWFnZSkpOyB9XG4gICAgICAgIGlmIChvcHRpb25zLmZlYXR1cmVzLnJsaWcpIHsgbWFueVRvT25lID0gbWFueVRvT25lLmNvbmNhdCh0aGlzLnN1YnN0aXR1dGlvbi5nZXRGZWF0dXJlKCdybGlnJywgc2NyaXB0LCBvcHRpb25zLmxhbmd1YWdlKSk7IH1cbiAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgbGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYW55VG9PbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbGlnYXR1cmUgPSBtYW55VG9PbmVbal07XG4gICAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBsaWdhdHVyZS5zdWI7XG4gICAgICAgICAgICAgICAgdmFyIGNvbXBDb3VudCA9IGNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBrID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoayA8IGNvbXBDb3VudCAmJiBjb21wb25lbnRzW2tdID09PSBpbmRleGVzW2kkMSArIGtdKSB7IGsrKzsgfVxuICAgICAgICAgICAgICAgIGlmIChrID09PSBjb21wQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlcy5zcGxpY2UoaSQxLCBjb21wQ291bnQsIGxpZ2F0dXJlLmJ5KTtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIC0gY29tcENvdW50ICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGdseXBoIGluZGV4ZXMgdG8gZ2x5cGggb2JqZWN0c1xuICAgIHZhciBnbHlwaHMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICB2YXIgbm90ZGVmID0gdGhpcy5nbHlwaHMuZ2V0KDApO1xuICAgIGZvciAodmFyIGkkMiA9IDA7IGkkMiA8IGxlbmd0aDsgaSQyICs9IDEpIHtcbiAgICAgICAgZ2x5cGhzW2kkMl0gPSB0aGlzJDEuZ2x5cGhzLmdldChpbmRleGVzW2kkMl0pIHx8IG5vdGRlZjtcbiAgICB9XG4gICAgcmV0dXJuIGdseXBocztcbn07XG5cbi8qKlxuICogQHBhcmFtICB7c3RyaW5nfVxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5Gb250LnByb3RvdHlwZS5uYW1lVG9HbHlwaEluZGV4ID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLmdseXBoTmFtZXMubmFtZVRvR2x5cGhJbmRleChuYW1lKTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7c3RyaW5nfVxuICogQHJldHVybiB7b3BlbnR5cGUuR2x5cGh9XG4gKi9cbkZvbnQucHJvdG90eXBlLm5hbWVUb0dseXBoID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBnbHlwaEluZGV4ID0gdGhpcy5uYW1lVG9HbHlwaEluZGV4KG5hbWUpO1xuICAgIHZhciBnbHlwaCA9IHRoaXMuZ2x5cGhzLmdldChnbHlwaEluZGV4KTtcbiAgICBpZiAoIWdseXBoKSB7XG4gICAgICAgIC8vIC5ub3RkZWZcbiAgICAgICAgZ2x5cGggPSB0aGlzLmdseXBocy5nZXQoMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdseXBoO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbkZvbnQucHJvdG90eXBlLmdseXBoSW5kZXhUb05hbWUgPSBmdW5jdGlvbihnaWQpIHtcbiAgICBpZiAoIXRoaXMuZ2x5cGhOYW1lcy5nbHlwaEluZGV4VG9OYW1lKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nbHlwaE5hbWVzLmdseXBoSW5kZXhUb05hbWUoZ2lkKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBrZXJuaW5nIHBhaXIgYmV0d2VlbiB0aGUgbGVmdCBnbHlwaCAob3IgaXRzIGluZGV4KVxuICogYW5kIHRoZSByaWdodCBnbHlwaCAob3IgaXRzIGluZGV4KS4gSWYgbm8ga2VybmluZyBwYWlyIGlzIGZvdW5kLCByZXR1cm4gMC5cbiAqIFRoZSBrZXJuaW5nIHZhbHVlIGdldHMgYWRkZWQgdG8gdGhlIGFkdmFuY2Ugd2lkdGggd2hlbiBjYWxjdWxhdGluZyB0aGUgc3BhY2luZ1xuICogYmV0d2VlbiBnbHlwaHMuXG4gKiBAcGFyYW0gIHtvcGVudHlwZS5HbHlwaH0gbGVmdEdseXBoXG4gKiBAcGFyYW0gIHtvcGVudHlwZS5HbHlwaH0gcmlnaHRHbHlwaFxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5Gb250LnByb3RvdHlwZS5nZXRLZXJuaW5nVmFsdWUgPSBmdW5jdGlvbihsZWZ0R2x5cGgsIHJpZ2h0R2x5cGgpIHtcbiAgICBsZWZ0R2x5cGggPSBsZWZ0R2x5cGguaW5kZXggfHwgbGVmdEdseXBoO1xuICAgIHJpZ2h0R2x5cGggPSByaWdodEdseXBoLmluZGV4IHx8IHJpZ2h0R2x5cGg7XG4gICAgdmFyIGdwb3NLZXJuaW5nID0gdGhpcy5nZXRHcG9zS2VybmluZ1ZhbHVlO1xuICAgIHJldHVybiBncG9zS2VybmluZyA/IGdwb3NLZXJuaW5nKGxlZnRHbHlwaCwgcmlnaHRHbHlwaCkgOlxuICAgICAgICAodGhpcy5rZXJuaW5nUGFpcnNbbGVmdEdseXBoICsgJywnICsgcmlnaHRHbHlwaF0gfHwgMCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIEdseXBoUmVuZGVyT3B0aW9uc1xuICogQHR5cGUgT2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NjcmlwdF0gLSBzY3JpcHQgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggZmVhdHVyZXMgdG8gYXBwbHkuIEJ5IGRlZmF1bHQsICdERkxUJyBvciAnbGF0bicgaXMgdXNlZC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL3NjcmlwdHRhZ3MuaHRtXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2xhbmd1YWdlPSdkZmx0J10gLSBsYW5ndWFnZSBzeXN0ZW0gdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggZmVhdHVyZXMgdG8gYXBwbHkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L2RldmVsb3BlcnMvb3BlbnR5cGUvbGFuZ3VhZ2V0YWdzLmFzcHhcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlcm5pbmc9dHJ1ZV0gLSB3aGV0aGVyIHRvIGluY2x1ZGUga2VybmluZyB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbZmVhdHVyZXNdIC0gT3BlblR5cGUgTGF5b3V0IGZlYXR1cmUgdGFncy4gVXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZmVhdHVyZXMgb2YgdGhlIGdpdmVuIHNjcmlwdC9sYW5ndWFnZSBzeXN0ZW0uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL2ZlYXR1cmV0YWdzLmh0bVxuICovXG5Gb250LnByb3RvdHlwZS5kZWZhdWx0UmVuZGVyT3B0aW9ucyA9IHtcbiAgICBrZXJuaW5nOiB0cnVlLFxuICAgIGZlYXR1cmVzOiB7XG4gICAgICAgIGxpZ2E6IHRydWUsXG4gICAgICAgIHJsaWc6IHRydWVcbiAgICB9XG59O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBlYWNoIGdseXBoIGluIHRoZSBnaXZlbiB0ZXh0LlxuICogVGhlIGNhbGxiYWNrIGdldHMgYChnbHlwaCwgeCwgeSwgZm9udFNpemUsIG9wdGlvbnMpYC4qIEBwYXJhbSAge3N0cmluZ30gdGV4dFxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgdGV4dCB0byBhcHBseS5cbiAqIEBwYXJhbSAge251bWJlcn0gW3g9MF0gLSBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFt5PTBdIC0gVmVydGljYWwgcG9zaXRpb24gb2YgdGhlICpiYXNlbGluZSogb2YgdGhlIHRleHQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFtmb250U2l6ZT03Ml0gLSBGb250IHNpemUgaW4gcGl4ZWxzLiBXZSBzY2FsZSB0aGUgZ2x5cGggdW5pdHMgYnkgYDEgLyB1bml0c1BlckVtICogZm9udFNpemVgLlxuICogQHBhcmFtICB7R2x5cGhSZW5kZXJPcHRpb25zPX0gb3B0aW9uc1xuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKi9cbkZvbnQucHJvdG90eXBlLmZvckVhY2hHbHlwaCA9IGZ1bmN0aW9uKHRleHQsIHgsIHksIGZvbnRTaXplLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgeCA9IHggIT09IHVuZGVmaW5lZCA/IHggOiAwO1xuICAgIHkgPSB5ICE9PSB1bmRlZmluZWQgPyB5IDogMDtcbiAgICBmb250U2l6ZSA9IGZvbnRTaXplICE9PSB1bmRlZmluZWQgPyBmb250U2l6ZSA6IDcyO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMuZGVmYXVsdFJlbmRlck9wdGlvbnM7XG4gICAgdmFyIGZvbnRTY2FsZSA9IDEgLyB0aGlzLnVuaXRzUGVyRW0gKiBmb250U2l6ZTtcbiAgICB2YXIgZ2x5cGhzID0gdGhpcy5zdHJpbmdUb0dseXBocyh0ZXh0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcyQxLCBnbHlwaCwgeCwgeSwgZm9udFNpemUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoZ2x5cGguYWR2YW5jZVdpZHRoKSB7XG4gICAgICAgICAgICB4ICs9IGdseXBoLmFkdmFuY2VXaWR0aCAqIGZvbnRTY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmtlcm5pbmcgJiYgaSA8IGdseXBocy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB2YXIga2VybmluZ1ZhbHVlID0gdGhpcyQxLmdldEtlcm5pbmdWYWx1ZShnbHlwaCwgZ2x5cGhzW2kgKyAxXSk7XG4gICAgICAgICAgICB4ICs9IGtlcm5pbmdWYWx1ZSAqIGZvbnRTY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmxldHRlclNwYWNpbmcpIHtcbiAgICAgICAgICAgIHggKz0gb3B0aW9ucy5sZXR0ZXJTcGFjaW5nICogZm9udFNpemU7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy50cmFja2luZykge1xuICAgICAgICAgICAgeCArPSAob3B0aW9ucy50cmFja2luZyAvIDEwMDApICogZm9udFNpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHg7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIFBhdGggb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gdGV4dC5cbiAqIEBwYXJhbSAge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSAge251bWJlcn0gW3g9MF0gLSBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFt5PTBdIC0gVmVydGljYWwgcG9zaXRpb24gb2YgdGhlICpiYXNlbGluZSogb2YgdGhlIHRleHQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFtmb250U2l6ZT03Ml0gLSBGb250IHNpemUgaW4gcGl4ZWxzLiBXZSBzY2FsZSB0aGUgZ2x5cGggdW5pdHMgYnkgYDEgLyB1bml0c1BlckVtICogZm9udFNpemVgLlxuICogQHBhcmFtICB7R2x5cGhSZW5kZXJPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybiB7b3BlbnR5cGUuUGF0aH1cbiAqL1xuRm9udC5wcm90b3R5cGUuZ2V0UGF0aCA9IGZ1bmN0aW9uKHRleHQsIHgsIHksIGZvbnRTaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIGZ1bGxQYXRoID0gbmV3IFBhdGgoKTtcbiAgICB0aGlzLmZvckVhY2hHbHlwaCh0ZXh0LCB4LCB5LCBmb250U2l6ZSwgb3B0aW9ucywgZnVuY3Rpb24oZ2x5cGgsIGdYLCBnWSwgZ0ZvbnRTaXplKSB7XG4gICAgICAgIHZhciBnbHlwaFBhdGggPSBnbHlwaC5nZXRQYXRoKGdYLCBnWSwgZ0ZvbnRTaXplLCBvcHRpb25zLCB0aGlzKTtcbiAgICAgICAgZnVsbFBhdGguZXh0ZW5kKGdseXBoUGF0aCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bGxQYXRoO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gYXJyYXkgb2YgUGF0aCBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHRoZSBnbHlwaHMgb2YgYSBnaXZlbiB0ZXh0LlxuICogQHBhcmFtICB7c3RyaW5nfSB0ZXh0IC0gVGhlIHRleHQgdG8gY3JlYXRlLlxuICogQHBhcmFtICB7bnVtYmVyfSBbeD0wXSAtIEhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dC5cbiAqIEBwYXJhbSAge251bWJlcn0gW3k9MF0gLSBWZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgKmJhc2VsaW5lKiBvZiB0aGUgdGV4dC5cbiAqIEBwYXJhbSAge251bWJlcn0gW2ZvbnRTaXplPTcyXSAtIEZvbnQgc2l6ZSBpbiBwaXhlbHMuIFdlIHNjYWxlIHRoZSBnbHlwaCB1bml0cyBieSBgMSAvIHVuaXRzUGVyRW0gKiBmb250U2l6ZWAuXG4gKiBAcGFyYW0gIHtHbHlwaFJlbmRlck9wdGlvbnM9fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtvcGVudHlwZS5QYXRoW119XG4gKi9cbkZvbnQucHJvdG90eXBlLmdldFBhdGhzID0gZnVuY3Rpb24odGV4dCwgeCwgeSwgZm9udFNpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZ2x5cGhQYXRocyA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaEdseXBoKHRleHQsIHgsIHksIGZvbnRTaXplLCBvcHRpb25zLCBmdW5jdGlvbihnbHlwaCwgZ1gsIGdZLCBnRm9udFNpemUpIHtcbiAgICAgICAgdmFyIGdseXBoUGF0aCA9IGdseXBoLmdldFBhdGgoZ1gsIGdZLCBnRm9udFNpemUsIG9wdGlvbnMsIHRoaXMpO1xuICAgICAgICBnbHlwaFBhdGhzLnB1c2goZ2x5cGhQYXRoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBnbHlwaFBhdGhzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhZHZhbmNlIHdpZHRoIG9mIGEgdGV4dC5cbiAqXG4gKiBUaGlzIGlzIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiBQYXRoLmdldEJvdW5kaW5nQm94KCkgYXMgZm9yIGV4YW1wbGUgYVxuICogc3VmZml4ZWQgd2hpdGVzcGFjZSBpbmNyZWFzZXMgdGhlIGFkdmFuY2VXaWR0aCBidXQgbm90IHRoZSBib3VuZGluZyBib3hcbiAqIG9yIGFuIG92ZXJoYW5naW5nIGxldHRlciBsaWtlIGEgY2FsbGlncmFwaGljICdmJyBtaWdodCBoYXZlIGEgcXVpdGUgbGFyZ2VyXG4gKiBib3VuZGluZyBib3ggdGhhbiBpdHMgYWR2YW5jZSB3aWR0aC5cbiAqXG4gKiBUaGlzIGNvcnJlc3BvbmRzIHRvIGNhbnZhczJkQ29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aFxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSAge251bWJlcn0gW2ZvbnRTaXplPTcyXSAtIEZvbnQgc2l6ZSBpbiBwaXhlbHMuIFdlIHNjYWxlIHRoZSBnbHlwaCB1bml0cyBieSBgMSAvIHVuaXRzUGVyRW0gKiBmb250U2l6ZWAuXG4gKiBAcGFyYW0gIHtHbHlwaFJlbmRlck9wdGlvbnM9fSBvcHRpb25zXG4gKiBAcmV0dXJuIGFkdmFuY2Ugd2lkdGhcbiAqL1xuRm9udC5wcm90b3R5cGUuZ2V0QWR2YW5jZVdpZHRoID0gZnVuY3Rpb24odGV4dCwgZm9udFNpemUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JFYWNoR2x5cGgodGV4dCwgMCwgMCwgZm9udFNpemUsIG9wdGlvbnMsIGZ1bmN0aW9uKCkge30pO1xufTtcblxuLyoqXG4gKiBEcmF3IHRoZSB0ZXh0IG9uIHRoZSBnaXZlbiBkcmF3aW5nIGNvbnRleHQuXG4gKiBAcGFyYW0gIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCAtIEEgMkQgZHJhd2luZyBjb250ZXh0LCBsaWtlIENhbnZhcy5cbiAqIEBwYXJhbSAge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSAge251bWJlcn0gW3g9MF0gLSBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFt5PTBdIC0gVmVydGljYWwgcG9zaXRpb24gb2YgdGhlICpiYXNlbGluZSogb2YgdGhlIHRleHQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFtmb250U2l6ZT03Ml0gLSBGb250IHNpemUgaW4gcGl4ZWxzLiBXZSBzY2FsZSB0aGUgZ2x5cGggdW5pdHMgYnkgYDEgLyB1bml0c1BlckVtICogZm9udFNpemVgLlxuICogQHBhcmFtICB7R2x5cGhSZW5kZXJPcHRpb25zPX0gb3B0aW9uc1xuICovXG5Gb250LnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oY3R4LCB0ZXh0LCB4LCB5LCBmb250U2l6ZSwgb3B0aW9ucykge1xuICAgIHRoaXMuZ2V0UGF0aCh0ZXh0LCB4LCB5LCBmb250U2l6ZSwgb3B0aW9ucykuZHJhdyhjdHgpO1xufTtcblxuLyoqXG4gKiBEcmF3IHRoZSBwb2ludHMgb2YgYWxsIGdseXBocyBpbiB0aGUgdGV4dC5cbiAqIE9uLWN1cnZlIHBvaW50cyB3aWxsIGJlIGRyYXduIGluIGJsdWUsIG9mZi1jdXJ2ZSBwb2ludHMgd2lsbCBiZSBkcmF3biBpbiByZWQuXG4gKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY3R4IC0gQSAyRCBkcmF3aW5nIGNvbnRleHQsIGxpa2UgQ2FudmFzLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgdGV4dCB0byBjcmVhdGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBWZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgKmJhc2VsaW5lKiBvZiB0aGUgdGV4dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZm9udFNpemU9NzJdIC0gRm9udCBzaXplIGluIHBpeGVscy4gV2Ugc2NhbGUgdGhlIGdseXBoIHVuaXRzIGJ5IGAxIC8gdW5pdHNQZXJFbSAqIGZvbnRTaXplYC5cbiAqIEBwYXJhbSB7R2x5cGhSZW5kZXJPcHRpb25zPX0gb3B0aW9uc1xuICovXG5Gb250LnByb3RvdHlwZS5kcmF3UG9pbnRzID0gZnVuY3Rpb24oY3R4LCB0ZXh0LCB4LCB5LCBmb250U2l6ZSwgb3B0aW9ucykge1xuICAgIHRoaXMuZm9yRWFjaEdseXBoKHRleHQsIHgsIHksIGZvbnRTaXplLCBvcHRpb25zLCBmdW5jdGlvbihnbHlwaCwgZ1gsIGdZLCBnRm9udFNpemUpIHtcbiAgICAgICAgZ2x5cGguZHJhd1BvaW50cyhjdHgsIGdYLCBnWSwgZ0ZvbnRTaXplKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogRHJhdyBsaW5lcyBpbmRpY2F0aW5nIGltcG9ydGFudCBmb250IG1lYXN1cmVtZW50cyBmb3IgYWxsIGdseXBocyBpbiB0aGUgdGV4dC5cbiAqIEJsYWNrIGxpbmVzIGluZGljYXRlIHRoZSBvcmlnaW4gb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIChwb2ludCAwLDApLlxuICogQmx1ZSBsaW5lcyBpbmRpY2F0ZSB0aGUgZ2x5cGggYm91bmRpbmcgYm94LlxuICogR3JlZW4gbGluZSBpbmRpY2F0ZXMgdGhlIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGdseXBoLlxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCAtIEEgMkQgZHJhd2luZyBjb250ZXh0LCBsaWtlIENhbnZhcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIHRleHQgdG8gY3JlYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LlxuICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVmVydGljYWwgcG9zaXRpb24gb2YgdGhlICpiYXNlbGluZSogb2YgdGhlIHRleHQuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZvbnRTaXplPTcyXSAtIEZvbnQgc2l6ZSBpbiBwaXhlbHMuIFdlIHNjYWxlIHRoZSBnbHlwaCB1bml0cyBieSBgMSAvIHVuaXRzUGVyRW0gKiBmb250U2l6ZWAuXG4gKiBAcGFyYW0ge0dseXBoUmVuZGVyT3B0aW9ucz19IG9wdGlvbnNcbiAqL1xuRm9udC5wcm90b3R5cGUuZHJhd01ldHJpY3MgPSBmdW5jdGlvbihjdHgsIHRleHQsIHgsIHksIGZvbnRTaXplLCBvcHRpb25zKSB7XG4gICAgdGhpcy5mb3JFYWNoR2x5cGgodGV4dCwgeCwgeSwgZm9udFNpemUsIG9wdGlvbnMsIGZ1bmN0aW9uKGdseXBoLCBnWCwgZ1ksIGdGb250U2l6ZSkge1xuICAgICAgICBnbHlwaC5kcmF3TWV0cmljcyhjdHgsIGdYLCBnWSwgZ0ZvbnRTaXplKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7c3RyaW5nfVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5Gb250LnByb3RvdHlwZS5nZXRFbmdsaXNoTmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgdHJhbnNsYXRpb25zID0gdGhpcy5uYW1lc1tuYW1lXTtcbiAgICBpZiAodHJhbnNsYXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGlvbnMuZW47XG4gICAgfVxufTtcblxuLyoqXG4gKiBWYWxpZGF0ZVxuICovXG5Gb250LnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB3YXJuaW5ncyA9IFtdO1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBhc3NlcnQocHJlZGljYXRlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmICghcHJlZGljYXRlKSB7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXNzZXJ0TmFtZVByZXNlbnQobmFtZSkge1xuICAgICAgICB2YXIgZW5nbGlzaE5hbWUgPSBfdGhpcy5nZXRFbmdsaXNoTmFtZShuYW1lKTtcbiAgICAgICAgYXNzZXJ0KGVuZ2xpc2hOYW1lICYmIGVuZ2xpc2hOYW1lLnRyaW0oKS5sZW5ndGggPiAwLFxuICAgICAgICAgICAgICAgJ05vIEVuZ2xpc2ggJyArIG5hbWUgKyAnIHNwZWNpZmllZC4nKTtcbiAgICB9XG5cbiAgICAvLyBJZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvblxuICAgIGFzc2VydE5hbWVQcmVzZW50KCdmb250RmFtaWx5Jyk7XG4gICAgYXNzZXJ0TmFtZVByZXNlbnQoJ3dlaWdodE5hbWUnKTtcbiAgICBhc3NlcnROYW1lUHJlc2VudCgnbWFudWZhY3R1cmVyJyk7XG4gICAgYXNzZXJ0TmFtZVByZXNlbnQoJ2NvcHlyaWdodCcpO1xuICAgIGFzc2VydE5hbWVQcmVzZW50KCd2ZXJzaW9uJyk7XG5cbiAgICAvLyBEaW1lbnNpb24gaW5mb3JtYXRpb25cbiAgICBhc3NlcnQodGhpcy51bml0c1BlckVtID4gMCwgJ05vIHVuaXRzUGVyRW0gc3BlY2lmaWVkLicpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBmb250IG9iamVjdCB0byBhIFNGTlQgZGF0YSBzdHJ1Y3R1cmUuXG4gKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgdGhlIG5lY2Vzc2FyeSB0YWJsZXMgYW5kIG1ldGFkYXRhIHRvIGNyZWF0ZSBhIGJpbmFyeSBPVEYgZmlsZS5cbiAqIEByZXR1cm4ge29wZW50eXBlLlRhYmxlfVxuICovXG5Gb250LnByb3RvdHlwZS50b1RhYmxlcyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBzZm50LmZvbnRUb1RhYmxlKHRoaXMpO1xufTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgRm9udC50b0J1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgRm9udC50b0FycmF5QnVmZmVyIGluc3RlYWQuXG4gKi9cbkZvbnQucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc29sZS53YXJuKCdGb250LnRvQnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBGb250LnRvQXJyYXlCdWZmZXIgaW5zdGVhZC4nKTtcbiAgICByZXR1cm4gdGhpcy50b0FycmF5QnVmZmVyKCk7XG59O1xuLyoqXG4gKiBDb252ZXJ0cyBhIGBvcGVudHlwZS5Gb250YCBpbnRvIGFuIGBBcnJheUJ1ZmZlcmBcbiAqIEByZXR1cm4ge0FycmF5QnVmZmVyfVxuICovXG5Gb250LnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNmbnRUYWJsZSA9IHRoaXMudG9UYWJsZXMoKTtcbiAgICB2YXIgYnl0ZXMgPSBzZm50VGFibGUuZW5jb2RlKCk7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICAgIHZhciBpbnRBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbnRBcnJheVtpXSA9IGJ5dGVzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBidWZmZXI7XG59O1xuXG4vKipcbiAqIEluaXRpYXRlIGEgZG93bmxvYWQgb2YgdGhlIE9wZW5UeXBlIGZvbnQuXG4gKi9cbkZvbnQucHJvdG90eXBlLmRvd25sb2FkID0gZnVuY3Rpb24oZmlsZU5hbWUpIHtcbiAgICB2YXIgZmFtaWx5TmFtZSA9IHRoaXMuZ2V0RW5nbGlzaE5hbWUoJ2ZvbnRGYW1pbHknKTtcbiAgICB2YXIgc3R5bGVOYW1lID0gdGhpcy5nZXRFbmdsaXNoTmFtZSgnZm9udFN1YmZhbWlseScpO1xuICAgIGZpbGVOYW1lID0gZmlsZU5hbWUgfHwgZmFtaWx5TmFtZS5yZXBsYWNlKC9cXHMvZywgJycpICsgJy0nICsgc3R5bGVOYW1lICsgJy5vdGYnO1xuICAgIHZhciBhcnJheUJ1ZmZlciA9IHRoaXMudG9BcnJheUJ1ZmZlcigpO1xuXG4gICAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0RmlsZVN5c3RlbSA9IHdpbmRvdy5yZXF1ZXN0RmlsZVN5c3RlbSB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEZpbGVTeXN0ZW07XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0RmlsZVN5c3RlbSh3aW5kb3cuVEVNUE9SQVJZLCBhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoLCBmdW5jdGlvbihmcykge1xuICAgICAgICAgICAgZnMucm9vdC5nZXRGaWxlKGZpbGVOYW1lLCB7Y3JlYXRlOiB0cnVlfSwgZnVuY3Rpb24oZmlsZUVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZmlsZUVudHJ5LmNyZWF0ZVdyaXRlcihmdW5jdGlvbih3cml0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbZGF0YVZpZXddLCB7dHlwZTogJ2ZvbnQvb3BlbnR5cGUnfSk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShibG9iKTtcblxuICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYWRkRXZlbnRMaXN0ZW5lcignd3JpdGVlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdmlnYXRpbmcgdG8gdGhlIGZpbGUgd2lsbCBkb3dubG9hZCBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBmaWxlRW50cnkudG9VUkwoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyci5uYW1lICsgJzogJyArIGVyci5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGZzID0gX2RlcmVxXygnZnMnKTtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IGFycmF5QnVmZmVyVG9Ob2RlQnVmZmVyKGFycmF5QnVmZmVyKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlTmFtZSwgYnVmZmVyKTtcbiAgICB9XG59O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5Gb250LnByb3RvdHlwZS5mc1NlbGVjdGlvblZhbHVlcyA9IHtcbiAgICBJVEFMSUM6ICAgICAgICAgICAgICAweDAwMSwgLy8xXG4gICAgVU5ERVJTQ09SRTogICAgICAgICAgMHgwMDIsIC8vMlxuICAgIE5FR0FUSVZFOiAgICAgICAgICAgIDB4MDA0LCAvLzRcbiAgICBPVVRMSU5FRDogICAgICAgICAgICAweDAwOCwgLy84XG4gICAgU1RSSUtFT1VUOiAgICAgICAgICAgMHgwMTAsIC8vMTZcbiAgICBCT0xEOiAgICAgICAgICAgICAgICAweDAyMCwgLy8zMlxuICAgIFJFR1VMQVI6ICAgICAgICAgICAgIDB4MDQwLCAvLzY0XG4gICAgVVNFUl9UWVBPX01FVFJJQ1M6ICAgMHgwODAsIC8vMTI4XG4gICAgV1dTOiAgICAgICAgICAgICAgICAgMHgxMDAsIC8vMjU2XG4gICAgT0JMSVFVRTogICAgICAgICAgICAgMHgyMDAgIC8vNTEyXG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbkZvbnQucHJvdG90eXBlLnVzV2lkdGhDbGFzc2VzID0ge1xuICAgIFVMVFJBX0NPTkRFTlNFRDogMSxcbiAgICBFWFRSQV9DT05ERU5TRUQ6IDIsXG4gICAgQ09OREVOU0VEOiAzLFxuICAgIFNFTUlfQ09OREVOU0VEOiA0LFxuICAgIE1FRElVTTogNSxcbiAgICBTRU1JX0VYUEFOREVEOiA2LFxuICAgIEVYUEFOREVEOiA3LFxuICAgIEVYVFJBX0VYUEFOREVEOiA4LFxuICAgIFVMVFJBX0VYUEFOREVEOiA5XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbkZvbnQucHJvdG90eXBlLnVzV2VpZ2h0Q2xhc3NlcyA9IHtcbiAgICBUSElOOiAxMDAsXG4gICAgRVhUUkFfTElHSFQ6IDIwMCxcbiAgICBMSUdIVDogMzAwLFxuICAgIE5PUk1BTDogNDAwLFxuICAgIE1FRElVTTogNTAwLFxuICAgIFNFTUlfQk9MRDogNjAwLFxuICAgIEJPTEQ6IDcwMCxcbiAgICBFWFRSQV9CT0xEOiA4MDAsXG4gICAgQkxBQ0s6ICAgIDkwMFxufTtcblxuLy8gVGhlIGBmdmFyYCB0YWJsZSBzdG9yZXMgZm9udCB2YXJpYXRpb24gYXhlcyBhbmQgaW5zdGFuY2VzLlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmZ2YXIuaHRtbFxuXG5mdW5jdGlvbiBhZGROYW1lKG5hbWUsIG5hbWVzKSB7XG4gICAgdmFyIG5hbWVTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShuYW1lKTtcbiAgICB2YXIgbmFtZUlEID0gMjU2O1xuICAgIGZvciAodmFyIG5hbWVLZXkgaW4gbmFtZXMpIHtcbiAgICAgICAgdmFyIG4gPSBwYXJzZUludChuYW1lS2V5KTtcbiAgICAgICAgaWYgKCFuIHx8IG4gPCAyNTYpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG5hbWVzW25hbWVLZXldKSA9PT0gbmFtZVN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmFtZUlEIDw9IG4pIHtcbiAgICAgICAgICAgIG5hbWVJRCA9IG4gKyAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmFtZXNbbmFtZUlEXSA9IG5hbWU7XG4gICAgcmV0dXJuIG5hbWVJRDtcbn1cblxuZnVuY3Rpb24gbWFrZUZ2YXJBeGlzKG4sIGF4aXMsIG5hbWVzKSB7XG4gICAgdmFyIG5hbWVJRCA9IGFkZE5hbWUoYXhpcy5uYW1lLCBuYW1lcyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAge25hbWU6ICd0YWdfJyArIG4sIHR5cGU6ICdUQUcnLCB2YWx1ZTogYXhpcy50YWd9LFxuICAgICAgICB7bmFtZTogJ21pblZhbHVlXycgKyBuLCB0eXBlOiAnRklYRUQnLCB2YWx1ZTogYXhpcy5taW5WYWx1ZSA8PCAxNn0sXG4gICAgICAgIHtuYW1lOiAnZGVmYXVsdFZhbHVlXycgKyBuLCB0eXBlOiAnRklYRUQnLCB2YWx1ZTogYXhpcy5kZWZhdWx0VmFsdWUgPDwgMTZ9LFxuICAgICAgICB7bmFtZTogJ21heFZhbHVlXycgKyBuLCB0eXBlOiAnRklYRUQnLCB2YWx1ZTogYXhpcy5tYXhWYWx1ZSA8PCAxNn0sXG4gICAgICAgIHtuYW1lOiAnZmxhZ3NfJyArIG4sIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMH0sXG4gICAgICAgIHtuYW1lOiAnbmFtZUlEXycgKyBuLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IG5hbWVJRH1cbiAgICBdO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZ2YXJBeGlzKGRhdGEsIHN0YXJ0LCBuYW1lcykge1xuICAgIHZhciBheGlzID0ge307XG4gICAgdmFyIHAgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICBheGlzLnRhZyA9IHAucGFyc2VUYWcoKTtcbiAgICBheGlzLm1pblZhbHVlID0gcC5wYXJzZUZpeGVkKCk7XG4gICAgYXhpcy5kZWZhdWx0VmFsdWUgPSBwLnBhcnNlRml4ZWQoKTtcbiAgICBheGlzLm1heFZhbHVlID0gcC5wYXJzZUZpeGVkKCk7XG4gICAgcC5za2lwKCd1U2hvcnQnLCAxKTsgIC8vIHJlc2VydmVkIGZvciBmbGFnczsgbm8gdmFsdWVzIGRlZmluZWRcbiAgICBheGlzLm5hbWUgPSBuYW1lc1twLnBhcnNlVVNob3J0KCldIHx8IHt9O1xuICAgIHJldHVybiBheGlzO1xufVxuXG5mdW5jdGlvbiBtYWtlRnZhckluc3RhbmNlKG4sIGluc3QsIGF4ZXMsIG5hbWVzKSB7XG4gICAgdmFyIG5hbWVJRCA9IGFkZE5hbWUoaW5zdC5uYW1lLCBuYW1lcyk7XG4gICAgdmFyIGZpZWxkcyA9IFtcbiAgICAgICAge25hbWU6ICduYW1lSURfJyArIG4sIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogbmFtZUlEfSxcbiAgICAgICAge25hbWU6ICdmbGFnc18nICsgbiwgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiAwfVxuICAgIF07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF4ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGF4aXNUYWcgPSBheGVzW2ldLnRhZztcbiAgICAgICAgZmllbGRzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogJ2F4aXNfJyArIG4gKyAnICcgKyBheGlzVGFnLFxuICAgICAgICAgICAgdHlwZTogJ0ZJWEVEJyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0LmNvb3JkaW5hdGVzW2F4aXNUYWddIDw8IDE2XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnZhckluc3RhbmNlKGRhdGEsIHN0YXJ0LCBheGVzLCBuYW1lcykge1xuICAgIHZhciBpbnN0ID0ge307XG4gICAgdmFyIHAgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICBpbnN0Lm5hbWUgPSBuYW1lc1twLnBhcnNlVVNob3J0KCldIHx8IHt9O1xuICAgIHAuc2tpcCgndVNob3J0JywgMSk7ICAvLyByZXNlcnZlZCBmb3IgZmxhZ3M7IG5vIHZhbHVlcyBkZWZpbmVkXG5cbiAgICBpbnN0LmNvb3JkaW5hdGVzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBheGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGluc3QuY29vcmRpbmF0ZXNbYXhlc1tpXS50YWddID0gcC5wYXJzZUZpeGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3Q7XG59XG5cbmZ1bmN0aW9uIG1ha2VGdmFyVGFibGUoZnZhciwgbmFtZXMpIHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IHRhYmxlLlRhYmxlKCdmdmFyJywgW1xuICAgICAgICB7bmFtZTogJ3ZlcnNpb24nLCB0eXBlOiAnVUxPTkcnLCB2YWx1ZTogMHgxMDAwMH0sXG4gICAgICAgIHtuYW1lOiAnb2Zmc2V0VG9EYXRhJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiAwfSxcbiAgICAgICAge25hbWU6ICdjb3VudFNpemVQYWlycycsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMn0sXG4gICAgICAgIHtuYW1lOiAnYXhpc0NvdW50JywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiBmdmFyLmF4ZXMubGVuZ3RofSxcbiAgICAgICAge25hbWU6ICdheGlzU2l6ZScsIHR5cGU6ICdVU0hPUlQnLCB2YWx1ZTogMjB9LFxuICAgICAgICB7bmFtZTogJ2luc3RhbmNlQ291bnQnLCB0eXBlOiAnVVNIT1JUJywgdmFsdWU6IGZ2YXIuaW5zdGFuY2VzLmxlbmd0aH0sXG4gICAgICAgIHtuYW1lOiAnaW5zdGFuY2VTaXplJywgdHlwZTogJ1VTSE9SVCcsIHZhbHVlOiA0ICsgZnZhci5heGVzLmxlbmd0aCAqIDR9XG4gICAgXSk7XG4gICAgcmVzdWx0Lm9mZnNldFRvRGF0YSA9IHJlc3VsdC5zaXplT2YoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZnZhci5heGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdC5maWVsZHMgPSByZXN1bHQuZmllbGRzLmNvbmNhdChtYWtlRnZhckF4aXMoaSwgZnZhci5heGVzW2ldLCBuYW1lcykpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZnZhci5pbnN0YW5jZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgcmVzdWx0LmZpZWxkcyA9IHJlc3VsdC5maWVsZHMuY29uY2F0KG1ha2VGdmFySW5zdGFuY2UoaiwgZnZhci5pbnN0YW5jZXNbal0sIGZ2YXIuYXhlcywgbmFtZXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwYXJzZUZ2YXJUYWJsZShkYXRhLCBzdGFydCwgbmFtZXMpIHtcbiAgICB2YXIgcCA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIHZhciB0YWJsZVZlcnNpb24gPSBwLnBhcnNlVUxvbmcoKTtcbiAgICBjaGVjay5hcmd1bWVudCh0YWJsZVZlcnNpb24gPT09IDB4MDAwMTAwMDAsICdVbnN1cHBvcnRlZCBmdmFyIHRhYmxlIHZlcnNpb24uJyk7XG4gICAgdmFyIG9mZnNldFRvRGF0YSA9IHAucGFyc2VPZmZzZXQxNigpO1xuICAgIC8vIFNraXAgY291bnRTaXplUGFpcnMuXG4gICAgcC5za2lwKCd1U2hvcnQnLCAxKTtcbiAgICB2YXIgYXhpc0NvdW50ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIHZhciBheGlzU2l6ZSA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICB2YXIgaW5zdGFuY2VDb3VudCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICB2YXIgaW5zdGFuY2VTaXplID0gcC5wYXJzZVVTaG9ydCgpO1xuXG4gICAgdmFyIGF4ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF4aXNDb3VudDsgaSsrKSB7XG4gICAgICAgIGF4ZXMucHVzaChwYXJzZUZ2YXJBeGlzKGRhdGEsIHN0YXJ0ICsgb2Zmc2V0VG9EYXRhICsgaSAqIGF4aXNTaXplLCBuYW1lcykpO1xuICAgIH1cblxuICAgIHZhciBpbnN0YW5jZXMgPSBbXTtcbiAgICB2YXIgaW5zdGFuY2VTdGFydCA9IHN0YXJ0ICsgb2Zmc2V0VG9EYXRhICsgYXhpc0NvdW50ICogYXhpc1NpemU7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbnN0YW5jZUNvdW50OyBqKyspIHtcbiAgICAgICAgaW5zdGFuY2VzLnB1c2gocGFyc2VGdmFySW5zdGFuY2UoZGF0YSwgaW5zdGFuY2VTdGFydCArIGogKiBpbnN0YW5jZVNpemUsIGF4ZXMsIG5hbWVzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtheGVzOiBheGVzLCBpbnN0YW5jZXM6IGluc3RhbmNlc307XG59XG5cbnZhciBmdmFyID0geyBtYWtlOiBtYWtlRnZhclRhYmxlLCBwYXJzZTogcGFyc2VGdmFyVGFibGUgfTtcblxuLy8gVGhlIGBHUE9TYCB0YWJsZSBjb250YWlucyBrZXJuaW5nIHBhaXJzLCBhbW9uZyBvdGhlciB0aGluZ3MuXG4vLyBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT1RTUEVDL2dwb3MuaHRtXG5cbi8vIFBhcnNlIFNjcmlwdExpc3QgYW5kIEZlYXR1cmVMaXN0IHRhYmxlcyBvZiBHUE9TLCBHU1VCLCBHREVGLCBCQVNFLCBKU1RGIHRhYmxlcy5cbi8vIFRoZXNlIGxpc3RzIGFyZSB1bnVzZWQgYnkgbm93LCB0aGlzIGZ1bmN0aW9uIGlzIGp1c3QgdGhlIGJhc2lzIGZvciBhIHJlYWwgcGFyc2luZy5cbmZ1bmN0aW9uIHBhcnNlVGFnZ2VkTGlzdFRhYmxlKGRhdGEsIHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICB2YXIgbiA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICB2YXIgbGlzdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGxpc3RbcC5wYXJzZVRhZygpXSA9IHsgb2Zmc2V0OiBwLnBhcnNlVVNob3J0KCkgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdDtcbn1cblxuLy8gUGFyc2UgYSBjb3ZlcmFnZSB0YWJsZSBpbiBhIEdTVUIsIEdQT1Mgb3IgR0RFRiB0YWJsZS5cbi8vIEZvcm1hdCAxIGlzIGEgc2ltcGxlIGxpc3Qgb2YgZ2x5cGggaWRzLFxuLy8gRm9ybWF0IDIgaXMgYSBsaXN0IG9mIHJhbmdlcy4gSXQgaXMgZXhwYW5kZWQgaW4gYSBsaXN0IG9mIGdseXBocywgbWF5YmUgbm90IHRoZSBiZXN0IGlkZWEuXG5mdW5jdGlvbiBwYXJzZUNvdmVyYWdlVGFibGUoZGF0YSwgc3RhcnQpIHtcbiAgICB2YXIgcCA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIHZhciBmb3JtYXQgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgdmFyIGNvdW50ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIGlmIChmb3JtYXQgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHAucGFyc2VVU2hvcnRMaXN0KGNvdW50KTtcbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMikge1xuICAgICAgICB2YXIgY292ZXJhZ2UgPSBbXTtcbiAgICAgICAgZm9yICg7IGNvdW50LS07KSB7XG4gICAgICAgICAgICB2YXIgYmVnaW4gPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgICAgICB2YXIgZW5kID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGJlZ2luOyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY292ZXJhZ2VbaW5kZXgrK10gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvdmVyYWdlO1xuICAgIH1cbn1cblxuLy8gUGFyc2UgYSBDbGFzcyBEZWZpbml0aW9uIFRhYmxlIGluIGEgR1NVQiwgR1BPUyBvciBHREVGIHRhYmxlLlxuLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyBhIGNsYXNzIHZhbHVlIGZyb20gYSBnbHlwaCBJRC5cbmZ1bmN0aW9uIHBhcnNlQ2xhc3NEZWZUYWJsZShkYXRhLCBzdGFydCkge1xuICAgIHZhciBwID0gbmV3IHBhcnNlLlBhcnNlcihkYXRhLCBzdGFydCk7XG4gICAgdmFyIGZvcm1hdCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICBpZiAoZm9ybWF0ID09PSAxKSB7XG4gICAgICAgIC8vIEZvcm1hdCAxIHNwZWNpZmllcyBhIHJhbmdlIG9mIGNvbnNlY3V0aXZlIGdseXBoIGluZGljZXMsIG9uZSBjbGFzcyBwZXIgZ2x5cGggSUQuXG4gICAgICAgIHZhciBzdGFydEdseXBoID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICB2YXIgZ2x5cGhDb3VudCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgdmFyIGNsYXNzZXMgPSBwLnBhcnNlVVNob3J0TGlzdChnbHlwaENvdW50KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdseXBoSUQpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGFzc2VzW2dseXBoSUQgLSBzdGFydEdseXBoXSB8fCAwO1xuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAyKSB7XG4gICAgICAgIC8vIEZvcm1hdCAyIGRlZmluZXMgbXVsdGlwbGUgZ3JvdXBzIG9mIGdseXBoIGluZGljZXMgdGhhdCBiZWxvbmcgdG8gdGhlIHNhbWUgY2xhc3MuXG4gICAgICAgIHZhciByYW5nZUNvdW50ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICB2YXIgc3RhcnRHbHlwaHMgPSBbXTtcbiAgICAgICAgdmFyIGVuZEdseXBocyA9IFtdO1xuICAgICAgICB2YXIgY2xhc3NWYWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHN0YXJ0R2x5cGhzW2ldID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgZW5kR2x5cGhzW2ldID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgY2xhc3NWYWx1ZXNbaV0gPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2x5cGhJRCkge1xuICAgICAgICAgICAgdmFyIGwgPSAwO1xuICAgICAgICAgICAgdmFyIHIgPSBzdGFydEdseXBocy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgd2hpbGUgKGwgPCByKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSAobCArIHIgKyAxKSA+PiAxO1xuICAgICAgICAgICAgICAgIGlmIChnbHlwaElEIDwgc3RhcnRHbHlwaHNbY10pIHtcbiAgICAgICAgICAgICAgICAgICAgciA9IGMgLSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGwgPSBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0YXJ0R2x5cGhzW2xdIDw9IGdseXBoSUQgJiYgZ2x5cGhJRCA8PSBlbmRHbHlwaHNbbF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NWYWx1ZXNbbF0gfHwgMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vLyBQYXJzZSBhIHBhaXIgYWRqdXN0bWVudCBwb3NpdGlvbmluZyBzdWJ0YWJsZSwgZm9ybWF0IDEgb3IgZm9ybWF0IDJcbi8vIFRoZSBzdWJ0YWJsZSBpcyByZXR1cm5lZCBpbiB0aGUgZm9ybSBvZiBhIGxvb2t1cCBmdW5jdGlvbi5cbmZ1bmN0aW9uIHBhcnNlUGFpclBvc1N1YlRhYmxlKGRhdGEsIHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICAvLyBUaGlzIHBhcnQgaXMgY29tbW9uIHRvIGZvcm1hdCAxIGFuZCBmb3JtYXQgMiBzdWJ0YWJsZXNcbiAgICB2YXIgZm9ybWF0ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIHZhciBjb3ZlcmFnZU9mZnNldCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICB2YXIgY292ZXJhZ2UgPSBwYXJzZUNvdmVyYWdlVGFibGUoZGF0YSwgc3RhcnQgKyBjb3ZlcmFnZU9mZnNldCk7XG4gICAgLy8gdmFsdWVGb3JtYXQgNDogWEFkdmFuY2Ugb25seSwgMTogWFBsYWNlbWVudCBvbmx5LCAwOiBubyBWYWx1ZVJlY29yZCBmb3Igc2Vjb25kIGdseXBoXG4gICAgLy8gT25seSB2YWx1ZUZvcm1hdDE9NCBhbmQgdmFsdWVGb3JtYXQyPTAgaXMgc3VwcG9ydGVkLlxuICAgIHZhciB2YWx1ZUZvcm1hdDEgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgdmFyIHZhbHVlRm9ybWF0MiA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICB2YXIgdmFsdWUxO1xuICAgIHZhciB2YWx1ZTI7XG4gICAgaWYgKHZhbHVlRm9ybWF0MSAhPT0gNCB8fCB2YWx1ZUZvcm1hdDIgIT09IDApIHsgcmV0dXJuOyB9XG4gICAgdmFyIHNoYXJlZFBhaXJTZXRzID0ge307XG4gICAgaWYgKGZvcm1hdCA9PT0gMSkge1xuICAgICAgICAvLyBQYWlyIFBvc2l0aW9uaW5nIEFkanVzdG1lbnQ6IEZvcm1hdCAxXG4gICAgICAgIHZhciBwYWlyU2V0Q291bnQgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIHZhciBwYWlyU2V0ID0gW107XG4gICAgICAgIC8vIEFycmF5IG9mIG9mZnNldHMgdG8gUGFpclNldCB0YWJsZXMtZnJvbSBiZWdpbm5pbmcgb2YgUGFpclBvcyBzdWJ0YWJsZS1vcmRlcmVkIGJ5IENvdmVyYWdlIEluZGV4XG4gICAgICAgIHZhciBwYWlyU2V0T2Zmc2V0cyA9IHAucGFyc2VPZmZzZXQxNkxpc3QocGFpclNldENvdW50KTtcbiAgICAgICAgZm9yICh2YXIgZmlyc3RHbHlwaCA9IDA7IGZpcnN0R2x5cGggPCBwYWlyU2V0Q291bnQ7IGZpcnN0R2x5cGgrKykge1xuICAgICAgICAgICAgdmFyIHBhaXJTZXRPZmZzZXQgPSBwYWlyU2V0T2Zmc2V0c1tmaXJzdEdseXBoXTtcbiAgICAgICAgICAgIHZhciBzaGFyZWRQYWlyU2V0ID0gc2hhcmVkUGFpclNldHNbcGFpclNldE9mZnNldF07XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFBhaXJTZXQpIHtcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSBhIHBhaXJzZXQgdGFibGUgaW4gYSBwYWlyIGFkanVzdG1lbnQgc3VidGFibGUgZm9ybWF0IDFcbiAgICAgICAgICAgICAgICBzaGFyZWRQYWlyU2V0ID0ge307XG4gICAgICAgICAgICAgICAgcC5yZWxhdGl2ZU9mZnNldCA9IHBhaXJTZXRPZmZzZXQ7XG4gICAgICAgICAgICAgICAgdmFyIHBhaXJWYWx1ZUNvdW50ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgICAgIGZvciAoOyBwYWlyVmFsdWVDb3VudC0tOykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2Vjb25kR2x5cGggPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUZvcm1hdDEpIHsgdmFsdWUxID0gcC5wYXJzZVNob3J0KCk7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlRm9ybWF0MikgeyB2YWx1ZTIgPSBwLnBhcnNlU2hvcnQoKTsgfVxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgdmFsdWVGb3JtYXQxID0gNCBhbmQgdmFsdWVGb3JtYXQyID0gMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gdmFsdWUxIGlzIHRoZSBYQWR2YW5jZSBhbmQgdmFsdWUyIGlzIGVtcHR5LlxuICAgICAgICAgICAgICAgICAgICBzaGFyZWRQYWlyU2V0W3NlY29uZEdseXBoXSA9IHZhbHVlMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhaXJTZXRbY292ZXJhZ2VbZmlyc3RHbHlwaF1dID0gc2hhcmVkUGFpclNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihsZWZ0R2x5cGgsIHJpZ2h0R2x5cGgpIHtcbiAgICAgICAgICAgIHZhciBwYWlycyA9IHBhaXJTZXRbbGVmdEdseXBoXTtcbiAgICAgICAgICAgIGlmIChwYWlycykgeyByZXR1cm4gcGFpcnNbcmlnaHRHbHlwaF07IH1cbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMikge1xuICAgICAgICAvLyBQYWlyIFBvc2l0aW9uaW5nIEFkanVzdG1lbnQ6IEZvcm1hdCAyXG4gICAgICAgIHZhciBjbGFzc0RlZjFPZmZzZXQgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIHZhciBjbGFzc0RlZjJPZmZzZXQgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIHZhciBjbGFzczFDb3VudCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgdmFyIGNsYXNzMkNvdW50ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICB2YXIgZ2V0Q2xhc3MxID0gcGFyc2VDbGFzc0RlZlRhYmxlKGRhdGEsIHN0YXJ0ICsgY2xhc3NEZWYxT2Zmc2V0KTtcbiAgICAgICAgdmFyIGdldENsYXNzMiA9IHBhcnNlQ2xhc3NEZWZUYWJsZShkYXRhLCBzdGFydCArIGNsYXNzRGVmMk9mZnNldCk7XG5cbiAgICAgICAgLy8gUGFyc2Uga2VybmluZyB2YWx1ZXMgYnkgY2xhc3MgcGFpci5cbiAgICAgICAgdmFyIGtlcm5pbmdNYXRyaXggPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzczFDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2VybmluZ1JvdyA9IGtlcm5pbmdNYXRyaXhbaV0gPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2xhc3MyQ291bnQ7IGorKykge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZUZvcm1hdDEpIHsgdmFsdWUxID0gcC5wYXJzZVNob3J0KCk7IH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWVGb3JtYXQyKSB7IHZhbHVlMiA9IHAucGFyc2VTaG9ydCgpOyB9XG4gICAgICAgICAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IHZhbHVlRm9ybWF0MSA9IDQgYW5kIHZhbHVlRm9ybWF0MiA9IDAsXG4gICAgICAgICAgICAgICAgLy8gc28gdmFsdWUxIGlzIHRoZSBYQWR2YW5jZSBhbmQgdmFsdWUyIGlzIGVtcHR5LlxuICAgICAgICAgICAgICAgIGtlcm5pbmdSb3dbal0gPSB2YWx1ZTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IGNvdmVyYWdlIGxpc3QgdG8gYSBoYXNoXG4gICAgICAgIHZhciBjb3ZlcmVkID0ge307XG4gICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNvdmVyYWdlLmxlbmd0aDsgaSQxKyspIHtcbiAgICAgICAgICAgIGNvdmVyZWRbY292ZXJhZ2VbaSQxXV0gPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBrZXJuaW5nIHZhbHVlIGZvciBhIHNwZWNpZmljIGdseXBoIHBhaXIuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihsZWZ0R2x5cGgsIHJpZ2h0R2x5cGgpIHtcbiAgICAgICAgICAgIGlmICghY292ZXJlZFtsZWZ0R2x5cGhdKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgdmFyIGNsYXNzMSA9IGdldENsYXNzMShsZWZ0R2x5cGgpO1xuICAgICAgICAgICAgdmFyIGNsYXNzMiA9IGdldENsYXNzMihyaWdodEdseXBoKTtcbiAgICAgICAgICAgIHZhciBrZXJuaW5nUm93ID0ga2VybmluZ01hdHJpeFtjbGFzczFdO1xuXG4gICAgICAgICAgICBpZiAoa2VybmluZ1Jvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXJuaW5nUm93W2NsYXNzMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vLyBQYXJzZSBhIExvb2t1cFRhYmxlIChwcmVzZW50IGluIG9mIEdQT1MsIEdTVUIsIEdERUYsIEJBU0UsIEpTVEYgdGFibGVzKS5cbmZ1bmN0aW9uIHBhcnNlTG9va3VwVGFibGUoZGF0YSwgc3RhcnQpIHtcbiAgICB2YXIgcCA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIHZhciBsb29rdXBUeXBlID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIHZhciBsb29rdXBGbGFnID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgIHZhciB1c2VNYXJrRmlsdGVyaW5nU2V0ID0gbG9va3VwRmxhZyAmIDB4MTA7XG4gICAgdmFyIHN1YlRhYmxlQ291bnQgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgdmFyIHN1YlRhYmxlT2Zmc2V0cyA9IHAucGFyc2VPZmZzZXQxNkxpc3Qoc3ViVGFibGVDb3VudCk7XG4gICAgdmFyIHRhYmxlID0ge1xuICAgICAgICBsb29rdXBUeXBlOiBsb29rdXBUeXBlLFxuICAgICAgICBsb29rdXBGbGFnOiBsb29rdXBGbGFnLFxuICAgICAgICBtYXJrRmlsdGVyaW5nU2V0OiB1c2VNYXJrRmlsdGVyaW5nU2V0ID8gcC5wYXJzZVVTaG9ydCgpIDogLTFcbiAgICB9O1xuICAgIC8vIExvb2t1cFR5cGUgMiwgUGFpciBhZGp1c3RtZW50XG4gICAgaWYgKGxvb2t1cFR5cGUgPT09IDIpIHtcbiAgICAgICAgdmFyIHN1YnRhYmxlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YlRhYmxlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBhaXJQb3NTdWJUYWJsZSA9IHBhcnNlUGFpclBvc1N1YlRhYmxlKGRhdGEsIHN0YXJ0ICsgc3ViVGFibGVPZmZzZXRzW2ldKTtcbiAgICAgICAgICAgIGlmIChwYWlyUG9zU3ViVGFibGUpIHsgc3VidGFibGVzLnB1c2gocGFpclBvc1N1YlRhYmxlKTsgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIGZpbmRzIHRoZSBrZXJuaW5nIHZhbHVlcyBpbiB0aGUgc3VidGFibGVzLlxuICAgICAgICB0YWJsZS5nZXRLZXJuaW5nVmFsdWUgPSBmdW5jdGlvbihsZWZ0R2x5cGgsIHJpZ2h0R2x5cGgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdWJ0YWJsZXMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc3VidGFibGVzW2ldKGxlZnRHbHlwaCwgcmlnaHRHbHlwaCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsgcmV0dXJuIHZhbHVlOyB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZTtcbn1cblxuLy8gUGFyc2UgdGhlIGBHUE9TYCB0YWJsZSB3aGljaCBjb250YWlucywgYW1vbmcgb3RoZXIgdGhpbmdzLCBrZXJuaW5nIHBhaXJzLlxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9ncG9zLmh0bVxuZnVuY3Rpb24gcGFyc2VHcG9zVGFibGUoZGF0YSwgc3RhcnQsIGZvbnQpIHtcbiAgICB2YXIgcCA9IG5ldyBwYXJzZS5QYXJzZXIoZGF0YSwgc3RhcnQpO1xuICAgIHZhciB0YWJsZVZlcnNpb24gPSBwLnBhcnNlRml4ZWQoKTtcbiAgICBjaGVjay5hcmd1bWVudCh0YWJsZVZlcnNpb24gPT09IDEsICdVbnN1cHBvcnRlZCBHUE9TIHRhYmxlIHZlcnNpb24uJyk7XG5cbiAgICAvLyBTY3JpcHRMaXN0IGFuZCBGZWF0dXJlTGlzdCAtIGlnbm9yZWQgZm9yIG5vd1xuICAgIHBhcnNlVGFnZ2VkTGlzdFRhYmxlKGRhdGEsIHN0YXJ0ICsgcC5wYXJzZVVTaG9ydCgpKTtcbiAgICAvLyAna2VybicgaXMgdGhlIGZlYXR1cmUgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAgIHBhcnNlVGFnZ2VkTGlzdFRhYmxlKGRhdGEsIHN0YXJ0ICsgcC5wYXJzZVVTaG9ydCgpKTtcblxuICAgIC8vIExvb2t1cExpc3RcbiAgICB2YXIgbG9va3VwTGlzdE9mZnNldCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICBwLnJlbGF0aXZlT2Zmc2V0ID0gbG9va3VwTGlzdE9mZnNldDtcbiAgICB2YXIgbG9va3VwQ291bnQgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgdmFyIGxvb2t1cFRhYmxlT2Zmc2V0cyA9IHAucGFyc2VPZmZzZXQxNkxpc3QobG9va3VwQ291bnQpO1xuICAgIHZhciBsb29rdXBMaXN0QWJzb2x1dGVPZmZzZXQgPSBzdGFydCArIGxvb2t1cExpc3RPZmZzZXQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb29rdXBDb3VudDsgaSsrKSB7XG4gICAgICAgIHZhciB0YWJsZSA9IHBhcnNlTG9va3VwVGFibGUoZGF0YSwgbG9va3VwTGlzdEFic29sdXRlT2Zmc2V0ICsgbG9va3VwVGFibGVPZmZzZXRzW2ldKTtcbiAgICAgICAgaWYgKHRhYmxlLmxvb2t1cFR5cGUgPT09IDIgJiYgIWZvbnQuZ2V0R3Bvc0tlcm5pbmdWYWx1ZSkgeyBmb250LmdldEdwb3NLZXJuaW5nVmFsdWUgPSB0YWJsZS5nZXRLZXJuaW5nVmFsdWU7IH1cbiAgICB9XG59XG5cbnZhciBncG9zID0geyBwYXJzZTogcGFyc2VHcG9zVGFibGUgfTtcblxuLy8gVGhlIGBrZXJuYCB0YWJsZSBjb250YWlucyBrZXJuaW5nIHBhaXJzLlxuLy8gTm90ZSB0aGF0IHNvbWUgZm9udHMgdXNlIHRoZSBHUE9TIE9wZW5UeXBlIGxheW91dCB0YWJsZSB0byBzcGVjaWZ5IGtlcm5pbmcuXG4vLyBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT1RTUEVDL2tlcm4uaHRtXG5cbmZ1bmN0aW9uIHBhcnNlV2luZG93c0tlcm5UYWJsZShwKSB7XG4gICAgdmFyIHBhaXJzID0ge307XG4gICAgLy8gU2tpcCBuVGFibGVzLlxuICAgIHAuc2tpcCgndVNob3J0Jyk7XG4gICAgdmFyIHN1YnRhYmxlVmVyc2lvbiA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICBjaGVjay5hcmd1bWVudChzdWJ0YWJsZVZlcnNpb24gPT09IDAsICdVbnN1cHBvcnRlZCBrZXJuIHN1Yi10YWJsZSB2ZXJzaW9uLicpO1xuICAgIC8vIFNraXAgc3VidGFibGVMZW5ndGgsIHN1YnRhYmxlQ292ZXJhZ2VcbiAgICBwLnNraXAoJ3VTaG9ydCcsIDIpO1xuICAgIHZhciBuUGFpcnMgPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgLy8gU2tpcCBzZWFyY2hSYW5nZSwgZW50cnlTZWxlY3RvciwgcmFuZ2VTaGlmdC5cbiAgICBwLnNraXAoJ3VTaG9ydCcsIDMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgblBhaXJzOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGxlZnRJbmRleCA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICAgICAgdmFyIHJpZ2h0SW5kZXggPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHAucGFyc2VTaG9ydCgpO1xuICAgICAgICBwYWlyc1tsZWZ0SW5kZXggKyAnLCcgKyByaWdodEluZGV4XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcGFpcnM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWFjS2VyblRhYmxlKHApIHtcbiAgICB2YXIgcGFpcnMgPSB7fTtcbiAgICAvLyBUaGUgTWFjIGtlcm4gdGFibGUgc3RvcmVzIHRoZSB2ZXJzaW9uIGFzIGEgZml4ZWQgKDMyIGJpdHMpIGJ1dCB3ZSBvbmx5IGxvYWRlZCB0aGUgZmlyc3QgMTYgYml0cy5cbiAgICAvLyBTa2lwIHRoZSByZXN0LlxuICAgIHAuc2tpcCgndVNob3J0Jyk7XG4gICAgdmFyIG5UYWJsZXMgPSBwLnBhcnNlVUxvbmcoKTtcbiAgICAvL2NoZWNrLmFyZ3VtZW50KG5UYWJsZXMgPT09IDEsICdPbmx5IDEgc3VidGFibGUgaXMgc3VwcG9ydGVkIChnb3QgJyArIG5UYWJsZXMgKyAnKS4nKTtcbiAgICBpZiAoblRhYmxlcyA+IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdPbmx5IHRoZSBmaXJzdCBrZXJuIHN1YnRhYmxlIGlzIHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgcC5za2lwKCd1TG9uZycpO1xuICAgIHZhciBjb3ZlcmFnZSA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICB2YXIgc3VidGFibGVWZXJzaW9uID0gY292ZXJhZ2UgJiAweEZGO1xuICAgIHAuc2tpcCgndVNob3J0Jyk7XG4gICAgaWYgKHN1YnRhYmxlVmVyc2lvbiA9PT0gMCkge1xuICAgICAgICB2YXIgblBhaXJzID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAvLyBTa2lwIHNlYXJjaFJhbmdlLCBlbnRyeVNlbGVjdG9yLCByYW5nZVNoaWZ0LlxuICAgICAgICBwLnNraXAoJ3VTaG9ydCcsIDMpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5QYWlyczsgaSArPSAxKSB7XG4gICAgICAgICAgICB2YXIgbGVmdEluZGV4ID0gcC5wYXJzZVVTaG9ydCgpO1xuICAgICAgICAgICAgdmFyIHJpZ2h0SW5kZXggPSBwLnBhcnNlVVNob3J0KCk7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBwLnBhcnNlU2hvcnQoKTtcbiAgICAgICAgICAgIHBhaXJzW2xlZnRJbmRleCArICcsJyArIHJpZ2h0SW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhaXJzO1xufVxuXG4vLyBQYXJzZSB0aGUgYGtlcm5gIHRhYmxlIHdoaWNoIGNvbnRhaW5zIGtlcm5pbmcgcGFpcnMuXG5mdW5jdGlvbiBwYXJzZUtlcm5UYWJsZShkYXRhLCBzdGFydCkge1xuICAgIHZhciBwID0gbmV3IHBhcnNlLlBhcnNlcihkYXRhLCBzdGFydCk7XG4gICAgdmFyIHRhYmxlVmVyc2lvbiA9IHAucGFyc2VVU2hvcnQoKTtcbiAgICBpZiAodGFibGVWZXJzaW9uID09PSAwKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVdpbmRvd3NLZXJuVGFibGUocCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZVZlcnNpb24gPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlTWFjS2VyblRhYmxlKHApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQga2VybiB0YWJsZSB2ZXJzaW9uICgnICsgdGFibGVWZXJzaW9uICsgJykuJyk7XG4gICAgfVxufVxuXG52YXIga2VybiA9IHsgcGFyc2U6IHBhcnNlS2VyblRhYmxlIH07XG5cbi8vIFRoZSBgbG9jYWAgdGFibGUgc3RvcmVzIHRoZSBvZmZzZXRzIHRvIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGdseXBocyBpbiB0aGUgZm9udC5cbi8vIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PVFNQRUMvbG9jYS5odG1cblxuLy8gUGFyc2UgdGhlIGBsb2NhYCB0YWJsZS4gVGhpcyB0YWJsZSBzdG9yZXMgdGhlIG9mZnNldHMgdG8gdGhlIGxvY2F0aW9ucyBvZiB0aGUgZ2x5cGhzIGluIHRoZSBmb250LFxuLy8gcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2x5cGhEYXRhIHRhYmxlLlxuLy8gVGhlIG51bWJlciBvZiBnbHlwaHMgc3RvcmVkIGluIHRoZSBgbG9jYWAgdGFibGUgaXMgc3BlY2lmaWVkIGluIHRoZSBgbWF4cGAgdGFibGUgKHVuZGVyIG51bUdseXBocylcbi8vIFRoZSBsb2NhIHRhYmxlIGhhcyB0d28gdmVyc2lvbnM6IGEgc2hvcnQgdmVyc2lvbiB3aGVyZSBvZmZzZXRzIGFyZSBzdG9yZWQgYXMgdVNob3J0cywgYW5kIGEgbG9uZ1xuLy8gdmVyc2lvbiB3aGVyZSBvZmZzZXRzIGFyZSBzdG9yZWQgYXMgdUxvbmdzLiBUaGUgYGhlYWRgIHRhYmxlIHNwZWNpZmllcyB3aGljaCB2ZXJzaW9uIHRvIHVzZVxuLy8gKHVuZGVyIGluZGV4VG9Mb2NGb3JtYXQpLlxuZnVuY3Rpb24gcGFyc2VMb2NhVGFibGUoZGF0YSwgc3RhcnQsIG51bUdseXBocywgc2hvcnRWZXJzaW9uKSB7XG4gICAgdmFyIHAgPSBuZXcgcGFyc2UuUGFyc2VyKGRhdGEsIHN0YXJ0KTtcbiAgICB2YXIgcGFyc2VGbiA9IHNob3J0VmVyc2lvbiA/IHAucGFyc2VVU2hvcnQgOiBwLnBhcnNlVUxvbmc7XG4gICAgLy8gVGhlcmUgaXMgYW4gZXh0cmEgZW50cnkgYWZ0ZXIgdGhlIGxhc3QgaW5kZXggZWxlbWVudCB0byBjb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIGxhc3QgZ2x5cGguXG4gICAgLy8gVGhhdCdzIHdoeSB3ZSB1c2UgbnVtR2x5cGhzICsgMS5cbiAgICB2YXIgZ2x5cGhPZmZzZXRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1HbHlwaHMgKyAxOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGdseXBoT2Zmc2V0ID0gcGFyc2VGbi5jYWxsKHApO1xuICAgICAgICBpZiAoc2hvcnRWZXJzaW9uKSB7XG4gICAgICAgICAgICAvLyBUaGUgc2hvcnQgdGFibGUgdmVyc2lvbiBzdG9yZXMgdGhlIGFjdHVhbCBvZmZzZXQgZGl2aWRlZCBieSAyLlxuICAgICAgICAgICAgZ2x5cGhPZmZzZXQgKj0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGdseXBoT2Zmc2V0cy5wdXNoKGdseXBoT2Zmc2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGhPZmZzZXRzO1xufVxuXG52YXIgbG9jYSA9IHsgcGFyc2U6IHBhcnNlTG9jYVRhYmxlIH07XG5cbi8vIG9wZW50eXBlLmpzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWJveC9vcGVudHlwZS5qc1xuLy8gKGMpIDIwMTUgRnJlZGVyaWsgRGUgQmxlc2VyXG4vLyBvcGVudHlwZS5qcyBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cblxuLyogZ2xvYmFsIERhdGFWaWV3LCBVaW50OEFycmF5LCBYTUxIdHRwUmVxdWVzdCAgKi9cblxuLyoqXG4gKiBUaGUgb3BlbnR5cGUgbGlicmFyeS5cbiAqIEBuYW1lc3BhY2Ugb3BlbnR5cGVcbiAqL1xuXG4vLyBGaWxlIGxvYWRlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKipcbiAqIExvYWRzIGEgZm9udCBmcm9tIGEgZmlsZS4gVGhlIGNhbGxiYWNrIHRocm93cyBhbiBlcnJvciBtZXNzYWdlIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaWYgaXQgZmFpbHNcbiAqIGFuZCB0aGUgZm9udCBhcyBhbiBBcnJheUJ1ZmZlciBpbiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpZiBpdCBzdWNjZWVkcy5cbiAqIEBwYXJhbSAge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBmb250IGxvYWQgY29tcGxldGVzXG4gKi9cbmZ1bmN0aW9uIGxvYWRGcm9tRmlsZShwYXRoLCBjYWxsYmFjaykge1xuICAgIHZhciBmcyA9IF9kZXJlcV8oJ2ZzJyk7XG4gICAgZnMucmVhZEZpbGUocGF0aCwgZnVuY3Rpb24oZXJyLCBidWZmZXIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVyci5tZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG51bGwsIG5vZGVCdWZmZXJUb0FycmF5QnVmZmVyKGJ1ZmZlcikpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBMb2FkcyBhIGZvbnQgZnJvbSBhIFVSTC4gVGhlIGNhbGxiYWNrIHRocm93cyBhbiBlcnJvciBtZXNzYWdlIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaWYgaXQgZmFpbHNcbiAqIGFuZCB0aGUgZm9udCBhcyBhbiBBcnJheUJ1ZmZlciBpbiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpZiBpdCBzdWNjZWVkcy5cbiAqIEBwYXJhbSAge3N0cmluZ30gdXJsIC0gVGhlIFVSTCBvZiB0aGUgZm9udCBmaWxlLlxuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZm9udCBsb2FkIGNvbXBsZXRlc1xuICovXG5mdW5jdGlvbiBsb2FkRnJvbVVybCh1cmwsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICByZXF1ZXN0Lm9wZW4oJ2dldCcsIHVybCwgdHJ1ZSk7XG4gICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soJ0ZvbnQgY291bGQgbm90IGJlIGxvYWRlZDogJyArIHJlcXVlc3Quc3RhdHVzVGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgcmVxdWVzdC5yZXNwb25zZSk7XG4gICAgfTtcblxuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2soJ0ZvbnQgY291bGQgbm90IGJlIGxvYWRlZCcpO1xuICAgIH07XG5cbiAgICByZXF1ZXN0LnNlbmQoKTtcbn1cblxuLy8gVGFibGUgRGlyZWN0b3J5IEVudHJpZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLyoqXG4gKiBQYXJzZXMgT3BlblR5cGUgdGFibGUgZW50cmllcy5cbiAqIEBwYXJhbSAge0RhdGFWaWV3fVxuICogQHBhcmFtICB7TnVtYmVyfVxuICogQHJldHVybiB7T2JqZWN0W119XG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3BlblR5cGVUYWJsZUVudHJpZXMoZGF0YSwgbnVtVGFibGVzKSB7XG4gICAgdmFyIHRhYmxlRW50cmllcyA9IFtdO1xuICAgIHZhciBwID0gMTI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkgKz0gMSkge1xuICAgICAgICB2YXIgdGFnID0gcGFyc2UuZ2V0VGFnKGRhdGEsIHApO1xuICAgICAgICB2YXIgY2hlY2tzdW0gPSBwYXJzZS5nZXRVTG9uZyhkYXRhLCBwICsgNCk7XG4gICAgICAgIHZhciBvZmZzZXQgPSBwYXJzZS5nZXRVTG9uZyhkYXRhLCBwICsgOCk7XG4gICAgICAgIHZhciBsZW5ndGggPSBwYXJzZS5nZXRVTG9uZyhkYXRhLCBwICsgMTIpO1xuICAgICAgICB0YWJsZUVudHJpZXMucHVzaCh7dGFnOiB0YWcsIGNoZWNrc3VtOiBjaGVja3N1bSwgb2Zmc2V0OiBvZmZzZXQsIGxlbmd0aDogbGVuZ3RoLCBjb21wcmVzc2lvbjogZmFsc2V9KTtcbiAgICAgICAgcCArPSAxNjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGVFbnRyaWVzO1xufVxuXG4vKipcbiAqIFBhcnNlcyBXT0ZGIHRhYmxlIGVudHJpZXMuXG4gKiBAcGFyYW0gIHtEYXRhVmlld31cbiAqIEBwYXJhbSAge051bWJlcn1cbiAqIEByZXR1cm4ge09iamVjdFtdfVxuICovXG5mdW5jdGlvbiBwYXJzZVdPRkZUYWJsZUVudHJpZXMoZGF0YSwgbnVtVGFibGVzKSB7XG4gICAgdmFyIHRhYmxlRW50cmllcyA9IFtdO1xuICAgIHZhciBwID0gNDQ7IC8vIG9mZnNldCB0byB0aGUgZmlyc3QgdGFibGUgZGlyZWN0b3J5IGVudHJ5LlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIHRhZyA9IHBhcnNlLmdldFRhZyhkYXRhLCBwKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHBhcnNlLmdldFVMb25nKGRhdGEsIHAgKyA0KTtcbiAgICAgICAgdmFyIGNvbXBMZW5ndGggPSBwYXJzZS5nZXRVTG9uZyhkYXRhLCBwICsgOCk7XG4gICAgICAgIHZhciBvcmlnTGVuZ3RoID0gcGFyc2UuZ2V0VUxvbmcoZGF0YSwgcCArIDEyKTtcbiAgICAgICAgdmFyIGNvbXByZXNzaW9uID0gKHZvaWQgMCk7XG4gICAgICAgIGlmIChjb21wTGVuZ3RoIDwgb3JpZ0xlbmd0aCkge1xuICAgICAgICAgICAgY29tcHJlc3Npb24gPSAnV09GRic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wcmVzc2lvbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFibGVFbnRyaWVzLnB1c2goe3RhZzogdGFnLCBvZmZzZXQ6IG9mZnNldCwgY29tcHJlc3Npb246IGNvbXByZXNzaW9uLFxuICAgICAgICAgICAgY29tcHJlc3NlZExlbmd0aDogY29tcExlbmd0aCwgbGVuZ3RoOiBvcmlnTGVuZ3RofSk7XG4gICAgICAgIHAgKz0gMjA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlRW50cmllcztcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBUYWJsZURhdGFcbiAqIEB0eXBlIE9iamVjdFxuICogQHByb3BlcnR5IHtEYXRhVmlld30gZGF0YSAtIFRoZSBEYXRhVmlld1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG9mZnNldCAtIFRoZSBkYXRhIG9mZnNldC5cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSAge0RhdGFWaWV3fVxuICogQHBhcmFtICB7T2JqZWN0fVxuICogQHJldHVybiB7VGFibGVEYXRhfVxuICovXG5mdW5jdGlvbiB1bmNvbXByZXNzVGFibGUoZGF0YSwgdGFibGVFbnRyeSkge1xuICAgIGlmICh0YWJsZUVudHJ5LmNvbXByZXNzaW9uID09PSAnV09GRicpIHtcbiAgICAgICAgdmFyIGluQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsIHRhYmxlRW50cnkub2Zmc2V0ICsgMiwgdGFibGVFbnRyeS5jb21wcmVzc2VkTGVuZ3RoIC0gMik7XG4gICAgICAgIHZhciBvdXRCdWZmZXIgPSBuZXcgVWludDhBcnJheSh0YWJsZUVudHJ5Lmxlbmd0aCk7XG4gICAgICAgIGluZGV4KGluQnVmZmVyLCBvdXRCdWZmZXIpO1xuICAgICAgICBpZiAob3V0QnVmZmVyLmJ5dGVMZW5ndGggIT09IHRhYmxlRW50cnkubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlY29tcHJlc3Npb24gZXJyb3I6ICcgKyB0YWJsZUVudHJ5LnRhZyArICcgZGVjb21wcmVzc2VkIGxlbmd0aCBkb2VzblxcJ3QgbWF0Y2ggcmVjb3JkZWQgbGVuZ3RoJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyhvdXRCdWZmZXIuYnVmZmVyLCAwKTtcbiAgICAgICAgcmV0dXJuIHtkYXRhOiB2aWV3LCBvZmZzZXQ6IDB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7ZGF0YTogZGF0YSwgb2Zmc2V0OiB0YWJsZUVudHJ5Lm9mZnNldH07XG4gICAgfVxufVxuXG4vLyBQdWJsaWMgQVBJIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogUGFyc2UgdGhlIE9wZW5UeXBlIGZpbGUgZGF0YSAoYXMgYW4gQXJyYXlCdWZmZXIpIGFuZCByZXR1cm4gYSBGb250IG9iamVjdC5cbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgZm9udCBjb3VsZCBub3QgYmUgcGFyc2VkLlxuICogQHBhcmFtICB7QXJyYXlCdWZmZXJ9XG4gKiBAcmV0dXJuIHtvcGVudHlwZS5Gb250fVxuICovXG5mdW5jdGlvbiBwYXJzZUJ1ZmZlcihidWZmZXIpIHtcbiAgICB2YXIgaW5kZXhUb0xvY0Zvcm1hdDtcbiAgICB2YXIgbHRhZ1RhYmxlO1xuXG4gICAgLy8gU2luY2UgdGhlIGNvbnN0cnVjdG9yIGNhbiBhbHNvIGJlIGNhbGxlZCB0byBjcmVhdGUgbmV3IGZvbnRzIGZyb20gc2NyYXRjaCwgd2UgaW5kaWNhdGUgdGhpc1xuICAgIC8vIHNob3VsZCBiZSBhbiBlbXB0eSBmb250IHRoYXQgd2UnbGwgZmlsbCB3aXRoIG91ciBvd24gZGF0YS5cbiAgICB2YXIgZm9udCA9IG5ldyBGb250KHtlbXB0eTogdHJ1ZX0pO1xuXG4gICAgLy8gT3BlblR5cGUgZm9udHMgdXNlIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcmluZy5cbiAgICAvLyBXZSBjYW4ndCByZWx5IG9uIHR5cGVkIGFycmF5IHZpZXcgdHlwZXMsIGJlY2F1c2UgdGhleSBvcGVyYXRlIHdpdGggdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGhvc3QgY29tcHV0ZXIuXG4gICAgLy8gSW5zdGVhZCB3ZSB1c2UgRGF0YVZpZXdzIHdoZXJlIHdlIGNhbiBzcGVjaWZ5IGVuZGlhbm5lc3MuXG4gICAgdmFyIGRhdGEgPSBuZXcgRGF0YVZpZXcoYnVmZmVyLCAwKTtcbiAgICB2YXIgbnVtVGFibGVzO1xuICAgIHZhciB0YWJsZUVudHJpZXMgPSBbXTtcbiAgICB2YXIgc2lnbmF0dXJlID0gcGFyc2UuZ2V0VGFnKGRhdGEsIDApO1xuICAgIGlmIChzaWduYXR1cmUgPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoMCwgMSwgMCwgMCkgfHwgc2lnbmF0dXJlID09PSAndHJ1ZScgfHwgc2lnbmF0dXJlID09PSAndHlwMScpIHtcbiAgICAgICAgZm9udC5vdXRsaW5lc0Zvcm1hdCA9ICd0cnVldHlwZSc7XG4gICAgICAgIG51bVRhYmxlcyA9IHBhcnNlLmdldFVTaG9ydChkYXRhLCA0KTtcbiAgICAgICAgdGFibGVFbnRyaWVzID0gcGFyc2VPcGVuVHlwZVRhYmxlRW50cmllcyhkYXRhLCBudW1UYWJsZXMpO1xuICAgIH0gZWxzZSBpZiAoc2lnbmF0dXJlID09PSAnT1RUTycpIHtcbiAgICAgICAgZm9udC5vdXRsaW5lc0Zvcm1hdCA9ICdjZmYnO1xuICAgICAgICBudW1UYWJsZXMgPSBwYXJzZS5nZXRVU2hvcnQoZGF0YSwgNCk7XG4gICAgICAgIHRhYmxlRW50cmllcyA9IHBhcnNlT3BlblR5cGVUYWJsZUVudHJpZXMoZGF0YSwgbnVtVGFibGVzKTtcbiAgICB9IGVsc2UgaWYgKHNpZ25hdHVyZSA9PT0gJ3dPRkYnKSB7XG4gICAgICAgIHZhciBmbGF2b3IgPSBwYXJzZS5nZXRUYWcoZGF0YSwgNCk7XG4gICAgICAgIGlmIChmbGF2b3IgPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoMCwgMSwgMCwgMCkpIHtcbiAgICAgICAgICAgIGZvbnQub3V0bGluZXNGb3JtYXQgPSAndHJ1ZXR5cGUnO1xuICAgICAgICB9IGVsc2UgaWYgKGZsYXZvciA9PT0gJ09UVE8nKSB7XG4gICAgICAgICAgICBmb250Lm91dGxpbmVzRm9ybWF0ID0gJ2NmZic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIE9wZW5UeXBlIGZsYXZvciAnICsgc2lnbmF0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG51bVRhYmxlcyA9IHBhcnNlLmdldFVTaG9ydChkYXRhLCAxMik7XG4gICAgICAgIHRhYmxlRW50cmllcyA9IHBhcnNlV09GRlRhYmxlRW50cmllcyhkYXRhLCBudW1UYWJsZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgT3BlblR5cGUgc2lnbmF0dXJlICcgKyBzaWduYXR1cmUpO1xuICAgIH1cblxuICAgIHZhciBjZmZUYWJsZUVudHJ5O1xuICAgIHZhciBmdmFyVGFibGVFbnRyeTtcbiAgICB2YXIgZ2x5ZlRhYmxlRW50cnk7XG4gICAgdmFyIGdwb3NUYWJsZUVudHJ5O1xuICAgIHZhciBnc3ViVGFibGVFbnRyeTtcbiAgICB2YXIgaG10eFRhYmxlRW50cnk7XG4gICAgdmFyIGtlcm5UYWJsZUVudHJ5O1xuICAgIHZhciBsb2NhVGFibGVFbnRyeTtcbiAgICB2YXIgbmFtZVRhYmxlRW50cnk7XG4gICAgdmFyIG1ldGFUYWJsZUVudHJ5O1xuICAgIHZhciBwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkgKz0gMSkge1xuICAgICAgICB2YXIgdGFibGVFbnRyeSA9IHRhYmxlRW50cmllc1tpXTtcbiAgICAgICAgdmFyIHRhYmxlID0gKHZvaWQgMCk7XG4gICAgICAgIHN3aXRjaCAodGFibGVFbnRyeS50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NtYXAnOlxuICAgICAgICAgICAgICAgIHRhYmxlID0gdW5jb21wcmVzc1RhYmxlKGRhdGEsIHRhYmxlRW50cnkpO1xuICAgICAgICAgICAgICAgIGZvbnQudGFibGVzLmNtYXAgPSBjbWFwLnBhcnNlKHRhYmxlLmRhdGEsIHRhYmxlLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgZm9udC5lbmNvZGluZyA9IG5ldyBDbWFwRW5jb2RpbmcoZm9udC50YWJsZXMuY21hcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjdnQgJyA6XG4gICAgICAgICAgICAgICAgdGFibGUgPSB1bmNvbXByZXNzVGFibGUoZGF0YSwgdGFibGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgcCA9IG5ldyBwYXJzZS5QYXJzZXIodGFibGUuZGF0YSwgdGFibGUub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBmb250LnRhYmxlcy5jdnQgPSBwLnBhcnNlU2hvcnRMaXN0KHRhYmxlRW50cnkubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmdmFyJzpcbiAgICAgICAgICAgICAgICBmdmFyVGFibGVFbnRyeSA9IHRhYmxlRW50cnk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmcGdtJyA6XG4gICAgICAgICAgICAgICAgdGFibGUgPSB1bmNvbXByZXNzVGFibGUoZGF0YSwgdGFibGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgcCA9IG5ldyBwYXJzZS5QYXJzZXIodGFibGUuZGF0YSwgdGFibGUub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBmb250LnRhYmxlcy5mcGdtID0gcC5wYXJzZUJ5dGVMaXN0KHRhYmxlRW50cnkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgICAgICAgICAgIHRhYmxlID0gdW5jb21wcmVzc1RhYmxlKGRhdGEsIHRhYmxlRW50cnkpO1xuICAgICAgICAgICAgICAgIGZvbnQudGFibGVzLmhlYWQgPSBoZWFkLnBhcnNlKHRhYmxlLmRhdGEsIHRhYmxlLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgZm9udC51bml0c1BlckVtID0gZm9udC50YWJsZXMuaGVhZC51bml0c1BlckVtO1xuICAgICAgICAgICAgICAgIGluZGV4VG9Mb2NGb3JtYXQgPSBmb250LnRhYmxlcy5oZWFkLmluZGV4VG9Mb2NGb3JtYXQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdoaGVhJzpcbiAgICAgICAgICAgICAgICB0YWJsZSA9IHVuY29tcHJlc3NUYWJsZShkYXRhLCB0YWJsZUVudHJ5KTtcbiAgICAgICAgICAgICAgICBmb250LnRhYmxlcy5oaGVhID0gaGhlYS5wYXJzZSh0YWJsZS5kYXRhLCB0YWJsZS5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIGZvbnQuYXNjZW5kZXIgPSBmb250LnRhYmxlcy5oaGVhLmFzY2VuZGVyO1xuICAgICAgICAgICAgICAgIGZvbnQuZGVzY2VuZGVyID0gZm9udC50YWJsZXMuaGhlYS5kZXNjZW5kZXI7XG4gICAgICAgICAgICAgICAgZm9udC5udW1iZXJPZkhNZXRyaWNzID0gZm9udC50YWJsZXMuaGhlYS5udW1iZXJPZkhNZXRyaWNzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaG10eCc6XG4gICAgICAgICAgICAgICAgaG10eFRhYmxlRW50cnkgPSB0YWJsZUVudHJ5O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbHRhZyc6XG4gICAgICAgICAgICAgICAgdGFibGUgPSB1bmNvbXByZXNzVGFibGUoZGF0YSwgdGFibGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgbHRhZ1RhYmxlID0gbHRhZy5wYXJzZSh0YWJsZS5kYXRhLCB0YWJsZS5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWF4cCc6XG4gICAgICAgICAgICAgICAgdGFibGUgPSB1bmNvbXByZXNzVGFibGUoZGF0YSwgdGFibGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgZm9udC50YWJsZXMubWF4cCA9IG1heHAucGFyc2UodGFibGUuZGF0YSwgdGFibGUub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBmb250Lm51bUdseXBocyA9IGZvbnQudGFibGVzLm1heHAubnVtR2x5cGhzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgICAgICAgbmFtZVRhYmxlRW50cnkgPSB0YWJsZUVudHJ5O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnT1MvMic6XG4gICAgICAgICAgICAgICAgdGFibGUgPSB1bmNvbXByZXNzVGFibGUoZGF0YSwgdGFibGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgZm9udC50YWJsZXMub3MyID0gb3MyLnBhcnNlKHRhYmxlLmRhdGEsIHRhYmxlLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwb3N0JzpcbiAgICAgICAgICAgICAgICB0YWJsZSA9IHVuY29tcHJlc3NUYWJsZShkYXRhLCB0YWJsZUVudHJ5KTtcbiAgICAgICAgICAgICAgICBmb250LnRhYmxlcy5wb3N0ID0gcG9zdC5wYXJzZSh0YWJsZS5kYXRhLCB0YWJsZS5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIGZvbnQuZ2x5cGhOYW1lcyA9IG5ldyBHbHlwaE5hbWVzKGZvbnQudGFibGVzLnBvc3QpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHJlcCcgOlxuICAgICAgICAgICAgICAgIHRhYmxlID0gdW5jb21wcmVzc1RhYmxlKGRhdGEsIHRhYmxlRW50cnkpO1xuICAgICAgICAgICAgICAgIHAgPSBuZXcgcGFyc2UuUGFyc2VyKHRhYmxlLmRhdGEsIHRhYmxlLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgZm9udC50YWJsZXMucHJlcCA9IHAucGFyc2VCeXRlTGlzdCh0YWJsZUVudHJ5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdnbHlmJzpcbiAgICAgICAgICAgICAgICBnbHlmVGFibGVFbnRyeSA9IHRhYmxlRW50cnk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdsb2NhJzpcbiAgICAgICAgICAgICAgICBsb2NhVGFibGVFbnRyeSA9IHRhYmxlRW50cnk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDRkYgJzpcbiAgICAgICAgICAgICAgICBjZmZUYWJsZUVudHJ5ID0gdGFibGVFbnRyeTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2tlcm4nOlxuICAgICAgICAgICAgICAgIGtlcm5UYWJsZUVudHJ5ID0gdGFibGVFbnRyeTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0dQT1MnOlxuICAgICAgICAgICAgICAgIGdwb3NUYWJsZUVudHJ5ID0gdGFibGVFbnRyeTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0dTVUInOlxuICAgICAgICAgICAgICAgIGdzdWJUYWJsZUVudHJ5ID0gdGFibGVFbnRyeTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21ldGEnOlxuICAgICAgICAgICAgICAgIG1ldGFUYWJsZUVudHJ5ID0gdGFibGVFbnRyeTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuYW1lVGFibGUgPSB1bmNvbXByZXNzVGFibGUoZGF0YSwgbmFtZVRhYmxlRW50cnkpO1xuICAgIGZvbnQudGFibGVzLm5hbWUgPSBfbmFtZS5wYXJzZShuYW1lVGFibGUuZGF0YSwgbmFtZVRhYmxlLm9mZnNldCwgbHRhZ1RhYmxlKTtcbiAgICBmb250Lm5hbWVzID0gZm9udC50YWJsZXMubmFtZTtcblxuICAgIGlmIChnbHlmVGFibGVFbnRyeSAmJiBsb2NhVGFibGVFbnRyeSkge1xuICAgICAgICB2YXIgc2hvcnRWZXJzaW9uID0gaW5kZXhUb0xvY0Zvcm1hdCA9PT0gMDtcbiAgICAgICAgdmFyIGxvY2FUYWJsZSA9IHVuY29tcHJlc3NUYWJsZShkYXRhLCBsb2NhVGFibGVFbnRyeSk7XG4gICAgICAgIHZhciBsb2NhT2Zmc2V0cyA9IGxvY2EucGFyc2UobG9jYVRhYmxlLmRhdGEsIGxvY2FUYWJsZS5vZmZzZXQsIGZvbnQubnVtR2x5cGhzLCBzaG9ydFZlcnNpb24pO1xuICAgICAgICB2YXIgZ2x5ZlRhYmxlID0gdW5jb21wcmVzc1RhYmxlKGRhdGEsIGdseWZUYWJsZUVudHJ5KTtcbiAgICAgICAgZm9udC5nbHlwaHMgPSBnbHlmLnBhcnNlKGdseWZUYWJsZS5kYXRhLCBnbHlmVGFibGUub2Zmc2V0LCBsb2NhT2Zmc2V0cywgZm9udCk7XG4gICAgfSBlbHNlIGlmIChjZmZUYWJsZUVudHJ5KSB7XG4gICAgICAgIHZhciBjZmZUYWJsZSA9IHVuY29tcHJlc3NUYWJsZShkYXRhLCBjZmZUYWJsZUVudHJ5KTtcbiAgICAgICAgY2ZmLnBhcnNlKGNmZlRhYmxlLmRhdGEsIGNmZlRhYmxlLm9mZnNldCwgZm9udCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb250IGRvZXNuXFwndCBjb250YWluIFRydWVUeXBlIG9yIENGRiBvdXRsaW5lcy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaG10eFRhYmxlID0gdW5jb21wcmVzc1RhYmxlKGRhdGEsIGhtdHhUYWJsZUVudHJ5KTtcbiAgICBobXR4LnBhcnNlKGhtdHhUYWJsZS5kYXRhLCBobXR4VGFibGUub2Zmc2V0LCBmb250Lm51bWJlck9mSE1ldHJpY3MsIGZvbnQubnVtR2x5cGhzLCBmb250LmdseXBocyk7XG4gICAgYWRkR2x5cGhOYW1lcyhmb250KTtcblxuICAgIGlmIChrZXJuVGFibGVFbnRyeSkge1xuICAgICAgICB2YXIga2VyblRhYmxlID0gdW5jb21wcmVzc1RhYmxlKGRhdGEsIGtlcm5UYWJsZUVudHJ5KTtcbiAgICAgICAgZm9udC5rZXJuaW5nUGFpcnMgPSBrZXJuLnBhcnNlKGtlcm5UYWJsZS5kYXRhLCBrZXJuVGFibGUub2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb250Lmtlcm5pbmdQYWlycyA9IHt9O1xuICAgIH1cblxuICAgIGlmIChncG9zVGFibGVFbnRyeSkge1xuICAgICAgICB2YXIgZ3Bvc1RhYmxlID0gdW5jb21wcmVzc1RhYmxlKGRhdGEsIGdwb3NUYWJsZUVudHJ5KTtcbiAgICAgICAgZ3Bvcy5wYXJzZShncG9zVGFibGUuZGF0YSwgZ3Bvc1RhYmxlLm9mZnNldCwgZm9udCk7XG4gICAgfVxuXG4gICAgaWYgKGdzdWJUYWJsZUVudHJ5KSB7XG4gICAgICAgIHZhciBnc3ViVGFibGUgPSB1bmNvbXByZXNzVGFibGUoZGF0YSwgZ3N1YlRhYmxlRW50cnkpO1xuICAgICAgICBmb250LnRhYmxlcy5nc3ViID0gZ3N1Yi5wYXJzZShnc3ViVGFibGUuZGF0YSwgZ3N1YlRhYmxlLm9mZnNldCk7XG4gICAgfVxuXG4gICAgaWYgKGZ2YXJUYWJsZUVudHJ5KSB7XG4gICAgICAgIHZhciBmdmFyVGFibGUgPSB1bmNvbXByZXNzVGFibGUoZGF0YSwgZnZhclRhYmxlRW50cnkpO1xuICAgICAgICBmb250LnRhYmxlcy5mdmFyID0gZnZhci5wYXJzZShmdmFyVGFibGUuZGF0YSwgZnZhclRhYmxlLm9mZnNldCwgZm9udC5uYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFUYWJsZUVudHJ5KSB7XG4gICAgICAgIHZhciBtZXRhVGFibGUgPSB1bmNvbXByZXNzVGFibGUoZGF0YSwgbWV0YVRhYmxlRW50cnkpO1xuICAgICAgICBmb250LnRhYmxlcy5tZXRhID0gbWV0YS5wYXJzZShtZXRhVGFibGUuZGF0YSwgbWV0YVRhYmxlLm9mZnNldCk7XG4gICAgICAgIGZvbnQubWV0YXMgPSBmb250LnRhYmxlcy5tZXRhO1xuICAgIH1cblxuICAgIHJldHVybiBmb250O1xufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IGxvYWQgdGhlIGZvbnQgZnJvbSBhIFVSTCBvciBhIGZpbGVzeXN0ZW0uIFdoZW4gZG9uZSwgY2FsbCB0aGUgY2FsbGJhY2tcbiAqIHdpdGggdHdvIGFyZ3VtZW50cyBgKGVyciwgZm9udClgLiBUaGUgYGVycmAgd2lsbCBiZSBudWxsIG9uIHN1Y2Nlc3MsXG4gKiB0aGUgYGZvbnRgIGlzIGEgRm9udCBvYmplY3QuXG4gKiBXZSB1c2UgdGhlIG5vZGUuanMgY2FsbGJhY2sgY29udmVudGlvbiBzbyB0aGF0XG4gKiBvcGVudHlwZS5qcyBjYW4gaW50ZWdyYXRlIHdpdGggZnJhbWV3b3JrcyBsaWtlIGFzeW5jLmpzLlxuICogQGFsaWFzIG9wZW50eXBlLmxvYWRcbiAqIEBwYXJhbSAge3N0cmluZ30gdXJsIC0gVGhlIFVSTCBvZiB0aGUgZm9udCB0byBsb2FkLlxuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBsb2FkKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgaXNOb2RlJCQxID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgdmFyIGxvYWRGbiA9IGlzTm9kZSQkMSA/IGxvYWRGcm9tRmlsZSA6IGxvYWRGcm9tVXJsO1xuICAgIGxvYWRGbih1cmwsIGZ1bmN0aW9uKGVyciwgYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZvbnQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb250ID0gcGFyc2VCdWZmZXIoYXJyYXlCdWZmZXIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGZvbnQpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgbG9hZCB0aGUgZm9udCBmcm9tIGEgVVJMIG9yIGZpbGUuXG4gKiBXaGVuIGRvbmUsIHJldHVybnMgdGhlIGZvbnQgb2JqZWN0IG9yIHRocm93cyBhbiBlcnJvci5cbiAqIEBhbGlhcyBvcGVudHlwZS5sb2FkU3luY1xuICogQHBhcmFtICB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIG9mIHRoZSBmb250IHRvIGxvYWQuXG4gKiBAcmV0dXJuIHtvcGVudHlwZS5Gb250fVxuICovXG5mdW5jdGlvbiBsb2FkU3luYyh1cmwpIHtcbiAgICB2YXIgZnMgPSBfZGVyZXFfKCdmcycpO1xuICAgIHZhciBidWZmZXIgPSBmcy5yZWFkRmlsZVN5bmModXJsKTtcbiAgICByZXR1cm4gcGFyc2VCdWZmZXIobm9kZUJ1ZmZlclRvQXJyYXlCdWZmZXIoYnVmZmVyKSk7XG59XG5cbmV4cG9ydHMuRm9udCA9IEZvbnQ7XG5leHBvcnRzLkdseXBoID0gR2x5cGg7XG5leHBvcnRzLlBhdGggPSBQYXRoO1xuZXhwb3J0cy5Cb3VuZGluZ0JveCA9IEJvdW5kaW5nQm94O1xuZXhwb3J0cy5fcGFyc2UgPSBwYXJzZTtcbmV4cG9ydHMucGFyc2UgPSBwYXJzZUJ1ZmZlcjtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLmxvYWRTeW5jID0gbG9hZFN5bmM7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG5cblxufSkuY2FsbCh0aGlzLF9kZXJlcV8oXCJidWZmZXJcIikuQnVmZmVyKVxufSx7XCJidWZmZXJcIjo0LFwiZnNcIjozfV0sMTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxufSx7fV0sMTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uKHNlbGYpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmIChzZWxmLmZldGNoKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgc3VwcG9ydCA9IHtcbiAgICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIHNlbGYsXG4gICAgaXRlcmFibGU6ICdTeW1ib2wnIGluIHNlbGYgJiYgJ2l0ZXJhdG9yJyBpbiBTeW1ib2wsXG4gICAgYmxvYjogJ0ZpbGVSZWFkZXInIGluIHNlbGYgJiYgJ0Jsb2InIGluIHNlbGYgJiYgKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IEJsb2IoKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gICAgZm9ybURhdGE6ICdGb3JtRGF0YScgaW4gc2VsZixcbiAgICBhcnJheUJ1ZmZlcjogJ0FycmF5QnVmZmVyJyBpbiBzZWxmXG4gIH1cblxuICBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlcikge1xuICAgIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAgICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAgICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICAgIF1cblxuICAgIHZhciBpc0RhdGFWaWV3ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIERhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iailcbiAgICB9XG5cbiAgICB2YXIgaXNBcnJheUJ1ZmZlclZpZXcgPSBBcnJheUJ1ZmZlci5pc1ZpZXcgfHwgZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHZpZXdDbGFzc2VzLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikpID4gLTFcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gICAgfVxuICAgIGlmICgvW15hLXowLTlcXC0jJCUmJyorLlxcXl9gfH5dL2kudGVzdChuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUnKVxuICAgIH1cbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICBmdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuICBmdW5jdGlvbiBpdGVyYXRvckZvcihpdGVtcykge1xuICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpXG4gICAgICAgIHJldHVybiB7ZG9uZTogdmFsdWUgPT09IHVuZGVmaW5lZCwgdmFsdWU6IHZhbHVlfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gICAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVyYXRvclxuICB9XG5cbiAgZnVuY3Rpb24gSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgdGhpcy5tYXAgPSB7fVxuXG4gICAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9LCB0aGlzKVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgICB0aGlzLmFwcGVuZChoZWFkZXJbMF0sIGhlYWRlclsxXSlcbiAgICAgIH0sIHRoaXMpXG4gICAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICAgIH0sIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICAgIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV1cbiAgICB0aGlzLm1hcFtuYW1lXSA9IG9sZFZhbHVlID8gb2xkVmFsdWUrJywnK3ZhbHVlIDogdmFsdWVcbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV1cbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICAgIHJldHVybiB0aGlzLmhhcyhuYW1lKSA/IHRoaXMubWFwW25hbWVdIDogbnVsbFxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLm1hcCkge1xuICAgICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcy5tYXBbbmFtZV0sIG5hbWUsIHRoaXMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtcyA9IFtdXG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7IGl0ZW1zLnB1c2gobmFtZSkgfSlcbiAgICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG4gIH1cblxuICBIZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbXMgPSBbXVxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBpdGVtcy5wdXNoKHZhbHVlKSB9KVxuICAgIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbXMgPSBbXVxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkgeyBpdGVtcy5wdXNoKFtuYW1lLCB2YWx1ZV0pIH0pXG4gICAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xuICB9XG5cbiAgZnVuY3Rpb24gY29uc3VtZWQoYm9keSkge1xuICAgIGlmIChib2R5LmJvZHlVc2VkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpXG4gICAgfVxuICAgIGJvZHkuYm9keVVzZWQgPSB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgICB9XG4gICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYikge1xuICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gICAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICBmdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7XG4gICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gICAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYilcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxuICAgIHZhciBjaGFycyA9IG5ldyBBcnJheSh2aWV3Lmxlbmd0aClcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZpZXdbaV0pXG4gICAgfVxuICAgIHJldHVybiBjaGFycy5qb2luKCcnKVxuICB9XG5cbiAgZnVuY3Rpb24gYnVmZmVyQ2xvbmUoYnVmKSB7XG4gICAgaWYgKGJ1Zi5zbGljZSkge1xuICAgICAgcmV0dXJuIGJ1Zi5zbGljZSgwKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICAgIHJldHVybiB2aWV3LmJ1ZmZlclxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIEJvZHkoKSB7XG4gICAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgICB0aGlzLl9pbml0Qm9keSA9IGZ1bmN0aW9uKGJvZHkpIHtcbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gYm9keVxuICAgICAgaWYgKCFib2R5KSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gJydcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IgJiYgQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5mb3JtRGF0YSAmJiBGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5Rm9ybURhdGEgPSBib2R5XG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkudG9TdHJpbmcoKVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIHN1cHBvcnQuYmxvYiAmJiBpc0RhdGFWaWV3KGJvZHkpKSB7XG4gICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgICAvLyBJRSAxMC0xMSBjYW4ndCBoYW5kbGUgYSBEYXRhVmlldyBib2R5LlxuICAgICAgICB0aGlzLl9ib2R5SW5pdCA9IG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgQm9keUluaXQgdHlwZScpXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCB0aGlzLl9ib2R5QmxvYi50eXBlKVxuICAgICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgICB0aGlzLmJsb2IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlCbG9iKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICAgIHJldHVybiBjb25zdW1lZCh0aGlzKSB8fCBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUFycmF5QnVmZmVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiByZWFkQmxvYkFzVGV4dCh0aGlzLl9ib2R5QmxvYilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVhZEFycmF5QnVmZmVyQXNUZXh0KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXBwb3J0LmZvcm1EYXRhKSB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKGRlY29kZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxuICB2YXIgbWV0aG9kcyA9IFsnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUE9TVCcsICdQVVQnXVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHtcbiAgICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgcmV0dXJuIChtZXRob2RzLmluZGV4T2YodXBjYXNlZCkgPiAtMSkgPyB1cGNhc2VkIDogbWV0aG9kXG4gIH1cblxuICBmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgaWYgKGlucHV0LmJvZHlVc2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgICB9XG4gICAgICB0aGlzLnVybCA9IGlucHV0LnVybFxuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbnB1dC5oZWFkZXJzKVxuICAgICAgfVxuICAgICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2RcbiAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGVcbiAgICAgIGlmICghYm9keSAmJiBpbnB1dC5fYm9keUluaXQgIT0gbnVsbCkge1xuICAgICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dClcbiAgICB9XG5cbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdvbWl0J1xuICAgIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICAgIH1cbiAgICB0aGlzLm1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLm1ldGhvZCB8fCAnR0VUJylcbiAgICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgICB0aGlzLnJlZmVycmVyID0gbnVsbFxuXG4gICAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKVxuICAgIH1cbiAgICB0aGlzLl9pbml0Qm9keShib2R5KVxuICB9XG5cbiAgUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywgeyBib2R5OiB0aGlzLl9ib2R5SW5pdCB9KVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgICB2YXIgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgYm9keS50cmltKCkuc3BsaXQoJyYnKS5mb3JFYWNoKGZ1bmN0aW9uKGJ5dGVzKSB7XG4gICAgICBpZiAoYnl0ZXMpIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gYnl0ZXMuc3BsaXQoJz0nKVxuICAgICAgICB2YXIgbmFtZSA9IHNwbGl0LnNoaWZ0KCkucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignPScpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIGZvcm0uYXBwZW5kKGRlY29kZVVSSUNvbXBvbmVudChuYW1lKSwgZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBmb3JtXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUhlYWRlcnMocmF3SGVhZGVycykge1xuICAgIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAgIHJhd0hlYWRlcnMuc3BsaXQoL1xccj9cXG4vKS5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIHZhciBwYXJ0cyA9IGxpbmUuc3BsaXQoJzonKVxuICAgICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzonKS50cmltKClcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICBCb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpXG5cbiAgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICAgIHRoaXMuc3RhdHVzID0gJ3N0YXR1cycgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc3RhdHVzIDogMjAwXG4gICAgdGhpcy5vayA9IHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICdzdGF0dXNUZXh0JyBpbiBvcHRpb25zID8gb3B0aW9ucy5zdGF0dXNUZXh0IDogJ09LJ1xuICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsIHx8ICcnXG4gICAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG4gIH1cblxuICBCb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKVxuXG4gIFJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgdXJsOiB0aGlzLnVybFxuICAgIH0pXG4gIH1cblxuICBSZXNwb25zZS5lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAwLCBzdGF0dXNUZXh0OiAnJ30pXG4gICAgcmVzcG9uc2UudHlwZSA9ICdlcnJvcidcbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfVxuXG4gIHZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuXG4gIFJlc3BvbnNlLnJlZGlyZWN0ID0gZnVuY3Rpb24odXJsLCBzdGF0dXMpIHtcbiAgICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBzdGF0dXMgY29kZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG4gIH1cblxuICBzZWxmLkhlYWRlcnMgPSBIZWFkZXJzXG4gIHNlbGYuUmVxdWVzdCA9IFJlcXVlc3RcbiAgc2VsZi5SZXNwb25zZSA9IFJlc3BvbnNlXG5cbiAgc2VsZi5mZXRjaCA9IGZ1bmN0aW9uKGlucHV0LCBpbml0KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcbiAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgICBoZWFkZXJzOiBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIHx8ICcnKVxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJylcbiAgICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpXG4gICAgICB9XG5cbiAgICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH1cblxuICAgICAgeGhyLm9wZW4ocmVxdWVzdC5tZXRob2QsIHJlcXVlc3QudXJsLCB0cnVlKVxuXG4gICAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIgJiYgc3VwcG9ydC5ibG9iKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgICAgIH1cblxuICAgICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpXG4gICAgICB9KVxuXG4gICAgICB4aHIuc2VuZCh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHJlcXVlc3QuX2JvZHlJbml0KVxuICAgIH0pXG4gIH1cbiAgc2VsZi5mZXRjaC5wb2x5ZmlsbCA9IHRydWVcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzKTtcblxufSx7fV0sMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuL2NvcmUvY29yZScpO1xuX2RlcmVxXygnLi9jb2xvci9wNS5Db2xvcicpO1xuX2RlcmVxXygnLi9jb3JlL3A1LkVsZW1lbnQnKTtcbl9kZXJlcV8oJy4vdHlwb2dyYXBoeS9wNS5Gb250Jyk7XG5fZGVyZXFfKCcuL2NvcmUvcDUuR3JhcGhpY3MnKTtcbl9kZXJlcV8oJy4vY29yZS9wNS5SZW5kZXJlcjJEJyk7XG5cbl9kZXJlcV8oJy4vaW1hZ2UvcDUuSW1hZ2UnKTtcbl9kZXJlcV8oJy4vbWF0aC9wNS5WZWN0b3InKTtcbl9kZXJlcV8oJy4vaW8vcDUuVGFibGVSb3cnKTtcbl9kZXJlcV8oJy4vaW8vcDUuVGFibGUnKTtcbl9kZXJlcV8oJy4vaW8vcDUuWE1MJyk7XG5cbl9kZXJlcV8oJy4vY29sb3IvY3JlYXRpbmdfcmVhZGluZycpO1xuX2RlcmVxXygnLi9jb2xvci9zZXR0aW5nJyk7XG5fZGVyZXFfKCcuL2NvcmUvY29uc3RhbnRzJyk7XG5fZGVyZXFfKCcuL3V0aWxpdGllcy9jb252ZXJzaW9uJyk7XG5fZGVyZXFfKCcuL3V0aWxpdGllcy9hcnJheV9mdW5jdGlvbnMnKTtcbl9kZXJlcV8oJy4vdXRpbGl0aWVzL3N0cmluZ19mdW5jdGlvbnMnKTtcbl9kZXJlcV8oJy4vY29yZS9lbnZpcm9ubWVudCcpO1xuX2RlcmVxXygnLi9pbWFnZS9pbWFnZScpO1xuX2RlcmVxXygnLi9pbWFnZS9sb2FkaW5nX2Rpc3BsYXlpbmcnKTtcbl9kZXJlcV8oJy4vaW1hZ2UvcGl4ZWxzJyk7XG5fZGVyZXFfKCcuL2lvL2ZpbGVzJyk7XG5fZGVyZXFfKCcuL2V2ZW50cy9rZXlib2FyZCcpO1xuX2RlcmVxXygnLi9ldmVudHMvYWNjZWxlcmF0aW9uJyk7IC8vam9oblxuX2RlcmVxXygnLi9ldmVudHMvbW91c2UnKTtcbl9kZXJlcV8oJy4vdXRpbGl0aWVzL3RpbWVfZGF0ZScpO1xuX2RlcmVxXygnLi9ldmVudHMvdG91Y2gnKTtcbl9kZXJlcV8oJy4vbWF0aC9tYXRoJyk7XG5fZGVyZXFfKCcuL21hdGgvY2FsY3VsYXRpb24nKTtcbl9kZXJlcV8oJy4vbWF0aC9yYW5kb20nKTtcbl9kZXJlcV8oJy4vbWF0aC9ub2lzZScpO1xuX2RlcmVxXygnLi9tYXRoL3RyaWdvbm9tZXRyeScpO1xuX2RlcmVxXygnLi9jb3JlL3JlbmRlcmluZycpO1xuX2RlcmVxXygnLi9jb3JlLzJkX3ByaW1pdGl2ZXMnKTtcblxuX2RlcmVxXygnLi9jb3JlL2F0dHJpYnV0ZXMnKTtcbl9kZXJlcV8oJy4vY29yZS9jdXJ2ZXMnKTtcbl9kZXJlcV8oJy4vY29yZS92ZXJ0ZXgnKTtcbl9kZXJlcV8oJy4vY29yZS9zdHJ1Y3R1cmUnKTtcbl9kZXJlcV8oJy4vY29yZS90cmFuc2Zvcm0nKTtcbl9kZXJlcV8oJy4vdHlwb2dyYXBoeS9hdHRyaWJ1dGVzJyk7XG5fZGVyZXFfKCcuL3R5cG9ncmFwaHkvbG9hZGluZ19kaXNwbGF5aW5nJyk7XG5cbl9kZXJlcV8oJy4vZGF0YS9wNS5UeXBlZERpY3QnKTtcblxuX2RlcmVxXygnLi93ZWJnbC9wNS5SZW5kZXJlckdMJyk7XG5fZGVyZXFfKCcuL3dlYmdsL3A1Lkdlb21ldHJ5Jyk7XG5fZGVyZXFfKCcuL3dlYmdsL3A1LlJlbmRlcmVyR0wuUmV0YWluZWQnKTtcbl9kZXJlcV8oJy4vd2ViZ2wvcDUuUmVuZGVyZXJHTC5JbW1lZGlhdGUnKTtcbl9kZXJlcV8oJy4vd2ViZ2wvcHJpbWl0aXZlcycpO1xuX2RlcmVxXygnLi93ZWJnbC9sb2FkaW5nJyk7XG5fZGVyZXFfKCcuL3dlYmdsL3A1Lk1hdHJpeCcpO1xuX2RlcmVxXygnLi93ZWJnbC9tYXRlcmlhbCcpO1xuX2RlcmVxXygnLi93ZWJnbC9saWdodCcpO1xuX2RlcmVxXygnLi93ZWJnbC9wNS5TaGFkZXInKTtcbl9kZXJlcV8oJy4vd2ViZ2wvY2FtZXJhJyk7XG5fZGVyZXFfKCcuL3dlYmdsL2ludGVyYWN0aW9uJyk7XG5cbl9kZXJlcV8oJy4vY29yZS9pbml0LmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi9jb2xvci9jcmVhdGluZ19yZWFkaW5nXCI6MTUsXCIuL2NvbG9yL3A1LkNvbG9yXCI6MTYsXCIuL2NvbG9yL3NldHRpbmdcIjoxNyxcIi4vY29yZS8yZF9wcmltaXRpdmVzXCI6MTgsXCIuL2NvcmUvYXR0cmlidXRlc1wiOjE5LFwiLi9jb3JlL2NvbnN0YW50c1wiOjIxLFwiLi9jb3JlL2NvcmVcIjoyMixcIi4vY29yZS9jdXJ2ZXNcIjoyMyxcIi4vY29yZS9lbnZpcm9ubWVudFwiOjI0LFwiLi9jb3JlL2luaXQuanNcIjoyNixcIi4vY29yZS9wNS5FbGVtZW50XCI6MjcsXCIuL2NvcmUvcDUuR3JhcGhpY3NcIjoyOCxcIi4vY29yZS9wNS5SZW5kZXJlcjJEXCI6MzAsXCIuL2NvcmUvcmVuZGVyaW5nXCI6MzEsXCIuL2NvcmUvc3RydWN0dXJlXCI6MzMsXCIuL2NvcmUvdHJhbnNmb3JtXCI6MzQsXCIuL2NvcmUvdmVydGV4XCI6MzUsXCIuL2RhdGEvcDUuVHlwZWREaWN0XCI6MzYsXCIuL2V2ZW50cy9hY2NlbGVyYXRpb25cIjozNyxcIi4vZXZlbnRzL2tleWJvYXJkXCI6MzgsXCIuL2V2ZW50cy9tb3VzZVwiOjM5LFwiLi9ldmVudHMvdG91Y2hcIjo0MCxcIi4vaW1hZ2UvaW1hZ2VcIjo0MixcIi4vaW1hZ2UvbG9hZGluZ19kaXNwbGF5aW5nXCI6NDMsXCIuL2ltYWdlL3A1LkltYWdlXCI6NDQsXCIuL2ltYWdlL3BpeGVsc1wiOjQ1LFwiLi9pby9maWxlc1wiOjQ2LFwiLi9pby9wNS5UYWJsZVwiOjQ3LFwiLi9pby9wNS5UYWJsZVJvd1wiOjQ4LFwiLi9pby9wNS5YTUxcIjo0OSxcIi4vbWF0aC9jYWxjdWxhdGlvblwiOjUwLFwiLi9tYXRoL21hdGhcIjo1MSxcIi4vbWF0aC9ub2lzZVwiOjUyLFwiLi9tYXRoL3A1LlZlY3RvclwiOjUzLFwiLi9tYXRoL3JhbmRvbVwiOjU0LFwiLi9tYXRoL3RyaWdvbm9tZXRyeVwiOjU1LFwiLi90eXBvZ3JhcGh5L2F0dHJpYnV0ZXNcIjo1NixcIi4vdHlwb2dyYXBoeS9sb2FkaW5nX2Rpc3BsYXlpbmdcIjo1NyxcIi4vdHlwb2dyYXBoeS9wNS5Gb250XCI6NTgsXCIuL3V0aWxpdGllcy9hcnJheV9mdW5jdGlvbnNcIjo1OSxcIi4vdXRpbGl0aWVzL2NvbnZlcnNpb25cIjo2MCxcIi4vdXRpbGl0aWVzL3N0cmluZ19mdW5jdGlvbnNcIjo2MSxcIi4vdXRpbGl0aWVzL3RpbWVfZGF0ZVwiOjYyLFwiLi93ZWJnbC9jYW1lcmFcIjo2MyxcIi4vd2ViZ2wvaW50ZXJhY3Rpb25cIjo2NCxcIi4vd2ViZ2wvbGlnaHRcIjo2NSxcIi4vd2ViZ2wvbG9hZGluZ1wiOjY2LFwiLi93ZWJnbC9tYXRlcmlhbFwiOjY3LFwiLi93ZWJnbC9wNS5HZW9tZXRyeVwiOjY4LFwiLi93ZWJnbC9wNS5NYXRyaXhcIjo2OSxcIi4vd2ViZ2wvcDUuUmVuZGVyZXJHTFwiOjcyLFwiLi93ZWJnbC9wNS5SZW5kZXJlckdMLkltbWVkaWF0ZVwiOjcwLFwiLi93ZWJnbC9wNS5SZW5kZXJlckdMLlJldGFpbmVkXCI6NzEsXCIuL3dlYmdsL3A1LlNoYWRlclwiOjczLFwiLi93ZWJnbC9wcmltaXRpdmVzXCI6NzV9XSwxNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgQ29udmVyc2lvblxuICogQHN1Ym1vZHVsZSBDb2xvciBDb252ZXJzaW9uXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb252ZXJzaW9ucyBhZGFwdGVkIGZyb20gPGh0dHA6Ly93d3cuZWFzeXJnYi5jb20vZW4vbWF0aC5waHA+LlxuICpcbiAqIEluIHRoZXNlIGZ1bmN0aW9ucywgaHVlIGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2UgWzAsMSk7IGFsbCBvdGhlciBjb21wb25lbnRzXG4gKiBhcmUgaW4gdGhlIHJhbmdlIFswLDFdLiAnQnJpZ2h0bmVzcycgYW5kICd2YWx1ZScgYXJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5LlxuICovXG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xucDUuQ29sb3JDb252ZXJzaW9uID0ge307XG5cbi8qKlxuICogQ29udmVydCBhbiBIU0JBIGFycmF5IHRvIEhTTEEuXG4gKi9cbnA1LkNvbG9yQ29udmVyc2lvbi5faHNiYVRvSFNMQSA9IGZ1bmN0aW9uKGhzYmEpIHtcbiAgdmFyIGh1ZSA9IGhzYmFbMF07XG4gIHZhciBzYXQgPSBoc2JhWzFdO1xuICB2YXIgdmFsID0gaHNiYVsyXTtcblxuICAvLyBDYWxjdWxhdGUgbGlnaHRuZXNzLlxuICB2YXIgbGkgPSAoMiAtIHNhdCkgKiB2YWwgLyAyO1xuXG4gIC8vIENvbnZlcnQgc2F0dXJhdGlvbi5cbiAgaWYgKGxpICE9PSAwKSB7XG4gICAgaWYgKGxpID09PSAxKSB7XG4gICAgICBzYXQgPSAwO1xuICAgIH0gZWxzZSBpZiAobGkgPCAwLjUpIHtcbiAgICAgIHNhdCA9IHNhdCAvICgyIC0gc2F0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2F0ID0gc2F0ICogdmFsIC8gKDIgLSBsaSAqIDIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEh1ZSBhbmQgYWxwaGEgc3RheSB0aGUgc2FtZS5cbiAgcmV0dXJuIFtodWUsIHNhdCwgbGksIGhzYmFbM11dO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIEhTQkEgYXJyYXkgdG8gUkdCQS5cbiAqL1xucDUuQ29sb3JDb252ZXJzaW9uLl9oc2JhVG9SR0JBID0gZnVuY3Rpb24oaHNiYSkge1xuICB2YXIgaHVlID0gaHNiYVswXSAqIDY7IC8vIFdlIHdpbGwgc3BsaXQgaHVlIGludG8gNiBzZWN0b3JzLlxuICB2YXIgc2F0ID0gaHNiYVsxXTtcbiAgdmFyIHZhbCA9IGhzYmFbMl07XG5cbiAgdmFyIFJHQkEgPSBbXTtcblxuICBpZiAoc2F0ID09PSAwKSB7XG4gICAgUkdCQSA9IFt2YWwsIHZhbCwgdmFsLCBoc2JhWzNdXTsgLy8gUmV0dXJuIGVhcmx5IGlmIGdyYXlzY2FsZS5cbiAgfSBlbHNlIHtcbiAgICB2YXIgc2VjdG9yID0gTWF0aC5mbG9vcihodWUpO1xuICAgIHZhciB0aW50MSA9IHZhbCAqICgxIC0gc2F0KTtcbiAgICB2YXIgdGludDIgPSB2YWwgKiAoMSAtIHNhdCAqIChodWUgLSBzZWN0b3IpKTtcbiAgICB2YXIgdGludDMgPSB2YWwgKiAoMSAtIHNhdCAqICgxICsgc2VjdG9yIC0gaHVlKSk7XG4gICAgdmFyIHJlZCwgZ3JlZW4sIGJsdWU7XG4gICAgaWYgKHNlY3RvciA9PT0gMSkge1xuICAgICAgLy8gWWVsbG93IHRvIGdyZWVuLlxuICAgICAgcmVkID0gdGludDI7XG4gICAgICBncmVlbiA9IHZhbDtcbiAgICAgIGJsdWUgPSB0aW50MTtcbiAgICB9IGVsc2UgaWYgKHNlY3RvciA9PT0gMikge1xuICAgICAgLy8gR3JlZW4gdG8gY3lhbi5cbiAgICAgIHJlZCA9IHRpbnQxO1xuICAgICAgZ3JlZW4gPSB2YWw7XG4gICAgICBibHVlID0gdGludDM7XG4gICAgfSBlbHNlIGlmIChzZWN0b3IgPT09IDMpIHtcbiAgICAgIC8vIEN5YW4gdG8gYmx1ZS5cbiAgICAgIHJlZCA9IHRpbnQxO1xuICAgICAgZ3JlZW4gPSB0aW50MjtcbiAgICAgIGJsdWUgPSB2YWw7XG4gICAgfSBlbHNlIGlmIChzZWN0b3IgPT09IDQpIHtcbiAgICAgIC8vIEJsdWUgdG8gbWFnZW50YS5cbiAgICAgIHJlZCA9IHRpbnQzO1xuICAgICAgZ3JlZW4gPSB0aW50MTtcbiAgICAgIGJsdWUgPSB2YWw7XG4gICAgfSBlbHNlIGlmIChzZWN0b3IgPT09IDUpIHtcbiAgICAgIC8vIE1hZ2VudGEgdG8gcmVkLlxuICAgICAgcmVkID0gdmFsO1xuICAgICAgZ3JlZW4gPSB0aW50MTtcbiAgICAgIGJsdWUgPSB0aW50MjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVkIHRvIHllbGxvdyAoc2VjdG9yIGNvdWxkIGJlIDAgb3IgNikuXG4gICAgICByZWQgPSB2YWw7XG4gICAgICBncmVlbiA9IHRpbnQzO1xuICAgICAgYmx1ZSA9IHRpbnQxO1xuICAgIH1cbiAgICBSR0JBID0gW3JlZCwgZ3JlZW4sIGJsdWUsIGhzYmFbM11dO1xuICB9XG5cbiAgcmV0dXJuIFJHQkE7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgYW4gSFNMQSBhcnJheSB0byBIU0JBLlxuICovXG5wNS5Db2xvckNvbnZlcnNpb24uX2hzbGFUb0hTQkEgPSBmdW5jdGlvbihoc2xhKSB7XG4gIHZhciBodWUgPSBoc2xhWzBdO1xuICB2YXIgc2F0ID0gaHNsYVsxXTtcbiAgdmFyIGxpID0gaHNsYVsyXTtcblxuICAvLyBDYWxjdWxhdGUgYnJpZ2h0bmVzcy5cbiAgdmFyIHZhbDtcbiAgaWYgKGxpIDwgMC41KSB7XG4gICAgdmFsID0gKDEgKyBzYXQpICogbGk7XG4gIH0gZWxzZSB7XG4gICAgdmFsID0gbGkgKyBzYXQgLSBsaSAqIHNhdDtcbiAgfVxuXG4gIC8vIENvbnZlcnQgc2F0dXJhdGlvbi5cbiAgc2F0ID0gMiAqICh2YWwgLSBsaSkgLyB2YWw7XG5cbiAgLy8gSHVlIGFuZCBhbHBoYSBzdGF5IHRoZSBzYW1lLlxuICByZXR1cm4gW2h1ZSwgc2F0LCB2YWwsIGhzbGFbM11dO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIEhTTEEgYXJyYXkgdG8gUkdCQS5cbiAqXG4gKiBXZSBuZWVkIHRvIGNoYW5nZSBiYXNpcyBmcm9tIEhTTEEgdG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIG1vcmUgZWFzaWx5IGJlXG4gKiBwcm9qZWN0ZWQgb250byBSR0JBLiBXZSB3aWxsIGNob29zZSBodWUgYW5kIGJyaWdodG5lc3MgYXMgb3VyIGZpcnN0IHR3b1xuICogY29tcG9uZW50cywgYW5kIHBpY2sgYSBjb252ZW5pZW50IHRoaXJkIG9uZSAoJ3plc3QnKSBzbyB0aGF0IHdlIGRvbid0IG5lZWRcbiAqIHRvIGNhbGN1bGF0ZSBmb3JtYWwgSFNCQSBzYXR1cmF0aW9uLlxuICovXG5wNS5Db2xvckNvbnZlcnNpb24uX2hzbGFUb1JHQkEgPSBmdW5jdGlvbihoc2xhKSB7XG4gIHZhciBodWUgPSBoc2xhWzBdICogNjsgLy8gV2Ugd2lsbCBzcGxpdCBodWUgaW50byA2IHNlY3RvcnMuXG4gIHZhciBzYXQgPSBoc2xhWzFdO1xuICB2YXIgbGkgPSBoc2xhWzJdO1xuXG4gIHZhciBSR0JBID0gW107XG5cbiAgaWYgKHNhdCA9PT0gMCkge1xuICAgIFJHQkEgPSBbbGksIGxpLCBsaSwgaHNsYVszXV07IC8vIFJldHVybiBlYXJseSBpZiBncmF5c2NhbGUuXG4gIH0gZWxzZSB7XG4gICAgLy8gQ2FsY3VsYXRlIGJyaWdodG5lc3MuXG4gICAgdmFyIHZhbDtcbiAgICBpZiAobGkgPCAwLjUpIHtcbiAgICAgIHZhbCA9ICgxICsgc2F0KSAqIGxpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWwgPSBsaSArIHNhdCAtIGxpICogc2F0O1xuICAgIH1cblxuICAgIC8vIERlZmluZSB6ZXN0LlxuICAgIHZhciB6ZXN0ID0gMiAqIGxpIC0gdmFsO1xuXG4gICAgLy8gSW1wbGVtZW50IHByb2plY3Rpb24gKHByb2plY3Qgb250byBncmVlbiBieSBkZWZhdWx0KS5cbiAgICB2YXIgaHp2VG9SR0IgPSBmdW5jdGlvbihodWUsIHplc3QsIHZhbCkge1xuICAgICAgaWYgKGh1ZSA8IDApIHtcbiAgICAgICAgLy8gSHVlIG11c3Qgd3JhcCB0byBhbGxvdyBwcm9qZWN0aW9uIG9udG8gcmVkIGFuZCBibHVlLlxuICAgICAgICBodWUgKz0gNjtcbiAgICAgIH0gZWxzZSBpZiAoaHVlID49IDYpIHtcbiAgICAgICAgaHVlIC09IDY7XG4gICAgICB9XG4gICAgICBpZiAoaHVlIDwgMSkge1xuICAgICAgICAvLyBSZWQgdG8geWVsbG93IChpbmNyZWFzaW5nIGdyZWVuKS5cbiAgICAgICAgcmV0dXJuIHplc3QgKyAodmFsIC0gemVzdCkgKiBodWU7XG4gICAgICB9IGVsc2UgaWYgKGh1ZSA8IDMpIHtcbiAgICAgICAgLy8gWWVsbG93IHRvIGN5YW4gKGdyZWF0ZXN0IGdyZWVuKS5cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH0gZWxzZSBpZiAoaHVlIDwgNCkge1xuICAgICAgICAvLyBDeWFuIHRvIGJsdWUgKGRlY3JlYXNpbmcgZ3JlZW4pLlxuICAgICAgICByZXR1cm4gemVzdCArICh2YWwgLSB6ZXN0KSAqICg0IC0gaHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJsdWUgdG8gcmVkIChsZWFzdCBncmVlbikuXG4gICAgICAgIHJldHVybiB6ZXN0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBQZXJmb3JtIHByb2plY3Rpb25zLCBvZmZzZXR0aW5nIGh1ZSBhcyBuZWNlc3NhcnkuXG4gICAgUkdCQSA9IFtcbiAgICAgIGh6dlRvUkdCKGh1ZSArIDIsIHplc3QsIHZhbCksXG4gICAgICBoenZUb1JHQihodWUsIHplc3QsIHZhbCksXG4gICAgICBoenZUb1JHQihodWUgLSAyLCB6ZXN0LCB2YWwpLFxuICAgICAgaHNsYVszXVxuICAgIF07XG4gIH1cblxuICByZXR1cm4gUkdCQTtcbn07XG5cbi8qKlxuICogQ29udmVydCBhbiBSR0JBIGFycmF5IHRvIEhTQkEuXG4gKi9cbnA1LkNvbG9yQ29udmVyc2lvbi5fcmdiYVRvSFNCQSA9IGZ1bmN0aW9uKHJnYmEpIHtcbiAgdmFyIHJlZCA9IHJnYmFbMF07XG4gIHZhciBncmVlbiA9IHJnYmFbMV07XG4gIHZhciBibHVlID0gcmdiYVsyXTtcblxuICB2YXIgdmFsID0gTWF0aC5tYXgocmVkLCBncmVlbiwgYmx1ZSk7XG4gIHZhciBjaHJvbWEgPSB2YWwgLSBNYXRoLm1pbihyZWQsIGdyZWVuLCBibHVlKTtcblxuICB2YXIgaHVlLCBzYXQ7XG4gIGlmIChjaHJvbWEgPT09IDApIHtcbiAgICAvLyBSZXR1cm4gZWFybHkgaWYgZ3JheXNjYWxlLlxuICAgIGh1ZSA9IDA7XG4gICAgc2F0ID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzYXQgPSBjaHJvbWEgLyB2YWw7XG4gICAgaWYgKHJlZCA9PT0gdmFsKSB7XG4gICAgICAvLyBNYWdlbnRhIHRvIHllbGxvdy5cbiAgICAgIGh1ZSA9IChncmVlbiAtIGJsdWUpIC8gY2hyb21hO1xuICAgIH0gZWxzZSBpZiAoZ3JlZW4gPT09IHZhbCkge1xuICAgICAgLy8gWWVsbG93IHRvIGN5YW4uXG4gICAgICBodWUgPSAyICsgKGJsdWUgLSByZWQpIC8gY2hyb21hO1xuICAgIH0gZWxzZSBpZiAoYmx1ZSA9PT0gdmFsKSB7XG4gICAgICAvLyBDeWFuIHRvIG1hZ2VudGEuXG4gICAgICBodWUgPSA0ICsgKHJlZCAtIGdyZWVuKSAvIGNocm9tYTtcbiAgICB9XG4gICAgaWYgKGh1ZSA8IDApIHtcbiAgICAgIC8vIENvbmZpbmUgaHVlIHRvIHRoZSBpbnRlcnZhbCBbMCwgMSkuXG4gICAgICBodWUgKz0gNjtcbiAgICB9IGVsc2UgaWYgKGh1ZSA+PSA2KSB7XG4gICAgICBodWUgLT0gNjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2h1ZSAvIDYsIHNhdCwgdmFsLCByZ2JhWzNdXTtcbn07XG5cbi8qKlxuICogQ29udmVydCBhbiBSR0JBIGFycmF5IHRvIEhTTEEuXG4gKi9cbnA1LkNvbG9yQ29udmVyc2lvbi5fcmdiYVRvSFNMQSA9IGZ1bmN0aW9uKHJnYmEpIHtcbiAgdmFyIHJlZCA9IHJnYmFbMF07XG4gIHZhciBncmVlbiA9IHJnYmFbMV07XG4gIHZhciBibHVlID0gcmdiYVsyXTtcblxuICB2YXIgdmFsID0gTWF0aC5tYXgocmVkLCBncmVlbiwgYmx1ZSk7XG4gIHZhciBtaW4gPSBNYXRoLm1pbihyZWQsIGdyZWVuLCBibHVlKTtcbiAgdmFyIGxpID0gdmFsICsgbWluOyAvLyBXZSB3aWxsIGhhbHZlIHRoaXMgbGF0ZXIuXG4gIHZhciBjaHJvbWEgPSB2YWwgLSBtaW47XG5cbiAgdmFyIGh1ZSwgc2F0O1xuICBpZiAoY2hyb21hID09PSAwKSB7XG4gICAgLy8gUmV0dXJuIGVhcmx5IGlmIGdyYXlzY2FsZS5cbiAgICBodWUgPSAwO1xuICAgIHNhdCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGxpIDwgMSkge1xuICAgICAgc2F0ID0gY2hyb21hIC8gbGk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNhdCA9IGNocm9tYSAvICgyIC0gbGkpO1xuICAgIH1cbiAgICBpZiAocmVkID09PSB2YWwpIHtcbiAgICAgIC8vIE1hZ2VudGEgdG8geWVsbG93LlxuICAgICAgaHVlID0gKGdyZWVuIC0gYmx1ZSkgLyBjaHJvbWE7XG4gICAgfSBlbHNlIGlmIChncmVlbiA9PT0gdmFsKSB7XG4gICAgICAvLyBZZWxsb3cgdG8gY3lhbi5cbiAgICAgIGh1ZSA9IDIgKyAoYmx1ZSAtIHJlZCkgLyBjaHJvbWE7XG4gICAgfSBlbHNlIGlmIChibHVlID09PSB2YWwpIHtcbiAgICAgIC8vIEN5YW4gdG8gbWFnZW50YS5cbiAgICAgIGh1ZSA9IDQgKyAocmVkIC0gZ3JlZW4pIC8gY2hyb21hO1xuICAgIH1cbiAgICBpZiAoaHVlIDwgMCkge1xuICAgICAgLy8gQ29uZmluZSBodWUgdG8gdGhlIGludGVydmFsIFswLCAxKS5cbiAgICAgIGh1ZSArPSA2O1xuICAgIH0gZWxzZSBpZiAoaHVlID49IDYpIHtcbiAgICAgIGh1ZSAtPSA2O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbaHVlIC8gNiwgc2F0LCBsaSAvIDIsIHJnYmFbM11dO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNS5Db2xvckNvbnZlcnNpb247XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSwxNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgQ29sb3JcbiAqIEBzdWJtb2R1bGUgQ3JlYXRpbmcgJiBSZWFkaW5nXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICogQHJlcXVpcmVzIGNvbnN0YW50c1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG52YXIgY29uc3RhbnRzID0gX2RlcmVxXygnLi4vY29yZS9jb25zdGFudHMnKTtcbl9kZXJlcV8oJy4vcDUuQ29sb3InKTtcbl9kZXJlcV8oJy4uL2NvcmUvZXJyb3JfaGVscGVycycpO1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBhbHBoYSB2YWx1ZSBmcm9tIGEgY29sb3Igb3IgcGl4ZWwgYXJyYXkuXG4gKlxuICogQG1ldGhvZCBhbHBoYVxuICogQHBhcmFtIHtwNS5Db2xvcnxOdW1iZXJbXXxTdHJpbmd9IGNvbG9yIHA1LkNvbG9yIG9iamVjdCwgY29sb3IgY29tcG9uZW50cyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBDU1MgY29sb3JcbiAqIEByZXR1cm4ge051bWJlcn0gdGhlIGFscGhhIHZhbHVlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogbm9TdHJva2UoKTtcbiAqIHZhciBjID0gY29sb3IoMCwgMTI2LCAyNTUsIDEwMik7XG4gKiBmaWxsKGMpO1xuICogcmVjdCgxNSwgMTUsIDM1LCA3MCk7XG4gKiB2YXIgdmFsdWUgPSBhbHBoYShjKTsgLy8gU2V0cyAndmFsdWUnIHRvIDEwMlxuICogZmlsbCh2YWx1ZSk7XG4gKiByZWN0KDUwLCAxNSwgMzUsIDcwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIExlZnQgaGFsZiBvZiBjYW52YXMgbGlnaHQgYmx1ZSBhbmQgcmlnaHQgaGFsZiBsaWdodCBjaGFyY29hbCBncmV5LlxuICogTGVmdCBoYWxmIG9mIGNhbnZhcyBsaWdodCBwdXJwbGUgYW5kIHJpZ2h0IGhhbGYgYSByb3lhbCBibHVlLlxuICogTGVmdCBoYWxmIG9mIGNhbnZhcyBzYWxtb24gcGluayBhbmQgdGhlIHJpZ2h0IGhhbGYgd2hpdGUuXG4gKiBZZWxsb3cgcmVjdCBpbiBtaWRkbGUgcmlnaHQgb2YgY2FudmFzLCB3aXRoIDU1IHBpeGVsIHdpZHRoIGFuZCBoZWlnaHQuXG4gKiBZZWxsb3cgZWxsaXBzZSBpbiB0b3AgbGVmdCBjYW52YXMsIGJsYWNrIGVsbGlwc2UgaW4gYm90dG9tIHJpZ2h0LGJvdGggODB4ODAuXG4gKiBCcmlnaHQgZnVzY2hpYSByZWN0IGluIG1pZGRsZSBvZiBjYW52YXMsIDYwIHBpeGVsIHdpZHRoIGFuZCBoZWlnaHQuXG4gKiBUd28gYnJpZ2h0IGdyZWVuIHJlY3RzIG9uIG9wcG9zaXRlIHNpZGVzIG9mIHRoZSBjYW52YXMsIGJvdGggNDV4ODAuXG4gKiBGb3VyIGJsdWUgcmVjdHMgaW4gZWFjaCBjb3JuZXIgb2YgdGhlIGNhbnZhcywgZWFjaCBhcmUgMzV4MzUuXG4gKiBCcmlnaHQgc2VhIGdyZWVuIHJlY3Qgb24gbGVmdCBhbmQgZGFya2VyIHJlY3Qgb24gcmlnaHQgb2YgY2FudmFzLCBib3RoIDQ1eDgwLlxuICogRGFyayBncmVlbiByZWN0IG9uIGxlZnQgYW5kIGxpZ2h0IGdyZWVuIHJlY3Qgb24gcmlnaHQgb2YgY2FudmFzLCBib3RoIDQ1eDgwLlxuICogRGFyayBibHVlIHJlY3Qgb24gbGVmdCBhbmQgbGlnaHQgdGVhbCByZWN0IG9uIHJpZ2h0IG9mIGNhbnZhcywgYm90aCA0NXg4MC5cbiAqIGJsdWUgcmVjdCBvbiBsZWZ0IGFuZCBncmVlbiBvbiByaWdodCwgYm90aCB3aXRoIGJsYWNrIG91dGxpbmVzICYgMzV4NjAuXG4gKiBzYWxtb24gcGluayByZWN0IG9uIGxlZnQgYW5kIGJsYWNrIG9uIHJpZ2h0LCBib3RoIDM1eDYwLlxuICogNCByZWN0cywgdGFuLCBicm93biwgYnJvd25pc2ggcHVycGxlIGFuZCBwdXJwbGUsIHdpdGggd2hpdGUgb3V0bGluZXMgJiAyMHg2MC5cbiAqIGxpZ2h0IHBhc3RlbCBncmVlbiByZWN0IG9uIGxlZnQgYW5kIGRhcmsgZ3JleSByZWN0IG9uIHJpZ2h0LCBib3RoIDM1eDYwLlxuICogeWVsbG93IHJlY3Qgb24gbGVmdCBhbmQgcmVkIHJlY3Qgb24gcmlnaHQsIGJvdGggd2l0aCBibGFjayBvdXRsaW5lcyAmIDM1eDYwLlxuICogZ3JleSBjYW52YXNcbiAqIGRlZXAgcGluayByZWN0IG9uIGxlZnQgYW5kIGdyZXkgcmVjdCBvbiByaWdodCwgYm90aCAzNXg2MC5cbiAqL1xucDUucHJvdG90eXBlLmFscGhhID0gZnVuY3Rpb24oYykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdhbHBoYScsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzLmNvbG9yKGMpLl9nZXRBbHBoYSgpO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYmx1ZSB2YWx1ZSBmcm9tIGEgY29sb3Igb3IgcGl4ZWwgYXJyYXkuXG4gKlxuICogQG1ldGhvZCBibHVlXG4gKiBAcGFyYW0ge3A1LkNvbG9yfE51bWJlcltdfFN0cmluZ30gY29sb3IgcDUuQ29sb3Igb2JqZWN0LCBjb2xvciBjb21wb25lbnRzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENTUyBjb2xvclxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgYmx1ZSB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBjID0gY29sb3IoMTc1LCAxMDAsIDIyMCk7IC8vIERlZmluZSBjb2xvciAnYydcbiAqIGZpbGwoYyk7IC8vIFVzZSBjb2xvciB2YXJpYWJsZSAnYycgYXMgZmlsbCBjb2xvclxuICogcmVjdCgxNSwgMjAsIDM1LCA2MCk7IC8vIERyYXcgbGVmdCByZWN0YW5nbGVcbiAqXG4gKiB2YXIgYmx1ZVZhbHVlID0gYmx1ZShjKTsgLy8gR2V0IGJsdWUgaW4gJ2MnXG4gKiBwcmludChibHVlVmFsdWUpOyAvLyBQcmludHMgXCIyMjAuMFwiXG4gKiBmaWxsKDAsIDAsIGJsdWVWYWx1ZSk7IC8vIFVzZSAnYmx1ZVZhbHVlJyBpbiBuZXcgZmlsbFxuICogcmVjdCg1MCwgMjAsIDM1LCA2MCk7IC8vIERyYXcgcmlnaHQgcmVjdGFuZ2xlXG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBMZWZ0IGhhbGYgb2YgY2FudmFzIGxpZ2h0IHB1cnBsZSBhbmQgcmlnaHQgaGFsZiBhIHJveWFsIGJsdWUuXG4gKlxuICovXG5wNS5wcm90b3R5cGUuYmx1ZSA9IGZ1bmN0aW9uKGMpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnYmx1ZScsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzLmNvbG9yKGMpLl9nZXRCbHVlKCk7XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBIU0IgYnJpZ2h0bmVzcyB2YWx1ZSBmcm9tIGEgY29sb3Igb3IgcGl4ZWwgYXJyYXkuXG4gKlxuICogQG1ldGhvZCBicmlnaHRuZXNzXG4gKiBAcGFyYW0ge3A1LkNvbG9yfE51bWJlcltdfFN0cmluZ30gY29sb3IgcDUuQ29sb3Igb2JqZWN0LCBjb2xvciBjb21wb25lbnRzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENTUyBjb2xvclxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgYnJpZ2h0bmVzcyB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIG5vU3Ryb2tlKCk7XG4gKiBjb2xvck1vZGUoSFNCLCAyNTUpO1xuICogdmFyIGMgPSBjb2xvcigwLCAxMjYsIDI1NSk7XG4gKiBmaWxsKGMpO1xuICogcmVjdCgxNSwgMjAsIDM1LCA2MCk7XG4gKiB2YXIgdmFsdWUgPSBicmlnaHRuZXNzKGMpOyAvLyBTZXRzICd2YWx1ZScgdG8gMjU1XG4gKiBmaWxsKHZhbHVlKTtcbiAqIHJlY3QoNTAsIDIwLCAzNSwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogTGVmdCBoYWxmIG9mIGNhbnZhcyBzYWxtb24gcGluayBhbmQgdGhlIHJpZ2h0IGhhbGYgd2hpdGUuXG4gKlxuICovXG5wNS5wcm90b3R5cGUuYnJpZ2h0bmVzcyA9IGZ1bmN0aW9uKGMpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnYnJpZ2h0bmVzcycsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzLmNvbG9yKGMpLl9nZXRCcmlnaHRuZXNzKCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgY29sb3JzIGZvciBzdG9yaW5nIGluIHZhcmlhYmxlcyBvZiB0aGUgY29sb3IgZGF0YXR5cGUuIFRoZVxuICogcGFyYW1ldGVycyBhcmUgaW50ZXJwcmV0ZWQgYXMgUkdCIG9yIEhTQiB2YWx1ZXMgZGVwZW5kaW5nIG9uIHRoZVxuICogY3VycmVudCBjb2xvck1vZGUoKS4gVGhlIGRlZmF1bHQgbW9kZSBpcyBSR0IgdmFsdWVzIGZyb20gMCB0byAyNTVcbiAqIGFuZCwgdGhlcmVmb3JlLCB0aGUgZnVuY3Rpb24gY2FsbCBjb2xvcigyNTUsIDIwNCwgMCkgd2lsbCByZXR1cm4gYVxuICogYnJpZ2h0IHllbGxvdyBjb2xvci5cbiAqIDxicj48YnI+XG4gKiBOb3RlIHRoYXQgaWYgb25seSBvbmUgdmFsdWUgaXMgcHJvdmlkZWQgdG8gY29sb3IoKSwgaXQgd2lsbCBiZSBpbnRlcnByZXRlZFxuICogYXMgYSBncmF5c2NhbGUgdmFsdWUuIEFkZCBhIHNlY29uZCB2YWx1ZSwgYW5kIGl0IHdpbGwgYmUgdXNlZCBmb3IgYWxwaGFcbiAqIHRyYW5zcGFyZW5jeS4gV2hlbiB0aHJlZSB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhleSBhcmUgaW50ZXJwcmV0ZWQgYXNcbiAqIGVpdGhlciBSR0Igb3IgSFNCIHZhbHVlcy4gQWRkaW5nIGEgZm91cnRoIHZhbHVlIGFwcGxpZXMgYWxwaGFcbiAqIHRyYW5zcGFyZW5jeS5cbiAqIDxicj48YnI+XG4gKiBJZiBhIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQgaXMgcHJvdmlkZWQsIFJHQiwgUkdCQSBhbmQgSGV4IENTUyBjb2xvclxuICogc3RyaW5ncyBhbmQgYWxsIG5hbWVkIGNvbG9yIHN0cmluZ3MgYXJlIHN1cHBvcnRlZC4gSW4gdGhpcyBjYXNlLCBhbiBhbHBoYVxuICogbnVtYmVyIHZhbHVlIGFzIGEgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBSR0JBIGZvcm0gc2hvdWxkIGJlXG4gKiB1c2VkLlxuICpcbiAqIEBtZXRob2QgY29sb3JcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIGdyYXkgICAgbnVtYmVyIHNwZWNpZnlpbmcgdmFsdWUgYmV0d2VlbiB3aGl0ZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYmxhY2suXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICBbYWxwaGFdIGFscGhhIHZhbHVlIHJlbGF0aXZlIHRvIGN1cnJlbnQgY29sb3IgcmFuZ2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgaXMgMC0yNTUpXG4gKiBAcmV0dXJuIHtwNS5Db2xvcn0gICAgICAgICAgICAgIHJlc3VsdGluZyBjb2xvclxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYyA9IGNvbG9yKDI1NSwgMjA0LCAwKTsgLy8gRGVmaW5lIGNvbG9yICdjJ1xuICogZmlsbChjKTsgLy8gVXNlIGNvbG9yIHZhcmlhYmxlICdjJyBhcyBmaWxsIGNvbG9yXG4gKiBub1N0cm9rZSgpOyAvLyBEb24ndCBkcmF3IGEgc3Ryb2tlIGFyb3VuZCBzaGFwZXNcbiAqIHJlY3QoMzAsIDIwLCA1NSwgNTUpOyAvLyBEcmF3IHJlY3RhbmdsZVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGMgPSBjb2xvcigyNTUsIDIwNCwgMCk7IC8vIERlZmluZSBjb2xvciAnYydcbiAqIGZpbGwoYyk7IC8vIFVzZSBjb2xvciB2YXJpYWJsZSAnYycgYXMgZmlsbCBjb2xvclxuICogbm9TdHJva2UoKTsgLy8gRG9uJ3QgZHJhdyBhIHN0cm9rZSBhcm91bmQgc2hhcGVzXG4gKiBlbGxpcHNlKDI1LCAyNSwgODAsIDgwKTsgLy8gRHJhdyBsZWZ0IGNpcmNsZVxuICpcbiAqIC8vIFVzaW5nIG9ubHkgb25lIHZhbHVlIHdpdGggY29sb3IoKVxuICogLy8gZ2VuZXJhdGVzIGEgZ3JheXNjYWxlIHZhbHVlLlxuICogYyA9IGNvbG9yKDY1KTsgLy8gVXBkYXRlICdjJyB3aXRoIGdyYXlzY2FsZSB2YWx1ZVxuICogZmlsbChjKTsgLy8gVXNlIHVwZGF0ZWQgJ2MnIGFzIGZpbGwgY29sb3JcbiAqIGVsbGlwc2UoNzUsIDc1LCA4MCwgODApOyAvLyBEcmF3IHJpZ2h0IGNpcmNsZVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gTmFtZWQgU1ZHICYgQ1NTIGNvbG9ycyBtYXkgYmUgdXNlZCxcbiAqIHZhciBjID0gY29sb3IoJ21hZ2VudGEnKTtcbiAqIGZpbGwoYyk7IC8vIFVzZSAnYycgYXMgZmlsbCBjb2xvclxuICogbm9TdHJva2UoKTsgLy8gRG9uJ3QgZHJhdyBhIHN0cm9rZSBhcm91bmQgc2hhcGVzXG4gKiByZWN0KDIwLCAyMCwgNjAsIDYwKTsgLy8gRHJhdyByZWN0YW5nbGVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIGFzIGNhbiBoZXggY29sb3IgY29kZXM6XG4gKiBub1N0cm9rZSgpOyAvLyBEb24ndCBkcmF3IGEgc3Ryb2tlIGFyb3VuZCBzaGFwZXNcbiAqIHZhciBjID0gY29sb3IoJyMwZjAnKTtcbiAqIGZpbGwoYyk7IC8vIFVzZSAnYycgYXMgZmlsbCBjb2xvclxuICogcmVjdCgwLCAxMCwgNDUsIDgwKTsgLy8gRHJhdyByZWN0YW5nbGVcbiAqXG4gKiBjID0gY29sb3IoJyMwMGZmMDAnKTtcbiAqIGZpbGwoYyk7IC8vIFVzZSB1cGRhdGVkICdjJyBhcyBmaWxsIGNvbG9yXG4gKiByZWN0KDU1LCAxMCwgNDUsIDgwKTsgLy8gRHJhdyByZWN0YW5nbGVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIFJHQiBhbmQgUkdCQSBjb2xvciBzdHJpbmdzIGFyZSBhbHNvIHN1cHBvcnRlZDpcbiAqIC8vIHRoZXNlIGFsbCBzZXQgdG8gdGhlIHNhbWUgY29sb3IgKHNvbGlkIGJsdWUpXG4gKiB2YXIgYztcbiAqIG5vU3Ryb2tlKCk7IC8vIERvbid0IGRyYXcgYSBzdHJva2UgYXJvdW5kIHNoYXBlc1xuICogYyA9IGNvbG9yKCdyZ2IoMCwwLDI1NSknKTtcbiAqIGZpbGwoYyk7IC8vIFVzZSAnYycgYXMgZmlsbCBjb2xvclxuICogcmVjdCgxMCwgMTAsIDM1LCAzNSk7IC8vIERyYXcgcmVjdGFuZ2xlXG4gKlxuICogYyA9IGNvbG9yKCdyZ2IoMCUsIDAlLCAxMDAlKScpO1xuICogZmlsbChjKTsgLy8gVXNlIHVwZGF0ZWQgJ2MnIGFzIGZpbGwgY29sb3JcbiAqIHJlY3QoNTUsIDEwLCAzNSwgMzUpOyAvLyBEcmF3IHJlY3RhbmdsZVxuICpcbiAqIGMgPSBjb2xvcigncmdiYSgwLCAwLCAyNTUsIDEpJyk7XG4gKiBmaWxsKGMpOyAvLyBVc2UgdXBkYXRlZCAnYycgYXMgZmlsbCBjb2xvclxuICogcmVjdCgxMCwgNTUsIDM1LCAzNSk7IC8vIERyYXcgcmVjdGFuZ2xlXG4gKlxuICogYyA9IGNvbG9yKCdyZ2JhKDAlLCAwJSwgMTAwJSwgMSknKTtcbiAqIGZpbGwoYyk7IC8vIFVzZSB1cGRhdGVkICdjJyBhcyBmaWxsIGNvbG9yXG4gKiByZWN0KDU1LCA1NSwgMzUsIDM1KTsgLy8gRHJhdyByZWN0YW5nbGVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIEhTTCBjb2xvciBpcyBhbHNvIHN1cHBvcnRlZCBhbmQgY2FuIGJlIHNwZWNpZmllZFxuICogLy8gYnkgdmFsdWVcbiAqIHZhciBjO1xuICogbm9TdHJva2UoKTsgLy8gRG9uJ3QgZHJhdyBhIHN0cm9rZSBhcm91bmQgc2hhcGVzXG4gKiBjID0gY29sb3IoJ2hzbCgxNjAsIDEwMCUsIDUwJSknKTtcbiAqIGZpbGwoYyk7IC8vIFVzZSAnYycgYXMgZmlsbCBjb2xvclxuICogcmVjdCgwLCAxMCwgNDUsIDgwKTsgLy8gRHJhdyByZWN0YW5nbGVcbiAqXG4gKiBjID0gY29sb3IoJ2hzbGEoMTYwLCAxMDAlLCA1MCUsIDAuNSknKTtcbiAqIGZpbGwoYyk7IC8vIFVzZSB1cGRhdGVkICdjJyBhcyBmaWxsIGNvbG9yXG4gKiByZWN0KDU1LCAxMCwgNDUsIDgwKTsgLy8gRHJhdyByZWN0YW5nbGVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIEhTQiBjb2xvciBpcyBhbHNvIHN1cHBvcnRlZCBhbmQgY2FuIGJlIHNwZWNpZmllZFxuICogLy8gYnkgdmFsdWVcbiAqIHZhciBjO1xuICogbm9TdHJva2UoKTsgLy8gRG9uJ3QgZHJhdyBhIHN0cm9rZSBhcm91bmQgc2hhcGVzXG4gKiBjID0gY29sb3IoJ2hzYigxNjAsIDEwMCUsIDUwJSknKTtcbiAqIGZpbGwoYyk7IC8vIFVzZSAnYycgYXMgZmlsbCBjb2xvclxuICogcmVjdCgwLCAxMCwgNDUsIDgwKTsgLy8gRHJhdyByZWN0YW5nbGVcbiAqXG4gKiBjID0gY29sb3IoJ2hzYmEoMTYwLCAxMDAlLCA1MCUsIDAuNSknKTtcbiAqIGZpbGwoYyk7IC8vIFVzZSB1cGRhdGVkICdjJyBhcyBmaWxsIGNvbG9yXG4gKiByZWN0KDU1LCAxMCwgNDUsIDgwKTsgLy8gRHJhdyByZWN0YW5nbGVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBjOyAvLyBEZWNsYXJlIGNvbG9yICdjJ1xuICogbm9TdHJva2UoKTsgLy8gRG9uJ3QgZHJhdyBhIHN0cm9rZSBhcm91bmQgc2hhcGVzXG4gKlxuICogLy8gSWYgbm8gY29sb3JNb2RlIGlzIHNwZWNpZmllZCwgdGhlbiB0aGVcbiAqIC8vIGRlZmF1bHQgb2YgUkdCIHdpdGggc2NhbGUgb2YgMC0yNTUgaXMgdXNlZC5cbiAqIGMgPSBjb2xvcig1MCwgNTUsIDEwMCk7IC8vIENyZWF0ZSBhIGNvbG9yIGZvciAnYydcbiAqIGZpbGwoYyk7IC8vIFVzZSBjb2xvciB2YXJpYWJsZSAnYycgYXMgZmlsbCBjb2xvclxuICogcmVjdCgwLCAxMCwgNDUsIDgwKTsgLy8gRHJhdyBsZWZ0IHJlY3RcbiAqXG4gKiBjb2xvck1vZGUoSFNCLCAxMDApOyAvLyBVc2UgSFNCIHdpdGggc2NhbGUgb2YgMC0xMDBcbiAqIGMgPSBjb2xvcig1MCwgNTUsIDEwMCk7IC8vIFVwZGF0ZSAnYycgd2l0aCBuZXcgY29sb3JcbiAqIGZpbGwoYyk7IC8vIFVzZSB1cGRhdGVkICdjJyBhcyBmaWxsIGNvbG9yXG4gKiByZWN0KDU1LCAxMCwgNDUsIDgwKTsgLy8gRHJhdyByaWdodCByZWN0XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBZZWxsb3cgcmVjdCBpbiBtaWRkbGUgcmlnaHQgb2YgY2FudmFzLCB3aXRoIDU1IHBpeGVsIHdpZHRoIGFuZCBoZWlnaHQuXG4gKiBZZWxsb3cgZWxsaXBzZSBpbiB0b3AgbGVmdCBvZiBjYW52YXMsIGJsYWNrIGVsbGlwc2UgaW4gYm90dG9tIHJpZ2h0LGJvdGggODB4ODAuXG4gKiBCcmlnaHQgZnVzY2hpYSByZWN0IGluIG1pZGRsZSBvZiBjYW52YXMsIDYwIHBpeGVsIHdpZHRoIGFuZCBoZWlnaHQuXG4gKiBUd28gYnJpZ2h0IGdyZWVuIHJlY3RzIG9uIG9wcG9zaXRlIHNpZGVzIG9mIHRoZSBjYW52YXMsIGJvdGggNDV4ODAuXG4gKiBGb3VyIGJsdWUgcmVjdHMgaW4gZWFjaCBjb3JuZXIgb2YgdGhlIGNhbnZhcywgZWFjaCBhcmUgMzV4MzUuXG4gKiBCcmlnaHQgc2VhIGdyZWVuIHJlY3Qgb24gbGVmdCBhbmQgZGFya2VyIHJlY3Qgb24gcmlnaHQgb2YgY2FudmFzLCBib3RoIDQ1eDgwLlxuICogRGFyayBncmVlbiByZWN0IG9uIGxlZnQgYW5kIGxpZ2h0ZXIgZ3JlZW4gcmVjdCBvbiByaWdodCBvZiBjYW52YXMsIGJvdGggNDV4ODAuXG4gKiBEYXJrIGJsdWUgcmVjdCBvbiBsZWZ0IGFuZCBsaWdodCB0ZWFsIHJlY3Qgb24gcmlnaHQgb2YgY2FudmFzLCBib3RoIDQ1eDgwLlxuICpcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGNvbG9yXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICB2MSAgICAgIHJlZCBvciBodWUgdmFsdWUgcmVsYXRpdmUgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2VcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIHYyICAgICAgZ3JlZW4gb3Igc2F0dXJhdGlvbiB2YWx1ZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb2xvciByYW5nZVxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgdjMgICAgICBibHVlIG9yIGJyaWdodG5lc3MgdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2VcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIFthbHBoYV1cbiAqIEByZXR1cm4ge3A1LkNvbG9yfVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBjb2xvclxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgdmFsdWUgICBhIGNvbG9yIHN0cmluZ1xuICogQHJldHVybiB7cDUuQ29sb3J9XG4gKi9cbi8qKlxuICogQG1ldGhvZCBjb2xvclxuICogQHBhcmFtICB7TnVtYmVyW119ICAgICAgdmFsdWVzICBhbiBhcnJheSBjb250YWluaW5nIHRoZSByZWQsZ3JlZW4sYmx1ZSAmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIHRoZSBjb2xvclxuICogQHJldHVybiB7cDUuQ29sb3J9XG4gKi9cbi8qKlxuICogQG1ldGhvZCBjb2xvclxuICogQHBhcmFtICB7cDUuQ29sb3J9ICAgICBjb2xvclxuICogQHJldHVybiB7cDUuQ29sb3J9XG4gKi9cblxucDUucHJvdG90eXBlLmNvbG9yID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2NvbG9yJywgYXJndW1lbnRzKTtcbiAgaWYgKGFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIHA1LkNvbG9yKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50c1swXTsgLy8gRG8gbm90aGluZyBpZiBhcmd1bWVudCBpcyBhbHJlYWR5IGEgY29sb3Igb2JqZWN0LlxuICB9XG5cbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBBcnJheSA/IGFyZ3VtZW50c1swXSA6IGFyZ3VtZW50cztcbiAgcmV0dXJuIG5ldyBwNS5Db2xvcih0aGlzLCBhcmdzKTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGdyZWVuIHZhbHVlIGZyb20gYSBjb2xvciBvciBwaXhlbCBhcnJheS5cbiAqXG4gKiBAbWV0aG9kIGdyZWVuXG4gKiBAcGFyYW0ge3A1LkNvbG9yfE51bWJlcltdfFN0cmluZ30gY29sb3IgcDUuQ29sb3Igb2JqZWN0LCBjb2xvciBjb21wb25lbnRzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENTUyBjb2xvclxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgZ3JlZW4gdmFsdWVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYyA9IGNvbG9yKDIwLCA3NSwgMjAwKTsgLy8gRGVmaW5lIGNvbG9yICdjJ1xuICogZmlsbChjKTsgLy8gVXNlIGNvbG9yIHZhcmlhYmxlICdjJyBhcyBmaWxsIGNvbG9yXG4gKiByZWN0KDE1LCAyMCwgMzUsIDYwKTsgLy8gRHJhdyBsZWZ0IHJlY3RhbmdsZVxuICpcbiAqIHZhciBncmVlblZhbHVlID0gZ3JlZW4oYyk7IC8vIEdldCBncmVlbiBpbiAnYydcbiAqIHByaW50KGdyZWVuVmFsdWUpOyAvLyBQcmludCBcIjc1LjBcIlxuICogZmlsbCgwLCBncmVlblZhbHVlLCAwKTsgLy8gVXNlICdncmVlblZhbHVlJyBpbiBuZXcgZmlsbFxuICogcmVjdCg1MCwgMjAsIDM1LCA2MCk7IC8vIERyYXcgcmlnaHQgcmVjdGFuZ2xlXG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBibHVlIHJlY3Qgb24gbGVmdCBhbmQgZ3JlZW4gb24gcmlnaHQsIGJvdGggd2l0aCBibGFjayBvdXRsaW5lcyAmIDM1eDYwLlxuICpcbiAqL1xuXG5wNS5wcm90b3R5cGUuZ3JlZW4gPSBmdW5jdGlvbihjKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2dyZWVuJywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXMuY29sb3IoYykuX2dldEdyZWVuKCk7XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBodWUgdmFsdWUgZnJvbSBhIGNvbG9yIG9yIHBpeGVsIGFycmF5LlxuICpcbiAqIEh1ZSBleGlzdHMgaW4gYm90aCBIU0IgYW5kIEhTTC4gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGVcbiAqIEhTQi1ub3JtYWxpemVkIGh1ZSB3aGVuIHN1cHBsaWVkIHdpdGggYW4gSFNCIGNvbG9yIG9iamVjdCAob3Igd2hlbiBzdXBwbGllZFxuICogd2l0aCBhIHBpeGVsIGFycmF5IHdoaWxlIHRoZSBjb2xvciBtb2RlIGlzIEhTQiksIGJ1dCB3aWxsIGRlZmF1bHQgdG8gdGhlXG4gKiBIU0wtbm9ybWFsaXplZCBodWUgb3RoZXJ3aXNlLiAoVGhlIHZhbHVlcyB3aWxsIG9ubHkgYmUgZGlmZmVyZW50IGlmIHRoZVxuICogbWF4aW11bSBodWUgc2V0dGluZyBmb3IgZWFjaCBzeXN0ZW0gaXMgZGlmZmVyZW50LilcbiAqXG4gKiBAbWV0aG9kIGh1ZVxuICogQHBhcmFtIHtwNS5Db2xvcnxOdW1iZXJbXXxTdHJpbmd9IGNvbG9yIHA1LkNvbG9yIG9iamVjdCwgY29sb3IgY29tcG9uZW50cyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBDU1MgY29sb3JcbiAqIEByZXR1cm4ge051bWJlcn0gdGhlIGh1ZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIG5vU3Ryb2tlKCk7XG4gKiBjb2xvck1vZGUoSFNCLCAyNTUpO1xuICogdmFyIGMgPSBjb2xvcigwLCAxMjYsIDI1NSk7XG4gKiBmaWxsKGMpO1xuICogcmVjdCgxNSwgMjAsIDM1LCA2MCk7XG4gKiB2YXIgdmFsdWUgPSBodWUoYyk7IC8vIFNldHMgJ3ZhbHVlJyB0byBcIjBcIlxuICogZmlsbCh2YWx1ZSk7XG4gKiByZWN0KDUwLCAyMCwgMzUsIDYwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIHNhbG1vbiBwaW5rIHJlY3Qgb24gbGVmdCBhbmQgYmxhY2sgb24gcmlnaHQsIGJvdGggMzV4NjAuXG4gKlxuICovXG5cbnA1LnByb3RvdHlwZS5odWUgPSBmdW5jdGlvbihjKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2h1ZScsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzLmNvbG9yKGMpLl9nZXRIdWUoKTtcbn07XG5cbi8qKlxuICogQmxlbmRzIHR3byBjb2xvcnMgdG8gZmluZCBhIHRoaXJkIGNvbG9yIHNvbWV3aGVyZSBiZXR3ZWVuIHRoZW0uIFRoZSBhbXRcbiAqIHBhcmFtZXRlciBpcyB0aGUgYW1vdW50IHRvIGludGVycG9sYXRlIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgd2hlcmUgMC4wXG4gKiBlcXVhbCB0byB0aGUgZmlyc3QgY29sb3IsIDAuMSBpcyB2ZXJ5IG5lYXIgdGhlIGZpcnN0IGNvbG9yLCAwLjUgaXMgaGFsZndheVxuICogaW4gYmV0d2VlbiwgZXRjLiBBbiBhbW91bnQgYmVsb3cgMCB3aWxsIGJlIHRyZWF0ZWQgYXMgMC4gTGlrZXdpc2UsIGFtb3VudHNcbiAqIGFib3ZlIDEgd2lsbCBiZSBjYXBwZWQgYXQgMS4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYmVoYXZpb3Igb2YgbGVycCgpLFxuICogYnV0IG5lY2Vzc2FyeSBiZWNhdXNlIG90aGVyd2lzZSBudW1iZXJzIG91dHNpZGUgdGhlIHJhbmdlIHdpbGwgcHJvZHVjZVxuICogc3RyYW5nZSBhbmQgdW5leHBlY3RlZCBjb2xvcnMuXG4gKiA8YnI+PGJyPlxuICogVGhlIHdheSB0aGF0IGNvbG91cnMgYXJlIGludGVycG9sYXRlZCBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGNvbG9yIG1vZGUuXG4gKlxuICogQG1ldGhvZCBsZXJwQ29sb3JcbiAqIEBwYXJhbSAge3A1LkNvbG9yfSBjMSAgaW50ZXJwb2xhdGUgZnJvbSB0aGlzIGNvbG9yXG4gKiBAcGFyYW0gIHtwNS5Db2xvcn0gYzIgIGludGVycG9sYXRlIHRvIHRoaXMgY29sb3JcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgYW10IG51bWJlciBiZXR3ZWVuIDAgYW5kIDFcbiAqIEByZXR1cm4ge3A1LkNvbG9yfSAgICAgaW50ZXJwb2xhdGVkIGNvbG9yXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogY29sb3JNb2RlKFJHQik7XG4gKiBzdHJva2UoMjU1KTtcbiAqIGJhY2tncm91bmQoNTEpO1xuICogdmFyIGZyb20gPSBjb2xvcigyMTgsIDE2NSwgMzIpO1xuICogdmFyIHRvID0gY29sb3IoNzIsIDYxLCAxMzkpO1xuICogY29sb3JNb2RlKFJHQik7IC8vIFRyeSBjaGFuZ2luZyB0byBIU0IuXG4gKiB2YXIgaW50ZXJBID0gbGVycENvbG9yKGZyb20sIHRvLCAwLjMzKTtcbiAqIHZhciBpbnRlckIgPSBsZXJwQ29sb3IoZnJvbSwgdG8sIDAuNjYpO1xuICogZmlsbChmcm9tKTtcbiAqIHJlY3QoMTAsIDIwLCAyMCwgNjApO1xuICogZmlsbChpbnRlckEpO1xuICogcmVjdCgzMCwgMjAsIDIwLCA2MCk7XG4gKiBmaWxsKGludGVyQik7XG4gKiByZWN0KDUwLCAyMCwgMjAsIDYwKTtcbiAqIGZpbGwodG8pO1xuICogcmVjdCg3MCwgMjAsIDIwLCA2MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiA0IHJlY3RzIG9uZSB0YW4sIGJyb3duLCBicm93bmlzaCBwdXJwbGUsIHB1cnBsZSwgd2l0aCB3aGl0ZSBvdXRsaW5lcyAmIDIweDYwXG4gKlxuICovXG5cbnA1LnByb3RvdHlwZS5sZXJwQ29sb3IgPSBmdW5jdGlvbihjMSwgYzIsIGFtdCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdsZXJwQ29sb3InLCBhcmd1bWVudHMpO1xuICB2YXIgbW9kZSA9IHRoaXMuX2NvbG9yTW9kZTtcbiAgdmFyIG1heGVzID0gdGhpcy5fY29sb3JNYXhlcztcbiAgdmFyIGwwLCBsMSwgbDIsIGwzO1xuICB2YXIgZnJvbUFycmF5LCB0b0FycmF5O1xuXG4gIGlmIChtb2RlID09PSBjb25zdGFudHMuUkdCKSB7XG4gICAgZnJvbUFycmF5ID0gYzEubGV2ZWxzLm1hcChmdW5jdGlvbihsZXZlbCkge1xuICAgICAgcmV0dXJuIGxldmVsIC8gMjU1O1xuICAgIH0pO1xuICAgIHRvQXJyYXkgPSBjMi5sZXZlbHMubWFwKGZ1bmN0aW9uKGxldmVsKSB7XG4gICAgICByZXR1cm4gbGV2ZWwgLyAyNTU7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAobW9kZSA9PT0gY29uc3RhbnRzLkhTQikge1xuICAgIGMxLl9nZXRCcmlnaHRuZXNzKCk7IC8vIENhY2hlIGhzYmEgc28gaXQgZGVmaW5pdGVseSBleGlzdHMuXG4gICAgYzIuX2dldEJyaWdodG5lc3MoKTtcbiAgICBmcm9tQXJyYXkgPSBjMS5oc2JhO1xuICAgIHRvQXJyYXkgPSBjMi5oc2JhO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09IGNvbnN0YW50cy5IU0wpIHtcbiAgICBjMS5fZ2V0TGlnaHRuZXNzKCk7IC8vIENhY2hlIGhzbGEgc28gaXQgZGVmaW5pdGVseSBleGlzdHMuXG4gICAgYzIuX2dldExpZ2h0bmVzcygpO1xuICAgIGZyb21BcnJheSA9IGMxLmhzbGE7XG4gICAgdG9BcnJheSA9IGMyLmhzbGE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1vZGUgKyAnY2Fubm90IGJlIHVzZWQgZm9yIGludGVycG9sYXRpb24uJyk7XG4gIH1cblxuICAvLyBQcmV2ZW50IGV4dHJhcG9sYXRpb24uXG4gIGFtdCA9IE1hdGgubWF4KE1hdGgubWluKGFtdCwgMSksIDApO1xuXG4gIC8vIERlZmluZSBsZXJwIGhlcmUgaXRzZWxmIGlmIHVzZXIgaXNuJ3QgdXNpbmcgbWF0aCBtb2R1bGUuXG4gIC8vIE1haW50YWlucyB0aGUgZGVmaW5pdGlvbiBhcyBmb3VuZCBpbiBtYXRoL2NhbGN1bGF0aW9uLmpzXG4gIGlmICh0eXBlb2YgdGhpcy5sZXJwID09PSAndW5kZWZpbmVkJykge1xuICAgIHRoaXMubGVycCA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBhbXQpIHtcbiAgICAgIHJldHVybiBhbXQgKiAoc3RvcCAtIHN0YXJ0KSArIHN0YXJ0O1xuICAgIH07XG4gIH1cblxuICAvLyBQZXJmb3JtIGludGVycG9sYXRpb24uXG4gIGwwID0gdGhpcy5sZXJwKGZyb21BcnJheVswXSwgdG9BcnJheVswXSwgYW10KTtcbiAgbDEgPSB0aGlzLmxlcnAoZnJvbUFycmF5WzFdLCB0b0FycmF5WzFdLCBhbXQpO1xuICBsMiA9IHRoaXMubGVycChmcm9tQXJyYXlbMl0sIHRvQXJyYXlbMl0sIGFtdCk7XG4gIGwzID0gdGhpcy5sZXJwKGZyb21BcnJheVszXSwgdG9BcnJheVszXSwgYW10KTtcblxuICAvLyBTY2FsZSBjb21wb25lbnRzLlxuICBsMCAqPSBtYXhlc1ttb2RlXVswXTtcbiAgbDEgKj0gbWF4ZXNbbW9kZV1bMV07XG4gIGwyICo9IG1heGVzW21vZGVdWzJdO1xuICBsMyAqPSBtYXhlc1ttb2RlXVszXTtcblxuICByZXR1cm4gdGhpcy5jb2xvcihsMCwgbDEsIGwyLCBsMyk7XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBIU0wgbGlnaHRuZXNzIHZhbHVlIGZyb20gYSBjb2xvciBvciBwaXhlbCBhcnJheS5cbiAqXG4gKiBAbWV0aG9kIGxpZ2h0bmVzc1xuICogQHBhcmFtIHtwNS5Db2xvcnxOdW1iZXJbXXxTdHJpbmd9IGNvbG9yIHA1LkNvbG9yIG9iamVjdCwgY29sb3IgY29tcG9uZW50cyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBDU1MgY29sb3JcbiAqIEByZXR1cm4ge051bWJlcn0gdGhlIGxpZ2h0bmVzc1xuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIG5vU3Ryb2tlKCk7XG4gKiBjb2xvck1vZGUoSFNMKTtcbiAqIHZhciBjID0gY29sb3IoMTU2LCAxMDAsIDUwLCAxKTtcbiAqIGZpbGwoYyk7XG4gKiByZWN0KDE1LCAyMCwgMzUsIDYwKTtcbiAqIHZhciB2YWx1ZSA9IGxpZ2h0bmVzcyhjKTsgLy8gU2V0cyAndmFsdWUnIHRvIDUwXG4gKiBmaWxsKHZhbHVlKTtcbiAqIHJlY3QoNTAsIDIwLCAzNSwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogbGlnaHQgcGFzdGVsIGdyZWVuIHJlY3Qgb24gbGVmdCBhbmQgZGFyayBncmV5IHJlY3Qgb24gcmlnaHQsIGJvdGggMzV4NjAuXG4gKlxuICovXG5wNS5wcm90b3R5cGUubGlnaHRuZXNzID0gZnVuY3Rpb24oYykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdsaWdodG5lc3MnLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcy5jb2xvcihjKS5fZ2V0TGlnaHRuZXNzKCk7XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSByZWQgdmFsdWUgZnJvbSBhIGNvbG9yIG9yIHBpeGVsIGFycmF5LlxuICpcbiAqIEBtZXRob2QgcmVkXG4gKiBAcGFyYW0ge3A1LkNvbG9yfE51bWJlcltdfFN0cmluZ30gY29sb3IgcDUuQ29sb3Igb2JqZWN0LCBjb2xvciBjb21wb25lbnRzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENTUyBjb2xvclxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgcmVkIHZhbHVlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGMgPSBjb2xvcigyNTUsIDIwNCwgMCk7IC8vIERlZmluZSBjb2xvciAnYydcbiAqIGZpbGwoYyk7IC8vIFVzZSBjb2xvciB2YXJpYWJsZSAnYycgYXMgZmlsbCBjb2xvclxuICogcmVjdCgxNSwgMjAsIDM1LCA2MCk7IC8vIERyYXcgbGVmdCByZWN0YW5nbGVcbiAqXG4gKiB2YXIgcmVkVmFsdWUgPSByZWQoYyk7IC8vIEdldCByZWQgaW4gJ2MnXG4gKiBwcmludChyZWRWYWx1ZSk7IC8vIFByaW50IFwiMjU1LjBcIlxuICogZmlsbChyZWRWYWx1ZSwgMCwgMCk7IC8vIFVzZSAncmVkVmFsdWUnIGluIG5ldyBmaWxsXG4gKiByZWN0KDUwLCAyMCwgMzUsIDYwKTsgLy8gRHJhdyByaWdodCByZWN0YW5nbGVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGNvbG9yTW9kZShSR0IsIDI1NSk7XG4gKiB2YXIgYyA9IGNvbG9yKDEyNywgMjU1LCAwKTtcbiAqIGNvbG9yTW9kZShSR0IsIDEpO1xuICogdmFyIG15Q29sb3IgPSByZWQoYyk7XG4gKiBwcmludChteUNvbG9yKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIHllbGxvdyByZWN0IG9uIGxlZnQgYW5kIHJlZCByZWN0IG9uIHJpZ2h0LCBib3RoIHdpdGggYmxhY2sgb3V0bGluZXMgYW5kIDM1eDYwLlxuICogZ3JleSBjYW52YXNcbiAqL1xucDUucHJvdG90eXBlLnJlZCA9IGZ1bmN0aW9uKGMpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygncmVkJywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXMuY29sb3IoYykuX2dldFJlZCgpO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgc2F0dXJhdGlvbiB2YWx1ZSBmcm9tIGEgY29sb3Igb3IgcGl4ZWwgYXJyYXkuXG4gKlxuICogU2F0dXJhdGlvbiBpcyBzY2FsZWQgZGlmZmVyZW50bHkgaW4gSFNCIGFuZCBIU0wuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm5cbiAqIHRoZSBIU0Igc2F0dXJhdGlvbiB3aGVuIHN1cHBsaWVkIHdpdGggYW4gSFNCIGNvbG9yIG9iamVjdCAob3Igd2hlbiBzdXBwbGllZFxuICogd2l0aCBhIHBpeGVsIGFycmF5IHdoaWxlIHRoZSBjb2xvciBtb2RlIGlzIEhTQiksIGJ1dCB3aWxsIGRlZmF1bHQgdG8gdGhlXG4gKiBIU0wgc2F0dXJhdGlvbiBvdGhlcndpc2UuXG4gKlxuICogQG1ldGhvZCBzYXR1cmF0aW9uXG4gKiBAcGFyYW0ge3A1LkNvbG9yfE51bWJlcltdfFN0cmluZ30gY29sb3IgcDUuQ29sb3Igb2JqZWN0LCBjb2xvciBjb21wb25lbnRzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENTUyBjb2xvclxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgc2F0dXJhdGlvbiB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIG5vU3Ryb2tlKCk7XG4gKiBjb2xvck1vZGUoSFNCLCAyNTUpO1xuICogdmFyIGMgPSBjb2xvcigwLCAxMjYsIDI1NSk7XG4gKiBmaWxsKGMpO1xuICogcmVjdCgxNSwgMjAsIDM1LCA2MCk7XG4gKiB2YXIgdmFsdWUgPSBzYXR1cmF0aW9uKGMpOyAvLyBTZXRzICd2YWx1ZScgdG8gMTI2XG4gKiBmaWxsKHZhbHVlKTtcbiAqIHJlY3QoNTAsIDIwLCAzNSwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICpkZWVwIHBpbmsgcmVjdCBvbiBsZWZ0IGFuZCBncmV5IHJlY3Qgb24gcmlnaHQsIGJvdGggMzV4NjAuXG4gKlxuICovXG5cbnA1LnByb3RvdHlwZS5zYXR1cmF0aW9uID0gZnVuY3Rpb24oYykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdzYXR1cmF0aW9uJywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXMuY29sb3IoYykuX2dldFNhdHVyYXRpb24oKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb25zdGFudHNcIjoyMSxcIi4uL2NvcmUvY29yZVwiOjIyLFwiLi4vY29yZS9lcnJvcl9oZWxwZXJzXCI6MjUsXCIuL3A1LkNvbG9yXCI6MTZ9XSwxNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgQ29sb3JcbiAqIEBzdWJtb2R1bGUgQ3JlYXRpbmcgJiBSZWFkaW5nXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICogQHJlcXVpcmVzIGNvbnN0YW50c1xuICogQHJlcXVpcmVzIGNvbG9yX2NvbnZlcnNpb25cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xudmFyIGNvbnN0YW50cyA9IF9kZXJlcV8oJy4uL2NvcmUvY29uc3RhbnRzJyk7XG52YXIgY29sb3JfY29udmVyc2lvbiA9IF9kZXJlcV8oJy4vY29sb3JfY29udmVyc2lvbicpO1xuXG4vKipcbiAqIEVhY2ggY29sb3Igc3RvcmVzIHRoZSBjb2xvciBtb2RlIGFuZCBsZXZlbCBtYXhlcyB0aGF0IGFwcGxpZWQgYXQgdGhlXG4gKiB0aW1lIG9mIGl0cyBjb25zdHJ1Y3Rpb24uIFRoZXNlIGFyZSB1c2VkIHRvIGludGVycHJldCB0aGUgaW5wdXQgYXJndW1lbnRzXG4gKiAoYXQgY29uc3RydWN0aW9uIGFuZCBsYXRlciBmb3IgdGhhdCBpbnN0YW5jZSBvZiBjb2xvcikgYW5kIHRvIGZvcm1hdCB0aGVcbiAqIG91dHB1dCBlLmcuIHdoZW4gc2F0dXJhdGlvbigpIGlzIHJlcXVlc3RlZC5cbiAqXG4gKiBJbnRlcm5hbGx5IHdlIHN0b3JlIGFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgaWRlYWwgUkdCQSB2YWx1ZXMgaW4gZmxvYXRpbmdcbiAqIHBvaW50IGZvcm0sIG5vcm1hbGl6ZWQgZnJvbSAwIHRvIDEuIEZyb20gdGhpcyB3ZSBjYWxjdWxhdGUgdGhlIGNsb3Nlc3RcbiAqIHNjcmVlbiBjb2xvciAoUkdCQSBsZXZlbHMgZnJvbSAwIHRvIDI1NSkgYW5kIGV4cG9zZSB0aGlzIHRvIHRoZSByZW5kZXJlci5cbiAqXG4gKiBXZSBhbHNvIGNhY2hlIG5vcm1hbGl6ZWQsIGZsb2F0aW5nIHBvaW50IGNvbXBvbmVudHMgb2YgdGhlIGNvbG9yIGluIHZhcmlvdXNcbiAqIHJlcHJlc2VudGF0aW9ucyBhcyB0aGV5IGFyZSBjYWxjdWxhdGVkLiBUaGlzIGlzIGRvbmUgdG8gcHJldmVudCByZXBlYXRpbmcgYVxuICogY29udmVyc2lvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBwNS5Db2xvclxuICovXG5wNS5Db2xvciA9IGZ1bmN0aW9uKHBJbnN0LCB2YWxzKSB7XG4gIC8vIFJlY29yZCBjb2xvciBtb2RlIGFuZCBtYXhlcyBhdCB0aW1lIG9mIGNvbnN0cnVjdGlvbi5cbiAgdGhpcy5fc3RvcmVNb2RlQW5kTWF4ZXMocEluc3QuX2NvbG9yTW9kZSwgcEluc3QuX2NvbG9yTWF4ZXMpO1xuXG4gIC8vIENhbGN1bGF0ZSBub3JtYWxpemVkIFJHQkEgdmFsdWVzLlxuICBpZiAoXG4gICAgdGhpcy5tb2RlICE9PSBjb25zdGFudHMuUkdCICYmXG4gICAgdGhpcy5tb2RlICE9PSBjb25zdGFudHMuSFNMICYmXG4gICAgdGhpcy5tb2RlICE9PSBjb25zdGFudHMuSFNCXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcih0aGlzLm1vZGUgKyAnIGlzIGFuIGludmFsaWQgY29sb3JNb2RlLicpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX2FycmF5ID0gcDUuQ29sb3IuX3BhcnNlSW5wdXRzLmFwcGx5KHRoaXMsIHZhbHMpO1xuICB9XG5cbiAgLy8gRXhwb3NlIGNsb3Nlc3Qgc2NyZWVuIGNvbG9yLlxuICB0aGlzLl9jYWxjdWxhdGVMZXZlbHMoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sb3IgZm9ybWF0dGVkIGFzIGEgc3RyaW5nLiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAqIGZvciBkZWJ1Z2dpbmcsIG9yIGZvciB1c2luZyBwNS5qcyB3aXRoIG90aGVyIGxpYnJhcmllcy5cbiAqIEBtZXRob2QgdG9TdHJpbmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZm9ybWF0XSBIb3cgdGhlIGNvbG9yIHN0cmluZyB3aWxsIGJlIGZvcm1hdHRlZC5cbiAqIExlYXZpbmcgdGhpcyBlbXB0eSBmb3JtYXRzIHRoZSBzdHJpbmcgYXMgcmdiYShyLCBnLCBiLCBhKS5cbiAqICcjcmdiJyAnI3JnYmEnICcjcnJnZ2JiJyBhbmQgJyNycmdnYmJhYScgZm9ybWF0IGFzIGhleGFkZWNpbWFsIGNvbG9yIGNvZGVzLlxuICogJ3JnYicgJ2hzYicgYW5kICdoc2wnIHJldHVybiB0aGUgY29sb3IgZm9ybWF0dGVkIGluIHRoZSBzcGVjaWZpZWQgY29sb3IgbW9kZS5cbiAqICdyZ2JhJyAnaHNiYScgYW5kICdoc2xhJyBhcmUgdGhlIHNhbWUgYXMgYWJvdmUgYnV0IHdpdGggYWxwaGEgY2hhbm5lbHMuXG4gKiAncmdiJScgJ2hzYiUnICdoc2wlJyAncmdiYSUnICdoc2JhJScgYW5kICdoc2xhJScgZm9ybWF0IGFzIHBlcmNlbnRhZ2VzLlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgZm9ybWF0dGVkIHN0cmluZ1xuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBteUNvbG9yO1xuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygyMDAsIDIwMCk7XG4gKiAgIHN0cm9rZSgyNTUpO1xuICogICBteUNvbG9yID0gY29sb3IoMTAwLCAxMDAsIDI1MCk7XG4gKiAgIGZpbGwobXlDb2xvcik7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgdGV4dChteUNvbG9yLnRvU3RyaW5nKCksIDEwLCAxMCk7XG4gKiAgIHRleHQobXlDb2xvci50b1N0cmluZygnI3JyZ2diYicpLCAxMCwgOTUpO1xuICogICB0ZXh0KG15Q29sb3IudG9TdHJpbmcoJ3JnYmElJyksIDEwLCAxODApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogY2FudmFzIHdpdGggdGV4dCByZXByZXNlbnRhdGlvbiBvZiBjb2xvclxuICovXG5wNS5Db2xvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihmb3JtYXQpIHtcbiAgaWYgKCF0aGlzLmhzYmEpIHRoaXMuaHNiYSA9IGNvbG9yX2NvbnZlcnNpb24uX3JnYmFUb0hTQkEodGhpcy5fYXJyYXkpO1xuICBpZiAoIXRoaXMuaHNsYSkgdGhpcy5oc2xhID0gY29sb3JfY29udmVyc2lvbi5fcmdiYVRvSFNMQSh0aGlzLl9hcnJheSk7XG5cbiAgdmFyIGEgPSB0aGlzLmxldmVscztcbiAgdmFyIGYgPSB0aGlzLl9hcnJheTtcbiAgdmFyIGFscGhhID0gZlszXTsgLy8gU3RyaW5nIHJlcHJlc2VudGF0aW9uIHVzZXMgbm9ybWFsaXplZCBhbHBoYVxuXG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAnI3JyZ2diYic6XG4gICAgICByZXR1cm4gJyMnLmNvbmNhdChcbiAgICAgICAgYVswXSA8IDE2ID8gJzAnLmNvbmNhdChhWzBdLnRvU3RyaW5nKDE2KSkgOiBhWzBdLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgYVsxXSA8IDE2ID8gJzAnLmNvbmNhdChhWzFdLnRvU3RyaW5nKDE2KSkgOiBhWzFdLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgYVsyXSA8IDE2ID8gJzAnLmNvbmNhdChhWzJdLnRvU3RyaW5nKDE2KSkgOiBhWzJdLnRvU3RyaW5nKDE2KVxuICAgICAgKTtcblxuICAgIGNhc2UgJyNycmdnYmJhYSc6XG4gICAgICByZXR1cm4gJyMnLmNvbmNhdChcbiAgICAgICAgYVswXSA8IDE2ID8gJzAnLmNvbmNhdChhWzBdLnRvU3RyaW5nKDE2KSkgOiBhWzBdLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgYVsxXSA8IDE2ID8gJzAnLmNvbmNhdChhWzFdLnRvU3RyaW5nKDE2KSkgOiBhWzFdLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgYVsyXSA8IDE2ID8gJzAnLmNvbmNhdChhWzJdLnRvU3RyaW5nKDE2KSkgOiBhWzJdLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgYVszXSA8IDE2ID8gJzAnLmNvbmNhdChhWzJdLnRvU3RyaW5nKDE2KSkgOiBhWzNdLnRvU3RyaW5nKDE2KVxuICAgICAgKTtcblxuICAgIGNhc2UgJyNyZ2InOlxuICAgICAgcmV0dXJuICcjJy5jb25jYXQoXG4gICAgICAgIE1hdGgucm91bmQoZlswXSAqIDE1KS50b1N0cmluZygxNiksXG4gICAgICAgIE1hdGgucm91bmQoZlsxXSAqIDE1KS50b1N0cmluZygxNiksXG4gICAgICAgIE1hdGgucm91bmQoZlsyXSAqIDE1KS50b1N0cmluZygxNilcbiAgICAgICk7XG5cbiAgICBjYXNlICcjcmdiYSc6XG4gICAgICByZXR1cm4gJyMnLmNvbmNhdChcbiAgICAgICAgTWF0aC5yb3VuZChmWzBdICogMTUpLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgTWF0aC5yb3VuZChmWzFdICogMTUpLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgTWF0aC5yb3VuZChmWzJdICogMTUpLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgTWF0aC5yb3VuZChmWzNdICogMTUpLnRvU3RyaW5nKDE2KVxuICAgICAgKTtcblxuICAgIGNhc2UgJ3JnYic6XG4gICAgICByZXR1cm4gJ3JnYignLmNvbmNhdChhWzBdLCAnLCAnLCBhWzFdLCAnLCAnLCBhWzJdLCAnKScpO1xuXG4gICAgY2FzZSAncmdiJSc6XG4gICAgICByZXR1cm4gJ3JnYignLmNvbmNhdChcbiAgICAgICAgKDEwMCAqIGZbMF0pLnRvUHJlY2lzaW9uKDMpLFxuICAgICAgICAnJSwgJyxcbiAgICAgICAgKDEwMCAqIGZbMV0pLnRvUHJlY2lzaW9uKDMpLFxuICAgICAgICAnJSwgJyxcbiAgICAgICAgKDEwMCAqIGZbMl0pLnRvUHJlY2lzaW9uKDMpLFxuICAgICAgICAnJSknXG4gICAgICApO1xuXG4gICAgY2FzZSAncmdiYSUnOlxuICAgICAgcmV0dXJuICdyZ2JhKCcuY29uY2F0KFxuICAgICAgICAoMTAwICogZlswXSkudG9QcmVjaXNpb24oMyksXG4gICAgICAgICclLCAnLFxuICAgICAgICAoMTAwICogZlsxXSkudG9QcmVjaXNpb24oMyksXG4gICAgICAgICclLCAnLFxuICAgICAgICAoMTAwICogZlsyXSkudG9QcmVjaXNpb24oMyksXG4gICAgICAgICclLCAnLFxuICAgICAgICAoMTAwICogZlszXSkudG9QcmVjaXNpb24oMyksXG4gICAgICAgICclKSdcbiAgICAgICk7XG5cbiAgICBjYXNlICdoc2InOlxuICAgIGNhc2UgJ2hzdic6XG4gICAgICByZXR1cm4gJ2hzYignLmNvbmNhdChcbiAgICAgICAgdGhpcy5oc2JhWzBdICogdGhpcy5tYXhlc1tjb25zdGFudHMuSFNCXVswXSxcbiAgICAgICAgJywgJyxcbiAgICAgICAgdGhpcy5oc2JhWzFdICogdGhpcy5tYXhlc1tjb25zdGFudHMuSFNCXVsxXSxcbiAgICAgICAgJywgJyxcbiAgICAgICAgdGhpcy5oc2JhWzJdICogdGhpcy5tYXhlc1tjb25zdGFudHMuSFNCXVsyXSxcbiAgICAgICAgJyknXG4gICAgICApO1xuXG4gICAgY2FzZSAnaHNiJSc6XG4gICAgY2FzZSAnaHN2JSc6XG4gICAgICByZXR1cm4gJ2hzYignLmNvbmNhdChcbiAgICAgICAgKDEwMCAqIHRoaXMuaHNiYVswXSkudG9QcmVjaXNpb24oMyksXG4gICAgICAgICclLCAnLFxuICAgICAgICAoMTAwICogdGhpcy5oc2JhWzFdKS50b1ByZWNpc2lvbigzKSxcbiAgICAgICAgJyUsICcsXG4gICAgICAgICgxMDAgKiB0aGlzLmhzYmFbMl0pLnRvUHJlY2lzaW9uKDMpLFxuICAgICAgICAnJSknXG4gICAgICApO1xuXG4gICAgY2FzZSAnaHNiYSc6XG4gICAgY2FzZSAnaHN2YSc6XG4gICAgICByZXR1cm4gJ2hzYmEoJy5jb25jYXQoXG4gICAgICAgIHRoaXMuaHNiYVswXSAqIHRoaXMubWF4ZXNbY29uc3RhbnRzLkhTQl1bMF0sXG4gICAgICAgICcsICcsXG4gICAgICAgIHRoaXMuaHNiYVsxXSAqIHRoaXMubWF4ZXNbY29uc3RhbnRzLkhTQl1bMV0sXG4gICAgICAgICcsICcsXG4gICAgICAgIHRoaXMuaHNiYVsyXSAqIHRoaXMubWF4ZXNbY29uc3RhbnRzLkhTQl1bMl0sXG4gICAgICAgICcsICcsXG4gICAgICAgIGFscGhhLFxuICAgICAgICAnKSdcbiAgICAgICk7XG5cbiAgICBjYXNlICdoc2JhJSc6XG4gICAgY2FzZSAnaHN2YSUnOlxuICAgICAgcmV0dXJuICdoc2JhKCcuY29uY2F0KFxuICAgICAgICAoMTAwICogdGhpcy5oc2JhWzBdKS50b1ByZWNpc2lvbigzKSxcbiAgICAgICAgJyUsICcsXG4gICAgICAgICgxMDAgKiB0aGlzLmhzYmFbMV0pLnRvUHJlY2lzaW9uKDMpLFxuICAgICAgICAnJSwgJyxcbiAgICAgICAgKDEwMCAqIHRoaXMuaHNiYVsyXSkudG9QcmVjaXNpb24oMyksXG4gICAgICAgICclLCAnLFxuICAgICAgICAoMTAwICogYWxwaGEpLnRvUHJlY2lzaW9uKDMpLFxuICAgICAgICAnJSknXG4gICAgICApO1xuXG4gICAgY2FzZSAnaHNsJzpcbiAgICAgIHJldHVybiAnaHNsKCcuY29uY2F0KFxuICAgICAgICB0aGlzLmhzbGFbMF0gKiB0aGlzLm1heGVzW2NvbnN0YW50cy5IU0xdWzBdLFxuICAgICAgICAnLCAnLFxuICAgICAgICB0aGlzLmhzbGFbMV0gKiB0aGlzLm1heGVzW2NvbnN0YW50cy5IU0xdWzFdLFxuICAgICAgICAnLCAnLFxuICAgICAgICB0aGlzLmhzbGFbMl0gKiB0aGlzLm1heGVzW2NvbnN0YW50cy5IU0xdWzJdLFxuICAgICAgICAnKSdcbiAgICAgICk7XG5cbiAgICBjYXNlICdoc2wlJzpcbiAgICAgIHJldHVybiAnaHNsKCcuY29uY2F0KFxuICAgICAgICAoMTAwICogdGhpcy5oc2xhWzBdKS50b1ByZWNpc2lvbigzKSxcbiAgICAgICAgJyUsICcsXG4gICAgICAgICgxMDAgKiB0aGlzLmhzbGFbMV0pLnRvUHJlY2lzaW9uKDMpLFxuICAgICAgICAnJSwgJyxcbiAgICAgICAgKDEwMCAqIHRoaXMuaHNsYVsyXSkudG9QcmVjaXNpb24oMyksXG4gICAgICAgICclKSdcbiAgICAgICk7XG5cbiAgICBjYXNlICdoc2xhJzpcbiAgICAgIHJldHVybiAnaHNsYSgnLmNvbmNhdChcbiAgICAgICAgdGhpcy5oc2xhWzBdICogdGhpcy5tYXhlc1tjb25zdGFudHMuSFNMXVswXSxcbiAgICAgICAgJywgJyxcbiAgICAgICAgdGhpcy5oc2xhWzFdICogdGhpcy5tYXhlc1tjb25zdGFudHMuSFNMXVsxXSxcbiAgICAgICAgJywgJyxcbiAgICAgICAgdGhpcy5oc2xhWzJdICogdGhpcy5tYXhlc1tjb25zdGFudHMuSFNMXVsyXSxcbiAgICAgICAgJywgJyxcbiAgICAgICAgYWxwaGEsXG4gICAgICAgICcpJ1xuICAgICAgKTtcblxuICAgIGNhc2UgJ2hzbGElJzpcbiAgICAgIHJldHVybiAnaHNsKCcuY29uY2F0KFxuICAgICAgICAoMTAwICogdGhpcy5oc2xhWzBdKS50b1ByZWNpc2lvbigzKSxcbiAgICAgICAgJyUsICcsXG4gICAgICAgICgxMDAgKiB0aGlzLmhzbGFbMV0pLnRvUHJlY2lzaW9uKDMpLFxuICAgICAgICAnJSwgJyxcbiAgICAgICAgKDEwMCAqIHRoaXMuaHNsYVsyXSkudG9QcmVjaXNpb24oMyksXG4gICAgICAgICclLCAnLFxuICAgICAgICAoMTAwICogYWxwaGEpLnRvUHJlY2lzaW9uKDMpLFxuICAgICAgICAnJSknXG4gICAgICApO1xuXG4gICAgY2FzZSAncmdiYSc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAncmdiYSgnICsgYVswXSArICcsJyArIGFbMV0gKyAnLCcgKyBhWzJdICsgJywnICsgYWxwaGEgKyAnKSc7XG4gIH1cbn07XG5cbi8qKlxuICogQG1ldGhvZCBzZXRSZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSByZWQgdGhlIG5ldyByZWQgdmFsdWVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYmFja2dyb3VuZENvbG9yO1xuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBiYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcigxMDAsIDUwLCAxNTApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmRDb2xvci5zZXRSZWQoMTI4ICsgMTI4ICogc2luKG1pbGxpcygpIC8gMTAwMCkpO1xuICogICBiYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBjYW52YXMgd2l0aCBncmFkdWFsbHkgY2hhbmdpbmcgYmFja2dyb3VuZCBjb2xvclxuICovXG5wNS5Db2xvci5wcm90b3R5cGUuc2V0UmVkID0gZnVuY3Rpb24obmV3X3JlZCkge1xuICB0aGlzLl9hcnJheVswXSA9IG5ld19yZWQgLyB0aGlzLm1heGVzW2NvbnN0YW50cy5SR0JdWzBdO1xuICB0aGlzLl9jYWxjdWxhdGVMZXZlbHMoKTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBzZXRHcmVlblxuICogQHBhcmFtIHtOdW1iZXJ9IGdyZWVuIHRoZSBuZXcgZ3JlZW4gdmFsdWVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYmFja2dyb3VuZENvbG9yO1xuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBiYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcigxMDAsIDUwLCAxNTApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmRDb2xvci5zZXRHcmVlbigxMjggKyAxMjggKiBzaW4obWlsbGlzKCkgLyAxMDAwKSk7XG4gKiAgIGJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGNhbnZhcyB3aXRoIGdyYWR1YWxseSBjaGFuZ2luZyBiYWNrZ3JvdW5kIGNvbG9yXG4gKiovXG5wNS5Db2xvci5wcm90b3R5cGUuc2V0R3JlZW4gPSBmdW5jdGlvbihuZXdfZ3JlZW4pIHtcbiAgdGhpcy5fYXJyYXlbMV0gPSBuZXdfZ3JlZW4gLyB0aGlzLm1heGVzW2NvbnN0YW50cy5SR0JdWzFdO1xuICB0aGlzLl9jYWxjdWxhdGVMZXZlbHMoKTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBzZXRCbHVlXG4gKiBAcGFyYW0ge051bWJlcn0gYmx1ZSB0aGUgbmV3IGJsdWUgdmFsdWVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYmFja2dyb3VuZENvbG9yO1xuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBiYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcigxMDAsIDUwLCAxNTApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmRDb2xvci5zZXRCbHVlKDEyOCArIDEyOCAqIHNpbihtaWxsaXMoKSAvIDEwMDApKTtcbiAqICAgYmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogY2FudmFzIHdpdGggZ3JhZHVhbGx5IGNoYW5naW5nIGJhY2tncm91bmQgY29sb3JcbiAqKi9cbnA1LkNvbG9yLnByb3RvdHlwZS5zZXRCbHVlID0gZnVuY3Rpb24obmV3X2JsdWUpIHtcbiAgdGhpcy5fYXJyYXlbMl0gPSBuZXdfYmx1ZSAvIHRoaXMubWF4ZXNbY29uc3RhbnRzLlJHQl1bMl07XG4gIHRoaXMuX2NhbGN1bGF0ZUxldmVscygpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIHNldEFscGhhXG4gKiBAcGFyYW0ge051bWJlcn0gYWxwaGEgdGhlIG5ldyBhbHBoYSB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBzcXVhcmVDb2xvcjtcbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgZWxsaXBzZU1vZGUoQ09STkVSUyk7XG4gKiAgIHN0cm9rZVdlaWdodCg0KTtcbiAqICAgc3F1YXJlQ29sb3IgPSBjb2xvcigxMDAsIDUwLCAxNTApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjU1KTtcbiAqXG4gKiAgIG5vRmlsbCgpO1xuICogICBzdHJva2UoMCk7XG4gKiAgIGVsbGlwc2UoMTAsIDEwLCB3aWR0aCAtIDEwLCBoZWlnaHQgLSAxMCk7XG4gKlxuICogICBzcXVhcmVDb2xvci5zZXRBbHBoYSgxMjggKyAxMjggKiBzaW4obWlsbGlzKCkgLyAxMDAwKSk7XG4gKiAgIGZpbGwoc3F1YXJlQ29sb3IpO1xuICogICBub1N0cm9rZSgpO1xuICogICByZWN0KDEzLCAxMywgd2lkdGggLSAyNiwgaGVpZ2h0IC0gMjYpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogY2lyY2xlIGJlaGluZCBhIHNxdWFyZSB3aXRoIGdyYWR1YWxseSBjaGFuZ2luZyBvcGFjaXR5XG4gKiovXG5wNS5Db2xvci5wcm90b3R5cGUuc2V0QWxwaGEgPSBmdW5jdGlvbihuZXdfYWxwaGEpIHtcbiAgdGhpcy5fYXJyYXlbM10gPSBuZXdfYWxwaGEgLyB0aGlzLm1heGVzW3RoaXMubW9kZV1bM107XG4gIHRoaXMuX2NhbGN1bGF0ZUxldmVscygpO1xufTtcblxuLy8gY2FsY3VsYXRlcyBhbmQgc3RvcmVzIHRoZSBjbG9zZXN0IHNjcmVlbiBsZXZlbHNcbnA1LkNvbG9yLnByb3RvdHlwZS5fY2FsY3VsYXRlTGV2ZWxzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMubGV2ZWxzID0gdGhpcy5fYXJyYXkubWFwKGZ1bmN0aW9uKGxldmVsKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobGV2ZWwgKiAyNTUpO1xuICB9KTtcbn07XG5cbnA1LkNvbG9yLnByb3RvdHlwZS5fZ2V0QWxwaGEgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2FycmF5WzNdICogdGhpcy5tYXhlc1t0aGlzLm1vZGVdWzNdO1xufTtcblxuLy8gc3RvcmVzIHRoZSBjb2xvciBtb2RlIGFuZCBtYXhlcyBpbiB0aGlzIGluc3RhbmNlIG9mIENvbG9yXG4vLyBmb3IgbGF0ZXIgdXNlIChieSBfcGFyc2VJbnB1dHMoKSlcbnA1LkNvbG9yLnByb3RvdHlwZS5fc3RvcmVNb2RlQW5kTWF4ZXMgPSBmdW5jdGlvbihuZXdfbW9kZSwgbmV3X21heGVzKSB7XG4gIHRoaXMubW9kZSA9IG5ld19tb2RlO1xuICB0aGlzLm1heGVzID0gbmV3X21heGVzO1xufTtcblxucDUuQ29sb3IucHJvdG90eXBlLl9nZXRNb2RlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm1vZGU7XG59O1xuXG5wNS5Db2xvci5wcm90b3R5cGUuX2dldE1heGVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm1heGVzO1xufTtcblxucDUuQ29sb3IucHJvdG90eXBlLl9nZXRCbHVlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcnJheVsyXSAqIHRoaXMubWF4ZXNbY29uc3RhbnRzLlJHQl1bMl07XG59O1xuXG5wNS5Db2xvci5wcm90b3R5cGUuX2dldEJyaWdodG5lc3MgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmhzYmEpIHtcbiAgICB0aGlzLmhzYmEgPSBjb2xvcl9jb252ZXJzaW9uLl9yZ2JhVG9IU0JBKHRoaXMuX2FycmF5KTtcbiAgfVxuICByZXR1cm4gdGhpcy5oc2JhWzJdICogdGhpcy5tYXhlc1tjb25zdGFudHMuSFNCXVsyXTtcbn07XG5cbnA1LkNvbG9yLnByb3RvdHlwZS5fZ2V0R3JlZW4gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2FycmF5WzFdICogdGhpcy5tYXhlc1tjb25zdGFudHMuUkdCXVsxXTtcbn07XG5cbi8qKlxuICogSHVlIGlzIHRoZSBzYW1lIGluIEhTQiBhbmQgSFNMLCBidXQgdGhlIG1heGltdW0gdmFsdWUgbWF5IGJlIGRpZmZlcmVudC5cbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIEhTQi1ub3JtYWxpemVkIHNhdHVyYXRpb24gd2hlbiBzdXBwbGllZCB3aXRoXG4gKiBhbiBIU0IgY29sb3Igb2JqZWN0LCBidXQgd2lsbCBkZWZhdWx0IHRvIHRoZSBIU0wtbm9ybWFsaXplZCBzYXR1cmF0aW9uXG4gKiBvdGhlcndpc2UuXG4gKi9cbnA1LkNvbG9yLnByb3RvdHlwZS5fZ2V0SHVlID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLm1vZGUgPT09IGNvbnN0YW50cy5IU0IpIHtcbiAgICBpZiAoIXRoaXMuaHNiYSkge1xuICAgICAgdGhpcy5oc2JhID0gY29sb3JfY29udmVyc2lvbi5fcmdiYVRvSFNCQSh0aGlzLl9hcnJheSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhzYmFbMF0gKiB0aGlzLm1heGVzW2NvbnN0YW50cy5IU0JdWzBdO1xuICB9IGVsc2Uge1xuICAgIGlmICghdGhpcy5oc2xhKSB7XG4gICAgICB0aGlzLmhzbGEgPSBjb2xvcl9jb252ZXJzaW9uLl9yZ2JhVG9IU0xBKHRoaXMuX2FycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHNsYVswXSAqIHRoaXMubWF4ZXNbY29uc3RhbnRzLkhTTF1bMF07XG4gIH1cbn07XG5cbnA1LkNvbG9yLnByb3RvdHlwZS5fZ2V0TGlnaHRuZXNzID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5oc2xhKSB7XG4gICAgdGhpcy5oc2xhID0gY29sb3JfY29udmVyc2lvbi5fcmdiYVRvSFNMQSh0aGlzLl9hcnJheSk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuaHNsYVsyXSAqIHRoaXMubWF4ZXNbY29uc3RhbnRzLkhTTF1bMl07XG59O1xuXG5wNS5Db2xvci5wcm90b3R5cGUuX2dldFJlZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXlbMF0gKiB0aGlzLm1heGVzW2NvbnN0YW50cy5SR0JdWzBdO1xufTtcblxuLyoqXG4gKiBTYXR1cmF0aW9uIGlzIHNjYWxlZCBkaWZmZXJlbnRseSBpbiBIU0IgYW5kIEhTTC4gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogdGhlIEhTQiBzYXR1cmF0aW9uIHdoZW4gc3VwcGxpZWQgd2l0aCBhbiBIU0IgY29sb3Igb2JqZWN0LCBidXQgd2lsbCBkZWZhdWx0XG4gKiB0byB0aGUgSFNMIHNhdHVyYXRpb24gb3RoZXJ3aXNlLlxuICovXG5wNS5Db2xvci5wcm90b3R5cGUuX2dldFNhdHVyYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMubW9kZSA9PT0gY29uc3RhbnRzLkhTQikge1xuICAgIGlmICghdGhpcy5oc2JhKSB7XG4gICAgICB0aGlzLmhzYmEgPSBjb2xvcl9jb252ZXJzaW9uLl9yZ2JhVG9IU0JBKHRoaXMuX2FycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHNiYVsxXSAqIHRoaXMubWF4ZXNbY29uc3RhbnRzLkhTQl1bMV07XG4gIH0gZWxzZSB7XG4gICAgaWYgKCF0aGlzLmhzbGEpIHtcbiAgICAgIHRoaXMuaHNsYSA9IGNvbG9yX2NvbnZlcnNpb24uX3JnYmFUb0hTTEEodGhpcy5fYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oc2xhWzFdICogdGhpcy5tYXhlc1tjb25zdGFudHMuSFNMXVsxXTtcbiAgfVxufTtcblxuLyoqXG4gKiBDU1MgbmFtZWQgY29sb3JzLlxuICovXG52YXIgbmFtZWRDb2xvcnMgPSB7XG4gIGFsaWNlYmx1ZTogJyNmMGY4ZmYnLFxuICBhbnRpcXVld2hpdGU6ICcjZmFlYmQ3JyxcbiAgYXF1YTogJyMwMGZmZmYnLFxuICBhcXVhbWFyaW5lOiAnIzdmZmZkNCcsXG4gIGF6dXJlOiAnI2YwZmZmZicsXG4gIGJlaWdlOiAnI2Y1ZjVkYycsXG4gIGJpc3F1ZTogJyNmZmU0YzQnLFxuICBibGFjazogJyMwMDAwMDAnLFxuICBibGFuY2hlZGFsbW9uZDogJyNmZmViY2QnLFxuICBibHVlOiAnIzAwMDBmZicsXG4gIGJsdWV2aW9sZXQ6ICcjOGEyYmUyJyxcbiAgYnJvd246ICcjYTUyYTJhJyxcbiAgYnVybHl3b29kOiAnI2RlYjg4NycsXG4gIGNhZGV0Ymx1ZTogJyM1ZjllYTAnLFxuICBjaGFydHJldXNlOiAnIzdmZmYwMCcsXG4gIGNob2NvbGF0ZTogJyNkMjY5MWUnLFxuICBjb3JhbDogJyNmZjdmNTAnLFxuICBjb3JuZmxvd2VyYmx1ZTogJyM2NDk1ZWQnLFxuICBjb3Juc2lsazogJyNmZmY4ZGMnLFxuICBjcmltc29uOiAnI2RjMTQzYycsXG4gIGN5YW46ICcjMDBmZmZmJyxcbiAgZGFya2JsdWU6ICcjMDAwMDhiJyxcbiAgZGFya2N5YW46ICcjMDA4YjhiJyxcbiAgZGFya2dvbGRlbnJvZDogJyNiODg2MGInLFxuICBkYXJrZ3JheTogJyNhOWE5YTknLFxuICBkYXJrZ3JlZW46ICcjMDA2NDAwJyxcbiAgZGFya2dyZXk6ICcjYTlhOWE5JyxcbiAgZGFya2toYWtpOiAnI2JkYjc2YicsXG4gIGRhcmttYWdlbnRhOiAnIzhiMDA4YicsXG4gIGRhcmtvbGl2ZWdyZWVuOiAnIzU1NmIyZicsXG4gIGRhcmtvcmFuZ2U6ICcjZmY4YzAwJyxcbiAgZGFya29yY2hpZDogJyM5OTMyY2MnLFxuICBkYXJrcmVkOiAnIzhiMDAwMCcsXG4gIGRhcmtzYWxtb246ICcjZTk5NjdhJyxcbiAgZGFya3NlYWdyZWVuOiAnIzhmYmM4ZicsXG4gIGRhcmtzbGF0ZWJsdWU6ICcjNDgzZDhiJyxcbiAgZGFya3NsYXRlZ3JheTogJyMyZjRmNGYnLFxuICBkYXJrc2xhdGVncmV5OiAnIzJmNGY0ZicsXG4gIGRhcmt0dXJxdW9pc2U6ICcjMDBjZWQxJyxcbiAgZGFya3Zpb2xldDogJyM5NDAwZDMnLFxuICBkZWVwcGluazogJyNmZjE0OTMnLFxuICBkZWVwc2t5Ymx1ZTogJyMwMGJmZmYnLFxuICBkaW1ncmF5OiAnIzY5Njk2OScsXG4gIGRpbWdyZXk6ICcjNjk2OTY5JyxcbiAgZG9kZ2VyYmx1ZTogJyMxZTkwZmYnLFxuICBmaXJlYnJpY2s6ICcjYjIyMjIyJyxcbiAgZmxvcmFsd2hpdGU6ICcjZmZmYWYwJyxcbiAgZm9yZXN0Z3JlZW46ICcjMjI4YjIyJyxcbiAgZnVjaHNpYTogJyNmZjAwZmYnLFxuICBnYWluc2Jvcm86ICcjZGNkY2RjJyxcbiAgZ2hvc3R3aGl0ZTogJyNmOGY4ZmYnLFxuICBnb2xkOiAnI2ZmZDcwMCcsXG4gIGdvbGRlbnJvZDogJyNkYWE1MjAnLFxuICBncmF5OiAnIzgwODA4MCcsXG4gIGdyZWVuOiAnIzAwODAwMCcsXG4gIGdyZWVueWVsbG93OiAnI2FkZmYyZicsXG4gIGdyZXk6ICcjODA4MDgwJyxcbiAgaG9uZXlkZXc6ICcjZjBmZmYwJyxcbiAgaG90cGluazogJyNmZjY5YjQnLFxuICBpbmRpYW5yZWQ6ICcjY2Q1YzVjJyxcbiAgaW5kaWdvOiAnIzRiMDA4MicsXG4gIGl2b3J5OiAnI2ZmZmZmMCcsXG4gIGtoYWtpOiAnI2YwZTY4YycsXG4gIGxhdmVuZGVyOiAnI2U2ZTZmYScsXG4gIGxhdmVuZGVyYmx1c2g6ICcjZmZmMGY1JyxcbiAgbGF3bmdyZWVuOiAnIzdjZmMwMCcsXG4gIGxlbW9uY2hpZmZvbjogJyNmZmZhY2QnLFxuICBsaWdodGJsdWU6ICcjYWRkOGU2JyxcbiAgbGlnaHRjb3JhbDogJyNmMDgwODAnLFxuICBsaWdodGN5YW46ICcjZTBmZmZmJyxcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6ICcjZmFmYWQyJyxcbiAgbGlnaHRncmF5OiAnI2QzZDNkMycsXG4gIGxpZ2h0Z3JlZW46ICcjOTBlZTkwJyxcbiAgbGlnaHRncmV5OiAnI2QzZDNkMycsXG4gIGxpZ2h0cGluazogJyNmZmI2YzEnLFxuICBsaWdodHNhbG1vbjogJyNmZmEwN2EnLFxuICBsaWdodHNlYWdyZWVuOiAnIzIwYjJhYScsXG4gIGxpZ2h0c2t5Ymx1ZTogJyM4N2NlZmEnLFxuICBsaWdodHNsYXRlZ3JheTogJyM3Nzg4OTknLFxuICBsaWdodHNsYXRlZ3JleTogJyM3Nzg4OTknLFxuICBsaWdodHN0ZWVsYmx1ZTogJyNiMGM0ZGUnLFxuICBsaWdodHllbGxvdzogJyNmZmZmZTAnLFxuICBsaW1lOiAnIzAwZmYwMCcsXG4gIGxpbWVncmVlbjogJyMzMmNkMzInLFxuICBsaW5lbjogJyNmYWYwZTYnLFxuICBtYWdlbnRhOiAnI2ZmMDBmZicsXG4gIG1hcm9vbjogJyM4MDAwMDAnLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAnIzY2Y2RhYScsXG4gIG1lZGl1bWJsdWU6ICcjMDAwMGNkJyxcbiAgbWVkaXVtb3JjaGlkOiAnI2JhNTVkMycsXG4gIG1lZGl1bXB1cnBsZTogJyM5MzcwZGInLFxuICBtZWRpdW1zZWFncmVlbjogJyMzY2IzNzEnLFxuICBtZWRpdW1zbGF0ZWJsdWU6ICcjN2I2OGVlJyxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46ICcjMDBmYTlhJyxcbiAgbWVkaXVtdHVycXVvaXNlOiAnIzQ4ZDFjYycsXG4gIG1lZGl1bXZpb2xldHJlZDogJyNjNzE1ODUnLFxuICBtaWRuaWdodGJsdWU6ICcjMTkxOTcwJyxcbiAgbWludGNyZWFtOiAnI2Y1ZmZmYScsXG4gIG1pc3R5cm9zZTogJyNmZmU0ZTEnLFxuICBtb2NjYXNpbjogJyNmZmU0YjUnLFxuICBuYXZham93aGl0ZTogJyNmZmRlYWQnLFxuICBuYXZ5OiAnIzAwMDA4MCcsXG4gIG9sZGxhY2U6ICcjZmRmNWU2JyxcbiAgb2xpdmU6ICcjODA4MDAwJyxcbiAgb2xpdmVkcmFiOiAnIzZiOGUyMycsXG4gIG9yYW5nZTogJyNmZmE1MDAnLFxuICBvcmFuZ2VyZWQ6ICcjZmY0NTAwJyxcbiAgb3JjaGlkOiAnI2RhNzBkNicsXG4gIHBhbGVnb2xkZW5yb2Q6ICcjZWVlOGFhJyxcbiAgcGFsZWdyZWVuOiAnIzk4ZmI5OCcsXG4gIHBhbGV0dXJxdW9pc2U6ICcjYWZlZWVlJyxcbiAgcGFsZXZpb2xldHJlZDogJyNkYjcwOTMnLFxuICBwYXBheWF3aGlwOiAnI2ZmZWZkNScsXG4gIHBlYWNocHVmZjogJyNmZmRhYjknLFxuICBwZXJ1OiAnI2NkODUzZicsXG4gIHBpbms6ICcjZmZjMGNiJyxcbiAgcGx1bTogJyNkZGEwZGQnLFxuICBwb3dkZXJibHVlOiAnI2IwZTBlNicsXG4gIHB1cnBsZTogJyM4MDAwODAnLFxuICByZWQ6ICcjZmYwMDAwJyxcbiAgcm9zeWJyb3duOiAnI2JjOGY4ZicsXG4gIHJveWFsYmx1ZTogJyM0MTY5ZTEnLFxuICBzYWRkbGVicm93bjogJyM4YjQ1MTMnLFxuICBzYWxtb246ICcjZmE4MDcyJyxcbiAgc2FuZHlicm93bjogJyNmNGE0NjAnLFxuICBzZWFncmVlbjogJyMyZThiNTcnLFxuICBzZWFzaGVsbDogJyNmZmY1ZWUnLFxuICBzaWVubmE6ICcjYTA1MjJkJyxcbiAgc2lsdmVyOiAnI2MwYzBjMCcsXG4gIHNreWJsdWU6ICcjODdjZWViJyxcbiAgc2xhdGVibHVlOiAnIzZhNWFjZCcsXG4gIHNsYXRlZ3JheTogJyM3MDgwOTAnLFxuICBzbGF0ZWdyZXk6ICcjNzA4MDkwJyxcbiAgc25vdzogJyNmZmZhZmEnLFxuICBzcHJpbmdncmVlbjogJyMwMGZmN2YnLFxuICBzdGVlbGJsdWU6ICcjNDY4MmI0JyxcbiAgdGFuOiAnI2QyYjQ4YycsXG4gIHRlYWw6ICcjMDA4MDgwJyxcbiAgdGhpc3RsZTogJyNkOGJmZDgnLFxuICB0b21hdG86ICcjZmY2MzQ3JyxcbiAgdHVycXVvaXNlOiAnIzQwZTBkMCcsXG4gIHZpb2xldDogJyNlZTgyZWUnLFxuICB3aGVhdDogJyNmNWRlYjMnLFxuICB3aGl0ZTogJyNmZmZmZmYnLFxuICB3aGl0ZXNtb2tlOiAnI2Y1ZjVmNScsXG4gIHllbGxvdzogJyNmZmZmMDAnLFxuICB5ZWxsb3dncmVlbjogJyM5YWNkMzInXG59O1xuXG4vKipcbiAqIFRoZXNlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIHBhdHRlcm5zIGZvciBtYXRjaGluZ1xuICogdmlhYmxlIENTUyBjb2xvciBzdHJpbmdzOiBmcmFnbWVudGluZyB0aGUgcmVnZXhlcyBpbiB0aGlzIHdheSBpbmNyZWFzZXMgdGhlXG4gKiBsZWdpYmlsaXR5IGFuZCBjb21wcmVoZW5zaWJpbGl0eSBvZiB0aGUgY29kZS5cbiAqXG4gKiBOb3RlIHRoYXQgUkdCIHZhbHVlcyBvZiAuOSBhcmUgbm90IHBhcnNlZCBieSBJRSwgYnV0IGFyZSBzdXBwb3J0ZWQgaGVyZSBmb3JcbiAqIGNvbG9yIHN0cmluZyBjb25zaXN0ZW5jeS5cbiAqL1xudmFyIFdISVRFU1BBQ0UgPSAvXFxzKi87IC8vIE1hdGNoIHplcm8gb3IgbW9yZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuXG52YXIgSU5URUdFUiA9IC8oXFxkezEsM30pLzsgLy8gTWF0Y2ggaW50ZWdlcnM6IDc5LCAyNTUsIGV0Yy5cbnZhciBERUNJTUFMID0gLygoPzpcXGQrKD86XFwuXFxkKyk/KXwoPzpcXC5cXGQrKSkvOyAvLyBNYXRjaCAxMjkuNiwgNzksIC45LCBldGMuXG52YXIgUEVSQ0VOVCA9IG5ldyBSZWdFeHAoREVDSU1BTC5zb3VyY2UgKyAnJScpOyAvLyBNYXRjaCAxMi45JSwgNzklLCAuOSUsIGV0Yy5cblxuLyoqXG4gKiBGdWxsIGNvbG9yIHN0cmluZyBwYXR0ZXJucy4gVGhlIGNhcHR1cmUgZ3JvdXBzIGFyZSBuZWNlc3NhcnkuXG4gKi9cbnZhciBjb2xvclBhdHRlcm5zID0ge1xuICAvLyBNYXRjaCBjb2xvcnMgaW4gZm9ybWF0ICNYWFgsIGUuZy4gIzQxNi5cbiAgSEVYMzogL14jKFthLWYwLTldKShbYS1mMC05XSkoW2EtZjAtOV0pJC9pLFxuXG4gIC8vIE1hdGNoIGNvbG9ycyBpbiBmb3JtYXQgI1hYWFgsIGUuZy4gIzUxMjMuXG4gIEhFWDQ6IC9eIyhbYS1mMC05XSkoW2EtZjAtOV0pKFthLWYwLTldKShbYS1mMC05XSkkL2ksXG5cbiAgLy8gTWF0Y2ggY29sb3JzIGluIGZvcm1hdCAjWFhYWFhYLCBlLmcuICNiNGQ0NTUuXG4gIEhFWDY6IC9eIyhbYS1mMC05XXsyfSkoW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KSQvaSxcblxuICAvLyBNYXRjaCBjb2xvcnMgaW4gZm9ybWF0ICNYWFhYWFhYWCwgZS5nLiAjYjRkNDU1MzUuXG4gIEhFWDg6IC9eIyhbYS1mMC05XXsyfSkoW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkkL2ksXG5cbiAgLy8gTWF0Y2ggY29sb3JzIGluIGZvcm1hdCByZ2IoUiwgRywgQiksIGUuZy4gcmdiKDI1NSwgMCwgMTI4KS5cbiAgUkdCOiBuZXcgUmVnRXhwKFxuICAgIFtcbiAgICAgICdecmdiXFxcXCgnLFxuICAgICAgSU5URUdFUi5zb3VyY2UsXG4gICAgICAnLCcsXG4gICAgICBJTlRFR0VSLnNvdXJjZSxcbiAgICAgICcsJyxcbiAgICAgIElOVEVHRVIuc291cmNlLFxuICAgICAgJ1xcXFwpJCdcbiAgICBdLmpvaW4oV0hJVEVTUEFDRS5zb3VyY2UpLFxuICAgICdpJ1xuICApLFxuXG4gIC8vIE1hdGNoIGNvbG9ycyBpbiBmb3JtYXQgcmdiKFIlLCBHJSwgQiUpLCBlLmcuIHJnYigxMDAlLCAwJSwgMjguOSUpLlxuICBSR0JfUEVSQ0VOVDogbmV3IFJlZ0V4cChcbiAgICBbXG4gICAgICAnXnJnYlxcXFwoJyxcbiAgICAgIFBFUkNFTlQuc291cmNlLFxuICAgICAgJywnLFxuICAgICAgUEVSQ0VOVC5zb3VyY2UsXG4gICAgICAnLCcsXG4gICAgICBQRVJDRU5ULnNvdXJjZSxcbiAgICAgICdcXFxcKSQnXG4gICAgXS5qb2luKFdISVRFU1BBQ0Uuc291cmNlKSxcbiAgICAnaSdcbiAgKSxcblxuICAvLyBNYXRjaCBjb2xvcnMgaW4gZm9ybWF0IHJnYihSLCBHLCBCLCBBKSwgZS5nLiByZ2IoMjU1LCAwLCAxMjgsIDAuMjUpLlxuICBSR0JBOiBuZXcgUmVnRXhwKFxuICAgIFtcbiAgICAgICdecmdiYVxcXFwoJyxcbiAgICAgIElOVEVHRVIuc291cmNlLFxuICAgICAgJywnLFxuICAgICAgSU5URUdFUi5zb3VyY2UsXG4gICAgICAnLCcsXG4gICAgICBJTlRFR0VSLnNvdXJjZSxcbiAgICAgICcsJyxcbiAgICAgIERFQ0lNQUwuc291cmNlLFxuICAgICAgJ1xcXFwpJCdcbiAgICBdLmpvaW4oV0hJVEVTUEFDRS5zb3VyY2UpLFxuICAgICdpJ1xuICApLFxuXG4gIC8vIE1hdGNoIGNvbG9ycyBpbiBmb3JtYXQgcmdiKFIlLCBHJSwgQiUsIEEpLCBlLmcuIHJnYigxMDAlLCAwJSwgMjguOSUsIDAuNSkuXG4gIFJHQkFfUEVSQ0VOVDogbmV3IFJlZ0V4cChcbiAgICBbXG4gICAgICAnXnJnYmFcXFxcKCcsXG4gICAgICBQRVJDRU5ULnNvdXJjZSxcbiAgICAgICcsJyxcbiAgICAgIFBFUkNFTlQuc291cmNlLFxuICAgICAgJywnLFxuICAgICAgUEVSQ0VOVC5zb3VyY2UsXG4gICAgICAnLCcsXG4gICAgICBERUNJTUFMLnNvdXJjZSxcbiAgICAgICdcXFxcKSQnXG4gICAgXS5qb2luKFdISVRFU1BBQ0Uuc291cmNlKSxcbiAgICAnaSdcbiAgKSxcblxuICAvLyBNYXRjaCBjb2xvcnMgaW4gZm9ybWF0IGhzbGEoSCwgUyUsIEwlKSwgZS5nLiBoc2woMTAwLCA0MCUsIDI4LjklKS5cbiAgSFNMOiBuZXcgUmVnRXhwKFxuICAgIFtcbiAgICAgICdeaHNsXFxcXCgnLFxuICAgICAgSU5URUdFUi5zb3VyY2UsXG4gICAgICAnLCcsXG4gICAgICBQRVJDRU5ULnNvdXJjZSxcbiAgICAgICcsJyxcbiAgICAgIFBFUkNFTlQuc291cmNlLFxuICAgICAgJ1xcXFwpJCdcbiAgICBdLmpvaW4oV0hJVEVTUEFDRS5zb3VyY2UpLFxuICAgICdpJ1xuICApLFxuXG4gIC8vIE1hdGNoIGNvbG9ycyBpbiBmb3JtYXQgaHNsYShILCBTJSwgTCUsIEEpLCBlLmcuIGhzbGEoMTAwLCA0MCUsIDI4LjklLCAwLjUpLlxuICBIU0xBOiBuZXcgUmVnRXhwKFxuICAgIFtcbiAgICAgICdeaHNsYVxcXFwoJyxcbiAgICAgIElOVEVHRVIuc291cmNlLFxuICAgICAgJywnLFxuICAgICAgUEVSQ0VOVC5zb3VyY2UsXG4gICAgICAnLCcsXG4gICAgICBQRVJDRU5ULnNvdXJjZSxcbiAgICAgICcsJyxcbiAgICAgIERFQ0lNQUwuc291cmNlLFxuICAgICAgJ1xcXFwpJCdcbiAgICBdLmpvaW4oV0hJVEVTUEFDRS5zb3VyY2UpLFxuICAgICdpJ1xuICApLFxuXG4gIC8vIE1hdGNoIGNvbG9ycyBpbiBmb3JtYXQgaHNiKEgsIFMlLCBCJSksIGUuZy4gaHNiKDEwMCwgNDAlLCAyOC45JSkuXG4gIEhTQjogbmV3IFJlZ0V4cChcbiAgICBbXG4gICAgICAnXmhzYlxcXFwoJyxcbiAgICAgIElOVEVHRVIuc291cmNlLFxuICAgICAgJywnLFxuICAgICAgUEVSQ0VOVC5zb3VyY2UsXG4gICAgICAnLCcsXG4gICAgICBQRVJDRU5ULnNvdXJjZSxcbiAgICAgICdcXFxcKSQnXG4gICAgXS5qb2luKFdISVRFU1BBQ0Uuc291cmNlKSxcbiAgICAnaSdcbiAgKSxcblxuICAvLyBNYXRjaCBjb2xvcnMgaW4gZm9ybWF0IGhzYmEoSCwgUyUsIEIlLCBBKSwgZS5nLiBoc2JhKDEwMCwgNDAlLCAyOC45JSwgMC41KS5cbiAgSFNCQTogbmV3IFJlZ0V4cChcbiAgICBbXG4gICAgICAnXmhzYmFcXFxcKCcsXG4gICAgICBJTlRFR0VSLnNvdXJjZSxcbiAgICAgICcsJyxcbiAgICAgIFBFUkNFTlQuc291cmNlLFxuICAgICAgJywnLFxuICAgICAgUEVSQ0VOVC5zb3VyY2UsXG4gICAgICAnLCcsXG4gICAgICBERUNJTUFMLnNvdXJjZSxcbiAgICAgICdcXFxcKSQnXG4gICAgXS5qb2luKFdISVRFU1BBQ0Uuc291cmNlKSxcbiAgICAnaSdcbiAgKVxufTtcblxuLyoqXG4gKiBGb3IgYSBudW1iZXIgb2YgZGlmZmVyZW50IGlucHV0cywgcmV0dXJucyBhIGNvbG9yIGZvcm1hdHRlZCBhcyBbciwgZywgYiwgYV1cbiAqIGFycmF5cywgd2l0aCBlYWNoIGNvbXBvbmVudCBub3JtYWxpemVkIGJldHdlZW4gMCBhbmQgMS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gWy4uLmFyZ3NdIEFuICdhcnJheS1saWtlJyBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgbGlzdCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c1xuICogQHJldHVybiB7TnVtYmVyW119ICAgICAgIGEgY29sb3IgZm9ybWF0dGVkIGFzIFtyLCBnLCBiLCBhXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgICAgICAgID09PiBvdXRwdXRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBnICAgICAgICAgICAgPT0+IFtnLCBnLCBnLCAyNTVdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZyxhICAgICAgICAgID09PiBbZywgZywgZywgYV1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiICAgICAgPT0+IFtyLCBnLCBiLCAyNTVdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYiwgYSAgID09PiBbciwgZywgYiwgYV1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBbZ10gICAgICAgICAgPT0+IFtnLCBnLCBnLCAyNTVdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgW2csIGFdICAgICAgID09PiBbZywgZywgZywgYV1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBbciwgZywgYl0gICAgPT0+IFtyLCBnLCBiLCAyNTVdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgW3IsIGcsIGIsIGFdID09PiBbciwgZywgYiwgYV1cbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyB0b2RvXG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAvL3RvZG9cbiAqXG4gKi9cbnA1LkNvbG9yLl9wYXJzZUlucHV0cyA9IGZ1bmN0aW9uKHIsIGcsIGIsIGEpIHtcbiAgdmFyIG51bUFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbW9kZSA9IHRoaXMubW9kZTtcbiAgdmFyIG1heGVzID0gdGhpcy5tYXhlcztcbiAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICBpZiAobnVtQXJncyA+PSAzKSB7XG4gICAgLy8gQXJndW1lbnQgaXMgYSBsaXN0IG9mIGNvbXBvbmVudCB2YWx1ZXMuXG5cbiAgICByZXN1bHRzWzBdID0gciAvIG1heGVzW21vZGVdWzBdO1xuICAgIHJlc3VsdHNbMV0gPSBnIC8gbWF4ZXNbbW9kZV1bMV07XG4gICAgcmVzdWx0c1syXSA9IGIgLyBtYXhlc1ttb2RlXVsyXTtcblxuICAgIC8vIEFscGhhIG1heSBiZSB1bmRlZmluZWQsIHNvIGRlZmF1bHQgaXQgdG8gMTAwJS5cbiAgICBpZiAodHlwZW9mIGEgPT09ICdudW1iZXInKSB7XG4gICAgICByZXN1bHRzWzNdID0gYSAvIG1heGVzW21vZGVdWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRzWzNdID0gMTtcbiAgICB9XG5cbiAgICAvLyBDb25zdHJhaW4gY29tcG9uZW50cyB0byB0aGUgcmFuZ2UgWzAsMV0uXG4gICAgcmVzdWx0cyA9IHJlc3VsdHMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4odmFsdWUsIDEpLCAwKTtcbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgdG8gUkdCQSBhbmQgcmV0dXJuLlxuICAgIGlmIChtb2RlID09PSBjb25zdGFudHMuSFNMKSB7XG4gICAgICByZXR1cm4gY29sb3JfY29udmVyc2lvbi5faHNsYVRvUkdCQShyZXN1bHRzKTtcbiAgICB9IGVsc2UgaWYgKG1vZGUgPT09IGNvbnN0YW50cy5IU0IpIHtcbiAgICAgIHJldHVybiBjb2xvcl9jb252ZXJzaW9uLl9oc2JhVG9SR0JBKHJlc3VsdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gIH0gZWxzZSBpZiAobnVtQXJncyA9PT0gMSAmJiB0eXBlb2YgciA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgc3RyID0gci50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIFJldHVybiBpZiBzdHJpbmcgaXMgYSBuYW1lZCBjb2xvdXIuXG4gICAgaWYgKG5hbWVkQ29sb3JzW3N0cl0pIHtcbiAgICAgIHJldHVybiBwNS5Db2xvci5fcGFyc2VJbnB1dHMuY2FsbCh0aGlzLCBuYW1lZENvbG9yc1tzdHJdKTtcbiAgICB9XG5cbiAgICAvLyBUcnkgUkdCQSBwYXR0ZXJuIG1hdGNoaW5nLlxuICAgIGlmIChjb2xvclBhdHRlcm5zLkhFWDMudGVzdChzdHIpKSB7XG4gICAgICAvLyAjcmdiXG4gICAgICByZXN1bHRzID0gY29sb3JQYXR0ZXJucy5IRVgzLmV4ZWMoc3RyKVxuICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgLm1hcChmdW5jdGlvbihjb2xvcikge1xuICAgICAgICAgIHJldHVybiBwYXJzZUludChjb2xvciArIGNvbG9yLCAxNikgLyAyNTU7XG4gICAgICAgIH0pO1xuICAgICAgcmVzdWx0c1szXSA9IDE7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9IGVsc2UgaWYgKGNvbG9yUGF0dGVybnMuSEVYNi50ZXN0KHN0cikpIHtcbiAgICAgIC8vICNycmdnYmJcbiAgICAgIHJlc3VsdHMgPSBjb2xvclBhdHRlcm5zLkhFWDYuZXhlYyhzdHIpXG4gICAgICAgIC5zbGljZSgxKVxuICAgICAgICAubWFwKGZ1bmN0aW9uKGNvbG9yKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbG9yLCAxNikgLyAyNTU7XG4gICAgICAgIH0pO1xuICAgICAgcmVzdWx0c1szXSA9IDE7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9IGVsc2UgaWYgKGNvbG9yUGF0dGVybnMuSEVYNC50ZXN0KHN0cikpIHtcbiAgICAgIC8vICNyZ2JhXG4gICAgICByZXN1bHRzID0gY29sb3JQYXR0ZXJucy5IRVg0LmV4ZWMoc3RyKVxuICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgLm1hcChmdW5jdGlvbihjb2xvcikge1xuICAgICAgICAgIHJldHVybiBwYXJzZUludChjb2xvciArIGNvbG9yLCAxNikgLyAyNTU7XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSBlbHNlIGlmIChjb2xvclBhdHRlcm5zLkhFWDgudGVzdChzdHIpKSB7XG4gICAgICAvLyAjcnJnZ2JiYWFcbiAgICAgIHJlc3VsdHMgPSBjb2xvclBhdHRlcm5zLkhFWDguZXhlYyhzdHIpXG4gICAgICAgIC5zbGljZSgxKVxuICAgICAgICAubWFwKGZ1bmN0aW9uKGNvbG9yKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbG9yLCAxNikgLyAyNTU7XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSBlbHNlIGlmIChjb2xvclBhdHRlcm5zLlJHQi50ZXN0KHN0cikpIHtcbiAgICAgIC8vIHJnYihSLEcsQilcbiAgICAgIHJlc3VsdHMgPSBjb2xvclBhdHRlcm5zLlJHQi5leGVjKHN0cilcbiAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24oY29sb3IpIHtcbiAgICAgICAgICByZXR1cm4gY29sb3IgLyAyNTU7XG4gICAgICAgIH0pO1xuICAgICAgcmVzdWx0c1szXSA9IDE7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9IGVsc2UgaWYgKGNvbG9yUGF0dGVybnMuUkdCX1BFUkNFTlQudGVzdChzdHIpKSB7XG4gICAgICAvLyByZ2IoUiUsRyUsQiUpXG4gICAgICByZXN1bHRzID0gY29sb3JQYXR0ZXJucy5SR0JfUEVSQ0VOVC5leGVjKHN0cilcbiAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24oY29sb3IpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChjb2xvcikgLyAxMDA7XG4gICAgICAgIH0pO1xuICAgICAgcmVzdWx0c1szXSA9IDE7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9IGVsc2UgaWYgKGNvbG9yUGF0dGVybnMuUkdCQS50ZXN0KHN0cikpIHtcbiAgICAgIC8vIHJnYmEoUixHLEIsQSlcbiAgICAgIHJlc3VsdHMgPSBjb2xvclBhdHRlcm5zLlJHQkEuZXhlYyhzdHIpXG4gICAgICAgIC5zbGljZSgxKVxuICAgICAgICAubWFwKGZ1bmN0aW9uKGNvbG9yLCBpZHgpIHtcbiAgICAgICAgICBpZiAoaWR4ID09PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChjb2xvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb2xvciAvIDI1NTtcbiAgICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9IGVsc2UgaWYgKGNvbG9yUGF0dGVybnMuUkdCQV9QRVJDRU5ULnRlc3Qoc3RyKSkge1xuICAgICAgLy8gcmdiYShSJSxHJSxCJSxBJSlcbiAgICAgIHJlc3VsdHMgPSBjb2xvclBhdHRlcm5zLlJHQkFfUEVSQ0VOVC5leGVjKHN0cilcbiAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24oY29sb3IsIGlkeCkge1xuICAgICAgICAgIGlmIChpZHggPT09IDMpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGNvbG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoY29sb3IpIC8gMTAwO1xuICAgICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIC8vIFRyeSBIU0xBIHBhdHRlcm4gbWF0Y2hpbmcuXG4gICAgaWYgKGNvbG9yUGF0dGVybnMuSFNMLnRlc3Qoc3RyKSkge1xuICAgICAgLy8gaHNsKEgsUyxMKVxuICAgICAgcmVzdWx0cyA9IGNvbG9yUGF0dGVybnMuSFNMLmV4ZWMoc3RyKVxuICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgLm1hcChmdW5jdGlvbihjb2xvciwgaWR4KSB7XG4gICAgICAgICAgaWYgKGlkeCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbG9yLCAxMCkgLyAzNjA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJzZUludChjb2xvciwgMTApIC8gMTAwO1xuICAgICAgICB9KTtcbiAgICAgIHJlc3VsdHNbM10gPSAxO1xuICAgIH0gZWxzZSBpZiAoY29sb3JQYXR0ZXJucy5IU0xBLnRlc3Qoc3RyKSkge1xuICAgICAgLy8gaHNsYShILFMsTCxBKVxuICAgICAgcmVzdWx0cyA9IGNvbG9yUGF0dGVybnMuSFNMQS5leGVjKHN0cilcbiAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24oY29sb3IsIGlkeCkge1xuICAgICAgICAgIGlmIChpZHggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChjb2xvciwgMTApIC8gMzYwO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWR4ID09PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChjb2xvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJzZUludChjb2xvciwgMTApIC8gMTAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVzdWx0cyA9IHJlc3VsdHMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4odmFsdWUsIDEpLCAwKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjb2xvcl9jb252ZXJzaW9uLl9oc2xhVG9SR0JBKHJlc3VsdHMpO1xuICAgIH1cblxuICAgIC8vIFRyeSBIU0JBIHBhdHRlcm4gbWF0Y2hpbmcuXG4gICAgaWYgKGNvbG9yUGF0dGVybnMuSFNCLnRlc3Qoc3RyKSkge1xuICAgICAgLy8gaHNiKEgsUyxCKVxuICAgICAgcmVzdWx0cyA9IGNvbG9yUGF0dGVybnMuSFNCLmV4ZWMoc3RyKVxuICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgLm1hcChmdW5jdGlvbihjb2xvciwgaWR4KSB7XG4gICAgICAgICAgaWYgKGlkeCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbG9yLCAxMCkgLyAzNjA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJzZUludChjb2xvciwgMTApIC8gMTAwO1xuICAgICAgICB9KTtcbiAgICAgIHJlc3VsdHNbM10gPSAxO1xuICAgIH0gZWxzZSBpZiAoY29sb3JQYXR0ZXJucy5IU0JBLnRlc3Qoc3RyKSkge1xuICAgICAgLy8gaHNiYShILFMsQixBKVxuICAgICAgcmVzdWx0cyA9IGNvbG9yUGF0dGVybnMuSFNCQS5leGVjKHN0cilcbiAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24oY29sb3IsIGlkeCkge1xuICAgICAgICAgIGlmIChpZHggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChjb2xvciwgMTApIC8gMzYwO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWR4ID09PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChjb2xvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJzZUludChjb2xvciwgMTApIC8gMTAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVzdWx0cyA9IHJlc3VsdHMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4odmFsdWUsIDEpLCAwKTtcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNvbG9yX2NvbnZlcnNpb24uX2hzYmFUb1JHQkEocmVzdWx0cyk7XG4gICAgfVxuXG4gICAgLy8gSW5wdXQgZGlkIG5vdCBtYXRjaCBhbnkgQ1NTIGNvbG9yIHBhdHRlcm46IGRlZmF1bHQgdG8gd2hpdGUuXG4gICAgcmVzdWx0cyA9IFsxLCAxLCAxLCAxXTtcbiAgfSBlbHNlIGlmICgobnVtQXJncyA9PT0gMSB8fCBudW1BcmdzID09PSAyKSAmJiB0eXBlb2YgciA9PT0gJ251bWJlcicpIHtcbiAgICAvLyAnR3JheXNjYWxlJyBtb2RlLlxuXG4gICAgLyoqXG4gICAgICogRm9yIEhTQiBhbmQgSFNMLCBpbnRlcnByZXQgdGhlIGdyYXkgbGV2ZWwgYXMgYSBicmlnaHRuZXNzL2xpZ2h0bmVzc1xuICAgICAqIHZhbHVlICh0aGV5IGFyZSBlcXVpdmFsZW50IHdoZW4gY2hyb21hIGlzIHplcm8pLiBGb3IgUkdCLCBub3JtYWxpemUgdGhlXG4gICAgICogZ3JheSBsZXZlbCBhY2NvcmRpbmcgdG8gdGhlIGJsdWUgbWF4aW11bS5cbiAgICAgKi9cbiAgICByZXN1bHRzWzBdID0gciAvIG1heGVzW21vZGVdWzJdO1xuICAgIHJlc3VsdHNbMV0gPSByIC8gbWF4ZXNbbW9kZV1bMl07XG4gICAgcmVzdWx0c1syXSA9IHIgLyBtYXhlc1ttb2RlXVsyXTtcblxuICAgIC8vIEFscGhhIG1heSBiZSB1bmRlZmluZWQsIHNvIGRlZmF1bHQgaXQgdG8gMTAwJS5cbiAgICBpZiAodHlwZW9mIGcgPT09ICdudW1iZXInKSB7XG4gICAgICByZXN1bHRzWzNdID0gZyAvIG1heGVzW21vZGVdWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRzWzNdID0gMTtcbiAgICB9XG5cbiAgICAvLyBDb25zdHJhaW4gY29tcG9uZW50cyB0byB0aGUgcmFuZ2UgWzAsMV0uXG4gICAgcmVzdWx0cyA9IHJlc3VsdHMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4odmFsdWUsIDEpLCAwKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYXJndW1lbnRzICsgJ2lzIG5vdCBhIHZhbGlkIGNvbG9yIHJlcHJlc2VudGF0aW9uLicpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1LkNvbG9yO1xuXG59LHtcIi4uL2NvcmUvY29uc3RhbnRzXCI6MjEsXCIuLi9jb3JlL2NvcmVcIjoyMixcIi4vY29sb3JfY29udmVyc2lvblwiOjE0fV0sMTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIENvbG9yXG4gKiBAc3VibW9kdWxlIFNldHRpbmdcbiAqIEBmb3IgcDVcbiAqIEByZXF1aXJlcyBjb3JlXG4gKiBAcmVxdWlyZXMgY29uc3RhbnRzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuLi9jb3JlL2NvcmUnKTtcbnZhciBjb25zdGFudHMgPSBfZGVyZXFfKCcuLi9jb3JlL2NvbnN0YW50cycpO1xuX2RlcmVxXygnLi9wNS5Db2xvcicpO1xuXG4vKipcbiAqIFRoZSBiYWNrZ3JvdW5kKCkgZnVuY3Rpb24gc2V0cyB0aGUgY29sb3IgdXNlZCBmb3IgdGhlIGJhY2tncm91bmQgb2YgdGhlXG4gKiBwNS5qcyBjYW52YXMuIFRoZSBkZWZhdWx0IGJhY2tncm91bmQgaXMgbGlnaHQgZ3JheS4gVGhpcyBmdW5jdGlvbiBpc1xuICogdHlwaWNhbGx5IHVzZWQgd2l0aGluIGRyYXcoKSB0byBjbGVhciB0aGUgZGlzcGxheSB3aW5kb3cgYXQgdGhlIGJlZ2lubmluZ1xuICogb2YgZWFjaCBmcmFtZSwgYnV0IGl0IGNhbiBiZSB1c2VkIGluc2lkZSBzZXR1cCgpIHRvIHNldCB0aGUgYmFja2dyb3VuZCBvblxuICogdGhlIGZpcnN0IGZyYW1lIG9mIGFuaW1hdGlvbiBvciBpZiB0aGUgYmFja2dyb3VuZCBuZWVkIG9ubHkgYmUgc2V0IG9uY2UuXG4gKiA8YnI+PGJyPlxuICogVGhlIGNvbG9yIGlzIGVpdGhlciBzcGVjaWZpZWQgaW4gdGVybXMgb2YgdGhlIFJHQiwgSFNCLCBvciBIU0wgY29sb3JcbiAqIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2xvck1vZGUuIChUaGUgZGVmYXVsdCBjb2xvciBzcGFjZSBpcyBSR0IsIHdpdGhcbiAqIGVhY2ggdmFsdWUgaW4gdGhlIHJhbmdlIGZyb20gMCB0byAyNTUpLiBUaGUgYWxwaGEgcmFuZ2UgYnkgZGVmYXVsdCBpcyBhbHNvIDAgdG8gMjU1LlxuICogPGJyPjxicj5cbiAqIElmIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudCBpcyBwcm92aWRlZCwgUkdCLCBSR0JBIGFuZCBIZXggQ1NTIGNvbG9yIHN0cmluZ3NcbiAqIGFuZCBhbGwgbmFtZWQgY29sb3Igc3RyaW5ncyBhcmUgc3VwcG9ydGVkLiBJbiB0aGlzIGNhc2UsIGFuIGFscGhhIG51bWJlclxuICogdmFsdWUgYXMgYSBzZWNvbmQgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZCwgdGhlIFJHQkEgZm9ybSBzaG91bGQgYmUgdXNlZC5cbiAqIDxicj48YnI+XG4gKiBBIHA1LkNvbG9yIG9iamVjdCBjYW4gYWxzbyBiZSBwcm92aWRlZCB0byBzZXQgdGhlIGJhY2tncm91bmQgY29sb3IuXG4gKiA8YnI+PGJyPlxuICogQSBwNS5JbWFnZSBjYW4gYWxzbyBiZSBwcm92aWRlZCB0byBzZXQgdGhlIGJhY2tncm91bmQgaW1hZ2UuXG4gKlxuICogQG1ldGhvZCBiYWNrZ3JvdW5kXG4gKiBAcGFyYW0ge3A1LkNvbG9yfSBjb2xvciAgICAgYW55IHZhbHVlIGNyZWF0ZWQgYnkgdGhlIGNvbG9yKCkgZnVuY3Rpb25cbiAqIEBjaGFpbmFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gR3JheXNjYWxlIGludGVnZXIgdmFsdWVcbiAqIGJhY2tncm91bmQoNTEpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gUiwgRyAmIEIgaW50ZWdlciB2YWx1ZXNcbiAqIGJhY2tncm91bmQoMjU1LCAyMDQsIDApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gSCwgUyAmIEIgaW50ZWdlciB2YWx1ZXNcbiAqIGNvbG9yTW9kZShIU0IpO1xuICogYmFja2dyb3VuZCgyNTUsIDIwNCwgMTAwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIE5hbWVkIFNWRy9DU1MgY29sb3Igc3RyaW5nXG4gKiBiYWNrZ3JvdW5kKCdyZWQnKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIHRocmVlLWRpZ2l0IGhleGFkZWNpbWFsIFJHQiBub3RhdGlvblxuICogYmFja2dyb3VuZCgnI2ZhZScpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gc2l4LWRpZ2l0IGhleGFkZWNpbWFsIFJHQiBub3RhdGlvblxuICogYmFja2dyb3VuZCgnIzIyMjIyMicpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gaW50ZWdlciBSR0Igbm90YXRpb25cbiAqIGJhY2tncm91bmQoJ3JnYigwLDI1NSwwKScpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gaW50ZWdlciBSR0JBIG5vdGF0aW9uXG4gKiBiYWNrZ3JvdW5kKCdyZ2JhKDAsMjU1LDAsIDAuMjUpJyk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBwZXJjZW50YWdlIFJHQiBub3RhdGlvblxuICogYmFja2dyb3VuZCgncmdiKDEwMCUsMCUsMTAlKScpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gcGVyY2VudGFnZSBSR0JBIG5vdGF0aW9uXG4gKiBiYWNrZ3JvdW5kKCdyZ2JhKDEwMCUsMCUsMTAwJSwwLjUpJyk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBwNSBDb2xvciBvYmplY3RcbiAqIGJhY2tncm91bmQoY29sb3IoMCwgMCwgMjU1KSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBjYW52YXMgd2l0aCBkYXJrZXN0IGNoYXJjb2FsIGdyZXkgYmFja2dyb3VuZC5cbiAqIGNhbnZhcyB3aXRoIHllbGxvdyBiYWNrZ3JvdW5kLlxuICogY2FudmFzIHdpdGggcm95YWwgYmx1ZSBiYWNrZ3JvdW5kLlxuICogY2FudmFzIHdpdGggcmVkIGJhY2tncm91bmQuXG4gKiBjYW52YXMgd2l0aCBwaW5rIGJhY2tncm91bmQuXG4gKiBjYW52YXMgd2l0aCBibGFjayBiYWNrZ3JvdW5kLlxuICogY2FudmFzIHdpdGggYnJpZ2h0IGdyZWVuIGJhY2tncm91bmQuXG4gKiBjYW52YXMgd2l0aCBzb2Z0IGdyZWVuIGJhY2tncm91bmQuXG4gKiBjYW52YXMgd2l0aCByZWQgYmFja2dyb3VuZC5cbiAqIGNhbnZhcyB3aXRoIGxpZ2h0IHB1cnBsZSBiYWNrZ3JvdW5kLlxuICogY2FudmFzIHdpdGggYmx1ZSBiYWNrZ3JvdW5kLlxuICovXG5cbi8qKlxuICogQG1ldGhvZCBiYWNrZ3JvdW5kXG4gKiBAcGFyYW0ge1N0cmluZ30gY29sb3JzdHJpbmcgY29sb3Igc3RyaW5nLCBwb3NzaWJsZSBmb3JtYXRzIGluY2x1ZGU6IGludGVnZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHJnYigpIG9yIHJnYmEoKSwgcGVyY2VudGFnZSByZ2IoKSBvciByZ2JhKCksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAzLWRpZ2l0IGhleCwgNi1kaWdpdCBoZXhcbiAqIEBwYXJhbSB7TnVtYmVyfSBbYV0gICAgICAgICBvcGFjaXR5IG9mIHRoZSBiYWNrZ3JvdW5kIHJlbGF0aXZlIHRvIGN1cnJlbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciByYW5nZSAoZGVmYXVsdCBpcyAwLTI1NSlcbiAqIEBjaGFpbmFibGVcbiAqL1xuXG4vKipcbiAqIEBtZXRob2QgYmFja2dyb3VuZFxuICogQHBhcmFtIHtOdW1iZXJ9IGdyYXkgICBzcGVjaWZpZXMgYSB2YWx1ZSBiZXR3ZWVuIHdoaXRlIGFuZCBibGFja1xuICogQHBhcmFtIHtOdW1iZXJ9IFthXVxuICogQGNoYWluYWJsZVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBiYWNrZ3JvdW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdjEgICAgIHJlZCBvciBodWUgdmFsdWUgKGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2xvclxuICogICAgICAgICAgICAgICAgICAgICAgICBtb2RlKVxuICogQHBhcmFtIHtOdW1iZXJ9IHYyICAgICBncmVlbiBvciBzYXR1cmF0aW9uIHZhbHVlIChkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgbW9kZSlcbiAqIEBwYXJhbSB7TnVtYmVyfSB2MyAgICAgYmx1ZSBvciBicmlnaHRuZXNzIHZhbHVlIChkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgbW9kZSlcbiAqIEBwYXJhbSAge051bWJlcn0gW2FdXG4gKiBAY2hhaW5hYmxlXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIGJhY2tncm91bmRcbiAqIEBwYXJhbSAge051bWJlcltdfSAgICAgIHZhbHVlcyAgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcmVkLGdyZWVuLGJsdWUgJlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxwaGEgY29tcG9uZW50cyBvZiB0aGUgY29sb3JcbiAqIEBjaGFpbmFibGVcbiAqL1xuXG4vKipcbiAqIEBtZXRob2QgYmFja2dyb3VuZFxuICogQHBhcmFtIHtwNS5JbWFnZX0gaW1hZ2UgICAgIGltYWdlIGNyZWF0ZWQgd2l0aCBsb2FkSW1hZ2UoKSBvciBjcmVhdGVJbWFnZSgpLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNldCBhcyBiYWNrZ3JvdW5kXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG11c3QgYmUgc2FtZSBzaXplIGFzIHRoZSBza2V0Y2ggd2luZG93KVxuICogQHBhcmFtICB7TnVtYmVyfSAgW2FdXG4gKiBAY2hhaW5hYmxlXG4gKi9cblxucDUucHJvdG90eXBlLmJhY2tncm91bmQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKGFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIHA1LkltYWdlKSB7XG4gICAgdGhpcy5pbWFnZShhcmd1bWVudHNbMF0sIDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9yZW5kZXJlci5iYWNrZ3JvdW5kLmFwcGx5KHRoaXMuX3JlbmRlcmVyLCBhcmd1bWVudHMpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDbGVhcnMgdGhlIHBpeGVscyB3aXRoaW4gYSBidWZmZXIuIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBvbiBwNS5DYW52YXNcbiAqIG9iamVjdHMgY3JlYXRlZCB3aXRoIHRoZSBjcmVhdGVDYW52YXMoKSBmdW5jdGlvbjsgaXQgd29uJ3Qgd29yayB3aXRoIHRoZVxuICogbWFpbiBkaXNwbGF5IHdpbmRvdy4gVW5saWtlIHRoZSBtYWluIGdyYXBoaWNzIGNvbnRleHQsIHBpeGVscyBpblxuICogYWRkaXRpb25hbCBncmFwaGljcyBhcmVhcyBjcmVhdGVkIHdpdGggY3JlYXRlR3JhcGhpY3MoKSBjYW4gYmUgZW50aXJlbHlcbiAqIG9yIHBhcnRpYWxseSB0cmFuc3BhcmVudC4gVGhpcyBmdW5jdGlvbiBjbGVhcnMgZXZlcnl0aGluZyB0byBtYWtlIGFsbCBvZlxuICogdGhlIHBpeGVscyAxMDAlIHRyYW5zcGFyZW50LlxuICpcbiAqIEBtZXRob2QgY2xlYXJcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBDbGVhciB0aGUgc2NyZWVuIG9uIG1vdXNlIHByZXNzLlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgZWxsaXBzZShtb3VzZVgsIG1vdXNlWSwgMjAsIDIwKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XG4gKiAgIGNsZWFyKCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAyMHgyMCB3aGl0ZSBlbGxpcHNlcyBhcmUgY29udGludWFsbHkgZHJhd24gYXQgbW91c2UgeCBhbmQgeSBjb29yZGluYXRlcy5cbiAqXG4gKi9cblxucDUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3JlbmRlcmVyLmNsZWFyKCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBjb2xvck1vZGUoKSBjaGFuZ2VzIHRoZSB3YXkgcDUuanMgaW50ZXJwcmV0cyBjb2xvciBkYXRhLiBCeSBkZWZhdWx0LCB0aGVcbiAqIHBhcmFtZXRlcnMgZm9yIGZpbGwoKSwgc3Ryb2tlKCksIGJhY2tncm91bmQoKSwgYW5kIGNvbG9yKCkgYXJlIGRlZmluZWQgYnlcbiAqIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDI1NSB1c2luZyB0aGUgUkdCIGNvbG9yIG1vZGVsLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG9cbiAqIHNldHRpbmcgY29sb3JNb2RlKFJHQiwgMjU1KS4gU2V0dGluZyBjb2xvck1vZGUoSFNCKSBsZXRzIHlvdSB1c2UgdGhlIEhTQlxuICogc3lzdGVtIGluc3RlYWQuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgY29sb3JNb2RlKEhTQiwgMzYwLCAxMDAsIDEwMCwgMSkuIFlvdVxuICogY2FuIGFsc28gdXNlIEhTTC5cbiAqIDxicj48YnI+XG4gKiBOb3RlOiBleGlzdGluZyBjb2xvciBvYmplY3RzIHJlbWVtYmVyIHRoZSBtb2RlIHRoYXQgdGhleSB3ZXJlIGNyZWF0ZWQgaW4sXG4gKiBzbyB5b3UgY2FuIGNoYW5nZSBtb2RlcyBhcyB5b3UgbGlrZSB3aXRob3V0IGFmZmVjdGluZyB0aGVpciBhcHBlYXJhbmNlLlxuICpcbiAqXG4gKiBAbWV0aG9kIGNvbG9yTW9kZVxuICogQHBhcmFtIHtDb25zdGFudH0gbW9kZSAgIGVpdGhlciBSR0IsIEhTQiBvciBIU0wsIGNvcnJlc3BvbmRpbmcgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBSZWQvR3JlZW4vQmx1ZSBhbmQgSHVlL1NhdHVyYXRpb24vQnJpZ2h0bmVzc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIChvciBMaWdodG5lc3MpXG4gKiBAcGFyYW0ge051bWJlcn0gIFttYXhdICByYW5nZSBmb3IgYWxsIHZhbHVlc1xuICogQGNoYWluYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBub1N0cm9rZSgpO1xuICogY29sb3JNb2RlKFJHQiwgMTAwKTtcbiAqIGZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyBpKyspIHtcbiAqICAgZm9yICh2YXIgaiA9IDA7IGogPCAxMDA7IGorKykge1xuICogICAgIHN0cm9rZShpLCBqLCAwKTtcbiAqICAgICBwb2ludChpLCBqKTtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogbm9TdHJva2UoKTtcbiAqIGNvbG9yTW9kZShIU0IsIDEwMCk7XG4gKiBmb3IgKHZhciBpID0gMDsgaSA8IDEwMDsgaSsrKSB7XG4gKiAgIGZvciAodmFyIGogPSAwOyBqIDwgMTAwOyBqKyspIHtcbiAqICAgICBzdHJva2UoaSwgaiwgMTAwKTtcbiAqICAgICBwb2ludChpLCBqKTtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogY29sb3JNb2RlKFJHQiwgMjU1KTtcbiAqIHZhciBjID0gY29sb3IoMTI3LCAyNTUsIDApO1xuICpcbiAqIGNvbG9yTW9kZShSR0IsIDEpO1xuICogdmFyIG15Q29sb3IgPSBjLl9nZXRSZWQoKTtcbiAqIHRleHQobXlDb2xvciwgMTAsIDEwLCA4MCwgODApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogbm9GaWxsKCk7XG4gKiBjb2xvck1vZGUoUkdCLCAyNTUsIDI1NSwgMjU1LCAxKTtcbiAqIGJhY2tncm91bmQoMjU1KTtcbiAqXG4gKiBzdHJva2VXZWlnaHQoNCk7XG4gKiBzdHJva2UoMjU1LCAwLCAxMCwgMC4zKTtcbiAqIGVsbGlwc2UoNDAsIDQwLCA1MCwgNTApO1xuICogZWxsaXBzZSg1MCwgNTAsIDQwLCA0MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKkdyZWVuIHRvIHJlZCBncmFkaWVudCBmcm9tIGJvdHRvbSBMIHRvIHRvcCBSLiBzaGFkaW5nIG9yaWdpbmF0ZXMgZnJvbSB0b3AgbGVmdC5cbiAqUmFpbmJvdyBncmFkaWVudCBmcm9tIGxlZnQgdG8gcmlnaHQuIEJyaWdodG5lc3MgaW5jcmVhc2luZyB0byB3aGl0ZSBhdCB0b3AuXG4gKnVua25vd24gaW1hZ2UuXG4gKjUweDUwIGVsbGlwc2UgYXQgbWlkZGxlIEwgJiA0MHg0MCBlbGxpcHNlIGF0IGNlbnRlci4gVHJhbnNsdXNjZW50IHBpbmsgb3V0bGluZXMuXG4gKlxuICovXG4vKipcbiAqIEBtZXRob2QgY29sb3JNb2RlXG4gKiBAcGFyYW0ge0NvbnN0YW50fSBtb2RlXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4MSAgICAgcmFuZ2UgZm9yIHRoZSByZWQgb3IgaHVlIGRlcGVuZGluZyBvbiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBjb2xvciBtb2RlXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4MiAgICAgcmFuZ2UgZm9yIHRoZSBncmVlbiBvciBzYXR1cmF0aW9uIGRlcGVuZGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgY3VycmVudCBjb2xvciBtb2RlXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4MyAgICAgcmFuZ2UgZm9yIHRoZSBibHVlIG9yIGJyaWdodG5lc3MvbGlnaG50ZXNzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2xvciBtb2RlXG4gKiBAcGFyYW0ge051bWJlcn0gW21heEFdICAgcmFuZ2UgZm9yIHRoZSBhbHBoYVxuICogQGNoYWluYWJsZVxuICovXG5wNS5wcm90b3R5cGUuY29sb3JNb2RlID0gZnVuY3Rpb24obW9kZSwgbWF4MSwgbWF4MiwgbWF4MywgbWF4QSkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjb2xvck1vZGUnLCBhcmd1bWVudHMpO1xuICBpZiAoXG4gICAgbW9kZSA9PT0gY29uc3RhbnRzLlJHQiB8fFxuICAgIG1vZGUgPT09IGNvbnN0YW50cy5IU0IgfHxcbiAgICBtb2RlID09PSBjb25zdGFudHMuSFNMXG4gICkge1xuICAgIC8vIFNldCBjb2xvciBtb2RlLlxuICAgIHRoaXMuX2NvbG9yTW9kZSA9IG1vZGU7XG5cbiAgICAvLyBTZXQgY29sb3IgbWF4ZXMuXG4gICAgdmFyIG1heGVzID0gdGhpcy5fY29sb3JNYXhlc1ttb2RlXTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgbWF4ZXNbMF0gPSBtYXgxOyAvLyBSZWRcbiAgICAgIG1heGVzWzFdID0gbWF4MTsgLy8gR3JlZW5cbiAgICAgIG1heGVzWzJdID0gbWF4MTsgLy8gQmx1ZVxuICAgICAgbWF4ZXNbM10gPSBtYXgxOyAvLyBBbHBoYVxuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgbWF4ZXNbMF0gPSBtYXgxOyAvLyBSZWRcbiAgICAgIG1heGVzWzFdID0gbWF4MjsgLy8gR3JlZW5cbiAgICAgIG1heGVzWzJdID0gbWF4MzsgLy8gQmx1ZVxuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNSkge1xuICAgICAgbWF4ZXNbMF0gPSBtYXgxOyAvLyBSZWRcbiAgICAgIG1heGVzWzFdID0gbWF4MjsgLy8gR3JlZW5cbiAgICAgIG1heGVzWzJdID0gbWF4MzsgLy8gQmx1ZVxuICAgICAgbWF4ZXNbM10gPSBtYXhBOyAvLyBBbHBoYVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBjb2xvciB1c2VkIHRvIGZpbGwgc2hhcGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHJ1blxuICogZmlsbCgyMDQsIDEwMiwgMCksIGFsbCBzdWJzZXF1ZW50IHNoYXBlcyB3aWxsIGJlIGZpbGxlZCB3aXRoIG9yYW5nZS4gVGhpc1xuICogY29sb3IgaXMgZWl0aGVyIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiB0aGUgUkdCIG9yIEhTQiBjb2xvciBkZXBlbmRpbmcgb25cbiAqIHRoZSBjdXJyZW50IGNvbG9yTW9kZSgpLiAoVGhlIGRlZmF1bHQgY29sb3Igc3BhY2UgaXMgUkdCLCB3aXRoIGVhY2ggdmFsdWVcbiAqIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMjU1KS4gVGhlIGFscGhhIHJhbmdlIGJ5IGRlZmF1bHQgaXMgYWxzbyAwIHRvIDI1NS5cbiAqIDxicj48YnI+XG4gKiBJZiBhIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQgaXMgcHJvdmlkZWQsIFJHQiwgUkdCQSBhbmQgSGV4IENTUyBjb2xvciBzdHJpbmdzXG4gKiBhbmQgYWxsIG5hbWVkIGNvbG9yIHN0cmluZ3MgYXJlIHN1cHBvcnRlZC4gSW4gdGhpcyBjYXNlLCBhbiBhbHBoYSBudW1iZXJcbiAqIHZhbHVlIGFzIGEgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBSR0JBIGZvcm0gc2hvdWxkIGJlIHVzZWQuXG4gKiA8YnI+PGJyPlxuICogQSBwNSBDb2xvciBvYmplY3QgY2FuIGFsc28gYmUgcHJvdmlkZWQgdG8gc2V0IHRoZSBmaWxsIGNvbG9yLlxuICpcbiAqIEBtZXRob2QgZmlsbFxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgdjEgICAgICByZWQgb3IgaHVlIHZhbHVlIHJlbGF0aXZlIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICB2MiAgICAgIGdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2VcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIHYzICAgICAgYmx1ZSBvciBicmlnaHRuZXNzIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICBbYWxwaGFdXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gR3JheXNjYWxlIGludGVnZXIgdmFsdWVcbiAqIGZpbGwoNTEpO1xuICogcmVjdCgyMCwgMjAsIDYwLCA2MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBSLCBHICYgQiBpbnRlZ2VyIHZhbHVlc1xuICogZmlsbCgyNTUsIDIwNCwgMCk7XG4gKiByZWN0KDIwLCAyMCwgNjAsIDYwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIEgsIFMgJiBCIGludGVnZXIgdmFsdWVzXG4gKiBjb2xvck1vZGUoSFNCKTtcbiAqIGZpbGwoMjU1LCAyMDQsIDEwMCk7XG4gKiByZWN0KDIwLCAyMCwgNjAsIDYwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIE5hbWVkIFNWRy9DU1MgY29sb3Igc3RyaW5nXG4gKiBmaWxsKCdyZWQnKTtcbiAqIHJlY3QoMjAsIDIwLCA2MCwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gdGhyZWUtZGlnaXQgaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uXG4gKiBmaWxsKCcjZmFlJyk7XG4gKiByZWN0KDIwLCAyMCwgNjAsIDYwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIHNpeC1kaWdpdCBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb25cbiAqIGZpbGwoJyMyMjIyMjInKTtcbiAqIHJlY3QoMjAsIDIwLCA2MCwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gaW50ZWdlciBSR0Igbm90YXRpb25cbiAqIGZpbGwoJ3JnYigwLDI1NSwwKScpO1xuICogcmVjdCgyMCwgMjAsIDYwLCA2MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBpbnRlZ2VyIFJHQkEgbm90YXRpb25cbiAqIGZpbGwoJ3JnYmEoMCwyNTUsMCwgMC4yNSknKTtcbiAqIHJlY3QoMjAsIDIwLCA2MCwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gcGVyY2VudGFnZSBSR0Igbm90YXRpb25cbiAqIGZpbGwoJ3JnYigxMDAlLDAlLDEwJSknKTtcbiAqIHJlY3QoMjAsIDIwLCA2MCwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gcGVyY2VudGFnZSBSR0JBIG5vdGF0aW9uXG4gKiBmaWxsKCdyZ2JhKDEwMCUsMCUsMTAwJSwwLjUpJyk7XG4gKiByZWN0KDIwLCAyMCwgNjAsIDYwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIHA1IENvbG9yIG9iamVjdFxuICogZmlsbChjb2xvcigwLCAwLCAyNTUpKTtcbiAqIHJlY3QoMjAsIDIwLCA2MCwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiBAYWx0XG4gKiA2MHg2MCBkYXJrIGNoYXJjb2FsIGdyZXkgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cbiAqIDYweDYwIHllbGxvdyByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBpbiBjZW50ZXIgb2YgY2FudmFzLlxuICogNjB4NjAgcm95YWwgYmx1ZSByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBpbiBjZW50ZXIgb2YgY2FudmFzLlxuICogNjB4NjAgcmVkIHJlY3Qgd2l0aCBibGFjayBvdXRsaW5lIGluIGNlbnRlciBvZiBjYW52YXMuXG4gKiA2MHg2MCBwaW5rIHJlY3Qgd2l0aCBibGFjayBvdXRsaW5lIGluIGNlbnRlciBvZiBjYW52YXMuXG4gKiA2MHg2MCBibGFjayByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBpbiBjZW50ZXIgb2YgY2FudmFzLlxuICogNjB4NjAgbGlnaHQgZ3JlZW4gcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cbiAqIDYweDYwIHNvZnQgZ3JlZW4gcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cbiAqIDYweDYwIHJlZCByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBpbiBjZW50ZXIgb2YgY2FudmFzLlxuICogNjB4NjAgZGFyayBmdXNoY2lhIHJlY3Qgd2l0aCBibGFjayBvdXRsaW5lIGluIGNlbnRlciBvZiBjYW52YXMuXG4gKiA2MHg2MCBibHVlIHJlY3Qgd2l0aCBibGFjayBvdXRsaW5lIGluIGNlbnRlciBvZiBjYW52YXMuXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIGZpbGxcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIHZhbHVlICAgYSBjb2xvciBzdHJpbmdcbiAqIEBjaGFpbmFibGVcbiAqL1xuXG4vKipcbiAqIEBtZXRob2QgZmlsbFxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgZ3JheSAgIGEgZ3JheSB2YWx1ZVxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgW2FscGhhXVxuICogQGNoYWluYWJsZVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBmaWxsXG4gKiBAcGFyYW0gIHtOdW1iZXJbXX0gICAgICB2YWx1ZXMgIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHJlZCxncmVlbixibHVlICZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFscGhhIGNvbXBvbmVudHMgb2YgdGhlIGNvbG9yXG4gKiBAY2hhaW5hYmxlXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIGZpbGxcbiAqIEBwYXJhbSAge3A1LkNvbG9yfSAgICAgIGNvbG9yICAgdGhlIGZpbGwgY29sb3JcbiAqIEBjaGFpbmFibGVcbiAqL1xucDUucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVuZGVyZXIuX3NldFByb3BlcnR5KCdfZmlsbFNldCcsIHRydWUpO1xuICB0aGlzLl9yZW5kZXJlci5fc2V0UHJvcGVydHkoJ19kb0ZpbGwnLCB0cnVlKTtcbiAgdGhpcy5fcmVuZGVyZXIuZmlsbC5hcHBseSh0aGlzLl9yZW5kZXJlciwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERpc2FibGVzIGZpbGxpbmcgZ2VvbWV0cnkuIElmIGJvdGggbm9TdHJva2UoKSBhbmQgbm9GaWxsKCkgYXJlIGNhbGxlZCxcbiAqIG5vdGhpbmcgd2lsbCBiZSBkcmF3biB0byB0aGUgc2NyZWVuLlxuICpcbiAqIEBtZXRob2Qgbm9GaWxsXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogcmVjdCgxNSwgMTAsIDU1LCA1NSk7XG4gKiBub0ZpbGwoKTtcbiAqIHJlY3QoMjAsIDIwLCA2MCwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdiBtb2Rlcm5penI9J3dlYmdsJz5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMCk7XG4gKiAgIG5vRmlsbCgpO1xuICogICBzdHJva2UoMTAwLCAxMDAsIDI0MCk7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgYm94KDQ1LCA0NSwgNDUpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogd2hpdGUgcmVjdCB0b3AgbWlkZGxlIGFuZCBub0ZpbGwgcmVjdCBjZW50ZXIuIEJvdGggNjB4NjAgd2l0aCBibGFjayBvdXRsaW5lcy5cbiAqIGJsYWNrIGNhbnZhcyB3aXRoIHB1cnBsZSBjdWJlIHdpcmVmcmFtZSBzcGlubmluZ1xuICovXG5wNS5wcm90b3R5cGUubm9GaWxsID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3JlbmRlcmVyLl9zZXRQcm9wZXJ0eSgnX2RvRmlsbCcsIGZhbHNlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERpc2FibGVzIGRyYXdpbmcgdGhlIHN0cm9rZSAob3V0bGluZSkuIElmIGJvdGggbm9TdHJva2UoKSBhbmQgbm9GaWxsKClcbiAqIGFyZSBjYWxsZWQsIG5vdGhpbmcgd2lsbCBiZSBkcmF3biB0byB0aGUgc2NyZWVuLlxuICpcbiAqIEBtZXRob2Qgbm9TdHJva2VcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBub1N0cm9rZSgpO1xuICogcmVjdCgyMCwgMjAsIDYwLCA2MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IG1vZGVybml6cj0nd2ViZ2wnPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgwKTtcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgZmlsbCgyNDAsIDE1MCwgMTUwKTtcbiAqICAgcm90YXRlWChmcmFtZUNvdW50ICogMC4wMSk7XG4gKiAgIHJvdGF0ZVkoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICBib3goNDUsIDQ1LCA0NSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiA2MHg2MCB3aGl0ZSByZWN0IGF0IGNlbnRlci4gbm8gb3V0bGluZS5cbiAqIGJsYWNrIGNhbnZhcyB3aXRoIHBpbmsgY3ViZSBzcGlubmluZ1xuICovXG5wNS5wcm90b3R5cGUubm9TdHJva2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVuZGVyZXIuX3NldFByb3BlcnR5KCdfZG9TdHJva2UnLCBmYWxzZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBjb2xvciB1c2VkIHRvIGRyYXcgbGluZXMgYW5kIGJvcmRlcnMgYXJvdW5kIHNoYXBlcy4gVGhpcyBjb2xvclxuICogaXMgZWl0aGVyIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiB0aGUgUkdCIG9yIEhTQiBjb2xvciBkZXBlbmRpbmcgb24gdGhlXG4gKiBjdXJyZW50IGNvbG9yTW9kZSgpICh0aGUgZGVmYXVsdCBjb2xvciBzcGFjZSBpcyBSR0IsIHdpdGggZWFjaCB2YWx1ZSBpblxuICogdGhlIHJhbmdlIGZyb20gMCB0byAyNTUpLiBUaGUgYWxwaGEgcmFuZ2UgYnkgZGVmYXVsdCBpcyBhbHNvIDAgdG8gMjU1LlxuICogPGJyPjxicj5cbiAqIElmIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudCBpcyBwcm92aWRlZCwgUkdCLCBSR0JBIGFuZCBIZXggQ1NTIGNvbG9yXG4gKiBzdHJpbmdzIGFuZCBhbGwgbmFtZWQgY29sb3Igc3RyaW5ncyBhcmUgc3VwcG9ydGVkLiBJbiB0aGlzIGNhc2UsIGFuIGFscGhhXG4gKiBudW1iZXIgdmFsdWUgYXMgYSBzZWNvbmQgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZCwgdGhlIFJHQkEgZm9ybSBzaG91bGQgYmVcbiAqIHVzZWQuXG4gKiA8YnI+PGJyPlxuICogQSBwNSBDb2xvciBvYmplY3QgY2FuIGFsc28gYmUgcHJvdmlkZWQgdG8gc2V0IHRoZSBzdHJva2UgY29sb3IuXG4gKlxuICpcbiAqIEBtZXRob2Qgc3Ryb2tlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICB2MSAgICAgIHJlZCBvciBodWUgdmFsdWUgcmVsYXRpdmUgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2VcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIHYyICAgICAgZ3JlZW4gb3Igc2F0dXJhdGlvbiB2YWx1ZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb2xvciByYW5nZVxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgdjMgICAgICBibHVlIG9yIGJyaWdodG5lc3MgdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2VcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIFthbHBoYV1cbiAqIEBjaGFpbmFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gR3JheXNjYWxlIGludGVnZXIgdmFsdWVcbiAqIHN0cm9rZVdlaWdodCg0KTtcbiAqIHN0cm9rZSg1MSk7XG4gKiByZWN0KDIwLCAyMCwgNjAsIDYwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIFIsIEcgJiBCIGludGVnZXIgdmFsdWVzXG4gKiBzdHJva2UoMjU1LCAyMDQsIDApO1xuICogc3Ryb2tlV2VpZ2h0KDQpO1xuICogcmVjdCgyMCwgMjAsIDYwLCA2MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBILCBTICYgQiBpbnRlZ2VyIHZhbHVlc1xuICogY29sb3JNb2RlKEhTQik7XG4gKiBzdHJva2VXZWlnaHQoNCk7XG4gKiBzdHJva2UoMjU1LCAyMDQsIDEwMCk7XG4gKiByZWN0KDIwLCAyMCwgNjAsIDYwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIE5hbWVkIFNWRy9DU1MgY29sb3Igc3RyaW5nXG4gKiBzdHJva2UoJ3JlZCcpO1xuICogc3Ryb2tlV2VpZ2h0KDQpO1xuICogcmVjdCgyMCwgMjAsIDYwLCA2MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyB0aHJlZS1kaWdpdCBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb25cbiAqIHN0cm9rZSgnI2ZhZScpO1xuICogc3Ryb2tlV2VpZ2h0KDQpO1xuICogcmVjdCgyMCwgMjAsIDYwLCA2MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBzaXgtZGlnaXQgaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uXG4gKiBzdHJva2UoJyMyMjIyMjInKTtcbiAqIHN0cm9rZVdlaWdodCg0KTtcbiAqIHJlY3QoMjAsIDIwLCA2MCwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gaW50ZWdlciBSR0Igbm90YXRpb25cbiAqIHN0cm9rZSgncmdiKDAsMjU1LDApJyk7XG4gKiBzdHJva2VXZWlnaHQoNCk7XG4gKiByZWN0KDIwLCAyMCwgNjAsIDYwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIGludGVnZXIgUkdCQSBub3RhdGlvblxuICogc3Ryb2tlKCdyZ2JhKDAsMjU1LDAsMC4yNSknKTtcbiAqIHN0cm9rZVdlaWdodCg0KTtcbiAqIHJlY3QoMjAsIDIwLCA2MCwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gcGVyY2VudGFnZSBSR0Igbm90YXRpb25cbiAqIHN0cm9rZSgncmdiKDEwMCUsMCUsMTAlKScpO1xuICogc3Ryb2tlV2VpZ2h0KDQpO1xuICogcmVjdCgyMCwgMjAsIDYwLCA2MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBwZXJjZW50YWdlIFJHQkEgbm90YXRpb25cbiAqIHN0cm9rZSgncmdiYSgxMDAlLDAlLDEwMCUsMC41KScpO1xuICogc3Ryb2tlV2VpZ2h0KDQpO1xuICogcmVjdCgyMCwgMjAsIDYwLCA2MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBwNSBDb2xvciBvYmplY3RcbiAqIHN0cm9rZShjb2xvcigwLCAwLCAyNTUpKTtcbiAqIHN0cm9rZVdlaWdodCg0KTtcbiAqIHJlY3QoMjAsIDIwLCA2MCwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogNjB4NjAgd2hpdGUgcmVjdCBhdCBjZW50ZXIuIERhcmsgY2hhcmNvYWwgZ3JleSBvdXRsaW5lLlxuICogNjB4NjAgd2hpdGUgcmVjdCBhdCBjZW50ZXIuIFllbGxvdyBvdXRsaW5lLlxuICogNjB4NjAgd2hpdGUgcmVjdCBhdCBjZW50ZXIuIFJveWFsIGJsdWUgb3V0bGluZS5cbiAqIDYweDYwIHdoaXRlIHJlY3QgYXQgY2VudGVyLiBSZWQgb3V0bGluZS5cbiAqIDYweDYwIHdoaXRlIHJlY3QgYXQgY2VudGVyLiBQaW5rIG91dGxpbmUuXG4gKiA2MHg2MCB3aGl0ZSByZWN0IGF0IGNlbnRlci4gQmxhY2sgb3V0bGluZS5cbiAqIDYweDYwIHdoaXRlIHJlY3QgYXQgY2VudGVyLiBCcmlnaHQgZ3JlZW4gb3V0bGluZS5cbiAqIDYweDYwIHdoaXRlIHJlY3QgYXQgY2VudGVyLiBTb2Z0IGdyZWVuIG91dGxpbmUuXG4gKiA2MHg2MCB3aGl0ZSByZWN0IGF0IGNlbnRlci4gUmVkIG91dGxpbmUuXG4gKiA2MHg2MCB3aGl0ZSByZWN0IGF0IGNlbnRlci4gRGFyayBmdXNoY2lhIG91dGxpbmUuXG4gKiA2MHg2MCB3aGl0ZSByZWN0IGF0IGNlbnRlci4gQmx1ZSBvdXRsaW5lLlxuICovXG5cbi8qKlxuICogQG1ldGhvZCBzdHJva2VcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIHZhbHVlICAgYSBjb2xvciBzdHJpbmdcbiAqIEBjaGFpbmFibGVcbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgc3Ryb2tlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICBncmF5ICAgYSBncmF5IHZhbHVlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICBbYWxwaGFdXG4gKiBAY2hhaW5hYmxlXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIHN0cm9rZVxuICogQHBhcmFtICB7TnVtYmVyW119ICAgICAgdmFsdWVzICBhbiBhcnJheSBjb250YWluaW5nIHRoZSByZWQsZ3JlZW4sYmx1ZSAmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIHRoZSBjb2xvclxuICogQGNoYWluYWJsZVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBzdHJva2VcbiAqIEBwYXJhbSAge3A1LkNvbG9yfSAgICAgIGNvbG9yICAgdGhlIHN0cm9rZSBjb2xvclxuICogQGNoYWluYWJsZVxuICovXG5cbnA1LnByb3RvdHlwZS5zdHJva2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVuZGVyZXIuX3NldFByb3BlcnR5KCdfc3Ryb2tlU2V0JywgdHJ1ZSk7XG4gIHRoaXMuX3JlbmRlcmVyLl9zZXRQcm9wZXJ0eSgnX2RvU3Ryb2tlJywgdHJ1ZSk7XG4gIHRoaXMuX3JlbmRlcmVyLnN0cm9rZS5hcHBseSh0aGlzLl9yZW5kZXJlciwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4uL2NvcmUvY29uc3RhbnRzXCI6MjEsXCIuLi9jb3JlL2NvcmVcIjoyMixcIi4vcDUuQ29sb3JcIjoxNn1dLDE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBTaGFwZVxuICogQHN1Ym1vZHVsZSAyRCBQcmltaXRpdmVzXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICogQHJlcXVpcmVzIGNvbnN0YW50c1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi9jb3JlJyk7XG52YXIgY29uc3RhbnRzID0gX2RlcmVxXygnLi9jb25zdGFudHMnKTtcbnZhciBjYW52YXMgPSBfZGVyZXFfKCcuL2NhbnZhcycpO1xuX2RlcmVxXygnLi9lcnJvcl9oZWxwZXJzJyk7XG5cbi8qKlxuICogRHJhdyBhbiBhcmMgdG8gdGhlIHNjcmVlbi4gSWYgY2FsbGVkIHdpdGggb25seSB4LCB5LCB3LCBoLCBzdGFydCwgYW5kXG4gKiBzdG9wLCB0aGUgYXJjIHdpbGwgYmUgZHJhd24gYW5kIGZpbGxlZCBhcyBhbiBvcGVuIHBpZSBzZWdtZW50LiBJZiBhIG1vZGUgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB0aGUgYXJjXG4gKiB3aWxsIGJlIGZpbGxlZCBsaWtlIGFuIG9wZW4gc2VtaS1jaXJjbGUgKE9QRU4pICwgYSBjbG9zZWQgc2VtaS1jaXJjbGUgKENIT1JEKSwgb3IgYXMgYSBjbG9zZWQgcGllIHNlZ21lbnQgKFBJRSkuIFRoZVxuICogb3JpZ2luIG1heSBiZSBjaGFuZ2VkIHdpdGggdGhlIGVsbGlwc2VNb2RlKCkgZnVuY3Rpb24uPGJyPjxicj5cbiAqIE5vdGUgdGhhdCBkcmF3aW5nIGEgZnVsbCBjaXJjbGUgKGV4OiAwIHRvIFRXT19QSSkgd2lsbCBhcHBlYXIgYmxhbmtcbiAqIGJlY2F1c2UgMCBhbmQgVFdPX1BJIGFyZSB0aGUgc2FtZSBwb3NpdGlvbiBvbiB0aGUgdW5pdCBjaXJjbGUuIFRoZVxuICogYmVzdCB3YXkgdG8gaGFuZGxlIHRoaXMgaXMgYnkgdXNpbmcgdGhlIGVsbGlwc2UoKSBmdW5jdGlvbiBpbnN0ZWFkXG4gKiB0byBjcmVhdGUgYSBjbG9zZWQgZWxsaXBzZSwgYW5kIHRvIHVzZSB0aGUgYXJjKCkgZnVuY3Rpb25cbiAqIG9ubHkgdG8gZHJhdyBwYXJ0cyBvZiBhbiBlbGxpcHNlLlxuICpcbiAqIEBtZXRob2QgYXJjXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggICAgICB4LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVsbGlwc2VcbiAqIEBwYXJhbSAge051bWJlcn0geSAgICAgIHktY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3MgZWxsaXBzZVxuICogQHBhcmFtICB7TnVtYmVyfSB3ICAgICAgd2lkdGggb2YgdGhlIGFyYydzIGVsbGlwc2UgYnkgZGVmYXVsdFxuICogQHBhcmFtICB7TnVtYmVyfSBoICAgICAgaGVpZ2h0IG9mIHRoZSBhcmMncyBlbGxpcHNlIGJ5IGRlZmF1bHRcbiAqIEBwYXJhbSAge051bWJlcn0gc3RhcnQgIGFuZ2xlIHRvIHN0YXJ0IHRoZSBhcmMsIHNwZWNpZmllZCBpbiByYWRpYW5zXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHN0b3AgICBhbmdsZSB0byBzdG9wIHRoZSBhcmMsIHNwZWNpZmllZCBpbiByYWRpYW5zXG4gKiBAcGFyYW0gIHtDb25zdGFudH0gW21vZGVdIG9wdGlvbmFsIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgdGhlIHdheSBvZiBkcmF3aW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXJjLiBlaXRoZXIgQ0hPUkQsIFBJRSBvciBPUEVOXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogYXJjKDUwLCA1NSwgNTAsIDUwLCAwLCBIQUxGX1BJKTtcbiAqIG5vRmlsbCgpO1xuICogYXJjKDUwLCA1NSwgNjAsIDYwLCBIQUxGX1BJLCBQSSk7XG4gKiBhcmMoNTAsIDU1LCA3MCwgNzAsIFBJLCBQSSArIFFVQVJURVJfUEkpO1xuICogYXJjKDUwLCA1NSwgODAsIDgwLCBQSSArIFFVQVJURVJfUEksIFRXT19QSSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBhcmMoNTAsIDUwLCA4MCwgODAsIDAsIFBJICsgUVVBUlRFUl9QSSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBhcmMoNTAsIDUwLCA4MCwgODAsIDAsIFBJICsgUVVBUlRFUl9QSSwgT1BFTik7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBhcmMoNTAsIDUwLCA4MCwgODAsIDAsIFBJICsgUVVBUlRFUl9QSSwgQ0hPUkQpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogYXJjKDUwLCA1MCwgODAsIDgwLCAwLCBQSSArIFFVQVJURVJfUEksIFBJRSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKnNoYXR0ZXJlZCBvdXRsaW5lIG9mIGFuIGVsbGlwc2Ugd2l0aCBhIHF1YXJ0ZXIgb2YgYSB3aGl0ZSBjaXJjbGUgYm90dG9tLXJpZ2h0LlxuICp3aGl0ZSBlbGxpcHNlIHdpdGggdG9wIHJpZ2h0IHF1YXJ0ZXIgbWlzc2luZy5cbiAqd2hpdGUgZWxsaXBzZSB3aXRoIGJsYWNrIG91dGxpbmUgd2l0aCB0b3AgcmlnaHQgbWlzc2luZy5cbiAqd2hpdGUgZWxsaXBzZSB3aXRoIHRvcCByaWdodCBtaXNzaW5nIHdpdGggYmxhY2sgb3V0bGluZSBhcm91bmQgc2hhcGUuXG4gKndoaXRlIGVsbGlwc2Ugd2l0aCB0b3AgcmlnaHQgcXVhcnRlciBtaXNzaW5nIHdpdGggYmxhY2sgb3V0bGluZSBhcm91bmQgdGhlIHNoYXBlLlxuICpcbiAqL1xucDUucHJvdG90eXBlLmFyYyA9IGZ1bmN0aW9uKHgsIHksIHcsIGgsIHN0YXJ0LCBzdG9wLCBtb2RlKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2FyYycsIGFyZ3VtZW50cyk7XG4gIGlmICghdGhpcy5fcmVuZGVyZXIuX2RvU3Ryb2tlICYmICF0aGlzLl9yZW5kZXJlci5fZG9GaWxsKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGFydCA9IHRoaXMuX3RvUmFkaWFucyhzdGFydCk7XG4gIHN0b3AgPSB0aGlzLl90b1JhZGlhbnMoc3RvcCk7XG5cbiAgLy8gTWFrZSBhbGwgYW5nbGVzIHBvc2l0aXZlLi4uXG4gIHdoaWxlIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBjb25zdGFudHMuVFdPX1BJO1xuICB9XG4gIHdoaWxlIChzdG9wIDwgMCkge1xuICAgIHN0b3AgKz0gY29uc3RhbnRzLlRXT19QSTtcbiAgfVxuICAvLyAuLi5hbmQgY29uZmluZSB0aGVtIHRvIHRoZSBpbnRlcnZhbCBbMCxUV09fUEkpLlxuICBzdGFydCAlPSBjb25zdGFudHMuVFdPX1BJO1xuICBzdG9wICU9IGNvbnN0YW50cy5UV09fUEk7XG5cbiAgLy8gYWNjb3VudCBmb3IgZnVsbCBjaXJjbGVcbiAgaWYgKHN0b3AgPT09IHN0YXJ0KSB7XG4gICAgc3RvcCArPSBjb25zdGFudHMuVFdPX1BJO1xuICB9XG5cbiAgLy8gQWRqdXN0IGFuZ2xlcyB0byBjb3VudGVyIGxpbmVhciBzY2FsaW5nLlxuICBpZiAoc3RhcnQgPD0gY29uc3RhbnRzLkhBTEZfUEkpIHtcbiAgICBzdGFydCA9IE1hdGguYXRhbih3IC8gaCAqIE1hdGgudGFuKHN0YXJ0KSk7XG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBjb25zdGFudHMuSEFMRl9QSSAmJiBzdGFydCA8PSAzICogY29uc3RhbnRzLkhBTEZfUEkpIHtcbiAgICBzdGFydCA9IE1hdGguYXRhbih3IC8gaCAqIE1hdGgudGFuKHN0YXJ0KSkgKyBjb25zdGFudHMuUEk7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnQgPSBNYXRoLmF0YW4odyAvIGggKiBNYXRoLnRhbihzdGFydCkpICsgY29uc3RhbnRzLlRXT19QSTtcbiAgfVxuICBpZiAoc3RvcCA8PSBjb25zdGFudHMuSEFMRl9QSSkge1xuICAgIHN0b3AgPSBNYXRoLmF0YW4odyAvIGggKiBNYXRoLnRhbihzdG9wKSk7XG4gIH0gZWxzZSBpZiAoc3RvcCA+IGNvbnN0YW50cy5IQUxGX1BJICYmIHN0b3AgPD0gMyAqIGNvbnN0YW50cy5IQUxGX1BJKSB7XG4gICAgc3RvcCA9IE1hdGguYXRhbih3IC8gaCAqIE1hdGgudGFuKHN0b3ApKSArIGNvbnN0YW50cy5QSTtcbiAgfSBlbHNlIHtcbiAgICBzdG9wID0gTWF0aC5hdGFuKHcgLyBoICogTWF0aC50YW4oc3RvcCkpICsgY29uc3RhbnRzLlRXT19QSTtcbiAgfVxuXG4gIC8vIEV4Y2VlZCB0aGUgaW50ZXJ2YWwgaWYgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBzaXplIGFuZFxuICAvLyBvcmllbnRhdGlvbiBvZiB0aGUgYXJjLlxuICBpZiAoc3RhcnQgPiBzdG9wKSB7XG4gICAgc3RvcCArPSBjb25zdGFudHMuVFdPX1BJO1xuICB9XG4gIC8vIHA1IHN1cHBvcnRzIG5lZ2F0aXZlIHdpZHRoIGFuZCBoZWlnaHRzIGZvciBlbGxpcHNlc1xuICB3ID0gTWF0aC5hYnModyk7XG4gIGggPSBNYXRoLmFicyhoKTtcbiAgdGhpcy5fcmVuZGVyZXIuYXJjKHgsIHksIHcsIGgsIHN0YXJ0LCBzdG9wLCBtb2RlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERyYXdzIGFuIGVsbGlwc2UgKG92YWwpIHRvIHRoZSBzY3JlZW4uIEFuIGVsbGlwc2Ugd2l0aCBlcXVhbCB3aWR0aCBhbmRcbiAqIGhlaWdodCBpcyBhIGNpcmNsZS4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIHNldCB0aGUgbG9jYXRpb24sXG4gKiBhbmQgdGhlIHRoaXJkIGFuZCBmb3VydGggcGFyYW1ldGVycyBzZXQgdGhlIHNoYXBlJ3Mgd2lkdGggYW5kIGhlaWdodC4gSWZcbiAqIG5vIGhlaWdodCBpcyBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBvZiB3aWR0aCBpcyB1c2VkIGZvciBib3RoIHRoZSB3aWR0aCBhbmRcbiAqIGhlaWdodC4gSWYgYSBuZWdhdGl2ZSBoZWlnaHQgb3Igd2lkdGggaXMgc3BlY2lmaWVkLCB0aGUgYWJzb2x1dGUgdmFsdWUgaXMgdGFrZW4uXG4gKiBUaGUgb3JpZ2luIG1heSBiZSBjaGFuZ2VkIHdpdGggdGhlIGVsbGlwc2VNb2RlKCkgZnVuY3Rpb24uXG4gKlxuICogQG1ldGhvZCBlbGxpcHNlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggeC1jb29yZGluYXRlIG9mIHRoZSBlbGxpcHNlLlxuICogQHBhcmFtICB7TnVtYmVyfSB5IHktY29vcmRpbmF0ZSBvZiB0aGUgZWxsaXBzZS5cbiAqIEBwYXJhbSAge051bWJlcn0gdyB3aWR0aCBvZiB0aGUgZWxsaXBzZS5cbiAqIEBwYXJhbSAge051bWJlcn0gW2hdIGhlaWdodCBvZiB0aGUgZWxsaXBzZS5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBlbGxpcHNlKDU2LCA0NiwgNTUsIDU1KTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqd2hpdGUgZWxsaXBzZSB3aXRoIGJsYWNrIG91dGxpbmUgaW4gbWlkZGxlLXJpZ2h0IG9mIGNhbnZhcyB0aGF0IGlzIDU1eDU1LlxuICpcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGVsbGlwc2VcbiAqIEBwYXJhbSAge051bWJlcn0geFxuICogQHBhcmFtICB7TnVtYmVyfSB5XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHdcbiAqIEBwYXJhbSAge051bWJlcn0gaFxuICogQHBhcmFtICB7SW50ZWdlcn0gZGV0YWlsIG51bWJlciBvZiByYWRpYWwgc2VjdG9ycyB0byBkcmF3XG4gKi9cbnA1LnByb3RvdHlwZS5lbGxpcHNlID0gZnVuY3Rpb24oeCwgeSwgdywgaCwgZGV0YWlsWCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdlbGxpcHNlJywgYXJndW1lbnRzKTtcblxuICAvLyBwNSBzdXBwb3J0cyBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0cyBmb3IgcmVjdHNcbiAgaWYgKHcgPCAwKSB7XG4gICAgdyA9IE1hdGguYWJzKHcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBoID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIER1cGxpY2F0ZSAzcmQgYXJndW1lbnQgaWYgb25seSAzIGdpdmVuLlxuICAgIGggPSB3O1xuICB9IGVsc2UgaWYgKGggPCAwKSB7XG4gICAgaCA9IE1hdGguYWJzKGgpO1xuICB9XG5cbiAgaWYgKHRoaXMuX3JlbmRlcmVyLl9kb1N0cm9rZSB8fCB0aGlzLl9yZW5kZXJlci5fZG9GaWxsKSB7XG4gICAgdmFyIHZhbHMgPSBjYW52YXMubW9kZUFkanVzdCh4LCB5LCB3LCBoLCB0aGlzLl9yZW5kZXJlci5fZWxsaXBzZU1vZGUpO1xuICAgIHRoaXMuX3JlbmRlcmVyLmVsbGlwc2UoW3ZhbHMueCwgdmFscy55LCB2YWxzLncsIHZhbHMuaCwgZGV0YWlsWF0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuLyoqXG4gKiBEcmF3cyBhIGxpbmUgKGEgZGlyZWN0IHBhdGggYmV0d2VlbiB0d28gcG9pbnRzKSB0byB0aGUgc2NyZWVuLiBUaGUgdmVyc2lvblxuICogb2YgbGluZSgpIHdpdGggZm91ciBwYXJhbWV0ZXJzIGRyYXdzIHRoZSBsaW5lIGluIDJELiBUbyBjb2xvciBhIGxpbmUsIHVzZVxuICogdGhlIHN0cm9rZSgpIGZ1bmN0aW9uLiBBIGxpbmUgY2Fubm90IGJlIGZpbGxlZCwgdGhlcmVmb3JlIHRoZSBmaWxsKClcbiAqIGZ1bmN0aW9uIHdpbGwgbm90IGFmZmVjdCB0aGUgY29sb3Igb2YgYSBsaW5lLiAyRCBsaW5lcyBhcmUgZHJhd24gd2l0aCBhXG4gKiB3aWR0aCBvZiBvbmUgcGl4ZWwgYnkgZGVmYXVsdCwgYnV0IHRoaXMgY2FuIGJlIGNoYW5nZWQgd2l0aCB0aGVcbiAqIHN0cm9rZVdlaWdodCgpIGZ1bmN0aW9uLlxuICpcbiAqIEBtZXRob2QgbGluZVxuICogQHBhcmFtICB7TnVtYmVyfSB4MSB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB5MSB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB4MiB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geTIgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50XG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogbGluZSgzMCwgMjAsIDg1LCA3NSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBsaW5lKDMwLCAyMCwgODUsIDIwKTtcbiAqIHN0cm9rZSgxMjYpO1xuICogbGluZSg4NSwgMjAsIDg1LCA3NSk7XG4gKiBzdHJva2UoMjU1KTtcbiAqIGxpbmUoODUsIDc1LCAzMCwgNzUpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICpsaW5lIDc4IHBpeGVscyBsb25nIHJ1bm5pbmcgZnJvbSBtaWQtdG9wIHRvIGJvdHRvbS1yaWdodCBvZiBjYW52YXMuXG4gKjMgbGluZXMgb2YgdmFyaW91cyBzdHJva2Ugc2l6ZXMuIEZvcm0gdG9wLCBib3R0b20gYW5kIHJpZ2h0IHNpZGVzIG9mIGEgc3F1YXJlLlxuICpcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGxpbmVcbiAqIEBwYXJhbSAge051bWJlcn0geDFcbiAqIEBwYXJhbSAge051bWJlcn0geTFcbiAqIEBwYXJhbSAge051bWJlcn0gejEgdGhlIHotY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDJcbiAqIEBwYXJhbSAge051bWJlcn0geTJcbiAqIEBwYXJhbSAge051bWJlcn0gejIgdGhlIHotY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50XG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1LnByb3RvdHlwZS5saW5lID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2xpbmUnLCBhcmd1bWVudHMpO1xuXG4gIGlmICh0aGlzLl9yZW5kZXJlci5fZG9TdHJva2UpIHtcbiAgICB0aGlzLl9yZW5kZXJlci5saW5lLmFwcGx5KHRoaXMuX3JlbmRlcmVyLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERyYXdzIGEgcG9pbnQsIGEgY29vcmRpbmF0ZSBpbiBzcGFjZSBhdCB0aGUgZGltZW5zaW9uIG9mIG9uZSBwaXhlbC5cbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGhvcml6b250YWwgdmFsdWUgZm9yIHRoZSBwb2ludCwgdGhlIHNlY29uZFxuICogdmFsdWUgaXMgdGhlIHZlcnRpY2FsIHZhbHVlIGZvciB0aGUgcG9pbnQuIFRoZSBjb2xvciBvZiB0aGUgcG9pbnQgaXNcbiAqIGRldGVybWluZWQgYnkgdGhlIGN1cnJlbnQgc3Ryb2tlLlxuICpcbiAqIEBtZXRob2QgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkgdGhlIHktY29vcmRpbmF0ZVxuICogQHBhcmFtICB7TnVtYmVyfSBbel0gdGhlIHotY29vcmRpbmF0ZSAoZm9yIFdFQkdMIG1vZGUpXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogcG9pbnQoMzAsIDIwKTtcbiAqIHBvaW50KDg1LCAyMCk7XG4gKiBwb2ludCg4NSwgNzUpO1xuICogcG9pbnQoMzAsIDc1KTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqNCBwb2ludHMgY2VudGVyZWQgaW4gdGhlIG1pZGRsZS1yaWdodCBvZiB0aGUgY2FudmFzLlxuICpcbiAqL1xucDUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3BvaW50JywgYXJndW1lbnRzKTtcblxuICBpZiAodGhpcy5fcmVuZGVyZXIuX2RvU3Ryb2tlKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIucG9pbnQuYXBwbHkodGhpcy5fcmVuZGVyZXIsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRHJhdyBhIHF1YWQuIEEgcXVhZCBpcyBhIHF1YWRyaWxhdGVyYWwsIGEgZm91ciBzaWRlZCBwb2x5Z29uLiBJdCBpc1xuICogc2ltaWxhciB0byBhIHJlY3RhbmdsZSwgYnV0IHRoZSBhbmdsZXMgYmV0d2VlbiBpdHMgZWRnZXMgYXJlIG5vdFxuICogY29uc3RyYWluZWQgdG8gbmluZXR5IGRlZ3JlZXMuIFRoZSBmaXJzdCBwYWlyIG9mIHBhcmFtZXRlcnMgKHgxLHkxKVxuICogc2V0cyB0aGUgZmlyc3QgdmVydGV4IGFuZCB0aGUgc3Vic2VxdWVudCBwYWlycyBzaG91bGQgcHJvY2VlZFxuICogY2xvY2t3aXNlIG9yIGNvdW50ZXItY2xvY2t3aXNlIGFyb3VuZCB0aGUgZGVmaW5lZCBzaGFwZS5cbiAqXG4gKiBAbWV0aG9kIHF1YWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MSB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludFxuICogQHBhcmFtIHtOdW1iZXJ9IHkxIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0ge051bWJlcn0geDIgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50XG4gKiBAcGFyYW0ge051bWJlcn0geTIgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50XG4gKiBAcGFyYW0ge051bWJlcn0geDMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgcG9pbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSB0aGlyZCBwb2ludFxuICogQHBhcmFtIHtOdW1iZXJ9IHg0IHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGZvdXJ0aCBwb2ludFxuICogQHBhcmFtIHtOdW1iZXJ9IHk0IHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGZvdXJ0aCBwb2ludFxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHF1YWQoMzgsIDMxLCA4NiwgMjAsIDY5LCA2MywgMzAsIDc2KTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqaXJyZWd1bGFyIHdoaXRlIHF1YWRyaWxhdGVyYWwgc2hhcGUgd2l0aCBibGFjayBvdXRsaW5lIG1pZC1yaWdodCBvZiBjYW52YXMuXG4gKlxuICovXG4vKipcbiAqIEBtZXRob2QgcXVhZFxuICogQHBhcmFtIHtOdW1iZXJ9IHgxXG4gKiBAcGFyYW0ge051bWJlcn0geTFcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MVxuICogQHBhcmFtIHtOdW1iZXJ9IHgyXG4gKiBAcGFyYW0ge051bWJlcn0geTJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MlxuICogQHBhcmFtIHtOdW1iZXJ9IHgzXG4gKiBAcGFyYW0ge051bWJlcn0geTNcbiAqIEBwYXJhbSB7TnVtYmVyfSB6M1xuICogQHBhcmFtIHtOdW1iZXJ9IHg0XG4gKiBAcGFyYW0ge051bWJlcn0geTRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6NFxuICogQGNoYWluYWJsZVxuICovXG5wNS5wcm90b3R5cGUucXVhZCA9IGZ1bmN0aW9uKCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdxdWFkJywgYXJndW1lbnRzKTtcblxuICBpZiAodGhpcy5fcmVuZGVyZXIuX2RvU3Ryb2tlIHx8IHRoaXMuX3JlbmRlcmVyLl9kb0ZpbGwpIHtcbiAgICB0aGlzLl9yZW5kZXJlci5xdWFkLmFwcGx5KHRoaXMuX3JlbmRlcmVyLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERyYXdzIGEgcmVjdGFuZ2xlIHRvIHRoZSBzY3JlZW4uIEEgcmVjdGFuZ2xlIGlzIGEgZm91ci1zaWRlZCBzaGFwZSB3aXRoXG4gKiBldmVyeSBhbmdsZSBhdCBuaW5ldHkgZGVncmVlcy4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIHNldFxuICogdGhlIGxvY2F0aW9uIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciwgdGhlIHRoaXJkIHNldHMgdGhlIHdpZHRoLCBhbmQgdGhlXG4gKiBmb3VydGggc2V0cyB0aGUgaGVpZ2h0LiBUaGUgd2F5IHRoZXNlIHBhcmFtZXRlcnMgYXJlIGludGVycHJldGVkLCBob3dldmVyLFxuICogbWF5IGJlIGNoYW5nZWQgd2l0aCB0aGUgcmVjdE1vZGUoKSBmdW5jdGlvbi5cbiAqIDxicj48YnI+XG4gKiBUaGUgZmlmdGgsIHNpeHRoLCBzZXZlbnRoIGFuZCBlaWdodGggcGFyYW1ldGVycywgaWYgc3BlY2lmaWVkLFxuICogZGV0ZXJtaW5lIGNvcm5lciByYWRpdXMgZm9yIHRoZSB0b3AtcmlnaHQsIHRvcC1sZWZ0LCBsb3dlci1yaWdodCBhbmRcbiAqIGxvd2VyLWxlZnQgY29ybmVycywgcmVzcGVjdGl2ZWx5LiBBbiBvbWl0dGVkIGNvcm5lciByYWRpdXMgcGFyYW1ldGVyIGlzIHNldFxuICogdG8gdGhlIHZhbHVlIG9mIHRoZSBwcmV2aW91c2x5IHNwZWNpZmllZCByYWRpdXMgdmFsdWUgaW4gdGhlIHBhcmFtZXRlciBsaXN0LlxuICpcbiAqIEBtZXRob2QgcmVjdFxuICogQHBhcmFtICB7TnVtYmVyfSB4ICB4LWNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS5cbiAqIEBwYXJhbSAge051bWJlcn0geSAgeS1jb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHcgIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGggIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLlxuICogQHBhcmFtICB7TnVtYmVyfSBbdGxdIG9wdGlvbmFsIHJhZGl1cyBvZiB0b3AtbGVmdCBjb3JuZXIuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt0cl0gb3B0aW9uYWwgcmFkaXVzIG9mIHRvcC1yaWdodCBjb3JuZXIuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFticl0gb3B0aW9uYWwgcmFkaXVzIG9mIGJvdHRvbS1yaWdodCBjb3JuZXIuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFtibF0gb3B0aW9uYWwgcmFkaXVzIG9mIGJvdHRvbS1sZWZ0IGNvcm5lci5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBEcmF3IGEgcmVjdGFuZ2xlIGF0IGxvY2F0aW9uICgzMCwgMjApIHdpdGggYSB3aWR0aCBhbmQgaGVpZ2h0IG9mIDU1LlxuICogcmVjdCgzMCwgMjAsIDU1LCA1NSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBEcmF3IGEgcmVjdGFuZ2xlIHdpdGggcm91bmRlZCBjb3JuZXJzLCBlYWNoIGhhdmluZyBhIHJhZGl1cyBvZiAyMC5cbiAqIHJlY3QoMzAsIDIwLCA1NSwgNTUsIDIwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIERyYXcgYSByZWN0YW5nbGUgd2l0aCByb3VuZGVkIGNvcm5lcnMgaGF2aW5nIHRoZSBmb2xsb3dpbmcgcmFkaWk6XG4gKiAvLyB0b3AtbGVmdCA9IDIwLCB0b3AtcmlnaHQgPSAxNSwgYm90dG9tLXJpZ2h0ID0gMTAsIGJvdHRvbS1sZWZ0ID0gNS5cbiAqIHJlY3QoMzAsIDIwLCA1NSwgNTUsIDIwLCAxNSwgMTAsIDUpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogNTV4NTUgd2hpdGUgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgaW4gbWlkLXJpZ2h0IG9mIGNhbnZhcy5cbiAqIDU1eDU1IHdoaXRlIHJlY3Qgd2l0aCBibGFjayBvdXRsaW5lIGFuZCByb3VuZGVkIGVkZ2VzIGluIG1pZC1yaWdodCBvZiBjYW52YXMuXG4gKiA1NXg1NSB3aGl0ZSByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBhbmQgcm91bmRlZCBlZGdlcyBvZiBkaWZmZXJlbnQgcmFkaWkuXG4gKi9cbi8qKlxuICogQG1ldGhvZCByZWN0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSAge051bWJlcn0geVxuICogQHBhcmFtICB7TnVtYmVyfSB3XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGhcbiAqIEBwYXJhbSAge0ludGVnZXJ9IFtkZXRhaWxYXSBudW1iZXIgb2Ygc2VnbWVudHMgaW4gdGhlIHgtZGlyZWN0aW9uXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBbZGV0YWlsWV0gbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoZSB5LWRpcmVjdGlvblxuICogQGNoYWluYWJsZVxuICovXG5wNS5wcm90b3R5cGUucmVjdCA9IGZ1bmN0aW9uKCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdyZWN0JywgYXJndW1lbnRzKTtcblxuICBpZiAodGhpcy5fcmVuZGVyZXIuX2RvU3Ryb2tlIHx8IHRoaXMuX3JlbmRlcmVyLl9kb0ZpbGwpIHtcbiAgICB2YXIgdmFscyA9IGNhbnZhcy5tb2RlQWRqdXN0KFxuICAgICAgYXJndW1lbnRzWzBdLFxuICAgICAgYXJndW1lbnRzWzFdLFxuICAgICAgYXJndW1lbnRzWzJdLFxuICAgICAgYXJndW1lbnRzWzNdLFxuICAgICAgdGhpcy5fcmVuZGVyZXIuX3JlY3RNb2RlXG4gICAgKTtcbiAgICB2YXIgYXJncyA9IFt2YWxzLngsIHZhbHMueSwgdmFscy53LCB2YWxzLmhdO1xuICAgIC8vIGFwcGVuZCB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgKGVpdGhlciBjb3JuZGVyIHJhZGlpLCBvclxuICAgIC8vIHNlZ21lbnQgZGV0YWlscykgdG8gdGhlIGFyZ3VtZW50IGxpc3RcbiAgICBmb3IgKHZhciBpID0gNDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyZXIucmVjdChhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBIHRyaWFuZ2xlIGlzIGEgcGxhbmUgY3JlYXRlZCBieSBjb25uZWN0aW5nIHRocmVlIHBvaW50cy4gVGhlIGZpcnN0IHR3b1xuICogYXJndW1lbnRzIHNwZWNpZnkgdGhlIGZpcnN0IHBvaW50LCB0aGUgbWlkZGxlIHR3byBhcmd1bWVudHMgc3BlY2lmeSB0aGVcbiAqIHNlY29uZCBwb2ludCwgYW5kIHRoZSBsYXN0IHR3byBhcmd1bWVudHMgc3BlY2lmeSB0aGUgdGhpcmQgcG9pbnQuXG4gKlxuICogQG1ldGhvZCB0cmlhbmdsZVxuICogQHBhcmFtICB7TnVtYmVyfSB4MSB4LWNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkxIHktY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDIgeC1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geTIgeS1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDMgeC1jb29yZGluYXRlIG9mIHRoZSB0aGlyZCBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB5MyB5LWNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIHBvaW50XG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdHJpYW5nbGUoMzAsIDc1LCA1OCwgMjAsIDg2LCA3NSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKkBhbHRcbiAqIHdoaXRlIHRyaWFuZ2xlIHdpdGggYmxhY2sgb3V0bGluZSBpbiBtaWQtcmlnaHQgb2YgY2FudmFzLlxuICpcbiAqL1xucDUucHJvdG90eXBlLnRyaWFuZ2xlID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3RyaWFuZ2xlJywgYXJndW1lbnRzKTtcblxuICBpZiAodGhpcy5fcmVuZGVyZXIuX2RvU3Ryb2tlIHx8IHRoaXMuX3JlbmRlcmVyLl9kb0ZpbGwpIHtcbiAgICB0aGlzLl9yZW5kZXJlci50cmlhbmdsZShhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4vY2FudmFzXCI6MjAsXCIuL2NvbnN0YW50c1wiOjIxLFwiLi9jb3JlXCI6MjIsXCIuL2Vycm9yX2hlbHBlcnNcIjoyNX1dLDE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBTaGFwZVxuICogQHN1Ym1vZHVsZSBBdHRyaWJ1dGVzXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICogQHJlcXVpcmVzIGNvbnN0YW50c1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi9jb3JlJyk7XG52YXIgY29uc3RhbnRzID0gX2RlcmVxXygnLi9jb25zdGFudHMnKTtcblxuLyoqXG4gKiBNb2RpZmllcyB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCBlbGxpcHNlcyBhcmUgZHJhd24gYnkgY2hhbmdpbmcgdGhlIHdheVxuICogaW4gd2hpY2ggcGFyYW1ldGVycyBnaXZlbiB0byBlbGxpcHNlKCkgYXJlIGludGVycHJldGVkLlxuICogPGJyPjxicj5cbiAqIFRoZSBkZWZhdWx0IG1vZGUgaXMgZWxsaXBzZU1vZGUoQ0VOVEVSKSwgd2hpY2ggaW50ZXJwcmV0cyB0aGUgZmlyc3QgdHdvXG4gKiBwYXJhbWV0ZXJzIG9mIGVsbGlwc2UoKSBhcyB0aGUgc2hhcGUncyBjZW50ZXIgcG9pbnQsIHdoaWxlIHRoZSB0aGlyZCBhbmRcbiAqIGZvdXJ0aCBwYXJhbWV0ZXJzIGFyZSBpdHMgd2lkdGggYW5kIGhlaWdodC5cbiAqIDxicj48YnI+XG4gKiBlbGxpcHNlTW9kZShSQURJVVMpIGFsc28gdXNlcyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgb2YgZWxsaXBzZSgpIGFzXG4gKiB0aGUgc2hhcGUncyBjZW50ZXIgcG9pbnQsIGJ1dCB1c2VzIHRoZSB0aGlyZCBhbmQgZm91cnRoIHBhcmFtZXRlcnMgdG9cbiAqIHNwZWNpZnkgaGFsZiBvZiB0aGUgc2hhcGVzJ3Mgd2lkdGggYW5kIGhlaWdodC5cbiAqIDxicj48YnI+XG4gKiBlbGxpcHNlTW9kZShDT1JORVIpIGludGVycHJldHMgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIG9mIGVsbGlwc2UoKSBhc1xuICogdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBzaGFwZSwgd2hpbGUgdGhlIHRoaXJkIGFuZCBmb3VydGggcGFyYW1ldGVyc1xuICogYXJlIGl0cyB3aWR0aCBhbmQgaGVpZ2h0LlxuICogPGJyPjxicj5cbiAqIGVsbGlwc2VNb2RlKENPUk5FUlMpIGludGVycHJldHMgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIG9mIGVsbGlwc2UoKSBhc1xuICogdGhlIGxvY2F0aW9uIG9mIG9uZSBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyBib3gsIGFuZCB0aGUgdGhpcmRcbiAqIGFuZCBmb3VydGggcGFyYW1ldGVycyBhcyB0aGUgbG9jYXRpb24gb2YgdGhlIG9wcG9zaXRlIGNvcm5lci5cbiAqIDxicj48YnI+XG4gKiBUaGUgcGFyYW1ldGVyIG11c3QgYmUgd3JpdHRlbiBpbiBBTEwgQ0FQUyBiZWNhdXNlIEphdmFzY3JpcHQgaXMgYVxuICogY2FzZS1zZW5zaXRpdmUgbGFuZ3VhZ2UuXG4gKlxuICogQG1ldGhvZCBlbGxpcHNlTW9kZVxuICogQHBhcmFtICB7Q29uc3RhbnR9IG1vZGUgZWl0aGVyIENFTlRFUiwgUkFESVVTLCBDT1JORVIsIG9yIENPUk5FUlNcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBlbGxpcHNlTW9kZShSQURJVVMpOyAvLyBTZXQgZWxsaXBzZU1vZGUgdG8gUkFESVVTXG4gKiBmaWxsKDI1NSk7IC8vIFNldCBmaWxsIHRvIHdoaXRlXG4gKiBlbGxpcHNlKDUwLCA1MCwgMzAsIDMwKTsgLy8gRHJhdyB3aGl0ZSBlbGxpcHNlIHVzaW5nIFJBRElVUyBtb2RlXG4gKlxuICogZWxsaXBzZU1vZGUoQ0VOVEVSKTsgLy8gU2V0IGVsbGlwc2VNb2RlIHRvIENFTlRFUlxuICogZmlsbCgxMDApOyAvLyBTZXQgZmlsbCB0byBncmF5XG4gKiBlbGxpcHNlKDUwLCA1MCwgMzAsIDMwKTsgLy8gRHJhdyBncmF5IGVsbGlwc2UgdXNpbmcgQ0VOVEVSIG1vZGVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGVsbGlwc2VNb2RlKENPUk5FUik7IC8vIFNldCBlbGxpcHNlTW9kZSBpcyBDT1JORVJcbiAqIGZpbGwoMjU1KTsgLy8gU2V0IGZpbGwgdG8gd2hpdGVcbiAqIGVsbGlwc2UoMjUsIDI1LCA1MCwgNTApOyAvLyBEcmF3IHdoaXRlIGVsbGlwc2UgdXNpbmcgQ09STkVSIG1vZGVcbiAqXG4gKiBlbGxpcHNlTW9kZShDT1JORVJTKTsgLy8gU2V0IGVsbGlwc2VNb2RlIHRvIENPUk5FUlNcbiAqIGZpbGwoMTAwKTsgLy8gU2V0IGZpbGwgdG8gZ3JheVxuICogZWxsaXBzZSgyNSwgMjUsIDUwLCA1MCk7IC8vIERyYXcgZ3JheSBlbGxpcHNlIHVzaW5nIENPUk5FUlMgbW9kZVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogNjB4NjAgd2hpdGUgZWxsaXBzZSBhbmQgMzB4MzAgZ3JleSBlbGxpcHNlIHdpdGggYmxhY2sgb3V0bGluZXMgYXQgY2VudGVyLlxuICogNjB4NjAgd2hpdGUgZWxsaXBzZSBAY2VudGVyIGFuZCAzMHgzMCBncmV5IGVsbGlwc2UgdG9wLXJpZ2h0LCBibGFjayBvdXRsaW5lcy5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5lbGxpcHNlTW9kZSA9IGZ1bmN0aW9uKG0pIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnZWxsaXBzZU1vZGUnLCBhcmd1bWVudHMpO1xuICBpZiAoXG4gICAgbSA9PT0gY29uc3RhbnRzLkNPUk5FUiB8fFxuICAgIG0gPT09IGNvbnN0YW50cy5DT1JORVJTIHx8XG4gICAgbSA9PT0gY29uc3RhbnRzLlJBRElVUyB8fFxuICAgIG0gPT09IGNvbnN0YW50cy5DRU5URVJcbiAgKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIuX2VsbGlwc2VNb2RlID0gbTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRHJhd3MgYWxsIGdlb21ldHJ5IHdpdGggamFnZ2VkIChhbGlhc2VkKSBlZGdlcy4gTm90ZSB0aGF0IHNtb290aCgpIGlzXG4gKiBhY3RpdmUgYnkgZGVmYXVsdCwgc28gaXQgaXMgbmVjZXNzYXJ5IHRvIGNhbGwgbm9TbW9vdGgoKSB0byBkaXNhYmxlXG4gKiBzbW9vdGhpbmcgb2YgZ2VvbWV0cnksIGltYWdlcywgYW5kIGZvbnRzLlxuICpcbiAqIEBtZXRob2Qgbm9TbW9vdGhcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBiYWNrZ3JvdW5kKDApO1xuICogbm9TdHJva2UoKTtcbiAqIHNtb290aCgpO1xuICogZWxsaXBzZSgzMCwgNDgsIDM2LCAzNik7XG4gKiBub1Ntb290aCgpO1xuICogZWxsaXBzZSg3MCwgNDgsIDM2LCAzNik7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAyIHBpeGVsYXRlZCAzNngzNiB3aGl0ZSBlbGxpcHNlcyB0byBsZWZ0ICYgcmlnaHQgb2YgY2VudGVyLCBibGFjayBiYWNrZ3JvdW5kXG4gKlxuICovXG5wNS5wcm90b3R5cGUubm9TbW9vdGggPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVuZGVyZXIubm9TbW9vdGgoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIE1vZGlmaWVzIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHJlY3RhbmdsZXMgYXJlIGRyYXduIGJ5IGNoYW5naW5nIHRoZSB3YXlcbiAqIGluIHdoaWNoIHBhcmFtZXRlcnMgZ2l2ZW4gdG8gcmVjdCgpIGFyZSBpbnRlcnByZXRlZC5cbiAqIDxicj48YnI+XG4gKiBUaGUgZGVmYXVsdCBtb2RlIGlzIHJlY3RNb2RlKENPUk5FUiksIHdoaWNoIGludGVycHJldHMgdGhlIGZpcnN0IHR3b1xuICogcGFyYW1ldGVycyBvZiByZWN0KCkgYXMgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBzaGFwZSwgd2hpbGUgdGhlXG4gKiB0aGlyZCBhbmQgZm91cnRoIHBhcmFtZXRlcnMgYXJlIGl0cyB3aWR0aCBhbmQgaGVpZ2h0LlxuICogPGJyPjxicj5cbiAqIHJlY3RNb2RlKENPUk5FUlMpIGludGVycHJldHMgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIG9mIHJlY3QoKSBhcyB0aGVcbiAqIGxvY2F0aW9uIG9mIG9uZSBjb3JuZXIsIGFuZCB0aGUgdGhpcmQgYW5kIGZvdXJ0aCBwYXJhbWV0ZXJzIGFzIHRoZVxuICogbG9jYXRpb24gb2YgdGhlIG9wcG9zaXRlIGNvcm5lci5cbiAqIDxicj48YnI+XG4gKiByZWN0TW9kZShDRU5URVIpIGludGVycHJldHMgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIG9mIHJlY3QoKSBhcyB0aGVcbiAqIHNoYXBlJ3MgY2VudGVyIHBvaW50LCB3aGlsZSB0aGUgdGhpcmQgYW5kIGZvdXJ0aCBwYXJhbWV0ZXJzIGFyZSBpdHNcbiAqIHdpZHRoIGFuZCBoZWlnaHQuXG4gKiA8YnI+PGJyPlxuICogcmVjdE1vZGUoUkFESVVTKSBhbHNvIHVzZXMgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIG9mIHJlY3QoKSBhcyB0aGVcbiAqIHNoYXBlJ3MgY2VudGVyIHBvaW50LCBidXQgdXNlcyB0aGUgdGhpcmQgYW5kIGZvdXJ0aCBwYXJhbWV0ZXJzIHRvIHNwZWNpZnlcbiAqIGhhbGYgb2YgdGhlIHNoYXBlcydzIHdpZHRoIGFuZCBoZWlnaHQuXG4gKiA8YnI+PGJyPlxuICogVGhlIHBhcmFtZXRlciBtdXN0IGJlIHdyaXR0ZW4gaW4gQUxMIENBUFMgYmVjYXVzZSBKYXZhc2NyaXB0IGlzIGFcbiAqIGNhc2Utc2Vuc2l0aXZlIGxhbmd1YWdlLlxuICpcbiAqIEBtZXRob2QgcmVjdE1vZGVcbiAqIEBwYXJhbSAge0NvbnN0YW50fSBtb2RlIGVpdGhlciBDT1JORVIsIENPUk5FUlMsIENFTlRFUiwgb3IgUkFESVVTXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogcmVjdE1vZGUoQ09STkVSKTsgLy8gRGVmYXVsdCByZWN0TW9kZSBpcyBDT1JORVJcbiAqIGZpbGwoMjU1KTsgLy8gU2V0IGZpbGwgdG8gd2hpdGVcbiAqIHJlY3QoMjUsIDI1LCA1MCwgNTApOyAvLyBEcmF3IHdoaXRlIHJlY3QgdXNpbmcgQ09STkVSIG1vZGVcbiAqXG4gKiByZWN0TW9kZShDT1JORVJTKTsgLy8gU2V0IHJlY3RNb2RlIHRvIENPUk5FUlNcbiAqIGZpbGwoMTAwKTsgLy8gU2V0IGZpbGwgdG8gZ3JheVxuICogcmVjdCgyNSwgMjUsIDUwLCA1MCk7IC8vIERyYXcgZ3JheSByZWN0IHVzaW5nIENPUk5FUlMgbW9kZVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogcmVjdE1vZGUoUkFESVVTKTsgLy8gU2V0IHJlY3RNb2RlIHRvIFJBRElVU1xuICogZmlsbCgyNTUpOyAvLyBTZXQgZmlsbCB0byB3aGl0ZVxuICogcmVjdCg1MCwgNTAsIDMwLCAzMCk7IC8vIERyYXcgd2hpdGUgcmVjdCB1c2luZyBSQURJVVMgbW9kZVxuICpcbiAqIHJlY3RNb2RlKENFTlRFUik7IC8vIFNldCByZWN0TW9kZSB0byBDRU5URVJcbiAqIGZpbGwoMTAwKTsgLy8gU2V0IGZpbGwgdG8gZ3JheVxuICogcmVjdCg1MCwgNTAsIDMwLCAzMCk7IC8vIERyYXcgZ3JheSByZWN0IHVzaW5nIENFTlRFUiBtb2RlXG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiA1MHg1MCB3aGl0ZSByZWN0IGF0IGNlbnRlciBhbmQgMjV4MjUgZ3JleSByZWN0IGluIHRoZSB0b3AgbGVmdCBvZiB0aGUgb3RoZXIuXG4gKiA1MHg1MCB3aGl0ZSByZWN0IGF0IGNlbnRlciBhbmQgMjV4MjUgZ3JleSByZWN0IGluIHRoZSBjZW50ZXIgb2YgdGhlIG90aGVyLlxuICpcbiAqL1xucDUucHJvdG90eXBlLnJlY3RNb2RlID0gZnVuY3Rpb24obSkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdyZWN0TW9kZScsIGFyZ3VtZW50cyk7XG4gIGlmIChcbiAgICBtID09PSBjb25zdGFudHMuQ09STkVSIHx8XG4gICAgbSA9PT0gY29uc3RhbnRzLkNPUk5FUlMgfHxcbiAgICBtID09PSBjb25zdGFudHMuUkFESVVTIHx8XG4gICAgbSA9PT0gY29uc3RhbnRzLkNFTlRFUlxuICApIHtcbiAgICB0aGlzLl9yZW5kZXJlci5fcmVjdE1vZGUgPSBtO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBEcmF3cyBhbGwgZ2VvbWV0cnkgd2l0aCBzbW9vdGggKGFudGktYWxpYXNlZCkgZWRnZXMuIHNtb290aCgpIHdpbGwgYWxzb1xuICogaW1wcm92ZSBpbWFnZSBxdWFsaXR5IG9mIHJlc2l6ZWQgaW1hZ2VzLiBOb3RlIHRoYXQgc21vb3RoKCkgaXMgYWN0aXZlIGJ5XG4gKiBkZWZhdWx0OyBub1Ntb290aCgpIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgc21vb3RoaW5nIG9mIGdlb21ldHJ5LFxuICogaW1hZ2VzLCBhbmQgZm9udHMuXG4gKlxuICogQG1ldGhvZCBzbW9vdGhcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBiYWNrZ3JvdW5kKDApO1xuICogbm9TdHJva2UoKTtcbiAqIHNtb290aCgpO1xuICogZWxsaXBzZSgzMCwgNDgsIDM2LCAzNik7XG4gKiBub1Ntb290aCgpO1xuICogZWxsaXBzZSg3MCwgNDgsIDM2LCAzNik7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAyIHBpeGVsYXRlZCAzNngzNiB3aGl0ZSBlbGxpcHNlcyBvbmUgbGVmdCBvbmUgcmlnaHQgb2YgY2VudGVyLiBPbiBibGFjay5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5zbW9vdGggPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVuZGVyZXIuc21vb3RoKCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzdHlsZSBmb3IgcmVuZGVyaW5nIGxpbmUgZW5kaW5ncy4gVGhlc2UgZW5kcyBhcmUgZWl0aGVyIHNxdWFyZWQsXG4gKiBleHRlbmRlZCwgb3Igcm91bmRlZCwgZWFjaCBvZiB3aGljaCBzcGVjaWZpZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZ1xuICogcGFyYW1ldGVyczogU1FVQVJFLCBQUk9KRUNULCBhbmQgUk9VTkQuIFRoZSBkZWZhdWx0IGNhcCBpcyBST1VORC5cbiAqXG4gKiBAbWV0aG9kIHN0cm9rZUNhcFxuICogQHBhcmFtICB7Q29uc3RhbnR9IGNhcCBlaXRoZXIgU1FVQVJFLCBQUk9KRUNULCBvciBST1VORFxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHN0cm9rZVdlaWdodCgxMi4wKTtcbiAqIHN0cm9rZUNhcChST1VORCk7XG4gKiBsaW5lKDIwLCAzMCwgODAsIDMwKTtcbiAqIHN0cm9rZUNhcChTUVVBUkUpO1xuICogbGluZSgyMCwgNTAsIDgwLCA1MCk7XG4gKiBzdHJva2VDYXAoUFJPSkVDVCk7XG4gKiBsaW5lKDIwLCA3MCwgODAsIDcwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDMgbGluZXMuIFRvcCBsaW5lOiByb3VuZGVkIGVuZHMsIG1pZDogc3F1YXJlZCwgYm90dG9tOmxvbmdlciBzcXVhcmVkIGVuZHMuXG4gKlxuICovXG5wNS5wcm90b3R5cGUuc3Ryb2tlQ2FwID0gZnVuY3Rpb24oY2FwKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3N0cm9rZUNhcCcsIGFyZ3VtZW50cyk7XG4gIGlmIChcbiAgICBjYXAgPT09IGNvbnN0YW50cy5ST1VORCB8fFxuICAgIGNhcCA9PT0gY29uc3RhbnRzLlNRVUFSRSB8fFxuICAgIGNhcCA9PT0gY29uc3RhbnRzLlBST0pFQ1RcbiAgKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIuc3Ryb2tlQ2FwKGNhcCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHN0eWxlIG9mIHRoZSBqb2ludHMgd2hpY2ggY29ubmVjdCBsaW5lIHNlZ21lbnRzLiBUaGVzZSBqb2ludHNcbiAqIGFyZSBlaXRoZXIgbWl0ZXJlZCwgYmV2ZWxlZCwgb3Igcm91bmRlZCBhbmQgc3BlY2lmaWVkIHdpdGggdGhlXG4gKiBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMgTUlURVIsIEJFVkVMLCBhbmQgUk9VTkQuIFRoZSBkZWZhdWx0IGpvaW50IGlzXG4gKiBNSVRFUi5cbiAqXG4gKiBAbWV0aG9kIHN0cm9rZUpvaW5cbiAqIEBwYXJhbSAge0NvbnN0YW50fSBqb2luIGVpdGhlciBNSVRFUiwgQkVWRUwsIFJPVU5EXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogbm9GaWxsKCk7XG4gKiBzdHJva2VXZWlnaHQoMTAuMCk7XG4gKiBzdHJva2VKb2luKE1JVEVSKTtcbiAqIGJlZ2luU2hhcGUoKTtcbiAqIHZlcnRleCgzNSwgMjApO1xuICogdmVydGV4KDY1LCA1MCk7XG4gKiB2ZXJ0ZXgoMzUsIDgwKTtcbiAqIGVuZFNoYXBlKCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBub0ZpbGwoKTtcbiAqIHN0cm9rZVdlaWdodCgxMC4wKTtcbiAqIHN0cm9rZUpvaW4oQkVWRUwpO1xuICogYmVnaW5TaGFwZSgpO1xuICogdmVydGV4KDM1LCAyMCk7XG4gKiB2ZXJ0ZXgoNjUsIDUwKTtcbiAqIHZlcnRleCgzNSwgODApO1xuICogZW5kU2hhcGUoKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIG5vRmlsbCgpO1xuICogc3Ryb2tlV2VpZ2h0KDEwLjApO1xuICogc3Ryb2tlSm9pbihST1VORCk7XG4gKiBiZWdpblNoYXBlKCk7XG4gKiB2ZXJ0ZXgoMzUsIDIwKTtcbiAqIHZlcnRleCg2NSwgNTApO1xuICogdmVydGV4KDM1LCA4MCk7XG4gKiBlbmRTaGFwZSgpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogUmlnaHQtZmFjaW5nIGFycm93aGVhZCBzaGFwZSB3aXRoIHBvaW50ZWQgdGlwIGluIGNlbnRlciBvZiBjYW52YXMuXG4gKiBSaWdodC1mYWNpbmcgYXJyb3doZWFkIHNoYXBlIHdpdGggZmxhdCB0aXAgaW4gY2VudGVyIG9mIGNhbnZhcy5cbiAqIFJpZ2h0LWZhY2luZyBhcnJvd2hlYWQgc2hhcGUgd2l0aCByb3VuZGVkIHRpcCBpbiBjZW50ZXIgb2YgY2FudmFzLlxuICpcbiAqL1xucDUucHJvdG90eXBlLnN0cm9rZUpvaW4gPSBmdW5jdGlvbihqb2luKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3N0cm9rZUpvaW4nLCBhcmd1bWVudHMpO1xuICBpZiAoXG4gICAgam9pbiA9PT0gY29uc3RhbnRzLlJPVU5EIHx8XG4gICAgam9pbiA9PT0gY29uc3RhbnRzLkJFVkVMIHx8XG4gICAgam9pbiA9PT0gY29uc3RhbnRzLk1JVEVSXG4gICkge1xuICAgIHRoaXMuX3JlbmRlcmVyLnN0cm9rZUpvaW4oam9pbik7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBzdHJva2UgdXNlZCBmb3IgbGluZXMsIHBvaW50cywgYW5kIHRoZSBib3JkZXJcbiAqIGFyb3VuZCBzaGFwZXMuIEFsbCB3aWR0aHMgYXJlIHNldCBpbiB1bml0cyBvZiBwaXhlbHMuXG4gKlxuICogQG1ldGhvZCBzdHJva2VXZWlnaHRcbiAqIEBwYXJhbSAge051bWJlcn0gd2VpZ2h0IHRoZSB3ZWlnaHQgKGluIHBpeGVscykgb2YgdGhlIHN0cm9rZVxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHN0cm9rZVdlaWdodCgxKTsgLy8gRGVmYXVsdFxuICogbGluZSgyMCwgMjAsIDgwLCAyMCk7XG4gKiBzdHJva2VXZWlnaHQoNCk7IC8vIFRoaWNrZXJcbiAqIGxpbmUoMjAsIDQwLCA4MCwgNDApO1xuICogc3Ryb2tlV2VpZ2h0KDEwKTsgLy8gQmVhc3RseVxuICogbGluZSgyMCwgNzAsIDgwLCA3MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAzIGhvcml6b250YWwgYmxhY2sgbGluZXMuIFRvcCBsaW5lOiB0aGluLCBtaWQ6IG1lZGl1bSwgYm90dG9tOnRoaWNrLlxuICpcbiAqL1xucDUucHJvdG90eXBlLnN0cm9rZVdlaWdodCA9IGZ1bmN0aW9uKHcpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnc3Ryb2tlV2VpZ2h0JywgYXJndW1lbnRzKTtcbiAgdGhpcy5fcmVuZGVyZXIuc3Ryb2tlV2VpZ2h0KHcpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi9jb25zdGFudHNcIjoyMSxcIi4vY29yZVwiOjIyfV0sMjA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAcmVxdWlyZXMgY29uc3RhbnRzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29uc3RhbnRzID0gX2RlcmVxXygnLi9jb25zdGFudHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1vZGVBZGp1c3Q6IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIG1vZGUpIHtcbiAgICBpZiAobW9kZSA9PT0gY29uc3RhbnRzLkNPUk5FUikge1xuICAgICAgcmV0dXJuIHsgeDogYSwgeTogYiwgdzogYywgaDogZCB9O1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gY29uc3RhbnRzLkNPUk5FUlMpIHtcbiAgICAgIHJldHVybiB7IHg6IGEsIHk6IGIsIHc6IGMgLSBhLCBoOiBkIC0gYiB9O1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gY29uc3RhbnRzLlJBRElVUykge1xuICAgICAgcmV0dXJuIHsgeDogYSAtIGMsIHk6IGIgLSBkLCB3OiAyICogYywgaDogMiAqIGQgfTtcbiAgICB9IGVsc2UgaWYgKG1vZGUgPT09IGNvbnN0YW50cy5DRU5URVIpIHtcbiAgICAgIHJldHVybiB7IHg6IGEgLSBjICogMC41LCB5OiBiIC0gZCAqIDAuNSwgdzogYywgaDogZCB9O1xuICAgIH1cbiAgfSxcblxuICBhcmNNb2RlQWRqdXN0OiBmdW5jdGlvbihhLCBiLCBjLCBkLCBtb2RlKSB7XG4gICAgaWYgKG1vZGUgPT09IGNvbnN0YW50cy5DT1JORVIpIHtcbiAgICAgIHJldHVybiB7IHg6IGEgKyBjICogMC41LCB5OiBiICsgZCAqIDAuNSwgdzogYywgaDogZCB9O1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gY29uc3RhbnRzLkNPUk5FUlMpIHtcbiAgICAgIHJldHVybiB7IHg6IGEsIHk6IGIsIHc6IGMgKyBhLCBoOiBkICsgYiB9O1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gY29uc3RhbnRzLlJBRElVUykge1xuICAgICAgcmV0dXJuIHsgeDogYSwgeTogYiwgdzogMiAqIGMsIGg6IDIgKiBkIH07XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSBjb25zdGFudHMuQ0VOVEVSKSB7XG4gICAgICByZXR1cm4geyB4OiBhLCB5OiBiLCB3OiBjLCBoOiBkIH07XG4gICAgfVxuICB9XG59O1xuXG59LHtcIi4vY29uc3RhbnRzXCI6MjF9XSwyMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgQ29uc3RhbnRzXG4gKiBAc3VibW9kdWxlIENvbnN0YW50c1xuICogQGZvciBwNVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFBJID0gTWF0aC5QSTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIEdSQVBISUNTIFJFTkRFUkVSXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gUDJEXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgUDJEOiAncDJkJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBXRUJHTFxuICAgKiBAZmluYWxcbiAgICovXG4gIFdFQkdMOiAnd2ViZ2wnLFxuXG4gIC8vIEVOVklST05NRU5UXG4gIEFSUk9XOiAnZGVmYXVsdCcsXG4gIENST1NTOiAnY3Jvc3NoYWlyJyxcbiAgSEFORDogJ3BvaW50ZXInLFxuICBNT1ZFOiAnbW92ZScsXG4gIFRFWFQ6ICd0ZXh0JyxcbiAgV0FJVDogJ3dhaXQnLFxuXG4gIC8vIFRSSUdPTk9NRVRSWVxuXG4gIC8qKlxuICAgKiBIQUxGX1BJIGlzIGEgbWF0aGVtYXRpY2FsIGNvbnN0YW50IHdpdGggdGhlIHZhbHVlXG4gICAqIDEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMuIEl0IGlzIGhhbGYgdGhlIHJhdGlvIG9mIHRoZVxuICAgKiBjaXJjdW1mZXJlbmNlIG9mIGEgY2lyY2xlIHRvIGl0cyBkaWFtZXRlci4gSXQgaXMgdXNlZnVsIGluXG4gICAqIGNvbWJpbmF0aW9uIHdpdGggdGhlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIHNpbigpIGFuZCBjb3MoKS5cbiAgICpcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IEhBTEZfUElcbiAgICogQGZpbmFsXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIGFyYyg1MCwgNTAsIDgwLCA4MCwgMCwgSEFMRl9QSSk7XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICpcbiAgICogQGFsdFxuICAgKiA4MHg4MCB3aGl0ZSBxdWFydGVyLWNpcmNsZSB3aXRoIGN1cnZlIHRvd2FyZCBib3R0b20gcmlnaHQgb2YgY2FudmFzLlxuICAgKlxuICAgKi9cbiAgSEFMRl9QSTogUEkgLyAyLFxuICAvKipcbiAgICogUEkgaXMgYSBtYXRoZW1hdGljYWwgY29uc3RhbnQgd2l0aCB0aGUgdmFsdWVcbiAgICogMy4xNDE1OTI2NTM1ODk3OTMyMzg0Ni4gSXQgaXMgdGhlIHJhdGlvIG9mIHRoZSBjaXJjdW1mZXJlbmNlXG4gICAqIG9mIGEgY2lyY2xlIHRvIGl0cyBkaWFtZXRlci4gSXQgaXMgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGhcbiAgICogdGhlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIHNpbigpIGFuZCBjb3MoKS5cbiAgICpcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFBJXG4gICAqIEBmaW5hbFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiBhcmMoNTAsIDUwLCA4MCwgODAsIDAsIFBJKTtcbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKlxuICAgKiBAYWx0XG4gICAqIHdoaXRlIGhhbGYtY2lyY2xlIHdpdGggY3VydmUgdG93YXJkIGJvdHRvbSBvZiBjYW52YXMuXG4gICAqXG4gICAqL1xuICBQSTogUEksXG4gIC8qKlxuICAgKiBRVUFSVEVSX1BJIGlzIGEgbWF0aGVtYXRpY2FsIGNvbnN0YW50IHdpdGggdGhlIHZhbHVlIDAuNzg1Mzk4Mi5cbiAgICogSXQgaXMgb25lIHF1YXJ0ZXIgdGhlIHJhdGlvIG9mIHRoZSBjaXJjdW1mZXJlbmNlIG9mIGEgY2lyY2xlIHRvXG4gICAqIGl0cyBkaWFtZXRlci4gSXQgaXMgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHRyaWdvbm9tZXRyaWNcbiAgICogZnVuY3Rpb25zIHNpbigpIGFuZCBjb3MoKS5cbiAgICpcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFFVQVJURVJfUElcbiAgICogQGZpbmFsXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIGFyYyg1MCwgNTAsIDgwLCA4MCwgMCwgUVVBUlRFUl9QSSk7XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICpcbiAgICogQGFsdFxuICAgKiB3aGl0ZSBlaWdodGgtY2lyY2xlIHJvdGF0ZWQgYWJvdXQgNDAgZGVncmVlcyB3aXRoIGN1cnZlIGJvdHRvbSByaWdodCBjYW52YXMuXG4gICAqXG4gICAqL1xuICBRVUFSVEVSX1BJOiBQSSAvIDQsXG4gIC8qKlxuICAgKiBUQVUgaXMgYW4gYWxpYXMgZm9yIFRXT19QSSwgYSBtYXRoZW1hdGljYWwgY29uc3RhbnQgd2l0aCB0aGVcbiAgICogdmFsdWUgNi4yODMxODUzMDcxNzk1ODY0NzY5My4gSXQgaXMgdHdpY2UgdGhlIHJhdGlvIG9mIHRoZVxuICAgKiBjaXJjdW1mZXJlbmNlIG9mIGEgY2lyY2xlIHRvIGl0cyBkaWFtZXRlci4gSXQgaXMgdXNlZnVsIGluXG4gICAqIGNvbWJpbmF0aW9uIHdpdGggdGhlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIHNpbigpIGFuZCBjb3MoKS5cbiAgICpcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFRBVVxuICAgKiBAZmluYWxcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogYXJjKDUwLCA1MCwgODAsIDgwLCAwLCBUQVUpO1xuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqXG4gICAqIEBhbHRcbiAgICogODB4ODAgd2hpdGUgZWxsaXBzZSBzaGFwZSBpbiBjZW50ZXIgb2YgY2FudmFzLlxuICAgKlxuICAgKi9cbiAgVEFVOiBQSSAqIDIsXG4gIC8qKlxuICAgKiBUV09fUEkgaXMgYSBtYXRoZW1hdGljYWwgY29uc3RhbnQgd2l0aCB0aGUgdmFsdWVcbiAgICogNi4yODMxODUzMDcxNzk1ODY0NzY5My4gSXQgaXMgdHdpY2UgdGhlIHJhdGlvIG9mIHRoZVxuICAgKiBjaXJjdW1mZXJlbmNlIG9mIGEgY2lyY2xlIHRvIGl0cyBkaWFtZXRlci4gSXQgaXMgdXNlZnVsIGluXG4gICAqIGNvbWJpbmF0aW9uIHdpdGggdGhlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIHNpbigpIGFuZCBjb3MoKS5cbiAgICpcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFRXT19QSVxuICAgKiBAZmluYWxcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogYXJjKDUwLCA1MCwgODAsIDgwLCAwLCBUV09fUEkpO1xuICAgKiA8L2NvZGU+PC9kaXY+XG4gICAqXG4gICAqIEBhbHRcbiAgICogODB4ODAgd2hpdGUgZWxsaXBzZSBzaGFwZSBpbiBjZW50ZXIgb2YgY2FudmFzLlxuICAgKlxuICAgKi9cbiAgVFdPX1BJOiBQSSAqIDIsXG4gIC8qKlxuICAgKiBDb25zdGFudCB0byBiZSB1c2VkIHdpdGggYW5nbGVNb2RlKCkgZnVuY3Rpb24sIHRvIHNldCB0aGUgbW9kZSB3aGljaFxuICAgKiBwNS5qcyBpbnRlcnByYXRlcyBhbmQgY2FsY3VsYXRlcyBhbmdsZXMgKGVpdGhlciBERUdSRUVTIG9yIFJBRElBTlMpLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gREVHUkVFU1xuICAgKiBAZmluYWxcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICBhbmdsZU1vZGUoREVHUkVFUyk7XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKi9cbiAgREVHUkVFUzogJ2RlZ3JlZXMnLFxuICAvKipcbiAgICogQ29uc3RhbnQgdG8gYmUgdXNlZCB3aXRoIGFuZ2xlTW9kZSgpIGZ1bmN0aW9uLCB0byBzZXQgdGhlIG1vZGUgd2hpY2hcbiAgICogcDUuanMgaW50ZXJwcmF0ZXMgYW5kIGNhbGN1bGF0ZXMgYW5nbGVzIChlaXRoZXIgUkFESUFOUyBvciBERUdSRUVTKS5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFJBRElBTlNcbiAgICogQGZpbmFsXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgYW5nbGVNb2RlKFJBRElBTlMpO1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICovXG4gIFJBRElBTlM6ICdyYWRpYW5zJyxcbiAgREVHX1RPX1JBRDogUEkgLyAxODAuMCxcbiAgUkFEX1RPX0RFRzogMTgwLjAgLyBQSSxcblxuICAvLyBTSEFQRVxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENPUk5FUlxuICAgKiBAZmluYWxcbiAgICovXG4gIENPUk5FUjogJ2Nvcm5lcicsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ09STkVSU1xuICAgKiBAZmluYWxcbiAgICovXG4gIENPUk5FUlM6ICdjb3JuZXJzJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBSQURJVVNcbiAgICogQGZpbmFsXG4gICAqL1xuICBSQURJVVM6ICdyYWRpdXMnLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFJJR0hUXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgUklHSFQ6ICdyaWdodCcsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gTEVGVFxuICAgKiBAZmluYWxcbiAgICovXG4gIExFRlQ6ICdsZWZ0JyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDRU5URVJcbiAgICogQGZpbmFsXG4gICAqL1xuICBDRU5URVI6ICdjZW50ZXInLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFRPUFxuICAgKiBAZmluYWxcbiAgICovXG4gIFRPUDogJ3RvcCcsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQk9UVE9NXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgQk9UVE9NOiAnYm90dG9tJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBCQVNFTElORVxuICAgKiBAZmluYWxcbiAgICogQGRlZmF1bHQgYWxwaGFiZXRpY1xuICAgKi9cbiAgQkFTRUxJTkU6ICdhbHBoYWJldGljJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBQT0lOVFNcbiAgICogQGZpbmFsXG4gICAqIEBkZWZhdWx0IDB4MDAwMFxuICAgKi9cbiAgUE9JTlRTOiAweDAwMDAsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge051bWJlcn0gTElORVNcbiAgICogQGZpbmFsXG4gICAqIEBkZWZhdWx0IDB4MDAwMVxuICAgKi9cbiAgTElORVM6IDB4MDAwMSxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBMSU5FX1NUUklQXG4gICAqIEBmaW5hbFxuICAgKiBAZGVmYXVsdCAweDAwMDNcbiAgICovXG4gIExJTkVfU1RSSVA6IDB4MDAwMyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBMSU5FX0xPT1BcbiAgICogQGZpbmFsXG4gICAqIEBkZWZhdWx0IDB4MDAwMlxuICAgKi9cbiAgTElORV9MT09QOiAweDAwMDIsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge051bWJlcn0gVFJJQU5HTEVTXG4gICAqIEBmaW5hbFxuICAgKiBAZGVmYXVsdCAweDAwMDRcbiAgICovXG4gIFRSSUFOR0xFUzogMHgwMDA0LFxuICAvKipcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFRSSUFOR0xFX0ZBTlxuICAgKiBAZmluYWxcbiAgICogQGRlZmF1bHQgMHgwMDA2XG4gICAqL1xuICBUUklBTkdMRV9GQU46IDB4MDAwNixcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBUUklBTkdMRV9TVFJJUFxuICAgKiBAZmluYWxcbiAgICogQGRlZmF1bHQgMHgwMDA1XG4gICAqL1xuICBUUklBTkdMRV9TVFJJUDogMHgwMDA1LFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFFVQURTXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgUVVBRFM6ICdxdWFkcycsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gUVVBRF9TVFJJUFxuICAgKiBAZmluYWxcbiAgICogQGRlZmF1bHQgcXVhZF9zdHJpcFxuICAgKi9cbiAgUVVBRF9TVFJJUDogJ3F1YWRfc3RyaXAnLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENMT1NFXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgQ0xPU0U6ICdjbG9zZScsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gT1BFTlxuICAgKiBAZmluYWxcbiAgICovXG4gIE9QRU46ICdvcGVuJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSE9SRFxuICAgKiBAZmluYWxcbiAgICovXG4gIENIT1JEOiAnY2hvcmQnLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFBJRVxuICAgKiBAZmluYWxcbiAgICovXG4gIFBJRTogJ3BpZScsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gUFJPSkVDVFxuICAgKiBAZmluYWxcbiAgICogQGRlZmF1bHQgc3F1YXJlXG4gICAqL1xuICBQUk9KRUNUOiAnc3F1YXJlJywgLy8gUEVORDogY2FyZWZ1bCB0aGlzIGlzIGNvdW50ZXJpbnR1aXRpdmVcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBTUVVBUkVcbiAgICogQGZpbmFsXG4gICAqIEBkZWZhdWx0IGJ1dHRcbiAgICovXG4gIFNRVUFSRTogJ2J1dHQnLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFJPVU5EXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgUk9VTkQ6ICdyb3VuZCcsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQkVWRUxcbiAgICogQGZpbmFsXG4gICAqL1xuICBCRVZFTDogJ2JldmVsJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBNSVRFUlxuICAgKiBAZmluYWxcbiAgICovXG4gIE1JVEVSOiAnbWl0ZXInLFxuXG4gIC8vIENPTE9SXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gUkdCXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgUkdCOiAncmdiJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBIU0JcbiAgICogQGZpbmFsXG4gICAqL1xuICBIU0I6ICdoc2InLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IEhTTFxuICAgKiBAZmluYWxcbiAgICovXG4gIEhTTDogJ2hzbCcsXG5cbiAgLy8gRE9NIEVYVEVOU0lPTlxuICBBVVRPOiAnYXV0bycsXG5cbiAgLy8gSU5QVVRcbiAgQUxUOiAxOCxcbiAgQkFDS1NQQUNFOiA4LFxuICBDT05UUk9MOiAxNyxcbiAgREVMRVRFOiA0NixcbiAgRE9XTl9BUlJPVzogNDAsXG4gIEVOVEVSOiAxMyxcbiAgRVNDQVBFOiAyNyxcbiAgTEVGVF9BUlJPVzogMzcsXG4gIE9QVElPTjogMTgsXG4gIFJFVFVSTjogMTMsXG4gIFJJR0hUX0FSUk9XOiAzOSxcbiAgU0hJRlQ6IDE2LFxuICBUQUI6IDksXG4gIFVQX0FSUk9XOiAzOCxcblxuICAvLyBSRU5ERVJJTkdcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBCTEVORFxuICAgKiBAZmluYWxcbiAgICogQGRlZmF1bHQgc291cmNlLW92ZXJcbiAgICovXG4gIEJMRU5EOiAnc291cmNlLW92ZXInLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IEFERFxuICAgKiBAZmluYWxcbiAgICogQGRlZmF1bHQgbGlnaHRlclxuICAgKi9cbiAgQUREOiAnbGlnaHRlcicsXG4gIC8vQUREOiAnYWRkJywgLy9cbiAgLy9TVUJUUkFDVDogJ3N1YnRyYWN0JywgLy9cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBEQVJLRVNUXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgREFSS0VTVDogJ2RhcmtlbicsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gTElHSFRFU1RcbiAgICogQGZpbmFsXG4gICAqIEBkZWZhdWx0IGxpZ2h0ZW5cbiAgICovXG4gIExJR0hURVNUOiAnbGlnaHRlbicsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gRElGRkVSRU5DRVxuICAgKiBAZmluYWxcbiAgICovXG4gIERJRkZFUkVOQ0U6ICdkaWZmZXJlbmNlJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBFWENMVVNJT05cbiAgICogQGZpbmFsXG4gICAqL1xuICBFWENMVVNJT046ICdleGNsdXNpb24nLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IE1VTFRJUExZXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgTVVMVElQTFk6ICdtdWx0aXBseScsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gU0NSRUVOXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgU0NSRUVOOiAnc2NyZWVuJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBSRVBMQUNFXG4gICAqIEBmaW5hbFxuICAgKiBAZGVmYXVsdCBjb3B5XG4gICAqL1xuICBSRVBMQUNFOiAnY29weScsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gT1ZFUkxBWVxuICAgKiBAZmluYWxcbiAgICovXG4gIE9WRVJMQVk6ICdvdmVybGF5JyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBIQVJEX0xJR0hUXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgSEFSRF9MSUdIVDogJ2hhcmQtbGlnaHQnLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFNPRlRfTElHSFRcbiAgICogQGZpbmFsXG4gICAqL1xuICBTT0ZUX0xJR0hUOiAnc29mdC1saWdodCcsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gRE9ER0VcbiAgICogQGZpbmFsXG4gICAqIEBkZWZhdWx0IGNvbG9yLWRvZGdlXG4gICAqL1xuICBET0RHRTogJ2NvbG9yLWRvZGdlJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBCVVJOXG4gICAqIEBmaW5hbFxuICAgKiBAZGVmYXVsdCBjb2xvci1idXJuXG4gICAqL1xuICBCVVJOOiAnY29sb3ItYnVybicsXG5cbiAgLy8gRklMVEVSU1xuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFRIUkVTSE9MRFxuICAgKiBAZmluYWxcbiAgICovXG4gIFRIUkVTSE9MRDogJ3RocmVzaG9sZCcsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gR1JBWVxuICAgKiBAZmluYWxcbiAgICovXG4gIEdSQVk6ICdncmF5JyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBPUEFRVUVcbiAgICogQGZpbmFsXG4gICAqL1xuICBPUEFRVUU6ICdvcGFxdWUnLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IElOVkVSVFxuICAgKiBAZmluYWxcbiAgICovXG4gIElOVkVSVDogJ2ludmVydCcsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gUE9TVEVSSVpFXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgUE9TVEVSSVpFOiAncG9zdGVyaXplJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBESUxBVEVcbiAgICogQGZpbmFsXG4gICAqL1xuICBESUxBVEU6ICdkaWxhdGUnLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IEVST0RFXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgRVJPREU6ICdlcm9kZScsXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQkxVUlxuICAgKiBAZmluYWxcbiAgICovXG4gIEJMVVI6ICdibHVyJyxcblxuICAvLyBUWVBPR1JBUEhZXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gTk9STUFMXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgTk9STUFMOiAnbm9ybWFsJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBJVEFMSUNcbiAgICogQGZpbmFsXG4gICAqL1xuICBJVEFMSUM6ICdpdGFsaWMnLFxuICAvKipcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IEJPTERcbiAgICogQGZpbmFsXG4gICAqL1xuICBCT0xEOiAnYm9sZCcsXG5cbiAgLy8gVFlQT0dSQVBIWS1JTlRFUk5BTFxuICBfREVGQVVMVF9URVhUX0ZJTEw6ICcjMDAwMDAwJyxcbiAgX0RFRkFVTFRfTEVBRE1VTFQ6IDEuMjUsXG4gIF9DVFhfTUlERExFOiAnbWlkZGxlJyxcblxuICAvLyBWRVJUSUNFU1xuICBMSU5FQVI6ICdsaW5lYXInLFxuICBRVUFEUkFUSUM6ICdxdWFkcmF0aWMnLFxuICBCRVpJRVI6ICdiZXppZXInLFxuICBDVVJWRTogJ2N1cnZlJyxcblxuICAvLyBXRUJHTCBEUkFXTU9ERVNcbiAgU1RST0tFOiAnc3Ryb2tlJyxcbiAgRklMTDogJ2ZpbGwnLFxuICBURVhUVVJFOiAndGV4dHVyZScsXG4gIElNTUVESUFURTogJ2ltbWVkaWF0ZScsXG5cbiAgLy8gREVWSUNFLU9SSUVOVEFUSU9OXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gTEFORFNDQVBFXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgTEFORFNDQVBFOiAnbGFuZHNjYXBlJyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBQT1JUUkFJVFxuICAgKiBAZmluYWxcbiAgICovXG4gIFBPUlRSQUlUOiAncG9ydHJhaXQnLFxuXG4gIC8vIERFRkFVTFRTXG4gIF9ERUZBVUxUX1NUUk9LRTogJyMwMDAwMDAnLFxuICBfREVGQVVMVF9GSUxMOiAnI0ZGRkZGRidcbn07XG5cbn0se31dLDIyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBTdHJ1Y3R1cmVcbiAqIEBzdWJtb2R1bGUgU3RydWN0dXJlXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29uc3RhbnRzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5fZGVyZXFfKCcuL3NoaW0nKTtcblxuLy8gQ29yZSBuZWVkcyB0aGUgUFZhcmlhYmxlcyBvYmplY3RcbnZhciBjb25zdGFudHMgPSBfZGVyZXFfKCcuL2NvbnN0YW50cycpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHA1IGluc3RhbmNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEEgcDUgaW5zdGFuY2UgaG9sZHMgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHJlbGF0ZWQgdG9cbiAqIGEgcDUgc2tldGNoLiAgSXQgZXhwZWN0cyBhbiBpbmNvbWluZyBza2V0Y2ggY2xvc3VyZSBhbmQgaXQgY2FuIGFsc29cbiAqIHRha2UgYW4gb3B0aW9uYWwgbm9kZSBwYXJhbWV0ZXIgZm9yIGF0dGFjaGluZyB0aGUgZ2VuZXJhdGVkIHA1IGNhbnZhc1xuICogdG8gYSBub2RlLiAgVGhlIHNrZXRjaCBjbG9zdXJlIHRha2VzIHRoZSBuZXdseSBjcmVhdGVkIHA1IGluc3RhbmNlIGFzXG4gKiBpdHMgc29sZSBhcmd1bWVudCBhbmQgbWF5IG9wdGlvbmFsbHkgc2V0IHByZWxvYWQoKSwgc2V0dXAoKSwgYW5kL29yXG4gKiBkcmF3KCkgcHJvcGVydGllcyBvbiBpdCBmb3IgcnVubmluZyBhIHNrZXRjaC5cbiAqXG4gKiBBIHA1IHNrZXRjaCBjYW4gcnVuIGluIFwiZ2xvYmFsXCIgb3IgXCJpbnN0YW5jZVwiIG1vZGU6XG4gKiBcImdsb2JhbFwiICAgLSBhbGwgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBhcmUgYXR0YWNoZWQgdG8gdGhlIHdpbmRvd1xuICogXCJpbnN0YW5jZVwiIC0gYWxsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgYXJlIGJvdW5kIHRvIHRoaXMgcDUgb2JqZWN0XG4gKlxuICogQGNsYXNzIHA1XG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgICBza2V0Y2ggYSBjbG9zdXJlIHRoYXQgY2FuIHNldCBvcHRpb25hbCBwcmVsb2FkKCksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwKCksIGFuZC9vciBkcmF3KCkgcHJvcGVydGllcyBvbiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gcDUgaW5zdGFuY2VcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fEJvb2xlYW59IFtub2RlXSBlbGVtZW50IHRvIGF0dGFjaCBjYW52YXMgdG8sIGlmIGFcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzIHBhc3NlZCBpbiB1c2UgaXQgYXMgc3luY1xuICogQHBhcmFtICB7Qm9vbGVhbn0gICAgIFtzeW5jXSBzdGFydCBzeW5jaHJvbm91c2x5IChvcHRpb25hbClcbiAqIEByZXR1cm4ge3A1fSAgICAgICAgICAgICAgICAgYSBwNSBpbnN0YW5jZVxuICovXG52YXIgcDUgPSBmdW5jdGlvbihza2V0Y2gsIG5vZGUsIHN5bmMpIHtcbiAgaWYgKHR5cGVvZiBub2RlID09PSAnYm9vbGVhbicgJiYgdHlwZW9mIHN5bmMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgc3luYyA9IG5vZGU7XG4gICAgbm9kZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gUFVCTElDIHA1IFBST1BFUlRJRVMgQU5EIE1FVEhPRFNcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgZGlyZWN0bHkgYmVmb3JlIHNldHVwKCksIHRoZSBwcmVsb2FkKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBoYW5kbGVcbiAgICogYXN5bmNocm9ub3VzIGxvYWRpbmcgb2YgZXh0ZXJuYWwgZmlsZXMgaW4gYSBibG9ja2luZyB3YXkuIElmIGEgcHJlbG9hZCBcbiAgICogZnVuY3Rpb24gaXMgZGVmaW5lZCwgc2V0dXAoKSB3aWxsIHdhaXQgdW50aWwgYW55IGxvYWQgY2FsbHMgd2l0aGluIGhhdmVcbiAgICogZmluaXNoZWQuIE5vdGhpbmcgYmVzaWRlcyBsb2FkIGNhbGxzIChsb2FkSW1hZ2UsIGxvYWRKU09OLCBsb2FkRm9udCxcbiAgICogbG9hZFN0cmluZ3MsIGV0Yy4pIHNob3VsZCBiZSBpbnNpZGUgcHJlbG9hZCBmdW5jdGlvbi4gSWYgYXN5bmNocm9ub3VzXG4gICAqIGxvYWRpbmcgaXMgcHJlZmVycmVkLCB0aGUgbG9hZCBtZXRob2RzIGNhbiBpbnN0ZWFkIGJlIGNhbGxlZCBpbiBzZXR1cCgpXG4gICAqIG9yIGFueXdoZXJlIGVsc2Ugd2l0aCB0aGUgdXNlIG9mIGEgY2FsbGJhY2sgcGFyYW1ldGVyLlxuICAgKiA8YnI+PGJyPlxuICAgKiBCeSBkZWZhdWx0IHRoZSB0ZXh0IFwibG9hZGluZy4uLlwiIHdpbGwgYmUgZGlzcGxheWVkLiBUbyBtYWtlIHlvdXIgb3duXG4gICAqIGxvYWRpbmcgcGFnZSwgaW5jbHVkZSBhbiBIVE1MIGVsZW1lbnQgd2l0aCBpZCBcInA1X2xvYWRpbmdcIiBpbiB5b3VyXG4gICAqIHBhZ2UuIE1vcmUgaW5mb3JtYXRpb24gPGEgaHJlZj1cImh0dHA6Ly9iaXQubHkvMmtRNk5pb1wiPmhlcmU8L2E+LlxuICAgKlxuICAgKiBAbWV0aG9kIHByZWxvYWRcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogdmFyIGltZztcbiAgICogdmFyIGM7XG4gICAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gIC8vIHByZWxvYWQoKSBydW5zIG9uY2VcbiAgICogICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9sYURlZmVuc2UuanBnJyk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gIC8vIHNldHVwKCkgd2FpdHMgdW50aWwgcHJlbG9hZCgpIGlzIGRvbmVcbiAgICogICBpbWcubG9hZFBpeGVscygpO1xuICAgKiAgIC8vIGdldCBjb2xvciBvZiBtaWRkbGUgcGl4ZWxcbiAgICogICBjID0gaW1nLmdldChpbWcud2lkdGggLyAyLCBpbWcuaGVpZ2h0IC8gMik7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gZHJhdygpIHtcbiAgICogICBiYWNrZ3JvdW5kKGMpO1xuICAgKiAgIGltYWdlKGltZywgMjUsIDI1LCA1MCwgNTApO1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICpcbiAgICogQGFsdFxuICAgKiBub3RoaW5nIGRpc3BsYXllZFxuICAgKlxuICAgKi9cblxuICAvKipcbiAgICogVGhlIHNldHVwKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2Ugd2hlbiB0aGUgcHJvZ3JhbSBzdGFydHMuIEl0J3MgdXNlZCB0b1xuICAgKiBkZWZpbmUgaW5pdGlhbCBlbnZpcm9ubWVudCBwcm9wZXJ0aWVzIHN1Y2ggYXMgc2NyZWVuIHNpemUgYW5kIGJhY2tncm91bmRcbiAgICogY29sb3IgYW5kIHRvIGxvYWQgbWVkaWEgc3VjaCBhcyBpbWFnZXMgYW5kIGZvbnRzIGFzIHRoZSBwcm9ncmFtIHN0YXJ0cy5cbiAgICogVGhlcmUgY2FuIG9ubHkgYmUgb25lIHNldHVwKCkgZnVuY3Rpb24gZm9yIGVhY2ggcHJvZ3JhbSBhbmQgaXQgc2hvdWxkbid0XG4gICAqIGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBpdHMgaW5pdGlhbCBleGVjdXRpb24uXG4gICAqIDxicj48YnI+XG4gICAqIE5vdGU6IFZhcmlhYmxlcyBkZWNsYXJlZCB3aXRoaW4gc2V0dXAoKSBhcmUgbm90IGFjY2Vzc2libGUgd2l0aGluIG90aGVyXG4gICAqIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGRyYXcoKS5cbiAgICpcbiAgICogQG1ldGhvZCBzZXR1cFxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiB2YXIgYSA9IDA7XG4gICAqXG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIGJhY2tncm91bmQoMCk7XG4gICAqICAgbm9TdHJva2UoKTtcbiAgICogICBmaWxsKDEwMik7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gZHJhdygpIHtcbiAgICogICByZWN0KGErKyAlIHdpZHRoLCAxMCwgMiwgODApO1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICpcbiAgICogQGFsdFxuICAgKiBub3RoaW5nIGRpc3BsYXllZFxuICAgKlxuICAgKi9cblxuICAvKipcbiAgICogQ2FsbGVkIGRpcmVjdGx5IGFmdGVyIHNldHVwKCksIHRoZSBkcmF3KCkgZnVuY3Rpb24gY29udGludW91c2x5IGV4ZWN1dGVzXG4gICAqIHRoZSBsaW5lcyBvZiBjb2RlIGNvbnRhaW5lZCBpbnNpZGUgaXRzIGJsb2NrIHVudGlsIHRoZSBwcm9ncmFtIGlzIHN0b3BwZWRcbiAgICogb3Igbm9Mb29wKCkgaXMgY2FsbGVkLiBOb3RlIGlmIG5vTG9vcCgpIGlzIGNhbGxlZCBpbiBzZXR1cCgpLCBkcmF3KCkgd2lsbFxuICAgKiBzdGlsbCBiZSBleGVjdXRlZCBvbmNlIGJlZm9yZSBzdG9wcGluZy4gZHJhdygpIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGFuZFxuICAgKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGV4cGxpY2l0bHkuXG4gICAqIDxicj48YnI+XG4gICAqIEl0IHNob3VsZCBhbHdheXMgYmUgY29udHJvbGxlZCB3aXRoIG5vTG9vcCgpLCByZWRyYXcoKSBhbmQgbG9vcCgpLiBBZnRlclxuICAgKiBub0xvb3AoKSBzdG9wcyB0aGUgY29kZSBpbiBkcmF3KCkgZnJvbSBleGVjdXRpbmcsIHJlZHJhdygpIGNhdXNlcyB0aGVcbiAgICogY29kZSBpbnNpZGUgZHJhdygpIHRvIGV4ZWN1dGUgb25jZSwgYW5kIGxvb3AoKSB3aWxsIGNhdXNlIHRoZSBjb2RlXG4gICAqIGluc2lkZSBkcmF3KCkgdG8gcmVzdW1lIGV4ZWN1dGluZyBjb250aW51b3VzbHkuXG4gICAqIDxicj48YnI+XG4gICAqIFRoZSBudW1iZXIgb2YgdGltZXMgZHJhdygpIGV4ZWN1dGVzIGluIGVhY2ggc2Vjb25kIG1heSBiZSBjb250cm9sbGVkIHdpdGhcbiAgICogdGhlIGZyYW1lUmF0ZSgpIGZ1bmN0aW9uLlxuICAgKiA8YnI+PGJyPlxuICAgKiBUaGVyZSBjYW4gb25seSBiZSBvbmUgZHJhdygpIGZ1bmN0aW9uIGZvciBlYWNoIHNrZXRjaCwgYW5kIGRyYXcoKSBtdXN0XG4gICAqIGV4aXN0IGlmIHlvdSB3YW50IHRoZSBjb2RlIHRvIHJ1biBjb250aW51b3VzbHksIG9yIHRvIHByb2Nlc3MgZXZlbnRzIHN1Y2hcbiAgICogYXMgbW91c2VQcmVzc2VkKCkuIFNvbWV0aW1lcywgeW91IG1pZ2h0IGhhdmUgYW4gZW1wdHkgY2FsbCB0byBkcmF3KCkgaW5cbiAgICogeW91ciBwcm9ncmFtLCBhcyBzaG93biBpbiB0aGUgYWJvdmUgZXhhbXBsZS5cbiAgICogPGJyPjxicj5cbiAgICogSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZHJhd2luZyBjb29yZGluYXRlIHN5c3RlbSB3aWxsIGJlIHJlc2V0XG4gICAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBkcmF3KCkgY2FsbC4gSWYgYW55IHRyYW5zZm9ybWF0aW9ucyBhcmUgcGVyZm9ybWVkXG4gICAqIHdpdGhpbiBkcmF3KCkgKGV4OiBzY2FsZSwgcm90YXRlLCB0cmFuc2xhdGUpLCB0aGVpciBlZmZlY3RzIHdpbGwgYmVcbiAgICogdW5kb25lIGF0IHRoZSBiZWdpbm5pbmcgb2YgZHJhdygpLCBzbyB0cmFuc2Zvcm1hdGlvbnMgd2lsbCBub3QgYWNjdW11bGF0ZVxuICAgKiBvdmVyIHRpbWUuIE9uIHRoZSBvdGhlciBoYW5kLCBzdHlsaW5nIGFwcGxpZWQgKGV4OiBmaWxsLCBzdHJva2UsIGV0Yykgd2lsbFxuICAgKiByZW1haW4gaW4gZWZmZWN0LlxuICAgKlxuICAgKiBAbWV0aG9kIGRyYXdcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj48Y29kZT5cbiAgICogdmFyIHlQb3MgPSAwO1xuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgLy8gc2V0dXAoKSBydW5zIG9uY2VcbiAgICogICBmcmFtZVJhdGUoMzApO1xuICAgKiB9XG4gICAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gIC8vIGRyYXcoKSBsb29wcyBmb3JldmVyLCB1bnRpbCBzdG9wcGVkXG4gICAqICAgYmFja2dyb3VuZCgyMDQpO1xuICAgKiAgIHlQb3MgPSB5UG9zIC0gMTtcbiAgICogICBpZiAoeVBvcyA8IDApIHtcbiAgICogICAgIHlQb3MgPSBoZWlnaHQ7XG4gICAqICAgfVxuICAgKiAgIGxpbmUoMCwgeVBvcywgd2lkdGgsIHlQb3MpO1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICpcbiAgICogQGFsdFxuICAgKiBub3RoaW5nIGRpc3BsYXllZFxuICAgKlxuICAgKi9cblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIFBSSVZBVEUgcDUgUFJPUEVSVElFUyBBTkQgTUVUSE9EU1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgdGhpcy5fc2V0dXBEb25lID0gZmFsc2U7XG4gIC8vIGZvciBoYW5kbGluZyBoaWRwaVxuICB0aGlzLl9waXhlbERlbnNpdHkgPSBNYXRoLmNlaWwod2luZG93LmRldmljZVBpeGVsUmF0aW8pIHx8IDE7XG4gIHRoaXMuX3VzZXJOb2RlID0gbm9kZTtcbiAgdGhpcy5fY3VyRWxlbWVudCA9IG51bGw7XG4gIHRoaXMuX2VsZW1lbnRzID0gW107XG4gIHRoaXMuX3JlcXVlc3RBbmltSWQgPSAwO1xuICB0aGlzLl9wcmVsb2FkQ291bnQgPSAwO1xuICB0aGlzLl9pc0dsb2JhbCA9IGZhbHNlO1xuICB0aGlzLl9sb29wID0gdHJ1ZTtcbiAgdGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlVmFyaWFibGVzKCk7XG4gIHRoaXMuX2RlZmF1bHRDYW52YXNTaXplID0ge1xuICAgIHdpZHRoOiAxMDAsXG4gICAgaGVpZ2h0OiAxMDBcbiAgfTtcbiAgdGhpcy5fZXZlbnRzID0ge1xuICAgIC8vIGtlZXAgdHJhY2sgb2YgdXNlci1ldmVudHMgZm9yIHVucmVnaXN0ZXJpbmcgbGF0ZXJcbiAgICBtb3VzZW1vdmU6IG51bGwsXG4gICAgbW91c2Vkb3duOiBudWxsLFxuICAgIG1vdXNldXA6IG51bGwsXG4gICAgZHJhZ2VuZDogbnVsbCxcbiAgICBkcmFnb3ZlcjogbnVsbCxcbiAgICBjbGljazogbnVsbCxcbiAgICBkYmxjbGljazogbnVsbCxcbiAgICBtb3VzZW92ZXI6IG51bGwsXG4gICAgbW91c2VvdXQ6IG51bGwsXG4gICAga2V5ZG93bjogbnVsbCxcbiAgICBrZXl1cDogbnVsbCxcbiAgICBrZXlwcmVzczogbnVsbCxcbiAgICB0b3VjaHN0YXJ0OiBudWxsLFxuICAgIHRvdWNobW92ZTogbnVsbCxcbiAgICB0b3VjaGVuZDogbnVsbCxcbiAgICByZXNpemU6IG51bGwsXG4gICAgYmx1cjogbnVsbFxuICB9O1xuXG4gIHRoaXMuX2V2ZW50cy53aGVlbCA9IG51bGw7XG4gIHRoaXMuX2xvYWRpbmdTY3JlZW5JZCA9ICdwNV9sb2FkaW5nJztcblxuICAvLyBBbGxvd3MgbWV0aG9kcyB0byBiZSByZWdpc3RlcmVkIG9uIGFuIGluc3RhbmNlIHRoYXRcbiAgLy8gYXJlIGluc3RhbmNlLXNwZWNpZmljLlxuICB0aGlzLl9yZWdpc3RlcmVkTWV0aG9kcyA9IHt9O1xuICB2YXIgbWV0aG9kcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHA1LnByb3RvdHlwZS5fcmVnaXN0ZXJlZE1ldGhvZHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHJvcCA9IG1ldGhvZHNbaV07XG4gICAgdGhpcy5fcmVnaXN0ZXJlZE1ldGhvZHNbcHJvcF0gPSBwNS5wcm90b3R5cGUuX3JlZ2lzdGVyZWRNZXRob2RzW1xuICAgICAgcHJvcFxuICAgIF0uc2xpY2UoKTtcbiAgfVxuXG4gIGlmICh3aW5kb3cuRGV2aWNlT3JpZW50YXRpb25FdmVudCkge1xuICAgIHRoaXMuX2V2ZW50cy5kZXZpY2VvcmllbnRhdGlvbiA9IG51bGw7XG4gIH1cbiAgaWYgKHdpbmRvdy5EZXZpY2VNb3Rpb25FdmVudCAmJiAhd2luZG93Ll9pc05vZGVXZWJraXQpIHtcbiAgICB0aGlzLl9ldmVudHMuZGV2aWNlbW90aW9uID0gbnVsbDtcbiAgfVxuXG4gIHRoaXMuX3N0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gRmluZCBub2RlIGlmIGlkIGdpdmVuXG4gICAgaWYgKHRoaXMuX3VzZXJOb2RlKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX3VzZXJOb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLl91c2VyTm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuX3VzZXJOb2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdXNlclByZWxvYWQgPSB0aGlzLnByZWxvYWQgfHwgd2luZG93LnByZWxvYWQ7IC8vIGxvb2sgZm9yIFwicHJlbG9hZFwiXG4gICAgaWYgKHVzZXJQcmVsb2FkKSB7XG4gICAgICAvLyBTZXR1cCBsb2FkaW5nIHNjcmVlblxuICAgICAgLy8gU2V0IGxvYWRpbmcgc2NyZWVuIGludG8gZG9tIGlmIG5vdCBwcmVzZW50XG4gICAgICAvLyBPdGhlcndpc2UgZGlzcGxheXMgYW5kIHJlbW92ZXMgdXNlciBwcm92aWRlZCBsb2FkaW5nIHNjcmVlblxuICAgICAgdmFyIGxvYWRpbmdTY3JlZW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLl9sb2FkaW5nU2NyZWVuSWQpO1xuICAgICAgaWYgKCFsb2FkaW5nU2NyZWVuKSB7XG4gICAgICAgIGxvYWRpbmdTY3JlZW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbG9hZGluZ1NjcmVlbi5pbm5lckhUTUwgPSAnTG9hZGluZy4uLic7XG4gICAgICAgIGxvYWRpbmdTY3JlZW4uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBsb2FkaW5nU2NyZWVuLmlkID0gdGhpcy5fbG9hZGluZ1NjcmVlbklkO1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX3VzZXJOb2RlIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQobG9hZGluZ1NjcmVlbik7XG4gICAgICB9XG4gICAgICAvLyB2YXIgbWV0aG9kcyA9IHRoaXMuX3ByZWxvYWRNZXRob2RzO1xuICAgICAgZm9yICh2YXIgbWV0aG9kIGluIHRoaXMuX3ByZWxvYWRNZXRob2RzKSB7XG4gICAgICAgIC8vIGRlZmF1bHQgdG8gcDUgaWYgbm8gb2JqZWN0IGRlZmluZWRcbiAgICAgICAgdGhpcy5fcHJlbG9hZE1ldGhvZHNbbWV0aG9kXSA9IHRoaXMuX3ByZWxvYWRNZXRob2RzW21ldGhvZF0gfHwgcDU7XG4gICAgICAgIHZhciBvYmogPSB0aGlzLl9wcmVsb2FkTWV0aG9kc1ttZXRob2RdO1xuICAgICAgICAvL2l0J3MgcDUsIGNoZWNrIGlmIGl0J3MgZ2xvYmFsIG9yIGluc3RhbmNlXG4gICAgICAgIGlmIChvYmogPT09IHA1LnByb3RvdHlwZSB8fCBvYmogPT09IHA1KSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2lzR2xvYmFsKSB7XG4gICAgICAgICAgICB3aW5kb3dbbWV0aG9kXSA9IHRoaXMuX3dyYXBQcmVsb2FkKHRoaXMsIG1ldGhvZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9iaiA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFByZWxvYWRNZXRob2RzW21ldGhvZF0gPSBvYmpbbWV0aG9kXTtcbiAgICAgICAgb2JqW21ldGhvZF0gPSB0aGlzLl93cmFwUHJlbG9hZChvYmosIG1ldGhvZCk7XG4gICAgICB9XG5cbiAgICAgIHVzZXJQcmVsb2FkKCk7XG4gICAgICB0aGlzLl9ydW5JZlByZWxvYWRzQXJlRG9uZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXR1cCgpO1xuICAgICAgdGhpcy5fcnVuRnJhbWVzKCk7XG4gICAgICB0aGlzLl9kcmF3KCk7XG4gICAgfVxuICB9LmJpbmQodGhpcyk7XG5cbiAgdGhpcy5fcnVuSWZQcmVsb2Fkc0FyZURvbmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuX2lzR2xvYmFsID8gd2luZG93IDogdGhpcztcbiAgICBpZiAoY29udGV4dC5fcHJlbG9hZENvdW50ID09PSAwKSB7XG4gICAgICB2YXIgbG9hZGluZ1NjcmVlbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRleHQuX2xvYWRpbmdTY3JlZW5JZCk7XG4gICAgICBpZiAobG9hZGluZ1NjcmVlbikge1xuICAgICAgICBsb2FkaW5nU2NyZWVuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobG9hZGluZ1NjcmVlbik7XG4gICAgICB9XG4gICAgICBjb250ZXh0Ll9zZXR1cCgpO1xuICAgICAgY29udGV4dC5fcnVuRnJhbWVzKCk7XG4gICAgICBjb250ZXh0Ll9kcmF3KCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX2RlY3JlbWVudFByZWxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuX2lzR2xvYmFsID8gd2luZG93IDogdGhpcztcbiAgICBpZiAodHlwZW9mIGNvbnRleHQucHJlbG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29udGV4dC5fc2V0UHJvcGVydHkoJ19wcmVsb2FkQ291bnQnLCBjb250ZXh0Ll9wcmVsb2FkQ291bnQgLSAxKTtcbiAgICAgIGNvbnRleHQuX3J1bklmUHJlbG9hZHNBcmVEb25lKCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX3dyYXBQcmVsb2FkID0gZnVuY3Rpb24ob2JqLCBmbk5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAvL2luY3JlbWVudCBjb3VudGVyXG4gICAgICB0aGlzLl9pbmNyZW1lbnRQcmVsb2FkKCk7XG4gICAgICAvL2NhbGwgb3JpZ2luYWwgZnVuY3Rpb25cbiAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RlcmVkUHJlbG9hZE1ldGhvZHNbZm5OYW1lXS5hcHBseShvYmosIGFyZ3VtZW50cyk7XG4gICAgfS5iaW5kKHRoaXMpO1xuICB9O1xuXG4gIHRoaXMuX2luY3JlbWVudFByZWxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuX2lzR2xvYmFsID8gd2luZG93IDogdGhpcztcbiAgICBjb250ZXh0Ll9zZXRQcm9wZXJ0eSgnX3ByZWxvYWRDb3VudCcsIGNvbnRleHQuX3ByZWxvYWRDb3VudCArIDEpO1xuICB9O1xuXG4gIHRoaXMuX3NldHVwID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gQWx3YXlzIGNyZWF0ZSBhIGRlZmF1bHQgY2FudmFzLlxuICAgIC8vIExhdGVyIG9uIGlmIHRoZSB1c2VyIGNhbGxzIGNyZWF0ZUNhbnZhcywgdGhpcyBkZWZhdWx0IG9uZVxuICAgIC8vIHdpbGwgYmUgcmVwbGFjZWRcbiAgICB0aGlzLmNyZWF0ZUNhbnZhcyhcbiAgICAgIHRoaXMuX2RlZmF1bHRDYW52YXNTaXplLndpZHRoLFxuICAgICAgdGhpcy5fZGVmYXVsdENhbnZhc1NpemUuaGVpZ2h0LFxuICAgICAgJ3AyZCdcbiAgICApO1xuXG4gICAgLy8gcmV0dXJuIHByZWxvYWQgZnVuY3Rpb25zIHRvIHRoZWlyIG5vcm1hbCB2YWxzIGlmIHN3aXRjaGVkIGJ5IHByZWxvYWRcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuX2lzR2xvYmFsID8gd2luZG93IDogdGhpcztcbiAgICBpZiAodHlwZW9mIGNvbnRleHQucHJlbG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm9yICh2YXIgZiBpbiB0aGlzLl9wcmVsb2FkTWV0aG9kcykge1xuICAgICAgICBjb250ZXh0W2ZdID0gdGhpcy5fcHJlbG9hZE1ldGhvZHNbZl1bZl07XG4gICAgICAgIGlmIChjb250ZXh0W2ZdICYmIHRoaXMpIHtcbiAgICAgICAgICBjb250ZXh0W2ZdID0gY29udGV4dFtmXS5iaW5kKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2hvcnQtY2lyY3VpdCBvbiB0aGlzLCBpbiBjYXNlIHNvbWVvbmUgdXNlZCB0aGUgbGlicmFyeSBpbiBcImdsb2JhbFwiXG4gICAgLy8gbW9kZSBlYXJsaWVyXG4gICAgaWYgKHR5cGVvZiBjb250ZXh0LnNldHVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb250ZXh0LnNldHVwKCk7XG4gICAgfVxuXG4gICAgLy8gdW5oaWRlIGFueSBoaWRkZW4gY2FudmFzZXMgdGhhdCB3ZXJlIGNyZWF0ZWRcbiAgICB2YXIgY2FudmFzZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY2FudmFzJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYW52YXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGsgPSBjYW52YXNlc1tpXTtcbiAgICAgIGlmIChrLmRhdGFzZXQuaGlkZGVuID09PSAndHJ1ZScpIHtcbiAgICAgICAgay5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgIGRlbGV0ZSBrLmRhdGFzZXQuaGlkZGVuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zZXR1cERvbmUgPSB0cnVlO1xuICB9LmJpbmQodGhpcyk7XG5cbiAgdGhpcy5fZHJhdyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBub3cgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgdmFyIHRpbWVfc2luY2VfbGFzdCA9IG5vdyAtIHRoaXMuX2xhc3RGcmFtZVRpbWU7XG4gICAgdmFyIHRhcmdldF90aW1lX2JldHdlZW5fZnJhbWVzID0gMTAwMCAvIHRoaXMuX3RhcmdldEZyYW1lUmF0ZTtcblxuICAgIC8vIG9ubHkgZHJhdyBpZiB3ZSByZWFsbHkgbmVlZCB0bzsgZG9uJ3Qgb3ZlcmV4dGVuZCB0aGUgYnJvd3Nlci5cbiAgICAvLyBkcmF3IGlmIHdlJ3JlIHdpdGhpbiA1bXMgb2Ygd2hlbiBvdXIgbmV4dCBmcmFtZSBzaG91bGQgcGFpbnRcbiAgICAvLyAodGhpcyB3aWxsIHByZXZlbnQgdXMgZnJvbSBnaXZpbmcgdXAgb3Bwb3J0dW5pdGllcyB0byBkcmF3XG4gICAgLy8gYWdhaW4gd2hlbiBpdCdzIHJlYWxseSBhYm91dCB0aW1lIGZvciB1cyB0byBkbyBzbykuIGZpeGVzIGFuXG4gICAgLy8gaXNzdWUgd2hlcmUgdGhlIGZyYW1lUmF0ZSBpcyB0b28gbG93IGlmIG91ciByZWZyZXNoIGxvb3AgaXNuJ3RcbiAgICAvLyBpbiBzeW5jIHdpdGggdGhlIGJyb3dzZXIuIG5vdGUgdGhhdCB3ZSBoYXZlIHRvIGRyYXcgb25jZSBldmVuXG4gICAgLy8gaWYgbG9vcGluZyBpcyBvZmYsIHNvIHdlIGJ5cGFzcyB0aGUgdGltZSBkZWxheSBpZiB0aGF0XG4gICAgLy8gaXMgdGhlIGNhc2UuXG4gICAgdmFyIGVwc2lsb24gPSA1O1xuICAgIGlmIChcbiAgICAgICF0aGlzLl9sb29wIHx8XG4gICAgICB0aW1lX3NpbmNlX2xhc3QgPj0gdGFyZ2V0X3RpbWVfYmV0d2Vlbl9mcmFtZXMgLSBlcHNpbG9uXG4gICAgKSB7XG4gICAgICAvL21hbmRhdG9yeSB1cGRhdGUgdmFsdWVzKG1hdHJpeHMgYW5kIHN0YWNrKVxuXG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5fZnJhbWVSYXRlID0gMTAwMC4wIC8gKG5vdyAtIHRoaXMuX2xhc3RGcmFtZVRpbWUpO1xuICAgICAgdGhpcy5fbGFzdEZyYW1lVGltZSA9IG5vdztcblxuICAgICAgLy8gSWYgdGhlIHVzZXIgaXMgYWN0dWFsbHkgdXNpbmcgbW91c2UgbW9kdWxlLCB0aGVuIHVwZGF0ZVxuICAgICAgLy8gY29vcmRpbmF0ZXMsIG90aGVyd2lzZSBza2lwLiBXZSBjYW4gdGVzdCB0aGlzIGJ5IHNpbXBseVxuICAgICAgLy8gY2hlY2tpbmcgaWYgYW55IG9mIHRoZSBtb3VzZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBvciBub3QuXG4gICAgICAvLyBOT1RFIDogVGhpcyByZWZsZWN0cyBvbmx5IGluIGNvbXBsZXRlIGJ1aWxkIG9yIG1vZHVsYXIgYnVpbGQuXG4gICAgICBpZiAodHlwZW9mIHRoaXMuX3VwZGF0ZU1vdXNlQ29vcmRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aGlzLl91cGRhdGVNb3VzZUNvb3JkcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldCBub3RpZmllZCB0aGUgbmV4dCB0aW1lIHRoZSBicm93c2VyIGdpdmVzIHVzXG4gICAgLy8gYW4gb3Bwb3J0dW5pdHkgdG8gZHJhdy5cbiAgICBpZiAodGhpcy5fbG9vcCkge1xuICAgICAgdGhpcy5fcmVxdWVzdEFuaW1JZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fZHJhdyk7XG4gICAgfVxuICB9LmJpbmQodGhpcyk7XG5cbiAgdGhpcy5fcnVuRnJhbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3VwZGF0ZUludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX3VwZGF0ZUludGVydmFsKTtcbiAgICB9XG4gIH0uYmluZCh0aGlzKTtcblxuICB0aGlzLl9zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7XG4gICAgdGhpc1twcm9wXSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl9pc0dsb2JhbCkge1xuICAgICAgd2luZG93W3Byb3BdID0gdmFsdWU7XG4gICAgfVxuICB9LmJpbmQodGhpcyk7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGVudGlyZSBwNSBza2V0Y2guIFRoaXMgd2lsbCByZW1vdmUgdGhlIGNhbnZhcyBhbmQgYW55XG4gICAqIGVsZW1lbnRzIGNyZWF0ZWQgYnkgcDUuanMuIEl0IHdpbGwgYWxzbyBzdG9wIHRoZSBkcmF3IGxvb3AgYW5kIHVuYmluZFxuICAgKiBhbnkgcHJvcGVydGllcyBvciBtZXRob2RzIGZyb20gdGhlIHdpbmRvdyBnbG9iYWwgc2NvcGUuIEl0IHdpbGxcbiAgICogbGVhdmUgYSB2YXJpYWJsZSBwNSBpbiBjYXNlIHlvdSB3YW50ZWQgdG8gY3JlYXRlIGEgbmV3IHA1IHNrZXRjaC5cbiAgICogSWYgeW91IGxpa2UsIHlvdSBjYW4gc2V0IHA1ID0gbnVsbCB0byBlcmFzZSBpdC4gV2hpbGUgYWxsIGZ1bmN0aW9ucyBhbmRcbiAgICogdmFyaWFibGVzIGFuZCBvYmplY3RzIGNyZWF0ZWQgYnkgdGhlIHA1IGxpYnJhcnkgd2lsbCBiZSByZW1vdmVkLCBhbnlcbiAgICogb3RoZXIgZ2xvYmFsIHZhcmlhYmxlcyBjcmVhdGVkIGJ5IHlvdXIgY29kZSB3aWxsIHJlbWFpbi5cbiAgICpcbiAgICogQG1ldGhvZCByZW1vdmVcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICAgKiBmdW5jdGlvbiBkcmF3KCkge1xuICAgKiAgIGVsbGlwc2UoNTAsIDUwLCAxMCwgMTApO1xuICAgKiB9XG4gICAqXG4gICAqIGZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcbiAgICogICByZW1vdmUoKTsgLy8gcmVtb3ZlIHdob2xlIHNrZXRjaCBvbiBtb3VzZSBwcmVzc1xuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICpcbiAgICogQGFsdFxuICAgKiBub3RoaW5nIGRpc3BsYXllZFxuICAgKlxuICAgKi9cbiAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbG9hZGluZ1NjcmVlbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuX2xvYWRpbmdTY3JlZW5JZCk7XG4gICAgaWYgKGxvYWRpbmdTY3JlZW4pIHtcbiAgICAgIGxvYWRpbmdTY3JlZW4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsb2FkaW5nU2NyZWVuKTtcbiAgICAgIC8vIEFkZCAxIHRvIHByZWxvYWQgY291bnRlciB0byBwcmV2ZW50IHRoZSBza2V0Y2ggZXZlciBleGVjdXRpbmcgc2V0dXAoKVxuICAgICAgdGhpcy5faW5jcmVtZW50UHJlbG9hZCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY3VyRWxlbWVudCkge1xuICAgICAgLy8gc3RvcCBkcmF3XG4gICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5fcmVxdWVzdEFuaW1JZCkge1xuICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVxdWVzdEFuaW1JZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHVucmVnaXN0ZXIgZXZlbnRzIHNrZXRjaC13aWRlXG4gICAgICBmb3IgKHZhciBldiBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXYsIHRoaXMuX2V2ZW50c1tldl0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZW1vdmUgRE9NIGVsZW1lbnRzIGNyZWF0ZWQgYnkgcDUsIGFuZCBsaXN0ZW5lcnNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl9lbGVtZW50c1tpXTtcbiAgICAgICAgaWYgKGUuZWx0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBlLmVsdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuZWx0KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBlbHRfZXYgaW4gZS5fZXZlbnRzKSB7XG4gICAgICAgICAgZS5lbHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlbHRfZXYsIGUuX2V2ZW50c1tlbHRfZXZdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjYWxsIGFueSByZWdpc3RlcmVkIHJlbW92ZSBmdW5jdGlvbnNcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRNZXRob2RzLnJlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGYuY2FsbChzZWxmKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSB3aW5kb3cgYm91bmQgcHJvcGVydGllcyBhbmQgbWV0aG9kc1xuICAgIGlmICh0aGlzLl9pc0dsb2JhbCkge1xuICAgICAgZm9yICh2YXIgcCBpbiBwNS5wcm90b3R5cGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkZWxldGUgd2luZG93W3BdO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgd2luZG93W3BdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBwMiBpbiB0aGlzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KHAyKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkZWxldGUgd2luZG93W3AyXTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICB3aW5kb3dbcDJdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcDUuaW5zdGFuY2UgPSBudWxsO1xuICAgIH1cbiAgfS5iaW5kKHRoaXMpO1xuXG4gIC8vIGNhbGwgYW55IHJlZ2lzdGVyZWQgaW5pdCBmdW5jdGlvbnNcbiAgdGhpcy5fcmVnaXN0ZXJlZE1ldGhvZHMuaW5pdC5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcbiAgICBpZiAodHlwZW9mIGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBmLmNhbGwodGhpcyk7XG4gICAgfVxuICB9LCB0aGlzKTtcblxuICB2YXIgZnJpZW5kbHlCaW5kR2xvYmFsID0gdGhpcy5fY3JlYXRlRnJpZW5kbHlHbG9iYWxGdW5jdGlvbkJpbmRlcigpO1xuXG4gIC8vIElmIHRoZSB1c2VyIGhhcyBjcmVhdGVkIGEgZ2xvYmFsIHNldHVwIG9yIGRyYXcgZnVuY3Rpb24sXG4gIC8vIGFzc3VtZSBcImdsb2JhbFwiIG1vZGUgYW5kIG1ha2UgZXZlcnl0aGluZyBnbG9iYWwgKGkuZS4gb24gdGhlIHdpbmRvdylcbiAgaWYgKCFza2V0Y2gpIHtcbiAgICB0aGlzLl9pc0dsb2JhbCA9IHRydWU7XG4gICAgcDUuaW5zdGFuY2UgPSB0aGlzO1xuICAgIC8vIExvb3AgdGhyb3VnaCBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUgYW5kIGF0dGFjaCB0aGVtIHRvIHRoZSB3aW5kb3dcbiAgICBmb3IgKHZhciBwIGluIHA1LnByb3RvdHlwZSkge1xuICAgICAgaWYgKHR5cGVvZiBwNS5wcm90b3R5cGVbcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIGV2ID0gcC5zdWJzdHJpbmcoMik7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRzLmhhc093blByb3BlcnR5KGV2KSkge1xuICAgICAgICAgIGlmIChNYXRoLmhhc093blByb3BlcnR5KHApICYmIE1hdGhbcF0gPT09IHA1LnByb3RvdHlwZVtwXSkge1xuICAgICAgICAgICAgLy8gTXVsdGlwbGUgcDUgbWV0aG9kcyBhcmUganVzdCBuYXRpdmUgTWF0aCBmdW5jdGlvbnMuIFRoZXNlIGNhbiBiZVxuICAgICAgICAgICAgLy8gY2FsbGVkIHdpdGhvdXQgYW55IGJpbmRpbmcuXG4gICAgICAgICAgICBmcmllbmRseUJpbmRHbG9iYWwocCwgcDUucHJvdG90eXBlW3BdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJpZW5kbHlCaW5kR2xvYmFsKHAsIHA1LnByb3RvdHlwZVtwXS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyaWVuZGx5QmluZEdsb2JhbChwLCBwNS5wcm90b3R5cGVbcF0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBdHRhY2ggaXRzIHByb3BlcnRpZXMgdG8gdGhlIHdpbmRvd1xuICAgIGZvciAodmFyIHAyIGluIHRoaXMpIHtcbiAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KHAyKSkge1xuICAgICAgICBmcmllbmRseUJpbmRHbG9iYWwocDIsIHRoaXNbcDJdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRWxzZSwgdGhlIHVzZXIgaGFzIHBhc3NlZCBpbiBhIHNrZXRjaCBjbG9zdXJlIHRoYXQgbWF5IHNldFxuICAgIC8vIHVzZXItcHJvdmlkZWQgJ3NldHVwJywgJ2RyYXcnLCBldGMuIHByb3BlcnRpZXMgb24gdGhpcyBpbnN0YW5jZSBvZiBwNVxuICAgIHNrZXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8vIEJpbmQgZXZlbnRzIHRvIHdpbmRvdyAobm90IHVzaW5nIGNvbnRhaW5lciBkaXYgYmMga2V5IGV2ZW50cyBkb24ndCB3b3JrKVxuXG4gIGZvciAodmFyIGUgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGYgPSB0aGlzWydfb24nICsgZV07XG4gICAgaWYgKGYpIHtcbiAgICAgIHZhciBtID0gZi5iaW5kKHRoaXMpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZSwgbSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuX2V2ZW50c1tlXSA9IG07XG4gICAgfVxuICB9XG5cbiAgdmFyIGZvY3VzSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3NldFByb3BlcnR5KCdmb2N1c2VkJywgdHJ1ZSk7XG4gIH0uYmluZCh0aGlzKTtcbiAgdmFyIGJsdXJIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ2ZvY3VzZWQnLCBmYWxzZSk7XG4gIH0uYmluZCh0aGlzKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZm9jdXNIYW5kbGVyKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBibHVySGFuZGxlcik7XG4gIHRoaXMucmVnaXN0ZXJNZXRob2QoJ3JlbW92ZScsIGZ1bmN0aW9uKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIGZvY3VzSGFuZGxlcik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBibHVySGFuZGxlcik7XG4gIH0pO1xuXG4gIGlmIChzeW5jKSB7XG4gICAgdGhpcy5fc3RhcnQoKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgdGhpcy5fc3RhcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLl9zdGFydC5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgfVxuICB9XG59O1xuXG5wNS5wcm90b3R5cGUuX2luaXRpYWxpemVJbnN0YW5jZVZhcmlhYmxlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9zdHlsZXMgPSBbXTtcblxuICB0aGlzLl9iZXppZXJEZXRhaWwgPSAyMDtcbiAgdGhpcy5fY3VydmVEZXRhaWwgPSAyMDtcblxuICB0aGlzLl9jb2xvck1vZGUgPSBjb25zdGFudHMuUkdCO1xuICB0aGlzLl9jb2xvck1heGVzID0ge1xuICAgIHJnYjogWzI1NSwgMjU1LCAyNTUsIDI1NV0sXG4gICAgaHNiOiBbMzYwLCAxMDAsIDEwMCwgMV0sXG4gICAgaHNsOiBbMzYwLCAxMDAsIDEwMCwgMV1cbiAgfTtcbn07XG5cbi8vIFRoaXMgaXMgYSBwb2ludGVyIHRvIG91ciBnbG9iYWwgbW9kZSBwNSBpbnN0YW5jZSwgaWYgd2UncmUgaW5cbi8vIGdsb2JhbCBtb2RlLlxucDUuaW5zdGFuY2UgPSBudWxsO1xuXG4vLyBBbGxvd3MgZm9yIHRoZSBmcmllbmRseSBlcnJvciBzeXN0ZW0gdG8gYmUgdHVybmVkIG9mZiB3aGVuIGNyZWF0aW5nIGEgc2tldGNoLFxuLy8gd2hpY2ggY2FuIGdpdmUgYSBzaWduaWZpY2FudCBib29zdCB0byBwZXJmb3JtYW5jZSB3aGVuIG5lZWRlZC5cbnA1LmRpc2FibGVGcmllbmRseUVycm9ycyA9IGZhbHNlO1xuXG4vLyBhdHRhY2ggY29uc3RhbnRzIHRvIHA1IHByb3RvdHlwZVxuZm9yICh2YXIgayBpbiBjb25zdGFudHMpIHtcbiAgcDUucHJvdG90eXBlW2tdID0gY29uc3RhbnRzW2tdO1xufVxuXG4vLyBmdW5jdGlvbnMgdGhhdCBjYXVzZSBwcmVsb2FkIHRvIHdhaXRcbi8vIG1vcmUgY2FuIGJlIGFkZGVkIGJ5IHVzaW5nIHJlZ2lzdGVyUHJlbG9hZE1ldGhvZChmdW5jKVxucDUucHJvdG90eXBlLl9wcmVsb2FkTWV0aG9kcyA9IHtcbiAgbG9hZEpTT046IHA1LnByb3RvdHlwZSxcbiAgbG9hZEltYWdlOiBwNS5wcm90b3R5cGUsXG4gIGxvYWRTdHJpbmdzOiBwNS5wcm90b3R5cGUsXG4gIGxvYWRYTUw6IHA1LnByb3RvdHlwZSxcbiAgbG9hZEJ5dGVzOiBwNS5wcm90b3R5cGUsXG4gIGxvYWRTaGFwZTogcDUucHJvdG90eXBlLFxuICBsb2FkVGFibGU6IHA1LnByb3RvdHlwZSxcbiAgbG9hZEZvbnQ6IHA1LnByb3RvdHlwZSxcbiAgbG9hZE1vZGVsOiBwNS5wcm90b3R5cGUsXG4gIGxvYWRTaGFkZXI6IHA1LnByb3RvdHlwZVxufTtcblxucDUucHJvdG90eXBlLl9yZWdpc3RlcmVkTWV0aG9kcyA9IHsgaW5pdDogW10sIHByZTogW10sIHBvc3Q6IFtdLCByZW1vdmU6IFtdIH07XG5cbnA1LnByb3RvdHlwZS5fcmVnaXN0ZXJlZFByZWxvYWRNZXRob2RzID0ge307XG5cbnA1LnByb3RvdHlwZS5yZWdpc3RlclByZWxvYWRNZXRob2QgPSBmdW5jdGlvbihmblN0cmluZywgb2JqKSB7XG4gIC8vIG9iaiA9IG9iaiB8fCBwNS5wcm90b3R5cGU7XG4gIGlmICghcDUucHJvdG90eXBlLl9wcmVsb2FkTWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShmblN0cmluZykpIHtcbiAgICBwNS5wcm90b3R5cGUuX3ByZWxvYWRNZXRob2RzW2ZuU3RyaW5nXSA9IG9iajtcbiAgfVxufTtcblxucDUucHJvdG90eXBlLnJlZ2lzdGVyTWV0aG9kID0gZnVuY3Rpb24obmFtZSwgbSkge1xuICB2YXIgdGFyZ2V0ID0gdGhpcyB8fCBwNS5wcm90b3R5cGU7XG4gIGlmICghdGFyZ2V0Ll9yZWdpc3RlcmVkTWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgIHRhcmdldC5fcmVnaXN0ZXJlZE1ldGhvZHNbbmFtZV0gPSBbXTtcbiAgfVxuICB0YXJnZXQuX3JlZ2lzdGVyZWRNZXRob2RzW25hbWVdLnB1c2gobSk7XG59O1xuXG5wNS5wcm90b3R5cGUuX2NyZWF0ZUZyaWVuZGx5R2xvYmFsRnVuY3Rpb25CaW5kZXIgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHZhciBnbG9iYWxPYmplY3QgPSBvcHRpb25zLmdsb2JhbE9iamVjdCB8fCB3aW5kb3c7XG4gIHZhciBsb2cgPSBvcHRpb25zLmxvZyB8fCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuICB2YXIgcHJvcHNUb0ZvcmNpYmx5T3ZlcndyaXRlID0ge1xuICAgIC8vIHA1LnByaW50IGFjdHVhbGx5IGFsd2F5cyBvdmVyd3JpdGVzIGFuIGV4aXN0aW5nIGdsb2JhbCBmdW5jdGlvbixcbiAgICAvLyBhbGJlaXQgb25lIHRoYXQgaXMgdmVyeSB1bmxpa2VseSB0byBiZSB1c2VkOlxuICAgIC8vXG4gICAgLy8gICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L3ByaW50XG4gICAgcHJpbnQ6IHRydWVcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24ocHJvcCwgdmFsdWUpIHtcbiAgICBpZiAoXG4gICAgICAhcDUuZGlzYWJsZUZyaWVuZGx5RXJyb3JzICYmXG4gICAgICB0eXBlb2YgSVNfTUlOSUZJRUQgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICEocHJvcCBpbiBwNS5wcm90b3R5cGUuX3ByZWxvYWRNZXRob2RzKVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQmVjYXVzZSBwNSBoYXMgc28gbWFueSBjb21tb24gZnVuY3Rpb24gbmFtZXMsIGl0J3MgbGlrZWx5XG4gICAgICAgIC8vIHRoYXQgdXNlcnMgbWF5IGFjY2lkZW50YWxseSBvdmVyd3JpdGUgZ2xvYmFsIHA1IGZ1bmN0aW9ucyB3aXRoXG4gICAgICAgIC8vIHRoZWlyIG93biB2YXJpYWJsZXMuIExldCdzIGFsbG93IHRoaXMgYnV0IGxvZyBhIHdhcm5pbmcgdG9cbiAgICAgICAgLy8gaGVscCB1c2VycyB3aG8gbWF5IGJlIGRvaW5nIHRoaXMgdW5pbnRlbnRpb25hbGx5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOlxuICAgICAgICAvL1xuICAgICAgICAvLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzL2lzc3Vlcy8xMzE3XG5cbiAgICAgICAgaWYgKHByb3AgaW4gZ2xvYmFsT2JqZWN0ICYmICEocHJvcCBpbiBwcm9wc1RvRm9yY2libHlPdmVyd3JpdGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnbG9iYWwgXCInICsgcHJvcCArICdcIiBhbHJlYWR5IGV4aXN0cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgbWlnaHQgdGhyb3cgYW4gZXJyb3IgYmVjYXVzZSB0aGVyZVxuICAgICAgICAvLyBhcmUgYSBsb3Qgb2YgZWRnZS1jYXNlcyBpbiB3aGljaCBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtaWdodFxuICAgICAgICAvLyBub3Qgc3VjY2VlZDsgc2luY2UgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIG9ubHkgaW50ZW5kZWQgdG9cbiAgICAgICAgLy8gaGVscCBiZWdpbm5lcnMgYW55d2F5cywgd2UnbGwganVzdCBjYXRjaCBzdWNoIGFuIGV4Y2VwdGlvblxuICAgICAgICAvLyBpZiBpdCBvY2N1cnMsIGFuZCBmYWxsIGJhY2sgdG8gbGVnYWN5IGJlaGF2aW9yLlxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsT2JqZWN0LCBwcm9wLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxPYmplY3QsIHByb3AsIHtcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZyhcbiAgICAgICAgICAgICAgJ1lvdSBqdXN0IGNoYW5nZWQgdGhlIHZhbHVlIG9mIFwiJyArXG4gICAgICAgICAgICAgICAgcHJvcCArXG4gICAgICAgICAgICAgICAgJ1wiLCB3aGljaCB3YXMgJyArXG4gICAgICAgICAgICAgICAgXCJhIHA1IGZ1bmN0aW9uLiBUaGlzIGNvdWxkIGNhdXNlIHByb2JsZW1zIGxhdGVyIGlmIHlvdSdyZSBcIiArXG4gICAgICAgICAgICAgICAgJ25vdCBjYXJlZnVsLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nKFxuICAgICAgICAgICdwNSBoYWQgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIGdsb2JhbCBmdW5jdGlvbiBcIicgK1xuICAgICAgICAgICAgcHJvcCArXG4gICAgICAgICAgICAnXCIsICcgK1xuICAgICAgICAgICAgJ3Bvc3NpYmx5IGJlY2F1c2UgeW91ciBjb2RlIGlzIGFscmVhZHkgdXNpbmcgdGhhdCBuYW1lIGFzICcgK1xuICAgICAgICAgICAgJ2EgdmFyaWFibGUuIFlvdSBtYXkgd2FudCB0byByZW5hbWUgeW91ciB2YXJpYWJsZSB0byBzb21ldGhpbmcgJyArXG4gICAgICAgICAgICAnZWxzZS4nXG4gICAgICAgICk7XG4gICAgICAgIGdsb2JhbE9iamVjdFtwcm9wXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iYWxPYmplY3RbcHJvcF0gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4vY29uc3RhbnRzXCI6MjEsXCIuL3NoaW1cIjozMn1dLDIzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBTaGFwZVxuICogQHN1Ym1vZHVsZSBDdXJ2ZXNcbiAqIEBmb3IgcDVcbiAqIEByZXF1aXJlcyBjb3JlXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuL2NvcmUnKTtcbl9kZXJlcV8oJy4vZXJyb3JfaGVscGVycycpO1xuXG4vKipcbiAqIERyYXdzIGEgY3ViaWMgQmV6aWVyIGN1cnZlIG9uIHRoZSBzY3JlZW4uIFRoZXNlIGN1cnZlcyBhcmUgZGVmaW5lZCBieSBhXG4gKiBzZXJpZXMgb2YgYW5jaG9yIGFuZCBjb250cm9sIHBvaW50cy4gVGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIHNwZWNpZnlcbiAqIHRoZSBmaXJzdCBhbmNob3IgcG9pbnQgYW5kIHRoZSBsYXN0IHR3byBwYXJhbWV0ZXJzIHNwZWNpZnkgdGhlIG90aGVyXG4gKiBhbmNob3IgcG9pbnQsIHdoaWNoIGJlY29tZSB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnRzIG9uIHRoZSBjdXJ2ZS4gVGhlXG4gKiBtaWRkbGUgcGFyYW1ldGVycyBzcGVjaWZ5IHRoZSB0d28gY29udHJvbCBwb2ludHMgd2hpY2ggZGVmaW5lIHRoZSBzaGFwZVxuICogb2YgdGhlIGN1cnZlLiBBcHByb3hpbWF0ZWx5IHNwZWFraW5nLCBjb250cm9sIHBvaW50cyBcInB1bGxcIiB0aGUgY3VydmVcbiAqIHRvd2FyZHMgdGhlbS48YnIgLz48YnIgLz5CZXppZXIgY3VydmVzIHdlcmUgZGV2ZWxvcGVkIGJ5IEZyZW5jaFxuICogYXV0b21vdGl2ZSBlbmdpbmVlciBQaWVycmUgQmV6aWVyLCBhbmQgYXJlIGNvbW1vbmx5IHVzZWQgaW4gY29tcHV0ZXJcbiAqIGdyYXBoaWNzIHRvIGRlZmluZSBnZW50bHkgc2xvcGluZyBjdXJ2ZXMuIFNlZSBhbHNvIGN1cnZlKCkuXG4gKlxuICogQG1ldGhvZCBiZXppZXJcbiAqIEBwYXJhbSAge051bWJlcn0geDEgeC1jb29yZGluYXRlIGZvciB0aGUgZmlyc3QgYW5jaG9yIHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkxIHktY29vcmRpbmF0ZSBmb3IgdGhlIGZpcnN0IGFuY2hvciBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB4MiB4LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBjb250cm9sIHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkyIHktY29vcmRpbmF0ZSBmb3IgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDMgeC1jb29yZGluYXRlIGZvciB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geTMgeS1jb29yZGluYXRlIGZvciB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDQgeC1jb29yZGluYXRlIGZvciB0aGUgc2Vjb25kIGFuY2hvciBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB5NCB5LWNvb3JkaW5hdGUgZm9yIHRoZSBzZWNvbmQgYW5jaG9yIHBvaW50XG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogbm9GaWxsKCk7XG4gKiBzdHJva2UoMjU1LCAxMDIsIDApO1xuICogbGluZSg4NSwgMjAsIDEwLCAxMCk7XG4gKiBsaW5lKDkwLCA5MCwgMTUsIDgwKTtcbiAqIHN0cm9rZSgwLCAwLCAwKTtcbiAqIGJlemllcig4NSwgMjAsIDEwLCAxMCwgOTAsIDkwLCAxNSwgODApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogYmFja2dyb3VuZCgwLCAwLCAwKTtcbiAqIG5vRmlsbCgpO1xuICogc3Ryb2tlKDI1NSk7XG4gKiBiZXppZXIoMjUwLCAyNTAsIDAsIDEwMCwgMTAwLCAwLCAxMDAsIDAsIDAsIDAsIDEwMCwgMCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBzdHJldGNoZWQgYmxhY2sgcy1zaGFwZSBpbiBjZW50ZXIgd2l0aCBvcmFuZ2UgbGluZXMgZXh0ZW5kaW5nIGZyb20gZW5kIHBvaW50cy5cbiAqIHN0cmV0Y2hlZCBibGFjayBzLXNoYXBlIHdpdGggMTAgNXg1IHdoaXRlIGVsbGlwc2VzIGFsb25nIHRoZSBzaGFwZS5cbiAqIHN0cmV0Y2hlZCBibGFjayBzLXNoYXBlIHdpdGggNyA1eDUgZWxsaXBzZXMgYW5kIG9yYW5nZSBsaW5lcyBhbG9uZyB0aGUgc2hhcGUuXG4gKiBzdHJldGNoZWQgYmxhY2sgcy1zaGFwZSB3aXRoIDE3IHNtYWxsIG9yYW5nZSBsaW5lcyBleHRlbmRpbmcgZnJvbSB1bmRlciBzaGFwZS5cbiAqIGhvcnNlc2hvZSBzaGFwZSB3aXRoIG9yYW5nZSBlbmRzIGZhY2luZyBsZWZ0IGFuZCBibGFjayBjdXJ2ZWQgY2VudGVyLlxuICogaG9yc2VzaG9lIHNoYXBlIHdpdGggb3JhbmdlIGVuZHMgZmFjaW5nIGxlZnQgYW5kIGJsYWNrIGN1cnZlZCBjZW50ZXIuXG4gKiBMaW5lIHNoYXBlZCBsaWtlIHJpZ2h0LWZhY2luZyBhcnJvdyxwb2ludHMgbW92ZSB3aXRoIG1vdXNlLXggYW5kIHdhcnAgc2hhcGUuXG4gKiBob3Jpem9udGFsIGxpbmUgdGhhdCBob29rcyBkb3dud2FyZCBvbiB0aGUgcmlnaHQgYW5kIDEzIDV4NSBlbGxpcHNlcyBhbG9uZyBpdC5cbiAqIHJpZ2h0IGN1cnZpbmcgbGluZSBtaWQtcmlnaHQgb2YgY2FudmFzIHdpdGggNyBzaG9ydCBsaW5lcyByYWRpYXRpbmcgZnJvbSBpdC5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGJlemllclxuICogQHBhcmFtICB7TnVtYmVyfSB4MVxuICogQHBhcmFtICB7TnVtYmVyfSB5MVxuICogQHBhcmFtICB7TnVtYmVyfSB6MSB6LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBhbmNob3IgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDJcbiAqIEBwYXJhbSAge051bWJlcn0geTJcbiAqIEBwYXJhbSAge051bWJlcn0gejIgei1jb29yZGluYXRlIGZvciB0aGUgZmlyc3QgY29udHJvbCBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB4M1xuICogQHBhcmFtICB7TnVtYmVyfSB5M1xuICogQHBhcmFtICB7TnVtYmVyfSB6MyB6LWNvb3JkaW5hdGUgZm9yIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB4NFxuICogQHBhcmFtICB7TnVtYmVyfSB5NFxuICogQHBhcmFtICB7TnVtYmVyfSB6NCB6LWNvb3JkaW5hdGUgZm9yIHRoZSBzZWNvbmQgYW5jaG9yIHBvaW50XG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1LnByb3RvdHlwZS5iZXppZXIgPSBmdW5jdGlvbigpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnYmV6aWVyJywgYXJndW1lbnRzKTtcblxuICBpZiAodGhpcy5fcmVuZGVyZXIuX2RvU3Ryb2tlIHx8IHRoaXMuX3JlbmRlcmVyLl9kb0ZpbGwpIHtcbiAgICB0aGlzLl9yZW5kZXJlci5iZXppZXIuYXBwbHkodGhpcy5fcmVuZGVyZXIsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgcmVzb2x1dGlvbiBhdCB3aGljaCBCZXppZXJzIGRpc3BsYXkuXG4gKlxuICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMjAuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCB3aGVuIHVzaW5nIHRoZSBXRUJHTCByZW5kZXJlclxuICogYXMgdGhlIGRlZmF1bHQgY2FudmFzIHJlbmRlcmVyIGRvZXMgbm90IHVzZSB0aGlzIGluZm9ybWF0aW9uLlxuICpcbiAqIEBtZXRob2QgYmV6aWVyRGV0YWlsXG4gKiBAcGFyYW0ge051bWJlcn0gZGV0YWlsIHJlc29sdXRpb24gb2YgdGhlIGN1cnZlc1xuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgbW9kZXJuaXpyPSd3ZWJnbCc+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqICAgbm9GaWxsKCk7XG4gKlxuICogICBiZXppZXJEZXRhaWwoNSk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICpcbiAqICAgLy8gcHJldHRpZXItaWdub3JlXG4gKiAgIGJlemllcigtNDAsIC00MCwgMCxcbiAqICAgICAgICAgICA5MCwgLTQwLCAwLFxuICogICAgICAgICAgLTkwLCAgNDAsIDAsXG4gKiAgICAgICAgICAgNDAsICA0MCwgMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBzdHJldGNoZWQgYmxhY2sgcy1zaGFwZSB3aXRoIGEgbG93IGxldmVsIG9mIGJlemllciBkZXRhaWxcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5iZXppZXJEZXRhaWwgPSBmdW5jdGlvbihkKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2JlemllckRldGFpbCcsIGFyZ3VtZW50cyk7XG4gIHRoaXMuX2JlemllckRldGFpbCA9IGQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZXMgdGhlIEJlemllciBhdCBwb3NpdGlvbiB0IGZvciBwb2ludHMgYSwgYiwgYywgZC5cbiAqIFRoZSBwYXJhbWV0ZXJzIGEgYW5kIGQgYXJlIHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHNcbiAqIG9uIHRoZSBjdXJ2ZSwgYW5kIGIgYW5kIGMgYXJlIHRoZSBjb250cm9sIHBvaW50cy5cbiAqIFRoZSBmaW5hbCBwYXJhbWV0ZXIgdCB2YXJpZXMgYmV0d2VlbiAwIGFuZCAxLlxuICogVGhpcyBjYW4gYmUgZG9uZSBvbmNlIHdpdGggdGhlIHggY29vcmRpbmF0ZXMgYW5kIGEgc2Vjb25kIHRpbWVcbiAqIHdpdGggdGhlIHkgY29vcmRpbmF0ZXMgdG8gZ2V0IHRoZSBsb2NhdGlvbiBvZiBhIGJlemllciBjdXJ2ZSBhdCB0LlxuICpcbiAqIEBtZXRob2QgYmV6aWVyUG9pbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnQgb24gdGhlIGN1cnZlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBjb29yZGluYXRlIG9mIGZpcnN0IGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSBjIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSBkIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50IG9uIHRoZSBjdXJ2ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHQgdmFsdWUgYmV0d2VlbiAwIGFuZCAxXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSB2YWx1ZSBvZiB0aGUgQmV6aWVyIGF0IHBvc2l0aW9uIHRcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBub0ZpbGwoKTtcbiAqIHZhciB4MSA9IDg1LFxuICB4MiA9IDEwLFxuICB4MyA9IDkwLFxuICB4NCA9IDE1O1xuICogdmFyIHkxID0gMjAsXG4gIHkyID0gMTAsXG4gIHkzID0gOTAsXG4gIHk0ID0gODA7XG4gKiBiZXppZXIoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0KTtcbiAqIGZpbGwoMjU1KTtcbiAqIHZhciBzdGVwcyA9IDEwO1xuICogZm9yICh2YXIgaSA9IDA7IGkgPD0gc3RlcHM7IGkrKykge1xuICogICB2YXIgdCA9IGkgLyBzdGVwcztcbiAqICAgdmFyIHggPSBiZXppZXJQb2ludCh4MSwgeDIsIHgzLCB4NCwgdCk7XG4gKiAgIHZhciB5ID0gYmV6aWVyUG9pbnQoeTEsIHkyLCB5MywgeTQsIHQpO1xuICogICBlbGxpcHNlKHgsIHksIDUsIDUpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogc3RyZXRjaGVkIGJsYWNrIHMtc2hhcGUgd2l0aCAxNyBzbWFsbCBvcmFuZ2UgbGluZXMgZXh0ZW5kaW5nIGZyb20gdW5kZXIgc2hhcGUuXG4gKlxuICovXG5wNS5wcm90b3R5cGUuYmV6aWVyUG9pbnQgPSBmdW5jdGlvbihhLCBiLCBjLCBkLCB0KSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2JlemllclBvaW50JywgYXJndW1lbnRzKTtcblxuICB2YXIgYWRqdXN0ZWRUID0gMSAtIHQ7XG4gIHJldHVybiAoXG4gICAgTWF0aC5wb3coYWRqdXN0ZWRULCAzKSAqIGEgK1xuICAgIDMgKiBNYXRoLnBvdyhhZGp1c3RlZFQsIDIpICogdCAqIGIgK1xuICAgIDMgKiBhZGp1c3RlZFQgKiBNYXRoLnBvdyh0LCAyKSAqIGMgK1xuICAgIE1hdGgucG93KHQsIDMpICogZFxuICApO1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZXMgdGhlIHRhbmdlbnQgdG8gdGhlIEJlemllciBhdCBwb3NpdGlvbiB0IGZvciBwb2ludHMgYSwgYiwgYywgZC5cbiAqIFRoZSBwYXJhbWV0ZXJzIGEgYW5kIGQgYXJlIHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHNcbiAqIG9uIHRoZSBjdXJ2ZSwgYW5kIGIgYW5kIGMgYXJlIHRoZSBjb250cm9sIHBvaW50cy5cbiAqIFRoZSBmaW5hbCBwYXJhbWV0ZXIgdCB2YXJpZXMgYmV0d2VlbiAwIGFuZCAxLlxuICpcbiAqIEBtZXRob2QgYmV6aWVyVGFuZ2VudFxuICogQHBhcmFtIHtOdW1iZXJ9IGEgY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludCBvbiB0aGUgY3VydmVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGNvb3JkaW5hdGUgb2YgZmlyc3QgY29udHJvbCBwb2ludFxuICogQHBhcmFtIHtOdW1iZXJ9IGMgY29vcmRpbmF0ZSBvZiBzZWNvbmQgY29udHJvbCBwb2ludFxuICogQHBhcmFtIHtOdW1iZXJ9IGQgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnQgb24gdGhlIGN1cnZlXG4gKiBAcGFyYW0ge051bWJlcn0gdCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDFcbiAqIEByZXR1cm4ge051bWJlcn0gdGhlIHRhbmdlbnQgYXQgcG9zaXRpb24gdFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIG5vRmlsbCgpO1xuICogYmV6aWVyKDg1LCAyMCwgMTAsIDEwLCA5MCwgOTAsIDE1LCA4MCk7XG4gKiB2YXIgc3RlcHMgPSA2O1xuICogZmlsbCgyNTUpO1xuICogZm9yICh2YXIgaSA9IDA7IGkgPD0gc3RlcHM7IGkrKykge1xuICogICB2YXIgdCA9IGkgLyBzdGVwcztcbiAqICAgLy8gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcG9pbnRcbiAqICAgdmFyIHggPSBiZXppZXJQb2ludCg4NSwgMTAsIDkwLCAxNSwgdCk7XG4gKiAgIHZhciB5ID0gYmV6aWVyUG9pbnQoMjAsIDEwLCA5MCwgODAsIHQpO1xuICogICAvLyBHZXQgdGhlIHRhbmdlbnQgcG9pbnRzXG4gKiAgIHZhciB0eCA9IGJlemllclRhbmdlbnQoODUsIDEwLCA5MCwgMTUsIHQpO1xuICogICB2YXIgdHkgPSBiZXppZXJUYW5nZW50KDIwLCAxMCwgOTAsIDgwLCB0KTtcbiAqICAgLy8gQ2FsY3VsYXRlIGFuIGFuZ2xlIGZyb20gdGhlIHRhbmdlbnQgcG9pbnRzXG4gKiAgIHZhciBhID0gYXRhbjIodHksIHR4KTtcbiAqICAgYSArPSBQSTtcbiAqICAgc3Ryb2tlKDI1NSwgMTAyLCAwKTtcbiAqICAgbGluZSh4LCB5LCBjb3MoYSkgKiAzMCArIHgsIHNpbihhKSAqIDMwICsgeSk7XG4gKiAgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBvZiBjb2RlIG1ha2VzIGEgbGluZVxuICogICAvLyBpbnZlcnNlIG9mIHRoZSBhYm92ZSBsaW5lXG4gKiAgIC8vbGluZSh4LCB5LCBjb3MoYSkqLTMwICsgeCwgc2luKGEpKi0zMCArIHkpO1xuICogICBzdHJva2UoMCk7XG4gKiAgIGVsbGlwc2UoeCwgeSwgNSwgNSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBub0ZpbGwoKTtcbiAqIGJlemllcig4NSwgMjAsIDEwLCAxMCwgOTAsIDkwLCAxNSwgODApO1xuICogc3Ryb2tlKDI1NSwgMTAyLCAwKTtcbiAqIHZhciBzdGVwcyA9IDE2O1xuICogZm9yICh2YXIgaSA9IDA7IGkgPD0gc3RlcHM7IGkrKykge1xuICogICB2YXIgdCA9IGkgLyBzdGVwcztcbiAqICAgdmFyIHggPSBiZXppZXJQb2ludCg4NSwgMTAsIDkwLCAxNSwgdCk7XG4gKiAgIHZhciB5ID0gYmV6aWVyUG9pbnQoMjAsIDEwLCA5MCwgODAsIHQpO1xuICogICB2YXIgdHggPSBiZXppZXJUYW5nZW50KDg1LCAxMCwgOTAsIDE1LCB0KTtcbiAqICAgdmFyIHR5ID0gYmV6aWVyVGFuZ2VudCgyMCwgMTAsIDkwLCA4MCwgdCk7XG4gKiAgIHZhciBhID0gYXRhbjIodHksIHR4KTtcbiAqICAgYSAtPSBIQUxGX1BJO1xuICogICBsaW5lKHgsIHksIGNvcyhhKSAqIDggKyB4LCBzaW4oYSkgKiA4ICsgeSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBzLXNoYXBlZCBsaW5lIHdpdGggMTcgc2hvcnQgb3JhbmdlIGxpbmVzIGV4dGVuZGluZyBmcm9tIHVuZGVyc2lkZSBvZiBzaGFwZVxuICpcbiAqL1xucDUucHJvdG90eXBlLmJlemllclRhbmdlbnQgPSBmdW5jdGlvbihhLCBiLCBjLCBkLCB0KSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2JlemllclRhbmdlbnQnLCBhcmd1bWVudHMpO1xuXG4gIHZhciBhZGp1c3RlZFQgPSAxIC0gdDtcbiAgcmV0dXJuIChcbiAgICAzICogZCAqIE1hdGgucG93KHQsIDIpIC1cbiAgICAzICogYyAqIE1hdGgucG93KHQsIDIpICtcbiAgICA2ICogYyAqIGFkanVzdGVkVCAqIHQgLVxuICAgIDYgKiBiICogYWRqdXN0ZWRUICogdCArXG4gICAgMyAqIGIgKiBNYXRoLnBvdyhhZGp1c3RlZFQsIDIpIC1cbiAgICAzICogYSAqIE1hdGgucG93KGFkanVzdGVkVCwgMilcbiAgKTtcbn07XG5cbi8qKlxuICogRHJhd3MgYSBjdXJ2ZWQgbGluZSBvbiB0aGUgc2NyZWVuIGJldHdlZW4gdHdvIHBvaW50cywgZ2l2ZW4gYXMgdGhlXG4gKiBtaWRkbGUgZm91ciBwYXJhbWV0ZXJzLiBUaGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgYXJlIGEgY29udHJvbCBwb2ludCwgYXNcbiAqIGlmIHRoZSBjdXJ2ZSBjYW1lIGZyb20gdGhpcyBwb2ludCBldmVuIHRob3VnaCBpdCdzIG5vdCBkcmF3bi4gVGhlIGxhc3RcbiAqIHR3byBwYXJhbWV0ZXJzIHNpbWlsYXJseSBkZXNjcmliZSB0aGUgb3RoZXIgY29udHJvbCBwb2ludC4gPGJyIC8+PGJyIC8+XG4gKiBMb25nZXIgY3VydmVzIGNhbiBiZSBjcmVhdGVkIGJ5IHB1dHRpbmcgYSBzZXJpZXMgb2YgY3VydmUoKSBmdW5jdGlvbnNcbiAqIHRvZ2V0aGVyIG9yIHVzaW5nIGN1cnZlVmVydGV4KCkuIEFuIGFkZGl0aW9uYWwgZnVuY3Rpb24gY2FsbGVkXG4gKiBjdXJ2ZVRpZ2h0bmVzcygpIHByb3ZpZGVzIGNvbnRyb2wgZm9yIHRoZSB2aXN1YWwgcXVhbGl0eSBvZiB0aGUgY3VydmUuXG4gKiBUaGUgY3VydmUoKSBmdW5jdGlvbiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBDYXRtdWxsLVJvbSBzcGxpbmVzLlxuICpcbiAqIEBtZXRob2QgY3VydmVcbiAqIEBwYXJhbSAge051bWJlcn0geDEgeC1jb29yZGluYXRlIGZvciB0aGUgYmVnaW5uaW5nIGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geTEgeS1jb29yZGluYXRlIGZvciB0aGUgYmVnaW5uaW5nIGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDIgeC1jb29yZGluYXRlIGZvciB0aGUgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geTIgeS1jb29yZGluYXRlIGZvciB0aGUgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDMgeC1jb29yZGluYXRlIGZvciB0aGUgc2Vjb25kIHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkzIHktY29vcmRpbmF0ZSBmb3IgdGhlIHNlY29uZCBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB4NCB4LWNvb3JkaW5hdGUgZm9yIHRoZSBlbmRpbmcgY29udHJvbCBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB5NCB5LWNvb3JkaW5hdGUgZm9yIHRoZSBlbmRpbmcgY29udHJvbCBwb2ludFxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIG5vRmlsbCgpO1xuICogc3Ryb2tlKDI1NSwgMTAyLCAwKTtcbiAqIGN1cnZlKDUsIDI2LCA1LCAyNiwgNzMsIDI0LCA3MywgNjEpO1xuICogc3Ryb2tlKDApO1xuICogY3VydmUoNSwgMjYsIDczLCAyNCwgNzMsIDYxLCAxNSwgNjUpO1xuICogc3Ryb2tlKDI1NSwgMTAyLCAwKTtcbiAqIGN1cnZlKDczLCAyNCwgNzMsIDYxLCAxNSwgNjUsIDE1LCA2NSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIERlZmluZSB0aGUgY3VydmUgcG9pbnRzIGFzIEphdmFTY3JpcHQgb2JqZWN0c1xuICogdmFyIHAxID0geyB4OiA1LCB5OiAyNiB9LFxuICBwMiA9IHsgeDogNzMsIHk6IDI0IH07XG4gKiB2YXIgcDMgPSB7IHg6IDczLCB5OiA2MSB9LFxuICBwNCA9IHsgeDogMTUsIHk6IDY1IH07XG4gKiBub0ZpbGwoKTtcbiAqIHN0cm9rZSgyNTUsIDEwMiwgMCk7XG4gKiBjdXJ2ZShwMS54LCBwMS55LCBwMS54LCBwMS55LCBwMi54LCBwMi55LCBwMy54LCBwMy55KTtcbiAqIHN0cm9rZSgwKTtcbiAqIGN1cnZlKHAxLngsIHAxLnksIHAyLngsIHAyLnksIHAzLngsIHAzLnksIHA0LngsIHA0LnkpO1xuICogc3Ryb2tlKDI1NSwgMTAyLCAwKTtcbiAqIGN1cnZlKHAyLngsIHAyLnksIHAzLngsIHAzLnksIHA0LngsIHA0LnksIHA0LngsIHA0LnkpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBub0ZpbGwoKTtcbiAqIHN0cm9rZSgyNTUsIDEwMiwgMCk7XG4gKiBjdXJ2ZSg1LCAyNiwgMCwgNSwgMjYsIDAsIDczLCAyNCwgMCwgNzMsIDYxLCAwKTtcbiAqIHN0cm9rZSgwKTtcbiAqIGN1cnZlKDUsIDI2LCAwLCA3MywgMjQsIDAsIDczLCA2MSwgMCwgMTUsIDY1LCAwKTtcbiAqIHN0cm9rZSgyNTUsIDEwMiwgMCk7XG4gKiBjdXJ2ZSg3MywgMjQsIDAsIDczLCA2MSwgMCwgMTUsIDY1LCAwLCAxNSwgNjUsIDApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogaG9yc2VzaG9lIHNoYXBlIHdpdGggb3JhbmdlIGVuZHMgZmFjaW5nIGxlZnQgYW5kIGJsYWNrIGN1cnZlZCBjZW50ZXIuXG4gKiBob3JzZXNob2Ugc2hhcGUgd2l0aCBvcmFuZ2UgZW5kcyBmYWNpbmcgbGVmdCBhbmQgYmxhY2sgY3VydmVkIGNlbnRlci5cbiAqIGN1cnZpbmcgYmxhY2sgYW5kIG9yYW5nZSBsaW5lcy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGN1cnZlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHgxXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkxXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHoxIHotY29vcmRpbmF0ZSBmb3IgdGhlIGJlZ2lubmluZyBjb250cm9sIHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHgyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHoyIHotY29vcmRpbmF0ZSBmb3IgdGhlIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHgzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHozIHotY29vcmRpbmF0ZSBmb3IgdGhlIHNlY29uZCBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB4NFxuICogQHBhcmFtICB7TnVtYmVyfSB5NFxuICogQHBhcmFtICB7TnVtYmVyfSB6NCB6LWNvb3JkaW5hdGUgZm9yIHRoZSBlbmRpbmcgY29udHJvbCBwb2ludFxuICogQGNoYWluYWJsZVxuICovXG5wNS5wcm90b3R5cGUuY3VydmUgPSBmdW5jdGlvbigpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnY3VydmUnLCBhcmd1bWVudHMpO1xuXG4gIGlmICh0aGlzLl9yZW5kZXJlci5fZG9TdHJva2UpIHtcbiAgICB0aGlzLl9yZW5kZXJlci5jdXJ2ZS5hcHBseSh0aGlzLl9yZW5kZXJlciwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIGN1cnZlcyBkaXNwbGF5LlxuICpcbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIwLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgd2hlbiB1c2luZyB0aGUgV0VCR0wgcmVuZGVyZXJcbiAqIGFzIHRoZSBkZWZhdWx0IGNhbnZhcyByZW5kZXJlciBkb2VzIG5vdCB1c2UgdGhpc1xuICogaW5mb3JtYXRpb24uXG4gKlxuICogQG1ldGhvZCBjdXJ2ZURldGFpbFxuICogQHBhcmFtIHtOdW1iZXJ9IHJlc29sdXRpb24gb2YgdGhlIGN1cnZlc1xuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgbW9kZXJuaXpyPSd3ZWJnbCc+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqXG4gKiAgIGN1cnZlRGV0YWlsKDUpO1xuICogfVxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICpcbiAqICAgLy8gcHJldHRpZXItaWdub3JlXG4gKiAgIGN1cnZlKCAyNTAsIDYwMCwgMCxcbiAqICAgICAgICAgIC0zMCwgIDQwLCAwLFxuICogICAgICAgICAgIDMwLCAgMzAsIDAsXG4gKiAgICAgICAgIC0yNTAsIDYwMCwgMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiB3aGl0ZSBhcmNoIHNoYXBlIHdpdGggYSBsb3cgbGV2ZWwgb2YgY3VydmUgZGV0YWlsLlxuICpcbiAqL1xucDUucHJvdG90eXBlLmN1cnZlRGV0YWlsID0gZnVuY3Rpb24oZCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjdXJ2ZURldGFpbCcsIGFyZ3VtZW50cyk7XG4gIHRoaXMuX2N1cnZlRGV0YWlsID0gZDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIE1vZGlmaWVzIHRoZSBxdWFsaXR5IG9mIGZvcm1zIGNyZWF0ZWQgd2l0aCBjdXJ2ZSgpIGFuZCBjdXJ2ZVZlcnRleCgpLlxuICogVGhlIHBhcmFtZXRlciB0aWdodG5lc3MgZGV0ZXJtaW5lcyBob3cgdGhlIGN1cnZlIGZpdHMgdG8gdGhlIHZlcnRleFxuICogcG9pbnRzLiBUaGUgdmFsdWUgMC4wIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aWdodG5lc3MgKHRoaXMgdmFsdWVcbiAqIGRlZmluZXMgdGhlIGN1cnZlcyB0byBiZSBDYXRtdWxsLVJvbSBzcGxpbmVzKSBhbmQgdGhlIHZhbHVlIDEuMCBjb25uZWN0c1xuICogYWxsIHRoZSBwb2ludHMgd2l0aCBzdHJhaWdodCBsaW5lcy4gVmFsdWVzIHdpdGhpbiB0aGUgcmFuZ2UgLTUuMCBhbmQgNS4wXG4gKiB3aWxsIGRlZm9ybSB0aGUgY3VydmVzIGJ1dCB3aWxsIGxlYXZlIHRoZW0gcmVjb2duaXphYmxlIGFuZCBhcyB2YWx1ZXNcbiAqIGluY3JlYXNlIGluIG1hZ25pdHVkZSwgdGhleSB3aWxsIGNvbnRpbnVlIHRvIGRlZm9ybS5cbiAqXG4gKiBAbWV0aG9kIGN1cnZlVGlnaHRuZXNzXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IG9mIGRlZm9ybWF0aW9uIGZyb20gdGhlIG9yaWdpbmFsIHZlcnRpY2VzXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gTW92ZSB0aGUgbW91c2UgbGVmdCBhbmQgcmlnaHQgdG8gc2VlIHRoZSBjdXJ2ZSBjaGFuZ2VcbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgbm9GaWxsKCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDQpO1xuICogICB2YXIgdCA9IG1hcChtb3VzZVgsIDAsIHdpZHRoLCAtNSwgNSk7XG4gKiAgIGN1cnZlVGlnaHRuZXNzKHQpO1xuICogICBiZWdpblNoYXBlKCk7XG4gKiAgIGN1cnZlVmVydGV4KDEwLCAyNik7XG4gKiAgIGN1cnZlVmVydGV4KDEwLCAyNik7XG4gKiAgIGN1cnZlVmVydGV4KDgzLCAyNCk7XG4gKiAgIGN1cnZlVmVydGV4KDgzLCA2MSk7XG4gKiAgIGN1cnZlVmVydGV4KDI1LCA2NSk7XG4gKiAgIGN1cnZlVmVydGV4KDI1LCA2NSk7XG4gKiAgIGVuZFNoYXBlKCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBMaW5lIHNoYXBlZCBsaWtlIHJpZ2h0LWZhY2luZyBhcnJvdyxwb2ludHMgbW92ZSB3aXRoIG1vdXNlLXggYW5kIHdhcnAgc2hhcGUuXG4gKi9cbnA1LnByb3RvdHlwZS5jdXJ2ZVRpZ2h0bmVzcyA9IGZ1bmN0aW9uKHQpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnY3VydmVUaWdodG5lc3MnLCBhcmd1bWVudHMpO1xuICB0aGlzLl9yZW5kZXJlci5fY3VydmVUaWdodG5lc3MgPSB0O1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZXMgdGhlIGN1cnZlIGF0IHBvc2l0aW9uIHQgZm9yIHBvaW50cyBhLCBiLCBjLCBkLlxuICogVGhlIHBhcmFtZXRlciB0IHZhcmllcyBiZXR3ZWVuIDAgYW5kIDEsIGEgYW5kIGQgYXJlIHBvaW50c1xuICogb24gdGhlIGN1cnZlLCBhbmQgYiBhbmQgYyBhcmUgdGhlIGNvbnRyb2wgcG9pbnRzLlxuICogVGhpcyBjYW4gYmUgZG9uZSBvbmNlIHdpdGggdGhlIHggY29vcmRpbmF0ZXMgYW5kIGEgc2Vjb25kIHRpbWVcbiAqIHdpdGggdGhlIHkgY29vcmRpbmF0ZXMgdG8gZ2V0IHRoZSBsb2NhdGlvbiBvZiBhIGN1cnZlIGF0IHQuXG4gKlxuICogQG1ldGhvZCBjdXJ2ZVBvaW50XG4gKiBAcGFyYW0ge051bWJlcn0gYSBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50IG9uIHRoZSBjdXJ2ZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgY29vcmRpbmF0ZSBvZiBmaXJzdCBjb250cm9sIHBvaW50XG4gKiBAcGFyYW0ge051bWJlcn0gYyBjb29yZGluYXRlIG9mIHNlY29uZCBjb250cm9sIHBvaW50XG4gKiBAcGFyYW0ge051bWJlcn0gZCBjb29yZGluYXRlIG9mIHNlY29uZCBwb2ludCBvbiB0aGUgY3VydmVcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IHZhbHVlIGJldHdlZW4gMCBhbmQgMVxuICogQHJldHVybiB7TnVtYmVyfSBiZXppZXIgdmFsdWUgYXQgcG9zaXRpb24gdFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIG5vRmlsbCgpO1xuICogY3VydmUoNSwgMjYsIDUsIDI2LCA3MywgMjQsIDczLCA2MSk7XG4gKiBjdXJ2ZSg1LCAyNiwgNzMsIDI0LCA3MywgNjEsIDE1LCA2NSk7XG4gKiBmaWxsKDI1NSk7XG4gKiBlbGxpcHNlTW9kZShDRU5URVIpO1xuICogdmFyIHN0ZXBzID0gNjtcbiAqIGZvciAodmFyIGkgPSAwOyBpIDw9IHN0ZXBzOyBpKyspIHtcbiAqICAgdmFyIHQgPSBpIC8gc3RlcHM7XG4gKiAgIHZhciB4ID0gY3VydmVQb2ludCg1LCA1LCA3MywgNzMsIHQpO1xuICogICB2YXIgeSA9IGN1cnZlUG9pbnQoMjYsIDI2LCAyNCwgNjEsIHQpO1xuICogICBlbGxpcHNlKHgsIHksIDUsIDUpO1xuICogICB4ID0gY3VydmVQb2ludCg1LCA3MywgNzMsIDE1LCB0KTtcbiAqICAgeSA9IGN1cnZlUG9pbnQoMjYsIDI0LCA2MSwgNjUsIHQpO1xuICogICBlbGxpcHNlKHgsIHksIDUsIDUpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICpsaW5lIGhvb2tpbmcgZG93biB0byByaWdodC1ib3R0b20gd2l0aCAxMyA1eDUgd2hpdGUgZWxsaXBzZSBwb2ludHNcbiAqL1xucDUucHJvdG90eXBlLmN1cnZlUG9pbnQgPSBmdW5jdGlvbihhLCBiLCBjLCBkLCB0KSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2N1cnZlUG9pbnQnLCBhcmd1bWVudHMpO1xuXG4gIHZhciB0MyA9IHQgKiB0ICogdCxcbiAgICB0MiA9IHQgKiB0LFxuICAgIGYxID0gLTAuNSAqIHQzICsgdDIgLSAwLjUgKiB0LFxuICAgIGYyID0gMS41ICogdDMgLSAyLjUgKiB0MiArIDEuMCxcbiAgICBmMyA9IC0xLjUgKiB0MyArIDIuMCAqIHQyICsgMC41ICogdCxcbiAgICBmNCA9IDAuNSAqIHQzIC0gMC41ICogdDI7XG4gIHJldHVybiBhICogZjEgKyBiICogZjIgKyBjICogZjMgKyBkICogZjQ7XG59O1xuXG4vKipcbiAqIEV2YWx1YXRlcyB0aGUgdGFuZ2VudCB0byB0aGUgY3VydmUgYXQgcG9zaXRpb24gdCBmb3IgcG9pbnRzIGEsIGIsIGMsIGQuXG4gKiBUaGUgcGFyYW1ldGVyIHQgdmFyaWVzIGJldHdlZW4gMCBhbmQgMSwgYSBhbmQgZCBhcmUgcG9pbnRzIG9uIHRoZSBjdXJ2ZSxcbiAqIGFuZCBiIGFuZCBjIGFyZSB0aGUgY29udHJvbCBwb2ludHMuXG4gKlxuICogQG1ldGhvZCBjdXJ2ZVRhbmdlbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnQgb24gdGhlIGN1cnZlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBjb29yZGluYXRlIG9mIGZpcnN0IGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSBjIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSBkIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50IG9uIHRoZSBjdXJ2ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHQgdmFsdWUgYmV0d2VlbiAwIGFuZCAxXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSB0YW5nZW50IGF0IHBvc2l0aW9uIHRcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBub0ZpbGwoKTtcbiAqIGN1cnZlKDUsIDI2LCA3MywgMjQsIDczLCA2MSwgMTUsIDY1KTtcbiAqIHZhciBzdGVwcyA9IDY7XG4gKiBmb3IgKHZhciBpID0gMDsgaSA8PSBzdGVwczsgaSsrKSB7XG4gKiAgIHZhciB0ID0gaSAvIHN0ZXBzO1xuICogICB2YXIgeCA9IGN1cnZlUG9pbnQoNSwgNzMsIDczLCAxNSwgdCk7XG4gKiAgIHZhciB5ID0gY3VydmVQb2ludCgyNiwgMjQsIDYxLCA2NSwgdCk7XG4gKiAgIC8vZWxsaXBzZSh4LCB5LCA1LCA1KTtcbiAqICAgdmFyIHR4ID0gY3VydmVUYW5nZW50KDUsIDczLCA3MywgMTUsIHQpO1xuICogICB2YXIgdHkgPSBjdXJ2ZVRhbmdlbnQoMjYsIDI0LCA2MSwgNjUsIHQpO1xuICogICB2YXIgYSA9IGF0YW4yKHR5LCB0eCk7XG4gKiAgIGEgLT0gUEkgLyAyLjA7XG4gKiAgIGxpbmUoeCwgeSwgY29zKGEpICogOCArIHgsIHNpbihhKSAqIDggKyB5KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqcmlnaHQgY3VydmluZyBsaW5lIG1pZC1yaWdodCBvZiBjYW52YXMgd2l0aCA3IHNob3J0IGxpbmVzIHJhZGlhdGluZyBmcm9tIGl0LlxuICovXG5wNS5wcm90b3R5cGUuY3VydmVUYW5nZW50ID0gZnVuY3Rpb24oYSwgYiwgYywgZCwgdCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjdXJ2ZVRhbmdlbnQnLCBhcmd1bWVudHMpO1xuXG4gIHZhciB0MiA9IHQgKiB0LFxuICAgIGYxID0gLTMgKiB0MiAvIDIgKyAyICogdCAtIDAuNSxcbiAgICBmMiA9IDkgKiB0MiAvIDIgLSA1ICogdCxcbiAgICBmMyA9IC05ICogdDIgLyAyICsgNCAqIHQgKyAwLjUsXG4gICAgZjQgPSAzICogdDIgLyAyIC0gdDtcbiAgcmV0dXJuIGEgKiBmMSArIGIgKiBmMiArIGMgKiBmMyArIGQgKiBmNDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi9jb3JlXCI6MjIsXCIuL2Vycm9yX2hlbHBlcnNcIjoyNX1dLDI0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBFbnZpcm9ubWVudFxuICogQHN1Ym1vZHVsZSBFbnZpcm9ubWVudFxuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqIEByZXF1aXJlcyBjb25zdGFudHNcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4vY29yZScpO1xudmFyIEMgPSBfZGVyZXFfKCcuL2NvbnN0YW50cycpO1xuXG52YXIgc3RhbmRhcmRDdXJzb3JzID0gW0MuQVJST1csIEMuQ1JPU1MsIEMuSEFORCwgQy5NT1ZFLCBDLlRFWFQsIEMuV0FJVF07XG5cbnA1LnByb3RvdHlwZS5fZnJhbWVSYXRlID0gMDtcbnA1LnByb3RvdHlwZS5fbGFzdEZyYW1lVGltZSA9IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtcbnA1LnByb3RvdHlwZS5fdGFyZ2V0RnJhbWVSYXRlID0gNjA7XG5cbnZhciBfd2luZG93UHJpbnQgPSB3aW5kb3cucHJpbnQ7XG5cbi8qKlxuICogVGhlIHByaW50KCkgZnVuY3Rpb24gd3JpdGVzIHRvIHRoZSBjb25zb2xlIGFyZWEgb2YgeW91ciBicm93c2VyLlxuICogVGhpcyBmdW5jdGlvbiBpcyBvZnRlbiBoZWxwZnVsIGZvciBsb29raW5nIGF0IHRoZSBkYXRhIGEgcHJvZ3JhbSBpc1xuICogcHJvZHVjaW5nLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgbGluZSBvZiB0ZXh0IGZvciBlYWNoIGNhbGwgdG9cbiAqIHRoZSBmdW5jdGlvbi4gSW5kaXZpZHVhbCBlbGVtZW50cyBjYW4gYmVcbiAqIHNlcGFyYXRlZCB3aXRoIHF1b3RlcyAoXCJcIikgYW5kIGpvaW5lZCB3aXRoIHRoZSBhZGRpdGlvbiBvcGVyYXRvciAoKykuXG4gKlxuICogQG1ldGhvZCBwcmludFxuICogQHBhcmFtIHtBbnl9IGNvbnRlbnRzIGFueSBjb21iaW5hdGlvbiBvZiBOdW1iZXIsIFN0cmluZywgT2JqZWN0LCBCb29sZWFuLFxuICogICAgICAgICAgICAgICAgICAgICAgIEFycmF5IHRvIHByaW50XG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZSBjbGFzcz0nbm9yZW5kZXInPlxuICogdmFyIHggPSAxMDtcbiAqIHByaW50KCdUaGUgdmFsdWUgb2YgeCBpcyAnICsgeCk7XG4gKiAvLyBwcmludHMgXCJUaGUgdmFsdWUgb2YgeCBpcyAxMFwiXG4gKiA8L2NvZGU+PC9kaXY+XG4gKiBAYWx0XG4gKiBkZWZhdWx0IGdyZXkgY2FudmFzXG4gKi9cbnA1LnByb3RvdHlwZS5wcmludCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBfd2luZG93UHJpbnQoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgZnJhbWVDb3VudCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGhhdmVcbiAqIGJlZW4gZGlzcGxheWVkIHNpbmNlIHRoZSBwcm9ncmFtIHN0YXJ0ZWQuIEluc2lkZSBzZXR1cCgpIHRoZSB2YWx1ZSBpcyAwLFxuICogYWZ0ZXIgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvZiBkcmF3IGl0IGlzIDEsIGV0Yy5cbiAqXG4gKiBAcHJvcGVydHkge0ludGVnZXJ9IGZyYW1lQ291bnRcbiAqIEByZWFkT25seVxuICogQGV4YW1wbGVcbiAqICAgPGRpdj48Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBmcmFtZVJhdGUoMzApO1xuICogICB0ZXh0U2l6ZSgyMCk7XG4gKiAgIHRleHRTaXplKDMwKTtcbiAqICAgdGV4dEFsaWduKENFTlRFUik7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICB0ZXh0KGZyYW1lQ291bnQsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gKiB9XG48L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbnVtYmVycyByYXBpZGx5IGNvdW50aW5nIHVwd2FyZCB3aXRoIGZyYW1lIGNvdW50IHNldCB0byAzMC5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5mcmFtZUNvdW50ID0gMDtcblxuLyoqXG4gKiBDb25maXJtcyBpZiB0aGUgd2luZG93IGEgcDUuanMgcHJvZ3JhbSBpcyBpbiBpcyBcImZvY3VzZWQsXCIgbWVhbmluZyB0aGF0XG4gKiB0aGUgc2tldGNoIHdpbGwgYWNjZXB0IG1vdXNlIG9yIGtleWJvYXJkIGlucHV0LiBUaGlzIHZhcmlhYmxlIGlzXG4gKiBcInRydWVcIiBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQgYW5kIFwiZmFsc2VcIiBpZiBub3QuXG4gKlxuICogQHByb3BlcnR5IHtCb29sZWFufSBmb2N1c2VkXG4gKiBAcmVhZE9ubHlcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogLy8gVG8gZGVtb25zdHJhdGUsIHB1dCB0d28gd2luZG93cyBzaWRlIGJ5IHNpZGUuXG4gKiAvLyBDbGljayBvbiB0aGUgd2luZG93IHRoYXQgdGhlIHA1IHNrZXRjaCBpc24ndCBpbiFcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgZmlsbCgwLCAyMDAsIDApO1xuICogICBlbGxpcHNlKDI1LCAyNSwgNTAsIDUwKTtcbiAqXG4gKiAgIGlmICghZm9jdXNlZCkge1xuICAgIC8vIG9yIFwiaWYgKGZvY3VzZWQgPT09IGZhbHNlKVwiXG4gKiAgICAgc3Ryb2tlKDIwMCwgMCwgMCk7XG4gKiAgICAgbGluZSgwLCAwLCAxMDAsIDEwMCk7XG4gKiAgICAgbGluZSgxMDAsIDAsIDAsIDEwMCk7XG4gKiAgIH1cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBncmVlbiA1MHg1MCBlbGxpcHNlIGF0IHRvcCBsZWZ0LiBSZWQgWCBjb3ZlcnMgY2FudmFzIHdoZW4gcGFnZSBmb2N1cyBjaGFuZ2VzXG4gKlxuICovXG5wNS5wcm90b3R5cGUuZm9jdXNlZCA9IGRvY3VtZW50Lmhhc0ZvY3VzKCk7XG5cbi8qKlxuICogU2V0cyB0aGUgY3Vyc29yIHRvIGEgcHJlZGVmaW5lZCBzeW1ib2wgb3IgYW4gaW1hZ2UsIG9yIG1ha2VzIGl0IHZpc2libGVcbiAqIGlmIGFscmVhZHkgaGlkZGVuLiBJZiB5b3UgYXJlIHRyeWluZyB0byBzZXQgYW4gaW1hZ2UgYXMgdGhlIGN1cnNvciwgdGhlXG4gKiByZWNvbW1lbmRlZCBzaXplIGlzIDE2eDE2IG9yIDMyeDMyIHBpeGVscy4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGxvYWQgYW5cbiAqIGltYWdlIGFzIHRoZSBjdXJzb3IgaWYgeW91IGFyZSBleHBvcnRpbmcgeW91ciBwcm9ncmFtIGZvciB0aGUgV2ViLCBhbmQgbm90XG4gKiBhbGwgTU9ERVMgd29yayB3aXRoIGFsbCBicm93c2Vycy4gVGhlIHZhbHVlcyBmb3IgcGFyYW1ldGVycyB4IGFuZCB5IG11c3RcbiAqIGJlIGxlc3MgdGhhbiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgaW1hZ2UuXG4gKlxuICogQG1ldGhvZCBjdXJzb3JcbiAqIEBwYXJhbSB7U3RyaW5nfENvbnN0YW50fSB0eXBlIGVpdGhlciBBUlJPVywgQ1JPU1MsIEhBTkQsIE1PVkUsIFRFWFQsIG9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQUlULCBvciBwYXRoIGZvciBpbWFnZVxuICogQHBhcmFtIHtOdW1iZXJ9ICAgICAgICAgIFt4XSAgdGhlIGhvcml6b250YWwgYWN0aXZlIHNwb3Qgb2YgdGhlIGN1cnNvclxuICogQHBhcmFtIHtOdW1iZXJ9ICAgICAgICAgIFt5XSAgdGhlIHZlcnRpY2FsIGFjdGl2ZSBzcG90IG9mIHRoZSBjdXJzb3JcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogLy8gTW92ZSB0aGUgbW91c2UgbGVmdCBhbmQgcmlnaHQgYWNyb3NzIHRoZSBpbWFnZVxuICogLy8gdG8gc2VlIHRoZSBjdXJzb3IgY2hhbmdlIGZyb20gYSBjcm9zcyB0byBhIGhhbmRcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGxpbmUod2lkdGggLyAyLCAwLCB3aWR0aCAvIDIsIGhlaWdodCk7XG4gKiAgIGlmIChtb3VzZVggPCA1MCkge1xuICogICAgIGN1cnNvcihDUk9TUyk7XG4gKiAgIH0gZWxzZSB7XG4gKiAgICAgY3Vyc29yKEhBTkQpO1xuICogICB9XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogaG9yaXpvbnRhbCBsaW5lIGRpdmlkZXMgY2FudmFzLiBjdXJzb3Igb24gbGVmdCBpcyBhIGNyb3NzLCByaWdodCBpcyBoYW5kLlxuICpcbiAqL1xucDUucHJvdG90eXBlLmN1cnNvciA9IGZ1bmN0aW9uKHR5cGUsIHgsIHkpIHtcbiAgdmFyIGN1cnNvciA9ICdhdXRvJztcbiAgdmFyIGNhbnZhcyA9IHRoaXMuX2N1ckVsZW1lbnQuZWx0O1xuICBpZiAoc3RhbmRhcmRDdXJzb3JzLmluZGV4T2YodHlwZSkgPiAtMSkge1xuICAgIC8vIFN0YW5kYXJkIGNzcyBjdXJzb3JcbiAgICBjdXJzb3IgPSB0eXBlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHZhciBjb29yZHMgPSAnJztcbiAgICBpZiAoeCAmJiB5ICYmICh0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHkgPT09ICdudW1iZXInKSkge1xuICAgICAgLy8gTm90ZSB0aGF0IHggYW5kIHkgdmFsdWVzIG11c3QgYmUgdW5pdC1sZXNzIHBvc2l0aXZlIGludGVnZXJzIDwgMzJcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9jdXJzb3JcbiAgICAgIGNvb3JkcyA9IHggKyAnICcgKyB5O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlLnN1YnN0cmluZygwLCA3KSA9PT0gJ2h0dHA6Ly8nIHx8XG4gICAgICB0eXBlLnN1YnN0cmluZygwLCA4KSA9PT0gJ2h0dHBzOi8vJ1xuICAgICkge1xuICAgICAgLy8gSW1hZ2UgKGFic29sdXRlIHVybClcbiAgICAgIGN1cnNvciA9ICd1cmwoJyArIHR5cGUgKyAnKSAnICsgY29vcmRzICsgJywgYXV0byc7XG4gICAgfSBlbHNlIGlmICgvXFwuKGN1cnxqcGd8anBlZ3xnaWZ8cG5nfENVUnxKUEd8SlBFR3xHSUZ8UE5HKSQvLnRlc3QodHlwZSkpIHtcbiAgICAgIC8vIEltYWdlIGZpbGUgKHJlbGF0aXZlIHBhdGgpIC0gU2VwYXJhdGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zXG4gICAgICBjdXJzb3IgPSAndXJsKCcgKyB0eXBlICsgJykgJyArIGNvb3JkcyArICcsIGF1dG8nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbnkgdmFsaWQgc3RyaW5nIGZvciB0aGUgY3NzIGN1cnNvciBwcm9wZXJ0eVxuICAgICAgY3Vyc29yID0gdHlwZTtcbiAgICB9XG4gIH1cbiAgY2FudmFzLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbn07XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGRpc3BsYXllZCBldmVyeSBzZWNvbmQuIEZvciBleGFtcGxlLFxuICogdGhlIGZ1bmN0aW9uIGNhbGwgZnJhbWVSYXRlKDMwKSB3aWxsIGF0dGVtcHQgdG8gcmVmcmVzaCAzMCB0aW1lcyBhIHNlY29uZC5cbiAqIElmIHRoZSBwcm9jZXNzb3IgaXMgbm90IGZhc3QgZW5vdWdoIHRvIG1haW50YWluIHRoZSBzcGVjaWZpZWQgcmF0ZSwgdGhlXG4gKiBmcmFtZSByYXRlIHdpbGwgbm90IGJlIGFjaGlldmVkLiBTZXR0aW5nIHRoZSBmcmFtZSByYXRlIHdpdGhpbiBzZXR1cCgpIGlzXG4gKiByZWNvbW1lbmRlZC4gVGhlIGRlZmF1bHQgcmF0ZSBpcyA2MCBmcmFtZXMgcGVyIHNlY29uZC4gVGhpcyBpcyB0aGUgc2FtZSBhc1xuICogc2V0RnJhbWVSYXRlKHZhbCkuXG4gKiA8YnI+PGJyPlxuICogQ2FsbGluZyBmcmFtZVJhdGUoKSB3aXRoIG5vIGFyZ3VtZW50cyByZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcmF0ZS4gVGhlXG4gKiBkcmF3IGZ1bmN0aW9uIG11c3QgcnVuIGF0IGxlYXN0IG9uY2UgYmVmb3JlIGl0IHdpbGwgcmV0dXJuIGEgdmFsdWUuIFRoaXNcbiAqIGlzIHRoZSBzYW1lIGFzIGdldEZyYW1lUmF0ZSgpLlxuICogPGJyPjxicj5cbiAqIENhbGxpbmcgZnJhbWVSYXRlKCkgd2l0aCBhcmd1bWVudHMgdGhhdCBhcmUgbm90IG9mIHRoZSB0eXBlIG51bWJlcnNcbiAqIG9yIGFyZSBub24gcG9zaXRpdmUgYWxzbyByZXR1cm5zIGN1cnJlbnQgZnJhbWVyYXRlLlxuICpcbiAqIEBtZXRob2QgZnJhbWVSYXRlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGZwcyBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGRpc3BsYXllZCBldmVyeSBzZWNvbmRcbiAqIEBjaGFpbmFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgcmVjdFggPSAwO1xuICogdmFyIGZyID0gMzA7IC8vc3RhcnRpbmcgRlBTXG4gKiB2YXIgY2xyO1xuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIGZyYW1lUmF0ZShmcik7IC8vIEF0dGVtcHQgdG8gcmVmcmVzaCBhdCBzdGFydGluZyBGUFNcbiAqICAgY2xyID0gY29sb3IoMjU1LCAwLCAwKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHJlY3RYID0gcmVjdFggKz0gMTsgLy8gTW92ZSBSZWN0YW5nbGVcbiAqXG4gKiAgIGlmIChyZWN0WCA+PSB3aWR0aCkge1xuICAgIC8vIElmIHlvdSBnbyBvZmYgc2NyZWVuLlxuICogICAgIGlmIChmciA9PT0gMzApIHtcbiAqICAgICAgIGNsciA9IGNvbG9yKDAsIDAsIDI1NSk7XG4gKiAgICAgICBmciA9IDEwO1xuICogICAgICAgZnJhbWVSYXRlKGZyKTsgLy8gbWFrZSBmcmFtZVJhdGUgMTAgRlBTXG4gKiAgICAgfSBlbHNlIHtcbiAqICAgICAgIGNsciA9IGNvbG9yKDI1NSwgMCwgMCk7XG4gKiAgICAgICBmciA9IDMwO1xuICogICAgICAgZnJhbWVSYXRlKGZyKTsgLy8gbWFrZSBmcmFtZVJhdGUgMzAgRlBTXG4gKiAgICAgfVxuICogICAgIHJlY3RYID0gMDtcbiAqICAgfVxuICogICBmaWxsKGNscik7XG4gKiAgIHJlY3QocmVjdFgsIDQwLCAyMCwgMjApO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGJsdWUgcmVjdCBtb3ZlcyBsZWZ0IHRvIHJpZ2h0LCBmb2xsb3dlZCBieSByZWQgcmVjdCBtb3ZpbmcgZmFzdGVyLiBMb29wcy5cbiAqXG4gKi9cbi8qKlxuICogQG1ldGhvZCBmcmFtZVJhdGVcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgY3VycmVudCBmcmFtZVJhdGVcbiAqL1xucDUucHJvdG90eXBlLmZyYW1lUmF0ZSA9IGZ1bmN0aW9uKGZwcykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdmcmFtZVJhdGUnLCBhcmd1bWVudHMpO1xuICBpZiAodHlwZW9mIGZwcyAhPT0gJ251bWJlcicgfHwgZnBzIDwgMCkge1xuICAgIHJldHVybiB0aGlzLl9mcmFtZVJhdGU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ190YXJnZXRGcmFtZVJhdGUnLCBmcHMpO1xuICAgIHRoaXMuX3J1bkZyYW1lcygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcmF0ZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7TnVtYmVyfSBjdXJyZW50IGZyYW1lUmF0ZVxuICovXG5wNS5wcm90b3R5cGUuZ2V0RnJhbWVSYXRlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmZyYW1lUmF0ZSgpO1xufTtcblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgZGlzcGxheWVkIGV2ZXJ5IHNlY29uZC4gRm9yIGV4YW1wbGUsXG4gKiB0aGUgZnVuY3Rpb24gY2FsbCBmcmFtZVJhdGUoMzApIHdpbGwgYXR0ZW1wdCB0byByZWZyZXNoIDMwIHRpbWVzIGEgc2Vjb25kLlxuICogSWYgdGhlIHByb2Nlc3NvciBpcyBub3QgZmFzdCBlbm91Z2ggdG8gbWFpbnRhaW4gdGhlIHNwZWNpZmllZCByYXRlLCB0aGVcbiAqIGZyYW1lIHJhdGUgd2lsbCBub3QgYmUgYWNoaWV2ZWQuIFNldHRpbmcgdGhlIGZyYW1lIHJhdGUgd2l0aGluIHNldHVwKCkgaXNcbiAqIHJlY29tbWVuZGVkLiBUaGUgZGVmYXVsdCByYXRlIGlzIDYwIGZyYW1lcyBwZXIgc2Vjb25kLlxuICpcbiAqIENhbGxpbmcgZnJhbWVSYXRlKCkgd2l0aCBubyBhcmd1bWVudHMgcmV0dXJucyB0aGUgY3VycmVudCBmcmFtZXJhdGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbZnBzXSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGRpc3BsYXllZCBldmVyeSBzZWNvbmRcbiAqL1xucDUucHJvdG90eXBlLnNldEZyYW1lUmF0ZSA9IGZ1bmN0aW9uKGZwcykge1xuICByZXR1cm4gdGhpcy5mcmFtZVJhdGUoZnBzKTtcbn07XG5cbi8qKlxuICogSGlkZXMgdGhlIGN1cnNvciBmcm9tIHZpZXcuXG4gKlxuICogQG1ldGhvZCBub0N1cnNvclxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgbm9DdXJzb3IoKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDEwLCAxMCk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICpcbiAqIEBhbHRcbiAqIGN1cnNvciBiZWNvbWVzIDEweCAxMCB3aGl0ZSBlbGxpcHNlIHRoZSBtb3ZlcyB3aXRoIG1vdXNlIHggYW5kIHkuXG4gKlxuICovXG5wNS5wcm90b3R5cGUubm9DdXJzb3IgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY3VyRWxlbWVudC5lbHQuc3R5bGUuY3Vyc29yID0gJ25vbmUnO1xufTtcblxuLyoqXG4gKiBTeXN0ZW0gdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIHdpZHRoIG9mIHRoZSBlbnRpcmUgc2NyZWVuIGRpc3BsYXkuIFRoaXNcbiAqIGlzIHVzZWQgdG8gcnVuIGEgZnVsbC1zY3JlZW4gcHJvZ3JhbSBvbiBhbnkgZGlzcGxheSBzaXplLlxuICpcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBkaXNwbGF5V2lkdGhcbiAqIEByZWFkT25seVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPjxjb2RlPlxuICogY3JlYXRlQ2FudmFzKGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogY3Vyc29yIGJlY29tZXMgMTB4IDEwIHdoaXRlIGVsbGlwc2UgdGhlIG1vdmVzIHdpdGggbW91c2UgeCBhbmQgeS5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5kaXNwbGF5V2lkdGggPSBzY3JlZW4ud2lkdGg7XG5cbi8qKlxuICogU3lzdGVtIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSBoZWlnaHQgb2YgdGhlIGVudGlyZSBzY3JlZW4gZGlzcGxheS4gVGhpc1xuICogaXMgdXNlZCB0byBydW4gYSBmdWxsLXNjcmVlbiBwcm9ncmFtIG9uIGFueSBkaXNwbGF5IHNpemUuXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGRpc3BsYXlIZWlnaHRcbiAqIEByZWFkT25seVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPjxjb2RlPlxuICogY3JlYXRlQ2FudmFzKGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gZGlzcGxheS5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5kaXNwbGF5SGVpZ2h0ID0gc2NyZWVuLmhlaWdodDtcblxuLyoqXG4gKiBTeXN0ZW0gdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIHdpZHRoIG9mIHRoZSBpbm5lciB3aW5kb3csIGl0IG1hcHMgdG9cbiAqIHdpbmRvdy5pbm5lcldpZHRoLlxuICpcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB3aW5kb3dXaWR0aFxuICogQHJlYWRPbmx5XG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+PGNvZGU+XG4gKiBjcmVhdGVDYW52YXMod2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCk7XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gZGlzcGxheS5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS53aW5kb3dXaWR0aCA9IGdldFdpbmRvd1dpZHRoKCk7XG4vKipcbiAqIFN5c3RlbSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgaGVpZ2h0IG9mIHRoZSBpbm5lciB3aW5kb3csIGl0IG1hcHMgdG9cbiAqIHdpbmRvdy5pbm5lckhlaWdodC5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gd2luZG93SGVpZ2h0XG4gKiBAcmVhZE9ubHlcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj48Y29kZT5cbiAqIGNyZWF0ZUNhbnZhcyh3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0KTtcbiAqIDwvY29kZT48L2Rpdj5cbiAqQGFsdFxuICogbm8gZGlzcGxheS5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS53aW5kb3dIZWlnaHQgPSBnZXRXaW5kb3dIZWlnaHQoKTtcblxuLyoqXG4gKiBUaGUgd2luZG93UmVzaXplZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGV2ZXJ5IHRpbWUgdGhlIGJyb3dzZXIgd2luZG93XG4gKiBpcyByZXNpemVkLiBUaGlzIGlzIGEgZ29vZCBwbGFjZSB0byByZXNpemUgdGhlIGNhbnZhcyBvciBkbyBhbnkgb3RoZXJcbiAqIGFkanVzdG1lbnRzIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcgd2luZG93IHNpemUuXG4gKlxuICogQG1ldGhvZCB3aW5kb3dSZXNpemVkXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMCwgMTAwLCAyMDApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHdpbmRvd1Jlc2l6ZWQoKSB7XG4gKiAgIHJlc2l6ZUNhbnZhcyh3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0KTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqIEBhbHRcbiAqIG5vIGRpc3BsYXkuXG4gKi9cbnA1LnByb3RvdHlwZS5fb25yZXNpemUgPSBmdW5jdGlvbihlKSB7XG4gIHRoaXMuX3NldFByb3BlcnR5KCd3aW5kb3dXaWR0aCcsIGdldFdpbmRvd1dpZHRoKCkpO1xuICB0aGlzLl9zZXRQcm9wZXJ0eSgnd2luZG93SGVpZ2h0JywgZ2V0V2luZG93SGVpZ2h0KCkpO1xuICB2YXIgY29udGV4dCA9IHRoaXMuX2lzR2xvYmFsID8gd2luZG93IDogdGhpcztcbiAgdmFyIGV4ZWN1dGVEZWZhdWx0O1xuICBpZiAodHlwZW9mIGNvbnRleHQud2luZG93UmVzaXplZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV4ZWN1dGVEZWZhdWx0ID0gY29udGV4dC53aW5kb3dSZXNpemVkKGUpO1xuICAgIGlmIChleGVjdXRlRGVmYXVsdCAhPT0gdW5kZWZpbmVkICYmICFleGVjdXRlRGVmYXVsdCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0V2luZG93V2lkdGgoKSB7XG4gIHJldHVybiAoXG4gICAgd2luZG93LmlubmVyV2lkdGggfHxcbiAgICAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkgfHxcbiAgICAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoKSB8fFxuICAgIDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2luZG93SGVpZ2h0KCkge1xuICByZXR1cm4gKFxuICAgIHdpbmRvdy5pbm5lckhlaWdodCB8fFxuICAgIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkgfHxcbiAgICAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkgfHxcbiAgICAwXG4gICk7XG59XG5cbi8qKlxuICogU3lzdGVtIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSB3aWR0aCBvZiB0aGUgZHJhd2luZyBjYW52YXMuIFRoaXMgdmFsdWVcbiAqIGlzIHNldCBieSB0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIHRoZSBjcmVhdGVDYW52YXMoKSBmdW5jdGlvbi5cbiAqIEZvciBleGFtcGxlLCB0aGUgZnVuY3Rpb24gY2FsbCBjcmVhdGVDYW52YXMoMzIwLCAyNDApIHNldHMgdGhlIHdpZHRoXG4gKiB2YXJpYWJsZSB0byB0aGUgdmFsdWUgMzIwLiBUaGUgdmFsdWUgb2Ygd2lkdGggZGVmYXVsdHMgdG8gMTAwIGlmXG4gKiBjcmVhdGVDYW52YXMoKSBpcyBub3QgdXNlZCBpbiBhIHByb2dyYW0uXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHdpZHRoXG4gKiBAcmVhZE9ubHlcbiAqL1xucDUucHJvdG90eXBlLndpZHRoID0gMDtcblxuLyoqXG4gKiBTeXN0ZW0gdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIGhlaWdodCBvZiB0aGUgZHJhd2luZyBjYW52YXMuIFRoaXMgdmFsdWVcbiAqIGlzIHNldCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiB0aGUgY3JlYXRlQ2FudmFzKCkgZnVuY3Rpb24uIEZvclxuICogZXhhbXBsZSwgdGhlIGZ1bmN0aW9uIGNhbGwgY3JlYXRlQ2FudmFzKDMyMCwgMjQwKSBzZXRzIHRoZSBoZWlnaHRcbiAqIHZhcmlhYmxlIHRvIHRoZSB2YWx1ZSAyNDAuIFRoZSB2YWx1ZSBvZiBoZWlnaHQgZGVmYXVsdHMgdG8gMTAwIGlmXG4gKiBjcmVhdGVDYW52YXMoKSBpcyBub3QgdXNlZCBpbiBhIHByb2dyYW0uXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGhlaWdodFxuICogQHJlYWRPbmx5XG4gKi9cbnA1LnByb3RvdHlwZS5oZWlnaHQgPSAwO1xuXG4vKipcbiAqIElmIGFyZ3VtZW50IGlzIGdpdmVuLCBzZXRzIHRoZSBza2V0Y2ggdG8gZnVsbHNjcmVlbiBvciBub3QgYmFzZWQgb24gdGhlXG4gKiB2YWx1ZSBvZiB0aGUgYXJndW1lbnQuIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm5zIHRoZSBjdXJyZW50XG4gKiBmdWxsc2NyZWVuIHN0YXRlLiBOb3RlIHRoYXQgZHVlIHRvIGJyb3dzZXIgcmVzdHJpY3Rpb25zIHRoaXMgY2FuIG9ubHlcbiAqIGJlIGNhbGxlZCBvbiB1c2VyIGlucHV0LCBmb3IgZXhhbXBsZSwgb24gbW91c2UgcHJlc3MgbGlrZSB0aGUgZXhhbXBsZVxuICogYmVsb3cuXG4gKlxuICogQG1ldGhvZCBmdWxsc2NyZWVuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbdmFsXSB3aGV0aGVyIHRoZSBza2V0Y2ggc2hvdWxkIGJlIGluIGZ1bGxzY3JlZW4gbW9kZVxuICogb3Igbm90XG4gKiBAcmV0dXJuIHtCb29sZWFufSBjdXJyZW50IGZ1bGxzY3JlZW4gc3RhdGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBDbGlja2luZyBpbiB0aGUgYm94IHRvZ2dsZXMgZnVsbHNjcmVlbiBvbiBhbmQgb2ZmLlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcbiAqICAgaWYgKG1vdXNlWCA+IDAgJiYgbW91c2VYIDwgMTAwICYmIG1vdXNlWSA+IDAgJiYgbW91c2VZIDwgMTAwKSB7XG4gKiAgICAgdmFyIGZzID0gZnVsbHNjcmVlbigpO1xuICogICAgIGZ1bGxzY3JlZW4oIWZzKTtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gZGlzcGxheS5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5mdWxsc2NyZWVuID0gZnVuY3Rpb24odmFsKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2Z1bGxzY3JlZW4nLCBhcmd1bWVudHMpO1xuICAvLyBubyBhcmd1bWVudHMsIHJldHVybiBmdWxsc2NyZWVuIG9yIG5vdFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICBkb2N1bWVudC5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fFxuICAgICAgZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gb3RoZXJ3aXNlIHNldCB0byBmdWxsc2NyZWVuIG9yIG5vdFxuICAgIGlmICh2YWwpIHtcbiAgICAgIGxhdW5jaEZ1bGxzY3JlZW4oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogU2V0cyB0aGUgcGl4ZWwgc2NhbGluZyBmb3IgaGlnaCBwaXhlbCBkZW5zaXR5IGRpc3BsYXlzLiBCeSBkZWZhdWx0XG4gKiBwaXhlbCBkZW5zaXR5IGlzIHNldCB0byBtYXRjaCBkaXNwbGF5IGRlbnNpdHksIGNhbGwgcGl4ZWxEZW5zaXR5KDEpXG4gKiB0byB0dXJuIHRoaXMgb2ZmLiBDYWxsaW5nIHBpeGVsRGVuc2l0eSgpIHdpdGggbm8gYXJndW1lbnRzIHJldHVybnNcbiAqIHRoZSBjdXJyZW50IHBpeGVsIGRlbnNpdHkgb2YgdGhlIHNrZXRjaC5cbiAqXG4gKlxuICogQG1ldGhvZCBwaXhlbERlbnNpdHlcbiAqIEBwYXJhbSAge051bWJlcn0gW3ZhbF0gd2hldGhlciBvciBob3cgbXVjaCB0aGUgc2tldGNoIHNob3VsZCBzY2FsZVxuICogQHJldHVybnMge051bWJlcn0gY3VycmVudCBwaXhlbCBkZW5zaXR5IG9mIHRoZSBza2V0Y2hcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgcGl4ZWxEZW5zaXR5KDEpO1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIGVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCA1MCwgNTApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgcGl4ZWxEZW5zaXR5KDMuMCk7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIDUwLCA1MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBmdXp6eSA1MHg1MCB3aGl0ZSBlbGxpcHNlIHdpdGggYmxhY2sgb3V0bGluZSBpbiBjZW50ZXIgb2YgY2FudmFzLlxuICogc2hhcnAgNTB4NTAgd2hpdGUgZWxsaXBzZSB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cbiAqL1xucDUucHJvdG90eXBlLnBpeGVsRGVuc2l0eSA9IGZ1bmN0aW9uKHZhbCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdwaXhlbERlbnNpdHknLCBhcmd1bWVudHMpO1xuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB0aGlzLl9waXhlbERlbnNpdHkgPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuX3BpeGVsRGVuc2l0eTtcbiAgfVxuICB0aGlzLnJlc2l6ZUNhbnZhcyh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBpeGVsIGRlbnNpdHkgb2YgdGhlIGN1cnJlbnQgZGlzcGxheSB0aGUgc2tldGNoIGlzIHJ1bm5pbmcgb24uXG4gKlxuICogQG1ldGhvZCBkaXNwbGF5RGVuc2l0eVxuICogQHJldHVybnMge051bWJlcn0gY3VycmVudCBwaXhlbCBkZW5zaXR5IG9mIHRoZSBkaXNwbGF5XG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBkZW5zaXR5ID0gZGlzcGxheURlbnNpdHkoKTtcbiAqICAgcGl4ZWxEZW5zaXR5KGRlbnNpdHkpO1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIGVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCA1MCwgNTApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogNTB4NTAgd2hpdGUgZWxsaXBzZSB3aXRoIGJsYWNrIG91dGxpbmUgaW4gY2VudGVyIG9mIGNhbnZhcy5cbiAqL1xucDUucHJvdG90eXBlLmRpc3BsYXlEZW5zaXR5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbn07XG5cbmZ1bmN0aW9uIGxhdW5jaEZ1bGxzY3JlZW4oZWxlbWVudCkge1xuICB2YXIgZW5hYmxlZCA9XG4gICAgZG9jdW1lbnQuZnVsbHNjcmVlbkVuYWJsZWQgfHxcbiAgICBkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRW5hYmxlZCB8fFxuICAgIGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbmFibGVkIHx8XG4gICAgZG9jdW1lbnQubXNGdWxsc2NyZWVuRW5hYmxlZDtcbiAgaWYgKCFlbmFibGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGdWxsc2NyZWVuIG5vdCBlbmFibGVkIGluIHRoaXMgYnJvd3Nlci4nKTtcbiAgfVxuICBpZiAoZWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgIGVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgfSBlbHNlIGlmIChlbGVtZW50Lm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgZWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpO1xuICB9IGVsc2UgaWYgKGVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICBlbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gIH0gZWxzZSBpZiAoZWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgZWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXhpdEZ1bGxzY3JlZW4oKSB7XG4gIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbikge1xuICAgIGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtcbiAgfSBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbikge1xuICAgIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbikge1xuICAgIGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgVVJMLlxuICogQG1ldGhvZCBnZXRVUkxcbiAqIEByZXR1cm4ge1N0cmluZ30gdXJsXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIHVybDtcbiAqIHZhciB4ID0gMTAwO1xuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBmaWxsKDApO1xuICogICBub1N0cm9rZSgpO1xuICogICB1cmwgPSBnZXRVUkwoKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHRleHQodXJsLCB4LCBoZWlnaHQgLyAyKTtcbiAqICAgeC0tO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogY3VycmVudCB1cmwgKGh0dHA6Ly9wNWpzLm9yZy9yZWZlcmVuY2UvIy9wNS9nZXRVUkwpIG1vdmVzIHJpZ2h0IHRvIGxlZnQuXG4gKlxuICovXG5wNS5wcm90b3R5cGUuZ2V0VVJMID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBsb2NhdGlvbi5ocmVmO1xufTtcbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBVUkwgcGF0aCBhcyBhbiBhcnJheS5cbiAqIEBtZXRob2QgZ2V0VVJMUGF0aFxuICogQHJldHVybiB7U3RyaW5nW119IHBhdGggY29tcG9uZW50c1xuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgdXJsUGF0aCA9IGdldFVSTFBhdGgoKTtcbiAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gKiAgICAgdGV4dCh1cmxQYXRoW2ldLCAxMCwgaSAqIDIwICsgMjApO1xuICogICB9XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICpubyBkaXNwbGF5XG4gKlxuICovXG5wNS5wcm90b3R5cGUuZ2V0VVJMUGF0aCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24odikge1xuICAgIHJldHVybiB2ICE9PSAnJztcbiAgfSk7XG59O1xuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IFVSTCBwYXJhbXMgYXMgYW4gT2JqZWN0LlxuICogQG1ldGhvZCBnZXRVUkxQYXJhbXNcbiAqIEByZXR1cm4ge09iamVjdH0gVVJMIHBhcmFtc1xuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyIG5vdGVzdCc+XG4gKiA8Y29kZT5cbiAqIC8vIEV4YW1wbGU6IGh0dHA6Ly9wNWpzLm9yZz95ZWFyPTIwMTQmbW9udGg9TWF5JmRheT0xNVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgcGFyYW1zID0gZ2V0VVJMUGFyYW1zKCk7XG4gKiAgIHRleHQocGFyYW1zLmRheSwgMTAsIDIwKTtcbiAqICAgdGV4dChwYXJhbXMubW9udGgsIDEwLCA0MCk7XG4gKiAgIHRleHQocGFyYW1zLnllYXIsIDEwLCA2MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIEBhbHRcbiAqIG5vIGRpc3BsYXkuXG4gKlxuICovXG5wNS5wcm90b3R5cGUuZ2V0VVJMUGFyYW1zID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZSA9IC9bPyZdKFteJj1dKykoPzpbJj1dKShbXiY9XSspL2dpbTtcbiAgdmFyIG07XG4gIHZhciB2ID0ge307XG4gIHdoaWxlICgobSA9IHJlLmV4ZWMobG9jYXRpb24uc2VhcmNoKSkgIT0gbnVsbCkge1xuICAgIGlmIChtLmluZGV4ID09PSByZS5sYXN0SW5kZXgpIHtcbiAgICAgIHJlLmxhc3RJbmRleCsrO1xuICAgIH1cbiAgICB2W21bMV1dID0gbVsyXTtcbiAgfVxuICByZXR1cm4gdjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi9jb25zdGFudHNcIjoyMSxcIi4vY29yZVwiOjIyfV0sMjU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi9jb3JlJyk7XG52YXIgY29uc3RhbnRzID0gX2RlcmVxXygnLi9jb25zdGFudHMnKTtcblxuaWYgKHR5cGVvZiBJU19NSU5JRklFRCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycyA9IHA1Ll9mcmllbmRseUZpbGVMb2FkRXJyb3IgPSBmdW5jdGlvbigpIHt9O1xufSBlbHNlIHtcbiAgdmFyIGRvRnJpZW5kbHlXZWxjb21lID0gZmFsc2U7IC8vIFRFTVAgdW50aWwgd2UgZ2V0IGl0IGFsbCB3b3JraW5nIExNXG4gIC8vIGZvciBwYXJhbWV0ZXIgdmFsaWRhdGlvblxuICB2YXIgZGF0YURvYyA9IF9kZXJlcV8oJy4uLy4uL2RvY3MvcmVmZXJlbmNlL2RhdGEuanNvbicpO1xuICB2YXIgYXJyRG9jID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhRG9jKSk7XG5cbiAgLy8gLS0gQm9ycm93ZWQgZnJvbSBqUXVlcnkgMS4xMS4zIC0tXG4gIHZhciBjbGFzczJ0eXBlID0ge307XG4gIHZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG4gIHZhciBuYW1lcyA9IFtcbiAgICAnQm9vbGVhbicsXG4gICAgJ051bWJlcicsXG4gICAgJ1N0cmluZycsXG4gICAgJ0Z1bmN0aW9uJyxcbiAgICAnQXJyYXknLFxuICAgICdEYXRlJyxcbiAgICAnUmVnRXhwJyxcbiAgICAnT2JqZWN0JyxcbiAgICAnRXJyb3InXG4gIF07XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgbmFtZXMubGVuZ3RoOyBuKyspIHtcbiAgICBjbGFzczJ0eXBlWydbb2JqZWN0ICcgKyBuYW1lc1tuXSArICddJ10gPSBuYW1lc1tuXS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHZhciBnZXRUeXBlID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gb2JqICsgJyc7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nXG4gICAgICA/IGNsYXNzMnR5cGVbdG9TdHJpbmcuY2FsbChvYmopXSB8fCAnb2JqZWN0J1xuICAgICAgOiB0eXBlb2Ygb2JqO1xuICB9O1xuXG4gIC8vIC0tIEVuZCBib3Jyb3cgLS1cblxuICB2YXIgZnJpZW5kbHlXZWxjb21lID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gcDUuanMgYnJhbmQgLSBtYWdlbnRhOiAjRUQyMjVEXG4gICAgLy92YXIgYXN0cml4QmdDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgLy92YXIgYXN0cml4VHh0Q29sb3IgPSAnI0VEMjI1RCc7XG4gICAgLy92YXIgd2VsY29tZUJnQ29sb3IgPSAnI0VEMjI1RCc7XG4gICAgLy92YXIgd2VsY29tZVRleHRDb2xvciA9ICd3aGl0ZSc7XG4gICAgY29uc29sZS5sb2coXG4gICAgICAnICAgIF8gXFxuJyArXG4gICAgICAgICcgL1xcXFx8IHwvXFxcXCBcXG4nICtcbiAgICAgICAgXCIgXFxcXCBgICcgLyAgXFxuXCIgK1xuICAgICAgICAnIC8gLCAuIFxcXFwgIFxcbicgK1xuICAgICAgICAnIFxcXFwvfF98XFxcXC8gJyArXG4gICAgICAgICdcXG5cXG4+IHA1LmpzIHNheXM6IFdlbGNvbWUhICcgK1xuICAgICAgICAnVGhpcyBpcyB5b3VyIGZyaWVuZGx5IGRlYnVnZ2VyLiAnICtcbiAgICAgICAgJ1RvIHR1cm4gbWUgb2ZmIHN3aXRjaCB0byB1c2luZyDigJxwNS5taW4uanPigJ0uJ1xuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaW50cyBvdXQgYSBmYW5jeSwgY29sb3JmdWwgbWVzc2FnZSB0byB0aGUgY29uc29sZSBsb2dcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgIG1lc3NhZ2UgdGhlIHdvcmRzIHRvIGJlIHNhaWRcbiAgICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgIGZ1bmMgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGxpbmtcbiAgICogQHBhcmFtICB7TnVtYmVyfFN0cmluZ30gY29sb3IgICBDU1MgY29sb3Igc3RyaW5nIG9yIGVycm9yIHR5cGVcbiAgICpcbiAgICogQHJldHVybiBjb25zb2xlIGxvZ3NcbiAgICovXG4gIC8vIFdyb25nIG51bWJlciBvZiBwYXJhbXMsIHVuZGVmaW5lZCBwYXJhbSwgd3JvbmcgdHlwZVxuICB2YXIgRklMRV9MT0FEID0gMztcbiAgdmFyIEVSUl9QQVJBTVMgPSAzO1xuICAvLyBwNS5qcyBibHVlLCBwNS5qcyBvcmFuZ2UsIGF1dG8gZGFyayBncmVlbjsgZmFsbGJhY2sgcDUuanMgZGFya2VuZWQgbWFnZW50YVxuICAvLyBTZWUgdGVzdENvbG9ycyBiZWxvdyBmb3IgYWxsIHRoZSBjb2xvciBjb2RlcyBhbmQgbmFtZXNcbiAgdmFyIHR5cGVDb2xvcnMgPSBbJyMyRDdCQjYnLCAnI0VFOTkwMCcsICcjNERCMjAwJywgJyNDODNDMDAnXTtcbiAgdmFyIHJlcG9ydCA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGZ1bmMsIGNvbG9yKSB7XG4gICAgaWYgKGRvRnJpZW5kbHlXZWxjb21lKSB7XG4gICAgICBmcmllbmRseVdlbGNvbWUoKTtcbiAgICAgIGRvRnJpZW5kbHlXZWxjb21lID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICgndW5kZWZpbmVkJyA9PT0gZ2V0VHlwZShjb2xvcikpIHtcbiAgICAgIGNvbG9yID0gJyNCNDAwMzMnOyAvLyBkYXJrIG1hZ2VudGFcbiAgICB9IGVsc2UgaWYgKGdldFR5cGUoY29sb3IpID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVHlwZSB0byBjb2xvclxuICAgICAgY29sb3IgPSB0eXBlQ29sb3JzW2NvbG9yXTtcbiAgICB9XG4gICAgaWYgKGZ1bmMuc3Vic3RyaW5nKDAsIDQpID09PSAnbG9hZCcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnPiBwNS5qcyBzYXlzOiAnICtcbiAgICAgICAgICBtZXNzYWdlICtcbiAgICAgICAgICAnW2h0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzL3dpa2kvTG9jYWwtc2VydmVyXSdcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnPiBwNS5qcyBzYXlzOiAnICtcbiAgICAgICAgICBtZXNzYWdlICtcbiAgICAgICAgICAnIFtodHRwOi8vcDVqcy5vcmcvcmVmZXJlbmNlLyNwNS8nICtcbiAgICAgICAgICBmdW5jICtcbiAgICAgICAgICAnXSdcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBlcnJvckNhc2VzID0ge1xuICAgICcwJzoge1xuICAgICAgZmlsZVR5cGU6ICdpbWFnZScsXG4gICAgICBtZXRob2Q6ICdsb2FkSW1hZ2UnLFxuICAgICAgbWVzc2FnZTogJyBob3N0aW5nIHRoZSBpbWFnZSBvbmxpbmUsJ1xuICAgIH0sXG4gICAgJzEnOiB7XG4gICAgICBmaWxlVHlwZTogJ1hNTCBmaWxlJyxcbiAgICAgIG1ldGhvZDogJ2xvYWRYTUwnXG4gICAgfSxcbiAgICAnMic6IHtcbiAgICAgIGZpbGVUeXBlOiAndGFibGUgZmlsZScsXG4gICAgICBtZXRob2Q6ICdsb2FkVGFibGUnXG4gICAgfSxcbiAgICAnMyc6IHtcbiAgICAgIGZpbGVUeXBlOiAndGV4dCBmaWxlJyxcbiAgICAgIG1ldGhvZDogJ2xvYWRTdHJpbmdzJ1xuICAgIH0sXG4gICAgJzQnOiB7XG4gICAgICBmaWxlVHlwZTogJ2ZvbnQnLFxuICAgICAgbWV0aG9kOiAnbG9hZEZvbnQnLFxuICAgICAgbWVzc2FnZTogJyBob3N0aW5nIHRoZSBmb250IG9ubGluZSwnXG4gICAgfVxuICB9O1xuICBwNS5fZnJpZW5kbHlGaWxlTG9hZEVycm9yID0gZnVuY3Rpb24oZXJyb3JUeXBlLCBmaWxlUGF0aCkge1xuICAgIHZhciBlcnJvckluZm8gPSBlcnJvckNhc2VzW2Vycm9yVHlwZV07XG4gICAgdmFyIG1lc3NhZ2UgPVxuICAgICAgJ0l0IGxvb2tzIGxpa2UgdGhlcmUgd2FzIGEgcHJvYmxlbScgK1xuICAgICAgJyBsb2FkaW5nIHlvdXIgJyArXG4gICAgICBlcnJvckluZm8uZmlsZVR5cGUgK1xuICAgICAgJy4nICtcbiAgICAgICcgVHJ5IGNoZWNraW5nIGlmIHRoZSBmaWxlIHBhdGggWycgK1xuICAgICAgZmlsZVBhdGggK1xuICAgICAgJ10gaXMgY29ycmVjdCwnICtcbiAgICAgIChlcnJvckluZm8ubWVzc2FnZSB8fCAnJykgK1xuICAgICAgJyBvciBydW5uaW5nIGEgbG9jYWwgc2VydmVyLic7XG4gICAgcmVwb3J0KG1lc3NhZ2UsIGVycm9ySW5mby5tZXRob2QsIEZJTEVfTE9BRCk7XG4gIH07XG5cbiAgdmFyIGRvY0NhY2hlID0ge307XG4gIHZhciBidWlsdGluVHlwZXMgPSBbXG4gICAgJ251bWJlcicsXG4gICAgJ3N0cmluZycsXG4gICAgJ2Jvb2xlYW4nLFxuICAgICdjb25zdGFudCcsXG4gICAgJ2Z1bmN0aW9uJyxcbiAgICAnYW55JyxcbiAgICAnaW50ZWdlcidcbiAgXTtcblxuICAvLyB2YWxpZGF0ZVBhcmFtZXRlcnMoKSBoZWxwZXIgZnVuY3Rpb25zOlxuICAvLyBsb29rdXBQYXJhbURvYygpIGZvciBxdWVyeWluZyBkYXRhLmpzb25cbiAgdmFyIGxvb2t1cFBhcmFtRG9jID0gZnVuY3Rpb24oZnVuYykge1xuICAgIHZhciBxdWVyeVJlc3VsdCA9IGFyckRvYy5jbGFzc2l0ZW1zLmZpbHRlcihmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4geC5uYW1lID09PSBmdW5jO1xuICAgIH0pO1xuICAgIC8vIGRpZmZlcmVudCBKU09OIHN0cnVjdHVyZSBmb3IgZnVuY3Qgd2l0aCBtdWx0aS1mb3JtYXRcbiAgICB2YXIgb3ZlcmxvYWRzID0gW107XG4gICAgaWYgKHF1ZXJ5UmVzdWx0WzBdLmhhc093blByb3BlcnR5KCdvdmVybG9hZHMnKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVyeVJlc3VsdFswXS5vdmVybG9hZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3ZlcmxvYWRzLnB1c2gocXVlcnlSZXN1bHRbMF0ub3ZlcmxvYWRzW2ldLnBhcmFtcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG92ZXJsb2Fkcy5wdXNoKHF1ZXJ5UmVzdWx0WzBdLnBhcmFtcyB8fCBbXSk7XG4gICAgfVxuXG4gICAgdmFyIG1hcENvbnN0YW50cyA9IHt9O1xuICAgIHZhciBtYXhQYXJhbXMgPSAwO1xuICAgIG92ZXJsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGZvcm1hdHMpIHtcbiAgICAgIGlmIChtYXhQYXJhbXMgPCBmb3JtYXRzLmxlbmd0aCkge1xuICAgICAgICBtYXhQYXJhbXMgPSBmb3JtYXRzLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGZvcm1hdHMuZm9yRWFjaChmdW5jdGlvbihmb3JtYXQpIHtcbiAgICAgICAgZm9ybWF0LnR5cGVzID0gZm9ybWF0LnR5cGUuc3BsaXQoJ3wnKS5tYXAoZnVuY3Rpb24gY3QodHlwZSkge1xuICAgICAgICAgIC8vIGFycmF5XG4gICAgICAgICAgaWYgKHR5cGUuc3Vic3RyKHR5cGUubGVuZ3RoIC0gMiwgMikgPT09ICdbXScpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG5hbWU6IHR5cGUsXG4gICAgICAgICAgICAgIGFycmF5OiBjdCh0eXBlLnN1YnN0cigwLCB0eXBlLmxlbmd0aCAtIDIpKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbG93ZXJUeXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgLy8gY29udGFudFxuICAgICAgICAgIGlmIChsb3dlclR5cGUgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgIHZhciBjb25zdGFudDtcbiAgICAgICAgICAgIGlmIChtYXBDb25zdGFudHMuaGFzT3duUHJvcGVydHkoZm9ybWF0Lm5hbWUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0YW50ID0gbWFwQ29uc3RhbnRzW2Zvcm1hdC5uYW1lXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHBhcnNlIHBvc3NpYmxlIGNvbnN0YW50IHZhbHVlcyBmcm9tIGRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgIHZhciBteVJlID0gL2VpdGhlclxccysoPzpbQS1aMC05X10rXFxzKiw/XFxzKig/Om9yKT9cXHMqKSsvZztcbiAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHt9O1xuICAgICAgICAgICAgICB2YXIgbmFtZXMgPSBbXTtcblxuICAgICAgICAgICAgICBjb25zdGFudCA9IG1hcENvbnN0YW50c1tmb3JtYXQubmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgbmFtZXM6IG5hbWVzXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgdmFyIG15QXJyYXkgPSBteVJlLmV4ZWMoZm9ybWF0LmRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgaWYgKGZ1bmMgPT09ICdlbmRTaGFwZScgJiYgZm9ybWF0Lm5hbWUgPT09ICdtb2RlJykge1xuICAgICAgICAgICAgICAgIHZhbHVlc1tjb25zdGFudHMuQ0xPU0VdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBuYW1lcy5wdXNoKCdDTE9TRScpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IG15QXJyYXlbMF07XG4gICAgICAgICAgICAgICAgdmFyIHJlQ29uc3QgPSAvW0EtWjAtOV9dKy9nO1xuICAgICAgICAgICAgICAgIHZhciBtYXRjaENvbnN0O1xuICAgICAgICAgICAgICAgIHdoaWxlICgobWF0Y2hDb25zdCA9IHJlQ29uc3QuZXhlYyhtYXRjaCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IG1hdGNoQ29uc3RbMF07XG4gICAgICAgICAgICAgICAgICBpZiAoY29uc3RhbnRzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1tjb25zdGFudHNbbmFtZV1dID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG5hbWU6IHR5cGUsXG4gICAgICAgICAgICAgIGJ1aWx0aW46IGxvd2VyVHlwZSxcbiAgICAgICAgICAgICAgbmFtZXM6IGNvbnN0YW50Lm5hbWVzLFxuICAgICAgICAgICAgICB2YWx1ZXM6IGNvbnN0YW50LnZhbHVlc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBmdW5jdGlvblxuICAgICAgICAgIGlmIChsb3dlclR5cGUuc3Vic3RyKDAsICdmdW5jdGlvbicubGVuZ3RoKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbG93ZXJUeXBlID0gJ2Z1bmN0aW9uJztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYnVpbHRpblxuICAgICAgICAgIGlmIChidWlsdGluVHlwZXMuaW5kZXhPZihsb3dlclR5cGUpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IHR5cGUsIGJ1aWx0aW46IGxvd2VyVHlwZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGZpbmQgdHlwZSdzIHByb3RvdHlwZVxuICAgICAgICAgIHZhciB0ID0gd2luZG93O1xuICAgICAgICAgIHZhciB0eXBlUGFydHMgPSB0eXBlLnNwbGl0KCcuJyk7XG5cbiAgICAgICAgICAvLyBzcGVjaWFsLWNhc2UgJ3A1JyBzaW5jZSBpdCBtYXkgYmUgbm9uLWdsb2JhbFxuICAgICAgICAgIGlmICh0eXBlUGFydHNbMF0gPT09ICdwNScpIHtcbiAgICAgICAgICAgIHQgPSBwNTtcbiAgICAgICAgICAgIHR5cGVQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHR5cGVQYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICAgIHQgPSB0ICYmIHRbcF07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IHR5cGUsIHByb3RvdHlwZTogdCB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7IG5hbWU6IHR5cGUsIHR5cGU6IGxvd2VyVHlwZSB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBvdmVybG9hZHM6IG92ZXJsb2FkcyxcbiAgICAgIG1heFBhcmFtczogbWF4UGFyYW1zXG4gICAgfTtcbiAgfTtcblxuICB2YXIgdGVzdFBhcmFtVHlwZSA9IGZ1bmN0aW9uKHBhcmFtLCB0eXBlKSB7XG4gICAgdmFyIGlzQXJyYXkgPSBwYXJhbSBpbnN0YW5jZW9mIEFycmF5O1xuICAgIGlmICh0eXBlLmFycmF5ICYmIGlzQXJyYXkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF0ZXN0UGFyYW1UeXBlKHBhcmFtW2ldLCB0eXBlLmFycmF5KSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlLnByb3RvdHlwZSkge1xuICAgICAgcmV0dXJuIHBhcmFtIGluc3RhbmNlb2YgdHlwZS5wcm90b3R5cGU7XG4gICAgfSBlbHNlIGlmICh0eXBlLmJ1aWx0aW4pIHtcbiAgICAgIHN3aXRjaCAodHlwZS5idWlsdGluKSB7XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicgfHwgKCEhcGFyYW0gJiYgIWlzTmFOKHBhcmFtKSk7XG4gICAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodHlwZW9mIHBhcmFtID09PSAnbnVtYmVyJyB8fCAoISFwYXJhbSAmJiAhaXNOYU4ocGFyYW0pKSkgJiZcbiAgICAgICAgICAgIE51bWJlcihwYXJhbSkgPT09IE1hdGguZmxvb3IocGFyYW0pXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ2FueSc6XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgICAgICByZXR1cm4gaXNBcnJheTtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIHBhcmFtID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnO1xuICAgICAgICBjYXNlICdjb25zdGFudCc6XG4gICAgICAgICAgcmV0dXJuIHR5cGUudmFsdWVzLmhhc093blByb3BlcnR5KHBhcmFtKTtcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBwYXJhbSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0eXBlb2YgcGFyYW0gPT09IHR5cGUudDtcbiAgfTtcblxuICAvLyB0ZXN0VHlwZSgpIGZvciBub24tb2JqZWN0IHR5cGUgcGFyYW1ldGVyIHZhbGlkYXRpb25cbiAgLy8gUmV0dXJucyB0cnVlIGlmIFBBU1MsIGZhbHNlIGlmIEZBSUxcbiAgdmFyIHRlc3RQYXJhbVR5cGVzID0gZnVuY3Rpb24ocGFyYW0sIHR5cGVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRlc3RQYXJhbVR5cGUocGFyYW0sIHR5cGVzW2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHZhciB0ZXN0UGFyYW1Gb3JtYXQgPSBmdW5jdGlvbihhcmdzLCBmb3JtYXRzKSB7XG4gICAgdmFyIGVycm9yQXJyYXkgPSBbXTtcbiAgICBmb3IgKHZhciBwID0gMDsgcCA8IGZvcm1hdHMubGVuZ3RoOyBwKyspIHtcbiAgICAgIHZhciBhcmcgPSBhcmdzW3BdO1xuICAgICAgdmFyIGZvcm1hdCA9IGZvcm1hdHNbcF07XG4gICAgICB2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG4gICAgICBpZiAoJ3VuZGVmaW5lZCcgPT09IGFyZ1R5cGUgfHwgbnVsbCA9PT0gYXJnKSB7XG4gICAgICAgIGlmIChmb3JtYXQub3B0aW9uYWwgIT09IHRydWUpIHtcbiAgICAgICAgICBlcnJvckFycmF5LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ0VNUFRZX1ZBUicsXG4gICAgICAgICAgICBwb3NpdGlvbjogcCxcbiAgICAgICAgICAgIGZvcm1hdDogZm9ybWF0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRlc3RQYXJhbVR5cGVzKGFyZywgZm9ybWF0LnR5cGVzKSkge1xuICAgICAgICBlcnJvckFycmF5LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdXUk9OR19UWVBFJyxcbiAgICAgICAgICBwb3NpdGlvbjogcCxcbiAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgICBhcmc6IGFyZ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9yQXJyYXk7XG4gIH07XG5cbiAgLy8gZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgY29uc29sZS5sb2coKSBtc2dcbiAgcDUuX2ZyaWVuZGx5UGFyYW1FcnJvciA9IGZ1bmN0aW9uKGVycm9yT2JqLCBmdW5jKSB7XG4gICAgdmFyIG1lc3NhZ2U7XG5cbiAgICBmdW5jdGlvbiBmb3JtYXRUeXBlKCkge1xuICAgICAgdmFyIGZvcm1hdCA9IGVycm9yT2JqLmZvcm1hdDtcbiAgICAgIHJldHVybiBmb3JtYXQudHlwZXNcbiAgICAgICAgLm1hcChmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHR5cGUubmFtZXMgPyB0eXBlLm5hbWVzLmpvaW4oJ3wnKSA6IHR5cGUubmFtZTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJ3wnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGVycm9yT2JqLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0VNUFRZX1ZBUic6XG4gICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgIGZ1bmMgK1xuICAgICAgICAgICcoKSB3YXMgZXhwZWN0aW5nICcgK1xuICAgICAgICAgIGZvcm1hdFR5cGUoKSArXG4gICAgICAgICAgJyBmb3IgcGFyYW1ldGVyICMnICtcbiAgICAgICAgICBlcnJvck9iai5wb3NpdGlvbiArXG4gICAgICAgICAgJyAoemVyby1iYXNlZCBpbmRleCksIHJlY2VpdmVkIGFuIGVtcHR5IHZhcmlhYmxlIGluc3RlYWQuJyArXG4gICAgICAgICAgJyBJZiBub3QgaW50ZW50aW9uYWwsIHRoaXMgaXMgb2Z0ZW4gYSBwcm9ibGVtIHdpdGggc2NvcGU6JyArXG4gICAgICAgICAgJyBbaHR0cHM6Ly9wNWpzLm9yZy9leGFtcGxlcy9kYXRhLXZhcmlhYmxlLXNjb3BlLmh0bWxdJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXUk9OR19UWVBFJzpcbiAgICAgICAgdmFyIGFyZyA9IGVycm9yT2JqLmFyZztcbiAgICAgICAgdmFyIGFyZ1R5cGUgPSBhcmcgaW5zdGFuY2VvZiBBcnJheSA/ICdhcnJheScgOiBhcmcubmFtZSB8fCB0eXBlb2YgYXJnO1xuICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICBmdW5jICtcbiAgICAgICAgICAnKCkgd2FzIGV4cGVjdGluZyAnICtcbiAgICAgICAgICBmb3JtYXRUeXBlKCkgK1xuICAgICAgICAgICcgZm9yIHBhcmFtZXRlciAjJyArXG4gICAgICAgICAgZXJyb3JPYmoucG9zaXRpb24gK1xuICAgICAgICAgICcgKHplcm8tYmFzZWQgaW5kZXgpLCByZWNlaXZlZCAnICtcbiAgICAgICAgICBhcmdUeXBlICtcbiAgICAgICAgICAnIGluc3RlYWQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dST05HX0FSR1VNRU5UX0NPVU5UJzpcbiAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgZnVuYyArXG4gICAgICAgICAgJygpIHdhcyBleHBlY3RpbmcgJyArXG4gICAgICAgICAgZXJyb3JPYmoubWF4UGFyYW1zICtcbiAgICAgICAgICAnIGFyZ3VtZW50cywgYnV0IHJlY2VpdmVkICcgK1xuICAgICAgICAgIGVycm9yT2JqLmFyZ0NvdW50O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlID0gL0Z1bmN0aW9uXFwudmFsaWRhdGVQYXJhbWV0ZXJzLipbXFxyXFxuXS4qW1xcclxcbl0uKlxcKChbXildKikvO1xuICAgICAgICB2YXIgbG9jYXRpb24gPSByZS5leGVjKG5ldyBFcnJvcigpLnN0YWNrKVsxXTtcbiAgICAgICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSAnIGF0ICcgKyBsb2NhdGlvbjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gICAgICByZXBvcnQobWVzc2FnZSArICcuJywgZnVuYywgRVJSX1BBUkFNUyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgcGFyYW1ldGVyc1xuICAgKiBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgICBmdW5jICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvblxuICAgKiBwYXJhbSAge0FycmF5fSAgICAgICAgICAgICAgICBhcmdzICAgIHVzZXIgaW5wdXQgYXJndW1lbnRzXG4gICAqXG4gICAqIGV4YW1wbGU6XG4gICAqICB2YXIgYTtcbiAgICogIGVsbGlwc2UoMTAsMTAsYSw1KTtcbiAgICogY29uc29sZSBvdXB1dDpcbiAgICogIFwiSXQgbG9va3MgbGlrZSBlbGxpcHNlIHJlY2VpdmVkIGFuIGVtcHR5IHZhcmlhYmxlIGluIHNwb3QgIzIuXCJcbiAgICpcbiAgICogZXhhbXBsZTpcbiAgICogIGVsbGlwc2UoMTAsXCJmb29cIiw1LDUpO1xuICAgKiBjb25zb2xlIG91dHB1dDpcbiAgICogIFwiZWxsaXBzZSB3YXMgZXhwZWN0aW5nIGEgbnVtYmVyIGZvciBwYXJhbWV0ZXIgIzEsXG4gICAqICAgICAgICAgICByZWNlaXZlZCBcImZvb1wiIGluc3RlYWQuXCJcbiAgICovXG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMgPSBmdW5jdGlvbiB2YWxpZGF0ZVBhcmFtZXRlcnMoZnVuYywgYXJncykge1xuICAgIGlmIChwNS5kaXNhYmxlRnJpZW5kbHlFcnJvcnMpIHtcbiAgICAgIHJldHVybjsgLy8gc2tpcCBGRVNcbiAgICB9XG5cbiAgICB2YXIgZG9jcyA9IGRvY0NhY2hlW2Z1bmNdIHx8IChkb2NDYWNoZVtmdW5jXSA9IGxvb2t1cFBhcmFtRG9jKGZ1bmMpKTtcbiAgICB2YXIgZXJyb3JBcnJheSA9IFtdO1xuICAgIHZhciBtaW5FcnJDb3VudCA9IDk5OTk5OTtcbiAgICB2YXIgb3ZlcmxvYWRzID0gZG9jcy5vdmVybG9hZHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdmVybG9hZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhcnJFcnJvciA9IHRlc3RQYXJhbUZvcm1hdChhcmdzLCBvdmVybG9hZHNbaV0pO1xuICAgICAgLy8gc2VlIGlmIHRoaXMgaXMgdGhlIGZvcm1hdCB3aXRoIG1pbiBudW1iZXIgb2YgZXJyXG4gICAgICBpZiAobWluRXJyQ291bnQgPiBhcnJFcnJvci5sZW5ndGgpIHtcbiAgICAgICAgbWluRXJyQ291bnQgPSBhcnJFcnJvci5sZW5ndGg7XG4gICAgICAgIGVycm9yQXJyYXkgPSBhcnJFcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChhcnJFcnJvci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYnJlYWs7IC8vIG5vIGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFlcnJvckFycmF5Lmxlbmd0aCAmJiBhcmdzLmxlbmd0aCA+IGRvY3MubWF4UGFyYW1zKSB7XG4gICAgICBlcnJvckFycmF5LnB1c2goe1xuICAgICAgICB0eXBlOiAnV1JPTkdfQVJHVU1FTlRfQ09VTlQnLFxuICAgICAgICBhcmdDb3VudDogYXJncy5sZW5ndGgsXG4gICAgICAgIG1heFBhcmFtczogZG9jcy5tYXhQYXJhbXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGdlbmVyYXRlIGVyciBtc2dcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IGVycm9yQXJyYXkubGVuZ3RoOyBuKyspIHtcbiAgICAgIHA1Ll9mcmllbmRseVBhcmFtRXJyb3IoZXJyb3JBcnJheVtuXSwgZnVuYyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBQcmludHMgb3V0IGFsbCB0aGUgY29sb3JzIGluIHRoZSBjb2xvciBwYWxsZXRlIHdpdGggd2hpdGUgdGV4dC5cbiAgICogRm9yIGNvbG9yIGJsaW5kbmVzcyB0ZXN0aW5nLlxuICAgKi9cbiAgLyogZnVuY3Rpb24gdGVzdENvbG9ycygpIHtcbiAgICB2YXIgc3RyID0gJ0EgYm94IG9mIGJpc2N1aXRzLCBhIGJveCBvZiBtaXhlZCBiaXNjdWl0cyBhbmQgYSBiaXNjdWl0IG1peGVyJztcbiAgICByZXBvcnQoc3RyLCAncHJpbnQnLCAnI0VEMjI1RCcpOyAvLyBwNS5qcyBtYWdlbnRhXG4gICAgcmVwb3J0KHN0ciwgJ3ByaW50JywgJyMyRDdCQjYnKTsgLy8gcDUuanMgYmx1ZVxuICAgIHJlcG9ydChzdHIsICdwcmludCcsICcjRUU5OTAwJyk7IC8vIHA1LmpzIG9yYW5nZVxuICAgIHJlcG9ydChzdHIsICdwcmludCcsICcjQTY3RjU5Jyk7IC8vIHA1LmpzIGxpZ2h0IGJyb3duXG4gICAgcmVwb3J0KHN0ciwgJ3ByaW50JywgJyM3MDRGMjEnKTsgLy8gcDUuanMgZ29sZFxuICAgIHJlcG9ydChzdHIsICdwcmludCcsICcjMUNDNTgxJyk7IC8vIGF1dG8gY3lhblxuICAgIHJlcG9ydChzdHIsICdwcmludCcsICcjRkY2NjI1Jyk7IC8vIGF1dG8gb3JhbmdlXG4gICAgcmVwb3J0KHN0ciwgJ3ByaW50JywgJyM3OUVCMjInKTsgLy8gYXV0byBncmVlblxuICAgIHJlcG9ydChzdHIsICdwcmludCcsICcjQjQwMDMzJyk7IC8vIHA1LmpzIGRhcmtlbmVkIG1hZ2VudGFcbiAgICByZXBvcnQoc3RyLCAncHJpbnQnLCAnIzA4NEI3RicpOyAvLyBwNS5qcyBkYXJrZW5lZCBibHVlXG4gICAgcmVwb3J0KHN0ciwgJ3ByaW50JywgJyM5NDVGMDAnKTsgLy8gcDUuanMgZGFya2VuZWQgb3JhbmdlXG4gICAgcmVwb3J0KHN0ciwgJ3ByaW50JywgJyM2QjQ0MUQnKTsgLy8gcDUuanMgZGFya2VuZWQgYnJvd25cbiAgICByZXBvcnQoc3RyLCAncHJpbnQnLCAnIzJFMUIwMCcpOyAvLyBwNS5qcyBkYXJrZW5lZCBnb2xkXG4gICAgcmVwb3J0KHN0ciwgJ3ByaW50JywgJyMwMDg4NTEnKTsgLy8gYXV0byBkYXJrIGN5YW5cbiAgICByZXBvcnQoc3RyLCAncHJpbnQnLCAnI0M4M0MwMCcpOyAvLyBhdXRvIGRhcmsgb3JhbmdlXG4gICAgcmVwb3J0KHN0ciwgJ3ByaW50JywgJyM0REIyMDAnKTsgLy8gYXV0byBkYXJrIGdyZWVuXG4gIH0gKi9cblxuICBwNS5wcm90b3R5cGUuX3ZhbGlkYXRlUGFyYW1ldGVycyA9IHA1LnZhbGlkYXRlUGFyYW1ldGVycztcbn1cblxuLy8gVGhpcyBpcyBhIGxhemlseS1kZWZpbmVkIGxpc3Qgb2YgcDUgc3ltYm9scyB0aGF0IG1heSBiZVxuLy8gbWlzdXNlZCBieSBiZWdpbm5lcnMgYXQgdG9wLWxldmVsIGNvZGUsIG91dHNpZGUgb2Ygc2V0dXAvZHJhdy4gV2UnZCBsaWtlXG4vLyB0byBkZXRlY3QgdGhlc2UgZXJyb3JzIGFuZCBoZWxwIHRoZSB1c2VyIGJ5IHN1Z2dlc3RpbmcgdGhleSBtb3ZlIHRoZW1cbi8vIGludG8gc2V0dXAvZHJhdy5cbi8vXG4vLyBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmcvcDUuanMvaXNzdWVzLzExMjEuXG52YXIgbWlzdXNlZEF0VG9wTGV2ZWxDb2RlID0gbnVsbDtcbnZhciBGQVFfVVJMID1cbiAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzL3dpa2kvJyArXG4gICdGcmVxdWVudGx5LUFza2VkLVF1ZXN0aW9ucycgK1xuICAnI3doeS1jYW50LWktYXNzaWduLXZhcmlhYmxlcy11c2luZy1wNS1mdW5jdGlvbnMtYW5kLScgK1xuICAndmFyaWFibGVzLWJlZm9yZS1zZXR1cCc7XG5cbnZhciBkZWZpbmVNaXN1c2VkQXRUb3BMZXZlbENvZGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHVuaXF1ZU5hbWVzRm91bmQgPSB7fTtcblxuICB2YXIgZ2V0U3ltYm9scyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWVbMF0gPT09ICdfJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB1bmlxdWVOYW1lc0ZvdW5kKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdW5pcXVlTmFtZXNGb3VuZFtuYW1lXSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KVxuICAgICAgLm1hcChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHZhciB0eXBlO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdHlwZSA9ICdmdW5jdGlvbic7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gbmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgdHlwZSA9ICdjb25zdGFudCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHlwZSA9ICd2YXJpYWJsZSc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBuYW1lOiBuYW1lLCB0eXBlOiB0eXBlIH07XG4gICAgICB9KTtcbiAgfTtcblxuICBtaXN1c2VkQXRUb3BMZXZlbENvZGUgPSBbXS5jb25jYXQoXG4gICAgZ2V0U3ltYm9scyhwNS5wcm90b3R5cGUpLFxuICAgIC8vIEF0IHByZXNlbnQsIHA1IG9ubHkgYWRkcyBpdHMgY29uc3RhbnRzIHRvIHA1LnByb3RvdHlwZSBkdXJpbmdcbiAgICAvLyBjb25zdHJ1Y3Rpb24sIHdoaWNoIG1heSBub3QgaGF2ZSBoYXBwZW5lZCBhdCB0aGUgdGltZSBhXG4gICAgLy8gUmVmZXJlbmNlRXJyb3IgaXMgdGhyb3duLCBzbyB3ZSdsbCBtYW51YWxseSBhZGQgdGhlbSB0byBvdXIgbGlzdC5cbiAgICBnZXRTeW1ib2xzKF9kZXJlcV8oJy4vY29uc3RhbnRzJykpXG4gICk7XG5cbiAgLy8gVGhpcyB3aWxsIHVsdGltYXRlbHkgZW5zdXJlIHRoYXQgd2UgcmVwb3J0IHRoZSBtb3N0IHNwZWNpZmljIGVycm9yXG4gIC8vIHBvc3NpYmxlIHRvIHRoZSB1c2VyLCBlLmcuIGFkdmlzaW5nIHRoZW0gYWJvdXQgSEFMRl9QSSBpbnN0ZWFkIG9mIFBJXG4gIC8vIHdoZW4gdGhlaXIgY29kZSBtaXN1c2VzIHRoZSBmb3JtZXIuXG4gIG1pc3VzZWRBdFRvcExldmVsQ29kZS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYi5uYW1lLmxlbmd0aCAtIGEubmFtZS5sZW5ndGg7XG4gIH0pO1xufTtcblxudmFyIGhlbHBGb3JNaXN1c2VkQXRUb3BMZXZlbENvZGUgPSBmdW5jdGlvbihlLCBsb2cpIHtcbiAgaWYgKCFsb2cpIHtcbiAgICBsb2cgPSBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuICB9XG5cbiAgaWYgKCFtaXN1c2VkQXRUb3BMZXZlbENvZGUpIHtcbiAgICBkZWZpbmVNaXN1c2VkQXRUb3BMZXZlbENvZGUoKTtcbiAgfVxuXG4gIC8vIElmIHdlIGZpbmQgdGhhdCB3ZSdyZSBsb2dnaW5nIGxvdHMgb2YgZmFsc2UgcG9zaXRpdmVzLCB3ZSBjYW5cbiAgLy8gdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgY29kZSB0byBhdm9pZCBkaXNwbGF5aW5nIGFueXRoaW5nIGlmIHRoZVxuICAvLyB1c2VyJ3MgY29kZSBpc24ndCBsaWtlbHkgdG8gYmUgdXNpbmcgcDUncyBnbG9iYWwgbW9kZS4gKE5vdGUgdGhhdFxuICAvLyBzZXR1cC9kcmF3IGFyZSBtb3JlIGxpa2VseSB0byBiZSBkZWZpbmVkIGR1ZSB0byBKUyBmdW5jdGlvbiBob2lzdGluZy4pXG4gIC8vXG4gIC8vaWYgKCEoJ3NldHVwJyBpbiB3aW5kb3cgfHwgJ2RyYXcnIGluIHdpbmRvdykpIHtcbiAgLy8gIHJldHVybjtcbiAgLy99XG5cbiAgbWlzdXNlZEF0VG9wTGV2ZWxDb2RlLnNvbWUoZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgLy8gTm90ZSB0aGF0IHdoaWxlIGp1c3QgY2hlY2tpbmcgZm9yIHRoZSBvY2N1cnJlbmNlIG9mIHRoZVxuICAgIC8vIHN5bWJvbCBuYW1lIGluIHRoZSBlcnJvciBtZXNzYWdlIGNvdWxkIHJlc3VsdCBpbiBmYWxzZSBwb3NpdGl2ZXMsXG4gICAgLy8gYSBtb3JlIHJpZ29yb3VzIHRlc3QgaXMgZGlmZmljdWx0IGJlY2F1c2UgZGlmZmVyZW50IGJyb3dzZXJzXG4gICAgLy8gbG9nIGRpZmZlcmVudCBtZXNzYWdlcywgYW5kIHRoZSBmb3JtYXQgb2YgdGhvc2UgbWVzc2FnZXMgbWF5XG4gICAgLy8gY2hhbmdlIG92ZXIgdGltZS5cbiAgICAvL1xuICAgIC8vIEZvciBleGFtcGxlLCBpZiB0aGUgdXNlciB1c2VzICdQSScgaW4gdGhlaXIgY29kZSwgaXQgbWF5IHJlc3VsdFxuICAgIC8vIGluIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXNzYWdlczpcbiAgICAvL1xuICAgIC8vICAgKiAnUEknIGlzIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaWNyb3NvZnQgRWRnZSlcbiAgICAvLyAgICogUmVmZXJlbmNlRXJyb3I6IFBJIGlzIHVuZGVmaW5lZCAgICAgICAgICAgICAoRmlyZWZveClcbiAgICAvLyAgICogVW5jYXVnaHQgUmVmZXJlbmNlRXJyb3I6IFBJIGlzIG5vdCBkZWZpbmVkICAoQ2hyb21lKVxuXG4gICAgaWYgKGUubWVzc2FnZSAmJiBlLm1lc3NhZ2UubWF0Y2goJ1xcXFxXPycgKyBzeW1ib2wubmFtZSArICdcXFxcVycpICE9PSBudWxsKSB7XG4gICAgICBsb2coXG4gICAgICAgIFwiRGlkIHlvdSBqdXN0IHRyeSB0byB1c2UgcDUuanMncyBcIiArXG4gICAgICAgICAgc3ltYm9sLm5hbWUgK1xuICAgICAgICAgIChzeW1ib2wudHlwZSA9PT0gJ2Z1bmN0aW9uJyA/ICcoKSAnIDogJyAnKSArXG4gICAgICAgICAgc3ltYm9sLnR5cGUgK1xuICAgICAgICAgICc/IElmIHNvLCB5b3UgbWF5IHdhbnQgdG8gJyArXG4gICAgICAgICAgXCJtb3ZlIGl0IGludG8geW91ciBza2V0Y2gncyBzZXR1cCgpIGZ1bmN0aW9uLlxcblxcblwiICtcbiAgICAgICAgICAnRm9yIG1vcmUgZGV0YWlscywgc2VlOiAnICtcbiAgICAgICAgICBGQVFfVVJMXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcbn07XG5cbi8vIEV4cG9zaW5nIHRoaXMgcHJpbWFyaWx5IGZvciB1bml0IHRlc3RpbmcuXG5wNS5wcm90b3R5cGUuX2hlbHBGb3JNaXN1c2VkQXRUb3BMZXZlbENvZGUgPSBoZWxwRm9yTWlzdXNlZEF0VG9wTGV2ZWxDb2RlO1xuXG5pZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gJ2NvbXBsZXRlJykge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoZWxwRm9yTWlzdXNlZEF0VG9wTGV2ZWxDb2RlLCBmYWxzZSk7XG5cbiAgLy8gT3VyIGpvYiBpcyBvbmx5IHRvIGNhdGNoIFJlZmVyZW5jZUVycm9ycyB0aGF0IGFyZSB0aHJvd24gd2hlblxuICAvLyBnbG9iYWwgKG5vbi1pbnN0YW5jZSBtb2RlKSBwNSBBUElzIGFyZSB1c2VkIGF0IHRoZSB0b3AtbGV2ZWxcbiAgLy8gc2NvcGUgb2YgYSBmaWxlLCBzbyB3ZSdsbCB1bmJpbmQgb3VyIGVycm9yIGxpc3RlbmVyIG5vdyB0byBtYWtlXG4gIC8vIHN1cmUgd2UgZG9uJ3QgbG9nIGZhbHNlIHBvc2l0aXZlcyBsYXRlci5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoZWxwRm9yTWlzdXNlZEF0VG9wTGV2ZWxDb2RlLCBmYWxzZSk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4uLy4uL2RvY3MvcmVmZXJlbmNlL2RhdGEuanNvblwiOjEsXCIuL2NvbnN0YW50c1wiOjIxLFwiLi9jb3JlXCI6MjJ9XSwyNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xuXG4vKipcbiAqIF9nbG9iYWxJbml0XG4gKlxuICogVE9ETzogPz8/XG4gKiBpZiBza2V0Y2ggaXMgb24gd2luZG93XG4gKiBhc3N1bWUgXCJnbG9iYWxcIiBtb2RlXG4gKiBhbmQgaW5zdGFudGlhdGUgcDUgYXV0b21hdGljYWxseVxuICogb3RoZXJ3aXNlIGRvIG5vdGhpbmdcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7VW5kZWZpbmVkfVxuICovXG52YXIgX2dsb2JhbEluaXQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF3aW5kb3cuUEhBTlRPTUpTICYmICF3aW5kb3cubW9jaGEpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBhIHNldHVwIG9yIGRyYXcgZnVuY3Rpb24gb24gdGhlIHdpbmRvd1xuICAgIC8vIHRoZW4gaW5zdGFudGlhdGUgcDUgaW4gXCJnbG9iYWxcIiBtb2RlXG4gICAgaWYgKFxuICAgICAgKCh3aW5kb3cuc2V0dXAgJiYgdHlwZW9mIHdpbmRvdy5zZXR1cCA9PT0gJ2Z1bmN0aW9uJykgfHxcbiAgICAgICAgKHdpbmRvdy5kcmF3ICYmIHR5cGVvZiB3aW5kb3cuZHJhdyA9PT0gJ2Z1bmN0aW9uJykpICYmXG4gICAgICAhcDUuaW5zdGFuY2VcbiAgICApIHtcbiAgICAgIG5ldyBwNSgpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gVE9ETzogPz8/XG5pZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICBfZ2xvYmFsSW5pdCgpO1xufSBlbHNlIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBfZ2xvYmFsSW5pdCwgZmFsc2UpO1xufVxuXG59LHtcIi4uL2NvcmUvY29yZVwiOjIyfV0sMjc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIERPTVxuICogQHN1Ym1vZHVsZSBET01cbiAqIEBmb3IgcDUuRWxlbWVudFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi9jb3JlJyk7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIGVsZW1lbnRzIGFkZGVkIHRvIGEgc2tldGNoLCBpbmNsdWRpbmcgY2FudmFzLFxuICogZ3JhcGhpY3MgYnVmZmVycywgYW5kIG90aGVyIEhUTUwgZWxlbWVudHMuIE1ldGhvZHMgaW4gYmx1ZSBhcmVcbiAqIGluY2x1ZGVkIGluIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHksIG1ldGhvZHMgaW4gYnJvd24gYXJlIGFkZGVkXG4gKiB3aXRoIHRoZSA8YSBocmVmPVwiaHR0cDovL3A1anMub3JnL3JlZmVyZW5jZS8jL2xpYnJhcmllcy9wNS5kb21cIj5wNS5kb21cbiAqIGxpYnJhcnk8L2E+LlxuICogSXQgaXMgbm90IGNhbGxlZCBkaXJlY3RseSwgYnV0IHA1LkVsZW1lbnRcbiAqIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgY2FsbGluZyBjcmVhdGVDYW52YXMsIGNyZWF0ZUdyYXBoaWNzLFxuICogb3IgaW4gdGhlIHA1LmRvbSBsaWJyYXJ5LCBjcmVhdGVEaXYsIGNyZWF0ZUltZywgY3JlYXRlSW5wdXQsIGV0Yy5cbiAqXG4gKiBAY2xhc3MgcDUuRWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IGVsdCBET00gbm9kZSB0aGF0IGlzIHdyYXBwZWRcbiAqIEBwYXJhbSB7cDV9IFtwSW5zdF0gcG9pbnRlciB0byBwNSBpbnN0YW5jZVxuICovXG5wNS5FbGVtZW50ID0gZnVuY3Rpb24oZWx0LCBwSW5zdCkge1xuICAvKipcbiAgICogVW5kZXJseWluZyBIVE1MIGVsZW1lbnQuIEFsbCBub3JtYWwgSFRNTCBtZXRob2RzIGNhbiBiZSBjYWxsZWQgb24gdGhpcy5cbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj5cbiAgICogPGNvZGU+XG4gICAqIGNyZWF0ZUNhbnZhcygzMDAsIDUwMCk7XG4gICAqIGJhY2tncm91bmQoMCwgMCwgMCwgMCk7XG4gICAqIHZhciBpbnB1dCA9IGNyZWF0ZUlucHV0KCk7XG4gICAqIGlucHV0LnBvc2l0aW9uKDIwLCAyMjUpO1xuICAgKiB2YXIgaW5wdXRFbGVtID0gbmV3IHA1LkVsZW1lbnQoaW5wdXQuZWx0KTtcbiAgICogaW5wdXRFbGVtLnN0eWxlKCd3aWR0aDo0NTBweDsnKTtcbiAgICogaW5wdXRFbGVtLnZhbHVlKCdzb21lIHN0cmluZycpO1xuICAgKiA8L2NvZGU+XG4gICAqIDwvZGl2PlxuICAgKlxuICAgKiBAcHJvcGVydHkgZWx0XG4gICAqIEByZWFkT25seVxuICAgKi9cbiAgdGhpcy5lbHQgPSBlbHQ7XG4gIHRoaXMuX3BJbnN0ID0gcEluc3Q7XG4gIHRoaXMuX2V2ZW50cyA9IHt9O1xuICB0aGlzLndpZHRoID0gdGhpcy5lbHQub2Zmc2V0V2lkdGg7XG4gIHRoaXMuaGVpZ2h0ID0gdGhpcy5lbHQub2Zmc2V0SGVpZ2h0O1xufTtcblxuLyoqXG4gKlxuICogQXR0YWNoZXMgdGhlIGVsZW1lbnQgdG8gdGhlIHBhcmVudCBzcGVjaWZpZWQuIEEgd2F5IG9mIHNldHRpbmdcbiAqIHRoZSBjb250YWluZXIgZm9yIHRoZSBlbGVtZW50LiBBY2NlcHRzIGVpdGhlciBhIHN0cmluZyBJRCwgRE9NXG4gKiBub2RlLCBvciBwNS5FbGVtZW50LiBJZiBubyBhcmd1bWVudHMgZ2l2ZW4sIHBhcmVudCBub2RlIGlzIHJldHVybmVkLlxuICogRm9yIG1vcmUgd2F5cyB0byBwb3NpdGlvbiB0aGUgY2FudmFzLCBzZWUgdGhlXG4gKiA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy9wNS5qcy93aWtpL1Bvc2l0aW9uaW5nLXlvdXItY2FudmFzJz5cbiAqIHBvc2l0aW9uaW5nIHRoZSBjYW52YXM8L2E+IHdpa2kgcGFnZS5cbiAqXG4gKiBAbWV0aG9kIHBhcmVudFxuICogQHBhcmFtICB7U3RyaW5nfHA1LkVsZW1lbnR8T2JqZWN0fSBwYXJlbnQgdGhlIElELCBET00gbm9kZSwgb3IgcDUuRWxlbWVudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgb2YgZGVzaXJlZCBwYXJlbnQgZWxlbWVudFxuICogQGNoYWluYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXIgbm90ZXN0XCI+PGNvZGU+XG4gKiAvLyBpbiB0aGUgaHRtbCBmaWxlOlxuICogLy8gJmx0O2RpdiBpZD1cIm15Q29udGFpbmVyXCI+Jmx0Oy9kaXY+XG4gKlxuICogLy8gaW4gdGhlIGpzIGZpbGU6XG4gKiB2YXIgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqIGNudi5wYXJlbnQoJ215Q29udGFpbmVyJyk7XG4gKiA8L2NvZGU+PC9kaXY+XG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiB2YXIgZGl2MCA9IGNyZWF0ZURpdigndGhpcyBpcyB0aGUgcGFyZW50Jyk7XG4gKiB2YXIgZGl2MSA9IGNyZWF0ZURpdigndGhpcyBpcyB0aGUgY2hpbGQnKTtcbiAqIGRpdjEucGFyZW50KGRpdjApOyAvLyB1c2UgcDUuRWxlbWVudFxuICogPC9jb2RlPjwvZGl2PlxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogdmFyIGRpdjAgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIHBhcmVudCcpO1xuICogZGl2MC5pZCgnYXBwbGVzJyk7XG4gKiB2YXIgZGl2MSA9IGNyZWF0ZURpdigndGhpcyBpcyB0aGUgY2hpbGQnKTtcbiAqIGRpdjEucGFyZW50KCdhcHBsZXMnKTsgLy8gdXNlIGlkXG4gKiA8L2NvZGU+PC9kaXY+XG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlciBub3Rlc3QnPjxjb2RlPlxuICogdmFyIGVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteVBhcmVudERpdicpO1xuICogdmFyIGRpdjEgPSBjcmVhdGVEaXYoJ3RoaXMgaXMgdGhlIGNoaWxkJyk7XG4gKiBkaXYxLnBhcmVudChlbHQpOyAvLyB1c2UgZWxlbWVudCBmcm9tIHBhZ2VcbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBkaXNwbGF5LlxuICovXG4vKipcbiAqIEBtZXRob2QgcGFyZW50XG4gKiBAcmV0dXJuIHtwNS5FbGVtZW50fVxuICpcbiAqL1xucDUuRWxlbWVudC5wcm90b3R5cGUucGFyZW50ID0gZnVuY3Rpb24ocCkge1xuICBpZiAodHlwZW9mIHAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWx0LnBhcmVudE5vZGU7XG4gIH1cblxuICBpZiAodHlwZW9mIHAgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHBbMF0gPT09ICcjJykge1xuICAgICAgcCA9IHAuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICBwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCk7XG4gIH0gZWxzZSBpZiAocCBpbnN0YW5jZW9mIHA1LkVsZW1lbnQpIHtcbiAgICBwID0gcC5lbHQ7XG4gIH1cbiAgcC5hcHBlbmRDaGlsZCh0aGlzLmVsdCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKlxuICogU2V0cyB0aGUgSUQgb2YgdGhlIGVsZW1lbnQuIElmIG5vIElEIGFyZ3VtZW50IGlzIHBhc3NlZCBpbiwgaXQgaW5zdGVhZFxuICogcmV0dXJucyB0aGUgY3VycmVudCBJRCBvZiB0aGUgZWxlbWVudC5cbiAqXG4gKiBAbWV0aG9kIGlkXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGlkIElEIG9mIHRoZSBlbGVtZW50XG4gKiBAY2hhaW5hYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgLy8gQXNzaWducyBhIENTUyBzZWxlY3RvciBJRCB0b1xuICogICAvLyB0aGUgY2FudmFzIGVsZW1lbnQuXG4gKiAgIGNudi5pZCgnbXljYW52YXMnKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBkaXNwbGF5LlxuICovXG4vKipcbiAqIEBtZXRob2QgaWRcbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGlkIG9mIHRoZSBlbGVtZW50XG4gKi9cbnA1LkVsZW1lbnQucHJvdG90eXBlLmlkID0gZnVuY3Rpb24oaWQpIHtcbiAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdGhpcy5lbHQuaWQ7XG4gIH1cblxuICB0aGlzLmVsdC5pZCA9IGlkO1xuICB0aGlzLndpZHRoID0gdGhpcy5lbHQub2Zmc2V0V2lkdGg7XG4gIHRoaXMuaGVpZ2h0ID0gdGhpcy5lbHQub2Zmc2V0SGVpZ2h0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICpcbiAqIEFkZHMgZ2l2ZW4gY2xhc3MgdG8gdGhlIGVsZW1lbnQuIElmIG5vIGNsYXNzIGFyZ3VtZW50IGlzIHBhc3NlZCBpbiwgaXRcbiAqIGluc3RlYWQgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXJyZW50IGNsYXNzKGVzKSBvZiB0aGUgZWxlbWVudC5cbiAqXG4gKiBAbWV0aG9kIGNsYXNzXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGNsYXNzIGNsYXNzIHRvIGFkZFxuICogQGNoYWluYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIC8vIEFzc2lnbnMgYSBDU1Mgc2VsZWN0b3IgY2xhc3MgJ3NtYWxsJ1xuICogICAvLyB0byB0aGUgY2FudmFzIGVsZW1lbnQuXG4gKiAgIGNudi5jbGFzcygnc21hbGwnKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBkaXNwbGF5LlxuICovXG4vKipcbiAqIEBtZXRob2QgY2xhc3NcbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGNsYXNzIG9mIHRoZSBlbGVtZW50XG4gKi9cbnA1LkVsZW1lbnQucHJvdG90eXBlLmNsYXNzID0gZnVuY3Rpb24oYykge1xuICBpZiAodHlwZW9mIGMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWx0LmNsYXNzTmFtZTtcbiAgfVxuXG4gIHRoaXMuZWx0LmNsYXNzTmFtZSA9IGM7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUaGUgLm1vdXNlUHJlc3NlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGFmdGVyIGV2ZXJ5IHRpbWUgYVxuICogbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgb3ZlciB0aGUgZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0b1xuICogYXR0YWNoIGVsZW1lbnQgc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBtZXRob2QgbW91c2VQcmVzc2VkXG4gKiBAcGFyYW0gIHtGdW5jdGlvbnxCb29sZWFufSBmeG4gZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiBtb3VzZSBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzZWQgb3ZlciB0aGUgZWxlbWVudC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBgZmFsc2VgIGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZyBmdW5jdGlvbiB3aWxsIG5vIGxvbmdlciBmaXJlLlxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIHZhciBjbnY7XG4gKiB2YXIgZDtcbiAqIHZhciBnO1xuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIGNudi5tb3VzZVByZXNzZWQoY2hhbmdlR3JheSk7IC8vIGF0dGFjaCBsaXN0ZW5lciBmb3JcbiAqICAgLy8gY2FudmFzIGNsaWNrIG9ubHlcbiAqICAgZCA9IDEwO1xuICogICBnID0gMTAwO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoZyk7XG4gKiAgIGVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCBkLCBkKTtcbiAqIH1cbiAqXG4gKiAvLyB0aGlzIGZ1bmN0aW9uIGZpcmVzIHdpdGggYW55IGNsaWNrIGFueXdoZXJlXG4gKiBmdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XG4gKiAgIGQgPSBkICsgMTA7XG4gKiB9XG4gKlxuICogLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyBvbmx5IHdoZW4gY252IGlzIGNsaWNrZWRcbiAqIGZ1bmN0aW9uIGNoYW5nZUdyYXkoKSB7XG4gKiAgIGcgPSByYW5kb20oMCwgMjU1KTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBkaXNwbGF5LlxuICpcbiAqL1xucDUuRWxlbWVudC5wcm90b3R5cGUubW91c2VQcmVzc2VkID0gZnVuY3Rpb24oZnhuKSB7XG4gIGFkanVzdExpc3RlbmVyKCdtb3VzZWRvd24nLCBmeG4sIHRoaXMpO1xuICBhZGp1c3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ4biwgdGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUaGUgLmRvdWJsZUNsaWNrZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBldmVyeSB0aW1lIGFcbiAqIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIHR3aWNlIG92ZXIgdGhlIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG9cbiAqIGF0dGFjaCBlbGVtZW50IGFuZCBhY3Rpb24gc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBtZXRob2QgZG91YmxlQ2xpY2tlZFxuICogQHBhcmFtICB7RnVuY3Rpb258Qm9vbGVhbn0gZnhuIGZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gbW91c2UgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY2xpY2tlZCBvdmVyIHRoZSBlbGVtZW50LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGBmYWxzZWAgaXMgcGFzc2VkIGluc3RlYWQsIHRoZSBwcmV2aW91c2x5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nIGZ1bmN0aW9uIHdpbGwgbm8gbG9uZ2VyIGZpcmUuXG4gKiBAcmV0dXJuIHtwNS5FbGVtZW50fVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIHZhciBjbnY7XG4gKiB2YXIgZDtcbiAqIHZhciBnO1xuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIGNudi5kb3VibGVDbGlja2VkKGNoYW5nZUdyYXkpOyAvLyBhdHRhY2ggbGlzdGVuZXIgZm9yXG4gKiAgIC8vIGNhbnZhcyBkb3VibGUgY2xpY2sgb25seVxuICogICBkID0gMTA7XG4gKiAgIGcgPSAxMDA7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZChnKTtcbiAqICAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGQsIGQpO1xuICogfVxuICpcbiAqIC8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgd2l0aCBhbnkgZG91YmxlIGNsaWNrIGFueXdoZXJlXG4gKiBmdW5jdGlvbiBkb3VibGVDbGlja2VkKCkge1xuICogICBkID0gZCArIDEwO1xuICogfVxuICpcbiAqIC8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgb25seSB3aGVuIGNudiBpcyBkb3VibGUgY2xpY2tlZFxuICogZnVuY3Rpb24gY2hhbmdlR3JheSgpIHtcbiAqICAgZyA9IHJhbmRvbSgwLCAyNTUpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIG5vIGRpc3BsYXkuXG4gKlxuICovXG5wNS5FbGVtZW50LnByb3RvdHlwZS5kb3VibGVDbGlja2VkID0gZnVuY3Rpb24oZnhuKSB7XG4gIGFkanVzdExpc3RlbmVyKCdkYmxjbGljaycsIGZ4biwgdGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUaGUgLm1vdXNlV2hlZWwoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBldmVyeSB0aW1lIGFcbiAqIG1vdXNlIHdoZWVsIGlzIHNjcm9sbGVkIG92ZXIgdGhlIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG9cbiAqIGF0dGFjaCBlbGVtZW50IHNwZWNpZmljIGV2ZW50IGxpc3RlbmVycy5cbiAqIDxicj48YnI+XG4gKiBUaGUgZnVuY3Rpb24gYWNjZXB0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGFyZ3VtZW50IHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWRcbiAqIHdoZW4gdGhlIGB3aGVlbGAgZXZlbnQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBlbGVtZW50LCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXNcbiAqIHBhc3NlZCBvbmUgYXJndW1lbnQgYGV2ZW50YC4gVGhlIGBldmVudC5kZWx0YVlgIHByb3BlcnR5IHJldHVybnMgbmVnYXRpdmVcbiAqIHZhbHVlcyBpZiB0aGUgbW91c2Ugd2hlZWwgaXMgcm90YXRlZCB1cCBvciBhd2F5IGZyb20gdGhlIHVzZXIgYW5kIHBvc2l0aXZlXG4gKiBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLiBUaGUgYGV2ZW50LmRlbHRhWGAgZG9lcyB0aGUgc2FtZSBhcyBgZXZlbnQuZGVsdGFZYFxuICogZXhjZXB0IGl0IHJlYWRzIHRoZSBob3Jpem9udGFsIHdoZWVsIHNjcm9sbCBvZiB0aGUgbW91c2Ugd2hlZWwuXG4gKiA8YnI+PGJyPlxuICogT24gT1MgWCB3aXRoIFwibmF0dXJhbFwiIHNjcm9sbGluZyBlbmFibGVkLCB0aGUgYGV2ZW50LmRlbHRhWWAgdmFsdWVzIGFyZVxuICogcmV2ZXJzZWQuXG4gKlxuICogQG1ldGhvZCBtb3VzZVdoZWVsXG4gKiBAcGFyYW0gIHtGdW5jdGlvbnxCb29sZWFufSBmeG4gZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiBtb3VzZSBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVkIG92ZXIgdGhlIGVsZW1lbnQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYGZhbHNlYCBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiB2YXIgY252O1xuICogdmFyIGQ7XG4gKiB2YXIgZztcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBjbnYubW91c2VXaGVlbChjaGFuZ2VTaXplKTsgLy8gYXR0YWNoIGxpc3RlbmVyIGZvclxuICogICAvLyBhY3Rpdml0eSBvbiBjYW52YXMgb25seVxuICogICBkID0gMTA7XG4gKiAgIGcgPSAxMDA7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZChnKTtcbiAqICAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGQsIGQpO1xuICogfVxuICpcbiAqIC8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgd2l0aCBtb3VzZXdoZWVsIG1vdmVtZW50XG4gKiAvLyBhbnl3aGVyZSBvbiBzY3JlZW5cbiAqIGZ1bmN0aW9uIG1vdXNlV2hlZWwoKSB7XG4gKiAgIGcgPSBnICsgMTA7XG4gKiB9XG4gKlxuICogLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyB3aXRoIG1vdXNld2hlZWwgbW92ZW1lbnRcbiAqIC8vIG92ZXIgY2FudmFzIG9ubHlcbiAqIGZ1bmN0aW9uIGNoYW5nZVNpemUoZXZlbnQpIHtcbiAqICAgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHtcbiAqICAgICBkID0gZCArIDEwO1xuICogICB9IGVsc2Uge1xuICogICAgIGQgPSBkIC0gMTA7XG4gKiAgIH1cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKlxuICogQGFsdFxuICogbm8gZGlzcGxheS5cbiAqXG4gKi9cbnA1LkVsZW1lbnQucHJvdG90eXBlLm1vdXNlV2hlZWwgPSBmdW5jdGlvbihmeG4pIHtcbiAgYWRqdXN0TGlzdGVuZXIoJ3doZWVsJywgZnhuLCB0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFRoZSAubW91c2VSZWxlYXNlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGFmdGVyIGV2ZXJ5IHRpbWUgYVxuICogbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkIG92ZXIgdGhlIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG9cbiAqIGF0dGFjaCBlbGVtZW50IHNwZWNpZmljIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAbWV0aG9kIG1vdXNlUmVsZWFzZWRcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufEJvb2xlYW59IGZ4biBmdW5jdGlvbiB0byBiZSBmaXJlZCB3aGVuIG1vdXNlIGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZWQgb3ZlciB0aGUgZWxlbWVudC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBgZmFsc2VgIGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZyBmdW5jdGlvbiB3aWxsIG5vIGxvbmdlciBmaXJlLlxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIHZhciBjbnY7XG4gKiB2YXIgZDtcbiAqIHZhciBnO1xuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIGNudi5tb3VzZVJlbGVhc2VkKGNoYW5nZUdyYXkpOyAvLyBhdHRhY2ggbGlzdGVuZXIgZm9yXG4gKiAgIC8vIGFjdGl2aXR5IG9uIGNhbnZhcyBvbmx5XG4gKiAgIGQgPSAxMDtcbiAqICAgZyA9IDEwMDtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKGcpO1xuICogICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZCwgZCk7XG4gKiB9XG4gKlxuICogLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyBhZnRlciB0aGUgbW91c2UgaGFzIGJlZW5cbiAqIC8vIHJlbGVhc2VkXG4gKiBmdW5jdGlvbiBtb3VzZVJlbGVhc2VkKCkge1xuICogICBkID0gZCArIDEwO1xuICogfVxuICpcbiAqIC8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgYWZ0ZXIgdGhlIG1vdXNlIGhhcyBiZWVuXG4gKiAvLyByZWxlYXNlZCB3aGlsZSBvbiBjYW52YXNcbiAqIGZ1bmN0aW9uIGNoYW5nZUdyYXkoKSB7XG4gKiAgIGcgPSByYW5kb20oMCwgMjU1KTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKlxuICogQGFsdFxuICogbm8gZGlzcGxheS5cbiAqXG4gKi9cbnA1LkVsZW1lbnQucHJvdG90eXBlLm1vdXNlUmVsZWFzZWQgPSBmdW5jdGlvbihmeG4pIHtcbiAgYWRqdXN0TGlzdGVuZXIoJ21vdXNldXAnLCBmeG4sIHRoaXMpO1xuICBhZGp1c3RMaXN0ZW5lcigndG91Y2hlbmQnLCBmeG4sIHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVGhlIC5tb3VzZUNsaWNrZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBhIG1vdXNlIGJ1dHRvbiBpc1xuICogcHJlc3NlZCBhbmQgcmVsZWFzZWQgb3ZlciB0aGUgZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0b1xuICogYXR0YWNoIGVsZW1lbnQgc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBtZXRob2QgbW91c2VDbGlja2VkXG4gKiBAcGFyYW0gIHtGdW5jdGlvbnxCb29sZWFufSBmeG4gZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiBtb3VzZSBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrZWQgb3ZlciB0aGUgZWxlbWVudC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBgZmFsc2VgIGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZyBmdW5jdGlvbiB3aWxsIG5vIGxvbmdlciBmaXJlLlxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgY252O1xuICogdmFyIGQ7XG4gKiB2YXIgZztcbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgY252Lm1vdXNlQ2xpY2tlZChjaGFuZ2VHcmF5KTsgLy8gYXR0YWNoIGxpc3RlbmVyIGZvclxuICogICAvLyBhY3Rpdml0eSBvbiBjYW52YXMgb25seVxuICogICBkID0gMTA7XG4gKiAgIGcgPSAxMDA7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZChnKTtcbiAqICAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGQsIGQpO1xuICogfVxuICpcbiAqIC8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgYWZ0ZXIgdGhlIG1vdXNlIGhhcyBiZWVuXG4gKiAvLyBjbGlja2VkIGFueXdoZXJlXG4gKiBmdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XG4gKiAgIGQgPSBkICsgMTA7XG4gKiB9XG4gKlxuICogLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyBhZnRlciB0aGUgbW91c2UgaGFzIGJlZW5cbiAqIC8vIGNsaWNrZWQgb24gY2FudmFzXG4gKiBmdW5jdGlvbiBjaGFuZ2VHcmF5KCkge1xuICogICBnID0gcmFuZG9tKDAsIDI1NSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBkaXNwbGF5LlxuICpcbiAqL1xucDUuRWxlbWVudC5wcm90b3R5cGUubW91c2VDbGlja2VkID0gZnVuY3Rpb24oZnhuKSB7XG4gIGFkanVzdExpc3RlbmVyKCdjbGljaycsIGZ4biwgdGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUaGUgLm1vdXNlTW92ZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBldmVyeSB0aW1lIGFcbiAqIG1vdXNlIG1vdmVzIG92ZXIgdGhlIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFuXG4gKiBlbGVtZW50IHNwZWNpZmljIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBtZXRob2QgbW91c2VNb3ZlZFxuICogQHBhcmFtICB7RnVuY3Rpb258Qm9vbGVhbn0gZnhuIGZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gYSBtb3VzZSBtb3Zlc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXIgdGhlIGVsZW1lbnQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYGZhbHNlYCBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiB2YXIgY252O1xuICogdmFyIGQgPSAzMDtcbiAqIHZhciBnO1xuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNudiA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIGNudi5tb3VzZU1vdmVkKGNoYW5nZVNpemUpOyAvLyBhdHRhY2ggbGlzdGVuZXIgZm9yXG4gKiAgIC8vIGFjdGl2aXR5IG9uIGNhbnZhcyBvbmx5XG4gKiAgIGQgPSAxMDtcbiAqICAgZyA9IDEwMDtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKGcpO1xuICogICBmaWxsKDIwMCk7XG4gKiAgIGVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCBkLCBkKTtcbiAqIH1cbiAqXG4gKiAvLyB0aGlzIGZ1bmN0aW9uIGZpcmVzIHdoZW4gbW91c2UgbW92ZXMgYW55d2hlcmUgb25cbiAqIC8vIHBhZ2VcbiAqIGZ1bmN0aW9uIG1vdXNlTW92ZWQoKSB7XG4gKiAgIGcgPSBnICsgNTtcbiAqICAgaWYgKGcgPiAyNTUpIHtcbiAqICAgICBnID0gMDtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgd2hlbiBtb3VzZSBtb3ZlcyBvdmVyIGNhbnZhc1xuICogZnVuY3Rpb24gY2hhbmdlU2l6ZSgpIHtcbiAqICAgZCA9IGQgKyAyO1xuICogICBpZiAoZCA+IDEwMCkge1xuICogICAgIGQgPSAwO1xuICogICB9XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICpcbiAqIEBhbHRcbiAqIG5vIGRpc3BsYXkuXG4gKlxuICovXG5wNS5FbGVtZW50LnByb3RvdHlwZS5tb3VzZU1vdmVkID0gZnVuY3Rpb24oZnhuKSB7XG4gIGFkanVzdExpc3RlbmVyKCdtb3VzZW1vdmUnLCBmeG4sIHRoaXMpO1xuICBhZGp1c3RMaXN0ZW5lcigndG91Y2htb3ZlJywgZnhuLCB0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFRoZSAubW91c2VPdmVyKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYWZ0ZXIgZXZlcnkgdGltZSBhXG4gKiBtb3VzZSBtb3ZlcyBvbnRvIHRoZSBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhblxuICogZWxlbWVudCBzcGVjaWZpYyBldmVudCBsaXN0ZW5lci5cbiAqXG4gKiBAbWV0aG9kIG1vdXNlT3ZlclxuICogQHBhcmFtICB7RnVuY3Rpb258Qm9vbGVhbn0gZnhuIGZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gYSBtb3VzZSBtb3Zlc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9udG8gdGhlIGVsZW1lbnQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYGZhbHNlYCBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiB2YXIgY252O1xuICogdmFyIGQ7XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgY252Lm1vdXNlT3ZlcihjaGFuZ2VHcmF5KTtcbiAqICAgZCA9IDEwO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGVsbGlwc2Uod2lkdGggLyAyLCBoZWlnaHQgLyAyLCBkLCBkKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBjaGFuZ2VHcmF5KCkge1xuICogICBkID0gZCArIDEwO1xuICogICBpZiAoZCA+IDEwMCkge1xuICogICAgIGQgPSAwO1xuICogICB9XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICpcbiAqIEBhbHRcbiAqIG5vIGRpc3BsYXkuXG4gKlxuICovXG5wNS5FbGVtZW50LnByb3RvdHlwZS5tb3VzZU92ZXIgPSBmdW5jdGlvbihmeG4pIHtcbiAgYWRqdXN0TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGZ4biwgdGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUaGUgLmNoYW5nZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgYW5cbiAqIGVsZW1lbnQgY2hhbmdlcy5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFuIGVsZW1lbnQgc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQG1ldGhvZCBjaGFuZ2VkXG4gKiBAcGFyYW0gIHtGdW5jdGlvbnxCb29sZWFufSBmeG4gZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiB0aGUgdmFsdWUgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBlbGVtZW50IGNoYW5nZXMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYGZhbHNlYCBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogdmFyIHNlbDtcbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdGV4dEFsaWduKENFTlRFUik7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgc2VsID0gY3JlYXRlU2VsZWN0KCk7XG4gKiAgIHNlbC5wb3NpdGlvbigxMCwgMTApO1xuICogICBzZWwub3B0aW9uKCdwZWFyJyk7XG4gKiAgIHNlbC5vcHRpb24oJ2tpd2knKTtcbiAqICAgc2VsLm9wdGlvbignZ3JhcGUnKTtcbiAqICAgc2VsLmNoYW5nZWQobXlTZWxlY3RFdmVudCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gbXlTZWxlY3RFdmVudCgpIHtcbiAqICAgdmFyIGl0ZW0gPSBzZWwudmFsdWUoKTtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICB0ZXh0KFwiaXQncyBhIFwiICsgaXRlbSArICchJywgNTAsIDUwKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgY2hlY2tib3g7XG4gKiB2YXIgY252O1xuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KCcgZmlsbCcpO1xuICogICBjaGVja2JveC5jaGFuZ2VkKGNoYW5nZUZpbGwpO1xuICogICBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBjbnYucG9zaXRpb24oMCwgMzApO1xuICogICBub0ZpbGwoKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIGVsbGlwc2UoNTAsIDUwLCA1MCwgNTApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGNoYW5nZUZpbGwoKSB7XG4gKiAgIGlmIChjaGVja2JveC5jaGVja2VkKCkpIHtcbiAqICAgICBmaWxsKDApO1xuICogICB9IGVsc2Uge1xuICogICAgIG5vRmlsbCgpO1xuICogICB9XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogZHJvcGRvd246IHBlYXIsIGtpd2ksIGdyYXBlLiBXaGVuIHNlbGVjdGVkIHRleHQgXCJpdHMgYVwiICsgc2VsZWN0aW9uIHNob3duLlxuICpcbiAqL1xucDUuRWxlbWVudC5wcm90b3R5cGUuY2hhbmdlZCA9IGZ1bmN0aW9uKGZ4bikge1xuICBhZGp1c3RMaXN0ZW5lcignY2hhbmdlJywgZnhuLCB0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFRoZSAuaW5wdXQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbnkgdXNlciBpbnB1dCBpc1xuICogZGV0ZWN0ZWQgd2l0aCBhbiBlbGVtZW50LiBUaGUgaW5wdXQgZXZlbnQgaXMgb2Z0ZW4gdXNlZFxuICogdG8gZGV0ZWN0IGtleXN0cm9rZXMgaW4gYSBpbnB1dCBlbGVtZW50LCBvciBjaGFuZ2VzIG9uIGFcbiAqIHNsaWRlciBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhbiBlbGVtZW50IHNwZWNpZmljXG4gKiBldmVudCBsaXN0ZW5lci5cbiAqXG4gKiBAbWV0aG9kIGlucHV0XG4gKiBAcGFyYW0gIHtGdW5jdGlvbnxCb29sZWFufSBmeG4gZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiBhbnkgdXNlciBpbnB1dCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGVkIHdpdGhpbiB0aGUgZWxlbWVudC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBgZmFsc2VgIGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZyBmdW5jdGlvbiB3aWxsIG5vIGxvbmdlciBmaXJlLlxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIE9wZW4geW91ciBjb25zb2xlIHRvIHNlZSB0aGUgb3V0cHV0XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIGlucCA9IGNyZWF0ZUlucHV0KCcnKTtcbiAqICAgaW5wLmlucHV0KG15SW5wdXRFdmVudCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gbXlJbnB1dEV2ZW50KCkge1xuICogICBjb25zb2xlLmxvZygneW91IGFyZSB0eXBpbmc6ICcsIHRoaXMudmFsdWUoKSk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gZGlzcGxheS5cbiAqXG4gKi9cbnA1LkVsZW1lbnQucHJvdG90eXBlLmlucHV0ID0gZnVuY3Rpb24oZnhuKSB7XG4gIGFkanVzdExpc3RlbmVyKCdpbnB1dCcsIGZ4biwgdGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUaGUgLm1vdXNlT3V0KCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYWZ0ZXIgZXZlcnkgdGltZSBhXG4gKiBtb3VzZSBtb3ZlcyBvZmYgdGhlIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFuXG4gKiBlbGVtZW50IHNwZWNpZmljIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBtZXRob2QgbW91c2VPdXRcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufEJvb2xlYW59IGZ4biBmdW5jdGlvbiB0byBiZSBmaXJlZCB3aGVuIGEgbW91c2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlcyBvZmYgb2YgYW4gZWxlbWVudC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBgZmFsc2VgIGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZyBmdW5jdGlvbiB3aWxsIG5vIGxvbmdlciBmaXJlLlxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIHZhciBjbnY7XG4gKiB2YXIgZDtcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBjbnYubW91c2VPdXQoY2hhbmdlR3JheSk7XG4gKiAgIGQgPSAxMDtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZCwgZCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gY2hhbmdlR3JheSgpIHtcbiAqICAgZCA9IGQgKyAxMDtcbiAqICAgaWYgKGQgPiAxMDApIHtcbiAqICAgICBkID0gMDtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIG5vIGRpc3BsYXkuXG4gKlxuICovXG5wNS5FbGVtZW50LnByb3RvdHlwZS5tb3VzZU91dCA9IGZ1bmN0aW9uKGZ4bikge1xuICBhZGp1c3RMaXN0ZW5lcignbW91c2VvdXQnLCBmeG4sIHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVGhlIC50b3VjaFN0YXJ0ZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhZnRlciBldmVyeSB0aW1lIGEgdG91Y2ggaXNcbiAqIHJlZ2lzdGVyZWQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGVsZW1lbnQgc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBtZXRob2QgdG91Y2hTdGFydGVkXG4gKiBAcGFyYW0gIHtGdW5jdGlvbnxCb29sZWFufSBmeG4gZnVuY3Rpb24gdG8gYmUgZmlyZWQgd2hlbiBhIHRvdWNoXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzIG92ZXIgdGhlIGVsZW1lbnQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYGZhbHNlYCBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiB2YXIgY252O1xuICogdmFyIGQ7XG4gKiB2YXIgZztcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBjbnYudG91Y2hTdGFydGVkKGNoYW5nZUdyYXkpOyAvLyBhdHRhY2ggbGlzdGVuZXIgZm9yXG4gKiAgIC8vIGNhbnZhcyBjbGljayBvbmx5XG4gKiAgIGQgPSAxMDtcbiAqICAgZyA9IDEwMDtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKGcpO1xuICogICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZCwgZCk7XG4gKiB9XG4gKlxuICogLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyB3aXRoIGFueSB0b3VjaCBhbnl3aGVyZVxuICogZnVuY3Rpb24gdG91Y2hTdGFydGVkKCkge1xuICogICBkID0gZCArIDEwO1xuICogfVxuICpcbiAqIC8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgb25seSB3aGVuIGNudiBpcyBjbGlja2VkXG4gKiBmdW5jdGlvbiBjaGFuZ2VHcmF5KCkge1xuICogICBnID0gcmFuZG9tKDAsIDI1NSk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gZGlzcGxheS5cbiAqXG4gKi9cbnA1LkVsZW1lbnQucHJvdG90eXBlLnRvdWNoU3RhcnRlZCA9IGZ1bmN0aW9uKGZ4bikge1xuICBhZGp1c3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ4biwgdGhpcyk7XG4gIGFkanVzdExpc3RlbmVyKCdtb3VzZWRvd24nLCBmeG4sIHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVGhlIC50b3VjaE1vdmVkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYWZ0ZXIgZXZlcnkgdGltZSBhIHRvdWNoIG1vdmUgaXNcbiAqIHJlZ2lzdGVyZWQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGVsZW1lbnQgc3BlY2lmaWMgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBtZXRob2QgdG91Y2hNb3ZlZFxuICogQHBhcmFtICB7RnVuY3Rpb258Qm9vbGVhbn0gZnhuIGZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gYSB0b3VjaCBtb3ZlcyBvdmVyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVsZW1lbnQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYGZhbHNlYCBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiB2YXIgY252O1xuICogdmFyIGc7XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgY252LnRvdWNoTW92ZWQoY2hhbmdlR3JheSk7IC8vIGF0dGFjaCBsaXN0ZW5lciBmb3JcbiAqICAgLy8gY2FudmFzIGNsaWNrIG9ubHlcbiAqICAgZyA9IDEwMDtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKGcpO1xuICogfVxuICpcbiAqIC8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgb25seSB3aGVuIGNudiBpcyBjbGlja2VkXG4gKiBmdW5jdGlvbiBjaGFuZ2VHcmF5KCkge1xuICogICBnID0gcmFuZG9tKDAsIDI1NSk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gZGlzcGxheS5cbiAqXG4gKi9cbnA1LkVsZW1lbnQucHJvdG90eXBlLnRvdWNoTW92ZWQgPSBmdW5jdGlvbihmeG4pIHtcbiAgYWRqdXN0TGlzdGVuZXIoJ3RvdWNobW92ZScsIGZ4biwgdGhpcyk7XG4gIGFkanVzdExpc3RlbmVyKCdtb3VzZW1vdmUnLCBmeG4sIHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVGhlIC50b3VjaEVuZGVkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYWZ0ZXIgZXZlcnkgdGltZSBhIHRvdWNoIGlzXG4gKiByZWdpc3RlcmVkLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBlbGVtZW50IHNwZWNpZmljIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAbWV0aG9kIHRvdWNoRW5kZWRcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufEJvb2xlYW59IGZ4biBmdW5jdGlvbiB0byBiZSBmaXJlZCB3aGVuIGEgdG91Y2ggZW5kc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXIgdGhlIGVsZW1lbnQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYGZhbHNlYCBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiB2YXIgY252O1xuICogdmFyIGQ7XG4gKiB2YXIgZztcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjbnYgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBjbnYudG91Y2hFbmRlZChjaGFuZ2VHcmF5KTsgLy8gYXR0YWNoIGxpc3RlbmVyIGZvclxuICogICAvLyBjYW52YXMgY2xpY2sgb25seVxuICogICBkID0gMTA7XG4gKiAgIGcgPSAxMDA7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZChnKTtcbiAqICAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGQsIGQpO1xuICogfVxuICpcbiAqIC8vIHRoaXMgZnVuY3Rpb24gZmlyZXMgd2l0aCBhbnkgdG91Y2ggYW55d2hlcmVcbiAqIGZ1bmN0aW9uIHRvdWNoRW5kZWQoKSB7XG4gKiAgIGQgPSBkICsgMTA7XG4gKiB9XG4gKlxuICogLy8gdGhpcyBmdW5jdGlvbiBmaXJlcyBvbmx5IHdoZW4gY252IGlzIGNsaWNrZWRcbiAqIGZ1bmN0aW9uIGNoYW5nZUdyYXkoKSB7XG4gKiAgIGcgPSByYW5kb20oMCwgMjU1KTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKlxuICogQGFsdFxuICogbm8gZGlzcGxheS5cbiAqXG4gKi9cbnA1LkVsZW1lbnQucHJvdG90eXBlLnRvdWNoRW5kZWQgPSBmdW5jdGlvbihmeG4pIHtcbiAgYWRqdXN0TGlzdGVuZXIoJ3RvdWNoZW5kJywgZnhuLCB0aGlzKTtcbiAgYWRqdXN0TGlzdGVuZXIoJ21vdXNldXAnLCBmeG4sIHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVGhlIC5kcmFnT3ZlcigpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGFmdGVyIGV2ZXJ5IHRpbWUgYVxuICogZmlsZSBpcyBkcmFnZ2VkIG92ZXIgdGhlIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFuXG4gKiBlbGVtZW50IHNwZWNpZmljIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBtZXRob2QgZHJhZ092ZXJcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufEJvb2xlYW59IGZ4biBmdW5jdGlvbiB0byBiZSBmaXJlZCB3aGVuIGEgZmlsZSBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWQgb3ZlciB0aGUgZWxlbWVudC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBgZmFsc2VgIGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUgcHJldmlvdXNseVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZyBmdW5jdGlvbiB3aWxsIG5vIGxvbmdlciBmaXJlLlxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiAvLyBUbyB0ZXN0IHRoaXMgc2tldGNoLCBzaW1wbHkgZHJhZyBhXG4gKiAvLyBmaWxlIG92ZXIgdGhlIGNhbnZhc1xuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBjID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICB0ZXh0QWxpZ24oQ0VOVEVSKTtcbiAqICAgdGV4dCgnRHJhZyBmaWxlJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAqICAgYy5kcmFnT3ZlcihkcmFnT3ZlckNhbGxiYWNrKTtcbiAqIH1cbiAqXG4gKiAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyXG4gKiAvLyBhIGZpbGUgaXMgZHJhZ2dlZCBvdmVyIHRoZSBjYW52YXNcbiAqIGZ1bmN0aW9uIGRyYWdPdmVyQ2FsbGJhY2soKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqICAgdGV4dCgnRHJhZ2dlZCBvdmVyJywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqIEBhbHRcbiAqIG5vdGhpbmcgZGlzcGxheWVkXG4gKi9cbnA1LkVsZW1lbnQucHJvdG90eXBlLmRyYWdPdmVyID0gZnVuY3Rpb24oZnhuKSB7XG4gIGFkanVzdExpc3RlbmVyKCdkcmFnb3ZlcicsIGZ4biwgdGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUaGUgLmRyYWdMZWF2ZSgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGFmdGVyIGV2ZXJ5IHRpbWUgYVxuICogZHJhZ2dlZCBmaWxlIGxlYXZlcyB0aGUgZWxlbWVudCBhcmVhLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhblxuICogZWxlbWVudCBzcGVjaWZpYyBldmVudCBsaXN0ZW5lci5cbiAqXG4gKiBAbWV0aG9kIGRyYWdMZWF2ZVxuICogQHBhcmFtICB7RnVuY3Rpb258Qm9vbGVhbn0gZnhuIGZ1bmN0aW9uIHRvIGJlIGZpcmVkIHdoZW4gYSBmaWxlIGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZCBvZmYgdGhlIGVsZW1lbnQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYGZhbHNlYCBpcyBwYXNzZWQgaW5zdGVhZCwgdGhlIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmcgZnVuY3Rpb24gd2lsbCBubyBsb25nZXIgZmlyZS5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogLy8gVG8gdGVzdCB0aGlzIHNrZXRjaCwgc2ltcGx5IGRyYWcgYSBmaWxlXG4gKiAvLyBvdmVyIGFuZCB0aGVuIG91dCBvZiB0aGUgY2FudmFzIGFyZWFcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgYyA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgdGV4dEFsaWduKENFTlRFUik7XG4gKiAgIHRleHQoJ0RyYWcgZmlsZScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gKiAgIGMuZHJhZ0xlYXZlKGRyYWdMZWF2ZUNhbGxiYWNrKTtcbiAqIH1cbiAqXG4gKiAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyXG4gKiAvLyBhIGZpbGUgaXMgZHJhZ2dlZCBvdXQgb2YgdGhlIGNhbnZhc1xuICogZnVuY3Rpb24gZHJhZ0xlYXZlQ2FsbGJhY2soKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqICAgdGV4dCgnRHJhZ2dlZCBvZmYnLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICogQGFsdFxuICogbm90aGluZyBkaXNwbGF5ZWRcbiAqL1xucDUuRWxlbWVudC5wcm90b3R5cGUuZHJhZ0xlYXZlID0gZnVuY3Rpb24oZnhuKSB7XG4gIGFkanVzdExpc3RlbmVyKCdkcmFnbGVhdmUnLCBmeG4sIHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVGhlIC5kcm9wKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGZpbGUgZHJvcHBlZCBvbiB0aGUgZWxlbWVudC5cbiAqIEl0IHJlcXVpcmVzIGEgY2FsbGJhY2sgdGhhdCBpcyBwYXNzZWQgYSBwNS5GaWxlIG9iamVjdC4gIFlvdSBjYW5cbiAqIG9wdGlvbmFsbHkgcGFzcyB0d28gY2FsbGJhY2tzLCB0aGUgZmlyc3Qgb25lIChyZXF1aXJlZCkgaXMgdHJpZ2dlcmVkXG4gKiBmb3IgZWFjaCBmaWxlIGRyb3BwZWQgd2hlbiB0aGUgZmlsZSBpcyBsb2FkZWQuICBUaGUgc2Vjb25kIChvcHRpb25hbClcbiAqIGlzIHRyaWdnZXJlZCBqdXN0IG9uY2Ugd2hlbiBhIGZpbGUgKG9yIGZpbGVzKSBhcmUgZHJvcHBlZC5cbiAqXG4gKiBAbWV0aG9kIGRyb3BcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayAgY2FsbGJhY2sgdHJpZ2dlcmVkIHdoZW4gZmlsZXMgYXJlIGRyb3BwZWQuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gW2Z4bl0gICAgICAgY2FsbGJhY2sgdG8gcmVjZWl2ZSBsb2FkZWQgZmlsZS5cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBjID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICB0ZXh0QWxpZ24oQ0VOVEVSKTtcbiAqICAgdGV4dCgnZHJvcCBpbWFnZScsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gKiAgIGMuZHJvcChnb3RGaWxlKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBnb3RGaWxlKGZpbGUpIHtcbiAqICAgdmFyIGltZyA9IGNyZWF0ZUltZyhmaWxlLmRhdGEpLmhpZGUoKTtcbiAqICAgLy8gRHJhdyB0aGUgaW1hZ2Ugb250byB0aGUgY2FudmFzXG4gKiAgIGltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogQ2FudmFzIHR1cm5zIGludG8gd2hhdGV2ZXIgaW1hZ2UgaXMgZHJhZ2dlZC9kcm9wcGVkIG9udG8gaXQuXG4gKlxuICovXG5wNS5FbGVtZW50LnByb3RvdHlwZS5kcm9wID0gZnVuY3Rpb24oY2FsbGJhY2ssIGZ4bikge1xuICAvLyBNYWtlIGEgZmlsZSBsb2FkZXIgY2FsbGJhY2sgYW5kIHRyaWdnZXIgdXNlcidzIGNhbGxiYWNrXG4gIGZ1bmN0aW9uIG1ha2VMb2FkZXIodGhlRmlsZSkge1xuICAgIC8vIE1ha2luZyBhIHA1LkZpbGUgb2JqZWN0XG4gICAgdmFyIHA1ZmlsZSA9IG5ldyBwNS5GaWxlKHRoZUZpbGUpO1xuICAgIHJldHVybiBmdW5jdGlvbihlKSB7XG4gICAgICBwNWZpbGUuZGF0YSA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGNhbGxiYWNrKHA1ZmlsZSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIElzIHRoZSBmaWxlIHN0dWZmIHN1cHBvcnRlZD9cbiAgaWYgKHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuQmxvYikge1xuICAgIC8vIElmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gZHJvcCB5b3UndmUgZ290IHRvIHR1cm4gb2ZmXG4gICAgLy8gYSBsb3Qgb2YgZGVmYXVsdCBiZWhhdmlvclxuICAgIGF0dGFjaExpc3RlbmVyKFxuICAgICAgJ2RyYWdvdmVyJyxcbiAgICAgIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSxcbiAgICAgIHRoaXNcbiAgICApO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhIGRyYWcgYXJlYSB3ZSBuZWVkIHRvIHR1cm4gb2ZmIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgYXR0YWNoTGlzdGVuZXIoXG4gICAgICAnZHJhZ2xlYXZlJyxcbiAgICAgIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSxcbiAgICAgIHRoaXNcbiAgICApO1xuXG4gICAgLy8gSWYganVzdCBvbmUgYXJndW1lbnQgaXQncyB0aGUgY2FsbGJhY2sgZm9yIHRoZSBmaWxlc1xuICAgIGlmICh0eXBlb2YgZnhuICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgYXR0YWNoTGlzdGVuZXIoJ2Ryb3AnLCBmeG4sIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIERlYWwgd2l0aCB0aGUgZmlsZXNcbiAgICBhdHRhY2hMaXN0ZW5lcihcbiAgICAgICdkcm9wJyxcbiAgICAgIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIC8vIEEgRmlsZUxpc3RcbiAgICAgICAgdmFyIGZpbGVzID0gZXZ0LmRhdGFUcmFuc2Zlci5maWxlcztcblxuICAgICAgICAvLyBMb2FkIGVhY2ggb25lIGFuZCB0cmlnZ2VyIHRoZSBjYWxsYmFja1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGYgPSBmaWxlc1tpXTtcbiAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICByZWFkZXIub25sb2FkID0gbWFrZUxvYWRlcihmKTtcblxuICAgICAgICAgIC8vIFRleHQgb3IgZGF0YT9cbiAgICAgICAgICAvLyBUaGlzIHNob3VsZCBsaWtlbHkgYmUgaW1wcm92ZWRcbiAgICAgICAgICBpZiAoZi50eXBlLmluZGV4T2YoJ3RleHQnKSA+IC0xKSB7XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGhpc1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJ1RoZSBGaWxlIEFQSXMgYXJlIG5vdCBmdWxseSBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLicpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBHZW5lcmFsIGhhbmRsZXIgZm9yIGV2ZW50IGF0dGFjaGluZyBhbmQgZGV0YWNoaW5nXG5mdW5jdGlvbiBhZGp1c3RMaXN0ZW5lcihldiwgZnhuLCBjdHgpIHtcbiAgaWYgKGZ4biA9PT0gZmFsc2UpIHtcbiAgICBkZXRhY2hMaXN0ZW5lcihldiwgY3R4KTtcbiAgfSBlbHNlIHtcbiAgICBhdHRhY2hMaXN0ZW5lcihldiwgZnhuLCBjdHgpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiBhdHRhY2hMaXN0ZW5lcihldiwgZnhuLCBjdHgpIHtcbiAgLy8gTE0gcmVtb3ZpbmcsIG5vdCBzdXJlIHdoeSB3ZSBoYWQgdGhpcz9cbiAgLy8gdmFyIF90aGlzID0gY3R4O1xuICAvLyB2YXIgZiA9IGZ1bmN0aW9uIChlKSB7IGZ4bihlLCBfdGhpcyk7IH07XG5cbiAgLy8gZGV0YWNoIHRoZSBvbGQgbGlzdGVuZXIgaWYgdGhlcmUgd2FzIG9uZVxuICBpZiAoY3R4Ll9ldmVudHNbZXZdKSB7XG4gICAgZGV0YWNoTGlzdGVuZXIoZXYsIGN0eCk7XG4gIH1cbiAgdmFyIGYgPSBmeG4uYmluZChjdHgpO1xuICBjdHguZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXYsIGYsIGZhbHNlKTtcbiAgY3R4Ll9ldmVudHNbZXZdID0gZjtcbn1cblxuZnVuY3Rpb24gZGV0YWNoTGlzdGVuZXIoZXYsIGN0eCkge1xuICB2YXIgZiA9IGN0eC5fZXZlbnRzW2V2XTtcbiAgY3R4LmVsdC5yZW1vdmVFdmVudExpc3RlbmVyKGV2LCBmLCBmYWxzZSk7XG4gIGN0eC5fZXZlbnRzW2V2XSA9IG51bGw7XG59XG5cbi8qKlxuICogSGVscGVyIGZ4biBmb3Igc2hhcmluZyBwaXhlbCBtZXRob2RzXG4gKlxuICovXG5wNS5FbGVtZW50LnByb3RvdHlwZS5fc2V0UHJvcGVydHkgPSBmdW5jdGlvbihwcm9wLCB2YWx1ZSkge1xuICB0aGlzW3Byb3BdID0gdmFsdWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1LkVsZW1lbnQ7XG5cbn0se1wiLi9jb3JlXCI6MjJ9XSwyODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgUmVuZGVyaW5nXG4gKiBAc3VibW9kdWxlIFJlbmRlcmluZ1xuICogQGZvciBwNVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi9jb3JlJyk7XG52YXIgY29uc3RhbnRzID0gX2RlcmVxXygnLi9jb25zdGFudHMnKTtcblxuLyoqXG4gKiBUaGluIHdyYXBwZXIgYXJvdW5kIGEgcmVuZGVyZXIsIHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIGFcbiAqIGdyYXBoaWNzIGJ1ZmZlciBvYmplY3QuIFVzZSB0aGlzIGNsYXNzIGlmIHlvdSBuZWVkXG4gKiB0byBkcmF3IGludG8gYW4gb2ZmLXNjcmVlbiBncmFwaGljcyBidWZmZXIuIFRoZSB0d28gcGFyYW1ldGVycyBkZWZpbmUgdGhlXG4gKiB3aWR0aCBhbmQgaGVpZ2h0IGluIHBpeGVscy4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBmb3IgdGhpcyBjbGFzcyBhcmVcbiAqIGV4dGVuc2l2ZSwgYnV0IG1pcnJvciB0aGUgbm9ybWFsIGRyYXdpbmcgQVBJIGZvciBwNS5cbiAqXG4gKiBAY2xhc3MgcDUuR3JhcGhpY3NcbiAqIEBleHRlbmRzIHA1LkVsZW1lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3ICAgICAgICAgICAgd2lkdGhcbiAqIEBwYXJhbSB7TnVtYmVyfSBoICAgICAgICAgICAgaGVpZ2h0XG4gKiBAcGFyYW0ge0NvbnN0YW50fSByZW5kZXJlciAgIHRoZSByZW5kZXJlciB0byB1c2UsIGVpdGhlciBQMkQgb3IgV0VCR0xcbiAqIEBwYXJhbSB7cDV9IFtwSW5zdF0gICAgICAgICAgcG9pbnRlciB0byBwNSBpbnN0YW5jZVxuICovXG5wNS5HcmFwaGljcyA9IGZ1bmN0aW9uKHcsIGgsIHJlbmRlcmVyLCBwSW5zdCkge1xuICB2YXIgciA9IHJlbmRlcmVyIHx8IGNvbnN0YW50cy5QMkQ7XG5cbiAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgdmFyIG5vZGUgPSBwSW5zdC5fdXNlck5vZGUgfHwgZG9jdW1lbnQuYm9keTtcbiAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG5cbiAgcDUuRWxlbWVudC5jYWxsKHRoaXMsIHRoaXMuY2FudmFzLCBwSW5zdCwgZmFsc2UpO1xuXG4gIC8vIGJpbmQgbWV0aG9kcyBhbmQgcHJvcHMgb2YgcDUgdG8gdGhlIG5ldyBvYmplY3RcbiAgZm9yICh2YXIgcCBpbiBwNS5wcm90b3R5cGUpIHtcbiAgICBpZiAoIXRoaXNbcF0pIHtcbiAgICAgIGlmICh0eXBlb2YgcDUucHJvdG90eXBlW3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXNbcF0gPSBwNS5wcm90b3R5cGVbcF0uYmluZCh0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbcF0gPSBwNS5wcm90b3R5cGVbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcDUucHJvdG90eXBlLl9pbml0aWFsaXplSW5zdGFuY2VWYXJpYWJsZXMuYXBwbHkodGhpcyk7XG4gIHRoaXMud2lkdGggPSB3O1xuICB0aGlzLmhlaWdodCA9IGg7XG4gIHRoaXMuX3BpeGVsRGVuc2l0eSA9IHBJbnN0Ll9waXhlbERlbnNpdHk7XG5cbiAgaWYgKHIgPT09IGNvbnN0YW50cy5XRUJHTCkge1xuICAgIHRoaXMuX3JlbmRlcmVyID0gbmV3IHA1LlJlbmRlcmVyR0wodGhpcy5jYW52YXMsIHRoaXMsIGZhbHNlKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9yZW5kZXJlciA9IG5ldyBwNS5SZW5kZXJlcjJEKHRoaXMuY2FudmFzLCB0aGlzLCBmYWxzZSk7XG4gIH1cbiAgcEluc3QuX2VsZW1lbnRzLnB1c2godGhpcyk7XG5cbiAgdGhpcy5fcmVuZGVyZXIucmVzaXplKHcsIGgpO1xuICB0aGlzLl9yZW5kZXJlci5fYXBwbHlEZWZhdWx0cygpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LkdyYXBoaWNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocDUuRWxlbWVudC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIFJlbW92ZXMgYSBHcmFwaGljcyBvYmplY3QgZnJvbSB0aGUgcGFnZSBhbmQgZnJlZXMgYW55IHJlc291cmNlc1xuICogYXNzb2NpYXRlZCB3aXRoIGl0LlxuICpcbiAqIEBtZXRob2QgcmVtb3ZlXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIHZhciBiZztcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBiZyA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIGJnLmJhY2tncm91bmQoMCk7XG4gKiAgIGltYWdlKGJnLCAwLCAwKTtcbiAqICAgYmcucmVtb3ZlKCk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogPGRpdj48Y29kZT5cbiAqIHZhciBiZztcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBwaXhlbERlbnNpdHkoMSk7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIHN0cm9rZSgyNTUpO1xuICogICBmaWxsKDApO1xuICpcbiAqICAgLy8gY3JlYXRlIGFuZCBkcmF3IHRoZSBiYWNrZ3JvdW5kIGltYWdlXG4gKiAgIGJnID0gY3JlYXRlR3JhcGhpY3MoMTAwLCAxMDApO1xuICogICBiZy5iYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIGJnLmVsbGlwc2UoNTAsIDUwLCA4MCwgODApO1xuICogfVxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgdmFyIHQgPSBtaWxsaXMoKSAvIDEwMDA7XG4gKiAgIC8vIGRyYXcgdGhlIGJhY2tncm91bmRcbiAqICAgaWYgKGJnKSB7XG4gKiAgICAgaW1hZ2UoYmcsIGZyYW1lQ291bnQgJSAxMDAsIDApO1xuICogICAgIGltYWdlKGJnLCBmcmFtZUNvdW50ICUgMTAwIC0gMTAwLCAwKTtcbiAqICAgfVxuICogICAvLyBkcmF3IHRoZSBmb3JlZ3JvdW5kXG4gKiAgIHZhciBwID0gcDUuVmVjdG9yLmZyb21BbmdsZSh0LCAzNSkuYWRkKDUwLCA1MCk7XG4gKiAgIGVsbGlwc2UocC54LCBwLnksIDMwKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIG1vdXNlQ2xpY2tlZCgpIHtcbiAqICAgLy8gcmVtb3ZlIHRoZSBiYWNrZ3JvdW5kXG4gKiAgIGlmIChiZykge1xuICogICAgIGJnLnJlbW92ZSgpO1xuICogICAgIGJnID0gbnVsbDtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIG5vIGltYWdlXG4gKiBhIG11bHRpLWNvbG9yZWQgY2lyY2xlIG1vdmluZyBiYWNrIGFuZCBmb3J0aCBvdmVyIGEgc2Nyb2xsaW5nIGJhY2tncm91bmQuXG4gKlxuICovXG5wNS5HcmFwaGljcy5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmVsdC5wYXJlbnROb2RlKSB7XG4gICAgdGhpcy5lbHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsdCk7XG4gIH1cbiAgdmFyIGlkeCA9IHRoaXMuX3BJbnN0Ll9lbGVtZW50cy5pbmRleE9mKHRoaXMpO1xuICBpZiAoaWR4ICE9PSAtMSkge1xuICAgIHRoaXMuX3BJbnN0Ll9lbGVtZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgfVxuICBmb3IgKHZhciBlbHRfZXYgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgdGhpcy5lbHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlbHRfZXYsIHRoaXMuX2V2ZW50c1tlbHRfZXZdKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNS5HcmFwaGljcztcblxufSx7XCIuL2NvbnN0YW50c1wiOjIxLFwiLi9jb3JlXCI6MjJ9XSwyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgUmVuZGVyaW5nXG4gKiBAc3VibW9kdWxlIFJlbmRlcmluZ1xuICogQGZvciBwNVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi9jb3JlJyk7XG52YXIgY29uc3RhbnRzID0gX2RlcmVxXygnLi4vY29yZS9jb25zdGFudHMnKTtcblxuLyoqXG4gKiBNYWluIGdyYXBoaWNzIGFuZCByZW5kZXJpbmcgY29udGV4dCwgYXMgd2VsbCBhcyB0aGUgYmFzZSBBUElcbiAqIGltcGxlbWVudGF0aW9uIGZvciBwNS5qcyBcImNvcmVcIi4gVG8gYmUgdXNlZCBhcyB0aGUgc3VwZXJjbGFzcyBmb3JcbiAqIFJlbmRlcmVyMkQgYW5kIFJlbmRlcmVyM0QgY2xhc3NlcywgcmVzcGVjaXR2ZWx5LlxuICpcbiAqIEBjbGFzcyBwNS5SZW5kZXJlclxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBwNS5FbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gZWx0IERPTSBub2RlIHRoYXQgaXMgd3JhcHBlZFxuICogQHBhcmFtIHtwNX0gW3BJbnN0XSBwb2ludGVyIHRvIHA1IGluc3RhbmNlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtpc01haW5DYW52YXNdIHdoZXRoZXIgd2UncmUgdXNpbmcgaXQgYXMgbWFpbiBjYW52YXNcbiAqL1xucDUuUmVuZGVyZXIgPSBmdW5jdGlvbihlbHQsIHBJbnN0LCBpc01haW5DYW52YXMpIHtcbiAgcDUuRWxlbWVudC5jYWxsKHRoaXMsIGVsdCwgcEluc3QpO1xuICB0aGlzLmNhbnZhcyA9IGVsdDtcbiAgdGhpcy5fcEluc3QgPSBwSW5zdDtcbiAgaWYgKGlzTWFpbkNhbnZhcykge1xuICAgIHRoaXMuX2lzTWFpbkNhbnZhcyA9IHRydWU7XG4gICAgLy8gZm9yIHBpeGVsIG1ldGhvZCBzaGFyaW5nIHdpdGggcGltYWdlXG4gICAgdGhpcy5fcEluc3QuX3NldFByb3BlcnR5KCdfY3VyRWxlbWVudCcsIHRoaXMpO1xuICAgIHRoaXMuX3BJbnN0Ll9zZXRQcm9wZXJ0eSgnY2FudmFzJywgdGhpcy5jYW52YXMpO1xuICAgIHRoaXMuX3BJbnN0Ll9zZXRQcm9wZXJ0eSgnd2lkdGgnLCB0aGlzLndpZHRoKTtcbiAgICB0aGlzLl9wSW5zdC5fc2V0UHJvcGVydHkoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBoaWRlIGlmIG9mZnNjcmVlbiBidWZmZXIgYnkgZGVmYXVsdFxuICAgIHRoaXMuY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5fc3R5bGVzID0gW107IC8vIG5vbi1tYWluIGVsdCBzdHlsZXMgc3RvcmVkIGluIHA1LlJlbmRlcmVyXG4gIH1cblxuICB0aGlzLl90ZXh0U2l6ZSA9IDEyO1xuICB0aGlzLl90ZXh0TGVhZGluZyA9IDE1O1xuICB0aGlzLl90ZXh0Rm9udCA9ICdzYW5zLXNlcmlmJztcbiAgdGhpcy5fdGV4dFN0eWxlID0gY29uc3RhbnRzLk5PUk1BTDtcbiAgdGhpcy5fdGV4dEFzY2VudCA9IG51bGw7XG4gIHRoaXMuX3RleHREZXNjZW50ID0gbnVsbDtcblxuICB0aGlzLl9yZWN0TW9kZSA9IGNvbnN0YW50cy5DT1JORVI7XG4gIHRoaXMuX2VsbGlwc2VNb2RlID0gY29uc3RhbnRzLkNFTlRFUjtcbiAgdGhpcy5fY3VydmVUaWdodG5lc3MgPSAwO1xuICB0aGlzLl9pbWFnZU1vZGUgPSBjb25zdGFudHMuQ09STkVSO1xuXG4gIHRoaXMuX3RpbnQgPSBudWxsO1xuICB0aGlzLl9kb1N0cm9rZSA9IHRydWU7XG4gIHRoaXMuX2RvRmlsbCA9IHRydWU7XG4gIHRoaXMuX3N0cm9rZVNldCA9IGZhbHNlO1xuICB0aGlzLl9maWxsU2V0ID0gZmFsc2U7XG59O1xuXG5wNS5SZW5kZXJlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHA1LkVsZW1lbnQucHJvdG90eXBlKTtcblxuLy8gdGhlIHJlbmRlcmVyIHNob3VsZCByZXR1cm4gYSAnc3R5bGUnIG9iamVjdCB0aGF0IGl0IHdpc2hlcyB0b1xuLy8gc3RvcmUgb24gdGhlIHB1c2ggc3RhY2suXG5wNS5SZW5kZXJlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIF9kb1N0cm9rZTogdGhpcy5fZG9TdHJva2UsXG4gICAgICBfc3Ryb2tlU2V0OiB0aGlzLl9zdHJva2VTZXQsXG4gICAgICBfZG9GaWxsOiB0aGlzLl9kb0ZpbGwsXG4gICAgICBfZmlsbFNldDogdGhpcy5fZmlsbFNldCxcbiAgICAgIF90aW50OiB0aGlzLl90aW50LFxuICAgICAgX2ltYWdlTW9kZTogdGhpcy5faW1hZ2VNb2RlLFxuICAgICAgX3JlY3RNb2RlOiB0aGlzLl9yZWN0TW9kZSxcbiAgICAgIF9lbGxpcHNlTW9kZTogdGhpcy5fZWxsaXBzZU1vZGUsXG4gICAgICBfdGV4dEZvbnQ6IHRoaXMuX3RleHRGb250LFxuICAgICAgX3RleHRMZWFkaW5nOiB0aGlzLl90ZXh0TGVhZGluZyxcbiAgICAgIF90ZXh0U2l6ZTogdGhpcy5fdGV4dFNpemUsXG4gICAgICBfdGV4dFN0eWxlOiB0aGlzLl90ZXh0U3R5bGVcbiAgICB9XG4gIH07XG59O1xuXG4vLyB0aGlzIGlzIGltcGxlbWVudGF0aW9uIG9mIE9iamVjdC5hc3NpZ24oKSB3aGljaCBpcyB1bmF2YWlsYWJsZSBpblxuLy8gSUUxMSBhbmQgKG5vbi1DaHJvbWUpIEFuZHJvaWQgYnJvd3NlcnMuXG4vLyBUaGUgYXNzaWduKCkgbWV0aG9kIGlzIHVzZWQgdG8gY29weSB0aGUgdmFsdWVzIG9mIGFsbCBlbnVtZXJhYmxlXG4vLyBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdC5cbi8vIEl0IHdpbGwgcmV0dXJuIHRoZSB0YXJnZXQgb2JqZWN0LlxuZnVuY3Rpb24gYXNzaWduKHRvLCBmaXJzdFNvdXJjZSkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuZXh0U291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgIGlmIChuZXh0U291cmNlID09PSB1bmRlZmluZWQgfHwgbmV4dFNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgbmV4dEtleSBpbiBuZXh0U291cmNlKVxuICAgICAgaWYgKG5leHRTb3VyY2UuaGFzT3duUHJvcGVydHkobmV4dEtleSkpIHtcbiAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0bztcbn1cblxuLy8gYSBwb3AoKSBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3Ncbi8vIHRoZSByZW5kZXJlciBpcyBwYXNzZWQgdGhlICdzdHlsZScgb2JqZWN0IHRoYXQgaXQgcmV0dXJuZWRcbi8vIGZyb20gaXRzIHB1c2goKSBtZXRob2QuXG5wNS5SZW5kZXJlci5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24oc3R5bGUpIHtcbiAgaWYgKHN0eWxlLnByb3BlcnRpZXMpIHtcbiAgICAvLyBjb3B5IHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUgcmVuZGVyZXJcbiAgICBhc3NpZ24odGhpcywgc3R5bGUucHJvcGVydGllcyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVzaXplIG91ciBjYW52YXMgZWxlbWVudC5cbiAqL1xucDUuUmVuZGVyZXIucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uKHcsIGgpIHtcbiAgdGhpcy53aWR0aCA9IHc7XG4gIHRoaXMuaGVpZ2h0ID0gaDtcbiAgdGhpcy5lbHQud2lkdGggPSB3ICogdGhpcy5fcEluc3QuX3BpeGVsRGVuc2l0eTtcbiAgdGhpcy5lbHQuaGVpZ2h0ID0gaCAqIHRoaXMuX3BJbnN0Ll9waXhlbERlbnNpdHk7XG4gIHRoaXMuZWx0LnN0eWxlLndpZHRoID0gdyArICdweCc7XG4gIHRoaXMuZWx0LnN0eWxlLmhlaWdodCA9IGggKyAncHgnO1xuICBpZiAodGhpcy5faXNNYWluQ2FudmFzKSB7XG4gICAgdGhpcy5fcEluc3QuX3NldFByb3BlcnR5KCd3aWR0aCcsIHRoaXMud2lkdGgpO1xuICAgIHRoaXMuX3BJbnN0Ll9zZXRQcm9wZXJ0eSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpO1xuICB9XG59O1xuXG5wNS5SZW5kZXJlci5wcm90b3R5cGUudGV4dExlYWRpbmcgPSBmdW5jdGlvbihsKSB7XG4gIGlmICh0eXBlb2YgbCA9PT0gJ251bWJlcicpIHtcbiAgICB0aGlzLl9zZXRQcm9wZXJ0eSgnX3RleHRMZWFkaW5nJywgbCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fdGV4dExlYWRpbmc7XG59O1xuXG5wNS5SZW5kZXJlci5wcm90b3R5cGUudGV4dFNpemUgPSBmdW5jdGlvbihzKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gJ251bWJlcicpIHtcbiAgICB0aGlzLl9zZXRQcm9wZXJ0eSgnX3RleHRTaXplJywgcyk7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ190ZXh0TGVhZGluZycsIHMgKiBjb25zdGFudHMuX0RFRkFVTFRfTEVBRE1VTFQpO1xuICAgIHJldHVybiB0aGlzLl9hcHBseVRleHRQcm9wZXJ0aWVzKCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fdGV4dFNpemU7XG59O1xuXG5wNS5SZW5kZXJlci5wcm90b3R5cGUudGV4dFN0eWxlID0gZnVuY3Rpb24ocykge1xuICBpZiAocykge1xuICAgIGlmIChcbiAgICAgIHMgPT09IGNvbnN0YW50cy5OT1JNQUwgfHxcbiAgICAgIHMgPT09IGNvbnN0YW50cy5JVEFMSUMgfHxcbiAgICAgIHMgPT09IGNvbnN0YW50cy5CT0xEXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZXRQcm9wZXJ0eSgnX3RleHRTdHlsZScsIHMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9hcHBseVRleHRQcm9wZXJ0aWVzKCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fdGV4dFN0eWxlO1xufTtcblxucDUuUmVuZGVyZXIucHJvdG90eXBlLnRleHRBc2NlbnQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX3RleHRBc2NlbnQgPT09IG51bGwpIHtcbiAgICB0aGlzLl91cGRhdGVUZXh0TWV0cmljcygpO1xuICB9XG4gIHJldHVybiB0aGlzLl90ZXh0QXNjZW50O1xufTtcblxucDUuUmVuZGVyZXIucHJvdG90eXBlLnRleHREZXNjZW50ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl90ZXh0RGVzY2VudCA9PT0gbnVsbCkge1xuICAgIHRoaXMuX3VwZGF0ZVRleHRNZXRyaWNzKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3RleHREZXNjZW50O1xufTtcblxucDUuUmVuZGVyZXIucHJvdG90eXBlLl9hcHBseURlZmF1bHRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBIZWxwZXIgZnhuIHRvIGNoZWNrIGZvbnQgdHlwZSAoc3lzdGVtIG9yIG90ZilcbiAqL1xucDUuUmVuZGVyZXIucHJvdG90eXBlLl9pc09wZW5UeXBlID0gZnVuY3Rpb24oZikge1xuICBmID0gZiB8fCB0aGlzLl90ZXh0Rm9udDtcbiAgcmV0dXJuIHR5cGVvZiBmID09PSAnb2JqZWN0JyAmJiBmLmZvbnQgJiYgZi5mb250LnN1cHBvcnRlZDtcbn07XG5cbnA1LlJlbmRlcmVyLnByb3RvdHlwZS5fdXBkYXRlVGV4dE1ldHJpY3MgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX2lzT3BlblR5cGUoKSkge1xuICAgIHRoaXMuX3NldFByb3BlcnR5KCdfdGV4dEFzY2VudCcsIHRoaXMuX3RleHRGb250Ll90ZXh0QXNjZW50KCkpO1xuICAgIHRoaXMuX3NldFByb3BlcnR5KCdfdGV4dERlc2NlbnQnLCB0aGlzLl90ZXh0Rm9udC5fdGV4dERlc2NlbnQoKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBBZGFwdGVkIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjUzNTUxNzhcbiAgdmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIHRleHQuc3R5bGUuZm9udEZhbWlseSA9IHRoaXMuX3RleHRGb250O1xuICB0ZXh0LnN0eWxlLmZvbnRTaXplID0gdGhpcy5fdGV4dFNpemUgKyAncHgnO1xuICB0ZXh0LmlubmVySFRNTCA9ICdBQkNqZ3F8JztcblxuICB2YXIgYmxvY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgYmxvY2suc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuICBibG9jay5zdHlsZS53aWR0aCA9ICcxcHgnO1xuICBibG9jay5zdHlsZS5oZWlnaHQgPSAnMHB4JztcblxuICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0ZXh0KTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJsb2NrKTtcblxuICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG4gIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cbiAgYmxvY2suc3R5bGUudmVydGljYWxBbGlnbiA9ICdiYXNlbGluZSc7XG4gIHZhciBibG9ja09mZnNldCA9IGNhbGN1bGF0ZU9mZnNldChibG9jayk7XG4gIHZhciB0ZXh0T2Zmc2V0ID0gY2FsY3VsYXRlT2Zmc2V0KHRleHQpO1xuICB2YXIgYXNjZW50ID0gYmxvY2tPZmZzZXRbMV0gLSB0ZXh0T2Zmc2V0WzFdO1xuXG4gIGJsb2NrLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSAnYm90dG9tJztcbiAgYmxvY2tPZmZzZXQgPSBjYWxjdWxhdGVPZmZzZXQoYmxvY2spO1xuICB0ZXh0T2Zmc2V0ID0gY2FsY3VsYXRlT2Zmc2V0KHRleHQpO1xuICB2YXIgaGVpZ2h0ID0gYmxvY2tPZmZzZXRbMV0gLSB0ZXh0T2Zmc2V0WzFdO1xuICB2YXIgZGVzY2VudCA9IGhlaWdodCAtIGFzY2VudDtcblxuICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGNvbnRhaW5lcik7XG5cbiAgdGhpcy5fc2V0UHJvcGVydHkoJ190ZXh0QXNjZW50JywgYXNjZW50KTtcbiAgdGhpcy5fc2V0UHJvcGVydHkoJ190ZXh0RGVzY2VudCcsIGRlc2NlbnQpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBIZWxwZXIgZnhuIHRvIG1lYXN1cmUgYXNjZW50IGFuZCBkZXNjZW50LlxuICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI1MzU1MTc4XG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU9mZnNldChvYmplY3QpIHtcbiAgdmFyIGN1cnJlbnRMZWZ0ID0gMCxcbiAgICBjdXJyZW50VG9wID0gMDtcbiAgaWYgKG9iamVjdC5vZmZzZXRQYXJlbnQpIHtcbiAgICBkbyB7XG4gICAgICBjdXJyZW50TGVmdCArPSBvYmplY3Qub2Zmc2V0TGVmdDtcbiAgICAgIGN1cnJlbnRUb3AgKz0gb2JqZWN0Lm9mZnNldFRvcDtcbiAgICB9IHdoaWxlICgob2JqZWN0ID0gb2JqZWN0Lm9mZnNldFBhcmVudCkpO1xuICB9IGVsc2Uge1xuICAgIGN1cnJlbnRMZWZ0ICs9IG9iamVjdC5vZmZzZXRMZWZ0O1xuICAgIGN1cnJlbnRUb3AgKz0gb2JqZWN0Lm9mZnNldFRvcDtcbiAgfVxuICByZXR1cm4gW2N1cnJlbnRMZWZ0LCBjdXJyZW50VG9wXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwNS5SZW5kZXJlcjtcblxufSx7XCIuLi9jb3JlL2NvbnN0YW50c1wiOjIxLFwiLi9jb3JlXCI6MjJ9XSwzMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4vY29yZScpO1xudmFyIGNhbnZhcyA9IF9kZXJlcV8oJy4vY2FudmFzJyk7XG52YXIgY29uc3RhbnRzID0gX2RlcmVxXygnLi9jb25zdGFudHMnKTtcbnZhciBmaWx0ZXJzID0gX2RlcmVxXygnLi4vaW1hZ2UvZmlsdGVycycpO1xuXG5fZGVyZXFfKCcuL3A1LlJlbmRlcmVyJyk7XG5cbi8qKlxuICogcDUuUmVuZGVyZXIyRFxuICogVGhlIDJEIGdyYXBoaWNzIGNhbnZhcyByZW5kZXJlciBjbGFzcy5cbiAqIGV4dGVuZHMgcDUuUmVuZGVyZXJcbiAqL1xudmFyIHN0eWxlRW1wdHkgPSAncmdiYSgwLDAsMCwwKSc7XG4vLyB2YXIgYWxwaGFUaHJlc2hvbGQgPSAwLjAwMTI1OyAvLyBtaW5pbXVtIHZpc2libGVcblxucDUuUmVuZGVyZXIyRCA9IGZ1bmN0aW9uKGVsdCwgcEluc3QsIGlzTWFpbkNhbnZhcykge1xuICBwNS5SZW5kZXJlci5jYWxsKHRoaXMsIGVsdCwgcEluc3QsIGlzTWFpbkNhbnZhcyk7XG4gIHRoaXMuZHJhd2luZ0NvbnRleHQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICB0aGlzLl9wSW5zdC5fc2V0UHJvcGVydHkoJ2RyYXdpbmdDb250ZXh0JywgdGhpcy5kcmF3aW5nQ29udGV4dCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHA1LlJlbmRlcmVyLnByb3RvdHlwZSk7XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLl9hcHBseURlZmF1bHRzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NhY2hlZEZpbGxTdHlsZSA9IHRoaXMuX2NhY2hlZFN0cm9rZVN0eWxlID0gdW5kZWZpbmVkO1xuICB0aGlzLl9zZXRGaWxsKGNvbnN0YW50cy5fREVGQVVMVF9GSUxMKTtcbiAgdGhpcy5fc2V0U3Ryb2tlKGNvbnN0YW50cy5fREVGQVVMVF9TVFJPS0UpO1xuICB0aGlzLmRyYXdpbmdDb250ZXh0LmxpbmVDYXAgPSBjb25zdGFudHMuUk9VTkQ7XG4gIHRoaXMuZHJhd2luZ0NvbnRleHQuZm9udCA9ICdub3JtYWwgMTJweCBzYW5zLXNlcmlmJztcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uKHcsIGgpIHtcbiAgcDUuUmVuZGVyZXIucHJvdG90eXBlLnJlc2l6ZS5jYWxsKHRoaXMsIHcsIGgpO1xuICB0aGlzLmRyYXdpbmdDb250ZXh0LnNjYWxlKFxuICAgIHRoaXMuX3BJbnN0Ll9waXhlbERlbnNpdHksXG4gICAgdGhpcy5fcEluc3QuX3BpeGVsRGVuc2l0eVxuICApO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQ09MT1IgfCBTZXR0aW5nXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLmJhY2tncm91bmQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kcmF3aW5nQ29udGV4dC5zYXZlKCk7XG4gIHRoaXMuZHJhd2luZ0NvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICB0aGlzLmRyYXdpbmdDb250ZXh0LnNjYWxlKFxuICAgIHRoaXMuX3BJbnN0Ll9waXhlbERlbnNpdHksXG4gICAgdGhpcy5fcEluc3QuX3BpeGVsRGVuc2l0eVxuICApO1xuXG4gIGlmIChhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBwNS5JbWFnZSkge1xuICAgIHRoaXMuX3BJbnN0LmltYWdlKGFyZ3VtZW50c1swXSwgMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBjdXJGaWxsID0gdGhpcy5fZ2V0RmlsbCgpO1xuICAgIC8vIGNyZWF0ZSBiYWNrZ3JvdW5kIHJlY3RcbiAgICB2YXIgY29sb3IgPSB0aGlzLl9wSW5zdC5jb2xvci5hcHBseSh0aGlzLl9wSW5zdCwgYXJndW1lbnRzKTtcbiAgICB2YXIgbmV3RmlsbCA9IGNvbG9yLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5fc2V0RmlsbChuZXdGaWxsKTtcbiAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmZpbGxSZWN0KDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICAvLyByZXNldCBmaWxsXG4gICAgdGhpcy5fc2V0RmlsbChjdXJGaWxsKTtcbiAgfVxuICB0aGlzLmRyYXdpbmdDb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZHJhd2luZ0NvbnRleHQuc2F2ZSgpO1xuICB0aGlzLmRyYXdpbmdDb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgdGhpcy5kcmF3aW5nQ29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICB0aGlzLmRyYXdpbmdDb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvbG9yID0gdGhpcy5fcEluc3QuY29sb3IuYXBwbHkodGhpcy5fcEluc3QsIGFyZ3VtZW50cyk7XG4gIHRoaXMuX3NldEZpbGwoY29sb3IudG9TdHJpbmcoKSk7XG59O1xuXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS5zdHJva2UgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvbG9yID0gdGhpcy5fcEluc3QuY29sb3IuYXBwbHkodGhpcy5fcEluc3QsIGFyZ3VtZW50cyk7XG4gIHRoaXMuX3NldFN0cm9rZShjb2xvci50b1N0cmluZygpKTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIElNQUdFIHwgTG9hZGluZyAmIERpc3BsYXlpbmdcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUuaW1hZ2UgPSBmdW5jdGlvbihcbiAgaW1nLFxuICBzeCxcbiAgc3ksXG4gIHNXaWR0aCxcbiAgc0hlaWdodCxcbiAgZHgsXG4gIGR5LFxuICBkV2lkdGgsXG4gIGRIZWlnaHRcbikge1xuICB2YXIgY252O1xuICB0cnkge1xuICAgIGlmICh0aGlzLl90aW50KSB7XG4gICAgICBpZiAocDUuTWVkaWFFbGVtZW50ICYmIGltZyBpbnN0YW5jZW9mIHA1Lk1lZGlhRWxlbWVudCkge1xuICAgICAgICBpbWcubG9hZFBpeGVscygpO1xuICAgICAgfVxuICAgICAgaWYgKGltZy5jYW52YXMpIHtcbiAgICAgICAgY252ID0gdGhpcy5fZ2V0VGludGVkSW1hZ2VDYW52YXMoaW1nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjbnYpIHtcbiAgICAgIGNudiA9IGltZy5jYW52YXMgfHwgaW1nLmVsdDtcbiAgICB9XG4gICAgdGhpcy5kcmF3aW5nQ29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICBjbnYsXG4gICAgICBzeCxcbiAgICAgIHN5LFxuICAgICAgc1dpZHRoLFxuICAgICAgc0hlaWdodCxcbiAgICAgIGR4LFxuICAgICAgZHksXG4gICAgICBkV2lkdGgsXG4gICAgICBkSGVpZ2h0XG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLm5hbWUgIT09ICdOU19FUlJPUl9OT1RfQVZBSUxBQkxFJykge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLl9nZXRUaW50ZWRJbWFnZUNhbnZhcyA9IGZ1bmN0aW9uKGltZykge1xuICBpZiAoIWltZy5jYW52YXMpIHtcbiAgICByZXR1cm4gaW1nO1xuICB9XG4gIHZhciBwaXhlbHMgPSBmaWx0ZXJzLl90b1BpeGVscyhpbWcuY2FudmFzKTtcbiAgdmFyIHRtcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICB0bXBDYW52YXMud2lkdGggPSBpbWcuY2FudmFzLndpZHRoO1xuICB0bXBDYW52YXMuaGVpZ2h0ID0gaW1nLmNhbnZhcy5oZWlnaHQ7XG4gIHZhciB0bXBDdHggPSB0bXBDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgdmFyIGlkID0gdG1wQ3R4LmNyZWF0ZUltYWdlRGF0YShpbWcuY2FudmFzLndpZHRoLCBpbWcuY2FudmFzLmhlaWdodCk7XG4gIHZhciBuZXdQaXhlbHMgPSBpZC5kYXRhO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7IGkgKz0gNCkge1xuICAgIHZhciByID0gcGl4ZWxzW2ldO1xuICAgIHZhciBnID0gcGl4ZWxzW2kgKyAxXTtcbiAgICB2YXIgYiA9IHBpeGVsc1tpICsgMl07XG4gICAgdmFyIGEgPSBwaXhlbHNbaSArIDNdO1xuICAgIG5ld1BpeGVsc1tpXSA9IHIgKiB0aGlzLl90aW50WzBdIC8gMjU1O1xuICAgIG5ld1BpeGVsc1tpICsgMV0gPSBnICogdGhpcy5fdGludFsxXSAvIDI1NTtcbiAgICBuZXdQaXhlbHNbaSArIDJdID0gYiAqIHRoaXMuX3RpbnRbMl0gLyAyNTU7XG4gICAgbmV3UGl4ZWxzW2kgKyAzXSA9IGEgKiB0aGlzLl90aW50WzNdIC8gMjU1O1xuICB9XG4gIHRtcEN0eC5wdXRJbWFnZURhdGEoaWQsIDAsIDApO1xuICByZXR1cm4gdG1wQ2FudmFzO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gSU1BR0UgfCBQaXhlbHNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUuYmxlbmRNb2RlID0gZnVuY3Rpb24obW9kZSkge1xuICB0aGlzLmRyYXdpbmdDb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IG1vZGU7XG59O1xucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUuYmxlbmQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGN1cnJCbGVuZCA9IHRoaXMuZHJhd2luZ0NvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICB2YXIgYmxlbmRNb2RlID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcblxuICB2YXIgY29weUFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcblxuICB0aGlzLmRyYXdpbmdDb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGJsZW5kTW9kZTtcbiAgaWYgKHRoaXMuX3BJbnN0KSB7XG4gICAgdGhpcy5fcEluc3QuY29weS5hcHBseSh0aGlzLl9wSW5zdCwgY29weUFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuY29weS5hcHBseSh0aGlzLCBjb3B5QXJncyk7XG4gIH1cbiAgdGhpcy5kcmF3aW5nQ29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjdXJyQmxlbmQ7XG59O1xuXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzcmNJbWFnZSwgc3gsIHN5LCBzdywgc2gsIGR4LCBkeSwgZHcsIGRoO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gOSkge1xuICAgIHNyY0ltYWdlID0gYXJndW1lbnRzWzBdO1xuICAgIHN4ID0gYXJndW1lbnRzWzFdO1xuICAgIHN5ID0gYXJndW1lbnRzWzJdO1xuICAgIHN3ID0gYXJndW1lbnRzWzNdO1xuICAgIHNoID0gYXJndW1lbnRzWzRdO1xuICAgIGR4ID0gYXJndW1lbnRzWzVdO1xuICAgIGR5ID0gYXJndW1lbnRzWzZdO1xuICAgIGR3ID0gYXJndW1lbnRzWzddO1xuICAgIGRoID0gYXJndW1lbnRzWzhdO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDgpIHtcbiAgICBzcmNJbWFnZSA9IHRoaXMuX3BJbnN0O1xuICAgIHN4ID0gYXJndW1lbnRzWzBdO1xuICAgIHN5ID0gYXJndW1lbnRzWzFdO1xuICAgIHN3ID0gYXJndW1lbnRzWzJdO1xuICAgIHNoID0gYXJndW1lbnRzWzNdO1xuICAgIGR4ID0gYXJndW1lbnRzWzRdO1xuICAgIGR5ID0gYXJndW1lbnRzWzVdO1xuICAgIGR3ID0gYXJndW1lbnRzWzZdO1xuICAgIGRoID0gYXJndW1lbnRzWzddO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignU2lnbmF0dXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuICBwNS5SZW5kZXJlcjJELl9jb3B5SGVscGVyKHRoaXMsIHNyY0ltYWdlLCBzeCwgc3ksIHN3LCBzaCwgZHgsIGR5LCBkdywgZGgpO1xufTtcblxucDUuUmVuZGVyZXIyRC5fY29weUhlbHBlciA9IGZ1bmN0aW9uKFxuICBkc3RJbWFnZSxcbiAgc3JjSW1hZ2UsXG4gIHN4LFxuICBzeSxcbiAgc3csXG4gIHNoLFxuICBkeCxcbiAgZHksXG4gIGR3LFxuICBkaFxuKSB7XG4gIHNyY0ltYWdlLmxvYWRQaXhlbHMoKTtcbiAgdmFyIHMgPSBzcmNJbWFnZS5jYW52YXMud2lkdGggLyBzcmNJbWFnZS53aWR0aDtcbiAgZHN0SW1hZ2UuZHJhd2luZ0NvbnRleHQuZHJhd0ltYWdlKFxuICAgIHNyY0ltYWdlLmNhbnZhcyxcbiAgICBzICogc3gsXG4gICAgcyAqIHN5LFxuICAgIHMgKiBzdyxcbiAgICBzICogc2gsXG4gICAgZHgsXG4gICAgZHksXG4gICAgZHcsXG4gICAgZGhcbiAgKTtcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpIHtcbiAgaWYgKFxuICAgIHggPT09IHVuZGVmaW5lZCAmJlxuICAgIHkgPT09IHVuZGVmaW5lZCAmJlxuICAgIHcgPT09IHVuZGVmaW5lZCAmJlxuICAgIGggPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICB4ID0gMDtcbiAgICB5ID0gMDtcbiAgICB3ID0gdGhpcy53aWR0aDtcbiAgICBoID0gdGhpcy5oZWlnaHQ7XG4gIH0gZWxzZSBpZiAodyA9PT0gdW5kZWZpbmVkICYmIGggPT09IHVuZGVmaW5lZCkge1xuICAgIHcgPSAxO1xuICAgIGggPSAxO1xuICB9XG5cbiAgLy8gaWYgdGhlIHNlY3Rpb24gZG9lcyBub3Qgb3ZlcmxhcCB0aGUgY2FudmFzXG4gIGlmICh4ICsgdyA8IDAgfHwgeSArIGggPCAwIHx8IHggPiB0aGlzLndpZHRoIHx8IHkgPiB0aGlzLmhlaWdodCkge1xuICAgIHJldHVybiBbMCwgMCwgMCwgMjU1XTtcbiAgfVxuXG4gIHZhciBjdHggPSB0aGlzLl9wSW5zdCB8fCB0aGlzO1xuICBjdHgubG9hZFBpeGVscygpO1xuXG4gIHZhciBwZCA9IGN0eC5fcGl4ZWxEZW5zaXR5O1xuXG4gIC8vIHJvdW5kIGRvd24gdG8gZ2V0IGludGVnZXIgbnVtYmVyc1xuICB4ID0gTWF0aC5mbG9vcih4KTtcbiAgeSA9IE1hdGguZmxvb3IoeSk7XG4gIHcgPSBNYXRoLmZsb29yKHcpO1xuICBoID0gTWF0aC5mbG9vcihoKTtcblxuICB2YXIgc3ggPSB4ICogcGQ7XG4gIHZhciBzeSA9IHkgKiBwZDtcbiAgaWYgKHcgPT09IDEgJiYgaCA9PT0gMSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBwNS5SZW5kZXJlckdMKSkge1xuICAgIHZhciBpbWFnZURhdGEgPSB0aGlzLmRyYXdpbmdDb250ZXh0LmdldEltYWdlRGF0YShzeCwgc3ksIDEsIDEpLmRhdGE7XG4gICAgLy9pbWFnZURhdGEgPSBbMCwwLDAsMF07XG4gICAgcmV0dXJuIFtpbWFnZURhdGFbMF0sIGltYWdlRGF0YVsxXSwgaW1hZ2VEYXRhWzJdLCBpbWFnZURhdGFbM11dO1xuICB9IGVsc2Uge1xuICAgIC8vYXV0byBjb25zdHJhaW4gdGhlIHdpZHRoIGFuZCBoZWlnaHQgdG9cbiAgICAvL2RpbWVuc2lvbnMgb2YgdGhlIHNvdXJjZSBpbWFnZVxuICAgIHZhciBkdyA9IE1hdGgubWluKHcsIGN0eC53aWR0aCk7XG4gICAgdmFyIGRoID0gTWF0aC5taW4oaCwgY3R4LmhlaWdodCk7XG4gICAgdmFyIHN3ID0gZHcgKiBwZDtcbiAgICB2YXIgc2ggPSBkaCAqIHBkO1xuXG4gICAgdmFyIHJlZ2lvbiA9IG5ldyBwNS5JbWFnZShkdywgZGgpO1xuICAgIHJlZ2lvbi5jYW52YXNcbiAgICAgIC5nZXRDb250ZXh0KCcyZCcpXG4gICAgICAuZHJhd0ltYWdlKHRoaXMuY2FudmFzLCBzeCwgc3ksIHN3LCBzaCwgMCwgMCwgZHcsIGRoKTtcblxuICAgIHJldHVybiByZWdpb247XG4gIH1cbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLmxvYWRQaXhlbHMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX3BJbnN0IHx8IHRoaXM7IC8vIGlmIGNhbGxlZCBieSBwNS5JbWFnZVxuICB2YXIgcGQgPSBjdHguX3BpeGVsRGVuc2l0eTtcbiAgdmFyIHcgPSB0aGlzLndpZHRoICogcGQ7XG4gIHZhciBoID0gdGhpcy5oZWlnaHQgKiBwZDtcbiAgdmFyIGltYWdlRGF0YSA9IHRoaXMuZHJhd2luZ0NvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpO1xuICAvLyBAdG9kbyB0aGlzIHNob3VsZCBhY3R1YWxseSBzZXQgcGl4ZWxzIHBlciBvYmplY3QsIHNvIGRpZmYgYnVmZmVycyBjYW5cbiAgLy8gaGF2ZSBkaWZmIHBpeGVsIGFycmF5cy5cbiAgY3R4Ll9zZXRQcm9wZXJ0eSgnaW1hZ2VEYXRhJywgaW1hZ2VEYXRhKTtcbiAgY3R4Ll9zZXRQcm9wZXJ0eSgncGl4ZWxzJywgaW1hZ2VEYXRhLmRhdGEpO1xufTtcblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oeCwgeSwgaW1nT3JDb2wpIHtcbiAgLy8gcm91bmQgZG93biB0byBnZXQgaW50ZWdlciBudW1iZXJzXG4gIHggPSBNYXRoLmZsb29yKHgpO1xuICB5ID0gTWF0aC5mbG9vcih5KTtcbiAgdmFyIGN0eCA9IHRoaXMuX3BJbnN0IHx8IHRoaXM7XG4gIGlmIChpbWdPckNvbCBpbnN0YW5jZW9mIHA1LkltYWdlKSB7XG4gICAgdGhpcy5kcmF3aW5nQ29udGV4dC5zYXZlKCk7XG4gICAgdGhpcy5kcmF3aW5nQ29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgdGhpcy5kcmF3aW5nQ29udGV4dC5zY2FsZShjdHguX3BpeGVsRGVuc2l0eSwgY3R4Ll9waXhlbERlbnNpdHkpO1xuICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuZHJhd0ltYWdlKGltZ09yQ29sLmNhbnZhcywgeCwgeSk7XG4gICAgdGhpcy5sb2FkUGl4ZWxzLmNhbGwoY3R4KTtcbiAgICB0aGlzLmRyYXdpbmdDb250ZXh0LnJlc3RvcmUoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgciA9IDAsXG4gICAgICBnID0gMCxcbiAgICAgIGIgPSAwLFxuICAgICAgYSA9IDA7XG4gICAgdmFyIGlkeCA9XG4gICAgICA0ICpcbiAgICAgICh5ICogY3R4Ll9waXhlbERlbnNpdHkgKiAodGhpcy53aWR0aCAqIGN0eC5fcGl4ZWxEZW5zaXR5KSArXG4gICAgICAgIHggKiBjdHguX3BpeGVsRGVuc2l0eSk7XG4gICAgaWYgKCFjdHguaW1hZ2VEYXRhKSB7XG4gICAgICBjdHgubG9hZFBpeGVscy5jYWxsKGN0eCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW1nT3JDb2wgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaWR4IDwgY3R4LnBpeGVscy5sZW5ndGgpIHtcbiAgICAgICAgciA9IGltZ09yQ29sO1xuICAgICAgICBnID0gaW1nT3JDb2w7XG4gICAgICAgIGIgPSBpbWdPckNvbDtcbiAgICAgICAgYSA9IDI1NTtcbiAgICAgICAgLy90aGlzLnVwZGF0ZVBpeGVscy5jYWxsKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW1nT3JDb2wgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgaWYgKGltZ09yQ29sLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwaXhlbCBhcnJheSBtdXN0IGJlIG9mIHRoZSBmb3JtIFtSLCBHLCBCLCBBXScpO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCA8IGN0eC5waXhlbHMubGVuZ3RoKSB7XG4gICAgICAgIHIgPSBpbWdPckNvbFswXTtcbiAgICAgICAgZyA9IGltZ09yQ29sWzFdO1xuICAgICAgICBiID0gaW1nT3JDb2xbMl07XG4gICAgICAgIGEgPSBpbWdPckNvbFszXTtcbiAgICAgICAgLy90aGlzLnVwZGF0ZVBpeGVscy5jYWxsKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW1nT3JDb2wgaW5zdGFuY2VvZiBwNS5Db2xvcikge1xuICAgICAgaWYgKGlkeCA8IGN0eC5waXhlbHMubGVuZ3RoKSB7XG4gICAgICAgIHIgPSBpbWdPckNvbC5sZXZlbHNbMF07XG4gICAgICAgIGcgPSBpbWdPckNvbC5sZXZlbHNbMV07XG4gICAgICAgIGIgPSBpbWdPckNvbC5sZXZlbHNbMl07XG4gICAgICAgIGEgPSBpbWdPckNvbC5sZXZlbHNbM107XG4gICAgICAgIC8vdGhpcy51cGRhdGVQaXhlbHMuY2FsbCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbG9vcCBvdmVyIHBpeGVsRGVuc2l0eSAqIHBpeGVsRGVuc2l0eVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3R4Ll9waXhlbERlbnNpdHk7IGkrKykge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjdHguX3BpeGVsRGVuc2l0eTsgaisrKSB7XG4gICAgICAgIC8vIGxvb3Agb3ZlclxuICAgICAgICBpZHggPVxuICAgICAgICAgIDQgKlxuICAgICAgICAgICgoeSAqIGN0eC5fcGl4ZWxEZW5zaXR5ICsgaikgKiB0aGlzLndpZHRoICogY3R4Ll9waXhlbERlbnNpdHkgK1xuICAgICAgICAgICAgKHggKiBjdHguX3BpeGVsRGVuc2l0eSArIGkpKTtcbiAgICAgICAgY3R4LnBpeGVsc1tpZHhdID0gcjtcbiAgICAgICAgY3R4LnBpeGVsc1tpZHggKyAxXSA9IGc7XG4gICAgICAgIGN0eC5waXhlbHNbaWR4ICsgMl0gPSBiO1xuICAgICAgICBjdHgucGl4ZWxzW2lkeCArIDNdID0gYTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnVwZGF0ZVBpeGVscyA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX3BJbnN0IHx8IHRoaXM7XG4gIHZhciBwZCA9IGN0eC5fcGl4ZWxEZW5zaXR5O1xuICBpZiAoXG4gICAgeCA9PT0gdW5kZWZpbmVkICYmXG4gICAgeSA9PT0gdW5kZWZpbmVkICYmXG4gICAgdyA9PT0gdW5kZWZpbmVkICYmXG4gICAgaCA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHggPSAwO1xuICAgIHkgPSAwO1xuICAgIHcgPSB0aGlzLndpZHRoO1xuICAgIGggPSB0aGlzLmhlaWdodDtcbiAgfVxuICB3ICo9IHBkO1xuICBoICo9IHBkO1xuXG4gIHRoaXMuZHJhd2luZ0NvbnRleHQucHV0SW1hZ2VEYXRhKGN0eC5pbWFnZURhdGEsIHgsIHksIDAsIDAsIHcsIGgpO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gU0hBUEUgfCAyRCBQcmltaXRpdmVzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogR2VuZXJhdGUgYSBjdWJpYyBCZXppZXIgcmVwcmVzZW50aW5nIGFuIGFyYyBvbiB0aGUgdW5pdCBjaXJjbGUgb2YgdG90YWxcbiAqIGFuZ2xlIGBzaXplYCByYWRpYW5zLCBiZWdpbm5pbmcgYHN0YXJ0YCByYWRpYW5zIGFib3ZlIHRoZSB4LWF4aXMuIFVwIHRvXG4gKiBmb3VyIG9mIHRoZXNlIGN1cnZlcyBhcmUgY29tYmluZWQgdG8gbWFrZSBhIGZ1bGwgYXJjLlxuICpcbiAqIFNlZSB3d3cuam9lY3JpZGdlLm1lL2Jlemllci5wZGYgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBtZXRob2QuXG4gKi9cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLl9hY3V0ZUFyY1RvQmV6aWVyID0gZnVuY3Rpb24gX2FjdXRlQXJjVG9CZXppZXIoXG4gIHN0YXJ0LFxuICBzaXplXG4pIHtcbiAgLy8gRXZhdWF0ZSBjb25zdGFudHMuXG4gIHZhciBhbHBoYSA9IHNpemUgLyAyLjAsXG4gICAgY29zX2FscGhhID0gTWF0aC5jb3MoYWxwaGEpLFxuICAgIHNpbl9hbHBoYSA9IE1hdGguc2luKGFscGhhKSxcbiAgICBjb3RfYWxwaGEgPSAxLjAgLyBNYXRoLnRhbihhbHBoYSksXG4gICAgcGhpID0gc3RhcnQgKyBhbHBoYSwgLy8gVGhpcyBpcyBob3cgZmFyIHRoZSBhcmMgbmVlZHMgdG8gYmUgcm90YXRlZC5cbiAgICBjb3NfcGhpID0gTWF0aC5jb3MocGhpKSxcbiAgICBzaW5fcGhpID0gTWF0aC5zaW4ocGhpKSxcbiAgICBsYW1iZGEgPSAoNC4wIC0gY29zX2FscGhhKSAvIDMuMCxcbiAgICBtdSA9IHNpbl9hbHBoYSArIChjb3NfYWxwaGEgLSBsYW1iZGEpICogY290X2FscGhhO1xuXG4gIC8vIFJldHVybiByb3RhdGVkIHdheXBvaW50cy5cbiAgcmV0dXJuIHtcbiAgICBheDogTWF0aC5jb3Moc3RhcnQpLFxuICAgIGF5OiBNYXRoLnNpbihzdGFydCksXG4gICAgYng6IGxhbWJkYSAqIGNvc19waGkgKyBtdSAqIHNpbl9waGksXG4gICAgYnk6IGxhbWJkYSAqIHNpbl9waGkgLSBtdSAqIGNvc19waGksXG4gICAgY3g6IGxhbWJkYSAqIGNvc19waGkgLSBtdSAqIHNpbl9waGksXG4gICAgY3k6IGxhbWJkYSAqIHNpbl9waGkgKyBtdSAqIGNvc19waGksXG4gICAgZHg6IE1hdGguY29zKHN0YXJ0ICsgc2l6ZSksXG4gICAgZHk6IE1hdGguc2luKHN0YXJ0ICsgc2l6ZSlcbiAgfTtcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLmFyYyA9IGZ1bmN0aW9uKHgsIHksIHcsIGgsIHN0YXJ0LCBzdG9wLCBtb2RlKSB7XG4gIHZhciBjdHggPSB0aGlzLmRyYXdpbmdDb250ZXh0O1xuICB2YXIgdmFscyA9IGNhbnZhcy5hcmNNb2RlQWRqdXN0KHgsIHksIHcsIGgsIHRoaXMuX2VsbGlwc2VNb2RlKTtcbiAgdmFyIHJ4ID0gdmFscy53IC8gMi4wO1xuICB2YXIgcnkgPSB2YWxzLmggLyAyLjA7XG4gIHZhciBlcHNpbG9uID0gMC4wMDAwMTsgLy8gU21hbGxlc3QgdmlzaWJsZSBhbmdsZSBvbiBkaXNwbGF5cyB1cCB0byA0Sy5cbiAgdmFyIGFyY1RvRHJhdyA9IDA7XG4gIHZhciBjdXJ2ZXMgPSBbXTtcblxuICAvLyBDcmVhdGUgY3VydmVzXG4gIHdoaWxlIChzdG9wIC0gc3RhcnQgPiBlcHNpbG9uKSB7XG4gICAgYXJjVG9EcmF3ID0gTWF0aC5taW4oc3RvcCAtIHN0YXJ0LCBjb25zdGFudHMuSEFMRl9QSSk7XG4gICAgY3VydmVzLnB1c2godGhpcy5fYWN1dGVBcmNUb0JlemllcihzdGFydCwgYXJjVG9EcmF3KSk7XG4gICAgc3RhcnQgKz0gYXJjVG9EcmF3O1xuICB9XG5cbiAgLy8gRmlsbCBjdXJ2ZXNcbiAgaWYgKHRoaXMuX2RvRmlsbCkge1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdXJ2ZXMuZm9yRWFjaChmdW5jdGlvbihjdXJ2ZSwgaW5kZXgpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICBjdHgubW92ZVRvKHZhbHMueCArIGN1cnZlLmF4ICogcngsIHZhbHMueSArIGN1cnZlLmF5ICogcnkpO1xuICAgICAgfVxuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICBjdHguYmV6aWVyQ3VydmVUbyh2YWxzLnggKyBjdXJ2ZS5ieCAqIHJ4LCB2YWxzLnkgKyBjdXJ2ZS5ieSAqIHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzLnggKyBjdXJ2ZS5jeCAqIHJ4LCB2YWxzLnkgKyBjdXJ2ZS5jeSAqIHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzLnggKyBjdXJ2ZS5keCAqIHJ4LCB2YWxzLnkgKyBjdXJ2ZS5keSAqIHJ5KTtcbiAgICB9KTtcbiAgICBpZiAobW9kZSA9PT0gY29uc3RhbnRzLlBJRSB8fCBtb2RlID09IG51bGwpIHtcbiAgICAgIGN0eC5saW5lVG8odmFscy54LCB2YWxzLnkpO1xuICAgIH1cbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgY3R4LmZpbGwoKTtcbiAgfVxuXG4gIC8vIFN0cm9rZSBjdXJ2ZXNcbiAgaWYgKHRoaXMuX2RvU3Ryb2tlKSB7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGN1cnZlcy5mb3JFYWNoKGZ1bmN0aW9uKGN1cnZlLCBpbmRleCkge1xuICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgIGN0eC5tb3ZlVG8odmFscy54ICsgY3VydmUuYXggKiByeCwgdmFscy55ICsgY3VydmUuYXkgKiByeSk7XG4gICAgICB9XG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKHZhbHMueCArIGN1cnZlLmJ4ICogcngsIHZhbHMueSArIGN1cnZlLmJ5ICogcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHMueCArIGN1cnZlLmN4ICogcngsIHZhbHMueSArIGN1cnZlLmN5ICogcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHMueCArIGN1cnZlLmR4ICogcngsIHZhbHMueSArIGN1cnZlLmR5ICogcnkpO1xuICAgIH0pO1xuICAgIGlmIChtb2RlID09PSBjb25zdGFudHMuUElFKSB7XG4gICAgICBjdHgubGluZVRvKHZhbHMueCwgdmFscy55KTtcbiAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICB9IGVsc2UgaWYgKG1vZGUgPT09IGNvbnN0YW50cy5DSE9SRCkge1xuICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIH1cbiAgICBjdHguc3Ryb2tlKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS5lbGxpcHNlID0gZnVuY3Rpb24oYXJncykge1xuICB2YXIgY3R4ID0gdGhpcy5kcmF3aW5nQ29udGV4dDtcbiAgdmFyIGRvRmlsbCA9IHRoaXMuX2RvRmlsbCxcbiAgICBkb1N0cm9rZSA9IHRoaXMuX2RvU3Ryb2tlO1xuICB2YXIgeCA9IGFyZ3NbMF0sXG4gICAgeSA9IGFyZ3NbMV0sXG4gICAgdyA9IGFyZ3NbMl0sXG4gICAgaCA9IGFyZ3NbM107XG4gIGlmIChkb0ZpbGwgJiYgIWRvU3Ryb2tlKSB7XG4gICAgaWYgKHRoaXMuX2dldEZpbGwoKSA9PT0gc3R5bGVFbXB0eSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFkb0ZpbGwgJiYgZG9TdHJva2UpIHtcbiAgICBpZiAodGhpcy5fZ2V0U3Ryb2tlKCkgPT09IHN0eWxlRW1wdHkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfVxuICB2YXIga2FwcGEgPSAwLjU1MjI4NDc0OTgsXG4gICAgb3ggPSB3IC8gMiAqIGthcHBhLCAvLyBjb250cm9sIHBvaW50IG9mZnNldCBob3Jpem9udGFsXG4gICAgb3kgPSBoIC8gMiAqIGthcHBhLCAvLyBjb250cm9sIHBvaW50IG9mZnNldCB2ZXJ0aWNhbFxuICAgIHhlID0geCArIHcsIC8vIHgtZW5kXG4gICAgeWUgPSB5ICsgaCwgLy8geS1lbmRcbiAgICB4bSA9IHggKyB3IC8gMiwgLy8geC1taWRkbGVcbiAgICB5bSA9IHkgKyBoIC8gMjsgLy8geS1taWRkbGVcbiAgY3R4LmJlZ2luUGF0aCgpO1xuICBjdHgubW92ZVRvKHgsIHltKTtcbiAgY3R4LmJlemllckN1cnZlVG8oeCwgeW0gLSBveSwgeG0gLSBveCwgeSwgeG0sIHkpO1xuICBjdHguYmV6aWVyQ3VydmVUbyh4bSArIG94LCB5LCB4ZSwgeW0gLSBveSwgeGUsIHltKTtcbiAgY3R4LmJlemllckN1cnZlVG8oeGUsIHltICsgb3ksIHhtICsgb3gsIHllLCB4bSwgeWUpO1xuICBjdHguYmV6aWVyQ3VydmVUbyh4bSAtIG94LCB5ZSwgeCwgeW0gKyBveSwgeCwgeW0pO1xuICBjdHguY2xvc2VQYXRoKCk7XG4gIGlmIChkb0ZpbGwpIHtcbiAgICBjdHguZmlsbCgpO1xuICB9XG4gIGlmIChkb1N0cm9rZSkge1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfVxufTtcblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUubGluZSA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyKSB7XG4gIHZhciBjdHggPSB0aGlzLmRyYXdpbmdDb250ZXh0O1xuICBpZiAoIXRoaXMuX2RvU3Ryb2tlKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gZWxzZSBpZiAodGhpcy5fZ2V0U3Ryb2tlKCkgPT09IHN0eWxlRW1wdHkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvLyBUcmFuc2xhdGUgdGhlIGxpbmUgYnkgKDAuNSwgMC41KSB0byBkcmF3IGl0IGNyaXNwXG4gIGlmIChjdHgubGluZVdpZHRoICUgMiA9PT0gMSkge1xuICAgIGN0eC50cmFuc2xhdGUoMC41LCAwLjUpO1xuICB9XG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgY3R4Lm1vdmVUbyh4MSwgeTEpO1xuICBjdHgubGluZVRvKHgyLCB5Mik7XG4gIGN0eC5zdHJva2UoKTtcbiAgaWYgKGN0eC5saW5lV2lkdGggJSAyID09PSAxKSB7XG4gICAgY3R4LnRyYW5zbGF0ZSgtMC41LCAtMC41KTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkge1xuICB2YXIgY3R4ID0gdGhpcy5kcmF3aW5nQ29udGV4dDtcbiAgaWYgKCF0aGlzLl9kb1N0cm9rZSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2UgaWYgKHRoaXMuX2dldFN0cm9rZSgpID09PSBzdHlsZUVtcHR5KSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdmFyIHMgPSB0aGlzLl9nZXRTdHJva2UoKTtcbiAgdmFyIGYgPSB0aGlzLl9nZXRGaWxsKCk7XG4gIHggPSBNYXRoLnJvdW5kKHgpO1xuICB5ID0gTWF0aC5yb3VuZCh5KTtcbiAgLy8gc3dhcHBpbmcgZmlsbCBjb2xvciB0byBzdHJva2UgYW5kIGJhY2sgYWZ0ZXIgZm9yIGNvcnJlY3QgcG9pbnQgcmVuZGVyaW5nXG4gIHRoaXMuX3NldEZpbGwocyk7XG4gIGlmIChjdHgubGluZVdpZHRoID4gMSkge1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHguYXJjKHgsIHksIGN0eC5saW5lV2lkdGggLyAyLCAwLCBjb25zdGFudHMuVFdPX1BJLCBmYWxzZSk7XG4gICAgY3R4LmZpbGwoKTtcbiAgfSBlbHNlIHtcbiAgICBjdHguZmlsbFJlY3QoeCwgeSwgMSwgMSk7XG4gIH1cbiAgdGhpcy5fc2V0RmlsbChmKTtcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnF1YWQgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgdmFyIGN0eCA9IHRoaXMuZHJhd2luZ0NvbnRleHQ7XG4gIHZhciBkb0ZpbGwgPSB0aGlzLl9kb0ZpbGwsXG4gICAgZG9TdHJva2UgPSB0aGlzLl9kb1N0cm9rZTtcbiAgaWYgKGRvRmlsbCAmJiAhZG9TdHJva2UpIHtcbiAgICBpZiAodGhpcy5fZ2V0RmlsbCgpID09PSBzdHlsZUVtcHR5KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWRvRmlsbCAmJiBkb1N0cm9rZSkge1xuICAgIGlmICh0aGlzLl9nZXRTdHJva2UoKSA9PT0gc3R5bGVFbXB0eSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgY3R4Lm1vdmVUbyh4MSwgeTEpO1xuICBjdHgubGluZVRvKHgyLCB5Mik7XG4gIGN0eC5saW5lVG8oeDMsIHkzKTtcbiAgY3R4LmxpbmVUbyh4NCwgeTQpO1xuICBjdHguY2xvc2VQYXRoKCk7XG4gIGlmIChkb0ZpbGwpIHtcbiAgICBjdHguZmlsbCgpO1xuICB9XG4gIGlmIChkb1N0cm9rZSkge1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnJlY3QgPSBmdW5jdGlvbihhcmdzKSB7XG4gIHZhciB4ID0gYXJnc1swXSxcbiAgICB5ID0gYXJnc1sxXSxcbiAgICB3ID0gYXJnc1syXSxcbiAgICBoID0gYXJnc1szXSxcbiAgICB0bCA9IGFyZ3NbNF0sXG4gICAgdHIgPSBhcmdzWzVdLFxuICAgIGJyID0gYXJnc1s2XSxcbiAgICBibCA9IGFyZ3NbN107XG4gIHZhciBjdHggPSB0aGlzLmRyYXdpbmdDb250ZXh0O1xuICB2YXIgZG9GaWxsID0gdGhpcy5fZG9GaWxsLFxuICAgIGRvU3Ryb2tlID0gdGhpcy5fZG9TdHJva2U7XG4gIGlmIChkb0ZpbGwgJiYgIWRvU3Ryb2tlKSB7XG4gICAgaWYgKHRoaXMuX2dldEZpbGwoKSA9PT0gc3R5bGVFbXB0eSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFkb0ZpbGwgJiYgZG9TdHJva2UpIHtcbiAgICBpZiAodGhpcy5fZ2V0U3Ryb2tlKCkgPT09IHN0eWxlRW1wdHkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfVxuICAvLyBUcmFuc2xhdGUgdGhlIGxpbmUgYnkgKDAuNSwgMC41KSB0byBkcmF3IGEgY3Jpc3AgcmVjdGFuZ2xlIGJvcmRlclxuICBpZiAodGhpcy5fZG9TdHJva2UgJiYgY3R4LmxpbmVXaWR0aCAlIDIgPT09IDEpIHtcbiAgICBjdHgudHJhbnNsYXRlKDAuNSwgMC41KTtcbiAgfVxuICBjdHguYmVnaW5QYXRoKCk7XG5cbiAgaWYgKHR5cGVvZiB0bCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBObyByb3VuZGVkIGNvcm5lcnNcbiAgICBjdHgucmVjdCh4LCB5LCB3LCBoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBBdCBsZWFzdCBvbmUgcm91bmRlZCBjb3JuZXJcbiAgICAvLyBTZXQgZGVmYXVsdHMgd2hlbiBub3Qgc3BlY2lmaWVkXG4gICAgaWYgKHR5cGVvZiB0ciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyID0gdGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYnIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBiciA9IHRyO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGJsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgYmwgPSBicjtcbiAgICB9XG5cbiAgICB2YXIgaHcgPSB3IC8gMjtcbiAgICB2YXIgaGggPSBoIC8gMjtcblxuICAgIC8vIENsaXAgcmFkaWlcbiAgICBpZiAodyA8IDIgKiB0bCkge1xuICAgICAgdGwgPSBodztcbiAgICB9XG4gICAgaWYgKGggPCAyICogdGwpIHtcbiAgICAgIHRsID0gaGg7XG4gICAgfVxuICAgIGlmICh3IDwgMiAqIHRyKSB7XG4gICAgICB0ciA9IGh3O1xuICAgIH1cbiAgICBpZiAoaCA8IDIgKiB0cikge1xuICAgICAgdHIgPSBoaDtcbiAgICB9XG4gICAgaWYgKHcgPCAyICogYnIpIHtcbiAgICAgIGJyID0gaHc7XG4gICAgfVxuICAgIGlmIChoIDwgMiAqIGJyKSB7XG4gICAgICBiciA9IGhoO1xuICAgIH1cbiAgICBpZiAodyA8IDIgKiBibCkge1xuICAgICAgYmwgPSBodztcbiAgICB9XG4gICAgaWYgKGggPCAyICogYmwpIHtcbiAgICAgIGJsID0gaGg7XG4gICAgfVxuXG4gICAgLy8gRHJhdyBzaGFwZVxuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubW92ZVRvKHggKyB0bCwgeSk7XG4gICAgY3R4LmFyY1RvKHggKyB3LCB5LCB4ICsgdywgeSArIGgsIHRyKTtcbiAgICBjdHguYXJjVG8oeCArIHcsIHkgKyBoLCB4LCB5ICsgaCwgYnIpO1xuICAgIGN0eC5hcmNUbyh4LCB5ICsgaCwgeCwgeSwgYmwpO1xuICAgIGN0eC5hcmNUbyh4LCB5LCB4ICsgdywgeSwgdGwpO1xuICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgfVxuICBpZiAodGhpcy5fZG9GaWxsKSB7XG4gICAgY3R4LmZpbGwoKTtcbiAgfVxuICBpZiAodGhpcy5fZG9TdHJva2UpIHtcbiAgICBjdHguc3Ryb2tlKCk7XG4gIH1cbiAgaWYgKHRoaXMuX2RvU3Ryb2tlICYmIGN0eC5saW5lV2lkdGggJSAyID09PSAxKSB7XG4gICAgY3R4LnRyYW5zbGF0ZSgtMC41LCAtMC41KTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnRyaWFuZ2xlID0gZnVuY3Rpb24oYXJncykge1xuICB2YXIgY3R4ID0gdGhpcy5kcmF3aW5nQ29udGV4dDtcbiAgdmFyIGRvRmlsbCA9IHRoaXMuX2RvRmlsbCxcbiAgICBkb1N0cm9rZSA9IHRoaXMuX2RvU3Ryb2tlO1xuICB2YXIgeDEgPSBhcmdzWzBdLFxuICAgIHkxID0gYXJnc1sxXTtcbiAgdmFyIHgyID0gYXJnc1syXSxcbiAgICB5MiA9IGFyZ3NbM107XG4gIHZhciB4MyA9IGFyZ3NbNF0sXG4gICAgeTMgPSBhcmdzWzVdO1xuICBpZiAoZG9GaWxsICYmICFkb1N0cm9rZSkge1xuICAgIGlmICh0aGlzLl9nZXRGaWxsKCkgPT09IHN0eWxlRW1wdHkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSBlbHNlIGlmICghZG9GaWxsICYmIGRvU3Ryb2tlKSB7XG4gICAgaWYgKHRoaXMuX2dldFN0cm9rZSgpID09PSBzdHlsZUVtcHR5KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cbiAgY3R4LmJlZ2luUGF0aCgpO1xuICBjdHgubW92ZVRvKHgxLCB5MSk7XG4gIGN0eC5saW5lVG8oeDIsIHkyKTtcbiAgY3R4LmxpbmVUbyh4MywgeTMpO1xuICBjdHguY2xvc2VQYXRoKCk7XG4gIGlmIChkb0ZpbGwpIHtcbiAgICBjdHguZmlsbCgpO1xuICB9XG4gIGlmIChkb1N0cm9rZSkge1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfVxufTtcblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUuZW5kU2hhcGUgPSBmdW5jdGlvbihcbiAgbW9kZSxcbiAgdmVydGljZXMsXG4gIGlzQ3VydmUsXG4gIGlzQmV6aWVyLFxuICBpc1F1YWRyYXRpYyxcbiAgaXNDb250b3VyLFxuICBzaGFwZUtpbmRcbikge1xuICBpZiAodmVydGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaWYgKCF0aGlzLl9kb1N0cm9rZSAmJiAhdGhpcy5fZG9GaWxsKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdmFyIGNsb3NlU2hhcGUgPSBtb2RlID09PSBjb25zdGFudHMuQ0xPU0U7XG4gIHZhciB2O1xuICBpZiAoY2xvc2VTaGFwZSAmJiAhaXNDb250b3VyKSB7XG4gICAgdmVydGljZXMucHVzaCh2ZXJ0aWNlc1swXSk7XG4gIH1cbiAgdmFyIGksIGo7XG4gIHZhciBudW1WZXJ0cyA9IHZlcnRpY2VzLmxlbmd0aDtcbiAgaWYgKGlzQ3VydmUgJiYgKHNoYXBlS2luZCA9PT0gY29uc3RhbnRzLlBPTFlHT04gfHwgc2hhcGVLaW5kID09PSBudWxsKSkge1xuICAgIGlmIChudW1WZXJ0cyA+IDMpIHtcbiAgICAgIHZhciBiID0gW10sXG4gICAgICAgIHMgPSAxIC0gdGhpcy5fY3VydmVUaWdodG5lc3M7XG4gICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5tb3ZlVG8odmVydGljZXNbMV1bMF0sIHZlcnRpY2VzWzFdWzFdKTtcbiAgICAgIGZvciAoaSA9IDE7IGkgKyAyIDwgbnVtVmVydHM7IGkrKykge1xuICAgICAgICB2ID0gdmVydGljZXNbaV07XG4gICAgICAgIGJbMF0gPSBbdlswXSwgdlsxXV07XG4gICAgICAgIGJbMV0gPSBbXG4gICAgICAgICAgdlswXSArIChzICogdmVydGljZXNbaSArIDFdWzBdIC0gcyAqIHZlcnRpY2VzW2kgLSAxXVswXSkgLyA2LFxuICAgICAgICAgIHZbMV0gKyAocyAqIHZlcnRpY2VzW2kgKyAxXVsxXSAtIHMgKiB2ZXJ0aWNlc1tpIC0gMV1bMV0pIC8gNlxuICAgICAgICBdO1xuICAgICAgICBiWzJdID0gW1xuICAgICAgICAgIHZlcnRpY2VzW2kgKyAxXVswXSArXG4gICAgICAgICAgICAocyAqIHZlcnRpY2VzW2ldWzBdIC0gcyAqIHZlcnRpY2VzW2kgKyAyXVswXSkgLyA2LFxuICAgICAgICAgIHZlcnRpY2VzW2kgKyAxXVsxXSArIChzICogdmVydGljZXNbaV1bMV0gLSBzICogdmVydGljZXNbaSArIDJdWzFdKSAvIDZcbiAgICAgICAgXTtcbiAgICAgICAgYlszXSA9IFt2ZXJ0aWNlc1tpICsgMV1bMF0sIHZlcnRpY2VzW2kgKyAxXVsxXV07XG4gICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuYmV6aWVyQ3VydmVUbyhcbiAgICAgICAgICBiWzFdWzBdLFxuICAgICAgICAgIGJbMV1bMV0sXG4gICAgICAgICAgYlsyXVswXSxcbiAgICAgICAgICBiWzJdWzFdLFxuICAgICAgICAgIGJbM11bMF0sXG4gICAgICAgICAgYlszXVsxXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGNsb3NlU2hhcGUpIHtcbiAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5saW5lVG8odmVydGljZXNbaSArIDFdWzBdLCB2ZXJ0aWNlc1tpICsgMV1bMV0pO1xuICAgICAgfVxuICAgICAgdGhpcy5fZG9GaWxsU3Ryb2tlQ2xvc2UoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgaXNCZXppZXIgJiZcbiAgICAoc2hhcGVLaW5kID09PSBjb25zdGFudHMuUE9MWUdPTiB8fCBzaGFwZUtpbmQgPT09IG51bGwpXG4gICkge1xuICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG51bVZlcnRzOyBpKyspIHtcbiAgICAgIGlmICh2ZXJ0aWNlc1tpXS5pc1ZlcnQpIHtcbiAgICAgICAgaWYgKHZlcnRpY2VzW2ldLm1vdmVUbykge1xuICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQubW92ZVRvKHZlcnRpY2VzW2ldWzBdLCB2ZXJ0aWNlc1tpXVsxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5saW5lVG8odmVydGljZXNbaV1bMF0sIHZlcnRpY2VzW2ldWzFdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5iZXppZXJDdXJ2ZVRvKFxuICAgICAgICAgIHZlcnRpY2VzW2ldWzBdLFxuICAgICAgICAgIHZlcnRpY2VzW2ldWzFdLFxuICAgICAgICAgIHZlcnRpY2VzW2ldWzJdLFxuICAgICAgICAgIHZlcnRpY2VzW2ldWzNdLFxuICAgICAgICAgIHZlcnRpY2VzW2ldWzRdLFxuICAgICAgICAgIHZlcnRpY2VzW2ldWzVdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2RvRmlsbFN0cm9rZUNsb3NlKCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgaXNRdWFkcmF0aWMgJiZcbiAgICAoc2hhcGVLaW5kID09PSBjb25zdGFudHMuUE9MWUdPTiB8fCBzaGFwZUtpbmQgPT09IG51bGwpXG4gICkge1xuICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG51bVZlcnRzOyBpKyspIHtcbiAgICAgIGlmICh2ZXJ0aWNlc1tpXS5pc1ZlcnQpIHtcbiAgICAgICAgaWYgKHZlcnRpY2VzW2ldLm1vdmVUbykge1xuICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQubW92ZVRvKFswXSwgdmVydGljZXNbaV1bMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQubGluZVRvKHZlcnRpY2VzW2ldWzBdLCB2ZXJ0aWNlc1tpXVsxXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQucXVhZHJhdGljQ3VydmVUbyhcbiAgICAgICAgICB2ZXJ0aWNlc1tpXVswXSxcbiAgICAgICAgICB2ZXJ0aWNlc1tpXVsxXSxcbiAgICAgICAgICB2ZXJ0aWNlc1tpXVsyXSxcbiAgICAgICAgICB2ZXJ0aWNlc1tpXVszXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9kb0ZpbGxTdHJva2VDbG9zZSgpO1xuICB9IGVsc2Uge1xuICAgIGlmIChzaGFwZUtpbmQgPT09IGNvbnN0YW50cy5QT0lOVFMpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1WZXJ0czsgaSsrKSB7XG4gICAgICAgIHYgPSB2ZXJ0aWNlc1tpXTtcbiAgICAgICAgaWYgKHRoaXMuX2RvU3Ryb2tlKSB7XG4gICAgICAgICAgdGhpcy5fcEluc3Quc3Ryb2tlKHZbNl0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BJbnN0LnBvaW50KHZbMF0sIHZbMV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2hhcGVLaW5kID09PSBjb25zdGFudHMuTElORVMpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgbnVtVmVydHM7IGkgKz0gMikge1xuICAgICAgICB2ID0gdmVydGljZXNbaV07XG4gICAgICAgIGlmICh0aGlzLl9kb1N0cm9rZSkge1xuICAgICAgICAgIHRoaXMuX3BJbnN0LnN0cm9rZSh2ZXJ0aWNlc1tpICsgMV1bNl0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BJbnN0LmxpbmUodlswXSwgdlsxXSwgdmVydGljZXNbaSArIDFdWzBdLCB2ZXJ0aWNlc1tpICsgMV1bMV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2hhcGVLaW5kID09PSBjb25zdGFudHMuVFJJQU5HTEVTKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpICsgMiA8IG51bVZlcnRzOyBpICs9IDMpIHtcbiAgICAgICAgdiA9IHZlcnRpY2VzW2ldO1xuICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0Lm1vdmVUbyh2WzBdLCB2WzFdKTtcbiAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5saW5lVG8odmVydGljZXNbaSArIDFdWzBdLCB2ZXJ0aWNlc1tpICsgMV1bMV0pO1xuICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmxpbmVUbyh2ZXJ0aWNlc1tpICsgMl1bMF0sIHZlcnRpY2VzW2kgKyAyXVsxXSk7XG4gICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQubGluZVRvKHZbMF0sIHZbMV0pO1xuICAgICAgICBpZiAodGhpcy5fZG9GaWxsKSB7XG4gICAgICAgICAgdGhpcy5fcEluc3QuZmlsbCh2ZXJ0aWNlc1tpICsgMl1bNV0pO1xuICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kb1N0cm9rZSkge1xuICAgICAgICAgIHRoaXMuX3BJbnN0LnN0cm9rZSh2ZXJ0aWNlc1tpICsgMl1bNl0pO1xuICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNoYXBlS2luZCA9PT0gY29uc3RhbnRzLlRSSUFOR0xFX1NUUklQKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpICsgMSA8IG51bVZlcnRzOyBpKyspIHtcbiAgICAgICAgdiA9IHZlcnRpY2VzW2ldO1xuICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0Lm1vdmVUbyh2ZXJ0aWNlc1tpICsgMV1bMF0sIHZlcnRpY2VzW2kgKyAxXVsxXSk7XG4gICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQubGluZVRvKHZbMF0sIHZbMV0pO1xuICAgICAgICBpZiAodGhpcy5fZG9TdHJva2UpIHtcbiAgICAgICAgICB0aGlzLl9wSW5zdC5zdHJva2UodmVydGljZXNbaSArIDFdWzZdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZG9GaWxsKSB7XG4gICAgICAgICAgdGhpcy5fcEluc3QuZmlsbCh2ZXJ0aWNlc1tpICsgMV1bNV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpICsgMiA8IG51bVZlcnRzKSB7XG4gICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5saW5lVG8odmVydGljZXNbaSArIDJdWzBdLCB2ZXJ0aWNlc1tpICsgMl1bMV0pO1xuICAgICAgICAgIGlmICh0aGlzLl9kb1N0cm9rZSkge1xuICAgICAgICAgICAgdGhpcy5fcEluc3Quc3Ryb2tlKHZlcnRpY2VzW2kgKyAyXVs2XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9kb0ZpbGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3BJbnN0LmZpbGwodmVydGljZXNbaSArIDJdWzVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZG9GaWxsU3Ryb2tlQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNoYXBlS2luZCA9PT0gY29uc3RhbnRzLlRSSUFOR0xFX0ZBTikge1xuICAgICAgaWYgKG51bVZlcnRzID4gMikge1xuICAgICAgICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdHJ5IHRvIGJhdGNoIGFzIG1hbnkgb2YgdGhlXG4gICAgICAgIC8vIGZpbGwgYW5kIHN0cm9rZSBjYWxscyBhcyBwb3NzaWJsZS5cbiAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgZm9yIChpID0gMjsgaSA8IG51bVZlcnRzOyBpKyspIHtcbiAgICAgICAgICB2ID0gdmVydGljZXNbaV07XG4gICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5tb3ZlVG8odmVydGljZXNbMF1bMF0sIHZlcnRpY2VzWzBdWzFdKTtcbiAgICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmxpbmVUbyh2ZXJ0aWNlc1tpIC0gMV1bMF0sIHZlcnRpY2VzW2kgLSAxXVsxXSk7XG4gICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5saW5lVG8odlswXSwgdlsxXSk7XG4gICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5saW5lVG8odmVydGljZXNbMF1bMF0sIHZlcnRpY2VzWzBdWzFdKTtcbiAgICAgICAgICAvLyBJZiB0aGUgbmV4dCBjb2xvdXIgaXMgZ29pbmcgdG8gYmUgZGlmZmVyZW50LCBzdHJva2UgLyBmaWxsIG5vd1xuICAgICAgICAgIGlmIChpIDwgbnVtVmVydHMgLSAxKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICh0aGlzLl9kb0ZpbGwgJiYgdls1XSAhPT0gdmVydGljZXNbaSArIDFdWzVdKSB8fFxuICAgICAgICAgICAgICAodGhpcy5fZG9TdHJva2UgJiYgdls2XSAhPT0gdmVydGljZXNbaSArIDFdWzZdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9kb0ZpbGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wSW5zdC5maWxsKHZbNV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuZmlsbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BJbnN0LmZpbGwodmVydGljZXNbaSArIDFdWzVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpcy5fZG9TdHJva2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wSW5zdC5zdHJva2Uodls2XSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wSW5zdC5zdHJva2UodmVydGljZXNbaSArIDFdWzZdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmJlZ2luUGF0aCgpOyAvLyBCZWdpbiB0aGUgbmV4dCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZG9GaWxsU3Ryb2tlQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNoYXBlS2luZCA9PT0gY29uc3RhbnRzLlFVQURTKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpICsgMyA8IG51bVZlcnRzOyBpICs9IDQpIHtcbiAgICAgICAgdiA9IHZlcnRpY2VzW2ldO1xuICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0Lm1vdmVUbyh2WzBdLCB2WzFdKTtcbiAgICAgICAgZm9yIChqID0gMTsgaiA8IDQ7IGorKykge1xuICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQubGluZVRvKHZlcnRpY2VzW2kgKyBqXVswXSwgdmVydGljZXNbaSArIGpdWzFdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmxpbmVUbyh2WzBdLCB2WzFdKTtcbiAgICAgICAgaWYgKHRoaXMuX2RvRmlsbCkge1xuICAgICAgICAgIHRoaXMuX3BJbnN0LmZpbGwodmVydGljZXNbaSArIDNdWzVdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZG9TdHJva2UpIHtcbiAgICAgICAgICB0aGlzLl9wSW5zdC5zdHJva2UodmVydGljZXNbaSArIDNdWzZdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kb0ZpbGxTdHJva2VDbG9zZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2hhcGVLaW5kID09PSBjb25zdGFudHMuUVVBRF9TVFJJUCkge1xuICAgICAgaWYgKG51bVZlcnRzID4gMykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpICsgMSA8IG51bVZlcnRzOyBpICs9IDIpIHtcbiAgICAgICAgICB2ID0gdmVydGljZXNbaV07XG4gICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgICBpZiAoaSArIDMgPCBudW1WZXJ0cykge1xuICAgICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5tb3ZlVG8odmVydGljZXNbaSArIDJdWzBdLCB2ZXJ0aWNlc1tpICsgMl1bMV0pO1xuICAgICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5saW5lVG8odlswXSwgdlsxXSk7XG4gICAgICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmxpbmVUbyh2ZXJ0aWNlc1tpICsgMV1bMF0sIHZlcnRpY2VzW2kgKyAxXVsxXSk7XG4gICAgICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmxpbmVUbyh2ZXJ0aWNlc1tpICsgM11bMF0sIHZlcnRpY2VzW2kgKyAzXVsxXSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZG9GaWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BJbnN0LmZpbGwodmVydGljZXNbaSArIDNdWzVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9kb1N0cm9rZSkge1xuICAgICAgICAgICAgICB0aGlzLl9wSW5zdC5zdHJva2UodmVydGljZXNbaSArIDNdWzZdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5tb3ZlVG8odlswXSwgdlsxXSk7XG4gICAgICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmxpbmVUbyh2ZXJ0aWNlc1tpICsgMV1bMF0sIHZlcnRpY2VzW2kgKyAxXVsxXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2RvRmlsbFN0cm9rZUNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQubW92ZVRvKHZlcnRpY2VzWzBdWzBdLCB2ZXJ0aWNlc1swXVsxXSk7XG4gICAgICBmb3IgKGkgPSAxOyBpIDwgbnVtVmVydHM7IGkrKykge1xuICAgICAgICB2ID0gdmVydGljZXNbaV07XG4gICAgICAgIGlmICh2LmlzVmVydCkge1xuICAgICAgICAgIGlmICh2Lm1vdmVUbykge1xuICAgICAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5tb3ZlVG8odlswXSwgdlsxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQubGluZVRvKHZbMF0sIHZbMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fZG9GaWxsU3Ryb2tlQ2xvc2UoKTtcbiAgICB9XG4gIH1cbiAgaXNDdXJ2ZSA9IGZhbHNlO1xuICBpc0JlemllciA9IGZhbHNlO1xuICBpc1F1YWRyYXRpYyA9IGZhbHNlO1xuICBpc0NvbnRvdXIgPSBmYWxzZTtcbiAgaWYgKGNsb3NlU2hhcGUpIHtcbiAgICB2ZXJ0aWNlcy5wb3AoKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBTSEFQRSB8IEF0dHJpYnV0ZXNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUubm9TbW9vdGggPSBmdW5jdGlvbigpIHtcbiAgaWYgKCdpbWFnZVNtb290aGluZ0VuYWJsZWQnIGluIHRoaXMuZHJhd2luZ0NvbnRleHQpIHtcbiAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUuc21vb3RoID0gZnVuY3Rpb24oKSB7XG4gIGlmICgnaW1hZ2VTbW9vdGhpbmdFbmFibGVkJyBpbiB0aGlzLmRyYXdpbmdDb250ZXh0KSB7XG4gICAgdGhpcy5kcmF3aW5nQ29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUuc3Ryb2tlQ2FwID0gZnVuY3Rpb24oY2FwKSB7XG4gIGlmIChcbiAgICBjYXAgPT09IGNvbnN0YW50cy5ST1VORCB8fFxuICAgIGNhcCA9PT0gY29uc3RhbnRzLlNRVUFSRSB8fFxuICAgIGNhcCA9PT0gY29uc3RhbnRzLlBST0pFQ1RcbiAgKSB7XG4gICAgdGhpcy5kcmF3aW5nQ29udGV4dC5saW5lQ2FwID0gY2FwO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUuc3Ryb2tlSm9pbiA9IGZ1bmN0aW9uKGpvaW4pIHtcbiAgaWYgKFxuICAgIGpvaW4gPT09IGNvbnN0YW50cy5ST1VORCB8fFxuICAgIGpvaW4gPT09IGNvbnN0YW50cy5CRVZFTCB8fFxuICAgIGpvaW4gPT09IGNvbnN0YW50cy5NSVRFUlxuICApIHtcbiAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmxpbmVKb2luID0gam9pbjtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnN0cm9rZVdlaWdodCA9IGZ1bmN0aW9uKHcpIHtcbiAgaWYgKHR5cGVvZiB3ID09PSAndW5kZWZpbmVkJyB8fCB3ID09PSAwKSB7XG4gICAgLy8gaGFjayBiZWNhdXNlIGxpbmVXaWR0aCAwIGRvZXNuJ3Qgd29ya1xuICAgIHRoaXMuZHJhd2luZ0NvbnRleHQubGluZVdpZHRoID0gMC4wMDAxO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZHJhd2luZ0NvbnRleHQubGluZVdpZHRoID0gdztcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLl9nZXRGaWxsID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5fY2FjaGVkRmlsbFN0eWxlKSB7XG4gICAgdGhpcy5fY2FjaGVkRmlsbFN0eWxlID0gdGhpcy5kcmF3aW5nQ29udGV4dC5maWxsU3R5bGU7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2NhY2hlZEZpbGxTdHlsZTtcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLl9zZXRGaWxsID0gZnVuY3Rpb24oZmlsbFN0eWxlKSB7XG4gIGlmIChmaWxsU3R5bGUgIT09IHRoaXMuX2NhY2hlZEZpbGxTdHlsZSkge1xuICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuZmlsbFN0eWxlID0gZmlsbFN0eWxlO1xuICAgIHRoaXMuX2NhY2hlZEZpbGxTdHlsZSA9IGZpbGxTdHlsZTtcbiAgfVxufTtcblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUuX2dldFN0cm9rZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuX2NhY2hlZFN0cm9rZVN0eWxlKSB7XG4gICAgdGhpcy5fY2FjaGVkU3Ryb2tlU3R5bGUgPSB0aGlzLmRyYXdpbmdDb250ZXh0LnN0cm9rZVN0eWxlO1xuICB9XG4gIHJldHVybiB0aGlzLl9jYWNoZWRTdHJva2VTdHlsZTtcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLl9zZXRTdHJva2UgPSBmdW5jdGlvbihzdHJva2VTdHlsZSkge1xuICBpZiAoc3Ryb2tlU3R5bGUgIT09IHRoaXMuX2NhY2hlZFN0cm9rZVN0eWxlKSB7XG4gICAgdGhpcy5kcmF3aW5nQ29udGV4dC5zdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlO1xuICAgIHRoaXMuX2NhY2hlZFN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGU7XG4gIH1cbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFNIQVBFIHwgQ3VydmVzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS5iZXppZXIgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgdGhpcy5fcEluc3QuYmVnaW5TaGFwZSgpO1xuICB0aGlzLl9wSW5zdC52ZXJ0ZXgoeDEsIHkxKTtcbiAgdGhpcy5fcEluc3QuYmV6aWVyVmVydGV4KHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpO1xuICB0aGlzLl9wSW5zdC5lbmRTaGFwZSgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLmN1cnZlID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0KSB7XG4gIHRoaXMuX3BJbnN0LmJlZ2luU2hhcGUoKTtcbiAgdGhpcy5fcEluc3QuY3VydmVWZXJ0ZXgoeDEsIHkxKTtcbiAgdGhpcy5fcEluc3QuY3VydmVWZXJ0ZXgoeDIsIHkyKTtcbiAgdGhpcy5fcEluc3QuY3VydmVWZXJ0ZXgoeDMsIHkzKTtcbiAgdGhpcy5fcEluc3QuY3VydmVWZXJ0ZXgoeDQsIHk0KTtcbiAgdGhpcy5fcEluc3QuZW5kU2hhcGUoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBTSEFQRSB8IFZlcnRleFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS5fZG9GaWxsU3Ryb2tlQ2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX2RvRmlsbCkge1xuICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuZmlsbCgpO1xuICB9XG4gIGlmICh0aGlzLl9kb1N0cm9rZSkge1xuICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuc3Ryb2tlKCk7XG4gIH1cbiAgdGhpcy5kcmF3aW5nQ29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFRSQU5TRk9STVxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS5hcHBseU1hdHJpeCA9IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdGhpcy5kcmF3aW5nQ29udGV4dC50cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG59O1xuXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS5yZXNldE1hdHJpeCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmRyYXdpbmdDb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgdGhpcy5kcmF3aW5nQ29udGV4dC5zY2FsZShcbiAgICB0aGlzLl9wSW5zdC5fcGl4ZWxEZW5zaXR5LFxuICAgIHRoaXMuX3BJbnN0Ll9waXhlbERlbnNpdHlcbiAgKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS5yb3RhdGUgPSBmdW5jdGlvbihyYWQpIHtcbiAgdGhpcy5kcmF3aW5nQ29udGV4dC5yb3RhdGUocmFkKTtcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24oeCwgeSkge1xuICB0aGlzLmRyYXdpbmdDb250ZXh0LnNjYWxlKHgsIHkpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnNoZWFyWCA9IGZ1bmN0aW9uKHJhZCkge1xuICB0aGlzLmRyYXdpbmdDb250ZXh0LnRyYW5zZm9ybSgxLCAwLCBNYXRoLnRhbihyYWQpLCAxLCAwLCAwKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS5zaGVhclkgPSBmdW5jdGlvbihyYWQpIHtcbiAgdGhpcy5kcmF3aW5nQ29udGV4dC50cmFuc2Zvcm0oMSwgTWF0aC50YW4ocmFkKSwgMCwgMSwgMCwgMCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24oeCwgeSkge1xuICAvLyBzdXBwb3J0IHBhc3NpbmcgYSB2ZWN0b3IgYXMgdGhlIDFzdCBwYXJhbWV0ZXJcbiAgaWYgKHggaW5zdGFuY2VvZiBwNS5WZWN0b3IpIHtcbiAgICB5ID0geC55O1xuICAgIHggPSB4Lng7XG4gIH1cbiAgdGhpcy5kcmF3aW5nQ29udGV4dC50cmFuc2xhdGUoeCwgeSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gVFlQT0dSQVBIWVxuLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHN0ciwgeCwgeSwgbWF4V2lkdGgsIG1heEhlaWdodCkge1xuICB2YXIgcCA9IHRoaXMuX3BJbnN0LFxuICAgIGNhcnMsXG4gICAgbixcbiAgICBpaSxcbiAgICBqaixcbiAgICBsaW5lLFxuICAgIHRlc3RMaW5lLFxuICAgIHRlc3RXaWR0aCxcbiAgICB3b3JkcyxcbiAgICB0b3RhbEhlaWdodCxcbiAgICBiYXNlbGluZUhhY2tlZCxcbiAgICBmaW5hbE1heEhlaWdodCA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgLy8gYmFzZWxpbmVIYWNrZWQ6IChIQUNLKVxuICAvLyBBIHRlbXBvcmFyeSBmaXggdG8gY29uZm9ybSB0byBQcm9jZXNzaW5nJ3MgaW1wbGVtZW50YXRpb25cbiAgLy8gb2YgQkFTRUxJTkUgdmVydGljYWwgYWxpZ25tZW50IGluIGEgYm91bmRpbmcgYm94XG5cbiAgaWYgKCEodGhpcy5fZG9GaWxsIHx8IHRoaXMuX2RvU3Ryb2tlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RyID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHN0ciA9IHN0ci50b1N0cmluZygpO1xuICB9XG5cbiAgc3RyID0gc3RyLnJlcGxhY2UoLyhcXHQpL2csICcgICcpO1xuICBjYXJzID0gc3RyLnNwbGl0KCdcXG4nKTtcblxuICBpZiAodHlwZW9mIG1heFdpZHRoICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRvdGFsSGVpZ2h0ID0gMDtcbiAgICBmb3IgKGlpID0gMDsgaWkgPCBjYXJzLmxlbmd0aDsgaWkrKykge1xuICAgICAgbGluZSA9ICcnO1xuICAgICAgd29yZHMgPSBjYXJzW2lpXS5zcGxpdCgnICcpO1xuICAgICAgZm9yIChuID0gMDsgbiA8IHdvcmRzLmxlbmd0aDsgbisrKSB7XG4gICAgICAgIHRlc3RMaW5lID0gbGluZSArIHdvcmRzW25dICsgJyAnO1xuICAgICAgICB0ZXN0V2lkdGggPSB0aGlzLnRleHRXaWR0aCh0ZXN0TGluZSk7XG4gICAgICAgIGlmICh0ZXN0V2lkdGggPiBtYXhXaWR0aCkge1xuICAgICAgICAgIGxpbmUgPSB3b3Jkc1tuXSArICcgJztcbiAgICAgICAgICB0b3RhbEhlaWdodCArPSBwLnRleHRMZWFkaW5nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGluZSA9IHRlc3RMaW5lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3JlY3RNb2RlID09PSBjb25zdGFudHMuQ0VOVEVSKSB7XG4gICAgICB4IC09IG1heFdpZHRoIC8gMjtcbiAgICAgIHkgLT0gbWF4SGVpZ2h0IC8gMjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMuZHJhd2luZ0NvbnRleHQudGV4dEFsaWduKSB7XG4gICAgICBjYXNlIGNvbnN0YW50cy5DRU5URVI6XG4gICAgICAgIHggKz0gbWF4V2lkdGggLyAyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgY29uc3RhbnRzLlJJR0hUOlxuICAgICAgICB4ICs9IG1heFdpZHRoO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1heEhlaWdodCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5kcmF3aW5nQ29udGV4dC50ZXh0QmFzZWxpbmUpIHtcbiAgICAgICAgY2FzZSBjb25zdGFudHMuQk9UVE9NOlxuICAgICAgICAgIHkgKz0gbWF4SGVpZ2h0IC0gdG90YWxIZWlnaHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgY29uc3RhbnRzLl9DVFhfTUlERExFOiAvLyBDRU5URVI/XG4gICAgICAgICAgeSArPSAobWF4SGVpZ2h0IC0gdG90YWxIZWlnaHQpIC8gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBjb25zdGFudHMuQkFTRUxJTkU6XG4gICAgICAgICAgYmFzZWxpbmVIYWNrZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQudGV4dEJhc2VsaW5lID0gY29uc3RhbnRzLlRPUDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gcmVtZW1iZXIgdGhlIG1heC1hbGxvd2VkIHktcG9zaXRpb24gZm9yIGFueSBsaW5lIChmaXggdG8gIzkyOClcbiAgICAgIGZpbmFsTWF4SGVpZ2h0ID0geSArIG1heEhlaWdodCAtIHAudGV4dEFzY2VudCgpO1xuICAgIH1cblxuICAgIGZvciAoaWkgPSAwOyBpaSA8IGNhcnMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICBsaW5lID0gJyc7XG4gICAgICB3b3JkcyA9IGNhcnNbaWldLnNwbGl0KCcgJyk7XG4gICAgICBmb3IgKG4gPSAwOyBuIDwgd29yZHMubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgdGVzdExpbmUgPSBsaW5lICsgd29yZHNbbl0gKyAnICc7XG4gICAgICAgIHRlc3RXaWR0aCA9IHRoaXMudGV4dFdpZHRoKHRlc3RMaW5lKTtcbiAgICAgICAgaWYgKHRlc3RXaWR0aCA+IG1heFdpZHRoICYmIGxpbmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX3JlbmRlclRleHQocCwgbGluZSwgeCwgeSwgZmluYWxNYXhIZWlnaHQpO1xuICAgICAgICAgIGxpbmUgPSB3b3Jkc1tuXSArICcgJztcbiAgICAgICAgICB5ICs9IHAudGV4dExlYWRpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaW5lID0gdGVzdExpbmU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVuZGVyVGV4dChwLCBsaW5lLCB4LCB5LCBmaW5hbE1heEhlaWdodCk7XG4gICAgICB5ICs9IHAudGV4dExlYWRpbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gT2Zmc2V0IHRvIGFjY291bnQgZm9yIHZlcnRpY2FsbHkgY2VudGVyaW5nIG11bHRpcGxlIGxpbmVzIG9mIHRleHQgLSBub1xuICAgIC8vIG5lZWQgdG8gYWRqdXN0IGFueXRoaW5nIGZvciB2ZXJ0aWNhbCBhbGlnbiB0b3Agb3IgYmFzZWxpbmVcbiAgICB2YXIgb2Zmc2V0ID0gMCxcbiAgICAgIHZBbGlnbiA9IHAudGV4dEFsaWduKCkudmVydGljYWw7XG4gICAgaWYgKHZBbGlnbiA9PT0gY29uc3RhbnRzLkNFTlRFUikge1xuICAgICAgb2Zmc2V0ID0gKGNhcnMubGVuZ3RoIC0gMSkgKiBwLnRleHRMZWFkaW5nKCkgLyAyO1xuICAgIH0gZWxzZSBpZiAodkFsaWduID09PSBjb25zdGFudHMuQk9UVE9NKSB7XG4gICAgICBvZmZzZXQgPSAoY2Fycy5sZW5ndGggLSAxKSAqIHAudGV4dExlYWRpbmcoKTtcbiAgICB9XG5cbiAgICBmb3IgKGpqID0gMDsgamogPCBjYXJzLmxlbmd0aDsgamorKykge1xuICAgICAgdGhpcy5fcmVuZGVyVGV4dChwLCBjYXJzW2pqXSwgeCwgeSAtIG9mZnNldCwgZmluYWxNYXhIZWlnaHQpO1xuICAgICAgeSArPSBwLnRleHRMZWFkaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2VsaW5lSGFja2VkKSB7XG4gICAgdGhpcy5kcmF3aW5nQ29udGV4dC50ZXh0QmFzZWxpbmUgPSBjb25zdGFudHMuQkFTRUxJTkU7XG4gIH1cblxuICByZXR1cm4gcDtcbn07XG5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLl9yZW5kZXJUZXh0ID0gZnVuY3Rpb24ocCwgbGluZSwgeCwgeSwgbWF4WSkge1xuICBpZiAoeSA+PSBtYXhZKSB7XG4gICAgcmV0dXJuOyAvLyBkb24ndCByZW5kZXIgbGluZXMgYmV5b25kIG91ciBtYXhZIHBvc2l0aW9uXG4gIH1cblxuICBwLnB1c2goKTsgLy8gZml4IHRvICM4MDNcblxuICBpZiAoIXRoaXMuX2lzT3BlblR5cGUoKSkge1xuICAgIC8vIGEgc3lzdGVtL2Jyb3dzZXIgZm9udFxuXG4gICAgLy8gbm8gc3Ryb2tlIHVubGVzcyBzcGVjaWZpZWQgYnkgdXNlclxuICAgIGlmICh0aGlzLl9kb1N0cm9rZSAmJiB0aGlzLl9zdHJva2VTZXQpIHtcbiAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQuc3Ryb2tlVGV4dChsaW5lLCB4LCB5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZG9GaWxsKSB7XG4gICAgICAvLyBpZiBmaWxsIGhhc24ndCBiZWVuIHNldCBieSB1c2VyLCB1c2UgZGVmYXVsdCB0ZXh0IGZpbGxcbiAgICAgIGlmICghdGhpcy5fZmlsbFNldCkge1xuICAgICAgICB0aGlzLl9zZXRGaWxsKGNvbnN0YW50cy5fREVGQVVMVF9URVhUX0ZJTEwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LmZpbGxUZXh0KGxpbmUsIHgsIHkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBhbiBvcGVudHlwZSBmb250LCBsZXQgaXQgaGFuZGxlIHRoZSByZW5kZXJpbmdcblxuICAgIHRoaXMuX3RleHRGb250Ll9yZW5kZXJQYXRoKGxpbmUsIHgsIHksIHsgcmVuZGVyZXI6IHRoaXMgfSk7XG4gIH1cblxuICBwLnBvcCgpO1xuXG4gIHJldHVybiBwO1xufTtcblxucDUuUmVuZGVyZXIyRC5wcm90b3R5cGUudGV4dFdpZHRoID0gZnVuY3Rpb24ocykge1xuICBpZiAodGhpcy5faXNPcGVuVHlwZSgpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RleHRGb250Ll90ZXh0V2lkdGgocywgdGhpcy5fdGV4dFNpemUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZHJhd2luZ0NvbnRleHQubWVhc3VyZVRleHQocykud2lkdGg7XG59O1xuXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS50ZXh0QWxpZ24gPSBmdW5jdGlvbihoLCB2KSB7XG4gIGlmICh0eXBlb2YgaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoXG4gICAgICBoID09PSBjb25zdGFudHMuTEVGVCB8fFxuICAgICAgaCA9PT0gY29uc3RhbnRzLlJJR0hUIHx8XG4gICAgICBoID09PSBjb25zdGFudHMuQ0VOVEVSXG4gICAgKSB7XG4gICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LnRleHRBbGlnbiA9IGg7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdiA9PT0gY29uc3RhbnRzLlRPUCB8fFxuICAgICAgdiA9PT0gY29uc3RhbnRzLkJPVFRPTSB8fFxuICAgICAgdiA9PT0gY29uc3RhbnRzLkNFTlRFUiB8fFxuICAgICAgdiA9PT0gY29uc3RhbnRzLkJBU0VMSU5FXG4gICAgKSB7XG4gICAgICBpZiAodiA9PT0gY29uc3RhbnRzLkNFTlRFUikge1xuICAgICAgICB0aGlzLmRyYXdpbmdDb250ZXh0LnRleHRCYXNlbGluZSA9IGNvbnN0YW50cy5fQ1RYX01JRERMRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZHJhd2luZ0NvbnRleHQudGV4dEJhc2VsaW5lID0gdjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcEluc3Q7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHZhbGlnbiA9IHRoaXMuZHJhd2luZ0NvbnRleHQudGV4dEJhc2VsaW5lO1xuXG4gICAgaWYgKHZhbGlnbiA9PT0gY29uc3RhbnRzLl9DVFhfTUlERExFKSB7XG4gICAgICB2YWxpZ24gPSBjb25zdGFudHMuQ0VOVEVSO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBob3Jpem9udGFsOiB0aGlzLmRyYXdpbmdDb250ZXh0LnRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsOiB2YWxpZ25cbiAgICB9O1xuICB9XG59O1xuXG5wNS5SZW5kZXJlcjJELnByb3RvdHlwZS5fYXBwbHlUZXh0UHJvcGVydGllcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZm9udCxcbiAgICBwID0gdGhpcy5fcEluc3Q7XG5cbiAgdGhpcy5fc2V0UHJvcGVydHkoJ190ZXh0QXNjZW50JywgbnVsbCk7XG4gIHRoaXMuX3NldFByb3BlcnR5KCdfdGV4dERlc2NlbnQnLCBudWxsKTtcblxuICBmb250ID0gdGhpcy5fdGV4dEZvbnQ7XG5cbiAgaWYgKHRoaXMuX2lzT3BlblR5cGUoKSkge1xuICAgIGZvbnQgPSB0aGlzLl90ZXh0Rm9udC5mb250LmZhbWlseU5hbWU7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ190ZXh0U3R5bGUnLCB0aGlzLl90ZXh0Rm9udC5mb250LnN0eWxlTmFtZSk7XG4gIH1cblxuICB0aGlzLmRyYXdpbmdDb250ZXh0LmZvbnQgPVxuICAgICh0aGlzLl90ZXh0U3R5bGUgfHwgJ25vcm1hbCcpICtcbiAgICAnICcgK1xuICAgICh0aGlzLl90ZXh0U2l6ZSB8fCAxMikgK1xuICAgICdweCAnICtcbiAgICAoZm9udCB8fCAnc2Fucy1zZXJpZicpO1xuXG4gIHJldHVybiBwO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gU1RSVUNUVVJFXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vIGEgcHVzaCgpIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy5cbi8vIHRoZSByZW5kZXJlciBzaG91bGQgcmV0dXJuIGEgJ3N0eWxlJyBvYmplY3QgdGhhdCBpdCB3aXNoZXMgdG9cbi8vIHN0b3JlIG9uIHRoZSBwdXNoIHN0YWNrLlxuLy8gZGVyaXZlZCByZW5kZXJlcnMgc2hvdWxkIGNhbGwgdGhlIGJhc2UgY2xhc3MnIHB1c2goKSBtZXRob2Rcbi8vIHRvIGZldGNoIHRoZSBiYXNlIHN0eWxlIG9iamVjdC5cbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kcmF3aW5nQ29udGV4dC5zYXZlKCk7XG5cbiAgLy8gZ2V0IHRoZSBiYXNlIHJlbmRlcmVyIHN0eWxlXG4gIHJldHVybiBwNS5SZW5kZXJlci5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzKTtcbn07XG5cbi8vIGEgcG9wKCkgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzXG4vLyB0aGUgcmVuZGVyZXIgaXMgcGFzc2VkIHRoZSAnc3R5bGUnIG9iamVjdCB0aGF0IGl0IHJldHVybmVkXG4vLyBmcm9tIGl0cyBwdXNoKCkgbWV0aG9kLlxuLy8gZGVyaXZlZCByZW5kZXJlcnMgc2hvdWxkIHBhc3MgdGhpcyBvYmplY3QgdG8gdGhlaXIgYmFzZVxuLy8gY2xhc3MnIHBvcCBtZXRob2RcbnA1LlJlbmRlcmVyMkQucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uKHN0eWxlKSB7XG4gIHRoaXMuZHJhd2luZ0NvbnRleHQucmVzdG9yZSgpO1xuICAvLyBSZS1jYWNoZSB0aGUgZmlsbCAvIHN0cm9rZSBzdGF0ZVxuICB0aGlzLl9jYWNoZWRGaWxsU3R5bGUgPSB0aGlzLmRyYXdpbmdDb250ZXh0LmZpbGxTdHlsZTtcbiAgdGhpcy5fY2FjaGVkU3Ryb2tlU3R5bGUgPSB0aGlzLmRyYXdpbmdDb250ZXh0LnN0cm9rZVN0eWxlO1xuXG4gIHA1LlJlbmRlcmVyLnByb3RvdHlwZS5wb3AuY2FsbCh0aGlzLCBzdHlsZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1LlJlbmRlcmVyMkQ7XG5cbn0se1wiLi4vaW1hZ2UvZmlsdGVyc1wiOjQxLFwiLi9jYW52YXNcIjoyMCxcIi4vY29uc3RhbnRzXCI6MjEsXCIuL2NvcmVcIjoyMixcIi4vcDUuUmVuZGVyZXJcIjoyOX1dLDMxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBSZW5kZXJpbmdcbiAqIEBzdWJtb2R1bGUgUmVuZGVyaW5nXG4gKiBAZm9yIHA1XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuL2NvcmUnKTtcbnZhciBjb25zdGFudHMgPSBfZGVyZXFfKCcuL2NvbnN0YW50cycpO1xuX2RlcmVxXygnLi9wNS5HcmFwaGljcycpO1xuX2RlcmVxXygnLi9wNS5SZW5kZXJlcjJEJyk7XG5fZGVyZXFfKCcuLi93ZWJnbC9wNS5SZW5kZXJlckdMJyk7XG52YXIgZGVmYXVsdElkID0gJ2RlZmF1bHRDYW52YXMwJzsgLy8gdGhpcyBnZXRzIHNldCBhZ2FpbiBpbiBjcmVhdGVDYW52YXNcbnZhciBkZWZhdWx0Q2xhc3MgPSAncDVDYW52YXMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjYW52YXMgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQsIGFuZCBzZXRzIHRoZSBkaW1lbnNpb25zIG9mIGl0XG4gKiBpbiBwaXhlbHMuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZSBzdGFydCBvZiBzZXR1cC5cbiAqIENhbGxpbmcgY3JlYXRlQ2FudmFzIG1vcmUgdGhhbiBvbmNlIGluIGEgc2tldGNoIHdpbGwgcmVzdWx0IGluIHZlcnlcbiAqIHVucHJlZGljdGFibGUgYmVoYXZpb3IuIElmIHlvdSB3YW50IG1vcmUgdGhhbiBvbmUgZHJhd2luZyBjYW52YXNcbiAqIHlvdSBjb3VsZCB1c2UgY3JlYXRlR3JhcGhpY3MgKGhpZGRlbiBieSBkZWZhdWx0IGJ1dCBpdCBjYW4gYmUgc2hvd24pLlxuICogPGJyPjxicj5cbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGVzIHdpZHRoIGFuZCBoZWlnaHQgYXJlIHNldCBieSB0aGUgcGFyYW1ldGVycyBwYXNzZWRcbiAqIHRvIHRoaXMgZnVuY3Rpb24uIElmIGNyZWF0ZUNhbnZhcygpIGlzIG5vdCB1c2VkLCB0aGUgd2luZG93IHdpbGwgYmVcbiAqIGdpdmVuIGEgZGVmYXVsdCBzaXplIG9mIDEwMHgxMDAgcGl4ZWxzLlxuICogPGJyPjxicj5cbiAqIEZvciBtb3JlIHdheXMgdG8gcG9zaXRpb24gdGhlIGNhbnZhcywgc2VlIHRoZVxuICogPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmcvcDUuanMvd2lraS9Qb3NpdGlvbmluZy15b3VyLWNhbnZhcyc+XG4gKiBwb3NpdGlvbmluZyB0aGUgY2FudmFzPC9hPiB3aWtpIHBhZ2UuXG4gKlxuICogQG1ldGhvZCBjcmVhdGVDYW52YXNcbiAqIEBwYXJhbSAge051bWJlcn0gdyB3aWR0aCBvZiB0aGUgY2FudmFzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGggaGVpZ2h0IG9mIHRoZSBjYW52YXNcbiAqIEBwYXJhbSAge0NvbnN0YW50fSBbcmVuZGVyZXJdIGVpdGhlciBQMkQgb3IgV0VCR0xcbiAqIEByZXR1cm4ge3A1LlJlbmRlcmVyfVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCA1MCk7XG4gKiAgIGJhY2tncm91bmQoMTUzKTtcbiAqICAgbGluZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIEJsYWNrIGxpbmUgZXh0ZW5kaW5nIGZyb20gdG9wLWxlZnQgb2YgY2FudmFzIHRvIGJvdHRvbSByaWdodC5cbiAqXG4gKi9cblxucDUucHJvdG90eXBlLmNyZWF0ZUNhbnZhcyA9IGZ1bmN0aW9uKHcsIGgsIHJlbmRlcmVyKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2NyZWF0ZUNhbnZhcycsIGFyZ3VtZW50cyk7XG4gIC8vb3B0aW9uYWw6IHJlbmRlcmVyLCBvdGhlcndpc2UgZGVmYXVsdHMgdG8gcDJkXG4gIHZhciByID0gcmVuZGVyZXIgfHwgY29uc3RhbnRzLlAyRDtcbiAgdmFyIGM7XG5cbiAgaWYgKHIgPT09IGNvbnN0YW50cy5XRUJHTCkge1xuICAgIGMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZWZhdWx0SWQpO1xuICAgIGlmIChjKSB7XG4gICAgICAvL2lmIGRlZmF1bHRDYW52YXMgYWxyZWFkeSBleGlzdHNcbiAgICAgIGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKTsgLy9yZXBsYWNlIHRoZSBleGlzdGluZyBkZWZhdWx0Q2FudmFzXG4gICAgICB2YXIgdGhpc1JlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XG4gICAgICB0aGlzLl9lbGVtZW50cyA9IHRoaXMuX2VsZW1lbnRzLmZpbHRlcihmdW5jdGlvbihlKSB7XG4gICAgICAgIHJldHVybiBlICE9PSB0aGlzUmVuZGVyZXI7XG4gICAgICB9KTtcbiAgICB9XG4gICAgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGMuaWQgPSBkZWZhdWx0SWQ7XG4gICAgYy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzcyk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCF0aGlzLl9kZWZhdWx0R3JhcGhpY3NDcmVhdGVkKSB7XG4gICAgICBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlZmF1bHRDYW52YXMnICsgaSkpIHtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdElkID0gJ2RlZmF1bHRDYW52YXMnICsgaTtcbiAgICAgIGMuaWQgPSBkZWZhdWx0SWQ7XG4gICAgICBjLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVzaXplIHRoZSBkZWZhdWx0IGNhbnZhcyBpZiBuZXcgb25lIGlzIGNyZWF0ZWRcbiAgICAgIGMgPSB0aGlzLmNhbnZhcztcbiAgICB9XG4gIH1cblxuICAvLyBzZXQgdG8gaW52aXNpYmxlIGlmIHN0aWxsIGluIHNldHVwICh0byBwcmV2ZW50IGZsYXNoaW5nIHdpdGggbWFuaXB1bGF0ZSlcbiAgaWYgKCF0aGlzLl9zZXR1cERvbmUpIHtcbiAgICBjLmRhdGFzZXQuaGlkZGVuID0gdHJ1ZTsgLy8gdGFnIHRvIHNob3cgbGF0ZXJcbiAgICBjLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgfVxuXG4gIGlmICh0aGlzLl91c2VyTm9kZSkge1xuICAgIC8vIHVzZXIgaW5wdXQgbm9kZSBjYXNlXG4gICAgdGhpcy5fdXNlck5vZGUuYXBwZW5kQ2hpbGQoYyk7XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtcbiAgfVxuXG4gIC8vIEluaXQgb3VyIGdyYXBoaWNzIHJlbmRlcmVyXG4gIC8vd2ViZ2wgbW9kZVxuICBpZiAociA9PT0gY29uc3RhbnRzLldFQkdMKSB7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ19yZW5kZXJlcicsIG5ldyBwNS5SZW5kZXJlckdMKGMsIHRoaXMsIHRydWUpKTtcbiAgICB0aGlzLl9lbGVtZW50cy5wdXNoKHRoaXMuX3JlbmRlcmVyKTtcbiAgfSBlbHNlIHtcbiAgICAvL1AyRCBtb2RlXG4gICAgaWYgKCF0aGlzLl9kZWZhdWx0R3JhcGhpY3NDcmVhdGVkKSB7XG4gICAgICB0aGlzLl9zZXRQcm9wZXJ0eSgnX3JlbmRlcmVyJywgbmV3IHA1LlJlbmRlcmVyMkQoYywgdGhpcywgdHJ1ZSkpO1xuICAgICAgdGhpcy5fZGVmYXVsdEdyYXBoaWNzQ3JlYXRlZCA9IHRydWU7XG4gICAgICB0aGlzLl9lbGVtZW50cy5wdXNoKHRoaXMuX3JlbmRlcmVyKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5fcmVuZGVyZXIucmVzaXplKHcsIGgpO1xuICB0aGlzLl9yZW5kZXJlci5fYXBwbHlEZWZhdWx0cygpO1xuICByZXR1cm4gdGhpcy5fcmVuZGVyZXI7XG59O1xuXG4vKipcbiAqIFJlc2l6ZXMgdGhlIGNhbnZhcyB0byBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0LiBUaGUgY2FudmFzIHdpbGwgYmUgY2xlYXJlZFxuICogYW5kIGRyYXcgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHksIGFsbG93aW5nIHRoZSBza2V0Y2ggdG8gcmUtcmVuZGVyIGl0c2VsZlxuICogaW4gdGhlIHJlc2l6ZWQgY2FudmFzLlxuICogQG1ldGhvZCByZXNpemVDYW52YXNcbiAqIEBwYXJhbSAge051bWJlcn0gdyB3aWR0aCBvZiB0aGUgY2FudmFzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGggaGVpZ2h0IG9mIHRoZSBjYW52YXNcbiAqIEBwYXJhbSAge0Jvb2xlYW59IFtub1JlZHJhd10gZG9uJ3QgcmVkcmF3IHRoZSBjYW52YXMgaW1tZWRpYXRlbHlcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj48Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMod2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgwLCAxMDAsIDIwMCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gd2luZG93UmVzaXplZCgpIHtcbiAqICAgcmVzaXplQ2FudmFzKHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIE5vIGltYWdlIGRpc3BsYXllZC5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5yZXNpemVDYW52YXMgPSBmdW5jdGlvbih3LCBoLCBub1JlZHJhdykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdyZXNpemVDYW52YXMnLCBhcmd1bWVudHMpO1xuICBpZiAodGhpcy5fcmVuZGVyZXIpIHtcbiAgICAvLyBzYXZlIGNhbnZhcyBwcm9wZXJ0aWVzXG4gICAgdmFyIHByb3BzID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuZHJhd2luZ0NvbnRleHQpIHtcbiAgICAgIHZhciB2YWwgPSB0aGlzLmRyYXdpbmdDb250ZXh0W2tleV07XG4gICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm9wc1trZXldID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJlci5yZXNpemUodywgaCk7XG4gICAgLy8gcmVzZXQgY2FudmFzIHByb3BlcnRpZXNcbiAgICBmb3IgKHZhciBzYXZlZEtleSBpbiBwcm9wcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dFtzYXZlZEtleV0gPSBwcm9wc1tzYXZlZEtleV07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gaWdub3JlIHJlYWQtb25seSBwcm9wZXJ0eSBlcnJvcnNcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFub1JlZHJhdykge1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgZGVmYXVsdCBjYW52YXMgZm9yIGEgcDUgc2tldGNoIHRoYXQgZG9lc24ndFxuICogcmVxdWlyZSBhIGNhbnZhc1xuICogQG1ldGhvZCBub0NhbnZhc1xuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBub0NhbnZhcygpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUubm9DYW52YXMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBwNS5SZW5kZXJlciBvYmplY3QuIFVzZSB0aGlzIGNsYXNzIGlmIHlvdSBuZWVkXG4gKiB0byBkcmF3IGludG8gYW4gb2ZmLXNjcmVlbiBncmFwaGljcyBidWZmZXIuIFRoZSB0d28gcGFyYW1ldGVycyBkZWZpbmUgdGhlXG4gKiB3aWR0aCBhbmQgaGVpZ2h0IGluIHBpeGVscy5cbiAqXG4gKiBAbWV0aG9kIGNyZWF0ZUdyYXBoaWNzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHcgd2lkdGggb2YgdGhlIG9mZnNjcmVlbiBncmFwaGljcyBidWZmZXJcbiAqIEBwYXJhbSAge051bWJlcn0gaCBoZWlnaHQgb2YgdGhlIG9mZnNjcmVlbiBncmFwaGljcyBidWZmZXJcbiAqIEBwYXJhbSAge0NvbnN0YW50fSBbcmVuZGVyZXJdIGVpdGhlciBQMkQgb3IgV0VCR0xcbiAqIHVuZGVmaW5lZCBkZWZhdWx0cyB0byBwMmRcbiAqIEByZXR1cm4ge3A1LkdyYXBoaWNzfSBvZmZzY3JlZW4gZ3JhcGhpY3MgYnVmZmVyXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIHBnO1xuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIHBnID0gY3JlYXRlR3JhcGhpY3MoMTAwLCAxMDApO1xuICogfVxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICBwZy5iYWNrZ3JvdW5kKDEwMCk7XG4gKiAgIHBnLm5vU3Ryb2tlKCk7XG4gKiAgIHBnLmVsbGlwc2UocGcud2lkdGggLyAyLCBwZy5oZWlnaHQgLyAyLCA1MCwgNTApO1xuICogICBpbWFnZShwZywgNTAsIDUwKTtcbiAqICAgaW1hZ2UocGcsIDAsIDAsIDUwLCA1MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiA0IGdyZXkgc3F1YXJlcyBhbHRlcm5hdGluZyBsaWdodCBhbmQgZGFyayBncmV5LiBXaGl0ZSBxdWFydGVyIGNpcmNsZSBtaWQtbGVmdC5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5jcmVhdGVHcmFwaGljcyA9IGZ1bmN0aW9uKHcsIGgsIHJlbmRlcmVyKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2NyZWF0ZUdyYXBoaWNzJywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIG5ldyBwNS5HcmFwaGljcyh3LCBoLCByZW5kZXJlciwgdGhpcyk7XG59O1xuXG4vKipcbiAqIEJsZW5kcyB0aGUgcGl4ZWxzIGluIHRoZSBkaXNwbGF5IHdpbmRvdyBhY2NvcmRpbmcgdG8gdGhlIGRlZmluZWQgbW9kZS5cbiAqIFRoZXJlIGlzIGEgY2hvaWNlIG9mIHRoZSBmb2xsb3dpbmcgbW9kZXMgdG8gYmxlbmQgdGhlIHNvdXJjZSBwaXhlbHMgKEEpXG4gKiB3aXRoIHRoZSBvbmVzIG9mIHBpeGVscyBhbHJlYWR5IGluIHRoZSBkaXNwbGF5IHdpbmRvdyAoQik6XG4gKiA8dWw+XG4gKiA8bGk+PGNvZGU+QkxFTkQ8L2NvZGU+IC0gbGluZWFyIGludGVycG9sYXRpb24gb2YgY29sb3VyczogQyA9XG4gKiBBXFwqZmFjdG9yICsgQi4gVGhpcyBpcyB0aGUgZGVmYXVsdCBibGVuZGluZyBtb2RlLjwvbGk+XG4gKiA8bGk+PGNvZGU+QUREPC9jb2RlPiAtIHN1bSBvZiBBIGFuZCBCPC9saT5cbiAqIDxsaT48Y29kZT5EQVJLRVNUPC9jb2RlPiAtIG9ubHkgdGhlIGRhcmtlc3QgY29sb3VyIHN1Y2NlZWRzOiBDID1cbiAqIG1pbihBXFwqZmFjdG9yLCBCKS48L2xpPlxuICogPGxpPjxjb2RlPkxJR0hURVNUPC9jb2RlPiAtIG9ubHkgdGhlIGxpZ2h0ZXN0IGNvbG91ciBzdWNjZWVkczogQyA9XG4gKiBtYXgoQVxcKmZhY3RvciwgQikuPC9saT5cbiAqIDxsaT48Y29kZT5ESUZGRVJFTkNFPC9jb2RlPiAtIHN1YnRyYWN0IGNvbG9ycyBmcm9tIHVuZGVybHlpbmcgaW1hZ2UuPC9saT5cbiAqIDxsaT48Y29kZT5FWENMVVNJT048L2NvZGU+IC0gc2ltaWxhciB0byA8Y29kZT5ESUZGRVJFTkNFPC9jb2RlPiwgYnV0IGxlc3NcbiAqIGV4dHJlbWUuPC9saT5cbiAqIDxsaT48Y29kZT5NVUxUSVBMWTwvY29kZT4gLSBtdWx0aXBseSB0aGUgY29sb3JzLCByZXN1bHQgd2lsbCBhbHdheXMgYmVcbiAqIGRhcmtlci48L2xpPlxuICogPGxpPjxjb2RlPlNDUkVFTjwvY29kZT4gLSBvcHBvc2l0ZSBtdWx0aXBseSwgdXNlcyBpbnZlcnNlIHZhbHVlcyBvZiB0aGVcbiAqIGNvbG9ycy48L2xpPlxuICogPGxpPjxjb2RlPlJFUExBQ0U8L2NvZGU+IC0gdGhlIHBpeGVscyBlbnRpcmVseSByZXBsYWNlIHRoZSBvdGhlcnMgYW5kXG4gKiBkb24ndCB1dGlsaXplIGFscGhhICh0cmFuc3BhcmVuY3kpIHZhbHVlcy48L2xpPlxuICogPGxpPjxjb2RlPk9WRVJMQVk8L2NvZGU+IC0gbWl4IG9mIDxjb2RlPk1VTFRJUExZPC9jb2RlPiBhbmQgPGNvZGU+U0NSRUVOXG4gKiA8L2NvZGU+LiBNdWx0aXBsaWVzIGRhcmsgdmFsdWVzLCBhbmQgc2NyZWVucyBsaWdodCB2YWx1ZXMuPC9saT5cbiAqIDxsaT48Y29kZT5IQVJEX0xJR0hUPC9jb2RlPiAtIDxjb2RlPlNDUkVFTjwvY29kZT4gd2hlbiBncmVhdGVyIHRoYW4gNTAlXG4gKiBncmF5LCA8Y29kZT5NVUxUSVBMWTwvY29kZT4gd2hlbiBsb3dlci48L2xpPlxuICogPGxpPjxjb2RlPlNPRlRfTElHSFQ8L2NvZGU+IC0gbWl4IG9mIDxjb2RlPkRBUktFU1Q8L2NvZGU+IGFuZFxuICogPGNvZGU+TElHSFRFU1Q8L2NvZGU+LiBXb3JrcyBsaWtlIDxjb2RlPk9WRVJMQVk8L2NvZGU+LCBidXQgbm90IGFzIGhhcnNoLlxuICogPC9saT5cbiAqIDxsaT48Y29kZT5ET0RHRTwvY29kZT4gLSBsaWdodGVucyBsaWdodCB0b25lcyBhbmQgaW5jcmVhc2VzIGNvbnRyYXN0LFxuICogaWdub3JlcyBkYXJrcy48L2xpPlxuICogPGxpPjxjb2RlPkJVUk48L2NvZGU+IC0gZGFya2VyIGFyZWFzIGFyZSBhcHBsaWVkLCBpbmNyZWFzaW5nIGNvbnRyYXN0LFxuICogaWdub3JlcyBsaWdodHMuPC9saT5cbiAqIDwvdWw+XG4gKlxuICogQG1ldGhvZCBibGVuZE1vZGVcbiAqIEBwYXJhbSAge0NvbnN0YW50fSBtb2RlIGJsZW5kIG1vZGUgdG8gc2V0IGZvciBjYW52YXMuXG4gKiAgICAgICAgICAgICAgICBlaXRoZXIgQkxFTkQsIERBUktFU1QsIExJR0hURVNULCBESUZGRVJFTkNFLCBNVUxUSVBMWSxcbiAqICAgICAgICAgICAgICAgIEVYQ0xVU0lPTiwgU0NSRUVOLCBSRVBMQUNFLCBPVkVSTEFZLCBIQVJEX0xJR0hULFxuICogICAgICAgICAgICAgICAgU09GVF9MSUdIVCwgRE9ER0UsIEJVUk4sIEFERCBvciBOT1JNQUxcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBibGVuZE1vZGUoTElHSFRFU1QpO1xuICogc3Ryb2tlV2VpZ2h0KDMwKTtcbiAqIHN0cm9rZSg4MCwgMTUwLCAyNTUpO1xuICogbGluZSgyNSwgMjUsIDc1LCA3NSk7XG4gKiBzdHJva2UoMjU1LCA1MCwgNTApO1xuICogbGluZSg3NSwgMjUsIDI1LCA3NSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGJsZW5kTW9kZShNVUxUSVBMWSk7XG4gKiBzdHJva2VXZWlnaHQoMzApO1xuICogc3Ryb2tlKDgwLCAxNTAsIDI1NSk7XG4gKiBsaW5lKDI1LCAyNSwgNzUsIDc1KTtcbiAqIHN0cm9rZSgyNTUsIDUwLCA1MCk7XG4gKiBsaW5lKDc1LCAyNSwgMjUsIDc1KTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICogQGFsdFxuICogdHJhbnNsdWNlbnQgaW1hZ2UgdGhpY2sgcmVkICYgYmx1ZSBkaWFnb25hbCByb3VuZGVkIGxpbmVzIGludGVyc2VjdGluZyBjZW50ZXJcbiAqIFRoaWNrIHJlZCAmIGJsdWUgZGlhZ29uYWwgcm91bmRlZCBsaW5lcyBpbnRlcnNlY3RpbmcgY2VudGVyLiBkYXJrIGF0IG92ZXJsYXBcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5ibGVuZE1vZGUgPSBmdW5jdGlvbihtb2RlKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2JsZW5kTW9kZScsIGFyZ3VtZW50cyk7XG4gIGlmIChcbiAgICBtb2RlID09PSBjb25zdGFudHMuQkxFTkQgfHxcbiAgICBtb2RlID09PSBjb25zdGFudHMuREFSS0VTVCB8fFxuICAgIG1vZGUgPT09IGNvbnN0YW50cy5MSUdIVEVTVCB8fFxuICAgIG1vZGUgPT09IGNvbnN0YW50cy5ESUZGRVJFTkNFIHx8XG4gICAgbW9kZSA9PT0gY29uc3RhbnRzLk1VTFRJUExZIHx8XG4gICAgbW9kZSA9PT0gY29uc3RhbnRzLkVYQ0xVU0lPTiB8fFxuICAgIG1vZGUgPT09IGNvbnN0YW50cy5TQ1JFRU4gfHxcbiAgICBtb2RlID09PSBjb25zdGFudHMuUkVQTEFDRSB8fFxuICAgIG1vZGUgPT09IGNvbnN0YW50cy5PVkVSTEFZIHx8XG4gICAgbW9kZSA9PT0gY29uc3RhbnRzLkhBUkRfTElHSFQgfHxcbiAgICBtb2RlID09PSBjb25zdGFudHMuU09GVF9MSUdIVCB8fFxuICAgIG1vZGUgPT09IGNvbnN0YW50cy5ET0RHRSB8fFxuICAgIG1vZGUgPT09IGNvbnN0YW50cy5CVVJOIHx8XG4gICAgbW9kZSA9PT0gY29uc3RhbnRzLkFERCB8fFxuICAgIG1vZGUgPT09IGNvbnN0YW50cy5OT1JNQUxcbiAgKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIuYmxlbmRNb2RlKG1vZGUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignTW9kZSAnICsgbW9kZSArICcgbm90IHJlY29nbml6ZWQuJyk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vd2ViZ2wvcDUuUmVuZGVyZXJHTFwiOjcyLFwiLi9jb25zdGFudHNcIjoyMSxcIi4vY29yZVwiOjIyLFwiLi9wNS5HcmFwaGljc1wiOjI4LFwiLi9wNS5SZW5kZXJlcjJEXCI6MzB9XSwzMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8vIHJlcXVlc3RBbmltIHNoaW0gbGF5ZXIgYnkgUGF1bCBJcmlzaFxud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIChcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIGZ1bmN0aW9uKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgICAvLyBzaG91bGQgJzYwJyBoZXJlIGJlIGZyYW1lcmF0ZT9cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApO1xuICAgIH1cbiAgKTtcbn0pKCk7XG5cbi8vIHVzZSB3aW5kb3cucGVyZm9ybWFuY2UoKSB0byBnZXQgbWF4IGZhc3QgYW5kIGFjY3VyYXRlIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG53aW5kb3cucGVyZm9ybWFuY2UgPSB3aW5kb3cucGVyZm9ybWFuY2UgfHwge307XG53aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgbG9hZF9kYXRlID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIChcbiAgICB3aW5kb3cucGVyZm9ybWFuY2Uubm93IHx8XG4gICAgd2luZG93LnBlcmZvcm1hbmNlLm1vek5vdyB8fFxuICAgIHdpbmRvdy5wZXJmb3JtYW5jZS5tc05vdyB8fFxuICAgIHdpbmRvdy5wZXJmb3JtYW5jZS5vTm93IHx8XG4gICAgd2luZG93LnBlcmZvcm1hbmNlLndlYmtpdE5vdyB8fFxuICAgIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBsb2FkX2RhdGU7XG4gICAgfVxuICApO1xufSkoKTtcblxuLypcbi8vIGh0dHA6Ly9wYXVsaXJpc2guY29tLzIwMTEvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1hbmltYXRpbmcvXG4vLyBodHRwOi8vbXkub3BlcmEuY29tL2Vtb2xsZXIvYmxvZy8yMDExLzEyLzIwL1xuLy8gcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1lci1hbmltYXRpbmdcbi8vIHJlcXVlc3RBbmltYXRpb25GcmFtZSBwb2x5ZmlsbCBieSBFcmlrIE3DtmxsZXJcbi8vIGZpeGVzIGZyb20gUGF1bCBJcmlzaCBhbmQgVGlubyBaaWpkZWxcbihmdW5jdGlvbigpIHtcbiAgdmFyIGxhc3RUaW1lID0gMDtcbiAgdmFyIHZlbmRvcnMgPSBbJ21zJywgJ21veicsICd3ZWJraXQnLCAnbyddO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IHZlbmRvcnMubGVuZ3RoICYmICF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lOyArK3gpIHtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID1cbiAgICAgIHdpbmRvd1t2ZW5kb3JzW3hdKydSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcbiAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPVxuICAgICAgd2luZG93W3ZlbmRvcnNbeF0rJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHxcbiAgICAgIHdpbmRvd1t2ZW5kb3JzW3hdKydDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcbiAgfVxuXG4gIGlmICghd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbihjYWxsYmFjaywgZWxlbWVudCkge1xuICAgICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB2YXIgdGltZVRvQ2FsbCA9IE1hdGgubWF4KDAsIDE2IC0gKGN1cnJUaW1lIC0gbGFzdFRpbWUpKTtcbiAgICAgIHZhciBpZCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKClcbiAgICAgICAgeyBjYWxsYmFjayhjdXJyVGltZSArIHRpbWVUb0NhbGwpOyB9LCB0aW1lVG9DYWxsKTtcbiAgICAgIGxhc3RUaW1lID0gY3VyclRpbWUgKyB0aW1lVG9DYWxsO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH07XG4gIH1cblxuICBpZiAoIXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSkge1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG4gIH1cbn0oKSk7XG4qL1xuXG4vKipcbiAqIHNoaW0gZm9yIFVpbnQ4Q2xhbXBlZEFycmF5LnNsaWNlXG4gKiAoYWxsb3dzIGFycmF5Q29weSB0byB3b3JrIHdpdGggcGl4ZWxzW10pXG4gKiB3aXRoIHRoYW5rcyB0byBodHRwOi8vaGFsZnBhcHN0dWRpb3MuY29tL2Jsb2cvdGFnL2h0bWw1LWNhbnZhcy9cbiAqIEVudW1lcmFibGUgc2V0IHRvIGZhbHNlIHRvIHByb3RlY3QgZm9yLi4uaW4gZnJvbVxuICogVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlIHBvbGx1dGlvbi5cbiAqL1xuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG4gIGlmIChcbiAgICB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgIVVpbnQ4Q2xhbXBlZEFycmF5LnByb3RvdHlwZS5zbGljZVxuICApIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlLCAnc2xpY2UnLCB7XG4gICAgICB2YWx1ZTogQXJyYXkucHJvdG90eXBlLnNsaWNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgIH0pO1xuICB9XG59KSgpO1xuXG59LHt9XSwzMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgU3RydWN0dXJlXG4gKiBAc3VibW9kdWxlIFN0cnVjdHVyZVxuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4vY29yZScpO1xuXG5wNS5wcm90b3R5cGUuZXhpdCA9IGZ1bmN0aW9uKCkge1xuICB0aHJvdyAnZXhpdCgpIG5vdCBpbXBsZW1lbnRlZCwgc2VlIHJlbW92ZSgpJztcbn07XG4vKipcbiAqIFN0b3BzIHA1LmpzIGZyb20gY29udGludW91c2x5IGV4ZWN1dGluZyB0aGUgY29kZSB3aXRoaW4gZHJhdygpLlxuICogSWYgbG9vcCgpIGlzIGNhbGxlZCwgdGhlIGNvZGUgaW4gZHJhdygpIGJlZ2lucyB0byBydW4gY29udGludW91c2x5IGFnYWluLlxuICogSWYgdXNpbmcgbm9Mb29wKCkgaW4gc2V0dXAoKSwgaXQgc2hvdWxkIGJlIHRoZSBsYXN0IGxpbmUgaW5zaWRlIHRoZSBibG9jay5cbiAqIDxicj48YnI+XG4gKiBXaGVuIG5vTG9vcCgpIGlzIHVzZWQsIGl0J3Mgbm90IHBvc3NpYmxlIHRvIG1hbmlwdWxhdGUgb3IgYWNjZXNzIHRoZVxuICogc2NyZWVuIGluc2lkZSBldmVudCBoYW5kbGluZyBmdW5jdGlvbnMgc3VjaCBhcyBtb3VzZVByZXNzZWQoKSBvclxuICoga2V5UHJlc3NlZCgpLiBJbnN0ZWFkLCB1c2UgdGhvc2UgZnVuY3Rpb25zIHRvIGNhbGwgcmVkcmF3KCkgb3IgbG9vcCgpLFxuICogd2hpY2ggd2lsbCBydW4gZHJhdygpLCB3aGljaCBjYW4gdXBkYXRlIHRoZSBzY3JlZW4gcHJvcGVybHkuIFRoaXMgbWVhbnNcbiAqIHRoYXQgd2hlbiBub0xvb3AoKSBoYXMgYmVlbiBjYWxsZWQsIG5vIGRyYXdpbmcgY2FuIGhhcHBlbiwgYW5kIGZ1bmN0aW9uc1xuICogbGlrZSBzYXZlRnJhbWUoKSBvciBsb2FkUGl4ZWxzKCkgbWF5IG5vdCBiZSB1c2VkLlxuICogPGJyPjxicj5cbiAqIE5vdGUgdGhhdCBpZiB0aGUgc2tldGNoIGlzIHJlc2l6ZWQsIHJlZHJhdygpIHdpbGwgYmUgY2FsbGVkIHRvIHVwZGF0ZVxuICogdGhlIHNrZXRjaCwgZXZlbiBhZnRlciBub0xvb3AoKSBoYXMgYmVlbiBzcGVjaWZpZWQuIE90aGVyd2lzZSwgdGhlIHNrZXRjaFxuICogd291bGQgZW50ZXIgYW4gb2RkIHN0YXRlIHVudGlsIGxvb3AoKSB3YXMgY2FsbGVkLlxuICpcbiAqIEBtZXRob2Qgbm9Mb29wXG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIG5vTG9vcCgpO1xuICogfVxuXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBsaW5lKDEwLCAxMCwgOTAsIDkwKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiA8ZGl2Pjxjb2RlPlxuICogdmFyIHggPSAwO1xuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDQpO1xuICogICB4ID0geCArIDAuMTtcbiAqICAgaWYgKHggPiB3aWR0aCkge1xuICogICAgIHggPSAwO1xuICogICB9XG4gKiAgIGxpbmUoeCwgMCwgeCwgaGVpZ2h0KTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XG4gKiAgIG5vTG9vcCgpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIG1vdXNlUmVsZWFzZWQoKSB7XG4gKiAgIGxvb3AoKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAxMTMgcGl4ZWwgbG9uZyBsaW5lIGV4dGVuZGluZyBmcm9tIHRvcC1sZWZ0IHRvIGJvdHRvbSByaWdodCBvZiBjYW52YXMuXG4gKiBob3Jpem9udGFsIGxpbmUgbW92ZXMgc2xvd2x5IGZyb20gbGVmdC4gTG9vcHMgYnV0IHN0b3BzIG9uIG1vdXNlIHByZXNzLlxuICpcbiAqL1xucDUucHJvdG90eXBlLm5vTG9vcCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9sb29wID0gZmFsc2U7XG59O1xuLyoqXG4gKiBCeSBkZWZhdWx0LCBwNS5qcyBsb29wcyB0aHJvdWdoIGRyYXcoKSBjb250aW51b3VzbHksIGV4ZWN1dGluZyB0aGUgY29kZVxuICogd2l0aGluIGl0LiBIb3dldmVyLCB0aGUgZHJhdygpIGxvb3AgbWF5IGJlIHN0b3BwZWQgYnkgY2FsbGluZyBub0xvb3AoKS5cbiAqIEluIHRoYXQgY2FzZSwgdGhlIGRyYXcoKSBsb29wIGNhbiBiZSByZXN1bWVkIHdpdGggbG9vcCgpLlxuICpcbiAqIEBtZXRob2QgbG9vcFxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgeCA9IDA7XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgbm9Mb29wKCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDQpO1xuICogICB4ID0geCArIDAuMTtcbiAqICAgaWYgKHggPiB3aWR0aCkge1xuICogICAgIHggPSAwO1xuICogICB9XG4gKiAgIGxpbmUoeCwgMCwgeCwgaGVpZ2h0KTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XG4gKiAgIGxvb3AoKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBtb3VzZVJlbGVhc2VkKCkge1xuICogICBub0xvb3AoKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBob3Jpem9udGFsIGxpbmUgbW92ZXMgc2xvd2x5IGZyb20gbGVmdC4gTG9vcHMgYnV0IHN0b3BzIG9uIG1vdXNlIHByZXNzLlxuICpcbiAqL1xuXG5wNS5wcm90b3R5cGUubG9vcCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9sb29wID0gdHJ1ZTtcbiAgdGhpcy5fZHJhdygpO1xufTtcblxuZnVuY3Rpb24gYXNzaWduKGRlc3QsIHZhckFyZ3MpIHtcbiAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICB2YXIgc3JjID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICBpZiAoc3JjICE9IG51bGwpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcHVzaCgpIGZ1bmN0aW9uIHNhdmVzIHRoZSBjdXJyZW50IGRyYXdpbmcgc3R5bGUgc2V0dGluZ3MgYW5kXG4gKiB0cmFuc2Zvcm1hdGlvbnMsIHdoaWxlIHBvcCgpIHJlc3RvcmVzIHRoZXNlIHNldHRpbmdzLiBOb3RlIHRoYXQgdGhlc2VcbiAqIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIHVzZWQgdG9nZXRoZXIuIFRoZXkgYWxsb3cgeW91IHRvIGNoYW5nZSB0aGUgc3R5bGVcbiAqIGFuZCB0cmFuc2Zvcm1hdGlvbiBzZXR0aW5ncyBhbmQgbGF0ZXIgcmV0dXJuIHRvIHdoYXQgeW91IGhhZC4gV2hlbiBhIG5ld1xuICogc3RhdGUgaXMgc3RhcnRlZCB3aXRoIHB1c2goKSwgaXQgYnVpbGRzIG9uIHRoZSBjdXJyZW50IHN0eWxlIGFuZCB0cmFuc2Zvcm1cbiAqIGluZm9ybWF0aW9uLiBUaGUgcHVzaCgpIGFuZCBwb3AoKSBmdW5jdGlvbnMgY2FuIGJlIGVtYmVkZGVkIHRvIHByb3ZpZGVcbiAqIG1vcmUgY29udHJvbC4gKFNlZSB0aGUgc2Vjb25kIGV4YW1wbGUgZm9yIGEgZGVtb25zdHJhdGlvbi4pXG4gKiA8YnI+PGJyPlxuICogcHVzaCgpIHN0b3JlcyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHRyYW5zZm9ybWF0aW9uIHN0YXRlXG4gKiBhbmQgc3R5bGUgc2V0dGluZ3MgY29udHJvbGxlZCBieSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczogZmlsbCgpLFxuICogc3Ryb2tlKCksIHRpbnQoKSwgc3Ryb2tlV2VpZ2h0KCksIHN0cm9rZUNhcCgpLCBzdHJva2VKb2luKCksXG4gKiBpbWFnZU1vZGUoKSwgcmVjdE1vZGUoKSwgZWxsaXBzZU1vZGUoKSwgY29sb3JNb2RlKCksIHRleHRBbGlnbigpLFxuICogdGV4dEZvbnQoKSwgdGV4dE1vZGUoKSwgdGV4dFNpemUoKSwgdGV4dExlYWRpbmcoKS5cbiAqXG4gKiBAbWV0aG9kIHB1c2hcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBlbGxpcHNlKDAsIDUwLCAzMywgMzMpOyAvLyBMZWZ0IGNpcmNsZVxuICpcbiAqIHB1c2goKTsgLy8gU3RhcnQgYSBuZXcgZHJhd2luZyBzdGF0ZVxuICogc3Ryb2tlV2VpZ2h0KDEwKTtcbiAqIGZpbGwoMjA0LCAxNTMsIDApO1xuICogdHJhbnNsYXRlKDUwLCAwKTtcbiAqIGVsbGlwc2UoMCwgNTAsIDMzLCAzMyk7IC8vIE1pZGRsZSBjaXJjbGVcbiAqIHBvcCgpOyAvLyBSZXN0b3JlIG9yaWdpbmFsIHN0YXRlXG4gKlxuICogZWxsaXBzZSgxMDAsIDUwLCAzMywgMzMpOyAvLyBSaWdodCBjaXJjbGVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZWxsaXBzZSgwLCA1MCwgMzMsIDMzKTsgLy8gTGVmdCBjaXJjbGVcbiAqXG4gKiBwdXNoKCk7IC8vIFN0YXJ0IGEgbmV3IGRyYXdpbmcgc3RhdGVcbiAqIHN0cm9rZVdlaWdodCgxMCk7XG4gKiBmaWxsKDIwNCwgMTUzLCAwKTtcbiAqIGVsbGlwc2UoMzMsIDUwLCAzMywgMzMpOyAvLyBMZWZ0LW1pZGRsZSBjaXJjbGVcbiAqXG4gKiBwdXNoKCk7IC8vIFN0YXJ0IGFub3RoZXIgbmV3IGRyYXdpbmcgc3RhdGVcbiAqIHN0cm9rZSgwLCAxMDIsIDE1Myk7XG4gKiBlbGxpcHNlKDY2LCA1MCwgMzMsIDMzKTsgLy8gUmlnaHQtbWlkZGxlIGNpcmNsZVxuICogcG9wKCk7IC8vIFJlc3RvcmUgcHJldmlvdXMgc3RhdGVcbiAqXG4gKiBwb3AoKTsgLy8gUmVzdG9yZSBvcmlnaW5hbCBzdGF0ZVxuICpcbiAqIGVsbGlwc2UoMTAwLCA1MCwgMzMsIDMzKTsgLy8gUmlnaHQgY2lyY2xlXG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBHb2xkIGVsbGlwc2UgKyB0aGljayBibGFjayBvdXRsaW5lIEBjZW50ZXIgMiB3aGl0ZSBlbGxpcHNlcyBvbiBsZWZ0IGFuZCByaWdodC5cbiAqIDIgR29sZCBlbGxpcHNlcyBsZWZ0IGJsYWNrIHJpZ2h0IGJsdWUgc3Ryb2tlLiAyIHdoaXRlIGVsbGlwc2VzIG9uIGxlZnQrcmlnaHQuXG4gKlxuICovXG5wNS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9zdHlsZXMucHVzaCh7XG4gICAgcHJvcHM6IHtcbiAgICAgIF9jb2xvck1vZGU6IHRoaXMuX2NvbG9yTW9kZVxuICAgIH0sXG4gICAgcmVuZGVyZXI6IHRoaXMuX3JlbmRlcmVyLnB1c2goKVxuICB9KTtcbn07XG5cbi8qKlxuICogVGhlIHB1c2goKSBmdW5jdGlvbiBzYXZlcyB0aGUgY3VycmVudCBkcmF3aW5nIHN0eWxlIHNldHRpbmdzIGFuZFxuICogdHJhbnNmb3JtYXRpb25zLCB3aGlsZSBwb3AoKSByZXN0b3JlcyB0aGVzZSBzZXR0aW5ncy4gTm90ZSB0aGF0IHRoZXNlXG4gKiBmdW5jdGlvbnMgYXJlIGFsd2F5cyB1c2VkIHRvZ2V0aGVyLiBUaGV5IGFsbG93IHlvdSB0byBjaGFuZ2UgdGhlIHN0eWxlXG4gKiBhbmQgdHJhbnNmb3JtYXRpb24gc2V0dGluZ3MgYW5kIGxhdGVyIHJldHVybiB0byB3aGF0IHlvdSBoYWQuIFdoZW4gYSBuZXdcbiAqIHN0YXRlIGlzIHN0YXJ0ZWQgd2l0aCBwdXNoKCksIGl0IGJ1aWxkcyBvbiB0aGUgY3VycmVudCBzdHlsZSBhbmQgdHJhbnNmb3JtXG4gKiBpbmZvcm1hdGlvbi4gVGhlIHB1c2goKSBhbmQgcG9wKCkgZnVuY3Rpb25zIGNhbiBiZSBlbWJlZGRlZCB0byBwcm92aWRlXG4gKiBtb3JlIGNvbnRyb2wuIChTZWUgdGhlIHNlY29uZCBleGFtcGxlIGZvciBhIGRlbW9uc3RyYXRpb24uKVxuICogPGJyPjxicj5cbiAqIHB1c2goKSBzdG9yZXMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiBzdGF0ZVxuICogYW5kIHN0eWxlIHNldHRpbmdzIGNvbnRyb2xsZWQgYnkgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6IGZpbGwoKSxcbiAqIHN0cm9rZSgpLCB0aW50KCksIHN0cm9rZVdlaWdodCgpLCBzdHJva2VDYXAoKSwgc3Ryb2tlSm9pbigpLFxuICogaW1hZ2VNb2RlKCksIHJlY3RNb2RlKCksIGVsbGlwc2VNb2RlKCksIGNvbG9yTW9kZSgpLCB0ZXh0QWxpZ24oKSxcbiAqIHRleHRGb250KCksIHRleHRNb2RlKCksIHRleHRTaXplKCksIHRleHRMZWFkaW5nKCkuXG4gKlxuICogQG1ldGhvZCBwb3BcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBlbGxpcHNlKDAsIDUwLCAzMywgMzMpOyAvLyBMZWZ0IGNpcmNsZVxuICpcbiAqIHB1c2goKTsgLy8gU3RhcnQgYSBuZXcgZHJhd2luZyBzdGF0ZVxuICogdHJhbnNsYXRlKDUwLCAwKTtcbiAqIHN0cm9rZVdlaWdodCgxMCk7XG4gKiBmaWxsKDIwNCwgMTUzLCAwKTtcbiAqIGVsbGlwc2UoMCwgNTAsIDMzLCAzMyk7IC8vIE1pZGRsZSBjaXJjbGVcbiAqIHBvcCgpOyAvLyBSZXN0b3JlIG9yaWdpbmFsIHN0YXRlXG4gKlxuICogZWxsaXBzZSgxMDAsIDUwLCAzMywgMzMpOyAvLyBSaWdodCBjaXJjbGVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZWxsaXBzZSgwLCA1MCwgMzMsIDMzKTsgLy8gTGVmdCBjaXJjbGVcbiAqXG4gKiBwdXNoKCk7IC8vIFN0YXJ0IGEgbmV3IGRyYXdpbmcgc3RhdGVcbiAqIHN0cm9rZVdlaWdodCgxMCk7XG4gKiBmaWxsKDIwNCwgMTUzLCAwKTtcbiAqIGVsbGlwc2UoMzMsIDUwLCAzMywgMzMpOyAvLyBMZWZ0LW1pZGRsZSBjaXJjbGVcbiAqXG4gKiBwdXNoKCk7IC8vIFN0YXJ0IGFub3RoZXIgbmV3IGRyYXdpbmcgc3RhdGVcbiAqIHN0cm9rZSgwLCAxMDIsIDE1Myk7XG4gKiBlbGxpcHNlKDY2LCA1MCwgMzMsIDMzKTsgLy8gUmlnaHQtbWlkZGxlIGNpcmNsZVxuICogcG9wKCk7IC8vIFJlc3RvcmUgcHJldmlvdXMgc3RhdGVcbiAqXG4gKiBwb3AoKTsgLy8gUmVzdG9yZSBvcmlnaW5hbCBzdGF0ZVxuICpcbiAqIGVsbGlwc2UoMTAwLCA1MCwgMzMsIDMzKTsgLy8gUmlnaHQgY2lyY2xlXG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBHb2xkIGVsbGlwc2UgKyB0aGljayBibGFjayBvdXRsaW5lIEBjZW50ZXIgMiB3aGl0ZSBlbGxpcHNlcyBvbiBsZWZ0IGFuZCByaWdodC5cbiAqIDIgR29sZCBlbGxpcHNlcyBsZWZ0IGJsYWNrIHJpZ2h0IGJsdWUgc3Ryb2tlLiAyIHdoaXRlIGVsbGlwc2VzIG9uIGxlZnQrcmlnaHQuXG4gKlxuICovXG5wNS5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdHlsZSA9IHRoaXMuX3N0eWxlcy5wb3AoKTtcbiAgaWYgKHN0eWxlKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIucG9wKHN0eWxlLnJlbmRlcmVyKTtcbiAgICBhc3NpZ24odGhpcywgc3R5bGUucHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUud2FybigncG9wKCkgd2FzIGNhbGxlZCB3aXRob3V0IG1hdGNoaW5nIHB1c2goKScpO1xuICB9XG59O1xuXG5wNS5wcm90b3R5cGUucHVzaFN0eWxlID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBFcnJvcigncHVzaFN0eWxlKCkgbm90IHVzZWQsIHNlZSBwdXNoKCknKTtcbn07XG5cbnA1LnByb3RvdHlwZS5wb3BTdHlsZSA9IGZ1bmN0aW9uKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3BvcFN0eWxlKCkgbm90IHVzZWQsIHNlZSBwb3AoKScpO1xufTtcblxuLyoqXG4gKlxuICogRXhlY3V0ZXMgdGhlIGNvZGUgd2l0aGluIGRyYXcoKSBvbmUgdGltZS4gVGhpcyBmdW5jdGlvbnMgYWxsb3dzIHRoZVxuICogcHJvZ3JhbSB0byB1cGRhdGUgdGhlIGRpc3BsYXkgd2luZG93IG9ubHkgd2hlbiBuZWNlc3NhcnksIGZvciBleGFtcGxlXG4gKiB3aGVuIGFuIGV2ZW50IHJlZ2lzdGVyZWQgYnkgbW91c2VQcmVzc2VkKCkgb3Iga2V5UHJlc3NlZCgpIG9jY3Vycy5cbiAqIDxicj48YnI+XG4gKiBJbiBzdHJ1Y3R1cmluZyBhIHByb2dyYW0sIGl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gY2FsbCByZWRyYXcoKSB3aXRoaW5cbiAqIGV2ZW50cyBzdWNoIGFzIG1vdXNlUHJlc3NlZCgpLiBUaGlzIGlzIGJlY2F1c2UgcmVkcmF3KCkgZG9lcyBub3QgcnVuXG4gKiBkcmF3KCkgaW1tZWRpYXRlbHkgKGl0IG9ubHkgc2V0cyBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgYW4gdXBkYXRlIGlzXG4gKiBuZWVkZWQpLlxuICogPGJyPjxicj5cbiAqIFRoZSByZWRyYXcoKSBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IHdoZW4gY2FsbGVkIGluc2lkZSBkcmF3KCkuXG4gKiBUbyBlbmFibGUvZGlzYWJsZSBhbmltYXRpb25zLCB1c2UgbG9vcCgpIGFuZCBub0xvb3AoKS5cbiAqIDxicj48YnI+XG4gKiBJbiBhZGRpdGlvbiB5b3UgY2FuIHNldCB0aGUgbnVtYmVyIG9mIHJlZHJhd3MgcGVyIG1ldGhvZCBjYWxsLiBKdXN0XG4gKiBhZGQgYW4gaW50ZWdlciBhcyBzaW5nbGUgcGFyYW1ldGVyIGZvciB0aGUgbnVtYmVyIG9mIHJlZHJhd3MuXG4gKlxuICogQG1ldGhvZCByZWRyYXdcbiAqIEBwYXJhbSAge0ludGVnZXJ9IFtuXSBSZWRyYXcgZm9yIG4tdGltZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuXG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIHZhciB4ID0gMDtcbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgbm9Mb29wKCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDQpO1xuICogICBsaW5lKHgsIDAsIHgsIGhlaWdodCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xuICogICB4ICs9IDE7XG4gKiAgIHJlZHJhdygpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIHZhciB4ID0gMDtcbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgbm9Mb29wKCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDQpO1xuICogICB4ICs9IDE7XG4gKiAgIGxpbmUoeCwgMCwgeCwgaGVpZ2h0KTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XG4gKiAgIHJlZHJhdyg1KTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBibGFjayBsaW5lIG9uIGZhciBsZWZ0IG9mIGNhbnZhc1xuICogYmxhY2sgbGluZSBvbiBmYXIgbGVmdCBvZiBjYW52YXNcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5yZWRyYXcgPSBmdW5jdGlvbihuKSB7XG4gIHRoaXMucmVzZXRNYXRyaXgoKTtcbiAgaWYgKHRoaXMuX3JlbmRlcmVyLmlzUDNEKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIuX3VwZGF0ZSgpO1xuICB9XG5cbiAgdmFyIG51bWJlck9mUmVkcmF3cyA9IHBhcnNlSW50KG4pO1xuICBpZiAoaXNOYU4obnVtYmVyT2ZSZWRyYXdzKSB8fCBudW1iZXJPZlJlZHJhd3MgPCAxKSB7XG4gICAgbnVtYmVyT2ZSZWRyYXdzID0gMTtcbiAgfVxuXG4gIHZhciB1c2VyU2V0dXAgPSB0aGlzLnNldHVwIHx8IHdpbmRvdy5zZXR1cDtcbiAgdmFyIHVzZXJEcmF3ID0gdGhpcy5kcmF3IHx8IHdpbmRvdy5kcmF3O1xuICBpZiAodHlwZW9mIHVzZXJEcmF3ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VyU2V0dXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnNjYWxlKHRoaXMuX3BpeGVsRGVuc2l0eSwgdGhpcy5fcGl4ZWxEZW5zaXR5KTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjYWxsTWV0aG9kID0gZnVuY3Rpb24oZikge1xuICAgICAgZi5jYWxsKHNlbGYpO1xuICAgIH07XG4gICAgZm9yICh2YXIgaWR4UmVkcmF3ID0gMDsgaWR4UmVkcmF3IDwgbnVtYmVyT2ZSZWRyYXdzOyBpZHhSZWRyYXcrKykge1xuICAgICAgdGhpcy5fc2V0UHJvcGVydHkoJ2ZyYW1lQ291bnQnLCB0aGlzLmZyYW1lQ291bnQgKyAxKTtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRNZXRob2RzLnByZS5mb3JFYWNoKGNhbGxNZXRob2QpO1xuICAgICAgdXNlckRyYXcoKTtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRNZXRob2RzLnBvc3QuZm9yRWFjaChjYWxsTWV0aG9kKTtcbiAgICB9XG4gIH1cbn07XG5cbnA1LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzID0gJ3NpemUoKSBpcyBub3QgYSB2YWxpZCBwNSBmdW5jdGlvbiwgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSAnO1xuICBzICs9ICdkcmF3aW5nIGNhbnZhcywgcGxlYXNlIHVzZSBjcmVhdGVDYW52YXMoKSBpbnN0ZWFkJztcbiAgdGhyb3cgcztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi9jb3JlXCI6MjJ9XSwzNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgVHJhbnNmb3JtXG4gKiBAc3VibW9kdWxlIFRyYW5zZm9ybVxuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqIEByZXF1aXJlcyBjb25zdGFudHNcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4vY29yZScpO1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdGhlIGN1cnJlbnQgbWF0cml4IGJ5IHRoZSBvbmUgc3BlY2lmaWVkIHRocm91Z2ggdGhlIHBhcmFtZXRlcnMuXG4gKiBUaGlzIGlzIGEgcG93ZXJmdWwgb3BlcmF0aW9uIHRoYXQgY2FuIHBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgdHJhbnNsYXRlLFxuICogc2NhbGUsIHNoZWFyIGFuZCByb3RhdGUgYWxsIGF0IG9uY2UuIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCB0cmFuc2Zvcm1hdGlvblxuICogbWF0cmljZXMgb24gPGEgaHJlZj1cImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RyYW5zZm9ybWF0aW9uX21hdHJpeFwiPlxuICogV2lraXBlZGlhPC9hPi5cbiAqXG4gKiBUaGUgbmFtaW5nIG9mIHRoZSBhcmd1bWVudHMgaGVyZSBmb2xsb3dzIHRoZSBuYW1pbmcgb2YgdGhlIDxhIGhyZWY9XG4gKiBcImh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI2RvbS1jb250ZXh0LTJkLXRyYW5zZm9ybVwiPlxuICogV0hBVFdHIHNwZWNpZmljYXRpb248L2E+IGFuZCBjb3JyZXNwb25kcyB0byBhXG4gKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2YgdGhlXG4gKiBmb3JtOlxuICpcbiAqID4gPGltZyBzdHlsZT1cIm1heC13aWR0aDogMTUwcHhcIiBzcmM9XCJhc3NldHMvdHJhbnNmb3JtYXRpb24tbWF0cml4LnBuZ1wiXG4gKiBhbHQ9XCJUaGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IHVzZWQgd2hlbiBhcHBseU1hdHJpeCBpcyBjYWxsZWRcIi8+XG4gKlxuICogQG1ldGhvZCBhcHBseU1hdHJpeFxuICogQHBhcmFtICB7TnVtYmVyfSBhIG51bWJlcnMgd2hpY2ggZGVmaW5lIHRoZSAyeDMgbWF0cml4IHRvIGJlIG11bHRpcGxpZWRcbiAqIEBwYXJhbSAge051bWJlcn0gYiBudW1iZXJzIHdoaWNoIGRlZmluZSB0aGUgMngzIG1hdHJpeCB0byBiZSBtdWx0aXBsaWVkXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGMgbnVtYmVycyB3aGljaCBkZWZpbmUgdGhlIDJ4MyBtYXRyaXggdG8gYmUgbXVsdGlwbGllZFxuICogQHBhcmFtICB7TnVtYmVyfSBkIG51bWJlcnMgd2hpY2ggZGVmaW5lIHRoZSAyeDMgbWF0cml4IHRvIGJlIG11bHRpcGxpZWRcbiAqIEBwYXJhbSAge051bWJlcn0gZSBudW1iZXJzIHdoaWNoIGRlZmluZSB0aGUgMngzIG1hdHJpeCB0byBiZSBtdWx0aXBsaWVkXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGYgbnVtYmVycyB3aGljaCBkZWZpbmUgdGhlIDJ4MyBtYXRyaXggdG8gYmUgbXVsdGlwbGllZFxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBmcmFtZVJhdGUoMTApO1xuICogICByZWN0TW9kZShDRU5URVIpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIHZhciBzdGVwID0gZnJhbWVDb3VudCAlIDIwO1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIC8vIEVxdWl2YWxlbnQgdG8gdHJhbnNsYXRlKHgsIHkpO1xuICogICBhcHBseU1hdHJpeCgxLCAwLCAwLCAxLCA0MCArIHN0ZXAsIDUwKTtcbiAqICAgcmVjdCgwLCAwLCA1MCwgNTApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgZnJhbWVSYXRlKDEwKTtcbiAqICAgcmVjdE1vZGUoQ0VOVEVSKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICB2YXIgc3RlcCA9IGZyYW1lQ291bnQgJSAyMDtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICB0cmFuc2xhdGUoNTAsIDUwKTtcbiAqICAgLy8gRXF1aXZhbGVudCB0byBzY2FsZSh4LCB5KTtcbiAqICAgYXBwbHlNYXRyaXgoMSAvIHN0ZXAsIDAsIDAsIDEgLyBzdGVwLCAwLCAwKTtcbiAqICAgcmVjdCgwLCAwLCA1MCwgNTApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgZnJhbWVSYXRlKDEwKTtcbiAqICAgcmVjdE1vZGUoQ0VOVEVSKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICB2YXIgc3RlcCA9IGZyYW1lQ291bnQgJSAyMDtcbiAqICAgdmFyIGFuZ2xlID0gbWFwKHN0ZXAsIDAsIDIwLCAwLCBUV09fUEkpO1xuICogICB2YXIgY29zX2EgPSBjb3MoYW5nbGUpO1xuICogICB2YXIgc2luX2EgPSBzaW4oYW5nbGUpO1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHRyYW5zbGF0ZSg1MCwgNTApO1xuICogICAvLyBFcXVpdmFsZW50IHRvIHJvdGF0ZShhbmdsZSk7XG4gKiAgIGFwcGx5TWF0cml4KGNvc19hLCBzaW5fYSwgLXNpbl9hLCBjb3NfYSwgMCwgMCk7XG4gKiAgIHJlY3QoMCwgMCwgNTAsIDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGZyYW1lUmF0ZSgxMCk7XG4gKiAgIHJlY3RNb2RlKENFTlRFUik7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgdmFyIHN0ZXAgPSBmcmFtZUNvdW50ICUgMjA7XG4gKiAgIHZhciBhbmdsZSA9IG1hcChzdGVwLCAwLCAyMCwgLVBJIC8gNCwgUEkgLyA0KTtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICB0cmFuc2xhdGUoNTAsIDUwKTtcbiAqICAgLy8gZXF1aXZhbGVudCB0byBzaGVhclgoYW5nbGUpO1xuICogICB2YXIgc2hlYXJfZmFjdG9yID0gMSAvIHRhbihQSSAvIDIgLSBhbmdsZSk7XG4gKiAgIGFwcGx5TWF0cml4KDEsIDAsIHNoZWFyX2ZhY3RvciwgMSwgMCwgMCk7XG4gKiAgIHJlY3QoMCwgMCwgNTAsIDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIEEgcmVjdGFuZ2xlIHRyYW5zbGF0aW5nIHRvIHRoZSByaWdodFxuICogQSByZWN0YW5nbGUgc2hyaW5raW5nIHRvIHRoZSBjZW50ZXJcbiAqIEEgcmVjdGFuZ2xlIHJvdGF0aW5nIGNsb2Nrd2lzZSBhYm91dCB0aGUgY2VudGVyXG4gKiBBIHJlY3RhbmdsZSBzaGVhcmluZ1xuICpcbiAqL1xucDUucHJvdG90eXBlLmFwcGx5TWF0cml4ID0gZnVuY3Rpb24oYSwgYiwgYywgZCwgZSwgZikge1xuICB0aGlzLl9yZW5kZXJlci5hcHBseU1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wNS5wcm90b3R5cGUucG9wTWF0cml4ID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBFcnJvcigncG9wTWF0cml4KCkgbm90IHVzZWQsIHNlZSBwb3AoKScpO1xufTtcblxucDUucHJvdG90eXBlLnByaW50TWF0cml4ID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBFcnJvcigncHJpbnRNYXRyaXgoKSBub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbnA1LnByb3RvdHlwZS5wdXNoTWF0cml4ID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBFcnJvcigncHVzaE1hdHJpeCgpIG5vdCB1c2VkLCBzZWUgcHVzaCgpJyk7XG59O1xuXG4vKipcbiAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IG1hdHJpeCB3aXRoIHRoZSBpZGVudGl0eSBtYXRyaXguXG4gKlxuICogQG1ldGhvZCByZXNldE1hdHJpeFxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHRyYW5zbGF0ZSg1MCwgNTApO1xuICogYXBwbHlNYXRyaXgoMC41LCAwLjUsIC0wLjUsIDAuNSwgMCwgMCk7XG4gKiByZWN0KDAsIDAsIDIwLCAyMCk7XG4gKiAvLyBOb3RlIHRoYXQgdGhlIHRyYW5zbGF0ZSBpcyBhbHNvIHJlc2V0LlxuICogcmVzZXRNYXRyaXgoKTtcbiAqIHJlY3QoMCwgMCwgMjAsIDIwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIEEgcm90YXRlZCByZXRhbmdsZSBpbiB0aGUgY2VudGVyIHdpdGggYW5vdGhlciBhdCB0aGUgdG9wIGxlZnQgY29ybmVyXG4gKlxuICovXG5wNS5wcm90b3R5cGUucmVzZXRNYXRyaXggPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVuZGVyZXIucmVzZXRNYXRyaXgoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBzaGFwZSB0aGUgYW1vdW50IHNwZWNpZmllZCBieSB0aGUgYW5nbGUgcGFyYW1ldGVyLiBUaGlzXG4gKiBmdW5jdGlvbiBhY2NvdW50cyBmb3IgYW5nbGVNb2RlLCBzbyBhbmdsZXMgY2FuIGJlIGVudGVyZWQgaW4gZWl0aGVyXG4gKiBSQURJQU5TIG9yIERFR1JFRVMuXG4gKiA8YnI+PGJyPlxuICogT2JqZWN0cyBhcmUgYWx3YXlzIHJvdGF0ZWQgYXJvdW5kIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9uIHRvIHRoZVxuICogb3JpZ2luIGFuZCBwb3NpdGl2ZSBudW1iZXJzIHJvdGF0ZSBvYmplY3RzIGluIGEgY2xvY2t3aXNlIGRpcmVjdGlvbi5cbiAqIFRyYW5zZm9ybWF0aW9ucyBhcHBseSB0byBldmVyeXRoaW5nIHRoYXQgaGFwcGVucyBhZnRlciBhbmQgc3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIGFjY3VtdWxhdGVzIHRoZSBlZmZlY3QuIEZvciBleGFtcGxlLCBjYWxsaW5nXG4gKiByb3RhdGUoSEFMRl9QSSkgYW5kIHRoZW4gcm90YXRlKEhBTEZfUEkpIGlzIHRoZSBzYW1lIGFzIHJvdGF0ZShQSSkuXG4gKiBBbGwgdHJhbmZvcm1hdGlvbnMgYXJlIHJlc2V0IHdoZW4gZHJhdygpIGJlZ2lucyBhZ2Fpbi5cbiAqIDxicj48YnI+XG4gKiBUZWNobmljYWxseSwgcm90YXRlKCkgbXVsdGlwbGllcyB0aGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAqIGJ5IGEgcm90YXRpb24gbWF0cml4LiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBmdXJ0aGVyIGNvbnRyb2xsZWQgYnlcbiAqIHRoZSBwdXNoKCkgYW5kIHBvcCgpLlxuICpcbiAqIEBtZXRob2Qgcm90YXRlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGFuZ2xlIHRoZSBhbmdsZSBvZiByb3RhdGlvbiwgc3BlY2lmaWVkIGluIHJhZGlhbnNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGVncmVlcywgZGVwZW5kaW5nIG9uIGN1cnJlbnQgYW5nbGVNb2RlXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J8TnVtYmVyW119IFtheGlzXSAoaW4gM2QpIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB0cmFuc2xhdGUod2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAqIHJvdGF0ZShQSSAvIDMuMCk7XG4gKiByZWN0KC0yNiwgLTI2LCA1MiwgNTIpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogd2hpdGUgNTJ4NTIgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgYXQgY2VudGVyIHJvdGF0ZWQgY291bnRlciA0NSBkZWdyZWVzXG4gKlxuICovXG5wNS5wcm90b3R5cGUucm90YXRlID0gZnVuY3Rpb24oYW5nbGUsIGF4aXMpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygncm90YXRlJywgYXJndW1lbnRzKTtcbiAgdGhpcy5fcmVuZGVyZXIucm90YXRlKHRoaXMuX3RvUmFkaWFucyhhbmdsZSksIGF4aXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUm90YXRlcyBhcm91bmQgWCBheGlzLlxuICogQG1ldGhvZCAgcm90YXRlWFxuICogQHBhcmFtICB7TnVtYmVyfSBhbmdsZSB0aGUgYW5nbGUgb2Ygcm90YXRpb24sIHNwZWNpZmllZCBpbiByYWRpYW5zXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRlZ3JlZXMsIGRlcGVuZGluZyBvbiBjdXJyZW50IGFuZ2xlTW9kZVxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgbW9kZXJuaXpyPSd3ZWJnbCc+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjU1KTtcbiAqICAgcm90YXRlWChtaWxsaXMoKSAvIDEwMDApO1xuICogICBib3goKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDNkIGJveCByb3RhdGluZyBhcm91bmQgdGhlIHggYXhpcy5cbiAqL1xucDUucHJvdG90eXBlLnJvdGF0ZVggPSBmdW5jdGlvbihhbmdsZSkge1xuICB0aGlzLl9hc3NlcnQzZCgncm90YXRlWCcpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdyb3RhdGVYJywgYXJndW1lbnRzKTtcbiAgdGhpcy5fcmVuZGVyZXIucm90YXRlWCh0aGlzLl90b1JhZGlhbnMoYW5nbGUpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYXJvdW5kIFkgYXhpcy5cbiAqIEBtZXRob2Qgcm90YXRlWVxuICogQHBhcmFtICB7TnVtYmVyfSBhbmdsZSB0aGUgYW5nbGUgb2Ygcm90YXRpb24sIHNwZWNpZmllZCBpbiByYWRpYW5zXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRlZ3JlZXMsIGRlcGVuZGluZyBvbiBjdXJyZW50IGFuZ2xlTW9kZVxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgbW9kZXJuaXpyPSd3ZWJnbCc+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjU1KTtcbiAqICAgcm90YXRlWShtaWxsaXMoKSAvIDEwMDApO1xuICogICBib3goKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDNkIGJveCByb3RhdGluZyBhcm91bmQgdGhlIHkgYXhpcy5cbiAqL1xucDUucHJvdG90eXBlLnJvdGF0ZVkgPSBmdW5jdGlvbihhbmdsZSkge1xuICB0aGlzLl9hc3NlcnQzZCgncm90YXRlWScpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdyb3RhdGVZJywgYXJndW1lbnRzKTtcbiAgdGhpcy5fcmVuZGVyZXIucm90YXRlWSh0aGlzLl90b1JhZGlhbnMoYW5nbGUpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYXJvdW5kIFogYXhpcy4gV2ViZ2wgbW9kZSBvbmx5LlxuICogQG1ldGhvZCByb3RhdGVaXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGFuZ2xlIHRoZSBhbmdsZSBvZiByb3RhdGlvbiwgc3BlY2lmaWVkIGluIHJhZGlhbnNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGVncmVlcywgZGVwZW5kaW5nIG9uIGN1cnJlbnQgYW5nbGVNb2RlXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdiBtb2Rlcm5penI9J3dlYmdsJz5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICogfVxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyNTUpO1xuICogICByb3RhdGVaKG1pbGxpcygpIC8gMTAwMCk7XG4gKiAgIGJveCgpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogM2QgYm94IHJvdGF0aW5nIGFyb3VuZCB0aGUgeiBheGlzLlxuICovXG5wNS5wcm90b3R5cGUucm90YXRlWiA9IGZ1bmN0aW9uKGFuZ2xlKSB7XG4gIHRoaXMuX2Fzc2VydDNkKCdyb3RhdGVaJyk7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3JvdGF0ZVonLCBhcmd1bWVudHMpO1xuICB0aGlzLl9yZW5kZXJlci5yb3RhdGVaKHRoaXMuX3RvUmFkaWFucyhhbmdsZSkpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogSW5jcmVhc2VzIG9yIGRlY3JlYXNlcyB0aGUgc2l6ZSBvZiBhIHNoYXBlIGJ5IGV4cGFuZGluZyBhbmQgY29udHJhY3RpbmdcbiAqIHZlcnRpY2VzLiBPYmplY3RzIGFsd2F5cyBzY2FsZSBmcm9tIHRoZWlyIHJlbGF0aXZlIG9yaWdpbiB0byB0aGVcbiAqIGNvb3JkaW5hdGUgc3lzdGVtLiBTY2FsZSB2YWx1ZXMgYXJlIHNwZWNpZmllZCBhcyBkZWNpbWFsIHBlcmNlbnRhZ2VzLlxuICogRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiBjYWxsIHNjYWxlKDIuMCkgaW5jcmVhc2VzIHRoZSBkaW1lbnNpb24gb2YgYVxuICogc2hhcGUgYnkgMjAwJS5cbiAqIDxicj48YnI+XG4gKiBUcmFuc2Zvcm1hdGlvbnMgYXBwbHkgdG8gZXZlcnl0aGluZyB0aGF0IGhhcHBlbnMgYWZ0ZXIgYW5kIHN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBmdW5jdGlvbiBtdWx0aXBseSB0aGUgZWZmZWN0LiBGb3IgZXhhbXBsZSwgY2FsbGluZyBzY2FsZSgyLjApXG4gKiBhbmQgdGhlbiBzY2FsZSgxLjUpIGlzIHRoZSBzYW1lIGFzIHNjYWxlKDMuMCkuIElmIHNjYWxlKCkgaXMgY2FsbGVkXG4gKiB3aXRoaW4gZHJhdygpLCB0aGUgdHJhbnNmb3JtYXRpb24gaXMgcmVzZXQgd2hlbiB0aGUgbG9vcCBiZWdpbnMgYWdhaW4uXG4gKiA8YnI+PGJyPlxuICogVXNpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSB6IHBhcmFtZXRlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBXRUJHTCBtb2RlLlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgZnVydGhlciBjb250cm9sbGVkIHdpdGggcHVzaCgpIGFuZCBwb3AoKS5cbiAqXG4gKiBAbWV0aG9kIHNjYWxlXG4gKiBAcGFyYW0gIHtOdW1iZXJ8cDUuVmVjdG9yfE51bWJlcltdfSBzXG4gKiAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50IHRvIHNjYWxlIHRoZSBvYmplY3QsIG9yIHBlcmNlbnRhZ2UgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgIHNjYWxlIHRoZSBvYmplY3QgaW4gdGhlIHgtYXhpcyBpZiBtdWx0aXBsZSBhcmd1bWVudHNcbiAqICAgICAgICAgICAgICAgICAgICAgIGFyZSBnaXZlblxuICogQHBhcmFtICB7TnVtYmVyfSBbeV0gcGVyY2VudCB0byBzY2FsZSB0aGUgb2JqZWN0IGluIHRoZSB5LWF4aXNcbiAqIEBwYXJhbSAge051bWJlcn0gW3pdIHBlcmNlbnQgdG8gc2NhbGUgdGhlIG9iamVjdCBpbiB0aGUgei1heGlzICh3ZWJnbCBvbmx5KVxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHRyYW5zbGF0ZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICogcm90YXRlKFBJIC8gMy4wKTtcbiAqIHJlY3QoLTI2LCAtMjYsIDUyLCA1Mik7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiByZWN0KDMwLCAyMCwgNTAsIDUwKTtcbiAqIHNjYWxlKDAuNSwgMS4zKTtcbiAqIHJlY3QoMzAsIDIwLCA1MCwgNTApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogd2hpdGUgNTJ4NTIgcmVjdCB3aXRoIGJsYWNrIG91dGxpbmUgYXQgY2VudGVyIHJvdGF0ZWQgY291bnRlciA0NSBkZWdyZWVzXG4gKiAyIHdoaXRlIHJlY3RzIHdpdGggYmxhY2sgb3V0bGluZS0gMSA1MHg1MCBhdCBjZW50ZXIuIG90aGVyIDI1eDY1IGJvdHRvbSBsZWZ0XG4gKlxuICovXG4vKipcbiAqIEBtZXRob2Qgc2NhbGVcbiAqIEBwYXJhbSAge3A1LlZlY3RvcnxOdW1iZXJbXX0gc2NhbGVzIHBlci1heGlzIHBlcmNlbnRzIHRvIHNjYWxlIHRoZSBvYmplY3RcbiAqIEBjaGFpbmFibGVcbiAqL1xucDUucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdzY2FsZScsIGFyZ3VtZW50cyk7XG4gIC8vIE9ubHkgY2hlY2sgZm9yIFZlY3RvciBhcmd1bWVudCB0eXBlIGlmIFZlY3RvciBpcyBhdmFpbGFibGVcbiAgaWYgKHggaW5zdGFuY2VvZiBwNS5WZWN0b3IpIHtcbiAgICB2YXIgdiA9IHg7XG4gICAgeCA9IHYueDtcbiAgICB5ID0gdi55O1xuICAgIHogPSB2Lno7XG4gIH0gZWxzZSBpZiAoeCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgdmFyIHJnID0geDtcbiAgICB4ID0gcmdbMF07XG4gICAgeSA9IHJnWzFdO1xuICAgIHogPSByZ1syXSB8fCAxO1xuICB9XG4gIGlmIChpc05hTih5KSkge1xuICAgIHkgPSB6ID0geDtcbiAgfSBlbHNlIGlmIChpc05hTih6KSkge1xuICAgIHogPSAxO1xuICB9XG5cbiAgdGhpcy5fcmVuZGVyZXIuc2NhbGUuY2FsbCh0aGlzLl9yZW5kZXJlciwgeCwgeSwgeik7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNoZWFycyBhIHNoYXBlIGFyb3VuZCB0aGUgeC1heGlzIHRoZSBhbW91bnQgc3BlY2lmaWVkIGJ5IHRoZSBhbmdsZVxuICogcGFyYW1ldGVyLiBBbmdsZXMgc2hvdWxkIGJlIHNwZWNpZmllZCBpbiB0aGUgY3VycmVudCBhbmdsZU1vZGUuXG4gKiBPYmplY3RzIGFyZSBhbHdheXMgc2hlYXJlZCBhcm91bmQgdGhlaXIgcmVsYXRpdmUgcG9zaXRpb24gdG8gdGhlIG9yaWdpblxuICogYW5kIHBvc2l0aXZlIG51bWJlcnMgc2hlYXIgb2JqZWN0cyBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uXG4gKiA8YnI+PGJyPlxuICogVHJhbnNmb3JtYXRpb25zIGFwcGx5IHRvIGV2ZXJ5dGhpbmcgdGhhdCBoYXBwZW5zIGFmdGVyIGFuZCBzdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZnVuY3Rpb24gYWNjdW11bGF0ZXMgdGhlIGVmZmVjdC4gRm9yIGV4YW1wbGUsIGNhbGxpbmdcbiAqIHNoZWFyWChQSS8yKSBhbmQgdGhlbiBzaGVhclgoUEkvMikgaXMgdGhlIHNhbWUgYXMgc2hlYXJYKFBJKS5cbiAqIElmIHNoZWFyWCgpIGlzIGNhbGxlZCB3aXRoaW4gdGhlIGRyYXcoKSwgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHJlc2V0IHdoZW5cbiAqIHRoZSBsb29wIGJlZ2lucyBhZ2Fpbi5cbiAqIDxicj48YnI+XG4gKiBUZWNobmljYWxseSwgc2hlYXJYKCkgbXVsdGlwbGllcyB0aGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYnkgYVxuICogcm90YXRpb24gbWF0cml4LiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBmdXJ0aGVyIGNvbnRyb2xsZWQgYnkgdGhlXG4gKiBwdXNoKCkgYW5kIHBvcCgpIGZ1bmN0aW9ucy5cbiAqXG4gKiBAbWV0aG9kIHNoZWFyWFxuICogQHBhcmFtICB7TnVtYmVyfSBhbmdsZSBhbmdsZSBvZiBzaGVhciBzcGVjaWZpZWQgaW4gcmFkaWFucyBvciBkZWdyZWVzLFxuICogICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gY3VycmVudCBhbmdsZU1vZGVcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB0cmFuc2xhdGUod2lkdGggLyA0LCBoZWlnaHQgLyA0KTtcbiAqIHNoZWFyWChQSSAvIDQuMCk7XG4gKiByZWN0KDAsIDAsIDMwLCAzMCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiB3aGl0ZSBpcnJlZ3VsYXIgcXVhZHJpbGF0ZXJhbCB3aXRoIGJsYWNrIG91dGxpbmUgYXQgdG9wIG1pZGRsZS5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5zaGVhclggPSBmdW5jdGlvbihhbmdsZSkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdzaGVhclgnLCBhcmd1bWVudHMpO1xuICB0aGlzLl9yZW5kZXJlci5zaGVhclgodGhpcy5fdG9SYWRpYW5zKGFuZ2xlKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTaGVhcnMgYSBzaGFwZSBhcm91bmQgdGhlIHktYXhpcyB0aGUgYW1vdW50IHNwZWNpZmllZCBieSB0aGUgYW5nbGVcbiAqIHBhcmFtZXRlci4gQW5nbGVzIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gdGhlIGN1cnJlbnQgYW5nbGVNb2RlLiBPYmplY3RzXG4gKiBhcmUgYWx3YXlzIHNoZWFyZWQgYXJvdW5kIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9uIHRvIHRoZSBvcmlnaW4gYW5kXG4gKiBwb3NpdGl2ZSBudW1iZXJzIHNoZWFyIG9iamVjdHMgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uLlxuICogPGJyPjxicj5cbiAqIFRyYW5zZm9ybWF0aW9ucyBhcHBseSB0byBldmVyeXRoaW5nIHRoYXQgaGFwcGVucyBhZnRlciBhbmQgc3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIGFjY3VtdWxhdGVzIHRoZSBlZmZlY3QuIEZvciBleGFtcGxlLCBjYWxsaW5nXG4gKiBzaGVhclkoUEkvMikgYW5kIHRoZW4gc2hlYXJZKFBJLzIpIGlzIHRoZSBzYW1lIGFzIHNoZWFyWShQSSkuIElmXG4gKiBzaGVhclkoKSBpcyBjYWxsZWQgd2l0aGluIHRoZSBkcmF3KCksIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyByZXNldCB3aGVuXG4gKiB0aGUgbG9vcCBiZWdpbnMgYWdhaW4uXG4gKiA8YnI+PGJyPlxuICogVGVjaG5pY2FsbHksIHNoZWFyWSgpIG11bHRpcGxpZXMgdGhlIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24gbWF0cml4IGJ5IGFcbiAqIHJvdGF0aW9uIG1hdHJpeC4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgZnVydGhlciBjb250cm9sbGVkIGJ5IHRoZVxuICogcHVzaCgpIGFuZCBwb3AoKSBmdW5jdGlvbnMuXG4gKlxuICogQG1ldGhvZCBzaGVhcllcbiAqIEBwYXJhbSAge051bWJlcn0gYW5nbGUgYW5nbGUgb2Ygc2hlYXIgc3BlY2lmaWVkIGluIHJhZGlhbnMgb3IgZGVncmVlcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIGN1cnJlbnQgYW5nbGVNb2RlXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdHJhbnNsYXRlKHdpZHRoIC8gNCwgaGVpZ2h0IC8gNCk7XG4gKiBzaGVhclkoUEkgLyA0LjApO1xuICogcmVjdCgwLCAwLCAzMCwgMzApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogd2hpdGUgaXJyZWd1bGFyIHF1YWRyaWxhdGVyYWwgd2l0aCBibGFjayBvdXRsaW5lIGF0IG1pZGRsZSBib3R0b20uXG4gKlxuICovXG5wNS5wcm90b3R5cGUuc2hlYXJZID0gZnVuY3Rpb24oYW5nbGUpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnc2hlYXJZJywgYXJndW1lbnRzKTtcbiAgdGhpcy5fcmVuZGVyZXIuc2hlYXJZKHRoaXMuX3RvUmFkaWFucyhhbmdsZSkpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU3BlY2lmaWVzIGFuIGFtb3VudCB0byBkaXNwbGFjZSBvYmplY3RzIHdpdGhpbiB0aGUgZGlzcGxheSB3aW5kb3cuXG4gKiBUaGUgeCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGxlZnQvcmlnaHQgdHJhbnNsYXRpb24sIHRoZSB5IHBhcmFtZXRlclxuICogc3BlY2lmaWVzIHVwL2Rvd24gdHJhbnNsYXRpb24uXG4gKiA8YnI+PGJyPlxuICogVHJhbnNmb3JtYXRpb25zIGFyZSBjdW11bGF0aXZlIGFuZCBhcHBseSB0byBldmVyeXRoaW5nIHRoYXQgaGFwcGVucyBhZnRlclxuICogYW5kIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIGFjY3VtdWxhdGVzIHRoZSBlZmZlY3QuIEZvciBleGFtcGxlLFxuICogY2FsbGluZyB0cmFuc2xhdGUoNTAsIDApIGFuZCB0aGVuIHRyYW5zbGF0ZSgyMCwgMCkgaXMgdGhlIHNhbWUgYXNcbiAqIHRyYW5zbGF0ZSg3MCwgMCkuIElmIHRyYW5zbGF0ZSgpIGlzIGNhbGxlZCB3aXRoaW4gZHJhdygpLCB0aGVcbiAqIHRyYW5zZm9ybWF0aW9uIGlzIHJlc2V0IHdoZW4gdGhlIGxvb3AgYmVnaW5zIGFnYWluLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZVxuICogZnVydGhlciBjb250cm9sbGVkIGJ5IHVzaW5nIHB1c2goKSBhbmQgcG9wKCkuXG4gKlxuICogQG1ldGhvZCB0cmFuc2xhdGVcbiAqIEBwYXJhbSAge051bWJlcn0geCBsZWZ0L3JpZ2h0IHRyYW5zbGF0aW9uXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkgdXAvZG93biB0cmFuc2xhdGlvblxuICogQHBhcmFtICB7TnVtYmVyfSBbel0gZm9yd2FyZC9iYWNrd2FyZCB0cmFuc2xhdGlvbiAod2ViZ2wgb25seSlcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB0cmFuc2xhdGUoMzAsIDIwKTtcbiAqIHJlY3QoMCwgMCwgNTUsIDU1KTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHJlY3QoMCwgMCwgNTUsIDU1KTsgLy8gRHJhdyByZWN0IGF0IG9yaWdpbmFsIDAsMFxuICogdHJhbnNsYXRlKDMwLCAyMCk7XG4gKiByZWN0KDAsIDAsIDU1LCA1NSk7IC8vIERyYXcgcmVjdCBhdCBuZXcgMCwwXG4gKiB0cmFuc2xhdGUoMTQsIDE0KTtcbiAqIHJlY3QoMCwgMCwgNTUsIDU1KTsgLy8gRHJhdyByZWN0IGF0IG5ldyAwLDBcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcblxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICByZWN0TW9kZShDRU5URVIpO1xuICogICB0cmFuc2xhdGUod2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAqICAgdHJhbnNsYXRlKHA1LlZlY3Rvci5mcm9tQW5nbGUobWlsbGlzKCkgLyAxMDAwLCA0MCkpO1xuICogICByZWN0KDAsIDAsIDIwLCAyMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiB3aGl0ZSA1NXg1NSByZWN0IHdpdGggYmxhY2sgb3V0bGluZSBhdCBjZW50ZXIgcmlnaHQuXG4gKiAzIHdoaXRlIDU1eDU1IHJlY3RzIHdpdGggYmxhY2sgb3V0bGluZXMgYXQgdG9wLWwsIGNlbnRlci1yIGFuZCBib3R0b20tci5cbiAqIGEgMjB4MjAgd2hpdGUgcmVjdCBtb3ZpbmcgaW4gYSBjaXJjbGUgYXJvdW5kIHRoZSBjYW52YXNcbiAqXG4gKi9cbi8qKlxuICogQG1ldGhvZCB0cmFuc2xhdGVcbiAqIEBwYXJhbSAge3A1LlZlY3Rvcn0gdmVjdG9yIHRoZSB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1LnByb3RvdHlwZS50cmFuc2xhdGUgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3RyYW5zbGF0ZScsIGFyZ3VtZW50cyk7XG4gIGlmICh0aGlzLl9yZW5kZXJlci5pc1AzRCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLnRyYW5zbGF0ZSh4LCB5LCB6KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9yZW5kZXJlci50cmFuc2xhdGUoeCwgeSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4vY29yZVwiOjIyfV0sMzU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIFNoYXBlXG4gKiBAc3VibW9kdWxlIFZlcnRleFxuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqIEByZXF1aXJlcyBjb25zdGFudHNcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4vY29yZScpO1xudmFyIGNvbnN0YW50cyA9IF9kZXJlcV8oJy4vY29uc3RhbnRzJyk7XG52YXIgc2hhcGVLaW5kID0gbnVsbDtcbnZhciB2ZXJ0aWNlcyA9IFtdO1xudmFyIGNvbnRvdXJWZXJ0aWNlcyA9IFtdO1xudmFyIGlzQmV6aWVyID0gZmFsc2U7XG52YXIgaXNDdXJ2ZSA9IGZhbHNlO1xudmFyIGlzUXVhZHJhdGljID0gZmFsc2U7XG52YXIgaXNDb250b3VyID0gZmFsc2U7XG52YXIgaXNGaXJzdENvbnRvdXIgPSB0cnVlO1xuXG4vKipcbiAqIFVzZSB0aGUgYmVnaW5Db250b3VyKCkgYW5kIGVuZENvbnRvdXIoKSBmdW5jdGlvbnMgdG8gY3JlYXRlIG5lZ2F0aXZlXG4gKiBzaGFwZXMgd2l0aGluIHNoYXBlcyBzdWNoIGFzIHRoZSBjZW50ZXIgb2YgdGhlIGxldHRlciAnTycuIGJlZ2luQ29udG91cigpXG4gKiBiZWdpbnMgcmVjb3JkaW5nIHZlcnRpY2VzIGZvciB0aGUgc2hhcGUgYW5kIGVuZENvbnRvdXIoKSBzdG9wcyByZWNvcmRpbmcuXG4gKiBUaGUgdmVydGljZXMgdGhhdCBkZWZpbmUgYSBuZWdhdGl2ZSBzaGFwZSBtdXN0IFwid2luZFwiIGluIHRoZSBvcHBvc2l0ZVxuICogZGlyZWN0aW9uIGZyb20gdGhlIGV4dGVyaW9yIHNoYXBlLiBGaXJzdCBkcmF3IHZlcnRpY2VzIGZvciB0aGUgZXh0ZXJpb3JcbiAqIGNsb2Nrd2lzZSBvcmRlciwgdGhlbiBmb3IgaW50ZXJuYWwgc2hhcGVzLCBkcmF3IHZlcnRpY2VzXG4gKiBzaGFwZSBpbiBjb3VudGVyLWNsb2Nrd2lzZS5cbiAqIDxicj48YnI+XG4gKiBUaGVzZSBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoaW4gYSBiZWdpblNoYXBlKCkvZW5kU2hhcGUoKSBwYWlyIGFuZFxuICogdHJhbnNmb3JtYXRpb25zIHN1Y2ggYXMgdHJhbnNsYXRlKCksIHJvdGF0ZSgpLCBhbmQgc2NhbGUoKSBkbyBub3Qgd29ya1xuICogd2l0aGluIGEgYmVnaW5Db250b3VyKCkvZW5kQ29udG91cigpIHBhaXIuIEl0IGlzIGFsc28gbm90IHBvc3NpYmxlIHRvIHVzZVxuICogb3RoZXIgc2hhcGVzLCBzdWNoIGFzIGVsbGlwc2UoKSBvciByZWN0KCkgd2l0aGluLlxuICpcbiAqIEBtZXRob2QgYmVnaW5Db250b3VyXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdHJhbnNsYXRlKDUwLCA1MCk7XG4gKiBzdHJva2UoMjU1LCAwLCAwKTtcbiAqIGJlZ2luU2hhcGUoKTtcbiAqIC8vIEV4dGVyaW9yIHBhcnQgb2Ygc2hhcGUsIGNsb2Nrd2lzZSB3aW5kaW5nXG4gKiB2ZXJ0ZXgoLTQwLCAtNDApO1xuICogdmVydGV4KDQwLCAtNDApO1xuICogdmVydGV4KDQwLCA0MCk7XG4gKiB2ZXJ0ZXgoLTQwLCA0MCk7XG4gKiAvLyBJbnRlcmlvciBwYXJ0IG9mIHNoYXBlLCBjb3VudGVyLWNsb2Nrd2lzZSB3aW5kaW5nXG4gKiBiZWdpbkNvbnRvdXIoKTtcbiAqIHZlcnRleCgtMjAsIC0yMCk7XG4gKiB2ZXJ0ZXgoLTIwLCAyMCk7XG4gKiB2ZXJ0ZXgoMjAsIDIwKTtcbiAqIHZlcnRleCgyMCwgLTIwKTtcbiAqIGVuZENvbnRvdXIoKTtcbiAqIGVuZFNoYXBlKENMT1NFKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIHdoaXRlIHJlY3QgYW5kIHNtYWxsZXIgZ3JleSByZWN0IHdpdGggcmVkIG91dGxpbmVzIGluIGNlbnRlciBvZiBjYW52YXMuXG4gKlxuICovXG5wNS5wcm90b3R5cGUuYmVnaW5Db250b3VyID0gZnVuY3Rpb24oKSB7XG4gIGNvbnRvdXJWZXJ0aWNlcyA9IFtdO1xuICBpc0NvbnRvdXIgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVXNpbmcgdGhlIGJlZ2luU2hhcGUoKSBhbmQgZW5kU2hhcGUoKSBmdW5jdGlvbnMgYWxsb3cgY3JlYXRpbmcgbW9yZVxuICogY29tcGxleCBmb3Jtcy4gYmVnaW5TaGFwZSgpIGJlZ2lucyByZWNvcmRpbmcgdmVydGljZXMgZm9yIGEgc2hhcGUgYW5kXG4gKiBlbmRTaGFwZSgpIHN0b3BzIHJlY29yZGluZy4gVGhlIHZhbHVlIG9mIHRoZSBraW5kIHBhcmFtZXRlciB0ZWxscyBpdCB3aGljaFxuICogdHlwZXMgb2Ygc2hhcGVzIHRvIGNyZWF0ZSBmcm9tIHRoZSBwcm92aWRlZCB2ZXJ0aWNlcy4gV2l0aCBubyBtb2RlXG4gKiBzcGVjaWZpZWQsIHRoZSBzaGFwZSBjYW4gYmUgYW55IGlycmVndWxhciBwb2x5Z29uLlxuICogPGJyPjxicj5cbiAqIFRoZSBwYXJhbWV0ZXJzIGF2YWlsYWJsZSBmb3IgYmVnaW5TaGFwZSgpIGFyZSBQT0lOVFMsIExJTkVTLCBUUklBTkdMRVMsXG4gKiBUUklBTkdMRV9GQU4sIFRSSUFOR0xFX1NUUklQLCBRVUFEUywgYW5kIFFVQURfU1RSSVAuIEFmdGVyIGNhbGxpbmcgdGhlXG4gKiBiZWdpblNoYXBlKCkgZnVuY3Rpb24sIGEgc2VyaWVzIG9mIHZlcnRleCgpIGNvbW1hbmRzIG11c3QgZm9sbG93LiBUbyBzdG9wXG4gKiBkcmF3aW5nIHRoZSBzaGFwZSwgY2FsbCBlbmRTaGFwZSgpLiBFYWNoIHNoYXBlIHdpbGwgYmUgb3V0bGluZWQgd2l0aCB0aGVcbiAqIGN1cnJlbnQgc3Ryb2tlIGNvbG9yIGFuZCBmaWxsZWQgd2l0aCB0aGUgZmlsbCBjb2xvci5cbiAqIDxicj48YnI+XG4gKiBUcmFuc2Zvcm1hdGlvbnMgc3VjaCBhcyB0cmFuc2xhdGUoKSwgcm90YXRlKCksIGFuZCBzY2FsZSgpIGRvIG5vdCB3b3JrXG4gKiB3aXRoaW4gYmVnaW5TaGFwZSgpLiBJdCBpcyBhbHNvIG5vdCBwb3NzaWJsZSB0byB1c2Ugb3RoZXIgc2hhcGVzLCBzdWNoIGFzXG4gKiBlbGxpcHNlKCkgb3IgcmVjdCgpIHdpdGhpbiBiZWdpblNoYXBlKCkuXG4gKlxuICogQG1ldGhvZCBiZWdpblNoYXBlXG4gKiBAcGFyYW0gIHtDb25zdGFudH0gW2tpbmRdIGVpdGhlciBQT0lOVFMsIExJTkVTLCBUUklBTkdMRVMsIFRSSUFOR0xFX0ZBTlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSSUFOR0xFX1NUUklQLCBRVUFEUywgb3IgUVVBRF9TVFJJUFxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGJlZ2luU2hhcGUoKTtcbiAqIHZlcnRleCgzMCwgMjApO1xuICogdmVydGV4KDg1LCAyMCk7XG4gKiB2ZXJ0ZXgoODUsIDc1KTtcbiAqIHZlcnRleCgzMCwgNzUpO1xuICogZW5kU2hhcGUoQ0xPU0UpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogYmVnaW5TaGFwZShQT0lOVFMpO1xuICogdmVydGV4KDMwLCAyMCk7XG4gKiB2ZXJ0ZXgoODUsIDIwKTtcbiAqIHZlcnRleCg4NSwgNzUpO1xuICogdmVydGV4KDMwLCA3NSk7XG4gKiBlbmRTaGFwZSgpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogYmVnaW5TaGFwZShMSU5FUyk7XG4gKiB2ZXJ0ZXgoMzAsIDIwKTtcbiAqIHZlcnRleCg4NSwgMjApO1xuICogdmVydGV4KDg1LCA3NSk7XG4gKiB2ZXJ0ZXgoMzAsIDc1KTtcbiAqIGVuZFNoYXBlKCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBub0ZpbGwoKTtcbiAqIGJlZ2luU2hhcGUoKTtcbiAqIHZlcnRleCgzMCwgMjApO1xuICogdmVydGV4KDg1LCAyMCk7XG4gKiB2ZXJ0ZXgoODUsIDc1KTtcbiAqIHZlcnRleCgzMCwgNzUpO1xuICogZW5kU2hhcGUoKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIG5vRmlsbCgpO1xuICogYmVnaW5TaGFwZSgpO1xuICogdmVydGV4KDMwLCAyMCk7XG4gKiB2ZXJ0ZXgoODUsIDIwKTtcbiAqIHZlcnRleCg4NSwgNzUpO1xuICogdmVydGV4KDMwLCA3NSk7XG4gKiBlbmRTaGFwZShDTE9TRSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBiZWdpblNoYXBlKFRSSUFOR0xFUyk7XG4gKiB2ZXJ0ZXgoMzAsIDc1KTtcbiAqIHZlcnRleCg0MCwgMjApO1xuICogdmVydGV4KDUwLCA3NSk7XG4gKiB2ZXJ0ZXgoNjAsIDIwKTtcbiAqIHZlcnRleCg3MCwgNzUpO1xuICogdmVydGV4KDgwLCAyMCk7XG4gKiBlbmRTaGFwZSgpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogYmVnaW5TaGFwZShUUklBTkdMRV9TVFJJUCk7XG4gKiB2ZXJ0ZXgoMzAsIDc1KTtcbiAqIHZlcnRleCg0MCwgMjApO1xuICogdmVydGV4KDUwLCA3NSk7XG4gKiB2ZXJ0ZXgoNjAsIDIwKTtcbiAqIHZlcnRleCg3MCwgNzUpO1xuICogdmVydGV4KDgwLCAyMCk7XG4gKiB2ZXJ0ZXgoOTAsIDc1KTtcbiAqIGVuZFNoYXBlKCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBiZWdpblNoYXBlKFRSSUFOR0xFX0ZBTik7XG4gKiB2ZXJ0ZXgoNTcuNSwgNTApO1xuICogdmVydGV4KDU3LjUsIDE1KTtcbiAqIHZlcnRleCg5MiwgNTApO1xuICogdmVydGV4KDU3LjUsIDg1KTtcbiAqIHZlcnRleCgyMiwgNTApO1xuICogdmVydGV4KDU3LjUsIDE1KTtcbiAqIGVuZFNoYXBlKCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBiZWdpblNoYXBlKFFVQURTKTtcbiAqIHZlcnRleCgzMCwgMjApO1xuICogdmVydGV4KDMwLCA3NSk7XG4gKiB2ZXJ0ZXgoNTAsIDc1KTtcbiAqIHZlcnRleCg1MCwgMjApO1xuICogdmVydGV4KDY1LCAyMCk7XG4gKiB2ZXJ0ZXgoNjUsIDc1KTtcbiAqIHZlcnRleCg4NSwgNzUpO1xuICogdmVydGV4KDg1LCAyMCk7XG4gKiBlbmRTaGFwZSgpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogYmVnaW5TaGFwZShRVUFEX1NUUklQKTtcbiAqIHZlcnRleCgzMCwgMjApO1xuICogdmVydGV4KDMwLCA3NSk7XG4gKiB2ZXJ0ZXgoNTAsIDIwKTtcbiAqIHZlcnRleCg1MCwgNzUpO1xuICogdmVydGV4KDY1LCAyMCk7XG4gKiB2ZXJ0ZXgoNjUsIDc1KTtcbiAqIHZlcnRleCg4NSwgMjApO1xuICogdmVydGV4KDg1LCA3NSk7XG4gKiBlbmRTaGFwZSgpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogYmVnaW5TaGFwZSgpO1xuICogdmVydGV4KDIwLCAyMCk7XG4gKiB2ZXJ0ZXgoNDAsIDIwKTtcbiAqIHZlcnRleCg0MCwgNDApO1xuICogdmVydGV4KDYwLCA0MCk7XG4gKiB2ZXJ0ZXgoNjAsIDYwKTtcbiAqIHZlcnRleCgyMCwgNjApO1xuICogZW5kU2hhcGUoQ0xPU0UpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiBAYWx0XG4gKiB3aGl0ZSBzcXVhcmUtc2hhcGUgd2l0aCBibGFjayBvdXRsaW5lIGluIG1pZGRsZS1yaWdodCBvZiBjYW52YXMuXG4gKiA0IGJsYWNrIHBvaW50cyBpbiBhIHNxdWFyZSBzaGFwZSBpbiBtaWRkbGUtcmlnaHQgb2YgY2FudmFzLlxuICogMiBob3Jpem9udGFsIGJsYWNrIGxpbmVzLiBJbiB0aGUgdG9wLXJpZ2h0IGFuZCBib3R0b20tcmlnaHQgb2YgY2FudmFzLlxuICogMyBsaW5lIHNoYXBlIHdpdGggaG9yaXpvbnRhbCBvbiB0b3AsIHZlcnRpY2FsIGluIG1pZGRsZSBhbmQgaG9yaXpvbnRhbCBib3R0b20uXG4gKiBzcXVhcmUgbGluZSBzaGFwZSBpbiBtaWRkbGUtcmlnaHQgb2YgY2FudmFzLlxuICogMiB3aGl0ZSB0cmlhbmdsZSBzaGFwZXMgbWlkLXJpZ2h0IGNhbnZhcy4gbGVmdCBvbmUgcG9pbnRpbmcgdXAgYW5kIHJpZ2h0IGRvd24uXG4gKiA1IGhvcml6b250YWwgaW50ZXJsb2NraW5nIGFuZCBhbHRlcm5hdGluZyB3aGl0ZSB0cmlhbmdsZXMgaW4gbWlkLXJpZ2h0IGNhbnZhcy5cbiAqIDQgaW50ZXJsb2NraW5nIHdoaXRlIHRyaWFuZ2xlcyBpbiA0NSBkZWdyZWUgcm90YXRlZCBzcXVhcmUtc2hhcGUuXG4gKiAyIHdoaXRlIHJlY3RhbmdsZSBzaGFwZXMgaW4gbWlkLXJpZ2h0IGNhbnZhcy4gQm90aCAyMHg1NS5cbiAqIDMgc2lkZS1ieS1zaWRlIHdoaXRlIHJlY3RhbmdsZXMgY2VudGVyIHJlY3QgaXMgc21hbGxlciBpbiBtaWQtcmlnaHQgY2FudmFzLlxuICogVGhpY2sgd2hpdGUgbC1zaGFwZSB3aXRoIGJsYWNrIG91dGxpbmUgbWlkLXRvcC1sZWZ0IG9mIGNhbnZhcy5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5iZWdpblNoYXBlID0gZnVuY3Rpb24oa2luZCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdiZWdpblNoYXBlJywgYXJndW1lbnRzKTtcbiAgaWYgKHRoaXMuX3JlbmRlcmVyLmlzUDNEKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIuYmVnaW5TaGFwZS5hcHBseSh0aGlzLl9yZW5kZXJlciwgYXJndW1lbnRzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXG4gICAgICBraW5kID09PSBjb25zdGFudHMuUE9JTlRTIHx8XG4gICAgICBraW5kID09PSBjb25zdGFudHMuTElORVMgfHxcbiAgICAgIGtpbmQgPT09IGNvbnN0YW50cy5UUklBTkdMRVMgfHxcbiAgICAgIGtpbmQgPT09IGNvbnN0YW50cy5UUklBTkdMRV9GQU4gfHxcbiAgICAgIGtpbmQgPT09IGNvbnN0YW50cy5UUklBTkdMRV9TVFJJUCB8fFxuICAgICAga2luZCA9PT0gY29uc3RhbnRzLlFVQURTIHx8XG4gICAgICBraW5kID09PSBjb25zdGFudHMuUVVBRF9TVFJJUFxuICAgICkge1xuICAgICAgc2hhcGVLaW5kID0ga2luZDtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hhcGVLaW5kID0gbnVsbDtcbiAgICB9XG5cbiAgICB2ZXJ0aWNlcyA9IFtdO1xuICAgIGNvbnRvdXJWZXJ0aWNlcyA9IFtdO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTcGVjaWZpZXMgdmVydGV4IGNvb3JkaW5hdGVzIGZvciBCZXppZXIgY3VydmVzLiBFYWNoIGNhbGwgdG9cbiAqIGJlemllclZlcnRleCgpIGRlZmluZXMgdGhlIHBvc2l0aW9uIG9mIHR3byBjb250cm9sIHBvaW50cyBhbmRcbiAqIG9uZSBhbmNob3IgcG9pbnQgb2YgYSBCZXppZXIgY3VydmUsIGFkZGluZyBhIG5ldyBzZWdtZW50IHRvIGFcbiAqIGxpbmUgb3Igc2hhcGUuXG4gKiA8YnI+PGJyPlxuICogVGhlIGZpcnN0IHRpbWUgYmV6aWVyVmVydGV4KCkgaXMgdXNlZCB3aXRoaW4gYVxuICogYmVnaW5TaGFwZSgpIGNhbGwsIGl0IG11c3QgYmUgcHJlZmFjZWQgd2l0aCBhIGNhbGwgdG8gdmVydGV4KClcbiAqIHRvIHNldCB0aGUgZmlyc3QgYW5jaG9yIHBvaW50LiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBiZXR3ZWVuXG4gKiBiZWdpblNoYXBlKCkgYW5kIGVuZFNoYXBlKCkgYW5kIG9ubHkgd2hlbiB0aGVyZSBpcyBubyBNT0RFXG4gKiBwYXJhbWV0ZXIgc3BlY2lmaWVkIHRvIGJlZ2luU2hhcGUoKS5cbiAqXG4gKiBAbWV0aG9kIGJlemllclZlcnRleFxuICogQHBhcmFtICB7TnVtYmVyfSB4MiB4LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBjb250cm9sIHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkyIHktY29vcmRpbmF0ZSBmb3IgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDMgeC1jb29yZGluYXRlIGZvciB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geTMgeS1jb29yZGluYXRlIGZvciB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDQgeC1jb29yZGluYXRlIGZvciB0aGUgYW5jaG9yIHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHk0IHktY29vcmRpbmF0ZSBmb3IgdGhlIGFuY2hvciBwb2ludFxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHN0cm9rZVdlaWdodCg1KTtcbiAqIHBvaW50KDMwLCAyMCk7XG4gKiBwb2ludCg4MCwgMjApO1xuICogcG9pbnQoODAsIDc1KTtcbiAqIHBvaW50KDMwLCA3NSk7XG4gKlxuICogc3Ryb2tlV2VpZ2h0KDEpO1xuICogbm9GaWxsKCk7XG4gKiBiZWdpblNoYXBlKCk7XG4gKiB2ZXJ0ZXgoMzAsIDIwKTtcbiAqIGJlemllclZlcnRleCg4MCwgMjAsIDgwLCA3NSwgMzAsIDc1KTtcbiAqIGVuZFNoYXBlKCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBzdHJva2VXZWlnaHQoNSk7XG4gKiBwb2ludCgzMCwgMjApO1xuICogcG9pbnQoODAsIDIwKTtcbiAqIHBvaW50KDgwLCA3NSk7XG4gKiBwb2ludCgzMCwgNzUpO1xuICpcbiAqIHN0cm9rZSgyNDQsIDEyMiwgMTU4KTtcbiAqIHBvaW50KDUwLCA4MCk7XG4gKiBwb2ludCg2MCwgMjUpO1xuICogcG9pbnQoMzAsIDIwKTtcbiAqXG4gKiBzdHJva2UoMCk7XG4gKiBzdHJva2VXZWlnaHQoMSk7XG4gKiBiZWdpblNoYXBlKCk7XG4gKiB2ZXJ0ZXgoMzAsIDIwKTtcbiAqIGJlemllclZlcnRleCg4MCwgMjAsIDgwLCA3NSwgMzAsIDc1KTtcbiAqIGJlemllclZlcnRleCg1MCwgODAsIDYwLCAyNSwgMzAsIDIwKTtcbiAqIGVuZFNoYXBlKCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBjcmVzY2VudC1zaGFwZWQgbGluZSBpbiBtaWRkbGUgb2YgY2FudmFzLiBQb2ludHMgZmFjaW5nIGxlZnQuXG4gKiB3aGl0ZSBjcmVzY2VudCBzaGFwZSBpbiBtaWRkbGUgb2YgY2FudmFzLiBQb2ludHMgZmFjaW5nIGxlZnQuXG4gKlxuICovXG5wNS5wcm90b3R5cGUuYmV6aWVyVmVydGV4ID0gZnVuY3Rpb24oeDIsIHkyLCB4MywgeTMsIHg0LCB5NCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdiZXppZXJWZXJ0ZXgnLCBhcmd1bWVudHMpO1xuICBpZiAodmVydGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgJ3ZlcnRleCgpIG11c3QgYmUgdXNlZCBvbmNlIGJlZm9yZSBjYWxsaW5nIGJlemllclZlcnRleCgpJztcbiAgfSBlbHNlIHtcbiAgICBpc0JlemllciA9IHRydWU7XG4gICAgdmFyIHZlcnQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmVydFtpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgdmVydC5pc1ZlcnQgPSBmYWxzZTtcbiAgICBpZiAoaXNDb250b3VyKSB7XG4gICAgICBjb250b3VyVmVydGljZXMucHVzaCh2ZXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmVydGljZXMucHVzaCh2ZXJ0KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNwZWNpZmllcyB2ZXJ0ZXggY29vcmRpbmF0ZXMgZm9yIGN1cnZlcy4gVGhpcyBmdW5jdGlvbiBtYXkgb25seVxuICogYmUgdXNlZCBiZXR3ZWVuIGJlZ2luU2hhcGUoKSBhbmQgZW5kU2hhcGUoKSBhbmQgb25seSB3aGVuIHRoZXJlXG4gKiBpcyBubyBNT0RFIHBhcmFtZXRlciBzcGVjaWZpZWQgdG8gYmVnaW5TaGFwZSgpLlxuICogPGJyPjxicj5cbiAqIFRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHMgaW4gYSBzZXJpZXMgb2YgY3VydmVWZXJ0ZXgoKSBsaW5lcyB3aWxsIGJlIHVzZWQgdG9cbiAqIGd1aWRlIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHRoZSBjdXJ2ZS4gQSBtaW5pbXVtIG9mIGZvdXJcbiAqIHBvaW50cyBpcyByZXF1aXJlZCB0byBkcmF3IGEgdGlueSBjdXJ2ZSBiZXR3ZWVuIHRoZSBzZWNvbmQgYW5kXG4gKiB0aGlyZCBwb2ludHMuIEFkZGluZyBhIGZpZnRoIHBvaW50IHdpdGggY3VydmVWZXJ0ZXgoKSB3aWxsIGRyYXdcbiAqIHRoZSBjdXJ2ZSBiZXR3ZWVuIHRoZSBzZWNvbmQsIHRoaXJkLCBhbmQgZm91cnRoIHBvaW50cy4gVGhlXG4gKiBjdXJ2ZVZlcnRleCgpIGZ1bmN0aW9uIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIENhdG11bGwtUm9tXG4gKiBzcGxpbmVzLlxuICpcbiAqIEBtZXRob2QgY3VydmVWZXJ0ZXhcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IHgtY29vcmRpbmF0ZSBvZiB0aGUgdmVydGV4XG4gKiBAcGFyYW0ge051bWJlcn0geSB5LWNvb3JkaW5hdGUgb2YgdGhlIHZlcnRleFxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHN0cm9rZVdlaWdodCg1KTtcbiAqIHBvaW50KDg0LCA5MSk7XG4gKiBwb2ludCg2OCwgMTkpO1xuICogcG9pbnQoMjEsIDE3KTtcbiAqIHBvaW50KDMyLCA5MSk7XG4gKiBzdHJva2VXZWlnaHQoMSk7XG4gKlxuICogbm9GaWxsKCk7XG4gKiBiZWdpblNoYXBlKCk7XG4gKiBjdXJ2ZVZlcnRleCg4NCwgOTEpO1xuICogY3VydmVWZXJ0ZXgoODQsIDkxKTtcbiAqIGN1cnZlVmVydGV4KDY4LCAxOSk7XG4gKiBjdXJ2ZVZlcnRleCgyMSwgMTcpO1xuICogY3VydmVWZXJ0ZXgoMzIsIDkxKTtcbiAqIGN1cnZlVmVydGV4KDMyLCA5MSk7XG4gKiBlbmRTaGFwZSgpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICpcbiAqIEBhbHRcbiAqIFVwc2lkZS1kb3duIHUtc2hhcGUgbGluZSwgbWlkIGNhbnZhcy4gbGVmdCBwb2ludCBleHRlbmRzIGJleW9uZCBjYW52YXMgdmlldy5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5jdXJ2ZVZlcnRleCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnY3VydmVWZXJ0ZXgnLCBhcmd1bWVudHMpO1xuICBpc0N1cnZlID0gdHJ1ZTtcbiAgdGhpcy52ZXJ0ZXgoeCwgeSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBVc2UgdGhlIGJlZ2luQ29udG91cigpIGFuZCBlbmRDb250b3VyKCkgZnVuY3Rpb25zIHRvIGNyZWF0ZSBuZWdhdGl2ZVxuICogc2hhcGVzIHdpdGhpbiBzaGFwZXMgc3VjaCBhcyB0aGUgY2VudGVyIG9mIHRoZSBsZXR0ZXIgJ08nLiBiZWdpbkNvbnRvdXIoKVxuICogYmVnaW5zIHJlY29yZGluZyB2ZXJ0aWNlcyBmb3IgdGhlIHNoYXBlIGFuZCBlbmRDb250b3VyKCkgc3RvcHMgcmVjb3JkaW5nLlxuICogVGhlIHZlcnRpY2VzIHRoYXQgZGVmaW5lIGEgbmVnYXRpdmUgc2hhcGUgbXVzdCBcIndpbmRcIiBpbiB0aGUgb3Bwb3NpdGVcbiAqIGRpcmVjdGlvbiBmcm9tIHRoZSBleHRlcmlvciBzaGFwZS4gRmlyc3QgZHJhdyB2ZXJ0aWNlcyBmb3IgdGhlIGV4dGVyaW9yXG4gKiBjbG9ja3dpc2Ugb3JkZXIsIHRoZW4gZm9yIGludGVybmFsIHNoYXBlcywgZHJhdyB2ZXJ0aWNlc1xuICogc2hhcGUgaW4gY291bnRlci1jbG9ja3dpc2UuXG4gKiA8YnI+PGJyPlxuICogVGhlc2UgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIGEgYmVnaW5TaGFwZSgpL2VuZFNoYXBlKCkgcGFpciBhbmRcbiAqIHRyYW5zZm9ybWF0aW9ucyBzdWNoIGFzIHRyYW5zbGF0ZSgpLCByb3RhdGUoKSwgYW5kIHNjYWxlKCkgZG8gbm90IHdvcmtcbiAqIHdpdGhpbiBhIGJlZ2luQ29udG91cigpL2VuZENvbnRvdXIoKSBwYWlyLiBJdCBpcyBhbHNvIG5vdCBwb3NzaWJsZSB0byB1c2VcbiAqIG90aGVyIHNoYXBlcywgc3VjaCBhcyBlbGxpcHNlKCkgb3IgcmVjdCgpIHdpdGhpbi5cbiAqXG4gKiBAbWV0aG9kIGVuZENvbnRvdXJcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB0cmFuc2xhdGUoNTAsIDUwKTtcbiAqIHN0cm9rZSgyNTUsIDAsIDApO1xuICogYmVnaW5TaGFwZSgpO1xuICogLy8gRXh0ZXJpb3IgcGFydCBvZiBzaGFwZSwgY2xvY2t3aXNlIHdpbmRpbmdcbiAqIHZlcnRleCgtNDAsIC00MCk7XG4gKiB2ZXJ0ZXgoNDAsIC00MCk7XG4gKiB2ZXJ0ZXgoNDAsIDQwKTtcbiAqIHZlcnRleCgtNDAsIDQwKTtcbiAqIC8vIEludGVyaW9yIHBhcnQgb2Ygc2hhcGUsIGNvdW50ZXItY2xvY2t3aXNlIHdpbmRpbmdcbiAqIGJlZ2luQ29udG91cigpO1xuICogdmVydGV4KC0yMCwgLTIwKTtcbiAqIHZlcnRleCgtMjAsIDIwKTtcbiAqIHZlcnRleCgyMCwgMjApO1xuICogdmVydGV4KDIwLCAtMjApO1xuICogZW5kQ29udG91cigpO1xuICogZW5kU2hhcGUoQ0xPU0UpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogd2hpdGUgcmVjdCBhbmQgc21hbGxlciBncmV5IHJlY3Qgd2l0aCByZWQgb3V0bGluZXMgaW4gY2VudGVyIG9mIGNhbnZhcy5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5lbmRDb250b3VyID0gZnVuY3Rpb24oKSB7XG4gIHZhciB2ZXJ0ID0gY29udG91clZlcnRpY2VzWzBdLnNsaWNlKCk7IC8vIGNvcHkgYWxsIGRhdGFcbiAgdmVydC5pc1ZlcnQgPSBjb250b3VyVmVydGljZXNbMF0uaXNWZXJ0O1xuICB2ZXJ0Lm1vdmVUbyA9IGZhbHNlO1xuICBjb250b3VyVmVydGljZXMucHVzaCh2ZXJ0KTtcblxuICAvLyBwcmV2ZW50IHN0cmF5IGxpbmVzIHdpdGggbXVsdGlwbGUgY29udG91cnNcbiAgaWYgKGlzRmlyc3RDb250b3VyKSB7XG4gICAgdmVydGljZXMucHVzaCh2ZXJ0aWNlc1swXSk7XG4gICAgaXNGaXJzdENvbnRvdXIgPSBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29udG91clZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmVydGljZXMucHVzaChjb250b3VyVmVydGljZXNbaV0pO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUaGUgZW5kU2hhcGUoKSBmdW5jdGlvbiBpcyB0aGUgY29tcGFuaW9uIHRvIGJlZ2luU2hhcGUoKSBhbmQgbWF5IG9ubHkgYmVcbiAqIGNhbGxlZCBhZnRlciBiZWdpblNoYXBlKCkuIFdoZW4gZW5kc2hhcGUoKSBpcyBjYWxsZWQsIGFsbCBvZiBpbWFnZSBkYXRhXG4gKiBkZWZpbmVkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsIHRvIGJlZ2luU2hhcGUoKSBpcyB3cml0dGVuIGludG8gdGhlIGltYWdlXG4gKiBidWZmZXIuIFRoZSBjb25zdGFudCBDTE9TRSBhcyB0aGUgdmFsdWUgZm9yIHRoZSBNT0RFIHBhcmFtZXRlciB0byBjbG9zZVxuICogdGhlIHNoYXBlICh0byBjb25uZWN0IHRoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQpLlxuICpcbiAqIEBtZXRob2QgZW5kU2hhcGVcbiAqIEBwYXJhbSAge0NvbnN0YW50fSBbbW9kZV0gdXNlIENMT1NFIHRvIGNsb3NlIHRoZSBzaGFwZVxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIG5vRmlsbCgpO1xuICpcbiAqIGJlZ2luU2hhcGUoKTtcbiAqIHZlcnRleCgyMCwgMjApO1xuICogdmVydGV4KDQ1LCAyMCk7XG4gKiB2ZXJ0ZXgoNDUsIDgwKTtcbiAqIGVuZFNoYXBlKENMT1NFKTtcbiAqXG4gKiBiZWdpblNoYXBlKCk7XG4gKiB2ZXJ0ZXgoNTAsIDIwKTtcbiAqIHZlcnRleCg3NSwgMjApO1xuICogdmVydGV4KDc1LCA4MCk7XG4gKiBlbmRTaGFwZSgpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogVHJpYW5nbGUgbGluZSBzaGFwZSB3aXRoIHNtYWxsZXN0IGludGVyaW9yIGFuZ2xlIG9uIGJvdHRvbSBhbmQgdXBzaWRlLWRvd24gTC5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5lbmRTaGFwZSA9IGZ1bmN0aW9uKG1vZGUpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnZW5kU2hhcGUnLCBhcmd1bWVudHMpO1xuICBpZiAodGhpcy5fcmVuZGVyZXIuaXNQM0QpIHtcbiAgICB0aGlzLl9yZW5kZXJlci5lbmRTaGFwZShcbiAgICAgIG1vZGUsXG4gICAgICBpc0N1cnZlLFxuICAgICAgaXNCZXppZXIsXG4gICAgICBpc1F1YWRyYXRpYyxcbiAgICAgIGlzQ29udG91cixcbiAgICAgIHNoYXBlS2luZFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZlcnRpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICghdGhpcy5fcmVuZGVyZXIuX2RvU3Ryb2tlICYmICF0aGlzLl9yZW5kZXJlci5fZG9GaWxsKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2xvc2VTaGFwZSA9IG1vZGUgPT09IGNvbnN0YW50cy5DTE9TRTtcblxuICAgIC8vIGlmIHRoZSBzaGFwZSBpcyBjbG9zZWQsIHRoZSBmaXJzdCBlbGVtZW50IGlzIGFsc28gdGhlIGxhc3QgZWxlbWVudFxuICAgIGlmIChjbG9zZVNoYXBlICYmICFpc0NvbnRvdXIpIHtcbiAgICAgIHZlcnRpY2VzLnB1c2godmVydGljZXNbMF0pO1xuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlcmVyLmVuZFNoYXBlKFxuICAgICAgbW9kZSxcbiAgICAgIHZlcnRpY2VzLFxuICAgICAgaXNDdXJ2ZSxcbiAgICAgIGlzQmV6aWVyLFxuICAgICAgaXNRdWFkcmF0aWMsXG4gICAgICBpc0NvbnRvdXIsXG4gICAgICBzaGFwZUtpbmRcbiAgICApO1xuXG4gICAgLy8gUmVzZXQgc29tZSBzZXR0aW5nc1xuICAgIGlzQ3VydmUgPSBmYWxzZTtcbiAgICBpc0JlemllciA9IGZhbHNlO1xuICAgIGlzUXVhZHJhdGljID0gZmFsc2U7XG4gICAgaXNDb250b3VyID0gZmFsc2U7XG4gICAgaXNGaXJzdENvbnRvdXIgPSB0cnVlO1xuXG4gICAgLy8gSWYgdGhlIHNoYXBlIGlzIGNsb3NlZCwgdGhlIGZpcnN0IGVsZW1lbnQgd2FzIGFkZGVkIGFzIGxhc3QgZWxlbWVudC5cbiAgICAvLyBXZSBtdXN0IHJlbW92ZSBpdCBhZ2FpbiB0byBwcmV2ZW50IHRoZSBsaXN0IG9mIHZlcnRpY2VzIGZyb20gZ3Jvd2luZ1xuICAgIC8vIG92ZXIgc3VjY2Vzc2l2ZSBjYWxscyB0byBlbmRTaGFwZShDTE9TRSlcbiAgICBpZiAoY2xvc2VTaGFwZSkge1xuICAgICAgdmVydGljZXMucG9wKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTcGVjaWZpZXMgdmVydGV4IGNvb3JkaW5hdGVzIGZvciBxdWFkcmF0aWMgQmV6aWVyIGN1cnZlcy4gRWFjaCBjYWxsIHRvXG4gKiBxdWFkcmF0aWNWZXJ0ZXgoKSBkZWZpbmVzIHRoZSBwb3NpdGlvbiBvZiBvbmUgY29udHJvbCBwb2ludHMgYW5kIG9uZVxuICogYW5jaG9yIHBvaW50IG9mIGEgQmV6aWVyIGN1cnZlLCBhZGRpbmcgYSBuZXcgc2VnbWVudCB0byBhIGxpbmUgb3Igc2hhcGUuXG4gKiBUaGUgZmlyc3QgdGltZSBxdWFkcmF0aWNWZXJ0ZXgoKSBpcyB1c2VkIHdpdGhpbiBhIGJlZ2luU2hhcGUoKSBjYWxsLCBpdFxuICogbXVzdCBiZSBwcmVmYWNlZCB3aXRoIGEgY2FsbCB0byB2ZXJ0ZXgoKSB0byBzZXQgdGhlIGZpcnN0IGFuY2hvciBwb2ludC5cbiAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIGJldHdlZW4gYmVnaW5TaGFwZSgpIGFuZCBlbmRTaGFwZSgpIGFuZCBvbmx5XG4gKiB3aGVuIHRoZXJlIGlzIG5vIE1PREUgcGFyYW1ldGVyIHNwZWNpZmllZCB0byBiZWdpblNoYXBlKCkuXG4gKlxuICogQG1ldGhvZCBxdWFkcmF0aWNWZXJ0ZXhcbiAqIEBwYXJhbSAge051bWJlcn0gY3ggeC1jb29yZGluYXRlIGZvciB0aGUgY29udHJvbCBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSBjeSB5LWNvb3JkaW5hdGUgZm9yIHRoZSBjb250cm9sIHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHgzIHgtY29vcmRpbmF0ZSBmb3IgdGhlIGFuY2hvciBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB5MyB5LWNvb3JkaW5hdGUgZm9yIHRoZSBhbmNob3IgcG9pbnRcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBzdHJva2VXZWlnaHQoNSk7XG4gKiBwb2ludCgyMCwgMjApO1xuICogcG9pbnQoODAsIDIwKTtcbiAqIHBvaW50KDUwLCA1MCk7XG4gKlxuICogbm9GaWxsKCk7XG4gKiBzdHJva2VXZWlnaHQoMSk7XG4gKiBiZWdpblNoYXBlKCk7XG4gKiB2ZXJ0ZXgoMjAsIDIwKTtcbiAqIHF1YWRyYXRpY1ZlcnRleCg4MCwgMjAsIDUwLCA1MCk7XG4gKiBlbmRTaGFwZSgpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogc3Ryb2tlV2VpZ2h0KDUpO1xuICogcG9pbnQoMjAsIDIwKTtcbiAqIHBvaW50KDgwLCAyMCk7XG4gKiBwb2ludCg1MCwgNTApO1xuICpcbiAqIHBvaW50KDIwLCA4MCk7XG4gKiBwb2ludCg4MCwgODApO1xuICogcG9pbnQoODAsIDYwKTtcbiAqXG4gKiBub0ZpbGwoKTtcbiAqIHN0cm9rZVdlaWdodCgxKTtcbiAqIGJlZ2luU2hhcGUoKTtcbiAqIHZlcnRleCgyMCwgMjApO1xuICogcXVhZHJhdGljVmVydGV4KDgwLCAyMCwgNTAsIDUwKTtcbiAqIHF1YWRyYXRpY1ZlcnRleCgyMCwgODAsIDgwLCA4MCk7XG4gKiB2ZXJ0ZXgoODAsIDYwKTtcbiAqIGVuZFNoYXBlKCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBhcmNoZWQtc2hhcGVkIGJsYWNrIGxpbmUgd2l0aCA0IHBpeGVsIHRoaWNrIHN0cm9rZSB3ZWlnaHQuXG4gKiBiYWNrd2FyZHMgcy1zaGFwZWQgYmxhY2sgbGluZSB3aXRoIDQgcGl4ZWwgdGhpY2sgc3Ryb2tlIHdlaWdodC5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5xdWFkcmF0aWNWZXJ0ZXggPSBmdW5jdGlvbihjeCwgY3ksIHgzLCB5Mykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdxdWFkcmF0aWNWZXJ0ZXgnLCBhcmd1bWVudHMpO1xuICAvL2lmIHdlJ3JlIGRyYXdpbmcgYSBjb250b3VyLCBwdXQgdGhlIHBvaW50cyBpbnRvIGFuXG4gIC8vIGFycmF5IGZvciBpbnNpZGUgZHJhd2luZ1xuICBpZiAodGhpcy5fY29udG91ckluaXRlZCkge1xuICAgIHZhciBwdCA9IHt9O1xuICAgIHB0LnggPSBjeDtcbiAgICBwdC55ID0gY3k7XG4gICAgcHQueDMgPSB4MztcbiAgICBwdC55MyA9IHkzO1xuICAgIHB0LnR5cGUgPSBjb25zdGFudHMuUVVBRFJBVElDO1xuICAgIHRoaXMuX2NvbnRvdXJWZXJ0aWNlcy5wdXNoKHB0KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGlmICh2ZXJ0aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgaXNRdWFkcmF0aWMgPSB0cnVlO1xuICAgIHZhciB2ZXJ0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZlcnRbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHZlcnQuaXNWZXJ0ID0gZmFsc2U7XG4gICAgaWYgKGlzQ29udG91cikge1xuICAgICAgY29udG91clZlcnRpY2VzLnB1c2godmVydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZlcnRpY2VzLnB1c2godmVydCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93ICd2ZXJ0ZXgoKSBtdXN0IGJlIHVzZWQgb25jZSBiZWZvcmUgY2FsbGluZyBxdWFkcmF0aWNWZXJ0ZXgoKSc7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFsbCBzaGFwZXMgYXJlIGNvbnN0cnVjdGVkIGJ5IGNvbm5lY3RpbmcgYSBzZXJpZXMgb2YgdmVydGljZXMuIHZlcnRleCgpXG4gKiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHZlcnRleCBjb29yZGluYXRlcyBmb3IgcG9pbnRzLCBsaW5lcywgdHJpYW5nbGVzLFxuICogcXVhZHMsIGFuZCBwb2x5Z29ucy4gSXQgaXMgdXNlZCBleGNsdXNpdmVseSB3aXRoaW4gdGhlIGJlZ2luU2hhcGUoKSBhbmRcbiAqIGVuZFNoYXBlKCkgZnVuY3Rpb25zLlxuICpcbiAqIEBtZXRob2QgdmVydGV4XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggeC1jb29yZGluYXRlIG9mIHRoZSB2ZXJ0ZXhcbiAqIEBwYXJhbSAge051bWJlcn0geSB5LWNvb3JkaW5hdGUgb2YgdGhlIHZlcnRleFxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHN0cm9rZVdlaWdodCgzKTtcbiAqIGJlZ2luU2hhcGUoUE9JTlRTKTtcbiAqIHZlcnRleCgzMCwgMjApO1xuICogdmVydGV4KDg1LCAyMCk7XG4gKiB2ZXJ0ZXgoODUsIDc1KTtcbiAqIHZlcnRleCgzMCwgNzUpO1xuICogZW5kU2hhcGUoKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDQgYmxhY2sgcG9pbnRzIGluIGEgc3F1YXJlIHNoYXBlIGluIG1pZGRsZS1yaWdodCBvZiBjYW52YXMuXG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiBiYWNrZ3JvdW5kKDI0MCwgMjQwLCAyNDApO1xuICogZmlsbCgyMzcsIDM0LCA5Myk7XG4gKiBub1N0cm9rZSgpO1xuICogYmVnaW5TaGFwZSgpO1xuICogdmVydGV4KDAsIDM1KTtcbiAqIHZlcnRleCgzNSwgMCk7XG4gKiB2ZXJ0ZXgoMCwgLTM1KTtcbiAqIHZlcnRleCgtMzUsIDApO1xuICogZW5kU2hhcGUoKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDQgcG9pbnRzIG1ha2luZyBhIGRpYW1vbmQgc2hhcGVcbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIGJhY2tncm91bmQoMjQwLCAyNDAsIDI0MCk7XG4gKiBmaWxsKDIzNywgMzQsIDkzKTtcbiAqIG5vU3Ryb2tlKCk7XG4gKiBiZWdpblNoYXBlKCk7XG4gKiB2ZXJ0ZXgoLTEwLCAxMCk7XG4gKiB2ZXJ0ZXgoMCwgMzUpO1xuICogdmVydGV4KDEwLCAxMCk7XG4gKiB2ZXJ0ZXgoMzUsIDApO1xuICogdmVydGV4KDEwLCAtOCk7XG4gKiB2ZXJ0ZXgoMCwgLTM1KTtcbiAqIHZlcnRleCgtMTAsIC04KTtcbiAqIHZlcnRleCgtMzUsIDApO1xuICogZW5kU2hhcGUoKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDggcG9pbnRzIG1ha2luZyBhIHN0YXJcbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBzdHJva2VXZWlnaHQoMyk7XG4gKiBzdHJva2UoMjM3LCAzNCwgOTMpO1xuICogYmVnaW5TaGFwZShMSU5FUyk7XG4gKiB2ZXJ0ZXgoMTAsIDM1KTtcbiAqIHZlcnRleCg5MCwgMzUpO1xuICogdmVydGV4KDEwLCA2NSk7XG4gKiB2ZXJ0ZXgoOTAsIDY1KTtcbiAqIHZlcnRleCgzNSwgMTApO1xuICogdmVydGV4KDM1LCA5MCk7XG4gKiB2ZXJ0ZXgoNjUsIDEwKTtcbiAqIHZlcnRleCg2NSwgOTApO1xuICogZW5kU2hhcGUoKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDggcG9pbnRzIG1ha2luZyA0IGxpbmVzXG4gKlxuICovXG4vKipcbiAqIEBtZXRob2QgdmVydGV4XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSAge051bWJlcn0geVxuICogQHBhcmFtICB7TnVtYmVyfSBbel0gei1jb29yZGluYXRlIG9mIHRoZSB2ZXJ0ZXhcbiAqIEBwYXJhbSAge051bWJlcn0gW3VdIHRoZSB2ZXJ0ZXgncyB0ZXh0dXJlIHUtY29vcmRpbmF0ZVxuICogQHBhcmFtICB7TnVtYmVyfSBbdl0gdGhlIHZlcnRleCdzIHRleHR1cmUgdi1jb29yZGluYXRlXG4gKi9cbnA1LnByb3RvdHlwZS52ZXJ0ZXggPSBmdW5jdGlvbih4LCB5LCBtb3ZlVG8sIHUsIHYpIHtcbiAgaWYgKHRoaXMuX3JlbmRlcmVyLmlzUDNEKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIudmVydGV4LmFwcGx5KHRoaXMuX3JlbmRlcmVyLCBhcmd1bWVudHMpO1xuICB9IGVsc2Uge1xuICAgIHZhciB2ZXJ0ID0gW107XG4gICAgdmVydC5pc1ZlcnQgPSB0cnVlO1xuICAgIHZlcnRbMF0gPSB4O1xuICAgIHZlcnRbMV0gPSB5O1xuICAgIHZlcnRbMl0gPSAwO1xuICAgIHZlcnRbM10gPSAwO1xuICAgIHZlcnRbNF0gPSAwO1xuICAgIHZlcnRbNV0gPSB0aGlzLl9yZW5kZXJlci5fZ2V0RmlsbCgpO1xuICAgIHZlcnRbNl0gPSB0aGlzLl9yZW5kZXJlci5fZ2V0U3Ryb2tlKCk7XG5cbiAgICBpZiAobW92ZVRvKSB7XG4gICAgICB2ZXJ0Lm1vdmVUbyA9IG1vdmVUbztcbiAgICB9XG4gICAgaWYgKGlzQ29udG91cikge1xuICAgICAgaWYgKGNvbnRvdXJWZXJ0aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmVydC5tb3ZlVG8gPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29udG91clZlcnRpY2VzLnB1c2godmVydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZlcnRpY2VzLnB1c2godmVydCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNTtcblxufSx7XCIuL2NvbnN0YW50c1wiOjIxLFwiLi9jb3JlXCI6MjJ9XSwzNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgRGF0YVxuICogQHN1Ym1vZHVsZSBEaWN0aW9uYXJ5XG4gKiBAZm9yIHA1LlR5cGVkRGljdFxuICogQHJlcXVpcmVzIGNvcmVcbiAqXG4gKiBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBwNSBtZXRob2RzIGZvciB0aGUgcDUgRGljdGlvbmFyeSBjbGFzc2VzXG4gKiB0aGVzZSBjbGFzc2VzIFN0cmluZ0RpY3QgYW5kIE51bWJlckRpY3QgYXJlIGZvciBzdG9yaW5nIGFuZCB3b3JraW5nXG4gKiB3aXRoIGtleSwgdmFsdWUgcGFpcnNcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xuXG4vKipcbiAqXG4gKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHA1LlN0cmluZ0RpY3QgdXNpbmcgdGhlIGtleSwgdmFsdWUgcGFpclxuICogb3Igb2JqZWN0IHlvdSBwcm92aWRlLlxuICpcbiAqIEBtZXRob2QgY3JlYXRlU3RyaW5nRGljdFxuICogQGZvciBwNVxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtwNS5TdHJpbmdEaWN0fVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBteURpY3Rpb25hcnkgPSBjcmVhdGVTdHJpbmdEaWN0KCdwNScsICdqcycpO1xuICogICBwcmludChteURpY3Rpb25hcnkuaGFzS2V5KCdwNScpKTsgLy8gbG9ncyB0cnVlIHRvIGNvbnNvbGVcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGNyZWF0ZVN0cmluZ0RpY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb2JqZWN0XG4gKiBAcmV0dXJuIHtwNS5TdHJpbmdEaWN0fVxuICovXG5cbnA1LnByb3RvdHlwZS5jcmVhdGVTdHJpbmdEaWN0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjcmVhdGVTdHJpbmdEaWN0JywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIG5ldyBwNS5TdHJpbmdEaWN0KGtleSwgdmFsdWUpO1xufTtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBwNS5OdW1iZXJEaWN0IHVzaW5nIHRoZSBrZXksIHZhbHVlIHBhaXJcbiAqIG9yIG9iamVjdCB5b3UgcHJvdmlkZS5cbiAqXG4gKiBAbWV0aG9kIGNyZWF0ZU51bWJlckRpY3RcbiAqIEBmb3IgcDVcbiAqIEBwYXJhbSB7TnVtYmVyfSBrZXlcbiAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7cDUuTnVtYmVyRGljdH1cbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgbXlEaWN0aW9uYXJ5ID0gY3JlYXRlTnVtYmVyRGljdCgxMDAsIDQyKTtcbiAqICAgcHJpbnQobXlEaWN0aW9uYXJ5Lmhhc0tleSgxMDApKTsgLy8gbG9ncyB0cnVlIHRvIGNvbnNvbGVcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGNyZWF0ZU51bWJlckRpY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb2JqZWN0XG4gKiBAcmV0dXJuIHtwNS5OdW1iZXJEaWN0fVxuICovXG5cbnA1LnByb3RvdHlwZS5jcmVhdGVOdW1iZXJEaWN0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjcmVhdGVOdW1iZXJEaWN0JywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIG5ldyBwNS5OdW1iZXJEaWN0KGtleSwgdmFsdWUpO1xufTtcblxuLyoqXG4gKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIHA1LkRpY3Rpb25hcnkgdHlwZXMuIE1vcmUgc3BlY2lmaWNhbGx5XG4gKiB0eXBlZCBEaWN0aW9uYXJ5IG9iamVjdHMgaW5oZXJpdCBmcm9tIHRoaXNcbiAqXG4gKiBAY2xhc3MgcDUuVHlwZWREaWN0XG4gKlxuICovXG5cbnA1LlR5cGVkRGljdCA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIHRoaXMuZGF0YSA9IGtleTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICB0aGlzLmRhdGFba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIHBhaXJzIGN1cnJlbnRseSBpbiBEaWN0aW9uYXJ5IG9iamVjdFxuICpcbiAqIEBtZXRob2Qgc2l6ZVxuICogQHJldHVybiB7SW50ZWdlcn0gdGhlIG51bWJlciBvZiBrZXktdmFsdWUgcGFpcnMgaW4gRGljdGlvbmFyeSBvYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgbXlEaWN0aW9uYXJ5ID0gY3JlYXRlTnVtYmVyRGljdCgxLCAxMCk7XG4gKiAgIG15RGljdGlvbmFyeS5jcmVhdGUoMiwgMjApO1xuICogICBteURpY3Rpb25hcnkuY3JlYXRlKDMsIDMwKTtcbiAqICAgcHJpbnQobXlEaWN0aW9uYXJ5LnNpemUoKSk7IC8vIHZhbHVlIG9mIGFtdCBpcyAzXG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICovXG5wNS5UeXBlZERpY3QucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYga2V5IGV4aXN0cyBpbiBEaWN0aW9uYXJ5XG4gKiBvdGhlcndpc2UgcmV0dXJucyBmYWxzZVxuICpcbiAqIEBtZXRob2QgaGFzS2V5XG4gKiBAcGFyYW0ge051bWJlcnxTdHJpbmd9IGtleSB0aGF0IHlvdSB3YW50IHRvIGFjY2Vzc1xuICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB0aGF0IGtleSBleGlzdHMgaW4gRGljdGlvbmFyeVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBteURpY3Rpb25hcnkgPSBjcmVhdGVTdHJpbmdEaWN0KCdwNScsICdqcycpO1xuICogICBwcmludChteURpY3Rpb25hcnkuaGFzS2V5KCdwNScpKTsgLy8gbG9ncyB0cnVlIHRvIGNvbnNvbGVcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKi9cblxucDUuVHlwZWREaWN0LnByb3RvdHlwZS5oYXNLZXkgPSBmdW5jdGlvbihrZXkpIHtcbiAgcmV0dXJuIHRoaXMuZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHZhbHVlIHN0b3JlZCBhdCBzdXBwbGllZCBrZXkuXG4gKlxuICogQG1ldGhvZCBnZXRcbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30ga2V5IHRoYXQgeW91IHdhbnQgdG8gYWNjZXNzXG4gKiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSB0aGUgdmFsdWUgc3RvcmVkIGF0IHRoYXQga2V5XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZVN0cmluZ0RpY3QoJ3A1JywgJ2pzJyk7XG4gKiAgIHZhciBteVZhbHVlID0gbXlEaWN0aW9uYXJ5LmdldCgncDUnKTtcbiAqICAgcHJpbnQobXlWYWx1ZSA9PT0gJ2pzJyk7IC8vIGxvZ3MgdHJ1ZSB0byBjb25zb2xlXG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICovXG5cbnA1LlR5cGVkRGljdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5KSB7XG4gIGlmICh0aGlzLmRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgIHJldHVybiB0aGlzLmRhdGFba2V5XTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhrZXkgKyAnIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgRGljdGlvbmFyeScpO1xuICB9XG59O1xuXG4vKipcbiAqIENoYW5nZXMgdGhlIHZhbHVlIG9mIGtleSBpZiBpbiBpdCBhbHJlYWR5IGV4aXN0cyBpblxuICogaW4gdGhlIERpY3Rpb25hcnkgb3RoZXJ3aXNlIG1ha2VzIGEgbmV3IGtleS12YWx1ZSBwYWlyXG4gKlxuICogQG1ldGhvZCBzZXRcbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30ga2V5XG4gKiBAcGFyYW0ge051bWJlcnxTdHJpbmd9IHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZVN0cmluZ0RpY3QoJ3A1JywgJ2pzJyk7XG4gKiAgIG15RGljdGlvbmFyeS5zZXQoJ3A1JywgJ0pTJyk7XG4gKiAgIG15RGljdGlvbmFyeS5wcmludCgpO1xuICogICAvLyBhYm92ZSBsb2dzIFwia2V5OiBwNSAtIHZhbHVlOiBKU1wiIHRvIGNvbnNvbGVcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKi9cblxucDUuVHlwZWREaWN0LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gIGlmICh0aGlzLl92YWxpZGF0ZSh2YWx1ZSkpIHtcbiAgICB0aGlzLmRhdGFba2V5XSA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdUaG9zZSB2YWx1ZXMgZG9udCB3b3JrIGZvciB0aGlzIGRpY3Rpb25hcnkgdHlwZS4nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBwcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHVzZXIgcGFzc2luZyBvYmplY3RzIGluXG4gKiBkdXJpbmcgY29uc3RydWN0aW9uIG9yIGNhbGxzIHRvIGNyZWF0ZSgpXG4gKi9cblxucDUuVHlwZWREaWN0LnByb3RvdHlwZS5fYWRkT2JqID0gZnVuY3Rpb24ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICB0aGlzLnNldChrZXksIG9ialtrZXldKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEga2V5LXZhbHVlIHBhaXIgaW4gdGhlIERpY3Rpb25hcnlcbiAqXG4gKiBAbWV0aG9kIGNyZWF0ZVxuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30gdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgbXlEaWN0aW9uYXJ5ID0gY3JlYXRlU3RyaW5nRGljdCgncDUnLCAnanMnKTtcbiAqICAgbXlEaWN0aW9uYXJ5LmNyZWF0ZSgnaGFwcHknLCAnY29kaW5nJyk7XG4gKiAgIG15RGljdGlvbmFyeS5wcmludCgpO1xuICogICAvLyBhYm92ZSBsb2dzIFwia2V5OiBwNSAtIHZhbHVlOiBqcywga2V5OiBoYXBweSAtIHZhbHVlOiBjb2RpbmdcIiB0byBjb25zb2xlXG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKi9cbi8qKlxuICogQG1ldGhvZCBjcmVhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoga2V5L3ZhbHVlIHBhaXJcbiAqL1xuXG5wNS5UeXBlZERpY3QucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbnN0YW5jZW9mIE9iamVjdCAmJiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy5fYWRkT2JqKGtleSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdJbiBvcmRlciB0byBjcmVhdGUgYSBuZXcgRGljdGlvbmFyeSBlbnRyeSB5b3UgbXVzdCBwYXNzICcgK1xuICAgICAgICAnYW4gb2JqZWN0IG9yIGEga2V5LCB2YWx1ZSBwYWlyJ1xuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogRW1wdGllcyBEaWN0aW9uYXJ5IG9mIGFsbCBrZXktdmFsdWUgcGFpcnNcbiAqIEBtZXRob2QgY2xlYXJcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBteURpY3Rpb25hcnkgPSBjcmVhdGVTdHJpbmdEaWN0KCdwNScsICdqcycpO1xuICogICBwcmludChteURpY3Rpb25hcnkuaGFzS2V5KCdwNScpKTsgLy8gcHJpbnRzICd0cnVlJ1xuICogICBteURpY3Rpb25hcnkuY2xlYXIoKTtcbiAqICAgcHJpbnQobXlEaWN0aW9uYXJ5Lmhhc0tleSgncDUnKSk7IC8vIHByaW50cyAnZmFsc2UnXG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xuXG5wNS5UeXBlZERpY3QucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGF0YSA9IHt9O1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgaW4gdGhlIERpY3Rpb25hcnlcbiAqXG4gKiBAbWV0aG9kIHJlbW92ZVxuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBrZXkgZm9yIHRoZSBwYWlyIHRvIHJlbW92ZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBteURpY3Rpb25hcnkgPSBjcmVhdGVTdHJpbmdEaWN0KCdwNScsICdqcycpO1xuICogICBteURpY3Rpb25hcnkuY3JlYXRlKCdoYXBweScsICdjb2RpbmcnKTtcbiAqICAgbXlEaWN0aW9uYXJ5LnByaW50KCk7XG4gKiAgIC8vIGFib3ZlIGxvZ3MgXCJrZXk6IHA1IC0gdmFsdWU6IGpzLCBrZXk6IGhhcHB5IC0gdmFsdWU6IGNvZGluZ1wiIHRvIGNvbnNvbGVcbiAqICAgbXlEaWN0aW9uYXJ5LnJlbW92ZSgncDUnKTtcbiAqICAgbXlEaWN0aW9uYXJ5LnByaW50KCk7XG4gKiAgIC8vIGFib3ZlIGxvZ3MgXCJrZXk6IGhhcHB5IHZhbHVlOiBjb2RpbmdcIiB0byBjb25zb2xlXG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICovXG5cbnA1LlR5cGVkRGljdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oa2V5KSB7XG4gIGlmICh0aGlzLmRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFba2V5XTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBrZXkgKyAnIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgRGljdGlvbmFyeSc7XG4gIH1cbn07XG5cbi8qKlxuICogTG9ncyB0aGUgbGlzdCBvZiBpdGVtcyBjdXJyZW50bHkgaW4gdGhlIERpY3Rpb25hcnkgdG8gdGhlIGNvbnNvbGVcbiAqXG4gKiBAbWV0aG9kIHByaW50XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZVN0cmluZ0RpY3QoJ3A1JywgJ2pzJyk7XG4gKiAgIG15RGljdGlvbmFyeS5jcmVhdGUoJ2hhcHB5JywgJ2NvZGluZycpO1xuICogICBteURpY3Rpb25hcnkucHJpbnQoKTtcbiAqICAgLy8gYWJvdmUgbG9ncyBcImtleTogcDUgLSB2YWx1ZToganMsIGtleTogaGFwcHkgLSB2YWx1ZTogY29kaW5nXCIgdG8gY29uc29sZVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKi9cblxucDUuVHlwZWREaWN0LnByb3RvdHlwZS5wcmludCA9IGZ1bmN0aW9uKCkge1xuICBmb3IgKHZhciBpdGVtIGluIHRoaXMuZGF0YSkge1xuICAgIGNvbnNvbGUubG9nKCdrZXk6JyArIGl0ZW0gKyAnIHZhbHVlOicgKyB0aGlzLmRhdGFbaXRlbV0pO1xuICB9XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBEaWN0aW9uYXJ5IGludG8gYSBDU1YgZmlsZSBmb3IgbG9jYWxcbiAqIHN0b3JhZ2UuXG4gKlxuICogQG1ldGhvZCBzYXZlVGFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBjcmVhdGVCdXR0b24oJ3NhdmUnKVxuICogICAucG9zaXRpb24oMTAsIDEwKVxuICogICAubW91c2VQcmVzc2VkKGZ1bmN0aW9uKCkge1xuICogICAgIGNyZWF0ZVN0cmluZ0RpY3Qoe1xuICogICAgICAgam9objogMTk0MCxcbiAgICAgIHBhdWw6IDE5NDIsXG4gICAgICBnZW9yZ2U6IDE5NDMsXG4gICAgICByaW5nbzogMTk0MFxuICogICAgIH0pLnNhdmVUYWJsZSgnYmVhdGxlcycpO1xuICogICB9KTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5cbnA1LlR5cGVkRGljdC5wcm90b3R5cGUuc2F2ZVRhYmxlID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgdmFyIG91dHB1dCA9ICcnO1xuXG4gIGZvciAodmFyIGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICBvdXRwdXQgKz0ga2V5ICsgJywnICsgdGhpcy5kYXRhW2tleV0gKyAnXFxuJztcbiAgfVxuXG4gIHZhciBibG9iID0gbmV3IEJsb2IoW291dHB1dF0sIHsgdHlwZTogJ3RleHQvY3N2JyB9KTtcbiAgcDUucHJvdG90eXBlLmRvd25sb2FkRmlsZShibG9iLCBmaWxlbmFtZSB8fCAnbXljc3YnLCAnY3N2Jyk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBEaWN0aW9uYXJ5IGludG8gYSBKU09OIGZpbGUgZm9yIGxvY2FsXG4gKiBzdG9yYWdlLlxuICpcbiAqIEBtZXRob2Qgc2F2ZUpTT05cbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBjcmVhdGVCdXR0b24oJ3NhdmUnKVxuICogICAucG9zaXRpb24oMTAsIDEwKVxuICogICAubW91c2VQcmVzc2VkKGZ1bmN0aW9uKCkge1xuICogICAgIGNyZWF0ZVN0cmluZ0RpY3Qoe1xuICogICAgICAgam9objogMTk0MCxcbiAgICAgIHBhdWw6IDE5NDIsXG4gICAgICBnZW9yZ2U6IDE5NDMsXG4gICAgICByaW5nbzogMTk0MFxuICogICAgIH0pLnNhdmVKU09OKCdiZWF0bGVzJyk7XG4gKiAgIH0pO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKi9cblxucDUuVHlwZWREaWN0LnByb3RvdHlwZS5zYXZlSlNPTiA9IGZ1bmN0aW9uKGZpbGVuYW1lLCBvcHQpIHtcbiAgcDUucHJvdG90eXBlLnNhdmVKU09OKHRoaXMuZGF0YSwgZmlsZW5hbWUsIG9wdCk7XG59O1xuXG4vKipcbiAqIHByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSB1c2VyIHBhc3NlZCBpbiB2YWxpZFxuICogdmFsdWVzIGZvciB0aGUgRGljdGlvbmFyeSB0eXBlXG4gKi9cblxucDUuVHlwZWREaWN0LnByb3RvdHlwZS5fdmFsaWRhdGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICpcbiAqIEEgIERpY3Rpb25hcnkgY2xhc3MgZm9yIFN0cmluZ3MuXG4gKlxuICpcbiAqIEBjbGFzcyBwNS5TdHJpbmdEaWN0XG4gKiBAZXh0ZW5kcyBwNS5UeXBlZERpY3RcbiAqXG4gKi9cblxucDUuU3RyaW5nRGljdCA9IGZ1bmN0aW9uKCkge1xuICBwNS5UeXBlZERpY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbnA1LlN0cmluZ0RpY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwNS5UeXBlZERpY3QucHJvdG90eXBlKTtcblxucDUuU3RyaW5nRGljdC5wcm90b3R5cGUuX3ZhbGlkYXRlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59O1xuXG4vKipcbiAqXG4gKiBBIHNpbXBsZSBEaWN0aW9uYXJ5IGNsYXNzIGZvciBOdW1iZXJzLlxuICpcbiAqXG4gKiBAY2xhc3MgcDUuTnVtYmVyRGljdFxuICogQGV4dGVuZHMgcDUuVHlwZWREaWN0XG4gKlxuICovXG5cbnA1Lk51bWJlckRpY3QgPSBmdW5jdGlvbigpIHtcbiAgcDUuVHlwZWREaWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5wNS5OdW1iZXJEaWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocDUuVHlwZWREaWN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogcHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlIHVzZXIgcGFzc2VkIGluIHZhbGlkXG4gKiB2YWx1ZXMgZm9yIHRoZSBEaWN0aW9uYXJ5IHR5cGVcbiAqL1xuXG5wNS5OdW1iZXJEaWN0LnByb3RvdHlwZS5fdmFsaWRhdGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn07XG5cbi8qKlxuICogQWRkIHRvIGEgdmFsdWUgc3RvcmVkIGF0IGEgY2VydGFpbiBrZXlcbiAqIFRoZSBzdW0gaXMgc3RvcmVkIGluIHRoYXQgbG9jYXRpb24gaW4gdGhlIERpY3Rpb25hcnkuXG4gKlxuICogQG1ldGhvZCBhZGRcbiAqIEBwYXJhbSB7TnVtYmVyfSBLZXkgZm9yIHZhbHVlIHlvdSB3aXNoIHRvIGFkZCB0b1xuICogQHBhcmFtIHtOdW1iZXJ9IEFtb3VudCB0byBhZGQgdG8gdGhlIHZhbHVlXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoMiwgNSk7XG4gKiAgIG15RGljdGlvbmFyeS5hZGQoMiwgMik7XG4gKiAgIGNvbnNvbGUubG9nKG15RGljdGlvbmFyeS5nZXQoMikpOyAvLyBsb2dzIDcgdG8gY29uc29sZS5cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKlxuICovXG5cbnA1Lk51bWJlckRpY3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGtleSwgYW1vdW50KSB7XG4gIGlmICh0aGlzLmRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgIHRoaXMuZGF0YVtrZXldICs9IGFtb3VudDtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZygnVGhlIGtleSAtICcgKyBrZXkgKyAnIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgZGljdGlvbmFyeS4nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTdWJ0cmFjdCBmcm9tIGEgdmFsdWUgc3RvcmVkIGF0IGEgY2VydGFpbiBrZXlcbiAqIFRoZSBkaWZmZXJlbmNlIGlzIHN0b3JlZCBpbiB0aGF0IGxvY2F0aW9uIGluIHRoZSBEaWN0aW9uYXJ5LlxuICpcbiAqIEBtZXRob2Qgc3ViXG4gKiBAcGFyYW0ge051bWJlcn0gS2V5IGZvciB2YWx1ZSB5b3Ugd2lzaCB0byBzdWJ0cmFjdCBmcm9tXG4gKiBAcGFyYW0ge051bWJlcn0gQW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdGhlIHZhbHVlXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoMiwgNSk7XG4gKiAgIG15RGljdGlvbmFyeS5zdWIoMiwgMik7XG4gKiAgIGNvbnNvbGUubG9nKG15RGljdGlvbmFyeS5nZXQoMikpOyAvLyBsb2dzIDMgdG8gY29uc29sZS5cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKlxuICovXG5cbnA1Lk51bWJlckRpY3QucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uKGtleSwgYW1vdW50KSB7XG4gIHRoaXMuYWRkKGtleSwgLWFtb3VudCk7XG59O1xuXG4vKipcbiAqIE11bHRpcGx5IGEgdmFsdWUgc3RvcmVkIGF0IGEgY2VydGFpbiBrZXlcbiAqIFRoZSBwcm9kdWN0IGlzIHN0b3JlZCBpbiB0aGF0IGxvY2F0aW9uIGluIHRoZSBEaWN0aW9uYXJ5LlxuICpcbiAqIEBtZXRob2QgbXVsdFxuICogQHBhcmFtIHtOdW1iZXJ9IEtleSBmb3IgdmFsdWUgeW91IHdpc2ggdG8gbXVsdGlwbHlcbiAqIEBwYXJhbSB7TnVtYmVyfSBBbW91bnQgdG8gbXVsdGlwbHkgdGhlIHZhbHVlIGJ5XG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoMiwgNCk7XG4gKiAgIG15RGljdGlvbmFyeS5tdWx0KDIsIDIpO1xuICogICBjb25zb2xlLmxvZyhteURpY3Rpb25hcnkuZ2V0KDIpKTsgLy8gbG9ncyA4IHRvIGNvbnNvbGUuXG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICpcbiAqL1xuXG5wNS5OdW1iZXJEaWN0LnByb3RvdHlwZS5tdWx0ID0gZnVuY3Rpb24oa2V5LCBhbW91bnQpIHtcbiAgaWYgKHRoaXMuZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgdGhpcy5kYXRhW2tleV0gKj0gYW1vdW50O1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdUaGUga2V5IC0gJyArIGtleSArICcgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBkaWN0aW9uYXJ5LicpO1xuICB9XG59O1xuXG4vKipcbiAqIERpdmlkZSBhIHZhbHVlIHN0b3JlZCBhdCBhIGNlcnRhaW4ga2V5XG4gKiBUaGUgcXVvdGllbnQgaXMgc3RvcmVkIGluIHRoYXQgbG9jYXRpb24gaW4gdGhlIERpY3Rpb25hcnkuXG4gKlxuICogQG1ldGhvZCBkaXZcbiAqIEBwYXJhbSB7TnVtYmVyfSBLZXkgZm9yIHZhbHVlIHlvdSB3aXNoIHRvIGRpdmlkZVxuICogQHBhcmFtIHtOdW1iZXJ9IEFtb3VudCB0byBkaXZpZGUgdGhlIHZhbHVlIGJ5XG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoMiwgOCk7XG4gKiAgIG15RGljdGlvbmFyeS5kaXYoMiwgMik7XG4gKiAgIGNvbnNvbGUubG9nKG15RGljdGlvbmFyeS5nZXQoMikpOyAvLyBsb2dzIDQgdG8gY29uc29sZS5cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKlxuICovXG5cbnA1Lk51bWJlckRpY3QucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uKGtleSwgYW1vdW50KSB7XG4gIGlmICh0aGlzLmRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgIHRoaXMuZGF0YVtrZXldIC89IGFtb3VudDtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZygnVGhlIGtleSAtICcgKyBrZXkgKyAnIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgZGljdGlvbmFyeS4nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBwcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZmluZGluZyBsb3dlc3Qgb3IgaGlnaGVzdCB2YWx1ZVxuICogdGhlIGFyZ3VtZW50ICdmbGlwJyBpcyB1c2VkIHRvIGZsaXAgdGhlIGNvbXBhcmlzb24gYXJyb3dcbiAqIGZyb20gJ2xlc3MgdGhhbicgdG8gJ2dyZWF0ZXIgdGhhbidcbiAqXG4gKi9cblxucDUuTnVtYmVyRGljdC5wcm90b3R5cGUuX3ZhbHVlVGVzdCA9IGZ1bmN0aW9uKGZsaXApIHtcbiAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgJ1VuYWJsZSB0byBzZWFyY2ggZm9yIGEgbWluaW11bSBvciBtYXhpbXVtIHZhbHVlIG9uIGFuIGVtcHR5IE51bWJlckRpY3QnO1xuICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVtPYmplY3Qua2V5cyh0aGlzLmRhdGEpWzBdXTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhW09iamVjdC5rZXlzKHRoaXMuZGF0YSlbMF1dO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmICh0aGlzLmRhdGFba2V5XSAqIGZsaXAgPCByZXN1bHQgKiBmbGlwKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuZGF0YVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbG93ZXN0IHZhbHVlLlxuICpcbiAqIEBtZXRob2QgbWluVmFsdWVcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgbXlEaWN0aW9uYXJ5ID0gY3JlYXRlTnVtYmVyRGljdCh7IDI6IC0xMCwgNDogMC42NSwgMS4yOiAzIH0pO1xuICogICB2YXIgbG93ZXN0VmFsdWUgPSBteURpY3Rpb25hcnkubWluVmFsdWUoKTsgLy8gdmFsdWUgaXMgLTEwXG4gKiAgIHByaW50KGxvd2VzdFZhbHVlKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKi9cblxucDUuTnVtYmVyRGljdC5wcm90b3R5cGUubWluVmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX3ZhbHVlVGVzdCgxKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBoaWdoZXN0IHZhbHVlLlxuICpcbiAqIEBtZXRob2QgbWF4VmFsdWVcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgbXlEaWN0aW9uYXJ5ID0gY3JlYXRlTnVtYmVyRGljdCh7IDI6IC0xMCwgNDogMC42NSwgMS4yOiAzIH0pO1xuICogICB2YXIgaGlnaGVzdFZhbHVlID0gbXlEaWN0aW9uYXJ5Lm1heFZhbHVlKCk7IC8vIHZhbHVlIGlzIDNcbiAqICAgcHJpbnQoaGlnaGVzdFZhbHVlKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKi9cblxucDUuTnVtYmVyRGljdC5wcm90b3R5cGUubWF4VmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX3ZhbHVlVGVzdCgtMSk7XG59O1xuXG4vKipcbiAqIHByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBmaW5kaW5nIGxvd2VzdCBvciBoaWdoZXN0IGtleVxuICogdGhlIGFyZ3VtZW50ICdmbGlwJyBpcyB1c2VkIHRvIGZsaXAgdGhlIGNvbXBhcmlzb24gYXJyb3dcbiAqIGZyb20gJ2xlc3MgdGhhbicgdG8gJ2dyZWF0ZXIgdGhhbidcbiAqXG4gKi9cblxucDUuTnVtYmVyRGljdC5wcm90b3R5cGUuX2tleVRlc3QgPSBmdW5jdGlvbihmbGlwKSB7XG4gIGlmIChPYmplY3Qua2V5cyh0aGlzLmRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93ICdVbmFibGUgdG8gdXNlIG1pblZhbHVlIG9uIGFuIGVtcHR5IE51bWJlckRpY3QnO1xuICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGF0YSlbMF07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlc3VsdCA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YSlbMF07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5kYXRhKVtpXSAqIGZsaXAgPCByZXN1bHQgKiBmbGlwKSB7XG4gICAgICAgIHJlc3VsdCA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YSlbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3Qga2V5LlxuICpcbiAqIEBtZXRob2QgbWluS2V5XG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIG15RGljdGlvbmFyeSA9IGNyZWF0ZU51bWJlckRpY3QoeyAyOiA0LCA0OiA2LCAxLjI6IDMgfSk7XG4gKiAgIHZhciBsb3dlc3RLZXkgPSBteURpY3Rpb25hcnkubWluS2V5KCk7IC8vIHZhbHVlIGlzIDEuMlxuICogICBwcmludChsb3dlc3RLZXkpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqL1xuXG5wNS5OdW1iZXJEaWN0LnByb3RvdHlwZS5taW5LZXkgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2tleVRlc3QoMSk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgaGlnaGVzdCBrZXkuXG4gKlxuICogQG1ldGhvZCBtYXhLZXlcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgbXlEaWN0aW9uYXJ5ID0gY3JlYXRlTnVtYmVyRGljdCh7IDI6IDQsIDQ6IDYsIDEuMjogMyB9KTtcbiAqICAgdmFyIGhpZ2hlc3RLZXkgPSBteURpY3Rpb25hcnkubWF4S2V5KCk7IC8vIHZhbHVlIGlzIDRcbiAqICAgcHJpbnQoaGlnaGVzdEtleSk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICovXG5cbnA1Lk51bWJlckRpY3QucHJvdG90eXBlLm1heEtleSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fa2V5VGVzdCgtMSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1LlR5cGVkRGljdDtcblxufSx7XCIuLi9jb3JlL2NvcmVcIjoyMn1dLDM3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBFdmVudHNcbiAqIEBzdWJtb2R1bGUgQWNjZWxlcmF0aW9uXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbi8qKlxuICogVGhlIHN5c3RlbSB2YXJpYWJsZSBkZXZpY2VPcmllbnRhdGlvbiBhbHdheXMgY29udGFpbnMgdGhlIG9yaWVudGF0aW9uIG9mXG4gKiB0aGUgZGV2aWNlLiBUaGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSB3aWxsIGVpdGhlciBiZSBzZXQgJ2xhbmRzY2FwZSdcbiAqIG9yICdwb3J0cmFpdCcuIElmIG5vIGRhdGEgaXMgYXZhaWxhYmxlIGl0IHdpbGwgYmUgc2V0IHRvICd1bmRlZmluZWQnLlxuICogZWl0aGVyIExBTkRTQ0FQRSBvciBQT1JUUkFJVC5cbiAqXG4gKiBAcHJvcGVydHkge0NvbnN0YW50fSBkZXZpY2VPcmllbnRhdGlvblxuICogQHJlYWRPbmx5XG4gKi9cbnA1LnByb3RvdHlwZS5kZXZpY2VPcmllbnRhdGlvbiA9IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgc3lzdGVtIHZhcmlhYmxlIGFjY2VsZXJhdGlvblggYWx3YXlzIGNvbnRhaW5zIHRoZSBhY2NlbGVyYXRpb24gb2YgdGhlXG4gKiBkZXZpY2UgYWxvbmcgdGhlIHggYXhpcy4gVmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMgbWV0ZXJzIHBlciBzZWNvbmQgc3F1YXJlZC5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gYWNjZWxlcmF0aW9uWFxuICogQHJlYWRPbmx5XG4gKi9cbnA1LnByb3RvdHlwZS5hY2NlbGVyYXRpb25YID0gMDtcblxuLyoqXG4gKiBUaGUgc3lzdGVtIHZhcmlhYmxlIGFjY2VsZXJhdGlvblkgYWx3YXlzIGNvbnRhaW5zIHRoZSBhY2NlbGVyYXRpb24gb2YgdGhlXG4gKiBkZXZpY2UgYWxvbmcgdGhlIHkgYXhpcy4gVmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMgbWV0ZXJzIHBlciBzZWNvbmQgc3F1YXJlZC5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gYWNjZWxlcmF0aW9uWVxuICogQHJlYWRPbmx5XG4gKi9cbnA1LnByb3RvdHlwZS5hY2NlbGVyYXRpb25ZID0gMDtcblxuLyoqXG4gKiBUaGUgc3lzdGVtIHZhcmlhYmxlIGFjY2VsZXJhdGlvblogYWx3YXlzIGNvbnRhaW5zIHRoZSBhY2NlbGVyYXRpb24gb2YgdGhlXG4gKiBkZXZpY2UgYWxvbmcgdGhlIHogYXhpcy4gVmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMgbWV0ZXJzIHBlciBzZWNvbmQgc3F1YXJlZC5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gYWNjZWxlcmF0aW9uWlxuICogQHJlYWRPbmx5XG4gKi9cbnA1LnByb3RvdHlwZS5hY2NlbGVyYXRpb25aID0gMDtcblxuLyoqXG4gKiBUaGUgc3lzdGVtIHZhcmlhYmxlIHBBY2NlbGVyYXRpb25YIGFsd2F5cyBjb250YWlucyB0aGUgYWNjZWxlcmF0aW9uIG9mIHRoZVxuICogZGV2aWNlIGFsb25nIHRoZSB4IGF4aXMgaW4gdGhlIGZyYW1lIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IGZyYW1lLiBWYWx1ZVxuICogaXMgcmVwcmVzZW50ZWQgYXMgbWV0ZXJzIHBlciBzZWNvbmQgc3F1YXJlZC5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gcEFjY2VsZXJhdGlvblhcbiAqIEByZWFkT25seVxuICovXG5wNS5wcm90b3R5cGUucEFjY2VsZXJhdGlvblggPSAwO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgcEFjY2VsZXJhdGlvblkgYWx3YXlzIGNvbnRhaW5zIHRoZSBhY2NlbGVyYXRpb24gb2YgdGhlXG4gKiBkZXZpY2UgYWxvbmcgdGhlIHkgYXhpcyBpbiB0aGUgZnJhbWUgcHJldmlvdXMgdG8gdGhlIGN1cnJlbnQgZnJhbWUuIFZhbHVlXG4gKiBpcyByZXByZXNlbnRlZCBhcyBtZXRlcnMgcGVyIHNlY29uZCBzcXVhcmVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwQWNjZWxlcmF0aW9uWVxuICogQHJlYWRPbmx5XG4gKi9cbnA1LnByb3RvdHlwZS5wQWNjZWxlcmF0aW9uWSA9IDA7XG5cbi8qKlxuICogVGhlIHN5c3RlbSB2YXJpYWJsZSBwQWNjZWxlcmF0aW9uWiBhbHdheXMgY29udGFpbnMgdGhlIGFjY2VsZXJhdGlvbiBvZiB0aGVcbiAqIGRldmljZSBhbG9uZyB0aGUgeiBheGlzIGluIHRoZSBmcmFtZSBwcmV2aW91cyB0byB0aGUgY3VycmVudCBmcmFtZS4gVmFsdWVcbiAqIGlzIHJlcHJlc2VudGVkIGFzIG1ldGVycyBwZXIgc2Vjb25kIHNxdWFyZWQuXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHBBY2NlbGVyYXRpb25aXG4gKiBAcmVhZE9ubHlcbiAqL1xucDUucHJvdG90eXBlLnBBY2NlbGVyYXRpb25aID0gMDtcblxuLyoqXG4gKiBfdXBkYXRlUEFjY2VsZXJhdGlvbnMgdXBkYXRlcyB0aGUgcEFjY2VsZXJhdGlvbiB2YWx1ZXNcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5wNS5wcm90b3R5cGUuX3VwZGF0ZVBBY2NlbGVyYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3NldFByb3BlcnR5KCdwQWNjZWxlcmF0aW9uWCcsIHRoaXMuYWNjZWxlcmF0aW9uWCk7XG4gIHRoaXMuX3NldFByb3BlcnR5KCdwQWNjZWxlcmF0aW9uWScsIHRoaXMuYWNjZWxlcmF0aW9uWSk7XG4gIHRoaXMuX3NldFByb3BlcnR5KCdwQWNjZWxlcmF0aW9uWicsIHRoaXMuYWNjZWxlcmF0aW9uWik7XG59O1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgcm90YXRpb25YIGFsd2F5cyBjb250YWlucyB0aGUgcm90YXRpb24gb2YgdGhlXG4gKiBkZXZpY2UgYWxvbmcgdGhlIHggYXhpcy4gVmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMgMCB0byArLy0xODAgZGVncmVlcy5cbiAqIDxicj48YnI+XG4gKiBOb3RlOiBUaGUgb3JkZXIgdGhlIHJvdGF0aW9ucyBhcmUgY2FsbGVkIGlzIGltcG9ydGFudCwgaWUuIGlmIHVzZWRcbiAqIHRvZ2V0aGVyLCBpdCBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3JkZXIgWi1YLVkgb3IgdGhlcmUgbWlnaHQgYmVcbiAqIHVuZXhwZWN0ZWQgYmVoYXZpb3VyLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICAvL3JvdGF0ZVoocmFkaWFucyhyb3RhdGlvblopKTtcbiAqICAgcm90YXRlWChyYWRpYW5zKHJvdGF0aW9uWCkpO1xuICogICAvL3JvdGF0ZVkocmFkaWFucyhyb3RhdGlvblkpKTtcbiAqICAgYm94KDIwMCwgMjAwLCAyMDApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHJvdGF0aW9uWFxuICogQHJlYWRPbmx5XG4gKlxuICogQGFsdFxuICogcmVkIGhvcml6b250YWwgbGluZSByaWdodCwgZ3JlZW4gdmVydGljYWwgbGluZSBib3R0b20uIGJsYWNrIGJhY2tncm91bmQuXG4gKlxuICovXG5wNS5wcm90b3R5cGUucm90YXRpb25YID0gMDtcblxuLyoqXG4gKiBUaGUgc3lzdGVtIHZhcmlhYmxlIHJvdGF0aW9uWSBhbHdheXMgY29udGFpbnMgdGhlIHJvdGF0aW9uIG9mIHRoZVxuICogZGV2aWNlIGFsb25nIHRoZSB5IGF4aXMuIFZhbHVlIGlzIHJlcHJlc2VudGVkIGFzIDAgdG8gKy8tOTAgZGVncmVlcy5cbiAqIDxicj48YnI+XG4gKiBOb3RlOiBUaGUgb3JkZXIgdGhlIHJvdGF0aW9ucyBhcmUgY2FsbGVkIGlzIGltcG9ydGFudCwgaWUuIGlmIHVzZWRcbiAqIHRvZ2V0aGVyLCBpdCBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3JkZXIgWi1YLVkgb3IgdGhlcmUgbWlnaHQgYmVcbiAqIHVuZXhwZWN0ZWQgYmVoYXZpb3VyLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICAvL3JvdGF0ZVoocmFkaWFucyhyb3RhdGlvblopKTtcbiAqICAgLy9yb3RhdGVYKHJhZGlhbnMocm90YXRpb25YKSk7XG4gKiAgIHJvdGF0ZVkocmFkaWFucyhyb3RhdGlvblkpKTtcbiAqICAgYm94KDIwMCwgMjAwLCAyMDApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHJvdGF0aW9uWVxuICogQHJlYWRPbmx5XG4gKlxuICogQGFsdFxuICogcmVkIGhvcml6b250YWwgbGluZSByaWdodCwgZ3JlZW4gdmVydGljYWwgbGluZSBib3R0b20uIGJsYWNrIGJhY2tncm91bmQuXG4gKi9cbnA1LnByb3RvdHlwZS5yb3RhdGlvblkgPSAwO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgcm90YXRpb25aIGFsd2F5cyBjb250YWlucyB0aGUgcm90YXRpb24gb2YgdGhlXG4gKiBkZXZpY2UgYWxvbmcgdGhlIHogYXhpcy4gVmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMgMCB0byAzNTkgZGVncmVlcy5cbiAqIDxicj48YnI+XG4gKiBVbmxpa2Ugcm90YXRpb25YIGFuZCByb3RhdGlvblksIHRoaXMgdmFyaWFibGUgaXMgYXZhaWxhYmxlIGZvciBkZXZpY2VzXG4gKiB3aXRoIGEgYnVpbHQtaW4gY29tcGFzcyBvbmx5LlxuICogPGJyPjxicj5cbiAqIE5vdGU6IFRoZSBvcmRlciB0aGUgcm90YXRpb25zIGFyZSBjYWxsZWQgaXMgaW1wb3J0YW50LCBpZS4gaWYgdXNlZFxuICogdG9nZXRoZXIsIGl0IG11c3QgYmUgY2FsbGVkIGluIHRoZSBvcmRlciBaLVgtWSBvciB0aGVyZSBtaWdodCBiZVxuICogdW5leHBlY3RlZCBiZWhhdmlvdXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHJvdGF0ZVoocmFkaWFucyhyb3RhdGlvblopKTtcbiAqICAgLy9yb3RhdGVYKHJhZGlhbnMocm90YXRpb25YKSk7XG4gKiAgIC8vcm90YXRlWShyYWRpYW5zKHJvdGF0aW9uWSkpO1xuICogICBib3goMjAwLCAyMDAsIDIwMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gcm90YXRpb25aXG4gKiBAcmVhZE9ubHlcbiAqXG4gKiBAYWx0XG4gKiByZWQgaG9yaXpvbnRhbCBsaW5lIHJpZ2h0LCBncmVlbiB2ZXJ0aWNhbCBsaW5lIGJvdHRvbS4gYmxhY2sgYmFja2dyb3VuZC5cbiAqL1xucDUucHJvdG90eXBlLnJvdGF0aW9uWiA9IDA7XG5cbi8qKlxuICogVGhlIHN5c3RlbSB2YXJpYWJsZSBwUm90YXRpb25YIGFsd2F5cyBjb250YWlucyB0aGUgcm90YXRpb24gb2YgdGhlXG4gKiBkZXZpY2UgYWxvbmcgdGhlIHggYXhpcyBpbiB0aGUgZnJhbWUgcHJldmlvdXMgdG8gdGhlIGN1cnJlbnQgZnJhbWUuIFZhbHVlXG4gKiBpcyByZXByZXNlbnRlZCBhcyAwIHRvICsvLTE4MCBkZWdyZWVzLlxuICogPGJyPjxicj5cbiAqIHBSb3RhdGlvblggY2FuIGFsc28gYmUgdXNlZCB3aXRoIHJvdGF0aW9uWCB0byBkZXRlcm1pbmUgdGhlIHJvdGF0ZVxuICogZGlyZWN0aW9uIG9mIHRoZSBkZXZpY2UgYWxvbmcgdGhlIFgtYXhpcy5cbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+XG4gKiA8Y29kZT5cbiAqIC8vIEEgc2ltcGxlIGlmIHN0YXRlbWVudCBsb29raW5nIGF0IHdoZXRoZXJcbiAqIC8vIHJvdGF0aW9uWCAtIHBSb3RhdGlvblggPCAwIGlzIHRydWUgb3Igbm90IHdpbGwgYmVcbiAqIC8vIHN1ZmZpY2llbnQgZm9yIGRldGVybWluaW5nIHRoZSByb3RhdGUgZGlyZWN0aW9uXG4gKiAvLyBpbiBtb3N0IGNhc2VzLlxuICpcbiAqIC8vIFNvbWUgZXh0cmEgbG9naWMgaXMgbmVlZGVkIHRvIGFjY291bnQgZm9yIGNhc2VzIHdoZXJlXG4gKiAvLyB0aGUgYW5nbGVzIHdyYXAgYXJvdW5kLlxuICogdmFyIHJvdGF0ZURpcmVjdGlvbiA9ICdjbG9ja3dpc2UnO1xuICpcbiAqIC8vIFNpbXBsZSByYW5nZSBjb252ZXJzaW9uIHRvIG1ha2UgdGhpbmdzIHNpbXBsZXIuXG4gKiAvLyBUaGlzIGlzIG5vdCBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBidXQgdGhlIGxvZ2ljXG4gKiAvLyB3aWxsIGJlIGRpZmZlcmVudCBpbiB0aGF0IGNhc2UuXG4gKlxuICogdmFyIHJYID0gcm90YXRpb25YICsgMTgwO1xuICogdmFyIHBSWCA9IHBSb3RhdGlvblggKyAxODA7XG4gKlxuICogaWYgKChyWCAtIHBSWCA+IDAgJiYgclggLSBwUlggPCAyNzApIHx8IHJYIC0gcFJYIDwgLTI3MCkge1xuICogICByb3RhdGVEaXJlY3Rpb24gPSAnY2xvY2t3aXNlJztcbiAqIH0gZWxzZSBpZiAoclggLSBwUlggPCAwIHx8IHJYIC0gcFJYID4gMjcwKSB7XG4gKiAgIHJvdGF0ZURpcmVjdGlvbiA9ICdjb3VudGVyLWNsb2Nrd2lzZSc7XG4gKiB9XG4gKlxuICogcHJpbnQocm90YXRlRGlyZWN0aW9uKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIG5vIGltYWdlIHRvIGRpc3BsYXkuXG4gKlxuICpcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwUm90YXRpb25YXG4gKiBAcmVhZE9ubHlcbiAqL1xucDUucHJvdG90eXBlLnBSb3RhdGlvblggPSAwO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgcFJvdGF0aW9uWSBhbHdheXMgY29udGFpbnMgdGhlIHJvdGF0aW9uIG9mIHRoZVxuICogZGV2aWNlIGFsb25nIHRoZSB5IGF4aXMgaW4gdGhlIGZyYW1lIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IGZyYW1lLiBWYWx1ZVxuICogaXMgcmVwcmVzZW50ZWQgYXMgMCB0byArLy05MCBkZWdyZWVzLlxuICogPGJyPjxicj5cbiAqIHBSb3RhdGlvblkgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHJvdGF0aW9uWSB0byBkZXRlcm1pbmUgdGhlIHJvdGF0ZVxuICogZGlyZWN0aW9uIG9mIHRoZSBkZXZpY2UgYWxvbmcgdGhlIFktYXhpcy5cbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+XG4gKiA8Y29kZT5cbiAqIC8vIEEgc2ltcGxlIGlmIHN0YXRlbWVudCBsb29raW5nIGF0IHdoZXRoZXJcbiAqIC8vIHJvdGF0aW9uWSAtIHBSb3RhdGlvblkgPCAwIGlzIHRydWUgb3Igbm90IHdpbGwgYmVcbiAqIC8vIHN1ZmZpY2llbnQgZm9yIGRldGVybWluaW5nIHRoZSByb3RhdGUgZGlyZWN0aW9uXG4gKiAvLyBpbiBtb3N0IGNhc2VzLlxuICpcbiAqIC8vIFNvbWUgZXh0cmEgbG9naWMgaXMgbmVlZGVkIHRvIGFjY291bnQgZm9yIGNhc2VzIHdoZXJlXG4gKiAvLyB0aGUgYW5nbGVzIHdyYXAgYXJvdW5kLlxuICogdmFyIHJvdGF0ZURpcmVjdGlvbiA9ICdjbG9ja3dpc2UnO1xuICpcbiAqIC8vIFNpbXBsZSByYW5nZSBjb252ZXJzaW9uIHRvIG1ha2UgdGhpbmdzIHNpbXBsZXIuXG4gKiAvLyBUaGlzIGlzIG5vdCBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBidXQgdGhlIGxvZ2ljXG4gKiAvLyB3aWxsIGJlIGRpZmZlcmVudCBpbiB0aGF0IGNhc2UuXG4gKlxuICogdmFyIHJZID0gcm90YXRpb25ZICsgMTgwO1xuICogdmFyIHBSWSA9IHBSb3RhdGlvblkgKyAxODA7XG4gKlxuICogaWYgKChyWSAtIHBSWSA+IDAgJiYgclkgLSBwUlkgPCAyNzApIHx8IHJZIC0gcFJZIDwgLTI3MCkge1xuICogICByb3RhdGVEaXJlY3Rpb24gPSAnY2xvY2t3aXNlJztcbiAqIH0gZWxzZSBpZiAoclkgLSBwUlkgPCAwIHx8IHJZIC0gcFJZID4gMjcwKSB7XG4gKiAgIHJvdGF0ZURpcmVjdGlvbiA9ICdjb3VudGVyLWNsb2Nrd2lzZSc7XG4gKiB9XG4gKiBwcmludChyb3RhdGVEaXJlY3Rpb24pO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgdG8gZGlzcGxheS5cbiAqXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHBSb3RhdGlvbllcbiAqIEByZWFkT25seVxuICovXG5wNS5wcm90b3R5cGUucFJvdGF0aW9uWSA9IDA7XG5cbi8qKlxuICogVGhlIHN5c3RlbSB2YXJpYWJsZSBwUm90YXRpb25aIGFsd2F5cyBjb250YWlucyB0aGUgcm90YXRpb24gb2YgdGhlXG4gKiBkZXZpY2UgYWxvbmcgdGhlIHogYXhpcyBpbiB0aGUgZnJhbWUgcHJldmlvdXMgdG8gdGhlIGN1cnJlbnQgZnJhbWUuIFZhbHVlXG4gKiBpcyByZXByZXNlbnRlZCBhcyAwIHRvIDM1OSBkZWdyZWVzLlxuICogPGJyPjxicj5cbiAqIHBSb3RhdGlvblogY2FuIGFsc28gYmUgdXNlZCB3aXRoIHJvdGF0aW9uWiB0byBkZXRlcm1pbmUgdGhlIHJvdGF0ZVxuICogZGlyZWN0aW9uIG9mIHRoZSBkZXZpY2UgYWxvbmcgdGhlIFotYXhpcy5cbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+XG4gKiA8Y29kZT5cbiAqIC8vIEEgc2ltcGxlIGlmIHN0YXRlbWVudCBsb29raW5nIGF0IHdoZXRoZXJcbiAqIC8vIHJvdGF0aW9uWiAtIHBSb3RhdGlvblogPCAwIGlzIHRydWUgb3Igbm90IHdpbGwgYmVcbiAqIC8vIHN1ZmZpY2llbnQgZm9yIGRldGVybWluaW5nIHRoZSByb3RhdGUgZGlyZWN0aW9uXG4gKiAvLyBpbiBtb3N0IGNhc2VzLlxuICpcbiAqIC8vIFNvbWUgZXh0cmEgbG9naWMgaXMgbmVlZGVkIHRvIGFjY291bnQgZm9yIGNhc2VzIHdoZXJlXG4gKiAvLyB0aGUgYW5nbGVzIHdyYXAgYXJvdW5kLlxuICogdmFyIHJvdGF0ZURpcmVjdGlvbiA9ICdjbG9ja3dpc2UnO1xuICpcbiAqIGlmIChcbiAqICAgKHJvdGF0aW9uWiAtIHBSb3RhdGlvblogPiAwICYmIHJvdGF0aW9uWiAtIHBSb3RhdGlvblogPCAyNzApIHx8XG4gKiAgIHJvdGF0aW9uWiAtIHBSb3RhdGlvblogPCAtMjcwXG4gKiApIHtcbiAqICAgcm90YXRlRGlyZWN0aW9uID0gJ2Nsb2Nrd2lzZSc7XG4gKiB9IGVsc2UgaWYgKHJvdGF0aW9uWiAtIHBSb3RhdGlvblogPCAwIHx8IHJvdGF0aW9uWiAtIHBSb3RhdGlvblogPiAyNzApIHtcbiAqICAgcm90YXRlRGlyZWN0aW9uID0gJ2NvdW50ZXItY2xvY2t3aXNlJztcbiAqIH1cbiAqIHByaW50KHJvdGF0ZURpcmVjdGlvbik7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBpbWFnZSB0byBkaXNwbGF5LlxuICpcbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gcFJvdGF0aW9uWlxuICogQHJlYWRPbmx5XG4gKi9cbnA1LnByb3RvdHlwZS5wUm90YXRpb25aID0gMDtcblxudmFyIHN0YXJ0QW5nbGVYID0gMDtcbnZhciBzdGFydEFuZ2xlWSA9IDA7XG52YXIgc3RhcnRBbmdsZVogPSAwO1xuXG52YXIgcm90YXRlRGlyZWN0aW9uWCA9ICdjbG9ja3dpc2UnO1xudmFyIHJvdGF0ZURpcmVjdGlvblkgPSAnY2xvY2t3aXNlJztcbnZhciByb3RhdGVEaXJlY3Rpb25aID0gJ2Nsb2Nrd2lzZSc7XG5cbnZhciBwUm90YXRlRGlyZWN0aW9uWDtcbnZhciBwUm90YXRlRGlyZWN0aW9uWTtcbnZhciBwUm90YXRlRGlyZWN0aW9uWjtcblxucDUucHJvdG90eXBlLl91cGRhdGVQUm90YXRpb25zID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3NldFByb3BlcnR5KCdwUm90YXRpb25YJywgdGhpcy5yb3RhdGlvblgpO1xuICB0aGlzLl9zZXRQcm9wZXJ0eSgncFJvdGF0aW9uWScsIHRoaXMucm90YXRpb25ZKTtcbiAgdGhpcy5fc2V0UHJvcGVydHkoJ3BSb3RhdGlvblonLCB0aGlzLnJvdGF0aW9uWik7XG59O1xuXG4vKipcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0dXJuQXhpc1xuICogQHJlYWRPbmx5XG4gKi9cbnA1LnByb3RvdHlwZS50dXJuQXhpcyA9IHVuZGVmaW5lZDtcblxudmFyIG1vdmVfdGhyZXNob2xkID0gMC41O1xudmFyIHNoYWtlX3RocmVzaG9sZCA9IDMwO1xuXG4vKipcbiAqIFRoZSBzZXRNb3ZlVGhyZXNob2xkKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIG1vdmVtZW50IHRocmVzaG9sZCBmb3JcbiAqIHRoZSBkZXZpY2VNb3ZlZCgpIGZ1bmN0aW9uLiBUaGUgZGVmYXVsdCB0aHJlc2hvbGQgaXMgc2V0IHRvIDAuNS5cbiAqXG4gKiBAbWV0aG9kIHNldE1vdmVUaHJlc2hvbGRcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdGhyZXNob2xkIHZhbHVlXG4gKi9cbnA1LnByb3RvdHlwZS5zZXRNb3ZlVGhyZXNob2xkID0gZnVuY3Rpb24odmFsKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3NldE1vdmVUaHJlc2hvbGQnLCBhcmd1bWVudHMpO1xuICBtb3ZlX3RocmVzaG9sZCA9IHZhbDtcbn07XG5cbi8qKlxuICogVGhlIHNldFNoYWtlVGhyZXNob2xkKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIG1vdmVtZW50IHRocmVzaG9sZCBmb3JcbiAqIHRoZSBkZXZpY2VTaGFrZW4oKSBmdW5jdGlvbi4gVGhlIGRlZmF1bHQgdGhyZXNob2xkIGlzIHNldCB0byAzMC5cbiAqXG4gKiBAbWV0aG9kIHNldFNoYWtlVGhyZXNob2xkXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHRocmVzaG9sZCB2YWx1ZVxuICovXG5wNS5wcm90b3R5cGUuc2V0U2hha2VUaHJlc2hvbGQgPSBmdW5jdGlvbih2YWwpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnc2V0U2hha2VUaHJlc2hvbGQnLCBhcmd1bWVudHMpO1xuICBzaGFrZV90aHJlc2hvbGQgPSB2YWw7XG59O1xuXG4vKipcbiAqIFRoZSBkZXZpY2VNb3ZlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgaXMgbW92ZWQgYnkgbW9yZSB0aGFuXG4gKiB0aGUgdGhyZXNob2xkIHZhbHVlIGFsb25nIFgsIFkgb3IgWiBheGlzLiBUaGUgZGVmYXVsdCB0aHJlc2hvbGQgaXMgc2V0IHRvXG4gKiAwLjUuXG4gKiBAbWV0aG9kIGRldmljZU1vdmVkXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIC8vIFJ1biB0aGlzIGV4YW1wbGUgb24gYSBtb2JpbGUgZGV2aWNlXG4gKiAvLyBNb3ZlIHRoZSBkZXZpY2UgYXJvdW5kXG4gKiAvLyB0byBjaGFuZ2UgdGhlIHZhbHVlLlxuICpcbiAqIHZhciB2YWx1ZSA9IDA7XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBmaWxsKHZhbHVlKTtcbiAqICAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XG4gKiB9XG4gKiBmdW5jdGlvbiBkZXZpY2VNb3ZlZCgpIHtcbiAqICAgdmFsdWUgPSB2YWx1ZSArIDU7XG4gKiAgIGlmICh2YWx1ZSA+IDI1NSkge1xuICogICAgIHZhbHVlID0gMDtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogNTB4NTAgYmxhY2sgcmVjdCBpbiBjZW50ZXIgb2YgY2FudmFzLiB0dXJucyB3aGl0ZSBvbiBtb2JpbGUgd2hlbiBkZXZpY2UgbW92ZXNcbiAqXG4gKi9cblxuLyoqXG4gKiBUaGUgZGV2aWNlVHVybmVkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGRldmljZSByb3RhdGVzIGJ5XG4gKiBtb3JlIHRoYW4gOTAgZGVncmVlcyBjb250aW51b3VzbHkuXG4gKiA8YnI+PGJyPlxuICogVGhlIGF4aXMgdGhhdCB0cmlnZ2VycyB0aGUgZGV2aWNlVHVybmVkKCkgbWV0aG9kIGlzIHN0b3JlZCBpbiB0aGUgdHVybkF4aXNcbiAqIHZhcmlhYmxlLiBUaGUgZGV2aWNlVHVybmVkKCkgbWV0aG9kIGNhbiBiZSBsb2NrZWQgdG8gdHJpZ2dlciBvbiBhbnkgYXhpczpcbiAqIFgsIFkgb3IgWiBieSBjb21wYXJpbmcgdGhlIHR1cm5BeGlzIHZhcmlhYmxlIHRvICdYJywgJ1knIG9yICdaJy5cbiAqXG4gKiBAbWV0aG9kIGRldmljZVR1cm5lZFxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiAvLyBSdW4gdGhpcyBleGFtcGxlIG9uIGEgbW9iaWxlIGRldmljZVxuICogLy8gUm90YXRlIHRoZSBkZXZpY2UgYnkgOTAgZGVncmVlc1xuICogLy8gdG8gY2hhbmdlIHRoZSB2YWx1ZS5cbiAqXG4gKiB2YXIgdmFsdWUgPSAwO1xuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgZmlsbCh2YWx1ZSk7XG4gKiAgIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xuICogfVxuICogZnVuY3Rpb24gZGV2aWNlVHVybmVkKCkge1xuICogICBpZiAodmFsdWUgPT09IDApIHtcbiAqICAgICB2YWx1ZSA9IDI1NTtcbiAqICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMjU1KSB7XG4gKiAgICAgdmFsdWUgPSAwO1xuICogICB9XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIFJ1biB0aGlzIGV4YW1wbGUgb24gYSBtb2JpbGUgZGV2aWNlXG4gKiAvLyBSb3RhdGUgdGhlIGRldmljZSBieSA5MCBkZWdyZWVzIGluIHRoZVxuICogLy8gWC1heGlzIHRvIGNoYW5nZSB0aGUgdmFsdWUuXG4gKlxuICogdmFyIHZhbHVlID0gMDtcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGZpbGwodmFsdWUpO1xuICogICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIGRldmljZVR1cm5lZCgpIHtcbiAqICAgaWYgKHR1cm5BeGlzID09PSAnWCcpIHtcbiAqICAgICBpZiAodmFsdWUgPT09IDApIHtcbiAqICAgICAgIHZhbHVlID0gMjU1O1xuICogICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI1NSkge1xuICogICAgICAgdmFsdWUgPSAwO1xuICogICAgIH1cbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogNTB4NTAgYmxhY2sgcmVjdCBpbiBjZW50ZXIgb2YgY2FudmFzLiB0dXJucyB3aGl0ZSBvbiBtb2JpbGUgd2hlbiBkZXZpY2UgdHVybnNcbiAqIDUweDUwIGJsYWNrIHJlY3QgaW4gY2VudGVyIG9mIGNhbnZhcy4gdHVybnMgd2hpdGUgb24gbW9iaWxlIHdoZW4geC1heGlzIHR1cm5zXG4gKlxuICovXG5cbi8qKlxuICogVGhlIGRldmljZVNoYWtlbigpIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgdG90YWwgYWNjZWxlcmF0aW9uXG4gKiBjaGFuZ2VzIG9mIGFjY2VsZXJhdGlvblggYW5kIGFjY2VsZXJhdGlvblkgdmFsdWVzIGlzIG1vcmUgdGhhblxuICogdGhlIHRocmVzaG9sZCB2YWx1ZS4gVGhlIGRlZmF1bHQgdGhyZXNob2xkIGlzIHNldCB0byAzMC5cbiAqIEBtZXRob2QgZGV2aWNlU2hha2VuXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIC8vIFJ1biB0aGlzIGV4YW1wbGUgb24gYSBtb2JpbGUgZGV2aWNlXG4gKiAvLyBTaGFrZSB0aGUgZGV2aWNlIHRvIGNoYW5nZSB0aGUgdmFsdWUuXG4gKlxuICogdmFyIHZhbHVlID0gMDtcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGZpbGwodmFsdWUpO1xuICogICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIGRldmljZVNoYWtlbigpIHtcbiAqICAgdmFsdWUgPSB2YWx1ZSArIDU7XG4gKiAgIGlmICh2YWx1ZSA+IDI1NSkge1xuICogICAgIHZhbHVlID0gMDtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogNTB4NTAgYmxhY2sgcmVjdCBpbiBjZW50ZXIgb2YgY2FudmFzLiB0dXJucyB3aGl0ZSBvbiBtb2JpbGUgd2hlbiBkZXZpY2Ugc2hha2VzXG4gKlxuICovXG5cbnA1LnByb3RvdHlwZS5fb25kZXZpY2VvcmllbnRhdGlvbiA9IGZ1bmN0aW9uKGUpIHtcbiAgdGhpcy5fdXBkYXRlUFJvdGF0aW9ucygpO1xuICB0aGlzLl9zZXRQcm9wZXJ0eSgncm90YXRpb25YJywgZS5iZXRhKTtcbiAgdGhpcy5fc2V0UHJvcGVydHkoJ3JvdGF0aW9uWScsIGUuZ2FtbWEpO1xuICB0aGlzLl9zZXRQcm9wZXJ0eSgncm90YXRpb25aJywgZS5hbHBoYSk7XG4gIHRoaXMuX2hhbmRsZU1vdGlvbigpO1xufTtcbnA1LnByb3RvdHlwZS5fb25kZXZpY2Vtb3Rpb24gPSBmdW5jdGlvbihlKSB7XG4gIHRoaXMuX3VwZGF0ZVBBY2NlbGVyYXRpb25zKCk7XG4gIHRoaXMuX3NldFByb3BlcnR5KCdhY2NlbGVyYXRpb25YJywgZS5hY2NlbGVyYXRpb24ueCAqIDIpO1xuICB0aGlzLl9zZXRQcm9wZXJ0eSgnYWNjZWxlcmF0aW9uWScsIGUuYWNjZWxlcmF0aW9uLnkgKiAyKTtcbiAgdGhpcy5fc2V0UHJvcGVydHkoJ2FjY2VsZXJhdGlvblonLCBlLmFjY2VsZXJhdGlvbi56ICogMik7XG4gIHRoaXMuX2hhbmRsZU1vdGlvbigpO1xufTtcbnA1LnByb3RvdHlwZS5faGFuZGxlTW90aW9uID0gZnVuY3Rpb24oKSB7XG4gIGlmICh3aW5kb3cub3JpZW50YXRpb24gPT09IDkwIHx8IHdpbmRvdy5vcmllbnRhdGlvbiA9PT0gLTkwKSB7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ2RldmljZU9yaWVudGF0aW9uJywgJ2xhbmRzY2FwZScpO1xuICB9IGVsc2UgaWYgKHdpbmRvdy5vcmllbnRhdGlvbiA9PT0gMCkge1xuICAgIHRoaXMuX3NldFByb3BlcnR5KCdkZXZpY2VPcmllbnRhdGlvbicsICdwb3J0cmFpdCcpO1xuICB9IGVsc2UgaWYgKHdpbmRvdy5vcmllbnRhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ2RldmljZU9yaWVudGF0aW9uJywgJ3VuZGVmaW5lZCcpO1xuICB9XG4gIHZhciBkZXZpY2VNb3ZlZCA9IHRoaXMuZGV2aWNlTW92ZWQgfHwgd2luZG93LmRldmljZU1vdmVkO1xuICBpZiAodHlwZW9mIGRldmljZU1vdmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKFxuICAgICAgTWF0aC5hYnModGhpcy5hY2NlbGVyYXRpb25YIC0gdGhpcy5wQWNjZWxlcmF0aW9uWCkgPiBtb3ZlX3RocmVzaG9sZCB8fFxuICAgICAgTWF0aC5hYnModGhpcy5hY2NlbGVyYXRpb25ZIC0gdGhpcy5wQWNjZWxlcmF0aW9uWSkgPiBtb3ZlX3RocmVzaG9sZCB8fFxuICAgICAgTWF0aC5hYnModGhpcy5hY2NlbGVyYXRpb25aIC0gdGhpcy5wQWNjZWxlcmF0aW9uWikgPiBtb3ZlX3RocmVzaG9sZFxuICAgICkge1xuICAgICAgZGV2aWNlTW92ZWQoKTtcbiAgICB9XG4gIH1cbiAgdmFyIGRldmljZVR1cm5lZCA9IHRoaXMuZGV2aWNlVHVybmVkIHx8IHdpbmRvdy5kZXZpY2VUdXJuZWQ7XG4gIGlmICh0eXBlb2YgZGV2aWNlVHVybmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVGhlIGFuZ2xlcyBnaXZlbiBieSByb3RhdGlvblggZXRjIGlzIGZyb20gcmFuZ2UgLTE4MCB0byAxODAuXG4gICAgLy8gVGhlIGZvbGxvd2luZyB3aWxsIGNvbnZlcnQgdGhlbSB0byAwIHRvIDM2MCBmb3IgZWFzZSBvZiBjYWxjdWxhdGlvblxuICAgIC8vIG9mIGNhc2VzIHdoZW4gdGhlIGFuZ2xlcyB3cmFwcGVkIGFyb3VuZC5cbiAgICAvLyBfc3RhcnRBbmdsZVggd2lsbCBiZSBjb252ZXJ0ZWQgYmFjayBhdCB0aGUgZW5kIGFuZCB1cGRhdGVkLlxuICAgIHZhciB3UlggPSB0aGlzLnJvdGF0aW9uWCArIDE4MDtcbiAgICB2YXIgd1BSWCA9IHRoaXMucFJvdGF0aW9uWCArIDE4MDtcbiAgICB2YXIgd1NBWCA9IHN0YXJ0QW5nbGVYICsgMTgwO1xuICAgIGlmICgod1JYIC0gd1BSWCA+IDAgJiYgd1JYIC0gd1BSWCA8IDI3MCkgfHwgd1JYIC0gd1BSWCA8IC0yNzApIHtcbiAgICAgIHJvdGF0ZURpcmVjdGlvblggPSAnY2xvY2t3aXNlJztcbiAgICB9IGVsc2UgaWYgKHdSWCAtIHdQUlggPCAwIHx8IHdSWCAtIHdQUlggPiAyNzApIHtcbiAgICAgIHJvdGF0ZURpcmVjdGlvblggPSAnY291bnRlci1jbG9ja3dpc2UnO1xuICAgIH1cbiAgICBpZiAocm90YXRlRGlyZWN0aW9uWCAhPT0gcFJvdGF0ZURpcmVjdGlvblgpIHtcbiAgICAgIHdTQVggPSB3Ulg7XG4gICAgfVxuICAgIGlmIChNYXRoLmFicyh3UlggLSB3U0FYKSA+IDkwICYmIE1hdGguYWJzKHdSWCAtIHdTQVgpIDwgMjcwKSB7XG4gICAgICB3U0FYID0gd1JYO1xuICAgICAgdGhpcy5fc2V0UHJvcGVydHkoJ3R1cm5BeGlzJywgJ1gnKTtcbiAgICAgIGRldmljZVR1cm5lZCgpO1xuICAgIH1cbiAgICBwUm90YXRlRGlyZWN0aW9uWCA9IHJvdGF0ZURpcmVjdGlvblg7XG4gICAgc3RhcnRBbmdsZVggPSB3U0FYIC0gMTgwO1xuXG4gICAgLy8gWS1heGlzIGlzIGlkZW50aWNhbCB0byBYLWF4aXMgZXhjZXB0IGZvciBjaGFuZ2luZyBzb21lIG5hbWVzLlxuICAgIHZhciB3UlkgPSB0aGlzLnJvdGF0aW9uWSArIDE4MDtcbiAgICB2YXIgd1BSWSA9IHRoaXMucFJvdGF0aW9uWSArIDE4MDtcbiAgICB2YXIgd1NBWSA9IHN0YXJ0QW5nbGVZICsgMTgwO1xuICAgIGlmICgod1JZIC0gd1BSWSA+IDAgJiYgd1JZIC0gd1BSWSA8IDI3MCkgfHwgd1JZIC0gd1BSWSA8IC0yNzApIHtcbiAgICAgIHJvdGF0ZURpcmVjdGlvblkgPSAnY2xvY2t3aXNlJztcbiAgICB9IGVsc2UgaWYgKHdSWSAtIHdQUlkgPCAwIHx8IHdSWSAtIHRoaXMucFJvdGF0aW9uWSA+IDI3MCkge1xuICAgICAgcm90YXRlRGlyZWN0aW9uWSA9ICdjb3VudGVyLWNsb2Nrd2lzZSc7XG4gICAgfVxuICAgIGlmIChyb3RhdGVEaXJlY3Rpb25ZICE9PSBwUm90YXRlRGlyZWN0aW9uWSkge1xuICAgICAgd1NBWSA9IHdSWTtcbiAgICB9XG4gICAgaWYgKE1hdGguYWJzKHdSWSAtIHdTQVkpID4gOTAgJiYgTWF0aC5hYnMod1JZIC0gd1NBWSkgPCAyNzApIHtcbiAgICAgIHdTQVkgPSB3Ulk7XG4gICAgICB0aGlzLl9zZXRQcm9wZXJ0eSgndHVybkF4aXMnLCAnWScpO1xuICAgICAgZGV2aWNlVHVybmVkKCk7XG4gICAgfVxuICAgIHBSb3RhdGVEaXJlY3Rpb25ZID0gcm90YXRlRGlyZWN0aW9uWTtcbiAgICBzdGFydEFuZ2xlWSA9IHdTQVkgLSAxODA7XG5cbiAgICAvLyBaLWF4aXMgaXMgYWxyZWFkeSBpbiB0aGUgcmFuZ2UgMCB0byAzNjBcbiAgICAvLyBzbyBubyBjb252ZXJzaW9uIGlzIG5lZWRlZC5cbiAgICBpZiAoXG4gICAgICAodGhpcy5yb3RhdGlvblogLSB0aGlzLnBSb3RhdGlvblogPiAwICYmXG4gICAgICAgIHRoaXMucm90YXRpb25aIC0gdGhpcy5wUm90YXRpb25aIDwgMjcwKSB8fFxuICAgICAgdGhpcy5yb3RhdGlvblogLSB0aGlzLnBSb3RhdGlvblogPCAtMjcwXG4gICAgKSB7XG4gICAgICByb3RhdGVEaXJlY3Rpb25aID0gJ2Nsb2Nrd2lzZSc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMucm90YXRpb25aIC0gdGhpcy5wUm90YXRpb25aIDwgMCB8fFxuICAgICAgdGhpcy5yb3RhdGlvblogLSB0aGlzLnBSb3RhdGlvblogPiAyNzBcbiAgICApIHtcbiAgICAgIHJvdGF0ZURpcmVjdGlvblogPSAnY291bnRlci1jbG9ja3dpc2UnO1xuICAgIH1cbiAgICBpZiAocm90YXRlRGlyZWN0aW9uWiAhPT0gcFJvdGF0ZURpcmVjdGlvblopIHtcbiAgICAgIHN0YXJ0QW5nbGVaID0gdGhpcy5yb3RhdGlvblo7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIE1hdGguYWJzKHRoaXMucm90YXRpb25aIC0gc3RhcnRBbmdsZVopID4gOTAgJiZcbiAgICAgIE1hdGguYWJzKHRoaXMucm90YXRpb25aIC0gc3RhcnRBbmdsZVopIDwgMjcwXG4gICAgKSB7XG4gICAgICBzdGFydEFuZ2xlWiA9IHRoaXMucm90YXRpb25aO1xuICAgICAgdGhpcy5fc2V0UHJvcGVydHkoJ3R1cm5BeGlzJywgJ1onKTtcbiAgICAgIGRldmljZVR1cm5lZCgpO1xuICAgIH1cbiAgICBwUm90YXRlRGlyZWN0aW9uWiA9IHJvdGF0ZURpcmVjdGlvblo7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ3R1cm5BeGlzJywgdW5kZWZpbmVkKTtcbiAgfVxuICB2YXIgZGV2aWNlU2hha2VuID0gdGhpcy5kZXZpY2VTaGFrZW4gfHwgd2luZG93LmRldmljZVNoYWtlbjtcbiAgaWYgKHR5cGVvZiBkZXZpY2VTaGFrZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgYWNjZWxlcmF0aW9uQ2hhbmdlWDtcbiAgICB2YXIgYWNjZWxlcmF0aW9uQ2hhbmdlWTtcbiAgICAvLyBBZGQgYWNjZWxlcmF0aW9uQ2hhbmdlWiBpZiBhY2NlbGVyYXRpb24gY2hhbmdlIG9uIFogaXMgbmVlZGVkXG4gICAgaWYgKHRoaXMucEFjY2VsZXJhdGlvblggIT09IG51bGwpIHtcbiAgICAgIGFjY2VsZXJhdGlvbkNoYW5nZVggPSBNYXRoLmFicyh0aGlzLmFjY2VsZXJhdGlvblggLSB0aGlzLnBBY2NlbGVyYXRpb25YKTtcbiAgICAgIGFjY2VsZXJhdGlvbkNoYW5nZVkgPSBNYXRoLmFicyh0aGlzLmFjY2VsZXJhdGlvblkgLSB0aGlzLnBBY2NlbGVyYXRpb25ZKTtcbiAgICB9XG4gICAgaWYgKGFjY2VsZXJhdGlvbkNoYW5nZVggKyBhY2NlbGVyYXRpb25DaGFuZ2VZID4gc2hha2VfdGhyZXNob2xkKSB7XG4gICAgICBkZXZpY2VTaGFrZW4oKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSwzODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgRXZlbnRzXG4gKiBAc3VibW9kdWxlIEtleWJvYXJkXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbi8qKlxuICogSG9sZHMgdGhlIGtleSBjb2RlcyBvZiBjdXJyZW50bHkgcHJlc3NlZCBrZXlzLlxuICogQHByaXZhdGVcbiAqL1xudmFyIGRvd25LZXlzID0ge307XG5cbi8qKlxuICogVGhlIGJvb2xlYW4gc3lzdGVtIHZhcmlhYmxlIGtleUlzUHJlc3NlZCBpcyB0cnVlIGlmIGFueSBrZXkgaXMgcHJlc3NlZFxuICogYW5kIGZhbHNlIGlmIG5vIGtleXMgYXJlIHByZXNzZWQuXG4gKlxuICogQHByb3BlcnR5IHtCb29sZWFufSBrZXlJc1ByZXNzZWRcbiAqIEByZWFkT25seVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGlmIChrZXlJc1ByZXNzZWQgPT09IHRydWUpIHtcbiAqICAgICBmaWxsKDApO1xuICogICB9IGVsc2Uge1xuICogICAgIGZpbGwoMjU1KTtcbiAqICAgfVxuICogICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDUweDUwIHdoaXRlIHJlY3QgdGhhdCB0dXJucyBibGFjayBvbiBrZXlwcmVzcy5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5pc0tleVByZXNzZWQgPSBmYWxzZTtcbnA1LnByb3RvdHlwZS5rZXlJc1ByZXNzZWQgPSBmYWxzZTsgLy8ga2hhblxuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUga2V5IGFsd2F5cyBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIG1vc3QgcmVjZW50XG4gKiBrZXkgb24gdGhlIGtleWJvYXJkIHRoYXQgd2FzIHR5cGVkLiBUbyBnZXQgdGhlIHByb3BlciBjYXBpdGFsaXphdGlvbiwgaXRcbiAqIGlzIGJlc3QgdG8gdXNlIGl0IHdpdGhpbiBrZXlUeXBlZCgpLiBGb3Igbm9uLUFTQ0lJIGtleXMsIHVzZSB0aGUga2V5Q29kZVxuICogdmFyaWFibGUuXG4gKlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGtleVxuICogQHJlYWRPbmx5XG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIC8vIENsaWNrIGFueSBrZXkgdG8gZGlzcGxheSBpdCFcbiAqIC8vIChOb3QgR3VhcmFudGVlZCB0byBiZSBDYXNlIFNlbnNpdGl2ZSlcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBmaWxsKDI0NSwgMTIzLCAxNTgpO1xuICogICB0ZXh0U2l6ZSg1MCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICB0ZXh0KGtleSwgMzMsIDY1KTsgLy8gRGlzcGxheSBsYXN0IGtleSBwcmVzc2VkLlxuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGNhbnZhcyBkaXNwbGF5cyBhbnkga2V5IHZhbHVlIHRoYXQgaXMgcHJlc3NlZCBpbiBwaW5rIGZvbnQuXG4gKlxuICovXG5wNS5wcm90b3R5cGUua2V5ID0gJyc7XG5cbi8qKlxuICogVGhlIHZhcmlhYmxlIGtleUNvZGUgaXMgdXNlZCB0byBkZXRlY3Qgc3BlY2lhbCBrZXlzIHN1Y2ggYXMgQkFDS1NQQUNFLFxuICogREVMRVRFLCBFTlRFUiwgUkVUVVJOLCBUQUIsIEVTQ0FQRSwgU0hJRlQsIENPTlRST0wsIE9QVElPTiwgQUxULCBVUF9BUlJPVyxcbiAqIERPV05fQVJST1csIExFRlRfQVJST1csIFJJR0hUX0FSUk9XLlxuICogWW91IGNhbiBhbHNvIGNoZWNrIGZvciBjdXN0b20ga2V5cyBieSBsb29raW5nIHVwIHRoZSBrZXlDb2RlIG9mIGFueSBrZXlcbiAqIG9uIGEgc2l0ZSBsaWtlIHRoaXM6IDxhIGhyZWY9XCJodHRwOi8va2V5Y29kZS5pbmZvL1wiPmtleWNvZGUuaW5mbzwvYT4uXG4gKlxuICogQHByb3BlcnR5IHtJbnRlZ2VyfSBrZXlDb2RlXG4gKiBAcmVhZE9ubHlcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogdmFyIGZpbGxWYWwgPSAxMjY7XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBmaWxsKGZpbGxWYWwpO1xuICogICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBrZXlQcmVzc2VkKCkge1xuICogICBpZiAoa2V5Q29kZSA9PT0gVVBfQVJST1cpIHtcbiAqICAgICBmaWxsVmFsID0gMjU1O1xuICogICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IERPV05fQVJST1cpIHtcbiAqICAgICBmaWxsVmFsID0gMDtcbiAqICAgfVxuICogICByZXR1cm4gZmFsc2U7IC8vIHByZXZlbnQgZGVmYXVsdFxuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIEdyZXkgcmVjdCBjZW50ZXIuIHR1cm5zIHdoaXRlIHdoZW4gdXAgYXJyb3cgcHJlc3NlZCBhbmQgYmxhY2sgd2hlbiBkb3duXG4gKlxuICovXG5wNS5wcm90b3R5cGUua2V5Q29kZSA9IDA7XG5cbi8qKlxuICogVGhlIGtleVByZXNzZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBldmVyeSB0aW1lIGEga2V5IGlzIHByZXNzZWQuIFRoZVxuICoga2V5Q29kZSBmb3IgdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkIGlzIHN0b3JlZCBpbiB0aGUga2V5Q29kZSB2YXJpYWJsZS5cbiAqIDxicj48YnI+XG4gKiBGb3Igbm9uLUFTQ0lJIGtleXMsIHVzZSB0aGUga2V5Q29kZSB2YXJpYWJsZS4gWW91IGNhbiBjaGVjayBpZiB0aGUga2V5Q29kZVxuICogZXF1YWxzIEJBQ0tTUEFDRSwgREVMRVRFLCBFTlRFUiwgUkVUVVJOLCBUQUIsIEVTQ0FQRSwgU0hJRlQsIENPTlRST0wsXG4gKiBPUFRJT04sIEFMVCwgVVBfQVJST1csIERPV05fQVJST1csIExFRlRfQVJST1csIFJJR0hUX0FSUk9XLlxuICogPGJyPjxicj5cbiAqIEZvciBBU0NJSSBrZXlzIHRoYXQgd2FzIHByZXNzZWQgaXMgc3RvcmVkIGluIHRoZSBrZXkgdmFyaWFibGUuIEhvd2V2ZXIsIGl0XG4gKiBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlLiBGb3IgdGhpcyByZWFzb24sIGl0XG4gKiBpcyByZWNvbW1lbmRlZCB0byB1c2Uga2V5VHlwZWQoKSB0byByZWFkIHRoZSBrZXkgdmFyaWFibGUsIGluIHdoaWNoIHRoZVxuICogY2FzZSBvZiB0aGUgdmFyaWFibGUgd2lsbCBiZSBkaXN0aW5ndWlzaGVkLlxuICogPGJyPjxicj5cbiAqIEJlY2F1c2Ugb2YgaG93IG9wZXJhdGluZyBzeXN0ZW1zIGhhbmRsZSBrZXkgcmVwZWF0cywgaG9sZGluZyBkb3duIGEga2V5XG4gKiBtYXkgY2F1c2UgbXVsdGlwbGUgY2FsbHMgdG8ga2V5VHlwZWQoKSAoYW5kIGtleVJlbGVhc2VkKCkgYXMgd2VsbCkuIFRoZVxuICogcmF0ZSBvZiByZXBlYXQgaXMgc2V0IGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBob3cgZWFjaCBjb21wdXRlciBpc1xuICogY29uZmlndXJlZC48YnI+PGJyPlxuICogQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHRcbiAqIGJlaGF2aW9ycyBhdHRhY2hlZCB0byB2YXJpb3VzIGtleSBldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHRcbiAqIGJlaGF2aW9yIGZvciB0aGlzIGV2ZW50LCBhZGQgXCJyZXR1cm4gZmFsc2VcIiB0byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuXG4gKlxuICogQG1ldGhvZCBrZXlQcmVzc2VkXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIHZhbHVlID0gMDtcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGZpbGwodmFsdWUpO1xuICogICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIGtleVByZXNzZWQoKSB7XG4gKiAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICogICAgIHZhbHVlID0gMjU1O1xuICogICB9IGVsc2Uge1xuICogICAgIHZhbHVlID0gMDtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgdmFsdWUgPSAwO1xuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgZmlsbCh2YWx1ZSk7XG4gKiAgIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xuICogfVxuICogZnVuY3Rpb24ga2V5UHJlc3NlZCgpIHtcbiAqICAgaWYgKGtleUNvZGUgPT09IExFRlRfQVJST1cpIHtcbiAqICAgICB2YWx1ZSA9IDI1NTtcbiAqICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBSSUdIVF9BUlJPVykge1xuICogICAgIHZhbHVlID0gMDtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24ga2V5UHJlc3NlZCgpIHtcbiAqICAgLy8gRG8gc29tZXRoaW5nXG4gKiAgIHJldHVybiBmYWxzZTsgLy8gcHJldmVudCBhbnkgZGVmYXVsdCBiZWhhdmlvdXJcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGJsYWNrIHJlY3QgY2VudGVyLiB0dXJucyB3aGl0ZSB3aGVuIGtleSBwcmVzc2VkIGFuZCBibGFjayB3aGVuIHJlbGVhc2VkXG4gKiBibGFjayByZWN0IGNlbnRlci4gdHVybnMgd2hpdGUgd2hlbiBsZWZ0IGFycm93IHByZXNzZWQgYW5kIGJsYWNrIHdoZW4gcmlnaHQuXG4gKlxuICovXG5wNS5wcm90b3R5cGUuX29ua2V5ZG93biA9IGZ1bmN0aW9uKGUpIHtcbiAgaWYgKGRvd25LZXlzW2Uud2hpY2hdKSB7XG4gICAgLy8gcHJldmVudCBtdWx0aXBsZSBmaXJpbmdzXG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuX3NldFByb3BlcnR5KCdpc0tleVByZXNzZWQnLCB0cnVlKTtcbiAgdGhpcy5fc2V0UHJvcGVydHkoJ2tleUlzUHJlc3NlZCcsIHRydWUpO1xuICB0aGlzLl9zZXRQcm9wZXJ0eSgna2V5Q29kZScsIGUud2hpY2gpO1xuICBkb3duS2V5c1tlLndoaWNoXSA9IHRydWU7XG4gIHZhciBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGUud2hpY2gpO1xuICBpZiAoIWtleSkge1xuICAgIGtleSA9IGUud2hpY2g7XG4gIH1cbiAgdGhpcy5fc2V0UHJvcGVydHkoJ2tleScsIGtleSk7XG4gIHZhciBrZXlQcmVzc2VkID0gdGhpcy5rZXlQcmVzc2VkIHx8IHdpbmRvdy5rZXlQcmVzc2VkO1xuICBpZiAodHlwZW9mIGtleVByZXNzZWQgPT09ICdmdW5jdGlvbicgJiYgIWUuY2hhckNvZGUpIHtcbiAgICB2YXIgZXhlY3V0ZURlZmF1bHQgPSBrZXlQcmVzc2VkKGUpO1xuICAgIGlmIChleGVjdXRlRGVmYXVsdCA9PT0gZmFsc2UpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn07XG4vKipcbiAqIFRoZSBrZXlSZWxlYXNlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGV2ZXJ5IHRpbWUgYSBrZXkgaXMgcmVsZWFzZWQuXG4gKiBTZWUga2V5IGFuZCBrZXlDb2RlIGZvciBtb3JlIGluZm9ybWF0aW9uLjxicj48YnI+XG4gKiBCcm93c2VycyBtYXkgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdFxuICogYmVoYXZpb3JzIGF0dGFjaGVkIHRvIHZhcmlvdXMga2V5IGV2ZW50cy4gVG8gcHJldmVudCBhbnkgZGVmYXVsdFxuICogYmVoYXZpb3IgZm9yIHRoaXMgZXZlbnQsIGFkZCBcInJldHVybiBmYWxzZVwiIHRvIHRoZSBlbmQgb2YgdGhlIG1ldGhvZC5cbiAqXG4gKiBAbWV0aG9kIGtleVJlbGVhc2VkXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIHZhbHVlID0gMDtcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGZpbGwodmFsdWUpO1xuICogICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIGtleVJlbGVhc2VkKCkge1xuICogICBpZiAodmFsdWUgPT09IDApIHtcbiAqICAgICB2YWx1ZSA9IDI1NTtcbiAqICAgfSBlbHNlIHtcbiAqICAgICB2YWx1ZSA9IDA7XG4gKiAgIH1cbiAqICAgcmV0dXJuIGZhbHNlOyAvLyBwcmV2ZW50IGFueSBkZWZhdWx0IGJlaGF2aW9yXG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBibGFjayByZWN0IGNlbnRlci4gdHVybnMgd2hpdGUgd2hlbiBrZXkgcHJlc3NlZCBhbmQgYmxhY2sgd2hlbiBwcmVzc2VkIGFnYWluXG4gKlxuICovXG5wNS5wcm90b3R5cGUuX29ua2V5dXAgPSBmdW5jdGlvbihlKSB7XG4gIHZhciBrZXlSZWxlYXNlZCA9IHRoaXMua2V5UmVsZWFzZWQgfHwgd2luZG93LmtleVJlbGVhc2VkO1xuICBkb3duS2V5c1tlLndoaWNoXSA9IGZhbHNlO1xuXG4gIGlmICghYXJlRG93bktleXMoKSkge1xuICAgIHRoaXMuX3NldFByb3BlcnR5KCdpc0tleVByZXNzZWQnLCBmYWxzZSk7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ2tleUlzUHJlc3NlZCcsIGZhbHNlKTtcbiAgfVxuXG4gIHRoaXMuX3NldFByb3BlcnR5KCdfbGFzdEtleUNvZGVUeXBlZCcsIG51bGwpO1xuXG4gIHZhciBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGUud2hpY2gpO1xuICBpZiAoIWtleSkge1xuICAgIGtleSA9IGUud2hpY2g7XG4gIH1cbiAgdGhpcy5fc2V0UHJvcGVydHkoJ2tleScsIGtleSk7XG4gIHRoaXMuX3NldFByb3BlcnR5KCdrZXlDb2RlJywgZS53aGljaCk7XG4gIGlmICh0eXBlb2Yga2V5UmVsZWFzZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXhlY3V0ZURlZmF1bHQgPSBrZXlSZWxlYXNlZChlKTtcbiAgICBpZiAoZXhlY3V0ZURlZmF1bHQgPT09IGZhbHNlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFRoZSBrZXlUeXBlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGV2ZXJ5IHRpbWUgYSBrZXkgaXMgcHJlc3NlZCwgYnV0XG4gKiBhY3Rpb24ga2V5cyBzdWNoIGFzIEN0cmwsIFNoaWZ0LCBhbmQgQWx0IGFyZSBpZ25vcmVkLiBUaGUgbW9zdCByZWNlbnRcbiAqIGtleSBwcmVzc2VkIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBrZXkgdmFyaWFibGUuXG4gKiA8YnI+PGJyPlxuICogQmVjYXVzZSBvZiBob3cgb3BlcmF0aW5nIHN5c3RlbXMgaGFuZGxlIGtleSByZXBlYXRzLCBob2xkaW5nIGRvd24gYSBrZXlcbiAqIHdpbGwgY2F1c2UgbXVsdGlwbGUgY2FsbHMgdG8ga2V5VHlwZWQoKSAoYW5kIGtleVJlbGVhc2VkKCkgYXMgd2VsbCkuIFRoZVxuICogcmF0ZSBvZiByZXBlYXQgaXMgc2V0IGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBob3cgZWFjaCBjb21wdXRlciBpc1xuICogY29uZmlndXJlZC48YnI+PGJyPlxuICogQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHQgYmVoYXZpb3JzIGF0dGFjaGVkIHRvIHZhcmlvdXMga2V5XG4gKiBldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHQgYmVoYXZpb3IgZm9yIHRoaXMgZXZlbnQsIGFkZCBcInJldHVybiBmYWxzZVwiXG4gKiB0byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuXG4gKlxuICogQG1ldGhvZCBrZXlUeXBlZFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciB2YWx1ZSA9IDA7XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBmaWxsKHZhbHVlKTtcbiAqICAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XG4gKiB9XG4gKiBmdW5jdGlvbiBrZXlUeXBlZCgpIHtcbiAqICAgaWYgKGtleSA9PT0gJ2EnKSB7XG4gKiAgICAgdmFsdWUgPSAyNTU7XG4gKiAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYicpIHtcbiAqICAgICB2YWx1ZSA9IDA7XG4gKiAgIH1cbiAqICAgLy8gdW5jb21tZW50IHRvIHByZXZlbnQgYW55IGRlZmF1bHQgYmVoYXZpb3JcbiAqICAgLy8gcmV0dXJuIGZhbHNlO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogYmxhY2sgcmVjdCBjZW50ZXIuIHR1cm5zIHdoaXRlIHdoZW4gJ2EnIGtleSB0eXBlZCBhbmQgYmxhY2sgd2hlbiAnYicgcHJlc3NlZFxuICpcbiAqL1xucDUucHJvdG90eXBlLl9vbmtleXByZXNzID0gZnVuY3Rpb24oZSkge1xuICBpZiAoZS53aGljaCA9PT0gdGhpcy5fbGFzdEtleUNvZGVUeXBlZCkge1xuICAgIC8vIHByZXZlbnQgbXVsdGlwbGUgZmlyaW5nc1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLl9zZXRQcm9wZXJ0eSgna2V5Q29kZScsIGUud2hpY2gpO1xuICB0aGlzLl9zZXRQcm9wZXJ0eSgnX2xhc3RLZXlDb2RlVHlwZWQnLCBlLndoaWNoKTsgLy8gdHJhY2sgbGFzdCBrZXlDb2RlXG4gIHRoaXMuX3NldFByb3BlcnR5KCdrZXknLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGUud2hpY2gpKTtcbiAgdmFyIGtleVR5cGVkID0gdGhpcy5rZXlUeXBlZCB8fCB3aW5kb3cua2V5VHlwZWQ7XG4gIGlmICh0eXBlb2Yga2V5VHlwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXhlY3V0ZURlZmF1bHQgPSBrZXlUeXBlZChlKTtcbiAgICBpZiAoZXhlY3V0ZURlZmF1bHQgPT09IGZhbHNlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG59O1xuLyoqXG4gKiBUaGUgb25ibHVyIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGlzIG5vIGxvbmdlciBmb2N1c2VkXG4gKiBvbiB0aGUgcDUgZWxlbWVudC4gQmVjYXVzZSB0aGUga2V5dXAgZXZlbnRzIHdpbGwgbm90IGZpcmUgaWYgdGhlIHVzZXIgaXNcbiAqIG5vdCBmb2N1c2VkIG9uIHRoZSBlbGVtZW50IHdlIG11c3QgYXNzdW1lIGFsbCBrZXlzIGN1cnJlbnRseSBkb3duIGhhdmVcbiAqIGJlZW4gcmVsZWFzZWQuXG4gKi9cbnA1LnByb3RvdHlwZS5fb25ibHVyID0gZnVuY3Rpb24oZSkge1xuICBkb3duS2V5cyA9IHt9O1xufTtcblxuLyoqXG4gKiBUaGUga2V5SXNEb3duKCkgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBrZXkgaXMgY3VycmVudGx5IGRvd24sIGkuZS4gcHJlc3NlZC5cbiAqIEl0IGNhbiBiZSB1c2VkIGlmIHlvdSBoYXZlIGFuIG9iamVjdCB0aGF0IG1vdmVzLCBhbmQgeW91IHdhbnQgc2V2ZXJhbCBrZXlzXG4gKiB0byBiZSBhYmxlIHRvIGFmZmVjdCBpdHMgYmVoYXZpb3VyIHNpbXVsdGFuZW91c2x5LCBzdWNoIGFzIG1vdmluZyBhXG4gKiBzcHJpdGUgZGlhZ29uYWxseS4gWW91IGNhbiBwdXQgaW4gYW55IG51bWJlciByZXByZXNlbnRpbmcgdGhlIGtleUNvZGUgb2ZcbiAqIHRoZSBrZXksIG9yIHVzZSBhbnkgb2YgdGhlIHZhcmlhYmxlIGtleUNvZGUgbmFtZXMgbGlzdGVkXG4gKiA8YSBocmVmPVwiaHR0cDovL3A1anMub3JnL3JlZmVyZW5jZS8jcDUva2V5Q29kZVwiPmhlcmU8L2E+LlxuICpcbiAqIEBtZXRob2Qga2V5SXNEb3duXG4gKiBAcGFyYW0ge051bWJlcn0gICAgICAgICAgY29kZSBUaGUga2V5IHRvIGNoZWNrIGZvci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICB3aGV0aGVyIGtleSBpcyBkb3duIG9yIG5vdFxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgeCA9IDEwMDtcbiAqIHZhciB5ID0gMTAwO1xuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoNTEyLCA1MTIpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGlmIChrZXlJc0Rvd24oTEVGVF9BUlJPVykpIHtcbiAqICAgICB4IC09IDU7XG4gKiAgIH1cbiAqXG4gKiAgIGlmIChrZXlJc0Rvd24oUklHSFRfQVJST1cpKSB7XG4gKiAgICAgeCArPSA1O1xuICogICB9XG4gKlxuICogICBpZiAoa2V5SXNEb3duKFVQX0FSUk9XKSkge1xuICogICAgIHkgLT0gNTtcbiAqICAgfVxuICpcbiAqICAgaWYgKGtleUlzRG93bihET1dOX0FSUk9XKSkge1xuICogICAgIHkgKz0gNTtcbiAqICAgfVxuICpcbiAqICAgY2xlYXIoKTtcbiAqICAgZmlsbCgyNTUsIDAsIDApO1xuICogICBlbGxpcHNlKHgsIHksIDUwLCA1MCk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogNTB4NTAgcmVkIGVsbGlwc2UgbW92ZXMgbGVmdCwgcmlnaHQsIHVwIGFuZCBkb3duIHdpdGggYXJyb3cgcHJlc3Nlcy5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5rZXlJc0Rvd24gPSBmdW5jdGlvbihjb2RlKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2tleUlzRG93bicsIGFyZ3VtZW50cyk7XG4gIHJldHVybiBkb3duS2V5c1tjb2RlXTtcbn07XG5cbi8qKlxuICogVGhlIGNoZWNrRG93bktleXMgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gdHJ1ZSBpZiBhbnkga2V5cyBwcmVzc2VkXG4gKiBhbmQgYSBmYWxzZSBpZiBubyBrZXlzIGFyZSBjdXJyZW50bHkgcHJlc3NlZC5cblxuICogSGVscHMgYXZvaWQgaW5zdGFuY2VzIHdoZXJlIGEgbXVsdGlwbGUga2V5cyBhcmUgcHJlc3NlZCBzaW11bHRhbmVvdXNseSBhbmRcbiAqIHJlbGVhc2luZyBhIHNpbmdsZSBrZXkgd2lsbCB0aGVuIHN3aXRjaCB0aGVcbiAqIGtleUlzUHJlc3NlZCBwcm9wZXJ0eSB0byB0cnVlLlxuICogQHByaXZhdGVcbioqL1xuZnVuY3Rpb24gYXJlRG93bktleXMoKSB7XG4gIGZvciAodmFyIGtleSBpbiBkb3duS2V5cykge1xuICAgIGlmIChkb3duS2V5cy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGRvd25LZXlzW2tleV0gPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSwzOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgRXZlbnRzXG4gKiBAc3VibW9kdWxlIE1vdXNlXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICogQHJlcXVpcmVzIGNvbnN0YW50c1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG52YXIgY29uc3RhbnRzID0gX2RlcmVxXygnLi4vY29yZS9jb25zdGFudHMnKTtcblxuLypcbiAqIFRoaXMgaXMgYSBmbGFnIHdoaWNoIGlzIGZhbHNlIHVudGlsIHRoZSBmaXJzdCB0aW1lXG4gKiB3ZSByZWNlaXZlIGEgbW91c2UgZXZlbnQuIFRoZSBwbW91c2VYIGFuZCBwbW91c2VZXG4gKiB2YWx1ZXMgd2lsbCBtYXRjaCB0aGUgbW91c2VYIGFuZCBtb3VzZVkgdmFsdWVzIHVudGlsXG4gKiB0aGlzIGludGVyYWN0aW9uIHRha2VzIHBsYWNlLlxuICovXG5wNS5wcm90b3R5cGUuX2hhc01vdXNlSW50ZXJhY3RlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgbW91c2VYIGFsd2F5cyBjb250YWlucyB0aGUgY3VycmVudCBob3Jpem9udGFsXG4gKiBwb3NpdGlvbiBvZiB0aGUgbW91c2UsIHJlbGF0aXZlIHRvICgwLCAwKSBvZiB0aGUgY2FudmFzLiBJZiB0b3VjaCBpc1xuICogdXNlZCBpbnN0ZWFkIG9mIG1vdXNlIGlucHV0LCBtb3VzZVggd2lsbCBob2xkIHRoZSB4IHZhbHVlIG9mIHRoZSBtb3N0XG4gKiByZWNlbnQgdG91Y2ggcG9pbnQuXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1vdXNlWFxuICogQHJlYWRPbmx5XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIE1vdmUgdGhlIG1vdXNlIGFjcm9zcyB0aGUgY2FudmFzXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDI0NCwgMjQ4LCAyNTIpO1xuICogICBsaW5lKG1vdXNlWCwgMCwgbW91c2VYLCAxMDApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogaG9yaXpvbnRhbCBibGFjayBsaW5lIG1vdmVzIGxlZnQgYW5kIHJpZ2h0IHdpdGggbW91c2UgeC1wb3NpdGlvblxuICpcbiAqL1xucDUucHJvdG90eXBlLm1vdXNlWCA9IDA7XG5cbi8qKlxuICogVGhlIHN5c3RlbSB2YXJpYWJsZSBtb3VzZVkgYWx3YXlzIGNvbnRhaW5zIHRoZSBjdXJyZW50IHZlcnRpY2FsIHBvc2l0aW9uXG4gKiBvZiB0aGUgbW91c2UsIHJlbGF0aXZlIHRvICgwLCAwKSBvZiB0aGUgY2FudmFzLiBJZiB0b3VjaCBpc1xuICogdXNlZCBpbnN0ZWFkIG9mIG1vdXNlIGlucHV0LCBtb3VzZVkgd2lsbCBob2xkIHRoZSB5IHZhbHVlIG9mIHRoZSBtb3N0XG4gKiByZWNlbnQgdG91Y2ggcG9pbnQuXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1vdXNlWVxuICogQHJlYWRPbmx5XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIE1vdmUgdGhlIG1vdXNlIGFjcm9zcyB0aGUgY2FudmFzXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDI0NCwgMjQ4LCAyNTIpO1xuICogICBsaW5lKDAsIG1vdXNlWSwgMTAwLCBtb3VzZVkpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogdmVydGljYWwgYmxhY2sgbGluZSBtb3ZlcyB1cCBhbmQgZG93biB3aXRoIG1vdXNlIHktcG9zaXRpb25cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5tb3VzZVkgPSAwO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgcG1vdXNlWCBhbHdheXMgY29udGFpbnMgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2ZcbiAqIHRoZSBtb3VzZSBvciBmaW5nZXIgaW4gdGhlIGZyYW1lIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IGZyYW1lLCByZWxhdGl2ZSB0b1xuICogKDAsIDApIG9mIHRoZSBjYW52YXMuXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHBtb3VzZVhcbiAqIEByZWFkT25seVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBNb3ZlIHRoZSBtb3VzZSBhY3Jvc3MgdGhlIGNhbnZhcyB0byBsZWF2ZSBhIHRyYWlsXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgLy9zbG93IGRvd24gdGhlIGZyYW1lUmF0ZSB0byBtYWtlIGl0IG1vcmUgdmlzaWJsZVxuICogICBmcmFtZVJhdGUoMTApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQ0LCAyNDgsIDI1Mik7XG4gKiAgIGxpbmUobW91c2VYLCBtb3VzZVksIHBtb3VzZVgsIHBtb3VzZVkpO1xuICogICBwcmludChwbW91c2VYICsgJyAtPiAnICsgbW91c2VYKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGxpbmUgdHJhaWwgaXMgY3JlYXRlZCBmcm9tIGN1cnNvciBtb3ZlbWVudHMuIGZhc3RlciBtb3ZlbWVudCBtYWtlIGxvbmdlciBsaW5lLlxuICpcbiAqL1xucDUucHJvdG90eXBlLnBtb3VzZVggPSAwO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgcG1vdXNlWSBhbHdheXMgY29udGFpbnMgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZVxuICogbW91c2Ugb3IgZmluZ2VyIGluIHRoZSBmcmFtZSBwcmV2aW91cyB0byB0aGUgY3VycmVudCBmcmFtZSwgcmVsYXRpdmUgdG9cbiAqICgwLCAwKSBvZiB0aGUgY2FudmFzLlxuICpcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwbW91c2VZXG4gKiBAcmVhZE9ubHlcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMzcsIDM0LCA5Myk7XG4gKiAgIGZpbGwoMCk7XG4gKiAgIC8vZHJhdyBhIHNxdWFyZSBvbmx5IGlmIHRoZSBtb3VzZSBpcyBub3QgbW92aW5nXG4gKiAgIGlmIChtb3VzZVkgPT09IHBtb3VzZVkgJiYgbW91c2VYID09PSBwbW91c2VYKSB7XG4gKiAgICAgcmVjdCgyMCwgMjAsIDYwLCA2MCk7XG4gKiAgIH1cbiAqXG4gKiAgIHByaW50KHBtb3VzZVkgKyAnIC0+ICcgKyBtb3VzZVkpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogNjB4NjAgYmxhY2sgcmVjdCBjZW50ZXIsIGZ1c2NoaWEgYmFja2dyb3VuZC4gcmVjdCBmbGlja2VycyBvbiBtb3VzZSBtb3ZlbWVudFxuICpcbiAqL1xucDUucHJvdG90eXBlLnBtb3VzZVkgPSAwO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgd2luTW91c2VYIGFsd2F5cyBjb250YWlucyB0aGUgY3VycmVudCBob3Jpem9udGFsXG4gKiBwb3NpdGlvbiBvZiB0aGUgbW91c2UsIHJlbGF0aXZlIHRvICgwLCAwKSBvZiB0aGUgd2luZG93LlxuICpcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB3aW5Nb3VzZVhcbiAqIEByZWFkT25seVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgbXlDYW52YXM7XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIC8vdXNlIGEgdmFyaWFibGUgdG8gc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBjYW52YXNcbiAqICAgbXlDYW52YXMgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjM3LCAzNCwgOTMpO1xuICogICBmaWxsKDApO1xuICpcbiAqICAgLy9tb3ZlIHRoZSBjYW52YXMgdG8gdGhlIGhvcml6b250YWwgbW91c2UgcG9zaXRpb25cbiAqICAgLy9yZWxhICAgICAgICAgICAgICAgICAgICB0aXZlIHRvIHRoZSB3aW5kb3dcbiAqICAgbXlDYW52YXMucG9zaXRpb24od2luTW91c2VYICsgMSwgd2luZG93SGVpZ2h0IC8gMik7XG4gKlxuICogICAvL3RoZSB5IG9mIHRoZSBzcXVhcmUgaXMgcmVsYXRpdmUgdG8gdGhlIGNhbnZhc1xuICogICByZWN0KDIwLCBtb3VzZVksIDYwLCA2MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiA2MHg2MCBibGFjayByZWN0IHkgbW92ZXMgd2l0aCBtb3VzZSB5IGFuZCBmdXNjaGlhIGNhbnZhcyBtb3ZlcyB3aXRoIG1vdXNlIHhcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS53aW5Nb3VzZVggPSAwO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgd2luTW91c2VZIGFsd2F5cyBjb250YWlucyB0aGUgY3VycmVudCB2ZXJ0aWNhbFxuICogcG9zaXRpb24gb2YgdGhlIG1vdXNlLCByZWxhdGl2ZSB0byAoMCwgMCkgb2YgdGhlIHdpbmRvdy5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gd2luTW91c2VZXG4gKiBAcmVhZE9ubHlcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIG15Q2FudmFzO1xuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICAvL3VzZSBhIHZhcmlhYmxlIHRvIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgY2FudmFzXG4gKiAgIG15Q2FudmFzID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIzNywgMzQsIDkzKTtcbiAqICAgZmlsbCgwKTtcbiAqXG4gKiAgIC8vbW92ZSB0aGUgY2FudmFzIHRvIHRoZSB2ZXJ0aWNhbCBtb3VzZSBwb3NpdGlvblxuICogICAvL3JlbCAgICAgICAgICAgICAgICAgICAgYXRpdmUgdG8gdGhlIHdpbmRvd1xuICogICBteUNhbnZhcy5wb3NpdGlvbih3aW5kb3dXaWR0aCAvIDIsIHdpbk1vdXNlWSArIDEpO1xuICpcbiAqICAgLy90aGUgeCBvZiB0aGUgc3F1YXJlIGlzIHJlbGF0aXZlIHRvIHRoZSBjYW52YXNcbiAqICAgcmVjdChtb3VzZVgsIDIwLCA2MCwgNjApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogNjB4NjAgYmxhY2sgcmVjdCB4IG1vdmVzIHdpdGggbW91c2UgeCBhbmQgZnVzY2hpYSBjYW52YXMgeSBtb3ZlcyB3aXRoIG1vdXNlIHlcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS53aW5Nb3VzZVkgPSAwO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdmFyaWFibGUgcHdpbk1vdXNlWCBhbHdheXMgY29udGFpbnMgdGhlIGhvcml6b250YWwgcG9zaXRpb25cbiAqIG9mIHRoZSBtb3VzZSBpbiB0aGUgZnJhbWUgcHJldmlvdXMgdG8gdGhlIGN1cnJlbnQgZnJhbWUsIHJlbGF0aXZlIHRvXG4gKiAoMCwgMCkgb2YgdGhlIHdpbmRvdy5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gcHdpbk1vdXNlWFxuICogQHJlYWRPbmx5XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBteUNhbnZhcztcbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgLy91c2UgYSB2YXJpYWJsZSB0byBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGNhbnZhc1xuICogICBteUNhbnZhcyA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIGZpbGwoMjM3LCAzNCwgOTMpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGNsZWFyKCk7XG4gKiAgIC8vdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwcmV2aW91cyBhbmRcbiAqICAgLy9jdXJyZW50IHggcG9zaXRpb24gaXMgdGhlIGhvcml6b250YWwgbW91c2Ugc3BlZWRcbiAqICAgdmFyIHNwZWVkID0gYWJzKHdpbk1vdXNlWCAtIHB3aW5Nb3VzZVgpO1xuICogICAvL2NoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgY2lyY2xlXG4gKiAgIC8vYWNjb3JkaW5nIHRvIHRoZSBob3Jpem9udGFsIHNwZWVkXG4gKiAgIGVsbGlwc2UoNTAsIDUwLCAxMCArIHNwZWVkICogNSwgMTAgKyBzcGVlZCAqIDUpO1xuICogICAvL21vdmUgdGhlIGNhbnZhcyB0byB0aGUgbW91c2UgcG9zaXRpb25cbiAqICAgbXlDYW52YXMucG9zaXRpb24od2luTW91c2VYICsgMSwgd2luTW91c2VZICsgMSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBmdXNjaGlhIGVsbGlwc2UgbW92ZXMgd2l0aCBtb3VzZSB4IGFuZCB5LiBHcm93cyBhbmQgc2hyaW5rcyB3aXRoIG1vdXNlIHNwZWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUucHdpbk1vdXNlWCA9IDA7XG5cbi8qKlxuICogVGhlIHN5c3RlbSB2YXJpYWJsZSBwd2luTW91c2VZIGFsd2F5cyBjb250YWlucyB0aGUgdmVydGljYWwgcG9zaXRpb24gb2ZcbiAqIHRoZSBtb3VzZSBpbiB0aGUgZnJhbWUgcHJldmlvdXMgdG8gdGhlIGN1cnJlbnQgZnJhbWUsIHJlbGF0aXZlIHRvICgwLCAwKVxuICogb2YgdGhlIHdpbmRvdy5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gcHdpbk1vdXNlWVxuICogQHJlYWRPbmx5XG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgbXlDYW52YXM7XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIC8vdXNlIGEgdmFyaWFibGUgdG8gc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBjYW52YXNcbiAqICAgbXlDYW52YXMgPSBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBub1N0cm9rZSgpO1xuICogICBmaWxsKDIzNywgMzQsIDkzKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBjbGVhcigpO1xuICogICAvL3RoZSBkaWZmZXJlbmNlIGJldHdlZW4gcHJldmlvdXMgYW5kXG4gKiAgIC8vY3VycmVudCB5IHBvc2l0aW9uIGlzIHRoZSB2ZXJ0aWNhbCBtb3VzZSBzcGVlZFxuICogICB2YXIgc3BlZWQgPSBhYnMod2luTW91c2VZIC0gcHdpbk1vdXNlWSk7XG4gKiAgIC8vY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBjaXJjbGVcbiAqICAgLy9hY2NvcmRpbmcgdG8gdGhlIHZlcnRpY2FsIHNwZWVkXG4gKiAgIGVsbGlwc2UoNTAsIDUwLCAxMCArIHNwZWVkICogNSwgMTAgKyBzcGVlZCAqIDUpO1xuICogICAvL21vdmUgdGhlIGNhbnZhcyB0byB0aGUgbW91c2UgcG9zaXRpb25cbiAqICAgbXlDYW52YXMucG9zaXRpb24od2luTW91c2VYICsgMSwgd2luTW91c2VZICsgMSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBmdXNjaGlhIGVsbGlwc2UgbW92ZXMgd2l0aCBtb3VzZSB4IGFuZCB5LiBHcm93cyBhbmQgc2hyaW5rcyB3aXRoIG1vdXNlIHNwZWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUucHdpbk1vdXNlWSA9IDA7XG5cbi8qKlxuICogUHJvY2Vzc2luZyBhdXRvbWF0aWNhbGx5IHRyYWNrcyBpZiB0aGUgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgYW5kIHdoaWNoXG4gKiBidXR0b24gaXMgcHJlc3NlZC4gVGhlIHZhbHVlIG9mIHRoZSBzeXN0ZW0gdmFyaWFibGUgbW91c2VCdXR0b24gaXMgZWl0aGVyXG4gKiBMRUZULCBSSUdIVCwgb3IgQ0VOVEVSIGRlcGVuZGluZyBvbiB3aGljaCBidXR0b24gd2FzIHByZXNzZWQgbGFzdC5cbiAqIFdhcm5pbmc6IGRpZmZlcmVudCBicm93c2VycyBtYXkgdHJhY2sgbW91c2VCdXR0b24gZGlmZmVyZW50bHkuXG4gKlxuICogQHByb3BlcnR5IHtDb25zdGFudH0gbW91c2VCdXR0b25cbiAqIEByZWFkT25seVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIzNywgMzQsIDkzKTtcbiAqICAgZmlsbCgwKTtcbiAqXG4gKiAgIGlmIChtb3VzZUlzUHJlc3NlZCkge1xuICogICAgIGlmIChtb3VzZUJ1dHRvbiA9PT0gTEVGVCkge1xuICogICAgICAgZWxsaXBzZSg1MCwgNTAsIDUwLCA1MCk7XG4gKiAgICAgfVxuICogICAgIGlmIChtb3VzZUJ1dHRvbiA9PT0gUklHSFQpIHtcbiAqICAgICAgIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xuICogICAgIH1cbiAqICAgICBpZiAobW91c2VCdXR0b24gPT09IENFTlRFUikge1xuICogICAgICAgdHJpYW5nbGUoMjMsIDc1LCA1MCwgMjAsIDc4LCA3NSk7XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICBwcmludChtb3VzZUJ1dHRvbik7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiA1MHg1MCBibGFjayBlbGxpcHNlIGFwcGVhcnMgb24gY2VudGVyIG9mIGZ1c2NoaWEgY2FudmFzIG9uIG1vdXNlIGNsaWNrL3ByZXNzLlxuICpcbiAqL1xucDUucHJvdG90eXBlLm1vdXNlQnV0dG9uID0gMDtcblxuLyoqXG4gKiBUaGUgYm9vbGVhbiBzeXN0ZW0gdmFyaWFibGUgbW91c2VJc1ByZXNzZWQgaXMgdHJ1ZSBpZiB0aGUgbW91c2UgaXMgcHJlc3NlZFxuICogYW5kIGZhbHNlIGlmIG5vdC5cbiAqXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IG1vdXNlSXNQcmVzc2VkXG4gKiBAcmVhZE9ubHlcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMzcsIDM0LCA5Myk7XG4gKiAgIGZpbGwoMCk7XG4gKlxuICogICBpZiAobW91c2VJc1ByZXNzZWQpIHtcbiAqICAgICBlbGxpcHNlKDUwLCA1MCwgNTAsIDUwKTtcbiAqICAgfSBlbHNlIHtcbiAqICAgICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcbiAqICAgfVxuICpcbiAqICAgcHJpbnQobW91c2VJc1ByZXNzZWQpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogYmxhY2sgNTB4NTAgcmVjdCBiZWNvbWVzIGVsbGlwc2Ugd2l0aCBtb3VzZSBjbGljay9wcmVzcy4gZnVzY2hpYSBiYWNrZ3JvdW5kLlxuICpcbiAqL1xucDUucHJvdG90eXBlLm1vdXNlSXNQcmVzc2VkID0gZmFsc2U7XG5cbnA1LnByb3RvdHlwZS5fdXBkYXRlTmV4dE1vdXNlQ29vcmRzID0gZnVuY3Rpb24oZSkge1xuICBpZiAodGhpcy5fY3VyRWxlbWVudCAhPT0gbnVsbCAmJiAoIWUudG91Y2hlcyB8fCBlLnRvdWNoZXMubGVuZ3RoID4gMCkpIHtcbiAgICB2YXIgbW91c2VQb3MgPSBnZXRNb3VzZVBvcyhcbiAgICAgIHRoaXMuX2N1ckVsZW1lbnQuZWx0LFxuICAgICAgdGhpcy53aWR0aCxcbiAgICAgIHRoaXMuaGVpZ2h0LFxuICAgICAgZVxuICAgICk7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ21vdXNlWCcsIG1vdXNlUG9zLngpO1xuICAgIHRoaXMuX3NldFByb3BlcnR5KCdtb3VzZVknLCBtb3VzZVBvcy55KTtcbiAgICB0aGlzLl9zZXRQcm9wZXJ0eSgnd2luTW91c2VYJywgbW91c2VQb3Mud2luWCk7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ3dpbk1vdXNlWScsIG1vdXNlUG9zLndpblkpO1xuICB9XG4gIGlmICghdGhpcy5faGFzTW91c2VJbnRlcmFjdGVkKSB7XG4gICAgLy8gRm9yIGZpcnN0IGRyYXcsIG1ha2UgcHJldmlvdXMgYW5kIG5leHQgZXF1YWxcbiAgICB0aGlzLl91cGRhdGVNb3VzZUNvb3JkcygpO1xuICAgIHRoaXMuX3NldFByb3BlcnR5KCdfaGFzTW91c2VJbnRlcmFjdGVkJywgdHJ1ZSk7XG4gIH1cbn07XG5cbnA1LnByb3RvdHlwZS5fdXBkYXRlTW91c2VDb29yZHMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fc2V0UHJvcGVydHkoJ3Btb3VzZVgnLCB0aGlzLm1vdXNlWCk7XG4gIHRoaXMuX3NldFByb3BlcnR5KCdwbW91c2VZJywgdGhpcy5tb3VzZVkpO1xuICB0aGlzLl9zZXRQcm9wZXJ0eSgncHdpbk1vdXNlWCcsIHRoaXMud2luTW91c2VYKTtcbiAgdGhpcy5fc2V0UHJvcGVydHkoJ3B3aW5Nb3VzZVknLCB0aGlzLndpbk1vdXNlWSk7XG59O1xuXG5mdW5jdGlvbiBnZXRNb3VzZVBvcyhjYW52YXMsIHcsIGgsIGV2dCkge1xuICBpZiAoZXZ0ICYmICFldnQuY2xpZW50WCkge1xuICAgIC8vIHVzZSB0b3VjaGVzIGlmIHRvdWNoIGFuZCBub3QgbW91c2VcbiAgICBpZiAoZXZ0LnRvdWNoZXMpIHtcbiAgICAgIGV2dCA9IGV2dC50b3VjaGVzWzBdO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmNoYW5nZWRUb3VjaGVzKSB7XG4gICAgICBldnQgPSBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgfVxuICB9XG4gIHZhciByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc3ggPSBjYW52YXMuc2Nyb2xsV2lkdGggLyB3O1xuICB2YXIgc3kgPSBjYW52YXMuc2Nyb2xsSGVpZ2h0IC8gaDtcbiAgcmV0dXJuIHtcbiAgICB4OiAoZXZ0LmNsaWVudFggLSByZWN0LmxlZnQpIC8gc3gsXG4gICAgeTogKGV2dC5jbGllbnRZIC0gcmVjdC50b3ApIC8gc3ksXG4gICAgd2luWDogZXZ0LmNsaWVudFgsXG4gICAgd2luWTogZXZ0LmNsaWVudFksXG4gICAgaWQ6IGV2dC5pZGVudGlmaWVyXG4gIH07XG59XG5cbnA1LnByb3RvdHlwZS5fc2V0TW91c2VCdXR0b24gPSBmdW5jdGlvbihlKSB7XG4gIGlmIChlLmJ1dHRvbiA9PT0gMSkge1xuICAgIHRoaXMuX3NldFByb3BlcnR5KCdtb3VzZUJ1dHRvbicsIGNvbnN0YW50cy5DRU5URVIpO1xuICB9IGVsc2UgaWYgKGUuYnV0dG9uID09PSAyKSB7XG4gICAgdGhpcy5fc2V0UHJvcGVydHkoJ21vdXNlQnV0dG9uJywgY29uc3RhbnRzLlJJR0hUKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9zZXRQcm9wZXJ0eSgnbW91c2VCdXR0b24nLCBjb25zdGFudHMuTEVGVCk7XG4gIH1cbn07XG5cbi8qKlxuICogVGhlIG1vdXNlTW92ZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSB0aGUgbW91c2UgbW92ZXMgYW5kIGEgbW91c2VcbiAqIGJ1dHRvbiBpcyBub3QgcHJlc3NlZC48YnI+PGJyPlxuICogQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHRcbiAqIGJlaGF2aW9ycyBhdHRhY2hlZCB0byB2YXJpb3VzIG1vdXNlIGV2ZW50cy4gVG8gcHJldmVudCBhbnkgZGVmYXVsdFxuICogYmVoYXZpb3IgZm9yIHRoaXMgZXZlbnQsIGFkZCBcInJldHVybiBmYWxzZVwiIHRvIHRoZSBlbmQgb2YgdGhlIG1ldGhvZC5cbiAqXG4gKiBAbWV0aG9kIG1vdXNlTW92ZWRcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBNb3ZlIHRoZSBtb3VzZSBhY3Jvc3MgdGhlIHBhZ2VcbiAqIC8vIHRvIGNoYW5nZSBpdHMgdmFsdWVcbiAqXG4gKiB2YXIgdmFsdWUgPSAwO1xuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgZmlsbCh2YWx1ZSk7XG4gKiAgIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xuICogfVxuICogZnVuY3Rpb24gbW91c2VNb3ZlZCgpIHtcbiAqICAgdmFsdWUgPSB2YWx1ZSArIDU7XG4gKiAgIGlmICh2YWx1ZSA+IDI1NSkge1xuICogICAgIHZhbHVlID0gMDtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIG1vdXNlTW92ZWQoKSB7XG4gKiAgIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDUsIDUpO1xuICogICAvLyBwcmV2ZW50IGRlZmF1bHRcbiAqICAgcmV0dXJuIGZhbHNlO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogYmxhY2sgNTB4NTAgcmVjdCBiZWNvbWVzIGxpZ2h0ZXIgd2l0aCBtb3VzZSBtb3ZlbWVudHMgdW50aWwgd2hpdGUgdGhlbiByZXNldHNcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICpcbiAqL1xuXG4vKipcbiAqIFRoZSBtb3VzZURyYWdnZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBldmVyeSB0aW1lIHRoZSBtb3VzZSBtb3ZlcyBhbmRcbiAqIGEgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQuIElmIG5vIG1vdXNlRHJhZ2dlZCgpIGZ1bmN0aW9uIGlzIGRlZmluZWQsIHRoZVxuICogdG91Y2hNb3ZlZCgpIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluc3RlYWQgaWYgaXQgaXMgZGVmaW5lZC48YnI+PGJyPlxuICogQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHRcbiAqIGJlaGF2aW9ycyBhdHRhY2hlZCB0byB2YXJpb3VzIG1vdXNlIGV2ZW50cy4gVG8gcHJldmVudCBhbnkgZGVmYXVsdFxuICogYmVoYXZpb3IgZm9yIHRoaXMgZXZlbnQsIGFkZCBcInJldHVybiBmYWxzZVwiIHRvIHRoZSBlbmQgb2YgdGhlIG1ldGhvZC5cbiAqXG4gKiBAbWV0aG9kIG1vdXNlRHJhZ2dlZFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIERyYWcgdGhlIG1vdXNlIGFjcm9zcyB0aGUgcGFnZVxuICogLy8gdG8gY2hhbmdlIGl0cyB2YWx1ZVxuICpcbiAqIHZhciB2YWx1ZSA9IDA7XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBmaWxsKHZhbHVlKTtcbiAqICAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XG4gKiB9XG4gKiBmdW5jdGlvbiBtb3VzZURyYWdnZWQoKSB7XG4gKiAgIHZhbHVlID0gdmFsdWUgKyA1O1xuICogICBpZiAodmFsdWUgPiAyNTUpIHtcbiAqICAgICB2YWx1ZSA9IDA7XG4gKiAgIH1cbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBtb3VzZURyYWdnZWQoKSB7XG4gKiAgIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDUsIDUpO1xuICogICAvLyBwcmV2ZW50IGRlZmF1bHRcbiAqICAgcmV0dXJuIGZhbHNlO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogYmxhY2sgNTB4NTAgcmVjdCB0dXJucyBsaWdodGVyIHdpdGggbW91c2UgY2xpY2sgYW5kIGRyYWcgdW50aWwgd2hpdGUsIHJlc2V0c1xuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUuX29ubW91c2Vtb3ZlID0gZnVuY3Rpb24oZSkge1xuICB2YXIgY29udGV4dCA9IHRoaXMuX2lzR2xvYmFsID8gd2luZG93IDogdGhpcztcbiAgdmFyIGV4ZWN1dGVEZWZhdWx0O1xuICB0aGlzLl91cGRhdGVOZXh0TW91c2VDb29yZHMoZSk7XG4gIGlmICghdGhpcy5tb3VzZUlzUHJlc3NlZCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5tb3VzZU1vdmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBleGVjdXRlRGVmYXVsdCA9IGNvbnRleHQubW91c2VNb3ZlZChlKTtcbiAgICAgIGlmIChleGVjdXRlRGVmYXVsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGNvbnRleHQubW91c2VEcmFnZ2VkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBleGVjdXRlRGVmYXVsdCA9IGNvbnRleHQubW91c2VEcmFnZ2VkKGUpO1xuICAgICAgaWYgKGV4ZWN1dGVEZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dC50b3VjaE1vdmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBleGVjdXRlRGVmYXVsdCA9IGNvbnRleHQudG91Y2hNb3ZlZChlKTtcbiAgICAgIGlmIChleGVjdXRlRGVmYXVsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgbW91c2VQcmVzc2VkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYWZ0ZXIgZXZlcnkgdGltZSBhIG1vdXNlIGJ1dHRvblxuICogaXMgcHJlc3NlZC4gVGhlIG1vdXNlQnV0dG9uIHZhcmlhYmxlIChzZWUgdGhlIHJlbGF0ZWQgcmVmZXJlbmNlIGVudHJ5KVxuICogY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLiBJZiBub1xuICogbW91c2VQcmVzc2VkKCkgZnVuY3Rpb24gaXMgZGVmaW5lZCwgdGhlIHRvdWNoU3RhcnRlZCgpIGZ1bmN0aW9uIHdpbGwgYmVcbiAqIGNhbGxlZCBpbnN0ZWFkIGlmIGl0IGlzIGRlZmluZWQuPGJyPjxicj5cbiAqIEJyb3dzZXJzIG1heSBoYXZlIGRpZmZlcmVudCBkZWZhdWx0XG4gKiBiZWhhdmlvcnMgYXR0YWNoZWQgdG8gdmFyaW91cyBtb3VzZSBldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHRcbiAqIGJlaGF2aW9yIGZvciB0aGlzIGV2ZW50LCBhZGQgXCJyZXR1cm4gZmFsc2VcIiB0byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuXG4gKlxuICogQG1ldGhvZCBtb3VzZVByZXNzZWRcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBDbGljayB3aXRoaW4gdGhlIGltYWdlIHRvIGNoYW5nZVxuICogLy8gdGhlIHZhbHVlIG9mIHRoZSByZWN0YW5nbGVcbiAqXG4gKiB2YXIgdmFsdWUgPSAwO1xuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgZmlsbCh2YWx1ZSk7XG4gKiAgIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xuICogfVxuICogZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xuICogICBpZiAodmFsdWUgPT09IDApIHtcbiAqICAgICB2YWx1ZSA9IDI1NTtcbiAqICAgfSBlbHNlIHtcbiAqICAgICB2YWx1ZSA9IDA7XG4gKiAgIH1cbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XG4gKiAgIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDUsIDUpO1xuICogICAvLyBwcmV2ZW50IGRlZmF1bHRcbiAqICAgcmV0dXJuIGZhbHNlO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogYmxhY2sgNTB4NTAgcmVjdCB0dXJucyB3aGl0ZSB3aXRoIG1vdXNlIGNsaWNrL3ByZXNzLlxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUuX29ubW91c2Vkb3duID0gZnVuY3Rpb24oZSkge1xuICB2YXIgY29udGV4dCA9IHRoaXMuX2lzR2xvYmFsID8gd2luZG93IDogdGhpcztcbiAgdmFyIGV4ZWN1dGVEZWZhdWx0O1xuICB0aGlzLl9zZXRQcm9wZXJ0eSgnbW91c2VJc1ByZXNzZWQnLCB0cnVlKTtcbiAgdGhpcy5fc2V0TW91c2VCdXR0b24oZSk7XG4gIHRoaXMuX3VwZGF0ZU5leHRNb3VzZUNvb3JkcyhlKTtcbiAgaWYgKHR5cGVvZiBjb250ZXh0Lm1vdXNlUHJlc3NlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV4ZWN1dGVEZWZhdWx0ID0gY29udGV4dC5tb3VzZVByZXNzZWQoZSk7XG4gICAgaWYgKGV4ZWN1dGVEZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dC50b3VjaFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBleGVjdXRlRGVmYXVsdCA9IGNvbnRleHQudG91Y2hTdGFydGVkKGUpO1xuICAgIGlmIChleGVjdXRlRGVmYXVsdCA9PT0gZmFsc2UpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogVGhlIG1vdXNlUmVsZWFzZWQoKSBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSBhIG1vdXNlIGJ1dHRvbiBpc1xuICogcmVsZWFzZWQuIElmIG5vIG1vdXNlUmVsZWFzZWQoKSBmdW5jdGlvbiBpcyBkZWZpbmVkLCB0aGUgdG91Y2hFbmRlZCgpXG4gKiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpbnN0ZWFkIGlmIGl0IGlzIGRlZmluZWQuPGJyPjxicj5cbiAqIEJyb3dzZXJzIG1heSBoYXZlIGRpZmZlcmVudCBkZWZhdWx0XG4gKiBiZWhhdmlvcnMgYXR0YWNoZWQgdG8gdmFyaW91cyBtb3VzZSBldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHRcbiAqIGJlaGF2aW9yIGZvciB0aGlzIGV2ZW50LCBhZGQgXCJyZXR1cm4gZmFsc2VcIiB0byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuXG4gKlxuICpcbiAqIEBtZXRob2QgbW91c2VSZWxlYXNlZFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIENsaWNrIHdpdGhpbiB0aGUgaW1hZ2UgdG8gY2hhbmdlXG4gKiAvLyB0aGUgdmFsdWUgb2YgdGhlIHJlY3RhbmdsZVxuICogLy8gYWZ0ZXIgdGhlIG1vdXNlIGhhcyBiZWVuIGNsaWNrZWRcbiAqXG4gKiB2YXIgdmFsdWUgPSAwO1xuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgZmlsbCh2YWx1ZSk7XG4gKiAgIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xuICogfVxuICogZnVuY3Rpb24gbW91c2VSZWxlYXNlZCgpIHtcbiAqICAgaWYgKHZhbHVlID09PSAwKSB7XG4gKiAgICAgdmFsdWUgPSAyNTU7XG4gKiAgIH0gZWxzZSB7XG4gKiAgICAgdmFsdWUgPSAwO1xuICogICB9XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gbW91c2VSZWxlYXNlZCgpIHtcbiAqICAgZWxsaXBzZShtb3VzZVgsIG1vdXNlWSwgNSwgNSk7XG4gKiAgIC8vIHByZXZlbnQgZGVmYXVsdFxuICogICByZXR1cm4gZmFsc2U7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBibGFjayA1MHg1MCByZWN0IHR1cm5zIHdoaXRlIHdpdGggbW91c2UgY2xpY2svcHJlc3MuXG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5fb25tb3VzZXVwID0gZnVuY3Rpb24oZSkge1xuICB2YXIgY29udGV4dCA9IHRoaXMuX2lzR2xvYmFsID8gd2luZG93IDogdGhpcztcbiAgdmFyIGV4ZWN1dGVEZWZhdWx0O1xuICB0aGlzLl9zZXRQcm9wZXJ0eSgnbW91c2VJc1ByZXNzZWQnLCBmYWxzZSk7XG4gIGlmICh0eXBlb2YgY29udGV4dC5tb3VzZVJlbGVhc2VkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXhlY3V0ZURlZmF1bHQgPSBjb250ZXh0Lm1vdXNlUmVsZWFzZWQoZSk7XG4gICAgaWYgKGV4ZWN1dGVEZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dC50b3VjaEVuZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXhlY3V0ZURlZmF1bHQgPSBjb250ZXh0LnRvdWNoRW5kZWQoZSk7XG4gICAgaWYgKGV4ZWN1dGVEZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufTtcblxucDUucHJvdG90eXBlLl9vbmRyYWdlbmQgPSBwNS5wcm90b3R5cGUuX29ubW91c2V1cDtcbnA1LnByb3RvdHlwZS5fb25kcmFnb3ZlciA9IHA1LnByb3RvdHlwZS5fb25tb3VzZW1vdmU7XG5cbi8qKlxuICogVGhlIG1vdXNlQ2xpY2tlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGFmdGVyIGEgbW91c2UgYnV0dG9uIGhhcyBiZWVuXG4gKiBwcmVzc2VkIGFuZCB0aGVuIHJlbGVhc2VkLjxicj48YnI+XG4gKiBCcm93c2VycyBoYW5kbGUgY2xpY2tzIGRpZmZlcmVudGx5LCBzbyB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZVxuICogcnVuIHdoZW4gdGhlIGxlZnQgbW91c2UgYnV0dG9uIGlzIGNsaWNrZWQuIFRvIGhhbmRsZSBvdGhlciBtb3VzZSBidXR0b25zXG4gKiBiZWluZyBwcmVzc2VkIG9yIHJlbGVhc2VkLCBzZWUgbW91c2VQcmVzc2VkKCkgb3IgbW91c2VSZWxlYXNlZCgpLjxicj48YnI+XG4gKiBCcm93c2VycyBtYXkgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdFxuICogYmVoYXZpb3JzIGF0dGFjaGVkIHRvIHZhcmlvdXMgbW91c2UgZXZlbnRzLiBUbyBwcmV2ZW50IGFueSBkZWZhdWx0XG4gKiBiZWhhdmlvciBmb3IgdGhpcyBldmVudCwgYWRkIFwicmV0dXJuIGZhbHNlXCIgdG8gdGhlIGVuZCBvZiB0aGUgbWV0aG9kLlxuICpcbiAqIEBtZXRob2QgbW91c2VDbGlja2VkXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gQ2xpY2sgd2l0aGluIHRoZSBpbWFnZSB0byBjaGFuZ2VcbiAqIC8vIHRoZSB2YWx1ZSBvZiB0aGUgcmVjdGFuZ2xlXG4gKiAvLyBhZnRlciB0aGUgbW91c2UgaGFzIGJlZW4gY2xpY2tlZFxuICpcbiAqIHZhciB2YWx1ZSA9IDA7XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBmaWxsKHZhbHVlKTtcbiAqICAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gbW91c2VDbGlja2VkKCkge1xuICogICBpZiAodmFsdWUgPT09IDApIHtcbiAqICAgICB2YWx1ZSA9IDI1NTtcbiAqICAgfSBlbHNlIHtcbiAqICAgICB2YWx1ZSA9IDA7XG4gKiAgIH1cbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XG4gKiAgIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDUsIDUpO1xuICogICAvLyBwcmV2ZW50IGRlZmF1bHRcbiAqICAgcmV0dXJuIGZhbHNlO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogYmxhY2sgNTB4NTAgcmVjdCB0dXJucyB3aGl0ZSB3aXRoIG1vdXNlIGNsaWNrL3ByZXNzLlxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUuX29uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gIHZhciBjb250ZXh0ID0gdGhpcy5faXNHbG9iYWwgPyB3aW5kb3cgOiB0aGlzO1xuICBpZiAodHlwZW9mIGNvbnRleHQubW91c2VDbGlja2VkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGV4ZWN1dGVEZWZhdWx0ID0gY29udGV4dC5tb3VzZUNsaWNrZWQoZSk7XG4gICAgaWYgKGV4ZWN1dGVEZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgZG91YmxlQ2xpY2tlZCgpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGV2ZXJ5IHRpbWUgYSBldmVudFxuICogbGlzdGVuZXIgaGFzIGRldGVjdGVkIGEgZGJsY2xpY2sgZXZlbnQgd2hpY2ggaXMgYSBwYXJ0IG9mIHRoZVxuICogRE9NIEwzIHNwZWNpZmljYXRpb24uIFRoZSBkb3VibGVDbGlja2VkIGV2ZW50IGlzIGZpcmVkIHdoZW4gYVxuICogcG9pbnRpbmcgZGV2aWNlIGJ1dHRvbiAodXN1YWxseSBhIG1vdXNlJ3MgcHJpbWFyeSBidXR0b24pXG4gKiBpcyBjbGlja2VkIHR3aWNlIG9uIGEgc2luZ2xlIGVsZW1lbnQuIEZvciBtb3JlIGluZm8gb24gdGhlXG4gKiBkYmxjbGljayBldmVudCByZWZlciB0byBtb3ppbGxhJ3MgZG9jdW1lbnRhdGlvbiBoZXJlOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2RibGNsaWNrXG4gKlxuICogQG1ldGhvZCBkb3VibGVDbGlja2VkXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gQ2xpY2sgd2l0aGluIHRoZSBpbWFnZSB0byBjaGFuZ2VcbiAqIC8vIHRoZSB2YWx1ZSBvZiB0aGUgcmVjdGFuZ2xlXG4gKiAvLyBhZnRlciB0aGUgbW91c2UgaGFzIGJlZW4gZG91YmxlIGNsaWNrZWRcbiAqXG4gKiB2YXIgdmFsdWUgPSAwO1xuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgZmlsbCh2YWx1ZSk7XG4gKiAgIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRvdWJsZUNsaWNrZWQoKSB7XG4gKiAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICogICAgIHZhbHVlID0gMjU1O1xuICogICB9IGVsc2Uge1xuICogICAgIHZhbHVlID0gMDtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIGRvdWJsZUNsaWNrZWQoKSB7XG4gKiAgIGVsbGlwc2UobW91c2VYLCBtb3VzZVksIDUsIDUpO1xuICogICAvLyBwcmV2ZW50IGRlZmF1bHRcbiAqICAgcmV0dXJuIGZhbHNlO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogYmxhY2sgNTB4NTAgcmVjdCB0dXJucyB3aGl0ZSB3aXRoIG1vdXNlIGRvdWJsZUNsaWNrL3ByZXNzLlxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKi9cblxucDUucHJvdG90eXBlLl9vbmRibGNsaWNrID0gZnVuY3Rpb24oZSkge1xuICB2YXIgY29udGV4dCA9IHRoaXMuX2lzR2xvYmFsID8gd2luZG93IDogdGhpcztcbiAgaWYgKHR5cGVvZiBjb250ZXh0LmRvdWJsZUNsaWNrZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXhlY3V0ZURlZmF1bHQgPSBjb250ZXh0LmRvdWJsZUNsaWNrZWQoZSk7XG4gICAgaWYgKGV4ZWN1dGVEZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gbW91c2VXaGVlbCgpIGlzIGV4ZWN1dGVkIGV2ZXJ5IHRpbWUgYSB2ZXJ0aWNhbCBtb3VzZSB3aGVlbFxuICogZXZlbnQgaXMgZGV0ZWN0ZWQgZWl0aGVyIHRyaWdnZXJlZCBieSBhbiBhY3R1YWwgbW91c2Ugd2hlZWwgb3IgYnkgYVxuICogdG91Y2hwYWQuPGJyPjxicj5cbiAqIFRoZSBldmVudC5kZWx0YSBwcm9wZXJ0eSByZXR1cm5zIHRoZSBhbW91bnQgdGhlIG1vdXNlIHdoZWVsXG4gKiBoYXZlIHNjcm9sbGVkLiBUaGUgdmFsdWVzIGNhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBkZXBlbmRpbmcgb24gdGhlXG4gKiBzY3JvbGwgZGlyZWN0aW9uIChvbiBPUyBYIHdpdGggXCJuYXR1cmFsXCIgc2Nyb2xsaW5nIGVuYWJsZWQsIHRoZSBzaWduc1xuICogYXJlIGludmVydGVkKS48YnI+PGJyPlxuICogQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHQgYmVoYXZpb3JzIGF0dGFjaGVkIHRvIHZhcmlvdXNcbiAqIG1vdXNlIGV2ZW50cy4gVG8gcHJldmVudCBhbnkgZGVmYXVsdCBiZWhhdmlvciBmb3IgdGhpcyBldmVudCwgYWRkXG4gKiBcInJldHVybiBmYWxzZVwiIHRvIHRoZSBlbmQgb2YgdGhlIG1ldGhvZC48YnI+PGJyPlxuICogRHVlIHRvIHRoZSBjdXJyZW50IHN1cHBvcnQgb2YgdGhlIFwid2hlZWxcIiBldmVudCBvbiBTYWZhcmksIHRoZSBmdW5jdGlvblxuICogbWF5IG9ubHkgd29yayBhcyBleHBlY3RlZCBpZiBcInJldHVybiBmYWxzZVwiIGlzIGluY2x1ZGVkIHdoaWxlIHVzaW5nIFNhZmFyaS5cbiAqXG4gKiBAbWV0aG9kIG1vdXNlV2hlZWxcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIHBvcyA9IDI1O1xuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjM3LCAzNCwgOTMpO1xuICogICBmaWxsKDApO1xuICogICByZWN0KDI1LCBwb3MsIDUwLCA1MCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gbW91c2VXaGVlbChldmVudCkge1xuICogICBwcmludChldmVudC5kZWx0YSk7XG4gKiAgIC8vbW92ZSB0aGUgc3F1YXJlIGFjY29yZGluZyB0byB0aGUgdmVydGljYWwgc2Nyb2xsIGFtb3VudFxuICogICBwb3MgKz0gZXZlbnQuZGVsdGE7XG4gKiAgIC8vdW5jb21tZW50IHRvIGJsb2NrIHBhZ2Ugc2Nyb2xsaW5nXG4gKiAgIC8vcmV0dXJuIGZhbHNlO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogYmxhY2sgNTB4NTAgcmVjdCBtb3ZlcyB1cCBhbmQgZG93biB3aXRoIHZlcnRpY2FsIHNjcm9sbC4gZnVzY2hpYSBiYWNrZ3JvdW5kXG4gKlxuICovXG5wNS5wcm90b3R5cGUuX29ud2hlZWwgPSBmdW5jdGlvbihlKSB7XG4gIHZhciBjb250ZXh0ID0gdGhpcy5faXNHbG9iYWwgPyB3aW5kb3cgOiB0aGlzO1xuICBpZiAodHlwZW9mIGNvbnRleHQubW91c2VXaGVlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGUuZGVsdGEgPSBlLmRlbHRhWTtcbiAgICB2YXIgZXhlY3V0ZURlZmF1bHQgPSBjb250ZXh0Lm1vdXNlV2hlZWwoZSk7XG4gICAgaWYgKGV4ZWN1dGVEZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNTtcblxufSx7XCIuLi9jb3JlL2NvbnN0YW50c1wiOjIxLFwiLi4vY29yZS9jb3JlXCI6MjJ9XSw0MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgRXZlbnRzXG4gKiBAc3VibW9kdWxlIFRvdWNoXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbi8qKlxuICogVGhlIHN5c3RlbSB2YXJpYWJsZSB0b3VjaGVzW10gY29udGFpbnMgYW4gYXJyYXkgb2YgdGhlIHBvc2l0aW9ucyBvZiBhbGxcbiAqIGN1cnJlbnQgdG91Y2ggcG9pbnRzLCByZWxhdGl2ZSB0byAoMCwgMCkgb2YgdGhlIGNhbnZhcywgYW5kIElEcyBpZGVudGlmeWluZyBhXG4gKiB1bmlxdWUgdG91Y2ggYXMgaXQgbW92ZXMuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgYW4gb2JqZWN0IHdpdGggeCwgeSxcbiAqIGFuZCBpZCBwcm9wZXJ0aWVzLlxuICpcbiAqIFRoZSB0b3VjaGVzW10gYXJyYXkgaXMgbm90IHN1cHBvcnRlZCBvbiBTYWZhcmkgYW5kIElFIG9uIHRvdWNoLWJhc2VkXG4gKiBkZXNrdG9wcyAobGFwdG9wcykuXG4gKlxuICogQHByb3BlcnR5IHtPYmplY3RbXX0gdG91Y2hlc1xuICogQHJlYWRPbmx5XG4gKi9cbnA1LnByb3RvdHlwZS50b3VjaGVzID0gW107XG5cbnA1LnByb3RvdHlwZS5fdXBkYXRlVG91Y2hDb29yZHMgPSBmdW5jdGlvbihlKSB7XG4gIGlmICh0aGlzLl9jdXJFbGVtZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHRvdWNoZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGUudG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdG91Y2hlc1tpXSA9IGdldFRvdWNoSW5mbyhcbiAgICAgICAgdGhpcy5fY3VyRWxlbWVudC5lbHQsXG4gICAgICAgIHRoaXMud2lkdGgsXG4gICAgICAgIHRoaXMuaGVpZ2h0LFxuICAgICAgICBlLFxuICAgICAgICBpXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9zZXRQcm9wZXJ0eSgndG91Y2hlcycsIHRvdWNoZXMpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRUb3VjaEluZm8oY2FudmFzLCB3LCBoLCBlLCBpKSB7XG4gIGkgPSBpIHx8IDA7XG4gIHZhciByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc3ggPSBjYW52YXMuc2Nyb2xsV2lkdGggLyB3O1xuICB2YXIgc3kgPSBjYW52YXMuc2Nyb2xsSGVpZ2h0IC8gaDtcbiAgdmFyIHRvdWNoID0gZS50b3VjaGVzW2ldIHx8IGUuY2hhbmdlZFRvdWNoZXNbaV07XG4gIHJldHVybiB7XG4gICAgeDogKHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQpIC8gc3gsXG4gICAgeTogKHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcCkgLyBzeSxcbiAgICB3aW5YOiB0b3VjaC5jbGllbnRYLFxuICAgIHdpblk6IHRvdWNoLmNsaWVudFksXG4gICAgaWQ6IHRvdWNoLmlkZW50aWZpZXJcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgdG91Y2hTdGFydGVkKCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYWZ0ZXIgZXZlcnkgdGltZSBhIHRvdWNoIGlzXG4gKiByZWdpc3RlcmVkLiBJZiBubyB0b3VjaFN0YXJ0ZWQoKSBmdW5jdGlvbiBpcyBkZWZpbmVkLCB0aGUgbW91c2VQcmVzc2VkKClcbiAqIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluc3RlYWQgaWYgaXQgaXMgZGVmaW5lZC48YnI+PGJyPlxuICogQnJvd3NlcnMgbWF5IGhhdmUgZGlmZmVyZW50IGRlZmF1bHQgYmVoYXZpb3JzIGF0dGFjaGVkIHRvIHZhcmlvdXMgdG91Y2hcbiAqIGV2ZW50cy4gVG8gcHJldmVudCBhbnkgZGVmYXVsdCBiZWhhdmlvciBmb3IgdGhpcyBldmVudCwgYWRkIFwicmV0dXJuIGZhbHNlXCJcbiAqIHRvIHRoZSBlbmQgb2YgdGhlIG1ldGhvZC5cbiAqXG4gKiBAbWV0aG9kIHRvdWNoU3RhcnRlZFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIFRvdWNoIHdpdGhpbiB0aGUgaW1hZ2UgdG8gY2hhbmdlXG4gKiAvLyB0aGUgdmFsdWUgb2YgdGhlIHJlY3RhbmdsZVxuICpcbiAqIHZhciB2YWx1ZSA9IDA7XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBmaWxsKHZhbHVlKTtcbiAqICAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XG4gKiB9XG4gKiBmdW5jdGlvbiB0b3VjaFN0YXJ0ZWQoKSB7XG4gKiAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICogICAgIHZhbHVlID0gMjU1O1xuICogICB9IGVsc2Uge1xuICogICAgIHZhbHVlID0gMDtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHRvdWNoU3RhcnRlZCgpIHtcbiAqICAgZWxsaXBzZShtb3VzZVgsIG1vdXNlWSwgNSwgNSk7XG4gKiAgIC8vIHByZXZlbnQgZGVmYXVsdFxuICogICByZXR1cm4gZmFsc2U7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiA1MHg1MCBibGFjayByZWN0IHR1cm5zIHdoaXRlIHdpdGggdG91Y2ggZXZlbnQuXG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqL1xucDUucHJvdG90eXBlLl9vbnRvdWNoc3RhcnQgPSBmdW5jdGlvbihlKSB7XG4gIHZhciBjb250ZXh0ID0gdGhpcy5faXNHbG9iYWwgPyB3aW5kb3cgOiB0aGlzO1xuICB2YXIgZXhlY3V0ZURlZmF1bHQ7XG4gIHRoaXMuX3NldFByb3BlcnR5KCdtb3VzZUlzUHJlc3NlZCcsIHRydWUpO1xuICB0aGlzLl91cGRhdGVUb3VjaENvb3JkcyhlKTtcbiAgdGhpcy5fdXBkYXRlTmV4dE1vdXNlQ29vcmRzKGUpO1xuICBpZiAodHlwZW9mIGNvbnRleHQudG91Y2hTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXhlY3V0ZURlZmF1bHQgPSBjb250ZXh0LnRvdWNoU3RhcnRlZChlKTtcbiAgICBpZiAoZXhlY3V0ZURlZmF1bHQgPT09IGZhbHNlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0Lm1vdXNlUHJlc3NlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV4ZWN1dGVEZWZhdWx0ID0gY29udGV4dC5tb3VzZVByZXNzZWQoZSk7XG4gICAgaWYgKGV4ZWN1dGVEZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgdG91Y2hNb3ZlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBldmVyeSB0aW1lIGEgdG91Y2ggbW92ZSBpcyByZWdpc3RlcmVkLlxuICogSWYgbm8gdG91Y2hNb3ZlZCgpIGZ1bmN0aW9uIGlzIGRlZmluZWQsIHRoZSBtb3VzZURyYWdnZWQoKSBmdW5jdGlvbiB3aWxsXG4gKiBiZSBjYWxsZWQgaW5zdGVhZCBpZiBpdCBpcyBkZWZpbmVkLjxicj48YnI+XG4gKiBCcm93c2VycyBtYXkgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdCBiZWhhdmlvcnMgYXR0YWNoZWQgdG8gdmFyaW91cyB0b3VjaFxuICogZXZlbnRzLiBUbyBwcmV2ZW50IGFueSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIGV2ZW50LCBhZGQgXCJyZXR1cm4gZmFsc2VcIlxuICogdG8gdGhlIGVuZCBvZiB0aGUgbWV0aG9kLlxuICpcbiAqIEBtZXRob2QgdG91Y2hNb3ZlZFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIE1vdmUgeW91ciBmaW5nZXIgYWNyb3NzIHRoZSBwYWdlXG4gKiAvLyB0byBjaGFuZ2UgaXRzIHZhbHVlXG4gKlxuICogdmFyIHZhbHVlID0gMDtcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGZpbGwodmFsdWUpO1xuICogICByZWN0KDI1LCAyNSwgNTAsIDUwKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIHRvdWNoTW92ZWQoKSB7XG4gKiAgIHZhbHVlID0gdmFsdWUgKyA1O1xuICogICBpZiAodmFsdWUgPiAyNTUpIHtcbiAqICAgICB2YWx1ZSA9IDA7XG4gKiAgIH1cbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiB0b3VjaE1vdmVkKCkge1xuICogICBlbGxpcHNlKG1vdXNlWCwgbW91c2VZLCA1LCA1KTtcbiAqICAgLy8gcHJldmVudCBkZWZhdWx0XG4gKiAgIHJldHVybiBmYWxzZTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDUweDUwIGJsYWNrIHJlY3QgdHVybnMgbGlnaHRlciB3aXRoIHRvdWNoIHVudGlsIHdoaXRlLiByZXNldHNcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICpcbiAqL1xucDUucHJvdG90eXBlLl9vbnRvdWNobW92ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgdmFyIGNvbnRleHQgPSB0aGlzLl9pc0dsb2JhbCA/IHdpbmRvdyA6IHRoaXM7XG4gIHZhciBleGVjdXRlRGVmYXVsdDtcbiAgdGhpcy5fdXBkYXRlVG91Y2hDb29yZHMoZSk7XG4gIHRoaXMuX3VwZGF0ZU5leHRNb3VzZUNvb3JkcyhlKTtcbiAgaWYgKHR5cGVvZiBjb250ZXh0LnRvdWNoTW92ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBleGVjdXRlRGVmYXVsdCA9IGNvbnRleHQudG91Y2hNb3ZlZChlKTtcbiAgICBpZiAoZXhlY3V0ZURlZmF1bHQgPT09IGZhbHNlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0Lm1vdXNlRHJhZ2dlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV4ZWN1dGVEZWZhdWx0ID0gY29udGV4dC5tb3VzZURyYWdnZWQoZSk7XG4gICAgaWYgKGV4ZWN1dGVEZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgdG91Y2hFbmRlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBldmVyeSB0aW1lIGEgdG91Y2ggZW5kcy4gSWYgbm9cbiAqIHRvdWNoRW5kZWQoKSBmdW5jdGlvbiBpcyBkZWZpbmVkLCB0aGUgbW91c2VSZWxlYXNlZCgpIGZ1bmN0aW9uIHdpbGwgYmVcbiAqIGNhbGxlZCBpbnN0ZWFkIGlmIGl0IGlzIGRlZmluZWQuPGJyPjxicj5cbiAqIEJyb3dzZXJzIG1heSBoYXZlIGRpZmZlcmVudCBkZWZhdWx0IGJlaGF2aW9ycyBhdHRhY2hlZCB0byB2YXJpb3VzIHRvdWNoXG4gKiBldmVudHMuIFRvIHByZXZlbnQgYW55IGRlZmF1bHQgYmVoYXZpb3IgZm9yIHRoaXMgZXZlbnQsIGFkZCBcInJldHVybiBmYWxzZVwiXG4gKiB0byB0aGUgZW5kIG9mIHRoZSBtZXRob2QuXG4gKlxuICogQG1ldGhvZCB0b3VjaEVuZGVkXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gUmVsZWFzZSB0b3VjaCB3aXRoaW4gdGhlIGltYWdlIHRvXG4gKiAvLyBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSByZWN0YW5nbGVcbiAqXG4gKiB2YXIgdmFsdWUgPSAwO1xuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgZmlsbCh2YWx1ZSk7XG4gKiAgIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xuICogfVxuICogZnVuY3Rpb24gdG91Y2hFbmRlZCgpIHtcbiAqICAgaWYgKHZhbHVlID09PSAwKSB7XG4gKiAgICAgdmFsdWUgPSAyNTU7XG4gKiAgIH0gZWxzZSB7XG4gKiAgICAgdmFsdWUgPSAwO1xuICogICB9XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gdG91Y2hFbmRlZCgpIHtcbiAqICAgZWxsaXBzZShtb3VzZVgsIG1vdXNlWSwgNSwgNSk7XG4gKiAgIC8vIHByZXZlbnQgZGVmYXVsdFxuICogICByZXR1cm4gZmFsc2U7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiA1MHg1MCBibGFjayByZWN0IHR1cm5zIHdoaXRlIHdpdGggdG91Y2guXG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5fb250b3VjaGVuZCA9IGZ1bmN0aW9uKGUpIHtcbiAgdGhpcy5fc2V0UHJvcGVydHkoJ21vdXNlSXNQcmVzc2VkJywgZmFsc2UpO1xuICB0aGlzLl91cGRhdGVUb3VjaENvb3JkcyhlKTtcbiAgdGhpcy5fdXBkYXRlTmV4dE1vdXNlQ29vcmRzKGUpO1xuICB2YXIgY29udGV4dCA9IHRoaXMuX2lzR2xvYmFsID8gd2luZG93IDogdGhpcztcbiAgdmFyIGV4ZWN1dGVEZWZhdWx0O1xuICBpZiAodHlwZW9mIGNvbnRleHQudG91Y2hFbmRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV4ZWN1dGVEZWZhdWx0ID0gY29udGV4dC50b3VjaEVuZGVkKGUpO1xuICAgIGlmIChleGVjdXRlRGVmYXVsdCA9PT0gZmFsc2UpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHQubW91c2VSZWxlYXNlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV4ZWN1dGVEZWZhdWx0ID0gY29udGV4dC5tb3VzZVJlbGVhc2VkKGUpO1xuICAgIGlmIChleGVjdXRlRGVmYXVsdCA9PT0gZmFsc2UpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSw0MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKmdsb2JhbCBJbWFnZURhdGE6ZmFsc2UgKi9cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBmaWx0ZXJzIGZvciB1c2Ugd2l0aCBpbWFnZSBidWZmZXJzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIGJhc2ljYWxseSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIHN0b3JlZCBpbiBhbiBvYmplY3RcbiAqIGFzIG9wcG9zZWQgdG8gbW9kdWxlcy4gVGhlIGZ1bmN0aW9ucyBhcmUgZGVzdHJ1Y3RpdmUsIG1vZGlmeWluZ1xuICogdGhlIHBhc3NlZCBpbiBjYW52YXMgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBjb3B5LlxuICpcbiAqIEdlbmVyYWxseSBzcGVha2luZyB1c2VycyBvZiB0aGlzIG1vZHVsZSB3aWxsIHVzZSB0aGUgRmlsdGVycy5hcHBseSBtZXRob2RcbiAqIG9uIGEgY2FudmFzIHRvIGNyZWF0ZSBhbiBlZmZlY3QuXG4gKlxuICogQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBib3Jyb3dlZC9hZGFwdGVkIGZyb21cbiAqIGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2NhbnZhcy9pbWFnZWZpbHRlcnMvXG4gKiBvciB0aGUgamF2YSBwcm9jZXNzaW5nIGltcGxlbWVudGF0aW9uLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEZpbHRlcnMgPSB7fTtcblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnNcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBpeGVsIGJ1ZmZlciBmb3IgYSBjYW52YXNcbiAqXG4gKiBAcHJpdmF0ZVxuICpcbiAqIEBwYXJhbSAge0NhbnZhc3xJbWFnZURhdGF9IGNhbnZhcyB0aGUgY2FudmFzIHRvIGdldCBwaXhlbHMgZnJvbVxuICogQHJldHVybiB7VWludDhDbGFtcGVkQXJyYXl9ICAgICAgIGEgb25lLWRpbWVuc2lvbmFsIGFycmF5IGNvbnRhaW5pbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YSBpbiB0aGMgUkdCQSBvcmRlciwgd2l0aCBpbnRlZ2VyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGJldHdlZW4gMCBhbmQgMjU1XG4gKi9cbkZpbHRlcnMuX3RvUGl4ZWxzID0gZnVuY3Rpb24oY2FudmFzKSB7XG4gIGlmIChjYW52YXMgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICByZXR1cm4gY2FudmFzLmRhdGE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNhbnZhc1xuICAgICAgLmdldENvbnRleHQoJzJkJylcbiAgICAgIC5nZXRJbWFnZURhdGEoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KS5kYXRhO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSAzMiBiaXQgbnVtYmVyIGNvbnRhaW5pbmcgQVJHQiBkYXRhIGF0IGl0aCBwaXhlbCBpbiB0aGVcbiAqIDFEIGFycmF5IGNvbnRhaW5pbmcgcGl4ZWxzIGRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqXG4gKiBAcGFyYW0gIHtVaW50OENsYW1wZWRBcnJheX0gZGF0YSBhcnJheSByZXR1cm5lZCBieSBfdG9QaXhlbHMoKVxuICogQHBhcmFtICB7SW50ZWdlcn0gICAgICAgICAgIGkgICAgaW5kZXggb2YgYSAxRCBJbWFnZSBBcnJheVxuICogQHJldHVybiB7SW50ZWdlcn0gICAgICAgICAgICAgICAgMzIgYml0IGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkdCIHZhbHVlLlxuICovXG5GaWx0ZXJzLl9nZXRBUkdCID0gZnVuY3Rpb24oZGF0YSwgaSkge1xuICB2YXIgb2Zmc2V0ID0gaSAqIDQ7XG4gIHJldHVybiAoXG4gICAgKChkYXRhW29mZnNldCArIDNdIDw8IDI0KSAmIDB4ZmYwMDAwMDApIHxcbiAgICAoKGRhdGFbb2Zmc2V0XSA8PCAxNikgJiAweDAwZmYwMDAwKSB8XG4gICAgKChkYXRhW29mZnNldCArIDFdIDw8IDgpICYgMHgwMDAwZmYwMCkgfFxuICAgIChkYXRhW29mZnNldCArIDJdICYgMHgwMDAwMDBmZilcbiAgKTtcbn07XG5cbi8qKlxuICogTW9kaWZpZXMgcGl4ZWxzIFJHQkEgdmFsdWVzIHRvIHZhbHVlcyBjb250YWluZWQgaW4gdGhlIGRhdGEgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtVaW50OENsYW1wZWRBcnJheX0gcGl4ZWxzIGFycmF5IHJldHVybmVkIGJ5IF90b1BpeGVscygpXG4gKiBAcGFyYW0ge0ludDMyQXJyYXl9ICAgICAgICBkYXRhICAgc291cmNlIDFEIGFycmF5IHdoZXJlIGVhY2ggdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIEFSR0IgdmFsdWVzXG4gKi9cbkZpbHRlcnMuX3NldFBpeGVscyA9IGZ1bmN0aW9uKHBpeGVscywgZGF0YSkge1xuICB2YXIgb2Zmc2V0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGFsID0gcGl4ZWxzLmxlbmd0aDsgaSA8IGFsOyBpKyspIHtcbiAgICBvZmZzZXQgPSBpICogNDtcbiAgICBwaXhlbHNbb2Zmc2V0ICsgMF0gPSAoZGF0YVtpXSAmIDB4MDBmZjAwMDApID4+PiAxNjtcbiAgICBwaXhlbHNbb2Zmc2V0ICsgMV0gPSAoZGF0YVtpXSAmIDB4MDAwMGZmMDApID4+PiA4O1xuICAgIHBpeGVsc1tvZmZzZXQgKyAyXSA9IGRhdGFbaV0gJiAweDAwMDAwMGZmO1xuICAgIHBpeGVsc1tvZmZzZXQgKyAzXSA9IChkYXRhW2ldICYgMHhmZjAwMDAwMCkgPj4+IDI0O1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIEltYWdlRGF0YSBvYmplY3QgZm9yIGEgY2FudmFzXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSW1hZ2VEYXRhXG4gKlxuICogQHByaXZhdGVcbiAqXG4gKiBAcGFyYW0gIHtDYW52YXN8SW1hZ2VEYXRhfSBjYW52YXMgY2FudmFzIHRvIGdldCBpbWFnZSBkYXRhIGZyb21cbiAqIEByZXR1cm4ge0ltYWdlRGF0YX0gICAgICAgICAgICAgICBIb2xkZXIgb2YgcGl4ZWwgZGF0YSAoYW5kIHdpZHRoIGFuZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCkgZm9yIGEgY2FudmFzXG4gKi9cbkZpbHRlcnMuX3RvSW1hZ2VEYXRhID0gZnVuY3Rpb24oY2FudmFzKSB7XG4gIGlmIChjYW52YXMgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICByZXR1cm4gY2FudmFzO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjYW52YXNcbiAgICAgIC5nZXRDb250ZXh0KCcyZCcpXG4gICAgICAuZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGJsYW5rIEltYWdlRGF0YSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSB3aWR0aFxuICogQHBhcmFtICB7SW50ZWdlcn0gaGVpZ2h0XG4gKiBAcmV0dXJuIHtJbWFnZURhdGF9XG4gKi9cbkZpbHRlcnMuX2NyZWF0ZUltYWdlRGF0YSA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgRmlsdGVycy5fdG1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIEZpbHRlcnMuX3RtcEN0eCA9IEZpbHRlcnMuX3RtcENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICByZXR1cm4gdGhpcy5fdG1wQ3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTtcbn07XG5cbi8qKlxuICogQXBwbHlzIGEgZmlsdGVyIGZ1bmN0aW9uIHRvIGEgY2FudmFzLlxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgdGhlIGFjdHVhbCBmaWx0ZXIgZnVuY3Rpb25zIGRlZmluZWQgYmVsb3dcbiAqIGlzIHRoYXQgdGhlIGZpbHRlciBmdW5jdGlvbnMgZ2VuZXJhbGx5IG1vZGlmeSB0aGUgcGl4ZWwgYnVmZmVyIGJ1dCBkb1xuICogbm90IGFjdHVhbGx5IHB1dCB0aGF0IGRhdGEgYmFjayB0byB0aGUgY2FudmFzICh3aGVyZSBpdCB3b3VsZCBhY3R1YWxseVxuICogdXBkYXRlIHdoYXQgaXMgdmlzaWJsZSkuIEJ5IGNvbnRyYXN0IHRoaXMgbWV0aG9kIGRvZXMgbWFrZSB0aGUgY2hhbmdlc1xuICogYWN0dWFsbHkgdmlzaWJsZSBpbiB0aGUgY2FudmFzLlxuICpcbiAqIFRoZSBhcHBseSBtZXRob2QgaXMgdGhlIG1ldGhvZCB0aGF0IGNhbGxlcnMgb2YgdGhpcyBtb2R1bGUgd291bGQgZ2VuZXJhbGx5XG4gKiB1c2UuIEl0IGhhcyBiZWVuIHNlcGFyYXRlZCBmcm9tIHRoZSBhY3R1YWwgZmlsdGVycyB0byBzdXBwb3J0IGFuIGFkdmFuY2VkXG4gKiB1c2UgY2FzZSBvZiBjcmVhdGluZyBhIGZpbHRlciBjaGFpbiB0aGF0IGV4ZWN1dGVzIHdpdGhvdXQgYWN0dWFsbHkgdXBkYXRpbmdcbiAqIHRoZSBjYW52YXMgaW4gYmV0d2VlbiBldmVyeXN0ZXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXMgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7ZnVuY3Rpb24oSW1hZ2VEYXRhLE9iamVjdCl9IGZ1bmMgICBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9IGZpbHRlclBhcmFtICBbZGVzY3JpcHRpb25dXG4gKi9cbkZpbHRlcnMuYXBwbHkgPSBmdW5jdGlvbihjYW52YXMsIGZ1bmMsIGZpbHRlclBhcmFtKSB7XG4gIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgdmFyIGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAvL0ZpbHRlcnMgY2FuIGVpdGhlciByZXR1cm4gYSBuZXcgSW1hZ2VEYXRhIG9iamVjdCwgb3IganVzdCBtb2RpZnlcbiAgLy90aGUgb25lIHRoZXkgcmVjZWl2ZWQuXG4gIHZhciBuZXdJbWFnZURhdGEgPSBmdW5jKGltYWdlRGF0YSwgZmlsdGVyUGFyYW0pO1xuICBpZiAobmV3SW1hZ2VEYXRhIGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7XG4gICAgY3R4LnB1dEltYWdlRGF0YShuZXdJbWFnZURhdGEsIDAsIDAsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gIH0gZWxzZSB7XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDAsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gIH1cbn07XG5cbi8qXG4gKiBGaWx0ZXJzXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgaW1hZ2UgdG8gYmxhY2sgYW5kIHdoaXRlIHBpeGVscyBkZXBlbmRpbmcgaWYgdGhleSBhcmUgYWJvdmUgb3JcbiAqIGJlbG93IHRoZSB0aHJlc2hvbGQgZGVmaW5lZCBieSB0aGUgbGV2ZWwgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIG11c3QgYmVcbiAqIGJldHdlZW4gMC4wIChibGFjaykgYW5kIDEuMCAod2hpdGUpLiBJZiBubyBsZXZlbCBpcyBzcGVjaWZpZWQsIDAuNSBpcyB1c2VkLlxuICpcbiAqIEJvcnJvd2VkIGZyb20gaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvY2FudmFzL2ltYWdlZmlsdGVycy9cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7Q2FudmFzfSBjYW52YXNcbiAqIEBwYXJhbSAge0Zsb2F0fSBsZXZlbFxuICovXG5GaWx0ZXJzLnRocmVzaG9sZCA9IGZ1bmN0aW9uKGNhbnZhcywgbGV2ZWwpIHtcbiAgdmFyIHBpeGVscyA9IEZpbHRlcnMuX3RvUGl4ZWxzKGNhbnZhcyk7XG5cbiAgaWYgKGxldmVsID09PSB1bmRlZmluZWQpIHtcbiAgICBsZXZlbCA9IDAuNTtcbiAgfVxuICB2YXIgdGhyZXNoID0gTWF0aC5mbG9vcihsZXZlbCAqIDI1NSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICB2YXIgciA9IHBpeGVsc1tpXTtcbiAgICB2YXIgZyA9IHBpeGVsc1tpICsgMV07XG4gICAgdmFyIGIgPSBwaXhlbHNbaSArIDJdO1xuICAgIHZhciBncmF5ID0gMC4yMTI2ICogciArIDAuNzE1MiAqIGcgKyAwLjA3MjIgKiBiO1xuICAgIHZhciB2YWw7XG4gICAgaWYgKGdyYXkgPj0gdGhyZXNoKSB7XG4gICAgICB2YWwgPSAyNTU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbCA9IDA7XG4gICAgfVxuICAgIHBpeGVsc1tpXSA9IHBpeGVsc1tpICsgMV0gPSBwaXhlbHNbaSArIDJdID0gdmFsO1xuICB9XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGFueSBjb2xvcnMgaW4gdGhlIGltYWdlIHRvIGdyYXlzY2FsZSBlcXVpdmFsZW50cy5cbiAqIE5vIHBhcmFtZXRlciBpcyB1c2VkLlxuICpcbiAqIEJvcnJvd2VkIGZyb20gaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvY2FudmFzL2ltYWdlZmlsdGVycy9cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtDYW52YXN9IGNhbnZhc1xuICovXG5GaWx0ZXJzLmdyYXkgPSBmdW5jdGlvbihjYW52YXMpIHtcbiAgdmFyIHBpeGVscyA9IEZpbHRlcnMuX3RvUGl4ZWxzKGNhbnZhcyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICB2YXIgciA9IHBpeGVsc1tpXTtcbiAgICB2YXIgZyA9IHBpeGVsc1tpICsgMV07XG4gICAgdmFyIGIgPSBwaXhlbHNbaSArIDJdO1xuXG4gICAgLy8gQ0lFIGx1bWluYW5jZSBmb3IgUkdCXG4gICAgdmFyIGdyYXkgPSAwLjIxMjYgKiByICsgMC43MTUyICogZyArIDAuMDcyMiAqIGI7XG4gICAgcGl4ZWxzW2ldID0gcGl4ZWxzW2kgKyAxXSA9IHBpeGVsc1tpICsgMl0gPSBncmF5O1xuICB9XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGFscGhhIGNoYW5uZWwgdG8gZW50aXJlbHkgb3BhcXVlLiBObyBwYXJhbWV0ZXIgaXMgdXNlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtDYW52YXN9IGNhbnZhc1xuICovXG5GaWx0ZXJzLm9wYXF1ZSA9IGZ1bmN0aW9uKGNhbnZhcykge1xuICB2YXIgcGl4ZWxzID0gRmlsdGVycy5fdG9QaXhlbHMoY2FudmFzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7IGkgKz0gNCkge1xuICAgIHBpeGVsc1tpICsgM10gPSAyNTU7XG4gIH1cblxuICByZXR1cm4gcGl4ZWxzO1xufTtcblxuLyoqXG4gKiBTZXRzIGVhY2ggcGl4ZWwgdG8gaXRzIGludmVyc2UgdmFsdWUuIE5vIHBhcmFtZXRlciBpcyB1c2VkLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0NhbnZhc30gY2FudmFzXG4gKi9cbkZpbHRlcnMuaW52ZXJ0ID0gZnVuY3Rpb24oY2FudmFzKSB7XG4gIHZhciBwaXhlbHMgPSBGaWx0ZXJzLl90b1BpeGVscyhjYW52YXMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgcGl4ZWxzW2ldID0gMjU1IC0gcGl4ZWxzW2ldO1xuICAgIHBpeGVsc1tpICsgMV0gPSAyNTUgLSBwaXhlbHNbaSArIDFdO1xuICAgIHBpeGVsc1tpICsgMl0gPSAyNTUgLSBwaXhlbHNbaSArIDJdO1xuICB9XG59O1xuXG4vKipcbiAqIExpbWl0cyBlYWNoIGNoYW5uZWwgb2YgdGhlIGltYWdlIHRvIHRoZSBudW1iZXIgb2YgY29sb3JzIHNwZWNpZmllZCBhc1xuICogdGhlIHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIHZhbHVlcyBiZXR3ZWVuIDIgYW5kIDI1NSwgYnV0XG4gKiByZXN1bHRzIGFyZSBtb3N0IG5vdGljZWFibGUgaW4gdGhlIGxvd2VyIHJhbmdlcy5cbiAqXG4gKiBBZGFwdGVkIGZyb20gamF2YSBiYXNlZCBwcm9jZXNzaW5nIGltcGxlbWVudGF0aW9uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0NhbnZhc30gY2FudmFzXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBsZXZlbFxuICovXG5GaWx0ZXJzLnBvc3Rlcml6ZSA9IGZ1bmN0aW9uKGNhbnZhcywgbGV2ZWwpIHtcbiAgdmFyIHBpeGVscyA9IEZpbHRlcnMuX3RvUGl4ZWxzKGNhbnZhcyk7XG5cbiAgaWYgKGxldmVsIDwgMiB8fCBsZXZlbCA+IDI1NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdMZXZlbCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAyIGFuZCBsZXNzIHRoYW4gMjU1IGZvciBwb3N0ZXJpemUnXG4gICAgKTtcbiAgfVxuXG4gIHZhciBsZXZlbHMxID0gbGV2ZWwgLSAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7IGkgKz0gNCkge1xuICAgIHZhciBybGV2ZWwgPSBwaXhlbHNbaV07XG4gICAgdmFyIGdsZXZlbCA9IHBpeGVsc1tpICsgMV07XG4gICAgdmFyIGJsZXZlbCA9IHBpeGVsc1tpICsgMl07XG5cbiAgICBwaXhlbHNbaV0gPSAoKHJsZXZlbCAqIGxldmVsKSA+PiA4KSAqIDI1NSAvIGxldmVsczE7XG4gICAgcGl4ZWxzW2kgKyAxXSA9ICgoZ2xldmVsICogbGV2ZWwpID4+IDgpICogMjU1IC8gbGV2ZWxzMTtcbiAgICBwaXhlbHNbaSArIDJdID0gKChibGV2ZWwgKiBsZXZlbCkgPj4gOCkgKiAyNTUgLyBsZXZlbHMxO1xuICB9XG59O1xuXG4vKipcbiAqIHJlZHVjZXMgdGhlIGJyaWdodCBhcmVhcyBpbiBhbiBpbWFnZVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0NhbnZhc30gY2FudmFzXG4gKlxuICovXG5GaWx0ZXJzLmRpbGF0ZSA9IGZ1bmN0aW9uKGNhbnZhcykge1xuICB2YXIgcGl4ZWxzID0gRmlsdGVycy5fdG9QaXhlbHMoY2FudmFzKTtcbiAgdmFyIGN1cnJJZHggPSAwO1xuICB2YXIgbWF4SWR4ID0gcGl4ZWxzLmxlbmd0aCA/IHBpeGVscy5sZW5ndGggLyA0IDogMDtcbiAgdmFyIG91dCA9IG5ldyBJbnQzMkFycmF5KG1heElkeCk7XG4gIHZhciBjdXJyUm93SWR4LCBtYXhSb3dJZHgsIGNvbE9yaWcsIGNvbE91dCwgY3Vyckx1bTtcblxuICB2YXIgaWR4UmlnaHQsIGlkeExlZnQsIGlkeFVwLCBpZHhEb3duO1xuICB2YXIgY29sUmlnaHQsIGNvbExlZnQsIGNvbFVwLCBjb2xEb3duO1xuICB2YXIgbHVtUmlnaHQsIGx1bUxlZnQsIGx1bVVwLCBsdW1Eb3duO1xuXG4gIHdoaWxlIChjdXJySWR4IDwgbWF4SWR4KSB7XG4gICAgY3VyclJvd0lkeCA9IGN1cnJJZHg7XG4gICAgbWF4Um93SWR4ID0gY3VycklkeCArIGNhbnZhcy53aWR0aDtcbiAgICB3aGlsZSAoY3VycklkeCA8IG1heFJvd0lkeCkge1xuICAgICAgY29sT3JpZyA9IGNvbE91dCA9IEZpbHRlcnMuX2dldEFSR0IocGl4ZWxzLCBjdXJySWR4KTtcbiAgICAgIGlkeExlZnQgPSBjdXJySWR4IC0gMTtcbiAgICAgIGlkeFJpZ2h0ID0gY3VycklkeCArIDE7XG4gICAgICBpZHhVcCA9IGN1cnJJZHggLSBjYW52YXMud2lkdGg7XG4gICAgICBpZHhEb3duID0gY3VycklkeCArIGNhbnZhcy53aWR0aDtcblxuICAgICAgaWYgKGlkeExlZnQgPCBjdXJyUm93SWR4KSB7XG4gICAgICAgIGlkeExlZnQgPSBjdXJySWR4O1xuICAgICAgfVxuICAgICAgaWYgKGlkeFJpZ2h0ID49IG1heFJvd0lkeCkge1xuICAgICAgICBpZHhSaWdodCA9IGN1cnJJZHg7XG4gICAgICB9XG4gICAgICBpZiAoaWR4VXAgPCAwKSB7XG4gICAgICAgIGlkeFVwID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChpZHhEb3duID49IG1heElkeCkge1xuICAgICAgICBpZHhEb3duID0gY3VycklkeDtcbiAgICAgIH1cbiAgICAgIGNvbFVwID0gRmlsdGVycy5fZ2V0QVJHQihwaXhlbHMsIGlkeFVwKTtcbiAgICAgIGNvbExlZnQgPSBGaWx0ZXJzLl9nZXRBUkdCKHBpeGVscywgaWR4TGVmdCk7XG4gICAgICBjb2xEb3duID0gRmlsdGVycy5fZ2V0QVJHQihwaXhlbHMsIGlkeERvd24pO1xuICAgICAgY29sUmlnaHQgPSBGaWx0ZXJzLl9nZXRBUkdCKHBpeGVscywgaWR4UmlnaHQpO1xuXG4gICAgICAvL2NvbXB1dGUgbHVtaW5hbmNlXG4gICAgICBjdXJyTHVtID1cbiAgICAgICAgNzcgKiAoKGNvbE9yaWcgPj4gMTYpICYgMHhmZikgK1xuICAgICAgICAxNTEgKiAoKGNvbE9yaWcgPj4gOCkgJiAweGZmKSArXG4gICAgICAgIDI4ICogKGNvbE9yaWcgJiAweGZmKTtcbiAgICAgIGx1bUxlZnQgPVxuICAgICAgICA3NyAqICgoY29sTGVmdCA+PiAxNikgJiAweGZmKSArXG4gICAgICAgIDE1MSAqICgoY29sTGVmdCA+PiA4KSAmIDB4ZmYpICtcbiAgICAgICAgMjggKiAoY29sTGVmdCAmIDB4ZmYpO1xuICAgICAgbHVtUmlnaHQgPVxuICAgICAgICA3NyAqICgoY29sUmlnaHQgPj4gMTYpICYgMHhmZikgK1xuICAgICAgICAxNTEgKiAoKGNvbFJpZ2h0ID4+IDgpICYgMHhmZikgK1xuICAgICAgICAyOCAqIChjb2xSaWdodCAmIDB4ZmYpO1xuICAgICAgbHVtVXAgPVxuICAgICAgICA3NyAqICgoY29sVXAgPj4gMTYpICYgMHhmZikgK1xuICAgICAgICAxNTEgKiAoKGNvbFVwID4+IDgpICYgMHhmZikgK1xuICAgICAgICAyOCAqIChjb2xVcCAmIDB4ZmYpO1xuICAgICAgbHVtRG93biA9XG4gICAgICAgIDc3ICogKChjb2xEb3duID4+IDE2KSAmIDB4ZmYpICtcbiAgICAgICAgMTUxICogKChjb2xEb3duID4+IDgpICYgMHhmZikgK1xuICAgICAgICAyOCAqIChjb2xEb3duICYgMHhmZik7XG5cbiAgICAgIGlmIChsdW1MZWZ0ID4gY3Vyckx1bSkge1xuICAgICAgICBjb2xPdXQgPSBjb2xMZWZ0O1xuICAgICAgICBjdXJyTHVtID0gbHVtTGVmdDtcbiAgICAgIH1cbiAgICAgIGlmIChsdW1SaWdodCA+IGN1cnJMdW0pIHtcbiAgICAgICAgY29sT3V0ID0gY29sUmlnaHQ7XG4gICAgICAgIGN1cnJMdW0gPSBsdW1SaWdodDtcbiAgICAgIH1cbiAgICAgIGlmIChsdW1VcCA+IGN1cnJMdW0pIHtcbiAgICAgICAgY29sT3V0ID0gY29sVXA7XG4gICAgICAgIGN1cnJMdW0gPSBsdW1VcDtcbiAgICAgIH1cbiAgICAgIGlmIChsdW1Eb3duID4gY3Vyckx1bSkge1xuICAgICAgICBjb2xPdXQgPSBjb2xEb3duO1xuICAgICAgICBjdXJyTHVtID0gbHVtRG93bjtcbiAgICAgIH1cbiAgICAgIG91dFtjdXJySWR4KytdID0gY29sT3V0O1xuICAgIH1cbiAgfVxuICBGaWx0ZXJzLl9zZXRQaXhlbHMocGl4ZWxzLCBvdXQpO1xufTtcblxuLyoqXG4gKiBpbmNyZWFzZXMgdGhlIGJyaWdodCBhcmVhcyBpbiBhbiBpbWFnZVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0NhbnZhc30gY2FudmFzXG4gKlxuICovXG5GaWx0ZXJzLmVyb2RlID0gZnVuY3Rpb24oY2FudmFzKSB7XG4gIHZhciBwaXhlbHMgPSBGaWx0ZXJzLl90b1BpeGVscyhjYW52YXMpO1xuICB2YXIgY3VycklkeCA9IDA7XG4gIHZhciBtYXhJZHggPSBwaXhlbHMubGVuZ3RoID8gcGl4ZWxzLmxlbmd0aCAvIDQgOiAwO1xuICB2YXIgb3V0ID0gbmV3IEludDMyQXJyYXkobWF4SWR4KTtcbiAgdmFyIGN1cnJSb3dJZHgsIG1heFJvd0lkeCwgY29sT3JpZywgY29sT3V0LCBjdXJyTHVtO1xuICB2YXIgaWR4UmlnaHQsIGlkeExlZnQsIGlkeFVwLCBpZHhEb3duO1xuICB2YXIgY29sUmlnaHQsIGNvbExlZnQsIGNvbFVwLCBjb2xEb3duO1xuICB2YXIgbHVtUmlnaHQsIGx1bUxlZnQsIGx1bVVwLCBsdW1Eb3duO1xuXG4gIHdoaWxlIChjdXJySWR4IDwgbWF4SWR4KSB7XG4gICAgY3VyclJvd0lkeCA9IGN1cnJJZHg7XG4gICAgbWF4Um93SWR4ID0gY3VycklkeCArIGNhbnZhcy53aWR0aDtcbiAgICB3aGlsZSAoY3VycklkeCA8IG1heFJvd0lkeCkge1xuICAgICAgY29sT3JpZyA9IGNvbE91dCA9IEZpbHRlcnMuX2dldEFSR0IocGl4ZWxzLCBjdXJySWR4KTtcbiAgICAgIGlkeExlZnQgPSBjdXJySWR4IC0gMTtcbiAgICAgIGlkeFJpZ2h0ID0gY3VycklkeCArIDE7XG4gICAgICBpZHhVcCA9IGN1cnJJZHggLSBjYW52YXMud2lkdGg7XG4gICAgICBpZHhEb3duID0gY3VycklkeCArIGNhbnZhcy53aWR0aDtcblxuICAgICAgaWYgKGlkeExlZnQgPCBjdXJyUm93SWR4KSB7XG4gICAgICAgIGlkeExlZnQgPSBjdXJySWR4O1xuICAgICAgfVxuICAgICAgaWYgKGlkeFJpZ2h0ID49IG1heFJvd0lkeCkge1xuICAgICAgICBpZHhSaWdodCA9IGN1cnJJZHg7XG4gICAgICB9XG4gICAgICBpZiAoaWR4VXAgPCAwKSB7XG4gICAgICAgIGlkeFVwID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChpZHhEb3duID49IG1heElkeCkge1xuICAgICAgICBpZHhEb3duID0gY3VycklkeDtcbiAgICAgIH1cbiAgICAgIGNvbFVwID0gRmlsdGVycy5fZ2V0QVJHQihwaXhlbHMsIGlkeFVwKTtcbiAgICAgIGNvbExlZnQgPSBGaWx0ZXJzLl9nZXRBUkdCKHBpeGVscywgaWR4TGVmdCk7XG4gICAgICBjb2xEb3duID0gRmlsdGVycy5fZ2V0QVJHQihwaXhlbHMsIGlkeERvd24pO1xuICAgICAgY29sUmlnaHQgPSBGaWx0ZXJzLl9nZXRBUkdCKHBpeGVscywgaWR4UmlnaHQpO1xuXG4gICAgICAvL2NvbXB1dGUgbHVtaW5hbmNlXG4gICAgICBjdXJyTHVtID1cbiAgICAgICAgNzcgKiAoKGNvbE9yaWcgPj4gMTYpICYgMHhmZikgK1xuICAgICAgICAxNTEgKiAoKGNvbE9yaWcgPj4gOCkgJiAweGZmKSArXG4gICAgICAgIDI4ICogKGNvbE9yaWcgJiAweGZmKTtcbiAgICAgIGx1bUxlZnQgPVxuICAgICAgICA3NyAqICgoY29sTGVmdCA+PiAxNikgJiAweGZmKSArXG4gICAgICAgIDE1MSAqICgoY29sTGVmdCA+PiA4KSAmIDB4ZmYpICtcbiAgICAgICAgMjggKiAoY29sTGVmdCAmIDB4ZmYpO1xuICAgICAgbHVtUmlnaHQgPVxuICAgICAgICA3NyAqICgoY29sUmlnaHQgPj4gMTYpICYgMHhmZikgK1xuICAgICAgICAxNTEgKiAoKGNvbFJpZ2h0ID4+IDgpICYgMHhmZikgK1xuICAgICAgICAyOCAqIChjb2xSaWdodCAmIDB4ZmYpO1xuICAgICAgbHVtVXAgPVxuICAgICAgICA3NyAqICgoY29sVXAgPj4gMTYpICYgMHhmZikgK1xuICAgICAgICAxNTEgKiAoKGNvbFVwID4+IDgpICYgMHhmZikgK1xuICAgICAgICAyOCAqIChjb2xVcCAmIDB4ZmYpO1xuICAgICAgbHVtRG93biA9XG4gICAgICAgIDc3ICogKChjb2xEb3duID4+IDE2KSAmIDB4ZmYpICtcbiAgICAgICAgMTUxICogKChjb2xEb3duID4+IDgpICYgMHhmZikgK1xuICAgICAgICAyOCAqIChjb2xEb3duICYgMHhmZik7XG5cbiAgICAgIGlmIChsdW1MZWZ0IDwgY3Vyckx1bSkge1xuICAgICAgICBjb2xPdXQgPSBjb2xMZWZ0O1xuICAgICAgICBjdXJyTHVtID0gbHVtTGVmdDtcbiAgICAgIH1cbiAgICAgIGlmIChsdW1SaWdodCA8IGN1cnJMdW0pIHtcbiAgICAgICAgY29sT3V0ID0gY29sUmlnaHQ7XG4gICAgICAgIGN1cnJMdW0gPSBsdW1SaWdodDtcbiAgICAgIH1cbiAgICAgIGlmIChsdW1VcCA8IGN1cnJMdW0pIHtcbiAgICAgICAgY29sT3V0ID0gY29sVXA7XG4gICAgICAgIGN1cnJMdW0gPSBsdW1VcDtcbiAgICAgIH1cbiAgICAgIGlmIChsdW1Eb3duIDwgY3Vyckx1bSkge1xuICAgICAgICBjb2xPdXQgPSBjb2xEb3duO1xuICAgICAgICBjdXJyTHVtID0gbHVtRG93bjtcbiAgICAgIH1cblxuICAgICAgb3V0W2N1cnJJZHgrK10gPSBjb2xPdXQ7XG4gICAgfVxuICB9XG4gIEZpbHRlcnMuX3NldFBpeGVscyhwaXhlbHMsIG91dCk7XG59O1xuXG4vLyBCTFVSXG5cbi8vIGludGVybmFsIGtlcm5lbCBzdHVmZiBmb3IgdGhlIGdhdXNzaWFuIGJsdXIgZmlsdGVyXG52YXIgYmx1clJhZGl1cztcbnZhciBibHVyS2VybmVsU2l6ZTtcbnZhciBibHVyS2VybmVsO1xudmFyIGJsdXJNdWx0O1xuXG4vKlxuICogUG9ydCBvZiBodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy9wcm9jZXNzaW5nL2Jsb2IvXG4gKiBtYXN0ZXIvY29yZS9zcmMvcHJvY2Vzc2luZy9jb3JlL1BJbWFnZS5qYXZhI0wxMjUwXG4gKlxuICogT3B0aW1pemVkIGNvZGUgZm9yIGJ1aWxkaW5nIHRoZSBibHVyIGtlcm5lbC5cbiAqIGZ1cnRoZXIgb3B0aW1pemVkIGJsdXIgY29kZSAoYXBwcm94LiAxNSUgZm9yIHJhZGl1cz0yMClcbiAqIGJpZ2dlciBzcGVlZCBnYWlucyBmb3IgbGFyZ2VyIHJhZGlpICh+MzAlKVxuICogYWRkZWQgc3VwcG9ydCBmb3IgdmFyaW91cyBpbWFnZSB0eXBlcyAoQUxQSEEsIFJHQiwgQVJHQilcbiAqIFt0b3hpIDA1MDcyOF1cbiAqL1xuZnVuY3Rpb24gYnVpbGRCbHVyS2VybmVsKHIpIHtcbiAgdmFyIHJhZGl1cyA9IChyICogMy41KSB8IDA7XG4gIHJhZGl1cyA9IHJhZGl1cyA8IDEgPyAxIDogcmFkaXVzIDwgMjQ4ID8gcmFkaXVzIDogMjQ4O1xuXG4gIGlmIChibHVyUmFkaXVzICE9PSByYWRpdXMpIHtcbiAgICBibHVyUmFkaXVzID0gcmFkaXVzO1xuICAgIGJsdXJLZXJuZWxTaXplID0gKDEgKyBibHVyUmFkaXVzKSA8PCAxO1xuICAgIGJsdXJLZXJuZWwgPSBuZXcgSW50MzJBcnJheShibHVyS2VybmVsU2l6ZSk7XG4gICAgYmx1ck11bHQgPSBuZXcgQXJyYXkoYmx1cktlcm5lbFNpemUpO1xuICAgIGZvciAodmFyIGwgPSAwOyBsIDwgYmx1cktlcm5lbFNpemU7IGwrKykge1xuICAgICAgYmx1ck11bHRbbF0gPSBuZXcgSW50MzJBcnJheSgyNTYpO1xuICAgIH1cblxuICAgIHZhciBiaywgYmtpO1xuICAgIHZhciBibSwgYm1pO1xuXG4gICAgZm9yICh2YXIgaSA9IDEsIHJhZGl1c2kgPSByYWRpdXMgLSAxOyBpIDwgcmFkaXVzOyBpKyspIHtcbiAgICAgIGJsdXJLZXJuZWxbcmFkaXVzICsgaV0gPSBibHVyS2VybmVsW3JhZGl1c2ldID0gYmtpID0gcmFkaXVzaSAqIHJhZGl1c2k7XG4gICAgICBibSA9IGJsdXJNdWx0W3JhZGl1cyArIGldO1xuICAgICAgYm1pID0gYmx1ck11bHRbcmFkaXVzaS0tXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgMjU2OyBqKyspIHtcbiAgICAgICAgYm1bal0gPSBibWlbal0gPSBia2kgKiBqO1xuICAgICAgfVxuICAgIH1cbiAgICBiayA9IGJsdXJLZXJuZWxbcmFkaXVzXSA9IHJhZGl1cyAqIHJhZGl1cztcbiAgICBibSA9IGJsdXJNdWx0W3JhZGl1c107XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDI1NjsgaysrKSB7XG4gICAgICBibVtrXSA9IGJrICogaztcbiAgICB9XG4gIH1cbn1cblxuLy8gUG9ydCBvZiBodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy9wcm9jZXNzaW5nL2Jsb2IvXG4vLyBtYXN0ZXIvY29yZS9zcmMvcHJvY2Vzc2luZy9jb3JlL1BJbWFnZS5qYXZhI0wxNDMzXG5mdW5jdGlvbiBibHVyQVJHQihjYW52YXMsIHJhZGl1cykge1xuICB2YXIgcGl4ZWxzID0gRmlsdGVycy5fdG9QaXhlbHMoY2FudmFzKTtcbiAgdmFyIHdpZHRoID0gY2FudmFzLndpZHRoO1xuICB2YXIgaGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcbiAgdmFyIG51bVBhY2tlZFBpeGVscyA9IHdpZHRoICogaGVpZ2h0O1xuICB2YXIgYXJnYiA9IG5ldyBJbnQzMkFycmF5KG51bVBhY2tlZFBpeGVscyk7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgbnVtUGFja2VkUGl4ZWxzOyBqKyspIHtcbiAgICBhcmdiW2pdID0gRmlsdGVycy5fZ2V0QVJHQihwaXhlbHMsIGopO1xuICB9XG4gIHZhciBzdW0sIGNyLCBjZywgY2IsIGNhO1xuICB2YXIgcmVhZCwgcmksIHltLCB5bWksIGJrMDtcbiAgdmFyIGEyID0gbmV3IEludDMyQXJyYXkobnVtUGFja2VkUGl4ZWxzKTtcbiAgdmFyIHIyID0gbmV3IEludDMyQXJyYXkobnVtUGFja2VkUGl4ZWxzKTtcbiAgdmFyIGcyID0gbmV3IEludDMyQXJyYXkobnVtUGFja2VkUGl4ZWxzKTtcbiAgdmFyIGIyID0gbmV3IEludDMyQXJyYXkobnVtUGFja2VkUGl4ZWxzKTtcbiAgdmFyIHlpID0gMDtcbiAgYnVpbGRCbHVyS2VybmVsKHJhZGl1cyk7XG4gIHZhciB4LCB5LCBpO1xuICB2YXIgYm07XG4gIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICBjYiA9IGNnID0gY3IgPSBjYSA9IHN1bSA9IDA7XG4gICAgICByZWFkID0geCAtIGJsdXJSYWRpdXM7XG4gICAgICBpZiAocmVhZCA8IDApIHtcbiAgICAgICAgYmswID0gLXJlYWQ7XG4gICAgICAgIHJlYWQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHJlYWQgPj0gd2lkdGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBiazAgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gYmswOyBpIDwgYmx1cktlcm5lbFNpemU7IGkrKykge1xuICAgICAgICBpZiAocmVhZCA+PSB3aWR0aCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjID0gYXJnYltyZWFkICsgeWldO1xuICAgICAgICBibSA9IGJsdXJNdWx0W2ldO1xuICAgICAgICBjYSArPSBibVsoYyAmIC0xNjc3NzIxNikgPj4+IDI0XTtcbiAgICAgICAgY3IgKz0gYm1bKGMgJiAxNjcxMTY4MCkgPj4gMTZdO1xuICAgICAgICBjZyArPSBibVsoYyAmIDY1MjgwKSA+PiA4XTtcbiAgICAgICAgY2IgKz0gYm1bYyAmIDI1NV07XG4gICAgICAgIHN1bSArPSBibHVyS2VybmVsW2ldO1xuICAgICAgICByZWFkKys7XG4gICAgICB9XG4gICAgICByaSA9IHlpICsgeDtcbiAgICAgIGEyW3JpXSA9IGNhIC8gc3VtO1xuICAgICAgcjJbcmldID0gY3IgLyBzdW07XG4gICAgICBnMltyaV0gPSBjZyAvIHN1bTtcbiAgICAgIGIyW3JpXSA9IGNiIC8gc3VtO1xuICAgIH1cbiAgICB5aSArPSB3aWR0aDtcbiAgfVxuICB5aSA9IDA7XG4gIHltID0gLWJsdXJSYWRpdXM7XG4gIHltaSA9IHltICogd2lkdGg7XG4gIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICBjYiA9IGNnID0gY3IgPSBjYSA9IHN1bSA9IDA7XG4gICAgICBpZiAoeW0gPCAwKSB7XG4gICAgICAgIGJrMCA9IHJpID0gLXltO1xuICAgICAgICByZWFkID0geDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh5bSA+PSBoZWlnaHQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBiazAgPSAwO1xuICAgICAgICByaSA9IHltO1xuICAgICAgICByZWFkID0geCArIHltaTtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IGJrMDsgaSA8IGJsdXJLZXJuZWxTaXplOyBpKyspIHtcbiAgICAgICAgaWYgKHJpID49IGhlaWdodCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJtID0gYmx1ck11bHRbaV07XG4gICAgICAgIGNhICs9IGJtW2EyW3JlYWRdXTtcbiAgICAgICAgY3IgKz0gYm1bcjJbcmVhZF1dO1xuICAgICAgICBjZyArPSBibVtnMltyZWFkXV07XG4gICAgICAgIGNiICs9IGJtW2IyW3JlYWRdXTtcbiAgICAgICAgc3VtICs9IGJsdXJLZXJuZWxbaV07XG4gICAgICAgIHJpKys7XG4gICAgICAgIHJlYWQgKz0gd2lkdGg7XG4gICAgICB9XG4gICAgICBhcmdiW3ggKyB5aV0gPVxuICAgICAgICAoKGNhIC8gc3VtKSA8PCAyNCkgfFxuICAgICAgICAoKGNyIC8gc3VtKSA8PCAxNikgfFxuICAgICAgICAoKGNnIC8gc3VtKSA8PCA4KSB8XG4gICAgICAgIChjYiAvIHN1bSk7XG4gICAgfVxuICAgIHlpICs9IHdpZHRoO1xuICAgIHltaSArPSB3aWR0aDtcbiAgICB5bSsrO1xuICB9XG4gIEZpbHRlcnMuX3NldFBpeGVscyhwaXhlbHMsIGFyZ2IpO1xufVxuXG5GaWx0ZXJzLmJsdXIgPSBmdW5jdGlvbihjYW52YXMsIHJhZGl1cykge1xuICBibHVyQVJHQihjYW52YXMsIHJhZGl1cyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZpbHRlcnM7XG5cbn0se31dLDQyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBJbWFnZVxuICogQHN1Ym1vZHVsZSBJbWFnZVxuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqL1xuXG4vKipcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIHA1IG1ldGhvZHMgZm9yIHRoZSBwNS5JbWFnZSBjbGFzc1xuICogZm9yIGRyYXdpbmcgaW1hZ2VzIHRvIHRoZSBtYWluIGRpc3BsYXkgY2FudmFzLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpOyAvLyBUaGlzIGlzIG5vdCBnbG9iYWwsIGJ1dCBKU0hpbnQgaXMgbm90IGF3YXJlIHRoYXQgLy8gdGhpcyBtb2R1bGUgaXMgaW1wbGljaXRseSBlbmNsb3NlZCB3aXRoIEJyb3dzZXJpZnk6IHRoaXMgb3ZlcnJpZGVzIHRoZSAvLyByZWRlZmluZWQtZ2xvYmFsIGVycm9yIGFuZCBwZXJtaXRzIHVzaW5nIHRoZSBuYW1lIFwiZnJhbWVzXCIgZm9yIHRoZSBhcnJheSAvLyBvZiBzYXZlZCBhbmltYXRpb24gZnJhbWVzLlxuXG4vKiBnbG9iYWwgZnJhbWVzOnRydWUgKi8gdmFyIGZyYW1lcyA9IFtdO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcDUuSW1hZ2UgKHRoZSBkYXRhdHlwZSBmb3Igc3RvcmluZyBpbWFnZXMpLiBUaGlzIHByb3ZpZGVzIGFcbiAqIGZyZXNoIGJ1ZmZlciBvZiBwaXhlbHMgdG8gcGxheSB3aXRoLiBTZXQgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3aXRoIHRoZVxuICogd2lkdGggYW5kIGhlaWdodCBwYXJhbWV0ZXJzLlxuICogPGJyPjxicj5cbiAqIC5waXhlbHMgZ2l2ZXMgYWNjZXNzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgYWxsIHRoZSBwaXhlbHNcbiAqIGluIHRoZSBkaXNwbGF5IHdpbmRvdy5cbiAqIFRoZXNlIHZhbHVlcyBhcmUgbnVtYmVycy4gVGhpcyBhcnJheSBpcyB0aGUgc2l6ZSAoaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlXG4gKiBmYWN0b3IgZm9yIHRoZSBwaXhlbERlbnNpdHkpIG9mIHRoZSBkaXNwbGF5IHdpbmRvdyB4NCxcbiAqIHJlcHJlc2VudGluZyB0aGUgUiwgRywgQiwgQSB2YWx1ZXMgaW4gb3JkZXIgZm9yIGVhY2ggcGl4ZWwsIG1vdmluZyBmcm9tXG4gKiBsZWZ0IHRvIHJpZ2h0IGFjcm9zcyBlYWNoIHJvdywgdGhlbiBkb3duIGVhY2ggY29sdW1uLiBTZWUgLnBpeGVscyBmb3JcbiAqIG1vcmUgaW5mby4gSXQgbWF5IGFsc28gYmUgc2ltcGxlciB0byB1c2Ugc2V0KCkgb3IgZ2V0KCkuXG4gKiA8YnI+PGJyPlxuICogQmVmb3JlIGFjY2Vzc2luZyB0aGUgcGl4ZWxzIG9mIGFuIGltYWdlLCB0aGUgZGF0YSBtdXN0IGxvYWRlZCB3aXRoIHRoZVxuICogbG9hZFBpeGVscygpIGZ1bmN0aW9uLiBBZnRlciB0aGUgYXJyYXkgZGF0YSBoYXMgYmVlbiBtb2RpZmllZCwgdGhlXG4gKiB1cGRhdGVQaXhlbHMoKSBmdW5jdGlvbiBtdXN0IGJlIHJ1biB0byB1cGRhdGUgdGhlIGNoYW5nZXMuXG4gKlxuICogQG1ldGhvZCBjcmVhdGVJbWFnZVxuICogQHBhcmFtICB7SW50ZWdlcn0gd2lkdGggIHdpZHRoIGluIHBpeGVsc1xuICogQHBhcmFtICB7SW50ZWdlcn0gaGVpZ2h0IGhlaWdodCBpbiBwaXhlbHNcbiAqIEByZXR1cm4ge3A1LkltYWdlfSAgICAgICB0aGUgcDUuSW1hZ2Ugb2JqZWN0XG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGltZyA9IGNyZWF0ZUltYWdlKDY2LCA2Nik7XG4gKiBpbWcubG9hZFBpeGVscygpO1xuICogZm9yICh2YXIgaSA9IDA7IGkgPCBpbWcud2lkdGg7IGkrKykge1xuICogICBmb3IgKHZhciBqID0gMDsgaiA8IGltZy5oZWlnaHQ7IGorKykge1xuICogICAgIGltZy5zZXQoaSwgaiwgY29sb3IoMCwgOTAsIDEwMikpO1xuICogICB9XG4gKiB9XG4gKiBpbWcudXBkYXRlUGl4ZWxzKCk7XG4gKiBpbWFnZShpbWcsIDE3LCAxNyk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nID0gY3JlYXRlSW1hZ2UoNjYsIDY2KTtcbiAqIGltZy5sb2FkUGl4ZWxzKCk7XG4gKiBmb3IgKHZhciBpID0gMDsgaSA8IGltZy53aWR0aDsgaSsrKSB7XG4gKiAgIGZvciAodmFyIGogPSAwOyBqIDwgaW1nLmhlaWdodDsgaisrKSB7XG4gKiAgICAgaW1nLnNldChpLCBqLCBjb2xvcigwLCA5MCwgMTAyLCAoaSAlIGltZy53aWR0aCkgKiAyKSk7XG4gKiAgIH1cbiAqIH1cbiAqIGltZy51cGRhdGVQaXhlbHMoKTtcbiAqIGltYWdlKGltZywgMTcsIDE3KTtcbiAqIGltYWdlKGltZywgMzQsIDM0KTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBwaW5rID0gY29sb3IoMjU1LCAxMDIsIDIwNCk7XG4gKiB2YXIgaW1nID0gY3JlYXRlSW1hZ2UoNjYsIDY2KTtcbiAqIGltZy5sb2FkUGl4ZWxzKCk7XG4gKiB2YXIgZCA9IHBpeGVsRGVuc2l0eSgpO1xuICogdmFyIGhhbGZJbWFnZSA9IDQgKiAod2lkdGggKiBkKSAqIChoZWlnaHQgLyAyICogZCk7XG4gKiBmb3IgKHZhciBpID0gMDsgaSA8IGhhbGZJbWFnZTsgaSArPSA0KSB7XG4gKiAgIGltZy5waXhlbHNbaV0gPSByZWQocGluayk7XG4gKiAgIGltZy5waXhlbHNbaSArIDFdID0gZ3JlZW4ocGluayk7XG4gKiAgIGltZy5waXhlbHNbaSArIDJdID0gYmx1ZShwaW5rKTtcbiAqICAgaW1nLnBpeGVsc1tpICsgM10gPSBhbHBoYShwaW5rKTtcbiAqIH1cbiAqIGltZy51cGRhdGVQaXhlbHMoKTtcbiAqIGltYWdlKGltZywgMTcsIDE3KTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDY2eDY2IGRhcmsgdHVycXVvaXNlIHJlY3QgaW4gY2VudGVyIG9mIGNhbnZhcy5cbiAqIDIgZ3JhZGF0ZWQgZGFyayB0dXJxdW9pc2UgcmVjdHMgZmFkZSBsZWZ0LiAxIGNlbnRlciAxIGJvdHRvbSByaWdodCBvZiBjYW52YXNcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICpcbiAqL1xucDUucHJvdG90eXBlLmNyZWF0ZUltYWdlID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjcmVhdGVJbWFnZScsIGFyZ3VtZW50cyk7XG4gIHJldHVybiBuZXcgcDUuSW1hZ2Uod2lkdGgsIGhlaWdodCk7XG59O1xuXG4vKipcbiAqICBTYXZlIHRoZSBjdXJyZW50IGNhbnZhcyBhcyBhbiBpbWFnZS4gSW4gU2FmYXJpLCB0aGlzIHdpbGwgb3BlbiB0aGVcbiAqICBpbWFnZSBpbiB0aGUgd2luZG93IGFuZCB0aGUgdXNlciBtdXN0IHByb3ZpZGUgdGhlaXIgb3duXG4gKiAgZmlsZW5hbWUgb24gc2F2ZS1hcy4gT3RoZXIgYnJvd3NlcnMgd2lsbCBlaXRoZXIgc2F2ZSB0aGVcbiAqICBmaWxlIGltbWVkaWF0ZWx5LCBvciBwcm9tcHQgdGhlIHVzZXIgd2l0aCBhIGRpYWxvZ3VlIHdpbmRvdy5cbiAqXG4gKiAgQG1ldGhvZCBzYXZlQ2FudmFzXG4gKiAgQHBhcmFtICB7cDUuRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudH0gc2VsZWN0ZWRDYW52YXMgICBhIHZhcmlhYmxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyBodG1sNSBjYW52YXMgKG9wdGlvbmFsKVxuICogIEBwYXJhbSAge1N0cmluZ30gW2ZpbGVuYW1lXVxuICogIEBwYXJhbSAge1N0cmluZ30gW2V4dGVuc2lvbl0gICAgICAnanBnJyBvciAncG5nJ1xuICpcbiAqICBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz48Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgYyA9IGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIGJhY2tncm91bmQoMjU1LCAwLCAwKTtcbiAqICAgc2F2ZUNhbnZhcyhjLCAnbXlDYW52YXMnLCAnanBnJyk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlciBub3Rlc3QnPjxjb2RlPlxuICogLy8gbm90ZSB0aGF0IHRoaXMgZXhhbXBsZSBoYXMgdGhlIHNhbWUgcmVzdWx0IGFzIGFib3ZlXG4gKiAvLyBpZiBubyBjYW52YXMgaXMgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBtYWluIGNhbnZhc1xuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBjID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgYmFja2dyb3VuZCgyNTUsIDAsIDApO1xuICogICBzYXZlQ2FudmFzKCdteUNhbnZhcycsICdqcGcnKTtcbiAqXG4gKiAgIC8vIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFyZSB2YWxpZFxuICogICBzYXZlQ2FudmFzKGMsICdteUNhbnZhcycsICdqcGcnKTtcbiAqICAgc2F2ZUNhbnZhcyhjLCAnbXlDYW52YXMuanBnJyk7XG4gKiAgIHNhdmVDYW52YXMoYywgJ215Q2FudmFzJyk7XG4gKiAgIHNhdmVDYW52YXMoYyk7XG4gKiAgIHNhdmVDYW52YXMoJ215Q2FudmFzJywgJ3BuZycpO1xuICogICBzYXZlQ2FudmFzKCdteUNhbnZhcycpO1xuICogICBzYXZlQ2FudmFzKCk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICovXG4vKipcbiAqICBAbWV0aG9kIHNhdmVDYW52YXNcbiAqICBAcGFyYW0gIHtTdHJpbmd9IFtmaWxlbmFtZV1cbiAqICBAcGFyYW0gIHtTdHJpbmd9IFtleHRlbnNpb25dXG4gKi9cbnA1LnByb3RvdHlwZS5zYXZlQ2FudmFzID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3NhdmVDYW52YXMnLCBhcmd1bWVudHMpO1xuXG4gIC8vIGNvcHkgYXJndW1lbnRzIHRvIGFycmF5XG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICB2YXIgaHRtbENhbnZhcywgZmlsZW5hbWUsIGV4dGVuc2lvbjtcblxuICBpZiAoYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHtcbiAgICBodG1sQ2FudmFzID0gYXJndW1lbnRzWzBdO1xuICAgIGFyZ3Muc2hpZnQoKTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBwNS5FbGVtZW50KSB7XG4gICAgaHRtbENhbnZhcyA9IGFyZ3VtZW50c1swXS5lbHQ7XG4gICAgYXJncy5zaGlmdCgpO1xuICB9IGVsc2Uge1xuICAgIGh0bWxDYW52YXMgPSB0aGlzLl9jdXJFbGVtZW50ICYmIHRoaXMuX2N1ckVsZW1lbnQuZWx0O1xuICB9XG5cbiAgaWYgKGFyZ3MubGVuZ3RoID49IDEpIHtcbiAgICBmaWxlbmFtZSA9IGFyZ3NbMF07XG4gIH1cbiAgaWYgKGFyZ3MubGVuZ3RoID49IDIpIHtcbiAgICBleHRlbnNpb24gPSBhcmdzWzFdO1xuICB9XG5cbiAgZXh0ZW5zaW9uID1cbiAgICBleHRlbnNpb24gfHxcbiAgICBwNS5wcm90b3R5cGUuX2NoZWNrRmlsZUV4dGVuc2lvbihmaWxlbmFtZSwgZXh0ZW5zaW9uKVsxXSB8fFxuICAgICdwbmcnO1xuXG4gIHZhciBtaW1lVHlwZTtcbiAgc3dpdGNoIChleHRlbnNpb24pIHtcbiAgICBkZWZhdWx0OlxuICAgICAgLy9jYXNlICdwbmcnOlxuICAgICAgbWltZVR5cGUgPSAnaW1hZ2UvcG5nJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2pwZWcnOlxuICAgIGNhc2UgJ2pwZyc6XG4gICAgICBtaW1lVHlwZSA9ICdpbWFnZS9qcGVnJztcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaHRtbENhbnZhcy50b0Jsb2IoZnVuY3Rpb24oYmxvYikge1xuICAgIHA1LnByb3RvdHlwZS5kb3dubG9hZEZpbGUoYmxvYiwgZmlsZW5hbWUsIGV4dGVuc2lvbik7XG4gIH0sIG1pbWVUeXBlKTtcbn07XG5cbi8qKlxuICogIENhcHR1cmUgYSBzZXF1ZW5jZSBvZiBmcmFtZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBtb3ZpZS5cbiAqICBBY2NlcHRzIGEgY2FsbGJhY2suIEZvciBleGFtcGxlLCB5b3UgbWF5IHdpc2ggdG8gc2VuZCB0aGUgZnJhbWVzXG4gKiAgdG8gYSBzZXJ2ZXIgd2hlcmUgdGhleSBjYW4gYmUgc3RvcmVkIG9yIGNvbnZlcnRlZCBpbnRvIGEgbW92aWUuXG4gKiAgSWYgbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBicm93c2VyIHdpbGwgcG9wIHVwIHNhdmUgZGlhbG9ndWVzIGluIGFuXG4gKiAgYXR0ZW1wdCB0byBkb3dubG9hZCBhbGwgb2YgdGhlIGltYWdlcyB0aGF0IGhhdmUganVzdCBiZWVuIGNyZWF0ZWQuIFdpdGggdGhlXG4gKiAgY2FsbGJhY2sgcHJvdmlkZWQgdGhlIGltYWdlIGRhdGEgaXNuJ3Qgc2F2ZWQgYnkgZGVmYXVsdCBidXQgaW5zdGVhZCBwYXNzZWRcbiAqICBhcyBhbiBhcmd1bWVudCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gYXMgYW4gYXJyYXkgb2Ygb2JqZWN0cywgd2l0aCB0aGVcbiAqICBzaXplIG9mIGFycmF5IGVxdWFsIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzLlxuICpcbiAqICBOb3RlIHRoYXQgc2F2ZUZyYW1lcygpIHdpbGwgb25seSBzYXZlIHRoZSBmaXJzdCAxNSBmcmFtZXMgb2YgYW4gYW5pbWF0aW9uLlxuICogIFRvIGV4cG9ydCBsb25nZXIgYW5pbWF0aW9ucywgeW91IG1pZ2h0IGxvb2sgaW50byBhIGxpYnJhcnkgbGlrZVxuICogIDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vc3BpdGUvY2NhcHR1cmUuanMvXCI+Y2NhcHR1cmUuanM8L2E+LlxuICpcbiAqICBAbWV0aG9kIHNhdmVGcmFtZXNcbiAqICBAcGFyYW0gIHtTdHJpbmd9ICAgZmlsZW5hbWVcbiAqICBAcGFyYW0gIHtTdHJpbmd9ICAgZXh0ZW5zaW9uICdqcGcnIG9yICdwbmcnXG4gKiAgQHBhcmFtICB7TnVtYmVyfSAgIGR1cmF0aW9uICBEdXJhdGlvbiBpbiBzZWNvbmRzIHRvIHNhdmUgdGhlIGZyYW1lcyBmb3IuXG4gKiAgQHBhcmFtICB7TnVtYmVyfSAgIGZyYW1lcmF0ZSAgRnJhbWVyYXRlIHRvIHNhdmUgdGhlIGZyYW1lcyBpbi5cbiAqICBAcGFyYW0gIHtmdW5jdGlvbihBcnJheSl9IFtjYWxsYmFja10gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBoYW5kbGUgdGhlIGltYWdlIGRhdGEuIFRoaXMgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYWNjZXB0IGFuIGFycmF5IGFzIGFyZ3VtZW50LiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSB3aWxsIGNvbnRhaW4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMgb2Ygb2JqZWN0cy4gRWFjaCBvYmplY3QgaGFzIHRocmVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogaW1hZ2VEYXRhIC0gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS9vY3RldC1zdHJlYW0sIGZpbGVuYW1lIGFuZCBleHRlbnNpb24uXG4gKiAgQGV4YW1wbGVcbiAqICA8ZGl2Pjxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZChtb3VzZVgpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcbiAqICAgc2F2ZUZyYW1lcygnb3V0JywgJ3BuZycsIDEsIDI1LCBmdW5jdGlvbihkYXRhKSB7XG4gKiAgICAgcHJpbnQoZGF0YSk7XG4gKiAgIH0pO1xuICogfVxuPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGNhbnZhcyBiYWNrZ3JvdW5kIGdvZXMgZnJvbSBsaWdodCB0byBkYXJrIHdpdGggbW91c2UgeC5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5zYXZlRnJhbWVzID0gZnVuY3Rpb24oZk5hbWUsIGV4dCwgX2R1cmF0aW9uLCBfZnBzLCBjYWxsYmFjaykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdzYXZlRnJhbWVzJywgYXJndW1lbnRzKTtcbiAgdmFyIGR1cmF0aW9uID0gX2R1cmF0aW9uIHx8IDM7XG4gIGR1cmF0aW9uID0gcDUucHJvdG90eXBlLmNvbnN0cmFpbihkdXJhdGlvbiwgMCwgMTUpO1xuICBkdXJhdGlvbiA9IGR1cmF0aW9uICogMTAwMDtcbiAgdmFyIGZwcyA9IF9mcHMgfHwgMTU7XG4gIGZwcyA9IHA1LnByb3RvdHlwZS5jb25zdHJhaW4oZnBzLCAwLCAyMik7XG4gIHZhciBjb3VudCA9IDA7XG5cbiAgdmFyIG1ha2VGcmFtZSA9IHA1LnByb3RvdHlwZS5fbWFrZUZyYW1lO1xuICB2YXIgY252ID0gdGhpcy5fY3VyRWxlbWVudC5lbHQ7XG4gIHZhciBmcmFtZUZhY3RvcnkgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICBtYWtlRnJhbWUoZk5hbWUgKyBjb3VudCwgZXh0LCBjbnYpO1xuICAgIGNvdW50Kys7XG4gIH0sIDEwMDAgLyBmcHMpO1xuXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgY2xlYXJJbnRlcnZhbChmcmFtZUZhY3RvcnkpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soZnJhbWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGYgPSBmcmFtZXNbaV07XG4gICAgICAgIHA1LnByb3RvdHlwZS5kb3dubG9hZEZpbGUoZi5pbWFnZURhdGEsIGYuZmlsZW5hbWUsIGYuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnJhbWVzID0gW107IC8vIGNsZWFyIGZyYW1lc1xuICB9LCBkdXJhdGlvbiArIDAuMDEpO1xufTtcblxucDUucHJvdG90eXBlLl9tYWtlRnJhbWUgPSBmdW5jdGlvbihmaWxlbmFtZSwgZXh0ZW5zaW9uLCBfY252KSB7XG4gIHZhciBjbnY7XG4gIGlmICh0aGlzKSB7XG4gICAgY252ID0gdGhpcy5fY3VyRWxlbWVudC5lbHQ7XG4gIH0gZWxzZSB7XG4gICAgY252ID0gX2NudjtcbiAgfVxuICB2YXIgbWltZVR5cGU7XG4gIGlmICghZXh0ZW5zaW9uKSB7XG4gICAgZXh0ZW5zaW9uID0gJ3BuZyc7XG4gICAgbWltZVR5cGUgPSAnaW1hZ2UvcG5nJztcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKGV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICdwbmcnOlxuICAgICAgICBtaW1lVHlwZSA9ICdpbWFnZS9wbmcnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2pwZWcnOlxuICAgICAgICBtaW1lVHlwZSA9ICdpbWFnZS9qcGVnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdqcGcnOlxuICAgICAgICBtaW1lVHlwZSA9ICdpbWFnZS9qcGVnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBtaW1lVHlwZSA9ICdpbWFnZS9wbmcnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFyIGRvd25sb2FkTWltZSA9ICdpbWFnZS9vY3RldC1zdHJlYW0nO1xuICB2YXIgaW1hZ2VEYXRhID0gY252LnRvRGF0YVVSTChtaW1lVHlwZSk7XG4gIGltYWdlRGF0YSA9IGltYWdlRGF0YS5yZXBsYWNlKG1pbWVUeXBlLCBkb3dubG9hZE1pbWUpO1xuXG4gIHZhciB0aGlzRnJhbWUgPSB7fTtcbiAgdGhpc0ZyYW1lLmltYWdlRGF0YSA9IGltYWdlRGF0YTtcbiAgdGhpc0ZyYW1lLmZpbGVuYW1lID0gZmlsZW5hbWU7XG4gIHRoaXNGcmFtZS5leHQgPSBleHRlbnNpb247XG4gIGZyYW1lcy5wdXNoKHRoaXNGcmFtZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4uL2NvcmUvY29yZVwiOjIyfV0sNDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIEltYWdlXG4gKiBAc3VibW9kdWxlIExvYWRpbmcgJiBEaXNwbGF5aW5nXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG52YXIgRmlsdGVycyA9IF9kZXJlcV8oJy4vZmlsdGVycycpO1xudmFyIGNhbnZhcyA9IF9kZXJlcV8oJy4uL2NvcmUvY2FudmFzJyk7XG52YXIgY29uc3RhbnRzID0gX2RlcmVxXygnLi4vY29yZS9jb25zdGFudHMnKTtcblxuX2RlcmVxXygnLi4vY29yZS9lcnJvcl9oZWxwZXJzJyk7XG5cbi8qKlxuICogTG9hZHMgYW4gaW1hZ2UgZnJvbSBhIHBhdGggYW5kIGNyZWF0ZXMgYSBwNS5JbWFnZSBmcm9tIGl0LlxuICogPGJyPjxicj5cbiAqIFRoZSBpbWFnZSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBmb3IgcmVuZGVyaW5nXG4gKiBJZiB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgaW1hZ2UgaXMgcmVhZHkgYmVmb3JlIGRvaW5nXG4gKiBhbnl0aGluZyB3aXRoIGl0LCBwbGFjZSB0aGUgbG9hZEltYWdlKCkgY2FsbCBpbiBwcmVsb2FkKCkuXG4gKiBZb3UgbWF5IGFsc28gc3VwcGx5IGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBpbWFnZSB3aGVuIGl0J3MgcmVhZHkuXG4gKiA8YnI+PGJyPlxuICogVGhlIHBhdGggdG8gdGhlIGltYWdlIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgSFRNTCBmaWxlXG4gKiB0aGF0IGxpbmtzIGluIHlvdXIgc2tldGNoLiBMb2FkaW5nIGFuIGltYWdlIGZyb20gYSBVUkwgb3Igb3RoZXJcbiAqIHJlbW90ZSBsb2NhdGlvbiBtYXkgYmUgYmxvY2tlZCBkdWUgdG8geW91ciBicm93c2VyJ3MgYnVpbHQtaW5cbiAqIHNlY3VyaXR5LlxuICpcbiAqIEBtZXRob2QgbG9hZEltYWdlXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBhdGggUGF0aCBvZiB0aGUgaW1hZ2UgdG8gYmUgbG9hZGVkXG4gKiBAcGFyYW0gIHtmdW5jdGlvbihwNS5JbWFnZSl9IFtzdWNjZXNzQ2FsbGJhY2tdIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGltYWdlIGlzIGxvYWRlZC4gV2lsbCBiZSBwYXNzZWQgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDUuSW1hZ2UuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbihFdmVudCl9ICAgIFtmYWlsdXJlQ2FsbGJhY2tdIGNhbGxlZCB3aXRoIGV2ZW50IGVycm9yIGlmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGltYWdlIGZhaWxzIHRvIGxvYWQuXG4gKiBAcmV0dXJuIHtwNS5JbWFnZX0gICAgICAgICAgICAgdGhlIHA1LkltYWdlIG9iamVjdFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBpbWc7XG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9sYURlZmVuc2UuanBnJyk7XG4gKiB9XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgaW1hZ2UoaW1nLCAwLCAwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIC8vIGhlcmUgd2UgdXNlIGEgY2FsbGJhY2sgdG8gZGlzcGxheSB0aGUgaW1hZ2UgYWZ0ZXIgbG9hZGluZ1xuICogICBsb2FkSW1hZ2UoJ2Fzc2V0cy9sYURlZmVuc2UuanBnJywgZnVuY3Rpb24oaW1nKSB7XG4gKiAgICAgaW1hZ2UoaW1nLCAwLCAwKTtcbiAqICAgfSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBpbWFnZSBvZiB0aGUgdW5kZXJzaWRlIG9mIGEgd2hpdGUgdW1icmVsbGEgYW5kIGdyaWRlZCBjZWlsaWxuZyBhYm92ZVxuICogaW1hZ2Ugb2YgdGhlIHVuZGVyc2lkZSBvZiBhIHdoaXRlIHVtYnJlbGxhIGFuZCBncmlkZWQgY2VpbGlsbmcgYWJvdmVcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5sb2FkSW1hZ2UgPSBmdW5jdGlvbihwYXRoLCBzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdsb2FkSW1hZ2UnLCBhcmd1bWVudHMpO1xuICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gIHZhciBwSW1nID0gbmV3IHA1LkltYWdlKDEsIDEsIHRoaXMpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgIHBJbWcud2lkdGggPSBwSW1nLmNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcbiAgICBwSW1nLmhlaWdodCA9IHBJbWcuY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG5cbiAgICAvLyBEcmF3IHRoZSBpbWFnZSBpbnRvIHRoZSBiYWNraW5nIGNhbnZhcyBvZiB0aGUgcDUuSW1hZ2VcbiAgICBwSW1nLmRyYXdpbmdDb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgIHBJbWcubW9kaWZpZWQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBzdWNjZXNzQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHN1Y2Nlc3NDYWxsYmFjayhwSW1nKTtcbiAgICB9XG5cbiAgICBzZWxmLl9kZWNyZW1lbnRQcmVsb2FkKCk7XG4gIH07XG4gIGltZy5vbmVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgIHA1Ll9mcmllbmRseUZpbGVMb2FkRXJyb3IoMCwgaW1nLnNyYyk7XG4gICAgaWYgKHR5cGVvZiBmYWlsdXJlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZhaWx1cmVDYWxsYmFjayhlKTtcbiAgICB9XG4gIH07XG5cbiAgLy9zZXQgY3Jvc3NPcmlnaW4gaW4gY2FzZSBpbWFnZSBpcyBzZXJ2ZWQgd2hpY2ggQ09SUyBoZWFkZXJzXG4gIC8vdGhpcyB3aWxsIGxldCB1cyBkcmF3IHRvIGNhbnZhcyB3aXRob3V0IHRhaW50aW5nIGl0LlxuICAvL3NlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0hUTUwvQ09SU19FbmFibGVkX0ltYWdlXG4gIC8vIFdoZW4gdXNpbmcgZGF0YS11cmlzIHRoZSBmaWxlIHdpbGwgYmUgbG9hZGVkIGxvY2FsbHlcbiAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBjcm9zc09yaWdpbiB3aXRoIGJhc2U2NCBmaWxlIHR5cGVzXG4gIGlmIChwYXRoLmluZGV4T2YoJ2RhdGE6aW1hZ2UvJykgIT09IDApIHtcbiAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgfVxuXG4gIC8vc3RhcnQgbG9hZGluZyB0aGUgaW1hZ2VcbiAgaW1nLnNyYyA9IHBhdGg7XG5cbiAgcmV0dXJuIHBJbWc7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBjbGlwcGluZyBwYXJhbXMuIFBlciBkcmF3SW1hZ2Ugc3BlYyBzV2lkdGggYW5kIHNIaWdodCBjYW5ub3QgYmVcbiAqIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiBpbWFnZSBpbnRyaW5zaWMgd2lkdGggYW5kIGhlaWdodFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBzVmFsXG4gKiBAcGFyYW0ge051bWJlcn0gaVZhbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9zQXNzaWduKHNWYWwsIGlWYWwpIHtcbiAgaWYgKHNWYWwgPiAwICYmIHNWYWwgPCBpVmFsKSB7XG4gICAgcmV0dXJuIHNWYWw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlWYWw7XG4gIH1cbn1cblxuLyoqXG4gKiBEcmF3IGFuIGltYWdlIHRvIHRoZSBwNS5qcyBjYW52YXMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnMuIFRoZVxuICogc2ltcGxlc3QgdXNlIHJlcXVpcmVzIG9ubHkgdGhyZWUgcGFyYW1ldGVyczogaW1nLCB4LCBhbmQgeeKAlHdoZXJlICh4LCB5KSBpc1xuICogdGhlIHBvc2l0aW9uIG9mIHRoZSBpbWFnZS4gVHdvIG1vcmUgcGFyYW1ldGVycyBjYW4gb3B0aW9uYWxseSBiZSBhZGRlZCB0b1xuICogc3BlY2lmeSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHdpdGggYWxsIGVpZ2h0IE51bWJlciBwYXJhbWV0ZXJzLiBUb1xuICogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFsbCB0aGVzZSBwYXJhbWV0ZXJzLCBwNS5qcyB1c2VzIHRoZSBsYW5ndWFnZSBvZlxuICogXCJkZXN0aW5hdGlvbiByZWN0YW5nbGVcIiAod2hpY2ggY29ycmVzcG9uZHMgdG8gXCJkeFwiLCBcImR5XCIsIGV0Yy4pIGFuZCBcInNvdXJjZVxuICogaW1hZ2VcIiAod2hpY2ggY29ycmVzcG9uZHMgdG8gXCJzeFwiLCBcInN5XCIsIGV0Yy4pIGJlbG93LiBTcGVjaWZ5aW5nIHRoZVxuICogXCJzb3VyY2UgaW1hZ2VcIiBkaW1lbnNpb25zIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBkaXNwbGF5IGFcbiAqIHN1YnNlY3Rpb24gb2YgdGhlIHNvdXJjZSBpbWFnZSBpbnN0ZWFkIG9mIHRoZSB3aG9sZSB0aGluZy4gSGVyZSdzIGEgZGlhZ3JhbVxuICogdG8gZXhwbGFpbiBmdXJ0aGVyOlxuICogPGltZyBzcmM9XCJhc3NldHMvZHJhd0ltYWdlLnBuZ1wiPjwvaW1nPlxuICpcbiAqIEBtZXRob2QgaW1hZ2VcbiAqIEBwYXJhbSAge3A1LkltYWdlfHA1LkVsZW1lbnR9IGltZyAgICB0aGUgaW1hZ2UgdG8gZGlzcGxheVxuICogQHBhcmFtICB7TnVtYmVyfSAgIHggICAgIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2VcbiAqIEBwYXJhbSAge051bWJlcn0gICB5ICAgICB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgW3dpZHRoXSAgdGhlIHdpZHRoIHRvIGRyYXcgdGhlIGltYWdlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgW2hlaWdodF0gdGhlIGhlaWdodCB0byBkcmF3IHRoZSBpbWFnZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBpbWc7XG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9sYURlZmVuc2UuanBnJyk7XG4gKiB9XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgLy8gVG9wLWxlZnQgY29ybmVyIG9mIHRoZSBpbWcgaXMgYXQgKDAsIDApXG4gKiAgIC8vIFdpZHRoIGFuZCBoZWlnaHQgYXJlIHRoZSBpbWcncyBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0XG4gKiAgIGltYWdlKGltZywgMCwgMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBpbWc7XG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9sYURlZmVuc2UuanBnJyk7XG4gKiB9XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgYmFja2dyb3VuZCg1MCk7XG4gKiAgIC8vIFRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgaW1nIGlzIGF0ICgxMCwgMTApXG4gKiAgIC8vIFdpZHRoIGFuZCBoZWlnaHQgYXJlIDUwIHggNTBcbiAqICAgaW1hZ2UoaW1nLCAxMCwgMTAsIDUwLCA1MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICAvLyBIZXJlLCB3ZSB1c2UgYSBjYWxsYmFjayB0byBkaXNwbGF5IHRoZSBpbWFnZSBhZnRlciBsb2FkaW5nXG4gKiAgIGxvYWRJbWFnZSgnYXNzZXRzL2xhRGVmZW5zZS5qcGcnLCBmdW5jdGlvbihpbWcpIHtcbiAqICAgICBpbWFnZShpbWcsIDAsIDApO1xuICogICB9KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGltZztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2dyYWRpZW50LnBuZycpO1xuICogfVxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIC8vIDEuIEJhY2tncm91bmQgaW1hZ2VcbiAqICAgLy8gVG9wLWxlZnQgY29ybmVyIG9mIHRoZSBpbWcgaXMgYXQgKDAsIDApXG4gKiAgIC8vIFdpZHRoIGFuZCBoZWlnaHQgYXJlIHRoZSBpbWcncyBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0LCAxMDAgeCAxMDBcbiAqICAgaW1hZ2UoaW1nLCAwLCAwKTtcbiAqICAgLy8gMi4gVG9wIHJpZ2h0IGltYWdlXG4gKiAgIC8vIFRvcC1sZWZ0IGNvcm5lciBvZiBkZXN0aW5hdGlvbiByZWN0YW5nbGUgaXMgYXQgKDUwLCAwKVxuICogICAvLyBEZXN0aW5hdGlvbiByZWN0YW5nbGUgd2lkdGggYW5kIGhlaWdodCBhcmUgNDAgeCAyMFxuICogICAvLyBUaGUgbmV4dCBwYXJhbWV0ZXJzIGFyZSByZWxhdGl2ZSB0byB0aGUgc291cmNlIGltYWdlOlxuICogICAvLyAtIFN0YXJ0aW5nIGF0IHBvc2l0aW9uICg1MCwgNTApIG9uIHRoZSBzb3VyY2UgaW1hZ2UsIGNhcHR1cmUgYSA1MCB4IDUwXG4gKiAgIC8vIHN1YnNlY3Rpb25cbiAqICAgLy8gLSBEcmF3IHRoaXMgc3Vic2VjdGlvbiB0byBmaWxsIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGVcbiAqICAgaW1hZ2UoaW1nLCA1MCwgMCwgNDAsIDIwLCA1MCwgNTAsIDUwLCA1MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIEBhbHRcbiAqIGltYWdlIG9mIHRoZSB1bmRlcnNpZGUgb2YgYSB3aGl0ZSB1bWJyZWxsYSBhbmQgZ3JpZGRlZCBjZWlsaW5nIGFib3ZlXG4gKiBpbWFnZSBvZiB0aGUgdW5kZXJzaWRlIG9mIGEgd2hpdGUgdW1icmVsbGEgYW5kIGdyaWRkZWQgY2VpbGluZyBhYm92ZVxuICpcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGltYWdlXG4gKiBAcGFyYW0gIHtwNS5JbWFnZXxwNS5FbGVtZW50fSBpbWdcbiAqIEBwYXJhbSAge051bWJlcn0gICBkeCAgICAgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlIGluIHdoaWNoIHRvIGRyYXcgdGhlIHNvdXJjZSBpbWFnZVxuICogQHBhcmFtICB7TnVtYmVyfSAgIGR5ICAgICB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGUgaW4gd2hpY2ggdG8gZHJhdyB0aGUgc291cmNlIGltYWdlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgZFdpZHRoICB0aGUgd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZVxuICogQHBhcmFtICB7TnVtYmVyfSAgIGRIZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgc3ggICAgIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHN1YnNlY3Rpb24gb2YgdGhlIHNvdXJjZVxuICogaW1hZ2UgdG8gZHJhdyBpbnRvIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGVcbiAqIEBwYXJhbSAge051bWJlcn0gICBzeSAgICAgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc3Vic2VjdGlvbiBvZiB0aGUgc291cmNlXG4gKiBpbWFnZSB0byBkcmF3IGludG8gdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZVxuICogQHBhcmFtIHtOdW1iZXJ9ICAgIFtzV2lkdGhdIHRoZSB3aWR0aCBvZiB0aGUgc3Vic2VjdGlvbiBvZiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGltYWdlIHRvIGRyYXcgaW50byB0aGUgZGVzdGluYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlXG4gKiBAcGFyYW0ge051bWJlcn0gICAgW3NIZWlnaHRdIHRoZSBoZWlnaHQgb2YgdGhlIHN1YnNlY3Rpb24gb2YgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgaW1hZ2UgdG8gZHJhdyBpbnRvIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGVcbiAqL1xucDUucHJvdG90eXBlLmltYWdlID0gZnVuY3Rpb24oXG4gIGltZyxcbiAgZHgsXG4gIGR5LFxuICBkV2lkdGgsXG4gIGRIZWlnaHQsXG4gIHN4LFxuICBzeSxcbiAgc1dpZHRoLFxuICBzSGVpZ2h0XG4pIHtcbiAgLy8gc2V0IGRlZmF1bHRzIHBlciBzcGVjOiBodHRwczovL2dvby5nbC8zeWtmT3FcblxuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdpbWFnZScsIGFyZ3VtZW50cyk7XG5cbiAgdmFyIGRlZlcgPSBpbWcud2lkdGg7XG4gIHZhciBkZWZIID0gaW1nLmhlaWdodDtcblxuICBpZiAoaW1nLmVsdCAmJiBpbWcuZWx0LnZpZGVvV2lkdGggJiYgIWltZy5jYW52YXMpIHtcbiAgICAvLyB2aWRlbyBubyBjYW52YXNcbiAgICBkZWZXID0gaW1nLmVsdC52aWRlb1dpZHRoO1xuICAgIGRlZkggPSBpbWcuZWx0LnZpZGVvSGVpZ2h0O1xuICB9XG5cbiAgdmFyIF9keCA9IGR4O1xuICB2YXIgX2R5ID0gZHk7XG4gIHZhciBfZHcgPSBkV2lkdGggfHwgZGVmVztcbiAgdmFyIF9kaCA9IGRIZWlnaHQgfHwgZGVmSDtcbiAgdmFyIF9zeCA9IHN4IHx8IDA7XG4gIHZhciBfc3kgPSBzeSB8fCAwO1xuICB2YXIgX3N3ID0gc1dpZHRoIHx8IGRlZlc7XG4gIHZhciBfc2ggPSBzSGVpZ2h0IHx8IGRlZkg7XG5cbiAgX3N3ID0gX3NBc3NpZ24oX3N3LCBkZWZXKTtcbiAgX3NoID0gX3NBc3NpZ24oX3NoLCBkZWZIKTtcblxuICAvLyBUaGlzIHBhcnQgbmVlZHMgY2xlYW51cCBhbmQgdW5pdCB0ZXN0c1xuICAvLyBzZWUgaXNzdWVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3A1LmpzL2lzc3Vlcy8xNzQxXG4gIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy9wNS5qcy9pc3N1ZXMvMTY3M1xuICB2YXIgcGQgPSAxO1xuXG4gIGlmIChpbWcuZWx0ICYmICFpbWcuY2FudmFzICYmIGltZy5lbHQuc3R5bGUud2lkdGgpIHtcbiAgICAvL2lmIGltZyBpcyB2aWRlbyBhbmQgaW1nLmVsdC5zaXplKCkgaGFzIGJlZW4gdXNlZCBhbmRcbiAgICAvL25vIHdpZHRoIHBhc3NlZCB0byBpbWFnZSgpXG4gICAgaWYgKGltZy5lbHQudmlkZW9XaWR0aCAmJiAhZFdpZHRoKSB7XG4gICAgICBwZCA9IGltZy5lbHQudmlkZW9XaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9hbGwgb3RoZXIgY2FzZXNcbiAgICAgIHBkID0gaW1nLmVsdC53aWR0aDtcbiAgICB9XG4gICAgcGQgLz0gcGFyc2VJbnQoaW1nLmVsdC5zdHlsZS53aWR0aCwgMTApO1xuICB9XG5cbiAgX3N4ICo9IHBkO1xuICBfc3kgKj0gcGQ7XG4gIF9zaCAqPSBwZDtcbiAgX3N3ICo9IHBkO1xuXG4gIHZhciB2YWxzID0gY2FudmFzLm1vZGVBZGp1c3QoX2R4LCBfZHksIF9kdywgX2RoLCB0aGlzLl9yZW5kZXJlci5faW1hZ2VNb2RlKTtcblxuICAvLyB0aW50IHRoZSBpbWFnZSBpZiB0aGVyZSBpcyBhIHRpbnRcbiAgdGhpcy5fcmVuZGVyZXIuaW1hZ2UoaW1nLCBfc3gsIF9zeSwgX3N3LCBfc2gsIHZhbHMueCwgdmFscy55LCB2YWxzLncsIHZhbHMuaCk7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGZpbGwgdmFsdWUgZm9yIGRpc3BsYXlpbmcgaW1hZ2VzLiBJbWFnZXMgY2FuIGJlIHRpbnRlZCB0b1xuICogc3BlY2lmaWVkIGNvbG9ycyBvciBtYWRlIHRyYW5zcGFyZW50IGJ5IGluY2x1ZGluZyBhbiBhbHBoYSB2YWx1ZS5cbiAqIDxicj48YnI+XG4gKiBUbyBhcHBseSB0cmFuc3BhcmVuY3kgdG8gYW4gaW1hZ2Ugd2l0aG91dCBhZmZlY3RpbmcgaXRzIGNvbG9yLCB1c2VcbiAqIHdoaXRlIGFzIHRoZSB0aW50IGNvbG9yIGFuZCBzcGVjaWZ5IGFuIGFscGhhIHZhbHVlLiBGb3IgaW5zdGFuY2UsXG4gKiB0aW50KDI1NSwgMTI4KSB3aWxsIG1ha2UgYW4gaW1hZ2UgNTAlIHRyYW5zcGFyZW50IChhc3N1bWluZyB0aGUgZGVmYXVsdFxuICogYWxwaGEgcmFuZ2Ugb2YgMC0yNTUsIHdoaWNoIGNhbiBiZSBjaGFuZ2VkIHdpdGggY29sb3JNb2RlKCkpLlxuICogPGJyPjxicj5cbiAqIFRoZSB2YWx1ZSBmb3IgdGhlIGdyYXkgcGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50XG4gKiBtYXhpbXVtIHZhbHVlIGFzIHNwZWNpZmllZCBieSBjb2xvck1vZGUoKS4gVGhlIGRlZmF1bHQgbWF4aW11bSB2YWx1ZSBpc1xuICogMjU1LlxuICpcbiAqXG4gKiBAbWV0aG9kIHRpbnRcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIHYxICAgICAgcmVkIG9yIGh1ZSB2YWx1ZSByZWxhdGl2ZSB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBjb2xvciByYW5nZVxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgdjIgICAgICBncmVlbiBvciBzYXR1cmF0aW9uIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICB2MyAgICAgIGJsdWUgb3IgYnJpZ2h0bmVzcyB2YWx1ZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb2xvciByYW5nZVxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgW2FscGhhXVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvbGFEZWZlbnNlLmpwZycpO1xuICogfVxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGltYWdlKGltZywgMCwgMCk7XG4gKiAgIHRpbnQoMCwgMTUzLCAyMDQpOyAvLyBUaW50IGJsdWVcbiAqICAgaW1hZ2UoaW1nLCA1MCwgMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvbGFEZWZlbnNlLmpwZycpO1xuICogfVxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGltYWdlKGltZywgMCwgMCk7XG4gKiAgIHRpbnQoMCwgMTUzLCAyMDQsIDEyNik7IC8vIFRpbnQgYmx1ZSBhbmQgc2V0IHRyYW5zcGFyZW5jeVxuICogICBpbWFnZShpbWcsIDUwLCAwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBpbWc7XG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9sYURlZmVuc2UuanBnJyk7XG4gKiB9XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgaW1hZ2UoaW1nLCAwLCAwKTtcbiAqICAgdGludCgyNTUsIDEyNik7IC8vIEFwcGx5IHRyYW5zcGFyZW5jeSB3aXRob3V0IGNoYW5naW5nIGNvbG9yXG4gKiAgIGltYWdlKGltZywgNTAsIDApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogMiBzaWRlIGJ5IHNpZGUgaW1hZ2VzIG9mIHVtYnJlbGxhIGFuZCBjZWlsaW5nLCBvbmUgaW1hZ2Ugd2l0aCBibHVlIHRpbnRcbiAqIEltYWdlcyBvZiB1bWJyZWxsYSBhbmQgY2VpbGluZywgb25lIGhhbGYgb2YgaW1hZ2Ugd2l0aCBibHVlIHRpbnRcbiAqIDIgc2lkZSBieSBzaWRlIGltYWdlcyBvZiB1bWJyZWxsYSBhbmQgY2VpbGluZywgb25lIGltYWdlIHRyYW5zbHVjZW50XG4gKlxuICovXG5cbi8qKlxuICogQG1ldGhvZCB0aW50XG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICB2YWx1ZSAgIGEgY29sb3Igc3RyaW5nXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIHRpbnRcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIGdyYXkgICBhIGdyYXkgdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIFthbHBoYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2QgdGludFxuICogQHBhcmFtICB7TnVtYmVyW119ICAgICAgdmFsdWVzICBhbiBhcnJheSBjb250YWluaW5nIHRoZSByZWQsZ3JlZW4sYmx1ZSAmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIHRoZSBjb2xvclxuICovXG5cbi8qKlxuICogQG1ldGhvZCB0aW50XG4gKiBAcGFyYW0gIHtwNS5Db2xvcn0gICAgICBjb2xvciAgIHRoZSB0aW50IGNvbG9yXG4gKi9cbnA1LnByb3RvdHlwZS50aW50ID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3RpbnQnLCBhcmd1bWVudHMpO1xuICB2YXIgYyA9IHRoaXMuY29sb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgdGhpcy5fcmVuZGVyZXIuX3RpbnQgPSBjLmxldmVscztcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgY3VycmVudCBmaWxsIHZhbHVlIGZvciBkaXNwbGF5aW5nIGltYWdlcyBhbmQgcmV2ZXJ0cyB0b1xuICogZGlzcGxheWluZyBpbWFnZXMgd2l0aCB0aGVpciBvcmlnaW5hbCBodWVzLlxuICpcbiAqIEBtZXRob2Qgbm9UaW50XG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGltZztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrcy5qcGcnKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB0aW50KDAsIDE1MywgMjA0KTsgLy8gVGludCBibHVlXG4gKiAgIGltYWdlKGltZywgMCwgMCk7XG4gKiAgIG5vVGludCgpOyAvLyBEaXNhYmxlIHRpbnRcbiAqICAgaW1hZ2UoaW1nLCA1MCwgMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAyIHNpZGUgYnkgc2lkZSBpbWFnZXMgb2YgYnJpY2tzLCBsZWZ0IGltYWdlIHdpdGggYmx1ZSB0aW50XG4gKlxuICovXG5wNS5wcm90b3R5cGUubm9UaW50ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3JlbmRlcmVyLl90aW50ID0gbnVsbDtcbn07XG5cbi8qKlxuICogQXBwbHkgdGhlIGN1cnJlbnQgdGludCBjb2xvciB0byB0aGUgaW5wdXQgaW1hZ2UsIHJldHVybiB0aGUgcmVzdWx0aW5nXG4gKiBjYW52YXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7cDUuSW1hZ2V9IFRoZSBpbWFnZSB0byBiZSB0aW50ZWRcbiAqIEByZXR1cm4ge2NhbnZhc30gVGhlIHJlc3VsdGluZyB0aW50ZWQgY2FudmFzXG4gKlxuICovXG5wNS5wcm90b3R5cGUuX2dldFRpbnRlZEltYWdlQ2FudmFzID0gZnVuY3Rpb24oaW1nKSB7XG4gIGlmICghaW1nLmNhbnZhcykge1xuICAgIHJldHVybiBpbWc7XG4gIH1cbiAgdmFyIHBpeGVscyA9IEZpbHRlcnMuX3RvUGl4ZWxzKGltZy5jYW52YXMpO1xuICB2YXIgdG1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIHRtcENhbnZhcy53aWR0aCA9IGltZy5jYW52YXMud2lkdGg7XG4gIHRtcENhbnZhcy5oZWlnaHQgPSBpbWcuY2FudmFzLmhlaWdodDtcbiAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICB2YXIgaWQgPSB0bXBDdHguY3JlYXRlSW1hZ2VEYXRhKGltZy5jYW52YXMud2lkdGgsIGltZy5jYW52YXMuaGVpZ2h0KTtcbiAgdmFyIG5ld1BpeGVscyA9IGlkLmRhdGE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICB2YXIgciA9IHBpeGVsc1tpXTtcbiAgICB2YXIgZyA9IHBpeGVsc1tpICsgMV07XG4gICAgdmFyIGIgPSBwaXhlbHNbaSArIDJdO1xuICAgIHZhciBhID0gcGl4ZWxzW2kgKyAzXTtcblxuICAgIG5ld1BpeGVsc1tpXSA9IHIgKiB0aGlzLl9yZW5kZXJlci5fdGludFswXSAvIDI1NTtcbiAgICBuZXdQaXhlbHNbaSArIDFdID0gZyAqIHRoaXMuX3JlbmRlcmVyLl90aW50WzFdIC8gMjU1O1xuICAgIG5ld1BpeGVsc1tpICsgMl0gPSBiICogdGhpcy5fcmVuZGVyZXIuX3RpbnRbMl0gLyAyNTU7XG4gICAgbmV3UGl4ZWxzW2kgKyAzXSA9IGEgKiB0aGlzLl9yZW5kZXJlci5fdGludFszXSAvIDI1NTtcbiAgfVxuXG4gIHRtcEN0eC5wdXRJbWFnZURhdGEoaWQsIDAsIDApO1xuICByZXR1cm4gdG1wQ2FudmFzO1xufTtcblxuLyoqXG4gKiBTZXQgaW1hZ2UgbW9kZS4gTW9kaWZpZXMgdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggaW1hZ2VzIGFyZSBkcmF3biBieVxuICogY2hhbmdpbmcgdGhlIHdheSBpbiB3aGljaCBwYXJhbWV0ZXJzIGdpdmVuIHRvIGltYWdlKCkgYXJlIGludGVycHJldGVkLlxuICogVGhlIGRlZmF1bHQgbW9kZSBpcyBpbWFnZU1vZGUoQ09STkVSKSwgd2hpY2ggaW50ZXJwcmV0cyB0aGUgc2Vjb25kIGFuZFxuICogdGhpcmQgcGFyYW1ldGVycyBvZiBpbWFnZSgpIGFzIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UuIElmXG4gKiB0d28gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQsIHRoZXkgYXJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSdzXG4gKiB3aWR0aCBhbmQgaGVpZ2h0LlxuICogPGJyPjxicj5cbiAqIGltYWdlTW9kZShDT1JORVJTKSBpbnRlcnByZXRzIHRoZSBzZWNvbmQgYW5kIHRoaXJkIHBhcmFtZXRlcnMgb2YgaW1hZ2UoKVxuICogYXMgdGhlIGxvY2F0aW9uIG9mIG9uZSBjb3JuZXIsIGFuZCB0aGUgZm91cnRoIGFuZCBmaWZ0aCBwYXJhbWV0ZXJzIGFzIHRoZVxuICogb3Bwb3NpdGUgY29ybmVyLlxuICogPGJyPjxicj5cbiAqIGltYWdlTW9kZShDRU5URVIpIGludGVycHJldHMgdGhlIHNlY29uZCBhbmQgdGhpcmQgcGFyYW1ldGVycyBvZiBpbWFnZSgpXG4gKiBhcyB0aGUgaW1hZ2UncyBjZW50ZXIgcG9pbnQuIElmIHR3byBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHNwZWNpZmllZCxcbiAqIHRoZXkgYXJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSdzIHdpZHRoIGFuZCBoZWlnaHQuXG4gKlxuICogQG1ldGhvZCBpbWFnZU1vZGVcbiAqIEBwYXJhbSB7Q29uc3RhbnR9IG1vZGUgZWl0aGVyIENPUk5FUiwgQ09STkVSUywgb3IgQ0VOVEVSXG4gKiBAZXhhbXBsZVxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBpbWc7XG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3MuanBnJyk7XG4gKiB9XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgaW1hZ2VNb2RlKENPUk5FUik7XG4gKiAgIGltYWdlKGltZywgMTAsIDEwLCA1MCwgNTApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGltZztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrcy5qcGcnKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBpbWFnZU1vZGUoQ09STkVSUyk7XG4gKiAgIGltYWdlKGltZywgMTAsIDEwLCA5MCwgNDApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGltZztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrcy5qcGcnKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBpbWFnZU1vZGUoQ0VOVEVSKTtcbiAqICAgaW1hZ2UoaW1nLCA1MCwgNTAsIDgwLCA4MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBzbWFsbCBzcXVhcmUgaW1hZ2Ugb2YgYnJpY2tzXG4gKiBob3Jpem9udGFsIHJlY3RhbmdsZSBpbWFnZSBvZiBicmlja3NcbiAqIGxhcmdlIHNxdWFyZSBpbWFnZSBvZiBicmlja3NcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5pbWFnZU1vZGUgPSBmdW5jdGlvbihtKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2ltYWdlTW9kZScsIGFyZ3VtZW50cyk7XG4gIGlmIChcbiAgICBtID09PSBjb25zdGFudHMuQ09STkVSIHx8XG4gICAgbSA9PT0gY29uc3RhbnRzLkNPUk5FUlMgfHxcbiAgICBtID09PSBjb25zdGFudHMuQ0VOVEVSXG4gICkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl9pbWFnZU1vZGUgPSBtO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4uL2NvcmUvY2FudmFzXCI6MjAsXCIuLi9jb3JlL2NvbnN0YW50c1wiOjIxLFwiLi4vY29yZS9jb3JlXCI6MjIsXCIuLi9jb3JlL2Vycm9yX2hlbHBlcnNcIjoyNSxcIi4vZmlsdGVyc1wiOjQxfV0sNDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIEltYWdlXG4gKiBAc3VibW9kdWxlIEltYWdlXG4gKiBAcmVxdWlyZXMgY29yZVxuICogQHJlcXVpcmVzIGNvbnN0YW50c1xuICogQHJlcXVpcmVzIGZpbHRlcnNcbiAqL1xuXG4vKipcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIHA1LkltYWdlIGNsYXNzIGFuZCBQNSBtZXRob2RzIGZvclxuICogZHJhd2luZyBpbWFnZXMgdG8gdGhlIG1haW4gZGlzcGxheSBjYW52YXMuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuLi9jb3JlL2NvcmUnKTtcbnZhciBGaWx0ZXJzID0gX2RlcmVxXygnLi9maWx0ZXJzJyk7XG5cbi8qXG4gKiBDbGFzcyBtZXRob2RzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHA1LkltYWdlLiBBIHA1LkltYWdlIGlzIGEgY2FudmFzIGJhY2tlZCByZXByZXNlbnRhdGlvbiBvZiBhblxuICogaW1hZ2UuXG4gKiA8YnI+PGJyPlxuICogcDUgY2FuIGRpc3BsYXkgLmdpZiwgLmpwZyBhbmQgLnBuZyBpbWFnZXMuIEltYWdlcyBtYXkgYmUgZGlzcGxheWVkXG4gKiBpbiAyRCBhbmQgM0Qgc3BhY2UuIEJlZm9yZSBhbiBpbWFnZSBpcyB1c2VkLCBpdCBtdXN0IGJlIGxvYWRlZCB3aXRoIHRoZVxuICogbG9hZEltYWdlKCkgZnVuY3Rpb24uIFRoZSBwNS5JbWFnZSBjbGFzcyBjb250YWlucyBmaWVsZHMgZm9yIHRoZSB3aWR0aCBhbmRcbiAqIGhlaWdodCBvZiB0aGUgaW1hZ2UsIGFzIHdlbGwgYXMgYW4gYXJyYXkgY2FsbGVkIHBpeGVsc1tdIHRoYXQgY29udGFpbnMgdGhlXG4gKiB2YWx1ZXMgZm9yIGV2ZXJ5IHBpeGVsIGluIHRoZSBpbWFnZS5cbiAqIDxicj48YnI+XG4gKiBUaGUgbWV0aG9kcyBkZXNjcmliZWQgYmVsb3cgYWxsb3cgZWFzeSBhY2Nlc3MgdG8gdGhlIGltYWdlJ3MgcGl4ZWxzIGFuZFxuICogYWxwaGEgY2hhbm5lbCBhbmQgc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgY29tcG9zaXRpbmcuXG4gKiA8YnI+PGJyPlxuICogQmVmb3JlIHVzaW5nIHRoZSBwaXhlbHNbXSBhcnJheSwgYmUgc3VyZSB0byB1c2UgdGhlIGxvYWRQaXhlbHMoKSBtZXRob2Qgb25cbiAqIHRoZSBpbWFnZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcGl4ZWwgZGF0YSBpcyBwcm9wZXJseSBsb2FkZWQuXG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgaW1nID0gY3JlYXRlSW1hZ2UoMTAwLCAxMDApOyAvLyBzYW1lIGFzIG5ldyBwNS5JbWFnZSgxMDAsIDEwMCk7XG4gKiAgIGltZy5sb2FkUGl4ZWxzKCk7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiAgIGJhY2tncm91bmQoMCk7XG4gKlxuICogICAvLyBoZWxwZXIgZm9yIHdyaXRpbmcgY29sb3IgdG8gYXJyYXlcbiAqICAgZnVuY3Rpb24gd3JpdGVDb2xvcihpbWFnZSwgeCwgeSwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpIHtcbiAqICAgICB2YXIgaW5kZXggPSAoeCArIHkgKiB3aWR0aCkgKiA0O1xuICogICAgIGltYWdlLnBpeGVsc1tpbmRleF0gPSByZWQ7XG4gKiAgICAgaW1hZ2UucGl4ZWxzW2luZGV4ICsgMV0gPSBncmVlbjtcbiAqICAgICBpbWFnZS5waXhlbHNbaW5kZXggKyAyXSA9IGJsdWU7XG4gKiAgICAgaW1hZ2UucGl4ZWxzW2luZGV4ICsgM10gPSBhbHBoYTtcbiAqICAgfVxuICpcbiAqICAgdmFyIHgsIHk7XG4gKiAgIC8vIGZpbGwgd2l0aCByYW5kb20gY29sb3JzXG4gKiAgIGZvciAoeSA9IDA7IHkgPCBpbWcuaGVpZ2h0OyB5KyspIHtcbiAqICAgICBmb3IgKHggPSAwOyB4IDwgaW1nLndpZHRoOyB4KyspIHtcbiAqICAgICAgIHZhciByZWQgPSByYW5kb20oMjU1KTtcbiAqICAgICAgIHZhciBncmVlbiA9IHJhbmRvbSgyNTUpO1xuICogICAgICAgdmFyIGJsdWUgPSByYW5kb20oMjU1KTtcbiAqICAgICAgIHZhciBhbHBoYSA9IDI1NTtcbiAqICAgICAgIHdyaXRlQ29sb3IoaW1nLCB4LCB5LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICAvLyBkcmF3IGEgcmVkIGxpbmVcbiAqICAgeSA9IDA7XG4gKiAgIGZvciAoeCA9IDA7IHggPCBpbWcud2lkdGg7IHgrKykge1xuICogICAgIHdyaXRlQ29sb3IoaW1nLCB4LCB5LCAyNTUsIDAsIDAsIDI1NSk7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIGRyYXcgYSBncmVlbiBsaW5lXG4gKiAgIHkgPSBpbWcuaGVpZ2h0IC0gMTtcbiAqICAgZm9yICh4ID0gMDsgeCA8IGltZy53aWR0aDsgeCsrKSB7XG4gKiAgICAgd3JpdGVDb2xvcihpbWcsIHgsIHksIDAsIDI1NSwgMCwgMjU1KTtcbiAqICAgfVxuICpcbiAqICAgaW1nLnVwZGF0ZVBpeGVscygpO1xuICogICBpbWFnZShpbWcsIDAsIDApO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqXG4gKiBAY2xhc3MgcDUuSW1hZ2VcbiAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodFxuICovXG5wNS5JbWFnZSA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgLyoqXG4gICAqIEltYWdlIHdpZHRoLlxuICAgKiBAcHJvcGVydHkge051bWJlcn0gd2lkdGhcbiAgICogQHJlYWRPbmx5XG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXY+PGNvZGU+XG4gICAqIHZhciBpbWc7XG4gICAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gICAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcbiAgICogfVxuICAgKlxuICAgKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICAgKiAgIGltYWdlKGltZywgMCwgMCk7XG4gICAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWcud2lkdGg7IGkrKykge1xuICAgKiAgICAgdmFyIGMgPSBpbWcuZ2V0KGksIGltZy5oZWlnaHQgLyAyKTtcbiAgICogICAgIHN0cm9rZShjKTtcbiAgICogICAgIGxpbmUoaSwgaGVpZ2h0IC8gMiwgaSwgaGVpZ2h0KTtcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKlxuICAgKiBAYWx0XG4gICAqIHJvY2t5IG1vdW50YWlucyBpbiB0b3AgYW5kIGhvcml6b250YWwgbGluZXMgaW4gY29ycmVzcG9uZGluZyBjb2xvcnMgaW4gYm90dG9tLlxuICAgKlxuICAgKi9cbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAvKipcbiAgICogSW1hZ2UgaGVpZ2h0LlxuICAgKiBAcHJvcGVydHkge051bWJlcn0gaGVpZ2h0XG4gICAqIEByZWFkT25seVxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2Pjxjb2RlPlxuICAgKiB2YXIgaW1nO1xuICAgKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICAgKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAgICogICBpbWFnZShpbWcsIDAsIDApO1xuICAgKiAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1nLmhlaWdodDsgaSsrKSB7XG4gICAqICAgICB2YXIgYyA9IGltZy5nZXQoaW1nLndpZHRoIC8gMiwgaSk7XG4gICAqICAgICBzdHJva2UoYyk7XG4gICAqICAgICBsaW5lKDAsIGksIHdpZHRoIC8gMiwgaSk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvY29kZT48L2Rpdj5cbiAgICpcbiAgICogQGFsdFxuICAgKiByb2NreSBtb3VudGFpbnMgb24gcmlnaHQgYW5kIHZlcnRpY2FsIGxpbmVzIGluIGNvcnJlc3BvbmRpbmcgY29sb3JzIG9uIGxlZnQuXG4gICAqXG4gICAqL1xuICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLndpZHRoO1xuICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgdGhpcy5kcmF3aW5nQ29udGV4dCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIHRoaXMuX3BpeGVsRGVuc2l0eSA9IDE7XG4gIC8vdXNlZCBmb3Igd2ViZ2wgdGV4dHVyaW5nIG9ubHlcbiAgdGhpcy5fbW9kaWZpZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgYWxsIHRoZSBwaXhlbHMgaW4gdGhlIGRpc3BsYXkgd2luZG93LlxuICAgKiBUaGVzZSB2YWx1ZXMgYXJlIG51bWJlcnMuIFRoaXMgYXJyYXkgaXMgdGhlIHNpemUgKGluY2x1ZGUgYW4gYXBwcm9wcmlhdGVcbiAgICogZmFjdG9yIGZvciBwaXhlbERlbnNpdHkpIG9mIHRoZSBkaXNwbGF5IHdpbmRvdyB4NCxcbiAgICogcmVwcmVzZW50aW5nIHRoZSBSLCBHLCBCLCBBIHZhbHVlcyBpbiBvcmRlciBmb3IgZWFjaCBwaXhlbCwgbW92aW5nIGZyb21cbiAgICogbGVmdCB0byByaWdodCBhY3Jvc3MgZWFjaCByb3csIHRoZW4gZG93biBlYWNoIGNvbHVtbi4gUmV0aW5hIGFuZCBvdGhlclxuICAgKiBoaWdoIGRlbmlzdHkgZGlzcGxheXMgbWF5IGhhdmUgbW9yZSBwaXhlbHNbXSAoYnkgYSBmYWN0b3Igb2ZcbiAgICogcGl4ZWxEZW5zaXR5XjIpLlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGltYWdlIGlzIDEwMHgxMDAgcGl4ZWxzLCB0aGVyZSB3aWxsIGJlIDQwLDAwMC4gV2l0aFxuICAgKiBwaXhlbERlbnNpdHkgPSAyLCB0aGVyZSB3aWxsIGJlIDE2MCwwMDAuIFRoZSBmaXJzdCBmb3VyIHZhbHVlc1xuICAgKiAoaW5kaWNlcyAwLTMpIGluIHRoZSBhcnJheSB3aWxsIGJlIHRoZSBSLCBHLCBCLCBBIHZhbHVlcyBvZiB0aGUgcGl4ZWwgYXRcbiAgICogKDAsIDApLiBUaGUgc2Vjb25kIGZvdXIgdmFsdWVzIChpbmRpY2VzIDQtNykgd2lsbCBjb250YWluIHRoZSBSLCBHLCBCLCBBXG4gICAqIHZhbHVlcyBvZiB0aGUgcGl4ZWwgYXQgKDEsIDApLiBNb3JlIGdlbmVyYWxseSwgdG8gc2V0IHZhbHVlcyBmb3IgYSBwaXhlbFxuICAgKiBhdCAoeCwgeSk6XG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogdmFyIGQgPSBwaXhlbERlbnNpdHkoKTtcbiAgICogZm9yICh2YXIgaSA9IDA7IGkgPCBkOyBpKyspIHtcbiAgICogICBmb3IgKHZhciBqID0gMDsgaiA8IGQ7IGorKykge1xuICAgKiAgICAgLy8gbG9vcCBvdmVyXG4gICAqICAgICBpZHggPSA0ICogKCh5ICogZCArIGopICogd2lkdGggKiBkICsgKHggKiBkICsgaSkpO1xuICAgKiAgICAgcGl4ZWxzW2lkeF0gPSByO1xuICAgKiAgICAgcGl4ZWxzW2lkeCsxXSA9IGc7XG4gICAqICAgICBwaXhlbHNbaWR4KzJdID0gYjtcbiAgICogICAgIHBpeGVsc1tpZHgrM10gPSBhO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICogPGJyPjxicj5cbiAgICogQmVmb3JlIGFjY2Vzc2luZyB0aGlzIGFycmF5LCB0aGUgZGF0YSBtdXN0IGxvYWRlZCB3aXRoIHRoZSBsb2FkUGl4ZWxzKClcbiAgICogZnVuY3Rpb24uIEFmdGVyIHRoZSBhcnJheSBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkLCB0aGUgdXBkYXRlUGl4ZWxzKClcbiAgICogZnVuY3Rpb24gbXVzdCBiZSBydW4gdG8gdXBkYXRlIHRoZSBjaGFuZ2VzLlxuICAgKiBAcHJvcGVydHkge051bWJlcltdfSBwaXhlbHNcbiAgICogQGV4YW1wbGVcbiAgICogPGRpdj5cbiAgICogPGNvZGU+XG4gICAqIHZhciBpbWcgPSBjcmVhdGVJbWFnZSg2NiwgNjYpO1xuICAgKiBpbWcubG9hZFBpeGVscygpO1xuICAgKiBmb3IgKHZhciBpID0gMDsgaSA8IGltZy53aWR0aDsgaSsrKSB7XG4gICAqICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbWcuaGVpZ2h0OyBqKyspIHtcbiAgICogICAgIGltZy5zZXQoaSwgaiwgY29sb3IoMCwgOTAsIDEwMikpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBpbWcudXBkYXRlUGl4ZWxzKCk7XG4gICAqIGltYWdlKGltZywgMTcsIDE3KTtcbiAgICogPC9jb2RlPlxuICAgKiA8L2Rpdj5cbiAgICogPGRpdj5cbiAgICogPGNvZGU+XG4gICAqIHZhciBwaW5rID0gY29sb3IoMjU1LCAxMDIsIDIwNCk7XG4gICAqIHZhciBpbWcgPSBjcmVhdGVJbWFnZSg2NiwgNjYpO1xuICAgKiBpbWcubG9hZFBpeGVscygpO1xuICAgKiBmb3IgKHZhciBpID0gMDsgaSA8IDQgKiAod2lkdGggKiBoZWlnaHQgLyAyKTsgaSArPSA0KSB7XG4gICAqICAgaW1nLnBpeGVsc1tpXSA9IHJlZChwaW5rKTtcbiAgICogICBpbWcucGl4ZWxzW2kgKyAxXSA9IGdyZWVuKHBpbmspO1xuICAgKiAgIGltZy5waXhlbHNbaSArIDJdID0gYmx1ZShwaW5rKTtcbiAgICogICBpbWcucGl4ZWxzW2kgKyAzXSA9IGFscGhhKHBpbmspO1xuICAgKiB9XG4gICAqIGltZy51cGRhdGVQaXhlbHMoKTtcbiAgICogaW1hZ2UoaW1nLCAxNywgMTcpO1xuICAgKiA8L2NvZGU+XG4gICAqIDwvZGl2PlxuICAgKlxuICAgKiBAYWx0XG4gICAqIDY2eDY2IHR1cnF1b2lzZSByZWN0IGluIGNlbnRlciBvZiBjYW52YXNcbiAgICogNjZ4NjYgcGluayByZWN0IGluIGNlbnRlciBvZiBjYW52YXNcbiAgICpcbiAgICovXG4gIHRoaXMucGl4ZWxzID0gW107XG59O1xuXG4vKipcbiAqIEhlbHBlciBmeG4gZm9yIHNoYXJpbmcgcGl4ZWwgbWV0aG9kc1xuICpcbiAqL1xucDUuSW1hZ2UucHJvdG90eXBlLl9zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7XG4gIHRoaXNbcHJvcF0gPSB2YWx1ZTtcbiAgdGhpcy5zZXRNb2RpZmllZCh0cnVlKTtcbn07XG5cbi8qKlxuICogTG9hZHMgdGhlIHBpeGVscyBkYXRhIGZvciB0aGlzIGltYWdlIGludG8gdGhlIFtwaXhlbHNdIGF0dHJpYnV0ZS5cbiAqXG4gKiBAbWV0aG9kIGxvYWRQaXhlbHNcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogdmFyIG15SW1hZ2U7XG4gKiB2YXIgaGFsZkltYWdlO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIG15SW1hZ2UgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBteUltYWdlLmxvYWRQaXhlbHMoKTtcbiAqICAgaGFsZkltYWdlID0gNCAqIHdpZHRoICogaGVpZ2h0IC8gMjtcbiAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYWxmSW1hZ2U7IGkrKykge1xuICogICAgIG15SW1hZ2UucGl4ZWxzW2kgKyBoYWxmSW1hZ2VdID0gbXlJbWFnZS5waXhlbHNbaV07XG4gKiAgIH1cbiAqICAgbXlJbWFnZS51cGRhdGVQaXhlbHMoKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBpbWFnZShteUltYWdlLCAwLCAwKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAyIGltYWdlcyBvZiByb2NreSBtb3VudGFpbnMgdmVydGljYWxseSBzdGFja2VkXG4gKlxuICovXG5wNS5JbWFnZS5wcm90b3R5cGUubG9hZFBpeGVscyA9IGZ1bmN0aW9uKCkge1xuICBwNS5SZW5kZXJlcjJELnByb3RvdHlwZS5sb2FkUGl4ZWxzLmNhbGwodGhpcyk7XG4gIHRoaXMuc2V0TW9kaWZpZWQodHJ1ZSk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGJhY2tpbmcgY2FudmFzIGZvciB0aGlzIGltYWdlIHdpdGggdGhlIGNvbnRlbnRzIG9mXG4gKiB0aGUgW3BpeGVsc10gYXJyYXkuXG4gKlxuICogQG1ldGhvZCB1cGRhdGVQaXhlbHNcbiAqIEBwYXJhbSB7SW50ZWdlcn0geCB4LW9mZnNldCBvZiB0aGUgdGFyZ2V0IHVwZGF0ZSBhcmVhIGZvciB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJseWluZyBjYW52YXNcbiAqIEBwYXJhbSB7SW50ZWdlcn0geSB5LW9mZnNldCBvZiB0aGUgdGFyZ2V0IHVwZGF0ZSBhcmVhIGZvciB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJseWluZyBjYW52YXNcbiAqIEBwYXJhbSB7SW50ZWdlcn0gdyBoZWlnaHQgb2YgdGhlIHRhcmdldCB1cGRhdGUgYXJlYSBmb3IgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybHlpbmcgY2FudmFzXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGggaGVpZ2h0IG9mIHRoZSB0YXJnZXQgdXBkYXRlIGFyZWEgZm9yIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmx5aW5nIGNhbnZhc1xuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgbXlJbWFnZTtcbiAqIHZhciBoYWxmSW1hZ2U7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgbXlJbWFnZSA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIG15SW1hZ2UubG9hZFBpeGVscygpO1xuICogICBoYWxmSW1hZ2UgPSA0ICogd2lkdGggKiBoZWlnaHQgLyAyO1xuICogICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbGZJbWFnZTsgaSsrKSB7XG4gKiAgICAgbXlJbWFnZS5waXhlbHNbaSArIGhhbGZJbWFnZV0gPSBteUltYWdlLnBpeGVsc1tpXTtcbiAqICAgfVxuICogICBteUltYWdlLnVwZGF0ZVBpeGVscygpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGltYWdlKG15SW1hZ2UsIDAsIDApO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDIgaW1hZ2VzIG9mIHJvY2t5IG1vdW50YWlucyB2ZXJ0aWNhbGx5IHN0YWNrZWRcbiAqXG4gKi9cbi8qKlxuICogQG1ldGhvZCB1cGRhdGVQaXhlbHNcbiAqL1xucDUuSW1hZ2UucHJvdG90eXBlLnVwZGF0ZVBpeGVscyA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpIHtcbiAgcDUuUmVuZGVyZXIyRC5wcm90b3R5cGUudXBkYXRlUGl4ZWxzLmNhbGwodGhpcywgeCwgeSwgdywgaCk7XG4gIHRoaXMuc2V0TW9kaWZpZWQodHJ1ZSk7XG59O1xuXG4vKipcbiAqIEdldCBhIHJlZ2lvbiBvZiBwaXhlbHMgZnJvbSBhbiBpbWFnZS5cbiAqXG4gKiBJZiBubyBwYXJhbXMgYXJlIHBhc3NlZCwgdGhvc2Ugd2hvbGUgaW1hZ2UgaXMgcmV0dXJuZWQsXG4gKiBpZiB4IGFuZCB5IGFyZSB0aGUgb25seSBwYXJhbXMgcGFzc2VkIGEgc2luZ2xlIHBpeGVsIGlzIGV4dHJhY3RlZFxuICogaWYgYWxsIHBhcmFtcyBhcmUgcGFzc2VkIGEgcmVjdGFuZ2xlIHJlZ2lvbiBpcyBleHRyYWN0ZWQgYW5kIGEgcDUuSW1hZ2VcbiAqIGlzIHJldHVybmVkLlxuICpcbiAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSByZWdpb24gaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBpbWFnZVxuICpcbiAqIEBtZXRob2QgZ2V0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICAgICAgICAgW3hdIHgtY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgICAgICAgICBbeV0geS1jb29yZGluYXRlIG9mIHRoZSBwaXhlbFxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgICAgICAgIFt3XSB3aWR0aFxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgICAgICAgIFtoXSBoZWlnaHRcbiAqIEByZXR1cm4ge051bWJlcltdfENvbG9yfHA1LkltYWdlfSAgY29sb3Igb2YgcGl4ZWwgYXQgeCx5IGluIGFycmF5IGZvcm1hdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUiwgRywgQiwgQV0gb3IgcDUuSW1hZ2VcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogdmFyIG15SW1hZ2U7XG4gKiB2YXIgYztcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBteUltYWdlID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgYmFja2dyb3VuZChteUltYWdlKTtcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgYyA9IG15SW1hZ2UuZ2V0KDYwLCA5MCk7XG4gKiAgIGZpbGwoYyk7XG4gKiAgIHJlY3QoMjUsIDI1LCA1MCwgNTApO1xuICogfVxuICpcbiAqIC8vZ2V0KCkgcmV0dXJucyBjb2xvciBoZXJlXG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogaW1hZ2Ugb2Ygcm9ja3kgbW91bnRhaW5zIHdpdGggNTB4NTAgZ3JlZW4gcmVjdCBpbiBmcm9udFxuICpcbiAqL1xucDUuSW1hZ2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpIHtcbiAgcmV0dXJuIHA1LlJlbmRlcmVyMkQucHJvdG90eXBlLmdldC5jYWxsKHRoaXMsIHgsIHksIHcsIGgpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbG9yIG9mIGEgc2luZ2xlIHBpeGVsIG9yIHdyaXRlIGFuIGltYWdlIGludG9cbiAqIHRoaXMgcDUuSW1hZ2UuXG4gKlxuICogTm90ZSB0aGF0IGZvciBhIGxhcmdlIG51bWJlciBvZiBwaXhlbHMgdGhpcyB3aWxsXG4gKiBiZSBzbG93ZXIgdGhhbiBkaXJlY3RseSBtYW5pcHVsYXRpbmcgdGhlIHBpeGVscyBhcnJheVxuICogYW5kIHRoZW4gY2FsbGluZyB1cGRhdGVQaXhlbHMoKS5cbiAqXG4gKiBAbWV0aG9kIHNldFxuICogQHBhcmFtIHtOdW1iZXJ9ICAgICAgICAgICAgICB4IHgtY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxcbiAqIEBwYXJhbSB7TnVtYmVyfSAgICAgICAgICAgICAgeSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsXG4gKiBAcGFyYW0ge051bWJlcnxOdW1iZXJbXXxPYmplY3R9ICAgYSBncmF5c2NhbGUgdmFsdWUgfCBwaXhlbCBhcnJheSB8XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwNS5Db2xvciB8IGltYWdlIHRvIGNvcHlcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nID0gY3JlYXRlSW1hZ2UoNjYsIDY2KTtcbiAqIGltZy5sb2FkUGl4ZWxzKCk7XG4gKiBmb3IgKHZhciBpID0gMDsgaSA8IGltZy53aWR0aDsgaSsrKSB7XG4gKiAgIGZvciAodmFyIGogPSAwOyBqIDwgaW1nLmhlaWdodDsgaisrKSB7XG4gKiAgICAgaW1nLnNldChpLCBqLCBjb2xvcigwLCA5MCwgMTAyLCAoaSAlIGltZy53aWR0aCkgKiAyKSk7XG4gKiAgIH1cbiAqIH1cbiAqIGltZy51cGRhdGVQaXhlbHMoKTtcbiAqIGltYWdlKGltZywgMTcsIDE3KTtcbiAqIGltYWdlKGltZywgMzQsIDM0KTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDIgZ3JhZGF0ZWQgZGFyayB0dXJxdW9pc2UgcmVjdHMgZmFkZSBsZWZ0LiAxIGNlbnRlciAxIGJvdHRvbSByaWdodCBvZiBjYW52YXNcbiAqXG4gKi9cbnA1LkltYWdlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbih4LCB5LCBpbWdPckNvbCkge1xuICBwNS5SZW5kZXJlcjJELnByb3RvdHlwZS5zZXQuY2FsbCh0aGlzLCB4LCB5LCBpbWdPckNvbCk7XG4gIHRoaXMuc2V0TW9kaWZpZWQodHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlc2l6ZSB0aGUgaW1hZ2UgdG8gYSBuZXcgd2lkdGggYW5kIGhlaWdodC4gVG8gbWFrZSB0aGUgaW1hZ2Ugc2NhbGVcbiAqIHByb3BvcnRpb25hbGx5LCB1c2UgMCBhcyB0aGUgdmFsdWUgZm9yIHRoZSB3aWRlIG9yIGhpZ2ggcGFyYW1ldGVyLlxuICogRm9yIGluc3RhbmNlLCB0byBtYWtlIHRoZSB3aWR0aCBvZiBhbiBpbWFnZSAxNTAgcGl4ZWxzLCBhbmQgY2hhbmdlXG4gKiB0aGUgaGVpZ2h0IHVzaW5nIHRoZSBzYW1lIHByb3BvcnRpb24sIHVzZSByZXNpemUoMTUwLCAwKS5cbiAqXG4gKiBAbWV0aG9kIHJlc2l6ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIHRoZSByZXNpemVkIGltYWdlIHdpZHRoXG4gKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IHRoZSByZXNpemVkIGltYWdlIGhlaWdodFxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgaW1nO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XG4gKiB9XG5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGltYWdlKGltZywgMCwgMCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xuICogICBpbWcucmVzaXplKDUwLCAxMDApO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGltYWdlIG9mIHJvY2t5IG1vdW50YWlucy4gem9vbWVkIGluXG4gKlxuICovXG5wNS5JbWFnZS5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAvLyBDb3B5IGNvbnRlbnRzIHRvIGEgdGVtcG9yYXJ5IGNhbnZhcywgcmVzaXplIHRoZSBvcmlnaW5hbFxuICAvLyBhbmQgdGhlbiBjb3B5IGJhY2suXG4gIC8vXG4gIC8vIFRoZXJlIGlzIGEgZmFzdGVyIGFwcHJvYWNoIHRoYXQgaW52b2x2ZXMganVzdCBvbmUgY29weSBhbmQgc3dhcHBpbmcgdGhlXG4gIC8vIHRoaXMuY2FudmFzIHJlZmVyZW5jZS4gV2UgY291bGQgc3dpdGNoIHRvIHRoYXQgYXBwcm9hY2ggaWYgKGFzIGkgdGhpbmtcbiAgLy8gaXMgdGhlIGNhc2UpIHRoZXJlIGFuIGV4cGVjdGF0aW9uIHRoYXQgdGhlIHVzZXIgd291bGQgbm90IGhvbGQgYVxuICAvLyByZWZlcmVuY2UgdG8gdGhlIGJhY2tpbmcgY2FudmFzIG9mIGEgcDUuSW1hZ2UuIEJ1dCBzaW5jZSB3ZSBkbyBub3RcbiAgLy8gZW5mb3JjZSB0aGF0IGF0IHRoZSBtb21lbnQsIEkgYW0gbGVhdmluZyBpbiB0aGUgc2xvd2VyLCBidXQgc2FmZXJcbiAgLy8gaW1wbGVtZW50YXRpb24uXG5cbiAgLy8gYXV0by1yZXNpemVcbiAgaWYgKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkge1xuICAgIHdpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0O1xuICB9IGVsc2UgaWYgKHdpZHRoID09PSAwKSB7XG4gICAgd2lkdGggPSB0aGlzLmNhbnZhcy53aWR0aCAqIGhlaWdodCAvIHRoaXMuY2FudmFzLmhlaWdodDtcbiAgfSBlbHNlIGlmIChoZWlnaHQgPT09IDApIHtcbiAgICBoZWlnaHQgPSB0aGlzLmNhbnZhcy5oZWlnaHQgKiB3aWR0aCAvIHRoaXMuY2FudmFzLndpZHRoO1xuICB9XG5cbiAgd2lkdGggPSBNYXRoLmZsb29yKHdpZHRoKTtcbiAgaGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQpO1xuXG4gIHZhciB0ZW1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIHRlbXBDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgdGVtcENhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB0ZW1wQ2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKFxuICAgIHRoaXMuY2FudmFzLFxuICAgIDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQsXG4gICAgMCwgMCwgdGVtcENhbnZhcy53aWR0aCwgdGVtcENhbnZhcy5oZWlnaHRcbiAgKTtcblxuICAvLyBSZXNpemUgdGhlIG9yaWdpbmFsIGNhbnZhcywgd2hpY2ggd2lsbCBjbGVhciBpdHMgY29udGVudHNcbiAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLndpZHRoID0gd2lkdGg7XG4gIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gIC8vQ29weSB0aGUgaW1hZ2UgYmFja1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB0aGlzLmRyYXdpbmdDb250ZXh0LmRyYXdJbWFnZShcbiAgICB0ZW1wQ2FudmFzLFxuICAgIDAsIDAsIHdpZHRoLCBoZWlnaHQsXG4gICAgMCwgMCwgd2lkdGgsIGhlaWdodFxuICApO1xuXG4gIGlmICh0aGlzLnBpeGVscy5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy5sb2FkUGl4ZWxzKCk7XG4gIH1cblxuICB0aGlzLnNldE1vZGlmaWVkKHRydWUpO1xufTtcblxuLyoqXG4gKiBDb3BpZXMgYSByZWdpb24gb2YgcGl4ZWxzIGZyb20gb25lIGltYWdlIHRvIGFub3RoZXIuIElmIG5vXG4gKiBzcmNJbWFnZSBpcyBzcGVjaWZpZWQgdGhpcyBpcyB1c2VkIGFzIHRoZSBzb3VyY2UuIElmIHRoZSBzb3VyY2VcbiAqIGFuZCBkZXN0aW5hdGlvbiByZWdpb25zIGFyZW4ndCB0aGUgc2FtZSBzaXplLCBpdCB3aWxsXG4gKiBhdXRvbWF0aWNhbGx5IHJlc2l6ZSBzb3VyY2UgcGl4ZWxzIHRvIGZpdCB0aGUgc3BlY2lmaWVkXG4gKiB0YXJnZXQgcmVnaW9uLlxuICpcbiAqIEBtZXRob2QgY29weVxuICogQHBhcmFtICB7cDUuSW1hZ2V8cDUuRWxlbWVudH0gc3JjSW1hZ2Ugc291cmNlIGltYWdlXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBzeCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNvdXJjZSdzIHVwcGVyIGxlZnQgY29ybmVyXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBzeSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNvdXJjZSdzIHVwcGVyIGxlZnQgY29ybmVyXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBzdyBzb3VyY2UgaW1hZ2Ugd2lkdGhcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHNoIHNvdXJjZSBpbWFnZSBoZWlnaHRcbiAqIEBwYXJhbSAge0ludGVnZXJ9IGR4IFggY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24ncyB1cHBlciBsZWZ0IGNvcm5lclxuICogQHBhcmFtICB7SW50ZWdlcn0gZHkgWSBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbidzIHVwcGVyIGxlZnQgY29ybmVyXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkdyBkZXN0aW5hdGlvbiBpbWFnZSB3aWR0aFxuICogQHBhcmFtICB7SW50ZWdlcn0gZGggZGVzdGluYXRpb24gaW1hZ2UgaGVpZ2h0XG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIHZhciBwaG90bztcbiAqIHZhciBicmlja3M7XG4gKiB2YXIgeDtcbiAqIHZhciB5O1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHBob3RvID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcbiAqICAgYnJpY2tzID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzLmpwZycpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB4ID0gYnJpY2tzLndpZHRoIC8gMjtcbiAqICAgeSA9IGJyaWNrcy5oZWlnaHQgLyAyO1xuICogICBwaG90by5jb3B5KGJyaWNrcywgMCwgMCwgeCwgeSwgMCwgMCwgeCwgeSk7XG4gKiAgIGltYWdlKHBob3RvLCAwLCAwKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBpbWFnZSBvZiByb2NreSBtb3VudGFpbnMgYW5kIHNtYWxsZXIgaW1hZ2Ugb24gdG9wIG9mIGJyaWNrcyBhdCB0b3AgbGVmdFxuICpcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGNvcHlcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN4XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBzeVxuICogQHBhcmFtICB7SW50ZWdlcn0gc3dcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHNoXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkeFxuICogQHBhcmFtICB7SW50ZWdlcn0gZHlcbiAqIEBwYXJhbSAge0ludGVnZXJ9IGR3XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkaFxuICovXG5wNS5JbWFnZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3JjSW1hZ2UsIHN4LCBzeSwgc3csIHNoLCBkeCwgZHksIGR3LCBkaDtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDkpIHtcbiAgICBzcmNJbWFnZSA9IGFyZ3VtZW50c1swXTtcbiAgICBzeCA9IGFyZ3VtZW50c1sxXTtcbiAgICBzeSA9IGFyZ3VtZW50c1syXTtcbiAgICBzdyA9IGFyZ3VtZW50c1szXTtcbiAgICBzaCA9IGFyZ3VtZW50c1s0XTtcbiAgICBkeCA9IGFyZ3VtZW50c1s1XTtcbiAgICBkeSA9IGFyZ3VtZW50c1s2XTtcbiAgICBkdyA9IGFyZ3VtZW50c1s3XTtcbiAgICBkaCA9IGFyZ3VtZW50c1s4XTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA4KSB7XG4gICAgc3JjSW1hZ2UgPSB0aGlzO1xuICAgIHN4ID0gYXJndW1lbnRzWzBdO1xuICAgIHN5ID0gYXJndW1lbnRzWzFdO1xuICAgIHN3ID0gYXJndW1lbnRzWzJdO1xuICAgIHNoID0gYXJndW1lbnRzWzNdO1xuICAgIGR4ID0gYXJndW1lbnRzWzRdO1xuICAgIGR5ID0gYXJndW1lbnRzWzVdO1xuICAgIGR3ID0gYXJndW1lbnRzWzZdO1xuICAgIGRoID0gYXJndW1lbnRzWzddO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignU2lnbmF0dXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuICBwNS5SZW5kZXJlcjJELl9jb3B5SGVscGVyKHRoaXMsIHNyY0ltYWdlLCBzeCwgc3ksIHN3LCBzaCwgZHgsIGR5LCBkdywgZGgpO1xufTtcblxuLyoqXG4gKiBNYXNrcyBwYXJ0IG9mIGFuIGltYWdlIGZyb20gZGlzcGxheWluZyBieSBsb2FkaW5nIGFub3RoZXJcbiAqIGltYWdlIGFuZCB1c2luZyBpdCdzIGFscGhhIGNoYW5uZWwgYXMgYW4gYWxwaGEgY2hhbm5lbCBmb3JcbiAqIHRoaXMgaW1hZ2UuXG4gKlxuICogQG1ldGhvZCBtYXNrXG4gKiBAcGFyYW0ge3A1LkltYWdlfSBzcmNJbWFnZSBzb3VyY2UgaW1hZ2VcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogdmFyIHBob3RvLCBtYXNrSW1hZ2U7XG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBwaG90byA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XG4gKiAgIG1hc2tJbWFnZSA9IGxvYWRJbWFnZSgnYXNzZXRzL21hc2syLnBuZycpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBwaG90by5tYXNrKG1hc2tJbWFnZSk7XG4gKiAgIGltYWdlKHBob3RvLCAwLCAwKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBpbWFnZSBvZiByb2NreSBtb3VudGFpbnMgd2l0aCB3aGl0ZSBhdCByaWdodFxuICpcbiAqXG4gKiBodHRwOi8vYmxvZ3MuYWRvYmUuY29tL3dlYnBsYXRmb3JtLzIwMTMvMDEvMjgvYmxlbmRpbmctZmVhdHVyZXMtaW4tY2FudmFzL1xuICpcbiAqL1xuLy8gVE9ETzogLSBBY2NlcHQgYW4gYXJyYXkgb2YgYWxwaGEgdmFsdWVzLlxuLy8gICAgICAgLSBVc2Ugb3RoZXIgY2hhbm5lbHMgb2YgYW4gaW1hZ2UuIHA1IHVzZXMgdGhlXG4vLyAgICAgICBibHVlIGNoYW5uZWwgKHdoaWNoIGZlZWxzIGtpbmQgb2YgYXJiaXRyYXJ5KS4gTm90ZTogYXQgdGhlXG4vLyAgICAgICBtb21lbnQgdGhpcyBtZXRob2QgZG9lcyBub3QgbWF0Y2ggbmF0aXZlIHByb2Nlc3NpbmdzIG9yaWdpbmFsXG4vLyAgICAgICBmdW5jdGlvbmFsaXR5IGV4YWN0bHkuXG5wNS5JbWFnZS5wcm90b3R5cGUubWFzayA9IGZ1bmN0aW9uKHA1SW1hZ2UpIHtcbiAgaWYgKHA1SW1hZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgIHA1SW1hZ2UgPSB0aGlzO1xuICB9XG4gIHZhciBjdXJyQmxlbmQgPSB0aGlzLmRyYXdpbmdDb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjtcblxuICB2YXIgc2NhbGVGYWN0b3IgPSAxO1xuICBpZiAocDVJbWFnZSBpbnN0YW5jZW9mIHA1LlJlbmRlcmVyKSB7XG4gICAgc2NhbGVGYWN0b3IgPSBwNUltYWdlLl9wSW5zdC5fcGl4ZWxEZW5zaXR5O1xuICB9XG5cbiAgdmFyIGNvcHlBcmdzID0gW1xuICAgIHA1SW1hZ2UsXG4gICAgMCxcbiAgICAwLFxuICAgIHNjYWxlRmFjdG9yICogcDVJbWFnZS53aWR0aCxcbiAgICBzY2FsZUZhY3RvciAqIHA1SW1hZ2UuaGVpZ2h0LFxuICAgIDAsXG4gICAgMCxcbiAgICB0aGlzLndpZHRoLFxuICAgIHRoaXMuaGVpZ2h0XG4gIF07XG5cbiAgdGhpcy5kcmF3aW5nQ29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24taW4nO1xuICBwNS5JbWFnZS5wcm90b3R5cGUuY29weS5hcHBseSh0aGlzLCBjb3B5QXJncyk7XG4gIHRoaXMuZHJhd2luZ0NvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gY3VyckJsZW5kO1xuICB0aGlzLnNldE1vZGlmaWVkKHRydWUpO1xufTtcblxuLyoqXG4gKiBBcHBsaWVzIGFuIGltYWdlIGZpbHRlciB0byBhIHA1LkltYWdlXG4gKlxuICogQG1ldGhvZCBmaWx0ZXJcbiAqIEBwYXJhbSAge0NvbnN0YW50fSBmaWx0ZXJUeXBlICBlaXRoZXIgVEhSRVNIT0xELCBHUkFZLCBPUEFRVUUsIElOVkVSVCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1NURVJJWkUsIEJMVVIsIEVST0RFLCBESUxBVEUgb3IgQkxVUi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgRmlsdGVycy5qcyBmb3IgZG9jcyBvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggYXZhaWxhYmxlIGZpbHRlclxuICogQHBhcmFtICB7TnVtYmVyfSBbZmlsdGVyUGFyYW1dIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB1bmlxdWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBlYWNoIGZpbHRlciwgc2VlIGFib3ZlXG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIHZhciBwaG90bzE7XG4gKiB2YXIgcGhvdG8yO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHBob3RvMSA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XG4gKiAgIHBob3RvMiA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHBob3RvMi5maWx0ZXIoJ2dyYXknKTtcbiAqICAgaW1hZ2UocGhvdG8xLCAwLCAwKTtcbiAqICAgaW1hZ2UocGhvdG8yLCB3aWR0aCAvIDIsIDApO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDIgaW1hZ2VzIG9mIHJvY2t5IG1vdW50YWlucyBsZWZ0IG9uZSBpbiBjb2xvciwgcmlnaHQgaW4gYmxhY2sgYW5kIHdoaXRlXG4gKlxuICovXG5wNS5JbWFnZS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ob3BlcmF0aW9uLCB2YWx1ZSkge1xuICBGaWx0ZXJzLmFwcGx5KHRoaXMuY2FudmFzLCBGaWx0ZXJzW29wZXJhdGlvbi50b0xvd2VyQ2FzZSgpXSwgdmFsdWUpO1xuICB0aGlzLnNldE1vZGlmaWVkKHRydWUpO1xufTtcblxuLyoqXG4gKiBDb3BpZXMgYSByZWdpb24gb2YgcGl4ZWxzIGZyb20gb25lIGltYWdlIHRvIGFub3RoZXIsIHVzaW5nIGEgc3BlY2lmaWVkXG4gKiBibGVuZCBtb2RlIHRvIGRvIHRoZSBvcGVyYXRpb24uXG4gKlxuICogQG1ldGhvZCBibGVuZFxuICogQHBhcmFtICB7cDUuSW1hZ2V9IHNyY0ltYWdlIHNvdXJjZSBpbWFnZVxuICogQHBhcmFtICB7SW50ZWdlcn0gc3ggWCBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UncyB1cHBlciBsZWZ0IGNvcm5lclxuICogQHBhcmFtICB7SW50ZWdlcn0gc3kgWSBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UncyB1cHBlciBsZWZ0IGNvcm5lclxuICogQHBhcmFtICB7SW50ZWdlcn0gc3cgc291cmNlIGltYWdlIHdpZHRoXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBzaCBzb3VyY2UgaW1hZ2UgaGVpZ2h0XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkeCBYIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uJ3MgdXBwZXIgbGVmdCBjb3JuZXJcbiAqIEBwYXJhbSAge0ludGVnZXJ9IGR5IFkgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24ncyB1cHBlciBsZWZ0IGNvcm5lclxuICogQHBhcmFtICB7SW50ZWdlcn0gZHcgZGVzdGluYXRpb24gaW1hZ2Ugd2lkdGhcbiAqIEBwYXJhbSAge0ludGVnZXJ9IGRoIGRlc3RpbmF0aW9uIGltYWdlIGhlaWdodFxuICogQHBhcmFtICB7Q29uc3RhbnR9IGJsZW5kTW9kZSB0aGUgYmxlbmQgbW9kZS4gZWl0aGVyXG4gKiAgICAgQkxFTkQsIERBUktFU1QsIExJR0hURVNULCBESUZGRVJFTkNFLFxuICogICAgIE1VTFRJUExZLCBFWENMVVNJT04sIFNDUkVFTiwgUkVQTEFDRSwgT1ZFUkxBWSwgSEFSRF9MSUdIVCxcbiAqICAgICBTT0ZUX0xJR0hULCBET0RHRSwgQlVSTiwgQUREIG9yIE5PUk1BTC5cbiAqXG4gKiBBdmFpbGFibGUgYmxlbmQgbW9kZXMgYXJlOiBub3JtYWwgfCBtdWx0aXBseSB8IHNjcmVlbiB8IG92ZXJsYXkgfFxuICogICAgICAgICAgICBkYXJrZW4gfCBsaWdodGVuIHwgY29sb3ItZG9kZ2UgfCBjb2xvci1idXJuIHwgaGFyZC1saWdodCB8XG4gKiAgICAgICAgICAgIHNvZnQtbGlnaHQgfCBkaWZmZXJlbmNlIHwgZXhjbHVzaW9uIHwgaHVlIHwgc2F0dXJhdGlvbiB8XG4gKiAgICAgICAgICAgIGNvbG9yIHwgbHVtaW5vc2l0eVxuICpcbiAqXG4gKiBodHRwOi8vYmxvZ3MuYWRvYmUuY29tL3dlYnBsYXRmb3JtLzIwMTMvMDEvMjgvYmxlbmRpbmctZmVhdHVyZXMtaW4tY2FudmFzL1xuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgbW91bnRhaW5zO1xuICogdmFyIGJyaWNrcztcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBtb3VudGFpbnMgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xuICogICBicmlja3MgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3NfdGhpcmQuanBnJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIG1vdW50YWlucy5ibGVuZChicmlja3MsIDAsIDAsIDMzLCAxMDAsIDY3LCAwLCAzMywgMTAwLCBBREQpO1xuICogICBpbWFnZShtb3VudGFpbnMsIDAsIDApO1xuICogICBpbWFnZShicmlja3MsIDAsIDApO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICogPGRpdj48Y29kZT5cbiAqIHZhciBtb3VudGFpbnM7XG4gKiB2YXIgYnJpY2tzO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIG1vdW50YWlucyA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XG4gKiAgIGJyaWNrcyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrc190aGlyZC5qcGcnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgbW91bnRhaW5zLmJsZW5kKGJyaWNrcywgMCwgMCwgMzMsIDEwMCwgNjcsIDAsIDMzLCAxMDAsIERBUktFU1QpO1xuICogICBpbWFnZShtb3VudGFpbnMsIDAsIDApO1xuICogICBpbWFnZShicmlja3MsIDAsIDApO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICogPGRpdj48Y29kZT5cbiAqIHZhciBtb3VudGFpbnM7XG4gKiB2YXIgYnJpY2tzO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIG1vdW50YWlucyA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XG4gKiAgIGJyaWNrcyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrc190aGlyZC5qcGcnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgbW91bnRhaW5zLmJsZW5kKGJyaWNrcywgMCwgMCwgMzMsIDEwMCwgNjcsIDAsIDMzLCAxMDAsIExJR0hURVNUKTtcbiAqICAgaW1hZ2UobW91bnRhaW5zLCAwLCAwKTtcbiAqICAgaW1hZ2UoYnJpY2tzLCAwLCAwKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBpbWFnZSBvZiByb2NreSBtb3VudGFpbnMuIEJyaWNrIGltYWdlcyBvbiBsZWZ0IGFuZCByaWdodC4gUmlnaHQgb3ZlcmV4cG9zZWRcbiAqIGltYWdlIG9mIHJvY2tpZXMuIEJyaWNrd2FsbCBpbWFnZXMgb24gbGVmdCBhbmQgcmlnaHQuIFJpZ2h0IG1vcnRhciB0cmFuc3BhcmVudFxuICogaW1hZ2Ugb2Ygcm9ja2llcy4gQnJpY2t3YWxsIGltYWdlcyBvbiBsZWZ0IGFuZCByaWdodC4gUmlnaHQgdHJhbnNsdWNlbnRcbiAqXG4gKi9cbi8qKlxuICogQG1ldGhvZCBibGVuZFxuICogQHBhcmFtICB7SW50ZWdlcn0gc3hcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN5XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBzd1xuICogQHBhcmFtICB7SW50ZWdlcn0gc2hcbiAqIEBwYXJhbSAge0ludGVnZXJ9IGR4XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkeVxuICogQHBhcmFtICB7SW50ZWdlcn0gZHdcbiAqIEBwYXJhbSAge0ludGVnZXJ9IGRoXG4gKiBAcGFyYW0gIHtDb25zdGFudH0gYmxlbmRNb2RlXG4gKi9cbnA1LkltYWdlLnByb3RvdHlwZS5ibGVuZCA9IGZ1bmN0aW9uKCkge1xuICBwNS5wcm90b3R5cGUuYmxlbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgdGhpcy5zZXRNb2RpZmllZCh0cnVlKTtcbn07XG5cbi8qKlxuICogaGVscGVyIG1ldGhvZCBmb3Igd2ViIEdMIG1vZGUgdG8gaW5kaWNhdGUgdGhhdCBhbiBpbWFnZSBoYXMgYmVlblxuICogY2hhbmdlZCBvciB1bmNoYW5nZWQgc2luY2UgbGFzdCB1cGxvYWQuIGdsIHRleHR1cmUgdXBsb2FkIHdpbGxcbiAqIHNldCB0aGlzIHZhbHVlIHRvIGZhbHNlIGFmdGVyIHVwbG9hZGluZyB0aGUgdGV4dHVyZS5cbiAqIEBtZXRob2Qgc2V0TW9kaWZpZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsIHNldHMgd2hldGhlciBvciBub3QgdGhlIGltYWdlIGhhcyBiZWVuXG4gKiBtb2RpZmllZC5cbiAqIEBwcml2YXRlXG4gKi9cbnA1LkltYWdlLnByb3RvdHlwZS5zZXRNb2RpZmllZCA9IGZ1bmN0aW9uKHZhbCkge1xuICB0aGlzLl9tb2RpZmllZCA9IHZhbDsgLy9lbmZvcmNlIGJvb2xlYW4/XG59O1xuXG4vKipcbiAqIGhlbHBlciBtZXRob2QgZm9yIHdlYiBHTCBtb2RlIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIGltYWdlXG4gKiBoYXMgYmVlbiBtb2RpZmllZCBhbmQgbWlnaHQgbmVlZCB0byBiZSByZS11cGxvYWRlZCB0byB0ZXh0dXJlXG4gKiBtZW1vcnkgYmV0d2VlbiBmcmFtZXMuXG4gKiBAbWV0aG9kIGlzTW9kaWZpZWRcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtib29sZWFufSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGVcbiAqIGltYWdlIGhhcyBiZWVuIHVwZGF0ZWQgb3IgbW9kaWZpZWQgc2luY2UgbGFzdCB0ZXh0dXJlIHVwbG9hZC5cbiAqL1xucDUuSW1hZ2UucHJvdG90eXBlLmlzTW9kaWZpZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX21vZGlmaWVkO1xufTtcblxuLyoqXG4gKiBTYXZlcyB0aGUgaW1hZ2UgdG8gYSBmaWxlIGFuZCBmb3JjZSB0aGUgYnJvd3NlciB0byBkb3dubG9hZCBpdC5cbiAqIEFjY2VwdHMgdHdvIHN0cmluZ3MgZm9yIGZpbGVuYW1lIGFuZCBmaWxlIGV4dGVuc2lvblxuICogU3VwcG9ydHMgcG5nIChkZWZhdWx0KSBhbmQganBnLlxuICpcbiAqIEBtZXRob2Qgc2F2ZVxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIGdpdmUgeW91ciBmaWxlIGEgbmFtZVxuICogQHBhcmFtICB7U3RyaW5nfSBleHRlbnNpb24gJ3BuZycgb3IgJ2pwZydcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogdmFyIHBob3RvO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHBob3RvID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBpbWFnZShwaG90bywgMCwgMCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24ga2V5VHlwZWQoKSB7XG4gKiAgIGlmIChrZXkgPT09ICdzJykge1xuICogICAgIHBob3RvLnNhdmUoJ3Bob3RvJywgJ3BuZycpO1xuICogICB9XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogaW1hZ2Ugb2Ygcm9ja3kgbW91bnRhaW5zLlxuICpcbiAqL1xucDUuSW1hZ2UucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbihmaWxlbmFtZSwgZXh0ZW5zaW9uKSB7XG4gIHA1LnByb3RvdHlwZS5zYXZlQ2FudmFzKHRoaXMuY2FudmFzLCBmaWxlbmFtZSwgZXh0ZW5zaW9uKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDUuSW1hZ2U7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjIsXCIuL2ZpbHRlcnNcIjo0MX1dLDQ1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBJbWFnZVxuICogQHN1Ym1vZHVsZSBQaXhlbHNcbiAqIEBmb3IgcDVcbiAqIEByZXF1aXJlcyBjb3JlXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuLi9jb3JlL2NvcmUnKTtcbnZhciBGaWx0ZXJzID0gX2RlcmVxXygnLi9maWx0ZXJzJyk7XG5fZGVyZXFfKCcuLi9jb2xvci9wNS5Db2xvcicpO1xuXG4vKipcbiAqIDxhIGhyZWY9J2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlXG4gKiAvR2xvYmFsX09iamVjdHMvVWludDhDbGFtcGVkQXJyYXknIHRhcmdldD0nX2JsYW5rJz5VaW50OENsYW1wZWRBcnJheTwvYT5cbiAqIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgYWxsIHRoZSBwaXhlbHMgaW4gdGhlIGRpc3BsYXkgd2luZG93LlxuICogVGhlc2UgdmFsdWVzIGFyZSBudW1iZXJzLiBUaGlzIGFycmF5IGlzIHRoZSBzaXplIChpbmNsdWRlIGFuIGFwcHJvcHJpYXRlXG4gKiBmYWN0b3IgZm9yIHBpeGVsRGVuc2l0eSkgb2YgdGhlIGRpc3BsYXkgd2luZG93IHg0LFxuICogcmVwcmVzZW50aW5nIHRoZSBSLCBHLCBCLCBBIHZhbHVlcyBpbiBvcmRlciBmb3IgZWFjaCBwaXhlbCwgbW92aW5nIGZyb21cbiAqIGxlZnQgdG8gcmlnaHQgYWNyb3NzIGVhY2ggcm93LCB0aGVuIGRvd24gZWFjaCBjb2x1bW4uIFJldGluYSBhbmQgb3RoZXJcbiAqIGhpZ2ggZGVuc2l0eSBkaXNwbGF5cyB3aWxsIGhhdmUgbW9yZSBwaXhlbHNbXSAoYnkgYSBmYWN0b3Igb2ZcbiAqIHBpeGVsRGVuc2l0eV4yKS5cbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgaW1hZ2UgaXMgMTAweDEwMCBwaXhlbHMsIHRoZXJlIHdpbGwgYmUgNDAsMDAwLiBPbiBhXG4gKiByZXRpbmEgZGlzcGxheSwgdGhlcmUgd2lsbCBiZSAxNjAsMDAwLlxuICogPGJyPjxicj5cbiAqIFRoZSBmaXJzdCBmb3VyIHZhbHVlcyAoaW5kaWNlcyAwLTMpIGluIHRoZSBhcnJheSB3aWxsIGJlIHRoZSBSLCBHLCBCLCBBXG4gKiB2YWx1ZXMgb2YgdGhlIHBpeGVsIGF0ICgwLCAwKS4gVGhlIHNlY29uZCBmb3VyIHZhbHVlcyAoaW5kaWNlcyA0LTcpIHdpbGxcbiAqIGNvbnRhaW4gdGhlIFIsIEcsIEIsIEEgdmFsdWVzIG9mIHRoZSBwaXhlbCBhdCAoMSwgMCkuIE1vcmUgZ2VuZXJhbGx5LCB0b1xuICogc2V0IHZhbHVlcyBmb3IgYSBwaXhlbCBhdCAoeCwgeSk6XG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgZCA9IHBpeGVsRGVuc2l0eSgpO1xuICogZm9yICh2YXIgaSA9IDA7IGkgPCBkOyBpKyspIHtcbiAqICAgZm9yICh2YXIgaiA9IDA7IGogPCBkOyBqKyspIHtcbiAqICAgICAvLyBsb29wIG92ZXJcbiAqICAgICBpZHggPSA0ICogKCh5ICogZCArIGopICogd2lkdGggKiBkICsgKHggKiBkICsgaSkpO1xuICogICAgIHBpeGVsc1tpZHhdID0gcjtcbiAqICAgICBwaXhlbHNbaWR4KzFdID0gZztcbiAqICAgICBwaXhlbHNbaWR4KzJdID0gYjtcbiAqICAgICBwaXhlbHNbaWR4KzNdID0gYTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiA8cD5XaGlsZSB0aGUgYWJvdmUgbWV0aG9kIGlzIGNvbXBsZXgsIGl0IGlzIGZsZXhpYmxlIGVub3VnaCB0byB3b3JrIHdpdGhcbiAqIGFueSBwaXhlbERlbnNpdHkuIE5vdGUgdGhhdCBzZXQoKSB3aWxsIGF1dG9tYXRpY2FsbHkgdGFrZSBjYXJlIG9mXG4gKiBzZXR0aW5nIGFsbCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIGluIHBpeGVsc1tdIGZvciBhIGdpdmVuICh4LCB5KSBhdFxuICogYW55IHBpeGVsRGVuc2l0eSwgYnV0IHRoZSBwZXJmb3JtYW5jZSBtYXkgbm90IGJlIGFzIGZhc3Qgd2hlbiBsb3RzIG9mXG4gKiBtb2RpZmljYXRpb25zIGFyZSBtYWRlIHRvIHRoZSBwaXhlbCBhcnJheS5cbiAqIDxicj48YnI+XG4gKiBCZWZvcmUgYWNjZXNzaW5nIHRoaXMgYXJyYXksIHRoZSBkYXRhIG11c3QgbG9hZGVkIHdpdGggdGhlIGxvYWRQaXhlbHMoKVxuICogZnVuY3Rpb24uIEFmdGVyIHRoZSBhcnJheSBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkLCB0aGUgdXBkYXRlUGl4ZWxzKClcbiAqIGZ1bmN0aW9uIG11c3QgYmUgcnVuIHRvIHVwZGF0ZSB0aGUgY2hhbmdlcy5cbiAqIDxicj48YnI+XG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYSBzdGFuZGFyZCBqYXZhc2NyaXB0IGFycmF5LiAgVGhpcyBtZWFucyB0aGF0XG4gKiBzdGFuZGFyZCBqYXZhc2NyaXB0IGZ1bmN0aW9ucyBzdWNoIGFzIDxjb2RlPnNsaWNlKCk8L2NvZGU+IG9yXG4gKiA8Y29kZT5hcnJheUNvcHkoKTwvY29kZT4gZG8gbm90XG4gKiB3b3JrLjwvcD5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcltdfSBwaXhlbHNcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgcGluayA9IGNvbG9yKDI1NSwgMTAyLCAyMDQpO1xuICogbG9hZFBpeGVscygpO1xuICogdmFyIGQgPSBwaXhlbERlbnNpdHkoKTtcbiAqIHZhciBoYWxmSW1hZ2UgPSA0ICogKHdpZHRoICogZCkgKiAoaGVpZ2h0IC8gMiAqIGQpO1xuICogZm9yICh2YXIgaSA9IDA7IGkgPCBoYWxmSW1hZ2U7IGkgKz0gNCkge1xuICogICBwaXhlbHNbaV0gPSByZWQocGluayk7XG4gKiAgIHBpeGVsc1tpICsgMV0gPSBncmVlbihwaW5rKTtcbiAqICAgcGl4ZWxzW2kgKyAyXSA9IGJsdWUocGluayk7XG4gKiAgIHBpeGVsc1tpICsgM10gPSBhbHBoYShwaW5rKTtcbiAqIH1cbiAqIHVwZGF0ZVBpeGVscygpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogdG9wIGhhbGYgb2YgY2FudmFzIHBpbmssIGJvdHRvbSBncmV5XG4gKlxuICovXG5wNS5wcm90b3R5cGUucGl4ZWxzID0gW107XG5cbi8qKlxuICogQ29waWVzIGEgcmVnaW9uIG9mIHBpeGVscyBmcm9tIG9uZSBpbWFnZSB0byBhbm90aGVyLCB1c2luZyBhIHNwZWNpZmllZFxuICogYmxlbmQgbW9kZSB0byBkbyB0aGUgb3BlcmF0aW9uLlxuICpcbiAqIEBtZXRob2QgYmxlbmRcbiAqIEBwYXJhbSAge3A1LkltYWdlfSBzcmNJbWFnZSBzb3VyY2UgaW1hZ2VcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN4IFggY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlJ3MgdXBwZXIgbGVmdCBjb3JuZXJcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN5IFkgY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlJ3MgdXBwZXIgbGVmdCBjb3JuZXJcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN3IHNvdXJjZSBpbWFnZSB3aWR0aFxuICogQHBhcmFtICB7SW50ZWdlcn0gc2ggc291cmNlIGltYWdlIGhlaWdodFxuICogQHBhcmFtICB7SW50ZWdlcn0gZHggWCBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbidzIHVwcGVyIGxlZnQgY29ybmVyXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkeSBZIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uJ3MgdXBwZXIgbGVmdCBjb3JuZXJcbiAqIEBwYXJhbSAge0ludGVnZXJ9IGR3IGRlc3RpbmF0aW9uIGltYWdlIHdpZHRoXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkaCBkZXN0aW5hdGlvbiBpbWFnZSBoZWlnaHRcbiAqIEBwYXJhbSAge0NvbnN0YW50fSBibGVuZE1vZGUgdGhlIGJsZW5kIG1vZGUuIGVpdGhlclxuICogICAgIEJMRU5ELCBEQVJLRVNULCBMSUdIVEVTVCwgRElGRkVSRU5DRSxcbiAqICAgICBNVUxUSVBMWSwgRVhDTFVTSU9OLCBTQ1JFRU4sIFJFUExBQ0UsIE9WRVJMQVksIEhBUkRfTElHSFQsXG4gKiAgICAgU09GVF9MSUdIVCwgRE9ER0UsIEJVUk4sIEFERCBvciBOT1JNQUwuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgaW1nMDtcbiAqIHZhciBpbWcxO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZzAgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xuICogICBpbWcxID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzX3RoaXJkLmpwZycpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBiYWNrZ3JvdW5kKGltZzApO1xuICogICBpbWFnZShpbWcxLCAwLCAwKTtcbiAqICAgYmxlbmQoaW1nMSwgMCwgMCwgMzMsIDEwMCwgNjcsIDAsIDMzLCAxMDAsIExJR0hURVNUKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgaW1nMDtcbiAqIHZhciBpbWcxO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZzAgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xuICogICBpbWcxID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzX3RoaXJkLmpwZycpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBiYWNrZ3JvdW5kKGltZzApO1xuICogICBpbWFnZShpbWcxLCAwLCAwKTtcbiAqICAgYmxlbmQoaW1nMSwgMCwgMCwgMzMsIDEwMCwgNjcsIDAsIDMzLCAxMDAsIERBUktFU1QpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICogPGRpdj48Y29kZT5cbiAqIHZhciBpbWcwO1xuICogdmFyIGltZzE7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nMCA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XG4gKiAgIGltZzEgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3NfdGhpcmQuanBnJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGJhY2tncm91bmQoaW1nMCk7XG4gKiAgIGltYWdlKGltZzEsIDAsIDApO1xuICogICBibGVuZChpbWcxLCAwLCAwLCAzMywgMTAwLCA2NywgMCwgMzMsIDEwMCwgQUREKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBpbWFnZSBvZiByb2NreSBtb3VudGFpbnMuIEJyaWNrIGltYWdlcyBvbiBsZWZ0IGFuZCByaWdodC4gUmlnaHQgb3ZlcmV4cG9zZWRcbiAqIGltYWdlIG9mIHJvY2tpZXMuIEJyaWNrd2FsbCBpbWFnZXMgb24gbGVmdCBhbmQgcmlnaHQuIFJpZ2h0IG1vcnRhciB0cmFuc3BhcmVudFxuICogaW1hZ2Ugb2Ygcm9ja2llcy4gQnJpY2t3YWxsIGltYWdlcyBvbiBsZWZ0IGFuZCByaWdodC4gUmlnaHQgdHJhbnNsdWNlbnRcbiAqXG4gKlxuICovXG4vKipcbiAqIEBtZXRob2QgYmxlbmRcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN4XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBzeVxuICogQHBhcmFtICB7SW50ZWdlcn0gc3dcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHNoXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkeFxuICogQHBhcmFtICB7SW50ZWdlcn0gZHlcbiAqIEBwYXJhbSAge0ludGVnZXJ9IGR3XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkaFxuICogQHBhcmFtICB7Q29uc3RhbnR9IGJsZW5kTW9kZVxuICovXG5wNS5wcm90b3R5cGUuYmxlbmQgPSBmdW5jdGlvbigpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnYmxlbmQnLCBhcmd1bWVudHMpO1xuICBpZiAodGhpcy5fcmVuZGVyZXIpIHtcbiAgICB0aGlzLl9yZW5kZXJlci5ibGVuZC5hcHBseSh0aGlzLl9yZW5kZXJlciwgYXJndW1lbnRzKTtcbiAgfSBlbHNlIHtcbiAgICBwNS5SZW5kZXJlcjJELnByb3RvdHlwZS5ibGVuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG4vKipcbiAqIENvcGllcyBhIHJlZ2lvbiBvZiB0aGUgY2FudmFzIHRvIGFub3RoZXIgcmVnaW9uIG9mIHRoZSBjYW52YXNcbiAqIGFuZCBjb3BpZXMgYSByZWdpb24gb2YgcGl4ZWxzIGZyb20gYW4gaW1hZ2UgdXNlZCBhcyB0aGUgc3JjSW1nIHBhcmFtZXRlclxuICogaW50byB0aGUgY2FudmFzIHNyY0ltYWdlIGlzIHNwZWNpZmllZCB0aGlzIGlzIHVzZWQgYXMgdGhlIHNvdXJjZS4gSWZcbiAqIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ2lvbnMgYXJlbid0IHRoZSBzYW1lIHNpemUsIGl0IHdpbGxcbiAqIGF1dG9tYXRpY2FsbHkgcmVzaXplIHNvdXJjZSBwaXhlbHMgdG8gZml0IHRoZSBzcGVjaWZpZWRcbiAqIHRhcmdldCByZWdpb24uXG4gKlxuICogQG1ldGhvZCBjb3B5XG4gKiBAcGFyYW0gIHtwNS5JbWFnZXxwNS5FbGVtZW50fSBzcmNJbWFnZSBzb3VyY2UgaW1hZ2VcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN4IFggY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlJ3MgdXBwZXIgbGVmdCBjb3JuZXJcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN5IFkgY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlJ3MgdXBwZXIgbGVmdCBjb3JuZXJcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN3IHNvdXJjZSBpbWFnZSB3aWR0aFxuICogQHBhcmFtICB7SW50ZWdlcn0gc2ggc291cmNlIGltYWdlIGhlaWdodFxuICogQHBhcmFtICB7SW50ZWdlcn0gZHggWCBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbidzIHVwcGVyIGxlZnQgY29ybmVyXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkeSBZIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uJ3MgdXBwZXIgbGVmdCBjb3JuZXJcbiAqIEBwYXJhbSAge0ludGVnZXJ9IGR3IGRlc3RpbmF0aW9uIGltYWdlIHdpZHRoXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkaCBkZXN0aW5hdGlvbiBpbWFnZSBoZWlnaHRcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIHZhciBpbWc7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgYmFja2dyb3VuZChpbWcpO1xuICogICBjb3B5KGltZywgNywgMjIsIDEwLCAxMCwgMzUsIDI1LCA1MCwgNTApO1xuICogICBzdHJva2UoMjU1KTtcbiAqICAgbm9GaWxsKCk7XG4gKiAgIC8vIFJlY3RhbmdsZSBzaG93cyBhcmVhIGJlaW5nIGNvcGllZFxuICogICByZWN0KDcsIDIyLCAxMCwgMTApO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGltYWdlIG9mIHJvY2t5IG1vdW50YWlucy4gQnJpY2sgaW1hZ2VzIG9uIGxlZnQgYW5kIHJpZ2h0LiBSaWdodCBvdmVyZXhwb3NlZFxuICogaW1hZ2Ugb2Ygcm9ja2llcy4gQnJpY2t3YWxsIGltYWdlcyBvbiBsZWZ0IGFuZCByaWdodC4gUmlnaHQgbW9ydGFyIHRyYW5zcGFyZW50XG4gKiBpbWFnZSBvZiByb2NraWVzLiBCcmlja3dhbGwgaW1hZ2VzIG9uIGxlZnQgYW5kIHJpZ2h0LiBSaWdodCB0cmFuc2x1Y2VudFxuICpcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGNvcHlcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN4XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBzeVxuICogQHBhcmFtICB7SW50ZWdlcn0gc3dcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHNoXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkeFxuICogQHBhcmFtICB7SW50ZWdlcn0gZHlcbiAqIEBwYXJhbSAge0ludGVnZXJ9IGR3XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBkaFxuICovXG5wNS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjb3B5JywgYXJndW1lbnRzKTtcbiAgcDUuUmVuZGVyZXIyRC5wcm90b3R5cGUuY29weS5hcHBseSh0aGlzLl9yZW5kZXJlciwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogQXBwbGllcyBhIGZpbHRlciB0byB0aGUgY2FudmFzLlxuICogPGJyPjxicj5cbiAqXG4gKiBUaGUgcHJlc2V0cyBvcHRpb25zIGFyZTpcbiAqIDxicj48YnI+XG4gKlxuICogVEhSRVNIT0xEXG4gKiBDb252ZXJ0cyB0aGUgaW1hZ2UgdG8gYmxhY2sgYW5kIHdoaXRlIHBpeGVscyBkZXBlbmRpbmcgaWYgdGhleSBhcmUgYWJvdmUgb3JcbiAqIGJlbG93IHRoZSB0aHJlc2hvbGQgZGVmaW5lZCBieSB0aGUgbGV2ZWwgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIG11c3QgYmVcbiAqIGJldHdlZW4gMC4wIChibGFjaykgYW5kIDEuMCAod2hpdGUpLiBJZiBubyBsZXZlbCBpcyBzcGVjaWZpZWQsIDAuNSBpcyB1c2VkLlxuICogPGJyPjxicj5cbiAqXG4gKiBHUkFZXG4gKiBDb252ZXJ0cyBhbnkgY29sb3JzIGluIHRoZSBpbWFnZSB0byBncmF5c2NhbGUgZXF1aXZhbGVudHMuIE5vIHBhcmFtZXRlclxuICogaXMgdXNlZC5cbiAqIDxicj48YnI+XG4gKlxuICogT1BBUVVFXG4gKiBTZXRzIHRoZSBhbHBoYSBjaGFubmVsIHRvIGVudGlyZWx5IG9wYXF1ZS4gTm8gcGFyYW1ldGVyIGlzIHVzZWQuXG4gKiA8YnI+PGJyPlxuICpcbiAqIElOVkVSVFxuICogU2V0cyBlYWNoIHBpeGVsIHRvIGl0cyBpbnZlcnNlIHZhbHVlLiBObyBwYXJhbWV0ZXIgaXMgdXNlZC5cbiAqIDxicj48YnI+XG4gKlxuICogUE9TVEVSSVpFXG4gKiBMaW1pdHMgZWFjaCBjaGFubmVsIG9mIHRoZSBpbWFnZSB0byB0aGUgbnVtYmVyIG9mIGNvbG9ycyBzcGVjaWZpZWQgYXMgdGhlXG4gKiBwYXJhbWV0ZXIuIFRoZSBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byB2YWx1ZXMgYmV0d2VlbiAyIGFuZCAyNTUsIGJ1dFxuICogcmVzdWx0cyBhcmUgbW9zdCBub3RpY2VhYmxlIGluIHRoZSBsb3dlciByYW5nZXMuXG4gKiA8YnI+PGJyPlxuICpcbiAqIEJMVVJcbiAqIEV4ZWN1dGVzIGEgR2F1c3NpYW4gYmx1ciB3aXRoIHRoZSBsZXZlbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgZXh0ZW50XG4gKiBvZiB0aGUgYmx1cnJpbmcuIElmIG5vIHBhcmFtZXRlciBpcyB1c2VkLCB0aGUgYmx1ciBpcyBlcXVpdmFsZW50IHRvXG4gKiBHYXVzc2lhbiBibHVyIG9mIHJhZGl1cyAxLiBMYXJnZXIgdmFsdWVzIGluY3JlYXNlIHRoZSBibHVyLlxuICogPGJyPjxicj5cbiAqXG4gKiBFUk9ERVxuICogUmVkdWNlcyB0aGUgbGlnaHQgYXJlYXMuIE5vIHBhcmFtZXRlciBpcyB1c2VkLlxuICogPGJyPjxicj5cbiAqXG4gKiBESUxBVEVcbiAqIEluY3JlYXNlcyB0aGUgbGlnaHQgYXJlYXMuIE5vIHBhcmFtZXRlciBpcyB1c2VkLlxuICpcbiAqIEBtZXRob2QgZmlsdGVyXG4gKiBAcGFyYW0gIHtDb25zdGFudH0gZmlsdGVyVHlwZSAgZWl0aGVyIFRIUkVTSE9MRCwgR1JBWSwgT1BBUVVFLCBJTlZFUlQsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9TVEVSSVpFLCBCTFVSLCBFUk9ERSwgRElMQVRFIG9yIEJMVVIuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIEZpbHRlcnMuanMgZm9yIGRvY3Mgb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGF2YWlsYWJsZSBmaWx0ZXJcbiAqIEBwYXJhbSAge051bWJlcn0gW2ZpbHRlclBhcmFtXSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdW5pcXVlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZWFjaCBmaWx0ZXIsIHNlZSBhYm92ZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzLmpwZycpO1xuICogfVxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGltYWdlKGltZywgMCwgMCk7XG4gKiAgIGZpbHRlcihUSFJFU0hPTEQpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGltZztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrcy5qcGcnKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBpbWFnZShpbWcsIDAsIDApO1xuICogICBmaWx0ZXIoR1JBWSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzLmpwZycpO1xuICogfVxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGltYWdlKGltZywgMCwgMCk7XG4gKiAgIGZpbHRlcihPUEFRVUUpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGltZztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrcy5qcGcnKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBpbWFnZShpbWcsIDAsIDApO1xuICogICBmaWx0ZXIoSU5WRVJUKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBpbWc7XG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9icmlja3MuanBnJyk7XG4gKiB9XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgaW1hZ2UoaW1nLCAwLCAwKTtcbiAqICAgZmlsdGVyKFBPU1RFUklaRSwgMyk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzLmpwZycpO1xuICogfVxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGltYWdlKGltZywgMCwgMCk7XG4gKiAgIGZpbHRlcihESUxBVEUpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGltZztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2JyaWNrcy5qcGcnKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBpbWFnZShpbWcsIDAsIDApO1xuICogICBmaWx0ZXIoQkxVUiwgMyk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvYnJpY2tzLmpwZycpO1xuICogfVxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGltYWdlKGltZywgMCwgMCk7XG4gKiAgIGZpbHRlcihFUk9ERSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBibGFjayBhbmQgd2hpdGUgaW1hZ2Ugb2YgYSBicmljayB3YWxsLlxuICogZ3JleXNjYWxlIGltYWdlIG9mIGEgYnJpY2t3YWxsXG4gKiBpbWFnZSBvZiBhIGJyaWNrd2FsbFxuICogamFkZSBjb2xvcmVkIGltYWdlIG9mIGEgYnJpY2t3YWxsXG4gKiByZWQgYW5kIHBpbmsgaW1hZ2Ugb2YgYSBicmlja3dhbGxcbiAqIGltYWdlIG9mIGEgYnJpY2t3YWxsXG4gKiBibHVycnkgaW1hZ2Ugb2YgYSBicmlja3dhbGxcbiAqIGltYWdlIG9mIGEgYnJpY2t3YWxsXG4gKiBpbWFnZSBvZiBhIGJyaWNrd2FsbCB3aXRoIGxlc3MgZGV0YWlsXG4gKlxuICovXG5wNS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ob3BlcmF0aW9uLCB2YWx1ZSkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdmaWx0ZXInLCBhcmd1bWVudHMpO1xuICBpZiAodGhpcy5jYW52YXMgIT09IHVuZGVmaW5lZCkge1xuICAgIEZpbHRlcnMuYXBwbHkodGhpcy5jYW52YXMsIEZpbHRlcnNbb3BlcmF0aW9uLnRvTG93ZXJDYXNlKCldLCB2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgRmlsdGVycy5hcHBseSh0aGlzLmVsdCwgRmlsdGVyc1tvcGVyYXRpb24udG9Mb3dlckNhc2UoKV0sIHZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtSLEcsQixBXSB2YWx1ZXMgZm9yIGFueSBwaXhlbCBvciBncmFicyBhIHNlY3Rpb24gb2ZcbiAqIGFuIGltYWdlLiBJZiBubyBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQsIHRoZSBlbnRpcmUgaW1hZ2UgaXMgcmV0dXJuZWQuXG4gKiBVc2UgdGhlIHggYW5kIHkgcGFyYW1ldGVycyB0byBnZXQgdGhlIHZhbHVlIG9mIG9uZSBwaXhlbC4gR2V0IGEgc2VjdGlvbiBvZlxuICogdGhlIGRpc3BsYXkgd2luZG93IGJ5IHNwZWNpZnlpbmcgYWRkaXRpb25hbCB3IGFuZCBoIHBhcmFtZXRlcnMuIFdoZW5cbiAqIGdldHRpbmcgYW4gaW1hZ2UsIHRoZSB4IGFuZCB5IHBhcmFtZXRlcnMgZGVmaW5lIHRoZSBjb29yZGluYXRlcyBmb3IgdGhlXG4gKiB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UsIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgaW1hZ2VNb2RlKCkuXG4gKiA8YnI+PGJyPlxuICogSWYgdGhlIHBpeGVsIHJlcXVlc3RlZCBpcyBvdXRzaWRlIG9mIHRoZSBpbWFnZSB3aW5kb3csIFswLDAsMCwyNTVdIGlzXG4gKiByZXR1cm5lZC4gVG8gZ2V0IHRoZSBudW1iZXJzIHNjYWxlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2VzXG4gKiBhbmQgdGFraW5nIGludG8gYWNjb3VudCBjb2xvck1vZGUsIHVzZSBnZXRDb2xvciBpbnN0ZWFkIG9mIGdldC5cbiAqIDxicj48YnI+XG4gKiBHZXR0aW5nIHRoZSBjb2xvciBvZiBhIHNpbmdsZSBwaXhlbCB3aXRoIGdldCh4LCB5KSBpcyBlYXN5LCBidXQgbm90IGFzIGZhc3RcbiAqIGFzIGdyYWJiaW5nIHRoZSBkYXRhIGRpcmVjdGx5IGZyb20gcGl4ZWxzW10uIFRoZSBlcXVpdmFsZW50IHN0YXRlbWVudCB0b1xuICogZ2V0KHgsIHkpIHVzaW5nIHBpeGVsc1tdIHdpdGggcGl4ZWwgZGVuc2l0eSBkIGlzXG4gKiA8Y29kZT5cbiAqIHZhciB4LCB5LCBkOyAvLyBzZXQgdGhlc2UgdG8gdGhlIGNvb3JkaW5hdGVzXG4gKiB2YXIgb2ZmID0gKHkgKiB3aWR0aCArIHgpICogZCAqIDQ7XG4gKiB2YXIgY29tcG9uZW50cyA9IFtcbiAqICAgcGl4ZWxzW29mZl0sXG4gKiAgIHBpeGVsc1tvZmYgKyAxXSxcbiAqICAgcGl4ZWxzW29mZiArIDJdLFxuICogICBwaXhlbHNbb2ZmICsgM11cbiAqIF07XG4gKiBwcmludChjb21wb25lbnRzKTtcbiAqIDwvY29kZT5cbiAqIDxicj48YnI+XG4gKiBTZWUgdGhlIHJlZmVyZW5jZSBmb3IgcGl4ZWxzW10gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQG1ldGhvZCBnZXRcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgICBbeF0geC1jb29yZGluYXRlIG9mIHRoZSBwaXhlbFxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgIFt5XSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICAgW3ddIHdpZHRoXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICAgW2hdIGhlaWdodFxuICogQHJldHVybiB7TnVtYmVyW118cDUuSW1hZ2V9ICB2YWx1ZXMgb2YgcGl4ZWwgYXQgeCx5IGluIGFycmF5IGZvcm1hdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUiwgRywgQiwgQV0gb3IgcDUuSW1hZ2VcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBpbWFnZShpbWcsIDAsIDApO1xuICogICB2YXIgYyA9IGdldCgpO1xuICogICBpbWFnZShjLCB3aWR0aCAvIDIsIDApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGltZztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL3JvY2tpZXMuanBnJyk7XG4gKiB9XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgaW1hZ2UoaW1nLCAwLCAwKTtcbiAqICAgdmFyIGMgPSBnZXQoNTAsIDkwKTtcbiAqICAgZmlsbChjKTtcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgcmVjdCgyNSwgMjUsIDUwLCA1MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAyIGltYWdlcyBvZiB0aGUgcm9ja3kgbW91bnRhaW5zLCBzaWRlLWJ5LXNpZGVcbiAqIEltYWdlIG9mIHRoZSByb2NreSBtb3VudGFpbnMgd2l0aCA1MHg1MCBncmVlbiByZWN0IGluIGNlbnRlciBvZiBjYW52YXNcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbih4LCB5LCB3LCBoKSB7XG4gIHJldHVybiB0aGlzLl9yZW5kZXJlci5nZXQoeCwgeSwgdywgaCk7XG59O1xuXG4vKipcbiAqIExvYWRzIHRoZSBwaXhlbCBkYXRhIGZvciB0aGUgZGlzcGxheSB3aW5kb3cgaW50byB0aGUgcGl4ZWxzW10gYXJyYXkuIFRoaXNcbiAqIGZ1bmN0aW9uIG11c3QgYWx3YXlzIGJlIGNhbGxlZCBiZWZvcmUgcmVhZGluZyBmcm9tIG9yIHdyaXRpbmcgdG8gcGl4ZWxzW10uXG4gKiBOb3RlIHRoYXQgb25seSBjaGFuZ2VzIG1hZGUgd2l0aCBzZXQoKSBvciBkaXJlY3QgbWFuaXB1bGF0aW9uIG9mIHBpeGVsc1tdXG4gKiB3aWxsIG9jY3VyLlxuICpcbiAqIEBtZXRob2QgbG9hZFBpeGVsc1xuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBpbWc7XG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBpbWcgPSBsb2FkSW1hZ2UoJ2Fzc2V0cy9yb2NraWVzLmpwZycpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBpbWFnZShpbWcsIDAsIDApO1xuICogICB2YXIgZCA9IHBpeGVsRGVuc2l0eSgpO1xuICogICB2YXIgaGFsZkltYWdlID0gNCAqIChpbWcud2lkdGggKiBkKSAqIChpbWcuaGVpZ2h0ICogZCAvIDIpO1xuICogICBsb2FkUGl4ZWxzKCk7XG4gKiAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFsZkltYWdlOyBpKyspIHtcbiAqICAgICBwaXhlbHNbaSArIGhhbGZJbWFnZV0gPSBwaXhlbHNbaV07XG4gKiAgIH1cbiAqICAgdXBkYXRlUGl4ZWxzKCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiB0d28gaW1hZ2VzIG9mIHRoZSByb2NreSBtb3VudGFpbnMuIG9uZSBvbiB0b3AsIG9uZSBvbiBib3R0b20gb2YgY2FudmFzLlxuICpcbiAqL1xucDUucHJvdG90eXBlLmxvYWRQaXhlbHMgPSBmdW5jdGlvbigpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnbG9hZFBpeGVscycsIGFyZ3VtZW50cyk7XG4gIHRoaXMuX3JlbmRlcmVyLmxvYWRQaXhlbHMoKTtcbn07XG5cbi8qKlxuICogPHA+Q2hhbmdlcyB0aGUgY29sb3Igb2YgYW55IHBpeGVsLCBvciB3cml0ZXMgYW4gaW1hZ2UgZGlyZWN0bHkgdG8gdGhlXG4gKiBkaXNwbGF5IHdpbmRvdy48L3A+XG4gKiA8cD5UaGUgeCBhbmQgeSBwYXJhbWV0ZXJzIHNwZWNpZnkgdGhlIHBpeGVsIHRvIGNoYW5nZSBhbmQgdGhlIGMgcGFyYW1ldGVyXG4gKiBzcGVjaWZpZXMgdGhlIGNvbG9yIHZhbHVlLiBUaGlzIGNhbiBiZSBhIHA1LkNvbG9yIG9iamVjdCwgb3IgW1IsIEcsIEIsIEFdXG4gKiBwaXhlbCBhcnJheS4gSXQgY2FuIGFsc28gYmUgYSBzaW5nbGUgZ3JheXNjYWxlIHZhbHVlLlxuICogV2hlbiBzZXR0aW5nIGFuIGltYWdlLCB0aGUgeCBhbmQgeSBwYXJhbWV0ZXJzIGRlZmluZSB0aGUgY29vcmRpbmF0ZXMgZm9yXG4gKiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlLCByZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50IGltYWdlTW9kZSgpLlxuICogPC9wPlxuICogPHA+XG4gKiBBZnRlciB1c2luZyBzZXQoKSwgeW91IG11c3QgY2FsbCB1cGRhdGVQaXhlbHMoKSBmb3IgeW91ciBjaGFuZ2VzIHRvIGFwcGVhci5cbiAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIGFsbCBwaXhlbHMgaGF2ZSBiZWVuIHNldCwgYW5kIG11c3QgYmUgY2FsbGVkIGJlZm9yZVxuICogY2FsbGluZyAuZ2V0KCkgb3IgZHJhd2luZyB0aGUgaW1hZ2UuXG4gKiA8L3A+XG4gKiA8cD5TZXR0aW5nIHRoZSBjb2xvciBvZiBhIHNpbmdsZSBwaXhlbCB3aXRoIHNldCh4LCB5KSBpcyBlYXN5LCBidXQgbm90IGFzXG4gKiBmYXN0IGFzIHB1dHRpbmcgdGhlIGRhdGEgZGlyZWN0bHkgaW50byBwaXhlbHNbXS4gU2V0dGluZyB0aGUgcGl4ZWxzW11cbiAqIHZhbHVlcyBkaXJlY3RseSBtYXkgYmUgY29tcGxpY2F0ZWQgd2hlbiB3b3JraW5nIHdpdGggYSByZXRpbmEgZGlzcGxheSxcbiAqIGJ1dCB3aWxsIHBlcmZvcm0gYmV0dGVyIHdoZW4gbG90cyBvZiBwaXhlbHMgbmVlZCB0byBiZSBzZXQgZGlyZWN0bHkgb25cbiAqIGV2ZXJ5IGxvb3AuPC9wPlxuICogPHA+U2VlIHRoZSByZWZlcmVuY2UgZm9yIHBpeGVsc1tdIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD5cbiAqXG4gKiBAbWV0aG9kIHNldFxuICogQHBhcmFtIHtOdW1iZXJ9ICAgICAgICAgICAgICB4IHgtY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxcbiAqIEBwYXJhbSB7TnVtYmVyfSAgICAgICAgICAgICAgeSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsXG4gKiBAcGFyYW0ge051bWJlcnxOdW1iZXJbXXxPYmplY3R9IGMgaW5zZXJ0IGEgZ3JheXNjYWxlIHZhbHVlIHwgYSBwaXhlbCBhcnJheSB8XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwNS5Db2xvciBvYmplY3QgfCBhIHA1LkltYWdlIHRvIGNvcHlcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYmxhY2sgPSBjb2xvcigwKTtcbiAqIHNldCgzMCwgMjAsIGJsYWNrKTtcbiAqIHNldCg4NSwgMjAsIGJsYWNrKTtcbiAqIHNldCg4NSwgNzUsIGJsYWNrKTtcbiAqIHNldCgzMCwgNzUsIGJsYWNrKTtcbiAqIHVwZGF0ZVBpeGVscygpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZm9yICh2YXIgaSA9IDMwOyBpIDwgd2lkdGggLSAxNTsgaSsrKSB7XG4gKiAgIGZvciAodmFyIGogPSAyMDsgaiA8IGhlaWdodCAtIDI1OyBqKyspIHtcbiAqICAgICB2YXIgYyA9IGNvbG9yKDIwNCAtIGosIDE1MyAtIGksIDApO1xuICogICAgIHNldChpLCBqLCBjKTtcbiAqICAgfVxuICogfVxuICogdXBkYXRlUGl4ZWxzKCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgc2V0KDAsIDAsIGltZyk7XG4gKiAgIHVwZGF0ZVBpeGVscygpO1xuICogICBsaW5lKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICogICBsaW5lKDAsIGhlaWdodCwgd2lkdGgsIDApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogNCBibGFjayBwb2ludHMgaW4gdGhlIHNoYXBlIG9mIGEgc3F1YXJlIG1pZGRsZS1yaWdodCBvZiBjYW52YXMuXG4gKiBzcXVhcmUgd2l0aCBvcmFuZ2V5LWJyb3duIGdyYWRpZW50IGxpZ2h0ZW5pbmcgYXQgYm90dG9tIHJpZ2h0LlxuICogaW1hZ2Ugb2YgdGhlIHJvY2t5IG1vdW50YWlucy4gd2l0aCBsaW5lcyBsaWtlIGFuICd4JyB0aHJvdWdoIHRoZSBjZW50ZXIuXG4gKi9cbnA1LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbih4LCB5LCBpbWdPckNvbCkge1xuICB0aGlzLl9yZW5kZXJlci5zZXQoeCwgeSwgaW1nT3JDb2wpO1xufTtcbi8qKlxuICogVXBkYXRlcyB0aGUgZGlzcGxheSB3aW5kb3cgd2l0aCB0aGUgZGF0YSBpbiB0aGUgcGl4ZWxzW10gYXJyYXkuXG4gKiBVc2UgaW4gY29uanVuY3Rpb24gd2l0aCBsb2FkUGl4ZWxzKCkuIElmIHlvdSdyZSBvbmx5IHJlYWRpbmcgcGl4ZWxzIGZyb21cbiAqIHRoZSBhcnJheSwgdGhlcmUncyBubyBuZWVkIHRvIGNhbGwgdXBkYXRlUGl4ZWxzKCkg4oCUIHVwZGF0aW5nIGlzIG9ubHlcbiAqIG5lY2Vzc2FyeSB0byBhcHBseSBjaGFuZ2VzLiB1cGRhdGVQaXhlbHMoKSBzaG91bGQgYmUgY2FsbGVkIGFueXRpbWUgdGhlXG4gKiBwaXhlbHMgYXJyYXkgaXMgbWFuaXB1bGF0ZWQgb3Igc2V0KCkgaXMgY2FsbGVkLCBhbmQgb25seSBjaGFuZ2VzIG1hZGUgd2l0aFxuICogc2V0KCkgb3IgZGlyZWN0IGNoYW5nZXMgdG8gcGl4ZWxzW10gd2lsbCBvY2N1ci5cbiAqXG4gKiBAbWV0aG9kIHVwZGF0ZVBpeGVsc1xuICogQHBhcmFtICB7TnVtYmVyfSBbeF0gICAgeC1jb29yZGluYXRlIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiByZWdpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHVwZGF0ZVxuICogQHBhcmFtICB7TnVtYmVyfSBbeV0gICAgeS1jb29yZGluYXRlIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiByZWdpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHVwZGF0ZVxuICogQHBhcmFtICB7TnVtYmVyfSBbd10gICAgd2lkdGggb2YgcmVnaW9uIHRvIHVwZGF0ZVxuICogQHBhcmFtICB7TnVtYmVyfSBbaF0gICAgaGVpZ2h0IG9mIHJlZ2lvbiB0byB1cGRhdGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaW1nO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgaW1nID0gbG9hZEltYWdlKCdhc3NldHMvcm9ja2llcy5qcGcnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgaW1hZ2UoaW1nLCAwLCAwKTtcbiAqICAgdmFyIGQgPSBwaXhlbERlbnNpdHkoKTtcbiAqICAgdmFyIGhhbGZJbWFnZSA9IDQgKiAoaW1nLndpZHRoICogZCkgKiAoaW1nLmhlaWdodCAqIGQgLyAyKTtcbiAqICAgbG9hZFBpeGVscygpO1xuICogICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbGZJbWFnZTsgaSsrKSB7XG4gKiAgICAgcGl4ZWxzW2kgKyBoYWxmSW1hZ2VdID0gcGl4ZWxzW2ldO1xuICogICB9XG4gKiAgIHVwZGF0ZVBpeGVscygpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiBAYWx0XG4gKiB0d28gaW1hZ2VzIG9mIHRoZSByb2NreSBtb3VudGFpbnMuIG9uZSBvbiB0b3AsIG9uZSBvbiBib3R0b20gb2YgY2FudmFzLlxuICovXG5wNS5wcm90b3R5cGUudXBkYXRlUGl4ZWxzID0gZnVuY3Rpb24oeCwgeSwgdywgaCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCd1cGRhdGVQaXhlbHMnLCBhcmd1bWVudHMpO1xuICAvLyBncmFjZWZ1bCBmYWlsIC0gaWYgbG9hZFBpeGVscygpIG9yIHNldCgpIGhhcyBub3QgYmVlbiBjYWxsZWQsIHBpeGVsXG4gIC8vIGFycmF5IHdpbGwgYmUgZW1wdHksIGlnbm9yZSBjYWxsIHRvIHVwZGF0ZVBpeGVscygpXG4gIGlmICh0aGlzLnBpeGVscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fcmVuZGVyZXIudXBkYXRlUGl4ZWxzKHgsIHksIHcsIGgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNTtcblxufSx7XCIuLi9jb2xvci9wNS5Db2xvclwiOjE2LFwiLi4vY29yZS9jb3JlXCI6MjIsXCIuL2ZpbHRlcnNcIjo0MX1dLDQ2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBJT1xuICogQHN1Ym1vZHVsZSBJbnB1dFxuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqL1xuXG4vKiBnbG9iYWxzIFJlcXVlc3Q6IGZhbHNlICovXG4vKiBnbG9iYWxzIEhlYWRlcnM6IGZhbHNlICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5fZGVyZXFfKCd3aGF0d2ctZmV0Y2gnKTtcbl9kZXJlcV8oJ2VzNi1wcm9taXNlJykucG9seWZpbGwoKTtcbnZhciBmZXRjaEpzb25wID0gX2RlcmVxXygnZmV0Y2gtanNvbnAnKTtcbl9kZXJlcV8oJy4uL2NvcmUvZXJyb3JfaGVscGVycycpO1xuXG4vKipcbiAqIExvYWRzIGEgSlNPTiBmaWxlIGZyb20gYSBmaWxlIG9yIGEgVVJMLCBhbmQgcmV0dXJucyBhbiBPYmplY3QuXG4gKiBOb3RlIHRoYXQgZXZlbiBpZiB0aGUgSlNPTiBmaWxlIGNvbnRhaW5zIGFuIEFycmF5LCBhbiBPYmplY3Qgd2lsbCBiZVxuICogcmV0dXJuZWQgd2l0aCBpbmRleCBudW1iZXJzIGFzIGtleXMuXG4gKlxuICogVGhpcyBtZXRob2QgaXMgYXN5bmNocm9ub3VzLCBtZWFuaW5nIGl0IG1heSBub3QgZmluaXNoIGJlZm9yZSB0aGUgbmV4dFxuICogbGluZSBpbiB5b3VyIHNrZXRjaCBpcyBleGVjdXRlZC4gSlNPTlAgaXMgc3VwcG9ydGVkIHZpYSBhIHBvbHlmaWxsIGFuZCB5b3VcbiAqIGNhbiBwYXNzIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgYW4gb2JqZWN0IHdpdGggZGVmaW5pdGlvbnMgb2YgdGhlIGpzb25cbiAqIGNhbGxiYWNrIGZvbGxvd2luZyB0aGUgc3ludGF4IHNwZWNpZmllZCA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2NhbXNvbmcvXG4gKiBmZXRjaC1qc29ucFwiPmhlcmU8L2E+LlxuICpcbiAqIEBtZXRob2QgbG9hZEpTT05cbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIHBhdGggICAgICAgbmFtZSBvZiB0aGUgZmlsZSBvciB1cmwgdG8gbG9hZFxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgW2pzb25wT3B0aW9uc10gb3B0aW9ucyBvYmplY3QgZm9yIGpzb25wIHJlbGF0ZWQgc2V0dGluZ3NcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIFtkYXRhdHlwZV0gXCJqc29uXCIgb3IgXCJqc29ucFwiXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gICAgICBbY2FsbGJhY2tdIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRKU09OKCkgY29tcGxldGVzLCBkYXRhIGlzIHBhc3NlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhcyBmaXJzdCBhcmd1bWVudFxuICogQHBhcmFtICB7ZnVuY3Rpb259ICAgICAgW2Vycm9yQ2FsbGJhY2tdIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGlmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGFuIGVycm9yLCByZXNwb25zZSBpcyBwYXNzZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXMgZmlyc3QgYXJndW1lbnRcbiAqIEByZXR1cm4ge09iamVjdHxBcnJheX0gICAgICAgICAgICAgSlNPTiBkYXRhXG4gKiBAZXhhbXBsZVxuICpcbiAqIDxwPkNhbGxpbmcgbG9hZEpTT04oKSBpbnNpZGUgcHJlbG9hZCgpIGd1YXJhbnRlZXMgdG8gY29tcGxldGUgdGhlXG4gKiBvcGVyYXRpb24gYmVmb3JlIHNldHVwKCkgYW5kIGRyYXcoKSBhcmUgY2FsbGVkLjwvcD5cbiAqXG4gKiA8ZGl2Pjxjb2RlPlxuICogLy8gRXhhbXBsZXMgdXNlIFVTR1MgRWFydGhxdWFrZSBBUEk6XG4gKiAvLyAgIGh0dHBzOi8vZWFydGhxdWFrZS51c2dzLmdvdi9mZHNud3MvZXZlbnQvMS8jbWV0aG9kc1xuICogdmFyIGVhcnRocXVha2VzO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy8gR2V0IHRoZSBtb3N0IHJlY2VudCBlYXJ0aHF1YWtlIGluIHRoZSBkYXRhYmFzZVxuICogICB2YXIgdXJsID1cbiAgICAnaHR0cHM6Ly9lYXJ0aHF1YWtlLnVzZ3MuZ292L2VhcnRocXVha2VzL2ZlZWQvdjEuMC8nICtcbiAqICAgICAnc3VtbWFyeS9hbGxfZGF5Lmdlb2pzb24nO1xuICogICBlYXJ0aHF1YWtlcyA9IGxvYWRKU09OKHVybCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIG5vTG9vcCgpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgLy8gR2V0IHRoZSBtYWduaXR1ZGUgYW5kIG5hbWUgb2YgdGhlIGVhcnRocXVha2Ugb3V0IG9mIHRoZSBsb2FkZWQgSlNPTlxuICogICB2YXIgZWFydGhxdWFrZU1hZyA9IGVhcnRocXVha2VzLmZlYXR1cmVzWzBdLnByb3BlcnRpZXMubWFnO1xuICogICB2YXIgZWFydGhxdWFrZU5hbWUgPSBlYXJ0aHF1YWtlcy5mZWF0dXJlc1swXS5wcm9wZXJ0aWVzLnBsYWNlO1xuICogICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZWFydGhxdWFrZU1hZyAqIDEwLCBlYXJ0aHF1YWtlTWFnICogMTApO1xuICogICB0ZXh0QWxpZ24oQ0VOVEVSKTtcbiAqICAgdGV4dChlYXJ0aHF1YWtlTmFtZSwgMCwgaGVpZ2h0IC0gMzAsIHdpZHRoLCAzMCk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICpcbiAqIDxwPk91dHNpZGUgb2YgcHJlbG9hZCgpLCB5b3UgbWF5IHN1cHBseSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGVcbiAqIG9iamVjdDo8L3A+XG4gKiA8ZGl2Pjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIG5vTG9vcCgpO1xuICogICB2YXIgdXJsID1cbiAgICAnaHR0cHM6Ly9lYXJ0aHF1YWtlLnVzZ3MuZ292L2VhcnRocXVha2VzL2ZlZWQvdjEuMC8nICtcbiAqICAgICAnc3VtbWFyeS9hbGxfZGF5Lmdlb2pzb24nO1xuICogICBsb2FkSlNPTih1cmwsIGRyYXdFYXJ0aHF1YWtlKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhd0VhcnRocXVha2UoZWFydGhxdWFrZXMpIHtcbiAqICAgLy8gR2V0IHRoZSBtYWduaXR1ZGUgYW5kIG5hbWUgb2YgdGhlIGVhcnRocXVha2Ugb3V0IG9mIHRoZSBsb2FkZWQgSlNPTlxuICogICB2YXIgZWFydGhxdWFrZU1hZyA9IGVhcnRocXVha2VzLmZlYXR1cmVzWzBdLnByb3BlcnRpZXMubWFnO1xuICogICB2YXIgZWFydGhxdWFrZU5hbWUgPSBlYXJ0aHF1YWtlcy5mZWF0dXJlc1swXS5wcm9wZXJ0aWVzLnBsYWNlO1xuICogICBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZWFydGhxdWFrZU1hZyAqIDEwLCBlYXJ0aHF1YWtlTWFnICogMTApO1xuICogICB0ZXh0QWxpZ24oQ0VOVEVSKTtcbiAqICAgdGV4dChlYXJ0aHF1YWtlTmFtZSwgMCwgaGVpZ2h0IC0gMzAsIHdpZHRoLCAzMCk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogNTB4NTAgZWxsaXBzZSB0aGF0IGNoYW5nZXMgZnJvbSBibGFjayB0byB3aGl0ZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgaHVtaWRpdHlcbiAqIDUweDUwIGVsbGlwc2UgdGhhdCBjaGFuZ2VzIGZyb20gYmxhY2sgdG8gd2hpdGUgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGh1bWlkaXR5XG4gKlxuICovXG4vKipcbiAqIEBtZXRob2QgbG9hZEpTT05cbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIHBhdGhcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIGRhdGF0eXBlXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gICAgICBbY2FsbGJhY2tdXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gICAgICBbZXJyb3JDYWxsYmFja11cbiAqIEByZXR1cm4ge09iamVjdHxBcnJheX1cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGxvYWRKU09OXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICBwYXRoXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gICAgICBjYWxsYmFja1xuICogQHBhcmFtICB7ZnVuY3Rpb259ICAgICAgW2Vycm9yQ2FsbGJhY2tdXG4gKiBAcmV0dXJuIHtPYmplY3R8QXJyYXl9XG4gKi9cbnA1LnByb3RvdHlwZS5sb2FkSlNPTiA9IGZ1bmN0aW9uKCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdsb2FkSlNPTicsIGFyZ3VtZW50cyk7XG4gIHZhciBwYXRoID0gYXJndW1lbnRzWzBdO1xuICB2YXIgY2FsbGJhY2s7XG4gIHZhciBlcnJvckNhbGxiYWNrO1xuICB2YXIgb3B0aW9ucztcblxuICB2YXIgcmV0ID0ge307IC8vIG9iamVjdCBuZWVkZWQgZm9yIHByZWxvYWRcbiAgdmFyIHQgPSAnanNvbic7XG5cbiAgLy8gY2hlY2sgZm9yIGV4cGxpY2l0IGRhdGEgdHlwZSBhcmd1bWVudFxuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoYXJnID09PSAnanNvbnAnIHx8IGFyZyA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHQgPSBhcmc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrID0gYXJnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JDYWxsYmFjayA9IGFyZztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZy5oYXNPd25Qcm9wZXJ0eSgnanNvbnBDYWxsYmFjaycpKSB7XG4gICAgICB0ID0gJ2pzb25wJztcbiAgICAgIG9wdGlvbnMgPSBhcmc7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmh0dHBEbyhcbiAgICBwYXRoLFxuICAgICdHRVQnLFxuICAgIG9wdGlvbnMsXG4gICAgdCxcbiAgICBmdW5jdGlvbihyZXNwKSB7XG4gICAgICBmb3IgKHZhciBrIGluIHJlc3ApIHtcbiAgICAgICAgcmV0W2tdID0gcmVzcFtrXTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNhbGxiYWNrKHJlc3ApO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9kZWNyZW1lbnRQcmVsb2FkKCk7XG4gICAgfSxcbiAgICBlcnJvckNhbGxiYWNrXG4gICk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8qKlxuICogUmVhZHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBhbmQgY3JlYXRlcyBhIFN0cmluZyBhcnJheSBvZiBpdHMgaW5kaXZpZHVhbFxuICogbGluZXMuIElmIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlzIHVzZWQgYXMgdGhlIHBhcmFtZXRlciwgYXMgaW4gdGhlIGFib3ZlXG4gKiBleGFtcGxlLCB0aGUgZmlsZSBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIHNrZXRjaCBkaXJlY3RvcnkvZm9sZGVyLlxuICogPGJyPjxicj5cbiAqIEFsdGVybmF0aXZlbHksIHRoZSBmaWxlIG1heWJlIGJlIGxvYWRlZCBmcm9tIGFueXdoZXJlIG9uIHRoZSBsb2NhbFxuICogY29tcHV0ZXIgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aCAoc29tZXRoaW5nIHRoYXQgc3RhcnRzIHdpdGggLyBvbiBVbml4IGFuZFxuICogTGludXgsIG9yIGEgZHJpdmUgbGV0dGVyIG9uIFdpbmRvd3MpLCBvciB0aGUgZmlsZW5hbWUgcGFyYW1ldGVyIGNhbiBiZSBhXG4gKiBVUkwgZm9yIGEgZmlsZSBmb3VuZCBvbiBhIG5ldHdvcmsuXG4gKiA8YnI+PGJyPlxuICogVGhpcyBtZXRob2QgaXMgYXN5bmNocm9ub3VzLCBtZWFuaW5nIGl0IG1heSBub3QgZmluaXNoIGJlZm9yZSB0aGUgbmV4dFxuICogbGluZSBpbiB5b3VyIHNrZXRjaCBpcyBleGVjdXRlZC5cbiAqXG4gKiBAbWV0aG9kIGxvYWRTdHJpbmdzXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgZmlsZW5hbWUgICBuYW1lIG9mIHRoZSBmaWxlIG9yIHVybCB0byBsb2FkXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciBsb2FkU3RyaW5ncygpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZXMsIEFycmF5IGlzIHBhc3NlZCBpbiBhcyBmaXJzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBbZXJyb3JDYWxsYmFja10gZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaWZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGFuIGVycm9yLCByZXNwb25zZSBpcyBwYXNzZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFzIGZpcnN0IGFyZ3VtZW50XG4gKiBAcmV0dXJuIHtTdHJpbmdbXX0gICAgICAgICAgICBBcnJheSBvZiBTdHJpbmdzXG4gKiBAZXhhbXBsZVxuICpcbiAqIDxwPkNhbGxpbmcgbG9hZFN0cmluZ3MoKSBpbnNpZGUgcHJlbG9hZCgpIGd1YXJhbnRlZXMgdG8gY29tcGxldGUgdGhlXG4gKiBvcGVyYXRpb24gYmVmb3JlIHNldHVwKCkgYW5kIGRyYXcoKSBhcmUgY2FsbGVkLjwvcD5cbiAqXG4gKiA8ZGl2Pjxjb2RlPlxuICogdmFyIHJlc3VsdDtcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHJlc3VsdCA9IGxvYWRTdHJpbmdzKCdhc3NldHMvdGVzdC50eHQnKTtcbiAqIH1cblxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgdmFyIGluZCA9IGZsb29yKHJhbmRvbShyZXN1bHQubGVuZ3RoKSk7XG4gKiAgIHRleHQocmVzdWx0W2luZF0sIDEwLCAxMCwgODAsIDgwKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiA8cD5PdXRzaWRlIG9mIHByZWxvYWQoKSwgeW91IG1heSBzdXBwbHkgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlXG4gKiBvYmplY3Q6PC9wPlxuICpcbiAqIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgbG9hZFN0cmluZ3MoJ2Fzc2V0cy90ZXN0LnR4dCcsIHBpY2tTdHJpbmcpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHBpY2tTdHJpbmcocmVzdWx0KSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgdmFyIGluZCA9IGZsb29yKHJhbmRvbShyZXN1bHQubGVuZ3RoKSk7XG4gKiAgIHRleHQocmVzdWx0W2luZF0sIDEwLCAxMCwgODAsIDgwKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiByYW5kb21seSBnZW5lcmF0ZWQgdGV4dCBmcm9tIGEgZmlsZSwgZm9yIGV4YW1wbGUgXCJpIHNtZWxsIGxpa2UgYnV0dGVyXCJcbiAqIHJhbmRvbWx5IGdlbmVyYXRlZCB0ZXh0IGZyb20gYSBmaWxlLCBmb3IgZXhhbXBsZSBcImkgaGF2ZSB0aHJlZSBmZWV0XCJcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5sb2FkU3RyaW5ncyA9IGZ1bmN0aW9uKCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdsb2FkU3RyaW5ncycsIGFyZ3VtZW50cyk7XG5cbiAgdmFyIHJldCA9IFtdO1xuICB2YXIgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s7XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuICAgIGlmICh0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjYWxsYmFjayA9IGFyZztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yQ2FsbGJhY2sgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGVycm9yQ2FsbGJhY2sgPSBhcmc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBwNS5wcm90b3R5cGUuaHR0cERvLmNhbGwoXG4gICAgdGhpcyxcbiAgICBhcmd1bWVudHNbMF0sXG4gICAgJ0dFVCcsXG4gICAgJ3RleHQnLFxuICAgIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHZhciBhcnIgPSBkYXRhLm1hdGNoKC9bXlxcclxcbl0rL2cpO1xuICAgICAgZm9yICh2YXIgayBpbiBhcnIpIHtcbiAgICAgICAgcmV0W2tdID0gYXJyW2tdO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjYWxsYmFjayhyZXQpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9kZWNyZW1lbnRQcmVsb2FkKCk7XG4gICAgfSxcbiAgICBlcnJvckNhbGxiYWNrXG4gICk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8qKlxuICogPHA+UmVhZHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBvciBVUkwgYW5kIGNyZWF0ZXMgYSBwNS5UYWJsZSBvYmplY3Qgd2l0aFxuICogaXRzIHZhbHVlcy4gSWYgYSBmaWxlIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBsb2NhdGVkIGluIHRoZSBza2V0Y2gnc1xuICogXCJkYXRhXCIgZm9sZGVyLiBUaGUgZmlsZW5hbWUgcGFyYW1ldGVyIGNhbiBhbHNvIGJlIGEgVVJMIHRvIGEgZmlsZSBmb3VuZFxuICogb25saW5lLiBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpcyBhc3N1bWVkIHRvIGJlIGNvbW1hLXNlcGFyYXRlZCAoaW4gQ1NWXG4gKiBmb3JtYXQpLiBUYWJsZSBvbmx5IGxvb2tzIGZvciBhIGhlYWRlciByb3cgaWYgdGhlICdoZWFkZXInIG9wdGlvbiBpc1xuICogaW5jbHVkZWQuPC9wPlxuICpcbiAqIDxwPlBvc3NpYmxlIG9wdGlvbnMgaW5jbHVkZTpcbiAqIDx1bD5cbiAqIDxsaT5jc3YgLSBwYXJzZSB0aGUgdGFibGUgYXMgY29tbWEtc2VwYXJhdGVkIHZhbHVlczwvbGk+XG4gKiA8bGk+dHN2IC0gcGFyc2UgdGhlIHRhYmxlIGFzIHRhYi1zZXBhcmF0ZWQgdmFsdWVzPC9saT5cbiAqIDxsaT5oZWFkZXIgLSB0aGlzIHRhYmxlIGhhcyBhIGhlYWRlciAodGl0bGUpIHJvdzwvbGk+XG4gKiA8L3VsPlxuICogPC9wPlxuICpcbiAqIDxwPldoZW4gcGFzc2luZyBpbiBtdWx0aXBsZSBvcHRpb25zLCBwYXNzIHRoZW0gaW4gYXMgc2VwYXJhdGUgcGFyYW1ldGVycyxcbiAqIHNlcGVyYXRlZCBieSBjb21tYXMuIEZvciBleGFtcGxlOlxuICogPGJyPjxicj5cbiAqIDxjb2RlPlxuICogbG9hZFRhYmxlKCdteV9jc3ZfZmlsZS5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xuICogPC9jb2RlPlxuICogPC9wPlxuICpcbiAqIDxwPiBBbGwgZmlsZXMgbG9hZGVkIGFuZCBzYXZlZCB1c2UgVVRGLTggZW5jb2RpbmcuPC9wPlxuICpcbiAqIDxwPlRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cywgbWVhbmluZyBpdCBtYXkgbm90IGZpbmlzaCBiZWZvcmUgdGhlIG5leHRcbiAqIGxpbmUgaW4geW91ciBza2V0Y2ggaXMgZXhlY3V0ZWQuIENhbGxpbmcgbG9hZFRhYmxlKCkgaW5zaWRlIHByZWxvYWQoKVxuICogZ3VhcmFudGVlcyB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uIGJlZm9yZSBzZXR1cCgpIGFuZCBkcmF3KCkgYXJlIGNhbGxlZC5cbiAqIDxwPk91dHNpZGUgb2YgcHJlbG9hZCgpLCB5b3UgbWF5IHN1cHBseSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGVcbiAqIG9iamVjdDo8L3A+XG4gKiA8L3A+XG4gKlxuICogQG1ldGhvZCBsb2FkVGFibGVcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICBmaWxlbmFtZSAgIG5hbWUgb2YgdGhlIGZpbGUgb3IgVVJMIHRvIGxvYWRcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICBvcHRpb25zICBcImhlYWRlclwiIFwiY3N2XCIgXCJ0c3ZcIlxuICogQHBhcmFtICB7ZnVuY3Rpb259ICAgICAgIFtjYWxsYmFja10gZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRUYWJsZSgpIGNvbXBsZXRlcy4gT24gc3VjY2VzcywgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBvYmplY3QgaXMgcGFzc2VkIGluIGFzIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgYXJndW1lbnQuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gIFtlcnJvckNhbGxiYWNrXSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IsIHJlc3BvbnNlIGlzIHBhc3NlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXMgZmlyc3QgYXJndW1lbnRcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgIFRhYmxlIG9iamVjdCBjb250YWluaW5nIGRhdGFcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIC8vIEdpdmVuIHRoZSBmb2xsb3dpbmcgQ1NWIGZpbGUgY2FsbGVkIFwibWFtbWFscy5jc3ZcIlxuICogLy8gbG9jYXRlZCBpbiB0aGUgcHJvamVjdCdzIFwiYXNzZXRzXCIgZm9sZGVyOlxuICogLy9cbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxDYXByYSBoaXJjdXMsR29hdFxuICogLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxuICogLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxuICpcbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcImNzdlwiXG4gKiAgIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xuICogICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcbiAqICAgLy90aGUgZmlsZSBjYW4gYmUgcmVtb3RlXG4gKiAgIC8vdGFibGUgPSBsb2FkVGFibGUoXCJodHRwOi8vcDVqcy5vcmcvcmVmZXJlbmNlL2Fzc2V0cy9tYW1tYWxzLmNzdlwiLFxuICogICAvLyAgICAgICAgICAgICAgICAgIFwiY3N2XCIsIFwiaGVhZGVyXCIpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICAvL2NvdW50IHRoZSBjb2x1bW5zXG4gKiAgIHByaW50KHRhYmxlLmdldFJvd0NvdW50KCkgKyAnIHRvdGFsIHJvd3MgaW4gdGFibGUnKTtcbiAqICAgcHJpbnQodGFibGUuZ2V0Q29sdW1uQ291bnQoKSArICcgdG90YWwgY29sdW1ucyBpbiB0YWJsZScpO1xuICpcbiAqICAgcHJpbnQodGFibGUuZ2V0Q29sdW1uKCduYW1lJykpO1xuICogICAvL1tcIkdvYXRcIiwgXCJMZW9wYXJkXCIsIFwiWmVicmFcIl1cbiAqXG4gKiAgIC8vY3ljbGUgdGhyb3VnaCB0aGUgdGFibGVcbiAqICAgZm9yICh2YXIgciA9IDA7IHIgPCB0YWJsZS5nZXRSb3dDb3VudCgpOyByKyspXG4gKiAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOyBjKyspIHtcbiAqICAgICAgIHByaW50KHRhYmxlLmdldFN0cmluZyhyLCBjKSk7XG4gKiAgICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogcmFuZG9tbHkgZ2VuZXJhdGVkIHRleHQgZnJvbSBhIGZpbGUsIGZvciBleGFtcGxlIFwiaSBzbWVsbCBsaWtlIGJ1dHRlclwiXG4gKiByYW5kb21seSBnZW5lcmF0ZWQgdGV4dCBmcm9tIGEgZmlsZSwgZm9yIGV4YW1wbGUgXCJpIGhhdmUgdGhyZWUgZmVldFwiXG4gKlxuICovXG4vKipcbiAqIEBtZXRob2QgbG9hZFRhYmxlXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgZmlsZW5hbWVcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgICAgICBbY2FsbGJhY2tdXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gIFtlcnJvckNhbGxiYWNrXVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5wNS5wcm90b3R5cGUubG9hZFRhYmxlID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgY2FsbGJhY2s7XG4gIHZhciBlcnJvckNhbGxiYWNrO1xuICB2YXIgb3B0aW9ucyA9IFtdO1xuICB2YXIgaGVhZGVyID0gZmFsc2U7XG4gIHZhciBleHQgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKCcuJykgKyAxLCBwYXRoLmxlbmd0aCk7XG4gIHZhciBzZXAgPSAnLCc7XG4gIHZhciBzZXBhcmF0b3JTZXQgPSBmYWxzZTtcblxuICBpZiAoZXh0ID09PSAndHN2Jykge1xuICAgIC8vT25seSBuZWVkIHRvIGNoZWNrIGV4dGVuc2lvbiBpcyB0c3YgYmVjYXVzZSBjc3YgaXMgZGVmYXVsdFxuICAgIHNlcCA9ICdcXHQnO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBhcmd1bWVudHNbaV07XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvckNhbGxiYWNrID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBlcnJvckNhbGxiYWNrID0gYXJndW1lbnRzW2ldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdGlvbnMucHVzaChhcmd1bWVudHNbaV0pO1xuICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgaGVhZGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmd1bWVudHNbaV0gPT09ICdjc3YnKSB7XG4gICAgICAgIGlmIChzZXBhcmF0b3JTZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzZXQgbXVsdGlwbGUgc2VwYXJhdG9yIHR5cGVzLicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlcCA9ICcsJztcbiAgICAgICAgICBzZXBhcmF0b3JTZXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50c1tpXSA9PT0gJ3RzdicpIHtcbiAgICAgICAgaWYgKHNlcGFyYXRvclNldCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCBtdWx0aXBsZSBzZXBhcmF0b3IgdHlwZXMuJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VwID0gJ1xcdCc7XG4gICAgICAgICAgc2VwYXJhdG9yU2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciB0ID0gbmV3IHA1LlRhYmxlKCk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmh0dHBEbyhcbiAgICBwYXRoLFxuICAgICdHRVQnLFxuICAgICd0ZXh0JyxcbiAgICBmdW5jdGlvbihyZXNwKSB7XG4gICAgICB2YXIgc3RhdGUgPSB7fTtcblxuICAgICAgLy8gZGVmaW5lIGNvbnN0YW50c1xuICAgICAgdmFyIFBSRV9UT0tFTiA9IDAsXG4gICAgICAgIE1JRF9UT0tFTiA9IDEsXG4gICAgICAgIFBPU1RfVE9LRU4gPSAyLFxuICAgICAgICBQT1NUX1JFQ09SRCA9IDQ7XG5cbiAgICAgIHZhciBRVU9URSA9ICdcIicsXG4gICAgICAgIENSID0gJ1xccicsXG4gICAgICAgIExGID0gJ1xcbic7XG5cbiAgICAgIHZhciByZWNvcmRzID0gW107XG4gICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgIHZhciBjdXJyZW50UmVjb3JkID0gbnVsbDtcbiAgICAgIHZhciBjdXJyZW50Q2hhcjtcblxuICAgICAgdmFyIHRva2VuQmVnaW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgc3RhdGUuY3VycmVudFN0YXRlID0gUFJFX1RPS0VOO1xuICAgICAgICBzdGF0ZS50b2tlbiA9ICcnO1xuICAgICAgfTtcblxuICAgICAgdmFyIHRva2VuRW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGN1cnJlbnRSZWNvcmQucHVzaChzdGF0ZS50b2tlbik7XG4gICAgICAgIHRva2VuQmVnaW4oKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciByZWNvcmRCZWdpbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdGF0ZS5lc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIGN1cnJlbnRSZWNvcmQgPSBbXTtcbiAgICAgICAgdG9rZW5CZWdpbigpO1xuICAgICAgfTtcblxuICAgICAgdmFyIHJlY29yZEVuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdGF0ZS5jdXJyZW50U3RhdGUgPSBQT1NUX1JFQ09SRDtcbiAgICAgICAgcmVjb3Jkcy5wdXNoKGN1cnJlbnRSZWNvcmQpO1xuICAgICAgICBjdXJyZW50UmVjb3JkID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgY3VycmVudENoYXIgPSByZXNwW29mZnNldCsrXTtcblxuICAgICAgICAvLyBFT0ZcbiAgICAgICAgaWYgKGN1cnJlbnRDaGFyID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZXNjYXBlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmNsb3NlZCBxdW90ZSBpbiBmaWxlLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudFJlY29yZCkge1xuICAgICAgICAgICAgdG9rZW5FbmQoKTtcbiAgICAgICAgICAgIHJlY29yZEVuZCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50UmVjb3JkID09PSBudWxsKSB7XG4gICAgICAgICAgcmVjb3JkQmVnaW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBvcGVuaW5nIHF1b3RlXG4gICAgICAgIGlmIChzdGF0ZS5jdXJyZW50U3RhdGUgPT09IFBSRV9UT0tFTikge1xuICAgICAgICAgIGlmIChjdXJyZW50Q2hhciA9PT0gUVVPVEUpIHtcbiAgICAgICAgICAgIHN0YXRlLmVzY2FwZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3RhdGUuY3VycmVudFN0YXRlID0gTUlEX1RPS0VOO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLmN1cnJlbnRTdGF0ZSA9IE1JRF9UT0tFTjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1pZC10b2tlbiBhbmQgZXNjYXBlZCwgbG9vayBmb3Igc2VxdWVuY2VzIGFuZCBlbmQgcXVvdGVcbiAgICAgICAgaWYgKHN0YXRlLmN1cnJlbnRTdGF0ZSA9PT0gTUlEX1RPS0VOICYmIHN0YXRlLmVzY2FwZWQpIHtcbiAgICAgICAgICBpZiAoY3VycmVudENoYXIgPT09IFFVT1RFKSB7XG4gICAgICAgICAgICBpZiAocmVzcFtvZmZzZXRdID09PSBRVU9URSkge1xuICAgICAgICAgICAgICBzdGF0ZS50b2tlbiArPSBRVU9URTtcbiAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0ZS5lc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRTdGF0ZSA9IFBPU1RfVE9LRU47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q2hhciA9PT0gQ1IpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZS50b2tlbiArPSBjdXJyZW50Q2hhcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmYWxsLXRocm91Z2g6IG1pZC10b2tlbiBvciBwb3N0LXRva2VuLCBub3QgZXNjYXBlZFxuICAgICAgICBpZiAoY3VycmVudENoYXIgPT09IENSKSB7XG4gICAgICAgICAgaWYgKHJlc3Bbb2Zmc2V0XSA9PT0gTEYpIHtcbiAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b2tlbkVuZCgpO1xuICAgICAgICAgIHJlY29yZEVuZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDaGFyID09PSBMRikge1xuICAgICAgICAgIHRva2VuRW5kKCk7XG4gICAgICAgICAgcmVjb3JkRW5kKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENoYXIgPT09IHNlcCkge1xuICAgICAgICAgIHRva2VuRW5kKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuY3VycmVudFN0YXRlID09PSBNSURfVE9LRU4pIHtcbiAgICAgICAgICBzdGF0ZS50b2tlbiArPSBjdXJyZW50Q2hhcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdXAgY29sdW1uIG5hbWVzXG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIHQuY29sdW1ucyA9IHJlY29yZHMuc2hpZnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByZWNvcmRzWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdC5jb2x1bW5zW2ldID0gJ251bGwnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgcm93O1xuICAgICAgZm9yIChpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy9IYW5kbGVzIHJvdyBvZiAndW5kZWZpbmVkJyBhdCBlbmQgb2Ygc29tZSBDU1ZzXG4gICAgICAgIGlmIChyZWNvcmRzW2ldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGlmIChyZWNvcmRzW2ldWzBdID09PSAndW5kZWZpbmVkJyB8fCByZWNvcmRzW2ldWzBdID09PSAnJykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJvdyA9IG5ldyBwNS5UYWJsZVJvdygpO1xuICAgICAgICByb3cuYXJyID0gcmVjb3Jkc1tpXTtcbiAgICAgICAgcm93Lm9iaiA9IG1ha2VPYmplY3QocmVjb3Jkc1tpXSwgdC5jb2x1bW5zKTtcbiAgICAgICAgdC5hZGRSb3cocm93KTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2sodCk7XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX2RlY3JlbWVudFByZWxvYWQoKTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uKGVycikge1xuICAgICAgLy8gRXJyb3IgaGFuZGxpbmdcbiAgICAgIHA1Ll9mcmllbmRseUZpbGVMb2FkRXJyb3IoMiwgcGF0aCk7XG5cbiAgICAgIGlmIChlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gICk7XG5cbiAgcmV0dXJuIHQ7XG59O1xuXG4vLyBoZWxwZXIgZnVuY3Rpb24gdG8gdHVybiBhIHJvdyBpbnRvIGEgSlNPTiBvYmplY3RcbmZ1bmN0aW9uIG1ha2VPYmplY3Qocm93LCBoZWFkZXJzKSB7XG4gIHZhciByZXQgPSB7fTtcbiAgaGVhZGVycyA9IGhlYWRlcnMgfHwgW107XG4gIGlmICh0eXBlb2YgaGVhZGVycyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJvdy5sZW5ndGg7IGorKykge1xuICAgICAgaGVhZGVyc1tqLnRvU3RyaW5nKCldID0gajtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGhlYWRlcnNbaV07XG4gICAgdmFyIHZhbCA9IHJvd1tpXTtcbiAgICByZXRba2V5XSA9IHZhbDtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBwYXJzZVhNTCh0d28pIHtcbiAgdmFyIG9uZSA9IG5ldyBwNS5YTUwoKTtcbiAgdmFyIGNoaWxkcmVuID0gdHdvLmNoaWxkTm9kZXM7XG4gIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IHBhcnNlWE1MKGNoaWxkcmVuW2ldKTtcbiAgICAgIG9uZS5hZGRDaGlsZChub2RlKTtcbiAgICB9XG4gICAgb25lLnNldE5hbWUodHdvLm5vZGVOYW1lKTtcbiAgICBvbmUuX3NldENvbnQodHdvLnRleHRDb250ZW50KTtcbiAgICBvbmUuX3NldEF0dHJpYnV0ZXModHdvKTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9uZS5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgb25lLmNoaWxkcmVuW2pdLnBhcmVudCA9IG9uZTtcbiAgICB9XG4gICAgcmV0dXJuIG9uZTtcbiAgfSBlbHNlIHtcbiAgICBvbmUuc2V0TmFtZSh0d28ubm9kZU5hbWUpO1xuICAgIG9uZS5fc2V0Q29udCh0d28udGV4dENvbnRlbnQpO1xuICAgIG9uZS5fc2V0QXR0cmlidXRlcyh0d28pO1xuICAgIHJldHVybiBvbmU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgY29udGVudHMgb2YgYSBmaWxlIGFuZCBjcmVhdGVzIGFuIFhNTCBvYmplY3Qgd2l0aCBpdHMgdmFsdWVzLlxuICogSWYgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaXMgdXNlZCBhcyB0aGUgcGFyYW1ldGVyLCBhcyBpbiB0aGUgYWJvdmUgZXhhbXBsZSxcbiAqIHRoZSBmaWxlIG11c3QgYmUgbG9jYXRlZCBpbiB0aGUgc2tldGNoIGRpcmVjdG9yeS9mb2xkZXIuXG4gKlxuICogQWx0ZXJuYXRpdmVseSwgdGhlIGZpbGUgbWF5YmUgYmUgbG9hZGVkIGZyb20gYW55d2hlcmUgb24gdGhlIGxvY2FsXG4gKiBjb21wdXRlciB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoIChzb21ldGhpbmcgdGhhdCBzdGFydHMgd2l0aCAvIG9uIFVuaXggYW5kXG4gKiBMaW51eCwgb3IgYSBkcml2ZSBsZXR0ZXIgb24gV2luZG93cyksIG9yIHRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIgY2FuIGJlIGFcbiAqIFVSTCBmb3IgYSBmaWxlIGZvdW5kIG9uIGEgbmV0d29yay5cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMsIG1lYW5pbmcgaXQgbWF5IG5vdCBmaW5pc2ggYmVmb3JlIHRoZSBuZXh0XG4gKiBsaW5lIGluIHlvdXIgc2tldGNoIGlzIGV4ZWN1dGVkLiBDYWxsaW5nIGxvYWRYTUwoKSBpbnNpZGUgcHJlbG9hZCgpXG4gKiBndWFyYW50ZWVzIHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24gYmVmb3JlIHNldHVwKCkgYW5kIGRyYXcoKSBhcmUgY2FsbGVkLlxuICpcbiAqIE91dHNpZGUgb2YgcHJlbG9hZCgpLCB5b3UgbWF5IHN1cHBseSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGVcbiAqIG9iamVjdC5cbiAqXG4gKiBAbWV0aG9kIGxvYWRYTUxcbiAqIEBwYXJhbSAge1N0cmluZ30gICBmaWxlbmFtZSAgIG5hbWUgb2YgdGhlIGZpbGUgb3IgVVJMIHRvIGxvYWRcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGxvYWRYTUwoKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVzLCBYTUwgb2JqZWN0IGlzIHBhc3NlZCBpbiBhc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgYXJndW1lbnRcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBbZXJyb3JDYWxsYmFja10gZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaWZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGFuIGVycm9yLCByZXNwb25zZSBpcyBwYXNzZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFzIGZpcnN0IGFyZ3VtZW50XG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICBYTUwgb2JqZWN0IGNvbnRhaW5pbmcgZGF0YVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFwibWFtbWFscy54bWxcIiBpcyBwYXJzZWRcbiAqIC8vIGluIHRoZSBjb2RlIGJlbG93LlxuICogLy9cbiAqIC8vIDw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4gKiAvLyAmbHQ7bWFtbWFscyZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjBcIiBzcGVjaWVzPVwiQ2FwcmEgaGlyY3VzXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMVwiIHNwZWNpZXM9XCJQYW50aGVyYSBwYXJkdXNcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIyXCIgc3BlY2llcz1cIkVxdXVzIHplYnJhXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICZsdDsvbWFtbWFscyZndDtcbiAqXG4gKiB2YXIgeG1sO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgY2hpbGRyZW4gPSB4bWwuZ2V0Q2hpbGRyZW4oJ2FuaW1hbCcpO1xuICpcbiAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICogICAgIHZhciBpZCA9IGNoaWxkcmVuW2ldLmdldE51bSgnaWQnKTtcbiAqICAgICB2YXIgY29sb3JpbmcgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoJ3NwZWNpZXMnKTtcbiAqICAgICB2YXIgbmFtZSA9IGNoaWxkcmVuW2ldLmdldENvbnRlbnQoKTtcbiAqICAgICBwcmludChpZCArICcsICcgKyBjb2xvcmluZyArICcsICcgKyBuYW1lKTtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIFNrZXRjaCBwcmludHM6XG4gKiAvLyAwLCBDYXByYSBoaXJjdXMsIEdvYXRcbiAqIC8vIDEsIFBhbnRoZXJhIHBhcmR1cywgTGVvcGFyZFxuICogLy8gMiwgRXF1dXMgemVicmEsIFplYnJhXG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUubG9hZFhNTCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmV0ID0ge307XG4gIHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNhbGxiYWNrID0gYXJnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFjayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZXJyb3JDYWxsYmFjayA9IGFyZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuaHR0cERvKFxuICAgIGFyZ3VtZW50c1swXSxcbiAgICAnR0VUJyxcbiAgICAneG1sJyxcbiAgICBmdW5jdGlvbih4bWwpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB4bWwpIHtcbiAgICAgICAgcmV0W2tleV0gPSB4bWxba2V5XTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNhbGxiYWNrKHJldCk7XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX2RlY3JlbWVudFByZWxvYWQoKTtcbiAgICB9LFxuICAgIGVycm9yQ2FsbGJhY2tcbiAgKTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGxvYWRCeXRlc1xuICogQHBhcmFtIHtzdHJpbmd9ICAgZmlsZSAgICAgICAgICAgIG5hbWUgb2YgdGhlIGZpbGUgb3IgVVJMIHRvIGxvYWRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gICAgICBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciBsb2FkQnl0ZXMoKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtlcnJvckNhbGxiYWNrXSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpZiB0aGVyZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlcnJvclxuICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IHdob3NlICdieXRlcycgcHJvcGVydHkgd2lsbCBiZSB0aGUgbG9hZGVkIGJ1ZmZlclxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiB2YXIgZGF0YTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBkYXRhID0gbG9hZEJ5dGVzKCdhc3NldHMvbWFtbWFscy54bWwnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAqICAgICBjb25zb2xlLmxvZyhkYXRhLmJ5dGVzW2ldLnRvU3RyaW5nKDE2KSk7XG4gKiAgIH1cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5sb2FkQnl0ZXMgPSBmdW5jdGlvbihmaWxlLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICB2YXIgcmV0ID0ge307XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmh0dHBEbyhcbiAgICBmaWxlLFxuICAgICdHRVQnLFxuICAgICdhcnJheUJ1ZmZlcicsXG4gICAgZnVuY3Rpb24oYXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldC5ieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcblxuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjayhyZXQpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9kZWNyZW1lbnRQcmVsb2FkKCk7XG4gICAgfSxcbiAgICBlcnJvckNhbGxiYWNrXG4gICk7XG4gIHJldHVybiByZXQ7XG59O1xuXG4vKipcbiAqIE1ldGhvZCBmb3IgZXhlY3V0aW5nIGFuIEhUVFAgR0VUIHJlcXVlc3QuIElmIGRhdGEgdHlwZSBpcyBub3Qgc3BlY2lmaWVkLFxuICogcDUgd2lsbCB0cnkgdG8gZ3Vlc3MgYmFzZWQgb24gdGhlIFVSTCwgZGVmYXVsdGluZyB0byB0ZXh0LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG9cbiAqIGNhbGxpbmcgPGNvZGU+aHR0cERvKHBhdGgsICdHRVQnKTwvY29kZT4uIFRoZSAnYmluYXJ5JyBkYXRhdHlwZSB3aWxsIHJldHVyblxuICogYSBCbG9iIG9iamVjdCwgYW5kIHRoZSAnYXJyYXlCdWZmZXInIGRhdGF0eXBlIHdpbGwgcmV0dXJuIGFuIEFycmF5QnVmZmVyXG4gKiB3aGljaCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIHR5cGVkIGFycmF5cyAoc3VjaCBhcyBVaW50OEFycmF5KS5cbiAqXG4gKiBAbWV0aG9kIGh0dHBHZXRcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIHBhdGggICAgICAgbmFtZSBvZiB0aGUgZmlsZSBvciB1cmwgdG8gbG9hZFxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgW2RhdGF0eXBlXSBcImpzb25cIiwgXCJqc29ucFwiLCBcImJpbmFyeVwiLCBcImFycmF5QnVmZmVyXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwieG1sXCIsIG9yIFwidGV4dFwiXG4gKiBAcGFyYW0gIHtPYmplY3R8Qm9vbGVhbn0gW2RhdGFdICAgIHBhcmFtIGRhdGEgcGFzc2VkIHNlbnQgd2l0aCByZXF1ZXN0XG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gICAgICBbY2FsbGJhY2tdIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBHZXQoKSBjb21wbGV0ZXMsIGRhdGEgaXMgcGFzc2VkIGluXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGZpcnN0IGFyZ3VtZW50XG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gICAgICBbZXJyb3JDYWxsYmFja10gZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaWZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IsIHJlc3BvbnNlIGlzIHBhc3NlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhcyBmaXJzdCBhcmd1bWVudFxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIEV4YW1wbGVzIHVzZSBVU0dTIEVhcnRocXVha2UgQVBJOlxuICogLy8gICBodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZmRzbndzL2V2ZW50LzEvI21ldGhvZHNcbiAqIHZhciBlYXJ0aHF1YWtlcztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIC8vIEdldCB0aGUgbW9zdCByZWNlbnQgZWFydGhxdWFrZSBpbiB0aGUgZGF0YWJhc2VcbiAqICAgdmFyIHVybCA9XG4gICAgJ2h0dHBzOi8vZWFydGhxdWFrZS51c2dzLmdvdi9mZHNud3MvZXZlbnQvMS9xdWVyeT8nICtcbiAqICAgICAnZm9ybWF0PWdlb2pzb24mbGltaXQ9MSZvcmRlcmJ5PXRpbWUnO1xuICogICBodHRwR2V0KHVybCwgJ2pzb25wJywgZmFsc2UsIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gKiAgICAgLy8gd2hlbiB0aGUgSFRUUCByZXF1ZXN0IGNvbXBsZXRlcywgcG9wdWxhdGUgdGhlIHZhcmlhYmxlIHRoYXQgaG9sZHMgdGhlXG4gKiAgICAgLy8gZWFydGhxdWFrZSBkYXRhIHVzZWQgaW4gdGhlIHZpc3VhbGl6YXRpb24uXG4gKiAgICAgZWFydGhxdWFrZXMgPSByZXNwb25zZTtcbiAqICAgfSk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgaWYgKCFlYXJ0aHF1YWtlcykge1xuICogICAgIC8vIFdhaXQgdW50aWwgdGhlIGVhcnRocXVha2UgZGF0YSBoYXMgbG9hZGVkIGJlZm9yZSBkcmF3aW5nLlxuICogICAgIHJldHVybjtcbiAqICAgfVxuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIC8vIEdldCB0aGUgbWFnbml0dWRlIGFuZCBuYW1lIG9mIHRoZSBlYXJ0aHF1YWtlIG91dCBvZiB0aGUgbG9hZGVkIEpTT05cbiAqICAgdmFyIGVhcnRocXVha2VNYWcgPSBlYXJ0aHF1YWtlcy5mZWF0dXJlc1swXS5wcm9wZXJ0aWVzLm1hZztcbiAqICAgdmFyIGVhcnRocXVha2VOYW1lID0gZWFydGhxdWFrZXMuZmVhdHVyZXNbMF0ucHJvcGVydGllcy5wbGFjZTtcbiAqICAgZWxsaXBzZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGVhcnRocXVha2VNYWcgKiAxMCwgZWFydGhxdWFrZU1hZyAqIDEwKTtcbiAqICAgdGV4dEFsaWduKENFTlRFUik7XG4gKiAgIHRleHQoZWFydGhxdWFrZU5hbWUsIDAsIGhlaWdodCAtIDMwLCB3aWR0aCwgMzApO1xuICogICBub0xvb3AoKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGh0dHBHZXRcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIHBhdGhcbiAqIEBwYXJhbSAge09iamVjdHxCb29sZWFufSBkYXRhXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gICAgICBbY2FsbGJhY2tdXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gICAgICBbZXJyb3JDYWxsYmFja11cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGh0dHBHZXRcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIHBhdGhcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgICAgIGNhbGxiYWNrXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gICAgICBbZXJyb3JDYWxsYmFja11cbiAqL1xucDUucHJvdG90eXBlLmh0dHBHZXQgPSBmdW5jdGlvbigpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnaHR0cEdldCcsIGFyZ3VtZW50cyk7XG5cbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICBhcmdzLnNwbGljZSgxLCAwLCAnR0VUJyk7XG4gIHA1LnByb3RvdHlwZS5odHRwRG8uYXBwbHkodGhpcywgYXJncyk7XG59O1xuXG4vKipcbiAqIE1ldGhvZCBmb3IgZXhlY3V0aW5nIGFuIEhUVFAgUE9TVCByZXF1ZXN0LiBJZiBkYXRhIHR5cGUgaXMgbm90IHNwZWNpZmllZCxcbiAqIHA1IHdpbGwgdHJ5IHRvIGd1ZXNzIGJhc2VkIG9uIHRoZSBVUkwsIGRlZmF1bHRpbmcgdG8gdGV4dC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gKiBjYWxsaW5nIDxjb2RlPmh0dHBEbyhwYXRoLCAnUE9TVCcpPC9jb2RlPi5cbiAqXG4gKiBAbWV0aG9kIGh0dHBQb3N0XG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICBwYXRoICAgICAgIG5hbWUgb2YgdGhlIGZpbGUgb3IgdXJsIHRvIGxvYWRcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIFtkYXRhdHlwZV0gXCJqc29uXCIsIFwianNvbnBcIiwgXCJ4bWxcIiwgb3IgXCJ0ZXh0XCIuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIGh0dHBQb3N0KCkgd2lsbCBndWVzcy5cbiAqIEBwYXJhbSAge09iamVjdHxCb29sZWFufSBbZGF0YV0gICAgcGFyYW0gZGF0YSBwYXNzZWQgc2VudCB3aXRoIHJlcXVlc3RcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgICAgIFtjYWxsYmFja10gZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFBvc3QoKSBjb21wbGV0ZXMsIGRhdGEgaXMgcGFzc2VkIGluXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGZpcnN0IGFyZ3VtZW50XG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gICAgICBbZXJyb3JDYWxsYmFja10gZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaWZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IsIHJlc3BvbnNlIGlzIHBhc3NlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhcyBmaXJzdCBhcmd1bWVudFxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBFeGFtcGxlcyB1c2UganNvbnBsYWNlaG9sZGVyLnR5cGljb2RlLmNvbSBmb3IgYSBNb2NrIERhdGEgQVBJXG4gKlxuICogdmFyIHVybCA9ICdodHRwczovL2pzb25wbGFjZWhvbGRlci50eXBpY29kZS5jb20vcG9zdHMnO1xuICogdmFyIHBvc3REYXRhID0geyB1c2VySWQ6IDEsIHRpdGxlOiAncDUgQ2xpY2tlZCEnLCBib2R5OiAncDUuanMgaXMgd2F5IGNvb2wuJyB9O1xuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoODAwLCA4MDApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIG1vdXNlUHJlc3NlZCgpIHtcbiAqICAgLy8gUGljayBuZXcgcmFuZG9tIGNvbG9yIHZhbHVlc1xuICogICB2YXIgciA9IHJhbmRvbSgyNTUpO1xuICogICB2YXIgZyA9IHJhbmRvbSgyNTUpO1xuICogICB2YXIgYiA9IHJhbmRvbSgyNTUpO1xuICpcbiAqICAgaHR0cFBvc3QodXJsLCAnanNvbicsIHBvc3REYXRhLCBmdW5jdGlvbihyZXN1bHQpIHtcbiAqICAgICBzdHJva2VXZWlnaHQoMik7XG4gKiAgICAgc3Ryb2tlKHIsIGcsIGIpO1xuICogICAgIGZpbGwociwgZywgYiwgMTI3KTtcbiAqICAgICBlbGxpcHNlKG1vdXNlWCwgbW91c2VZLCAyMDAsIDIwMCk7XG4gKiAgICAgdGV4dChyZXN1bHQuYm9keSwgbW91c2VYLCBtb3VzZVkpO1xuICogICB9KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqXG4gKiA8ZGl2Pjxjb2RlPlxuICogdmFyIHVybCA9ICdodHRwczovL2ludmFsaWRVUkwnOyAvLyBBIGJhZCBVUkwgdGhhdCB3aWxsIGNhdXNlIGVycm9yc1xuICogdmFyIHBvc3REYXRhID0geyB0aXRsZTogJ3A1IENsaWNrZWQhJywgYm9keTogJ3A1LmpzIGlzIHdheSBjb29sLicgfTtcbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDgwMCwgODAwKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBtb3VzZVByZXNzZWQoKSB7XG4gKiAgIC8vIFBpY2sgbmV3IHJhbmRvbSBjb2xvciB2YWx1ZXNcbiAqICAgdmFyIHIgPSByYW5kb20oMjU1KTtcbiAqICAgdmFyIGcgPSByYW5kb20oMjU1KTtcbiAqICAgdmFyIGIgPSByYW5kb20oMjU1KTtcbiAqXG4gKiAgIGh0dHBQb3N0KFxuICogICAgIHVybCxcbiAqICAgICAnanNvbicsXG4gKiAgICAgcG9zdERhdGEsXG4gKiAgICAgZnVuY3Rpb24ocmVzdWx0KSB7XG4gKiAgICAgICAvLyAuLi4gd29uJ3QgYmUgY2FsbGVkXG4gKiAgICAgfSxcbiAqICAgICBmdW5jdGlvbihlcnJvcikge1xuICogICAgICAgc3Ryb2tlV2VpZ2h0KDIpO1xuICogICAgICAgc3Ryb2tlKHIsIGcsIGIpO1xuICogICAgICAgZmlsbChyLCBnLCBiLCAxMjcpO1xuICogICAgICAgdGV4dChlcnJvci50b1N0cmluZygpLCBtb3VzZVgsIG1vdXNlWSk7XG4gKiAgICAgfVxuICogICApO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGh0dHBQb3N0XG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICBwYXRoXG4gKiBAcGFyYW0gIHtPYmplY3R8Qm9vbGVhbn0gZGF0YVxuICogQHBhcmFtICB7ZnVuY3Rpb259ICAgICAgW2NhbGxiYWNrXVxuICogQHBhcmFtICB7ZnVuY3Rpb259ICAgICAgW2Vycm9yQ2FsbGJhY2tdXG4gKi9cbi8qKlxuICogQG1ldGhvZCBodHRwUG9zdFxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgcGF0aFxuICogQHBhcmFtICB7ZnVuY3Rpb259ICAgICAgY2FsbGJhY2tcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgICAgIFtlcnJvckNhbGxiYWNrXVxuICovXG5wNS5wcm90b3R5cGUuaHR0cFBvc3QgPSBmdW5jdGlvbigpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnaHR0cFBvc3QnLCBhcmd1bWVudHMpO1xuXG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgYXJncy5zcGxpY2UoMSwgMCwgJ1BPU1QnKTtcbiAgcDUucHJvdG90eXBlLmh0dHBEby5hcHBseSh0aGlzLCBhcmdzKTtcbn07XG5cbi8qKlxuICogTWV0aG9kIGZvciBleGVjdXRpbmcgYW4gSFRUUCByZXF1ZXN0LiBJZiBkYXRhIHR5cGUgaXMgbm90IHNwZWNpZmllZCxcbiAqIHA1IHdpbGwgdHJ5IHRvIGd1ZXNzIGJhc2VkIG9uIHRoZSBVUkwsIGRlZmF1bHRpbmcgdG8gdGV4dC48YnI+PGJyPlxuICogRm9yIG1vcmUgYWR2YW5jZWQgdXNlLCB5b3UgbWF5IGFsc28gcGFzcyBpbiB0aGUgcGF0aCBhcyB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIGFuZCBhIG9iamVjdCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCB0aGUgc2lnbmF0dXJlIGZvbGxvd3MgdGhlIG9uZSBzcGVjaWZpZWRcbiAqIGluIHRoZSBGZXRjaCBBUEkgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBAbWV0aG9kIGh0dHBEb1xuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgcGF0aCAgICAgICBuYW1lIG9mIHRoZSBmaWxlIG9yIHVybCB0byBsb2FkXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICBbbWV0aG9kXSAgIGVpdGhlciBcIkdFVFwiLCBcIlBPU1RcIiwgb3IgXCJQVVRcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gXCJHRVRcIlxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgW2RhdGF0eXBlXSBcImpzb25cIiwgXCJqc29ucFwiLCBcInhtbFwiLCBvciBcInRleHRcIlxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgW2RhdGFdICAgICBwYXJhbSBkYXRhIHBhc3NlZCBzZW50IHdpdGggcmVxdWVzdFxuICogQHBhcmFtICB7ZnVuY3Rpb259ICAgICAgW2NhbGxiYWNrXSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwR2V0KCkgY29tcGxldGVzLCBkYXRhIGlzIHBhc3NlZCBpblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBmaXJzdCBhcmd1bWVudFxuICogQHBhcmFtICB7ZnVuY3Rpb259ICAgICAgW2Vycm9yQ2FsbGJhY2tdIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGlmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGFuIGVycm9yLCByZXNwb25zZSBpcyBwYXNzZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXMgZmlyc3QgYXJndW1lbnRcbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIEV4YW1wbGVzIHVzZSBVU0dTIEVhcnRocXVha2UgQVBJOlxuICogLy8gaHR0cHM6Ly9lYXJ0aHF1YWtlLnVzZ3MuZ292L2Zkc253cy9ldmVudC8xLyNtZXRob2RzXG4gKlxuICogLy8gZGlzcGxheXMgYW4gYW5pbWF0aW9uIG9mIGFsbCBVU0dTIGVhcnRocXVha2VzXG4gKiB2YXIgZWFydGhxdWFrZXM7XG4gKiB2YXIgZXFGZWF0dXJlSW5kZXggPSAwO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHZhciB1cmwgPSAnaHR0cHM6Ly9lYXJ0aHF1YWtlLnVzZ3MuZ292L2Zkc253cy9ldmVudC8xL3F1ZXJ5P2Zvcm1hdD1nZW9qc29uJztcbiAqICAgaHR0cERvKFxuICogICAgIHVybCxcbiAqICAgICB7XG4gKiAgICAgICBtZXRob2Q6ICdHRVQnLFxuICogICAgICAgLy8gT3RoZXIgUmVxdWVzdCBvcHRpb25zLCBsaWtlIHNwZWNpYWwgaGVhZGVycyBmb3IgYXBpc1xuICogICAgICAgaGVhZGVyczogeyBhdXRob3JpemF0aW9uOiAnQmVhcmVyIHNlY3JldEtleScgfVxuICogICAgIH0sXG4gKiAgICAgZnVuY3Rpb24ocmVzKSB7XG4gKiAgICAgICBlYXJ0aHF1YWtlcyA9IHJlcztcbiAqICAgICB9XG4gKiAgICk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgLy8gd2FpdCB1bnRpbCB0aGUgZGF0YSBpcyBsb2FkZWRcbiAqICAgaWYgKCFlYXJ0aHF1YWtlcyB8fCAhZWFydGhxdWFrZXMuZmVhdHVyZXNbZXFGZWF0dXJlSW5kZXhdKSB7XG4gKiAgICAgcmV0dXJuO1xuICogICB9XG4gKiAgIGNsZWFyKCk7XG4gKlxuICogICB2YXIgZmVhdHVyZSA9IGVhcnRocXVha2VzLmZlYXR1cmVzW2VxRmVhdHVyZUluZGV4XTtcbiAqICAgdmFyIG1hZyA9IGZlYXR1cmUucHJvcGVydGllcy5tYWc7XG4gKiAgIHZhciByYWQgPSBtYWcgLyAxMSAqICgod2lkdGggKyBoZWlnaHQpIC8gMik7XG4gKiAgIGZpbGwoMjU1LCAwLCAwLCAxMDApO1xuICogICBlbGxpcHNlKHdpZHRoIC8gMiArIHJhbmRvbSgtMiwgMiksIGhlaWdodCAvIDIgKyByYW5kb20oLTIsIDIpLCByYWQsIHJhZCk7XG4gKlxuICogICBpZiAoZXFGZWF0dXJlSW5kZXggPj0gZWFydGhxdWFrZXMuZmVhdHVyZXMubGVuZ3RoKSB7XG4gKiAgICAgZXFGZWF0dXJlSW5kZXggPSAwO1xuICogICB9IGVsc2Uge1xuICogICAgIGVxRmVhdHVyZUluZGV4ICs9IDE7XG4gKiAgIH1cbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG4vKipcbiAqIEBtZXRob2QgaHR0cERvXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICBwYXRoXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgICBvcHRpb25zICAgUmVxdWVzdCBvYmplY3Qgb3B0aW9ucyBhcyBkb2N1bWVudGVkIGluIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZldGNoXCIgQVBJXG4gKiA8YSBocmVmPVwiaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL0ZldGNoX0FQSVwiPnJlZmVyZW5jZTwvYT5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgICAgIFtjYWxsYmFja11cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgICAgIFtlcnJvckNhbGxiYWNrXVxuICovXG5wNS5wcm90b3R5cGUuaHR0cERvID0gZnVuY3Rpb24oKSB7XG4gIHZhciB0eXBlO1xuICB2YXIgY2FsbGJhY2s7XG4gIHZhciBlcnJvckNhbGxiYWNrO1xuICB2YXIgcmVxdWVzdDtcbiAgdmFyIGpzb25wT3B0aW9ucyA9IHt9O1xuICB2YXIgY2JDb3VudCA9IDA7XG4gIHZhciBjb250ZW50VHlwZSA9ICd0ZXh0L3BsYWluJztcbiAgLy8gVHJpbSB0aGUgY2FsbGJhY2tzIG9mZiB0aGUgZW5kIHRvIGdldCBhbiBpZGVhIG9mIGhvdyBtYW55IGFyZ3VtZW50cyBhcmUgcGFzc2VkXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYkNvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvLyBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBtaW51cyBjYWxsYmFja3NcbiAgdmFyIGFyZ3NDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggLSBjYkNvdW50O1xuICB2YXIgcGF0aCA9IGFyZ3VtZW50c1swXTtcbiAgaWYgKFxuICAgIGFyZ3NDb3VudCA9PT0gMiAmJlxuICAgIHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdvYmplY3QnXG4gICkge1xuICAgIC8vIEludGVuZGVkIGZvciBtb3JlIGFkdmFuY2VkIHVzZSwgcGFzcyBpbiBSZXF1ZXN0IHBhcmFtZXRlcnMgZGlyZWN0bHlcbiAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QocGF0aCwgYXJndW1lbnRzWzFdKTtcbiAgICBjYWxsYmFjayA9IGFyZ3VtZW50c1syXTtcbiAgICBlcnJvckNhbGxiYWNrID0gYXJndW1lbnRzWzNdO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb3ZpZGVkIHdpdGggYXJndW1lbnRzXG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnO1xuICAgIHZhciBkYXRhO1xuXG4gICAgZm9yICh2YXIgaiA9IDE7IGogPCBhcmd1bWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBhID0gYXJndW1lbnRzW2pdO1xuICAgICAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoYSA9PT0gJ0dFVCcgfHwgYSA9PT0gJ1BPU1QnIHx8IGEgPT09ICdQVVQnIHx8IGEgPT09ICdERUxFVEUnKSB7XG4gICAgICAgICAgbWV0aG9kID0gYTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBhID09PSAnanNvbicgfHxcbiAgICAgICAgICBhID09PSAnanNvbnAnIHx8XG4gICAgICAgICAgYSA9PT0gJ2JpbmFyeScgfHxcbiAgICAgICAgICBhID09PSAnYXJyYXlCdWZmZXInIHx8XG4gICAgICAgICAgYSA9PT0gJ3htbCcgfHxcbiAgICAgICAgICBhID09PSAndGV4dCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHlwZSA9IGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YSA9IGE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGEgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRhdGEgPSBhLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eSgnanNvbnBDYWxsYmFjaycpKSB7XG4gICAgICAgICAgZm9yICh2YXIgYXR0ciBpbiBhKSB7XG4gICAgICAgICAgICBqc29ucE9wdGlvbnNbYXR0cl0gPSBhW2F0dHJdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhID0gSlNPTi5zdHJpbmdpZnkoYSk7XG4gICAgICAgICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrID0gYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvckNhbGxiYWNrID0gYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChwYXRoLCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgIGJvZHk6IGRhdGEsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGRvIHNvbWUgc29ydCBvZiBzbWFydCB0eXBlIGNoZWNraW5nXG4gIGlmICghdHlwZSkge1xuICAgIGlmIChwYXRoLmluZGV4T2YoJ2pzb24nKSAhPT0gLTEpIHtcbiAgICAgIHR5cGUgPSAnanNvbic7XG4gICAgfSBlbHNlIGlmIChwYXRoLmluZGV4T2YoJ3htbCcpICE9PSAtMSkge1xuICAgICAgdHlwZSA9ICd4bWwnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gJ3RleHQnO1xuICAgIH1cbiAgfVxuXG4gICh0eXBlID09PSAnanNvbnAnID8gZmV0Y2hKc29ucChwYXRoLCBqc29ucE9wdGlvbnMpIDogZmV0Y2gocmVxdWVzdCkpXG4gICAgLnRoZW4oZnVuY3Rpb24ocmVzKSB7XG4gICAgICBpZiAoIXJlcy5vaykgdGhyb3cgcmVzO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgICAgcmV0dXJuIHJlcy5ibG9iKCk7XG4gICAgICAgIGNhc2UgJ2FycmF5QnVmZmVyJzpcbiAgICAgICAgICByZXR1cm4gcmVzLmFycmF5QnVmZmVyKCk7XG4gICAgICAgIGNhc2UgJ3htbCc6XG4gICAgICAgICAgcmV0dXJuIHJlcy50ZXh0KCkudGhlbihmdW5jdGlvbih0ZXh0KSB7XG4gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgdmFyIHhtbCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGV4dCwgJ3RleHQveG1sJyk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VYTUwoeG1sLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9KVxuICAgIC5jYXRjaChlcnJvckNhbGxiYWNrIHx8IGNvbnNvbGUuZXJyb3IpO1xufTtcblxuLyoqXG4gKiBAbW9kdWxlIElPXG4gKiBAc3VibW9kdWxlIE91dHB1dFxuICogQGZvciBwNVxuICovXG5cbndpbmRvdy5VUkwgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkw7XG5cbi8vIHByaXZhdGUgYXJyYXkgb2YgcDUuUHJpbnRXcml0ZXIgb2JqZWN0c1xucDUucHJvdG90eXBlLl9wV3JpdGVycyA9IFtdO1xuXG4vKipcbiAqIEBtZXRob2QgY3JlYXRlV3JpdGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZXh0ZW5zaW9uXVxuICogQHJldHVybiB7cDUuUHJpbnRXcml0ZXJ9XG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogY3JlYXRlQnV0dG9uKCdzYXZlJylcbiAqICAgLnBvc2l0aW9uKDEwLCAxMClcbiAqICAgLm1vdXNlUHJlc3NlZChmdW5jdGlvbigpIHtcbiAqICAgICB2YXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKCdzcXVhcmVzLnR4dCcpO1xuICogICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICogICAgICAgd3JpdGVyLnByaW50KGkgKiBpKTtcbiAqICAgICB9XG4gKiAgICAgd3JpdGVyLmNsb3NlKCk7XG4gKiAgICAgd3JpdGVyLmNsZWFyKCk7XG4gKiAgIH0pO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKi9cbnA1LnByb3RvdHlwZS5jcmVhdGVXcml0ZXIgPSBmdW5jdGlvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgdmFyIG5ld1BXO1xuICAvLyBjaGVjayB0aGF0IGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICBmb3IgKHZhciBpIGluIHA1LnByb3RvdHlwZS5fcFdyaXRlcnMpIHtcbiAgICBpZiAocDUucHJvdG90eXBlLl9wV3JpdGVyc1tpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAvLyBpZiBhIHA1LlByaW50V3JpdGVyIHcvIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4uLlxuICAgICAgLy8gcmV0dXJuIHA1LnByb3RvdHlwZS5fcFdyaXRlcnNbaV07IC8vIHJldHVybiBpdCB3LyBjb250ZW50cyBpbnRhY3QuXG4gICAgICAvLyBvciwgY291bGQgcmV0dXJuIGEgbmV3LCBlbXB0eSBvbmUgd2l0aCBhIHVuaXF1ZSBuYW1lOlxuICAgICAgbmV3UFcgPSBuZXcgcDUuUHJpbnRXcml0ZXIobmFtZSArIHRoaXMubWlsbGlzKCksIGV4dGVuc2lvbik7XG4gICAgICBwNS5wcm90b3R5cGUuX3BXcml0ZXJzLnB1c2gobmV3UFcpO1xuICAgICAgcmV0dXJuIG5ld1BXO1xuICAgIH1cbiAgfVxuICBuZXdQVyA9IG5ldyBwNS5QcmludFdyaXRlcihuYW1lLCBleHRlbnNpb24pO1xuICBwNS5wcm90b3R5cGUuX3BXcml0ZXJzLnB1c2gobmV3UFcpO1xuICByZXR1cm4gbmV3UFc7XG59O1xuXG4vKipcbiAqICBAY2xhc3MgcDUuUHJpbnRXcml0ZXJcbiAqICBAcGFyYW0gIHtTdHJpbmd9ICAgICBmaWxlbmFtZVxuICogIEBwYXJhbSAge1N0cmluZ30gICAgIFtleHRlbnNpb25dXG4gKi9cbnA1LlByaW50V3JpdGVyID0gZnVuY3Rpb24oZmlsZW5hbWUsIGV4dGVuc2lvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMubmFtZSA9IGZpbGVuYW1lO1xuICB0aGlzLmNvbnRlbnQgPSAnJztcbiAgLy9DaGFuZ2VkIHRvIHdyaXRlIGJlY2F1c2UgaXQgd2FzIGJlaW5nIG92ZXJsb2FkZWQgYnkgZnVuY3Rpb24gYmVsb3cuXG4gIC8qKlxuICAgKiBXcml0ZXMgZGF0YSB0byB0aGUgUHJpbnRXcml0ZXIgc3RyZWFtXG4gICAqIEBtZXRob2Qgd3JpdGVcbiAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBhbGwgZGF0YSB0byBiZSB3cml0dGVuIGJ5IHRoZSBQcmludFdyaXRlclxuICAgKiBAZXhhbXBsZVxuICAgKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXIgbm90ZXN0XCI+XG4gICAqIDxjb2RlPlxuICAgKiAvLyBjcmVhdGVzIGEgZmlsZSBjYWxsZWQgJ25ld0ZpbGUudHh0J1xuICAgKiB2YXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKCduZXdGaWxlLnR4dCcpO1xuICAgKiAvLyB3cml0ZSAnSGVsbG8gd29ybGQhJycgdG8gdGhlIGZpbGVcbiAgICogd3JpdGVyLndyaXRlKFsnSGVsbG8gd29ybGQhJ10pO1xuICAgKiAvLyBjbG9zZSB0aGUgUHJpbnRXcml0ZXIgYW5kIHNhdmUgdGhlIGZpbGVcbiAgICogd3JpdGVyLmNsb3NlKCk7XG4gICAqIDwvY29kZT5cbiAgICogPC9kaXY+XG4gICAqIDxkaXYgY2xhc3M9J25vcmVuZGVyIG5vdGVzdCc+XG4gICAqIDxjb2RlPlxuICAgKiAvLyBjcmVhdGVzIGEgZmlsZSBjYWxsZWQgJ25ld0ZpbGUyLnR4dCdcbiAgICogdmFyIHdyaXRlciA9IGNyZWF0ZVdyaXRlcignbmV3RmlsZTIudHh0Jyk7XG4gICAqIC8vIHdyaXRlICdhcHBsZXMsYmFuYW5hcywxMjMnIHRvIHRoZSBmaWxlXG4gICAqIHdyaXRlci53cml0ZShbJ2FwcGxlcycsICdiYW5hbmFzJywgMTIzXSk7XG4gICAqIC8vIGNsb3NlIHRoZSBQcmludFdyaXRlciBhbmQgc2F2ZSB0aGUgZmlsZVxuICAgKiB3cml0ZXIuY2xvc2UoKTtcbiAgICogPC9jb2RlPlxuICAgKiA8L2Rpdj5cbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz5cbiAgICogPGNvZGU+XG4gICAqIC8vIGNyZWF0ZXMgYSBmaWxlIGNhbGxlZCAnbmV3RmlsZTMudHh0J1xuICAgKiB2YXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKCduZXdGaWxlMy50eHQnKTtcbiAgICogLy8gd3JpdGUgJ015IG5hbWUgaXM6IFRlZGR5JyB0byB0aGUgZmlsZVxuICAgKiB3cml0ZXIud3JpdGUoJ015IG5hbWUgaXM6Jyk7XG4gICAqIHdyaXRlci53cml0ZSgnIFRlZGR5Jyk7XG4gICAqIC8vIGNsb3NlIHRoZSBQcmludFdyaXRlciBhbmQgc2F2ZSB0aGUgZmlsZVxuICAgKiB3cml0ZXIuY2xvc2UoKTtcbiAgICogPC9jb2RlPlxuICAgKiA8L2Rpdj5cbiAgICovXG4gIHRoaXMud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgdGhpcy5jb250ZW50ICs9IGRhdGE7XG4gIH07XG4gIC8qKlxuICAgKiBXcml0ZXMgZGF0YSB0byB0aGUgUHJpbnRXcml0ZXIgc3RyZWFtLCBhbmQgYWRkcyBhIG5ldyBsaW5lIGF0IHRoZSBlbmRcbiAgICogQG1ldGhvZCBwcmludFxuICAgKiBAcGFyYW0ge0FycmF5fSBkYXRhIGFsbCBkYXRhIHRvIGJlIHByaW50ZWQgYnkgdGhlIFByaW50V3JpdGVyXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXYgY2xhc3M9J25vcmVuZGVyIG5vdGVzdCc+XG4gICAqIDxjb2RlPlxuICAgKiAvLyBjcmVhdGVzIGEgZmlsZSBjYWxsZWQgJ25ld0ZpbGUudHh0J1xuICAgKiB2YXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKCduZXdGaWxlLnR4dCcpO1xuICAgKiAvLyBjcmVhdGVzIGEgZmlsZSBjb250YWluaW5nXG4gICAqIC8vICBNeSBuYW1lIGlzOlxuICAgKiAvLyAgVGVkZHlcbiAgICogd3JpdGVyLnByaW50KCdNeSBuYW1lIGlzOicpO1xuICAgKiB3cml0ZXIucHJpbnQoJ1RlZGR5Jyk7XG4gICAqIC8vIGNsb3NlIHRoZSBQcmludFdyaXRlciBhbmQgc2F2ZSB0aGUgZmlsZVxuICAgKiB3cml0ZXIuY2xvc2UoKTtcbiAgICogPC9jb2RlPlxuICAgKiA8L2Rpdj5cbiAgICogPGRpdiBjbGFzcz0nbm9yZW5kZXIgbm90ZXN0Jz5cbiAgICogPGNvZGU+XG4gICAqIHZhciB3cml0ZXI7XG4gICAqXG4gICAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgKiAgIGNyZWF0ZUNhbnZhcyg0MDAsIDQwMCk7XG4gICAqICAgLy8gY3JlYXRlIGEgUHJpbnRXcml0ZXJcbiAgICogICB3cml0ZXIgPSBjcmVhdGVXcml0ZXIoJ25ld0ZpbGUudHh0Jyk7XG4gICAqIH1cbiAgICpcbiAgICogZnVuY3Rpb24gZHJhdygpIHtcbiAgICogICAvLyBwcmludCBhbGwgbW91c2VYIGFuZCBtb3VzZVkgY29vcmRpbmF0ZXMgdG8gdGhlIHN0cmVhbVxuICAgKiAgIHdyaXRlci5wcmludChbbW91c2VYLCBtb3VzZVldKTtcbiAgICogfVxuICAgKlxuICAgKiBmdW5jdGlvbiBtb3VzZUNsaWNrZWQoKSB7XG4gICAqICAgLy8gY2xvc2UgdGhlIFByaW50V3JpdGVyIGFuZCBzYXZlIHRoZSBmaWxlXG4gICAqICAgd3JpdGVyLmNsb3NlKCk7XG4gICAqIH1cbiAgICogPC9jb2RlPlxuICAgKiA8L2Rpdj5cbiAgICovXG4gIHRoaXMucHJpbnQgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgdGhpcy5jb250ZW50ICs9IGRhdGEgKyAnXFxuJztcbiAgfTtcbiAgLyoqXG4gICAqIENsZWFycyB0aGUgZGF0YSBhbHJlYWR5IHdyaXR0ZW4gdG8gdGhlIFByaW50V3JpdGVyIG9iamVjdFxuICAgKiBAbWV0aG9kIGNsZWFyXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXYgY2xhc3MgPVwibm9yZW5kZXIgbm90ZXN0XCI+PGNvZGU+XG4gICAqIC8vIGNyZWF0ZSB3cml0ZXIgb2JqZWN0XG4gICAqIHZhciB3cml0ZXIgPSBjcmVhdGVXcml0ZXIoJ25ld0ZpbGUudHh0Jyk7XG4gICAqIHdyaXRlci53cml0ZShbJ2NsZWFyIG1lJ10pO1xuICAgKiAvLyBjbGVhciB3cml0ZXIgb2JqZWN0IGhlcmVcbiAgICogd3JpdGVyLmNsZWFyKCk7XG4gICAqIC8vIGNsb3NlIHdyaXRlclxuICAgKiB3cml0ZXIuY2xvc2UoKTtcbiAgICogPC9jb2RlPjwvZGl2PlxuICAgKlxuICAgKi9cbiAgdGhpcy5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY29udGVudCA9ICcnO1xuICB9O1xuICAvKipcbiAgICogQ2xvc2VzIHRoZSBQcmludFdyaXRlclxuICAgKiBAbWV0aG9kIGNsb3NlXG4gICAqIEBleGFtcGxlXG4gICAqIDxkaXYgY2xhc3M9XCJub3JlbmRlciBub3Rlc3RcIj5cbiAgICogPGNvZGU+XG4gICAqIC8vIGNyZWF0ZSBhIGZpbGUgY2FsbGVkICduZXdGaWxlLnR4dCdcbiAgICogdmFyIHdyaXRlciA9IGNyZWF0ZVdyaXRlcignbmV3RmlsZS50eHQnKTtcbiAgICogLy8gY2xvc2UgdGhlIFByaW50V3JpdGVyIGFuZCBzYXZlIHRoZSBmaWxlXG4gICAqIHdyaXRlci5jbG9zZSgpO1xuICAgKiA8L2NvZGU+XG4gICAqIDwvZGl2PlxuICAgKiA8ZGl2IGNsYXNzPSdub3JlbmRlciBub3Rlc3QnPlxuICAgKiA8Y29kZT5cbiAgICogLy8gY3JlYXRlIGEgZmlsZSBjYWxsZWQgJ25ld0ZpbGUyLnR4dCdcbiAgICogdmFyIHdyaXRlciA9IGNyZWF0ZVdyaXRlcignbmV3RmlsZTIudHh0Jyk7XG4gICAqIC8vIHdyaXRlIHNvbWUgZGF0YSB0byB0aGUgZmlsZVxuICAgKiB3cml0ZXIud3JpdGUoWzEwMCwgMTAxLCAxMDJdKTtcbiAgICogLy8gY2xvc2UgdGhlIFByaW50V3JpdGVyIGFuZCBzYXZlIHRoZSBmaWxlXG4gICAqIHdyaXRlci5jbG9zZSgpO1xuICAgKiA8L2NvZGU+XG4gICAqIDwvZGl2PlxuICAgKi9cbiAgdGhpcy5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIGNvbnZlcnQgU3RyaW5nIHRvIEFycmF5IGZvciB0aGUgd3JpdGVGaWxlIEJsb2JcbiAgICB2YXIgYXJyID0gW107XG4gICAgYXJyLnB1c2godGhpcy5jb250ZW50KTtcbiAgICBwNS5wcm90b3R5cGUud3JpdGVGaWxlKGFyciwgZmlsZW5hbWUsIGV4dGVuc2lvbik7XG4gICAgLy8gcmVtb3ZlIGZyb20gX3BXcml0ZXJzIGFycmF5IGFuZCBkZWxldGUgc2VsZlxuICAgIGZvciAodmFyIGkgaW4gcDUucHJvdG90eXBlLl9wV3JpdGVycykge1xuICAgICAgaWYgKHA1LnByb3RvdHlwZS5fcFdyaXRlcnNbaV0ubmFtZSA9PT0gdGhpcy5uYW1lKSB7XG4gICAgICAgIC8vIHJlbW92ZSBmcm9tIF9wV3JpdGVycyBhcnJheVxuICAgICAgICBwNS5wcm90b3R5cGUuX3BXcml0ZXJzLnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2VsZi5jbGVhcigpO1xuICAgIHNlbGYgPSB7fTtcbiAgfTtcbn07XG5cbi8qKlxuICogQG1vZHVsZSBJT1xuICogQHN1Ym1vZHVsZSBPdXRwdXRcbiAqIEBmb3IgcDVcbiAqL1xuXG4vLyBvYmplY3QsIGZpbGVuYW1lLCBvcHRpb25zIC0tPiBzYXZlSlNPTiwgc2F2ZVN0cmluZ3MsXG4vLyBmaWxlbmFtZSwgW2V4dGVuc2lvbl0gW2NhbnZhc10gLS0+IHNhdmVJbWFnZVxuXG4vKipcbiAqICA8cD5TYXZlIGFuIGltYWdlLCB0ZXh0LCBqc29uLCBjc3YsIHdhdiwgb3IgaHRtbC4gUHJvbXB0cyBkb3dubG9hZCB0b1xuICogIHRoZSBjbGllbnQncyBjb21wdXRlci4gPGI+Tm90ZSB0aGF0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBjYWxsIHNhdmUoKVxuICogIHdpdGhpbiBkcmF3IGlmIGl0J3MgbG9vcGluZywgYXMgdGhlIHNhdmUoKSBmdW5jdGlvbiB3aWxsIG9wZW4gYSBuZXcgc2F2ZVxuICogIGRpYWxvZyBldmVyeSBmcmFtZS48L2I+PC9wPlxuICogIDxwPlRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHNhdmUgdGhlIGNhbnZhcyBhcyBhbiBpbWFnZS4gWW91IGNhblxuICogIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGVuYW1lLlxuICogIEZvciBleGFtcGxlOjwvcD5cbiAqIDxwcmUgY2xhc3M9J2xhbmd1YWdlLWphdmFzY3JpcHQnPjxjb2RlPlxuICogc2F2ZSgpO1xuICogc2F2ZSgnbXlDYW52YXMuanBnJyk7IC8vIHNhdmUgYSBzcGVjaWZpYyBjYW52YXMgd2l0aCBhIGZpbGVuYW1lXG4gKiA8L2NvZGU+PC9wcmU+XG4gKlxuICogIDxwPkFsdGVybmF0ZWx5LCB0aGUgZmlyc3QgcGFyYW1ldGVyIGNhbiBiZSBhIHBvaW50ZXIgdG8gYSBjYW52YXNcbiAqICBwNS5FbGVtZW50LCBhbiBBcnJheSBvZiBTdHJpbmdzLFxuICogIGFuIEFycmF5IG9mIEpTT04sIGEgSlNPTiBvYmplY3QsIGEgcDUuVGFibGUsIGEgcDUuSW1hZ2UsIG9yIGFcbiAqICBwNS5Tb3VuZEZpbGUgKHJlcXVpcmVzIHA1LnNvdW5kKS4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBmaWxlbmFtZVxuICogIChpbmNsdWRpbmcgZXh0ZW5zaW9uKS4gVGhlIHRoaXJkIHBhcmFtZXRlciBpcyBmb3Igb3B0aW9ucyBzcGVjaWZpY1xuICogIHRvIHRoaXMgdHlwZSBvZiBvYmplY3QuIFRoaXMgbWV0aG9kIHdpbGwgc2F2ZSBhIGZpbGUgdGhhdCBmaXRzIHRoZVxuICogIGdpdmVuIHBhcmFtYXRlcnMuIEZvciBleGFtcGxlOjwvcD5cbiAqXG4gKiA8cHJlIGNsYXNzPSdsYW5ndWFnZS1qYXZhc2NyaXB0Jz48Y29kZT5cbiAqIC8vIFNhdmVzIGNhbnZhcyBhcyBhbiBpbWFnZVxuICogc2F2ZSgnbXlDYW52YXMuanBnJyk7XG4gKlxuICogLy8gU2F2ZXMgcEltYWdlIGFzIGEgcG5nIGltYWdlXG4gKiB2YXIgaW1nID0gY3JlYXRlSW1hZ2UoMTAsIDEwKTtcbiAqIHNhdmUoaW1nLCAnbXkucG5nJyk7XG4gKlxuICogLy8gU2F2ZXMgY2FudmFzIGFzIGFuIGltYWdlXG4gKiB2YXIgY252ID0gY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqIHNhdmUoY252LCAnbXlDYW52YXMuanBnJyk7XG4gKlxuICogLy8gU2F2ZXMgcDUuUmVuZGVyZXIgb2JqZWN0IGFzIGFuIGltYWdlXG4gKiB2YXIgZ2IgPSBjcmVhdGVHcmFwaGljcygxMDAsIDEwMCk7XG4gKiBzYXZlKGdiLCAnbXlHcmFwaGljcy5qcGcnKTtcbiAqXG4gKiB2YXIgbXlUYWJsZSA9IG5ldyBwNS5UYWJsZSgpO1xuICpcbiAqIC8vIFNhdmVzIHRhYmxlIGFzIGh0bWwgZmlsZVxuICogc2F2ZShteVRhYmxlLCAnbXlUYWJsZS5odG1sJyk7XG4gKlxuICogLy8gQ29tbWEgU2VwYXJhdGVkIFZhbHVlc1xuICogc2F2ZShteVRhYmxlLCAnbXlUYWJsZS5jc3YnKTtcbiAqXG4gKiAvLyBUYWIgU2VwYXJhdGVkIFZhbHVlc1xuICogc2F2ZShteVRhYmxlLCAnbXlUYWJsZS50c3YnKTtcbiAqXG4gKiB2YXIgbXlKU09OID0geyBhOiAxLCBiOiB0cnVlIH07XG4gKlxuICogLy8gU2F2ZXMgcHJldHR5IEpTT05cbiAqIHNhdmUobXlKU09OLCAnbXkuanNvbicpO1xuICpcbiAqIC8vIE9wdGltaXplcyBKU09OIGZpbGVzaXplXG4gKiBzYXZlKG15SlNPTiwgJ215Lmpzb24nLCB0cnVlKTtcbiAqXG4gKiAvLyBTYXZlcyBhcnJheSBvZiBzdHJpbmdzIHRvIGEgdGV4dCBmaWxlIHdpdGggbGluZSBicmVha3MgYWZ0ZXIgZWFjaCBpdGVtXG4gKiB2YXIgYXJyYXlPZlN0cmluZ3MgPSBbJ2EnLCAnYiddO1xuICogc2F2ZShhcnJheU9mU3RyaW5ncywgJ215LnR4dCcpO1xuICogPC9jb2RlPjwvcHJlPlxuICpcbiAqICBAbWV0aG9kIHNhdmVcbiAqICBAcGFyYW0gIHtPYmplY3R8U3RyaW5nfSBbb2JqZWN0T3JGaWxlbmFtZV0gIElmIGZpbGVuYW1lIGlzIHByb3ZpZGVkLCB3aWxsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmUgY2FudmFzIGFzIGFuIGltYWdlIHdpdGhcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIHBuZyBvciBqcGcgZXh0ZW5zaW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgZmlsZW5hbWUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9iamVjdCBpcyBwcm92aWRlZCwgd2lsbFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlIGRlcGVuZGluZyBvbiB0aGUgb2JqZWN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmaWxlbmFtZSAoc2VlIGV4YW1wbGVzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlKS5cbiAqICBAcGFyYW0gIHtTdHJpbmd9IFtmaWxlbmFtZV0gSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGFzIHRoZSBmaXJzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLCB0aGVuIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGZpbGVuYW1lLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNob3VsZCBpbmNsdWRlIGFuIGFwcHJvcHJpYXRlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGV4dGVuc2lvbiAoc2VlIGV4YW1wbGVzIGFib3ZlKS5cbiAqICBAcGFyYW0gIHtCb29sZWFufFN0cmluZ30gW29wdGlvbnNdICBBZGRpdGlvbmFsIG9wdGlvbnMgZGVwZW5kIG9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxldHlwZS4gRm9yIGV4YW1wbGUsIHdoZW4gc2F2aW5nIEpTT04sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCB3aWxsIGJlIG9wdGltaXplZCBmb3IgZmlsZXNpemUsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiByZWFkYWJpbGl0eS5cbiAqL1xucDUucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbihvYmplY3QsIF9maWxlbmFtZSwgX29wdGlvbnMpIHtcbiAgLy8gcGFyc2UgdGhlIGFyZ3VtZW50cyBhbmQgZmlndXJlIG91dCB3aGljaCB0aGluZ3Mgd2UgYXJlIHNhdmluZ1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPUFRJT04gMTogc2F2ZUNhbnZhcy4uLlxuXG4gIC8vIGlmIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHNhdmUgY2FudmFzXG4gIHZhciBjbnYgPSB0aGlzLl9jdXJFbGVtZW50LmVsdDtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcDUucHJvdG90eXBlLnNhdmVDYW52YXMoY252KTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoYXJnc1swXSBpbnN0YW5jZW9mIHA1LlJlbmRlcmVyIHx8IGFyZ3NbMF0gaW5zdGFuY2VvZiBwNS5HcmFwaGljcykge1xuICAgIC8vIG90aGVyd2lzZSwgcGFyc2UgdGhlIGFyZ3VtZW50c1xuXG4gICAgLy8gaWYgZmlyc3QgcGFyYW0gaXMgYSBwNUdyYXBoaWNzLCB0aGVuIHNhdmVDYW52YXNcbiAgICBwNS5wcm90b3R5cGUuc2F2ZUNhbnZhcyhhcmdzWzBdLmVsdCwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgIC8vIGlmIDFzdCBwYXJhbSBpcyBTdHJpbmcgYW5kIG9ubHkgb25lIGFyZywgYXNzdW1lIGl0IGlzIGNhbnZhcyBmaWxlbmFtZVxuICAgIHA1LnByb3RvdHlwZS5zYXZlQ2FudmFzKGNudiwgYXJnc1swXSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE9QVElPTiAyOiBleHRlbnNpb24gY2xhcmlmaWVzIHNhdmVTdHJpbmdzIHZzLiBzYXZlSlNPTlxuICAgIHZhciBleHRlbnNpb24gPSBfY2hlY2tGaWxlRXh0ZW5zaW9uKGFyZ3NbMV0sIGFyZ3NbMl0pWzFdO1xuICAgIHN3aXRjaCAoZXh0ZW5zaW9uKSB7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgcDUucHJvdG90eXBlLnNhdmVKU09OKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICd0eHQnOlxuICAgICAgICBwNS5wcm90b3R5cGUuc2F2ZVN0cmluZ3MoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIE9QVElPTiAzOiBkZWNpZGUgYmFzZWQgb24gb2JqZWN0Li4uXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoYXJnc1swXSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgcDUucHJvdG90eXBlLnNhdmVTdHJpbmdzKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gaW5zdGFuY2VvZiBwNS5UYWJsZSkge1xuICAgICAgICAgIHA1LnByb3RvdHlwZS5zYXZlVGFibGUoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXJnc1swXSBpbnN0YW5jZW9mIHA1LkltYWdlKSB7XG4gICAgICAgICAgcDUucHJvdG90eXBlLnNhdmVDYW52YXMoYXJnc1swXS5jYW52YXMsIGFyZ3NbMV0pO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gaW5zdGFuY2VvZiBwNS5Tb3VuZEZpbGUpIHtcbiAgICAgICAgICBwNS5wcm90b3R5cGUuc2F2ZVNvdW5kKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqICBXcml0ZXMgdGhlIGNvbnRlbnRzIG9mIGFuIEFycmF5IG9yIGEgSlNPTiBvYmplY3QgdG8gYSAuanNvbiBmaWxlLlxuICogIFRoZSBmaWxlIHNhdmluZyBwcm9jZXNzIGFuZCBsb2NhdGlvbiBvZiB0aGUgc2F2ZWQgZmlsZSB3aWxsXG4gKiAgdmFyeSBiZXR3ZWVuIHdlYiBicm93c2Vycy5cbiAqXG4gKiAgQG1ldGhvZCBzYXZlSlNPTlxuICogIEBwYXJhbSAge0FycmF5fE9iamVjdH0ganNvblxuICogIEBwYXJhbSAge1N0cmluZ30gZmlsZW5hbWVcbiAqICBAcGFyYW0gIHtCb29sZWFufSBbb3B0aW1pemVdICAgSWYgdHJ1ZSwgcmVtb3ZlcyBsaW5lIGJyZWFrc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc3BhY2VzIGZyb20gdGhlIG91dHB1dFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHRvIG9wdGltaXplIGZpbGVzaXplXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidXQgbm90IHJlYWRhYmlsaXR5KS5cbiAqICBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIHZhciBqc29uID0ge307IC8vIG5ldyAgSlNPTiBPYmplY3RcbiAqXG4gKiBqc29uLmlkID0gMDtcbiAqIGpzb24uc3BlY2llcyA9ICdQYW50aGVyYSBsZW8nO1xuICoganNvbi5uYW1lID0gJ0xpb24nO1xuICpcbiAqIGNyZWF0ZUJ1dHRvbignc2F2ZScpXG4gKiAgIC5wb3NpdGlvbigxMCwgMTApXG4gKiAgIC5tb3VzZVByZXNzZWQoZnVuY3Rpb24oKSB7XG4gKiAgICAgc2F2ZUpTT04oanNvbiwgJ2xpb24uanNvbicpO1xuICogICB9KTtcbiAqXG4gKiAvLyBzYXZlcyB0aGUgZm9sbG93aW5nIHRvIGEgZmlsZSBjYWxsZWQgXCJsaW9uLmpzb25cIjpcbiAqIC8vIHtcbiAqIC8vICAgXCJpZFwiOiAwLFxuICogLy8gICBcInNwZWNpZXNcIjogXCJQYW50aGVyYSBsZW9cIixcbiAqIC8vICAgXCJuYW1lXCI6IFwiTGlvblwiXG4gKiAvLyB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUuc2F2ZUpTT04gPSBmdW5jdGlvbihqc29uLCBmaWxlbmFtZSwgb3B0KSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3NhdmVKU09OJywgYXJndW1lbnRzKTtcbiAgdmFyIHN0cmluZ2lmeTtcbiAgaWYgKG9wdCkge1xuICAgIHN0cmluZ2lmeSA9IEpTT04uc3RyaW5naWZ5KGpzb24pO1xuICB9IGVsc2Uge1xuICAgIHN0cmluZ2lmeSA9IEpTT04uc3RyaW5naWZ5KGpzb24sIHVuZGVmaW5lZCwgMik7XG4gIH1cbiAgdGhpcy5zYXZlU3RyaW5ncyhzdHJpbmdpZnkuc3BsaXQoJ1xcbicpLCBmaWxlbmFtZSwgJ2pzb24nKTtcbn07XG5cbnA1LnByb3RvdHlwZS5zYXZlSlNPTk9iamVjdCA9IHA1LnByb3RvdHlwZS5zYXZlSlNPTjtcbnA1LnByb3RvdHlwZS5zYXZlSlNPTkFycmF5ID0gcDUucHJvdG90eXBlLnNhdmVKU09OO1xuXG4vKipcbiAqICBXcml0ZXMgYW4gYXJyYXkgb2YgU3RyaW5ncyB0byBhIHRleHQgZmlsZSwgb25lIGxpbmUgcGVyIFN0cmluZy5cbiAqICBUaGUgZmlsZSBzYXZpbmcgcHJvY2VzcyBhbmQgbG9jYXRpb24gb2YgdGhlIHNhdmVkIGZpbGUgd2lsbFxuICogIHZhcnkgYmV0d2VlbiB3ZWIgYnJvd3NlcnMuXG4gKlxuICogIEBtZXRob2Qgc2F2ZVN0cmluZ3NcbiAqICBAcGFyYW0gIHtTdHJpbmdbXX0gbGlzdCAgIHN0cmluZyBhcnJheSB0byBiZSB3cml0dGVuXG4gKiAgQHBhcmFtICB7U3RyaW5nfSBmaWxlbmFtZSBmaWxlbmFtZSBmb3Igb3V0cHV0XG4gKiAgQHBhcmFtICB7U3RyaW5nfSBbZXh0ZW5zaW9uXSB0aGUgZmlsZW5hbWUncyBleHRlbnNpb25cbiAqICBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIHZhciB3b3JkcyA9ICdhcHBsZSBiZWFyIGNhdCBkb2cnO1xuICpcbiAqIC8vIC5zcGxpdCgpIG91dHB1dHMgYW4gQXJyYXlcbiAqIHZhciBsaXN0ID0gc3BsaXQod29yZHMsICcgJyk7XG4gKlxuICogY3JlYXRlQnV0dG9uKCdzYXZlJylcbiAqICAgLnBvc2l0aW9uKDEwLCAxMClcbiAqICAgLm1vdXNlUHJlc3NlZChmdW5jdGlvbigpIHtcbiAqICAgICBzYXZlU3RyaW5ncyhsaXN0LCAnbm91bnMudHh0Jyk7XG4gKiAgIH0pO1xuICpcbiAqIC8vIFNhdmVzIHRoZSBmb2xsb3dpbmcgdG8gYSBmaWxlIGNhbGxlZCAnbm91bnMudHh0JzpcbiAqIC8vXG4gKiAvLyBhcHBsZVxuICogLy8gYmVhclxuICogLy8gY2F0XG4gKiAvLyBkb2dcbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5zYXZlU3RyaW5ncyA9IGZ1bmN0aW9uKGxpc3QsIGZpbGVuYW1lLCBleHRlbnNpb24pIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnc2F2ZVN0cmluZ3MnLCBhcmd1bWVudHMpO1xuICB2YXIgZXh0ID0gZXh0ZW5zaW9uIHx8ICd0eHQnO1xuICB2YXIgcFdyaXRlciA9IHRoaXMuY3JlYXRlV3JpdGVyKGZpbGVuYW1lLCBleHQpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaSA8IGxpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgcFdyaXRlci5wcmludChsaXN0W2ldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcFdyaXRlci5wcmludChsaXN0W2ldKTtcbiAgICB9XG4gIH1cbiAgcFdyaXRlci5jbG9zZSgpO1xuICBwV3JpdGVyLmNsZWFyKCk7XG59O1xuXG4vLyA9PT09PT09XG4vLyBIRUxQRVJTXG4vLyA9PT09PT09XG5cbmZ1bmN0aW9uIGVzY2FwZUhlbHBlcihjb250ZW50KSB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAucmVwbGFjZSgvJy9nLCAnJiMwMzk7Jyk7XG59XG5cbi8qKlxuICogIFdyaXRlcyB0aGUgY29udGVudHMgb2YgYSBUYWJsZSBvYmplY3QgdG8gYSBmaWxlLiBEZWZhdWx0cyB0byBhXG4gKiAgdGV4dCBmaWxlIHdpdGggY29tbWEtc2VwYXJhdGVkLXZhbHVlcyAoJ2NzdicpIGJ1dCBjYW4gYWxzb1xuICogIHVzZSB0YWIgc2VwYXJhdGlvbiAoJ3RzdicpLCBvciBnZW5lcmF0ZSBhbiBIVE1MIHRhYmxlICgnaHRtbCcpLlxuICogIFRoZSBmaWxlIHNhdmluZyBwcm9jZXNzIGFuZCBsb2NhdGlvbiBvZiB0aGUgc2F2ZWQgZmlsZSB3aWxsXG4gKiAgdmFyeSBiZXR3ZWVuIHdlYiBicm93c2Vycy5cbiAqXG4gKiAgQG1ldGhvZCBzYXZlVGFibGVcbiAqICBAcGFyYW0gIHtwNS5UYWJsZX0gVGFibGUgIHRoZSBUYWJsZSBvYmplY3QgdG8gc2F2ZSB0byBhIGZpbGVcbiAqICBAcGFyYW0gIHtTdHJpbmd9IGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byB3aGljaCB0aGUgVGFibGUgc2hvdWxkIGJlIHNhdmVkXG4gKiAgQHBhcmFtICB7U3RyaW5nfSBbb3B0aW9uc10gIGNhbiBiZSBvbmUgb2YgXCJ0c3ZcIiwgXCJjc3ZcIiwgb3IgXCJodG1sXCJcbiAqICBAZXhhbXBsZVxuICogIDxkaXY+PGNvZGU+XG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHRhYmxlID0gbmV3IHA1LlRhYmxlKCk7XG4gKlxuICogICB0YWJsZS5hZGRDb2x1bW4oJ2lkJyk7XG4gKiAgIHRhYmxlLmFkZENvbHVtbignc3BlY2llcycpO1xuICogICB0YWJsZS5hZGRDb2x1bW4oJ25hbWUnKTtcbiAqXG4gKiAgIHZhciBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcbiAqICAgbmV3Um93LnNldE51bSgnaWQnLCB0YWJsZS5nZXRSb3dDb3VudCgpIC0gMSk7XG4gKiAgIG5ld1Jvdy5zZXRTdHJpbmcoJ3NwZWNpZXMnLCAnUGFudGhlcmEgbGVvJyk7XG4gKiAgIG5ld1Jvdy5zZXRTdHJpbmcoJ25hbWUnLCAnTGlvbicpO1xuICpcbiAqICAgLy8gVG8gc2F2ZSwgdW4tY29tbWVudCBuZXh0IGxpbmUgdGhlbiBjbGljayAncnVuJ1xuICogICAvLyBzYXZlVGFibGUodGFibGUsICduZXcuY3N2Jyk7XG4gKiB9XG4gKlxuICogLy8gU2F2ZXMgdGhlIGZvbGxvd2luZyB0byBhIGZpbGUgY2FsbGVkICduZXcuY3N2JzpcbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxQYW50aGVyYSBsZW8sTGlvblxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICpcbiAqL1xucDUucHJvdG90eXBlLnNhdmVUYWJsZSA9IGZ1bmN0aW9uKHRhYmxlLCBmaWxlbmFtZSwgb3B0aW9ucykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdzYXZlVGFibGUnLCBhcmd1bWVudHMpO1xuICB2YXIgZXh0O1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXh0ID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxLCBmaWxlbmFtZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIGV4dCA9IG9wdGlvbnM7XG4gIH1cbiAgdmFyIHBXcml0ZXIgPSB0aGlzLmNyZWF0ZVdyaXRlcihmaWxlbmFtZSwgZXh0KTtcblxuICB2YXIgaGVhZGVyID0gdGFibGUuY29sdW1ucztcblxuICB2YXIgc2VwID0gJywnOyAvLyBkZWZhdWx0IHRvIENTVlxuICBpZiAoZXh0ID09PSAndHN2Jykge1xuICAgIHNlcCA9ICdcXHQnO1xuICB9XG4gIGlmIChleHQgIT09ICdodG1sJykge1xuICAgIC8vIG1ha2UgaGVhZGVyIGlmIGl0IGhhcyB2YWx1ZXNcbiAgICBpZiAoaGVhZGVyWzBdICE9PSAnMCcpIHtcbiAgICAgIGZvciAodmFyIGggPSAwOyBoIDwgaGVhZGVyLmxlbmd0aDsgaCsrKSB7XG4gICAgICAgIGlmIChoIDwgaGVhZGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBwV3JpdGVyLndyaXRlKGhlYWRlcltoXSArIHNlcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcFdyaXRlci53cml0ZShoZWFkZXJbaF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwV3JpdGVyLndyaXRlKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHJvd3NcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBqO1xuICAgICAgZm9yIChqID0gMDsgaiA8IHRhYmxlLnJvd3NbaV0uYXJyLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChqIDwgdGFibGUucm93c1tpXS5hcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHBXcml0ZXIud3JpdGUodGFibGUucm93c1tpXS5hcnJbal0gKyBzZXApO1xuICAgICAgICB9IGVsc2UgaWYgKGkgPCB0YWJsZS5yb3dzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBwV3JpdGVyLndyaXRlKHRhYmxlLnJvd3NbaV0uYXJyW2pdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwV3JpdGVyLndyaXRlKHRhYmxlLnJvd3NbaV0uYXJyW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcFdyaXRlci53cml0ZSgnXFxuJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIG90aGVyd2lzZSwgbWFrZSBIVE1MXG4gICAgcFdyaXRlci5wcmludCgnPGh0bWw+Jyk7XG4gICAgcFdyaXRlci5wcmludCgnPGhlYWQ+Jyk7XG4gICAgdmFyIHN0ciA9ICcgIDxtZXRhIGh0dHAtZXF1aXY9XCJjb250ZW50LXR5cGVcIiBjb250ZW50JztcbiAgICBzdHIgKz0gJz1cInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04XCIgLz4nO1xuICAgIHBXcml0ZXIucHJpbnQoc3RyKTtcbiAgICBwV3JpdGVyLnByaW50KCc8L2hlYWQ+Jyk7XG5cbiAgICBwV3JpdGVyLnByaW50KCc8Ym9keT4nKTtcbiAgICBwV3JpdGVyLnByaW50KCcgIDx0YWJsZT4nKTtcblxuICAgIC8vIG1ha2UgaGVhZGVyIGlmIGl0IGhhcyB2YWx1ZXNcbiAgICBpZiAoaGVhZGVyWzBdICE9PSAnMCcpIHtcbiAgICAgIHBXcml0ZXIucHJpbnQoJyAgICA8dHI+Jyk7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IGhlYWRlci5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgZSA9IGVzY2FwZUhlbHBlcihoZWFkZXJba10pO1xuICAgICAgICBwV3JpdGVyLnByaW50KCcgICAgICA8dGQ+JyArIGUpO1xuICAgICAgICBwV3JpdGVyLnByaW50KCcgICAgICA8L3RkPicpO1xuICAgICAgfVxuICAgICAgcFdyaXRlci5wcmludCgnICAgIDwvdHI+Jyk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSByb3dzXG4gICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgdGFibGUucm93cy5sZW5ndGg7IHJvdysrKSB7XG4gICAgICBwV3JpdGVyLnByaW50KCcgICAgPHRyPicpO1xuICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgdGFibGUuY29sdW1ucy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRhYmxlLnJvd3Nbcm93XS5nZXRTdHJpbmcoY29sKTtcbiAgICAgICAgdmFyIGh0bWxFbnRyeSA9IGVzY2FwZUhlbHBlcihlbnRyeSk7XG4gICAgICAgIHBXcml0ZXIucHJpbnQoJyAgICAgIDx0ZD4nICsgaHRtbEVudHJ5KTtcbiAgICAgICAgcFdyaXRlci5wcmludCgnICAgICAgPC90ZD4nKTtcbiAgICAgIH1cbiAgICAgIHBXcml0ZXIucHJpbnQoJyAgICA8L3RyPicpO1xuICAgIH1cbiAgICBwV3JpdGVyLnByaW50KCcgIDwvdGFibGU+Jyk7XG4gICAgcFdyaXRlci5wcmludCgnPC9ib2R5PicpO1xuICAgIHBXcml0ZXIucHJpbnQoJzwvaHRtbD4nKTtcbiAgfVxuICAvLyBjbG9zZSBhbmQgY2xlYXIgdGhlIHBXcml0ZXJcbiAgcFdyaXRlci5jbG9zZSgpO1xuICBwV3JpdGVyLmNsZWFyKCk7XG59OyAvLyBlbmQgc2F2ZVRhYmxlKClcblxuLyoqXG4gKiAgR2VuZXJhdGUgYSBibG9iIG9mIGZpbGUgZGF0YSBhcyBhIHVybCB0byBwcmVwYXJlIGZvciBkb3dubG9hZC5cbiAqICBBY2NlcHRzIGFuIGFycmF5IG9mIGRhdGEsIGEgZmlsZW5hbWUsIGFuZCBhbiBleHRlbnNpb24gKG9wdGlvbmFsKS5cbiAqICBUaGlzIGlzIGEgcHJpdmF0ZSBmdW5jdGlvbiBiZWNhdXNlIGl0IGRvZXMgbm90IGRvIGFueSBmb3JtYXR0aW5nLFxuICogIGJ1dCBpdCBpcyB1c2VkIGJ5IHNhdmVTdHJpbmdzLCBzYXZlSlNPTiwgc2F2ZVRhYmxlIGV0Yy5cbiAqXG4gKiAgQHBhcmFtICB7QXJyYXl9IGRhdGFUb0Rvd25sb2FkXG4gKiAgQHBhcmFtICB7U3RyaW5nfSBmaWxlbmFtZVxuICogIEBwYXJhbSAge1N0cmluZ30gW2V4dGVuc2lvbl1cbiAqICBAcHJpdmF0ZVxuICovXG5wNS5wcm90b3R5cGUud3JpdGVGaWxlID0gZnVuY3Rpb24oZGF0YVRvRG93bmxvYWQsIGZpbGVuYW1lLCBleHRlbnNpb24pIHtcbiAgdmFyIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgaWYgKHA1LnByb3RvdHlwZS5faXNTYWZhcmkoKSkge1xuICAgIHR5cGUgPSAndGV4dC9wbGFpbic7XG4gIH1cbiAgdmFyIGJsb2IgPSBuZXcgQmxvYihkYXRhVG9Eb3dubG9hZCwge1xuICAgIHR5cGU6IHR5cGVcbiAgfSk7XG4gIHA1LnByb3RvdHlwZS5kb3dubG9hZEZpbGUoYmxvYiwgZmlsZW5hbWUsIGV4dGVuc2lvbik7XG59O1xuXG4vKipcbiAqICBGb3JjZXMgZG93bmxvYWQuIEFjY2VwdHMgYSB1cmwgdG8gZmlsZWRhdGEvYmxvYiwgYSBmaWxlbmFtZSxcbiAqICBhbmQgYW4gZXh0ZW5zaW9uIChvcHRpb25hbCkuXG4gKiAgVGhpcyBpcyBhIHByaXZhdGUgZnVuY3Rpb24gYmVjYXVzZSBpdCBkb2VzIG5vdCBkbyBhbnkgZm9ybWF0dGluZyxcbiAqICBidXQgaXQgaXMgdXNlZCBieSBzYXZlU3RyaW5ncywgc2F2ZUpTT04sIHNhdmVUYWJsZSBldGMuXG4gKlxuICogIEBtZXRob2QgZG93bmxvYWRGaWxlXG4gKiAgQHByaXZhdGVcbiAqICBAcGFyYW0gIHtTdHJpbmd8QmxvYn0gZGF0YSAgICBlaXRoZXIgYW4gaHJlZiBnZW5lcmF0ZWQgYnkgY3JlYXRlT2JqZWN0VVJMLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgQmxvYiBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YVxuICogIEBwYXJhbSAge1N0cmluZ30gW2ZpbGVuYW1lXVxuICogIEBwYXJhbSAge1N0cmluZ30gW2V4dGVuc2lvbl1cbiAqL1xucDUucHJvdG90eXBlLmRvd25sb2FkRmlsZSA9IGZ1bmN0aW9uKGRhdGEsIGZOYW1lLCBleHRlbnNpb24pIHtcbiAgdmFyIGZ4ID0gX2NoZWNrRmlsZUV4dGVuc2lvbihmTmFtZSwgZXh0ZW5zaW9uKTtcbiAgdmFyIGZpbGVuYW1lID0gZnhbMF07XG5cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgdmFyIGZpbGVTYXZlciA9IF9kZXJlcV8oJ2ZpbGUtc2F2ZXInKTtcbiAgICBmaWxlU2F2ZXIuc2F2ZUFzKGRhdGEsIGZpbGVuYW1lKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgYS5ocmVmID0gZGF0YTtcbiAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuXG4gIC8vIEZpcmVmb3ggcmVxdWlyZXMgdGhlIGxpbmsgdG8gYmUgYWRkZWQgdG8gdGhlIERPTSBiZWZvcmUgY2xpY2soKVxuICBhLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgZGVzdHJveUNsaWNrZWRFbGVtZW50KGUpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH07XG5cbiAgYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuXG4gIC8vIFNhZmFyaSB3aWxsIG9wZW4gdGhpcyBmaWxlIGluIHRoZSBzYW1lIHBhZ2UgYXMgYSBjb25mdXNpbmcgQmxvYi5cbiAgaWYgKHA1LnByb3RvdHlwZS5faXNTYWZhcmkoKSkge1xuICAgIHZhciBhVGV4dCA9ICdIZWxsbywgU2FmYXJpIHVzZXIhIFRvIGRvd25sb2FkIHRoaXMgZmlsZS4uLlxcbic7XG4gICAgYVRleHQgKz0gJzEuIEdvIHRvIEZpbGUgLS0+IFNhdmUgQXMuXFxuJztcbiAgICBhVGV4dCArPSAnMi4gQ2hvb3NlIFwiUGFnZSBTb3VyY2VcIiBhcyB0aGUgRm9ybWF0Llxcbic7XG4gICAgYVRleHQgKz0gJzMuIE5hbWUgaXQgd2l0aCB0aGlzIGV4dGVuc2lvbjogLlwiJyArIGZ4WzFdICsgJ1wiJztcbiAgICBhbGVydChhVGV4dCk7XG4gIH1cbiAgYS5jbGljaygpO1xufTtcblxuLyoqXG4gKiAgUmV0dXJucyBhIGZpbGUgZXh0ZW5zaW9uLCBvciBhbm90aGVyIHN0cmluZ1xuICogIGlmIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIgaGFzIG5vIGV4dGVuc2lvbi5cbiAqXG4gKiAgQHBhcmFtICAge1N0cmluZ30gZmlsZW5hbWVcbiAqICBAcGFyYW0gICB7U3RyaW5nfSBbZXh0ZW5zaW9uXVxuICogIEByZXR1cm4gIHtTdHJpbmdbXX0gW2ZpbGVOYW1lLCBmaWxlRXh0ZW5zaW9uXVxuICpcbiAqICBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfY2hlY2tGaWxlRXh0ZW5zaW9uKGZpbGVuYW1lLCBleHRlbnNpb24pIHtcbiAgaWYgKCFleHRlbnNpb24gfHwgZXh0ZW5zaW9uID09PSB0cnVlIHx8IGV4dGVuc2lvbiA9PT0gJ3RydWUnKSB7XG4gICAgZXh0ZW5zaW9uID0gJyc7XG4gIH1cbiAgaWYgKCFmaWxlbmFtZSkge1xuICAgIGZpbGVuYW1lID0gJ3VudGl0bGVkJztcbiAgfVxuICB2YXIgZXh0ID0gJyc7XG4gIC8vIG1ha2Ugc3VyZSB0aGUgZmlsZSB3aWxsIGhhdmUgYSBuYW1lLCBzZWUgaWYgZmlsZW5hbWUgbmVlZHMgZXh0ZW5zaW9uXG4gIGlmIChmaWxlbmFtZSAmJiBmaWxlbmFtZS5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgIGV4dCA9IGZpbGVuYW1lLnNwbGl0KCcuJykucG9wKCk7XG4gIH1cbiAgLy8gYXBwZW5kIGV4dGVuc2lvbiBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gIGlmIChleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ICE9PSBleHRlbnNpb24pIHtcbiAgICAgIGV4dCA9IGV4dGVuc2lvbjtcbiAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgKyAnLicgKyBleHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBbZmlsZW5hbWUsIGV4dF07XG59XG5wNS5wcm90b3R5cGUuX2NoZWNrRmlsZUV4dGVuc2lvbiA9IF9jaGVja0ZpbGVFeHRlbnNpb247XG5cbi8qKlxuICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnJvd3NlciBpcyBTYWZhcmksIGZhbHNlIGlmIG5vdC5cbiAqICBTYWZhcmkgbWFrZXMgdHJvdWJsZSBmb3IgZG93bmxvYWRpbmcgZmlsZXMuXG4gKlxuICogIEByZXR1cm4gIHtCb29sZWFufSBbZGVzY3JpcHRpb25dXG4gKiAgQHByaXZhdGVcbiAqL1xucDUucHJvdG90eXBlLl9pc1NhZmFyaSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgeCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cuSFRNTEVsZW1lbnQpO1xuICByZXR1cm4geC5pbmRleE9mKCdDb25zdHJ1Y3RvcicpID4gMDtcbn07XG5cbi8qKlxuICogIEhlbHBlciBmdW5jdGlvbiwgYSBjYWxsYmFjayBmb3IgZG93bmxvYWQgdGhhdCBkZWxldGVzXG4gKiAgYW4gaW52aXNpYmxlIGFuY2hvciBlbGVtZW50IGZyb20gdGhlIERPTSBvbmNlIHRoZSBmaWxlXG4gKiAgaGFzIGJlZW4gYXV0b21hdGljYWxseSBkb3dubG9hZGVkLlxuICpcbiAqICBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZXN0cm95Q2xpY2tlZEVsZW1lbnQoZXZlbnQpIHtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChldmVudC50YXJnZXQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4uL2NvcmUvY29yZVwiOjIyLFwiLi4vY29yZS9lcnJvcl9oZWxwZXJzXCI6MjUsXCJlczYtcHJvbWlzZVwiOjUsXCJmZXRjaC1qc29ucFwiOjYsXCJmaWxlLXNhdmVyXCI6NyxcIndoYXR3Zy1mZXRjaFwiOjEyfV0sNDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIElPXG4gKiBAc3VibW9kdWxlIFRhYmxlXG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbi8qKlxuICogIFRhYmxlIE9wdGlvbnNcbiAqICA8cD5HZW5lcmljIGNsYXNzIGZvciBoYW5kbGluZyB0YWJ1bGFyIGRhdGEsIHR5cGljYWxseSBmcm9tIGFcbiAqICBDU1YsIFRTViwgb3Igb3RoZXIgc29ydCBvZiBzcHJlYWRzaGVldCBmaWxlLjwvcD5cbiAqICA8cD5DU1YgZmlsZXMgYXJlXG4gKiAgPGEgaHJlZj1cImh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tbWEtc2VwYXJhdGVkX3ZhbHVlc1wiPlxuICogIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXM8L2E+LCBvZnRlbiB3aXRoIHRoZSBkYXRhIGluIHF1b3Rlcy4gVFNWXG4gKiAgZmlsZXMgdXNlIHRhYnMgYXMgc2VwYXJhdG9ycywgYW5kIHVzdWFsbHkgZG9uJ3QgYm90aGVyIHdpdGggdGhlXG4gKiAgcXVvdGVzLjwvcD5cbiAqICA8cD5GaWxlIG5hbWVzIHNob3VsZCBlbmQgd2l0aCAuY3N2IGlmIHRoZXkncmUgY29tbWEgc2VwYXJhdGVkLjwvcD5cbiAqICA8cD5BIHJvdWdoIFwic3BlY1wiIGZvciBDU1YgY2FuIGJlIGZvdW5kXG4gKiAgPGEgaHJlZj1cImh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQxODBcIj5oZXJlPC9hPi48L3A+XG4gKiAgPHA+VG8gbG9hZCBmaWxlcywgdXNlIHRoZSBsb2FkVGFibGUgbWV0aG9kLjwvcD5cbiAqICA8cD5UbyBzYXZlIHRhYmxlcyB0byB5b3VyIGNvbXB1dGVyLCB1c2UgdGhlIHNhdmUgbWV0aG9kXG4gKiAgIG9yIHRoZSBzYXZlVGFibGUgbWV0aG9kLjwvcD5cbiAqXG4gKiAgUG9zc2libGUgb3B0aW9ucyBpbmNsdWRlOlxuICogIDx1bD5cbiAqICA8bGk+Y3N2IC0gcGFyc2UgdGhlIHRhYmxlIGFzIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXNcbiAqICA8bGk+dHN2IC0gcGFyc2UgdGhlIHRhYmxlIGFzIHRhYi1zZXBhcmF0ZWQgdmFsdWVzXG4gKiAgPGxpPmhlYWRlciAtIHRoaXMgdGFibGUgaGFzIGEgaGVhZGVyICh0aXRsZSkgcm93XG4gKiAgPC91bD5cbiAqL1xuXG4vKipcbiAqICBUYWJsZSBvYmplY3RzIHN0b3JlIGRhdGEgd2l0aCBtdWx0aXBsZSByb3dzIGFuZCBjb2x1bW5zLCBtdWNoXG4gKiAgbGlrZSBpbiBhIHRyYWRpdGlvbmFsIHNwcmVhZHNoZWV0LiBUYWJsZXMgY2FuIGJlIGdlbmVyYXRlZCBmcm9tXG4gKiAgc2NyYXRjaCwgZHluYW1pY2FsbHksIG9yIHVzaW5nIGRhdGEgZnJvbSBhbiBleGlzdGluZyBmaWxlLlxuICpcbiAqICBAY2xhc3MgcDUuVGFibGVcbiAqICBAY29uc3RydWN0b3JcbiAqICBAcGFyYW0gIHtwNS5UYWJsZVJvd1tdfSAgICAgW3Jvd3NdIEFuIGFycmF5IG9mIHA1LlRhYmxlUm93IG9iamVjdHNcbiAqL1xucDUuVGFibGUgPSBmdW5jdGlvbihyb3dzKSB7XG4gIC8qKlxuICAgKiAgQHByb3BlcnR5IGNvbHVtbnMge1N0cmluZ1tdfVxuICAgKi9cbiAgdGhpcy5jb2x1bW5zID0gW107XG5cbiAgLyoqXG4gICAqICBAcHJvcGVydHkgcm93cyB7cDUuVGFibGVSb3dbXX1cbiAgICovXG4gIHRoaXMucm93cyA9IFtdO1xufTtcblxuLyoqXG4gKiAgVXNlIGFkZFJvdygpIHRvIGFkZCBhIG5ldyByb3cgb2YgZGF0YSB0byBhIHA1LlRhYmxlIG9iamVjdC4gQnkgZGVmYXVsdCxcbiAqICBhbiBlbXB0eSByb3cgaXMgY3JlYXRlZC4gVHlwaWNhbGx5LCB5b3Ugd291bGQgc3RvcmUgYSByZWZlcmVuY2UgdG9cbiAqICB0aGUgbmV3IHJvdyBpbiBhIFRhYmxlUm93IG9iamVjdCAoc2VlIG5ld1JvdyBpbiB0aGUgZXhhbXBsZSBhYm92ZSksXG4gKiAgYW5kIHRoZW4gc2V0IGluZGl2aWR1YWwgdmFsdWVzIHVzaW5nIHNldCgpLlxuICpcbiAqICBJZiBhIHA1LlRhYmxlUm93IG9iamVjdCBpcyBpbmNsdWRlZCBhcyBhIHBhcmFtZXRlciwgdGhlbiB0aGF0IHJvdyBpc1xuICogIGR1cGxpY2F0ZWQgYW5kIGFkZGVkIHRvIHRoZSB0YWJsZS5cbiAqXG4gKiAgQG1ldGhvZCAgYWRkUm93XG4gKiAgQHBhcmFtICAge3A1LlRhYmxlUm93fSBbcm93XSByb3cgdG8gYmUgYWRkZWQgdG8gdGhlIHRhYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXCJtYW1tYWxzLmNzdlwiXG4gKiAvLyBpbiB0aGUgcHJvamVjdCdzIFwiYXNzZXRzXCIgZm9sZGVyOlxuICogLy9cbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxDYXByYSBoaXJjdXMsR29hdFxuICogLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxuICogLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxuICpcbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcImNzdlwiXG4gKiAgIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xuICogICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgLy9hZGQgYSByb3dcbiAqICAgdmFyIG5ld1JvdyA9IHRhYmxlLmFkZFJvdygpO1xuICogICBuZXdSb3cuc2V0U3RyaW5nKCdpZCcsIHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTtcbiAqICAgbmV3Um93LnNldFN0cmluZygnc3BlY2llcycsICdDYW5pcyBMdXB1cycpO1xuICogICBuZXdSb3cuc2V0U3RyaW5nKCduYW1lJywgJ1dvbGYnKTtcbiAqXG4gKiAgIC8vcHJpbnQgdGhlIHJlc3VsdHNcbiAqICAgZm9yICh2YXIgciA9IDA7IHIgPCB0YWJsZS5nZXRSb3dDb3VudCgpOyByKyspXG4gKiAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOyBjKyspXG4gKiAgICAgICBwcmludCh0YWJsZS5nZXRTdHJpbmcociwgYykpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUuYWRkUm93ID0gZnVuY3Rpb24ocm93KSB7XG4gIC8vIG1ha2Ugc3VyZSBpdCBpcyBhIHZhbGlkIFRhYmxlUm93XG4gIHZhciByID0gcm93IHx8IG5ldyBwNS5UYWJsZVJvdygpO1xuXG4gIGlmICh0eXBlb2Ygci5hcnIgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiByLm9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvL3IgPSBuZXcgcDUucHJvdG90eXBlLlRhYmxlUm93KHIpO1xuICAgIHRocm93ICdpbnZhbGlkIFRhYmxlUm93OiAnICsgcjtcbiAgfVxuICByLnRhYmxlID0gdGhpcztcbiAgdGhpcy5yb3dzLnB1c2gocik7XG4gIHJldHVybiByO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGEgcm93IGZyb20gdGhlIHRhYmxlIG9iamVjdC5cbiAqXG4gKiBAbWV0aG9kICByZW1vdmVSb3dcbiAqIEBwYXJhbSAgIHtJbnRlZ2VyfSBpZCBJRCBudW1iZXIgb2YgdGhlIHJvdyB0byByZW1vdmVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIC8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcIm1hbW1hbHMuY3N2XCJcbiAqIC8vIGluIHRoZSBwcm9qZWN0J3MgXCJhc3NldHNcIiBmb2xkZXI6XG4gKiAvL1xuICogLy8gaWQsc3BlY2llcyxuYW1lXG4gKiAvLyAwLENhcHJhIGhpcmN1cyxHb2F0XG4gKiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXG4gKiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXG4gKlxuICogdmFyIHRhYmxlO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFwiY3N2XCJcbiAqICAgLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXG4gKiAgIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICAvL3JlbW92ZSB0aGUgZmlyc3Qgcm93XG4gKiAgIHRhYmxlLnJlbW92ZVJvdygwKTtcbiAqXG4gKiAgIC8vcHJpbnQgdGhlIHJlc3VsdHNcbiAqICAgZm9yICh2YXIgciA9IDA7IHIgPCB0YWJsZS5nZXRSb3dDb3VudCgpOyByKyspXG4gKiAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOyBjKyspXG4gKiAgICAgICBwcmludCh0YWJsZS5nZXRTdHJpbmcociwgYykpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUucmVtb3ZlUm93ID0gZnVuY3Rpb24oaWQpIHtcbiAgdGhpcy5yb3dzW2lkXS50YWJsZSA9IG51bGw7IC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gdGFibGVcbiAgdmFyIGNodW5rID0gdGhpcy5yb3dzLnNwbGljZShpZCArIDEsIHRoaXMucm93cy5sZW5ndGgpO1xuICB0aGlzLnJvd3MucG9wKCk7XG4gIHRoaXMucm93cyA9IHRoaXMucm93cy5jb25jYXQoY2h1bmspO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgcDUuVGFibGVSb3cuIFRoZSByZWZlcmVuY2VcbiAqIGNhbiB0aGVuIGJlIHVzZWQgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIHRoZSBzZWxlY3RlZCByb3cuXG4gKlxuICogQG1ldGhvZCAgZ2V0Um93XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSAgIHJvd0lEIElEIG51bWJlciBvZiB0aGUgcm93IHRvIGdldFxuICogQHJldHVybiB7cDUuVGFibGVSb3d9IHA1LlRhYmxlUm93IG9iamVjdFxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIlxuICogLy8gaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlcjpcbiAqIC8vXG4gKiAvLyBpZCxzcGVjaWVzLG5hbWVcbiAqIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcbiAqIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcbiAqIC8vIDIsRXF1dXMgemVicmEsWmVicmFcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJjc3ZcIlxuICogICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciByb3cgPSB0YWJsZS5nZXRSb3coMSk7XG4gKiAgIC8vcHJpbnQgaXQgY29sdW1uIGJ5IGNvbHVtblxuICogICAvL25vdGU6IGEgcm93IGlzIGFuIG9iamVjdCwgbm90IGFuIGFycmF5XG4gKiAgIGZvciAodmFyIGMgPSAwOyBjIDwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsgYysrKSB7XG4gKiAgICAgcHJpbnQocm93LmdldFN0cmluZyhjKSk7XG4gKiAgIH1cbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUuZ2V0Um93ID0gZnVuY3Rpb24ocikge1xuICByZXR1cm4gdGhpcy5yb3dzW3JdO1xufTtcblxuLyoqXG4gKiAgR2V0cyBhbGwgcm93cyBmcm9tIHRoZSB0YWJsZS4gUmV0dXJucyBhbiBhcnJheSBvZiBwNS5UYWJsZVJvd3MuXG4gKlxuICogIEBtZXRob2QgIGdldFJvd3NcbiAqICBAcmV0dXJuIHtwNS5UYWJsZVJvd1tdfSAgIEFycmF5IG9mIHA1LlRhYmxlUm93c1xuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIlxuICogLy8gaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlcjpcbiAqIC8vXG4gKiAvLyBpZCxzcGVjaWVzLG5hbWVcbiAqIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcbiAqIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcbiAqIC8vIDIsRXF1dXMgemVicmEsWmVicmFcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJjc3ZcIlxuICogICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciByb3dzID0gdGFibGUuZ2V0Um93cygpO1xuICpcbiAqICAgLy93YXJuaW5nOiByb3dzIGlzIGFuIGFycmF5IG9mIG9iamVjdHNcbiAqICAgZm9yICh2YXIgciA9IDA7IHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gKiAgICAgcm93c1tyXS5zZXQoJ25hbWUnLCAnVW5pY29ybicpO1xuICogICB9XG4gKlxuICogICAvL3ByaW50IHRoZSByZXN1bHRzXG4gKiAgIGZvciAociA9IDA7IHIgPCB0YWJsZS5nZXRSb3dDb3VudCgpOyByKyspXG4gKiAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOyBjKyspXG4gKiAgICAgICBwcmludCh0YWJsZS5nZXRTdHJpbmcociwgYykpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUuZ2V0Um93cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5yb3dzO1xufTtcblxuLyoqXG4gKiAgRmluZHMgdGhlIGZpcnN0IHJvdyBpbiB0aGUgVGFibGUgdGhhdCBjb250YWlucyB0aGUgdmFsdWVcbiAqICBwcm92aWRlZCwgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhhdCByb3cuIEV2ZW4gaWZcbiAqICBtdWx0aXBsZSByb3dzIGFyZSBwb3NzaWJsZSBtYXRjaGVzLCBvbmx5IHRoZSBmaXJzdCBtYXRjaGluZ1xuICogIHJvdyBpcyByZXR1cm5lZC4gVGhlIGNvbHVtbiB0byBzZWFyY2ggbWF5IGJlIHNwZWNpZmllZCBieVxuICogIGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuXG4gKlxuICogIEBtZXRob2QgIGZpbmRSb3dcbiAqICBAcGFyYW0gIHtTdHJpbmd9IHZhbHVlICBUaGUgdmFsdWUgdG8gbWF0Y2hcbiAqICBAcGFyYW0gIHtJbnRlZ2VyfFN0cmluZ30gY29sdW1uIElEIG51bWJlciBvciB0aXRsZSBvZiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uIHRvIHNlYXJjaFxuICogIEByZXR1cm4ge3A1LlRhYmxlUm93fVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIlxuICogLy8gaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlcjpcbiAqIC8vXG4gKiAvLyBpZCxzcGVjaWVzLG5hbWVcbiAqIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcbiAqIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcbiAqIC8vIDIsRXF1dXMgemVicmEsWmVicmFcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJjc3ZcIlxuICogICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIC8vZmluZCB0aGUgYW5pbWFsIG5hbWVkIHplYnJhXG4gKiAgIHZhciByb3cgPSB0YWJsZS5maW5kUm93KCdaZWJyYScsICduYW1lJyk7XG4gKiAgIC8vZmluZCB0aGUgY29ycmVzcG9uZGluZyBzcGVjaWVzXG4gKiAgIHByaW50KHJvdy5nZXRTdHJpbmcoJ3NwZWNpZXMnKSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqXG4gKi9cbnA1LlRhYmxlLnByb3RvdHlwZS5maW5kUm93ID0gZnVuY3Rpb24odmFsdWUsIGNvbHVtbikge1xuICAvLyB0cnkgdGhlIE9iamVjdFxuICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucm93c1tpXS5vYmpbY29sdW1uXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93c1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gdHJ5IHRoZSBBcnJheVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5yb3dzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAodGhpcy5yb3dzW2pdLmFycltjb2x1bW5dID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dzW2pdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBvdGhlcndpc2UuLi5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqICBGaW5kcyB0aGUgcm93cyBpbiB0aGUgVGFibGUgdGhhdCBjb250YWluIHRoZSB2YWx1ZVxuICogIHByb3ZpZGVkLCBhbmQgcmV0dXJucyByZWZlcmVuY2VzIHRvIHRob3NlIHJvd3MuIFJldHVybnMgYW5cbiAqICBBcnJheSwgc28gZm9yIG11c3QgYmUgdXNlZCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSByb3dzLFxuICogIGFzIHNob3duIGluIHRoZSBleGFtcGxlIGFib3ZlLiBUaGUgY29sdW1uIHRvIHNlYXJjaCBtYXkgYmVcbiAqICBzcGVjaWZpZWQgYnkgZWl0aGVyIGl0cyBJRCBvciB0aXRsZS5cbiAqXG4gKiAgQG1ldGhvZCAgZmluZFJvd3NcbiAqICBAcGFyYW0gIHtTdHJpbmd9IHZhbHVlICBUaGUgdmFsdWUgdG8gbWF0Y2hcbiAqICBAcGFyYW0gIHtJbnRlZ2VyfFN0cmluZ30gY29sdW1uIElEIG51bWJlciBvciB0aXRsZSBvZiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uIHRvIHNlYXJjaFxuICogIEByZXR1cm4ge3A1LlRhYmxlUm93W119ICAgICAgICBBbiBBcnJheSBvZiBUYWJsZVJvdyBvYmplY3RzXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXCJtYW1tYWxzLmNzdlwiXG4gKiAvLyBpbiB0aGUgcHJvamVjdCdzIFwiYXNzZXRzXCIgZm9sZGVyOlxuICogLy9cbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxDYXByYSBoaXJjdXMsR29hdFxuICogLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxuICogLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxuICpcbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcImNzdlwiXG4gKiAgIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xuICogICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgLy9hZGQgYW5vdGhlciBnb2F0XG4gKiAgIHZhciBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcbiAqICAgbmV3Um93LnNldFN0cmluZygnaWQnLCB0YWJsZS5nZXRSb3dDb3VudCgpIC0gMSk7XG4gKiAgIG5ld1Jvdy5zZXRTdHJpbmcoJ3NwZWNpZXMnLCAnU2NhcGUgR29hdCcpO1xuICogICBuZXdSb3cuc2V0U3RyaW5nKCduYW1lJywgJ0dvYXQnKTtcbiAqXG4gKiAgIC8vZmluZCB0aGUgcm93cyBjb250YWluaW5nIGFuaW1hbHMgbmFtZWQgR29hdFxuICogICB2YXIgcm93cyA9IHRhYmxlLmZpbmRSb3dzKCdHb2F0JywgJ25hbWUnKTtcbiAqICAgcHJpbnQocm93cy5sZW5ndGggKyAnIEdvYXRzIGZvdW5kJyk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKkBhbHRcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICpcbiAqL1xucDUuVGFibGUucHJvdG90eXBlLmZpbmRSb3dzID0gZnVuY3Rpb24odmFsdWUsIGNvbHVtbikge1xuICB2YXIgcmV0ID0gW107XG4gIGlmICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5yb3dzW2ldLm9ialtjb2x1bW5dID09PSB2YWx1ZSkge1xuICAgICAgICByZXQucHVzaCh0aGlzLnJvd3NbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyB0cnkgdGhlIEFycmF5XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLnJvd3MubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmICh0aGlzLnJvd3Nbal0uYXJyW2NvbHVtbl0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldC5wdXNoKHRoaXMucm93c1tqXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59O1xuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCByb3cgaW4gdGhlIFRhYmxlIHRoYXQgbWF0Y2hlcyB0aGUgcmVndWxhclxuICogZXhwcmVzc2lvbiBwcm92aWRlZCwgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhhdCByb3cuXG4gKiBFdmVuIGlmIG11bHRpcGxlIHJvd3MgYXJlIHBvc3NpYmxlIG1hdGNoZXMsIG9ubHkgdGhlIGZpcnN0XG4gKiBtYXRjaGluZyByb3cgaXMgcmV0dXJuZWQuIFRoZSBjb2x1bW4gdG8gc2VhcmNoIG1heSBiZVxuICogc3BlY2lmaWVkIGJ5IGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuXG4gKlxuICogQG1ldGhvZCAgbWF0Y2hSb3dcbiAqIEBwYXJhbSAge1N0cmluZ3xSZWdFeHB9IHJlZ2V4cCBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoXG4gKiBAcGFyYW0gIHtTdHJpbmd8SW50ZWdlcn0gY29sdW1uIFRoZSBjb2x1bW4gSUQgKG51bWJlcikgb3JcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlIChzdHJpbmcpXG4gKiBAcmV0dXJuIHtwNS5UYWJsZVJvd30gICAgICAgIFRhYmxlUm93IG9iamVjdFxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIlxuICogLy8gaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlcjpcbiAqIC8vXG4gKiAvLyBpZCxzcGVjaWVzLG5hbWVcbiAqIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcbiAqIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcbiAqIC8vIDIsRXF1dXMgemVicmEsWmVicmFcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJjc3ZcIlxuICogICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIC8vU2VhcmNoIHVzaW5nIHNwZWNpZmllZCByZWdleCBvbiBhIGdpdmVuIGNvbHVtbiwgcmV0dXJuIFRhYmxlUm93IG9iamVjdFxuICogICB2YXIgbWFtbWFsID0gdGFibGUubWF0Y2hSb3cobmV3IFJlZ0V4cCgnYW50JyksIDEpO1xuICogICBwcmludChtYW1tYWwuZ2V0U3RyaW5nKDEpKTtcbiAqICAgLy9PdXRwdXQgXCJQYW50aGVyYSBwYXJkdXNcIlxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUubWF0Y2hSb3cgPSBmdW5jdGlvbihyZWdleHAsIGNvbHVtbikge1xuICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMucm93cy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKHRoaXMucm93c1tqXS5hcnJbY29sdW1uXS5tYXRjaChyZWdleHApKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3Nbal07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5yb3dzW2ldLm9ialtjb2x1bW5dLm1hdGNoKHJlZ2V4cCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93c1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEZpbmRzIHRoZSByb3dzIGluIHRoZSBUYWJsZSB0aGF0IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcHJvdmlkZWQsXG4gKiBhbmQgcmV0dXJucyByZWZlcmVuY2VzIHRvIHRob3NlIHJvd3MuIFJldHVybnMgYW4gYXJyYXksIHNvIGZvciBtdXN0IGJlXG4gKiB1c2VkIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHJvd3MsIGFzIHNob3duIGluIHRoZSBleGFtcGxlLiBUaGVcbiAqIGNvbHVtbiB0byBzZWFyY2ggbWF5IGJlIHNwZWNpZmllZCBieSBlaXRoZXIgaXRzIElEIG9yIHRpdGxlLlxuICpcbiAqIEBtZXRob2QgIG1hdGNoUm93c1xuICogQHBhcmFtICB7U3RyaW5nfSByZWdleHAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaFxuICogQHBhcmFtICB7U3RyaW5nfEludGVnZXJ9IFtjb2x1bW5dIFRoZSBjb2x1bW4gSUQgKG51bWJlcikgb3JcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlIChzdHJpbmcpXG4gKiBAcmV0dXJuIHtwNS5UYWJsZVJvd1tdfSAgICAgICAgICBBbiBBcnJheSBvZiBUYWJsZVJvdyBvYmplY3RzXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdGFibGUgPSBuZXcgcDUuVGFibGUoKTtcbiAqXG4gKiAgIHRhYmxlLmFkZENvbHVtbignbmFtZScpO1xuICogICB0YWJsZS5hZGRDb2x1bW4oJ3R5cGUnKTtcbiAqXG4gKiAgIHZhciBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcbiAqICAgbmV3Um93LnNldFN0cmluZygnbmFtZScsICdMaW9uJyk7XG4gKiAgIG5ld1Jvdy5zZXRTdHJpbmcoJ3R5cGUnLCAnTWFtbWFsJyk7XG4gKlxuICogICBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcbiAqICAgbmV3Um93LnNldFN0cmluZygnbmFtZScsICdTbmFrZScpO1xuICogICBuZXdSb3cuc2V0U3RyaW5nKCd0eXBlJywgJ1JlcHRpbGUnKTtcbiAqXG4gKiAgIG5ld1JvdyA9IHRhYmxlLmFkZFJvdygpO1xuICogICBuZXdSb3cuc2V0U3RyaW5nKCduYW1lJywgJ01vc3F1aXRvJyk7XG4gKiAgIG5ld1Jvdy5zZXRTdHJpbmcoJ3R5cGUnLCAnSW5zZWN0Jyk7XG4gKlxuICogICBuZXdSb3cgPSB0YWJsZS5hZGRSb3coKTtcbiAqICAgbmV3Um93LnNldFN0cmluZygnbmFtZScsICdMaXphcmQnKTtcbiAqICAgbmV3Um93LnNldFN0cmluZygndHlwZScsICdSZXB0aWxlJyk7XG4gKlxuICogICB2YXIgcm93cyA9IHRhYmxlLm1hdGNoUm93cygnUi4qJywgJ3R5cGUnKTtcbiAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gKiAgICAgcHJpbnQocm93c1tpXS5nZXRTdHJpbmcoJ25hbWUnKSArICc6ICcgKyByb3dzW2ldLmdldFN0cmluZygndHlwZScpKTtcbiAqICAgfVxuICogfVxuICogLy8gU2tldGNoIHByaW50czpcbiAqIC8vIFNuYWtlOiBSZXB0aWxlXG4gKiAvLyBMaXphcmQ6IFJlcHRpbGVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUubWF0Y2hSb3dzID0gZnVuY3Rpb24ocmVnZXhwLCBjb2x1bW4pIHtcbiAgdmFyIHJldCA9IFtdO1xuICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMucm93cy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKHRoaXMucm93c1tqXS5hcnJbY29sdW1uXS5tYXRjaChyZWdleHApKSB7XG4gICAgICAgIHJldC5wdXNoKHRoaXMucm93c1tqXSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5yb3dzW2ldLm9ialtjb2x1bW5dLm1hdGNoKHJlZ2V4cCkpIHtcbiAgICAgICAgcmV0LnB1c2godGhpcy5yb3dzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8qKlxuICogIFJldHJpZXZlcyBhbGwgdmFsdWVzIGluIHRoZSBzcGVjaWZpZWQgY29sdW1uLCBhbmQgcmV0dXJucyB0aGVtXG4gKiAgYXMgYW4gYXJyYXkuIFRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZCBieSBlaXRoZXIgaXRzIElEIG9yIHRpdGxlLlxuICpcbiAqICBAbWV0aG9kICBnZXRDb2x1bW5cbiAqICBAcGFyYW0gIHtTdHJpbmd8TnVtYmVyfSBjb2x1bW4gU3RyaW5nIG9yIE51bWJlciBvZiB0aGUgY29sdW1uIHRvIHJldHVyblxuICogIEByZXR1cm4ge0FycmF5fSAgICAgICBBcnJheSBvZiBjb2x1bW4gdmFsdWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXCJtYW1tYWxzLmNzdlwiXG4gKiAvLyBpbiB0aGUgcHJvamVjdCdzIFwiYXNzZXRzXCIgZm9sZGVyOlxuICogLy9cbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxDYXByYSBoaXJjdXMsR29hdFxuICogLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxuICogLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxuICpcbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcImNzdlwiXG4gKiAgIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xuICogICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgLy9nZXRDb2x1bW4gcmV0dXJucyBhbiBhcnJheSB0aGF0IGNhbiBiZSBwcmludGVkIGRpcmVjdGx5XG4gKiAgIHByaW50KHRhYmxlLmdldENvbHVtbignc3BlY2llcycpKTtcbiAqICAgLy9vdXRwdXRzIFtcIkNhcHJhIGhpcmN1c1wiLCBcIlBhbnRoZXJhIHBhcmR1c1wiLCBcIkVxdXVzIHplYnJhXCJdXG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKkBhbHRcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICpcbiAqL1xucDUuVGFibGUucHJvdG90eXBlLmdldENvbHVtbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciByZXQgPSBbXTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0LnB1c2godGhpcy5yb3dzW2ldLm9ialt2YWx1ZV0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMucm93cy5sZW5ndGg7IGorKykge1xuICAgICAgcmV0LnB1c2godGhpcy5yb3dzW2pdLmFyclt2YWx1ZV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiAgUmVtb3ZlcyBhbGwgcm93cyBmcm9tIGEgVGFibGUuIFdoaWxlIGFsbCByb3dzIGFyZSByZW1vdmVkLFxuICogIGNvbHVtbnMgYW5kIGNvbHVtbiB0aXRsZXMgYXJlIG1haW50YWluZWQuXG4gKlxuICogIEBtZXRob2QgIGNsZWFyUm93c1xuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIlxuICogLy8gaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlcjpcbiAqIC8vXG4gKiAvLyBpZCxzcGVjaWVzLG5hbWVcbiAqIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcbiAqIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcbiAqIC8vIDIsRXF1dXMgemVicmEsWmVicmFcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJjc3ZcIlxuICogICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHRhYmxlLmNsZWFyUm93cygpO1xuICogICBwcmludCh0YWJsZS5nZXRSb3dDb3VudCgpICsgJyB0b3RhbCByb3dzIGluIHRhYmxlJyk7XG4gKiAgIHByaW50KHRhYmxlLmdldENvbHVtbkNvdW50KCkgKyAnIHRvdGFsIGNvbHVtbnMgaW4gdGFibGUnKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUuY2xlYXJSb3dzID0gZnVuY3Rpb24oKSB7XG4gIGRlbGV0ZSB0aGlzLnJvd3M7XG4gIHRoaXMucm93cyA9IFtdO1xufTtcblxuLyoqXG4gKiAgVXNlIGFkZENvbHVtbigpIHRvIGFkZCBhIG5ldyBjb2x1bW4gdG8gYSBUYWJsZSBvYmplY3QuXG4gKiAgVHlwaWNhbGx5LCB5b3Ugd2lsbCB3YW50IHRvIHNwZWNpZnkgYSB0aXRsZSwgc28gdGhlIGNvbHVtblxuICogIG1heSBiZSBlYXNpbHkgcmVmZXJlbmNlZCBsYXRlciBieSBuYW1lLiAoSWYgbm8gdGl0bGUgaXNcbiAqICBzcGVjaWZpZWQsIHRoZSBuZXcgY29sdW1uJ3MgdGl0bGUgd2lsbCBiZSBudWxsLilcbiAqXG4gKiAgQG1ldGhvZCAgYWRkQ29sdW1uXG4gKiAgQHBhcmFtIHtTdHJpbmd9IFt0aXRsZV0gdGl0bGUgb2YgdGhlIGdpdmVuIGNvbHVtblxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIlxuICogLy8gaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlcjpcbiAqIC8vXG4gKiAvLyBpZCxzcGVjaWVzLG5hbWVcbiAqIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcbiAqIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcbiAqIC8vIDIsRXF1dXMgemVicmEsWmVicmFcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJjc3ZcIlxuICogICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHRhYmxlLmFkZENvbHVtbignY2Fybml2b3JlJyk7XG4gKiAgIHRhYmxlLnNldCgwLCAnY2Fybml2b3JlJywgJ25vJyk7XG4gKiAgIHRhYmxlLnNldCgxLCAnY2Fybml2b3JlJywgJ3llcycpO1xuICogICB0YWJsZS5zZXQoMiwgJ2Nhcm5pdm9yZScsICdubycpO1xuICpcbiAqICAgLy9wcmludCB0aGUgcmVzdWx0c1xuICogICBmb3IgKHZhciByID0gMDsgciA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHIrKylcbiAqICAgICBmb3IgKHZhciBjID0gMDsgYyA8IHRhYmxlLmdldENvbHVtbkNvdW50KCk7IGMrKylcbiAqICAgICAgIHByaW50KHRhYmxlLmdldFN0cmluZyhyLCBjKSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKkBhbHRcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICpcbiAqL1xucDUuVGFibGUucHJvdG90eXBlLmFkZENvbHVtbiA9IGZ1bmN0aW9uKHRpdGxlKSB7XG4gIHZhciB0ID0gdGl0bGUgfHwgbnVsbDtcbiAgdGhpcy5jb2x1bW5zLnB1c2godCk7XG59O1xuXG4vKipcbiAqICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY29sdW1ucyBpbiBhIFRhYmxlLlxuICpcbiAqICBAbWV0aG9kICBnZXRDb2x1bW5Db3VudFxuICogIEByZXR1cm4ge0ludGVnZXJ9IE51bWJlciBvZiBjb2x1bW5zIGluIHRoaXMgdGFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBnaXZlbiB0aGUgY3ZzIGZpbGUgXCJibG9icy5jc3ZcIiBpbiAvYXNzZXRzIGRpcmVjdG9yeVxuICogLy8gSUQsIE5hbWUsIEZsYXZvciwgU2hhcGUsIENvbG9yXG4gKiAvLyBCbG9iMSwgQmxvYmJ5LCBTd2VldCwgQmxvYiwgUGlua1xuICogLy8gQmxvYjIsIFNhZGR5LCBTYXZvcnksIEJsb2IsIEJsdWVcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9ibG9icy5jc3YnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDIwMCwgMTAwKTtcbiAqICAgdGV4dEFsaWduKENFTlRFUik7XG4gKiAgIGJhY2tncm91bmQoMjU1KTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICB2YXIgbnVtT2ZDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Db3VudCgpO1xuICogICB0ZXh0KCdUaGVyZSBhcmUgJyArIG51bU9mQ29sdW1uICsgJyBjb2x1bW5zIGluIHRoZSB0YWJsZS4nLCAxMDAsIDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUuZ2V0Q29sdW1uQ291bnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY29sdW1ucy5sZW5ndGg7XG59O1xuXG4vKipcbiAqICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyBpbiBhIFRhYmxlLlxuICpcbiAqICBAbWV0aG9kICBnZXRSb3dDb3VudFxuICogIEByZXR1cm4ge0ludGVnZXJ9IE51bWJlciBvZiByb3dzIGluIHRoaXMgdGFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBnaXZlbiB0aGUgY3ZzIGZpbGUgXCJibG9icy5jc3ZcIiBpbiAvYXNzZXRzIGRpcmVjdG9yeVxuICogLy9cbiAqIC8vIElELCBOYW1lLCBGbGF2b3IsIFNoYXBlLCBDb2xvclxuICogLy8gQmxvYjEsIEJsb2JieSwgU3dlZXQsIEJsb2IsIFBpbmtcbiAqIC8vIEJsb2IyLCBTYWRkeSwgU2F2b3J5LCBCbG9iLCBCbHVlXG4gKlxuICogdmFyIHRhYmxlO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvYmxvYnMuY3N2Jyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygyMDAsIDEwMCk7XG4gKiAgIHRleHRBbGlnbihDRU5URVIpO1xuICogICBiYWNrZ3JvdW5kKDI1NSk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgdGV4dCgnVGhlcmUgYXJlICcgKyB0YWJsZS5nZXRSb3dDb3VudCgpICsgJyByb3dzIGluIHRoZSB0YWJsZS4nLCAxMDAsIDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUuZ2V0Um93Q291bnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucm93cy5sZW5ndGg7XG59O1xuXG4vKipcbiAqICA8cD5SZW1vdmVzIGFueSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcnMgKG9yIFwidG9rZW5zXCIpLjwvcD5cbiAqXG4gKiAgPHA+SWYgbm8gY29sdW1uIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgdmFsdWVzIGluIGFsbCBjb2x1bW5zIGFuZFxuICogIHJvd3MgYXJlIHByb2Nlc3NlZC4gQSBzcGVjaWZpYyBjb2x1bW4gbWF5IGJlIHJlZmVyZW5jZWQgYnlcbiAqICBlaXRoZXIgaXRzIElEIG9yIHRpdGxlLjwvcD5cbiAqXG4gKiAgQG1ldGhvZCAgcmVtb3ZlVG9rZW5zXG4gKiAgQHBhcmFtICB7U3RyaW5nfSBjaGFycyAgU3RyaW5nIGxpc3RpbmcgY2hhcmFjdGVycyB0byBiZSByZW1vdmVkXG4gKiAgQHBhcmFtICB7U3RyaW5nfEludGVnZXJ9IFtjb2x1bW5dIENvbHVtbiBJRCAobnVtYmVyKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5hbWUgKHN0cmluZylcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIHRhYmxlID0gbmV3IHA1LlRhYmxlKCk7XG4gKlxuICogICB0YWJsZS5hZGRDb2x1bW4oJ25hbWUnKTtcbiAqICAgdGFibGUuYWRkQ29sdW1uKCd0eXBlJyk7XG4gKlxuICogICB2YXIgbmV3Um93ID0gdGFibGUuYWRkUm93KCk7XG4gKiAgIG5ld1Jvdy5zZXRTdHJpbmcoJ25hbWUnLCAnICAgJExpb24gICwnKTtcbiAqICAgbmV3Um93LnNldFN0cmluZygndHlwZScsICcsLCxNYW1tYWwnKTtcbiAqXG4gKiAgIG5ld1JvdyA9IHRhYmxlLmFkZFJvdygpO1xuICogICBuZXdSb3cuc2V0U3RyaW5nKCduYW1lJywgJyRTbmFrZSAgJyk7XG4gKiAgIG5ld1Jvdy5zZXRTdHJpbmcoJ3R5cGUnLCAnLCwsUmVwdGlsZScpO1xuICpcbiAqICAgdGFibGUucmVtb3ZlVG9rZW5zKCcsJCAnKTtcbiAqICAgcHJpbnQodGFibGUuZ2V0QXJyYXkoKSk7XG4gKiB9XG4gKlxuICogLy8gcHJpbnRzOlxuICogLy8gIDAgIFwiTGlvblwiICAgXCJNYW1hbFwiXG4gKiAvLyAgMSAgXCJTbmFrZVwiICBcIlJlcHRpbGVcIlxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUucmVtb3ZlVG9rZW5zID0gZnVuY3Rpb24oY2hhcnMsIGNvbHVtbikge1xuICB2YXIgZXNjYXBlID0gZnVuY3Rpb24ocykge1xuICAgIHJldHVybiBzLnJlcGxhY2UoL1stL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgfTtcbiAgdmFyIGNoYXJBcnJheSA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhckFycmF5LnB1c2goZXNjYXBlKGNoYXJzLmNoYXJBdChpKSkpO1xuICB9XG4gIHZhciByZWdleCA9IG5ldyBSZWdFeHAoY2hhckFycmF5LmpvaW4oJ3wnKSwgJ2cnKTtcblxuICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGMrKykge1xuICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCB0aGlzLnJvd3MubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgdmFyIHMgPSB0aGlzLnJvd3NbZF0uYXJyW2NdO1xuICAgICAgICBzID0gcy5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAgICAgIHRoaXMucm93c1tkXS5hcnJbY10gPSBzO1xuICAgICAgICB0aGlzLnJvd3NbZF0ub2JqW3RoaXMuY29sdW1uc1tjXV0gPSBzO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5yb3dzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgdmFsID0gdGhpcy5yb3dzW2pdLm9ialtjb2x1bW5dO1xuICAgICAgdmFsID0gdmFsLnJlcGxhY2UocmVnZXgsICcnKTtcbiAgICAgIHRoaXMucm93c1tqXS5vYmpbY29sdW1uXSA9IHZhbDtcbiAgICAgIHZhciBwb3MgPSB0aGlzLmNvbHVtbnMuaW5kZXhPZihjb2x1bW4pO1xuICAgICAgdGhpcy5yb3dzW2pdLmFycltwb3NdID0gdmFsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMucm93cy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIHN0ciA9IHRoaXMucm93c1trXS5hcnJbY29sdW1uXTtcbiAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAgICB0aGlzLnJvd3Nba10uYXJyW2NvbHVtbl0gPSBzdHI7XG4gICAgICB0aGlzLnJvd3Nba10ub2JqW3RoaXMuY29sdW1uc1tjb2x1bW5dXSA9IHN0cjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogIFRyaW1zIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UsIHN1Y2ggYXMgc3BhY2VzIGFuZCB0YWJzLFxuICogIGZyb20gU3RyaW5nIHRhYmxlIHZhbHVlcy4gSWYgbm8gY29sdW1uIGlzIHNwZWNpZmllZCwgdGhlbiB0aGVcbiAqICB2YWx1ZXMgaW4gYWxsIGNvbHVtbnMgYW5kIHJvd3MgYXJlIHRyaW1tZWQuIEEgc3BlY2lmaWMgY29sdW1uXG4gKiAgbWF5IGJlIHJlZmVyZW5jZWQgYnkgZWl0aGVyIGl0cyBJRCBvciB0aXRsZS5cbiAqXG4gKiAgQG1ldGhvZCAgdHJpbVxuICogIEBwYXJhbSAge1N0cmluZ3xJbnRlZ2VyfSBbY29sdW1uXSBDb2x1bW4gSUQgKG51bWJlcilcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBuYW1lIChzdHJpbmcpXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIHRhYmxlID0gbmV3IHA1LlRhYmxlKCk7XG4gKlxuICogICB0YWJsZS5hZGRDb2x1bW4oJ25hbWUnKTtcbiAqICAgdGFibGUuYWRkQ29sdW1uKCd0eXBlJyk7XG4gKlxuICogICB2YXIgbmV3Um93ID0gdGFibGUuYWRkUm93KCk7XG4gKiAgIG5ld1Jvdy5zZXRTdHJpbmcoJ25hbWUnLCAnICAgTGlvbiAgLCcpO1xuICogICBuZXdSb3cuc2V0U3RyaW5nKCd0eXBlJywgJyBNYW1tYWwgICcpO1xuICpcbiAqICAgbmV3Um93ID0gdGFibGUuYWRkUm93KCk7XG4gKiAgIG5ld1Jvdy5zZXRTdHJpbmcoJ25hbWUnLCAnICBTbmFrZSAgJyk7XG4gKiAgIG5ld1Jvdy5zZXRTdHJpbmcoJ3R5cGUnLCAnICBSZXB0aWxlICAnKTtcbiAqXG4gKiAgIHRhYmxlLnRyaW0oKTtcbiAqICAgcHJpbnQodGFibGUuZ2V0QXJyYXkoKSk7XG4gKiB9XG4gKlxuICogLy8gcHJpbnRzOlxuICogLy8gIDAgIFwiTGlvblwiICAgXCJNYW1hbFwiXG4gKiAvLyAgMSAgXCJTbmFrZVwiICBcIlJlcHRpbGVcIlxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uKGNvbHVtbikge1xuICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCcgJywgJ2cnKTtcblxuICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGMrKykge1xuICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCB0aGlzLnJvd3MubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgdmFyIHMgPSB0aGlzLnJvd3NbZF0uYXJyW2NdO1xuICAgICAgICBzID0gcy5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAgICAgIHRoaXMucm93c1tkXS5hcnJbY10gPSBzO1xuICAgICAgICB0aGlzLnJvd3NbZF0ub2JqW3RoaXMuY29sdW1uc1tjXV0gPSBzO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5yb3dzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgdmFsID0gdGhpcy5yb3dzW2pdLm9ialtjb2x1bW5dO1xuICAgICAgdmFsID0gdmFsLnJlcGxhY2UocmVnZXgsICcnKTtcbiAgICAgIHRoaXMucm93c1tqXS5vYmpbY29sdW1uXSA9IHZhbDtcbiAgICAgIHZhciBwb3MgPSB0aGlzLmNvbHVtbnMuaW5kZXhPZihjb2x1bW4pO1xuICAgICAgdGhpcy5yb3dzW2pdLmFycltwb3NdID0gdmFsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMucm93cy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIHN0ciA9IHRoaXMucm93c1trXS5hcnJbY29sdW1uXTtcbiAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAgICB0aGlzLnJvd3Nba10uYXJyW2NvbHVtbl0gPSBzdHI7XG4gICAgICB0aGlzLnJvd3Nba10ub2JqW3RoaXMuY29sdW1uc1tjb2x1bW5dXSA9IHN0cjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogIFVzZSByZW1vdmVDb2x1bW4oKSB0byByZW1vdmUgYW4gZXhpc3RpbmcgY29sdW1uIGZyb20gYSBUYWJsZVxuICogIG9iamVjdC4gVGhlIGNvbHVtbiB0byBiZSByZW1vdmVkIG1heSBiZSBpZGVudGlmaWVkIGJ5IGVpdGhlclxuICogIGl0cyB0aXRsZSAoYSBTdHJpbmcpIG9yIGl0cyBpbmRleCB2YWx1ZSAoYW4gaW50KS5cbiAqICByZW1vdmVDb2x1bW4oMCkgd291bGQgcmVtb3ZlIHRoZSBmaXJzdCBjb2x1bW4sIHJlbW92ZUNvbHVtbigxKVxuICogIHdvdWxkIHJlbW92ZSB0aGUgc2Vjb25kIGNvbHVtbiwgYW5kIHNvIG9uLlxuICpcbiAqICBAbWV0aG9kICByZW1vdmVDb2x1bW5cbiAqICBAcGFyYW0gIHtTdHJpbmd8SW50ZWdlcn0gY29sdW1uIGNvbHVtbk5hbWUgKHN0cmluZykgb3IgSUQgKG51bWJlcilcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIC8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcIm1hbW1hbHMuY3N2XCJcbiAqIC8vIGluIHRoZSBwcm9qZWN0J3MgXCJhc3NldHNcIiBmb2xkZXI6XG4gKiAvL1xuICogLy8gaWQsc3BlY2llcyxuYW1lXG4gKiAvLyAwLENhcHJhIGhpcmN1cyxHb2F0XG4gKiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXG4gKiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXG4gKlxuICogdmFyIHRhYmxlO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFwiY3N2XCJcbiAqICAgLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXG4gKiAgIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB0YWJsZS5yZW1vdmVDb2x1bW4oJ2lkJyk7XG4gKiAgIHByaW50KHRhYmxlLmdldENvbHVtbkNvdW50KCkpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICpAYWx0XG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqXG4gKi9cbnA1LlRhYmxlLnByb3RvdHlwZS5yZW1vdmVDb2x1bW4gPSBmdW5jdGlvbihjKSB7XG4gIHZhciBjU3RyaW5nO1xuICB2YXIgY051bWJlcjtcbiAgaWYgKHR5cGVvZiBjID09PSAnc3RyaW5nJykge1xuICAgIC8vIGZpbmQgdGhlIHBvc2l0aW9uIG9mIGMgaW4gdGhlIGNvbHVtbnNcbiAgICBjU3RyaW5nID0gYztcbiAgICBjTnVtYmVyID0gdGhpcy5jb2x1bW5zLmluZGV4T2YoYyk7XG4gICAgY29uc29sZS5sb2coJ3N0cmluZycpO1xuICB9IGVsc2Uge1xuICAgIGNOdW1iZXIgPSBjO1xuICAgIGNTdHJpbmcgPSB0aGlzLmNvbHVtbnNbY107XG4gIH1cblxuICB2YXIgY2h1bmsgPSB0aGlzLmNvbHVtbnMuc3BsaWNlKGNOdW1iZXIgKyAxLCB0aGlzLmNvbHVtbnMubGVuZ3RoKTtcbiAgdGhpcy5jb2x1bW5zLnBvcCgpO1xuICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuY29uY2F0KGNodW5rKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0ZW1wUiA9IHRoaXMucm93c1tpXS5hcnI7XG4gICAgdmFyIGNoaXAgPSB0ZW1wUi5zcGxpY2UoY051bWJlciArIDEsIHRlbXBSLmxlbmd0aCk7XG4gICAgdGVtcFIucG9wKCk7XG4gICAgdGhpcy5yb3dzW2ldLmFyciA9IHRlbXBSLmNvbmNhdChjaGlwKTtcbiAgICBkZWxldGUgdGhpcy5yb3dzW2ldLm9ialtjU3RyaW5nXTtcbiAgfVxufTtcblxuLyoqXG4gKiBTdG9yZXMgYSB2YWx1ZSBpbiB0aGUgVGFibGUncyBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4uXG4gKiBUaGUgcm93IGlzIHNwZWNpZmllZCBieSBpdHMgSUQsIHdoaWxlIHRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZFxuICogYnkgZWl0aGVyIGl0cyBJRCBvciB0aXRsZS5cbiAqXG4gKiBAbWV0aG9kICBzZXRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gcm93IHJvdyBJRFxuICogQHBhcmFtIHtTdHJpbmd8SW50ZWdlcn0gY29sdW1uIGNvbHVtbiBJRCAoTnVtYmVyKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGl0bGUgKFN0cmluZylcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsdWUgIHZhbHVlIHRvIGFzc2lnblxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIlxuICogLy8gaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlcjpcbiAqIC8vXG4gKiAvLyBpZCxzcGVjaWVzLG5hbWVcbiAqIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcbiAqIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcbiAqIC8vIDIsRXF1dXMgemVicmEsWmVicmFcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJjc3ZcIlxuICogICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHRhYmxlLnNldCgwLCAnc3BlY2llcycsICdDYW5pcyBMdXB1cycpO1xuICogICB0YWJsZS5zZXQoMCwgJ25hbWUnLCAnV29sZicpO1xuICpcbiAqICAgLy9wcmludCB0aGUgcmVzdWx0c1xuICogICBmb3IgKHZhciByID0gMDsgciA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHIrKylcbiAqICAgICBmb3IgKHZhciBjID0gMDsgYyA8IHRhYmxlLmdldENvbHVtbkNvdW50KCk7IGMrKylcbiAqICAgICAgIHByaW50KHRhYmxlLmdldFN0cmluZyhyLCBjKSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKkBhbHRcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICpcbiAqL1xucDUuVGFibGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCB2YWx1ZSkge1xuICB0aGlzLnJvd3Nbcm93XS5zZXQoY29sdW1uLCB2YWx1ZSk7XG59O1xuXG4vKipcbiAqIFN0b3JlcyBhIEZsb2F0IHZhbHVlIGluIHRoZSBUYWJsZSdzIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbi5cbiAqIFRoZSByb3cgaXMgc3BlY2lmaWVkIGJ5IGl0cyBJRCwgd2hpbGUgdGhlIGNvbHVtbiBtYXkgYmUgc3BlY2lmaWVkXG4gKiBieSBlaXRoZXIgaXRzIElEIG9yIHRpdGxlLlxuICpcbiAqIEBtZXRob2Qgc2V0TnVtXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHJvdyByb3cgSURcbiAqIEBwYXJhbSB7U3RyaW5nfEludGVnZXJ9IGNvbHVtbiBjb2x1bW4gSUQgKE51bWJlcilcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRpdGxlIChTdHJpbmcpXG4gKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgIHZhbHVlIHRvIGFzc2lnblxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIlxuICogLy8gaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlcjpcbiAqIC8vXG4gKiAvLyBpZCxzcGVjaWVzLG5hbWVcbiAqIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcbiAqIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcbiAqIC8vIDIsRXF1dXMgemVicmEsWmVicmFcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJjc3ZcIlxuICogICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHRhYmxlLnNldE51bSgxLCAnaWQnLCAxKTtcbiAqXG4gKiAgIHByaW50KHRhYmxlLmdldENvbHVtbigwKSk7XG4gKiAgIC8vW1wiMFwiLCAxLCBcIjJcIl1cbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKi9cbnA1LlRhYmxlLnByb3RvdHlwZS5zZXROdW0gPSBmdW5jdGlvbihyb3csIGNvbHVtbiwgdmFsdWUpIHtcbiAgdGhpcy5yb3dzW3Jvd10uc2V0TnVtKGNvbHVtbiwgdmFsdWUpO1xufTtcblxuLyoqXG4gKiBTdG9yZXMgYSBTdHJpbmcgdmFsdWUgaW4gdGhlIFRhYmxlJ3Mgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uLlxuICogVGhlIHJvdyBpcyBzcGVjaWZpZWQgYnkgaXRzIElELCB3aGlsZSB0aGUgY29sdW1uIG1heSBiZSBzcGVjaWZpZWRcbiAqIGJ5IGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuXG4gKlxuICogQG1ldGhvZCAgc2V0U3RyaW5nXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHJvdyByb3cgSURcbiAqIEBwYXJhbSB7U3RyaW5nfEludGVnZXJ9IGNvbHVtbiBjb2x1bW4gSUQgKE51bWJlcilcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRpdGxlIChTdHJpbmcpXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgIHZhbHVlIHRvIGFzc2lnblxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPjxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIiBpbiB0aGUgcHJvamVjdCdzIFwiYXNzZXRzXCIgZm9sZGVyOlxuICogLy9cbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxDYXByYSBoaXJjdXMsR29hdFxuICogLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxuICogLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxuICpcbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcImNzdlwiXG4gKiAgIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xuICogICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgLy9hZGQgYSByb3dcbiAqICAgdmFyIG5ld1JvdyA9IHRhYmxlLmFkZFJvdygpO1xuICogICBuZXdSb3cuc2V0U3RyaW5nKCdpZCcsIHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTtcbiAqICAgbmV3Um93LnNldFN0cmluZygnc3BlY2llcycsICdDYW5pcyBMdXB1cycpO1xuICogICBuZXdSb3cuc2V0U3RyaW5nKCduYW1lJywgJ1dvbGYnKTtcbiAqXG4gKiAgIHByaW50KHRhYmxlLmdldEFycmF5KCkpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICovXG5wNS5UYWJsZS5wcm90b3R5cGUuc2V0U3RyaW5nID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIHZhbHVlKSB7XG4gIHRoaXMucm93c1tyb3ddLnNldFN0cmluZyhjb2x1bW4sIHZhbHVlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGEgdmFsdWUgZnJvbSB0aGUgVGFibGUncyBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4uXG4gKiBUaGUgcm93IGlzIHNwZWNpZmllZCBieSBpdHMgSUQsIHdoaWxlIHRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZCBieVxuICogZWl0aGVyIGl0cyBJRCBvciB0aXRsZS5cbiAqXG4gKiBAbWV0aG9kICBnZXRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gcm93IHJvdyBJRFxuICogQHBhcmFtICB7U3RyaW5nfEludGVnZXJ9IGNvbHVtbiBjb2x1bW5OYW1lIChzdHJpbmcpIG9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgKG51bWJlcilcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXCJtYW1tYWxzLmNzdlwiXG4gKiAvLyBpbiB0aGUgcHJvamVjdCdzIFwiYXNzZXRzXCIgZm9sZGVyOlxuICogLy9cbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxDYXByYSBoaXJjdXMsR29hdFxuICogLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxuICogLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxuICpcbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcImNzdlwiXG4gKiAgIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xuICogICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgcHJpbnQodGFibGUuZ2V0KDAsIDEpKTtcbiAqICAgLy9DYXByYSBoaXJjdXNcbiAqICAgcHJpbnQodGFibGUuZ2V0KDAsICdzcGVjaWVzJykpO1xuICogICAvL0NhcHJhIGhpcmN1c1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICpAYWx0XG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqXG4gKi9cbnA1LlRhYmxlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikge1xuICByZXR1cm4gdGhpcy5yb3dzW3Jvd10uZ2V0KGNvbHVtbik7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBhIEZsb2F0IHZhbHVlIGZyb20gdGhlIFRhYmxlJ3Mgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uLlxuICogVGhlIHJvdyBpcyBzcGVjaWZpZWQgYnkgaXRzIElELCB3aGlsZSB0aGUgY29sdW1uIG1heSBiZSBzcGVjaWZpZWQgYnlcbiAqIGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuXG4gKlxuICogQG1ldGhvZCAgZ2V0TnVtXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHJvdyByb3cgSURcbiAqIEBwYXJhbSAge1N0cmluZ3xJbnRlZ2VyfSBjb2x1bW4gY29sdW1uTmFtZSAoc3RyaW5nKSBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEIChudW1iZXIpXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXCJtYW1tYWxzLmNzdlwiXG4gKiAvLyBpbiB0aGUgcHJvamVjdCdzIFwiYXNzZXRzXCIgZm9sZGVyOlxuICogLy9cbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxDYXByYSBoaXJjdXMsR29hdFxuICogLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxuICogLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxuICpcbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcImNzdlwiXG4gKiAgIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xuICogICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgcHJpbnQodGFibGUuZ2V0TnVtKDEsIDApICsgMTAwKTtcbiAqICAgLy9pZCAxICsgMTAwID0gMTAxXG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKkBhbHRcbiAqIG5vIGltYWdlIGRpc3BsYXllZFxuICpcbiAqL1xucDUuVGFibGUucHJvdG90eXBlLmdldE51bSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7XG4gIHJldHVybiB0aGlzLnJvd3Nbcm93XS5nZXROdW0oY29sdW1uKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGEgU3RyaW5nIHZhbHVlIGZyb20gdGhlIFRhYmxlJ3Mgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uLlxuICogVGhlIHJvdyBpcyBzcGVjaWZpZWQgYnkgaXRzIElELCB3aGlsZSB0aGUgY29sdW1uIG1heSBiZSBzcGVjaWZpZWQgYnlcbiAqIGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuXG4gKlxuICogQG1ldGhvZCAgZ2V0U3RyaW5nXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHJvdyByb3cgSURcbiAqIEBwYXJhbSAge1N0cmluZ3xJbnRlZ2VyfSBjb2x1bW4gY29sdW1uTmFtZSAoc3RyaW5nKSBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEIChudW1iZXIpXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXCJtYW1tYWxzLmNzdlwiXG4gKiAvLyBpbiB0aGUgcHJvamVjdCdzIFwiYXNzZXRzXCIgZm9sZGVyOlxuICogLy9cbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxDYXByYSBoaXJjdXMsR29hdFxuICogLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxuICogLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxuICpcbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICAvLyB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJDU1ZcIlxuICogICAvLyBhbmQgaGFzIHNwZWNpZml5aW5nIGhlYWRlciBmb3IgY29sdW1uIGxhYmVsc1xuICogICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgcHJpbnQodGFibGUuZ2V0U3RyaW5nKDAsIDApKTsgLy8gMFxuICogICBwcmludCh0YWJsZS5nZXRTdHJpbmcoMCwgMSkpOyAvLyBDYXByYSBoaXJjdXNcbiAqICAgcHJpbnQodGFibGUuZ2V0U3RyaW5nKDAsIDIpKTsgLy8gR29hdFxuICogICBwcmludCh0YWJsZS5nZXRTdHJpbmcoMSwgMCkpOyAvLyAxXG4gKiAgIHByaW50KHRhYmxlLmdldFN0cmluZygxLCAxKSk7IC8vIFBhbnRoZXJhIHBhcmR1c1xuICogICBwcmludCh0YWJsZS5nZXRTdHJpbmcoMSwgMikpOyAvLyBMZW9wYXJkXG4gKiAgIHByaW50KHRhYmxlLmdldFN0cmluZygyLCAwKSk7IC8vIDJcbiAqICAgcHJpbnQodGFibGUuZ2V0U3RyaW5nKDIsIDEpKTsgLy8gRXF1dXMgemVicmFcbiAqICAgcHJpbnQodGFibGUuZ2V0U3RyaW5nKDIsIDIpKTsgLy8gWmVicmFcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5cbnA1LlRhYmxlLnByb3RvdHlwZS5nZXRTdHJpbmcgPSBmdW5jdGlvbihyb3csIGNvbHVtbikge1xuICByZXR1cm4gdGhpcy5yb3dzW3Jvd10uZ2V0U3RyaW5nKGNvbHVtbik7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBhbGwgdGFibGUgZGF0YSBhbmQgcmV0dXJucyBhcyBhbiBvYmplY3QuIElmIGEgY29sdW1uIG5hbWUgaXNcbiAqIHBhc3NlZCBpbiwgZWFjaCByb3cgb2JqZWN0IHdpbGwgYmUgc3RvcmVkIHdpdGggdGhhdCBhdHRyaWJ1dGUgYXMgaXRzXG4gKiB0aXRsZS5cbiAqXG4gKiBAbWV0aG9kICBnZXRPYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBbaGVhZGVyQ29sdW1uXSBOYW1lIG9mIHRoZSBjb2x1bW4gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgZWFjaCByb3cgb2JqZWN0IChvcHRpb25hbClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIC8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcIm1hbW1hbHMuY3N2XCJcbiAqIC8vIGluIHRoZSBwcm9qZWN0J3MgXCJhc3NldHNcIiBmb2xkZXI6XG4gKiAvL1xuICogLy8gaWQsc3BlY2llcyxuYW1lXG4gKiAvLyAwLENhcHJhIGhpcmN1cyxHb2F0XG4gKiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXG4gKiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXG4gKlxuICogdmFyIHRhYmxlO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFwiY3N2XCJcbiAqICAgLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXG4gKiAgIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgdGFibGVPYmplY3QgPSB0YWJsZS5nZXRPYmplY3QoKTtcbiAqXG4gKiAgIHByaW50KHRhYmxlT2JqZWN0KTtcbiAqICAgLy9vdXRwdXRzIGFuIG9iamVjdFxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICpAYWx0XG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqXG4gKi9cbnA1LlRhYmxlLnByb3RvdHlwZS5nZXRPYmplY3QgPSBmdW5jdGlvbihoZWFkZXJDb2x1bW4pIHtcbiAgdmFyIHRhYmxlT2JqZWN0ID0ge307XG4gIHZhciBvYmosIGNQb3MsIGluZGV4O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgb2JqID0gdGhpcy5yb3dzW2ldLm9iajtcblxuICAgIGlmICh0eXBlb2YgaGVhZGVyQ29sdW1uID09PSAnc3RyaW5nJykge1xuICAgICAgY1BvcyA9IHRoaXMuY29sdW1ucy5pbmRleE9mKGhlYWRlckNvbHVtbik7IC8vIGluZGV4IG9mIGNvbHVtbklEXG4gICAgICBpZiAoY1BvcyA+PSAwKSB7XG4gICAgICAgIGluZGV4ID0gb2JqW2hlYWRlckNvbHVtbl07XG4gICAgICAgIHRhYmxlT2JqZWN0W2luZGV4XSA9IG9iajtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93ICdUaGlzIHRhYmxlIGhhcyBubyBjb2x1bW4gbmFtZWQgXCInICsgaGVhZGVyQ29sdW1uICsgJ1wiJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVPYmplY3RbaV0gPSB0aGlzLnJvd3NbaV0ub2JqO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFibGVPYmplY3Q7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBhbGwgdGFibGUgZGF0YSBhbmQgcmV0dXJucyBpdCBhcyBhIG11bHRpZGltZW5zaW9uYWwgYXJyYXkuXG4gKlxuICogQG1ldGhvZCAgZ2V0QXJyYXlcbiAqIEByZXR1cm4ge0FycmF5fVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIlxuICogLy8gaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlclxuICogLy9cbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxDYXByYSBoaXJjdXMsR29hdFxuICogLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGVyZFxuICogLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxuICpcbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICAvLyB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJDU1ZcIlxuICogICAvLyBhbmQgaGFzIHNwZWNpZml5aW5nIGhlYWRlciBmb3IgY29sdW1uIGxhYmVsc1xuICogICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIHRhYmxlQXJyYXkgPSB0YWJsZS5nZXRBcnJheSgpO1xuICogICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAqICAgICBwcmludCh0YWJsZUFycmF5W2ldKTtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICpAYWx0XG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqXG4gKi9cbnA1LlRhYmxlLnByb3RvdHlwZS5nZXRBcnJheSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdGFibGVBcnJheSA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgIHRhYmxlQXJyYXkucHVzaCh0aGlzLnJvd3NbaV0uYXJyKTtcbiAgfVxuICByZXR1cm4gdGFibGVBcnJheTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSw0ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgSU9cbiAqIEBzdWJtb2R1bGUgVGFibGVcbiAqIEByZXF1aXJlcyBjb3JlXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuLi9jb3JlL2NvcmUnKTtcblxuLyoqXG4gKiAgQSBUYWJsZVJvdyBvYmplY3QgcmVwcmVzZW50cyBhIHNpbmdsZSByb3cgb2YgZGF0YSB2YWx1ZXMsXG4gKiAgc3RvcmVkIGluIGNvbHVtbnMsIGZyb20gYSB0YWJsZS5cbiAqXG4gKiAgQSBUYWJsZSBSb3cgY29udGFpbnMgYm90aCBhbiBvcmRlcmVkIGFycmF5LCBhbmQgYW4gdW5vcmRlcmVkXG4gKiAgSlNPTiBvYmplY3QuXG4gKlxuICogIEBjbGFzcyBwNS5UYWJsZVJvd1xuICogIEBjb25zdHJ1Y3RvclxuICogIEBwYXJhbSB7U3RyaW5nfSBbc3RyXSAgICAgICBvcHRpb25hbDogcG9wdWxhdGUgdGhlIHJvdyB3aXRoIGFcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9mIHZhbHVlcywgc2VwYXJhdGVkIGJ5IHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JcbiAqICBAcGFyYW0ge1N0cmluZ30gW3NlcGFyYXRvcl0gY29tbWEgc2VwYXJhdGVkIHZhbHVlcyAoY3N2KSBieSBkZWZhdWx0XG4gKi9cbnA1LlRhYmxlUm93ID0gZnVuY3Rpb24oc3RyLCBzZXBhcmF0b3IpIHtcbiAgdmFyIGFyciA9IFtdO1xuICB2YXIgb2JqID0ge307XG4gIGlmIChzdHIpIHtcbiAgICBzZXBhcmF0b3IgPSBzZXBhcmF0b3IgfHwgJywnO1xuICAgIGFyciA9IHN0ci5zcGxpdChzZXBhcmF0b3IpO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGk7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcbiAgICBvYmpba2V5XSA9IHZhbDtcbiAgfVxuICB0aGlzLmFyciA9IGFycjtcbiAgdGhpcy5vYmogPSBvYmo7XG4gIHRoaXMudGFibGUgPSBudWxsO1xufTtcblxuLyoqXG4gKiAgU3RvcmVzIGEgdmFsdWUgaW4gdGhlIFRhYmxlUm93J3Mgc3BlY2lmaWVkIGNvbHVtbi5cbiAqICBUaGUgY29sdW1uIG1heSBiZSBzcGVjaWZpZWQgYnkgZWl0aGVyIGl0cyBJRCBvciB0aXRsZS5cbiAqXG4gKiAgQG1ldGhvZCAgc2V0XG4gKiAgQHBhcmFtIHtTdHJpbmd8SW50ZWdlcn0gY29sdW1uIENvbHVtbiBJRCAoTnVtYmVyKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFRpdGxlIChTdHJpbmcpXG4gKiAgQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWx1ZSAgVGhlIHZhbHVlIHRvIGJlIHN0b3JlZFxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj48Y29kZT5cbiAqIC8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcIm1hbW1hbHMuY3N2XCIgaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlcjpcbiAqIC8vXG4gKiAvLyBpZCxzcGVjaWVzLG5hbWVcbiAqIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcbiAqIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcbiAqIC8vIDIsRXF1dXMgemVicmEsWmVicmFcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJjc3ZcIlxuICogICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciByb3dzID0gdGFibGUuZ2V0Um93cygpO1xuICogICBmb3IgKHZhciByID0gMDsgciA8IHJvd3MubGVuZ3RoOyByKyspIHtcbiAqICAgICByb3dzW3JdLnNldCgnbmFtZScsICdVbmljb3JuJyk7XG4gKiAgIH1cbiAqXG4gKiAgIC8vcHJpbnQgdGhlIHJlc3VsdHNcbiAqICAgcHJpbnQodGFibGUuZ2V0QXJyYXkoKSk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKi9cbnA1LlRhYmxlUm93LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihjb2x1bW4sIHZhbHVlKSB7XG4gIC8vIGlmIHR5cGVvZiBjb2x1bW4gaXMgc3RyaW5nLCB1c2UgLm9ialxuICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgY1BvcyA9IHRoaXMudGFibGUuY29sdW1ucy5pbmRleE9mKGNvbHVtbik7IC8vIGluZGV4IG9mIGNvbHVtbklEXG4gICAgaWYgKGNQb3MgPj0gMCkge1xuICAgICAgdGhpcy5vYmpbY29sdW1uXSA9IHZhbHVlO1xuICAgICAgdGhpcy5hcnJbY1Bvc10gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgJ1RoaXMgdGFibGUgaGFzIG5vIGNvbHVtbiBuYW1lZCBcIicgKyBjb2x1bW4gKyAnXCInO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBpZiB0eXBlb2YgY29sdW1uIGlzIG51bWJlciwgdXNlIC5hcnJcbiAgICBpZiAoY29sdW1uIDwgdGhpcy50YWJsZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgdGhpcy5hcnJbY29sdW1uXSA9IHZhbHVlO1xuICAgICAgdmFyIGNUaXRsZSA9IHRoaXMudGFibGUuY29sdW1uc1tjb2x1bW5dO1xuICAgICAgdGhpcy5vYmpbY1RpdGxlXSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyAnQ29sdW1uICMnICsgY29sdW1uICsgJyBpcyBvdXQgb2YgdGhlIHJhbmdlIG9mIHRoaXMgdGFibGUnO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiAgU3RvcmVzIGEgRmxvYXQgdmFsdWUgaW4gdGhlIFRhYmxlUm93J3Mgc3BlY2lmaWVkIGNvbHVtbi5cbiAqICBUaGUgY29sdW1uIG1heSBiZSBzcGVjaWZpZWQgYnkgZWl0aGVyIGl0cyBJRCBvciB0aXRsZS5cbiAqXG4gKiAgQG1ldGhvZCAgc2V0TnVtXG4gKiAgQHBhcmFtIHtTdHJpbmd8SW50ZWdlcn0gY29sdW1uIENvbHVtbiBJRCAoTnVtYmVyKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFRpdGxlIChTdHJpbmcpXG4gKiAgQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSB2YWx1ZSAgVGhlIHZhbHVlIHRvIGJlIHN0b3JlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgRmxvYXRcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj48Y29kZT5cbiAqIC8vIEdpdmVuIHRoZSBDU1YgZmlsZSBcIm1hbW1hbHMuY3N2XCIgaW4gdGhlIHByb2plY3QncyBcImFzc2V0c1wiIGZvbGRlcjpcbiAqIC8vXG4gKiAvLyBpZCxzcGVjaWVzLG5hbWVcbiAqIC8vIDAsQ2FwcmEgaGlyY3VzLEdvYXRcbiAqIC8vIDEsUGFudGhlcmEgcGFyZHVzLExlb3BhcmRcbiAqIC8vIDIsRXF1dXMgemVicmEsWmVicmFcbiAqXG4gKiB2YXIgdGFibGU7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgLy9teSB0YWJsZSBpcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgXCJjc3ZcIlxuICogICAvL2FuZCBoYXMgYSBoZWFkZXIgc3BlY2lmeWluZyB0aGUgY29sdW1ucyBsYWJlbHNcbiAqICAgdGFibGUgPSBsb2FkVGFibGUoJ2Fzc2V0cy9tYW1tYWxzLmNzdicsICdjc3YnLCAnaGVhZGVyJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciByb3dzID0gdGFibGUuZ2V0Um93cygpO1xuICogICBmb3IgKHZhciByID0gMDsgciA8IHJvd3MubGVuZ3RoOyByKyspIHtcbiAqICAgICByb3dzW3JdLnNldE51bSgnaWQnLCByICsgMTApO1xuICogICB9XG4gKlxuICogICBwcmludCh0YWJsZS5nZXRBcnJheSgpKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqL1xucDUuVGFibGVSb3cucHJvdG90eXBlLnNldE51bSA9IGZ1bmN0aW9uKGNvbHVtbiwgdmFsdWUpIHtcbiAgdmFyIGZsb2F0VmFsID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIHRoaXMuc2V0KGNvbHVtbiwgZmxvYXRWYWwpO1xufTtcblxuLyoqXG4gKiAgU3RvcmVzIGEgU3RyaW5nIHZhbHVlIGluIHRoZSBUYWJsZVJvdydzIHNwZWNpZmllZCBjb2x1bW4uXG4gKiAgVGhlIGNvbHVtbiBtYXkgYmUgc3BlY2lmaWVkIGJ5IGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuXG4gKlxuICogIEBtZXRob2QgIHNldFN0cmluZ1xuICogIEBwYXJhbSB7U3RyaW5nfEludGVnZXJ9IGNvbHVtbiBDb2x1bW4gSUQgKE51bWJlcilcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBUaXRsZSAoU3RyaW5nKVxuICogIEBwYXJhbSB7U3RyaW5nfE51bWJlcnxCb29sZWFufE9iamVjdH0gdmFsdWUgIFRoZSB2YWx1ZSB0byBiZSBzdG9yZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIFN0cmluZ1xuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPjxjb2RlPlxuICogLy8gR2l2ZW4gdGhlIENTViBmaWxlIFwibWFtbWFscy5jc3ZcIiBpbiB0aGUgcHJvamVjdCdzIFwiYXNzZXRzXCIgZm9sZGVyOlxuICogLy9cbiAqIC8vIGlkLHNwZWNpZXMsbmFtZVxuICogLy8gMCxDYXByYSBoaXJjdXMsR29hdFxuICogLy8gMSxQYW50aGVyYSBwYXJkdXMsTGVvcGFyZFxuICogLy8gMixFcXV1cyB6ZWJyYSxaZWJyYVxuICpcbiAqIHZhciB0YWJsZTtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICAvL215IHRhYmxlIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBcImNzdlwiXG4gKiAgIC8vYW5kIGhhcyBhIGhlYWRlciBzcGVjaWZ5aW5nIHRoZSBjb2x1bW5zIGxhYmVsc1xuICogICB0YWJsZSA9IGxvYWRUYWJsZSgnYXNzZXRzL21hbW1hbHMuY3N2JywgJ2NzdicsICdoZWFkZXInKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIHJvd3MgPSB0YWJsZS5nZXRSb3dzKCk7XG4gKiAgIGZvciAodmFyIHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICogICAgIHZhciBuYW1lID0gcm93c1tyXS5nZXRTdHJpbmcoJ25hbWUnKTtcbiAqICAgICByb3dzW3JdLnNldFN0cmluZygnbmFtZScsICdBICcgKyBuYW1lICsgJyBuYW1lZCBHZW9yZ2UnKTtcbiAqICAgfVxuICpcbiAqICAgcHJpbnQodGFibGUuZ2V0QXJyYXkoKSk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKi9cbnA1LlRhYmxlUm93LnByb3RvdHlwZS5zZXRTdHJpbmcgPSBmdW5jdGlvbihjb2x1bW4sIHZhbHVlKSB7XG4gIHZhciBzdHJpbmdWYWwgPSB2YWx1ZS50b1N0cmluZygpO1xuICB0aGlzLnNldChjb2x1bW4sIHN0cmluZ1ZhbCk7XG59O1xuXG4vKipcbiAqICBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIHRoZSBUYWJsZVJvdydzIHNwZWNpZmllZCBjb2x1bW4uXG4gKiAgVGhlIGNvbHVtbiBtYXkgYmUgc3BlY2lmaWVkIGJ5IGVpdGhlciBpdHMgSUQgb3IgdGl0bGUuXG4gKlxuICogIEBtZXRob2QgIGdldFxuICogIEBwYXJhbSAge1N0cmluZ3xJbnRlZ2VyfSBjb2x1bW4gY29sdW1uTmFtZSAoc3RyaW5nKSBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEIChudW1iZXIpXG4gKiAgQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+PGNvZGU+XG4gKiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXCJtYW1tYWxzLmNzdlwiIGluIHRoZSBwcm9qZWN0J3MgXCJhc3NldHNcIiBmb2xkZXI6XG4gKiAvL1xuICogLy8gaWQsc3BlY2llcyxuYW1lXG4gKiAvLyAwLENhcHJhIGhpcmN1cyxHb2F0XG4gKiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXG4gKiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXG4gKlxuICogdmFyIHRhYmxlO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFwiY3N2XCJcbiAqICAgLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXG4gKiAgIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgbmFtZXMgPSBbXTtcbiAqICAgdmFyIHJvd3MgPSB0YWJsZS5nZXRSb3dzKCk7XG4gKiAgIGZvciAodmFyIHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICogICAgIG5hbWVzLnB1c2gocm93c1tyXS5nZXQoJ25hbWUnKSk7XG4gKiAgIH1cbiAqXG4gKiAgIHByaW50KG5hbWVzKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqL1xucDUuVGFibGVSb3cucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGNvbHVtbikge1xuICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdGhpcy5vYmpbY29sdW1uXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5hcnJbY29sdW1uXTtcbiAgfVxufTtcblxuLyoqXG4gKiAgUmV0cmlldmVzIGEgRmxvYXQgdmFsdWUgZnJvbSB0aGUgVGFibGVSb3cncyBzcGVjaWZpZWRcbiAqICBjb2x1bW4uIFRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZCBieSBlaXRoZXIgaXRzIElEIG9yXG4gKiAgdGl0bGUuXG4gKlxuICogIEBtZXRob2QgIGdldE51bVxuICogIEBwYXJhbSAge1N0cmluZ3xJbnRlZ2VyfSBjb2x1bW4gY29sdW1uTmFtZSAoc3RyaW5nKSBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEIChudW1iZXIpXG4gKiAgQHJldHVybiB7TnVtYmVyfSAgRmxvYXQgRmxvYXRpbmcgcG9pbnQgbnVtYmVyXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+PGNvZGU+XG4gKiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXCJtYW1tYWxzLmNzdlwiIGluIHRoZSBwcm9qZWN0J3MgXCJhc3NldHNcIiBmb2xkZXI6XG4gKiAvL1xuICogLy8gaWQsc3BlY2llcyxuYW1lXG4gKiAvLyAwLENhcHJhIGhpcmN1cyxHb2F0XG4gKiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXG4gKiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXG4gKlxuICogdmFyIHRhYmxlO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFwiY3N2XCJcbiAqICAgLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXG4gKiAgIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgcm93cyA9IHRhYmxlLmdldFJvd3MoKTtcbiAqICAgdmFyIG1pbklkID0gSW5maW5pdHk7XG4gKiAgIHZhciBtYXhJZCA9IC1JbmZpbml0eTtcbiAqICAgZm9yICh2YXIgciA9IDA7IHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gKiAgICAgdmFyIGlkID0gcm93c1tyXS5nZXROdW0oJ2lkJyk7XG4gKiAgICAgbWluSWQgPSBtaW4obWluSWQsIGlkKTtcbiAqICAgICBtYXhJZCA9IG1pbihtYXhJZCwgaWQpO1xuICogICB9XG4gKiAgIHByaW50KCdtaW5pbXVtIGlkID0gJyArIG1pbklkICsgJywgbWF4aW11bSBpZCA9ICcgKyBtYXhJZCk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKi9cbnA1LlRhYmxlUm93LnByb3RvdHlwZS5nZXROdW0gPSBmdW5jdGlvbihjb2x1bW4pIHtcbiAgdmFyIHJldDtcbiAgaWYgKHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0ID0gcGFyc2VGbG9hdCh0aGlzLm9ialtjb2x1bW5dKTtcbiAgfSBlbHNlIHtcbiAgICByZXQgPSBwYXJzZUZsb2F0KHRoaXMuYXJyW2NvbHVtbl0pO1xuICB9XG5cbiAgaWYgKHJldC50b1N0cmluZygpID09PSAnTmFOJykge1xuICAgIHRocm93ICdFcnJvcjogJyArIHRoaXMub2JqW2NvbHVtbl0gKyAnIGlzIE5hTiAoTm90IGEgTnVtYmVyKSc7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8qKlxuICogIFJldHJpZXZlcyBhbiBTdHJpbmcgdmFsdWUgZnJvbSB0aGUgVGFibGVSb3cncyBzcGVjaWZpZWRcbiAqICBjb2x1bW4uIFRoZSBjb2x1bW4gbWF5IGJlIHNwZWNpZmllZCBieSBlaXRoZXIgaXRzIElEIG9yXG4gKiAgdGl0bGUuXG4gKlxuICogIEBtZXRob2QgIGdldFN0cmluZ1xuICogIEBwYXJhbSAge1N0cmluZ3xJbnRlZ2VyfSBjb2x1bW4gY29sdW1uTmFtZSAoc3RyaW5nKSBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEIChudW1iZXIpXG4gKiAgQHJldHVybiB7U3RyaW5nfSAgU3RyaW5nXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+PGNvZGU+XG4gKiAvLyBHaXZlbiB0aGUgQ1NWIGZpbGUgXCJtYW1tYWxzLmNzdlwiIGluIHRoZSBwcm9qZWN0J3MgXCJhc3NldHNcIiBmb2xkZXI6XG4gKiAvL1xuICogLy8gaWQsc3BlY2llcyxuYW1lXG4gKiAvLyAwLENhcHJhIGhpcmN1cyxHb2F0XG4gKiAvLyAxLFBhbnRoZXJhIHBhcmR1cyxMZW9wYXJkXG4gKiAvLyAyLEVxdXVzIHplYnJhLFplYnJhXG4gKlxuICogdmFyIHRhYmxlO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIC8vbXkgdGFibGUgaXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlIFwiY3N2XCJcbiAqICAgLy9hbmQgaGFzIGEgaGVhZGVyIHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgbGFiZWxzXG4gKiAgIHRhYmxlID0gbG9hZFRhYmxlKCdhc3NldHMvbWFtbWFscy5jc3YnLCAnY3N2JywgJ2hlYWRlcicpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgcm93cyA9IHRhYmxlLmdldFJvd3MoKTtcbiAqICAgdmFyIGxvbmdlc3QgPSAnJztcbiAqICAgZm9yICh2YXIgciA9IDA7IHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gKiAgICAgdmFyIHNwZWNpZXMgPSByb3dzW3JdLmdldFN0cmluZygnc3BlY2llcycpO1xuICogICAgIGlmIChsb25nZXN0Lmxlbmd0aCA8IHNwZWNpZXMubGVuZ3RoKSB7XG4gKiAgICAgICBsb25nZXN0ID0gc3BlY2llcztcbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKiAgIHByaW50KCdsb25nZXN0OiAnICsgbG9uZ2VzdCk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKi9cbnA1LlRhYmxlUm93LnByb3RvdHlwZS5nZXRTdHJpbmcgPSBmdW5jdGlvbihjb2x1bW4pIHtcbiAgaWYgKHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRoaXMub2JqW2NvbHVtbl0udG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5hcnJbY29sdW1uXS50b1N0cmluZygpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4uL2NvcmUvY29yZVwiOjIyfV0sNDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIElPXG4gKiBAc3VibW9kdWxlIFhNTFxuICogQHJlcXVpcmVzIGNvcmVcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xuXG4vKipcbiAqIFhNTCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIFhNTCBvYmplY3QsIGFibGUgdG8gcGFyc2UgWE1MIGNvZGUuIFVzZVxuICogbG9hZFhNTCgpIHRvIGxvYWQgZXh0ZXJuYWwgWE1MIGZpbGVzIGFuZCBjcmVhdGUgWE1MIG9iamVjdHMuXG4gKlxuICogQGNsYXNzIHA1LlhNTFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXCJtYW1tYWxzLnhtbFwiIGlzIHBhcnNlZFxuICogLy8gaW4gdGhlIGNvZGUgYmVsb3cuXG4gKiAvL1xuICogLy8gPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiAqIC8vICZsdDttYW1tYWxzJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMFwiIHNwZWNpZXM9XCJDYXByYSBoaXJjdXNcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIxXCIgc3BlY2llcz1cIlBhbnRoZXJhIHBhcmR1c1wiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjJcIiBzcGVjaWVzPVwiRXF1dXMgemVicmFcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xuICogLy8gJmx0Oy9tYW1tYWxzJmd0O1xuICpcbiAqIHZhciB4bWw7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBjaGlsZHJlbiA9IHhtbC5nZXRDaGlsZHJlbignYW5pbWFsJyk7XG4gKlxuICogICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gKiAgICAgdmFyIGlkID0gY2hpbGRyZW5baV0uZ2V0TnVtKCdpZCcpO1xuICogICAgIHZhciBjb2xvcmluZyA9IGNoaWxkcmVuW2ldLmdldFN0cmluZygnc3BlY2llcycpO1xuICogICAgIHZhciBuYW1lID0gY2hpbGRyZW5baV0uZ2V0Q29udGVudCgpO1xuICogICAgIHByaW50KGlkICsgJywgJyArIGNvbG9yaW5nICsgJywgJyArIG5hbWUpO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gU2tldGNoIHByaW50czpcbiAqIC8vIDAsIENhcHJhIGhpcmN1cywgR29hdFxuICogLy8gMSwgUGFudGhlcmEgcGFyZHVzLCBMZW9wYXJkXG4gKiAvLyAyLCBFcXV1cyB6ZWJyYSwgWmVicmFcbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBubyBpbWFnZSBkaXNwbGF5ZWRcbiAqXG4gKi9cbnA1LlhNTCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLm5hbWUgPSBudWxsOyAvL2RvbmVcbiAgdGhpcy5hdHRyaWJ1dGVzID0ge307IC8vZG9uZVxuICB0aGlzLmNoaWxkcmVuID0gW107XG4gIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgdGhpcy5jb250ZW50ID0gbnVsbDsgLy9kb25lXG59O1xuXG4vKipcbiAqIEdldHMgYSBjb3B5IG9mIHRoZSBlbGVtZW50J3MgcGFyZW50LiBSZXR1cm5zIHRoZSBwYXJlbnQgYXMgYW5vdGhlclxuICogcDUuWE1MIG9iamVjdC5cbiAqXG4gKiBAbWV0aG9kIGdldFBhcmVudFxuICogQHJldHVybiB7cDUuWE1MfSAgIGVsZW1lbnQgcGFyZW50XG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXCJtYW1tYWxzLnhtbFwiIGlzIHBhcnNlZFxuICogLy8gaW4gdGhlIGNvZGUgYmVsb3cuXG4gKiAvL1xuICogLy8gPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiAqIC8vICZsdDttYW1tYWxzJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMFwiIHNwZWNpZXM9XCJDYXByYSBoaXJjdXNcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIxXCIgc3BlY2llcz1cIlBhbnRoZXJhIHBhcmR1c1wiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjJcIiBzcGVjaWVzPVwiRXF1dXMgemVicmFcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xuICogLy8gJmx0Oy9tYW1tYWxzJmd0O1xuICpcbiAqIHZhciB4bWw7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBjaGlsZHJlbiA9IHhtbC5nZXRDaGlsZHJlbignYW5pbWFsJyk7XG4gKiAgIHZhciBwYXJlbnQgPSBjaGlsZHJlblsxXS5nZXRQYXJlbnQoKTtcbiAqICAgcHJpbnQocGFyZW50LmdldE5hbWUoKSk7XG4gKiB9XG4gKlxuICogLy8gU2tldGNoIHByaW50czpcbiAqIC8vIG1hbW1hbHNcbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUuWE1MLnByb3RvdHlwZS5nZXRQYXJlbnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50O1xufTtcblxuLyoqXG4gKiAgR2V0cyB0aGUgZWxlbWVudCdzIGZ1bGwgbmFtZSwgd2hpY2ggaXMgcmV0dXJuZWQgYXMgYSBTdHJpbmcuXG4gKlxuICogQG1ldGhvZCBnZXROYW1lXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBuYW1lIG9mIHRoZSBub2RlXG4gKiBAZXhhbXBsZSZsdDthbmltYWxcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFwibWFtbWFscy54bWxcIiBpcyBwYXJzZWRcbiAqIC8vIGluIHRoZSBjb2RlIGJlbG93LlxuICogLy9cbiAqIC8vIDw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4gKiAvLyAmbHQ7bWFtbWFscyZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjBcIiBzcGVjaWVzPVwiQ2FwcmEgaGlyY3VzXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMVwiIHNwZWNpZXM9XCJQYW50aGVyYSBwYXJkdXNcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIyXCIgc3BlY2llcz1cIkVxdXVzIHplYnJhXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICZsdDsvbWFtbWFscyZndDtcbiAqXG4gKiB2YXIgeG1sO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBwcmludCh4bWwuZ2V0TmFtZSgpKTtcbiAqIH1cbiAqXG4gKiAvLyBTa2V0Y2ggcHJpbnRzOlxuICogLy8gbWFtbWFsc1xuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5YTUwucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubmFtZTtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgZWxlbWVudCdzIG5hbWUsIHdoaWNoIGlzIHNwZWNpZmllZCBhcyBhIFN0cmluZy5cbiAqXG4gKiBAbWV0aG9kIHNldE5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgbmV3IG5hbWUgb2YgdGhlIG5vZGVcbiAqIEBleGFtcGxlJmx0O2FuaW1hbFxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXCJtYW1tYWxzLnhtbFwiIGlzIHBhcnNlZFxuICogLy8gaW4gdGhlIGNvZGUgYmVsb3cuXG4gKiAvL1xuICogLy8gPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiAqIC8vICZsdDttYW1tYWxzJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMFwiIHNwZWNpZXM9XCJDYXByYSBoaXJjdXNcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIxXCIgc3BlY2llcz1cIlBhbnRoZXJhIHBhcmR1c1wiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjJcIiBzcGVjaWVzPVwiRXF1dXMgemVicmFcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xuICogLy8gJmx0Oy9tYW1tYWxzJmd0O1xuICpcbiAqIHZhciB4bWw7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHByaW50KHhtbC5nZXROYW1lKCkpO1xuICogICB4bWwuc2V0TmFtZSgnZmlzaCcpO1xuICogICBwcmludCh4bWwuZ2V0TmFtZSgpKTtcbiAqIH1cbiAqXG4gKiAvLyBTa2V0Y2ggcHJpbnRzOlxuICogLy8gbWFtbWFsc1xuICogLy8gZmlzaFxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5YTUwucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHRoaXMubmFtZSA9IG5hbWU7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgZWxlbWVudCBoYXMgYW55IGNoaWxkcmVuLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0XG4gKiBhcyBhIGJvb2xlYW4uXG4gKlxuICogQG1ldGhvZCBoYXNDaGlsZHJlblxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlJmx0O2FuaW1hbFxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXCJtYW1tYWxzLnhtbFwiIGlzIHBhcnNlZFxuICogLy8gaW4gdGhlIGNvZGUgYmVsb3cuXG4gKiAvL1xuICogLy8gPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiAqIC8vICZsdDttYW1tYWxzJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMFwiIHNwZWNpZXM9XCJDYXByYSBoaXJjdXNcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIxXCIgc3BlY2llcz1cIlBhbnRoZXJhIHBhcmR1c1wiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjJcIiBzcGVjaWVzPVwiRXF1dXMgemVicmFcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xuICogLy8gJmx0Oy9tYW1tYWxzJmd0O1xuICpcbiAqIHZhciB4bWw7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHByaW50KHhtbC5oYXNDaGlsZHJlbigpKTtcbiAqIH1cbiAqXG4gKiAvLyBTa2V0Y2ggcHJpbnRzOlxuICogLy8gdHJ1ZVxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5YTUwucHJvdG90eXBlLmhhc0NoaWxkcmVuID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDA7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbmFtZXMgb2YgYWxsIG9mIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4sIGFuZCByZXR1cm5zIHRoZSBuYW1lcyBhcyBhblxuICogYXJyYXkgb2YgU3RyaW5ncy4gVGhpcyBpcyB0aGUgc2FtZSBhcyBsb29waW5nIHRocm91Z2ggYW5kIGNhbGxpbmcgZ2V0TmFtZSgpXG4gKiBvbiBlYWNoIGNoaWxkIGVsZW1lbnQgaW5kaXZpZHVhbGx5LlxuICpcbiAqIEBtZXRob2QgbGlzdENoaWxkcmVuXG4gKiBAcmV0dXJuIHtTdHJpbmdbXX0gbmFtZXMgb2YgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50XG4gKiBAZXhhbXBsZSZsdDthbmltYWxcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFwibWFtbWFscy54bWxcIiBpcyBwYXJzZWRcbiAqIC8vIGluIHRoZSBjb2RlIGJlbG93LlxuICogLy9cbiAqIC8vIDw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4gKiAvLyAmbHQ7bWFtbWFscyZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjBcIiBzcGVjaWVzPVwiQ2FwcmEgaGlyY3VzXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMVwiIHNwZWNpZXM9XCJQYW50aGVyYSBwYXJkdXNcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIyXCIgc3BlY2llcz1cIkVxdXVzIHplYnJhXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICZsdDsvbWFtbWFscyZndDtcbiAqXG4gKiB2YXIgeG1sO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBwcmludCh4bWwubGlzdENoaWxkcmVuKCkpO1xuICogfVxuICpcbiAqIC8vIFNrZXRjaCBwcmludHM6XG4gKiAvLyBbXCJhbmltYWxcIiwgXCJhbmltYWxcIiwgXCJhbmltYWxcIl1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUuWE1MLnByb3RvdHlwZS5saXN0Q2hpbGRyZW4gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGMpIHtcbiAgICByZXR1cm4gYy5uYW1lO1xuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgb2YgdGhlIGVsZW1lbnQncyBjaGlsZHJlbiBhcyBhbiBhcnJheSBvZiBwNS5YTUwgb2JqZWN0cy4gV2hlblxuICogdGhlIG5hbWUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgdGhlbiBpdCB3aWxsIHJldHVybiBhbGwgY2hpbGRyZW4gdGhhdCBtYXRjaFxuICogdGhhdCBuYW1lLlxuICpcbiAqIEBtZXRob2QgZ2V0Q2hpbGRyZW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZV0gZWxlbWVudCBuYW1lXG4gKiBAcmV0dXJuIHtwNS5YTUxbXX0gY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnRcbiAqIEBleGFtcGxlJmx0O2FuaW1hbFxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXCJtYW1tYWxzLnhtbFwiIGlzIHBhcnNlZFxuICogLy8gaW4gdGhlIGNvZGUgYmVsb3cuXG4gKiAvL1xuICogLy8gPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiAqIC8vICZsdDttYW1tYWxzJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMFwiIHNwZWNpZXM9XCJDYXByYSBoaXJjdXNcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIxXCIgc3BlY2llcz1cIlBhbnRoZXJhIHBhcmR1c1wiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjJcIiBzcGVjaWVzPVwiRXF1dXMgemVicmFcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xuICogLy8gJmx0Oy9tYW1tYWxzJmd0O1xuICpcbiAqIHZhciB4bWw7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBhbmltYWxzID0geG1sLmdldENoaWxkcmVuKCdhbmltYWwnKTtcbiAqXG4gKiAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5pbWFscy5sZW5ndGg7IGkrKykge1xuICogICAgIHByaW50KGFuaW1hbHNbaV0uZ2V0Q29udGVudCgpKTtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIFNrZXRjaCBwcmludHM6XG4gKiAvLyBcIkdvYXRcIlxuICogLy8gXCJMZW9wYXJkXCJcbiAqIC8vIFwiWmVicmFcIlxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5YTUwucHJvdG90eXBlLmdldENoaWxkcmVuID0gZnVuY3Rpb24ocGFyYW0pIHtcbiAgaWYgKHBhcmFtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGMpIHtcbiAgICAgIHJldHVybiBjLm5hbWUgPT09IHBhcmFtO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IG9mIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4gdGhhdCBtYXRjaGVzIHRoZSBuYW1lIHBhcmFtZXRlclxuICogb3IgdGhlIGNoaWxkIG9mIHRoZSBnaXZlbiBpbmRleC5JdCByZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBtYXRjaGluZ1xuICogY2hpbGQgaXMgZm91bmQuXG4gKlxuICogQG1ldGhvZCBnZXRDaGlsZFxuICogQHBhcmFtIHtTdHJpbmd8SW50ZWdlcn0gbmFtZSBlbGVtZW50IG5hbWUgb3IgaW5kZXhcbiAqIEByZXR1cm4ge3A1LlhNTH1cbiAqIEBleGFtcGxlJmx0O2FuaW1hbFxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXCJtYW1tYWxzLnhtbFwiIGlzIHBhcnNlZFxuICogLy8gaW4gdGhlIGNvZGUgYmVsb3cuXG4gKiAvL1xuICogLy8gPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiAqIC8vICZsdDttYW1tYWxzJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMFwiIHNwZWNpZXM9XCJDYXByYSBoaXJjdXNcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIxXCIgc3BlY2llcz1cIlBhbnRoZXJhIHBhcmR1c1wiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjJcIiBzcGVjaWVzPVwiRXF1dXMgemVicmFcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xuICogLy8gJmx0Oy9tYW1tYWxzJmd0O1xuICpcbiAqIHZhciB4bWw7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBmaXJzdENoaWxkID0geG1sLmdldENoaWxkKCdhbmltYWwnKTtcbiAqICAgcHJpbnQoZmlyc3RDaGlsZC5nZXRDb250ZW50KCkpO1xuICogfVxuICpcbiAqIC8vIFNrZXRjaCBwcmludHM6XG4gKiAvLyBcIkdvYXRcIlxuICogPC9jb2RlPjwvZGl2PlxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogdmFyIHhtbDtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIHNlY29uZENoaWxkID0geG1sLmdldENoaWxkKDEpO1xuICogICBwcmludChzZWNvbmRDaGlsZC5nZXRDb250ZW50KCkpO1xuICogfVxuICpcbiAqIC8vIFNrZXRjaCBwcmludHM6XG4gKiAvLyBcIkxlb3BhcmRcIlxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5YTUwucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24ocGFyYW0pIHtcbiAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICBpZiAoY2hpbGQubmFtZSA9PT0gcGFyYW0pIHJldHVybiBjaGlsZDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5bcGFyYW1dO1xuICB9XG59O1xuXG4vKipcbiAqIEFwcGVuZHMgYSBuZXcgY2hpbGQgdG8gdGhlIGVsZW1lbnQuIFRoZSBjaGlsZCBjYW4gYmUgc3BlY2lmaWVkIHdpdGhcbiAqIGVpdGhlciBhIFN0cmluZywgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBuZXcgdGFnJ3MgbmFtZSwgb3IgYXMgYVxuICogcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIHA1LlhNTCBvYmplY3QuXG4gKiBBIHJlZmVyZW5jZSB0byB0aGUgbmV3bHkgY3JlYXRlZCBjaGlsZCBpcyByZXR1cm5lZCBhcyBhbiBwNS5YTUwgb2JqZWN0LlxuICpcbiAqIEBtZXRob2QgYWRkQ2hpbGRcbiAqIEBwYXJhbSB7cDUuWE1MfSBub2RlIGEgcDUuWE1MIE9iamVjdCB3aGljaCB3aWxsIGJlIHRoZSBjaGlsZCB0byBiZSBhZGRlZFxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFwibWFtbWFscy54bWxcIiBpcyBwYXJzZWRcbiAqIC8vIGluIHRoZSBjb2RlIGJlbG93LlxuICogLy9cbiAqIC8vIDw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4gKiAvLyAmbHQ7bWFtbWFscyZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjBcIiBzcGVjaWVzPVwiQ2FwcmEgaGlyY3VzXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMVwiIHNwZWNpZXM9XCJQYW50aGVyYSBwYXJkdXNcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIyXCIgc3BlY2llcz1cIkVxdXVzIHplYnJhXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICZsdDsvbWFtbWFscyZndDtcbiAqXG4gKiB2YXIgeG1sO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgY2hpbGQgPSBuZXcgcDUuWE1MKCk7XG4gKiAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnaWQnLCAnMycpO1xuICogICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3NwZWNpZXMnLCAnT3JuaXRob3JoeW5jaHVzIGFuYXRpbnVzJyk7XG4gKiAgIGNoaWxkLnNldENvbnRlbnQoJ1BsYXR5cHVzJyk7XG4gKiAgIHhtbC5hZGRDaGlsZChjaGlsZCk7XG4gKlxuICogICB2YXIgYW5pbWFscyA9IHhtbC5nZXRDaGlsZHJlbignYW5pbWFsJyk7XG4gKiAgIHByaW50KGFuaW1hbHNbYW5pbWFscy5sZW5ndGggLSAxXS5nZXRDb250ZW50KCkpO1xuICogfVxuICpcbiAqIC8vIFNrZXRjaCBwcmludHM6XG4gKiAvLyBcIkdvYXRcIlxuICogLy8gXCJMZW9wYXJkXCJcbiAqIC8vIFwiWmVicmFcIlxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5YTUwucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24obm9kZSkge1xuICBpZiAobm9kZSBpbnN0YW5jZW9mIHA1LlhNTCkge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQRU5EXG4gIH1cbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgZWxlbWVudCBzcGVjaWZpZWQgYnkgbmFtZSBvciBpbmRleC5cbiAqXG4gKiBAbWV0aG9kIHJlbW92ZUNoaWxkXG4gKiBAcGFyYW0ge1N0cmluZ3xJbnRlZ2VyfSBuYW1lIGVsZW1lbnQgbmFtZSBvciBpbmRleFxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFwibWFtbWFscy54bWxcIiBpcyBwYXJzZWRcbiAqIC8vIGluIHRoZSBjb2RlIGJlbG93LlxuICogLy9cbiAqIC8vIDw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4gKiAvLyAmbHQ7bWFtbWFscyZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjBcIiBzcGVjaWVzPVwiQ2FwcmEgaGlyY3VzXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMVwiIHNwZWNpZXM9XCJQYW50aGVyYSBwYXJkdXNcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIyXCIgc3BlY2llcz1cIkVxdXVzIHplYnJhXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICZsdDsvbWFtbWFscyZndDtcbiAqXG4gKiB2YXIgeG1sO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB4bWwucmVtb3ZlQ2hpbGQoJ2FuaW1hbCcpO1xuICogICB2YXIgY2hpbGRyZW4gPSB4bWwuZ2V0Q2hpbGRyZW4oKTtcbiAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICogICAgIHByaW50KGNoaWxkcmVuW2ldLmdldENvbnRlbnQoKSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBTa2V0Y2ggcHJpbnRzOlxuICogLy8gXCJMZW9wYXJkXCJcbiAqIC8vIFwiWmVicmFcIlxuICogPC9jb2RlPjwvZGl2PlxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogdmFyIHhtbDtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICB4bWwgPSBsb2FkWE1MKCdhc3NldHMvbWFtbWFscy54bWwnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgeG1sLnJlbW92ZUNoaWxkKDEpO1xuICogICB2YXIgY2hpbGRyZW4gPSB4bWwuZ2V0Q2hpbGRyZW4oKTtcbiAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICogICAgIHByaW50KGNoaWxkcmVuW2ldLmdldENvbnRlbnQoKSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBTa2V0Y2ggcHJpbnRzOlxuICogLy8gXCJHb2F0XCJcbiAqIC8vIFwiWmVicmFcIlxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5YTUwucHJvdG90eXBlLnJlbW92ZUNoaWxkID0gZnVuY3Rpb24ocGFyYW0pIHtcbiAgdmFyIGluZCA9IC0xO1xuICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV0ubmFtZSA9PT0gcGFyYW0pIHtcbiAgICAgICAgaW5kID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGluZCA9IHBhcmFtO1xuICB9XG4gIGlmIChpbmQgIT09IC0xKSB7XG4gICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kLCAxKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDb3VudHMgdGhlIHNwZWNpZmllZCBlbGVtZW50J3MgbnVtYmVyIG9mIGF0dHJpYnV0ZXMsIHJldHVybmVkIGFzIGFuIE51bWJlci5cbiAqXG4gKiBAbWV0aG9kIGdldEF0dHJpYnV0ZUNvdW50XG4gKiBAcmV0dXJuIHtJbnRlZ2VyfVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFwibWFtbWFscy54bWxcIiBpcyBwYXJzZWRcbiAqIC8vIGluIHRoZSBjb2RlIGJlbG93LlxuICogLy9cbiAqIC8vIDw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4gKiAvLyAmbHQ7bWFtbWFscyZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjBcIiBzcGVjaWVzPVwiQ2FwcmEgaGlyY3VzXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMVwiIHNwZWNpZXM9XCJQYW50aGVyYSBwYXJkdXNcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIyXCIgc3BlY2llcz1cIkVxdXVzIHplYnJhXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICZsdDsvbWFtbWFscyZndDtcbiAqXG4gKiB2YXIgeG1sO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgZmlyc3RDaGlsZCA9IHhtbC5nZXRDaGlsZCgnYW5pbWFsJyk7XG4gKiAgIHByaW50KGZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlQ291bnQoKSk7XG4gKiB9XG4gKlxuICogLy8gU2tldGNoIHByaW50czpcbiAqIC8vIDJcbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUuWE1MLnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVDb3VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hdHRyaWJ1dGVzKS5sZW5ndGg7XG59O1xuXG4vKipcbiAqIEdldHMgYWxsIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCdzIGF0dHJpYnV0ZXMsIGFuZCByZXR1cm5zIHRoZW0gYXMgYW5cbiAqIGFycmF5IG9mIFN0cmluZ3MuXG4gKlxuICogQG1ldGhvZCBsaXN0QXR0cmlidXRlc1xuICogQHJldHVybiB7U3RyaW5nW119IGFuIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYXR0cmlidXRlc1xuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFwibWFtbWFscy54bWxcIiBpcyBwYXJzZWRcbiAqIC8vIGluIHRoZSBjb2RlIGJlbG93LlxuICogLy9cbiAqIC8vIDw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4gKiAvLyAmbHQ7bWFtbWFscyZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjBcIiBzcGVjaWVzPVwiQ2FwcmEgaGlyY3VzXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMVwiIHNwZWNpZXM9XCJQYW50aGVyYSBwYXJkdXNcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIyXCIgc3BlY2llcz1cIkVxdXVzIHplYnJhXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICZsdDsvbWFtbWFscyZndDtcbiAqXG4gKiB2YXIgeG1sO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgZmlyc3RDaGlsZCA9IHhtbC5nZXRDaGlsZCgnYW5pbWFsJyk7XG4gKiAgIHByaW50KGZpcnN0Q2hpbGQubGlzdEF0dHJpYnV0ZXMoKSk7XG4gKiB9XG4gKlxuICogLy8gU2tldGNoIHByaW50czpcbiAqIC8vIFtcImlkXCIsIFwic3BlY2llc1wiXVxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5YTUwucHJvdG90eXBlLmxpc3RBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmF0dHJpYnV0ZXMpO1xufTtcblxuLyoqXG4gKiAgQ2hlY2tzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLlxuICpcbiAqIEBtZXRob2QgaGFzQXR0cmlidXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gdGhlIGF0dHJpYnV0ZSB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIGF0dHJpYnV0ZSBmb3VuZCBlbHNlIGZhbHNlXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXCJtYW1tYWxzLnhtbFwiIGlzIHBhcnNlZFxuICogLy8gaW4gdGhlIGNvZGUgYmVsb3cuXG4gKiAvL1xuICogLy8gPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiAqIC8vICZsdDttYW1tYWxzJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMFwiIHNwZWNpZXM9XCJDYXByYSBoaXJjdXNcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIxXCIgc3BlY2llcz1cIlBhbnRoZXJhIHBhcmR1c1wiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjJcIiBzcGVjaWVzPVwiRXF1dXMgemVicmFcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xuICogLy8gJmx0Oy9tYW1tYWxzJmd0O1xuICpcbiAqIHZhciB4bWw7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBmaXJzdENoaWxkID0geG1sLmdldENoaWxkKCdhbmltYWwnKTtcbiAqICAgcHJpbnQoZmlyc3RDaGlsZC5oYXNBdHRyaWJ1dGUoJ3NwZWNpZXMnKSk7XG4gKiAgIHByaW50KGZpcnN0Q2hpbGQuaGFzQXR0cmlidXRlKCdjb2xvcicpKTtcbiAqIH1cbiAqXG4gKiAvLyBTa2V0Y2ggcHJpbnRzOlxuICogLy8gdHJ1ZVxuICogLy8gZmFsc2VcbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUuWE1MLnByb3RvdHlwZS5oYXNBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbbmFtZV0gPyB0cnVlIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFzIGFuIE51bWJlci4gSWYgdGhlIGRlZmF1bHRWYWx1ZVxuICogcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBhbmQgdGhlIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0LCB0aGVuIGRlZmF1bHRWYWx1ZVxuICogaXMgcmV0dXJuZWQuIElmIG5vIGRlZmF1bHRWYWx1ZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBhdHRyaWJ1dGUgZG9lc24ndFxuICogZXhpc3QsIHRoZSB2YWx1ZSAwIGlzIHJldHVybmVkLlxuICpcbiAqIEBtZXRob2QgZ2V0TnVtXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAgICAgICAgICAgIHRoZSBub24tbnVsbCBmdWxsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtkZWZhdWx0VmFsdWVdICB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXCJtYW1tYWxzLnhtbFwiIGlzIHBhcnNlZFxuICogLy8gaW4gdGhlIGNvZGUgYmVsb3cuXG4gKiAvL1xuICogLy8gPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiAqIC8vICZsdDttYW1tYWxzJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMFwiIHNwZWNpZXM9XCJDYXByYSBoaXJjdXNcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIxXCIgc3BlY2llcz1cIlBhbnRoZXJhIHBhcmR1c1wiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjJcIiBzcGVjaWVzPVwiRXF1dXMgemVicmFcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xuICogLy8gJmx0Oy9tYW1tYWxzJmd0O1xuICpcbiAqIHZhciB4bWw7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBmaXJzdENoaWxkID0geG1sLmdldENoaWxkKCdhbmltYWwnKTtcbiAqICAgcHJpbnQoZmlyc3RDaGlsZC5nZXROdW0oJ2lkJykpO1xuICogfVxuICpcbiAqIC8vIFNrZXRjaCBwcmludHM6XG4gKiAvLyAwXG4gKiA8L2NvZGU+PC9kaXY+XG4gKi9cbnA1LlhNTC5wcm90b3R5cGUuZ2V0TnVtID0gZnVuY3Rpb24obmFtZSwgZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiBOdW1iZXIodGhpcy5hdHRyaWJ1dGVzW25hbWVdKSB8fCBkZWZhdWx0VmFsdWUgfHwgMDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYXMgYW4gU3RyaW5nLiBJZiB0aGUgZGVmYXVsdFZhbHVlXG4gKiBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIGFuZCB0aGUgYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3QsIHRoZW4gZGVmYXVsdFZhbHVlXG4gKiBpcyByZXR1cm5lZC4gSWYgbm8gZGVmYXVsdFZhbHVlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGF0dHJpYnV0ZSBkb2Vzbid0XG4gKiBleGlzdCwgbnVsbCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAbWV0aG9kIGdldFN0cmluZ1xuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgICAgICAgICAgICB0aGUgbm9uLW51bGwgZnVsbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbZGVmYXVsdFZhbHVlXSAgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZVxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFwibWFtbWFscy54bWxcIiBpcyBwYXJzZWRcbiAqIC8vIGluIHRoZSBjb2RlIGJlbG93LlxuICogLy9cbiAqIC8vIDw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4gKiAvLyAmbHQ7bWFtbWFscyZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjBcIiBzcGVjaWVzPVwiQ2FwcmEgaGlyY3VzXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMVwiIHNwZWNpZXM9XCJQYW50aGVyYSBwYXJkdXNcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIyXCIgc3BlY2llcz1cIkVxdXVzIHplYnJhXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICZsdDsvbWFtbWFscyZndDtcbiAqXG4gKiB2YXIgeG1sO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgZmlyc3RDaGlsZCA9IHhtbC5nZXRDaGlsZCgnYW5pbWFsJyk7XG4gKiAgIHByaW50KGZpcnN0Q2hpbGQuZ2V0U3RyaW5nKCdzcGVjaWVzJykpO1xuICogfVxuICpcbiAqIC8vIFNrZXRjaCBwcmludHM6XG4gKiAvLyBcIkNhcHJhIGhpcmN1c1wiXG4gKiA8L2NvZGU+PC9kaXY+XG4gKi9cbnA1LlhNTC5wcm90b3R5cGUuZ2V0U3RyaW5nID0gZnVuY3Rpb24obmFtZSwgZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodGhpcy5hdHRyaWJ1dGVzW25hbWVdKSB8fCBkZWZhdWx0VmFsdWUgfHwgbnVsbDtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgY29udGVudCBvZiBhbiBlbGVtZW50J3MgYXR0cmlidXRlLiBUaGUgZmlyc3QgcGFyYW1ldGVyIHNwZWNpZmllc1xuICogdGhlIGF0dHJpYnV0ZSBuYW1lLCB3aGlsZSB0aGUgc2Vjb25kIHNwZWNpZmllcyB0aGUgbmV3IGNvbnRlbnQuXG4gKlxuICogQG1ldGhvZCBzZXRBdHRyaWJ1dGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lICAgICAgICAgICAgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgYXR0cmlidXRlXG4gKiBAcGFyYW0ge051bWJlcnxTdHJpbmd8Qm9vbGVhbn0gdmFsdWUgIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXCJtYW1tYWxzLnhtbFwiIGlzIHBhcnNlZFxuICogLy8gaW4gdGhlIGNvZGUgYmVsb3cuXG4gKiAvL1xuICogLy8gPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiAqIC8vICZsdDttYW1tYWxzJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMFwiIHNwZWNpZXM9XCJDYXByYSBoaXJjdXNcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIxXCIgc3BlY2llcz1cIlBhbnRoZXJhIHBhcmR1c1wiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjJcIiBzcGVjaWVzPVwiRXF1dXMgemVicmFcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xuICogLy8gJmx0Oy9tYW1tYWxzJmd0O1xuICpcbiAqIHZhciB4bWw7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBmaXJzdENoaWxkID0geG1sLmdldENoaWxkKCdhbmltYWwnKTtcbiAqICAgcHJpbnQoZmlyc3RDaGlsZC5nZXRTdHJpbmcoJ3NwZWNpZXMnKSk7XG4gKiAgIGZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCdzcGVjaWVzJywgJ0phbWlkZXMgemVicmEnKTtcbiAqICAgcHJpbnQoZmlyc3RDaGlsZC5nZXRTdHJpbmcoJ3NwZWNpZXMnKSk7XG4gKiB9XG4gKlxuICogLy8gU2tldGNoIHByaW50czpcbiAqIC8vIFwiQ2FwcmEgaGlyY3VzXCJcbiAqIC8vIFwiSmFtaWRlcyB6ZWJyYVwiXG4gKiA8L2NvZGU+PC9kaXY+XG4gKi9cbnA1LlhNTC5wcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgaWYgKHRoaXMuYXR0cmlidXRlc1tuYW1lXSkge1xuICAgIHRoaXMuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgYW4gZWxlbWVudC4gSWYgdGhlcmUgaXMgbm8gc3VjaCBjb250ZW50LFxuICogZGVmYXVsdFZhbHVlIGlzIHJldHVybmVkIGlmIHNwZWNpZmllZCwgb3RoZXJ3aXNlIG51bGwgaXMgcmV0dXJuZWQuXG4gKlxuICogQG1ldGhvZCBnZXRDb250ZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gW2RlZmF1bHRWYWx1ZV0gdmFsdWUgcmV0dXJuZWQgaWYgbm8gY29udGVudCBpcyBmb3VuZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIC8vIFRoZSBmb2xsb3dpbmcgc2hvcnQgWE1MIGZpbGUgY2FsbGVkIFwibWFtbWFscy54bWxcIiBpcyBwYXJzZWRcbiAqIC8vIGluIHRoZSBjb2RlIGJlbG93LlxuICogLy9cbiAqIC8vIDw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4gKiAvLyAmbHQ7bWFtbWFscyZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjBcIiBzcGVjaWVzPVwiQ2FwcmEgaGlyY3VzXCI+R29hdCZsdDsvYW5pbWFsJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMVwiIHNwZWNpZXM9XCJQYW50aGVyYSBwYXJkdXNcIj5MZW9wYXJkJmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIyXCIgc3BlY2llcz1cIkVxdXVzIHplYnJhXCI+WmVicmEmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICZsdDsvbWFtbWFscyZndDtcbiAqXG4gKiB2YXIgeG1sO1xuICpcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIHhtbCA9IGxvYWRYTUwoJ2Fzc2V0cy9tYW1tYWxzLnhtbCcpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgZmlyc3RDaGlsZCA9IHhtbC5nZXRDaGlsZCgnYW5pbWFsJyk7XG4gKiAgIHByaW50KGZpcnN0Q2hpbGQuZ2V0Q29udGVudCgpKTtcbiAqIH1cbiAqXG4gKiAvLyBTa2V0Y2ggcHJpbnRzOlxuICogLy8gXCJHb2F0XCJcbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUuWE1MLnByb3RvdHlwZS5nZXRDb250ZW50ID0gZnVuY3Rpb24oZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiB0aGlzLmNvbnRlbnQgfHwgZGVmYXVsdFZhbHVlIHx8IG51bGw7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGVsZW1lbnQncyBjb250ZW50LlxuICpcbiAqIEBtZXRob2Qgc2V0Q29udGVudFxuICogQHBhcmFtIHtTdHJpbmd9IHRleHQgdGhlIG5ldyBjb250ZW50XG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogLy8gVGhlIGZvbGxvd2luZyBzaG9ydCBYTUwgZmlsZSBjYWxsZWQgXCJtYW1tYWxzLnhtbFwiIGlzIHBhcnNlZFxuICogLy8gaW4gdGhlIGNvZGUgYmVsb3cuXG4gKiAvL1xuICogLy8gPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiAqIC8vICZsdDttYW1tYWxzJmd0O1xuICogLy8gICAmbHQ7YW5pbWFsIGlkPVwiMFwiIHNwZWNpZXM9XCJDYXByYSBoaXJjdXNcIj5Hb2F0Jmx0Oy9hbmltYWwmZ3Q7XG4gKiAvLyAgICZsdDthbmltYWwgaWQ9XCIxXCIgc3BlY2llcz1cIlBhbnRoZXJhIHBhcmR1c1wiPkxlb3BhcmQmbHQ7L2FuaW1hbCZndDtcbiAqIC8vICAgJmx0O2FuaW1hbCBpZD1cIjJcIiBzcGVjaWVzPVwiRXF1dXMgemVicmFcIj5aZWJyYSZsdDsvYW5pbWFsJmd0O1xuICogLy8gJmx0Oy9tYW1tYWxzJmd0O1xuICpcbiAqIHZhciB4bWw7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgeG1sID0gbG9hZFhNTCgnYXNzZXRzL21hbW1hbHMueG1sJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBmaXJzdENoaWxkID0geG1sLmdldENoaWxkKCdhbmltYWwnKTtcbiAqICAgcHJpbnQoZmlyc3RDaGlsZC5nZXRDb250ZW50KCkpO1xuICogICBmaXJzdENoaWxkLnNldENvbnRlbnQoJ01vdW50YWluIEdvYXQnKTtcbiAqICAgcHJpbnQoZmlyc3RDaGlsZC5nZXRDb250ZW50KCkpO1xuICogfVxuICpcbiAqIC8vIFNrZXRjaCBwcmludHM6XG4gKiAvLyBcIkdvYXRcIlxuICogLy8gXCJNb3VudGFpbiBHb2F0XCJcbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUuWE1MLnByb3RvdHlwZS5zZXRDb250ZW50ID0gZnVuY3Rpb24oY29udGVudCkge1xuICBpZiAoIXRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgfVxufTtcblxuLyogSEVMUEVSUyAqL1xuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgdGhlIHBhcnNpbmcgb2YgWE1MICh3aGVuIGxvYWRYTUwoKSBpc1xuICogY2FsbGVkKS4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIG1ldGhvZCBhbmQgdGhlIHNldENvbnRlbnQoKVxuICogbWV0aG9kIGRlZmluZWQgbGF0ZXIgaXMgdGhhdCB0aGlzIG9uZSBpcyB1c2VkIHRvIHNldCB0aGUgY29udGVudFxuICogd2hlbiB0aGUgbm9kZSBpbiBxdWVzdGlvbiBoYXMgbW9yZSBub2RlcyB1bmRlciBpdCBhbmQgc28gb24gYW5kXG4gKiBub3QgZGlyZWN0bHkgdGV4dCBjb250ZW50LiBXaGlsZSBpbiB0aGUgb3RoZXIgb25lIGlzIHVzZWQgd2hlblxuICogdGhlIG5vZGUgaW4gcXVlc3Rpb24gZGlyZWN0bHkgaGFzIHRleHQgaW5zaWRlIGl0LlxuICpcbiAqL1xucDUuWE1MLnByb3RvdHlwZS5fc2V0Q29udCA9IGZ1bmN0aW9uKGNvbnRlbnQpIHtcbiAgdmFyIHN0cjtcbiAgc3RyID0gY29udGVudDtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1xcc1xccysvZywgJywnKTtcbiAgLy9zdHIgPSBzdHIuc3BsaXQoJywnKTtcbiAgdGhpcy5jb250ZW50ID0gc3RyO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgdGhlIHBhcnNpbmcgb2YgWE1MICh3aGVuIGxvYWRYTUwoKSBpc1xuICogY2FsbGVkKS4gVGhlIFhNTCBub2RlIGlzIHBhc3NlZCBhbmQgaXRzIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBpbiB0aGVcbiAqIHA1LlhNTCdzIGF0dHJpYnV0ZSBPYmplY3QuXG4gKlxuICovXG5wNS5YTUwucHJvdG90eXBlLl9zZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24obm9kZSkge1xuICB2YXIgYXR0ID0ge307XG4gIHZhciBhdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuICBpZiAoYXR0cmlidXRlcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07XG4gICAgICBhdHRbYXR0cmlidXRlLm5vZGVOYW1lXSA9IGF0dHJpYnV0ZS5ub2RlVmFsdWU7XG4gICAgfVxuICB9XG4gIHRoaXMuYXR0cmlidXRlcyA9IGF0dDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSw1MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgTWF0aFxuICogQHN1Ym1vZHVsZSBDYWxjdWxhdGlvblxuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFic29sdXRlIHZhbHVlIChtYWduaXR1ZGUpIG9mIGEgbnVtYmVyLiBNYXBzIHRvIE1hdGguYWJzKCkuXG4gKiBUaGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBudW1iZXIgaXMgYWx3YXlzIHBvc2l0aXZlLlxuICpcbiAqIEBtZXRob2QgYWJzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IG4gbnVtYmVyIHRvIGNvbXB1dGVcbiAqIEByZXR1cm4ge051bWJlcn0gICBhYnNvbHV0ZSB2YWx1ZSBvZiBnaXZlbiBudW1iZXJcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzID0gXCJub3JlbmRlclwiPjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciB4ID0gLTM7XG4gKiAgIHZhciB5ID0gYWJzKHgpO1xuICpcbiAqICAgcHJpbnQoeCk7IC8vIC0zXG4gKiAgIHByaW50KHkpOyAvLyAzXG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogbm8gaW1hZ2UgZGlzcGxheWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUuYWJzID0gTWF0aC5hYnM7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY2xvc2VzdCBpbnQgdmFsdWUgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlXG4gKiB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLiBNYXBzIHRvIE1hdGguY2VpbCgpLiBGb3IgZXhhbXBsZSwgY2VpbCg5LjAzKVxuICogcmV0dXJucyB0aGUgdmFsdWUgMTAuXG4gKlxuICogQG1ldGhvZCBjZWlsXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IG4gbnVtYmVyIHRvIHJvdW5kIHVwXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSAgIHJvdW5kZWQgdXAgbnVtYmVyXG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgLy8gbWFwLCBtb3VzZVggYmV0d2VlbiAwIGFuZCA1LlxuICogICB2YXIgYXggPSBtYXAobW91c2VYLCAwLCAxMDAsIDAsIDUpO1xuICogICB2YXIgYXkgPSA2NjtcbiAqXG4gKiAgIC8vR2V0IHRoZSBjZWlsaW5nIG9mIHRoZSBtYXBwZWQgbnVtYmVyLlxuICogICB2YXIgYnggPSBjZWlsKG1hcChtb3VzZVgsIDAsIDEwMCwgMCwgNSkpO1xuICogICB2YXIgYnkgPSAzMztcbiAqXG4gKiAgIC8vIE11bHRpcGx5IHRoZSBtYXBwZWQgbnVtYmVycyBieSAyMCB0byBtb3JlIGVhc2lseVxuICogICAvLyBzZWUgdGhlIGNoYW5nZXMuXG4gKiAgIHN0cm9rZSgwKTtcbiAqICAgZmlsbCgwKTtcbiAqICAgbGluZSgwLCBheSwgYXggKiAyMCwgYXkpO1xuICogICBsaW5lKDAsIGJ5LCBieCAqIDIwLCBieSk7XG4gKlxuICogICAvLyBSZWZvcm1hdCB0aGUgZmxvYXQgcmV0dXJuZWQgYnkgbWFwIGFuZCBkcmF3IGl0LlxuICogICBub1N0cm9rZSgpO1xuICogICB0ZXh0KG5mYyhheCwgMiksIGF4LCBheSAtIDUpO1xuICogICB0ZXh0KG5mYyhieCwgMSksIGJ4LCBieSAtIDUpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDIgaG9yaXpvbnRhbCBsaW5lcyAmIG51bWJlciBzZXRzLiBpbmNyZWFzZSB3aXRoIG1vdXNlIHguIGJvdHRvbSB0byAyIGRlY2ltYWxzXG4gKlxuICovXG5wNS5wcm90b3R5cGUuY2VpbCA9IE1hdGguY2VpbDtcblxuLyoqXG4gKiBDb25zdHJhaW5zIGEgdmFsdWUgYmV0d2VlbiBhIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUuXG4gKlxuICogQG1ldGhvZCBjb25zdHJhaW5cbiAqIEBwYXJhbSAge051bWJlcn0gbiAgICBudW1iZXIgdG8gY29uc3RyYWluXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGxvdyAgbWluaW11bSBsaW1pdFxuICogQHBhcmFtICB7TnVtYmVyfSBoaWdoIG1heGltdW0gbGltaXRcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICBjb25zdHJhaW5lZCBudW1iZXJcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICpcbiAqICAgdmFyIGxlZnRXYWxsID0gMjU7XG4gKiAgIHZhciByaWdodFdhbGwgPSA3NTtcbiAqXG4gKiAgIC8vIHhtIGlzIGp1c3QgdGhlIG1vdXNlWCwgd2hpbGVcbiAqICAgLy8geGMgaXMgdGhlIG1vdXNlWCwgYnV0IGNvbnN0cmFpbmVkXG4gKiAgIC8vIGJldHdlZW4gdGhlIGxlZnRXYWxsIGFuZCByaWdodFdhbGwhXG4gKiAgIHZhciB4bSA9IG1vdXNlWDtcbiAqICAgdmFyIHhjID0gY29uc3RyYWluKG1vdXNlWCwgbGVmdFdhbGwsIHJpZ2h0V2FsbCk7XG4gKlxuICogICAvLyBEcmF3IHRoZSB3YWxscy5cbiAqICAgc3Ryb2tlKDE1MCk7XG4gKiAgIGxpbmUobGVmdFdhbGwsIDAsIGxlZnRXYWxsLCBoZWlnaHQpO1xuICogICBsaW5lKHJpZ2h0V2FsbCwgMCwgcmlnaHRXYWxsLCBoZWlnaHQpO1xuICpcbiAqICAgLy8gRHJhdyB4bSBhbmQgeGMgYXMgY2lyY2xlcy5cbiAqICAgbm9TdHJva2UoKTtcbiAqICAgZmlsbCgxNTApO1xuICogICBlbGxpcHNlKHhtLCAzMywgOSwgOSk7IC8vIE5vdCBDb25zdHJhaW5lZFxuICogICBmaWxsKDApO1xuICogICBlbGxpcHNlKHhjLCA2NiwgOSwgOSk7IC8vIENvbnN0cmFpbmVkXG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogMiB2ZXJ0aWNhbCBsaW5lcy4gMiBlbGxpcHNlcyBtb3ZlIHdpdGggbW91c2UgWCAxIGRvZXMgbm90IG1vdmUgcGFzc2VkIGxpbmVzXG4gKlxuICovXG5wNS5wcm90b3R5cGUuY29uc3RyYWluID0gZnVuY3Rpb24obiwgbG93LCBoaWdoKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2NvbnN0cmFpbicsIGFyZ3VtZW50cyk7XG4gIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihuLCBoaWdoKSwgbG93KTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLlxuICpcbiAqIEBtZXRob2QgZGlzdFxuICogQHBhcmFtICB7TnVtYmVyfSB4MSB4LWNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkxIHktY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geDIgeC1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSAge051bWJlcn0geTIgeS1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm4ge051bWJlcn0gICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50c1xuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogLy8gTW92ZSB5b3VyIG1vdXNlIGluc2lkZSB0aGUgY2FudmFzIHRvIHNlZSB0aGVcbiAqIC8vIGNoYW5nZSBpbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMhXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIGZpbGwoMCk7XG4gKlxuICogICB2YXIgeDEgPSAxMDtcbiAqICAgdmFyIHkxID0gOTA7XG4gKiAgIHZhciB4MiA9IG1vdXNlWDtcbiAqICAgdmFyIHkyID0gbW91c2VZO1xuICpcbiAqICAgbGluZSh4MSwgeTEsIHgyLCB5Mik7XG4gKiAgIGVsbGlwc2UoeDEsIHkxLCA3LCA3KTtcbiAqICAgZWxsaXBzZSh4MiwgeTIsIDcsIDcpO1xuICpcbiAqICAgLy8gZCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lXG4gKiAgIC8vIHRoZSBkaXN0YW5jZSBmcm9tIHBvaW50IDEgdG8gcG9pbnQgMi5cbiAqICAgdmFyIGQgPSBpbnQoZGlzdCh4MSwgeTEsIHgyLCB5MikpO1xuICpcbiAqICAgLy8gTGV0J3Mgd3JpdGUgZCBhbG9uZyB0aGUgbGluZSB3ZSBhcmUgZHJhd2luZyFcbiAqICAgcHVzaCgpO1xuICogICB0cmFuc2xhdGUoKHgxICsgeDIpIC8gMiwgKHkxICsgeTIpIC8gMik7XG4gKiAgIHJvdGF0ZShhdGFuMih5MiAtIHkxLCB4MiAtIHgxKSk7XG4gKiAgIHRleHQobmZjKGQsIDEpLCAwLCAtNSk7XG4gKiAgIHBvcCgpO1xuICogICAvLyBGYW5jeSFcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAyIGVsbGlwc2VzIGpvaW5lZCBieSBsaW5lLiAxIGVsbGlwc2UgbW92ZXMgd2l0aCBtb3VzZSBYJlkuIERpc3RhbmNlIGRpc3BsYXllZC5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGRpc3RcbiAqIEBwYXJhbSAge051bWJlcn0geDFcbiAqIEBwYXJhbSAge051bWJlcn0geTFcbiAqIEBwYXJhbSAge051bWJlcn0gejEgei1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludFxuICogQHBhcmFtICB7TnVtYmVyfSB4MlxuICogQHBhcmFtICB7TnVtYmVyfSB5MlxuICogQHBhcmFtICB7TnVtYmVyfSB6MiB6LWNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludFxuICogQHJldHVybiB7TnVtYmVyfSAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRzXG4gKi9cbnA1LnByb3RvdHlwZS5kaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2Rpc3QnLCBhcmd1bWVudHMpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkge1xuICAgIC8vMkRcbiAgICByZXR1cm4gaHlwb3QoYXJndW1lbnRzWzJdIC0gYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbM10gLSBhcmd1bWVudHNbMV0pO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDYpIHtcbiAgICAvLzNEXG4gICAgcmV0dXJuIGh5cG90KFxuICAgICAgYXJndW1lbnRzWzNdIC0gYXJndW1lbnRzWzBdLFxuICAgICAgYXJndW1lbnRzWzRdIC0gYXJndW1lbnRzWzFdLFxuICAgICAgYXJndW1lbnRzWzVdIC0gYXJndW1lbnRzWzJdXG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIEV1bGVyJ3MgbnVtYmVyIGUgKDIuNzE4MjguLi4pIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgdGhlIG5cbiAqIHBhcmFtZXRlci4gTWFwcyB0byBNYXRoLmV4cCgpLlxuICpcbiAqIEBtZXRob2QgZXhwXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IG4gZXhwb25lbnQgdG8gcmFpc2VcbiAqIEByZXR1cm4ge051bWJlcn0gICBlXm5cbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICpcbiAqICAgLy8gQ29tcHV0ZSB0aGUgZXhwKCkgZnVuY3Rpb24gd2l0aCBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMlxuICogICB2YXIgeFZhbHVlID0gbWFwKG1vdXNlWCwgMCwgd2lkdGgsIDAsIDIpO1xuICogICB2YXIgeVZhbHVlID0gZXhwKHhWYWx1ZSk7XG4gKlxuICogICB2YXIgeSA9IG1hcCh5VmFsdWUsIDAsIDgsIGhlaWdodCwgMCk7XG4gKlxuICogICB2YXIgbGVnZW5kID0gJ2V4cCAoJyArIG5mYyh4VmFsdWUsIDMpICsgJylcXG49ICcgKyBuZih5VmFsdWUsIDEsIDQpO1xuICogICBzdHJva2UoMTUwKTtcbiAqICAgbGluZShtb3VzZVgsIHksIG1vdXNlWCwgaGVpZ2h0KTtcbiAqICAgZmlsbCgwKTtcbiAqICAgdGV4dChsZWdlbmQsIDUsIDE1KTtcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgZWxsaXBzZShtb3VzZVgsIHksIDcsIDcpO1xuICpcbiAqICAgLy8gRHJhdyB0aGUgZXhwKHgpIGN1cnZlLFxuICogICAvLyBvdmVyIHRoZSBkb21haW4gb2YgeCBmcm9tIDAgdG8gMlxuICogICBub0ZpbGwoKTtcbiAqICAgc3Ryb2tlKDApO1xuICogICBiZWdpblNoYXBlKCk7XG4gKiAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICogICAgIHhWYWx1ZSA9IG1hcCh4LCAwLCB3aWR0aCwgMCwgMik7XG4gKiAgICAgeVZhbHVlID0gZXhwKHhWYWx1ZSk7XG4gKiAgICAgeSA9IG1hcCh5VmFsdWUsIDAsIDgsIGhlaWdodCwgMCk7XG4gKiAgICAgdmVydGV4KHgsIHkpO1xuICogICB9XG4gKlxuICogICBlbmRTaGFwZSgpO1xuICogICBsaW5lKDAsIDAsIDAsIGhlaWdodCk7XG4gKiAgIGxpbmUoMCwgaGVpZ2h0IC0gMSwgd2lkdGgsIGhlaWdodCAtIDEpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGVsbGlwc2UgbW92ZXMgYWxvbmcgYSBjdXJ2ZSB3aXRoIG1vdXNlIHguIGVebiBkaXNwbGF5ZWQuXG4gKlxuICovXG5wNS5wcm90b3R5cGUuZXhwID0gTWF0aC5leHA7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY2xvc2VzdCBpbnQgdmFsdWUgdGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlXG4gKiB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLiBNYXBzIHRvIE1hdGguZmxvb3IoKS5cbiAqXG4gKiBAbWV0aG9kIGZsb29yXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IG4gbnVtYmVyIHRvIHJvdW5kIGRvd25cbiAqIEByZXR1cm4ge0ludGVnZXJ9ICByb3VuZGVkIGRvd24gbnVtYmVyXG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgLy9tYXAsIG1vdXNlWCBiZXR3ZWVuIDAgYW5kIDUuXG4gKiAgIHZhciBheCA9IG1hcChtb3VzZVgsIDAsIDEwMCwgMCwgNSk7XG4gKiAgIHZhciBheSA9IDY2O1xuICpcbiAqICAgLy9HZXQgdGhlIGZsb29yIG9mIHRoZSBtYXBwZWQgbnVtYmVyLlxuICogICB2YXIgYnggPSBmbG9vcihtYXAobW91c2VYLCAwLCAxMDAsIDAsIDUpKTtcbiAqICAgdmFyIGJ5ID0gMzM7XG4gKlxuICogICAvLyBNdWx0aXBseSB0aGUgbWFwcGVkIG51bWJlcnMgYnkgMjAgdG8gbW9yZSBlYXNpbHlcbiAqICAgLy8gc2VlIHRoZSBjaGFuZ2VzLlxuICogICBzdHJva2UoMCk7XG4gKiAgIGZpbGwoMCk7XG4gKiAgIGxpbmUoMCwgYXksIGF4ICogMjAsIGF5KTtcbiAqICAgbGluZSgwLCBieSwgYnggKiAyMCwgYnkpO1xuICpcbiAqICAgLy8gUmVmb3JtYXQgdGhlIGZsb2F0IHJldHVybmVkIGJ5IG1hcCBhbmQgZHJhdyBpdC5cbiAqICAgbm9TdHJva2UoKTtcbiAqICAgdGV4dChuZmMoYXgsIDIpLCBheCwgYXkgLSA1KTtcbiAqICAgdGV4dChuZmMoYngsIDEpLCBieCwgYnkgLSA1KTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAyIGhvcml6b250YWwgbGluZXMgJiBudW1iZXIgc2V0cy4gaW5jcmVhc2Ugd2l0aCBtb3VzZSB4LiBib3R0b20gdG8gMiBkZWNpbWFsc1xuICpcbiAqL1xucDUucHJvdG90eXBlLmZsb29yID0gTWF0aC5mbG9vcjtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgbnVtYmVyIGJldHdlZW4gdHdvIG51bWJlcnMgYXQgYSBzcGVjaWZpYyBpbmNyZW1lbnQuIFRoZSBhbXRcbiAqIHBhcmFtZXRlciBpcyB0aGUgYW1vdW50IHRvIGludGVycG9sYXRlIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgd2hlcmUgMC4wXG4gKiBlcXVhbCB0byB0aGUgZmlyc3QgcG9pbnQsIDAuMSBpcyB2ZXJ5IG5lYXIgdGhlIGZpcnN0IHBvaW50LCAwLjUgaXNcbiAqIGhhbGYtd2F5IGluIGJldHdlZW4sIGV0Yy4gVGhlIGxlcnAgZnVuY3Rpb24gaXMgY29udmVuaWVudCBmb3IgY3JlYXRpbmdcbiAqIG1vdGlvbiBhbG9uZyBhIHN0cmFpZ2h0IHBhdGggYW5kIGZvciBkcmF3aW5nIGRvdHRlZCBsaW5lcy5cbiAqXG4gKiBAbWV0aG9kIGxlcnBcbiAqIEBwYXJhbSAge051bWJlcn0gc3RhcnQgZmlyc3QgdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gc3RvcCAgc2Vjb25kIHZhbHVlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGFtdCAgIG51bWJlciBiZXR3ZWVuIDAuMCBhbmQgMS4wXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgIGxlcnBlZCB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICB2YXIgYSA9IDIwO1xuICogICB2YXIgYiA9IDgwO1xuICogICB2YXIgYyA9IGxlcnAoYSwgYiwgMC4yKTtcbiAqICAgdmFyIGQgPSBsZXJwKGEsIGIsIDAuNSk7XG4gKiAgIHZhciBlID0gbGVycChhLCBiLCAwLjgpO1xuICpcbiAqICAgdmFyIHkgPSA1MDtcbiAqXG4gKiAgIHN0cm9rZVdlaWdodCg1KTtcbiAqICAgc3Ryb2tlKDApOyAvLyBEcmF3IHRoZSBvcmlnaW5hbCBwb2ludHMgaW4gYmxhY2tcbiAqICAgcG9pbnQoYSwgeSk7XG4gKiAgIHBvaW50KGIsIHkpO1xuICpcbiAqICAgc3Ryb2tlKDEwMCk7IC8vIERyYXcgdGhlIGxlcnAgcG9pbnRzIGluIGdyYXlcbiAqICAgcG9pbnQoYywgeSk7XG4gKiAgIHBvaW50KGQsIHkpO1xuICogICBwb2ludChlLCB5KTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiA1IHBvaW50cyBob3Jpem9udGFsbHkgc3RhZ2dlcmVkIG1pZC1jYW52YXMuIG1pZCAzIGFyZSBncmV5LCBvdXRlciBibGFja1xuICpcbiAqL1xucDUucHJvdG90eXBlLmxlcnAgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgYW10KSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2xlcnAnLCBhcmd1bWVudHMpO1xuICByZXR1cm4gYW10ICogKHN0b3AgLSBzdGFydCkgKyBzdGFydDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gKHRoZSBiYXNlLWUgbG9nYXJpdGhtKSBvZiBhIG51bWJlci4gVGhpc1xuICogZnVuY3Rpb24gZXhwZWN0cyB0aGUgbiBwYXJhbWV0ZXIgdG8gYmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4wLiBNYXBzIHRvXG4gKiBNYXRoLmxvZygpLlxuICpcbiAqIEBtZXRob2QgbG9nXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IG4gbnVtYmVyIGdyZWF0ZXIgdGhhbiAwXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgbmF0dXJhbCBsb2dhcml0aG0gb2YgblxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHZhciBtYXhYID0gMi44O1xuICogICB2YXIgbWF4WSA9IDEuNTtcbiAqXG4gKiAgIC8vIENvbXB1dGUgdGhlIG5hdHVyYWwgbG9nIG9mIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCBtYXhYXG4gKiAgIHZhciB4VmFsdWUgPSBtYXAobW91c2VYLCAwLCB3aWR0aCwgMCwgbWF4WCk7XG4gKiAgIGlmICh4VmFsdWUgPiAwKSB7XG4gICAgLy8gQ2Fubm90IHRha2UgdGhlIGxvZyBvZiBhIG5lZ2F0aXZlIG51bWJlci5cbiAqICAgICB2YXIgeVZhbHVlID0gbG9nKHhWYWx1ZSk7XG4gKiAgICAgdmFyIHkgPSBtYXAoeVZhbHVlLCAtbWF4WSwgbWF4WSwgaGVpZ2h0LCAwKTtcbiAqXG4gKiAgICAgLy8gRGlzcGxheSB0aGUgY2FsY3VsYXRpb24gb2NjdXJyaW5nLlxuICogICAgIHZhciBsZWdlbmQgPSAnbG9nKCcgKyBuZih4VmFsdWUsIDEsIDIpICsgJylcXG49ICcgKyBuZih5VmFsdWUsIDEsIDMpO1xuICogICAgIHN0cm9rZSgxNTApO1xuICogICAgIGxpbmUobW91c2VYLCB5LCBtb3VzZVgsIGhlaWdodCk7XG4gKiAgICAgZmlsbCgwKTtcbiAqICAgICB0ZXh0KGxlZ2VuZCwgNSwgMTUpO1xuICogICAgIG5vU3Ryb2tlKCk7XG4gKiAgICAgZWxsaXBzZShtb3VzZVgsIHksIDcsIDcpO1xuICogICB9XG4gKlxuICogICAvLyBEcmF3IHRoZSBsb2coeCkgY3VydmUsXG4gKiAgIC8vIG92ZXIgdGhlIGRvbWFpbiBvZiB4IGZyb20gMCB0byBtYXhYXG4gKiAgIG5vRmlsbCgpO1xuICogICBzdHJva2UoMCk7XG4gKiAgIGJlZ2luU2hhcGUoKTtcbiAqICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gKiAgICAgeFZhbHVlID0gbWFwKHgsIDAsIHdpZHRoLCAwLCBtYXhYKTtcbiAqICAgICB5VmFsdWUgPSBsb2coeFZhbHVlKTtcbiAqICAgICB5ID0gbWFwKHlWYWx1ZSwgLW1heFksIG1heFksIGhlaWdodCwgMCk7XG4gKiAgICAgdmVydGV4KHgsIHkpO1xuICogICB9XG4gKiAgIGVuZFNoYXBlKCk7XG4gKiAgIGxpbmUoMCwgMCwgMCwgaGVpZ2h0KTtcbiAqICAgbGluZSgwLCBoZWlnaHQgLyAyLCB3aWR0aCwgaGVpZ2h0IC8gMik7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogZWxsaXBzZSBtb3ZlcyBhbG9uZyBhIGN1cnZlIHdpdGggbW91c2UgeC4gbmF0dXJhbCBsb2dhcml0aG0gb2YgbiBkaXNwbGF5ZWQuXG4gKlxuICovXG5wNS5wcm90b3R5cGUubG9nID0gTWF0aC5sb2c7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbWFnbml0dWRlIChvciBsZW5ndGgpIG9mIGEgdmVjdG9yLiBBIHZlY3RvciBpcyBhIGRpcmVjdGlvblxuICogaW4gc3BhY2UgY29tbW9ubHkgdXNlZCBpbiBjb21wdXRlciBncmFwaGljcyBhbmQgbGluZWFyIGFsZ2VicmEuIEJlY2F1c2UgaXRcbiAqIGhhcyBubyBcInN0YXJ0XCIgcG9zaXRpb24sIHRoZSBtYWduaXR1ZGUgb2YgYSB2ZWN0b3IgY2FuIGJlIHRob3VnaHQgb2YgYXNcbiAqIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb29yZGluYXRlIDAsMCB0byBpdHMgeCx5IHZhbHVlLiBUaGVyZWZvcmUsIG1hZygpIGlzXG4gKiBhIHNob3J0Y3V0IGZvciB3cml0aW5nIGRpc3QoMCwgMCwgeCwgeSkuXG4gKlxuICogQG1ldGhvZCBtYWdcbiAqIEBwYXJhbSAge051bWJlcn0gYSBmaXJzdCB2YWx1ZVxuICogQHBhcmFtICB7TnVtYmVyfSBiIHNlY29uZCB2YWx1ZVxuICogQHJldHVybiB7TnVtYmVyfSAgIG1hZ25pdHVkZSBvZiB2ZWN0b3IgZnJvbSAoMCwwKSB0byAoYSxiKVxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIHgxID0gMjA7XG4gKiAgIHZhciB4MiA9IDgwO1xuICogICB2YXIgeTEgPSAzMDtcbiAqICAgdmFyIHkyID0gNzA7XG4gKlxuICogICBsaW5lKDAsIDAsIHgxLCB5MSk7XG4gKiAgIHByaW50KG1hZyh4MSwgeTEpKTsgLy8gUHJpbnRzIFwiMzYuMDU1NTEyNzU0NjM5ODlcIlxuICogICBsaW5lKDAsIDAsIHgyLCB5MSk7XG4gKiAgIHByaW50KG1hZyh4MiwgeTEpKTsgLy8gUHJpbnRzIFwiODUuNDQwMDM3NDUzMTc1MzFcIlxuICogICBsaW5lKDAsIDAsIHgxLCB5Mik7XG4gKiAgIHByaW50KG1hZyh4MSwgeTIpKTsgLy8gUHJpbnRzIFwiNzIuODAxMDk4ODkyODA1MTlcIlxuICogICBsaW5lKDAsIDAsIHgyLCB5Mik7XG4gKiAgIHByaW50KG1hZyh4MiwgeTIpKTsgLy8gUHJpbnRzIFwiMTA2LjMwMTQ1ODEyNzM0NjVcIlxuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDQgbGluZXMgb2YgZGlmZmVyZW50IGxlbmd0aCByYWRpYXRlIGZyb20gdG9wIGxlZnQgb2YgY2FudmFzLlxuICpcbiAqL1xucDUucHJvdG90eXBlLm1hZyA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnbWFnJywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIGh5cG90KHgsIHkpO1xufTtcblxuLyoqXG4gKiBSZS1tYXBzIGEgbnVtYmVyIGZyb20gb25lIHJhbmdlIHRvIGFub3RoZXIuXG4gKiA8YnI+PGJyPlxuICogSW4gdGhlIGZpcnN0IGV4YW1wbGUgYWJvdmUsIHRoZSBudW1iZXIgMjUgaXMgY29udmVydGVkIGZyb20gYSB2YWx1ZSBpbiB0aGVcbiAqIHJhbmdlIG9mIDAgdG8gMTAwIGludG8gYSB2YWx1ZSB0aGF0IHJhbmdlcyBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlXG4gKiB3aW5kb3cgKDApIHRvIHRoZSByaWdodCBlZGdlICh3aWR0aCkuXG4gKlxuICogQG1ldGhvZCBtYXBcbiAqIEBwYXJhbSAge051bWJlcn0gdmFsdWUgIHRoZSBpbmNvbWluZyB2YWx1ZSB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSAge051bWJlcn0gc3RhcnQxIGxvd2VyIGJvdW5kIG9mIHRoZSB2YWx1ZSdzIGN1cnJlbnQgcmFuZ2VcbiAqIEBwYXJhbSAge051bWJlcn0gc3RvcDEgIHVwcGVyIGJvdW5kIG9mIHRoZSB2YWx1ZSdzIGN1cnJlbnQgcmFuZ2VcbiAqIEBwYXJhbSAge051bWJlcn0gc3RhcnQyIGxvd2VyIGJvdW5kIG9mIHRoZSB2YWx1ZSdzIHRhcmdldCByYW5nZVxuICogQHBhcmFtICB7TnVtYmVyfSBzdG9wMiAgdXBwZXIgYm91bmQgb2YgdGhlIHZhbHVlJ3MgdGFyZ2V0IHJhbmdlXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbd2l0aGluQm91bmRzXSBjb25zdHJhaW4gdGhlIHZhbHVlIHRvIHRoZSBuZXdseSBtYXBwZWQgcmFuZ2VcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgIHJlbWFwcGVkIG51bWJlclxuICogQGV4YW1wbGVcbiAqICAgPGRpdj48Y29kZT5cbiAqIHZhciB2YWx1ZSA9IDI1O1xuICogdmFyIG0gPSBtYXAodmFsdWUsIDAsIDEwMCwgMCwgd2lkdGgpO1xuICogZWxsaXBzZShtLCA1MCwgMTAsIDEwKTtcbjwvY29kZT48L2Rpdj5cbiAqXG4gKiAgIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgbm9TdHJva2UoKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwNCk7XG4gKiAgIHZhciB4MSA9IG1hcChtb3VzZVgsIDAsIHdpZHRoLCAyNSwgNzUpO1xuICogICBlbGxpcHNlKHgxLCAyNSwgMjUsIDI1KTtcbiAqICAgLy9UaGlzIGVsbGlwc2UgaXMgY29uc3RyYWluZWQgdG8gdGhlIDAtMTAwIHJhbmdlXG4gKiAgIC8vYWZ0ZXIgc2V0dGluZyB3aXRoaW5Cb3VuZHMgdG8gdHJ1ZVxuICogICB2YXIgeDIgPSBtYXAobW91c2VYLCAwLCB3aWR0aCwgMCwgMTAwLCB0cnVlKTtcbiAqICAgZWxsaXBzZSh4MiwgNzUsIDI1LCAyNSk7XG4gKiB9XG48L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogMTAgYnkgMTAgd2hpdGUgZWxsaXBzZSB3aXRoIGluIG1pZCBsZWZ0IGNhbnZhc1xuICogMiAyNSBieSAyNSB3aGl0ZSBlbGxpcHNlcyBtb3ZlIHdpdGggbW91c2UgeC4gQm90dG9tIGhhcyBtb3JlIHJhbmdlIGZyb20gWFxuICpcbiAqL1xucDUucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uKG4sIHN0YXJ0MSwgc3RvcDEsIHN0YXJ0Miwgc3RvcDIsIHdpdGhpbkJvdW5kcykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdtYXAnLCBhcmd1bWVudHMpO1xuICB2YXIgbmV3dmFsID0gKG4gLSBzdGFydDEpIC8gKHN0b3AxIC0gc3RhcnQxKSAqIChzdG9wMiAtIHN0YXJ0MikgKyBzdGFydDI7XG4gIGlmICghd2l0aGluQm91bmRzKSB7XG4gICAgcmV0dXJuIG5ld3ZhbDtcbiAgfVxuICBpZiAoc3RhcnQyIDwgc3RvcDIpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJhaW4obmV3dmFsLCBzdGFydDIsIHN0b3AyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJhaW4obmV3dmFsLCBzdG9wMiwgc3RhcnQyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBsYXJnZXN0IHZhbHVlIGluIGEgc2VxdWVuY2Ugb2YgbnVtYmVycywgYW5kIHRoZW4gcmV0dXJuc1xuICogdGhhdCB2YWx1ZS4gbWF4KCkgYWNjZXB0cyBhbnkgbnVtYmVyIG9mIE51bWJlciBwYXJhbWV0ZXJzLCBvciBhbiBBcnJheVxuICogb2YgYW55IGxlbmd0aC5cbiAqXG4gKiBAbWV0aG9kIG1heFxuICogQHBhcmFtICB7TnVtYmVyfSBuMCBOdW1iZXIgdG8gY29tcGFyZVxuICogQHBhcmFtICB7TnVtYmVyfSBuMSBOdW1iZXIgdG8gY29tcGFyZVxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICAgICBtYXhpbXVtIE51bWJlclxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgLy8gQ2hhbmdlIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgYW5kIHJ1biB0aGUgc2tldGNoXG4gKiAgIC8vIHRvIHNob3cgaG93IG1heCgpIHdvcmtzIVxuICogICB2YXIgbnVtQXJyYXkgPSBbMiwgMSwgNSwgNCwgOCwgOV07XG4gKiAgIGZpbGwoMCk7XG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIHRleHQoJ0FycmF5IEVsZW1lbnRzJywgMCwgMTApO1xuICogICAvLyBEcmF3IGFsbCBudW1iZXJzIGluIHRoZSBhcnJheVxuICogICB2YXIgc3BhY2luZyA9IDE1O1xuICogICB2YXIgZWxlbXNZID0gMjU7XG4gKiAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAqICAgICB0ZXh0KG51bUFycmF5W2ldLCBpICogc3BhY2luZywgZWxlbXNZKTtcbiAqICAgfVxuICogICB2YXIgbWF4WCA9IDMzO1xuICogICB2YXIgbWF4WSA9IDgwO1xuICogICAvLyBEcmF3IHRoZSBNYXhpbXVtIHZhbHVlIGluIHRoZSBhcnJheS5cbiAqICAgdGV4dFNpemUoMzIpO1xuICogICB0ZXh0KG1heChudW1BcnJheSksIG1heFgsIG1heFkpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIFNtYWxsIHRleHQgYXQgdG9wIHJlYWRzOiBBcnJheSBFbGVtZW50cyAyIDEgNSA0IDggOS4gTGFyZ2UgdGV4dCBhdCBjZW50ZXI6IDlcbiAqXG4gKi9cbi8qKlxuICogQG1ldGhvZCBtYXhcbiAqIEBwYXJhbSAge051bWJlcltdfSBudW1zIE51bWJlcnMgdG8gY29tcGFyZVxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5wNS5wcm90b3R5cGUubWF4ID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ21heCcsIGFyZ3VtZW50cyk7XG4gIGlmIChhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBhcmd1bWVudHNbMF0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHNtYWxsZXN0IHZhbHVlIGluIGEgc2VxdWVuY2Ugb2YgbnVtYmVycywgYW5kIHRoZW4gcmV0dXJuc1xuICogdGhhdCB2YWx1ZS4gbWluKCkgYWNjZXB0cyBhbnkgbnVtYmVyIG9mIE51bWJlciBwYXJhbWV0ZXJzLCBvciBhbiBBcnJheVxuICogb2YgYW55IGxlbmd0aC5cbiAqXG4gKiBAbWV0aG9kIG1pblxuICogQHBhcmFtICB7TnVtYmVyfSBuMCBOdW1iZXIgdG8gY29tcGFyZVxuICogQHBhcmFtICB7TnVtYmVyfSBuMSBOdW1iZXIgdG8gY29tcGFyZVxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICAgICBtaW5pbXVtIE51bWJlclxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgLy8gQ2hhbmdlIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgYW5kIHJ1biB0aGUgc2tldGNoXG4gKiAgIC8vIHRvIHNob3cgaG93IG1pbigpIHdvcmtzIVxuICogICB2YXIgbnVtQXJyYXkgPSBbMiwgMSwgNSwgNCwgOCwgOV07XG4gKiAgIGZpbGwoMCk7XG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIHRleHQoJ0FycmF5IEVsZW1lbnRzJywgMCwgMTApO1xuICogICAvLyBEcmF3IGFsbCBudW1iZXJzIGluIHRoZSBhcnJheVxuICogICB2YXIgc3BhY2luZyA9IDE1O1xuICogICB2YXIgZWxlbXNZID0gMjU7XG4gKiAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAqICAgICB0ZXh0KG51bUFycmF5W2ldLCBpICogc3BhY2luZywgZWxlbXNZKTtcbiAqICAgfVxuICogICB2YXIgbWF4WCA9IDMzO1xuICogICB2YXIgbWF4WSA9IDgwO1xuICogICAvLyBEcmF3IHRoZSBNaW5pbXVtIHZhbHVlIGluIHRoZSBhcnJheS5cbiAqICAgdGV4dFNpemUoMzIpO1xuICogICB0ZXh0KG1pbihudW1BcnJheSksIG1heFgsIG1heFkpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIFNtYWxsIHRleHQgYXQgdG9wIHJlYWRzOiBBcnJheSBFbGVtZW50cyAyIDEgNSA0IDggOS4gTGFyZ2UgdGV4dCBhdCBjZW50ZXI6IDFcbiAqXG4gKi9cbi8qKlxuICogQG1ldGhvZCBtaW5cbiAqIEBwYXJhbSAge051bWJlcltdfSBudW1zIE51bWJlcnMgdG8gY29tcGFyZVxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5wNS5wcm90b3R5cGUubWluID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ21pbicsIGFyZ3VtZW50cyk7XG4gIGlmIChhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBNYXRoLm1pbi5hcHBseShudWxsLCBhcmd1bWVudHNbMF0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBNYXRoLm1pbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBudW1iZXIgZnJvbSBhbm90aGVyIHJhbmdlIGludG8gYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXG4gKiBJZGVudGljYWwgdG8gbWFwKHZhbHVlLCBsb3csIGhpZ2gsIDAsIDEpLlxuICogTnVtYmVycyBvdXRzaWRlIG9mIHRoZSByYW5nZSBhcmUgbm90IGNsYW1wZWQgdG8gMCBhbmQgMSwgYmVjYXVzZVxuICogb3V0LW9mLXJhbmdlIHZhbHVlcyBhcmUgb2Z0ZW4gaW50ZW50aW9uYWwgYW5kIHVzZWZ1bC4gKFNlZSB0aGUgc2Vjb25kXG4gKiBleGFtcGxlIGFib3ZlLilcbiAqXG4gKiBAbWV0aG9kIG5vcm1cbiAqIEBwYXJhbSAge051bWJlcn0gdmFsdWUgaW5jb21pbmcgdmFsdWUgdG8gYmUgbm9ybWFsaXplZFxuICogQHBhcmFtICB7TnVtYmVyfSBzdGFydCBsb3dlciBib3VuZCBvZiB0aGUgdmFsdWUncyBjdXJyZW50IHJhbmdlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHN0b3AgIHVwcGVyIGJvdW5kIG9mIHRoZSB2YWx1ZSdzIGN1cnJlbnQgcmFuZ2VcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgbm9ybWFsaXplZCBudW1iZXJcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICB2YXIgY3VycmVudE51bSA9IG1vdXNlWDtcbiAqICAgdmFyIGxvd2VyQm91bmQgPSAwO1xuICogICB2YXIgdXBwZXJCb3VuZCA9IHdpZHRoOyAvLzEwMDtcbiAqICAgdmFyIG5vcm1hbGl6ZWQgPSBub3JtKGN1cnJlbnROdW0sIGxvd2VyQm91bmQsIHVwcGVyQm91bmQpO1xuICogICB2YXIgbGluZVkgPSA3MDtcbiAqICAgbGluZSgwLCBsaW5lWSwgd2lkdGgsIGxpbmVZKTtcbiAqICAgLy9EcmF3IGFuIGVsbGlwc2UgbWFwcGVkIHRvIHRoZSBub24tbm9ybWFsaXplZCB2YWx1ZS5cbiAqICAgbm9TdHJva2UoKTtcbiAqICAgZmlsbCg1MCk7XG4gKiAgIHZhciBzID0gNzsgLy8gZWxsaXBzZSBzaXplXG4gKiAgIGVsbGlwc2UoY3VycmVudE51bSwgbGluZVksIHMsIHMpO1xuICpcbiAqICAgLy8gRHJhdyB0aGUgZ3VpZGVcbiAqICAgdmFyIGd1aWRlWSA9IGxpbmVZICsgMTU7XG4gKiAgIHRleHQoJzAnLCAwLCBndWlkZVkpO1xuICogICB0ZXh0QWxpZ24oUklHSFQpO1xuICogICB0ZXh0KCcxMDAnLCB3aWR0aCwgZ3VpZGVZKTtcbiAqXG4gKiAgIC8vIERyYXcgdGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAqICAgdGV4dEFsaWduKExFRlQpO1xuICogICBmaWxsKDApO1xuICogICB0ZXh0U2l6ZSgzMik7XG4gKiAgIHZhciBub3JtYWxZID0gNDA7XG4gKiAgIHZhciBub3JtYWxYID0gMjA7XG4gKiAgIHRleHQobm9ybWFsaXplZCwgbm9ybWFsWCwgbm9ybWFsWSk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogZWxsaXBzZSBtb3ZlcyB3aXRoIG1vdXNlLiAwIHNob3duIGxlZnQgJiAxMDAgcmlnaHQgYW5kIHVwZGF0aW5nIHZhbHVlcyBjZW50ZXJcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5ub3JtID0gZnVuY3Rpb24obiwgc3RhcnQsIHN0b3ApIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnbm9ybScsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzLm1hcChuLCBzdGFydCwgc3RvcCwgMCwgMSk7XG59O1xuXG4vKipcbiAqIEZhY2lsaXRhdGVzIGV4cG9uZW50aWFsIGV4cHJlc3Npb25zLiBUaGUgcG93KCkgZnVuY3Rpb24gaXMgYW4gZWZmaWNpZW50XG4gKiB3YXkgb2YgbXVsdGlwbHlpbmcgbnVtYmVycyBieSB0aGVtc2VsdmVzIChvciB0aGVpciByZWNpcHJvY2FscykgaW4gbGFyZ2VcbiAqIHF1YW50aXRpZXMuIEZvciBleGFtcGxlLCBwb3coMywgNSkgaXMgZXF1aXZhbGVudCB0byB0aGUgZXhwcmVzc2lvblxuICogMyozKjMqMyozIGFuZCBwb3coMywgLTUpIGlzIGVxdWl2YWxlbnQgdG8gMSAvIDMqMyozKjMqMy4gTWFwcyB0b1xuICogTWF0aC5wb3coKS5cbiAqXG4gKiBAbWV0aG9kIHBvd1xuICogQHBhcmFtICB7TnVtYmVyfSBuIGJhc2Ugb2YgdGhlIGV4cG9uZW50aWFsIGV4cHJlc3Npb25cbiAqIEBwYXJhbSAge051bWJlcn0gZSBwb3dlciBieSB3aGljaCB0byByYWlzZSB0aGUgYmFzZVxuICogQHJldHVybiB7TnVtYmVyfSAgIG5eZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgLy9FeHBvbmVudGlhbGx5IGluY3JlYXNlIHRoZSBzaXplIG9mIGFuIGVsbGlwc2UuXG4gKiAgIHZhciBlU2l6ZSA9IDM7IC8vIE9yaWdpbmFsIFNpemVcbiAqICAgdmFyIGVMb2MgPSAxMDsgLy8gT3JpZ2luYWwgTG9jYXRpb25cbiAqXG4gKiAgIGVsbGlwc2UoZUxvYywgZUxvYywgZVNpemUsIGVTaXplKTtcbiAqXG4gKiAgIGVsbGlwc2UoZUxvYyAqIDIsIGVMb2MgKiAyLCBwb3coZVNpemUsIDIpLCBwb3coZVNpemUsIDIpKTtcbiAqXG4gKiAgIGVsbGlwc2UoZUxvYyAqIDQsIGVMb2MgKiA0LCBwb3coZVNpemUsIDMpLCBwb3coZVNpemUsIDMpKTtcbiAqXG4gKiAgIGVsbGlwc2UoZUxvYyAqIDgsIGVMb2MgKiA4LCBwb3coZVNpemUsIDQpLCBwb3coZVNpemUsIDQpKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBzbWFsbCB0byBsYXJnZSBlbGxpcHNlcyByYWRpYXRpbmcgZnJvbSB0b3AgbGVmdCBvZiBjYW52YXNcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5wb3cgPSBNYXRoLnBvdztcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBpbnRlZ2VyIGNsb3Nlc3QgdG8gdGhlIG4gcGFyYW1ldGVyLiBGb3IgZXhhbXBsZSxcbiAqIHJvdW5kKDEzMy44KSByZXR1cm5zIHRoZSB2YWx1ZSAxMzQuIE1hcHMgdG8gTWF0aC5yb3VuZCgpLlxuICpcbiAqIEBtZXRob2Qgcm91bmRcbiAqIEBwYXJhbSAge051bWJlcn0gbiBudW1iZXIgdG8gcm91bmRcbiAqIEByZXR1cm4ge0ludGVnZXJ9ICByb3VuZGVkIG51bWJlclxuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIC8vbWFwLCBtb3VzZVggYmV0d2VlbiAwIGFuZCA1LlxuICogICB2YXIgYXggPSBtYXAobW91c2VYLCAwLCAxMDAsIDAsIDUpO1xuICogICB2YXIgYXkgPSA2NjtcbiAqXG4gKiAgIC8vIFJvdW5kIHRoZSBtYXBwZWQgbnVtYmVyLlxuICogICB2YXIgYnggPSByb3VuZChtYXAobW91c2VYLCAwLCAxMDAsIDAsIDUpKTtcbiAqICAgdmFyIGJ5ID0gMzM7XG4gKlxuICogICAvLyBNdWx0aXBseSB0aGUgbWFwcGVkIG51bWJlcnMgYnkgMjAgdG8gbW9yZSBlYXNpbHlcbiAqICAgLy8gc2VlIHRoZSBjaGFuZ2VzLlxuICogICBzdHJva2UoMCk7XG4gKiAgIGZpbGwoMCk7XG4gKiAgIGxpbmUoMCwgYXksIGF4ICogMjAsIGF5KTtcbiAqICAgbGluZSgwLCBieSwgYnggKiAyMCwgYnkpO1xuICpcbiAqICAgLy8gUmVmb3JtYXQgdGhlIGZsb2F0IHJldHVybmVkIGJ5IG1hcCBhbmQgZHJhdyBpdC5cbiAqICAgbm9TdHJva2UoKTtcbiAqICAgdGV4dChuZmMoYXgsIDIpLCBheCwgYXkgLSA1KTtcbiAqICAgdGV4dChuZmMoYngsIDEpLCBieCwgYnkgLSA1KTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBob3Jpem9udGFsIGNlbnRlciBsaW5lIHNxdWFyZWQgdmFsdWVzIGRpc3BsYXllZCBvbiB0b3AgYW5kIHJlZ3VsYXIgb24gYm90dG9tLlxuICpcbiAqL1xucDUucHJvdG90eXBlLnJvdW5kID0gTWF0aC5yb3VuZDtcblxuLyoqXG4gKiBTcXVhcmVzIGEgbnVtYmVyIChtdWx0aXBsaWVzIGEgbnVtYmVyIGJ5IGl0c2VsZikuIFRoZSByZXN1bHQgaXMgYWx3YXlzIGFcbiAqIHBvc2l0aXZlIG51bWJlciwgYXMgbXVsdGlwbHlpbmcgdHdvIG5lZ2F0aXZlIG51bWJlcnMgYWx3YXlzIHlpZWxkcyBhXG4gKiBwb3NpdGl2ZSByZXN1bHQuIEZvciBleGFtcGxlLCAtMSAqIC0xID0gMS5cbiAqXG4gKiBAbWV0aG9kIHNxXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IG4gbnVtYmVyIHRvIHNxdWFyZVxuICogQHJldHVybiB7TnVtYmVyfSAgIHNxdWFyZWQgbnVtYmVyXG4gKiBAZXhhbXBsZVxuICogPGRpdj48Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgdmFyIGVTaXplID0gNztcbiAqICAgdmFyIHgxID0gbWFwKG1vdXNlWCwgMCwgd2lkdGgsIDAsIDEwKTtcbiAqICAgdmFyIHkxID0gODA7XG4gKiAgIHZhciB4MiA9IHNxKHgxKTtcbiAqICAgdmFyIHkyID0gMjA7XG4gKlxuICogICAvLyBEcmF3IHRoZSBub24tc3F1YXJlZC5cbiAqICAgbGluZSgwLCB5MSwgd2lkdGgsIHkxKTtcbiAqICAgZWxsaXBzZSh4MSwgeTEsIGVTaXplLCBlU2l6ZSk7XG4gKlxuICogICAvLyBEcmF3IHRoZSBzcXVhcmVkLlxuICogICBsaW5lKDAsIHkyLCB3aWR0aCwgeTIpO1xuICogICBlbGxpcHNlKHgyLCB5MiwgZVNpemUsIGVTaXplKTtcbiAqXG4gKiAgIC8vIERyYXcgZGl2aWRpbmcgbGluZS5cbiAqICAgc3Ryb2tlKDEwMCk7XG4gKiAgIGxpbmUoMCwgaGVpZ2h0IC8gMiwgd2lkdGgsIGhlaWdodCAvIDIpO1xuICpcbiAqICAgLy8gRHJhdyB0ZXh0LlxuICogICB2YXIgc3BhY2luZyA9IDE1O1xuICogICBub1N0cm9rZSgpO1xuICogICBmaWxsKDApO1xuICogICB0ZXh0KCd4ID0gJyArIHgxLCAwLCB5MSArIHNwYWNpbmcpO1xuICogICB0ZXh0KCdzcSh4KSA9ICcgKyB4MiwgMCwgeTIgKyBzcGFjaW5nKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBob3Jpem9udGFsIGNlbnRlciBsaW5lIHNxdWFyZWQgdmFsdWVzIGRpc3BsYXllZCBvbiB0b3AgYW5kIHJlZ3VsYXIgb24gYm90dG9tLlxuICpcbiAqL1xucDUucHJvdG90eXBlLnNxID0gZnVuY3Rpb24obikge1xuICByZXR1cm4gbiAqIG47XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZSByb290IG9mIGEgbnVtYmVyLiBUaGUgc3F1YXJlIHJvb3Qgb2YgYSBudW1iZXIgaXNcbiAqIGFsd2F5cyBwb3NpdGl2ZSwgZXZlbiB0aG91Z2ggdGhlcmUgbWF5IGJlIGEgdmFsaWQgbmVnYXRpdmUgcm9vdC4gVGhlXG4gKiBzcXVhcmUgcm9vdCBzIG9mIG51bWJlciBhIGlzIHN1Y2ggdGhhdCBzKnMgPSBhLiBJdCBpcyB0aGUgb3Bwb3NpdGUgb2ZcbiAqIHNxdWFyaW5nLiBNYXBzIHRvIE1hdGguc3FydCgpLlxuICpcbiAqIEBtZXRob2Qgc3FydFxuICogQHBhcmFtICB7TnVtYmVyfSBuIG5vbi1uZWdhdGl2ZSBudW1iZXIgdG8gc3F1YXJlIHJvb3RcbiAqIEByZXR1cm4ge051bWJlcn0gICBzcXVhcmUgcm9vdCBvZiBudW1iZXJcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICB2YXIgZVNpemUgPSA3O1xuICogICB2YXIgeDEgPSBtb3VzZVg7XG4gKiAgIHZhciB5MSA9IDgwO1xuICogICB2YXIgeDIgPSBzcXJ0KHgxKTtcbiAqICAgdmFyIHkyID0gMjA7XG4gKlxuICogICAvLyBEcmF3IHRoZSBub24tc3F1YXJlZC5cbiAqICAgbGluZSgwLCB5MSwgd2lkdGgsIHkxKTtcbiAqICAgZWxsaXBzZSh4MSwgeTEsIGVTaXplLCBlU2l6ZSk7XG4gKlxuICogICAvLyBEcmF3IHRoZSBzcXVhcmVkLlxuICogICBsaW5lKDAsIHkyLCB3aWR0aCwgeTIpO1xuICogICBlbGxpcHNlKHgyLCB5MiwgZVNpemUsIGVTaXplKTtcbiAqXG4gKiAgIC8vIERyYXcgZGl2aWRpbmcgbGluZS5cbiAqICAgc3Ryb2tlKDEwMCk7XG4gKiAgIGxpbmUoMCwgaGVpZ2h0IC8gMiwgd2lkdGgsIGhlaWdodCAvIDIpO1xuICpcbiAqICAgLy8gRHJhdyB0ZXh0LlxuICogICBub1N0cm9rZSgpO1xuICogICBmaWxsKDApO1xuICogICB2YXIgc3BhY2luZyA9IDE1O1xuICogICB0ZXh0KCd4ID0gJyArIHgxLCAwLCB5MSArIHNwYWNpbmcpO1xuICogICB0ZXh0KCdzcXJ0KHgpID0gJyArIHgyLCAwLCB5MiArIHNwYWNpbmcpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGhvcml6b250YWwgY2VudGVyIGxpbmUgc3F1YXJlcm9vdCB2YWx1ZXMgZGlzcGxheWVkIG9uIHRvcCBhbmQgcmVndWxhciBvbiBib3R0b20uXG4gKlxuICovXG5wNS5wcm90b3R5cGUuc3FydCA9IE1hdGguc3FydDtcblxuLy8gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIGh5cG90ZW51c2Ugb2YgYSByaWdodCB0cmlhbmdsZVxuLy8gVGhpcyB3b24ndCB1bmRlci0gb3Igb3ZlcmZsb3cgaW4gaW50ZXJtZWRpYXRlIHN0ZXBzXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IeXBvdFxuZnVuY3Rpb24gaHlwb3QoeCwgeSwgeikge1xuICAvLyBVc2UgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpZiBpdCdzIGF2YWlsYWJsZVxuICBpZiAodHlwZW9mIE1hdGguaHlwb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gTWF0aC5oeXBvdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgVjggaW1wbGVtZW50YXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Y4L3Y4L2Jsb2IvOGNkM2NmMjk3Mjg3ZTU4MWE0OWU0ODcwNjdmNWNiZDk5MWIyNzEyMy9zcmMvanMvbWF0aC5qcyNMMjE3XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgYXJncyA9IFtdO1xuICB2YXIgbWF4ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhciBuID0gYXJndW1lbnRzW2ldO1xuICAgIG4gPSArbjtcbiAgICBpZiAobiA9PT0gSW5maW5pdHkgfHwgbiA9PT0gLUluZmluaXR5KSB7XG4gICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgfVxuICAgIG4gPSBNYXRoLmFicyhuKTtcbiAgICBpZiAobiA+IG1heCkge1xuICAgICAgbWF4ID0gbjtcbiAgICB9XG4gICAgYXJnc1tpXSA9IG47XG4gIH1cblxuICBpZiAobWF4ID09PSAwKSB7XG4gICAgbWF4ID0gMTtcbiAgfVxuICB2YXIgc3VtID0gMDtcbiAgdmFyIGNvbXBlbnNhdGlvbiA9IDA7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgbSA9IGFyZ3Nbal0gLyBtYXg7XG4gICAgdmFyIHN1bW1hbmQgPSBtICogbSAtIGNvbXBlbnNhdGlvbjtcbiAgICB2YXIgcHJlbGltaW5hcnkgPSBzdW0gKyBzdW1tYW5kO1xuICAgIGNvbXBlbnNhdGlvbiA9IHByZWxpbWluYXJ5IC0gc3VtIC0gc3VtbWFuZDtcbiAgICBzdW0gPSBwcmVsaW1pbmFyeTtcbiAgfVxuICByZXR1cm4gTWF0aC5zcXJ0KHN1bSkgKiBtYXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSw1MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgTWF0aFxuICogQHN1Ym1vZHVsZSBNYXRoXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBwNS5WZWN0b3IgKHRoZSBkYXRhdHlwZSBmb3Igc3RvcmluZyB2ZWN0b3JzKS4gVGhpcyBwcm92aWRlcyBhXG4gKiB0d28gb3IgdGhyZWUgZGltZW5zaW9uYWwgdmVjdG9yLCBzcGVjaWZpY2FsbHkgYSBFdWNsaWRlYW4gKGFsc28ga25vd24gYXNcbiAqIGdlb21ldHJpYykgdmVjdG9yLiBBIHZlY3RvciBpcyBhbiBlbnRpdHkgdGhhdCBoYXMgYm90aCBtYWduaXR1ZGUgYW5kXG4gKiBkaXJlY3Rpb24uXG4gKlxuICogQG1ldGhvZCBjcmVhdGVWZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbeF0geCBjb21wb25lbnQgb2YgdGhlIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFt5XSB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3pdIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3JcbiAqIEByZXR1cm4ge3A1LlZlY3Rvcn1cbiAqIEBleGFtcGxlXG4gKiA8ZGl2IG1vZGVybml6cj0nd2ViZ2wnPjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICogICBub1N0cm9rZSgpO1xuICogICBmaWxsKDI1NSwgMTAyLCAyMDQpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjU1KTtcbiAqICAgcG9pbnRMaWdodChjb2xvcigyNTUpLCBjcmVhdGVWZWN0b3Ioc2luKG1pbGxpcygpIC8gMTAwMCkgKiAyMCwgLTQwLCAtMTApKTtcbiAqICAgc2NhbGUoMC43NSk7XG4gKiAgIHNwaGVyZSgpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGEgcHVycGxlIHNwaGVyZSBsaXQgYnkgYSBwb2ludCBsaWdodCBvc2NpbGxhdGluZyBob3Jpem9udGFsbHlcbiAqL1xucDUucHJvdG90eXBlLmNyZWF0ZVZlY3RvciA9IGZ1bmN0aW9uKHgsIHksIHopIHtcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBwNSkge1xuICAgIHJldHVybiBuZXcgcDUuVmVjdG9yKHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBwNS5WZWN0b3IoeCwgeSwgeik7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSw1MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vLyBodHRwOi8vbXJsLm55dS5lZHUvfnBlcmxpbi9ub2lzZS9cbi8vIEFkYXB0aW5nIGZyb20gUEFwcGxldC5qYXZhXG4vLyB3aGljaCB3YXMgYWRhcHRlZCBmcm9tIHRveGlcbi8vIHdoaWNoIHdhcyBhZGFwdGVkIGZyb20gdGhlIGdlcm1hbiBkZW1vIGdyb3VwIGZhcmJyYXVzY2hcbi8vIGFzIHVzZWQgaW4gdGhlaXIgZGVtbyBcImFydFwiOiBodHRwOi8vd3d3LmZhcmItcmF1c2NoLmRlL2ZyMDEwc3JjLnppcFxuXG4vLyBzb21lZGF5IHdlIG1pZ2h0IGNvbnNpZGVyIHVzaW5nIFwiaW1wcm92ZWQgbm9pc2VcIlxuLy8gaHR0cDovL21ybC5ueXUuZWR1L35wZXJsaW4vcGFwZXI0NDUucGRmXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaGlmZm1hbi9UaGUtTmF0dXJlLW9mLUNvZGUtRXhhbXBsZXMtcDUuanMvXG4vLyAgICAgIGJsb2IvbWFzdGVyL2ludHJvZHVjdGlvbi9Ob2lzZTFEL25vaXNlLmpzXG5cbi8qKlxuICogQG1vZHVsZSBNYXRoXG4gKiBAc3VibW9kdWxlIE5vaXNlXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbnZhciBQRVJMSU5fWVdSQVBCID0gNDtcbnZhciBQRVJMSU5fWVdSQVAgPSAxIDw8IFBFUkxJTl9ZV1JBUEI7XG52YXIgUEVSTElOX1pXUkFQQiA9IDg7XG52YXIgUEVSTElOX1pXUkFQID0gMSA8PCBQRVJMSU5fWldSQVBCO1xudmFyIFBFUkxJTl9TSVpFID0gNDA5NTtcblxudmFyIHBlcmxpbl9vY3RhdmVzID0gNDsgLy8gZGVmYXVsdCB0byBtZWRpdW0gc21vb3RoXG52YXIgcGVybGluX2FtcF9mYWxsb2ZmID0gMC41OyAvLyA1MCUgcmVkdWN0aW9uL29jdGF2ZVxuXG52YXIgc2NhbGVkX2Nvc2luZSA9IGZ1bmN0aW9uKGkpIHtcbiAgcmV0dXJuIDAuNSAqICgxLjAgLSBNYXRoLmNvcyhpICogTWF0aC5QSSkpO1xufTtcblxudmFyIHBlcmxpbjsgLy8gd2lsbCBiZSBpbml0aWFsaXplZCBsYXppbHkgYnkgbm9pc2UoKSBvciBub2lzZVNlZWQoKVxuXG4vKipcbiAqIFJldHVybnMgdGhlIFBlcmxpbiBub2lzZSB2YWx1ZSBhdCBzcGVjaWZpZWQgY29vcmRpbmF0ZXMuIFBlcmxpbiBub2lzZSBpc1xuICogYSByYW5kb20gc2VxdWVuY2UgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIG1vcmUgbmF0dXJhbCBvcmRlcmVkLCBoYXJtb25pY1xuICogc3VjY2Vzc2lvbiBvZiBudW1iZXJzIGNvbXBhcmVkIHRvIHRoZSBzdGFuZGFyZCA8Yj5yYW5kb20oKTwvYj4gZnVuY3Rpb24uXG4gKiBJdCB3YXMgaW52ZW50ZWQgYnkgS2VuIFBlcmxpbiBpbiB0aGUgMTk4MHMgYW5kIGJlZW4gdXNlZCBzaW5jZSBpblxuICogZ3JhcGhpY2FsIGFwcGxpY2F0aW9ucyB0byBwcm9kdWNlIHByb2NlZHVyYWwgdGV4dHVyZXMsIG5hdHVyYWwgbW90aW9uLFxuICogc2hhcGVzLCB0ZXJyYWlucyBldGMuPGJyIC8+PGJyIC8+IFRoZSBtYWluIGRpZmZlcmVuY2UgdG8gdGhlXG4gKiA8Yj5yYW5kb20oKTwvYj4gZnVuY3Rpb24gaXMgdGhhdCBQZXJsaW4gbm9pc2UgaXMgZGVmaW5lZCBpbiBhbiBpbmZpbml0ZVxuICogbi1kaW1lbnNpb25hbCBzcGFjZSB3aGVyZSBlYWNoIHBhaXIgb2YgY29vcmRpbmF0ZXMgY29ycmVzcG9uZHMgdG8gYVxuICogZml4ZWQgc2VtaS1yYW5kb20gdmFsdWUgKGZpeGVkIG9ubHkgZm9yIHRoZSBsaWZlc3BhbiBvZiB0aGUgcHJvZ3JhbTsgc2VlXG4gKiB0aGUgbm9pc2VTZWVkKCkgZnVuY3Rpb24pLiBwNS5qcyBjYW4gY29tcHV0ZSAxRCwgMkQgYW5kIDNEIG5vaXNlLFxuICogZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgZ2l2ZW4uIFRoZSByZXN1bHRpbmcgdmFsdWUgd2lsbFxuICogYWx3YXlzIGJlIGJldHdlZW4gMC4wIGFuZCAxLjAuIFRoZSBub2lzZSB2YWx1ZSBjYW4gYmUgYW5pbWF0ZWQgYnkgbW92aW5nXG4gKiB0aHJvdWdoIHRoZSBub2lzZSBzcGFjZSBhcyBkZW1vbnN0cmF0ZWQgaW4gdGhlIGV4YW1wbGUgYWJvdmUuIFRoZSAybmRcbiAqIGFuZCAzcmQgZGltZW5zaW9uIGNhbiBhbHNvIGJlIGludGVycHJldGVkIGFzIHRpbWUuPGJyIC8+PGJyIC8+VGhlIGFjdHVhbFxuICogbm9pc2UgaXMgc3RydWN0dXJlZCBzaW1pbGFyIHRvIGFuIGF1ZGlvIHNpZ25hbCwgaW4gcmVzcGVjdCB0byB0aGVcbiAqIGZ1bmN0aW9uJ3MgdXNlIG9mIGZyZXF1ZW5jaWVzLiBTaW1pbGFyIHRvIHRoZSBjb25jZXB0IG9mIGhhcm1vbmljcyBpblxuICogcGh5c2ljcywgcGVybGluIG5vaXNlIGlzIGNvbXB1dGVkIG92ZXIgc2V2ZXJhbCBvY3RhdmVzIHdoaWNoIGFyZSBhZGRlZFxuICogdG9nZXRoZXIgZm9yIHRoZSBmaW5hbCByZXN1bHQuIDxiciAvPjxiciAvPkFub3RoZXIgd2F5IHRvIGFkanVzdCB0aGVcbiAqIGNoYXJhY3RlciBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlIGlzIHRoZSBzY2FsZSBvZiB0aGUgaW5wdXRcbiAqIGNvb3JkaW5hdGVzLiBBcyB0aGUgZnVuY3Rpb24gd29ya3Mgd2l0aGluIGFuIGluZmluaXRlIHNwYWNlIHRoZSB2YWx1ZSBvZlxuICogdGhlIGNvb3JkaW5hdGVzIGRvZXNuJ3QgbWF0dGVyIGFzIHN1Y2gsIG9ubHkgdGhlIGRpc3RhbmNlIGJldHdlZW5cbiAqIHN1Y2Nlc3NpdmUgY29vcmRpbmF0ZXMgZG9lcyAoZWcuIHdoZW4gdXNpbmcgPGI+bm9pc2UoKTwvYj4gd2l0aGluIGFcbiAqIGxvb3ApLiBBcyBhIGdlbmVyYWwgcnVsZSB0aGUgc21hbGxlciB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvb3JkaW5hdGVzLFxuICogdGhlIHNtb290aGVyIHRoZSByZXN1bHRpbmcgbm9pc2Ugc2VxdWVuY2Ugd2lsbCBiZS4gU3RlcHMgb2YgMC4wMDUtMC4wM1xuICogd29yayBiZXN0IGZvciBtb3N0IGFwcGxpY2F0aW9ucywgYnV0IHRoaXMgd2lsbCBkaWZmZXIgZGVwZW5kaW5nIG9uIHVzZS5cbiAqXG4gKlxuICogQG1ldGhvZCBub2lzZVxuICogQHBhcmFtICB7TnVtYmVyfSB4ICAgeC1jb29yZGluYXRlIGluIG5vaXNlIHNwYWNlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt5XSB5LWNvb3JkaW5hdGUgaW4gbm9pc2Ugc3BhY2VcbiAqIEBwYXJhbSAge051bWJlcn0gW3pdIHotY29vcmRpbmF0ZSBpbiBub2lzZSBzcGFjZVxuICogQHJldHVybiB7TnVtYmVyfSAgICAgUGVybGluIG5vaXNlIHZhbHVlIChiZXR3ZWVuIDAgYW5kIDEpIGF0IHNwZWNpZmllZFxuICogICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXNcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgeG9mZiA9IDAuMDtcbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwNCk7XG4gKiAgIHhvZmYgPSB4b2ZmICsgMC4wMTtcbiAqICAgdmFyIG4gPSBub2lzZSh4b2ZmKSAqIHdpZHRoO1xuICogICBsaW5lKG4sIDAsIG4sIGhlaWdodCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIDxkaXY+XG4gKiA8Y29kZT52YXIgbm9pc2VTY2FsZT0wLjAyO1xuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMCk7XG4gKiAgIGZvciAodmFyIHg9MDsgeCA8IHdpZHRoOyB4KyspIHtcbiAqICAgICB2YXIgbm9pc2VWYWwgPSBub2lzZSgobW91c2VYK3gpKm5vaXNlU2NhbGUsIG1vdXNlWSpub2lzZVNjYWxlKTtcbiAqICAgICBzdHJva2Uobm9pc2VWYWwqMjU1KTtcbiAqICAgICBsaW5lKHgsIG1vdXNlWStub2lzZVZhbCo4MCwgeCwgaGVpZ2h0KTtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogdmVydGljYWwgbGluZSBtb3ZlcyBsZWZ0IHRvIHJpZ2h0IHdpdGggdXBkYXRpbmcgbm9pc2UgdmFsdWVzLlxuICogaG9yaXpvbnRhbCB3YXZlIHBhdHRlcm4gZWZmZWN0ZWQgYnkgbW91c2UgeC1wb3NpdGlvbiAmIHVwZGF0aW5nIG5vaXNlIHZhbHVlcy5cbiAqXG4gKi9cblxucDUucHJvdG90eXBlLm5vaXNlID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICB5ID0geSB8fCAwO1xuICB6ID0geiB8fCAwO1xuXG4gIGlmIChwZXJsaW4gPT0gbnVsbCkge1xuICAgIHBlcmxpbiA9IG5ldyBBcnJheShQRVJMSU5fU0laRSArIDEpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUEVSTElOX1NJWkUgKyAxOyBpKyspIHtcbiAgICAgIHBlcmxpbltpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCAwKSB7XG4gICAgeCA9IC14O1xuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHkgPSAteTtcbiAgfVxuICBpZiAoeiA8IDApIHtcbiAgICB6ID0gLXo7XG4gIH1cblxuICB2YXIgeGkgPSBNYXRoLmZsb29yKHgpLFxuICAgIHlpID0gTWF0aC5mbG9vcih5KSxcbiAgICB6aSA9IE1hdGguZmxvb3Ioeik7XG4gIHZhciB4ZiA9IHggLSB4aTtcbiAgdmFyIHlmID0geSAtIHlpO1xuICB2YXIgemYgPSB6IC0gemk7XG4gIHZhciByeGYsIHJ5ZjtcblxuICB2YXIgciA9IDA7XG4gIHZhciBhbXBsID0gMC41O1xuXG4gIHZhciBuMSwgbjIsIG4zO1xuXG4gIGZvciAodmFyIG8gPSAwOyBvIDwgcGVybGluX29jdGF2ZXM7IG8rKykge1xuICAgIHZhciBvZiA9IHhpICsgKHlpIDw8IFBFUkxJTl9ZV1JBUEIpICsgKHppIDw8IFBFUkxJTl9aV1JBUEIpO1xuXG4gICAgcnhmID0gc2NhbGVkX2Nvc2luZSh4Zik7XG4gICAgcnlmID0gc2NhbGVkX2Nvc2luZSh5Zik7XG5cbiAgICBuMSA9IHBlcmxpbltvZiAmIFBFUkxJTl9TSVpFXTtcbiAgICBuMSArPSByeGYgKiAocGVybGluWyhvZiArIDEpICYgUEVSTElOX1NJWkVdIC0gbjEpO1xuICAgIG4yID0gcGVybGluWyhvZiArIFBFUkxJTl9ZV1JBUCkgJiBQRVJMSU5fU0laRV07XG4gICAgbjIgKz0gcnhmICogKHBlcmxpblsob2YgKyBQRVJMSU5fWVdSQVAgKyAxKSAmIFBFUkxJTl9TSVpFXSAtIG4yKTtcbiAgICBuMSArPSByeWYgKiAobjIgLSBuMSk7XG5cbiAgICBvZiArPSBQRVJMSU5fWldSQVA7XG4gICAgbjIgPSBwZXJsaW5bb2YgJiBQRVJMSU5fU0laRV07XG4gICAgbjIgKz0gcnhmICogKHBlcmxpblsob2YgKyAxKSAmIFBFUkxJTl9TSVpFXSAtIG4yKTtcbiAgICBuMyA9IHBlcmxpblsob2YgKyBQRVJMSU5fWVdSQVApICYgUEVSTElOX1NJWkVdO1xuICAgIG4zICs9IHJ4ZiAqIChwZXJsaW5bKG9mICsgUEVSTElOX1lXUkFQICsgMSkgJiBQRVJMSU5fU0laRV0gLSBuMyk7XG4gICAgbjIgKz0gcnlmICogKG4zIC0gbjIpO1xuXG4gICAgbjEgKz0gc2NhbGVkX2Nvc2luZSh6ZikgKiAobjIgLSBuMSk7XG5cbiAgICByICs9IG4xICogYW1wbDtcbiAgICBhbXBsICo9IHBlcmxpbl9hbXBfZmFsbG9mZjtcbiAgICB4aSA8PD0gMTtcbiAgICB4ZiAqPSAyO1xuICAgIHlpIDw8PSAxO1xuICAgIHlmICo9IDI7XG4gICAgemkgPDw9IDE7XG4gICAgemYgKj0gMjtcblxuICAgIGlmICh4ZiA+PSAxLjApIHtcbiAgICAgIHhpKys7XG4gICAgICB4Zi0tO1xuICAgIH1cbiAgICBpZiAoeWYgPj0gMS4wKSB7XG4gICAgICB5aSsrO1xuICAgICAgeWYtLTtcbiAgICB9XG4gICAgaWYgKHpmID49IDEuMCkge1xuICAgICAgemkrKztcbiAgICAgIHpmLS07XG4gICAgfVxuICB9XG4gIHJldHVybiByO1xufTtcblxuLyoqXG4gKlxuICogQWRqdXN0cyB0aGUgY2hhcmFjdGVyIGFuZCBsZXZlbCBvZiBkZXRhaWwgcHJvZHVjZWQgYnkgdGhlIFBlcmxpbiBub2lzZVxuICogZnVuY3Rpb24uIFNpbWlsYXIgdG8gaGFybW9uaWNzIGluIHBoeXNpY3MsIG5vaXNlIGlzIGNvbXB1dGVkIG92ZXJcbiAqIHNldmVyYWwgb2N0YXZlcy4gTG93ZXIgb2N0YXZlcyBjb250cmlidXRlIG1vcmUgdG8gdGhlIG91dHB1dCBzaWduYWwgYW5kXG4gKiBhcyBzdWNoIGRlZmluZSB0aGUgb3ZlcmFsbCBpbnRlbnNpdHkgb2YgdGhlIG5vaXNlLCB3aGVyZWFzIGhpZ2hlciBvY3RhdmVzXG4gKiBjcmVhdGUgZmluZXIgZ3JhaW5lZCBkZXRhaWxzIGluIHRoZSBub2lzZSBzZXF1ZW5jZS5cbiAqIDxicj48YnI+XG4gKiBCeSBkZWZhdWx0LCBub2lzZSBpcyBjb21wdXRlZCBvdmVyIDQgb2N0YXZlcyB3aXRoIGVhY2ggb2N0YXZlIGNvbnRyaWJ1dGluZ1xuICogZXhhY3RseSBoYWxmIHRoYW4gaXRzIHByZWRlY2Vzc29yLCBzdGFydGluZyBhdCA1MCUgc3RyZW5ndGggZm9yIHRoZSAxc3RcbiAqIG9jdGF2ZS4gVGhpcyBmYWxsb2ZmIGFtb3VudCBjYW4gYmUgY2hhbmdlZCBieSBhZGRpbmcgYW4gYWRkaXRpb25hbCBmdW5jdGlvblxuICogcGFyYW1ldGVyLiBFZy4gYSBmYWxsb2ZmIGZhY3RvciBvZiAwLjc1IG1lYW5zIGVhY2ggb2N0YXZlIHdpbGwgbm93IGhhdmVcbiAqIDc1JSBpbXBhY3QgKDI1JSBsZXNzKSBvZiB0aGUgcHJldmlvdXMgbG93ZXIgb2N0YXZlLiBBbnkgdmFsdWUgYmV0d2VlblxuICogMC4wIGFuZCAxLjAgaXMgdmFsaWQsIGhvd2V2ZXIgbm90ZSB0aGF0IHZhbHVlcyBncmVhdGVyIHRoYW4gMC41IG1pZ2h0XG4gKiByZXN1bHQgaW4gZ3JlYXRlciB0aGFuIDEuMCB2YWx1ZXMgcmV0dXJuZWQgYnkgPGI+bm9pc2UoKTwvYj4uXG4gKiA8YnI+PGJyPlxuICogQnkgY2hhbmdpbmcgdGhlc2UgcGFyYW1ldGVycywgdGhlIHNpZ25hbCBjcmVhdGVkIGJ5IHRoZSA8Yj5ub2lzZSgpPC9iPlxuICogZnVuY3Rpb24gY2FuIGJlIGFkYXB0ZWQgdG8gZml0IHZlcnkgc3BlY2lmaWMgbmVlZHMgYW5kIGNoYXJhY3RlcmlzdGljcy5cbiAqXG4gKiBAbWV0aG9kIG5vaXNlRGV0YWlsXG4gKiBAcGFyYW0ge051bWJlcn0gbG9kIG51bWJlciBvZiBvY3RhdmVzIHRvIGJlIHVzZWQgYnkgdGhlIG5vaXNlXG4gKiBAcGFyYW0ge051bWJlcn0gZmFsbG9mZiBmYWxsb2ZmIGZhY3RvciBmb3IgZWFjaCBvY3RhdmVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgbm9pc2VWYWw7XG4gKiB2YXIgbm9pc2VTY2FsZSA9IDAuMDI7XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgwKTtcbiAqICAgZm9yICh2YXIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICogICAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGggLyAyOyB4KyspIHtcbiAqICAgICAgIG5vaXNlRGV0YWlsKDIsIDAuMik7XG4gKiAgICAgICBub2lzZVZhbCA9IG5vaXNlKChtb3VzZVggKyB4KSAqIG5vaXNlU2NhbGUsIChtb3VzZVkgKyB5KSAqIG5vaXNlU2NhbGUpO1xuICogICAgICAgc3Ryb2tlKG5vaXNlVmFsICogMjU1KTtcbiAqICAgICAgIHBvaW50KHgsIHkpO1xuICogICAgICAgbm9pc2VEZXRhaWwoOCwgMC42NSk7XG4gKiAgICAgICBub2lzZVZhbCA9IG5vaXNlKFxuICogICAgICAgICAobW91c2VYICsgeCArIHdpZHRoIC8gMikgKiBub2lzZVNjYWxlLFxuICogICAgICAgICAobW91c2VZICsgeSkgKiBub2lzZVNjYWxlXG4gKiAgICAgICApO1xuICogICAgICAgc3Ryb2tlKG5vaXNlVmFsICogMjU1KTtcbiAqICAgICAgIHBvaW50KHggKyB3aWR0aCAvIDIsIHkpO1xuICogICAgIH1cbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogMiB2ZXJ0aWNhbCBncmV5IHNtb2tleSBwYXR0ZXJucyBhZmZlY3RlZCBteSBtb3VzZSB4LXBvc2l0aW9uIGFuZCBub2lzZS5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5ub2lzZURldGFpbCA9IGZ1bmN0aW9uKGxvZCwgZmFsbG9mZikge1xuICBpZiAobG9kID4gMCkge1xuICAgIHBlcmxpbl9vY3RhdmVzID0gbG9kO1xuICB9XG4gIGlmIChmYWxsb2ZmID4gMCkge1xuICAgIHBlcmxpbl9hbXBfZmFsbG9mZiA9IGZhbGxvZmY7XG4gIH1cbn07XG5cbi8qKlxuICogU2V0cyB0aGUgc2VlZCB2YWx1ZSBmb3IgPGI+bm9pc2UoKTwvYj4uIEJ5IGRlZmF1bHQsIDxiPm5vaXNlKCk8L2I+XG4gKiBwcm9kdWNlcyBkaWZmZXJlbnQgcmVzdWx0cyBlYWNoIHRpbWUgdGhlIHByb2dyYW0gaXMgcnVuLiBTZXQgdGhlXG4gKiA8Yj52YWx1ZTwvYj4gcGFyYW1ldGVyIHRvIGEgY29uc3RhbnQgdG8gcmV0dXJuIHRoZSBzYW1lIHBzZXVkby1yYW5kb21cbiAqIG51bWJlcnMgZWFjaCB0aW1lIHRoZSBzb2Z0d2FyZSBpcyBydW4uXG4gKlxuICogQG1ldGhvZCBub2lzZVNlZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzZWVkICAgdGhlIHNlZWQgdmFsdWVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+dmFyIHhvZmYgPSAwLjA7XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIG5vaXNlU2VlZCg5OSk7XG4gKiAgIHN0cm9rZSgwLCAxMCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgeG9mZiA9IHhvZmYgKyAuMDE7XG4gKiAgIHZhciBuID0gbm9pc2UoeG9mZikgKiB3aWR0aDtcbiAqICAgbGluZShuLCAwLCBuLCBoZWlnaHQpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogdmVydGljYWwgZ3JleSBsaW5lcyBkcmF3aW5nIGluIHBhdHRlcm4gYWZmZWN0ZWQgYnkgbm9pc2UuXG4gKlxuICovXG5wNS5wcm90b3R5cGUubm9pc2VTZWVkID0gZnVuY3Rpb24oc2VlZCkge1xuICAvLyBMaW5lYXIgQ29uZ3J1ZW50aWFsIEdlbmVyYXRvclxuICAvLyBWYXJpYW50IG9mIGEgTGVobWFuIEdlbmVyYXRvclxuICB2YXIgbGNnID0gKGZ1bmN0aW9uKCkge1xuICAgIC8vIFNldCB0byB2YWx1ZXMgZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL051bWVyaWNhbF9SZWNpcGVzXG4gICAgLy8gbSBpcyBiYXNpY2FsbHkgY2hvc2VuIHRvIGJlIGxhcmdlIChhcyBpdCBpcyB0aGUgbWF4IHBlcmlvZClcbiAgICAvLyBhbmQgZm9yIGl0cyByZWxhdGlvbnNoaXBzIHRvIGEgYW5kIGNcbiAgICB2YXIgbSA9IDQyOTQ5NjcyOTY7XG4gICAgLy8gYSAtIDEgc2hvdWxkIGJlIGRpdmlzaWJsZSBieSBtJ3MgcHJpbWUgZmFjdG9yc1xuICAgIHZhciBhID0gMTY2NDUyNTtcbiAgICAvLyBjIGFuZCBtIHNob3VsZCBiZSBjby1wcmltZVxuICAgIHZhciBjID0gMTAxMzkwNDIyMztcbiAgICB2YXIgc2VlZCwgejtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U2VlZDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIC8vIHBpY2sgYSByYW5kb20gc2VlZCBpZiB2YWwgaXMgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgLy8gdGhlID4+PiAwIGNhc3RzIHRoZSBzZWVkIHRvIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyXG4gICAgICAgIHogPSBzZWVkID0gKHZhbCA9PSBudWxsID8gTWF0aC5yYW5kb20oKSAqIG0gOiB2YWwpID4+PiAwO1xuICAgICAgfSxcbiAgICAgIGdldFNlZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc2VlZDtcbiAgICAgIH0sXG4gICAgICByYW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gZGVmaW5lIHRoZSByZWN1cnJlbmNlIHJlbGF0aW9uc2hpcFxuICAgICAgICB6ID0gKGEgKiB6ICsgYykgJSBtO1xuICAgICAgICAvLyByZXR1cm4gYSBmbG9hdCBpbiBbMCwgMSlcbiAgICAgICAgLy8gaWYgeiA9IG0gdGhlbiB6IC8gbSA9IDAgdGhlcmVmb3JlICh6ICUgbSkgLyBtIDwgMSBhbHdheXNcbiAgICAgICAgcmV0dXJuIHogLyBtO1xuICAgICAgfVxuICAgIH07XG4gIH0pKCk7XG5cbiAgbGNnLnNldFNlZWQoc2VlZCk7XG4gIHBlcmxpbiA9IG5ldyBBcnJheShQRVJMSU5fU0laRSArIDEpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IFBFUkxJTl9TSVpFICsgMTsgaSsrKSB7XG4gICAgcGVybGluW2ldID0gbGNnLnJhbmQoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNTtcblxufSx7XCIuLi9jb3JlL2NvcmVcIjoyMn1dLDUzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBNYXRoXG4gKiBAc3VibW9kdWxlIE1hdGhcbiAqIEByZXF1aXJlcyBjb25zdGFudHNcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xudmFyIGNvbnN0YW50cyA9IF9kZXJlcV8oJy4uL2NvcmUvY29uc3RhbnRzJyk7XG5cbi8qKlxuICogQSBjbGFzcyB0byBkZXNjcmliZSBhIHR3byBvciB0aHJlZSBkaW1lbnNpb25hbCB2ZWN0b3IsIHNwZWNpZmljYWxseVxuICogYSBFdWNsaWRlYW4gKGFsc28ga25vd24gYXMgZ2VvbWV0cmljKSB2ZWN0b3IuIEEgdmVjdG9yIGlzIGFuIGVudGl0eVxuICogdGhhdCBoYXMgYm90aCBtYWduaXR1ZGUgYW5kIGRpcmVjdGlvbi4gVGhlIGRhdGF0eXBlLCBob3dldmVyLCBzdG9yZXNcbiAqIHRoZSBjb21wb25lbnRzIG9mIHRoZSB2ZWN0b3IgKHgsIHkgZm9yIDJELCBhbmQgeCwgeSwgeiBmb3IgM0QpLiBUaGUgbWFnbml0dWRlXG4gKiBhbmQgZGlyZWN0aW9uIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG1ldGhvZHMgbWFnKCkgYW5kIGhlYWRpbmcoKS5cbiAqIDxicj48YnI+XG4gKiBJbiBtYW55IG9mIHRoZSBwNS5qcyBleGFtcGxlcywgeW91IHdpbGwgc2VlIHA1LlZlY3RvciB1c2VkIHRvIGRlc2NyaWJlIGFcbiAqIHBvc2l0aW9uLCB2ZWxvY2l0eSwgb3IgYWNjZWxlcmF0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91IGNvbnNpZGVyIGEgcmVjdGFuZ2xlXG4gKiBtb3ZpbmcgYWNyb3NzIHRoZSBzY3JlZW4sIGF0IGFueSBnaXZlbiBpbnN0YW50IGl0IGhhcyBhIHBvc2l0aW9uIChhIHZlY3RvclxuICogdGhhdCBwb2ludHMgZnJvbSB0aGUgb3JpZ2luIHRvIGl0cyBsb2NhdGlvbiksIGEgdmVsb2NpdHkgKHRoZSByYXRlIGF0IHdoaWNoXG4gKiB0aGUgb2JqZWN0J3MgcG9zaXRpb24gY2hhbmdlcyBwZXIgdGltZSB1bml0LCBleHByZXNzZWQgYXMgYSB2ZWN0b3IpLCBhbmRcbiAqIGFjY2VsZXJhdGlvbiAodGhlIHJhdGUgYXQgd2hpY2ggdGhlIG9iamVjdCdzIHZlbG9jaXR5IGNoYW5nZXMgcGVyIHRpbWVcbiAqIHVuaXQsIGV4cHJlc3NlZCBhcyBhIHZlY3RvcikuXG4gKiA8YnI+PGJyPlxuICogU2luY2UgdmVjdG9ycyByZXByZXNlbnQgZ3JvdXBpbmdzIG9mIHZhbHVlcywgd2UgY2Fubm90IHNpbXBseSB1c2VcbiAqIHRyYWRpdGlvbmFsIGFkZGl0aW9uL211bHRpcGxpY2F0aW9uL2V0Yy4gSW5zdGVhZCwgd2UnbGwgbmVlZCB0byBkbyBzb21lXG4gKiBcInZlY3RvclwiIG1hdGgsIHdoaWNoIGlzIG1hZGUgZWFzeSBieSB0aGUgbWV0aG9kcyBpbnNpZGUgdGhlIHA1LlZlY3RvciBjbGFzcy5cbiAqXG4gKiBAY2xhc3MgcDUuVmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3hdIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbeV0geSBjb21wb25lbnQgb2YgdGhlIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFt6XSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIHYxID0gY3JlYXRlVmVjdG9yKDQwLCA1MCk7XG4gKiB2YXIgdjIgPSBjcmVhdGVWZWN0b3IoNDAsIDUwKTtcbiAqXG4gKiBlbGxpcHNlKHYxLngsIHYxLnksIDUwLCA1MCk7XG4gKiBlbGxpcHNlKHYyLngsIHYyLnksIDUwLCA1MCk7XG4gKiB2MS5hZGQodjIpO1xuICogZWxsaXBzZSh2MS54LCB2MS55LCA1MCwgNTApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogMiB3aGl0ZSBlbGxpcHNlcy4gT25lIGNlbnRlci1sZWZ0IHRoZSBvdGhlciBib3R0b20gcmlnaHQgYW5kIG9mZiBjYW52YXNcbiAqXG4gKi9cbnA1LlZlY3RvciA9IGZ1bmN0aW9uIFZlY3RvcigpIHtcbiAgdmFyIHgsIHksIHo7XG4gIC8vIFRoaXMgaXMgaG93IGl0IGNvbWVzIGluIHdpdGggY3JlYXRlVmVjdG9yKClcbiAgaWYgKGFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIHA1KSB7XG4gICAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gcDUgaWYgcGFzc2VkIGluXG4gICAgdGhpcy5wNSA9IGFyZ3VtZW50c1swXTtcbiAgICB4ID0gYXJndW1lbnRzWzFdWzBdIHx8IDA7XG4gICAgeSA9IGFyZ3VtZW50c1sxXVsxXSB8fCAwO1xuICAgIHogPSBhcmd1bWVudHNbMV1bMl0gfHwgMDtcbiAgICAvLyBUaGlzIGlzIHdoYXQgd2UnbGwgZ2V0IHdpdGggbmV3IHA1LlZlY3RvcigpXG4gIH0gZWxzZSB7XG4gICAgeCA9IGFyZ3VtZW50c1swXSB8fCAwO1xuICAgIHkgPSBhcmd1bWVudHNbMV0gfHwgMDtcbiAgICB6ID0gYXJndW1lbnRzWzJdIHx8IDA7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB4IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yXG4gICAqIEBwcm9wZXJ0eSB4IHtOdW1iZXJ9XG4gICAqL1xuICB0aGlzLnggPSB4O1xuICAvKipcbiAgICogVGhlIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3JcbiAgICogQHByb3BlcnR5IHkge051bWJlcn1cbiAgICovXG4gIHRoaXMueSA9IHk7XG4gIC8qKlxuICAgKiBUaGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvclxuICAgKiBAcHJvcGVydHkgeiB7TnVtYmVyfVxuICAgKi9cbiAgdGhpcy56ID0gejtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvciB2IGJ5IGNhbGxpbmcgU3RyaW5nKHYpXG4gKiBvciB2LnRvU3RyaW5nKCkuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgbG9nZ2luZyB2ZWN0b3JzIGluIHRoZVxuICogY29uc29sZS5cbiAqIEBtZXRob2QgIHRvU3RyaW5nXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcyA9IFwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciB2ID0gY3JlYXRlVmVjdG9yKDIwLCAzMCk7XG4gKiAgIHByaW50KFN0cmluZyh2KSk7IC8vIHByaW50cyBcInA1LlZlY3RvciBPYmplY3QgOiBbMjAsIDMwLCAwXVwiXG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDI0MCk7XG4gKlxuICogICB2YXIgdjAgPSBjcmVhdGVWZWN0b3IoMCwgMCk7XG4gKiAgIHZhciB2MSA9IGNyZWF0ZVZlY3Rvcihtb3VzZVgsIG1vdXNlWSk7XG4gKiAgIGRyYXdBcnJvdyh2MCwgdjEsICdibGFjaycpO1xuICpcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgdGV4dCh2MS50b1N0cmluZygpLCAxMCwgMjUsIDkwLCA3NSk7XG4gKiB9XG4gKlxuICogLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXG4gKiBmdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XG4gKiAgIHB1c2goKTtcbiAqICAgc3Ryb2tlKG15Q29sb3IpO1xuICogICBzdHJva2VXZWlnaHQoMyk7XG4gKiAgIGZpbGwobXlDb2xvcik7XG4gKiAgIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XG4gKiAgIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcbiAqICAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xuICogICB2YXIgYXJyb3dTaXplID0gNztcbiAqICAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XG4gKiAgIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xuICogICBwb3AoKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gcDVWZWN0b3JUb1N0cmluZygpIHtcbiAgcmV0dXJuICdwNS5WZWN0b3IgT2JqZWN0IDogWycgKyB0aGlzLnggKyAnLCAnICsgdGhpcy55ICsgJywgJyArIHRoaXMueiArICddJztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgeCwgeSwgYW5kIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgdXNpbmcgdHdvIG9yIHRocmVlIHNlcGFyYXRlXG4gKiB2YXJpYWJsZXMsIHRoZSBkYXRhIGZyb20gYSBwNS5WZWN0b3IsIG9yIHRoZSB2YWx1ZXMgZnJvbSBhIGZsb2F0IGFycmF5LlxuICogQG1ldGhvZCBzZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbeF0gdGhlIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbeV0gdGhlIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbel0gdGhlIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3JcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciB2ID0gY3JlYXRlVmVjdG9yKDEsIDIsIDMpO1xuICogICB2LnNldCg0LCA1LCA2KTsgLy8gU2V0cyB2ZWN0b3IgdG8gWzQsIDUsIDZdXG4gKlxuICogICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMCwgMCwgMCk7XG4gKiAgIHZhciBhcnIgPSBbMSwgMiwgM107XG4gKiAgIHYxLnNldChhcnIpOyAvLyBTZXRzIHZlY3RvciB0byBbMSwgMiwgM11cbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciB2MCwgdjE7XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqXG4gKiAgIHYwID0gY3JlYXRlVmVjdG9yKDAsIDApO1xuICogICB2MSA9IGNyZWF0ZVZlY3Rvcig1MCwgNTApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqXG4gKiAgIGRyYXdBcnJvdyh2MCwgdjEsICdibGFjaycpO1xuICogICB2MS5zZXQodjEueCArIHJhbmRvbSgtMSwgMSksIHYxLnkgKyByYW5kb20oLTEsIDEpKTtcbiAqXG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIHRleHQoJ3g6ICcgKyByb3VuZCh2MS54KSArICcgeTogJyArIHJvdW5kKHYxLnkpLCAyMCwgOTApO1xuICogfVxuICpcbiAqIC8vIGRyYXcgYW4gYXJyb3cgZm9yIGEgdmVjdG9yIGF0IGEgZ2l2ZW4gYmFzZSBwb3NpdGlvblxuICogZnVuY3Rpb24gZHJhd0Fycm93KGJhc2UsIHZlYywgbXlDb2xvcikge1xuICogICBwdXNoKCk7XG4gKiAgIHN0cm9rZShteUNvbG9yKTtcbiAqICAgc3Ryb2tlV2VpZ2h0KDMpO1xuICogICBmaWxsKG15Q29sb3IpO1xuICogICB0cmFuc2xhdGUoYmFzZS54LCBiYXNlLnkpO1xuICogICBsaW5lKDAsIDAsIHZlYy54LCB2ZWMueSk7XG4gKiAgIHJvdGF0ZSh2ZWMuaGVhZGluZygpKTtcbiAqICAgdmFyIGFycm93U2l6ZSA9IDc7XG4gKiAgIHRyYW5zbGF0ZSh2ZWMubWFnKCkgLSBhcnJvd1NpemUsIDApO1xuICogICB0cmlhbmdsZSgwLCBhcnJvd1NpemUgLyAyLCAwLCAtYXJyb3dTaXplIC8gMiwgYXJyb3dTaXplLCAwKTtcbiAqICAgcG9wKCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIHNldFxuICogQHBhcmFtIHtwNS5WZWN0b3J8TnVtYmVyW119IHZhbHVlIHRoZSB2ZWN0b3IgdG8gc2V0XG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1LlZlY3Rvci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0KHgsIHksIHopIHtcbiAgaWYgKHggaW5zdGFuY2VvZiBwNS5WZWN0b3IpIHtcbiAgICB0aGlzLnggPSB4LnggfHwgMDtcbiAgICB0aGlzLnkgPSB4LnkgfHwgMDtcbiAgICB0aGlzLnogPSB4LnogfHwgMDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpZiAoeCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgdGhpcy54ID0geFswXSB8fCAwO1xuICAgIHRoaXMueSA9IHhbMV0gfHwgMDtcbiAgICB0aGlzLnogPSB4WzJdIHx8IDA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdGhpcy54ID0geCB8fCAwO1xuICB0aGlzLnkgPSB5IHx8IDA7XG4gIHRoaXMueiA9IHogfHwgMDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEdldHMgYSBjb3B5IG9mIHRoZSB2ZWN0b3IsIHJldHVybnMgYSBwNS5WZWN0b3Igb2JqZWN0LlxuICpcbiAqIEBtZXRob2QgY29weVxuICogQHJldHVybiB7cDUuVmVjdG9yfSB0aGUgY29weSBvZiB0aGUgcDUuVmVjdG9yIG9iamVjdFxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMSwgMiwgMyk7XG4gKiB2YXIgdjIgPSB2MS5jb3B5KCk7XG4gKiBwcmludCh2MS54ID09PSB2Mi54ICYmIHYxLnkgPT09IHYyLnkgJiYgdjEueiA9PT0gdjIueik7XG4gKiAvLyBQcmludHMgXCJ0cnVlXCJcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5KCkge1xuICBpZiAodGhpcy5wNSkge1xuICAgIHJldHVybiBuZXcgcDUuVmVjdG9yKHRoaXMucDUsIFt0aGlzLngsIHRoaXMueSwgdGhpcy56XSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBwNS5WZWN0b3IodGhpcy54LCB0aGlzLnksIHRoaXMueik7XG4gIH1cbn07XG5cbi8qKlxuICogQWRkcyB4LCB5LCBhbmQgeiBjb21wb25lbnRzIHRvIGEgdmVjdG9yLCBhZGRzIG9uZSB2ZWN0b3IgdG8gYW5vdGhlciwgb3JcbiAqIGFkZHMgdHdvIGluZGVwZW5kZW50IHZlY3RvcnMgdG9nZXRoZXIuIFRoZSB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgdGhhdCBhZGRzXG4gKiB0d28gdmVjdG9ycyB0b2dldGhlciBpcyBhIHN0YXRpYyBtZXRob2QgYW5kIHJldHVybnMgYSBwNS5WZWN0b3IsIHRoZSBvdGhlcnNcbiAqIGFjdHMgZGlyZWN0bHkgb24gdGhlIHZlY3Rvci4gU2VlIHRoZSBleGFtcGxlcyBmb3IgbW9yZSBjb250ZXh0LlxuICpcbiAqIEBtZXRob2QgYWRkXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggICB0aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciB0byBiZSBhZGRlZFxuICogQHBhcmFtICB7TnVtYmVyfSBbeV0gdGhlIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgdG8gYmUgYWRkZWRcbiAqIEBwYXJhbSAge051bWJlcn0gW3pdIHRoZSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHRvIGJlIGFkZGVkXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciB2ID0gY3JlYXRlVmVjdG9yKDEsIDIsIDMpO1xuICogdi5hZGQoNCwgNSwgNik7XG4gKiAvLyB2J3MgY29tcG9uZW50cyBhcmUgc2V0IHRvIFs1LCA3LCA5XVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIC8vIFN0YXRpYyBtZXRob2RcbiAqIHZhciB2MSA9IGNyZWF0ZVZlY3RvcigxLCAyLCAzKTtcbiAqIHZhciB2MiA9IGNyZWF0ZVZlY3RvcigyLCAzLCA0KTtcbiAqXG4gKiB2YXIgdjMgPSBwNS5WZWN0b3IuYWRkKHYxLCB2Mik7XG4gKiAvLyB2MyBoYXMgY29tcG9uZW50cyBbMywgNSwgN11cbiAqIHByaW50KHYzKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIHJlZCB2ZWN0b3IgKyBibHVlIHZlY3RvciA9IHB1cnBsZSB2ZWN0b3JcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqXG4gKiAgIHZhciB2MCA9IGNyZWF0ZVZlY3RvcigwLCAwKTtcbiAqICAgdmFyIHYxID0gY3JlYXRlVmVjdG9yKG1vdXNlWCwgbW91c2VZKTtcbiAqICAgZHJhd0Fycm93KHYwLCB2MSwgJ3JlZCcpO1xuICpcbiAqICAgdmFyIHYyID0gY3JlYXRlVmVjdG9yKC0zMCwgMjApO1xuICogICBkcmF3QXJyb3codjEsIHYyLCAnYmx1ZScpO1xuICpcbiAqICAgdmFyIHYzID0gcDUuVmVjdG9yLmFkZCh2MSwgdjIpO1xuICogICBkcmF3QXJyb3codjAsIHYzLCAncHVycGxlJyk7XG4gKiB9XG4gKlxuICogLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXG4gKiBmdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XG4gKiAgIHB1c2goKTtcbiAqICAgc3Ryb2tlKG15Q29sb3IpO1xuICogICBzdHJva2VXZWlnaHQoMyk7XG4gKiAgIGZpbGwobXlDb2xvcik7XG4gKiAgIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XG4gKiAgIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcbiAqICAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xuICogICB2YXIgYXJyb3dTaXplID0gNztcbiAqICAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XG4gKiAgIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xuICogICBwb3AoKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG4vKipcbiAqIEBtZXRob2QgYWRkXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J8TnVtYmVyW119IHZhbHVlIHRoZSB2ZWN0b3IgdG8gYWRkXG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1LlZlY3Rvci5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHgsIHksIHopIHtcbiAgaWYgKHggaW5zdGFuY2VvZiBwNS5WZWN0b3IpIHtcbiAgICB0aGlzLnggKz0geC54IHx8IDA7XG4gICAgdGhpcy55ICs9IHgueSB8fCAwO1xuICAgIHRoaXMueiArPSB4LnogfHwgMDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpZiAoeCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgdGhpcy54ICs9IHhbMF0gfHwgMDtcbiAgICB0aGlzLnkgKz0geFsxXSB8fCAwO1xuICAgIHRoaXMueiArPSB4WzJdIHx8IDA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdGhpcy54ICs9IHggfHwgMDtcbiAgdGhpcy55ICs9IHkgfHwgMDtcbiAgdGhpcy56ICs9IHogfHwgMDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyB4LCB5LCBhbmQgeiBjb21wb25lbnRzIGZyb20gYSB2ZWN0b3IsIHN1YnRyYWN0cyBvbmUgdmVjdG9yIGZyb21cbiAqIGFub3RoZXIsIG9yIHN1YnRyYWN0cyB0d28gaW5kZXBlbmRlbnQgdmVjdG9ycy4gVGhlIHZlcnNpb24gb2YgdGhlIG1ldGhvZFxuICogdGhhdCBzdWJ0cmFjdHMgdHdvIHZlY3RvcnMgaXMgYSBzdGF0aWMgbWV0aG9kIGFuZCByZXR1cm5zIGEgcDUuVmVjdG9yLCB0aGVcbiAqIG90aGVyIGFjdHMgZGlyZWN0bHkgb24gdGhlIHZlY3Rvci4gU2VlIHRoZSBleGFtcGxlcyBmb3IgbW9yZSBjb250ZXh0LlxuICpcbiAqIEBtZXRob2Qgc3ViXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggICB0aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciB0byBzdWJ0cmFjdFxuICogQHBhcmFtICB7TnVtYmVyfSBbeV0gdGhlIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgdG8gc3VidHJhY3RcbiAqIEBwYXJhbSAge051bWJlcn0gW3pdIHRoZSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHRvIHN1YnRyYWN0XG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciB2ID0gY3JlYXRlVmVjdG9yKDQsIDUsIDYpO1xuICogdi5zdWIoMSwgMSwgMSk7XG4gKiAvLyB2J3MgY29tcG9uZW50cyBhcmUgc2V0IHRvIFszLCA0LCA1XVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIC8vIFN0YXRpYyBtZXRob2RcbiAqIHZhciB2MSA9IGNyZWF0ZVZlY3RvcigyLCAzLCA0KTtcbiAqIHZhciB2MiA9IGNyZWF0ZVZlY3RvcigxLCAyLCAzKTtcbiAqXG4gKiB2YXIgdjMgPSBwNS5WZWN0b3Iuc3ViKHYxLCB2Mik7XG4gKiAvLyB2MyBoYXMgY29tcG9uZW50cyBbMSwgMSwgMV1cbiAqIHByaW50KHYzKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIHJlZCB2ZWN0b3IgLSBibHVlIHZlY3RvciA9IHB1cnBsZSB2ZWN0b3JcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqXG4gKiAgIHZhciB2MCA9IGNyZWF0ZVZlY3RvcigwLCAwKTtcbiAqICAgdmFyIHYxID0gY3JlYXRlVmVjdG9yKDcwLCA1MCk7XG4gKiAgIGRyYXdBcnJvdyh2MCwgdjEsICdyZWQnKTtcbiAqXG4gKiAgIHZhciB2MiA9IGNyZWF0ZVZlY3Rvcihtb3VzZVgsIG1vdXNlWSk7XG4gKiAgIGRyYXdBcnJvdyh2MCwgdjIsICdibHVlJyk7XG4gKlxuICogICB2YXIgdjMgPSBwNS5WZWN0b3Iuc3ViKHYxLCB2Mik7XG4gKiAgIGRyYXdBcnJvdyh2MiwgdjMsICdwdXJwbGUnKTtcbiAqIH1cbiAqXG4gKiAvLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cbiAqIGZ1bmN0aW9uIGRyYXdBcnJvdyhiYXNlLCB2ZWMsIG15Q29sb3IpIHtcbiAqICAgcHVzaCgpO1xuICogICBzdHJva2UobXlDb2xvcik7XG4gKiAgIHN0cm9rZVdlaWdodCgzKTtcbiAqICAgZmlsbChteUNvbG9yKTtcbiAqICAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcbiAqICAgbGluZSgwLCAwLCB2ZWMueCwgdmVjLnkpO1xuICogICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XG4gKiAgIHZhciBhcnJvd1NpemUgPSA3O1xuICogICB0cmFuc2xhdGUodmVjLm1hZygpIC0gYXJyb3dTaXplLCAwKTtcbiAqICAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XG4gKiAgIHBvcCgpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKi9cbi8qKlxuICogQG1ldGhvZCBzdWJcbiAqIEBwYXJhbSAge3A1LlZlY3RvcnxOdW1iZXJbXX0gdmFsdWUgdGhlIHZlY3RvciB0byBzdWJ0cmFjdFxuICogQGNoYWluYWJsZVxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1Yih4LCB5LCB6KSB7XG4gIGlmICh4IGluc3RhbmNlb2YgcDUuVmVjdG9yKSB7XG4gICAgdGhpcy54IC09IHgueCB8fCAwO1xuICAgIHRoaXMueSAtPSB4LnkgfHwgMDtcbiAgICB0aGlzLnogLT0geC56IHx8IDA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaWYgKHggaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHRoaXMueCAtPSB4WzBdIHx8IDA7XG4gICAgdGhpcy55IC09IHhbMV0gfHwgMDtcbiAgICB0aGlzLnogLT0geFsyXSB8fCAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRoaXMueCAtPSB4IHx8IDA7XG4gIHRoaXMueSAtPSB5IHx8IDA7XG4gIHRoaXMueiAtPSB6IHx8IDA7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBNdWx0aXBseSB0aGUgdmVjdG9yIGJ5IGEgc2NhbGFyLiBUaGUgc3RhdGljIHZlcnNpb24gb2YgdGhpcyBtZXRob2RcbiAqIGNyZWF0ZXMgYSBuZXcgcDUuVmVjdG9yIHdoaWxlIHRoZSBub24gc3RhdGljIHZlcnNpb24gYWN0cyBvbiB0aGUgdmVjdG9yXG4gKiBkaXJlY3RseS4gU2VlIHRoZSBleGFtcGxlcyBmb3IgbW9yZSBjb250ZXh0LlxuICpcbiAqIEBtZXRob2QgbXVsdFxuICogQHBhcmFtICB7TnVtYmVyfSAgICBuIHRoZSBudW1iZXIgdG8gbXVsdGlwbHkgd2l0aCB0aGUgdmVjdG9yXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciB2ID0gY3JlYXRlVmVjdG9yKDEsIDIsIDMpO1xuICogdi5tdWx0KDIpO1xuICogLy8gdidzIGNvbXBvbmVudHMgYXJlIHNldCB0byBbMiwgNCwgNl1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiAvLyBTdGF0aWMgbWV0aG9kXG4gKiB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMSwgMiwgMyk7XG4gKiB2YXIgdjIgPSBwNS5WZWN0b3IubXVsdCh2MSwgMik7XG4gKiAvLyB2MiBoYXMgY29tcG9uZW50cyBbMiwgNCwgNl1cbiAqIHByaW50KHYyKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqXG4gKiAgIHZhciB2MCA9IGNyZWF0ZVZlY3Rvcig1MCwgNTApO1xuICogICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMjUsIC0yNSk7XG4gKiAgIGRyYXdBcnJvdyh2MCwgdjEsICdyZWQnKTtcbiAqXG4gKiAgIHZhciBudW0gPSBtYXAobW91c2VYLCAwLCB3aWR0aCwgLTIsIDIsIHRydWUpO1xuICogICB2YXIgdjIgPSBwNS5WZWN0b3IubXVsdCh2MSwgbnVtKTtcbiAqICAgZHJhd0Fycm93KHYwLCB2MiwgJ2JsdWUnKTtcbiAqXG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIHRleHQoJ211bHRpcGxpZWQgYnkgJyArIG51bS50b0ZpeGVkKDIpLCA1LCA5MCk7XG4gKiB9XG4gKlxuICogLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXG4gKiBmdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XG4gKiAgIHB1c2goKTtcbiAqICAgc3Ryb2tlKG15Q29sb3IpO1xuICogICBzdHJva2VXZWlnaHQoMyk7XG4gKiAgIGZpbGwobXlDb2xvcik7XG4gKiAgIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XG4gKiAgIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcbiAqICAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xuICogICB2YXIgYXJyb3dTaXplID0gNztcbiAqICAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XG4gKiAgIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xuICogICBwb3AoKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLm11bHQgPSBmdW5jdGlvbiBtdWx0KG4pIHtcbiAgaWYgKCEodHlwZW9mIG4gPT09ICdudW1iZXInICYmIGlzRmluaXRlKG4pKSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdwNS5WZWN0b3IucHJvdG90eXBlLm11bHQ6JyxcbiAgICAgICduIGlzIHVuZGVmaW5lZCBvciBub3QgYSBmaW5pdGUgbnVtYmVyJ1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdGhpcy54ICo9IG47XG4gIHRoaXMueSAqPSBuO1xuICB0aGlzLnogKj0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERpdmlkZSB0aGUgdmVjdG9yIGJ5IGEgc2NhbGFyLiBUaGUgc3RhdGljIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgY3JlYXRlcyBhXG4gKiBuZXcgcDUuVmVjdG9yIHdoaWxlIHRoZSBub24gc3RhdGljIHZlcnNpb24gYWN0cyBvbiB0aGUgdmVjdG9yIGRpcmVjdGx5LlxuICogU2VlIHRoZSBleGFtcGxlcyBmb3IgbW9yZSBjb250ZXh0LlxuICpcbiAqIEBtZXRob2QgZGl2XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgIG4gdGhlIG51bWJlciB0byBkaXZpZGUgdGhlIHZlY3RvciBieVxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgdiA9IGNyZWF0ZVZlY3Rvcig2LCA0LCAyKTtcbiAqIHYuZGl2KDIpOyAvL3YncyBjb21wb25lbnRzIGFyZSBzZXQgdG8gWzMsIDIsIDFdXG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gU3RhdGljIG1ldGhvZFxuICogdmFyIHYxID0gY3JlYXRlVmVjdG9yKDYsIDQsIDIpO1xuICogdmFyIHYyID0gcDUuVmVjdG9yLmRpdih2MSwgMik7XG4gKiAvLyB2MiBoYXMgY29tcG9uZW50cyBbMywgMiwgMV1cbiAqIHByaW50KHYyKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqXG4gKiAgIHZhciB2MCA9IGNyZWF0ZVZlY3RvcigwLCAxMDApO1xuICogICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoNTAsIC01MCk7XG4gKiAgIGRyYXdBcnJvdyh2MCwgdjEsICdyZWQnKTtcbiAqXG4gKiAgIHZhciBudW0gPSBtYXAobW91c2VYLCAwLCB3aWR0aCwgMTAsIDAuNSwgdHJ1ZSk7XG4gKiAgIHZhciB2MiA9IHA1LlZlY3Rvci5kaXYodjEsIG51bSk7XG4gKiAgIGRyYXdBcnJvdyh2MCwgdjIsICdibHVlJyk7XG4gKlxuICogICBub1N0cm9rZSgpO1xuICogICB0ZXh0KCdkaXZpZGVkIGJ5ICcgKyBudW0udG9GaXhlZCgyKSwgMTAsIDkwKTtcbiAqIH1cbiAqXG4gKiAvLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cbiAqIGZ1bmN0aW9uIGRyYXdBcnJvdyhiYXNlLCB2ZWMsIG15Q29sb3IpIHtcbiAqICAgcHVzaCgpO1xuICogICBzdHJva2UobXlDb2xvcik7XG4gKiAgIHN0cm9rZVdlaWdodCgzKTtcbiAqICAgZmlsbChteUNvbG9yKTtcbiAqICAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcbiAqICAgbGluZSgwLCAwLCB2ZWMueCwgdmVjLnkpO1xuICogICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XG4gKiAgIHZhciBhcnJvd1NpemUgPSA3O1xuICogICB0cmFuc2xhdGUodmVjLm1hZygpIC0gYXJyb3dTaXplLCAwKTtcbiAqICAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XG4gKiAgIHBvcCgpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKi9cbnA1LlZlY3Rvci5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24gZGl2KG4pIHtcbiAgaWYgKCEodHlwZW9mIG4gPT09ICdudW1iZXInICYmIGlzRmluaXRlKG4pKSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdwNS5WZWN0b3IucHJvdG90eXBlLmRpdjonLFxuICAgICAgJ24gaXMgdW5kZWZpbmVkIG9yIG5vdCBhIGZpbml0ZSBudW1iZXInXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpZiAobiA9PT0gMCkge1xuICAgIGNvbnNvbGUud2FybigncDUuVmVjdG9yLnByb3RvdHlwZS5kaXY6JywgJ2RpdmlkZSBieSAwJyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdGhpcy54IC89IG47XG4gIHRoaXMueSAvPSBuO1xuICB0aGlzLnogLz0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIG1hZ25pdHVkZSAobGVuZ3RoKSBvZiB0aGUgdmVjdG9yIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXNcbiAqIGEgZmxvYXQgKHRoaXMgaXMgc2ltcGx5IHRoZSBlcXVhdGlvbiBzcXJ0KHgqeCArIHkqeSArIHoqeikuKVxuICpcbiAqIEBtZXRob2QgbWFnXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyNDApO1xuICpcbiAqICAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDAsIDApO1xuICogICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IobW91c2VYLCBtb3VzZVkpO1xuICogICBkcmF3QXJyb3codjAsIHYxLCAnYmxhY2snKTtcbiAqXG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIHRleHQoJ3ZlY3RvciBsZW5ndGg6ICcgKyB2MS5tYWcoKS50b0ZpeGVkKDIpLCAxMCwgNzAsIDkwLCAzMCk7XG4gKiB9XG4gKlxuICogLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXG4gKiBmdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XG4gKiAgIHB1c2goKTtcbiAqICAgc3Ryb2tlKG15Q29sb3IpO1xuICogICBzdHJva2VXZWlnaHQoMyk7XG4gKiAgIGZpbGwobXlDb2xvcik7XG4gKiAgIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XG4gKiAgIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcbiAqICAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xuICogICB2YXIgYXJyb3dTaXplID0gNztcbiAqICAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XG4gKiAgIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xuICogICBwb3AoKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciB2ID0gY3JlYXRlVmVjdG9yKDIwLjAsIDMwLjAsIDQwLjApO1xuICogdmFyIG0gPSB2Lm1hZygpO1xuICogcHJpbnQobSk7IC8vIFByaW50cyBcIjUzLjg1MTY0ODA3MTM0NTA0XCJcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLm1hZyA9IGZ1bmN0aW9uIG1hZygpIHtcbiAgcmV0dXJuIE1hdGguc3FydCh0aGlzLm1hZ1NxKCkpO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yIGFuZCByZXR1cm5zIHRoZSByZXN1bHRcbiAqIGFzIGEgZmxvYXQgKHRoaXMgaXMgc2ltcGx5IHRoZSBlcXVhdGlvbiA8ZW0+KHgqeCArIHkqeSArIHoqeik8L2VtPi4pXG4gKiBGYXN0ZXIgaWYgdGhlIHJlYWwgbGVuZ3RoIGlzIG5vdCByZXF1aXJlZCBpbiB0aGVcbiAqIGNhc2Ugb2YgY29tcGFyaW5nIHZlY3RvcnMsIGV0Yy5cbiAqXG4gKiBAbWV0aG9kIG1hZ1NxXG4gKiBAcmV0dXJuIHtudW1iZXJ9IHNxdWFyZWQgbWFnbml0dWRlIG9mIHRoZSB2ZWN0b3JcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gU3RhdGljIG1ldGhvZFxuICogdmFyIHYxID0gY3JlYXRlVmVjdG9yKDYsIDQsIDIpO1xuICogcHJpbnQodjEubWFnU3EoKSk7IC8vIFByaW50cyBcIjU2XCJcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqXG4gKiAgIHZhciB2MCA9IGNyZWF0ZVZlY3RvcigwLCAwKTtcbiAqICAgdmFyIHYxID0gY3JlYXRlVmVjdG9yKG1vdXNlWCwgbW91c2VZKTtcbiAqICAgZHJhd0Fycm93KHYwLCB2MSwgJ2JsYWNrJyk7XG4gKlxuICogICBub1N0cm9rZSgpO1xuICogICB0ZXh0KCd2ZWN0b3IgbGVuZ3RoIHNxdWFyZWQ6ICcgKyB2MS5tYWdTcSgpLnRvRml4ZWQoMiksIDEwLCA0NSwgOTAsIDU1KTtcbiAqIH1cbiAqXG4gKiAvLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cbiAqIGZ1bmN0aW9uIGRyYXdBcnJvdyhiYXNlLCB2ZWMsIG15Q29sb3IpIHtcbiAqICAgcHVzaCgpO1xuICogICBzdHJva2UobXlDb2xvcik7XG4gKiAgIHN0cm9rZVdlaWdodCgzKTtcbiAqICAgZmlsbChteUNvbG9yKTtcbiAqICAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcbiAqICAgbGluZSgwLCAwLCB2ZWMueCwgdmVjLnkpO1xuICogICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XG4gKiAgIHZhciBhcnJvd1NpemUgPSA3O1xuICogICB0cmFuc2xhdGUodmVjLm1hZygpIC0gYXJyb3dTaXplLCAwKTtcbiAqICAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XG4gKiAgIHBvcCgpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKi9cbnA1LlZlY3Rvci5wcm90b3R5cGUubWFnU3EgPSBmdW5jdGlvbiBtYWdTcSgpIHtcbiAgdmFyIHggPSB0aGlzLng7XG4gIHZhciB5ID0gdGhpcy55O1xuICB2YXIgeiA9IHRoaXMuejtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogejtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMuIFRoZSB2ZXJzaW9uIG9mIHRoZSBtZXRob2RcbiAqIHRoYXQgY29tcHV0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBpbmRlcGVuZGVudCB2ZWN0b3JzIGlzIGEgc3RhdGljXG4gKiBtZXRob2QuIFNlZSB0aGUgZXhhbXBsZXMgZm9yIG1vcmUgY29udGV4dC5cbiAqXG4gKlxuICogQG1ldGhvZCBkb3RcbiAqIEBwYXJhbSAge051bWJlcn0geCAgIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3JcbiAqIEBwYXJhbSAge051bWJlcn0gW3ldIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3JcbiAqIEBwYXJhbSAge051bWJlcn0gW3pdIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3JcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgdGhlIGRvdCBwcm9kdWN0XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMSwgMiwgMyk7XG4gKiB2YXIgdjIgPSBjcmVhdGVWZWN0b3IoMiwgMywgNCk7XG4gKlxuICogcHJpbnQodjEuZG90KHYyKSk7IC8vIFByaW50cyBcIjIwXCJcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiAvL1N0YXRpYyBtZXRob2RcbiAqIHZhciB2MSA9IGNyZWF0ZVZlY3RvcigxLCAyLCAzKTtcbiAqIHZhciB2MiA9IGNyZWF0ZVZlY3RvcigzLCAyLCAxKTtcbiAqIHByaW50KHA1LlZlY3Rvci5kb3QodjEsIHYyKSk7IC8vIFByaW50cyBcIjEwXCJcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG4vKipcbiAqIEBtZXRob2QgZG90XG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHZhbHVlIHZhbHVlIGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIG9yIGEgcDUuVmVjdG9yXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbnA1LlZlY3Rvci5wcm90b3R5cGUuZG90ID0gZnVuY3Rpb24gZG90KHgsIHksIHopIHtcbiAgaWYgKHggaW5zdGFuY2VvZiBwNS5WZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5kb3QoeC54LCB4LnksIHgueik7XG4gIH1cbiAgcmV0dXJuIHRoaXMueCAqICh4IHx8IDApICsgdGhpcy55ICogKHkgfHwgMCkgKyB0aGlzLnogKiAoeiB8fCAwKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciBjb21wb3NlZCBvZiB0aGUgY3Jvc3MgcHJvZHVjdCBiZXR3ZWVuXG4gKiB0d28gdmVjdG9ycy4gQm90aCB0aGUgc3RhdGljIGFuZCBub24gc3RhdGljIG1ldGhvZHMgcmV0dXJuIGEgbmV3IHA1LlZlY3Rvci5cbiAqIFNlZSB0aGUgZXhhbXBsZXMgZm9yIG1vcmUgY29udGV4dC5cbiAqXG4gKiBAbWV0aG9kIGNyb3NzXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHYgcDUuVmVjdG9yIHRvIGJlIGNyb3NzZWRcbiAqIEByZXR1cm4ge3A1LlZlY3Rvcn0gICBwNS5WZWN0b3IgY29tcG9zZWQgb2YgY3Jvc3MgcHJvZHVjdFxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMSwgMiwgMyk7XG4gKiB2YXIgdjIgPSBjcmVhdGVWZWN0b3IoMSwgMiwgMyk7XG4gKlxuICogdjEuY3Jvc3ModjIpOyAvLyB2J3MgY29tcG9uZW50cyBhcmUgWzAsIDAsIDBdXG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gU3RhdGljIG1ldGhvZFxuICogdmFyIHYxID0gY3JlYXRlVmVjdG9yKDEsIDAsIDApO1xuICogdmFyIHYyID0gY3JlYXRlVmVjdG9yKDAsIDEsIDApO1xuICpcbiAqIHZhciBjcm9zc1Byb2R1Y3QgPSBwNS5WZWN0b3IuY3Jvc3ModjEsIHYyKTtcbiAqIC8vIGNyb3NzUHJvZHVjdCBoYXMgY29tcG9uZW50cyBbMCwgMCwgMV1cbiAqIHByaW50KGNyb3NzUHJvZHVjdCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xucDUuVmVjdG9yLnByb3RvdHlwZS5jcm9zcyA9IGZ1bmN0aW9uIGNyb3NzKHYpIHtcbiAgdmFyIHggPSB0aGlzLnkgKiB2LnogLSB0aGlzLnogKiB2Lnk7XG4gIHZhciB5ID0gdGhpcy56ICogdi54IC0gdGhpcy54ICogdi56O1xuICB2YXIgeiA9IHRoaXMueCAqIHYueSAtIHRoaXMueSAqIHYueDtcbiAgaWYgKHRoaXMucDUpIHtcbiAgICByZXR1cm4gbmV3IHA1LlZlY3Rvcih0aGlzLnA1LCBbeCwgeSwgel0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgcDUuVmVjdG9yKHgsIHksIHopO1xuICB9XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMgKGNvbnNpZGVyaW5nIGFcbiAqIHBvaW50IGFzIGEgdmVjdG9yIG9iamVjdCkuXG4gKlxuICogQG1ldGhvZCBkaXN0XG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHYgdGhlIHgsIHksIGFuZCB6IGNvb3JkaW5hdGVzIG9mIGEgcDUuVmVjdG9yXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgdGhlIGRpc3RhbmNlXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciB2MSA9IGNyZWF0ZVZlY3RvcigxLCAwLCAwKTtcbiAqIHZhciB2MiA9IGNyZWF0ZVZlY3RvcigwLCAxLCAwKTtcbiAqXG4gKiB2YXIgZGlzdGFuY2UgPSB2MS5kaXN0KHYyKTsgLy8gZGlzdGFuY2UgaXMgMS40MTQyLi4uXG4gKiBwcmludChkaXN0YW5jZSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogLy8gU3RhdGljIG1ldGhvZFxuICogdmFyIHYxID0gY3JlYXRlVmVjdG9yKDEsIDAsIDApO1xuICogdmFyIHYyID0gY3JlYXRlVmVjdG9yKDAsIDEsIDApO1xuICpcbiAqIHZhciBkaXN0YW5jZSA9IHA1LlZlY3Rvci5kaXN0KHYxLCB2Mik7XG4gKiAvLyBkaXN0YW5jZSBpcyAxLjQxNDIuLi5cbiAqIHByaW50KGRpc3RhbmNlKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqXG4gKiAgIHZhciB2MCA9IGNyZWF0ZVZlY3RvcigwLCAwKTtcbiAqXG4gKiAgIHZhciB2MSA9IGNyZWF0ZVZlY3Rvcig3MCwgNTApO1xuICogICBkcmF3QXJyb3codjAsIHYxLCAncmVkJyk7XG4gKlxuICogICB2YXIgdjIgPSBjcmVhdGVWZWN0b3IobW91c2VYLCBtb3VzZVkpO1xuICogICBkcmF3QXJyb3codjAsIHYyLCAnYmx1ZScpO1xuICpcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgdGV4dCgnZGlzdGFuY2UgYmV0d2VlbiB2ZWN0b3JzOiAnICsgdjIuZGlzdCh2MSkudG9GaXhlZCgyKSwgNSwgNTAsIDk1LCA1MCk7XG4gKiB9XG4gKlxuICogLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXG4gKiBmdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XG4gKiAgIHB1c2goKTtcbiAqICAgc3Ryb2tlKG15Q29sb3IpO1xuICogICBzdHJva2VXZWlnaHQoMyk7XG4gKiAgIGZpbGwobXlDb2xvcik7XG4gKiAgIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XG4gKiAgIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcbiAqICAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xuICogICB2YXIgYXJyb3dTaXplID0gNztcbiAqICAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XG4gKiAgIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xuICogICBwb3AoKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLmRpc3QgPSBmdW5jdGlvbiBkaXN0KHYpIHtcbiAgcmV0dXJuIHZcbiAgICAuY29weSgpXG4gICAgLnN1Yih0aGlzKVxuICAgIC5tYWcoKTtcbn07XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSB2ZWN0b3IgdG8gbGVuZ3RoIDEgKG1ha2UgaXQgYSB1bml0IHZlY3RvcikuXG4gKlxuICogQG1ldGhvZCBub3JtYWxpemVcbiAqIEByZXR1cm4ge3A1LlZlY3Rvcn0gbm9ybWFsaXplZCBwNS5WZWN0b3JcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogdmFyIHYgPSBjcmVhdGVWZWN0b3IoMTAsIDIwLCAyKTtcbiAqIC8vIHYgaGFzIGNvbXBvbmVudHMgWzEwLjAsIDIwLjAsIDIuMF1cbiAqIHYubm9ybWFsaXplKCk7XG4gKiAvLyB2J3MgY29tcG9uZW50cyBhcmUgc2V0IHRvXG4gKiAvLyBbMC40NDU0MzU0LCAwLjg5MDg3MDgsIDAuMDg5MDg3MDg0XVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDI0MCk7XG4gKlxuICogICB2YXIgdjAgPSBjcmVhdGVWZWN0b3IoNTAsIDUwKTtcbiAqICAgdmFyIHYxID0gY3JlYXRlVmVjdG9yKG1vdXNlWCAtIDUwLCBtb3VzZVkgLSA1MCk7XG4gKlxuICogICBkcmF3QXJyb3codjAsIHYxLCAncmVkJyk7XG4gKiAgIHYxLm5vcm1hbGl6ZSgpO1xuICogICBkcmF3QXJyb3codjAsIHYxLm11bHQoMzUpLCAnYmx1ZScpO1xuICpcbiAqICAgbm9GaWxsKCk7XG4gKiAgIGVsbGlwc2UoNTAsIDUwLCAzNSAqIDIpO1xuICogfVxuICpcbiAqIC8vIGRyYXcgYW4gYXJyb3cgZm9yIGEgdmVjdG9yIGF0IGEgZ2l2ZW4gYmFzZSBwb3NpdGlvblxuICogZnVuY3Rpb24gZHJhd0Fycm93KGJhc2UsIHZlYywgbXlDb2xvcikge1xuICogICBwdXNoKCk7XG4gKiAgIHN0cm9rZShteUNvbG9yKTtcbiAqICAgc3Ryb2tlV2VpZ2h0KDMpO1xuICogICBmaWxsKG15Q29sb3IpO1xuICogICB0cmFuc2xhdGUoYmFzZS54LCBiYXNlLnkpO1xuICogICBsaW5lKDAsIDAsIHZlYy54LCB2ZWMueSk7XG4gKiAgIHJvdGF0ZSh2ZWMuaGVhZGluZygpKTtcbiAqICAgdmFyIGFycm93U2l6ZSA9IDc7XG4gKiAgIHRyYW5zbGF0ZSh2ZWMubWFnKCkgLSBhcnJvd1NpemUsIDApO1xuICogICB0cmlhbmdsZSgwLCBhcnJvd1NpemUgLyAyLCAwLCAtYXJyb3dTaXplIC8gMiwgYXJyb3dTaXplLCAwKTtcbiAqICAgcG9wKCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xucDUuVmVjdG9yLnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gIHZhciBsZW4gPSB0aGlzLm1hZygpO1xuICAvLyBoZXJlIHdlIG11bHRpcGx5IGJ5IHRoZSByZWNpcHJvY2FsIGluc3RlYWQgb2YgY2FsbGluZyAnZGl2KCknXG4gIC8vIHNpbmNlIGRpdiBkdXBsaWNhdGVzIHRoaXMgemVybyBjaGVjay5cbiAgaWYgKGxlbiAhPT0gMCkgdGhpcy5tdWx0KDEgLyBsZW4pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogTGltaXQgdGhlIG1hZ25pdHVkZSBvZiB0aGlzIHZlY3RvciB0byB0aGUgdmFsdWUgdXNlZCBmb3IgdGhlIDxiPm1heDwvYj5cbiAqIHBhcmFtZXRlci5cbiAqXG4gKiBAbWV0aG9kIGxpbWl0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgIG1heCB0aGUgbWF4aW11bSBtYWduaXR1ZGUgZm9yIHRoZSB2ZWN0b3JcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogdmFyIHYgPSBjcmVhdGVWZWN0b3IoMTAsIDIwLCAyKTtcbiAqIC8vIHYgaGFzIGNvbXBvbmVudHMgWzEwLjAsIDIwLjAsIDIuMF1cbiAqIHYubGltaXQoNSk7XG4gKiAvLyB2J3MgY29tcG9uZW50cyBhcmUgc2V0IHRvXG4gKiAvLyBbMi4yMjcxNzcxLCA0LjQ1NDM1NDMsIDAuNDQ1NDM1NF1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyNDApO1xuICpcbiAqICAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XG4gKiAgIHZhciB2MSA9IGNyZWF0ZVZlY3Rvcihtb3VzZVggLSA1MCwgbW91c2VZIC0gNTApO1xuICpcbiAqICAgZHJhd0Fycm93KHYwLCB2MSwgJ3JlZCcpO1xuICogICBkcmF3QXJyb3codjAsIHYxLmxpbWl0KDM1KSwgJ2JsdWUnKTtcbiAqXG4gKiAgIG5vRmlsbCgpO1xuICogICBlbGxpcHNlKDUwLCA1MCwgMzUgKiAyKTtcbiAqIH1cbiAqXG4gKiAvLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cbiAqIGZ1bmN0aW9uIGRyYXdBcnJvdyhiYXNlLCB2ZWMsIG15Q29sb3IpIHtcbiAqICAgcHVzaCgpO1xuICogICBzdHJva2UobXlDb2xvcik7XG4gKiAgIHN0cm9rZVdlaWdodCgzKTtcbiAqICAgZmlsbChteUNvbG9yKTtcbiAqICAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcbiAqICAgbGluZSgwLCAwLCB2ZWMueCwgdmVjLnkpO1xuICogICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XG4gKiAgIHZhciBhcnJvd1NpemUgPSA3O1xuICogICB0cmFuc2xhdGUodmVjLm1hZygpIC0gYXJyb3dTaXplLCAwKTtcbiAqICAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XG4gKiAgIHBvcCgpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKi9cbnA1LlZlY3Rvci5wcm90b3R5cGUubGltaXQgPSBmdW5jdGlvbiBsaW1pdChtYXgpIHtcbiAgdmFyIG1TcSA9IHRoaXMubWFnU3EoKTtcbiAgaWYgKG1TcSA+IG1heCAqIG1heCkge1xuICAgIHRoaXMuZGl2KE1hdGguc3FydChtU3EpKSAvL25vcm1hbGl6ZSBpdFxuICAgICAgLm11bHQobWF4KTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBtYWduaXR1ZGUgb2YgdGhpcyB2ZWN0b3IgdG8gdGhlIHZhbHVlIHVzZWQgZm9yIHRoZSA8Yj5sZW48L2I+XG4gKiBwYXJhbWV0ZXIuXG4gKlxuICogQG1ldGhvZCBzZXRNYWdcbiAqIEBwYXJhbSAge251bWJlcn0gICAgbGVuIHRoZSBuZXcgbGVuZ3RoIGZvciB0aGlzIHZlY3RvclxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgdiA9IGNyZWF0ZVZlY3RvcigxMCwgMjAsIDIpO1xuICogLy8gdiBoYXMgY29tcG9uZW50cyBbMTAuMCwgMjAuMCwgMi4wXVxuICogdi5zZXRNYWcoMTApO1xuICogLy8gdidzIGNvbXBvbmVudHMgYXJlIHNldCB0byBbNi4wLCA4LjAsIDAuMF1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqXG4gKiAgIHZhciB2MCA9IGNyZWF0ZVZlY3RvcigwLCAwKTtcbiAqICAgdmFyIHYxID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XG4gKlxuICogICBkcmF3QXJyb3codjAsIHYxLCAncmVkJyk7XG4gKlxuICogICB2YXIgbGVuZ3RoID0gbWFwKG1vdXNlWCwgMCwgd2lkdGgsIDAsIDE0MSwgdHJ1ZSk7XG4gKiAgIHYxLnNldE1hZyhsZW5ndGgpO1xuICogICBkcmF3QXJyb3codjAsIHYxLCAnYmx1ZScpO1xuICpcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgdGV4dCgnbWFnbml0dWRlIHNldCB0bzogJyArIGxlbmd0aC50b0ZpeGVkKDIpLCAxMCwgNzAsIDkwLCAzMCk7XG4gKiB9XG4gKlxuICogLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXG4gKiBmdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XG4gKiAgIHB1c2goKTtcbiAqICAgc3Ryb2tlKG15Q29sb3IpO1xuICogICBzdHJva2VXZWlnaHQoMyk7XG4gKiAgIGZpbGwobXlDb2xvcik7XG4gKiAgIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XG4gKiAgIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcbiAqICAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xuICogICB2YXIgYXJyb3dTaXplID0gNztcbiAqICAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XG4gKiAgIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xuICogICBwb3AoKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLnNldE1hZyA9IGZ1bmN0aW9uIHNldE1hZyhuKSB7XG4gIHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHQobik7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgYW5nbGUgb2Ygcm90YXRpb24gZm9yIHRoaXMgdmVjdG9yIChvbmx5IDJEIHZlY3RvcnMpXG4gKlxuICogQG1ldGhvZCBoZWFkaW5nXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3MgPSBcIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMzAsIDUwKTtcbiAqICAgcHJpbnQodjEuaGVhZGluZygpKTsgLy8gMS4wMzAzNzY4MjY1MjQzMTI1XG4gKlxuICogICB2MSA9IGNyZWF0ZVZlY3Rvcig0MCwgNTApO1xuICogICBwcmludCh2MS5oZWFkaW5nKCkpOyAvLyAwLjg5NjA1NTM4NDU3MTM0MzlcbiAqXG4gKiAgIHYxID0gY3JlYXRlVmVjdG9yKDMwLCA3MCk7XG4gKiAgIHByaW50KHYxLmhlYWRpbmcoKSk7IC8vIDEuMTY1OTA0NTQwNTA5ODEzMlxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyNDApO1xuICpcbiAqICAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XG4gKiAgIHZhciB2MSA9IGNyZWF0ZVZlY3Rvcihtb3VzZVggLSA1MCwgbW91c2VZIC0gNTApO1xuICpcbiAqICAgZHJhd0Fycm93KHYwLCB2MSwgJ2JsYWNrJyk7XG4gKlxuICogICB2YXIgbXlIZWFkaW5nID0gdjEuaGVhZGluZygpO1xuICogICBub1N0cm9rZSgpO1xuICogICB0ZXh0KFxuICogICAgICd2ZWN0b3IgaGVhZGluZzogJyArXG4gKiAgICAgICBteUhlYWRpbmcudG9GaXhlZCgyKSArXG4gKiAgICAgICAnIHJhZGlhbnMgb3IgJyArXG4gKiAgICAgICBkZWdyZWVzKG15SGVhZGluZykudG9GaXhlZCgyKSArXG4gKiAgICAgICAnIGRlZ3JlZXMnLFxuICogICAgIDEwLFxuICogICAgIDUwLFxuICogICAgIDkwLFxuICogICAgIDUwXG4gKiAgICk7XG4gKiB9XG4gKlxuICogLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXG4gKiBmdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XG4gKiAgIHB1c2goKTtcbiAqICAgc3Ryb2tlKG15Q29sb3IpO1xuICogICBzdHJva2VXZWlnaHQoMyk7XG4gKiAgIGZpbGwobXlDb2xvcik7XG4gKiAgIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XG4gKiAgIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcbiAqICAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xuICogICB2YXIgYXJyb3dTaXplID0gNztcbiAqICAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XG4gKiAgIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xuICogICBwb3AoKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLmhlYWRpbmcgPSBmdW5jdGlvbiBoZWFkaW5nKCkge1xuICB2YXIgaCA9IE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xuICBpZiAodGhpcy5wNSkgcmV0dXJuIHRoaXMucDUuX2Zyb21SYWRpYW5zKGgpO1xuICByZXR1cm4gaDtcbn07XG5cbi8qKlxuICogUm90YXRlIHRoZSB2ZWN0b3IgYnkgYW4gYW5nbGUgKG9ubHkgMkQgdmVjdG9ycyksIG1hZ25pdHVkZSByZW1haW5zIHRoZVxuICogc2FtZVxuICpcbiAqIEBtZXRob2Qgcm90YXRlXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgIGFuZ2xlIHRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgdiA9IGNyZWF0ZVZlY3RvcigxMC4wLCAyMC4wKTtcbiAqIC8vIHYgaGFzIGNvbXBvbmVudHMgWzEwLjAsIDIwLjAsIDAuMF1cbiAqIHYucm90YXRlKEhBTEZfUEkpO1xuICogLy8gdidzIGNvbXBvbmVudHMgYXJlIHNldCB0byBbLTIwLjAsIDkuOTk5OTk5LCAwLjBdXG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYW5nbGUgPSAwO1xuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyNDApO1xuICpcbiAqICAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XG4gKiAgIHZhciB2MSA9IGNyZWF0ZVZlY3Rvcig1MCwgMCk7XG4gKlxuICogICBkcmF3QXJyb3codjAsIHYxLnJvdGF0ZShhbmdsZSksICdibGFjaycpO1xuICogICBhbmdsZSArPSAwLjAxO1xuICogfVxuICpcbiAqIC8vIGRyYXcgYW4gYXJyb3cgZm9yIGEgdmVjdG9yIGF0IGEgZ2l2ZW4gYmFzZSBwb3NpdGlvblxuICogZnVuY3Rpb24gZHJhd0Fycm93KGJhc2UsIHZlYywgbXlDb2xvcikge1xuICogICBwdXNoKCk7XG4gKiAgIHN0cm9rZShteUNvbG9yKTtcbiAqICAgc3Ryb2tlV2VpZ2h0KDMpO1xuICogICBmaWxsKG15Q29sb3IpO1xuICogICB0cmFuc2xhdGUoYmFzZS54LCBiYXNlLnkpO1xuICogICBsaW5lKDAsIDAsIHZlYy54LCB2ZWMueSk7XG4gKiAgIHJvdGF0ZSh2ZWMuaGVhZGluZygpKTtcbiAqICAgdmFyIGFycm93U2l6ZSA9IDc7XG4gKiAgIHRyYW5zbGF0ZSh2ZWMubWFnKCkgLSBhcnJvd1NpemUsIDApO1xuICogICB0cmlhbmdsZSgwLCBhcnJvd1NpemUgLyAyLCAwLCAtYXJyb3dTaXplIC8gMiwgYXJyb3dTaXplLCAwKTtcbiAqICAgcG9wKCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xucDUuVmVjdG9yLnByb3RvdHlwZS5yb3RhdGUgPSBmdW5jdGlvbiByb3RhdGUoYSkge1xuICB2YXIgbmV3SGVhZGluZyA9IHRoaXMuaGVhZGluZygpICsgYTtcbiAgaWYgKHRoaXMucDUpIG5ld0hlYWRpbmcgPSB0aGlzLnA1Ll90b1JhZGlhbnMobmV3SGVhZGluZyk7XG4gIHZhciBtYWcgPSB0aGlzLm1hZygpO1xuICB0aGlzLnggPSBNYXRoLmNvcyhuZXdIZWFkaW5nKSAqIG1hZztcbiAgdGhpcy55ID0gTWF0aC5zaW4obmV3SGVhZGluZykgKiBtYWc7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBhbmdsZSAoaW4gcmFkaWFucykgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqIEBtZXRob2QgYW5nbGVCZXR3ZWVuXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9ICAgIHRoZSB4LCB5LCBhbmQgeiBjb21wb25lbnRzIG9mIGEgcDUuVmVjdG9yXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgIHRoZSBhbmdsZSBiZXR3ZWVuIChpbiByYWRpYW5zKVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMSwgMCwgMCk7XG4gKiB2YXIgdjIgPSBjcmVhdGVWZWN0b3IoMCwgMSwgMCk7XG4gKlxuICogdmFyIGFuZ2xlID0gdjEuYW5nbGVCZXR3ZWVuKHYyKTtcbiAqIC8vIGFuZ2xlIGlzIFBJLzJcbiAqIHByaW50KGFuZ2xlKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqICAgdmFyIHYwID0gY3JlYXRlVmVjdG9yKDUwLCA1MCk7XG4gKlxuICogICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoNTAsIDApO1xuICogICBkcmF3QXJyb3codjAsIHYxLCAncmVkJyk7XG4gKlxuICogICB2YXIgdjIgPSBjcmVhdGVWZWN0b3IobW91c2VYIC0gNTAsIG1vdXNlWSAtIDUwKTtcbiAqICAgZHJhd0Fycm93KHYwLCB2MiwgJ2JsdWUnKTtcbiAqXG4gKiAgIHZhciBhbmdsZUJldHdlZW4gPSB2MS5hbmdsZUJldHdlZW4odjIpO1xuICogICBub1N0cm9rZSgpO1xuICogICB0ZXh0KFxuICogICAgICdhbmdsZSBiZXR3ZWVuOiAnICtcbiAqICAgICAgIGFuZ2xlQmV0d2Vlbi50b0ZpeGVkKDIpICtcbiAqICAgICAgICcgcmFkaWFucyBvciAnICtcbiAqICAgICAgIGRlZ3JlZXMoYW5nbGVCZXR3ZWVuKS50b0ZpeGVkKDIpICtcbiAqICAgICAgICcgZGVncmVlcycsXG4gKiAgICAgMTAsXG4gKiAgICAgNTAsXG4gKiAgICAgOTAsXG4gKiAgICAgNTBcbiAqICAgKTtcbiAqIH1cbiAqXG4gKiAvLyBkcmF3IGFuIGFycm93IGZvciBhIHZlY3RvciBhdCBhIGdpdmVuIGJhc2UgcG9zaXRpb25cbiAqIGZ1bmN0aW9uIGRyYXdBcnJvdyhiYXNlLCB2ZWMsIG15Q29sb3IpIHtcbiAqICAgcHVzaCgpO1xuICogICBzdHJva2UobXlDb2xvcik7XG4gKiAgIHN0cm9rZVdlaWdodCgzKTtcbiAqICAgZmlsbChteUNvbG9yKTtcbiAqICAgdHJhbnNsYXRlKGJhc2UueCwgYmFzZS55KTtcbiAqICAgbGluZSgwLCAwLCB2ZWMueCwgdmVjLnkpO1xuICogICByb3RhdGUodmVjLmhlYWRpbmcoKSk7XG4gKiAgIHZhciBhcnJvd1NpemUgPSA3O1xuICogICB0cmFuc2xhdGUodmVjLm1hZygpIC0gYXJyb3dTaXplLCAwKTtcbiAqICAgdHJpYW5nbGUoMCwgYXJyb3dTaXplIC8gMiwgMCwgLWFycm93U2l6ZSAvIDIsIGFycm93U2l6ZSwgMCk7XG4gKiAgIHBvcCgpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKi9cbnA1LlZlY3Rvci5wcm90b3R5cGUuYW5nbGVCZXR3ZWVuID0gZnVuY3Rpb24gYW5nbGVCZXR3ZWVuKHYpIHtcbiAgdmFyIGRvdG1hZ21hZyA9IHRoaXMuZG90KHYpIC8gKHRoaXMubWFnKCkgKiB2Lm1hZygpKTtcbiAgLy8gTWF0aGVtYXRpY2FsbHkgc3BlYWtpbmc6IHRoZSBkb3RtYWdtYWcgdmFyaWFibGUgd2lsbCBiZSBiZXR3ZWVuIC0xIGFuZCAxXG4gIC8vIGluY2x1c2l2ZS4gUHJhY3RpY2FsbHkgdGhvdWdoIGl0IGNvdWxkIGJlIHNsaWdodGx5IG91dHNpZGUgdGhpcyByYW5nZSBkdWVcbiAgLy8gdG8gZmxvYXRpbmctcG9pbnQgcm91bmRpbmcgaXNzdWVzLiBUaGlzIGNhbiBtYWtlIE1hdGguYWNvcyByZXR1cm4gTmFOLlxuICAvL1xuICAvLyBTb2x1dGlvbjogd2UnbGwgY2xhbXAgdGhlIHZhbHVlIHRvIHRoZSAtMSwxIHJhbmdlXG4gIHZhciBhbmdsZSA9IE1hdGguYWNvcyhNYXRoLm1pbigxLCBNYXRoLm1heCgtMSwgZG90bWFnbWFnKSkpO1xuICBpZiAodGhpcy5wNSkgcmV0dXJuIHRoaXMucDUuX2Zyb21SYWRpYW5zKGFuZ2xlKTtcbiAgcmV0dXJuIGFuZ2xlO1xufTtcblxuLyoqXG4gKiBMaW5lYXIgaW50ZXJwb2xhdGUgdGhlIHZlY3RvciB0byBhbm90aGVyIHZlY3RvclxuICpcbiAqIEBtZXRob2QgbGVycFxuICogQHBhcmFtICB7TnVtYmVyfSAgICB4ICAgdGhlIHggY29tcG9uZW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgIHkgICB0aGUgeSBjb21wb25lbnRcbiAqIEBwYXJhbSAge051bWJlcn0gICAgeiAgIHRoZSB6IGNvbXBvbmVudFxuICogQHBhcmFtICB7TnVtYmVyfSAgICBhbXQgdGhlIGFtb3VudCBvZiBpbnRlcnBvbGF0aW9uOyBzb21lIHZhbHVlIGJldHdlZW4gMC4wXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAob2xkIHZlY3RvcikgYW5kIDEuMCAobmV3IHZlY3RvcikuIDAuOSBpcyB2ZXJ5IG5lYXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXcgdmVjdG9yLiAwLjUgaXMgaGFsZndheSBpbiBiZXR3ZWVuLlxuICogQGNoYWluYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogdmFyIHYgPSBjcmVhdGVWZWN0b3IoMSwgMSwgMCk7XG4gKlxuICogdi5sZXJwKDMsIDMsIDAsIDAuNSk7IC8vIHYgbm93IGhhcyBjb21wb25lbnRzIFsyLDIsMF1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgdjEgPSBjcmVhdGVWZWN0b3IoMCwgMCwgMCk7XG4gKiB2YXIgdjIgPSBjcmVhdGVWZWN0b3IoMTAwLCAxMDAsIDApO1xuICpcbiAqIHZhciB2MyA9IHA1LlZlY3Rvci5sZXJwKHYxLCB2MiwgMC41KTtcbiAqIC8vIHYzIGhhcyBjb21wb25lbnRzIFs1MCw1MCwwXVxuICogcHJpbnQodjMpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIHN0ZXAgPSAwLjAxO1xuICogdmFyIGFtb3VudCA9IDA7XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyNDApO1xuICogICB2YXIgdjAgPSBjcmVhdGVWZWN0b3IoMCwgMCk7XG4gKlxuICogICB2YXIgdjEgPSBjcmVhdGVWZWN0b3IobW91c2VYLCBtb3VzZVkpO1xuICogICBkcmF3QXJyb3codjAsIHYxLCAncmVkJyk7XG4gKlxuICogICB2YXIgdjIgPSBjcmVhdGVWZWN0b3IoOTAsIDkwKTtcbiAqICAgZHJhd0Fycm93KHYwLCB2MiwgJ2JsdWUnKTtcbiAqXG4gKiAgIGlmIChhbW91bnQgPiAxIHx8IGFtb3VudCA8IDApIHtcbiAqICAgICBzdGVwICo9IC0xO1xuICogICB9XG4gKiAgIGFtb3VudCArPSBzdGVwO1xuICogICB2YXIgdjMgPSBwNS5WZWN0b3IubGVycCh2MSwgdjIsIGFtb3VudCk7XG4gKlxuICogICBkcmF3QXJyb3codjAsIHYzLCAncHVycGxlJyk7XG4gKiB9XG4gKlxuICogLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXG4gKiBmdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XG4gKiAgIHB1c2goKTtcbiAqICAgc3Ryb2tlKG15Q29sb3IpO1xuICogICBzdHJva2VXZWlnaHQoMyk7XG4gKiAgIGZpbGwobXlDb2xvcik7XG4gKiAgIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XG4gKiAgIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcbiAqICAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xuICogICB2YXIgYXJyb3dTaXplID0gNztcbiAqICAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XG4gKiAgIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xuICogICBwb3AoKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG4vKipcbiAqIEBtZXRob2QgbGVycFxuICogQHBhcmFtICB7cDUuVmVjdG9yfSB2ICAgdGhlIHA1LlZlY3RvciB0byBsZXJwIHRvXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgIGFtdFxuICogQGNoYWluYWJsZVxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLmxlcnAgPSBmdW5jdGlvbiBsZXJwKHgsIHksIHosIGFtdCkge1xuICBpZiAoeCBpbnN0YW5jZW9mIHA1LlZlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmxlcnAoeC54LCB4LnksIHgueiwgeSk7XG4gIH1cbiAgdGhpcy54ICs9ICh4IC0gdGhpcy54KSAqIGFtdCB8fCAwO1xuICB0aGlzLnkgKz0gKHkgLSB0aGlzLnkpICogYW10IHx8IDA7XG4gIHRoaXMueiArPSAoeiAtIHRoaXMueikgKiBhbXQgfHwgMDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmVjdG9yIGFzIGEgZmxvYXQgYXJyYXkuIFRoaXMgaXMgb25seVxuICogZm9yIHRlbXBvcmFyeSB1c2UuIElmIHVzZWQgaW4gYW55IG90aGVyIGZhc2hpb24sIHRoZSBjb250ZW50cyBzaG91bGQgYmVcbiAqIGNvcGllZCBieSB1c2luZyB0aGUgPGI+cDUuVmVjdG9yLmNvcHkoKTwvYj4gbWV0aG9kIHRvIGNvcHkgaW50byB5b3VyIG93blxuICogYXJyYXkuXG4gKlxuICogQG1ldGhvZCBhcnJheVxuICogQHJldHVybiB7TnVtYmVyW119IGFuIEFycmF5IHdpdGggdGhlIDMgdmFsdWVzXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcyA9IFwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciB2ID0gY3JlYXRlVmVjdG9yKDIwLCAzMCk7XG4gKiAgIHByaW50KHYuYXJyYXkoKSk7IC8vIFByaW50cyA6IEFycmF5IFsyMCwgMzAsIDBdXG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogdmFyIHYgPSBjcmVhdGVWZWN0b3IoMTAuMCwgMjAuMCwgMzAuMCk7XG4gKiB2YXIgZiA9IHYuYXJyYXkoKTtcbiAqIHByaW50KGZbMF0pOyAvLyBQcmludHMgXCIxMC4wXCJcbiAqIHByaW50KGZbMV0pOyAvLyBQcmludHMgXCIyMC4wXCJcbiAqIHByaW50KGZbMl0pOyAvLyBQcmludHMgXCIzMC4wXCJcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLmFycmF5ID0gZnVuY3Rpb24gYXJyYXkoKSB7XG4gIHJldHVybiBbdGhpcy54IHx8IDAsIHRoaXMueSB8fCAwLCB0aGlzLnogfHwgMF07XG59O1xuXG4vKipcbiAqIEVxdWFsaXR5IGNoZWNrIGFnYWluc3QgYSBwNS5WZWN0b3JcbiAqXG4gKiBAbWV0aG9kIGVxdWFsc1xuICogQHBhcmFtIHtOdW1iZXJ9IFt4XSB0aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFt5XSB0aGUgeSBjb21wb25lbnQgb2YgdGhlIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFt6XSB0aGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvclxuICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB0aGUgdmVjdG9ycyBhcmUgZXF1YWxzXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcyA9IFwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogdmFyIHYxID0gY3JlYXRlVmVjdG9yKDUsIDEwLCAyMCk7XG4gKiB2YXIgdjIgPSBjcmVhdGVWZWN0b3IoNSwgMTAsIDIwKTtcbiAqIHZhciB2MyA9IGNyZWF0ZVZlY3RvcigxMywgMTAsIDE5KTtcbiAqXG4gKiBwcmludCh2MS5lcXVhbHModjIueCwgdjIueSwgdjIueikpOyAvLyB0cnVlXG4gKiBwcmludCh2MS5lcXVhbHModjMueCwgdjMueSwgdjMueikpOyAvLyBmYWxzZVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciB2MSA9IGNyZWF0ZVZlY3RvcigxMC4wLCAyMC4wLCAzMC4wKTtcbiAqIHZhciB2MiA9IGNyZWF0ZVZlY3RvcigxMC4wLCAyMC4wLCAzMC4wKTtcbiAqIHZhciB2MyA9IGNyZWF0ZVZlY3RvcigwLjAsIDAuMCwgMC4wKTtcbiAqIHByaW50KHYxLmVxdWFscyh2MikpOyAvLyB0cnVlXG4gKiBwcmludCh2MS5lcXVhbHModjMpKTsgLy8gZmFsc2VcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG4vKipcbiAqIEBtZXRob2QgZXF1YWxzXG4gKiBAcGFyYW0ge3A1LlZlY3RvcnxBcnJheX0gdmFsdWUgdGhlIHZlY3RvciB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5wNS5WZWN0b3IucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyh4LCB5LCB6KSB7XG4gIHZhciBhLCBiLCBjO1xuICBpZiAoeCBpbnN0YW5jZW9mIHA1LlZlY3Rvcikge1xuICAgIGEgPSB4LnggfHwgMDtcbiAgICBiID0geC55IHx8IDA7XG4gICAgYyA9IHgueiB8fCAwO1xuICB9IGVsc2UgaWYgKHggaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIGEgPSB4WzBdIHx8IDA7XG4gICAgYiA9IHhbMV0gfHwgMDtcbiAgICBjID0geFsyXSB8fCAwO1xuICB9IGVsc2Uge1xuICAgIGEgPSB4IHx8IDA7XG4gICAgYiA9IHkgfHwgMDtcbiAgICBjID0geiB8fCAwO1xuICB9XG4gIHJldHVybiB0aGlzLnggPT09IGEgJiYgdGhpcy55ID09PSBiICYmIHRoaXMueiA9PT0gYztcbn07XG5cbi8vIFN0YXRpYyBNZXRob2RzXG5cbi8qKlxuICogTWFrZSBhIG5ldyAyRCB2ZWN0b3IgZnJvbSBhbiBhbmdsZVxuICpcbiAqIEBtZXRob2QgZnJvbUFuZ2xlXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge051bWJlcn0gICAgIGFuZ2xlIHRoZSBkZXNpcmVkIGFuZ2xlLCBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge051bWJlcn0gICAgIFtsZW5ndGhdIHRoZSBsZW5ndGggb2YgdGhlIG5ldyB2ZWN0b3IgKGRlZmF1bHRzIHRvIDEpXG4gKiBAcmV0dXJuIHtwNS5WZWN0b3J9ICAgICAgIHRoZSBuZXcgcDUuVmVjdG9yIG9iamVjdFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqXG4gKiAgIC8vIENyZWF0ZSBhIHZhcmlhYmxlLCBwcm9wb3J0aW9uYWwgdG8gdGhlIG1vdXNlWCxcbiAqICAgLy8gdmFyeWluZyBmcm9tIDAtMzYwLCB0byByZXByZXNlbnQgYW4gYW5nbGUgaW4gZGVncmVlcy5cbiAqICAgYW5nbGVNb2RlKERFR1JFRVMpO1xuICogICB2YXIgbXlEZWdyZWVzID0gbWFwKG1vdXNlWCwgMCwgd2lkdGgsIDAsIDM2MCk7XG4gKlxuICogICAvLyBEaXNwbGF5IHRoYXQgdmFyaWFibGUgaW4gYW4gb25zY3JlZW4gdGV4dC5cbiAqICAgLy8gKE5vdGUgdGhlIG5mYygpIGZ1bmN0aW9uIHRvIHRydW5jYXRlIGFkZGl0aW9uYWwgZGVjaW1hbCBwbGFjZXMsXG4gKiAgIC8vIGFuZCB0aGUgXCJcXHhCMFwiIGNoYXJhY3RlciBmb3IgdGhlIGRlZ3JlZSBzeW1ib2wuKVxuICogICB2YXIgcmVhZG91dCA9ICdhbmdsZSA9ICcgKyBuZmMobXlEZWdyZWVzLCAxKSArICdcXHhCMCc7XG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIGZpbGwoMCk7XG4gKiAgIHRleHQocmVhZG91dCwgNSwgMTUpO1xuICpcbiAqICAgLy8gQ3JlYXRlIGEgcDUuVmVjdG9yIHVzaW5nIHRoZSBmcm9tQW5nbGUgZnVuY3Rpb24sXG4gKiAgIC8vIGFuZCBleHRyYWN0IGl0cyB4IGFuZCB5IGNvbXBvbmVudHMuXG4gKiAgIHZhciB2ID0gcDUuVmVjdG9yLmZyb21BbmdsZShyYWRpYW5zKG15RGVncmVlcyksIDMwKTtcbiAqICAgdmFyIHZ4ID0gdi54O1xuICogICB2YXIgdnkgPSB2Lnk7XG4gKlxuICogICBwdXNoKCk7XG4gKiAgIHRyYW5zbGF0ZSh3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICogICBub0ZpbGwoKTtcbiAqICAgc3Ryb2tlKDE1MCk7XG4gKiAgIGxpbmUoMCwgMCwgMzAsIDApO1xuICogICBzdHJva2UoMCk7XG4gKiAgIGxpbmUoMCwgMCwgdngsIHZ5KTtcbiAqICAgcG9wKCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xucDUuVmVjdG9yLmZyb21BbmdsZSA9IGZ1bmN0aW9uIGZyb21BbmdsZShhbmdsZSwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgbGVuZ3RoID09PSAndW5kZWZpbmVkJykge1xuICAgIGxlbmd0aCA9IDE7XG4gIH1cbiAgcmV0dXJuIG5ldyBwNS5WZWN0b3IobGVuZ3RoICogTWF0aC5jb3MoYW5nbGUpLCBsZW5ndGggKiBNYXRoLnNpbihhbmdsZSksIDApO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgbmV3IDNEIHZlY3RvciBmcm9tIGEgcGFpciBvZiBJU08gc3BoZXJpY2FsIGFuZ2xlc1xuICpcbiAqIEBtZXRob2QgZnJvbUFuZ2xlc1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtOdW1iZXJ9ICAgICB0aGV0YSAgICB0aGUgcG9sYXIgYW5nbGUsIGluIHJhZGlhbnMgKHplcm8gaXMgdXApXG4gKiBAcGFyYW0ge051bWJlcn0gICAgIHBoaSAgICAgIHRoZSBhemltdXRoYWwgYW5nbGUsIGluIHJhZGlhbnNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh6ZXJvIGlzIG91dCBvZiB0aGUgc2NyZWVuKVxuICogQHBhcmFtIHtOdW1iZXJ9ICAgICBbbGVuZ3RoXSB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgdmVjdG9yIChkZWZhdWx0cyB0byAxKVxuICogQHJldHVybiB7cDUuVmVjdG9yfSAgICAgICAgICB0aGUgbmV3IHA1LlZlY3RvciBvYmplY3RcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IG1vZGVybml6cj0nd2ViZ2wnPlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiAgIGZpbGwoMjU1KTtcbiAqICAgbm9TdHJva2UoKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjU1KTtcbiAqXG4gKiAgIHZhciB0ID0gbWlsbGlzKCkgLyAxMDAwO1xuICpcbiAqICAgLy8gYWRkIHRocmVlIHBvaW50IGxpZ2h0c1xuICogICBwb2ludExpZ2h0KGNvbG9yKCcjZjAwJyksIHA1LlZlY3Rvci5mcm9tQW5nbGVzKHQgKiAxLjAsIHQgKiAxLjMsIDEwMCkpO1xuICogICBwb2ludExpZ2h0KGNvbG9yKCcjMGYwJyksIHA1LlZlY3Rvci5mcm9tQW5nbGVzKHQgKiAxLjEsIHQgKiAxLjIsIDEwMCkpO1xuICogICBwb2ludExpZ2h0KGNvbG9yKCcjMDBmJyksIHA1LlZlY3Rvci5mcm9tQW5nbGVzKHQgKiAxLjIsIHQgKiAxLjEsIDEwMCkpO1xuICpcbiAqICAgc3BoZXJlKDM1KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5WZWN0b3IuZnJvbUFuZ2xlcyA9IGZ1bmN0aW9uKHRoZXRhLCBwaGksIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIGxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBsZW5ndGggPSAxO1xuICB9XG4gIHZhciBjb3NQaGkgPSBNYXRoLmNvcyhwaGkpO1xuICB2YXIgc2luUGhpID0gTWF0aC5zaW4ocGhpKTtcbiAgdmFyIGNvc1RoZXRhID0gTWF0aC5jb3ModGhldGEpO1xuICB2YXIgc2luVGhldGEgPSBNYXRoLnNpbih0aGV0YSk7XG5cbiAgcmV0dXJuIG5ldyBwNS5WZWN0b3IoXG4gICAgbGVuZ3RoICogc2luVGhldGEgKiBzaW5QaGksXG4gICAgLWxlbmd0aCAqIGNvc1RoZXRhLFxuICAgIGxlbmd0aCAqIHNpblRoZXRhICogY29zUGhpXG4gICk7XG59O1xuXG4vKipcbiAqIE1ha2UgYSBuZXcgMkQgdW5pdCB2ZWN0b3IgZnJvbSBhIHJhbmRvbSBhbmdsZVxuICpcbiAqIEBtZXRob2QgcmFuZG9tMkRcbiAqIEBzdGF0aWNcbiAqIEByZXR1cm4ge3A1LlZlY3Rvcn0gdGhlIG5ldyBwNS5WZWN0b3Igb2JqZWN0XG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cIm5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciB2ID0gcDUuVmVjdG9yLnJhbmRvbTJEKCk7XG4gKiAvLyBNYXkgbWFrZSB2J3MgYXR0cmlidXRlcyBzb21ldGhpbmcgbGlrZTpcbiAqIC8vIFswLjYxNTU0NjE3LCAtMC41MTE5NTc2NSwgMC4wXSBvclxuICogLy8gWy0wLjQ2OTU4NDEsIC0wLjE0MzY2NzMxLCAwLjBdIG9yXG4gKiAvLyBbMC42MDkxMDk3LCAtMC4yMjgwNTI3OCwgMC4wXVxuICogcHJpbnQodik7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgZnJhbWVSYXRlKDEpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjQwKTtcbiAqXG4gKiAgIHZhciB2MCA9IGNyZWF0ZVZlY3Rvcig1MCwgNTApO1xuICogICB2YXIgdjEgPSBwNS5WZWN0b3IucmFuZG9tMkQoKTtcbiAqICAgZHJhd0Fycm93KHYwLCB2MS5tdWx0KDUwKSwgJ2JsYWNrJyk7XG4gKiB9XG4gKlxuICogLy8gZHJhdyBhbiBhcnJvdyBmb3IgYSB2ZWN0b3IgYXQgYSBnaXZlbiBiYXNlIHBvc2l0aW9uXG4gKiBmdW5jdGlvbiBkcmF3QXJyb3coYmFzZSwgdmVjLCBteUNvbG9yKSB7XG4gKiAgIHB1c2goKTtcbiAqICAgc3Ryb2tlKG15Q29sb3IpO1xuICogICBzdHJva2VXZWlnaHQoMyk7XG4gKiAgIGZpbGwobXlDb2xvcik7XG4gKiAgIHRyYW5zbGF0ZShiYXNlLngsIGJhc2UueSk7XG4gKiAgIGxpbmUoMCwgMCwgdmVjLngsIHZlYy55KTtcbiAqICAgcm90YXRlKHZlYy5oZWFkaW5nKCkpO1xuICogICB2YXIgYXJyb3dTaXplID0gNztcbiAqICAgdHJhbnNsYXRlKHZlYy5tYWcoKSAtIGFycm93U2l6ZSwgMCk7XG4gKiAgIHRyaWFuZ2xlKDAsIGFycm93U2l6ZSAvIDIsIDAsIC1hcnJvd1NpemUgLyAyLCBhcnJvd1NpemUsIDApO1xuICogICBwb3AoKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5WZWN0b3IucmFuZG9tMkQgPSBmdW5jdGlvbiByYW5kb20yRCgpIHtcbiAgcmV0dXJuIHRoaXMuZnJvbUFuZ2xlKE1hdGgucmFuZG9tKCkgKiBjb25zdGFudHMuVFdPX1BJKTtcbn07XG5cbi8qKlxuICogTWFrZSBhIG5ldyByYW5kb20gM0QgdW5pdCB2ZWN0b3IuXG4gKlxuICogQG1ldGhvZCByYW5kb20zRFxuICogQHN0YXRpY1xuICogQHJldHVybiB7cDUuVmVjdG9yfSB0aGUgbmV3IHA1LlZlY3RvciBvYmplY3RcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogdmFyIHYgPSBwNS5WZWN0b3IucmFuZG9tM0QoKTtcbiAqIC8vIE1heSBtYWtlIHYncyBhdHRyaWJ1dGVzIHNvbWV0aGluZyBsaWtlOlxuICogLy8gWzAuNjE1NTQ2MTcsIC0wLjUxMTk1NzY1LCAwLjU5OTE2OF0gb3JcbiAqIC8vIFstMC40Njk1ODQxLCAtMC4xNDM2NjczMSwgLTAuODcxMTIwMl0gb3JcbiAqIC8vIFswLjYwOTEwOTcsIC0wLjIyODA1Mjc4LCAtMC43NTk1OTAyXVxuICogcHJpbnQodik7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xucDUuVmVjdG9yLnJhbmRvbTNEID0gZnVuY3Rpb24gcmFuZG9tM0QoKSB7XG4gIHZhciBhbmdsZSA9IE1hdGgucmFuZG9tKCkgKiBjb25zdGFudHMuVFdPX1BJO1xuICB2YXIgdnogPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7XG4gIHZhciB2ekJhc2UgPSBNYXRoLnNxcnQoMSAtIHZ6ICogdnopO1xuICB2YXIgdnggPSB2ekJhc2UgKiBNYXRoLmNvcyhhbmdsZSk7XG4gIHZhciB2eSA9IHZ6QmFzZSAqIE1hdGguc2luKGFuZ2xlKTtcbiAgcmV0dXJuIG5ldyBwNS5WZWN0b3IodngsIHZ5LCB2eik7XG59O1xuXG4vLyBBZGRzIHR3byB2ZWN0b3JzIHRvZ2V0aGVyIGFuZCByZXR1cm5zIGEgbmV3IG9uZS5cbi8qKlxuICogQG1ldGhvZCBhZGRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSAge3A1LlZlY3Rvcn0gdjEgYSBwNS5WZWN0b3IgdG8gYWRkXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHYyIGEgcDUuVmVjdG9yIHRvIGFkZFxuICogQHBhcmFtICB7cDUuVmVjdG9yfSB0YXJnZXQgdGhlIHZlY3RvciB0byByZWNlaXZlIHRoZSByZXN1bHRcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGFkZFxuICogQHN0YXRpY1xuICogQHBhcmFtICB7cDUuVmVjdG9yfSB2MVxuICogQHBhcmFtICB7cDUuVmVjdG9yfSB2MlxuICogQHJldHVybiB7cDUuVmVjdG9yfSB0aGUgcmVzdWx0aW5nIHA1LlZlY3RvclxuICpcbiAqL1xuXG5wNS5WZWN0b3IuYWRkID0gZnVuY3Rpb24gYWRkKHYxLCB2MiwgdGFyZ2V0KSB7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGFyZ2V0ID0gdjEuY29weSgpO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldC5zZXQodjEpO1xuICB9XG4gIHRhcmdldC5hZGQodjIpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLypcbiAqIFN1YnRyYWN0cyBvbmUgcDUuVmVjdG9yIGZyb20gYW5vdGhlciBhbmQgcmV0dXJucyBhIG5ldyBvbmUuICBUaGUgc2Vjb25kXG4gKiB2ZWN0b3IgKHYyKSBpcyBzdWJ0cmFjdGVkIGZyb20gdGhlIGZpcnN0ICh2MSksIHJlc3VsdGluZyBpbiB2MS12Mi5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIHN1YlxuICogQHN0YXRpY1xuICogQHBhcmFtICB7cDUuVmVjdG9yfSB2MSBhIHA1LlZlY3RvciB0byBzdWJ0cmFjdCBmcm9tXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHYyIGEgcDUuVmVjdG9yIHRvIHN1YnRyYWN0XG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHRhcmdldCBpZiB1bmRlZmluZWQgYSBuZXcgdmVjdG9yIHdpbGwgYmUgY3JlYXRlZFxuICovXG4vKipcbiAqIEBtZXRob2Qgc3ViXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHYxXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHYyXG4gKiBAcmV0dXJuIHtwNS5WZWN0b3J9IHRoZSByZXN1bHRpbmcgcDUuVmVjdG9yXG4gKi9cblxucDUuVmVjdG9yLnN1YiA9IGZ1bmN0aW9uIHN1Yih2MSwgdjIsIHRhcmdldCkge1xuICBpZiAoIXRhcmdldCkge1xuICAgIHRhcmdldCA9IHYxLmNvcHkoKTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuc2V0KHYxKTtcbiAgfVxuICB0YXJnZXQuc3ViKHYyKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyBhIHZlY3RvciBieSBhIHNjYWxhciBhbmQgcmV0dXJucyBhIG5ldyB2ZWN0b3IuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBtdWx0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHYgdGhlIHZlY3RvciB0byBtdWx0aXBseVxuICogQHBhcmFtICB7TnVtYmVyfSAgblxuICogQHBhcmFtICB7cDUuVmVjdG9yfSB0YXJnZXQgaWYgdW5kZWZpbmVkIGEgbmV3IHZlY3RvciB3aWxsIGJlIGNyZWF0ZWRcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIG11bHRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSAge3A1LlZlY3Rvcn0gdlxuICogQHBhcmFtICB7TnVtYmVyfSAgblxuICogQHJldHVybiB7cDUuVmVjdG9yfSAgdGhlIHJlc3VsdGluZyBuZXcgcDUuVmVjdG9yXG4gKi9cbnA1LlZlY3Rvci5tdWx0ID0gZnVuY3Rpb24gbXVsdCh2LCBuLCB0YXJnZXQpIHtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0YXJnZXQgPSB2LmNvcHkoKTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuc2V0KHYpO1xuICB9XG4gIHRhcmdldC5tdWx0KG4pO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiBEaXZpZGVzIGEgdmVjdG9yIGJ5IGEgc2NhbGFyIGFuZCByZXR1cm5zIGEgbmV3IHZlY3Rvci5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGRpdlxuICogQHN0YXRpY1xuICogQHBhcmFtICB7cDUuVmVjdG9yfSB2IHRoZSB2ZWN0b3IgdG8gZGl2aWRlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICBuXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHRhcmdldCBpZiB1bmRlZmluZWQgYSBuZXcgdmVjdG9yIHdpbGwgYmUgY3JlYXRlZFxuICovXG4vKipcbiAqIEBtZXRob2QgZGl2XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHZcbiAqIEBwYXJhbSAge051bWJlcn0gIG5cbiAqIEByZXR1cm4ge3A1LlZlY3Rvcn0gdGhlIHJlc3VsdGluZyBuZXcgcDUuVmVjdG9yXG4gKi9cbnA1LlZlY3Rvci5kaXYgPSBmdW5jdGlvbiBkaXYodiwgbiwgdGFyZ2V0KSB7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGFyZ2V0ID0gdi5jb3B5KCk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LnNldCh2KTtcbiAgfVxuICB0YXJnZXQuZGl2KG4pO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9ycy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGRvdFxuICogQHN0YXRpY1xuICogQHBhcmFtICB7cDUuVmVjdG9yfSB2MSB0aGUgZmlyc3QgcDUuVmVjdG9yXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHYyIHRoZSBzZWNvbmQgcDUuVmVjdG9yXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICB0aGUgZG90IHByb2R1Y3RcbiAqL1xucDUuVmVjdG9yLmRvdCA9IGZ1bmN0aW9uIGRvdCh2MSwgdjIpIHtcbiAgcmV0dXJuIHYxLmRvdCh2Mik7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBjcm9zc1xuICogQHN0YXRpY1xuICogQHBhcmFtICB7cDUuVmVjdG9yfSB2MSB0aGUgZmlyc3QgcDUuVmVjdG9yXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHYyIHRoZSBzZWNvbmQgcDUuVmVjdG9yXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICB0aGUgY3Jvc3MgcHJvZHVjdFxuICovXG5wNS5WZWN0b3IuY3Jvc3MgPSBmdW5jdGlvbiBjcm9zcyh2MSwgdjIpIHtcbiAgcmV0dXJuIHYxLmNyb3NzKHYyKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cyAoY29uc2lkZXJpbmcgYVxuICogcG9pbnQgYXMgYSB2ZWN0b3Igb2JqZWN0KS5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGRpc3RcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSAge3A1LlZlY3Rvcn0gdjEgdGhlIGZpcnN0IHA1LlZlY3RvclxuICogQHBhcmFtICB7cDUuVmVjdG9yfSB2MiB0aGUgc2Vjb25kIHA1LlZlY3RvclxuICogQHJldHVybiB7TnVtYmVyfSAgICAgdGhlIGRpc3RhbmNlXG4gKi9cbnA1LlZlY3Rvci5kaXN0ID0gZnVuY3Rpb24gZGlzdCh2MSwgdjIpIHtcbiAgcmV0dXJuIHYxLmRpc3QodjIpO1xufTtcblxuLyoqXG4gKiBMaW5lYXIgaW50ZXJwb2xhdGUgYSB2ZWN0b3IgdG8gYW5vdGhlciB2ZWN0b3IgYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGFcbiAqIG5ldyB2ZWN0b3IuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBsZXJwXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3A1LlZlY3Rvcn0gdjFcbiAqIEBwYXJhbSB7cDUuVmVjdG9yfSB2MlxuICogQHBhcmFtIHtOdW1iZXJ9IGFtdFxuICogQHBhcmFtIHtwNS5WZWN0b3J9IHRhcmdldCBpZiB1bmRlZmluZWQgYSBuZXcgdmVjdG9yIHdpbGwgYmUgY3JlYXRlZFxuICovXG4vKipcbiAqIEBtZXRob2QgbGVycFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtwNS5WZWN0b3J9IHYxXG4gKiBAcGFyYW0ge3A1LlZlY3Rvcn0gdjJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhbXRcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICB0aGUgbGVycGVkIHZhbHVlXG4gKi9cbnA1LlZlY3Rvci5sZXJwID0gZnVuY3Rpb24gbGVycCh2MSwgdjIsIGFtdCwgdGFyZ2V0KSB7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGFyZ2V0ID0gdjEuY29weSgpO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldC5zZXQodjEpO1xuICB9XG4gIHRhcmdldC5sZXJwKHYyLCBhbXQpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIG1hZ1xuICogQHBhcmFtIHtwNS5WZWN0b3J9IHZlY1QgdGhlIHZlY3RvciB0byByZXR1cm4gdGhlIG1hZ25pdHVkZSBvZlxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgdGhlIG1hZ25pdHVkZSBvZiB2ZWNUXG4gKiBAc3RhdGljXG4gKi9cbnA1LlZlY3Rvci5tYWcgPSBmdW5jdGlvbiBtYWcodmVjVCkge1xuICB2YXIgeCA9IHZlY1QueCxcbiAgICB5ID0gdmVjVC55LFxuICAgIHogPSB2ZWNULno7XG4gIHZhciBtYWdTcSA9IHggKiB4ICsgeSAqIHkgKyB6ICogejtcbiAgcmV0dXJuIE1hdGguc3FydChtYWdTcSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1LlZlY3RvcjtcblxufSx7XCIuLi9jb3JlL2NvbnN0YW50c1wiOjIxLFwiLi4vY29yZS9jb3JlXCI6MjJ9XSw1NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgTWF0aFxuICogQHN1Ym1vZHVsZSBSYW5kb21cbiAqIEBmb3IgcDVcbiAqIEByZXF1aXJlcyBjb3JlXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuLi9jb3JlL2NvcmUnKTtcblxudmFyIHNlZWRlZCA9IGZhbHNlO1xudmFyIHByZXZpb3VzID0gZmFsc2U7XG52YXIgeTIgPSAwO1xuXG4vLyBMaW5lYXIgQ29uZ3J1ZW50aWFsIEdlbmVyYXRvclxuLy8gVmFyaWFudCBvZiBhIExlaG1hbiBHZW5lcmF0b3JcbnZhciBsY2cgPSAoZnVuY3Rpb24oKSB7XG4gIC8vIFNldCB0byB2YWx1ZXMgZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL051bWVyaWNhbF9SZWNpcGVzXG4gIC8vIG0gaXMgYmFzaWNhbGx5IGNob3NlbiB0byBiZSBsYXJnZSAoYXMgaXQgaXMgdGhlIG1heCBwZXJpb2QpXG4gIC8vIGFuZCBmb3IgaXRzIHJlbGF0aW9uc2hpcHMgdG8gYSBhbmQgY1xuICB2YXIgbSA9IDQyOTQ5NjcyOTYsXG4gICAgLy8gYSAtIDEgc2hvdWxkIGJlIGRpdmlzaWJsZSBieSBtJ3MgcHJpbWUgZmFjdG9yc1xuICAgIGEgPSAxNjY0NTI1LFxuICAgIC8vIGMgYW5kIG0gc2hvdWxkIGJlIGNvLXByaW1lXG4gICAgYyA9IDEwMTM5MDQyMjMsXG4gICAgc2VlZCxcbiAgICB6O1xuICByZXR1cm4ge1xuICAgIHNldFNlZWQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgLy8gcGljayBhIHJhbmRvbSBzZWVkIGlmIHZhbCBpcyB1bmRlZmluZWQgb3IgbnVsbFxuICAgICAgLy8gdGhlID4+PiAwIGNhc3RzIHRoZSBzZWVkIHRvIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyXG4gICAgICB6ID0gc2VlZCA9ICh2YWwgPT0gbnVsbCA/IE1hdGgucmFuZG9tKCkgKiBtIDogdmFsKSA+Pj4gMDtcbiAgICB9LFxuICAgIGdldFNlZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlZWQ7XG4gICAgfSxcbiAgICByYW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIGRlZmluZSB0aGUgcmVjdXJyZW5jZSByZWxhdGlvbnNoaXBcbiAgICAgIHogPSAoYSAqIHogKyBjKSAlIG07XG4gICAgICAvLyByZXR1cm4gYSBmbG9hdCBpbiBbMCwgMSlcbiAgICAgIC8vIGlmIHogPSBtIHRoZW4geiAvIG0gPSAwIHRoZXJlZm9yZSAoeiAlIG0pIC8gbSA8IDEgYWx3YXlzXG4gICAgICByZXR1cm4geiAvIG07XG4gICAgfVxuICB9O1xufSkoKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzZWVkIHZhbHVlIGZvciByYW5kb20oKS5cbiAqXG4gKiBCeSBkZWZhdWx0LCByYW5kb20oKSBwcm9kdWNlcyBkaWZmZXJlbnQgcmVzdWx0cyBlYWNoIHRpbWUgdGhlIHByb2dyYW1cbiAqIGlzIHJ1bi4gU2V0IHRoZSBzZWVkIHBhcmFtZXRlciB0byBhIGNvbnN0YW50IHRvIHJldHVybiB0aGUgc2FtZVxuICogcHNldWRvLXJhbmRvbSBudW1iZXJzIGVhY2ggdGltZSB0aGUgc29mdHdhcmUgaXMgcnVuLlxuICpcbiAqIEBtZXRob2QgcmFuZG9tU2VlZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNlZWQgICB0aGUgc2VlZCB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHJhbmRvbVNlZWQoOTkpO1xuICogZm9yICh2YXIgaSA9IDA7IGkgPCAxMDA7IGkrKykge1xuICogICB2YXIgciA9IHJhbmRvbSgwLCAyNTUpO1xuICogICBzdHJva2Uocik7XG4gKiAgIGxpbmUoaSwgMCwgaSwgMTAwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIG1hbnkgdmVydGljYWwgbGluZXMgZHJhd24gaW4gd2hpdGUsIGJsYWNrIG9yIGdyZXkuXG4gKlxuICovXG5wNS5wcm90b3R5cGUucmFuZG9tU2VlZCA9IGZ1bmN0aW9uKHNlZWQpIHtcbiAgbGNnLnNldFNlZWQoc2VlZCk7XG4gIHNlZWRlZCA9IHRydWU7XG4gIHByZXZpb3VzID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIHJhbmRvbSBmbG9hdGluZy1wb2ludCBudW1iZXIuXG4gKlxuICogVGFrZXMgZWl0aGVyIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gKlxuICogSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybnMgYSByYW5kb20gbnVtYmVyIGZyb20gMFxuICogdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSAxLlxuICpcbiAqIElmIG9uZSBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQgaXMgYSBudW1iZXIsIHJldHVybnMgYSByYW5kb20gbnVtYmVyIGZyb20gMFxuICogdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgbnVtYmVyLlxuICpcbiAqIElmIG9uZSBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQgaXMgYW4gYXJyYXksIHJldHVybnMgYSByYW5kb20gZWxlbWVudCBmcm9tXG4gKiB0aGF0IGFycmF5LlxuICpcbiAqIElmIHR3byBhcmd1bWVudHMgYXJlIGdpdmVuLCByZXR1cm5zIGEgcmFuZG9tIG51bWJlciBmcm9tIHRoZVxuICogZmlyc3QgYXJndW1lbnQgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICpcbiAqIEBtZXRob2QgcmFuZG9tXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFttaW5dICAgdGhlIGxvd2VyIGJvdW5kIChpbmNsdXNpdmUpXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFttYXhdICAgdGhlIHVwcGVyIGJvdW5kIChleGNsdXNpdmUpXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSByYW5kb20gbnVtYmVyXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZm9yICh2YXIgaSA9IDA7IGkgPCAxMDA7IGkrKykge1xuICogICB2YXIgciA9IHJhbmRvbSg1MCk7XG4gKiAgIHN0cm9rZShyICogNSk7XG4gKiAgIGxpbmUoNTAsIGksIDUwICsgciwgaSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyBpKyspIHtcbiAqICAgdmFyIHIgPSByYW5kb20oLTUwLCA1MCk7XG4gKiAgIGxpbmUoNTAsIGksIDUwICsgciwgaSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIEdldCBhIHJhbmRvbSBlbGVtZW50IGZyb20gYW4gYXJyYXkgdXNpbmcgdGhlIHJhbmRvbShBcnJheSkgc3ludGF4XG4gKiB2YXIgd29yZHMgPSBbJ2FwcGxlJywgJ2JlYXInLCAnY2F0JywgJ2RvZyddO1xuICogdmFyIHdvcmQgPSByYW5kb20od29yZHMpOyAvLyBzZWxlY3QgcmFuZG9tIHdvcmRcbiAqIHRleHQod29yZCwgMTAsIDUwKTsgLy8gZHJhdyB0aGUgd29yZFxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogMTAwIGhvcml6b250YWwgbGluZXMgZnJvbSBjZW50ZXIgY2FudmFzIHRvIHJpZ2h0LiBzaXplK2ZpbGwgY2hhbmdlIGVhY2ggdGltZVxuICogMTAwIGhvcml6b250YWwgbGluZXMgZnJvbSBjZW50ZXIgb2YgY2FudmFzLiBoZWlnaHQgJiBzaWRlIGNoYW5nZSBlYWNoIHJlbmRlclxuICogd29yZCBkaXNwbGF5ZWQgYXQgcmFuZG9tLiBFaXRoZXIgYXBwbGUsIGJlYXIsIGNhdCwgb3IgZG9nXG4gKlxuICovXG4vKipcbiAqIEBtZXRob2QgcmFuZG9tXG4gKiBAcGFyYW0gIHtBcnJheX0gY2hvaWNlcyAgIHRoZSBhcnJheSB0byBjaG9vc2UgZnJvbVxuICogQHJldHVybiB7Kn0gdGhlIHJhbmRvbSBlbGVtZW50IGZyb20gdGhlIGFycmF5XG4gKiBAZXhhbXBsZVxuICovXG5wNS5wcm90b3R5cGUucmFuZG9tID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgdmFyIHJhbmQ7XG5cbiAgaWYgKHNlZWRlZCkge1xuICAgIHJhbmQgPSBsY2cucmFuZCgpO1xuICB9IGVsc2Uge1xuICAgIHJhbmQgPSBNYXRoLnJhbmRvbSgpO1xuICB9XG4gIGlmICh0eXBlb2YgbWluID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiByYW5kO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtYXggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG1pbiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gbWluW01hdGguZmxvb3IocmFuZCAqIG1pbi5sZW5ndGgpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJhbmQgKiBtaW47XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChtaW4gPiBtYXgpIHtcbiAgICAgIHZhciB0bXAgPSBtaW47XG4gICAgICBtaW4gPSBtYXg7XG4gICAgICBtYXggPSB0bXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmQgKiAobWF4IC0gbWluKSArIG1pbjtcbiAgfVxufTtcblxuLyoqXG4gKlxuICogUmV0dXJucyBhIHJhbmRvbSBudW1iZXIgZml0dGluZyBhIEdhdXNzaWFuLCBvclxuICogbm9ybWFsLCBkaXN0cmlidXRpb24uIFRoZXJlIGlzIHRoZW9yZXRpY2FsbHkgbm8gbWluaW11bSBvciBtYXhpbXVtXG4gKiB2YWx1ZSB0aGF0IHJhbmRvbUdhdXNzaWFuKCkgbWlnaHQgcmV0dXJuLiBSYXRoZXIsIHRoZXJlIGlzXG4gKiBqdXN0IGEgdmVyeSBsb3cgcHJvYmFiaWxpdHkgdGhhdCB2YWx1ZXMgZmFyIGZyb20gdGhlIG1lYW4gd2lsbCBiZVxuICogcmV0dXJuZWQ7IGFuZCBhIGhpZ2hlciBwcm9iYWJpbGl0eSB0aGF0IG51bWJlcnMgbmVhciB0aGUgbWVhbiB3aWxsXG4gKiBiZSByZXR1cm5lZC5cbiAqIDxicj48YnI+XG4gKiBUYWtlcyBlaXRoZXIgMCwgMSBvciAyIGFyZ3VtZW50cy48YnI+XG4gKiBJZiBubyBhcmdzLCByZXR1cm5zIGEgbWVhbiBvZiAwIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMS48YnI+XG4gKiBJZiBvbmUgYXJnLCB0aGF0IGFyZyBpcyB0aGUgbWVhbiAoc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDEpLjxicj5cbiAqIElmIHR3byBhcmdzLCBmaXJzdCBpcyBtZWFuLCBzZWNvbmQgaXMgc3RhbmRhcmQgZGV2aWF0aW9uLlxuICpcbiAqIEBtZXRob2QgcmFuZG9tR2F1c3NpYW5cbiAqIEBwYXJhbSAge051bWJlcn0gbWVhbiAgdGhlIG1lYW5cbiAqIEBwYXJhbSAge051bWJlcn0gc2QgICAgdGhlIHN0YW5kYXJkIGRldmlhdGlvblxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgcmFuZG9tIG51bWJlclxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZvciAodmFyIHkgPSAwOyB5IDwgMTAwOyB5KyspIHtcbiAqICAgdmFyIHggPSByYW5kb21HYXVzc2lhbig1MCwgMTUpO1xuICogICBsaW5lKDUwLCB5LCB4LCB5KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGRpc3RyaWJ1dGlvbiA9IG5ldyBBcnJheSgzNjApO1xuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDApO1xuICogICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3RyaWJ1dGlvbi5sZW5ndGg7IGkrKykge1xuICogICAgIGRpc3RyaWJ1dGlvbltpXSA9IGZsb29yKHJhbmRvbUdhdXNzaWFuKDAsIDE1KSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwNCk7XG4gKlxuICogICB0cmFuc2xhdGUod2lkdGggLyAyLCB3aWR0aCAvIDIpO1xuICpcbiAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXN0cmlidXRpb24ubGVuZ3RoOyBpKyspIHtcbiAqICAgICByb3RhdGUoVFdPX1BJIC8gZGlzdHJpYnV0aW9uLmxlbmd0aCk7XG4gKiAgICAgc3Ryb2tlKDApO1xuICogICAgIHZhciBkaXN0ID0gYWJzKGRpc3RyaWJ1dGlvbltpXSk7XG4gKiAgICAgbGluZSgwLCAwLCBkaXN0LCAwKTtcbiAqICAgfVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiBAYWx0XG4gKiAxMDAgaG9yaXpvbnRhbCBsaW5lcyBmcm9tIGNlbnRlciBvZiBjYW52YXMuIGhlaWdodCAmIHNpZGUgY2hhbmdlIGVhY2ggcmVuZGVyXG4gKiBibGFjayBsaW5lcyByYWRpYXRlIGZyb20gY2VudGVyIG9mIGNhbnZhcy4gc2l6ZSBkZXRlcm1pbmVkIGVhY2ggcmVuZGVyXG4gKi9cbnA1LnByb3RvdHlwZS5yYW5kb21HYXVzc2lhbiA9IGZ1bmN0aW9uKG1lYW4sIHNkKSB7XG4gIHZhciB5MSwgeDEsIHgyLCB3O1xuICBpZiAocHJldmlvdXMpIHtcbiAgICB5MSA9IHkyO1xuICAgIHByZXZpb3VzID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgeDEgPSB0aGlzLnJhbmRvbSgyKSAtIDE7XG4gICAgICB4MiA9IHRoaXMucmFuZG9tKDIpIC0gMTtcbiAgICAgIHcgPSB4MSAqIHgxICsgeDIgKiB4MjtcbiAgICB9IHdoaWxlICh3ID49IDEpO1xuICAgIHcgPSBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyh3KSAvIHcpO1xuICAgIHkxID0geDEgKiB3O1xuICAgIHkyID0geDIgKiB3O1xuICAgIHByZXZpb3VzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBtID0gbWVhbiB8fCAwO1xuICB2YXIgcyA9IHNkIHx8IDE7XG4gIHJldHVybiB5MSAqIHMgKyBtO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNTtcblxufSx7XCIuLi9jb3JlL2NvcmVcIjoyMn1dLDU1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBNYXRoXG4gKiBAc3VibW9kdWxlIFRyaWdvbm9tZXRyeVxuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqIEByZXF1aXJlcyBjb25zdGFudHNcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xudmFyIGNvbnN0YW50cyA9IF9kZXJlcV8oJy4uL2NvcmUvY29uc3RhbnRzJyk7XG5cbi8qXG4gKiBhbGwgREVHUkVFUy9SQURJQU5TIGNvbnZlcnNpb24gc2hvdWxkIGJlIGRvbmUgaW4gdGhlIHA1IGluc3RhbmNlXG4gKiBpZiBwb3NzaWJsZSwgdXNpbmcgdGhlIHA1Ll90b1JhZGlhbnMoKSwgcDUuX2Zyb21SYWRpYW5zKCkgbWV0aG9kcy5cbiAqL1xucDUucHJvdG90eXBlLl9hbmdsZU1vZGUgPSBjb25zdGFudHMuUkFESUFOUztcblxuLyoqXG4gKiBUaGUgaW52ZXJzZSBvZiBjb3MoKSwgcmV0dXJucyB0aGUgYXJjIGNvc2luZSBvZiBhIHZhbHVlLiBUaGlzIGZ1bmN0aW9uXG4gKiBleHBlY3RzIHRoZSB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIC0xIHRvIDEgYW5kIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW5cbiAqIHRoZSByYW5nZSAwIHRvIFBJICgzLjE0MTU5MjcpLlxuICpcbiAqIEBtZXRob2QgYWNvc1xuICogQHBhcmFtICB7TnVtYmVyfSB2YWx1ZSB0aGUgdmFsdWUgd2hvc2UgYXJjIGNvc2luZSBpcyB0byBiZSByZXR1cm5lZFxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICB0aGUgYXJjIGNvc2luZSBvZiB0aGUgZ2l2ZW4gdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0g4oCcbm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogdmFyIGEgPSBQSTtcbiAqIHZhciBjID0gY29zKGEpO1xuICogdmFyIGFjID0gYWNvcyhjKTtcbiAqIC8vIFByaW50czogXCIzLjE0MTU5MjcgOiAtMS4wIDogMy4xNDE1OTI3XCJcbiAqIHByaW50KGEgKyAnIDogJyArIGMgKyAnIDogJyArIGFjKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9IOKAnG5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciBhID0gUEkgKyBQSSAvIDQuMDtcbiAqIHZhciBjID0gY29zKGEpO1xuICogdmFyIGFjID0gYWNvcyhjKTtcbiAqIC8vIFByaW50czogXCIzLjkyNjk5MSA6IC0wLjcwNzEwNjY1IDogMi4zNTYxOTQzXCJcbiAqIHByaW50KGEgKyAnIDogJyArIGMgKyAnIDogJyArIGFjKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUuYWNvcyA9IGZ1bmN0aW9uKHJhdGlvKSB7XG4gIHJldHVybiB0aGlzLl9mcm9tUmFkaWFucyhNYXRoLmFjb3MocmF0aW8pKTtcbn07XG5cbi8qKlxuICogVGhlIGludmVyc2Ugb2Ygc2luKCksIHJldHVybnMgdGhlIGFyYyBzaW5lIG9mIGEgdmFsdWUuIFRoaXMgZnVuY3Rpb25cbiAqIGV4cGVjdHMgdGhlIHZhbHVlcyBpbiB0aGUgcmFuZ2Ugb2YgLTEgdG8gMSBhbmQgdmFsdWVzIGFyZSByZXR1cm5lZFxuICogaW4gdGhlIHJhbmdlIC1QSS8yIHRvIFBJLzIuXG4gKlxuICogQG1ldGhvZCBhc2luXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHZhbHVlIHRoZSB2YWx1ZSB3aG9zZSBhcmMgc2luZSBpcyB0byBiZSByZXR1cm5lZFxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICB0aGUgYXJjIHNpbmUgb2YgdGhlIGdpdmVuIHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9IOKAnG5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciBhID0gUEkgKyBQSSAvIDM7XG4gKiB2YXIgcyA9IHNpbihhKTtcbiAqIHZhciBhcyA9IGFzaW4ocyk7XG4gKiAvLyBQcmludHM6IFwiMS4wNDcxOTc2IDogMC44NjYwMjU0NSA6IDEuMDQ3MTk3NlwiXG4gKiBwcmludChhICsgJyA6ICcgKyBzICsgJyA6ICcgKyBhcyk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPSDigJxub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgYSA9IFBJICsgUEkgLyAzLjA7XG4gKiB2YXIgcyA9IHNpbihhKTtcbiAqIHZhciBhcyA9IGFzaW4ocyk7XG4gKiAvLyBQcmludHM6IFwiNC4xODg3OTAzIDogLTAuODY2MDI1NDUgOiAtMS4wNDcxOTc2XCJcbiAqIHByaW50KGEgKyAnIDogJyArIHMgKyAnIDogJyArIGFzKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqL1xucDUucHJvdG90eXBlLmFzaW4gPSBmdW5jdGlvbihyYXRpbykge1xuICByZXR1cm4gdGhpcy5fZnJvbVJhZGlhbnMoTWF0aC5hc2luKHJhdGlvKSk7XG59O1xuXG4vKipcbiAqIFRoZSBpbnZlcnNlIG9mIHRhbigpLCByZXR1cm5zIHRoZSBhcmMgdGFuZ2VudCBvZiBhIHZhbHVlLiBUaGlzIGZ1bmN0aW9uXG4gKiBleHBlY3RzIHRoZSB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIC1JbmZpbml0eSB0byBJbmZpbml0eSAoZXhjbHVzaXZlKSBhbmRcbiAqIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gdGhlIHJhbmdlIC1QSS8yIHRvIFBJLzIuXG4gKlxuICogQG1ldGhvZCBhdGFuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHZhbHVlIHRoZSB2YWx1ZSB3aG9zZSBhcmMgdGFuZ2VudCBpcyB0byBiZSByZXR1cm5lZFxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICB0aGUgYXJjIHRhbmdlbnQgb2YgdGhlIGdpdmVuIHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9IOKAnG5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciBhID0gUEkgKyBQSSAvIDM7XG4gKiB2YXIgdCA9IHRhbihhKTtcbiAqIHZhciBhdCA9IGF0YW4odCk7XG4gKiAvLyBQcmludHM6IFwiMS4wNDcxOTc2IDogMS43MzIwNTA5IDogMS4wNDcxOTc2XCJcbiAqIHByaW50KGEgKyAnIDogJyArIHQgKyAnIDogJyArIGF0KTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9IOKAnG5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciBhID0gUEkgKyBQSSAvIDMuMDtcbiAqIHZhciB0ID0gdGFuKGEpO1xuICogdmFyIGF0ID0gYXRhbih0KTtcbiAqIC8vIFByaW50czogXCI0LjE4ODc5MDMgOiAxLjczMjA1MTMgOiAxLjA0NzE5NzdcIlxuICogcHJpbnQoYSArICcgOiAnICsgdCArICcgOiAnICsgYXQpO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICovXG5wNS5wcm90b3R5cGUuYXRhbiA9IGZ1bmN0aW9uKHJhdGlvKSB7XG4gIHJldHVybiB0aGlzLl9mcm9tUmFkaWFucyhNYXRoLmF0YW4ocmF0aW8pKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYW5nbGUgKGluIHJhZGlhbnMpIGZyb20gYSBzcGVjaWZpZWQgcG9pbnQgdG8gdGhlIGNvb3JkaW5hdGVcbiAqIG9yaWdpbiBhcyBtZWFzdXJlZCBmcm9tIHRoZSBwb3NpdGl2ZSB4LWF4aXMuIFZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgYVxuICogZmxvYXQgaW4gdGhlIHJhbmdlIGZyb20gUEkgdG8gLVBJLiBUaGUgYXRhbjIoKSBmdW5jdGlvbiBpcyBtb3N0IG9mdGVuIHVzZWRcbiAqIGZvciBvcmllbnRpbmcgZ2VvbWV0cnkgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuXG4gKiA8YnI+PGJyPlxuICogTm90ZTogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgaXMgdGhlIGZpcnN0IHBhcmFtZXRlciwgYW5kIHRoZVxuICogeC1jb29yZGluYXRlIGlzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLCBkdWUgdGhlIHRoZSBzdHJ1Y3R1cmUgb2YgY2FsY3VsYXRpbmdcbiAqIHRoZSB0YW5nZW50LlxuICpcbiAqIEBtZXRob2QgYXRhbjJcbiAqIEBwYXJhbSAge051bWJlcn0geSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggeC1jb29yZGluYXRlIG9mIHRoZSBwb2ludFxuICogQHJldHVybiB7TnVtYmVyfSAgIHRoZSBhcmMgdGFuZ2VudCBvZiB0aGUgZ2l2ZW4gcG9pbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDQpO1xuICogICB0cmFuc2xhdGUod2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAqICAgdmFyIGEgPSBhdGFuMihtb3VzZVkgLSBoZWlnaHQgLyAyLCBtb3VzZVggLSB3aWR0aCAvIDIpO1xuICogICByb3RhdGUoYSk7XG4gKiAgIHJlY3QoLTMwLCAtNSwgNjAsIDEwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDYwIGJ5IDEwIHJlY3QgYXQgY2VudGVyIG9mIGNhbnZhcyByb3RhdGVzIHdpdGggbW91c2UgbW92ZW1lbnRzXG4gKlxuICovXG5wNS5wcm90b3R5cGUuYXRhbjIgPSBmdW5jdGlvbih5LCB4KSB7XG4gIHJldHVybiB0aGlzLl9mcm9tUmFkaWFucyhNYXRoLmF0YW4yKHksIHgpKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY29zaW5lIG9mIGFuIGFuZ2xlLiBUaGlzIGZ1bmN0aW9uIHRha2VzIGludG8gYWNjb3VudCB0aGVcbiAqIGN1cnJlbnQgYW5nbGVNb2RlLiBWYWx1ZXMgYXJlIHJldHVybmVkIGluIHRoZSByYW5nZSAtMSB0byAxLlxuICpcbiAqIEBtZXRob2QgY29zXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGFuZ2xlIHRoZSBhbmdsZVxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICB0aGUgY29zaW5lIG9mIHRoZSBhbmdsZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYSA9IDAuMDtcbiAqIHZhciBpbmMgPSBUV09fUEkgLyAyNS4wO1xuICogZm9yICh2YXIgaSA9IDA7IGkgPCAyNTsgaSsrKSB7XG4gKiAgIGxpbmUoaSAqIDQsIDUwLCBpICogNCwgNTAgKyBjb3MoYSkgKiA0MC4wKTtcbiAqICAgYSA9IGEgKyBpbmM7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiB2ZXJ0aWNhbCBibGFjayBsaW5lcyBmb3JtIHdhdmUgcGF0dGVybnMsIGV4dGVuZC1kb3duIG9uIGxlZnQgYW5kIHJpZ2h0IHNpZGVcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5jb3MgPSBmdW5jdGlvbihhbmdsZSkge1xuICByZXR1cm4gTWF0aC5jb3ModGhpcy5fdG9SYWRpYW5zKGFuZ2xlKSk7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNpbmUgb2YgYW4gYW5nbGUuIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW50byBhY2NvdW50IHRoZVxuICogY3VycmVudCBhbmdsZU1vZGUuIFZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gdGhlIHJhbmdlIC0xIHRvIDEuXG4gKlxuICogQG1ldGhvZCBzaW5cbiAqIEBwYXJhbSAge051bWJlcn0gYW5nbGUgdGhlIGFuZ2xlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgIHRoZSBzaW5lIG9mIHRoZSBhbmdsZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYSA9IDAuMDtcbiAqIHZhciBpbmMgPSBUV09fUEkgLyAyNS4wO1xuICogZm9yICh2YXIgaSA9IDA7IGkgPCAyNTsgaSsrKSB7XG4gKiAgIGxpbmUoaSAqIDQsIDUwLCBpICogNCwgNTAgKyBzaW4oYSkgKiA0MC4wKTtcbiAqICAgYSA9IGEgKyBpbmM7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiB2ZXJ0aWNhbCBibGFjayBsaW5lcyBleHRlbmQgZG93biBhbmQgdXAgZnJvbSBjZW50ZXIgdG8gZm9ybSB3YXZlIHBhdHRlcm5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5zaW4gPSBmdW5jdGlvbihhbmdsZSkge1xuICByZXR1cm4gTWF0aC5zaW4odGhpcy5fdG9SYWRpYW5zKGFuZ2xlKSk7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHRhbmdlbnQgb2YgYW4gYW5nbGUuIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW50byBhY2NvdW50XG4gKiB0aGUgY3VycmVudCBhbmdsZU1vZGUuIFZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gdGhlIHJhbmdlIC0xIHRvIDEuXG4gKlxuICogQG1ldGhvZCB0YW5cbiAqIEBwYXJhbSAge051bWJlcn0gYW5nbGUgdGhlIGFuZ2xlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgIHRoZSB0YW5nZW50IG9mIHRoZSBhbmdsZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYSA9IDAuMDtcbiAqIHZhciBpbmMgPSBUV09fUEkgLyA1MC4wO1xuICogZm9yICh2YXIgaSA9IDA7IGkgPCAxMDA7IGkgPSBpICsgMikge1xuICogICBsaW5lKGksIDUwLCBpLCA1MCArIHRhbihhKSAqIDIuMCk7XG4gKiAgIGEgPSBhICsgaW5jO1xuICogfVxuICogPC9jb2RlPlxuICpcbiAqXG4gKiBAYWx0XG4gKiB2ZXJ0aWNhbCBibGFjayBsaW5lcyBlbmQgZG93biBhbmQgdXAgZnJvbSBjZW50ZXIgdG8gZm9ybSBzcGlrZSBwYXR0ZXJuXG4gKlxuICovXG5wNS5wcm90b3R5cGUudGFuID0gZnVuY3Rpb24oYW5nbGUpIHtcbiAgcmV0dXJuIE1hdGgudGFuKHRoaXMuX3RvUmFkaWFucyhhbmdsZSkpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHJhZGlhbiBtZWFzdXJlbWVudCB0byBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBkZWdyZWVzLlxuICogUmFkaWFucyBhbmQgZGVncmVlcyBhcmUgdHdvIHdheXMgb2YgbWVhc3VyaW5nIHRoZSBzYW1lIHRoaW5nLiBUaGVyZSBhcmVcbiAqIDM2MCBkZWdyZWVzIGluIGEgY2lyY2xlIGFuZCAyKlBJIHJhZGlhbnMgaW4gYSBjaXJjbGUuIEZvciBleGFtcGxlLFxuICogOTDCsCA9IFBJLzIgPSAxLjU3MDc5NjQuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlXG4gKiBjdXJyZW50IGFuZ2xlTW9kZS5cbiAqXG4gKiBAbWV0aG9kIGRlZ3JlZXNcbiAqIEBwYXJhbSAge051bWJlcn0gcmFkaWFucyB0aGUgcmFkaWFucyB2YWx1ZSB0byBjb252ZXJ0IHRvIGRlZ3JlZXNcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgICB0aGUgY29udmVydGVkIGFuZ2xlXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSDigJxub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgcmFkID0gUEkgLyA0O1xuICogdmFyIGRlZyA9IGRlZ3JlZXMocmFkKTtcbiAqIHByaW50KHJhZCArICcgcmFkaWFucyBpcyAnICsgZGVnICsgJyBkZWdyZWVzJyk7XG4gKiAvLyBQcmludHM6IDAuNzg1Mzk4MTYzMzk3NDQ4MyByYWRpYW5zIGlzIDQ1IGRlZ3JlZXNcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqL1xucDUucHJvdG90eXBlLmRlZ3JlZXMgPSBmdW5jdGlvbihhbmdsZSkge1xuICByZXR1cm4gYW5nbGUgKiBjb25zdGFudHMuUkFEX1RPX0RFRztcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBkZWdyZWUgbWVhc3VyZW1lbnQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gcmFkaWFucy5cbiAqIFJhZGlhbnMgYW5kIGRlZ3JlZXMgYXJlIHR3byB3YXlzIG9mIG1lYXN1cmluZyB0aGUgc2FtZSB0aGluZy4gVGhlcmUgYXJlXG4gKiAzNjAgZGVncmVlcyBpbiBhIGNpcmNsZSBhbmQgMipQSSByYWRpYW5zIGluIGEgY2lyY2xlLiBGb3IgZXhhbXBsZSxcbiAqIDkwwrAgPSBQSS8yID0gMS41NzA3OTY0LiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IHRoZVxuICogY3VycmVudCBhbmdsZU1vZGUuXG4gKlxuICogQG1ldGhvZCByYWRpYW5zXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGRlZ3JlZXMgdGhlIGRlZ3JlZSB2YWx1ZSB0byBjb252ZXJ0IHRvIHJhZGlhbnNcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgICB0aGUgY29udmVydGVkIGFuZ2xlXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9IOKAnG5vcmVuZGVyXCI+XG4gKiA8Y29kZT5cbiAqIHZhciBkZWcgPSA0NS4wO1xuICogdmFyIHJhZCA9IHJhZGlhbnMoZGVnKTtcbiAqIHByaW50KGRlZyArICcgZGVncmVlcyBpcyAnICsgcmFkICsgJyByYWRpYW5zJyk7XG4gKiAvLyBQcmludHM6IDQ1IGRlZ3JlZXMgaXMgMC43ODUzOTgxNjMzOTc0NDgzIHJhZGlhbnNcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUucmFkaWFucyA9IGZ1bmN0aW9uKGFuZ2xlKSB7XG4gIHJldHVybiBhbmdsZSAqIGNvbnN0YW50cy5ERUdfVE9fUkFEO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBjdXJyZW50IG1vZGUgb2YgcDUgdG8gZ2l2ZW4gbW9kZS4gRGVmYXVsdCBtb2RlIGlzIFJBRElBTlMuXG4gKlxuICogQG1ldGhvZCBhbmdsZU1vZGVcbiAqIEBwYXJhbSB7Q29uc3RhbnR9IG1vZGUgZWl0aGVyIFJBRElBTlMgb3IgREVHUkVFU1xuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwNCk7XG4gKiAgIGFuZ2xlTW9kZShERUdSRUVTKTsgLy8gQ2hhbmdlIHRoZSBtb2RlIHRvIERFR1JFRVNcbiAqICAgdmFyIGEgPSBhdGFuMihtb3VzZVkgLSBoZWlnaHQgLyAyLCBtb3VzZVggLSB3aWR0aCAvIDIpO1xuICogICB0cmFuc2xhdGUod2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAqICAgcHVzaCgpO1xuICogICByb3RhdGUoYSk7XG4gKiAgIHJlY3QoLTIwLCAtNSwgNDAsIDEwKTsgLy8gTGFyZ2VyIHJlY3RhbmdsZSBpcyByb3RhdGluZyBpbiBkZWdyZWVzXG4gKiAgIHBvcCgpO1xuICogICBhbmdsZU1vZGUoUkFESUFOUyk7IC8vIENoYW5nZSB0aGUgbW9kZSB0byBSQURJQU5TXG4gKiAgIHJvdGF0ZShhKTsgLy8gdmFyIGEgc3RheXMgdGhlIHNhbWVcbiAqICAgcmVjdCgtNDAsIC01LCAyMCwgMTApOyAvLyBTbWFsbGVyIHJlY3RhbmdsZSBpcyByb3RhdGluZyBpbiByYWRpYW5zXG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiA0MCBieSAxMCByZWN0IGluIGNlbnRlciByb3RhdGVzIHdpdGggbW91c2UgbW92ZXMuIDIwIGJ5IDEwIHJlY3QgbW92ZXMgZmFzdGVyLlxuICpcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5hbmdsZU1vZGUgPSBmdW5jdGlvbihtb2RlKSB7XG4gIGlmIChtb2RlID09PSBjb25zdGFudHMuREVHUkVFUyB8fCBtb2RlID09PSBjb25zdGFudHMuUkFESUFOUykge1xuICAgIHRoaXMuX2FuZ2xlTW9kZSA9IG1vZGU7XG4gIH1cbn07XG5cbi8qKlxuICogY29udmVydHMgYW5nbGVzIGZyb20gdGhlIGN1cnJlbnQgYW5nbGVNb2RlIHRvIFJBRElBTlNcbiAqXG4gKiBAbWV0aG9kIF90b1JhZGlhbnNcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gYW5nbGVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbnA1LnByb3RvdHlwZS5fdG9SYWRpYW5zID0gZnVuY3Rpb24oYW5nbGUpIHtcbiAgaWYgKHRoaXMuX2FuZ2xlTW9kZSA9PT0gY29uc3RhbnRzLkRFR1JFRVMpIHtcbiAgICByZXR1cm4gYW5nbGUgKiBjb25zdGFudHMuREVHX1RPX1JBRDtcbiAgfVxuICByZXR1cm4gYW5nbGU7XG59O1xuXG4vKipcbiAqIGNvbnZlcnRzIGFuZ2xlcyBmcm9tIHRoZSBjdXJyZW50IGFuZ2xlTW9kZSB0byBERUdSRUVTXG4gKlxuICogQG1ldGhvZCBfdG9EZWdyZWVzXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IGFuZ2xlXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5wNS5wcm90b3R5cGUuX3RvRGVncmVlcyA9IGZ1bmN0aW9uKGFuZ2xlKSB7XG4gIGlmICh0aGlzLl9hbmdsZU1vZGUgPT09IGNvbnN0YW50cy5SQURJQU5TKSB7XG4gICAgcmV0dXJuIGFuZ2xlICogY29uc3RhbnRzLlJBRF9UT19ERUc7XG4gIH1cbiAgcmV0dXJuIGFuZ2xlO1xufTtcblxuLyoqXG4gKiBjb252ZXJ0cyBhbmdsZXMgZnJvbSBSQURJQU5TIGludG8gdGhlIGN1cnJlbnQgYW5nbGVNb2RlXG4gKlxuICogQG1ldGhvZCBfZnJvbVJhZGlhbnNcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gYW5nbGVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbnA1LnByb3RvdHlwZS5fZnJvbVJhZGlhbnMgPSBmdW5jdGlvbihhbmdsZSkge1xuICBpZiAodGhpcy5fYW5nbGVNb2RlID09PSBjb25zdGFudHMuREVHUkVFUykge1xuICAgIHJldHVybiBhbmdsZSAqIGNvbnN0YW50cy5SQURfVE9fREVHO1xuICB9XG4gIHJldHVybiBhbmdsZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb25zdGFudHNcIjoyMSxcIi4uL2NvcmUvY29yZVwiOjIyfV0sNTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIFR5cG9ncmFwaHlcbiAqIEBzdWJtb2R1bGUgQXR0cmlidXRlc1xuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqIEByZXF1aXJlcyBjb25zdGFudHNcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xuXG4vKipcbiAqIFNldHMgdGhlIGN1cnJlbnQgYWxpZ25tZW50IGZvciBkcmF3aW5nIHRleHQuIEFjY2VwdHMgdHdvXG4gKiBhcmd1bWVudHM6IGhvcml6QWxpZ24gKExFRlQsIENFTlRFUiwgb3IgUklHSFQpIGFuZFxuICogdmVydEFsaWduIChUT1AsIEJPVFRPTSwgQ0VOVEVSLCBvciBCQVNFTElORSkuXG4gKlxuICogVGhlIGhvcml6QWxpZ24gcGFyYW1ldGVyIGlzIGluIHJlZmVyZW5jZSB0byB0aGUgeCB2YWx1ZVxuICogb2YgdGhlIHRleHQoKSBmdW5jdGlvbiwgd2hpbGUgdGhlIHZlcnRBbGlnbiBwYXJhbWV0ZXIgaXNcbiAqIGluIHJlZmVyZW5jZSB0byB0aGUgeSB2YWx1ZS5cbiAqXG4gKiBTbyBpZiB5b3Ugd3JpdGUgdGV4dEFsaWduKExFRlQpLCB5b3UgYXJlIGFsaWduaW5nIHRoZSBsZWZ0XG4gKiBlZGdlIG9mIHlvdXIgdGV4dCB0byB0aGUgeCB2YWx1ZSB5b3UgZ2l2ZSBpbiB0ZXh0KCkuIElmIHlvdVxuICogd3JpdGUgdGV4dEFsaWduKFJJR0hULCBUT1ApLCB5b3UgYXJlIGFsaWduaW5nIHRoZSByaWdodCBlZGdlXG4gKiBvZiB5b3VyIHRleHQgdG8gdGhlIHggdmFsdWUgYW5kIHRoZSB0b3Agb2YgZWRnZSBvZiB0aGUgdGV4dFxuICogdG8gdGhlIHkgdmFsdWUuXG4gKlxuICogQG1ldGhvZCB0ZXh0QWxpZ25cbiAqIEBwYXJhbSB7Q29uc3RhbnR9IGhvcml6QWxpZ24gaG9yaXpvbnRhbCBhbGlnbm1lbnQsIGVpdGhlciBMRUZULFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VOVEVSLCBvciBSSUdIVFxuICogQHBhcmFtIHtDb25zdGFudH0gW3ZlcnRBbGlnbl0gdmVydGljYWwgYWxpZ25tZW50LCBlaXRoZXIgVE9QLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9UVE9NLCBDRU5URVIsIG9yIEJBU0VMSU5FXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdGV4dFNpemUoMTYpO1xuICogdGV4dEFsaWduKFJJR0hUKTtcbiAqIHRleHQoJ0FCQ0QnLCA1MCwgMzApO1xuICogdGV4dEFsaWduKENFTlRFUik7XG4gKiB0ZXh0KCdFRkdIJywgNTAsIDUwKTtcbiAqIHRleHRBbGlnbihMRUZUKTtcbiAqIHRleHQoJ0lKS0wnLCA1MCwgNzApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICpMZXR0ZXJzIEFCQ0QgZGlzcGxheWVkIGF0IHRvcCByaWdodCwgRUZHSCBhdCBjZW50ZXIgYW5kIElKS0wgYXQgYm90dG9tIGxlZnQuXG4gKlxuICovXG4vKipcbiAqIEBtZXRob2QgdGV4dEFsaWduXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnA1LnByb3RvdHlwZS50ZXh0QWxpZ24gPSBmdW5jdGlvbihob3JpekFsaWduLCB2ZXJ0QWxpZ24pIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygndGV4dEFsaWduJywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXMuX3JlbmRlcmVyLnRleHRBbGlnbi5hcHBseSh0aGlzLl9yZW5kZXJlciwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogU2V0cy9nZXRzIHRoZSBzcGFjaW5nLCBpbiBwaXhlbHMsIGJldHdlZW4gbGluZXMgb2YgdGV4dC4gVGhpc1xuICogc2V0dGluZyB3aWxsIGJlIHVzZWQgaW4gYWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRleHQoKSBmdW5jdGlvbi5cbiAqXG4gKiBAbWV0aG9kIHRleHRMZWFkaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gbGVhZGluZyB0aGUgc2l6ZSBpbiBwaXhlbHMgZm9yIHNwYWNpbmcgYmV0d2VlbiBsaW5lc1xuICogQGNoYWluYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBUZXh0IHRvIGRpc3BsYXkuIFRoZSBcIlxcblwiIGlzIGEgXCJuZXcgbGluZVwiIGNoYXJhY3RlclxuICogdmFyIGxpbmVzID0gJ0wxXFxuTDJcXG5MMyc7XG4gKiB0ZXh0U2l6ZSgxMik7XG4gKlxuICogdGV4dExlYWRpbmcoMTApOyAvLyBTZXQgbGVhZGluZyB0byAxMFxuICogdGV4dChsaW5lcywgMTAsIDI1KTtcbiAqXG4gKiB0ZXh0TGVhZGluZygyMCk7IC8vIFNldCBsZWFkaW5nIHRvIDIwXG4gKiB0ZXh0KGxpbmVzLCA0MCwgMjUpO1xuICpcbiAqIHRleHRMZWFkaW5nKDMwKTsgLy8gU2V0IGxlYWRpbmcgdG8gMzBcbiAqIHRleHQobGluZXMsIDcwLCAyNSk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKnNldCBMMSBMMiAmIEwzIGRpc3BsYXllZCB2ZXJ0aWNhbGx5IDMgdGltZXMuIHNwYWNpbmcgaW5jcmVhc2VzIGZvciBlYWNoIHNldFxuICovXG4vKipcbiAqIEBtZXRob2QgdGV4dExlYWRpbmdcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xucDUucHJvdG90eXBlLnRleHRMZWFkaW5nID0gZnVuY3Rpb24odGhlTGVhZGluZykge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCd0ZXh0TGVhZGluZycsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzLl9yZW5kZXJlci50ZXh0TGVhZGluZy5hcHBseSh0aGlzLl9yZW5kZXJlciwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogU2V0cy9nZXRzIHRoZSBjdXJyZW50IGZvbnQgc2l6ZS4gVGhpcyBzaXplIHdpbGwgYmUgdXNlZCBpbiBhbGwgc3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIHRleHQoKSBmdW5jdGlvbi4gRm9udCBzaXplIGlzIG1lYXN1cmVkIGluIHBpeGVscy5cbiAqXG4gKiBAbWV0aG9kIHRleHRTaXplXG4gKiBAcGFyYW0ge051bWJlcn0gdGhlU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgbGV0dGVycyBpbiB1bml0cyBvZiBwaXhlbHNcbiAqIEBjaGFpbmFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdGV4dFNpemUoMTIpO1xuICogdGV4dCgnRm9udCBTaXplIDEyJywgMTAsIDMwKTtcbiAqIHRleHRTaXplKDE0KTtcbiAqIHRleHQoJ0ZvbnQgU2l6ZSAxNCcsIDEwLCA2MCk7XG4gKiB0ZXh0U2l6ZSgxNik7XG4gKiB0ZXh0KCdGb250IFNpemUgMTYnLCAxMCwgOTApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICpGb250IFNpemUgMTIgZGlzcGxheWVkIHNtYWxsLCBGb250IFNpemUgMTQgbWVkaXVtICYgRm9udCBTaXplIDE2IGxhcmdlXG4gKi9cbi8qKlxuICogQG1ldGhvZCB0ZXh0U2l6ZVxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5wNS5wcm90b3R5cGUudGV4dFNpemUgPSBmdW5jdGlvbih0aGVTaXplKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3RleHRTaXplJywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXMuX3JlbmRlcmVyLnRleHRTaXplLmFwcGx5KHRoaXMuX3JlbmRlcmVyLCBhcmd1bWVudHMpO1xufTtcblxuLyoqXG4gKiBTZXRzL2dldHMgdGhlIHN0eWxlIG9mIHRoZSB0ZXh0IGZvciBzeXN0ZW0gZm9udHMgdG8gTk9STUFMLCBJVEFMSUMsIG9yIEJPTEQuXG4gKiBOb3RlOiB0aGlzIG1heSBiZSBpcyBvdmVycmlkZGVuIGJ5IENTUyBzdHlsaW5nLiBGb3Igbm9uLXN5c3RlbSBmb250c1xuICogKG9wZW50eXBlLCB0cnVldHlwZSwgZXRjLikgcGxlYXNlIGxvYWQgc3R5bGVkIGZvbnRzIGluc3RlYWQuXG4gKlxuICogQG1ldGhvZCB0ZXh0U3R5bGVcbiAqIEBwYXJhbSB7Q29uc3RhbnR9IHRoZVN0eWxlIHN0eWxpbmcgZm9yIHRleHQsIGVpdGhlciBOT1JNQUwsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVEFMSUMsIG9yIEJPTERcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBzdHJva2VXZWlnaHQoMCk7XG4gKiB0ZXh0U2l6ZSgxMik7XG4gKiB0ZXh0U3R5bGUoTk9STUFMKTtcbiAqIHRleHQoJ0ZvbnQgU3R5bGUgTm9ybWFsJywgMTAsIDMwKTtcbiAqIHRleHRTdHlsZShJVEFMSUMpO1xuICogdGV4dCgnRm9udCBTdHlsZSBJdGFsaWMnLCAxMCwgNjApO1xuICogdGV4dFN0eWxlKEJPTEQpO1xuICogdGV4dCgnRm9udCBTdHlsZSBCb2xkJywgMTAsIDkwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqd29yZHMgRm9udCBTdHlsZSBOb3JtYWwgZGlzcGxheWVkIG5vcm1hbGx5LCBJdGFsaWMgaW4gaXRhbGljIGFuZCBib2xkIGluIGJvbGRcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIHRleHRTdHlsZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5wNS5wcm90b3R5cGUudGV4dFN0eWxlID0gZnVuY3Rpb24odGhlU3R5bGUpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygndGV4dFN0eWxlJywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXMuX3JlbmRlcmVyLnRleHRTdHlsZS5hcHBseSh0aGlzLl9yZW5kZXJlciwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgd2lkdGggb2YgYW55IGNoYXJhY3RlciBvciB0ZXh0IHN0cmluZy5cbiAqXG4gKiBAbWV0aG9kIHRleHRXaWR0aFxuICogQHBhcmFtIHtTdHJpbmd9IHRoZVRleHQgdGhlIFN0cmluZyBvZiBjaGFyYWN0ZXJzIHRvIG1lYXN1cmVcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB0ZXh0U2l6ZSgyOCk7XG4gKlxuICogdmFyIGFDaGFyID0gJ1AnO1xuICogdmFyIGNXaWR0aCA9IHRleHRXaWR0aChhQ2hhcik7XG4gKiB0ZXh0KGFDaGFyLCAwLCA0MCk7XG4gKiBsaW5lKGNXaWR0aCwgMCwgY1dpZHRoLCA1MCk7XG4gKlxuICogdmFyIGFTdHJpbmcgPSAncDUuanMnO1xuICogdmFyIHNXaWR0aCA9IHRleHRXaWR0aChhU3RyaW5nKTtcbiAqIHRleHQoYVN0cmluZywgMCwgODUpO1xuICogbGluZShzV2lkdGgsIDUwLCBzV2lkdGgsIDEwMCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKkxldHRlciBQIGFuZCBwNS5qcyBhcmUgZGlzcGxheWVkIHdpdGggdmVydGljYWwgbGluZXMgYXQgZW5kLiBQIGlzIHdpZGVcbiAqXG4gKi9cbnA1LnByb3RvdHlwZS50ZXh0V2lkdGggPSBmdW5jdGlvbih0aGVUZXh0KSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3RleHRXaWR0aCcsIGFyZ3VtZW50cyk7XG4gIGlmICh0aGVUZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiB0aGlzLl9yZW5kZXJlci50ZXh0V2lkdGguYXBwbHkodGhpcy5fcmVuZGVyZXIsIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFzY2VudCBvZiB0aGUgY3VycmVudCBmb250IGF0IGl0cyBjdXJyZW50IHNpemUuIFRoZSBhc2NlbnRcbiAqIHJlcHJlc2VudHMgdGhlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIG9mIHRoZSB0YWxsZXN0IGNoYXJhY3RlciBhYm92ZVxuICogdGhlIGJhc2VsaW5lLlxuICogQG1ldGhvZCB0ZXh0QXNjZW50XG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGJhc2UgPSBoZWlnaHQgKiAwLjc1O1xuICogdmFyIHNjYWxhciA9IDAuODsgLy8gRGlmZmVyZW50IGZvciBlYWNoIGZvbnRcbiAqXG4gKiB0ZXh0U2l6ZSgzMik7IC8vIFNldCBpbml0aWFsIHRleHQgc2l6ZVxuICogdmFyIGFzYyA9IHRleHRBc2NlbnQoKSAqIHNjYWxhcjsgLy8gQ2FsYyBhc2NlbnRcbiAqIGxpbmUoMCwgYmFzZSAtIGFzYywgd2lkdGgsIGJhc2UgLSBhc2MpO1xuICogdGV4dCgnZHAnLCAwLCBiYXNlKTsgLy8gRHJhdyB0ZXh0IG9uIGJhc2VsaW5lXG4gKlxuICogdGV4dFNpemUoNjQpOyAvLyBJbmNyZWFzZSB0ZXh0IHNpemVcbiAqIGFzYyA9IHRleHRBc2NlbnQoKSAqIHNjYWxhcjsgLy8gUmVjYWxjIGFzY2VudFxuICogbGluZSg0MCwgYmFzZSAtIGFzYywgd2lkdGgsIGJhc2UgLSBhc2MpO1xuICogdGV4dCgnZHAnLCA0MCwgYmFzZSk7IC8vIERyYXcgdGV4dCBvbiBiYXNlbGluZVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKi9cbnA1LnByb3RvdHlwZS50ZXh0QXNjZW50ID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3RleHRBc2NlbnQnLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcy5fcmVuZGVyZXIudGV4dEFzY2VudCgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkZXNjZW50IG9mIHRoZSBjdXJyZW50IGZvbnQgYXQgaXRzIGN1cnJlbnQgc2l6ZS4gVGhlIGRlc2NlbnRcbiAqIHJlcHJlc2VudHMgdGhlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIG9mIHRoZSBjaGFyYWN0ZXIgd2l0aCB0aGUgbG9uZ2VzdFxuICogZGVzY2VuZGVyIGJlbG93IHRoZSBiYXNlbGluZS5cbiAqIEBtZXRob2QgdGV4dERlc2NlbnRcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYmFzZSA9IGhlaWdodCAqIDAuNzU7XG4gKiB2YXIgc2NhbGFyID0gMC44OyAvLyBEaWZmZXJlbnQgZm9yIGVhY2ggZm9udFxuICpcbiAqIHRleHRTaXplKDMyKTsgLy8gU2V0IGluaXRpYWwgdGV4dCBzaXplXG4gKiB2YXIgZGVzYyA9IHRleHREZXNjZW50KCkgKiBzY2FsYXI7IC8vIENhbGMgYXNjZW50XG4gKiBsaW5lKDAsIGJhc2UgKyBkZXNjLCB3aWR0aCwgYmFzZSArIGRlc2MpO1xuICogdGV4dCgnZHAnLCAwLCBiYXNlKTsgLy8gRHJhdyB0ZXh0IG9uIGJhc2VsaW5lXG4gKlxuICogdGV4dFNpemUoNjQpOyAvLyBJbmNyZWFzZSB0ZXh0IHNpemVcbiAqIGRlc2MgPSB0ZXh0RGVzY2VudCgpICogc2NhbGFyOyAvLyBSZWNhbGMgYXNjZW50XG4gKiBsaW5lKDQwLCBiYXNlICsgZGVzYywgd2lkdGgsIGJhc2UgKyBkZXNjKTtcbiAqIHRleHQoJ2RwJywgNDAsIGJhc2UpOyAvLyBEcmF3IHRleHQgb24gYmFzZWxpbmVcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUudGV4dERlc2NlbnQgPSBmdW5jdGlvbigpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygndGV4dERlc2NlbnQnLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcy5fcmVuZGVyZXIudGV4dERlc2NlbnQoKTtcbn07XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIG1lYXN1cmUgYXNjZW50IGFuZCBkZXNjZW50LlxuICovXG5wNS5wcm90b3R5cGUuX3VwZGF0ZVRleHRNZXRyaWNzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9yZW5kZXJlci5fdXBkYXRlVGV4dE1ldHJpY3MoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSw1NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgVHlwb2dyYXBoeVxuICogQHN1Ym1vZHVsZSBMb2FkaW5nICYgRGlzcGxheWluZ1xuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xudmFyIGNvbnN0YW50cyA9IF9kZXJlcV8oJy4uL2NvcmUvY29uc3RhbnRzJyk7XG52YXIgb3BlbnR5cGUgPSBfZGVyZXFfKCdvcGVudHlwZS5qcycpO1xuXG5fZGVyZXFfKCcuLi9jb3JlL2Vycm9yX2hlbHBlcnMnKTtcblxuLyoqXG4gKiBMb2FkcyBhbiBvcGVudHlwZSBmb250IGZpbGUgKC5vdGYsIC50dGYpIGZyb20gYSBmaWxlIG9yIGEgVVJMLFxuICogYW5kIHJldHVybnMgYSBQRm9udCBPYmplY3QuIFRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cyxcbiAqIG1lYW5pbmcgaXQgbWF5IG5vdCBmaW5pc2ggYmVmb3JlIHRoZSBuZXh0IGxpbmUgaW4geW91ciBza2V0Y2hcbiAqIGlzIGV4ZWN1dGVkLlxuICogPGJyPjxicj5cbiAqIFRoZSBwYXRoIHRvIHRoZSBmb250IHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgSFRNTCBmaWxlXG4gKiB0aGF0IGxpbmtzIGluIHlvdXIgc2tldGNoLiBMb2FkaW5nIGFuIGZyb20gYSBVUkwgb3Igb3RoZXJcbiAqIHJlbW90ZSBsb2NhdGlvbiBtYXkgYmUgYmxvY2tlZCBkdWUgdG8geW91ciBicm93c2VyJ3MgYnVpbHQtaW5cbiAqIHNlY3VyaXR5LlxuICpcbiAqIEBtZXRob2QgbG9hZEZvbnRcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgIHBhdGggICAgICAgbmFtZSBvZiB0aGUgZmlsZSBvciB1cmwgdG8gbG9hZFxuICogQHBhcmFtICB7RnVuY3Rpb259ICAgICAgW2NhbGxiYWNrXSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRm9udCgpIGNvbXBsZXRlc1xuICogQHBhcmFtICB7RnVuY3Rpb259ICAgICAgW29uRXJyb3JdICBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBlcnJvciBvY2N1cnNcbiAqIEByZXR1cm4ge3A1LkZvbnR9ICAgICAgICAgICAgICAgICAgcDUuRm9udCBvYmplY3RcbiAqIEBleGFtcGxlXG4gKlxuICogPHA+Q2FsbGluZyBsb2FkRm9udCgpIGluc2lkZSBwcmVsb2FkKCkgZ3VhcmFudGVlcyB0aGF0IHRoZSBsb2FkXG4gKiBvcGVyYXRpb24gd2lsbCBoYXZlIGNvbXBsZXRlZCBiZWZvcmUgc2V0dXAoKSBhbmQgZHJhdygpIGFyZSBjYWxsZWQuPC9wPlxuICpcbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgbXlGb250O1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgbXlGb250ID0gbG9hZEZvbnQoJ2Fzc2V0cy9BdmVuaXJOZXh0TFRQcm8tRGVtaS5vdGYnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgZmlsbCgnI0VEMjI1RCcpO1xuICogICB0ZXh0Rm9udChteUZvbnQpO1xuICogICB0ZXh0U2l6ZSgzNik7XG4gKiAgIHRleHQoJ3A1KmpzJywgMTAsIDUwKTtcbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBPdXRzaWRlIG9mIHByZWxvYWQoKSwgeW91IG1heSBzdXBwbHkgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlXG4gKiBvYmplY3Q6XG4gKlxuICogPGRpdj48Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBsb2FkRm9udCgnYXNzZXRzL0F2ZW5pck5leHRMVFByby1EZW1pLm90ZicsIGRyYXdUZXh0KTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3VGV4dChmb250KSB7XG4gKiAgIGZpbGwoJyNFRDIyNUQnKTtcbiAqICAgdGV4dEZvbnQoZm9udCwgMzYpO1xuICogICB0ZXh0KCdwNSpqcycsIDEwLCA1MCk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogPHA+WW91IGNhbiBhbHNvIHVzZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIGZvbnQgdG8gc3R5bGUgb3RoZXIgSFRNTFxuICogZWxlbWVudHMuPC9wPlxuICpcbiAqIDxkaXY+PGNvZGU+XG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICBsb2FkRm9udCgnYXNzZXRzL0F2ZW5pci5vdGYnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIG15RGl2ID0gY3JlYXRlRGl2KCdoZWxsbyB0aGVyZScpO1xuICogICBteURpdi5zdHlsZSgnZm9udC1mYW1pbHknLCAnQXZlbmlyJyk7XG4gKiB9XG4gKiA8L2NvZGU+PC9kaXY+XG4gKlxuICogQGFsdFxuICogcDUqanMgaW4gcDUncyB0aGVtZSBkYXJrIHBpbmtcbiAqIHA1KmpzIGluIHA1J3MgdGhlbWUgZGFyayBwaW5rXG4gKlxuICovXG5wNS5wcm90b3R5cGUubG9hZEZvbnQgPSBmdW5jdGlvbihwYXRoLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnbG9hZEZvbnQnLCBhcmd1bWVudHMpO1xuICB2YXIgcDVGb250ID0gbmV3IHA1LkZvbnQodGhpcyk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBvcGVudHlwZS5sb2FkKHBhdGgsIGZ1bmN0aW9uKGVyciwgZm9udCkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGlmICh0eXBlb2Ygb25FcnJvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG9uRXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICAgIHA1Ll9mcmllbmRseUZpbGVMb2FkRXJyb3IoNCwgcGF0aCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVyciwgcGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcDVGb250LmZvbnQgPSBmb250O1xuXG4gICAgaWYgKHR5cGVvZiBvblN1Y2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvblN1Y2Nlc3MocDVGb250KTtcbiAgICB9XG5cbiAgICBzZWxmLl9kZWNyZW1lbnRQcmVsb2FkKCk7XG5cbiAgICAvLyBjaGVjayB0aGF0IHdlIGhhdmUgYW4gYWNjZXB0YWJsZSBmb250IHR5cGVcbiAgICB2YXIgdmFsaWRGb250VHlwZXMgPSBbJ3R0ZicsICdvdGYnLCAnd29mZicsICd3b2ZmMiddLFxuICAgICAgZmlsZU5vUGF0aCA9IHBhdGhcbiAgICAgICAgLnNwbGl0KCdcXFxcJylcbiAgICAgICAgLnBvcCgpXG4gICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgIC5wb3AoKSxcbiAgICAgIGxhc3REb3RJZHggPSBmaWxlTm9QYXRoLmxhc3RJbmRleE9mKCcuJyksXG4gICAgICBmb250RmFtaWx5LFxuICAgICAgbmV3U3R5bGUsXG4gICAgICBmaWxlRXh0ID0gbGFzdERvdElkeCA8IDEgPyBudWxsIDogZmlsZU5vUGF0aC5zdWJzdHIobGFzdERvdElkeCArIDEpO1xuXG4gICAgLy8gaWYgc28sIGFkZCBpdCB0byB0aGUgRE9NIChuYW1lLW9ubHkpIGZvciB1c2Ugd2l0aCBwNS5kb21cbiAgICBpZiAodmFsaWRGb250VHlwZXMuaW5kZXhPZihmaWxlRXh0KSA+IC0xKSB7XG4gICAgICBmb250RmFtaWx5ID0gZmlsZU5vUGF0aC5zdWJzdHIoMCwgbGFzdERvdElkeCk7XG4gICAgICBuZXdTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBuZXdTdHlsZS5hcHBlbmRDaGlsZChcbiAgICAgICAgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXG4gICAgICAgICAgJ1xcbkBmb250LWZhY2UgeycgK1xuICAgICAgICAgICAgJ1xcbmZvbnQtZmFtaWx5OiAnICtcbiAgICAgICAgICAgIGZvbnRGYW1pbHkgK1xuICAgICAgICAgICAgJztcXG5zcmM6IHVybCgnICtcbiAgICAgICAgICAgIHBhdGggK1xuICAgICAgICAgICAgJyk7XFxufVxcbidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobmV3U3R5bGUpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHA1Rm9udDtcbn07XG5cbi8qKlxuICogRHJhd3MgdGV4dCB0byB0aGUgc2NyZWVuLiBEaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gc3BlY2lmaWVkIGluIHRoZSBmaXJzdFxuICogcGFyYW1ldGVyIG9uIHRoZSBzY3JlZW4gaW4gdGhlIHBvc2l0aW9uIHNwZWNpZmllZCBieSB0aGUgYWRkaXRpb25hbFxuICogcGFyYW1ldGVycy4gQSBkZWZhdWx0IGZvbnQgd2lsbCBiZSB1c2VkIHVubGVzcyBhIGZvbnQgaXMgc2V0IHdpdGggdGhlXG4gKiB0ZXh0Rm9udCgpIGZ1bmN0aW9uIGFuZCBhIGRlZmF1bHQgc2l6ZSB3aWxsIGJlIHVzZWQgdW5sZXNzIGEgZm9udCBpcyBzZXRcbiAqIHdpdGggdGV4dFNpemUoKS4gQ2hhbmdlIHRoZSBjb2xvciBvZiB0aGUgdGV4dCB3aXRoIHRoZSBmaWxsKCkgZnVuY3Rpb24uXG4gKiBDaGFuZ2UgdGhlIG91dGxpbmUgb2YgdGhlIHRleHQgd2l0aCB0aGUgc3Ryb2tlKCkgYW5kIHN0cm9rZVdlaWdodCgpXG4gKiBmdW5jdGlvbnMuXG4gKiA8YnI+PGJyPlxuICogVGhlIHRleHQgZGlzcGxheXMgaW4gcmVsYXRpb24gdG8gdGhlIHRleHRBbGlnbigpIGZ1bmN0aW9uLCB3aGljaCBnaXZlcyB0aGVcbiAqIG9wdGlvbiB0byBkcmF3IHRvIHRoZSBsZWZ0LCByaWdodCwgYW5kIGNlbnRlciBvZiB0aGUgY29vcmRpbmF0ZXMuXG4gKiA8YnI+PGJyPlxuICogVGhlIHgyIGFuZCB5MiBwYXJhbWV0ZXJzIGRlZmluZSBhIHJlY3Rhbmd1bGFyIGFyZWEgdG8gZGlzcGxheSB3aXRoaW4gYW5kXG4gKiBtYXkgb25seSBiZSB1c2VkIHdpdGggc3RyaW5nIGRhdGEuIFdoZW4gdGhlc2UgcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkLFxuICogdGhleSBhcmUgaW50ZXJwcmV0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVjdE1vZGUoKSBzZXR0aW5nLiBUZXh0IHRoYXRcbiAqIGRvZXMgbm90IGZpdCBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgcmVjdGFuZ2xlIHNwZWNpZmllZCB3aWxsIG5vdCBiZSBkcmF3blxuICogdG8gdGhlIHNjcmVlbi5cbiAqXG4gKiBAbWV0aG9kIHRleHRcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdHxBcnJheXxOdW1iZXJ8Qm9vbGVhbn0gc3RyIHRoZSBhbHBoYW51bWVyaWNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9scyB0byBiZSBkaXNwbGF5ZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB4ICAgeC1jb29yZGluYXRlIG9mIHRleHRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5ICAgeS1jb29yZGluYXRlIG9mIHRleHRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbeDJdICBieSBkZWZhdWx0LCB0aGUgd2lkdGggb2YgdGhlIHRleHQgYm94LFxuICogICAgICAgICAgICAgICAgICAgICBzZWUgcmVjdE1vZGUoKSBmb3IgbW9yZSBpbmZvXG4gKiBAcGFyYW0ge051bWJlcn0gW3kyXSAgYnkgZGVmYXVsdCwgdGhlIGhlaWdodCBvZiB0aGUgdGV4dCBib3gsXG4gKiAgICAgICAgICAgICAgICAgICAgIHNlZSByZWN0TW9kZSgpIGZvciBtb3JlIGluZm9cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB0ZXh0U2l6ZSgzMik7XG4gKiB0ZXh0KCd3b3JkJywgMTAsIDMwKTtcbiAqIGZpbGwoMCwgMTAyLCAxNTMpO1xuICogdGV4dCgnd29yZCcsIDEwLCA2MCk7XG4gKiBmaWxsKDAsIDEwMiwgMTUzLCA1MSk7XG4gKiB0ZXh0KCd3b3JkJywgMTAsIDkwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIHMgPSAnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cuJztcbiAqIGZpbGwoNTApO1xuICogdGV4dChzLCAxMCwgMTAsIDcwLCA4MCk7IC8vIFRleHQgd3JhcHMgd2l0aGluIHRleHQgYm94XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKid3b3JkJyBkaXNwbGF5ZWQgMyB0aW1lcyBnb2luZyBmcm9tIGJsYWNrLCBibHVlIHRvIHRyYW5zbHVjZW50IGJsdWVcbiAqIFRoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nLlxuICpcbiAqL1xucDUucHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbihzdHIsIHgsIHksIG1heFdpZHRoLCBtYXhIZWlnaHQpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygndGV4dCcsIGFyZ3VtZW50cyk7XG4gIHJldHVybiAhKHRoaXMuX3JlbmRlcmVyLl9kb0ZpbGwgfHwgdGhpcy5fcmVuZGVyZXIuX2RvU3Ryb2tlKVxuICAgID8gdGhpc1xuICAgIDogdGhpcy5fcmVuZGVyZXIudGV4dC5hcHBseSh0aGlzLl9yZW5kZXJlciwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgY3VycmVudCBmb250IHRoYXQgd2lsbCBiZSBkcmF3biB3aXRoIHRoZSB0ZXh0KCkgZnVuY3Rpb24uXG4gKlxuICogQG1ldGhvZCB0ZXh0Rm9udFxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgY3VycmVudCBmb250XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZpbGwoMCk7XG4gKiB0ZXh0U2l6ZSgxMik7XG4gKiB0ZXh0Rm9udCgnR2VvcmdpYScpO1xuICogdGV4dCgnR2VvcmdpYScsIDEyLCAzMCk7XG4gKiB0ZXh0Rm9udCgnSGVsdmV0aWNhJyk7XG4gKiB0ZXh0KCdIZWx2ZXRpY2EnLCAxMiwgNjApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgZm9udFJlZ3VsYXIsIGZvbnRJdGFsaWMsIGZvbnRCb2xkO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgZm9udFJlZ3VsYXIgPSBsb2FkRm9udCgnYXNzZXRzL1JlZ3VsYXIub3RmJyk7XG4gKiAgIGZvbnRJdGFsaWMgPSBsb2FkRm9udCgnYXNzZXRzL0l0YWxpYy50dGYnKTtcbiAqICAgZm9udEJvbGQgPSBsb2FkRm9udCgnYXNzZXRzL0JvbGQudHRmJyk7XG4gKiB9XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgYmFja2dyb3VuZCgyMTApO1xuICogICBmaWxsKDApXG4gICAgLnN0cm9rZVdlaWdodCgwKVxuICAgIC50ZXh0U2l6ZSgxMCk7XG4gKiAgIHRleHRGb250KGZvbnRSZWd1bGFyKTtcbiAqICAgdGV4dCgnRm9udCBTdHlsZSBOb3JtYWwnLCAxMCwgMzApO1xuICogICB0ZXh0Rm9udChmb250SXRhbGljKTtcbiAqICAgdGV4dCgnRm9udCBTdHlsZSBJdGFsaWMnLCAxMCwgNTApO1xuICogICB0ZXh0Rm9udChmb250Qm9sZCk7XG4gKiAgIHRleHQoJ0ZvbnQgU3R5bGUgQm9sZCcsIDEwLCA3MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKndvcmRzIEZvbnQgU3R5bGUgTm9ybWFsIGRpc3BsYXllZCBub3JtYWxseSwgSXRhbGljIGluIGl0YWxpYyBhbmQgYm9sZCBpbiBib2xkXG4gKi9cbi8qKlxuICogQG1ldGhvZCB0ZXh0Rm9udFxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBmb250IGEgZm9udCBsb2FkZWQgdmlhIGxvYWRGb250KCksIG9yIGEgU3RyaW5nXG4gKiByZXByZXNlbnRpbmcgYSA8YSBocmVmPVwiaHR0cHM6Ly9temwubGEvMmRPdzhXRFwiPndlYiBzYWZlIGZvbnQ8L2E+IChhIGZvbnRcbiAqIHRoYXQgaXMgZ2VuZXJhbGx5IGF2YWlsYWJsZSBhY3Jvc3MgYWxsIHN5c3RlbXMpXG4gKiBAcGFyYW0ge051bWJlcn0gW3NpemVdIHRoZSBmb250IHNpemUgdG8gdXNlXG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1LnByb3RvdHlwZS50ZXh0Rm9udCA9IGZ1bmN0aW9uKHRoZUZvbnQsIHRoZVNpemUpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygndGV4dEZvbnQnLCBhcmd1bWVudHMpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGlmICghdGhlRm9udCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ251bGwgZm9udCBwYXNzZWQgdG8gdGV4dEZvbnQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW5kZXJlci5fc2V0UHJvcGVydHkoJ190ZXh0Rm9udCcsIHRoZUZvbnQpO1xuXG4gICAgaWYgKHRoZVNpemUpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLl9zZXRQcm9wZXJ0eSgnX3RleHRTaXplJywgdGhlU2l6ZSk7XG4gICAgICB0aGlzLl9yZW5kZXJlci5fc2V0UHJvcGVydHkoXG4gICAgICAgICdfdGV4dExlYWRpbmcnLFxuICAgICAgICB0aGVTaXplICogY29uc3RhbnRzLl9ERUZBVUxUX0xFQURNVUxUXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZW5kZXJlci5fYXBwbHlUZXh0UHJvcGVydGllcygpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX3JlbmRlcmVyLl90ZXh0Rm9udDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb25zdGFudHNcIjoyMSxcIi4uL2NvcmUvY29yZVwiOjIyLFwiLi4vY29yZS9lcnJvcl9oZWxwZXJzXCI6MjUsXCJvcGVudHlwZS5qc1wiOjEwfV0sNTg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBwNS5Gb250IGNsYXNzIGFuZCBmdW5jdGlvbnMgZm9yXG4gKiBkcmF3aW5nIHRleHQgdG8gdGhlIGRpc3BsYXkgY2FudmFzLlxuICogQG1vZHVsZSBUeXBvZ3JhcGh5XG4gKiBAc3VibW9kdWxlIEZvbnRcbiAqIEByZXF1aXJlcyBjb3JlXG4gKiBAcmVxdWlyZXMgY29uc3RhbnRzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuLi9jb3JlL2NvcmUnKTtcbnZhciBjb25zdGFudHMgPSBfZGVyZXFfKCcuLi9jb3JlL2NvbnN0YW50cycpO1xuXG4vKlxuICogVE9ETzpcbiAqIC0tIGtlcm5pbmdcbiAqIC0tIGFsaWdubWVudDoganVzdGlmaWVkP1xuICovXG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgZm9udCBoYW5kbGluZ1xuICogQGNsYXNzIHA1LkZvbnRcbiAqIEBwYXJhbSB7cDV9IFtwSW5zdF0gcG9pbnRlciB0byBwNSBpbnN0YW5jZVxuICovXG5wNS5Gb250ID0gZnVuY3Rpb24ocCkge1xuICB0aGlzLnBhcmVudCA9IHA7XG5cbiAgdGhpcy5jYWNoZSA9IHt9O1xuXG4gIC8qKlxuICAgKiBVbmRlcmx5aW5nIG9wZW50eXBlIGZvbnQgaW1wbGVtZW50YXRpb25cbiAgICogQHByb3BlcnR5IGZvbnRcbiAgICovXG4gIHRoaXMuZm9udCA9IHVuZGVmaW5lZDtcbn07XG5cbnA1LkZvbnQucHJvdG90eXBlLmxpc3QgPSBmdW5jdGlvbigpIHtcbiAgLy8gVE9ET1xuICB0aHJvdyAnbm90IHlldCBpbXBsZW1lbnRlZCc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSB0aWdodCBib3VuZGluZyBib3ggZm9yIHRoZSBnaXZlbiB0ZXh0IHN0cmluZyB1c2luZyB0aGlzXG4gKiBmb250IChjdXJyZW50bHkgb25seSBzdXBwb3J0cyBzaW5nbGUgbGluZXMpXG4gKlxuICogQG1ldGhvZCB0ZXh0Qm91bmRzXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGxpbmUgICAgIGEgbGluZSBvZiB0ZXh0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggICAgICAgIHgtcG9zaXRpb25cbiAqIEBwYXJhbSAge051bWJlcn0geSAgICAgICAgeS1wb3NpdGlvblxuICogQHBhcmFtICB7TnVtYmVyfSBbZm9udFNpemVdIGZvbnQgc2l6ZSB0byB1c2UgKG9wdGlvbmFsKVxuICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9uc10gb3BlbnR5cGUgb3B0aW9ucyAob3B0aW9uYWwpXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICBhIHJlY3RhbmdsZSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzOiB4LCB5LCB3LCBoXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBmb250O1xuICogdmFyIHRleHRTdHJpbmcgPSAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuJztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGZvbnQgPSBsb2FkRm9udCgnLi9hc3NldHMvUmVndWxhci5vdGYnKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBiYWNrZ3JvdW5kKDIxMCk7XG4gKlxuICogICB2YXIgYmJveCA9IGZvbnQudGV4dEJvdW5kcyh0ZXh0U3RyaW5nLCAxMCwgMzAsIDEyKTtcbiAqICAgZmlsbCgyNTUpO1xuICogICBzdHJva2UoMCk7XG4gKiAgIHJlY3QoYmJveC54LCBiYm94LnksIGJib3gudywgYmJveC5oKTtcbiAqICAgZmlsbCgwKTtcbiAqICAgbm9TdHJva2UoKTtcbiAqXG4gKiAgIHRleHRGb250KGZvbnQpO1xuICogICB0ZXh0U2l6ZSgxMik7XG4gKiAgIHRleHQodGV4dFN0cmluZywgMTAsIDMwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqd29yZHMgTG9yZW0gaXBzdW0gZG9sIGdvIG9mZiBjYW52YXMgYW5kIGNvbnRhaW5lZCBieSB3aGl0ZSBib3VuZGluZyBib3hcbiAqXG4gKi9cbnA1LkZvbnQucHJvdG90eXBlLnRleHRCb3VuZHMgPSBmdW5jdGlvbihzdHIsIHgsIHksIGZvbnRTaXplLCBvcHRpb25zKSB7XG4gIHggPSB4ICE9PSB1bmRlZmluZWQgPyB4IDogMDtcbiAgeSA9IHkgIT09IHVuZGVmaW5lZCA/IHkgOiAwO1xuICBmb250U2l6ZSA9IGZvbnRTaXplIHx8IHRoaXMucGFyZW50Ll9yZW5kZXJlci5fdGV4dFNpemU7XG5cbiAgLy8gQ2hlY2sgY2FjaGUgZm9yIGV4aXN0aW5nIGJvdW5kcy4gVGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gdGhlIHRleHQgYWxpZ25tZW50XG4gIC8vIHNldHRpbmdzLiBEZWZhdWx0IGFsaWdubWVudCBzaG91bGQgbWF0Y2ggb3BlbnR5cGUncyBvcmlnaW46IGxlZnQtYWxpZ25lZCAmXG4gIC8vIGFscGhhYmV0aWMgYmFzZWxpbmUuXG4gIHZhciBwID1cbiAgICAgIChvcHRpb25zICYmIG9wdGlvbnMucmVuZGVyZXIgJiYgb3B0aW9ucy5yZW5kZXJlci5fcEluc3QpIHx8IHRoaXMucGFyZW50LFxuICAgIGN0eCA9IHAuX3JlbmRlcmVyLmRyYXdpbmdDb250ZXh0LFxuICAgIGFsaWdubWVudCA9IGN0eC50ZXh0QWxpZ24gfHwgY29uc3RhbnRzLkxFRlQsXG4gICAgYmFzZWxpbmUgPSBjdHgudGV4dEJhc2VsaW5lIHx8IGNvbnN0YW50cy5CQVNFTElORSxcbiAgICBrZXkgPSBjYWNoZUtleSgndGV4dEJvdW5kcycsIHN0ciwgeCwgeSwgZm9udFNpemUsIGFsaWdubWVudCwgYmFzZWxpbmUpLFxuICAgIHJlc3VsdCA9IHRoaXMuY2FjaGVba2V5XTtcblxuICBpZiAoIXJlc3VsdCkge1xuICAgIHZhciBtaW5YLFxuICAgICAgbWluWSxcbiAgICAgIG1heFgsXG4gICAgICBtYXhZLFxuICAgICAgcG9zLFxuICAgICAgeENvb3JkcyA9IFtdLFxuICAgICAgeUNvb3JkcyA9IFtdLFxuICAgICAgc2NhbGUgPSB0aGlzLl9zY2FsZShmb250U2l6ZSk7XG5cbiAgICB0aGlzLmZvbnQuZm9yRWFjaEdseXBoKHN0ciwgeCwgeSwgZm9udFNpemUsIG9wdGlvbnMsIGZ1bmN0aW9uKFxuICAgICAgZ2x5cGgsXG4gICAgICBnWCxcbiAgICAgIGdZLFxuICAgICAgZ0ZvbnRTaXplXG4gICAgKSB7XG4gICAgICB2YXIgZ20gPSBnbHlwaC5nZXRNZXRyaWNzKCk7XG4gICAgICB4Q29vcmRzLnB1c2goZ1ggKyBnbS54TWluICogc2NhbGUpO1xuICAgICAgeENvb3Jkcy5wdXNoKGdYICsgZ20ueE1heCAqIHNjYWxlKTtcbiAgICAgIHlDb29yZHMucHVzaChnWSArIC1nbS55TWluICogc2NhbGUpO1xuICAgICAgeUNvb3Jkcy5wdXNoKGdZICsgLWdtLnlNYXggKiBzY2FsZSk7XG4gICAgfSk7XG5cbiAgICBtaW5YID0gTWF0aC5taW4uYXBwbHkobnVsbCwgeENvb3Jkcyk7XG4gICAgbWluWSA9IE1hdGgubWluLmFwcGx5KG51bGwsIHlDb29yZHMpO1xuICAgIG1heFggPSBNYXRoLm1heC5hcHBseShudWxsLCB4Q29vcmRzKTtcbiAgICBtYXhZID0gTWF0aC5tYXguYXBwbHkobnVsbCwgeUNvb3Jkcyk7XG5cbiAgICByZXN1bHQgPSB7XG4gICAgICB4OiBtaW5YLFxuICAgICAgeTogbWluWSxcbiAgICAgIGg6IG1heFkgLSBtaW5ZLFxuICAgICAgdzogbWF4WCAtIG1pblgsXG4gICAgICBhZHZhbmNlOiBtaW5YIC0geFxuICAgIH07XG5cbiAgICAvLyBCb3VuZHMgYXJlIG5vdyBjYWxjdWxhdGVkLCBzbyBzaGlmdCB0aGUgeCAmIHkgdG8gbWF0Y2ggYWxpZ25tZW50IHNldHRpbmdzXG4gICAgcG9zID0gdGhpcy5faGFuZGxlQWxpZ25tZW50KFxuICAgICAgcCxcbiAgICAgIGN0eCxcbiAgICAgIHN0cixcbiAgICAgIHJlc3VsdC54LFxuICAgICAgcmVzdWx0LnksXG4gICAgICByZXN1bHQudyArIHJlc3VsdC5hZHZhbmNlXG4gICAgKTtcblxuICAgIHJlc3VsdC54ID0gcG9zLng7XG4gICAgcmVzdWx0LnkgPSBwb3MueTtcblxuICAgIHRoaXMuY2FjaGVbXG4gICAgICBjYWNoZUtleSgndGV4dEJvdW5kcycsIHN0ciwgeCwgeSwgZm9udFNpemUsIGFsaWdubWVudCwgYmFzZWxpbmUpXG4gICAgXSA9IHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIENvbXB1dGVzIGFuIGFycmF5IG9mIHBvaW50cyBmb2xsb3dpbmcgdGhlIHBhdGggZm9yIHNwZWNpZmllZCB0ZXh0XG4gKlxuICogQG1ldGhvZCB0ZXh0VG9Qb2ludHNcbiAqIEBwYXJhbSAge1N0cmluZ30gdHh0ICAgICBhIGxpbmUgb2YgdGV4dFxuICogQHBhcmFtICB7TnVtYmVyfSB4ICAgICAgICB4LXBvc2l0aW9uXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkgICAgICAgIHktcG9zaXRpb25cbiAqIEBwYXJhbSAge051bWJlcn0gZm9udFNpemUgZm9udCBzaXplIHRvIHVzZSAob3B0aW9uYWwpXG4gKiBAcGFyYW0gIHtPYmplY3R9IFtvcHRpb25zXSBhbiAob3B0aW9uYWwpIG9iamVjdCB0aGF0IGNhbiBjb250YWluOlxuICpcbiAqIDxicj5zYW1wbGVGYWN0b3IgLSB0aGUgcmF0aW8gb2YgcGF0aC1sZW5ndGggdG8gbnVtYmVyIG9mIHNhbXBsZXNcbiAqIChkZWZhdWx0PS4yNSk7IGhpZ2hlciB2YWx1ZXMgeWllbGQgbW9yZSBwb2ludHMgYW5kIGFyZSB0aGVyZWZvcmVcbiAqIG1vcmUgcHJlY2lzZVxuICpcbiAqIDxicj5zaW1wbGlmeVRocmVzaG9sZCAtIGlmIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLCBjb2xsaW5lYXIgcG9pbnRzIHdpbGwgYmVcbiAqIGJlIHJlbW92ZWQgZnJvbSB0aGUgcG9seWdvbjsgdGhlIHZhbHVlIHJlcHJlc2VudHMgdGhlIHRocmVzaG9sZCBhbmdsZSB0byB1c2VcbiAqIHdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0d28gZWRnZXMgYXJlIGNvbGxpbmVhclxuICpcbiAqIEByZXR1cm4ge0FycmF5fSAgYW4gYXJyYXkgb2YgcG9pbnRzLCBlYWNoIHdpdGggeCwgeSwgYWxwaGEgKHRoZSBwYXRoIGFuZ2xlKVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBmb250O1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgZm9udCA9IGxvYWRGb250KCcuL2Fzc2V0cy9BdmVuaXIub3RmJyk7XG4gKiB9XG4gKlxuICogdmFyIHBvaW50cztcbiAqIHZhciBib3VuZHM7XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwKTtcbiAqICAgc3Ryb2tlKDApO1xuICogICBmaWxsKDI1NSwgMTA0LCAyMDQpO1xuICpcbiAqICAgcG9pbnRzID0gZm9udC50ZXh0VG9Qb2ludHMoJ3A1JywgMCwgMCwgMTAsIHtcbiAqICAgICBzYW1wbGVGYWN0b3I6IDUsXG4gKiAgICAgc2ltcGxpZnlUaHJlc2hvbGQ6IDBcbiAqICAgfSk7XG4gKiAgIGJvdW5kcyA9IGZvbnQudGV4dEJvdW5kcygnIHA1ICcsIDAsIDAsIDEwKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDI1NSk7XG4gKiAgIGJlZ2luU2hhcGUoKTtcbiAqICAgdHJhbnNsYXRlKC1ib3VuZHMueCAqIHdpZHRoIC8gYm91bmRzLncsIC1ib3VuZHMueSAqIGhlaWdodCAvIGJvdW5kcy5oKTtcbiAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAqICAgICB2YXIgcCA9IHBvaW50c1tpXTtcbiAqICAgICB2ZXJ0ZXgoXG4gKiAgICAgICBwLnggKiB3aWR0aCAvIGJvdW5kcy53ICtcbiAqICAgICAgICAgc2luKDIwICogcC55IC8gYm91bmRzLmggKyBtaWxsaXMoKSAvIDEwMDApICogd2lkdGggLyAzMCxcbiAqICAgICAgIHAueSAqIGhlaWdodCAvIGJvdW5kcy5oXG4gKiAgICAgKTtcbiAqICAgfVxuICogICBlbmRTaGFwZShDTE9TRSk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKi9cbnA1LkZvbnQucHJvdG90eXBlLnRleHRUb1BvaW50cyA9IGZ1bmN0aW9uKHR4dCwgeCwgeSwgZm9udFNpemUsIG9wdGlvbnMpIHtcbiAgdmFyIHhvZmYgPSAwLFxuICAgIHJlc3VsdCA9IFtdLFxuICAgIGdseXBocyA9IHRoaXMuX2dldEdseXBocyh0eHQpO1xuXG4gIGZ1bmN0aW9uIGlzU3BhY2UoaSkge1xuICAgIHJldHVybiAoXG4gICAgICAoZ2x5cGhzW2ldLm5hbWUgJiYgZ2x5cGhzW2ldLm5hbWUgPT09ICdzcGFjZScpIHx8XG4gICAgICAodHh0Lmxlbmd0aCA9PT0gZ2x5cGhzLmxlbmd0aCAmJiB0eHRbaV0gPT09ICcgJykgfHxcbiAgICAgIChnbHlwaHNbaV0uaW5kZXggJiYgZ2x5cGhzW2ldLmluZGV4ID09PSAzKVxuICAgICk7XG4gIH1cblxuICBmb250U2l6ZSA9IGZvbnRTaXplIHx8IHRoaXMucGFyZW50Ll9yZW5kZXJlci5fdGV4dFNpemU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWlzU3BhY2UoaSkpIHtcbiAgICAgIC8vIGZpeCB0byAjMTgxNywgIzIwNjlcblxuICAgICAgdmFyIGdwYXRoID0gZ2x5cGhzW2ldLmdldFBhdGgoeCwgeSwgZm9udFNpemUpLFxuICAgICAgICBwYXRocyA9IHNwbGl0UGF0aHMoZ3BhdGguY29tbWFuZHMpO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBhdGhzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwdHMgPSBwYXRoVG9Qb2ludHMocGF0aHNbal0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcHRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgcHRzW2tdLnggKz0geG9mZjtcbiAgICAgICAgICByZXN1bHQucHVzaChwdHNba10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgeG9mZiArPSBnbHlwaHNbaV0uYWR2YW5jZVdpZHRoICogdGhpcy5fc2NhbGUoZm9udFNpemUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2V0IG9mIG9wZW50eXBlIGdseXBocyBmb3IgdGhlIHN1cHBsaWVkIHN0cmluZy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm90IGEgc3RyaWN0IG9uZS10by1vbmUgbWFwcGluZyBiZXR3ZWVuIGNoYXJhY3RlcnNcbiAqIGFuZCBnbHlwaHMsIHNvIHRoZSBsaXN0IG9mIHJldHVybmVkIGdseXBocyBjYW4gYmUgbGFyZ2VyIG9yIHNtYWxsZXJcbiAqICB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIHN0cmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWRcbiAqIEByZXR1cm4ge0FycmF5fSAgICAgdGhlIG9wZW50eXBlIGdseXBoc1xuICovXG5wNS5Gb250LnByb3RvdHlwZS5fZ2V0R2x5cGhzID0gZnVuY3Rpb24oc3RyKSB7XG4gIHJldHVybiB0aGlzLmZvbnQuc3RyaW5nVG9HbHlwaHMoc3RyKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvcGVudHlwZSBwYXRoIGZvciB0aGUgc3VwcGxpZWQgc3RyaW5nIGFuZCBwb3NpdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7U3RyaW5nfSBsaW5lICAgICBhIGxpbmUgb2YgdGV4dFxuICogQHBhcmFtICB7TnVtYmVyfSB4ICAgICAgICB4LXBvc2l0aW9uXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkgICAgICAgIHktcG9zaXRpb25cbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyBvcGVudHlwZSBvcHRpb25zIChvcHRpb25hbClcbiAqIEByZXR1cm4ge09iamVjdH0gICAgIHRoZSBvcGVudHlwZSBwYXRoXG4gKi9cbnA1LkZvbnQucHJvdG90eXBlLl9nZXRQYXRoID0gZnVuY3Rpb24obGluZSwgeCwgeSwgb3B0aW9ucykge1xuICB2YXIgcCA9XG4gICAgICAob3B0aW9ucyAmJiBvcHRpb25zLnJlbmRlcmVyICYmIG9wdGlvbnMucmVuZGVyZXIuX3BJbnN0KSB8fCB0aGlzLnBhcmVudCxcbiAgICBjdHggPSBwLl9yZW5kZXJlci5kcmF3aW5nQ29udGV4dCxcbiAgICBwb3MgPSB0aGlzLl9oYW5kbGVBbGlnbm1lbnQocCwgY3R4LCBsaW5lLCB4LCB5KTtcblxuICByZXR1cm4gdGhpcy5mb250LmdldFBhdGgobGluZSwgcG9zLngsIHBvcy55LCBwLl9yZW5kZXJlci5fdGV4dFNpemUsIG9wdGlvbnMpO1xufTtcblxuLypcbiAqIENyZWF0ZXMgYW4gU1ZHLWZvcm1hdHRlZCBwYXRoLWRhdGEgc3RyaW5nXG4gKiAoU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9wYXRocy5odG1sI1BhdGhEYXRhKVxuICogZnJvbSB0aGUgZ2l2ZW4gb3BlbnR5cGUgcGF0aCBvciBzdHJpbmcvcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHBhdGggICAgYW4gb3BlbnR5cGUgcGF0aCwgT1IgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGxpbmUgICAgIGEgbGluZSBvZiB0ZXh0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggICAgICAgIHgtcG9zaXRpb25cbiAqIEBwYXJhbSAge051bWJlcn0geSAgICAgICAgeS1wb3NpdGlvblxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zIG9wZW50eXBlIG9wdGlvbnMgKG9wdGlvbmFsKSwgc2V0IG9wdGlvbnMuZGVjaW1hbHNcbiAqIHRvIHNldCB0aGUgZGVjaW1hbCBwcmVjaXNpb24gb2YgdGhlIHBhdGgtZGF0YVxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gICAgIHRoaXMgcDUuRm9udCBvYmplY3RcbiAqL1xucDUuRm9udC5wcm90b3R5cGUuX2dldFBhdGhEYXRhID0gZnVuY3Rpb24obGluZSwgeCwgeSwgb3B0aW9ucykge1xuICB2YXIgZGVjaW1hbHMgPSAzO1xuXG4gIC8vIGNyZWF0ZSBwYXRoIGZyb20gc3RyaW5nL3Bvc2l0aW9uXG4gIGlmICh0eXBlb2YgbGluZSA9PT0gJ3N0cmluZycgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICBsaW5lID0gdGhpcy5fZ2V0UGF0aChsaW5lLCB4LCB5LCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBoYW5kbGUgb3B0aW9ucyBzcGVjaWZpZWQgaW4gMm5kIGFyZ1xuICAgIG9wdGlvbnMgPSB4O1xuICB9XG5cbiAgLy8gaGFuZGxlIHN2ZyBhcmd1bWVudHNcbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuZGVjaW1hbHMgPT09ICdudW1iZXInKSB7XG4gICAgZGVjaW1hbHMgPSBvcHRpb25zLmRlY2ltYWxzO1xuICB9XG5cbiAgcmV0dXJuIGxpbmUudG9QYXRoRGF0YShkZWNpbWFscyk7XG59O1xuXG4vKlxuICogQ3JlYXRlcyBhbiBTVkcgPHBhdGg+IGVsZW1lbnQsIGFzIGEgc3RyaW5nLFxuICogZnJvbSB0aGUgZ2l2ZW4gb3BlbnR5cGUgcGF0aCBvciBzdHJpbmcvcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHBhdGggICAgYW4gb3BlbnR5cGUgcGF0aCwgT1IgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGxpbmUgICAgIGEgbGluZSBvZiB0ZXh0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggICAgICAgIHgtcG9zaXRpb25cbiAqIEBwYXJhbSAge051bWJlcn0geSAgICAgICAgeS1wb3NpdGlvblxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zIG9wZW50eXBlIG9wdGlvbnMgKG9wdGlvbmFsKSwgc2V0IG9wdGlvbnMuZGVjaW1hbHNcbiAqIHRvIHNldCB0aGUgZGVjaW1hbCBwcmVjaXNpb24gb2YgdGhlIHBhdGgtZGF0YSBpbiB0aGUgPHBhdGg+IGVsZW1lbnQsXG4gKiAgb3B0aW9ucy5maWxsIHRvIHNldCB0aGUgZmlsbCBjb2xvciBmb3IgdGhlIDxwYXRoPiBlbGVtZW50LFxuICogIG9wdGlvbnMuc3Ryb2tlIHRvIHNldCB0aGUgc3Ryb2tlIGNvbG9yIGZvciB0aGUgPHBhdGg+IGVsZW1lbnQsXG4gKiAgb3B0aW9ucy5zdHJva2VXaWR0aCB0byBzZXQgdGhlIHN0cm9rZVdpZHRoIGZvciB0aGUgPHBhdGg+IGVsZW1lbnQuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSAgICAgdGhpcyBwNS5Gb250IG9iamVjdFxuICovXG5wNS5Gb250LnByb3RvdHlwZS5fZ2V0U1ZHID0gZnVuY3Rpb24obGluZSwgeCwgeSwgb3B0aW9ucykge1xuICB2YXIgZGVjaW1hbHMgPSAzO1xuXG4gIC8vIGNyZWF0ZSBwYXRoIGZyb20gc3RyaW5nL3Bvc2l0aW9uXG4gIGlmICh0eXBlb2YgbGluZSA9PT0gJ3N0cmluZycgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICBsaW5lID0gdGhpcy5fZ2V0UGF0aChsaW5lLCB4LCB5LCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBoYW5kbGUgb3B0aW9ucyBzcGVjaWZpZWQgaW4gMm5kIGFyZ1xuICAgIG9wdGlvbnMgPSB4O1xuICB9XG5cbiAgLy8gaGFuZGxlIHN2ZyBhcmd1bWVudHNcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVjaW1hbHMgPT09ICdudW1iZXInKSB7XG4gICAgICBkZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdHJva2VXaWR0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGxpbmUuc3Ryb2tlV2lkdGggPSBvcHRpb25zLnN0cm9rZVdpZHRoO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmlsbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxpbmUuZmlsbCA9IG9wdGlvbnMuZmlsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnN0cm9rZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxpbmUuc3Ryb2tlID0gb3B0aW9ucy5zdHJva2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxpbmUudG9TVkcoZGVjaW1hbHMpO1xufTtcblxuLypcbiAqIFJlbmRlcnMgYW4gb3BlbnR5cGUgcGF0aCBvciBzdHJpbmcvcG9zaXRpb25cbiAqIHRvIHRoZSBjdXJyZW50IGdyYXBoaWNzIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHBhdGggICAgYW4gb3BlbnR5cGUgcGF0aCwgT1IgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGxpbmUgICAgIGEgbGluZSBvZiB0ZXh0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggICAgICAgIHgtcG9zaXRpb25cbiAqIEBwYXJhbSAge051bWJlcn0geSAgICAgICAgeS1wb3NpdGlvblxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zIG9wZW50eXBlIG9wdGlvbnMgKG9wdGlvbmFsKVxuICpcbiAqIEByZXR1cm4ge3A1LkZvbnR9ICAgICB0aGlzIHA1LkZvbnQgb2JqZWN0XG4gKi9cbnA1LkZvbnQucHJvdG90eXBlLl9yZW5kZXJQYXRoID0gZnVuY3Rpb24obGluZSwgeCwgeSwgb3B0aW9ucykge1xuICB2YXIgcGRhdGEsXG4gICAgcGcgPSAob3B0aW9ucyAmJiBvcHRpb25zLnJlbmRlcmVyKSB8fCB0aGlzLnBhcmVudC5fcmVuZGVyZXIsXG4gICAgY3R4ID0gcGcuZHJhd2luZ0NvbnRleHQ7XG5cbiAgaWYgKHR5cGVvZiBsaW5lID09PSAnb2JqZWN0JyAmJiBsaW5lLmNvbW1hbmRzKSB7XG4gICAgcGRhdGEgPSBsaW5lLmNvbW1hbmRzO1xuICB9IGVsc2Uge1xuICAgIC8vcG9zID0gaGFuZGxlQWxpZ25tZW50KHAsIGN0eCwgbGluZSwgeCwgeSk7XG4gICAgcGRhdGEgPSB0aGlzLl9nZXRQYXRoKGxpbmUsIHgsIHksIG9wdGlvbnMpLmNvbW1hbmRzO1xuICB9XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBkYXRhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGNtZCA9IHBkYXRhW2ldO1xuICAgIGlmIChjbWQudHlwZSA9PT0gJ00nKSB7XG4gICAgICBjdHgubW92ZVRvKGNtZC54LCBjbWQueSk7XG4gICAgfSBlbHNlIGlmIChjbWQudHlwZSA9PT0gJ0wnKSB7XG4gICAgICBjdHgubGluZVRvKGNtZC54LCBjbWQueSk7XG4gICAgfSBlbHNlIGlmIChjbWQudHlwZSA9PT0gJ0MnKSB7XG4gICAgICBjdHguYmV6aWVyQ3VydmVUbyhjbWQueDEsIGNtZC55MSwgY21kLngyLCBjbWQueTIsIGNtZC54LCBjbWQueSk7XG4gICAgfSBlbHNlIGlmIChjbWQudHlwZSA9PT0gJ1EnKSB7XG4gICAgICBjdHgucXVhZHJhdGljQ3VydmVUbyhjbWQueDEsIGNtZC55MSwgY21kLngsIGNtZC55KTtcbiAgICB9IGVsc2UgaWYgKGNtZC50eXBlID09PSAnWicpIHtcbiAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICB9XG4gIH1cblxuICAvLyBvbmx5IGRyYXcgc3Ryb2tlIGlmIG1hbnVhbGx5IHNldCBieSB1c2VyXG4gIGlmIChwZy5fZG9TdHJva2UgJiYgcGcuX3N0cm9rZVNldCkge1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfVxuXG4gIGlmIChwZy5fZG9GaWxsKSB7XG4gICAgLy8gaWYgZmlsbCBoYXNuJ3QgYmVlbiBzZXQgYnkgdXNlciwgdXNlIGRlZmF1bHQtdGV4dC1maWxsXG4gICAgaWYgKCFwZy5fZmlsbFNldCkge1xuICAgICAgcGcuX3NldEZpbGwoY29uc3RhbnRzLl9ERUZBVUxUX1RFWFRfRklMTCk7XG4gICAgfVxuICAgIGN0eC5maWxsKCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LkZvbnQucHJvdG90eXBlLl90ZXh0V2lkdGggPSBmdW5jdGlvbihzdHIsIGZvbnRTaXplKSB7XG4gIHJldHVybiB0aGlzLmZvbnQuZ2V0QWR2YW5jZVdpZHRoKHN0ciwgZm9udFNpemUpO1xufTtcblxucDUuRm9udC5wcm90b3R5cGUuX3RleHRBc2NlbnQgPSBmdW5jdGlvbihmb250U2l6ZSkge1xuICByZXR1cm4gdGhpcy5mb250LmFzY2VuZGVyICogdGhpcy5fc2NhbGUoZm9udFNpemUpO1xufTtcblxucDUuRm9udC5wcm90b3R5cGUuX3RleHREZXNjZW50ID0gZnVuY3Rpb24oZm9udFNpemUpIHtcbiAgcmV0dXJuIC10aGlzLmZvbnQuZGVzY2VuZGVyICogdGhpcy5fc2NhbGUoZm9udFNpemUpO1xufTtcblxucDUuRm9udC5wcm90b3R5cGUuX3NjYWxlID0gZnVuY3Rpb24oZm9udFNpemUpIHtcbiAgcmV0dXJuIChcbiAgICAxIC8gdGhpcy5mb250LnVuaXRzUGVyRW0gKiAoZm9udFNpemUgfHwgdGhpcy5wYXJlbnQuX3JlbmRlcmVyLl90ZXh0U2l6ZSlcbiAgKTtcbn07XG5cbnA1LkZvbnQucHJvdG90eXBlLl9oYW5kbGVBbGlnbm1lbnQgPSBmdW5jdGlvbihwLCBjdHgsIGxpbmUsIHgsIHksIHRleHRXaWR0aCkge1xuICB2YXIgZm9udFNpemUgPSBwLl9yZW5kZXJlci5fdGV4dFNpemUsXG4gICAgdGV4dEFzY2VudCA9IHRoaXMuX3RleHRBc2NlbnQoZm9udFNpemUpLFxuICAgIHRleHREZXNjZW50ID0gdGhpcy5fdGV4dERlc2NlbnQoZm9udFNpemUpO1xuXG4gIHRleHRXaWR0aCA9XG4gICAgdGV4dFdpZHRoICE9PSB1bmRlZmluZWQgPyB0ZXh0V2lkdGggOiB0aGlzLl90ZXh0V2lkdGgobGluZSwgZm9udFNpemUpO1xuXG4gIGlmIChjdHgudGV4dEFsaWduID09PSBjb25zdGFudHMuQ0VOVEVSKSB7XG4gICAgeCAtPSB0ZXh0V2lkdGggLyAyO1xuICB9IGVsc2UgaWYgKGN0eC50ZXh0QWxpZ24gPT09IGNvbnN0YW50cy5SSUdIVCkge1xuICAgIHggLT0gdGV4dFdpZHRoO1xuICB9XG5cbiAgaWYgKGN0eC50ZXh0QmFzZWxpbmUgPT09IGNvbnN0YW50cy5UT1ApIHtcbiAgICB5ICs9IHRleHRBc2NlbnQ7XG4gIH0gZWxzZSBpZiAoY3R4LnRleHRCYXNlbGluZSA9PT0gY29uc3RhbnRzLl9DVFhfTUlERExFKSB7XG4gICAgeSArPSB0ZXh0QXNjZW50IC8gMjtcbiAgfSBlbHNlIGlmIChjdHgudGV4dEJhc2VsaW5lID09PSBjb25zdGFudHMuQk9UVE9NKSB7XG4gICAgeSAtPSB0ZXh0RGVzY2VudDtcbiAgfVxuXG4gIHJldHVybiB7IHg6IHgsIHk6IHkgfTtcbn07XG5cbi8vIHBhdGgtdXRpbHNcblxuZnVuY3Rpb24gcGF0aFRvUG9pbnRzKGNtZHMsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBwYXJzZU9wdHMob3B0aW9ucywge1xuICAgIHNhbXBsZUZhY3RvcjogMC4xLFxuICAgIHNpbXBsaWZ5VGhyZXNob2xkOiAwXG4gIH0pO1xuXG4gIHZhciBsZW4gPSBwb2ludEF0TGVuZ3RoKGNtZHMsIDAsIDEpLCAvLyB0b3RhbC1sZW5ndGhcbiAgICB0ID0gbGVuIC8gKGxlbiAqIG9wdHMuc2FtcGxlRmFjdG9yKSxcbiAgICBwdHMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSB0KSB7XG4gICAgcHRzLnB1c2gocG9pbnRBdExlbmd0aChjbWRzLCBpKSk7XG4gIH1cblxuICBpZiAob3B0cy5zaW1wbGlmeVRocmVzaG9sZCkge1xuICAgIC8qdmFyIGNvdW50ID0gKi8gc2ltcGxpZnkocHRzLCBvcHRzLnNpbXBsaWZ5VGhyZXNob2xkKTtcbiAgICAvL2NvbnNvbGUubG9nKCdTaW1wbGlmeTogcmVtb3ZlZCAnICsgY291bnQgKyAnIHB0cycpO1xuICB9XG5cbiAgcmV0dXJuIHB0cztcbn1cblxuZnVuY3Rpb24gc2ltcGxpZnkocHRzLCBhbmdsZSkge1xuICBhbmdsZSA9IHR5cGVvZiBhbmdsZSA9PT0gJ3VuZGVmaW5lZCcgPyAwIDogYW5nbGU7XG5cbiAgdmFyIG51bSA9IDA7XG4gIGZvciAodmFyIGkgPSBwdHMubGVuZ3RoIC0gMTsgcHRzLmxlbmd0aCA+IDMgJiYgaSA+PSAwOyAtLWkpIHtcbiAgICBpZiAoY29sbGluZWFyKGF0KHB0cywgaSAtIDEpLCBhdChwdHMsIGkpLCBhdChwdHMsIGkgKyAxKSwgYW5nbGUpKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIG1pZGRsZSBwb2ludFxuICAgICAgcHRzLnNwbGljZShpICUgcHRzLmxlbmd0aCwgMSk7XG4gICAgICBudW0rKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bTtcbn1cblxuZnVuY3Rpb24gc3BsaXRQYXRocyhjbWRzKSB7XG4gIHZhciBwYXRocyA9IFtdLFxuICAgIGN1cnJlbnQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjbWRzW2ldLnR5cGUgPT09ICdNJykge1xuICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgcGF0aHMucHVzaChjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBbXTtcbiAgICB9XG4gICAgY3VycmVudC5wdXNoKGNtZFRvQXJyKGNtZHNbaV0pKTtcbiAgfVxuICBwYXRocy5wdXNoKGN1cnJlbnQpO1xuXG4gIHJldHVybiBwYXRocztcbn1cblxuZnVuY3Rpb24gY21kVG9BcnIoY21kKSB7XG4gIHZhciBhcnIgPSBbY21kLnR5cGVdO1xuICBpZiAoY21kLnR5cGUgPT09ICdNJyB8fCBjbWQudHlwZSA9PT0gJ0wnKSB7XG4gICAgLy8gbW92ZXRvIG9yIGxpbmV0b1xuICAgIGFyci5wdXNoKGNtZC54LCBjbWQueSk7XG4gIH0gZWxzZSBpZiAoY21kLnR5cGUgPT09ICdDJykge1xuICAgIGFyci5wdXNoKGNtZC54MSwgY21kLnkxLCBjbWQueDIsIGNtZC55MiwgY21kLngsIGNtZC55KTtcbiAgfSBlbHNlIGlmIChjbWQudHlwZSA9PT0gJ1EnKSB7XG4gICAgYXJyLnB1c2goY21kLngxLCBjbWQueTEsIGNtZC54LCBjbWQueSk7XG4gIH1cbiAgLy8gZWxzZSBpZiAoY21kLnR5cGUgPT09ICdaJykgeyAvKiBuby1vcCAqLyB9XG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT3B0cyhvcHRpb25zLCBkZWZhdWx0cykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IGRlZmF1bHRzO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGtleSBpbiBkZWZhdWx0cykge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IGRlZmF1bHRzW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmZ1bmN0aW9uIGF0KHYsIGkpIHtcbiAgdmFyIHMgPSB2Lmxlbmd0aDtcbiAgcmV0dXJuIHZbaSA8IDAgPyBpICUgcyArIHMgOiBpICUgc107XG59XG5cbmZ1bmN0aW9uIGNvbGxpbmVhcihhLCBiLCBjLCB0aHJlc2hvbGRBbmdsZSkge1xuICBpZiAoIXRocmVzaG9sZEFuZ2xlKSB7XG4gICAgcmV0dXJuIGFyZWFUcmlhbmdsZShhLCBiLCBjKSA9PT0gMDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29sbGluZWFyLnRtcFBvaW50MSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb2xsaW5lYXIudG1wUG9pbnQxID0gW107XG4gICAgY29sbGluZWFyLnRtcFBvaW50MiA9IFtdO1xuICB9XG5cbiAgdmFyIGFiID0gY29sbGluZWFyLnRtcFBvaW50MSxcbiAgICBiYyA9IGNvbGxpbmVhci50bXBQb2ludDI7XG4gIGFiLnggPSBiLnggLSBhLng7XG4gIGFiLnkgPSBiLnkgLSBhLnk7XG4gIGJjLnggPSBjLnggLSBiLng7XG4gIGJjLnkgPSBjLnkgLSBiLnk7XG5cbiAgdmFyIGRvdCA9IGFiLnggKiBiYy54ICsgYWIueSAqIGJjLnksXG4gICAgbWFnQSA9IE1hdGguc3FydChhYi54ICogYWIueCArIGFiLnkgKiBhYi55KSxcbiAgICBtYWdCID0gTWF0aC5zcXJ0KGJjLnggKiBiYy54ICsgYmMueSAqIGJjLnkpLFxuICAgIGFuZ2xlID0gTWF0aC5hY29zKGRvdCAvIChtYWdBICogbWFnQikpO1xuXG4gIHJldHVybiBhbmdsZSA8IHRocmVzaG9sZEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmVhVHJpYW5nbGUoYSwgYiwgYykge1xuICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChjWzFdIC0gYVsxXSkgLSAoY1swXSAtIGFbMF0pICogKGJbMV0gLSBhWzFdKTtcbn1cblxuLy8gUG9ydGlvbnMgb2YgYmVsb3cgY29kZSBjb3B5cmlnaHQgMjAwOCBEbWl0cnkgQmFyYW5vdnNraXkgKHZpYSBNSVQgbGljZW5zZSlcblxuZnVuY3Rpb24gZmluZERvdHNBdFNlZ21lbnQocDF4LCBwMXksIGMxeCwgYzF5LCBjMngsIGMyeSwgcDJ4LCBwMnksIHQpIHtcbiAgdmFyIHQxID0gMSAtIHQsXG4gICAgdDEzID0gTWF0aC5wb3codDEsIDMpLFxuICAgIHQxMiA9IE1hdGgucG93KHQxLCAyKSxcbiAgICB0MiA9IHQgKiB0LFxuICAgIHQzID0gdDIgKiB0LFxuICAgIHggPSB0MTMgKiBwMXggKyB0MTIgKiAzICogdCAqIGMxeCArIHQxICogMyAqIHQgKiB0ICogYzJ4ICsgdDMgKiBwMngsXG4gICAgeSA9IHQxMyAqIHAxeSArIHQxMiAqIDMgKiB0ICogYzF5ICsgdDEgKiAzICogdCAqIHQgKiBjMnkgKyB0MyAqIHAyeSxcbiAgICBteCA9IHAxeCArIDIgKiB0ICogKGMxeCAtIHAxeCkgKyB0MiAqIChjMnggLSAyICogYzF4ICsgcDF4KSxcbiAgICBteSA9IHAxeSArIDIgKiB0ICogKGMxeSAtIHAxeSkgKyB0MiAqIChjMnkgLSAyICogYzF5ICsgcDF5KSxcbiAgICBueCA9IGMxeCArIDIgKiB0ICogKGMyeCAtIGMxeCkgKyB0MiAqIChwMnggLSAyICogYzJ4ICsgYzF4KSxcbiAgICBueSA9IGMxeSArIDIgKiB0ICogKGMyeSAtIGMxeSkgKyB0MiAqIChwMnkgLSAyICogYzJ5ICsgYzF5KSxcbiAgICBheCA9IHQxICogcDF4ICsgdCAqIGMxeCxcbiAgICBheSA9IHQxICogcDF5ICsgdCAqIGMxeSxcbiAgICBjeCA9IHQxICogYzJ4ICsgdCAqIHAyeCxcbiAgICBjeSA9IHQxICogYzJ5ICsgdCAqIHAyeSxcbiAgICBhbHBoYSA9IDkwIC0gTWF0aC5hdGFuMihteCAtIG54LCBteSAtIG55KSAqIDE4MCAvIE1hdGguUEk7XG5cbiAgaWYgKG14ID4gbnggfHwgbXkgPCBueSkge1xuICAgIGFscGhhICs9IDE4MDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogeCxcbiAgICB5OiB5LFxuICAgIG06IHsgeDogbXgsIHk6IG15IH0sXG4gICAgbjogeyB4OiBueCwgeTogbnkgfSxcbiAgICBzdGFydDogeyB4OiBheCwgeTogYXkgfSxcbiAgICBlbmQ6IHsgeDogY3gsIHk6IGN5IH0sXG4gICAgYWxwaGE6IGFscGhhXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBvaW50QXRTZWdtZW50TGVuZ3RoKFxuICBwMXgsXG4gIHAxeSxcbiAgYzF4LFxuICBjMXksXG4gIGMyeCxcbiAgYzJ5LFxuICBwMngsXG4gIHAyeSxcbiAgbGVuZ3RoXG4pIHtcbiAgcmV0dXJuIGxlbmd0aCA9PSBudWxsXG4gICAgPyBiZXpsZW4ocDF4LCBwMXksIGMxeCwgYzF5LCBjMngsIGMyeSwgcDJ4LCBwMnkpXG4gICAgOiBmaW5kRG90c0F0U2VnbWVudChcbiAgICAgICAgcDF4LFxuICAgICAgICBwMXksXG4gICAgICAgIGMxeCxcbiAgICAgICAgYzF5LFxuICAgICAgICBjMngsXG4gICAgICAgIGMyeSxcbiAgICAgICAgcDJ4LFxuICAgICAgICBwMnksXG4gICAgICAgIGdldFRhdExlbihwMXgsIHAxeSwgYzF4LCBjMXksIGMyeCwgYzJ5LCBwMngsIHAyeSwgbGVuZ3RoKVxuICAgICAgKTtcbn1cblxuZnVuY3Rpb24gcG9pbnRBdExlbmd0aChwYXRoLCBsZW5ndGgsIGlzdG90YWwpIHtcbiAgcGF0aCA9IHBhdGgyY3VydmUocGF0aCk7XG4gIHZhciB4LFxuICAgIHksXG4gICAgcCxcbiAgICBsLFxuICAgIHNwID0gJycsXG4gICAgc3VicGF0aHMgPSB7fSxcbiAgICBwb2ludCxcbiAgICBsZW4gPSAwO1xuICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYXRoLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICBwID0gcGF0aFtpXTtcbiAgICBpZiAocFswXSA9PT0gJ00nKSB7XG4gICAgICB4ID0gK3BbMV07XG4gICAgICB5ID0gK3BbMl07XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBnZXRQb2ludEF0U2VnbWVudExlbmd0aCh4LCB5LCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBwWzZdKTtcbiAgICAgIGlmIChsZW4gKyBsID4gbGVuZ3RoKSB7XG4gICAgICAgIGlmICghaXN0b3RhbCkge1xuICAgICAgICAgIHBvaW50ID0gZ2V0UG9pbnRBdFNlZ21lbnRMZW5ndGgoXG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIHBbMV0sXG4gICAgICAgICAgICBwWzJdLFxuICAgICAgICAgICAgcFszXSxcbiAgICAgICAgICAgIHBbNF0sXG4gICAgICAgICAgICBwWzVdLFxuICAgICAgICAgICAgcFs2XSxcbiAgICAgICAgICAgIGxlbmd0aCAtIGxlblxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHsgeDogcG9pbnQueCwgeTogcG9pbnQueSwgYWxwaGE6IHBvaW50LmFscGhhIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxlbiArPSBsO1xuICAgICAgeCA9ICtwWzVdO1xuICAgICAgeSA9ICtwWzZdO1xuICAgIH1cbiAgICBzcCArPSBwLnNoaWZ0KCkgKyBwO1xuICB9XG4gIHN1YnBhdGhzLmVuZCA9IHNwO1xuXG4gIHBvaW50ID0gaXN0b3RhbFxuICAgID8gbGVuXG4gICAgOiBmaW5kRG90c0F0U2VnbWVudCh4LCB5LCBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCAxKTtcblxuICBpZiAocG9pbnQuYWxwaGEpIHtcbiAgICBwb2ludCA9IHsgeDogcG9pbnQueCwgeTogcG9pbnQueSwgYWxwaGE6IHBvaW50LmFscGhhIH07XG4gIH1cblxuICByZXR1cm4gcG9pbnQ7XG59XG5cbmZ1bmN0aW9uIHBhdGhUb0Fic29sdXRlKHBhdGhBcnJheSkge1xuICB2YXIgcmVzID0gW10sXG4gICAgeCA9IDAsXG4gICAgeSA9IDAsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBzdGFydCA9IDA7XG4gIGlmICghcGF0aEFycmF5KSB7XG4gICAgLy8gY29uc29sZS53YXJuKFwiVW5leHBlY3RlZCBzdGF0ZTogdW5kZWZpbmVkIHBhdGhBcnJheVwiKTsgLy8gc2hvdWxkbid0IGhhcHBlblxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKHBhdGhBcnJheVswXVswXSA9PT0gJ00nKSB7XG4gICAgeCA9ICtwYXRoQXJyYXlbMF1bMV07XG4gICAgeSA9ICtwYXRoQXJyYXlbMF1bMl07XG4gICAgbXggPSB4O1xuICAgIG15ID0geTtcbiAgICBzdGFydCsrO1xuICAgIHJlc1swXSA9IFsnTScsIHgsIHldO1xuICB9XG5cbiAgdmFyIGRvdHMsXG4gICAgY3J6ID1cbiAgICAgIHBhdGhBcnJheS5sZW5ndGggPT09IDMgJiZcbiAgICAgIHBhdGhBcnJheVswXVswXSA9PT0gJ00nICYmXG4gICAgICBwYXRoQXJyYXlbMV1bMF0udG9VcHBlckNhc2UoKSA9PT0gJ1InICYmXG4gICAgICBwYXRoQXJyYXlbMl1bMF0udG9VcHBlckNhc2UoKSA9PT0gJ1onO1xuXG4gIGZvciAodmFyIHIsIHBhLCBpID0gc3RhcnQsIGlpID0gcGF0aEFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICByZXMucHVzaCgociA9IFtdKSk7XG4gICAgcGEgPSBwYXRoQXJyYXlbaV07XG4gICAgaWYgKHBhWzBdICE9PSBTdHJpbmcucHJvdG90eXBlLnRvVXBwZXJDYXNlLmNhbGwocGFbMF0pKSB7XG4gICAgICByWzBdID0gU3RyaW5nLnByb3RvdHlwZS50b1VwcGVyQ2FzZS5jYWxsKHBhWzBdKTtcbiAgICAgIHN3aXRjaCAoclswXSkge1xuICAgICAgICBjYXNlICdBJzpcbiAgICAgICAgICByWzFdID0gcGFbMV07XG4gICAgICAgICAgclsyXSA9IHBhWzJdO1xuICAgICAgICAgIHJbM10gPSBwYVszXTtcbiAgICAgICAgICByWzRdID0gcGFbNF07XG4gICAgICAgICAgcls1XSA9IHBhWzVdO1xuICAgICAgICAgIHJbNl0gPSArKHBhWzZdICsgeCk7XG4gICAgICAgICAgcls3XSA9ICsocGFbN10gKyB5KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVic6XG4gICAgICAgICAgclsxXSA9ICtwYVsxXSArIHk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgIHJbMV0gPSArcGFbMV0gKyB4O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdSJzpcbiAgICAgICAgICBkb3RzID0gW3gsIHldLmNvbmNhdChwYS5zbGljZSgxKSk7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDIsIGpqID0gZG90cy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgICBkb3RzW2pdID0gK2RvdHNbal0gKyB4O1xuICAgICAgICAgICAgZG90c1srK2pdID0gK2RvdHNbal0gKyB5O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMucG9wKCk7XG4gICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChjYXRtdWxsUm9tMmJlemllcihkb3RzLCBjcnopKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgbXggPSArcGFbMV0gKyB4O1xuICAgICAgICAgIG15ID0gK3BhWzJdICsgeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBmb3IgKGogPSAxLCBqaiA9IHBhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgIHJbal0gPSArcGFbal0gKyAoaiAlIDIgPyB4IDogeSk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGFbMF0gPT09ICdSJykge1xuICAgICAgZG90cyA9IFt4LCB5XS5jb25jYXQocGEuc2xpY2UoMSkpO1xuICAgICAgcmVzLnBvcCgpO1xuICAgICAgcmVzID0gcmVzLmNvbmNhdChjYXRtdWxsUm9tMmJlemllcihkb3RzLCBjcnopKTtcbiAgICAgIHIgPSBbJ1InXS5jb25jYXQocGEuc2xpY2UoLTIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgayA9IDAsIGtrID0gcGEubGVuZ3RoOyBrIDwga2s7IGsrKykge1xuICAgICAgICByW2tdID0gcGFba107XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoclswXSkge1xuICAgICAgY2FzZSAnWic6XG4gICAgICAgIHggPSBteDtcbiAgICAgICAgeSA9IG15O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0gnOlxuICAgICAgICB4ID0gclsxXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdWJzpcbiAgICAgICAgeSA9IHJbMV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnTSc6XG4gICAgICAgIG14ID0gcltyLmxlbmd0aCAtIDJdO1xuICAgICAgICBteSA9IHJbci5sZW5ndGggLSAxXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB4ID0gcltyLmxlbmd0aCAtIDJdO1xuICAgICAgICB5ID0gcltyLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBwYXRoMmN1cnZlKHBhdGgsIHBhdGgyKSB7XG4gIHZhciBwID0gcGF0aFRvQWJzb2x1dGUocGF0aCksXG4gICAgcDIgPSBwYXRoMiAmJiBwYXRoVG9BYnNvbHV0ZShwYXRoMik7XG4gIHZhciBhdHRycyA9IHsgeDogMCwgeTogMCwgYng6IDAsIGJ5OiAwLCBYOiAwLCBZOiAwLCBxeDogbnVsbCwgcXk6IG51bGwgfTtcbiAgdmFyIGF0dHJzMiA9IHsgeDogMCwgeTogMCwgYng6IDAsIGJ5OiAwLCBYOiAwLCBZOiAwLCBxeDogbnVsbCwgcXk6IG51bGwgfTtcbiAgdmFyIHBjb21zMSA9IFtdOyAvLyBwYXRoIGNvbW1hbmRzIG9mIG9yaWdpbmFsIHBhdGggcFxuICB2YXIgcGNvbXMyID0gW107IC8vIHBhdGggY29tbWFuZHMgb2Ygb3JpZ2luYWwgcGF0aCBwMlxuICB2YXIgaWk7XG5cbiAgdmFyIHByb2Nlc3NQYXRoID0gZnVuY3Rpb24ocGF0aCwgZCwgcGNvbSkge1xuICAgICAgdmFyIG54LFxuICAgICAgICBueSxcbiAgICAgICAgdHEgPSB7IFQ6IDEsIFE6IDEgfTtcbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICByZXR1cm4gWydDJywgZC54LCBkLnksIGQueCwgZC55LCBkLngsIGQueV07XG4gICAgICB9XG4gICAgICBpZiAoIShwYXRoWzBdIGluIHRxKSkge1xuICAgICAgICBkLnF4ID0gZC5xeSA9IG51bGw7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHBhdGhbMF0pIHtcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgZC5YID0gcGF0aFsxXTtcbiAgICAgICAgICBkLlkgPSBwYXRoWzJdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdBJzpcbiAgICAgICAgICBwYXRoID0gWydDJ10uY29uY2F0KGEyYy5hcHBseSgwLCBbZC54LCBkLnldLmNvbmNhdChwYXRoLnNsaWNlKDEpKSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICBpZiAocGNvbSA9PT0gJ0MnIHx8IHBjb20gPT09ICdTJykge1xuICAgICAgICAgICAgbnggPSBkLnggKiAyIC0gZC5ieDtcbiAgICAgICAgICAgIG55ID0gZC55ICogMiAtIGQuYnk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG54ID0gZC54O1xuICAgICAgICAgICAgbnkgPSBkLnk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGggPSBbJ0MnLCBueCwgbnldLmNvbmNhdChwYXRoLnNsaWNlKDEpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgaWYgKHBjb20gPT09ICdRJyB8fCBwY29tID09PSAnVCcpIHtcbiAgICAgICAgICAgIGQucXggPSBkLnggKiAyIC0gZC5xeDtcbiAgICAgICAgICAgIGQucXkgPSBkLnkgKiAyIC0gZC5xeTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZC5xeCA9IGQueDtcbiAgICAgICAgICAgIGQucXkgPSBkLnk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGggPSBbJ0MnXS5jb25jYXQocTJjKGQueCwgZC55LCBkLnF4LCBkLnF5LCBwYXRoWzFdLCBwYXRoWzJdKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgIGQucXggPSBwYXRoWzFdO1xuICAgICAgICAgIGQucXkgPSBwYXRoWzJdO1xuICAgICAgICAgIHBhdGggPSBbJ0MnXS5jb25jYXQoXG4gICAgICAgICAgICBxMmMoZC54LCBkLnksIHBhdGhbMV0sIHBhdGhbMl0sIHBhdGhbM10sIHBhdGhbNF0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgcGF0aCA9IFsnQyddLmNvbmNhdChsMmMoZC54LCBkLnksIHBhdGhbMV0sIHBhdGhbMl0pKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgICAgcGF0aCA9IFsnQyddLmNvbmNhdChsMmMoZC54LCBkLnksIHBhdGhbMV0sIGQueSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICBwYXRoID0gWydDJ10uY29uY2F0KGwyYyhkLngsIGQueSwgZC54LCBwYXRoWzFdKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1onOlxuICAgICAgICAgIHBhdGggPSBbJ0MnXS5jb25jYXQobDJjKGQueCwgZC55LCBkLlgsIGQuWSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSxcbiAgICBmaXhBcmMgPSBmdW5jdGlvbihwcCwgaSkge1xuICAgICAgaWYgKHBwW2ldLmxlbmd0aCA+IDcpIHtcbiAgICAgICAgcHBbaV0uc2hpZnQoKTtcbiAgICAgICAgdmFyIHBpID0gcHBbaV07XG4gICAgICAgIHdoaWxlIChwaS5sZW5ndGgpIHtcbiAgICAgICAgICBwY29tczFbaV0gPSAnQSc7XG4gICAgICAgICAgaWYgKHAyKSB7XG4gICAgICAgICAgICBwY29tczJbaV0gPSAnQSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBwLnNwbGljZShpKyssIDAsIFsnQyddLmNvbmNhdChwaS5zcGxpY2UoMCwgNikpKTtcbiAgICAgICAgfVxuICAgICAgICBwcC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGlpID0gTWF0aC5tYXgocC5sZW5ndGgsIChwMiAmJiBwMi5sZW5ndGgpIHx8IDApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZml4TSA9IGZ1bmN0aW9uKHBhdGgxLCBwYXRoMiwgYTEsIGEyLCBpKSB7XG4gICAgICBpZiAocGF0aDEgJiYgcGF0aDIgJiYgcGF0aDFbaV1bMF0gPT09ICdNJyAmJiBwYXRoMltpXVswXSAhPT0gJ00nKSB7XG4gICAgICAgIHBhdGgyLnNwbGljZShpLCAwLCBbJ00nLCBhMi54LCBhMi55XSk7XG4gICAgICAgIGExLmJ4ID0gMDtcbiAgICAgICAgYTEuYnkgPSAwO1xuICAgICAgICBhMS54ID0gcGF0aDFbaV1bMV07XG4gICAgICAgIGExLnkgPSBwYXRoMVtpXVsyXTtcbiAgICAgICAgaWkgPSBNYXRoLm1heChwLmxlbmd0aCwgKHAyICYmIHAyLmxlbmd0aCkgfHwgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICB2YXIgcGZpcnN0ID0gJyc7IC8vIHRlbXBvcmFyeSBob2xkZXIgZm9yIG9yaWdpbmFsIHBhdGggY29tbWFuZFxuICB2YXIgcGNvbSA9ICcnOyAvLyBob2xkZXIgZm9yIHByZXZpb3VzIHBhdGggY29tbWFuZCBvZiBvcmlnaW5hbCBwYXRoXG5cbiAgaWkgPSBNYXRoLm1heChwLmxlbmd0aCwgKHAyICYmIHAyLmxlbmd0aCkgfHwgMCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaWk7IGkrKykge1xuICAgIGlmIChwW2ldKSB7XG4gICAgICBwZmlyc3QgPSBwW2ldWzBdO1xuICAgIH0gLy8gc2F2ZSBjdXJyZW50IHBhdGggY29tbWFuZFxuXG4gICAgaWYgKHBmaXJzdCAhPT0gJ0MnKSB7XG4gICAgICBwY29tczFbaV0gPSBwZmlyc3Q7IC8vIFNhdmUgY3VycmVudCBwYXRoIGNvbW1hbmRcbiAgICAgIGlmIChpKSB7XG4gICAgICAgIHBjb20gPSBwY29tczFbaSAtIDFdO1xuICAgICAgfSAvLyBHZXQgcHJldmlvdXMgcGF0aCBjb21tYW5kIHBjb21cbiAgICB9XG4gICAgcFtpXSA9IHByb2Nlc3NQYXRoKHBbaV0sIGF0dHJzLCBwY29tKTtcblxuICAgIGlmIChwY29tczFbaV0gIT09ICdBJyAmJiBwZmlyc3QgPT09ICdDJykge1xuICAgICAgcGNvbXMxW2ldID0gJ0MnO1xuICAgIH1cblxuICAgIGZpeEFyYyhwLCBpKTsgLy8gZml4QXJjIGFkZHMgYWxzbyB0aGUgcmlnaHQgYW1vdW50IG9mIEE6cyB0byBwY29tczFcblxuICAgIGlmIChwMikge1xuICAgICAgLy8gdGhlIHNhbWUgcHJvY2VkdXJlcyBpcyBkb25lIHRvIHAyXG4gICAgICBpZiAocDJbaV0pIHtcbiAgICAgICAgcGZpcnN0ID0gcDJbaV1bMF07XG4gICAgICB9XG4gICAgICBpZiAocGZpcnN0ICE9PSAnQycpIHtcbiAgICAgICAgcGNvbXMyW2ldID0gcGZpcnN0O1xuICAgICAgICBpZiAoaSkge1xuICAgICAgICAgIHBjb20gPSBwY29tczJbaSAtIDFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwMltpXSA9IHByb2Nlc3NQYXRoKHAyW2ldLCBhdHRyczIsIHBjb20pO1xuXG4gICAgICBpZiAocGNvbXMyW2ldICE9PSAnQScgJiYgcGZpcnN0ID09PSAnQycpIHtcbiAgICAgICAgcGNvbXMyW2ldID0gJ0MnO1xuICAgICAgfVxuXG4gICAgICBmaXhBcmMocDIsIGkpO1xuICAgIH1cbiAgICBmaXhNKHAsIHAyLCBhdHRycywgYXR0cnMyLCBpKTtcbiAgICBmaXhNKHAyLCBwLCBhdHRyczIsIGF0dHJzLCBpKTtcbiAgICB2YXIgc2VnID0gcFtpXSxcbiAgICAgIHNlZzIgPSBwMiAmJiBwMltpXSxcbiAgICAgIHNlZ2xlbiA9IHNlZy5sZW5ndGgsXG4gICAgICBzZWcybGVuID0gcDIgJiYgc2VnMi5sZW5ndGg7XG4gICAgYXR0cnMueCA9IHNlZ1tzZWdsZW4gLSAyXTtcbiAgICBhdHRycy55ID0gc2VnW3NlZ2xlbiAtIDFdO1xuICAgIGF0dHJzLmJ4ID0gcGFyc2VGbG9hdChzZWdbc2VnbGVuIC0gNF0pIHx8IGF0dHJzLng7XG4gICAgYXR0cnMuYnkgPSBwYXJzZUZsb2F0KHNlZ1tzZWdsZW4gLSAzXSkgfHwgYXR0cnMueTtcbiAgICBhdHRyczIuYnggPSBwMiAmJiAocGFyc2VGbG9hdChzZWcyW3NlZzJsZW4gLSA0XSkgfHwgYXR0cnMyLngpO1xuICAgIGF0dHJzMi5ieSA9IHAyICYmIChwYXJzZUZsb2F0KHNlZzJbc2VnMmxlbiAtIDNdKSB8fCBhdHRyczIueSk7XG4gICAgYXR0cnMyLnggPSBwMiAmJiBzZWcyW3NlZzJsZW4gLSAyXTtcbiAgICBhdHRyczIueSA9IHAyICYmIHNlZzJbc2VnMmxlbiAtIDFdO1xuICB9XG5cbiAgcmV0dXJuIHAyID8gW3AsIHAyXSA6IHA7XG59XG5cbmZ1bmN0aW9uIGEyYyh4MSwgeTEsIHJ4LCByeSwgYW5nbGUsIGxhYywgc3dlZXBfZmxhZywgeDIsIHkyLCByZWN1cnNpdmUpIHtcbiAgLy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb2Ygd2hlcmUgdGhpcyBNYXRoIGNhbWUgZnJvbSB2aXNpdDpcbiAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvaW1wbG5vdGUuaHRtbCNBcmNJbXBsZW1lbnRhdGlvbk5vdGVzXG4gIHZhciBQSSA9IE1hdGguUEksXG4gICAgXzEyMCA9IFBJICogMTIwIC8gMTgwLFxuICAgIGYxLFxuICAgIGYyLFxuICAgIGN4LFxuICAgIGN5LFxuICAgIHJhZCA9IFBJIC8gMTgwICogKCthbmdsZSB8fCAwKSxcbiAgICByZXMgPSBbXSxcbiAgICB4eSxcbiAgICByb3RhdGUgPSBmdW5jdGlvbih4LCB5LCByYWQpIHtcbiAgICAgIHZhciBYID0geCAqIE1hdGguY29zKHJhZCkgLSB5ICogTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgWSA9IHggKiBNYXRoLnNpbihyYWQpICsgeSAqIE1hdGguY29zKHJhZCk7XG4gICAgICByZXR1cm4geyB4OiBYLCB5OiBZIH07XG4gICAgfTtcbiAgaWYgKCFyZWN1cnNpdmUpIHtcbiAgICB4eSA9IHJvdGF0ZSh4MSwgeTEsIC1yYWQpO1xuICAgIHgxID0geHkueDtcbiAgICB5MSA9IHh5Lnk7XG4gICAgeHkgPSByb3RhdGUoeDIsIHkyLCAtcmFkKTtcbiAgICB4MiA9IHh5Lng7XG4gICAgeTIgPSB4eS55O1xuICAgIHZhciB4ID0gKHgxIC0geDIpIC8gMixcbiAgICAgIHkgPSAoeTEgLSB5MikgLyAyLFxuICAgICAgaCA9IHggKiB4IC8gKHJ4ICogcngpICsgeSAqIHkgLyAocnkgKiByeSk7XG4gICAgaWYgKGggPiAxKSB7XG4gICAgICBoID0gTWF0aC5zcXJ0KGgpO1xuICAgICAgcnggPSBoICogcng7XG4gICAgICByeSA9IGggKiByeTtcbiAgICB9XG4gICAgdmFyIHJ4MiA9IHJ4ICogcngsXG4gICAgICByeTIgPSByeSAqIHJ5O1xuICAgIHZhciBrID1cbiAgICAgIChsYWMgPT09IHN3ZWVwX2ZsYWcgPyAtMSA6IDEpICpcbiAgICAgIE1hdGguc3FydChcbiAgICAgICAgTWF0aC5hYnMoXG4gICAgICAgICAgKHJ4MiAqIHJ5MiAtIHJ4MiAqIHkgKiB5IC0gcnkyICogeCAqIHgpIC8gKHJ4MiAqIHkgKiB5ICsgcnkyICogeCAqIHgpXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICBjeCA9IGsgKiByeCAqIHkgLyByeSArICh4MSArIHgyKSAvIDI7XG4gICAgY3kgPSBrICogLXJ5ICogeCAvIHJ4ICsgKHkxICsgeTIpIC8gMjtcbiAgICBmMSA9IE1hdGguYXNpbigoKHkxIC0gY3kpIC8gcnkpLnRvRml4ZWQoOSkpO1xuICAgIGYyID0gTWF0aC5hc2luKCgoeTIgLSBjeSkgLyByeSkudG9GaXhlZCg5KSk7XG5cbiAgICBmMSA9IHgxIDwgY3ggPyBQSSAtIGYxIDogZjE7XG4gICAgZjIgPSB4MiA8IGN4ID8gUEkgLSBmMiA6IGYyO1xuXG4gICAgaWYgKGYxIDwgMCkge1xuICAgICAgZjEgPSBQSSAqIDIgKyBmMTtcbiAgICB9XG4gICAgaWYgKGYyIDwgMCkge1xuICAgICAgZjIgPSBQSSAqIDIgKyBmMjtcbiAgICB9XG5cbiAgICBpZiAoc3dlZXBfZmxhZyAmJiBmMSA+IGYyKSB7XG4gICAgICBmMSA9IGYxIC0gUEkgKiAyO1xuICAgIH1cbiAgICBpZiAoIXN3ZWVwX2ZsYWcgJiYgZjIgPiBmMSkge1xuICAgICAgZjIgPSBmMiAtIFBJICogMjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZjEgPSByZWN1cnNpdmVbMF07XG4gICAgZjIgPSByZWN1cnNpdmVbMV07XG4gICAgY3ggPSByZWN1cnNpdmVbMl07XG4gICAgY3kgPSByZWN1cnNpdmVbM107XG4gIH1cbiAgdmFyIGRmID0gZjIgLSBmMTtcbiAgaWYgKE1hdGguYWJzKGRmKSA+IF8xMjApIHtcbiAgICB2YXIgZjJvbGQgPSBmMixcbiAgICAgIHgyb2xkID0geDIsXG4gICAgICB5Mm9sZCA9IHkyO1xuICAgIGYyID0gZjEgKyBfMTIwICogKHN3ZWVwX2ZsYWcgJiYgZjIgPiBmMSA/IDEgOiAtMSk7XG4gICAgeDIgPSBjeCArIHJ4ICogTWF0aC5jb3MoZjIpO1xuICAgIHkyID0gY3kgKyByeSAqIE1hdGguc2luKGYyKTtcbiAgICByZXMgPSBhMmMoeDIsIHkyLCByeCwgcnksIGFuZ2xlLCAwLCBzd2VlcF9mbGFnLCB4Mm9sZCwgeTJvbGQsIFtcbiAgICAgIGYyLFxuICAgICAgZjJvbGQsXG4gICAgICBjeCxcbiAgICAgIGN5XG4gICAgXSk7XG4gIH1cbiAgZGYgPSBmMiAtIGYxO1xuICB2YXIgYzEgPSBNYXRoLmNvcyhmMSksXG4gICAgczEgPSBNYXRoLnNpbihmMSksXG4gICAgYzIgPSBNYXRoLmNvcyhmMiksXG4gICAgczIgPSBNYXRoLnNpbihmMiksXG4gICAgdCA9IE1hdGgudGFuKGRmIC8gNCksXG4gICAgaHggPSA0IC8gMyAqIHJ4ICogdCxcbiAgICBoeSA9IDQgLyAzICogcnkgKiB0LFxuICAgIG0xID0gW3gxLCB5MV0sXG4gICAgbTIgPSBbeDEgKyBoeCAqIHMxLCB5MSAtIGh5ICogYzFdLFxuICAgIG0zID0gW3gyICsgaHggKiBzMiwgeTIgLSBoeSAqIGMyXSxcbiAgICBtNCA9IFt4MiwgeTJdO1xuICBtMlswXSA9IDIgKiBtMVswXSAtIG0yWzBdO1xuICBtMlsxXSA9IDIgKiBtMVsxXSAtIG0yWzFdO1xuICBpZiAocmVjdXJzaXZlKSB7XG4gICAgcmV0dXJuIFttMiwgbTMsIG00XS5jb25jYXQocmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZXMgPSBbbTIsIG0zLCBtNF1cbiAgICAgIC5jb25jYXQocmVzKVxuICAgICAgLmpvaW4oKVxuICAgICAgLnNwbGl0KCcsJyk7XG4gICAgdmFyIG5ld3JlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBuZXdyZXNbaV0gPVxuICAgICAgICBpICUgMlxuICAgICAgICAgID8gcm90YXRlKHJlc1tpIC0gMV0sIHJlc1tpXSwgcmFkKS55XG4gICAgICAgICAgOiByb3RhdGUocmVzW2ldLCByZXNbaSArIDFdLCByYWQpLng7XG4gICAgfVxuICAgIHJldHVybiBuZXdyZXM7XG4gIH1cbn1cblxuLy8gaHR0cDovL3NjaGVwZXJzLmNjL2dldHRpbmctdG8tdGhlLXBvaW50XG5mdW5jdGlvbiBjYXRtdWxsUm9tMmJlemllcihjcnAsIHopIHtcbiAgdmFyIGQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGlMZW4gPSBjcnAubGVuZ3RoOyBpTGVuIC0gMiAqICF6ID4gaTsgaSArPSAyKSB7XG4gICAgdmFyIHAgPSBbXG4gICAgICB7XG4gICAgICAgIHg6ICtjcnBbaSAtIDJdLFxuICAgICAgICB5OiArY3JwW2kgLSAxXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgeDogK2NycFtpXSxcbiAgICAgICAgeTogK2NycFtpICsgMV1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHg6ICtjcnBbaSArIDJdLFxuICAgICAgICB5OiArY3JwW2kgKyAzXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgeDogK2NycFtpICsgNF0sXG4gICAgICAgIHk6ICtjcnBbaSArIDVdXG4gICAgICB9XG4gICAgXTtcbiAgICBpZiAoeikge1xuICAgICAgaWYgKCFpKSB7XG4gICAgICAgIHBbMF0gPSB7XG4gICAgICAgICAgeDogK2NycFtpTGVuIC0gMl0sXG4gICAgICAgICAgeTogK2NycFtpTGVuIC0gMV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoaUxlbiAtIDQgPT09IGkpIHtcbiAgICAgICAgcFszXSA9IHtcbiAgICAgICAgICB4OiArY3JwWzBdLFxuICAgICAgICAgIHk6ICtjcnBbMV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoaUxlbiAtIDIgPT09IGkpIHtcbiAgICAgICAgcFsyXSA9IHtcbiAgICAgICAgICB4OiArY3JwWzBdLFxuICAgICAgICAgIHk6ICtjcnBbMV1cbiAgICAgICAgfTtcbiAgICAgICAgcFszXSA9IHtcbiAgICAgICAgICB4OiArY3JwWzJdLFxuICAgICAgICAgIHk6ICtjcnBbM11cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlMZW4gLSA0ID09PSBpKSB7XG4gICAgICAgIHBbM10gPSBwWzJdO1xuICAgICAgfSBlbHNlIGlmICghaSkge1xuICAgICAgICBwWzBdID0ge1xuICAgICAgICAgIHg6ICtjcnBbaV0sXG4gICAgICAgICAgeTogK2NycFtpICsgMV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgZC5wdXNoKFtcbiAgICAgICdDJyxcbiAgICAgICgtcFswXS54ICsgNiAqIHBbMV0ueCArIHBbMl0ueCkgLyA2LFxuICAgICAgKC1wWzBdLnkgKyA2ICogcFsxXS55ICsgcFsyXS55KSAvIDYsXG4gICAgICAocFsxXS54ICsgNiAqIHBbMl0ueCAtIHBbM10ueCkgLyA2LFxuICAgICAgKHBbMV0ueSArIDYgKiBwWzJdLnkgLSBwWzNdLnkpIC8gNixcbiAgICAgIHBbMl0ueCxcbiAgICAgIHBbMl0ueVxuICAgIF0pO1xuICB9XG5cbiAgcmV0dXJuIGQ7XG59XG5cbmZ1bmN0aW9uIGwyYyh4MSwgeTEsIHgyLCB5Mikge1xuICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyLCB4MiwgeTJdO1xufVxuXG5mdW5jdGlvbiBxMmMoeDEsIHkxLCBheCwgYXksIHgyLCB5Mikge1xuICB2YXIgXzEzID0gMSAvIDMsXG4gICAgXzIzID0gMiAvIDM7XG4gIHJldHVybiBbXG4gICAgXzEzICogeDEgKyBfMjMgKiBheCxcbiAgICBfMTMgKiB5MSArIF8yMyAqIGF5LFxuICAgIF8xMyAqIHgyICsgXzIzICogYXgsXG4gICAgXzEzICogeTIgKyBfMjMgKiBheSxcbiAgICB4MixcbiAgICB5MlxuICBdO1xufVxuXG5mdW5jdGlvbiBiZXpsZW4oeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCB6KSB7XG4gIGlmICh6ID09IG51bGwpIHtcbiAgICB6ID0gMTtcbiAgfVxuICB6ID0geiA+IDEgPyAxIDogeiA8IDAgPyAwIDogejtcbiAgdmFyIHoyID0geiAvIDI7XG4gIHZhciBuID0gMTI7XG4gIHZhciBUdmFsdWVzID0gW1xuICAgIC0wLjEyNTIsXG4gICAgMC4xMjUyLFxuICAgIC0wLjM2NzgsXG4gICAgMC4zNjc4LFxuICAgIC0wLjU4NzMsXG4gICAgMC41ODczLFxuICAgIC0wLjc2OTksXG4gICAgMC43Njk5LFxuICAgIC0wLjkwNDEsXG4gICAgMC45MDQxLFxuICAgIC0wLjk4MTYsXG4gICAgMC45ODE2XG4gIF07XG5cbiAgdmFyIHN1bSA9IDA7XG4gIHZhciBDdmFsdWVzID0gW1xuICAgIDAuMjQ5MSxcbiAgICAwLjI0OTEsXG4gICAgMC4yMzM1LFxuICAgIDAuMjMzNSxcbiAgICAwLjIwMzIsXG4gICAgMC4yMDMyLFxuICAgIDAuMTYwMSxcbiAgICAwLjE2MDEsXG4gICAgMC4xMDY5LFxuICAgIDAuMTA2OSxcbiAgICAwLjA0NzIsXG4gICAgMC4wNDcyXG4gIF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICB2YXIgY3QgPSB6MiAqIFR2YWx1ZXNbaV0gKyB6MixcbiAgICAgIHhiYXNlID0gYmFzZTMoY3QsIHgxLCB4MiwgeDMsIHg0KSxcbiAgICAgIHliYXNlID0gYmFzZTMoY3QsIHkxLCB5MiwgeTMsIHk0KSxcbiAgICAgIGNvbWIgPSB4YmFzZSAqIHhiYXNlICsgeWJhc2UgKiB5YmFzZTtcbiAgICBzdW0gKz0gQ3ZhbHVlc1tpXSAqIE1hdGguc3FydChjb21iKTtcbiAgfVxuICByZXR1cm4gejIgKiBzdW07XG59XG5cbmZ1bmN0aW9uIGdldFRhdExlbih4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQsIGxsKSB7XG4gIGlmIChsbCA8IDAgfHwgYmV6bGVuKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCkgPCBsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgdCA9IDEsXG4gICAgc3RlcCA9IHQgLyAyLFxuICAgIHQyID0gdCAtIHN0ZXAsXG4gICAgbCxcbiAgICBlID0gMC4wMTtcbiAgbCA9IGJlemxlbih4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQsIHQyKTtcbiAgd2hpbGUgKE1hdGguYWJzKGwgLSBsbCkgPiBlKSB7XG4gICAgc3RlcCAvPSAyO1xuICAgIHQyICs9IChsIDwgbGwgPyAxIDogLTEpICogc3RlcDtcbiAgICBsID0gYmV6bGVuKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCwgdDIpO1xuICB9XG4gIHJldHVybiB0Mjtcbn1cblxuZnVuY3Rpb24gYmFzZTModCwgcDEsIHAyLCBwMywgcDQpIHtcbiAgdmFyIHQxID0gLTMgKiBwMSArIDkgKiBwMiAtIDkgKiBwMyArIDMgKiBwNCxcbiAgICB0MiA9IHQgKiB0MSArIDYgKiBwMSAtIDEyICogcDIgKyA2ICogcDM7XG4gIHJldHVybiB0ICogdDIgLSAzICogcDEgKyAzICogcDI7XG59XG5cbmZ1bmN0aW9uIGNhY2hlS2V5KCkge1xuICB2YXIgaGFzaCA9ICcnO1xuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgdmFyIHYgPSBhcmd1bWVudHNbaV07XG4gICAgaGFzaCArPSB2ID09PSBPYmplY3QodikgPyBKU09OLnN0cmluZ2lmeSh2KSA6IHY7XG4gIH1cbiAgcmV0dXJuIGhhc2g7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb25zdGFudHNcIjoyMSxcIi4uL2NvcmUvY29yZVwiOjIyfV0sNTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIERhdGFcbiAqIEBzdWJtb2R1bGUgQXJyYXkgRnVuY3Rpb25zXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbi8qKlxuICogQWRkcyBhIHZhbHVlIHRvIHRoZSBlbmQgb2YgYW4gYXJyYXkuIEV4dGVuZHMgdGhlIGxlbmd0aCBvZlxuICogdGhlIGFycmF5IGJ5IG9uZS4gTWFwcyB0byBBcnJheS5wdXNoKCkuXG4gKlxuICogQG1ldGhvZCBhcHBlbmRcbiAqIEBkZXByZWNhdGVkIFVzZSA8YSBocmVmPVwiaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcHVzaFwiPmFycmF5LnB1c2godmFsdWUpPC9hPiBpbnN0ZWFkLlxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgQXJyYXkgdG8gYXBwZW5kXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhlIEFycmF5XG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBteUFycmF5ID0gWydNYW5nbycsICdBcHBsZScsICdQYXBheWEnXTtcbiAqICAgcHJpbnQobXlBcnJheSk7IC8vIFsnTWFuZ28nLCAnQXBwbGUnLCAnUGFwYXlhJ11cbiAqXG4gKiAgIGFwcGVuZChteUFycmF5LCAnUGVhY2gnKTtcbiAqICAgcHJpbnQobXlBcnJheSk7IC8vIFsnTWFuZ28nLCAnQXBwbGUnLCAnUGFwYXlhJywgJ1BlYWNoJ11cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkge1xuICBhcnJheS5wdXNoKHZhbHVlKTtcbiAgcmV0dXJuIGFycmF5O1xufTtcblxuLyoqXG4gKiBDb3BpZXMgYW4gYXJyYXkgKG9yIHBhcnQgb2YgYW4gYXJyYXkpIHRvIGFub3RoZXIgYXJyYXkuIFRoZSBzcmMgYXJyYXkgaXNcbiAqIGNvcGllZCB0byB0aGUgZHN0IGFycmF5LCBiZWdpbm5pbmcgYXQgdGhlIHBvc2l0aW9uIHNwZWNpZmllZCBieVxuICogc3JjUG9zaXRpb24gYW5kIGludG8gdGhlIHBvc2l0aW9uIHNwZWNpZmllZCBieSBkc3RQb3NpdGlvbi4gVGhlIG51bWJlciBvZlxuICogZWxlbWVudHMgdG8gY29weSBpcyBkZXRlcm1pbmVkIGJ5IGxlbmd0aC4gTm90ZSB0aGF0IGNvcHlpbmcgdmFsdWVzXG4gKiBvdmVyd3JpdGVzIGV4aXN0aW5nIHZhbHVlcyBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkuIFRvIGFwcGVuZCB2YWx1ZXNcbiAqIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgdGhlbSwgdXNlIGNvbmNhdCgpLlxuICogPGJyPjxicj5cbiAqIFRoZSBzaW1wbGlmaWVkIHZlcnNpb24gd2l0aCBvbmx5IHR3byBhcmd1bWVudHMsIGFycmF5Q29weShzcmMsIGRzdCksXG4gKiBjb3BpZXMgYW4gZW50aXJlIGFycmF5IHRvIGFub3RoZXIgb2YgdGhlIHNhbWUgc2l6ZS4gSXQgaXMgZXF1aXZhbGVudCB0b1xuICogYXJyYXlDb3B5KHNyYywgMCwgZHN0LCAwLCBzcmMubGVuZ3RoKS5cbiAqIDxicj48YnI+XG4gKiBVc2luZyB0aGlzIGZ1bmN0aW9uIGlzIGZhciBtb3JlIGVmZmljaWVudCBmb3IgY29weWluZyBhcnJheSBkYXRhIHRoYW5cbiAqIGl0ZXJhdGluZyB0aHJvdWdoIGEgZm9yKCkgbG9vcCBhbmQgY29weWluZyBlYWNoIGVsZW1lbnQgaW5kaXZpZHVhbGx5LlxuICpcbiAqIEBtZXRob2QgYXJyYXlDb3B5XG4gKiBAZGVwcmVjYXRlZFxuICogQHBhcmFtIHtBcnJheX0gIHNyYyAgICAgICAgICAgdGhlIHNvdXJjZSBBcnJheVxuICogQHBhcmFtIHtJbnRlZ2VyfSBzcmNQb3NpdGlvbiAgc3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gIGRzdCAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIEFycmF5XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGRzdFBvc2l0aW9uICAgc3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIGRlc3RpbmF0aW9uIEFycmF5XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGxlbmd0aCAgICAgICAgbnVtYmVyIG9mIEFycmF5IGVsZW1lbnRzIHRvIGJlIGNvcGllZFxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiB2YXIgc3JjID0gWydBJywgJ0InLCAnQyddO1xuICogdmFyIGRzdCA9IFsxLCAyLCAzXTtcbiAqIHZhciBzcmNQb3NpdGlvbiA9IDE7XG4gKiB2YXIgZHN0UG9zaXRpb24gPSAwO1xuICogdmFyIGxlbmd0aCA9IDI7XG4gKlxuICogcHJpbnQoc3JjKTsgLy8gWydBJywgJ0InLCAnQyddXG4gKiBwcmludChkc3QpOyAvLyBbIDEgLCAgMiAsICAzIF1cbiAqXG4gKiBhcnJheUNvcHkoc3JjLCBzcmNQb3NpdGlvbiwgZHN0LCBkc3RQb3NpdGlvbiwgbGVuZ3RoKTtcbiAqIHByaW50KGRzdCk7IC8vIFsnQicsICdDJywgM11cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGFycmF5Q29weVxuICogQGRlcHJlY2F0ZWQgVXNlIDxhIGhyZWY9XCJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9jb3B5V2l0aGluXCI+YXJyMS5jb3B5V2l0aGluKGFycjIpPC9hPiBpbnN0ZWFkLlxuICogQHBhcmFtIHtBcnJheX0gIHNyY1xuICogQHBhcmFtIHtBcnJheX0gIGRzdFxuICogQHBhcmFtIHtJbnRlZ2VyfSBbbGVuZ3RoXVxuICovXG5wNS5wcm90b3R5cGUuYXJyYXlDb3B5ID0gZnVuY3Rpb24oc3JjLCBzcmNQb3NpdGlvbiwgZHN0LCBkc3RQb3NpdGlvbiwgbGVuZ3RoKSB7XG4gIC8vIHRoZSBpbmRleCB0byBiZWdpbiBzcGxpY2luZyBmcm9tIGRzdCBhcnJheVxuICB2YXIgc3RhcnQ7XG4gIHZhciBlbmQ7XG5cbiAgaWYgKHR5cGVvZiBsZW5ndGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZW5kID0gTWF0aC5taW4obGVuZ3RoLCBzcmMubGVuZ3RoKTtcbiAgICBzdGFydCA9IGRzdFBvc2l0aW9uO1xuICAgIHNyYyA9IHNyYy5zbGljZShzcmNQb3NpdGlvbiwgZW5kICsgc3JjUG9zaXRpb24pO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZHN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gc3JjLCBkc3QsIGxlbmd0aFxuICAgICAgLy8gcmVuYW1lICBzbyB3ZSBkb24ndCBnZXQgY29uZnVzZWRcbiAgICAgIGVuZCA9IGRzdDtcbiAgICAgIGVuZCA9IE1hdGgubWluKGVuZCwgc3JjLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNyYywgZHN0XG4gICAgICBlbmQgPSBzcmMubGVuZ3RoO1xuICAgIH1cblxuICAgIHN0YXJ0ID0gMDtcbiAgICAvLyByZW5hbWUgIHNvIHdlIGRvbid0IGdldCBjb25mdXNlZFxuICAgIGRzdCA9IHNyY1Bvc2l0aW9uO1xuICAgIHNyYyA9IHNyYy5zbGljZSgwLCBlbmQpO1xuICB9XG5cbiAgLy8gU2luY2Ugd2UgYXJlIG5vdCByZXR1cm5pbmcgdGhlIGFycmF5IGFuZCBKYXZhU2NyaXB0IGlzIHBhc3MgYnkgcmVmZXJlbmNlXG4gIC8vIHdlIG11c3QgbW9kaWZ5IHRoZSBhY3R1YWwgdmFsdWVzIG9mIHRoZSBhcnJheVxuICAvLyBpbnN0ZWFkIG9mIHJlYXNzaWduaW5nIGFycmF5c1xuICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGRzdCwgW3N0YXJ0LCBlbmRdLmNvbmNhdChzcmMpKTtcbn07XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHR3byBhcnJheXMsIG1hcHMgdG8gQXJyYXkuY29uY2F0KCkuIERvZXMgbm90IG1vZGlmeSB0aGVcbiAqIGlucHV0IGFycmF5cy5cbiAqXG4gKiBAbWV0aG9kIGNvbmNhdFxuICogQGRlcHJlY2F0ZWQgVXNlIDxhIGhyZWY9XCJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9jb25jYXRcIj5hcnIxLmNvbmNhdChhcnIyKTwvYT4gaW5zdGVhZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGEgZmlyc3QgQXJyYXkgdG8gY29uY2F0ZW5hdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGIgc2Vjb25kIEFycmF5IHRvIGNvbmNhdGVuYXRlXG4gKiBAcmV0dXJuIHtBcnJheX0gY29uY2F0ZW5hdGVkIGFycmF5XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3MgPSAnbm9yZW5kZXInPjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBhcnIxID0gWydBJywgJ0InLCAnQyddO1xuICogICB2YXIgYXJyMiA9IFsxLCAyLCAzXTtcbiAqXG4gKiAgIHByaW50KGFycjEpOyAvLyBbJ0EnLCdCJywnQyddXG4gKiAgIHByaW50KGFycjIpOyAvLyBbMSwyLDNdXG4gKlxuICogICB2YXIgYXJyMyA9IGNvbmNhdChhcnIxLCBhcnIyKTtcbiAqXG4gKiAgIHByaW50KGFycjEpOyAvLyBbJ0EnLCdCJywnQyddXG4gKiAgIHByaW50KGFycjIpOyAvLyBbMSwgMiwgM11cbiAqICAgcHJpbnQoYXJyMyk7IC8vIFsnQScsJ0InLCdDJywgMSwgMiwgM11cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uKGxpc3QwLCBsaXN0MSkge1xuICByZXR1cm4gbGlzdDAuY29uY2F0KGxpc3QxKTtcbn07XG5cbi8qKlxuICogUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIGFuIGFycmF5LCBtYXBzIHRvIEFycmF5LnJldmVyc2UoKVxuICpcbiAqIEBtZXRob2QgcmV2ZXJzZVxuICogQGRlcHJlY2F0ZWQgVXNlIDxhIGhyZWY9XCJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9yZXZlcnNlXCI+YXJyYXkucmV2ZXJzZSgpPC9hPiBpbnN0ZWFkLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBBcnJheSB0byByZXZlcnNlXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBteUFycmF5ID0gWydBJywgJ0InLCAnQyddO1xuICogICBwcmludChteUFycmF5KTsgLy8gWydBJywnQicsJ0MnXVxuICpcbiAqICAgcmV2ZXJzZShteUFycmF5KTtcbiAqICAgcHJpbnQobXlBcnJheSk7IC8vIFsnQycsJ0InLCdBJ11cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUucHJvdG90eXBlLnJldmVyc2UgPSBmdW5jdGlvbihsaXN0KSB7XG4gIHJldHVybiBsaXN0LnJldmVyc2UoKTtcbn07XG5cbi8qKlxuICogRGVjcmVhc2VzIGFuIGFycmF5IGJ5IG9uZSBlbGVtZW50IGFuZCByZXR1cm5zIHRoZSBzaG9ydGVuZWQgYXJyYXksXG4gKiBtYXBzIHRvIEFycmF5LnBvcCgpLlxuICpcbiAqIEBtZXRob2Qgc2hvcnRlblxuICogQGRlcHJlY2F0ZWQgVXNlIDxhIGhyZWY9XCJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9wb3BcIj5hcnJheS5wb3AoKTwvYT4gaW5zdGVhZC5cbiAqIEBwYXJhbSAge0FycmF5fSBsaXN0IEFycmF5IHRvIHNob3J0ZW5cbiAqIEByZXR1cm4ge0FycmF5fSBzaG9ydGVuZWQgQXJyYXlcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzID0gJ25vcmVuZGVyJz48Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICB2YXIgbXlBcnJheSA9IFsnQScsICdCJywgJ0MnXTtcbiAqICAgcHJpbnQobXlBcnJheSk7IC8vIFsnQScsICdCJywgJ0MnXVxuICogICB2YXIgbmV3QXJyYXkgPSBzaG9ydGVuKG15QXJyYXkpO1xuICogICBwcmludChteUFycmF5KTsgLy8gWydBJywnQicsJ0MnXVxuICogICBwcmludChuZXdBcnJheSk7IC8vIFsnQScsJ0InXVxuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUuc2hvcnRlbiA9IGZ1bmN0aW9uKGxpc3QpIHtcbiAgbGlzdC5wb3AoKTtcbiAgcmV0dXJuIGxpc3Q7XG59O1xuXG4vKipcbiAqIFJhbmRvbWl6ZXMgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheS4gSW1wbGVtZW50c1xuICogPGEgaHJlZj0naHR0cDovL0Jvc3QuT2Nrcy5vcmcvbWlrZS9zaHVmZmxlLycgdGFyZ2V0PV9ibGFuaz5cbiAqIEZpc2hlci1ZYXRlcyBTaHVmZmxlIEFsZ29yaXRobTwvYT4uXG4gKlxuICogQG1ldGhvZCBzaHVmZmxlXG4gKiBAZGVwcmVjYXRlZCBTZWUgPGEgaHJlZj1cImh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYyNzQzMzkvaG93LWNhbi1pLXNodWZmbGUtYW4tYXJyYXlcIj5zaHVmZmxpbmcgYW4gYXJyYXkgd2l0aCBKUzwvYT4gaW5zdGVhZC5cbiAqIEBwYXJhbSAge0FycmF5fSAgIGFycmF5ICBBcnJheSB0byBzaHVmZmxlXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbYm9vbF0gbW9kaWZ5IHBhc3NlZCBhcnJheVxuICogQHJldHVybiB7QXJyYXl9ICAgc2h1ZmZsZWQgQXJyYXlcbiAqIEBleGFtcGxlXG4gKiA8ZGl2Pjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciByZWd1bGFyQXJyID0gWydBQkMnLCAnZGVmJywgY3JlYXRlVmVjdG9yKCksIFRBVSwgTWF0aC5FXTtcbiAqICAgcHJpbnQocmVndWxhckFycik7XG4gKiAgIHNodWZmbGUocmVndWxhckFyciwgdHJ1ZSk7IC8vIGZvcmNlIG1vZGlmaWNhdGlvbnMgdG8gcGFzc2VkIGFycmF5XG4gKiAgIHByaW50KHJlZ3VsYXJBcnIpO1xuICpcbiAqICAgLy8gQnkgZGVmYXVsdCBzaHVmZmxlKCkgcmV0dXJucyBhIHNodWZmbGVkIGNsb25lZCBhcnJheTpcbiAqICAgdmFyIG5ld0FyciA9IHNodWZmbGUocmVndWxhckFycik7XG4gKiAgIHByaW50KHJlZ3VsYXJBcnIpO1xuICogICBwcmludChuZXdBcnIpO1xuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUuc2h1ZmZsZSA9IGZ1bmN0aW9uKGFyciwgYm9vbCkge1xuICB2YXIgaXNWaWV3ID0gQXJyYXlCdWZmZXIgJiYgQXJyYXlCdWZmZXIuaXNWaWV3ICYmIEFycmF5QnVmZmVyLmlzVmlldyhhcnIpO1xuICBhcnIgPSBib29sIHx8IGlzVmlldyA/IGFyciA6IGFyci5zbGljZSgpO1xuXG4gIHZhciBybmQsXG4gICAgdG1wLFxuICAgIGlkeCA9IGFyci5sZW5ndGg7XG4gIHdoaWxlIChpZHggPiAxKSB7XG4gICAgcm5kID0gKE1hdGgucmFuZG9tKCkgKiBpZHgpIHwgMDtcblxuICAgIHRtcCA9IGFyclstLWlkeF07XG4gICAgYXJyW2lkeF0gPSBhcnJbcm5kXTtcbiAgICBhcnJbcm5kXSA9IHRtcDtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59O1xuXG4vKipcbiAqIFNvcnRzIGFuIGFycmF5IG9mIG51bWJlcnMgZnJvbSBzbWFsbGVzdCB0byBsYXJnZXN0LCBvciBwdXRzIGFuIGFycmF5IG9mXG4gKiB3b3JkcyBpbiBhbHBoYWJldGljYWwgb3JkZXIuIFRoZSBvcmlnaW5hbCBhcnJheSBpcyBub3QgbW9kaWZpZWQ7IGFcbiAqIHJlLW9yZGVyZWQgYXJyYXkgaXMgcmV0dXJuZWQuIFRoZSBjb3VudCBwYXJhbWV0ZXIgc3RhdGVzIHRoZSBudW1iZXIgb2ZcbiAqIGVsZW1lbnRzIHRvIHNvcnQuIEZvciBleGFtcGxlLCBpZiB0aGVyZSBhcmUgMTIgZWxlbWVudHMgaW4gYW4gYXJyYXkgYW5kXG4gKiBjb3VudCBpcyBzZXQgdG8gNSwgb25seSB0aGUgZmlyc3QgNSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgd2lsbCBiZSBzb3J0ZWQuXG4gKlxuICogQG1ldGhvZCBzb3J0XG4gKiBAZGVwcmVjYXRlZCBVc2UgPGEgaHJlZj1cImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3NvcnRcIj5hcnJheS5zb3J0KCk8L2E+IGluc3RlYWQuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IEFycmF5IHRvIHNvcnRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gW2NvdW50XSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc29ydCwgc3RhcnRpbmcgZnJvbSAwXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3MgPSAnbm9yZW5kZXInPjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciB3b3JkcyA9IFsnYmFuYW5hJywgJ2FwcGxlJywgJ3BlYXInLCAnbGltZSddO1xuICogICBwcmludCh3b3Jkcyk7IC8vIFsnYmFuYW5hJywgJ2FwcGxlJywgJ3BlYXInLCAnbGltZSddXG4gKiAgIHZhciBjb3VudCA9IDQ7IC8vIGxlbmd0aCBvZiBhcnJheVxuICpcbiAqICAgd29yZHMgPSBzb3J0KHdvcmRzLCBjb3VudCk7XG4gKiAgIHByaW50KHdvcmRzKTsgLy8gWydhcHBsZScsICdiYW5hbmEnLCAnbGltZScsICdwZWFyJ11cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqIDxkaXYgY2xhc3MgPSAnbm9yZW5kZXInPjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBudW1iZXJzID0gWzIsIDYsIDEsIDUsIDE0LCA5LCA4LCAxMl07XG4gKiAgIHByaW50KG51bWJlcnMpOyAvLyBbMiwgNiwgMSwgNSwgMTQsIDksIDgsIDEyXVxuICogICB2YXIgY291bnQgPSA1OyAvLyBMZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXlcbiAqXG4gKiAgIG51bWJlcnMgPSBzb3J0KG51bWJlcnMsIGNvdW50KTtcbiAqICAgcHJpbnQobnVtYmVycyk7IC8vIFsxLDIsNSw2LDE0LDksOCwxMl1cbiAqIH1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUucHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbihsaXN0LCBjb3VudCkge1xuICB2YXIgYXJyID0gY291bnQgPyBsaXN0LnNsaWNlKDAsIE1hdGgubWluKGNvdW50LCBsaXN0Lmxlbmd0aCkpIDogbGlzdDtcbiAgdmFyIHJlc3QgPSBjb3VudCA/IGxpc3Quc2xpY2UoTWF0aC5taW4oY291bnQsIGxpc3QubGVuZ3RoKSkgOiBbXTtcbiAgaWYgKHR5cGVvZiBhcnJbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyID0gYXJyLnNvcnQoKTtcbiAgfSBlbHNlIHtcbiAgICBhcnIgPSBhcnIuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGFyci5jb25jYXQocmVzdCk7XG59O1xuXG4vKipcbiAqIEluc2VydHMgYSB2YWx1ZSBvciBhbiBhcnJheSBvZiB2YWx1ZXMgaW50byBhbiBleGlzdGluZyBhcnJheS4gVGhlIGZpcnN0XG4gKiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBpbml0aWFsIGFycmF5IHRvIGJlIG1vZGlmaWVkLCBhbmQgdGhlIHNlY29uZFxuICogcGFyYW1ldGVyIGRlZmluZXMgdGhlIGRhdGEgdG8gYmUgaW5zZXJ0ZWQuIFRoZSB0aGlyZCBwYXJhbWV0ZXIgaXMgYW4gaW5kZXhcbiAqIHZhbHVlIHdoaWNoIHNwZWNpZmllcyB0aGUgYXJyYXkgcG9zaXRpb24gZnJvbSB3aGljaCB0byBpbnNlcnQgZGF0YS5cbiAqIChSZW1lbWJlciB0aGF0IGFycmF5IGluZGV4IG51bWJlcmluZyBzdGFydHMgYXQgemVybywgc28gdGhlIGZpcnN0IHBvc2l0aW9uXG4gKiBpcyAwLCB0aGUgc2Vjb25kIHBvc2l0aW9uIGlzIDEsIGFuZCBzbyBvbi4pXG4gKlxuICogQG1ldGhvZCBzcGxpY2VcbiAqIEBkZXByZWNhdGVkIFVzZSA8YSBocmVmPVwiaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc3BsaWNlXCI+YXJyYXkuc3BsaWNlKCk8L2E+IGluc3RlYWQuXG4gKiBAcGFyYW0ge0FycmF5fSAgbGlzdCBBcnJheSB0byBzcGxpY2UgaW50b1xuICogQHBhcmFtIHthbnl9ICAgIHZhbHVlIHZhbHVlIHRvIGJlIHNwbGljZWQgaW5cbiAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24gaW4gdGhlIGFycmF5IGZyb20gd2hpY2ggdG8gaW5zZXJ0IGRhdGFcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcyA9ICdub3JlbmRlcic+PGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgdmFyIG15QXJyYXkgPSBbMCwgMSwgMiwgMywgNF07XG4gKiAgIHZhciBpbnNBcnJheSA9IFsnQScsICdCJywgJ0MnXTtcbiAqICAgcHJpbnQobXlBcnJheSk7IC8vIFswLCAxLCAyLCAzLCA0XVxuICogICBwcmludChpbnNBcnJheSk7IC8vIFsnQScsJ0InLCdDJ11cbiAqXG4gKiAgIHNwbGljZShteUFycmF5LCBpbnNBcnJheSwgMyk7XG4gKiAgIHByaW50KG15QXJyYXkpOyAvLyBbMCwxLDIsJ0EnLCdCJywnQycsMyw0XVxuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUuc3BsaWNlID0gZnVuY3Rpb24obGlzdCwgdmFsdWUsIGluZGV4KSB7XG4gIC8vIG5vdGUgdGhhdCBzcGxpY2UgcmV0dXJucyBzcGxpY2VkIGVsZW1lbnRzIGFuZCBub3QgYW4gYXJyYXlcbiAgQXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShsaXN0LCBbaW5kZXgsIDBdLmNvbmNhdCh2YWx1ZSkpO1xuXG4gIHJldHVybiBsaXN0O1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBhbiBhcnJheSBvZiBlbGVtZW50cyBmcm9tIGFuIGV4aXN0aW5nIGFycmF5LiBUaGUgbGlzdCBwYXJhbWV0ZXJcbiAqIGRlZmluZXMgdGhlIGFycmF5IGZyb20gd2hpY2ggdGhlIGVsZW1lbnRzIHdpbGwgYmUgY29waWVkLCBhbmQgdGhlIHN0YXJ0XG4gKiBhbmQgY291bnQgcGFyYW1ldGVycyBzcGVjaWZ5IHdoaWNoIGVsZW1lbnRzIHRvIGV4dHJhY3QuIElmIG5vIGNvdW50IGlzXG4gKiBnaXZlbiwgZWxlbWVudHMgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgc3RhcnQgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuXG4gKiBXaGVuIHNwZWNpZnlpbmcgdGhlIHN0YXJ0LCByZW1lbWJlciB0aGF0IHRoZSBmaXJzdCBhcnJheSBlbGVtZW50IGlzIDAuXG4gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgc291cmNlIGFycmF5LlxuICpcbiAqIEBtZXRob2Qgc3Vic2V0XG4gKiBAZGVwcmVjYXRlZCBVc2UgPGEgaHJlZj1cImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3NsaWNlXCI+YXJyYXkuc2xpY2UoKTwvYT4gaW5zdGVhZC5cbiAqIEBwYXJhbSAge0FycmF5fSAgbGlzdCAgICBBcnJheSB0byBleHRyYWN0IGZyb21cbiAqIEBwYXJhbSAge0ludGVnZXJ9IHN0YXJ0ICAgcG9zaXRpb24gdG8gYmVnaW5cbiAqIEBwYXJhbSAge0ludGVnZXJ9IFtjb3VudF0gbnVtYmVyIG9mIHZhbHVlcyB0byBleHRyYWN0XG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICAgQXJyYXkgb2YgZXh0cmFjdGVkIGVsZW1lbnRzXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3MgPSAnbm9yZW5kZXInPjxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBteUFycmF5ID0gWzEsIDIsIDMsIDQsIDVdO1xuICogICBwcmludChteUFycmF5KTsgLy8gWzEsIDIsIDMsIDQsIDVdXG4gKlxuICogICB2YXIgc3ViMSA9IHN1YnNldChteUFycmF5LCAwLCAzKTtcbiAqICAgdmFyIHN1YjIgPSBzdWJzZXQobXlBcnJheSwgMiwgMik7XG4gKiAgIHByaW50KHN1YjEpOyAvLyBbMSwyLDNdXG4gKiAgIHByaW50KHN1YjIpOyAvLyBbMyw0XVxuICogfVxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUuc3Vic2V0ID0gZnVuY3Rpb24obGlzdCwgc3RhcnQsIGNvdW50KSB7XG4gIGlmICh0eXBlb2YgY291bnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGxpc3Quc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgY291bnQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0LnNsaWNlKHN0YXJ0LCBsaXN0Lmxlbmd0aCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSw2MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgRGF0YVxuICogQHN1Ym1vZHVsZSBDb252ZXJzaW9uXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgdG8gaXRzIGZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9uLiBUaGUgY29udGVudHMgb2YgYVxuICogc3RyaW5nIG11c3QgcmVzZW1ibGUgYSBudW1iZXIsIG9yIE5hTiAobm90IGEgbnVtYmVyKSB3aWxsIGJlIHJldHVybmVkLlxuICogRm9yIGV4YW1wbGUsIGZsb2F0KFwiMTIzNC41NlwiKSBldmFsdWF0ZXMgdG8gMTIzNC41NiwgYnV0IGZsb2F0KFwiZ2lyYWZmZVwiKVxuICogd2lsbCByZXR1cm4gTmFOLlxuICpcbiAqIFdoZW4gYW4gYXJyYXkgb2YgdmFsdWVzIGlzIHBhc3NlZCBpbiwgdGhlbiBhbiBhcnJheSBvZiBmbG9hdHMgb2YgdGhlIHNhbWVcbiAqIGxlbmd0aCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAbWV0aG9kIGZsb2F0XG4gKiBAcGFyYW0ge1N0cmluZ30gIHN0ciBmbG9hdCBzdHJpbmcgdG8gcGFyc2VcbiAqIEByZXR1cm4ge051bWJlcn0gICAgIGZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9uIG9mIHN0cmluZ1xuICogQGV4YW1wbGVcbiAqIDxkaXY+PGNvZGU+XG4gKiB2YXIgc3RyID0gJzIwJztcbiAqIHZhciBkaWFtZXRlciA9IGZsb2F0KHN0cik7XG4gKiBlbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgZGlhbWV0ZXIsIGRpYW1ldGVyKTtcbiAqIDwvY29kZT48L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiAyMCBieSAyMCB3aGl0ZSBlbGxpcHNlIGluIHRoZSBjZW50ZXIgb2YgdGhlIGNhbnZhc1xuICpcbiAqL1xucDUucHJvdG90eXBlLmZsb2F0ID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmIChzdHIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBzdHIubWFwKHBhcnNlRmxvYXQpO1xuICB9XG4gIHJldHVybiBwYXJzZUZsb2F0KHN0cik7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgYm9vbGVhbiwgc3RyaW5nLCBvciBmbG9hdCB0byBpdHMgaW50ZWdlciByZXByZXNlbnRhdGlvbi5cbiAqIFdoZW4gYW4gYXJyYXkgb2YgdmFsdWVzIGlzIHBhc3NlZCBpbiwgdGhlbiBhbiBpbnQgYXJyYXkgb2YgdGhlIHNhbWUgbGVuZ3RoXG4gKiBpcyByZXR1cm5lZC5cbiAqXG4gKiBAbWV0aG9kIGludFxuICogQHBhcmFtIHtTdHJpbmd8Qm9vbGVhbnxOdW1iZXJ9ICAgICAgIG4gdmFsdWUgdG8gcGFyc2VcbiAqIEBwYXJhbSB7SW50ZWdlcn0gICAgICAgW3JhZGl4XSB0aGUgcmFkaXggdG8gY29udmVydCB0byAoZGVmYXVsdDogMTApXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgICAgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiBwcmludChpbnQoJzEwJykpOyAvLyAxMFxuICogcHJpbnQoaW50KDEwLjMxKSk7IC8vIDEwXG4gKiBwcmludChpbnQoLTEwKSk7IC8vIC0xMFxuICogcHJpbnQoaW50KHRydWUpKTsgLy8gMVxuICogcHJpbnQoaW50KGZhbHNlKSk7IC8vIDBcbiAqIHByaW50KGludChbZmFsc2UsIHRydWUsICcxMC4zJywgOS44XSkpOyAvLyBbMCwgMSwgMTAsIDldXG4gKiA8L2NvZGU+PC9kaXY+XG4gKi9cbi8qKlxuICogQG1ldGhvZCBpbnRcbiAqIEBwYXJhbSB7QXJyYXl9IG5zICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgdG8gcGFyc2VcbiAqIEByZXR1cm4ge051bWJlcltdfSAgICAgICAgICAgICAgICAgICBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlc1xuICovXG5wNS5wcm90b3R5cGUuaW50ID0gZnVuY3Rpb24obiwgcmFkaXgpIHtcbiAgcmFkaXggPSByYWRpeCB8fCAxMDtcbiAgaWYgKHR5cGVvZiBuID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYXJzZUludChuLCByYWRpeCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG4gPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIG4gfCAwO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBuID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gbiA/IDEgOiAwO1xuICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBuLm1hcChmdW5jdGlvbihuKSB7XG4gICAgICByZXR1cm4gcDUucHJvdG90eXBlLmludChuLCByYWRpeCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBib29sZWFuLCBzdHJpbmcgb3IgbnVtYmVyIHRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gKiBXaGVuIGFuIGFycmF5IG9mIHZhbHVlcyBpcyBwYXNzZWQgaW4sIHRoZW4gYW4gYXJyYXkgb2Ygc3RyaW5ncyBvZiB0aGUgc2FtZVxuICogbGVuZ3RoIGlzIHJldHVybmVkLlxuICpcbiAqIEBtZXRob2Qgc3RyXG4gKiBAcGFyYW0ge1N0cmluZ3xCb29sZWFufE51bWJlcnxBcnJheX0gbiB2YWx1ZSB0byBwYXJzZVxuICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9J25vcmVuZGVyJz48Y29kZT5cbiAqIHByaW50KHN0cignMTAnKSk7IC8vIFwiMTBcIlxuICogcHJpbnQoc3RyKDEwLjMxKSk7IC8vIFwiMTAuMzFcIlxuICogcHJpbnQoc3RyKC0xMCkpOyAvLyBcIi0xMFwiXG4gKiBwcmludChzdHIodHJ1ZSkpOyAvLyBcInRydWVcIlxuICogcHJpbnQoc3RyKGZhbHNlKSk7IC8vIFwiZmFsc2VcIlxuICogcHJpbnQoc3RyKFt0cnVlLCAnMTAuMycsIDkuOF0pKTsgLy8gWyBcInRydWVcIiwgXCIxMC4zXCIsIFwiOS44XCIgXVxuICogPC9jb2RlPjwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUuc3RyID0gZnVuY3Rpb24obikge1xuICBpZiAobiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgcmV0dXJuIG4ubWFwKHA1LnByb3RvdHlwZS5zdHIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBTdHJpbmcobik7XG4gIH1cbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGl0cyBib29sZWFuIHJlcHJlc2VudGF0aW9uLlxuICogRm9yIGEgbnVtYmVyLCBhbnkgbm9uLXplcm8gdmFsdWUgKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBldmFsdWF0ZXMgdG8gdHJ1ZSxcbiAqIHdoaWxlIHplcm8gZXZhbHVhdGVzIHRvIGZhbHNlLiBGb3IgYSBzdHJpbmcsIHRoZSB2YWx1ZSBcInRydWVcIiBldmFsdWF0ZXMgdG9cbiAqIHRydWUsIHdoaWxlIGFueSBvdGhlciB2YWx1ZSBldmFsdWF0ZXMgdG8gZmFsc2UuIFdoZW4gYW4gYXJyYXkgb2YgbnVtYmVyIG9yXG4gKiBzdHJpbmcgdmFsdWVzIGlzIHBhc3NlZCBpbiwgdGhlbiBhIGFycmF5IG9mIGJvb2xlYW5zIG9mIHRoZSBzYW1lIGxlbmd0aCBpc1xuICogcmV0dXJuZWQuXG4gKlxuICogQG1ldGhvZCBib29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ3xCb29sZWFufE51bWJlcnxBcnJheX0gbiB2YWx1ZSB0byBwYXJzZVxuICogQHJldHVybiB7Qm9vbGVhbn0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPSdub3JlbmRlcic+PGNvZGU+XG4gKiBwcmludChib29sZWFuKDApKTsgLy8gZmFsc2VcbiAqIHByaW50KGJvb2xlYW4oMSkpOyAvLyB0cnVlXG4gKiBwcmludChib29sZWFuKCd0cnVlJykpOyAvLyB0cnVlXG4gKiBwcmludChib29sZWFuKCdhYmNkJykpOyAvLyBmYWxzZVxuICogcHJpbnQoYm9vbGVhbihbMCwgMTIsICd0cnVlJ10pKTsgLy8gW2ZhbHNlLCB0cnVlLCBmYWxzZV1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xucDUucHJvdG90eXBlLmJvb2xlYW4gPSBmdW5jdGlvbihuKSB7XG4gIGlmICh0eXBlb2YgbiA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbiAhPT0gMDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbi50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG4gPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBuO1xuICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBuLm1hcChwNS5wcm90b3R5cGUuYm9vbGVhbik7XG4gIH1cbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBudW1iZXIsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG51bWJlciwgb3IgYm9vbGVhbiB0byBpdHMgYnl0ZVxuICogcmVwcmVzZW50YXRpb24uIEEgYnl0ZSBjYW4gYmUgb25seSBhIHdob2xlIG51bWJlciBiZXR3ZWVuIC0xMjggYW5kIDEyNywgc29cbiAqIHdoZW4gYSB2YWx1ZSBvdXRzaWRlIG9mIHRoaXMgcmFuZ2UgaXMgY29udmVydGVkLCBpdCB3cmFwcyBhcm91bmQgdG8gdGhlXG4gKiBjb3JyZXNwb25kaW5nIGJ5dGUgcmVwcmVzZW50YXRpb24uIFdoZW4gYW4gYXJyYXkgb2YgbnVtYmVyLCBzdHJpbmcgb3IgYm9vbGVhblxuICogdmFsdWVzIGlzIHBhc3NlZCBpbiwgdGhlbiBhbiBhcnJheSBvZiBieXRlcyB0aGUgc2FtZSBsZW5ndGggaXMgcmV0dXJuZWQuXG4gKlxuICogQG1ldGhvZCBieXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xCb29sZWFufE51bWJlcn0gICAgICAgbiB2YWx1ZSB0byBwYXJzZVxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICAgICAgICAgICAgIGJ5dGUgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogcHJpbnQoYnl0ZSgxMjcpKTsgLy8gMTI3XG4gKiBwcmludChieXRlKDEyOCkpOyAvLyAtMTI4XG4gKiBwcmludChieXRlKDIzLjQpKTsgLy8gMjNcbiAqIHByaW50KGJ5dGUoJzIzLjQnKSk7IC8vIDIzXG4gKiBwcmludChieXRlKCdoZWxsbycpKTsgLy8gTmFOXG4gKiBwcmludChieXRlKHRydWUpKTsgLy8gMVxuICogcHJpbnQoYnl0ZShbMCwgMjU1LCAnMTAwJ10pKTsgLy8gWzAsIC0xLCAxMDBdXG4gKiA8L2NvZGU+PC9kaXY+XG4gKi9cbi8qKlxuICogQG1ldGhvZCBieXRlXG4gKiBAcGFyYW0ge0FycmF5fSBucyAgICAgICAgICAgICAgICAgICB2YWx1ZXMgdG8gcGFyc2VcbiAqIEByZXR1cm4ge051bWJlcltdfSAgICAgICAgICAgICAgICAgIGFycmF5IG9mIGJ5dGUgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVzXG4gKi9cbnA1LnByb3RvdHlwZS5ieXRlID0gZnVuY3Rpb24obikge1xuICB2YXIgbm4gPSBwNS5wcm90b3R5cGUuaW50KG4sIDEwKTtcbiAgaWYgKHR5cGVvZiBubiA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gKG5uICsgMTI4KSAlIDI1NiAtIDEyODtcbiAgfSBlbHNlIGlmIChubiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgcmV0dXJuIG5uLm1hcChwNS5wcm90b3R5cGUuYnl0ZSk7XG4gIH1cbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGl0cyBjb3JyZXNwb25kaW5nIHNpbmdsZS1jaGFyYWN0ZXJcbiAqIHN0cmluZyByZXByZXNlbnRhdGlvbi4gSWYgYSBzdHJpbmcgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCBpdCBpcyBmaXJzdFxuICogcGFyc2VkIGFzIGFuIGludGVnZXIgYW5kIHRoZW4gdHJhbnNsYXRlZCBpbnRvIGEgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcuXG4gKiBXaGVuIGFuIGFycmF5IG9mIG51bWJlciBvciBzdHJpbmcgdmFsdWVzIGlzIHBhc3NlZCBpbiwgdGhlbiBhbiBhcnJheSBvZlxuICogc2luZ2xlLWNoYXJhY3RlciBzdHJpbmdzIG9mIHRoZSBzYW1lIGxlbmd0aCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAbWV0aG9kIGNoYXJcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gICAgICAgbiB2YWx1ZSB0byBwYXJzZVxuICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogcHJpbnQoY2hhcig2NSkpOyAvLyBcIkFcIlxuICogcHJpbnQoY2hhcignNjUnKSk7IC8vIFwiQVwiXG4gKiBwcmludChjaGFyKFs2NSwgNjYsIDY3XSkpOyAvLyBbIFwiQVwiLCBcIkJcIiwgXCJDXCIgXVxuICogcHJpbnQoam9pbihjaGFyKFs2NSwgNjYsIDY3XSksICcnKSk7IC8vIFwiQUJDXCJcbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGNoYXJcbiAqIEBwYXJhbSB7QXJyYXl9IG5zICAgICAgICAgICAgICB2YWx1ZXMgdG8gcGFyc2VcbiAqIEByZXR1cm4ge1N0cmluZ1tdfSAgICAgICAgICAgICBhcnJheSBvZiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVzXG4gKi9cbnA1LnByb3RvdHlwZS5jaGFyID0gZnVuY3Rpb24obikge1xuICBpZiAodHlwZW9mIG4gPT09ICdudW1iZXInICYmICFpc05hTihuKSkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG4pO1xuICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBuLm1hcChwNS5wcm90b3R5cGUuY2hhcik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG4gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHA1LnByb3RvdHlwZS5jaGFyKHBhcnNlSW50KG4sIDEwKSk7XG4gIH1cbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyB0byBpdHMgY29ycmVzcG9uZGluZyBpbnRlZ2VyXG4gKiByZXByZXNlbnRhdGlvbi4gV2hlbiBhbiBhcnJheSBvZiBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyB2YWx1ZXMgaXMgcGFzc2VkXG4gKiBpbiwgdGhlbiBhbiBhcnJheSBvZiBpbnRlZ2VycyBvZiB0aGUgc2FtZSBsZW5ndGggaXMgcmV0dXJuZWQuXG4gKlxuICogQG1ldGhvZCB1bmNoYXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBuICAgICB2YWx1ZSB0byBwYXJzZVxuICogQHJldHVybiB7TnVtYmVyfSAgICAgIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogcHJpbnQodW5jaGFyKCdBJykpOyAvLyA2NVxuICogcHJpbnQodW5jaGFyKFsnQScsICdCJywgJ0MnXSkpOyAvLyBbIDY1LCA2NiwgNjcgXVxuICogcHJpbnQodW5jaGFyKHNwbGl0KCdBQkMnLCAnJykpKTsgLy8gWyA2NSwgNjYsIDY3IF1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIHVuY2hhclxuICogQHBhcmFtIHtBcnJheX0gbnMgICAgICAgdmFsdWVzIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHtOdW1iZXJbXX0gICAgICBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlc1xuICovXG5wNS5wcm90b3R5cGUudW5jaGFyID0gZnVuY3Rpb24obikge1xuICBpZiAodHlwZW9mIG4gPT09ICdzdHJpbmcnICYmIG4ubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG4uY2hhckNvZGVBdCgwKTtcbiAgfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICByZXR1cm4gbi5tYXAocDUucHJvdG90eXBlLnVuY2hhcik7XG4gIH1cbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBudW1iZXIgdG8gYSBzdHJpbmcgaW4gaXRzIGVxdWl2YWxlbnQgaGV4YWRlY2ltYWwgbm90YXRpb24uIElmIGFcbiAqIHNlY29uZCBwYXJhbWV0ZXIgaXMgcGFzc2VkLCBpdCBpcyB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG9cbiAqIGdlbmVyYXRlIGluIHRoZSBoZXhhZGVjaW1hbCBub3RhdGlvbi4gV2hlbiBhbiBhcnJheSBpcyBwYXNzZWQgaW4sIGFuXG4gKiBhcnJheSBvZiBzdHJpbmdzIGluIGhleGFkZWNpbWFsIG5vdGF0aW9uIG9mIHRoZSBzYW1lIGxlbmd0aCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAbWV0aG9kIGhleFxuICogQHBhcmFtIHtOdW1iZXJ9IG4gICAgIHZhbHVlIHRvIHBhcnNlXG4gKiBAcGFyYW0ge051bWJlcn0gW2RpZ2l0c11cbiAqIEByZXR1cm4ge1N0cmluZ30gICAgICBoZXhhZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogcHJpbnQoaGV4KDI1NSkpOyAvLyBcIjAwMDAwMEZGXCJcbiAqIHByaW50KGhleCgyNTUsIDYpKTsgLy8gXCIwMDAwRkZcIlxuICogcHJpbnQoaGV4KFswLCAxMjcsIDI1NV0sIDYpKTsgLy8gWyBcIjAwMDAwMFwiLCBcIjAwMDA3RlwiLCBcIjAwMDBGRlwiIF1cbiAqIDwvY29kZT48L2Rpdj5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGhleFxuICogQHBhcmFtIHtOdW1iZXJbXX0gbnMgICAgYXJyYXkgb2YgdmFsdWVzIHRvIHBhcnNlXG4gKiBAcGFyYW0ge051bWJlcn0gW2RpZ2l0c11cbiAqIEByZXR1cm4ge1N0cmluZ1tdfSAgICAgIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZXNcbiAqL1xucDUucHJvdG90eXBlLmhleCA9IGZ1bmN0aW9uKG4sIGRpZ2l0cykge1xuICBkaWdpdHMgPSBkaWdpdHMgPT09IHVuZGVmaW5lZCB8fCBkaWdpdHMgPT09IG51bGwgPyAoZGlnaXRzID0gOCkgOiBkaWdpdHM7XG4gIGlmIChuIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICByZXR1cm4gbi5tYXAoZnVuY3Rpb24obikge1xuICAgICAgcmV0dXJuIHA1LnByb3RvdHlwZS5oZXgobiwgZGlnaXRzKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbiA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAobiA8IDApIHtcbiAgICAgIG4gPSAweGZmZmZmZmZmICsgbiArIDE7XG4gICAgfVxuICAgIHZhciBoZXggPSBOdW1iZXIobilcbiAgICAgIC50b1N0cmluZygxNilcbiAgICAgIC50b1VwcGVyQ2FzZSgpO1xuICAgIHdoaWxlIChoZXgubGVuZ3RoIDwgZGlnaXRzKSB7XG4gICAgICBoZXggPSAnMCcgKyBoZXg7XG4gICAgfVxuICAgIGlmIChoZXgubGVuZ3RoID49IGRpZ2l0cykge1xuICAgICAgaGV4ID0gaGV4LnN1YnN0cmluZyhoZXgubGVuZ3RoIC0gZGlnaXRzLCBoZXgubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbiAgfVxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGhleGFkZWNpbWFsIG51bWJlciB0byBpdHMgZXF1aXZhbGVudFxuICogaW50ZWdlciB2YWx1ZS4gV2hlbiBhbiBhcnJheSBvZiBzdHJpbmdzIGluIGhleGFkZWNpbWFsIG5vdGF0aW9uIGlzIHBhc3NlZFxuICogaW4sIGFuIGFycmF5IG9mIGludGVnZXJzIG9mIHRoZSBzYW1lIGxlbmd0aCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAbWV0aG9kIHVuaGV4XG4gKiBAcGFyYW0ge1N0cmluZ30gbiB2YWx1ZSB0byBwYXJzZVxuICogQHJldHVybiB7TnVtYmVyfSAgICAgIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgaGV4YWRlY2ltYWwgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz0nbm9yZW5kZXInPjxjb2RlPlxuICogcHJpbnQodW5oZXgoJ0EnKSk7IC8vIDEwXG4gKiBwcmludCh1bmhleCgnRkYnKSk7IC8vIDI1NVxuICogcHJpbnQodW5oZXgoWydGRicsICdBQScsICcwMCddKSk7IC8vIFsgMjU1LCAxNzAsIDAgXVxuICogPC9jb2RlPjwvZGl2PlxuICovXG4vKipcbiAqIEBtZXRob2QgdW5oZXhcbiAqIEBwYXJhbSB7QXJyYXl9IG5zIHZhbHVlcyB0byBwYXJzZVxuICogQHJldHVybiB7TnVtYmVyW119ICAgICAgaW50ZWdlciByZXByZXNlbnRhdGlvbnMgb2YgaGV4YWRlY2ltYWwgdmFsdWVcbiAqL1xucDUucHJvdG90eXBlLnVuaGV4ID0gZnVuY3Rpb24obikge1xuICBpZiAobiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgcmV0dXJuIG4ubWFwKHA1LnByb3RvdHlwZS51bmhleCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KCcweCcgKyBuLCAxNik7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSw2MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgRGF0YVxuICogQHN1Ym1vZHVsZSBTdHJpbmcgRnVuY3Rpb25zXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5fZGVyZXFfKCcuLi9jb3JlL2Vycm9yX2hlbHBlcnMnKTtcblxuLy9yZXR1cm4gcDU7IC8vTE0gaXMgdGhpcyBhIG1pc3Rha2U/XG5cbi8qKlxuICogQ29tYmluZXMgYW4gYXJyYXkgb2YgU3RyaW5ncyBpbnRvIG9uZSBTdHJpbmcsIGVhY2ggc2VwYXJhdGVkIGJ5IHRoZVxuICogY2hhcmFjdGVyKHMpIHVzZWQgZm9yIHRoZSBzZXBhcmF0b3IgcGFyYW1ldGVyLiBUbyBqb2luIGFycmF5cyBvZiBpbnRzIG9yXG4gKiBmbG9hdHMsIGl0J3MgbmVjZXNzYXJ5IHRvIGZpcnN0IGNvbnZlcnQgdGhlbSB0byBTdHJpbmdzIHVzaW5nIG5mKCkgb3JcbiAqIG5mcygpLlxuICpcbiAqIEBtZXRob2Qgam9pblxuICogQHBhcmFtICB7QXJyYXl9ICBsaXN0ICAgICAgYXJyYXkgb2YgU3RyaW5ncyB0byBiZSBqb2luZWRcbiAqIEBwYXJhbSAge1N0cmluZ30gc2VwYXJhdG9yIFN0cmluZyB0byBiZSBwbGFjZWQgYmV0d2VlbiBlYWNoIGl0ZW1cbiAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgICAgIGpvaW5lZCBTdHJpbmdcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgYXJyYXkgPSBbJ0hlbGxvJywgJ3dvcmxkISddO1xuICogdmFyIHNlcGFyYXRvciA9ICcgJztcbiAqIHZhciBtZXNzYWdlID0gam9pbihhcnJheSwgc2VwYXJhdG9yKTtcbiAqIHRleHQobWVzc2FnZSwgNSwgNTApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogXCJoZWxsbyB3b3JsZCFcIiBkaXNwbGF5ZWQgbWlkZGxlIGxlZnQgb2YgY2FudmFzLlxuICpcbiAqL1xucDUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbihsaXN0LCBzZXBhcmF0b3IpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnam9pbicsIGFyZ3VtZW50cyk7XG4gIHJldHVybiBsaXN0LmpvaW4oc2VwYXJhdG9yKTtcbn07XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFwcGx5IGEgcmVndWxhciBleHByZXNzaW9uIHRvIGEgcGllY2Ugb2YgdGV4dCxcbiAqIGFuZCByZXR1cm4gbWF0Y2hpbmcgZ3JvdXBzIChlbGVtZW50cyBmb3VuZCBpbnNpZGUgcGFyZW50aGVzZXMpIGFzIGFcbiAqIFN0cmluZyBhcnJheS4gSWYgdGhlcmUgYXJlIG5vIG1hdGNoZXMsIGEgbnVsbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLlxuICogSWYgbm8gZ3JvdXBzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYnV0IHRoZSBzZXF1ZW5jZVxuICogbWF0Y2hlcywgYW4gYXJyYXkgb2YgbGVuZ3RoIDEgKHdpdGggdGhlIG1hdGNoZWQgdGV4dCBhcyB0aGUgZmlyc3QgZWxlbWVudFxuICogb2YgdGhlIGFycmF5KSB3aWxsIGJlIHJldHVybmVkLlxuICogPGJyPjxicj5cbiAqIFRvIHVzZSB0aGUgZnVuY3Rpb24sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVzdWx0IGlzIG51bGwuIElmIHRoZVxuICogcmVzdWx0IGlzIG51bGwsIHRoZW4gdGhlIHNlcXVlbmNlIGRpZCBub3QgbWF0Y2ggYXQgYWxsLiBJZiB0aGUgc2VxdWVuY2VcbiAqIGRpZCBtYXRjaCwgYW4gYXJyYXkgaXMgcmV0dXJuZWQuXG4gKiA8YnI+PGJyPlxuICogSWYgdGhlcmUgYXJlIGdyb3VwcyAoc3BlY2lmaWVkIGJ5IHNldHMgb2YgcGFyZW50aGVzZXMpIGluIHRoZSByZWd1bGFyXG4gKiBleHByZXNzaW9uLCB0aGVuIHRoZSBjb250ZW50cyBvZiBlYWNoIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGFycmF5LlxuICogRWxlbWVudCBbMF0gb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggcmV0dXJucyB0aGUgZW50aXJlIG1hdGNoaW5nXG4gKiBzdHJpbmcsIGFuZCB0aGUgbWF0Y2ggZ3JvdXBzIHN0YXJ0IGF0IGVsZW1lbnQgWzFdICh0aGUgZmlyc3QgZ3JvdXAgaXMgWzFdLFxuICogdGhlIHNlY29uZCBbMl0sIGFuZCBzbyBvbikuXG4gKlxuICogQG1ldGhvZCBtYXRjaFxuICogQHBhcmFtICB7U3RyaW5nfSBzdHIgICAgdGhlIFN0cmluZyB0byBiZSBzZWFyY2hlZFxuICogQHBhcmFtICB7U3RyaW5nfSByZWdleHAgdGhlIHJlZ2V4cCB0byBiZSB1c2VkIGZvciBtYXRjaGluZ1xuICogQHJldHVybiB7U3RyaW5nW119ICAgICAgQXJyYXkgb2YgU3RyaW5ncyBmb3VuZFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBzdHJpbmcgPSAnSGVsbG8gcDVqcyohJztcbiAqIHZhciByZWdleHAgPSAncDVqc1xcXFwqJztcbiAqIHZhciBtID0gbWF0Y2goc3RyaW5nLCByZWdleHApO1xuICogdGV4dChtLCA1LCA1MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBcInA1anMqXCIgZGlzcGxheWVkIG1pZGRsZSBsZWZ0IG9mIGNhbnZhcy5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5tYXRjaCA9IGZ1bmN0aW9uKHN0ciwgcmVnKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ21hdGNoJywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHN0ci5tYXRjaChyZWcpO1xufTtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXBwbHkgYSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSBwaWVjZSBvZiB0ZXh0LFxuICogYW5kIHJldHVybiBhIGxpc3Qgb2YgbWF0Y2hpbmcgZ3JvdXBzIChlbGVtZW50cyBmb3VuZCBpbnNpZGUgcGFyZW50aGVzZXMpXG4gKiBhcyBhIHR3by1kaW1lbnNpb25hbCBTdHJpbmcgYXJyYXkuIElmIHRoZXJlIGFyZSBubyBtYXRjaGVzLCBhIG51bGwgdmFsdWVcbiAqIHdpbGwgYmUgcmV0dXJuZWQuIElmIG5vIGdyb3VwcyBhcmUgc3BlY2lmaWVkIGluIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sXG4gKiBidXQgdGhlIHNlcXVlbmNlIG1hdGNoZXMsIGEgdHdvIGRpbWVuc2lvbmFsIGFycmF5IGlzIHN0aWxsIHJldHVybmVkLCBidXRcbiAqIHRoZSBzZWNvbmQgZGltZW5zaW9uIGlzIG9ubHkgb2YgbGVuZ3RoIG9uZS5cbiAqIDxicj48YnI+XG4gKiBUbyB1c2UgdGhlIGZ1bmN0aW9uLCBmaXJzdCBjaGVjayB0byBzZWUgaWYgdGhlIHJlc3VsdCBpcyBudWxsLiBJZiB0aGVcbiAqIHJlc3VsdCBpcyBudWxsLCB0aGVuIHRoZSBzZXF1ZW5jZSBkaWQgbm90IG1hdGNoIGF0IGFsbC4gSWYgdGhlIHNlcXVlbmNlXG4gKiBkaWQgbWF0Y2gsIGEgMkQgYXJyYXkgaXMgcmV0dXJuZWQuXG4gKiA8YnI+PGJyPlxuICogSWYgdGhlcmUgYXJlIGdyb3VwcyAoc3BlY2lmaWVkIGJ5IHNldHMgb2YgcGFyZW50aGVzZXMpIGluIHRoZSByZWd1bGFyXG4gKiBleHByZXNzaW9uLCB0aGVuIHRoZSBjb250ZW50cyBvZiBlYWNoIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGFycmF5LlxuICogQXNzdW1pbmcgYSBsb29wIHdpdGggY291bnRlciB2YXJpYWJsZSBpLCBlbGVtZW50IFtpXVswXSBvZiBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24gbWF0Y2ggcmV0dXJucyB0aGUgZW50aXJlIG1hdGNoaW5nIHN0cmluZywgYW5kIHRoZSBtYXRjaCBncm91cHNcbiAqIHN0YXJ0IGF0IGVsZW1lbnQgW2ldWzFdICh0aGUgZmlyc3QgZ3JvdXAgaXMgW2ldWzFdLCB0aGUgc2Vjb25kIFtpXVsyXSxcbiAqIGFuZCBzbyBvbikuXG4gKlxuICogQG1ldGhvZCBtYXRjaEFsbFxuICogQHBhcmFtICB7U3RyaW5nfSBzdHIgICAgdGhlIFN0cmluZyB0byBiZSBzZWFyY2hlZFxuICogQHBhcmFtICB7U3RyaW5nfSByZWdleHAgdGhlIHJlZ2V4cCB0byBiZSB1c2VkIGZvciBtYXRjaGluZ1xuICogQHJldHVybiB7U3RyaW5nW119ICAgICAgICAgMmQgQXJyYXkgb2YgU3RyaW5ncyBmb3VuZFxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJub3JlbmRlclwiPlxuICogPGNvZGU+XG4gKiB2YXIgc3RyaW5nID0gJ0hlbGxvIHA1anMqISBIZWxsbyB3b3JsZCEnO1xuICogdmFyIHJlZ2V4cCA9ICdIZWxsbyc7XG4gKiBtYXRjaEFsbChzdHJpbmcsIHJlZ2V4cCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xucDUucHJvdG90eXBlLm1hdGNoQWxsID0gZnVuY3Rpb24oc3RyLCByZWcpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnbWF0Y2hBbGwnLCBhcmd1bWVudHMpO1xuICB2YXIgcmUgPSBuZXcgUmVnRXhwKHJlZywgJ2cnKTtcbiAgdmFyIG1hdGNoID0gcmUuZXhlYyhzdHIpO1xuICB2YXIgbWF0Y2hlcyA9IFtdO1xuICB3aGlsZSAobWF0Y2ggIT09IG51bGwpIHtcbiAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgIC8vIG1hdGNoZWQgdGV4dDogbWF0Y2hbMF1cbiAgICAvLyBtYXRjaCBzdGFydDogbWF0Y2guaW5kZXhcbiAgICAvLyBjYXB0dXJpbmcgZ3JvdXAgbjogbWF0Y2hbbl1cbiAgICBtYXRjaCA9IHJlLmV4ZWMoc3RyKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlcztcbn07XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgZm9ybWF0dGluZyBudW1iZXJzIGludG8gc3RyaW5ncy4gVGhlcmUgYXJlIHR3b1xuICogdmVyc2lvbnM6IG9uZSBmb3IgZm9ybWF0dGluZyBmbG9hdHMsIGFuZCBvbmUgZm9yIGZvcm1hdHRpbmcgaW50cy5cbiAqIFRoZSB2YWx1ZXMgZm9yIHRoZSBkaWdpdHMsIGxlZnQsIGFuZCByaWdodCBwYXJhbWV0ZXJzIHNob3VsZCBhbHdheXNcbiAqIGJlIHBvc2l0aXZlIGludGVnZXJzLlxuICpcbiAqIEBtZXRob2QgbmZcbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30gICAgICAgbnVtICAgICAgdGhlIE51bWJlciB0byBmb3JtYXRcbiAqIEBwYXJhbSB7SW50ZWdlcnxTdHJpbmd9ICAgICAgW2xlZnRdICAgbnVtYmVyIG9mIGRpZ2l0cyB0byB0aGUgbGVmdCBvZiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsIHBvaW50XG4gKiBAcGFyYW0ge0ludGVnZXJ8U3RyaW5nfSAgICAgIFtyaWdodF0gIG51bWJlciBvZiBkaWdpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgcG9pbnRcbiAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgICAgICAgICBmb3JtYXR0ZWQgU3RyaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHZhciBudW0gPSAxMTIuNTMxMDYxMTU7XG4gKlxuICogICBub1N0cm9rZSgpO1xuICogICBmaWxsKDApO1xuICogICB0ZXh0U2l6ZSgxNCk7XG4gKiAgIC8vIERyYXcgZm9ybWF0dGVkIG51bWJlcnNcbiAqICAgdGV4dChuZihudW0sIDUsIDIpLCAxMCwgMjApO1xuICpcbiAqICAgdGV4dChuZihudW0sIDQsIDMpLCAxMCwgNTUpO1xuICpcbiAqICAgdGV4dChuZihudW0sIDMsIDYpLCAxMCwgODUpO1xuICpcbiAqICAgLy8gRHJhdyBkaXZpZGluZyBsaW5lc1xuICogICBzdHJva2UoMTIwKTtcbiAqICAgbGluZSgwLCAzMCwgd2lkdGgsIDMwKTtcbiAqICAgbGluZSgwLCA2NSwgd2lkdGgsIDY1KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIFwiMDAxMTI1M1wiIHRvcCBsZWZ0LCBcIjAxMTIuNTMxXCIgbWlkIGxlZnQsIFwiMTEyLjUzMTA2MVwiIGJvdHRvbSBsZWZ0IGNhbnZhc1xuICovXG4vKipcbiAqIEBtZXRob2QgbmZcbiAqIEBwYXJhbSB7QXJyYXl9ICAgICAgICBudW1zICAgICB0aGUgTnVtYmVycyB0byBmb3JtYXRcbiAqIEBwYXJhbSB7SW50ZWdlcnxTdHJpbmd9ICAgICAgW2xlZnRdXG4gKiBAcGFyYW0ge0ludGVnZXJ8U3RyaW5nfSAgICAgIFtyaWdodF1cbiAqIEByZXR1cm4ge1N0cmluZ1tdfSAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgU3RyaW5nc1xuICovXG5wNS5wcm90b3R5cGUubmYgPSBmdW5jdGlvbihudW1zLCBsZWZ0LCByaWdodCkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCduZicsIGFyZ3VtZW50cyk7XG4gIGlmIChudW1zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICByZXR1cm4gbnVtcy5tYXAoZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIGRvTmYoeCwgbGVmdCwgcmlnaHQpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZhciB0eXBlT2ZGaXJzdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChudW1zKTtcbiAgICBpZiAodHlwZU9mRmlyc3QgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nKSB7XG4gICAgICBpZiAobnVtcy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmYobnVtc1swXSwgbnVtc1sxXSwgbnVtc1syXSk7XG4gICAgICB9IGVsc2UgaWYgKG51bXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5mKG51bXNbMF0sIG51bXNbMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmYobnVtc1swXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkb05mKG51bXMsIGxlZnQsIHJpZ2h0KTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGRvTmYobnVtLCBsZWZ0LCByaWdodCkge1xuICB2YXIgbmVnID0gbnVtIDwgMDtcbiAgdmFyIG4gPSBuZWcgPyBudW0udG9TdHJpbmcoKS5zdWJzdHJpbmcoMSkgOiBudW0udG9TdHJpbmcoKTtcbiAgdmFyIGRlY2ltYWxJbmQgPSBuLmluZGV4T2YoJy4nKTtcbiAgdmFyIGludFBhcnQgPSBkZWNpbWFsSW5kICE9PSAtMSA/IG4uc3Vic3RyaW5nKDAsIGRlY2ltYWxJbmQpIDogbjtcbiAgdmFyIGRlY1BhcnQgPSBkZWNpbWFsSW5kICE9PSAtMSA/IG4uc3Vic3RyaW5nKGRlY2ltYWxJbmQgKyAxKSA6ICcnO1xuICB2YXIgc3RyID0gbmVnID8gJy0nIDogJyc7XG4gIGlmICh0eXBlb2YgcmlnaHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIGRlY2ltYWwgPSAnJztcbiAgICBpZiAoZGVjaW1hbEluZCAhPT0gLTEgfHwgcmlnaHQgLSBkZWNQYXJ0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGRlY2ltYWwgPSAnLic7XG4gICAgfVxuICAgIGlmIChkZWNQYXJ0Lmxlbmd0aCA+IHJpZ2h0KSB7XG4gICAgICBkZWNQYXJ0ID0gZGVjUGFydC5zdWJzdHJpbmcoMCwgcmlnaHQpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlZnQgLSBpbnRQYXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBzdHIgKz0gJzAnO1xuICAgIH1cbiAgICBzdHIgKz0gaW50UGFydDtcbiAgICBzdHIgKz0gZGVjaW1hbDtcbiAgICBzdHIgKz0gZGVjUGFydDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpZ2h0IC0gZGVjUGFydC5sZW5ndGg7IGorKykge1xuICAgICAgc3RyICs9ICcwJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IE1hdGgubWF4KGxlZnQgLSBpbnRQYXJ0Lmxlbmd0aCwgMCk7IGsrKykge1xuICAgICAgc3RyICs9ICcwJztcbiAgICB9XG4gICAgc3RyICs9IG47XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGZvcm1hdHRpbmcgbnVtYmVycyBpbnRvIHN0cmluZ3MgYW5kIHBsYWNpbmdcbiAqIGFwcHJvcHJpYXRlIGNvbW1hcyB0byBtYXJrIHVuaXRzIG9mIDEwMDAuIFRoZXJlIGFyZSB0d28gdmVyc2lvbnM6IG9uZVxuICogZm9yIGZvcm1hdHRpbmcgaW50cywgYW5kIG9uZSBmb3IgZm9ybWF0dGluZyBhbiBhcnJheSBvZiBpbnRzLiBUaGUgdmFsdWVcbiAqIGZvciB0aGUgcmlnaHQgcGFyYW1ldGVyIHNob3VsZCBhbHdheXMgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICpcbiAqIEBtZXRob2QgbmZjXG4gKiBAcGFyYW0gIHtOdW1iZXJ8U3RyaW5nfSAgIG51bSAgICAgdGhlIE51bWJlciB0byBmb3JtYXRcbiAqIEBwYXJhbSAge0ludGVnZXJ8U3RyaW5nfSAgW3JpZ2h0XSBudW1iZXIgb2YgZGlnaXRzIHRvIHRoZSByaWdodCBvZiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgcG9pbnRcbiAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgICAgIGZvcm1hdHRlZCBTdHJpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgdmFyIG51bSA9IDExMjUzMTA2LjExNTtcbiAqICAgdmFyIG51bUFyciA9IFsxLCAxLCAyXTtcbiAqXG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIGZpbGwoMCk7XG4gKiAgIHRleHRTaXplKDEyKTtcbiAqXG4gKiAgIC8vIERyYXcgZm9ybWF0dGVkIG51bWJlcnNcbiAqICAgdGV4dChuZmMobnVtLCA0KSwgMTAsIDMwKTtcbiAqICAgdGV4dChuZmMobnVtQXJyLCAyKSwgMTAsIDgwKTtcbiAqXG4gKiAgIC8vIERyYXcgZGl2aWRpbmcgbGluZVxuICogICBzdHJva2UoMTIwKTtcbiAqICAgbGluZSgwLCA1MCwgd2lkdGgsIDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIFwiMTEsMjUzLDEwNi4xMTVcIiB0b3AgbWlkZGxlIGFuZCBcIjEuMDAsMS4wMCwyLjAwXCIgZGlzcGxheWVkIGJvdHRvbSBtaWRcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIG5mY1xuICogQHBhcmFtICB7QXJyYXl9ICAgIG51bXMgICAgIHRoZSBOdW1iZXJzIHRvIGZvcm1hdFxuICogQHBhcmFtICB7SW50ZWdlcnxTdHJpbmd9ICBbcmlnaHRdXG4gKiBAcmV0dXJuIHtTdHJpbmdbXX0gICAgICAgICAgIGZvcm1hdHRlZCBTdHJpbmdzXG4gKi9cbnA1LnByb3RvdHlwZS5uZmMgPSBmdW5jdGlvbihudW0sIHJpZ2h0KSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ25mYycsIGFyZ3VtZW50cyk7XG4gIGlmIChudW0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBudW0ubWFwKGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBkb05mYyh4LCByaWdodCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRvTmZjKG51bSwgcmlnaHQpO1xuICB9XG59O1xuZnVuY3Rpb24gZG9OZmMobnVtLCByaWdodCkge1xuICBudW0gPSBudW0udG9TdHJpbmcoKTtcbiAgdmFyIGRlYyA9IG51bS5pbmRleE9mKCcuJyk7XG4gIHZhciByZW0gPSBkZWMgIT09IC0xID8gbnVtLnN1YnN0cmluZyhkZWMpIDogJyc7XG4gIHZhciBuID0gZGVjICE9PSAtMSA/IG51bS5zdWJzdHJpbmcoMCwgZGVjKSA6IG51bTtcbiAgbiA9IG4udG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpO1xuICBpZiAocmlnaHQgPT09IDApIHtcbiAgICByZW0gPSAnJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgcmlnaHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHJpZ2h0ID4gcmVtLmxlbmd0aCkge1xuICAgICAgcmVtICs9IGRlYyA9PT0gLTEgPyAnLicgOiAnJztcbiAgICAgIHZhciBsZW4gPSByaWdodCAtIHJlbS5sZW5ndGggKyAxO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICByZW0gKz0gJzAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZW0gPSByZW0uc3Vic3RyaW5nKDAsIHJpZ2h0ICsgMSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuICsgcmVtO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGZvcm1hdHRpbmcgbnVtYmVycyBpbnRvIHN0cmluZ3MuIFNpbWlsYXIgdG8gbmYoKSBidXRcbiAqIHB1dHMgYSBcIitcIiBpbiBmcm9udCBvZiBwb3NpdGl2ZSBudW1iZXJzIGFuZCBhIFwiLVwiIGluIGZyb250IG9mIG5lZ2F0aXZlXG4gKiBudW1iZXJzLiBUaGVyZSBhcmUgdHdvIHZlcnNpb25zOiBvbmUgZm9yIGZvcm1hdHRpbmcgZmxvYXRzLCBhbmQgb25lIGZvclxuICogZm9ybWF0dGluZyBpbnRzLiBUaGUgdmFsdWVzIGZvciBsZWZ0LCBhbmQgcmlnaHQgcGFyYW1ldGVyc1xuICogc2hvdWxkIGFsd2F5cyBiZSBwb3NpdGl2ZSBpbnRlZ2Vycy5cbiAqXG4gKiBAbWV0aG9kIG5mcFxuICogQHBhcmFtIHtOdW1iZXJ9IG51bSAgICAgIHRoZSBOdW1iZXIgdG8gZm9ybWF0XG4gKiBAcGFyYW0ge0ludGVnZXJ9ICAgICAgW2xlZnRdICAgbnVtYmVyIG9mIGRpZ2l0cyB0byB0aGUgbGVmdCBvZiB0aGUgZGVjaW1hbFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50XG4gKiBAcGFyYW0ge0ludGVnZXJ9ICAgICAgW3JpZ2h0XSAgbnVtYmVyIG9mIGRpZ2l0cyB0byB0aGUgcmlnaHQgb2YgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbCBwb2ludFxuICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgIGZvcm1hdHRlZCBTdHJpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgdmFyIG51bTEgPSAxMTI1MzEwNi4xMTU7XG4gKiAgIHZhciBudW0yID0gLTExMjUzMTA2LjExNTtcbiAqXG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIGZpbGwoMCk7XG4gKiAgIHRleHRTaXplKDEyKTtcbiAqXG4gKiAgIC8vIERyYXcgZm9ybWF0dGVkIG51bWJlcnNcbiAqICAgdGV4dChuZnAobnVtMSwgNCwgMiksIDEwLCAzMCk7XG4gKiAgIHRleHQobmZwKG51bTIsIDQsIDIpLCAxMCwgODApO1xuICpcbiAqICAgLy8gRHJhdyBkaXZpZGluZyBsaW5lXG4gKiAgIHN0cm9rZSgxMjApO1xuICogICBsaW5lKDAsIDUwLCB3aWR0aCwgNTApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogXCIrMTEyNTMxMDYuMTFcIiB0b3AgbWlkZGxlIGFuZCBcIi0xMTI1MzEwNi4xMVwiIGRpc3BsYXllZCBib3R0b20gbWlkZGxlXG4gKi9cbi8qKlxuICogQG1ldGhvZCBuZnBcbiAqIEBwYXJhbSB7TnVtYmVyW119IG51bXMgICAgICB0aGUgTnVtYmVycyB0byBmb3JtYXRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gICAgICBbbGVmdF1cbiAqIEBwYXJhbSB7SW50ZWdlcn0gICAgICBbcmlnaHRdXG4gKiBAcmV0dXJuIHtTdHJpbmdbXX0gICAgICAgICBmb3JtYXR0ZWQgU3RyaW5nc1xuICovXG5wNS5wcm90b3R5cGUubmZwID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ25mcCcsIGFyZ3VtZW50cyk7XG4gIHZhciBuZlJlcyA9IHA1LnByb3RvdHlwZS5uZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICBpZiAobmZSZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBuZlJlcy5tYXAoYWRkTmZwKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYWRkTmZwKG5mUmVzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYWRkTmZwKG51bSkge1xuICByZXR1cm4gcGFyc2VGbG9hdChudW0pID4gMCA/ICcrJyArIG51bS50b1N0cmluZygpIDogbnVtLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgZm9ybWF0dGluZyBudW1iZXJzIGludG8gc3RyaW5ncy4gU2ltaWxhciB0byBuZigpIGJ1dFxuICogcHV0cyBhIFwiIFwiIChzcGFjZSkgaW4gZnJvbnQgb2YgcG9zaXRpdmUgbnVtYmVycyBhbmQgYSBcIi1cIiBpbiBmcm9udCBvZlxuICogbmVnYXRpdmUgbnVtYmVycy4gVGhlcmUgYXJlIHR3byB2ZXJzaW9uczogb25lIGZvciBmb3JtYXR0aW5nIGZsb2F0cywgYW5kXG4gKiBvbmUgZm9yIGZvcm1hdHRpbmcgaW50cy4gVGhlIHZhbHVlcyBmb3IgdGhlIGRpZ2l0cywgbGVmdCwgYW5kIHJpZ2h0XG4gKiBwYXJhbWV0ZXJzIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmUgaW50ZWdlcnMuXG4gKlxuICogQG1ldGhvZCBuZnNcbiAqIEBwYXJhbSB7TnVtYmVyfSAgICAgICBudW0gICAgICB0aGUgTnVtYmVyIHRvIGZvcm1hdFxuICogQHBhcmFtIHtJbnRlZ2VyfSAgICAgIFtsZWZ0XSAgIG51bWJlciBvZiBkaWdpdHMgdG8gdGhlIGxlZnQgb2YgdGhlIGRlY2ltYWxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludFxuICogQHBhcmFtIHtJbnRlZ2VyfSAgICAgIFtyaWdodF0gIG51bWJlciBvZiBkaWdpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgcG9pbnRcbiAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgICBmb3JtYXR0ZWQgU3RyaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHZhciBudW0xID0gMTEyNTMxMDYuMTE1O1xuICogICB2YXIgbnVtMiA9IC0xMTI1MzEwNi4xMTU7XG4gKlxuICogICBub1N0cm9rZSgpO1xuICogICBmaWxsKDApO1xuICogICB0ZXh0U2l6ZSgxMik7XG4gKiAgIC8vIERyYXcgZm9ybWF0dGVkIG51bWJlcnNcbiAqICAgdGV4dChuZnMobnVtMSwgNCwgMiksIDEwLCAzMCk7XG4gKlxuICogICB0ZXh0KG5mcyhudW0yLCA0LCAyKSwgMTAsIDgwKTtcbiAqXG4gKiAgIC8vIERyYXcgZGl2aWRpbmcgbGluZVxuICogICBzdHJva2UoMTIwKTtcbiAqICAgbGluZSgwLCA1MCwgd2lkdGgsIDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIFwiMTEyNTMxMDYuMTFcIiB0b3AgbWlkZGxlIGFuZCBcIi0xMTI1MzEwNi4xMVwiIGRpc3BsYXllZCBib3R0b20gbWlkZGxlXG4gKi9cbi8qKlxuICogQG1ldGhvZCBuZnNcbiAqIEBwYXJhbSB7QXJyYXl9ICAgICAgICBudW1zICAgICB0aGUgTnVtYmVycyB0byBmb3JtYXRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gICAgICBbbGVmdF1cbiAqIEBwYXJhbSB7SW50ZWdlcn0gICAgICBbcmlnaHRdXG4gKiBAcmV0dXJuIHtTdHJpbmdbXX0gICAgICAgICBmb3JtYXR0ZWQgU3RyaW5nc1xuICovXG5wNS5wcm90b3R5cGUubmZzID0gZnVuY3Rpb24oKSB7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ25mcycsIGFyZ3VtZW50cyk7XG4gIHZhciBuZlJlcyA9IHA1LnByb3RvdHlwZS5uZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICBpZiAobmZSZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBuZlJlcy5tYXAoYWRkTmZzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYWRkTmZzKG5mUmVzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYWRkTmZzKG51bSkge1xuICByZXR1cm4gcGFyc2VGbG9hdChudW0pID4gMCA/ICcgJyArIG51bS50b1N0cmluZygpIDogbnVtLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogVGhlIHNwbGl0KCkgZnVuY3Rpb24gbWFwcyB0byBTdHJpbmcuc3BsaXQoKSwgaXQgYnJlYWtzIGEgU3RyaW5nIGludG9cbiAqIHBpZWNlcyB1c2luZyBhIGNoYXJhY3RlciBvciBzdHJpbmcgYXMgdGhlIGRlbGltaXRlci4gVGhlIGRlbGltIHBhcmFtZXRlclxuICogc3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXIgb3IgY2hhcmFjdGVycyB0aGF0IG1hcmsgdGhlIGJvdW5kYXJpZXMgYmV0d2VlblxuICogZWFjaCBwaWVjZS4gQSBTdHJpbmdbXSBhcnJheSBpcyByZXR1cm5lZCB0aGF0IGNvbnRhaW5zIGVhY2ggb2YgdGhlIHBpZWNlcy5cbiAqXG4gKiBUaGUgc3BsaXRUb2tlbnMoKSBmdW5jdGlvbiB3b3JrcyBpbiBhIHNpbWlsYXIgZmFzaGlvbiwgZXhjZXB0IHRoYXQgaXRcbiAqIHNwbGl0cyB1c2luZyBhIHJhbmdlIG9mIGNoYXJhY3RlcnMgaW5zdGVhZCBvZiBhIHNwZWNpZmljIGNoYXJhY3RlciBvclxuICogc2VxdWVuY2UuXG4gKlxuICogQG1ldGhvZCBzcGxpdFxuICogQHBhcmFtICB7U3RyaW5nfSB2YWx1ZSB0aGUgU3RyaW5nIHRvIGJlIHNwbGl0XG4gKiBAcGFyYW0gIHtTdHJpbmd9IGRlbGltIHRoZSBTdHJpbmcgdXNlZCB0byBzZXBhcmF0ZSB0aGUgZGF0YVxuICogQHJldHVybiB7U3RyaW5nW119ICBBcnJheSBvZiBTdHJpbmdzXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIG5hbWVzID0gJ1BhdCxYaW8sQWxleCc7XG4gKiB2YXIgc3BsaXRTdHJpbmcgPSBzcGxpdChuYW1lcywgJywnKTtcbiAqIHRleHQoc3BsaXRTdHJpbmdbMF0sIDUsIDMwKTtcbiAqIHRleHQoc3BsaXRTdHJpbmdbMV0sIDUsIDUwKTtcbiAqIHRleHQoc3BsaXRTdHJpbmdbMl0sIDUsIDcwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIFwicGF0XCIgdG9wIGxlZnQsIFwiWGlvXCIgbWlkIGxlZnQgYW5kIFwiQWxleFwiIGRpc3BsYXllZCBib3R0b20gbGVmdFxuICpcbiAqL1xucDUucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24oc3RyLCBkZWxpbSkge1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdzcGxpdCcsIGFyZ3VtZW50cyk7XG4gIHJldHVybiBzdHIuc3BsaXQoZGVsaW0pO1xufTtcblxuLyoqXG4gKiBUaGUgc3BsaXRUb2tlbnMoKSBmdW5jdGlvbiBzcGxpdHMgYSBTdHJpbmcgYXQgb25lIG9yIG1hbnkgY2hhcmFjdGVyXG4gKiBkZWxpbWl0ZXJzIG9yIFwidG9rZW5zLlwiIFRoZSBkZWxpbSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXIgb3JcbiAqIGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBhcyBhIGJvdW5kYXJ5LlxuICogPGJyPjxicj5cbiAqIElmIG5vIGRlbGltIGNoYXJhY3RlcnMgYXJlIHNwZWNpZmllZCwgYW55IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHVzZWQgdG9cbiAqIHNwbGl0LiBXaGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW5jbHVkZSB0YWIgKFxcdCksIGxpbmUgZmVlZCAoXFxuKSwgY2FycmlhZ2VcbiAqIHJldHVybiAoXFxyKSwgZm9ybSBmZWVkIChcXGYpLCBhbmQgc3BhY2UuXG4gKlxuICogQG1ldGhvZCBzcGxpdFRva2Vuc1xuICogQHBhcmFtICB7U3RyaW5nfSB2YWx1ZSAgIHRoZSBTdHJpbmcgdG8gYmUgc3BsaXRcbiAqIEBwYXJhbSAge1N0cmluZ30gW2RlbGltXSBsaXN0IG9mIGluZGl2aWR1YWwgU3RyaW5ncyB0aGF0IHdpbGwgYmUgdXNlZCBhc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcnNcbiAqIEByZXR1cm4ge1N0cmluZ1tdfSAgICAgICAgICBBcnJheSBvZiBTdHJpbmdzXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcyA9IFwibm9yZW5kZXJcIj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIHZhciBteVN0ciA9ICdNYW5nbywgQmFuYW5hLCBMaW1lJztcbiAqICAgdmFyIG15U3RyQXJyID0gc3BsaXRUb2tlbnMobXlTdHIsICcsJyk7XG4gKlxuICogICBwcmludChteVN0ckFycik7IC8vIHByaW50cyA6IFtcIk1hbmdvXCIsXCIgQmFuYW5hXCIsXCIgTGltZVwiXVxuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKi9cbnA1LnByb3RvdHlwZS5zcGxpdFRva2VucyA9IGZ1bmN0aW9uKHZhbHVlLCBkZWxpbXMpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnc3BsaXRUb2tlbnMnLCBhcmd1bWVudHMpO1xuICB2YXIgZDtcbiAgaWYgKHR5cGVvZiBkZWxpbXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIHN0ciA9IGRlbGltcztcbiAgICB2YXIgc3FjID0gL1xcXS9nLmV4ZWMoc3RyKTtcbiAgICB2YXIgc3FvID0gL1xcWy9nLmV4ZWMoc3RyKTtcbiAgICBpZiAoc3FvICYmIHNxYykge1xuICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIHNxYy5pbmRleCkgKyBzdHIuc2xpY2Uoc3FjLmluZGV4ICsgMSk7XG4gICAgICBzcW8gPSAvXFxbL2cuZXhlYyhzdHIpO1xuICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIHNxby5pbmRleCkgKyBzdHIuc2xpY2Uoc3FvLmluZGV4ICsgMSk7XG4gICAgICBkID0gbmV3IFJlZ0V4cCgnW1xcXFxbJyArIHN0ciArICdcXFxcXV0nLCAnZycpO1xuICAgIH0gZWxzZSBpZiAoc3FjKSB7XG4gICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgc3FjLmluZGV4KSArIHN0ci5zbGljZShzcWMuaW5kZXggKyAxKTtcbiAgICAgIGQgPSBuZXcgUmVnRXhwKCdbJyArIHN0ciArICdcXFxcXV0nLCAnZycpO1xuICAgIH0gZWxzZSBpZiAoc3FvKSB7XG4gICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgc3FvLmluZGV4KSArIHN0ci5zbGljZShzcW8uaW5kZXggKyAxKTtcbiAgICAgIGQgPSBuZXcgUmVnRXhwKCdbJyArIHN0ciArICdcXFxcW10nLCAnZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkID0gbmV3IFJlZ0V4cCgnWycgKyBzdHIgKyAnXScsICdnJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGQgPSAvXFxzL2c7XG4gIH1cbiAgcmV0dXJuIHZhbHVlLnNwbGl0KGQpLmZpbHRlcihmdW5jdGlvbihuKSB7XG4gICAgcmV0dXJuIG47XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIFN0cmluZy4gSW5cbiAqIGFkZGl0aW9uIHRvIHN0YW5kYXJkIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBzdWNoIGFzIHNwYWNlLCBjYXJyaWFnZSByZXR1cm4sXG4gKiBhbmQgdGFiLCB0aGlzIGZ1bmN0aW9uIGFsc28gcmVtb3ZlcyB0aGUgVW5pY29kZSBcIm5ic3BcIiBjaGFyYWN0ZXIuXG4gKlxuICogQG1ldGhvZCB0cmltXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHN0ciBhIFN0cmluZyB0byBiZSB0cmltbWVkXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgIGEgdHJpbW1lZCBTdHJpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIHN0cmluZyA9IHRyaW0oJyAgTm8gbmV3IGxpbmVzXFxuICAgJyk7XG4gKiB0ZXh0KHN0cmluZyArICcgaGVyZScsIDIsIDUwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIFwiTm8gbmV3IGxpbmVzIGhlcmVcIiBkaXNwbGF5ZWQgY2VudGVyIGNhbnZhc1xuICovXG4vKipcbiAqIEBtZXRob2QgdHJpbVxuICogQHBhcmFtICB7QXJyYXl9IHN0cnMgYW4gQXJyYXkgb2YgU3RyaW5ncyB0byBiZSB0cmltbWVkXG4gKiBAcmV0dXJuIHtTdHJpbmdbXX0gICBhbiBBcnJheSBvZiB0cmltbWVkIFN0cmluZ3NcbiAqL1xucDUucHJvdG90eXBlLnRyaW0gPSBmdW5jdGlvbihzdHIpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygndHJpbScsIGFyZ3VtZW50cyk7XG4gIGlmIChzdHIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBzdHIubWFwKHRoaXMudHJpbSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjIsXCIuLi9jb3JlL2Vycm9yX2hlbHBlcnNcIjoyNX1dLDYyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQG1vZHVsZSBJT1xuICogQHN1Ym1vZHVsZSBUaW1lICYgRGF0ZVxuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xuXG4vKipcbiAqIHA1LmpzIGNvbW11bmljYXRlcyB3aXRoIHRoZSBjbG9jayBvbiB5b3VyIGNvbXB1dGVyLiBUaGUgZGF5KCkgZnVuY3Rpb25cbiAqIHJldHVybnMgdGhlIGN1cnJlbnQgZGF5IGFzIGEgdmFsdWUgZnJvbSAxIC0gMzEuXG4gKlxuICogQG1ldGhvZCBkYXlcbiAqIEByZXR1cm4ge0ludGVnZXJ9IHRoZSBjdXJyZW50IGRheVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBkID0gZGF5KCk7XG4gKiB0ZXh0KCdDdXJyZW50IGRheTogXFxuJyArIGQsIDUsIDUwKTtcbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIEN1cnJlbnQgZGF5IGlzIGRpc3BsYXllZFxuICpcbiAqL1xucDUucHJvdG90eXBlLmRheSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IERhdGUoKS5nZXREYXRlKCk7XG59O1xuXG4vKipcbiAqIHA1LmpzIGNvbW11bmljYXRlcyB3aXRoIHRoZSBjbG9jayBvbiB5b3VyIGNvbXB1dGVyLiBUaGUgaG91cigpIGZ1bmN0aW9uXG4gKiByZXR1cm5zIHRoZSBjdXJyZW50IGhvdXIgYXMgYSB2YWx1ZSBmcm9tIDAgLSAyMy5cbiAqXG4gKiBAbWV0aG9kIGhvdXJcbiAqIEByZXR1cm4ge0ludGVnZXJ9IHRoZSBjdXJyZW50IGhvdXJcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgaCA9IGhvdXIoKTtcbiAqIHRleHQoJ0N1cnJlbnQgaG91cjpcXG4nICsgaCwgNSwgNTApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogQ3VycmVudCBob3VyIGlzIGRpc3BsYXllZFxuICpcbiAqL1xucDUucHJvdG90eXBlLmhvdXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0SG91cnMoKTtcbn07XG5cbi8qKlxuICogcDUuanMgY29tbXVuaWNhdGVzIHdpdGggdGhlIGNsb2NrIG9uIHlvdXIgY29tcHV0ZXIuIFRoZSBtaW51dGUoKSBmdW5jdGlvblxuICogcmV0dXJucyB0aGUgY3VycmVudCBtaW51dGUgYXMgYSB2YWx1ZSBmcm9tIDAgLSA1OS5cbiAqXG4gKiBAbWV0aG9kIG1pbnV0ZVxuICogQHJldHVybiB7SW50ZWdlcn0gdGhlIGN1cnJlbnQgbWludXRlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIG0gPSBtaW51dGUoKTtcbiAqIHRleHQoJ0N1cnJlbnQgbWludXRlOiBcXG4nICsgbSwgNSwgNTApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogQ3VycmVudCBtaW51dGUgaXMgZGlzcGxheWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUubWludXRlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLmdldE1pbnV0ZXMoKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyAodGhvdXNhbmR0aHMgb2YgYSBzZWNvbmQpIHNpbmNlXG4gKiBzdGFydGluZyB0aGUgcHJvZ3JhbS4gVGhpcyBpbmZvcm1hdGlvbiBpcyBvZnRlbiB1c2VkIGZvciB0aW1pbmcgZXZlbnRzIGFuZFxuICogYW5pbWF0aW9uIHNlcXVlbmNlcy5cbiAqXG4gKiBAbWV0aG9kIG1pbGxpc1xuICogQHJldHVybiB7TnVtYmVyfSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBzdGFydGluZyB0aGUgcHJvZ3JhbVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBtaWxsaXNlY29uZCA9IG1pbGxpcygpO1xuICogdGV4dCgnTWlsbGlzZWNvbmRzIFxcbnJ1bm5pbmc6IFxcbicgKyBtaWxsaXNlY29uZCwgNSwgNDApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBwcm9ncmFtIGhhcyBzdGFydGVkIGRpc3BsYXllZFxuICpcbiAqL1xucDUucHJvdG90eXBlLm1pbGxpcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpO1xufTtcblxuLyoqXG4gKiBwNS5qcyBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgY2xvY2sgb24geW91ciBjb21wdXRlci4gVGhlIG1vbnRoKCkgZnVuY3Rpb25cbiAqIHJldHVybnMgdGhlIGN1cnJlbnQgbW9udGggYXMgYSB2YWx1ZSBmcm9tIDEgLSAxMi5cbiAqXG4gKiBAbWV0aG9kIG1vbnRoXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSB0aGUgY3VycmVudCBtb250aFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciBtID0gbW9udGgoKTtcbiAqIHRleHQoJ0N1cnJlbnQgbW9udGg6IFxcbicgKyBtLCA1LCA1MCk7XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBDdXJyZW50IG1vbnRoIGlzIGRpc3BsYXllZFxuICpcbiAqL1xucDUucHJvdG90eXBlLm1vbnRoID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxOyAvL0phbnVhcnkgaXMgMCFcbn07XG5cbi8qKlxuICogcDUuanMgY29tbXVuaWNhdGVzIHdpdGggdGhlIGNsb2NrIG9uIHlvdXIgY29tcHV0ZXIuIFRoZSBzZWNvbmQoKSBmdW5jdGlvblxuICogcmV0dXJucyB0aGUgY3VycmVudCBzZWNvbmQgYXMgYSB2YWx1ZSBmcm9tIDAgLSA1OS5cbiAqXG4gKiBAbWV0aG9kIHNlY29uZFxuICogQHJldHVybiB7SW50ZWdlcn0gdGhlIGN1cnJlbnQgc2Vjb25kXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIHMgPSBzZWNvbmQoKTtcbiAqIHRleHQoJ0N1cnJlbnQgc2Vjb25kOiBcXG4nICsgcywgNSwgNTApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogQ3VycmVudCBzZWNvbmQgaXMgZGlzcGxheWVkXG4gKlxuICovXG5wNS5wcm90b3R5cGUuc2Vjb25kID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLmdldFNlY29uZHMoKTtcbn07XG5cbi8qKlxuICogcDUuanMgY29tbXVuaWNhdGVzIHdpdGggdGhlIGNsb2NrIG9uIHlvdXIgY29tcHV0ZXIuIFRoZSB5ZWFyKCkgZnVuY3Rpb25cbiAqIHJldHVybnMgdGhlIGN1cnJlbnQgeWVhciBhcyBhbiBpbnRlZ2VyICgyMDE0LCAyMDE1LCAyMDE2LCBldGMpLlxuICpcbiAqIEBtZXRob2QgeWVhclxuICogQHJldHVybiB7SW50ZWdlcn0gdGhlIGN1cnJlbnQgeWVhclxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIHZhciB5ID0geWVhcigpO1xuICogdGV4dCgnQ3VycmVudCB5ZWFyOiBcXG4nICsgeSwgNSwgNTApO1xuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogQ3VycmVudCB5ZWFyIGlzIGRpc3BsYXllZFxuICpcbiAqL1xucDUucHJvdG90eXBlLnllYXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSw2MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgTGlnaHRzLCBDYW1lcmFcbiAqIEBzdWJtb2R1bGUgQ2FtZXJhXG4gKiBAZm9yIHA1XG4gKiBAcmVxdWlyZXMgY29yZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbi8qKlxuICogU2V0cyBjYW1lcmEgcG9zaXRpb24gZm9yIGEgM0Qgc2tldGNoLiBUaGUgZnVuY3Rpb24gYmVoYXZlcyBzaW1pbGFybHlcbiAqIGdsdUxvb2tBdCwgZXhjZXB0IHRoYXQgaXQgcmVwbGFjZXMgdGhlIGV4aXN0aW5nIG1vZGVsdmlldyBtYXRyaXggaW5zdGVhZFxuICogb2YgYXBwbHlpbmcgYW55IHRyYW5zZm9ybWF0aW9ucyBjYWxjdWxhdGVkIGhlcmUgb24gdG9wIG9mIHRoZSBleGlzdGluZ1xuICogbW9kZWwgdmlldy5cbiAqIFdoZW4gY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCB0aGlzIGZ1bmN0aW9uXG4gKiBzZXRzIGEgZGVmYXVsdCBjYW1lcmEgZXF1aXZhbGVudCB0byBjYWxsaW5nXG4gKiBjYW1lcmEoMCwgMCwgKGhlaWdodC8yLjApIC8gdGFuKFBJKjMwLjAgLyAxODAuMCksIDAsIDAsIDAsIDAsIDEsIDApO1xuICogQG1ldGhvZCBjYW1lcmFcbiAqIEBwYXJhbSAge051bWJlcn0gW3hdICAgICAgICBjYW1lcmEgcG9zaXRpb24gdmFsdWUgb24geCBheGlzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt5XSAgICAgICAgY2FtZXJhIHBvc2l0aW9uIHZhbHVlIG9uIHkgYXhpc1xuICogQHBhcmFtICB7TnVtYmVyfSBbel0gICAgICAgIGNhbWVyYSBwb3NpdGlvbiB2YWx1ZSBvbiB6IGF4aXNcbiAqIEBwYXJhbSAge051bWJlcn0gW2NlbnRlclhdICB4IGNvb3JkaW5hdGUgcmVwcmVzZW50aW5nIGNlbnRlciBvZiB0aGUgc2tldGNoXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFtjZW50ZXJZXSAgeSBjb29yZGluYXRlIHJlcHJlc2VudGluZyBjZW50ZXIgb2YgdGhlIHNrZXRjaFxuICogQHBhcmFtICB7TnVtYmVyfSBbY2VudGVyWl0gIHogY29vcmRpbmF0ZSByZXByZXNlbnRpbmcgY2VudGVyIG9mIHRoZSBza2V0Y2hcbiAqIEBwYXJhbSAge051bWJlcn0gW3VwWF0gICAgICB4IGNvbXBvbmVudCBvZiBkaXJlY3Rpb24gJ3VwJyBmcm9tIGNhbWVyYVxuICogQHBhcmFtICB7TnVtYmVyfSBbdXBZXSAgICAgIHkgY29tcG9uZW50IG9mIGRpcmVjdGlvbiAndXAnIGZyb20gY2FtZXJhXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt1cFpdICAgICAgeiBjb21wb25lbnQgb2YgZGlyZWN0aW9uICd1cCcgZnJvbSBjYW1lcmFcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICAvL21vdmUgdGhlIGNhbWVyYSBhd2F5IGZyb20gdGhlIHBsYW5lIGJ5IGEgc2luIHdhdmVcbiAqICAgY2FtZXJhKDAsIDAsIHNpbihmcmFtZUNvdW50ICogMC4wMSkgKiAxMDAsIDAsIDAsIDAsIDAsIDEsIDApO1xuICogICBwbGFuZSgxMjAsIDEyMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBibHVlIHNxdWFyZSBzaHJpbmtzIGluIHNpemUgZ3Jvd3MgdG8gZmlsbCBjYW52YXMuIGRpc2FwcGVhcnMgdGhlbiBsb29wcy5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5jYW1lcmEgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fYXNzZXJ0M2QoJ2NhbWVyYScpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjYW1lcmEnLCBhcmd1bWVudHMpO1xuICB0aGlzLl9yZW5kZXJlci5jYW1lcmEuYXBwbHkodGhpcy5fcmVuZGVyZXIsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuY2FtZXJhID0gZnVuY3Rpb24oXG4gIGV5ZVgsXG4gIGV5ZVksXG4gIGV5ZVosXG4gIGNlbnRlclgsXG4gIGNlbnRlclksXG4gIGNlbnRlclosXG4gIHVwWCxcbiAgdXBZLFxuICB1cFpcbikge1xuICBpZiAodHlwZW9mIGV5ZVggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXllWCA9IHRoaXMuZGVmYXVsdENhbWVyYVg7XG4gICAgZXllWSA9IHRoaXMuZGVmYXVsdENhbWVyYVk7XG4gICAgZXllWiA9IHRoaXMuZGVmYXVsdENhbWVyYVo7XG4gICAgY2VudGVyWCA9IGV5ZVg7XG4gICAgY2VudGVyWSA9IGV5ZVk7XG4gICAgY2VudGVyWiA9IDA7XG4gICAgdXBYID0gMDtcbiAgICB1cFkgPSAxO1xuICAgIHVwWiA9IDA7XG4gIH1cblxuICB0aGlzLmNhbWVyYVggPSBleWVYO1xuICB0aGlzLmNhbWVyYVkgPSBleWVZO1xuICB0aGlzLmNhbWVyYVogPSBleWVaO1xuXG4gIC8vIGNhbGN1bGF0ZSBjYW1lcmEgWiB2ZWN0b3JcbiAgdmFyIHowID0gZXllWCAtIGNlbnRlclg7XG4gIHZhciB6MSA9IGV5ZVkgLSBjZW50ZXJZO1xuICB2YXIgejIgPSBleWVaIC0gY2VudGVyWjtcblxuICB0aGlzLmV5ZURpc3QgPSBNYXRoLnNxcnQoejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyKTtcbiAgaWYgKHRoaXMuZXllRGlzdCAhPT0gMCkge1xuICAgIHowIC89IHRoaXMuZXllRGlzdDtcbiAgICB6MSAvPSB0aGlzLmV5ZURpc3Q7XG4gICAgejIgLz0gdGhpcy5leWVEaXN0O1xuICB9XG5cbiAgLy8gY2FsY3VsYXRlIGNhbWVyYSBZIHZlY3RvclxuICB2YXIgeTAgPSB1cFg7XG4gIHZhciB5MSA9IHVwWTtcbiAgdmFyIHkyID0gdXBaO1xuXG4gIC8vIGNvbXB1dGVyIHggdmVjdG9yIGFzIHkgY3Jvc3MgelxuICB2YXIgeDAgPSB5MSAqIHoyIC0geTIgKiB6MTtcbiAgdmFyIHgxID0gLXkwICogejIgKyB5MiAqIHowO1xuICB2YXIgeDIgPSB5MCAqIHoxIC0geTEgKiB6MDtcblxuICAvLyByZWNvbXB1dGVyIHkgPSB6IGNyb3NzIHhcbiAgeTAgPSB6MSAqIHgyIC0gejIgKiB4MTtcbiAgeTEgPSAtejAgKiB4MiArIHoyICogeDA7XG4gIHkyID0gejAgKiB4MSAtIHoxICogeDA7XG5cbiAgLy8gY3Jvc3MgcHJvZHVjdCBnaXZlcyBhcmVhIG9mIHBhcmFsbGVsb2dyYW0sIHdoaWNoIGlzIDwgMS4wIGZvclxuICAvLyBub24tcGVycGVuZGljdWxhciB1bml0LWxlbmd0aCB2ZWN0b3JzOyBzbyBub3JtYWxpemUgeCwgeSBoZXJlOlxuICB2YXIgeG1hZyA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xuICBpZiAoeG1hZyAhPT0gMCkge1xuICAgIHgwIC89IHhtYWc7XG4gICAgeDEgLz0geG1hZztcbiAgICB4MiAvPSB4bWFnO1xuICB9XG5cbiAgdmFyIHltYWcgPSBNYXRoLnNxcnQoeTAgKiB5MCArIHkxICogeTEgKyB5MiAqIHkyKTtcbiAgaWYgKHltYWcgIT09IDApIHtcbiAgICB5MCAvPSB5bWFnO1xuICAgIHkxIC89IHltYWc7XG4gICAgeTIgLz0geW1hZztcbiAgfVxuXG4gIC8vIHRoZSBjYW1lcmEgYWZmZWN0cyB0aGUgbW9kZWwgdmlldyBtYXRyaXgsIGluc29mYXIgYXMgaXRcbiAgLy8gaW52ZXJzZSB0cmFuc2xhdGVzIHRoZSB3b3JsZCB0byB0aGUgZXllIHBvc2l0aW9uIG9mIHRoZSBjYW1lcmFcbiAgLy8gYW5kIHJvdGF0ZXMgaXQuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB0aGlzLmNhbWVyYU1hdHJpeC5zZXQoeDAsIHkwLCB6MCwgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHgxLCB5MSwgejEsIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB4MiwgeTIsIHoyLCAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAwLCAgMCwgMSk7XG5cbiAgdmFyIHR4ID0gLWV5ZVg7XG4gIHZhciB0eSA9IC1leWVZO1xuICB2YXIgdHogPSAtZXllWjtcblxuICB0aGlzLmNhbWVyYU1hdHJpeC50cmFuc2xhdGUoW3R4LCB0eSwgdHpdKTtcbiAgdGhpcy51TVZNYXRyaXguc2V0KFxuICAgIHRoaXMuY2FtZXJhTWF0cml4Lm1hdDRbMF0sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFsxXSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzJdLFxuICAgIHRoaXMuY2FtZXJhTWF0cml4Lm1hdDRbM10sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFs0XSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzVdLFxuICAgIHRoaXMuY2FtZXJhTWF0cml4Lm1hdDRbNl0sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFs3XSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzhdLFxuICAgIHRoaXMuY2FtZXJhTWF0cml4Lm1hdDRbOV0sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFsxMF0sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFsxMV0sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFsxMl0sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFsxM10sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFsxNF0sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFsxNV1cbiAgKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldHMgcGVyc3BlY3RpdmUgY2FtZXJhLiBXaGVuIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgdGhlIGRlZmF1bHRzXG4gKiBwcm92aWRlZCBhcmUgZXF1aXZhbGVudCB0b1xuICogcGVyc3BlY3RpdmUoUEkvMy4wLCB3aWR0aC9oZWlnaHQsIGNhbWVyYVovMTAuMCwgY2FtZXJhWioxMC4wKVxuICogd2hlcmUgY2FtZXJhWiBpcyAoKGhlaWdodC8yLjApIC8gdGFuKFBJKjYwLjAvMzYwLjApKTtcbiAqIEBtZXRob2QgIHBlcnNwZWN0aXZlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFtmb3Z5XSAgIGNhbWVyYSBmcnVzdHVtIHZlcnRpY2FsIGZpZWxkIG9mIHZpZXcsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYm90dG9tIHRvIHRvcCBvZiB2aWV3LCBpbiBhbmdsZU1vZGUgdW5pdHNcbiAqIEBwYXJhbSAge051bWJlcn0gW2FzcGVjdF0gY2FtZXJhIGZydXN0dW0gYXNwZWN0IHJhdGlvXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFtuZWFyXSAgIGZydXN0dW0gbmVhciBwbGFuZSBsZW5ndGhcbiAqIEBwYXJhbSAge051bWJlcn0gW2Zhcl0gICAgZnJ1c3R1bSBmYXIgcGxhbmUgbGVuZ3RoXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy9kcmFnIG1vdXNlIHRvIHRvZ2dsZSB0aGUgd29ybGQhXG4gKiAvL3lvdSB3aWxsIHNlZSB0aGVyZSdzIGEgdmFuaXNoIHBvaW50XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiAgIHZhciBmb3YgPSA2MCAvIDE4MCAqIFBJO1xuICogICB2YXIgY2FtZXJhWiA9IGhlaWdodCAvIDIuMCAvIHRhbihmb3YgLyAyLjApO1xuICogICBwZXJzcGVjdGl2ZSg2MCAvIDE4MCAqIFBJLCB3aWR0aCAvIGhlaWdodCwgY2FtZXJhWiAqIDAuMSwgY2FtZXJhWiAqIDEwKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgb3JiaXRDb250cm9sKCk7XG4gKiAgIGZvciAodmFyIGkgPSAtMTsgaSA8IDI7IGkrKykge1xuICogICAgIGZvciAodmFyIGogPSAtMjsgaiA8IDM7IGorKykge1xuICogICAgICAgcHVzaCgpO1xuICogICAgICAgdHJhbnNsYXRlKGkgKiAxNjAsIDAsIGogKiAxNjApO1xuICogICAgICAgYm94KDQwLCA0MCwgNDApO1xuICogICAgICAgcG9wKCk7XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAYWx0XG4gKiBjb2xvcmVkIDNkIGJveGVzIHRvZ2dsZWFibGUgd2l0aCBtb3VzZSBwb3NpdGlvblxuICpcbiAqL1xucDUucHJvdG90eXBlLnBlcnNwZWN0aXZlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2Fzc2VydDNkKCdwZXJzcGVjdGl2ZScpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdwZXJzcGVjdGl2ZScsIGFyZ3VtZW50cyk7XG4gIHRoaXMuX3JlbmRlcmVyLnBlcnNwZWN0aXZlLmFwcGx5KHRoaXMuX3JlbmRlcmVyLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLnBlcnNwZWN0aXZlID0gZnVuY3Rpb24oZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpIHtcbiAgaWYgKHR5cGVvZiBmb3Z5ID09PSAndW5kZWZpbmVkJykge1xuICAgIGZvdnkgPSB0aGlzLmRlZmF1bHRDYW1lcmFGT1Y7XG4gIH1cbiAgaWYgKHR5cGVvZiBhc3BlY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgYXNwZWN0ID0gdGhpcy5kZWZhdWx0Q2FtZXJhQXNwZWN0O1xuICB9XG4gIGlmICh0eXBlb2YgbmVhciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBuZWFyID0gdGhpcy5kZWZhdWx0Q2FtZXJhTmVhcjtcbiAgfVxuICBpZiAodHlwZW9mIGZhciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBmYXIgPSB0aGlzLmRlZmF1bHRDYW1lcmFGYXI7XG4gIH1cblxuICB0aGlzLmNhbWVyYUZPViA9IHRoaXMuX3BJbnN0Ll90b1JhZGlhbnMoZm92eSk7XG4gIHRoaXMuY2FtZXJhQXNwZWN0ID0gYXNwZWN0O1xuICB0aGlzLmNhbWVyYU5lYXIgPSBuZWFyO1xuICB0aGlzLmNhbWVyYUZhciA9IGZhcjtcblxuICB0aGlzLnVQTWF0cml4ID0gcDUuTWF0cml4LmlkZW50aXR5KCk7XG5cbiAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbih0aGlzLmNhbWVyYUZPViAvIDIpO1xuICB2YXIgbmYgPSAxLjAgLyAodGhpcy5jYW1lcmFOZWFyIC0gdGhpcy5jYW1lcmFGYXIpO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB0aGlzLnVQTWF0cml4LnNldChmIC8gYXNwZWN0LCAgMCwgICAgICAgICAgICAgICAgICAgICAwLCAgMCxcbiAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgLWYsICAgICAgICAgICAgICAgICAgICAgMCwgIDAsXG4gICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAwLCAgICAgKGZhciArIG5lYXIpICogbmYsIC0xLFxuICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgMCwgKDIgKiBmYXIgKiBuZWFyKSAqIG5mLCAgMCk7XG5cbiAgdGhpcy5fY3VyQ2FtZXJhID0gJ2N1c3RvbSc7XG59O1xuXG4vKipcbiAqIFNldHVwIG9ydGhvIGNhbWVyYVxuICogQG1ldGhvZCAgb3J0aG9cbiAqIEBwYXJhbSAge051bWJlcn0gW2xlZnRdICAgY2FtZXJhIGZydXN0dW0gbGVmdCBwbGFuZVxuICogQHBhcmFtICB7TnVtYmVyfSBbcmlnaHRdICBjYW1lcmEgZnJ1c3R1bSByaWdodCBwbGFuZVxuICogQHBhcmFtICB7TnVtYmVyfSBbYm90dG9tXSBjYW1lcmEgZnJ1c3R1bSBib3R0b20gcGxhbmVcbiAqIEBwYXJhbSAge051bWJlcn0gW3RvcF0gICAgY2FtZXJhIGZydXN0dW0gdG9wIHBsYW5lXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFtuZWFyXSAgIGNhbWVyYSBmcnVzdHVtIG5lYXIgcGxhbmVcbiAqIEBwYXJhbSAge051bWJlcn0gW2Zhcl0gICAgY2FtZXJhIGZydXN0dW0gZmFyIHBsYW5lXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy9kcmFnIG1vdXNlIHRvIHRvZ2dsZSB0aGUgd29ybGQhXG4gKiAvL3RoZXJlJ3Mgbm8gdmFuaXNoIHBvaW50XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiAgIG9ydGhvKC13aWR0aCAvIDIsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgLWhlaWdodCAvIDIsIDAsIDUwMCk7XG4gKiB9XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIG9yYml0Q29udHJvbCgpO1xuICogICBzdHJva2VXZWlnaHQoMC4xKTtcbiAqICAgZm9yICh2YXIgaSA9IC0xOyBpIDwgMjsgaSsrKSB7XG4gKiAgICAgZm9yICh2YXIgaiA9IC0yOyBqIDwgMzsgaisrKSB7XG4gKiAgICAgICBwdXNoKCk7XG4gKiAgICAgICB0cmFuc2xhdGUoaSAqIDE2MCwgMCwgaiAqIDE2MCk7XG4gKiAgICAgICBib3goNDAsIDQwLCA0MCk7XG4gKiAgICAgICBwb3AoKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIDMgM2QgYm94ZXMsIHJldmVhbCBzZXZlcmFsIG1vcmUgYm94ZXMgb24gM2QgcGxhbmUgd2hlbiBtb3VzZSB1c2VkIHRvIHRvZ2dsZVxuICpcbiAqL1xucDUucHJvdG90eXBlLm9ydGhvID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2Fzc2VydDNkKCdvcnRobycpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdvcnRobycsIGFyZ3VtZW50cyk7XG4gIHRoaXMuX3JlbmRlcmVyLm9ydGhvLmFwcGx5KHRoaXMuX3JlbmRlcmVyLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLm9ydGhvID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgaWYgKGxlZnQgPT09IHVuZGVmaW5lZCkgbGVmdCA9IC10aGlzLndpZHRoIC8gMjtcbiAgaWYgKHJpZ2h0ID09PSB1bmRlZmluZWQpIHJpZ2h0ID0gK3RoaXMud2lkdGggLyAyO1xuICBpZiAoYm90dG9tID09PSB1bmRlZmluZWQpIGJvdHRvbSA9IC10aGlzLmhlaWdodCAvIDI7XG4gIGlmICh0b3AgPT09IHVuZGVmaW5lZCkgdG9wID0gK3RoaXMuaGVpZ2h0IC8gMjtcbiAgaWYgKG5lYXIgPT09IHVuZGVmaW5lZCkgbmVhciA9IDA7XG4gIGlmIChmYXIgPT09IHVuZGVmaW5lZCkgZmFyID0gTWF0aC5tYXgodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuXG4gIHZhciB3ID0gcmlnaHQgLSBsZWZ0O1xuICB2YXIgaCA9IHRvcCAtIGJvdHRvbTtcbiAgdmFyIGQgPSBmYXIgLSBuZWFyO1xuXG4gIHZhciB4ID0gKzIuMCAvIHc7XG4gIHZhciB5ID0gKzIuMCAvIGg7XG4gIHZhciB6ID0gLTIuMCAvIGQ7XG5cbiAgdmFyIHR4ID0gLShyaWdodCArIGxlZnQpIC8gdztcbiAgdmFyIHR5ID0gLSh0b3AgKyBib3R0b20pIC8gaDtcbiAgdmFyIHR6ID0gLShmYXIgKyBuZWFyKSAvIGQ7XG5cbiAgdGhpcy51UE1hdHJpeCA9IHA1Lk1hdHJpeC5pZGVudGl0eSgpO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB0aGlzLnVQTWF0cml4LnNldCggIHgsICAwLCAgMCwgIDAsIFxuICAgICAgICAgICAgICAgICAgICAgIDAsIC15LCAgMCwgIDAsIFxuICAgICAgICAgICAgICAgICAgICAgIDAsICAwLCAgeiwgIDAsIFxuICAgICAgICAgICAgICAgICAgICAgdHgsIHR5LCB0eiwgIDEpO1xuXG4gIHRoaXMuX2N1ckNhbWVyYSA9ICdjdXN0b20nO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNTtcblxufSx7XCIuLi9jb3JlL2NvcmVcIjoyMn1dLDY0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbi8qKlxuICogQG1ldGhvZCBvcmJpdENvbnRyb2xcbiAqIEBmb3IgcDVcbiAqIEBjaGFpbmFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoNTApO1xuICogICAvLyBPcmJpdCBjb250cm9sIGFsbG93cyB0aGUgY2FtZXJhIHRvIG9yYml0IGFyb3VuZCBhIHRhcmdldC5cbiAqICAgb3JiaXRDb250cm9sKCk7XG4gKiAgIGJveCgzMCwgNTApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogQ2FtZXJhIG9yYml0cyBhcm91bmQgYm94IHdoZW4gbW91c2UgaXMgaG9sZC1jbGlja2VkICYgdGhlbiBtb3ZlZC5cbiAqL1xuLy9AVE9ETzogaW1wbGVtZW50IGZ1bGwgb3JiaXQgY29udHJvbHMgaW5jbHVkaW5nXG4vL3Bhbiwgem9vbSwgcXVhdGVybmlvbiByb3RhdGlvbiwgZXRjLlxucDUucHJvdG90eXBlLm9yYml0Q29udHJvbCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9hc3NlcnQzZCgnb3JiaXRDb250cm9sJyk7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ29yYml0Q29udHJvbCcsIGFyZ3VtZW50cyk7XG4gIGlmICh0aGlzLm1vdXNlSXNQcmVzc2VkKSB7XG4gICAgdGhpcy5yb3RhdGVZKCh0aGlzLm1vdXNlWCAtIHRoaXMud2lkdGggLyAyKSAvICh0aGlzLndpZHRoIC8gMikpO1xuICAgIHRoaXMucm90YXRlWCgodGhpcy5tb3VzZVkgLSB0aGlzLmhlaWdodCAvIDIpIC8gKHRoaXMud2lkdGggLyAyKSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4uL2NvcmUvY29yZVwiOjIyfV0sNjU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIExpZ2h0cywgQ2FtZXJhXG4gKiBAc3VibW9kdWxlIExpZ2h0c1xuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYW1iaWVudCBsaWdodCB3aXRoIGEgY29sb3JcbiAqXG4gKiBAbWV0aG9kIGFtYmllbnRMaWdodFxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgdjEgICAgICByZWQgb3IgaHVlIHZhbHVlIHJlbGF0aXZlIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICB2MiAgICAgIGdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29sb3IgcmFuZ2VcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIHYzICAgICAgYmx1ZSBvciBicmlnaHRuZXNzIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNvbG9yIHJhbmdlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICBbYWxwaGFdXG4gKiBAY2hhaW5hYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIH1cbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMCk7XG4gKiAgIGFtYmllbnRMaWdodCgxNTApO1xuICogICBhbWJpZW50TWF0ZXJpYWwoMjUwKTtcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgc3BoZXJlKDI1KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGV2ZW5seSBkaXN0cmlidXRlZCBsaWdodCBhY3Jvc3MgYSBzcGhlcmVcbiAqXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIGFtYmllbnRMaWdodFxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgdmFsdWUgICBhIGNvbG9yIHN0cmluZ1xuICogQGNoYWluYWJsZVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBhbWJpZW50TGlnaHRcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIGdyYXkgICBhIGdyYXkgdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgIFthbHBoYV1cbiAqIEBjaGFpbmFibGVcbiAqL1xuXG4vKipcbiAqIEBtZXRob2QgYW1iaWVudExpZ2h0XG4gKiBAcGFyYW0gIHtOdW1iZXJbXX0gICAgICB2YWx1ZXMgIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHJlZCxncmVlbixibHVlICZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFscGhhIGNvbXBvbmVudHMgb2YgdGhlIGNvbG9yXG4gKiBAY2hhaW5hYmxlXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIGFtYmllbnRMaWdodFxuICogQHBhcmFtICB7cDUuQ29sb3J9ICAgICAgY29sb3IgICB0aGUgYW1iaWVudCBsaWdodCBjb2xvclxuICogQGNoYWluYWJsZVxuICovXG5wNS5wcm90b3R5cGUuYW1iaWVudExpZ2h0ID0gZnVuY3Rpb24odjEsIHYyLCB2MywgYSkge1xuICB0aGlzLl9hc3NlcnQzZCgnYW1iaWVudExpZ2h0Jyk7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2FtYmllbnRMaWdodCcsIGFyZ3VtZW50cyk7XG4gIHZhciBjb2xvciA9IHRoaXMuY29sb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICB2YXIgc2hhZGVyID0gdGhpcy5fcmVuZGVyZXIuX3VzZUxpZ2h0U2hhZGVyKCk7XG5cbiAgLy9AdG9kbyB0aGlzIGlzIGEgYml0IGlja3kuIGFycmF5IHVuaWZvcm1zIGhhdmVcbiAgLy90byBiZSBtdWx0aXBsZXMgb2YgdGhlIHR5cGUgMyhyZ2IpIGluIHRoaXMgY2FzZS5cbiAgLy9hIHByZWFsbG9jYXRlZCBGbG9hdDMyQXJyYXkoMjQpIHRoYXQgd2UgY29weSBpbnRvXG4gIC8vd291bGQgYmUgYmV0dGVyXG4gIHNoYWRlci5zZXRVbmlmb3JtKCd1VXNlTGlnaHRpbmcnLCB0cnVlKTtcbiAgLy9pbiBjYXNlIHRoZXJlJ3Mgbm8gbWF0ZXJpYWwgY29sb3IgZm9yIHRoZSBnZW9tZXRyeVxuICBzaGFkZXIuc2V0VW5pZm9ybSgndU1hdGVyaWFsQ29sb3InLCB0aGlzLl9yZW5kZXJlci5jdXJGaWxsQ29sb3IpO1xuXG4gIHRoaXMuX3JlbmRlcmVyLmFtYmllbnRMaWdodENvbG9ycy5wdXNoKFxuICAgIGNvbG9yLl9hcnJheVswXSxcbiAgICBjb2xvci5fYXJyYXlbMV0sXG4gICAgY29sb3IuX2FycmF5WzJdXG4gICk7XG4gIHNoYWRlci5zZXRVbmlmb3JtKCd1QW1iaWVudENvbG9yJywgdGhpcy5fcmVuZGVyZXIuYW1iaWVudExpZ2h0Q29sb3JzKTtcblxuICBzaGFkZXIuc2V0VW5pZm9ybShcbiAgICAndUFtYmllbnRMaWdodENvdW50JyxcbiAgICB0aGlzLl9yZW5kZXJlci5hbWJpZW50TGlnaHRDb2xvcnMubGVuZ3RoIC8gM1xuICApO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlyZWN0aW9uYWwgbGlnaHQgd2l0aCBhIGNvbG9yIGFuZCBhIGRpcmVjdGlvblxuICogQG1ldGhvZCBkaXJlY3Rpb25hbExpZ2h0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgIHYxICAgICAgIHJlZCBvciBodWUgdmFsdWUgKGRlcGVuZGluZyBvbiB0aGUgY3VycmVudFxuICogY29sb3IgbW9kZSksXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgIHYyICAgICAgIGdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gICAgdjMgICAgICAgYmx1ZSBvciBicmlnaHRuZXNzIHZhbHVlXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J9IHBvc2l0aW9uIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGxpZ2h0XG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICogfVxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgwKTtcbiAqICAgLy9tb3ZlIHlvdXIgbW91c2UgdG8gY2hhbmdlIGxpZ2h0IGRpcmVjdGlvblxuICogICB2YXIgZGlyWCA9IChtb3VzZVggLyB3aWR0aCAtIDAuNSkgKiAyO1xuICogICB2YXIgZGlyWSA9IChtb3VzZVkgLyBoZWlnaHQgLSAwLjUpICogMjtcbiAqICAgZGlyZWN0aW9uYWxMaWdodCgyNTAsIDI1MCwgMjUwLCAtZGlyWCwgLWRpclksIDAuMjUpO1xuICogICBhbWJpZW50TWF0ZXJpYWwoMjUwKTtcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgc3BoZXJlKDI1KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGxpZ2h0IHNvdXJjZSBvbiBjYW52YXMgY2hhbmdlYWJsZSB3aXRoIG1vdXNlIHBvc2l0aW9uXG4gKlxuICovXG5cbi8qKlxuICogQG1ldGhvZCBkaXJlY3Rpb25hbExpZ2h0XG4gKiBAcGFyYW0gIHtOdW1iZXJbXXxTdHJpbmd8cDUuQ29sb3J9IGNvbG9yICAgY29sb3IgQXJyYXksIENTUyBjb2xvciBzdHJpbmcsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHA1LkNvbG9yIHZhbHVlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgIHggICAgICAgeCBheGlzIGRpcmVjdGlvblxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgICAgICAgICAgICB5ICAgICAgIHkgYXhpcyBkaXJlY3Rpb25cbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgICAgICAgICAgICAgeiAgICAgICB6IGF4aXMgZGlyZWN0aW9uXG4gKiBAY2hhaW5hYmxlXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIGRpcmVjdGlvbmFsTGlnaHRcbiAqIEBwYXJhbSAge051bWJlcltdfFN0cmluZ3xwNS5Db2xvcn0gY29sb3JcbiAqIEBwYXJhbSAge3A1LlZlY3Rvcn0gICAgICAgICAgICAgICAgcG9zaXRpb25cbiAqIEBjaGFpbmFibGVcbiAqL1xuXG4vKipcbiAqIEBtZXRob2QgZGlyZWN0aW9uYWxMaWdodFxuICogQHBhcmFtICB7TnVtYmVyfSAgICB2MVxuICogQHBhcmFtICB7TnVtYmVyfSAgICB2MlxuICogQHBhcmFtICB7TnVtYmVyfSAgICB2M1xuICogQHBhcmFtICB7TnVtYmVyfSAgICB4XG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgIHlcbiAqIEBwYXJhbSAge051bWJlcn0gICAgelxuICogQGNoYWluYWJsZVxuICovXG5wNS5wcm90b3R5cGUuZGlyZWN0aW9uYWxMaWdodCA9IGZ1bmN0aW9uKHYxLCB2MiwgdjMsIHgsIHksIHopIHtcbiAgdGhpcy5fYXNzZXJ0M2QoJ2RpcmVjdGlvbmFsTGlnaHQnKTtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnZGlyZWN0aW9uYWxMaWdodCcsIGFyZ3VtZW50cyk7XG4gIHZhciBzaGFkZXIgPSB0aGlzLl9yZW5kZXJlci5fdXNlTGlnaHRTaGFkZXIoKTtcblxuICAvL0BUT0RPOiBjaGVjayBwYXJhbWV0ZXJzIG51bWJlclxuICB2YXIgY29sb3IgPSB0aGlzLmNvbG9yLmFwcGx5KHRoaXMsIFt2MSwgdjIsIHYzXSk7XG5cbiAgdmFyIF94LCBfeSwgX3o7XG4gIHZhciB2ID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgaWYgKHR5cGVvZiB2ID09PSAnbnVtYmVyJykge1xuICAgIF94ID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAzXTtcbiAgICBfeSA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMl07XG4gICAgX3ogPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICB9IGVsc2Uge1xuICAgIF94ID0gdi54O1xuICAgIF95ID0gdi55O1xuICAgIF96ID0gdi56O1xuICB9XG4gIHNoYWRlci5zZXRVbmlmb3JtKCd1VXNlTGlnaHRpbmcnLCB0cnVlKTtcbiAgLy9pbiBjYXNlIHRoZXJlJ3Mgbm8gbWF0ZXJpYWwgY29sb3IgZm9yIHRoZSBnZW9tZXRyeVxuICBzaGFkZXIuc2V0VW5pZm9ybSgndU1hdGVyaWFsQ29sb3InLCB0aGlzLl9yZW5kZXJlci5jdXJGaWxsQ29sb3IpO1xuXG4gIC8vIG5vcm1hbGl6ZSBkaXJlY3Rpb25cbiAgdmFyIGwgPSBNYXRoLnNxcnQoX3ggKiBfeCArIF95ICogX3kgKyBfeiAqIF96KTtcbiAgdGhpcy5fcmVuZGVyZXIuZGlyZWN0aW9uYWxMaWdodERpcmVjdGlvbnMucHVzaChfeCAvIGwsIF95IC8gbCwgX3ogLyBsKTtcbiAgc2hhZGVyLnNldFVuaWZvcm0oXG4gICAgJ3VMaWdodGluZ0RpcmVjdGlvbicsXG4gICAgdGhpcy5fcmVuZGVyZXIuZGlyZWN0aW9uYWxMaWdodERpcmVjdGlvbnNcbiAgKTtcblxuICB0aGlzLl9yZW5kZXJlci5kaXJlY3Rpb25hbExpZ2h0Q29sb3JzLnB1c2goXG4gICAgY29sb3IuX2FycmF5WzBdLFxuICAgIGNvbG9yLl9hcnJheVsxXSxcbiAgICBjb2xvci5fYXJyYXlbMl1cbiAgKTtcbiAgc2hhZGVyLnNldFVuaWZvcm0oJ3VEaXJlY3Rpb25hbENvbG9yJywgdGhpcy5fcmVuZGVyZXIuZGlyZWN0aW9uYWxMaWdodENvbG9ycyk7XG5cbiAgc2hhZGVyLnNldFVuaWZvcm0oXG4gICAgJ3VEaXJlY3Rpb25hbExpZ2h0Q291bnQnLFxuICAgIHRoaXMuX3JlbmRlcmVyLmRpcmVjdGlvbmFsTGlnaHRDb2xvcnMubGVuZ3RoIC8gM1xuICApO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcG9pbnQgbGlnaHQgd2l0aCBhIGNvbG9yIGFuZCBhIGxpZ2h0IHBvc2l0aW9uXG4gKiBAbWV0aG9kIHBvaW50TGlnaHRcbiAqIEBwYXJhbSAge051bWJlcn0gICAgdjEgICAgICAgcmVkIG9yIGh1ZSB2YWx1ZSAoZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50XG4gKiBjb2xvciBtb2RlKSxcbiAqIEBwYXJhbSAge051bWJlcn0gICAgdjIgICAgICAgZ3JlZW4gb3Igc2F0dXJhdGlvbiB2YWx1ZVxuICogQHBhcmFtICB7TnVtYmVyfSAgICB2MyAgICAgICBibHVlIG9yIGJyaWdodG5lc3MgdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gICAgeCAgICAgICAgeCBheGlzIHBvc2l0aW9uXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgIHkgICAgICAgIHkgYXhpcyBwb3NpdGlvblxuICogQHBhcmFtICB7TnVtYmVyfSAgICB6ICAgICAgICB6IGF4aXMgcG9zaXRpb25cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDApO1xuICogICAvL21vdmUgeW91ciBtb3VzZSB0byBjaGFuZ2UgbGlnaHQgcG9zaXRpb25cbiAqICAgdmFyIGxvY1ggPSBtb3VzZVggLSB3aWR0aCAvIDI7XG4gKiAgIHZhciBsb2NZID0gbW91c2VZIC0gaGVpZ2h0IC8gMjtcbiAqICAgLy8gdG8gc2V0IHRoZSBsaWdodCBwb3NpdGlvbixcbiAqICAgLy8gdGhpbmsgb2YgdGhlIHdvcmxkJ3MgY29vcmRpbmF0ZSBhczpcbiAqICAgLy8gLXdpZHRoLzIsLWhlaWdodC8yIC0tLS0tLS0tIHdpZHRoLzIsLWhlaWdodC8yXG4gKiAgIC8vICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4gKiAgIC8vICAgICAgICAgICAgICAgIHwgICAgIDAsMCAgICB8XG4gKiAgIC8vICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4gKiAgIC8vIC13aWR0aC8yLGhlaWdodC8yLS0tLS0tLS13aWR0aC8yLGhlaWdodC8yXG4gKiAgIHBvaW50TGlnaHQoMjUwLCAyNTAsIDI1MCwgbG9jWCwgbG9jWSwgNTApO1xuICogICBhbWJpZW50TWF0ZXJpYWwoMjUwKTtcbiAqICAgbm9TdHJva2UoKTtcbiAqICAgc3BoZXJlKDI1KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIHNwb3QgbGlnaHQgb24gY2FudmFzIGNoYW5nZXMgcG9zaXRpb24gd2l0aCBtb3VzZVxuICpcbiAqL1xuXG4vKipcbiAqIEBtZXRob2QgcG9pbnRMaWdodFxuICogQHBhcmFtICB7TnVtYmVyfSAgICB2MVxuICogQHBhcmFtICB7TnVtYmVyfSAgICB2MlxuICogQHBhcmFtICB7TnVtYmVyfSAgICB2M1xuICogQHBhcmFtICB7cDUuVmVjdG9yfSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGxpZ2h0XG4gKiBAY2hhaW5hYmxlXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIHBvaW50TGlnaHRcbiAqIEBwYXJhbSAge051bWJlcltdfFN0cmluZ3xwNS5Db2xvcn0gY29sb3IgICBjb2xvciBBcnJheSwgQ1NTIGNvbG9yIHN0cmluZyxcbiAqIG9yIHA1LkNvbG9yIHZhbHVlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgIHhcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgICAgICAgICAgICAgeVxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgICAgICAgICAgICB6XG4gKiBAY2hhaW5hYmxlXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIHBvaW50TGlnaHRcbiAqIEBwYXJhbSAge051bWJlcltdfFN0cmluZ3xwNS5Db2xvcn0gY29sb3JcbiAqIEBwYXJhbSAge3A1LlZlY3Rvcn0gICAgICAgICAgICAgICAgcG9zaXRpb25cbiAqIEBjaGFpbmFibGVcbiAqL1xucDUucHJvdG90eXBlLnBvaW50TGlnaHQgPSBmdW5jdGlvbih2MSwgdjIsIHYzLCB4LCB5LCB6KSB7XG4gIHRoaXMuX2Fzc2VydDNkKCdwb2ludExpZ2h0Jyk7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3BvaW50TGlnaHQnLCBhcmd1bWVudHMpO1xuICAvL0BUT0RPOiBjaGVjayBwYXJhbWV0ZXJzIG51bWJlclxuICB2YXIgY29sb3IgPSB0aGlzLl9yZW5kZXJlci5fcEluc3QuY29sb3IuYXBwbHkodGhpcywgW3YxLCB2MiwgdjNdKTtcblxuICB2YXIgX3gsIF95LCBfejtcbiAgdmFyIHYgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICBpZiAodHlwZW9mIHYgPT09ICdudW1iZXInKSB7XG4gICAgX3ggPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDNdO1xuICAgIF95ID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAyXTtcbiAgICBfeiA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSB7XG4gICAgX3ggPSB2Lng7XG4gICAgX3kgPSB2Lnk7XG4gICAgX3ogPSB2Lno7XG4gIH1cblxuICB2YXIgc2hhZGVyID0gdGhpcy5fcmVuZGVyZXIuX3VzZUxpZ2h0U2hhZGVyKCk7XG4gIHNoYWRlci5zZXRVbmlmb3JtKCd1VXNlTGlnaHRpbmcnLCB0cnVlKTtcbiAgLy9pbiBjYXNlIHRoZXJlJ3Mgbm8gbWF0ZXJpYWwgY29sb3IgZm9yIHRoZSBnZW9tZXRyeVxuICBzaGFkZXIuc2V0VW5pZm9ybSgndU1hdGVyaWFsQ29sb3InLCB0aGlzLl9yZW5kZXJlci5jdXJGaWxsQ29sb3IpO1xuXG4gIHRoaXMuX3JlbmRlcmVyLnBvaW50TGlnaHRQb3NpdGlvbnMucHVzaChfeCwgX3ksIF96KTtcbiAgc2hhZGVyLnNldFVuaWZvcm0oJ3VQb2ludExpZ2h0TG9jYXRpb24nLCB0aGlzLl9yZW5kZXJlci5wb2ludExpZ2h0UG9zaXRpb25zKTtcblxuICB0aGlzLl9yZW5kZXJlci5wb2ludExpZ2h0Q29sb3JzLnB1c2goXG4gICAgY29sb3IuX2FycmF5WzBdLFxuICAgIGNvbG9yLl9hcnJheVsxXSxcbiAgICBjb2xvci5fYXJyYXlbMl1cbiAgKTtcbiAgc2hhZGVyLnNldFVuaWZvcm0oJ3VQb2ludExpZ2h0Q29sb3InLCB0aGlzLl9yZW5kZXJlci5wb2ludExpZ2h0Q29sb3JzKTtcblxuICBzaGFkZXIuc2V0VW5pZm9ybShcbiAgICAndVBvaW50TGlnaHRDb3VudCcsXG4gICAgdGhpcy5fcmVuZGVyZXIucG9pbnRMaWdodENvbG9ycy5sZW5ndGggLyAzXG4gICk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4uL2NvcmUvY29yZVwiOjIyfV0sNjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIFNoYXBlXG4gKiBAc3VibW9kdWxlIDNEIE1vZGVsc1xuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqIEByZXF1aXJlcyBwNS5HZW9tZXRyeVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5fZGVyZXFfKCcuL3A1Lkdlb21ldHJ5Jyk7XG5cbi8qKlxuICogTG9hZCBhIDNkIG1vZGVsIGZyb20gYW4gT0JKIGZpbGUuXG4gKiA8YnI+PGJyPlxuICogT25lIG9mIHRoZSBsaW1pdGF0aW9ucyBvZiB0aGUgT0JKIGZvcm1hdCBpcyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSBhIGJ1aWx0LWluXG4gKiBzZW5zZSBvZiBzY2FsZS4gVGhpcyBtZWFucyB0aGF0IG1vZGVscyBleHBvcnRlZCBmcm9tIGRpZmZlcmVudCBwcm9ncmFtcyBtaWdodFxuICogYmUgdmVyeSBkaWZmZXJlbnQgc2l6ZXMuIElmIHlvdXIgbW9kZWwgaXNuJ3QgZGlzcGxheWluZywgdHJ5IGNhbGxpbmdcbiAqIGxvYWRNb2RlbCgpIHdpdGggdGhlIG5vcm1hbGl6ZWQgcGFyYW1ldGVyIHNldCB0byB0cnVlLiBUaGlzIHdpbGwgcmVzaXplIHRoZVxuICogbW9kZWwgdG8gYSBzY2FsZSBhcHByb3ByaWF0ZSBmb3IgcDUuIFlvdSBjYW4gYWxzbyBtYWtlIGFkZGl0aW9uYWwgY2hhbmdlcyB0b1xuICogdGhlIGZpbmFsIHNpemUgb2YgeW91ciBtb2RlbCB3aXRoIHRoZSBzY2FsZSgpIGZ1bmN0aW9uLlxuICpcbiAqIEBtZXRob2QgbG9hZE1vZGVsXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBhdGggICAgICAgICAgICAgIFBhdGggb2YgdGhlIG1vZGVsIHRvIGJlIGxvYWRlZFxuICogQHBhcmFtICB7Qm9vbGVhbn0gbm9ybWFsaXplICAgICAgICBJZiB0cnVlLCBzY2FsZSB0aGUgbW9kZWwgdG8gYVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkaXplZCBzaXplIHdoZW4gbG9hZGluZ1xuICogQHBhcmFtICB7ZnVuY3Rpb24ocDUuR2VvbWV0cnkpfSBbc3VjY2Vzc0NhbGxiYWNrXSBGdW5jdGlvbiB0byBiZSBjYWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2UgdGhlIG1vZGVsIGlzIGxvYWRlZC4gV2lsbCBiZSBwYXNzZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAzRCBtb2RlbCBvYmplY3QuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbihFdmVudCl9IFtmYWlsdXJlQ2FsbGJhY2tdIGNhbGxlZCB3aXRoIGV2ZW50IGVycm9yIGlmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGltYWdlIGZhaWxzIHRvIGxvYWQuXG4gKiBAcmV0dXJuIHtwNS5HZW9tZXRyeX0gdGhlIHA1Lkdlb21ldHJ5IG9iamVjdFxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvL2RyYXcgYSBzcGlubmluZyB0ZWFwb3RcbiAqIHZhciB0ZWFwb3Q7XG4gKlxuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgdGVhcG90ID0gbG9hZE1vZGVsKCdhc3NldHMvdGVhcG90Lm9iaicpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgbW9kZWwodGVhcG90KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIFZlcnRpY2FsbHkgcm90YXRpbmcgMy1kIHRlYXBvdCB3aXRoIHJlZCwgZ3JlZW4gYW5kIGJsdWUgZ3JhZGllbnQuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBsb2FkTW9kZWxcbiAqIEBwYXJhbSAge1N0cmluZ30gcGF0aFxuICogQHBhcmFtICB7ZnVuY3Rpb24ocDUuR2VvbWV0cnkpfSBbc3VjY2Vzc0NhbGxiYWNrXVxuICogQHBhcmFtICB7ZnVuY3Rpb24oRXZlbnQpfSBbZmFpbHVyZUNhbGxiYWNrXVxuICogQHJldHVybiB7cDUuR2VvbWV0cnl9IHRoZSBwNS5HZW9tZXRyeSBvYmplY3RcbiAqL1xucDUucHJvdG90eXBlLmxvYWRNb2RlbCA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnbG9hZE1vZGVsJywgYXJndW1lbnRzKTtcbiAgdmFyIG5vcm1hbGl6ZTtcbiAgdmFyIHN1Y2Nlc3NDYWxsYmFjaztcbiAgdmFyIGZhaWx1cmVDYWxsYmFjaztcbiAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdib29sZWFuJykge1xuICAgIG5vcm1hbGl6ZSA9IGFyZ3VtZW50c1sxXTtcbiAgICBzdWNjZXNzQ2FsbGJhY2sgPSBhcmd1bWVudHNbMl07XG4gICAgZmFpbHVyZUNhbGxiYWNrID0gYXJndW1lbnRzWzNdO1xuICB9IGVsc2Uge1xuICAgIG5vcm1hbGl6ZSA9IGZhbHNlO1xuICAgIHN1Y2Nlc3NDYWxsYmFjayA9IGFyZ3VtZW50c1sxXTtcbiAgICBmYWlsdXJlQ2FsbGJhY2sgPSBhcmd1bWVudHNbMl07XG4gIH1cblxuICB2YXIgbW9kZWwgPSBuZXcgcDUuR2VvbWV0cnkoKTtcbiAgbW9kZWwuZ2lkID0gcGF0aCArICd8JyArIG5vcm1hbGl6ZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmxvYWRTdHJpbmdzKFxuICAgIHBhdGgsXG4gICAgZnVuY3Rpb24oc3RyaW5ncykge1xuICAgICAgcGFyc2VPYmoobW9kZWwsIHN0cmluZ3MpO1xuXG4gICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgIG1vZGVsLm5vcm1hbGl6ZSgpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9kZWNyZW1lbnRQcmVsb2FkKCk7XG4gICAgICBpZiAodHlwZW9mIHN1Y2Nlc3NDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzdWNjZXNzQ2FsbGJhY2sobW9kZWwpO1xuICAgICAgfVxuICAgIH0uYmluZCh0aGlzKSxcbiAgICBmYWlsdXJlQ2FsbGJhY2tcbiAgKTtcblxuICByZXR1cm4gbW9kZWw7XG59O1xuXG4vKipcbiAqIFBhcnNlIE9CSiBsaW5lcyBpbnRvIG1vZGVsLiBGb3IgcmVmZXJlbmNlLCB0aGlzIGlzIHdoYXQgYSBzaW1wbGUgbW9kZWwgb2YgYVxuICogc3F1YXJlIG1pZ2h0IGxvb2sgbGlrZTpcbiAqXG4gKiB2IC0wLjUgLTAuNSAwLjVcbiAqIHYgLTAuNSAtMC41IC0wLjVcbiAqIHYgLTAuNSAwLjUgLTAuNVxuICogdiAtMC41IDAuNSAwLjVcbiAqXG4gKiBmIDQgMyAyIDFcbiAqL1xuZnVuY3Rpb24gcGFyc2VPYmoobW9kZWwsIGxpbmVzKSB7XG4gIC8vIE9CSiBhbGxvd3MgYSBmYWNlIHRvIHNwZWNpZnkgYW4gaW5kZXggZm9yIGEgdmVydGV4IChpbiB0aGUgYWJvdmUgZXhhbXBsZSksXG4gIC8vIGJ1dCBpdCBhbHNvIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGN1c3RvbSBjb21iaW5hdGlvbiBvZiB2ZXJ0ZXgsIFVWXG4gIC8vIGNvb3JkaW5hdGUsIGFuZCB2ZXJ0ZXggbm9ybWFsLiBTbywgXCIzLzQvM1wiIHdvdWxkIG1lYW4sIFwidXNlIHZlcnRleCAzIHdpdGhcbiAgLy8gVVYgY29vcmRpbmF0ZSA0IGFuZCB2ZXJ0ZXggbm9ybWFsIDNcIi4gSW4gV2ViR0wsIGV2ZXJ5IHZlcnRleCB3aXRoIGRpZmZlcmVudFxuICAvLyBwYXJhbWV0ZXJzIG11c3QgYmUgYSBkaWZmZXJlbnQgdmVydGV4LCBzbyBsb2FkZWRWZXJ0cyBpcyB1c2VkIHRvXG4gIC8vIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSBwYXJzZWQgdmVydGljZXMsIG5vcm1hbHMsIGV0Yy4sIGFuZCBpbmRleGVkVmVydHMgaXNcbiAgLy8gdXNlZCB0byBtYXAgYSBzcGVjaWZpYyBjb21iaW5hdGlvbiAoa2V5ZWQgb24sIGZvciBleGFtcGxlLCB0aGUgc3RyaW5nXG4gIC8vIFwiMy80LzNcIiksIHRvIHRoZSBhY3R1YWwgaW5kZXggb2YgdGhlIG5ld2x5IGNyZWF0ZWQgdmVydGV4IGluIHRoZSBmaW5hbFxuICAvLyBvYmplY3QuXG4gIHZhciBsb2FkZWRWZXJ0cyA9IHtcbiAgICB2OiBbXSxcbiAgICB2dDogW10sXG4gICAgdm46IFtdXG4gIH07XG4gIHZhciBpbmRleGVkVmVydHMgPSB7fTtcblxuICBmb3IgKHZhciBsaW5lID0gMDsgbGluZSA8IGxpbmVzLmxlbmd0aDsgKytsaW5lKSB7XG4gICAgLy8gRWFjaCBsaW5lIGlzIGEgc2VwYXJhdGUgb2JqZWN0ICh2ZXJ0ZXgsIGZhY2UsIHZlcnRleCBub3JtYWwsIGV0YylcbiAgICAvLyBGb3IgZWFjaCBsaW5lLCBzcGxpdCBpdCBpbnRvIHRva2VucyBvbiB3aGl0ZXNwYWNlLiBUaGUgZmlyc3QgdG9rZW5cbiAgICAvLyBkZXNjcmliZXMgdGhlIHR5cGUuXG4gICAgdmFyIHRva2VucyA9IGxpbmVzW2xpbmVdLnRyaW0oKS5zcGxpdCgvXFxiXFxzKy8pO1xuXG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodG9rZW5zWzBdID09PSAndicgfHwgdG9rZW5zWzBdID09PSAndm4nKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbGluZSBkZXNjcmliZXMgYSB2ZXJ0ZXggb3IgdmVydGV4IG5vcm1hbC5cbiAgICAgICAgLy8gSXQgd2lsbCBoYXZlIHRocmVlIG51bWVyaWMgcGFyYW1ldGVycy5cbiAgICAgICAgdmFyIHZlcnRleCA9IG5ldyBwNS5WZWN0b3IoXG4gICAgICAgICAgcGFyc2VGbG9hdCh0b2tlbnNbMV0pLFxuICAgICAgICAgIHBhcnNlRmxvYXQodG9rZW5zWzJdKSxcbiAgICAgICAgICBwYXJzZUZsb2F0KHRva2Vuc1szXSlcbiAgICAgICAgKTtcbiAgICAgICAgbG9hZGVkVmVydHNbdG9rZW5zWzBdXS5wdXNoKHZlcnRleCk7XG4gICAgICB9IGVsc2UgaWYgKHRva2Vuc1swXSA9PT0gJ3Z0Jykge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGxpbmUgZGVzY3JpYmVzIGEgdGV4dHVyZSBjb29yZGluYXRlLlxuICAgICAgICAvLyBJdCB3aWxsIGhhdmUgdHdvIG51bWVyaWMgcGFyYW1ldGVycy5cbiAgICAgICAgdmFyIHRleFZlcnRleCA9IFtwYXJzZUZsb2F0KHRva2Vuc1sxXSksIHBhcnNlRmxvYXQodG9rZW5zWzJdKV07XG4gICAgICAgIGxvYWRlZFZlcnRzW3Rva2Vuc1swXV0ucHVzaCh0ZXhWZXJ0ZXgpO1xuICAgICAgfSBlbHNlIGlmICh0b2tlbnNbMF0gPT09ICdmJykge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGxpbmUgZGVzY3JpYmVzIGEgZmFjZS5cbiAgICAgICAgLy8gT0JKIGZhY2VzIGNhbiBoYXZlIG1vcmUgdGhhbiB0aHJlZSBwb2ludHMuIFRyaWFuZ3VsYXRlIHBvaW50cy5cbiAgICAgICAgZm9yICh2YXIgdHJpID0gMzsgdHJpIDwgdG9rZW5zLmxlbmd0aDsgKyt0cmkpIHtcbiAgICAgICAgICB2YXIgZmFjZSA9IFtdO1xuXG4gICAgICAgICAgdmFyIHZlcnRleFRva2VucyA9IFsxLCB0cmkgLSAxLCB0cmldO1xuXG4gICAgICAgICAgZm9yICh2YXIgdG9rZW5JbmQgPSAwOyB0b2tlbkluZCA8IHZlcnRleFRva2Vucy5sZW5ndGg7ICsrdG9rZW5JbmQpIHtcbiAgICAgICAgICAgIC8vIE5vdywgY29udmVydCB0aGUgZ2l2ZW4gdG9rZW4gaW50byBhbiBpbmRleFxuICAgICAgICAgICAgdmFyIHZlcnRTdHJpbmcgPSB0b2tlbnNbdmVydGV4VG9rZW5zW3Rva2VuSW5kXV07XG4gICAgICAgICAgICB2YXIgdmVydEluZGV4ID0gMDtcblxuICAgICAgICAgICAgLy8gVE9ETzogRmFjZXMgY2FuIHRlY2huaWNhbGx5IHVzZSBuZWdhdGl2ZSBudW1iZXJzIHRvIHJlZmVyIHRvIHRoZVxuICAgICAgICAgICAgLy8gcHJldmlvdXMgbnRoIHZlcnRleC4gSSBoYXZlbid0IHNlZW4gdGhpcyB1c2VkIGluIHByYWN0aWNlLCBidXRcbiAgICAgICAgICAgIC8vIGl0IG1pZ2h0IGJlIGdvb2QgdG8gaW1wbGVtZW50IHRoaXMgaW4gdGhlIGZ1dHVyZS5cblxuICAgICAgICAgICAgaWYgKGluZGV4ZWRWZXJ0c1t2ZXJ0U3RyaW5nXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHZlcnRJbmRleCA9IGluZGV4ZWRWZXJ0c1t2ZXJ0U3RyaW5nXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciB2ZXJ0UGFydHMgPSB2ZXJ0U3RyaW5nLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydFBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmVydFBhcnRzW2ldID0gcGFyc2VJbnQodmVydFBhcnRzW2ldKSAtIDE7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2ZXJ0SW5kZXggPSBpbmRleGVkVmVydHNbdmVydFN0cmluZ10gPSBtb2RlbC52ZXJ0aWNlcy5sZW5ndGg7XG4gICAgICAgICAgICAgIG1vZGVsLnZlcnRpY2VzLnB1c2gobG9hZGVkVmVydHMudlt2ZXJ0UGFydHNbMF1dLmNvcHkoKSk7XG4gICAgICAgICAgICAgIGlmIChsb2FkZWRWZXJ0cy52dFt2ZXJ0UGFydHNbMV1dKSB7XG4gICAgICAgICAgICAgICAgbW9kZWwudXZzLnB1c2gobG9hZGVkVmVydHMudnRbdmVydFBhcnRzWzFdXS5zbGljZSgpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbC51dnMucHVzaChbMCwgMF0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGxvYWRlZFZlcnRzLnZuW3ZlcnRQYXJ0c1syXV0pIHtcbiAgICAgICAgICAgICAgICBtb2RlbC52ZXJ0ZXhOb3JtYWxzLnB1c2gobG9hZGVkVmVydHMudm5bdmVydFBhcnRzWzJdXS5jb3B5KCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZhY2UucHVzaCh2ZXJ0SW5kZXgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZhY2VbMF0gIT09IGZhY2VbMV0gJiZcbiAgICAgICAgICAgIGZhY2VbMF0gIT09IGZhY2VbMl0gJiZcbiAgICAgICAgICAgIGZhY2VbMV0gIT09IGZhY2VbMl1cbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1vZGVsLmZhY2VzLnB1c2goZmFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIElmIHRoZSBtb2RlbCBkb2Vzbid0IGhhdmUgbm9ybWFscywgY29tcHV0ZSB0aGUgbm9ybWFsc1xuICBpZiAobW9kZWwudmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDApIHtcbiAgICBtb2RlbC5jb21wdXRlTm9ybWFscygpO1xuICB9XG5cbiAgcmV0dXJuIG1vZGVsO1xufVxuXG4vKipcbiAqIFJlbmRlciBhIDNkIG1vZGVsIHRvIHRoZSBzY3JlZW4uXG4gKlxuICogQG1ldGhvZCBtb2RlbFxuICogQHBhcmFtICB7cDUuR2VvbWV0cnl9IG1vZGVsIExvYWRlZCAzZCBtb2RlbCB0byBiZSByZW5kZXJlZFxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vZHJhdyBhIHNwaW5uaW5nIHRlYXBvdFxuICogdmFyIHRlYXBvdDtcbiAqXG4gKiBmdW5jdGlvbiBwcmVsb2FkKCkge1xuICogICB0ZWFwb3QgPSBsb2FkTW9kZWwoJ2Fzc2V0cy90ZWFwb3Qub2JqJyk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgcm90YXRlWChmcmFtZUNvdW50ICogMC4wMSk7XG4gKiAgIHJvdGF0ZVkoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICBtb2RlbCh0ZWFwb3QpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogVmVydGljYWxseSByb3RhdGluZyAzLWQgdGVhcG90IHdpdGggcmVkLCBncmVlbiBhbmQgYmx1ZSBncmFkaWVudC5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5tb2RlbCA9IGZ1bmN0aW9uKG1vZGVsKSB7XG4gIHRoaXMuX2Fzc2VydDNkKCdtb2RlbCcpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdtb2RlbCcsIGFyZ3VtZW50cyk7XG4gIGlmIChtb2RlbC52ZXJ0aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlci5nZW9tZXRyeUluSGFzaChtb2RlbC5naWQpKSB7XG4gICAgICBtb2RlbC5fbWFrZVRyaWFuZ2xlRWRnZXMoKS5fZWRnZXNUb1ZlcnRpY2VzKCk7XG4gICAgICB0aGlzLl9yZW5kZXJlci5jcmVhdGVCdWZmZXJzKG1vZGVsLmdpZCwgbW9kZWwpO1xuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlcmVyLmRyYXdCdWZmZXJzKG1vZGVsLmdpZCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDU7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjIsXCIuL3A1Lkdlb21ldHJ5XCI6Njh9XSw2NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIEBtb2R1bGUgTGlnaHRzLCBDYW1lcmFcbiAqIEBzdWJtb2R1bGUgTWF0ZXJpYWxcbiAqIEBmb3IgcDVcbiAqIEByZXF1aXJlcyBjb3JlXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuLi9jb3JlL2NvcmUnKTtcbnZhciBjb25zdGFudHMgPSBfZGVyZXFfKCcuLi9jb3JlL2NvbnN0YW50cycpO1xuX2RlcmVxXygnLi9wNS5UZXh0dXJlJyk7XG5cbi8qKlxuICogTG9hZHMgYSBjdXN0b20gc2hhZGVyIGZyb20gdGhlIHByb3ZpZGVkIHZlcnRleCBhbmQgZnJhZ21lbnRcbiAqIHNoYWRlciBwYXRocy4gVGhlIHNoYWRlciBmaWxlcyBhcmUgbG9hZGVkIGFzeW5jaHJvbm91c2x5IGluIHRoZVxuICogYmFja2dyb3VuZCwgc28gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW4gcHJlbG9hZCgpLlxuICpcbiAqIEZvciBub3csIHRoZXJlIGFyZSB0aHJlZSBtYWluIHR5cGVzIG9mIHNoYWRlcnMuIHA1IHdpbGwgYXV0b21hdGljYWxseVxuICogc3VwcGx5IGFwcHJvcHJpYXRlIHZlcnRpY2VzLCBub3JtYWxzLCBjb2xvcnMsIGFuZCBsaWdodGluZyBhdHRyaWJ1dGVzXG4gKiBpZiB0aGUgcGFyYW1ldGVycyBkZWZpbmVkIGluIHRoZSBzaGFkZXIgbWF0Y2ggdGhlIG5hbWVzLlxuICpcbiAqIEBtZXRob2QgbG9hZFNoYWRlclxuICogQHBhcmFtIHtTdHJpbmd9IFt2ZXJ0RmlsZW5hbWVdIHBhdGggdG8gZmlsZSBjb250YWluaW5nIHZlcnRleCBzaGFkZXJcbiAqIHNvdXJjZSBjb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gW2ZyYWdGaWxlbmFtZV0gcGF0aCB0byBmaWxlIGNvbnRhaW5pbmcgZnJhZ21lbnQgc2hhZGVyXG4gKiBzb3VyY2UgY29kZVxuICogQHJldHVybiB7cDUuU2hhZGVyfSBhIHNoYWRlciBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBwcm92aWRlZFxuICogdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgZmlsZXMuXG4gKi9cbnA1LnByb3RvdHlwZS5sb2FkU2hhZGVyID0gZnVuY3Rpb24odmVydEZpbGVuYW1lLCBmcmFnRmlsZW5hbWUpIHtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnbG9hZFNoYWRlcicsIGFyZ3VtZW50cyk7XG4gIHZhciBsb2FkZWRTaGFkZXIgPSBuZXcgcDUuU2hhZGVyKCk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbG9hZGVkRnJhZyA9IGZhbHNlO1xuICB2YXIgbG9hZGVkVmVydCA9IGZhbHNlO1xuXG4gIHRoaXMubG9hZFN0cmluZ3MoZnJhZ0ZpbGVuYW1lLCBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICBsb2FkZWRTaGFkZXIuX2ZyYWdTcmMgPSByZXN1bHQuam9pbignXFxuJyk7XG4gICAgbG9hZGVkRnJhZyA9IHRydWU7XG4gICAgaWYgKGxvYWRlZFZlcnQpIHtcbiAgICAgIHNlbGYuX2RlY3JlbWVudFByZWxvYWQoKTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLmxvYWRTdHJpbmdzKHZlcnRGaWxlbmFtZSwgZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgbG9hZGVkU2hhZGVyLl92ZXJ0U3JjID0gcmVzdWx0LmpvaW4oJ1xcbicpO1xuICAgIGxvYWRlZFZlcnQgPSB0cnVlO1xuICAgIGlmIChsb2FkZWRGcmFnKSB7XG4gICAgICBzZWxmLl9kZWNyZW1lbnRQcmVsb2FkKCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gbG9hZGVkU2hhZGVyO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGNyZWF0ZVNoYWRlclxuICogQHBhcmFtIHtTdHJpbmd9IHZlcnRTcmMgc291cmNlIGNvZGUgZm9yIHRoZSB2ZXJ0ZXggc2hhZGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gZnJhZ1NyYyBzb3VyY2UgY29kZSBmb3IgdGhlIGZyYWdtZW50IHNoYWRlclxuICogQHJldHVybnMge3A1LlNoYWRlcn0gYSBzaGFkZXIgb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgcHJvdmlkZWRcbiAqIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBtb2Rlcm5penI9J3dlYmdsJz5cbiAqIDxjb2RlPlxuICogLy8gdGhlICd2YXJ5aW5nJ3MgYXJlIHNoYXJlZCBiZXR3ZWVuIGJvdGggdmVydGV4ICYgZnJhZ21lbnQgc2hhZGVyc1xuICogdmFyIHZhcnlpbmcgPSAncHJlY2lzaW9uIGhpZ2hwIGZsb2F0OyB2YXJ5aW5nIHZlYzIgdlBvczsnO1xuICpcbiAqIC8vIHRoZSB2ZXJ0ZXggc2hhZGVyIGlzIGNhbGxlZCBmb3IgZWFjaCB2ZXJ0ZXhcbiAqIHZhciB2cyA9XG4gKiAgIHZhcnlpbmcgK1xuICogICAnYXR0cmlidXRlIHZlYzMgYVBvc2l0aW9uOycgK1xuICogICAndm9pZCBtYWluKCkgeyB2UG9zID0gKGdsX1Bvc2l0aW9uID0gdmVjNChhUG9zaXRpb24sMS4wKSkueHk7IH0nO1xuICpcbiAqIC8vIHRoZSBmcmFnbWVudCBzaGFkZXIgaXMgY2FsbGVkIGZvciBlYWNoIHBpeGVsXG4gKiB2YXIgZnMgPVxuICogICB2YXJ5aW5nICtcbiAqICAgJ3VuaWZvcm0gdmVjMiBwOycgK1xuICogICAndW5pZm9ybSBmbG9hdCByOycgK1xuICogICAnY29uc3QgaW50IEkgPSA1MDA7JyArXG4gKiAgICd2b2lkIG1haW4oKSB7JyArXG4gKiAgICcgIHZlYzIgYyA9IHAgKyB2UG9zICogciwgeiA9IGM7JyArXG4gKiAgICcgIGZsb2F0IG4gPSAwLjA7JyArXG4gKiAgICcgIGZvciAoaW50IGkgPSBJOyBpID4gMDsgaSAtLSkgeycgK1xuICogICAnICAgIGlmKHoueCp6Lngrei55KnoueSA+IDQuMCkgeycgK1xuICogICAnICAgICAgbiA9IGZsb2F0KGkpL2Zsb2F0KEkpOycgK1xuICogICAnICAgICAgYnJlYWs7JyArXG4gKiAgICcgICAgfScgK1xuICogICAnICAgIHogPSB2ZWMyKHoueCp6Lngtei55KnoueSwgMi4wKnoueCp6LnkpICsgYzsnICtcbiAqICAgJyAgfScgK1xuICogICAnICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuNS1jb3MobioxNy4wKS8yLjAsMC41LWNvcyhuKjEzLjApLzIuMCwwLjUtY29zKG4qMjMuMCkvMi4wLDEuMCk7JyArXG4gKiAgICd9JztcbiAqXG4gKiB2YXIgbWFuZGVsO1xuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICpcbiAqICAgLy8gY3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzaGFkZXJcbiAqICAgbWFuZGVsID0gY3JlYXRlU2hhZGVyKHZzLCBmcyk7XG4gKiAgIHNoYWRlcihtYW5kZWwpO1xuICogICBub1N0cm9rZSgpO1xuICpcbiAqICAgLy8gJ3AnIGlzIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIE1hbmRlbGJyb3QgaW1hZ2VcbiAqICAgbWFuZGVsLnNldFVuaWZvcm0oJ3AnLCBbLTAuNzQzNjQzODg3MDMsIDAuMTMxODI1OTA0MjFdKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICAvLyAncicgaXMgdGhlIHNpemUgb2YgdGhlIGltYWdlIGluIE1hbmRlbGJyb3Qtc3BhY2VcbiAqICAgbWFuZGVsLnNldFVuaWZvcm0oJ3InLCAxLjUgKiBleHAoLTYuNSAqICgxICsgc2luKG1pbGxpcygpIC8gMjAwMCkpKSk7XG4gKiAgIHF1YWQoLTEsIC0xLCAxLCAtMSwgMSwgMSwgLTEsIDEpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogem9vbWluZyBNYW5kZWxicm90IHNldC4gYSBjb2xvcmZ1bCwgaW5maW5pdGVseSBkZXRhaWxlZCBmcmFjdGFsLlxuICovXG5wNS5wcm90b3R5cGUuY3JlYXRlU2hhZGVyID0gZnVuY3Rpb24odmVydFNyYywgZnJhZ1NyYykge1xuICB0aGlzLl9hc3NlcnQzZCgnY3JlYXRlU2hhZGVyJyk7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ2NyZWF0ZVNoYWRlcicsIGFyZ3VtZW50cyk7XG4gIHJldHVybiBuZXcgcDUuU2hhZGVyKHRoaXMuX3JlbmRlcmVyLCB2ZXJ0U3JjLCBmcmFnU3JjKTtcbn07XG5cbi8qKlxuICogVGhlIHNoYWRlcigpIGZ1bmN0aW9uIGxldHMgdGhlIHVzZXIgcHJvdmlkZSBhIGN1c3RvbSBzaGFkZXJcbiAqIHRvIGZpbGwgaW4gc2hhcGVzIGluIFdFQkdMIG1vZGUuIFVzZXJzIGNhbiBjcmVhdGUgdGhlaXJcbiAqIG93biBzaGFkZXJzIGJ5IGxvYWRpbmcgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJzIHdpdGhcbiAqIGxvYWRTaGFkZXIoKS5cbiAqXG4gKiBAbWV0aG9kIHNoYWRlclxuICogQGNoYWluYWJsZVxuICogQHBhcmFtIHtwNS5TaGFkZXJ9IFtzXSB0aGUgZGVzaXJlZCBwNS5TaGFkZXIgdG8gdXNlIGZvciByZW5kZXJpbmdcbiAqIHNoYXBlcy5cbiAqL1xucDUucHJvdG90eXBlLnNoYWRlciA9IGZ1bmN0aW9uKHMpIHtcbiAgdGhpcy5fYXNzZXJ0M2QoJ3NoYWRlcicpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdzaGFkZXInLCBhcmd1bWVudHMpO1xuICBpZiAocy5fcmVuZGVyZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHMuX3JlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XG4gIH1cbiAgaWYgKHMuaXNTdHJva2VTaGFkZXIoKSkge1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0cm9rZVNoYWRlcihzKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRGaWxsU2hhZGVyKHMpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBOb3JtYWwgbWF0ZXJpYWwgZm9yIGdlb21ldHJ5LiBZb3UgY2FuIHZpZXcgYWxsXG4gKiBwb3NzaWJsZSBtYXRlcmlhbHMgaW4gdGhpc1xuICogPGEgaHJlZj1cImh0dHBzOi8vcDVqcy5vcmcvZXhhbXBsZXMvM2QtbWF0ZXJpYWxzLmh0bWxcIj5leGFtcGxlPC9hPi5cbiAqIEBtZXRob2Qgbm9ybWFsTWF0ZXJpYWxcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICBub3JtYWxNYXRlcmlhbCgpO1xuICogICBzcGhlcmUoNTApO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogUmVkLCBncmVlbiBhbmQgYmx1ZSBncmFkaWVudC5cbiAqXG4gKi9cbnA1LnByb3RvdHlwZS5ub3JtYWxNYXRlcmlhbCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9hc3NlcnQzZCgnbm9ybWFsTWF0ZXJpYWwnKTtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnbm9ybWFsTWF0ZXJpYWwnLCBhcmd1bWVudHMpO1xuICB0aGlzLl9yZW5kZXJlci5kcmF3TW9kZSA9IGNvbnN0YW50cy5GSUxMO1xuICB0aGlzLl9yZW5kZXJlci5zZXRGaWxsU2hhZGVyKHRoaXMuX3JlbmRlcmVyLl9nZXROb3JtYWxTaGFkZXIoKSk7XG4gIHRoaXMuX3JlbmRlcmVyLmN1ckZpbGxDb2xvciA9IFsxLCAxLCAxLCAxXTtcbiAgdGhpcy5ub1N0cm9rZSgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVGV4dHVyZSBmb3IgZ2VvbWV0cnkuICBZb3UgY2FuIHZpZXcgb3RoZXIgcG9zc2libGUgbWF0ZXJpYWxzIGluIHRoaXNcbiAqIDxhIGhyZWY9XCJodHRwczovL3A1anMub3JnL2V4YW1wbGVzLzNkLW1hdGVyaWFscy5odG1sXCI+ZXhhbXBsZTwvYT4uXG4gKiBAbWV0aG9kIHRleHR1cmVcbiAqIEBwYXJhbSB7cDUuSW1hZ2V8cDUuTWVkaWFFbGVtZW50fHA1LkdyYXBoaWNzfSB0ZXggMi1kaW1lbnNpb25hbCBncmFwaGljc1xuICogICAgICAgICAgICAgICAgICAgIHRvIHJlbmRlciBhcyB0ZXh0dXJlXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogdmFyIGltZztcbiAqIGZ1bmN0aW9uIHByZWxvYWQoKSB7XG4gKiAgIGltZyA9IGxvYWRJbWFnZSgnYXNzZXRzL2xhRGVmZW5zZS5qcGcnKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgwKTtcbiAqICAgcm90YXRlWihmcmFtZUNvdW50ICogMC4wMSk7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgLy9wYXNzIGltYWdlIGFzIHRleHR1cmVcbiAqICAgdGV4dHVyZShpbWcpO1xuICogICBib3goMjAwLCAyMDAsIDIwMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgcGc7XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiAgIHBnID0gY3JlYXRlR3JhcGhpY3MoMjAwLCAyMDApO1xuICogICBwZy50ZXh0U2l6ZSgxMDApO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMCk7XG4gKiAgIHBnLmJhY2tncm91bmQoMjU1KTtcbiAqICAgcGcudGV4dCgnaGVsbG8hJywgMCwgMTAwKTtcbiAqICAgLy9wYXNzIGltYWdlIGFzIHRleHR1cmVcbiAqICAgdGV4dHVyZShwZyk7XG4gKiAgIHBsYW5lKDIwMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiB2YXIgdmlkO1xuICogZnVuY3Rpb24gcHJlbG9hZCgpIHtcbiAqICAgdmlkID0gY3JlYXRlVmlkZW8oJ2Fzc2V0cy9maW5nZXJzLm1vdicpO1xuICogICB2aWQuaGlkZSgpO1xuICogICB2aWQubG9vcCgpO1xuICogfVxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMCk7XG4gKiAgIC8vcGFzcyB2aWRlbyBmcmFtZSBhcyB0ZXh0dXJlXG4gKiAgIHRleHR1cmUodmlkKTtcbiAqICAgcGxhbmUoMjAwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIFJvdGF0aW5nIHZpZXcgb2YgbWFueSBpbWFnZXMgdW1icmVsbGEgYW5kIGdyaWQgcm9vZiBvbiBhIDNkIHBsYW5lXG4gKiBibGFjayBjYW52YXNcbiAqIGJsYWNrIGNhbnZhc1xuICpcbiAqL1xucDUucHJvdG90eXBlLnRleHR1cmUgPSBmdW5jdGlvbih0ZXgpIHtcbiAgdGhpcy5fYXNzZXJ0M2QoJ3RleHR1cmUnKTtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygndGV4dHVyZScsIGFyZ3VtZW50cyk7XG4gIHRoaXMuX3JlbmRlcmVyLmRyYXdNb2RlID0gY29uc3RhbnRzLlRFWFRVUkU7XG4gIHZhciBzaGFkZXIgPSB0aGlzLl9yZW5kZXJlci5fdXNlTGlnaHRTaGFkZXIoKTtcbiAgc2hhZGVyLnNldFVuaWZvcm0oJ3VTcGVjdWxhcicsIGZhbHNlKTtcbiAgc2hhZGVyLnNldFVuaWZvcm0oJ2lzVGV4dHVyZScsIHRydWUpO1xuICBzaGFkZXIuc2V0VW5pZm9ybSgndVNhbXBsZXInLCB0ZXgpO1xuICB0aGlzLm5vU3Ryb2tlKCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBbWJpZW50IG1hdGVyaWFsIGZvciBnZW9tZXRyeSB3aXRoIGEgZ2l2ZW4gY29sb3IuIFlvdSBjYW4gdmlldyBhbGxcbiAqIHBvc3NpYmxlIG1hdGVyaWFscyBpbiB0aGlzXG4gKiA8YSBocmVmPVwiaHR0cHM6Ly9wNWpzLm9yZy9leGFtcGxlcy8zZC1tYXRlcmlhbHMuaHRtbFwiPmV4YW1wbGU8L2E+LlxuICogQG1ldGhvZCAgYW1iaWVudE1hdGVyaWFsXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHYxICBncmF5IHZhbHVlLCByZWQgb3IgaHVlIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAoZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbG9yIG1vZGUpLFxuICogQHBhcmFtICB7TnVtYmVyfSBbdjJdIGdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gW3YzXSBibHVlIG9yIGJyaWdodG5lc3MgdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gW2FdICBvcGFjaXR5XG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICogfVxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgwKTtcbiAqICAgYW1iaWVudExpZ2h0KDEwMCk7XG4gKiAgIHBvaW50TGlnaHQoMjUwLCAyNTAsIDI1MCwgMTAwLCAxMDAsIDApO1xuICogICBhbWJpZW50TWF0ZXJpYWwoMjUwKTtcbiAqICAgc3BoZXJlKDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIHJhZGlhdGluZyBsaWdodCBzb3VyY2UgZnJvbSB0b3AgcmlnaHQgb2YgY2FudmFzXG4gKlxuICovXG4vKipcbiAqIEBtZXRob2QgIGFtYmllbnRNYXRlcmlhbFxuICogQHBhcmFtICB7TnVtYmVyW118U3RyaW5nfHA1LkNvbG9yfSBjb2xvciAgY29sb3IsIGNvbG9yIEFycmF5LCBvciBDU1MgY29sb3Igc3RyaW5nXG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1LnByb3RvdHlwZS5hbWJpZW50TWF0ZXJpYWwgPSBmdW5jdGlvbih2MSwgdjIsIHYzLCBhKSB7XG4gIHRoaXMuX2Fzc2VydDNkKCdhbWJpZW50TWF0ZXJpYWwnKTtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnYW1iaWVudE1hdGVyaWFsJywgYXJndW1lbnRzKTtcbiAgdmFyIGNvbG9yID0gcDUucHJvdG90eXBlLmNvbG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIHRoaXMuX3JlbmRlcmVyLmN1ckZpbGxDb2xvciA9IGNvbG9yLl9hcnJheTtcblxuICB2YXIgc2hhZGVyID0gdGhpcy5fcmVuZGVyZXIuX3VzZUxpZ2h0U2hhZGVyKCk7XG4gIHNoYWRlci5zZXRVbmlmb3JtKCd1TWF0ZXJpYWxDb2xvcicsIHRoaXMuX3JlbmRlcmVyLmN1ckZpbGxDb2xvcik7XG4gIHNoYWRlci5zZXRVbmlmb3JtKCd1U3BlY3VsYXInLCBmYWxzZSk7XG4gIHNoYWRlci5zZXRVbmlmb3JtKCdpc1RleHR1cmUnLCBmYWxzZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTcGVjdWxhciBtYXRlcmlhbCBmb3IgZ2VvbWV0cnkgd2l0aCBhIGdpdmVuIGNvbG9yLiBZb3UgY2FuIHZpZXcgYWxsXG4gKiBwb3NzaWJsZSBtYXRlcmlhbHMgaW4gdGhpc1xuICogPGEgaHJlZj1cImh0dHBzOi8vcDVqcy5vcmcvZXhhbXBsZXMvM2QtbWF0ZXJpYWxzLmh0bWxcIj5leGFtcGxlPC9hPi5cbiAqIEBtZXRob2Qgc3BlY3VsYXJNYXRlcmlhbFxuICogQHBhcmFtICB7TnVtYmVyfSB2MSAgZ3JheSB2YWx1ZSwgcmVkIG9yIGh1ZSB2YWx1ZVxuICogICAgICAgICAgICAgICAgICAgICAgIChkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sb3IgbW9kZSksXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt2Ml0gZ3JlZW4gb3Igc2F0dXJhdGlvbiB2YWx1ZVxuICogQHBhcmFtICB7TnVtYmVyfSBbdjNdIGJsdWUgb3IgYnJpZ2h0bmVzcyB2YWx1ZVxuICogQHBhcmFtICB7TnVtYmVyfSBbYV0gIG9wYWNpdHlcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDApO1xuICogICBhbWJpZW50TGlnaHQoMTAwKTtcbiAqICAgcG9pbnRMaWdodCgyNTAsIDI1MCwgMjUwLCAxMDAsIDEwMCwgMCk7XG4gKiAgIHNwZWN1bGFyTWF0ZXJpYWwoMjUwKTtcbiAqICAgc3BoZXJlKDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGRpZmZ1c2VkIHJhZGlhdGluZyBsaWdodCBzb3VyY2UgZnJvbSB0b3AgcmlnaHQgb2YgY2FudmFzXG4gKlxuICovXG4vKipcbiAqIEBtZXRob2Qgc3BlY3VsYXJNYXRlcmlhbFxuICogQHBhcmFtICB7TnVtYmVyW118U3RyaW5nfHA1LkNvbG9yfSBjb2xvciBjb2xvciBBcnJheSwgb3IgQ1NTIGNvbG9yIHN0cmluZ1xuICogQGNoYWluYWJsZVxuICovXG5wNS5wcm90b3R5cGUuc3BlY3VsYXJNYXRlcmlhbCA9IGZ1bmN0aW9uKHYxLCB2MiwgdjMsIGEpIHtcbiAgdGhpcy5fYXNzZXJ0M2QoJ3NwZWN1bGFyTWF0ZXJpYWwnKTtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnc3BlY3VsYXJNYXRlcmlhbCcsIGFyZ3VtZW50cyk7XG4gIHZhciBjb2xvciA9IHA1LnByb3RvdHlwZS5jb2xvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB0aGlzLl9yZW5kZXJlci5jdXJGaWxsQ29sb3IgPSBjb2xvci5fYXJyYXk7XG5cbiAgdmFyIHNoYWRlciA9IHRoaXMuX3JlbmRlcmVyLl91c2VMaWdodFNoYWRlcigpO1xuICBzaGFkZXIuc2V0VW5pZm9ybSgndU1hdGVyaWFsQ29sb3InLCB0aGlzLl9yZW5kZXJlci5jdXJGaWxsQ29sb3IpO1xuICBzaGFkZXIuc2V0VW5pZm9ybSgndVNwZWN1bGFyJywgdHJ1ZSk7XG4gIHNoYWRlci5zZXRVbmlmb3JtKCdpc1RleHR1cmUnLCBmYWxzZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZSBibGVuZHMgY29sb3JzIGFjY29yZGluZyB0byBjb2xvciBjb21wb25lbnRzLlxuICogSWYgYWxwaGEgdmFsdWUgaXMgbGVzcyB0aGFuIDEsIHdlIG5lZWQgdG8gZW5hYmxlIGJsZW5kaW5nXG4gKiBvbiBvdXIgZ2wgY29udGV4dC4gIE90aGVyd2lzZSBvcGFxdWUgb2JqZWN0cyBuZWVkIHRvIGEgZGVwdGhNYXNrLlxuICogQHBhcmFtICB7TnVtYmVyW119IGNvbG9yIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge051bWJlcltdXX0gIE5vcm1hbGl6ZWQgbnVtYmVycyBhcnJheVxuICovXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5fYXBwbHlDb2xvckJsZW5kID0gZnVuY3Rpb24oY29sb3JzKSB7XG4gIHZhciBnbCA9IHRoaXMuR0w7XG5cbiAgdmFyIGlzVGV4dHVyZSA9IHRoaXMuZHJhd01vZGUgPT09IGNvbnN0YW50cy5URVhUVVJFO1xuICBpZiAoaXNUZXh0dXJlIHx8IGNvbG9yc1tjb2xvcnMubGVuZ3RoIC0gMV0gPCAxLjApIHtcbiAgICBnbC5kZXB0aE1hc2soaXNUZXh0dXJlKTtcbiAgICBnbC5lbmFibGUoZ2wuQkxFTkQpO1xuICAgIGdsLmJsZW5kRXF1YXRpb24oZ2wuRlVOQ19BREQpO1xuICAgIGdsLmJsZW5kRnVuYyhnbC5TUkNfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuICB9IGVsc2Uge1xuICAgIGdsLmRlcHRoTWFzayh0cnVlKTtcbiAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTtcbiAgfVxuICByZXR1cm4gY29sb3JzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNTtcblxufSx7XCIuLi9jb3JlL2NvbnN0YW50c1wiOjIxLFwiLi4vY29yZS9jb3JlXCI6MjIsXCIuL3A1LlRleHR1cmVcIjo3NH1dLDY4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vc29tZSBvZiB0aGUgZnVuY3Rpb25zIGFyZSBhZGp1c3RlZCBmcm9tIFRocmVlLmpzKGh0dHA6Ly90aHJlZWpzLm9yZylcblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuLi9jb3JlL2NvcmUnKTtcbi8qKlxuICogcDUgR2VvbWV0cnkgY2xhc3NcbiAqIEBjbGFzcyBwNS5HZW9tZXRyeVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0gIHtmdW5jdGlvbiB8IE9iamVjdH0gdmVydERhdGEgY2FsbGJhY2sgZnVuY3Rpb24gb3IgT2JqZWN0XG4gKiAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgcm91dGluZShzKSBmb3IgdmVydGV4IGRhdGEgZ2VuZXJhdGlvblxuICogQHBhcmFtICB7SW50ZWdlcn0gW2RldGFpbFhdIG51bWJlciBvZiB2ZXJ0aWNlcyBvbiBob3Jpem9udGFsIHN1cmZhY2VcbiAqIEBwYXJhbSAge0ludGVnZXJ9IFtkZXRhaWxZXSBudW1iZXIgb2YgdmVydGljZXMgb24gaG9yaXpvbnRhbCBzdXJmYWNlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIGZ1bmN0aW9uIHRvIGNhbGwgdXBvbiBvYmplY3QgaW5zdGFudGlhdGlvbi5cbiAqXG4gKi9cbnA1Lkdlb21ldHJ5ID0gZnVuY3Rpb24oZGV0YWlsWCwgZGV0YWlsWSwgY2FsbGJhY2spIHtcbiAgLy9hbiBhcnJheSBjb250YWluaW5nIGV2ZXJ5IHZlcnRleFxuICAvL0B0eXBlIFtwNS5WZWN0b3JdXG4gIHRoaXMudmVydGljZXMgPSBbXTtcblxuICAvL2FuIGFycmF5IGNvbnRhaW5pbmcgZXZlcnkgdmVydGV4IGZvciBzdHJva2UgZHJhd2luZ1xuICB0aGlzLmxpbmVWZXJ0aWNlcyA9IFtdO1xuXG4gIC8vYW4gYXJyYXkgMSBub3JtYWwgcGVyIGxpbmVWZXJ0ZXggd2l0aFxuICAvL2ZpbmFsIHBvc2l0aW9uIHJlcHJlc2VudGluZyB3aGljaCBkaXJlY3Rpb24gdG9cbiAgLy9kaXNwbGFjZSBmb3Igc3Ryb2tlV2VpZ2h0XG4gIC8vW1swLDAsLTEsMV0sIFswLDEsMCwtMV0gLi4uXTtcbiAgdGhpcy5saW5lTm9ybWFscyA9IFtdO1xuXG4gIC8vYW4gYXJyYXkgY29udGFpbmluZyAxIG5vcm1hbCBwZXIgdmVydGV4XG4gIC8vQHR5cGUgW3A1LlZlY3Rvcl1cbiAgLy9bcDUuVmVjdG9yLCBwNS5WZWN0b3IsIHA1LlZlY3RvcixwNS5WZWN0b3IsIHA1LlZlY3RvciwgcDUuVmVjdG9yLC4uLl1cbiAgdGhpcy52ZXJ0ZXhOb3JtYWxzID0gW107XG4gIC8vYW4gYXJyYXkgY29udGFpbmluZyBlYWNoIHRocmVlIHZlcnRleCBpbmRpY2VzIHRoYXQgZm9ybSBhIGZhY2VcbiAgLy9bWzAsIDEsIDJdLCBbMiwgMSwgM10sIC4uLl1cbiAgdGhpcy5mYWNlcyA9IFtdO1xuICAvL2EgMkQgYXJyYXkgY29udGFpbmluZyB1dnMgZm9yIGV2ZXJ5IHZlcnRleFxuICAvL1tbMC4wLDAuMF0sWzEuMCwwLjBdLCAuLi5dXG4gIHRoaXMudXZzID0gW107XG4gIC8vIGEgMkQgYXJyYXkgY29udGFpbmluZyBlZGdlIGNvbm5lY3Rpdml0eSBwYXR0ZXJuIGZvciBjcmVhdGUgbGluZSB2ZXJ0aWNlc1xuICAvL2Jhc2VkIG9uIGZhY2VzIGZvciBtb3N0IG9iamVjdHM7XG4gIHRoaXMuZWRnZXMgPSBbXTtcbiAgdGhpcy5kZXRhaWxYID0gZGV0YWlsWCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsWCA6IDE7XG4gIHRoaXMuZGV0YWlsWSA9IGRldGFpbFkgIT09IHVuZGVmaW5lZCA/IGRldGFpbFkgOiAxO1xuICBpZiAoY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIGNhbGxiYWNrLmNhbGwodGhpcyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIFRPRE86IGlzIHRoaXMgYSBjb25zdHJ1Y3Rvcj9cbn07XG5cbi8qKlxuICogQG1ldGhvZCBjb21wdXRlRmFjZXNcbiAqIEBjaGFpbmFibGVcbiAqL1xucDUuR2VvbWV0cnkucHJvdG90eXBlLmNvbXB1dGVGYWNlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmZhY2VzLmxlbmd0aCA9IDA7XG4gIHZhciBzbGljZUNvdW50ID0gdGhpcy5kZXRhaWxYICsgMTtcbiAgdmFyIGEsIGIsIGMsIGQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kZXRhaWxZOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuZGV0YWlsWDsgaisrKSB7XG4gICAgICBhID0gaSAqIHNsaWNlQ291bnQgKyBqOyAvLyArIG9mZnNldDtcbiAgICAgIGIgPSBpICogc2xpY2VDb3VudCArIGogKyAxOyAvLyArIG9mZnNldDtcbiAgICAgIGMgPSAoaSArIDEpICogc2xpY2VDb3VudCArIGogKyAxOyAvLyArIG9mZnNldDtcbiAgICAgIGQgPSAoaSArIDEpICogc2xpY2VDb3VudCArIGo7IC8vICsgb2Zmc2V0O1xuICAgICAgdGhpcy5mYWNlcy5wdXNoKFthLCBiLCBkXSk7XG4gICAgICB0aGlzLmZhY2VzLnB1c2goW2QsIGIsIGNdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wNS5HZW9tZXRyeS5wcm90b3R5cGUuX2dldEZhY2VOb3JtYWwgPSBmdW5jdGlvbihmYWNlSWQpIHtcbiAgLy9UaGlzIGFzc3VtZXMgdGhhdCB2QS0+dkItPnZDIGlzIGEgY291bnRlci1jbG9ja3dpc2Ugb3JkZXJpbmdcbiAgdmFyIGZhY2UgPSB0aGlzLmZhY2VzW2ZhY2VJZF07XG4gIHZhciB2QSA9IHRoaXMudmVydGljZXNbZmFjZVswXV07XG4gIHZhciB2QiA9IHRoaXMudmVydGljZXNbZmFjZVsxXV07XG4gIHZhciB2QyA9IHRoaXMudmVydGljZXNbZmFjZVsyXV07XG4gIHZhciBhYiA9IHA1LlZlY3Rvci5zdWIodkIsIHZBKTtcbiAgdmFyIGFjID0gcDUuVmVjdG9yLnN1Yih2QywgdkEpO1xuICB2YXIgbiA9IHA1LlZlY3Rvci5jcm9zcyhhYiwgYWMpO1xuICB2YXIgbG4gPSBwNS5WZWN0b3IubWFnKG4pO1xuICB2YXIgc2luQWxwaGEgPSBsbiAvIChwNS5WZWN0b3IubWFnKGFiKSAqIHA1LlZlY3Rvci5tYWcoYWMpKTtcbiAgaWYgKHNpbkFscGhhID09PSAwIHx8IGlzTmFOKHNpbkFscGhhKSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdwNS5HZW9tZXRyeS5wcm90b3R5cGUuX2dldEZhY2VOb3JtYWw6JyxcbiAgICAgICdmYWNlIGhhcyBjb2xpbmVhciBzaWRlcyBvciBhIHJlcGVhdGVkIHZlcnRleCdcbiAgICApO1xuICAgIHJldHVybiBuO1xuICB9XG4gIGlmIChzaW5BbHBoYSA+IDEpIHNpbkFscGhhID0gMTsgLy8gaGFuZGxlIGZsb2F0IHJvdW5kaW5nIGVycm9yXG4gIHJldHVybiBuLm11bHQoTWF0aC5hc2luKHNpbkFscGhhKSAvIGxuKTtcbn07XG4vKipcbiAqIGNvbXB1dGVzIHNtb290aCBub3JtYWxzIHBlciB2ZXJ0ZXggYXMgYW4gYXZlcmFnZSBvZiBlYWNoXG4gKiBmYWNlLlxuICogQG1ldGhvZCBjb21wdXRlTm9ybWFsc1xuICogQGNoYWluYWJsZVxuICovXG5wNS5HZW9tZXRyeS5wcm90b3R5cGUuY29tcHV0ZU5vcm1hbHMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHZlcnRleE5vcm1hbHMgPSB0aGlzLnZlcnRleE5vcm1hbHM7XG4gIHZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG4gIHZhciBmYWNlcyA9IHRoaXMuZmFjZXM7XG4gIHZhciBpdjtcblxuICAvLyBpbml0aWFsaXplIHRoZSB2ZXJ0ZXhOb3JtYWxzIGFycmF5IHdpdGggZW1wdHkgdmVjdG9yc1xuICB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9IDA7XG4gIGZvciAoaXYgPSAwOyBpdiA8IHZlcnRpY2VzLmxlbmd0aDsgKytpdikge1xuICAgIHZlcnRleE5vcm1hbHMucHVzaChuZXcgcDUuVmVjdG9yKCkpO1xuICB9XG5cbiAgLy8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgZmFjZXMgYWRkaW5nIGl0cyBub3JtYWwgdG8gdGhlIG5vcm1hbFxuICAvLyBvZiBlYWNoIG9mIGl0cyB2ZXJ0aWNlc1xuICBmb3IgKHZhciBmID0gMDsgZiA8IGZhY2VzLmxlbmd0aDsgKytmKSB7XG4gICAgdmFyIGZhY2UgPSBmYWNlc1tmXTtcbiAgICB2YXIgZmFjZU5vcm1hbCA9IHRoaXMuX2dldEZhY2VOb3JtYWwoZik7XG5cbiAgICAvLyBhbGwgdGhyZWUgdmVydGljZXMgZ2V0IHRoZSBub3JtYWwgYWRkZWRcbiAgICBmb3IgKHZhciBmdiA9IDA7IGZ2IDwgMzsgKytmdikge1xuICAgICAgdmFyIHZlcnRleEluZGV4ID0gZmFjZVtmdl07XG4gICAgICB2ZXJ0ZXhOb3JtYWxzW3ZlcnRleEluZGV4XS5hZGQoZmFjZU5vcm1hbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gbm9ybWFsaXplIHRoZSBub3JtYWxzXG4gIGZvciAoaXYgPSAwOyBpdiA8IHZlcnRpY2VzLmxlbmd0aDsgKytpdikge1xuICAgIHZlcnRleE5vcm1hbHNbaXZdLm5vcm1hbGl6ZSgpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEF2ZXJhZ2VzIHRoZSB2ZXJ0ZXggbm9ybWFscy4gVXNlZCBpbiBjdXJ2ZWRcbiAqIHN1cmZhY2VzXG4gKiBAbWV0aG9kIGF2ZXJhZ2VOb3JtYWxzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1Lkdlb21ldHJ5LnByb3RvdHlwZS5hdmVyYWdlTm9ybWFscyA9IGZ1bmN0aW9uKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8PSB0aGlzLmRldGFpbFk7IGkrKykge1xuICAgIHZhciBvZmZzZXQgPSB0aGlzLmRldGFpbFggKyAxO1xuICAgIHZhciB0ZW1wID0gcDUuVmVjdG9yLmFkZChcbiAgICAgIHRoaXMudmVydGV4Tm9ybWFsc1tpICogb2Zmc2V0XSxcbiAgICAgIHRoaXMudmVydGV4Tm9ybWFsc1tpICogb2Zmc2V0ICsgdGhpcy5kZXRhaWxYXVxuICAgICk7XG5cbiAgICB0ZW1wID0gcDUuVmVjdG9yLmRpdih0ZW1wLCAyKTtcbiAgICB0aGlzLnZlcnRleE5vcm1hbHNbaSAqIG9mZnNldF0gPSB0ZW1wO1xuICAgIHRoaXMudmVydGV4Tm9ybWFsc1tpICogb2Zmc2V0ICsgdGhpcy5kZXRhaWxYXSA9IHRlbXA7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEF2ZXJhZ2VzIHBvbGUgbm9ybWFscy4gIFVzZWQgaW4gc3BoZXJpY2FsIHByaW1pdGl2ZXNcbiAqIEBtZXRob2QgYXZlcmFnZVBvbGVOb3JtYWxzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1Lkdlb21ldHJ5LnByb3RvdHlwZS5hdmVyYWdlUG9sZU5vcm1hbHMgPSBmdW5jdGlvbigpIHtcbiAgLy9hdmVyYWdlIHRoZSBub3J0aCBwb2xlXG4gIHZhciBzdW0gPSBuZXcgcDUuVmVjdG9yKDAsIDAsIDApO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGV0YWlsWDsgaSsrKSB7XG4gICAgc3VtLmFkZCh0aGlzLnZlcnRleE5vcm1hbHNbaV0pO1xuICB9XG4gIHN1bSA9IHA1LlZlY3Rvci5kaXYoc3VtLCB0aGlzLmRldGFpbFgpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCB0aGlzLmRldGFpbFg7IGkrKykge1xuICAgIHRoaXMudmVydGV4Tm9ybWFsc1tpXSA9IHN1bTtcbiAgfVxuXG4gIC8vYXZlcmFnZSB0aGUgc291dGggcG9sZVxuICBzdW0gPSBuZXcgcDUuVmVjdG9yKDAsIDAsIDApO1xuICBmb3IgKFxuICAgIGkgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCAtIDE7XG4gICAgaSA+IHRoaXMudmVydGljZXMubGVuZ3RoIC0gMSAtIHRoaXMuZGV0YWlsWDtcbiAgICBpLS1cbiAgKSB7XG4gICAgc3VtLmFkZCh0aGlzLnZlcnRleE5vcm1hbHNbaV0pO1xuICB9XG4gIHN1bSA9IHA1LlZlY3Rvci5kaXYoc3VtLCB0aGlzLmRldGFpbFgpO1xuXG4gIGZvciAoXG4gICAgaSA9IHRoaXMudmVydGljZXMubGVuZ3RoIC0gMTtcbiAgICBpID4gdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSAxIC0gdGhpcy5kZXRhaWxYO1xuICAgIGktLVxuICApIHtcbiAgICB0aGlzLnZlcnRleE5vcm1hbHNbaV0gPSBzdW07XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIDJEIGFycmF5IGZvciBlc3RhYmxpc2hpbmcgc3Ryb2tlIGNvbm5lY3Rpb25zXG4gKiBAcHJpdmF0ZVxuICogQGNoYWluYWJsZVxuICovXG5wNS5HZW9tZXRyeS5wcm90b3R5cGUuX21ha2VUcmlhbmdsZUVkZ2VzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZWRnZXMubGVuZ3RoID0gMDtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zdHJva2VJbmRpY2VzKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBtYXggPSB0aGlzLnN0cm9rZUluZGljZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgIHRoaXMuZWRnZXMucHVzaCh0aGlzLnN0cm9rZUluZGljZXNbaV0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuZmFjZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHRoaXMuZWRnZXMucHVzaChbdGhpcy5mYWNlc1tqXVswXSwgdGhpcy5mYWNlc1tqXVsxXV0pO1xuICAgICAgdGhpcy5lZGdlcy5wdXNoKFt0aGlzLmZhY2VzW2pdWzFdLCB0aGlzLmZhY2VzW2pdWzJdXSk7XG4gICAgICB0aGlzLmVkZ2VzLnB1c2goW3RoaXMuZmFjZXNbal1bMl0sIHRoaXMuZmFjZXNbal1bMF1dKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENyZWF0ZSA0IHZlcnRpY2VzIGZvciBlYWNoIHN0cm9rZSBsaW5lLCB0d28gYXQgdGhlIGJlZ2lubmluZyBwb3NpdGlvblxuICogYW5kIHR3byBhdCB0aGUgZW5kIHBvc2l0aW9uLiBUaGVzZSB2ZXJ0aWNlcyBhcmUgZGlzcGxhY2VkIHJlbGF0aXZlIHRvXG4gKiB0aGF0IGxpbmUncyBub3JtYWwgb24gdGhlIEdQVVxuICogQHByaXZhdGVcbiAqIEBjaGFpbmFibGVcbiAqL1xucDUuR2VvbWV0cnkucHJvdG90eXBlLl9lZGdlc1RvVmVydGljZXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5saW5lVmVydGljZXMubGVuZ3RoID0gMDtcbiAgdGhpcy5saW5lTm9ybWFscy5sZW5ndGggPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBiZWdpbiA9IHRoaXMudmVydGljZXNbdGhpcy5lZGdlc1tpXVswXV07XG4gICAgdmFyIGVuZCA9IHRoaXMudmVydGljZXNbdGhpcy5lZGdlc1tpXVsxXV07XG4gICAgdmFyIGRpciA9IGVuZFxuICAgICAgLmNvcHkoKVxuICAgICAgLnN1YihiZWdpbilcbiAgICAgIC5ub3JtYWxpemUoKTtcbiAgICB2YXIgYSA9IGJlZ2luLmFycmF5KCk7XG4gICAgdmFyIGIgPSBiZWdpbi5hcnJheSgpO1xuICAgIHZhciBjID0gZW5kLmFycmF5KCk7XG4gICAgdmFyIGQgPSBlbmQuYXJyYXkoKTtcbiAgICB2YXIgZGlyQWRkID0gZGlyLmFycmF5KCk7XG4gICAgdmFyIGRpclN1YiA9IGRpci5hcnJheSgpO1xuICAgIC8vIGJlbG93IGlzIHVzZWQgdG8gZGlzcGxhY2UgdGhlIHBhaXIgb2YgdmVydGljZXMgYXQgYmVnaW5uaW5nIGFuZCBlbmRcbiAgICAvLyBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zXG4gICAgZGlyQWRkLnB1c2goMSk7XG4gICAgZGlyU3ViLnB1c2goLTEpO1xuICAgIHRoaXMubGluZU5vcm1hbHMucHVzaChkaXJBZGQsIGRpclN1YiwgZGlyQWRkLCBkaXJBZGQsIGRpclN1YiwgZGlyU3ViKTtcbiAgICB0aGlzLmxpbmVWZXJ0aWNlcy5wdXNoKGEsIGIsIGMsIGMsIGIsIGQpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBNb2RpZmllcyBhbGwgdmVydGljZXMgdG8gYmUgY2VudGVyZWQgd2l0aGluIHRoZSByYW5nZSAtMTAwIHRvIDEwMC5cbiAqIEBtZXRob2Qgbm9ybWFsaXplXG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1Lkdlb21ldHJ5LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMudmVydGljZXMubGVuZ3RoID4gMCkge1xuICAgIC8vIEZpbmQgdGhlIGNvcm5lcnMgb2Ygb3VyIGJvdW5kaW5nIGJveFxuICAgIHZhciBtYXhQb3NpdGlvbiA9IHRoaXMudmVydGljZXNbMF0uY29weSgpO1xuICAgIHZhciBtaW5Qb3NpdGlvbiA9IHRoaXMudmVydGljZXNbMF0uY29weSgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBtYXhQb3NpdGlvbi54ID0gTWF0aC5tYXgobWF4UG9zaXRpb24ueCwgdGhpcy52ZXJ0aWNlc1tpXS54KTtcbiAgICAgIG1pblBvc2l0aW9uLnggPSBNYXRoLm1pbihtaW5Qb3NpdGlvbi54LCB0aGlzLnZlcnRpY2VzW2ldLngpO1xuICAgICAgbWF4UG9zaXRpb24ueSA9IE1hdGgubWF4KG1heFBvc2l0aW9uLnksIHRoaXMudmVydGljZXNbaV0ueSk7XG4gICAgICBtaW5Qb3NpdGlvbi55ID0gTWF0aC5taW4obWluUG9zaXRpb24ueSwgdGhpcy52ZXJ0aWNlc1tpXS55KTtcbiAgICAgIG1heFBvc2l0aW9uLnogPSBNYXRoLm1heChtYXhQb3NpdGlvbi56LCB0aGlzLnZlcnRpY2VzW2ldLnopO1xuICAgICAgbWluUG9zaXRpb24ueiA9IE1hdGgubWluKG1pblBvc2l0aW9uLnosIHRoaXMudmVydGljZXNbaV0ueik7XG4gICAgfVxuXG4gICAgdmFyIGNlbnRlciA9IHA1LlZlY3Rvci5sZXJwKG1heFBvc2l0aW9uLCBtaW5Qb3NpdGlvbiwgMC41KTtcbiAgICB2YXIgZGlzdCA9IHA1LlZlY3Rvci5zdWIobWF4UG9zaXRpb24sIG1pblBvc2l0aW9uKTtcbiAgICB2YXIgbG9uZ2VzdERpc3QgPSBNYXRoLm1heChNYXRoLm1heChkaXN0LngsIGRpc3QueSksIGRpc3Queik7XG4gICAgdmFyIHNjYWxlID0gMjAwIC8gbG9uZ2VzdERpc3Q7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy52ZXJ0aWNlc1tpXS5zdWIoY2VudGVyKTtcbiAgICAgIHRoaXMudmVydGljZXNbaV0ubXVsdChzY2FsZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNS5HZW9tZXRyeTtcblxufSx7XCIuLi9jb3JlL2NvcmVcIjoyMn1dLDY5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQHJlcXVpcmVzIGNvbnN0YW50c1xuICogQHRvZG8gc2VlIG1ldGhvZHMgYmVsb3cgbmVlZGluZyBmdXJ0aGVyIGltcGxlbWVudGF0aW9uLlxuICogZnV0dXJlIGNvbnNpZGVyYXRpb246IGltcGxlbWVudCBTSU1EIG9wdGltaXphdGlvbnNcbiAqIHdoZW4gYnJvd3NlciBjb21wYXRpYmlsaXR5IGJlY29tZXMgYXZhaWxhYmxlXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1xuICogICBSZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU0lNRFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHA1ID0gX2RlcmVxXygnLi4vY29yZS9jb3JlJyk7XG5cbnZhciBHTE1BVF9BUlJBWV9UWVBFID0gQXJyYXk7XG52YXIgaXNNYXRyaXhBcnJheSA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggaW5zdGFuY2VvZiBBcnJheTtcbn07XG5pZiAodHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgR0xNQVRfQVJSQVlfVFlQRSA9IEZsb2F0MzJBcnJheTtcbiAgaXNNYXRyaXhBcnJheSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIEFycmF5IHx8IHggaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXk7XG4gIH07XG59XG5cbi8qKlxuICogQSBjbGFzcyB0byBkZXNjcmliZSBhIDR4NCBtYXRyaXhcbiAqIGZvciBtb2RlbCBhbmQgdmlldyBtYXRyaXggbWFuaXB1bGF0aW9uIGluIHRoZSBwNWpzIHdlYmdsIHJlbmRlcmVyLlxuICogQGNsYXNzIHA1Lk1hdHJpeFxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW21hdDRdIGFycmF5IGxpdGVyYWwgb2Ygb3VyIDR4NCBtYXRyaXhcbiAqL1xucDUuTWF0cml4ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHtcbiAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICB9XG5cbiAgLy8gVGhpcyBpcyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gb2JqZWN0XG4gIC8vIGluc3RhbnRpYXRlZCB1c2luZyBjcmVhdGVNYXRyaXgoKVxuICAvLyBAdG9kbyBpbXBsZW1lbnQgY3JlYXRlTWF0cml4KCkgaW4gY29yZS9tYXRoLmpzXG4gIGlmIChhcmdzLmxlbmd0aCAmJiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBwNSkge1xuICAgIHRoaXMucDUgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gIH1cblxuICBpZiAoYXJnc1swXSA9PT0gJ21hdDMnKSB7XG4gICAgdGhpcy5tYXQzID0gQXJyYXkuaXNBcnJheShhcmdzWzFdKVxuICAgICAgPyBhcmdzWzFdXG4gICAgICA6IG5ldyBHTE1BVF9BUlJBWV9UWVBFKFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5tYXQ0ID0gQXJyYXkuaXNBcnJheShhcmdzWzBdKVxuICAgICAgPyBhcmdzWzBdXG4gICAgICA6IG5ldyBHTE1BVF9BUlJBWV9UWVBFKFsxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxXSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHgsIHksIGFuZCB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHVzaW5nIHR3byBvciB0aHJlZSBzZXBhcmF0ZVxuICogdmFyaWFibGVzLCB0aGUgZGF0YSBmcm9tIGEgcDUuTWF0cml4LCBvciB0aGUgdmFsdWVzIGZyb20gYSBmbG9hdCBhcnJheS5cbiAqXG4gKiBAbWV0aG9kIHNldFxuICogQHBhcmFtIHtwNS5NYXRyaXh8RmxvYXQzMkFycmF5fE51bWJlcltdfSBbaW5NYXRyaXhdIHRoZSBpbnB1dCBwNS5NYXRyaXggb3JcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIEFycmF5IG9mIGxlbmd0aCAxNlxuICogQGNoYWluYWJsZVxuICovXG4vKipcbiAqIEBtZXRob2Qgc2V0XG4gKiBAcGFyYW0ge051bWJlcltdfSBlbGVtZW50cyAxNiBudW1iZXJzIHBhc3NlZCBieSB2YWx1ZSB0byBhdm9pZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgY29weWluZy5cbiAqIEBjaGFpbmFibGVcbiAqL1xucDUuTWF0cml4LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihpbk1hdHJpeCkge1xuICBpZiAoaW5NYXRyaXggaW5zdGFuY2VvZiBwNS5NYXRyaXgpIHtcbiAgICB0aGlzLm1hdDQgPSBpbk1hdHJpeC5tYXQ0O1xuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2UgaWYgKGlzTWF0cml4QXJyYXkoaW5NYXRyaXgpKSB7XG4gICAgdGhpcy5tYXQ0ID0gaW5NYXRyaXg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMTYpIHtcbiAgICB0aGlzLm1hdDRbMF0gPSBhcmd1bWVudHNbMF07XG4gICAgdGhpcy5tYXQ0WzFdID0gYXJndW1lbnRzWzFdO1xuICAgIHRoaXMubWF0NFsyXSA9IGFyZ3VtZW50c1syXTtcbiAgICB0aGlzLm1hdDRbM10gPSBhcmd1bWVudHNbM107XG4gICAgdGhpcy5tYXQ0WzRdID0gYXJndW1lbnRzWzRdO1xuICAgIHRoaXMubWF0NFs1XSA9IGFyZ3VtZW50c1s1XTtcbiAgICB0aGlzLm1hdDRbNl0gPSBhcmd1bWVudHNbNl07XG4gICAgdGhpcy5tYXQ0WzddID0gYXJndW1lbnRzWzddO1xuICAgIHRoaXMubWF0NFs4XSA9IGFyZ3VtZW50c1s4XTtcbiAgICB0aGlzLm1hdDRbOV0gPSBhcmd1bWVudHNbOV07XG4gICAgdGhpcy5tYXQ0WzEwXSA9IGFyZ3VtZW50c1sxMF07XG4gICAgdGhpcy5tYXQ0WzExXSA9IGFyZ3VtZW50c1sxMV07XG4gICAgdGhpcy5tYXQ0WzEyXSA9IGFyZ3VtZW50c1sxMl07XG4gICAgdGhpcy5tYXQ0WzEzXSA9IGFyZ3VtZW50c1sxM107XG4gICAgdGhpcy5tYXQ0WzE0XSA9IGFyZ3VtZW50c1sxNF07XG4gICAgdGhpcy5tYXQ0WzE1XSA9IGFyZ3VtZW50c1sxNV07XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEdldHMgYSBjb3B5IG9mIHRoZSB2ZWN0b3IsIHJldHVybnMgYSBwNS5NYXRyaXggb2JqZWN0LlxuICpcbiAqIEBtZXRob2QgZ2V0XG4gKiBAcmV0dXJuIHtwNS5NYXRyaXh9IHRoZSBjb3B5IG9mIHRoZSBwNS5NYXRyaXggb2JqZWN0XG4gKi9cbnA1Lk1hdHJpeC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgcDUuTWF0cml4KHRoaXMubWF0NCwgdGhpcy5wNSk7XG59O1xuXG4vKipcbiAqIHJldHVybiBhIGNvcHkgb2YgYSBtYXRyaXhcbiAqIEBtZXRob2QgY29weVxuICogQHJldHVybiB7cDUuTWF0cml4fSAgIHRoZSByZXN1bHQgbWF0cml4XG4gKi9cbnA1Lk1hdHJpeC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY29waWVkID0gbmV3IHA1Lk1hdHJpeCh0aGlzLnA1KTtcbiAgY29waWVkLm1hdDRbMF0gPSB0aGlzLm1hdDRbMF07XG4gIGNvcGllZC5tYXQ0WzFdID0gdGhpcy5tYXQ0WzFdO1xuICBjb3BpZWQubWF0NFsyXSA9IHRoaXMubWF0NFsyXTtcbiAgY29waWVkLm1hdDRbM10gPSB0aGlzLm1hdDRbM107XG4gIGNvcGllZC5tYXQ0WzRdID0gdGhpcy5tYXQ0WzRdO1xuICBjb3BpZWQubWF0NFs1XSA9IHRoaXMubWF0NFs1XTtcbiAgY29waWVkLm1hdDRbNl0gPSB0aGlzLm1hdDRbNl07XG4gIGNvcGllZC5tYXQ0WzddID0gdGhpcy5tYXQ0WzddO1xuICBjb3BpZWQubWF0NFs4XSA9IHRoaXMubWF0NFs4XTtcbiAgY29waWVkLm1hdDRbOV0gPSB0aGlzLm1hdDRbOV07XG4gIGNvcGllZC5tYXQ0WzEwXSA9IHRoaXMubWF0NFsxMF07XG4gIGNvcGllZC5tYXQ0WzExXSA9IHRoaXMubWF0NFsxMV07XG4gIGNvcGllZC5tYXQ0WzEyXSA9IHRoaXMubWF0NFsxMl07XG4gIGNvcGllZC5tYXQ0WzEzXSA9IHRoaXMubWF0NFsxM107XG4gIGNvcGllZC5tYXQ0WzE0XSA9IHRoaXMubWF0NFsxNF07XG4gIGNvcGllZC5tYXQ0WzE1XSA9IHRoaXMubWF0NFsxNV07XG4gIHJldHVybiBjb3BpZWQ7XG59O1xuXG4vKipcbiAqIHJldHVybiBhbiBpZGVudGl0eSBtYXRyaXhcbiAqIEBtZXRob2QgaWRlbnRpdHlcbiAqIEByZXR1cm4ge3A1Lk1hdHJpeH0gICB0aGUgcmVzdWx0IG1hdHJpeFxuICovXG5wNS5NYXRyaXguaWRlbnRpdHkgPSBmdW5jdGlvbihwSW5zdCkge1xuICByZXR1cm4gbmV3IHA1Lk1hdHJpeChwSW5zdCk7XG59O1xuXG4vKipcbiAqIHRyYW5zcG9zZSBhY2NvcmRpbmcgdG8gYSBnaXZlbiBtYXRyaXhcbiAqIEBtZXRob2QgdHJhbnNwb3NlXG4gKiBAcGFyYW0gIHtwNS5NYXRyaXh8RmxvYXQzMkFycmF5fE51bWJlcltdfSBhICB0aGUgbWF0cml4IHRvIGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gdG8gdHJhbnNwb3NlXG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1Lk1hdHJpeC5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb24oYSkge1xuICB2YXIgYTAxLCBhMDIsIGEwMywgYTEyLCBhMTMsIGEyMztcbiAgaWYgKGEgaW5zdGFuY2VvZiBwNS5NYXRyaXgpIHtcbiAgICBhMDEgPSBhLm1hdDRbMV07XG4gICAgYTAyID0gYS5tYXQ0WzJdO1xuICAgIGEwMyA9IGEubWF0NFszXTtcbiAgICBhMTIgPSBhLm1hdDRbNl07XG4gICAgYTEzID0gYS5tYXQ0WzddO1xuICAgIGEyMyA9IGEubWF0NFsxMV07XG5cbiAgICB0aGlzLm1hdDRbMF0gPSBhLm1hdDRbMF07XG4gICAgdGhpcy5tYXQ0WzFdID0gYS5tYXQ0WzRdO1xuICAgIHRoaXMubWF0NFsyXSA9IGEubWF0NFs4XTtcbiAgICB0aGlzLm1hdDRbM10gPSBhLm1hdDRbMTJdO1xuICAgIHRoaXMubWF0NFs0XSA9IGEwMTtcbiAgICB0aGlzLm1hdDRbNV0gPSBhLm1hdDRbNV07XG4gICAgdGhpcy5tYXQ0WzZdID0gYS5tYXQ0WzldO1xuICAgIHRoaXMubWF0NFs3XSA9IGEubWF0NFsxM107XG4gICAgdGhpcy5tYXQ0WzhdID0gYTAyO1xuICAgIHRoaXMubWF0NFs5XSA9IGExMjtcbiAgICB0aGlzLm1hdDRbMTBdID0gYS5tYXQ0WzEwXTtcbiAgICB0aGlzLm1hdDRbMTFdID0gYS5tYXQ0WzE0XTtcbiAgICB0aGlzLm1hdDRbMTJdID0gYTAzO1xuICAgIHRoaXMubWF0NFsxM10gPSBhMTM7XG4gICAgdGhpcy5tYXQ0WzE0XSA9IGEyMztcbiAgICB0aGlzLm1hdDRbMTVdID0gYS5tYXQ0WzE1XTtcbiAgfSBlbHNlIGlmIChpc01hdHJpeEFycmF5KGEpKSB7XG4gICAgYTAxID0gYVsxXTtcbiAgICBhMDIgPSBhWzJdO1xuICAgIGEwMyA9IGFbM107XG4gICAgYTEyID0gYVs2XTtcbiAgICBhMTMgPSBhWzddO1xuICAgIGEyMyA9IGFbMTFdO1xuXG4gICAgdGhpcy5tYXQ0WzBdID0gYVswXTtcbiAgICB0aGlzLm1hdDRbMV0gPSBhWzRdO1xuICAgIHRoaXMubWF0NFsyXSA9IGFbOF07XG4gICAgdGhpcy5tYXQ0WzNdID0gYVsxMl07XG4gICAgdGhpcy5tYXQ0WzRdID0gYTAxO1xuICAgIHRoaXMubWF0NFs1XSA9IGFbNV07XG4gICAgdGhpcy5tYXQ0WzZdID0gYVs5XTtcbiAgICB0aGlzLm1hdDRbN10gPSBhWzEzXTtcbiAgICB0aGlzLm1hdDRbOF0gPSBhMDI7XG4gICAgdGhpcy5tYXQ0WzldID0gYTEyO1xuICAgIHRoaXMubWF0NFsxMF0gPSBhWzEwXTtcbiAgICB0aGlzLm1hdDRbMTFdID0gYVsxNF07XG4gICAgdGhpcy5tYXQ0WzEyXSA9IGEwMztcbiAgICB0aGlzLm1hdDRbMTNdID0gYTEzO1xuICAgIHRoaXMubWF0NFsxNF0gPSBhMjM7XG4gICAgdGhpcy5tYXQ0WzE1XSA9IGFbMTVdO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBpbnZlcnQgIG1hdHJpeCBhY2NvcmRpbmcgdG8gYSBnaXZlIG1hdHJpeFxuICogQG1ldGhvZCBpbnZlcnRcbiAqIEBwYXJhbSAge3A1Lk1hdHJpeHxGbG9hdDMyQXJyYXl8TnVtYmVyW119IGEgICB0aGUgbWF0cml4IHRvIGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHRvIGludmVydFxuICogQGNoYWluYWJsZVxuICovXG5wNS5NYXRyaXgucHJvdG90eXBlLmludmVydCA9IGZ1bmN0aW9uKGEpIHtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMywgYTEwLCBhMTEsIGExMiwgYTEzO1xuICB2YXIgYTIwLCBhMjEsIGEyMiwgYTIzLCBhMzAsIGEzMSwgYTMyLCBhMzM7XG4gIGlmIChhIGluc3RhbmNlb2YgcDUuTWF0cml4KSB7XG4gICAgYTAwID0gYS5tYXQ0WzBdO1xuICAgIGEwMSA9IGEubWF0NFsxXTtcbiAgICBhMDIgPSBhLm1hdDRbMl07XG4gICAgYTAzID0gYS5tYXQ0WzNdO1xuICAgIGExMCA9IGEubWF0NFs0XTtcbiAgICBhMTEgPSBhLm1hdDRbNV07XG4gICAgYTEyID0gYS5tYXQ0WzZdO1xuICAgIGExMyA9IGEubWF0NFs3XTtcbiAgICBhMjAgPSBhLm1hdDRbOF07XG4gICAgYTIxID0gYS5tYXQ0WzldO1xuICAgIGEyMiA9IGEubWF0NFsxMF07XG4gICAgYTIzID0gYS5tYXQ0WzExXTtcbiAgICBhMzAgPSBhLm1hdDRbMTJdO1xuICAgIGEzMSA9IGEubWF0NFsxM107XG4gICAgYTMyID0gYS5tYXQ0WzE0XTtcbiAgICBhMzMgPSBhLm1hdDRbMTVdO1xuICB9IGVsc2UgaWYgKGlzTWF0cml4QXJyYXkoYSkpIHtcbiAgICBhMDAgPSBhWzBdO1xuICAgIGEwMSA9IGFbMV07XG4gICAgYTAyID0gYVsyXTtcbiAgICBhMDMgPSBhWzNdO1xuICAgIGExMCA9IGFbNF07XG4gICAgYTExID0gYVs1XTtcbiAgICBhMTIgPSBhWzZdO1xuICAgIGExMyA9IGFbN107XG4gICAgYTIwID0gYVs4XTtcbiAgICBhMjEgPSBhWzldO1xuICAgIGEyMiA9IGFbMTBdO1xuICAgIGEyMyA9IGFbMTFdO1xuICAgIGEzMCA9IGFbMTJdO1xuICAgIGEzMSA9IGFbMTNdO1xuICAgIGEzMiA9IGFbMTRdO1xuICAgIGEzMyA9IGFbMTVdO1xuICB9XG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7XG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7XG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7XG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICB2YXIgZGV0ID1cbiAgICBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBkZXQgPSAxLjAgLyBkZXQ7XG5cbiAgdGhpcy5tYXQ0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gIHRoaXMubWF0NFsxXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0O1xuICB0aGlzLm1hdDRbMl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDtcbiAgdGhpcy5tYXQ0WzNdID0gKGEyMiAqIGIwNCAtIGEyMSAqIGIwNSAtIGEyMyAqIGIwMykgKiBkZXQ7XG4gIHRoaXMubWF0NFs0XSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICB0aGlzLm1hdDRbNV0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgdGhpcy5tYXQ0WzZdID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gIHRoaXMubWF0NFs3XSA9IChhMjAgKiBiMDUgLSBhMjIgKiBiMDIgKyBhMjMgKiBiMDEpICogZGV0O1xuICB0aGlzLm1hdDRbOF0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgdGhpcy5tYXQ0WzldID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7XG4gIHRoaXMubWF0NFsxMF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgdGhpcy5tYXQ0WzExXSA9IChhMjEgKiBiMDIgLSBhMjAgKiBiMDQgLSBhMjMgKiBiMDApICogZGV0O1xuICB0aGlzLm1hdDRbMTJdID0gKGExMSAqIGIwNyAtIGExMCAqIGIwOSAtIGExMiAqIGIwNikgKiBkZXQ7XG4gIHRoaXMubWF0NFsxM10gPSAoYTAwICogYjA5IC0gYTAxICogYjA3ICsgYTAyICogYjA2KSAqIGRldDtcbiAgdGhpcy5tYXQ0WzE0XSA9IChhMzEgKiBiMDEgLSBhMzAgKiBiMDMgLSBhMzIgKiBiMDApICogZGV0O1xuICB0aGlzLm1hdDRbMTVdID0gKGEyMCAqIGIwMyAtIGEyMSAqIGIwMSArIGEyMiAqIGIwMCkgKiBkZXQ7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSAzeDMgbWF0cml4XG4gKiBAbWV0aG9kIGludmVydDN4M1xuICogQGNoYWluYWJsZVxuICovXG5wNS5NYXRyaXgucHJvdG90eXBlLmludmVydDN4MyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYTAwID0gdGhpcy5tYXQzWzBdO1xuICB2YXIgYTAxID0gdGhpcy5tYXQzWzFdO1xuICB2YXIgYTAyID0gdGhpcy5tYXQzWzJdO1xuICB2YXIgYTEwID0gdGhpcy5tYXQzWzNdO1xuICB2YXIgYTExID0gdGhpcy5tYXQzWzRdO1xuICB2YXIgYTEyID0gdGhpcy5tYXQzWzVdO1xuICB2YXIgYTIwID0gdGhpcy5tYXQzWzZdO1xuICB2YXIgYTIxID0gdGhpcy5tYXQzWzddO1xuICB2YXIgYTIyID0gdGhpcy5tYXQzWzhdO1xuICB2YXIgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxO1xuICB2YXIgYjExID0gLWEyMiAqIGExMCArIGExMiAqIGEyMDtcbiAgdmFyIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMDtcblxuICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjE7XG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICB0aGlzLm1hdDNbMF0gPSBiMDEgKiBkZXQ7XG4gIHRoaXMubWF0M1sxXSA9ICgtYTIyICogYTAxICsgYTAyICogYTIxKSAqIGRldDtcbiAgdGhpcy5tYXQzWzJdID0gKGExMiAqIGEwMSAtIGEwMiAqIGExMSkgKiBkZXQ7XG4gIHRoaXMubWF0M1szXSA9IGIxMSAqIGRldDtcbiAgdGhpcy5tYXQzWzRdID0gKGEyMiAqIGEwMCAtIGEwMiAqIGEyMCkgKiBkZXQ7XG4gIHRoaXMubWF0M1s1XSA9ICgtYTEyICogYTAwICsgYTAyICogYTEwKSAqIGRldDtcbiAgdGhpcy5tYXQzWzZdID0gYjIxICogZGV0O1xuICB0aGlzLm1hdDNbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBkZXQ7XG4gIHRoaXMubWF0M1s4XSA9IChhMTEgKiBhMDAgLSBhMDEgKiBhMTApICogZGV0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogdHJhbnNwb3NlcyBhIDN4MyBwNS5NYXRyaXggYnkgYSBtYXQzXG4gKiBAbWV0aG9kIHRyYW5zcG9zZTN4M1xuICogQHBhcmFtICB7TnVtYmVyW119IG1hdDMgMS1kaW1lbnNpb25hbCBhcnJheVxuICogQGNoYWluYWJsZVxuICovXG5wNS5NYXRyaXgucHJvdG90eXBlLnRyYW5zcG9zZTN4MyA9IGZ1bmN0aW9uKG1hdDMpIHtcbiAgdmFyIGEwMSA9IG1hdDNbMV0sXG4gICAgYTAyID0gbWF0M1syXSxcbiAgICBhMTIgPSBtYXQzWzVdO1xuICB0aGlzLm1hdDNbMV0gPSBtYXQzWzNdO1xuICB0aGlzLm1hdDNbMl0gPSBtYXQzWzZdO1xuICB0aGlzLm1hdDNbM10gPSBhMDE7XG4gIHRoaXMubWF0M1s1XSA9IG1hdDNbN107XG4gIHRoaXMubWF0M1s2XSA9IGEwMjtcbiAgdGhpcy5tYXQzWzddID0gYTEyO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogY29udmVydHMgYSA0eDQgbWF0cml4IHRvIGl0cyAzeDMgaW52ZXJzZSB0cmFuZm9ybVxuICogY29tbW9ubHkgdXNlZCBpbiBNVk1hdHJpeCB0byBOTWF0cml4IGNvbnZlcnNpb25zLlxuICogQG1ldGhvZCBpbnZlcnRUcmFuc3Bvc2VcbiAqIEBwYXJhbSAge3A1Lk1hdHJpeH0gbWF0NCB0aGUgbWF0cml4IHRvIGJlIGJhc2VkIG9uIHRvIGludmVydFxuICogQGNoYWluYWJsZVxuICogQHRvZG8gIGZpbmlzaCBpbXBsZW1lbnRhdGlvblxuICovXG5wNS5NYXRyaXgucHJvdG90eXBlLmludmVyc2VUcmFuc3Bvc2UgPSBmdW5jdGlvbihtYXRyaXgpIHtcbiAgaWYgKHRoaXMubWF0MyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5lcnJvcignc29ycnksIHRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIG1hdDMnKTtcbiAgfSBlbHNlIHtcbiAgICAvL2NvbnZlcnQgbWF0NCAtPiBtYXQzXG4gICAgdGhpcy5tYXQzWzBdID0gbWF0cml4Lm1hdDRbMF07XG4gICAgdGhpcy5tYXQzWzFdID0gbWF0cml4Lm1hdDRbMV07XG4gICAgdGhpcy5tYXQzWzJdID0gbWF0cml4Lm1hdDRbMl07XG4gICAgdGhpcy5tYXQzWzNdID0gbWF0cml4Lm1hdDRbNF07XG4gICAgdGhpcy5tYXQzWzRdID0gbWF0cml4Lm1hdDRbNV07XG4gICAgdGhpcy5tYXQzWzVdID0gbWF0cml4Lm1hdDRbNl07XG4gICAgdGhpcy5tYXQzWzZdID0gbWF0cml4Lm1hdDRbOF07XG4gICAgdGhpcy5tYXQzWzddID0gbWF0cml4Lm1hdDRbOV07XG4gICAgdGhpcy5tYXQzWzhdID0gbWF0cml4Lm1hdDRbMTBdO1xuICB9XG5cbiAgdmFyIGludmVyc2UgPSB0aGlzLmludmVydDN4MygpO1xuICAvLyBjaGVjayBpbnZlcnNlIHN1Y2NlZGVkXG4gIGlmIChpbnZlcnNlKSB7XG4gICAgaW52ZXJzZS50cmFuc3Bvc2UzeDModGhpcy5tYXQzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpbiBjYXNlIG9mIHNpbmd1bGFyaXR5LCBqdXN0IHplcm8gdGhlIG1hdHJpeFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgOTsgaSsrKSB7XG4gICAgICB0aGlzLm1hdDNbaV0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogaW5zcGlyZWQgYnkgVG9qaSdzIG1hdDQgZGV0ZXJtaW5hbnRcbiAqIEBtZXRob2QgZGV0ZXJtaW5hbnRcbiAqIEByZXR1cm4ge051bWJlcn0gRGV0ZXJtaW5hbnQgb2Ygb3VyIDR4NCBtYXRyaXhcbiAqL1xucDUuTWF0cml4LnByb3RvdHlwZS5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZDAwID0gdGhpcy5tYXQ0WzBdICogdGhpcy5tYXQ0WzVdIC0gdGhpcy5tYXQ0WzFdICogdGhpcy5tYXQ0WzRdLFxuICAgIGQwMSA9IHRoaXMubWF0NFswXSAqIHRoaXMubWF0NFs2XSAtIHRoaXMubWF0NFsyXSAqIHRoaXMubWF0NFs0XSxcbiAgICBkMDIgPSB0aGlzLm1hdDRbMF0gKiB0aGlzLm1hdDRbN10gLSB0aGlzLm1hdDRbM10gKiB0aGlzLm1hdDRbNF0sXG4gICAgZDAzID0gdGhpcy5tYXQ0WzFdICogdGhpcy5tYXQ0WzZdIC0gdGhpcy5tYXQ0WzJdICogdGhpcy5tYXQ0WzVdLFxuICAgIGQwNCA9IHRoaXMubWF0NFsxXSAqIHRoaXMubWF0NFs3XSAtIHRoaXMubWF0NFszXSAqIHRoaXMubWF0NFs1XSxcbiAgICBkMDUgPSB0aGlzLm1hdDRbMl0gKiB0aGlzLm1hdDRbN10gLSB0aGlzLm1hdDRbM10gKiB0aGlzLm1hdDRbNl0sXG4gICAgZDA2ID0gdGhpcy5tYXQ0WzhdICogdGhpcy5tYXQ0WzEzXSAtIHRoaXMubWF0NFs5XSAqIHRoaXMubWF0NFsxMl0sXG4gICAgZDA3ID0gdGhpcy5tYXQ0WzhdICogdGhpcy5tYXQ0WzE0XSAtIHRoaXMubWF0NFsxMF0gKiB0aGlzLm1hdDRbMTJdLFxuICAgIGQwOCA9IHRoaXMubWF0NFs4XSAqIHRoaXMubWF0NFsxNV0gLSB0aGlzLm1hdDRbMTFdICogdGhpcy5tYXQ0WzEyXSxcbiAgICBkMDkgPSB0aGlzLm1hdDRbOV0gKiB0aGlzLm1hdDRbMTRdIC0gdGhpcy5tYXQ0WzEwXSAqIHRoaXMubWF0NFsxM10sXG4gICAgZDEwID0gdGhpcy5tYXQ0WzldICogdGhpcy5tYXQ0WzE1XSAtIHRoaXMubWF0NFsxMV0gKiB0aGlzLm1hdDRbMTNdLFxuICAgIGQxMSA9IHRoaXMubWF0NFsxMF0gKiB0aGlzLm1hdDRbMTVdIC0gdGhpcy5tYXQ0WzExXSAqIHRoaXMubWF0NFsxNF07XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICByZXR1cm4gZDAwICogZDExIC0gZDAxICogZDEwICsgZDAyICogZDA5ICsgZDAzICogZDA4IC0gZDA0ICogZDA3ICsgZDA1ICogZDA2O1xufTtcblxuLyoqXG4gKiBtdWx0aXBseSB0d28gbWF0NHNcbiAqIEBtZXRob2QgbXVsdFxuICogQHBhcmFtIHtwNS5NYXRyaXh8RmxvYXQzMkFycmF5fE51bWJlcltdfSBtdWx0TWF0cml4IFRoZSBtYXRyaXhcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Ugd2FudCB0byBtdWx0aXBseSBieVxuICogQGNoYWluYWJsZVxuICovXG5wNS5NYXRyaXgucHJvdG90eXBlLm11bHQgPSBmdW5jdGlvbihtdWx0TWF0cml4KSB7XG4gIHZhciBfc3JjO1xuXG4gIGlmIChtdWx0TWF0cml4ID09PSB0aGlzIHx8IG11bHRNYXRyaXggPT09IHRoaXMubWF0NCkge1xuICAgIF9zcmMgPSB0aGlzLmNvcHkoKS5tYXQ0OyAvLyBvbmx5IG5lZWQgdG8gYWxsb2NhdGUgaW4gdGhpcyByYXJlIGNhc2VcbiAgfSBlbHNlIGlmIChtdWx0TWF0cml4IGluc3RhbmNlb2YgcDUuTWF0cml4KSB7XG4gICAgX3NyYyA9IG11bHRNYXRyaXgubWF0NDtcbiAgfSBlbHNlIGlmIChpc01hdHJpeEFycmF5KG11bHRNYXRyaXgpKSB7XG4gICAgX3NyYyA9IG11bHRNYXRyaXg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvLlxuICB9XG5cbiAgLy8gZWFjaCByb3cgaXMgdXNlZCBmb3IgdGhlIG11bHRpcGxpZXJcbiAgdmFyIGIwID0gdGhpcy5tYXQ0WzBdLFxuICAgIGIxID0gdGhpcy5tYXQ0WzFdLFxuICAgIGIyID0gdGhpcy5tYXQ0WzJdLFxuICAgIGIzID0gdGhpcy5tYXQ0WzNdO1xuICB0aGlzLm1hdDRbMF0gPSBiMCAqIF9zcmNbMF0gKyBiMSAqIF9zcmNbNF0gKyBiMiAqIF9zcmNbOF0gKyBiMyAqIF9zcmNbMTJdO1xuICB0aGlzLm1hdDRbMV0gPSBiMCAqIF9zcmNbMV0gKyBiMSAqIF9zcmNbNV0gKyBiMiAqIF9zcmNbOV0gKyBiMyAqIF9zcmNbMTNdO1xuICB0aGlzLm1hdDRbMl0gPSBiMCAqIF9zcmNbMl0gKyBiMSAqIF9zcmNbNl0gKyBiMiAqIF9zcmNbMTBdICsgYjMgKiBfc3JjWzE0XTtcbiAgdGhpcy5tYXQ0WzNdID0gYjAgKiBfc3JjWzNdICsgYjEgKiBfc3JjWzddICsgYjIgKiBfc3JjWzExXSArIGIzICogX3NyY1sxNV07XG5cbiAgYjAgPSB0aGlzLm1hdDRbNF07XG4gIGIxID0gdGhpcy5tYXQ0WzVdO1xuICBiMiA9IHRoaXMubWF0NFs2XTtcbiAgYjMgPSB0aGlzLm1hdDRbN107XG4gIHRoaXMubWF0NFs0XSA9IGIwICogX3NyY1swXSArIGIxICogX3NyY1s0XSArIGIyICogX3NyY1s4XSArIGIzICogX3NyY1sxMl07XG4gIHRoaXMubWF0NFs1XSA9IGIwICogX3NyY1sxXSArIGIxICogX3NyY1s1XSArIGIyICogX3NyY1s5XSArIGIzICogX3NyY1sxM107XG4gIHRoaXMubWF0NFs2XSA9IGIwICogX3NyY1syXSArIGIxICogX3NyY1s2XSArIGIyICogX3NyY1sxMF0gKyBiMyAqIF9zcmNbMTRdO1xuICB0aGlzLm1hdDRbN10gPSBiMCAqIF9zcmNbM10gKyBiMSAqIF9zcmNbN10gKyBiMiAqIF9zcmNbMTFdICsgYjMgKiBfc3JjWzE1XTtcblxuICBiMCA9IHRoaXMubWF0NFs4XTtcbiAgYjEgPSB0aGlzLm1hdDRbOV07XG4gIGIyID0gdGhpcy5tYXQ0WzEwXTtcbiAgYjMgPSB0aGlzLm1hdDRbMTFdO1xuICB0aGlzLm1hdDRbOF0gPSBiMCAqIF9zcmNbMF0gKyBiMSAqIF9zcmNbNF0gKyBiMiAqIF9zcmNbOF0gKyBiMyAqIF9zcmNbMTJdO1xuICB0aGlzLm1hdDRbOV0gPSBiMCAqIF9zcmNbMV0gKyBiMSAqIF9zcmNbNV0gKyBiMiAqIF9zcmNbOV0gKyBiMyAqIF9zcmNbMTNdO1xuICB0aGlzLm1hdDRbMTBdID0gYjAgKiBfc3JjWzJdICsgYjEgKiBfc3JjWzZdICsgYjIgKiBfc3JjWzEwXSArIGIzICogX3NyY1sxNF07XG4gIHRoaXMubWF0NFsxMV0gPSBiMCAqIF9zcmNbM10gKyBiMSAqIF9zcmNbN10gKyBiMiAqIF9zcmNbMTFdICsgYjMgKiBfc3JjWzE1XTtcblxuICBiMCA9IHRoaXMubWF0NFsxMl07XG4gIGIxID0gdGhpcy5tYXQ0WzEzXTtcbiAgYjIgPSB0aGlzLm1hdDRbMTRdO1xuICBiMyA9IHRoaXMubWF0NFsxNV07XG4gIHRoaXMubWF0NFsxMl0gPSBiMCAqIF9zcmNbMF0gKyBiMSAqIF9zcmNbNF0gKyBiMiAqIF9zcmNbOF0gKyBiMyAqIF9zcmNbMTJdO1xuICB0aGlzLm1hdDRbMTNdID0gYjAgKiBfc3JjWzFdICsgYjEgKiBfc3JjWzVdICsgYjIgKiBfc3JjWzldICsgYjMgKiBfc3JjWzEzXTtcbiAgdGhpcy5tYXQ0WzE0XSA9IGIwICogX3NyY1syXSArIGIxICogX3NyY1s2XSArIGIyICogX3NyY1sxMF0gKyBiMyAqIF9zcmNbMTRdO1xuICB0aGlzLm1hdDRbMTVdID0gYjAgKiBfc3JjWzNdICsgYjEgKiBfc3JjWzddICsgYjIgKiBfc3JjWzExXSArIGIzICogX3NyY1sxNV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIHNjYWxlcyBhIHA1Lk1hdHJpeCBieSBzY2FsYXJzIG9yIGEgdmVjdG9yXG4gKiBAbWV0aG9kIHNjYWxlXG4gKiBAcGFyYW0gIHtwNS5WZWN0b3J8RmxvYXQzMkFycmF5fE51bWJlcltdfSBzIHZlY3RvciB0byBzY2FsZSBieVxuICogQGNoYWluYWJsZVxuICovXG5wNS5NYXRyaXgucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICBpZiAoeCBpbnN0YW5jZW9mIHA1LlZlY3Rvcikge1xuICAgIC8vIHggaXMgYSB2ZWN0b3IsIGV4dHJhY3QgdGhlIGNvbXBvbmVudHMgZnJvbSBpdC5cbiAgICB5ID0geC55O1xuICAgIHogPSB4Lno7XG4gICAgeCA9IHgueDsgLy8gbXVzdCBiZSBsYXN0XG4gIH0gZWxzZSBpZiAoeCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgLy8geCBpcyBhbiBhcnJheSwgZXh0cmFjdCB0aGUgY29tcG9uZW50cyBmcm9tIGl0LlxuICAgIHkgPSB4WzFdO1xuICAgIHogPSB4WzJdO1xuICAgIHggPSB4WzBdOyAvLyBtdXN0IGJlIGxhc3RcbiAgfVxuXG4gIHRoaXMubWF0NFswXSAqPSB4O1xuICB0aGlzLm1hdDRbMV0gKj0geDtcbiAgdGhpcy5tYXQ0WzJdICo9IHg7XG4gIHRoaXMubWF0NFszXSAqPSB4O1xuICB0aGlzLm1hdDRbNF0gKj0geTtcbiAgdGhpcy5tYXQ0WzVdICo9IHk7XG4gIHRoaXMubWF0NFs2XSAqPSB5O1xuICB0aGlzLm1hdDRbN10gKj0geTtcbiAgdGhpcy5tYXQ0WzhdICo9IHo7XG4gIHRoaXMubWF0NFs5XSAqPSB6O1xuICB0aGlzLm1hdDRbMTBdICo9IHo7XG4gIHRoaXMubWF0NFsxMV0gKj0gejtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogcm90YXRlIG91ciBNYXRyaXggYXJvdW5kIGFuIGF4aXMgYnkgdGhlIGdpdmVuIGFuZ2xlLlxuICogQG1ldGhvZCByb3RhdGVcbiAqIEBwYXJhbSAge051bWJlcn0gYSBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHBhcmFtICB7cDUuVmVjdG9yfE51bWJlcltdfSBheGlzICB0aGUgYXhpcyhlcykgdG8gcm90YXRlIGFyb3VuZFxuICogQGNoYWluYWJsZVxuICogaW5zcGlyZWQgYnkgVG9qaSdzIGdsLW1hdHJpeCBsaWIsIG1hdDQgcm90YXRpb25cbiAqL1xucDUuTWF0cml4LnByb3RvdHlwZS5yb3RhdGUgPSBmdW5jdGlvbihhLCB4LCB5LCB6KSB7XG4gIHZhciBfYSA9IHRoaXMucDUgPyB0aGlzLnA1Ll90b1JhZGlhbnMoYSkgOiBhO1xuXG4gIGlmICh4IGluc3RhbmNlb2YgcDUuVmVjdG9yKSB7XG4gICAgLy8geCBpcyBhIHZlY3RvciwgZXh0cmFjdCB0aGUgY29tcG9uZW50cyBmcm9tIGl0LlxuICAgIHkgPSB4Lnk7XG4gICAgeiA9IHguejtcbiAgICB4ID0geC54OyAvL211c3QgYmUgbGFzdFxuICB9IGVsc2UgaWYgKHggaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIC8vIHggaXMgYW4gYXJyYXksIGV4dHJhY3QgdGhlIGNvbXBvbmVudHMgZnJvbSBpdC5cbiAgICB5ID0geFsxXTtcbiAgICB6ID0geFsyXTtcbiAgICB4ID0geFswXTsgLy9tdXN0IGJlIGxhc3RcbiAgfVxuXG4gIHZhciBsZW4gPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTtcbiAgeCAqPSAxIC8gbGVuO1xuICB5ICo9IDEgLyBsZW47XG4gIHogKj0gMSAvIGxlbjtcblxuICB2YXIgYTAwID0gdGhpcy5tYXQ0WzBdO1xuICB2YXIgYTAxID0gdGhpcy5tYXQ0WzFdO1xuICB2YXIgYTAyID0gdGhpcy5tYXQ0WzJdO1xuICB2YXIgYTAzID0gdGhpcy5tYXQ0WzNdO1xuICB2YXIgYTEwID0gdGhpcy5tYXQ0WzRdO1xuICB2YXIgYTExID0gdGhpcy5tYXQ0WzVdO1xuICB2YXIgYTEyID0gdGhpcy5tYXQ0WzZdO1xuICB2YXIgYTEzID0gdGhpcy5tYXQ0WzddO1xuICB2YXIgYTIwID0gdGhpcy5tYXQ0WzhdO1xuICB2YXIgYTIxID0gdGhpcy5tYXQ0WzldO1xuICB2YXIgYTIyID0gdGhpcy5tYXQ0WzEwXTtcbiAgdmFyIGEyMyA9IHRoaXMubWF0NFsxMV07XG5cbiAgLy9zaW4sY29zLCBhbmQgdGFuIG9mIHJlc3BlY3RpdmUgYW5nbGVcbiAgdmFyIHNBID0gTWF0aC5zaW4oX2EpO1xuICB2YXIgY0EgPSBNYXRoLmNvcyhfYSk7XG4gIHZhciB0QSA9IDEgLSBjQTtcbiAgLy8gQ29uc3RydWN0IHRoZSBlbGVtZW50cyBvZiB0aGUgcm90YXRpb24gbWF0cml4XG4gIHZhciBiMDAgPSB4ICogeCAqIHRBICsgY0E7XG4gIHZhciBiMDEgPSB5ICogeCAqIHRBICsgeiAqIHNBO1xuICB2YXIgYjAyID0geiAqIHggKiB0QSAtIHkgKiBzQTtcbiAgdmFyIGIxMCA9IHggKiB5ICogdEEgLSB6ICogc0E7XG4gIHZhciBiMTEgPSB5ICogeSAqIHRBICsgY0E7XG4gIHZhciBiMTIgPSB6ICogeSAqIHRBICsgeCAqIHNBO1xuICB2YXIgYjIwID0geCAqIHogKiB0QSArIHkgKiBzQTtcbiAgdmFyIGIyMSA9IHkgKiB6ICogdEEgLSB4ICogc0E7XG4gIHZhciBiMjIgPSB6ICogeiAqIHRBICsgY0E7XG5cbiAgLy8gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gIHRoaXMubWF0NFswXSA9IGEwMCAqIGIwMCArIGExMCAqIGIwMSArIGEyMCAqIGIwMjtcbiAgdGhpcy5tYXQ0WzFdID0gYTAxICogYjAwICsgYTExICogYjAxICsgYTIxICogYjAyO1xuICB0aGlzLm1hdDRbMl0gPSBhMDIgKiBiMDAgKyBhMTIgKiBiMDEgKyBhMjIgKiBiMDI7XG4gIHRoaXMubWF0NFszXSA9IGEwMyAqIGIwMCArIGExMyAqIGIwMSArIGEyMyAqIGIwMjtcbiAgdGhpcy5tYXQ0WzRdID0gYTAwICogYjEwICsgYTEwICogYjExICsgYTIwICogYjEyO1xuICB0aGlzLm1hdDRbNV0gPSBhMDEgKiBiMTAgKyBhMTEgKiBiMTEgKyBhMjEgKiBiMTI7XG4gIHRoaXMubWF0NFs2XSA9IGEwMiAqIGIxMCArIGExMiAqIGIxMSArIGEyMiAqIGIxMjtcbiAgdGhpcy5tYXQ0WzddID0gYTAzICogYjEwICsgYTEzICogYjExICsgYTIzICogYjEyO1xuICB0aGlzLm1hdDRbOF0gPSBhMDAgKiBiMjAgKyBhMTAgKiBiMjEgKyBhMjAgKiBiMjI7XG4gIHRoaXMubWF0NFs5XSA9IGEwMSAqIGIyMCArIGExMSAqIGIyMSArIGEyMSAqIGIyMjtcbiAgdGhpcy5tYXQ0WzEwXSA9IGEwMiAqIGIyMCArIGExMiAqIGIyMSArIGEyMiAqIGIyMjtcbiAgdGhpcy5tYXQ0WzExXSA9IGEwMyAqIGIyMCArIGExMyAqIGIyMSArIGEyMyAqIGIyMjtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQHRvZG8gIGZpbmlzaCBpbXBsZW1lbnRpbmcgdGhpcyBtZXRob2QhXG4gKiB0cmFuc2xhdGVzXG4gKiBAbWV0aG9kIHRyYW5zbGF0ZVxuICogQHBhcmFtICB7TnVtYmVyW119IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQGNoYWluYWJsZVxuICovXG5wNS5NYXRyaXgucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgIHkgPSB2WzFdLFxuICAgIHogPSB2WzJdIHx8IDA7XG4gIHRoaXMubWF0NFsxMl0gKz0gdGhpcy5tYXQ0WzBdICogeCArIHRoaXMubWF0NFs0XSAqIHkgKyB0aGlzLm1hdDRbOF0gKiB6O1xuICB0aGlzLm1hdDRbMTNdICs9IHRoaXMubWF0NFsxXSAqIHggKyB0aGlzLm1hdDRbNV0gKiB5ICsgdGhpcy5tYXQ0WzldICogejtcbiAgdGhpcy5tYXQ0WzE0XSArPSB0aGlzLm1hdDRbMl0gKiB4ICsgdGhpcy5tYXQ0WzZdICogeSArIHRoaXMubWF0NFsxMF0gKiB6O1xuICB0aGlzLm1hdDRbMTVdICs9IHRoaXMubWF0NFszXSAqIHggKyB0aGlzLm1hdDRbN10gKiB5ICsgdGhpcy5tYXQ0WzExXSAqIHo7XG59O1xuXG5wNS5NYXRyaXgucHJvdG90eXBlLnJvdGF0ZVggPSBmdW5jdGlvbihhKSB7XG4gIHRoaXMucm90YXRlKGEsIDEsIDAsIDApO1xufTtcbnA1Lk1hdHJpeC5wcm90b3R5cGUucm90YXRlWSA9IGZ1bmN0aW9uKGEpIHtcbiAgdGhpcy5yb3RhdGUoYSwgMCwgMSwgMCk7XG59O1xucDUuTWF0cml4LnByb3RvdHlwZS5yb3RhdGVaID0gZnVuY3Rpb24oYSkge1xuICB0aGlzLnJvdGF0ZShhLCAwLCAwLCAxKTtcbn07XG5cbi8qKlxuICogc2V0cyB0aGUgcGVyc3BlY3RpdmUgbWF0cml4XG4gKiBAbWV0aG9kIHBlcnNwZWN0aXZlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGZvdnkgICBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGFzcGVjdCBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IG5lYXIgICBuZWFyIGNsaXBwaW5nIHBsYW5lXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGZhciAgICBmYXIgY2xpcHBpbmcgcGxhbmVcbiAqIEBjaGFpbmFibGVcbiAqL1xucDUuTWF0cml4LnByb3RvdHlwZS5wZXJzcGVjdGl2ZSA9IGZ1bmN0aW9uKGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcblxuICB0aGlzLm1hdDRbMF0gPSBmIC8gYXNwZWN0O1xuICB0aGlzLm1hdDRbMV0gPSAwO1xuICB0aGlzLm1hdDRbMl0gPSAwO1xuICB0aGlzLm1hdDRbM10gPSAwO1xuICB0aGlzLm1hdDRbNF0gPSAwO1xuICB0aGlzLm1hdDRbNV0gPSBmO1xuICB0aGlzLm1hdDRbNl0gPSAwO1xuICB0aGlzLm1hdDRbN10gPSAwO1xuICB0aGlzLm1hdDRbOF0gPSAwO1xuICB0aGlzLm1hdDRbOV0gPSAwO1xuICB0aGlzLm1hdDRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gIHRoaXMubWF0NFsxMV0gPSAtMTtcbiAgdGhpcy5tYXQ0WzEyXSA9IDA7XG4gIHRoaXMubWF0NFsxM10gPSAwO1xuICB0aGlzLm1hdDRbMTRdID0gMiAqIGZhciAqIG5lYXIgKiBuZjtcbiAgdGhpcy5tYXQ0WzE1XSA9IDA7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIHNldHMgdGhlIG9ydGhvIG1hdHJpeFxuICogQG1ldGhvZCBvcnRob1xuICogQHBhcmFtICB7TnVtYmVyfSBsZWZ0ICAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7TnVtYmVyfSByaWdodCAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7TnVtYmVyfSBib3R0b20gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7TnVtYmVyfSB0b3AgICAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7TnVtYmVyfSBuZWFyICAgbmVhciBjbGlwcGluZyBwbGFuZVxuICogQHBhcmFtICB7TnVtYmVyfSBmYXIgICAgZmFyIGNsaXBwaW5nIHBsYW5lXG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1Lk1hdHJpeC5wcm90b3R5cGUub3J0aG8gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICB2YXIgbHIgPSAxIC8gKGxlZnQgLSByaWdodCksXG4gICAgYnQgPSAxIC8gKGJvdHRvbSAtIHRvcCksXG4gICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICB0aGlzLm1hdDRbMF0gPSAtMiAqIGxyO1xuICB0aGlzLm1hdDRbMV0gPSAwO1xuICB0aGlzLm1hdDRbMl0gPSAwO1xuICB0aGlzLm1hdDRbM10gPSAwO1xuICB0aGlzLm1hdDRbNF0gPSAwO1xuICB0aGlzLm1hdDRbNV0gPSAtMiAqIGJ0O1xuICB0aGlzLm1hdDRbNl0gPSAwO1xuICB0aGlzLm1hdDRbN10gPSAwO1xuICB0aGlzLm1hdDRbOF0gPSAwO1xuICB0aGlzLm1hdDRbOV0gPSAwO1xuICB0aGlzLm1hdDRbMTBdID0gMiAqIG5mO1xuICB0aGlzLm1hdDRbMTFdID0gMDtcbiAgdGhpcy5tYXQ0WzEyXSA9IChsZWZ0ICsgcmlnaHQpICogbHI7XG4gIHRoaXMubWF0NFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0O1xuICB0aGlzLm1hdDRbMTRdID0gKGZhciArIG5lYXIpICogbmY7XG4gIHRoaXMubWF0NFsxNV0gPSAxO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQUklWQVRFXG4gKi9cbi8vIG1hdHJpeCBtZXRob2RzIGFkYXB0ZWQgZnJvbTpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1dlYkdML1xuLy8gZ2x1UGVyc3BlY3RpdmVcbi8vXG4vLyBmdW5jdGlvbiBfbWFrZVBlcnNwZWN0aXZlKGZvdnksIGFzcGVjdCwgem5lYXIsIHpmYXIpe1xuLy8gICAgdmFyIHltYXggPSB6bmVhciAqIE1hdGgudGFuKGZvdnkgKiBNYXRoLlBJIC8gMzYwLjApO1xuLy8gICAgdmFyIHltaW4gPSAteW1heDtcbi8vICAgIHZhciB4bWluID0geW1pbiAqIGFzcGVjdDtcbi8vICAgIHZhciB4bWF4ID0geW1heCAqIGFzcGVjdDtcbi8vICAgIHJldHVybiBfbWFrZUZydXN0dW0oeG1pbiwgeG1heCwgeW1pbiwgeW1heCwgem5lYXIsIHpmYXIpO1xuLy8gIH1cblxuLy8vL1xuLy8vLyBnbEZydXN0dW1cbi8vLy9cbi8vZnVuY3Rpb24gX21ha2VGcnVzdHVtKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgem5lYXIsIHpmYXIpe1xuLy8gIHZhciBYID0gMip6bmVhci8ocmlnaHQtbGVmdCk7XG4vLyAgdmFyIFkgPSAyKnpuZWFyLyh0b3AtYm90dG9tKTtcbi8vICB2YXIgQSA9IChyaWdodCtsZWZ0KS8ocmlnaHQtbGVmdCk7XG4vLyAgdmFyIEIgPSAodG9wK2JvdHRvbSkvKHRvcC1ib3R0b20pO1xuLy8gIHZhciBDID0gLSh6ZmFyK3puZWFyKS8oemZhci16bmVhcik7XG4vLyAgdmFyIEQgPSAtMip6ZmFyKnpuZWFyLyh6ZmFyLXpuZWFyKTtcbi8vICB2YXIgZnJ1c3RydW1NYXRyaXggPVtcbi8vICBYLCAwLCBBLCAwLFxuLy8gIDAsIFksIEIsIDAsXG4vLyAgMCwgMCwgQywgRCxcbi8vICAwLCAwLCAtMSwgMFxuLy9dO1xuLy9yZXR1cm4gZnJ1c3RydW1NYXRyaXg7XG4vLyB9XG5cbi8vIGZ1bmN0aW9uIF9zZXRNVlBNYXRyaWNlcygpe1xuLy8vL2FuIGlkZW50aXR5IG1hdHJpeFxuLy8vL0BUT0RPIHVzZSB0aGUgcDUuTWF0cml4IGNsYXNzIHRvIGFic3RyYWN0IGF3YXkgb3VyIE1WIG1hdHJpY2VzIGFuZFxuLy8vb3RoZXIgbWF0aFxuLy92YXIgX212TWF0cml4ID1cbi8vW1xuLy8gIDEuMCwwLjAsMC4wLDAuMCxcbi8vICAwLjAsMS4wLDAuMCwwLjAsXG4vLyAgMC4wLDAuMCwxLjAsMC4wLFxuLy8gIDAuMCwwLjAsMC4wLDEuMFxuLy9dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1Lk1hdHJpeDtcblxufSx7XCIuLi9jb3JlL2NvcmVcIjoyMn1dLDcwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogV2VsY29tZSB0byBSZW5kZXJlckdMIEltbWVkaWF0ZSBNb2RlLlxuICogSW1tZWRpYXRlIG1vZGUgaXMgdXNlZCBmb3IgZHJhd2luZyBjdXN0b20gc2hhcGVzXG4gKiBmcm9tIGEgc2V0IG9mIHZlcnRpY2VzLiAgSW1tZWRpYXRlIE1vZGUgaXMgYWN0aXZhdGVkXG4gKiB3aGVuIHlvdSBjYWxsIGJlZ2luU2hhcGUoKSAmIGRlLWFjdGl2YXRlZCB3aGVuIHlvdSBjYWxsIGVuZFNoYXBlKCkuXG4gKiBJbW1lZGlhdGUgbW9kZSBpcyBhIHN0eWxlIG9mIHByb2dyYW1taW5nIGJvcnJvd2VkXG4gKiBmcm9tIE9wZW5HTCdzIChub3ctZGVwcmVjYXRlZCkgaW1tZWRpYXRlIG1vZGUuXG4gKiBJdCBkaWZmZXJzIGZyb20gcDUuanMnIGRlZmF1bHQsIFJldGFpbmVkIE1vZGUsIHdoaWNoIGNhY2hlc1xuICogZ2VvbWV0cmllcyBhbmQgYnVmZmVycyBvbiB0aGUgQ1BVIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHdlYmdsXG4gKiBkcmF3IGNhbGxzLiBSZXRhaW5lZCBtb2RlIGlzIG1vcmUgZWZmaWNpZW50ICYgcGVyZm9ybWF0aXZlLFxuICogaG93ZXZlciwgSW1tZWRpYXRlIE1vZGUgaXMgdXNlZnVsIGZvciBza2V0Y2hpbmcgcXVpY2tcbiAqIGdlb21ldHJpYyBpZGVhcy5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuLi9jb3JlL2NvcmUnKTtcbnZhciBjb25zdGFudHMgPSBfZGVyZXFfKCcuLi9jb3JlL2NvbnN0YW50cycpO1xuXG4vKipcbiAqIEJlZ2luIHNoYXBlIGRyYXdpbmcuICBUaGlzIGlzIGEgaGVscGZ1bCB3YXkgb2YgZ2VuZXJhdGluZ1xuICogY3VzdG9tIHNoYXBlcyBxdWlja2x5LiAgSG93ZXZlciBpbiBXRUJHTCBtb2RlLCBhcHBsaWNhdGlvblxuICogcGVyZm9ybWFuY2Ugd2lsbCBsaWtlbHkgZHJvcCBhcyBhIHJlc3VsdCBvZiB0b28gbWFueSBjYWxscyB0b1xuICogYmVnaW5TaGFwZSgpIC8gZW5kU2hhcGUoKS4gIEFzIGEgaGlnaCBwZXJmb3JtYW5jZSBhbHRlcm5hdGl2ZSxcbiAqIHBsZWFzZSB1c2UgcDUuanMgZ2VvbWV0cnkgcHJpbWl0aXZlcy5cbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIGJlZ2luU2hhcGVcbiAqIEBwYXJhbSAge051bWJlcn0gbW9kZSB3ZWJnbCBwcmltaXRpdmVzIG1vZGUuICBiZWdpblNoYXBlIHN1cHBvcnRzIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBtb2RlczpcbiAqICAgICAgICAgICAgICAgICAgICAgICBQT0lOVFMsTElORVMsTElORV9TVFJJUCxMSU5FX0xPT1AsVFJJQU5HTEVTLFxuICogICAgICAgICAgICAgICAgICAgICAgIFRSSUFOR0xFX1NUUklQLGFuZCBUUklBTkdMRV9GQU4uXG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLmJlZ2luU2hhcGUgPSBmdW5jdGlvbihtb2RlKSB7XG4gIC8vZGVmYXVsdCBzaGFwZSBtb2RlIGlzIGxpbmVfc3RyaXBcbiAgdGhpcy5pbW1lZGlhdGVNb2RlLnNoYXBlTW9kZSA9XG4gICAgbW9kZSAhPT0gdW5kZWZpbmVkID8gbW9kZSA6IGNvbnN0YW50cy5MSU5FX1NUUklQO1xuICAvL2lmIHdlIGhhdmVuJ3QgeWV0IGluaXRpYWxpemVkIG91clxuICAvL2ltbWVkaWF0ZU1vZGUgdmVydGljZXMgJiBidWZmZXJzLCBjcmVhdGUgdGhlbSBub3chXG4gIGlmICh0aGlzLmltbWVkaWF0ZU1vZGUudmVydGljZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuaW1tZWRpYXRlTW9kZS52ZXJ0aWNlcyA9IFtdO1xuICAgIHRoaXMuaW1tZWRpYXRlTW9kZS5lZGdlcyA9IFtdO1xuICAgIHRoaXMuaW1tZWRpYXRlTW9kZS5saW5lVmVydGljZXMgPSBbXTtcbiAgICB0aGlzLmltbWVkaWF0ZU1vZGUudmVydGV4Q29sb3JzID0gW107XG4gICAgdGhpcy5pbW1lZGlhdGVNb2RlLmxpbmVOb3JtYWxzID0gW107XG4gICAgdGhpcy5pbW1lZGlhdGVNb2RlLnV2Q29vcmRzID0gW107XG4gICAgdGhpcy5pbW1lZGlhdGVNb2RlLnZlcnRleEJ1ZmZlciA9IHRoaXMuR0wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5pbW1lZGlhdGVNb2RlLmNvbG9yQnVmZmVyID0gdGhpcy5HTC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmltbWVkaWF0ZU1vZGUudXZCdWZmZXIgPSB0aGlzLkdMLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuaW1tZWRpYXRlTW9kZS5saW5lVmVydGV4QnVmZmVyID0gdGhpcy5HTC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmltbWVkaWF0ZU1vZGUubGluZU5vcm1hbEJ1ZmZlciA9IHRoaXMuR0wuY3JlYXRlQnVmZmVyKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5pbW1lZGlhdGVNb2RlLnZlcnRpY2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5pbW1lZGlhdGVNb2RlLmVkZ2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5pbW1lZGlhdGVNb2RlLmxpbmVWZXJ0aWNlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuaW1tZWRpYXRlTW9kZS5saW5lTm9ybWFscy5sZW5ndGggPSAwO1xuICAgIHRoaXMuaW1tZWRpYXRlTW9kZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmltbWVkaWF0ZU1vZGUudXZDb29yZHMubGVuZ3RoID0gMDtcbiAgfVxuICB0aGlzLmlzSW1tZWRpYXRlRHJhd2luZyA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcbi8qKlxuICogYWRkcyBhIHZlcnRleCB0byBiZSBkcmF3biBpbiBhIGN1c3RvbSBTaGFwZS5cbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIHZlcnRleFxuICogQHBhcmFtICB7TnVtYmVyfSB4IHgtY29vcmRpbmF0ZSBvZiB2ZXJ0ZXhcbiAqIEBwYXJhbSAge051bWJlcn0geSB5LWNvb3JkaW5hdGUgb2YgdmVydGV4XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHogei1jb29yZGluYXRlIG9mIHZlcnRleFxuICogQGNoYWluYWJsZVxuICogQFRPRE8gaW1wbGVtZW50IGhhbmRsaW5nIG9mIHA1LlZlY3RvciBhcmdzXG4gKi9cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLnZlcnRleCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgdmFyIHosIHUsIHY7XG5cbiAgLy8gZGVmYXVsdCB0byAoeCwgeSkgbW9kZTogYWxsIG90aGVyIGFydWdtZW50cyBhc3N1bWVkIHRvIGJlIDAuXG4gIHogPSB1ID0gdiA9IDA7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAvLyAoeCwgeSwgeikgbW9kZTogKHUsIHYpIGFzc3VtZWQgdG8gYmUgMC5cbiAgICB6ID0gYXJndW1lbnRzWzJdO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQpIHtcbiAgICAvLyAoeCwgeSwgdSwgdikgbW9kZTogeiBhc3N1bWVkIHRvIGJlIDAuXG4gICAgdSA9IGFyZ3VtZW50c1syXTtcbiAgICB2ID0gYXJndW1lbnRzWzNdO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDUpIHtcbiAgICAvLyAoeCwgeSwgeiwgdSwgdikgbW9kZVxuICAgIHogPSBhcmd1bWVudHNbMl07XG4gICAgdSA9IGFyZ3VtZW50c1szXTtcbiAgICB2ID0gYXJndW1lbnRzWzRdO1xuICB9XG4gIHZhciB2ZXJ0ID0gbmV3IHA1LlZlY3Rvcih4LCB5LCB6KTtcbiAgdGhpcy5pbW1lZGlhdGVNb2RlLnZlcnRpY2VzLnB1c2godmVydCk7XG4gIHZhciB2ZXJ0ZXhDb2xvciA9IHRoaXMuY3VyRmlsbENvbG9yIHx8IFswLjUsIDAuNSwgMC41LCAxLjBdO1xuICB0aGlzLmltbWVkaWF0ZU1vZGUudmVydGV4Q29sb3JzLnB1c2goXG4gICAgdmVydGV4Q29sb3JbMF0sXG4gICAgdmVydGV4Q29sb3JbMV0sXG4gICAgdmVydGV4Q29sb3JbMl0sXG4gICAgdmVydGV4Q29sb3JbM11cbiAgKTtcblxuICB0aGlzLmltbWVkaWF0ZU1vZGUudXZDb29yZHMucHVzaCh1LCB2KTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRW5kIHNoYXBlIGRyYXdpbmcgYW5kIHJlbmRlciB2ZXJ0aWNlcyB0byBzY3JlZW4uXG4gKiBAY2hhaW5hYmxlXG4gKi9cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLmVuZFNoYXBlID0gZnVuY3Rpb24oXG4gIG1vZGUsXG4gIGlzQ3VydmUsXG4gIGlzQmV6aWVyLFxuICBpc1F1YWRyYXRpYyxcbiAgaXNDb250b3VyLFxuICBzaGFwZUtpbmRcbikge1xuICB0aGlzLl91c2VJbW1lZGlhdGVNb2RlU2hhZGVyKCk7XG5cbiAgaWYgKHRoaXMuX2RvU3Ryb2tlICYmIHRoaXMuZHJhd01vZGUgIT09IGNvbnN0YW50cy5URVhUVVJFKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmltbWVkaWF0ZU1vZGUudmVydGljZXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICB0aGlzLmltbWVkaWF0ZU1vZGUuZWRnZXMucHVzaChbaSwgaSArIDFdKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IGNvbnN0YW50cy5DTE9TRSkge1xuICAgICAgdGhpcy5pbW1lZGlhdGVNb2RlLmVkZ2VzLnB1c2goW1xuICAgICAgICB0aGlzLmltbWVkaWF0ZU1vZGUudmVydGljZXMubGVuZ3RoIC0gMSxcbiAgICAgICAgMFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgcDUuR2VvbWV0cnkucHJvdG90eXBlLl9lZGdlc1RvVmVydGljZXMuY2FsbCh0aGlzLmltbWVkaWF0ZU1vZGUpO1xuICAgIHRoaXMuX2RyYXdTdHJva2VJbW1lZGlhdGVNb2RlKCk7XG4gIH1cbiAgaWYgKHRoaXMuX2RvRmlsbCkge1xuICAgIHRoaXMuX2RyYXdGaWxsSW1tZWRpYXRlTW9kZShcbiAgICAgIG1vZGUsXG4gICAgICBpc0N1cnZlLFxuICAgICAgaXNCZXppZXIsXG4gICAgICBpc1F1YWRyYXRpYyxcbiAgICAgIGlzQ29udG91cixcbiAgICAgIHNoYXBlS2luZFxuICAgICk7XG4gIH1cbiAgLy9jbGVhciBvdXQgb3VyIHZlcnRleFBvc2l0aW9ucyAmIGNvbG9ycyBhcnJheXNcbiAgLy9hZnRlciByZW5kZXJpbmdcbiAgdGhpcy5pbW1lZGlhdGVNb2RlLnZlcnRpY2VzLmxlbmd0aCA9IDA7XG4gIHRoaXMuaW1tZWRpYXRlTW9kZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoID0gMDtcbiAgdGhpcy5pbW1lZGlhdGVNb2RlLnV2Q29vcmRzLmxlbmd0aCA9IDA7XG4gIHRoaXMuaXNJbW1lZGlhdGVEcmF3aW5nID0gZmFsc2U7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5fZHJhd0ZpbGxJbW1lZGlhdGVNb2RlID0gZnVuY3Rpb24oXG4gIG1vZGUsXG4gIGlzQ3VydmUsXG4gIGlzQmV6aWVyLFxuICBpc1F1YWRyYXRpYyxcbiAgaXNDb250b3VyLFxuICBzaGFwZUtpbmRcbikge1xuICB2YXIgZ2wgPSB0aGlzLkdMO1xuICB0aGlzLmN1ckZpbGxTaGFkZXIuYmluZFNoYWRlcigpO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIGZpbGwgc2hhZGVyJ3MgJ2FQb3NpdGlvbicgYnVmZmVyXG4gIGlmICh0aGlzLmN1ckZpbGxTaGFkZXIuYXR0cmlidXRlcy5hUG9zaXRpb24pIHtcbiAgICAvL3ZlcnRleCBwb3NpdGlvbiBBdHRyaWJ1dGVcbiAgICB0aGlzLl9iaW5kQnVmZmVyKFxuICAgICAgdGhpcy5pbW1lZGlhdGVNb2RlLnZlcnRleEJ1ZmZlcixcbiAgICAgIGdsLkFSUkFZX0JVRkZFUixcbiAgICAgIHRoaXMuX3ZUb05BcnJheSh0aGlzLmltbWVkaWF0ZU1vZGUudmVydGljZXMpLFxuICAgICAgRmxvYXQzMkFycmF5LFxuICAgICAgZ2wuRFlOQU1JQ19EUkFXXG4gICAgKTtcblxuICAgIHRoaXMuY3VyRmlsbFNoYWRlci5lbmFibGVBdHRyaWIoXG4gICAgICB0aGlzLmN1ckZpbGxTaGFkZXIuYXR0cmlidXRlcy5hUG9zaXRpb24ubG9jYXRpb24sXG4gICAgICAzLFxuICAgICAgZ2wuRkxPQVQsXG4gICAgICBmYWxzZSxcbiAgICAgIDAsXG4gICAgICAwXG4gICAgKTtcbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGZpbGwgc2hhZGVyJ3MgJ2FWZXJ0ZXhDb2xvcicgYnVmZmVyXG4gIGlmIChcbiAgICB0aGlzLmRyYXdNb2RlID09PSBjb25zdGFudHMuRklMTCAmJlxuICAgIHRoaXMuY3VyRmlsbFNoYWRlci5hdHRyaWJ1dGVzLmFWZXJ0ZXhDb2xvclxuICApIHtcbiAgICB0aGlzLl9iaW5kQnVmZmVyKFxuICAgICAgdGhpcy5pbW1lZGlhdGVNb2RlLmNvbG9yQnVmZmVyLFxuICAgICAgZ2wuQVJSQVlfQlVGRkVSLFxuICAgICAgdGhpcy5pbW1lZGlhdGVNb2RlLnZlcnRleENvbG9ycyxcbiAgICAgIEZsb2F0MzJBcnJheSxcbiAgICAgIGdsLkRZTkFNSUNfRFJBV1xuICAgICk7XG5cbiAgICB0aGlzLmN1ckZpbGxTaGFkZXIuZW5hYmxlQXR0cmliKFxuICAgICAgdGhpcy5jdXJGaWxsU2hhZGVyLmF0dHJpYnV0ZXMuYVZlcnRleENvbG9yLmxvY2F0aW9uLFxuICAgICAgNCxcbiAgICAgIGdsLkZMT0FULFxuICAgICAgZmFsc2UsXG4gICAgICAwLFxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBmaWxsIHNoYWRlcidzICdhVGV4Q29vcmQnIGJ1ZmZlclxuICBpZiAoXG4gICAgdGhpcy5kcmF3TW9kZSA9PT0gY29uc3RhbnRzLlRFWFRVUkUgJiZcbiAgICB0aGlzLmN1ckZpbGxTaGFkZXIuYXR0cmlidXRlcy5hVGV4Q29vcmRcbiAgKSB7XG4gICAgLy90ZXh0dXJlIGNvb3JkaW5hdGUgQXR0cmlidXRlXG4gICAgdGhpcy5fYmluZEJ1ZmZlcihcbiAgICAgIHRoaXMuaW1tZWRpYXRlTW9kZS51dkJ1ZmZlcixcbiAgICAgIGdsLkFSUkFZX0JVRkZFUixcbiAgICAgIHRoaXMuaW1tZWRpYXRlTW9kZS51dkNvb3JkcyxcbiAgICAgIEZsb2F0MzJBcnJheSxcbiAgICAgIGdsLkRZTkFNSUNfRFJBV1xuICAgICk7XG5cbiAgICB0aGlzLmN1ckZpbGxTaGFkZXIuZW5hYmxlQXR0cmliKFxuICAgICAgdGhpcy5jdXJGaWxsU2hhZGVyLmF0dHJpYnV0ZXMuYVRleENvb3JkLmxvY2F0aW9uLFxuICAgICAgMixcbiAgICAgIGdsLkZMT0FULFxuICAgICAgZmFsc2UsXG4gICAgICAwLFxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICAvL2lmICh0cnVlIHx8IG1vZGUpIHtcbiAgaWYgKHRoaXMuZHJhd01vZGUgPT09IGNvbnN0YW50cy5GSUxMIHx8IHRoaXMuZHJhd01vZGUgPT09IGNvbnN0YW50cy5URVhUVVJFKSB7XG4gICAgc3dpdGNoICh0aGlzLmltbWVkaWF0ZU1vZGUuc2hhcGVNb2RlKSB7XG4gICAgICBjYXNlIGNvbnN0YW50cy5MSU5FX1NUUklQOlxuICAgICAgY2FzZSBjb25zdGFudHMuTElORVM6XG4gICAgICBjYXNlIGNvbnN0YW50cy5UUklBTkdMRVM6XG4gICAgICAgIHRoaXMuaW1tZWRpYXRlTW9kZS5zaGFwZU1vZGUgPSBjb25zdGFudHMuVFJJQU5HTEVfRkFOO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0aGlzLmltbWVkaWF0ZU1vZGUuc2hhcGVNb2RlKSB7XG4gICAgICBjYXNlIGNvbnN0YW50cy5MSU5FX1NUUklQOlxuICAgICAgY2FzZSBjb25zdGFudHMuTElORVM6XG4gICAgICAgIHRoaXMuaW1tZWRpYXRlTW9kZS5zaGFwZU1vZGUgPSBjb25zdGFudHMuTElORV9MT09QO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLy99XG4gIC8vUVVBRFMgJiBRVUFEX1NUUklQIGFyZSBub3Qgc3VwcG9ydGVkIHByaW1pdGl2ZXMgbW9kZXNcbiAgLy9pbiB3ZWJnbC5cbiAgaWYgKFxuICAgIHRoaXMuaW1tZWRpYXRlTW9kZS5zaGFwZU1vZGUgPT09IGNvbnN0YW50cy5RVUFEUyB8fFxuICAgIHRoaXMuaW1tZWRpYXRlTW9kZS5zaGFwZU1vZGUgPT09IGNvbnN0YW50cy5RVUFEX1NUUklQXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdzb3JyeSwgJyArXG4gICAgICAgIHRoaXMuaW1tZWRpYXRlTW9kZS5zaGFwZU1vZGUgK1xuICAgICAgICAnIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gd2ViZ2wgbW9kZS4nXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9hcHBseUNvbG9yQmxlbmQodGhpcy5jdXJGaWxsQ29sb3IpO1xuICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XG4gICAgZ2wuZHJhd0FycmF5cyhcbiAgICAgIHRoaXMuaW1tZWRpYXRlTW9kZS5zaGFwZU1vZGUsXG4gICAgICAwLFxuICAgICAgdGhpcy5pbW1lZGlhdGVNb2RlLnZlcnRpY2VzLmxlbmd0aFxuICAgICk7XG4gIH1cbiAgLy8gdG9kbyAvIG9wdGltaXphdGlvbnM/IGxlYXZlIGJvdW5kIHVudGlsIGFub3RoZXIgc2hhZGVyIGlzIHNldD9cbiAgdGhpcy5jdXJGaWxsU2hhZGVyLnVuYmluZFNoYWRlcigpO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX2RyYXdTdHJva2VJbW1lZGlhdGVNb2RlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBnbCA9IHRoaXMuR0w7XG4gIHRoaXMuY3VyU3Ryb2tlU2hhZGVyLmJpbmRTaGFkZXIoKTtcblxuICAvLyBpbml0aWFsaXplIHRoZSBzdHJva2Ugc2hhZGVyJ3MgJ2FQb3NpdGlvbicgYnVmZmVyXG4gIGlmICh0aGlzLmN1clN0cm9rZVNoYWRlci5hdHRyaWJ1dGVzLmFQb3NpdGlvbikge1xuICAgIHRoaXMuX2JpbmRCdWZmZXIoXG4gICAgICB0aGlzLmltbWVkaWF0ZU1vZGUubGluZVZlcnRleEJ1ZmZlcixcbiAgICAgIGdsLkFSUkFZX0JVRkZFUixcbiAgICAgIHRoaXMuX2ZsYXR0ZW4odGhpcy5pbW1lZGlhdGVNb2RlLmxpbmVWZXJ0aWNlcyksXG4gICAgICBGbG9hdDMyQXJyYXksXG4gICAgICBnbC5TVEFUSUNfRFJBV1xuICAgICk7XG5cbiAgICB0aGlzLmN1clN0cm9rZVNoYWRlci5lbmFibGVBdHRyaWIoXG4gICAgICB0aGlzLmN1clN0cm9rZVNoYWRlci5hdHRyaWJ1dGVzLmFQb3NpdGlvbi5sb2NhdGlvbixcbiAgICAgIDMsXG4gICAgICBnbC5GTE9BVCxcbiAgICAgIGZhbHNlLFxuICAgICAgMCxcbiAgICAgIDBcbiAgICApO1xuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgc3Ryb2tlIHNoYWRlcidzICdhRGlyZWN0aW9uJyBidWZmZXJcbiAgaWYgKHRoaXMuY3VyU3Ryb2tlU2hhZGVyLmF0dHJpYnV0ZXMuYURpcmVjdGlvbikge1xuICAgIHRoaXMuX2JpbmRCdWZmZXIoXG4gICAgICB0aGlzLmltbWVkaWF0ZU1vZGUubGluZU5vcm1hbEJ1ZmZlcixcbiAgICAgIGdsLkFSUkFZX0JVRkZFUixcbiAgICAgIHRoaXMuX2ZsYXR0ZW4odGhpcy5pbW1lZGlhdGVNb2RlLmxpbmVOb3JtYWxzKSxcbiAgICAgIEZsb2F0MzJBcnJheSxcbiAgICAgIGdsLlNUQVRJQ19EUkFXXG4gICAgKTtcbiAgICB0aGlzLmN1clN0cm9rZVNoYWRlci5lbmFibGVBdHRyaWIoXG4gICAgICB0aGlzLmN1clN0cm9rZVNoYWRlci5hdHRyaWJ1dGVzLmFEaXJlY3Rpb24ubG9jYXRpb24sXG4gICAgICA0LFxuICAgICAgZ2wuRkxPQVQsXG4gICAgICBmYWxzZSxcbiAgICAgIDAsXG4gICAgICAwXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMuX2FwcGx5Q29sb3JCbGVuZCh0aGlzLmN1clN0cm9rZUNvbG9yKTtcbiAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRVMsIDAsIHRoaXMuaW1tZWRpYXRlTW9kZS5saW5lVmVydGljZXMubGVuZ3RoKTtcblxuICAvLyB0b2RvIC8gb3B0aW1pemF0aW9ucz8gbGVhdmUgYm91bmQgdW50aWwgYW5vdGhlciBzaGFkZXIgaXMgc2V0P1xuICB0aGlzLmN1clN0cm9rZVNoYWRlci51bmJpbmRTaGFkZXIoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcDUuUmVuZGVyZXJHTDtcblxufSx7XCIuLi9jb3JlL2NvbnN0YW50c1wiOjIxLFwiLi4vY29yZS9jb3JlXCI6MjJ9XSw3MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vL1JldGFpbmVkIE1vZGUuIFRoZSBkZWZhdWx0IG1vZGUgZm9yIHJlbmRlcmluZyAzRCBwcmltaXRpdmVzXG4vL2luIFdFQkdMLlxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcDUgPSBfZGVyZXFfKCcuLi9jb3JlL2NvcmUnKTtcblxudmFyIGhhc2hDb3VudCA9IDA7XG4vKipcbiAqIF9pbml0QnVmZmVyRGVmYXVsdHNcbiAqIEBwcml2YXRlXG4gKiBAZGVzY3JpcHRpb24gaW5pdGlhbGl6ZXMgYnVmZmVyIGRlZmF1bHRzLiBydW5zIGVhY2ggdGltZSBhIG5ldyBnZW9tZXRyeSBpc1xuICogcmVnaXN0ZXJlZFxuICogQHBhcmFtICB7U3RyaW5nfSBnSWQgIGtleSBvZiB0aGUgZ2VvbWV0cnkgb2JqZWN0XG4gKi9cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLl9pbml0QnVmZmVyRGVmYXVsdHMgPSBmdW5jdGlvbihnSWQpIHtcbiAgdGhpcy5fZnJlZUJ1ZmZlcnMoZ0lkKTtcblxuICAvL0BUT0RPIHJlbW92ZSB0aGlzIGxpbWl0IG9uIGhhc2hlcyBpbiBnSGFzaFxuICBoYXNoQ291bnQrKztcbiAgaWYgKGhhc2hDb3VudCA+IDEwMDApIHtcbiAgICB2YXIga2V5ID0gT2JqZWN0LmtleXModGhpcy5nSGFzaClbMF07XG4gICAgZGVsZXRlIHRoaXMuZ0hhc2hba2V5XTtcbiAgICBoYXNoQ291bnQtLTtcbiAgfVxuXG4gIC8vY3JlYXRlIGEgbmV3IGVudHJ5IGluIG91ciBnSGFzaFxuICB0aGlzLmdIYXNoW2dJZF0gPSB7fTtcbn07XG5cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLl9mcmVlQnVmZmVycyA9IGZ1bmN0aW9uKGdJZCkge1xuICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdIYXNoW2dJZF07XG4gIGlmICghZ2VvbWV0cnkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkZWxldGUgdGhpcy5nSGFzaFtnSWRdO1xuICBoYXNoQ291bnQtLTtcblxuICB2YXIgZ2wgPSB0aGlzLkdMO1xuICBnZW9tZXRyeS52ZXJ0ZXhCdWZmZXIgJiYgZ2wuZGVsZXRlQnVmZmVyKGdlb21ldHJ5LnZlcnRleEJ1ZmZlcik7XG4gIGdlb21ldHJ5Lm5vcm1hbEJ1ZmZlciAmJiBnbC5kZWxldGVCdWZmZXIoZ2VvbWV0cnkubm9ybWFsQnVmZmVyKTtcbiAgZ2VvbWV0cnkubGluZU5vcm1hbEJ1ZmZlciAmJiBnbC5kZWxldGVCdWZmZXIoZ2VvbWV0cnkubGluZU5vcm1hbEJ1ZmZlcik7XG4gIGdlb21ldHJ5LnV2QnVmZmVyICYmIGdsLmRlbGV0ZUJ1ZmZlcihnZW9tZXRyeS51dkJ1ZmZlcik7XG4gIGdlb21ldHJ5LmluZGV4QnVmZmVyICYmIGdsLmRlbGV0ZUJ1ZmZlcihnZW9tZXRyeS5pbmRleEJ1ZmZlcik7XG4gIGdlb21ldHJ5LmxpbmVWZXJ0ZXhCdWZmZXIgJiYgZ2wuZGVsZXRlQnVmZmVyKGdlb21ldHJ5LmxpbmVWZXJ0ZXhCdWZmZXIpO1xufTtcbi8qKlxuICogY3JlYXRlQnVmZmVycyBkZXNjcmlwdGlvblxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge1N0cmluZ30gZ0lkICAgIGtleSBvZiB0aGUgZ2VvbWV0cnkgb2JqZWN0XG4gKiBAcGFyYW0gIHtwNS5HZW9tZXRyeX0gIG9iaiBjb250YWlucyBnZW9tZXRyeSBkYXRhXG4gKi9cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLmNyZWF0ZUJ1ZmZlcnMgPSBmdW5jdGlvbihnSWQsIG9iaikge1xuICB2YXIgZ2wgPSB0aGlzLkdMO1xuICB0aGlzLl9zZXREZWZhdWx0Q2FtZXJhKCk7XG4gIC8vaW5pdGlhbGl6ZSB0aGUgZ2wgYnVmZmVycyBmb3Igb3VyIGdlb20gZ3JvdXBzXG4gIHRoaXMuX2luaXRCdWZmZXJEZWZhdWx0cyhnSWQpO1xuXG4gIHZhciBnZW9tZXRyeSA9IHRoaXMuZ0hhc2hbZ0lkXTtcblxuICBnZW9tZXRyeS5udW1iZXJPZkl0ZW1zID0gb2JqLmZhY2VzLmxlbmd0aCAqIDM7XG4gIGdlb21ldHJ5LmxpbmVWZXJ0ZXhDb3VudCA9IG9iai5saW5lVmVydGljZXMubGVuZ3RoO1xuXG4gIHRoaXMuX3VzZUNvbG9yU2hhZGVyKCk7XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgc3Ryb2tlIHNoYWRlcidzICdhUG9zaXRpb24nIGJ1ZmZlciwgaWYgdXNlZFxuICBpZiAodGhpcy5jdXJTdHJva2VTaGFkZXIuYXR0cmlidXRlcy5hUG9zaXRpb24pIHtcbiAgICBnZW9tZXRyeS5saW5lVmVydGV4QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cbiAgICB0aGlzLl9iaW5kQnVmZmVyKFxuICAgICAgZ2VvbWV0cnkubGluZVZlcnRleEJ1ZmZlcixcbiAgICAgIGdsLkFSUkFZX0JVRkZFUixcbiAgICAgIHRoaXMuX2ZsYXR0ZW4ob2JqLmxpbmVWZXJ0aWNlcyksXG4gICAgICBGbG9hdDMyQXJyYXksXG4gICAgICBnbC5TVEFUSUNfRFJBV1xuICAgICk7XG5cbiAgICB0aGlzLmN1clN0cm9rZVNoYWRlci5lbmFibGVBdHRyaWIoXG4gICAgICB0aGlzLmN1clN0cm9rZVNoYWRlci5hdHRyaWJ1dGVzLmFQb3NpdGlvbi5sb2NhdGlvbixcbiAgICAgIDMsXG4gICAgICBnbC5GTE9BVCxcbiAgICAgIGZhbHNlLFxuICAgICAgMCxcbiAgICAgIDBcbiAgICApO1xuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgc3Ryb2tlIHNoYWRlcidzICdhRGlyZWN0aW9uJyBidWZmZXIsIGlmIHVzZWRcbiAgaWYgKHRoaXMuY3VyU3Ryb2tlU2hhZGVyLmF0dHJpYnV0ZXMuYURpcmVjdGlvbikge1xuICAgIGdlb21ldHJ5LmxpbmVOb3JtYWxCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblxuICAgIHRoaXMuX2JpbmRCdWZmZXIoXG4gICAgICBnZW9tZXRyeS5saW5lTm9ybWFsQnVmZmVyLFxuICAgICAgZ2wuQVJSQVlfQlVGRkVSLFxuICAgICAgdGhpcy5fZmxhdHRlbihvYmoubGluZU5vcm1hbHMpLFxuICAgICAgRmxvYXQzMkFycmF5LFxuICAgICAgZ2wuU1RBVElDX0RSQVdcbiAgICApO1xuXG4gICAgdGhpcy5jdXJTdHJva2VTaGFkZXIuZW5hYmxlQXR0cmliKFxuICAgICAgdGhpcy5jdXJTdHJva2VTaGFkZXIuYXR0cmlidXRlcy5hRGlyZWN0aW9uLmxvY2F0aW9uLFxuICAgICAgNCxcbiAgICAgIGdsLkZMT0FULFxuICAgICAgZmFsc2UsXG4gICAgICAwLFxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBmaWxsIHNoYWRlcidzICdhUG9zaXRpb24nIGJ1ZmZlciwgaWYgdXNlZFxuICBpZiAodGhpcy5jdXJGaWxsU2hhZGVyLmF0dHJpYnV0ZXMuYVBvc2l0aW9uKSB7XG4gICAgZ2VvbWV0cnkudmVydGV4QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cbiAgICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgdmVydGV4IHBvc2l0aW9uc1xuICAgIHRoaXMuX2JpbmRCdWZmZXIoXG4gICAgICBnZW9tZXRyeS52ZXJ0ZXhCdWZmZXIsXG4gICAgICBnbC5BUlJBWV9CVUZGRVIsXG4gICAgICB0aGlzLl92VG9OQXJyYXkob2JqLnZlcnRpY2VzKSxcbiAgICAgIEZsb2F0MzJBcnJheSxcbiAgICAgIGdsLlNUQVRJQ19EUkFXXG4gICAgKTtcblxuICAgIHRoaXMuY3VyRmlsbFNoYWRlci5lbmFibGVBdHRyaWIoXG4gICAgICB0aGlzLmN1ckZpbGxTaGFkZXIuYXR0cmlidXRlcy5hUG9zaXRpb24ubG9jYXRpb24sXG4gICAgICAzLFxuICAgICAgZ2wuRkxPQVQsXG4gICAgICBmYWxzZSxcbiAgICAgIDAsXG4gICAgICAwXG4gICAgKTtcbiAgfVxuXG4gIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBmYWNlc1xuICBnZW9tZXRyeS5pbmRleEJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICB0aGlzLl9iaW5kQnVmZmVyKFxuICAgIGdlb21ldHJ5LmluZGV4QnVmZmVyLFxuICAgIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLFxuICAgIHRoaXMuX2ZsYXR0ZW4ob2JqLmZhY2VzKSxcbiAgICBVaW50MTZBcnJheSxcbiAgICBnbC5TVEFUSUNfRFJBV1xuICApO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIGZpbGwgc2hhZGVyJ3MgJ2FOb3JtYWwnIGJ1ZmZlciwgaWYgdXNlZFxuICBpZiAodGhpcy5jdXJGaWxsU2hhZGVyLmF0dHJpYnV0ZXMuYU5vcm1hbCkge1xuICAgIGdlb21ldHJ5Lm5vcm1hbEJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuXG4gICAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIG5vcm1hbHNcbiAgICB0aGlzLl9iaW5kQnVmZmVyKFxuICAgICAgZ2VvbWV0cnkubm9ybWFsQnVmZmVyLFxuICAgICAgZ2wuQVJSQVlfQlVGRkVSLFxuICAgICAgdGhpcy5fdlRvTkFycmF5KG9iai52ZXJ0ZXhOb3JtYWxzKSxcbiAgICAgIEZsb2F0MzJBcnJheSxcbiAgICAgIGdsLlNUQVRJQ19EUkFXXG4gICAgKTtcblxuICAgIHRoaXMuY3VyRmlsbFNoYWRlci5lbmFibGVBdHRyaWIoXG4gICAgICB0aGlzLmN1ckZpbGxTaGFkZXIuYXR0cmlidXRlcy5hTm9ybWFsLmxvY2F0aW9uLFxuICAgICAgMyxcbiAgICAgIGdsLkZMT0FULFxuICAgICAgZmFsc2UsXG4gICAgICAwLFxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBmaWxsIHNoYWRlcidzICdhVGV4Q29vcmQnIGJ1ZmZlciwgaWYgdXNlZFxuICBpZiAodGhpcy5jdXJGaWxsU2hhZGVyLmF0dHJpYnV0ZXMuYVRleENvb3JkKSB7XG4gICAgZ2VvbWV0cnkudXZCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblxuICAgIC8vIHRleCBjb29yZHNcbiAgICB0aGlzLl9iaW5kQnVmZmVyKFxuICAgICAgZ2VvbWV0cnkudXZCdWZmZXIsXG4gICAgICBnbC5BUlJBWV9CVUZGRVIsXG4gICAgICB0aGlzLl9mbGF0dGVuKG9iai51dnMpLFxuICAgICAgRmxvYXQzMkFycmF5LFxuICAgICAgZ2wuU1RBVElDX0RSQVdcbiAgICApO1xuXG4gICAgdGhpcy5jdXJGaWxsU2hhZGVyLmVuYWJsZUF0dHJpYihcbiAgICAgIHRoaXMuY3VyRmlsbFNoYWRlci5hdHRyaWJ1dGVzLmFUZXhDb29yZC5sb2NhdGlvbixcbiAgICAgIDIsXG4gICAgICBnbC5GTE9BVCxcbiAgICAgIGZhbHNlLFxuICAgICAgMCxcbiAgICAgIDBcbiAgICApO1xuICB9XG4gIC8vfVxufTtcblxuLyoqXG4gKiBEcmF3cyBidWZmZXJzIGdpdmVuIGEgZ2VvbWV0cnkga2V5IElEXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7U3RyaW5nfSBnSWQgICAgIElEIGluIG91ciBnZW9tIGhhc2hcbiAqIEBjaGFpbmFibGVcbiAqL1xucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuZHJhd0J1ZmZlcnMgPSBmdW5jdGlvbihnSWQpIHtcbiAgdGhpcy5fc2V0RGVmYXVsdENhbWVyYSgpO1xuICB2YXIgZ2wgPSB0aGlzLkdMO1xuICB0aGlzLl91c2VDb2xvclNoYWRlcigpO1xuICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdIYXNoW2dJZF07XG5cbiAgaWYgKHRoaXMuX2RvU3Ryb2tlICYmIGdlb21ldHJ5LmxpbmVWZXJ0ZXhDb3VudCA+IDApIHtcbiAgICB0aGlzLmN1clN0cm9rZVNoYWRlci5iaW5kU2hhZGVyKCk7XG5cbiAgICAvLyBiaW5kIHRoZSBzdHJva2Ugc2hhZGVyJ3MgJ2FQb3NpdGlvbicgYnVmZmVyXG4gICAgaWYgKGdlb21ldHJ5LmxpbmVWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgIHRoaXMuX2JpbmRCdWZmZXIoZ2VvbWV0cnkubGluZVZlcnRleEJ1ZmZlciwgZ2wuQVJSQVlfQlVGRkVSKTtcbiAgICAgIHRoaXMuY3VyU3Ryb2tlU2hhZGVyLmVuYWJsZUF0dHJpYihcbiAgICAgICAgdGhpcy5jdXJTdHJva2VTaGFkZXIuYXR0cmlidXRlcy5hUG9zaXRpb24ubG9jYXRpb24sXG4gICAgICAgIDMsXG4gICAgICAgIGdsLkZMT0FULFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgMCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBiaW5kIHRoZSBzdHJva2Ugc2hhZGVyJ3MgJ2FEaXJlY3Rpb24nIGJ1ZmZlclxuICAgIGlmIChnZW9tZXRyeS5saW5lTm9ybWFsQnVmZmVyKSB7XG4gICAgICB0aGlzLl9iaW5kQnVmZmVyKGdlb21ldHJ5LmxpbmVOb3JtYWxCdWZmZXIsIGdsLkFSUkFZX0JVRkZFUik7XG4gICAgICB0aGlzLmN1clN0cm9rZVNoYWRlci5lbmFibGVBdHRyaWIoXG4gICAgICAgIHRoaXMuY3VyU3Ryb2tlU2hhZGVyLmF0dHJpYnV0ZXMuYURpcmVjdGlvbi5sb2NhdGlvbixcbiAgICAgICAgNCxcbiAgICAgICAgZ2wuRkxPQVQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAwLFxuICAgICAgICAwXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX2FwcGx5Q29sb3JCbGVuZCh0aGlzLmN1clN0cm9rZUNvbG9yKTtcbiAgICB0aGlzLl9kcmF3QXJyYXlzKGdsLlRSSUFOR0xFUywgZ0lkKTtcbiAgICB0aGlzLmN1clN0cm9rZVNoYWRlci51bmJpbmRTaGFkZXIoKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9kb0ZpbGwgIT09IGZhbHNlKSB7XG4gICAgdGhpcy5jdXJGaWxsU2hhZGVyLmJpbmRTaGFkZXIoKTtcblxuICAgIC8vIGJpbmQgdGhlIGZpbGwgc2hhZGVyJ3MgJ2FQb3NpdGlvbicgYnVmZmVyXG4gICAgaWYgKGdlb21ldHJ5LnZlcnRleEJ1ZmZlcikge1xuICAgICAgLy92ZXJ0ZXggcG9zaXRpb24gYnVmZmVyXG4gICAgICB0aGlzLl9iaW5kQnVmZmVyKGdlb21ldHJ5LnZlcnRleEJ1ZmZlciwgZ2wuQVJSQVlfQlVGRkVSKTtcbiAgICAgIHRoaXMuY3VyRmlsbFNoYWRlci5lbmFibGVBdHRyaWIoXG4gICAgICAgIHRoaXMuY3VyRmlsbFNoYWRlci5hdHRyaWJ1dGVzLmFQb3NpdGlvbi5sb2NhdGlvbixcbiAgICAgICAgMyxcbiAgICAgICAgZ2wuRkxPQVQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAwLFxuICAgICAgICAwXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChnZW9tZXRyeS5pbmRleEJ1ZmZlcikge1xuICAgICAgLy92ZXJ0ZXggaW5kZXggYnVmZmVyXG4gICAgICB0aGlzLl9iaW5kQnVmZmVyKGdlb21ldHJ5LmluZGV4QnVmZmVyLCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUik7XG4gICAgfVxuXG4gICAgLy8gYmluZCB0aGUgZmlsbCBzaGFkZXIncyAnYU5vcm1hbCcgYnVmZmVyXG4gICAgaWYgKGdlb21ldHJ5Lm5vcm1hbEJ1ZmZlcikge1xuICAgICAgdGhpcy5fYmluZEJ1ZmZlcihnZW9tZXRyeS5ub3JtYWxCdWZmZXIsIGdsLkFSUkFZX0JVRkZFUik7XG4gICAgICB0aGlzLmN1ckZpbGxTaGFkZXIuZW5hYmxlQXR0cmliKFxuICAgICAgICB0aGlzLmN1ckZpbGxTaGFkZXIuYXR0cmlidXRlcy5hTm9ybWFsLmxvY2F0aW9uLFxuICAgICAgICAzLFxuICAgICAgICBnbC5GTE9BVCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIDAsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gYmluZCB0aGUgZmlsbCBzaGFkZXIncyAnYVRleENvb3JkJyBidWZmZXJcbiAgICBpZiAoZ2VvbWV0cnkudXZCdWZmZXIpIHtcbiAgICAgIC8vIHV2IGJ1ZmZlclxuICAgICAgdGhpcy5fYmluZEJ1ZmZlcihnZW9tZXRyeS51dkJ1ZmZlciwgZ2wuQVJSQVlfQlVGRkVSKTtcbiAgICAgIHRoaXMuY3VyRmlsbFNoYWRlci5lbmFibGVBdHRyaWIoXG4gICAgICAgIHRoaXMuY3VyRmlsbFNoYWRlci5hdHRyaWJ1dGVzLmFUZXhDb29yZC5sb2NhdGlvbixcbiAgICAgICAgMixcbiAgICAgICAgZ2wuRkxPQVQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAwLFxuICAgICAgICAwXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX2FwcGx5Q29sb3JCbGVuZCh0aGlzLmN1ckZpbGxDb2xvcik7XG4gICAgdGhpcy5fZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgZ0lkKTtcbiAgICB0aGlzLmN1ckZpbGxTaGFkZXIudW5iaW5kU2hhZGVyKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENhbGxzIGRyYXdCdWZmZXJzKCkgd2l0aCBhIHNjYWxlZCBtb2RlbC92aWV3IG1hdHJpeC5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgYnkgdmFyaW91cyAzZCBwcmltaXRpdmUgbWV0aG9kcyAoaW4gcHJpbWl0aXZlcy5qcywgZWcuIHBsYW5lLFxuICogYm94LCB0b3J1cywgZXRjLi4uKSB0byBhbGxvdyBjYWNoaW5nIG9mIHVuLXNjYWxlZCBnZW9tZXRyaWVzLiBUaG9zZVxuICogZ2VvbWV0cmllcyBhcmUgZ2VuZXJhbGx5IGNyZWF0ZWQgd2l0aCB1bml0LWxlbmd0aCBkaW1lbnNpb25zLCBjYWNoZWQgYXNcbiAqIHN1Y2gsIGFuZCB0aGVuIHNjYWxlZCBhcHByb3ByaWF0ZWx5IGluIHRoaXMgbWV0aG9kIHByaW9yIHRvIHJlbmRlcmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBkcmF3QnVmZmVyc1NjYWxlZFxuICogQHBhcmFtIHtTdHJpbmd9IGdJZCAgICAgSUQgaW4gb3VyIGdlb20gaGFzaFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlWCAgdGhlIGFtb3VudCB0byBzY2FsZSBpbiB0aGUgWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZVkgIHRoZSBhbW91bnQgdG8gc2NhbGUgaW4gdGhlIFkgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGVaICB0aGUgYW1vdW50IHRvIHNjYWxlIGluIHRoZSBaIGRpcmVjdGlvblxuICovXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5kcmF3QnVmZmVyc1NjYWxlZCA9IGZ1bmN0aW9uKFxuICBnSWQsXG4gIHNjYWxlWCxcbiAgc2NhbGVZLFxuICBzY2FsZVpcbikge1xuICB2YXIgdU1WTWF0cml4ID0gdGhpcy51TVZNYXRyaXguY29weSgpO1xuICB0cnkge1xuICAgIHRoaXMudU1WTWF0cml4LnNjYWxlKHNjYWxlWCwgc2NhbGVZLCBzY2FsZVopO1xuICAgIHRoaXMuZHJhd0J1ZmZlcnMoZ0lkKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLnVNVk1hdHJpeCA9IHVNVk1hdHJpeDtcbiAgfVxufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX2RyYXdBcnJheXMgPSBmdW5jdGlvbihkcmF3TW9kZSwgZ0lkKSB7XG4gIHRoaXMuR0wuZHJhd0FycmF5cyhkcmF3TW9kZSwgMCwgdGhpcy5nSGFzaFtnSWRdLmxpbmVWZXJ0ZXhDb3VudCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX2RyYXdFbGVtZW50cyA9IGZ1bmN0aW9uKGRyYXdNb2RlLCBnSWQpIHtcbiAgdGhpcy5HTC5kcmF3RWxlbWVudHMoXG4gICAgZHJhd01vZGUsXG4gICAgdGhpcy5nSGFzaFtnSWRdLm51bWJlck9mSXRlbXMsXG4gICAgdGhpcy5HTC5VTlNJR05FRF9TSE9SVCxcbiAgICAwXG4gICk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1LlJlbmRlcmVyR0w7XG5cbn0se1wiLi4vY29yZS9jb3JlXCI6MjJ9XSw3MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xudmFyIGNvbnN0YW50cyA9IF9kZXJlcV8oJy4uL2NvcmUvY29uc3RhbnRzJyk7XG5fZGVyZXFfKCcuL3A1LlNoYWRlcicpO1xuX2RlcmVxXygnLi4vY29yZS9wNS5SZW5kZXJlcicpO1xuX2RlcmVxXygnLi9wNS5NYXRyaXgnKTtcblxuXG52YXIgZGVmYXVsdFNoYWRlcnMgPSB7XG4gIGltbWVkaWF0ZVZlcnQ6IFwiYXR0cmlidXRlIHZlYzMgYVBvc2l0aW9uO1xcbmF0dHJpYnV0ZSB2ZWM0IGFWZXJ0ZXhDb2xvcjtcXG5cXG51bmlmb3JtIG1hdDQgdU1vZGVsVmlld01hdHJpeDtcXG51bmlmb3JtIG1hdDQgdVByb2plY3Rpb25NYXRyaXg7XFxudW5pZm9ybSBmbG9hdCB1UmVzb2x1dGlvbjtcXG51bmlmb3JtIGZsb2F0IHVQb2ludFNpemU7XFxuXFxudmFyeWluZyB2ZWM0IHZDb2xvcjtcXG52b2lkIG1haW4odm9pZCkge1xcbiAgdmVjNCBwb3NpdGlvblZlYzQgPSB2ZWM0KGFQb3NpdGlvbiwgMS4wKTtcXG4gIGdsX1Bvc2l0aW9uID0gdVByb2plY3Rpb25NYXRyaXggKiB1TW9kZWxWaWV3TWF0cml4ICogcG9zaXRpb25WZWM0O1xcbiAgdkNvbG9yID0gYVZlcnRleENvbG9yO1xcbiAgZ2xfUG9pbnRTaXplID0gdVBvaW50U2l6ZTtcXG59XFxuXCIsXG4gIHZlcnRleENvbG9yVmVydDogXCJhdHRyaWJ1dGUgdmVjMyBhUG9zaXRpb247XFxuYXR0cmlidXRlIHZlYzQgYVZlcnRleENvbG9yO1xcblxcbnVuaWZvcm0gbWF0NCB1TW9kZWxWaWV3TWF0cml4O1xcbnVuaWZvcm0gbWF0NCB1UHJvamVjdGlvbk1hdHJpeDtcXG5cXG52YXJ5aW5nIHZlYzQgdkNvbG9yO1xcblxcbnZvaWQgbWFpbih2b2lkKSB7XFxuICB2ZWM0IHBvc2l0aW9uVmVjNCA9IHZlYzQoYVBvc2l0aW9uLCAxLjApO1xcbiAgZ2xfUG9zaXRpb24gPSB1UHJvamVjdGlvbk1hdHJpeCAqIHVNb2RlbFZpZXdNYXRyaXggKiBwb3NpdGlvblZlYzQ7XFxuICB2Q29sb3IgPSBhVmVydGV4Q29sb3I7XFxufVxcblwiLFxuICB2ZXJ0ZXhDb2xvckZyYWc6IFwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxudmFyeWluZyB2ZWM0IHZDb2xvcjtcXG52b2lkIG1haW4odm9pZCkge1xcbiAgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yO1xcbn1cIixcbiAgbm9ybWFsVmVydDogXCJhdHRyaWJ1dGUgdmVjMyBhUG9zaXRpb247XFxuYXR0cmlidXRlIHZlYzMgYU5vcm1hbDtcXG5hdHRyaWJ1dGUgdmVjMiBhVGV4Q29vcmQ7XFxuXFxudW5pZm9ybSBtYXQ0IHVNb2RlbFZpZXdNYXRyaXg7XFxudW5pZm9ybSBtYXQ0IHVQcm9qZWN0aW9uTWF0cml4O1xcbnVuaWZvcm0gbWF0MyB1Tm9ybWFsTWF0cml4O1xcblxcbnZhcnlpbmcgdmVjMyB2VmVydGV4Tm9ybWFsO1xcbnZhcnlpbmcgaGlnaHAgdmVjMiB2VmVydFRleENvb3JkO1xcblxcbnZvaWQgbWFpbih2b2lkKSB7XFxuICB2ZWM0IHBvc2l0aW9uVmVjNCA9IHZlYzQoYVBvc2l0aW9uLCAxLjApO1xcbiAgZ2xfUG9zaXRpb24gPSB1UHJvamVjdGlvbk1hdHJpeCAqIHVNb2RlbFZpZXdNYXRyaXggKiBwb3NpdGlvblZlYzQ7XFxuICB2VmVydGV4Tm9ybWFsID0gbm9ybWFsaXplKHZlYzMoIHVOb3JtYWxNYXRyaXggKiBhTm9ybWFsICkpO1xcbiAgdlZlcnRUZXhDb29yZCA9IGFUZXhDb29yZDtcXG59XFxuXCIsXG4gIG5vcm1hbEZyYWc6IFwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxudmFyeWluZyB2ZWMzIHZWZXJ0ZXhOb3JtYWw7XFxudm9pZCBtYWluKHZvaWQpIHtcXG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQodlZlcnRleE5vcm1hbCwgMS4wKTtcXG59XCIsXG4gIGJhc2ljRnJhZzogXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG52YXJ5aW5nIHZlYzMgdlZlcnRleE5vcm1hbDtcXG51bmlmb3JtIHZlYzQgdU1hdGVyaWFsQ29sb3I7XFxudm9pZCBtYWluKHZvaWQpIHtcXG4gIGdsX0ZyYWdDb2xvciA9IHVNYXRlcmlhbENvbG9yO1xcbn1cIixcbiAgbGlnaHRWZXJ0OiBcImF0dHJpYnV0ZSB2ZWMzIGFQb3NpdGlvbjtcXG5hdHRyaWJ1dGUgdmVjMyBhTm9ybWFsO1xcbmF0dHJpYnV0ZSB2ZWMyIGFUZXhDb29yZDtcXG5cXG51bmlmb3JtIG1hdDQgdVZpZXdNYXRyaXg7XFxudW5pZm9ybSBtYXQ0IHVNb2RlbFZpZXdNYXRyaXg7XFxudW5pZm9ybSBtYXQ0IHVQcm9qZWN0aW9uTWF0cml4O1xcbnVuaWZvcm0gbWF0MyB1Tm9ybWFsTWF0cml4O1xcbnVuaWZvcm0gaW50IHVBbWJpZW50TGlnaHRDb3VudDtcXG51bmlmb3JtIGludCB1RGlyZWN0aW9uYWxMaWdodENvdW50O1xcbnVuaWZvcm0gaW50IHVQb2ludExpZ2h0Q291bnQ7XFxuXFxudW5pZm9ybSB2ZWMzIHVBbWJpZW50Q29sb3JbOF07XFxudW5pZm9ybSB2ZWMzIHVMaWdodGluZ0RpcmVjdGlvbls4XTtcXG51bmlmb3JtIHZlYzMgdURpcmVjdGlvbmFsQ29sb3JbOF07XFxudW5pZm9ybSB2ZWMzIHVQb2ludExpZ2h0TG9jYXRpb25bOF07XFxudW5pZm9ybSB2ZWMzIHVQb2ludExpZ2h0Q29sb3JbOF07XFxudW5pZm9ybSBib29sIHVTcGVjdWxhcjtcXG5cXG52YXJ5aW5nIHZlYzMgdlZlcnRleE5vcm1hbDtcXG52YXJ5aW5nIHZlYzIgdlZlcnRUZXhDb29yZDtcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0V2VpZ2h0aW5nO1xcblxcbnZvaWQgbWFpbih2b2lkKXtcXG5cXG4gIHZlYzQgcG9zaXRpb25WZWM0ID0gdmVjNChhUG9zaXRpb24sIDEuMCk7XFxuICBnbF9Qb3NpdGlvbiA9IHVQcm9qZWN0aW9uTWF0cml4ICogdU1vZGVsVmlld01hdHJpeCAqIHBvc2l0aW9uVmVjNDtcXG5cXG4gIHZlYzMgdmVydGV4Tm9ybWFsID0gbm9ybWFsaXplKHZlYzMoIHVOb3JtYWxNYXRyaXggKiBhTm9ybWFsICkpO1xcbiAgdlZlcnRleE5vcm1hbCA9IHZlcnRleE5vcm1hbDtcXG4gIHZWZXJ0VGV4Q29vcmQgPSBhVGV4Q29vcmQ7XFxuXFxuICB2ZWM0IG12UG9zaXRpb24gPSB1TW9kZWxWaWV3TWF0cml4ICogdmVjNChhUG9zaXRpb24sIDEuMCk7XFxuICB2ZWMzIGV5ZURpcmVjdGlvbiA9IG5vcm1hbGl6ZSgtbXZQb3NpdGlvbi54eXopO1xcblxcbiAgZmxvYXQgc2hpbmluZXNzID0gMzIuMDtcXG4gIGZsb2F0IHNwZWN1bGFyRmFjdG9yID0gMi4wO1xcbiAgZmxvYXQgZGlmZnVzZUZhY3RvciA9IDAuMztcXG5cXG4gIHZlYzMgYW1iaWVudExpZ2h0RmFjdG9yID0gdmVjMygwLjApO1xcblxcbiAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHtcXG4gICAgaWYgKHVBbWJpZW50TGlnaHRDb3VudCA9PSBpKSBicmVhaztcXG4gICAgYW1iaWVudExpZ2h0RmFjdG9yICs9IHVBbWJpZW50Q29sb3JbaV07XFxuICB9XFxuXFxuXFxuICB2ZWMzIGRpcmVjdGlvbmFsTGlnaHRGYWN0b3IgPSB2ZWMzKDAuMCk7XFxuXFxuICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykge1xcbiAgICBpZiAodURpcmVjdGlvbmFsTGlnaHRDb3VudCA9PSBqKSBicmVhaztcXG4gICAgdmVjMyBkaXIgPSB1TGlnaHRpbmdEaXJlY3Rpb25bal07XFxuICAgIGZsb2F0IGRpcmVjdGlvbmFsTGlnaHRXZWlnaHRpbmcgPSBtYXgoZG90KHZlcnRleE5vcm1hbCwgLWRpciksIDAuMCk7XFxuICAgIGRpcmVjdGlvbmFsTGlnaHRGYWN0b3IgKz0gdURpcmVjdGlvbmFsQ29sb3Jbal0gKiBkaXJlY3Rpb25hbExpZ2h0V2VpZ2h0aW5nO1xcbiAgfVxcblxcblxcbiAgdmVjMyBwb2ludExpZ2h0RmFjdG9yID0gdmVjMygwLjApO1xcblxcbiAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHtcXG4gICAgaWYgKHVQb2ludExpZ2h0Q291bnQgPT0gaykgYnJlYWs7XFxuICAgIHZlYzMgbG9jID0gKHVWaWV3TWF0cml4ICogdmVjNCh1UG9pbnRMaWdodExvY2F0aW9uW2tdLCAxLjApKS54eXo7XFxuICAgIHZlYzMgbGlnaHREaXJlY3Rpb24gPSBub3JtYWxpemUobG9jIC0gbXZQb3NpdGlvbi54eXopO1xcblxcbiAgICBmbG9hdCBkaXJlY3Rpb25hbExpZ2h0V2VpZ2h0aW5nID0gbWF4KGRvdCh2ZXJ0ZXhOb3JtYWwsIGxpZ2h0RGlyZWN0aW9uKSwgMC4wKTtcXG5cXG4gICAgZmxvYXQgc3BlY3VsYXJMaWdodFdlaWdodGluZyA9IDAuMDtcXG4gICAgaWYgKHVTcGVjdWxhciApe1xcbiAgICAgIHZlYzMgcmVmbGVjdGlvbkRpcmVjdGlvbiA9IHJlZmxlY3QoLWxpZ2h0RGlyZWN0aW9uLCB2ZXJ0ZXhOb3JtYWwpO1xcbiAgICAgIHNwZWN1bGFyTGlnaHRXZWlnaHRpbmcgPSBwb3cobWF4KGRvdChyZWZsZWN0aW9uRGlyZWN0aW9uLCBleWVEaXJlY3Rpb24pLCAwLjApLCBzaGluaW5lc3MpO1xcbiAgICB9XFxuXFxuICAgIHBvaW50TGlnaHRGYWN0b3IgKz0gdVBvaW50TGlnaHRDb2xvcltrXSAqIChzcGVjdWxhckZhY3RvciAqIHNwZWN1bGFyTGlnaHRXZWlnaHRpbmdcXG4gICAgICArIGRpcmVjdGlvbmFsTGlnaHRXZWlnaHRpbmcgKiBkaWZmdXNlRmFjdG9yKTtcXG4gIH1cXG5cXG4gIHZMaWdodFdlaWdodGluZyA9ICBhbWJpZW50TGlnaHRGYWN0b3IgKyBkaXJlY3Rpb25hbExpZ2h0RmFjdG9yICsgcG9pbnRMaWdodEZhY3RvcjtcXG59XFxuXCIsXG4gIGxpZ2h0VGV4dHVyZUZyYWc6IFwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuXFxudW5pZm9ybSB2ZWM0IHVNYXRlcmlhbENvbG9yO1xcbnVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1xcbnVuaWZvcm0gYm9vbCBpc1RleHR1cmU7XFxudW5pZm9ybSBib29sIHVVc2VMaWdodGluZztcXG5cXG52YXJ5aW5nIHZlYzMgdkxpZ2h0V2VpZ2h0aW5nO1xcbnZhcnlpbmcgaGlnaHAgdmVjMiB2VmVydFRleENvb3JkO1xcblxcbnZvaWQgbWFpbih2b2lkKSB7XFxuICBnbF9GcmFnQ29sb3IgPSBpc1RleHR1cmUgPyB0ZXh0dXJlMkQodVNhbXBsZXIsIHZWZXJ0VGV4Q29vcmQpIDogdU1hdGVyaWFsQ29sb3I7XFxuICBpZiAodVVzZUxpZ2h0aW5nKVxcbiAgICBnbF9GcmFnQ29sb3IucmdiICo9IHZMaWdodFdlaWdodGluZztcXG59XCIsXG4gIHBob25nVmVydDogXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG5cXG5hdHRyaWJ1dGUgdmVjMyBhUG9zaXRpb247XFxuYXR0cmlidXRlIHZlYzMgYU5vcm1hbDtcXG5hdHRyaWJ1dGUgdmVjMiBhVGV4Q29vcmQ7XFxuXFxudW5pZm9ybSB2ZWMzIHVBbWJpZW50Q29sb3JbOF07XFxuXFxudW5pZm9ybSBtYXQ0IHVNb2RlbFZpZXdNYXRyaXg7XFxudW5pZm9ybSBtYXQ0IHVQcm9qZWN0aW9uTWF0cml4O1xcbnVuaWZvcm0gbWF0MyB1Tm9ybWFsTWF0cml4O1xcbnVuaWZvcm0gaW50IHVBbWJpZW50TGlnaHRDb3VudDtcXG5cXG52YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG52YXJ5aW5nIHZlYzIgdlRleENvb3JkO1xcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbnZhcnlpbmcgdmVjMyB2QW1iaWVudENvbG9yO1xcblxcbnZvaWQgbWFpbih2b2lkKXtcXG5cXG4gIHZlYzQgdmlld01vZGVsUG9zaXRpb24gPSB1TW9kZWxWaWV3TWF0cml4ICogdmVjNChhUG9zaXRpb24sIDEuMCk7XFxuXFxuICAvLyBQYXNzIHZhcnlpbmdzIHRvIGZyYWdtZW50IHNoYWRlclxcbiAgdlZpZXdQb3NpdGlvbiA9IHZpZXdNb2RlbFBvc2l0aW9uLnh5ejtcXG4gIGdsX1Bvc2l0aW9uID0gdVByb2plY3Rpb25NYXRyaXggKiB2aWV3TW9kZWxQb3NpdGlvbjsgIFxcblxcbiAgdk5vcm1hbCA9IG5vcm1hbGl6ZSh1Tm9ybWFsTWF0cml4ICogbm9ybWFsaXplKGFOb3JtYWwpKTtcXG4gIHZUZXhDb29yZCA9IGFUZXhDb29yZDtcXG5cXG4gIHZBbWJpZW50Q29sb3IgPSB2ZWMzKDAuMCk7XFxuICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykge1xcbiAgICBpZiAodUFtYmllbnRMaWdodENvdW50ID09IGkpIGJyZWFrO1xcbiAgICB2QW1iaWVudENvbG9yICs9IHVBbWJpZW50Q29sb3JbaV07XFxuICB9XFxufVxcblwiLFxuICBwaG9uZ0ZyYWc6IFwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuXFxuLy91bmlmb3JtIG1hdDQgdU1vZGVsVmlld01hdHJpeDtcXG51bmlmb3JtIG1hdDQgdVZpZXdNYXRyaXg7XFxuXFxudW5pZm9ybSB2ZWM0IHVNYXRlcmlhbENvbG9yO1xcbnVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1xcbnVuaWZvcm0gYm9vbCBpc1RleHR1cmU7XFxudW5pZm9ybSBib29sIHVVc2VMaWdodGluZztcXG5cXG51bmlmb3JtIHZlYzMgdUxpZ2h0aW5nRGlyZWN0aW9uWzhdO1xcbnVuaWZvcm0gdmVjMyB1RGlyZWN0aW9uYWxDb2xvcls4XTtcXG51bmlmb3JtIHZlYzMgdVBvaW50TGlnaHRMb2NhdGlvbls4XTtcXG51bmlmb3JtIHZlYzMgdVBvaW50TGlnaHRDb2xvcls4XTtcXG51bmlmb3JtIGJvb2wgdVNwZWN1bGFyO1xcblxcbnVuaWZvcm0gaW50IHVEaXJlY3Rpb25hbExpZ2h0Q291bnQ7XFxudW5pZm9ybSBpbnQgdVBvaW50TGlnaHRDb3VudDtcXG5cXG52YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG52YXJ5aW5nIHZlYzIgdlRleENvb3JkO1xcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbnZhcnlpbmcgdmVjMyB2QW1iaWVudENvbG9yO1xcblxcbnZlYzMgVjtcXG52ZWMzIE47XFxuXFxuY29uc3QgZmxvYXQgc2hpbmluZXNzID0gMzIuMDtcXG5jb25zdCBmbG9hdCBzcGVjdWxhckZhY3RvciA9IDIuMDtcXG5jb25zdCBmbG9hdCBkaWZmdXNlRmFjdG9yID0gMC43MztcXG5cXG5zdHJ1Y3QgTGlnaHRSZXN1bHQge1xcblxcdGZsb2F0IHNwZWN1bGFyO1xcblxcdGZsb2F0IGRpZmZ1c2U7XFxufTtcXG5cXG5mbG9hdCBwaG9uZ1NwZWN1bGFyKFxcbiAgdmVjMyBsaWdodERpcmVjdGlvbixcXG4gIHZlYzMgdmlld0RpcmVjdGlvbixcXG4gIHZlYzMgc3VyZmFjZU5vcm1hbCxcXG4gIGZsb2F0IHNoaW5pbmVzcykge1xcblxcbiAgdmVjMyBSID0gbm9ybWFsaXplKHJlZmxlY3QoLWxpZ2h0RGlyZWN0aW9uLCBzdXJmYWNlTm9ybWFsKSk7ICBcXG4gIHJldHVybiBwb3cobWF4KDAuMCwgZG90KFIsIHZpZXdEaXJlY3Rpb24pKSwgc2hpbmluZXNzKTtcXG59XFxuXFxuZmxvYXQgbGFtYmVydERpZmZ1c2UoXFxuICB2ZWMzIGxpZ2h0RGlyZWN0aW9uLFxcbiAgdmVjMyBzdXJmYWNlTm9ybWFsKSB7XFxuICByZXR1cm4gbWF4KDAuMCwgZG90KC1saWdodERpcmVjdGlvbiwgc3VyZmFjZU5vcm1hbCkpO1xcbn1cXG5cXG5MaWdodFJlc3VsdCBsaWdodCh2ZWMzIGxpZ2h0VmVjdG9yKSB7XFxuXFxuICB2ZWMzIEwgPSBub3JtYWxpemUobGlnaHRWZWN0b3IpO1xcblxcbiAgLy9jb21wdXRlIG91ciBkaWZmdXNlICYgc3BlY3VsYXIgdGVybXNcXG4gIExpZ2h0UmVzdWx0IGxyO1xcbiAgaWYgKHVTcGVjdWxhcilcXG4gICAgbHIuc3BlY3VsYXIgPSBwaG9uZ1NwZWN1bGFyKEwsIFYsIE4sIHNoaW5pbmVzcyk7XFxuICBsci5kaWZmdXNlID0gbGFtYmVydERpZmZ1c2UoTCwgTik7XFxuICByZXR1cm4gbHI7XFxufVxcblxcbnZvaWQgbWFpbih2b2lkKSB7XFxuXFxuICBWID0gbm9ybWFsaXplKHZWaWV3UG9zaXRpb24pO1xcbiAgTiA9IHZOb3JtYWw7XFxuXFxuICB2ZWMzIGRpZmZ1c2UgPSB2ZWMzKDAuMCk7XFxuICBmbG9hdCBzcGVjdWxhciA9IDAuMDtcXG5cXG4gIGZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKSB7XFxuICAgIGlmICh1RGlyZWN0aW9uYWxMaWdodENvdW50ID09IGopIGJyZWFrO1xcblxcbiAgICBMaWdodFJlc3VsdCByZXN1bHQgPSBsaWdodCh1TGlnaHRpbmdEaXJlY3Rpb25bal0pO1xcbiAgICBkaWZmdXNlICs9IHJlc3VsdC5kaWZmdXNlICogdURpcmVjdGlvbmFsQ29sb3Jbal07XFxuICAgIHNwZWN1bGFyICs9IHJlc3VsdC5zcGVjdWxhcjtcXG4gIH1cXG5cXG4gIGZvciAoaW50IGsgPSAwOyBrIDwgODsgaysrKSB7XFxuICAgIGlmICh1UG9pbnRMaWdodENvdW50ID09IGspIGJyZWFrO1xcblxcbiAgICB2ZWMzIGxpZ2h0UG9zaXRpb24gPSAodVZpZXdNYXRyaXggKiB2ZWM0KHVQb2ludExpZ2h0TG9jYXRpb25ba10sIDEuMCkpLnh5ejtcXG4gICAgdmVjMyBsaWdodFZlY3RvciA9IHZWaWV3UG9zaXRpb24gLSBsaWdodFBvc2l0aW9uO1xcblxcdFxcbiAgICAvL2NhbGN1bGF0ZSBhdHRlbnVhdGlvblxcbiAgICBmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKGxpZ2h0VmVjdG9yKTtcXG4gICAgZmxvYXQgZmFsbG9mZiA9IDUwMC4wIC8gKGxpZ2h0RGlzdGFuY2UgKyA1MDAuMCk7XFxuXFxuICAgIExpZ2h0UmVzdWx0IHJlc3VsdCA9IGxpZ2h0KGxpZ2h0VmVjdG9yKTtcXG4gICAgZGlmZnVzZSArPSByZXN1bHQuZGlmZnVzZSAqIGZhbGxvZmYgKiB1UG9pbnRMaWdodENvbG9yW2tdO1xcbiAgICBzcGVjdWxhciArPSByZXN1bHQuc3BlY3VsYXIgKiBmYWxsb2ZmO1xcbiAgfVxcblxcbiAgZ2xfRnJhZ0NvbG9yID0gaXNUZXh0dXJlID8gdGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4Q29vcmQpIDogdU1hdGVyaWFsQ29sb3I7XFxuICBnbF9GcmFnQ29sb3IucmdiID0gZ2xfRnJhZ0NvbG9yLnJnYiAqIChkaWZmdXNlICogZGlmZnVzZUZhY3RvciArIHZBbWJpZW50Q29sb3IpICsgc3BlY3VsYXIgKiBzcGVjdWxhckZhY3RvcjtcXG59XCIsXG4gIGxpbmVWZXJ0OiBcIi8qXFxuICBQYXJ0IG9mIHRoZSBQcm9jZXNzaW5nIHByb2plY3QgLSBodHRwOi8vcHJvY2Vzc2luZy5vcmdcXG4gIENvcHlyaWdodCAoYykgMjAxMi0xNSBUaGUgUHJvY2Vzc2luZyBGb3VuZGF0aW9uXFxuICBDb3B5cmlnaHQgKGMpIDIwMDQtMTIgQmVuIEZyeSBhbmQgQ2FzZXkgUmVhc1xcbiAgQ29weXJpZ2h0IChjKSAyMDAxLTA0IE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3lcXG4gIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcXG4gIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcXG4gIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4xLlxcbiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXFxuICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxcbiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcXG4gIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXFxuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWxcXG4gIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZVxcbiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCxcXG4gIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQVxcbiovXFxuXFxuI2RlZmluZSBQUk9DRVNTSU5HX0xJTkVfU0hBREVSXFxuXFxudW5pZm9ybSBtYXQ0IHVNb2RlbFZpZXdNYXRyaXg7XFxudW5pZm9ybSBtYXQ0IHVQcm9qZWN0aW9uTWF0cml4O1xcbnVuaWZvcm0gZmxvYXQgdVN0cm9rZVdlaWdodDtcXG5cXG51bmlmb3JtIHZlYzQgdVZpZXdwb3J0O1xcbnZlYzMgc2NhbGUgPSB2ZWMzKDEuMCk7XFxuXFxuYXR0cmlidXRlIHZlYzQgYVBvc2l0aW9uO1xcbmF0dHJpYnV0ZSB2ZWM0IGFEaXJlY3Rpb247XFxuICBcXG52b2lkIG1haW4oKSB7XFxuICB2ZWM0IHBvc3AgPSB1TW9kZWxWaWV3TWF0cml4ICogYVBvc2l0aW9uO1xcbiAgdmVjNCBwb3NxID0gdU1vZGVsVmlld01hdHJpeCAqIChhUG9zaXRpb24gKyB2ZWM0KGFEaXJlY3Rpb24ueHl6LCAwKSk7XFxuXFxuICAvLyBNb3ZpbmcgdmVydGljZXMgc2xpZ2h0bHkgdG93YXJkIHRoZSBjYW1lcmFcXG4gIC8vIHRvIGF2b2lkIGRlcHRoLWZpZ2h0aW5nIHdpdGggdGhlIGZpbGwgdHJpYW5nbGVzLlxcbiAgLy8gRGlzY3Vzc2VkIGhlcmU6XFxuICAvLyBodHRwOi8vd3d3Lm9wZW5nbC5vcmcvZGlzY3Vzc2lvbl9ib2FyZHMvdWJidGhyZWFkcy5waHA/dWJiPXNob3dmbGF0Jk51bWJlcj0yNTI4NDggIFxcbiAgcG9zcC54eXogPSBwb3NwLnh5eiAqIHNjYWxlO1xcbiAgcG9zcS54eXogPSBwb3NxLnh5eiAqIHNjYWxlO1xcblxcbiAgdmVjNCBwID0gdVByb2plY3Rpb25NYXRyaXggKiBwb3NwO1xcbiAgdmVjNCBxID0gdVByb2plY3Rpb25NYXRyaXggKiBwb3NxO1xcblxcbiAgLy8gZm9ybXVsYSB0byBjb252ZXJ0IGZyb20gY2xpcCBzcGFjZSAocmFuZ2UgLTEuLjEpIHRvIHNjcmVlbiBzcGFjZSAocmFuZ2UgMC4uW3dpZHRoIG9yIGhlaWdodF0pXFxuICAvLyBzY3JlZW5fcCA9IChwLnh5L3AudyArIDwxLDE+KSAqIDAuNSAqIHVWaWV3cG9ydC56d1xcblxcbiAgLy8gcHJldmVudCBkaXZpc2lvbiBieSBXIGJ5IHRyYW5zZm9ybWluZyB0aGUgdGFuZ2VudCBmb3JtdWxhIChkaXYgYnkgMCBjYXVzZXNcXG4gIC8vIHRoZSBsaW5lIHRvIGRpc2FwcGVhciwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nL3Byb2Nlc3NpbmcvaXNzdWVzLzUxODMpXFxuICAvLyB0ID0gc2NyZWVuX3EgLSBzY3JlZW5fcFxcbiAgLy9cXG4gIC8vIHRhbmdlbnQgaXMgbm9ybWFsaXplZCBhbmQgd2UgZG9uJ3QgY2FyZSB3aGljaCBhRGlyZWN0aW9uIGl0IHBvaW50cyB0byAoKy0pXFxuICAvLyB0ID0gKy0gbm9ybWFsaXplKCBzY3JlZW5fcSAtIHNjcmVlbl9wIClcXG4gIC8vIHQgPSArLSBub3JtYWxpemUoIChxLnh5L3Eudys8MSwxPikqMC41KnVWaWV3cG9ydC56dyAtIChwLnh5L3Audys8MSwxPikqMC41KnVWaWV3cG9ydC56dyApXFxuICAvL1xcbiAgLy8gZXh0cmFjdCBjb21tb24gZmFjdG9yLCA8MSwxPiAtIDwxLDE+IGNhbmNlbHMgb3V0XFxuICAvLyB0ID0gKy0gbm9ybWFsaXplKCAocS54eS9xLncgLSBwLnh5L3AudykgKiAwLjUgKiB1Vmlld3BvcnQuencgKVxcbiAgLy9cXG4gIC8vIGNvbnZlcnQgdG8gY29tbW9uIGRpdmlzb3JcXG4gIC8vIHQgPSArLSBub3JtYWxpemUoICgocS54eSpwLncgLSBwLnh5KnEudykgLyAocC53KnEudykpICogMC41ICogdVZpZXdwb3J0Lnp3IClcXG4gIC8vXFxuICAvLyByZW1vdmUgdGhlIGNvbW1vbiBzY2FsYXIgZGl2aXNvci9mYWN0b3IsIG5vdCBuZWVkZWQgZHVlIHRvIG5vcm1hbGl6ZSBhbmQgKy1cXG4gIC8vIChrZWVwIHVWaWV3cG9ydCAtIGNhbid0IHJlbW92ZSBiZWNhdXNlIGl0IGhhcyBkaWZmZXJlbnQgY29tcG9uZW50cyBmb3IgeCBhbmQgeVxcbiAgLy8gIGFuZCBjb3JyZWN0cyBmb3IgYXNwZWN0IHJhdGlvLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmcvcHJvY2Vzc2luZy9pc3N1ZXMvNTE4MSlcXG4gIC8vIHQgPSArLSBub3JtYWxpemUoIChxLnh5KnAudyAtIHAueHkqcS53KSAqIHVWaWV3cG9ydC56dyApXFxuXFxuICB2ZWMyIHRhbmdlbnQgPSBub3JtYWxpemUoKHEueHkqcC53IC0gcC54eSpxLncpICogdVZpZXdwb3J0Lnp3KTtcXG5cXG4gIC8vIGZsaXAgdGFuZ2VudCB0byBub3JtYWwgKGl0J3MgYWxyZWFkeSBub3JtYWxpemVkKVxcbiAgdmVjMiBub3JtYWwgPSB2ZWMyKC10YW5nZW50LnksIHRhbmdlbnQueCk7XFxuXFxuICBmbG9hdCB0aGlja25lc3MgPSBhRGlyZWN0aW9uLncgKiB1U3Ryb2tlV2VpZ2h0O1xcbiAgdmVjMiBvZmZzZXQgPSBub3JtYWwgKiB0aGlja25lc3MgLyAyLjA7XFxuXFxuICAvLyBQZXJzcGVjdGl2ZSAtLS1cXG4gIC8vIGNvbnZlcnQgZnJvbSB3b3JsZCB0byBjbGlwIGJ5IG11bHRpcGx5aW5nIHdpdGggcHJvamVjdGlvbiBzY2FsaW5nIGZhY3RvclxcbiAgLy8gdG8gZ2V0IHRoZSByaWdodCB0aGlja25lc3MgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy9wcm9jZXNzaW5nL2lzc3Vlcy81MTgyKVxcbiAgLy8gaW52ZXJ0IFksIHByb2plY3Rpb25zIGluIFByb2Nlc3NpbmcgaW52ZXJ0IFlcXG4gIHZlYzIgcGVyc3BTY2FsZSA9ICh1UHJvamVjdGlvbk1hdHJpeCAqIHZlYzQoMSwgLTEsIDAsIDApKS54eTtcXG5cXG4gIC8vIE5vIFBlcnNwZWN0aXZlIC0tLVxcbiAgLy8gbXVsdGlwbHkgYnkgVyAodG8gY2FuY2VsIG91dCBkaXZpc2lvbiBieSBXIGxhdGVyIGluIHRoZSBwaXBlbGluZSkgYW5kXFxuICAvLyBjb252ZXJ0IGZyb20gc2NyZWVuIHRvIGNsaXAgKGRlcml2ZWQgZnJvbSBjbGlwIHRvIHNjcmVlbiBhYm92ZSlcXG4gIHZlYzIgbm9QZXJzcFNjYWxlID0gcC53IC8gKDAuNSAqIHVWaWV3cG9ydC56dyk7XFxuXFxuICAvL2dsX1Bvc2l0aW9uLnh5ID0gcC54eSArIG9mZnNldC54eSAqIG1peChub1BlcnNwU2NhbGUsIHBlcnNwU2NhbGUsIGZsb2F0KHBlcnNwZWN0aXZlID4gMCkpO1xcbiAgZ2xfUG9zaXRpb24ueHkgPSBwLnh5ICsgb2Zmc2V0Lnh5ICogcGVyc3BTY2FsZTtcXG4gIGdsX1Bvc2l0aW9uLnp3ID0gcC56dztcXG59XFxuXCIsXG4gIGxpbmVGcmFnOiBcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbnByZWNpc2lvbiBtZWRpdW1wIGludDtcXG5cXG51bmlmb3JtIHZlYzQgdU1hdGVyaWFsQ29sb3I7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgZ2xfRnJhZ0NvbG9yID0gdU1hdGVyaWFsQ29sb3I7XFxufVwiXG59O1xuXG4vKipcbiAqIDNEIGdyYXBoaWNzIGNsYXNzXG4gKiBAcHJpdmF0ZVxuICogQGNsYXNzIHA1LlJlbmRlcmVyR0xcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgcDUuUmVuZGVyZXJcbiAqIEB0b2RvIGV4dGVuZCBjbGFzcyB0byBpbmNsdWRlIHB1YmxpYyBtZXRob2QgZm9yIG9mZnNjcmVlblxuICogcmVuZGVyaW5nIChGQk8pLlxuICpcbiAqL1xucDUuUmVuZGVyZXJHTCA9IGZ1bmN0aW9uKGVsdCwgcEluc3QsIGlzTWFpbkNhbnZhcywgYXR0cikge1xuICBwNS5SZW5kZXJlci5jYWxsKHRoaXMsIGVsdCwgcEluc3QsIGlzTWFpbkNhbnZhcyk7XG4gIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICBhdHRyID0gYXR0ciB8fCB7fTtcbiAgdGhpcy5hdHRyaWJ1dGVzLmFscGhhID0gYXR0ci5hbHBoYSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGF0dHIuYWxwaGE7XG4gIHRoaXMuYXR0cmlidXRlcy5kZXB0aCA9IGF0dHIuZGVwdGggPT09IHVuZGVmaW5lZCA/IHRydWUgOiBhdHRyLmRlcHRoO1xuICB0aGlzLmF0dHJpYnV0ZXMuc3RlbmNpbCA9IGF0dHIuc3RlbmNpbCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGF0dHIuc3RlbmNpbDtcbiAgdGhpcy5hdHRyaWJ1dGVzLmFudGlhbGlhcyA9XG4gICAgYXR0ci5hbnRpYWxpYXMgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogYXR0ci5hbnRpYWxpYXM7XG4gIHRoaXMuYXR0cmlidXRlcy5wcmVtdWx0aXBsaWVkQWxwaGEgPVxuICAgIGF0dHIucHJlbXVsdGlwbGllZEFscGhhID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGF0dHIucHJlbXVsdGlwbGllZEFscGhhO1xuICB0aGlzLmF0dHJpYnV0ZXMucHJlc2VydmVEcmF3aW5nQnVmZmVyID1cbiAgICBhdHRyLnByZXNlcnZlRHJhd2luZ0J1ZmZlciA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHRydWVcbiAgICAgIDogYXR0ci5wcmVzZXJ2ZURyYXdpbmdCdWZmZXI7XG4gIHRoaXMuYXR0cmlidXRlcy5wZXJQaXhlbExpZ2h0aW5nID1cbiAgICBhdHRyLnBlclBpeGVsTGlnaHRpbmcgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogYXR0ci5wZXJQaXhlbExpZ2h0aW5nO1xuICB0aGlzLl9pbml0Q29udGV4dCgpO1xuICB0aGlzLmlzUDNEID0gdHJ1ZTsgLy9sZXRzIHVzIGtub3cgd2UncmUgaW4gM2QgbW9kZVxuICB0aGlzLkdMID0gdGhpcy5kcmF3aW5nQ29udGV4dDtcblxuICAvLyBsaWdodHNcblxuICB0aGlzLmFtYmllbnRMaWdodENvbG9ycyA9IFtdO1xuICB0aGlzLmRpcmVjdGlvbmFsTGlnaHREaXJlY3Rpb25zID0gW107XG4gIHRoaXMuZGlyZWN0aW9uYWxMaWdodENvbG9ycyA9IFtdO1xuXG4gIHRoaXMucG9pbnRMaWdodFBvc2l0aW9ucyA9IFtdO1xuICB0aGlzLnBvaW50TGlnaHRDb2xvcnMgPSBbXTtcblxuICAvKipcbiAgICogbW9kZWwgdmlldywgcHJvamVjdGlvbiwgJiBub3JtYWxcbiAgICogbWF0cmljZXNcbiAgICovXG4gIHRoaXMudU1WTWF0cml4ID0gbmV3IHA1Lk1hdHJpeCgpO1xuICB0aGlzLnVQTWF0cml4ID0gbmV3IHA1Lk1hdHJpeCgpO1xuICB0aGlzLnVOTWF0cml4ID0gbmV3IHA1Lk1hdHJpeCgnbWF0MycpO1xuXG4gIC8vIENhbWVyYVxuICB0aGlzLl9jdXJDYW1lcmEgPSBudWxsO1xuICAvLyBkZWZhdWx0IGNhbWVyYSBzZXR0aW5ncywgdGhlbiB1c2UgdGhvc2UgdG8gcG9wdWxhdGUgY2FtZXJhIGZpZWxkcy5cbiAgdGhpcy5fY29tcHV0ZUNhbWVyYURlZmF1bHRTZXR0aW5ncygpO1xuICB0aGlzLmNhbWVyYUZPViA9IHRoaXMuZGVmYXVsdENhbWVyYUZPVjtcbiAgdGhpcy5jYW1lcmFBc3BlY3QgPSB0aGlzLmRlZmF1bHRBc3BlY3Q7XG4gIHRoaXMuY2FtZXJhWCA9IHRoaXMuZGVmYXVsdENhbWVyYVg7XG4gIHRoaXMuY2FtZXJhWSA9IHRoaXMuZGVmYXVsdENhbWVyYVk7XG4gIHRoaXMuY2FtZXJhWiA9IHRoaXMuZGVmYXVsdENhbWVyYVo7XG4gIHRoaXMuY2FtZXJhTmVhciA9IHRoaXMuZGVmYXVsdENhbWVyYU5lYXI7XG4gIHRoaXMuY2FtZXJhRmFyID0gdGhpcy5kZWZhdWx0Q2FtZXJhRmFyO1xuICB0aGlzLmNhbWVyYU1hdHJpeCA9IG5ldyBwNS5NYXRyaXgoKTtcbiAgdGhpcy5jYW1lcmEoKTsgLy8gc2V0IGRlZmF1bHQgY2FtZXJhIG1hdHJpY2VzXG5cbiAgLy9HZW9tZXRyeSAmIE1hdGVyaWFsIGhhc2hlc1xuICB0aGlzLmdIYXNoID0ge307XG5cbiAgdGhpcy5fZGVmYXVsdExpZ2h0U2hhZGVyID0gdW5kZWZpbmVkO1xuICB0aGlzLl9kZWZhdWx0SW1tZWRpYXRlTW9kZVNoYWRlciA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fZGVmYXVsdE5vcm1hbFNoYWRlciA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fZGVmYXVsdENvbG9yU2hhZGVyID0gdW5kZWZpbmVkO1xuXG4gIHRoaXMuY3VyRmlsbFNoYWRlciA9IHVuZGVmaW5lZDtcbiAgdGhpcy5jdXJTdHJva2VTaGFkZXIgPSB1bmRlZmluZWQ7XG5cbiAgdGhpcy5fdXNlQ29sb3JTaGFkZXIoKTtcbiAgdGhpcy5zZXRTdHJva2VTaGFkZXIodGhpcy5fZ2V0TGluZVNoYWRlcigpKTtcblxuICAvL0ltZWRpYXRlIE1vZGVcbiAgLy9kZWZhdWx0IGRyYXdpbmcgaXMgZG9uZSBpbiBSZXRhaW5lZCBNb2RlXG4gIHRoaXMuaXNJbW1lZGlhdGVEcmF3aW5nID0gZmFsc2U7XG4gIHRoaXMuaW1tZWRpYXRlTW9kZSA9IHt9O1xuXG4gIC8vIG5vdGU6IG11c3QgY2FsbCBmaWxsKCkgYW5kIHN0cm9rZSAoKSBBRlRFUlxuICAvLyBkZWZhdWx0IHNoYWRlciBoYXMgYmVlbiBzZXQuXG4gIHRoaXMuZmlsbCgyNTUsIDI1NSwgMjU1LCAyNTUpO1xuICAvL3RoaXMuc3Ryb2tlKDAsIDAsIDAsIDI1NSk7XG4gIHRoaXMucG9pbnRTaXplID0gNS4wOyAvL2RlZmF1bHQgcG9pbnQgc2l6ZVxuICB0aGlzLnN0cm9rZVdlaWdodCgyKTtcbiAgdGhpcy5zdHJva2UoMCwgMCwgMCk7XG4gIC8vIGFycmF5IG9mIHRleHR1cmVzIGNyZWF0ZWQgaW4gdGhpcyBnbCBjb250ZXh0IHZpYSB0aGlzLmdldFRleHR1cmUoc3JjKVxuICB0aGlzLnRleHR1cmVzID0gW107XG4gIHJldHVybiB0aGlzO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHA1LlJlbmRlcmVyLnByb3RvdHlwZSk7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFNldHRpbmdcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX2luaXRDb250ZXh0ID0gZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdGhpcy5kcmF3aW5nQ29udGV4dCA9XG4gICAgICB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIHRoaXMuYXR0cmlidXRlcykgfHxcbiAgICAgIHRoaXMuY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIHRoaXMuYXR0cmlidXRlcyk7XG4gICAgaWYgKHRoaXMuZHJhd2luZ0NvbnRleHQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgY3JlYXRpbmcgd2ViZ2wgY29udGV4dCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygncDUuUmVuZGVyZXJHTDogZW5hYmxlZCB3ZWJnbCBjb250ZXh0Jyk7XG4gICAgICB2YXIgZ2wgPSB0aGlzLmRyYXdpbmdDb250ZXh0O1xuICAgICAgZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgZ2wuZGVwdGhGdW5jKGdsLkxFUVVBTCk7XG4gICAgICBnbC52aWV3cG9ydCgwLCAwLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQpO1xuICAgICAgdGhpcy5fdmlld3BvcnQgPSB0aGlzLmRyYXdpbmdDb250ZXh0LmdldFBhcmFtZXRlcihcbiAgICAgICAgdGhpcy5kcmF3aW5nQ29udGV4dC5WSUVXUE9SVFxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVyKTtcbiAgfVxufTtcblxuLy9UaGlzIGlzIGhlbHBlciBmdW5jdGlvbiB0byByZXNldCB0aGUgY29udGV4dCBhbnl0aW1lIHRoZSBhdHRyaWJ1dGVzXG4vL2FyZSBjaGFuZ2VkIHdpdGggc2V0QXR0cmlidXRlcygpXG5cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLl9yZXNldENvbnRleHQgPSBmdW5jdGlvbihhdHRyLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgdyA9IHRoaXMud2lkdGg7XG4gIHZhciBoID0gdGhpcy5oZWlnaHQ7XG4gIHZhciBkZWZhdWx0SWQgPSB0aGlzLmNhbnZhcy5pZDtcbiAgdmFyIGMgPSB0aGlzLmNhbnZhcztcbiAgaWYgKGMpIHtcbiAgICBjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7XG4gIH1cbiAgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBjLmlkID0gZGVmYXVsdElkO1xuICBpZiAodGhpcy5fcEluc3QuX3VzZXJOb2RlKSB7XG4gICAgdGhpcy5fcEluc3QuX3VzZXJOb2RlLmFwcGVuZENoaWxkKGMpO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYyk7XG4gIH1cbiAgdGhpcy5fcEluc3QuY2FudmFzID0gYztcblxuICB2YXIgcmVuZGVyZXIgPSBuZXcgcDUuUmVuZGVyZXJHTCh0aGlzLl9wSW5zdC5jYW52YXMsIHRoaXMuX3BJbnN0LCB0cnVlLCBhdHRyKTtcbiAgdGhpcy5fcEluc3QuX3NldFByb3BlcnR5KCdfcmVuZGVyZXInLCByZW5kZXJlcik7XG4gIHJlbmRlcmVyLnJlc2l6ZSh3LCBoKTtcbiAgcmVuZGVyZXIuX2FwcGx5RGVmYXVsdHMoKTtcbiAgdGhpcy5fcEluc3QuX2VsZW1lbnRzLnB1c2gocmVuZGVyZXIpO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvL3NldFRpbWVvdXQgd2l0aCAwIGZvcmNlcyB0aGUgdGFzayB0byB0aGUgYmFjayBvZiB0aGUgcXVldWUsIHRoaXMgZW5zdXJlcyB0aGF0XG4gICAgLy93ZSBmaW5pc2ggc3dpdGNoaW5nIG91dCB0aGUgcmVuZGVyZXJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2suYXBwbHkod2luZG93Ll9yZW5kZXJlciwgb3B0aW9ucyk7XG4gICAgfSwgMCk7XG4gIH1cbn07XG4vKipcbiAqIEBtb2R1bGUgUmVuZGVyaW5nXG4gKiBAc3VibW9kdWxlIFJlbmRlcmluZ1xuICogQGZvciBwNVxuICovXG4vKipcbiAqIFNldCBhdHRyaWJ1dGVzIGZvciB0aGUgV2ViR0wgRHJhd2luZyBjb250ZXh0LlxuICogVGhpcyBpcyBhIHdheSBvZiBhZGp1c3Rpbmcgd2F5cyB0aGF0IHRoZSBXZWJHTFxuICogcmVuZGVyZXIgd29ya3MgdG8gZmluZS10dW5lIHRoZSBkaXNwbGF5IGFuZCBwZXJmb3JtYW5jZS5cbiAqIFRoaXMgc2hvdWxkIGJlIHB1dCBpbiBzZXR1cCgpLlxuICogVGhlIGF2YWlsYWJsZSBhdHRyaWJ1dGVzIGFyZTpcbiAqIDxicj5cbiAqIGFscGhhIC0gaW5kaWNhdGVzIGlmIHRoZSBjYW52YXMgY29udGFpbnMgYW4gYWxwaGEgYnVmZmVyXG4gKiBkZWZhdWx0IGlzIHRydWVcbiAqIDxicj48YnI+XG4gKiBkZXB0aCAtIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYSBkZXB0aCBidWZmZXJcbiAqIG9mIGF0IGxlYXN0IDE2IGJpdHMgLSBkZWZhdWx0IGlzIHRydWVcbiAqIDxicj48YnI+XG4gKiBzdGVuY2lsIC0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRyYXdpbmcgYnVmZmVyIGhhcyBhIHN0ZW5jaWwgYnVmZmVyXG4gKiBvZiBhdCBsZWFzdCA4IGJpdHNcbiAqIDxicj48YnI+XG4gKiBhbnRpYWxpYXMgLSBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gcGVyZm9ybSBhbnRpLWFsaWFzaW5nXG4gKiBkZWZhdWx0IGlzIGZhbHNlXG4gKiA8YnI+PGJyPlxuICogcHJlbXVsdGlwbGllZEFscGhhIC0gaW5kaWNhdGVzIHRoYXQgdGhlIHBhZ2UgY29tcG9zaXRvciB3aWxsIGFzc3VtZVxuICogdGhlIGRyYXdpbmcgYnVmZmVyIGNvbnRhaW5zIGNvbG9ycyB3aXRoIHByZS1tdWx0aXBsaWVkIGFscGhhXG4gKiBkZWZhdWx0IGlzIGZhbHNlXG4gKiA8YnI+PGJyPlxuICogcHJlc2VydmVEcmF3aW5nQnVmZmVyIC0gaWYgdHJ1ZSB0aGUgYnVmZmVycyB3aWxsIG5vdCBiZSBjbGVhcmVkIGFuZFxuICogYW5kIHdpbGwgcHJlc2VydmUgdGhlaXIgdmFsdWVzIHVudGlsIGNsZWFyZWQgb3Igb3ZlcndyaXR0ZW4gYnkgYXV0aG9yXG4gKiAobm90ZSB0aGF0IHA1IGNsZWFycyBhdXRvbWF0aWNhbGx5IG9uIGRyYXcgbG9vcClcbiAqIGRlZmF1bHQgaXMgdHJ1ZVxuICogPGJyPjxicj5cbiAqIHBlclBpeGVsTGlnaHRpbmcgLSBpZiB0cnVlLCBwZXItcGl4ZWwgbGlnaHRpbmcgd2lsbCBiZSB1c2VkIGluIHRoZVxuICogbGlnaHRpbmcgc2hhZGVyLlxuICogZGVmYXVsdCBpcyBmYWxzZVxuICogPGJyPjxicj5cbiAqIEBtZXRob2Qgc2V0QXR0cmlidXRlc1xuICogQGZvciBwNVxuICogQHBhcmFtICB7U3RyaW5nfSAga2V5IE5hbWUgb2YgYXR0cmlidXRlXG4gKiBAcGFyYW0gIHtCb29sZWFufSAgICAgICAgdmFsdWUgTmV3IHZhbHVlIG9mIG5hbWVkIGF0dHJpYnV0ZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDI1NSk7XG4gKiAgIHB1c2goKTtcbiAqICAgcm90YXRlWihmcmFtZUNvdW50ICogMC4wMik7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDIpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAyKTtcbiAqICAgZmlsbCgwLCAwLCAwKTtcbiAqICAgYm94KDUwKTtcbiAqICAgcG9wKCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqIDxicj5cbiAqIE5vdyB3aXRoIHRoZSBhbnRpYWxpYXMgYXR0cmlidXRlIHNldCB0byB0cnVlLlxuICogPGJyPlxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICogICBzZXRBdHRyaWJ1dGVzKCdhbnRpYWxpYXMnLCB0cnVlKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDI1NSk7XG4gKiAgIHB1c2goKTtcbiAqICAgcm90YXRlWihmcmFtZUNvdW50ICogMC4wMik7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDIpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAyKTtcbiAqICAgZmlsbCgwLCAwLCAwKTtcbiAqICAgYm94KDUwKTtcbiAqICAgcG9wKCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvLyBwcmVzcyB0aGUgbW91c2UgYnV0dG9uIHRvIGVuYWJsZSBwZXJQaXhlbExpZ2h0aW5nXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIGZpbGwoMjU1KTtcbiAqIH1cbiAqXG4gKiB2YXIgbGlnaHRzID0gW1xuICogICB7IGM6ICcjZjAwJywgdDogMS4xMiwgcDogMS45MSwgcjogMC4yIH0sXG4gKiAgIHsgYzogJyMwZjAnLCB0OiAxLjIxLCBwOiAxLjMxLCByOiAwLjIgfSxcbiAqICAgeyBjOiAnIzAwZicsIHQ6IDEuMzcsIHA6IDEuNTcsIHI6IDAuMiB9LFxuICogICB7IGM6ICcjZmYwJywgdDogMS4xMiwgcDogMS45MSwgcjogMC43IH0sXG4gKiAgIHsgYzogJyMwZmYnLCB0OiAxLjIxLCBwOiAxLjMxLCByOiAwLjcgfSxcbiAqICAgeyBjOiAnI2YwZicsIHQ6IDEuMzcsIHA6IDEuNTcsIHI6IDAuNyB9XG4gKiBdO1xuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIHZhciB0ID0gbWlsbGlzKCkgLyAxMDAwICsgMTAwMDtcbiAqICAgYmFja2dyb3VuZCgwKTtcbiAqICAgZGlyZWN0aW9uYWxMaWdodChjb2xvcignIzIyMicpLCAxLCAxLCAxKTtcbiAqXG4gKiAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlnaHRzLmxlbmd0aDsgaSsrKSB7XG4gKiAgICAgdmFyIGxpZ2h0ID0gbGlnaHRzW2ldO1xuICogICAgIHBvaW50TGlnaHQoXG4gKiAgICAgICBjb2xvcihsaWdodC5jKSxcbiAqICAgICAgIHA1LlZlY3Rvci5mcm9tQW5nbGVzKHQgKiBsaWdodC50LCB0ICogbGlnaHQucCwgd2lkdGggKiBsaWdodC5yKVxuICogICAgICk7XG4gKiAgIH1cbiAqXG4gKiAgIHNwZWN1bGFyTWF0ZXJpYWwoMjU1KTtcbiAqICAgc3BoZXJlKHdpZHRoICogMC4xKTtcbiAqXG4gKiAgIHJvdGF0ZVgodCAqIDAuNzcpO1xuICogICByb3RhdGVZKHQgKiAwLjgzKTtcbiAqICAgcm90YXRlWih0ICogMC45MSk7XG4gKiAgIHRvcnVzKHdpZHRoICogMC4zLCB3aWR0aCAqIDAuMDcsIDMwLCAxMCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gbW91c2VQcmVzc2VkKCkge1xuICogICBzZXRBdHRyaWJ1dGVzKCdwZXJQaXhlbExpZ2h0aW5nJywgdHJ1ZSk7XG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIGZpbGwoMjU1KTtcbiAqIH1cbiAqIGZ1bmN0aW9uIG1vdXNlUmVsZWFzZWQoKSB7XG4gKiAgIHNldEF0dHJpYnV0ZXMoJ3BlclBpeGVsTGlnaHRpbmcnLCBmYWxzZSk7XG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIGZpbGwoMjU1KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHQgYSByb3RhdGluZyBjdWJlIHdpdGggc21vb3RoZXIgZWRnZXNcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIHNldEF0dHJpYnV0ZXNcbiAqIEBmb3IgcDVcbiAqIEBwYXJhbSAge09iamVjdH0gIG9iaiBvYmplY3Qgd2l0aCBrZXktdmFsdWUgcGFpcnNcbiAqL1xuXG5wNS5wcm90b3R5cGUuc2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgdGhpcy5fYXNzZXJ0M2QoJ3NldEF0dHJpYnV0ZXMnKTtcbiAgLy9AdG9kb19GRVNcbiAgdmFyIGF0dHI7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgYXR0ciA9IHt9O1xuICAgIGF0dHJba2V5XSA9IHZhbHVlO1xuICB9IGVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIGF0dHIgPSBrZXk7XG4gIH1cbiAgdGhpcy5wdXNoKCk7XG4gIHRoaXMuX3JlbmRlcmVyLl9yZXNldENvbnRleHQoYXR0cik7XG4gIHRoaXMucG9wKCk7XG59O1xuXG4vKipcbiAqIEBjbGFzcyBwNS5SZW5kZXJlckdMXG4gKi9cblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX2NvbXB1dGVDYW1lcmFEZWZhdWx0U2V0dGluZ3MgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kZWZhdWx0Q2FtZXJhRk9WID0gNjAgLyAxODAgKiBNYXRoLlBJO1xuICB0aGlzLmRlZmF1bHRDYW1lcmFBc3BlY3QgPSB0aGlzLndpZHRoIC8gdGhpcy5oZWlnaHQ7XG4gIHRoaXMuZGVmYXVsdENhbWVyYVggPSAwO1xuICB0aGlzLmRlZmF1bHRDYW1lcmFZID0gMDtcbiAgdGhpcy5kZWZhdWx0Q2FtZXJhWiA9XG4gICAgdGhpcy5oZWlnaHQgLyAyLjAgLyBNYXRoLnRhbih0aGlzLmRlZmF1bHRDYW1lcmFGT1YgLyAyLjApO1xuICB0aGlzLmRlZmF1bHRDYW1lcmFOZWFyID0gdGhpcy5kZWZhdWx0Q2FtZXJhWiAqIDAuMTtcbiAgdGhpcy5kZWZhdWx0Q2FtZXJhRmFyID0gdGhpcy5kZWZhdWx0Q2FtZXJhWiAqIDEwO1xufTtcblxuLy9kZXRlY3QgaWYgdXNlciBkaWRuJ3Qgc2V0IHRoZSBjYW1lcmFcbi8vdGhlbiBjYWxsIHRoaXMgZnVuY3Rpb24gYmVsb3dcbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLl9zZXREZWZhdWx0Q2FtZXJhID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9jdXJDYW1lcmEgPT09IG51bGwpIHtcbiAgICB0aGlzLl9jb21wdXRlQ2FtZXJhRGVmYXVsdFNldHRpbmdzKCk7XG4gICAgdGhpcy5jYW1lcmFGT1YgPSB0aGlzLmRlZmF1bHRDYW1lcmFGT1Y7XG4gICAgdGhpcy5jYW1lcmFBc3BlY3QgPSB0aGlzLmRlZmF1bHRBc3BlY3Q7XG4gICAgdGhpcy5jYW1lcmFYID0gdGhpcy5kZWZhdWx0Q2FtZXJhWDtcbiAgICB0aGlzLmNhbWVyYVkgPSB0aGlzLmRlZmF1bHRDYW1lcmFZO1xuICAgIHRoaXMuY2FtZXJhWiA9IHRoaXMuZGVmYXVsdENhbWVyYVo7XG4gICAgdGhpcy5jYW1lcmFOZWFyID0gdGhpcy5kZWZhdWx0Q2FtZXJhTmVhcjtcbiAgICB0aGlzLmNhbWVyYUZhciA9IHRoaXMuZGVmYXVsdENhbWVyYUZhcjtcblxuICAgIHRoaXMucGVyc3BlY3RpdmUoKTtcbiAgICB0aGlzLmNhbWVyYSgpO1xuICAgIHRoaXMuX2N1ckNhbWVyYSA9ICdkZWZhdWx0JztcbiAgfVxufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyByZXNldCBtb2RlbCB2aWV3IGFuZCBhcHBseSBpbml0aWFsIGNhbWVyYSB0cmFuc2Zvcm1cbiAgLy8gKGNvbnRhaW5pbmcgb25seSBsb29rIGF0IGluZm87IG5vIHByb2plY3Rpb24pLlxuICB0aGlzLnVNVk1hdHJpeC5zZXQoXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFswXSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzFdLFxuICAgIHRoaXMuY2FtZXJhTWF0cml4Lm1hdDRbMl0sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFszXSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzRdLFxuICAgIHRoaXMuY2FtZXJhTWF0cml4Lm1hdDRbNV0sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFs2XSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzddLFxuICAgIHRoaXMuY2FtZXJhTWF0cml4Lm1hdDRbOF0sXG4gICAgdGhpcy5jYW1lcmFNYXRyaXgubWF0NFs5XSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzEwXSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzExXSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzEyXSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzEzXSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzE0XSxcbiAgICB0aGlzLmNhbWVyYU1hdHJpeC5tYXQ0WzE1XVxuICApO1xuXG4gIC8vIHJlc2V0IGxpZ2h0IGRhdGEgZm9yIG5ldyBmcmFtZS5cblxuICB0aGlzLmFtYmllbnRMaWdodENvbG9ycy5sZW5ndGggPSAwO1xuICB0aGlzLmRpcmVjdGlvbmFsTGlnaHREaXJlY3Rpb25zLmxlbmd0aCA9IDA7XG4gIHRoaXMuZGlyZWN0aW9uYWxMaWdodENvbG9ycy5sZW5ndGggPSAwO1xuXG4gIHRoaXMucG9pbnRMaWdodFBvc2l0aW9ucy5sZW5ndGggPSAwO1xuICB0aGlzLnBvaW50TGlnaHRDb2xvcnMubGVuZ3RoID0gMDtcbn07XG5cbi8qKlxuICogW2JhY2tncm91bmQgZGVzY3JpcHRpb25dXG4gKi9cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLmJhY2tncm91bmQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF9jb2wgPSB0aGlzLl9wSW5zdC5jb2xvci5hcHBseSh0aGlzLl9wSW5zdCwgYXJndW1lbnRzKTtcbiAgdmFyIF9yID0gX2NvbC5sZXZlbHNbMF0gLyAyNTU7XG4gIHZhciBfZyA9IF9jb2wubGV2ZWxzWzFdIC8gMjU1O1xuICB2YXIgX2IgPSBfY29sLmxldmVsc1syXSAvIDI1NTtcbiAgdmFyIF9hID0gX2NvbC5sZXZlbHNbM10gLyAyNTU7XG4gIHRoaXMuR0wuY2xlYXJDb2xvcihfciwgX2csIF9iLCBfYSk7XG4gIHRoaXMuR0wuZGVwdGhNYXNrKHRydWUpO1xuICB0aGlzLkdMLmNsZWFyKHRoaXMuR0wuQ09MT1JfQlVGRkVSX0JJVCB8IHRoaXMuR0wuREVQVEhfQlVGRkVSX0JJVCk7XG59O1xuXG4vL0BUT0RPIGltcGxlbWVudCB0aGlzXG4vLyBwNS5SZW5kZXJlckdMLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuLy9AVE9ET1xuLy8gfTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQ09MT1Jcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qKlxuICogQmFzaWMgZmlsbCBtYXRlcmlhbCBmb3IgZ2VvbWV0cnkgd2l0aCBhIGdpdmVuIGNvbG9yXG4gKiBAbWV0aG9kICBmaWxsXG4gKiBAY2xhc3MgcDUuUmVuZGVyZXJHTFxuICogQHBhcmFtICB7TnVtYmVyfE51bWJlcltdfFN0cmluZ3xwNS5Db2xvcn0gdjEgIGdyYXkgdmFsdWUsXG4gKiByZWQgb3IgaHVlIHZhbHVlIChkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sb3IgbW9kZSksXG4gKiBvciBjb2xvciBBcnJheSwgb3IgQ1NTIGNvbG9yIHN0cmluZ1xuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgICAgIFt2Ml0gZ3JlZW4gb3Igc2F0dXJhdGlvbiB2YWx1ZVxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgICAgIFt2M10gYmx1ZSBvciBicmlnaHRuZXNzIHZhbHVlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICAgICAgW2FdICBvcGFjaXR5XG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygyMDAsIDIwMCwgV0VCR0wpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMCk7XG4gKiAgIG5vU3Ryb2tlKCk7XG4gKiAgIGZpbGwoMTAwLCAxMDAsIDI0MCk7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgYm94KDc1LCA3NSwgNzUpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogYmxhY2sgY2FudmFzIHdpdGggcHVycGxlIGN1YmUgc3Bpbm5pbmdcbiAqXG4gKi9cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbih2MSwgdjIsIHYzLCBhKSB7XG4gIC8vc2VlIG1hdGVyaWFsLmpzIGZvciBtb3JlIGluZm8gb24gY29sb3IgYmxlbmRpbmcgaW4gd2ViZ2xcbiAgdmFyIGNvbG9yID0gcDUucHJvdG90eXBlLmNvbG9yLmFwcGx5KHRoaXMuX3BJbnN0LCBhcmd1bWVudHMpO1xuICB0aGlzLmN1ckZpbGxDb2xvciA9IGNvbG9yLl9hcnJheTtcblxuICBpZiAodGhpcy5pc0ltbWVkaWF0ZURyYXdpbmcpIHtcbiAgICB0aGlzLnNldEZpbGxTaGFkZXIodGhpcy5fZ2V0SW1tZWRpYXRlTW9kZVNoYWRlcigpKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnNldEZpbGxTaGFkZXIodGhpcy5fZ2V0Q29sb3JTaGFkZXIoKSk7XG4gIH1cbiAgdGhpcy5kcmF3TW9kZSA9IGNvbnN0YW50cy5GSUxMO1xuICB0aGlzLmN1ckZpbGxTaGFkZXIuc2V0VW5pZm9ybSgndU1hdGVyaWFsQ29sb3InLCB0aGlzLmN1ckZpbGxDb2xvcik7XG59O1xuXG4vKipcbiAqIEJhc2ljIHN0cm9rZSBtYXRlcmlhbCBmb3IgZ2VvbWV0cnkgd2l0aCBhIGdpdmVuIGNvbG9yXG4gKiBAbWV0aG9kICBzdHJva2VcbiAqIEBwYXJhbSAge051bWJlcnxOdW1iZXJbXXxTdHJpbmd8cDUuQ29sb3J9IHYxICBncmF5IHZhbHVlLFxuICogcmVkIG9yIGh1ZSB2YWx1ZSAoZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbG9yIG1vZGUpLFxuICogb3IgY29sb3IgQXJyYXksIG9yIENTUyBjb2xvciBzdHJpbmdcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgICAgICBbdjJdIGdyZWVuIG9yIHNhdHVyYXRpb24gdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgICAgICBbdjNdIGJsdWUgb3IgYnJpZ2h0bmVzcyB2YWx1ZVxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgICAgIFthXSAgb3BhY2l0eVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMjAwLCAyMDAsIFdFQkdMKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDApO1xuICogICBzdHJva2UoMjQwLCAxNTAsIDE1MCk7XG4gKiAgIGZpbGwoMTAwLCAxMDAsIDI0MCk7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgYm94KDc1LCA3NSwgNzUpO1xuICogfVxuICogPC9jb2RlPlxuICogPC9kaXY+XG4gKlxuICogQGFsdFxuICogYmxhY2sgY2FudmFzIHdpdGggcHVycGxlIGN1YmUgd2l0aCBwaW5rIG91dGxpbmUgc3Bpbm5pbmdcbiAqXG4gKi9cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLnN0cm9rZSA9IGZ1bmN0aW9uKHIsIGcsIGIsIGEpIHtcbiAgLy9AdG9kbyBhbGxvdyB0cmFuc3BhcmVuY3kgaW4gc3Ryb2tpbmcgY3VycmVudGx5IGRvZXNuJ3QgaGF2ZVxuICAvL2FueSBpbXBhY3QgYW5kIGNhdXNlcyBwcm9ibGVtcyB3aXRoIHNwZWN1bGFyTWF0ZXJpYWxcbiAgYXJndW1lbnRzWzNdID0gMjU1O1xuICB2YXIgY29sb3IgPSBwNS5wcm90b3R5cGUuY29sb3IuYXBwbHkodGhpcy5fcEluc3QsIGFyZ3VtZW50cyk7XG4gIHRoaXMuY3VyU3Ryb2tlQ29sb3IgPSBjb2xvci5fYXJyYXk7XG4gIHRoaXMuY3VyU3Ryb2tlU2hhZGVyLnNldFVuaWZvcm0oJ3VNYXRlcmlhbENvbG9yJywgdGhpcy5jdXJTdHJva2VDb2xvcik7XG59O1xuXG4vKipcbiAqIENoYW5nZSB3ZWlnaHQgb2Ygc3Ryb2tlXG4gKiBAbWV0aG9kICBzdHJva2VXZWlnaHRcbiAqIEBwYXJhbSAge051bWJlcn0gc3Ryb2tlIHdlaWdodCB0byBiZSB1c2VkIGZvciBkcmF3aW5nXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygyMDAsIDQwMCwgV0VCR0wpO1xuICogICBzZXRBdHRyaWJ1dGVzKCdhbnRpYWxpYXMnLCB0cnVlKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDApO1xuICogICBub1N0cm9rZSgpO1xuICogICB0cmFuc2xhdGUoMCwgLTEwMCwgMCk7XG4gKiAgIHN0cm9rZSgyNDAsIDE1MCwgMTUwKTtcbiAqICAgZmlsbCgxMDAsIDEwMCwgMjQwKTtcbiAqICAgcHVzaCgpO1xuICogICBzdHJva2VXZWlnaHQoOCk7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgc3BoZXJlKDc1KTtcbiAqICAgcG9wKCk7XG4gKiAgIHB1c2goKTtcbiAqICAgdHJhbnNsYXRlKDAsIDIwMCwgMCk7XG4gKiAgIHN0cm9rZVdlaWdodCgxKTtcbiAqICAgcm90YXRlWChmcmFtZUNvdW50ICogMC4wMSk7XG4gKiAgIHJvdGF0ZVkoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICBzcGhlcmUoNzUpO1xuICogICBwb3AoKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIGJsYWNrIGNhbnZhcyB3aXRoIHR3byBwdXJwbGUgcm90YXRpbmcgc3BoZXJlcyB3aXRoIHBpbmtcbiAqIG91dGxpbmVzIHRoZSBzcGhlcmUgb24gdG9wIGhhcyBtdWNoIGhlYXZpZXIgb3V0bGluZXMsXG4gKlxuICovXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5zdHJva2VXZWlnaHQgPSBmdW5jdGlvbih3KSB7XG4gIGlmICh0aGlzLmN1clN0cm9rZVdlaWdodCAhPT0gdykge1xuICAgIHRoaXMucG9pbnRTaXplID0gdztcbiAgICB0aGlzLmN1clN0cm9rZVdlaWdodCA9IHc7XG4gICAgdGhpcy5jdXJTdHJva2VTaGFkZXIuc2V0VW5pZm9ybSgndVN0cm9rZVdlaWdodCcsIHcpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgW1IsRyxCLEFdIHZhbHVlcyBmb3IgYW55IHBpeGVsIG9yIGdyYWJzIGEgc2VjdGlvbiBvZlxuICogYW4gaW1hZ2UuIElmIG5vIHBhcmFtZXRlcnMgYXJlIHNwZWNpZmllZCwgdGhlIGVudGlyZSBpbWFnZSBpcyByZXR1cm5lZC5cbiAqIFVzZSB0aGUgeCBhbmQgeSBwYXJhbWV0ZXJzIHRvIGdldCB0aGUgdmFsdWUgb2Ygb25lIHBpeGVsLiBHZXQgYSBzZWN0aW9uIG9mXG4gKiB0aGUgZGlzcGxheSB3aW5kb3cgYnkgc3BlY2lmeWluZyBhZGRpdGlvbmFsIHcgYW5kIGggcGFyYW1ldGVycy4gV2hlblxuICogZ2V0dGluZyBhbiBpbWFnZSwgdGhlIHggYW5kIHkgcGFyYW1ldGVycyBkZWZpbmUgdGhlIGNvb3JkaW5hdGVzIGZvciB0aGVcbiAqIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZSwgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBpbWFnZU1vZGUoKS5cbiAqIDxicj48YnI+XG4gKiBJZiB0aGUgcGl4ZWwgcmVxdWVzdGVkIGlzIG91dHNpZGUgb2YgdGhlIGltYWdlIHdpbmRvdywgWzAsMCwwLDI1NV0gaXNcbiAqIHJldHVybmVkLlxuICogPGJyPjxicj5cbiAqIEdldHRpbmcgdGhlIGNvbG9yIG9mIGEgc2luZ2xlIHBpeGVsIHdpdGggZ2V0KHgsIHkpIGlzIGVhc3ksIGJ1dCBub3QgYXMgZmFzdFxuICogYXMgZ3JhYmJpbmcgdGhlIGRhdGEgZGlyZWN0bHkgZnJvbSBwaXhlbHNbXS4gVGhlIGVxdWl2YWxlbnQgc3RhdGVtZW50IHRvXG4gKiBnZXQoeCwgeSkgaXMgdXNpbmcgcGl4ZWxzW10gd2l0aCBwaXhlbCBkZW5zaXR5IGRcbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBnZXRcbiAqIEBwYXJhbSAge051bWJlcn0gICAgICAgICAgICAgICBbeF0geC1jb29yZGluYXRlIG9mIHRoZSBwaXhlbFxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgICAgICAgIFt5XSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICAgICAgICAgW3ddIHdpZHRoXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICAgICAgICAgW2hdIGhlaWdodFxuICogQHJldHVybiB7TnVtYmVyW118Q29sb3J8cDUuSW1hZ2V9ICBjb2xvciBvZiBwaXhlbCBhdCB4LHkgaW4gYXJyYXkgZm9ybWF0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSLCBHLCBCLCBBXSBvciBwNS5JbWFnZVxuICovXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbih4LCB5LCB3LCBoKSB7XG4gIHJldHVybiBwNS5SZW5kZXJlcjJELnByb3RvdHlwZS5nZXQuYXBwbHkodGhpcywgW3gsIHksIHcsIGhdKTtcbn07XG5cbi8qKlxuICogTG9hZHMgdGhlIHBpeGVscyBkYXRhIGZvciB0aGlzIGNhbnZhcyBpbnRvIHRoZSBwaXhlbHNbXSBhdHRyaWJ1dGUuXG4gKiBOb3RlIHRoYXQgdXBkYXRlUGl4ZWxzKCkgYW5kIHNldCgpIGRvIG5vdCB3b3JrLlxuICogQW55IHBpeGVsIG1hbmlwdWxhdGlvbiBtdXN0IGJlIGRvbmUgZGlyZWN0bHkgdG8gdGhlIHBpeGVsc1tdIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIGxvYWRQaXhlbHNcbiAqXG4gKi9cblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUubG9hZFBpeGVscyA9IGZ1bmN0aW9uKCkge1xuICAvL0B0b2RvX0ZFU1xuICBpZiAodGhpcy5hdHRyaWJ1dGVzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciAhPT0gdHJ1ZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ2xvYWRQaXhlbHMgb25seSB3b3JrcyBpbiBXZWJHTCB3aGVuIHByZXNlcnZlRHJhd2luZ0J1ZmZlciAnICsgJ2lzIHRydWUuJ1xuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBwZCA9IHRoaXMuX3BJbnN0Ll9waXhlbERlbnNpdHk7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwO1xuICB2YXIgdyA9IHRoaXMud2lkdGg7XG4gIHZhciBoID0gdGhpcy5oZWlnaHQ7XG4gIHcgKj0gcGQ7XG4gIGggKj0gcGQ7XG4gIC8vaWYgdGhlcmUgaXNuJ3QgYSByZW5kZXJlci1sZXZlbCB0ZW1wb3JhcnkgcGl4ZWxzIGJ1ZmZlclxuICAvL21ha2UgYSBuZXcgb25lXG4gIGlmICh0eXBlb2YgdGhpcy5waXhlbHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy5waXhlbHMgPSBuZXcgVWludDhBcnJheShcbiAgICAgIHRoaXMuR0wuZHJhd2luZ0J1ZmZlcldpZHRoICogdGhpcy5HTC5kcmF3aW5nQnVmZmVySGVpZ2h0ICogNFxuICAgICk7XG4gIH1cbiAgdGhpcy5HTC5yZWFkUGl4ZWxzKFxuICAgIHgsXG4gICAgeSxcbiAgICB3LFxuICAgIGgsXG4gICAgdGhpcy5HTC5SR0JBLFxuICAgIHRoaXMuR0wuVU5TSUdORURfQllURSxcbiAgICB0aGlzLnBpeGVsc1xuICApO1xuICB0aGlzLl9wSW5zdC5fc2V0UHJvcGVydHkoJ3BpeGVscycsIHRoaXMucGl4ZWxzKTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEhBU0ggfCBmb3IgZ2VvbWV0cnlcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuZ2VvbWV0cnlJbkhhc2ggPSBmdW5jdGlvbihnSWQpIHtcbiAgcmV0dXJuIHRoaXMuZ0hhc2hbZ0lkXSAhPT0gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBbcmVzaXplIGRlc2NyaXB0aW9uXVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge051bWJlcn0gdyBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGggW2Rlc2NyaXB0aW9uXVxuICovXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbih3LCBoKSB7XG4gIHA1LlJlbmRlcmVyLnByb3RvdHlwZS5yZXNpemUuY2FsbCh0aGlzLCB3LCBoKTtcbiAgdGhpcy5HTC52aWV3cG9ydChcbiAgICAwLFxuICAgIDAsXG4gICAgdGhpcy5HTC5kcmF3aW5nQnVmZmVyV2lkdGgsXG4gICAgdGhpcy5HTC5kcmF3aW5nQnVmZmVySGVpZ2h0XG4gICk7XG4gIHRoaXMuX3ZpZXdwb3J0ID0gdGhpcy5HTC5nZXRQYXJhbWV0ZXIodGhpcy5HTC5WSUVXUE9SVCk7XG4gIC8vIElmIHdlJ3JlIHVzaW5nIHRoZSBkZWZhdWx0IGNhbWVyYSwgdXBkYXRlIHRoZSBhc3BlY3QgcmF0aW9cbiAgaWYgKHRoaXMuX2N1ckNhbWVyYSA9PT0gbnVsbCB8fCB0aGlzLl9jdXJDYW1lcmEgPT09ICdkZWZhdWx0Jykge1xuICAgIHRoaXMuX2N1ckNhbWVyYSA9IG51bGw7XG4gICAgLy8gY2FtZXJhIGRlZmF1bHRzIGFyZSBkZXBlbmRlbnQgb24gdGhlIHdpZHRoICYgaGVpZ2h0IG9mIHRoZSBzY3JlZW4sXG4gICAgLy8gc28gd2UnbGwgd2FudCB0byB1cGRhdGUgdGhlbSBpZiB0aGUgc2l6ZSBvZiB0aGUgc2NyZWVuIGNoYW5nZXMuXG4gICAgdGhpcy5fc2V0RGVmYXVsdENhbWVyYSgpO1xuICB9XG4gIC8vcmVzaXplIHBpeGVscyBidWZmZXJcbiAgaWYgKHR5cGVvZiB0aGlzLnBpeGVscyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aGlzLnBpeGVscyA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgdGhpcy5HTC5kcmF3aW5nQnVmZmVyV2lkdGggKiB0aGlzLkdMLmRyYXdpbmdCdWZmZXJIZWlnaHQgKiA0XG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBjbGVhcnMgY29sb3IgYW5kIGRlcHRoIGJ1ZmZlcnNcbiAqIHdpdGggcixnLGIsYVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByIG5vcm1hbGl6ZWQgcmVkIHZhbC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBnIG5vcm1hbGl6ZWQgZ3JlZW4gdmFsLlxuICogQHBhcmFtIHtOdW1iZXJ9IGIgbm9ybWFsaXplZCBibHVlIHZhbC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBhIG5vcm1hbGl6ZWQgYWxwaGEgdmFsLlxuICovXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3IgPSBhcmd1bWVudHNbMF0gfHwgMDtcbiAgdmFyIF9nID0gYXJndW1lbnRzWzFdIHx8IDA7XG4gIHZhciBfYiA9IGFyZ3VtZW50c1syXSB8fCAwO1xuICB2YXIgX2EgPSBhcmd1bWVudHNbM10gfHwgMDtcbiAgdGhpcy5HTC5jbGVhckNvbG9yKF9yLCBfZywgX2IsIF9hKTtcbiAgdGhpcy5HTC5jbGVhcih0aGlzLkdMLkNPTE9SX0JVRkZFUl9CSVQgfCB0aGlzLkdMLkRFUFRIX0JVRkZFUl9CSVQpO1xufTtcblxuLyoqXG4gKiBbdHJhbnNsYXRlIGRlc2NyaXB0aW9uXVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge051bWJlcn0geCBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7TnVtYmVyfSB6IFtkZXNjcmlwdGlvbl1cbiAqIEBjaGFpbmFibGVcbiAqIEB0b2RvIGltcGxlbWVudCBoYW5kbGUgZm9yIGNvbXBvbmVudHMgb3IgdmVjdG9yIGFzIGFyZ3NcbiAqL1xucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICBpZiAoeCBpbnN0YW5jZW9mIHA1LlZlY3Rvcikge1xuICAgIHogPSB4Lno7XG4gICAgeSA9IHgueTtcbiAgICB4ID0geC54O1xuICB9XG4gIHRoaXMudU1WTWF0cml4LnRyYW5zbGF0ZShbeCwgeSwgel0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBNb2RlbCBWaWV3IE1hdHJpeCBieSBhIHZlY3RvclxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge051bWJlciB8IHA1LlZlY3RvciB8IEFycmF5fSB4IFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge051bWJlcn0gW3ldIHktYXhpcyBzY2FsYXJcbiAqIEBwYXJhbSAge051bWJlcn0gW3pdIHotYXhpcyBzY2FsYXJcbiAqIEBjaGFpbmFibGVcbiAqL1xucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gIHRoaXMudU1WTWF0cml4LnNjYWxlKHgsIHksIHopO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLnJvdGF0ZSA9IGZ1bmN0aW9uKHJhZCwgYXhpcykge1xuICBpZiAodHlwZW9mIGF4aXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRoaXMucm90YXRlWihyYWQpO1xuICB9XG4gIHA1Lk1hdHJpeC5wcm90b3R5cGUucm90YXRlLmFwcGx5KHRoaXMudU1WTWF0cml4LCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLnJvdGF0ZVggPSBmdW5jdGlvbihyYWQpIHtcbiAgdGhpcy5yb3RhdGUocmFkLCAxLCAwLCAwKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5yb3RhdGVZID0gZnVuY3Rpb24ocmFkKSB7XG4gIHRoaXMucm90YXRlKHJhZCwgMCwgMSwgMCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUucm90YXRlWiA9IGZ1bmN0aW9uKHJhZCkge1xuICB0aGlzLnJvdGF0ZShyYWQsIDAsIDAsIDEpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbigpIHtcbiAgLy8gZ2V0IHRoZSBiYXNlIHJlbmRlcmVyIHN0eWxlXG4gIHZhciBzdHlsZSA9IHA1LlJlbmRlcmVyLnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMpO1xuXG4gIC8vIGFkZCB3ZWJnbC1zcGVjaWZpYyBzdHlsZSBwcm9wZXJ0aWVzXG4gIHZhciBwcm9wZXJ0aWVzID0gc3R5bGUucHJvcGVydGllcztcblxuICBwcm9wZXJ0aWVzLnVNVk1hdHJpeCA9IHRoaXMudU1WTWF0cml4LmNvcHkoKTtcbiAgcHJvcGVydGllcy5jYW1lcmFNYXRyaXggPSB0aGlzLmNhbWVyYU1hdHJpeC5jb3B5KCk7XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUucmVzZXRNYXRyaXggPSBmdW5jdGlvbigpIHtcbiAgdGhpcy51TVZNYXRyaXggPSBwNS5NYXRyaXguaWRlbnRpdHkodGhpcy5fcEluc3QpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIFRleHQvVHlwb2dyYXBoeVxuLy8gQFRPRE86XG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5fYXBwbHlUZXh0UHJvcGVydGllcyA9IGZ1bmN0aW9uKCkge1xuICAvL0BUT0RPIGZpbmlzaCBpbXBsZW1lbnRhdGlvblxuICBjb25zb2xlLmVycm9yKCd0ZXh0IGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gd2ViZ2wnKTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFNIQURFUlxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKlxuICogSW5pdGlhbGl6ZXMgYW5kIHVzZXMgdGhlIHNwZWNpZmllZCBzaGFkZXIsIHRoZW4gcmV0dXJuc1xuICogdGhhdCBzaGFkZXIuIE5vdGU6IGluaXRpYWxpemF0aW9uIGFuZCByZXNldHRpbmcgdGhlIHByb2dyYW1cbiAqIGlzIG9ubHkgdXNlZCBpZiBuZWVkZWQgKHNheSwgaWYgYSBuZXcgdmFsdWUgaXMgcHJvdmlkZWQpXG4gKiBzbyBpdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaGFkZXIgbXVsdGlwbGVcbiAqIHRpbWVzIHdpdGhvdXQgYSBzaWduZmljYW50IHBlcmZvcm1hbmNlIGhpdCkuXG4gKlxuICogQG1ldGhvZCBzZXRGaWxsU2hhZGVyXG4gKiBAcGFyYW0ge3A1LlNoYWRlcn0gW3NdIGEgcDUuU2hhZGVyIG9iamVjdFxuICogQHJldHVybiB7cDUuU2hhZGVyfSB0aGUgY3VycmVudCwgdXBkYXRlZCBmaWxsIHNoYWRlclxuICovXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5zZXRGaWxsU2hhZGVyID0gZnVuY3Rpb24ocykge1xuICBpZiAodGhpcy5jdXJGaWxsU2hhZGVyICE9PSBzKSB7XG4gICAgLy8gb25seSBkbyBzZXR1cCBldGMuIGlmIHNoYWRlciBpcyBhY3R1YWxseSBuZXcuXG4gICAgdGhpcy5jdXJGaWxsU2hhZGVyID0gcztcblxuICAgIC8vIHNhZmUgdG8gZG8gdGhpcyBtdWx0aXBsZSB0aW1lcztcbiAgICAvLyBpbml0KCkgd2lsbCBiYWlsIGVhcmx5IGlmIGhhcyBhbHJlYWR5IGJlZW4gcnVuLlxuICAgIHRoaXMuY3VyRmlsbFNoYWRlci5pbml0KCk7XG4gICAgLy90aGlzLmN1ckZpbGxTaGFkZXIudXNlUHJvZ3JhbSgpO1xuICB9XG4gIC8vIGFsd2F5cyByZXR1cm4gdGhpcy5jdXJGaWxsU2hhZGVyLCBldmVuIGlmIG5vIGNoYW5nZSB3YXMgbWFkZS5cbiAgcmV0dXJuIHRoaXMuY3VyRmlsbFNoYWRlcjtcbn07XG5cbi8qXG4gKiBAbWV0aG9kIHNldFN0cm9rZVNoYWRlclxuICogQHBhcmFtIHtwNS5TaGFkZXJ9IFtzXSBhIHA1LlNoYWRlciBvYmplY3RcbiAqIEByZXR1cm4ge3A1LlNoYWRlcn0gdGhlIGN1cnJlbnQsIHVwZGF0ZWQgc3Ryb2tlIHNoYWRlclxuICovXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5zZXRTdHJva2VTaGFkZXIgPSBmdW5jdGlvbihzKSB7XG4gIGlmICh0aGlzLmN1clN0cm9rZVNoYWRlciAhPT0gcykge1xuICAgIC8vIG9ubHkgZG8gc2V0dXAgZXRjLiBpZiBzaGFkZXIgaXMgYWN0dWFsbHkgbmV3LlxuICAgIHRoaXMuY3VyU3Ryb2tlU2hhZGVyID0gcztcbiAgICAvLyBzYWZlIHRvIGRvIHRoaXMgbXVsdGlwbGUgdGltZXM7XG4gICAgLy8gaW5pdCgpIHdpbGwgYmFpbCBlYXJseSBpZiBoYXMgYWxyZWFkeSBiZWVuIHJ1bi5cbiAgICB0aGlzLmN1clN0cm9rZVNoYWRlci5pbml0KCk7XG4gICAgLy90aGlzLmN1clN0cm9rZVNoYWRlci51c2VQcm9ncmFtKCk7XG4gIH1cbiAgLy8gYWx3YXlzIHJldHVybiB0aGlzLmN1ckxpbmVTaGFkZXIsIGV2ZW4gaWYgbm8gY2hhbmdlIHdhcyBtYWRlLlxuICByZXR1cm4gdGhpcy5jdXJTdHJva2VTaGFkZXI7XG59O1xuXG4vKlxuICogc2hhZGVycyBhcmUgY3JlYXRlZCBhbmQgY2FjaGVkIG9uIGEgcGVyLXJlbmRlcmVyIGJhc2lzLFxuICogb24gdGhlIGdyb3VuZHMgdGhhdCBlYWNoIHJlbmRlcmVyIHdpbGwgaGF2ZSBpdHMgb3duIGdsIGNvbnRleHRcbiAqIGFuZCB0aGUgc2hhZGVyIG11c3QgYmUgdmFsaWQgaW4gdGhhdCBjb250ZXh0LlxuICpcbiAqXG4gKi9cblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX3VzZUxpZ2h0U2hhZGVyID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5jdXJGaWxsU2hhZGVyIHx8ICF0aGlzLmN1ckZpbGxTaGFkZXIuaXNMaWdodFNoYWRlcigpKSB7XG4gICAgdGhpcy5zZXRGaWxsU2hhZGVyKHRoaXMuX2dldExpZ2h0U2hhZGVyKCkpO1xuICB9XG4gIHJldHVybiB0aGlzLmN1ckZpbGxTaGFkZXI7XG59O1xuXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5fdXNlQ29sb3JTaGFkZXIgPSBmdW5jdGlvbigpIHtcbiAgLy8gbG9va2luZyBhdCB0aGUgY29kZSB3aXRoaW4gdGhlIGdsc2wgZmlsZXMsIEknbSBub3QgcmVhbGx5XG4gIC8vIHN1cmUgd2h5IHRoZXNlIGFyZSB0d28gZGlmZmVyZW50IHNoYWRlcnMuIGJ1dCwgdGhleSBhcmUsXG4gIC8vIGFuZCBpZiB3ZSdyZSBkcmF3aW5nIGluIHJldGFpbiBtb2RlIGJ1dCB0aGUgc2hhZGVyIGlzIHRoZVxuICAvLyBpbW1lZGlhdGUgbW9kZSBvbmUsIHdlIG5lZWQgdG8gc3dpdGNoLlxuXG4gIC8vIFRPRE86IHdoYXQgaWYgY3VyRmlsbFNoYWRlciBpcyBfYW55XyBvdGhlciBzaGFkZXI/XG4gIGlmIChcbiAgICAhdGhpcy5jdXJGaWxsU2hhZGVyIHx8XG4gICAgdGhpcy5jdXJGaWxsU2hhZGVyID09PSB0aGlzLl9kZWZhdWx0SW1tZWRpYXRlTW9kZVNoYWRlclxuICApIHtcbiAgICAvLyB0aGVyZSBhcmUgZGlmZmVyZW50IGltbWVkaWF0ZSBtb2RlIGFuZCByZXRhaW4gbW9kZSBjb2xvciBzaGFkZXJzLlxuICAgIC8vIGlmIHdlJ3JlIHVzaW5nIHRoZSBpbW1lZGlhdGUgbW9kZSBvbmUsIHdlIG5lZWQgdG8gc3dpdGNoIHRvXG4gICAgLy8gb25lIHRoYXQgd29ya3MgZm9yIHJldGFpbiBtb2RlLlxuICAgIHRoaXMuc2V0RmlsbFNoYWRlcih0aGlzLl9nZXRDb2xvclNoYWRlcigpKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJGaWxsU2hhZGVyO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX3VzZUltbWVkaWF0ZU1vZGVTaGFkZXIgPSBmdW5jdGlvbigpIHtcbiAgLy8gVE9ETzogd2hhdCBpZiBjdXJGaWxsU2hhZGVyIGlzIF9hbnlfIG90aGVyIHNoYWRlcj9cbiAgaWYgKCF0aGlzLmN1ckZpbGxTaGFkZXIgfHwgdGhpcy5jdXJGaWxsU2hhZGVyID09PSB0aGlzLl9kZWZhdWx0Q29sb3JTaGFkZXIpIHtcbiAgICAvLyB0aGlzIGlzIHRoZSBmaWxsL3N0cm9rZSBzaGFkZXIgZm9yIHJldGFpbiBtb2RlLlxuICAgIC8vIG11c3Qgc3dpdGNoIHRvIGltbWVkaWF0ZSBtb2RlIHNoYWRlciBiZWZvcmUgZHJhd2luZyFcbiAgICB0aGlzLnNldEZpbGxTaGFkZXIodGhpcy5fZ2V0SW1tZWRpYXRlTW9kZVNoYWRlcigpKTtcbiAgICAvLyBub3RlIHRoYXQgaWYgd2UncmUgdXNpbmcgdGhlIHRleHR1cmUgc2hhZGVyLi4uXG4gICAgLy8gdGhpcyBzaG91bGRuJ3QgY2hhbmdlLiA6KVxuICB9XG4gIHJldHVybiB0aGlzLmN1ckZpbGxTaGFkZXI7XG59O1xuXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5fZ2V0TGlnaHRTaGFkZXIgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLl9kZWZhdWx0TGlnaHRTaGFkZXIpIHtcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLnBlclBpeGVsTGlnaHRpbmcpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRMaWdodFNoYWRlciA9IG5ldyBwNS5TaGFkZXIoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGRlZmF1bHRTaGFkZXJzLnBob25nVmVydCxcbiAgICAgICAgZGVmYXVsdFNoYWRlcnMucGhvbmdGcmFnXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kZWZhdWx0TGlnaHRTaGFkZXIgPSBuZXcgcDUuU2hhZGVyKFxuICAgICAgICB0aGlzLFxuICAgICAgICBkZWZhdWx0U2hhZGVycy5saWdodFZlcnQsXG4gICAgICAgIGRlZmF1bHRTaGFkZXJzLmxpZ2h0VGV4dHVyZUZyYWdcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8vdGhpcy5kcmF3TW9kZSA9IGNvbnN0YW50cy5GSUxMO1xuICByZXR1cm4gdGhpcy5fZGVmYXVsdExpZ2h0U2hhZGVyO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX2dldEltbWVkaWF0ZU1vZGVTaGFkZXIgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLl9kZWZhdWx0SW1tZWRpYXRlTW9kZVNoYWRlcikge1xuICAgIHRoaXMuX2RlZmF1bHRJbW1lZGlhdGVNb2RlU2hhZGVyID0gbmV3IHA1LlNoYWRlcihcbiAgICAgIHRoaXMsXG4gICAgICBkZWZhdWx0U2hhZGVycy5pbW1lZGlhdGVWZXJ0LFxuICAgICAgZGVmYXVsdFNoYWRlcnMudmVydGV4Q29sb3JGcmFnXG4gICAgKTtcbiAgfVxuICAvL3RoaXMuZHJhd01vZGUgPSBjb25zdGFudHMuRklMTDtcbiAgcmV0dXJuIHRoaXMuX2RlZmF1bHRJbW1lZGlhdGVNb2RlU2hhZGVyO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX2dldE5vcm1hbFNoYWRlciA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuX2RlZmF1bHROb3JtYWxTaGFkZXIpIHtcbiAgICB0aGlzLl9kZWZhdWx0Tm9ybWFsU2hhZGVyID0gbmV3IHA1LlNoYWRlcihcbiAgICAgIHRoaXMsXG4gICAgICBkZWZhdWx0U2hhZGVycy5ub3JtYWxWZXJ0LFxuICAgICAgZGVmYXVsdFNoYWRlcnMubm9ybWFsRnJhZ1xuICAgICk7XG4gIH1cbiAgLy90aGlzLmRyYXdNb2RlID0gY29uc3RhbnRzLkZJTEw7XG4gIHJldHVybiB0aGlzLl9kZWZhdWx0Tm9ybWFsU2hhZGVyO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX2dldENvbG9yU2hhZGVyID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5fZGVmYXVsdENvbG9yU2hhZGVyKSB7XG4gICAgdGhpcy5fZGVmYXVsdENvbG9yU2hhZGVyID0gbmV3IHA1LlNoYWRlcihcbiAgICAgIHRoaXMsXG4gICAgICBkZWZhdWx0U2hhZGVycy5ub3JtYWxWZXJ0LFxuICAgICAgZGVmYXVsdFNoYWRlcnMuYmFzaWNGcmFnXG4gICAgKTtcbiAgfVxuICAvL3RoaXMuZHJhd01vZGUgPSBjb25zdGFudHMuRklMTDtcbiAgcmV0dXJuIHRoaXMuX2RlZmF1bHRDb2xvclNoYWRlcjtcbn07XG5cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLl9nZXRMaW5lU2hhZGVyID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5fZGVmYXVsdExpbmVTaGFkZXIpIHtcbiAgICB0aGlzLl9kZWZhdWx0TGluZVNoYWRlciA9IG5ldyBwNS5TaGFkZXIoXG4gICAgICB0aGlzLFxuICAgICAgZGVmYXVsdFNoYWRlcnMubGluZVZlcnQsXG4gICAgICBkZWZhdWx0U2hhZGVycy5saW5lRnJhZ1xuICAgICk7XG4gIH1cbiAgLy90aGlzLmRyYXdNb2RlID0gY29uc3RhbnRzLlNUUk9LRTtcbiAgcmV0dXJuIHRoaXMuX2RlZmF1bHRMaW5lU2hhZGVyO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuX2dldEVtcHR5VGV4dHVyZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuX2VtcHR5VGV4dHVyZSkge1xuICAgIC8vIGEgcGxhaW4gd2hpdGUgdGV4dHVyZSBSR0JBLCBmdWxsIGFscGhhLCBzaW5nbGUgcGl4ZWwuXG4gICAgdmFyIGltID0gbmV3IHA1LkltYWdlKDEsIDEpO1xuICAgIGltLnNldCgwLCAwLCAyNTUpO1xuICAgIHRoaXMuX2VtcHR5VGV4dHVyZSA9IG5ldyBwNS5UZXh0dXJlKHRoaXMsIGltKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fZW1wdHlUZXh0dXJlO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuZ2V0VGV4dHVyZSA9IGZ1bmN0aW9uKGltZykge1xuICB2YXIgY2hlY2tTb3VyY2UgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuc3JjID09PSBpbWc7XG4gIH07XG4gIC8vdGhpcy5kcmF3TW9kZSA9IGNvbnN0YW50cy5URVhUVVJFO1xuICB2YXIgdGV4ID0gdGhpcy50ZXh0dXJlcy5maW5kKGNoZWNrU291cmNlKTtcbiAgaWYgKCF0ZXgpIHtcbiAgICB0ZXggPSBuZXcgcDUuVGV4dHVyZSh0aGlzLCBpbWcpO1xuICAgIHRoaXMudGV4dHVyZXMucHVzaCh0ZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRleDtcbn07XG5cbi8vQmluZHMgYSBidWZmZXIgdG8gdGhlIGRyYXdpbmcgY29udGV4dFxuLy93aGVuIHBhc3NlZCBtb3JlIHRoYW4gdHdvIGFyZ3VtZW50cyBpdCBhbHNvIHVwZGF0ZXMgb3IgaW5pdGlhbGl6ZXNcbi8vdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXJcbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLl9iaW5kQnVmZmVyID0gZnVuY3Rpb24oXG4gIGJ1ZmZlcixcbiAgdGFyZ2V0LFxuICB2YWx1ZXMsXG4gIHR5cGUsXG4gIHVzYWdlXG4pIHtcbiAgdGhpcy5HTC5iaW5kQnVmZmVyKHRhcmdldCwgYnVmZmVyKTtcbiAgaWYgKHZhbHVlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGRhdGEgPSBuZXcgdHlwZSh2YWx1ZXMpO1xuICAgIHRoaXMuR0wuYnVmZmVyRGF0YSh0YXJnZXQsIGRhdGEsIHVzYWdlKTtcbiAgfVxufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8gU01PT1RISU5HXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBAVE9ETzpcbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLnNtb290aCA9IGZ1bmN0aW9uKCkge1xuICAvL0BUT0RPIGZpbmlzaCBpbXBsZW1lbnRhdGlvblxuICBjb25zb2xlLmxvZygnc21vb3RoaW5nIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gd2ViZ2wnKTtcbn07XG5cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLm5vU21vb3RoID0gZnVuY3Rpb24oKSB7XG4gIC8vQFRPRE8gZmluaXNoIGltcGxlbWVudGF0aW9uXG4gIGNvbnNvbGUubG9nKCdzbW9vdGhpbmcgbm90IHlldCBpbXBsZW1lbnRlZCBpbiB3ZWJnbCcpO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLyBVVElMSVRZIEZVTkNUSU9OU1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKipcbiAqIHR1cm4gYSB0d28gZGltZW5zaW9uYWwgYXJyYXkgaW50byBvbmUgZGltZW5zaW9uYWwgYXJyYXlcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtBcnJheX0gYXJyIDItZGltZW5zaW9uYWwgYXJyYXlcbiAqIEByZXR1cm4ge0FycmF5fSAgICAgMS1kaW1lbnNpb25hbCBhcnJheVxuICogW1sxLCAyLCAzXSxbNCwgNSwgNl1dIC0+IFsxLCAyLCAzLCA0LCA1LCA2XVxuICovXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5fZmxhdHRlbiA9IGZ1bmN0aW9uKGFycikge1xuICAvL3doZW4gZW1wdHksIHJldHVybiBlbXB0eVxuICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfSBlbHNlIGlmIChhcnIubGVuZ3RoID4gMjAwMDApIHtcbiAgICAvL2JpZyBtb2RlbHMgLCBsb2FkIHNsb3dlciB0byBhdm9pZCBzdGFjayBvdmVyZmxvd1xuICAgIC8vZmFzdGVyIG5vbi1yZWN1cnNpdmUgZmxhdHRlbiB2aWEgYXhlbGR1Y2hcbiAgICAvL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNzI2NjU1MC9ob3ctdG8tZmxhdHRlbi1uZXN0ZWQtYXJyYXktaW4tamF2YXNjcmlwdFxuICAgIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgdmFyIGFycmF5VHlwZVN0ciA9ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBub2RlcyA9IGFyci5zbGljZSgpO1xuICAgIHZhciBub2RlO1xuICAgIG5vZGUgPSBub2Rlcy5wb3AoKTtcbiAgICBkbyB7XG4gICAgICBpZiAodG9TdHJpbmcuY2FsbChub2RlKSA9PT0gYXJyYXlUeXBlU3RyKSB7XG4gICAgICAgIG5vZGVzLnB1c2guYXBwbHkobm9kZXMsIG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfSB3aGlsZSAobm9kZXMubGVuZ3RoICYmIChub2RlID0gbm9kZXMucG9wKCkpICE9PSB1bmRlZmluZWQpO1xuICAgIHJlc3VsdC5yZXZlcnNlKCk7IC8vIHdlIHJldmVyc2UgcmVzdWx0IHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG9yZGVyXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICAvL290aGVyd2lzZSBpZiBtb2RlbCB3aXRoaW4gbGltaXRzIGZvciBicm93c2VyXG4gICAgLy91c2UgZmFzdGVyIHJlY3Vyc2l2ZSBsb2FkaW5nXG4gICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgYXJyKTtcbiAgfVxufTtcblxuLyoqXG4gKiB0dXJuIGEgcDUuVmVjdG9yIEFycmF5IGludG8gYSBvbmUgZGltZW5zaW9uYWwgbnVtYmVyIGFycmF5XG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7cDUuVmVjdG9yW119IGFyciAgYW4gYXJyYXkgb2YgcDUuVmVjdG9yXG4gKiBAcmV0dXJuIHtOdW1iZXJbXX0gICAgIGEgb25lIGRpbWVuc2lvbmFsIGFycmF5IG9mIG51bWJlcnNcbiAqIFtwNS5WZWN0b3IoMSwgMiwgMyksIHA1LlZlY3Rvcig0LCA1LCA2KV0gLT5cbiAqIFsxLCAyLCAzLCA0LCA1LCA2XVxuICovXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5fdlRvTkFycmF5ID0gZnVuY3Rpb24oYXJyKSB7XG4gIHJldHVybiB0aGlzLl9mbGF0dGVuKFxuICAgIGFyci5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgcmV0dXJuIFtpdGVtLngsIGl0ZW0ueSwgaXRlbS56XTtcbiAgICB9KVxuICApO1xufTtcblxuLyoqXG4gKiBlbnN1cmVzIHRoYXQgcDUgaXMgdXNpbmcgYSAzZCByZW5kZXJlci4gdGhyb3dzIGFuIGVycm9yIGlmIG5vdC5cbiAqL1xucDUucHJvdG90eXBlLl9hc3NlcnQzZCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgaWYgKCF0aGlzLl9yZW5kZXJlci5pc1AzRClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBuYW1lICtcbiAgICAgICAgXCIoKSBpcyBvbmx5IHN1cHBvcnRlZCBpbiBXRUJHTCBtb2RlLiBJZiB5b3UnZCBsaWtlIHRvIHVzZSAzRCBncmFwaGljc1wiICtcbiAgICAgICAgJyBhbmQgV2ViR0wsIHNlZSAgaHR0cHM6Ly9wNWpzLm9yZy9leGFtcGxlcy9mb3JtLTNkLXByaW1pdGl2ZXMuaHRtbCcgK1xuICAgICAgICAnIGZvciBtb3JlIGluZm9ybWF0aW9uLidcbiAgICApO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNS5SZW5kZXJlckdMO1xuXG59LHtcIi4uL2NvcmUvY29uc3RhbnRzXCI6MjEsXCIuLi9jb3JlL2NvcmVcIjoyMixcIi4uL2NvcmUvcDUuUmVuZGVyZXJcIjoyOSxcIi4vcDUuTWF0cml4XCI6NjksXCIuL3A1LlNoYWRlclwiOjczfV0sNzM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBwNS5TaGFkZXIgY2xhc3NcbiAqIEBtb2R1bGUgTGlnaHRzLCBDYW1lcmFcbiAqIEBzdWJtb2R1bGUgU2hhZGVyc1xuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xuXG4vKipcbiAqIFNoYWRlciBjbGFzcyBmb3IgV0VCR0wgTW9kZVxuICogQGNsYXNzIHA1LlNoYWRlclxuICogQHBhcmFtIHtwNS5SZW5kZXJlckdMfSByZW5kZXJlciBhbiBpbnN0YW5jZSBvZiBwNS5SZW5kZXJlckdMIHRoYXRcbiAqIHdpbGwgcHJvdmlkZSB0aGUgR0wgY29udGV4dCBmb3IgdGhpcyBuZXcgcDUuU2hhZGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gdmVydFNyYyBzb3VyY2UgY29kZSBmb3IgdGhlIHZlcnRleCBzaGFkZXIgKGFzIGEgc3RyaW5nKVxuICogQHBhcmFtIHtTdHJpbmd9IGZyYWdTcmMgc291cmNlIGNvZGUgZm9yIHRoZSBmcmFnbWVudCBzaGFkZXIgKGFzIGEgc3RyaW5nKVxuICovXG5wNS5TaGFkZXIgPSBmdW5jdGlvbihyZW5kZXJlciwgdmVydFNyYywgZnJhZ1NyYykge1xuICAvLyBUT0RPOiBhZGFwdCB0aGlzIHRvIG5vdCB0YWtlIGlkcywgYnV0IHJhdGhlcixcbiAgLy8gdG8gdGFrZSB0aGUgc291cmNlIGZvciBhIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyXG4gIC8vIHRvIGVuYWJsZSBjdXN0b20gc2hhZGVycyBhdCBzb21lIGxhdGVyIGRhdGVcbiAgdGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgdGhpcy5fdmVydFNyYyA9IHZlcnRTcmM7XG4gIHRoaXMuX2ZyYWdTcmMgPSBmcmFnU3JjO1xuICB0aGlzLl92ZXJ0U2hhZGVyID0gLTE7XG4gIHRoaXMuX2ZyYWdTaGFkZXIgPSAtMTtcbiAgdGhpcy5fZ2xQcm9ncmFtID0gMDtcbiAgdGhpcy5fbG9hZGVkQXR0cmlidXRlcyA9IGZhbHNlO1xuICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgdGhpcy5fbG9hZGVkVW5pZm9ybXMgPSBmYWxzZTtcbiAgdGhpcy51bmlmb3JtcyA9IHt9O1xuICB0aGlzLl9ib3VuZCA9IGZhbHNlO1xuICB0aGlzLnNhbXBsZXJzID0gW107XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMsIGNvbXBpbGVzLCBhbmQgbGlua3MgdGhlIHNoYWRlciBiYXNlZCBvbiBpdHNcbiAqIHNvdXJjZXMgZm9yIHRoZSB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMgKHByb3ZpZGVkXG4gKiB0byB0aGUgY29uc3RydWN0b3IpLiBQb3B1bGF0ZXMga25vd24gYXR0cmlidXRlcyBhbmRcbiAqIHVuaWZvcm1zIGZyb20gdGhlIHNoYWRlci5cbiAqIEBtZXRob2QgaW5pdFxuICogQGNoYWluYWJsZVxuICogQHByaXZhdGVcbiAqL1xucDUuU2hhZGVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9nbFByb2dyYW0gPT09IDAgLyogb3IgY29udGV4dCBpcyBzdGFsZT8gKi8pIHtcbiAgICB2YXIgZ2wgPSB0aGlzLl9yZW5kZXJlci5HTDtcblxuICAgIC8vIEB0b2RvOiBvbmNlIGN1c3RvbSBzaGFkaW5nIGlzIGFsbG93ZWQsXG4gICAgLy8gZnJpZW5kbHkgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHVzZWQgaGVyZSB0byBzaGFyZVxuICAgIC8vIGNvbXBpbGVyIGFuZCBsaW5rZXIgZXJyb3JzLlxuXG4gICAgLy9zZXQgdXAgdGhlIHNoYWRlciBieVxuICAgIC8vIDEuIGNyZWF0aW5nIGFuZCBnZXR0aW5nIGEgZ2wgaWQgZm9yIHRoZSBzaGFkZXIgcHJvZ3JhbSxcbiAgICAvLyAyLiBjb21wbGlsaW5nIGl0cyB2ZXJ0ZXggJiBmcmFnbWVudCBzb3VyY2VzLFxuICAgIC8vIDMuIGxpbmtpbmcgdGhlIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyc1xuICAgIHRoaXMuX3ZlcnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG4gICAgLy9sb2FkIGluIG91ciBkZWZhdWx0IHZlcnRleCBzaGFkZXJcbiAgICBnbC5zaGFkZXJTb3VyY2UodGhpcy5fdmVydFNoYWRlciwgdGhpcy5fdmVydFNyYyk7XG4gICAgZ2wuY29tcGlsZVNoYWRlcih0aGlzLl92ZXJ0U2hhZGVyKTtcbiAgICAvLyBpZiBvdXIgdmVydGV4IHNoYWRlciBmYWlsZWQgY29tcGlsYXRpb24/XG4gICAgaWYgKCFnbC5nZXRTaGFkZXJQYXJhbWV0ZXIodGhpcy5fdmVydFNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnWWlrZXMhIEFuIGVycm9yIG9jY3VycmVkIGNvbXBpbGluZyB0aGUgdmVydGV4IHNoYWRlcjonICtcbiAgICAgICAgICBnbC5nZXRTaGFkZXJJbmZvTG9nKHRoaXMuX3ZlcnRTaGFkZXIpXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZnJhZ1NoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpO1xuICAgIC8vbG9hZCBpbiBvdXIgbWF0ZXJpYWwgZnJhZyBzaGFkZXJcbiAgICBnbC5zaGFkZXJTb3VyY2UodGhpcy5fZnJhZ1NoYWRlciwgdGhpcy5fZnJhZ1NyYyk7XG4gICAgZ2wuY29tcGlsZVNoYWRlcih0aGlzLl9mcmFnU2hhZGVyKTtcbiAgICAvLyBpZiBvdXIgZnJhZyBzaGFkZXIgZmFpbGVkIGNvbXBpbGF0aW9uP1xuICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHRoaXMuX2ZyYWdTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ0Rhcm4hIEFuIGVycm9yIG9jY3VycmVkIGNvbXBpbGluZyB0aGUgZnJhZ21lbnQgc2hhZGVyOicgK1xuICAgICAgICAgIGdsLmdldFNoYWRlckluZm9Mb2codGhpcy5fZnJhZ1NoYWRlcilcbiAgICAgICk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl9nbFByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgZ2wuYXR0YWNoU2hhZGVyKHRoaXMuX2dsUHJvZ3JhbSwgdGhpcy5fdmVydFNoYWRlcik7XG4gICAgZ2wuYXR0YWNoU2hhZGVyKHRoaXMuX2dsUHJvZ3JhbSwgdGhpcy5fZnJhZ1NoYWRlcik7XG4gICAgZ2wubGlua1Byb2dyYW0odGhpcy5fZ2xQcm9ncmFtKTtcbiAgICBpZiAoIWdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5fZ2xQcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdTbmFwISBFcnJvciBsaW5raW5nIHNoYWRlciBwcm9ncmFtOiAnICtcbiAgICAgICAgICBnbC5nZXRQcm9ncmFtSW5mb0xvZyh0aGlzLl9nbFByb2dyYW0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX2xvYWRBdHRyaWJ1dGVzKCk7XG4gICAgdGhpcy5fbG9hZFVuaWZvcm1zKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFF1ZXJpZXMgdGhlIGFjdGl2ZSBhdHRyaWJ1dGVzIGZvciB0aGlzIHNoYWRlciBhbmQgbG9hZHNcbiAqIHRoZWlyIG5hbWVzIGFuZCBsb2NhdGlvbnMgaW50byB0aGUgYXR0cmlidXRlcyBhcnJheS5cbiAqIEBtZXRob2QgX2xvYWRBdHRyaWJ1dGVzXG4gKiBAcHJpdmF0ZVxuICovXG5wNS5TaGFkZXIucHJvdG90eXBlLl9sb2FkQXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fbG9hZGVkQXR0cmlidXRlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuXG4gIHZhciBnbCA9IHRoaXMuX3JlbmRlcmVyLkdMO1xuXG4gIHZhciBudW1BdHRyaWJ1dGVzID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihcbiAgICB0aGlzLl9nbFByb2dyYW0sXG4gICAgZ2wuQUNUSVZFX0FUVFJJQlVURVNcbiAgKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1BdHRyaWJ1dGVzOyArK2kpIHtcbiAgICB2YXIgYXR0cmlidXRlSW5mbyA9IGdsLmdldEFjdGl2ZUF0dHJpYih0aGlzLl9nbFByb2dyYW0sIGkpO1xuICAgIHZhciBuYW1lID0gYXR0cmlidXRlSW5mby5uYW1lO1xuICAgIHZhciBsb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMuX2dsUHJvZ3JhbSwgbmFtZSk7XG4gICAgdmFyIGF0dHJpYnV0ZSA9IHt9O1xuICAgIGF0dHJpYnV0ZS5uYW1lID0gbmFtZTtcbiAgICBhdHRyaWJ1dGUubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICBhdHRyaWJ1dGUudHlwZSA9IGF0dHJpYnV0ZUluZm8udHlwZTtcbiAgICBhdHRyaWJ1dGUuc2l6ZSA9IGF0dHJpYnV0ZUluZm8uc2l6ZTtcbiAgICB0aGlzLmF0dHJpYnV0ZXNbbmFtZV0gPSBhdHRyaWJ1dGU7XG4gIH1cblxuICB0aGlzLl9sb2FkZWRBdHRyaWJ1dGVzID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogUXVlcmllcyB0aGUgYWN0aXZlIHVuaWZvcm1zIGZvciB0aGlzIHNoYWRlciBhbmQgbG9hZHNcbiAqIHRoZWlyIG5hbWVzIGFuZCBsb2NhdGlvbnMgaW50byB0aGUgdW5pZm9ybXMgYXJyYXkuXG4gKiBAbWV0aG9kIF9sb2FkVW5pZm9ybXNcbiAqIEBwcml2YXRlXG4gKi9cbnA1LlNoYWRlci5wcm90b3R5cGUuX2xvYWRVbmlmb3JtcyA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fbG9hZGVkVW5pZm9ybXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZ2wgPSB0aGlzLl9yZW5kZXJlci5HTDtcblxuICAvLyBJbnNwZWN0IHNoYWRlciBhbmQgY2FjaGUgdW5pZm9ybSBpbmZvXG4gIHZhciBudW1Vbmlmb3JtcyA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5fZ2xQcm9ncmFtLCBnbC5BQ1RJVkVfVU5JRk9STVMpO1xuXG4gIHZhciBzYW1wbGVySW5kZXggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVVuaWZvcm1zOyArK2kpIHtcbiAgICB2YXIgdW5pZm9ybUluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKHRoaXMuX2dsUHJvZ3JhbSwgaSk7XG4gICAgdmFyIHVuaWZvcm0gPSB7fTtcbiAgICB1bmlmb3JtLmxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuX2dsUHJvZ3JhbSwgdW5pZm9ybUluZm8ubmFtZSk7XG4gICAgdW5pZm9ybS5zaXplID0gdW5pZm9ybUluZm8uc2l6ZTtcbiAgICB2YXIgdW5pZm9ybU5hbWUgPSB1bmlmb3JtSW5mby5uYW1lO1xuICAgIC8vdW5pZm9ybXMgdGhhdHMgYXJlIGFycmF5cyBoYXZlIHRoZWlyIG5hbWUgcmV0dXJuZWQgYXNcbiAgICAvL3NvbWVVbmlmb3JtWzBdIHdoaWNoIGlzIGEgYml0IHNpbGx5IHNvIHdlIHRyaW0gaXRcbiAgICAvL29mZiBoZXJlLiBUaGUgc2l6ZSBwcm9wZXJ0eSB0ZWxscyB1cyB0aGF0IGl0cyBhbiBhcnJheVxuICAgIC8vc28gd2UgZG9udCBsb3NlIGFueSBpbmZvcm1hdGlvbiBieSBkb2luZyB0aGlzXG4gICAgaWYgKHVuaWZvcm1JbmZvLnNpemUgPiAxKSB7XG4gICAgICB1bmlmb3JtTmFtZSA9IHVuaWZvcm1OYW1lLnN1YnN0cmluZygwLCB1bmlmb3JtTmFtZS5pbmRleE9mKCdbMF0nKSk7XG4gICAgfVxuICAgIHVuaWZvcm0ubmFtZSA9IHVuaWZvcm1OYW1lO1xuICAgIHVuaWZvcm0udHlwZSA9IHVuaWZvcm1JbmZvLnR5cGU7XG4gICAgaWYgKHVuaWZvcm0udHlwZSA9PT0gZ2wuU0FNUExFUl8yRCkge1xuICAgICAgdW5pZm9ybS5zYW1wbGVySW5kZXggPSBzYW1wbGVySW5kZXg7XG4gICAgICBzYW1wbGVySW5kZXgrKztcbiAgICAgIHRoaXMuc2FtcGxlcnMucHVzaCh1bmlmb3JtKTtcbiAgICB9XG4gICAgdGhpcy51bmlmb3Jtc1t1bmlmb3JtTmFtZV0gPSB1bmlmb3JtO1xuICB9XG4gIHRoaXMuX2xvYWRlZFVuaWZvcm1zID0gdHJ1ZTtcbn07XG5cbnA1LlNoYWRlci5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBUT0RPXG59O1xuXG4vKipcbiAqIGluaXRpYWxpemVzIChpZiBuZWVkZWQpIGFuZCBiaW5kcyB0aGUgc2hhZGVyIHByb2dyYW0uXG4gKiBAbWV0aG9kIGJpbmRTaGFkZXJcbiAqIEBwcml2YXRlXG4gKi9cbnA1LlNoYWRlci5wcm90b3R5cGUuYmluZFNoYWRlciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmluaXQoKTtcbiAgaWYgKCF0aGlzLl9ib3VuZCkge1xuICAgIHRoaXMudXNlUHJvZ3JhbSgpO1xuICAgIHRoaXMuX2JvdW5kID0gdHJ1ZTtcbiAgICB0aGlzLmJpbmRUZXh0dXJlcygpO1xuXG4gICAgdGhpcy5fbG9hZEF0dHJpYnV0ZXMoKTtcbiAgICB0aGlzLl9sb2FkVW5pZm9ybXMoKTtcblxuICAgIHRoaXMuX3JlbmRlcmVyLl9zZXREZWZhdWx0Q2FtZXJhKCk7XG4gICAgdGhpcy5fc2V0TWF0cml4VW5pZm9ybXMoKTtcbiAgICBpZiAodGhpcyA9PT0gdGhpcy5fcmVuZGVyZXIuY3VyU3Ryb2tlU2hhZGVyKSB7XG4gICAgICB0aGlzLl9zZXRWaWV3cG9ydFVuaWZvcm0oKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQG1ldGhvZCB1bmJpbmRTaGFkZXJcbiAqIEBjaGFpbmFibGVcbiAqIEBwcml2YXRlXG4gKi9cbnA1LlNoYWRlci5wcm90b3R5cGUudW5iaW5kU2hhZGVyID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9ib3VuZCkge1xuICAgIHRoaXMudW5iaW5kVGV4dHVyZXMoKTtcbiAgICAvL3RoaXMuX3JlbmRlcmVyLkdMLnVzZVByb2dyYW0oMCk7ID8/XG4gICAgdGhpcy5fYm91bmQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlNoYWRlci5wcm90b3R5cGUuYmluZFRleHR1cmVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBnbCA9IHRoaXMuX3JlbmRlcmVyLkdMO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2FtcGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdW5pZm9ybSA9IHRoaXMuc2FtcGxlcnNbaV07XG4gICAgdmFyIHRleCA9IHVuaWZvcm0udGV4dHVyZTtcbiAgICBpZiAodGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHVzZXIgaGFzbid0IHlldCBzdXBwbGllZCBhIHRleHR1cmUgZm9yIHRoaXMgc2xvdC5cbiAgICAgIC8vIChvciB0aGVyZSBtYXkgbm90IGJlIG9uZS0tbWF5YmUganVzdCBsaWdodGluZyksXG4gICAgICAvLyBzbyB3ZSBzdXBwbHkgYSBkZWZhdWx0IHRleHR1cmUgaW5zdGVhZC5cbiAgICAgIHRleCA9IHRoaXMuX3JlbmRlcmVyLl9nZXRFbXB0eVRleHR1cmUoKTtcbiAgICB9XG4gICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCArIHVuaWZvcm0uc2FtcGxlckluZGV4KTtcbiAgICB0ZXguYmluZFRleHR1cmUoKTtcbiAgICB0ZXgudXBkYXRlKCk7XG4gICAgZ2wudW5pZm9ybTFpKHVuaWZvcm0ubG9jYXRpb24sIHVuaWZvcm0uc2FtcGxlckluZGV4KTtcbiAgfVxufTtcblxucDUuU2hhZGVyLnByb3RvdHlwZS51bmJpbmRUZXh0dXJlcyA9IGZ1bmN0aW9uKCkge1xuICAvLyBUT0RPOiBtaWdyYXRlIHN0dWZmIGZyb20gbWF0ZXJpYWwuanMgaGVyZVxuICAvLyAtIE9SIC0gaGF2ZSBtYXRlcmlhbC5qcyBkZWZpbmUgdGhpcyBmdW5jdGlvblxufTtcblxucDUuU2hhZGVyLnByb3RvdHlwZS5fc2V0TWF0cml4VW5pZm9ybXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zZXRVbmlmb3JtKCd1UHJvamVjdGlvbk1hdHJpeCcsIHRoaXMuX3JlbmRlcmVyLnVQTWF0cml4Lm1hdDQpO1xuICB0aGlzLnNldFVuaWZvcm0oJ3VNb2RlbFZpZXdNYXRyaXgnLCB0aGlzLl9yZW5kZXJlci51TVZNYXRyaXgubWF0NCk7XG4gIHRoaXMuc2V0VW5pZm9ybSgndVZpZXdNYXRyaXgnLCB0aGlzLl9yZW5kZXJlci5jYW1lcmFNYXRyaXgubWF0NCk7XG4gIGlmICh0aGlzID09PSB0aGlzLl9yZW5kZXJlci5jdXJGaWxsU2hhZGVyKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIudU5NYXRyaXguaW52ZXJzZVRyYW5zcG9zZSh0aGlzLl9yZW5kZXJlci51TVZNYXRyaXgpO1xuICAgIHRoaXMuc2V0VW5pZm9ybSgndU5vcm1hbE1hdHJpeCcsIHRoaXMuX3JlbmRlcmVyLnVOTWF0cml4Lm1hdDMpO1xuICB9XG59O1xuXG5wNS5TaGFkZXIucHJvdG90eXBlLl9zZXRWaWV3cG9ydFVuaWZvcm0gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zZXRVbmlmb3JtKCd1Vmlld3BvcnQnLCB0aGlzLl9yZW5kZXJlci5fdmlld3BvcnQpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIHVzZVByb2dyYW1cbiAqIEBjaGFpbmFibGVcbiAqIEBwcml2YXRlXG4gKi9cbnA1LlNoYWRlci5wcm90b3R5cGUudXNlUHJvZ3JhbSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZ2wgPSB0aGlzLl9yZW5kZXJlci5HTDtcbiAgZ2wudXNlUHJvZ3JhbSh0aGlzLl9nbFByb2dyYW0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogV3JhcHBlciBhcm91bmQgZ2wudW5pZm9ybSBmdW5jdGlvbnMuXG4gKiBBcyB3ZSBzdG9yZSB1bmlmb3JtIGluZm8gaW4gdGhlIHNoYWRlciB3ZSBjYW4gdXNlIHRoYXRcbiAqIHRvIGRvIHR5cGUgY2hlY2tpbmcgb24gdGhlIHN1cHBsaWVkIGRhdGEgYW5kIGNhbGxcbiAqIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbi5cbiAqIEBtZXRob2Qgc2V0VW5pZm9ybVxuICogQGNoYWluYWJsZVxuICogQHBhcmFtIHtTdHJpbmd9IHVuaWZvcm1OYW1lIHRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIGluIHRoZVxuICogc2hhZGVyIHByb2dyYW1cbiAqIEBwYXJhbSB7T2JqZWN0fE51bWJlcnxCb29sZWFufE51bWJlcltdfSBkYXRhIHRoZSBkYXRhIHRvIGJlIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhhdCB1bmlmb3JtOyB0eXBlIHZhcmllcyAoY291bGQgYmUgYSBzaW5nbGUgbnVtZXJpY2FsIHZhbHVlLCBhcnJheSxcbiAqIG1hdHJpeCwgb3IgdGV4dHVyZSAvIHNhbXBsZXIgcmVmZXJlbmNlKVxuICovXG5wNS5TaGFkZXIucHJvdG90eXBlLnNldFVuaWZvcm0gPSBmdW5jdGlvbih1bmlmb3JtTmFtZSwgZGF0YSkge1xuICAvL0B0b2RvIHVwZGF0ZSBhbGwgY3VycmVudCBnbC51bmlmb3JtWFggY2FsbHNcblxuICB2YXIgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbdW5pZm9ybU5hbWVdO1xuICBpZiAoIXVuaWZvcm0pIHtcbiAgICAvL0B0b2RvIHdhcm5pbmc/XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBsb2NhdGlvbiA9IHVuaWZvcm0ubG9jYXRpb247XG5cbiAgdmFyIGdsID0gdGhpcy5fcmVuZGVyZXIuR0w7XG4gIC8vIHRvZG86IGlzIHRoaXMgc2FmZSB0byBkbyBoZXJlP1xuICAvLyB0b2RvOiBzdG9yZSB0aGUgdmFsdWVzIGFub3RoZXIgd2F5P1xuICB0aGlzLnVzZVByb2dyYW0oKTtcblxuICAvLyBUT0RPIEJJTkQ/XG5cbiAgc3dpdGNoICh1bmlmb3JtLnR5cGUpIHtcbiAgICBjYXNlIGdsLkJPT0w6XG4gICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgICBnbC51bmlmb3JtMWkobG9jYXRpb24sIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2wudW5pZm9ybTFpKGxvY2F0aW9uLCAwKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZ2wuSU5UOlxuICAgICAgaWYgKHVuaWZvcm0uc2l6ZSA+IDEpIHtcbiAgICAgICAgZGF0YS5sZW5ndGggJiYgZ2wudW5pZm9ybTFpdihsb2NhdGlvbiwgZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnbC51bmlmb3JtMWkobG9jYXRpb24sIGRhdGEpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBnbC5GTE9BVDpcbiAgICAgIGlmICh1bmlmb3JtLnNpemUgPiAxKSB7XG4gICAgICAgIGRhdGEubGVuZ3RoICYmIGdsLnVuaWZvcm0xZnYobG9jYXRpb24sIGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2wudW5pZm9ybTFmKGxvY2F0aW9uLCBkYXRhKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZ2wuRkxPQVRfTUFUMzpcbiAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIGZhbHNlLCBkYXRhKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZ2wuRkxPQVRfTUFUNDpcbiAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24sIGZhbHNlLCBkYXRhKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZ2wuRkxPQVRfVkVDMjpcbiAgICAgIGlmICh1bmlmb3JtLnNpemUgPiAxKSB7XG4gICAgICAgIGRhdGEubGVuZ3RoICYmIGdsLnVuaWZvcm0yZnYobG9jYXRpb24sIGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2wudW5pZm9ybTJmKGxvY2F0aW9uLCBkYXRhWzBdLCBkYXRhWzFdKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZ2wuRkxPQVRfVkVDMzpcbiAgICAgIGlmICh1bmlmb3JtLnNpemUgPiAxKSB7XG4gICAgICAgIGRhdGEubGVuZ3RoICYmIGdsLnVuaWZvcm0zZnYobG9jYXRpb24sIGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2wudW5pZm9ybTNmKGxvY2F0aW9uLCBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZ2wuRkxPQVRfVkVDNDpcbiAgICAgIGlmICh1bmlmb3JtLnNpemUgPiAxKSB7XG4gICAgICAgIGRhdGEubGVuZ3RoICYmIGdsLnVuaWZvcm00ZnYobG9jYXRpb24sIGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2wudW5pZm9ybTRmKGxvY2F0aW9uLCBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZ2wuU0FNUExFUl8yRDpcbiAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTAgKyB1bmlmb3JtLnNhbXBsZXJJbmRleCk7XG4gICAgICB1bmlmb3JtLnRleHR1cmUgPSB0aGlzLl9yZW5kZXJlci5nZXRUZXh0dXJlKGRhdGEpO1xuICAgICAgZ2wudW5pZm9ybTFpKHVuaWZvcm0ubG9jYXRpb24sIHVuaWZvcm0uc2FtcGxlckluZGV4KTtcbiAgICAgIGJyZWFrO1xuICAgIC8vQHRvZG8gY29tcGxldGUgYWxsIHR5cGVzXG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKiBOT05FIE9GIFRISVMgSVMgRkFTVCBPUiBFRkZJQ0lFTlQgQlVUIEJFQVIgV0lUSCBNRVxuICpcbiAqIHRoZXNlIHNoYWRlciBcInR5cGVcIiBxdWVyeSBtZXRob2RzIGFyZSB1c2VkIGJ5IHZhcmlvdXNcbiAqIGZhY2lsaXRpZXMgb2YgdGhlIHJlbmRlcmVyIHRvIGRldGVybWluZSBpZiBjaGFuZ2luZ1xuICogdGhlIHNoYWRlciB0eXBlIGZvciB0aGUgcmVxdWlyZWQgYWN0aW9uIChmb3IgZXhhbXBsZSxcbiAqIGRvIHdlIG5lZWQgdG8gbG9hZCB0aGUgZGVmYXVsdCBsaWdodGluZyBzaGFkZXIgaWYgdGhlXG4gKiBjdXJyZW50IHNoYWRlciBjYW5ub3QgaGFuZGxlIGxpZ2h0aW5nPylcbiAqXG4gKiovXG5cbnA1LlNoYWRlci5wcm90b3R5cGUuaXNMaWdodFNoYWRlciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gKFxuICAgIHRoaXMudW5pZm9ybXMudVVzZUxpZ2h0aW5nICE9PSB1bmRlZmluZWQgfHxcbiAgICB0aGlzLnVuaWZvcm1zLnVBbWJpZW50TGlnaHRDb3VudCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgdGhpcy51bmlmb3Jtcy51RGlyZWN0aW9uYWxMaWdodENvdW50ICE9PSB1bmRlZmluZWQgfHxcbiAgICB0aGlzLnVuaWZvcm1zLnVQb2ludExpZ2h0Q291bnQgIT09IHVuZGVmaW5lZCB8fFxuICAgIHRoaXMudW5pZm9ybXMudUFtYmllbnRDb2xvciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgdGhpcy51bmlmb3Jtcy51RGlyZWN0aW9uYWxDb2xvciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgdGhpcy51bmlmb3Jtcy51UG9pbnRMaWdodExvY2F0aW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICB0aGlzLnVuaWZvcm1zLnVQb2ludExpZ2h0Q29sb3IgIT09IHVuZGVmaW5lZCB8fFxuICAgIHRoaXMudW5pZm9ybXMudUxpZ2h0aW5nRGlyZWN0aW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICB0aGlzLnVuaWZvcm1zLnVTcGVjdWxhciAhPT0gdW5kZWZpbmVkXG4gICk7XG59O1xuXG5wNS5TaGFkZXIucHJvdG90eXBlLmlzVGV4dHVyZVNoYWRlciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zYW1wbGVySW5kZXggPiAwO1xufTtcblxucDUuU2hhZGVyLnByb3RvdHlwZS5pc0NvbG9yU2hhZGVyID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAoXG4gICAgdGhpcy5hdHRyaWJ1dGVzLmFWZXJ0ZXhDb2xvciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgdGhpcy51bmlmb3Jtcy51TWF0ZXJpYWxDb2xvciAhPT0gdW5kZWZpbmVkXG4gICk7XG59O1xuXG5wNS5TaGFkZXIucHJvdG90eXBlLmlzVGV4TGlnaHRTaGFkZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuaXNMaWdodFNoYWRlcigpICYmIHRoaXMuaXNUZXh0dXJlU2hhZGVyKCk7XG59O1xuXG5wNS5TaGFkZXIucHJvdG90eXBlLmlzU3Ryb2tlU2hhZGVyID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnVuaWZvcm1zLnVTdHJva2VXZWlnaHQgIT09IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBlbmFibGVBdHRyaWJcbiAqIEBjaGFpbmFibGVcbiAqIEBwcml2YXRlXG4gKi9cbnA1LlNoYWRlci5wcm90b3R5cGUuZW5hYmxlQXR0cmliID0gZnVuY3Rpb24oXG4gIGxvYyxcbiAgc2l6ZSxcbiAgdHlwZSxcbiAgbm9ybWFsaXplZCxcbiAgc3RyaWRlLFxuICBvZmZzZXRcbikge1xuICB2YXIgZ2wgPSB0aGlzLl9yZW5kZXJlci5HTDtcbiAgaWYgKGxvYyAhPT0gLTEpIHtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2MpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIobG9jLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIG9mZnNldCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1LlNoYWRlcjtcblxufSx7XCIuLi9jb3JlL2NvcmVcIjoyMn1dLDc0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgcDUuVGV4dHVyZSBjbGFzc1xuICogQG1vZHVsZSBMaWdodHMsIENhbWVyYVxuICogQHN1Ym1vZHVsZSBNYXRlcmlhbFxuICogQGZvciBwNVxuICogQHJlcXVpcmVzIGNvcmVcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xuXG4vKipcbiAqIFRleHR1cmUgY2xhc3MgZm9yIFdFQkdMIE1vZGVcbiAqIEBwcml2YXRlXG4gKiBAY2xhc3MgcDUuVGV4dHVyZVxuICogQHBhcmFtIHtwNS5SZW5kZXJlckdMfSByZW5kZXJlciBhbiBpbnN0YW5jZSBvZiBwNS5SZW5kZXJlckdMIHRoYXRcbiAqIHdpbGwgcHJvdmlkZSB0aGUgR0wgY29udGV4dCBmb3IgdGhpcyBuZXcgcDUuVGV4dHVyZVxuICogQHBhcmFtIHtwNS5JbWFnZXxwNS5HcmFwaGljc3xwNS5FbGVtZW50fHA1Lk1lZGlhRWxlbWVudH0gW29ial0gdGhlXG4gKiBvYmplY3QgY29udGFpbmluZyB0aGUgaW1hZ2UgZGF0YSB0byBzdG9yZSBpbiB0aGUgdGV4dHVyZS5cbiAqL1xucDUuVGV4dHVyZSA9IGZ1bmN0aW9uKHJlbmRlcmVyLCBvYmopIHtcbiAgdGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlcjtcblxuICB2YXIgZ2wgPSB0aGlzLl9yZW5kZXJlci5HTDtcblxuICB0aGlzLnNyYyA9IG9iajtcbiAgdGhpcy5nbFRleCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5nbFRhcmdldCA9IGdsLlRFWFRVUkVfMkQ7XG4gIHRoaXMuZ2xGb3JtYXQgPSBnbC5SR0JBO1xuICB0aGlzLm1pcG1hcHMgPSBmYWxzZTtcbiAgdGhpcy5nbE1pbkZpbHRlciA9IGdsLkxJTkVBUjtcbiAgdGhpcy5nbE1hZ0ZpbHRlciA9IGdsLkxJTkVBUjtcbiAgdGhpcy5nbFdyYXBTID0gZ2wuQ0xBTVBfVE9fRURHRTtcbiAgdGhpcy5nbFdyYXBUID0gZ2wuQ0xBTVBfVE9fRURHRTtcblxuICAvLyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGlzIHRleHR1cmUgbWlnaHQgbmVlZCBjb25zdGFudCB1cGRhdGluZ1xuICAvLyBiZWNhdXNlIGl0IGlzIGEgdmlkZW8gb3IgZ2lmLlxuICB0aGlzLmlzU3JjTWVkaWFFbGVtZW50ID1cbiAgICB0eXBlb2YgcDUuTWVkaWFFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogaW5zdGFuY2VvZiBwNS5NZWRpYUVsZW1lbnQ7XG4gIHRoaXMuX3ZpZGVvUHJldlVwZGF0ZVRpbWUgPSAwO1xuICB0aGlzLmlzU3JjSFRNTEVsZW1lbnQgPVxuICAgIHR5cGVvZiBwNS5FbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIG9iaiBpbnN0YW5jZW9mIHA1LkVsZW1lbnQgJiZcbiAgICAhKG9iaiBpbnN0YW5jZW9mIHA1LkdyYXBoaWNzKTtcbiAgdGhpcy5pc1NyY1A1SW1hZ2UgPSBvYmogaW5zdGFuY2VvZiBwNS5JbWFnZTtcbiAgdGhpcy5pc1NyY1A1R3JhcGhpY3MgPSBvYmogaW5zdGFuY2VvZiBwNS5HcmFwaGljcztcblxuICB2YXIgdGV4dHVyZURhdGEgPSB0aGlzLl9nZXRUZXh0dXJlRGF0YUZyb21Tb3VyY2UoKTtcbiAgdGhpcy53aWR0aCA9IHRleHR1cmVEYXRhLndpZHRoO1xuICB0aGlzLmhlaWdodCA9IHRleHR1cmVEYXRhLmhlaWdodDtcblxuICB0aGlzLmluaXQodGV4dHVyZURhdGEpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlRleHR1cmUucHJvdG90eXBlLl9nZXRUZXh0dXJlRGF0YUZyb21Tb3VyY2UgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHRleHR1cmVEYXRhO1xuICBpZiAodGhpcy5pc1NyY1A1SW1hZ2UpIHtcbiAgICAvLyBwYXJhbSBpcyBhIHA1LkltYWdlXG4gICAgdGV4dHVyZURhdGEgPSB0aGlzLnNyYy5jYW52YXM7XG4gIH0gZWxzZSBpZiAoXG4gICAgdGhpcy5pc1NyY01lZGlhRWxlbWVudCB8fFxuICAgIHRoaXMuaXNTcmNQNUdyYXBoaWNzIHx8XG4gICAgdGhpcy5pc1NyY0hUTUxFbGVtZW50XG4gICkge1xuICAgIC8vIGlmIHBhcmFtIGlzIGEgdmlkZW8gSFRNTCBlbGVtZW50XG4gICAgdGV4dHVyZURhdGEgPSB0aGlzLnNyYy5lbHQ7XG4gIH1cbiAgcmV0dXJuIHRleHR1cmVEYXRhO1xufTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBjb21tb24gdGV4dHVyZSBwYXJhbWV0ZXJzLCBjcmVhdGVzIGEgZ2wgdGV4dHVyZSxcbiAqIHRyaWVzIHRvIHVwbG9hZCB0aGUgdGV4dHVyZSBmb3IgdGhlIGZpcnN0IHRpbWUgaWYgZGF0YSBpc1xuICogYWxyZWFkeSBhdmFpbGFibGUuXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBpbml0XG4gKi9cbnA1LlRleHR1cmUucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihkYXRhKSB7XG4gIHZhciBnbCA9IHRoaXMuX3JlbmRlcmVyLkdMO1xuICB0aGlzLmdsVGV4ID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICB0aGlzLmJpbmRUZXh0dXJlKCk7XG5cbiAgLy9nbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0cnVlKTtcbiAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIHRoaXMuZ2xNYWdGaWx0ZXIpO1xuICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgdGhpcy5nbE1pbkZpbHRlcik7XG4gIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIHRoaXMuZ2xXcmFwUyk7XG4gIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIHRoaXMuZ2xXcmFwVCk7XG5cbiAgaWYgKFxuICAgIHRoaXMud2lkdGggPT09IDAgfHxcbiAgICB0aGlzLmhlaWdodCA9PT0gMCB8fFxuICAgICh0aGlzLmlzU3JjTWVkaWFFbGVtZW50ICYmICF0aGlzLnNyYy5sb2FkZWRtZXRhZGF0YSlcbiAgKSB7XG4gICAgLy8gYXNzaWduIGEgMXgxIGVtcHR5IHRleHR1cmUgaW5pdGlhbGx5LCBiZWNhdXNlIGRhdGEgaXMgbm90IHlldCByZWFkeSxcbiAgICAvLyBzbyB0aGF0IG5vIGVycm9ycyBvY2N1ciBpbiBnbCBjb25zb2xlIVxuICAgIHZhciB0bXBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoWzEsIDEsIDEsIDFdKTtcbiAgICBnbC50ZXhJbWFnZTJEKFxuICAgICAgdGhpcy5nbFRhcmdldCxcbiAgICAgIDAsXG4gICAgICBnbC5SR0JBLFxuICAgICAgMSxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICAgdGhpcy5nbEZvcm1hdCxcbiAgICAgIGdsLlVOU0lHTkVEX0JZVEUsXG4gICAgICB0bXBkYXRhXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBkYXRhIGlzIHJlYWR5OiBqdXN0IHB1c2ggdGhlIHRleHR1cmUhXG4gICAgZ2wudGV4SW1hZ2UyRChcbiAgICAgIHRoaXMuZ2xUYXJnZXQsXG4gICAgICAwLFxuICAgICAgdGhpcy5nbEZvcm1hdCxcbiAgICAgIHRoaXMuZ2xGb3JtYXQsXG4gICAgICBnbC5VTlNJR05FRF9CWVRFLFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBzb3VyY2UgZGF0YSBmb3IgdGhpcyB0ZXh0dXJlIGhhcyBjaGFuZ2VkIChpZiBpdCdzXG4gKiBlYXN5IHRvIGRvIHNvKSBhbmQgcmV1cGxvYWRzIHRoZSB0ZXh0dXJlIGlmIG5lY2Vzc2FyeS4gSWYgaXQncyBub3RcbiAqIHBvc3NpYmxlIG9yIHRvIGV4cGVuc2l2ZSB0byBkbyBhIGNhbGN1bGF0aW9uIHRvIGRldGVybWluZSB3aGV0ZXIgb3JcbiAqIG5vdCB0aGUgZGF0YSBoYXMgb2NjdXJyZWQsIHRoaXMgbWV0aG9kIHNpbXBseSByZS11cGxvYWRzIHRoZSB0ZXh0dXJlLlxuICogQG1ldGhvZCB1cGRhdGVcbiAqL1xucDUuVGV4dHVyZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBkYXRhID0gdGhpcy5zcmM7XG4gIGlmIChkYXRhLndpZHRoID09PSAwIHx8IGRhdGEuaGVpZ2h0ID09PSAwKSB7XG4gICAgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvIVxuICB9XG5cbiAgdmFyIHRleHR1cmVEYXRhID0gdGhpcy5fZ2V0VGV4dHVyZURhdGFGcm9tU291cmNlKCk7XG5cbiAgdmFyIGdsID0gdGhpcy5fcmVuZGVyZXIuR0w7XG4gIC8vIHB1bGwgdGV4dHVyZSBmcm9tIGRhdGEsIG1ha2Ugc3VyZSB3aWR0aCAmIGhlaWdodCBhcmUgYXBwcm9wcmlhdGVcbiAgaWYgKHRleHR1cmVEYXRhLndpZHRoICE9PSB0aGlzLndpZHRoIHx8IHRleHR1cmVEYXRhLmhlaWdodCAhPT0gdGhpcy5oZWlnaHQpIHtcbiAgICAvLyBtYWtlIHN1cmUgdGhhdCBpZiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGlzLnNyYyBoYXZlIGNoYW5nZWRcbiAgICAvLyBmb3Igc29tZSByZWFzb24sIHdlIHVwZGF0ZSBvdXIgbWV0YWRhdGEgYW5kIHVwbG9hZCB0aGUgdGV4dHVyZSBhZ2FpblxuICAgIHRoaXMud2lkdGggPSB0ZXh0dXJlRGF0YS53aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IHRleHR1cmVEYXRhLmhlaWdodDtcblxuICAgIHRoaXMuYmluZFRleHR1cmUoKTtcbiAgICBnbC50ZXhJbWFnZTJEKFxuICAgICAgdGhpcy5nbFRhcmdldCxcbiAgICAgIDAsXG4gICAgICB0aGlzLmdsRm9ybWF0LFxuICAgICAgdGhpcy5nbEZvcm1hdCxcbiAgICAgIGdsLlVOU0lHTkVEX0JZVEUsXG4gICAgICB0ZXh0dXJlRGF0YVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5pc1NyY1A1SW1hZ2UpIHtcbiAgICAgIGRhdGEuc2V0TW9kaWZpZWQoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1NyY01lZGlhRWxlbWVudCB8fCB0aGlzLmlzU3JjSFRNTEVsZW1lbnQpIHtcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCBmcmFtZSB0aGUgbWV0YWRhdGEgY29tZXMgaW4sIHRoZSBzaXplIHdpbGwgYmUgY2hhbmdlZFxuICAgICAgLy8gZnJvbSAwIHRvIGFjdHVhbCBzaXplLCBidXQgcGl4ZWxzIG1heSBub3QgYmUgYXZhaWxhYmxlLlxuICAgICAgLy8gZmxhZyBmb3IgdXBkYXRlIGluIGEgZnV0dXJlIGZyYW1lLlxuICAgICAgLy8gaWYgd2UgZG9uJ3QgZG8gdGhpcywgYSBwYXVzZWQgdmlkZW8sIGZvciBleGFtcGxlLCBtYXkgbm90XG4gICAgICAvLyBzZW5kIHRoZSBmaXJzdCBmcmFtZSB0byB0ZXh0dXJlIG1lbW9yeS5cbiAgICAgIGRhdGEuc2V0TW9kaWZpZWQodHJ1ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRoaXMuaXNTcmNQNUltYWdlKSB7XG4gICAgLy8gZm9yIGFuIGltYWdlLCB3ZSBvbmx5IHVwZGF0ZSBpZiB0aGUgbW9kaWZpZWQgZmllbGQgaGFzIGJlZW4gc2V0LFxuICAgIC8vIGZvciBleGFtcGxlLCBieSBhIGNhbGwgdG8gcDUuSW1hZ2Uuc2V0XG4gICAgaWYgKGRhdGEuaXNNb2RpZmllZCgpKSB7XG4gICAgICB0aGlzLmJpbmRUZXh0dXJlKCk7XG4gICAgICBnbC50ZXhJbWFnZTJEKFxuICAgICAgICB0aGlzLmdsVGFyZ2V0LFxuICAgICAgICAwLFxuICAgICAgICB0aGlzLmdsRm9ybWF0LFxuICAgICAgICB0aGlzLmdsRm9ybWF0LFxuICAgICAgICBnbC5VTlNJR05FRF9CWVRFLFxuICAgICAgICB0ZXh0dXJlRGF0YVxuICAgICAgKTtcbiAgICAgIGRhdGEuc2V0TW9kaWZpZWQoZmFsc2UpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0aGlzLmlzU3JjTWVkaWFFbGVtZW50KSB7XG4gICAgdmFyIHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgLy8gZm9yIGEgbWVkaWEgZWxlbWVudCAodmlkZW8pLCB3ZSdsbCBjaGVjayBpZiB0aGUgY3VycmVudCB0aW1lIGluXG4gICAgLy8gdGhlIHZpZGVvIGZyYW1lIG1hdGNoZXMgdGhlIGxhc3QgdGltZS4gaWYgaXQgZG9lc24ndCBtYXRjaCwgdGhlXG4gICAgLy8gdmlkZW8gaGFzIGFkdmFuY2VkIG9yIG90aGVyd2lzZSBiZWVuIHRha2VuIHRvIGEgbmV3IGZyYW1lLFxuICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHVwbG9hZCBpdC5cbiAgICBpZiAoZGF0YS5pc01vZGlmaWVkKCkpIHtcbiAgICAgIC8vIHA1Lk1lZGlhRWxlbWVudCBtYXkgaGF2ZSBhbHNvIGhhZCBzZXQvdXBkYXRlUGl4ZWxzLCBldGMuIGNhbGxlZFxuICAgICAgLy8gb24gaXQgYW5kIHNob3VsZCBiZSB1cGRhdGVkLCBvciBtYXkgaGF2ZSBiZWVuIHNldCBmb3IgdGhlIGZpcnN0XG4gICAgICAvLyB0aW1lIVxuICAgICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgICAgIGRhdGEuc2V0TW9kaWZpZWQoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5sb2FkZWRtZXRhZGF0YSkge1xuICAgICAgLy8gaWYgdGhlIG1ldGEgZGF0YSBoYXMgYmVlbiBsb2FkZWQsIHdlIGNhbiBhc2sgdGhlIHZpZGVvXG4gICAgICAvLyB3aGF0IGl0J3MgY3VycmVudCBwb3NpdGlvbiAoaW4gdGltZSkgaXMuXG4gICAgICBpZiAodGhpcy5fdmlkZW9QcmV2VXBkYXRlVGltZSAhPT0gZGF0YS50aW1lKCkpIHtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSB0ZXh0dXJlIGluIGdwdSBtZW0gb25seSBpZiB0aGUgY3VycmVudFxuICAgICAgICAvLyB2aWRlbyB0aW1lc3RhbXAgZG9lcyBub3QgbWF0Y2ggdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdFxuICAgICAgICAvLyB0aW1lIHdlIHVwbG9hZGVkIHRoaXMgdGV4dHVyZSAoYW5kIHVwZGF0ZSB0aGUgdGltZSB3ZVxuICAgICAgICAvLyBsYXN0IHVwbG9hZGVkLCB0b28pXG4gICAgICAgIHRoaXMuX3ZpZGVvUHJldlVwZGF0ZVRpbWUgPSBkYXRhLnRpbWUoKTtcbiAgICAgICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICB0aGlzLmJpbmRUZXh0dXJlKCk7XG4gICAgICBnbC50ZXhJbWFnZTJEKFxuICAgICAgICB0aGlzLmdsVGFyZ2V0LFxuICAgICAgICAwLFxuICAgICAgICB0aGlzLmdsRm9ybWF0LFxuICAgICAgICB0aGlzLmdsRm9ybWF0LFxuICAgICAgICBnbC5VTlNJR05FRF9CWVRFLFxuICAgICAgICB0ZXh0dXJlRGF0YVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLyogZGF0YSBpbnN0YW5jZW9mIHA1LkdyYXBoaWNzLCBwcm9iYWJseSAqLyAvLyB0aGVyZSBpcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHRlbGwgaWYgdGhlIHRleHR1cmUgY2FuIGJlXG4gICAgLy8gY29uZGl0aW9uYWxseSB1cGRhdGVkOyBzbyB0byBiZSBzYWZlLCB3ZSBqdXN0IGdvIGFoZWFkIGFuZCB1cGxvYWQgaXQuXG4gICAgZ2wudGV4SW1hZ2UyRChcbiAgICAgIHRoaXMuZ2xUYXJnZXQsXG4gICAgICAwLFxuICAgICAgdGhpcy5nbEZvcm1hdCxcbiAgICAgIHRoaXMuZ2xGb3JtYXQsXG4gICAgICBnbC5VTlNJR05FRF9CWVRFLFxuICAgICAgdGV4dHVyZURhdGFcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEJpbmRzIHRoZSB0ZXh0dXJlIHRvIHRoZSBhcHByb3ByaWF0ZSBHTCB0YXJnZXQuXG4gKiBAbWV0aG9kIGJpbmRUZXh0dXJlXG4gKi9cbnA1LlRleHR1cmUucHJvdG90eXBlLmJpbmRUZXh0dXJlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGJpbmQgdGV4dHVyZSB1c2luZyBnbCBjb250ZXh0ICsgZ2xUYXJnZXQgYW5kXG4gIC8vIGdlbmVyYXRlZCBnbCB0ZXh0dXJlIG9iamVjdFxuICB2YXIgZ2wgPSB0aGlzLl9yZW5kZXJlci5HTDtcbiAgZ2wuYmluZFRleHR1cmUodGhpcy5nbFRhcmdldCwgdGhpcy5nbFRleCk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFVuYmluZHMgdGhlIHRleHR1cmUgZnJvbSB0aGUgYXBwcm9wcmlhdGUgR0wgdGFyZ2V0LlxuICogQG1ldGhvZCB1bmJpbmRUZXh0dXJlXG4gKi9cbnA1LlRleHR1cmUucHJvdG90eXBlLnVuYmluZFRleHR1cmUgPSBmdW5jdGlvbigpIHtcbiAgLy8gdW5iaW5kIHBlciBhYm92ZSwgZGlzYWJsZSB0ZXh0dXJpbmcgb24gZ2xUYXJnZXRcbiAgdmFyIGdsID0gdGhpcy5fcmVuZGVyZXIuR0w7XG4gIGdsLmJpbmRUZXh0dXJlKHRoaXMuZ2xUYXJnZXQsIG51bGwpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwNS5UZXh0dXJlO1xuXG59LHtcIi4uL2NvcmUvY29yZVwiOjIyfV0sNzU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbW9kdWxlIFNoYXBlXG4gKiBAc3VibW9kdWxlIDNEIFByaW1pdGl2ZXNcbiAqIEBmb3IgcDVcbiAqIEByZXF1aXJlcyBjb3JlXG4gKiBAcmVxdWlyZXMgcDUuR2VvbWV0cnlcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwNSA9IF9kZXJlcV8oJy4uL2NvcmUvY29yZScpO1xuX2RlcmVxXygnLi9wNS5HZW9tZXRyeScpO1xuXG4vKipcbiAqIERyYXcgYSBwbGFuZSB3aXRoIGdpdmVuIGEgd2lkdGggYW5kIGhlaWdodFxuICogQG1ldGhvZCBwbGFuZVxuICogQHBhcmFtICB7TnVtYmVyfSBbd2lkdGhdICAgIHdpZHRoIG9mIHRoZSBwbGFuZVxuICogQHBhcmFtICB7TnVtYmVyfSBbaGVpZ2h0XSAgIGhlaWdodCBvZiB0aGUgcGxhbmVcbiAqIEBwYXJhbSAge0ludGVnZXJ9IFtkZXRhaWxYXSAgT3B0aW9uYWwgbnVtYmVyIG9mIHRyaWFuZ2xlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZGl2aXNpb25zIGluIHgtZGltZW5zaW9uXG4gKiBAcGFyYW0ge0ludGVnZXJ9IFtkZXRhaWxZXSAgIE9wdGlvbmFsIG51bWJlciBvZiB0cmlhbmdsZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmRpdmlzaW9ucyBpbiB5LWRpbWVuc2lvblxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vZHJhdyBhIHBsYW5lIHdpdGggd2lkdGggNTAgYW5kIGhlaWdodCA1MFxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGNyZWF0ZUNhbnZhcygxMDAsIDEwMCwgV0VCR0wpO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIGRyYXcoKSB7XG4gKiAgIGJhY2tncm91bmQoMjAwKTtcbiAqICAgcGxhbmUoNTAsIDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBhbHRcbiAqIE5vdGhpbmcgZGlzcGxheWVkIG9uIGNhbnZhc1xuICogUm90YXRpbmcgaW50ZXJpb3IgdmlldyBvZiBhIGJveCB3aXRoIHNpZGVzIHRoYXQgY2hhbmdlIGNvbG9yLlxuICogM2QgcmVkIGFuZCBncmVlbiBncmFkaWVudC5cbiAqIFJvdGF0aW5nIGludGVyaW9yIHZpZXcgb2YgYSBjeWxpbmRlciB3aXRoIHNpZGVzIHRoYXQgY2hhbmdlIGNvbG9yLlxuICogUm90YXRpbmcgdmlldyBvZiBhIGN5bGluZGVyIHdpdGggc2lkZXMgdGhhdCBjaGFuZ2UgY29sb3IuXG4gKiAzZCByZWQgYW5kIGdyZWVuIGdyYWRpZW50LlxuICogcm90YXRpbmcgdmlldyBvZiBhIG11bHRpLWNvbG9yZWQgY3lsaW5kZXIgd2l0aCBjb25jYXZlIHNpZGVzLlxuICovXG5wNS5wcm90b3R5cGUucGxhbmUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0LCBkZXRhaWxYLCBkZXRhaWxZKSB7XG4gIHRoaXMuX2Fzc2VydDNkKCdwbGFuZScpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdwbGFuZScsIGFyZ3VtZW50cyk7XG4gIGlmICh0eXBlb2Ygd2lkdGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgd2lkdGggPSA1MDtcbiAgfVxuICBpZiAodHlwZW9mIGhlaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBoZWlnaHQgPSB3aWR0aDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGV0YWlsWCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZXRhaWxYID0gMTtcbiAgfVxuICBpZiAodHlwZW9mIGRldGFpbFkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGV0YWlsWSA9IDE7XG4gIH1cblxuICB2YXIgZ0lkID0gJ3BsYW5lfCcgKyBkZXRhaWxYICsgJ3wnICsgZGV0YWlsWTtcblxuICBpZiAoIXRoaXMuX3JlbmRlcmVyLmdlb21ldHJ5SW5IYXNoKGdJZCkpIHtcbiAgICB2YXIgX3BsYW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdSwgdiwgcDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHRoaXMuZGV0YWlsWTsgaSsrKSB7XG4gICAgICAgIHYgPSBpIC8gdGhpcy5kZXRhaWxZO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8PSB0aGlzLmRldGFpbFg7IGorKykge1xuICAgICAgICAgIHUgPSBqIC8gdGhpcy5kZXRhaWxYO1xuICAgICAgICAgIHAgPSBuZXcgcDUuVmVjdG9yKHUgLSAwLjUsIHYgLSAwLjUsIDApO1xuICAgICAgICAgIHRoaXMudmVydGljZXMucHVzaChwKTtcbiAgICAgICAgICB0aGlzLnV2cy5wdXNoKHUsIHYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgcGxhbmVHZW9tID0gbmV3IHA1Lkdlb21ldHJ5KGRldGFpbFgsIGRldGFpbFksIF9wbGFuZSk7XG4gICAgcGxhbmVHZW9tLmNvbXB1dGVGYWNlcygpLmNvbXB1dGVOb3JtYWxzKCk7XG4gICAgaWYgKGRldGFpbFggPD0gMSAmJiBkZXRhaWxZIDw9IDEpIHtcbiAgICAgIHBsYW5lR2VvbS5fbWFrZVRyaWFuZ2xlRWRnZXMoKS5fZWRnZXNUb1ZlcnRpY2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnQ2Fubm90IGRyYXcgc3Ryb2tlIG9uIHBsYW5lIG9iamVjdHMgd2l0aCBtb3JlJyArXG4gICAgICAgICAgJyB0aGFuIDEgZGV0YWlsWCBvciAxIGRldGFpbFknXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJlci5jcmVhdGVCdWZmZXJzKGdJZCwgcGxhbmVHZW9tKTtcbiAgfVxuXG4gIHRoaXMuX3JlbmRlcmVyLmRyYXdCdWZmZXJzU2NhbGVkKGdJZCwgd2lkdGgsIGhlaWdodCwgMCk7XG59O1xuXG4vKipcbiAqIERyYXcgYSBib3ggd2l0aCBnaXZlbiB3aWR0aCwgaGVpZ2h0IGFuZCBkZXB0aFxuICogQG1ldGhvZCAgYm94XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt3aWR0aF0gICAgIHdpZHRoIG9mIHRoZSBib3hcbiAqIEBwYXJhbSAge051bWJlcn0gW0hlaWdodF0gICAgaGVpZ2h0IG9mIHRoZSBib3hcbiAqIEBwYXJhbSAge051bWJlcn0gW2RlcHRoXSAgICAgZGVwdGggb2YgdGhlIGJveFxuICogQHBhcmFtIHtJbnRlZ2VyfSBbZGV0YWlsWF0gIE9wdGlvbmFsIG51bWJlciBvZiB0cmlhbmdsZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZGl2aXNpb25zIGluIHgtZGltZW5zaW9uXG4gKiBAcGFyYW0ge0ludGVnZXJ9IFtkZXRhaWxZXSAgT3B0aW9uYWwgbnVtYmVyIG9mIHRyaWFuZ2xlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJkaXZpc2lvbnMgaW4geS1kaW1lbnNpb25cbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvL2RyYXcgYSBzcGlubmluZyBib3ggd2l0aCB3aWR0aCwgaGVpZ2h0IGFuZCBkZXB0aCAyMDBcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgYm94KDUwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUuYm94ID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCwgZGVwdGgsIGRldGFpbFgsIGRldGFpbFkpIHtcbiAgdGhpcy5fYXNzZXJ0M2QoJ2JveCcpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdib3gnLCBhcmd1bWVudHMpO1xuICBpZiAodHlwZW9mIHdpZHRoID09PSAndW5kZWZpbmVkJykge1xuICAgIHdpZHRoID0gNTA7XG4gIH1cbiAgaWYgKHR5cGVvZiBoZWlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaGVpZ2h0ID0gd2lkdGg7XG4gIH1cbiAgaWYgKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZXB0aCA9IGhlaWdodDtcbiAgfVxuXG4gIHZhciBwZXJQaXhlbExpZ2h0aW5nID1cbiAgICB0aGlzLl9yZW5kZXJlci5hdHRyaWJ1dGVzICYmIHRoaXMuX3JlbmRlcmVyLmF0dHJpYnV0ZXMucGVyUGl4ZWxMaWdodGluZztcbiAgaWYgKHR5cGVvZiBkZXRhaWxYID09PSAndW5kZWZpbmVkJykge1xuICAgIGRldGFpbFggPSBwZXJQaXhlbExpZ2h0aW5nID8gMSA6IDQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBkZXRhaWxZID09PSAndW5kZWZpbmVkJykge1xuICAgIGRldGFpbFkgPSBwZXJQaXhlbExpZ2h0aW5nID8gMSA6IDQ7XG4gIH1cblxuICB2YXIgZ0lkID0gJ2JveHwnICsgZGV0YWlsWCArICd8JyArIGRldGFpbFk7XG4gIGlmICghdGhpcy5fcmVuZGVyZXIuZ2VvbWV0cnlJbkhhc2goZ0lkKSkge1xuICAgIHZhciBfYm94ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY3ViZUluZGljZXMgPSBbXG4gICAgICAgIFswLCA0LCAyLCA2XSwgLy8gLTEsIDAsIDBdLC8vIC14XG4gICAgICAgIFsxLCAzLCA1LCA3XSwgLy8gKzEsIDAsIDBdLC8vICt4XG4gICAgICAgIFswLCAxLCA0LCA1XSwgLy8gMCwgLTEsIDBdLC8vIC15XG4gICAgICAgIFsyLCA2LCAzLCA3XSwgLy8gMCwgKzEsIDBdLC8vICt5XG4gICAgICAgIFswLCAyLCAxLCAzXSwgLy8gMCwgMCwgLTFdLC8vIC16XG4gICAgICAgIFs0LCA1LCA2LCA3XSAvLyAwLCAwLCArMV0gLy8gK3pcbiAgICAgIF07XG4gICAgICAvL3VzaW5nIHN0cm9rZUluZGljZXMgaW5zdGVhZCBvZiBmYWNlcyBmb3Igc3Ryb2tlc1xuICAgICAgLy90byBhdm9pZCBkaWFnb25hbCBzdHJva2UgbGluZXMgYWNyb3NzIGZhY2Ugb2YgYm94XG4gICAgICB0aGlzLnN0cm9rZUluZGljZXMgPSBbXG4gICAgICAgIFswLCAxXSxcbiAgICAgICAgWzEsIDNdLFxuICAgICAgICBbMywgMl0sXG4gICAgICAgIFs2LCA3XSxcbiAgICAgICAgWzgsIDldLFxuICAgICAgICBbOSwgMTFdLFxuICAgICAgICBbMTQsIDE1XSxcbiAgICAgICAgWzE2LCAxN10sXG4gICAgICAgIFsxNywgMTldLFxuICAgICAgICBbMTgsIDE5XSxcbiAgICAgICAgWzIwLCAyMV0sXG4gICAgICAgIFsyMiwgMjNdXG4gICAgICBdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdWJlSW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3ViZUluZGV4ID0gY3ViZUluZGljZXNbaV07XG4gICAgICAgIHZhciB2ID0gaSAqIDQ7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgdmFyIGQgPSBjdWJlSW5kZXhbal07XG4gICAgICAgICAgLy9pbnNwaXJlZCBieSBsaWdodGdsOlxuICAgICAgICAgIC8vaHR0cHM6Ly9naXRodWIuY29tL2V2YW53L2xpZ2h0Z2wuanNcbiAgICAgICAgICAvL29jdGFudHM6aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT2N0YW50Xyhzb2xpZF9nZW9tZXRyeSlcbiAgICAgICAgICB2YXIgb2N0YW50ID0gbmV3IHA1LlZlY3RvcihcbiAgICAgICAgICAgICgoZCAmIDEpICogMiAtIDEpIC8gMixcbiAgICAgICAgICAgICgoZCAmIDIpIC0gMSkgLyAyLFxuICAgICAgICAgICAgKChkICYgNCkgLyAyIC0gMSkgLyAyXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2gob2N0YW50KTtcbiAgICAgICAgICB0aGlzLnV2cy5wdXNoKGogJiAxLCAoaiAmIDIpIC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mYWNlcy5wdXNoKFt2LCB2ICsgMSwgdiArIDJdKTtcbiAgICAgICAgdGhpcy5mYWNlcy5wdXNoKFt2ICsgMiwgdiArIDEsIHYgKyAzXSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgYm94R2VvbSA9IG5ldyBwNS5HZW9tZXRyeShkZXRhaWxYLCBkZXRhaWxZLCBfYm94KTtcbiAgICBib3hHZW9tLmNvbXB1dGVOb3JtYWxzKCk7XG4gICAgaWYgKGRldGFpbFggPD0gNCAmJiBkZXRhaWxZIDw9IDQpIHtcbiAgICAgIGJveEdlb20uX21ha2VUcmlhbmdsZUVkZ2VzKCkuX2VkZ2VzVG9WZXJ0aWNlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0Nhbm5vdCBkcmF3IHN0cm9rZSBvbiBib3ggb2JqZWN0cyB3aXRoIG1vcmUnICtcbiAgICAgICAgICAnIHRoYW4gNCBkZXRhaWxYIG9yIDQgZGV0YWlsWSdcbiAgICAgICk7XG4gICAgfVxuICAgIC8vaW5pdGlhbGl6ZSBvdXIgZ2VvbWV0cnkgYnVmZmVyIHdpdGhcbiAgICAvL3RoZSBrZXkgdmFsIHBhaXI6XG4gICAgLy9nZW9tZXRyeSBJZCwgR2VvbSBvYmplY3RcbiAgICB0aGlzLl9yZW5kZXJlci5jcmVhdGVCdWZmZXJzKGdJZCwgYm94R2VvbSk7XG4gIH1cbiAgdGhpcy5fcmVuZGVyZXIuZHJhd0J1ZmZlcnNTY2FsZWQoZ0lkLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERyYXcgYSBzcGhlcmUgd2l0aCBnaXZlbiByYWRpdXNcbiAqIEBtZXRob2Qgc3BoZXJlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFtyYWRpdXNdICAgICAgICAgIHJhZGl1cyBvZiBjaXJjbGVcbiAqIEBwYXJhbSAge0ludGVnZXJ9IFtkZXRhaWxYXSAgICAgICAgbnVtYmVyIG9mIHNlZ21lbnRzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbW9yZSBzZWdtZW50cyB0aGUgc21vb3RoZXIgZ2VvbWV0cnlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyAyNFxuICogQHBhcmFtICB7SW50ZWdlcn0gW2RldGFpbFldICAgICAgICBudW1iZXIgb2Ygc2VnbWVudHMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtb3JlIHNlZ21lbnRzIHRoZSBzbW9vdGhlciBnZW9tZXRyeVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIDE2XG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy8gZHJhdyBhIHNwaGVyZSB3aXRoIHJhZGl1cyAyMDBcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHNwaGVyZSg0MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xucDUucHJvdG90eXBlLnNwaGVyZSA9IGZ1bmN0aW9uKHJhZGl1cywgZGV0YWlsWCwgZGV0YWlsWSkge1xuICB0aGlzLl9hc3NlcnQzZCgnc3BoZXJlJyk7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3NwaGVyZScsIGFyZ3VtZW50cyk7XG4gIGlmICh0eXBlb2YgcmFkaXVzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJhZGl1cyA9IDUwO1xuICB9XG4gIGlmICh0eXBlb2YgZGV0YWlsWCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZXRhaWxYID0gMjQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBkZXRhaWxZID09PSAndW5kZWZpbmVkJykge1xuICAgIGRldGFpbFkgPSAxNjtcbiAgfVxuXG4gIHRoaXMuZWxsaXBzb2lkKHJhZGl1cywgcmFkaXVzLCByYWRpdXMsIGRldGFpbFgsIGRldGFpbFkpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogSGVscGVyIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBib3RoIGNvbmVzIGFuZCBjeWxsaW5kZXJzXG4gKiBXaWxsIG9ubHkgZ2VuZXJhdGUgd2VsbC1kZWZpbmVkIGdlb21ldHJ5IHdoZW4gYm90dG9tUmFkaXVzLCBoZWlnaHQgPiAwXG4gKiBhbmQgdG9wUmFkaXVzID49IDBcbiAqIElmIHRvcFJhZGl1cyA9PSAwLCB0b3BDYXAgc2hvdWxkIGJlIGZhbHNlXG4gKi9cbnZhciBfdHJ1bmNhdGVkQ29uZSA9IGZ1bmN0aW9uKFxuICBib3R0b21SYWRpdXMsXG4gIHRvcFJhZGl1cyxcbiAgaGVpZ2h0LFxuICBkZXRhaWxYLFxuICBkZXRhaWxZLFxuICBib3R0b21DYXAsXG4gIHRvcENhcFxuKSB7XG4gIGJvdHRvbVJhZGl1cyA9IGJvdHRvbVJhZGl1cyA8PSAwID8gMSA6IGJvdHRvbVJhZGl1cztcbiAgdG9wUmFkaXVzID0gdG9wUmFkaXVzIDwgMCA/IDAgOiB0b3BSYWRpdXM7XG4gIGhlaWdodCA9IGhlaWdodCA8PSAwID8gYm90dG9tUmFkaXVzIDogaGVpZ2h0O1xuICBkZXRhaWxYID0gZGV0YWlsWCA8IDMgPyAzIDogZGV0YWlsWDtcbiAgZGV0YWlsWSA9IGRldGFpbFkgPCAxID8gMSA6IGRldGFpbFk7XG4gIGJvdHRvbUNhcCA9IGJvdHRvbUNhcCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGJvdHRvbUNhcDtcbiAgdG9wQ2FwID0gdG9wQ2FwID09PSB1bmRlZmluZWQgPyB0b3BSYWRpdXMgIT09IDAgOiB0b3BDYXA7XG4gIHZhciBzdGFydCA9IGJvdHRvbUNhcCA/IC0yIDogMDtcbiAgdmFyIGVuZCA9IGRldGFpbFkgKyAodG9wQ2FwID8gMiA6IDApO1xuICB2YXIgdmVydHNPbkxheWVyID0ge307XG4gIC8vZW5zdXJlIGNvbnN0YW50IHNsYW50IGZvciBpbnRlcmlvciB2ZXJ0ZXggbm9ybWFsc1xuICB2YXIgc2xhbnQgPSBNYXRoLmF0YW4yKGJvdHRvbVJhZGl1cyAtIHRvcFJhZGl1cywgaGVpZ2h0KTtcbiAgdmFyIHl5LCBpaSwgamosIG5leHRpaSwgbmV4dGpqO1xuICBmb3IgKHl5ID0gc3RhcnQ7IHl5IDw9IGVuZDsgKyt5eSkge1xuICAgIHZhciB2ID0geXkgLyBkZXRhaWxZO1xuICAgIHZhciB5ID0gaGVpZ2h0ICogdjtcbiAgICB2YXIgcmluZ1JhZGl1cztcbiAgICBpZiAoeXkgPCAwKSB7XG4gICAgICAvL2ZvciB0aGUgYm90dG9tQ2FwIGVkZ2VcbiAgICAgIHkgPSAwO1xuICAgICAgdiA9IDA7XG4gICAgICByaW5nUmFkaXVzID0gYm90dG9tUmFkaXVzO1xuICAgIH0gZWxzZSBpZiAoeXkgPiBkZXRhaWxZKSB7XG4gICAgICAvL2ZvciB0aGUgdG9wQ2FwIGVkZ2VcbiAgICAgIHkgPSBoZWlnaHQ7XG4gICAgICB2ID0gMTtcbiAgICAgIHJpbmdSYWRpdXMgPSB0b3BSYWRpdXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vZm9yIHRoZSBtaWRkbGVcbiAgICAgIHJpbmdSYWRpdXMgPSBib3R0b21SYWRpdXMgKyAodG9wUmFkaXVzIC0gYm90dG9tUmFkaXVzKSAqIHY7XG4gICAgfVxuICAgIGlmICh5eSA9PT0gLTIgfHwgeXkgPT09IGRldGFpbFkgKyAyKSB7XG4gICAgICAvL2NlbnRlciBvZiBib3R0b20gb3IgdG9wIGNhcHNcbiAgICAgIHJpbmdSYWRpdXMgPSAwO1xuICAgIH1cblxuICAgIHkgLT0gaGVpZ2h0IC8gMjsgLy9zaGlmdCBjb29yZGlhdGUgb3JpZ2luIHRvIHRoZSBjZW50ZXIgb2Ygb2JqZWN0XG4gICAgdmVydHNPbkxheWVyW3l5XSA9IHJpbmdSYWRpdXMgPT09IDAgPyAxIDogZGV0YWlsWDtcbiAgICBmb3IgKGlpID0gMDsgaWkgPCB2ZXJ0c09uTGF5ZXJbeXldOyArK2lpKSB7XG4gICAgICB2YXIgdSA9IGlpIC8gZGV0YWlsWDtcbiAgICAgIC8vVkVSVElDRVNcbiAgICAgIHRoaXMudmVydGljZXMucHVzaChcbiAgICAgICAgbmV3IHA1LlZlY3RvcihcbiAgICAgICAgICBNYXRoLnNpbih1ICogMiAqIE1hdGguUEkpICogcmluZ1JhZGl1cyxcbiAgICAgICAgICB5LFxuICAgICAgICAgIE1hdGguY29zKHUgKiAyICogTWF0aC5QSSkgKiByaW5nUmFkaXVzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICAvL1ZFUlRFWCBOT1JNQUxTXG4gICAgICB0aGlzLnZlcnRleE5vcm1hbHMucHVzaChcbiAgICAgICAgbmV3IHA1LlZlY3RvcihcbiAgICAgICAgICB5eSA8IDAgfHwgeXkgPiBkZXRhaWxZXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogTWF0aC5zaW4odSAqIDIgKiBNYXRoLlBJKSAqIE1hdGguY29zKHNsYW50KSxcbiAgICAgICAgICB5eSA8IDAgPyAtMSA6IHl5ID4gZGV0YWlsWSA/IDEgOiBNYXRoLnNpbihzbGFudCksXG4gICAgICAgICAgeXkgPCAwIHx8IHl5ID4gZGV0YWlsWVxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IE1hdGguY29zKHUgKiAyICogTWF0aC5QSSkgKiBNYXRoLmNvcyhzbGFudClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIC8vVVZzXG4gICAgICB0aGlzLnV2cy5wdXNoKHUsIHYpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdGFydEluZGV4ID0gMDtcbiAgaWYgKGJvdHRvbUNhcCkge1xuICAgIGZvciAoamogPSAwOyBqaiA8IHZlcnRzT25MYXllclstMV07ICsramopIHtcbiAgICAgIG5leHRqaiA9IChqaiArIDEpICUgdmVydHNPbkxheWVyWy0xXTtcbiAgICAgIHRoaXMuZmFjZXMucHVzaChbXG4gICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgIHN0YXJ0SW5kZXggKyAxICsgbmV4dGpqLFxuICAgICAgICBzdGFydEluZGV4ICsgMSArIGpqXG4gICAgICBdKTtcbiAgICB9XG4gICAgc3RhcnRJbmRleCArPSB2ZXJ0c09uTGF5ZXJbLTJdICsgdmVydHNPbkxheWVyWy0xXTtcbiAgfVxuICBmb3IgKHl5ID0gMDsgeXkgPCBkZXRhaWxZOyArK3l5KSB7XG4gICAgZm9yIChpaSA9IDA7IGlpIDwgdmVydHNPbkxheWVyW3l5XTsgKytpaSkge1xuICAgICAgaWYgKHZlcnRzT25MYXllclt5eSArIDFdID09PSAxKSB7XG4gICAgICAgIC8vdG9wIGxheWVyXG4gICAgICAgIG5leHRpaSA9IChpaSArIDEpICUgdmVydHNPbkxheWVyW3l5XTtcbiAgICAgICAgdGhpcy5mYWNlcy5wdXNoKFtcbiAgICAgICAgICBzdGFydEluZGV4ICsgaWksXG4gICAgICAgICAgc3RhcnRJbmRleCArIG5leHRpaSxcbiAgICAgICAgICBzdGFydEluZGV4ICsgdmVydHNPbkxheWVyW3l5XVxuICAgICAgICBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vb3RoZXIgc2lkZSBmYWNlc1xuICAgICAgICAvL3Nob3VsZCBoYXZlIHZlcnRzT25MYXllclt5eV0gPT09IHZlcnRzT25MYXllclt5eSArIDFdXG4gICAgICAgIG5leHRpaSA9IChpaSArIDEpICUgdmVydHNPbkxheWVyW3l5XTtcbiAgICAgICAgdGhpcy5mYWNlcy5wdXNoKFtcbiAgICAgICAgICBzdGFydEluZGV4ICsgaWksXG4gICAgICAgICAgc3RhcnRJbmRleCArIG5leHRpaSxcbiAgICAgICAgICBzdGFydEluZGV4ICsgdmVydHNPbkxheWVyW3l5XSArIG5leHRpaVxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5mYWNlcy5wdXNoKFtcbiAgICAgICAgICBzdGFydEluZGV4ICsgaWksXG4gICAgICAgICAgc3RhcnRJbmRleCArIHZlcnRzT25MYXllclt5eV0gKyBuZXh0aWksXG4gICAgICAgICAgc3RhcnRJbmRleCArIHZlcnRzT25MYXllclt5eV0gKyBpaVxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhcnRJbmRleCArPSB2ZXJ0c09uTGF5ZXJbeXldO1xuICB9XG4gIGlmICh0b3BDYXApIHtcbiAgICBzdGFydEluZGV4ICs9IHZlcnRzT25MYXllcltkZXRhaWxZXTtcbiAgICBmb3IgKGlpID0gMDsgaWkgPCB2ZXJ0c09uTGF5ZXJbZGV0YWlsWSArIDFdOyArK2lpKSB7XG4gICAgICBuZXh0aWkgPSAoaWkgKyAxKSAlIHZlcnRzT25MYXllcltkZXRhaWxZICsgMV07XG4gICAgICB0aGlzLmZhY2VzLnB1c2goW1xuICAgICAgICBzdGFydEluZGV4ICsgaWksXG4gICAgICAgIHN0YXJ0SW5kZXggKyBuZXh0aWksXG4gICAgICAgIHN0YXJ0SW5kZXggKyB2ZXJ0c09uTGF5ZXJbZGV0YWlsWSArIDFdXG4gICAgICBdKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogRHJhdyBhIGN5bGluZGVyIHdpdGggZ2l2ZW4gcmFkaXVzIGFuZCBoZWlnaHRcbiAqIEBtZXRob2QgY3lsaW5kZXJcbiAqIEBwYXJhbSAge051bWJlcn0gIFtyYWRpdXNdICAgIHJhZGl1cyBvZiB0aGUgc3VyZmFjZVxuICogQHBhcmFtICB7TnVtYmVyfSAgW2hlaWdodF0gICAgaGVpZ2h0IG9mIHRoZSBjeWxpbmRlclxuICogQHBhcmFtICB7SW50ZWdlcn0gW2RldGFpbFhdICAgbnVtYmVyIG9mIHNlZ21lbnRzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHNtb290aGVyIGdlb21ldHJ5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIDI0XG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBbZGV0YWlsWV0gICBudW1iZXIgb2Ygc2VnbWVudHMgaW4geS1kaW1lbnNpb24sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbW9yZSBzZWdtZW50cyB0aGUgc21vb3RoZXIgZ2VvbWV0cnlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMVxuICogQHBhcmFtICB7Qm9vbGVhbn0gW2JvdHRvbUNhcF0gd2hldGhlciB0byBkcmF3IHRoZSBib3R0b20gb2YgdGhlIGN5bGluZGVyXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbdG9wQ2FwXSAgICB3aGV0aGVyIHRvIGRyYXcgdGhlIHRvcCBvZiB0aGUgY3lsaW5kZXJcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKiA8ZGl2PlxuICogPGNvZGU+XG4gKiAvL2RyYXcgYSBzcGlubmluZyBjeWxpbmRlciB3aXRoIHJhZGl1cyAyMCBhbmQgaGVpZ2h0IDUwXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICByb3RhdGVYKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgcm90YXRlWihmcmFtZUNvdW50ICogMC4wMSk7XG4gKiAgIGN5bGluZGVyKDIwLCA1MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xucDUucHJvdG90eXBlLmN5bGluZGVyID0gZnVuY3Rpb24oXG4gIHJhZGl1cyxcbiAgaGVpZ2h0LFxuICBkZXRhaWxYLFxuICBkZXRhaWxZLFxuICBib3R0b21DYXAsXG4gIHRvcENhcFxuKSB7XG4gIHRoaXMuX2Fzc2VydDNkKCdjeWxpbmRlcicpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdjeWxpbmRlcicsIGFyZ3VtZW50cyk7XG4gIGlmICh0eXBlb2YgcmFkaXVzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJhZGl1cyA9IDUwO1xuICB9XG4gIGlmICh0eXBlb2YgaGVpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgIGhlaWdodCA9IHJhZGl1cztcbiAgfVxuICBpZiAodHlwZW9mIGRldGFpbFggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGV0YWlsWCA9IDI0O1xuICB9XG4gIGlmICh0eXBlb2YgZGV0YWlsWSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZXRhaWxZID0gMTtcbiAgfVxuICBpZiAodHlwZW9mIHRvcENhcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0b3BDYXAgPSB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgYm90dG9tQ2FwID09PSAndW5kZWZpbmVkJykge1xuICAgIGJvdHRvbUNhcCA9IHRydWU7XG4gIH1cblxuICB2YXIgZ0lkID1cbiAgICAnY3lsaW5kZXJ8JyArIGRldGFpbFggKyAnfCcgKyBkZXRhaWxZICsgJ3wnICsgYm90dG9tQ2FwICsgJ3wnICsgdG9wQ2FwO1xuICBpZiAoIXRoaXMuX3JlbmRlcmVyLmdlb21ldHJ5SW5IYXNoKGdJZCkpIHtcbiAgICB2YXIgY3lsaW5kZXJHZW9tID0gbmV3IHA1Lkdlb21ldHJ5KGRldGFpbFgsIGRldGFpbFkpO1xuICAgIF90cnVuY2F0ZWRDb25lLmNhbGwoXG4gICAgICBjeWxpbmRlckdlb20sXG4gICAgICAxLFxuICAgICAgMSxcbiAgICAgIDEsXG4gICAgICBkZXRhaWxYLFxuICAgICAgZGV0YWlsWSxcbiAgICAgIGJvdHRvbUNhcCxcbiAgICAgIHRvcENhcFxuICAgICk7XG4gICAgY3lsaW5kZXJHZW9tLmNvbXB1dGVOb3JtYWxzKCk7XG4gICAgaWYgKGRldGFpbFggPD0gMjQgJiYgZGV0YWlsWSA8PSAxNikge1xuICAgICAgY3lsaW5kZXJHZW9tLl9tYWtlVHJpYW5nbGVFZGdlcygpLl9lZGdlc1RvVmVydGljZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdDYW5ub3QgZHJhdyBzdHJva2Ugb24gY3lsaW5kZXIgb2JqZWN0cyB3aXRoIG1vcmUnICtcbiAgICAgICAgICAnIHRoYW4gMjQgZGV0YWlsWCBvciAxNiBkZXRhaWxZJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyZXIuY3JlYXRlQnVmZmVycyhnSWQsIGN5bGluZGVyR2VvbSk7XG4gIH1cblxuICB0aGlzLl9yZW5kZXJlci5kcmF3QnVmZmVyc1NjYWxlZChnSWQsIHJhZGl1cywgaGVpZ2h0LCByYWRpdXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBEcmF3IGEgY29uZSB3aXRoIGdpdmVuIHJhZGl1cyBhbmQgaGVpZ2h0XG4gKiBAbWV0aG9kIGNvbmVcbiAqIEBwYXJhbSAge051bWJlcn0gIFtyYWRpdXNdICByYWRpdXMgb2YgdGhlIGJvdHRvbSBzdXJmYWNlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICBbaGVpZ2h0XSAgaGVpZ2h0IG9mIHRoZSBjb25lXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBbZGV0YWlsWF0gbnVtYmVyIG9mIHNlZ21lbnRzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtb3JlIHNlZ21lbnRzIHRoZSBzbW9vdGhlciBnZW9tZXRyeVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMjRcbiAqIEBwYXJhbSAge0ludGVnZXJ9IFtkZXRhaWxZXSBudW1iZXIgb2Ygc2VnbWVudHMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHNtb290aGVyIGdlb21ldHJ5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyAxXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbY2FwXSAgICAgd2hldGhlciB0byBkcmF3IHRoZSBiYXNlIG9mIHRoZSBjb25lXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICogPGRpdj5cbiAqIDxjb2RlPlxuICogLy9kcmF3IGEgc3Bpbm5pbmcgY29uZSB3aXRoIHJhZGl1cyA0MCBhbmQgaGVpZ2h0IDcwXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICByb3RhdGVYKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgcm90YXRlWihmcmFtZUNvdW50ICogMC4wMSk7XG4gKiAgIGNvbmUoNDAsIDcwKTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUuY29uZSA9IGZ1bmN0aW9uKHJhZGl1cywgaGVpZ2h0LCBkZXRhaWxYLCBkZXRhaWxZLCBjYXApIHtcbiAgdGhpcy5fYXNzZXJ0M2QoJ2NvbmUnKTtcbiAgcDUuX3ZhbGlkYXRlUGFyYW1ldGVycygnY29uZScsIGFyZ3VtZW50cyk7XG4gIGlmICh0eXBlb2YgcmFkaXVzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJhZGl1cyA9IDUwO1xuICB9XG4gIGlmICh0eXBlb2YgaGVpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgIGhlaWdodCA9IHJhZGl1cztcbiAgfVxuICBpZiAodHlwZW9mIGRldGFpbFggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGV0YWlsWCA9IDI0O1xuICB9XG4gIGlmICh0eXBlb2YgZGV0YWlsWSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZXRhaWxZID0gMTtcbiAgfVxuICBpZiAodHlwZW9mIGNhcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjYXAgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGdJZCA9ICdjb25lfCcgKyBkZXRhaWxYICsgJ3wnICsgZGV0YWlsWSArICd8JyArIGNhcDtcbiAgaWYgKCF0aGlzLl9yZW5kZXJlci5nZW9tZXRyeUluSGFzaChnSWQpKSB7XG4gICAgdmFyIGNvbmVHZW9tID0gbmV3IHA1Lkdlb21ldHJ5KGRldGFpbFgsIGRldGFpbFkpO1xuICAgIF90cnVuY2F0ZWRDb25lLmNhbGwoY29uZUdlb20sIDEsIDAsIDEsIGRldGFpbFgsIGRldGFpbFksIGNhcCwgZmFsc2UpO1xuICAgIC8vZm9yIGNvbmVzIHdlIG5lZWQgdG8gYXZlcmFnZSBOb3JtYWxzXG4gICAgY29uZUdlb20uY29tcHV0ZU5vcm1hbHMoKTtcbiAgICBpZiAoZGV0YWlsWCA8PSAyNCAmJiBkZXRhaWxZIDw9IDE2KSB7XG4gICAgICBjb25lR2VvbS5fbWFrZVRyaWFuZ2xlRWRnZXMoKS5fZWRnZXNUb1ZlcnRpY2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnQ2Fubm90IGRyYXcgc3Ryb2tlIG9uIGNvbmUgb2JqZWN0cyB3aXRoIG1vcmUnICtcbiAgICAgICAgICAnIHRoYW4gMjQgZGV0YWlsWCBvciAxNiBkZXRhaWxZJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyZXIuY3JlYXRlQnVmZmVycyhnSWQsIGNvbmVHZW9tKTtcbiAgfVxuXG4gIHRoaXMuX3JlbmRlcmVyLmRyYXdCdWZmZXJzU2NhbGVkKGdJZCwgcmFkaXVzLCBoZWlnaHQsIHJhZGl1cyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERyYXcgYW4gZWxsaXBzb2lkIHdpdGggZ2l2ZW4gcmFkaXVzXG4gKiBAbWV0aG9kIGVsbGlwc29pZFxuICogQHBhcmFtICB7TnVtYmVyfSBbcmFkaXVzeF0gICAgICAgICB4cmFkaXVzIG9mIGNpcmNsZVxuICogQHBhcmFtICB7TnVtYmVyfSBbcmFkaXVzeV0gICAgICAgICB5cmFkaXVzIG9mIGNpcmNsZVxuICogQHBhcmFtICB7TnVtYmVyfSBbcmFkaXVzel0gICAgICAgICB6cmFkaXVzIG9mIGNpcmNsZVxuICogQHBhcmFtICB7SW50ZWdlcn0gW2RldGFpbFhdICAgICAgICBudW1iZXIgb2Ygc2VnbWVudHMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtb3JlIHNlZ21lbnRzIHRoZSBzbW9vdGhlciBnZW9tZXRyeVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIDI0LiBBdm9pZCBkZXRhaWwgbnVtYmVyIGFib3ZlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MCwgaXQgbWF5IGNyYXNoIHRoZSBicm93c2VyLlxuICogQHBhcmFtICB7SW50ZWdlcn0gW2RldGFpbFldICAgICAgICBudW1iZXIgb2Ygc2VnbWVudHMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtb3JlIHNlZ21lbnRzIHRoZSBzbW9vdGhlciBnZW9tZXRyeVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIDE2LiBBdm9pZCBkZXRhaWwgbnVtYmVyIGFib3ZlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MCwgaXQgbWF5IGNyYXNoIHRoZSBicm93c2VyLlxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vIGRyYXcgYW4gZWxsaXBzb2lkIHdpdGggcmFkaXVzIDIwLCAzMCBhbmQgNDAuXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgY3JlYXRlQ2FudmFzKDEwMCwgMTAwLCBXRUJHTCk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gZHJhdygpIHtcbiAqICAgYmFja2dyb3VuZCgyMDApO1xuICogICBlbGxpcHNvaWQoMjAsIDMwLCA0MCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xucDUucHJvdG90eXBlLmVsbGlwc29pZCA9IGZ1bmN0aW9uKHJhZGl1c1gsIHJhZGl1c1ksIHJhZGl1c1osIGRldGFpbFgsIGRldGFpbFkpIHtcbiAgdGhpcy5fYXNzZXJ0M2QoJ2VsbGlwc29pZCcpO1xuICBwNS5fdmFsaWRhdGVQYXJhbWV0ZXJzKCdlbGxpcHNvaWQnLCBhcmd1bWVudHMpO1xuICBpZiAodHlwZW9mIHJhZGl1c1ggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmFkaXVzWCA9IDUwO1xuICB9XG4gIGlmICh0eXBlb2YgcmFkaXVzWSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByYWRpdXNZID0gcmFkaXVzWDtcbiAgfVxuICBpZiAodHlwZW9mIHJhZGl1c1ogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmFkaXVzWiA9IHJhZGl1c1g7XG4gIH1cblxuICBpZiAodHlwZW9mIGRldGFpbFggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGV0YWlsWCA9IDI0O1xuICB9XG4gIGlmICh0eXBlb2YgZGV0YWlsWSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZXRhaWxZID0gMTY7XG4gIH1cblxuICB2YXIgZ0lkID0gJ2VsbGlwc29pZHwnICsgZGV0YWlsWCArICd8JyArIGRldGFpbFk7XG5cbiAgaWYgKCF0aGlzLl9yZW5kZXJlci5nZW9tZXRyeUluSGFzaChnSWQpKSB7XG4gICAgdmFyIF9lbGxpcHNvaWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHRoaXMuZGV0YWlsWTsgaSsrKSB7XG4gICAgICAgIHZhciB2ID0gaSAvIHRoaXMuZGV0YWlsWTtcbiAgICAgICAgdmFyIHBoaSA9IE1hdGguUEkgKiB2IC0gTWF0aC5QSSAvIDI7XG4gICAgICAgIHZhciBjb3NQaGkgPSBNYXRoLmNvcyhwaGkpO1xuICAgICAgICB2YXIgc2luUGhpID0gTWF0aC5zaW4ocGhpKTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8PSB0aGlzLmRldGFpbFg7IGorKykge1xuICAgICAgICAgIHZhciB1ID0gaiAvIHRoaXMuZGV0YWlsWDtcbiAgICAgICAgICB2YXIgdGhldGEgPSAyICogTWF0aC5QSSAqIHU7XG4gICAgICAgICAgdmFyIGNvc1RoZXRhID0gTWF0aC5jb3ModGhldGEpO1xuICAgICAgICAgIHZhciBzaW5UaGV0YSA9IE1hdGguc2luKHRoZXRhKTtcbiAgICAgICAgICB2YXIgcCA9IG5ldyBwNS5WZWN0b3IoY29zUGhpICogc2luVGhldGEsIHNpblBoaSwgY29zUGhpICogY29zVGhldGEpO1xuICAgICAgICAgIHRoaXMudmVydGljZXMucHVzaChwKTtcbiAgICAgICAgICB0aGlzLnZlcnRleE5vcm1hbHMucHVzaChwKTtcbiAgICAgICAgICB0aGlzLnV2cy5wdXNoKHUsIHYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgZWxsaXBzb2lkR2VvbSA9IG5ldyBwNS5HZW9tZXRyeShkZXRhaWxYLCBkZXRhaWxZLCBfZWxsaXBzb2lkKTtcbiAgICBlbGxpcHNvaWRHZW9tLmNvbXB1dGVGYWNlcygpO1xuICAgIGlmIChkZXRhaWxYIDw9IDI0ICYmIGRldGFpbFkgPD0gMjQpIHtcbiAgICAgIGVsbGlwc29pZEdlb20uX21ha2VUcmlhbmdsZUVkZ2VzKCkuX2VkZ2VzVG9WZXJ0aWNlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0Nhbm5vdCBkcmF3IHN0cm9rZSBvbiBlbGxpcHNvaWRzIHdpdGggbW9yZScgK1xuICAgICAgICAgICcgdGhhbiAyNCBkZXRhaWxYIG9yIDI0IGRldGFpbFknXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJlci5jcmVhdGVCdWZmZXJzKGdJZCwgZWxsaXBzb2lkR2VvbSk7XG4gIH1cblxuICB0aGlzLl9yZW5kZXJlci5kcmF3QnVmZmVyc1NjYWxlZChnSWQsIHJhZGl1c1gsIHJhZGl1c1ksIHJhZGl1c1opO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBEcmF3IGEgdG9ydXMgd2l0aCBnaXZlbiByYWRpdXMgYW5kIHR1YmUgcmFkaXVzXG4gKiBAbWV0aG9kIHRvcnVzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFtyYWRpdXNdICAgICAgcmFkaXVzIG9mIHRoZSB3aG9sZSByaW5nXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt0dWJlUmFkaXVzXSAgcmFkaXVzIG9mIHRoZSB0dWJlXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSBbZGV0YWlsWF0gICAgbnVtYmVyIG9mIHNlZ21lbnRzIGluIHgtZGltZW5zaW9uLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtb3JlIHNlZ21lbnRzIHRoZSBzbW9vdGhlciBnZW9tZXRyeVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMjRcbiAqIEBwYXJhbSAge0ludGVnZXJ9IFtkZXRhaWxZXSAgICBudW1iZXIgb2Ygc2VnbWVudHMgaW4geS1kaW1lbnNpb24sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHNtb290aGVyIGdlb21ldHJ5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyAxNlxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vZHJhdyBhIHNwaW5uaW5nIHRvcnVzIHdpdGggcmFkaXVzIDIwMCBhbmQgdHViZSByYWRpdXMgNjBcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgdG9ydXMoNTAsIDE1KTtcbiAqIH1cbiAqIDwvY29kZT5cbiAqIDwvZGl2PlxuICovXG5wNS5wcm90b3R5cGUudG9ydXMgPSBmdW5jdGlvbihyYWRpdXMsIHR1YmVSYWRpdXMsIGRldGFpbFgsIGRldGFpbFkpIHtcbiAgdGhpcy5fYXNzZXJ0M2QoJ3RvcnVzJyk7XG4gIHA1Ll92YWxpZGF0ZVBhcmFtZXRlcnMoJ3RvcnVzJywgYXJndW1lbnRzKTtcbiAgaWYgKHR5cGVvZiByYWRpdXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmFkaXVzID0gNTA7XG4gIH0gZWxzZSBpZiAoIXJhZGl1cykge1xuICAgIHJldHVybjsgLy8gbm90aGluZyB0byBkcmF3XG4gIH1cblxuICBpZiAodHlwZW9mIHR1YmVSYWRpdXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHViZVJhZGl1cyA9IDEwO1xuICB9IGVsc2UgaWYgKCF0dWJlUmFkaXVzKSB7XG4gICAgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRyYXdcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGV0YWlsWCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZXRhaWxYID0gMjQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBkZXRhaWxZID09PSAndW5kZWZpbmVkJykge1xuICAgIGRldGFpbFkgPSAxNjtcbiAgfVxuXG4gIHZhciB0dWJlUmF0aW8gPSAodHViZVJhZGl1cyAvIHJhZGl1cykudG9QcmVjaXNpb24oNCk7XG4gIHZhciBnSWQgPSAndG9ydXN8JyArIHR1YmVSYXRpbyArICd8JyArIGRldGFpbFggKyAnfCcgKyBkZXRhaWxZO1xuXG4gIGlmICghdGhpcy5fcmVuZGVyZXIuZ2VvbWV0cnlJbkhhc2goZ0lkKSkge1xuICAgIHZhciBfdG9ydXMgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHRoaXMuZGV0YWlsWTsgaSsrKSB7XG4gICAgICAgIHZhciB2ID0gaSAvIHRoaXMuZGV0YWlsWTtcbiAgICAgICAgdmFyIHBoaSA9IDIgKiBNYXRoLlBJICogdjtcbiAgICAgICAgdmFyIGNvc1BoaSA9IE1hdGguY29zKHBoaSk7XG4gICAgICAgIHZhciBzaW5QaGkgPSBNYXRoLnNpbihwaGkpO1xuICAgICAgICB2YXIgciA9IDEgKyB0dWJlUmF0aW8gKiBjb3NQaGk7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPD0gdGhpcy5kZXRhaWxYOyBqKyspIHtcbiAgICAgICAgICB2YXIgdSA9IGogLyB0aGlzLmRldGFpbFg7XG4gICAgICAgICAgdmFyIHRoZXRhID0gMiAqIE1hdGguUEkgKiB1O1xuICAgICAgICAgIHZhciBjb3NUaGV0YSA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgICAgICB2YXIgc2luVGhldGEgPSBNYXRoLnNpbih0aGV0YSk7XG5cbiAgICAgICAgICB2YXIgcCA9IG5ldyBwNS5WZWN0b3IociAqIGNvc1RoZXRhLCByICogc2luVGhldGEsIHR1YmVSYXRpbyAqIHNpblBoaSk7XG5cbiAgICAgICAgICB2YXIgbiA9IG5ldyBwNS5WZWN0b3IoY29zUGhpICogY29zVGhldGEsIGNvc1BoaSAqIHNpblRoZXRhLCBzaW5QaGkpO1xuXG4gICAgICAgICAgdGhpcy52ZXJ0aWNlcy5wdXNoKHApO1xuICAgICAgICAgIHRoaXMudmVydGV4Tm9ybWFscy5wdXNoKG4pO1xuICAgICAgICAgIHRoaXMudXZzLnB1c2godSwgdik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciB0b3J1c0dlb20gPSBuZXcgcDUuR2VvbWV0cnkoZGV0YWlsWCwgZGV0YWlsWSwgX3RvcnVzKTtcbiAgICB0b3J1c0dlb20uY29tcHV0ZUZhY2VzKCk7XG4gICAgaWYgKGRldGFpbFggPD0gMjQgJiYgZGV0YWlsWSA8PSAxNikge1xuICAgICAgdG9ydXNHZW9tLl9tYWtlVHJpYW5nbGVFZGdlcygpLl9lZGdlc1RvVmVydGljZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdDYW5ub3QgZHJhdyBzdHJva2VzIG9uIHRvcnVzIG9iamVjdCB3aXRoIG1vcmUnICtcbiAgICAgICAgICAnIHRoYW4gMjQgZGV0YWlsWCBvciAxNiBkZXRhaWxZJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyZXIuY3JlYXRlQnVmZmVycyhnSWQsIHRvcnVzR2VvbSk7XG4gIH1cbiAgdGhpcy5fcmVuZGVyZXIuZHJhd0J1ZmZlcnNTY2FsZWQoZ0lkLCByYWRpdXMsIHJhZGl1cywgcmFkaXVzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8gMkQgcHJpbWl0aXZlc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vL0BUT0RPXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uKHgsIHksIHopIHtcbiAgY29uc29sZS5sb2coJ3BvaW50IG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gd2ViZ2wnKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS50cmlhbmdsZSA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgdmFyIHgxID0gYXJnc1swXSxcbiAgICB5MSA9IGFyZ3NbMV07XG4gIHZhciB4MiA9IGFyZ3NbMl0sXG4gICAgeTIgPSBhcmdzWzNdO1xuICB2YXIgeDMgPSBhcmdzWzRdLFxuICAgIHkzID0gYXJnc1s1XTtcblxuICB2YXIgZ0lkID0gJ3RyaSc7XG4gIGlmICghdGhpcy5nZW9tZXRyeUluSGFzaChnSWQpKSB7XG4gICAgdmFyIF90cmlhbmdsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZlcnRpY2VzID0gW107XG4gICAgICB2ZXJ0aWNlcy5wdXNoKG5ldyBwNS5WZWN0b3IoMCwgMCwgMCkpO1xuICAgICAgdmVydGljZXMucHVzaChuZXcgcDUuVmVjdG9yKDAsIDEsIDApKTtcbiAgICAgIHZlcnRpY2VzLnB1c2gobmV3IHA1LlZlY3RvcigxLCAwLCAwKSk7XG4gICAgICB0aGlzLnN0cm9rZUluZGljZXMgPSBbWzAsIDFdLCBbMSwgMl0sIFsyLCAwXV07XG4gICAgICB0aGlzLnZlcnRpY2VzID0gdmVydGljZXM7XG4gICAgICB0aGlzLmZhY2VzID0gW1swLCAxLCAyXV07XG4gICAgICB0aGlzLnV2cyA9IFswLCAwLCAwLCAxLCAxLCAxXTtcbiAgICB9O1xuICAgIHZhciB0cmlHZW9tID0gbmV3IHA1Lkdlb21ldHJ5KDEsIDEsIF90cmlhbmdsZSk7XG4gICAgdHJpR2VvbS5fbWFrZVRyaWFuZ2xlRWRnZXMoKS5fZWRnZXNUb1ZlcnRpY2VzKCk7XG4gICAgdHJpR2VvbS5jb21wdXRlTm9ybWFscygpO1xuICAgIHRoaXMuY3JlYXRlQnVmZmVycyhnSWQsIHRyaUdlb20pO1xuICB9XG5cbiAgLy8gb25seSBvbmUgdHJpYW5nbGUgaXMgY2FjaGVkLCBvbmUgcG9pbnQgaXMgYXQgdGhlIG9yaWdpbiwgYW5kIHRoZVxuICAvLyB0d28gYWRqYWNlbnQgc2lkZXMgYXJlIHRuZSB1bml0IHZlY3RvcnMgYWxvbmcgdGhlIFggJiBZIGF4ZXMuXG4gIC8vXG4gIC8vIHRoaXMgbWF0cml4IG11bHRpcGxpY2F0aW9uIHRyYW5zZm9ybXMgdGhvc2UgdHdvIHVuaXQgdmVjdG9yc1xuICAvLyBvbnRvIHRoZSByZXF1aXJlZCB2ZWN0b3IgcHJpb3IgdG8gcmVuZGVyaW5nLCBhbmQgbW92ZXMgdGhlXG4gIC8vIG9yaWdpbiBhcHByb3ByaWF0ZWx5LlxuICB2YXIgdU1WTWF0cml4ID0gdGhpcy51TVZNYXRyaXguY29weSgpO1xuICB0cnkge1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHZhciBtdWx0ID0gbmV3IHA1Lk1hdHJpeChbXG4gICAgICB4MiAtIHgxLCB5MiAtIHkxLCAwLCAwLCAvLyB0aGUgcmVzdWx0aW5nIHVuaXQgWC1heGlzXG4gICAgICB4MyAtIHgxLCB5MyAtIHkxLCAwLCAwLCAvLyB0aGUgcmVzdWx0aW5nIHVuaXQgWS1heGlzXG4gICAgICAwLCAwLCAxLCAwLCAgICAgICAgICAgICAvLyB0aGUgcmVzdWx0aW5nIHVuaXQgWi1heGlzICh1bmNoYW5nZWQpXG4gICAgICB4MSwgeTEsIDAsIDEgICAgICAgICAgICAvLyB0aGUgcmVzdWx0aW5nIG9yaWdpblxuICAgIF0pLm11bHQodGhpcy51TVZNYXRyaXgpO1xuXG4gICAgdGhpcy51TVZNYXRyaXggPSBtdWx0O1xuXG4gICAgdGhpcy5kcmF3QnVmZmVycyhnSWQpO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMudU1WTWF0cml4ID0gdU1WTWF0cml4O1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wNS5SZW5kZXJlckdMLnByb3RvdHlwZS5lbGxpcHNlID0gZnVuY3Rpb24oYXJncykge1xuICB2YXIgeCA9IGFyZ3NbMF07XG4gIHZhciB5ID0gYXJnc1sxXTtcbiAgdmFyIHdpZHRoID0gYXJnc1syXTtcbiAgdmFyIGhlaWdodCA9IGFyZ3NbM107XG4gIC8vZGV0YWlsWCBhbmQgWSBhcmUgb3B0aW9uYWwgNnRoICYgN3RoXG4gIC8vYXJndW1lbnRzXG4gIHZhciBkZXRhaWxYID0gYXJnc1s0XSB8fCAyNDtcbiAgdmFyIGdJZCA9ICdlbGxpcHNlfCcgKyBkZXRhaWxYO1xuICBpZiAoIXRoaXMuZ2VvbWV0cnlJbkhhc2goZ0lkKSkge1xuICAgIHZhciBfZWxsaXBzZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy52ZXJ0aWNlcy5wdXNoKG5ldyBwNS5WZWN0b3IoMC41LCAwLjUsIDApKTtcbiAgICAgIHRoaXMudXZzLnB1c2goWzAuNSwgMC41XSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kZXRhaWxYOyBpKyspIHtcbiAgICAgICAgdmFyIHUgPSBpIC8gdGhpcy5kZXRhaWxYO1xuICAgICAgICB2YXIgdGhldGEgPSAyICogTWF0aC5QSSAqIHU7XG5cbiAgICAgICAgdmFyIF94ID0gMC41ICsgTWF0aC5jb3ModGhldGEpIC8gMjtcbiAgICAgICAgdmFyIF95ID0gMC41ICsgTWF0aC5zaW4odGhldGEpIC8gMjtcblxuICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2gobmV3IHA1LlZlY3RvcihfeCwgX3ksIDApKTtcbiAgICAgICAgdGhpcy51dnMucHVzaChfeCwgX3kpO1xuXG4gICAgICAgIHRoaXMuZmFjZXMucHVzaChbMCwgKGkgKyAxKSAlIHRoaXMuZGV0YWlsWCArIDEsIGkgKyAxXSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgZWxsaXBzZUdlb20gPSBuZXcgcDUuR2VvbWV0cnkoZGV0YWlsWCwgMSwgX2VsbGlwc2UpO1xuICAgIGVsbGlwc2VHZW9tLmNvbXB1dGVOb3JtYWxzKCk7XG4gICAgaWYgKGRldGFpbFggPD0gNTApIHtcbiAgICAgIGVsbGlwc2VHZW9tLl9tYWtlVHJpYW5nbGVFZGdlcygpLl9lZGdlc1RvVmVydGljZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ0Nhbm5vdCBzdHJva2UgZWxsaXBzZSB3aXRoIG1vcmUgdGhhbiA1MCBkZXRhaWxYJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVCdWZmZXJzKGdJZCwgZWxsaXBzZUdlb20pO1xuICB9XG5cbiAgLy8gb25seSBhIHNpbmdsZSBlbGxpcHNlIChvZiBhIGdpdmVuIGRldGFpbCkgaXMgY2FjaGVkOiBhIGNpcmNsZSBvZlxuICAvLyBfZGlhbWV0ZXJfIDEgKHJhZGl1cyAwLjUpLlxuICAvL1xuICAvLyBiZWZvcmUgcmVuZGVyaW5nLCB0aGlzIGNpcmNsZSBpcyBzcXVpc2hlZCAodGVjaG5pY2FsIHRlcm0gOylcbiAgLy8gYXBwcm9wcmlhdGVseSBhbmQgbW92ZWQgdG8gdGhlIHJlcXVpcmVkIGxvY2F0aW9uLlxuICB2YXIgdU1WTWF0cml4ID0gdGhpcy51TVZNYXRyaXguY29weSgpO1xuICB0cnkge1xuICAgIHRoaXMudU1WTWF0cml4LnRyYW5zbGF0ZShbeCwgeSwgMF0pO1xuICAgIHRoaXMudU1WTWF0cml4LnNjYWxlKHdpZHRoLCBoZWlnaHQsIDEpO1xuXG4gICAgdGhpcy5kcmF3QnVmZmVycyhnSWQpO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMudU1WTWF0cml4ID0gdU1WTWF0cml4O1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUucmVjdCA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgdmFyIHBlclBpeGVsTGlnaHRpbmcgPSB0aGlzLmF0dHJpYnV0ZXMucGVyUGl4ZWxMaWdodGluZztcbiAgdmFyIHggPSBhcmdzWzBdO1xuICB2YXIgeSA9IGFyZ3NbMV07XG4gIHZhciB3aWR0aCA9IGFyZ3NbMl07XG4gIHZhciBoZWlnaHQgPSBhcmdzWzNdO1xuICB2YXIgZGV0YWlsWCA9IGFyZ3NbNF0gfHwgKHBlclBpeGVsTGlnaHRpbmcgPyAxIDogMjQpO1xuICB2YXIgZGV0YWlsWSA9IGFyZ3NbNV0gfHwgKHBlclBpeGVsTGlnaHRpbmcgPyAxIDogMTYpO1xuICB2YXIgZ0lkID0gJ3JlY3R8JyArIGRldGFpbFggKyAnfCcgKyBkZXRhaWxZO1xuICBpZiAoIXRoaXMuZ2VvbWV0cnlJbkhhc2goZ0lkKSkge1xuICAgIHZhciBfcmVjdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gdGhpcy5kZXRhaWxZOyBpKyspIHtcbiAgICAgICAgdmFyIHYgPSBpIC8gdGhpcy5kZXRhaWxZO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8PSB0aGlzLmRldGFpbFg7IGorKykge1xuICAgICAgICAgIHZhciB1ID0gaiAvIHRoaXMuZGV0YWlsWDtcbiAgICAgICAgICB2YXIgcCA9IG5ldyBwNS5WZWN0b3IodSwgdiwgMCk7XG4gICAgICAgICAgdGhpcy52ZXJ0aWNlcy5wdXNoKHApO1xuICAgICAgICAgIHRoaXMudXZzLnB1c2godSwgdik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciByZWN0R2VvbSA9IG5ldyBwNS5HZW9tZXRyeShkZXRhaWxYLCBkZXRhaWxZLCBfcmVjdCk7XG4gICAgcmVjdEdlb21cbiAgICAgIC5jb21wdXRlRmFjZXMoKVxuICAgICAgLmNvbXB1dGVOb3JtYWxzKClcbiAgICAgIC5fbWFrZVRyaWFuZ2xlRWRnZXMoKVxuICAgICAgLl9lZGdlc1RvVmVydGljZXMoKTtcbiAgICB0aGlzLmNyZWF0ZUJ1ZmZlcnMoZ0lkLCByZWN0R2VvbSk7XG4gIH1cblxuICAvLyBvbmx5IGEgc2luZ2xlIHJlY3RhbmdsZSAob2YgYSBnaXZlbiBkZXRhaWwpIGlzIGNhY2hlZDogYSBzcXVhcmUgd2l0aFxuICAvLyBvcHBvc2l0ZSBjb3JuZXJzIGF0ICgwLDApICYgKDEsMSkuXG4gIC8vXG4gIC8vIGJlZm9yZSByZW5kZXJpbmcsIHRoaXMgc3F1YXJlIGlzIHNjYWxlZCAmIG1vdmVkIHRvIHRoZSByZXF1aXJlZCBsb2NhdGlvbi5cbiAgdmFyIHVNVk1hdHJpeCA9IHRoaXMudU1WTWF0cml4LmNvcHkoKTtcbiAgdHJ5IHtcbiAgICB0aGlzLnVNVk1hdHJpeC50cmFuc2xhdGUoW3gsIHksIDBdKTtcbiAgICB0aGlzLnVNVk1hdHJpeC5zY2FsZSh3aWR0aCwgaGVpZ2h0LCAxKTtcblxuICAgIHRoaXMuZHJhd0J1ZmZlcnMoZ0lkKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLnVNVk1hdHJpeCA9IHVNVk1hdHJpeDtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLnF1YWQgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgdmFyIGdJZCA9XG4gICAgJ3F1YWR8JyArXG4gICAgeDEgK1xuICAgICd8JyArXG4gICAgeTEgK1xuICAgICd8JyArXG4gICAgeDIgK1xuICAgICd8JyArXG4gICAgeTIgK1xuICAgICd8JyArXG4gICAgeDMgK1xuICAgICd8JyArXG4gICAgeTMgK1xuICAgICd8JyArXG4gICAgeDQgK1xuICAgICd8JyArXG4gICAgeTQ7XG4gIGlmICghdGhpcy5nZW9tZXRyeUluSGFzaChnSWQpKSB7XG4gICAgdmFyIF9xdWFkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnZlcnRpY2VzLnB1c2gobmV3IHA1LlZlY3Rvcih4MSwgeTEsIDApKTtcbiAgICAgIHRoaXMudmVydGljZXMucHVzaChuZXcgcDUuVmVjdG9yKHgyLCB5MiwgMCkpO1xuICAgICAgdGhpcy52ZXJ0aWNlcy5wdXNoKG5ldyBwNS5WZWN0b3IoeDMsIHkzLCAwKSk7XG4gICAgICB0aGlzLnZlcnRpY2VzLnB1c2gobmV3IHA1LlZlY3Rvcih4NCwgeTQsIDApKTtcbiAgICAgIHRoaXMudXZzLnB1c2goMCwgMCwgMSwgMCwgMSwgMSwgMCwgMSk7XG4gICAgICB0aGlzLnN0cm9rZUluZGljZXMgPSBbWzAsIDFdLCBbMSwgMl0sIFsyLCAzXSwgWzMsIDBdXTtcbiAgICB9O1xuICAgIHZhciBxdWFkR2VvbSA9IG5ldyBwNS5HZW9tZXRyeSgyLCAyLCBfcXVhZCk7XG4gICAgcXVhZEdlb21cbiAgICAgIC5jb21wdXRlTm9ybWFscygpXG4gICAgICAuX21ha2VUcmlhbmdsZUVkZ2VzKClcbiAgICAgIC5fZWRnZXNUb1ZlcnRpY2VzKCk7XG4gICAgcXVhZEdlb20uZmFjZXMgPSBbWzAsIDEsIDJdLCBbMiwgMywgMF1dO1xuICAgIHRoaXMuY3JlYXRlQnVmZmVycyhnSWQsIHF1YWRHZW9tKTtcbiAgfVxuICB0aGlzLmRyYXdCdWZmZXJzKGdJZCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy90aGlzIGltcGxlbWVudGF0aW9uIG9mIGJlemllciBjdXJ2ZVxuLy9pcyBiYXNlZCBvbiBCZXJuc3RlaW4gcG9seW5vbWlhbFxuLy8gcHJldGllci1pZ25vcmVcbnA1LlJlbmRlcmVyR0wucHJvdG90eXBlLmJlemllciA9IGZ1bmN0aW9uKFxuICB4MSxcbiAgeTEsXG4gIHoxLCAvLyB4MlxuICB4MiwgLy8geTJcbiAgeTIsIC8vIHgzXG4gIHoyLCAvLyB5M1xuICB4MywgLy8geDRcbiAgeTMsIC8vIHk0XG4gIHozLFxuICB4NCxcbiAgeTQsXG4gIHo0XG4pIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDgpIHtcbiAgICB4NCA9IHgzO1xuICAgIHk0ID0geTM7XG4gICAgeDMgPSB5MjtcbiAgICB5MyA9IHgyO1xuICAgIHgyID0gejE7XG4gICAgeTIgPSB4MjtcbiAgICB6MSA9IHoyID0gejMgPSB6NCA9IDA7XG4gIH1cblxuICB2YXIgYmV6aWVyRGV0YWlsID0gdGhpcy5fcEluc3QuX2JlemllckRldGFpbCB8fCAyMDsgLy92YWx1ZSBvZiBCZXppZXIgZGV0YWlsXG4gIHRoaXMuYmVnaW5TaGFwZSgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8PSBiZXppZXJEZXRhaWw7IGkrKykge1xuICAgIHZhciBjMSA9IE1hdGgucG93KDEgLSBpIC8gYmV6aWVyRGV0YWlsLCAzKTtcbiAgICB2YXIgYzIgPSAzICogKGkgLyBiZXppZXJEZXRhaWwpICogTWF0aC5wb3coMSAtIGkgLyBiZXppZXJEZXRhaWwsIDIpO1xuICAgIHZhciBjMyA9IDMgKiBNYXRoLnBvdyhpIC8gYmV6aWVyRGV0YWlsLCAyKSAqICgxIC0gaSAvIGJlemllckRldGFpbCk7XG4gICAgdmFyIGM0ID0gTWF0aC5wb3coaSAvIGJlemllckRldGFpbCwgMyk7XG4gICAgdGhpcy52ZXJ0ZXgoXG4gICAgICB4MSAqIGMxICsgeDIgKiBjMiArIHgzICogYzMgKyB4NCAqIGM0LFxuICAgICAgeTEgKiBjMSArIHkyICogYzIgKyB5MyAqIGMzICsgeTQgKiBjNCxcbiAgICAgIHoxICogYzEgKyB6MiAqIGMyICsgejMgKiBjMyArIHo0ICogYzRcbiAgICApO1xuICB9XG4gIHRoaXMuZW5kU2hhcGUoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBwcmV0aWVyLWlnbm9yZVxucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUuY3VydmUgPSBmdW5jdGlvbihcbiAgeDEsXG4gIHkxLFxuICB6MSwgLy8geDJcbiAgeDIsIC8vIHkyXG4gIHkyLCAvLyB4M1xuICB6MiwgLy8geTNcbiAgeDMsIC8vIHg0XG4gIHkzLCAvLyB5NFxuICB6MyxcbiAgeDQsXG4gIHk0LFxuICB6NFxuKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA4KSB7XG4gICAgeDQgPSB4MztcbiAgICB5NCA9IHkzO1xuICAgIHgzID0geTI7XG4gICAgeTMgPSB4MjtcbiAgICB4MiA9IHoxO1xuICAgIHkyID0geDI7XG4gICAgejEgPSB6MiA9IHozID0gejQgPSAwO1xuICB9XG4gIHZhciBjdXJ2ZURldGFpbCA9IHRoaXMuX3BJbnN0Ll9jdXJ2ZURldGFpbDtcbiAgdGhpcy5iZWdpblNoYXBlKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDw9IGN1cnZlRGV0YWlsOyBpKyspIHtcbiAgICB2YXIgYzEgPSBNYXRoLnBvdyhpIC8gY3VydmVEZXRhaWwsIDMpICogMC41O1xuICAgIHZhciBjMiA9IE1hdGgucG93KGkgLyBjdXJ2ZURldGFpbCwgMikgKiAwLjU7XG4gICAgdmFyIGMzID0gaSAvIGN1cnZlRGV0YWlsICogMC41O1xuICAgIHZhciBjNCA9IDAuNTtcbiAgICB2YXIgdnggPVxuICAgICAgYzEgKiAoLXgxICsgMyAqIHgyIC0gMyAqIHgzICsgeDQpICtcbiAgICAgIGMyICogKDIgKiB4MSAtIDUgKiB4MiArIDQgKiB4MyAtIHg0KSArXG4gICAgICBjMyAqICgteDEgKyB4MykgK1xuICAgICAgYzQgKiAoMiAqIHgyKTtcbiAgICB2YXIgdnkgPVxuICAgICAgYzEgKiAoLXkxICsgMyAqIHkyIC0gMyAqIHkzICsgeTQpICtcbiAgICAgIGMyICogKDIgKiB5MSAtIDUgKiB5MiArIDQgKiB5MyAtIHk0KSArXG4gICAgICBjMyAqICgteTEgKyB5MykgK1xuICAgICAgYzQgKiAoMiAqIHkyKTtcbiAgICB2YXIgdnogPVxuICAgICAgYzEgKiAoLXoxICsgMyAqIHoyIC0gMyAqIHozICsgejQpICtcbiAgICAgIGMyICogKDIgKiB6MSAtIDUgKiB6MiArIDQgKiB6MyAtIHo0KSArXG4gICAgICBjMyAqICgtejEgKyB6MykgK1xuICAgICAgYzQgKiAoMiAqIHoyKTtcbiAgICB0aGlzLnZlcnRleCh2eCwgdnksIHZ6KTtcbiAgfVxuICB0aGlzLmVuZFNoYXBlKCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBEcmF3IGEgbGluZSBnaXZlbiB0d28gcG9pbnRzXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHgwIHgtY29vcmRpbmF0ZSBvZiBmaXJzdCB2ZXJ0ZXhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MCB5LWNvb3JkaW5hdGUgb2YgZmlyc3QgdmVydGV4XG4gKiBAcGFyYW0ge051bWJlcn0gejAgei1jb29yZGluYXRlIG9mIGZpcnN0IHZlcnRleFxuICogQHBhcmFtIHtOdW1iZXJ9IHgxIHgtY29vcmRpbmF0ZSBvZiBzZWNvbmQgdmVydGV4XG4gKiBAcGFyYW0ge051bWJlcn0geTEgeS1jb29yZGluYXRlIG9mIHNlY29uZCB2ZXJ0ZXhcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MSB6LWNvb3JkaW5hdGUgb2Ygc2Vjb25kIHZlcnRleFxuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqIDxkaXY+XG4gKiA8Y29kZT5cbiAqIC8vZHJhdyBhIGxpbmVcbiAqIGZ1bmN0aW9uIHNldHVwKCkge1xuICogICBjcmVhdGVDYW52YXMoMTAwLCAxMDAsIFdFQkdMKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBkcmF3KCkge1xuICogICBiYWNrZ3JvdW5kKDIwMCk7XG4gKiAgIHJvdGF0ZVgoZnJhbWVDb3VudCAqIDAuMDEpO1xuICogICByb3RhdGVZKGZyYW1lQ291bnQgKiAwLjAxKTtcbiAqICAgLy8gVXNlIGZpbGwgaW5zdGVhZCBvZiBzdHJva2UgdG8gY2hhbmdlIHRoZSBjb2xvciBvZiBzaGFwZS5cbiAqICAgZmlsbCgyNTUsIDAsIDApO1xuICogICBsaW5lKDEwLCAxMCwgMCwgNjAsIDYwLCAyMCk7XG4gKiB9XG4gKiA8L2NvZGU+XG4gKiA8L2Rpdj5cbiAqL1xucDUuUmVuZGVyZXJHTC5wcm90b3R5cGUubGluZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNikge1xuICAgIHRoaXMuYmVnaW5TaGFwZSgpO1xuICAgIHRoaXMudmVydGV4KGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgIHRoaXMudmVydGV4KGFyZ3VtZW50c1szXSwgYXJndW1lbnRzWzRdLCBhcmd1bWVudHNbNV0pO1xuICAgIHRoaXMuZW5kU2hhcGUoKTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0KSB7XG4gICAgdGhpcy5iZWdpblNoYXBlKCk7XG4gICAgdGhpcy52ZXJ0ZXgoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0sIDApO1xuICAgIHRoaXMudmVydGV4KGFyZ3VtZW50c1syXSwgYXJndW1lbnRzWzNdLCAwKTtcbiAgICB0aGlzLmVuZFNoYXBlKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHA1O1xuXG59LHtcIi4uL2NvcmUvY29yZVwiOjIyLFwiLi9wNS5HZW9tZXRyeVwiOjY4fV19LHt9LFsxM10pKDEzKVxufSk7IiwiLyoqXHJcbiAqIENvbXBpbGVzIGEgcXVlcnlzdHJpbmdcclxuICogUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdFxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH1cclxuICogQGFwaSBwcml2YXRlXHJcbiAqL1xyXG5cclxuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiAob2JqKSB7XHJcbiAgdmFyIHN0ciA9ICcnO1xyXG5cclxuICBmb3IgKHZhciBpIGluIG9iaikge1xyXG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICBpZiAoc3RyLmxlbmd0aCkgc3RyICs9ICcmJztcclxuICAgICAgc3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChpKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmpbaV0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHN0cjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBQYXJzZXMgYSBzaW1wbGUgcXVlcnlzdHJpbmcgaW50byBhbiBvYmplY3RcclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IHFzXHJcbiAqIEBhcGkgcHJpdmF0ZVxyXG4gKi9cclxuXHJcbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24ocXMpe1xyXG4gIHZhciBxcnkgPSB7fTtcclxuICB2YXIgcGFpcnMgPSBxcy5zcGxpdCgnJicpO1xyXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcGFpcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICB2YXIgcGFpciA9IHBhaXJzW2ldLnNwbGl0KCc9Jyk7XHJcbiAgICBxcnlbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChwYWlyWzFdKTtcclxuICB9XHJcbiAgcmV0dXJuIHFyeTtcclxufTtcclxuIiwiLyoqXHJcbiAqIFBhcnNlcyBhbiBVUklcclxuICpcclxuICogQGF1dGhvciBTdGV2ZW4gTGV2aXRoYW4gPHN0ZXZlbmxldml0aGFuLmNvbT4gKE1JVCBsaWNlbnNlKVxyXG4gKiBAYXBpIHByaXZhdGVcclxuICovXHJcblxyXG52YXIgcmUgPSAvXig/Oig/IVteOkBdKzpbXjpAXFwvXSpAKShodHRwfGh0dHBzfHdzfHdzcyk6XFwvXFwvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPygoPzpbYS1mMC05XXswLDR9Oil7Miw3fVthLWYwLTldezAsNH18W146XFwvPyNdKikoPzo6KFxcZCopKT8pKCgoXFwvKD86W14/I10oPyFbXj8jXFwvXSpcXC5bXj8jXFwvLl0rKD86Wz8jXXwkKSkpKlxcLz8pPyhbXj8jXFwvXSopKSg/OlxcPyhbXiNdKikpPyg/OiMoLiopKT8pLztcclxuXHJcbnZhciBwYXJ0cyA9IFtcclxuICAgICdzb3VyY2UnLCAncHJvdG9jb2wnLCAnYXV0aG9yaXR5JywgJ3VzZXJJbmZvJywgJ3VzZXInLCAncGFzc3dvcmQnLCAnaG9zdCcsICdwb3J0JywgJ3JlbGF0aXZlJywgJ3BhdGgnLCAnZGlyZWN0b3J5JywgJ2ZpbGUnLCAncXVlcnknLCAnYW5jaG9yJ1xyXG5dO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZXVyaShzdHIpIHtcclxuICAgIHZhciBzcmMgPSBzdHIsXHJcbiAgICAgICAgYiA9IHN0ci5pbmRleE9mKCdbJyksXHJcbiAgICAgICAgZSA9IHN0ci5pbmRleE9mKCddJyk7XHJcblxyXG4gICAgaWYgKGIgIT0gLTEgJiYgZSAhPSAtMSkge1xyXG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgYikgKyBzdHIuc3Vic3RyaW5nKGIsIGUpLnJlcGxhY2UoLzovZywgJzsnKSArIHN0ci5zdWJzdHJpbmcoZSwgc3RyLmxlbmd0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIG0gPSByZS5leGVjKHN0ciB8fCAnJyksXHJcbiAgICAgICAgdXJpID0ge30sXHJcbiAgICAgICAgaSA9IDE0O1xyXG5cclxuICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICB1cmlbcGFydHNbaV1dID0gbVtpXSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYiAhPSAtMSAmJiBlICE9IC0xKSB7XHJcbiAgICAgICAgdXJpLnNvdXJjZSA9IHNyYztcclxuICAgICAgICB1cmkuaG9zdCA9IHVyaS5ob3N0LnN1YnN0cmluZygxLCB1cmkuaG9zdC5sZW5ndGggLSAxKS5yZXBsYWNlKC87L2csICc6Jyk7XHJcbiAgICAgICAgdXJpLmF1dGhvcml0eSA9IHVyaS5hdXRob3JpdHkucmVwbGFjZSgnWycsICcnKS5yZXBsYWNlKCddJywgJycpLnJlcGxhY2UoLzsvZywgJzonKTtcclxuICAgICAgICB1cmkuaXB2NnVyaSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVyaTtcclxufTtcclxuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjJcbihmdW5jdGlvbigpIHtcbiAgdmFyIGdldE5hbm9TZWNvbmRzLCBocnRpbWUsIGxvYWRUaW1lLCBtb2R1bGVMb2FkVGltZSwgbm9kZUxvYWRUaW1lLCB1cFRpbWU7XG5cbiAgaWYgKCh0eXBlb2YgcGVyZm9ybWFuY2UgIT09IFwidW5kZWZpbmVkXCIgJiYgcGVyZm9ybWFuY2UgIT09IG51bGwpICYmIHBlcmZvcm1hbmNlLm5vdykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmICgodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2VzcyAhPT0gbnVsbCkgJiYgcHJvY2Vzcy5ocnRpbWUpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIChnZXROYW5vU2Vjb25kcygpIC0gbm9kZUxvYWRUaW1lKSAvIDFlNjtcbiAgICB9O1xuICAgIGhydGltZSA9IHByb2Nlc3MuaHJ0aW1lO1xuICAgIGdldE5hbm9TZWNvbmRzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaHI7XG4gICAgICBociA9IGhydGltZSgpO1xuICAgICAgcmV0dXJuIGhyWzBdICogMWU5ICsgaHJbMV07XG4gICAgfTtcbiAgICBtb2R1bGVMb2FkVGltZSA9IGdldE5hbm9TZWNvbmRzKCk7XG4gICAgdXBUaW1lID0gcHJvY2Vzcy51cHRpbWUoKSAqIDFlOTtcbiAgICBub2RlTG9hZFRpbWUgPSBtb2R1bGVMb2FkVGltZSAtIHVwVGltZTtcbiAgfSBlbHNlIGlmIChEYXRlLm5vdykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIGxvYWRUaW1lO1xuICAgIH07XG4gICAgbG9hZFRpbWUgPSBEYXRlLm5vdygpO1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBsb2FkVGltZTtcbiAgICB9O1xuICAgIGxvYWRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH1cblxufSkuY2FsbCh0aGlzKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGVyZm9ybWFuY2Utbm93LmpzLm1hcFxuIiwiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/ZShleHBvcnRzKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImV4cG9ydHNcIl0sZSk6ZSgoKHQ9dHx8c2VsZikucHJldHRpZXJQbHVnaW5zPXQucHJldHRpZXJQbHVnaW5zfHx7fSx0LnByZXR0aWVyUGx1Z2lucy5iYWJlbD17fSkpfSh0aGlzLChmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgZT1mdW5jdGlvbih0LGUpe2NvbnN0IHM9bmV3IFN5bnRheEVycm9yKHQrXCIgKFwiK2Uuc3RhcnQubGluZStcIjpcIitlLnN0YXJ0LmNvbHVtbitcIilcIik7cmV0dXJuIHMubG9jPWUsc307ZnVuY3Rpb24gcyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxcImRlZmF1bHRcIik/dC5kZWZhdWx0OnR9ZnVuY3Rpb24gaSh0LGUpe3JldHVybiB0KGU9e2V4cG9ydHM6e319LGUuZXhwb3J0cyksZS5leHBvcnRzfXZhciByPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRlZmF1bHQ6e0VPTDpcIlxcblwifX0pO2NvbnN0IGE9dD0+e2lmKFwic3RyaW5nXCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBhIHN0cmluZ1wiKTtjb25zdCBlPXQubWF0Y2goLyg/Olxccj9cXG4pL2cpfHxbXTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuO2NvbnN0IHM9ZS5maWx0ZXIodD0+XCJcXHJcXG5cIj09PXQpLmxlbmd0aDtyZXR1cm4gcz5lLmxlbmd0aC1zP1wiXFxyXFxuXCI6XCJcXG5cIn07dmFyIG49YTtuLmdyYWNlZnVsPXQ9Plwic3RyaW5nXCI9PXR5cGVvZiB0JiZhKHQpfHxcIlxcblwiO3ZhciBvLGg9KG89cikmJm8uZGVmYXVsdHx8byxwPWkoKGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcygpe2NvbnN0IHQ9aDtyZXR1cm4gcz1mdW5jdGlvbigpe3JldHVybiB0fSx0fWZ1bmN0aW9uIGkoKXtjb25zdCB0PShlPW4pJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfTt2YXIgZTtyZXR1cm4gaT1mdW5jdGlvbigpe3JldHVybiB0fSx0fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuZXh0cmFjdD1mdW5jdGlvbih0KXtjb25zdCBlPXQubWF0Y2gobyk7cmV0dXJuIGU/ZVswXS50cmltTGVmdCgpOlwiXCJ9LGUuc3RyaXA9ZnVuY3Rpb24odCl7Y29uc3QgZT10Lm1hdGNoKG8pO3JldHVybiBlJiZlWzBdP3Quc3Vic3RyaW5nKGVbMF0ubGVuZ3RoKTp0fSxlLnBhcnNlPWZ1bmN0aW9uKHQpe3JldHVybiBtKHQpLnByYWdtYXN9LGUucGFyc2VXaXRoQ29tbWVudHM9bSxlLnByaW50PWZ1bmN0aW9uKHtjb21tZW50czp0PVwiXCIscHJhZ21hczplPXt9fSl7Y29uc3Qgcj0oMCxpKCkuZGVmYXVsdCkodCl8fHMoKS5FT0wsYT1PYmplY3Qua2V5cyhlKSxuPWEubWFwKHQ9PmYodCxlW3RdKSkucmVkdWNlKCh0LGUpPT50LmNvbmNhdChlKSxbXSkubWFwKHQ9PlwiICogXCIrdCtyKS5qb2luKFwiXCIpO2lmKCF0KXtpZigwPT09YS5sZW5ndGgpcmV0dXJuXCJcIjtpZigxPT09YS5sZW5ndGgmJiFBcnJheS5pc0FycmF5KGVbYVswXV0pKXtjb25zdCB0PWVbYVswXV07cmV0dXJuXCJcIi5jb25jYXQoXCIvKipcIixcIiBcIikuY29uY2F0KGYoYVswXSx0KVswXSkuY29uY2F0KFwiICovXCIpfX1jb25zdCBvPXQuc3BsaXQocikubWFwKHQ9PlwiXCIuY29uY2F0KFwiICpcIixcIiBcIikuY29uY2F0KHQpKS5qb2luKHIpK3I7cmV0dXJuXCIvKipcIityKyh0P286XCJcIikrKHQmJmEubGVuZ3RoP1wiICpcIityOlwiXCIpK24rXCIgKi9cIn07Y29uc3Qgcj0vXFwqXFwvJC8sYT0vXlxcL1xcKlxcKi8sbz0vXlxccyooXFwvXFwqXFwqPygufFxccj9cXG4pKj9cXCpcXC8pLyxwPS8oXnxcXHMrKVxcL1xcLyhbXlxcclxcbl0qKS9nLGM9L14oXFxyP1xcbikrLyx1PS8oPzpefFxccj9cXG4pICooQFteXFxyXFxuXSo/KSAqXFxyP1xcbiAqKD8hW15AXFxyXFxuXSpcXC9cXC9bXl0qKShbXkBcXHJcXG5cXHNdW15AXFxyXFxuXSs/KSAqXFxyP1xcbi9nLGw9Lyg/Ol58XFxyP1xcbikgKkAoXFxTKykgKihbXlxcclxcbl0qKS9nLGQ9LyhcXHI/XFxufF4pICpcXCogPy9nO2Z1bmN0aW9uIG0odCl7Y29uc3QgZT0oMCxpKCkuZGVmYXVsdCkodCl8fHMoKS5FT0w7dD10LnJlcGxhY2UoYSxcIlwiKS5yZXBsYWNlKHIsXCJcIikucmVwbGFjZShkLFwiJDFcIik7bGV0IG49XCJcIjtmb3IoO24hPT10OyluPXQsdD10LnJlcGxhY2UodSxcIlwiLmNvbmNhdChlLFwiJDEgJDJcIikuY29uY2F0KGUpKTt0PXQucmVwbGFjZShjLFwiXCIpLnRyaW1SaWdodCgpO2NvbnN0IG89T2JqZWN0LmNyZWF0ZShudWxsKSxoPXQucmVwbGFjZShsLFwiXCIpLnJlcGxhY2UoYyxcIlwiKS50cmltUmlnaHQoKTtsZXQgbTtmb3IoO209bC5leGVjKHQpOyl7Y29uc3QgdD1tWzJdLnJlcGxhY2UocCxcIlwiKTtcInN0cmluZ1wiPT10eXBlb2Ygb1ttWzFdXXx8QXJyYXkuaXNBcnJheShvW21bMV1dKT9vW21bMV1dPVtdLmNvbmNhdChvW21bMV1dLHQpOm9bbVsxXV09dH1yZXR1cm57Y29tbWVudHM6aCxwcmFnbWFzOm99fWZ1bmN0aW9uIGYodCxlKXtyZXR1cm5bXS5jb25jYXQoZSkubWFwKGU9PlwiQFwiLmNvbmNhdCh0LFwiIFwiKS5jb25jYXQoZSkudHJpbSgpKX19KSk7cyhwKTtwLmV4dHJhY3QscC5zdHJpcCxwLnBhcnNlLHAucGFyc2VXaXRoQ29tbWVudHMscC5wcmludDt2YXIgYz17aGFzUHJhZ21hOmZ1bmN0aW9uKHQpe2NvbnN0IGU9T2JqZWN0LmtleXMocC5wYXJzZShwLmV4dHJhY3QodCkpKTtyZXR1cm4gZS5pbmNsdWRlcyhcInByZXR0aWVyXCIpfHxlLmluY2x1ZGVzKFwiZm9ybWF0XCIpfSxpbnNlcnRQcmFnbWE6ZnVuY3Rpb24odCl7Y29uc3QgZT1wLnBhcnNlV2l0aENvbW1lbnRzKHAuZXh0cmFjdCh0KSkscz1PYmplY3QuYXNzaWduKHtmb3JtYXQ6XCJcIn0sZS5wcmFnbWFzKSxpPXAucHJpbnQoe3ByYWdtYXM6cyxjb21tZW50czplLmNvbW1lbnRzLnJlcGxhY2UoL14oXFxzKz9cXHI/XFxuKSsvLFwiXCIpfSkucmVwbGFjZSgvKFxcclxcbnxcXHIpL2csXCJcXG5cIikscj1wLnN0cmlwKHQpO3JldHVybiBpKyhyLnN0YXJ0c1dpdGgoXCJcXG5cIik/XCJcXG5cIjpcIlxcblxcblwiKStyfX0sdT10PT50W3QubGVuZ3RoLTFdO2Z1bmN0aW9uIGwodCxlKXtyZXR1cm4hKGU9ZXx8e30pLmlnbm9yZURlY29yYXRvcnMmJnQuZGVjbGFyYXRpb24mJnQuZGVjbGFyYXRpb24uZGVjb3JhdG9ycyYmdC5kZWNsYXJhdGlvbi5kZWNvcmF0b3JzLmxlbmd0aD4wP2wodC5kZWNsYXJhdGlvbi5kZWNvcmF0b3JzWzBdKTohZS5pZ25vcmVEZWNvcmF0b3JzJiZ0LmRlY29yYXRvcnMmJnQuZGVjb3JhdG9ycy5sZW5ndGg+MD9sKHQuZGVjb3JhdG9yc1swXSk6dC5fX2xvY2F0aW9uP3QuX19sb2NhdGlvbi5zdGFydE9mZnNldDp0LnJhbmdlP3QucmFuZ2VbMF06XCJudW1iZXJcIj09dHlwZW9mIHQuc3RhcnQ/dC5zdGFydDp0LmxvYz90LmxvYy5zdGFydDpudWxsfWZ1bmN0aW9uIGQodCl7Y29uc3QgZT10Lm5vZGVzJiZ1KHQubm9kZXMpO2lmKGUmJnQuc291cmNlJiYhdC5zb3VyY2UuZW5kJiYodD1lKSx0Ll9fbG9jYXRpb24pcmV0dXJuIHQuX19sb2NhdGlvbi5lbmRPZmZzZXQ7Y29uc3Qgcz10LnJhbmdlP3QucmFuZ2VbMV06XCJudW1iZXJcIj09dHlwZW9mIHQuZW5kP3QuZW5kOm51bGw7cmV0dXJuIHQudHlwZUFubm90YXRpb24/TWF0aC5tYXgocyxkKHQudHlwZUFubm90YXRpb24pKTp0LmxvYyYmIXM/dC5sb2MuZW5kOnN9dmFyIG09e2xvY1N0YXJ0OmwsbG9jRW5kOmQsY29tcG9zZUxvYzpmdW5jdGlvbih0LGU9dCl7Y29uc3Qgcz1cIm51bWJlclwiPT10eXBlb2YgZT9lOi0xLGk9bCh0KSxyPS0xIT09cz9pK3M6ZChlKSxhPXQubG9jLnN0YXJ0O3JldHVybntzdGFydDppLGVuZDpyLHJhbmdlOltpLHJdLGxvYzp7c3RhcnQ6YSxlbmQ6LTEhPT1zP3tsaW5lOmEubGluZSxjb2x1bW46YS5jb2x1bW4rc306ZS5sb2MuZW5kfX19fSxmPXQ9Plwic3RyaW5nXCI9PXR5cGVvZiB0P3QucmVwbGFjZSgoKHtvbmx5Rmlyc3Q6dD0hMX09e30pPT57Y29uc3QgZT1bXCJbXFxcXHUwMDFCXFxcXHUwMDlCXVtbXFxcXF0oKSM7P10qKD86KD86KD86W2EtekEtWlxcXFxkXSooPzo7Wy1hLXpBLVpcXFxcZFxcXFwvIyYuOj0/JUB+X10qKSopP1xcXFx1MDAwNylcIixcIig/Oig/OlxcXFxkezEsNH0oPzo7XFxcXGR7MCw0fSkqKT9bXFxcXGRBLVBSLVRaY2YtbnRxcnk9Pjx+XSkpXCJdLmpvaW4oXCJ8XCIpO3JldHVybiBuZXcgUmVnRXhwKGUsdD92b2lkIDA6XCJnXCIpfSkoKSxcIlwiKTp0O2NvbnN0IEQ9dD0+IU51bWJlci5pc05hTih0KSYmKHQ+PTQzNTImJih0PD00NDQ3fHw5MDAxPT09dHx8OTAwMj09PXR8fDExOTA0PD10JiZ0PD0xMjg3MSYmMTIzNTEhPT10fHwxMjg4MDw9dCYmdDw9MTk5MDN8fDE5OTY4PD10JiZ0PD00MjE4Mnx8NDMzNjA8PXQmJnQ8PTQzMzg4fHw0NDAzMjw9dCYmdDw9NTUyMDN8fDYzNzQ0PD10JiZ0PD02NDI1NXx8NjUwNDA8PXQmJnQ8PTY1MDQ5fHw2NTA3Mjw9dCYmdDw9NjUxMzF8fDY1MjgxPD10JiZ0PD02NTM3Nnx8NjU1MDQ8PXQmJnQ8PTY1NTEwfHwxMTA1OTI8PXQmJnQ8PTExMDU5M3x8MTI3NDg4PD10JiZ0PD0xMjc1Njl8fDEzMTA3Mjw9dCYmdDw9MjYyMTQxKSk7dmFyIHk9RCx4PUQ7eS5kZWZhdWx0PXg7Y29uc3QgZz10PT57aWYoXCJzdHJpbmdcIiE9dHlwZW9mKHQ9dC5yZXBsYWNlKC9cXHVEODNDXFx1REZGNFxcdURCNDBcXHVEQzY3XFx1REI0MFxcdURDNjIoPzpcXHVEQjQwXFx1REM2NVxcdURCNDBcXHVEQzZFXFx1REI0MFxcdURDNjd8XFx1REI0MFxcdURDNzNcXHVEQjQwXFx1REM2M1xcdURCNDBcXHVEQzc0fFxcdURCNDBcXHVEQzc3XFx1REI0MFxcdURDNkNcXHVEQjQwXFx1REM3MylcXHVEQjQwXFx1REM3RnxcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4XFx1RDgzQ1xcdURGRkJ8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZGXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkVdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkVcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRF0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRFxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1MjAwRCg/OlxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCk/XFx1RDgzRFxcdURDNjh8KD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY3XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKSl8XFx1RDgzRFxcdURDNjZcXHUyMDBEXFx1RDgzRFxcdURDNjZ8XFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKVxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8W1xcdTI2OTVcXHUyNjk2XFx1MjcwOF1cXHVGRTBGfFxcdUQ4M0RbXFx1REM2NlxcdURDNjddfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXwoPzpcXHVEODNDXFx1REZGQlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XSlcXHVGRTBGfFxcdUQ4M0NcXHVERkZCXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkJcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGQ1xcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OSlcXHVEODNDXFx1REZGQnxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NcXHVERkZGXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDEpfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkVcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGRlxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSkpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkVdKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZDXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkRcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjkpKD86XFx1RDgzQ1tcXHVERkZCXFx1REZGQ10pfFxcdUQ4M0RcXHVEQzY5KD86XFx1RDgzQ1xcdURGRkVcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRFxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkNcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZELVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkJcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkMtXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRFxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNcXHVERkZFXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHUyMDBEKD86XFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pfFxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkZcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2OVxcdTIwMEQoPzpcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSkpfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkRcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGRVxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRF0pfFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY5XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXwoPzpcXHVEODNEXFx1REM0MVxcdUZFMEZcXHUyMDBEXFx1RDgzRFxcdURERTh8XFx1RDgzRFxcdURDNjkoPzpcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF0pfCg/Oig/OlxcdTI2Rjl8XFx1RDgzQ1tcXHVERkNCXFx1REZDQ118XFx1RDgzRFxcdURENzUpXFx1RkUwRnxcXHVEODNEXFx1REM2RnxcXHVEODNFW1xcdUREM0NcXHVERERFXFx1RERERl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18KD86XFx1MjZGOXxcXHVEODNDW1xcdURGQ0JcXHVERkNDXXxcXHVEODNEXFx1REQ3NSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzFcXHVEQzczXFx1REM3N1xcdURDODFcXHVEQzgyXFx1REM4NlxcdURDODdcXHVERTQ1LVxcdURFNDdcXHVERTRCXFx1REU0RFxcdURFNEVcXHVERUEzXFx1REVCNC1cXHVERUI2XXxcXHVEODNFW1xcdUREMjZcXHVERDM3LVxcdUREMzlcXHVERDNEXFx1REQzRVxcdUREQjhcXHVEREI5XFx1RERDRC1cXHVERENGXFx1RERENi1cXHVEREREXSkoPzooPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18XFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml0pfFxcdUQ4M0NcXHVERkY0XFx1MjAwRFxcdTI2MjApXFx1RkUwRnxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8XFx1RDgzQ1xcdURGRjNcXHVGRTBGXFx1MjAwRFxcdUQ4M0NcXHVERjA4fFxcdUQ4M0RcXHVEQzE1XFx1MjAwRFxcdUQ4M0VcXHVEREJBfFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY3fFxcdUQ4M0NcXHVEREZEXFx1RDgzQ1xcdURERjB8XFx1RDgzQ1xcdURERjRcXHVEODNDXFx1RERGMnxcXHVEODNDXFx1RERGNlxcdUQ4M0NcXHVEREU2fFsjXFwqMC05XVxcdUZFMEZcXHUyMEUzfFxcdUQ4M0NcXHVEREU3KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFN1xcdURERTktXFx1RERFRlxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERGOSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREU5XFx1RERFQi1cXHVEREVEXFx1RERFRi1cXHVEREY0XFx1RERGN1xcdURERjlcXHVEREZCXFx1RERGQ1xcdURERkZdKXxcXHVEODNDXFx1RERFQSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBXFx1RERFQ1xcdURERURcXHVEREY3LVxcdURERkFdKXxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8XFx1RDgzQ1xcdURERjcoPzpcXHVEODNDW1xcdURERUFcXHVEREY0XFx1RERGOFxcdURERkFcXHVEREZDXSl8XFx1RDgzRFxcdURDNjkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0NcXHVEREYyKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOC1cXHVEREVEXFx1RERGMC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERTYoPzpcXHVEODNDW1xcdURERTgtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGMlxcdURERjRcXHVEREY2LVxcdURERkFcXHVEREZDXFx1RERGRFxcdURERkZdKXxcXHVEODNDXFx1RERGMCg/OlxcdUQ4M0NbXFx1RERFQVxcdURERUMtXFx1RERFRVxcdURERjJcXHVEREYzXFx1RERGNVxcdURERjdcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFRCg/OlxcdUQ4M0NbXFx1RERGMFxcdURERjJcXHVEREYzXFx1RERGN1xcdURERjlcXHVEREZBXSl8XFx1RDgzQ1xcdURERTkoPzpcXHVEODNDW1xcdURERUFcXHVEREVDXFx1RERFRlxcdURERjBcXHVEREYyXFx1RERGNFxcdURERkZdKXxcXHVEODNDXFx1RERGRSg/OlxcdUQ4M0NbXFx1RERFQVxcdURERjldKXxcXHVEODNDXFx1RERFQyg/OlxcdUQ4M0NbXFx1RERFNlxcdURERTdcXHVEREU5LVxcdURERUVcXHVEREYxLVxcdURERjNcXHVEREY1LVxcdURERkFcXHVEREZDXFx1RERGRV0pfFxcdUQ4M0NcXHVEREY4KD86XFx1RDgzQ1tcXHVEREU2LVxcdURERUFcXHVEREVDLVxcdURERjRcXHVEREY3LVxcdURERjlcXHVEREZCXFx1RERGRC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERUIoPzpcXHVEODNDW1xcdURERUUtXFx1RERGMFxcdURERjJcXHVEREY0XFx1RERGN10pfFxcdUQ4M0NcXHVEREY1KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFQS1cXHVEREVEXFx1RERGMC1cXHVEREYzXFx1RERGNy1cXHVEREY5XFx1RERGQ1xcdURERkVdKXxcXHVEODNDXFx1RERGQig/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBXFx1RERFQ1xcdURERUVcXHVEREYzXFx1RERGQV0pfFxcdUQ4M0NcXHVEREYzKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERUEtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGNFxcdURERjVcXHVEREY3XFx1RERGQVxcdURERkZdKXxcXHVEODNDXFx1RERFOCg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREU5XFx1RERFQi1cXHVEREVFXFx1RERGMC1cXHVEREY1XFx1RERGN1xcdURERkEtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREYxKD86XFx1RDgzQ1tcXHVEREU2LVxcdURERThcXHVEREVFXFx1RERGMFxcdURERjctXFx1RERGQlxcdURERkVdKXxcXHVEODNDXFx1RERGRig/OlxcdUQ4M0NbXFx1RERFNlxcdURERjJcXHVEREZDXSl8XFx1RDgzQ1xcdURERkMoPzpcXHVEODNDW1xcdURERUJcXHVEREY4XSl8XFx1RDgzQ1xcdURERkEoPzpcXHVEODNDW1xcdURERTZcXHVEREVDXFx1RERGMlxcdURERjNcXHVEREY4XFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFRSg/OlxcdUQ4M0NbXFx1RERFOC1cXHVEREVBXFx1RERGMS1cXHVEREY0XFx1RERGNi1cXHVEREY5XSl8XFx1RDgzQ1xcdURERUYoPzpcXHVEODNDW1xcdURERUFcXHVEREYyXFx1RERGNFxcdURERjVdKXwoPzpcXHVEODNDW1xcdURGQzNcXHVERkM0XFx1REZDQV18XFx1RDgzRFtcXHVEQzZFXFx1REM3MVxcdURDNzNcXHVEQzc3XFx1REM4MVxcdURDODJcXHVEQzg2XFx1REM4N1xcdURFNDUtXFx1REU0N1xcdURFNEJcXHVERTREXFx1REU0RVxcdURFQTNcXHVERUI0LVxcdURFQjZdfFxcdUQ4M0VbXFx1REQyNlxcdUREMzctXFx1REQzOVxcdUREM0RcXHVERDNFXFx1RERCOFxcdUREQjlcXHVERENELVxcdUREQ0ZcXHVEREQ2LVxcdURERERdKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8KD86XFx1MjZGOXxcXHVEODNDW1xcdURGQ0JcXHVERkNDXXxcXHVEODNEXFx1REQ3NSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OltcXHUyNjFEXFx1MjcwQS1cXHUyNzBEXXxcXHVEODNDW1xcdURGODVcXHVERkMyXFx1REZDN118XFx1RDgzRFtcXHVEQzQyXFx1REM0M1xcdURDNDYtXFx1REM1MFxcdURDNjZcXHVEQzY3XFx1REM2Qi1cXHVEQzZEXFx1REM3MFxcdURDNzJcXHVEQzc0LVxcdURDNzZcXHVEQzc4XFx1REM3Q1xcdURDODNcXHVEQzg1XFx1RENBQVxcdURENzRcXHVERDdBXFx1REQ5MFxcdUREOTVcXHVERDk2XFx1REU0Q1xcdURFNEZcXHVERUMwXFx1REVDQ118XFx1RDgzRVtcXHVERDBGXFx1REQxOC1cXHVERDFDXFx1REQxRVxcdUREMUZcXHVERDMwLVxcdUREMzZcXHVEREI1XFx1RERCNlxcdUREQkJcXHVEREQyLVxcdURERDVdKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8KD86W1xcdTIzMUFcXHUyMzFCXFx1MjNFOS1cXHUyM0VDXFx1MjNGMFxcdTIzRjNcXHUyNUZEXFx1MjVGRVxcdTI2MTRcXHUyNjE1XFx1MjY0OC1cXHUyNjUzXFx1MjY3RlxcdTI2OTNcXHUyNkExXFx1MjZBQVxcdTI2QUJcXHUyNkJEXFx1MjZCRVxcdTI2QzRcXHUyNkM1XFx1MjZDRVxcdTI2RDRcXHUyNkVBXFx1MjZGMlxcdTI2RjNcXHUyNkY1XFx1MjZGQVxcdTI2RkRcXHUyNzA1XFx1MjcwQVxcdTI3MEJcXHUyNzI4XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc5NS1cXHUyNzk3XFx1MjdCMFxcdTI3QkZcXHUyQjFCXFx1MkIxQ1xcdTJCNTBcXHUyQjU1XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTFBXFx1REUyRlxcdURFMzItXFx1REUzNlxcdURFMzgtXFx1REUzQVxcdURFNTBcXHVERTUxXFx1REYwMC1cXHVERjIwXFx1REYyRC1cXHVERjM1XFx1REYzNy1cXHVERjdDXFx1REY3RS1cXHVERjkzXFx1REZBMC1cXHVERkNBXFx1REZDRi1cXHVERkQzXFx1REZFMC1cXHVERkYwXFx1REZGNFxcdURGRjgtXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDM0VcXHVEQzQwXFx1REM0Mi1cXHVEQ0ZDXFx1RENGRi1cXHVERDNEXFx1REQ0Qi1cXHVERDRFXFx1REQ1MC1cXHVERDY3XFx1REQ3QVxcdUREOTVcXHVERDk2XFx1RERBNFxcdURERkItXFx1REU0RlxcdURFODAtXFx1REVDNVxcdURFQ0NcXHVERUQwLVxcdURFRDJcXHVERUQ1XFx1REVFQlxcdURFRUNcXHVERUY0LVxcdURFRkFcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwRC1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDcxXFx1REQ3My1cXHVERDc2XFx1REQ3QS1cXHVEREEyXFx1RERBNS1cXHVEREFBXFx1RERBRS1cXHVERENBXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTczXFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTgyXFx1REU5MC1cXHVERTk1XSl8KD86WyNcXCowLTlcXHhBOVxceEFFXFx1MjAzQ1xcdTIwNDlcXHUyMTIyXFx1MjEzOVxcdTIxOTQtXFx1MjE5OVxcdTIxQTlcXHUyMUFBXFx1MjMxQVxcdTIzMUJcXHUyMzI4XFx1MjNDRlxcdTIzRTktXFx1MjNGM1xcdTIzRjgtXFx1MjNGQVxcdTI0QzJcXHUyNUFBXFx1MjVBQlxcdTI1QjZcXHUyNUMwXFx1MjVGQi1cXHUyNUZFXFx1MjYwMC1cXHUyNjA0XFx1MjYwRVxcdTI2MTFcXHUyNjE0XFx1MjYxNVxcdTI2MThcXHUyNjFEXFx1MjYyMFxcdTI2MjJcXHUyNjIzXFx1MjYyNlxcdTI2MkFcXHUyNjJFXFx1MjYyRlxcdTI2MzgtXFx1MjYzQVxcdTI2NDBcXHUyNjQyXFx1MjY0OC1cXHUyNjUzXFx1MjY1RlxcdTI2NjBcXHUyNjYzXFx1MjY2NVxcdTI2NjZcXHUyNjY4XFx1MjY3QlxcdTI2N0VcXHUyNjdGXFx1MjY5Mi1cXHUyNjk3XFx1MjY5OVxcdTI2OUJcXHUyNjlDXFx1MjZBMFxcdTI2QTFcXHUyNkFBXFx1MjZBQlxcdTI2QjBcXHUyNkIxXFx1MjZCRFxcdTI2QkVcXHUyNkM0XFx1MjZDNVxcdTI2QzhcXHUyNkNFXFx1MjZDRlxcdTI2RDFcXHUyNkQzXFx1MjZENFxcdTI2RTlcXHUyNkVBXFx1MjZGMC1cXHUyNkY1XFx1MjZGNy1cXHUyNkZBXFx1MjZGRFxcdTI3MDJcXHUyNzA1XFx1MjcwOC1cXHUyNzBEXFx1MjcwRlxcdTI3MTJcXHUyNzE0XFx1MjcxNlxcdTI3MURcXHUyNzIxXFx1MjcyOFxcdTI3MzNcXHUyNzM0XFx1Mjc0NFxcdTI3NDdcXHUyNzRDXFx1Mjc0RVxcdTI3NTMtXFx1Mjc1NVxcdTI3NTdcXHUyNzYzXFx1Mjc2NFxcdTI3OTUtXFx1Mjc5N1xcdTI3QTFcXHUyN0IwXFx1MjdCRlxcdTI5MzRcXHUyOTM1XFx1MkIwNS1cXHUyQjA3XFx1MkIxQlxcdTJCMUNcXHUyQjUwXFx1MkI1NVxcdTMwMzBcXHUzMDNEXFx1MzI5N1xcdTMyOTldfFxcdUQ4M0NbXFx1REMwNFxcdURDQ0ZcXHVERDcwXFx1REQ3MVxcdUREN0VcXHVERDdGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTAyXFx1REUxQVxcdURFMkZcXHVERTMyLVxcdURFM0FcXHVERTUwXFx1REU1MVxcdURGMDAtXFx1REYyMVxcdURGMjQtXFx1REY5M1xcdURGOTZcXHVERjk3XFx1REY5OS1cXHVERjlCXFx1REY5RS1cXHVERkYwXFx1REZGMy1cXHVERkY1XFx1REZGNy1cXHVERkZGXXxcXHVEODNEW1xcdURDMDAtXFx1RENGRFxcdURDRkYtXFx1REQzRFxcdURENDktXFx1REQ0RVxcdURENTAtXFx1REQ2N1xcdURENkZcXHVERDcwXFx1REQ3My1cXHVERDdBXFx1REQ4N1xcdUREOEEtXFx1REQ4RFxcdUREOTBcXHVERDk1XFx1REQ5NlxcdUREQTRcXHVEREE1XFx1RERBOFxcdUREQjFcXHVEREIyXFx1RERCQ1xcdUREQzItXFx1RERDNFxcdURERDEtXFx1REREM1xcdUREREMtXFx1RERERVxcdURERTFcXHVEREUzXFx1RERFOFxcdURERUZcXHVEREYzXFx1RERGQS1cXHVERTRGXFx1REU4MC1cXHVERUM1XFx1REVDQi1cXHVERUQyXFx1REVENVxcdURFRTAtXFx1REVFNVxcdURFRTlcXHVERUVCXFx1REVFQ1xcdURFRjBcXHVERUYzLVxcdURFRkFcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwRC1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDcxXFx1REQ3My1cXHVERDc2XFx1REQ3QS1cXHVEREEyXFx1RERBNS1cXHVEREFBXFx1RERBRS1cXHVERENBXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTczXFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTgyXFx1REU5MC1cXHVERTk1XSlcXHVGRTBGfCg/OltcXHUyNjFEXFx1MjZGOVxcdTI3MEEtXFx1MjcwRF18XFx1RDgzQ1tcXHVERjg1XFx1REZDMi1cXHVERkM0XFx1REZDN1xcdURGQ0EtXFx1REZDQ118XFx1RDgzRFtcXHVEQzQyXFx1REM0M1xcdURDNDYtXFx1REM1MFxcdURDNjYtXFx1REM3OFxcdURDN0NcXHVEQzgxLVxcdURDODNcXHVEQzg1LVxcdURDODdcXHVEQzhGXFx1REM5MVxcdURDQUFcXHVERDc0XFx1REQ3NVxcdUREN0FcXHVERDkwXFx1REQ5NVxcdUREOTZcXHVERTQ1LVxcdURFNDdcXHVERTRCLVxcdURFNEZcXHVERUEzXFx1REVCNC1cXHVERUI2XFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwRlxcdUREMTgtXFx1REQxRlxcdUREMjZcXHVERDMwLVxcdUREMzlcXHVERDNDLVxcdUREM0VcXHVEREI1XFx1RERCNlxcdUREQjhcXHVEREI5XFx1RERCQlxcdUREQ0QtXFx1RERDRlxcdURERDEtXFx1RERERF0pL2csXCIgIFwiKSl8fDA9PT10Lmxlbmd0aClyZXR1cm4gMDt0PWYodCk7bGV0IGU9MDtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKyl7Y29uc3QgaT10LmNvZGVQb2ludEF0KHMpO2k8PTMxfHxpPj0xMjcmJmk8PTE1OXx8KGk+PTc2OCYmaTw9ODc5fHwoaT42NTUzNSYmcysrLGUrPXkoaSk/MjoxKSl9cmV0dXJuIGV9O3ZhciBQPWcsRT1nO1AuZGVmYXVsdD1FO2NvbnN0IEM9L1t8XFxcXHt9KClbXFxdXiQrKj8uLV0vZzt2YXIgYj10PT57aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGEgc3RyaW5nXCIpO3JldHVybiB0LnJlcGxhY2UoQyxcIlxcXFwkJlwiKX07Y29uc3QgVD0vW15cXHgyMC1cXHg3Rl0vO2Z1bmN0aW9uIEEodCl7cmV0dXJuKGUscyxpKT0+e2NvbnN0IHI9aSYmaS5iYWNrd2FyZHM7aWYoITE9PT1zKXJldHVybiExO2NvbnN0e2xlbmd0aDphfT1lO2xldCBuPXM7Zm9yKDtuPj0wJiZuPGE7KXtjb25zdCBzPWUuY2hhckF0KG4pO2lmKHQgaW5zdGFuY2VvZiBSZWdFeHApe2lmKCF0LnRlc3QocykpcmV0dXJuIG59ZWxzZSBpZighdC5pbmNsdWRlcyhzKSlyZXR1cm4gbjtyP24tLTpuKyt9cmV0dXJuKC0xPT09bnx8bj09PWEpJiZufX1jb25zdCB3PUEoL1xccy8pLFM9QShcIiBcXHRcIiksTj1BKFwiLDsgXFx0XCIpLEY9QSgvW15cXHJcXG5dLyk7ZnVuY3Rpb24gayh0LGUpe2lmKCExPT09ZSlyZXR1cm4hMTtpZihcIi9cIj09PXQuY2hhckF0KGUpJiZcIipcIj09PXQuY2hhckF0KGUrMSkpZm9yKGxldCBzPWUrMjtzPHQubGVuZ3RoOysrcylpZihcIipcIj09PXQuY2hhckF0KHMpJiZcIi9cIj09PXQuY2hhckF0KHMrMSkpcmV0dXJuIHMrMjtyZXR1cm4gZX1mdW5jdGlvbiBJKHQsZSl7cmV0dXJuITEhPT1lJiYoXCIvXCI9PT10LmNoYXJBdChlKSYmXCIvXCI9PT10LmNoYXJBdChlKzEpP0YodCxlKTplKX1mdW5jdGlvbiB2KHQsZSxzKXtjb25zdCBpPXMmJnMuYmFja3dhcmRzO2lmKCExPT09ZSlyZXR1cm4hMTtjb25zdCByPXQuY2hhckF0KGUpO2lmKGkpe2lmKFwiXFxyXCI9PT10LmNoYXJBdChlLTEpJiZcIlxcblwiPT09cilyZXR1cm4gZS0yO2lmKFwiXFxuXCI9PT1yfHxcIlxcclwiPT09cnx8XCJcXHUyMDI4XCI9PT1yfHxcIlxcdTIwMjlcIj09PXIpcmV0dXJuIGUtMX1lbHNle2lmKFwiXFxyXCI9PT1yJiZcIlxcblwiPT09dC5jaGFyQXQoZSsxKSlyZXR1cm4gZSsyO2lmKFwiXFxuXCI9PT1yfHxcIlxcclwiPT09cnx8XCJcXHUyMDI4XCI9PT1yfHxcIlxcdTIwMjlcIj09PXIpcmV0dXJuIGUrMX1yZXR1cm4gZX1mdW5jdGlvbiBMKHQsZSxzKXtjb25zdCBpPVModCwocz1zfHx7fSkuYmFja3dhcmRzP2UtMTplLHMpO3JldHVybiBpIT09dih0LGkscyl9ZnVuY3Rpb24gQih0LGUpe2xldCBzPW51bGwsaT1lO2Zvcig7aSE9PXM7KXM9aSxpPU4odCxpKSxpPWsodCxpKSxpPVModCxpKTtyZXR1cm4gaT1JKHQsaSksaT12KHQsaSksITEhPT1pJiZMKHQsaSl9ZnVuY3Rpb24gTSh0LGUpe2xldCBzPW51bGwsaT1lO2Zvcig7aSE9PXM7KXM9aSxpPVModCxpKSxpPWsodCxpKSxpPUkodCxpKSxpPXYodCxpKTtyZXR1cm4gaX1mdW5jdGlvbiBPKHQsZSxzKXtyZXR1cm4gTSh0LHMoZSkpfWNvbnN0IFI9e307ZnVuY3Rpb24gXyh0KXtyZXR1cm4gUlt0XX1bW1wifD5cIl0sW1wiPz9cIl0sW1wifHxcIl0sW1wiJiZcIl0sW1wifFwiXSxbXCJeXCJdLFtcIiZcIl0sW1wiPT1cIixcIj09PVwiLFwiIT1cIixcIiE9PVwiXSxbXCI8XCIsXCI+XCIsXCI8PVwiLFwiPj1cIixcImluXCIsXCJpbnN0YW5jZW9mXCJdLFtcIj4+XCIsXCI8PFwiLFwiPj4+XCJdLFtcIitcIixcIi1cIl0sW1wiKlwiLFwiL1wiLFwiJVwiXSxbXCIqKlwiXV0uZm9yRWFjaCgodCxlKT0+e3QuZm9yRWFjaCh0PT57Ult0XT1lfSl9KTtjb25zdCBqPXtcIj09XCI6ITAsXCIhPVwiOiEwLFwiPT09XCI6ITAsXCIhPT1cIjohMH0sVT17XCIqXCI6ITAsXCIvXCI6ITAsXCIlXCI6ITB9LHE9e1wiPj5cIjohMCxcIj4+PlwiOiEwLFwiPDxcIjohMH07ZnVuY3Rpb24gVih0LGUscyl7bGV0IGk9MDtmb3IobGV0IHI9cz1zfHwwO3I8dC5sZW5ndGg7KytyKVwiXFx0XCI9PT10W3JdP2k9aStlLWklZTppKys7cmV0dXJuIGl9ZnVuY3Rpb24geih0LGUpe2NvbnN0IHM9dC5zbGljZSgxLC0xKSxpPXtxdW90ZTonXCInLHJlZ2V4Oi9cIi9nfSxyPXtxdW90ZTpcIidcIixyZWdleDovJy9nfSxhPVwiJ1wiPT09ZT9yOmksbj1hPT09cj9pOnI7bGV0IG89YS5xdW90ZTtpZihzLmluY2x1ZGVzKGEucXVvdGUpfHxzLmluY2x1ZGVzKG4ucXVvdGUpKXtvPShzLm1hdGNoKGEucmVnZXgpfHxbXSkubGVuZ3RoPihzLm1hdGNoKG4ucmVnZXgpfHxbXSkubGVuZ3RoP24ucXVvdGU6YS5xdW90ZX1yZXR1cm4gb31mdW5jdGlvbiBIKHQsZSxzKXtjb25zdCBpPSdcIic9PT1lP1wiJ1wiOidcIicscj10LnJlcGxhY2UoL1xcXFwoW1xcc1xcU10pfChbJ1wiXSkvZywodCxyLGEpPT5yPT09aT9yOmE9PT1lP1wiXFxcXFwiK2E6YXx8KHMmJi9eW15cXFxcbnJ2dGJmdXhcXHJcXG5cXHUyMDI4XFx1MjAyOVwiJzAtN10kLy50ZXN0KHIpP3I6XCJcXFxcXCIrcikpO3JldHVybiBlK3IrZX1mdW5jdGlvbiBXKHQpe3JldHVybiB0JiYodC5jb21tZW50cyYmdC5jb21tZW50cy5sZW5ndGg+MCYmdC5jb21tZW50cy5zb21lKHQ9PksodCkmJiF0LnVuaWdub3JlKXx8dC5wcmV0dGllcklnbm9yZSl9ZnVuY3Rpb24gSyh0KXtyZXR1cm5cInByZXR0aWVyLWlnbm9yZVwiPT09dC52YWx1ZS50cmltKCl9ZnVuY3Rpb24gSih0LGUpeyh0LmNvbW1lbnRzfHwodC5jb21tZW50cz1bXSkpLnB1c2goZSksZS5wcmludGVkPSExLFwiSlNYVGV4dFwiPT09dC50eXBlJiYoZS5wcmludGVkPSEwKX12YXIgWD17cmVwbGFjZUVuZE9mTGluZVdpdGg6ZnVuY3Rpb24odCxlKXtjb25zdCBzPVtdO2Zvcihjb25zdCBpIG9mIHQuc3BsaXQoXCJcXG5cIikpMCE9PXMubGVuZ3RoJiZzLnB1c2goZSkscy5wdXNoKGkpO3JldHVybiBzfSxnZXRTdHJpbmdXaWR0aDpmdW5jdGlvbih0KXtyZXR1cm4gdD9ULnRlc3QodCk/UCh0KTp0Lmxlbmd0aDowfSxnZXRNYXhDb250aW51b3VzQ291bnQ6ZnVuY3Rpb24odCxlKXtjb25zdCBzPXQubWF0Y2gobmV3IFJlZ0V4cChcIihcIi5jb25jYXQoYihlKSxcIikrXCIpLFwiZ1wiKSk7cmV0dXJuIG51bGw9PT1zPzA6cy5yZWR1Y2UoKHQscyk9Pk1hdGgubWF4KHQscy5sZW5ndGgvZS5sZW5ndGgpLDApfSxnZXRNaW5Ob3RQcmVzZW50Q29udGludW91c0NvdW50OmZ1bmN0aW9uKHQsZSl7Y29uc3Qgcz10Lm1hdGNoKG5ldyBSZWdFeHAoXCIoXCIuY29uY2F0KGIoZSksXCIpK1wiKSxcImdcIikpO2lmKG51bGw9PT1zKXJldHVybiAwO2NvbnN0IGk9bmV3IE1hcDtsZXQgcj0wO2Zvcihjb25zdCB0IG9mIHMpe2NvbnN0IHM9dC5sZW5ndGgvZS5sZW5ndGg7aS5zZXQocywhMCkscz5yJiYocj1zKX1mb3IobGV0IHQ9MTt0PHI7dCsrKWlmKCFpLmdldCh0KSlyZXR1cm4gdDtyZXR1cm4gcisxfSxnZXRQcmVjZWRlbmNlOl8sc2hvdWxkRmxhdHRlbjpmdW5jdGlvbih0LGUpe3JldHVybiBfKGUpPT09Xyh0KSYmKFwiKipcIiE9PXQmJigoIWpbdF18fCFqW2VdKSYmKCEoXCIlXCI9PT1lJiZVW3RdfHxcIiVcIj09PXQmJlVbZV0pJiYoKGU9PT10fHwhVVtlXXx8IVVbdF0pJiYoIXFbdF18fCFxW2VdKSkpKSl9LGlzQml0d2lzZU9wZXJhdG9yOmZ1bmN0aW9uKHQpe3JldHVybiEhcVt0XXx8XCJ8XCI9PT10fHxcIl5cIj09PXR8fFwiJlwiPT09dH0sZ2V0UGVudWx0aW1hdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoPjE/dFt0Lmxlbmd0aC0yXTpudWxsfSxnZXRMYXN0OnUsZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4V2l0aFN0YXJ0SW5kZXg6TSxnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXg6TyxnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyOmZ1bmN0aW9uKHQsZSxzKXtyZXR1cm4gdC5jaGFyQXQoTyh0LGUscykpfSxza2lwOkEsc2tpcFdoaXRlc3BhY2U6dyxza2lwU3BhY2VzOlMsc2tpcFRvTGluZUVuZDpOLHNraXBFdmVyeXRoaW5nQnV0TmV3TGluZTpGLHNraXBJbmxpbmVDb21tZW50Omssc2tpcFRyYWlsaW5nQ29tbWVudDpJLHNraXBOZXdsaW5lOnYsaXNOZXh0TGluZUVtcHR5QWZ0ZXJJbmRleDpCLGlzTmV4dExpbmVFbXB0eTpmdW5jdGlvbih0LGUscyl7cmV0dXJuIEIodCxzKGUpKX0saXNQcmV2aW91c0xpbmVFbXB0eTpmdW5jdGlvbih0LGUscyl7bGV0IGk9cyhlKS0xO3JldHVybiBpPVModCxpLHtiYWNrd2FyZHM6ITB9KSxpPXYodCxpLHtiYWNrd2FyZHM6ITB9KSxpPVModCxpLHtiYWNrd2FyZHM6ITB9KSxpIT09dih0LGkse2JhY2t3YXJkczohMH0pfSxoYXNOZXdsaW5lOkwsaGFzTmV3bGluZUluUmFuZ2U6ZnVuY3Rpb24odCxlLHMpe2ZvcihsZXQgaT1lO2k8czsrK2kpaWYoXCJcXG5cIj09PXQuY2hhckF0KGkpKXJldHVybiEwO3JldHVybiExfSxoYXNTcGFjZXM6ZnVuY3Rpb24odCxlLHMpe3JldHVybiBTKHQsKHM9c3x8e30pLmJhY2t3YXJkcz9lLTE6ZSxzKSE9PWV9LHNldExvY1N0YXJ0OmZ1bmN0aW9uKHQsZSl7dC5yYW5nZT90LnJhbmdlWzBdPWU6dC5zdGFydD1lfSxzZXRMb2NFbmQ6ZnVuY3Rpb24odCxlKXt0LnJhbmdlP3QucmFuZ2VbMV09ZTp0LmVuZD1lfSxzdGFydHNXaXRoTm9Mb29rYWhlYWRUb2tlbjpmdW5jdGlvbiB0KGUscyl7c3dpdGNoKChlPWZ1bmN0aW9uIHQoZSl7aWYoZS5sZWZ0KXJldHVybiB0KGUubGVmdCk7cmV0dXJuIGV9KGUpKS50eXBlKXtjYXNlXCJGdW5jdGlvbkV4cHJlc3Npb25cIjpjYXNlXCJDbGFzc0V4cHJlc3Npb25cIjpjYXNlXCJEb0V4cHJlc3Npb25cIjpyZXR1cm4gcztjYXNlXCJPYmplY3RFeHByZXNzaW9uXCI6cmV0dXJuITA7Y2FzZVwiTWVtYmVyRXhwcmVzc2lvblwiOmNhc2VcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiOnJldHVybiB0KGUub2JqZWN0LHMpO2Nhc2VcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiOnJldHVyblwiRnVuY3Rpb25FeHByZXNzaW9uXCIhPT1lLnRhZy50eXBlJiZ0KGUudGFnLHMpO2Nhc2VcIkNhbGxFeHByZXNzaW9uXCI6Y2FzZVwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiOnJldHVyblwiRnVuY3Rpb25FeHByZXNzaW9uXCIhPT1lLmNhbGxlZS50eXBlJiZ0KGUuY2FsbGVlLHMpO2Nhc2VcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOnJldHVybiB0KGUudGVzdCxzKTtjYXNlXCJVcGRhdGVFeHByZXNzaW9uXCI6cmV0dXJuIWUucHJlZml4JiZ0KGUuYXJndW1lbnQscyk7Y2FzZVwiQmluZEV4cHJlc3Npb25cIjpyZXR1cm4gZS5vYmplY3QmJnQoZS5vYmplY3Qscyk7Y2FzZVwiU2VxdWVuY2VFeHByZXNzaW9uXCI6cmV0dXJuIHQoZS5leHByZXNzaW9uc1swXSxzKTtjYXNlXCJUU0FzRXhwcmVzc2lvblwiOnJldHVybiB0KGUuZXhwcmVzc2lvbixzKTtkZWZhdWx0OnJldHVybiExfX0sZ2V0QWxpZ25tZW50U2l6ZTpWLGdldEluZGVudFNpemU6ZnVuY3Rpb24odCxlKXtjb25zdCBzPXQubGFzdEluZGV4T2YoXCJcXG5cIik7cmV0dXJuLTE9PT1zPzA6Vih0LnNsaWNlKHMrMSkubWF0Y2goL15bIFxcdF0qLylbMF0sZSl9LGdldFByZWZlcnJlZFF1b3RlOnoscHJpbnRTdHJpbmc6ZnVuY3Rpb24odCxlLHMpe2NvbnN0IGk9dC5zbGljZSgxLC0xKSxyPSFpLmluY2x1ZGVzKCdcIicpJiYhaS5pbmNsdWRlcyhcIidcIiksYT1cImpzb25cIj09PWUucGFyc2VyPydcIic6ZS5fX2lzSW5IdG1sQXR0cmlidXRlP1wiJ1wiOnoodCxlLnNpbmdsZVF1b3RlP1wiJ1wiOidcIicpO3JldHVybiBzP3I/YStpK2E6dDpIKGksYSwhKFwiY3NzXCI9PT1lLnBhcnNlcnx8XCJsZXNzXCI9PT1lLnBhcnNlcnx8XCJzY3NzXCI9PT1lLnBhcnNlcnx8ZS5lbWJlZGRlZEluSHRtbCkpfSxwcmludE51bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL14oWystXT9bXFxkLl0rZSkoPzpcXCt8KC0pKT8wKihcXGQpLyxcIiQxJDIkM1wiKS5yZXBsYWNlKC9eKFsrLV0/W1xcZC5dKyllWystXT8wKyQvLFwiJDFcIikucmVwbGFjZSgvXihbKy1dKT9cXC4vLFwiJDEwLlwiKS5yZXBsYWNlKC8oXFwuXFxkKz8pMCsoPz1lfCQpLyxcIiQxXCIpLnJlcGxhY2UoL1xcLig/PWV8JCkvLFwiXCIpfSxoYXNJZ25vcmVDb21tZW50OmZ1bmN0aW9uKHQpe3JldHVybiBXKHQuZ2V0VmFsdWUoKSl9LGhhc05vZGVJZ25vcmVDb21tZW50OlcsaXNOb2RlSWdub3JlQ29tbWVudDpLLG1ha2VTdHJpbmc6SCxhZGRMZWFkaW5nQ29tbWVudDpmdW5jdGlvbih0LGUpe2UubGVhZGluZz0hMCxlLnRyYWlsaW5nPSExLEoodCxlKX0sYWRkRGFuZ2xpbmdDb21tZW50OmZ1bmN0aW9uKHQsZSl7ZS5sZWFkaW5nPSExLGUudHJhaWxpbmc9ITEsSih0LGUpfSxhZGRUcmFpbGluZ0NvbW1lbnQ6ZnVuY3Rpb24odCxlKXtlLmxlYWRpbmc9ITEsZS50cmFpbGluZz0hMCxKKHQsZSl9LGlzV2l0aGluUGFyZW50QXJyYXlQcm9wZXJ0eTpmdW5jdGlvbih0LGUpe2NvbnN0IHM9dC5nZXRWYWx1ZSgpLGk9dC5nZXRQYXJlbnROb2RlKCk7aWYobnVsbD09aSlyZXR1cm4hMTtpZighQXJyYXkuaXNBcnJheShpW2VdKSlyZXR1cm4hMTtjb25zdCByPXQuZ2V0TmFtZSgpO3JldHVybiBpW2VdW3JdPT09c319O2NvbnN0e2dldE1heENvbnRpbnVvdXNDb3VudDpHLGdldFN0cmluZ1dpZHRoOlEsZ2V0QWxpZ25tZW50U2l6ZTpZLGdldEluZGVudFNpemU6JCxza2lwOlosc2tpcFdoaXRlc3BhY2U6dHQsc2tpcFNwYWNlczpldCxza2lwTmV3bGluZTpzdCxza2lwVG9MaW5lRW5kOml0LHNraXBFdmVyeXRoaW5nQnV0TmV3TGluZTpydCxza2lwSW5saW5lQ29tbWVudDphdCxza2lwVHJhaWxpbmdDb21tZW50Om50LGhhc05ld2xpbmU6b3QsaGFzTmV3bGluZUluUmFuZ2U6aHQsaGFzU3BhY2VzOnB0LGlzTmV4dExpbmVFbXB0eTpjdCxpc05leHRMaW5lRW1wdHlBZnRlckluZGV4OnV0LGlzUHJldmlvdXNMaW5lRW1wdHk6bHQsZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4OmR0LG1ha2VTdHJpbmc6bXQsYWRkTGVhZGluZ0NvbW1lbnQ6ZnQsYWRkRGFuZ2xpbmdDb21tZW50OkR0LGFkZFRyYWlsaW5nQ29tbWVudDp5dH09WDt2YXIgeHQ9e2dldE1heENvbnRpbnVvdXNDb3VudDpHLGdldFN0cmluZ1dpZHRoOlEsZ2V0QWxpZ25tZW50U2l6ZTpZLGdldEluZGVudFNpemU6JCxza2lwOlosc2tpcFdoaXRlc3BhY2U6dHQsc2tpcFNwYWNlczpldCxza2lwTmV3bGluZTpzdCxza2lwVG9MaW5lRW5kOml0LHNraXBFdmVyeXRoaW5nQnV0TmV3TGluZTpydCxza2lwSW5saW5lQ29tbWVudDphdCxza2lwVHJhaWxpbmdDb21tZW50Om50LGhhc05ld2xpbmU6b3QsaGFzTmV3bGluZUluUmFuZ2U6aHQsaGFzU3BhY2VzOnB0LGlzTmV4dExpbmVFbXB0eTpjdCxpc05leHRMaW5lRW1wdHlBZnRlckluZGV4OnV0LGlzUHJldmlvdXNMaW5lRW1wdHk6bHQsZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4OmR0LG1ha2VTdHJpbmc6bXQsYWRkTGVhZGluZ0NvbW1lbnQ6ZnQsYWRkRGFuZ2xpbmdDb21tZW50OkR0LGFkZFRyYWlsaW5nQ29tbWVudDp5dH07Y29uc3R7YWRkTGVhZGluZ0NvbW1lbnQ6Z3QsYWRkVHJhaWxpbmdDb21tZW50OlB0LGFkZERhbmdsaW5nQ29tbWVudDpFdCxnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXg6Q3R9PXh0O2Z1bmN0aW9uIGJ0KHQsZSl7Y29uc3Qgcz10LmJvZHkuZmlsdGVyKHQ9PlwiRW1wdHlTdGF0ZW1lbnRcIiE9PXQudHlwZSk7MD09PXMubGVuZ3RoP0V0KHQsZSk6Z3Qoc1swXSxlKX1mdW5jdGlvbiBUdCh0LGUpe1wiQmxvY2tTdGF0ZW1lbnRcIj09PXQudHlwZT9idCh0LGUpOmd0KHQsZSl9ZnVuY3Rpb24gQXQodCxlLHMsaSxyLGEpe2lmKCFzfHxcIklmU3RhdGVtZW50XCIhPT1zLnR5cGV8fCFpKXJldHVybiExO3JldHVyblwiKVwiPT09WC5nZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyKHQscixhLmxvY0VuZCk/KFB0KGUsciksITApOmU9PT1zLmNvbnNlcXVlbnQmJmk9PT1zLmFsdGVybmF0ZT8oXCJCbG9ja1N0YXRlbWVudFwiPT09ZS50eXBlP1B0KGUscik6RXQocyxyKSwhMCk6XCJCbG9ja1N0YXRlbWVudFwiPT09aS50eXBlPyhidChpLHIpLCEwKTpcIklmU3RhdGVtZW50XCI9PT1pLnR5cGU/KFR0KGkuY29uc2VxdWVudCxyKSwhMCk6cy5jb25zZXF1ZW50PT09aSYmKGd0KGksciksITApfWZ1bmN0aW9uIHd0KHQsZSxzLGkscixhKXtpZighc3x8XCJXaGlsZVN0YXRlbWVudFwiIT09cy50eXBlfHwhaSlyZXR1cm4hMTtyZXR1cm5cIilcIj09PVguZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3Rlcih0LHIsYS5sb2NFbmQpPyhQdChlLHIpLCEwKTpcIkJsb2NrU3RhdGVtZW50XCI9PT1pLnR5cGUmJihidChpLHIpLCEwKX1mdW5jdGlvbiBTdCh0LGUscyxpKXtyZXR1cm4hKCF0fHxcIlRyeVN0YXRlbWVudFwiIT09dC50eXBlJiZcIkNhdGNoQ2xhdXNlXCIhPT10LnR5cGV8fCFzKSYmKFwiQ2F0Y2hDbGF1c2VcIj09PXQudHlwZSYmZT8oUHQoZSxpKSwhMCk6XCJCbG9ja1N0YXRlbWVudFwiPT09cy50eXBlPyhidChzLGkpLCEwKTpcIlRyeVN0YXRlbWVudFwiPT09cy50eXBlPyhUdChzLmZpbmFsaXplcixpKSwhMCk6XCJDYXRjaENsYXVzZVwiPT09cy50eXBlJiYoVHQocy5ib2R5LGkpLCEwKSl9ZnVuY3Rpb24gTnQodCxlLHMsaSl7cmV0dXJuISghKHQmJihcIkNsYXNzRGVjbGFyYXRpb25cIj09PXQudHlwZXx8XCJDbGFzc0V4cHJlc3Npb25cIj09PXQudHlwZSkmJnQuZGVjb3JhdG9ycyYmdC5kZWNvcmF0b3JzLmxlbmd0aD4wKXx8cyYmXCJEZWNvcmF0b3JcIj09PXMudHlwZSkmJih0LmRlY29yYXRvcnMmJjAhPT10LmRlY29yYXRvcnMubGVuZ3RoP1B0KHQuZGVjb3JhdG9yc1t0LmRlY29yYXRvcnMubGVuZ3RoLTFdLGkpOmd0KHQsaSksITApfWZ1bmN0aW9uIEZ0KHQsZSxzLGkscil7cmV0dXJuIGUmJnMmJihcIlByb3BlcnR5XCI9PT1lLnR5cGV8fFwiVFNEZWNsYXJlTWV0aG9kXCI9PT1lLnR5cGV8fFwiVFNBYnN0cmFjdE1ldGhvZERlZmluaXRpb25cIj09PWUudHlwZSkmJlwiSWRlbnRpZmllclwiPT09cy50eXBlJiZlLmtleT09PXMmJlwiOlwiIT09WC5nZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyKHQscyxyLmxvY0VuZCk/KFB0KHMsaSksITApOiEoIXN8fCFlfHxcIkRlY29yYXRvclwiIT09cy50eXBlfHxcIkNsYXNzTWV0aG9kXCIhPT1lLnR5cGUmJlwiQ2xhc3NQcm9wZXJ0eVwiIT09ZS50eXBlJiZcIlRTQWJzdHJhY3RDbGFzc1Byb3BlcnR5XCIhPT1lLnR5cGUmJlwiVFNBYnN0cmFjdE1ldGhvZERlZmluaXRpb25cIiE9PWUudHlwZSYmXCJUU0RlY2xhcmVNZXRob2RcIiE9PWUudHlwZSYmXCJNZXRob2REZWZpbml0aW9uXCIhPT1lLnR5cGUpJiYoUHQocyxpKSwhMCl9ZnVuY3Rpb24ga3QodCxlLHMsaSxyLGEpe2lmKGUmJlwiRnVuY3Rpb25UeXBlUGFyYW1cIj09PWUudHlwZSYmcyYmXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCI9PT1zLnR5cGUmJmkmJlwiRnVuY3Rpb25UeXBlUGFyYW1cIiE9PWkudHlwZSlyZXR1cm4gUHQoZSxyKSwhMDtpZihlJiYoXCJJZGVudGlmaWVyXCI9PT1lLnR5cGV8fFwiQXNzaWdubWVudFBhdHRlcm5cIj09PWUudHlwZSkmJnMmJk10KHMpJiZcIilcIj09PVguZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3Rlcih0LHIsYS5sb2NFbmQpKXJldHVybiBQdChlLHIpLCEwO2lmKHMmJlwiRnVuY3Rpb25EZWNsYXJhdGlvblwiPT09cy50eXBlJiZpJiZcIkJsb2NrU3RhdGVtZW50XCI9PT1pLnR5cGUpe2NvbnN0IGU9KCgpPT57aWYoMCE9PShzLnBhcmFtc3x8cy5wYXJhbWV0ZXJzKS5sZW5ndGgpcmV0dXJuIFguZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4V2l0aFN0YXJ0SW5kZXgodCxhLmxvY0VuZChYLmdldExhc3Qocy5wYXJhbXN8fHMucGFyYW1ldGVycykpKTtjb25zdCBlPVguZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4V2l0aFN0YXJ0SW5kZXgodCxhLmxvY0VuZChzLmlkKSk7cmV0dXJuIFguZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4V2l0aFN0YXJ0SW5kZXgodCxlKzEpfSkoKTtpZihhLmxvY1N0YXJ0KHIpPmUpcmV0dXJuIGJ0KGksciksITB9cmV0dXJuITF9ZnVuY3Rpb24gSXQodCxlKXtyZXR1cm4hKCF0fHxcIkltcG9ydFNwZWNpZmllclwiIT09dC50eXBlKSYmKGd0KHQsZSksITApfWZ1bmN0aW9uIHZ0KHQsZSl7cmV0dXJuISghdHx8XCJMYWJlbGVkU3RhdGVtZW50XCIhPT10LnR5cGUpJiYoZ3QodCxlKSwhMCl9ZnVuY3Rpb24gTHQodCxlLHMsaSl7cmV0dXJuIGUmJmUuYm9keSYmMD09PWUuYm9keS5sZW5ndGg/KGk/RXQoZSxzKTpndChlLHMpLCEwKTohKCF0fHxcIlByb2dyYW1cIiE9PXQudHlwZXx8MCE9PXQuYm9keS5sZW5ndGh8fCF0LmRpcmVjdGl2ZXN8fDAhPT10LmRpcmVjdGl2ZXMubGVuZ3RoKSYmKGk/RXQodCxzKTpndCh0LHMpLCEwKX1mdW5jdGlvbiBCdCh0KXtyZXR1cm5cIkJsb2NrXCI9PT10LnR5cGV8fFwiQ29tbWVudEJsb2NrXCI9PT10LnR5cGV9ZnVuY3Rpb24gTXQodCl7cmV0dXJuXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiPT09dC50eXBlfHxcIkZ1bmN0aW9uRXhwcmVzc2lvblwiPT09dC50eXBlfHxcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIj09PXQudHlwZXx8XCJPYmplY3RNZXRob2RcIj09PXQudHlwZXx8XCJDbGFzc01ldGhvZFwiPT09dC50eXBlfHxcIlRTRGVjbGFyZUZ1bmN0aW9uXCI9PT10LnR5cGV8fFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIj09PXQudHlwZXx8XCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCI9PT10LnR5cGV8fFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiPT09dC50eXBlfHxcIlRTTWV0aG9kU2lnbmF0dXJlXCI9PT10LnR5cGV8fFwiVFNDb25zdHJ1Y3RvclR5cGVcIj09PXQudHlwZXx8XCJUU0Z1bmN0aW9uVHlwZVwiPT09dC50eXBlfHxcIlRTRGVjbGFyZU1ldGhvZFwiPT09dC50eXBlfWZ1bmN0aW9uIE90KHQpe3JldHVybiBCdCh0KSYmXCIqXCI9PT10LnZhbHVlWzBdJiYvQHR5cGVcXGIvLnRlc3QodC52YWx1ZSl9dmFyIFJ0PXtoYW5kbGVPd25MaW5lQ29tbWVudDpmdW5jdGlvbih0LGUscyxpLHIpe2NvbnN0e3ByZWNlZGluZ05vZGU6YSxlbmNsb3NpbmdOb2RlOm4sZm9sbG93aW5nTm9kZTpvfT10O3JldHVybiBrdChlLGEsbixvLHQscyl8fGZ1bmN0aW9uKHQsZSxzKXtpZih0JiYoXCJNZW1iZXJFeHByZXNzaW9uXCI9PT10LnR5cGV8fFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI9PT10LnR5cGUpJiZlJiZcIklkZW50aWZpZXJcIj09PWUudHlwZSlyZXR1cm4gZ3QodCxzKSwhMDtyZXR1cm4hMX0obixvLHQpfHxBdChlLGEsbixvLHQscyl8fHd0KGUsYSxuLG8sdCxzKXx8U3QobixhLG8sdCl8fE50KG4sYSxvLHQpfHxJdChuLHQpfHxmdW5jdGlvbih0LGUscyl7aWYodCYmKFwiRm9ySW5TdGF0ZW1lbnRcIj09PXQudHlwZXx8XCJGb3JPZlN0YXRlbWVudFwiPT09dC50eXBlKSlyZXR1cm4gZ3QodCxzKSwhMDtyZXR1cm4hMX0obiwwLHQpfHxmdW5jdGlvbih0LGUscyxpKXtpZihlJiYoXCJVbmlvblR5cGVBbm5vdGF0aW9uXCI9PT1lLnR5cGV8fFwiVFNVbmlvblR5cGVcIj09PWUudHlwZSkpcmV0dXJuIFguaXNOb2RlSWdub3JlQ29tbWVudChpKSYmKHMucHJldHRpZXJJZ25vcmU9ITAsaS51bmlnbm9yZT0hMCksISF0JiYoUHQodCxpKSwhMCk7cyYmKFwiVW5pb25UeXBlQW5ub3RhdGlvblwiPT09cy50eXBlfHxcIlRTVW5pb25UeXBlXCI9PT1zLnR5cGUpJiZYLmlzTm9kZUlnbm9yZUNvbW1lbnQoaSkmJihzLnR5cGVzWzBdLnByZXR0aWVySWdub3JlPSEwLGkudW5pZ25vcmU9ITApO3JldHVybiExfShhLG4sbyx0KXx8THQobixpLHQscil8fGZ1bmN0aW9uKHQsZSxzLGkscil7aWYocyYmXCJJbXBvcnRTcGVjaWZpZXJcIj09PXMudHlwZSYmZSYmXCJJbXBvcnREZWNsYXJhdGlvblwiPT09ZS50eXBlJiZYLmhhc05ld2xpbmUodCxyLmxvY0VuZChpKSkpcmV0dXJuIFB0KHMsaSksITA7cmV0dXJuITF9KGUsbixhLHQscyl8fGZ1bmN0aW9uKHQsZSl7aWYodCYmXCJBc3NpZ25tZW50UGF0dGVyblwiPT09dC50eXBlKXJldHVybiBndCh0LGUpLCEwO3JldHVybiExfShuLHQpfHxGdChlLG4sYSx0LHMpfHx2dChuLHQpfSxoYW5kbGVFbmRPZkxpbmVDb21tZW50OmZ1bmN0aW9uKHQsZSxzLGkscil7Y29uc3R7cHJlY2VkaW5nTm9kZTphLGVuY2xvc2luZ05vZGU6bixmb2xsb3dpbmdOb2RlOm99PXQ7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYodCYmT3QoZSkpcmV0dXJuIGd0KHQsZSksITA7cmV0dXJuITF9KG8sdCl8fGt0KGUsYSxuLG8sdCxzKXx8ZnVuY3Rpb24odCxlLHMsaSxyLGEpe2NvbnN0IG49ZSYmIVguaGFzTmV3bGluZUluUmFuZ2UocixhLmxvY0VuZChlKSxhLmxvY1N0YXJ0KGkpKTtpZigoIWV8fCFuKSYmdCYmXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIj09PXQudHlwZSYmcylyZXR1cm4gZ3QocyxpKSwhMDtyZXR1cm4hMX0obixhLG8sdCxlLHMpfHxJdChuLHQpfHxBdChlLGEsbixvLHQscyl8fHd0KGUsYSxuLG8sdCxzKXx8U3QobixhLG8sdCl8fE50KG4sYSxvLHQpfHx2dChuLHQpfHxmdW5jdGlvbih0LGUscyl7aWYoZSYmKFwiQ2FsbEV4cHJlc3Npb25cIj09PWUudHlwZXx8XCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCI9PT1lLnR5cGUpJiZ0JiZlLmNhbGxlZT09PXQmJmUuYXJndW1lbnRzLmxlbmd0aD4wKXJldHVybiBndChlLmFyZ3VtZW50c1swXSxzKSwhMDtyZXR1cm4hMX0oYSxuLHQpfHxmdW5jdGlvbih0LGUpe2lmKHQmJihcIlByb3BlcnR5XCI9PT10LnR5cGV8fFwiT2JqZWN0UHJvcGVydHlcIj09PXQudHlwZSkpcmV0dXJuIGd0KHQsZSksITA7cmV0dXJuITF9KG4sdCl8fEx0KG4saSx0LHIpfHxmdW5jdGlvbih0LGUscyl7aWYodCYmXCJUeXBlQWxpYXNcIj09PXQudHlwZSlyZXR1cm4gZ3QodCxzKSwhMDtyZXR1cm4hMX0obiwwLHQpfHxmdW5jdGlvbih0LGUscyl7aWYodCYmKFwiVmFyaWFibGVEZWNsYXJhdG9yXCI9PT10LnR5cGV8fFwiQXNzaWdubWVudEV4cHJlc3Npb25cIj09PXQudHlwZSkmJmUmJihcIk9iamVjdEV4cHJlc3Npb25cIj09PWUudHlwZXx8XCJBcnJheUV4cHJlc3Npb25cIj09PWUudHlwZXx8XCJUZW1wbGF0ZUxpdGVyYWxcIj09PWUudHlwZXx8XCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIj09PWUudHlwZXx8QnQocykpKXJldHVybiBndChlLHMpLCEwO3JldHVybiExfShuLG8sdCl9LGhhbmRsZVJlbWFpbmluZ0NvbW1lbnQ6ZnVuY3Rpb24odCxlLHMsaSxyKXtjb25zdHtwcmVjZWRpbmdOb2RlOmEsZW5jbG9zaW5nTm9kZTpuLGZvbGxvd2luZ05vZGU6b309dDtyZXR1cm4hIShBdChlLGEsbixvLHQscyl8fHd0KGUsYSxuLG8sdCxzKXx8ZnVuY3Rpb24odCxlLHMpe2lmKHQmJihcIk9iamVjdFByb3BlcnR5XCI9PT10LnR5cGV8fFwiUHJvcGVydHlcIj09PXQudHlwZSkmJnQuc2hvcnRoYW5kJiZ0LmtleT09PWUmJlwiQXNzaWdubWVudFBhdHRlcm5cIj09PXQudmFsdWUudHlwZSlyZXR1cm4gUHQodC52YWx1ZS5sZWZ0LHMpLCEwO3JldHVybiExfShuLGEsdCl8fGZ1bmN0aW9uKHQsZSxzLGkpe2lmKFwiKVwiIT09WC5nZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyKHQscyxpLmxvY0VuZCkpcmV0dXJuITE7aWYoZSYmKE10KGUpJiYwPT09KGUucGFyYW1zfHxlLnBhcmFtZXRlcnMpLmxlbmd0aHx8KFwiQ2FsbEV4cHJlc3Npb25cIj09PWUudHlwZXx8XCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCI9PT1lLnR5cGV8fFwiTmV3RXhwcmVzc2lvblwiPT09ZS50eXBlKSYmMD09PWUuYXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuIEV0KGUscyksITA7aWYoZSYmXCJNZXRob2REZWZpbml0aW9uXCI9PT1lLnR5cGUmJjA9PT1lLnZhbHVlLnBhcmFtcy5sZW5ndGgpcmV0dXJuIEV0KGUudmFsdWUscyksITA7cmV0dXJuITF9KGUsbix0LHMpfHxGdChlLG4sYSx0LHMpfHxMdChuLGksdCxyKXx8ZnVuY3Rpb24odCxlLHMsaSl7aWYoIWV8fFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiE9PWUudHlwZSlyZXR1cm4hMTtjb25zdCByPUN0KHQscyxpLmxvY0VuZCk7aWYoXCI9PlwiPT09dC5zbGljZShyLHIrMikpcmV0dXJuIEV0KGUscyksITA7cmV0dXJuITF9KGUsbix0LHMpfHxmdW5jdGlvbih0LGUscyxpLHIpe2lmKFwiKFwiIT09WC5nZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyKHQsaSxyLmxvY0VuZCkpcmV0dXJuITE7aWYocyYmZSYmKFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiPT09ZS50eXBlfHxcIkZ1bmN0aW9uRXhwcmVzc2lvblwiPT09ZS50eXBlfHxcIkNsYXNzTWV0aG9kXCI9PT1lLnR5cGV8fFwiTWV0aG9kRGVmaW5pdGlvblwiPT09ZS50eXBlfHxcIk9iamVjdE1ldGhvZFwiPT09ZS50eXBlKSlyZXR1cm4gUHQocyxpKSwhMDtyZXR1cm4hMX0oZSxuLGEsdCxzKXx8ZnVuY3Rpb24odCxlLHMsaSxyKXtpZighZXx8XCJUU01hcHBlZFR5cGVcIiE9PWUudHlwZSlyZXR1cm4hMTtpZihpJiZcIlRTVHlwZVBhcmFtZXRlclwiPT09aS50eXBlJiZpLm5hbWUpcmV0dXJuIGd0KGkubmFtZSxyKSwhMDtpZihzJiZcIlRTVHlwZVBhcmFtZXRlclwiPT09cy50eXBlJiZzLmNvbnN0cmFpbnQpcmV0dXJuIFB0KHMuY29uc3RyYWludCxyKSwhMDtyZXR1cm4hMX0oMCxuLGEsbyx0KXx8ZnVuY3Rpb24odCxlKXtpZih0JiYoXCJDb250aW51ZVN0YXRlbWVudFwiPT09dC50eXBlfHxcIkJyZWFrU3RhdGVtZW50XCI9PT10LnR5cGUpJiYhdC5sYWJlbClyZXR1cm4gUHQodCxlKSwhMDtyZXR1cm4hMX0obix0KXx8ZnVuY3Rpb24odCxlLHMsaSxyKXtpZighcyYmZSYmKFwiVFNNZXRob2RTaWduYXR1cmVcIj09PWUudHlwZXx8XCJUU0RlY2xhcmVGdW5jdGlvblwiPT09ZS50eXBlfHxcIlRTQWJzdHJhY3RNZXRob2REZWZpbml0aW9uXCI9PT1lLnR5cGUpJiZcIjtcIj09PVguZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3Rlcih0LGksci5sb2NFbmQpKXJldHVybiBQdChlLGkpLCEwO3JldHVybiExfShlLG4sbyx0LHMpKX0saGFzTGVhZGluZ0NvbW1lbnQ6ZnVuY3Rpb24odCxlPSgoKT0+ITApKXtyZXR1cm4gdC5sZWFkaW5nQ29tbWVudHM/dC5sZWFkaW5nQ29tbWVudHMuc29tZShlKTohIXQuY29tbWVudHMmJnQuY29tbWVudHMuc29tZSh0PT50LmxlYWRpbmcmJmUodCkpfSxpc0Jsb2NrQ29tbWVudDpCdCxpc1R5cGVDYXN0Q29tbWVudDpPdCxnZXRHYXBSZWdleDpmdW5jdGlvbih0KXtpZih0JiZcIkJpbmFyeUV4cHJlc3Npb25cIiE9PXQudHlwZSYmXCJMb2dpY2FsRXhwcmVzc2lvblwiIT09dC50eXBlKXJldHVybi9eW1xccygmfF0qJC99LGdldENvbW1lbnRDaGlsZE5vZGVzOmZ1bmN0aW9uKHQsZSl7aWYoKFwidHlwZXNjcmlwdFwiPT09ZS5wYXJzZXJ8fFwiZmxvd1wiPT09ZS5wYXJzZXIpJiZcIk1ldGhvZERlZmluaXRpb25cIj09PXQudHlwZSYmdC52YWx1ZSYmXCJGdW5jdGlvbkV4cHJlc3Npb25cIj09PXQudmFsdWUudHlwZSYmMD09PXQudmFsdWUucGFyYW1zLmxlbmd0aCYmIXQudmFsdWUucmV0dXJuVHlwZSYmKCF0LnZhbHVlLnR5cGVQYXJhbWV0ZXJzfHwwPT09dC52YWx1ZS50eXBlUGFyYW1ldGVycy5sZW5ndGgpJiZ0LnZhbHVlLmJvZHkpcmV0dXJuWy4uLnQuZGVjb3JhdG9yc3x8W10sdC5rZXksdC52YWx1ZS5ib2R5XX19O2NvbnN0e2dldExhc3Q6X3QsZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlcjpqdH09WCx7Y29tcG9zZUxvYzpVdCxsb2NFbmQ6cXR9PW0se2lzVHlwZUNhc3RDb21tZW50OlZ0fT1SdDtmdW5jdGlvbiB6dCh0LGUscyxpKXtpZighdHx8XCJvYmplY3RcIiE9dHlwZW9mIHQpcmV0dXJuO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXp0KHRbc10sZSx0LHMpO3JldHVybn1pZihcInN0cmluZ1wiIT10eXBlb2YgdC50eXBlKXJldHVybjtmb3IoY29uc3QgcyBvZiBPYmplY3Qua2V5cyh0KSl6dCh0W3NdLGUsdCxzKTtjb25zdCByPWUodCk7ciYmKHNbaV09cil9ZnVuY3Rpb24gSHQodCl7cmV0dXJuXCJMb2dpY2FsRXhwcmVzc2lvblwiPT09dC50eXBlJiZcIkxvZ2ljYWxFeHByZXNzaW9uXCI9PT10LnJpZ2h0LnR5cGUmJnQub3BlcmF0b3I9PT10LnJpZ2h0Lm9wZXJhdG9yfXZhciBXdD1mdW5jdGlvbih0LGUpe2lmKFwidHlwZXNjcmlwdFwiIT09ZS5wYXJzZXImJlwiZmxvd1wiIT09ZS5wYXJzZXIpe2NvbnN0IGU9bmV3IFNldDt6dCh0LHQ9Pnt0LmxlYWRpbmdDb21tZW50cyYmdC5sZWFkaW5nQ29tbWVudHMuc29tZShWdCkmJmUuYWRkKHQuc3RhcnQpfSksenQodCx0PT57aWYoXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiPT09dC50eXBlJiYhZS5oYXModC5zdGFydCkpe2NvbnN0e2V4cHJlc3Npb246ZX09dDtyZXR1cm4gZS5leHRyYXx8KGUuZXh0cmE9e30pLGUuZXh0cmEucGFyZW50aGVzaXplZD0hMCxlLmV4dHJhLnBhcmVuU3RhcnQ9dC5zdGFydCxlfX0pfXJldHVybiB6dCh0LHQ9Pntzd2l0Y2godC50eXBlKXtjYXNlXCJMb2dpY2FsRXhwcmVzc2lvblwiOmlmKEh0KHQpKXJldHVybiBmdW5jdGlvbiB0KGUpe2lmKCFIdChlKSlyZXR1cm4gZTtyZXR1cm4gdChPYmplY3QuYXNzaWduKHt0eXBlOlwiTG9naWNhbEV4cHJlc3Npb25cIixvcGVyYXRvcjplLm9wZXJhdG9yLGxlZnQ6dChPYmplY3QuYXNzaWduKHt0eXBlOlwiTG9naWNhbEV4cHJlc3Npb25cIixvcGVyYXRvcjplLm9wZXJhdG9yLGxlZnQ6ZS5sZWZ0LHJpZ2h0OmUucmlnaHQubGVmdH0sVXQoZS5sZWZ0LGUucmlnaHQubGVmdCkpKSxyaWdodDplLnJpZ2h0LnJpZ2h0fSxVdChlKSkpfSh0KTticmVhaztjYXNlXCJWYXJpYWJsZURlY2xhcmF0aW9uXCI6e2NvbnN0IHM9X3QodC5kZWNsYXJhdGlvbnMpO3MmJnMuaW5pdCYmZnVuY3Rpb24odCxzKXtpZihcIjtcIj09PWUub3JpZ2luYWxUZXh0W3F0KHMpXSlyZXR1cm47QXJyYXkuaXNBcnJheSh0LnJhbmdlKT90LnJhbmdlPVt0LnJhbmdlWzBdLHMucmFuZ2VbMV1dOnQuZW5kPXMuZW5kO3QubG9jPU9iamVjdC5hc3NpZ24oe30sdC5sb2Mse2VuZDp0LmxvYy5lbmR9KX0odCxzKTticmVha31jYXNlXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCI6cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sdC50eXBlQW5ub3RhdGlvbix7fSxVdCh0KSk7Y2FzZVwiVFNVbmlvblR5cGVcIjpjYXNlXCJUU0ludGVyc2VjdGlvblR5cGVcIjppZigxPT09dC50eXBlcy5sZW5ndGgpcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sdC50eXBlc1swXSx7fSxVdCh0KSk7YnJlYWs7Y2FzZVwiVFNUeXBlUGFyYW1ldGVyXCI6XCJzdHJpbmdcIj09dHlwZW9mIHQubmFtZSYmKHQubmFtZT1PYmplY3QuYXNzaWduKHt0eXBlOlwiSWRlbnRpZmllclwiLG5hbWU6dC5uYW1lfSxVdCh0LHQubmFtZS5sZW5ndGgpKSk7YnJlYWs7Y2FzZVwiU2VxdWVuY2VFeHByZXNzaW9uXCI6dC5lbmQmJnQuZW5kPl90KHQuZXhwcmVzc2lvbnMpLmVuZCYmKHQuZW5kPV90KHQuZXhwcmVzc2lvbnMpLmVuZCk7YnJlYWs7Y2FzZVwiQ2xhc3NQcm9wZXJ0eVwiOnQua2V5JiZcIlRTUHJpdmF0ZUlkZW50aWZpZXJcIj09PXQua2V5LnR5cGUmJlwiP1wiPT09anQoZS5vcmlnaW5hbFRleHQsdC5rZXkscXQpJiYodC5vcHRpb25hbD0hMCl9fSksdH0sS3Q9aSgoZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtjbGFzcyBze2NvbnN0cnVjdG9yKHQsZT17fSl7dGhpcy5sYWJlbD10LHRoaXMua2V5d29yZD1lLmtleXdvcmQsdGhpcy5iZWZvcmVFeHByPSEhZS5iZWZvcmVFeHByLHRoaXMuc3RhcnRzRXhwcj0hIWUuc3RhcnRzRXhwcix0aGlzLnJpZ2h0QXNzb2NpYXRpdmU9ISFlLnJpZ2h0QXNzb2NpYXRpdmUsdGhpcy5pc0xvb3A9ISFlLmlzTG9vcCx0aGlzLmlzQXNzaWduPSEhZS5pc0Fzc2lnbix0aGlzLnByZWZpeD0hIWUucHJlZml4LHRoaXMucG9zdGZpeD0hIWUucG9zdGZpeCx0aGlzLmJpbm9wPW51bGwhPWUuYmlub3A/ZS5iaW5vcDpudWxsLHRoaXMudXBkYXRlQ29udGV4dD1udWxsfX1jb25zdCBpPW5ldyBNYXA7ZnVuY3Rpb24gcih0LGU9e30pe2Uua2V5d29yZD10O2NvbnN0IHI9bmV3IHModCxlKTtyZXR1cm4gaS5zZXQodCxyKSxyfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gbmV3IHModCx7YmVmb3JlRXhwcjohMCxiaW5vcDplfSl9Y29uc3Qgbj17bnVtOm5ldyBzKFwibnVtXCIse3N0YXJ0c0V4cHI6ITB9KSxiaWdpbnQ6bmV3IHMoXCJiaWdpbnRcIix7c3RhcnRzRXhwcjohMH0pLHJlZ2V4cDpuZXcgcyhcInJlZ2V4cFwiLHtzdGFydHNFeHByOiEwfSksc3RyaW5nOm5ldyBzKFwic3RyaW5nXCIse3N0YXJ0c0V4cHI6ITB9KSxuYW1lOm5ldyBzKFwibmFtZVwiLHtzdGFydHNFeHByOiEwfSksZW9mOm5ldyBzKFwiZW9mXCIpLGJyYWNrZXRMOm5ldyBzKFwiW1wiLHtiZWZvcmVFeHByOiEwLHN0YXJ0c0V4cHI6ITB9KSxicmFja2V0SGFzaEw6bmV3IHMoXCIjW1wiLHtiZWZvcmVFeHByOiEwLHN0YXJ0c0V4cHI6ITB9KSxicmFja2V0QmFyTDpuZXcgcyhcIlt8XCIse2JlZm9yZUV4cHI6ITAsc3RhcnRzRXhwcjohMH0pLGJyYWNrZXRSOm5ldyBzKFwiXVwiKSxicmFja2V0QmFyUjpuZXcgcyhcInxdXCIpLGJyYWNlTDpuZXcgcyhcIntcIix7YmVmb3JlRXhwcjohMCxzdGFydHNFeHByOiEwfSksYnJhY2VCYXJMOm5ldyBzKFwie3xcIix7YmVmb3JlRXhwcjohMCxzdGFydHNFeHByOiEwfSksYnJhY2VIYXNoTDpuZXcgcyhcIiN7XCIse2JlZm9yZUV4cHI6ITAsc3RhcnRzRXhwcjohMH0pLGJyYWNlUjpuZXcgcyhcIn1cIiksYnJhY2VCYXJSOm5ldyBzKFwifH1cIikscGFyZW5MOm5ldyBzKFwiKFwiLHtiZWZvcmVFeHByOiEwLHN0YXJ0c0V4cHI6ITB9KSxwYXJlblI6bmV3IHMoXCIpXCIpLGNvbW1hOm5ldyBzKFwiLFwiLHtiZWZvcmVFeHByOiEwfSksc2VtaTpuZXcgcyhcIjtcIix7YmVmb3JlRXhwcjohMH0pLGNvbG9uOm5ldyBzKFwiOlwiLHtiZWZvcmVFeHByOiEwfSksZG91YmxlQ29sb246bmV3IHMoXCI6OlwiLHtiZWZvcmVFeHByOiEwfSksZG90Om5ldyBzKFwiLlwiKSxxdWVzdGlvbjpuZXcgcyhcIj9cIix7YmVmb3JlRXhwcjohMH0pLHF1ZXN0aW9uRG90Om5ldyBzKFwiPy5cIiksYXJyb3c6bmV3IHMoXCI9PlwiLHtiZWZvcmVFeHByOiEwfSksdGVtcGxhdGU6bmV3IHMoXCJ0ZW1wbGF0ZVwiKSxlbGxpcHNpczpuZXcgcyhcIi4uLlwiLHtiZWZvcmVFeHByOiEwfSksYmFja1F1b3RlOm5ldyBzKFwiYFwiLHtzdGFydHNFeHByOiEwfSksZG9sbGFyQnJhY2VMOm5ldyBzKFwiJHtcIix7YmVmb3JlRXhwcjohMCxzdGFydHNFeHByOiEwfSksYXQ6bmV3IHMoXCJAXCIpLGhhc2g6bmV3IHMoXCIjXCIse3N0YXJ0c0V4cHI6ITB9KSxpbnRlcnByZXRlckRpcmVjdGl2ZTpuZXcgcyhcIiMhLi4uXCIpLGVxOm5ldyBzKFwiPVwiLHtiZWZvcmVFeHByOiEwLGlzQXNzaWduOiEwfSksYXNzaWduOm5ldyBzKFwiXz1cIix7YmVmb3JlRXhwcjohMCxpc0Fzc2lnbjohMH0pLGluY0RlYzpuZXcgcyhcIisrLy0tXCIse3ByZWZpeDohMCxwb3N0Zml4OiEwLHN0YXJ0c0V4cHI6ITB9KSxiYW5nOm5ldyBzKFwiIVwiLHtiZWZvcmVFeHByOiEwLHByZWZpeDohMCxzdGFydHNFeHByOiEwfSksdGlsZGU6bmV3IHMoXCJ+XCIse2JlZm9yZUV4cHI6ITAscHJlZml4OiEwLHN0YXJ0c0V4cHI6ITB9KSxwaXBlbGluZTphKFwifD5cIiwwKSxudWxsaXNoQ29hbGVzY2luZzphKFwiPz9cIiwxKSxsb2dpY2FsT1I6YShcInx8XCIsMSksbG9naWNhbEFORDphKFwiJiZcIiwyKSxiaXR3aXNlT1I6YShcInxcIiwzKSxiaXR3aXNlWE9SOmEoXCJeXCIsNCksYml0d2lzZUFORDphKFwiJlwiLDUpLGVxdWFsaXR5OmEoXCI9PS8hPS89PT0vIT09XCIsNikscmVsYXRpb25hbDphKFwiPC8+Lzw9Lz49XCIsNyksYml0U2hpZnQ6YShcIjw8Lz4+Lz4+PlwiLDgpLHBsdXNNaW46bmV3IHMoXCIrLy1cIix7YmVmb3JlRXhwcjohMCxiaW5vcDo5LHByZWZpeDohMCxzdGFydHNFeHByOiEwfSksbW9kdWxvOm5ldyBzKFwiJVwiLHtiZWZvcmVFeHByOiEwLGJpbm9wOjEwLHN0YXJ0c0V4cHI6ITB9KSxzdGFyOmEoXCIqXCIsMTApLHNsYXNoOmEoXCIvXCIsMTApLGV4cG9uZW50Om5ldyBzKFwiKipcIix7YmVmb3JlRXhwcjohMCxiaW5vcDoxMSxyaWdodEFzc29jaWF0aXZlOiEwfSksX2JyZWFrOnIoXCJicmVha1wiKSxfY2FzZTpyKFwiY2FzZVwiLHtiZWZvcmVFeHByOiEwfSksX2NhdGNoOnIoXCJjYXRjaFwiKSxfY29udGludWU6cihcImNvbnRpbnVlXCIpLF9kZWJ1Z2dlcjpyKFwiZGVidWdnZXJcIiksX2RlZmF1bHQ6cihcImRlZmF1bHRcIix7YmVmb3JlRXhwcjohMH0pLF9kbzpyKFwiZG9cIix7aXNMb29wOiEwLGJlZm9yZUV4cHI6ITB9KSxfZWxzZTpyKFwiZWxzZVwiLHtiZWZvcmVFeHByOiEwfSksX2ZpbmFsbHk6cihcImZpbmFsbHlcIiksX2ZvcjpyKFwiZm9yXCIse2lzTG9vcDohMH0pLF9mdW5jdGlvbjpyKFwiZnVuY3Rpb25cIix7c3RhcnRzRXhwcjohMH0pLF9pZjpyKFwiaWZcIiksX3JldHVybjpyKFwicmV0dXJuXCIse2JlZm9yZUV4cHI6ITB9KSxfc3dpdGNoOnIoXCJzd2l0Y2hcIiksX3Rocm93OnIoXCJ0aHJvd1wiLHtiZWZvcmVFeHByOiEwLHByZWZpeDohMCxzdGFydHNFeHByOiEwfSksX3RyeTpyKFwidHJ5XCIpLF92YXI6cihcInZhclwiKSxfY29uc3Q6cihcImNvbnN0XCIpLF93aGlsZTpyKFwid2hpbGVcIix7aXNMb29wOiEwfSksX3dpdGg6cihcIndpdGhcIiksX25ldzpyKFwibmV3XCIse2JlZm9yZUV4cHI6ITAsc3RhcnRzRXhwcjohMH0pLF90aGlzOnIoXCJ0aGlzXCIse3N0YXJ0c0V4cHI6ITB9KSxfc3VwZXI6cihcInN1cGVyXCIse3N0YXJ0c0V4cHI6ITB9KSxfY2xhc3M6cihcImNsYXNzXCIse3N0YXJ0c0V4cHI6ITB9KSxfZXh0ZW5kczpyKFwiZXh0ZW5kc1wiLHtiZWZvcmVFeHByOiEwfSksX2V4cG9ydDpyKFwiZXhwb3J0XCIpLF9pbXBvcnQ6cihcImltcG9ydFwiLHtzdGFydHNFeHByOiEwfSksX251bGw6cihcIm51bGxcIix7c3RhcnRzRXhwcjohMH0pLF90cnVlOnIoXCJ0cnVlXCIse3N0YXJ0c0V4cHI6ITB9KSxfZmFsc2U6cihcImZhbHNlXCIse3N0YXJ0c0V4cHI6ITB9KSxfaW46cihcImluXCIse2JlZm9yZUV4cHI6ITAsYmlub3A6N30pLF9pbnN0YW5jZW9mOnIoXCJpbnN0YW5jZW9mXCIse2JlZm9yZUV4cHI6ITAsYmlub3A6N30pLF90eXBlb2Y6cihcInR5cGVvZlwiLHtiZWZvcmVFeHByOiEwLHByZWZpeDohMCxzdGFydHNFeHByOiEwfSksX3ZvaWQ6cihcInZvaWRcIix7YmVmb3JlRXhwcjohMCxwcmVmaXg6ITAsc3RhcnRzRXhwcjohMH0pLF9kZWxldGU6cihcImRlbGV0ZVwiLHtiZWZvcmVFeHByOiEwLHByZWZpeDohMCxzdGFydHNFeHByOiEwfSl9LG89L1xcclxcbj98W1xcblxcdTIwMjhcXHUyMDI5XS8saD1uZXcgUmVnRXhwKG8uc291cmNlLFwiZ1wiKTtmdW5jdGlvbiBwKHQpe3N3aXRjaCh0KXtjYXNlIDEwOmNhc2UgMTM6Y2FzZSA4MjMyOmNhc2UgODIzMzpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1jb25zdCBjPS8oPzpcXHN8XFwvXFwvLip8XFwvXFwqW15dKj9cXCpcXC8pKi9nO2Z1bmN0aW9uIHUodCl7c3dpdGNoKHQpe2Nhc2UgOTpjYXNlIDExOmNhc2UgMTI6Y2FzZSAzMjpjYXNlIDE2MDpjYXNlIDU3NjA6Y2FzZSA4MTkyOmNhc2UgODE5MzpjYXNlIDgxOTQ6Y2FzZSA4MTk1OmNhc2UgODE5NjpjYXNlIDgxOTc6Y2FzZSA4MTk4OmNhc2UgODE5OTpjYXNlIDgyMDA6Y2FzZSA4MjAxOmNhc2UgODIwMjpjYXNlIDgyMzk6Y2FzZSA4Mjg3OmNhc2UgMTIyODg6Y2FzZSA2NTI3OTpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1jbGFzcyBse2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5saW5lPXQsdGhpcy5jb2x1bW49ZX19Y2xhc3MgZHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc3RhcnQ9dCx0aGlzLmVuZD1lfX1mdW5jdGlvbiBtKHQpe3JldHVybiB0W3QubGVuZ3RoLTFdfWNvbnN0IGY9T2JqZWN0LmZyZWV6ZSh7QXJndW1lbnRzRGlzYWxsb3dlZEluSW5pdGlhbGl6ZXI6XCInYXJndW1lbnRzJyBpcyBub3QgYWxsb3dlZCBpbiBjbGFzcyBmaWVsZCBpbml0aWFsaXplclwiLEFzeW5jRnVuY3Rpb25JblNpbmdsZVN0YXRlbWVudENvbnRleHQ6XCJBc3luYyBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZGVjbGFyZWQgYXQgdGhlIHRvcCBsZXZlbCBvciBpbnNpZGUgYSBibG9ja1wiLEF3YWl0QmluZGluZ0lkZW50aWZpZXI6XCJDYW4gbm90IHVzZSAnYXdhaXQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGFuIGFzeW5jIGZ1bmN0aW9uXCIsQXdhaXRFeHByZXNzaW9uRm9ybWFsUGFyYW1ldGVyOlwiYXdhaXQgaXMgbm90IGFsbG93ZWQgaW4gYXN5bmMgZnVuY3Rpb24gcGFyYW1ldGVyc1wiLEF3YWl0Tm90SW5Bc3luY0Z1bmN0aW9uOlwiQ2FuIG5vdCB1c2Uga2V5d29yZCAnYXdhaXQnIG91dHNpZGUgYW4gYXN5bmMgZnVuY3Rpb25cIixCYWRHZXR0ZXJBcml0eTpcImdldHRlciBtdXN0IG5vdCBoYXZlIGFueSBmb3JtYWwgcGFyYW1ldGVyc1wiLEJhZFNldHRlckFyaXR5Olwic2V0dGVyIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBmb3JtYWwgcGFyYW1ldGVyXCIsQmFkU2V0dGVyUmVzdFBhcmFtZXRlcjpcInNldHRlciBmdW5jdGlvbiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIHJlc3QgcGFyYW1ldGVyXCIsQ29uc3RydWN0b3JDbGFzc0ZpZWxkOlwiQ2xhc3NlcyBtYXkgbm90IGhhdmUgYSBmaWVsZCBuYW1lZCAnY29uc3RydWN0b3InXCIsQ29uc3RydWN0b3JDbGFzc1ByaXZhdGVGaWVsZDpcIkNsYXNzZXMgbWF5IG5vdCBoYXZlIGEgcHJpdmF0ZSBmaWVsZCBuYW1lZCAnI2NvbnN0cnVjdG9yJ1wiLENvbnN0cnVjdG9ySXNBY2Nlc3NvcjpcIkNsYXNzIGNvbnN0cnVjdG9yIG1heSBub3QgYmUgYW4gYWNjZXNzb3JcIixDb25zdHJ1Y3RvcklzQXN5bmM6XCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhc3luYyBmdW5jdGlvblwiLENvbnN0cnVjdG9ySXNHZW5lcmF0b3I6XCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhIGdlbmVyYXRvclwiLERlY2xhcmF0aW9uTWlzc2luZ0luaXRpYWxpemVyOlwiJTAgcmVxdWlyZSBhbiBpbml0aWFsaXphdGlvbiB2YWx1ZVwiLERlY29yYXRvckJlZm9yZUV4cG9ydDpcIkRlY29yYXRvcnMgbXVzdCBiZSBwbGFjZWQgKmJlZm9yZSogdGhlICdleHBvcnQnIGtleXdvcmQuIFlvdSBjYW4gc2V0IHRoZSAnZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCcgb3B0aW9uIHRvIGZhbHNlIHRvIHVzZSB0aGUgJ2V4cG9ydCBAZGVjb3JhdG9yIGNsYXNzIHt9JyBzeW50YXhcIixEZWNvcmF0b3JDb25zdHJ1Y3RvcjpcIkRlY29yYXRvcnMgY2FuJ3QgYmUgdXNlZCB3aXRoIGEgY29uc3RydWN0b3IuIERpZCB5b3UgbWVhbiAnQGRlYyBjbGFzcyB7IC4uLiB9Jz9cIixEZWNvcmF0b3JFeHBvcnRDbGFzczpcIlVzaW5nIHRoZSBleHBvcnQga2V5d29yZCBiZXR3ZWVuIGEgZGVjb3JhdG9yIGFuZCBhIGNsYXNzIGlzIG5vdCBhbGxvd2VkLiBQbGVhc2UgdXNlIGBleHBvcnQgQGRlYyBjbGFzc2AgaW5zdGVhZC5cIixEZWNvcmF0b3JTZW1pY29sb246XCJEZWNvcmF0b3JzIG11c3Qgbm90IGJlIGZvbGxvd2VkIGJ5IGEgc2VtaWNvbG9uXCIsRGVsZXRlUHJpdmF0ZUZpZWxkOlwiRGVsZXRpbmcgYSBwcml2YXRlIGZpZWxkIGlzIG5vdCBhbGxvd2VkXCIsRGVzdHJ1Y3R1cmVOYW1lZEltcG9ydDpcIkVTMjAxNSBuYW1lZCBpbXBvcnRzIGRvIG5vdCBkZXN0cnVjdHVyZS4gVXNlIGFub3RoZXIgc3RhdGVtZW50IGZvciBkZXN0cnVjdHVyaW5nIGFmdGVyIHRoZSBpbXBvcnQuXCIsRHVwbGljYXRlQ29uc3RydWN0b3I6XCJEdXBsaWNhdGUgY29uc3RydWN0b3IgaW4gdGhlIHNhbWUgY2xhc3NcIixEdXBsaWNhdGVEZWZhdWx0RXhwb3J0OlwiT25seSBvbmUgZGVmYXVsdCBleHBvcnQgYWxsb3dlZCBwZXIgbW9kdWxlLlwiLER1cGxpY2F0ZUV4cG9ydDpcImAlMGAgaGFzIGFscmVhZHkgYmVlbiBleHBvcnRlZC4gRXhwb3J0ZWQgaWRlbnRpZmllcnMgbXVzdCBiZSB1bmlxdWUuXCIsRHVwbGljYXRlUHJvdG86XCJSZWRlZmluaXRpb24gb2YgX19wcm90b19fIHByb3BlcnR5XCIsRHVwbGljYXRlUmVnRXhwRmxhZ3M6XCJEdXBsaWNhdGUgcmVndWxhciBleHByZXNzaW9uIGZsYWdcIixFbGVtZW50QWZ0ZXJSZXN0OlwiUmVzdCBlbGVtZW50IG11c3QgYmUgbGFzdCBlbGVtZW50XCIsRXNjYXBlZENoYXJOb3RBbklkZW50aWZpZXI6XCJJbnZhbGlkIFVuaWNvZGUgZXNjYXBlXCIsRm9ySW5PZkxvb3BJbml0aWFsaXplcjpcIiUwIGxvb3AgdmFyaWFibGUgZGVjbGFyYXRpb24gbWF5IG5vdCBoYXZlIGFuIGluaXRpYWxpemVyXCIsR2VuZXJhdG9ySW5TaW5nbGVTdGF0ZW1lbnRDb250ZXh0OlwiR2VuZXJhdG9ycyBjYW4gb25seSBiZSBkZWNsYXJlZCBhdCB0aGUgdG9wIGxldmVsIG9yIGluc2lkZSBhIGJsb2NrXCIsSWxsZWdhbEJyZWFrQ29udGludWU6XCJVbnN5bnRhY3RpYyAlMFwiLElsbGVnYWxMYW5ndWFnZU1vZGVEaXJlY3RpdmU6XCJJbGxlZ2FsICd1c2Ugc3RyaWN0JyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0XCIsSWxsZWdhbFJldHVybjpcIidyZXR1cm4nIG91dHNpZGUgb2YgZnVuY3Rpb25cIixJbXBvcnRDYWxsQXJndW1lbnRUcmFpbGluZ0NvbW1hOlwiVHJhaWxpbmcgY29tbWEgaXMgZGlzYWxsb3dlZCBpbnNpZGUgaW1wb3J0KC4uLikgYXJndW1lbnRzXCIsSW1wb3J0Q2FsbEFyaXR5OlwiaW1wb3J0KCkgcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnRcIixJbXBvcnRDYWxsQXJpdHlMdE9uZTpcIkR5bmFtaWMgaW1wb3J0cyByZXF1aXJlIGEgcGFyYW1ldGVyOiBpbXBvcnQoJ2EuanMnKVwiLEltcG9ydENhbGxOb3ROZXdFeHByZXNzaW9uOlwiQ2Fubm90IHVzZSBuZXcgd2l0aCBpbXBvcnQoLi4uKVwiLEltcG9ydENhbGxTcHJlYWRBcmd1bWVudDpcIi4uLiBpcyBub3QgYWxsb3dlZCBpbiBpbXBvcnQoKVwiLEltcG9ydE1ldGFPdXRzaWRlTW9kdWxlOlwiaW1wb3J0Lm1ldGEgbWF5IGFwcGVhciBvbmx5IHdpdGggJ3NvdXJjZVR5cGU6IFxcXCJtb2R1bGVcXFwiJ1wiLEltcG9ydE91dHNpZGVNb2R1bGU6XCInaW1wb3J0JyBhbmQgJ2V4cG9ydCcgbWF5IGFwcGVhciBvbmx5IHdpdGggJ3NvdXJjZVR5cGU6IFxcXCJtb2R1bGVcXFwiJ1wiLEludmFsaWRDb2RlUG9pbnQ6XCJDb2RlIHBvaW50IG91dCBvZiBib3VuZHNcIixJbnZhbGlkRGlnaXQ6XCJFeHBlY3RlZCBudW1iZXIgaW4gcmFkaXggJTBcIixJbnZhbGlkRXNjYXBlU2VxdWVuY2U6XCJCYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZVwiLEludmFsaWRFc2NhcGVTZXF1ZW5jZVRlbXBsYXRlOlwiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgaW4gdGVtcGxhdGVcIixJbnZhbGlkRXNjYXBlZFJlc2VydmVkV29yZDpcIkVzY2FwZSBzZXF1ZW5jZSBpbiBrZXl3b3JkICUwXCIsSW52YWxpZElkZW50aWZpZXI6XCJJbnZhbGlkIGlkZW50aWZpZXIgJTBcIixJbnZhbGlkTGhzOlwiSW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiAlMFwiLEludmFsaWRMaHNCaW5kaW5nOlwiQmluZGluZyBpbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluICUwXCIsSW52YWxpZE51bWJlcjpcIkludmFsaWQgbnVtYmVyXCIsSW52YWxpZE9yVW5leHBlY3RlZFRva2VuOlwiVW5leHBlY3RlZCBjaGFyYWN0ZXIgJyUwJ1wiLEludmFsaWRQYXJlbnRoZXNpemVkQXNzaWdubWVudDpcIkludmFsaWQgcGFyZW50aGVzaXplZCBhc3NpZ25tZW50IHBhdHRlcm5cIixJbnZhbGlkUHJpdmF0ZUZpZWxkUmVzb2x1dGlvbjpcIlByaXZhdGUgbmFtZSAjJTAgaXMgbm90IGRlZmluZWRcIixJbnZhbGlkUHJvcGVydHlCaW5kaW5nUGF0dGVybjpcIkJpbmRpbmcgbWVtYmVyIGV4cHJlc3Npb25cIixJbnZhbGlkUmVzdEFzc2lnbm1lbnRQYXR0ZXJuOlwiSW52YWxpZCByZXN0IG9wZXJhdG9yJ3MgYXJndW1lbnRcIixMYWJlbFJlZGVjbGFyYXRpb246XCJMYWJlbCAnJTAnIGlzIGFscmVhZHkgZGVjbGFyZWRcIixMZXRJbkxleGljYWxCaW5kaW5nOlwiJ2xldCcgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCBhcyBhIG5hbWUgaW4gJ2xldCcgb3IgJ2NvbnN0JyBkZWNsYXJhdGlvbnMuXCIsTWFsZm9ybWVkUmVnRXhwRmxhZ3M6XCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFnXCIsTWlzc2luZ0NsYXNzTmFtZTpcIkEgY2xhc3MgbmFtZSBpcyByZXF1aXJlZFwiLE1pc3NpbmdFcUluQXNzaWdubWVudDpcIk9ubHkgJz0nIG9wZXJhdG9yIGNhbiBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIGRlZmF1bHQgdmFsdWUuXCIsTWlzc2luZ1VuaWNvZGVFc2NhcGU6XCJFeHBlY3RpbmcgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UgXFxcXHVYWFhYXCIsTWl4aW5nQ29hbGVzY2VXaXRoTG9naWNhbDpcIk51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvcig/PykgcmVxdWlyZXMgcGFyZW5zIHdoZW4gbWl4aW5nIHdpdGggbG9naWNhbCBvcGVyYXRvcnNcIixNb2R1bGVFeHBvcnRVbmRlZmluZWQ6XCJFeHBvcnQgJyUwJyBpcyBub3QgZGVmaW5lZFwiLE11bHRpcGxlRGVmYXVsdHNJblN3aXRjaDpcIk11bHRpcGxlIGRlZmF1bHQgY2xhdXNlc1wiLE5ld2xpbmVBZnRlclRocm93OlwiSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93XCIsTm9DYXRjaE9yRmluYWxseTpcIk1pc3NpbmcgY2F0Y2ggb3IgZmluYWxseSBjbGF1c2VcIixOdW1iZXJJZGVudGlmaWVyOlwiSWRlbnRpZmllciBkaXJlY3RseSBhZnRlciBudW1iZXJcIixOdW1lcmljU2VwYXJhdG9ySW5Fc2NhcGVTZXF1ZW5jZTpcIk51bWVyaWMgc2VwYXJhdG9ycyBhcmUgbm90IGFsbG93ZWQgaW5zaWRlIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBvciBoZXggZXNjYXBlIHNlcXVlbmNlc1wiLE9ic29sZXRlQXdhaXRTdGFyOlwiYXdhaXQqIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYXN5bmMgZnVuY3Rpb25zIHByb3Bvc2FsLiBVc2UgUHJvbWlzZS5hbGwoKSBpbnN0ZWFkLlwiLE9wdGlvbmFsQ2hhaW5pbmdOb05ldzpcImNvbnN0cnVjdG9ycyBpbi9hZnRlciBhbiBPcHRpb25hbCBDaGFpbiBhcmUgbm90IGFsbG93ZWRcIixPcHRpb25hbENoYWluaW5nTm9UZW1wbGF0ZTpcIlRhZ2dlZCBUZW1wbGF0ZSBMaXRlcmFscyBhcmUgbm90IGFsbG93ZWQgaW4gb3B0aW9uYWxDaGFpblwiLFBhcmFtRHVwZTpcIkFyZ3VtZW50IG5hbWUgY2xhc2hcIixQYXR0ZXJuSGFzQWNjZXNzb3I6XCJPYmplY3QgcGF0dGVybiBjYW4ndCBjb250YWluIGdldHRlciBvciBzZXR0ZXJcIixQYXR0ZXJuSGFzTWV0aG9kOlwiT2JqZWN0IHBhdHRlcm4gY2FuJ3QgY29udGFpbiBtZXRob2RzXCIsUGlwZWxpbmVCb2R5Tm9BcnJvdzonVW5leHBlY3RlZCBhcnJvdyBcIj0+XCIgYWZ0ZXIgcGlwZWxpbmUgYm9keTsgYXJyb3cgZnVuY3Rpb24gaW4gcGlwZWxpbmUgYm9keSBtdXN0IGJlIHBhcmVudGhlc2l6ZWQnLFBpcGVsaW5lQm9keVNlcXVlbmNlRXhwcmVzc2lvbjpcIlBpcGVsaW5lIGJvZHkgbWF5IG5vdCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBleHByZXNzaW9uXCIsUGlwZWxpbmVIZWFkU2VxdWVuY2VFeHByZXNzaW9uOlwiUGlwZWxpbmUgaGVhZCBzaG91bGQgbm90IGJlIGEgY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIGV4cHJlc3Npb25cIixQaXBlbGluZVRvcGljVW51c2VkOlwiUGlwZWxpbmUgaXMgaW4gdG9waWMgc3R5bGUgYnV0IGRvZXMgbm90IHVzZSB0b3BpYyByZWZlcmVuY2VcIixQcmltYXJ5VG9waWNOb3RBbGxvd2VkOlwiVG9waWMgcmVmZXJlbmNlIHdhcyB1c2VkIGluIGEgbGV4aWNhbCBjb250ZXh0IHdpdGhvdXQgdG9waWMgYmluZGluZ1wiLFByaW1hcnlUb3BpY1JlcXVpcmVzU21hcnRQaXBlbGluZTpcIlByaW1hcnkgVG9waWMgUmVmZXJlbmNlIGZvdW5kIGJ1dCBwaXBlbGluZU9wZXJhdG9yIG5vdCBwYXNzZWQgJ3NtYXJ0JyBmb3IgJ3Byb3Bvc2FsJyBvcHRpb24uXCIsUHJpdmF0ZU5hbWVSZWRlY2xhcmF0aW9uOlwiRHVwbGljYXRlIHByaXZhdGUgbmFtZSAjJTBcIixSZWNvcmRFeHByZXNzaW9uQmFySW5jb3JyZWN0RW5kU3ludGF4VHlwZTpcIlJlY29yZCBleHByZXNzaW9ucyBlbmRpbmcgd2l0aCAnfH0nIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiB0aGUgJ3N5bnRheFR5cGUnIG9wdGlvbiBvZiB0aGUgJ3JlY29yZEFuZFR1cGxlJyBwbHVnaW4gaXMgc2V0IHRvICdiYXInXCIsUmVjb3JkRXhwcmVzc2lvbkJhckluY29ycmVjdFN0YXJ0U3ludGF4VHlwZTpcIlJlY29yZCBleHByZXNzaW9ucyBzdGFydGluZyB3aXRoICd7fCcgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSAnc3ludGF4VHlwZScgb3B0aW9uIG9mIHRoZSAncmVjb3JkQW5kVHVwbGUnIHBsdWdpbiBpcyBzZXQgdG8gJ2JhcidcIixSZWNvcmRFeHByZXNzaW9uSGFzaEluY29ycmVjdFN0YXJ0U3ludGF4VHlwZTpcIlJlY29yZCBleHByZXNzaW9ucyBzdGFydGluZyB3aXRoICcjeycgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSAnc3ludGF4VHlwZScgb3B0aW9uIG9mIHRoZSAncmVjb3JkQW5kVHVwbGUnIHBsdWdpbiBpcyBzZXQgdG8gJ2hhc2gnXCIsUmVzdFRyYWlsaW5nQ29tbWE6XCJVbmV4cGVjdGVkIHRyYWlsaW5nIGNvbW1hIGFmdGVyIHJlc3QgZWxlbWVudFwiLFNsb3BweUZ1bmN0aW9uOlwiSW4gbm9uLXN0cmljdCBtb2RlIGNvZGUsIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBkZWNsYXJlZCBhdCB0b3AgbGV2ZWwsIGluc2lkZSBhIGJsb2NrLCBvciBhcyB0aGUgYm9keSBvZiBhbiBpZiBzdGF0ZW1lbnRcIixTdGF0aWNQcm90b3R5cGU6XCJDbGFzc2VzIG1heSBub3QgaGF2ZSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgcHJvdG90eXBlXCIsU3RyaWN0RGVsZXRlOlwiRGVsZXRpbmcgbG9jYWwgdmFyaWFibGUgaW4gc3RyaWN0IG1vZGVcIixTdHJpY3RFdmFsQXJndW1lbnRzOlwiQXNzaWduaW5nIHRvICclMCcgaW4gc3RyaWN0IG1vZGVcIixTdHJpY3RFdmFsQXJndW1lbnRzQmluZGluZzpcIkJpbmRpbmcgJyUwJyBpbiBzdHJpY3QgbW9kZVwiLFN0cmljdEZ1bmN0aW9uOlwiSW4gc3RyaWN0IG1vZGUgY29kZSwgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGF0IHRvcCBsZXZlbCBvciBpbnNpZGUgYSBibG9ja1wiLFN0cmljdE9jdGFsTGl0ZXJhbDpcIkxlZ2FjeSBvY3RhbCBsaXRlcmFscyBhcmUgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGVcIixTdHJpY3RXaXRoOlwiJ3dpdGgnIGluIHN0cmljdCBtb2RlXCIsU3VwZXJOb3RBbGxvd2VkOlwic3VwZXIoKSBpcyBvbmx5IHZhbGlkIGluc2lkZSBhIGNsYXNzIGNvbnN0cnVjdG9yIG9mIGEgc3ViY2xhc3MuIE1heWJlIGEgdHlwbyBpbiB0aGUgbWV0aG9kIG5hbWUgKCdjb25zdHJ1Y3RvcicpIG9yIG5vdCBleHRlbmRpbmcgYW5vdGhlciBjbGFzcz9cIixTdXBlclByaXZhdGVGaWVsZDpcIlByaXZhdGUgZmllbGRzIGNhbid0IGJlIGFjY2Vzc2VkIG9uIHN1cGVyXCIsVHJhaWxpbmdEZWNvcmF0b3I6XCJEZWNvcmF0b3JzIG11c3QgYmUgYXR0YWNoZWQgdG8gYSBjbGFzcyBlbGVtZW50XCIsVHVwbGVFeHByZXNzaW9uQmFySW5jb3JyZWN0RW5kU3ludGF4VHlwZTpcIlR1cGxlIGV4cHJlc3Npb25zIGVuZGluZyB3aXRoICd8XScgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSAnc3ludGF4VHlwZScgb3B0aW9uIG9mIHRoZSAncmVjb3JkQW5kVHVwbGUnIHBsdWdpbiBpcyBzZXQgdG8gJ2JhcidcIixUdXBsZUV4cHJlc3Npb25CYXJJbmNvcnJlY3RTdGFydFN5bnRheFR5cGU6XCJUdXBsZSBleHByZXNzaW9ucyBzdGFydGluZyB3aXRoICdbfCcgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSAnc3ludGF4VHlwZScgb3B0aW9uIG9mIHRoZSAncmVjb3JkQW5kVHVwbGUnIHBsdWdpbiBpcyBzZXQgdG8gJ2JhcidcIixUdXBsZUV4cHJlc3Npb25IYXNoSW5jb3JyZWN0U3RhcnRTeW50YXhUeXBlOlwiVHVwbGUgZXhwcmVzc2lvbnMgc3RhcnRpbmcgd2l0aCAnI1snIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiB0aGUgJ3N5bnRheFR5cGUnIG9wdGlvbiBvZiB0aGUgJ3JlY29yZEFuZFR1cGxlJyBwbHVnaW4gaXMgc2V0IHRvICdoYXNoJ1wiLFVuZXhwZWN0ZWRBcmd1bWVudFBsYWNlaG9sZGVyOlwiVW5leHBlY3RlZCBhcmd1bWVudCBwbGFjZWhvbGRlclwiLFVuZXhwZWN0ZWRBd2FpdEFmdGVyUGlwZWxpbmVCb2R5OidVbmV4cGVjdGVkIFwiYXdhaXRcIiBhZnRlciBwaXBlbGluZSBib2R5OyBhd2FpdCBtdXN0IGhhdmUgcGFyZW50aGVzZXMgaW4gbWluaW1hbCBwcm9wb3NhbCcsVW5leHBlY3RlZERpZ2l0QWZ0ZXJIYXNoOlwiVW5leHBlY3RlZCBkaWdpdCBhZnRlciBoYXNoIHRva2VuXCIsVW5leHBlY3RlZEltcG9ydEV4cG9ydDpcIidpbXBvcnQnIGFuZCAnZXhwb3J0JyBtYXkgb25seSBhcHBlYXIgYXQgdGhlIHRvcCBsZXZlbFwiLFVuZXhwZWN0ZWRLZXl3b3JkOlwiVW5leHBlY3RlZCBrZXl3b3JkICclMCdcIixVbmV4cGVjdGVkTGVhZGluZ0RlY29yYXRvcjpcIkxlYWRpbmcgZGVjb3JhdG9ycyBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgY2xhc3MgZGVjbGFyYXRpb25cIixVbmV4cGVjdGVkTGV4aWNhbERlY2xhcmF0aW9uOlwiTGV4aWNhbCBkZWNsYXJhdGlvbiBjYW5ub3QgYXBwZWFyIGluIGEgc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0XCIsVW5leHBlY3RlZE5ld1RhcmdldDpcIm5ldy50YXJnZXQgY2FuIG9ubHkgYmUgdXNlZCBpbiBmdW5jdGlvbnNcIixVbmV4cGVjdGVkTnVtZXJpY1NlcGFyYXRvcjpcIkEgbnVtZXJpYyBzZXBhcmF0b3IgaXMgb25seSBhbGxvd2VkIGJldHdlZW4gdHdvIGRpZ2l0c1wiLFVuZXhwZWN0ZWRQcml2YXRlRmllbGQ6XCJQcml2YXRlIG5hbWVzIGNhbiBvbmx5IGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgYSBjbGFzcyBlbGVtZW50IChpLmUuIGNsYXNzIEMgeyAjcCA9IDQyOyAjbSgpIHt9IH0gKVxcbiBvciBhIHByb3BlcnR5IG9mIG1lbWJlciBleHByZXNzaW9uIChpLmUuIHRoaXMuI3ApLlwiLFVuZXhwZWN0ZWRSZXNlcnZlZFdvcmQ6XCJVbmV4cGVjdGVkIHJlc2VydmVkIHdvcmQgJyUwJ1wiLFVuZXhwZWN0ZWRTdXBlcjpcInN1cGVyIGlzIG9ubHkgYWxsb3dlZCBpbiBvYmplY3QgbWV0aG9kcyBhbmQgY2xhc3Nlc1wiLFVuZXhwZWN0ZWRUb2tlbjpcIlVuZXhwZWN0ZWQgdG9rZW4gJyUnXCIsVW5leHBlY3RlZFRva2VuVW5hcnlFeHBvbmVudGlhdGlvbjpcIklsbGVnYWwgZXhwcmVzc2lvbi4gV3JhcCBsZWZ0IGhhbmQgc2lkZSBvciBlbnRpcmUgZXhwb25lbnRpYXRpb24gaW4gcGFyZW50aGVzZXMuXCIsVW5zdXBwb3J0ZWRCaW5kOlwiQmluZGluZyBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIG9iamVjdCBwcm9wZXJ0eS5cIixVbnN1cHBvcnRlZERlY29yYXRvckV4cG9ydDpcIkEgZGVjb3JhdGVkIGV4cG9ydCBtdXN0IGV4cG9ydCBhIGNsYXNzIGRlY2xhcmF0aW9uXCIsVW5zdXBwb3J0ZWREZWZhdWx0RXhwb3J0OlwiT25seSBleHByZXNzaW9ucywgZnVuY3Rpb25zIG9yIGNsYXNzZXMgYXJlIGFsbG93ZWQgYXMgdGhlIGBkZWZhdWx0YCBleHBvcnQuXCIsVW5zdXBwb3J0ZWRJbXBvcnQ6XCJpbXBvcnQgY2FuIG9ubHkgYmUgdXNlZCBpbiBpbXBvcnQoKSBvciBpbXBvcnQubWV0YVwiLFVuc3VwcG9ydGVkTWV0YVByb3BlcnR5OlwiVGhlIG9ubHkgdmFsaWQgbWV0YSBwcm9wZXJ0eSBmb3IgJTAgaXMgJTAuJTFcIixVbnN1cHBvcnRlZFBhcmFtZXRlckRlY29yYXRvcjpcIkRlY29yYXRvcnMgY2Fubm90IGJlIHVzZWQgdG8gZGVjb3JhdGUgcGFyYW1ldGVyc1wiLFVuc3VwcG9ydGVkUHJvcGVydHlEZWNvcmF0b3I6XCJEZWNvcmF0b3JzIGNhbm5vdCBiZSB1c2VkIHRvIGRlY29yYXRlIG9iamVjdCBsaXRlcmFsIHByb3BlcnRpZXNcIixVbnN1cHBvcnRlZFN1cGVyOlwic3VwZXIgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGZ1bmN0aW9uIGNhbGxzIChpLmUuIHN1cGVyKCkpIG9yIGluIHByb3BlcnR5IGFjY2Vzc2VzIChpLmUuIHN1cGVyLnByb3Agb3Igc3VwZXJbcHJvcF0pXCIsVW50ZXJtaW5hdGVkQ29tbWVudDpcIlVudGVybWluYXRlZCBjb21tZW50XCIsVW50ZXJtaW5hdGVkUmVnRXhwOlwiVW50ZXJtaW5hdGVkIHJlZ3VsYXIgZXhwcmVzc2lvblwiLFVudGVybWluYXRlZFN0cmluZzpcIlVudGVybWluYXRlZCBzdHJpbmcgY29uc3RhbnRcIixVbnRlcm1pbmF0ZWRUZW1wbGF0ZTpcIlVudGVybWluYXRlZCB0ZW1wbGF0ZVwiLFZhclJlZGVjbGFyYXRpb246XCJJZGVudGlmaWVyICclMCcgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZFwiLFlpZWxkQmluZGluZ0lkZW50aWZpZXI6XCJDYW4gbm90IHVzZSAneWllbGQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGEgZ2VuZXJhdG9yXCIsWWllbGRJblBhcmFtZXRlcjpcInlpZWxkIGlzIG5vdCBhbGxvd2VkIGluIGdlbmVyYXRvciBwYXJhbWV0ZXJzXCIsWmVyb0RpZ2l0TnVtZXJpY1NlcGFyYXRvcjpcIk51bWVyaWMgc2VwYXJhdG9yIGNhbiBub3QgYmUgdXNlZCBhZnRlciBsZWFkaW5nIDBcIn0pO2Z1bmN0aW9uIEQodCl7cmV0dXJuIG51bGwhPXQmJlwiUHJvcGVydHlcIj09PXQudHlwZSYmXCJpbml0XCI9PT10LmtpbmQmJiExPT09dC5tZXRob2R9Y2xhc3MgeXtjb25zdHJ1Y3Rvcih0LGUscyxpKXt0aGlzLnRva2VuPXQsdGhpcy5pc0V4cHI9ISFlLHRoaXMucHJlc2VydmVTcGFjZT0hIXMsdGhpcy5vdmVycmlkZT1pfX1jb25zdCB4PXticmFjZVN0YXRlbWVudDpuZXcgeShcIntcIiwhMSksYnJhY2VFeHByZXNzaW9uOm5ldyB5KFwie1wiLCEwKSx0ZW1wbGF0ZVF1YXNpOm5ldyB5KFwiJHtcIiwhMSkscGFyZW5TdGF0ZW1lbnQ6bmV3IHkoXCIoXCIsITEpLHBhcmVuRXhwcmVzc2lvbjpuZXcgeShcIihcIiwhMCksdGVtcGxhdGU6bmV3IHkoXCJgXCIsITAsITAsdD0+dC5yZWFkVG1wbFRva2VuKCkpLGZ1bmN0aW9uRXhwcmVzc2lvbjpuZXcgeShcImZ1bmN0aW9uXCIsITApLGZ1bmN0aW9uU3RhdGVtZW50Om5ldyB5KFwiZnVuY3Rpb25cIiwhMSl9O24ucGFyZW5SLnVwZGF0ZUNvbnRleHQ9bi5icmFjZVIudXBkYXRlQ29udGV4dD1mdW5jdGlvbigpe2lmKDE9PT10aGlzLnN0YXRlLmNvbnRleHQubGVuZ3RoKXJldHVybiB2b2lkKHRoaXMuc3RhdGUuZXhwckFsbG93ZWQ9ITApO2xldCB0PXRoaXMuc3RhdGUuY29udGV4dC5wb3AoKTt0PT09eC5icmFjZVN0YXRlbWVudCYmXCJmdW5jdGlvblwiPT09dGhpcy5jdXJDb250ZXh0KCkudG9rZW4mJih0PXRoaXMuc3RhdGUuY29udGV4dC5wb3AoKSksdGhpcy5zdGF0ZS5leHByQWxsb3dlZD0hdC5pc0V4cHJ9LG4ubmFtZS51cGRhdGVDb250ZXh0PWZ1bmN0aW9uKHQpe2xldCBlPSExO3QhPT1uLmRvdCYmKFwib2ZcIj09PXRoaXMuc3RhdGUudmFsdWUmJiF0aGlzLnN0YXRlLmV4cHJBbGxvd2VkfHxcInlpZWxkXCI9PT10aGlzLnN0YXRlLnZhbHVlJiZ0aGlzLnByb2RQYXJhbS5oYXNZaWVsZCkmJihlPSEwKSx0aGlzLnN0YXRlLmV4cHJBbGxvd2VkPWUsdGhpcy5zdGF0ZS5pc0l0ZXJhdG9yJiYodGhpcy5zdGF0ZS5pc0l0ZXJhdG9yPSExKX0sbi5icmFjZUwudXBkYXRlQ29udGV4dD1mdW5jdGlvbih0KXt0aGlzLnN0YXRlLmNvbnRleHQucHVzaCh0aGlzLmJyYWNlSXNCbG9jayh0KT94LmJyYWNlU3RhdGVtZW50OnguYnJhY2VFeHByZXNzaW9uKSx0aGlzLnN0YXRlLmV4cHJBbGxvd2VkPSEwfSxuLmRvbGxhckJyYWNlTC51cGRhdGVDb250ZXh0PWZ1bmN0aW9uKCl7dGhpcy5zdGF0ZS5jb250ZXh0LnB1c2goeC50ZW1wbGF0ZVF1YXNpKSx0aGlzLnN0YXRlLmV4cHJBbGxvd2VkPSEwfSxuLnBhcmVuTC51cGRhdGVDb250ZXh0PWZ1bmN0aW9uKHQpe2NvbnN0IGU9dD09PW4uX2lmfHx0PT09bi5fZm9yfHx0PT09bi5fd2l0aHx8dD09PW4uX3doaWxlO3RoaXMuc3RhdGUuY29udGV4dC5wdXNoKGU/eC5wYXJlblN0YXRlbWVudDp4LnBhcmVuRXhwcmVzc2lvbiksdGhpcy5zdGF0ZS5leHByQWxsb3dlZD0hMH0sbi5pbmNEZWMudXBkYXRlQ29udGV4dD1mdW5jdGlvbigpe30sbi5fZnVuY3Rpb24udXBkYXRlQ29udGV4dD1uLl9jbGFzcy51cGRhdGVDb250ZXh0PWZ1bmN0aW9uKHQpeyF0LmJlZm9yZUV4cHJ8fHQ9PT1uLnNlbWl8fHQ9PT1uLl9lbHNlfHx0PT09bi5fcmV0dXJuJiZvLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXRlLmxhc3RUb2tFbmQsdGhpcy5zdGF0ZS5zdGFydCkpfHwodD09PW4uY29sb258fHQ9PT1uLmJyYWNlTCkmJnRoaXMuY3VyQ29udGV4dCgpPT09eC5iX3N0YXQ/dGhpcy5zdGF0ZS5jb250ZXh0LnB1c2goeC5mdW5jdGlvblN0YXRlbWVudCk6dGhpcy5zdGF0ZS5jb250ZXh0LnB1c2goeC5mdW5jdGlvbkV4cHJlc3Npb24pLHRoaXMuc3RhdGUuZXhwckFsbG93ZWQ9ITF9LG4uYmFja1F1b3RlLnVwZGF0ZUNvbnRleHQ9ZnVuY3Rpb24oKXt0aGlzLmN1ckNvbnRleHQoKT09PXgudGVtcGxhdGU/dGhpcy5zdGF0ZS5jb250ZXh0LnBvcCgpOnRoaXMuc3RhdGUuY29udGV4dC5wdXNoKHgudGVtcGxhdGUpLHRoaXMuc3RhdGUuZXhwckFsbG93ZWQ9ITF9O2xldCBnPVwiwqrCtcK6w4Atw5bDmC3DtsO4LcuBy4Yty5HLoC3LpMusy67NsC3NtM22zbfNui3Nvc2/zobOiC3Ois6Mzo4tzqHOoy3Ptc+3LdKB0oot1K/UsS3VltWZ1aAt1ojXkC3XqtevLdey2KAt2YrZrtmv2bEt25Pbldul26bbrtuv27ot27zbv9yQ3JIt3K/djS3epd6x34ot36rftN+137rgoIAt4KCV4KCa4KCk4KCo4KGALeChmOChoC3goargoqAt4KK04KK2LeCjh+CkhC3gpLngpL3gpZDgpZgt4KWh4KWxLeCmgOCmhS3gpozgpo/gppDgppMt4Kao4KaqLeCmsOCmsuCmti3gprngpr3gp47gp5zgp53gp58t4Keh4Kew4Kex4Ke84KiFLeCoiuCoj+CokOCoky3gqKjgqKot4Kiw4Kiy4Kiz4Ki14Ki24Ki44Ki54KmZLeCpnOCpnuCpsi3gqbTgqoUt4KqN4KqPLeCqkeCqky3gqqjgqqot4Kqw4Kqy4Kqz4Kq1LeCqueCqveCrkOCroOCroeCrueCshS3grIzgrI/grJDgrJMt4Kyo4KyqLeCssOCssuCss+CstS3grLngrL3grZzgrZ3grZ8t4K2h4K2x4K6D4K6FLeCuiuCuji3grpDgrpIt4K6V4K6Z4K6a4K6c4K6e4K6f4K6j4K6k4K6oLeCuquCuri3grrngr5DgsIUt4LCM4LCOLeCwkOCwki3gsKjgsKot4LC54LC94LGYLeCxmuCxoOCxoeCygOCyhS3gsozgso4t4LKQ4LKSLeCyqOCyqi3gsrPgsrUt4LK54LK94LOe4LOg4LOh4LOx4LOy4LSELeC0jOC0ji3gtJDgtJIt4LS64LS94LWO4LWULeC1luC1ny3gtaHgtbot4LW/4LaFLeC2luC2mi3gtrHgtrMt4La74La94LeALeC3huC4gS3guLDguLLguLPguYAt4LmG4LqB4LqC4LqE4LqGLeC6iuC6jC3guqPguqXguqct4Lqw4Lqy4Lqz4Lq94LuALeC7hOC7huC7nC3gu5/gvIDgvYAt4L2H4L2JLeC9rOC+iC3gvozhgIAt4YCq4YC/4YGQLeGBleGBmi3hgZ3hgaHhgaXhgabhga4t4YGw4YG1LeGCgeGCjuGCoC3hg4Xhg4fhg43hg5At4YO64YO8LeGJiOGJii3hiY3hiZAt4YmW4YmY4YmaLeGJneGJoC3hiojhioot4YqN4YqQLeGKsOGKsi3hirXhirgt4Yq+4YuA4YuCLeGLheGLiC3hi5bhi5gt4YyQ4YySLeGMleGMmC3hjZrhjoAt4Y6P4Y6gLeGPteGPuC3hj73hkIEt4Zms4ZmvLeGZv+GagS3hmprhmqAt4Zuq4ZuuLeGbuOGcgC3hnIzhnI4t4ZyR4ZygLeGcseGdgC3hnZHhnaAt4Z2s4Z2uLeGdsOGegC3hnrPhn5fhn5zhoKAt4aG44aKALeGiqOGiquGisC3ho7XhpIAt4aSe4aWQLeGlreGlsC3hpbThpoAt4aar4aawLeGnieGogC3hqJbhqKAt4amU4aqn4ayFLeGss+GthS3hrYvhroMt4a6g4a6u4a6v4a66LeGvpeGwgC3hsKPhsY0t4bGP4bGaLeGxveGygC3hsojhspAt4bK64bK9LeGyv+GzqS3hs6zhs64t4bOz4bO14bO24bO64bSALeG2v+G4gC3hvJXhvJgt4byd4bygLeG9heG9iC3hvY3hvZAt4b2X4b2Z4b2b4b2d4b2fLeG9veG+gC3hvrThvrYt4b684b6+4b+CLeG/hOG/hi3hv4zhv5At4b+T4b+WLeG/m+G/oC3hv6zhv7It4b+04b+2LeG/vOKBseKBv+KCkC3igpzihILihIfihIot4oST4oSV4oSYLeKEneKEpOKEpuKEqOKEqi3ihLnihLwt4oS/4oWFLeKFieKFjuKFoC3ihojisIAt4rCu4rCwLeKxnuKxoC3is6Tis6st4rOu4rOy4rOz4rSALeK0peK0p+K0reK0sC3itafita/itoAt4raW4ragLeK2puK2qC3itq7itrAt4ra24ra4LeK2vuK3gC3it4bit4gt4reO4reQLeK3luK3mC3it57jgIUt44CH44ChLeOAqeOAsS3jgLXjgLgt44C844GBLeOCluOCmy3jgp/jgqEt44O644O8LeODv+OEhS3jhK/jhLEt44aO44agLeOGv+OHsC3jh7/jkIAt5La/5LiALem/vOqAgC3qkozqk5At6pO96pSALeqYjOqYkC3qmJ/qmKrqmKvqmYAt6pmu6pm/LeqaneqaoC3qm6/qnJct6pyf6pyiLeqeiOqeiy3qnr/qn4It6p+K6p+1Leqggeqggy3qoIXqoIct6qCK6qCMLeqgouqhgC3qobPqooIt6qKz6qOyLeqjt+qju+qjveqjvuqkii3qpKXqpLAt6qWG6qWgLeqlvOqmhC3qprLqp4/qp6At6qek6qemLeqnr+qnui3qp77qqIAt6qio6qmALeqpguqphC3qqYvqqaAt6qm26qm66qm+Leqqr+qqseqqteqqtuqquS3qqr3qq4Dqq4Lqq5st6qud6qugLeqrquqrsi3qq7TqrIEt6qyG6qyJLeqsjuqskS3qrJbqrKAt6qym6qyoLeqsruqssC3qrZrqrZwt6q2p6q2wLeqvouqwgC3tnqPtnrAt7Z+G7Z+LLe2fu++kgC3vqa3vqbAt76uZ76yALe+shu+sky3vrJfvrJ3vrJ8t76yo76yqLe+stu+suC3vrLzvrL7vrYDvrYHvrYPvrYTvrYYt766x76+TLe+0ve+1kC3vto/vtpIt77eH77ewLe+3u++5sC3vubTvubYt77u877yhLe+8uu+9gS3vvZrvvaYt776+77+CLe+/h++/ii3vv4/vv5It77+X77+aLe+/nFwiLFA9XCLigIzigI3Ct8yALc2vzofSgy3Sh9aRLda91r/XgdeC14TXhdeH2JAt2JrZiy3Zqdmw25Yt25zbny3bpNun26jbqi3brduwLdu53JHcsC3dit6mLd6w34At34nfqy3fs9+94KCWLeCgmeCgmy3goKPgoKUt4KCn4KCpLeCgreChmS3goZvgo5Mt4KOh4KOjLeCkg+Ckui3gpLzgpL4t4KWP4KWRLeCll+ClouClo+Clpi3gpa/gpoEt4KaD4Ka84Ka+LeCnhOCnh+CniOCniy3gp43gp5fgp6Lgp6Pgp6Yt4Kev4Ke+4KiBLeCog+CovOCovi3gqYLgqYfgqYjgqYst4KmN4KmR4KmmLeCpseCpteCqgS3gqoPgqrzgqr4t4KuF4KuHLeCrieCriy3gq43gq6Lgq6Pgq6Yt4Kuv4Ku6LeCrv+CsgS3grIPgrLzgrL4t4K2E4K2H4K2I4K2LLeCtjeCtlS3grZfgraLgraPgraYt4K2v4K6C4K6+LeCvguCvhi3gr4jgr4ot4K+N4K+X4K+mLeCvr+CwgC3gsITgsL4t4LGE4LGGLeCxiOCxii3gsY3gsZXgsZbgsaLgsaPgsaYt4LGv4LKBLeCyg+CyvOCyvi3gs4Tgs4Yt4LOI4LOKLeCzjeCzleCzluCzouCzo+Czpi3gs6/gtIAt4LSD4LS74LS84LS+LeC1hOC1hi3gtYjgtYot4LWN4LWX4LWi4LWj4LWmLeC1r+C2gS3gtoPgt4rgt48t4LeU4LeW4LeYLeC3n+C3pi3gt6/gt7Lgt7PguLHguLQt4Li64LmHLeC5juC5kC3guZngurHgurQt4Lq84LuILeC7jeC7kC3gu5ngvJjgvJngvKAt4Lyp4Ly14Ly34Ly54Ly+4Ly/4L2xLeC+hOC+huC+h+C+jS3gvpfgvpkt4L684L+G4YCrLeGAvuGBgC3hgYnhgZYt4YGZ4YGeLeGBoOGBoi3hgaThgact4YGt4YGxLeGBtOGCgi3hgo3hgo8t4YKd4Y2dLeGNn+GNqS3hjbHhnJIt4ZyU4ZyyLeGctOGdkuGdk+GdsuGds+GetC3hn5Phn53hn6At4Z+p4aCLLeGgjeGgkC3hoJnhoqnhpKAt4aSr4aSwLeGku+Glhi3hpY/hp5At4aea4aiXLeGom+GplS3hqZ7hqaAt4am84am/LeGqieGqkC3hqpnhqrAt4aq94aq/4auA4ayALeGshOGstC3hrYThrZAt4a2Z4a2rLeGts+GugC3hroLhrqEt4a6t4a6wLeGuueGvpi3hr7PhsKQt4bC34bGALeGxieGxkC3hsZnhs5At4bOS4bOULeGzqOGzreGztOGzty3hs7nht4At4be54be7LeG3v+KAv+KBgOKBlOKDkC3ig5zig6Hig6Ut4oOw4rOvLeKzseK1v+K3oC3it7/jgKot44Cv44KZ44Ka6pigLeqYqeqZr+qZtC3qmb3qmp7qmp/qm7Dqm7HqoILqoIbqoIvqoKMt6qCn6qCs6qKA6qKB6qK0LeqjheqjkC3qo5nqo6At6qOx6qO/Leqkieqkpi3qpK3qpYct6qWT6qaALeqmg+qmsy3qp4Dqp5At6qeZ6qel6qewLeqnueqoqS3qqLbqqYPqqYzqqY3qqZAt6qmZ6qm7LeqpveqqsOqqsi3qqrTqqrfqqrjqqr7qqr/qq4Hqq6st6quv6qu16qu26q+jLeqvquqvrOqvreqvsC3qr7nvrJ7vuIAt77iP77igLe+4r++4s++4tO+5jS3vuY/vvJAt77yZ77y/XCI7Y29uc3QgRT1uZXcgUmVnRXhwKFwiW1wiK2crXCJdXCIpLEM9bmV3IFJlZ0V4cChcIltcIitnK1ArXCJdXCIpO2c9UD1udWxsO2NvbnN0IGI9WzAsMTEsMiwyNSwyLDE4LDIsMSwyLDE0LDMsMTMsMzUsMTIyLDcwLDUyLDI2OCwyOCw0LDQ4LDQ4LDMxLDE0LDI5LDYsMzcsMTEsMjksMywzNSw1LDcsMiw0LDQzLDE1NywxOSwzNSw1LDM1LDUsMzksOSw1MSwxNTcsMzEwLDEwLDIxLDExLDcsMTUzLDUsMywwLDIsNDMsMiwxLDQsMCwzLDIyLDExLDIyLDEwLDMwLDY2LDE4LDIsMSwxMSwyMSwxMSwyNSw3MSw1NSw3LDEsNjUsMCwxNiwzLDIsMiwyLDI4LDQzLDI4LDQsMjgsMzYsNywyLDI3LDI4LDUzLDExLDIxLDExLDE4LDE0LDE3LDExMSw3Miw1Niw1MCwxNCw1MCwxNCwzNSwzNDksNDEsNywxLDc5LDI4LDExLDAsOSwyMSwxMDcsMjAsMjgsMjIsMTMsNTIsNzYsNDQsMzMsMjQsMjcsMzUsMzAsMCwzLDAsOSwzNCw0LDAsMTMsNDcsMTUsMywyMiwwLDIsMCwzNiwxNywyLDI0LDg1LDYsMiwwLDIsMywyLDE0LDIsOSw4LDQ2LDM5LDcsMywxLDMsMjEsMiw2LDIsMSwyLDQsNCwwLDE5LDAsMTMsNCwxNTksNTIsMTksMywyMSwyLDMxLDQ3LDIxLDEsMiwwLDE4NSw0Niw0MiwzLDM3LDQ3LDIxLDAsNjAsNDIsMTQsMCw3MiwyNiwyMzAsNDMsMTE3LDYzLDMyLDcsMywwLDMsNywyLDEsMiwyMywxNiwwLDIsMCw5NSw3LDMsMzgsMTcsMCwyLDAsMjksMCwxMSwzOSw4LDAsMjIsMCwxMiw0NSwyMCwwLDM1LDU2LDI2NCw4LDIsMzYsMTgsMCw1MCwyOSwxMTMsNiwyLDEsMiwzNywyMiwwLDI2LDUsMiwxLDIsMzEsMTUsMCwzMjgsMTgsMTkwLDAsODAsOTIxLDEwMywxMTAsMTgsMTk1LDI3NDksMTA3MCw0MDUwLDU4Miw4NjM0LDU2OCw4LDMwLDExNCwyOSwxOSw0NywxNywzLDMyLDIwLDYsMTgsNjg5LDYzLDEyOSw3NCw2LDAsNjcsMTIsNjUsMSwyLDAsMjksNjEzNSw5LDEyMzcsNDMsOCw4OTUyLDI4Niw1MCwyLDE4LDMsOSwzOTUsMjMwOSwxMDYsNiwxMiw0LDgsOCw5LDU5OTEsODQsMiw3MCwyLDEsMywwLDMsMSwzLDMsMiwxMSwyLDAsMiw2LDIsNjQsMiwzLDMsNywyLDYsMiwyNywyLDMsMiw0LDIsMCw0LDYsMiwzMzksMywyNCwyLDI0LDIsMzAsMiwyNCwyLDMwLDIsMjQsMiwzMCwyLDI0LDIsMzAsMiwyNCwyLDcsMjM1Nyw0NCwxMSw2LDE3LDAsMzcwLDQzLDEzMDEsMTk2LDYwLDY3LDgsMCwxMjA1LDMsMiwyNiwyLDEsMiwwLDMsMCwyLDksMiwzLDIsMCwyLDAsNywwLDUsMCwyLDAsMiwwLDIsMiwyLDEsMiwwLDMsMCwyLDAsMiwwLDIsMCwyLDAsMiwxLDIsMCwzLDMsMiw2LDIsMywyLDMsMiwwLDIsOSwyLDE2LDYsMiwyLDQsMiwxNiw0NDIxLDQyNzE3LDM1LDQxNDgsMTIsMjIxLDMsNTc2MSwxNSw3NDcyLDMxMDQsNTQxLDE1MDcsNDkzOF0sVD1bNTA5LDAsMjI3LDAsMTUwLDQsMjk0LDksMTM2OCwyLDIsMSw2LDMsNDEsMiw1LDAsMTY2LDEsNTc0LDMsOSw5LDM3MCwxLDE1NCwxMCwxNzYsMiw1NCwxNCwzMiw5LDE2LDMsNDYsMTAsNTQsOSw3LDIsMzcsMTMsMiw5LDYsMSw0NSwwLDEzLDIsNDksMTMsOSwzLDIsMTEsODMsMTEsNywwLDE2MSwxMSw2LDksNywzLDU2LDEsMiw2LDMsMSwzLDIsMTAsMCwxMSwxLDMsNiw0LDQsMTkzLDE3LDEwLDksNSwwLDgyLDE5LDEzLDksMjE0LDYsMyw4LDI4LDEsODMsMTYsMTYsOSw4MiwxMiw5LDksODQsMTQsNSw5LDI0MywxNCwxNjYsOSw3MSw1LDIsMSwzLDMsMiwwLDIsMSwxMyw5LDEyMCw2LDMsNiw0LDAsMjksOSw0MSw2LDIsMyw5LDAsMTAsMTAsNDcsMTUsNDA2LDcsMiw3LDE3LDksNTcsMjEsMiwxMywxMjMsNSw0LDAsMiwxLDIsNiwyLDAsOSw5LDQ5LDQsMiwxLDIsNCw5LDksMzMwLDMsMTkzMDYsOSwxMzUsNCw2MCw2LDI2LDksMTAxNCwwLDIsNTQsOCwzLDgyLDAsMTIsMSwxOTYyOCwxLDUzMTksNCw0LDUsOSw3LDMsNiwzMSwzLDE0OSwyLDE0MTgsNDksNTEzLDU0LDUsNDksOSwwLDE1LDAsMjMsNCwyLDE0LDEzNjEsNiwyLDE2LDMsNiwyLDEsMiw0LDI2Miw2LDEwLDksNDE5LDEzLDE0OTUsNiwxMTAsNiw2LDksNDc1OSw5LDc4NzcxOSwyMzldO2Z1bmN0aW9uIEEodCxlKXtsZXQgcz02NTUzNjtmb3IobGV0IGk9MCxyPWUubGVuZ3RoO2k8cjtpKz0yKXtpZihzKz1lW2ldLHM+dClyZXR1cm4hMTtpZihzKz1lW2krMV0scz49dClyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiB3KHQpe3JldHVybiB0PDY1PzM2PT09dDp0PD05MHx8KHQ8OTc/OTU9PT10OnQ8PTEyMnx8KHQ8PTY1NTM1P3Q+PTE3MCYmRS50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUodCkpOkEodCxiKSkpfWZ1bmN0aW9uIFModCl7cmV0dXJuIHQ8NDg/MzY9PT10OnQ8NTh8fCEodDw2NSkmJih0PD05MHx8KHQ8OTc/OTU9PT10OnQ8PTEyMnx8KHQ8PTY1NTM1P3Q+PTE3MCYmQy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUodCkpOkEodCxiKXx8QSh0LFQpKSkpfWNvbnN0IE49W1wiaW1wbGVtZW50c1wiLFwiaW50ZXJmYWNlXCIsXCJsZXRcIixcInBhY2thZ2VcIixcInByaXZhdGVcIixcInByb3RlY3RlZFwiLFwicHVibGljXCIsXCJzdGF0aWNcIixcInlpZWxkXCJdLEY9W1wiZXZhbFwiLFwiYXJndW1lbnRzXCJdLGs9bmV3IFNldChbXCJicmVha1wiLFwiY2FzZVwiLFwiY2F0Y2hcIixcImNvbnRpbnVlXCIsXCJkZWJ1Z2dlclwiLFwiZGVmYXVsdFwiLFwiZG9cIixcImVsc2VcIixcImZpbmFsbHlcIixcImZvclwiLFwiZnVuY3Rpb25cIixcImlmXCIsXCJyZXR1cm5cIixcInN3aXRjaFwiLFwidGhyb3dcIixcInRyeVwiLFwidmFyXCIsXCJjb25zdFwiLFwid2hpbGVcIixcIndpdGhcIixcIm5ld1wiLFwidGhpc1wiLFwic3VwZXJcIixcImNsYXNzXCIsXCJleHRlbmRzXCIsXCJleHBvcnRcIixcImltcG9ydFwiLFwibnVsbFwiLFwidHJ1ZVwiLFwiZmFsc2VcIixcImluXCIsXCJpbnN0YW5jZW9mXCIsXCJ0eXBlb2ZcIixcInZvaWRcIixcImRlbGV0ZVwiXSksST1uZXcgU2V0KE4pLHY9bmV3IFNldChGKTtmdW5jdGlvbiBMKHQsZSl7cmV0dXJuIGUmJlwiYXdhaXRcIj09PXR8fFwiZW51bVwiPT09dH1mdW5jdGlvbiBCKHQsZSl7cmV0dXJuIEwodCxlKXx8SS5oYXModCl9ZnVuY3Rpb24gTSh0KXtyZXR1cm4gdi5oYXModCl9ZnVuY3Rpb24gTyh0LGUpe3JldHVybiBCKHQsZSl8fE0odCl9Y29uc3QgUj0vXmluKHN0YW5jZW9mKT8kLztjb25zdCBfPW5ldyBTZXQoW1wiX1wiLFwiYW55XCIsXCJib29sXCIsXCJib29sZWFuXCIsXCJlbXB0eVwiLFwiZXh0ZW5kc1wiLFwiZmFsc2VcIixcImludGVyZmFjZVwiLFwibWl4ZWRcIixcIm51bGxcIixcIm51bWJlclwiLFwic3RhdGljXCIsXCJzdHJpbmdcIixcInRydWVcIixcInR5cGVvZlwiLFwidm9pZFwiXSksaj1PYmplY3QuZnJlZXplKHtBbWJpZ3VvdXNDb25kaXRpb25hbEFycm93OlwiQW1iaWd1b3VzIGV4cHJlc3Npb246IHdyYXAgdGhlIGFycm93IGZ1bmN0aW9ucyBpbiBwYXJlbnRoZXNlcyB0byBkaXNhbWJpZ3VhdGUuXCIsQW1iaWd1b3VzRGVjbGFyZU1vZHVsZUtpbmQ6XCJGb3VuZCBib3RoIGBkZWNsYXJlIG1vZHVsZS5leHBvcnRzYCBhbmQgYGRlY2xhcmUgZXhwb3J0YCBpbiB0aGUgc2FtZSBtb2R1bGUuIE1vZHVsZXMgY2FuIG9ubHkgaGF2ZSAxIHNpbmNlIHRoZXkgYXJlIGVpdGhlciBhbiBFUyBtb2R1bGUgb3IgdGhleSBhcmUgYSBDb21tb25KUyBtb2R1bGVcIixBc3NpZ25SZXNlcnZlZFR5cGU6XCJDYW5ub3Qgb3ZlcndyaXRlIHJlc2VydmVkIHR5cGUgJTBcIixEZWNsYXJlQ2xhc3NFbGVtZW50OlwiVGhlIGBkZWNsYXJlYCBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gY2xhc3MgZmllbGRzLlwiLERlY2xhcmVDbGFzc0ZpZWxkSW5pdGlhbGl6ZXI6XCJJbml0aWFsaXplcnMgYXJlIG5vdCBhbGxvd2VkIGluIGZpZWxkcyB3aXRoIHRoZSBgZGVjbGFyZWAgbW9kaWZpZXIuXCIsRHVwbGljYXRlRGVjbGFyZU1vZHVsZUV4cG9ydHM6XCJEdXBsaWNhdGUgYGRlY2xhcmUgbW9kdWxlLmV4cG9ydHNgIHN0YXRlbWVudFwiLEVudW1Cb29sZWFuTWVtYmVyTm90SW5pdGlhbGl6ZWQ6XCJCb29sZWFuIGVudW0gbWVtYmVycyBuZWVkIHRvIGJlIGluaXRpYWxpemVkLiBVc2UgZWl0aGVyIGAlMCA9IHRydWUsYCBvciBgJTAgPSBmYWxzZSxgIGluIGVudW0gYCUxYC5cIixFbnVtRHVwbGljYXRlTWVtYmVyTmFtZTpcIkVudW0gbWVtYmVyIG5hbWVzIG5lZWQgdG8gYmUgdW5pcXVlLCBidXQgdGhlIG5hbWUgYCUwYCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgYmVmb3JlIGluIGVudW0gYCUxYC5cIixFbnVtSW5jb25zaXN0ZW50TWVtYmVyVmFsdWVzOlwiRW51bSBgJTBgIGhhcyBpbmNvbnNpc3RlbnQgbWVtYmVyIGluaXRpYWxpemVycy4gRWl0aGVyIHVzZSBubyBpbml0aWFsaXplcnMsIG9yIGNvbnNpc3RlbnRseSB1c2UgbGl0ZXJhbHMgKGVpdGhlciBib29sZWFucywgbnVtYmVycywgb3Igc3RyaW5ncykgZm9yIGFsbCBtZW1iZXIgaW5pdGlhbGl6ZXJzLlwiLEVudW1JbnZhbGlkRXhwbGljaXRUeXBlOlwiRW51bSB0eXBlIGAlMWAgaXMgbm90IHZhbGlkLiBVc2Ugb25lIG9mIGBib29sZWFuYCwgYG51bWJlcmAsIGBzdHJpbmdgLCBvciBgc3ltYm9sYCBpbiBlbnVtIGAlMGAuXCIsRW51bUludmFsaWRFeHBsaWNpdFR5cGVVbmtub3duU3VwcGxpZWQ6XCJTdXBwbGllZCBlbnVtIHR5cGUgaXMgbm90IHZhbGlkLiBVc2Ugb25lIG9mIGBib29sZWFuYCwgYG51bWJlcmAsIGBzdHJpbmdgLCBvciBgc3ltYm9sYCBpbiBlbnVtIGAlMGAuXCIsRW51bUludmFsaWRNZW1iZXJJbml0aWFsaXplclByaW1hcnlUeXBlOlwiRW51bSBgJTBgIGhhcyB0eXBlIGAlMmAsIHNvIHRoZSBpbml0aWFsaXplciBvZiBgJTFgIG5lZWRzIHRvIGJlIGEgJTIgbGl0ZXJhbC5cIixFbnVtSW52YWxpZE1lbWJlckluaXRpYWxpemVyU3ltYm9sVHlwZTpcIlN5bWJvbCBlbnVtIG1lbWJlcnMgY2Fubm90IGJlIGluaXRpYWxpemVkLiBVc2UgYCUxLGAgaW4gZW51bSBgJTBgLlwiLEVudW1JbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXJVbmtub3duVHlwZTpcIlRoZSBlbnVtIG1lbWJlciBpbml0aWFsaXplciBmb3IgYCUxYCBuZWVkcyB0byBiZSBhIGxpdGVyYWwgKGVpdGhlciBhIGJvb2xlYW4sIG51bWJlciwgb3Igc3RyaW5nKSBpbiBlbnVtIGAlMGAuXCIsRW51bUludmFsaWRNZW1iZXJOYW1lOlwiRW51bSBtZW1iZXIgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggbG93ZXJjYXNlICdhJyB0aHJvdWdoICd6Jy4gSW5zdGVhZCBvZiB1c2luZyBgJTBgLCBjb25zaWRlciB1c2luZyBgJTFgLCBpbiBlbnVtIGAlMmAuXCIsRW51bU51bWJlck1lbWJlck5vdEluaXRpYWxpemVkOlwiTnVtYmVyIGVudW0gbWVtYmVycyBuZWVkIHRvIGJlIGluaXRpYWxpemVkLCBlLmcuIGAlMSA9IDFgIGluIGVudW0gYCUwYC5cIixFbnVtU3RyaW5nTWVtYmVySW5jb25zaXN0ZW50bHlJbml0YWlsaXplZDpcIlN0cmluZyBlbnVtIG1lbWJlcnMgbmVlZCB0byBjb25zaXN0ZW50bHkgZWl0aGVyIGFsbCB1c2UgaW5pdGlhbGl6ZXJzLCBvciB1c2Ugbm8gaW5pdGlhbGl6ZXJzLCBpbiBlbnVtIGAlMGAuXCIsSW1wb3J0VHlwZVNob3J0aGFuZE9ubHlJblB1cmVJbXBvcnQ6XCJUaGUgYHR5cGVgIGFuZCBgdHlwZW9mYCBrZXl3b3JkcyBvbiBuYW1lZCBpbXBvcnRzIGNhbiBvbmx5IGJlIHVzZWQgb24gcmVndWxhciBgaW1wb3J0YCBzdGF0ZW1lbnRzLiBJdCBjYW5ub3QgYmUgdXNlZCB3aXRoIGBpbXBvcnQgdHlwZWAgb3IgYGltcG9ydCB0eXBlb2ZgIHN0YXRlbWVudHNcIixJbmV4YWN0SW5zaWRlRXhhY3Q6XCJFeHBsaWNpdCBpbmV4YWN0IHN5bnRheCBjYW5ub3QgYXBwZWFyIGluc2lkZSBhbiBleHBsaWNpdCBleGFjdCBvYmplY3QgdHlwZVwiLEluZXhhY3RJbnNpZGVOb25PYmplY3Q6XCJFeHBsaWNpdCBpbmV4YWN0IHN5bnRheCBjYW5ub3QgYXBwZWFyIGluIGNsYXNzIG9yIGludGVyZmFjZSBkZWZpbml0aW9uc1wiLEluZXhhY3RWYXJpYW5jZTpcIkV4cGxpY2l0IGluZXhhY3Qgc3ludGF4IGNhbm5vdCBoYXZlIHZhcmlhbmNlXCIsSW52YWxpZE5vblR5cGVJbXBvcnRJbkRlY2xhcmVNb2R1bGU6XCJJbXBvcnRzIHdpdGhpbiBhIGBkZWNsYXJlIG1vZHVsZWAgYm9keSBtdXN0IGFsd2F5cyBiZSBgaW1wb3J0IHR5cGVgIG9yIGBpbXBvcnQgdHlwZW9mYFwiLE1pc3NpbmdUeXBlUGFyYW1EZWZhdWx0OlwiVHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24gbmVlZHMgYSBkZWZhdWx0LCBzaW5jZSBhIHByZWNlZGluZyB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbiBoYXMgYSBkZWZhdWx0LlwiLE5lc3RlZERlY2xhcmVNb2R1bGU6XCJgZGVjbGFyZSBtb2R1bGVgIGNhbm5vdCBiZSB1c2VkIGluc2lkZSBhbm90aGVyIGBkZWNsYXJlIG1vZHVsZWBcIixOZXN0ZWRGbG93Q29tbWVudDpcIkNhbm5vdCBoYXZlIGEgZmxvdyBjb21tZW50IGluc2lkZSBhbm90aGVyIGZsb3cgY29tbWVudFwiLE9wdGlvbmFsQmluZGluZ1BhdHRlcm46XCJBIGJpbmRpbmcgcGF0dGVybiBwYXJhbWV0ZXIgY2Fubm90IGJlIG9wdGlvbmFsIGluIGFuIGltcGxlbWVudGF0aW9uIHNpZ25hdHVyZS5cIixTcHJlYWRWYXJpYW5jZTpcIlNwcmVhZCBwcm9wZXJ0aWVzIGNhbm5vdCBoYXZlIHZhcmlhbmNlXCIsVHlwZUJlZm9yZUluaXRpYWxpemVyOlwiVHlwZSBhbm5vdGF0aW9ucyBtdXN0IGNvbWUgYmVmb3JlIGRlZmF1bHQgYXNzaWdubWVudHMsIGUuZy4gaW5zdGVhZCBvZiBgYWdlID0gMjU6IG51bWJlcmAgdXNlIGBhZ2U6IG51bWJlciA9IDI1YFwiLFR5cGVDYXN0SW5QYXR0ZXJuOlwiVGhlIHR5cGUgY2FzdCBleHByZXNzaW9uIGlzIGV4cGVjdGVkIHRvIGJlIHdyYXBwZWQgd2l0aCBwYXJlbnRoZXNpc1wiLFVuZXhwZWN0ZWRFeHBsaWNpdEluZXhhY3RJbk9iamVjdDpcIkV4cGxpY2l0IGluZXhhY3Qgc3ludGF4IG11c3QgYXBwZWFyIGF0IHRoZSBlbmQgb2YgYW4gaW5leGFjdCBvYmplY3RcIixVbmV4cGVjdGVkUmVzZXJ2ZWRUeXBlOlwiVW5leHBlY3RlZCByZXNlcnZlZCB0eXBlICUwXCIsVW5leHBlY3RlZFJlc2VydmVkVW5kZXJzY29yZTpcImBfYCBpcyBvbmx5IGFsbG93ZWQgYXMgYSB0eXBlIGFyZ3VtZW50IHRvIGNhbGwgb3IgbmV3XCIsVW5leHBlY3RlZFNwYWNlQmV0d2Vlbk1vZHVsb0NoZWNrczpcIlNwYWNlcyBiZXR3ZWVuIGAlYCBhbmQgYGNoZWNrc2AgYXJlIG5vdCBhbGxvd2VkIGhlcmUuXCIsVW5leHBlY3RlZFNwcmVhZFR5cGU6XCJTcHJlYWQgb3BlcmF0b3IgY2Fubm90IGFwcGVhciBpbiBjbGFzcyBvciBpbnRlcmZhY2UgZGVmaW5pdGlvbnNcIixVbmV4cGVjdGVkU3VidHJhY3Rpb25PcGVyYW5kOidVbmV4cGVjdGVkIHRva2VuLCBleHBlY3RlZCBcIm51bWJlclwiIG9yIFwiYmlnaW50XCInLFVuZXhwZWN0ZWRUb2tlbkFmdGVyVHlwZVBhcmFtZXRlcjpcIkV4cGVjdGVkIGFuIGFycm93IGZ1bmN0aW9uIGFmdGVyIHRoaXMgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb25cIixVbnN1cHBvcnRlZERlY2xhcmVFeHBvcnRLaW5kOlwiYGRlY2xhcmUgZXhwb3J0ICUwYCBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYCUxYCBpbnN0ZWFkXCIsVW5zdXBwb3J0ZWRTdGF0ZW1lbnRJbkRlY2xhcmVNb2R1bGU6XCJPbmx5IGRlY2xhcmVzIGFuZCB0eXBlIGltcG9ydHMgYXJlIGFsbG93ZWQgaW5zaWRlIGRlY2xhcmUgbW9kdWxlXCIsVW50ZXJtaW5hdGVkRmxvd0NvbW1lbnQ6XCJVbnRlcm1pbmF0ZWQgZmxvdy1jb21tZW50XCJ9KTtmdW5jdGlvbiBVKHQpe3JldHVyblwidHlwZVwiPT09dC5pbXBvcnRLaW5kfHxcInR5cGVvZlwiPT09dC5pbXBvcnRLaW5kfWZ1bmN0aW9uIHEodCl7cmV0dXJuKHQudHlwZT09PW4ubmFtZXx8ISF0LnR5cGUua2V5d29yZCkmJlwiZnJvbVwiIT09dC52YWx1ZX1jb25zdCBWPXtjb25zdDpcImRlY2xhcmUgZXhwb3J0IHZhclwiLGxldDpcImRlY2xhcmUgZXhwb3J0IHZhclwiLHR5cGU6XCJleHBvcnQgdHlwZVwiLGludGVyZmFjZTpcImV4cG9ydCBpbnRlcmZhY2VcIn07Y29uc3Qgej0vXFwqP1xccypAKCg/Om5vKT9mbG93KVxcYi87Y29uc3QgSD17cXVvdDonXCInLGFtcDpcIiZcIixhcG9zOlwiJ1wiLGx0OlwiPFwiLGd0OlwiPlwiLG5ic3A6XCLCoFwiLGlleGNsOlwiwqFcIixjZW50OlwiwqJcIixwb3VuZDpcIsKjXCIsY3VycmVuOlwiwqRcIix5ZW46XCLCpVwiLGJydmJhcjpcIsKmXCIsc2VjdDpcIsKnXCIsdW1sOlwiwqhcIixjb3B5OlwiwqlcIixvcmRmOlwiwqpcIixsYXF1bzpcIsKrXCIsbm90OlwiwqxcIixzaHk6XCLCrVwiLHJlZzpcIsKuXCIsbWFjcjpcIsKvXCIsZGVnOlwiwrBcIixwbHVzbW46XCLCsVwiLHN1cDI6XCLCslwiLHN1cDM6XCLCs1wiLGFjdXRlOlwiwrRcIixtaWNybzpcIsK1XCIscGFyYTpcIsK2XCIsbWlkZG90OlwiwrdcIixjZWRpbDpcIsK4XCIsc3VwMTpcIsK5XCIsb3JkbTpcIsK6XCIscmFxdW86XCLCu1wiLGZyYWMxNDpcIsK8XCIsZnJhYzEyOlwiwr1cIixmcmFjMzQ6XCLCvlwiLGlxdWVzdDpcIsK/XCIsQWdyYXZlOlwiw4BcIixBYWN1dGU6XCLDgVwiLEFjaXJjOlwiw4JcIixBdGlsZGU6XCLDg1wiLEF1bWw6XCLDhFwiLEFyaW5nOlwiw4VcIixBRWxpZzpcIsOGXCIsQ2NlZGlsOlwiw4dcIixFZ3JhdmU6XCLDiFwiLEVhY3V0ZTpcIsOJXCIsRWNpcmM6XCLDilwiLEV1bWw6XCLDi1wiLElncmF2ZTpcIsOMXCIsSWFjdXRlOlwiw41cIixJY2lyYzpcIsOOXCIsSXVtbDpcIsOPXCIsRVRIOlwiw5BcIixOdGlsZGU6XCLDkVwiLE9ncmF2ZTpcIsOSXCIsT2FjdXRlOlwiw5NcIixPY2lyYzpcIsOUXCIsT3RpbGRlOlwiw5VcIixPdW1sOlwiw5ZcIix0aW1lczpcIsOXXCIsT3NsYXNoOlwiw5hcIixVZ3JhdmU6XCLDmVwiLFVhY3V0ZTpcIsOaXCIsVWNpcmM6XCLDm1wiLFV1bWw6XCLDnFwiLFlhY3V0ZTpcIsOdXCIsVEhPUk46XCLDnlwiLHN6bGlnOlwiw59cIixhZ3JhdmU6XCLDoFwiLGFhY3V0ZTpcIsOhXCIsYWNpcmM6XCLDolwiLGF0aWxkZTpcIsOjXCIsYXVtbDpcIsOkXCIsYXJpbmc6XCLDpVwiLGFlbGlnOlwiw6ZcIixjY2VkaWw6XCLDp1wiLGVncmF2ZTpcIsOoXCIsZWFjdXRlOlwiw6lcIixlY2lyYzpcIsOqXCIsZXVtbDpcIsOrXCIsaWdyYXZlOlwiw6xcIixpYWN1dGU6XCLDrVwiLGljaXJjOlwiw65cIixpdW1sOlwiw69cIixldGg6XCLDsFwiLG50aWxkZTpcIsOxXCIsb2dyYXZlOlwiw7JcIixvYWN1dGU6XCLDs1wiLG9jaXJjOlwiw7RcIixvdGlsZGU6XCLDtVwiLG91bWw6XCLDtlwiLGRpdmlkZTpcIsO3XCIsb3NsYXNoOlwiw7hcIix1Z3JhdmU6XCLDuVwiLHVhY3V0ZTpcIsO6XCIsdWNpcmM6XCLDu1wiLHV1bWw6XCLDvFwiLHlhY3V0ZTpcIsO9XCIsdGhvcm46XCLDvlwiLHl1bWw6XCLDv1wiLE9FbGlnOlwixZJcIixvZWxpZzpcIsWTXCIsU2Nhcm9uOlwixaBcIixzY2Fyb246XCLFoVwiLFl1bWw6XCLFuFwiLGZub2Y6XCLGklwiLGNpcmM6XCLLhlwiLHRpbGRlOlwiy5xcIixBbHBoYTpcIs6RXCIsQmV0YTpcIs6SXCIsR2FtbWE6XCLOk1wiLERlbHRhOlwizpRcIixFcHNpbG9uOlwizpVcIixaZXRhOlwizpZcIixFdGE6XCLOl1wiLFRoZXRhOlwizphcIixJb3RhOlwizplcIixLYXBwYTpcIs6aXCIsTGFtYmRhOlwizptcIixNdTpcIs6cXCIsTnU6XCLOnVwiLFhpOlwizp5cIixPbWljcm9uOlwizp9cIixQaTpcIs6gXCIsUmhvOlwizqFcIixTaWdtYTpcIs6jXCIsVGF1OlwizqRcIixVcHNpbG9uOlwizqVcIixQaGk6XCLOplwiLENoaTpcIs6nXCIsUHNpOlwizqhcIixPbWVnYTpcIs6pXCIsYWxwaGE6XCLOsVwiLGJldGE6XCLOslwiLGdhbW1hOlwizrNcIixkZWx0YTpcIs60XCIsZXBzaWxvbjpcIs61XCIsemV0YTpcIs62XCIsZXRhOlwizrdcIix0aGV0YTpcIs64XCIsaW90YTpcIs65XCIsa2FwcGE6XCLOulwiLGxhbWJkYTpcIs67XCIsbXU6XCLOvFwiLG51Olwizr1cIix4aTpcIs6+XCIsb21pY3JvbjpcIs6/XCIscGk6XCLPgFwiLHJobzpcIs+BXCIsc2lnbWFmOlwiz4JcIixzaWdtYTpcIs+DXCIsdGF1Olwiz4RcIix1cHNpbG9uOlwiz4VcIixwaGk6XCLPhlwiLGNoaTpcIs+HXCIscHNpOlwiz4hcIixvbWVnYTpcIs+JXCIsdGhldGFzeW06XCLPkVwiLHVwc2loOlwiz5JcIixwaXY6XCLPllwiLGVuc3A6XCLigIJcIixlbXNwOlwi4oCDXCIsdGhpbnNwOlwi4oCJXCIsenduajpcIuKAjFwiLHp3ajpcIuKAjVwiLGxybTpcIuKAjlwiLHJsbTpcIuKAj1wiLG5kYXNoOlwi4oCTXCIsbWRhc2g6XCLigJRcIixsc3F1bzpcIuKAmFwiLHJzcXVvOlwi4oCZXCIsc2JxdW86XCLigJpcIixsZHF1bzpcIuKAnFwiLHJkcXVvOlwi4oCdXCIsYmRxdW86XCLigJ5cIixkYWdnZXI6XCLigKBcIixEYWdnZXI6XCLigKFcIixidWxsOlwi4oCiXCIsaGVsbGlwOlwi4oCmXCIscGVybWlsOlwi4oCwXCIscHJpbWU6XCLigLJcIixQcmltZTpcIuKAs1wiLGxzYXF1bzpcIuKAuVwiLHJzYXF1bzpcIuKAulwiLG9saW5lOlwi4oC+XCIsZnJhc2w6XCLigYRcIixldXJvOlwi4oKsXCIsaW1hZ2U6XCLihJFcIix3ZWllcnA6XCLihJhcIixyZWFsOlwi4oScXCIsdHJhZGU6XCLihKJcIixhbGVmc3ltOlwi4oS1XCIsbGFycjpcIuKGkFwiLHVhcnI6XCLihpFcIixyYXJyOlwi4oaSXCIsZGFycjpcIuKGk1wiLGhhcnI6XCLihpRcIixjcmFycjpcIuKGtVwiLGxBcnI6XCLih5BcIix1QXJyOlwi4oeRXCIsckFycjpcIuKHklwiLGRBcnI6XCLih5NcIixoQXJyOlwi4oeUXCIsZm9yYWxsOlwi4oiAXCIscGFydDpcIuKIglwiLGV4aXN0Olwi4oiDXCIsZW1wdHk6XCLiiIVcIixuYWJsYTpcIuKIh1wiLGlzaW46XCLiiIhcIixub3RpbjpcIuKIiVwiLG5pOlwi4oiLXCIscHJvZDpcIuKIj1wiLHN1bTpcIuKIkVwiLG1pbnVzOlwi4oiSXCIsbG93YXN0Olwi4oiXXCIscmFkaWM6XCLiiJpcIixwcm9wOlwi4oidXCIsaW5maW46XCLiiJ5cIixhbmc6XCLiiKBcIixhbmQ6XCLiiKdcIixvcjpcIuKIqFwiLGNhcDpcIuKIqVwiLGN1cDpcIuKIqlwiLGludDpcIuKIq1wiLHRoZXJlNDpcIuKItFwiLHNpbTpcIuKIvFwiLGNvbmc6XCLiiYVcIixhc3ltcDpcIuKJiFwiLG5lOlwi4omgXCIsZXF1aXY6XCLiiaFcIixsZTpcIuKJpFwiLGdlOlwi4omlXCIsc3ViOlwi4oqCXCIsc3VwOlwi4oqDXCIsbnN1YjpcIuKKhFwiLHN1YmU6XCLiioZcIixzdXBlOlwi4oqHXCIsb3BsdXM6XCLiipVcIixvdGltZXM6XCLiipdcIixwZXJwOlwi4oqlXCIsc2RvdDpcIuKLhVwiLGxjZWlsOlwi4oyIXCIscmNlaWw6XCLijIlcIixsZmxvb3I6XCLijIpcIixyZmxvb3I6XCLijItcIixsYW5nOlwi4oypXCIscmFuZzpcIuKMqlwiLGxvejpcIuKXilwiLHNwYWRlczpcIuKZoFwiLGNsdWJzOlwi4pmjXCIsaGVhcnRzOlwi4pmlXCIsZGlhbXM6XCLimaZcIn0sVz0vXltcXGRhLWZBLUZdKyQvLEs9L15cXGQrJC8sSj1PYmplY3QuZnJlZXplKHtBdHRyaWJ1dGVJc0VtcHR5OlwiSlNYIGF0dHJpYnV0ZXMgbXVzdCBvbmx5IGJlIGFzc2lnbmVkIGEgbm9uLWVtcHR5IGV4cHJlc3Npb25cIixNaXNzaW5nQ2xvc2luZ1RhZ0ZyYWdtZW50OlwiRXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDw+XCIsTWlzc2luZ0Nsb3NpbmdUYWdFbGVtZW50OlwiRXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDwlMD5cIixVbnN1cHBvcnRlZEpzeFZhbHVlOlwiSlNYIHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgYW4gZXhwcmVzc2lvbiBvciBhIHF1b3RlZCBKU1ggdGV4dFwiLFVudGVybWluYXRlZEpzeENvbnRlbnQ6XCJVbnRlcm1pbmF0ZWQgSlNYIGNvbnRlbnRzXCIsVW53cmFwcGVkQWRqYWNlbnRKU1hFbGVtZW50czpcIkFkamFjZW50IEpTWCBlbGVtZW50cyBtdXN0IGJlIHdyYXBwZWQgaW4gYW4gZW5jbG9zaW5nIHRhZy4gRGlkIHlvdSB3YW50IGEgSlNYIGZyYWdtZW50IDw+Li4uPC8+P1wifSk7ZnVuY3Rpb24gWCh0KXtyZXR1cm4hIXQmJihcIkpTWE9wZW5pbmdGcmFnbWVudFwiPT09dC50eXBlfHxcIkpTWENsb3NpbmdGcmFnbWVudFwiPT09dC50eXBlKX1mdW5jdGlvbiBHKHQpe2lmKFwiSlNYSWRlbnRpZmllclwiPT09dC50eXBlKXJldHVybiB0Lm5hbWU7aWYoXCJKU1hOYW1lc3BhY2VkTmFtZVwiPT09dC50eXBlKXJldHVybiB0Lm5hbWVzcGFjZS5uYW1lK1wiOlwiK3QubmFtZS5uYW1lO2lmKFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiPT09dC50eXBlKXJldHVybiBHKHQub2JqZWN0KStcIi5cIitHKHQucHJvcGVydHkpO3Rocm93IG5ldyBFcnJvcihcIk5vZGUgaGFkIHVuZXhwZWN0ZWQgdHlwZTogXCIrdC50eXBlKX14Lmpfb1RhZz1uZXcgeShcIjx0YWdcIiwhMSkseC5qX2NUYWc9bmV3IHkoXCI8L3RhZ1wiLCExKSx4LmpfZXhwcj1uZXcgeShcIjx0YWc+Li4uPC90YWc+XCIsITAsITApLG4uanN4TmFtZT1uZXcgcyhcImpzeE5hbWVcIiksbi5qc3hUZXh0PW5ldyBzKFwianN4VGV4dFwiLHtiZWZvcmVFeHByOiEwfSksbi5qc3hUYWdTdGFydD1uZXcgcyhcImpzeFRhZ1N0YXJ0XCIse3N0YXJ0c0V4cHI6ITB9KSxuLmpzeFRhZ0VuZD1uZXcgcyhcImpzeFRhZ0VuZFwiKSxuLmpzeFRhZ1N0YXJ0LnVwZGF0ZUNvbnRleHQ9ZnVuY3Rpb24oKXt0aGlzLnN0YXRlLmNvbnRleHQucHVzaCh4LmpfZXhwciksdGhpcy5zdGF0ZS5jb250ZXh0LnB1c2goeC5qX29UYWcpLHRoaXMuc3RhdGUuZXhwckFsbG93ZWQ9ITF9LG4uanN4VGFnRW5kLnVwZGF0ZUNvbnRleHQ9ZnVuY3Rpb24odCl7Y29uc3QgZT10aGlzLnN0YXRlLmNvbnRleHQucG9wKCk7ZT09PXgual9vVGFnJiZ0PT09bi5zbGFzaHx8ZT09PXgual9jVGFnPyh0aGlzLnN0YXRlLmNvbnRleHQucG9wKCksdGhpcy5zdGF0ZS5leHByQWxsb3dlZD10aGlzLmN1ckNvbnRleHQoKT09PXgual9leHByKTp0aGlzLnN0YXRlLmV4cHJBbGxvd2VkPSEwfTtjbGFzcyBRe2NvbnN0cnVjdG9yKHQpe3RoaXMudmFyPVtdLHRoaXMubGV4aWNhbD1bXSx0aGlzLmZ1bmN0aW9ucz1bXSx0aGlzLmZsYWdzPXR9fWNsYXNzIFl7Y29uc3RydWN0b3IodCxlKXt0aGlzLnNjb3BlU3RhY2s9W10sdGhpcy51bmRlZmluZWRFeHBvcnRzPW5ldyBNYXAsdGhpcy51bmRlZmluZWRQcml2YXRlTmFtZXM9bmV3IE1hcCx0aGlzLnJhaXNlPXQsdGhpcy5pbk1vZHVsZT1lfWdldCBpbkZ1bmN0aW9uKCl7cmV0dXJuKDImdGhpcy5jdXJyZW50VmFyU2NvcGUoKS5mbGFncyk+MH1nZXQgYWxsb3dTdXBlcigpe3JldHVybigxNiZ0aGlzLmN1cnJlbnRUaGlzU2NvcGUoKS5mbGFncyk+MH1nZXQgYWxsb3dEaXJlY3RTdXBlcigpe3JldHVybigzMiZ0aGlzLmN1cnJlbnRUaGlzU2NvcGUoKS5mbGFncyk+MH1nZXQgaW5DbGFzcygpe3JldHVybig2NCZ0aGlzLmN1cnJlbnRUaGlzU2NvcGUoKS5mbGFncyk+MH1nZXQgaW5Ob25BcnJvd0Z1bmN0aW9uKCl7cmV0dXJuKDImdGhpcy5jdXJyZW50VGhpc1Njb3BlKCkuZmxhZ3MpPjB9Z2V0IHRyZWF0RnVuY3Rpb25zQXNWYXIoKXtyZXR1cm4gdGhpcy50cmVhdEZ1bmN0aW9uc0FzVmFySW5TY29wZSh0aGlzLmN1cnJlbnRTY29wZSgpKX1jcmVhdGVTY29wZSh0KXtyZXR1cm4gbmV3IFEodCl9ZW50ZXIodCl7dGhpcy5zY29wZVN0YWNrLnB1c2godGhpcy5jcmVhdGVTY29wZSh0KSl9ZXhpdCgpe3RoaXMuc2NvcGVTdGFjay5wb3AoKX10cmVhdEZ1bmN0aW9uc0FzVmFySW5TY29wZSh0KXtyZXR1cm4hISgyJnQuZmxhZ3N8fCF0aGlzLmluTW9kdWxlJiYxJnQuZmxhZ3MpfWRlY2xhcmVOYW1lKHQsZSxzKXtsZXQgaT10aGlzLmN1cnJlbnRTY29wZSgpO2lmKDgmZXx8MTYmZSl0aGlzLmNoZWNrUmVkZWNsYXJhdGlvbkluU2NvcGUoaSx0LGUscyksMTYmZT9pLmZ1bmN0aW9ucy5wdXNoKHQpOmkubGV4aWNhbC5wdXNoKHQpLDgmZSYmdGhpcy5tYXliZUV4cG9ydERlZmluZWQoaSx0KTtlbHNlIGlmKDQmZSlmb3IobGV0IHI9dGhpcy5zY29wZVN0YWNrLmxlbmd0aC0xO3I+PTAmJihpPXRoaXMuc2NvcGVTdGFja1tyXSx0aGlzLmNoZWNrUmVkZWNsYXJhdGlvbkluU2NvcGUoaSx0LGUscyksaS52YXIucHVzaCh0KSx0aGlzLm1heWJlRXhwb3J0RGVmaW5lZChpLHQpLCEoMTMxJmkuZmxhZ3MpKTstLXIpO3RoaXMuaW5Nb2R1bGUmJjEmaS5mbGFncyYmdGhpcy51bmRlZmluZWRFeHBvcnRzLmRlbGV0ZSh0KX1tYXliZUV4cG9ydERlZmluZWQodCxlKXt0aGlzLmluTW9kdWxlJiYxJnQuZmxhZ3MmJnRoaXMudW5kZWZpbmVkRXhwb3J0cy5kZWxldGUoZSl9Y2hlY2tSZWRlY2xhcmF0aW9uSW5TY29wZSh0LGUscyxpKXt0aGlzLmlzUmVkZWNsYXJlZEluU2NvcGUodCxlLHMpJiZ0aGlzLnJhaXNlKGksZi5WYXJSZWRlY2xhcmF0aW9uLGUpfWlzUmVkZWNsYXJlZEluU2NvcGUodCxlLHMpe3JldHVybiEhKDEmcykmJig4JnM/dC5sZXhpY2FsLmluZGV4T2YoZSk+LTF8fHQuZnVuY3Rpb25zLmluZGV4T2YoZSk+LTF8fHQudmFyLmluZGV4T2YoZSk+LTE6MTYmcz90LmxleGljYWwuaW5kZXhPZihlKT4tMXx8IXRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUodCkmJnQudmFyLmluZGV4T2YoZSk+LTE6dC5sZXhpY2FsLmluZGV4T2YoZSk+LTEmJiEoOCZ0LmZsYWdzJiZ0LmxleGljYWxbMF09PT1lKXx8IXRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUodCkmJnQuZnVuY3Rpb25zLmluZGV4T2YoZSk+LTEpfWNoZWNrTG9jYWxFeHBvcnQodCl7LTE9PT10aGlzLnNjb3BlU3RhY2tbMF0ubGV4aWNhbC5pbmRleE9mKHQubmFtZSkmJi0xPT09dGhpcy5zY29wZVN0YWNrWzBdLnZhci5pbmRleE9mKHQubmFtZSkmJi0xPT09dGhpcy5zY29wZVN0YWNrWzBdLmZ1bmN0aW9ucy5pbmRleE9mKHQubmFtZSkmJnRoaXMudW5kZWZpbmVkRXhwb3J0cy5zZXQodC5uYW1lLHQuc3RhcnQpfWN1cnJlbnRTY29wZSgpe3JldHVybiB0aGlzLnNjb3BlU3RhY2tbdGhpcy5zY29wZVN0YWNrLmxlbmd0aC0xXX1jdXJyZW50VmFyU2NvcGUoKXtmb3IobGV0IHQ9dGhpcy5zY29wZVN0YWNrLmxlbmd0aC0xOzt0LS0pe2NvbnN0IGU9dGhpcy5zY29wZVN0YWNrW3RdO2lmKDEzMSZlLmZsYWdzKXJldHVybiBlfX1jdXJyZW50VGhpc1Njb3BlKCl7Zm9yKGxldCB0PXRoaXMuc2NvcGVTdGFjay5sZW5ndGgtMTs7dC0tKXtjb25zdCBlPXRoaXMuc2NvcGVTdGFja1t0XTtpZigoMTMxJmUuZmxhZ3N8fDY0JmUuZmxhZ3MpJiYhKDQmZS5mbGFncykpcmV0dXJuIGV9fX1jbGFzcyAkIGV4dGVuZHMgUXtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLnR5cGVzPVtdLHRoaXMuZW51bXM9W10sdGhpcy5jb25zdEVudW1zPVtdLHRoaXMuY2xhc3Nlcz1bXSx0aGlzLmV4cG9ydE9ubHlCaW5kaW5ncz1bXX19Y2xhc3MgWiBleHRlbmRzIFl7Y3JlYXRlU2NvcGUodCl7cmV0dXJuIG5ldyAkKHQpfWRlY2xhcmVOYW1lKHQsZSxzKXtjb25zdCBpPXRoaXMuY3VycmVudFNjb3BlKCk7aWYoMTAyNCZlKXJldHVybiB0aGlzLm1heWJlRXhwb3J0RGVmaW5lZChpLHQpLHZvaWQgaS5leHBvcnRPbmx5QmluZGluZ3MucHVzaCh0KTtzdXBlci5kZWNsYXJlTmFtZSguLi5hcmd1bWVudHMpLDImZSYmKDEmZXx8KHRoaXMuY2hlY2tSZWRlY2xhcmF0aW9uSW5TY29wZShpLHQsZSxzKSx0aGlzLm1heWJlRXhwb3J0RGVmaW5lZChpLHQpKSxpLnR5cGVzLnB1c2godCkpLDI1NiZlJiZpLmVudW1zLnB1c2godCksNTEyJmUmJmkuY29uc3RFbnVtcy5wdXNoKHQpLDEyOCZlJiZpLmNsYXNzZXMucHVzaCh0KX1pc1JlZGVjbGFyZWRJblNjb3BlKHQsZSxzKXtpZih0LmVudW1zLmluZGV4T2YoZSk+LTEpe2lmKDI1NiZzKXtyZXR1cm4hISg1MTImcykhPT10LmNvbnN0RW51bXMuaW5kZXhPZihlKT4tMX1yZXR1cm4hMH1yZXR1cm4gMTI4JnMmJnQuY2xhc3Nlcy5pbmRleE9mKGUpPi0xP3QubGV4aWNhbC5pbmRleE9mKGUpPi0xJiYhISgxJnMpOiEhKDImcyYmdC50eXBlcy5pbmRleE9mKGUpPi0xKXx8c3VwZXIuaXNSZWRlY2xhcmVkSW5TY29wZSguLi5hcmd1bWVudHMpfWNoZWNrTG9jYWxFeHBvcnQodCl7LTE9PT10aGlzLnNjb3BlU3RhY2tbMF0udHlwZXMuaW5kZXhPZih0Lm5hbWUpJiYtMT09PXRoaXMuc2NvcGVTdGFja1swXS5leHBvcnRPbmx5QmluZGluZ3MuaW5kZXhPZih0Lm5hbWUpJiZzdXBlci5jaGVja0xvY2FsRXhwb3J0KHQpfX1jbGFzcyB0dHtjb25zdHJ1Y3Rvcigpe3RoaXMuc3RhY2tzPVtdfWVudGVyKHQpe3RoaXMuc3RhY2tzLnB1c2godCl9ZXhpdCgpe3RoaXMuc3RhY2tzLnBvcCgpfWN1cnJlbnRGbGFncygpe3JldHVybiB0aGlzLnN0YWNrc1t0aGlzLnN0YWNrcy5sZW5ndGgtMV19Z2V0IGhhc0F3YWl0KCl7cmV0dXJuKDImdGhpcy5jdXJyZW50RmxhZ3MoKSk+MH1nZXQgaGFzWWllbGQoKXtyZXR1cm4oMSZ0aGlzLmN1cnJlbnRGbGFncygpKT4wfWdldCBoYXNSZXR1cm4oKXtyZXR1cm4oNCZ0aGlzLmN1cnJlbnRGbGFncygpKT4wfX1mdW5jdGlvbiBldCh0LGUpe3JldHVybih0PzI6MCl8KGU/MTowKX1mdW5jdGlvbiBzdCh0KXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgXCIuY29uY2F0KHQsXCIgdmFsdWUuXCIpKTtyZXR1cm4gdH1mdW5jdGlvbiBpdCh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoXCJBc3NlcnQgZmFpbFwiKX1jb25zdCBydD1PYmplY3QuZnJlZXplKHtDbGFzc01ldGhvZEhhc0RlY2xhcmU6XCJDbGFzcyBtZXRob2RzIGNhbm5vdCBoYXZlIHRoZSAnZGVjbGFyZScgbW9kaWZpZXJcIixDbGFzc01ldGhvZEhhc1JlYWRvbmx5OlwiQ2xhc3MgbWV0aG9kcyBjYW5ub3QgaGF2ZSB0aGUgJ3JlYWRvbmx5JyBtb2RpZmllclwiLERlY2xhcmVDbGFzc0ZpZWxkSGFzSW5pdGlhbGl6ZXI6XCInZGVjbGFyZScgY2xhc3MgZmllbGRzIGNhbm5vdCBoYXZlIGFuIGluaXRpYWxpemVyXCIsRHVwbGljYXRlTW9kaWZpZXI6XCJEdXBsaWNhdGUgbW9kaWZpZXI6ICclMCdcIixFbXB0eUhlcml0YWdlQ2xhdXNlVHlwZTpcIiclMCcgbGlzdCBjYW5ub3QgYmUgZW1wdHkuXCIsSW5kZXhTaWduYXR1cmVIYXNBYnN0cmFjdDpcIkluZGV4IHNpZ25hdHVyZXMgY2Fubm90IGhhdmUgdGhlICdhYnN0cmFjdCcgbW9kaWZpZXJcIixJbmRleFNpZ25hdHVyZUhhc0FjY2Vzc2liaWxpdHk6XCJJbmRleCBzaWduYXR1cmVzIGNhbm5vdCBoYXZlIGFuIGFjY2Vzc2liaWxpdHkgbW9kaWZpZXIgKCclMCcpXCIsSW5kZXhTaWduYXR1cmVIYXNTdGF0aWM6XCJJbmRleCBzaWduYXR1cmVzIGNhbm5vdCBoYXZlIHRoZSAnc3RhdGljJyBtb2RpZmllclwiLE9wdGlvbmFsVHlwZUJlZm9yZVJlcXVpcmVkOlwiQSByZXF1aXJlZCBlbGVtZW50IGNhbm5vdCBmb2xsb3cgYW4gb3B0aW9uYWwgZWxlbWVudC5cIixQYXR0ZXJuSXNPcHRpb25hbDpcIkEgYmluZGluZyBwYXR0ZXJuIHBhcmFtZXRlciBjYW5ub3QgYmUgb3B0aW9uYWwgaW4gYW4gaW1wbGVtZW50YXRpb24gc2lnbmF0dXJlLlwiLFByaXZhdGVFbGVtZW50SGFzQWJzdHJhY3Q6XCJQcml2YXRlIGVsZW1lbnRzIGNhbm5vdCBoYXZlIHRoZSAnYWJzdHJhY3QnIG1vZGlmaWVyLlwiLFByaXZhdGVFbGVtZW50SGFzQWNjZXNzaWJpbGl0eTpcIlByaXZhdGUgZWxlbWVudHMgY2Fubm90IGhhdmUgYW4gYWNjZXNzaWJpbGl0eSBtb2RpZmllciAoJyUwJylcIixUZW1wbGF0ZVR5cGVIYXNTdWJzdGl0dXRpb246XCJUZW1wbGF0ZSBsaXRlcmFsIHR5cGVzIGNhbm5vdCBoYXZlIGFueSBzdWJzdGl0dXRpb25cIixUeXBlQW5ub3RhdGlvbkFmdGVyQXNzaWduOlwiVHlwZSBhbm5vdGF0aW9ucyBtdXN0IGNvbWUgYmVmb3JlIGRlZmF1bHQgYXNzaWdubWVudHMsIGUuZy4gaW5zdGVhZCBvZiBgYWdlID0gMjU6IG51bWJlcmAgdXNlIGBhZ2U6IG51bWJlciA9IDI1YFwiLFVuZXhwZWN0ZWRSZWFkb25seTpcIidyZWFkb25seScgdHlwZSBtb2RpZmllciBpcyBvbmx5IHBlcm1pdHRlZCBvbiBhcnJheSBhbmQgdHVwbGUgbGl0ZXJhbCB0eXBlcy5cIixVbmV4cGVjdGVkVHlwZUFubm90YXRpb246XCJEaWQgbm90IGV4cGVjdCBhIHR5cGUgYW5ub3RhdGlvbiBoZXJlLlwiLFVuZXhwZWN0ZWRUeXBlQ2FzdEluUGFyYW1ldGVyOlwiVW5leHBlY3RlZCB0eXBlIGNhc3QgaW4gcGFyYW1ldGVyIHBvc2l0aW9uLlwiLFVuc3VwcG9ydGVkSW1wb3J0VHlwZUFyZ3VtZW50OlwiQXJndW1lbnQgaW4gYSB0eXBlIGltcG9ydCBtdXN0IGJlIGEgc3RyaW5nIGxpdGVyYWxcIixVbnN1cHBvcnRlZFBhcmFtZXRlclByb3BlcnR5S2luZDpcIkEgcGFyYW1ldGVyIHByb3BlcnR5IG1heSBub3QgYmUgZGVjbGFyZWQgdXNpbmcgYSBiaW5kaW5nIHBhdHRlcm4uXCIsVW5zdXBwb3J0ZWRTaWduYXR1cmVQYXJhbWV0ZXJLaW5kOlwiTmFtZSBpbiBhIHNpZ25hdHVyZSBtdXN0IGJlIGFuIElkZW50aWZpZXIsIE9iamVjdFBhdHRlcm4gb3IgQXJyYXlQYXR0ZXJuLCBpbnN0ZWFkIGdvdCAlMFwifSk7bi5wbGFjZWhvbGRlcj1uZXcgcyhcIiUlXCIse3N0YXJ0c0V4cHI6ITB9KTtmdW5jdGlvbiBhdCh0LGUpe3JldHVybiB0LnNvbWUodD0+QXJyYXkuaXNBcnJheSh0KT90WzBdPT09ZTp0PT09ZSl9ZnVuY3Rpb24gbnQodCxlLHMpe2NvbnN0IGk9dC5maW5kKHQ9PkFycmF5LmlzQXJyYXkodCk/dFswXT09PWU6dD09PWUpO3JldHVybiBpJiZBcnJheS5pc0FycmF5KGkpP2lbMV1bc106bnVsbH1jb25zdCBvdD1bXCJtaW5pbWFsXCIsXCJzbWFydFwiLFwiZnNoYXJwXCJdLGh0PVtcImhhc2hcIixcImJhclwiXTtjb25zdCBwdD17ZXN0cmVlOnQ9PmNsYXNzIGV4dGVuZHMgdHtlc3RyZWVQYXJzZVJlZ0V4cExpdGVyYWwoe3BhdHRlcm46dCxmbGFnczplfSl7bGV0IHM9bnVsbDt0cnl7cz1uZXcgUmVnRXhwKHQsZSl9Y2F0Y2godCl7fWNvbnN0IGk9dGhpcy5lc3RyZWVQYXJzZUxpdGVyYWwocyk7cmV0dXJuIGkucmVnZXg9e3BhdHRlcm46dCxmbGFnczplfSxpfWVzdHJlZVBhcnNlQmlnSW50TGl0ZXJhbCh0KXtjb25zdCBlPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBCaWdJbnQ/QmlnSW50KHQpOm51bGwscz10aGlzLmVzdHJlZVBhcnNlTGl0ZXJhbChlKTtyZXR1cm4gcy5iaWdpbnQ9U3RyaW5nKHMudmFsdWV8fHQpLHN9ZXN0cmVlUGFyc2VMaXRlcmFsKHQpe3JldHVybiB0aGlzLnBhcnNlTGl0ZXJhbCh0LFwiTGl0ZXJhbFwiKX1kaXJlY3RpdmVUb1N0bXQodCl7Y29uc3QgZT10LnZhbHVlLHM9dGhpcy5zdGFydE5vZGVBdCh0LnN0YXJ0LHQubG9jLnN0YXJ0KSxpPXRoaXMuc3RhcnROb2RlQXQoZS5zdGFydCxlLmxvYy5zdGFydCk7cmV0dXJuIGkudmFsdWU9ZS52YWx1ZSxpLnJhdz1lLmV4dHJhLnJhdyxzLmV4cHJlc3Npb249dGhpcy5maW5pc2hOb2RlQXQoaSxcIkxpdGVyYWxcIixlLmVuZCxlLmxvYy5lbmQpLHMuZGlyZWN0aXZlPWUuZXh0cmEucmF3LnNsaWNlKDEsLTEpLHRoaXMuZmluaXNoTm9kZUF0KHMsXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsdC5lbmQsdC5sb2MuZW5kKX1pbml0RnVuY3Rpb24odCxlKXtzdXBlci5pbml0RnVuY3Rpb24odCxlKSx0LmV4cHJlc3Npb249ITF9Y2hlY2tEZWNsYXJhdGlvbih0KXtEKHQpP3RoaXMuY2hlY2tEZWNsYXJhdGlvbih0LnZhbHVlKTpzdXBlci5jaGVja0RlY2xhcmF0aW9uKHQpfWNoZWNrR2V0dGVyU2V0dGVyUGFyYW1zKHQpe2NvbnN0IGU9dCxzPVwiZ2V0XCI9PT1lLmtpbmQ/MDoxLGk9ZS5zdGFydDtlLnZhbHVlLnBhcmFtcy5sZW5ndGghPT1zP1wiZ2V0XCI9PT10LmtpbmQ/dGhpcy5yYWlzZShpLGYuQmFkR2V0dGVyQXJpdHkpOnRoaXMucmFpc2UoaSxmLkJhZFNldHRlckFyaXR5KTpcInNldFwiPT09ZS5raW5kJiZcIlJlc3RFbGVtZW50XCI9PT1lLnZhbHVlLnBhcmFtc1swXS50eXBlJiZ0aGlzLnJhaXNlKGksZi5CYWRTZXR0ZXJSZXN0UGFyYW1ldGVyKX1jaGVja0xWYWwodCxlPTY0LHMsaSxyKXtzd2l0Y2godC50eXBlKXtjYXNlXCJPYmplY3RQYXR0ZXJuXCI6dC5wcm9wZXJ0aWVzLmZvckVhY2godD0+e3RoaXMuY2hlY2tMVmFsKFwiUHJvcGVydHlcIj09PXQudHlwZT90LnZhbHVlOnQsZSxzLFwib2JqZWN0IGRlc3RydWN0dXJpbmcgcGF0dGVyblwiLHIpfSk7YnJlYWs7ZGVmYXVsdDpzdXBlci5jaGVja0xWYWwodCxlLHMsaSxyKX19Y2hlY2tEdXBsaWNhdGVkUHJvdG8odCxlLHMpe2lmKFwiU3ByZWFkRWxlbWVudFwiPT09dC50eXBlfHx0LmNvbXB1dGVkfHx0Lm1ldGhvZHx8dC5zaG9ydGhhbmQpcmV0dXJuO2NvbnN0IGk9dC5rZXk7XCJfX3Byb3RvX19cIj09PShcIklkZW50aWZpZXJcIj09PWkudHlwZT9pLm5hbWU6U3RyaW5nKGkudmFsdWUpKSYmXCJpbml0XCI9PT10LmtpbmQmJihlLnVzZWQmJihzJiYtMT09PXMuZG91YmxlUHJvdG8/cy5kb3VibGVQcm90bz1pLnN0YXJ0OnRoaXMucmFpc2UoaS5zdGFydCxmLkR1cGxpY2F0ZVByb3RvKSksZS51c2VkPSEwKX1pc1ZhbGlkRGlyZWN0aXZlKHQpe3JldHVybiEoXCJFeHByZXNzaW9uU3RhdGVtZW50XCIhPT10LnR5cGV8fFwiTGl0ZXJhbFwiIT09dC5leHByZXNzaW9uLnR5cGV8fFwic3RyaW5nXCIhPXR5cGVvZiB0LmV4cHJlc3Npb24udmFsdWV8fHQuZXhwcmVzc2lvbi5leHRyYSYmdC5leHByZXNzaW9uLmV4dHJhLnBhcmVudGhlc2l6ZWQpfXN0bXRUb0RpcmVjdGl2ZSh0KXtjb25zdCBlPXN1cGVyLnN0bXRUb0RpcmVjdGl2ZSh0KSxzPXQuZXhwcmVzc2lvbi52YWx1ZTtyZXR1cm4gZS52YWx1ZS52YWx1ZT1zLGV9cGFyc2VCbG9ja0JvZHkodCxlLHMsaSl7c3VwZXIucGFyc2VCbG9ja0JvZHkodCxlLHMsaSk7Y29uc3Qgcj10LmRpcmVjdGl2ZXMubWFwKHQ9PnRoaXMuZGlyZWN0aXZlVG9TdG10KHQpKTt0LmJvZHk9ci5jb25jYXQodC5ib2R5KSxkZWxldGUgdC5kaXJlY3RpdmVzfXB1c2hDbGFzc01ldGhvZCh0LGUscyxpLHIsYSl7dGhpcy5wYXJzZU1ldGhvZChlLHMsaSxyLGEsXCJDbGFzc01ldGhvZFwiLCEwKSxlLnR5cGVQYXJhbWV0ZXJzJiYoZS52YWx1ZS50eXBlUGFyYW1ldGVycz1lLnR5cGVQYXJhbWV0ZXJzLGRlbGV0ZSBlLnR5cGVQYXJhbWV0ZXJzKSx0LmJvZHkucHVzaChlKX1wYXJzZUV4cHJBdG9tKHQpe3N3aXRjaCh0aGlzLnN0YXRlLnR5cGUpe2Nhc2Ugbi5udW06Y2FzZSBuLnN0cmluZzpyZXR1cm4gdGhpcy5lc3RyZWVQYXJzZUxpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7Y2FzZSBuLnJlZ2V4cDpyZXR1cm4gdGhpcy5lc3RyZWVQYXJzZVJlZ0V4cExpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7Y2FzZSBuLmJpZ2ludDpyZXR1cm4gdGhpcy5lc3RyZWVQYXJzZUJpZ0ludExpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7Y2FzZSBuLl9udWxsOnJldHVybiB0aGlzLmVzdHJlZVBhcnNlTGl0ZXJhbChudWxsKTtjYXNlIG4uX3RydWU6cmV0dXJuIHRoaXMuZXN0cmVlUGFyc2VMaXRlcmFsKCEwKTtjYXNlIG4uX2ZhbHNlOnJldHVybiB0aGlzLmVzdHJlZVBhcnNlTGl0ZXJhbCghMSk7ZGVmYXVsdDpyZXR1cm4gc3VwZXIucGFyc2VFeHByQXRvbSh0KX19cGFyc2VMaXRlcmFsKHQsZSxzLGkpe2NvbnN0IHI9c3VwZXIucGFyc2VMaXRlcmFsKHQsZSxzLGkpO3JldHVybiByLnJhdz1yLmV4dHJhLnJhdyxkZWxldGUgci5leHRyYSxyfXBhcnNlRnVuY3Rpb25Cb2R5KHQsZSxzPSExKXtzdXBlci5wYXJzZUZ1bmN0aW9uQm9keSh0LGUscyksdC5leHByZXNzaW9uPVwiQmxvY2tTdGF0ZW1lbnRcIiE9PXQuYm9keS50eXBlfXBhcnNlTWV0aG9kKHQsZSxzLGkscixhLG49ITEpe2xldCBvPXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIG8ua2luZD10LmtpbmQsbz1zdXBlci5wYXJzZU1ldGhvZChvLGUscyxpLHIsYSxuKSxvLnR5cGU9XCJGdW5jdGlvbkV4cHJlc3Npb25cIixkZWxldGUgby5raW5kLHQudmFsdWU9byxhPVwiQ2xhc3NNZXRob2RcIj09PWE/XCJNZXRob2REZWZpbml0aW9uXCI6YSx0aGlzLmZpbmlzaE5vZGUodCxhKX1wYXJzZU9iamVjdE1ldGhvZCh0LGUscyxpLHIpe2NvbnN0IGE9c3VwZXIucGFyc2VPYmplY3RNZXRob2QodCxlLHMsaSxyKTtyZXR1cm4gYSYmKGEudHlwZT1cIlByb3BlcnR5XCIsXCJtZXRob2RcIj09PWEua2luZCYmKGEua2luZD1cImluaXRcIiksYS5zaG9ydGhhbmQ9ITEpLGF9cGFyc2VPYmplY3RQcm9wZXJ0eSh0LGUscyxpLHIpe2NvbnN0IGE9c3VwZXIucGFyc2VPYmplY3RQcm9wZXJ0eSh0LGUscyxpLHIpO3JldHVybiBhJiYoYS5raW5kPVwiaW5pdFwiLGEudHlwZT1cIlByb3BlcnR5XCIpLGF9dG9Bc3NpZ25hYmxlKHQpe3JldHVybiBEKHQpPyh0aGlzLnRvQXNzaWduYWJsZSh0LnZhbHVlKSx0KTpzdXBlci50b0Fzc2lnbmFibGUodCl9dG9Bc3NpZ25hYmxlT2JqZWN0RXhwcmVzc2lvblByb3AodCxlKXtpZihcImdldFwiPT09dC5raW5kfHxcInNldFwiPT09dC5raW5kKXRocm93IHRoaXMucmFpc2UodC5rZXkuc3RhcnQsZi5QYXR0ZXJuSGFzQWNjZXNzb3IpO2lmKHQubWV0aG9kKXRocm93IHRoaXMucmFpc2UodC5rZXkuc3RhcnQsZi5QYXR0ZXJuSGFzTWV0aG9kKTtzdXBlci50b0Fzc2lnbmFibGVPYmplY3RFeHByZXNzaW9uUHJvcCh0LGUpfWZpbmlzaENhbGxFeHByZXNzaW9uKHQsZSl7cmV0dXJuIHN1cGVyLmZpbmlzaENhbGxFeHByZXNzaW9uKHQsZSksXCJJbXBvcnRcIj09PXQuY2FsbGVlLnR5cGUmJih0LnR5cGU9XCJJbXBvcnRFeHByZXNzaW9uXCIsdC5zb3VyY2U9dC5hcmd1bWVudHNbMF0sZGVsZXRlIHQuYXJndW1lbnRzLGRlbGV0ZSB0LmNhbGxlZSksdH10b1JlZmVyZW5jZWRMaXN0RGVlcCh0LGUpe3QmJnN1cGVyLnRvUmVmZXJlbmNlZExpc3REZWVwKHQsZSl9cGFyc2VFeHBvcnQodCl7c3dpdGNoKHN1cGVyLnBhcnNlRXhwb3J0KHQpLHQudHlwZSl7Y2FzZVwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIjp0LmV4cG9ydGVkPW51bGw7YnJlYWs7Y2FzZVwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiOjE9PT10LnNwZWNpZmllcnMubGVuZ3RoJiZcIkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllclwiPT09dC5zcGVjaWZpZXJzWzBdLnR5cGUmJih0LnR5cGU9XCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiLHQuZXhwb3J0ZWQ9dC5zcGVjaWZpZXJzWzBdLmV4cG9ydGVkLGRlbGV0ZSB0LnNwZWNpZmllcnMpfXJldHVybiB0fX0sanN4OnQ9PmNsYXNzIGV4dGVuZHMgdHtqc3hSZWFkVG9rZW4oKXtsZXQgdD1cIlwiLGU9dGhpcy5zdGF0ZS5wb3M7Zm9yKDs7KXtpZih0aGlzLnN0YXRlLnBvcz49dGhpcy5sZW5ndGgpdGhyb3cgdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LEouVW50ZXJtaW5hdGVkSnN4Q29udGVudCk7Y29uc3Qgcz10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpO3N3aXRjaChzKXtjYXNlIDYwOmNhc2UgMTIzOnJldHVybiB0aGlzLnN0YXRlLnBvcz09PXRoaXMuc3RhdGUuc3RhcnQ/NjA9PT1zJiZ0aGlzLnN0YXRlLmV4cHJBbGxvd2VkPygrK3RoaXMuc3RhdGUucG9zLHRoaXMuZmluaXNoVG9rZW4obi5qc3hUYWdTdGFydCkpOnN1cGVyLmdldFRva2VuRnJvbUNvZGUocyk6KHQrPXRoaXMuaW5wdXQuc2xpY2UoZSx0aGlzLnN0YXRlLnBvcyksdGhpcy5maW5pc2hUb2tlbihuLmpzeFRleHQsdCkpO2Nhc2UgMzg6dCs9dGhpcy5pbnB1dC5zbGljZShlLHRoaXMuc3RhdGUucG9zKSx0Kz10aGlzLmpzeFJlYWRFbnRpdHkoKSxlPXRoaXMuc3RhdGUucG9zO2JyZWFrO2RlZmF1bHQ6cChzKT8odCs9dGhpcy5pbnB1dC5zbGljZShlLHRoaXMuc3RhdGUucG9zKSx0Kz10aGlzLmpzeFJlYWROZXdMaW5lKCEwKSxlPXRoaXMuc3RhdGUucG9zKTorK3RoaXMuc3RhdGUucG9zfX19anN4UmVhZE5ld0xpbmUodCl7Y29uc3QgZT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpO2xldCBzO3JldHVybisrdGhpcy5zdGF0ZS5wb3MsMTM9PT1lJiYxMD09PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk/KCsrdGhpcy5zdGF0ZS5wb3Mscz10P1wiXFxuXCI6XCJcXHJcXG5cIik6cz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLCsrdGhpcy5zdGF0ZS5jdXJMaW5lLHRoaXMuc3RhdGUubGluZVN0YXJ0PXRoaXMuc3RhdGUucG9zLHN9anN4UmVhZFN0cmluZyh0KXtsZXQgZT1cIlwiLHM9Kyt0aGlzLnN0YXRlLnBvcztmb3IoOzspe2lmKHRoaXMuc3RhdGUucG9zPj10aGlzLmxlbmd0aCl0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQsZi5VbnRlcm1pbmF0ZWRTdHJpbmcpO2NvbnN0IGk9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtpZihpPT09dClicmVhazszOD09PWk/KGUrPXRoaXMuaW5wdXQuc2xpY2Uocyx0aGlzLnN0YXRlLnBvcyksZSs9dGhpcy5qc3hSZWFkRW50aXR5KCkscz10aGlzLnN0YXRlLnBvcyk6cChpKT8oZSs9dGhpcy5pbnB1dC5zbGljZShzLHRoaXMuc3RhdGUucG9zKSxlKz10aGlzLmpzeFJlYWROZXdMaW5lKCExKSxzPXRoaXMuc3RhdGUucG9zKTorK3RoaXMuc3RhdGUucG9zfXJldHVybiBlKz10aGlzLmlucHV0LnNsaWNlKHMsdGhpcy5zdGF0ZS5wb3MrKyksdGhpcy5maW5pc2hUb2tlbihuLnN0cmluZyxlKX1qc3hSZWFkRW50aXR5KCl7bGV0IHQsZT1cIlwiLHM9MCxpPXRoaXMuaW5wdXRbdGhpcy5zdGF0ZS5wb3NdO2NvbnN0IHI9Kyt0aGlzLnN0YXRlLnBvcztmb3IoO3RoaXMuc3RhdGUucG9zPHRoaXMubGVuZ3RoJiZzKys8MTA7KXtpZihpPXRoaXMuaW5wdXRbdGhpcy5zdGF0ZS5wb3MrK10sXCI7XCI9PT1pKXtcIiNcIj09PWVbMF0/XCJ4XCI9PT1lWzFdPyhlPWUuc3Vic3RyKDIpLFcudGVzdChlKSYmKHQ9U3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZSwxNikpKSk6KGU9ZS5zdWJzdHIoMSksSy50ZXN0KGUpJiYodD1TdHJpbmcuZnJvbUNvZGVQb2ludChwYXJzZUludChlLDEwKSkpKTp0PUhbZV07YnJlYWt9ZSs9aX1yZXR1cm4gdHx8KHRoaXMuc3RhdGUucG9zPXIsXCImXCIpfWpzeFJlYWRXb3JkKCl7bGV0IHQ7Y29uc3QgZT10aGlzLnN0YXRlLnBvcztkb3t0PXRoaXMuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMuc3RhdGUucG9zKX13aGlsZShTKHQpfHw0NT09PXQpO3JldHVybiB0aGlzLmZpbmlzaFRva2VuKG4uanN4TmFtZSx0aGlzLmlucHV0LnNsaWNlKGUsdGhpcy5zdGF0ZS5wb3MpKX1qc3hQYXJzZUlkZW50aWZpZXIoKXtjb25zdCB0PXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHRoaXMubWF0Y2gobi5qc3hOYW1lKT90Lm5hbWU9dGhpcy5zdGF0ZS52YWx1ZTp0aGlzLnN0YXRlLnR5cGUua2V5d29yZD90Lm5hbWU9dGhpcy5zdGF0ZS50eXBlLmtleXdvcmQ6dGhpcy51bmV4cGVjdGVkKCksdGhpcy5uZXh0KCksdGhpcy5maW5pc2hOb2RlKHQsXCJKU1hJZGVudGlmaWVyXCIpfWpzeFBhcnNlTmFtZXNwYWNlZE5hbWUoKXtjb25zdCB0PXRoaXMuc3RhdGUuc3RhcnQsZT10aGlzLnN0YXRlLnN0YXJ0TG9jLHM9dGhpcy5qc3hQYXJzZUlkZW50aWZpZXIoKTtpZighdGhpcy5lYXQobi5jb2xvbikpcmV0dXJuIHM7Y29uc3QgaT10aGlzLnN0YXJ0Tm9kZUF0KHQsZSk7cmV0dXJuIGkubmFtZXNwYWNlPXMsaS5uYW1lPXRoaXMuanN4UGFyc2VJZGVudGlmaWVyKCksdGhpcy5maW5pc2hOb2RlKGksXCJKU1hOYW1lc3BhY2VkTmFtZVwiKX1qc3hQYXJzZUVsZW1lbnROYW1lKCl7Y29uc3QgdD10aGlzLnN0YXRlLnN0YXJ0LGU9dGhpcy5zdGF0ZS5zdGFydExvYztsZXQgcz10aGlzLmpzeFBhcnNlTmFtZXNwYWNlZE5hbWUoKTtpZihcIkpTWE5hbWVzcGFjZWROYW1lXCI9PT1zLnR5cGUpcmV0dXJuIHM7Zm9yKDt0aGlzLmVhdChuLmRvdCk7KXtjb25zdCBpPXRoaXMuc3RhcnROb2RlQXQodCxlKTtpLm9iamVjdD1zLGkucHJvcGVydHk9dGhpcy5qc3hQYXJzZUlkZW50aWZpZXIoKSxzPXRoaXMuZmluaXNoTm9kZShpLFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiKX1yZXR1cm4gc31qc3hQYXJzZUF0dHJpYnV0ZVZhbHVlKCl7bGV0IHQ7c3dpdGNoKHRoaXMuc3RhdGUudHlwZSl7Y2FzZSBuLmJyYWNlTDpyZXR1cm4gdD10aGlzLnN0YXJ0Tm9kZSgpLHRoaXMubmV4dCgpLHQ9dGhpcy5qc3hQYXJzZUV4cHJlc3Npb25Db250YWluZXIodCksXCJKU1hFbXB0eUV4cHJlc3Npb25cIj09PXQuZXhwcmVzc2lvbi50eXBlJiZ0aGlzLnJhaXNlKHQuc3RhcnQsSi5BdHRyaWJ1dGVJc0VtcHR5KSx0O2Nhc2Ugbi5qc3hUYWdTdGFydDpjYXNlIG4uc3RyaW5nOnJldHVybiB0aGlzLnBhcnNlRXhwckF0b20oKTtkZWZhdWx0OnRocm93IHRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxKLlVuc3VwcG9ydGVkSnN4VmFsdWUpfX1qc3hQYXJzZUVtcHR5RXhwcmVzc2lvbigpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGVBdCh0aGlzLnN0YXRlLmxhc3RUb2tFbmQsdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlQXQodCxcIkpTWEVtcHR5RXhwcmVzc2lvblwiLHRoaXMuc3RhdGUuc3RhcnQsdGhpcy5zdGF0ZS5zdGFydExvYyl9anN4UGFyc2VTcHJlYWRDaGlsZCh0KXtyZXR1cm4gdGhpcy5uZXh0KCksdC5leHByZXNzaW9uPXRoaXMucGFyc2VFeHByZXNzaW9uKCksdGhpcy5leHBlY3Qobi5icmFjZVIpLHRoaXMuZmluaXNoTm9kZSh0LFwiSlNYU3ByZWFkQ2hpbGRcIil9anN4UGFyc2VFeHByZXNzaW9uQ29udGFpbmVyKHQpe3JldHVybiB0aGlzLm1hdGNoKG4uYnJhY2VSKT90LmV4cHJlc3Npb249dGhpcy5qc3hQYXJzZUVtcHR5RXhwcmVzc2lvbigpOnQuZXhwcmVzc2lvbj10aGlzLnBhcnNlRXhwcmVzc2lvbigpLHRoaXMuZXhwZWN0KG4uYnJhY2VSKSx0aGlzLmZpbmlzaE5vZGUodCxcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIil9anN4UGFyc2VBdHRyaWJ1dGUoKXtjb25zdCB0PXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHRoaXMuZWF0KG4uYnJhY2VMKT8odGhpcy5leHBlY3Qobi5lbGxpcHNpcyksdC5hcmd1bWVudD10aGlzLnBhcnNlTWF5YmVBc3NpZ24oKSx0aGlzLmV4cGVjdChuLmJyYWNlUiksdGhpcy5maW5pc2hOb2RlKHQsXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIikpOih0Lm5hbWU9dGhpcy5qc3hQYXJzZU5hbWVzcGFjZWROYW1lKCksdC52YWx1ZT10aGlzLmVhdChuLmVxKT90aGlzLmpzeFBhcnNlQXR0cmlidXRlVmFsdWUoKTpudWxsLHRoaXMuZmluaXNoTm9kZSh0LFwiSlNYQXR0cmlidXRlXCIpKX1qc3hQYXJzZU9wZW5pbmdFbGVtZW50QXQodCxlKXtjb25zdCBzPXRoaXMuc3RhcnROb2RlQXQodCxlKTtyZXR1cm4gdGhpcy5tYXRjaChuLmpzeFRhZ0VuZCk/KHRoaXMuZXhwZWN0KG4uanN4VGFnRW5kKSx0aGlzLmZpbmlzaE5vZGUocyxcIkpTWE9wZW5pbmdGcmFnbWVudFwiKSk6KHMubmFtZT10aGlzLmpzeFBhcnNlRWxlbWVudE5hbWUoKSx0aGlzLmpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUocykpfWpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUodCl7Y29uc3QgZT1bXTtmb3IoOyF0aGlzLm1hdGNoKG4uc2xhc2gpJiYhdGhpcy5tYXRjaChuLmpzeFRhZ0VuZCk7KWUucHVzaCh0aGlzLmpzeFBhcnNlQXR0cmlidXRlKCkpO3JldHVybiB0LmF0dHJpYnV0ZXM9ZSx0LnNlbGZDbG9zaW5nPXRoaXMuZWF0KG4uc2xhc2gpLHRoaXMuZXhwZWN0KG4uanN4VGFnRW5kKSx0aGlzLmZpbmlzaE5vZGUodCxcIkpTWE9wZW5pbmdFbGVtZW50XCIpfWpzeFBhcnNlQ2xvc2luZ0VsZW1lbnRBdCh0LGUpe2NvbnN0IHM9dGhpcy5zdGFydE5vZGVBdCh0LGUpO3JldHVybiB0aGlzLm1hdGNoKG4uanN4VGFnRW5kKT8odGhpcy5leHBlY3Qobi5qc3hUYWdFbmQpLHRoaXMuZmluaXNoTm9kZShzLFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCIpKToocy5uYW1lPXRoaXMuanN4UGFyc2VFbGVtZW50TmFtZSgpLHRoaXMuZXhwZWN0KG4uanN4VGFnRW5kKSx0aGlzLmZpbmlzaE5vZGUocyxcIkpTWENsb3NpbmdFbGVtZW50XCIpKX1qc3hQYXJzZUVsZW1lbnRBdCh0LGUpe2NvbnN0IHM9dGhpcy5zdGFydE5vZGVBdCh0LGUpLGk9W10scj10aGlzLmpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBdCh0LGUpO2xldCBhPW51bGw7aWYoIXIuc2VsZkNsb3Npbmcpe3Q6Zm9yKDs7KXN3aXRjaCh0aGlzLnN0YXRlLnR5cGUpe2Nhc2Ugbi5qc3hUYWdTdGFydDppZih0PXRoaXMuc3RhdGUuc3RhcnQsZT10aGlzLnN0YXRlLnN0YXJ0TG9jLHRoaXMubmV4dCgpLHRoaXMuZWF0KG4uc2xhc2gpKXthPXRoaXMuanN4UGFyc2VDbG9zaW5nRWxlbWVudEF0KHQsZSk7YnJlYWsgdH1pLnB1c2godGhpcy5qc3hQYXJzZUVsZW1lbnRBdCh0LGUpKTticmVhaztjYXNlIG4uanN4VGV4dDppLnB1c2godGhpcy5wYXJzZUV4cHJBdG9tKCkpO2JyZWFrO2Nhc2Ugbi5icmFjZUw6e2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTt0aGlzLm5leHQoKSx0aGlzLm1hdGNoKG4uZWxsaXBzaXMpP2kucHVzaCh0aGlzLmpzeFBhcnNlU3ByZWFkQ2hpbGQodCkpOmkucHVzaCh0aGlzLmpzeFBhcnNlRXhwcmVzc2lvbkNvbnRhaW5lcih0KSk7YnJlYWt9ZGVmYXVsdDp0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKX1YKHIpJiYhWChhKT90aGlzLnJhaXNlKGEuc3RhcnQsSi5NaXNzaW5nQ2xvc2luZ1RhZ0ZyYWdtZW50KTohWChyKSYmWChhKT90aGlzLnJhaXNlKGEuc3RhcnQsSi5NaXNzaW5nQ2xvc2luZ1RhZ0VsZW1lbnQsRyhyLm5hbWUpKTpYKHIpfHxYKGEpfHxHKGEubmFtZSkhPT1HKHIubmFtZSkmJnRoaXMucmFpc2UoYS5zdGFydCxKLk1pc3NpbmdDbG9zaW5nVGFnRWxlbWVudCxHKHIubmFtZSkpfWlmKFgocik/KHMub3BlbmluZ0ZyYWdtZW50PXIscy5jbG9zaW5nRnJhZ21lbnQ9YSk6KHMub3BlbmluZ0VsZW1lbnQ9cixzLmNsb3NpbmdFbGVtZW50PWEpLHMuY2hpbGRyZW49aSx0aGlzLmlzUmVsYXRpb25hbChcIjxcIikpdGhyb3cgdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LEouVW53cmFwcGVkQWRqYWNlbnRKU1hFbGVtZW50cyk7cmV0dXJuIFgocik/dGhpcy5maW5pc2hOb2RlKHMsXCJKU1hGcmFnbWVudFwiKTp0aGlzLmZpbmlzaE5vZGUocyxcIkpTWEVsZW1lbnRcIil9anN4UGFyc2VFbGVtZW50KCl7Y29uc3QgdD10aGlzLnN0YXRlLnN0YXJ0LGU9dGhpcy5zdGF0ZS5zdGFydExvYztyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5qc3hQYXJzZUVsZW1lbnRBdCh0LGUpfXBhcnNlRXhwckF0b20odCl7cmV0dXJuIHRoaXMubWF0Y2gobi5qc3hUZXh0KT90aGlzLnBhcnNlTGl0ZXJhbCh0aGlzLnN0YXRlLnZhbHVlLFwiSlNYVGV4dFwiKTp0aGlzLm1hdGNoKG4uanN4VGFnU3RhcnQpP3RoaXMuanN4UGFyc2VFbGVtZW50KCk6dGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpJiYzMyE9PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk/KHRoaXMuZmluaXNoVG9rZW4obi5qc3hUYWdTdGFydCksdGhpcy5qc3hQYXJzZUVsZW1lbnQoKSk6c3VwZXIucGFyc2VFeHByQXRvbSh0KX1nZXRUb2tlbkZyb21Db2RlKHQpe2lmKHRoaXMuc3RhdGUuaW5Qcm9wZXJ0eU5hbWUpcmV0dXJuIHN1cGVyLmdldFRva2VuRnJvbUNvZGUodCk7Y29uc3QgZT10aGlzLmN1ckNvbnRleHQoKTtpZihlPT09eC5qX2V4cHIpcmV0dXJuIHRoaXMuanN4UmVhZFRva2VuKCk7aWYoZT09PXgual9vVGFnfHxlPT09eC5qX2NUYWcpe2lmKHcodCkpcmV0dXJuIHRoaXMuanN4UmVhZFdvcmQoKTtpZig2Mj09PXQpcmV0dXJuKyt0aGlzLnN0YXRlLnBvcyx0aGlzLmZpbmlzaFRva2VuKG4uanN4VGFnRW5kKTtpZigoMzQ9PT10fHwzOT09PXQpJiZlPT09eC5qX29UYWcpcmV0dXJuIHRoaXMuanN4UmVhZFN0cmluZyh0KX1yZXR1cm4gNjA9PT10JiZ0aGlzLnN0YXRlLmV4cHJBbGxvd2VkJiYzMyE9PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcysxKT8oKyt0aGlzLnN0YXRlLnBvcyx0aGlzLmZpbmlzaFRva2VuKG4uanN4VGFnU3RhcnQpKTpzdXBlci5nZXRUb2tlbkZyb21Db2RlKHQpfXVwZGF0ZUNvbnRleHQodCl7aWYodGhpcy5tYXRjaChuLmJyYWNlTCkpe2NvbnN0IGU9dGhpcy5jdXJDb250ZXh0KCk7ZT09PXgual9vVGFnP3RoaXMuc3RhdGUuY29udGV4dC5wdXNoKHguYnJhY2VFeHByZXNzaW9uKTplPT09eC5qX2V4cHI/dGhpcy5zdGF0ZS5jb250ZXh0LnB1c2goeC50ZW1wbGF0ZVF1YXNpKTpzdXBlci51cGRhdGVDb250ZXh0KHQpLHRoaXMuc3RhdGUuZXhwckFsbG93ZWQ9ITB9ZWxzZXtpZighdGhpcy5tYXRjaChuLnNsYXNoKXx8dCE9PW4uanN4VGFnU3RhcnQpcmV0dXJuIHN1cGVyLnVwZGF0ZUNvbnRleHQodCk7dGhpcy5zdGF0ZS5jb250ZXh0Lmxlbmd0aC09Mix0aGlzLnN0YXRlLmNvbnRleHQucHVzaCh4LmpfY1RhZyksdGhpcy5zdGF0ZS5leHByQWxsb3dlZD0hMX19fSxmbG93OnQ9PmNsYXNzIGV4dGVuZHMgdHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5mbG93UHJhZ21hPXZvaWQgMH1zaG91bGRQYXJzZVR5cGVzKCl7cmV0dXJuIHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiZmxvd1wiLFwiYWxsXCIpfHxcImZsb3dcIj09PXRoaXMuZmxvd1ByYWdtYX1zaG91bGRQYXJzZUVudW1zKCl7cmV0dXJuISF0aGlzLmdldFBsdWdpbk9wdGlvbihcImZsb3dcIixcImVudW1zXCIpfWZpbmlzaFRva2VuKHQsZSl7cmV0dXJuIHQhPT1uLnN0cmluZyYmdCE9PW4uc2VtaSYmdCE9PW4uaW50ZXJwcmV0ZXJEaXJlY3RpdmUmJnZvaWQgMD09PXRoaXMuZmxvd1ByYWdtYSYmKHRoaXMuZmxvd1ByYWdtYT1udWxsKSxzdXBlci5maW5pc2hUb2tlbih0LGUpfWFkZENvbW1lbnQodCl7aWYodm9pZCAwPT09dGhpcy5mbG93UHJhZ21hKXtjb25zdCBlPXouZXhlYyh0LnZhbHVlKTtpZihlKWlmKFwiZmxvd1wiPT09ZVsxXSl0aGlzLmZsb3dQcmFnbWE9XCJmbG93XCI7ZWxzZXtpZihcIm5vZmxvd1wiIT09ZVsxXSl0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGZsb3cgcHJhZ21hXCIpO3RoaXMuZmxvd1ByYWdtYT1cIm5vZmxvd1wifWVsc2U7fXJldHVybiBzdXBlci5hZGRDb21tZW50KHQpfWZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcih0KXtjb25zdCBlPXRoaXMuc3RhdGUuaW5UeXBlO3RoaXMuc3RhdGUuaW5UeXBlPSEwLHRoaXMuZXhwZWN0KHR8fG4uY29sb24pO2NvbnN0IHM9dGhpcy5mbG93UGFyc2VUeXBlKCk7cmV0dXJuIHRoaXMuc3RhdGUuaW5UeXBlPWUsc31mbG93UGFyc2VQcmVkaWNhdGUoKXtjb25zdCB0PXRoaXMuc3RhcnROb2RlKCksZT10aGlzLnN0YXRlLnN0YXJ0TG9jLHM9dGhpcy5zdGF0ZS5zdGFydDt0aGlzLmV4cGVjdChuLm1vZHVsbyk7Y29uc3QgaT10aGlzLnN0YXRlLnN0YXJ0TG9jO3JldHVybiB0aGlzLmV4cGVjdENvbnRleHR1YWwoXCJjaGVja3NcIiksZS5saW5lPT09aS5saW5lJiZlLmNvbHVtbj09PWkuY29sdW1uLTF8fHRoaXMucmFpc2UocyxqLlVuZXhwZWN0ZWRTcGFjZUJldHdlZW5Nb2R1bG9DaGVja3MpLHRoaXMuZWF0KG4ucGFyZW5MKT8odC52YWx1ZT10aGlzLnBhcnNlRXhwcmVzc2lvbigpLHRoaXMuZXhwZWN0KG4ucGFyZW5SKSx0aGlzLmZpbmlzaE5vZGUodCxcIkRlY2xhcmVkUHJlZGljYXRlXCIpKTp0aGlzLmZpbmlzaE5vZGUodCxcIkluZmVycmVkUHJlZGljYXRlXCIpfWZsb3dQYXJzZVR5cGVBbmRQcmVkaWNhdGVJbml0aWFsaXNlcigpe2NvbnN0IHQ9dGhpcy5zdGF0ZS5pblR5cGU7dGhpcy5zdGF0ZS5pblR5cGU9ITAsdGhpcy5leHBlY3Qobi5jb2xvbik7bGV0IGU9bnVsbCxzPW51bGw7cmV0dXJuIHRoaXMubWF0Y2gobi5tb2R1bG8pPyh0aGlzLnN0YXRlLmluVHlwZT10LHM9dGhpcy5mbG93UGFyc2VQcmVkaWNhdGUoKSk6KGU9dGhpcy5mbG93UGFyc2VUeXBlKCksdGhpcy5zdGF0ZS5pblR5cGU9dCx0aGlzLm1hdGNoKG4ubW9kdWxvKSYmKHM9dGhpcy5mbG93UGFyc2VQcmVkaWNhdGUoKSkpLFtlLHNdfWZsb3dQYXJzZURlY2xhcmVDbGFzcyh0KXtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5mbG93UGFyc2VJbnRlcmZhY2Vpc2godCwhMCksdGhpcy5maW5pc2hOb2RlKHQsXCJEZWNsYXJlQ2xhc3NcIil9Zmxvd1BhcnNlRGVjbGFyZUZ1bmN0aW9uKHQpe3RoaXMubmV4dCgpO2NvbnN0IGU9dC5pZD10aGlzLnBhcnNlSWRlbnRpZmllcigpLHM9dGhpcy5zdGFydE5vZGUoKSxpPXRoaXMuc3RhcnROb2RlKCk7dGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpP3MudHlwZVBhcmFtZXRlcnM9dGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTpzLnR5cGVQYXJhbWV0ZXJzPW51bGwsdGhpcy5leHBlY3Qobi5wYXJlbkwpO2NvbnN0IHI9dGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXMoKTtyZXR1cm4gcy5wYXJhbXM9ci5wYXJhbXMscy5yZXN0PXIucmVzdCx0aGlzLmV4cGVjdChuLnBhcmVuUiksW3MucmV0dXJuVHlwZSx0LnByZWRpY2F0ZV09dGhpcy5mbG93UGFyc2VUeXBlQW5kUHJlZGljYXRlSW5pdGlhbGlzZXIoKSxpLnR5cGVBbm5vdGF0aW9uPXRoaXMuZmluaXNoTm9kZShzLFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiKSxlLnR5cGVBbm5vdGF0aW9uPXRoaXMuZmluaXNoTm9kZShpLFwiVHlwZUFubm90YXRpb25cIiksdGhpcy5yZXNldEVuZExvY2F0aW9uKGUpLHRoaXMuc2VtaWNvbG9uKCksdGhpcy5maW5pc2hOb2RlKHQsXCJEZWNsYXJlRnVuY3Rpb25cIil9Zmxvd1BhcnNlRGVjbGFyZSh0LGUpe2lmKHRoaXMubWF0Y2gobi5fY2xhc3MpKXJldHVybiB0aGlzLmZsb3dQYXJzZURlY2xhcmVDbGFzcyh0KTtpZih0aGlzLm1hdGNoKG4uX2Z1bmN0aW9uKSlyZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlRnVuY3Rpb24odCk7aWYodGhpcy5tYXRjaChuLl92YXIpKXJldHVybiB0aGlzLmZsb3dQYXJzZURlY2xhcmVWYXJpYWJsZSh0KTtpZih0aGlzLmVhdENvbnRleHR1YWwoXCJtb2R1bGVcIikpcmV0dXJuIHRoaXMubWF0Y2gobi5kb3QpP3RoaXMuZmxvd1BhcnNlRGVjbGFyZU1vZHVsZUV4cG9ydHModCk6KGUmJnRoaXMucmFpc2UodGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnQsai5OZXN0ZWREZWNsYXJlTW9kdWxlKSx0aGlzLmZsb3dQYXJzZURlY2xhcmVNb2R1bGUodCkpO2lmKHRoaXMuaXNDb250ZXh0dWFsKFwidHlwZVwiKSlyZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlVHlwZUFsaWFzKHQpO2lmKHRoaXMuaXNDb250ZXh0dWFsKFwib3BhcXVlXCIpKXJldHVybiB0aGlzLmZsb3dQYXJzZURlY2xhcmVPcGFxdWVUeXBlKHQpO2lmKHRoaXMuaXNDb250ZXh0dWFsKFwiaW50ZXJmYWNlXCIpKXJldHVybiB0aGlzLmZsb3dQYXJzZURlY2xhcmVJbnRlcmZhY2UodCk7aWYodGhpcy5tYXRjaChuLl9leHBvcnQpKXJldHVybiB0aGlzLmZsb3dQYXJzZURlY2xhcmVFeHBvcnREZWNsYXJhdGlvbih0LGUpO3Rocm93IHRoaXMudW5leHBlY3RlZCgpfWZsb3dQYXJzZURlY2xhcmVWYXJpYWJsZSh0KXtyZXR1cm4gdGhpcy5uZXh0KCksdC5pZD10aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0YWJsZUlkZW50aWZpZXIoITApLHRoaXMuc2NvcGUuZGVjbGFyZU5hbWUodC5pZC5uYW1lLDUsdC5pZC5zdGFydCksdGhpcy5zZW1pY29sb24oKSx0aGlzLmZpbmlzaE5vZGUodCxcIkRlY2xhcmVWYXJpYWJsZVwiKX1mbG93UGFyc2VEZWNsYXJlTW9kdWxlKHQpe3RoaXMuc2NvcGUuZW50ZXIoMCksdGhpcy5tYXRjaChuLnN0cmluZyk/dC5pZD10aGlzLnBhcnNlRXhwckF0b20oKTp0LmlkPXRoaXMucGFyc2VJZGVudGlmaWVyKCk7Y29uc3QgZT10LmJvZHk9dGhpcy5zdGFydE5vZGUoKSxzPWUuYm9keT1bXTtmb3IodGhpcy5leHBlY3Qobi5icmFjZUwpOyF0aGlzLm1hdGNoKG4uYnJhY2VSKTspe2xldCB0PXRoaXMuc3RhcnROb2RlKCk7dGhpcy5tYXRjaChuLl9pbXBvcnQpPyh0aGlzLm5leHQoKSx0aGlzLmlzQ29udGV4dHVhbChcInR5cGVcIil8fHRoaXMubWF0Y2gobi5fdHlwZW9mKXx8dGhpcy5yYWlzZSh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCxqLkludmFsaWROb25UeXBlSW1wb3J0SW5EZWNsYXJlTW9kdWxlKSx0aGlzLnBhcnNlSW1wb3J0KHQpKToodGhpcy5leHBlY3RDb250ZXh0dWFsKFwiZGVjbGFyZVwiLGouVW5zdXBwb3J0ZWRTdGF0ZW1lbnRJbkRlY2xhcmVNb2R1bGUpLHQ9dGhpcy5mbG93UGFyc2VEZWNsYXJlKHQsITApKSxzLnB1c2godCl9dGhpcy5zY29wZS5leGl0KCksdGhpcy5leHBlY3Qobi5icmFjZVIpLHRoaXMuZmluaXNoTm9kZShlLFwiQmxvY2tTdGF0ZW1lbnRcIik7bGV0IGk9bnVsbCxyPSExO3JldHVybiBzLmZvckVhY2godD0+eyFmdW5jdGlvbih0KXtyZXR1cm5cIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvblwiPT09dC50eXBlfHxcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiPT09dC50eXBlJiYoIXQuZGVjbGFyYXRpb258fFwiVHlwZUFsaWFzXCIhPT10LmRlY2xhcmF0aW9uLnR5cGUmJlwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIiE9PXQuZGVjbGFyYXRpb24udHlwZSl9KHQpP1wiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIj09PXQudHlwZSYmKHImJnRoaXMucmFpc2UodC5zdGFydCxqLkR1cGxpY2F0ZURlY2xhcmVNb2R1bGVFeHBvcnRzKSxcIkVTXCI9PT1pJiZ0aGlzLnJhaXNlKHQuc3RhcnQsai5BbWJpZ3VvdXNEZWNsYXJlTW9kdWxlS2luZCksaT1cIkNvbW1vbkpTXCIscj0hMCk6KFwiQ29tbW9uSlNcIj09PWkmJnRoaXMucmFpc2UodC5zdGFydCxqLkFtYmlndW91c0RlY2xhcmVNb2R1bGVLaW5kKSxpPVwiRVNcIil9KSx0LmtpbmQ9aXx8XCJDb21tb25KU1wiLHRoaXMuZmluaXNoTm9kZSh0LFwiRGVjbGFyZU1vZHVsZVwiKX1mbG93UGFyc2VEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb24odCxlKXtpZih0aGlzLmV4cGVjdChuLl9leHBvcnQpLHRoaXMuZWF0KG4uX2RlZmF1bHQpKXJldHVybiB0aGlzLm1hdGNoKG4uX2Z1bmN0aW9uKXx8dGhpcy5tYXRjaChuLl9jbGFzcyk/dC5kZWNsYXJhdGlvbj10aGlzLmZsb3dQYXJzZURlY2xhcmUodGhpcy5zdGFydE5vZGUoKSk6KHQuZGVjbGFyYXRpb249dGhpcy5mbG93UGFyc2VUeXBlKCksdGhpcy5zZW1pY29sb24oKSksdC5kZWZhdWx0PSEwLHRoaXMuZmluaXNoTm9kZSh0LFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCIpO2lmKHRoaXMubWF0Y2gobi5fY29uc3QpfHx0aGlzLmlzTGV0KCl8fCh0aGlzLmlzQ29udGV4dHVhbChcInR5cGVcIil8fHRoaXMuaXNDb250ZXh0dWFsKFwiaW50ZXJmYWNlXCIpKSYmIWUpe2NvbnN0IHQ9dGhpcy5zdGF0ZS52YWx1ZSxlPVZbdF07dGhyb3cgdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LGouVW5zdXBwb3J0ZWREZWNsYXJlRXhwb3J0S2luZCx0LGUpfWlmKHRoaXMubWF0Y2gobi5fdmFyKXx8dGhpcy5tYXRjaChuLl9mdW5jdGlvbil8fHRoaXMubWF0Y2gobi5fY2xhc3MpfHx0aGlzLmlzQ29udGV4dHVhbChcIm9wYXF1ZVwiKSlyZXR1cm4gdC5kZWNsYXJhdGlvbj10aGlzLmZsb3dQYXJzZURlY2xhcmUodGhpcy5zdGFydE5vZGUoKSksdC5kZWZhdWx0PSExLHRoaXMuZmluaXNoTm9kZSh0LFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCIpO2lmKHRoaXMubWF0Y2gobi5zdGFyKXx8dGhpcy5tYXRjaChuLmJyYWNlTCl8fHRoaXMuaXNDb250ZXh0dWFsKFwiaW50ZXJmYWNlXCIpfHx0aGlzLmlzQ29udGV4dHVhbChcInR5cGVcIil8fHRoaXMuaXNDb250ZXh0dWFsKFwib3BhcXVlXCIpKXJldHVyblwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiPT09KHQ9dGhpcy5wYXJzZUV4cG9ydCh0KSkudHlwZSYmKHQudHlwZT1cIkV4cG9ydERlY2xhcmF0aW9uXCIsdC5kZWZhdWx0PSExLGRlbGV0ZSB0LmV4cG9ydEtpbmQpLHQudHlwZT1cIkRlY2xhcmVcIit0LnR5cGUsdDt0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKX1mbG93UGFyc2VEZWNsYXJlTW9kdWxlRXhwb3J0cyh0KXtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5leHBlY3RDb250ZXh0dWFsKFwiZXhwb3J0c1wiKSx0LnR5cGVBbm5vdGF0aW9uPXRoaXMuZmxvd1BhcnNlVHlwZUFubm90YXRpb24oKSx0aGlzLnNlbWljb2xvbigpLHRoaXMuZmluaXNoTm9kZSh0LFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIil9Zmxvd1BhcnNlRGVjbGFyZVR5cGVBbGlhcyh0KXtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5mbG93UGFyc2VUeXBlQWxpYXModCksdC50eXBlPVwiRGVjbGFyZVR5cGVBbGlhc1wiLHR9Zmxvd1BhcnNlRGVjbGFyZU9wYXF1ZVR5cGUodCl7cmV0dXJuIHRoaXMubmV4dCgpLHRoaXMuZmxvd1BhcnNlT3BhcXVlVHlwZSh0LCEwKSx0LnR5cGU9XCJEZWNsYXJlT3BhcXVlVHlwZVwiLHR9Zmxvd1BhcnNlRGVjbGFyZUludGVyZmFjZSh0KXtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5mbG93UGFyc2VJbnRlcmZhY2Vpc2godCksdGhpcy5maW5pc2hOb2RlKHQsXCJEZWNsYXJlSW50ZXJmYWNlXCIpfWZsb3dQYXJzZUludGVyZmFjZWlzaCh0LGU9ITEpe2lmKHQuaWQ9dGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcighZSwhMCksdGhpcy5zY29wZS5kZWNsYXJlTmFtZSh0LmlkLm5hbWUsZT8xNzo5LHQuaWQuc3RhcnQpLHRoaXMuaXNSZWxhdGlvbmFsKFwiPFwiKT90LnR5cGVQYXJhbWV0ZXJzPXRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCk6dC50eXBlUGFyYW1ldGVycz1udWxsLHQuZXh0ZW5kcz1bXSx0LmltcGxlbWVudHM9W10sdC5taXhpbnM9W10sdGhpcy5lYXQobi5fZXh0ZW5kcykpZG97dC5leHRlbmRzLnB1c2godGhpcy5mbG93UGFyc2VJbnRlcmZhY2VFeHRlbmRzKCkpfXdoaWxlKCFlJiZ0aGlzLmVhdChuLmNvbW1hKSk7aWYodGhpcy5pc0NvbnRleHR1YWwoXCJtaXhpbnNcIikpe3RoaXMubmV4dCgpO2Rve3QubWl4aW5zLnB1c2godGhpcy5mbG93UGFyc2VJbnRlcmZhY2VFeHRlbmRzKCkpfXdoaWxlKHRoaXMuZWF0KG4uY29tbWEpKX1pZih0aGlzLmlzQ29udGV4dHVhbChcImltcGxlbWVudHNcIikpe3RoaXMubmV4dCgpO2Rve3QuaW1wbGVtZW50cy5wdXNoKHRoaXMuZmxvd1BhcnNlSW50ZXJmYWNlRXh0ZW5kcygpKX13aGlsZSh0aGlzLmVhdChuLmNvbW1hKSl9dC5ib2R5PXRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZSh7YWxsb3dTdGF0aWM6ZSxhbGxvd0V4YWN0OiExLGFsbG93U3ByZWFkOiExLGFsbG93UHJvdG86ZSxhbGxvd0luZXhhY3Q6ITF9KX1mbG93UGFyc2VJbnRlcmZhY2VFeHRlbmRzKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0LmlkPXRoaXMuZmxvd1BhcnNlUXVhbGlmaWVkVHlwZUlkZW50aWZpZXIoKSx0aGlzLmlzUmVsYXRpb25hbChcIjxcIik/dC50eXBlUGFyYW1ldGVycz10aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKCk6dC50eXBlUGFyYW1ldGVycz1udWxsLHRoaXMuZmluaXNoTm9kZSh0LFwiSW50ZXJmYWNlRXh0ZW5kc1wiKX1mbG93UGFyc2VJbnRlcmZhY2UodCl7cmV0dXJuIHRoaXMuZmxvd1BhcnNlSW50ZXJmYWNlaXNoKHQpLHRoaXMuZmluaXNoTm9kZSh0LFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIil9Y2hlY2tOb3RVbmRlcnNjb3JlKHQpe1wiX1wiPT09dCYmdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LGouVW5leHBlY3RlZFJlc2VydmVkVW5kZXJzY29yZSl9Y2hlY2tSZXNlcnZlZFR5cGUodCxlLHMpe18uaGFzKHQpJiZ0aGlzLnJhaXNlKGUscz9qLkFzc2lnblJlc2VydmVkVHlwZTpqLlVuZXhwZWN0ZWRSZXNlcnZlZFR5cGUsdCl9Zmxvd1BhcnNlUmVzdHJpY3RlZElkZW50aWZpZXIodCxlKXtyZXR1cm4gdGhpcy5jaGVja1Jlc2VydmVkVHlwZSh0aGlzLnN0YXRlLnZhbHVlLHRoaXMuc3RhdGUuc3RhcnQsZSksdGhpcy5wYXJzZUlkZW50aWZpZXIodCl9Zmxvd1BhcnNlVHlwZUFsaWFzKHQpe3JldHVybiB0LmlkPXRoaXMuZmxvd1BhcnNlUmVzdHJpY3RlZElkZW50aWZpZXIoITEsITApLHRoaXMuc2NvcGUuZGVjbGFyZU5hbWUodC5pZC5uYW1lLDksdC5pZC5zdGFydCksdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpP3QudHlwZVBhcmFtZXRlcnM9dGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTp0LnR5cGVQYXJhbWV0ZXJzPW51bGwsdC5yaWdodD10aGlzLmZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcihuLmVxKSx0aGlzLnNlbWljb2xvbigpLHRoaXMuZmluaXNoTm9kZSh0LFwiVHlwZUFsaWFzXCIpfWZsb3dQYXJzZU9wYXF1ZVR5cGUodCxlKXtyZXR1cm4gdGhpcy5leHBlY3RDb250ZXh0dWFsKFwidHlwZVwiKSx0LmlkPXRoaXMuZmxvd1BhcnNlUmVzdHJpY3RlZElkZW50aWZpZXIoITAsITApLHRoaXMuc2NvcGUuZGVjbGFyZU5hbWUodC5pZC5uYW1lLDksdC5pZC5zdGFydCksdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpP3QudHlwZVBhcmFtZXRlcnM9dGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTp0LnR5cGVQYXJhbWV0ZXJzPW51bGwsdC5zdXBlcnR5cGU9bnVsbCx0aGlzLm1hdGNoKG4uY29sb24pJiYodC5zdXBlcnR5cGU9dGhpcy5mbG93UGFyc2VUeXBlSW5pdGlhbGlzZXIobi5jb2xvbikpLHQuaW1wbHR5cGU9bnVsbCxlfHwodC5pbXBsdHlwZT10aGlzLmZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcihuLmVxKSksdGhpcy5zZW1pY29sb24oKSx0aGlzLmZpbmlzaE5vZGUodCxcIk9wYXF1ZVR5cGVcIil9Zmxvd1BhcnNlVHlwZVBhcmFtZXRlcih0PSExKXtjb25zdCBlPXRoaXMuc3RhdGUuc3RhcnQscz10aGlzLnN0YXJ0Tm9kZSgpLGk9dGhpcy5mbG93UGFyc2VWYXJpYW5jZSgpLHI9dGhpcy5mbG93UGFyc2VUeXBlQW5ub3RhdGFibGVJZGVudGlmaWVyKCk7cmV0dXJuIHMubmFtZT1yLm5hbWUscy52YXJpYW5jZT1pLHMuYm91bmQ9ci50eXBlQW5ub3RhdGlvbix0aGlzLm1hdGNoKG4uZXEpPyh0aGlzLmVhdChuLmVxKSxzLmRlZmF1bHQ9dGhpcy5mbG93UGFyc2VUeXBlKCkpOnQmJnRoaXMucmFpc2UoZSxqLk1pc3NpbmdUeXBlUGFyYW1EZWZhdWx0KSx0aGlzLmZpbmlzaE5vZGUocyxcIlR5cGVQYXJhbWV0ZXJcIil9Zmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCl7Y29uc3QgdD10aGlzLnN0YXRlLmluVHlwZSxlPXRoaXMuc3RhcnROb2RlKCk7ZS5wYXJhbXM9W10sdGhpcy5zdGF0ZS5pblR5cGU9ITAsdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpfHx0aGlzLm1hdGNoKG4uanN4VGFnU3RhcnQpP3RoaXMubmV4dCgpOnRoaXMudW5leHBlY3RlZCgpO2xldCBzPSExO2Rve2NvbnN0IHQ9dGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyKHMpO2UucGFyYW1zLnB1c2godCksdC5kZWZhdWx0JiYocz0hMCksdGhpcy5pc1JlbGF0aW9uYWwoXCI+XCIpfHx0aGlzLmV4cGVjdChuLmNvbW1hKX13aGlsZSghdGhpcy5pc1JlbGF0aW9uYWwoXCI+XCIpKTtyZXR1cm4gdGhpcy5leHBlY3RSZWxhdGlvbmFsKFwiPlwiKSx0aGlzLnN0YXRlLmluVHlwZT10LHRoaXMuZmluaXNoTm9kZShlLFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpfWZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpLGU9dGhpcy5zdGF0ZS5pblR5cGU7dC5wYXJhbXM9W10sdGhpcy5zdGF0ZS5pblR5cGU9ITAsdGhpcy5leHBlY3RSZWxhdGlvbmFsKFwiPFwiKTtjb25zdCBzPXRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlO2Zvcih0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZT0hMTshdGhpcy5pc1JlbGF0aW9uYWwoXCI+XCIpOyl0LnBhcmFtcy5wdXNoKHRoaXMuZmxvd1BhcnNlVHlwZSgpKSx0aGlzLmlzUmVsYXRpb25hbChcIj5cIil8fHRoaXMuZXhwZWN0KG4uY29tbWEpO3JldHVybiB0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZT1zLHRoaXMuZXhwZWN0UmVsYXRpb25hbChcIj5cIiksdGhpcy5zdGF0ZS5pblR5cGU9ZSx0aGlzLmZpbmlzaE5vZGUodCxcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpfWZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uQ2FsbE9yTmV3KCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpLGU9dGhpcy5zdGF0ZS5pblR5cGU7Zm9yKHQucGFyYW1zPVtdLHRoaXMuc3RhdGUuaW5UeXBlPSEwLHRoaXMuZXhwZWN0UmVsYXRpb25hbChcIjxcIik7IXRoaXMuaXNSZWxhdGlvbmFsKFwiPlwiKTspdC5wYXJhbXMucHVzaCh0aGlzLmZsb3dQYXJzZVR5cGVPckltcGxpY2l0SW5zdGFudGlhdGlvbigpKSx0aGlzLmlzUmVsYXRpb25hbChcIj5cIil8fHRoaXMuZXhwZWN0KG4uY29tbWEpO3JldHVybiB0aGlzLmV4cGVjdFJlbGF0aW9uYWwoXCI+XCIpLHRoaXMuc3RhdGUuaW5UeXBlPWUsdGhpcy5maW5pc2hOb2RlKHQsXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKX1mbG93UGFyc2VJbnRlcmZhY2VUeXBlKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO2lmKHRoaXMuZXhwZWN0Q29udGV4dHVhbChcImludGVyZmFjZVwiKSx0LmV4dGVuZHM9W10sdGhpcy5lYXQobi5fZXh0ZW5kcykpZG97dC5leHRlbmRzLnB1c2godGhpcy5mbG93UGFyc2VJbnRlcmZhY2VFeHRlbmRzKCkpfXdoaWxlKHRoaXMuZWF0KG4uY29tbWEpKTtyZXR1cm4gdC5ib2R5PXRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZSh7YWxsb3dTdGF0aWM6ITEsYWxsb3dFeGFjdDohMSxhbGxvd1NwcmVhZDohMSxhbGxvd1Byb3RvOiExLGFsbG93SW5leGFjdDohMX0pLHRoaXMuZmluaXNoTm9kZSh0LFwiSW50ZXJmYWNlVHlwZUFubm90YXRpb25cIil9Zmxvd1BhcnNlT2JqZWN0UHJvcGVydHlLZXkoKXtyZXR1cm4gdGhpcy5tYXRjaChuLm51bSl8fHRoaXMubWF0Y2gobi5zdHJpbmcpP3RoaXMucGFyc2VFeHByQXRvbSgpOnRoaXMucGFyc2VJZGVudGlmaWVyKCEwKX1mbG93UGFyc2VPYmplY3RUeXBlSW5kZXhlcih0LGUscyl7cmV0dXJuIHQuc3RhdGljPWUsdGhpcy5sb29rYWhlYWQoKS50eXBlPT09bi5jb2xvbj8odC5pZD10aGlzLmZsb3dQYXJzZU9iamVjdFByb3BlcnR5S2V5KCksdC5rZXk9dGhpcy5mbG93UGFyc2VUeXBlSW5pdGlhbGlzZXIoKSk6KHQuaWQ9bnVsbCx0LmtleT10aGlzLmZsb3dQYXJzZVR5cGUoKSksdGhpcy5leHBlY3Qobi5icmFja2V0UiksdC52YWx1ZT10aGlzLmZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcigpLHQudmFyaWFuY2U9cyx0aGlzLmZpbmlzaE5vZGUodCxcIk9iamVjdFR5cGVJbmRleGVyXCIpfWZsb3dQYXJzZU9iamVjdFR5cGVJbnRlcm5hbFNsb3QodCxlKXtyZXR1cm4gdC5zdGF0aWM9ZSx0LmlkPXRoaXMuZmxvd1BhcnNlT2JqZWN0UHJvcGVydHlLZXkoKSx0aGlzLmV4cGVjdChuLmJyYWNrZXRSKSx0aGlzLmV4cGVjdChuLmJyYWNrZXRSKSx0aGlzLmlzUmVsYXRpb25hbChcIjxcIil8fHRoaXMubWF0Y2gobi5wYXJlbkwpPyh0Lm1ldGhvZD0hMCx0Lm9wdGlvbmFsPSExLHQudmFsdWU9dGhpcy5mbG93UGFyc2VPYmplY3RUeXBlTWV0aG9kaXNoKHRoaXMuc3RhcnROb2RlQXQodC5zdGFydCx0LmxvYy5zdGFydCkpKToodC5tZXRob2Q9ITEsdGhpcy5lYXQobi5xdWVzdGlvbikmJih0Lm9wdGlvbmFsPSEwKSx0LnZhbHVlPXRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKCkpLHRoaXMuZmluaXNoTm9kZSh0LFwiT2JqZWN0VHlwZUludGVybmFsU2xvdFwiKX1mbG93UGFyc2VPYmplY3RUeXBlTWV0aG9kaXNoKHQpe2Zvcih0LnBhcmFtcz1bXSx0LnJlc3Q9bnVsbCx0LnR5cGVQYXJhbWV0ZXJzPW51bGwsdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpJiYodC50eXBlUGFyYW1ldGVycz10aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpKSx0aGlzLmV4cGVjdChuLnBhcmVuTCk7IXRoaXMubWF0Y2gobi5wYXJlblIpJiYhdGhpcy5tYXRjaChuLmVsbGlwc2lzKTspdC5wYXJhbXMucHVzaCh0aGlzLmZsb3dQYXJzZUZ1bmN0aW9uVHlwZVBhcmFtKCkpLHRoaXMubWF0Y2gobi5wYXJlblIpfHx0aGlzLmV4cGVjdChuLmNvbW1hKTtyZXR1cm4gdGhpcy5lYXQobi5lbGxpcHNpcykmJih0LnJlc3Q9dGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbSgpKSx0aGlzLmV4cGVjdChuLnBhcmVuUiksdC5yZXR1cm5UeXBlPXRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKCksdGhpcy5maW5pc2hOb2RlKHQsXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpfWZsb3dQYXJzZU9iamVjdFR5cGVDYWxsUHJvcGVydHkodCxlKXtjb25zdCBzPXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHQuc3RhdGljPWUsdC52YWx1ZT10aGlzLmZsb3dQYXJzZU9iamVjdFR5cGVNZXRob2Rpc2gocyksdGhpcy5maW5pc2hOb2RlKHQsXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIpfWZsb3dQYXJzZU9iamVjdFR5cGUoe2FsbG93U3RhdGljOnQsYWxsb3dFeGFjdDplLGFsbG93U3ByZWFkOnMsYWxsb3dQcm90bzppLGFsbG93SW5leGFjdDpyfSl7Y29uc3QgYT10aGlzLnN0YXRlLmluVHlwZTt0aGlzLnN0YXRlLmluVHlwZT0hMDtjb25zdCBvPXRoaXMuc3RhcnROb2RlKCk7bGV0IGgscDtvLmNhbGxQcm9wZXJ0aWVzPVtdLG8ucHJvcGVydGllcz1bXSxvLmluZGV4ZXJzPVtdLG8uaW50ZXJuYWxTbG90cz1bXTtsZXQgYz0hMTtmb3IoZSYmdGhpcy5tYXRjaChuLmJyYWNlQmFyTCk/KHRoaXMuZXhwZWN0KG4uYnJhY2VCYXJMKSxoPW4uYnJhY2VCYXJSLHA9ITApOih0aGlzLmV4cGVjdChuLmJyYWNlTCksaD1uLmJyYWNlUixwPSExKSxvLmV4YWN0PXA7IXRoaXMubWF0Y2goaCk7KXtsZXQgZT0hMSxhPW51bGwsaD1udWxsO2NvbnN0IHU9dGhpcy5zdGFydE5vZGUoKTtpZihpJiZ0aGlzLmlzQ29udGV4dHVhbChcInByb3RvXCIpKXtjb25zdCBlPXRoaXMubG9va2FoZWFkKCk7ZS50eXBlIT09bi5jb2xvbiYmZS50eXBlIT09bi5xdWVzdGlvbiYmKHRoaXMubmV4dCgpLGE9dGhpcy5zdGF0ZS5zdGFydCx0PSExKX1pZih0JiZ0aGlzLmlzQ29udGV4dHVhbChcInN0YXRpY1wiKSl7Y29uc3QgdD10aGlzLmxvb2thaGVhZCgpO3QudHlwZSE9PW4uY29sb24mJnQudHlwZSE9PW4ucXVlc3Rpb24mJih0aGlzLm5leHQoKSxlPSEwKX1jb25zdCBsPXRoaXMuZmxvd1BhcnNlVmFyaWFuY2UoKTtpZih0aGlzLmVhdChuLmJyYWNrZXRMKSludWxsIT1hJiZ0aGlzLnVuZXhwZWN0ZWQoYSksdGhpcy5lYXQobi5icmFja2V0TCk/KGwmJnRoaXMudW5leHBlY3RlZChsLnN0YXJ0KSxvLmludGVybmFsU2xvdHMucHVzaCh0aGlzLmZsb3dQYXJzZU9iamVjdFR5cGVJbnRlcm5hbFNsb3QodSxlKSkpOm8uaW5kZXhlcnMucHVzaCh0aGlzLmZsb3dQYXJzZU9iamVjdFR5cGVJbmRleGVyKHUsZSxsKSk7ZWxzZSBpZih0aGlzLm1hdGNoKG4ucGFyZW5MKXx8dGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpKW51bGwhPWEmJnRoaXMudW5leHBlY3RlZChhKSxsJiZ0aGlzLnVuZXhwZWN0ZWQobC5zdGFydCksby5jYWxsUHJvcGVydGllcy5wdXNoKHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eSh1LGUpKTtlbHNle2xldCB0PVwiaW5pdFwiO2lmKHRoaXMuaXNDb250ZXh0dWFsKFwiZ2V0XCIpfHx0aGlzLmlzQ29udGV4dHVhbChcInNldFwiKSl7Y29uc3QgZT10aGlzLmxvb2thaGVhZCgpO2UudHlwZSE9PW4ubmFtZSYmZS50eXBlIT09bi5zdHJpbmcmJmUudHlwZSE9PW4ubnVtfHwodD10aGlzLnN0YXRlLnZhbHVlLHRoaXMubmV4dCgpKX1jb25zdCBpPXRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZVByb3BlcnR5KHUsZSxhLGwsdCxzLG51bGwhPXI/cjohcCk7bnVsbD09PWk/KGM9ITAsaD10aGlzLnN0YXRlLmxhc3RUb2tTdGFydCk6by5wcm9wZXJ0aWVzLnB1c2goaSl9dGhpcy5mbG93T2JqZWN0VHlwZVNlbWljb2xvbigpLCFofHx0aGlzLm1hdGNoKG4uYnJhY2VSKXx8dGhpcy5tYXRjaChuLmJyYWNlQmFyUil8fHRoaXMucmFpc2UoaCxqLlVuZXhwZWN0ZWRFeHBsaWNpdEluZXhhY3RJbk9iamVjdCl9dGhpcy5leHBlY3QoaCkscyYmKG8uaW5leGFjdD1jKTtjb25zdCB1PXRoaXMuZmluaXNoTm9kZShvLFwiT2JqZWN0VHlwZUFubm90YXRpb25cIik7cmV0dXJuIHRoaXMuc3RhdGUuaW5UeXBlPWEsdX1mbG93UGFyc2VPYmplY3RUeXBlUHJvcGVydHkodCxlLHMsaSxyLGEsbyl7aWYodGhpcy5lYXQobi5lbGxpcHNpcykpe3JldHVybiB0aGlzLm1hdGNoKG4uY29tbWEpfHx0aGlzLm1hdGNoKG4uc2VtaSl8fHRoaXMubWF0Y2gobi5icmFjZVIpfHx0aGlzLm1hdGNoKG4uYnJhY2VCYXJSKT8oYT9vfHx0aGlzLnJhaXNlKHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0LGouSW5leGFjdEluc2lkZUV4YWN0KTp0aGlzLnJhaXNlKHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0LGouSW5leGFjdEluc2lkZU5vbk9iamVjdCksaSYmdGhpcy5yYWlzZShpLnN0YXJ0LGouSW5leGFjdFZhcmlhbmNlKSxudWxsKTooYXx8dGhpcy5yYWlzZSh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCxqLlVuZXhwZWN0ZWRTcHJlYWRUeXBlKSxudWxsIT1zJiZ0aGlzLnVuZXhwZWN0ZWQocyksaSYmdGhpcy5yYWlzZShpLnN0YXJ0LGouU3ByZWFkVmFyaWFuY2UpLHQuYXJndW1lbnQ9dGhpcy5mbG93UGFyc2VUeXBlKCksdGhpcy5maW5pc2hOb2RlKHQsXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIikpfXt0LmtleT10aGlzLmZsb3dQYXJzZU9iamVjdFByb3BlcnR5S2V5KCksdC5zdGF0aWM9ZSx0LnByb3RvPW51bGwhPXMsdC5raW5kPXI7bGV0IGE9ITE7cmV0dXJuIHRoaXMuaXNSZWxhdGlvbmFsKFwiPFwiKXx8dGhpcy5tYXRjaChuLnBhcmVuTCk/KHQubWV0aG9kPSEwLG51bGwhPXMmJnRoaXMudW5leHBlY3RlZChzKSxpJiZ0aGlzLnVuZXhwZWN0ZWQoaS5zdGFydCksdC52YWx1ZT10aGlzLmZsb3dQYXJzZU9iamVjdFR5cGVNZXRob2Rpc2godGhpcy5zdGFydE5vZGVBdCh0LnN0YXJ0LHQubG9jLnN0YXJ0KSksXCJnZXRcIiE9PXImJlwic2V0XCIhPT1yfHx0aGlzLmZsb3dDaGVja0dldHRlclNldHRlclBhcmFtcyh0KSk6KFwiaW5pdFwiIT09ciYmdGhpcy51bmV4cGVjdGVkKCksdC5tZXRob2Q9ITEsdGhpcy5lYXQobi5xdWVzdGlvbikmJihhPSEwKSx0LnZhbHVlPXRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKCksdC52YXJpYW5jZT1pKSx0Lm9wdGlvbmFsPWEsdGhpcy5maW5pc2hOb2RlKHQsXCJPYmplY3RUeXBlUHJvcGVydHlcIil9fWZsb3dDaGVja0dldHRlclNldHRlclBhcmFtcyh0KXtjb25zdCBlPVwiZ2V0XCI9PT10LmtpbmQ/MDoxLHM9dC5zdGFydDt0LnZhbHVlLnBhcmFtcy5sZW5ndGgrKHQudmFsdWUucmVzdD8xOjApIT09ZSYmKFwiZ2V0XCI9PT10LmtpbmQ/dGhpcy5yYWlzZShzLGYuQmFkR2V0dGVyQXJpdHkpOnRoaXMucmFpc2UocyxmLkJhZFNldHRlckFyaXR5KSksXCJzZXRcIj09PXQua2luZCYmdC52YWx1ZS5yZXN0JiZ0aGlzLnJhaXNlKHMsZi5CYWRTZXR0ZXJSZXN0UGFyYW1ldGVyKX1mbG93T2JqZWN0VHlwZVNlbWljb2xvbigpe3RoaXMuZWF0KG4uc2VtaSl8fHRoaXMuZWF0KG4uY29tbWEpfHx0aGlzLm1hdGNoKG4uYnJhY2VSKXx8dGhpcy5tYXRjaChuLmJyYWNlQmFyUil8fHRoaXMudW5leHBlY3RlZCgpfWZsb3dQYXJzZVF1YWxpZmllZFR5cGVJZGVudGlmaWVyKHQsZSxzKXt0PXR8fHRoaXMuc3RhdGUuc3RhcnQsZT1lfHx0aGlzLnN0YXRlLnN0YXJ0TG9jO2xldCBpPXN8fHRoaXMuZmxvd1BhcnNlUmVzdHJpY3RlZElkZW50aWZpZXIoITApO2Zvcig7dGhpcy5lYXQobi5kb3QpOyl7Y29uc3Qgcz10aGlzLnN0YXJ0Tm9kZUF0KHQsZSk7cy5xdWFsaWZpY2F0aW9uPWkscy5pZD10aGlzLmZsb3dQYXJzZVJlc3RyaWN0ZWRJZGVudGlmaWVyKCEwKSxpPXRoaXMuZmluaXNoTm9kZShzLFwiUXVhbGlmaWVkVHlwZUlkZW50aWZpZXJcIil9cmV0dXJuIGl9Zmxvd1BhcnNlR2VuZXJpY1R5cGUodCxlLHMpe2NvbnN0IGk9dGhpcy5zdGFydE5vZGVBdCh0LGUpO3JldHVybiBpLnR5cGVQYXJhbWV0ZXJzPW51bGwsaS5pZD10aGlzLmZsb3dQYXJzZVF1YWxpZmllZFR5cGVJZGVudGlmaWVyKHQsZSxzKSx0aGlzLmlzUmVsYXRpb25hbChcIjxcIikmJihpLnR5cGVQYXJhbWV0ZXJzPXRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24oKSksdGhpcy5maW5pc2hOb2RlKGksXCJHZW5lcmljVHlwZUFubm90YXRpb25cIil9Zmxvd1BhcnNlVHlwZW9mVHlwZSgpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5leHBlY3Qobi5fdHlwZW9mKSx0LmFyZ3VtZW50PXRoaXMuZmxvd1BhcnNlUHJpbWFyeVR5cGUoKSx0aGlzLmZpbmlzaE5vZGUodCxcIlR5cGVvZlR5cGVBbm5vdGF0aW9uXCIpfWZsb3dQYXJzZVR1cGxlVHlwZSgpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtmb3IodC50eXBlcz1bXSx0aGlzLmV4cGVjdChuLmJyYWNrZXRMKTt0aGlzLnN0YXRlLnBvczx0aGlzLmxlbmd0aCYmIXRoaXMubWF0Y2gobi5icmFja2V0UikmJih0LnR5cGVzLnB1c2godGhpcy5mbG93UGFyc2VUeXBlKCkpLCF0aGlzLm1hdGNoKG4uYnJhY2tldFIpKTspdGhpcy5leHBlY3Qobi5jb21tYSk7cmV0dXJuIHRoaXMuZXhwZWN0KG4uYnJhY2tldFIpLHRoaXMuZmluaXNoTm9kZSh0LFwiVHVwbGVUeXBlQW5ub3RhdGlvblwiKX1mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbSgpe2xldCB0PW51bGwsZT0hMSxzPW51bGw7Y29uc3QgaT10aGlzLnN0YXJ0Tm9kZSgpLHI9dGhpcy5sb29rYWhlYWQoKTtyZXR1cm4gci50eXBlPT09bi5jb2xvbnx8ci50eXBlPT09bi5xdWVzdGlvbj8odD10aGlzLnBhcnNlSWRlbnRpZmllcigpLHRoaXMuZWF0KG4ucXVlc3Rpb24pJiYoZT0hMCkscz10aGlzLmZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcigpKTpzPXRoaXMuZmxvd1BhcnNlVHlwZSgpLGkubmFtZT10LGkub3B0aW9uYWw9ZSxpLnR5cGVBbm5vdGF0aW9uPXMsdGhpcy5maW5pc2hOb2RlKGksXCJGdW5jdGlvblR5cGVQYXJhbVwiKX1yZWludGVycHJldFR5cGVBc0Z1bmN0aW9uVHlwZVBhcmFtKHQpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGVBdCh0LnN0YXJ0LHQubG9jLnN0YXJ0KTtyZXR1cm4gZS5uYW1lPW51bGwsZS5vcHRpb25hbD0hMSxlLnR5cGVBbm5vdGF0aW9uPXQsdGhpcy5maW5pc2hOb2RlKGUsXCJGdW5jdGlvblR5cGVQYXJhbVwiKX1mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXModD1bXSl7bGV0IGU9bnVsbDtmb3IoOyF0aGlzLm1hdGNoKG4ucGFyZW5SKSYmIXRoaXMubWF0Y2gobi5lbGxpcHNpcyk7KXQucHVzaCh0aGlzLmZsb3dQYXJzZUZ1bmN0aW9uVHlwZVBhcmFtKCkpLHRoaXMubWF0Y2gobi5wYXJlblIpfHx0aGlzLmV4cGVjdChuLmNvbW1hKTtyZXR1cm4gdGhpcy5lYXQobi5lbGxpcHNpcykmJihlPXRoaXMuZmxvd1BhcnNlRnVuY3Rpb25UeXBlUGFyYW0oKSkse3BhcmFtczp0LHJlc3Q6ZX19Zmxvd0lkZW50VG9UeXBlQW5ub3RhdGlvbih0LGUscyxpKXtzd2l0Y2goaS5uYW1lKXtjYXNlXCJhbnlcIjpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKHMsXCJBbnlUeXBlQW5ub3RhdGlvblwiKTtjYXNlXCJib29sXCI6Y2FzZVwiYm9vbGVhblwiOnJldHVybiB0aGlzLmZpbmlzaE5vZGUocyxcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiKTtjYXNlXCJtaXhlZFwiOnJldHVybiB0aGlzLmZpbmlzaE5vZGUocyxcIk1peGVkVHlwZUFubm90YXRpb25cIik7Y2FzZVwiZW1wdHlcIjpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKHMsXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCIpO2Nhc2VcIm51bWJlclwiOnJldHVybiB0aGlzLmZpbmlzaE5vZGUocyxcIk51bWJlclR5cGVBbm5vdGF0aW9uXCIpO2Nhc2VcInN0cmluZ1wiOnJldHVybiB0aGlzLmZpbmlzaE5vZGUocyxcIlN0cmluZ1R5cGVBbm5vdGF0aW9uXCIpO2Nhc2VcInN5bWJvbFwiOnJldHVybiB0aGlzLmZpbmlzaE5vZGUocyxcIlN5bWJvbFR5cGVBbm5vdGF0aW9uXCIpO2RlZmF1bHQ6cmV0dXJuIHRoaXMuY2hlY2tOb3RVbmRlcnNjb3JlKGkubmFtZSksdGhpcy5mbG93UGFyc2VHZW5lcmljVHlwZSh0LGUsaSl9fWZsb3dQYXJzZVByaW1hcnlUeXBlKCl7Y29uc3QgdD10aGlzLnN0YXRlLnN0YXJ0LGU9dGhpcy5zdGF0ZS5zdGFydExvYyxzPXRoaXMuc3RhcnROb2RlKCk7bGV0IGkscixhPSExO2NvbnN0IG89dGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGU7c3dpdGNoKHRoaXMuc3RhdGUudHlwZSl7Y2FzZSBuLm5hbWU6cmV0dXJuIHRoaXMuaXNDb250ZXh0dWFsKFwiaW50ZXJmYWNlXCIpP3RoaXMuZmxvd1BhcnNlSW50ZXJmYWNlVHlwZSgpOnRoaXMuZmxvd0lkZW50VG9UeXBlQW5ub3RhdGlvbih0LGUscyx0aGlzLnBhcnNlSWRlbnRpZmllcigpKTtjYXNlIG4uYnJhY2VMOnJldHVybiB0aGlzLmZsb3dQYXJzZU9iamVjdFR5cGUoe2FsbG93U3RhdGljOiExLGFsbG93RXhhY3Q6ITEsYWxsb3dTcHJlYWQ6ITAsYWxsb3dQcm90bzohMSxhbGxvd0luZXhhY3Q6ITB9KTtjYXNlIG4uYnJhY2VCYXJMOnJldHVybiB0aGlzLmZsb3dQYXJzZU9iamVjdFR5cGUoe2FsbG93U3RhdGljOiExLGFsbG93RXhhY3Q6ITAsYWxsb3dTcHJlYWQ6ITAsYWxsb3dQcm90bzohMSxhbGxvd0luZXhhY3Q6ITF9KTtjYXNlIG4uYnJhY2tldEw6cmV0dXJuIHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlPSExLHI9dGhpcy5mbG93UGFyc2VUdXBsZVR5cGUoKSx0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZT1vLHI7Y2FzZSBuLnJlbGF0aW9uYWw6aWYoXCI8XCI9PT10aGlzLnN0YXRlLnZhbHVlKXJldHVybiBzLnR5cGVQYXJhbWV0ZXJzPXRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCksdGhpcy5leHBlY3Qobi5wYXJlbkwpLGk9dGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXMoKSxzLnBhcmFtcz1pLnBhcmFtcyxzLnJlc3Q9aS5yZXN0LHRoaXMuZXhwZWN0KG4ucGFyZW5SKSx0aGlzLmV4cGVjdChuLmFycm93KSxzLnJldHVyblR5cGU9dGhpcy5mbG93UGFyc2VUeXBlKCksdGhpcy5maW5pc2hOb2RlKHMsXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpO2JyZWFrO2Nhc2Ugbi5wYXJlbkw6aWYodGhpcy5uZXh0KCksIXRoaXMubWF0Y2gobi5wYXJlblIpJiYhdGhpcy5tYXRjaChuLmVsbGlwc2lzKSlpZih0aGlzLm1hdGNoKG4ubmFtZSkpe2NvbnN0IHQ9dGhpcy5sb29rYWhlYWQoKS50eXBlO2E9dCE9PW4ucXVlc3Rpb24mJnQhPT1uLmNvbG9ufWVsc2UgYT0hMDtpZihhKXtpZih0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZT0hMSxyPXRoaXMuZmxvd1BhcnNlVHlwZSgpLHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlPW8sdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGV8fCEodGhpcy5tYXRjaChuLmNvbW1hKXx8dGhpcy5tYXRjaChuLnBhcmVuUikmJnRoaXMubG9va2FoZWFkKCkudHlwZT09PW4uYXJyb3cpKXJldHVybiB0aGlzLmV4cGVjdChuLnBhcmVuUikscjt0aGlzLmVhdChuLmNvbW1hKX1yZXR1cm4gaT1yP3RoaXMuZmxvd1BhcnNlRnVuY3Rpb25UeXBlUGFyYW1zKFt0aGlzLnJlaW50ZXJwcmV0VHlwZUFzRnVuY3Rpb25UeXBlUGFyYW0ocildKTp0aGlzLmZsb3dQYXJzZUZ1bmN0aW9uVHlwZVBhcmFtcygpLHMucGFyYW1zPWkucGFyYW1zLHMucmVzdD1pLnJlc3QsdGhpcy5leHBlY3Qobi5wYXJlblIpLHRoaXMuZXhwZWN0KG4uYXJyb3cpLHMucmV0dXJuVHlwZT10aGlzLmZsb3dQYXJzZVR5cGUoKSxzLnR5cGVQYXJhbWV0ZXJzPW51bGwsdGhpcy5maW5pc2hOb2RlKHMsXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpO2Nhc2Ugbi5zdHJpbmc6cmV0dXJuIHRoaXMucGFyc2VMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUsXCJTdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb25cIik7Y2FzZSBuLl90cnVlOmNhc2Ugbi5fZmFsc2U6cmV0dXJuIHMudmFsdWU9dGhpcy5tYXRjaChuLl90cnVlKSx0aGlzLm5leHQoKSx0aGlzLmZpbmlzaE5vZGUocyxcIkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb25cIik7Y2FzZSBuLnBsdXNNaW46aWYoXCItXCI9PT10aGlzLnN0YXRlLnZhbHVlKXtpZih0aGlzLm5leHQoKSx0aGlzLm1hdGNoKG4ubnVtKSlyZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWwoLXRoaXMuc3RhdGUudmFsdWUsXCJOdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb25cIixzLnN0YXJ0LHMubG9jLnN0YXJ0KTtpZih0aGlzLm1hdGNoKG4uYmlnaW50KSlyZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWwoLXRoaXMuc3RhdGUudmFsdWUsXCJCaWdJbnRMaXRlcmFsVHlwZUFubm90YXRpb25cIixzLnN0YXJ0LHMubG9jLnN0YXJ0KTt0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQsai5VbmV4cGVjdGVkU3VidHJhY3Rpb25PcGVyYW5kKX10aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtjYXNlIG4ubnVtOnJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbCh0aGlzLnN0YXRlLnZhbHVlLFwiTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIpO2Nhc2Ugbi5iaWdpbnQ6cmV0dXJuIHRoaXMucGFyc2VMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUsXCJCaWdJbnRMaXRlcmFsVHlwZUFubm90YXRpb25cIik7Y2FzZSBuLl92b2lkOnJldHVybiB0aGlzLm5leHQoKSx0aGlzLmZpbmlzaE5vZGUocyxcIlZvaWRUeXBlQW5ub3RhdGlvblwiKTtjYXNlIG4uX251bGw6cmV0dXJuIHRoaXMubmV4dCgpLHRoaXMuZmluaXNoTm9kZShzLFwiTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvblwiKTtjYXNlIG4uX3RoaXM6cmV0dXJuIHRoaXMubmV4dCgpLHRoaXMuZmluaXNoTm9kZShzLFwiVGhpc1R5cGVBbm5vdGF0aW9uXCIpO2Nhc2Ugbi5zdGFyOnJldHVybiB0aGlzLm5leHQoKSx0aGlzLmZpbmlzaE5vZGUocyxcIkV4aXN0c1R5cGVBbm5vdGF0aW9uXCIpO2RlZmF1bHQ6aWYoXCJ0eXBlb2ZcIj09PXRoaXMuc3RhdGUudHlwZS5rZXl3b3JkKXJldHVybiB0aGlzLmZsb3dQYXJzZVR5cGVvZlR5cGUoKTtpZih0aGlzLnN0YXRlLnR5cGUua2V5d29yZCl7Y29uc3QgdD10aGlzLnN0YXRlLnR5cGUubGFiZWw7cmV0dXJuIHRoaXMubmV4dCgpLHN1cGVyLmNyZWF0ZUlkZW50aWZpZXIocyx0KX19dGhyb3cgdGhpcy51bmV4cGVjdGVkKCl9Zmxvd1BhcnNlUG9zdGZpeFR5cGUoKXtjb25zdCB0PXRoaXMuc3RhdGUuc3RhcnQsZT10aGlzLnN0YXRlLnN0YXJ0TG9jO2xldCBzPXRoaXMuZmxvd1BhcnNlUHJpbWFyeVR5cGUoKTtmb3IoO3RoaXMubWF0Y2gobi5icmFja2V0TCkmJiF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpOyl7Y29uc3QgaT10aGlzLnN0YXJ0Tm9kZUF0KHQsZSk7aS5lbGVtZW50VHlwZT1zLHRoaXMuZXhwZWN0KG4uYnJhY2tldEwpLHRoaXMuZXhwZWN0KG4uYnJhY2tldFIpLHM9dGhpcy5maW5pc2hOb2RlKGksXCJBcnJheVR5cGVBbm5vdGF0aW9uXCIpfXJldHVybiBzfWZsb3dQYXJzZVByZWZpeFR5cGUoKXtjb25zdCB0PXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHRoaXMuZWF0KG4ucXVlc3Rpb24pPyh0LnR5cGVBbm5vdGF0aW9uPXRoaXMuZmxvd1BhcnNlUHJlZml4VHlwZSgpLHRoaXMuZmluaXNoTm9kZSh0LFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiKSk6dGhpcy5mbG93UGFyc2VQb3N0Zml4VHlwZSgpfWZsb3dQYXJzZUFub25GdW5jdGlvbldpdGhvdXRQYXJlbnMoKXtjb25zdCB0PXRoaXMuZmxvd1BhcnNlUHJlZml4VHlwZSgpO2lmKCF0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZSYmdGhpcy5lYXQobi5hcnJvdykpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGVBdCh0LnN0YXJ0LHQubG9jLnN0YXJ0KTtyZXR1cm4gZS5wYXJhbXM9W3RoaXMucmVpbnRlcnByZXRUeXBlQXNGdW5jdGlvblR5cGVQYXJhbSh0KV0sZS5yZXN0PW51bGwsZS5yZXR1cm5UeXBlPXRoaXMuZmxvd1BhcnNlVHlwZSgpLGUudHlwZVBhcmFtZXRlcnM9bnVsbCx0aGlzLmZpbmlzaE5vZGUoZSxcIkZ1bmN0aW9uVHlwZUFubm90YXRpb25cIil9cmV0dXJuIHR9Zmxvd1BhcnNlSW50ZXJzZWN0aW9uVHlwZSgpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTt0aGlzLmVhdChuLmJpdHdpc2VBTkQpO2NvbnN0IGU9dGhpcy5mbG93UGFyc2VBbm9uRnVuY3Rpb25XaXRob3V0UGFyZW5zKCk7Zm9yKHQudHlwZXM9W2VdO3RoaXMuZWF0KG4uYml0d2lzZUFORCk7KXQudHlwZXMucHVzaCh0aGlzLmZsb3dQYXJzZUFub25GdW5jdGlvbldpdGhvdXRQYXJlbnMoKSk7cmV0dXJuIDE9PT10LnR5cGVzLmxlbmd0aD9lOnRoaXMuZmluaXNoTm9kZSh0LFwiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb25cIil9Zmxvd1BhcnNlVW5pb25UeXBlKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMuZWF0KG4uYml0d2lzZU9SKTtjb25zdCBlPXRoaXMuZmxvd1BhcnNlSW50ZXJzZWN0aW9uVHlwZSgpO2Zvcih0LnR5cGVzPVtlXTt0aGlzLmVhdChuLmJpdHdpc2VPUik7KXQudHlwZXMucHVzaCh0aGlzLmZsb3dQYXJzZUludGVyc2VjdGlvblR5cGUoKSk7cmV0dXJuIDE9PT10LnR5cGVzLmxlbmd0aD9lOnRoaXMuZmluaXNoTm9kZSh0LFwiVW5pb25UeXBlQW5ub3RhdGlvblwiKX1mbG93UGFyc2VUeXBlKCl7Y29uc3QgdD10aGlzLnN0YXRlLmluVHlwZTt0aGlzLnN0YXRlLmluVHlwZT0hMDtjb25zdCBlPXRoaXMuZmxvd1BhcnNlVW5pb25UeXBlKCk7cmV0dXJuIHRoaXMuc3RhdGUuaW5UeXBlPXQsdGhpcy5zdGF0ZS5leHByQWxsb3dlZD10aGlzLnN0YXRlLmV4cHJBbGxvd2VkfHx0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZSxlfWZsb3dQYXJzZVR5cGVPckltcGxpY2l0SW5zdGFudGlhdGlvbigpe2lmKHRoaXMuc3RhdGUudHlwZT09PW4ubmFtZSYmXCJfXCI9PT10aGlzLnN0YXRlLnZhbHVlKXtjb25zdCB0PXRoaXMuc3RhdGUuc3RhcnQsZT10aGlzLnN0YXRlLnN0YXJ0TG9jLHM9dGhpcy5wYXJzZUlkZW50aWZpZXIoKTtyZXR1cm4gdGhpcy5mbG93UGFyc2VHZW5lcmljVHlwZSh0LGUscyl9cmV0dXJuIHRoaXMuZmxvd1BhcnNlVHlwZSgpfWZsb3dQYXJzZVR5cGVBbm5vdGF0aW9uKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0LnR5cGVBbm5vdGF0aW9uPXRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKCksdGhpcy5maW5pc2hOb2RlKHQsXCJUeXBlQW5ub3RhdGlvblwiKX1mbG93UGFyc2VUeXBlQW5ub3RhdGFibGVJZGVudGlmaWVyKHQpe2NvbnN0IGU9dD90aGlzLnBhcnNlSWRlbnRpZmllcigpOnRoaXMuZmxvd1BhcnNlUmVzdHJpY3RlZElkZW50aWZpZXIoKTtyZXR1cm4gdGhpcy5tYXRjaChuLmNvbG9uKSYmKGUudHlwZUFubm90YXRpb249dGhpcy5mbG93UGFyc2VUeXBlQW5ub3RhdGlvbigpLHRoaXMucmVzZXRFbmRMb2NhdGlvbihlKSksZX10eXBlQ2FzdFRvUGFyYW1ldGVyKHQpe3JldHVybiB0LmV4cHJlc3Npb24udHlwZUFubm90YXRpb249dC50eXBlQW5ub3RhdGlvbix0aGlzLnJlc2V0RW5kTG9jYXRpb24odC5leHByZXNzaW9uLHQudHlwZUFubm90YXRpb24uZW5kLHQudHlwZUFubm90YXRpb24ubG9jLmVuZCksdC5leHByZXNzaW9ufWZsb3dQYXJzZVZhcmlhbmNlKCl7bGV0IHQ9bnVsbDtyZXR1cm4gdGhpcy5tYXRjaChuLnBsdXNNaW4pJiYodD10aGlzLnN0YXJ0Tm9kZSgpLFwiK1wiPT09dGhpcy5zdGF0ZS52YWx1ZT90LmtpbmQ9XCJwbHVzXCI6dC5raW5kPVwibWludXNcIix0aGlzLm5leHQoKSx0aGlzLmZpbmlzaE5vZGUodCxcIlZhcmlhbmNlXCIpKSx0fXBhcnNlRnVuY3Rpb25Cb2R5KHQsZSxzPSExKXtyZXR1cm4gZT90aGlzLmZvcndhcmROb0Fycm93UGFyYW1zQ29udmVyc2lvbkF0KHQsKCk9PnN1cGVyLnBhcnNlRnVuY3Rpb25Cb2R5KHQsITAscykpOnN1cGVyLnBhcnNlRnVuY3Rpb25Cb2R5KHQsITEscyl9cGFyc2VGdW5jdGlvbkJvZHlBbmRGaW5pc2godCxlLHM9ITEpe2lmKHRoaXMubWF0Y2gobi5jb2xvbikpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGUoKTtbZS50eXBlQW5ub3RhdGlvbix0LnByZWRpY2F0ZV09dGhpcy5mbG93UGFyc2VUeXBlQW5kUHJlZGljYXRlSW5pdGlhbGlzZXIoKSx0LnJldHVyblR5cGU9ZS50eXBlQW5ub3RhdGlvbj90aGlzLmZpbmlzaE5vZGUoZSxcIlR5cGVBbm5vdGF0aW9uXCIpOm51bGx9c3VwZXIucGFyc2VGdW5jdGlvbkJvZHlBbmRGaW5pc2godCxlLHMpfXBhcnNlU3RhdGVtZW50KHQsZSl7aWYodGhpcy5zdGF0ZS5zdHJpY3QmJnRoaXMubWF0Y2gobi5uYW1lKSYmXCJpbnRlcmZhY2VcIj09PXRoaXMuc3RhdGUudmFsdWUpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5mbG93UGFyc2VJbnRlcmZhY2UodCl9aWYodGhpcy5zaG91bGRQYXJzZUVudW1zKCkmJnRoaXMuaXNDb250ZXh0dWFsKFwiZW51bVwiKSl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLm5leHQoKSx0aGlzLmZsb3dQYXJzZUVudW1EZWNsYXJhdGlvbih0KX17Y29uc3Qgcz1zdXBlci5wYXJzZVN0YXRlbWVudCh0LGUpO3JldHVybiB2b2lkIDAhPT10aGlzLmZsb3dQcmFnbWF8fHRoaXMuaXNWYWxpZERpcmVjdGl2ZShzKXx8KHRoaXMuZmxvd1ByYWdtYT1udWxsKSxzfX1wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQodCxlKXtpZihcIklkZW50aWZpZXJcIj09PWUudHlwZSlpZihcImRlY2xhcmVcIj09PWUubmFtZSl7aWYodGhpcy5tYXRjaChuLl9jbGFzcyl8fHRoaXMubWF0Y2gobi5uYW1lKXx8dGhpcy5tYXRjaChuLl9mdW5jdGlvbil8fHRoaXMubWF0Y2gobi5fdmFyKXx8dGhpcy5tYXRjaChuLl9leHBvcnQpKXJldHVybiB0aGlzLmZsb3dQYXJzZURlY2xhcmUodCl9ZWxzZSBpZih0aGlzLm1hdGNoKG4ubmFtZSkpe2lmKFwiaW50ZXJmYWNlXCI9PT1lLm5hbWUpcmV0dXJuIHRoaXMuZmxvd1BhcnNlSW50ZXJmYWNlKHQpO2lmKFwidHlwZVwiPT09ZS5uYW1lKXJldHVybiB0aGlzLmZsb3dQYXJzZVR5cGVBbGlhcyh0KTtpZihcIm9wYXF1ZVwiPT09ZS5uYW1lKXJldHVybiB0aGlzLmZsb3dQYXJzZU9wYXF1ZVR5cGUodCwhMSl9cmV0dXJuIHN1cGVyLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCh0LGUpfXNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKXtyZXR1cm4gdGhpcy5pc0NvbnRleHR1YWwoXCJ0eXBlXCIpfHx0aGlzLmlzQ29udGV4dHVhbChcImludGVyZmFjZVwiKXx8dGhpcy5pc0NvbnRleHR1YWwoXCJvcGFxdWVcIil8fHRoaXMuc2hvdWxkUGFyc2VFbnVtcygpJiZ0aGlzLmlzQ29udGV4dHVhbChcImVudW1cIil8fHN1cGVyLnNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKX1pc0V4cG9ydERlZmF1bHRTcGVjaWZpZXIoKXtyZXR1cm4oIXRoaXMubWF0Y2gobi5uYW1lKXx8IShcInR5cGVcIj09PXRoaXMuc3RhdGUudmFsdWV8fFwiaW50ZXJmYWNlXCI9PT10aGlzLnN0YXRlLnZhbHVlfHxcIm9wYXF1ZVwiPT09dGhpcy5zdGF0ZS52YWx1ZXx8dGhpcy5zaG91bGRQYXJzZUVudW1zKCkmJlwiZW51bVwiPT09dGhpcy5zdGF0ZS52YWx1ZSkpJiZzdXBlci5pc0V4cG9ydERlZmF1bHRTcGVjaWZpZXIoKX1wYXJzZUV4cG9ydERlZmF1bHRFeHByZXNzaW9uKCl7aWYodGhpcy5zaG91bGRQYXJzZUVudW1zKCkmJnRoaXMuaXNDb250ZXh0dWFsKFwiZW51bVwiKSl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLm5leHQoKSx0aGlzLmZsb3dQYXJzZUVudW1EZWNsYXJhdGlvbih0KX1yZXR1cm4gc3VwZXIucGFyc2VFeHBvcnREZWZhdWx0RXhwcmVzc2lvbigpfXBhcnNlQ29uZGl0aW9uYWwodCxlLHMsaSxyKXtpZighdGhpcy5tYXRjaChuLnF1ZXN0aW9uKSlyZXR1cm4gdDtpZihyKXtjb25zdCBhPXRoaXMudHJ5UGFyc2UoKCk9PnN1cGVyLnBhcnNlQ29uZGl0aW9uYWwodCxlLHMsaSkpO3JldHVybiBhLm5vZGU/KGEuZXJyb3ImJih0aGlzLnN0YXRlPWEuZmFpbFN0YXRlKSxhLm5vZGUpOihyLnN0YXJ0PWEuZXJyb3IucG9zfHx0aGlzLnN0YXRlLnN0YXJ0LHQpfXRoaXMuZXhwZWN0KG4ucXVlc3Rpb24pO2NvbnN0IGE9dGhpcy5zdGF0ZS5jbG9uZSgpLG89dGhpcy5zdGF0ZS5ub0Fycm93QXQsaD10aGlzLnN0YXJ0Tm9kZUF0KHMsaSk7bGV0e2NvbnNlcXVlbnQ6cCxmYWlsZWQ6Y309dGhpcy50cnlQYXJzZUNvbmRpdGlvbmFsQ29uc2VxdWVudCgpLFt1LGxdPXRoaXMuZ2V0QXJyb3dMaWtlRXhwcmVzc2lvbnMocCk7aWYoY3x8bC5sZW5ndGg+MCl7Y29uc3QgdD1bLi4ub107aWYobC5sZW5ndGg+MCl7dGhpcy5zdGF0ZT1hLHRoaXMuc3RhdGUubm9BcnJvd0F0PXQ7Zm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKyspdC5wdXNoKGxbZV0uc3RhcnQpOyh7Y29uc2VxdWVudDpwLGZhaWxlZDpjfT10aGlzLnRyeVBhcnNlQ29uZGl0aW9uYWxDb25zZXF1ZW50KCkpLFt1LGxdPXRoaXMuZ2V0QXJyb3dMaWtlRXhwcmVzc2lvbnMocCl9YyYmdS5sZW5ndGg+MSYmdGhpcy5yYWlzZShhLnN0YXJ0LGouQW1iaWd1b3VzQ29uZGl0aW9uYWxBcnJvdyksYyYmMT09PXUubGVuZ3RoJiYodGhpcy5zdGF0ZT1hLHRoaXMuc3RhdGUubm9BcnJvd0F0PXQuY29uY2F0KHVbMF0uc3RhcnQpLCh7Y29uc2VxdWVudDpwLGZhaWxlZDpjfT10aGlzLnRyeVBhcnNlQ29uZGl0aW9uYWxDb25zZXF1ZW50KCkpKX1yZXR1cm4gdGhpcy5nZXRBcnJvd0xpa2VFeHByZXNzaW9ucyhwLCEwKSx0aGlzLnN0YXRlLm5vQXJyb3dBdD1vLHRoaXMuZXhwZWN0KG4uY29sb24pLGgudGVzdD10LGguY29uc2VxdWVudD1wLGguYWx0ZXJuYXRlPXRoaXMuZm9yd2FyZE5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQoaCwoKT0+dGhpcy5wYXJzZU1heWJlQXNzaWduKGUsdm9pZCAwLHZvaWQgMCx2b2lkIDApKSx0aGlzLmZpbmlzaE5vZGUoaCxcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKX10cnlQYXJzZUNvbmRpdGlvbmFsQ29uc2VxdWVudCgpe3RoaXMuc3RhdGUubm9BcnJvd1BhcmFtc0NvbnZlcnNpb25BdC5wdXNoKHRoaXMuc3RhdGUuc3RhcnQpO2NvbnN0IHQ9dGhpcy5wYXJzZU1heWJlQXNzaWduKCksZT0hdGhpcy5tYXRjaChuLmNvbG9uKTtyZXR1cm4gdGhpcy5zdGF0ZS5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0LnBvcCgpLHtjb25zZXF1ZW50OnQsZmFpbGVkOmV9fWdldEFycm93TGlrZUV4cHJlc3Npb25zKHQsZSl7Y29uc3Qgcz1bdF0saT1bXTtmb3IoOzAhPT1zLmxlbmd0aDspe2NvbnN0IHQ9cy5wb3AoKTtcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI9PT10LnR5cGU/KHQudHlwZVBhcmFtZXRlcnN8fCF0LnJldHVyblR5cGU/dGhpcy5maW5pc2hBcnJvd1ZhbGlkYXRpb24odCk6aS5wdXNoKHQpLHMucHVzaCh0LmJvZHkpKTpcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiPT09dC50eXBlJiYocy5wdXNoKHQuY29uc2VxdWVudCkscy5wdXNoKHQuYWx0ZXJuYXRlKSl9cmV0dXJuIGU/KGkuZm9yRWFjaCh0PT50aGlzLmZpbmlzaEFycm93VmFsaWRhdGlvbih0KSksW2ksW11dKTpmdW5jdGlvbih0LGUpe2NvbnN0IHM9W10saT1bXTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKykoZSh0W3JdLHIsdCk/czppKS5wdXNoKHRbcl0pO3JldHVybltzLGldfShpLHQ9PnQucGFyYW1zLmV2ZXJ5KHQ9PnRoaXMuaXNBc3NpZ25hYmxlKHQsITApKSl9ZmluaXNoQXJyb3dWYWxpZGF0aW9uKHQpe3ZhciBlO3RoaXMudG9Bc3NpZ25hYmxlTGlzdCh0LnBhcmFtcyxudWxsPT0oZT10LmV4dHJhKT92b2lkIDA6ZS50cmFpbGluZ0NvbW1hKSx0aGlzLnNjb3BlLmVudGVyKDYpLHN1cGVyLmNoZWNrUGFyYW1zKHQsITEsITApLHRoaXMuc2NvcGUuZXhpdCgpfWZvcndhcmROb0Fycm93UGFyYW1zQ29udmVyc2lvbkF0KHQsZSl7bGV0IHM7cmV0dXJuLTEhPT10aGlzLnN0YXRlLm5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQuaW5kZXhPZih0LnN0YXJ0KT8odGhpcy5zdGF0ZS5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0LnB1c2godGhpcy5zdGF0ZS5zdGFydCkscz1lKCksdGhpcy5zdGF0ZS5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0LnBvcCgpKTpzPWUoKSxzfXBhcnNlUGFyZW5JdGVtKHQsZSxzKXtpZih0PXN1cGVyLnBhcnNlUGFyZW5JdGVtKHQsZSxzKSx0aGlzLmVhdChuLnF1ZXN0aW9uKSYmKHQub3B0aW9uYWw9ITAsdGhpcy5yZXNldEVuZExvY2F0aW9uKHQpKSx0aGlzLm1hdGNoKG4uY29sb24pKXtjb25zdCBpPXRoaXMuc3RhcnROb2RlQXQoZSxzKTtyZXR1cm4gaS5leHByZXNzaW9uPXQsaS50eXBlQW5ub3RhdGlvbj10aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0aW9uKCksdGhpcy5maW5pc2hOb2RlKGksXCJUeXBlQ2FzdEV4cHJlc3Npb25cIil9cmV0dXJuIHR9YXNzZXJ0TW9kdWxlTm9kZUFsbG93ZWQodCl7XCJJbXBvcnREZWNsYXJhdGlvblwiPT09dC50eXBlJiYoXCJ0eXBlXCI9PT10LmltcG9ydEtpbmR8fFwidHlwZW9mXCI9PT10LmltcG9ydEtpbmQpfHxcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIj09PXQudHlwZSYmXCJ0eXBlXCI9PT10LmV4cG9ydEtpbmR8fFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIj09PXQudHlwZSYmXCJ0eXBlXCI9PT10LmV4cG9ydEtpbmR8fHN1cGVyLmFzc2VydE1vZHVsZU5vZGVBbGxvd2VkKHQpfXBhcnNlRXhwb3J0KHQpe2NvbnN0IGU9c3VwZXIucGFyc2VFeHBvcnQodCk7cmV0dXJuXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCIhPT1lLnR5cGUmJlwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIiE9PWUudHlwZXx8KGUuZXhwb3J0S2luZD1lLmV4cG9ydEtpbmR8fFwidmFsdWVcIiksZX1wYXJzZUV4cG9ydERlY2xhcmF0aW9uKHQpe2lmKHRoaXMuaXNDb250ZXh0dWFsKFwidHlwZVwiKSl7dC5leHBvcnRLaW5kPVwidHlwZVwiO2NvbnN0IGU9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5tYXRjaChuLmJyYWNlTCk/KHQuc3BlY2lmaWVycz10aGlzLnBhcnNlRXhwb3J0U3BlY2lmaWVycygpLHRoaXMucGFyc2VFeHBvcnRGcm9tKHQpLG51bGwpOnRoaXMuZmxvd1BhcnNlVHlwZUFsaWFzKGUpfWlmKHRoaXMuaXNDb250ZXh0dWFsKFwib3BhcXVlXCIpKXt0LmV4cG9ydEtpbmQ9XCJ0eXBlXCI7Y29uc3QgZT10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLm5leHQoKSx0aGlzLmZsb3dQYXJzZU9wYXF1ZVR5cGUoZSwhMSl9aWYodGhpcy5pc0NvbnRleHR1YWwoXCJpbnRlcmZhY2VcIikpe3QuZXhwb3J0S2luZD1cInR5cGVcIjtjb25zdCBlPXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHRoaXMubmV4dCgpLHRoaXMuZmxvd1BhcnNlSW50ZXJmYWNlKGUpfWlmKHRoaXMuc2hvdWxkUGFyc2VFbnVtcygpJiZ0aGlzLmlzQ29udGV4dHVhbChcImVudW1cIikpe3QuZXhwb3J0S2luZD1cInZhbHVlXCI7Y29uc3QgZT10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLm5leHQoKSx0aGlzLmZsb3dQYXJzZUVudW1EZWNsYXJhdGlvbihlKX1yZXR1cm4gc3VwZXIucGFyc2VFeHBvcnREZWNsYXJhdGlvbih0KX1lYXRFeHBvcnRTdGFyKHQpe3JldHVybiEhc3VwZXIuZWF0RXhwb3J0U3RhciguLi5hcmd1bWVudHMpfHwhKCF0aGlzLmlzQ29udGV4dHVhbChcInR5cGVcIil8fHRoaXMubG9va2FoZWFkKCkudHlwZSE9PW4uc3RhcikmJih0LmV4cG9ydEtpbmQ9XCJ0eXBlXCIsdGhpcy5uZXh0KCksdGhpcy5uZXh0KCksITApfW1heWJlUGFyc2VFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXIodCl7Y29uc3QgZT10aGlzLnN0YXRlLnN0YXJ0LHM9c3VwZXIubWF5YmVQYXJzZUV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcih0KTtyZXR1cm4gcyYmXCJ0eXBlXCI9PT10LmV4cG9ydEtpbmQmJnRoaXMudW5leHBlY3RlZChlKSxzfXBhcnNlQ2xhc3NJZCh0LGUscyl7c3VwZXIucGFyc2VDbGFzc0lkKHQsZSxzKSx0aGlzLmlzUmVsYXRpb25hbChcIjxcIikmJih0LnR5cGVQYXJhbWV0ZXJzPXRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCkpfXBhcnNlQ2xhc3NNZW1iZXIodCxlLHMsaSl7Y29uc3Qgcj10aGlzLnN0YXRlLnN0YXJ0O2lmKHRoaXMuaXNDb250ZXh0dWFsKFwiZGVjbGFyZVwiKSl7aWYodGhpcy5wYXJzZUNsYXNzTWVtYmVyRnJvbU1vZGlmaWVyKHQsZSkpcmV0dXJuO2UuZGVjbGFyZT0hMH1zdXBlci5wYXJzZUNsYXNzTWVtYmVyKHQsZSxzLGkpLGUuZGVjbGFyZSYmKFwiQ2xhc3NQcm9wZXJ0eVwiIT09ZS50eXBlJiZcIkNsYXNzUHJpdmF0ZVByb3BlcnR5XCIhPT1lLnR5cGU/dGhpcy5yYWlzZShyLGouRGVjbGFyZUNsYXNzRWxlbWVudCk6ZS52YWx1ZSYmdGhpcy5yYWlzZShlLnZhbHVlLnN0YXJ0LGouRGVjbGFyZUNsYXNzRmllbGRJbml0aWFsaXplcikpfWdldFRva2VuRnJvbUNvZGUodCl7Y29uc3QgZT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMSk7cmV0dXJuIDEyMz09PXQmJjEyND09PWU/dGhpcy5maW5pc2hPcChuLmJyYWNlQmFyTCwyKTohdGhpcy5zdGF0ZS5pblR5cGV8fDYyIT09dCYmNjAhPT10P2Z1bmN0aW9uKHQsZSl7cmV0dXJuIDY0PT09dCYmNjQ9PT1lfSh0LGUpPyh0aGlzLnN0YXRlLmlzSXRlcmF0b3I9ITAsc3VwZXIucmVhZFdvcmQoKSk6c3VwZXIuZ2V0VG9rZW5Gcm9tQ29kZSh0KTp0aGlzLmZpbmlzaE9wKG4ucmVsYXRpb25hbCwxKX1pc0Fzc2lnbmFibGUodCxlKXtzd2l0Y2godC50eXBlKXtjYXNlXCJJZGVudGlmaWVyXCI6Y2FzZVwiT2JqZWN0UGF0dGVyblwiOmNhc2VcIkFycmF5UGF0dGVyblwiOmNhc2VcIkFzc2lnbm1lbnRQYXR0ZXJuXCI6cmV0dXJuITA7Y2FzZVwiT2JqZWN0RXhwcmVzc2lvblwiOntjb25zdCBlPXQucHJvcGVydGllcy5sZW5ndGgtMTtyZXR1cm4gdC5wcm9wZXJ0aWVzLmV2ZXJ5KCh0LHMpPT5cIk9iamVjdE1ldGhvZFwiIT09dC50eXBlJiYocz09PWV8fFwiU3ByZWFkRWxlbWVudFwiPT09dC50eXBlKSYmdGhpcy5pc0Fzc2lnbmFibGUodCkpfWNhc2VcIk9iamVjdFByb3BlcnR5XCI6cmV0dXJuIHRoaXMuaXNBc3NpZ25hYmxlKHQudmFsdWUpO2Nhc2VcIlNwcmVhZEVsZW1lbnRcIjpyZXR1cm4gdGhpcy5pc0Fzc2lnbmFibGUodC5hcmd1bWVudCk7Y2FzZVwiQXJyYXlFeHByZXNzaW9uXCI6cmV0dXJuIHQuZWxlbWVudHMuZXZlcnkodD0+dGhpcy5pc0Fzc2lnbmFibGUodCkpO2Nhc2VcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI6cmV0dXJuXCI9XCI9PT10Lm9wZXJhdG9yO2Nhc2VcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6Y2FzZVwiVHlwZUNhc3RFeHByZXNzaW9uXCI6cmV0dXJuIHRoaXMuaXNBc3NpZ25hYmxlKHQuZXhwcmVzc2lvbik7Y2FzZVwiTWVtYmVyRXhwcmVzc2lvblwiOmNhc2VcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiOnJldHVybiFlO2RlZmF1bHQ6cmV0dXJuITF9fXRvQXNzaWduYWJsZSh0KXtyZXR1cm5cIlR5cGVDYXN0RXhwcmVzc2lvblwiPT09dC50eXBlP3N1cGVyLnRvQXNzaWduYWJsZSh0aGlzLnR5cGVDYXN0VG9QYXJhbWV0ZXIodCkpOnN1cGVyLnRvQXNzaWduYWJsZSh0KX10b0Fzc2lnbmFibGVMaXN0KHQsZSl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IHM9dFtlXTtzJiZcIlR5cGVDYXN0RXhwcmVzc2lvblwiPT09cy50eXBlJiYodFtlXT10aGlzLnR5cGVDYXN0VG9QYXJhbWV0ZXIocykpfXJldHVybiBzdXBlci50b0Fzc2lnbmFibGVMaXN0KHQsZSl9dG9SZWZlcmVuY2VkTGlzdCh0LGUpe2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtjb25zdCBpPXRbc107IWl8fFwiVHlwZUNhc3RFeHByZXNzaW9uXCIhPT1pLnR5cGV8fGkuZXh0cmEmJmkuZXh0cmEucGFyZW50aGVzaXplZHx8ISh0Lmxlbmd0aD4xKSYmZXx8dGhpcy5yYWlzZShpLnR5cGVBbm5vdGF0aW9uLnN0YXJ0LGouVHlwZUNhc3RJblBhdHRlcm4pfXJldHVybiB0fWNoZWNrTFZhbCh0LGU9NjQscyxpKXtpZihcIlR5cGVDYXN0RXhwcmVzc2lvblwiIT09dC50eXBlKXJldHVybiBzdXBlci5jaGVja0xWYWwodCxlLHMsaSl9cGFyc2VDbGFzc1Byb3BlcnR5KHQpe3JldHVybiB0aGlzLm1hdGNoKG4uY29sb24pJiYodC50eXBlQW5ub3RhdGlvbj10aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0aW9uKCkpLHN1cGVyLnBhcnNlQ2xhc3NQcm9wZXJ0eSh0KX1wYXJzZUNsYXNzUHJpdmF0ZVByb3BlcnR5KHQpe3JldHVybiB0aGlzLm1hdGNoKG4uY29sb24pJiYodC50eXBlQW5ub3RhdGlvbj10aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0aW9uKCkpLHN1cGVyLnBhcnNlQ2xhc3NQcml2YXRlUHJvcGVydHkodCl9aXNDbGFzc01ldGhvZCgpe3JldHVybiB0aGlzLmlzUmVsYXRpb25hbChcIjxcIil8fHN1cGVyLmlzQ2xhc3NNZXRob2QoKX1pc0NsYXNzUHJvcGVydHkoKXtyZXR1cm4gdGhpcy5tYXRjaChuLmNvbG9uKXx8c3VwZXIuaXNDbGFzc1Byb3BlcnR5KCl9aXNOb25zdGF0aWNDb25zdHJ1Y3Rvcih0KXtyZXR1cm4hdGhpcy5tYXRjaChuLmNvbG9uKSYmc3VwZXIuaXNOb25zdGF0aWNDb25zdHJ1Y3Rvcih0KX1wdXNoQ2xhc3NNZXRob2QodCxlLHMsaSxyLGEpe2UudmFyaWFuY2UmJnRoaXMudW5leHBlY3RlZChlLnZhcmlhbmNlLnN0YXJ0KSxkZWxldGUgZS52YXJpYW5jZSx0aGlzLmlzUmVsYXRpb25hbChcIjxcIikmJihlLnR5cGVQYXJhbWV0ZXJzPXRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCkpLHN1cGVyLnB1c2hDbGFzc01ldGhvZCh0LGUscyxpLHIsYSl9cHVzaENsYXNzUHJpdmF0ZU1ldGhvZCh0LGUscyxpKXtlLnZhcmlhbmNlJiZ0aGlzLnVuZXhwZWN0ZWQoZS52YXJpYW5jZS5zdGFydCksZGVsZXRlIGUudmFyaWFuY2UsdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpJiYoZS50eXBlUGFyYW1ldGVycz10aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpKSxzdXBlci5wdXNoQ2xhc3NQcml2YXRlTWV0aG9kKHQsZSxzLGkpfXBhcnNlQ2xhc3NTdXBlcih0KXtpZihzdXBlci5wYXJzZUNsYXNzU3VwZXIodCksdC5zdXBlckNsYXNzJiZ0aGlzLmlzUmVsYXRpb25hbChcIjxcIikmJih0LnN1cGVyVHlwZVBhcmFtZXRlcnM9dGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbigpKSx0aGlzLmlzQ29udGV4dHVhbChcImltcGxlbWVudHNcIikpe3RoaXMubmV4dCgpO2NvbnN0IGU9dC5pbXBsZW1lbnRzPVtdO2Rve2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTt0LmlkPXRoaXMuZmxvd1BhcnNlUmVzdHJpY3RlZElkZW50aWZpZXIoITApLHRoaXMuaXNSZWxhdGlvbmFsKFwiPFwiKT90LnR5cGVQYXJhbWV0ZXJzPXRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24oKTp0LnR5cGVQYXJhbWV0ZXJzPW51bGwsZS5wdXNoKHRoaXMuZmluaXNoTm9kZSh0LFwiQ2xhc3NJbXBsZW1lbnRzXCIpKX13aGlsZSh0aGlzLmVhdChuLmNvbW1hKSl9fXBhcnNlUHJvcGVydHlOYW1lKHQsZSl7Y29uc3Qgcz10aGlzLmZsb3dQYXJzZVZhcmlhbmNlKCksaT1zdXBlci5wYXJzZVByb3BlcnR5TmFtZSh0LGUpO3JldHVybiB0LnZhcmlhbmNlPXMsaX1wYXJzZU9ialByb3BWYWx1ZSh0LGUscyxpLHIsYSxvLGgpe2xldCBwO3QudmFyaWFuY2UmJnRoaXMudW5leHBlY3RlZCh0LnZhcmlhbmNlLnN0YXJ0KSxkZWxldGUgdC52YXJpYW5jZSx0aGlzLmlzUmVsYXRpb25hbChcIjxcIikmJihwPXRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCksdGhpcy5tYXRjaChuLnBhcmVuTCl8fHRoaXMudW5leHBlY3RlZCgpKSxzdXBlci5wYXJzZU9ialByb3BWYWx1ZSh0LGUscyxpLHIsYSxvLGgpLHAmJigodC52YWx1ZXx8dCkudHlwZVBhcmFtZXRlcnM9cCl9cGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW1UeXBlcyh0KXtyZXR1cm4gdGhpcy5lYXQobi5xdWVzdGlvbikmJihcIklkZW50aWZpZXJcIiE9PXQudHlwZSYmdGhpcy5yYWlzZSh0LnN0YXJ0LGouT3B0aW9uYWxCaW5kaW5nUGF0dGVybiksdC5vcHRpb25hbD0hMCksdGhpcy5tYXRjaChuLmNvbG9uKSYmKHQudHlwZUFubm90YXRpb249dGhpcy5mbG93UGFyc2VUeXBlQW5ub3RhdGlvbigpKSx0aGlzLnJlc2V0RW5kTG9jYXRpb24odCksdH1wYXJzZU1heWJlRGVmYXVsdCh0LGUscyl7Y29uc3QgaT1zdXBlci5wYXJzZU1heWJlRGVmYXVsdCh0LGUscyk7cmV0dXJuXCJBc3NpZ25tZW50UGF0dGVyblwiPT09aS50eXBlJiZpLnR5cGVBbm5vdGF0aW9uJiZpLnJpZ2h0LnN0YXJ0PGkudHlwZUFubm90YXRpb24uc3RhcnQmJnRoaXMucmFpc2UoaS50eXBlQW5ub3RhdGlvbi5zdGFydCxqLlR5cGVCZWZvcmVJbml0aWFsaXplciksaX1zaG91bGRQYXJzZURlZmF1bHRJbXBvcnQodCl7cmV0dXJuIFUodCk/cSh0aGlzLnN0YXRlKTpzdXBlci5zaG91bGRQYXJzZURlZmF1bHRJbXBvcnQodCl9cGFyc2VJbXBvcnRTcGVjaWZpZXJMb2NhbCh0LGUscyxpKXtlLmxvY2FsPVUodCk/dGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcighMCwhMCk6dGhpcy5wYXJzZUlkZW50aWZpZXIoKSx0aGlzLmNoZWNrTFZhbChlLmxvY2FsLDksdm9pZCAwLGkpLHQuc3BlY2lmaWVycy5wdXNoKHRoaXMuZmluaXNoTm9kZShlLHMpKX1tYXliZVBhcnNlRGVmYXVsdEltcG9ydFNwZWNpZmllcih0KXt0LmltcG9ydEtpbmQ9XCJ2YWx1ZVwiO2xldCBlPW51bGw7aWYodGhpcy5tYXRjaChuLl90eXBlb2YpP2U9XCJ0eXBlb2ZcIjp0aGlzLmlzQ29udGV4dHVhbChcInR5cGVcIikmJihlPVwidHlwZVwiKSxlKXtjb25zdCBzPXRoaXMubG9va2FoZWFkKCk7XCJ0eXBlXCI9PT1lJiZzLnR5cGU9PT1uLnN0YXImJnRoaXMudW5leHBlY3RlZChzLnN0YXJ0KSwocShzKXx8cy50eXBlPT09bi5icmFjZUx8fHMudHlwZT09PW4uc3RhcikmJih0aGlzLm5leHQoKSx0LmltcG9ydEtpbmQ9ZSl9cmV0dXJuIHN1cGVyLm1heWJlUGFyc2VEZWZhdWx0SW1wb3J0U3BlY2lmaWVyKHQpfXBhcnNlSW1wb3J0U3BlY2lmaWVyKHQpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGUoKSxzPXRoaXMuc3RhdGUuc3RhcnQsaT10aGlzLnBhcnNlSWRlbnRpZmllcighMCk7bGV0IHI9bnVsbDtcInR5cGVcIj09PWkubmFtZT9yPVwidHlwZVwiOlwidHlwZW9mXCI9PT1pLm5hbWUmJihyPVwidHlwZW9mXCIpO2xldCBhPSExO2lmKHRoaXMuaXNDb250ZXh0dWFsKFwiYXNcIikmJiF0aGlzLmlzTG9va2FoZWFkQ29udGV4dHVhbChcImFzXCIpKXtjb25zdCB0PXRoaXMucGFyc2VJZGVudGlmaWVyKCEwKTtudWxsPT09cnx8dGhpcy5tYXRjaChuLm5hbWUpfHx0aGlzLnN0YXRlLnR5cGUua2V5d29yZD8oZS5pbXBvcnRlZD1pLGUuaW1wb3J0S2luZD1udWxsLGUubG9jYWw9dGhpcy5wYXJzZUlkZW50aWZpZXIoKSk6KGUuaW1wb3J0ZWQ9dCxlLmltcG9ydEtpbmQ9cixlLmxvY2FsPXQuX19jbG9uZSgpKX1lbHNlIG51bGwhPT1yJiYodGhpcy5tYXRjaChuLm5hbWUpfHx0aGlzLnN0YXRlLnR5cGUua2V5d29yZCk/KGUuaW1wb3J0ZWQ9dGhpcy5wYXJzZUlkZW50aWZpZXIoITApLGUuaW1wb3J0S2luZD1yLHRoaXMuZWF0Q29udGV4dHVhbChcImFzXCIpP2UubG9jYWw9dGhpcy5wYXJzZUlkZW50aWZpZXIoKTooYT0hMCxlLmxvY2FsPWUuaW1wb3J0ZWQuX19jbG9uZSgpKSk6KGE9ITAsZS5pbXBvcnRlZD1pLGUuaW1wb3J0S2luZD1udWxsLGUubG9jYWw9ZS5pbXBvcnRlZC5fX2Nsb25lKCkpO2NvbnN0IG89VSh0KSxoPVUoZSk7byYmaCYmdGhpcy5yYWlzZShzLGouSW1wb3J0VHlwZVNob3J0aGFuZE9ubHlJblB1cmVJbXBvcnQpLChvfHxoKSYmdGhpcy5jaGVja1Jlc2VydmVkVHlwZShlLmxvY2FsLm5hbWUsZS5sb2NhbC5zdGFydCwhMCksIWF8fG98fGh8fHRoaXMuY2hlY2tSZXNlcnZlZFdvcmQoZS5sb2NhbC5uYW1lLGUuc3RhcnQsITAsITApLHRoaXMuY2hlY2tMVmFsKGUubG9jYWwsOSx2b2lkIDAsXCJpbXBvcnQgc3BlY2lmaWVyXCIpLHQuc3BlY2lmaWVycy5wdXNoKHRoaXMuZmluaXNoTm9kZShlLFwiSW1wb3J0U3BlY2lmaWVyXCIpKX1wYXJzZUZ1bmN0aW9uUGFyYW1zKHQsZSl7Y29uc3Qgcz10LmtpbmQ7XCJnZXRcIiE9PXMmJlwic2V0XCIhPT1zJiZ0aGlzLmlzUmVsYXRpb25hbChcIjxcIikmJih0LnR5cGVQYXJhbWV0ZXJzPXRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCkpLHN1cGVyLnBhcnNlRnVuY3Rpb25QYXJhbXModCxlKX1wYXJzZVZhcklkKHQsZSl7c3VwZXIucGFyc2VWYXJJZCh0LGUpLHRoaXMubWF0Y2gobi5jb2xvbikmJih0LmlkLnR5cGVBbm5vdGF0aW9uPXRoaXMuZmxvd1BhcnNlVHlwZUFubm90YXRpb24oKSx0aGlzLnJlc2V0RW5kTG9jYXRpb24odC5pZCkpfXBhcnNlQXN5bmNBcnJvd0Zyb21DYWxsRXhwcmVzc2lvbih0LGUpe2lmKHRoaXMubWF0Y2gobi5jb2xvbikpe2NvbnN0IGU9dGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGU7dGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGU9ITAsdC5yZXR1cm5UeXBlPXRoaXMuZmxvd1BhcnNlVHlwZUFubm90YXRpb24oKSx0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZT1lfXJldHVybiBzdXBlci5wYXJzZUFzeW5jQXJyb3dGcm9tQ2FsbEV4cHJlc3Npb24odCxlKX1zaG91bGRQYXJzZUFzeW5jQXJyb3coKXtyZXR1cm4gdGhpcy5tYXRjaChuLmNvbG9uKXx8c3VwZXIuc2hvdWxkUGFyc2VBc3luY0Fycm93KCl9cGFyc2VNYXliZUFzc2lnbih0LGUscyxpKXtsZXQgcixhPW51bGw7aWYodGhpcy5oYXNQbHVnaW4oXCJqc3hcIikmJih0aGlzLm1hdGNoKG4uanN4VGFnU3RhcnQpfHx0aGlzLmlzUmVsYXRpb25hbChcIjxcIikpKXtpZihhPXRoaXMuc3RhdGUuY2xvbmUoKSxyPXRoaXMudHJ5UGFyc2UoKCk9PnN1cGVyLnBhcnNlTWF5YmVBc3NpZ24odCxlLHMsaSksYSksIXIuZXJyb3IpcmV0dXJuIHIubm9kZTtjb25zdHtjb250ZXh0Om59PXRoaXMuc3RhdGU7bltuLmxlbmd0aC0xXT09PXgual9vVGFnP24ubGVuZ3RoLT0yOm5bbi5sZW5ndGgtMV09PT14LmpfZXhwciYmKG4ubGVuZ3RoLT0xKX1pZihyJiZyLmVycm9yfHx0aGlzLmlzUmVsYXRpb25hbChcIjxcIikpe2xldCBuO2E9YXx8dGhpcy5zdGF0ZS5jbG9uZSgpO2NvbnN0IG89dGhpcy50cnlQYXJzZSgoKT0+e249dGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTtjb25zdCByPXRoaXMuZm9yd2FyZE5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQobiwoKT0+c3VwZXIucGFyc2VNYXliZUFzc2lnbih0LGUscyxpKSk7cmV0dXJuIHIudHlwZVBhcmFtZXRlcnM9bix0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbkZyb21Ob2RlKHIsbikscn0sYSksaD1vLm5vZGUmJlwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIj09PW8ubm9kZS50eXBlP28ubm9kZTpudWxsO2lmKCFvLmVycm9yJiZoKXJldHVybiBoO2lmKHImJnIubm9kZSlyZXR1cm4gdGhpcy5zdGF0ZT1yLmZhaWxTdGF0ZSxyLm5vZGU7aWYoaClyZXR1cm4gdGhpcy5zdGF0ZT1vLmZhaWxTdGF0ZSxoO2lmKHImJnIudGhyb3duKXRocm93IHIuZXJyb3I7aWYoby50aHJvd24pdGhyb3cgby5lcnJvcjt0aHJvdyB0aGlzLnJhaXNlKG4uc3RhcnQsai5VbmV4cGVjdGVkVG9rZW5BZnRlclR5cGVQYXJhbWV0ZXIpfXJldHVybiBzdXBlci5wYXJzZU1heWJlQXNzaWduKHQsZSxzLGkpfXBhcnNlQXJyb3codCl7aWYodGhpcy5tYXRjaChuLmNvbG9uKSl7Y29uc3QgZT10aGlzLnRyeVBhcnNlKCgpPT57Y29uc3QgZT10aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZTt0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZT0hMDtjb25zdCBzPXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuW3MudHlwZUFubm90YXRpb24sdC5wcmVkaWNhdGVdPXRoaXMuZmxvd1BhcnNlVHlwZUFuZFByZWRpY2F0ZUluaXRpYWxpc2VyKCksdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGU9ZSx0aGlzLmNhbkluc2VydFNlbWljb2xvbigpJiZ0aGlzLnVuZXhwZWN0ZWQoKSx0aGlzLm1hdGNoKG4uYXJyb3cpfHx0aGlzLnVuZXhwZWN0ZWQoKSxzfSk7aWYoZS50aHJvd24pcmV0dXJuIG51bGw7ZS5lcnJvciYmKHRoaXMuc3RhdGU9ZS5mYWlsU3RhdGUpLHQucmV0dXJuVHlwZT1lLm5vZGUudHlwZUFubm90YXRpb24/dGhpcy5maW5pc2hOb2RlKGUubm9kZSxcIlR5cGVBbm5vdGF0aW9uXCIpOm51bGx9cmV0dXJuIHN1cGVyLnBhcnNlQXJyb3codCl9c2hvdWxkUGFyc2VBcnJvdygpe3JldHVybiB0aGlzLm1hdGNoKG4uY29sb24pfHxzdXBlci5zaG91bGRQYXJzZUFycm93KCl9c2V0QXJyb3dGdW5jdGlvblBhcmFtZXRlcnModCxlKXstMSE9PXRoaXMuc3RhdGUubm9BcnJvd1BhcmFtc0NvbnZlcnNpb25BdC5pbmRleE9mKHQuc3RhcnQpP3QucGFyYW1zPWU6c3VwZXIuc2V0QXJyb3dGdW5jdGlvblBhcmFtZXRlcnModCxlKX1jaGVja1BhcmFtcyh0LGUscyl7aWYoIXN8fC0xPT09dGhpcy5zdGF0ZS5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0LmluZGV4T2YodC5zdGFydCkpcmV0dXJuIHN1cGVyLmNoZWNrUGFyYW1zKC4uLmFyZ3VtZW50cyl9cGFyc2VQYXJlbkFuZERpc3Rpbmd1aXNoRXhwcmVzc2lvbih0KXtyZXR1cm4gc3VwZXIucGFyc2VQYXJlbkFuZERpc3Rpbmd1aXNoRXhwcmVzc2lvbih0JiYtMT09PXRoaXMuc3RhdGUubm9BcnJvd0F0LmluZGV4T2YodGhpcy5zdGF0ZS5zdGFydCkpfXBhcnNlU3Vic2NyaXB0cyh0LGUscyxpKXtpZihcIklkZW50aWZpZXJcIj09PXQudHlwZSYmXCJhc3luY1wiPT09dC5uYW1lJiYtMSE9PXRoaXMuc3RhdGUubm9BcnJvd0F0LmluZGV4T2YoZSkpe3RoaXMubmV4dCgpO2NvbnN0IGk9dGhpcy5zdGFydE5vZGVBdChlLHMpO2kuY2FsbGVlPXQsaS5hcmd1bWVudHM9dGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKG4ucGFyZW5SLCExKSx0PXRoaXMuZmluaXNoTm9kZShpLFwiQ2FsbEV4cHJlc3Npb25cIil9ZWxzZSBpZihcIklkZW50aWZpZXJcIj09PXQudHlwZSYmXCJhc3luY1wiPT09dC5uYW1lJiZ0aGlzLmlzUmVsYXRpb25hbChcIjxcIikpe2NvbnN0IHI9dGhpcy5zdGF0ZS5jbG9uZSgpLGE9dGhpcy50cnlQYXJzZSh0PT50aGlzLnBhcnNlQXN5bmNBcnJvd1dpdGhUeXBlUGFyYW1ldGVycyhlLHMpfHx0KCkscik7aWYoIWEuZXJyb3ImJiFhLmFib3J0ZWQpcmV0dXJuIGEubm9kZTtjb25zdCBuPXRoaXMudHJ5UGFyc2UoKCk9PnN1cGVyLnBhcnNlU3Vic2NyaXB0cyh0LGUscyxpKSxyKTtpZihuLm5vZGUmJiFuLmVycm9yKXJldHVybiBuLm5vZGU7aWYoYS5ub2RlKXJldHVybiB0aGlzLnN0YXRlPWEuZmFpbFN0YXRlLGEubm9kZTtpZihuLm5vZGUpcmV0dXJuIHRoaXMuc3RhdGU9bi5mYWlsU3RhdGUsbi5ub2RlO3Rocm93IGEuZXJyb3J8fG4uZXJyb3J9cmV0dXJuIHN1cGVyLnBhcnNlU3Vic2NyaXB0cyh0LGUscyxpKX1wYXJzZVN1YnNjcmlwdCh0LGUscyxpLHIpe2lmKHRoaXMubWF0Y2gobi5xdWVzdGlvbkRvdCkmJnRoaXMuaXNMb29rYWhlYWRSZWxhdGlvbmFsKFwiPFwiKSl7aWYoci5vcHRpb25hbENoYWluTWVtYmVyPSEwLGkpcmV0dXJuIHIuc3RvcD0hMCx0O3RoaXMubmV4dCgpO2NvbnN0IGE9dGhpcy5zdGFydE5vZGVBdChlLHMpO3JldHVybiBhLmNhbGxlZT10LGEudHlwZUFyZ3VtZW50cz10aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKCksdGhpcy5leHBlY3Qobi5wYXJlbkwpLGEuYXJndW1lbnRzPXRoaXMucGFyc2VDYWxsRXhwcmVzc2lvbkFyZ3VtZW50cyhuLnBhcmVuUiwhMSksYS5vcHRpb25hbD0hMCx0aGlzLmZpbmlzaENhbGxFeHByZXNzaW9uKGEsITApfWlmKCFpJiZ0aGlzLnNob3VsZFBhcnNlVHlwZXMoKSYmdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpKXtjb25zdCBpPXRoaXMuc3RhcnROb2RlQXQoZSxzKTtpLmNhbGxlZT10O2NvbnN0IGE9dGhpcy50cnlQYXJzZSgoKT0+KGkudHlwZUFyZ3VtZW50cz10aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uQ2FsbE9yTmV3KCksdGhpcy5leHBlY3Qobi5wYXJlbkwpLGkuYXJndW1lbnRzPXRoaXMucGFyc2VDYWxsRXhwcmVzc2lvbkFyZ3VtZW50cyhuLnBhcmVuUiwhMSksci5vcHRpb25hbENoYWluTWVtYmVyJiYoaS5vcHRpb25hbD0hMSksdGhpcy5maW5pc2hDYWxsRXhwcmVzc2lvbihpLHIub3B0aW9uYWxDaGFpbk1lbWJlcikpKTtpZihhLm5vZGUpcmV0dXJuIGEuZXJyb3ImJih0aGlzLnN0YXRlPWEuZmFpbFN0YXRlKSxhLm5vZGV9cmV0dXJuIHN1cGVyLnBhcnNlU3Vic2NyaXB0KHQsZSxzLGkscil9cGFyc2VOZXdBcmd1bWVudHModCl7bGV0IGU9bnVsbDt0aGlzLnNob3VsZFBhcnNlVHlwZXMoKSYmdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpJiYoZT10aGlzLnRyeVBhcnNlKCgpPT50aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uQ2FsbE9yTmV3KCkpLm5vZGUpLHQudHlwZUFyZ3VtZW50cz1lLHN1cGVyLnBhcnNlTmV3QXJndW1lbnRzKHQpfXBhcnNlQXN5bmNBcnJvd1dpdGhUeXBlUGFyYW1ldGVycyh0LGUpe2NvbnN0IHM9dGhpcy5zdGFydE5vZGVBdCh0LGUpO2lmKHRoaXMucGFyc2VGdW5jdGlvblBhcmFtcyhzKSx0aGlzLnBhcnNlQXJyb3cocykpcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24ocyx2b2lkIDAsITApfXJlYWRUb2tlbl9tdWx0X21vZHVsbyh0KXtjb25zdCBlPXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcysxKTtpZig0Mj09PXQmJjQ3PT09ZSYmdGhpcy5zdGF0ZS5oYXNGbG93Q29tbWVudClyZXR1cm4gdGhpcy5zdGF0ZS5oYXNGbG93Q29tbWVudD0hMSx0aGlzLnN0YXRlLnBvcys9Mix2b2lkIHRoaXMubmV4dFRva2VuKCk7c3VwZXIucmVhZFRva2VuX211bHRfbW9kdWxvKHQpfXJlYWRUb2tlbl9waXBlX2FtcCh0KXtjb25zdCBlPXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcysxKTsxMjQhPT10fHwxMjUhPT1lP3N1cGVyLnJlYWRUb2tlbl9waXBlX2FtcCh0KTp0aGlzLmZpbmlzaE9wKG4uYnJhY2VCYXJSLDIpfXBhcnNlVG9wTGV2ZWwodCxlKXtjb25zdCBzPXN1cGVyLnBhcnNlVG9wTGV2ZWwodCxlKTtyZXR1cm4gdGhpcy5zdGF0ZS5oYXNGbG93Q29tbWVudCYmdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnBvcyxqLlVudGVybWluYXRlZEZsb3dDb21tZW50KSxzfXNraXBCbG9ja0NvbW1lbnQoKXtpZih0aGlzLmhhc1BsdWdpbihcImZsb3dDb21tZW50c1wiKSYmdGhpcy5za2lwRmxvd0NvbW1lbnQoKSlyZXR1cm4gdGhpcy5zdGF0ZS5oYXNGbG93Q29tbWVudCYmdGhpcy51bmV4cGVjdGVkKG51bGwsai5OZXN0ZWRGbG93Q29tbWVudCksdGhpcy5oYXNGbG93Q29tbWVudENvbXBsZXRpb24oKSx0aGlzLnN0YXRlLnBvcys9dGhpcy5za2lwRmxvd0NvbW1lbnQoKSx2b2lkKHRoaXMuc3RhdGUuaGFzRmxvd0NvbW1lbnQ9ITApO2lmKHRoaXMuc3RhdGUuaGFzRmxvd0NvbW1lbnQpe2NvbnN0IHQ9dGhpcy5pbnB1dC5pbmRleE9mKFwiKi0vXCIsdGhpcy5zdGF0ZS5wb3MrPTIpO2lmKC0xPT09dCl0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUucG9zLTIsZi5VbnRlcm1pbmF0ZWRDb21tZW50KTt0aGlzLnN0YXRlLnBvcz10KzN9ZWxzZSBzdXBlci5za2lwQmxvY2tDb21tZW50KCl9c2tpcEZsb3dDb21tZW50KCl7Y29uc3R7cG9zOnR9PXRoaXMuc3RhdGU7bGV0IGU9Mjtmb3IoO1szMiw5XS5pbmNsdWRlcyh0aGlzLmlucHV0LmNoYXJDb2RlQXQodCtlKSk7KWUrKztjb25zdCBzPXRoaXMuaW5wdXQuY2hhckNvZGVBdChlK3QpLGk9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KGUrdCsxKTtyZXR1cm4gNTg9PT1zJiY1OD09PWk/ZSsyOlwiZmxvdy1pbmNsdWRlXCI9PT10aGlzLmlucHV0LnNsaWNlKGUrdCxlK3QrMTIpP2UrMTI6NTg9PT1zJiY1OCE9PWkmJmV9aGFzRmxvd0NvbW1lbnRDb21wbGV0aW9uKCl7aWYoLTE9PT10aGlzLmlucHV0LmluZGV4T2YoXCIqL1wiLHRoaXMuc3RhdGUucG9zKSl0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUucG9zLGYuVW50ZXJtaW5hdGVkQ29tbWVudCl9Zmxvd0VudW1FcnJvckJvb2xlYW5NZW1iZXJOb3RJbml0aWFsaXplZCh0LHtlbnVtTmFtZTplLG1lbWJlck5hbWU6c30pe3RoaXMucmFpc2UodCxqLkVudW1Cb29sZWFuTWVtYmVyTm90SW5pdGlhbGl6ZWQscyxlKX1mbG93RW51bUVycm9ySW52YWxpZE1lbWJlck5hbWUodCx7ZW51bU5hbWU6ZSxtZW1iZXJOYW1lOnN9KXtjb25zdCBpPXNbMF0udG9VcHBlckNhc2UoKStzLnNsaWNlKDEpO3RoaXMucmFpc2UodCxqLkVudW1JbnZhbGlkTWVtYmVyTmFtZSxzLGksZSl9Zmxvd0VudW1FcnJvckR1cGxpY2F0ZU1lbWJlck5hbWUodCx7ZW51bU5hbWU6ZSxtZW1iZXJOYW1lOnN9KXt0aGlzLnJhaXNlKHQsai5FbnVtRHVwbGljYXRlTWVtYmVyTmFtZSxzLGUpfWZsb3dFbnVtRXJyb3JJbmNvbnNpc3RlbnRNZW1iZXJWYWx1ZXModCx7ZW51bU5hbWU6ZX0pe3RoaXMucmFpc2UodCxqLkVudW1JbmNvbnNpc3RlbnRNZW1iZXJWYWx1ZXMsZSl9Zmxvd0VudW1FcnJvckludmFsaWRFeHBsaWNpdFR5cGUodCx7ZW51bU5hbWU6ZSxzdXBwbGllZFR5cGU6c30pe3JldHVybiB0aGlzLnJhaXNlKHQsbnVsbD09PXM/ai5FbnVtSW52YWxpZEV4cGxpY2l0VHlwZVVua25vd25TdXBwbGllZDpqLkVudW1JbnZhbGlkRXhwbGljaXRUeXBlLGUscyl9Zmxvd0VudW1FcnJvckludmFsaWRNZW1iZXJJbml0aWFsaXplcih0LHtlbnVtTmFtZTplLGV4cGxpY2l0VHlwZTpzLG1lbWJlck5hbWU6aX0pe2xldCByPW51bGw7c3dpdGNoKHMpe2Nhc2VcImJvb2xlYW5cIjpjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpyPWouRW51bUludmFsaWRNZW1iZXJJbml0aWFsaXplclByaW1hcnlUeXBlO2JyZWFrO2Nhc2VcInN5bWJvbFwiOnI9ai5FbnVtSW52YWxpZE1lbWJlckluaXRpYWxpemVyU3ltYm9sVHlwZTticmVhaztkZWZhdWx0OnI9ai5FbnVtSW52YWxpZE1lbWJlckluaXRpYWxpemVyVW5rbm93blR5cGV9cmV0dXJuIHRoaXMucmFpc2UodCxyLGUsaSxzKX1mbG93RW51bUVycm9yTnVtYmVyTWVtYmVyTm90SW5pdGlhbGl6ZWQodCx7ZW51bU5hbWU6ZSxtZW1iZXJOYW1lOnN9KXt0aGlzLnJhaXNlKHQsai5FbnVtTnVtYmVyTWVtYmVyTm90SW5pdGlhbGl6ZWQsZSxzKX1mbG93RW51bUVycm9yU3RyaW5nTWVtYmVySW5jb25zaXN0ZW50bHlJbml0YWlsaXplZCh0LHtlbnVtTmFtZTplfSl7dGhpcy5yYWlzZSh0LGouRW51bVN0cmluZ01lbWJlckluY29uc2lzdGVudGx5SW5pdGFpbGl6ZWQsZSl9Zmxvd0VudW1NZW1iZXJJbml0KCl7Y29uc3QgdD10aGlzLnN0YXRlLnN0YXJ0LGU9KCk9PnRoaXMubWF0Y2gobi5jb21tYSl8fHRoaXMubWF0Y2gobi5icmFjZVIpO3N3aXRjaCh0aGlzLnN0YXRlLnR5cGUpe2Nhc2Ugbi5udW06e2NvbnN0IHM9dGhpcy5wYXJzZUxpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSxcIk51bWVyaWNMaXRlcmFsXCIpO3JldHVybiBlKCk/e3R5cGU6XCJudW1iZXJcIixwb3M6cy5zdGFydCx2YWx1ZTpzfTp7dHlwZTpcImludmFsaWRcIixwb3M6dH19Y2FzZSBuLnN0cmluZzp7Y29uc3Qgcz10aGlzLnBhcnNlTGl0ZXJhbCh0aGlzLnN0YXRlLnZhbHVlLFwiU3RyaW5nTGl0ZXJhbFwiKTtyZXR1cm4gZSgpP3t0eXBlOlwic3RyaW5nXCIscG9zOnMuc3RhcnQsdmFsdWU6c306e3R5cGU6XCJpbnZhbGlkXCIscG9zOnR9fWNhc2Ugbi5fdHJ1ZTpjYXNlIG4uX2ZhbHNlOntjb25zdCBzPXRoaXMucGFyc2VCb29sZWFuTGl0ZXJhbCgpO3JldHVybiBlKCk/e3R5cGU6XCJib29sZWFuXCIscG9zOnMuc3RhcnQsdmFsdWU6c306e3R5cGU6XCJpbnZhbGlkXCIscG9zOnR9fWRlZmF1bHQ6cmV0dXJue3R5cGU6XCJpbnZhbGlkXCIscG9zOnR9fX1mbG93RW51bU1lbWJlclJhdygpe2NvbnN0IHQ9dGhpcy5zdGF0ZS5zdGFydDtyZXR1cm57aWQ6dGhpcy5wYXJzZUlkZW50aWZpZXIoITApLGluaXQ6dGhpcy5lYXQobi5lcSk/dGhpcy5mbG93RW51bU1lbWJlckluaXQoKTp7dHlwZTpcIm5vbmVcIixwb3M6dH19fWZsb3dFbnVtQ2hlY2tFeHBsaWNpdFR5cGVNaXNtYXRjaCh0LGUscyl7Y29uc3R7ZXhwbGljaXRUeXBlOml9PWU7bnVsbCE9PWkmJmkhPT1zJiZ0aGlzLmZsb3dFbnVtRXJyb3JJbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXIodCxlKX1mbG93RW51bU1lbWJlcnMoe2VudW1OYW1lOnQsZXhwbGljaXRUeXBlOmV9KXtjb25zdCBzPW5ldyBTZXQsaT17Ym9vbGVhbk1lbWJlcnM6W10sbnVtYmVyTWVtYmVyczpbXSxzdHJpbmdNZW1iZXJzOltdLGRlZmF1bHRlZE1lbWJlcnM6W119O2Zvcig7IXRoaXMubWF0Y2gobi5icmFjZVIpOyl7Y29uc3Qgcj10aGlzLnN0YXJ0Tm9kZSgpLHtpZDphLGluaXQ6b309dGhpcy5mbG93RW51bU1lbWJlclJhdygpLGg9YS5uYW1lO2lmKFwiXCI9PT1oKWNvbnRpbnVlOy9eW2Etel0vLnRlc3QoaCkmJnRoaXMuZmxvd0VudW1FcnJvckludmFsaWRNZW1iZXJOYW1lKGEuc3RhcnQse2VudW1OYW1lOnQsbWVtYmVyTmFtZTpofSkscy5oYXMoaCkmJnRoaXMuZmxvd0VudW1FcnJvckR1cGxpY2F0ZU1lbWJlck5hbWUoYS5zdGFydCx7ZW51bU5hbWU6dCxtZW1iZXJOYW1lOmh9KSxzLmFkZChoKTtjb25zdCBwPXtlbnVtTmFtZTp0LGV4cGxpY2l0VHlwZTplLG1lbWJlck5hbWU6aH07c3dpdGNoKHIuaWQ9YSxvLnR5cGUpe2Nhc2VcImJvb2xlYW5cIjp0aGlzLmZsb3dFbnVtQ2hlY2tFeHBsaWNpdFR5cGVNaXNtYXRjaChvLnBvcyxwLFwiYm9vbGVhblwiKSxyLmluaXQ9by52YWx1ZSxpLmJvb2xlYW5NZW1iZXJzLnB1c2godGhpcy5maW5pc2hOb2RlKHIsXCJFbnVtQm9vbGVhbk1lbWJlclwiKSk7YnJlYWs7Y2FzZVwibnVtYmVyXCI6dGhpcy5mbG93RW51bUNoZWNrRXhwbGljaXRUeXBlTWlzbWF0Y2goby5wb3MscCxcIm51bWJlclwiKSxyLmluaXQ9by52YWx1ZSxpLm51bWJlck1lbWJlcnMucHVzaCh0aGlzLmZpbmlzaE5vZGUocixcIkVudW1OdW1iZXJNZW1iZXJcIikpO2JyZWFrO2Nhc2VcInN0cmluZ1wiOnRoaXMuZmxvd0VudW1DaGVja0V4cGxpY2l0VHlwZU1pc21hdGNoKG8ucG9zLHAsXCJzdHJpbmdcIiksci5pbml0PW8udmFsdWUsaS5zdHJpbmdNZW1iZXJzLnB1c2godGhpcy5maW5pc2hOb2RlKHIsXCJFbnVtU3RyaW5nTWVtYmVyXCIpKTticmVhaztjYXNlXCJpbnZhbGlkXCI6dGhyb3cgdGhpcy5mbG93RW51bUVycm9ySW52YWxpZE1lbWJlckluaXRpYWxpemVyKG8ucG9zLHApO2Nhc2VcIm5vbmVcIjpzd2l0Y2goZSl7Y2FzZVwiYm9vbGVhblwiOnRoaXMuZmxvd0VudW1FcnJvckJvb2xlYW5NZW1iZXJOb3RJbml0aWFsaXplZChvLnBvcyxwKTticmVhaztjYXNlXCJudW1iZXJcIjp0aGlzLmZsb3dFbnVtRXJyb3JOdW1iZXJNZW1iZXJOb3RJbml0aWFsaXplZChvLnBvcyxwKTticmVhaztkZWZhdWx0OmkuZGVmYXVsdGVkTWVtYmVycy5wdXNoKHRoaXMuZmluaXNoTm9kZShyLFwiRW51bURlZmF1bHRlZE1lbWJlclwiKSl9fXRoaXMubWF0Y2gobi5icmFjZVIpfHx0aGlzLmV4cGVjdChuLmNvbW1hKX1yZXR1cm4gaX1mbG93RW51bVN0cmluZ01lbWJlcnModCxlLHtlbnVtTmFtZTpzfSl7aWYoMD09PXQubGVuZ3RoKXJldHVybiBlO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gdDtpZihlLmxlbmd0aD50Lmxlbmd0aCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IGk9dFtlXTt0aGlzLmZsb3dFbnVtRXJyb3JTdHJpbmdNZW1iZXJJbmNvbnNpc3RlbnRseUluaXRhaWxpemVkKGkuc3RhcnQse2VudW1OYW1lOnN9KX1yZXR1cm4gZX1mb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3QgaT1lW3RdO3RoaXMuZmxvd0VudW1FcnJvclN0cmluZ01lbWJlckluY29uc2lzdGVudGx5SW5pdGFpbGl6ZWQoaS5zdGFydCx7ZW51bU5hbWU6c30pfXJldHVybiB0fWZsb3dFbnVtUGFyc2VFeHBsaWNpdFR5cGUoe2VudW1OYW1lOnR9KXtpZih0aGlzLmVhdENvbnRleHR1YWwoXCJvZlwiKSl7aWYoIXRoaXMubWF0Y2gobi5uYW1lKSl0aHJvdyB0aGlzLmZsb3dFbnVtRXJyb3JJbnZhbGlkRXhwbGljaXRUeXBlKHRoaXMuc3RhdGUuc3RhcnQse2VudW1OYW1lOnQsc3VwcGxpZWRUeXBlOm51bGx9KTtjb25zdHt2YWx1ZTplfT10aGlzLnN0YXRlO3JldHVybiB0aGlzLm5leHQoKSxcImJvb2xlYW5cIiE9PWUmJlwibnVtYmVyXCIhPT1lJiZcInN0cmluZ1wiIT09ZSYmXCJzeW1ib2xcIiE9PWUmJnRoaXMuZmxvd0VudW1FcnJvckludmFsaWRFeHBsaWNpdFR5cGUodGhpcy5zdGF0ZS5zdGFydCx7ZW51bU5hbWU6dCxzdXBwbGllZFR5cGU6ZX0pLGV9cmV0dXJuIG51bGx9Zmxvd0VudW1Cb2R5KHQse2VudW1OYW1lOmUsbmFtZUxvYzpzfSl7Y29uc3QgaT10aGlzLmZsb3dFbnVtUGFyc2VFeHBsaWNpdFR5cGUoe2VudW1OYW1lOmV9KTt0aGlzLmV4cGVjdChuLmJyYWNlTCk7Y29uc3Qgcj10aGlzLmZsb3dFbnVtTWVtYmVycyh7ZW51bU5hbWU6ZSxleHBsaWNpdFR5cGU6aX0pO3N3aXRjaChpKXtjYXNlXCJib29sZWFuXCI6cmV0dXJuIHQuZXhwbGljaXRUeXBlPSEwLHQubWVtYmVycz1yLmJvb2xlYW5NZW1iZXJzLHRoaXMuZXhwZWN0KG4uYnJhY2VSKSx0aGlzLmZpbmlzaE5vZGUodCxcIkVudW1Cb29sZWFuQm9keVwiKTtjYXNlXCJudW1iZXJcIjpyZXR1cm4gdC5leHBsaWNpdFR5cGU9ITAsdC5tZW1iZXJzPXIubnVtYmVyTWVtYmVycyx0aGlzLmV4cGVjdChuLmJyYWNlUiksdGhpcy5maW5pc2hOb2RlKHQsXCJFbnVtTnVtYmVyQm9keVwiKTtjYXNlXCJzdHJpbmdcIjpyZXR1cm4gdC5leHBsaWNpdFR5cGU9ITAsdC5tZW1iZXJzPXRoaXMuZmxvd0VudW1TdHJpbmdNZW1iZXJzKHIuc3RyaW5nTWVtYmVycyxyLmRlZmF1bHRlZE1lbWJlcnMse2VudW1OYW1lOmV9KSx0aGlzLmV4cGVjdChuLmJyYWNlUiksdGhpcy5maW5pc2hOb2RlKHQsXCJFbnVtU3RyaW5nQm9keVwiKTtjYXNlXCJzeW1ib2xcIjpyZXR1cm4gdC5tZW1iZXJzPXIuZGVmYXVsdGVkTWVtYmVycyx0aGlzLmV4cGVjdChuLmJyYWNlUiksdGhpcy5maW5pc2hOb2RlKHQsXCJFbnVtU3ltYm9sQm9keVwiKTtkZWZhdWx0Ontjb25zdCBpPSgpPT4odC5tZW1iZXJzPVtdLHRoaXMuZXhwZWN0KG4uYnJhY2VSKSx0aGlzLmZpbmlzaE5vZGUodCxcIkVudW1TdHJpbmdCb2R5XCIpKTt0LmV4cGxpY2l0VHlwZT0hMTtjb25zdCBhPXIuYm9vbGVhbk1lbWJlcnMubGVuZ3RoLG89ci5udW1iZXJNZW1iZXJzLmxlbmd0aCxoPXIuc3RyaW5nTWVtYmVycy5sZW5ndGgscD1yLmRlZmF1bHRlZE1lbWJlcnMubGVuZ3RoO2lmKGF8fG98fGh8fHApe2lmKGF8fG8pe2lmKCFvJiYhaCYmYT49cCl7Zm9yKGxldCB0PTAscz1yLmRlZmF1bHRlZE1lbWJlcnM7dDxzLmxlbmd0aDt0Kyspe2NvbnN0IGk9c1t0XTt0aGlzLmZsb3dFbnVtRXJyb3JCb29sZWFuTWVtYmVyTm90SW5pdGlhbGl6ZWQoaS5zdGFydCx7ZW51bU5hbWU6ZSxtZW1iZXJOYW1lOmkuaWQubmFtZX0pfXJldHVybiB0Lm1lbWJlcnM9ci5ib29sZWFuTWVtYmVycyx0aGlzLmV4cGVjdChuLmJyYWNlUiksdGhpcy5maW5pc2hOb2RlKHQsXCJFbnVtQm9vbGVhbkJvZHlcIil9aWYoIWEmJiFoJiZvPj1wKXtmb3IobGV0IHQ9MCxzPXIuZGVmYXVsdGVkTWVtYmVyczt0PHMubGVuZ3RoO3QrKyl7Y29uc3QgaT1zW3RdO3RoaXMuZmxvd0VudW1FcnJvck51bWJlck1lbWJlck5vdEluaXRpYWxpemVkKGkuc3RhcnQse2VudW1OYW1lOmUsbWVtYmVyTmFtZTppLmlkLm5hbWV9KX1yZXR1cm4gdC5tZW1iZXJzPXIubnVtYmVyTWVtYmVycyx0aGlzLmV4cGVjdChuLmJyYWNlUiksdGhpcy5maW5pc2hOb2RlKHQsXCJFbnVtTnVtYmVyQm9keVwiKX1yZXR1cm4gdGhpcy5mbG93RW51bUVycm9ySW5jb25zaXN0ZW50TWVtYmVyVmFsdWVzKHMse2VudW1OYW1lOmV9KSxpKCl9cmV0dXJuIHQubWVtYmVycz10aGlzLmZsb3dFbnVtU3RyaW5nTWVtYmVycyhyLnN0cmluZ01lbWJlcnMsci5kZWZhdWx0ZWRNZW1iZXJzLHtlbnVtTmFtZTplfSksdGhpcy5leHBlY3Qobi5icmFjZVIpLHRoaXMuZmluaXNoTm9kZSh0LFwiRW51bVN0cmluZ0JvZHlcIil9cmV0dXJuIGkoKX19fWZsb3dQYXJzZUVudW1EZWNsYXJhdGlvbih0KXtjb25zdCBlPXRoaXMucGFyc2VJZGVudGlmaWVyKCk7cmV0dXJuIHQuaWQ9ZSx0LmJvZHk9dGhpcy5mbG93RW51bUJvZHkodGhpcy5zdGFydE5vZGUoKSx7ZW51bU5hbWU6ZS5uYW1lLG5hbWVMb2M6ZS5zdGFydH0pLHRoaXMuZmluaXNoTm9kZSh0LFwiRW51bURlY2xhcmF0aW9uXCIpfX0sdHlwZXNjcmlwdDp0PT5jbGFzcyBleHRlbmRzIHR7Z2V0U2NvcGVIYW5kbGVyKCl7cmV0dXJuIFp9dHNJc0lkZW50aWZpZXIoKXtyZXR1cm4gdGhpcy5tYXRjaChuLm5hbWUpfXRzTmV4dFRva2VuQ2FuRm9sbG93TW9kaWZpZXIoKXtyZXR1cm4gdGhpcy5uZXh0KCksISh0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpfHx0aGlzLm1hdGNoKG4ucGFyZW5MKXx8dGhpcy5tYXRjaChuLnBhcmVuUil8fHRoaXMubWF0Y2gobi5jb2xvbil8fHRoaXMubWF0Y2gobi5lcSl8fHRoaXMubWF0Y2gobi5xdWVzdGlvbil8fHRoaXMubWF0Y2gobi5iYW5nKSl9dHNQYXJzZU1vZGlmaWVyKHQpe2lmKCF0aGlzLm1hdGNoKG4ubmFtZSkpcmV0dXJuO2NvbnN0IGU9dGhpcy5zdGF0ZS52YWx1ZTtyZXR1cm4tMSE9PXQuaW5kZXhPZihlKSYmdGhpcy50c1RyeVBhcnNlKHRoaXMudHNOZXh0VG9rZW5DYW5Gb2xsb3dNb2RpZmllci5iaW5kKHRoaXMpKT9lOnZvaWQgMH10c1BhcnNlTW9kaWZpZXJzKHQsZSl7Zm9yKDs7KXtjb25zdCBzPXRoaXMuc3RhdGUuc3RhcnQsaT10aGlzLnRzUGFyc2VNb2RpZmllcihlKTtpZighaSlicmVhaztPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiZ0aGlzLnJhaXNlKHMscnQuRHVwbGljYXRlTW9kaWZpZXIsaSksdFtpXT0hMH19dHNJc0xpc3RUZXJtaW5hdG9yKHQpe3N3aXRjaCh0KXtjYXNlXCJFbnVtTWVtYmVyc1wiOmNhc2VcIlR5cGVNZW1iZXJzXCI6cmV0dXJuIHRoaXMubWF0Y2gobi5icmFjZVIpO2Nhc2VcIkhlcml0YWdlQ2xhdXNlRWxlbWVudFwiOnJldHVybiB0aGlzLm1hdGNoKG4uYnJhY2VMKTtjYXNlXCJUdXBsZUVsZW1lbnRUeXBlc1wiOnJldHVybiB0aGlzLm1hdGNoKG4uYnJhY2tldFIpO2Nhc2VcIlR5cGVQYXJhbWV0ZXJzT3JBcmd1bWVudHNcIjpyZXR1cm4gdGhpcy5pc1JlbGF0aW9uYWwoXCI+XCIpfXRocm93IG5ldyBFcnJvcihcIlVucmVhY2hhYmxlXCIpfXRzUGFyc2VMaXN0KHQsZSl7Y29uc3Qgcz1bXTtmb3IoOyF0aGlzLnRzSXNMaXN0VGVybWluYXRvcih0KTspcy5wdXNoKGUoKSk7cmV0dXJuIHN9dHNQYXJzZURlbGltaXRlZExpc3QodCxlKXtyZXR1cm4gc3QodGhpcy50c1BhcnNlRGVsaW1pdGVkTGlzdFdvcmtlcih0LGUsITApKX10c1BhcnNlRGVsaW1pdGVkTGlzdFdvcmtlcih0LGUscyl7Y29uc3QgaT1bXTtmb3IoOyF0aGlzLnRzSXNMaXN0VGVybWluYXRvcih0KTspe2NvbnN0IHI9ZSgpO2lmKG51bGw9PXIpcmV0dXJuO2lmKGkucHVzaChyKSwhdGhpcy5lYXQobi5jb21tYSkpe2lmKHRoaXMudHNJc0xpc3RUZXJtaW5hdG9yKHQpKWJyZWFrO3JldHVybiB2b2lkKHMmJnRoaXMuZXhwZWN0KG4uY29tbWEpKX19cmV0dXJuIGl9dHNQYXJzZUJyYWNrZXRlZExpc3QodCxlLHMsaSl7aXx8KHM/dGhpcy5leHBlY3Qobi5icmFja2V0TCk6dGhpcy5leHBlY3RSZWxhdGlvbmFsKFwiPFwiKSk7Y29uc3Qgcj10aGlzLnRzUGFyc2VEZWxpbWl0ZWRMaXN0KHQsZSk7cmV0dXJuIHM/dGhpcy5leHBlY3Qobi5icmFja2V0Uik6dGhpcy5leHBlY3RSZWxhdGlvbmFsKFwiPlwiKSxyfXRzUGFyc2VJbXBvcnRUeXBlKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLmV4cGVjdChuLl9pbXBvcnQpLHRoaXMuZXhwZWN0KG4ucGFyZW5MKSx0aGlzLm1hdGNoKG4uc3RyaW5nKXx8dGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LHJ0LlVuc3VwcG9ydGVkSW1wb3J0VHlwZUFyZ3VtZW50KSx0LmFyZ3VtZW50PXRoaXMucGFyc2VFeHByQXRvbSgpLHRoaXMuZXhwZWN0KG4ucGFyZW5SKSx0aGlzLmVhdChuLmRvdCkmJih0LnF1YWxpZmllcj10aGlzLnRzUGFyc2VFbnRpdHlOYW1lKCEwKSksdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpJiYodC50eXBlUGFyYW1ldGVycz10aGlzLnRzUGFyc2VUeXBlQXJndW1lbnRzKCkpLHRoaXMuZmluaXNoTm9kZSh0LFwiVFNJbXBvcnRUeXBlXCIpfXRzUGFyc2VFbnRpdHlOYW1lKHQpe2xldCBlPXRoaXMucGFyc2VJZGVudGlmaWVyKCk7Zm9yKDt0aGlzLmVhdChuLmRvdCk7KXtjb25zdCBzPXRoaXMuc3RhcnROb2RlQXROb2RlKGUpO3MubGVmdD1lLHMucmlnaHQ9dGhpcy5wYXJzZUlkZW50aWZpZXIodCksZT10aGlzLmZpbmlzaE5vZGUocyxcIlRTUXVhbGlmaWVkTmFtZVwiKX1yZXR1cm4gZX10c1BhcnNlVHlwZVJlZmVyZW5jZSgpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdC50eXBlTmFtZT10aGlzLnRzUGFyc2VFbnRpdHlOYW1lKCExKSwhdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSYmdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpJiYodC50eXBlUGFyYW1ldGVycz10aGlzLnRzUGFyc2VUeXBlQXJndW1lbnRzKCkpLHRoaXMuZmluaXNoTm9kZSh0LFwiVFNUeXBlUmVmZXJlbmNlXCIpfXRzUGFyc2VUaGlzVHlwZVByZWRpY2F0ZSh0KXt0aGlzLm5leHQoKTtjb25zdCBlPXRoaXMuc3RhcnROb2RlQXROb2RlKHQpO3JldHVybiBlLnBhcmFtZXRlck5hbWU9dCxlLnR5cGVBbm5vdGF0aW9uPXRoaXMudHNQYXJzZVR5cGVBbm5vdGF0aW9uKCExKSx0aGlzLmZpbmlzaE5vZGUoZSxcIlRTVHlwZVByZWRpY2F0ZVwiKX10c1BhcnNlVGhpc1R5cGVOb2RlKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLm5leHQoKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTVGhpc1R5cGVcIil9dHNQYXJzZVR5cGVRdWVyeSgpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5leHBlY3Qobi5fdHlwZW9mKSx0aGlzLm1hdGNoKG4uX2ltcG9ydCk/dC5leHByTmFtZT10aGlzLnRzUGFyc2VJbXBvcnRUeXBlKCk6dC5leHByTmFtZT10aGlzLnRzUGFyc2VFbnRpdHlOYW1lKCEwKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTVHlwZVF1ZXJ5XCIpfXRzUGFyc2VUeXBlUGFyYW1ldGVyKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0Lm5hbWU9dGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKHQuc3RhcnQpLHQuY29uc3RyYWludD10aGlzLnRzRWF0VGhlblBhcnNlVHlwZShuLl9leHRlbmRzKSx0LmRlZmF1bHQ9dGhpcy50c0VhdFRoZW5QYXJzZVR5cGUobi5lcSksdGhpcy5maW5pc2hOb2RlKHQsXCJUU1R5cGVQYXJhbWV0ZXJcIil9dHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKCl7aWYodGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpKXJldHVybiB0aGlzLnRzUGFyc2VUeXBlUGFyYW1ldGVycygpfXRzUGFyc2VUeXBlUGFyYW1ldGVycygpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpfHx0aGlzLm1hdGNoKG4uanN4VGFnU3RhcnQpP3RoaXMubmV4dCgpOnRoaXMudW5leHBlY3RlZCgpLHQucGFyYW1zPXRoaXMudHNQYXJzZUJyYWNrZXRlZExpc3QoXCJUeXBlUGFyYW1ldGVyc09yQXJndW1lbnRzXCIsdGhpcy50c1BhcnNlVHlwZVBhcmFtZXRlci5iaW5kKHRoaXMpLCExLCEwKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpfXRzVHJ5TmV4dFBhcnNlQ29uc3RhbnRDb250ZXh0KCl7cmV0dXJuIHRoaXMubG9va2FoZWFkKCkudHlwZT09PW4uX2NvbnN0Pyh0aGlzLm5leHQoKSx0aGlzLnRzUGFyc2VUeXBlUmVmZXJlbmNlKCkpOm51bGx9dHNGaWxsU2lnbmF0dXJlKHQsZSl7Y29uc3Qgcz10PT09bi5hcnJvdztlLnR5cGVQYXJhbWV0ZXJzPXRoaXMudHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKCksdGhpcy5leHBlY3Qobi5wYXJlbkwpLGUucGFyYW1ldGVycz10aGlzLnRzUGFyc2VCaW5kaW5nTGlzdEZvclNpZ25hdHVyZSgpLHM/ZS50eXBlQW5ub3RhdGlvbj10aGlzLnRzUGFyc2VUeXBlT3JUeXBlUHJlZGljYXRlQW5ub3RhdGlvbih0KTp0aGlzLm1hdGNoKHQpJiYoZS50eXBlQW5ub3RhdGlvbj10aGlzLnRzUGFyc2VUeXBlT3JUeXBlUHJlZGljYXRlQW5ub3RhdGlvbih0KSl9dHNQYXJzZUJpbmRpbmdMaXN0Rm9yU2lnbmF0dXJlKCl7cmV0dXJuIHRoaXMucGFyc2VCaW5kaW5nTGlzdChuLnBhcmVuUiw0MSkubWFwKHQ9PihcIklkZW50aWZpZXJcIiE9PXQudHlwZSYmXCJSZXN0RWxlbWVudFwiIT09dC50eXBlJiZcIk9iamVjdFBhdHRlcm5cIiE9PXQudHlwZSYmXCJBcnJheVBhdHRlcm5cIiE9PXQudHlwZSYmdGhpcy5yYWlzZSh0LnN0YXJ0LHJ0LlVuc3VwcG9ydGVkU2lnbmF0dXJlUGFyYW1ldGVyS2luZCx0LnR5cGUpLHQpKX10c1BhcnNlVHlwZU1lbWJlclNlbWljb2xvbigpe3RoaXMuZWF0KG4uY29tbWEpfHx0aGlzLnNlbWljb2xvbigpfXRzUGFyc2VTaWduYXR1cmVNZW1iZXIodCxlKXtyZXR1cm4gdGhpcy50c0ZpbGxTaWduYXR1cmUobi5jb2xvbixlKSx0aGlzLnRzUGFyc2VUeXBlTWVtYmVyU2VtaWNvbG9uKCksdGhpcy5maW5pc2hOb2RlKGUsdCl9dHNJc1VuYW1iaWd1b3VzbHlJbmRleFNpZ25hdHVyZSgpe3JldHVybiB0aGlzLm5leHQoKSx0aGlzLmVhdChuLm5hbWUpJiZ0aGlzLm1hdGNoKG4uY29sb24pfXRzVHJ5UGFyc2VJbmRleFNpZ25hdHVyZSh0KXtpZighdGhpcy5tYXRjaChuLmJyYWNrZXRMKXx8IXRoaXMudHNMb29rQWhlYWQodGhpcy50c0lzVW5hbWJpZ3VvdXNseUluZGV4U2lnbmF0dXJlLmJpbmQodGhpcykpKXJldHVybjt0aGlzLmV4cGVjdChuLmJyYWNrZXRMKTtjb25zdCBlPXRoaXMucGFyc2VJZGVudGlmaWVyKCk7ZS50eXBlQW5ub3RhdGlvbj10aGlzLnRzUGFyc2VUeXBlQW5ub3RhdGlvbigpLHRoaXMucmVzZXRFbmRMb2NhdGlvbihlKSx0aGlzLmV4cGVjdChuLmJyYWNrZXRSKSx0LnBhcmFtZXRlcnM9W2VdO2NvbnN0IHM9dGhpcy50c1RyeVBhcnNlVHlwZUFubm90YXRpb24oKTtyZXR1cm4gcyYmKHQudHlwZUFubm90YXRpb249cyksdGhpcy50c1BhcnNlVHlwZU1lbWJlclNlbWljb2xvbigpLHRoaXMuZmluaXNoTm9kZSh0LFwiVFNJbmRleFNpZ25hdHVyZVwiKX10c1BhcnNlUHJvcGVydHlPck1ldGhvZFNpZ25hdHVyZSh0LGUpe3RoaXMuZWF0KG4ucXVlc3Rpb24pJiYodC5vcHRpb25hbD0hMCk7Y29uc3Qgcz10O2lmKGV8fCF0aGlzLm1hdGNoKG4ucGFyZW5MKSYmIXRoaXMuaXNSZWxhdGlvbmFsKFwiPFwiKSl7Y29uc3QgdD1zO2UmJih0LnJlYWRvbmx5PSEwKTtjb25zdCBpPXRoaXMudHNUcnlQYXJzZVR5cGVBbm5vdGF0aW9uKCk7cmV0dXJuIGkmJih0LnR5cGVBbm5vdGF0aW9uPWkpLHRoaXMudHNQYXJzZVR5cGVNZW1iZXJTZW1pY29sb24oKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTUHJvcGVydHlTaWduYXR1cmVcIil9e2NvbnN0IHQ9cztyZXR1cm4gdGhpcy50c0ZpbGxTaWduYXR1cmUobi5jb2xvbix0KSx0aGlzLnRzUGFyc2VUeXBlTWVtYmVyU2VtaWNvbG9uKCksdGhpcy5maW5pc2hOb2RlKHQsXCJUU01ldGhvZFNpZ25hdHVyZVwiKX19dHNQYXJzZVR5cGVNZW1iZXIoKXtjb25zdCB0PXRoaXMuc3RhcnROb2RlKCk7aWYodGhpcy5tYXRjaChuLnBhcmVuTCl8fHRoaXMuaXNSZWxhdGlvbmFsKFwiPFwiKSlyZXR1cm4gdGhpcy50c1BhcnNlU2lnbmF0dXJlTWVtYmVyKFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIix0KTtpZih0aGlzLm1hdGNoKG4uX25ldykpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5tYXRjaChuLnBhcmVuTCl8fHRoaXMuaXNSZWxhdGlvbmFsKFwiPFwiKT90aGlzLnRzUGFyc2VTaWduYXR1cmVNZW1iZXIoXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsdCk6KHQua2V5PXRoaXMuY3JlYXRlSWRlbnRpZmllcihlLFwibmV3XCIpLHRoaXMudHNQYXJzZVByb3BlcnR5T3JNZXRob2RTaWduYXR1cmUodCwhMSkpfWNvbnN0IGU9ISF0aGlzLnRzUGFyc2VNb2RpZmllcihbXCJyZWFkb25seVwiXSkscz10aGlzLnRzVHJ5UGFyc2VJbmRleFNpZ25hdHVyZSh0KTtyZXR1cm4gcz8oZSYmKHQucmVhZG9ubHk9ITApLHMpOih0aGlzLnBhcnNlUHJvcGVydHlOYW1lKHQsITEpLHRoaXMudHNQYXJzZVByb3BlcnR5T3JNZXRob2RTaWduYXR1cmUodCxlKSl9dHNQYXJzZVR5cGVMaXRlcmFsKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0Lm1lbWJlcnM9dGhpcy50c1BhcnNlT2JqZWN0VHlwZU1lbWJlcnMoKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTVHlwZUxpdGVyYWxcIil9dHNQYXJzZU9iamVjdFR5cGVNZW1iZXJzKCl7dGhpcy5leHBlY3Qobi5icmFjZUwpO2NvbnN0IHQ9dGhpcy50c1BhcnNlTGlzdChcIlR5cGVNZW1iZXJzXCIsdGhpcy50c1BhcnNlVHlwZU1lbWJlci5iaW5kKHRoaXMpKTtyZXR1cm4gdGhpcy5leHBlY3Qobi5icmFjZVIpLHR9dHNJc1N0YXJ0T2ZNYXBwZWRUeXBlKCl7cmV0dXJuIHRoaXMubmV4dCgpLHRoaXMuZWF0KG4ucGx1c01pbik/dGhpcy5pc0NvbnRleHR1YWwoXCJyZWFkb25seVwiKToodGhpcy5pc0NvbnRleHR1YWwoXCJyZWFkb25seVwiKSYmdGhpcy5uZXh0KCksISF0aGlzLm1hdGNoKG4uYnJhY2tldEwpJiYodGhpcy5uZXh0KCksISF0aGlzLnRzSXNJZGVudGlmaWVyKCkmJih0aGlzLm5leHQoKSx0aGlzLm1hdGNoKG4uX2luKSkpKX10c1BhcnNlTWFwcGVkVHlwZVBhcmFtZXRlcigpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdC5uYW1lPXRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSh0LnN0YXJ0KSx0LmNvbnN0cmFpbnQ9dGhpcy50c0V4cGVjdFRoZW5QYXJzZVR5cGUobi5faW4pLHRoaXMuZmluaXNoTm9kZSh0LFwiVFNUeXBlUGFyYW1ldGVyXCIpfXRzUGFyc2VNYXBwZWRUeXBlKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLmV4cGVjdChuLmJyYWNlTCksdGhpcy5tYXRjaChuLnBsdXNNaW4pPyh0LnJlYWRvbmx5PXRoaXMuc3RhdGUudmFsdWUsdGhpcy5uZXh0KCksdGhpcy5leHBlY3RDb250ZXh0dWFsKFwicmVhZG9ubHlcIikpOnRoaXMuZWF0Q29udGV4dHVhbChcInJlYWRvbmx5XCIpJiYodC5yZWFkb25seT0hMCksdGhpcy5leHBlY3Qobi5icmFja2V0TCksdC50eXBlUGFyYW1ldGVyPXRoaXMudHNQYXJzZU1hcHBlZFR5cGVQYXJhbWV0ZXIoKSx0aGlzLmV4cGVjdChuLmJyYWNrZXRSKSx0aGlzLm1hdGNoKG4ucGx1c01pbik/KHQub3B0aW9uYWw9dGhpcy5zdGF0ZS52YWx1ZSx0aGlzLm5leHQoKSx0aGlzLmV4cGVjdChuLnF1ZXN0aW9uKSk6dGhpcy5lYXQobi5xdWVzdGlvbikmJih0Lm9wdGlvbmFsPSEwKSx0LnR5cGVBbm5vdGF0aW9uPXRoaXMudHNUcnlQYXJzZVR5cGUoKSx0aGlzLnNlbWljb2xvbigpLHRoaXMuZXhwZWN0KG4uYnJhY2VSKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTTWFwcGVkVHlwZVwiKX10c1BhcnNlVHVwbGVUeXBlKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3QuZWxlbWVudFR5cGVzPXRoaXMudHNQYXJzZUJyYWNrZXRlZExpc3QoXCJUdXBsZUVsZW1lbnRUeXBlc1wiLHRoaXMudHNQYXJzZVR1cGxlRWxlbWVudFR5cGUuYmluZCh0aGlzKSwhMCwhMSk7bGV0IGU9ITE7cmV0dXJuIHQuZWxlbWVudFR5cGVzLmZvckVhY2godD0+e1wiVFNPcHRpb25hbFR5cGVcIj09PXQudHlwZT9lPSEwOmUmJlwiVFNSZXN0VHlwZVwiIT09dC50eXBlJiZ0aGlzLnJhaXNlKHQuc3RhcnQscnQuT3B0aW9uYWxUeXBlQmVmb3JlUmVxdWlyZWQpfSksdGhpcy5maW5pc2hOb2RlKHQsXCJUU1R1cGxlVHlwZVwiKX10c1BhcnNlVHVwbGVFbGVtZW50VHlwZSgpe2lmKHRoaXMubWF0Y2gobi5lbGxpcHNpcykpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5uZXh0KCksdC50eXBlQW5ub3RhdGlvbj10aGlzLnRzUGFyc2VUeXBlKCksdGhpcy5tYXRjaChuLmNvbW1hKSYmOTMhPT10aGlzLmxvb2thaGVhZENoYXJDb2RlKCkmJnRoaXMucmFpc2VSZXN0Tm90TGFzdCh0aGlzLnN0YXRlLnN0YXJ0KSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTUmVzdFR5cGVcIil9Y29uc3QgdD10aGlzLnRzUGFyc2VUeXBlKCk7aWYodGhpcy5lYXQobi5xdWVzdGlvbikpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGVBdE5vZGUodCk7cmV0dXJuIGUudHlwZUFubm90YXRpb249dCx0aGlzLmZpbmlzaE5vZGUoZSxcIlRTT3B0aW9uYWxUeXBlXCIpfXJldHVybiB0fXRzUGFyc2VQYXJlbnRoZXNpemVkVHlwZSgpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5leHBlY3Qobi5wYXJlbkwpLHQudHlwZUFubm90YXRpb249dGhpcy50c1BhcnNlVHlwZSgpLHRoaXMuZXhwZWN0KG4ucGFyZW5SKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTUGFyZW50aGVzaXplZFR5cGVcIil9dHNQYXJzZUZ1bmN0aW9uT3JDb25zdHJ1Y3RvclR5cGUodCl7Y29uc3QgZT10aGlzLnN0YXJ0Tm9kZSgpO3JldHVyblwiVFNDb25zdHJ1Y3RvclR5cGVcIj09PXQmJnRoaXMuZXhwZWN0KG4uX25ldyksdGhpcy50c0ZpbGxTaWduYXR1cmUobi5hcnJvdyxlKSx0aGlzLmZpbmlzaE5vZGUoZSx0KX10c1BhcnNlTGl0ZXJhbFR5cGVOb2RlKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0LmxpdGVyYWw9KCgpPT57c3dpdGNoKHRoaXMuc3RhdGUudHlwZSl7Y2FzZSBuLm51bTpjYXNlIG4uc3RyaW5nOmNhc2Ugbi5fdHJ1ZTpjYXNlIG4uX2ZhbHNlOnJldHVybiB0aGlzLnBhcnNlRXhwckF0b20oKTtkZWZhdWx0OnRocm93IHRoaXMudW5leHBlY3RlZCgpfX0pKCksdGhpcy5maW5pc2hOb2RlKHQsXCJUU0xpdGVyYWxUeXBlXCIpfXRzUGFyc2VUZW1wbGF0ZUxpdGVyYWxUeXBlKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpLGU9dGhpcy5wYXJzZVRlbXBsYXRlKCExKTtyZXR1cm4gZS5leHByZXNzaW9ucy5sZW5ndGg+MCYmdGhpcy5yYWlzZShlLmV4cHJlc3Npb25zWzBdLnN0YXJ0LHJ0LlRlbXBsYXRlVHlwZUhhc1N1YnN0aXR1dGlvbiksdC5saXRlcmFsPWUsdGhpcy5maW5pc2hOb2RlKHQsXCJUU0xpdGVyYWxUeXBlXCIpfXRzUGFyc2VUaGlzVHlwZU9yVGhpc1R5cGVQcmVkaWNhdGUoKXtjb25zdCB0PXRoaXMudHNQYXJzZVRoaXNUeXBlTm9kZSgpO3JldHVybiB0aGlzLmlzQ29udGV4dHVhbChcImlzXCIpJiYhdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKT90aGlzLnRzUGFyc2VUaGlzVHlwZVByZWRpY2F0ZSh0KTp0fXRzUGFyc2VOb25BcnJheVR5cGUoKXtzd2l0Y2godGhpcy5zdGF0ZS50eXBlKXtjYXNlIG4ubmFtZTpjYXNlIG4uX3ZvaWQ6Y2FzZSBuLl9udWxsOntjb25zdCB0PXRoaXMubWF0Y2gobi5fdm9pZCk/XCJUU1ZvaWRLZXl3b3JkXCI6dGhpcy5tYXRjaChuLl9udWxsKT9cIlRTTnVsbEtleXdvcmRcIjpmdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZVwiYW55XCI6cmV0dXJuXCJUU0FueUtleXdvcmRcIjtjYXNlXCJib29sZWFuXCI6cmV0dXJuXCJUU0Jvb2xlYW5LZXl3b3JkXCI7Y2FzZVwiYmlnaW50XCI6cmV0dXJuXCJUU0JpZ0ludEtleXdvcmRcIjtjYXNlXCJuZXZlclwiOnJldHVyblwiVFNOZXZlcktleXdvcmRcIjtjYXNlXCJudW1iZXJcIjpyZXR1cm5cIlRTTnVtYmVyS2V5d29yZFwiO2Nhc2VcIm9iamVjdFwiOnJldHVyblwiVFNPYmplY3RLZXl3b3JkXCI7Y2FzZVwic3RyaW5nXCI6cmV0dXJuXCJUU1N0cmluZ0tleXdvcmRcIjtjYXNlXCJzeW1ib2xcIjpyZXR1cm5cIlRTU3ltYm9sS2V5d29yZFwiO2Nhc2VcInVuZGVmaW5lZFwiOnJldHVyblwiVFNVbmRlZmluZWRLZXl3b3JkXCI7Y2FzZVwidW5rbm93blwiOnJldHVyblwiVFNVbmtub3duS2V5d29yZFwiO2RlZmF1bHQ6cmV0dXJufX0odGhpcy5zdGF0ZS52YWx1ZSk7aWYodm9pZCAwIT09dCYmNDYhPT10aGlzLmxvb2thaGVhZENoYXJDb2RlKCkpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5maW5pc2hOb2RlKGUsdCl9cmV0dXJuIHRoaXMudHNQYXJzZVR5cGVSZWZlcmVuY2UoKX1jYXNlIG4uc3RyaW5nOmNhc2Ugbi5udW06Y2FzZSBuLl90cnVlOmNhc2Ugbi5fZmFsc2U6cmV0dXJuIHRoaXMudHNQYXJzZUxpdGVyYWxUeXBlTm9kZSgpO2Nhc2Ugbi5wbHVzTWluOmlmKFwiLVwiPT09dGhpcy5zdGF0ZS52YWx1ZSl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO2lmKHRoaXMubG9va2FoZWFkKCkudHlwZSE9PW4ubnVtKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0LmxpdGVyYWw9dGhpcy5wYXJzZU1heWJlVW5hcnkoKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTTGl0ZXJhbFR5cGVcIil9YnJlYWs7Y2FzZSBuLl90aGlzOnJldHVybiB0aGlzLnRzUGFyc2VUaGlzVHlwZU9yVGhpc1R5cGVQcmVkaWNhdGUoKTtjYXNlIG4uX3R5cGVvZjpyZXR1cm4gdGhpcy50c1BhcnNlVHlwZVF1ZXJ5KCk7Y2FzZSBuLl9pbXBvcnQ6cmV0dXJuIHRoaXMudHNQYXJzZUltcG9ydFR5cGUoKTtjYXNlIG4uYnJhY2VMOnJldHVybiB0aGlzLnRzTG9va0FoZWFkKHRoaXMudHNJc1N0YXJ0T2ZNYXBwZWRUeXBlLmJpbmQodGhpcykpP3RoaXMudHNQYXJzZU1hcHBlZFR5cGUoKTp0aGlzLnRzUGFyc2VUeXBlTGl0ZXJhbCgpO2Nhc2Ugbi5icmFja2V0TDpyZXR1cm4gdGhpcy50c1BhcnNlVHVwbGVUeXBlKCk7Y2FzZSBuLnBhcmVuTDpyZXR1cm4gdGhpcy50c1BhcnNlUGFyZW50aGVzaXplZFR5cGUoKTtjYXNlIG4uYmFja1F1b3RlOnJldHVybiB0aGlzLnRzUGFyc2VUZW1wbGF0ZUxpdGVyYWxUeXBlKCl9dGhyb3cgdGhpcy51bmV4cGVjdGVkKCl9dHNQYXJzZUFycmF5VHlwZU9ySGlnaGVyKCl7bGV0IHQ9dGhpcy50c1BhcnNlTm9uQXJyYXlUeXBlKCk7Zm9yKDshdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSYmdGhpcy5lYXQobi5icmFja2V0TCk7KWlmKHRoaXMubWF0Y2gobi5icmFja2V0Uikpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGVBdE5vZGUodCk7ZS5lbGVtZW50VHlwZT10LHRoaXMuZXhwZWN0KG4uYnJhY2tldFIpLHQ9dGhpcy5maW5pc2hOb2RlKGUsXCJUU0FycmF5VHlwZVwiKX1lbHNle2NvbnN0IGU9dGhpcy5zdGFydE5vZGVBdE5vZGUodCk7ZS5vYmplY3RUeXBlPXQsZS5pbmRleFR5cGU9dGhpcy50c1BhcnNlVHlwZSgpLHRoaXMuZXhwZWN0KG4uYnJhY2tldFIpLHQ9dGhpcy5maW5pc2hOb2RlKGUsXCJUU0luZGV4ZWRBY2Nlc3NUeXBlXCIpfXJldHVybiB0fXRzUGFyc2VUeXBlT3BlcmF0b3IodCl7Y29uc3QgZT10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLmV4cGVjdENvbnRleHR1YWwodCksZS5vcGVyYXRvcj10LGUudHlwZUFubm90YXRpb249dGhpcy50c1BhcnNlVHlwZU9wZXJhdG9yT3JIaWdoZXIoKSxcInJlYWRvbmx5XCI9PT10JiZ0aGlzLnRzQ2hlY2tUeXBlQW5ub3RhdGlvbkZvclJlYWRPbmx5KGUpLHRoaXMuZmluaXNoTm9kZShlLFwiVFNUeXBlT3BlcmF0b3JcIil9dHNDaGVja1R5cGVBbm5vdGF0aW9uRm9yUmVhZE9ubHkodCl7c3dpdGNoKHQudHlwZUFubm90YXRpb24udHlwZSl7Y2FzZVwiVFNUdXBsZVR5cGVcIjpjYXNlXCJUU0FycmF5VHlwZVwiOnJldHVybjtkZWZhdWx0OnRoaXMucmFpc2UodC5zdGFydCxydC5VbmV4cGVjdGVkUmVhZG9ubHkpfX10c1BhcnNlSW5mZXJUeXBlKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMuZXhwZWN0Q29udGV4dHVhbChcImluZmVyXCIpO2NvbnN0IGU9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gZS5uYW1lPXRoaXMucGFyc2VJZGVudGlmaWVyTmFtZShlLnN0YXJ0KSx0LnR5cGVQYXJhbWV0ZXI9dGhpcy5maW5pc2hOb2RlKGUsXCJUU1R5cGVQYXJhbWV0ZXJcIiksdGhpcy5maW5pc2hOb2RlKHQsXCJUU0luZmVyVHlwZVwiKX10c1BhcnNlVHlwZU9wZXJhdG9yT3JIaWdoZXIoKXtjb25zdCB0PVtcImtleW9mXCIsXCJ1bmlxdWVcIixcInJlYWRvbmx5XCJdLmZpbmQodD0+dGhpcy5pc0NvbnRleHR1YWwodCkpO3JldHVybiB0P3RoaXMudHNQYXJzZVR5cGVPcGVyYXRvcih0KTp0aGlzLmlzQ29udGV4dHVhbChcImluZmVyXCIpP3RoaXMudHNQYXJzZUluZmVyVHlwZSgpOnRoaXMudHNQYXJzZUFycmF5VHlwZU9ySGlnaGVyKCl9dHNQYXJzZVVuaW9uT3JJbnRlcnNlY3Rpb25UeXBlKHQsZSxzKXt0aGlzLmVhdChzKTtsZXQgaT1lKCk7aWYodGhpcy5tYXRjaChzKSl7Y29uc3Qgcj1baV07Zm9yKDt0aGlzLmVhdChzKTspci5wdXNoKGUoKSk7Y29uc3QgYT10aGlzLnN0YXJ0Tm9kZUF0Tm9kZShpKTthLnR5cGVzPXIsaT10aGlzLmZpbmlzaE5vZGUoYSx0KX1yZXR1cm4gaX10c1BhcnNlSW50ZXJzZWN0aW9uVHlwZU9ySGlnaGVyKCl7cmV0dXJuIHRoaXMudHNQYXJzZVVuaW9uT3JJbnRlcnNlY3Rpb25UeXBlKFwiVFNJbnRlcnNlY3Rpb25UeXBlXCIsdGhpcy50c1BhcnNlVHlwZU9wZXJhdG9yT3JIaWdoZXIuYmluZCh0aGlzKSxuLmJpdHdpc2VBTkQpfXRzUGFyc2VVbmlvblR5cGVPckhpZ2hlcigpe3JldHVybiB0aGlzLnRzUGFyc2VVbmlvbk9ySW50ZXJzZWN0aW9uVHlwZShcIlRTVW5pb25UeXBlXCIsdGhpcy50c1BhcnNlSW50ZXJzZWN0aW9uVHlwZU9ySGlnaGVyLmJpbmQodGhpcyksbi5iaXR3aXNlT1IpfXRzSXNTdGFydE9mRnVuY3Rpb25UeXBlKCl7cmV0dXJuISF0aGlzLmlzUmVsYXRpb25hbChcIjxcIil8fHRoaXMubWF0Y2gobi5wYXJlbkwpJiZ0aGlzLnRzTG9va0FoZWFkKHRoaXMudHNJc1VuYW1iaWd1b3VzbHlTdGFydE9mRnVuY3Rpb25UeXBlLmJpbmQodGhpcykpfXRzU2tpcFBhcmFtZXRlclN0YXJ0KCl7aWYodGhpcy5tYXRjaChuLm5hbWUpfHx0aGlzLm1hdGNoKG4uX3RoaXMpKXJldHVybiB0aGlzLm5leHQoKSwhMDtpZih0aGlzLm1hdGNoKG4uYnJhY2VMKSl7bGV0IHQ9MTtmb3IodGhpcy5uZXh0KCk7dD4wOyl0aGlzLm1hdGNoKG4uYnJhY2VMKT8rK3Q6dGhpcy5tYXRjaChuLmJyYWNlUikmJi0tdCx0aGlzLm5leHQoKTtyZXR1cm4hMH1pZih0aGlzLm1hdGNoKG4uYnJhY2tldEwpKXtsZXQgdD0xO2Zvcih0aGlzLm5leHQoKTt0PjA7KXRoaXMubWF0Y2gobi5icmFja2V0TCk/Kyt0OnRoaXMubWF0Y2gobi5icmFja2V0UikmJi0tdCx0aGlzLm5leHQoKTtyZXR1cm4hMH1yZXR1cm4hMX10c0lzVW5hbWJpZ3VvdXNseVN0YXJ0T2ZGdW5jdGlvblR5cGUoKXtpZih0aGlzLm5leHQoKSx0aGlzLm1hdGNoKG4ucGFyZW5SKXx8dGhpcy5tYXRjaChuLmVsbGlwc2lzKSlyZXR1cm4hMDtpZih0aGlzLnRzU2tpcFBhcmFtZXRlclN0YXJ0KCkpe2lmKHRoaXMubWF0Y2gobi5jb2xvbil8fHRoaXMubWF0Y2gobi5jb21tYSl8fHRoaXMubWF0Y2gobi5xdWVzdGlvbil8fHRoaXMubWF0Y2gobi5lcSkpcmV0dXJuITA7aWYodGhpcy5tYXRjaChuLnBhcmVuUikmJih0aGlzLm5leHQoKSx0aGlzLm1hdGNoKG4uYXJyb3cpKSlyZXR1cm4hMH1yZXR1cm4hMX10c1BhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24odCl7cmV0dXJuIHRoaXMudHNJblR5cGUoKCk9Pntjb25zdCBlPXRoaXMuc3RhcnROb2RlKCk7dGhpcy5leHBlY3QodCk7Y29uc3Qgcz10aGlzLnRzVHJ5UGFyc2UodGhpcy50c1BhcnNlVHlwZVByZWRpY2F0ZUFzc2VydHMuYmluZCh0aGlzKSk7aWYocyYmdGhpcy5tYXRjaChuLl90aGlzKSl7bGV0IHQ9dGhpcy50c1BhcnNlVGhpc1R5cGVPclRoaXNUeXBlUHJlZGljYXRlKCk7aWYoXCJUU1RoaXNUeXBlXCI9PT10LnR5cGUpe2NvbnN0IHM9dGhpcy5zdGFydE5vZGVBdE5vZGUoZSk7cy5wYXJhbWV0ZXJOYW1lPXQscy5hc3NlcnRzPSEwLHQ9dGhpcy5maW5pc2hOb2RlKHMsXCJUU1R5cGVQcmVkaWNhdGVcIil9ZWxzZSB0LmFzc2VydHM9ITA7cmV0dXJuIGUudHlwZUFubm90YXRpb249dCx0aGlzLmZpbmlzaE5vZGUoZSxcIlRTVHlwZUFubm90YXRpb25cIil9Y29uc3QgaT10aGlzLnRzSXNJZGVudGlmaWVyKCkmJnRoaXMudHNUcnlQYXJzZSh0aGlzLnRzUGFyc2VUeXBlUHJlZGljYXRlUHJlZml4LmJpbmQodGhpcykpO2lmKCFpKXtpZighcylyZXR1cm4gdGhpcy50c1BhcnNlVHlwZUFubm90YXRpb24oITEsZSk7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZUF0Tm9kZShlKTtyZXR1cm4gdC5wYXJhbWV0ZXJOYW1lPXRoaXMucGFyc2VJZGVudGlmaWVyKCksdC5hc3NlcnRzPXMsZS50eXBlQW5ub3RhdGlvbj10aGlzLmZpbmlzaE5vZGUodCxcIlRTVHlwZVByZWRpY2F0ZVwiKSx0aGlzLmZpbmlzaE5vZGUoZSxcIlRTVHlwZUFubm90YXRpb25cIil9Y29uc3Qgcj10aGlzLnRzUGFyc2VUeXBlQW5ub3RhdGlvbighMSksYT10aGlzLnN0YXJ0Tm9kZUF0Tm9kZShlKTtyZXR1cm4gYS5wYXJhbWV0ZXJOYW1lPWksYS50eXBlQW5ub3RhdGlvbj1yLGEuYXNzZXJ0cz1zLGUudHlwZUFubm90YXRpb249dGhpcy5maW5pc2hOb2RlKGEsXCJUU1R5cGVQcmVkaWNhdGVcIiksdGhpcy5maW5pc2hOb2RlKGUsXCJUU1R5cGVBbm5vdGF0aW9uXCIpfSl9dHNUcnlQYXJzZVR5cGVPclR5cGVQcmVkaWNhdGVBbm5vdGF0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2gobi5jb2xvbik/dGhpcy50c1BhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24obi5jb2xvbik6dm9pZCAwfXRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpe3JldHVybiB0aGlzLm1hdGNoKG4uY29sb24pP3RoaXMudHNQYXJzZVR5cGVBbm5vdGF0aW9uKCk6dm9pZCAwfXRzVHJ5UGFyc2VUeXBlKCl7cmV0dXJuIHRoaXMudHNFYXRUaGVuUGFyc2VUeXBlKG4uY29sb24pfXRzUGFyc2VUeXBlUHJlZGljYXRlUHJlZml4KCl7Y29uc3QgdD10aGlzLnBhcnNlSWRlbnRpZmllcigpO2lmKHRoaXMuaXNDb250ZXh0dWFsKFwiaXNcIikmJiF0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKXJldHVybiB0aGlzLm5leHQoKSx0fXRzUGFyc2VUeXBlUHJlZGljYXRlQXNzZXJ0cygpe2lmKCF0aGlzLm1hdGNoKG4ubmFtZSl8fFwiYXNzZXJ0c1wiIT09dGhpcy5zdGF0ZS52YWx1ZXx8dGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSlyZXR1cm4hMTtjb25zdCB0PXRoaXMuc3RhdGUuY29udGFpbnNFc2M7cmV0dXJuIHRoaXMubmV4dCgpLCEoIXRoaXMubWF0Y2gobi5uYW1lKSYmIXRoaXMubWF0Y2gobi5fdGhpcykpJiYodCYmdGhpcy5yYWlzZSh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCxmLkludmFsaWRFc2NhcGVkUmVzZXJ2ZWRXb3JkLFwiYXNzZXJ0c1wiKSwhMCl9dHNQYXJzZVR5cGVBbm5vdGF0aW9uKHQ9ITAsZT10aGlzLnN0YXJ0Tm9kZSgpKXtyZXR1cm4gdGhpcy50c0luVHlwZSgoKT0+e3QmJnRoaXMuZXhwZWN0KG4uY29sb24pLGUudHlwZUFubm90YXRpb249dGhpcy50c1BhcnNlVHlwZSgpfSksdGhpcy5maW5pc2hOb2RlKGUsXCJUU1R5cGVBbm5vdGF0aW9uXCIpfXRzUGFyc2VUeXBlKCl7aXQodGhpcy5zdGF0ZS5pblR5cGUpO2NvbnN0IHQ9dGhpcy50c1BhcnNlTm9uQ29uZGl0aW9uYWxUeXBlKCk7aWYodGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKXx8IXRoaXMuZWF0KG4uX2V4dGVuZHMpKXJldHVybiB0O2NvbnN0IGU9dGhpcy5zdGFydE5vZGVBdE5vZGUodCk7cmV0dXJuIGUuY2hlY2tUeXBlPXQsZS5leHRlbmRzVHlwZT10aGlzLnRzUGFyc2VOb25Db25kaXRpb25hbFR5cGUoKSx0aGlzLmV4cGVjdChuLnF1ZXN0aW9uKSxlLnRydWVUeXBlPXRoaXMudHNQYXJzZVR5cGUoKSx0aGlzLmV4cGVjdChuLmNvbG9uKSxlLmZhbHNlVHlwZT10aGlzLnRzUGFyc2VUeXBlKCksdGhpcy5maW5pc2hOb2RlKGUsXCJUU0NvbmRpdGlvbmFsVHlwZVwiKX10c1BhcnNlTm9uQ29uZGl0aW9uYWxUeXBlKCl7cmV0dXJuIHRoaXMudHNJc1N0YXJ0T2ZGdW5jdGlvblR5cGUoKT90aGlzLnRzUGFyc2VGdW5jdGlvbk9yQ29uc3RydWN0b3JUeXBlKFwiVFNGdW5jdGlvblR5cGVcIik6dGhpcy5tYXRjaChuLl9uZXcpP3RoaXMudHNQYXJzZUZ1bmN0aW9uT3JDb25zdHJ1Y3RvclR5cGUoXCJUU0NvbnN0cnVjdG9yVHlwZVwiKTp0aGlzLnRzUGFyc2VVbmlvblR5cGVPckhpZ2hlcigpfXRzUGFyc2VUeXBlQXNzZXJ0aW9uKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpLGU9dGhpcy50c1RyeU5leHRQYXJzZUNvbnN0YW50Q29udGV4dCgpO3JldHVybiB0LnR5cGVBbm5vdGF0aW9uPWV8fHRoaXMudHNOZXh0VGhlblBhcnNlVHlwZSgpLHRoaXMuZXhwZWN0UmVsYXRpb25hbChcIj5cIiksdC5leHByZXNzaW9uPXRoaXMucGFyc2VNYXliZVVuYXJ5KCksdGhpcy5maW5pc2hOb2RlKHQsXCJUU1R5cGVBc3NlcnRpb25cIil9dHNQYXJzZUhlcml0YWdlQ2xhdXNlKHQpe2NvbnN0IGU9dGhpcy5zdGF0ZS5zdGFydCxzPXRoaXMudHNQYXJzZURlbGltaXRlZExpc3QoXCJIZXJpdGFnZUNsYXVzZUVsZW1lbnRcIix0aGlzLnRzUGFyc2VFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMuYmluZCh0aGlzKSk7cmV0dXJuIHMubGVuZ3RofHx0aGlzLnJhaXNlKGUscnQuRW1wdHlIZXJpdGFnZUNsYXVzZVR5cGUsdCksc310c1BhcnNlRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0LmV4cHJlc3Npb249dGhpcy50c1BhcnNlRW50aXR5TmFtZSghMSksdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpJiYodC50eXBlUGFyYW1ldGVycz10aGlzLnRzUGFyc2VUeXBlQXJndW1lbnRzKCkpLHRoaXMuZmluaXNoTm9kZSh0LFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIil9dHNQYXJzZUludGVyZmFjZURlY2xhcmF0aW9uKHQpe3QuaWQ9dGhpcy5wYXJzZUlkZW50aWZpZXIoKSx0aGlzLmNoZWNrTFZhbCh0LmlkLDEzMCx2b2lkIDAsXCJ0eXBlc2NyaXB0IGludGVyZmFjZSBkZWNsYXJhdGlvblwiKSx0LnR5cGVQYXJhbWV0ZXJzPXRoaXMudHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKCksdGhpcy5lYXQobi5fZXh0ZW5kcykmJih0LmV4dGVuZHM9dGhpcy50c1BhcnNlSGVyaXRhZ2VDbGF1c2UoXCJleHRlbmRzXCIpKTtjb25zdCBlPXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIGUuYm9keT10aGlzLnRzSW5UeXBlKHRoaXMudHNQYXJzZU9iamVjdFR5cGVNZW1iZXJzLmJpbmQodGhpcykpLHQuYm9keT10aGlzLmZpbmlzaE5vZGUoZSxcIlRTSW50ZXJmYWNlQm9keVwiKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTSW50ZXJmYWNlRGVjbGFyYXRpb25cIil9dHNQYXJzZVR5cGVBbGlhc0RlY2xhcmF0aW9uKHQpe3JldHVybiB0LmlkPXRoaXMucGFyc2VJZGVudGlmaWVyKCksdGhpcy5jaGVja0xWYWwodC5pZCwyLHZvaWQgMCxcInR5cGVzY3JpcHQgdHlwZSBhbGlhc1wiKSx0LnR5cGVQYXJhbWV0ZXJzPXRoaXMudHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKCksdC50eXBlQW5ub3RhdGlvbj10aGlzLnRzRXhwZWN0VGhlblBhcnNlVHlwZShuLmVxKSx0aGlzLnNlbWljb2xvbigpLHRoaXMuZmluaXNoTm9kZSh0LFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiKX10c0luTm9Db250ZXh0KHQpe2NvbnN0IGU9dGhpcy5zdGF0ZS5jb250ZXh0O3RoaXMuc3RhdGUuY29udGV4dD1bZVswXV07dHJ5e3JldHVybiB0KCl9ZmluYWxseXt0aGlzLnN0YXRlLmNvbnRleHQ9ZX19dHNJblR5cGUodCl7Y29uc3QgZT10aGlzLnN0YXRlLmluVHlwZTt0aGlzLnN0YXRlLmluVHlwZT0hMDt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e3RoaXMuc3RhdGUuaW5UeXBlPWV9fXRzRWF0VGhlblBhcnNlVHlwZSh0KXtyZXR1cm4gdGhpcy5tYXRjaCh0KT90aGlzLnRzTmV4dFRoZW5QYXJzZVR5cGUoKTp2b2lkIDB9dHNFeHBlY3RUaGVuUGFyc2VUeXBlKHQpe3JldHVybiB0aGlzLnRzRG9UaGVuUGFyc2VUeXBlKCgpPT50aGlzLmV4cGVjdCh0KSl9dHNOZXh0VGhlblBhcnNlVHlwZSgpe3JldHVybiB0aGlzLnRzRG9UaGVuUGFyc2VUeXBlKCgpPT50aGlzLm5leHQoKSl9dHNEb1RoZW5QYXJzZVR5cGUodCl7cmV0dXJuIHRoaXMudHNJblR5cGUoKCk9Pih0KCksdGhpcy50c1BhcnNlVHlwZSgpKSl9dHNQYXJzZUVudW1NZW1iZXIoKXtjb25zdCB0PXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHQuaWQ9dGhpcy5tYXRjaChuLnN0cmluZyk/dGhpcy5wYXJzZUV4cHJBdG9tKCk6dGhpcy5wYXJzZUlkZW50aWZpZXIoITApLHRoaXMuZWF0KG4uZXEpJiYodC5pbml0aWFsaXplcj10aGlzLnBhcnNlTWF5YmVBc3NpZ24oKSksdGhpcy5maW5pc2hOb2RlKHQsXCJUU0VudW1NZW1iZXJcIil9dHNQYXJzZUVudW1EZWNsYXJhdGlvbih0LGUpe3JldHVybiBlJiYodC5jb25zdD0hMCksdC5pZD10aGlzLnBhcnNlSWRlbnRpZmllcigpLHRoaXMuY2hlY2tMVmFsKHQuaWQsZT83Nzk6MjY3LHZvaWQgMCxcInR5cGVzY3JpcHQgZW51bSBkZWNsYXJhdGlvblwiKSx0aGlzLmV4cGVjdChuLmJyYWNlTCksdC5tZW1iZXJzPXRoaXMudHNQYXJzZURlbGltaXRlZExpc3QoXCJFbnVtTWVtYmVyc1wiLHRoaXMudHNQYXJzZUVudW1NZW1iZXIuYmluZCh0aGlzKSksdGhpcy5leHBlY3Qobi5icmFjZVIpLHRoaXMuZmluaXNoTm9kZSh0LFwiVFNFbnVtRGVjbGFyYXRpb25cIil9dHNQYXJzZU1vZHVsZUJsb2NrKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLnNjb3BlLmVudGVyKDApLHRoaXMuZXhwZWN0KG4uYnJhY2VMKSx0aGlzLnBhcnNlQmxvY2tPck1vZHVsZUJsb2NrQm9keSh0LmJvZHk9W10sdm9pZCAwLCEwLG4uYnJhY2VSKSx0aGlzLnNjb3BlLmV4aXQoKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTTW9kdWxlQmxvY2tcIil9dHNQYXJzZU1vZHVsZU9yTmFtZXNwYWNlRGVjbGFyYXRpb24odCxlPSExKXtpZih0LmlkPXRoaXMucGFyc2VJZGVudGlmaWVyKCksZXx8dGhpcy5jaGVja0xWYWwodC5pZCwxMDI0LG51bGwsXCJtb2R1bGUgb3IgbmFtZXNwYWNlIGRlY2xhcmF0aW9uXCIpLHRoaXMuZWF0KG4uZG90KSl7Y29uc3QgZT10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMudHNQYXJzZU1vZHVsZU9yTmFtZXNwYWNlRGVjbGFyYXRpb24oZSwhMCksdC5ib2R5PWV9ZWxzZSB0aGlzLnNjb3BlLmVudGVyKDEyOCksdGhpcy5wcm9kUGFyYW0uZW50ZXIoMCksdC5ib2R5PXRoaXMudHNQYXJzZU1vZHVsZUJsb2NrKCksdGhpcy5wcm9kUGFyYW0uZXhpdCgpLHRoaXMuc2NvcGUuZXhpdCgpO3JldHVybiB0aGlzLmZpbmlzaE5vZGUodCxcIlRTTW9kdWxlRGVjbGFyYXRpb25cIil9dHNQYXJzZUFtYmllbnRFeHRlcm5hbE1vZHVsZURlY2xhcmF0aW9uKHQpe3JldHVybiB0aGlzLmlzQ29udGV4dHVhbChcImdsb2JhbFwiKT8odC5nbG9iYWw9ITAsdC5pZD10aGlzLnBhcnNlSWRlbnRpZmllcigpKTp0aGlzLm1hdGNoKG4uc3RyaW5nKT90LmlkPXRoaXMucGFyc2VFeHByQXRvbSgpOnRoaXMudW5leHBlY3RlZCgpLHRoaXMubWF0Y2gobi5icmFjZUwpPyh0aGlzLnNjb3BlLmVudGVyKDEyOCksdGhpcy5wcm9kUGFyYW0uZW50ZXIoMCksdC5ib2R5PXRoaXMudHNQYXJzZU1vZHVsZUJsb2NrKCksdGhpcy5wcm9kUGFyYW0uZXhpdCgpLHRoaXMuc2NvcGUuZXhpdCgpKTp0aGlzLnNlbWljb2xvbigpLHRoaXMuZmluaXNoTm9kZSh0LFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiKX10c1BhcnNlSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24odCxlKXtyZXR1cm4gdC5pc0V4cG9ydD1lfHwhMSx0LmlkPXRoaXMucGFyc2VJZGVudGlmaWVyKCksdGhpcy5jaGVja0xWYWwodC5pZCw5LHZvaWQgMCxcImltcG9ydCBlcXVhbHMgZGVjbGFyYXRpb25cIiksdGhpcy5leHBlY3Qobi5lcSksdC5tb2R1bGVSZWZlcmVuY2U9dGhpcy50c1BhcnNlTW9kdWxlUmVmZXJlbmNlKCksdGhpcy5zZW1pY29sb24oKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb25cIil9dHNJc0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlKCl7cmV0dXJuIHRoaXMuaXNDb250ZXh0dWFsKFwicmVxdWlyZVwiKSYmNDA9PT10aGlzLmxvb2thaGVhZENoYXJDb2RlKCl9dHNQYXJzZU1vZHVsZVJlZmVyZW5jZSgpe3JldHVybiB0aGlzLnRzSXNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSgpP3RoaXMudHNQYXJzZUV4dGVybmFsTW9kdWxlUmVmZXJlbmNlKCk6dGhpcy50c1BhcnNlRW50aXR5TmFtZSghMSl9dHNQYXJzZUV4dGVybmFsTW9kdWxlUmVmZXJlbmNlKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO2lmKHRoaXMuZXhwZWN0Q29udGV4dHVhbChcInJlcXVpcmVcIiksdGhpcy5leHBlY3Qobi5wYXJlbkwpLCF0aGlzLm1hdGNoKG4uc3RyaW5nKSl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdC5leHByZXNzaW9uPXRoaXMucGFyc2VFeHByQXRvbSgpLHRoaXMuZXhwZWN0KG4ucGFyZW5SKSx0aGlzLmZpbmlzaE5vZGUodCxcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIil9dHNMb29rQWhlYWQodCl7Y29uc3QgZT10aGlzLnN0YXRlLmNsb25lKCkscz10KCk7cmV0dXJuIHRoaXMuc3RhdGU9ZSxzfXRzVHJ5UGFyc2VBbmRDYXRjaCh0KXtjb25zdCBlPXRoaXMudHJ5UGFyc2UoZT0+dCgpfHxlKCkpO2lmKCFlLmFib3J0ZWQmJmUubm9kZSlyZXR1cm4gZS5lcnJvciYmKHRoaXMuc3RhdGU9ZS5mYWlsU3RhdGUpLGUubm9kZX10c1RyeVBhcnNlKHQpe2NvbnN0IGU9dGhpcy5zdGF0ZS5jbG9uZSgpLHM9dCgpO3JldHVybiB2b2lkIDAhPT1zJiYhMSE9PXM/czp2b2lkKHRoaXMuc3RhdGU9ZSl9dHNUcnlQYXJzZURlY2xhcmUodCl7aWYodGhpcy5pc0xpbmVUZXJtaW5hdG9yKCkpcmV0dXJuO2xldCBlLHM9dGhpcy5zdGF0ZS50eXBlO3N3aXRjaCh0aGlzLmlzQ29udGV4dHVhbChcImxldFwiKSYmKHM9bi5fdmFyLGU9XCJsZXRcIikscyl7Y2FzZSBuLl9mdW5jdGlvbjpyZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uU3RhdGVtZW50KHQsITEsITApO2Nhc2Ugbi5fY2xhc3M6cmV0dXJuIHQuZGVjbGFyZT0hMCx0aGlzLnBhcnNlQ2xhc3ModCwhMCwhMSk7Y2FzZSBuLl9jb25zdDppZih0aGlzLm1hdGNoKG4uX2NvbnN0KSYmdGhpcy5pc0xvb2thaGVhZENvbnRleHR1YWwoXCJlbnVtXCIpKXJldHVybiB0aGlzLmV4cGVjdChuLl9jb25zdCksdGhpcy5leHBlY3RDb250ZXh0dWFsKFwiZW51bVwiKSx0aGlzLnRzUGFyc2VFbnVtRGVjbGFyYXRpb24odCwhMCk7Y2FzZSBuLl92YXI6cmV0dXJuIGU9ZXx8dGhpcy5zdGF0ZS52YWx1ZSx0aGlzLnBhcnNlVmFyU3RhdGVtZW50KHQsZSk7Y2FzZSBuLm5hbWU6e2NvbnN0IGU9dGhpcy5zdGF0ZS52YWx1ZTtyZXR1cm5cImdsb2JhbFwiPT09ZT90aGlzLnRzUGFyc2VBbWJpZW50RXh0ZXJuYWxNb2R1bGVEZWNsYXJhdGlvbih0KTp0aGlzLnRzUGFyc2VEZWNsYXJhdGlvbih0LGUsITApfX19dHNUcnlQYXJzZUV4cG9ydERlY2xhcmF0aW9uKCl7cmV0dXJuIHRoaXMudHNQYXJzZURlY2xhcmF0aW9uKHRoaXMuc3RhcnROb2RlKCksdGhpcy5zdGF0ZS52YWx1ZSwhMCl9dHNQYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQodCxlKXtzd2l0Y2goZS5uYW1lKXtjYXNlXCJkZWNsYXJlXCI6e2NvbnN0IGU9dGhpcy50c1RyeVBhcnNlRGVjbGFyZSh0KTtpZihlKXJldHVybiBlLmRlY2xhcmU9ITAsZTticmVha31jYXNlXCJnbG9iYWxcIjppZih0aGlzLm1hdGNoKG4uYnJhY2VMKSl7dGhpcy5zY29wZS5lbnRlcigxMjgpLHRoaXMucHJvZFBhcmFtLmVudGVyKDApO2NvbnN0IHM9dDtyZXR1cm4gcy5nbG9iYWw9ITAscy5pZD1lLHMuYm9keT10aGlzLnRzUGFyc2VNb2R1bGVCbG9jaygpLHRoaXMuc2NvcGUuZXhpdCgpLHRoaXMucHJvZFBhcmFtLmV4aXQoKSx0aGlzLmZpbmlzaE5vZGUocyxcIlRTTW9kdWxlRGVjbGFyYXRpb25cIil9YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdGhpcy50c1BhcnNlRGVjbGFyYXRpb24odCxlLm5hbWUsITEpfX10c1BhcnNlRGVjbGFyYXRpb24odCxlLHMpe3N3aXRjaChlKXtjYXNlXCJhYnN0cmFjdFwiOmlmKHRoaXMudHNDaGVja0xpbmVUZXJtaW5hdG9yQW5kTWF0Y2gobi5fY2xhc3Mscykpe2NvbnN0IGU9dDtyZXR1cm4gZS5hYnN0cmFjdD0hMCxzJiYodGhpcy5uZXh0KCksdGhpcy5tYXRjaChuLl9jbGFzcyl8fHRoaXMudW5leHBlY3RlZChudWxsLG4uX2NsYXNzKSksdGhpcy5wYXJzZUNsYXNzKGUsITAsITEpfWJyZWFrO2Nhc2VcImVudW1cIjppZihzfHx0aGlzLm1hdGNoKG4ubmFtZSkpcmV0dXJuIHMmJnRoaXMubmV4dCgpLHRoaXMudHNQYXJzZUVudW1EZWNsYXJhdGlvbih0LCExKTticmVhaztjYXNlXCJpbnRlcmZhY2VcIjppZih0aGlzLnRzQ2hlY2tMaW5lVGVybWluYXRvckFuZE1hdGNoKG4ubmFtZSxzKSlyZXR1cm4gcyYmdGhpcy5uZXh0KCksdGhpcy50c1BhcnNlSW50ZXJmYWNlRGVjbGFyYXRpb24odCk7YnJlYWs7Y2FzZVwibW9kdWxlXCI6aWYocyYmdGhpcy5uZXh0KCksdGhpcy5tYXRjaChuLnN0cmluZykpcmV0dXJuIHRoaXMudHNQYXJzZUFtYmllbnRFeHRlcm5hbE1vZHVsZURlY2xhcmF0aW9uKHQpO2lmKHRoaXMudHNDaGVja0xpbmVUZXJtaW5hdG9yQW5kTWF0Y2gobi5uYW1lLHMpKXJldHVybiB0aGlzLnRzUGFyc2VNb2R1bGVPck5hbWVzcGFjZURlY2xhcmF0aW9uKHQpO2JyZWFrO2Nhc2VcIm5hbWVzcGFjZVwiOmlmKHRoaXMudHNDaGVja0xpbmVUZXJtaW5hdG9yQW5kTWF0Y2gobi5uYW1lLHMpKXJldHVybiBzJiZ0aGlzLm5leHQoKSx0aGlzLnRzUGFyc2VNb2R1bGVPck5hbWVzcGFjZURlY2xhcmF0aW9uKHQpO2JyZWFrO2Nhc2VcInR5cGVcIjppZih0aGlzLnRzQ2hlY2tMaW5lVGVybWluYXRvckFuZE1hdGNoKG4ubmFtZSxzKSlyZXR1cm4gcyYmdGhpcy5uZXh0KCksdGhpcy50c1BhcnNlVHlwZUFsaWFzRGVjbGFyYXRpb24odCl9fXRzQ2hlY2tMaW5lVGVybWluYXRvckFuZE1hdGNoKHQsZSl7cmV0dXJuKGV8fHRoaXMubWF0Y2godCkpJiYhdGhpcy5pc0xpbmVUZXJtaW5hdG9yKCl9dHNUcnlQYXJzZUdlbmVyaWNBc3luY0Fycm93RnVuY3Rpb24odCxlKXtpZighdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpKXJldHVybjtjb25zdCBzPXRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycyxpPXRoaXMuc3RhdGUueWllbGRQb3Mscj10aGlzLnN0YXRlLmF3YWl0UG9zO3RoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycz0hMCx0aGlzLnN0YXRlLnlpZWxkUG9zPS0xLHRoaXMuc3RhdGUuYXdhaXRQb3M9LTE7Y29uc3QgYT10aGlzLnRzVHJ5UGFyc2VBbmRDYXRjaCgoKT0+e2NvbnN0IHM9dGhpcy5zdGFydE5vZGVBdCh0LGUpO3JldHVybiBzLnR5cGVQYXJhbWV0ZXJzPXRoaXMudHNQYXJzZVR5cGVQYXJhbWV0ZXJzKCksc3VwZXIucGFyc2VGdW5jdGlvblBhcmFtcyhzKSxzLnJldHVyblR5cGU9dGhpcy50c1RyeVBhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24oKSx0aGlzLmV4cGVjdChuLmFycm93KSxzfSk7cmV0dXJuIHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycz1zLHRoaXMuc3RhdGUueWllbGRQb3M9aSx0aGlzLnN0YXRlLmF3YWl0UG9zPXIsYT90aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKGEsbnVsbCwhMCk6dm9pZCAwfXRzUGFyc2VUeXBlQXJndW1lbnRzKCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0LnBhcmFtcz10aGlzLnRzSW5UeXBlKCgpPT50aGlzLnRzSW5Ob0NvbnRleHQoKCk9Pih0aGlzLmV4cGVjdFJlbGF0aW9uYWwoXCI8XCIpLHRoaXMudHNQYXJzZURlbGltaXRlZExpc3QoXCJUeXBlUGFyYW1ldGVyc09yQXJndW1lbnRzXCIsdGhpcy50c1BhcnNlVHlwZS5iaW5kKHRoaXMpKSkpKSx0aGlzLnN0YXRlLmV4cHJBbGxvd2VkPSExLHRoaXMuZXhwZWN0UmVsYXRpb25hbChcIj5cIiksdGhpcy5maW5pc2hOb2RlKHQsXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpfXRzSXNEZWNsYXJhdGlvblN0YXJ0KCl7aWYodGhpcy5tYXRjaChuLm5hbWUpKXN3aXRjaCh0aGlzLnN0YXRlLnZhbHVlKXtjYXNlXCJhYnN0cmFjdFwiOmNhc2VcImRlY2xhcmVcIjpjYXNlXCJlbnVtXCI6Y2FzZVwiaW50ZXJmYWNlXCI6Y2FzZVwibW9kdWxlXCI6Y2FzZVwibmFtZXNwYWNlXCI6Y2FzZVwidHlwZVwiOnJldHVybiEwfXJldHVybiExfWlzRXhwb3J0RGVmYXVsdFNwZWNpZmllcigpe3JldHVybiF0aGlzLnRzSXNEZWNsYXJhdGlvblN0YXJ0KCkmJnN1cGVyLmlzRXhwb3J0RGVmYXVsdFNwZWNpZmllcigpfXBhcnNlQXNzaWduYWJsZUxpc3RJdGVtKHQsZSl7Y29uc3Qgcz10aGlzLnN0YXRlLnN0YXJ0LGk9dGhpcy5zdGF0ZS5zdGFydExvYztsZXQgcixhPSExO3QmJihyPXRoaXMucGFyc2VBY2Nlc3NNb2RpZmllcigpLGE9ISF0aGlzLnRzUGFyc2VNb2RpZmllcihbXCJyZWFkb25seVwiXSkpO2NvbnN0IG49dGhpcy5wYXJzZU1heWJlRGVmYXVsdCgpO3RoaXMucGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW1UeXBlcyhuKTtjb25zdCBvPXRoaXMucGFyc2VNYXliZURlZmF1bHQobi5zdGFydCxuLmxvYy5zdGFydCxuKTtpZihyfHxhKXtjb25zdCB0PXRoaXMuc3RhcnROb2RlQXQocyxpKTtyZXR1cm4gZS5sZW5ndGgmJih0LmRlY29yYXRvcnM9ZSksciYmKHQuYWNjZXNzaWJpbGl0eT1yKSxhJiYodC5yZWFkb25seT1hKSxcIklkZW50aWZpZXJcIiE9PW8udHlwZSYmXCJBc3NpZ25tZW50UGF0dGVyblwiIT09by50eXBlJiZ0aGlzLnJhaXNlKHQuc3RhcnQscnQuVW5zdXBwb3J0ZWRQYXJhbWV0ZXJQcm9wZXJ0eUtpbmQpLHQucGFyYW1ldGVyPW8sdGhpcy5maW5pc2hOb2RlKHQsXCJUU1BhcmFtZXRlclByb3BlcnR5XCIpfXJldHVybiBlLmxlbmd0aCYmKG4uZGVjb3JhdG9ycz1lKSxvfXBhcnNlRnVuY3Rpb25Cb2R5QW5kRmluaXNoKHQsZSxzPSExKXt0aGlzLm1hdGNoKG4uY29sb24pJiYodC5yZXR1cm5UeXBlPXRoaXMudHNQYXJzZVR5cGVPclR5cGVQcmVkaWNhdGVBbm5vdGF0aW9uKG4uY29sb24pKTtjb25zdCBpPVwiRnVuY3Rpb25EZWNsYXJhdGlvblwiPT09ZT9cIlRTRGVjbGFyZUZ1bmN0aW9uXCI6XCJDbGFzc01ldGhvZFwiPT09ZT9cIlRTRGVjbGFyZU1ldGhvZFwiOnZvaWQgMDtpJiYhdGhpcy5tYXRjaChuLmJyYWNlTCkmJnRoaXMuaXNMaW5lVGVybWluYXRvcigpP3RoaXMuZmluaXNoTm9kZSh0LGkpOnN1cGVyLnBhcnNlRnVuY3Rpb25Cb2R5QW5kRmluaXNoKHQsZSxzKX1yZWdpc3RlckZ1bmN0aW9uU3RhdGVtZW50SWQodCl7IXQuYm9keSYmdC5pZD90aGlzLmNoZWNrTFZhbCh0LmlkLDEwMjQsbnVsbCxcImZ1bmN0aW9uIG5hbWVcIik6c3VwZXIucmVnaXN0ZXJGdW5jdGlvblN0YXRlbWVudElkKC4uLmFyZ3VtZW50cyl9cGFyc2VTdWJzY3JpcHQodCxlLHMsaSxyKXtpZighdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSYmdGhpcy5tYXRjaChuLmJhbmcpKXt0aGlzLnN0YXRlLmV4cHJBbGxvd2VkPSExLHRoaXMubmV4dCgpO2NvbnN0IGk9dGhpcy5zdGFydE5vZGVBdChlLHMpO3JldHVybiBpLmV4cHJlc3Npb249dCx0aGlzLmZpbmlzaE5vZGUoaSxcIlRTTm9uTnVsbEV4cHJlc3Npb25cIil9aWYodGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpKXtjb25zdCBhPXRoaXMudHNUcnlQYXJzZUFuZENhdGNoKCgpPT57aWYoIWkmJnRoaXMuYXRQb3NzaWJsZUFzeW5jQXJyb3codCkpe2NvbnN0IHQ9dGhpcy50c1RyeVBhcnNlR2VuZXJpY0FzeW5jQXJyb3dGdW5jdGlvbihlLHMpO2lmKHQpcmV0dXJuIHR9Y29uc3QgYT10aGlzLnN0YXJ0Tm9kZUF0KGUscyk7YS5jYWxsZWU9dDtjb25zdCBvPXRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKTtpZihvKXtpZighaSYmdGhpcy5lYXQobi5wYXJlbkwpKXJldHVybiBhLmFyZ3VtZW50cz10aGlzLnBhcnNlQ2FsbEV4cHJlc3Npb25Bcmd1bWVudHMobi5wYXJlblIsITEpLGEudHlwZVBhcmFtZXRlcnM9byx0aGlzLmZpbmlzaENhbGxFeHByZXNzaW9uKGEsci5vcHRpb25hbENoYWluTWVtYmVyKTtpZih0aGlzLm1hdGNoKG4uYmFja1F1b3RlKSlyZXR1cm4gdGhpcy5wYXJzZVRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbihlLHMsdCxyLG8pfXRoaXMudW5leHBlY3RlZCgpfSk7aWYoYSlyZXR1cm4gYX1yZXR1cm4gc3VwZXIucGFyc2VTdWJzY3JpcHQodCxlLHMsaSxyKX1wYXJzZU5ld0FyZ3VtZW50cyh0KXtpZih0aGlzLmlzUmVsYXRpb25hbChcIjxcIikpe2NvbnN0IGU9dGhpcy50c1RyeVBhcnNlQW5kQ2F0Y2goKCk9Pntjb25zdCB0PXRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKTtyZXR1cm4gdGhpcy5tYXRjaChuLnBhcmVuTCl8fHRoaXMudW5leHBlY3RlZCgpLHR9KTtlJiYodC50eXBlUGFyYW1ldGVycz1lKX1zdXBlci5wYXJzZU5ld0FyZ3VtZW50cyh0KX1wYXJzZUV4cHJPcCh0LGUscyxpLHIpe2lmKHN0KG4uX2luLmJpbm9wKT5pJiYhdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSYmdGhpcy5pc0NvbnRleHR1YWwoXCJhc1wiKSl7Y29uc3QgYT10aGlzLnN0YXJ0Tm9kZUF0KGUscyk7YS5leHByZXNzaW9uPXQ7Y29uc3Qgbj10aGlzLnRzVHJ5TmV4dFBhcnNlQ29uc3RhbnRDb250ZXh0KCk7cmV0dXJuIGEudHlwZUFubm90YXRpb249bnx8dGhpcy50c05leHRUaGVuUGFyc2VUeXBlKCksdGhpcy5maW5pc2hOb2RlKGEsXCJUU0FzRXhwcmVzc2lvblwiKSx0aGlzLnBhcnNlRXhwck9wKGEsZSxzLGkscil9cmV0dXJuIHN1cGVyLnBhcnNlRXhwck9wKHQsZSxzLGkscil9Y2hlY2tSZXNlcnZlZFdvcmQodCxlLHMsaSl7fWNoZWNrRHVwbGljYXRlRXhwb3J0cygpe31wYXJzZUltcG9ydCh0KXtpZih0aGlzLm1hdGNoKG4ubmFtZSl8fHRoaXMubWF0Y2gobi5zdGFyKXx8dGhpcy5tYXRjaChuLmJyYWNlTCkpe2NvbnN0IGU9dGhpcy5sb29rYWhlYWQoKTtpZih0aGlzLm1hdGNoKG4ubmFtZSkmJmUudHlwZT09PW4uZXEpcmV0dXJuIHRoaXMudHNQYXJzZUltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKHQpOyF0aGlzLmlzQ29udGV4dHVhbChcInR5cGVcIil8fGUudHlwZT09PW4uY29tbWF8fGUudHlwZT09PW4ubmFtZSYmXCJmcm9tXCI9PT1lLnZhbHVlP3QuaW1wb3J0S2luZD1cInZhbHVlXCI6KHQuaW1wb3J0S2luZD1cInR5cGVcIix0aGlzLm5leHQoKSl9Y29uc3QgZT1zdXBlci5wYXJzZUltcG9ydCh0KTtyZXR1cm5cInR5cGVcIj09PWUuaW1wb3J0S2luZCYmZS5zcGVjaWZpZXJzLmxlbmd0aD4xJiZcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIj09PWUuc3BlY2lmaWVyc1swXS50eXBlJiZ0aGlzLnJhaXNlKGUuc3RhcnQsXCJBIHR5cGUtb25seSBpbXBvcnQgY2FuIHNwZWNpZnkgYSBkZWZhdWx0IGltcG9ydCBvciBuYW1lZCBiaW5kaW5ncywgYnV0IG5vdCBib3RoLlwiKSxlfXBhcnNlRXhwb3J0KHQpe2lmKHRoaXMubWF0Y2gobi5faW1wb3J0KSlyZXR1cm4gdGhpcy5leHBlY3Qobi5faW1wb3J0KSx0aGlzLnRzUGFyc2VJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbih0LCEwKTtpZih0aGlzLmVhdChuLmVxKSl7Y29uc3QgZT10O3JldHVybiBlLmV4cHJlc3Npb249dGhpcy5wYXJzZUV4cHJlc3Npb24oKSx0aGlzLnNlbWljb2xvbigpLHRoaXMuZmluaXNoTm9kZShlLFwiVFNFeHBvcnRBc3NpZ25tZW50XCIpfWlmKHRoaXMuZWF0Q29udGV4dHVhbChcImFzXCIpKXtjb25zdCBlPXQ7cmV0dXJuIHRoaXMuZXhwZWN0Q29udGV4dHVhbChcIm5hbWVzcGFjZVwiKSxlLmlkPXRoaXMucGFyc2VJZGVudGlmaWVyKCksdGhpcy5zZW1pY29sb24oKSx0aGlzLmZpbmlzaE5vZGUoZSxcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIil9cmV0dXJuIHRoaXMuaXNDb250ZXh0dWFsKFwidHlwZVwiKSYmdGhpcy5sb29rYWhlYWQoKS50eXBlPT09bi5icmFjZUw/KHRoaXMubmV4dCgpLHQuZXhwb3J0S2luZD1cInR5cGVcIik6dC5leHBvcnRLaW5kPVwidmFsdWVcIixzdXBlci5wYXJzZUV4cG9ydCh0KX1pc0Fic3RyYWN0Q2xhc3MoKXtyZXR1cm4gdGhpcy5pc0NvbnRleHR1YWwoXCJhYnN0cmFjdFwiKSYmdGhpcy5sb29rYWhlYWQoKS50eXBlPT09bi5fY2xhc3N9cGFyc2VFeHBvcnREZWZhdWx0RXhwcmVzc2lvbigpe2lmKHRoaXMuaXNBYnN0cmFjdENsYXNzKCkpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5wYXJzZUNsYXNzKHQsITAsITApLHQuYWJzdHJhY3Q9ITAsdH1pZihcImludGVyZmFjZVwiPT09dGhpcy5zdGF0ZS52YWx1ZSl7Y29uc3QgdD10aGlzLnRzUGFyc2VEZWNsYXJhdGlvbih0aGlzLnN0YXJ0Tm9kZSgpLHRoaXMuc3RhdGUudmFsdWUsITApO2lmKHQpcmV0dXJuIHR9cmV0dXJuIHN1cGVyLnBhcnNlRXhwb3J0RGVmYXVsdEV4cHJlc3Npb24oKX1wYXJzZVN0YXRlbWVudENvbnRlbnQodCxlKXtpZih0aGlzLnN0YXRlLnR5cGU9PT1uLl9jb25zdCl7Y29uc3QgdD10aGlzLmxvb2thaGVhZCgpO2lmKHQudHlwZT09PW4ubmFtZSYmXCJlbnVtXCI9PT10LnZhbHVlKXtjb25zdCB0PXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHRoaXMuZXhwZWN0KG4uX2NvbnN0KSx0aGlzLmV4cGVjdENvbnRleHR1YWwoXCJlbnVtXCIpLHRoaXMudHNQYXJzZUVudW1EZWNsYXJhdGlvbih0LCEwKX19cmV0dXJuIHN1cGVyLnBhcnNlU3RhdGVtZW50Q29udGVudCh0LGUpfXBhcnNlQWNjZXNzTW9kaWZpZXIoKXtyZXR1cm4gdGhpcy50c1BhcnNlTW9kaWZpZXIoW1wicHVibGljXCIsXCJwcm90ZWN0ZWRcIixcInByaXZhdGVcIl0pfXBhcnNlQ2xhc3NNZW1iZXIodCxlLHMsaSl7dGhpcy50c1BhcnNlTW9kaWZpZXJzKGUsW1wiZGVjbGFyZVwiXSk7Y29uc3Qgcj10aGlzLnBhcnNlQWNjZXNzTW9kaWZpZXIoKTtyJiYoZS5hY2Nlc3NpYmlsaXR5PXIpLHRoaXMudHNQYXJzZU1vZGlmaWVycyhlLFtcImRlY2xhcmVcIl0pLHN1cGVyLnBhcnNlQ2xhc3NNZW1iZXIodCxlLHMsaSl9cGFyc2VDbGFzc01lbWJlcldpdGhJc1N0YXRpYyh0LGUscyxpLHIpe3RoaXMudHNQYXJzZU1vZGlmaWVycyhlLFtcImFic3RyYWN0XCIsXCJyZWFkb25seVwiLFwiZGVjbGFyZVwiXSk7Y29uc3QgYT10aGlzLnRzVHJ5UGFyc2VJbmRleFNpZ25hdHVyZShlKTtpZihhKXJldHVybiB0LmJvZHkucHVzaChhKSxlLmFic3RyYWN0JiZ0aGlzLnJhaXNlKGUuc3RhcnQscnQuSW5kZXhTaWduYXR1cmVIYXNBYnN0cmFjdCksaSYmdGhpcy5yYWlzZShlLnN0YXJ0LHJ0LkluZGV4U2lnbmF0dXJlSGFzU3RhdGljKSx2b2lkKGUuYWNjZXNzaWJpbGl0eSYmdGhpcy5yYWlzZShlLnN0YXJ0LHJ0LkluZGV4U2lnbmF0dXJlSGFzQWNjZXNzaWJpbGl0eSxlLmFjY2Vzc2liaWxpdHkpKTtzdXBlci5wYXJzZUNsYXNzTWVtYmVyV2l0aElzU3RhdGljKHQsZSxzLGkscil9cGFyc2VQb3N0TWVtYmVyTmFtZU1vZGlmaWVycyh0KXt0aGlzLmVhdChuLnF1ZXN0aW9uKSYmKHQub3B0aW9uYWw9ITApLHQucmVhZG9ubHkmJnRoaXMubWF0Y2gobi5wYXJlbkwpJiZ0aGlzLnJhaXNlKHQuc3RhcnQscnQuQ2xhc3NNZXRob2RIYXNSZWFkb25seSksdC5kZWNsYXJlJiZ0aGlzLm1hdGNoKG4ucGFyZW5MKSYmdGhpcy5yYWlzZSh0LnN0YXJ0LHJ0LkNsYXNzTWV0aG9kSGFzRGVjbGFyZSl9cGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KHQsZSl7cmV0dXJuKFwiSWRlbnRpZmllclwiPT09ZS50eXBlP3RoaXMudHNQYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQodCxlKTp2b2lkIDApfHxzdXBlci5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQodCxlKX1zaG91bGRQYXJzZUV4cG9ydERlY2xhcmF0aW9uKCl7cmV0dXJuISF0aGlzLnRzSXNEZWNsYXJhdGlvblN0YXJ0KCl8fHN1cGVyLnNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKX1wYXJzZUNvbmRpdGlvbmFsKHQsZSxzLGkscil7aWYoIXJ8fCF0aGlzLm1hdGNoKG4ucXVlc3Rpb24pKXJldHVybiBzdXBlci5wYXJzZUNvbmRpdGlvbmFsKHQsZSxzLGkscik7Y29uc3QgYT10aGlzLnRyeVBhcnNlKCgpPT5zdXBlci5wYXJzZUNvbmRpdGlvbmFsKHQsZSxzLGkpKTtyZXR1cm4gYS5ub2RlPyhhLmVycm9yJiYodGhpcy5zdGF0ZT1hLmZhaWxTdGF0ZSksYS5ub2RlKTooci5zdGFydD1hLmVycm9yLnBvc3x8dGhpcy5zdGF0ZS5zdGFydCx0KX1wYXJzZVBhcmVuSXRlbSh0LGUscyl7aWYodD1zdXBlci5wYXJzZVBhcmVuSXRlbSh0LGUscyksdGhpcy5lYXQobi5xdWVzdGlvbikmJih0Lm9wdGlvbmFsPSEwLHRoaXMucmVzZXRFbmRMb2NhdGlvbih0KSksdGhpcy5tYXRjaChuLmNvbG9uKSl7Y29uc3QgaT10aGlzLnN0YXJ0Tm9kZUF0KGUscyk7cmV0dXJuIGkuZXhwcmVzc2lvbj10LGkudHlwZUFubm90YXRpb249dGhpcy50c1BhcnNlVHlwZUFubm90YXRpb24oKSx0aGlzLmZpbmlzaE5vZGUoaSxcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCIpfXJldHVybiB0fXBhcnNlRXhwb3J0RGVjbGFyYXRpb24odCl7Y29uc3QgZT10aGlzLnN0YXRlLnN0YXJ0LHM9dGhpcy5zdGF0ZS5zdGFydExvYyxpPXRoaXMuZWF0Q29udGV4dHVhbChcImRlY2xhcmVcIik7bGV0IHI7cmV0dXJuIHRoaXMubWF0Y2gobi5uYW1lKSYmKHI9dGhpcy50c1RyeVBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKSkscnx8KHI9c3VwZXIucGFyc2VFeHBvcnREZWNsYXJhdGlvbih0KSksciYmKFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiPT09ci50eXBlfHxcIlRTVHlwZUFsaWFzRGVjbGFyYXRpb25cIj09PXIudHlwZXx8aSkmJih0LmV4cG9ydEtpbmQ9XCJ0eXBlXCIpLHImJmkmJih0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbihyLGUscyksci5kZWNsYXJlPSEwKSxyfXBhcnNlQ2xhc3NJZCh0LGUscyl7aWYoKCFlfHxzKSYmdGhpcy5pc0NvbnRleHR1YWwoXCJpbXBsZW1lbnRzXCIpKXJldHVybjtzdXBlci5wYXJzZUNsYXNzSWQodCxlLHMsdC5kZWNsYXJlPzEwMjQ6MTM5KTtjb25zdCBpPXRoaXMudHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKCk7aSYmKHQudHlwZVBhcmFtZXRlcnM9aSl9cGFyc2VDbGFzc1Byb3BlcnR5QW5ub3RhdGlvbih0KXshdC5vcHRpb25hbCYmdGhpcy5lYXQobi5iYW5nKSYmKHQuZGVmaW5pdGU9ITApO2NvbnN0IGU9dGhpcy50c1RyeVBhcnNlVHlwZUFubm90YXRpb24oKTtlJiYodC50eXBlQW5ub3RhdGlvbj1lKX1wYXJzZUNsYXNzUHJvcGVydHkodCl7cmV0dXJuIHRoaXMucGFyc2VDbGFzc1Byb3BlcnR5QW5ub3RhdGlvbih0KSx0LmRlY2xhcmUmJnRoaXMubWF0Y2gobi5lcXVhbCkmJnRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxydC5EZWNsYXJlQ2xhc3NGaWVsZEhhc0luaXRpYWxpemVyKSxzdXBlci5wYXJzZUNsYXNzUHJvcGVydHkodCl9cGFyc2VDbGFzc1ByaXZhdGVQcm9wZXJ0eSh0KXtyZXR1cm4gdC5hYnN0cmFjdCYmdGhpcy5yYWlzZSh0LnN0YXJ0LHJ0LlByaXZhdGVFbGVtZW50SGFzQWJzdHJhY3QpLHQuYWNjZXNzaWJpbGl0eSYmdGhpcy5yYWlzZSh0LnN0YXJ0LHJ0LlByaXZhdGVFbGVtZW50SGFzQWNjZXNzaWJpbGl0eSx0LmFjY2Vzc2liaWxpdHkpLHRoaXMucGFyc2VDbGFzc1Byb3BlcnR5QW5ub3RhdGlvbih0KSxzdXBlci5wYXJzZUNsYXNzUHJpdmF0ZVByb3BlcnR5KHQpfXB1c2hDbGFzc01ldGhvZCh0LGUscyxpLHIsYSl7Y29uc3Qgbj10aGlzLnRzVHJ5UGFyc2VUeXBlUGFyYW1ldGVycygpO24mJihlLnR5cGVQYXJhbWV0ZXJzPW4pLHN1cGVyLnB1c2hDbGFzc01ldGhvZCh0LGUscyxpLHIsYSl9cHVzaENsYXNzUHJpdmF0ZU1ldGhvZCh0LGUscyxpKXtjb25zdCByPXRoaXMudHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKCk7ciYmKGUudHlwZVBhcmFtZXRlcnM9ciksc3VwZXIucHVzaENsYXNzUHJpdmF0ZU1ldGhvZCh0LGUscyxpKX1wYXJzZUNsYXNzU3VwZXIodCl7c3VwZXIucGFyc2VDbGFzc1N1cGVyKHQpLHQuc3VwZXJDbGFzcyYmdGhpcy5pc1JlbGF0aW9uYWwoXCI8XCIpJiYodC5zdXBlclR5cGVQYXJhbWV0ZXJzPXRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKSksdGhpcy5lYXRDb250ZXh0dWFsKFwiaW1wbGVtZW50c1wiKSYmKHQuaW1wbGVtZW50cz10aGlzLnRzUGFyc2VIZXJpdGFnZUNsYXVzZShcImltcGxlbWVudHNcIikpfXBhcnNlT2JqUHJvcFZhbHVlKHQsLi4uZSl7Y29uc3Qgcz10aGlzLnRzVHJ5UGFyc2VUeXBlUGFyYW1ldGVycygpO3MmJih0LnR5cGVQYXJhbWV0ZXJzPXMpLHN1cGVyLnBhcnNlT2JqUHJvcFZhbHVlKHQsLi4uZSl9cGFyc2VGdW5jdGlvblBhcmFtcyh0LGUpe2NvbnN0IHM9dGhpcy50c1RyeVBhcnNlVHlwZVBhcmFtZXRlcnMoKTtzJiYodC50eXBlUGFyYW1ldGVycz1zKSxzdXBlci5wYXJzZUZ1bmN0aW9uUGFyYW1zKHQsZSl9cGFyc2VWYXJJZCh0LGUpe3N1cGVyLnBhcnNlVmFySWQodCxlKSxcIklkZW50aWZpZXJcIj09PXQuaWQudHlwZSYmdGhpcy5lYXQobi5iYW5nKSYmKHQuZGVmaW5pdGU9ITApO2NvbnN0IHM9dGhpcy50c1RyeVBhcnNlVHlwZUFubm90YXRpb24oKTtzJiYodC5pZC50eXBlQW5ub3RhdGlvbj1zLHRoaXMucmVzZXRFbmRMb2NhdGlvbih0LmlkKSl9cGFyc2VBc3luY0Fycm93RnJvbUNhbGxFeHByZXNzaW9uKHQsZSl7cmV0dXJuIHRoaXMubWF0Y2gobi5jb2xvbikmJih0LnJldHVyblR5cGU9dGhpcy50c1BhcnNlVHlwZUFubm90YXRpb24oKSksc3VwZXIucGFyc2VBc3luY0Fycm93RnJvbUNhbGxFeHByZXNzaW9uKHQsZSl9cGFyc2VNYXliZUFzc2lnbiguLi50KXtsZXQgZSxzLGkscjtpZih0aGlzLm1hdGNoKG4uanN4VGFnU3RhcnQpKXtpZihlPXRoaXMuc3RhdGUuY2xvbmUoKSxzPXRoaXMudHJ5UGFyc2UoKCk9PnN1cGVyLnBhcnNlTWF5YmVBc3NpZ24oLi4udCksZSksIXMuZXJyb3IpcmV0dXJuIHMubm9kZTtjb25zdHtjb250ZXh0Oml9PXRoaXMuc3RhdGU7aVtpLmxlbmd0aC0xXT09PXgual9vVGFnP2kubGVuZ3RoLT0yOmlbaS5sZW5ndGgtMV09PT14LmpfZXhwciYmKGkubGVuZ3RoLT0xKX1pZighKHMmJnMuZXJyb3J8fHRoaXMuaXNSZWxhdGlvbmFsKFwiPFwiKSkpcmV0dXJuIHN1cGVyLnBhcnNlTWF5YmVBc3NpZ24oLi4udCk7ZT1lfHx0aGlzLnN0YXRlLmNsb25lKCk7Y29uc3QgYT10aGlzLnRyeVBhcnNlKGU9PntyPXRoaXMudHNQYXJzZVR5cGVQYXJhbWV0ZXJzKCk7Y29uc3Qgcz1zdXBlci5wYXJzZU1heWJlQXNzaWduKC4uLnQpO3JldHVybihcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIhPT1zLnR5cGV8fHMuZXh0cmEmJnMuZXh0cmEucGFyZW50aGVzaXplZCkmJmUoKSxyJiYwIT09ci5wYXJhbXMubGVuZ3RoJiZ0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbkZyb21Ob2RlKHMscikscy50eXBlUGFyYW1ldGVycz1yLHN9LGUpO2lmKCFhLmVycm9yJiYhYS5hYm9ydGVkKXJldHVybiBhLm5vZGU7aWYoIXMmJihpdCghdGhpcy5oYXNQbHVnaW4oXCJqc3hcIikpLGk9dGhpcy50cnlQYXJzZSgoKT0+c3VwZXIucGFyc2VNYXliZUFzc2lnbiguLi50KSxlKSwhaS5lcnJvcikpcmV0dXJuIGkubm9kZTtpZihzJiZzLm5vZGUpcmV0dXJuIHRoaXMuc3RhdGU9cy5mYWlsU3RhdGUscy5ub2RlO2lmKGEubm9kZSlyZXR1cm4gdGhpcy5zdGF0ZT1hLmZhaWxTdGF0ZSxhLm5vZGU7aWYoaSYmaS5ub2RlKXJldHVybiB0aGlzLnN0YXRlPWkuZmFpbFN0YXRlLGkubm9kZTtpZihzJiZzLnRocm93bil0aHJvdyBzLmVycm9yO2lmKGEudGhyb3duKXRocm93IGEuZXJyb3I7aWYoaSYmaS50aHJvd24pdGhyb3cgaS5lcnJvcjt0aHJvdyBzJiZzLmVycm9yfHxhLmVycm9yfHxpJiZpLmVycm9yfXBhcnNlTWF5YmVVbmFyeSh0KXtyZXR1cm4hdGhpcy5oYXNQbHVnaW4oXCJqc3hcIikmJnRoaXMuaXNSZWxhdGlvbmFsKFwiPFwiKT90aGlzLnRzUGFyc2VUeXBlQXNzZXJ0aW9uKCk6c3VwZXIucGFyc2VNYXliZVVuYXJ5KHQpfXBhcnNlQXJyb3codCl7aWYodGhpcy5tYXRjaChuLmNvbG9uKSl7Y29uc3QgZT10aGlzLnRyeVBhcnNlKHQ9Pntjb25zdCBlPXRoaXMudHNQYXJzZVR5cGVPclR5cGVQcmVkaWNhdGVBbm5vdGF0aW9uKG4uY29sb24pO3JldHVybiF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpJiZ0aGlzLm1hdGNoKG4uYXJyb3cpfHx0KCksZX0pO2lmKGUuYWJvcnRlZClyZXR1cm47ZS50aHJvd258fChlLmVycm9yJiYodGhpcy5zdGF0ZT1lLmZhaWxTdGF0ZSksdC5yZXR1cm5UeXBlPWUubm9kZSl9cmV0dXJuIHN1cGVyLnBhcnNlQXJyb3codCl9cGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW1UeXBlcyh0KXt0aGlzLmVhdChuLnF1ZXN0aW9uKSYmKFwiSWRlbnRpZmllclwiIT09dC50eXBlJiZ0aGlzLnJhaXNlKHQuc3RhcnQscnQuUGF0dGVybklzT3B0aW9uYWwpLHQub3B0aW9uYWw9ITApO2NvbnN0IGU9dGhpcy50c1RyeVBhcnNlVHlwZUFubm90YXRpb24oKTtyZXR1cm4gZSYmKHQudHlwZUFubm90YXRpb249ZSksdGhpcy5yZXNldEVuZExvY2F0aW9uKHQpLHR9dG9Bc3NpZ25hYmxlKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2VcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCI6cmV0dXJuIHN1cGVyLnRvQXNzaWduYWJsZSh0aGlzLnR5cGVDYXN0VG9QYXJhbWV0ZXIodCkpO2Nhc2VcIlRTUGFyYW1ldGVyUHJvcGVydHlcIjpyZXR1cm4gc3VwZXIudG9Bc3NpZ25hYmxlKHQpO2Nhc2VcIlRTQXNFeHByZXNzaW9uXCI6Y2FzZVwiVFNOb25OdWxsRXhwcmVzc2lvblwiOmNhc2VcIlRTVHlwZUFzc2VydGlvblwiOnJldHVybiB0LmV4cHJlc3Npb249dGhpcy50b0Fzc2lnbmFibGUodC5leHByZXNzaW9uKSx0O2RlZmF1bHQ6cmV0dXJuIHN1cGVyLnRvQXNzaWduYWJsZSh0KX19Y2hlY2tMVmFsKHQsZT02NCxzLGkpe3N3aXRjaCh0LnR5cGUpe2Nhc2VcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCI6cmV0dXJuO2Nhc2VcIlRTUGFyYW1ldGVyUHJvcGVydHlcIjpyZXR1cm4gdm9pZCB0aGlzLmNoZWNrTFZhbCh0LnBhcmFtZXRlcixlLHMsXCJwYXJhbWV0ZXIgcHJvcGVydHlcIik7Y2FzZVwiVFNBc0V4cHJlc3Npb25cIjpjYXNlXCJUU05vbk51bGxFeHByZXNzaW9uXCI6Y2FzZVwiVFNUeXBlQXNzZXJ0aW9uXCI6cmV0dXJuIHZvaWQgdGhpcy5jaGVja0xWYWwodC5leHByZXNzaW9uLGUscyxpKTtkZWZhdWx0OnJldHVybiB2b2lkIHN1cGVyLmNoZWNrTFZhbCh0LGUscyxpKX19cGFyc2VCaW5kaW5nQXRvbSgpe3N3aXRjaCh0aGlzLnN0YXRlLnR5cGUpe2Nhc2Ugbi5fdGhpczpyZXR1cm4gdGhpcy5wYXJzZUlkZW50aWZpZXIoITApO2RlZmF1bHQ6cmV0dXJuIHN1cGVyLnBhcnNlQmluZGluZ0F0b20oKX19cGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyh0KXtpZih0aGlzLmlzUmVsYXRpb25hbChcIjxcIikpe2NvbnN0IGU9dGhpcy50c1BhcnNlVHlwZUFyZ3VtZW50cygpO2lmKHRoaXMubWF0Y2gobi5wYXJlbkwpKXtjb25zdCBzPXN1cGVyLnBhcnNlTWF5YmVEZWNvcmF0b3JBcmd1bWVudHModCk7cmV0dXJuIHMudHlwZVBhcmFtZXRlcnM9ZSxzfXRoaXMudW5leHBlY3RlZCh0aGlzLnN0YXRlLnN0YXJ0LG4ucGFyZW5MKX1yZXR1cm4gc3VwZXIucGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyh0KX1pc0NsYXNzTWV0aG9kKCl7cmV0dXJuIHRoaXMuaXNSZWxhdGlvbmFsKFwiPFwiKXx8c3VwZXIuaXNDbGFzc01ldGhvZCgpfWlzQ2xhc3NQcm9wZXJ0eSgpe3JldHVybiB0aGlzLm1hdGNoKG4uYmFuZyl8fHRoaXMubWF0Y2gobi5jb2xvbil8fHN1cGVyLmlzQ2xhc3NQcm9wZXJ0eSgpfXBhcnNlTWF5YmVEZWZhdWx0KC4uLnQpe2NvbnN0IGU9c3VwZXIucGFyc2VNYXliZURlZmF1bHQoLi4udCk7cmV0dXJuXCJBc3NpZ25tZW50UGF0dGVyblwiPT09ZS50eXBlJiZlLnR5cGVBbm5vdGF0aW9uJiZlLnJpZ2h0LnN0YXJ0PGUudHlwZUFubm90YXRpb24uc3RhcnQmJnRoaXMucmFpc2UoZS50eXBlQW5ub3RhdGlvbi5zdGFydCxydC5UeXBlQW5ub3RhdGlvbkFmdGVyQXNzaWduKSxlfWdldFRva2VuRnJvbUNvZGUodCl7cmV0dXJuIXRoaXMuc3RhdGUuaW5UeXBlfHw2MiE9PXQmJjYwIT09dD9zdXBlci5nZXRUb2tlbkZyb21Db2RlKHQpOnRoaXMuZmluaXNoT3Aobi5yZWxhdGlvbmFsLDEpfXRvQXNzaWduYWJsZUxpc3QodCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IHM9dFtlXTtpZihzKXN3aXRjaChzLnR5cGUpe2Nhc2VcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCI6dFtlXT10aGlzLnR5cGVDYXN0VG9QYXJhbWV0ZXIocyk7YnJlYWs7Y2FzZVwiVFNBc0V4cHJlc3Npb25cIjpjYXNlXCJUU1R5cGVBc3NlcnRpb25cIjp0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnM/dGhpcy5yYWlzZShzLnN0YXJ0LHJ0LlVuZXhwZWN0ZWRUeXBlQ2FzdEluUGFyYW1ldGVyKTp0W2VdPXRoaXMudHlwZUNhc3RUb1BhcmFtZXRlcihzKX19cmV0dXJuIHN1cGVyLnRvQXNzaWduYWJsZUxpc3QoLi4uYXJndW1lbnRzKX10eXBlQ2FzdFRvUGFyYW1ldGVyKHQpe3JldHVybiB0LmV4cHJlc3Npb24udHlwZUFubm90YXRpb249dC50eXBlQW5ub3RhdGlvbix0aGlzLnJlc2V0RW5kTG9jYXRpb24odC5leHByZXNzaW9uLHQudHlwZUFubm90YXRpb24uZW5kLHQudHlwZUFubm90YXRpb24ubG9jLmVuZCksdC5leHByZXNzaW9ufXRvUmVmZXJlbmNlZExpc3QodCxlKXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7Y29uc3Qgcz10W2VdO3MmJlwiVFNUeXBlQ2FzdEV4cHJlc3Npb25cIj09PXMudHlwZSYmdGhpcy5yYWlzZShzLnN0YXJ0LHJ0LlVuZXhwZWN0ZWRUeXBlQW5ub3RhdGlvbil9cmV0dXJuIHR9c2hvdWxkUGFyc2VBcnJvdygpe3JldHVybiB0aGlzLm1hdGNoKG4uY29sb24pfHxzdXBlci5zaG91bGRQYXJzZUFycm93KCl9c2hvdWxkUGFyc2VBc3luY0Fycm93KCl7cmV0dXJuIHRoaXMubWF0Y2gobi5jb2xvbil8fHN1cGVyLnNob3VsZFBhcnNlQXN5bmNBcnJvdygpfWNhbkhhdmVMZWFkaW5nRGVjb3JhdG9yKCl7cmV0dXJuIHN1cGVyLmNhbkhhdmVMZWFkaW5nRGVjb3JhdG9yKCl8fHRoaXMuaXNBYnN0cmFjdENsYXNzKCl9anN4UGFyc2VPcGVuaW5nRWxlbWVudEFmdGVyTmFtZSh0KXtpZih0aGlzLmlzUmVsYXRpb25hbChcIjxcIikpe2NvbnN0IGU9dGhpcy50c1RyeVBhcnNlQW5kQ2F0Y2goKCk9PnRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKSk7ZSYmKHQudHlwZVBhcmFtZXRlcnM9ZSl9cmV0dXJuIHN1cGVyLmpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUodCl9Z2V0R2V0dGVyU2V0dGVyRXhwZWN0ZWRQYXJhbUNvdW50KHQpe2NvbnN0IGU9c3VwZXIuZ2V0R2V0dGVyU2V0dGVyRXhwZWN0ZWRQYXJhbUNvdW50KHQpLHM9dC5wYXJhbXNbMF07cmV0dXJuIHMmJlwiSWRlbnRpZmllclwiPT09cy50eXBlJiZcInRoaXNcIj09PXMubmFtZT9lKzE6ZX19LHY4aW50cmluc2ljOnQ9PmNsYXNzIGV4dGVuZHMgdHtwYXJzZVY4SW50cmluc2ljKCl7aWYodGhpcy5tYXRjaChuLm1vZHVsbykpe2NvbnN0IHQ9dGhpcy5zdGF0ZS5zdGFydCxlPXRoaXMuc3RhcnROb2RlKCk7aWYodGhpcy5lYXQobi5tb2R1bG8pLHRoaXMubWF0Y2gobi5uYW1lKSl7Y29uc3QgdD10aGlzLnBhcnNlSWRlbnRpZmllck5hbWUodGhpcy5zdGF0ZS5zdGFydCkscz10aGlzLmNyZWF0ZUlkZW50aWZpZXIoZSx0KTtpZihzLnR5cGU9XCJWOEludHJpbnNpY0lkZW50aWZpZXJcIix0aGlzLm1hdGNoKG4ucGFyZW5MKSlyZXR1cm4gc310aGlzLnVuZXhwZWN0ZWQodCl9fXBhcnNlRXhwckF0b20oKXtyZXR1cm4gdGhpcy5wYXJzZVY4SW50cmluc2ljKCl8fHN1cGVyLnBhcnNlRXhwckF0b20oLi4uYXJndW1lbnRzKX19LHBsYWNlaG9sZGVyczp0PT5jbGFzcyBleHRlbmRzIHR7cGFyc2VQbGFjZWhvbGRlcih0KXtpZih0aGlzLm1hdGNoKG4ucGxhY2Vob2xkZXIpKXtjb25zdCBlPXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHRoaXMubmV4dCgpLHRoaXMuYXNzZXJ0Tm9TcGFjZShcIlVuZXhwZWN0ZWQgc3BhY2UgaW4gcGxhY2Vob2xkZXIuXCIpLGUubmFtZT1zdXBlci5wYXJzZUlkZW50aWZpZXIoITApLHRoaXMuYXNzZXJ0Tm9TcGFjZShcIlVuZXhwZWN0ZWQgc3BhY2UgaW4gcGxhY2Vob2xkZXIuXCIpLHRoaXMuZXhwZWN0KG4ucGxhY2Vob2xkZXIpLHRoaXMuZmluaXNoUGxhY2Vob2xkZXIoZSx0KX19ZmluaXNoUGxhY2Vob2xkZXIodCxlKXtjb25zdCBzPSEoIXQuZXhwZWN0ZWROb2RlfHxcIlBsYWNlaG9sZGVyXCIhPT10LnR5cGUpO3JldHVybiB0LmV4cGVjdGVkTm9kZT1lLHM/dDp0aGlzLmZpbmlzaE5vZGUodCxcIlBsYWNlaG9sZGVyXCIpfWdldFRva2VuRnJvbUNvZGUodCl7cmV0dXJuIDM3PT09dCYmMzc9PT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMSk/dGhpcy5maW5pc2hPcChuLnBsYWNlaG9sZGVyLDIpOnN1cGVyLmdldFRva2VuRnJvbUNvZGUoLi4uYXJndW1lbnRzKX1wYXJzZUV4cHJBdG9tKCl7cmV0dXJuIHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIkV4cHJlc3Npb25cIil8fHN1cGVyLnBhcnNlRXhwckF0b20oLi4uYXJndW1lbnRzKX1wYXJzZUlkZW50aWZpZXIoKXtyZXR1cm4gdGhpcy5wYXJzZVBsYWNlaG9sZGVyKFwiSWRlbnRpZmllclwiKXx8c3VwZXIucGFyc2VJZGVudGlmaWVyKC4uLmFyZ3VtZW50cyl9Y2hlY2tSZXNlcnZlZFdvcmQodCl7dm9pZCAwIT09dCYmc3VwZXIuY2hlY2tSZXNlcnZlZFdvcmQoLi4uYXJndW1lbnRzKX1wYXJzZUJpbmRpbmdBdG9tKCl7cmV0dXJuIHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIlBhdHRlcm5cIil8fHN1cGVyLnBhcnNlQmluZGluZ0F0b20oLi4uYXJndW1lbnRzKX1jaGVja0xWYWwodCl7XCJQbGFjZWhvbGRlclwiIT09dC50eXBlJiZzdXBlci5jaGVja0xWYWwoLi4uYXJndW1lbnRzKX10b0Fzc2lnbmFibGUodCl7cmV0dXJuIHQmJlwiUGxhY2Vob2xkZXJcIj09PXQudHlwZSYmXCJFeHByZXNzaW9uXCI9PT10LmV4cGVjdGVkTm9kZT8odC5leHBlY3RlZE5vZGU9XCJQYXR0ZXJuXCIsdCk6c3VwZXIudG9Bc3NpZ25hYmxlKC4uLmFyZ3VtZW50cyl9dmVyaWZ5QnJlYWtDb250aW51ZSh0KXt0LmxhYmVsJiZcIlBsYWNlaG9sZGVyXCI9PT10LmxhYmVsLnR5cGV8fHN1cGVyLnZlcmlmeUJyZWFrQ29udGludWUoLi4uYXJndW1lbnRzKX1wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQodCxlKXtpZihcIlBsYWNlaG9sZGVyXCIhPT1lLnR5cGV8fGUuZXh0cmEmJmUuZXh0cmEucGFyZW50aGVzaXplZClyZXR1cm4gc3VwZXIucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KC4uLmFyZ3VtZW50cyk7aWYodGhpcy5tYXRjaChuLmNvbG9uKSl7Y29uc3Qgcz10O3JldHVybiBzLmxhYmVsPXRoaXMuZmluaXNoUGxhY2Vob2xkZXIoZSxcIklkZW50aWZpZXJcIiksdGhpcy5uZXh0KCkscy5ib2R5PXRoaXMucGFyc2VTdGF0ZW1lbnQoXCJsYWJlbFwiKSx0aGlzLmZpbmlzaE5vZGUocyxcIkxhYmVsZWRTdGF0ZW1lbnRcIil9cmV0dXJuIHRoaXMuc2VtaWNvbG9uKCksdC5uYW1lPWUubmFtZSx0aGlzLmZpbmlzaFBsYWNlaG9sZGVyKHQsXCJTdGF0ZW1lbnRcIil9cGFyc2VCbG9jaygpe3JldHVybiB0aGlzLnBhcnNlUGxhY2Vob2xkZXIoXCJCbG9ja1N0YXRlbWVudFwiKXx8c3VwZXIucGFyc2VCbG9jayguLi5hcmd1bWVudHMpfXBhcnNlRnVuY3Rpb25JZCgpe3JldHVybiB0aGlzLnBhcnNlUGxhY2Vob2xkZXIoXCJJZGVudGlmaWVyXCIpfHxzdXBlci5wYXJzZUZ1bmN0aW9uSWQoLi4uYXJndW1lbnRzKX1wYXJzZUNsYXNzKHQsZSxzKXtjb25zdCBpPWU/XCJDbGFzc0RlY2xhcmF0aW9uXCI6XCJDbGFzc0V4cHJlc3Npb25cIjt0aGlzLm5leHQoKSx0aGlzLnRha2VEZWNvcmF0b3JzKHQpO2NvbnN0IHI9dGhpcy5wYXJzZVBsYWNlaG9sZGVyKFwiSWRlbnRpZmllclwiKTtpZihyKWlmKHRoaXMubWF0Y2gobi5fZXh0ZW5kcyl8fHRoaXMubWF0Y2gobi5wbGFjZWhvbGRlcil8fHRoaXMubWF0Y2gobi5icmFjZUwpKXQuaWQ9cjtlbHNle2lmKHN8fCFlKXJldHVybiB0LmlkPW51bGwsdC5ib2R5PXRoaXMuZmluaXNoUGxhY2Vob2xkZXIocixcIkNsYXNzQm9keVwiKSx0aGlzLmZpbmlzaE5vZGUodCxpKTt0aGlzLnVuZXhwZWN0ZWQobnVsbCxcIkEgY2xhc3MgbmFtZSBpcyByZXF1aXJlZFwiKX1lbHNlIHRoaXMucGFyc2VDbGFzc0lkKHQsZSxzKTtyZXR1cm4gdGhpcy5wYXJzZUNsYXNzU3VwZXIodCksdC5ib2R5PXRoaXMucGFyc2VQbGFjZWhvbGRlcihcIkNsYXNzQm9keVwiKXx8dGhpcy5wYXJzZUNsYXNzQm9keSghIXQuc3VwZXJDbGFzcyksdGhpcy5maW5pc2hOb2RlKHQsaSl9cGFyc2VFeHBvcnQodCl7Y29uc3QgZT10aGlzLnBhcnNlUGxhY2Vob2xkZXIoXCJJZGVudGlmaWVyXCIpO2lmKCFlKXJldHVybiBzdXBlci5wYXJzZUV4cG9ydCguLi5hcmd1bWVudHMpO2lmKCF0aGlzLmlzQ29udGV4dHVhbChcImZyb21cIikmJiF0aGlzLm1hdGNoKG4uY29tbWEpKXJldHVybiB0LnNwZWNpZmllcnM9W10sdC5zb3VyY2U9bnVsbCx0LmRlY2xhcmF0aW9uPXRoaXMuZmluaXNoUGxhY2Vob2xkZXIoZSxcIkRlY2xhcmF0aW9uXCIpLHRoaXMuZmluaXNoTm9kZSh0LFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiKTt0aGlzLmV4cGVjdFBsdWdpbihcImV4cG9ydERlZmF1bHRGcm9tXCIpO2NvbnN0IHM9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gcy5leHBvcnRlZD1lLHQuc3BlY2lmaWVycz1bdGhpcy5maW5pc2hOb2RlKHMsXCJFeHBvcnREZWZhdWx0U3BlY2lmaWVyXCIpXSxzdXBlci5wYXJzZUV4cG9ydCh0KX1tYXliZVBhcnNlRXhwb3J0RGVmYXVsdFNwZWNpZmllcih0KXtyZXR1cm4hISh0LnNwZWNpZmllcnMmJnQuc3BlY2lmaWVycy5sZW5ndGg+MCl8fHN1cGVyLm1heWJlUGFyc2VFeHBvcnREZWZhdWx0U3BlY2lmaWVyKC4uLmFyZ3VtZW50cyl9Y2hlY2tFeHBvcnQodCl7Y29uc3R7c3BlY2lmaWVyczplfT10O2UmJmUubGVuZ3RoJiYodC5zcGVjaWZpZXJzPWUuZmlsdGVyKHQ9PlwiUGxhY2Vob2xkZXJcIj09PXQuZXhwb3J0ZWQudHlwZSkpLHN1cGVyLmNoZWNrRXhwb3J0KHQpLHQuc3BlY2lmaWVycz1lfXBhcnNlSW1wb3J0KHQpe2NvbnN0IGU9dGhpcy5wYXJzZVBsYWNlaG9sZGVyKFwiSWRlbnRpZmllclwiKTtpZighZSlyZXR1cm4gc3VwZXIucGFyc2VJbXBvcnQoLi4uYXJndW1lbnRzKTtpZih0LnNwZWNpZmllcnM9W10sIXRoaXMuaXNDb250ZXh0dWFsKFwiZnJvbVwiKSYmIXRoaXMubWF0Y2gobi5jb21tYSkpcmV0dXJuIHQuc291cmNlPXRoaXMuZmluaXNoUGxhY2Vob2xkZXIoZSxcIlN0cmluZ0xpdGVyYWxcIiksdGhpcy5zZW1pY29sb24oKSx0aGlzLmZpbmlzaE5vZGUodCxcIkltcG9ydERlY2xhcmF0aW9uXCIpO2NvbnN0IHM9dGhpcy5zdGFydE5vZGVBdE5vZGUoZSk7aWYocy5sb2NhbD1lLHRoaXMuZmluaXNoTm9kZShzLFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSx0LnNwZWNpZmllcnMucHVzaChzKSx0aGlzLmVhdChuLmNvbW1hKSl7dGhpcy5tYXliZVBhcnNlU3RhckltcG9ydFNwZWNpZmllcih0KXx8dGhpcy5wYXJzZU5hbWVkSW1wb3J0U3BlY2lmaWVycyh0KX1yZXR1cm4gdGhpcy5leHBlY3RDb250ZXh0dWFsKFwiZnJvbVwiKSx0LnNvdXJjZT10aGlzLnBhcnNlSW1wb3J0U291cmNlKCksdGhpcy5zZW1pY29sb24oKSx0aGlzLmZpbmlzaE5vZGUodCxcIkltcG9ydERlY2xhcmF0aW9uXCIpfXBhcnNlSW1wb3J0U291cmNlKCl7cmV0dXJuIHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIlN0cmluZ0xpdGVyYWxcIil8fHN1cGVyLnBhcnNlSW1wb3J0U291cmNlKC4uLmFyZ3VtZW50cyl9fX0sY3Q9T2JqZWN0LmtleXMocHQpLHV0PXtzb3VyY2VUeXBlOlwic2NyaXB0XCIsc291cmNlRmlsZW5hbWU6dm9pZCAwLHN0YXJ0TGluZToxLGFsbG93QXdhaXRPdXRzaWRlRnVuY3Rpb246ITEsYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb246ITEsYWxsb3dJbXBvcnRFeHBvcnRFdmVyeXdoZXJlOiExLGFsbG93U3VwZXJPdXRzaWRlTWV0aG9kOiExLGFsbG93VW5kZWNsYXJlZEV4cG9ydHM6ITEscGx1Z2luczpbXSxzdHJpY3RNb2RlOm51bGwscmFuZ2VzOiExLHRva2VuczohMSxjcmVhdGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbnM6ITEsZXJyb3JSZWNvdmVyeTohMX07Y2xhc3MgbHR7Y29uc3RydWN0b3IoKXt0aGlzLmVycm9ycz1bXSx0aGlzLnBvdGVudGlhbEFycm93QXQ9LTEsdGhpcy5ub0Fycm93QXQ9W10sdGhpcy5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0PVtdLHRoaXMuaW5QYXJhbWV0ZXJzPSExLHRoaXMubWF5YmVJbkFycm93UGFyYW1ldGVycz0hMSx0aGlzLm1heWJlSW5Bc3luY0Fycm93SGVhZD0hMSx0aGlzLmluUGlwZWxpbmU9ITEsdGhpcy5pblR5cGU9ITEsdGhpcy5ub0Fub25GdW5jdGlvblR5cGU9ITEsdGhpcy5pblByb3BlcnR5TmFtZT0hMSx0aGlzLmhhc0Zsb3dDb21tZW50PSExLHRoaXMuaXNJdGVyYXRvcj0hMSx0aGlzLnRvcGljQ29udGV4dD17bWF4TnVtT2ZSZXNvbHZhYmxlVG9waWNzOjAsbWF4VG9waWNJbmRleDpudWxsfSx0aGlzLnNvbG9Bd2FpdD0hMSx0aGlzLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5PSExLHRoaXMubGFiZWxzPVtdLHRoaXMuZGVjb3JhdG9yU3RhY2s9W1tdXSx0aGlzLnlpZWxkUG9zPS0xLHRoaXMuYXdhaXRQb3M9LTEsdGhpcy5jb21tZW50cz1bXSx0aGlzLnRyYWlsaW5nQ29tbWVudHM9W10sdGhpcy5sZWFkaW5nQ29tbWVudHM9W10sdGhpcy5jb21tZW50U3RhY2s9W10sdGhpcy5jb21tZW50UHJldmlvdXNOb2RlPW51bGwsdGhpcy5wb3M9MCx0aGlzLmxpbmVTdGFydD0wLHRoaXMudHlwZT1uLmVvZix0aGlzLnZhbHVlPW51bGwsdGhpcy5zdGFydD0wLHRoaXMuZW5kPTAsdGhpcy5sYXN0VG9rRW5kTG9jPW51bGwsdGhpcy5sYXN0VG9rU3RhcnRMb2M9bnVsbCx0aGlzLmxhc3RUb2tTdGFydD0wLHRoaXMubGFzdFRva0VuZD0wLHRoaXMuY29udGV4dD1beC5icmFjZVN0YXRlbWVudF0sdGhpcy5leHByQWxsb3dlZD0hMCx0aGlzLmNvbnRhaW5zRXNjPSExLHRoaXMub2N0YWxQb3NpdGlvbnM9W10sdGhpcy5leHBvcnRlZElkZW50aWZpZXJzPVtdLHRoaXMudG9rZW5zTGVuZ3RoPTB9aW5pdCh0KXt0aGlzLnN0cmljdD0hMSE9PXQuc3RyaWN0TW9kZSYmXCJtb2R1bGVcIj09PXQuc291cmNlVHlwZSx0aGlzLmN1ckxpbmU9dC5zdGFydExpbmUsdGhpcy5zdGFydExvYz10aGlzLmVuZExvYz10aGlzLmN1clBvc2l0aW9uKCl9Y3VyUG9zaXRpb24oKXtyZXR1cm4gbmV3IGwodGhpcy5jdXJMaW5lLHRoaXMucG9zLXRoaXMubGluZVN0YXJ0KX1jbG9uZSh0KXtjb25zdCBlPW5ldyBsdCxzPU9iamVjdC5rZXlzKHRoaXMpO2ZvcihsZXQgaT0wLHI9cy5sZW5ndGg7aTxyO2krKyl7Y29uc3Qgcj1zW2ldO2xldCBhPXRoaXNbcl07IXQmJkFycmF5LmlzQXJyYXkoYSkmJihhPWEuc2xpY2UoKSksZVtyXT1hfXJldHVybiBlfX12YXIgZHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTQ4JiZ0PD01N307Y29uc3QgbXQ9bmV3IFNldChbXCJnXCIsXCJtXCIsXCJzXCIsXCJpXCIsXCJ5XCIsXCJ1XCJdKSxmdD17ZGVjQmluT2N0Ols0Niw2Niw2OSw3OSw5NSw5OCwxMDEsMTExXSxoZXg6WzQ2LDg4LDk1LDEyMF19LER0PXtiaW46WzQ4LDQ5XX07RHQub2N0PVsuLi5EdC5iaW4sNTAsNTEsNTIsNTMsNTQsNTVdLER0LmRlYz1bLi4uRHQub2N0LDU2LDU3XSxEdC5oZXg9Wy4uLkR0LmRlYyw2NSw2Niw2Nyw2OCw2OSw3MCw5Nyw5OCw5OSwxMDAsMTAxLDEwMl07Y2xhc3MgeXR7Y29uc3RydWN0b3IodCl7dGhpcy50eXBlPXQudHlwZSx0aGlzLnZhbHVlPXQudmFsdWUsdGhpcy5zdGFydD10LnN0YXJ0LHRoaXMuZW5kPXQuZW5kLHRoaXMubG9jPW5ldyBkKHQuc3RhcnRMb2MsdC5lbmRMb2MpfX1jbGFzcyB4dHtjb25zdHJ1Y3Rvcigpe3RoaXMuc2hvcnRoYW5kQXNzaWduPS0xLHRoaXMuZG91YmxlUHJvdG89LTF9fWNsYXNzIGd0e2NvbnN0cnVjdG9yKHQsZSxzKXt0aGlzLnR5cGU9XCJcIix0aGlzLnN0YXJ0PWUsdGhpcy5lbmQ9MCx0aGlzLmxvYz1uZXcgZChzKSx0JiZ0Lm9wdGlvbnMucmFuZ2VzJiYodGhpcy5yYW5nZT1bZSwwXSksdCYmdC5maWxlbmFtZSYmKHRoaXMubG9jLmZpbGVuYW1lPXQuZmlsZW5hbWUpfV9fY2xvbmUoKXtjb25zdCB0PW5ldyBndCxlPU9iamVjdC5rZXlzKHRoaXMpO2ZvcihsZXQgcz0wLGk9ZS5sZW5ndGg7czxpO3MrKyl7Y29uc3QgaT1lW3NdO1wibGVhZGluZ0NvbW1lbnRzXCIhPT1pJiZcInRyYWlsaW5nQ29tbWVudHNcIiE9PWkmJlwiaW5uZXJDb21tZW50c1wiIT09aSYmKHRbaV09dGhpc1tpXSl9cmV0dXJuIHR9fWNvbnN0IFB0PXQ9PlwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIj09PXQudHlwZT9QdCh0LmV4cHJlc3Npb24pOnQ7Y29uc3QgRXQ9e2tpbmQ6XCJsb29wXCJ9LEN0PXtraW5kOlwic3dpdGNoXCJ9O2NsYXNzIGJ0e2NvbnN0cnVjdG9yKCl7dGhpcy5wcml2YXRlTmFtZXM9bmV3IFNldCx0aGlzLmxvbmVBY2Nlc3NvcnM9bmV3IE1hcCx0aGlzLnVuZGVmaW5lZFByaXZhdGVOYW1lcz1uZXcgTWFwfX1jbGFzcyBUdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0YWNrPVtdLHRoaXMudW5kZWZpbmVkUHJpdmF0ZU5hbWVzPW5ldyBNYXAsdGhpcy5yYWlzZT10fWN1cnJlbnQoKXtyZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXX1lbnRlcigpe3RoaXMuc3RhY2sucHVzaChuZXcgYnQpfWV4aXQoKXtjb25zdCB0PXRoaXMuc3RhY2sucG9wKCksZT10aGlzLmN1cnJlbnQoKTtmb3IobGV0IHM9MCxpPUFycmF5LmZyb20odC51bmRlZmluZWRQcml2YXRlTmFtZXMpO3M8aS5sZW5ndGg7cysrKXtjb25zdFt0LHJdPWlbc107ZT9lLnVuZGVmaW5lZFByaXZhdGVOYW1lcy5oYXModCl8fGUudW5kZWZpbmVkUHJpdmF0ZU5hbWVzLnNldCh0LHIpOnRoaXMucmFpc2UocixmLkludmFsaWRQcml2YXRlRmllbGRSZXNvbHV0aW9uLHQpfX1kZWNsYXJlUHJpdmF0ZU5hbWUodCxlLHMpe2NvbnN0IGk9dGhpcy5jdXJyZW50KCk7bGV0IHI9aS5wcml2YXRlTmFtZXMuaGFzKHQpO2lmKDMmZSl7Y29uc3Qgcz1yJiZpLmxvbmVBY2Nlc3NvcnMuZ2V0KHQpO2lmKHMpe2NvbnN0IGE9NCZzLG49NCZlO3I9KDMmcyk9PT0oMyZlKXx8YSE9PW4scnx8aS5sb25lQWNjZXNzb3JzLmRlbGV0ZSh0KX1lbHNlIHJ8fGkubG9uZUFjY2Vzc29ycy5zZXQodCxlKX1yJiZ0aGlzLnJhaXNlKHMsZi5Qcml2YXRlTmFtZVJlZGVjbGFyYXRpb24sdCksaS5wcml2YXRlTmFtZXMuYWRkKHQpLGkudW5kZWZpbmVkUHJpdmF0ZU5hbWVzLmRlbGV0ZSh0KX11c2VQcml2YXRlTmFtZSh0LGUpe2xldCBzO2ZvcihsZXQgZT0wLGk9dGhpcy5zdGFjaztlPGkubGVuZ3RoO2UrKylpZihzPWlbZV0scy5wcml2YXRlTmFtZXMuaGFzKHQpKXJldHVybjtzP3MudW5kZWZpbmVkUHJpdmF0ZU5hbWVzLnNldCh0LGUpOnRoaXMucmFpc2UoZSxmLkludmFsaWRQcml2YXRlRmllbGRSZXNvbHV0aW9uLHQpfX1jbGFzcyBBdCBleHRlbmRzIGNsYXNzIGV4dGVuZHMgY2xhc3MgZXh0ZW5kcyBjbGFzcyBleHRlbmRzIGNsYXNzIGV4dGVuZHMgY2xhc3MgZXh0ZW5kcyBjbGFzcyBleHRlbmRzIGNsYXNzIGV4dGVuZHMgY2xhc3MgZXh0ZW5kcyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuc2F3VW5hbWJpZ3VvdXNFU009ITEsdGhpcy5hbWJpZ3VvdXNTY3JpcHREaWZmZXJlbnRBc3Q9ITF9aGFzUGx1Z2luKHQpe3JldHVybiB0aGlzLnBsdWdpbnMuaGFzKHQpfWdldFBsdWdpbk9wdGlvbih0LGUpe2lmKHRoaXMuaGFzUGx1Z2luKHQpKXJldHVybiB0aGlzLnBsdWdpbnMuZ2V0KHQpW2VdfX17YWRkQ29tbWVudCh0KXt0aGlzLmZpbGVuYW1lJiYodC5sb2MuZmlsZW5hbWU9dGhpcy5maWxlbmFtZSksdGhpcy5zdGF0ZS50cmFpbGluZ0NvbW1lbnRzLnB1c2godCksdGhpcy5zdGF0ZS5sZWFkaW5nQ29tbWVudHMucHVzaCh0KX1hZGp1c3RDb21tZW50c0FmdGVyVHJhaWxpbmdDb21tYSh0LGUscyl7aWYoMD09PXRoaXMuc3RhdGUubGVhZGluZ0NvbW1lbnRzLmxlbmd0aClyZXR1cm47bGV0IGk9bnVsbCxyPWUubGVuZ3RoO2Zvcig7bnVsbD09PWkmJnI+MDspaT1lWy0tcl07aWYobnVsbD09PWkpcmV0dXJuO2ZvcihsZXQgdD0wO3Q8dGhpcy5zdGF0ZS5sZWFkaW5nQ29tbWVudHMubGVuZ3RoO3QrKyl0aGlzLnN0YXRlLmxlYWRpbmdDb21tZW50c1t0XS5lbmQ8dGhpcy5zdGF0ZS5jb21tZW50UHJldmlvdXNOb2RlLmVuZCYmKHRoaXMuc3RhdGUubGVhZGluZ0NvbW1lbnRzLnNwbGljZSh0LDEpLHQtLSk7Y29uc3QgYT1bXTtmb3IobGV0IGU9MDtlPHRoaXMuc3RhdGUubGVhZGluZ0NvbW1lbnRzLmxlbmd0aDtlKyspe2NvbnN0IGk9dGhpcy5zdGF0ZS5sZWFkaW5nQ29tbWVudHNbZV07aS5lbmQ8dC5lbmQ/KGEucHVzaChpKSxzfHwodGhpcy5zdGF0ZS5sZWFkaW5nQ29tbWVudHMuc3BsaWNlKGUsMSksZS0tKSk6KHZvaWQgMD09PXQudHJhaWxpbmdDb21tZW50cyYmKHQudHJhaWxpbmdDb21tZW50cz1bXSksdC50cmFpbGluZ0NvbW1lbnRzLnB1c2goaSkpfXMmJih0aGlzLnN0YXRlLmxlYWRpbmdDb21tZW50cz1bXSksYS5sZW5ndGg+MD9pLnRyYWlsaW5nQ29tbWVudHM9YTp2b2lkIDAhPT1pLnRyYWlsaW5nQ29tbWVudHMmJihpLnRyYWlsaW5nQ29tbWVudHM9W10pfXByb2Nlc3NDb21tZW50KHQpe2lmKFwiUHJvZ3JhbVwiPT09dC50eXBlJiZ0LmJvZHkubGVuZ3RoPjApcmV0dXJuO2NvbnN0IGU9dGhpcy5zdGF0ZS5jb21tZW50U3RhY2s7bGV0IHMsaSxyLGEsbjtpZih0aGlzLnN0YXRlLnRyYWlsaW5nQ29tbWVudHMubGVuZ3RoPjApdGhpcy5zdGF0ZS50cmFpbGluZ0NvbW1lbnRzWzBdLnN0YXJ0Pj10LmVuZD8ocj10aGlzLnN0YXRlLnRyYWlsaW5nQ29tbWVudHMsdGhpcy5zdGF0ZS50cmFpbGluZ0NvbW1lbnRzPVtdKTp0aGlzLnN0YXRlLnRyYWlsaW5nQ29tbWVudHMubGVuZ3RoPTA7ZWxzZSBpZihlLmxlbmd0aD4wKXtjb25zdCBzPW0oZSk7cy50cmFpbGluZ0NvbW1lbnRzJiZzLnRyYWlsaW5nQ29tbWVudHNbMF0uc3RhcnQ+PXQuZW5kJiYocj1zLnRyYWlsaW5nQ29tbWVudHMsZGVsZXRlIHMudHJhaWxpbmdDb21tZW50cyl9Zm9yKGUubGVuZ3RoPjAmJm0oZSkuc3RhcnQ+PXQuc3RhcnQmJihzPWUucG9wKCkpO2UubGVuZ3RoPjAmJm0oZSkuc3RhcnQ+PXQuc3RhcnQ7KWk9ZS5wb3AoKTtpZighaSYmcyYmKGk9cykscylzd2l0Y2godC50eXBlKXtjYXNlXCJPYmplY3RFeHByZXNzaW9uXCI6dGhpcy5hZGp1c3RDb21tZW50c0FmdGVyVHJhaWxpbmdDb21tYSh0LHQucHJvcGVydGllcyk7YnJlYWs7Y2FzZVwiT2JqZWN0UGF0dGVyblwiOnRoaXMuYWRqdXN0Q29tbWVudHNBZnRlclRyYWlsaW5nQ29tbWEodCx0LnByb3BlcnRpZXMsITApO2JyZWFrO2Nhc2VcIkNhbGxFeHByZXNzaW9uXCI6dGhpcy5hZGp1c3RDb21tZW50c0FmdGVyVHJhaWxpbmdDb21tYSh0LHQuYXJndW1lbnRzKTticmVhaztjYXNlXCJBcnJheUV4cHJlc3Npb25cIjp0aGlzLmFkanVzdENvbW1lbnRzQWZ0ZXJUcmFpbGluZ0NvbW1hKHQsdC5lbGVtZW50cyk7YnJlYWs7Y2FzZVwiQXJyYXlQYXR0ZXJuXCI6dGhpcy5hZGp1c3RDb21tZW50c0FmdGVyVHJhaWxpbmdDb21tYSh0LHQuZWxlbWVudHMsITApfWVsc2UgdGhpcy5zdGF0ZS5jb21tZW50UHJldmlvdXNOb2RlJiYoXCJJbXBvcnRTcGVjaWZpZXJcIj09PXRoaXMuc3RhdGUuY29tbWVudFByZXZpb3VzTm9kZS50eXBlJiZcIkltcG9ydFNwZWNpZmllclwiIT09dC50eXBlfHxcIkV4cG9ydFNwZWNpZmllclwiPT09dGhpcy5zdGF0ZS5jb21tZW50UHJldmlvdXNOb2RlLnR5cGUmJlwiRXhwb3J0U3BlY2lmaWVyXCIhPT10LnR5cGUpJiZ0aGlzLmFkanVzdENvbW1lbnRzQWZ0ZXJUcmFpbGluZ0NvbW1hKHQsW3RoaXMuc3RhdGUuY29tbWVudFByZXZpb3VzTm9kZV0pO2lmKGkpe2lmKGkubGVhZGluZ0NvbW1lbnRzKWlmKGkhPT10JiZpLmxlYWRpbmdDb21tZW50cy5sZW5ndGg+MCYmbShpLmxlYWRpbmdDb21tZW50cykuZW5kPD10LnN0YXJ0KXQubGVhZGluZ0NvbW1lbnRzPWkubGVhZGluZ0NvbW1lbnRzLGRlbGV0ZSBpLmxlYWRpbmdDb21tZW50cztlbHNlIGZvcihhPWkubGVhZGluZ0NvbW1lbnRzLmxlbmd0aC0yO2E+PTA7LS1hKWlmKGkubGVhZGluZ0NvbW1lbnRzW2FdLmVuZDw9dC5zdGFydCl7dC5sZWFkaW5nQ29tbWVudHM9aS5sZWFkaW5nQ29tbWVudHMuc3BsaWNlKDAsYSsxKTticmVha319ZWxzZSBpZih0aGlzLnN0YXRlLmxlYWRpbmdDb21tZW50cy5sZW5ndGg+MClpZihtKHRoaXMuc3RhdGUubGVhZGluZ0NvbW1lbnRzKS5lbmQ8PXQuc3RhcnQpe2lmKHRoaXMuc3RhdGUuY29tbWVudFByZXZpb3VzTm9kZSlmb3Iobj0wO248dGhpcy5zdGF0ZS5sZWFkaW5nQ29tbWVudHMubGVuZ3RoO24rKyl0aGlzLnN0YXRlLmxlYWRpbmdDb21tZW50c1tuXS5lbmQ8dGhpcy5zdGF0ZS5jb21tZW50UHJldmlvdXNOb2RlLmVuZCYmKHRoaXMuc3RhdGUubGVhZGluZ0NvbW1lbnRzLnNwbGljZShuLDEpLG4tLSk7dGhpcy5zdGF0ZS5sZWFkaW5nQ29tbWVudHMubGVuZ3RoPjAmJih0LmxlYWRpbmdDb21tZW50cz10aGlzLnN0YXRlLmxlYWRpbmdDb21tZW50cyx0aGlzLnN0YXRlLmxlYWRpbmdDb21tZW50cz1bXSl9ZWxzZXtmb3IoYT0wO2E8dGhpcy5zdGF0ZS5sZWFkaW5nQ29tbWVudHMubGVuZ3RoJiYhKHRoaXMuc3RhdGUubGVhZGluZ0NvbW1lbnRzW2FdLmVuZD50LnN0YXJ0KTthKyspO2NvbnN0IGU9dGhpcy5zdGF0ZS5sZWFkaW5nQ29tbWVudHMuc2xpY2UoMCxhKTtlLmxlbmd0aCYmKHQubGVhZGluZ0NvbW1lbnRzPWUpLHI9dGhpcy5zdGF0ZS5sZWFkaW5nQ29tbWVudHMuc2xpY2UoYSksMD09PXIubGVuZ3RoJiYocj1udWxsKX10aGlzLnN0YXRlLmNvbW1lbnRQcmV2aW91c05vZGU9dCxyJiYoci5sZW5ndGgmJnJbMF0uc3RhcnQ+PXQuc3RhcnQmJm0ocikuZW5kPD10LmVuZD90LmlubmVyQ29tbWVudHM9cjp0LnRyYWlsaW5nQ29tbWVudHM9ciksZS5wdXNoKHQpfX17Z2V0TG9jYXRpb25Gb3JQb3NpdGlvbih0KXtsZXQgZTtyZXR1cm4gZT10PT09dGhpcy5zdGF0ZS5zdGFydD90aGlzLnN0YXRlLnN0YXJ0TG9jOnQ9PT10aGlzLnN0YXRlLmxhc3RUb2tTdGFydD90aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYzp0PT09dGhpcy5zdGF0ZS5lbmQ/dGhpcy5zdGF0ZS5lbmRMb2M6dD09PXRoaXMuc3RhdGUubGFzdFRva0VuZD90aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2M6ZnVuY3Rpb24odCxlKXtsZXQgcyxpPTEscj0wO2ZvcihoLmxhc3RJbmRleD0wOyhzPWguZXhlYyh0KSkmJnMuaW5kZXg8ZTspaSsrLHI9aC5sYXN0SW5kZXg7cmV0dXJuIG5ldyBsKGksZS1yKX0odGhpcy5pbnB1dCx0KSxlfXJhaXNlKHQsZSwuLi5zKXtyZXR1cm4gdGhpcy5yYWlzZVdpdGhEYXRhKHQsdm9pZCAwLGUsLi4ucyl9cmFpc2VXaXRoRGF0YSh0LGUscywuLi5pKXtjb25zdCByPXRoaXMuZ2V0TG9jYXRpb25Gb3JQb3NpdGlvbih0KSxhPXMucmVwbGFjZSgvJShcXGQrKS9nLCh0LGUpPT5pW2VdKStcIiAoXCIuY29uY2F0KHIubGluZSxcIjpcIikuY29uY2F0KHIuY29sdW1uLFwiKVwiKTtyZXR1cm4gdGhpcy5fcmFpc2UoT2JqZWN0LmFzc2lnbih7bG9jOnIscG9zOnR9LGUpLGEpfV9yYWlzZSh0LGUpe2NvbnN0IHM9bmV3IFN5bnRheEVycm9yKGUpO2lmKE9iamVjdC5hc3NpZ24ocyx0KSx0aGlzLm9wdGlvbnMuZXJyb3JSZWNvdmVyeSlyZXR1cm4gdGhpcy5pc0xvb2thaGVhZHx8dGhpcy5zdGF0ZS5lcnJvcnMucHVzaChzKSxzO3Rocm93IHN9fXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy50b2tlbnM9W10sdGhpcy5zdGF0ZT1uZXcgbHQsdGhpcy5zdGF0ZS5pbml0KHQpLHRoaXMuaW5wdXQ9ZSx0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLmlzTG9va2FoZWFkPSExfXB1c2hUb2tlbih0KXt0aGlzLnRva2Vucy5sZW5ndGg9dGhpcy5zdGF0ZS50b2tlbnNMZW5ndGgsdGhpcy50b2tlbnMucHVzaCh0KSwrK3RoaXMuc3RhdGUudG9rZW5zTGVuZ3RofW5leHQoKXt0aGlzLmlzTG9va2FoZWFkfHwodGhpcy5jaGVja0tleXdvcmRFc2NhcGVzKCksdGhpcy5vcHRpb25zLnRva2VucyYmdGhpcy5wdXNoVG9rZW4obmV3IHl0KHRoaXMuc3RhdGUpKSksdGhpcy5zdGF0ZS5sYXN0VG9rRW5kPXRoaXMuc3RhdGUuZW5kLHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0PXRoaXMuc3RhdGUuc3RhcnQsdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jPXRoaXMuc3RhdGUuZW5kTG9jLHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0TG9jPXRoaXMuc3RhdGUuc3RhcnRMb2MsdGhpcy5uZXh0VG9rZW4oKX1lYXQodCl7cmV0dXJuISF0aGlzLm1hdGNoKHQpJiYodGhpcy5uZXh0KCksITApfW1hdGNoKHQpe3JldHVybiB0aGlzLnN0YXRlLnR5cGU9PT10fWxvb2thaGVhZCgpe2NvbnN0IHQ9dGhpcy5zdGF0ZTt0aGlzLnN0YXRlPXQuY2xvbmUoITApLHRoaXMuaXNMb29rYWhlYWQ9ITAsdGhpcy5uZXh0KCksdGhpcy5pc0xvb2thaGVhZD0hMTtjb25zdCBlPXRoaXMuc3RhdGU7cmV0dXJuIHRoaXMuc3RhdGU9dCxlfW5leHRUb2tlblN0YXJ0KCl7Y29uc3QgdD10aGlzLnN0YXRlLnBvcztyZXR1cm4gYy5sYXN0SW5kZXg9dCx0K2MuZXhlYyh0aGlzLmlucHV0KVswXS5sZW5ndGh9bG9va2FoZWFkQ2hhckNvZGUoKXtyZXR1cm4gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMubmV4dFRva2VuU3RhcnQoKSl9c2V0U3RyaWN0KHQpe2lmKHRoaXMuc3RhdGUuc3RyaWN0PXQsdGhpcy5tYXRjaChuLm51bSl8fHRoaXMubWF0Y2gobi5zdHJpbmcpKXtmb3IodGhpcy5zdGF0ZS5wb3M9dGhpcy5zdGF0ZS5zdGFydDt0aGlzLnN0YXRlLnBvczx0aGlzLnN0YXRlLmxpbmVTdGFydDspdGhpcy5zdGF0ZS5saW5lU3RhcnQ9dGhpcy5pbnB1dC5sYXN0SW5kZXhPZihcIlxcblwiLHRoaXMuc3RhdGUubGluZVN0YXJ0LTIpKzEsLS10aGlzLnN0YXRlLmN1ckxpbmU7dGhpcy5uZXh0VG9rZW4oKX19Y3VyQ29udGV4dCgpe3JldHVybiB0aGlzLnN0YXRlLmNvbnRleHRbdGhpcy5zdGF0ZS5jb250ZXh0Lmxlbmd0aC0xXX1uZXh0VG9rZW4oKXtjb25zdCB0PXRoaXMuY3VyQ29udGV4dCgpO2lmKHQmJnQucHJlc2VydmVTcGFjZXx8dGhpcy5za2lwU3BhY2UoKSx0aGlzLnN0YXRlLm9jdGFsUG9zaXRpb25zPVtdLHRoaXMuc3RhdGUuc3RhcnQ9dGhpcy5zdGF0ZS5wb3MsdGhpcy5zdGF0ZS5zdGFydExvYz10aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksdGhpcy5zdGF0ZS5wb3M+PXRoaXMubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMuZmluaXNoVG9rZW4obi5lb2YpO2NvbnN0IGU9bnVsbD09dD92b2lkIDA6dC5vdmVycmlkZTtlP2UodGhpcyk6dGhpcy5nZXRUb2tlbkZyb21Db2RlKHRoaXMuaW5wdXQuY29kZVBvaW50QXQodGhpcy5zdGF0ZS5wb3MpKX1wdXNoQ29tbWVudCh0LGUscyxpLHIsYSl7Y29uc3Qgbj17dHlwZTp0P1wiQ29tbWVudEJsb2NrXCI6XCJDb21tZW50TGluZVwiLHZhbHVlOmUsc3RhcnQ6cyxlbmQ6aSxsb2M6bmV3IGQocixhKX07dGhpcy5vcHRpb25zLnRva2VucyYmdGhpcy5wdXNoVG9rZW4obiksdGhpcy5zdGF0ZS5jb21tZW50cy5wdXNoKG4pLHRoaXMuYWRkQ29tbWVudChuKX1za2lwQmxvY2tDb21tZW50KCl7Y29uc3QgdD10aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksZT10aGlzLnN0YXRlLnBvcyxzPXRoaXMuaW5wdXQuaW5kZXhPZihcIiovXCIsdGhpcy5zdGF0ZS5wb3MrMik7aWYoLTE9PT1zKXRocm93IHRoaXMucmFpc2UoZSxmLlVudGVybWluYXRlZENvbW1lbnQpO2xldCBpO2Zvcih0aGlzLnN0YXRlLnBvcz1zKzIsaC5sYXN0SW5kZXg9ZTsoaT1oLmV4ZWModGhpcy5pbnB1dCkpJiZpLmluZGV4PHRoaXMuc3RhdGUucG9zOykrK3RoaXMuc3RhdGUuY3VyTGluZSx0aGlzLnN0YXRlLmxpbmVTdGFydD1pLmluZGV4K2lbMF0ubGVuZ3RoO3RoaXMuaXNMb29rYWhlYWR8fHRoaXMucHVzaENvbW1lbnQoITAsdGhpcy5pbnB1dC5zbGljZShlKzIscyksZSx0aGlzLnN0YXRlLnBvcyx0LHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSl9c2tpcExpbmVDb21tZW50KHQpe2NvbnN0IGU9dGhpcy5zdGF0ZS5wb3Mscz10aGlzLnN0YXRlLmN1clBvc2l0aW9uKCk7bGV0IGk9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKz10KTtpZih0aGlzLnN0YXRlLnBvczx0aGlzLmxlbmd0aClmb3IoOyFwKGkpJiYrK3RoaXMuc3RhdGUucG9zPHRoaXMubGVuZ3RoOylpPXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk7dGhpcy5pc0xvb2thaGVhZHx8dGhpcy5wdXNoQ29tbWVudCghMSx0aGlzLmlucHV0LnNsaWNlKGUrdCx0aGlzLnN0YXRlLnBvcyksZSx0aGlzLnN0YXRlLnBvcyxzLHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSl9c2tpcFNwYWNlKCl7dDpmb3IoO3RoaXMuc3RhdGUucG9zPHRoaXMubGVuZ3RoOyl7Y29uc3QgdD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpO3N3aXRjaCh0KXtjYXNlIDMyOmNhc2UgMTYwOmNhc2UgOTorK3RoaXMuc3RhdGUucG9zO2JyZWFrO2Nhc2UgMTM6MTA9PT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMSkmJisrdGhpcy5zdGF0ZS5wb3M7Y2FzZSAxMDpjYXNlIDgyMzI6Y2FzZSA4MjMzOisrdGhpcy5zdGF0ZS5wb3MsKyt0aGlzLnN0YXRlLmN1ckxpbmUsdGhpcy5zdGF0ZS5saW5lU3RhcnQ9dGhpcy5zdGF0ZS5wb3M7YnJlYWs7Y2FzZSA0Nzpzd2l0Y2godGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKzEpKXtjYXNlIDQyOnRoaXMuc2tpcEJsb2NrQ29tbWVudCgpO2JyZWFrO2Nhc2UgNDc6dGhpcy5za2lwTGluZUNvbW1lbnQoMik7YnJlYWs7ZGVmYXVsdDpicmVhayB0fWJyZWFrO2RlZmF1bHQ6aWYoIXUodCkpYnJlYWsgdDsrK3RoaXMuc3RhdGUucG9zfX19ZmluaXNoVG9rZW4odCxlKXt0aGlzLnN0YXRlLmVuZD10aGlzLnN0YXRlLnBvcyx0aGlzLnN0YXRlLmVuZExvYz10aGlzLnN0YXRlLmN1clBvc2l0aW9uKCk7Y29uc3Qgcz10aGlzLnN0YXRlLnR5cGU7dGhpcy5zdGF0ZS50eXBlPXQsdGhpcy5zdGF0ZS52YWx1ZT1lLHRoaXMuaXNMb29rYWhlYWR8fHRoaXMudXBkYXRlQ29udGV4dChzKX1yZWFkVG9rZW5fbnVtYmVyU2lnbigpe2lmKDA9PT10aGlzLnN0YXRlLnBvcyYmdGhpcy5yZWFkVG9rZW5faW50ZXJwcmV0ZXIoKSlyZXR1cm47Y29uc3QgdD10aGlzLnN0YXRlLnBvcysxLGU9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHQpO2lmKGU+PTQ4JiZlPD01Nyl0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUucG9zLGYuVW5leHBlY3RlZERpZ2l0QWZ0ZXJIYXNoKTtpZighdGhpcy5oYXNQbHVnaW4oXCJyZWNvcmRBbmRUdXBsZVwiKXx8MTIzIT09ZSYmOTEhPT1lKXtpZighdGhpcy5oYXNQbHVnaW4oXCJjbGFzc1ByaXZhdGVQcm9wZXJ0aWVzXCIpJiYhdGhpcy5oYXNQbHVnaW4oXCJjbGFzc1ByaXZhdGVNZXRob2RzXCIpJiZcInNtYXJ0XCIhPT10aGlzLmdldFBsdWdpbk9wdGlvbihcInBpcGVsaW5lT3BlcmF0b3JcIixcInByb3Bvc2FsXCIpKXRocm93IHRoaXMucmFpc2UodGhpcy5zdGF0ZS5wb3MsZi5JbnZhbGlkT3JVbmV4cGVjdGVkVG9rZW4sXCIjXCIpO3RoaXMuZmluaXNoT3Aobi5oYXNoLDEpfWVsc2V7aWYoXCJoYXNoXCIhPT10aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsXCJzeW50YXhUeXBlXCIpKXRocm93IHRoaXMucmFpc2UodGhpcy5zdGF0ZS5wb3MsMTIzPT09ZT9mLlJlY29yZEV4cHJlc3Npb25IYXNoSW5jb3JyZWN0U3RhcnRTeW50YXhUeXBlOmYuVHVwbGVFeHByZXNzaW9uSGFzaEluY29ycmVjdFN0YXJ0U3ludGF4VHlwZSk7MTIzPT09ZT90aGlzLmZpbmlzaFRva2VuKG4uYnJhY2VIYXNoTCk6dGhpcy5maW5pc2hUb2tlbihuLmJyYWNrZXRIYXNoTCksdGhpcy5zdGF0ZS5wb3MrPTJ9fXJlYWRUb2tlbl9kb3QoKXtjb25zdCB0PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcysxKTt0Pj00OCYmdDw9NTc/dGhpcy5yZWFkTnVtYmVyKCEwKTo0Nj09PXQmJjQ2PT09dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKzIpPyh0aGlzLnN0YXRlLnBvcys9Myx0aGlzLmZpbmlzaFRva2VuKG4uZWxsaXBzaXMpKTooKyt0aGlzLnN0YXRlLnBvcyx0aGlzLmZpbmlzaFRva2VuKG4uZG90KSl9cmVhZFRva2VuX3NsYXNoKCl7aWYodGhpcy5zdGF0ZS5leHByQWxsb3dlZCYmIXRoaXMuc3RhdGUuaW5UeXBlKXJldHVybisrdGhpcy5zdGF0ZS5wb3Msdm9pZCB0aGlzLnJlYWRSZWdleHAoKTs2MT09PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcysxKT90aGlzLmZpbmlzaE9wKG4uYXNzaWduLDIpOnRoaXMuZmluaXNoT3Aobi5zbGFzaCwxKX1yZWFkVG9rZW5faW50ZXJwcmV0ZXIoKXtpZigwIT09dGhpcy5zdGF0ZS5wb3N8fHRoaXMubGVuZ3RoPDIpcmV0dXJuITE7bGV0IHQ9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKzEpO2lmKDMzIT09dClyZXR1cm4hMTtjb25zdCBlPXRoaXMuc3RhdGUucG9zO2Zvcih0aGlzLnN0YXRlLnBvcys9MTshcCh0KSYmKyt0aGlzLnN0YXRlLnBvczx0aGlzLmxlbmd0aDspdD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpO2NvbnN0IHM9dGhpcy5pbnB1dC5zbGljZShlKzIsdGhpcy5zdGF0ZS5wb3MpO3JldHVybiB0aGlzLmZpbmlzaFRva2VuKG4uaW50ZXJwcmV0ZXJEaXJlY3RpdmUscyksITB9cmVhZFRva2VuX211bHRfbW9kdWxvKHQpe2xldCBlPTQyPT09dD9uLnN0YXI6bi5tb2R1bG8scz0xLGk9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKzEpO2NvbnN0IHI9dGhpcy5zdGF0ZS5leHByQWxsb3dlZDs0Mj09PXQmJjQyPT09aSYmKHMrKyxpPXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcysyKSxlPW4uZXhwb25lbnQpLDYxIT09aXx8cnx8KHMrKyxlPW4uYXNzaWduKSx0aGlzLmZpbmlzaE9wKGUscyl9cmVhZFRva2VuX3BpcGVfYW1wKHQpe2NvbnN0IGU9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKzEpO2lmKGUhPT10KXtpZigxMjQ9PT10KXtpZig2Mj09PWUpcmV0dXJuIHZvaWQgdGhpcy5maW5pc2hPcChuLnBpcGVsaW5lLDIpO2lmKHRoaXMuaGFzUGx1Z2luKFwicmVjb3JkQW5kVHVwbGVcIikmJjEyNT09PWUpe2lmKFwiYmFyXCIhPT10aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsXCJzeW50YXhUeXBlXCIpKXRocm93IHRoaXMucmFpc2UodGhpcy5zdGF0ZS5wb3MsZi5SZWNvcmRFeHByZXNzaW9uQmFySW5jb3JyZWN0RW5kU3ludGF4VHlwZSk7cmV0dXJuIHZvaWQgdGhpcy5maW5pc2hPcChuLmJyYWNlQmFyUiwyKX1pZih0aGlzLmhhc1BsdWdpbihcInJlY29yZEFuZFR1cGxlXCIpJiY5Mz09PWUpe2lmKFwiYmFyXCIhPT10aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsXCJzeW50YXhUeXBlXCIpKXRocm93IHRoaXMucmFpc2UodGhpcy5zdGF0ZS5wb3MsZi5UdXBsZUV4cHJlc3Npb25CYXJJbmNvcnJlY3RFbmRTeW50YXhUeXBlKTtyZXR1cm4gdm9pZCB0aGlzLmZpbmlzaE9wKG4uYnJhY2tldEJhclIsMil9fTYxIT09ZT90aGlzLmZpbmlzaE9wKDEyND09PXQ/bi5iaXR3aXNlT1I6bi5iaXR3aXNlQU5ELDEpOnRoaXMuZmluaXNoT3Aobi5hc3NpZ24sMil9ZWxzZSA2MT09PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcysyKT90aGlzLmZpbmlzaE9wKG4uYXNzaWduLDMpOnRoaXMuZmluaXNoT3AoMTI0PT09dD9uLmxvZ2ljYWxPUjpuLmxvZ2ljYWxBTkQsMil9cmVhZFRva2VuX2NhcmV0KCl7NjE9PT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMSk/dGhpcy5maW5pc2hPcChuLmFzc2lnbiwyKTp0aGlzLmZpbmlzaE9wKG4uYml0d2lzZVhPUiwxKX1yZWFkVG9rZW5fcGx1c19taW4odCl7Y29uc3QgZT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMSk7aWYoZT09PXQpcmV0dXJuIDQ1IT09ZXx8dGhpcy5pbk1vZHVsZXx8NjIhPT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMil8fDAhPT10aGlzLnN0YXRlLmxhc3RUb2tFbmQmJiFvLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXRlLmxhc3RUb2tFbmQsdGhpcy5zdGF0ZS5wb3MpKT92b2lkIHRoaXMuZmluaXNoT3Aobi5pbmNEZWMsMik6KHRoaXMuc2tpcExpbmVDb21tZW50KDMpLHRoaXMuc2tpcFNwYWNlKCksdm9pZCB0aGlzLm5leHRUb2tlbigpKTs2MT09PWU/dGhpcy5maW5pc2hPcChuLmFzc2lnbiwyKTp0aGlzLmZpbmlzaE9wKG4ucGx1c01pbiwxKX1yZWFkVG9rZW5fbHRfZ3QodCl7Y29uc3QgZT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMSk7bGV0IHM9MTtyZXR1cm4gZT09PXQ/KHM9NjI9PT10JiY2Mj09PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcysyKT8zOjIsNjE9PT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3Mrcyk/dm9pZCB0aGlzLmZpbmlzaE9wKG4uYXNzaWduLHMrMSk6dm9pZCB0aGlzLmZpbmlzaE9wKG4uYml0U2hpZnQscykpOjMzIT09ZXx8NjAhPT10fHx0aGlzLmluTW9kdWxlfHw0NSE9PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcysyKXx8NDUhPT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMyk/KDYxPT09ZSYmKHM9Miksdm9pZCB0aGlzLmZpbmlzaE9wKG4ucmVsYXRpb25hbCxzKSk6KHRoaXMuc2tpcExpbmVDb21tZW50KDQpLHRoaXMuc2tpcFNwYWNlKCksdm9pZCB0aGlzLm5leHRUb2tlbigpKX1yZWFkVG9rZW5fZXFfZXhjbCh0KXtjb25zdCBlPXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcysxKTtpZig2MSE9PWUpcmV0dXJuIDYxPT09dCYmNjI9PT1lPyh0aGlzLnN0YXRlLnBvcys9Mix2b2lkIHRoaXMuZmluaXNoVG9rZW4obi5hcnJvdykpOnZvaWQgdGhpcy5maW5pc2hPcCg2MT09PXQ/bi5lcTpuLmJhbmcsMSk7dGhpcy5maW5pc2hPcChuLmVxdWFsaXR5LDYxPT09dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKzIpPzM6Mil9cmVhZFRva2VuX3F1ZXN0aW9uKCl7Y29uc3QgdD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMSksZT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMik7NjMhPT10fHx0aGlzLnN0YXRlLmluVHlwZT80NiE9PXR8fGU+PTQ4JiZlPD01Nz8oKyt0aGlzLnN0YXRlLnBvcyx0aGlzLmZpbmlzaFRva2VuKG4ucXVlc3Rpb24pKToodGhpcy5zdGF0ZS5wb3MrPTIsdGhpcy5maW5pc2hUb2tlbihuLnF1ZXN0aW9uRG90KSk6NjE9PT1lP3RoaXMuZmluaXNoT3Aobi5hc3NpZ24sMyk6dGhpcy5maW5pc2hPcChuLm51bGxpc2hDb2FsZXNjaW5nLDIpfWdldFRva2VuRnJvbUNvZGUodCl7c3dpdGNoKHQpe2Nhc2UgNDY6cmV0dXJuIHZvaWQgdGhpcy5yZWFkVG9rZW5fZG90KCk7Y2FzZSA0MDpyZXR1cm4rK3RoaXMuc3RhdGUucG9zLHZvaWQgdGhpcy5maW5pc2hUb2tlbihuLnBhcmVuTCk7Y2FzZSA0MTpyZXR1cm4rK3RoaXMuc3RhdGUucG9zLHZvaWQgdGhpcy5maW5pc2hUb2tlbihuLnBhcmVuUik7Y2FzZSA1OTpyZXR1cm4rK3RoaXMuc3RhdGUucG9zLHZvaWQgdGhpcy5maW5pc2hUb2tlbihuLnNlbWkpO2Nhc2UgNDQ6cmV0dXJuKyt0aGlzLnN0YXRlLnBvcyx2b2lkIHRoaXMuZmluaXNoVG9rZW4obi5jb21tYSk7Y2FzZSA5MTppZih0aGlzLmhhc1BsdWdpbihcInJlY29yZEFuZFR1cGxlXCIpJiYxMjQ9PT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMSkpe2lmKFwiYmFyXCIhPT10aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsXCJzeW50YXhUeXBlXCIpKXRocm93IHRoaXMucmFpc2UodGhpcy5zdGF0ZS5wb3MsZi5UdXBsZUV4cHJlc3Npb25CYXJJbmNvcnJlY3RTdGFydFN5bnRheFR5cGUpO3RoaXMuZmluaXNoVG9rZW4obi5icmFja2V0QmFyTCksdGhpcy5zdGF0ZS5wb3MrPTJ9ZWxzZSsrdGhpcy5zdGF0ZS5wb3MsdGhpcy5maW5pc2hUb2tlbihuLmJyYWNrZXRMKTtyZXR1cm47Y2FzZSA5MzpyZXR1cm4rK3RoaXMuc3RhdGUucG9zLHZvaWQgdGhpcy5maW5pc2hUb2tlbihuLmJyYWNrZXRSKTtjYXNlIDEyMzppZih0aGlzLmhhc1BsdWdpbihcInJlY29yZEFuZFR1cGxlXCIpJiYxMjQ9PT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMSkpe2lmKFwiYmFyXCIhPT10aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsXCJzeW50YXhUeXBlXCIpKXRocm93IHRoaXMucmFpc2UodGhpcy5zdGF0ZS5wb3MsZi5SZWNvcmRFeHByZXNzaW9uQmFySW5jb3JyZWN0U3RhcnRTeW50YXhUeXBlKTt0aGlzLmZpbmlzaFRva2VuKG4uYnJhY2VCYXJMKSx0aGlzLnN0YXRlLnBvcys9Mn1lbHNlKyt0aGlzLnN0YXRlLnBvcyx0aGlzLmZpbmlzaFRva2VuKG4uYnJhY2VMKTtyZXR1cm47Y2FzZSAxMjU6cmV0dXJuKyt0aGlzLnN0YXRlLnBvcyx2b2lkIHRoaXMuZmluaXNoVG9rZW4obi5icmFjZVIpO2Nhc2UgNTg6cmV0dXJuIHZvaWQodGhpcy5oYXNQbHVnaW4oXCJmdW5jdGlvbkJpbmRcIikmJjU4PT09dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKzEpP3RoaXMuZmluaXNoT3Aobi5kb3VibGVDb2xvbiwyKTooKyt0aGlzLnN0YXRlLnBvcyx0aGlzLmZpbmlzaFRva2VuKG4uY29sb24pKSk7Y2FzZSA2MzpyZXR1cm4gdm9pZCB0aGlzLnJlYWRUb2tlbl9xdWVzdGlvbigpO2Nhc2UgOTY6cmV0dXJuKyt0aGlzLnN0YXRlLnBvcyx2b2lkIHRoaXMuZmluaXNoVG9rZW4obi5iYWNrUXVvdGUpO2Nhc2UgNDg6e2NvbnN0IHQ9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKzEpO2lmKDEyMD09PXR8fDg4PT09dClyZXR1cm4gdm9pZCB0aGlzLnJlYWRSYWRpeE51bWJlcigxNik7aWYoMTExPT09dHx8Nzk9PT10KXJldHVybiB2b2lkIHRoaXMucmVhZFJhZGl4TnVtYmVyKDgpO2lmKDk4PT09dHx8NjY9PT10KXJldHVybiB2b2lkIHRoaXMucmVhZFJhZGl4TnVtYmVyKDIpfWNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OnJldHVybiB2b2lkIHRoaXMucmVhZE51bWJlcighMSk7Y2FzZSAzNDpjYXNlIDM5OnJldHVybiB2b2lkIHRoaXMucmVhZFN0cmluZyh0KTtjYXNlIDQ3OnJldHVybiB2b2lkIHRoaXMucmVhZFRva2VuX3NsYXNoKCk7Y2FzZSAzNzpjYXNlIDQyOnJldHVybiB2b2lkIHRoaXMucmVhZFRva2VuX211bHRfbW9kdWxvKHQpO2Nhc2UgMTI0OmNhc2UgMzg6cmV0dXJuIHZvaWQgdGhpcy5yZWFkVG9rZW5fcGlwZV9hbXAodCk7Y2FzZSA5NDpyZXR1cm4gdm9pZCB0aGlzLnJlYWRUb2tlbl9jYXJldCgpO2Nhc2UgNDM6Y2FzZSA0NTpyZXR1cm4gdm9pZCB0aGlzLnJlYWRUb2tlbl9wbHVzX21pbih0KTtjYXNlIDYwOmNhc2UgNjI6cmV0dXJuIHZvaWQgdGhpcy5yZWFkVG9rZW5fbHRfZ3QodCk7Y2FzZSA2MTpjYXNlIDMzOnJldHVybiB2b2lkIHRoaXMucmVhZFRva2VuX2VxX2V4Y2wodCk7Y2FzZSAxMjY6cmV0dXJuIHZvaWQgdGhpcy5maW5pc2hPcChuLnRpbGRlLDEpO2Nhc2UgNjQ6cmV0dXJuKyt0aGlzLnN0YXRlLnBvcyx2b2lkIHRoaXMuZmluaXNoVG9rZW4obi5hdCk7Y2FzZSAzNTpyZXR1cm4gdm9pZCB0aGlzLnJlYWRUb2tlbl9udW1iZXJTaWduKCk7Y2FzZSA5MjpyZXR1cm4gdm9pZCB0aGlzLnJlYWRXb3JkKCk7ZGVmYXVsdDppZih3KHQpKXJldHVybiB2b2lkIHRoaXMucmVhZFdvcmQoKX10aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUucG9zLGYuSW52YWxpZE9yVW5leHBlY3RlZFRva2VuLFN0cmluZy5mcm9tQ29kZVBvaW50KHQpKX1maW5pc2hPcCh0LGUpe2NvbnN0IHM9dGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXRlLnBvcyx0aGlzLnN0YXRlLnBvcytlKTt0aGlzLnN0YXRlLnBvcys9ZSx0aGlzLmZpbmlzaFRva2VuKHQscyl9cmVhZFJlZ2V4cCgpe2NvbnN0IHQ9dGhpcy5zdGF0ZS5wb3M7bGV0IGUscztmb3IoOzspe2lmKHRoaXMuc3RhdGUucG9zPj10aGlzLmxlbmd0aCl0aHJvdyB0aGlzLnJhaXNlKHQsZi5VbnRlcm1pbmF0ZWRSZWdFeHApO2NvbnN0IGk9dGhpcy5pbnB1dC5jaGFyQXQodGhpcy5zdGF0ZS5wb3MpO2lmKG8udGVzdChpKSl0aHJvdyB0aGlzLnJhaXNlKHQsZi5VbnRlcm1pbmF0ZWRSZWdFeHApO2lmKGUpZT0hMTtlbHNle2lmKFwiW1wiPT09aSlzPSEwO2Vsc2UgaWYoXCJdXCI9PT1pJiZzKXM9ITE7ZWxzZSBpZihcIi9cIj09PWkmJiFzKWJyZWFrO2U9XCJcXFxcXCI9PT1pfSsrdGhpcy5zdGF0ZS5wb3N9Y29uc3QgaT10aGlzLmlucHV0LnNsaWNlKHQsdGhpcy5zdGF0ZS5wb3MpOysrdGhpcy5zdGF0ZS5wb3M7bGV0IHI9XCJcIjtmb3IoO3RoaXMuc3RhdGUucG9zPHRoaXMubGVuZ3RoOyl7Y29uc3QgdD10aGlzLmlucHV0W3RoaXMuc3RhdGUucG9zXSxlPXRoaXMuaW5wdXQuY29kZVBvaW50QXQodGhpcy5zdGF0ZS5wb3MpO2lmKG10Lmhhcyh0KSlyLmluZGV4T2YodCk+LTEmJnRoaXMucmFpc2UodGhpcy5zdGF0ZS5wb3MrMSxmLkR1cGxpY2F0ZVJlZ0V4cEZsYWdzKTtlbHNle2lmKCFTKGUpJiY5MiE9PWUpYnJlYWs7dGhpcy5yYWlzZSh0aGlzLnN0YXRlLnBvcysxLGYuTWFsZm9ybWVkUmVnRXhwRmxhZ3MpfSsrdGhpcy5zdGF0ZS5wb3Mscis9dH10aGlzLmZpbmlzaFRva2VuKG4ucmVnZXhwLHtwYXR0ZXJuOmksZmxhZ3M6cn0pfXJlYWRJbnQodCxlLHMsaT0hMCl7Y29uc3Qgcj10aGlzLnN0YXRlLnBvcyxhPTE2PT09dD9mdC5oZXg6ZnQuZGVjQmluT2N0LG49MTY9PT10P0R0LmhleDoxMD09PXQ/RHQuZGVjOjg9PT10P0R0Lm9jdDpEdC5iaW47bGV0IG89ITEsaD0wO2ZvcihsZXQgcj0wLHA9bnVsbD09ZT8xLzA6ZTtyPHA7KytyKXtjb25zdCBlPXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk7bGV0IHA7aWYodGhpcy5oYXNQbHVnaW4oXCJudW1lcmljU2VwYXJhdG9yXCIpJiY5NT09PWUpe2NvbnN0IHQ9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zLTEpLGU9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKzEpOy0xPT09bi5pbmRleE9mKGUpP3RoaXMucmFpc2UodGhpcy5zdGF0ZS5wb3MsZi5VbmV4cGVjdGVkTnVtZXJpY1NlcGFyYXRvcik6KGEuaW5kZXhPZih0KT4tMXx8YS5pbmRleE9mKGUpPi0xfHxOdW1iZXIuaXNOYU4oZSkpJiZ0aGlzLnJhaXNlKHRoaXMuc3RhdGUucG9zLGYuVW5leHBlY3RlZE51bWVyaWNTZXBhcmF0b3IpLGl8fHRoaXMucmFpc2UodGhpcy5zdGF0ZS5wb3MsZi5OdW1lcmljU2VwYXJhdG9ySW5Fc2NhcGVTZXF1ZW5jZSksKyt0aGlzLnN0YXRlLnBvc31lbHNle2lmKHA9ZT49OTc/ZS05NysxMDplPj02NT9lLTY1KzEwOmR0KGUpP2UtNDg6MS8wLHA+PXQpaWYodGhpcy5vcHRpb25zLmVycm9yUmVjb3ZlcnkmJnA8PTkpcD0wLHRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCtyKzIsZi5JbnZhbGlkRGlnaXQsdCk7ZWxzZXtpZighcylicmVhaztwPTAsbz0hMH0rK3RoaXMuc3RhdGUucG9zLGg9aCp0K3B9fXJldHVybiB0aGlzLnN0YXRlLnBvcz09PXJ8fG51bGwhPWUmJnRoaXMuc3RhdGUucG9zLXIhPT1lfHxvP251bGw6aH1yZWFkUmFkaXhOdW1iZXIodCl7Y29uc3QgZT10aGlzLnN0YXRlLnBvcztsZXQgcz0hMTt0aGlzLnN0YXRlLnBvcys9Mjtjb25zdCBpPXRoaXMucmVhZEludCh0KTtpZihudWxsPT1pJiZ0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQrMixmLkludmFsaWREaWdpdCx0KSwxMTA9PT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpJiYoKyt0aGlzLnN0YXRlLnBvcyxzPSEwKSx3KHRoaXMuaW5wdXQuY29kZVBvaW50QXQodGhpcy5zdGF0ZS5wb3MpKSl0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUucG9zLGYuTnVtYmVySWRlbnRpZmllcik7aWYocyl7Y29uc3QgdD10aGlzLmlucHV0LnNsaWNlKGUsdGhpcy5zdGF0ZS5wb3MpLnJlcGxhY2UoL1tfbl0vZyxcIlwiKTt0aGlzLmZpbmlzaFRva2VuKG4uYmlnaW50LHQpfWVsc2UgdGhpcy5maW5pc2hUb2tlbihuLm51bSxpKX1yZWFkTnVtYmVyKHQpe2NvbnN0IGU9dGhpcy5zdGF0ZS5wb3M7bGV0IHM9ITEsaT0hMSxyPSExO3R8fG51bGwhPT10aGlzLnJlYWRJbnQoMTApfHx0aGlzLnJhaXNlKGUsZi5JbnZhbGlkTnVtYmVyKTtsZXQgYT10aGlzLnN0YXRlLnBvcy1lPj0yJiY0OD09PXRoaXMuaW5wdXQuY2hhckNvZGVBdChlKTthJiYodGhpcy5zdGF0ZS5zdHJpY3QmJnRoaXMucmFpc2UoZSxmLlN0cmljdE9jdGFsTGl0ZXJhbCksL1s4OV0vLnRlc3QodGhpcy5pbnB1dC5zbGljZShlLHRoaXMuc3RhdGUucG9zKSkmJihhPSExLHI9ITApKTtsZXQgbz10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpO2lmKDQ2IT09b3x8YXx8KCsrdGhpcy5zdGF0ZS5wb3MsdGhpcy5yZWFkSW50KDEwKSxzPSEwLG89dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKSksNjkhPT1vJiYxMDEhPT1vfHxhfHwobz10aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnN0YXRlLnBvcyksNDMhPT1vJiY0NSE9PW98fCsrdGhpcy5zdGF0ZS5wb3MsbnVsbD09PXRoaXMucmVhZEludCgxMCkmJnRoaXMucmFpc2UoZSxcIkludmFsaWQgbnVtYmVyXCIpLHM9ITAsbz10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpKSx0aGlzLmhhc1BsdWdpbihcIm51bWVyaWNTZXBhcmF0b3JcIikmJihhfHxyKSl7Y29uc3QgdD10aGlzLmlucHV0LnNsaWNlKGUsdGhpcy5zdGF0ZS5wb3MpLmluZGV4T2YoXCJfXCIpO3Q+MCYmdGhpcy5yYWlzZSh0K2UsZi5aZXJvRGlnaXROdW1lcmljU2VwYXJhdG9yKX1pZigxMTA9PT1vJiYoKHN8fGF8fHIpJiZ0aGlzLnJhaXNlKGUsXCJJbnZhbGlkIEJpZ0ludExpdGVyYWxcIiksKyt0aGlzLnN0YXRlLnBvcyxpPSEwKSx3KHRoaXMuaW5wdXQuY29kZVBvaW50QXQodGhpcy5zdGF0ZS5wb3MpKSl0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUucG9zLGYuTnVtYmVySWRlbnRpZmllcik7Y29uc3QgaD10aGlzLmlucHV0LnNsaWNlKGUsdGhpcy5zdGF0ZS5wb3MpLnJlcGxhY2UoL1tfbl0vZyxcIlwiKTtpZihpKXJldHVybiB2b2lkIHRoaXMuZmluaXNoVG9rZW4obi5iaWdpbnQsaCk7Y29uc3QgcD1hP3BhcnNlSW50KGgsOCk6cGFyc2VGbG9hdChoKTt0aGlzLmZpbmlzaFRva2VuKG4ubnVtLHApfXJlYWRDb2RlUG9pbnQodCl7bGV0IGU7aWYoMTIzPT09dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKSl7Y29uc3Qgcz0rK3RoaXMuc3RhdGUucG9zO2lmKGU9dGhpcy5yZWFkSGV4Q2hhcih0aGlzLmlucHV0LmluZGV4T2YoXCJ9XCIsdGhpcy5zdGF0ZS5wb3MpLXRoaXMuc3RhdGUucG9zLCEwLHQpLCsrdGhpcy5zdGF0ZS5wb3MsbnVsbCE9PWUmJmU+MTExNDExMSl7aWYoIXQpcmV0dXJuIG51bGw7dGhpcy5yYWlzZShzLGYuSW52YWxpZENvZGVQb2ludCl9fWVsc2UgZT10aGlzLnJlYWRIZXhDaGFyKDQsITEsdCk7cmV0dXJuIGV9cmVhZFN0cmluZyh0KXtsZXQgZT1cIlwiLHM9Kyt0aGlzLnN0YXRlLnBvcztmb3IoOzspe2lmKHRoaXMuc3RhdGUucG9zPj10aGlzLmxlbmd0aCl0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQsZi5VbnRlcm1pbmF0ZWRTdHJpbmcpO2NvbnN0IGk9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtpZihpPT09dClicmVhaztpZig5Mj09PWkpZSs9dGhpcy5pbnB1dC5zbGljZShzLHRoaXMuc3RhdGUucG9zKSxlKz10aGlzLnJlYWRFc2NhcGVkQ2hhcighMSkscz10aGlzLnN0YXRlLnBvcztlbHNlIGlmKDgyMzI9PT1pfHw4MjMzPT09aSkrK3RoaXMuc3RhdGUucG9zLCsrdGhpcy5zdGF0ZS5jdXJMaW5lLHRoaXMuc3RhdGUubGluZVN0YXJ0PXRoaXMuc3RhdGUucG9zO2Vsc2V7aWYocChpKSl0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQsZi5VbnRlcm1pbmF0ZWRTdHJpbmcpOysrdGhpcy5zdGF0ZS5wb3N9fWUrPXRoaXMuaW5wdXQuc2xpY2Uocyx0aGlzLnN0YXRlLnBvcysrKSx0aGlzLmZpbmlzaFRva2VuKG4uc3RyaW5nLGUpfXJlYWRUbXBsVG9rZW4oKXtsZXQgdD1cIlwiLGU9dGhpcy5zdGF0ZS5wb3Mscz0hMTtmb3IoOzspe2lmKHRoaXMuc3RhdGUucG9zPj10aGlzLmxlbmd0aCl0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQsZi5VbnRlcm1pbmF0ZWRUZW1wbGF0ZSk7Y29uc3QgaT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpO2lmKDk2PT09aXx8MzY9PT1pJiYxMjM9PT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MrMSkpcmV0dXJuIHRoaXMuc3RhdGUucG9zPT09dGhpcy5zdGF0ZS5zdGFydCYmdGhpcy5tYXRjaChuLnRlbXBsYXRlKT8zNj09PWk/KHRoaXMuc3RhdGUucG9zKz0yLHZvaWQgdGhpcy5maW5pc2hUb2tlbihuLmRvbGxhckJyYWNlTCkpOigrK3RoaXMuc3RhdGUucG9zLHZvaWQgdGhpcy5maW5pc2hUb2tlbihuLmJhY2tRdW90ZSkpOih0Kz10aGlzLmlucHV0LnNsaWNlKGUsdGhpcy5zdGF0ZS5wb3MpLHZvaWQgdGhpcy5maW5pc2hUb2tlbihuLnRlbXBsYXRlLHM/bnVsbDp0KSk7aWYoOTI9PT1pKXt0Kz10aGlzLmlucHV0LnNsaWNlKGUsdGhpcy5zdGF0ZS5wb3MpO2NvbnN0IGk9dGhpcy5yZWFkRXNjYXBlZENoYXIoITApO251bGw9PT1pP3M9ITA6dCs9aSxlPXRoaXMuc3RhdGUucG9zfWVsc2UgaWYocChpKSl7c3dpdGNoKHQrPXRoaXMuaW5wdXQuc2xpY2UoZSx0aGlzLnN0YXRlLnBvcyksKyt0aGlzLnN0YXRlLnBvcyxpKXtjYXNlIDEzOjEwPT09dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKSYmKyt0aGlzLnN0YXRlLnBvcztjYXNlIDEwOnQrPVwiXFxuXCI7YnJlYWs7ZGVmYXVsdDp0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfSsrdGhpcy5zdGF0ZS5jdXJMaW5lLHRoaXMuc3RhdGUubGluZVN0YXJ0PXRoaXMuc3RhdGUucG9zLGU9dGhpcy5zdGF0ZS5wb3N9ZWxzZSsrdGhpcy5zdGF0ZS5wb3N9fXJlYWRFc2NhcGVkQ2hhcih0KXtjb25zdCBlPSF0LHM9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5zdGF0ZS5wb3MpO3N3aXRjaCgrK3RoaXMuc3RhdGUucG9zLHMpe2Nhc2UgMTEwOnJldHVyblwiXFxuXCI7Y2FzZSAxMTQ6cmV0dXJuXCJcXHJcIjtjYXNlIDEyMDp7Y29uc3QgdD10aGlzLnJlYWRIZXhDaGFyKDIsITEsZSk7cmV0dXJuIG51bGw9PT10P251bGw6U3RyaW5nLmZyb21DaGFyQ29kZSh0KX1jYXNlIDExNzp7Y29uc3QgdD10aGlzLnJlYWRDb2RlUG9pbnQoZSk7cmV0dXJuIG51bGw9PT10P251bGw6U3RyaW5nLmZyb21Db2RlUG9pbnQodCl9Y2FzZSAxMTY6cmV0dXJuXCJcXHRcIjtjYXNlIDk4OnJldHVyblwiXFxiXCI7Y2FzZSAxMTg6cmV0dXJuXCJcXHZcIjtjYXNlIDEwMjpyZXR1cm5cIlxcZlwiO2Nhc2UgMTM6MTA9PT10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpJiYrK3RoaXMuc3RhdGUucG9zO2Nhc2UgMTA6dGhpcy5zdGF0ZS5saW5lU3RhcnQ9dGhpcy5zdGF0ZS5wb3MsKyt0aGlzLnN0YXRlLmN1ckxpbmU7Y2FzZSA4MjMyOmNhc2UgODIzMzpyZXR1cm5cIlwiO2Nhc2UgNTY6Y2FzZSA1NzppZih0KXJldHVybiBudWxsO2RlZmF1bHQ6aWYocz49NDgmJnM8PTU1KXtjb25zdCBlPXRoaXMuc3RhdGUucG9zLTE7bGV0IHM9dGhpcy5pbnB1dC5zdWJzdHIodGhpcy5zdGF0ZS5wb3MtMSwzKS5tYXRjaCgvXlswLTddKy8pWzBdLGk9cGFyc2VJbnQocyw4KTtpPjI1NSYmKHM9cy5zbGljZSgwLC0xKSxpPXBhcnNlSW50KHMsOCkpLHRoaXMuc3RhdGUucG9zKz1zLmxlbmd0aC0xO2NvbnN0IHI9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtpZihcIjBcIiE9PXN8fDU2PT09cnx8NTc9PT1yKXtpZih0KXJldHVybiBudWxsO3RoaXMuc3RhdGUuc3RyaWN0P3RoaXMucmFpc2UoZSxmLlN0cmljdE9jdGFsTGl0ZXJhbCk6dGhpcy5zdGF0ZS5vY3RhbFBvc2l0aW9ucy5wdXNoKGUpfXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpfXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHMpfX1yZWFkSGV4Q2hhcih0LGUscyl7Y29uc3QgaT10aGlzLnN0YXRlLnBvcyxyPXRoaXMucmVhZEludCgxNix0LGUsITEpO3JldHVybiBudWxsPT09ciYmKHM/dGhpcy5yYWlzZShpLGYuSW52YWxpZEVzY2FwZVNlcXVlbmNlKTp0aGlzLnN0YXRlLnBvcz1pLTEpLHJ9cmVhZFdvcmQxKCl7bGV0IHQ9XCJcIjt0aGlzLnN0YXRlLmNvbnRhaW5zRXNjPSExO2NvbnN0IGU9dGhpcy5zdGF0ZS5wb3M7bGV0IHM9dGhpcy5zdGF0ZS5wb3M7Zm9yKDt0aGlzLnN0YXRlLnBvczx0aGlzLmxlbmd0aDspe2NvbnN0IGk9dGhpcy5pbnB1dC5jb2RlUG9pbnRBdCh0aGlzLnN0YXRlLnBvcyk7aWYoUyhpKSl0aGlzLnN0YXRlLnBvcys9aTw9NjU1MzU/MToyO2Vsc2UgaWYodGhpcy5zdGF0ZS5pc0l0ZXJhdG9yJiY2ND09PWkpKyt0aGlzLnN0YXRlLnBvcztlbHNle2lmKDkyIT09aSlicmVhazt7dGhpcy5zdGF0ZS5jb250YWluc0VzYz0hMCx0Kz10aGlzLmlucHV0LnNsaWNlKHMsdGhpcy5zdGF0ZS5wb3MpO2NvbnN0IGk9dGhpcy5zdGF0ZS5wb3Mscj10aGlzLnN0YXRlLnBvcz09PWU/dzpTO2lmKDExNyE9PXRoaXMuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMuc3RhdGUucG9zKSl7dGhpcy5yYWlzZSh0aGlzLnN0YXRlLnBvcyxmLk1pc3NpbmdVbmljb2RlRXNjYXBlKTtjb250aW51ZX0rK3RoaXMuc3RhdGUucG9zO2NvbnN0IGE9dGhpcy5yZWFkQ29kZVBvaW50KCEwKTtudWxsIT09YSYmKHIoYSl8fHRoaXMucmFpc2UoaSxmLkVzY2FwZWRDaGFyTm90QW5JZGVudGlmaWVyKSx0Kz1TdHJpbmcuZnJvbUNvZGVQb2ludChhKSkscz10aGlzLnN0YXRlLnBvc319fXJldHVybiB0K3RoaXMuaW5wdXQuc2xpY2Uocyx0aGlzLnN0YXRlLnBvcyl9aXNJdGVyYXRvcih0KXtyZXR1cm5cIkBAaXRlcmF0b3JcIj09PXR8fFwiQEBhc3luY0l0ZXJhdG9yXCI9PT10fXJlYWRXb3JkKCl7Y29uc3QgdD10aGlzLnJlYWRXb3JkMSgpLGU9aS5nZXQodCl8fG4ubmFtZTshdGhpcy5zdGF0ZS5pc0l0ZXJhdG9yfHx0aGlzLmlzSXRlcmF0b3IodCkmJnRoaXMuc3RhdGUuaW5UeXBlfHx0aGlzLnJhaXNlKHRoaXMuc3RhdGUucG9zLGYuSW52YWxpZElkZW50aWZpZXIsdCksdGhpcy5maW5pc2hUb2tlbihlLHQpfWNoZWNrS2V5d29yZEVzY2FwZXMoKXtjb25zdCB0PXRoaXMuc3RhdGUudHlwZS5rZXl3b3JkO3QmJnRoaXMuc3RhdGUuY29udGFpbnNFc2MmJnRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLkludmFsaWRFc2NhcGVkUmVzZXJ2ZWRXb3JkLHQpfWJyYWNlSXNCbG9jayh0KXtjb25zdCBlPXRoaXMuY3VyQ29udGV4dCgpO3JldHVybiBlPT09eC5mdW5jdGlvbkV4cHJlc3Npb258fGU9PT14LmZ1bmN0aW9uU3RhdGVtZW50fHwodCE9PW4uY29sb258fGUhPT14LmJyYWNlU3RhdGVtZW50JiZlIT09eC5icmFjZUV4cHJlc3Npb24/dD09PW4uX3JldHVybnx8dD09PW4ubmFtZSYmdGhpcy5zdGF0ZS5leHByQWxsb3dlZD9vLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXRlLmxhc3RUb2tFbmQsdGhpcy5zdGF0ZS5zdGFydCkpOnQ9PT1uLl9lbHNlfHx0PT09bi5zZW1pfHx0PT09bi5lb2Z8fHQ9PT1uLnBhcmVuUnx8dD09PW4uYXJyb3d8fCh0PT09bi5icmFjZUw/ZT09PXguYnJhY2VTdGF0ZW1lbnQ6dCE9PW4uX3ZhciYmdCE9PW4uX2NvbnN0JiZ0IT09bi5uYW1lJiYodD09PW4ucmVsYXRpb25hbHx8IXRoaXMuc3RhdGUuZXhwckFsbG93ZWQpKTohZS5pc0V4cHIpfXVwZGF0ZUNvbnRleHQodCl7Y29uc3QgZT10aGlzLnN0YXRlLnR5cGU7bGV0IHM7IWUua2V5d29yZHx8dCE9PW4uZG90JiZ0IT09bi5xdWVzdGlvbkRvdD8ocz1lLnVwZGF0ZUNvbnRleHQpP3MuY2FsbCh0aGlzLHQpOnRoaXMuc3RhdGUuZXhwckFsbG93ZWQ9ZS5iZWZvcmVFeHByOnRoaXMuc3RhdGUuZXhwckFsbG93ZWQ9ITF9fXthZGRFeHRyYSh0LGUscyl7aWYoIXQpcmV0dXJuOyh0LmV4dHJhPXQuZXh0cmF8fHt9KVtlXT1zfWlzUmVsYXRpb25hbCh0KXtyZXR1cm4gdGhpcy5tYXRjaChuLnJlbGF0aW9uYWwpJiZ0aGlzLnN0YXRlLnZhbHVlPT09dH1pc0xvb2thaGVhZFJlbGF0aW9uYWwodCl7Y29uc3QgZT10aGlzLm5leHRUb2tlblN0YXJ0KCk7aWYodGhpcy5pbnB1dC5jaGFyQXQoZSk9PT10KXtpZihlKzE9PT10aGlzLmlucHV0Lmxlbmd0aClyZXR1cm4hMDtjb25zdCBzPXRoaXMuaW5wdXQuY2hhckNvZGVBdChlKzEpO3JldHVybiBzIT09dC5jaGFyQ29kZUF0KDApJiY2MSE9PXN9cmV0dXJuITF9ZXhwZWN0UmVsYXRpb25hbCh0KXt0aGlzLmlzUmVsYXRpb25hbCh0KT90aGlzLm5leHQoKTp0aGlzLnVuZXhwZWN0ZWQobnVsbCxuLnJlbGF0aW9uYWwpfWlzQ29udGV4dHVhbCh0KXtyZXR1cm4gdGhpcy5tYXRjaChuLm5hbWUpJiZ0aGlzLnN0YXRlLnZhbHVlPT09dCYmIXRoaXMuc3RhdGUuY29udGFpbnNFc2N9aXNVbnBhcnNlZENvbnRleHR1YWwodCxlKXtjb25zdCBzPXQrZS5sZW5ndGg7cmV0dXJuIHRoaXMuaW5wdXQuc2xpY2UodCxzKT09PWUmJihzPT09dGhpcy5pbnB1dC5sZW5ndGh8fCFTKHRoaXMuaW5wdXQuY2hhckNvZGVBdChzKSkpfWlzTG9va2FoZWFkQ29udGV4dHVhbCh0KXtjb25zdCBlPXRoaXMubmV4dFRva2VuU3RhcnQoKTtyZXR1cm4gdGhpcy5pc1VucGFyc2VkQ29udGV4dHVhbChlLHQpfWVhdENvbnRleHR1YWwodCl7cmV0dXJuIHRoaXMuaXNDb250ZXh0dWFsKHQpJiZ0aGlzLmVhdChuLm5hbWUpfWV4cGVjdENvbnRleHR1YWwodCxlKXt0aGlzLmVhdENvbnRleHR1YWwodCl8fHRoaXMudW5leHBlY3RlZChudWxsLGUpfWNhbkluc2VydFNlbWljb2xvbigpe3JldHVybiB0aGlzLm1hdGNoKG4uZW9mKXx8dGhpcy5tYXRjaChuLmJyYWNlUil8fHRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCl9aGFzUHJlY2VkaW5nTGluZUJyZWFrKCl7cmV0dXJuIG8udGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMuc3RhdGUubGFzdFRva0VuZCx0aGlzLnN0YXRlLnN0YXJ0KSl9aXNMaW5lVGVybWluYXRvcigpe3JldHVybiB0aGlzLmVhdChuLnNlbWkpfHx0aGlzLmNhbkluc2VydFNlbWljb2xvbigpfXNlbWljb2xvbigpe3RoaXMuaXNMaW5lVGVybWluYXRvcigpfHx0aGlzLnVuZXhwZWN0ZWQobnVsbCxuLnNlbWkpfWV4cGVjdCh0LGUpe3RoaXMuZWF0KHQpfHx0aGlzLnVuZXhwZWN0ZWQoZSx0KX1hc3NlcnROb1NwYWNlKHQ9XCJVbmV4cGVjdGVkIHNwYWNlLlwiKXt0aGlzLnN0YXRlLnN0YXJ0PnRoaXMuc3RhdGUubGFzdFRva0VuZCYmdGhpcy5yYWlzZSh0aGlzLnN0YXRlLmxhc3RUb2tFbmQsdCl9dW5leHBlY3RlZCh0LGU9XCJVbmV4cGVjdGVkIHRva2VuXCIpe3Rocm93XCJzdHJpbmdcIiE9dHlwZW9mIGUmJihlPSdVbmV4cGVjdGVkIHRva2VuLCBleHBlY3RlZCBcIicuY29uY2F0KGUubGFiZWwsJ1wiJykpLHRoaXMucmFpc2UobnVsbCE9dD90OnRoaXMuc3RhdGUuc3RhcnQsZSl9ZXhwZWN0UGx1Z2luKHQsZSl7aWYoIXRoaXMuaGFzUGx1Z2luKHQpKXRocm93IHRoaXMucmFpc2VXaXRoRGF0YShudWxsIT1lP2U6dGhpcy5zdGF0ZS5zdGFydCx7bWlzc2luZ1BsdWdpbjpbdF19LFwiVGhpcyBleHBlcmltZW50YWwgc3ludGF4IHJlcXVpcmVzIGVuYWJsaW5nIHRoZSBwYXJzZXIgcGx1Z2luOiAnXCIuY29uY2F0KHQsXCInXCIpKTtyZXR1cm4hMH1leHBlY3RPbmVQbHVnaW4odCxlKXtpZighdC5zb21lKHQ9PnRoaXMuaGFzUGx1Z2luKHQpKSl0aHJvdyB0aGlzLnJhaXNlV2l0aERhdGEobnVsbCE9ZT9lOnRoaXMuc3RhdGUuc3RhcnQse21pc3NpbmdQbHVnaW46dH0sXCJUaGlzIGV4cGVyaW1lbnRhbCBzeW50YXggcmVxdWlyZXMgZW5hYmxpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyc2VyIHBsdWdpbihzKTogJ1wiLmNvbmNhdCh0LmpvaW4oXCIsIFwiKSxcIidcIikpfWNoZWNrWWllbGRBd2FpdEluRGVmYXVsdFBhcmFtcygpey0xIT09dGhpcy5zdGF0ZS55aWVsZFBvcyYmKC0xPT09dGhpcy5zdGF0ZS5hd2FpdFBvc3x8dGhpcy5zdGF0ZS55aWVsZFBvczx0aGlzLnN0YXRlLmF3YWl0UG9zKSYmdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnlpZWxkUG9zLFwiWWllbGQgY2Fubm90IGJlIHVzZWQgYXMgbmFtZSBpbnNpZGUgYSBnZW5lcmF0b3IgZnVuY3Rpb25cIiksLTEhPT10aGlzLnN0YXRlLmF3YWl0UG9zJiZ0aGlzLnJhaXNlKHRoaXMuc3RhdGUuYXdhaXRQb3MsXCJBd2FpdCBjYW5ub3QgYmUgdXNlZCBhcyBuYW1lIGluc2lkZSBhbiBhc3luYyBmdW5jdGlvblwiKX10cnlQYXJzZSh0LGU9dGhpcy5zdGF0ZS5jbG9uZSgpKXtjb25zdCBzPXtub2RlOm51bGx9O3RyeXtjb25zdCBpPXQoKHQ9bnVsbCk9Pnt0aHJvdyBzLm5vZGU9dCxzfSk7aWYodGhpcy5zdGF0ZS5lcnJvcnMubGVuZ3RoPmUuZXJyb3JzLmxlbmd0aCl7Y29uc3QgdD10aGlzLnN0YXRlO3JldHVybiB0aGlzLnN0YXRlPWUse25vZGU6aSxlcnJvcjp0LmVycm9yc1tlLmVycm9ycy5sZW5ndGhdLHRocm93bjohMSxhYm9ydGVkOiExLGZhaWxTdGF0ZTp0fX1yZXR1cm57bm9kZTppLGVycm9yOm51bGwsdGhyb3duOiExLGFib3J0ZWQ6ITEsZmFpbFN0YXRlOm51bGx9fWNhdGNoKHQpe2NvbnN0IGk9dGhpcy5zdGF0ZTtpZih0aGlzLnN0YXRlPWUsdCBpbnN0YW5jZW9mIFN5bnRheEVycm9yKXJldHVybntub2RlOm51bGwsZXJyb3I6dCx0aHJvd246ITAsYWJvcnRlZDohMSxmYWlsU3RhdGU6aX07aWYodD09PXMpcmV0dXJue25vZGU6cy5ub2RlLGVycm9yOm51bGwsdGhyb3duOiExLGFib3J0ZWQ6ITAsZmFpbFN0YXRlOml9O3Rocm93IHR9fWNoZWNrRXhwcmVzc2lvbkVycm9ycyh0LGUpe2lmKCF0KXJldHVybiExO2NvbnN0e3Nob3J0aGFuZEFzc2lnbjpzLGRvdWJsZVByb3RvOml9PXQ7aWYoIWUpcmV0dXJuIHM+PTB8fGk+PTA7cz49MCYmdGhpcy51bmV4cGVjdGVkKHMpLGk+PTAmJnRoaXMucmFpc2UoaSxmLkR1cGxpY2F0ZVByb3RvKX19e3N0YXJ0Tm9kZSgpe3JldHVybiBuZXcgZ3QodGhpcyx0aGlzLnN0YXRlLnN0YXJ0LHRoaXMuc3RhdGUuc3RhcnRMb2MpfXN0YXJ0Tm9kZUF0KHQsZSl7cmV0dXJuIG5ldyBndCh0aGlzLHQsZSl9c3RhcnROb2RlQXROb2RlKHQpe3JldHVybiB0aGlzLnN0YXJ0Tm9kZUF0KHQuc3RhcnQsdC5sb2Muc3RhcnQpfWZpbmlzaE5vZGUodCxlKXtyZXR1cm4gdGhpcy5maW5pc2hOb2RlQXQodCxlLHRoaXMuc3RhdGUubGFzdFRva0VuZCx0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MpfWZpbmlzaE5vZGVBdCh0LGUscyxpKXtyZXR1cm4gdC50eXBlPWUsdC5lbmQ9cyx0LmxvYy5lbmQ9aSx0aGlzLm9wdGlvbnMucmFuZ2VzJiYodC5yYW5nZVsxXT1zKSx0aGlzLnByb2Nlc3NDb21tZW50KHQpLHR9cmVzZXRTdGFydExvY2F0aW9uKHQsZSxzKXt0LnN0YXJ0PWUsdC5sb2Muc3RhcnQ9cyx0aGlzLm9wdGlvbnMucmFuZ2VzJiYodC5yYW5nZVswXT1lKX1yZXNldEVuZExvY2F0aW9uKHQsZT10aGlzLnN0YXRlLmxhc3RUb2tFbmQscz10aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2Mpe3QuZW5kPWUsdC5sb2MuZW5kPXMsdGhpcy5vcHRpb25zLnJhbmdlcyYmKHQucmFuZ2VbMV09ZSl9cmVzZXRTdGFydExvY2F0aW9uRnJvbU5vZGUodCxlKXt0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbih0LGUuc3RhcnQsZS5sb2Muc3RhcnQpfX17dG9Bc3NpZ25hYmxlKHQpe3ZhciBlLHM7bGV0IGk9dm9pZCAwO3N3aXRjaCgoXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiPT09dC50eXBlfHwobnVsbD09KGU9dC5leHRyYSk/dm9pZCAwOmUucGFyZW50aGVzaXplZCkpJiYoaT1QdCh0KSxcIklkZW50aWZpZXJcIiE9PWkudHlwZSYmXCJNZW1iZXJFeHByZXNzaW9uXCIhPT1pLnR5cGUmJnRoaXMucmFpc2UodC5zdGFydCxmLkludmFsaWRQYXJlbnRoZXNpemVkQXNzaWdubWVudCkpLHQudHlwZSl7Y2FzZVwiSWRlbnRpZmllclwiOmNhc2VcIk9iamVjdFBhdHRlcm5cIjpjYXNlXCJBcnJheVBhdHRlcm5cIjpjYXNlXCJBc3NpZ25tZW50UGF0dGVyblwiOmJyZWFrO2Nhc2VcIk9iamVjdEV4cHJlc3Npb25cIjp0LnR5cGU9XCJPYmplY3RQYXR0ZXJuXCI7Zm9yKGxldCBlPTAscz10LnByb3BlcnRpZXMubGVuZ3RoLGk9cy0xO2U8cztlKyspe3ZhciByO2NvbnN0IHM9dC5wcm9wZXJ0aWVzW2VdLGE9ZT09PWk7dGhpcy50b0Fzc2lnbmFibGVPYmplY3RFeHByZXNzaW9uUHJvcChzLGEpLGEmJlwiUmVzdEVsZW1lbnRcIj09PXMudHlwZSYmKG51bGw9PShyPXQuZXh0cmEpP3ZvaWQgMDpyLnRyYWlsaW5nQ29tbWEpJiZ0aGlzLnJhaXNlUmVzdE5vdExhc3QodC5leHRyYS50cmFpbGluZ0NvbW1hKX1icmVhaztjYXNlXCJPYmplY3RQcm9wZXJ0eVwiOnRoaXMudG9Bc3NpZ25hYmxlKHQudmFsdWUpO2JyZWFrO2Nhc2VcIlNwcmVhZEVsZW1lbnRcIjp7dGhpcy5jaGVja1RvUmVzdENvbnZlcnNpb24odCksdC50eXBlPVwiUmVzdEVsZW1lbnRcIjtjb25zdCBlPXQuYXJndW1lbnQ7dGhpcy50b0Fzc2lnbmFibGUoZSk7YnJlYWt9Y2FzZVwiQXJyYXlFeHByZXNzaW9uXCI6dC50eXBlPVwiQXJyYXlQYXR0ZXJuXCIsdGhpcy50b0Fzc2lnbmFibGVMaXN0KHQuZWxlbWVudHMsbnVsbD09KHM9dC5leHRyYSk/dm9pZCAwOnMudHJhaWxpbmdDb21tYSk7YnJlYWs7Y2FzZVwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcIj1cIiE9PXQub3BlcmF0b3ImJnRoaXMucmFpc2UodC5sZWZ0LmVuZCxmLk1pc3NpbmdFcUluQXNzaWdubWVudCksdC50eXBlPVwiQXNzaWdubWVudFBhdHRlcm5cIixkZWxldGUgdC5vcGVyYXRvcix0aGlzLnRvQXNzaWduYWJsZSh0LmxlZnQpO2JyZWFrO2Nhc2VcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6dGhpcy50b0Fzc2lnbmFibGUoaSl9cmV0dXJuIHR9dG9Bc3NpZ25hYmxlT2JqZWN0RXhwcmVzc2lvblByb3AodCxlKXtpZihcIk9iamVjdE1ldGhvZFwiPT09dC50eXBlKXtjb25zdCBlPVwiZ2V0XCI9PT10LmtpbmR8fFwic2V0XCI9PT10LmtpbmQ/Zi5QYXR0ZXJuSGFzQWNjZXNzb3I6Zi5QYXR0ZXJuSGFzTWV0aG9kO3RoaXMucmFpc2UodC5rZXkuc3RhcnQsZSl9ZWxzZVwiU3ByZWFkRWxlbWVudFwiIT09dC50eXBlfHxlP3RoaXMudG9Bc3NpZ25hYmxlKHQpOnRoaXMucmFpc2VSZXN0Tm90TGFzdCh0LnN0YXJ0KX10b0Fzc2lnbmFibGVMaXN0KHQsZSl7bGV0IHM9dC5sZW5ndGg7aWYocyl7Y29uc3QgaT10W3MtMV07aWYoaSYmXCJSZXN0RWxlbWVudFwiPT09aS50eXBlKS0tcztlbHNlIGlmKGkmJlwiU3ByZWFkRWxlbWVudFwiPT09aS50eXBlKXtpLnR5cGU9XCJSZXN0RWxlbWVudFwiO2NvbnN0IHQ9aS5hcmd1bWVudDt0aGlzLnRvQXNzaWduYWJsZSh0KSxcIklkZW50aWZpZXJcIiE9PXQudHlwZSYmXCJNZW1iZXJFeHByZXNzaW9uXCIhPT10LnR5cGUmJlwiQXJyYXlQYXR0ZXJuXCIhPT10LnR5cGUmJlwiT2JqZWN0UGF0dGVyblwiIT09dC50eXBlJiZ0aGlzLnVuZXhwZWN0ZWQodC5zdGFydCksZSYmdGhpcy5yYWlzZVRyYWlsaW5nQ29tbWFBZnRlclJlc3QoZSksLS1zfX1mb3IobGV0IGU9MDtlPHM7ZSsrKXtjb25zdCBzPXRbZV07cyYmKHRoaXMudG9Bc3NpZ25hYmxlKHMpLFwiUmVzdEVsZW1lbnRcIj09PXMudHlwZSYmdGhpcy5yYWlzZVJlc3ROb3RMYXN0KHMuc3RhcnQpKX1yZXR1cm4gdH10b1JlZmVyZW5jZWRMaXN0KHQsZSl7cmV0dXJuIHR9dG9SZWZlcmVuY2VkTGlzdERlZXAodCxlKXt0aGlzLnRvUmVmZXJlbmNlZExpc3QodCxlKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7Y29uc3Qgcz10W2VdO3MmJlwiQXJyYXlFeHByZXNzaW9uXCI9PT1zLnR5cGUmJnRoaXMudG9SZWZlcmVuY2VkTGlzdERlZXAocy5lbGVtZW50cyl9fXBhcnNlU3ByZWFkKHQsZSl7Y29uc3Qgcz10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLm5leHQoKSxzLmFyZ3VtZW50PXRoaXMucGFyc2VNYXliZUFzc2lnbighMSx0LHZvaWQgMCxlKSx0aGlzLmZpbmlzaE5vZGUocyxcIlNwcmVhZEVsZW1lbnRcIil9cGFyc2VSZXN0QmluZGluZygpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5uZXh0KCksdC5hcmd1bWVudD10aGlzLnBhcnNlQmluZGluZ0F0b20oKSx0aGlzLmZpbmlzaE5vZGUodCxcIlJlc3RFbGVtZW50XCIpfXBhcnNlQmluZGluZ0F0b20oKXtzd2l0Y2godGhpcy5zdGF0ZS50eXBlKXtjYXNlIG4uYnJhY2tldEw6e2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5uZXh0KCksdC5lbGVtZW50cz10aGlzLnBhcnNlQmluZGluZ0xpc3Qobi5icmFja2V0Uiw5MywhMCksdGhpcy5maW5pc2hOb2RlKHQsXCJBcnJheVBhdHRlcm5cIil9Y2FzZSBuLmJyYWNlTDpyZXR1cm4gdGhpcy5wYXJzZU9iaihuLmJyYWNlUiwhMCl9cmV0dXJuIHRoaXMucGFyc2VJZGVudGlmaWVyKCl9cGFyc2VCaW5kaW5nTGlzdCh0LGUscyxpKXtjb25zdCByPVtdO2xldCBhPSEwO2Zvcig7IXRoaXMuZWF0KHQpOylpZihhP2E9ITE6dGhpcy5leHBlY3Qobi5jb21tYSkscyYmdGhpcy5tYXRjaChuLmNvbW1hKSlyLnB1c2gobnVsbCk7ZWxzZXtpZih0aGlzLmVhdCh0KSlicmVhaztpZih0aGlzLm1hdGNoKG4uZWxsaXBzaXMpKXtyLnB1c2godGhpcy5wYXJzZUFzc2lnbmFibGVMaXN0SXRlbVR5cGVzKHRoaXMucGFyc2VSZXN0QmluZGluZygpKSksdGhpcy5jaGVja0NvbW1hQWZ0ZXJSZXN0KGUpLHRoaXMuZXhwZWN0KHQpO2JyZWFrfXtjb25zdCB0PVtdO2Zvcih0aGlzLm1hdGNoKG4uYXQpJiZ0aGlzLmhhc1BsdWdpbihcImRlY29yYXRvcnNcIikmJnRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLlVuc3VwcG9ydGVkUGFyYW1ldGVyRGVjb3JhdG9yKTt0aGlzLm1hdGNoKG4uYXQpOyl0LnB1c2godGhpcy5wYXJzZURlY29yYXRvcigpKTtyLnB1c2godGhpcy5wYXJzZUFzc2lnbmFibGVMaXN0SXRlbShpLHQpKX19cmV0dXJuIHJ9cGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW0odCxlKXtjb25zdCBzPXRoaXMucGFyc2VNYXliZURlZmF1bHQoKTt0aGlzLnBhcnNlQXNzaWduYWJsZUxpc3RJdGVtVHlwZXMocyk7Y29uc3QgaT10aGlzLnBhcnNlTWF5YmVEZWZhdWx0KHMuc3RhcnQscy5sb2Muc3RhcnQscyk7cmV0dXJuIGUubGVuZ3RoJiYocy5kZWNvcmF0b3JzPWUpLGl9cGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW1UeXBlcyh0KXtyZXR1cm4gdH1wYXJzZU1heWJlRGVmYXVsdCh0LGUscyl7aWYoZT1lfHx0aGlzLnN0YXRlLnN0YXJ0TG9jLHQ9dHx8dGhpcy5zdGF0ZS5zdGFydCxzPXN8fHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpLCF0aGlzLmVhdChuLmVxKSlyZXR1cm4gcztjb25zdCBpPXRoaXMuc3RhcnROb2RlQXQodCxlKTtyZXR1cm4gaS5sZWZ0PXMsaS5yaWdodD10aGlzLnBhcnNlTWF5YmVBc3NpZ24oKSx0aGlzLmZpbmlzaE5vZGUoaSxcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpfWNoZWNrTFZhbCh0LGU9NjQscyxpLHIsYT0hMSl7c3dpdGNoKHQudHlwZSl7Y2FzZVwiSWRlbnRpZmllclwiOmlmKHRoaXMuc3RhdGUuc3RyaWN0JiYoYT9PKHQubmFtZSx0aGlzLmluTW9kdWxlKTpNKHQubmFtZSkpJiZ0aGlzLnJhaXNlKHQuc3RhcnQsNjQ9PT1lP2YuU3RyaWN0RXZhbEFyZ3VtZW50czpmLlN0cmljdEV2YWxBcmd1bWVudHNCaW5kaW5nLHQubmFtZSkscyl7Y29uc3QgZT1cIl9cIi5jb25jYXQodC5uYW1lKTtzW2VdP3RoaXMucmFpc2UodC5zdGFydCxmLlBhcmFtRHVwZSk6c1tlXT0hMH1yJiZcImxldFwiPT09dC5uYW1lJiZ0aGlzLnJhaXNlKHQuc3RhcnQsZi5MZXRJbkxleGljYWxCaW5kaW5nKSw2NCZlfHx0aGlzLnNjb3BlLmRlY2xhcmVOYW1lKHQubmFtZSxlLHQuc3RhcnQpO2JyZWFrO2Nhc2VcIk1lbWJlckV4cHJlc3Npb25cIjo2NCE9PWUmJnRoaXMucmFpc2UodC5zdGFydCxmLkludmFsaWRQcm9wZXJ0eUJpbmRpbmdQYXR0ZXJuKTticmVhaztjYXNlXCJPYmplY3RQYXR0ZXJuXCI6Zm9yKGxldCBpPTAsYT10LnByb3BlcnRpZXM7aTxhLmxlbmd0aDtpKyspe2xldCB0PWFbaV07aWYoXCJPYmplY3RQcm9wZXJ0eVwiPT09dC50eXBlKXQ9dC52YWx1ZTtlbHNlIGlmKFwiT2JqZWN0TWV0aG9kXCI9PT10LnR5cGUpY29udGludWU7dGhpcy5jaGVja0xWYWwodCxlLHMsXCJvYmplY3QgZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuXCIscil9YnJlYWs7Y2FzZVwiQXJyYXlQYXR0ZXJuXCI6Zm9yKGxldCBpPTAsYT10LmVsZW1lbnRzO2k8YS5sZW5ndGg7aSsrKXtjb25zdCB0PWFbaV07dCYmdGhpcy5jaGVja0xWYWwodCxlLHMsXCJhcnJheSBkZXN0cnVjdHVyaW5nIHBhdHRlcm5cIixyKX1icmVhaztjYXNlXCJBc3NpZ25tZW50UGF0dGVyblwiOnRoaXMuY2hlY2tMVmFsKHQubGVmdCxlLHMsXCJhc3NpZ25tZW50IHBhdHRlcm5cIik7YnJlYWs7Y2FzZVwiUmVzdEVsZW1lbnRcIjp0aGlzLmNoZWNrTFZhbCh0LmFyZ3VtZW50LGUscyxcInJlc3QgZWxlbWVudFwiKTticmVhaztjYXNlXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiOnRoaXMuY2hlY2tMVmFsKHQuZXhwcmVzc2lvbixlLHMsXCJwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25cIik7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhaXNlKHQuc3RhcnQsNjQ9PT1lP2YuSW52YWxpZExoczpmLkludmFsaWRMaHNCaW5kaW5nLGkpfX1jaGVja1RvUmVzdENvbnZlcnNpb24odCl7XCJJZGVudGlmaWVyXCIhPT10LmFyZ3VtZW50LnR5cGUmJlwiTWVtYmVyRXhwcmVzc2lvblwiIT09dC5hcmd1bWVudC50eXBlJiZ0aGlzLnJhaXNlKHQuYXJndW1lbnQuc3RhcnQsZi5JbnZhbGlkUmVzdEFzc2lnbm1lbnRQYXR0ZXJuKX1jaGVja0NvbW1hQWZ0ZXJSZXN0KHQpe3RoaXMubWF0Y2gobi5jb21tYSkmJih0aGlzLmxvb2thaGVhZENoYXJDb2RlKCk9PT10P3RoaXMucmFpc2VUcmFpbGluZ0NvbW1hQWZ0ZXJSZXN0KHRoaXMuc3RhdGUuc3RhcnQpOnRoaXMucmFpc2VSZXN0Tm90TGFzdCh0aGlzLnN0YXRlLnN0YXJ0KSl9cmFpc2VSZXN0Tm90TGFzdCh0KXt0aHJvdyB0aGlzLnJhaXNlKHQsZi5FbGVtZW50QWZ0ZXJSZXN0KX1yYWlzZVRyYWlsaW5nQ29tbWFBZnRlclJlc3QodCl7dGhpcy5yYWlzZSh0LGYuUmVzdFRyYWlsaW5nQ29tbWEpfX17Y2hlY2tEdXBsaWNhdGVkUHJvdG8odCxlLHMpe2lmKFwiU3ByZWFkRWxlbWVudFwiPT09dC50eXBlfHx0LmNvbXB1dGVkfHx0LmtpbmR8fHQuc2hvcnRoYW5kKXJldHVybjtjb25zdCBpPXQua2V5O1wiX19wcm90b19fXCI9PT0oXCJJZGVudGlmaWVyXCI9PT1pLnR5cGU/aS5uYW1lOlN0cmluZyhpLnZhbHVlKSkmJihlLnVzZWQmJihzPy0xPT09cy5kb3VibGVQcm90byYmKHMuZG91YmxlUHJvdG89aS5zdGFydCk6dGhpcy5yYWlzZShpLnN0YXJ0LGYuRHVwbGljYXRlUHJvdG8pKSxlLnVzZWQ9ITApfWdldEV4cHJlc3Npb24oKXtsZXQgdD0wO3RoaXMuaGFzUGx1Z2luKFwidG9wTGV2ZWxBd2FpdFwiKSYmdGhpcy5pbk1vZHVsZSYmKHR8PTIpLHRoaXMuc2NvcGUuZW50ZXIoMSksdGhpcy5wcm9kUGFyYW0uZW50ZXIodCksdGhpcy5uZXh0VG9rZW4oKTtjb25zdCBlPXRoaXMucGFyc2VFeHByZXNzaW9uKCk7cmV0dXJuIHRoaXMubWF0Y2gobi5lb2YpfHx0aGlzLnVuZXhwZWN0ZWQoKSxlLmNvbW1lbnRzPXRoaXMuc3RhdGUuY29tbWVudHMsZS5lcnJvcnM9dGhpcy5zdGF0ZS5lcnJvcnMsZX1wYXJzZUV4cHJlc3Npb24odCxlKXtjb25zdCBzPXRoaXMuc3RhdGUuc3RhcnQsaT10aGlzLnN0YXRlLnN0YXJ0TG9jLHI9dGhpcy5wYXJzZU1heWJlQXNzaWduKHQsZSk7aWYodGhpcy5tYXRjaChuLmNvbW1hKSl7Y29uc3QgYT10aGlzLnN0YXJ0Tm9kZUF0KHMsaSk7Zm9yKGEuZXhwcmVzc2lvbnM9W3JdO3RoaXMuZWF0KG4uY29tbWEpOylhLmV4cHJlc3Npb25zLnB1c2godGhpcy5wYXJzZU1heWJlQXNzaWduKHQsZSkpO3JldHVybiB0aGlzLnRvUmVmZXJlbmNlZExpc3QoYS5leHByZXNzaW9ucyksdGhpcy5maW5pc2hOb2RlKGEsXCJTZXF1ZW5jZUV4cHJlc3Npb25cIil9cmV0dXJuIHJ9cGFyc2VNYXliZUFzc2lnbih0LGUscyxpKXtjb25zdCByPXRoaXMuc3RhdGUuc3RhcnQsYT10aGlzLnN0YXRlLnN0YXJ0TG9jO2lmKHRoaXMuaXNDb250ZXh0dWFsKFwieWllbGRcIikpe2lmKHRoaXMucHJvZFBhcmFtLmhhc1lpZWxkKXtsZXQgZT10aGlzLnBhcnNlWWllbGQodCk7cmV0dXJuIHMmJihlPXMuY2FsbCh0aGlzLGUscixhKSksZX10aGlzLnN0YXRlLmV4cHJBbGxvd2VkPSExfWxldCBvO2U/bz0hMTooZT1uZXcgeHQsbz0hMCksKHRoaXMubWF0Y2gobi5wYXJlbkwpfHx0aGlzLm1hdGNoKG4ubmFtZSkpJiYodGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0PXRoaXMuc3RhdGUuc3RhcnQpO2xldCBoPXRoaXMucGFyc2VNYXliZUNvbmRpdGlvbmFsKHQsZSxpKTtpZihzJiYoaD1zLmNhbGwodGhpcyxoLHIsYSkpLHRoaXMuc3RhdGUudHlwZS5pc0Fzc2lnbil7Y29uc3Qgcz10aGlzLnN0YXJ0Tm9kZUF0KHIsYSksaT10aGlzLnN0YXRlLnZhbHVlO3JldHVybiBzLm9wZXJhdG9yPWksXCI/Pz1cIj09PWkmJnRoaXMuZXhwZWN0UGx1Z2luKFwibG9naWNhbEFzc2lnbm1lbnRcIiksXCJ8fD1cIiE9PWkmJlwiJiY9XCIhPT1pfHx0aGlzLmV4cGVjdFBsdWdpbihcImxvZ2ljYWxBc3NpZ25tZW50XCIpLHRoaXMubWF0Y2gobi5lcSk/KHMubGVmdD10aGlzLnRvQXNzaWduYWJsZShoKSxlLmRvdWJsZVByb3RvPS0xKTpzLmxlZnQ9aCxlLnNob3J0aGFuZEFzc2lnbj49cy5sZWZ0LnN0YXJ0JiYoZS5zaG9ydGhhbmRBc3NpZ249LTEpLHRoaXMuY2hlY2tMVmFsKGgsdm9pZCAwLHZvaWQgMCxcImFzc2lnbm1lbnQgZXhwcmVzc2lvblwiKSx0aGlzLm5leHQoKSxzLnJpZ2h0PXRoaXMucGFyc2VNYXliZUFzc2lnbih0KSx0aGlzLmZpbmlzaE5vZGUocyxcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIpfXJldHVybiBvJiZ0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhlLCEwKSxofXBhcnNlTWF5YmVDb25kaXRpb25hbCh0LGUscyl7Y29uc3QgaT10aGlzLnN0YXRlLnN0YXJ0LHI9dGhpcy5zdGF0ZS5zdGFydExvYyxhPXRoaXMuc3RhdGUucG90ZW50aWFsQXJyb3dBdCxuPXRoaXMucGFyc2VFeHByT3BzKHQsZSk7cmV0dXJuXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiPT09bi50eXBlJiZuLnN0YXJ0PT09YT9uOnRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKGUsITEpP246dGhpcy5wYXJzZUNvbmRpdGlvbmFsKG4sdCxpLHIscyl9cGFyc2VDb25kaXRpb25hbCh0LGUscyxpLHIpe2lmKHRoaXMuZWF0KG4ucXVlc3Rpb24pKXtjb25zdCByPXRoaXMuc3RhcnROb2RlQXQocyxpKTtyZXR1cm4gci50ZXN0PXQsci5jb25zZXF1ZW50PXRoaXMucGFyc2VNYXliZUFzc2lnbigpLHRoaXMuZXhwZWN0KG4uY29sb24pLHIuYWx0ZXJuYXRlPXRoaXMucGFyc2VNYXliZUFzc2lnbihlKSx0aGlzLmZpbmlzaE5vZGUocixcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKX1yZXR1cm4gdH1wYXJzZUV4cHJPcHModCxlKXtjb25zdCBzPXRoaXMuc3RhdGUuc3RhcnQsaT10aGlzLnN0YXRlLnN0YXJ0TG9jLHI9dGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0LGE9dGhpcy5wYXJzZU1heWJlVW5hcnkoZSk7cmV0dXJuXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiPT09YS50eXBlJiZhLnN0YXJ0PT09cj9hOnRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKGUsITEpP2E6dGhpcy5wYXJzZUV4cHJPcChhLHMsaSwtMSx0KX1wYXJzZUV4cHJPcCh0LGUscyxpLHIpe2xldCBhPXRoaXMuc3RhdGUudHlwZS5iaW5vcDtpZighKG51bGw9PWF8fHImJnRoaXMubWF0Y2gobi5faW4pKSYmYT5pKXtjb25zdCBvPXRoaXMuc3RhdGUudmFsdWU7aWYoXCJ8PlwiPT09byYmdGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keSlyZXR1cm4gdDtjb25zdCBoPXRoaXMuc3RhcnROb2RlQXQoZSxzKTtoLmxlZnQ9dCxoLm9wZXJhdG9yPW8sXCIqKlwiIT09b3x8XCJVbmFyeUV4cHJlc3Npb25cIiE9PXQudHlwZXx8IXRoaXMub3B0aW9ucy5jcmVhdGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbnMmJnQuZXh0cmEmJnQuZXh0cmEucGFyZW50aGVzaXplZHx8dGhpcy5yYWlzZSh0LmFyZ3VtZW50LnN0YXJ0LGYuVW5leHBlY3RlZFRva2VuVW5hcnlFeHBvbmVudGlhdGlvbik7Y29uc3QgcD10aGlzLnN0YXRlLnR5cGUsYz1wPT09bi5sb2dpY2FsT1J8fHA9PT1uLmxvZ2ljYWxBTkQsdT1wPT09bi5udWxsaXNoQ29hbGVzY2luZztpZihwPT09bi5waXBlbGluZT8odGhpcy5leHBlY3RQbHVnaW4oXCJwaXBlbGluZU9wZXJhdG9yXCIpLHRoaXMuc3RhdGUuaW5QaXBlbGluZT0hMCx0aGlzLmNoZWNrUGlwZWxpbmVBdEluZml4T3BlcmF0b3IodCxlKSk6dSYmKGE9bi5sb2dpY2FsQU5ELmJpbm9wKSx0aGlzLm5leHQoKSxwPT09bi5waXBlbGluZSYmXCJtaW5pbWFsXCI9PT10aGlzLmdldFBsdWdpbk9wdGlvbihcInBpcGVsaW5lT3BlcmF0b3JcIixcInByb3Bvc2FsXCIpJiZ0aGlzLm1hdGNoKG4ubmFtZSkmJlwiYXdhaXRcIj09PXRoaXMuc3RhdGUudmFsdWUmJnRoaXMucHJvZFBhcmFtLmhhc0F3YWl0KXRocm93IHRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLlVuZXhwZWN0ZWRBd2FpdEFmdGVyUGlwZWxpbmVCb2R5KTtoLnJpZ2h0PXRoaXMucGFyc2VFeHByT3BSaWdodEV4cHIocCxhLHIpLHRoaXMuZmluaXNoTm9kZShoLGN8fHU/XCJMb2dpY2FsRXhwcmVzc2lvblwiOlwiQmluYXJ5RXhwcmVzc2lvblwiKTtjb25zdCBsPXRoaXMuc3RhdGUudHlwZTtpZih1JiYobD09PW4ubG9naWNhbE9SfHxsPT09bi5sb2dpY2FsQU5EKXx8YyYmbD09PW4ubnVsbGlzaENvYWxlc2NpbmcpdGhyb3cgdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LGYuTWl4aW5nQ29hbGVzY2VXaXRoTG9naWNhbCk7cmV0dXJuIHRoaXMucGFyc2VFeHByT3AoaCxlLHMsaSxyKX1yZXR1cm4gdH1wYXJzZUV4cHJPcFJpZ2h0RXhwcih0LGUscyl7Y29uc3QgaT10aGlzLnN0YXRlLnN0YXJ0LHI9dGhpcy5zdGF0ZS5zdGFydExvYztzd2l0Y2godCl7Y2FzZSBuLnBpcGVsaW5lOnN3aXRjaCh0aGlzLmdldFBsdWdpbk9wdGlvbihcInBpcGVsaW5lT3BlcmF0b3JcIixcInByb3Bvc2FsXCIpKXtjYXNlXCJzbWFydFwiOnJldHVybiB0aGlzLndpdGhUb3BpY1Blcm1pdHRpbmdDb250ZXh0KCgpPT50aGlzLnBhcnNlU21hcnRQaXBlbGluZUJvZHkodGhpcy5wYXJzZUV4cHJPcEJhc2VSaWdodEV4cHIodCxlLHMpLGkscikpO2Nhc2VcImZzaGFycFwiOnJldHVybiB0aGlzLndpdGhTb2xvQXdhaXRQZXJtaXR0aW5nQ29udGV4dCgoKT0+dGhpcy5wYXJzZUZTaGFycFBpcGVsaW5lQm9keShlLHMpKX1kZWZhdWx0OnJldHVybiB0aGlzLnBhcnNlRXhwck9wQmFzZVJpZ2h0RXhwcih0LGUscyl9fXBhcnNlRXhwck9wQmFzZVJpZ2h0RXhwcih0LGUscyl7Y29uc3QgaT10aGlzLnN0YXRlLnN0YXJ0LHI9dGhpcy5zdGF0ZS5zdGFydExvYztyZXR1cm4gdGhpcy5wYXJzZUV4cHJPcCh0aGlzLnBhcnNlTWF5YmVVbmFyeSgpLGkscix0LnJpZ2h0QXNzb2NpYXRpdmU/ZS0xOmUscyl9cGFyc2VNYXliZVVuYXJ5KHQpe2lmKHRoaXMuaXNDb250ZXh0dWFsKFwiYXdhaXRcIikmJnRoaXMuaXNBd2FpdEFsbG93ZWQoKSlyZXR1cm4gdGhpcy5wYXJzZUF3YWl0KCk7aWYodGhpcy5zdGF0ZS50eXBlLnByZWZpeCl7Y29uc3QgZT10aGlzLnN0YXJ0Tm9kZSgpLHM9dGhpcy5tYXRjaChuLmluY0RlYyk7aWYoZS5vcGVyYXRvcj10aGlzLnN0YXRlLnZhbHVlLGUucHJlZml4PSEwLFwidGhyb3dcIj09PWUub3BlcmF0b3ImJnRoaXMuZXhwZWN0UGx1Z2luKFwidGhyb3dFeHByZXNzaW9uc1wiKSx0aGlzLm5leHQoKSxlLmFyZ3VtZW50PXRoaXMucGFyc2VNYXliZVVuYXJ5KCksdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnModCwhMCkscyl0aGlzLmNoZWNrTFZhbChlLmFyZ3VtZW50LHZvaWQgMCx2b2lkIDAsXCJwcmVmaXggb3BlcmF0aW9uXCIpO2Vsc2UgaWYodGhpcy5zdGF0ZS5zdHJpY3QmJlwiZGVsZXRlXCI9PT1lLm9wZXJhdG9yKXtjb25zdCB0PWUuYXJndW1lbnQ7XCJJZGVudGlmaWVyXCI9PT10LnR5cGU/dGhpcy5yYWlzZShlLnN0YXJ0LGYuU3RyaWN0RGVsZXRlKTpcIk1lbWJlckV4cHJlc3Npb25cIj09PXQudHlwZSYmXCJQcml2YXRlTmFtZVwiPT09dC5wcm9wZXJ0eS50eXBlJiZ0aGlzLnJhaXNlKGUuc3RhcnQsZi5EZWxldGVQcml2YXRlRmllbGQpfXJldHVybiB0aGlzLmZpbmlzaE5vZGUoZSxzP1wiVXBkYXRlRXhwcmVzc2lvblwiOlwiVW5hcnlFeHByZXNzaW9uXCIpfWNvbnN0IGU9dGhpcy5zdGF0ZS5zdGFydCxzPXRoaXMuc3RhdGUuc3RhcnRMb2M7bGV0IGk9dGhpcy5wYXJzZUV4cHJTdWJzY3JpcHRzKHQpO2lmKHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHQsITEpKXJldHVybiBpO2Zvcig7dGhpcy5zdGF0ZS50eXBlLnBvc3RmaXgmJiF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpOyl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZUF0KGUscyk7dC5vcGVyYXRvcj10aGlzLnN0YXRlLnZhbHVlLHQucHJlZml4PSExLHQuYXJndW1lbnQ9aSx0aGlzLmNoZWNrTFZhbChpLHZvaWQgMCx2b2lkIDAsXCJwb3N0Zml4IG9wZXJhdGlvblwiKSx0aGlzLm5leHQoKSxpPXRoaXMuZmluaXNoTm9kZSh0LFwiVXBkYXRlRXhwcmVzc2lvblwiKX1yZXR1cm4gaX1wYXJzZUV4cHJTdWJzY3JpcHRzKHQpe2NvbnN0IGU9dGhpcy5zdGF0ZS5zdGFydCxzPXRoaXMuc3RhdGUuc3RhcnRMb2MsaT10aGlzLnN0YXRlLnBvdGVudGlhbEFycm93QXQscj10aGlzLnBhcnNlRXhwckF0b20odCk7cmV0dXJuXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiPT09ci50eXBlJiZyLnN0YXJ0PT09aT9yOnRoaXMucGFyc2VTdWJzY3JpcHRzKHIsZSxzKX1wYXJzZVN1YnNjcmlwdHModCxlLHMsaSl7Y29uc3Qgcj17b3B0aW9uYWxDaGFpbk1lbWJlcjohMSxtYXliZUFzeW5jQXJyb3c6dGhpcy5hdFBvc3NpYmxlQXN5bmNBcnJvdyh0KSxzdG9wOiExfTtkb3tjb25zdCBhPXRoaXMuc3RhdGUubWF5YmVJbkFzeW5jQXJyb3dIZWFkO3IubWF5YmVBc3luY0Fycm93JiYodGhpcy5zdGF0ZS5tYXliZUluQXN5bmNBcnJvd0hlYWQ9ITApLHQ9dGhpcy5wYXJzZVN1YnNjcmlwdCh0LGUscyxpLHIpLHIubWF5YmVBc3luY0Fycm93PSExLHRoaXMuc3RhdGUubWF5YmVJbkFzeW5jQXJyb3dIZWFkPWF9d2hpbGUoIXIuc3RvcCk7cmV0dXJuIHR9cGFyc2VTdWJzY3JpcHQodCxlLHMsaSxyKXtpZighaSYmdGhpcy5lYXQobi5kb3VibGVDb2xvbikpe2NvbnN0IGE9dGhpcy5zdGFydE5vZGVBdChlLHMpO3JldHVybiBhLm9iamVjdD10LGEuY2FsbGVlPXRoaXMucGFyc2VOb0NhbGxFeHByKCksci5zdG9wPSEwLHRoaXMucGFyc2VTdWJzY3JpcHRzKHRoaXMuZmluaXNoTm9kZShhLFwiQmluZEV4cHJlc3Npb25cIiksZSxzLGkpfWxldCBhPSExO2lmKHRoaXMubWF0Y2gobi5xdWVzdGlvbkRvdCkpe2lmKHIub3B0aW9uYWxDaGFpbk1lbWJlcj1hPSEwLGkmJjQwPT09dGhpcy5sb29rYWhlYWRDaGFyQ29kZSgpKXJldHVybiByLnN0b3A9ITAsdDt0aGlzLm5leHQoKX1jb25zdCBvPXRoaXMuZWF0KG4uYnJhY2tldEwpO2lmKGEmJiF0aGlzLm1hdGNoKG4ucGFyZW5MKSYmIXRoaXMubWF0Y2gobi5iYWNrUXVvdGUpfHxvfHx0aGlzLmVhdChuLmRvdCkpe2NvbnN0IGk9dGhpcy5zdGFydE5vZGVBdChlLHMpO3JldHVybiBpLm9iamVjdD10LGkucHJvcGVydHk9bz90aGlzLnBhcnNlRXhwcmVzc2lvbigpOmE/dGhpcy5wYXJzZUlkZW50aWZpZXIoITApOnRoaXMucGFyc2VNYXliZVByaXZhdGVOYW1lKCEwKSxpLmNvbXB1dGVkPW8sXCJQcml2YXRlTmFtZVwiPT09aS5wcm9wZXJ0eS50eXBlJiYoXCJTdXBlclwiPT09aS5vYmplY3QudHlwZSYmdGhpcy5yYWlzZShlLGYuU3VwZXJQcml2YXRlRmllbGQpLHRoaXMuY2xhc3NTY29wZS51c2VQcml2YXRlTmFtZShpLnByb3BlcnR5LmlkLm5hbWUsaS5wcm9wZXJ0eS5zdGFydCkpLG8mJnRoaXMuZXhwZWN0KG4uYnJhY2tldFIpLHIub3B0aW9uYWxDaGFpbk1lbWJlcj8oaS5vcHRpb25hbD1hLHRoaXMuZmluaXNoTm9kZShpLFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIpKTp0aGlzLmZpbmlzaE5vZGUoaSxcIk1lbWJlckV4cHJlc3Npb25cIil9aWYoIWkmJnRoaXMubWF0Y2gobi5wYXJlbkwpKXtjb25zdCBpPXRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycyxvPXRoaXMuc3RhdGUueWllbGRQb3MsaD10aGlzLnN0YXRlLmF3YWl0UG9zO3RoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycz0hMCx0aGlzLnN0YXRlLnlpZWxkUG9zPS0xLHRoaXMuc3RhdGUuYXdhaXRQb3M9LTEsdGhpcy5uZXh0KCk7bGV0IHA9dGhpcy5zdGFydE5vZGVBdChlLHMpO3JldHVybiBwLmNhbGxlZT10LGE/KHAub3B0aW9uYWw9ITAscC5hcmd1bWVudHM9dGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKG4ucGFyZW5SLCExKSk6cC5hcmd1bWVudHM9dGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKG4ucGFyZW5SLHIubWF5YmVBc3luY0Fycm93LFwiSW1wb3J0XCI9PT10LnR5cGUsXCJTdXBlclwiIT09dC50eXBlLHApLHRoaXMuZmluaXNoQ2FsbEV4cHJlc3Npb24ocCxyLm9wdGlvbmFsQ2hhaW5NZW1iZXIpLHIubWF5YmVBc3luY0Fycm93JiZ0aGlzLnNob3VsZFBhcnNlQXN5bmNBcnJvdygpJiYhYT8oci5zdG9wPSEwLHA9dGhpcy5wYXJzZUFzeW5jQXJyb3dGcm9tQ2FsbEV4cHJlc3Npb24odGhpcy5zdGFydE5vZGVBdChlLHMpLHApLHRoaXMuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCksdGhpcy5zdGF0ZS55aWVsZFBvcz1vLHRoaXMuc3RhdGUuYXdhaXRQb3M9aCk6KHRoaXMudG9SZWZlcmVuY2VkTGlzdERlZXAocC5hcmd1bWVudHMpLC0xIT09byYmKHRoaXMuc3RhdGUueWllbGRQb3M9byksKHRoaXMuaXNBd2FpdEFsbG93ZWQoKXx8aSkmJi0xPT09aHx8KHRoaXMuc3RhdGUuYXdhaXRQb3M9aCkpLHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycz1pLHB9cmV0dXJuIHRoaXMubWF0Y2gobi5iYWNrUXVvdGUpP3RoaXMucGFyc2VUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24oZSxzLHQscik6KHIuc3RvcD0hMCx0KX1wYXJzZVRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbih0LGUscyxpLHIpe2NvbnN0IGE9dGhpcy5zdGFydE5vZGVBdCh0LGUpO3JldHVybiBhLnRhZz1zLGEucXVhc2k9dGhpcy5wYXJzZVRlbXBsYXRlKCEwKSxyJiYoYS50eXBlUGFyYW1ldGVycz1yKSxpLm9wdGlvbmFsQ2hhaW5NZW1iZXImJnRoaXMucmFpc2UodCxmLk9wdGlvbmFsQ2hhaW5pbmdOb1RlbXBsYXRlKSx0aGlzLmZpbmlzaE5vZGUoYSxcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiKX1hdFBvc3NpYmxlQXN5bmNBcnJvdyh0KXtyZXR1cm5cIklkZW50aWZpZXJcIj09PXQudHlwZSYmXCJhc3luY1wiPT09dC5uYW1lJiZ0aGlzLnN0YXRlLmxhc3RUb2tFbmQ9PT10LmVuZCYmIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkmJnQuZW5kLXQuc3RhcnQ9PTUmJnQuc3RhcnQ9PT10aGlzLnN0YXRlLnBvdGVudGlhbEFycm93QXR9ZmluaXNoQ2FsbEV4cHJlc3Npb24odCxlKXtpZihcIkltcG9ydFwiPT09dC5jYWxsZWUudHlwZSlpZigxIT09dC5hcmd1bWVudHMubGVuZ3RoKXRoaXMucmFpc2UodC5zdGFydCxmLkltcG9ydENhbGxBcml0eSk7ZWxzZXtjb25zdCBlPXQuYXJndW1lbnRzWzBdO2UmJlwiU3ByZWFkRWxlbWVudFwiPT09ZS50eXBlJiZ0aGlzLnJhaXNlKGUuc3RhcnQsZi5JbXBvcnRDYWxsU3ByZWFkQXJndW1lbnQpfXJldHVybiB0aGlzLmZpbmlzaE5vZGUodCxlP1wiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiOlwiQ2FsbEV4cHJlc3Npb25cIil9cGFyc2VDYWxsRXhwcmVzc2lvbkFyZ3VtZW50cyh0LGUscyxpLHIpe2NvbnN0IGE9W107bGV0IG8saD0hMDtjb25zdCBwPXRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7Zm9yKHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk9ITE7IXRoaXMuZWF0KHQpOyl7aWYoaCloPSExO2Vsc2UgaWYodGhpcy5leHBlY3Qobi5jb21tYSksdGhpcy5tYXRjaCh0KSl7cyYmdGhpcy5yYWlzZSh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCxmLkltcG9ydENhbGxBcmd1bWVudFRyYWlsaW5nQ29tbWEpLHImJnRoaXMuYWRkRXh0cmEocixcInRyYWlsaW5nQ29tbWFcIix0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCksdGhpcy5uZXh0KCk7YnJlYWt9dGhpcy5tYXRjaChuLnBhcmVuTCkmJiFvJiYobz10aGlzLnN0YXRlLnN0YXJ0KSxhLnB1c2godGhpcy5wYXJzZUV4cHJMaXN0SXRlbSghMSxlP25ldyB4dDp2b2lkIDAsZT97c3RhcnQ6MH06dm9pZCAwLGkpKX1yZXR1cm4gZSYmbyYmdGhpcy5zaG91bGRQYXJzZUFzeW5jQXJyb3coKSYmdGhpcy51bmV4cGVjdGVkKCksdGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keT1wLGF9c2hvdWxkUGFyc2VBc3luY0Fycm93KCl7cmV0dXJuIHRoaXMubWF0Y2gobi5hcnJvdykmJiF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpfXBhcnNlQXN5bmNBcnJvd0Zyb21DYWxsRXhwcmVzc2lvbih0LGUpe3ZhciBzO3JldHVybiB0aGlzLmV4cGVjdChuLmFycm93KSx0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKHQsZS5hcmd1bWVudHMsITAsbnVsbD09KHM9ZS5leHRyYSk/dm9pZCAwOnMudHJhaWxpbmdDb21tYSksdH1wYXJzZU5vQ2FsbEV4cHIoKXtjb25zdCB0PXRoaXMuc3RhdGUuc3RhcnQsZT10aGlzLnN0YXRlLnN0YXJ0TG9jO3JldHVybiB0aGlzLnBhcnNlU3Vic2NyaXB0cyh0aGlzLnBhcnNlRXhwckF0b20oKSx0LGUsITApfXBhcnNlRXhwckF0b20odCl7dGhpcy5zdGF0ZS50eXBlPT09bi5zbGFzaCYmdGhpcy5yZWFkUmVnZXhwKCk7Y29uc3QgZT10aGlzLnN0YXRlLnBvdGVudGlhbEFycm93QXQ9PT10aGlzLnN0YXRlLnN0YXJ0O2xldCBzO3N3aXRjaCh0aGlzLnN0YXRlLnR5cGUpe2Nhc2Ugbi5fc3VwZXI6cmV0dXJuIHM9dGhpcy5zdGFydE5vZGUoKSx0aGlzLm5leHQoKSwhdGhpcy5tYXRjaChuLnBhcmVuTCl8fHRoaXMuc2NvcGUuYWxsb3dEaXJlY3RTdXBlcnx8dGhpcy5vcHRpb25zLmFsbG93U3VwZXJPdXRzaWRlTWV0aG9kP3RoaXMuc2NvcGUuYWxsb3dTdXBlcnx8dGhpcy5vcHRpb25zLmFsbG93U3VwZXJPdXRzaWRlTWV0aG9kfHx0aGlzLnJhaXNlKHMuc3RhcnQsZi5VbmV4cGVjdGVkU3VwZXIpOnRoaXMucmFpc2Uocy5zdGFydCxmLlN1cGVyTm90QWxsb3dlZCksdGhpcy5tYXRjaChuLnBhcmVuTCl8fHRoaXMubWF0Y2gobi5icmFja2V0TCl8fHRoaXMubWF0Y2gobi5kb3QpfHx0aGlzLnJhaXNlKHMuc3RhcnQsZi5VbnN1cHBvcnRlZFN1cGVyKSx0aGlzLmZpbmlzaE5vZGUocyxcIlN1cGVyXCIpO2Nhc2Ugbi5faW1wb3J0OnJldHVybiBzPXRoaXMuc3RhcnROb2RlKCksdGhpcy5uZXh0KCksdGhpcy5tYXRjaChuLmRvdCk/dGhpcy5wYXJzZUltcG9ydE1ldGFQcm9wZXJ0eShzKToodGhpcy5tYXRjaChuLnBhcmVuTCl8fHRoaXMucmFpc2UodGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnQsZi5VbnN1cHBvcnRlZEltcG9ydCksdGhpcy5maW5pc2hOb2RlKHMsXCJJbXBvcnRcIikpO2Nhc2Ugbi5fdGhpczpyZXR1cm4gcz10aGlzLnN0YXJ0Tm9kZSgpLHRoaXMubmV4dCgpLHRoaXMuZmluaXNoTm9kZShzLFwiVGhpc0V4cHJlc3Npb25cIik7Y2FzZSBuLm5hbWU6e3M9dGhpcy5zdGFydE5vZGUoKTtjb25zdCB0PXRoaXMuc3RhdGUuY29udGFpbnNFc2MsaT10aGlzLnBhcnNlSWRlbnRpZmllcigpO2lmKCF0JiZcImFzeW5jXCI9PT1pLm5hbWUmJnRoaXMubWF0Y2gobi5fZnVuY3Rpb24pJiYhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSl7Y29uc3QgdD10aGlzLnN0YXRlLmNvbnRleHQubGVuZ3RoLTE7aWYodGhpcy5zdGF0ZS5jb250ZXh0W3RdIT09eC5mdW5jdGlvblN0YXRlbWVudCl0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvclwiKTtyZXR1cm4gdGhpcy5zdGF0ZS5jb250ZXh0W3RdPXguZnVuY3Rpb25FeHByZXNzaW9uLHRoaXMubmV4dCgpLHRoaXMucGFyc2VGdW5jdGlvbihzLHZvaWQgMCwhMCl9aWYoZSYmIXQmJlwiYXN5bmNcIj09PWkubmFtZSYmdGhpcy5tYXRjaChuLm5hbWUpJiYhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSl7Y29uc3QgdD10aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMsZT10aGlzLnN0YXRlLm1heWJlSW5Bc3luY0Fycm93SGVhZCxpPXRoaXMuc3RhdGUueWllbGRQb3Mscj10aGlzLnN0YXRlLmF3YWl0UG9zO3RoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycz0hMCx0aGlzLnN0YXRlLm1heWJlSW5Bc3luY0Fycm93SGVhZD0hMCx0aGlzLnN0YXRlLnlpZWxkUG9zPS0xLHRoaXMuc3RhdGUuYXdhaXRQb3M9LTE7Y29uc3QgYT1bdGhpcy5wYXJzZUlkZW50aWZpZXIoKV07cmV0dXJuIHRoaXMuZXhwZWN0KG4uYXJyb3cpLHRoaXMuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCksdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzPXQsdGhpcy5zdGF0ZS5tYXliZUluQXN5bmNBcnJvd0hlYWQ9ZSx0aGlzLnN0YXRlLnlpZWxkUG9zPWksdGhpcy5zdGF0ZS5hd2FpdFBvcz1yLHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24ocyxhLCEwKSxzfXJldHVybiBlJiZ0aGlzLm1hdGNoKG4uYXJyb3cpJiYhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKT8odGhpcy5uZXh0KCksdGhpcy5wYXJzZUFycm93RXhwcmVzc2lvbihzLFtpXSwhMSkscyk6aX1jYXNlIG4uX2RvOnt0aGlzLmV4cGVjdFBsdWdpbihcImRvRXhwcmVzc2lvbnNcIik7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMubmV4dCgpO2NvbnN0IGU9dGhpcy5zdGF0ZS5sYWJlbHM7cmV0dXJuIHRoaXMuc3RhdGUubGFiZWxzPVtdLHQuYm9keT10aGlzLnBhcnNlQmxvY2soKSx0aGlzLnN0YXRlLmxhYmVscz1lLHRoaXMuZmluaXNoTm9kZSh0LFwiRG9FeHByZXNzaW9uXCIpfWNhc2Ugbi5yZWdleHA6e2NvbnN0IHQ9dGhpcy5zdGF0ZS52YWx1ZTtyZXR1cm4gcz10aGlzLnBhcnNlTGl0ZXJhbCh0LnZhbHVlLFwiUmVnRXhwTGl0ZXJhbFwiKSxzLnBhdHRlcm49dC5wYXR0ZXJuLHMuZmxhZ3M9dC5mbGFncyxzfWNhc2Ugbi5udW06cmV0dXJuIHRoaXMucGFyc2VMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUsXCJOdW1lcmljTGl0ZXJhbFwiKTtjYXNlIG4uYmlnaW50OnJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbCh0aGlzLnN0YXRlLnZhbHVlLFwiQmlnSW50TGl0ZXJhbFwiKTtjYXNlIG4uc3RyaW5nOnJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbCh0aGlzLnN0YXRlLnZhbHVlLFwiU3RyaW5nTGl0ZXJhbFwiKTtjYXNlIG4uX251bGw6cmV0dXJuIHM9dGhpcy5zdGFydE5vZGUoKSx0aGlzLm5leHQoKSx0aGlzLmZpbmlzaE5vZGUocyxcIk51bGxMaXRlcmFsXCIpO2Nhc2Ugbi5fdHJ1ZTpjYXNlIG4uX2ZhbHNlOnJldHVybiB0aGlzLnBhcnNlQm9vbGVhbkxpdGVyYWwoKTtjYXNlIG4ucGFyZW5MOnJldHVybiB0aGlzLnBhcnNlUGFyZW5BbmREaXN0aW5ndWlzaEV4cHJlc3Npb24oZSk7Y2FzZSBuLmJyYWNrZXRCYXJMOmNhc2Ugbi5icmFja2V0SGFzaEw6e3RoaXMuZXhwZWN0UGx1Z2luKFwicmVjb3JkQW5kVHVwbGVcIik7Y29uc3QgZT10aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5LGk9dGhpcy5zdGF0ZS50eXBlPT09bi5icmFja2V0QmFyTD9uLmJyYWNrZXRCYXJSOm4uYnJhY2tldFI7cmV0dXJuIHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk9ITEscz10aGlzLnN0YXJ0Tm9kZSgpLHRoaXMubmV4dCgpLHMuZWxlbWVudHM9dGhpcy5wYXJzZUV4cHJMaXN0KGksITAsdCxzKSx0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5PWUsdGhpcy5maW5pc2hOb2RlKHMsXCJUdXBsZUV4cHJlc3Npb25cIil9Y2FzZSBuLmJyYWNrZXRMOntjb25zdCBlPXRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7cmV0dXJuIHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk9ITEscz10aGlzLnN0YXJ0Tm9kZSgpLHRoaXMubmV4dCgpLHMuZWxlbWVudHM9dGhpcy5wYXJzZUV4cHJMaXN0KG4uYnJhY2tldFIsITAsdCxzKSx0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnN8fHRoaXMudG9SZWZlcmVuY2VkTGlzdChzLmVsZW1lbnRzKSx0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5PWUsdGhpcy5maW5pc2hOb2RlKHMsXCJBcnJheUV4cHJlc3Npb25cIil9Y2FzZSBuLmJyYWNlQmFyTDpjYXNlIG4uYnJhY2VIYXNoTDp7dGhpcy5leHBlY3RQbHVnaW4oXCJyZWNvcmRBbmRUdXBsZVwiKTtjb25zdCBlPXRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHkscz10aGlzLnN0YXRlLnR5cGU9PT1uLmJyYWNlQmFyTD9uLmJyYWNlQmFyUjpuLmJyYWNlUjt0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5PSExO2NvbnN0IGk9dGhpcy5wYXJzZU9iaihzLCExLCEwLHQpO3JldHVybiB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5PWUsaX1jYXNlIG4uYnJhY2VMOntjb25zdCBlPXRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7dGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keT0hMTtjb25zdCBzPXRoaXMucGFyc2VPYmoobi5icmFjZVIsITEsITEsdCk7cmV0dXJuIHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk9ZSxzfWNhc2Ugbi5fZnVuY3Rpb246cmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbkV4cHJlc3Npb24oKTtjYXNlIG4uYXQ6dGhpcy5wYXJzZURlY29yYXRvcnMoKTtjYXNlIG4uX2NsYXNzOnJldHVybiBzPXRoaXMuc3RhcnROb2RlKCksdGhpcy50YWtlRGVjb3JhdG9ycyhzKSx0aGlzLnBhcnNlQ2xhc3MocywhMSk7Y2FzZSBuLl9uZXc6cmV0dXJuIHRoaXMucGFyc2VOZXcoKTtjYXNlIG4uYmFja1F1b3RlOnJldHVybiB0aGlzLnBhcnNlVGVtcGxhdGUoITEpO2Nhc2Ugbi5kb3VibGVDb2xvbjp7cz10aGlzLnN0YXJ0Tm9kZSgpLHRoaXMubmV4dCgpLHMub2JqZWN0PW51bGw7Y29uc3QgdD1zLmNhbGxlZT10aGlzLnBhcnNlTm9DYWxsRXhwcigpO2lmKFwiTWVtYmVyRXhwcmVzc2lvblwiPT09dC50eXBlKXJldHVybiB0aGlzLmZpbmlzaE5vZGUocyxcIkJpbmRFeHByZXNzaW9uXCIpO3Rocm93IHRoaXMucmFpc2UodC5zdGFydCxmLlVuc3VwcG9ydGVkQmluZCl9Y2FzZSBuLmhhc2g6aWYodGhpcy5zdGF0ZS5pblBpcGVsaW5lKXJldHVybiBzPXRoaXMuc3RhcnROb2RlKCksXCJzbWFydFwiIT09dGhpcy5nZXRQbHVnaW5PcHRpb24oXCJwaXBlbGluZU9wZXJhdG9yXCIsXCJwcm9wb3NhbFwiKSYmdGhpcy5yYWlzZShzLnN0YXJ0LGYuUHJpbWFyeVRvcGljUmVxdWlyZXNTbWFydFBpcGVsaW5lKSx0aGlzLm5leHQoKSx0aGlzLnByaW1hcnlUb3BpY1JlZmVyZW5jZUlzQWxsb3dlZEluQ3VycmVudFRvcGljQ29udGV4dCgpfHx0aGlzLnJhaXNlKHMuc3RhcnQsZi5QcmltYXJ5VG9waWNOb3RBbGxvd2VkKSx0aGlzLnJlZ2lzdGVyVG9waWNSZWZlcmVuY2UoKSx0aGlzLmZpbmlzaE5vZGUocyxcIlBpcGVsaW5lUHJpbWFyeVRvcGljUmVmZXJlbmNlXCIpO2RlZmF1bHQ6dGhyb3cgdGhpcy51bmV4cGVjdGVkKCl9fXBhcnNlQm9vbGVhbkxpdGVyYWwoKXtjb25zdCB0PXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHQudmFsdWU9dGhpcy5tYXRjaChuLl90cnVlKSx0aGlzLm5leHQoKSx0aGlzLmZpbmlzaE5vZGUodCxcIkJvb2xlYW5MaXRlcmFsXCIpfXBhcnNlTWF5YmVQcml2YXRlTmFtZSh0KXtpZih0aGlzLm1hdGNoKG4uaGFzaCkpe3RoaXMuZXhwZWN0T25lUGx1Z2luKFtcImNsYXNzUHJpdmF0ZVByb3BlcnRpZXNcIixcImNsYXNzUHJpdmF0ZU1ldGhvZHNcIl0pLHR8fHRoaXMucmFpc2UodGhpcy5zdGF0ZS5wb3MsZi5VbmV4cGVjdGVkUHJpdmF0ZUZpZWxkKTtjb25zdCBlPXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHRoaXMubmV4dCgpLHRoaXMuYXNzZXJ0Tm9TcGFjZShcIlVuZXhwZWN0ZWQgc3BhY2UgYmV0d2VlbiAjIGFuZCBpZGVudGlmaWVyXCIpLGUuaWQ9dGhpcy5wYXJzZUlkZW50aWZpZXIoITApLHRoaXMuZmluaXNoTm9kZShlLFwiUHJpdmF0ZU5hbWVcIil9cmV0dXJuIHRoaXMucGFyc2VJZGVudGlmaWVyKCEwKX1wYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbigpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtsZXQgZT10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLm5leHQoKSxlPXRoaXMuY3JlYXRlSWRlbnRpZmllcihlLFwiZnVuY3Rpb25cIiksdGhpcy5wcm9kUGFyYW0uaGFzWWllbGQmJnRoaXMuZWF0KG4uZG90KT90aGlzLnBhcnNlTWV0YVByb3BlcnR5KHQsZSxcInNlbnRcIik6dGhpcy5wYXJzZUZ1bmN0aW9uKHQpfXBhcnNlTWV0YVByb3BlcnR5KHQsZSxzKXt0Lm1ldGE9ZSxcImZ1bmN0aW9uXCI9PT1lLm5hbWUmJlwic2VudFwiPT09cyYmKHRoaXMuaXNDb250ZXh0dWFsKHMpP3RoaXMuZXhwZWN0UGx1Z2luKFwiZnVuY3Rpb25TZW50XCIpOnRoaXMuaGFzUGx1Z2luKFwiZnVuY3Rpb25TZW50XCIpfHx0aGlzLnVuZXhwZWN0ZWQoKSk7Y29uc3QgaT10aGlzLnN0YXRlLmNvbnRhaW5zRXNjO3JldHVybiB0LnByb3BlcnR5PXRoaXMucGFyc2VJZGVudGlmaWVyKCEwKSwodC5wcm9wZXJ0eS5uYW1lIT09c3x8aSkmJnRoaXMucmFpc2UodC5wcm9wZXJ0eS5zdGFydCxmLlVuc3VwcG9ydGVkTWV0YVByb3BlcnR5LGUubmFtZSxzKSx0aGlzLmZpbmlzaE5vZGUodCxcIk1ldGFQcm9wZXJ0eVwiKX1wYXJzZUltcG9ydE1ldGFQcm9wZXJ0eSh0KXtjb25zdCBlPXRoaXMuY3JlYXRlSWRlbnRpZmllcih0aGlzLnN0YXJ0Tm9kZUF0Tm9kZSh0KSxcImltcG9ydFwiKTtyZXR1cm4gdGhpcy5leHBlY3Qobi5kb3QpLHRoaXMuaXNDb250ZXh0dWFsKFwibWV0YVwiKT8odGhpcy5leHBlY3RQbHVnaW4oXCJpbXBvcnRNZXRhXCIpLHRoaXMuaW5Nb2R1bGV8fHRoaXMucmFpc2VXaXRoRGF0YShlLnN0YXJ0LHtjb2RlOlwiQkFCRUxfUEFSU0VSX1NPVVJDRVRZUEVfTU9EVUxFX1JFUVVJUkVEXCJ9LGYuSW1wb3J0TWV0YU91dHNpZGVNb2R1bGUpLHRoaXMuc2F3VW5hbWJpZ3VvdXNFU009ITApOnRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0TWV0YVwiKXx8dGhpcy5yYWlzZShlLnN0YXJ0LGYuSW1wb3J0Q2FsbEFyaXR5THRPbmUpLHRoaXMucGFyc2VNZXRhUHJvcGVydHkodCxlLFwibWV0YVwiKX1wYXJzZUxpdGVyYWwodCxlLHMsaSl7cz1zfHx0aGlzLnN0YXRlLnN0YXJ0LGk9aXx8dGhpcy5zdGF0ZS5zdGFydExvYztjb25zdCByPXRoaXMuc3RhcnROb2RlQXQocyxpKTtyZXR1cm4gdGhpcy5hZGRFeHRyYShyLFwicmF3VmFsdWVcIix0KSx0aGlzLmFkZEV4dHJhKHIsXCJyYXdcIix0aGlzLmlucHV0LnNsaWNlKHMsdGhpcy5zdGF0ZS5lbmQpKSxyLnZhbHVlPXQsdGhpcy5uZXh0KCksdGhpcy5maW5pc2hOb2RlKHIsZSl9cGFyc2VQYXJlbkFuZERpc3Rpbmd1aXNoRXhwcmVzc2lvbih0KXtjb25zdCBlPXRoaXMuc3RhdGUuc3RhcnQscz10aGlzLnN0YXRlLnN0YXJ0TG9jO2xldCBpO3RoaXMuZXhwZWN0KG4ucGFyZW5MKTtjb25zdCByPXRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycyxhPXRoaXMuc3RhdGUueWllbGRQb3Msbz10aGlzLnN0YXRlLmF3YWl0UG9zLGg9dGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTt0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnM9ITAsdGhpcy5zdGF0ZS55aWVsZFBvcz0tMSx0aGlzLnN0YXRlLmF3YWl0UG9zPS0xLHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk9ITE7Y29uc3QgcD10aGlzLnN0YXRlLnN0YXJ0LGM9dGhpcy5zdGF0ZS5zdGFydExvYyx1PVtdLGw9bmV3IHh0LGQ9e3N0YXJ0OjB9O2xldCBtLGYsRD0hMDtmb3IoOyF0aGlzLm1hdGNoKG4ucGFyZW5SKTspe2lmKEQpRD0hMTtlbHNlIGlmKHRoaXMuZXhwZWN0KG4uY29tbWEsZC5zdGFydHx8bnVsbCksdGhpcy5tYXRjaChuLnBhcmVuUikpe2Y9dGhpcy5zdGF0ZS5zdGFydDticmVha31pZih0aGlzLm1hdGNoKG4uZWxsaXBzaXMpKXtjb25zdCB0PXRoaXMuc3RhdGUuc3RhcnQsZT10aGlzLnN0YXRlLnN0YXJ0TG9jO209dGhpcy5zdGF0ZS5zdGFydCx1LnB1c2godGhpcy5wYXJzZVBhcmVuSXRlbSh0aGlzLnBhcnNlUmVzdEJpbmRpbmcoKSx0LGUpKSx0aGlzLmNoZWNrQ29tbWFBZnRlclJlc3QoNDEpO2JyZWFrfXUucHVzaCh0aGlzLnBhcnNlTWF5YmVBc3NpZ24oITEsbCx0aGlzLnBhcnNlUGFyZW5JdGVtLGQpKX1jb25zdCB5PXRoaXMuc3RhdGUuc3RhcnQseD10aGlzLnN0YXRlLnN0YXJ0TG9jO3RoaXMuZXhwZWN0KG4ucGFyZW5SKSx0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnM9cix0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5PWg7bGV0IGc9dGhpcy5zdGFydE5vZGVBdChlLHMpO2lmKHQmJnRoaXMuc2hvdWxkUGFyc2VBcnJvdygpJiYoZz10aGlzLnBhcnNlQXJyb3coZykpKXt0aGlzLmlzQXdhaXRBbGxvd2VkKCl8fHRoaXMuc3RhdGUubWF5YmVJbkFzeW5jQXJyb3dIZWFkfHwodGhpcy5zdGF0ZS5hd2FpdFBvcz1vKSx0aGlzLmNoZWNrWWllbGRBd2FpdEluRGVmYXVsdFBhcmFtcygpLHRoaXMuc3RhdGUueWllbGRQb3M9YSx0aGlzLnN0YXRlLmF3YWl0UG9zPW87Zm9yKGxldCB0PTA7dDx1Lmxlbmd0aDt0Kyspe2NvbnN0IGU9dVt0XTtlLmV4dHJhJiZlLmV4dHJhLnBhcmVudGhlc2l6ZWQmJnRoaXMudW5leHBlY3RlZChlLmV4dHJhLnBhcmVuU3RhcnQpfXJldHVybiB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKGcsdSwhMSksZ31pZigtMSE9PWEmJih0aGlzLnN0YXRlLnlpZWxkUG9zPWEpLC0xIT09byYmKHRoaXMuc3RhdGUuYXdhaXRQb3M9byksdS5sZW5ndGh8fHRoaXMudW5leHBlY3RlZCh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCksZiYmdGhpcy51bmV4cGVjdGVkKGYpLG0mJnRoaXMudW5leHBlY3RlZChtKSx0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhsLCEwKSxkLnN0YXJ0JiZ0aGlzLnVuZXhwZWN0ZWQoZC5zdGFydCksdGhpcy50b1JlZmVyZW5jZWRMaXN0RGVlcCh1LCEwKSx1Lmxlbmd0aD4xPyhpPXRoaXMuc3RhcnROb2RlQXQocCxjKSxpLmV4cHJlc3Npb25zPXUsdGhpcy5maW5pc2hOb2RlQXQoaSxcIlNlcXVlbmNlRXhwcmVzc2lvblwiLHkseCkpOmk9dVswXSwhdGhpcy5vcHRpb25zLmNyZWF0ZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9ucylyZXR1cm4gdGhpcy5hZGRFeHRyYShpLFwicGFyZW50aGVzaXplZFwiLCEwKSx0aGlzLmFkZEV4dHJhKGksXCJwYXJlblN0YXJ0XCIsZSksaTtjb25zdCBQPXRoaXMuc3RhcnROb2RlQXQoZSxzKTtyZXR1cm4gUC5leHByZXNzaW9uPWksdGhpcy5maW5pc2hOb2RlKFAsXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiKSxQfXNob3VsZFBhcnNlQXJyb3coKXtyZXR1cm4hdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKX1wYXJzZUFycm93KHQpe2lmKHRoaXMuZWF0KG4uYXJyb3cpKXJldHVybiB0fXBhcnNlUGFyZW5JdGVtKHQsZSxzKXtyZXR1cm4gdH1wYXJzZU5ldygpe2NvbnN0IHQ9dGhpcy5zdGFydE5vZGUoKTtsZXQgZT10aGlzLnN0YXJ0Tm9kZSgpO2lmKHRoaXMubmV4dCgpLGU9dGhpcy5jcmVhdGVJZGVudGlmaWVyKGUsXCJuZXdcIiksdGhpcy5lYXQobi5kb3QpKXtjb25zdCBzPXRoaXMucGFyc2VNZXRhUHJvcGVydHkodCxlLFwidGFyZ2V0XCIpO2lmKCF0aGlzLnNjb3BlLmluTm9uQXJyb3dGdW5jdGlvbiYmIXRoaXMuc2NvcGUuaW5DbGFzcyl7bGV0IHQ9Zi5VbmV4cGVjdGVkTmV3VGFyZ2V0O3RoaXMuaGFzUGx1Z2luKFwiY2xhc3NQcm9wZXJ0aWVzXCIpJiYodCs9XCIgb3IgY2xhc3MgcHJvcGVydGllc1wiKSx0aGlzLnJhaXNlKHMuc3RhcnQsdCl9cmV0dXJuIHN9cmV0dXJuIHQuY2FsbGVlPXRoaXMucGFyc2VOb0NhbGxFeHByKCksXCJJbXBvcnRcIj09PXQuY2FsbGVlLnR5cGU/dGhpcy5yYWlzZSh0LmNhbGxlZS5zdGFydCxmLkltcG9ydENhbGxOb3ROZXdFeHByZXNzaW9uKTpcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiPT09dC5jYWxsZWUudHlwZXx8XCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCI9PT10LmNhbGxlZS50eXBlP3RoaXMucmFpc2UodGhpcy5zdGF0ZS5sYXN0VG9rRW5kLGYuT3B0aW9uYWxDaGFpbmluZ05vTmV3KTp0aGlzLmVhdChuLnF1ZXN0aW9uRG90KSYmdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LGYuT3B0aW9uYWxDaGFpbmluZ05vTmV3KSx0aGlzLnBhcnNlTmV3QXJndW1lbnRzKHQpLHRoaXMuZmluaXNoTm9kZSh0LFwiTmV3RXhwcmVzc2lvblwiKX1wYXJzZU5ld0FyZ3VtZW50cyh0KXtpZih0aGlzLmVhdChuLnBhcmVuTCkpe2NvbnN0IGU9dGhpcy5wYXJzZUV4cHJMaXN0KG4ucGFyZW5SKTt0aGlzLnRvUmVmZXJlbmNlZExpc3QoZSksdC5hcmd1bWVudHM9ZX1lbHNlIHQuYXJndW1lbnRzPVtdfXBhcnNlVGVtcGxhdGVFbGVtZW50KHQpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gbnVsbD09PXRoaXMuc3RhdGUudmFsdWUmJih0fHx0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQrMSxmLkludmFsaWRFc2NhcGVTZXF1ZW5jZVRlbXBsYXRlKSksZS52YWx1ZT17cmF3OnRoaXMuaW5wdXQuc2xpY2UodGhpcy5zdGF0ZS5zdGFydCx0aGlzLnN0YXRlLmVuZCkucmVwbGFjZSgvXFxyXFxuPy9nLFwiXFxuXCIpLGNvb2tlZDp0aGlzLnN0YXRlLnZhbHVlfSx0aGlzLm5leHQoKSxlLnRhaWw9dGhpcy5tYXRjaChuLmJhY2tRdW90ZSksdGhpcy5maW5pc2hOb2RlKGUsXCJUZW1wbGF0ZUVsZW1lbnRcIil9cGFyc2VUZW1wbGF0ZSh0KXtjb25zdCBlPXRoaXMuc3RhcnROb2RlKCk7dGhpcy5uZXh0KCksZS5leHByZXNzaW9ucz1bXTtsZXQgcz10aGlzLnBhcnNlVGVtcGxhdGVFbGVtZW50KHQpO2ZvcihlLnF1YXNpcz1bc107IXMudGFpbDspdGhpcy5leHBlY3Qobi5kb2xsYXJCcmFjZUwpLGUuZXhwcmVzc2lvbnMucHVzaCh0aGlzLnBhcnNlRXhwcmVzc2lvbigpKSx0aGlzLmV4cGVjdChuLmJyYWNlUiksZS5xdWFzaXMucHVzaChzPXRoaXMucGFyc2VUZW1wbGF0ZUVsZW1lbnQodCkpO3JldHVybiB0aGlzLm5leHQoKSx0aGlzLmZpbmlzaE5vZGUoZSxcIlRlbXBsYXRlTGl0ZXJhbFwiKX1wYXJzZU9iaih0LGUscyxpKXtjb25zdCByPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IGE9ITA7Y29uc3Qgbz10aGlzLnN0YXJ0Tm9kZSgpO2ZvcihvLnByb3BlcnRpZXM9W10sdGhpcy5uZXh0KCk7IXRoaXMuZWF0KHQpOyl7aWYoYSlhPSExO2Vsc2UgaWYodGhpcy5leHBlY3Qobi5jb21tYSksdGhpcy5tYXRjaCh0KSl7dGhpcy5hZGRFeHRyYShvLFwidHJhaWxpbmdDb21tYVwiLHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0KSx0aGlzLm5leHQoKTticmVha31jb25zdCBzPXRoaXMucGFyc2VPYmplY3RNZW1iZXIoZSxpKTtlfHx0aGlzLmNoZWNrRHVwbGljYXRlZFByb3RvKHMscixpKSxzLnNob3J0aGFuZCYmdGhpcy5hZGRFeHRyYShzLFwic2hvcnRoYW5kXCIsITApLG8ucHJvcGVydGllcy5wdXNoKHMpfWxldCBoPVwiT2JqZWN0RXhwcmVzc2lvblwiO3JldHVybiBlP2g9XCJPYmplY3RQYXR0ZXJuXCI6cyYmKGg9XCJSZWNvcmRFeHByZXNzaW9uXCIpLHRoaXMuZmluaXNoTm9kZShvLGgpfWlzQXN5bmNQcm9wKHQpe3JldHVybiF0LmNvbXB1dGVkJiZcIklkZW50aWZpZXJcIj09PXQua2V5LnR5cGUmJlwiYXN5bmNcIj09PXQua2V5Lm5hbWUmJih0aGlzLm1hdGNoKG4ubmFtZSl8fHRoaXMubWF0Y2gobi5udW0pfHx0aGlzLm1hdGNoKG4uc3RyaW5nKXx8dGhpcy5tYXRjaChuLmJyYWNrZXRMKXx8dGhpcy5zdGF0ZS50eXBlLmtleXdvcmR8fHRoaXMubWF0Y2gobi5zdGFyKSkmJiF0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpfXBhcnNlT2JqZWN0TWVtYmVyKHQsZSl7bGV0IHM9W107aWYodGhpcy5tYXRjaChuLmF0KSlmb3IodGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzXCIpJiZ0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQsZi5VbnN1cHBvcnRlZFByb3BlcnR5RGVjb3JhdG9yKTt0aGlzLm1hdGNoKG4uYXQpOylzLnB1c2godGhpcy5wYXJzZURlY29yYXRvcigpKTtjb25zdCBpPXRoaXMuc3RhcnROb2RlKCk7bGV0IHIsYSxvPSExLGg9ITE7aWYodGhpcy5tYXRjaChuLmVsbGlwc2lzKSlyZXR1cm4gcy5sZW5ndGgmJnRoaXMudW5leHBlY3RlZCgpLHQ/KHRoaXMubmV4dCgpLGkuYXJndW1lbnQ9dGhpcy5wYXJzZUlkZW50aWZpZXIoKSx0aGlzLmNoZWNrQ29tbWFBZnRlclJlc3QoMTI1KSx0aGlzLmZpbmlzaE5vZGUoaSxcIlJlc3RFbGVtZW50XCIpKTp0aGlzLnBhcnNlU3ByZWFkKCk7cy5sZW5ndGgmJihpLmRlY29yYXRvcnM9cyxzPVtdKSxpLm1ldGhvZD0hMSwodHx8ZSkmJihyPXRoaXMuc3RhdGUuc3RhcnQsYT10aGlzLnN0YXRlLnN0YXJ0TG9jKSx0fHwobz10aGlzLmVhdChuLnN0YXIpKTtjb25zdCBwPXRoaXMuc3RhdGUuY29udGFpbnNFc2M7cmV0dXJuIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWUoaSwhMSksdHx8cHx8b3x8IXRoaXMuaXNBc3luY1Byb3AoaSk/aD0hMTooaD0hMCxvPXRoaXMuZWF0KG4uc3RhciksdGhpcy5wYXJzZVByb3BlcnR5TmFtZShpLCExKSksdGhpcy5wYXJzZU9ialByb3BWYWx1ZShpLHIsYSxvLGgsdCxlLHApLGl9aXNHZXR0ZXJPclNldHRlck1ldGhvZCh0LGUpe3JldHVybiFlJiYhdC5jb21wdXRlZCYmXCJJZGVudGlmaWVyXCI9PT10LmtleS50eXBlJiYoXCJnZXRcIj09PXQua2V5Lm5hbWV8fFwic2V0XCI9PT10LmtleS5uYW1lKSYmKHRoaXMubWF0Y2gobi5zdHJpbmcpfHx0aGlzLm1hdGNoKG4ubnVtKXx8dGhpcy5tYXRjaChuLmJyYWNrZXRMKXx8dGhpcy5tYXRjaChuLm5hbWUpfHwhIXRoaXMuc3RhdGUudHlwZS5rZXl3b3JkKX1nZXRHZXR0ZXJTZXR0ZXJFeHBlY3RlZFBhcmFtQ291bnQodCl7cmV0dXJuXCJnZXRcIj09PXQua2luZD8wOjF9Y2hlY2tHZXR0ZXJTZXR0ZXJQYXJhbXModCl7Y29uc3QgZT10aGlzLmdldEdldHRlclNldHRlckV4cGVjdGVkUGFyYW1Db3VudCh0KSxzPXQuc3RhcnQ7dC5wYXJhbXMubGVuZ3RoIT09ZSYmKFwiZ2V0XCI9PT10LmtpbmQ/dGhpcy5yYWlzZShzLGYuQmFkR2V0dGVyQXJpdHkpOnRoaXMucmFpc2UocyxmLkJhZFNldHRlckFyaXR5KSksXCJzZXRcIj09PXQua2luZCYmXCJSZXN0RWxlbWVudFwiPT09dC5wYXJhbXNbdC5wYXJhbXMubGVuZ3RoLTFdLnR5cGUmJnRoaXMucmFpc2UocyxmLkJhZFNldHRlclJlc3RQYXJhbWV0ZXIpfXBhcnNlT2JqZWN0TWV0aG9kKHQsZSxzLGkscil7cmV0dXJuIHN8fGV8fHRoaXMubWF0Y2gobi5wYXJlbkwpPyhpJiZ0aGlzLnVuZXhwZWN0ZWQoKSx0LmtpbmQ9XCJtZXRob2RcIix0Lm1ldGhvZD0hMCx0aGlzLnBhcnNlTWV0aG9kKHQsZSxzLCExLCExLFwiT2JqZWN0TWV0aG9kXCIpKTohciYmdGhpcy5pc0dldHRlck9yU2V0dGVyTWV0aG9kKHQsaSk/KChlfHxzKSYmdGhpcy51bmV4cGVjdGVkKCksdC5raW5kPXQua2V5Lm5hbWUsdGhpcy5wYXJzZVByb3BlcnR5TmFtZSh0LCExKSx0aGlzLnBhcnNlTWV0aG9kKHQsITEsITEsITEsITEsXCJPYmplY3RNZXRob2RcIiksdGhpcy5jaGVja0dldHRlclNldHRlclBhcmFtcyh0KSx0KTp2b2lkIDB9cGFyc2VPYmplY3RQcm9wZXJ0eSh0LGUscyxpLHIpe3JldHVybiB0LnNob3J0aGFuZD0hMSx0aGlzLmVhdChuLmNvbG9uKT8odC52YWx1ZT1pP3RoaXMucGFyc2VNYXliZURlZmF1bHQodGhpcy5zdGF0ZS5zdGFydCx0aGlzLnN0YXRlLnN0YXJ0TG9jKTp0aGlzLnBhcnNlTWF5YmVBc3NpZ24oITEsciksdGhpcy5maW5pc2hOb2RlKHQsXCJPYmplY3RQcm9wZXJ0eVwiKSk6dC5jb21wdXRlZHx8XCJJZGVudGlmaWVyXCIhPT10LmtleS50eXBlP3ZvaWQgMDoodGhpcy5jaGVja1Jlc2VydmVkV29yZCh0LmtleS5uYW1lLHQua2V5LnN0YXJ0LCEwLCEwKSxpP3QudmFsdWU9dGhpcy5wYXJzZU1heWJlRGVmYXVsdChlLHMsdC5rZXkuX19jbG9uZSgpKTp0aGlzLm1hdGNoKG4uZXEpJiZyPygtMT09PXIuc2hvcnRoYW5kQXNzaWduJiYoci5zaG9ydGhhbmRBc3NpZ249dGhpcy5zdGF0ZS5zdGFydCksdC52YWx1ZT10aGlzLnBhcnNlTWF5YmVEZWZhdWx0KGUscyx0LmtleS5fX2Nsb25lKCkpKTp0LnZhbHVlPXQua2V5Ll9fY2xvbmUoKSx0LnNob3J0aGFuZD0hMCx0aGlzLmZpbmlzaE5vZGUodCxcIk9iamVjdFByb3BlcnR5XCIpKX1wYXJzZU9ialByb3BWYWx1ZSh0LGUscyxpLHIsYSxuLG8pe2NvbnN0IGg9dGhpcy5wYXJzZU9iamVjdE1ldGhvZCh0LGkscixhLG8pfHx0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHkodCxlLHMsYSxuKTtyZXR1cm4gaHx8dGhpcy51bmV4cGVjdGVkKCksaH1wYXJzZVByb3BlcnR5TmFtZSh0LGUpe2lmKHRoaXMuZWF0KG4uYnJhY2tldEwpKXQuY29tcHV0ZWQ9ITAsdC5rZXk9dGhpcy5wYXJzZU1heWJlQXNzaWduKCksdGhpcy5leHBlY3Qobi5icmFja2V0Uik7ZWxzZXtjb25zdCBzPXRoaXMuc3RhdGUuaW5Qcm9wZXJ0eU5hbWU7dGhpcy5zdGF0ZS5pblByb3BlcnR5TmFtZT0hMCx0LmtleT10aGlzLm1hdGNoKG4ubnVtKXx8dGhpcy5tYXRjaChuLnN0cmluZyl8fHRoaXMubWF0Y2gobi5iaWdpbnQpP3RoaXMucGFyc2VFeHByQXRvbSgpOnRoaXMucGFyc2VNYXliZVByaXZhdGVOYW1lKGUpLFwiUHJpdmF0ZU5hbWVcIiE9PXQua2V5LnR5cGUmJih0LmNvbXB1dGVkPSExKSx0aGlzLnN0YXRlLmluUHJvcGVydHlOYW1lPXN9cmV0dXJuIHQua2V5fWluaXRGdW5jdGlvbih0LGUpe3QuaWQ9bnVsbCx0LmdlbmVyYXRvcj0hMSx0LmFzeW5jPSEhZX1wYXJzZU1ldGhvZCh0LGUscyxpLHIsYSxuPSExKXtjb25zdCBvPXRoaXMuc3RhdGUueWllbGRQb3MsaD10aGlzLnN0YXRlLmF3YWl0UG9zO3RoaXMuc3RhdGUueWllbGRQb3M9LTEsdGhpcy5zdGF0ZS5hd2FpdFBvcz0tMSx0aGlzLmluaXRGdW5jdGlvbih0LHMpLHQuZ2VuZXJhdG9yPSEhZTtjb25zdCBwPWk7cmV0dXJuIHRoaXMuc2NvcGUuZW50ZXIoMTh8KG4/NjQ6MCl8KHI/MzI6MCkpLHRoaXMucHJvZFBhcmFtLmVudGVyKGV0KHMsdC5nZW5lcmF0b3IpKSx0aGlzLnBhcnNlRnVuY3Rpb25QYXJhbXModCxwKSx0aGlzLnBhcnNlRnVuY3Rpb25Cb2R5QW5kRmluaXNoKHQsYSwhMCksdGhpcy5wcm9kUGFyYW0uZXhpdCgpLHRoaXMuc2NvcGUuZXhpdCgpLHRoaXMuc3RhdGUueWllbGRQb3M9byx0aGlzLnN0YXRlLmF3YWl0UG9zPWgsdH1wYXJzZUFycm93RXhwcmVzc2lvbih0LGUscyxpKXt0aGlzLnNjb3BlLmVudGVyKDYpLHRoaXMucHJvZFBhcmFtLmVudGVyKGV0KHMsITEpKSx0aGlzLmluaXRGdW5jdGlvbih0LHMpO2NvbnN0IHI9dGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzLGE9dGhpcy5zdGF0ZS55aWVsZFBvcyxuPXRoaXMuc3RhdGUuYXdhaXRQb3M7cmV0dXJuIGUmJih0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnM9ITAsdGhpcy5zZXRBcnJvd0Z1bmN0aW9uUGFyYW1ldGVycyh0LGUsaSkpLHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycz0hMSx0aGlzLnN0YXRlLnlpZWxkUG9zPS0xLHRoaXMuc3RhdGUuYXdhaXRQb3M9LTEsdGhpcy5wYXJzZUZ1bmN0aW9uQm9keSh0LCEwKSx0aGlzLnByb2RQYXJhbS5leGl0KCksdGhpcy5zY29wZS5leGl0KCksdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzPXIsdGhpcy5zdGF0ZS55aWVsZFBvcz1hLHRoaXMuc3RhdGUuYXdhaXRQb3M9bix0aGlzLmZpbmlzaE5vZGUodCxcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpfXNldEFycm93RnVuY3Rpb25QYXJhbWV0ZXJzKHQsZSxzKXt0LnBhcmFtcz10aGlzLnRvQXNzaWduYWJsZUxpc3QoZSxzKX1wYXJzZUZ1bmN0aW9uQm9keUFuZEZpbmlzaCh0LGUscz0hMSl7dGhpcy5wYXJzZUZ1bmN0aW9uQm9keSh0LCExLHMpLHRoaXMuZmluaXNoTm9kZSh0LGUpfXBhcnNlRnVuY3Rpb25Cb2R5KHQsZSxzPSExKXtjb25zdCBpPWUmJiF0aGlzLm1hdGNoKG4uYnJhY2VMKSxyPXRoaXMuc3RhdGUuaW5QYXJhbWV0ZXJzO2lmKHRoaXMuc3RhdGUuaW5QYXJhbWV0ZXJzPSExLGkpdC5ib2R5PXRoaXMucGFyc2VNYXliZUFzc2lnbigpLHRoaXMuY2hlY2tQYXJhbXModCwhMSxlLCExKTtlbHNle2NvbnN0IGk9dGhpcy5zdGF0ZS5zdHJpY3Qscj10aGlzLnN0YXRlLmxhYmVsczt0aGlzLnN0YXRlLmxhYmVscz1bXSx0aGlzLnByb2RQYXJhbS5lbnRlcig0fHRoaXMucHJvZFBhcmFtLmN1cnJlbnRGbGFncygpKSx0LmJvZHk9dGhpcy5wYXJzZUJsb2NrKCEwLCExLHI9Pntjb25zdCBhPSF0aGlzLmlzU2ltcGxlUGFyYW1MaXN0KHQucGFyYW1zKTtpZihyJiZhKXtjb25zdCBlPVwibWV0aG9kXCIhPT10LmtpbmQmJlwiY29uc3RydWN0b3JcIiE9PXQua2luZHx8IXQua2V5P3Quc3RhcnQ6dC5rZXkuZW5kO3RoaXMucmFpc2UoZSxmLklsbGVnYWxMYW5ndWFnZU1vZGVEaXJlY3RpdmUpfWNvbnN0IG49IWkmJnRoaXMuc3RhdGUuc3RyaWN0O3RoaXMuY2hlY2tQYXJhbXModCwhKHRoaXMuc3RhdGUuc3RyaWN0fHxlfHxzfHxhKSxlLG4pLHRoaXMuc3RhdGUuc3RyaWN0JiZ0LmlkJiZ0aGlzLmNoZWNrTFZhbCh0LmlkLDY1LHZvaWQgMCxcImZ1bmN0aW9uIG5hbWVcIix2b2lkIDAsbil9KSx0aGlzLnByb2RQYXJhbS5leGl0KCksdGhpcy5zdGF0ZS5sYWJlbHM9cn10aGlzLnN0YXRlLmluUGFyYW1ldGVycz1yfWlzU2ltcGxlUGFyYW1MaXN0KHQpe2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzO2UrKylpZihcIklkZW50aWZpZXJcIiE9PXRbZV0udHlwZSlyZXR1cm4hMTtyZXR1cm4hMH1jaGVja1BhcmFtcyh0LGUscyxpPSEwKXtjb25zdCByPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGxldCBzPTA7czx0LnBhcmFtcy5sZW5ndGg7cysrKXRoaXMuY2hlY2tMVmFsKHQucGFyYW1zW3NdLDUsZT9udWxsOnIsXCJmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdFwiLHZvaWQgMCxpKX1wYXJzZUV4cHJMaXN0KHQsZSxzLGkpe2NvbnN0IHI9W107bGV0IGE9ITA7Zm9yKDshdGhpcy5lYXQodCk7KXtpZihhKWE9ITE7ZWxzZSBpZih0aGlzLmV4cGVjdChuLmNvbW1hKSx0aGlzLm1hdGNoKHQpKXtpJiZ0aGlzLmFkZEV4dHJhKGksXCJ0cmFpbGluZ0NvbW1hXCIsdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnQpLHRoaXMubmV4dCgpO2JyZWFrfXIucHVzaCh0aGlzLnBhcnNlRXhwckxpc3RJdGVtKGUscykpfXJldHVybiByfXBhcnNlRXhwckxpc3RJdGVtKHQsZSxzLGkpe2xldCByO2lmKHQmJnRoaXMubWF0Y2gobi5jb21tYSkpcj1udWxsO2Vsc2UgaWYodGhpcy5tYXRjaChuLmVsbGlwc2lzKSl7Y29uc3QgdD10aGlzLnN0YXRlLnN0YXJ0LGk9dGhpcy5zdGF0ZS5zdGFydExvYztyPXRoaXMucGFyc2VQYXJlbkl0ZW0odGhpcy5wYXJzZVNwcmVhZChlLHMpLHQsaSl9ZWxzZSBpZih0aGlzLm1hdGNoKG4ucXVlc3Rpb24pKXt0aGlzLmV4cGVjdFBsdWdpbihcInBhcnRpYWxBcHBsaWNhdGlvblwiKSxpfHx0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQsZi5VbmV4cGVjdGVkQXJndW1lbnRQbGFjZWhvbGRlcik7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMubmV4dCgpLHI9dGhpcy5maW5pc2hOb2RlKHQsXCJBcmd1bWVudFBsYWNlaG9sZGVyXCIpfWVsc2Ugcj10aGlzLnBhcnNlTWF5YmVBc3NpZ24oITEsZSx0aGlzLnBhcnNlUGFyZW5JdGVtLHMpO3JldHVybiByfXBhcnNlSWRlbnRpZmllcih0KXtjb25zdCBlPXRoaXMuc3RhcnROb2RlKCkscz10aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoZS5zdGFydCx0KTtyZXR1cm4gdGhpcy5jcmVhdGVJZGVudGlmaWVyKGUscyl9Y3JlYXRlSWRlbnRpZmllcih0LGUpe3JldHVybiB0Lm5hbWU9ZSx0LmxvYy5pZGVudGlmaWVyTmFtZT1lLHRoaXMuZmluaXNoTm9kZSh0LFwiSWRlbnRpZmllclwiKX1wYXJzZUlkZW50aWZpZXJOYW1lKHQsZSl7bGV0IHM7aWYodGhpcy5tYXRjaChuLm5hbWUpKXM9dGhpcy5zdGF0ZS52YWx1ZTtlbHNle2lmKCF0aGlzLnN0YXRlLnR5cGUua2V5d29yZCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtzPXRoaXMuc3RhdGUudHlwZS5rZXl3b3JkLFwiY2xhc3NcIiE9PXMmJlwiZnVuY3Rpb25cIiE9PXN8fHRoaXMuc3RhdGUubGFzdFRva0VuZD09PXRoaXMuc3RhdGUubGFzdFRva1N0YXJ0KzEmJjQ2PT09dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0KXx8dGhpcy5zdGF0ZS5jb250ZXh0LnBvcCgpfXJldHVybiBlP3RoaXMuc3RhdGUudHlwZT1uLm5hbWU6dGhpcy5jaGVja1Jlc2VydmVkV29yZChzLHRoaXMuc3RhdGUuc3RhcnQsISF0aGlzLnN0YXRlLnR5cGUua2V5d29yZCwhMSksdGhpcy5uZXh0KCksc31jaGVja1Jlc2VydmVkV29yZCh0LGUscyxpKXtpZih0aGlzLnByb2RQYXJhbS5oYXNZaWVsZCYmXCJ5aWVsZFwiPT09dClyZXR1cm4gdm9pZCB0aGlzLnJhaXNlKGUsZi5ZaWVsZEJpbmRpbmdJZGVudGlmaWVyKTtpZihcImF3YWl0XCI9PT10KXtpZih0aGlzLnByb2RQYXJhbS5oYXNBd2FpdClyZXR1cm4gdm9pZCB0aGlzLnJhaXNlKGUsZi5Bd2FpdEJpbmRpbmdJZGVudGlmaWVyKTstMT09PXRoaXMuc3RhdGUuYXdhaXRQb3MmJih0aGlzLnN0YXRlLm1heWJlSW5Bc3luY0Fycm93SGVhZHx8dGhpcy5pc0F3YWl0QWxsb3dlZCgpKSYmKHRoaXMuc3RhdGUuYXdhaXRQb3M9dGhpcy5zdGF0ZS5zdGFydCl9aWYodGhpcy5zY29wZS5pbkNsYXNzJiYhdGhpcy5zY29wZS5pbk5vbkFycm93RnVuY3Rpb24mJlwiYXJndW1lbnRzXCI9PT10KXJldHVybiB2b2lkIHRoaXMucmFpc2UoZSxmLkFyZ3VtZW50c0Rpc2FsbG93ZWRJbkluaXRpYWxpemVyKTtpZihzJiZmdW5jdGlvbih0KXtyZXR1cm4gay5oYXModCl9KHQpKXJldHVybiB2b2lkIHRoaXMucmFpc2UoZSxmLlVuZXhwZWN0ZWRLZXl3b3JkLHQpOyh0aGlzLnN0YXRlLnN0cmljdD9pP086QjpMKSh0LHRoaXMuaW5Nb2R1bGUpJiYodGhpcy5wcm9kUGFyYW0uaGFzQXdhaXR8fFwiYXdhaXRcIiE9PXQ/dGhpcy5yYWlzZShlLGYuVW5leHBlY3RlZFJlc2VydmVkV29yZCx0KTp0aGlzLnJhaXNlKGUsZi5Bd2FpdE5vdEluQXN5bmNGdW5jdGlvbikpfWlzQXdhaXRBbGxvd2VkKCl7cmV0dXJuIHRoaXMuc2NvcGUuaW5GdW5jdGlvbj90aGlzLnByb2RQYXJhbS5oYXNBd2FpdDohIXRoaXMub3B0aW9ucy5hbGxvd0F3YWl0T3V0c2lkZUZ1bmN0aW9ufHwhIXRoaXMuaGFzUGx1Z2luKFwidG9wTGV2ZWxBd2FpdFwiKSYmKHRoaXMuaW5Nb2R1bGUmJnRoaXMucHJvZFBhcmFtLmhhc0F3YWl0KX1wYXJzZUF3YWl0KCl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLm5leHQoKSx0aGlzLnN0YXRlLmluUGFyYW1ldGVycz90aGlzLnJhaXNlKHQuc3RhcnQsZi5Bd2FpdEV4cHJlc3Npb25Gb3JtYWxQYXJhbWV0ZXIpOi0xPT09dGhpcy5zdGF0ZS5hd2FpdFBvcyYmKHRoaXMuc3RhdGUuYXdhaXRQb3M9dC5zdGFydCksdGhpcy5lYXQobi5zdGFyKSYmdGhpcy5yYWlzZSh0LnN0YXJ0LGYuT2Jzb2xldGVBd2FpdFN0YXIpLHRoaXMuc2NvcGUuaW5GdW5jdGlvbnx8dGhpcy5vcHRpb25zLmFsbG93QXdhaXRPdXRzaWRlRnVuY3Rpb258fCh0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpfHx0aGlzLm1hdGNoKG4ucGx1c01pbil8fHRoaXMubWF0Y2gobi5wYXJlbkwpfHx0aGlzLm1hdGNoKG4uYnJhY2tldEwpfHx0aGlzLm1hdGNoKG4uYmFja1F1b3RlKXx8dGhpcy5tYXRjaChuLnJlZ2V4cCl8fHRoaXMubWF0Y2gobi5zbGFzaCl8fHRoaXMuaGFzUGx1Z2luKFwidjhpbnRyaW5zaWNcIikmJnRoaXMubWF0Y2gobi5tb2R1bG8pP3RoaXMuYW1iaWd1b3VzU2NyaXB0RGlmZmVyZW50QXN0PSEwOnRoaXMuc2F3VW5hbWJpZ3VvdXNFU009ITApLHRoaXMuc3RhdGUuc29sb0F3YWl0fHwodC5hcmd1bWVudD10aGlzLnBhcnNlTWF5YmVVbmFyeSgpKSx0aGlzLmZpbmlzaE5vZGUodCxcIkF3YWl0RXhwcmVzc2lvblwiKX1wYXJzZVlpZWxkKHQpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5zdGF0ZS5pblBhcmFtZXRlcnM/dGhpcy5yYWlzZShlLnN0YXJ0LGYuWWllbGRJblBhcmFtZXRlcik6LTE9PT10aGlzLnN0YXRlLnlpZWxkUG9zJiYodGhpcy5zdGF0ZS55aWVsZFBvcz1lLnN0YXJ0KSx0aGlzLm5leHQoKSx0aGlzLm1hdGNoKG4uc2VtaSl8fCF0aGlzLm1hdGNoKG4uc3RhcikmJiF0aGlzLnN0YXRlLnR5cGUuc3RhcnRzRXhwcnx8dGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKT8oZS5kZWxlZ2F0ZT0hMSxlLmFyZ3VtZW50PW51bGwpOihlLmRlbGVnYXRlPXRoaXMuZWF0KG4uc3RhciksZS5hcmd1bWVudD10aGlzLnBhcnNlTWF5YmVBc3NpZ24odCkpLHRoaXMuZmluaXNoTm9kZShlLFwiWWllbGRFeHByZXNzaW9uXCIpfWNoZWNrUGlwZWxpbmVBdEluZml4T3BlcmF0b3IodCxlKXtcInNtYXJ0XCI9PT10aGlzLmdldFBsdWdpbk9wdGlvbihcInBpcGVsaW5lT3BlcmF0b3JcIixcInByb3Bvc2FsXCIpJiZcIlNlcXVlbmNlRXhwcmVzc2lvblwiPT09dC50eXBlJiZ0aGlzLnJhaXNlKGUsZi5QaXBlbGluZUhlYWRTZXF1ZW5jZUV4cHJlc3Npb24pfXBhcnNlU21hcnRQaXBlbGluZUJvZHkodCxlLHMpe2NvbnN0IGk9dGhpcy5jaGVja1NtYXJ0UGlwZWxpbmVCb2R5U3R5bGUodCk7cmV0dXJuIHRoaXMuY2hlY2tTbWFydFBpcGVsaW5lQm9keUVhcmx5RXJyb3JzKHQsaSxlKSx0aGlzLnBhcnNlU21hcnRQaXBlbGluZUJvZHlJblN0eWxlKHQsaSxlLHMpfWNoZWNrU21hcnRQaXBlbGluZUJvZHlFYXJseUVycm9ycyh0LGUscyl7aWYodGhpcy5tYXRjaChuLmFycm93KSl0aHJvdyB0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQsZi5QaXBlbGluZUJvZHlOb0Fycm93KTtcIlBpcGVsaW5lVG9waWNFeHByZXNzaW9uXCI9PT1lJiZcIlNlcXVlbmNlRXhwcmVzc2lvblwiPT09dC50eXBlJiZ0aGlzLnJhaXNlKHMsZi5QaXBlbGluZUJvZHlTZXF1ZW5jZUV4cHJlc3Npb24pfXBhcnNlU21hcnRQaXBlbGluZUJvZHlJblN0eWxlKHQsZSxzLGkpe2NvbnN0IHI9dGhpcy5zdGFydE5vZGVBdChzLGkpO3N3aXRjaChlKXtjYXNlXCJQaXBlbGluZUJhcmVGdW5jdGlvblwiOnIuY2FsbGVlPXQ7YnJlYWs7Y2FzZVwiUGlwZWxpbmVCYXJlQ29uc3RydWN0b3JcIjpyLmNhbGxlZT10LmNhbGxlZTticmVhaztjYXNlXCJQaXBlbGluZUJhcmVBd2FpdGVkRnVuY3Rpb25cIjpyLmNhbGxlZT10LmFyZ3VtZW50O2JyZWFrO2Nhc2VcIlBpcGVsaW5lVG9waWNFeHByZXNzaW9uXCI6dGhpcy50b3BpY1JlZmVyZW5jZVdhc1VzZWRJbkN1cnJlbnRUb3BpY0NvbnRleHQoKXx8dGhpcy5yYWlzZShzLGYuUGlwZWxpbmVUb3BpY1VudXNlZCksci5leHByZXNzaW9uPXQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBAYmFiZWwvcGFyc2VyIGVycm9yOiBVbmtub3duIHBpcGVsaW5lIHN0eWxlIChcIi5jb25jYXQoZSxcIilcIikpfXJldHVybiB0aGlzLmZpbmlzaE5vZGUocixlKX1jaGVja1NtYXJ0UGlwZWxpbmVCb2R5U3R5bGUodCl7cmV0dXJuIHQudHlwZSx0aGlzLmlzU2ltcGxlUmVmZXJlbmNlKHQpP1wiUGlwZWxpbmVCYXJlRnVuY3Rpb25cIjpcIlBpcGVsaW5lVG9waWNFeHByZXNzaW9uXCJ9aXNTaW1wbGVSZWZlcmVuY2UodCl7c3dpdGNoKHQudHlwZSl7Y2FzZVwiTWVtYmVyRXhwcmVzc2lvblwiOnJldHVybiF0LmNvbXB1dGVkJiZ0aGlzLmlzU2ltcGxlUmVmZXJlbmNlKHQub2JqZWN0KTtjYXNlXCJJZGVudGlmaWVyXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19d2l0aFRvcGljUGVybWl0dGluZ0NvbnRleHQodCl7Y29uc3QgZT10aGlzLnN0YXRlLnRvcGljQ29udGV4dDt0aGlzLnN0YXRlLnRvcGljQ29udGV4dD17bWF4TnVtT2ZSZXNvbHZhYmxlVG9waWNzOjEsbWF4VG9waWNJbmRleDpudWxsfTt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e3RoaXMuc3RhdGUudG9waWNDb250ZXh0PWV9fXdpdGhUb3BpY0ZvcmJpZGRpbmdDb250ZXh0KHQpe2NvbnN0IGU9dGhpcy5zdGF0ZS50b3BpY0NvbnRleHQ7dGhpcy5zdGF0ZS50b3BpY0NvbnRleHQ9e21heE51bU9mUmVzb2x2YWJsZVRvcGljczowLG1heFRvcGljSW5kZXg6bnVsbH07dHJ5e3JldHVybiB0KCl9ZmluYWxseXt0aGlzLnN0YXRlLnRvcGljQ29udGV4dD1lfX13aXRoU29sb0F3YWl0UGVybWl0dGluZ0NvbnRleHQodCl7Y29uc3QgZT10aGlzLnN0YXRlLnNvbG9Bd2FpdDt0aGlzLnN0YXRlLnNvbG9Bd2FpdD0hMDt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e3RoaXMuc3RhdGUuc29sb0F3YWl0PWV9fXJlZ2lzdGVyVG9waWNSZWZlcmVuY2UoKXt0aGlzLnN0YXRlLnRvcGljQ29udGV4dC5tYXhUb3BpY0luZGV4PTB9cHJpbWFyeVRvcGljUmVmZXJlbmNlSXNBbGxvd2VkSW5DdXJyZW50VG9waWNDb250ZXh0KCl7cmV0dXJuIHRoaXMuc3RhdGUudG9waWNDb250ZXh0Lm1heE51bU9mUmVzb2x2YWJsZVRvcGljcz49MX10b3BpY1JlZmVyZW5jZVdhc1VzZWRJbkN1cnJlbnRUb3BpY0NvbnRleHQoKXtyZXR1cm4gbnVsbCE9dGhpcy5zdGF0ZS50b3BpY0NvbnRleHQubWF4VG9waWNJbmRleCYmdGhpcy5zdGF0ZS50b3BpY0NvbnRleHQubWF4VG9waWNJbmRleD49MH1wYXJzZUZTaGFycFBpcGVsaW5lQm9keSh0LGUpe2NvbnN0IHM9dGhpcy5zdGF0ZS5zdGFydCxpPXRoaXMuc3RhdGUuc3RhcnRMb2M7dGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0PXRoaXMuc3RhdGUuc3RhcnQ7Y29uc3Qgcj10aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5O3RoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk9ITA7Y29uc3QgYT10aGlzLnBhcnNlRXhwck9wKHRoaXMucGFyc2VNYXliZVVuYXJ5KCkscyxpLHQsZSk7cmV0dXJuIHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk9cixhfX17cGFyc2VUb3BMZXZlbCh0LGUpe2lmKGUuc291cmNlVHlwZT10aGlzLm9wdGlvbnMuc291cmNlVHlwZSxlLmludGVycHJldGVyPXRoaXMucGFyc2VJbnRlcnByZXRlckRpcmVjdGl2ZSgpLHRoaXMucGFyc2VCbG9ja0JvZHkoZSwhMCwhMCxuLmVvZiksdGhpcy5pbk1vZHVsZSYmIXRoaXMub3B0aW9ucy5hbGxvd1VuZGVjbGFyZWRFeHBvcnRzJiZ0aGlzLnNjb3BlLnVuZGVmaW5lZEV4cG9ydHMuc2l6ZT4wKWZvcihsZXQgdD0wLGU9QXJyYXkuZnJvbSh0aGlzLnNjb3BlLnVuZGVmaW5lZEV4cG9ydHMpO3Q8ZS5sZW5ndGg7dCsrKXtjb25zdFtzXT1lW3RdLGk9dGhpcy5zY29wZS51bmRlZmluZWRFeHBvcnRzLmdldChzKTt0aGlzLnJhaXNlKGksZi5Nb2R1bGVFeHBvcnRVbmRlZmluZWQscyl9cmV0dXJuIHQucHJvZ3JhbT10aGlzLmZpbmlzaE5vZGUoZSxcIlByb2dyYW1cIiksdC5jb21tZW50cz10aGlzLnN0YXRlLmNvbW1lbnRzLHRoaXMub3B0aW9ucy50b2tlbnMmJih0LnRva2Vucz10aGlzLnRva2VucyksdGhpcy5maW5pc2hOb2RlKHQsXCJGaWxlXCIpfXN0bXRUb0RpcmVjdGl2ZSh0KXtjb25zdCBlPXQuZXhwcmVzc2lvbixzPXRoaXMuc3RhcnROb2RlQXQoZS5zdGFydCxlLmxvYy5zdGFydCksaT10aGlzLnN0YXJ0Tm9kZUF0KHQuc3RhcnQsdC5sb2Muc3RhcnQpLHI9dGhpcy5pbnB1dC5zbGljZShlLnN0YXJ0LGUuZW5kKSxhPXMudmFsdWU9ci5zbGljZSgxLC0xKTtyZXR1cm4gdGhpcy5hZGRFeHRyYShzLFwicmF3XCIsciksdGhpcy5hZGRFeHRyYShzLFwicmF3VmFsdWVcIixhKSxpLnZhbHVlPXRoaXMuZmluaXNoTm9kZUF0KHMsXCJEaXJlY3RpdmVMaXRlcmFsXCIsZS5lbmQsZS5sb2MuZW5kKSx0aGlzLmZpbmlzaE5vZGVBdChpLFwiRGlyZWN0aXZlXCIsdC5lbmQsdC5sb2MuZW5kKX1wYXJzZUludGVycHJldGVyRGlyZWN0aXZlKCl7aWYoIXRoaXMubWF0Y2gobi5pbnRlcnByZXRlckRpcmVjdGl2ZSkpcmV0dXJuIG51bGw7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0LnZhbHVlPXRoaXMuc3RhdGUudmFsdWUsdGhpcy5uZXh0KCksdGhpcy5maW5pc2hOb2RlKHQsXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiKX1pc0xldCh0KXtpZighdGhpcy5pc0NvbnRleHR1YWwoXCJsZXRcIikpcmV0dXJuITE7Y29uc3QgZT10aGlzLm5leHRUb2tlblN0YXJ0KCkscz10aGlzLmlucHV0LmNoYXJDb2RlQXQoZSk7aWYoOTE9PT1zKXJldHVybiEwO2lmKHQpcmV0dXJuITE7aWYoMTIzPT09cylyZXR1cm4hMDtpZih3KHMpKXtsZXQgdD1lKzE7Zm9yKDtTKHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0KSk7KSsrdDtjb25zdCBzPXRoaXMuaW5wdXQuc2xpY2UoZSx0KTtpZighUi50ZXN0KHMpKXJldHVybiEwfXJldHVybiExfXBhcnNlU3RhdGVtZW50KHQsZSl7cmV0dXJuIHRoaXMubWF0Y2gobi5hdCkmJnRoaXMucGFyc2VEZWNvcmF0b3JzKCEwKSx0aGlzLnBhcnNlU3RhdGVtZW50Q29udGVudCh0LGUpfXBhcnNlU3RhdGVtZW50Q29udGVudCh0LGUpe2xldCBzPXRoaXMuc3RhdGUudHlwZTtjb25zdCBpPXRoaXMuc3RhcnROb2RlKCk7bGV0IHI7c3dpdGNoKHRoaXMuaXNMZXQodCkmJihzPW4uX3ZhcixyPVwibGV0XCIpLHMpe2Nhc2Ugbi5fYnJlYWs6Y2FzZSBuLl9jb250aW51ZTpyZXR1cm4gdGhpcy5wYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQoaSxzLmtleXdvcmQpO2Nhc2Ugbi5fZGVidWdnZXI6cmV0dXJuIHRoaXMucGFyc2VEZWJ1Z2dlclN0YXRlbWVudChpKTtjYXNlIG4uX2RvOnJldHVybiB0aGlzLnBhcnNlRG9TdGF0ZW1lbnQoaSk7Y2FzZSBuLl9mb3I6cmV0dXJuIHRoaXMucGFyc2VGb3JTdGF0ZW1lbnQoaSk7Y2FzZSBuLl9mdW5jdGlvbjppZig0Nj09PXRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSlicmVhaztyZXR1cm4gdCYmKHRoaXMuc3RhdGUuc3RyaWN0P3RoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLlN0cmljdEZ1bmN0aW9uKTpcImlmXCIhPT10JiZcImxhYmVsXCIhPT10JiZ0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQsZi5TbG9wcHlGdW5jdGlvbikpLHRoaXMucGFyc2VGdW5jdGlvblN0YXRlbWVudChpLCExLCF0KTtjYXNlIG4uX2NsYXNzOnJldHVybiB0JiZ0aGlzLnVuZXhwZWN0ZWQoKSx0aGlzLnBhcnNlQ2xhc3MoaSwhMCk7Y2FzZSBuLl9pZjpyZXR1cm4gdGhpcy5wYXJzZUlmU3RhdGVtZW50KGkpO2Nhc2Ugbi5fcmV0dXJuOnJldHVybiB0aGlzLnBhcnNlUmV0dXJuU3RhdGVtZW50KGkpO2Nhc2Ugbi5fc3dpdGNoOnJldHVybiB0aGlzLnBhcnNlU3dpdGNoU3RhdGVtZW50KGkpO2Nhc2Ugbi5fdGhyb3c6cmV0dXJuIHRoaXMucGFyc2VUaHJvd1N0YXRlbWVudChpKTtjYXNlIG4uX3RyeTpyZXR1cm4gdGhpcy5wYXJzZVRyeVN0YXRlbWVudChpKTtjYXNlIG4uX2NvbnN0OmNhc2Ugbi5fdmFyOnJldHVybiByPXJ8fHRoaXMuc3RhdGUudmFsdWUsdCYmXCJ2YXJcIiE9PXImJnRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLlVuZXhwZWN0ZWRMZXhpY2FsRGVjbGFyYXRpb24pLHRoaXMucGFyc2VWYXJTdGF0ZW1lbnQoaSxyKTtjYXNlIG4uX3doaWxlOnJldHVybiB0aGlzLnBhcnNlV2hpbGVTdGF0ZW1lbnQoaSk7Y2FzZSBuLl93aXRoOnJldHVybiB0aGlzLnBhcnNlV2l0aFN0YXRlbWVudChpKTtjYXNlIG4uYnJhY2VMOnJldHVybiB0aGlzLnBhcnNlQmxvY2soKTtjYXNlIG4uc2VtaTpyZXR1cm4gdGhpcy5wYXJzZUVtcHR5U3RhdGVtZW50KGkpO2Nhc2Ugbi5fZXhwb3J0OmNhc2Ugbi5faW1wb3J0Ontjb25zdCB0PXRoaXMubG9va2FoZWFkQ2hhckNvZGUoKTtpZig0MD09PXR8fDQ2PT09dClicmVhaztsZXQgcjtyZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93SW1wb3J0RXhwb3J0RXZlcnl3aGVyZXx8ZXx8dGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LGYuVW5leHBlY3RlZEltcG9ydEV4cG9ydCksdGhpcy5uZXh0KCkscz09PW4uX2ltcG9ydD8ocj10aGlzLnBhcnNlSW1wb3J0KGkpLFwiSW1wb3J0RGVjbGFyYXRpb25cIiE9PXIudHlwZXx8ci5pbXBvcnRLaW5kJiZcInZhbHVlXCIhPT1yLmltcG9ydEtpbmR8fCh0aGlzLnNhd1VuYW1iaWd1b3VzRVNNPSEwKSk6KHI9dGhpcy5wYXJzZUV4cG9ydChpKSwoXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCIhPT1yLnR5cGV8fHIuZXhwb3J0S2luZCYmXCJ2YWx1ZVwiIT09ci5leHBvcnRLaW5kKSYmKFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIiE9PXIudHlwZXx8ci5leHBvcnRLaW5kJiZcInZhbHVlXCIhPT1yLmV4cG9ydEtpbmQpJiZcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiIT09ci50eXBlfHwodGhpcy5zYXdVbmFtYmlndW91c0VTTT0hMCkpLHRoaXMuYXNzZXJ0TW9kdWxlTm9kZUFsbG93ZWQoaSkscn1kZWZhdWx0OmlmKHRoaXMuaXNBc3luY0Z1bmN0aW9uKCkpcmV0dXJuIHQmJnRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLkFzeW5jRnVuY3Rpb25JblNpbmdsZVN0YXRlbWVudENvbnRleHQpLHRoaXMubmV4dCgpLHRoaXMucGFyc2VGdW5jdGlvblN0YXRlbWVudChpLCEwLCF0KX1jb25zdCBhPXRoaXMuc3RhdGUudmFsdWUsbz10aGlzLnBhcnNlRXhwcmVzc2lvbigpO3JldHVybiBzPT09bi5uYW1lJiZcIklkZW50aWZpZXJcIj09PW8udHlwZSYmdGhpcy5lYXQobi5jb2xvbik/dGhpcy5wYXJzZUxhYmVsZWRTdGF0ZW1lbnQoaSxhLG8sdCk6dGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoaSxvKX1hc3NlcnRNb2R1bGVOb2RlQWxsb3dlZCh0KXt0aGlzLm9wdGlvbnMuYWxsb3dJbXBvcnRFeHBvcnRFdmVyeXdoZXJlfHx0aGlzLmluTW9kdWxlfHx0aGlzLnJhaXNlV2l0aERhdGEodC5zdGFydCx7Y29kZTpcIkJBQkVMX1BBUlNFUl9TT1VSQ0VUWVBFX01PRFVMRV9SRVFVSVJFRFwifSxmLkltcG9ydE91dHNpZGVNb2R1bGUpfXRha2VEZWNvcmF0b3JzKHQpe2NvbnN0IGU9dGhpcy5zdGF0ZS5kZWNvcmF0b3JTdGFja1t0aGlzLnN0YXRlLmRlY29yYXRvclN0YWNrLmxlbmd0aC0xXTtlLmxlbmd0aCYmKHQuZGVjb3JhdG9ycz1lLHRoaXMucmVzZXRTdGFydExvY2F0aW9uRnJvbU5vZGUodCxlWzBdKSx0aGlzLnN0YXRlLmRlY29yYXRvclN0YWNrW3RoaXMuc3RhdGUuZGVjb3JhdG9yU3RhY2subGVuZ3RoLTFdPVtdKX1jYW5IYXZlTGVhZGluZ0RlY29yYXRvcigpe3JldHVybiB0aGlzLm1hdGNoKG4uX2NsYXNzKX1wYXJzZURlY29yYXRvcnModCl7Y29uc3QgZT10aGlzLnN0YXRlLmRlY29yYXRvclN0YWNrW3RoaXMuc3RhdGUuZGVjb3JhdG9yU3RhY2subGVuZ3RoLTFdO2Zvcig7dGhpcy5tYXRjaChuLmF0KTspe2NvbnN0IHQ9dGhpcy5wYXJzZURlY29yYXRvcigpO2UucHVzaCh0KX1pZih0aGlzLm1hdGNoKG4uX2V4cG9ydCkpdHx8dGhpcy51bmV4cGVjdGVkKCksdGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzXCIpJiYhdGhpcy5nZXRQbHVnaW5PcHRpb24oXCJkZWNvcmF0b3JzXCIsXCJkZWNvcmF0b3JzQmVmb3JlRXhwb3J0XCIpJiZ0aGlzLnJhaXNlKHRoaXMuc3RhdGUuc3RhcnQsZi5EZWNvcmF0b3JFeHBvcnRDbGFzcyk7ZWxzZSBpZighdGhpcy5jYW5IYXZlTGVhZGluZ0RlY29yYXRvcigpKXRocm93IHRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLlVuZXhwZWN0ZWRMZWFkaW5nRGVjb3JhdG9yKX1wYXJzZURlY29yYXRvcigpe3RoaXMuZXhwZWN0T25lUGx1Z2luKFtcImRlY29yYXRvcnMtbGVnYWN5XCIsXCJkZWNvcmF0b3JzXCJdKTtjb25zdCB0PXRoaXMuc3RhcnROb2RlKCk7aWYodGhpcy5uZXh0KCksdGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzXCIpKXt0aGlzLnN0YXRlLmRlY29yYXRvclN0YWNrLnB1c2goW10pO2NvbnN0IGU9dGhpcy5zdGF0ZS5zdGFydCxzPXRoaXMuc3RhdGUuc3RhcnRMb2M7bGV0IGk7aWYodGhpcy5lYXQobi5wYXJlbkwpKWk9dGhpcy5wYXJzZUV4cHJlc3Npb24oKSx0aGlzLmV4cGVjdChuLnBhcmVuUik7ZWxzZSBmb3IoaT10aGlzLnBhcnNlSWRlbnRpZmllcighMSk7dGhpcy5lYXQobi5kb3QpOyl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZUF0KGUscyk7dC5vYmplY3Q9aSx0LnByb3BlcnR5PXRoaXMucGFyc2VJZGVudGlmaWVyKCEwKSx0LmNvbXB1dGVkPSExLGk9dGhpcy5maW5pc2hOb2RlKHQsXCJNZW1iZXJFeHByZXNzaW9uXCIpfXQuZXhwcmVzc2lvbj10aGlzLnBhcnNlTWF5YmVEZWNvcmF0b3JBcmd1bWVudHMoaSksdGhpcy5zdGF0ZS5kZWNvcmF0b3JTdGFjay5wb3AoKX1lbHNlIHQuZXhwcmVzc2lvbj10aGlzLnBhcnNlRXhwclN1YnNjcmlwdHMoKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKHQsXCJEZWNvcmF0b3JcIil9cGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyh0KXtpZih0aGlzLmVhdChuLnBhcmVuTCkpe2NvbnN0IGU9dGhpcy5zdGFydE5vZGVBdE5vZGUodCk7cmV0dXJuIGUuY2FsbGVlPXQsZS5hcmd1bWVudHM9dGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKG4ucGFyZW5SLCExKSx0aGlzLnRvUmVmZXJlbmNlZExpc3QoZS5hcmd1bWVudHMpLHRoaXMuZmluaXNoTm9kZShlLFwiQ2FsbEV4cHJlc3Npb25cIil9cmV0dXJuIHR9cGFyc2VCcmVha0NvbnRpbnVlU3RhdGVtZW50KHQsZSl7Y29uc3Qgcz1cImJyZWFrXCI9PT1lO3JldHVybiB0aGlzLm5leHQoKSx0aGlzLmlzTGluZVRlcm1pbmF0b3IoKT90LmxhYmVsPW51bGw6KHQubGFiZWw9dGhpcy5wYXJzZUlkZW50aWZpZXIoKSx0aGlzLnNlbWljb2xvbigpKSx0aGlzLnZlcmlmeUJyZWFrQ29udGludWUodCxlKSx0aGlzLmZpbmlzaE5vZGUodCxzP1wiQnJlYWtTdGF0ZW1lbnRcIjpcIkNvbnRpbnVlU3RhdGVtZW50XCIpfXZlcmlmeUJyZWFrQ29udGludWUodCxlKXtjb25zdCBzPVwiYnJlYWtcIj09PWU7bGV0IGk7Zm9yKGk9MDtpPHRoaXMuc3RhdGUubGFiZWxzLmxlbmd0aDsrK2kpe2NvbnN0IGU9dGhpcy5zdGF0ZS5sYWJlbHNbaV07aWYobnVsbD09dC5sYWJlbHx8ZS5uYW1lPT09dC5sYWJlbC5uYW1lKXtpZihudWxsIT1lLmtpbmQmJihzfHxcImxvb3BcIj09PWUua2luZCkpYnJlYWs7aWYodC5sYWJlbCYmcylicmVha319aT09PXRoaXMuc3RhdGUubGFiZWxzLmxlbmd0aCYmdGhpcy5yYWlzZSh0LnN0YXJ0LGYuSWxsZWdhbEJyZWFrQ29udGludWUsZSl9cGFyc2VEZWJ1Z2dlclN0YXRlbWVudCh0KXtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5zZW1pY29sb24oKSx0aGlzLmZpbmlzaE5vZGUodCxcIkRlYnVnZ2VyU3RhdGVtZW50XCIpfXBhcnNlSGVhZGVyRXhwcmVzc2lvbigpe3RoaXMuZXhwZWN0KG4ucGFyZW5MKTtjb25zdCB0PXRoaXMucGFyc2VFeHByZXNzaW9uKCk7cmV0dXJuIHRoaXMuZXhwZWN0KG4ucGFyZW5SKSx0fXBhcnNlRG9TdGF0ZW1lbnQodCl7cmV0dXJuIHRoaXMubmV4dCgpLHRoaXMuc3RhdGUubGFiZWxzLnB1c2goRXQpLHQuYm9keT10aGlzLndpdGhUb3BpY0ZvcmJpZGRpbmdDb250ZXh0KCgpPT50aGlzLnBhcnNlU3RhdGVtZW50KFwiZG9cIikpLHRoaXMuc3RhdGUubGFiZWxzLnBvcCgpLHRoaXMuZXhwZWN0KG4uX3doaWxlKSx0LnRlc3Q9dGhpcy5wYXJzZUhlYWRlckV4cHJlc3Npb24oKSx0aGlzLmVhdChuLnNlbWkpLHRoaXMuZmluaXNoTm9kZSh0LFwiRG9XaGlsZVN0YXRlbWVudFwiKX1wYXJzZUZvclN0YXRlbWVudCh0KXt0aGlzLm5leHQoKSx0aGlzLnN0YXRlLmxhYmVscy5wdXNoKEV0KTtsZXQgZT0tMTtpZih0aGlzLmlzQXdhaXRBbGxvd2VkKCkmJnRoaXMuZWF0Q29udGV4dHVhbChcImF3YWl0XCIpJiYoZT10aGlzLnN0YXRlLmxhc3RUb2tTdGFydCksdGhpcy5zY29wZS5lbnRlcigwKSx0aGlzLmV4cGVjdChuLnBhcmVuTCksdGhpcy5tYXRjaChuLnNlbWkpKXJldHVybiBlPi0xJiZ0aGlzLnVuZXhwZWN0ZWQoZSksdGhpcy5wYXJzZUZvcih0LG51bGwpO2NvbnN0IHM9dGhpcy5pc0xldCgpO2lmKHRoaXMubWF0Y2gobi5fdmFyKXx8dGhpcy5tYXRjaChuLl9jb25zdCl8fHMpe2NvbnN0IGk9dGhpcy5zdGFydE5vZGUoKSxyPXM/XCJsZXRcIjp0aGlzLnN0YXRlLnZhbHVlO3JldHVybiB0aGlzLm5leHQoKSx0aGlzLnBhcnNlVmFyKGksITAsciksdGhpcy5maW5pc2hOb2RlKGksXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpLCh0aGlzLm1hdGNoKG4uX2luKXx8dGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkmJjE9PT1pLmRlY2xhcmF0aW9ucy5sZW5ndGg/dGhpcy5wYXJzZUZvckluKHQsaSxlKTooZT4tMSYmdGhpcy51bmV4cGVjdGVkKGUpLHRoaXMucGFyc2VGb3IodCxpKSl9Y29uc3QgaT1uZXcgeHQscj10aGlzLnBhcnNlRXhwcmVzc2lvbighMCxpKTtpZih0aGlzLm1hdGNoKG4uX2luKXx8dGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSl7dGhpcy50b0Fzc2lnbmFibGUocik7Y29uc3Qgcz10aGlzLmlzQ29udGV4dHVhbChcIm9mXCIpP1wiZm9yLW9mIHN0YXRlbWVudFwiOlwiZm9yLWluIHN0YXRlbWVudFwiO3JldHVybiB0aGlzLmNoZWNrTFZhbChyLHZvaWQgMCx2b2lkIDAscyksdGhpcy5wYXJzZUZvckluKHQscixlKX1yZXR1cm4gdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMoaSwhMCksZT4tMSYmdGhpcy51bmV4cGVjdGVkKGUpLHRoaXMucGFyc2VGb3IodCxyKX1wYXJzZUZ1bmN0aW9uU3RhdGVtZW50KHQsZSxzKXtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5wYXJzZUZ1bmN0aW9uKHQsMXwocz8wOjIpLGUpfXBhcnNlSWZTdGF0ZW1lbnQodCl7cmV0dXJuIHRoaXMubmV4dCgpLHQudGVzdD10aGlzLnBhcnNlSGVhZGVyRXhwcmVzc2lvbigpLHQuY29uc2VxdWVudD10aGlzLnBhcnNlU3RhdGVtZW50KFwiaWZcIiksdC5hbHRlcm5hdGU9dGhpcy5lYXQobi5fZWxzZSk/dGhpcy5wYXJzZVN0YXRlbWVudChcImlmXCIpOm51bGwsdGhpcy5maW5pc2hOb2RlKHQsXCJJZlN0YXRlbWVudFwiKX1wYXJzZVJldHVyblN0YXRlbWVudCh0KXtyZXR1cm4gdGhpcy5wcm9kUGFyYW0uaGFzUmV0dXJufHx0aGlzLm9wdGlvbnMuYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb258fHRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLklsbGVnYWxSZXR1cm4pLHRoaXMubmV4dCgpLHRoaXMuaXNMaW5lVGVybWluYXRvcigpP3QuYXJndW1lbnQ9bnVsbDoodC5hcmd1bWVudD10aGlzLnBhcnNlRXhwcmVzc2lvbigpLHRoaXMuc2VtaWNvbG9uKCkpLHRoaXMuZmluaXNoTm9kZSh0LFwiUmV0dXJuU3RhdGVtZW50XCIpfXBhcnNlU3dpdGNoU3RhdGVtZW50KHQpe3RoaXMubmV4dCgpLHQuZGlzY3JpbWluYW50PXRoaXMucGFyc2VIZWFkZXJFeHByZXNzaW9uKCk7Y29uc3QgZT10LmNhc2VzPVtdO2xldCBzLGk7Zm9yKHRoaXMuZXhwZWN0KG4uYnJhY2VMKSx0aGlzLnN0YXRlLmxhYmVscy5wdXNoKEN0KSx0aGlzLnNjb3BlLmVudGVyKDApOyF0aGlzLm1hdGNoKG4uYnJhY2VSKTspaWYodGhpcy5tYXRjaChuLl9jYXNlKXx8dGhpcy5tYXRjaChuLl9kZWZhdWx0KSl7Y29uc3QgdD10aGlzLm1hdGNoKG4uX2Nhc2UpO3MmJnRoaXMuZmluaXNoTm9kZShzLFwiU3dpdGNoQ2FzZVwiKSxlLnB1c2gocz10aGlzLnN0YXJ0Tm9kZSgpKSxzLmNvbnNlcXVlbnQ9W10sdGhpcy5uZXh0KCksdD9zLnRlc3Q9dGhpcy5wYXJzZUV4cHJlc3Npb24oKTooaSYmdGhpcy5yYWlzZSh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCxmLk11bHRpcGxlRGVmYXVsdHNJblN3aXRjaCksaT0hMCxzLnRlc3Q9bnVsbCksdGhpcy5leHBlY3Qobi5jb2xvbil9ZWxzZSBzP3MuY29uc2VxdWVudC5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnQobnVsbCkpOnRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLnNjb3BlLmV4aXQoKSxzJiZ0aGlzLmZpbmlzaE5vZGUocyxcIlN3aXRjaENhc2VcIiksdGhpcy5uZXh0KCksdGhpcy5zdGF0ZS5sYWJlbHMucG9wKCksdGhpcy5maW5pc2hOb2RlKHQsXCJTd2l0Y2hTdGF0ZW1lbnRcIil9cGFyc2VUaHJvd1N0YXRlbWVudCh0KXtyZXR1cm4gdGhpcy5uZXh0KCksby50ZXN0KHRoaXMuaW5wdXQuc2xpY2UodGhpcy5zdGF0ZS5sYXN0VG9rRW5kLHRoaXMuc3RhdGUuc3RhcnQpKSYmdGhpcy5yYWlzZSh0aGlzLnN0YXRlLmxhc3RUb2tFbmQsZi5OZXdsaW5lQWZ0ZXJUaHJvdyksdC5hcmd1bWVudD10aGlzLnBhcnNlRXhwcmVzc2lvbigpLHRoaXMuc2VtaWNvbG9uKCksdGhpcy5maW5pc2hOb2RlKHQsXCJUaHJvd1N0YXRlbWVudFwiKX1wYXJzZVRyeVN0YXRlbWVudCh0KXtpZih0aGlzLm5leHQoKSx0LmJsb2NrPXRoaXMucGFyc2VCbG9jaygpLHQuaGFuZGxlcj1udWxsLHRoaXMubWF0Y2gobi5fY2F0Y2gpKXtjb25zdCBlPXRoaXMuc3RhcnROb2RlKCk7aWYodGhpcy5uZXh0KCksdGhpcy5tYXRjaChuLnBhcmVuTCkpe3RoaXMuZXhwZWN0KG4ucGFyZW5MKSxlLnBhcmFtPXRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO2NvbnN0IHQ9XCJJZGVudGlmaWVyXCI9PT1lLnBhcmFtLnR5cGU7dGhpcy5zY29wZS5lbnRlcih0Pzg6MCksdGhpcy5jaGVja0xWYWwoZS5wYXJhbSw5LG51bGwsXCJjYXRjaCBjbGF1c2VcIiksdGhpcy5leHBlY3Qobi5wYXJlblIpfWVsc2UgZS5wYXJhbT1udWxsLHRoaXMuc2NvcGUuZW50ZXIoMCk7ZS5ib2R5PXRoaXMud2l0aFRvcGljRm9yYmlkZGluZ0NvbnRleHQoKCk9PnRoaXMucGFyc2VCbG9jayghMSwhMSkpLHRoaXMuc2NvcGUuZXhpdCgpLHQuaGFuZGxlcj10aGlzLmZpbmlzaE5vZGUoZSxcIkNhdGNoQ2xhdXNlXCIpfXJldHVybiB0LmZpbmFsaXplcj10aGlzLmVhdChuLl9maW5hbGx5KT90aGlzLnBhcnNlQmxvY2soKTpudWxsLHQuaGFuZGxlcnx8dC5maW5hbGl6ZXJ8fHRoaXMucmFpc2UodC5zdGFydCxmLk5vQ2F0Y2hPckZpbmFsbHkpLHRoaXMuZmluaXNoTm9kZSh0LFwiVHJ5U3RhdGVtZW50XCIpfXBhcnNlVmFyU3RhdGVtZW50KHQsZSl7cmV0dXJuIHRoaXMubmV4dCgpLHRoaXMucGFyc2VWYXIodCwhMSxlKSx0aGlzLnNlbWljb2xvbigpLHRoaXMuZmluaXNoTm9kZSh0LFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKX1wYXJzZVdoaWxlU3RhdGVtZW50KHQpe3JldHVybiB0aGlzLm5leHQoKSx0LnRlc3Q9dGhpcy5wYXJzZUhlYWRlckV4cHJlc3Npb24oKSx0aGlzLnN0YXRlLmxhYmVscy5wdXNoKEV0KSx0LmJvZHk9dGhpcy53aXRoVG9waWNGb3JiaWRkaW5nQ29udGV4dCgoKT0+dGhpcy5wYXJzZVN0YXRlbWVudChcIndoaWxlXCIpKSx0aGlzLnN0YXRlLmxhYmVscy5wb3AoKSx0aGlzLmZpbmlzaE5vZGUodCxcIldoaWxlU3RhdGVtZW50XCIpfXBhcnNlV2l0aFN0YXRlbWVudCh0KXtyZXR1cm4gdGhpcy5zdGF0ZS5zdHJpY3QmJnRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLlN0cmljdFdpdGgpLHRoaXMubmV4dCgpLHQub2JqZWN0PXRoaXMucGFyc2VIZWFkZXJFeHByZXNzaW9uKCksdC5ib2R5PXRoaXMud2l0aFRvcGljRm9yYmlkZGluZ0NvbnRleHQoKCk9PnRoaXMucGFyc2VTdGF0ZW1lbnQoXCJ3aXRoXCIpKSx0aGlzLmZpbmlzaE5vZGUodCxcIldpdGhTdGF0ZW1lbnRcIil9cGFyc2VFbXB0eVN0YXRlbWVudCh0KXtyZXR1cm4gdGhpcy5uZXh0KCksdGhpcy5maW5pc2hOb2RlKHQsXCJFbXB0eVN0YXRlbWVudFwiKX1wYXJzZUxhYmVsZWRTdGF0ZW1lbnQodCxlLHMsaSl7Zm9yKGxldCB0PTAsaT10aGlzLnN0YXRlLmxhYmVsczt0PGkubGVuZ3RoO3QrKyl7aVt0XS5uYW1lPT09ZSYmdGhpcy5yYWlzZShzLnN0YXJ0LGYuTGFiZWxSZWRlY2xhcmF0aW9uLGUpfWNvbnN0IHI9dGhpcy5zdGF0ZS50eXBlLmlzTG9vcD9cImxvb3BcIjp0aGlzLm1hdGNoKG4uX3N3aXRjaCk/XCJzd2l0Y2hcIjpudWxsO2ZvcihsZXQgZT10aGlzLnN0YXRlLmxhYmVscy5sZW5ndGgtMTtlPj0wO2UtLSl7Y29uc3Qgcz10aGlzLnN0YXRlLmxhYmVsc1tlXTtpZihzLnN0YXRlbWVudFN0YXJ0IT09dC5zdGFydClicmVhaztzLnN0YXRlbWVudFN0YXJ0PXRoaXMuc3RhdGUuc3RhcnQscy5raW5kPXJ9cmV0dXJuIHRoaXMuc3RhdGUubGFiZWxzLnB1c2goe25hbWU6ZSxraW5kOnIsc3RhdGVtZW50U3RhcnQ6dGhpcy5zdGF0ZS5zdGFydH0pLHQuYm9keT10aGlzLnBhcnNlU3RhdGVtZW50KGk/LTE9PT1pLmluZGV4T2YoXCJsYWJlbFwiKT9pK1wibGFiZWxcIjppOlwibGFiZWxcIiksdGhpcy5zdGF0ZS5sYWJlbHMucG9wKCksdC5sYWJlbD1zLHRoaXMuZmluaXNoTm9kZSh0LFwiTGFiZWxlZFN0YXRlbWVudFwiKX1wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQodCxlKXtyZXR1cm4gdC5leHByZXNzaW9uPWUsdGhpcy5zZW1pY29sb24oKSx0aGlzLmZpbmlzaE5vZGUodCxcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIil9cGFyc2VCbG9jayh0PSExLGU9ITAscyl7Y29uc3QgaT10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiB0aGlzLmV4cGVjdChuLmJyYWNlTCksZSYmdGhpcy5zY29wZS5lbnRlcigwKSx0aGlzLnBhcnNlQmxvY2tCb2R5KGksdCwhMSxuLmJyYWNlUixzKSxlJiZ0aGlzLnNjb3BlLmV4aXQoKSx0aGlzLmZpbmlzaE5vZGUoaSxcIkJsb2NrU3RhdGVtZW50XCIpfWlzVmFsaWREaXJlY3RpdmUodCl7cmV0dXJuXCJFeHByZXNzaW9uU3RhdGVtZW50XCI9PT10LnR5cGUmJlwiU3RyaW5nTGl0ZXJhbFwiPT09dC5leHByZXNzaW9uLnR5cGUmJiF0LmV4cHJlc3Npb24uZXh0cmEucGFyZW50aGVzaXplZH1wYXJzZUJsb2NrQm9keSh0LGUscyxpLHIpe2NvbnN0IGE9dC5ib2R5PVtdLG49dC5kaXJlY3RpdmVzPVtdO3RoaXMucGFyc2VCbG9ja09yTW9kdWxlQmxvY2tCb2R5KGEsZT9uOnZvaWQgMCxzLGkscil9cGFyc2VCbG9ja09yTW9kdWxlQmxvY2tCb2R5KHQsZSxzLGkscil7Y29uc3QgYT1bXSxuPXRoaXMuc3RhdGUuc3RyaWN0O2xldCBvPSExLGg9ITE7Zm9yKDshdGhpcy5tYXRjaChpKTspeyFoJiZ0aGlzLnN0YXRlLm9jdGFsUG9zaXRpb25zLmxlbmd0aCYmYS5wdXNoKC4uLnRoaXMuc3RhdGUub2N0YWxQb3NpdGlvbnMpO2NvbnN0IGk9dGhpcy5wYXJzZVN0YXRlbWVudChudWxsLHMpO2lmKGUmJiFoJiZ0aGlzLmlzVmFsaWREaXJlY3RpdmUoaSkpe2NvbnN0IHQ9dGhpcy5zdG10VG9EaXJlY3RpdmUoaSk7ZS5wdXNoKHQpLG98fFwidXNlIHN0cmljdFwiIT09dC52YWx1ZS52YWx1ZXx8KG89ITAsdGhpcy5zZXRTdHJpY3QoITApKX1lbHNlIGg9ITAsdC5wdXNoKGkpfWlmKHRoaXMuc3RhdGUuc3RyaWN0JiZhLmxlbmd0aClmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrKyl7Y29uc3QgZT1hW3RdO3RoaXMucmFpc2UoZSxmLlN0cmljdE9jdGFsTGl0ZXJhbCl9ciYmci5jYWxsKHRoaXMsbyksbnx8dGhpcy5zZXRTdHJpY3QoITEpLHRoaXMubmV4dCgpfXBhcnNlRm9yKHQsZSl7cmV0dXJuIHQuaW5pdD1lLHRoaXMuZXhwZWN0KG4uc2VtaSksdC50ZXN0PXRoaXMubWF0Y2gobi5zZW1pKT9udWxsOnRoaXMucGFyc2VFeHByZXNzaW9uKCksdGhpcy5leHBlY3Qobi5zZW1pKSx0LnVwZGF0ZT10aGlzLm1hdGNoKG4ucGFyZW5SKT9udWxsOnRoaXMucGFyc2VFeHByZXNzaW9uKCksdGhpcy5leHBlY3Qobi5wYXJlblIpLHQuYm9keT10aGlzLndpdGhUb3BpY0ZvcmJpZGRpbmdDb250ZXh0KCgpPT50aGlzLnBhcnNlU3RhdGVtZW50KFwiZm9yXCIpKSx0aGlzLnNjb3BlLmV4aXQoKSx0aGlzLnN0YXRlLmxhYmVscy5wb3AoKSx0aGlzLmZpbmlzaE5vZGUodCxcIkZvclN0YXRlbWVudFwiKX1wYXJzZUZvckluKHQsZSxzKXtjb25zdCBpPXRoaXMubWF0Y2gobi5faW4pO3JldHVybiB0aGlzLm5leHQoKSxpP3M+LTEmJnRoaXMudW5leHBlY3RlZChzKTp0LmF3YWl0PXM+LTEsXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIhPT1lLnR5cGV8fG51bGw9PWUuZGVjbGFyYXRpb25zWzBdLmluaXR8fGkmJiF0aGlzLnN0YXRlLnN0cmljdCYmXCJ2YXJcIj09PWUua2luZCYmXCJJZGVudGlmaWVyXCI9PT1lLmRlY2xhcmF0aW9uc1swXS5pZC50eXBlP1wiQXNzaWdubWVudFBhdHRlcm5cIj09PWUudHlwZSYmdGhpcy5yYWlzZShlLnN0YXJ0LGYuSW52YWxpZExocyxcImZvci1sb29wXCIpOnRoaXMucmFpc2UoZS5zdGFydCxmLkZvckluT2ZMb29wSW5pdGlhbGl6ZXIsaT9cImZvci1pblwiOlwiZm9yLW9mXCIpLHQubGVmdD1lLHQucmlnaHQ9aT90aGlzLnBhcnNlRXhwcmVzc2lvbigpOnRoaXMucGFyc2VNYXliZUFzc2lnbigpLHRoaXMuZXhwZWN0KG4ucGFyZW5SKSx0LmJvZHk9dGhpcy53aXRoVG9waWNGb3JiaWRkaW5nQ29udGV4dCgoKT0+dGhpcy5wYXJzZVN0YXRlbWVudChcImZvclwiKSksdGhpcy5zY29wZS5leGl0KCksdGhpcy5zdGF0ZS5sYWJlbHMucG9wKCksdGhpcy5maW5pc2hOb2RlKHQsaT9cIkZvckluU3RhdGVtZW50XCI6XCJGb3JPZlN0YXRlbWVudFwiKX1wYXJzZVZhcih0LGUscyl7Y29uc3QgaT10LmRlY2xhcmF0aW9ucz1bXSxyPXRoaXMuaGFzUGx1Z2luKFwidHlwZXNjcmlwdFwiKTtmb3IodC5raW5kPXM7Oyl7Y29uc3QgdD10aGlzLnN0YXJ0Tm9kZSgpO2lmKHRoaXMucGFyc2VWYXJJZCh0LHMpLHRoaXMuZWF0KG4uZXEpP3QuaW5pdD10aGlzLnBhcnNlTWF5YmVBc3NpZ24oZSk6KFwiY29uc3RcIiE9PXN8fHRoaXMubWF0Y2gobi5faW4pfHx0aGlzLmlzQ29udGV4dHVhbChcIm9mXCIpP1wiSWRlbnRpZmllclwiPT09dC5pZC50eXBlfHxlJiYodGhpcy5tYXRjaChuLl9pbil8fHRoaXMuaXNDb250ZXh0dWFsKFwib2ZcIikpfHx0aGlzLnJhaXNlKHRoaXMuc3RhdGUubGFzdFRva0VuZCxmLkRlY2xhcmF0aW9uTWlzc2luZ0luaXRpYWxpemVyLFwiQ29tcGxleCBiaW5kaW5nIHBhdHRlcm5zXCIpOnJ8fHRoaXMudW5leHBlY3RlZCgpLHQuaW5pdD1udWxsKSxpLnB1c2godGhpcy5maW5pc2hOb2RlKHQsXCJWYXJpYWJsZURlY2xhcmF0b3JcIikpLCF0aGlzLmVhdChuLmNvbW1hKSlicmVha31yZXR1cm4gdH1wYXJzZVZhcklkKHQsZSl7dC5pZD10aGlzLnBhcnNlQmluZGluZ0F0b20oKSx0aGlzLmNoZWNrTFZhbCh0LmlkLFwidmFyXCI9PT1lPzU6OSx2b2lkIDAsXCJ2YXJpYWJsZSBkZWNsYXJhdGlvblwiLFwidmFyXCIhPT1lKX1wYXJzZUZ1bmN0aW9uKHQsZT0wLHM9ITEpe2NvbnN0IGk9MSZlLHI9MiZlLGE9ISghaXx8NCZlKTt0aGlzLmluaXRGdW5jdGlvbih0LHMpLHRoaXMubWF0Y2gobi5zdGFyKSYmciYmdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LGYuR2VuZXJhdG9ySW5TaW5nbGVTdGF0ZW1lbnRDb250ZXh0KSx0LmdlbmVyYXRvcj10aGlzLmVhdChuLnN0YXIpLGkmJih0LmlkPXRoaXMucGFyc2VGdW5jdGlvbklkKGEpKTtjb25zdCBvPXRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycyxoPXRoaXMuc3RhdGUueWllbGRQb3MscD10aGlzLnN0YXRlLmF3YWl0UG9zO3JldHVybiB0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnM9ITEsdGhpcy5zdGF0ZS55aWVsZFBvcz0tMSx0aGlzLnN0YXRlLmF3YWl0UG9zPS0xLHRoaXMuc2NvcGUuZW50ZXIoMiksdGhpcy5wcm9kUGFyYW0uZW50ZXIoZXQocyx0LmdlbmVyYXRvcikpLGl8fCh0LmlkPXRoaXMucGFyc2VGdW5jdGlvbklkKCkpLHRoaXMucGFyc2VGdW5jdGlvblBhcmFtcyh0KSx0aGlzLndpdGhUb3BpY0ZvcmJpZGRpbmdDb250ZXh0KCgpPT57dGhpcy5wYXJzZUZ1bmN0aW9uQm9keUFuZEZpbmlzaCh0LGk/XCJGdW5jdGlvbkRlY2xhcmF0aW9uXCI6XCJGdW5jdGlvbkV4cHJlc3Npb25cIil9KSx0aGlzLnByb2RQYXJhbS5leGl0KCksdGhpcy5zY29wZS5leGl0KCksaSYmIXImJnRoaXMucmVnaXN0ZXJGdW5jdGlvblN0YXRlbWVudElkKHQpLHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycz1vLHRoaXMuc3RhdGUueWllbGRQb3M9aCx0aGlzLnN0YXRlLmF3YWl0UG9zPXAsdH1wYXJzZUZ1bmN0aW9uSWQodCl7cmV0dXJuIHR8fHRoaXMubWF0Y2gobi5uYW1lKT90aGlzLnBhcnNlSWRlbnRpZmllcigpOm51bGx9cGFyc2VGdW5jdGlvblBhcmFtcyh0LGUpe2NvbnN0IHM9dGhpcy5zdGF0ZS5pblBhcmFtZXRlcnM7dGhpcy5zdGF0ZS5pblBhcmFtZXRlcnM9ITAsdGhpcy5leHBlY3Qobi5wYXJlbkwpLHQucGFyYW1zPXRoaXMucGFyc2VCaW5kaW5nTGlzdChuLnBhcmVuUiw0MSwhMSxlKSx0aGlzLnN0YXRlLmluUGFyYW1ldGVycz1zLHRoaXMuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCl9cmVnaXN0ZXJGdW5jdGlvblN0YXRlbWVudElkKHQpe3QuaWQmJnRoaXMuc2NvcGUuZGVjbGFyZU5hbWUodC5pZC5uYW1lLHRoaXMuc3RhdGUuc3RyaWN0fHx0LmdlbmVyYXRvcnx8dC5hc3luYz90aGlzLnNjb3BlLnRyZWF0RnVuY3Rpb25zQXNWYXI/NTo5OjE3LHQuaWQuc3RhcnQpfXBhcnNlQ2xhc3ModCxlLHMpe3RoaXMubmV4dCgpLHRoaXMudGFrZURlY29yYXRvcnModCk7Y29uc3QgaT10aGlzLnN0YXRlLnN0cmljdDtyZXR1cm4gdGhpcy5zdGF0ZS5zdHJpY3Q9ITAsdGhpcy5wYXJzZUNsYXNzSWQodCxlLHMpLHRoaXMucGFyc2VDbGFzc1N1cGVyKHQpLHQuYm9keT10aGlzLnBhcnNlQ2xhc3NCb2R5KCEhdC5zdXBlckNsYXNzLGkpLHRoaXMuc3RhdGUuc3RyaWN0PWksdGhpcy5maW5pc2hOb2RlKHQsZT9cIkNsYXNzRGVjbGFyYXRpb25cIjpcIkNsYXNzRXhwcmVzc2lvblwiKX1pc0NsYXNzUHJvcGVydHkoKXtyZXR1cm4gdGhpcy5tYXRjaChuLmVxKXx8dGhpcy5tYXRjaChuLnNlbWkpfHx0aGlzLm1hdGNoKG4uYnJhY2VSKX1pc0NsYXNzTWV0aG9kKCl7cmV0dXJuIHRoaXMubWF0Y2gobi5wYXJlbkwpfWlzTm9uc3RhdGljQ29uc3RydWN0b3IodCl7cmV0dXJuISh0LmNvbXB1dGVkfHx0LnN0YXRpY3x8XCJjb25zdHJ1Y3RvclwiIT09dC5rZXkubmFtZSYmXCJjb25zdHJ1Y3RvclwiIT09dC5rZXkudmFsdWUpfXBhcnNlQ2xhc3NCb2R5KHQsZSl7dGhpcy5jbGFzc1Njb3BlLmVudGVyKCk7Y29uc3Qgcz17aGFkQ29uc3RydWN0b3I6ITF9O2xldCBpPVtdO2NvbnN0IHI9dGhpcy5zdGFydE5vZGUoKTtpZihyLmJvZHk9W10sdGhpcy5leHBlY3Qobi5icmFjZUwpLHRoaXMud2l0aFRvcGljRm9yYmlkZGluZ0NvbnRleHQoKCk9Pntmb3IoOyF0aGlzLm1hdGNoKG4uYnJhY2VSKTspe2lmKHRoaXMuZWF0KG4uc2VtaSkpe2lmKGkubGVuZ3RoPjApdGhyb3cgdGhpcy5yYWlzZSh0aGlzLnN0YXRlLmxhc3RUb2tFbmQsZi5EZWNvcmF0b3JTZW1pY29sb24pO2NvbnRpbnVlfWlmKHRoaXMubWF0Y2gobi5hdCkpe2kucHVzaCh0aGlzLnBhcnNlRGVjb3JhdG9yKCkpO2NvbnRpbnVlfWNvbnN0IGU9dGhpcy5zdGFydE5vZGUoKTtpLmxlbmd0aCYmKGUuZGVjb3JhdG9ycz1pLHRoaXMucmVzZXRTdGFydExvY2F0aW9uRnJvbU5vZGUoZSxpWzBdKSxpPVtdKSx0aGlzLnBhcnNlQ2xhc3NNZW1iZXIocixlLHMsdCksXCJjb25zdHJ1Y3RvclwiPT09ZS5raW5kJiZlLmRlY29yYXRvcnMmJmUuZGVjb3JhdG9ycy5sZW5ndGg+MCYmdGhpcy5yYWlzZShlLnN0YXJ0LGYuRGVjb3JhdG9yQ29uc3RydWN0b3IpfX0pLGV8fCh0aGlzLnN0YXRlLnN0cmljdD0hMSksdGhpcy5uZXh0KCksaS5sZW5ndGgpdGhyb3cgdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LGYuVHJhaWxpbmdEZWNvcmF0b3IpO3JldHVybiB0aGlzLmNsYXNzU2NvcGUuZXhpdCgpLHRoaXMuZmluaXNoTm9kZShyLFwiQ2xhc3NCb2R5XCIpfXBhcnNlQ2xhc3NNZW1iZXJGcm9tTW9kaWZpZXIodCxlKXtjb25zdCBzPXRoaXMuc3RhdGUuY29udGFpbnNFc2MsaT10aGlzLnBhcnNlSWRlbnRpZmllcighMCk7aWYodGhpcy5pc0NsYXNzTWV0aG9kKCkpe2NvbnN0IHM9ZTtyZXR1cm4gcy5raW5kPVwibWV0aG9kXCIscy5jb21wdXRlZD0hMSxzLmtleT1pLHMuc3RhdGljPSExLHRoaXMucHVzaENsYXNzTWV0aG9kKHQscywhMSwhMSwhMSwhMSksITB9aWYodGhpcy5pc0NsYXNzUHJvcGVydHkoKSl7Y29uc3Qgcz1lO3JldHVybiBzLmNvbXB1dGVkPSExLHMua2V5PWkscy5zdGF0aWM9ITEsdC5ib2R5LnB1c2godGhpcy5wYXJzZUNsYXNzUHJvcGVydHkocykpLCEwfWlmKHMpdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuITF9cGFyc2VDbGFzc01lbWJlcih0LGUscyxpKXtjb25zdCByPXRoaXMuaXNDb250ZXh0dWFsKFwic3RhdGljXCIpO3ImJnRoaXMucGFyc2VDbGFzc01lbWJlckZyb21Nb2RpZmllcih0LGUpfHx0aGlzLnBhcnNlQ2xhc3NNZW1iZXJXaXRoSXNTdGF0aWModCxlLHMscixpKX1wYXJzZUNsYXNzTWVtYmVyV2l0aElzU3RhdGljKHQsZSxzLGkscil7Y29uc3QgYT1lLG89ZSxoPWUscD1lLGM9YSx1PWE7aWYoZS5zdGF0aWM9aSx0aGlzLmVhdChuLnN0YXIpKXJldHVybiBjLmtpbmQ9XCJtZXRob2RcIix0aGlzLnBhcnNlQ2xhc3NQcm9wZXJ0eU5hbWUoYyksXCJQcml2YXRlTmFtZVwiPT09Yy5rZXkudHlwZT92b2lkIHRoaXMucHVzaENsYXNzUHJpdmF0ZU1ldGhvZCh0LG8sITAsITEpOih0aGlzLmlzTm9uc3RhdGljQ29uc3RydWN0b3IoYSkmJnRoaXMucmFpc2UoYS5rZXkuc3RhcnQsZi5Db25zdHJ1Y3RvcklzR2VuZXJhdG9yKSx2b2lkIHRoaXMucHVzaENsYXNzTWV0aG9kKHQsYSwhMCwhMSwhMSwhMSkpO2NvbnN0IGw9dGhpcy5zdGF0ZS5jb250YWluc0VzYyxkPXRoaXMucGFyc2VDbGFzc1Byb3BlcnR5TmFtZShlKSxtPVwiUHJpdmF0ZU5hbWVcIj09PWQudHlwZSxEPVwiSWRlbnRpZmllclwiPT09ZC50eXBlLHk9dGhpcy5zdGF0ZS5zdGFydDtpZih0aGlzLnBhcnNlUG9zdE1lbWJlck5hbWVNb2RpZmllcnModSksdGhpcy5pc0NsYXNzTWV0aG9kKCkpe2lmKGMua2luZD1cIm1ldGhvZFwiLG0pcmV0dXJuIHZvaWQgdGhpcy5wdXNoQ2xhc3NQcml2YXRlTWV0aG9kKHQsbywhMSwhMSk7Y29uc3QgZT10aGlzLmlzTm9uc3RhdGljQ29uc3RydWN0b3IoYSk7bGV0IGk9ITE7ZSYmKGEua2luZD1cImNvbnN0cnVjdG9yXCIscy5oYWRDb25zdHJ1Y3RvciYmIXRoaXMuaGFzUGx1Z2luKFwidHlwZXNjcmlwdFwiKSYmdGhpcy5yYWlzZShkLnN0YXJ0LGYuRHVwbGljYXRlQ29uc3RydWN0b3IpLHMuaGFkQ29uc3RydWN0b3I9ITAsaT1yKSx0aGlzLnB1c2hDbGFzc01ldGhvZCh0LGEsITEsITEsZSxpKX1lbHNlIGlmKHRoaXMuaXNDbGFzc1Byb3BlcnR5KCkpbT90aGlzLnB1c2hDbGFzc1ByaXZhdGVQcm9wZXJ0eSh0LHApOnRoaXMucHVzaENsYXNzUHJvcGVydHkodCxoKTtlbHNlIGlmKCFEfHxcImFzeW5jXCIhPT1kLm5hbWV8fGx8fHRoaXMuaXNMaW5lVGVybWluYXRvcigpKSFEfHxcImdldFwiIT09ZC5uYW1lJiZcInNldFwiIT09ZC5uYW1lfHxsfHx0aGlzLm1hdGNoKG4uc3RhcikmJnRoaXMuaXNMaW5lVGVybWluYXRvcigpP3RoaXMuaXNMaW5lVGVybWluYXRvcigpP20/dGhpcy5wdXNoQ2xhc3NQcml2YXRlUHJvcGVydHkodCxwKTp0aGlzLnB1c2hDbGFzc1Byb3BlcnR5KHQsaCk6dGhpcy51bmV4cGVjdGVkKCk6KGMua2luZD1kLm5hbWUsdGhpcy5wYXJzZUNsYXNzUHJvcGVydHlOYW1lKGEpLFwiUHJpdmF0ZU5hbWVcIj09PWMua2V5LnR5cGU/dGhpcy5wdXNoQ2xhc3NQcml2YXRlTWV0aG9kKHQsbywhMSwhMSk6KHRoaXMuaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihhKSYmdGhpcy5yYWlzZShhLmtleS5zdGFydCxmLkNvbnN0cnVjdG9ySXNBY2Nlc3NvciksdGhpcy5wdXNoQ2xhc3NNZXRob2QodCxhLCExLCExLCExLCExKSksdGhpcy5jaGVja0dldHRlclNldHRlclBhcmFtcyhhKSk7ZWxzZXtjb25zdCBlPXRoaXMuZWF0KG4uc3Rhcik7dS5vcHRpb25hbCYmdGhpcy51bmV4cGVjdGVkKHkpLGMua2luZD1cIm1ldGhvZFwiLHRoaXMucGFyc2VDbGFzc1Byb3BlcnR5TmFtZShjKSx0aGlzLnBhcnNlUG9zdE1lbWJlck5hbWVNb2RpZmllcnModSksXCJQcml2YXRlTmFtZVwiPT09Yy5rZXkudHlwZT90aGlzLnB1c2hDbGFzc1ByaXZhdGVNZXRob2QodCxvLGUsITApOih0aGlzLmlzTm9uc3RhdGljQ29uc3RydWN0b3IoYSkmJnRoaXMucmFpc2UoYS5rZXkuc3RhcnQsZi5Db25zdHJ1Y3RvcklzQXN5bmMpLHRoaXMucHVzaENsYXNzTWV0aG9kKHQsYSxlLCEwLCExLCExKSl9fXBhcnNlQ2xhc3NQcm9wZXJ0eU5hbWUodCl7Y29uc3QgZT10aGlzLnBhcnNlUHJvcGVydHlOYW1lKHQsITApO3JldHVybiB0LmNvbXB1dGVkfHwhdC5zdGF0aWN8fFwicHJvdG90eXBlXCIhPT1lLm5hbWUmJlwicHJvdG90eXBlXCIhPT1lLnZhbHVlfHx0aGlzLnJhaXNlKGUuc3RhcnQsZi5TdGF0aWNQcm90b3R5cGUpLFwiUHJpdmF0ZU5hbWVcIj09PWUudHlwZSYmXCJjb25zdHJ1Y3RvclwiPT09ZS5pZC5uYW1lJiZ0aGlzLnJhaXNlKGUuc3RhcnQsZi5Db25zdHJ1Y3RvckNsYXNzUHJpdmF0ZUZpZWxkKSxlfXB1c2hDbGFzc1Byb3BlcnR5KHQsZSl7ZS5jb21wdXRlZHx8XCJjb25zdHJ1Y3RvclwiIT09ZS5rZXkubmFtZSYmXCJjb25zdHJ1Y3RvclwiIT09ZS5rZXkudmFsdWV8fHRoaXMucmFpc2UoZS5rZXkuc3RhcnQsZi5Db25zdHJ1Y3RvckNsYXNzRmllbGQpLHQuYm9keS5wdXNoKHRoaXMucGFyc2VDbGFzc1Byb3BlcnR5KGUpKX1wdXNoQ2xhc3NQcml2YXRlUHJvcGVydHkodCxlKXt0aGlzLmV4cGVjdFBsdWdpbihcImNsYXNzUHJpdmF0ZVByb3BlcnRpZXNcIixlLmtleS5zdGFydCk7Y29uc3Qgcz10aGlzLnBhcnNlQ2xhc3NQcml2YXRlUHJvcGVydHkoZSk7dC5ib2R5LnB1c2gocyksdGhpcy5jbGFzc1Njb3BlLmRlY2xhcmVQcml2YXRlTmFtZShzLmtleS5pZC5uYW1lLDAscy5rZXkuc3RhcnQpfXB1c2hDbGFzc01ldGhvZCh0LGUscyxpLHIsYSl7dC5ib2R5LnB1c2godGhpcy5wYXJzZU1ldGhvZChlLHMsaSxyLGEsXCJDbGFzc01ldGhvZFwiLCEwKSl9cHVzaENsYXNzUHJpdmF0ZU1ldGhvZCh0LGUscyxpKXt0aGlzLmV4cGVjdFBsdWdpbihcImNsYXNzUHJpdmF0ZU1ldGhvZHNcIixlLmtleS5zdGFydCk7Y29uc3Qgcj10aGlzLnBhcnNlTWV0aG9kKGUscyxpLCExLCExLFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsITApO3QuYm9keS5wdXNoKHIpO2NvbnN0IGE9XCJnZXRcIj09PXIua2luZD9yLnN0YXRpYz82OjI6XCJzZXRcIj09PXIua2luZD9yLnN0YXRpYz81OjE6MDt0aGlzLmNsYXNzU2NvcGUuZGVjbGFyZVByaXZhdGVOYW1lKHIua2V5LmlkLm5hbWUsYSxyLmtleS5zdGFydCl9cGFyc2VQb3N0TWVtYmVyTmFtZU1vZGlmaWVycyh0KXt9cGFyc2VBY2Nlc3NNb2RpZmllcigpe31wYXJzZUNsYXNzUHJpdmF0ZVByb3BlcnR5KHQpe3JldHVybiB0aGlzLnNjb3BlLmVudGVyKDgwKSx0aGlzLnByb2RQYXJhbS5lbnRlcigwKSx0LnZhbHVlPXRoaXMuZWF0KG4uZXEpP3RoaXMucGFyc2VNYXliZUFzc2lnbigpOm51bGwsdGhpcy5zZW1pY29sb24oKSx0aGlzLnByb2RQYXJhbS5leGl0KCksdGhpcy5zY29wZS5leGl0KCksdGhpcy5maW5pc2hOb2RlKHQsXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiKX1wYXJzZUNsYXNzUHJvcGVydHkodCl7cmV0dXJuIHQudHlwZUFubm90YXRpb258fHRoaXMuZXhwZWN0UGx1Z2luKFwiY2xhc3NQcm9wZXJ0aWVzXCIpLHRoaXMuc2NvcGUuZW50ZXIoODApLHRoaXMucHJvZFBhcmFtLmVudGVyKDApLHRoaXMubWF0Y2gobi5lcSk/KHRoaXMuZXhwZWN0UGx1Z2luKFwiY2xhc3NQcm9wZXJ0aWVzXCIpLHRoaXMubmV4dCgpLHQudmFsdWU9dGhpcy5wYXJzZU1heWJlQXNzaWduKCkpOnQudmFsdWU9bnVsbCx0aGlzLnNlbWljb2xvbigpLHRoaXMucHJvZFBhcmFtLmV4aXQoKSx0aGlzLnNjb3BlLmV4aXQoKSx0aGlzLmZpbmlzaE5vZGUodCxcIkNsYXNzUHJvcGVydHlcIil9cGFyc2VDbGFzc0lkKHQsZSxzLGk9MTM5KXt0aGlzLm1hdGNoKG4ubmFtZSk/KHQuaWQ9dGhpcy5wYXJzZUlkZW50aWZpZXIoKSxlJiZ0aGlzLmNoZWNrTFZhbCh0LmlkLGksdm9pZCAwLFwiY2xhc3MgbmFtZVwiKSk6c3x8IWU/dC5pZD1udWxsOnRoaXMudW5leHBlY3RlZChudWxsLGYuTWlzc2luZ0NsYXNzTmFtZSl9cGFyc2VDbGFzc1N1cGVyKHQpe3Quc3VwZXJDbGFzcz10aGlzLmVhdChuLl9leHRlbmRzKT90aGlzLnBhcnNlRXhwclN1YnNjcmlwdHMoKTpudWxsfXBhcnNlRXhwb3J0KHQpe2NvbnN0IGU9dGhpcy5tYXliZVBhcnNlRXhwb3J0RGVmYXVsdFNwZWNpZmllcih0KSxzPSFlfHx0aGlzLmVhdChuLmNvbW1hKSxpPXMmJnRoaXMuZWF0RXhwb3J0U3Rhcih0KSxyPWkmJnRoaXMubWF5YmVQYXJzZUV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcih0KSxhPXMmJighcnx8dGhpcy5lYXQobi5jb21tYSkpLG89ZXx8aTtpZihpJiYhcilyZXR1cm4gZSYmdGhpcy51bmV4cGVjdGVkKCksdGhpcy5wYXJzZUV4cG9ydEZyb20odCwhMCksdGhpcy5maW5pc2hOb2RlKHQsXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiKTtjb25zdCBoPXRoaXMubWF5YmVQYXJzZUV4cG9ydE5hbWVkU3BlY2lmaWVycyh0KTtpZihlJiZzJiYhaSYmIWh8fHImJmEmJiFoKXRocm93IHRoaXMudW5leHBlY3RlZChudWxsLG4uYnJhY2VMKTtsZXQgcDtpZihvfHxoPyhwPSExLHRoaXMucGFyc2VFeHBvcnRGcm9tKHQsbykpOnA9dGhpcy5tYXliZVBhcnNlRXhwb3J0RGVjbGFyYXRpb24odCksb3x8aHx8cClyZXR1cm4gdGhpcy5jaGVja0V4cG9ydCh0LCEwLCExLCEhdC5zb3VyY2UpLHRoaXMuZmluaXNoTm9kZSh0LFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiKTtpZih0aGlzLmVhdChuLl9kZWZhdWx0KSlyZXR1cm4gdC5kZWNsYXJhdGlvbj10aGlzLnBhcnNlRXhwb3J0RGVmYXVsdEV4cHJlc3Npb24oKSx0aGlzLmNoZWNrRXhwb3J0KHQsITAsITApLHRoaXMuZmluaXNoTm9kZSh0LFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIpO3Rocm93IHRoaXMudW5leHBlY3RlZChudWxsLG4uYnJhY2VMKX1lYXRFeHBvcnRTdGFyKHQpe3JldHVybiB0aGlzLmVhdChuLnN0YXIpfW1heWJlUGFyc2VFeHBvcnREZWZhdWx0U3BlY2lmaWVyKHQpe2lmKHRoaXMuaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCkpe3RoaXMuZXhwZWN0UGx1Z2luKFwiZXhwb3J0RGVmYXVsdEZyb21cIik7Y29uc3QgZT10aGlzLnN0YXJ0Tm9kZSgpO3JldHVybiBlLmV4cG9ydGVkPXRoaXMucGFyc2VJZGVudGlmaWVyKCEwKSx0LnNwZWNpZmllcnM9W3RoaXMuZmluaXNoTm9kZShlLFwiRXhwb3J0RGVmYXVsdFNwZWNpZmllclwiKV0sITB9cmV0dXJuITF9bWF5YmVQYXJzZUV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcih0KXtpZih0aGlzLmlzQ29udGV4dHVhbChcImFzXCIpKXt0LnNwZWNpZmllcnN8fCh0LnNwZWNpZmllcnM9W10pO2NvbnN0IGU9dGhpcy5zdGFydE5vZGVBdCh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCx0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyk7cmV0dXJuIHRoaXMubmV4dCgpLGUuZXhwb3J0ZWQ9dGhpcy5wYXJzZUlkZW50aWZpZXIoITApLHQuc3BlY2lmaWVycy5wdXNoKHRoaXMuZmluaXNoTm9kZShlLFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpKSwhMH1yZXR1cm4hMX1tYXliZVBhcnNlRXhwb3J0TmFtZWRTcGVjaWZpZXJzKHQpe3JldHVybiEhdGhpcy5tYXRjaChuLmJyYWNlTCkmJih0LnNwZWNpZmllcnN8fCh0LnNwZWNpZmllcnM9W10pLHQuc3BlY2lmaWVycy5wdXNoKC4uLnRoaXMucGFyc2VFeHBvcnRTcGVjaWZpZXJzKCkpLHQuc291cmNlPW51bGwsdC5kZWNsYXJhdGlvbj1udWxsLCEwKX1tYXliZVBhcnNlRXhwb3J0RGVjbGFyYXRpb24odCl7aWYodGhpcy5zaG91bGRQYXJzZUV4cG9ydERlY2xhcmF0aW9uKCkpe2lmKHRoaXMuaXNDb250ZXh0dWFsKFwiYXN5bmNcIikpe2NvbnN0IHQ9dGhpcy5uZXh0VG9rZW5TdGFydCgpO3RoaXMuaXNVbnBhcnNlZENvbnRleHR1YWwodCxcImZ1bmN0aW9uXCIpfHx0aGlzLnVuZXhwZWN0ZWQodCxuLl9mdW5jdGlvbil9cmV0dXJuIHQuc3BlY2lmaWVycz1bXSx0LnNvdXJjZT1udWxsLHQuZGVjbGFyYXRpb249dGhpcy5wYXJzZUV4cG9ydERlY2xhcmF0aW9uKHQpLCEwfXJldHVybiExfWlzQXN5bmNGdW5jdGlvbigpe2lmKCF0aGlzLmlzQ29udGV4dHVhbChcImFzeW5jXCIpKXJldHVybiExO2NvbnN0IHQ9dGhpcy5uZXh0VG9rZW5TdGFydCgpO3JldHVybiFvLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXRlLnBvcyx0KSkmJnRoaXMuaXNVbnBhcnNlZENvbnRleHR1YWwodCxcImZ1bmN0aW9uXCIpfXBhcnNlRXhwb3J0RGVmYXVsdEV4cHJlc3Npb24oKXtjb25zdCB0PXRoaXMuc3RhcnROb2RlKCksZT10aGlzLmlzQXN5bmNGdW5jdGlvbigpO2lmKHRoaXMubWF0Y2gobi5fZnVuY3Rpb24pfHxlKXJldHVybiB0aGlzLm5leHQoKSxlJiZ0aGlzLm5leHQoKSx0aGlzLnBhcnNlRnVuY3Rpb24odCw1LGUpO2lmKHRoaXMubWF0Y2gobi5fY2xhc3MpKXJldHVybiB0aGlzLnBhcnNlQ2xhc3ModCwhMCwhMCk7aWYodGhpcy5tYXRjaChuLmF0KSlyZXR1cm4gdGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzXCIpJiZ0aGlzLmdldFBsdWdpbk9wdGlvbihcImRlY29yYXRvcnNcIixcImRlY29yYXRvcnNCZWZvcmVFeHBvcnRcIikmJnRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLkRlY29yYXRvckJlZm9yZUV4cG9ydCksdGhpcy5wYXJzZURlY29yYXRvcnMoITEpLHRoaXMucGFyc2VDbGFzcyh0LCEwLCEwKTtpZih0aGlzLm1hdGNoKG4uX2NvbnN0KXx8dGhpcy5tYXRjaChuLl92YXIpfHx0aGlzLmlzTGV0KCkpdGhyb3cgdGhpcy5yYWlzZSh0aGlzLnN0YXRlLnN0YXJ0LGYuVW5zdXBwb3J0ZWREZWZhdWx0RXhwb3J0KTt7Y29uc3QgdD10aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtyZXR1cm4gdGhpcy5zZW1pY29sb24oKSx0fX1wYXJzZUV4cG9ydERlY2xhcmF0aW9uKHQpe3JldHVybiB0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwpfWlzRXhwb3J0RGVmYXVsdFNwZWNpZmllcigpe2lmKHRoaXMubWF0Y2gobi5uYW1lKSlyZXR1cm5cImFzeW5jXCIhPT10aGlzLnN0YXRlLnZhbHVlJiZcImxldFwiIT09dGhpcy5zdGF0ZS52YWx1ZTtpZighdGhpcy5tYXRjaChuLl9kZWZhdWx0KSlyZXR1cm4hMTtjb25zdCB0PXRoaXMubmV4dFRva2VuU3RhcnQoKTtyZXR1cm4gNDQ9PT10aGlzLmlucHV0LmNoYXJDb2RlQXQodCl8fHRoaXMuaXNVbnBhcnNlZENvbnRleHR1YWwodCxcImZyb21cIil9cGFyc2VFeHBvcnRGcm9tKHQsZSl7dGhpcy5lYXRDb250ZXh0dWFsKFwiZnJvbVwiKT8odC5zb3VyY2U9dGhpcy5wYXJzZUltcG9ydFNvdXJjZSgpLHRoaXMuY2hlY2tFeHBvcnQodCkpOmU/dGhpcy51bmV4cGVjdGVkKCk6dC5zb3VyY2U9bnVsbCx0aGlzLnNlbWljb2xvbigpfXNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKXtpZih0aGlzLm1hdGNoKG4uYXQpJiYodGhpcy5leHBlY3RPbmVQbHVnaW4oW1wiZGVjb3JhdG9yc1wiLFwiZGVjb3JhdG9ycy1sZWdhY3lcIl0pLHRoaXMuaGFzUGx1Z2luKFwiZGVjb3JhdG9yc1wiKSkpe2lmKCF0aGlzLmdldFBsdWdpbk9wdGlvbihcImRlY29yYXRvcnNcIixcImRlY29yYXRvcnNCZWZvcmVFeHBvcnRcIikpcmV0dXJuITA7dGhpcy51bmV4cGVjdGVkKHRoaXMuc3RhdGUuc3RhcnQsZi5EZWNvcmF0b3JCZWZvcmVFeHBvcnQpfXJldHVyblwidmFyXCI9PT10aGlzLnN0YXRlLnR5cGUua2V5d29yZHx8XCJjb25zdFwiPT09dGhpcy5zdGF0ZS50eXBlLmtleXdvcmR8fFwiZnVuY3Rpb25cIj09PXRoaXMuc3RhdGUudHlwZS5rZXl3b3JkfHxcImNsYXNzXCI9PT10aGlzLnN0YXRlLnR5cGUua2V5d29yZHx8dGhpcy5pc0xldCgpfHx0aGlzLmlzQXN5bmNGdW5jdGlvbigpfWNoZWNrRXhwb3J0KHQsZSxzLGkpe2lmKGUpaWYocyl0aGlzLmNoZWNrRHVwbGljYXRlRXhwb3J0cyh0LFwiZGVmYXVsdFwiKTtlbHNlIGlmKHQuc3BlY2lmaWVycyYmdC5zcGVjaWZpZXJzLmxlbmd0aClmb3IobGV0IGU9MCxzPXQuc3BlY2lmaWVycztlPHMubGVuZ3RoO2UrKyl7Y29uc3QgdD1zW2VdO3RoaXMuY2hlY2tEdXBsaWNhdGVFeHBvcnRzKHQsdC5leHBvcnRlZC5uYW1lKSwhaSYmdC5sb2NhbCYmKHRoaXMuY2hlY2tSZXNlcnZlZFdvcmQodC5sb2NhbC5uYW1lLHQubG9jYWwuc3RhcnQsITAsITEpLHRoaXMuc2NvcGUuY2hlY2tMb2NhbEV4cG9ydCh0LmxvY2FsKSl9ZWxzZSBpZih0LmRlY2xhcmF0aW9uKWlmKFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiPT09dC5kZWNsYXJhdGlvbi50eXBlfHxcIkNsYXNzRGVjbGFyYXRpb25cIj09PXQuZGVjbGFyYXRpb24udHlwZSl7Y29uc3QgZT10LmRlY2xhcmF0aW9uLmlkO2lmKCFlKXRocm93IG5ldyBFcnJvcihcIkFzc2VydGlvbiBmYWlsdXJlXCIpO3RoaXMuY2hlY2tEdXBsaWNhdGVFeHBvcnRzKHQsZS5uYW1lKX1lbHNlIGlmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiPT09dC5kZWNsYXJhdGlvbi50eXBlKWZvcihsZXQgZT0wLHM9dC5kZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnM7ZTxzLmxlbmd0aDtlKyspe2NvbnN0IHQ9c1tlXTt0aGlzLmNoZWNrRGVjbGFyYXRpb24odC5pZCl9aWYodGhpcy5zdGF0ZS5kZWNvcmF0b3JTdGFja1t0aGlzLnN0YXRlLmRlY29yYXRvclN0YWNrLmxlbmd0aC0xXS5sZW5ndGgpe2NvbnN0IGU9dC5kZWNsYXJhdGlvbiYmKFwiQ2xhc3NEZWNsYXJhdGlvblwiPT09dC5kZWNsYXJhdGlvbi50eXBlfHxcIkNsYXNzRXhwcmVzc2lvblwiPT09dC5kZWNsYXJhdGlvbi50eXBlKTtpZighdC5kZWNsYXJhdGlvbnx8IWUpdGhyb3cgdGhpcy5yYWlzZSh0LnN0YXJ0LGYuVW5zdXBwb3J0ZWREZWNvcmF0b3JFeHBvcnQpO3RoaXMudGFrZURlY29yYXRvcnModC5kZWNsYXJhdGlvbil9fWNoZWNrRGVjbGFyYXRpb24odCl7aWYoXCJJZGVudGlmaWVyXCI9PT10LnR5cGUpdGhpcy5jaGVja0R1cGxpY2F0ZUV4cG9ydHModCx0Lm5hbWUpO2Vsc2UgaWYoXCJPYmplY3RQYXR0ZXJuXCI9PT10LnR5cGUpZm9yKGxldCBlPTAscz10LnByb3BlcnRpZXM7ZTxzLmxlbmd0aDtlKyspe2NvbnN0IHQ9c1tlXTt0aGlzLmNoZWNrRGVjbGFyYXRpb24odCl9ZWxzZSBpZihcIkFycmF5UGF0dGVyblwiPT09dC50eXBlKWZvcihsZXQgZT0wLHM9dC5lbGVtZW50cztlPHMubGVuZ3RoO2UrKyl7Y29uc3QgdD1zW2VdO3QmJnRoaXMuY2hlY2tEZWNsYXJhdGlvbih0KX1lbHNlXCJPYmplY3RQcm9wZXJ0eVwiPT09dC50eXBlP3RoaXMuY2hlY2tEZWNsYXJhdGlvbih0LnZhbHVlKTpcIlJlc3RFbGVtZW50XCI9PT10LnR5cGU/dGhpcy5jaGVja0RlY2xhcmF0aW9uKHQuYXJndW1lbnQpOlwiQXNzaWdubWVudFBhdHRlcm5cIj09PXQudHlwZSYmdGhpcy5jaGVja0RlY2xhcmF0aW9uKHQubGVmdCl9Y2hlY2tEdXBsaWNhdGVFeHBvcnRzKHQsZSl7dGhpcy5zdGF0ZS5leHBvcnRlZElkZW50aWZpZXJzLmluZGV4T2YoZSk+LTEmJnRoaXMucmFpc2UodC5zdGFydCxcImRlZmF1bHRcIj09PWU/Zi5EdXBsaWNhdGVEZWZhdWx0RXhwb3J0OmYuRHVwbGljYXRlRXhwb3J0LGUpLHRoaXMuc3RhdGUuZXhwb3J0ZWRJZGVudGlmaWVycy5wdXNoKGUpfXBhcnNlRXhwb3J0U3BlY2lmaWVycygpe2NvbnN0IHQ9W107bGV0IGU9ITA7Zm9yKHRoaXMuZXhwZWN0KG4uYnJhY2VMKTshdGhpcy5lYXQobi5icmFjZVIpOyl7aWYoZSllPSExO2Vsc2UgaWYodGhpcy5leHBlY3Qobi5jb21tYSksdGhpcy5lYXQobi5icmFjZVIpKWJyZWFrO2NvbnN0IHM9dGhpcy5zdGFydE5vZGUoKTtzLmxvY2FsPXRoaXMucGFyc2VJZGVudGlmaWVyKCEwKSxzLmV4cG9ydGVkPXRoaXMuZWF0Q29udGV4dHVhbChcImFzXCIpP3RoaXMucGFyc2VJZGVudGlmaWVyKCEwKTpzLmxvY2FsLl9fY2xvbmUoKSx0LnB1c2godGhpcy5maW5pc2hOb2RlKHMsXCJFeHBvcnRTcGVjaWZpZXJcIikpfXJldHVybiB0fXBhcnNlSW1wb3J0KHQpe2lmKHQuc3BlY2lmaWVycz1bXSwhdGhpcy5tYXRjaChuLnN0cmluZykpe2NvbnN0IGU9IXRoaXMubWF5YmVQYXJzZURlZmF1bHRJbXBvcnRTcGVjaWZpZXIodCl8fHRoaXMuZWF0KG4uY29tbWEpLHM9ZSYmdGhpcy5tYXliZVBhcnNlU3RhckltcG9ydFNwZWNpZmllcih0KTtlJiYhcyYmdGhpcy5wYXJzZU5hbWVkSW1wb3J0U3BlY2lmaWVycyh0KSx0aGlzLmV4cGVjdENvbnRleHR1YWwoXCJmcm9tXCIpfXJldHVybiB0LnNvdXJjZT10aGlzLnBhcnNlSW1wb3J0U291cmNlKCksdGhpcy5zZW1pY29sb24oKSx0aGlzLmZpbmlzaE5vZGUodCxcIkltcG9ydERlY2xhcmF0aW9uXCIpfXBhcnNlSW1wb3J0U291cmNlKCl7cmV0dXJuIHRoaXMubWF0Y2gobi5zdHJpbmcpfHx0aGlzLnVuZXhwZWN0ZWQoKSx0aGlzLnBhcnNlRXhwckF0b20oKX1zaG91bGRQYXJzZURlZmF1bHRJbXBvcnQodCl7cmV0dXJuIHRoaXMubWF0Y2gobi5uYW1lKX1wYXJzZUltcG9ydFNwZWNpZmllckxvY2FsKHQsZSxzLGkpe2UubG9jYWw9dGhpcy5wYXJzZUlkZW50aWZpZXIoKSx0aGlzLmNoZWNrTFZhbChlLmxvY2FsLDksdm9pZCAwLGkpLHQuc3BlY2lmaWVycy5wdXNoKHRoaXMuZmluaXNoTm9kZShlLHMpKX1tYXliZVBhcnNlRGVmYXVsdEltcG9ydFNwZWNpZmllcih0KXtyZXR1cm4hIXRoaXMuc2hvdWxkUGFyc2VEZWZhdWx0SW1wb3J0KHQpJiYodGhpcy5wYXJzZUltcG9ydFNwZWNpZmllckxvY2FsKHQsdGhpcy5zdGFydE5vZGUoKSxcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIixcImRlZmF1bHQgaW1wb3J0IHNwZWNpZmllclwiKSwhMCl9bWF5YmVQYXJzZVN0YXJJbXBvcnRTcGVjaWZpZXIodCl7aWYodGhpcy5tYXRjaChuLnN0YXIpKXtjb25zdCBlPXRoaXMuc3RhcnROb2RlKCk7cmV0dXJuIHRoaXMubmV4dCgpLHRoaXMuZXhwZWN0Q29udGV4dHVhbChcImFzXCIpLHRoaXMucGFyc2VJbXBvcnRTcGVjaWZpZXJMb2NhbCh0LGUsXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIixcImltcG9ydCBuYW1lc3BhY2Ugc3BlY2lmaWVyXCIpLCEwfXJldHVybiExfXBhcnNlTmFtZWRJbXBvcnRTcGVjaWZpZXJzKHQpe2xldCBlPSEwO2Zvcih0aGlzLmV4cGVjdChuLmJyYWNlTCk7IXRoaXMuZWF0KG4uYnJhY2VSKTspe2lmKGUpZT0hMTtlbHNle2lmKHRoaXMuZWF0KG4uY29sb24pKXRocm93IHRoaXMucmFpc2UodGhpcy5zdGF0ZS5zdGFydCxmLkRlc3RydWN0dXJlTmFtZWRJbXBvcnQpO2lmKHRoaXMuZXhwZWN0KG4uY29tbWEpLHRoaXMuZWF0KG4uYnJhY2VSKSlicmVha310aGlzLnBhcnNlSW1wb3J0U3BlY2lmaWVyKHQpfX1wYXJzZUltcG9ydFNwZWNpZmllcih0KXtjb25zdCBlPXRoaXMuc3RhcnROb2RlKCk7ZS5pbXBvcnRlZD10aGlzLnBhcnNlSWRlbnRpZmllcighMCksdGhpcy5lYXRDb250ZXh0dWFsKFwiYXNcIik/ZS5sb2NhbD10aGlzLnBhcnNlSWRlbnRpZmllcigpOih0aGlzLmNoZWNrUmVzZXJ2ZWRXb3JkKGUuaW1wb3J0ZWQubmFtZSxlLnN0YXJ0LCEwLCEwKSxlLmxvY2FsPWUuaW1wb3J0ZWQuX19jbG9uZSgpKSx0aGlzLmNoZWNrTFZhbChlLmxvY2FsLDksdm9pZCAwLFwiaW1wb3J0IHNwZWNpZmllclwiKSx0LnNwZWNpZmllcnMucHVzaCh0aGlzLmZpbmlzaE5vZGUoZSxcIkltcG9ydFNwZWNpZmllclwiKSl9fXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQ9ZnVuY3Rpb24odCl7Y29uc3QgZT17fTtmb3IobGV0IHM9MCxpPU9iamVjdC5rZXlzKHV0KTtzPGkubGVuZ3RoO3MrKyl7Y29uc3Qgcj1pW3NdO2Vbcl09dCYmbnVsbCE9dFtyXT90W3JdOnV0W3JdfXJldHVybiBlfSh0KSxlKTtjb25zdCBzPXRoaXMuZ2V0U2NvcGVIYW5kbGVyKCk7dGhpcy5vcHRpb25zPXQsdGhpcy5pbk1vZHVsZT1cIm1vZHVsZVwiPT09dGhpcy5vcHRpb25zLnNvdXJjZVR5cGUsdGhpcy5zY29wZT1uZXcgcyh0aGlzLnJhaXNlLmJpbmQodGhpcyksdGhpcy5pbk1vZHVsZSksdGhpcy5wcm9kUGFyYW09bmV3IHR0LHRoaXMuY2xhc3NTY29wZT1uZXcgVHQodGhpcy5yYWlzZS5iaW5kKHRoaXMpKSx0aGlzLnBsdWdpbnM9ZnVuY3Rpb24odCl7Y29uc3QgZT1uZXcgTWFwO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtjb25zdCBpPXRbc10sW3IsYV09QXJyYXkuaXNBcnJheShpKT9pOltpLHt9XTtlLmhhcyhyKXx8ZS5zZXQocixhfHx7fSl9cmV0dXJuIGV9KHRoaXMub3B0aW9ucy5wbHVnaW5zKSx0aGlzLmZpbGVuYW1lPXQuc291cmNlRmlsZW5hbWV9Z2V0U2NvcGVIYW5kbGVyKCl7cmV0dXJuIFl9cGFyc2UoKXtsZXQgdD0wO3RoaXMuaGFzUGx1Z2luKFwidG9wTGV2ZWxBd2FpdFwiKSYmdGhpcy5pbk1vZHVsZSYmKHR8PTIpLHRoaXMuc2NvcGUuZW50ZXIoMSksdGhpcy5wcm9kUGFyYW0uZW50ZXIodCk7Y29uc3QgZT10aGlzLnN0YXJ0Tm9kZSgpLHM9dGhpcy5zdGFydE5vZGUoKTtyZXR1cm4gdGhpcy5uZXh0VG9rZW4oKSxlLmVycm9ycz1udWxsLHRoaXMucGFyc2VUb3BMZXZlbChlLHMpLGUuZXJyb3JzPXRoaXMuc3RhdGUuZXJyb3JzLGV9fWZ1bmN0aW9uIHd0KHQsZSl7bGV0IHM9QXQ7cmV0dXJuIHQmJnQucGx1Z2lucyYmKCFmdW5jdGlvbih0KXtpZihhdCh0LFwiZGVjb3JhdG9yc1wiKSl7aWYoYXQodCxcImRlY29yYXRvcnMtbGVnYWN5XCIpKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgdGhlIGRlY29yYXRvcnMgYW5kIGRlY29yYXRvcnMtbGVnYWN5IHBsdWdpbiB0b2dldGhlclwiKTtjb25zdCBlPW50KHQsXCJkZWNvcmF0b3JzXCIsXCJkZWNvcmF0b3JzQmVmb3JlRXhwb3J0XCIpO2lmKG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKFwiVGhlICdkZWNvcmF0b3JzJyBwbHVnaW4gcmVxdWlyZXMgYSAnZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCcgb3B0aW9uLCB3aG9zZSB2YWx1ZSBtdXN0IGJlIGEgYm9vbGVhbi4gSWYgeW91IGFyZSBtaWdyYXRpbmcgZnJvbSBCYWJ5bG9uL0JhYmVsIDYgb3Igd2FudCB0byB1c2UgdGhlIG9sZCBkZWNvcmF0b3JzIHByb3Bvc2FsLCB5b3Ugc2hvdWxkIHVzZSB0aGUgJ2RlY29yYXRvcnMtbGVnYWN5JyBwbHVnaW4gaW5zdGVhZCBvZiAnZGVjb3JhdG9ycycuXCIpO2lmKFwiYm9vbGVhblwiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoXCInZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCcgbXVzdCBiZSBhIGJvb2xlYW4uXCIpfWlmKGF0KHQsXCJmbG93XCIpJiZhdCh0LFwidHlwZXNjcmlwdFwiKSl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tYmluZSBmbG93IGFuZCB0eXBlc2NyaXB0IHBsdWdpbnMuXCIpO2lmKGF0KHQsXCJwbGFjZWhvbGRlcnNcIikmJmF0KHQsXCJ2OGludHJpbnNpY1wiKSl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tYmluZSBwbGFjZWhvbGRlcnMgYW5kIHY4aW50cmluc2ljIHBsdWdpbnMuXCIpO2lmKGF0KHQsXCJwaXBlbGluZU9wZXJhdG9yXCIpJiYhb3QuaW5jbHVkZXMobnQodCxcInBpcGVsaW5lT3BlcmF0b3JcIixcInByb3Bvc2FsXCIpKSl0aHJvdyBuZXcgRXJyb3IoXCIncGlwZWxpbmVPcGVyYXRvcicgcmVxdWlyZXMgJ3Byb3Bvc2FsJyBvcHRpb24gd2hvc2UgdmFsdWUgc2hvdWxkIGJlIG9uZSBvZjogXCIrb3QubWFwKHQ9PlwiJ1wiLmNvbmNhdCh0LFwiJ1wiKSkuam9pbihcIiwgXCIpKTtpZihhdCh0LFwicmVjb3JkQW5kVHVwbGVcIikmJiFodC5pbmNsdWRlcyhudCh0LFwicmVjb3JkQW5kVHVwbGVcIixcInN5bnRheFR5cGVcIikpKXRocm93IG5ldyBFcnJvcihcIidyZWNvcmRBbmRUdXBsZScgcmVxdWlyZXMgJ3N5bnRheFR5cGUnIG9wdGlvbiB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgb25lIG9mOiBcIitodC5tYXAodD0+XCInXCIuY29uY2F0KHQsXCInXCIpKS5qb2luKFwiLCBcIikpfSh0LnBsdWdpbnMpLHM9ZnVuY3Rpb24odCl7Y29uc3QgZT1jdC5maWx0ZXIoZT0+YXQodCxlKSkscz1lLmpvaW4oXCIvXCIpO2xldCBpPVN0W3NdO2lmKCFpKXtpPUF0O2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtjb25zdCBzPWVbdF07aT1wdFtzXShpKX1TdFtzXT1pfXJldHVybiBpfSh0LnBsdWdpbnMpKSxuZXcgcyh0LGUpfWNvbnN0IFN0PXt9O2UucGFyc2U9ZnVuY3Rpb24odCxlKXtpZighZXx8XCJ1bmFtYmlndW91c1wiIT09ZS5zb3VyY2VUeXBlKXJldHVybiB3dChlLHQpLnBhcnNlKCk7ZT1PYmplY3QuYXNzaWduKHt9LGUpO3RyeXtlLnNvdXJjZVR5cGU9XCJtb2R1bGVcIjtjb25zdCBzPXd0KGUsdCksaT1zLnBhcnNlKCk7aWYocy5zYXdVbmFtYmlndW91c0VTTSlyZXR1cm4gaTtpZihzLmFtYmlndW91c1NjcmlwdERpZmZlcmVudEFzdCl0cnl7cmV0dXJuIGUuc291cmNlVHlwZT1cInNjcmlwdFwiLHd0KGUsdCkucGFyc2UoKX1jYXRjaCh0KXt9ZWxzZSBpLnByb2dyYW0uc291cmNlVHlwZT1cInNjcmlwdFwiO3JldHVybiBpfWNhdGNoKHMpe3RyeXtyZXR1cm4gZS5zb3VyY2VUeXBlPVwic2NyaXB0XCIsd3QoZSx0KS5wYXJzZSgpfWNhdGNoKHQpe310aHJvdyBzfX0sZS5wYXJzZUV4cHJlc3Npb249ZnVuY3Rpb24odCxlKXtjb25zdCBzPXd0KGUsdCk7cmV0dXJuIHMub3B0aW9ucy5zdHJpY3RNb2RlJiYocy5zdGF0ZS5zdHJpY3Q9ITApLHMuZ2V0RXhwcmVzc2lvbigpfSxlLnRva1R5cGVzPW59KSk7cyhLdCk7S3QucGFyc2UsS3QucGFyc2VFeHByZXNzaW9uLEt0LnRva1R5cGVzO2NvbnN0e2hhc1ByYWdtYTpKdH09YztmdW5jdGlvbiBYdCh0PVtdKXtyZXR1cm57c291cmNlVHlwZTpcIm1vZHVsZVwiLGFsbG93QXdhaXRPdXRzaWRlRnVuY3Rpb246ITAsYWxsb3dJbXBvcnRFeHBvcnRFdmVyeXdoZXJlOiEwLGFsbG93UmV0dXJuT3V0c2lkZUZ1bmN0aW9uOiEwLGFsbG93U3VwZXJPdXRzaWRlTWV0aG9kOiEwLGFsbG93VW5kZWNsYXJlZEV4cG9ydHM6ITAsZXJyb3JSZWNvdmVyeTohMCxjcmVhdGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbnM6ITAscGx1Z2luczpbXCJkb0V4cHJlc3Npb25zXCIsXCJvYmplY3RSZXN0U3ByZWFkXCIsXCJjbGFzc1Byb3BlcnRpZXNcIixcImV4cG9ydERlZmF1bHRGcm9tXCIsXCJleHBvcnROYW1lc3BhY2VGcm9tXCIsXCJhc3luY0dlbmVyYXRvcnNcIixcImZ1bmN0aW9uQmluZFwiLFwiZnVuY3Rpb25TZW50XCIsXCJkeW5hbWljSW1wb3J0XCIsXCJudW1lcmljU2VwYXJhdG9yXCIsXCJpbXBvcnRNZXRhXCIsXCJvcHRpb25hbENhdGNoQmluZGluZ1wiLFwib3B0aW9uYWxDaGFpbmluZ1wiLFwiY2xhc3NQcml2YXRlUHJvcGVydGllc1wiLFtcInBpcGVsaW5lT3BlcmF0b3JcIix7cHJvcG9zYWw6XCJtaW5pbWFsXCJ9XSxcIm51bGxpc2hDb2FsZXNjaW5nT3BlcmF0b3JcIixcImJpZ0ludFwiLFwidGhyb3dFeHByZXNzaW9uc1wiLFwibG9naWNhbEFzc2lnbm1lbnRcIixcImNsYXNzUHJpdmF0ZU1ldGhvZHNcIixcInY4aW50cmluc2ljXCIsXCJwYXJ0aWFsQXBwbGljYXRpb25cIixbXCJkZWNvcmF0b3JzXCIse2RlY29yYXRvcnNCZWZvcmVFeHBvcnQ6ITF9XSwuLi50XX19ZnVuY3Rpb24gR3QodCwuLi5zKXtyZXR1cm4oaSxyLGEpPT57Y29uc3Qgbj1LdDtsZXQgbzt0cnl7bz1mdW5jdGlvbih0LGUpe2xldCBzO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXRyeXtyZXR1cm4gdChlW2ldKX1jYXRjaCh0KXtzfHwocz10KX10aHJvdyBzfShlPT5uW3RdKGksZSkscy5tYXAoWHQpKX1jYXRjaCh0KXt0aHJvdyBlKHQubWVzc2FnZS5yZXBsYWNlKC8gXFwoLipcXCkvLFwiXCIpLHtzdGFydDp7bGluZTp0LmxvYy5saW5lLGNvbHVtbjp0LmxvYy5jb2x1bW4rMX19KX1yZXR1cm4gZGVsZXRlIG8udG9rZW5zLFd0KG8sT2JqZWN0LmFzc2lnbih7fSxhLHtvcmlnaW5hbFRleHQ6aX0pKX19Y29uc3QgUXQ9R3QoXCJwYXJzZVwiLFtcImpzeFwiLFwiZmxvd1wiXSksWXQ9R3QoXCJwYXJzZVwiLFtcImpzeFwiLFtcImZsb3dcIix7YWxsOiEwLGVudW1zOiEwfV1dKSwkdD1HdChcInBhcnNlXCIsW1wianN4XCIsXCJ0eXBlc2NyaXB0XCJdLFtcInR5cGVzY3JpcHRcIl0pLFp0PUd0KFwicGFyc2VFeHByZXNzaW9uXCIsW1wianN4XCJdKTtmdW5jdGlvbiB0ZSh0LHMpe3N3aXRjaCh0LnR5cGUpe2Nhc2VcIkFycmF5RXhwcmVzc2lvblwiOnJldHVybiB0LmVsZW1lbnRzLmZvckVhY2goaSk7Y2FzZVwiT2JqZWN0RXhwcmVzc2lvblwiOnJldHVybiB0LnByb3BlcnRpZXMuZm9yRWFjaChpKTtjYXNlXCJPYmplY3RQcm9wZXJ0eVwiOmlmKHQuY29tcHV0ZWQpdGhyb3cgcihcImNvbXB1dGVkXCIpO2lmKHQuc2hvcnRoYW5kKXRocm93IHIoXCJzaG9ydGhhbmRcIik7cmV0dXJuW3Qua2V5LHQudmFsdWVdLmZvckVhY2goaSk7Y2FzZVwiVW5hcnlFeHByZXNzaW9uXCI6c3dpdGNoKHQub3BlcmF0b3Ipe2Nhc2VcIitcIjpjYXNlXCItXCI6cmV0dXJuIGkodC5hcmd1bWVudCk7ZGVmYXVsdDp0aHJvdyByKFwib3BlcmF0b3JcIil9Y2FzZVwiSWRlbnRpZmllclwiOmlmKHMmJlwiT2JqZWN0UHJvcGVydHlcIj09PXMudHlwZSYmcy5rZXk9PT10KXJldHVybjt0aHJvdyByKCk7Y2FzZVwiTnVsbExpdGVyYWxcIjpjYXNlXCJCb29sZWFuTGl0ZXJhbFwiOmNhc2VcIk51bWVyaWNMaXRlcmFsXCI6Y2FzZVwiU3RyaW5nTGl0ZXJhbFwiOnJldHVybjtkZWZhdWx0OnRocm93IHIoKX1mdW5jdGlvbiBpKGUpe3JldHVybiB0ZShlLHQpfWZ1bmN0aW9uIHIocyl7Y29uc3QgaT1zP1wiXCIuY29uY2F0KHQudHlwZSxcIiB3aXRoIFwiKS5jb25jYXQocyxcIj1cIikuY29uY2F0KEpTT04uc3RyaW5naWZ5KHRbc10pKTp0LnR5cGU7cmV0dXJuIGUoXCJcIi5jb25jYXQoaSxcIiBpcyBub3QgYWxsb3dlZCBpbiBKU09OLlwiKSx7c3RhcnQ6e2xpbmU6dC5sb2Muc3RhcnQubGluZSxjb2x1bW46dC5sb2Muc3RhcnQuY29sdW1uKzF9fSl9fWNvbnN0IGVlPU9iamVjdC5hc3NpZ24oe3BhcnNlOlF0LGFzdEZvcm1hdDpcImVzdHJlZVwiLGhhc1ByYWdtYTpKdH0sbSksc2U9T2JqZWN0LmFzc2lnbih7fSxlZSx7cGFyc2U6WXR9KSxpZT1PYmplY3QuYXNzaWduKHt9LGVlLHtwYXJzZTokdH0pLHJlPU9iamVjdC5hc3NpZ24oe30sZWUse3BhcnNlOlp0fSk7dmFyIGFlPXtwYXJzZXJzOntiYWJlbDplZSxcImJhYmVsLWZsb3dcIjpzZSxcImJhYmVsLXRzXCI6aWUsanNvbjpPYmplY3QuYXNzaWduKHt9LHJlLHtoYXNQcmFnbWE6KCk9PiEwfSksanNvbjU6cmUsXCJqc29uLXN0cmluZ2lmeVwiOk9iamVjdC5hc3NpZ24oe3BhcnNlOmZ1bmN0aW9uKHQsZSxzKXtjb25zdCBpPVp0KHQsZSxzKTtyZXR1cm4gaS5jb21tZW50cy5mb3JFYWNoKHRlKSx0ZShpKSxpfSxhc3RGb3JtYXQ6XCJlc3RyZWUtanNvblwifSxtKSxfX2pzX2V4cHJlc3Npb246cmUsX192dWVfZXhwcmVzc2lvbjpyZSxfX3Z1ZV9ldmVudF9iaW5kaW5nOmVlfX0sbmU9YWUucGFyc2Vyczt0LmRlZmF1bHQ9YWUsdC5wYXJzZXJzPW5lLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSkpO1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5wcmV0dGllciA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbmFtZSA9IFwicHJldHRpZXJcIjtcbiAgdmFyIHZlcnNpb24gPSBcIjIuMC41XCI7XG4gIHZhciBkZXNjcmlwdGlvbiA9IFwiUHJldHRpZXIgaXMgYW4gb3BpbmlvbmF0ZWQgY29kZSBmb3JtYXR0ZXJcIjtcbiAgdmFyIGJpbiA9IFwiLi9iaW4vcHJldHRpZXIuanNcIjtcbiAgdmFyIHJlcG9zaXRvcnkgPSBcInByZXR0aWVyL3ByZXR0aWVyXCI7XG4gIHZhciBob21lcGFnZSA9IFwiaHR0cHM6Ly9wcmV0dGllci5pb1wiO1xuICB2YXIgYXV0aG9yID0gXCJKYW1lcyBMb25nXCI7XG4gIHZhciBsaWNlbnNlID0gXCJNSVRcIjtcbiAgdmFyIG1haW4gPSBcIi4vaW5kZXguanNcIjtcbiAgdmFyIGVuZ2luZXMgPSB7XG4gIFx0bm9kZTogXCI+PTEwLjEzLjBcIlxuICB9O1xuICB2YXIgZGVwZW5kZW5jaWVzID0ge1xuICBcdFwiQGFuZ3VsYXIvY29tcGlsZXJcIjogXCI5LjAuNVwiLFxuICBcdFwiQGJhYmVsL2NvZGUtZnJhbWVcIjogXCI3LjguMFwiLFxuICBcdFwiQGJhYmVsL3BhcnNlclwiOiBcIjcuOS40XCIsXG4gIFx0XCJAZ2xpbW1lci9zeW50YXhcIjogXCIwLjUwLjBcIixcbiAgXHRcIkBpYXJuYS90b21sXCI6IFwiMi4yLjNcIixcbiAgXHRcIkB0eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzdHJlZVwiOiBcIjIuMjYuMFwiLFxuICBcdFwiYW5ndWxhci1lc3RyZWUtcGFyc2VyXCI6IFwiMS4zLjBcIixcbiAgXHRcImFuZ3VsYXItaHRtbC1wYXJzZXJcIjogXCIxLjQuMFwiLFxuICBcdGNhbWVsY2FzZTogXCI1LjMuMVwiLFxuICBcdGNoYWxrOiBcIjQuMC4wXCIsXG4gIFx0XCJjaS1pbmZvXCI6IFwid2F0c29uL2NpLWluZm8jZjQzZjZhMWNlZmZmNDdmYjM2MWM4OGNmNGI5NDNmZGJjYWFmZTU0MFwiLFxuICBcdFwiY2prLXJlZ2V4XCI6IFwiMi4wLjBcIixcbiAgXHRjb3NtaWNvbmZpZzogXCI2LjAuMFwiLFxuICBcdGRhc2hpZnk6IFwiMi4wLjBcIixcbiAgXHRkZWRlbnQ6IFwiMC43LjBcIixcbiAgXHRkaWZmOiBcIjQuMC4yXCIsXG4gIFx0ZWRpdG9yY29uZmlnOiBcIjAuMTUuM1wiLFxuICBcdFwiZWRpdG9yY29uZmlnLXRvLXByZXR0aWVyXCI6IFwiMC4xLjFcIixcbiAgXHRcImVzY2FwZS1zdHJpbmctcmVnZXhwXCI6IFwiMi4wLjBcIixcbiAgXHRlc3V0aWxzOiBcIjIuMC4zXCIsXG4gIFx0XCJmYXN0LWdsb2JcIjogXCIzLjIuMlwiLFxuICBcdFwiZmluZC1wYXJlbnQtZGlyXCI6IFwiMC4zLjBcIixcbiAgXHRcImZpbmQtcHJvamVjdC1yb290XCI6IFwiMS4xLjFcIixcbiAgXHRcImZsb3ctcGFyc2VyXCI6IFwiMC4xMjIuMFwiLFxuICBcdFwiZ2V0LXN0cmVhbVwiOiBcIjUuMS4wXCIsXG4gIFx0Z2xvYmJ5OiBcIjExLjAuMFwiLFxuICBcdGdyYXBocWw6IFwiMTUuMC4wXCIsXG4gIFx0XCJodG1sLWVsZW1lbnQtYXR0cmlidXRlc1wiOiBcIjIuMi4xXCIsXG4gIFx0XCJodG1sLXN0eWxlc1wiOiBcIjEuMC4wXCIsXG4gIFx0XCJodG1sLXRhZy1uYW1lc1wiOiBcIjEuMS41XCIsXG4gIFx0aWdub3JlOiBcIjQuMC42XCIsXG4gIFx0XCJqZXN0LWRvY2Jsb2NrXCI6IFwiMjUuMi42XCIsXG4gIFx0XCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcIjogXCIxLjAuMVwiLFxuICBcdGxldmVuOiBcIjMuMS4wXCIsXG4gIFx0XCJsaW5lcy1hbmQtY29sdW1uc1wiOiBcIjEuMS42XCIsXG4gIFx0XCJsaW5ndWlzdC1sYW5ndWFnZXNcIjogXCI3LjkuMFwiLFxuICBcdGxvZGFzaDogXCI0LjE3LjE1XCIsXG4gIFx0bWVtOiBcIjYuMC4xXCIsXG4gIFx0bWluaW1hdGNoOiBcIjMuMC40XCIsXG4gIFx0bWluaW1pc3Q6IFwiMS4yLjVcIixcbiAgXHRcIm4tcmVhZGxpbmVzXCI6IFwiMS4wLjBcIixcbiAgXHRcInBsZWFzZS11cGdyYWRlLW5vZGVcIjogXCIzLjIuMFwiLFxuICBcdFwicG9zdGNzcy1sZXNzXCI6IFwiMy4xLjRcIixcbiAgXHRcInBvc3Rjc3MtbWVkaWEtcXVlcnktcGFyc2VyXCI6IFwiMC4yLjNcIixcbiAgXHRcInBvc3Rjc3Mtc2Nzc1wiOiBcIjIuMC4wXCIsXG4gIFx0XCJwb3N0Y3NzLXNlbGVjdG9yLXBhcnNlclwiOiBcIjIuMi4zXCIsXG4gIFx0XCJwb3N0Y3NzLXZhbHVlcy1wYXJzZXJcIjogXCIyLjAuMVwiLFxuICBcdFwicmVnZXhwLXV0aWxcIjogXCIxLjIuMlwiLFxuICBcdFwicmVtYXJrLW1hdGhcIjogXCIxLjAuNlwiLFxuICBcdFwicmVtYXJrLXBhcnNlXCI6IFwiNS4wLjBcIixcbiAgXHRyZXNvbHZlOiBcIjEuMTYuMVwiLFxuICBcdHNlbXZlcjogXCI3LjEuM1wiLFxuICBcdHNyY3NldDogXCIyLjAuMVwiLFxuICBcdFwic3RyaW5nLXdpZHRoXCI6IFwiNC4yLjBcIixcbiAgXHR0eXBlc2NyaXB0OiBcIjMuOC4zXCIsXG4gIFx0XCJ1bmljb2RlLXJlZ2V4XCI6IFwiMy4wLjBcIixcbiAgXHR1bmlmaWVkOiBcIjkuMC4wXCIsXG4gIFx0dm5vcHRzOiBcIjEuMC4yXCIsXG4gIFx0XCJ5YW1sLXVuaXN0LXBhcnNlclwiOiBcIjEuMS4xXCJcbiAgfTtcbiAgdmFyIGRldkRlcGVuZGVuY2llcyA9IHtcbiAgXHRcIkBiYWJlbC9jb3JlXCI6IFwiNy45LjBcIixcbiAgXHRcIkBiYWJlbC9wcmVzZXQtZW52XCI6IFwiNy45LjBcIixcbiAgXHRcIkByb2xsdXAvcGx1Z2luLWFsaWFzXCI6IFwiMy4wLjFcIixcbiAgXHRcIkByb2xsdXAvcGx1Z2luLWNvbW1vbmpzXCI6IFwiMTEuMC4yXCIsXG4gIFx0XCJAcm9sbHVwL3BsdWdpbi1qc29uXCI6IFwiNC4wLjJcIixcbiAgXHRcIkByb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZVwiOiBcIjcuMS4xXCIsXG4gIFx0XCJAcm9sbHVwL3BsdWdpbi1yZXBsYWNlXCI6IFwiMi4zLjFcIixcbiAgXHRcImJhYmVsLWxvYWRlclwiOiBcIjguMS4wXCIsXG4gIFx0YmVuY2htYXJrOiBcIjIuMS40XCIsXG4gIFx0XCJidWlsdGluLW1vZHVsZXNcIjogXCIzLjEuMFwiLFxuICBcdGNvZGVjb3Y6IFwiMy42LjVcIixcbiAgXHRcImNyb3NzLWVudlwiOiBcIjcuMC4yXCIsXG4gIFx0Y3NwZWxsOiBcIjQuMC41NVwiLFxuICBcdGVzbGludDogXCI2LjguMFwiLFxuICBcdFwiZXNsaW50LWNvbmZpZy1wcmV0dGllclwiOiBcIjYuMTAuMVwiLFxuICBcdFwiZXNsaW50LWZvcm1hdHRlci1mcmllbmRseVwiOiBcIjcuMC4wXCIsXG4gIFx0XCJlc2xpbnQtcGx1Z2luLWltcG9ydFwiOiBcIjIuMjAuMlwiLFxuICBcdFwiZXNsaW50LXBsdWdpbi1wcmV0dGllclwiOiBcIjMuMS4yXCIsXG4gIFx0XCJlc2xpbnQtcGx1Z2luLXJlYWN0XCI6IFwiNy4xOS4wXCIsXG4gIFx0XCJlc2xpbnQtcGx1Z2luLXVuaWNvcm5cIjogXCIxOC4wLjFcIixcbiAgXHRleGVjYTogXCI0LjAuMFwiLFxuICBcdGplc3Q6IFwiMjUuMi43XCIsXG4gIFx0XCJqZXN0LXNuYXBzaG90LXNlcmlhbGl6ZXItYW5zaVwiOiBcIjEuMC4wXCIsXG4gIFx0XCJqZXN0LXNuYXBzaG90LXNlcmlhbGl6ZXItcmF3XCI6IFwiMS4xLjBcIixcbiAgXHRcImplc3Qtd2F0Y2gtdHlwZWFoZWFkXCI6IFwiMC41LjBcIixcbiAgXHRwcmV0dGllcjogXCIyLjAuNFwiLFxuICBcdHJpbXJhZjogXCIzLjAuMlwiLFxuICBcdHJvbGx1cDogXCIyLjMuMlwiLFxuICBcdFwicm9sbHVwLXBsdWdpbi1iYWJlbFwiOiBcIjQuNC4wXCIsXG4gIFx0XCJyb2xsdXAtcGx1Z2luLW5vZGUtZ2xvYmFsc1wiOiBcIjEuNC4wXCIsXG4gIFx0XCJyb2xsdXAtcGx1Z2luLXRlcnNlclwiOiBcIjUuMy4wXCIsXG4gIFx0c2hlbGxqczogXCIwLjguM1wiLFxuICBcdFwic25hcHNob3QtZGlmZlwiOiBcIjAuNy4wXCIsXG4gIFx0XCJzdHJpcC1hbnNpXCI6IFwiNi4wLjBcIixcbiAgXHRcInN5bmNocm9ub3VzLXByb21pc2VcIjogXCIyLjAuMTBcIixcbiAgXHR0ZW1weTogXCIwLjUuMFwiLFxuICBcdFwidGVyc2VyLXdlYnBhY2stcGx1Z2luXCI6IFwiMi4zLjVcIixcbiAgXHR3ZWJwYWNrOiBcIjQuNDIuMVwiXG4gIH07XG4gIHZhciBzY3JpcHRzID0ge1xuICBcdHByZXB1Ymxpc2hPbmx5OiBcImVjaG8gXFxcIkVycm9yOiBtdXN0IHB1Ymxpc2ggZnJvbSBkaXN0L1xcXCIgJiYgZXhpdCAxXCIsXG4gIFx0XCJwcmVwYXJlLXJlbGVhc2VcIjogXCJ5YXJuICYmIHlhcm4gYnVpbGQgJiYgeWFybiB0ZXN0OmRpc3RcIixcbiAgXHR0ZXN0OiBcImplc3RcIixcbiAgXHRcInRlc3Q6ZGlzdFwiOiBcImNyb3NzLWVudiBOT0RFX0VOVj1wcm9kdWN0aW9uIGplc3RcIixcbiAgXHRcInRlc3Q6ZGlzdC1zdGFuZGFsb25lXCI6IFwiY3Jvc3MtZW52IE5PREVfRU5WPXByb2R1Y3Rpb24gVEVTVF9TVEFOREFMT05FPTEgamVzdCB0ZXN0cy9cIixcbiAgXHRcInRlc3Q6aW50ZWdyYXRpb25cIjogXCJqZXN0IHRlc3RzX2ludGVncmF0aW9uXCIsXG4gIFx0XCJwZXJmOnJlcGVhdFwiOiBcInlhcm4gJiYgeWFybiBidWlsZCAmJiBjcm9zcy1lbnYgTk9ERV9FTlY9cHJvZHVjdGlvbiBub2RlIC4vZGlzdC9iaW4tcHJldHRpZXIuanMgLS1kZWJ1Zy1yZXBlYXQgJHtQRVJGX1JFUEVBVDotMTAwMH0gLS1sb2dsZXZlbCBkZWJ1ZyAke1BFUkZfRklMRTotLi9pbmRleC5qc30gPiAvZGV2L251bGxcIixcbiAgXHRcInBlcmY6cmVwZWF0LWluc3BlY3RcIjogXCJ5YXJuICYmIHlhcm4gYnVpbGQgJiYgY3Jvc3MtZW52IE5PREVfRU5WPXByb2R1Y3Rpb24gbm9kZSAtLWluc3BlY3QtYnJrIC4vZGlzdC9iaW4tcHJldHRpZXIuanMgLS1kZWJ1Zy1yZXBlYXQgJHtQRVJGX1JFUEVBVDotMTAwMH0gLS1sb2dsZXZlbCBkZWJ1ZyAke1BFUkZfRklMRTotLi9pbmRleC5qc30gPiAvZGV2L251bGxcIixcbiAgXHRcInBlcmY6YmVuY2htYXJrXCI6IFwieWFybiAmJiB5YXJuIGJ1aWxkICYmIGNyb3NzLWVudiBOT0RFX0VOVj1wcm9kdWN0aW9uIG5vZGUgLi9kaXN0L2Jpbi1wcmV0dGllci5qcyAtLWRlYnVnLWJlbmNobWFyayAtLWxvZ2xldmVsIGRlYnVnICR7UEVSRl9GSUxFOi0uL2luZGV4LmpzfSA+IC9kZXYvbnVsbFwiLFxuICBcdFwibGludDp0eXBlY2hlY2tcIjogXCJ0c2NcIixcbiAgXHRcImxpbnQ6ZXNsaW50XCI6IFwiY3Jvc3MtZW52IEVGRl9OT19MSU5LX1JVTEVTPXRydWUgZXNsaW50IC4gLS1mb3JtYXQgZnJpZW5kbHlcIixcbiAgXHRcImxpbnQ6Y2hhbmdlbG9nXCI6IFwibm9kZSAuL3NjcmlwdHMvbGludC1jaGFuZ2Vsb2cuanNcIixcbiAgXHRcImxpbnQ6cHJldHRpZXJcIjogXCJwcmV0dGllciBcXFwiKiovKi57bWQsanNvbix5bWwsaHRtbCxjc3N9XFxcIiAtLWNoZWNrXCIsXG4gIFx0XCJsaW50OmRpc3RcIjogXCJlc2xpbnQgLS1uby1lc2xpbnRyYyAtLW5vLWlnbm9yZSAtLWVudj1lczYsYnJvd3NlciAtLXBhcnNlci1vcHRpb25zPWVjbWFWZXJzaW9uOjIwMTYgXFxcImRpc3QvIShiaW4tcHJldHRpZXJ8aW5kZXh8dGhpcmQtcGFydHkpLmpzXFxcIlwiLFxuICBcdFwibGludDpzcGVsbGNoZWNrXCI6IFwiY3NwZWxsIHtiaW4sc2NyaXB0cyxzcmMsd2Vic2l0ZX0vKiovKi5qcyB7ZG9jcyx3ZWJzaXRlL2Jsb2csY2hhbmdlbG9nX3VucmVsZWFzZWR9LyoqLyoubWRcIixcbiAgXHRcImxpbnQ6ZGVwc1wiOiBcIm5vZGUgLi9zY3JpcHRzL2NoZWNrLWRlcHMuanNcIixcbiAgXHRidWlsZDogXCJub2RlIC0tbWF4LW9sZC1zcGFjZS1zaXplPTMwNzIgLi9zY3JpcHRzL2J1aWxkL2J1aWxkLmpzXCIsXG4gIFx0XCJidWlsZC1kb2NzXCI6IFwibm9kZSAuL3NjcmlwdHMvYnVpbGQtZG9jcy5qc1wiXG4gIH07XG4gIHZhciBfcGFja2FnZSA9IHtcbiAgXHRuYW1lOiBuYW1lLFxuICBcdHZlcnNpb246IHZlcnNpb24sXG4gIFx0ZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICBcdGJpbjogYmluLFxuICBcdHJlcG9zaXRvcnk6IHJlcG9zaXRvcnksXG4gIFx0aG9tZXBhZ2U6IGhvbWVwYWdlLFxuICBcdGF1dGhvcjogYXV0aG9yLFxuICBcdGxpY2Vuc2U6IGxpY2Vuc2UsXG4gIFx0bWFpbjogbWFpbixcbiAgXHRlbmdpbmVzOiBlbmdpbmVzLFxuICBcdGRlcGVuZGVuY2llczogZGVwZW5kZW5jaWVzLFxuICBcdGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLFxuICBcdHNjcmlwdHM6IHNjcmlwdHNcbiAgfTtcblxuICB2YXIgX3BhY2thZ2UkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgbmFtZTogbmFtZSxcbiAgICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICBiaW46IGJpbixcbiAgICByZXBvc2l0b3J5OiByZXBvc2l0b3J5LFxuICAgIGhvbWVwYWdlOiBob21lcGFnZSxcbiAgICBhdXRob3I6IGF1dGhvcixcbiAgICBsaWNlbnNlOiBsaWNlbnNlLFxuICAgIG1haW46IG1haW4sXG4gICAgZW5naW5lczogZW5naW5lcyxcbiAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcyxcbiAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcyxcbiAgICBzY3JpcHRzOiBzY3JpcHRzLFxuICAgICdkZWZhdWx0JzogX3BhY2thZ2VcbiAgfSk7XG5cbiAgZnVuY3Rpb24gRGlmZigpIHt9XG5cbiAgRGlmZi5wcm90b3R5cGUgPSB7XG4gICAgZGlmZjogZnVuY3Rpb24gZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZykge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgICAgdmFyIGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcblxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBmdW5jdGlvbiBkb25lKHZhbHVlKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2FsbGJhY2sodW5kZWZpbmVkLCB2YWx1ZSk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuXG5cbiAgICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgICBuZXdTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChuZXdTdHJpbmcpO1xuICAgICAgb2xkU3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG9sZFN0cmluZykpO1xuICAgICAgbmV3U3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG5ld1N0cmluZykpO1xuICAgICAgdmFyIG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG4gICAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICAgIHZhciBlZGl0TGVuZ3RoID0gMTtcbiAgICAgIHZhciBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuICAgICAgdmFyIGJlc3RQYXRoID0gW3tcbiAgICAgICAgbmV3UG9zOiAtMSxcbiAgICAgICAgY29tcG9uZW50czogW11cbiAgICAgIH1dOyAvLyBTZWVkIGVkaXRMZW5ndGggPSAwLCBpLmUuIHRoZSBjb250ZW50IHN0YXJ0cyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuXG4gICAgICB2YXIgb2xkUG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgMCk7XG5cbiAgICAgIGlmIChiZXN0UGF0aFswXS5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgICAvLyBJZGVudGl0eSBwZXIgdGhlIGVxdWFsaXR5IGFuZCB0b2tlbml6ZXJcbiAgICAgICAgcmV0dXJuIGRvbmUoW3tcbiAgICAgICAgICB2YWx1ZTogdGhpcy5qb2luKG5ld1N0cmluZyksXG4gICAgICAgICAgY291bnQ6IG5ld1N0cmluZy5sZW5ndGhcbiAgICAgICAgfV0pO1xuICAgICAgfSAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG5cblxuICAgICAgZnVuY3Rpb24gZXhlY0VkaXRMZW5ndGgoKSB7XG4gICAgICAgIGZvciAodmFyIGRpYWdvbmFsUGF0aCA9IC0xICogZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoIDw9IGVkaXRMZW5ndGg7IGRpYWdvbmFsUGF0aCArPSAyKSB7XG4gICAgICAgICAgdmFyIGJhc2VQYXRoID0gdm9pZCAwO1xuXG4gICAgICAgICAgdmFyIGFkZFBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSxcbiAgICAgICAgICAgICAgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCArIDFdLFxuICAgICAgICAgICAgICBfb2xkUG9zID0gKHJlbW92ZVBhdGggPyByZW1vdmVQYXRoLm5ld1BvcyA6IDApIC0gZGlhZ29uYWxQYXRoO1xuXG4gICAgICAgICAgaWYgKGFkZFBhdGgpIHtcbiAgICAgICAgICAgIC8vIE5vIG9uZSBlbHNlIGlzIGdvaW5nIHRvIGF0dGVtcHQgdG8gdXNlIHRoaXMgdmFsdWUsIGNsZWFyIGl0XG4gICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY2FuQWRkID0gYWRkUGF0aCAmJiBhZGRQYXRoLm5ld1BvcyArIDEgPCBuZXdMZW4sXG4gICAgICAgICAgICAgIGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgMCA8PSBfb2xkUG9zICYmIF9vbGRQb3MgPCBvbGRMZW47XG5cbiAgICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIHBhdGggaXMgYSB0ZXJtaW5hbCB0aGVuIHBydW5lXG4gICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAgIC8vIHBhdGggd2hvc2UgcG9zaXRpb24gaW4gdGhlIG5ldyBzdHJpbmcgaXMgdGhlIGZhcnRoZXN0IGZyb20gdGhlIG9yaWdpblxuICAgICAgICAgIC8vIGFuZCBkb2VzIG5vdCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGRpZmYgZ3JhcGhcblxuXG4gICAgICAgICAgaWYgKCFjYW5BZGQgfHwgY2FuUmVtb3ZlICYmIGFkZFBhdGgubmV3UG9zIDwgcmVtb3ZlUGF0aC5uZXdQb3MpIHtcbiAgICAgICAgICAgIGJhc2VQYXRoID0gY2xvbmVQYXRoKHJlbW92ZVBhdGgpO1xuICAgICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJhc2VQYXRoID0gYWRkUGF0aDsgLy8gTm8gbmVlZCB0byBjbG9uZSwgd2UndmUgcHVsbGVkIGl0IGZyb20gdGhlIGxpc3RcblxuICAgICAgICAgICAgYmFzZVBhdGgubmV3UG9zKys7XG4gICAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdHJ1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfb2xkUG9zID0gc2VsZi5leHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKTsgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiBib3RoIHN0cmluZ3MsIHRoZW4gd2UgYXJlIGRvbmVcblxuICAgICAgICAgIGlmIChiYXNlUGF0aC5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBfb2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgdHJhY2sgdGhpcyBwYXRoIGFzIGEgcG90ZW50aWFsIGNhbmRpZGF0ZSBhbmQgY29udGludWUuXG4gICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gYmFzZVBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWRpdExlbmd0aCsrO1xuICAgICAgfSAvLyBQZXJmb3JtcyB0aGUgbGVuZ3RoIG9mIGVkaXQgaXRlcmF0aW9uLiBJcyBhIGJpdCBmdWdseSBhcyB0aGlzIGhhcyB0byBzdXBwb3J0IHRoZVxuICAgICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgICAgLy8gaXMgcHJvZHVjZWQuXG5cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHdlIHdhbnQgdG8gYmUgc2FmZS5cblxuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIGlmIChlZGl0TGVuZ3RoID4gbWF4RWRpdExlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFleGVjRWRpdExlbmd0aCgpKSB7XG4gICAgICAgICAgICAgIGV4ZWMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcblxuICAgICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBwdXNoQ29tcG9uZW50OiBmdW5jdGlvbiBwdXNoQ29tcG9uZW50KGNvbXBvbmVudHMsIGFkZGVkLCByZW1vdmVkKSB7XG4gICAgICB2YXIgbGFzdCA9IGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKGxhc3QgJiYgbGFzdC5hZGRlZCA9PT0gYWRkZWQgJiYgbGFzdC5yZW1vdmVkID09PSByZW1vdmVkKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgaGVyZSBhcyB0aGUgY29tcG9uZW50IGNsb25lIG9wZXJhdGlvbiBpcyBqdXN0XG4gICAgICAgIC8vIGFzIHNoYWxsb3cgYXJyYXkgY2xvbmVcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdID0ge1xuICAgICAgICAgIGNvdW50OiBsYXN0LmNvdW50ICsgMSxcbiAgICAgICAgICBhZGRlZDogYWRkZWQsXG4gICAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKHtcbiAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICBhZGRlZDogYWRkZWQsXG4gICAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV4dHJhY3RDb21tb246IGZ1bmN0aW9uIGV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpIHtcbiAgICAgIHZhciBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuICAgICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGgsXG4gICAgICAgICAgbmV3UG9zID0gYmFzZVBhdGgubmV3UG9zLFxuICAgICAgICAgIG9sZFBvcyA9IG5ld1BvcyAtIGRpYWdvbmFsUGF0aCxcbiAgICAgICAgICBjb21tb25Db3VudCA9IDA7XG5cbiAgICAgIHdoaWxlIChuZXdQb3MgKyAxIDwgbmV3TGVuICYmIG9sZFBvcyArIDEgPCBvbGRMZW4gJiYgdGhpcy5lcXVhbHMobmV3U3RyaW5nW25ld1BvcyArIDFdLCBvbGRTdHJpbmdbb2xkUG9zICsgMV0pKSB7XG4gICAgICAgIG5ld1BvcysrO1xuICAgICAgICBvbGRQb3MrKztcbiAgICAgICAgY29tbW9uQ291bnQrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1vbkNvdW50KSB7XG4gICAgICAgIGJhc2VQYXRoLmNvbXBvbmVudHMucHVzaCh7XG4gICAgICAgICAgY291bnQ6IGNvbW1vbkNvdW50XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBiYXNlUGF0aC5uZXdQb3MgPSBuZXdQb3M7XG4gICAgICByZXR1cm4gb2xkUG9zO1xuICAgIH0sXG4gICAgZXF1YWxzOiBmdW5jdGlvbiBlcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlICYmIGxlZnQudG9Mb3dlckNhc2UoKSA9PT0gcmlnaHQudG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZUVtcHR5OiBmdW5jdGlvbiByZW1vdmVFbXB0eShhcnJheSkge1xuICAgICAgdmFyIHJldCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcnJheVtpXSkge1xuICAgICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0sXG4gICAgY2FzdElucHV0OiBmdW5jdGlvbiBjYXN0SW5wdXQodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIHRva2VuaXplOiBmdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKTtcbiAgICB9LFxuICAgIGpvaW46IGZ1bmN0aW9uIGpvaW4oY2hhcnMpIHtcbiAgICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gYnVpbGRWYWx1ZXMoZGlmZiwgY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHVzZUxvbmdlc3RUb2tlbikge1xuICAgIHZhciBjb21wb25lbnRQb3MgPSAwLFxuICAgICAgICBjb21wb25lbnRMZW4gPSBjb21wb25lbnRzLmxlbmd0aCxcbiAgICAgICAgbmV3UG9zID0gMCxcbiAgICAgICAgb2xkUG9zID0gMDtcblxuICAgIGZvciAoOyBjb21wb25lbnRQb3MgPCBjb21wb25lbnRMZW47IGNvbXBvbmVudFBvcysrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG4gICAgICAgIGlmICghY29tcG9uZW50LmFkZGVkICYmIHVzZUxvbmdlc3RUb2tlbikge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCk7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBvbGRTdHJpbmdbb2xkUG9zICsgaV07XG4gICAgICAgICAgICByZXR1cm4gb2xkVmFsdWUubGVuZ3RoID4gdmFsdWUubGVuZ3RoID8gb2xkVmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4odmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld1BvcyArPSBjb21wb25lbnQuY291bnQ7IC8vIENvbW1vbiBjYXNlXG5cbiAgICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgICBvbGRQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4ob2xkU3RyaW5nLnNsaWNlKG9sZFBvcywgb2xkUG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7IC8vIFJldmVyc2UgYWRkIGFuZCByZW1vdmUgc28gcmVtb3ZlcyBhcmUgb3V0cHV0IGZpcnN0IHRvIG1hdGNoIGNvbW1vbiBjb252ZW50aW9uXG4gICAgICAgIC8vIFRoZSBkaWZmaW5nIGFsZ29yaXRobSBpcyB0aWVkIHRvIGFkZCB0aGVuIHJlbW92ZSBvdXRwdXQgYW5kIHRoaXMgaXMgdGhlIHNpbXBsZXN0XG4gICAgICAgIC8vIHJvdXRlIHRvIGdldCB0aGUgZGVzaXJlZCBvdXRwdXQgd2l0aCBtaW5pbWFsIG92ZXJoZWFkLlxuXG4gICAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuICAgICAgICAgIHZhciB0bXAgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdO1xuICAgICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV0gPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG4gICAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBTcGVjaWFsIGNhc2UgaGFuZGxlIGZvciB3aGVuIG9uZSB0ZXJtaW5hbCBpcyBpZ25vcmVkIChpLmUuIHdoaXRlc3BhY2UpLlxuICAgIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuICAgIC8vIFRoaXMgaXMgb25seSBhdmFpbGFibGUgZm9yIHN0cmluZyBtb2RlLlxuXG5cbiAgICB2YXIgbGFzdENvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMV07XG5cbiAgICBpZiAoY29tcG9uZW50TGVuID4gMSAmJiB0eXBlb2YgbGFzdENvbXBvbmVudC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgKGxhc3RDb21wb25lbnQuYWRkZWQgfHwgbGFzdENvbXBvbmVudC5yZW1vdmVkKSAmJiBkaWZmLmVxdWFscygnJywgbGFzdENvbXBvbmVudC52YWx1ZSkpIHtcbiAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMl0udmFsdWUgKz0gbGFzdENvbXBvbmVudC52YWx1ZTtcbiAgICAgIGNvbXBvbmVudHMucG9wKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZVBhdGgocGF0aCkge1xuICAgIHJldHVybiB7XG4gICAgICBuZXdQb3M6IHBhdGgubmV3UG9zLFxuICAgICAgY29tcG9uZW50czogcGF0aC5jb21wb25lbnRzLnNsaWNlKDApXG4gICAgfTtcbiAgfVxuXG4gIHZhciBjaGFyYWN0ZXJEaWZmID0gbmV3IERpZmYoKTtcblxuICBmdW5jdGlvbiBkaWZmQ2hhcnMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gY2hhcmFjdGVyRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlT3B0aW9ucyhvcHRpb25zLCBkZWZhdWx0cykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVmYXVsdHMuY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucykge1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBvcHRpb25zKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgZGVmYXVsdHNbbmFtZV0gPSBvcHRpb25zW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9IC8vXG4gIC8vIFJhbmdlcyBhbmQgZXhjZXB0aW9uczpcbiAgLy8gTGF0aW4tMSBTdXBwbGVtZW50LCAwMDgw4oCTMDBGRlxuICAvLyAgLSBVKzAwRDcgIMOXIE11bHRpcGxpY2F0aW9uIHNpZ25cbiAgLy8gIC0gVSswMEY3ICDDtyBEaXZpc2lvbiBzaWduXG4gIC8vIExhdGluIEV4dGVuZGVkLUEsIDAxMDDigJMwMTdGXG4gIC8vIExhdGluIEV4dGVuZGVkLUIsIDAxODDigJMwMjRGXG4gIC8vIElQQSBFeHRlbnNpb25zLCAwMjUw4oCTMDJBRlxuICAvLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMsIDAyQjDigJMwMkZGXG4gIC8vICAtIFUrMDJDNyAgy4cgJiM3MTE7ICBDYXJvblxuICAvLyAgLSBVKzAyRDggIMuYICYjNzI4OyAgQnJldmVcbiAgLy8gIC0gVSswMkQ5ICDLmSAmIzcyOTsgIERvdCBBYm92ZVxuICAvLyAgLSBVKzAyREEgIMuaICYjNzMwOyAgUmluZyBBYm92ZVxuICAvLyAgLSBVKzAyREIgIMubICYjNzMxOyAgT2dvbmVrXG4gIC8vICAtIFUrMDJEQyAgy5wgJiM3MzI7ICBTbWFsbCBUaWxkZVxuICAvLyAgLSBVKzAyREQgIMudICYjNzMzOyAgRG91YmxlIEFjdXRlIEFjY2VudFxuICAvLyBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsLCAxRTAw4oCTMUVGRlxuXG5cbiAgdmFyIGV4dGVuZGVkV29yZENoYXJzID0gL15bQS1aYS16XFx4QzAtXFx1MDJDNlxcdTAyQzgtXFx1MDJEN1xcdTAyREUtXFx1MDJGRlxcdTFFMDAtXFx1MUVGRl0rJC87XG4gIHZhciByZVdoaXRlc3BhY2UgPSAvXFxTLztcbiAgdmFyIHdvcmREaWZmID0gbmV3IERpZmYoKTtcblxuICB3b3JkRGlmZi5lcXVhbHMgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUNhc2UpIHtcbiAgICAgIGxlZnQgPSBsZWZ0LnRvTG93ZXJDYXNlKCk7XG4gICAgICByaWdodCA9IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IHRoaXMub3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlICYmICFyZVdoaXRlc3BhY2UudGVzdChsZWZ0KSAmJiAhcmVXaGl0ZXNwYWNlLnRlc3QocmlnaHQpO1xuICB9O1xuXG4gIHdvcmREaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIHRva2VucyA9IHZhbHVlLnNwbGl0KC8oXFxzK3xbKClbXFxde30nXCJdfFxcYikvKTsgLy8gSm9pbiB0aGUgYm91bmRhcnkgc3BsaXRzIHRoYXQgd2UgZG8gbm90IGNvbnNpZGVyIHRvIGJlIGJvdW5kYXJpZXMuIFRoaXMgaXMgcHJpbWFyaWx5IHRoZSBleHRlbmRlZCBMYXRpbiBjaGFyYWN0ZXIgc2V0LlxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgbmV4dCBmaWVsZCBhbmQgd2UgaGF2ZSBvbmx5IHdvcmQgY2hhcnMgYmVmb3JlIGFuZCBhZnRlciwgbWVyZ2VcbiAgICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdICYmIGV4dGVuZGVkV29yZENoYXJzLnRlc3QodG9rZW5zW2ldKSAmJiBleHRlbmRlZFdvcmRDaGFycy50ZXN0KHRva2Vuc1tpICsgMl0pKSB7XG4gICAgICAgIHRva2Vuc1tpXSArPSB0b2tlbnNbaSArIDJdO1xuICAgICAgICB0b2tlbnMuc3BsaWNlKGkgKyAxLCAyKTtcbiAgICAgICAgaS0tO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b2tlbnM7XG4gIH07XG5cbiAgZnVuY3Rpb24gZGlmZldvcmRzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucyhvcHRpb25zLCB7XG4gICAgICBpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlmZldvcmRzV2l0aFNwYWNlKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xuICB9XG5cbiAgdmFyIGxpbmVEaWZmID0gbmV3IERpZmYoKTtcblxuICBsaW5lRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciByZXRMaW5lcyA9IFtdLFxuICAgICAgICBsaW5lc0FuZE5ld2xpbmVzID0gdmFsdWUuc3BsaXQoLyhcXG58XFxyXFxuKS8pOyAvLyBJZ25vcmUgdGhlIGZpbmFsIGVtcHR5IHRva2VuIHRoYXQgb2NjdXJzIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGEgbmV3IGxpbmVcblxuICAgIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lc0FuZE5ld2xpbmVzLnBvcCgpO1xuICAgIH0gLy8gTWVyZ2UgdGhlIGNvbnRlbnQgYW5kIGxpbmUgc2VwYXJhdG9ycyBpbnRvIHNpbmdsZSB0b2tlbnNcblxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGluZSA9IGxpbmVzQW5kTmV3bGluZXNbaV07XG5cbiAgICAgIGlmIChpICUgMiAmJiAhdGhpcy5vcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG4gICAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UpIHtcbiAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXRMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXRMaW5lcztcbiAgfTtcblxuICBmdW5jdGlvbiBkaWZmTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpZmZUcmltbWVkTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMoY2FsbGJhY2ssIHtcbiAgICAgIGlnbm9yZVdoaXRlc3BhY2U6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG4gIH1cblxuICB2YXIgc2VudGVuY2VEaWZmID0gbmV3IERpZmYoKTtcblxuICBzZW50ZW5jZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoLyhcXFMuKz9bLiE/XSkoPz1cXHMrfCQpLyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gZGlmZlNlbnRlbmNlcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gc2VudGVuY2VEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHZhciBjc3NEaWZmID0gbmV3IERpZmYoKTtcblxuICBjc3NEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KC8oW3t9OjssXXxcXHMrKS8pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGRpZmZDc3Mob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGNzc0RpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgIF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gICAgICByZXR1cm4gYXJyMjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgICBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbiAgfVxuXG4gIHZhciBvYmplY3RQcm90b3R5cGVUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gIHZhciBqc29uRGlmZiA9IG5ldyBEaWZmKCk7IC8vIERpc2NyaW1pbmF0ZSBiZXR3ZWVuIHR3byBsaW5lcyBvZiBwcmV0dHktcHJpbnRlZCwgc2VyaWFsaXplZCBKU09OIHdoZXJlIG9uZSBvZiB0aGVtIGhhcyBhXG4gIC8vIGRhbmdsaW5nIGNvbW1hIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gVHVybnMgb3V0IGluY2x1ZGluZyB0aGUgZGFuZ2xpbmcgY29tbWEgeWllbGRzIHRoZSBuaWNlc3Qgb3V0cHV0OlxuXG4gIGpzb25EaWZmLnVzZUxvbmdlc3RUb2tlbiA9IHRydWU7XG4gIGpzb25EaWZmLnRva2VuaXplID0gbGluZURpZmYudG9rZW5pemU7XG5cbiAganNvbkRpZmYuY2FzdElucHV0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIF90aGlzJG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIHVuZGVmaW5lZFJlcGxhY2VtZW50ID0gX3RoaXMkb3B0aW9ucy51bmRlZmluZWRSZXBsYWNlbWVudCxcbiAgICAgICAgX3RoaXMkb3B0aW9ucyRzdHJpbmdpID0gX3RoaXMkb3B0aW9ucy5zdHJpbmdpZnlSZXBsYWNlcixcbiAgICAgICAgc3RyaW5naWZ5UmVwbGFjZXIgPSBfdGhpcyRvcHRpb25zJHN0cmluZ2kgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkUmVwbGFjZW1lbnQgOiB2O1xuICAgIH0gOiBfdGhpcyRvcHRpb25zJHN0cmluZ2k7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KGNhbm9uaWNhbGl6ZSh2YWx1ZSwgbnVsbCwgbnVsbCwgc3RyaW5naWZ5UmVwbGFjZXIpLCBzdHJpbmdpZnlSZXBsYWNlciwgJyAgJyk7XG4gIH07XG5cbiAganNvbkRpZmYuZXF1YWxzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIERpZmYucHJvdG90eXBlLmVxdWFscy5jYWxsKGpzb25EaWZmLCBsZWZ0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpLCByaWdodC5yZXBsYWNlKC8sKFtcXHJcXG5dKS9nLCAnJDEnKSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gZGlmZkpzb24ob2xkT2JqLCBuZXdPYmosIG9wdGlvbnMpIHtcbiAgICByZXR1cm4ganNvbkRpZmYuZGlmZihvbGRPYmosIG5ld09iaiwgb3B0aW9ucyk7XG4gIH0gLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG4gIC8vIG9iamVjdCB0aGF0IGlzIGFscmVhZHkgb24gdGhlIFwic3RhY2tcIiBvZiBpdGVtcyBiZWluZyBwcm9jZXNzZWQuIEFjY2VwdHMgYW4gb3B0aW9uYWwgcmVwbGFjZXJcblxuXG4gIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShvYmosIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KSB7XG4gICAgc3RhY2sgPSBzdGFjayB8fCBbXTtcbiAgICByZXBsYWNlbWVudFN0YWNrID0gcmVwbGFjZW1lbnRTdGFjayB8fCBbXTtcblxuICAgIGlmIChyZXBsYWNlcikge1xuICAgICAgb2JqID0gcmVwbGFjZXIoa2V5LCBvYmopO1xuICAgIH1cblxuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAoc3RhY2tbaV0gPT09IG9iaikge1xuICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnRTdGFja1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2Fub25pY2FsaXplZE9iajtcblxuICAgIGlmICgnW29iamVjdCBBcnJheV0nID09PSBvYmplY3RQcm90b3R5cGVUb1N0cmluZy5jYWxsKG9iaikpIHtcbiAgICAgIHN0YWNrLnB1c2gob2JqKTtcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICAgIH1cblxuICAgICAgc3RhY2sucG9wKCk7XG4gICAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG4gICAgfVxuXG4gICAgaWYgKG9iaiAmJiBvYmoudG9KU09OKSB7XG4gICAgICBvYmogPSBvYmoudG9KU09OKCk7XG4gICAgfVxuXG4gICAgaWYgKF90eXBlb2Yob2JqKSA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XG4gICAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgICBjYW5vbmljYWxpemVkT2JqID0ge307XG4gICAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG5cbiAgICAgIHZhciBzb3J0ZWRLZXlzID0gW10sXG4gICAgICAgICAgX2tleTtcblxuICAgICAgZm9yIChfa2V5IGluIG9iaikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KF9rZXkpKSB7XG4gICAgICAgICAgc29ydGVkS2V5cy5wdXNoKF9rZXkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNvcnRlZEtleXMuc29ydCgpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc29ydGVkS2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBfa2V5ID0gc29ydGVkS2V5c1tpXTtcbiAgICAgICAgY2Fub25pY2FsaXplZE9ialtfa2V5XSA9IGNhbm9uaWNhbGl6ZShvYmpbX2tleV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwgX2tleSk7XG4gICAgICB9XG5cbiAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2Fub25pY2FsaXplZE9iaiA9IG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcbiAgfVxuXG4gIHZhciBhcnJheURpZmYgPSBuZXcgRGlmZigpO1xuXG4gIGFycmF5RGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5zbGljZSgpO1xuICB9O1xuXG4gIGFycmF5RGlmZi5qb2luID0gYXJyYXlEaWZmLnJlbW92ZUVtcHR5ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGRpZmZBcnJheXMob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGFycmF5RGlmZi5kaWZmKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjayk7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVBhdGNoKHVuaURpZmYpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdmFyIGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgICBkZWxpbWl0ZXJzID0gdW5pRGlmZi5tYXRjaCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vZykgfHwgW10sXG4gICAgICAgIGxpc3QgPSBbXSxcbiAgICAgICAgaSA9IDA7XG5cbiAgICBmdW5jdGlvbiBwYXJzZUluZGV4KCkge1xuICAgICAgdmFyIGluZGV4ID0ge307XG4gICAgICBsaXN0LnB1c2goaW5kZXgpOyAvLyBQYXJzZSBkaWZmIG1ldGFkYXRhXG5cbiAgICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGxpbmUgPSBkaWZmc3RyW2ldOyAvLyBGaWxlIGhlYWRlciBmb3VuZCwgZW5kIHBhcnNpbmcgZGlmZiBtZXRhZGF0YVxuXG4gICAgICAgIGlmICgvXihcXC1cXC1cXC18XFwrXFwrXFwrfEBAKVxccy8udGVzdChsaW5lKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIERpZmYgaW5kZXhcblxuXG4gICAgICAgIHZhciBoZWFkZXIgPSAvXig/OkluZGV4OnxkaWZmKD86IC1yIFxcdyspKylcXHMrKC4rPylcXHMqJC8uZXhlYyhsaW5lKTtcblxuICAgICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgICAgaW5kZXguaW5kZXggPSBoZWFkZXJbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9IC8vIFBhcnNlIGZpbGUgaGVhZGVycyBpZiB0aGV5IGFyZSBkZWZpbmVkLiBVbmlmaWVkIGRpZmYgcmVxdWlyZXMgdGhlbSwgYnV0XG4gICAgICAvLyB0aGVyZSdzIG5vIHRlY2huaWNhbCBpc3N1ZXMgdG8gaGF2ZSBhbiBpc29sYXRlZCBodW5rIHdpdGhvdXQgZmlsZSBoZWFkZXJcblxuXG4gICAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpO1xuICAgICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTsgLy8gUGFyc2UgaHVua3NcblxuICAgICAgaW5kZXguaHVua3MgPSBbXTtcblxuICAgICAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgICAgICB2YXIgX2xpbmUgPSBkaWZmc3RyW2ldO1xuXG4gICAgICAgIGlmICgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8udGVzdChfbGluZSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmICgvXkBALy50ZXN0KF9saW5lKSkge1xuICAgICAgICAgIGluZGV4Lmh1bmtzLnB1c2gocGFyc2VIdW5rKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKF9saW5lICYmIG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgICAgLy8gSWdub3JlIHVuZXhwZWN0ZWQgY29udGVudCB1bmxlc3MgaW4gc3RyaWN0IG1vZGVcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KF9saW5lKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuICAgIC8vIGFyZSBjb25zdW1lZC5cblxuXG4gICAgZnVuY3Rpb24gcGFyc2VGaWxlSGVhZGVyKGluZGV4KSB7XG4gICAgICB2YXIgZmlsZUhlYWRlciA9IC9eKC0tLXxcXCtcXCtcXCspXFxzKyguKikkLy5leGVjKGRpZmZzdHJbaV0pO1xuXG4gICAgICBpZiAoZmlsZUhlYWRlcikge1xuICAgICAgICB2YXIga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuICAgICAgICB2YXIgZGF0YSA9IGZpbGVIZWFkZXJbMl0uc3BsaXQoJ1xcdCcsIDIpO1xuICAgICAgICB2YXIgZmlsZU5hbWUgPSBkYXRhWzBdLnJlcGxhY2UoL1xcXFxcXFxcL2csICdcXFxcJyk7XG5cbiAgICAgICAgaWYgKC9eXCIuKlwiJC8udGVzdChmaWxlTmFtZSkpIHtcbiAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cigxLCBmaWxlTmFtZS5sZW5ndGggLSAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4W2tleVByZWZpeCArICdGaWxlTmFtZSddID0gZmlsZU5hbWU7XG4gICAgICAgIGluZGV4W2tleVByZWZpeCArICdIZWFkZXInXSA9IChkYXRhWzFdIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9IC8vIFBhcnNlcyBhIGh1bmtcbiAgICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgaHVuay5cblxuXG4gICAgZnVuY3Rpb24gcGFyc2VIdW5rKCkge1xuICAgICAgdmFyIGNodW5rSGVhZGVySW5kZXggPSBpLFxuICAgICAgICAgIGNodW5rSGVhZGVyTGluZSA9IGRpZmZzdHJbaSsrXSxcbiAgICAgICAgICBjaHVua0hlYWRlciA9IGNodW5rSGVhZGVyTGluZS5zcGxpdCgvQEAgLShcXGQrKSg/OiwoXFxkKykpPyBcXCsoXFxkKykoPzosKFxcZCspKT8gQEAvKTtcbiAgICAgIHZhciBodW5rID0ge1xuICAgICAgICBvbGRTdGFydDogK2NodW5rSGVhZGVyWzFdLFxuICAgICAgICBvbGRMaW5lczogK2NodW5rSGVhZGVyWzJdIHx8IDEsXG4gICAgICAgIG5ld1N0YXJ0OiArY2h1bmtIZWFkZXJbM10sXG4gICAgICAgIG5ld0xpbmVzOiArY2h1bmtIZWFkZXJbNF0gfHwgMSxcbiAgICAgICAgbGluZXM6IFtdLFxuICAgICAgICBsaW5lZGVsaW1pdGVyczogW11cbiAgICAgIH07XG4gICAgICB2YXIgYWRkQ291bnQgPSAwLFxuICAgICAgICAgIHJlbW92ZUNvdW50ID0gMDtcblxuICAgICAgZm9yICg7IGkgPCBkaWZmc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggJy0tLScgY291bGQgYmUgbWlzdGFrZW4gZm9yIHRoZSBcInJlbW92ZSBsaW5lXCIgb3BlcmF0aW9uXG4gICAgICAgIC8vIEJ1dCB0aGV5IGNvdWxkIGJlIHRoZSBoZWFkZXIgZm9yIHRoZSBuZXh0IGZpbGUuIFRoZXJlZm9yZSBwcnVuZSBzdWNoIGNhc2VzIG91dC5cbiAgICAgICAgaWYgKGRpZmZzdHJbaV0uaW5kZXhPZignLS0tICcpID09PSAwICYmIGkgKyAyIDwgZGlmZnN0ci5sZW5ndGggJiYgZGlmZnN0cltpICsgMV0uaW5kZXhPZignKysrICcpID09PSAwICYmIGRpZmZzdHJbaSArIDJdLmluZGV4T2YoJ0BAJykgPT09IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcGVyYXRpb24gPSBkaWZmc3RyW2ldLmxlbmd0aCA9PSAwICYmIGkgIT0gZGlmZnN0ci5sZW5ndGggLSAxID8gJyAnIDogZGlmZnN0cltpXVswXTtcblxuICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnKycgfHwgb3BlcmF0aW9uID09PSAnLScgfHwgb3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnXFxcXCcpIHtcbiAgICAgICAgICBodW5rLmxpbmVzLnB1c2goZGlmZnN0cltpXSk7XG4gICAgICAgICAgaHVuay5saW5lZGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcnNbaV0gfHwgJ1xcbicpO1xuXG4gICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgICAgICBhZGRDb3VudCsrO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICcgJykge1xuICAgICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IC8vIEhhbmRsZSB0aGUgZW1wdHkgYmxvY2sgY291bnQgY2FzZVxuXG5cbiAgICAgIGlmICghYWRkQ291bnQgJiYgaHVuay5uZXdMaW5lcyA9PT0gMSkge1xuICAgICAgICBodW5rLm5ld0xpbmVzID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZW1vdmVDb3VudCAmJiBodW5rLm9sZExpbmVzID09PSAxKSB7XG4gICAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuICAgICAgfSAvLyBQZXJmb3JtIG9wdGlvbmFsIHNhbml0eSBjaGVja2luZ1xuXG5cbiAgICAgIGlmIChvcHRpb25zLnN0cmljdCkge1xuICAgICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FkZGVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW1vdmVDb3VudCAhPT0gaHVuay5vbGRMaW5lcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVtb3ZlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGh1bms7XG4gICAgfVxuXG4gICAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgICAgcGFyc2VJbmRleCgpO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9IC8vIEl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIGluIHRoZSByYW5nZSBvZiBbbWluLCBtYXhdLCBzdGVwcGluZ1xuICAvLyBieSBkaXN0YW5jZSBmcm9tIGEgZ2l2ZW4gc3RhcnQgcG9zaXRpb24uIEkuZS4gZm9yIFswLCA0XSwgd2l0aFxuICAvLyBzdGFydCBvZiAyLCB0aGlzIHdpbGwgaXRlcmF0ZSAyLCAzLCAxLCA0LCAwLlxuXG5cbiAgZnVuY3Rpb24gZGlzdGFuY2VJdGVyYXRvcihzdGFydCwgbWluTGluZSwgbWF4TGluZSkge1xuICAgIHZhciB3YW50Rm9yd2FyZCA9IHRydWUsXG4gICAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG4gICAgICAgIGZvcndhcmRFeGhhdXN0ZWQgPSBmYWxzZSxcbiAgICAgICAgbG9jYWxPZmZzZXQgPSAxO1xuICAgIHJldHVybiBmdW5jdGlvbiBpdGVyYXRvcigpIHtcbiAgICAgIGlmICh3YW50Rm9yd2FyZCAmJiAhZm9yd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICBpZiAoYmFja3dhcmRFeGhhdXN0ZWQpIHtcbiAgICAgICAgICBsb2NhbE9mZnNldCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhbnRGb3J3YXJkID0gZmFsc2U7XG4gICAgICAgIH0gLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZXlvbmQgdGV4dCBsZW5ndGgsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgICAgLy8gYWZ0ZXIgb2Zmc2V0IGxvY2F0aW9uIChvciBkZXNpcmVkIGxvY2F0aW9uIG9uIGZpcnN0IGl0ZXJhdGlvbilcblxuXG4gICAgICAgIGlmIChzdGFydCArIGxvY2FsT2Zmc2V0IDw9IG1heExpbmUpIHtcbiAgICAgICAgICByZXR1cm4gbG9jYWxPZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3J3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICBpZiAoIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgICAgICB3YW50Rm9yd2FyZCA9IHRydWU7XG4gICAgICAgIH0gLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZWZvcmUgdGV4dCBiZWdpbm5pbmcsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgICAgLy8gYmVmb3JlIG9mZnNldCBsb2NhdGlvblxuXG5cbiAgICAgICAgaWYgKG1pbkxpbmUgPD0gc3RhcnQgLSBsb2NhbE9mZnNldCkge1xuICAgICAgICAgIHJldHVybiAtbG9jYWxPZmZzZXQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKCk7XG4gICAgICB9IC8vIFdlIHRyaWVkIHRvIGZpdCBodW5rIGJlZm9yZSB0ZXh0IGJlZ2lubmluZyBhbmQgYmV5b25kIHRleHQgbGVuZ3RoLCB0aGVuXG4gICAgICAvLyBodW5rIGNhbid0IGZpdCBvbiB0aGUgdGV4dC4gUmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgICAgdW5pRGlmZiA9IHBhcnNlUGF0Y2godW5pRGlmZik7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodW5pRGlmZikpIHtcbiAgICAgIGlmICh1bmlEaWZmLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcHBseVBhdGNoIG9ubHkgd29ya3Mgd2l0aCBhIHNpbmdsZSBpbnB1dC4nKTtcbiAgICAgIH1cblxuICAgICAgdW5pRGlmZiA9IHVuaURpZmZbMF07XG4gICAgfSAvLyBBcHBseSB0aGUgZGlmZiB0byB0aGUgaW5wdXRcblxuXG4gICAgdmFyIGxpbmVzID0gc291cmNlLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgICBkZWxpbWl0ZXJzID0gc291cmNlLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcbiAgICAgICAgaHVua3MgPSB1bmlEaWZmLmh1bmtzLFxuICAgICAgICBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgZnVuY3Rpb24gKGxpbmVOdW1iZXIsIGxpbmUsIG9wZXJhdGlvbiwgcGF0Y2hDb250ZW50KSB7XG4gICAgICByZXR1cm4gbGluZSA9PT0gcGF0Y2hDb250ZW50O1xuICAgIH0sXG4gICAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgICBmdXp6RmFjdG9yID0gb3B0aW9ucy5mdXp6RmFjdG9yIHx8IDAsXG4gICAgICAgIG1pbkxpbmUgPSAwLFxuICAgICAgICBvZmZzZXQgPSAwLFxuICAgICAgICByZW1vdmVFT0ZOTCxcbiAgICAgICAgYWRkRU9GTkw7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBodW5rIGV4YWN0bHkgZml0cyBvbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cbiAgICAgKi9cblxuXG4gICAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgbGluZSA9IGh1bmsubGluZXNbal0sXG4gICAgICAgICAgICBvcGVyYXRpb24gPSBsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnLFxuICAgICAgICAgICAgY29udGVudCA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZTtcblxuICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICAvLyBDb250ZXh0IHNhbml0eSBjaGVja1xuICAgICAgICAgIGlmICghY29tcGFyZUxpbmUodG9Qb3MgKyAxLCBsaW5lc1t0b1Bvc10sIG9wZXJhdGlvbiwgY29udGVudCkpIHtcbiAgICAgICAgICAgIGVycm9yQ291bnQrKztcblxuICAgICAgICAgICAgaWYgKGVycm9yQ291bnQgPiBmdXp6RmFjdG9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0b1BvcysrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaHVuayA9IGh1bmtzW2ldLFxuICAgICAgICAgIG1heExpbmUgPSBsaW5lcy5sZW5ndGggLSBodW5rLm9sZExpbmVzLFxuICAgICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgICB0b1BvcyA9IG9mZnNldCArIGh1bmsub2xkU3RhcnQgLSAxO1xuICAgICAgdmFyIGl0ZXJhdG9yID0gZGlzdGFuY2VJdGVyYXRvcih0b1BvcywgbWluTGluZSwgbWF4TGluZSk7XG5cbiAgICAgIGZvciAoOyBsb2NhbE9mZnNldCAhPT0gdW5kZWZpbmVkOyBsb2NhbE9mZnNldCA9IGl0ZXJhdG9yKCkpIHtcbiAgICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgICAgaHVuay5vZmZzZXQgPSBvZmZzZXQgKz0gbG9jYWxPZmZzZXQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxvY2FsT2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBTZXQgbG93ZXIgdGV4dCBsaW1pdCB0byBlbmQgb2YgdGhlIGN1cnJlbnQgaHVuaywgc28gbmV4dCBvbmVzIGRvbid0IHRyeVxuICAgICAgLy8gdG8gZml0IG92ZXIgYWxyZWFkeSBwYXRjaGVkIHRleHRcblxuXG4gICAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgICB9IC8vIEFwcGx5IHBhdGNoIGh1bmtzXG5cblxuICAgIHZhciBkaWZmT2Zmc2V0ID0gMDtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBodW5rcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaHVuayA9IGh1bmtzW19pXSxcbiAgICAgICAgICBfdG9Qb3MgPSBfaHVuay5vbGRTdGFydCArIF9odW5rLm9mZnNldCArIGRpZmZPZmZzZXQgLSAxO1xuXG4gICAgICBkaWZmT2Zmc2V0ICs9IF9odW5rLm5ld0xpbmVzIC0gX2h1bmsub2xkTGluZXM7XG5cbiAgICAgIGlmIChfdG9Qb3MgPCAwKSB7XG4gICAgICAgIC8vIENyZWF0aW5nIGEgbmV3IGZpbGVcbiAgICAgICAgX3RvUG9zID0gMDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBfaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgbGluZSA9IF9odW5rLmxpbmVzW2pdLFxuICAgICAgICAgICAgb3BlcmF0aW9uID0gbGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyxcbiAgICAgICAgICAgIGNvbnRlbnQgPSBsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUsXG4gICAgICAgICAgICBkZWxpbWl0ZXIgPSBfaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnICcpIHtcbiAgICAgICAgICBfdG9Qb3MrKztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGxpbmVzLnNwbGljZShfdG9Qb3MsIDEpO1xuICAgICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKF90b1BvcywgMSk7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgIGxpbmVzLnNwbGljZShfdG9Qb3MsIDAsIGNvbnRlbnQpO1xuICAgICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKF90b1BvcywgMCwgZGVsaW1pdGVyKTtcbiAgICAgICAgICBfdG9Qb3MrKztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICAgIHZhciBwcmV2aW91c09wZXJhdGlvbiA9IF9odW5rLmxpbmVzW2ogLSAxXSA/IF9odW5rLmxpbmVzW2ogLSAxXVswXSA6IG51bGw7XG5cbiAgICAgICAgICBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgICAgcmVtb3ZlRU9GTkwgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgICAgYWRkRU9GTkwgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSGFuZGxlIEVPRk5MIGluc2VydGlvbi9yZW1vdmFsXG5cblxuICAgIGlmIChyZW1vdmVFT0ZOTCkge1xuICAgICAgd2hpbGUgKCFsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSkge1xuICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICAgICAgZGVsaW1pdGVycy5wb3AoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGRlbGltaXRlcnMucHVzaCgnXFxuJyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IGxpbmVzLmxlbmd0aCAtIDE7IF9rKyspIHtcbiAgICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbiAgfSAvLyBXcmFwcGVyIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGUgZmlsZSBwYXRjaGVzIHZpYSBjYWxsYmFja3MuXG5cblxuICBmdW5jdGlvbiBhcHBseVBhdGNoZXModW5pRGlmZiwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHVuaURpZmYgPSBwYXJzZVBhdGNoKHVuaURpZmYpO1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50SW5kZXggPSAwO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0luZGV4KCkge1xuICAgICAgdmFyIGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG5cbiAgICAgIGlmICghaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9ucy5sb2FkRmlsZShpbmRleCwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1cGRhdGVkQ29udGVudCA9IGFwcGx5UGF0Y2goZGF0YSwgaW5kZXgsIG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm9jZXNzSW5kZXgoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cnVjdHVyZWRQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9ucy5jb250ZXh0ID0gNDtcbiAgICB9XG5cbiAgICB2YXIgZGlmZiA9IGRpZmZMaW5lcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG4gICAgZGlmZi5wdXNoKHtcbiAgICAgIHZhbHVlOiAnJyxcbiAgICAgIGxpbmVzOiBbXVxuICAgIH0pOyAvLyBBcHBlbmQgYW4gZW1wdHkgdmFsdWUgdG8gbWFrZSBjbGVhbnVwIGVhc2llclxuXG4gICAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgICByZXR1cm4gbGluZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICByZXR1cm4gJyAnICsgZW50cnk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgaHVua3MgPSBbXTtcbiAgICB2YXIgb2xkUmFuZ2VTdGFydCA9IDAsXG4gICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwLFxuICAgICAgICBjdXJSYW5nZSA9IFtdLFxuICAgICAgICBvbGRMaW5lID0gMSxcbiAgICAgICAgbmV3TGluZSA9IDE7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChpKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGRpZmZbaV0sXG4gICAgICAgICAgbGluZXMgPSBjdXJyZW50LmxpbmVzIHx8IGN1cnJlbnQudmFsdWUucmVwbGFjZSgvXFxuJC8sICcnKS5zcGxpdCgnXFxuJyk7XG4gICAgICBjdXJyZW50LmxpbmVzID0gbGluZXM7XG5cbiAgICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgICB2YXIgX2N1clJhbmdlOyAvLyBJZiB3ZSBoYXZlIHByZXZpb3VzIGNvbnRleHQsIHN0YXJ0IHdpdGggdGhhdFxuXG5cbiAgICAgICAgaWYgKCFvbGRSYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgdmFyIHByZXYgPSBkaWZmW2kgLSAxXTtcbiAgICAgICAgICBvbGRSYW5nZVN0YXJ0ID0gb2xkTGluZTtcbiAgICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICBjdXJSYW5nZSA9IG9wdGlvbnMuY29udGV4dCA+IDAgPyBjb250ZXh0TGluZXMocHJldi5saW5lcy5zbGljZSgtb3B0aW9ucy5jb250ZXh0KSkgOiBbXTtcbiAgICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgICAgbmV3UmFuZ2VTdGFydCAtPSBjdXJSYW5nZS5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuXG5cbiAgICAgICAgKF9jdXJSYW5nZSA9IGN1clJhbmdlKS5wdXNoLmFwcGx5KF9jdXJSYW5nZSwgX3RvQ29uc3VtYWJsZUFycmF5KGxpbmVzLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICByZXR1cm4gKGN1cnJlbnQuYWRkZWQgPyAnKycgOiAnLScpICsgZW50cnk7XG4gICAgICAgIH0pKSk7IC8vIFRyYWNrIHRoZSB1cGRhdGVkIGZpbGUgcG9zaXRpb25cblxuXG4gICAgICAgIGlmIChjdXJyZW50LmFkZGVkKSB7XG4gICAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElkZW50aWNhbCBjb250ZXh0IGxpbmVzLiBUcmFjayBsaW5lIGNoYW5nZXNcbiAgICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAvLyBDbG9zZSBvdXQgYW55IGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gb3V0cHV0IChvciBqb2luIG92ZXJsYXBwaW5nKVxuICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPD0gb3B0aW9ucy5jb250ZXh0ICogMiAmJiBpIDwgZGlmZi5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICB2YXIgX2N1clJhbmdlMjsgLy8gT3ZlcmxhcHBpbmdcblxuXG4gICAgICAgICAgICAoX2N1clJhbmdlMiA9IGN1clJhbmdlKS5wdXNoLmFwcGx5KF9jdXJSYW5nZTIsIF90b0NvbnN1bWFibGVBcnJheShjb250ZXh0TGluZXMobGluZXMpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBfY3VyUmFuZ2UzOyAvLyBlbmQgdGhlIHJhbmdlIGFuZCBvdXRwdXRcblxuXG4gICAgICAgICAgICB2YXIgY29udGV4dFNpemUgPSBNYXRoLm1pbihsaW5lcy5sZW5ndGgsIG9wdGlvbnMuY29udGV4dCk7XG5cbiAgICAgICAgICAgIChfY3VyUmFuZ2UzID0gY3VyUmFuZ2UpLnB1c2guYXBwbHkoX2N1clJhbmdlMywgX3RvQ29uc3VtYWJsZUFycmF5KGNvbnRleHRMaW5lcyhsaW5lcy5zbGljZSgwLCBjb250ZXh0U2l6ZSkpKSk7XG5cbiAgICAgICAgICAgIHZhciBodW5rID0ge1xuICAgICAgICAgICAgICBvbGRTdGFydDogb2xkUmFuZ2VTdGFydCxcbiAgICAgICAgICAgICAgb2xkTGluZXM6IG9sZExpbmUgLSBvbGRSYW5nZVN0YXJ0ICsgY29udGV4dFNpemUsXG4gICAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgICBuZXdMaW5lczogbmV3TGluZSAtIG5ld1JhbmdlU3RhcnQgKyBjb250ZXh0U2l6ZSxcbiAgICAgICAgICAgICAgbGluZXM6IGN1clJhbmdlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoaSA+PSBkaWZmLmxlbmd0aCAtIDIgJiYgbGluZXMubGVuZ3RoIDw9IG9wdGlvbnMuY29udGV4dCkge1xuICAgICAgICAgICAgICAvLyBFT0YgaXMgaW5zaWRlIHRoaXMgaHVua1xuICAgICAgICAgICAgICB2YXIgb2xkRU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG9sZFN0cik7XG4gICAgICAgICAgICAgIHZhciBuZXdFT0ZOZXdsaW5lID0gL1xcbiQvLnRlc3QobmV3U3RyKTtcbiAgICAgICAgICAgICAgdmFyIG5vTmxCZWZvcmVBZGRzID0gbGluZXMubGVuZ3RoID09IDAgJiYgY3VyUmFuZ2UubGVuZ3RoID4gaHVuay5vbGRMaW5lcztcblxuICAgICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IG9sZCBoYXMgbm8gZW9sIGFuZCBubyB0cmFpbGluZyBjb250ZXh0OyBuby1ubCBjYW4gZW5kIHVwIGJlZm9yZSBhZGRzXG4gICAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghb2xkRU9GTmV3bGluZSAmJiAhbm9ObEJlZm9yZUFkZHMgfHwgIW5ld0VPRk5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBodW5rcy5wdXNoKGh1bmspO1xuICAgICAgICAgICAgb2xkUmFuZ2VTdGFydCA9IDA7XG4gICAgICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgIG5ld0xpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmYubGVuZ3RoOyBpKyspIHtcbiAgICAgIF9sb29wKGkpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsXG4gICAgICBuZXdGaWxlTmFtZTogbmV3RmlsZU5hbWUsXG4gICAgICBvbGRIZWFkZXI6IG9sZEhlYWRlcixcbiAgICAgIG5ld0hlYWRlcjogbmV3SGVhZGVyLFxuICAgICAgaHVua3M6IGh1bmtzXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGlmZiA9IHN0cnVjdHVyZWRQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucyk7XG4gICAgdmFyIHJldCA9IFtdO1xuXG4gICAgaWYgKG9sZEZpbGVOYW1lID09IG5ld0ZpbGVOYW1lKSB7XG4gICAgICByZXQucHVzaCgnSW5kZXg6ICcgKyBvbGRGaWxlTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgICByZXQucHVzaCgnLS0tICcgKyBkaWZmLm9sZEZpbGVOYW1lICsgKHR5cGVvZiBkaWZmLm9sZEhlYWRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6ICdcXHQnICsgZGlmZi5vbGRIZWFkZXIpKTtcbiAgICByZXQucHVzaCgnKysrICcgKyBkaWZmLm5ld0ZpbGVOYW1lICsgKHR5cGVvZiBkaWZmLm5ld0hlYWRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6ICdcXHQnICsgZGlmZi5uZXdIZWFkZXIpKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuICAgICAgcmV0LnB1c2goJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXMgKyAnICsnICsgaHVuay5uZXdTdGFydCArICcsJyArIGh1bmsubmV3TGluZXMgKyAnIEBAJyk7XG4gICAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQuam9pbignXFxuJykgKyAnXFxuJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBhdGNoKGZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gY3JlYXRlVHdvRmlsZXNQYXRjaChmaWxlTmFtZSwgZmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucyk7XG4gIH1cblxuICBmdW5jdGlvbiBhcnJheUVxdWFsKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5U3RhcnRzV2l0aChhLCBiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5U3RhcnRzV2l0aChhcnJheSwgc3RhcnQpIHtcbiAgICBpZiAoc3RhcnQubGVuZ3RoID4gYXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHN0YXJ0W2ldICE9PSBhcnJheVtpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjTGluZUNvdW50KGh1bmspIHtcbiAgICB2YXIgX2NhbGNPbGROZXdMaW5lQ291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGh1bmsubGluZXMpLFxuICAgICAgICBvbGRMaW5lcyA9IF9jYWxjT2xkTmV3TGluZUNvdW50Lm9sZExpbmVzLFxuICAgICAgICBuZXdMaW5lcyA9IF9jYWxjT2xkTmV3TGluZUNvdW50Lm5ld0xpbmVzO1xuXG4gICAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGh1bmsub2xkTGluZXMgPSBvbGRMaW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGh1bmsub2xkTGluZXM7XG4gICAgfVxuXG4gICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGh1bmsubmV3TGluZXMgPSBuZXdMaW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGh1bmsubmV3TGluZXM7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2UobWluZSwgdGhlaXJzLCBiYXNlKSB7XG4gICAgbWluZSA9IGxvYWRQYXRjaChtaW5lLCBiYXNlKTtcbiAgICB0aGVpcnMgPSBsb2FkUGF0Y2godGhlaXJzLCBiYXNlKTtcbiAgICB2YXIgcmV0ID0ge307IC8vIEZvciBpbmRleCB3ZSBqdXN0IGxldCBpdCBwYXNzIHRocm91Z2ggYXMgaXQgZG9lc24ndCBoYXZlIGFueSBuZWNlc3NhcnkgbWVhbmluZy5cbiAgICAvLyBMZWF2aW5nIHNhbml0eSBjaGVja3Mgb24gdGhpcyB0byB0aGUgQVBJIGNvbnN1bWVyIHRoYXQgbWF5IGtub3cgbW9yZSBhYm91dCB0aGVcbiAgICAvLyBtZWFuaW5nIGluIHRoZWlyIG93biBjb250ZXh0LlxuXG4gICAgaWYgKG1pbmUuaW5kZXggfHwgdGhlaXJzLmluZGV4KSB7XG4gICAgICByZXQuaW5kZXggPSBtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleDtcbiAgICB9XG5cbiAgICBpZiAobWluZS5uZXdGaWxlTmFtZSB8fCB0aGVpcnMubmV3RmlsZU5hbWUpIHtcbiAgICAgIGlmICghZmlsZU5hbWVDaGFuZ2VkKG1pbmUpKSB7XG4gICAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gb3VycywgdXNlIHRoZWlycyAoYW5kIG91cnMgaWYgdGhlaXJzIGRvZXMgbm90IGV4aXN0KVxuICAgICAgICByZXQub2xkRmlsZU5hbWUgPSB0aGVpcnMub2xkRmlsZU5hbWUgfHwgbWluZS5vbGRGaWxlTmFtZTtcbiAgICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gdGhlaXJzLm5ld0ZpbGVOYW1lIHx8IG1pbmUubmV3RmlsZU5hbWU7XG4gICAgICAgIHJldC5vbGRIZWFkZXIgPSB0aGVpcnMub2xkSGVhZGVyIHx8IG1pbmUub2xkSGVhZGVyO1xuICAgICAgICByZXQubmV3SGVhZGVyID0gdGhlaXJzLm5ld0hlYWRlciB8fCBtaW5lLm5ld0hlYWRlcjtcbiAgICAgIH0gZWxzZSBpZiAoIWZpbGVOYW1lQ2hhbmdlZCh0aGVpcnMpKSB7XG4gICAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gdGhlaXJzLCB1c2Ugb3Vyc1xuICAgICAgICByZXQub2xkRmlsZU5hbWUgPSBtaW5lLm9sZEZpbGVOYW1lO1xuICAgICAgICByZXQubmV3RmlsZU5hbWUgPSBtaW5lLm5ld0ZpbGVOYW1lO1xuICAgICAgICByZXQub2xkSGVhZGVyID0gbWluZS5vbGRIZWFkZXI7XG4gICAgICAgIHJldC5uZXdIZWFkZXIgPSBtaW5lLm5ld0hlYWRlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJvdGggY2hhbmdlZC4uLiBmaWd1cmUgaXQgb3V0XG4gICAgICAgIHJldC5vbGRGaWxlTmFtZSA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5vbGRGaWxlTmFtZSwgdGhlaXJzLm9sZEZpbGVOYW1lKTtcbiAgICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0ZpbGVOYW1lLCB0aGVpcnMubmV3RmlsZU5hbWUpO1xuICAgICAgICByZXQub2xkSGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEhlYWRlciwgdGhlaXJzLm9sZEhlYWRlcik7XG4gICAgICAgIHJldC5uZXdIZWFkZXIgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUubmV3SGVhZGVyLCB0aGVpcnMubmV3SGVhZGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXQuaHVua3MgPSBbXTtcbiAgICB2YXIgbWluZUluZGV4ID0gMCxcbiAgICAgICAgdGhlaXJzSW5kZXggPSAwLFxuICAgICAgICBtaW5lT2Zmc2V0ID0gMCxcbiAgICAgICAgdGhlaXJzT2Zmc2V0ID0gMDtcblxuICAgIHdoaWxlIChtaW5lSW5kZXggPCBtaW5lLmh1bmtzLmxlbmd0aCB8fCB0aGVpcnNJbmRleCA8IHRoZWlycy5odW5rcy5sZW5ndGgpIHtcbiAgICAgIHZhciBtaW5lQ3VycmVudCA9IG1pbmUuaHVua3NbbWluZUluZGV4XSB8fCB7XG4gICAgICAgIG9sZFN0YXJ0OiBJbmZpbml0eVxuICAgICAgfSxcbiAgICAgICAgICB0aGVpcnNDdXJyZW50ID0gdGhlaXJzLmh1bmtzW3RoZWlyc0luZGV4XSB8fCB7XG4gICAgICAgIG9sZFN0YXJ0OiBJbmZpbml0eVxuICAgICAgfTtcblxuICAgICAgaWYgKGh1bmtCZWZvcmUobWluZUN1cnJlbnQsIHRoZWlyc0N1cnJlbnQpKSB7XG4gICAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG4gICAgICAgIHJldC5odW5rcy5wdXNoKGNsb25lSHVuayhtaW5lQ3VycmVudCwgbWluZU9mZnNldCkpO1xuICAgICAgICBtaW5lSW5kZXgrKztcbiAgICAgICAgdGhlaXJzT2Zmc2V0ICs9IG1pbmVDdXJyZW50Lm5ld0xpbmVzIC0gbWluZUN1cnJlbnQub2xkTGluZXM7XG4gICAgICB9IGVsc2UgaWYgKGh1bmtCZWZvcmUodGhlaXJzQ3VycmVudCwgbWluZUN1cnJlbnQpKSB7XG4gICAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG4gICAgICAgIHJldC5odW5rcy5wdXNoKGNsb25lSHVuayh0aGVpcnNDdXJyZW50LCB0aGVpcnNPZmZzZXQpKTtcbiAgICAgICAgdGhlaXJzSW5kZXgrKztcbiAgICAgICAgbWluZU9mZnNldCArPSB0aGVpcnNDdXJyZW50Lm5ld0xpbmVzIC0gdGhlaXJzQ3VycmVudC5vbGRMaW5lcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE92ZXJsYXAsIG1lcmdlIGFzIGJlc3Qgd2UgY2FuXG4gICAgICAgIHZhciBtZXJnZWRIdW5rID0ge1xuICAgICAgICAgIG9sZFN0YXJ0OiBNYXRoLm1pbihtaW5lQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCksXG4gICAgICAgICAgb2xkTGluZXM6IDAsXG4gICAgICAgICAgbmV3U3RhcnQ6IE1hdGgubWluKG1pbmVDdXJyZW50Lm5ld1N0YXJ0ICsgbWluZU9mZnNldCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCArIHRoZWlyc09mZnNldCksXG4gICAgICAgICAgbmV3TGluZXM6IDAsXG4gICAgICAgICAgbGluZXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIG1lcmdlTGluZXMobWVyZ2VkSHVuaywgbWluZUN1cnJlbnQub2xkU3RhcnQsIG1pbmVDdXJyZW50LmxpbmVzLCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0LCB0aGVpcnNDdXJyZW50LmxpbmVzKTtcbiAgICAgICAgdGhlaXJzSW5kZXgrKztcbiAgICAgICAgbWluZUluZGV4Kys7XG4gICAgICAgIHJldC5odW5rcy5wdXNoKG1lcmdlZEh1bmspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBsb2FkUGF0Y2gocGFyYW0sIGJhc2UpIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKC9eQEAvbS50ZXN0KHBhcmFtKSB8fCAvXkluZGV4Oi9tLnRlc3QocGFyYW0pKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVBhdGNoKHBhcmFtKVswXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFiYXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIGEgYmFzZSByZWZlcmVuY2Ugb3IgcGFzcyBpbiBhIHBhdGNoJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkUGF0Y2godW5kZWZpbmVkLCB1bmRlZmluZWQsIGJhc2UsIHBhcmFtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW07XG4gIH1cblxuICBmdW5jdGlvbiBmaWxlTmFtZUNoYW5nZWQocGF0Y2gpIHtcbiAgICByZXR1cm4gcGF0Y2gubmV3RmlsZU5hbWUgJiYgcGF0Y2gubmV3RmlsZU5hbWUgIT09IHBhdGNoLm9sZEZpbGVOYW1lO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0RmllbGQoaW5kZXgsIG1pbmUsIHRoZWlycykge1xuICAgIGlmIChtaW5lID09PSB0aGVpcnMpIHtcbiAgICAgIHJldHVybiBtaW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleC5jb25mbGljdCA9IHRydWU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtaW5lOiBtaW5lLFxuICAgICAgICB0aGVpcnM6IHRoZWlyc1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBodW5rQmVmb3JlKHRlc3QsIGNoZWNrKSB7XG4gICAgcmV0dXJuIHRlc3Qub2xkU3RhcnQgPCBjaGVjay5vbGRTdGFydCAmJiB0ZXN0Lm9sZFN0YXJ0ICsgdGVzdC5vbGRMaW5lcyA8IGNoZWNrLm9sZFN0YXJ0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvbmVIdW5rKGh1bmssIG9mZnNldCkge1xuICAgIHJldHVybiB7XG4gICAgICBvbGRTdGFydDogaHVuay5vbGRTdGFydCxcbiAgICAgIG9sZExpbmVzOiBodW5rLm9sZExpbmVzLFxuICAgICAgbmV3U3RhcnQ6IGh1bmsubmV3U3RhcnQgKyBvZmZzZXQsXG4gICAgICBuZXdMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICAgIGxpbmVzOiBodW5rLmxpbmVzXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTGluZXMoaHVuaywgbWluZU9mZnNldCwgbWluZUxpbmVzLCB0aGVpck9mZnNldCwgdGhlaXJMaW5lcykge1xuICAgIC8vIFRoaXMgd2lsbCBnZW5lcmFsbHkgcmVzdWx0IGluIGEgY29uZmxpY3RlZCBodW5rLCBidXQgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSBjb250ZXh0XG4gICAgLy8gaXMgdGhlIG9ubHkgb3ZlcmxhcCB3aGVyZSB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IG1lcmdlIHRoZSBjb250ZW50IGhlcmUuXG4gICAgdmFyIG1pbmUgPSB7XG4gICAgICBvZmZzZXQ6IG1pbmVPZmZzZXQsXG4gICAgICBsaW5lczogbWluZUxpbmVzLFxuICAgICAgaW5kZXg6IDBcbiAgICB9LFxuICAgICAgICB0aGVpciA9IHtcbiAgICAgIG9mZnNldDogdGhlaXJPZmZzZXQsXG4gICAgICBsaW5lczogdGhlaXJMaW5lcyxcbiAgICAgIGluZGV4OiAwXG4gICAgfTsgLy8gSGFuZGxlIGFueSBsZWFkaW5nIGNvbnRlbnRcblxuICAgIGluc2VydExlYWRpbmcoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgIGluc2VydExlYWRpbmcoaHVuaywgdGhlaXIsIG1pbmUpOyAvLyBOb3cgaW4gdGhlIG92ZXJsYXAgY29udGVudC4gU2NhbiB0aHJvdWdoIGFuZCBzZWxlY3QgdGhlIGJlc3QgY2hhbmdlcyBmcm9tIGVhY2guXG5cbiAgICB3aGlsZSAobWluZS5pbmRleCA8IG1pbmUubGluZXMubGVuZ3RoICYmIHRoZWlyLmluZGV4IDwgdGhlaXIubGluZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgbWluZUN1cnJlbnQgPSBtaW5lLmxpbmVzW21pbmUuaW5kZXhdLFxuICAgICAgICAgIHRoZWlyQ3VycmVudCA9IHRoZWlyLmxpbmVzW3RoZWlyLmluZGV4XTtcblxuICAgICAgaWYgKChtaW5lQ3VycmVudFswXSA9PT0gJy0nIHx8IG1pbmVDdXJyZW50WzBdID09PSAnKycpICYmICh0aGVpckN1cnJlbnRbMF0gPT09ICctJyB8fCB0aGVpckN1cnJlbnRbMF0gPT09ICcrJykpIHtcbiAgICAgICAgLy8gQm90aCBtb2RpZmllZCAuLi5cbiAgICAgICAgbXV0dWFsQ2hhbmdlKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnRbMF0gPT09ICcrJyAmJiB0aGVpckN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgICB2YXIgX2h1bmskbGluZXM7IC8vIE1pbmUgaW5zZXJ0ZWRcblxuXG4gICAgICAgIChfaHVuayRsaW5lcyA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXMsIF90b0NvbnN1bWFibGVBcnJheShjb2xsZWN0Q2hhbmdlKG1pbmUpKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJysnICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgICAgdmFyIF9odW5rJGxpbmVzMjsgLy8gVGhlaXJzIGluc2VydGVkXG5cblxuICAgICAgICAoX2h1bmskbGluZXMyID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lczIsIF90b0NvbnN1bWFibGVBcnJheShjb2xsZWN0Q2hhbmdlKHRoZWlyKSkpO1xuICAgICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJy0nICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICAgIC8vIE1pbmUgcmVtb3ZlZCBvciBlZGl0ZWRcbiAgICAgICAgcmVtb3ZhbChodW5rLCBtaW5lLCB0aGVpcik7XG4gICAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgICAgLy8gVGhlaXIgcmVtb3ZlZCBvciBlZGl0ZWRcbiAgICAgICAgcmVtb3ZhbChodW5rLCB0aGVpciwgbWluZSwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50ID09PSB0aGVpckN1cnJlbnQpIHtcbiAgICAgICAgLy8gQ29udGV4dCBpZGVudGl0eVxuICAgICAgICBodW5rLmxpbmVzLnB1c2gobWluZUN1cnJlbnQpO1xuICAgICAgICBtaW5lLmluZGV4Kys7XG4gICAgICAgIHRoZWlyLmluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDb250ZXh0IG1pc21hdGNoXG4gICAgICAgIGNvbmZsaWN0KGh1bmssIGNvbGxlY3RDaGFuZ2UobWluZSksIGNvbGxlY3RDaGFuZ2UodGhlaXIpKTtcbiAgICAgIH1cbiAgICB9IC8vIE5vdyBwdXNoIGFueXRoaW5nIHRoYXQgbWF5IGJlIHJlbWFpbmluZ1xuXG5cbiAgICBpbnNlcnRUcmFpbGluZyhodW5rLCBtaW5lKTtcbiAgICBpbnNlcnRUcmFpbGluZyhodW5rLCB0aGVpcik7XG4gICAgY2FsY0xpbmVDb3VudChodW5rKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG11dHVhbENoYW5nZShodW5rLCBtaW5lLCB0aGVpcikge1xuICAgIHZhciBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuICAgICAgICB0aGVpckNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKHRoZWlyKTtcblxuICAgIGlmIChhbGxSZW1vdmVzKG15Q2hhbmdlcykgJiYgYWxsUmVtb3Zlcyh0aGVpckNoYW5nZXMpKSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHJlbW92ZSBjaGFuZ2VzIHRoYXQgYXJlIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlclxuICAgICAgaWYgKGFycmF5U3RhcnRzV2l0aChteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcykgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KHRoZWlyLCBteUNoYW5nZXMsIG15Q2hhbmdlcy5sZW5ndGggLSB0aGVpckNoYW5nZXMubGVuZ3RoKSkge1xuICAgICAgICB2YXIgX2h1bmskbGluZXMzO1xuXG4gICAgICAgIChfaHVuayRsaW5lczMgPSBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KF9odW5rJGxpbmVzMywgX3RvQ29uc3VtYWJsZUFycmF5KG15Q2hhbmdlcykpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoYXJyYXlTdGFydHNXaXRoKHRoZWlyQ2hhbmdlcywgbXlDaGFuZ2VzKSAmJiBza2lwUmVtb3ZlU3VwZXJzZXQobWluZSwgdGhlaXJDaGFuZ2VzLCB0aGVpckNoYW5nZXMubGVuZ3RoIC0gbXlDaGFuZ2VzLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIF9odW5rJGxpbmVzNDtcblxuICAgICAgICAoX2h1bmskbGluZXM0ID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lczQsIF90b0NvbnN1bWFibGVBcnJheSh0aGVpckNoYW5nZXMpKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcnJheUVxdWFsKG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKSkge1xuICAgICAgdmFyIF9odW5rJGxpbmVzNTtcblxuICAgICAgKF9odW5rJGxpbmVzNSA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXM1LCBfdG9Db25zdW1hYmxlQXJyYXkobXlDaGFuZ2VzKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25mbGljdChodW5rLCBteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyLCBzd2FwKSB7XG4gICAgdmFyIG15Q2hhbmdlcyA9IGNvbGxlY3RDaGFuZ2UobWluZSksXG4gICAgICAgIHRoZWlyQ2hhbmdlcyA9IGNvbGxlY3RDb250ZXh0KHRoZWlyLCBteUNoYW5nZXMpO1xuXG4gICAgaWYgKHRoZWlyQ2hhbmdlcy5tZXJnZWQpIHtcbiAgICAgIHZhciBfaHVuayRsaW5lczY7XG5cbiAgICAgIChfaHVuayRsaW5lczYgPSBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KF9odW5rJGxpbmVzNiwgX3RvQ29uc3VtYWJsZUFycmF5KHRoZWlyQ2hhbmdlcy5tZXJnZWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmxpY3QoaHVuaywgc3dhcCA/IHRoZWlyQ2hhbmdlcyA6IG15Q2hhbmdlcywgc3dhcCA/IG15Q2hhbmdlcyA6IHRoZWlyQ2hhbmdlcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29uZmxpY3QoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgICBodW5rLmNvbmZsaWN0ID0gdHJ1ZTtcbiAgICBodW5rLmxpbmVzLnB1c2goe1xuICAgICAgY29uZmxpY3Q6IHRydWUsXG4gICAgICBtaW5lOiBtaW5lLFxuICAgICAgdGhlaXJzOiB0aGVpclxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0TGVhZGluZyhodW5rLCBpbnNlcnQsIHRoZWlyKSB7XG4gICAgd2hpbGUgKGluc2VydC5vZmZzZXQgPCB0aGVpci5vZmZzZXQgJiYgaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgICAgdmFyIGxpbmUgPSBpbnNlcnQubGluZXNbaW5zZXJ0LmluZGV4KytdO1xuICAgICAgaHVuay5saW5lcy5wdXNoKGxpbmUpO1xuICAgICAgaW5zZXJ0Lm9mZnNldCsrO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydFRyYWlsaW5nKGh1bmssIGluc2VydCkge1xuICAgIHdoaWxlIChpbnNlcnQuaW5kZXggPCBpbnNlcnQubGluZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgbGluZSA9IGluc2VydC5saW5lc1tpbnNlcnQuaW5kZXgrK107XG4gICAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29sbGVjdENoYW5nZShzdGF0ZSkge1xuICAgIHZhciByZXQgPSBbXSxcbiAgICAgICAgb3BlcmF0aW9uID0gc3RhdGUubGluZXNbc3RhdGUuaW5kZXhdWzBdO1xuXG4gICAgd2hpbGUgKHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgbGluZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XTsgLy8gR3JvdXAgYWRkaXRpb25zIHRoYXQgYXJlIGltbWVkaWF0ZWx5IGFmdGVyIHN1YnRyYWN0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyBvbmUgXCJhdG9taWNcIiBtb2RpZnkgY2hhbmdlLlxuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnLScgJiYgbGluZVswXSA9PT0gJysnKSB7XG4gICAgICAgIG9wZXJhdGlvbiA9ICcrJztcbiAgICAgIH1cblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gbGluZVswXSkge1xuICAgICAgICByZXQucHVzaChsaW5lKTtcbiAgICAgICAgc3RhdGUuaW5kZXgrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb2xsZWN0Q29udGV4dChzdGF0ZSwgbWF0Y2hDaGFuZ2VzKSB7XG4gICAgdmFyIGNoYW5nZXMgPSBbXSxcbiAgICAgICAgbWVyZ2VkID0gW10sXG4gICAgICAgIG1hdGNoSW5kZXggPSAwLFxuICAgICAgICBjb250ZXh0Q2hhbmdlcyA9IGZhbHNlLFxuICAgICAgICBjb25mbGljdGVkID0gZmFsc2U7XG5cbiAgICB3aGlsZSAobWF0Y2hJbmRleCA8IG1hdGNoQ2hhbmdlcy5sZW5ndGggJiYgc3RhdGUuaW5kZXggPCBzdGF0ZS5saW5lcy5sZW5ndGgpIHtcbiAgICAgIHZhciBjaGFuZ2UgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF0sXG4gICAgICAgICAgbWF0Y2ggPSBtYXRjaENoYW5nZXNbbWF0Y2hJbmRleF07IC8vIE9uY2Ugd2UndmUgaGl0IG91ciBhZGQsIHRoZW4gd2UgYXJlIGRvbmVcblxuICAgICAgaWYgKG1hdGNoWzBdID09PSAnKycpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHRDaGFuZ2VzID0gY29udGV4dENoYW5nZXMgfHwgY2hhbmdlWzBdICE9PSAnICc7XG4gICAgICBtZXJnZWQucHVzaChtYXRjaCk7XG4gICAgICBtYXRjaEluZGV4Kys7IC8vIENvbnN1bWUgYW55IGFkZGl0aW9ucyBpbiB0aGUgb3RoZXIgYmxvY2sgYXMgYSBjb25mbGljdCB0byBhdHRlbXB0XG4gICAgICAvLyB0byBwdWxsIGluIHRoZSByZW1haW5pbmcgY29udGV4dCBhZnRlciB0aGlzXG5cbiAgICAgIGlmIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgICBjb25mbGljdGVkID0gdHJ1ZTtcblxuICAgICAgICB3aGlsZSAoY2hhbmdlWzBdID09PSAnKycpIHtcbiAgICAgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgICBjaGFuZ2UgPSBzdGF0ZS5saW5lc1srK3N0YXRlLmluZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2guc3Vic3RyKDEpID09PSBjaGFuZ2Uuc3Vic3RyKDEpKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaChjaGFuZ2UpO1xuICAgICAgICBzdGF0ZS5pbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uZmxpY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChtYXRjaENoYW5nZXNbbWF0Y2hJbmRleF0gfHwgJycpWzBdID09PSAnKycgJiYgY29udGV4dENoYW5nZXMpIHtcbiAgICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChjb25mbGljdGVkKSB7XG4gICAgICByZXR1cm4gY2hhbmdlcztcbiAgICB9XG5cbiAgICB3aGlsZSAobWF0Y2hJbmRleCA8IG1hdGNoQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgIG1lcmdlZC5wdXNoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4KytdKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWVyZ2VkOiBtZXJnZWQsXG4gICAgICBjaGFuZ2VzOiBjaGFuZ2VzXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFsbFJlbW92ZXMoY2hhbmdlcykge1xuICAgIHJldHVybiBjaGFuZ2VzLnJlZHVjZShmdW5jdGlvbiAocHJldiwgY2hhbmdlKSB7XG4gICAgICByZXR1cm4gcHJldiAmJiBjaGFuZ2VbMF0gPT09ICctJztcbiAgICB9LCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNraXBSZW1vdmVTdXBlcnNldChzdGF0ZSwgcmVtb3ZlQ2hhbmdlcywgZGVsdGEpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHtcbiAgICAgIHZhciBjaGFuZ2VDb250ZW50ID0gcmVtb3ZlQ2hhbmdlc1tyZW1vdmVDaGFuZ2VzLmxlbmd0aCAtIGRlbHRhICsgaV0uc3Vic3RyKDEpO1xuXG4gICAgICBpZiAoc3RhdGUubGluZXNbc3RhdGUuaW5kZXggKyBpXSAhPT0gJyAnICsgY2hhbmdlQ29udGVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGUuaW5kZXggKz0gZGVsdGE7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmVzKSB7XG4gICAgdmFyIG9sZExpbmVzID0gMDtcbiAgICB2YXIgbmV3TGluZXMgPSAwO1xuICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmICh0eXBlb2YgbGluZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIG15Q291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUubWluZSk7XG4gICAgICAgIHZhciB0aGVpckNvdW50ID0gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lLnRoZWlycyk7XG5cbiAgICAgICAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAobXlDb3VudC5vbGRMaW5lcyA9PT0gdGhlaXJDb3VudC5vbGRMaW5lcykge1xuICAgICAgICAgICAgb2xkTGluZXMgKz0gbXlDb3VudC5vbGRMaW5lcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2xkTGluZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAobXlDb3VudC5uZXdMaW5lcyA9PT0gdGhlaXJDb3VudC5uZXdMaW5lcykge1xuICAgICAgICAgICAgbmV3TGluZXMgKz0gbXlDb3VudC5uZXdMaW5lcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TGluZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCAmJiAobGluZVswXSA9PT0gJysnIHx8IGxpbmVbMF0gPT09ICcgJykpIHtcbiAgICAgICAgICBuZXdMaW5lcysrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQgJiYgKGxpbmVbMF0gPT09ICctJyB8fCBsaW5lWzBdID09PSAnICcpKSB7XG4gICAgICAgICAgb2xkTGluZXMrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBvbGRMaW5lczogb2xkTGluZXMsXG4gICAgICBuZXdMaW5lczogbmV3TGluZXNcbiAgICB9O1xuICB9IC8vIFNlZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoL3dpa2kvQVBJXG5cblxuICBmdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvRE1QKGNoYW5nZXMpIHtcbiAgICB2YXIgcmV0ID0gW10sXG4gICAgICAgIGNoYW5nZSxcbiAgICAgICAgb3BlcmF0aW9uO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuXG4gICAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICAgIG9wZXJhdGlvbiA9IDE7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICAgIG9wZXJhdGlvbiA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlcmF0aW9uID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0LnB1c2goW29wZXJhdGlvbiwgY2hhbmdlLnZhbHVlXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9YTUwoY2hhbmdlcykge1xuICAgIHZhciByZXQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaV07XG5cbiAgICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgICAgcmV0LnB1c2goJzxpbnM+Jyk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICAgIHJldC5wdXNoKCc8ZGVsPicpO1xuICAgICAgfVxuXG4gICAgICByZXQucHVzaChlc2NhcGVIVE1MKGNoYW5nZS52YWx1ZSkpO1xuXG4gICAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICAgIHJldC5wdXNoKCc8L2lucz4nKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgICAgcmV0LnB1c2goJzwvZGVsPicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQuam9pbignJyk7XG4gIH1cblxuICBmdW5jdGlvbiBlc2NhcGVIVE1MKHMpIHtcbiAgICB2YXIgbiA9IHM7XG4gICAgbiA9IG4ucmVwbGFjZSgvJi9nLCAnJmFtcDsnKTtcbiAgICBuID0gbi5yZXBsYWNlKC88L2csICcmbHQ7Jyk7XG4gICAgbiA9IG4ucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuICAgIG4gPSBuLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbiAgICByZXR1cm4gbjtcbiAgfVxuXG4gIHZhciBpbmRleF9lczYgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIERpZmY6IERpZmYsXG4gICAgZGlmZkNoYXJzOiBkaWZmQ2hhcnMsXG4gICAgZGlmZldvcmRzOiBkaWZmV29yZHMsXG4gICAgZGlmZldvcmRzV2l0aFNwYWNlOiBkaWZmV29yZHNXaXRoU3BhY2UsXG4gICAgZGlmZkxpbmVzOiBkaWZmTGluZXMsXG4gICAgZGlmZlRyaW1tZWRMaW5lczogZGlmZlRyaW1tZWRMaW5lcyxcbiAgICBkaWZmU2VudGVuY2VzOiBkaWZmU2VudGVuY2VzLFxuICAgIGRpZmZDc3M6IGRpZmZDc3MsXG4gICAgZGlmZkpzb246IGRpZmZKc29uLFxuICAgIGRpZmZBcnJheXM6IGRpZmZBcnJheXMsXG4gICAgc3RydWN0dXJlZFBhdGNoOiBzdHJ1Y3R1cmVkUGF0Y2gsXG4gICAgY3JlYXRlVHdvRmlsZXNQYXRjaDogY3JlYXRlVHdvRmlsZXNQYXRjaCxcbiAgICBjcmVhdGVQYXRjaDogY3JlYXRlUGF0Y2gsXG4gICAgYXBwbHlQYXRjaDogYXBwbHlQYXRjaCxcbiAgICBhcHBseVBhdGNoZXM6IGFwcGx5UGF0Y2hlcyxcbiAgICBwYXJzZVBhdGNoOiBwYXJzZVBhdGNoLFxuICAgIG1lcmdlOiBtZXJnZSxcbiAgICBjb252ZXJ0Q2hhbmdlc1RvRE1QOiBjb252ZXJ0Q2hhbmdlc1RvRE1QLFxuICAgIGNvbnZlcnRDaGFuZ2VzVG9YTUw6IGNvbnZlcnRDaGFuZ2VzVG9YTUwsXG4gICAgY2Fub25pY2FsaXplOiBjYW5vbmljYWxpemVcbiAgfSk7XG5cbiAgdmFyIF9zaGltX2ZzID0ge307XG5cbiAgdmFyIF9zaGltX2ZzJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgICdkZWZhdWx0JzogX3NoaW1fZnNcbiAgfSk7XG5cbiAgY29uc3Qgc2VwID0gL1tcXFxcL10vO1xuICBmdW5jdGlvbiBleHRuYW1lKHBhdGgpIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGJhc2VuYW1lKHBhdGgpO1xuICAgIGNvbnN0IGRvdEluZGV4ID0gZmlsZW5hbWUubGFzdEluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChkb3RJbmRleCA9PT0gLTEpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBmaWxlbmFtZS5zbGljZShkb3RJbmRleCk7XG4gIH1cbiAgZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkge1xuICAgIHJldHVybiBwYXRoLnNwbGl0KHNlcCkucG9wKCk7XG4gIH1cbiAgZnVuY3Rpb24gaXNBYnNvbHV0ZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwYXRoID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBleHRuYW1lOiBleHRuYW1lLFxuICAgIGJhc2VuYW1lOiBiYXNlbmFtZSxcbiAgICBpc0Fic29sdXRlOiBpc0Fic29sdXRlXG4gIH0pO1xuXG4gIHZhciBnbG9iYWwkMSA9IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge307XG5cbiAgdmFyIGxvb2t1cCA9IFtdO1xuICB2YXIgcmV2TG9va3VwID0gW107XG4gIHZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXk7XG4gIHZhciBpbml0ZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIGluaXRlZCA9IHRydWU7XG4gICAgdmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgbG9va3VwW2ldID0gY29kZVtpXTtcbiAgICAgIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaTtcbiAgICB9XG5cbiAgICByZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjI7XG4gICAgcmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9CeXRlQXJyYXkoYjY0KSB7XG4gICAgaWYgKCFpbml0ZWQpIHtcbiAgICAgIGluaXQoKTtcbiAgICB9XG5cbiAgICB2YXIgaSwgaiwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFycjtcbiAgICB2YXIgbGVuID0gYjY0Lmxlbmd0aDtcblxuICAgIGlmIChsZW4gJSA0ID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Jyk7XG4gICAgfSAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAgIC8vIGlmIHRoZXJlIGFyZSB0d28gcGxhY2Vob2xkZXJzLCB0aGFuIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgaXRcbiAgICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgICAvLyB0aGlzIGlzIGp1c3QgYSBjaGVhcCBoYWNrIHRvIG5vdCBkbyBpbmRleE9mIHR3aWNlXG5cblxuICAgIHBsYWNlSG9sZGVycyA9IGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDA7IC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuXG4gICAgYXJyID0gbmV3IEFycihsZW4gKiAzIC8gNCAtIHBsYWNlSG9sZGVycyk7IC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblxuICAgIGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gbGVuIC0gNCA6IGxlbjtcbiAgICB2YXIgTCA9IDA7XG5cbiAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgICB0bXAgPSByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4IHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2IHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgICBhcnJbTCsrXSA9IHRtcCA+PiAxNiAmIDB4RkY7XG4gICAgICBhcnJbTCsrXSA9IHRtcCA+PiA4ICYgMHhGRjtcbiAgICAgIGFycltMKytdID0gdG1wICYgMHhGRjtcbiAgICB9XG5cbiAgICBpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG4gICAgICB0bXAgPSByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0O1xuICAgICAgYXJyW0wrK10gPSB0bXAgJiAweEZGO1xuICAgIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgICB0bXAgPSByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDI7XG4gICAgICBhcnJbTCsrXSA9IHRtcCA+PiA4ICYgMHhGRjtcbiAgICAgIGFycltMKytdID0gdG1wICYgMHhGRjtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0KG51bSkge1xuICAgIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArIGxvb2t1cFtudW0gJiAweDNGXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuY29kZUNodW5rKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHRtcDtcbiAgICB2YXIgb3V0cHV0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyB1aW50OFtpICsgMl07XG4gICAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyb21CeXRlQXJyYXkodWludDgpIHtcbiAgICBpZiAoIWluaXRlZCkge1xuICAgICAgaW5pdCgpO1xuICAgIH1cblxuICAgIHZhciB0bXA7XG4gICAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aDtcbiAgICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDM7IC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG5cbiAgICB2YXIgb3V0cHV0ID0gJyc7XG4gICAgdmFyIHBhcnRzID0gW107XG4gICAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODM7IC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuICAgIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIGkgKyBtYXhDaHVua0xlbmd0aCA+IGxlbjIgPyBsZW4yIDogaSArIG1heENodW5rTGVuZ3RoKSk7XG4gICAgfSAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cblxuICAgIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgICB0bXAgPSB1aW50OFtsZW4gLSAxXTtcbiAgICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdO1xuICAgICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPDwgNCAmIDB4M0ZdO1xuICAgICAgb3V0cHV0ICs9ICc9PSc7XG4gICAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXTtcbiAgICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDEwXTtcbiAgICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDQgJiAweDNGXTtcbiAgICAgIG91dHB1dCArPSBsb29rdXBbdG1wIDw8IDIgJiAweDNGXTtcbiAgICAgIG91dHB1dCArPSAnPSc7XG4gICAgfVxuXG4gICAgcGFydHMucHVzaChvdXRwdXQpO1xuICAgIHJldHVybiBwYXJ0cy5qb2luKCcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICAgIHZhciBlLCBtO1xuICAgIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICAgIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICAgIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgICB2YXIgbkJpdHMgPSAtNztcbiAgICB2YXIgaSA9IGlzTEUgPyBuQnl0ZXMgLSAxIDogMDtcbiAgICB2YXIgZCA9IGlzTEUgPyAtMSA6IDE7XG4gICAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV07XG4gICAgaSArPSBkO1xuICAgIGUgPSBzICYgKDEgPDwgLW5CaXRzKSAtIDE7XG4gICAgcyA+Pj0gLW5CaXRzO1xuICAgIG5CaXRzICs9IGVMZW47XG5cbiAgICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gICAgbSA9IGUgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgICBlID4+PSAtbkJpdHM7XG4gICAgbkJpdHMgKz0gbUxlbjtcblxuICAgIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgICBpZiAoZSA9PT0gMCkge1xuICAgICAgZSA9IDEgLSBlQmlhcztcbiAgICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICAgIHJldHVybiBtID8gTmFOIDogKHMgPyAtMSA6IDEpICogSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbik7XG4gICAgICBlID0gZSAtIGVCaWFzO1xuICAgIH1cblxuICAgIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pO1xuICB9XG4gIGZ1bmN0aW9uIHdyaXRlKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gICAgdmFyIGUsIG0sIGM7XG4gICAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gICAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gICAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICAgIHZhciBydCA9IG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwO1xuICAgIHZhciBpID0gaXNMRSA/IDAgOiBuQnl0ZXMgLSAxO1xuICAgIHZhciBkID0gaXNMRSA/IDEgOiAtMTtcbiAgICB2YXIgcyA9IHZhbHVlIDwgMCB8fCB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwID8gMSA6IDA7XG4gICAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7XG5cbiAgICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwO1xuICAgICAgZSA9IGVNYXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKTtcblxuICAgICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgICBlLS07XG4gICAgICAgIGMgKj0gMjtcbiAgICAgIH1cblxuICAgICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICAgIHZhbHVlICs9IHJ0IC8gYztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICAgIGUrKztcbiAgICAgICAgYyAvPSAyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgICAgbSA9IDA7XG4gICAgICAgIGUgPSBlTWF4O1xuICAgICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7XG4gICAgICAgIGUgPSBlICsgZUJpYXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7XG4gICAgICAgIGUgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgICBlID0gZSA8PCBtTGVuIHwgbTtcbiAgICBlTGVuICs9IG1MZW47XG5cbiAgICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjg7XG4gIH1cblxuICB2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcbiAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG4gIH07XG5cbiAgdmFyIElOU1BFQ1RfTUFYX0JZVEVTID0gNTA7XG4gIC8qKlxuICAgKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICAgKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICAgKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gICAqXG4gICAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAgICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICAgKlxuICAgKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gICAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICAgKlxuICAgKiBOb3RlOlxuICAgKlxuICAgKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICAgKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gICAqXG4gICAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICAgKlxuICAgKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICAgKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAgICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAgICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gICAqL1xuXG4gIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsJDEuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkID8gZ2xvYmFsJDEuVFlQRURfQVJSQVlfU1VQUE9SVCA6IHRydWU7XG5cbiAgZnVuY3Rpb24ga01heExlbmd0aCgpIHtcbiAgICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPyAweDdmZmZmZmZmIDogMHgzZmZmZmZmZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpIHtcbiAgICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiB0aGF0O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAgICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICAgKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gICAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gICAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gICAqXG4gICAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAgICovXG5cblxuICBmdW5jdGlvbiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgICB9IC8vIENvbW1vbiBjYXNlLlxuXG5cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7XG4gIH1cbiAgQnVmZmVyLnBvb2xTaXplID0gODE5MjsgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuICAvLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cblxuICBCdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gICAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gICAgcmV0dXJuIGFycjtcbiAgfTtcblxuICBmdW5jdGlvbiBmcm9tKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAgICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gICAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAgICogQnVmZmVyLmZyb20oYXJyYXkpXG4gICAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAgICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gICAqKi9cblxuXG4gIEJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlO1xuICAgIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5O1xuICB9XG5cbiAgZnVuY3Rpb24gYXNzZXJ0U2l6ZShzaXplKSB7XG4gICAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFsbG9jKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gICAgYXNzZXJ0U2l6ZShzaXplKTtcblxuICAgIGlmIChzaXplIDw9IDApIHtcbiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICAgKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gICAqKi9cblxuXG4gIEJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICAgIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gYWxsb2NVbnNhZmUodGhhdCwgc2l6ZSkge1xuICAgIGFzc2VydFNpemUoc2l6ZSk7XG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMCk7XG5cbiAgICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgICB0aGF0W2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhhdDtcbiAgfVxuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAgICogKi9cblxuXG4gIEJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpO1xuICB9O1xuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gICAqL1xuXG5cbiAgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGZyb21TdHJpbmcodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgfVxuXG4gICAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7XG4gICAgfVxuXG4gICAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwO1xuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKTtcbiAgICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKTtcblxuICAgIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGF0O1xuICB9XG5cbiAgZnVuY3Rpb24gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDA7XG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1O1xuICAgIH1cblxuICAgIHJldHVybiB0aGF0O1xuICB9XG5cbiAgZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBhcnJheS5ieXRlTGVuZ3RoOyAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpO1xuICAgIH1cblxuICAgIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpO1xuICAgIH1cblxuICAgIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpO1xuICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICAgIH1cblxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgICB0aGF0ID0gYXJyYXk7XG4gICAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhhdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyb21PYmplY3QodGhhdCwgb2JqKSB7XG4gICAgaWYgKGludGVybmFsSXNCdWZmZXIob2JqKSkge1xuICAgICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwO1xuICAgICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pO1xuXG4gICAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgICB9XG5cbiAgICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbik7XG4gICAgICByZXR1cm4gdGhhdDtcbiAgICB9XG5cbiAgICBpZiAob2JqKSB7XG4gICAgICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tlZChsZW5ndGgpIHtcbiAgICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpO1xuICAgIH1cblxuICAgIHJldHVybiBsZW5ndGggfCAwO1xuICB9XG4gIEJ1ZmZlci5pc0J1ZmZlciA9IGlzQnVmZmVyO1xuXG4gIGZ1bmN0aW9uIGludGVybmFsSXNCdWZmZXIoYikge1xuICAgIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpO1xuICB9XG5cbiAgQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICBpZiAoIWludGVybmFsSXNCdWZmZXIoYSkgfHwgIWludGVybmFsSXNCdWZmZXIoYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKTtcbiAgICB9XG5cbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIDA7XG4gICAgdmFyIHggPSBhLmxlbmd0aDtcbiAgICB2YXIgeSA9IGIubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICAgIHggPSBhW2ldO1xuICAgICAgICB5ID0gYltpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHggPCB5KSByZXR1cm4gLTE7XG4gICAgaWYgKHkgPCB4KSByZXR1cm4gMTtcbiAgICByZXR1cm4gMDtcbiAgfTtcblxuICBCdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdChsaXN0LCBsZW5ndGgpIHtcbiAgICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO1xuICAgIH1cblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICB9XG5cbiAgICB2YXIgaTtcblxuICAgIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGVuZ3RoID0gMDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKTtcbiAgICB2YXIgcG9zID0gMDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYnVmID0gbGlzdFtpXTtcblxuICAgICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGJ1ZikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7XG4gICAgICB9XG5cbiAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKTtcbiAgICAgIHBvcyArPSBidWYubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBidWZmZXI7XG4gIH07XG5cbiAgZnVuY3Rpb24gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB7XG4gICAgaWYgKGludGVybmFsSXNCdWZmZXIoc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHN0cmluZy5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICBzdHJpbmcgPSAnJyArIHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aDtcbiAgICBpZiAobGVuID09PSAwKSByZXR1cm4gMDsgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG5cbiAgICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZTtcblxuICAgIGZvciAoOzspIHtcbiAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgIHJldHVybiBsZW47XG5cbiAgICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoO1xuXG4gICAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgICAgcmV0dXJuIGxlbiAqIDI7XG5cbiAgICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgICByZXR1cm4gbGVuID4+PiAxO1xuXG4gICAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGg7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aDsgLy8gYXNzdW1lIHV0ZjhcblxuICAgICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDtcblxuICBmdW5jdGlvbiBzbG93VG9TdHJpbmcoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZTsgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gICAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cbiAgICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cblxuICAgIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH0gLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuXG5cbiAgICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKGVuZCA8PSAwKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuXG5cbiAgICBlbmQgPj4+PSAwO1xuICAgIHN0YXJ0ID4+Pj0gMDtcblxuICAgIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4JztcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKTtcblxuICAgICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgY2FzZSAndWNzMic6XG4gICAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICAgICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuICAvLyBCdWZmZXIgaW5zdGFuY2VzLlxuXG5cbiAgQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIHN3YXAoYiwgbiwgbSkge1xuICAgIHZhciBpID0gYltuXTtcbiAgICBiW25dID0gYlttXTtcbiAgICBiW21dID0gaTtcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2KCkge1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgICBzd2FwKHRoaXMsIGksIGkgKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMigpIHtcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG5cbiAgICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgc3dhcCh0aGlzLCBpLCBpICsgMyk7XG4gICAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQoKSB7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICAgIHN3YXAodGhpcywgaSwgaSArIDcpO1xuICAgICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpO1xuICAgICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpO1xuICAgICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwO1xuICAgIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpO1xuICAgIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhiKSB7XG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJyk7XG4gICAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICB2YXIgbWF4ID0gSU5TUEVDVF9NQVhfQllURVM7XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKTtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICc7XG4gICAgfVxuXG4gICAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPic7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICAgIGlmICghaW50ZXJuYWxJc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwO1xuICAgIH1cblxuICAgIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpc1N0YXJ0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgc3RhcnQgPj4+PSAwO1xuICAgIGVuZCA+Pj49IDA7XG4gICAgdGhpc1N0YXJ0ID4+Pj0gMDtcbiAgICB0aGlzRW5kID4+Pj0gMDtcbiAgICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMDtcbiAgICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnQ7XG4gICAgdmFyIHkgPSBlbmQgLSBzdGFydDtcbiAgICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSk7XG4gICAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpO1xuICAgIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICAgIHggPSB0aGlzQ29weVtpXTtcbiAgICAgICAgeSA9IHRhcmdldENvcHlbaV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh4IDwgeSkgcmV0dXJuIC0xO1xuICAgIGlmICh5IDwgeCkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIDA7XG4gIH07IC8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbiAgLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbiAgLy9cbiAgLy8gQXJndW1lbnRzOlxuICAvLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuICAvLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuICAvLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbiAgLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbiAgLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcblxuXG4gIGZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gICAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMTsgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcblxuICAgIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldDtcbiAgICAgIGJ5dGVPZmZzZXQgPSAwO1xuICAgIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmO1xuICAgIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDA7XG4gICAgfVxuXG4gICAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0OyAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuXG4gICAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogYnVmZmVyLmxlbmd0aCAtIDE7XG4gICAgfSAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuXG5cbiAgICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldDtcblxuICAgIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgIGlmIChkaXIpIHJldHVybiAtMTtlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMTtcbiAgICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMDtlbHNlIHJldHVybiAtMTtcbiAgICB9IC8vIE5vcm1hbGl6ZSB2YWxcblxuXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKTtcbiAgICB9IC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG5cblxuICAgIGlmIChpbnRlcm5hbElzQnVmZmVyKHZhbCkpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgdmFsID0gdmFsICYgMHhGRjsgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuXG4gICAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGRpcikge1xuICAgICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgW3ZhbF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXJyYXlJbmRleE9mKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gICAgdmFyIGluZGV4U2l6ZSA9IDE7XG4gICAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGg7XG4gICAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGg7XG5cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8IGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXhTaXplID0gMjtcbiAgICAgICAgYXJyTGVuZ3RoIC89IDI7XG4gICAgICAgIHZhbExlbmd0aCAvPSAyO1xuICAgICAgICBieXRlT2Zmc2V0IC89IDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZChidWYsIGkpIHtcbiAgICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGJ1ZltpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpO1xuXG4gICAgaWYgKGRpcikge1xuICAgICAgdmFyIGZvdW5kSW5kZXggPSAtMTtcblxuICAgICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpO1xuICAgICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4O1xuICAgICAgICAgIGZvdW5kSW5kZXggPSAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aDtcblxuICAgICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGZvdW5kID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGhleFdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDA7XG4gICAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXQ7XG5cbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKTtcblxuICAgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICB9XG4gICAgfSAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuXG5cbiAgICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aDtcbiAgICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJyk7XG5cbiAgICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgICAgbGVuZ3RoID0gc3RyTGVuIC8gMjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KTtcbiAgICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaTtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gaTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHV0ZjhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGF0aW4xV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhc2U2NFdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7XG4gIH1cblxuICBmdW5jdGlvbiB1Y3MyV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICAgIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICAgIG9mZnNldCA9IDA7IC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gb2Zmc2V0O1xuICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgICBvZmZzZXQgPSAwOyAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICAgIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcblxuICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMDtcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5jb2RpbmcgPSBsZW5ndGg7XG4gICAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnKTtcbiAgICB9XG5cbiAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXQ7XG4gICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nO1xuXG4gICAgaWYgKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4JztcbiAgICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZTtcblxuICAgIGZvciAoOzspIHtcbiAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCk7XG5cbiAgICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpO1xuXG4gICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcblxuICAgICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcblxuICAgICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpO1xuXG4gICAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdCdWZmZXInLFxuICAgICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBiYXNlNjRTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZnJvbUJ5dGVBcnJheShidWYpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHV0ZjhTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgaSA9IHN0YXJ0O1xuXG4gICAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV07XG4gICAgICB2YXIgY29kZVBvaW50ID0gbnVsbDtcbiAgICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gZmlyc3RCeXRlID4gMHhFRiA/IDQgOiBmaXJzdEJ5dGUgPiAweERGID8gMyA6IGZpcnN0Qnl0ZSA+IDB4QkYgPyAyIDogMTtcblxuICAgICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50O1xuXG4gICAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcblxuICAgICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCBzZWNvbmRCeXRlICYgMHgzRjtcblxuICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdO1xuXG4gICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgdGhpcmRCeXRlICYgMHgzRjtcblxuICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdO1xuICAgICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXTtcbiAgICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdO1xuXG4gICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IGZvdXJ0aEJ5dGUgJiAweDNGO1xuXG4gICAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICAgIGNvZGVQb2ludCA9IDB4RkZGRDtcbiAgICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDE7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcbiAgICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkY7XG4gICAgICB9XG5cbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCk7XG4gICAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpO1xuICB9IC8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuICAvLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4gIC8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcblxuXG4gIHZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMDtcblxuICBmdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkoY29kZVBvaW50cykge1xuICAgIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cyk7IC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgICB9IC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cblxuXG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBmdW5jdGlvbiBhc2NpaVNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIHZhciByZXQgPSAnJztcbiAgICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpO1xuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBsYXRpbjFTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgcmV0ID0gJyc7XG4gICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTtcblxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBoZXhTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgbGVuID0gYnVmLmxlbmd0aDtcbiAgICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwO1xuICAgIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW47XG4gICAgdmFyIG91dCA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIG91dCArPSB0b0hleChidWZbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmdW5jdGlvbiB1dGYxNmxlU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIHZhciByZXMgPSAnJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG4gICAgc3RhcnQgPSB+fnN0YXJ0O1xuICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmQ7XG5cbiAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICBzdGFydCArPSBsZW47XG4gICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7XG4gICAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgICAgc3RhcnQgPSBsZW47XG4gICAgfVxuXG4gICAgaWYgKGVuZCA8IDApIHtcbiAgICAgIGVuZCArPSBsZW47XG4gICAgICBpZiAoZW5kIDwgMCkgZW5kID0gMDtcbiAgICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgICAgZW5kID0gbGVuO1xuICAgIH1cblxuICAgIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQ7XG4gICAgdmFyIG5ld0J1ZjtcblxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKTtcbiAgICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydDtcbiAgICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0J1ZjtcbiAgfTtcbiAgLypcbiAgICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gY2hlY2tPZmZzZXQob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICAgIGlmIChvZmZzZXQgJSAxICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKTtcbiAgICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpO1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRShvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG4gICAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XTtcbiAgICB2YXIgbXVsID0gMTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcblxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF07XG4gICAgdmFyIG11bCA9IDE7XG5cbiAgICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgODtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSA8PCA4IHwgdGhpc1tvZmZzZXQgKyAxXTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuICh0aGlzW29mZnNldF0gfCB0aGlzW29mZnNldCArIDFdIDw8IDggfCB0aGlzW29mZnNldCArIDJdIDw8IDE2KSArIHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDA7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzW29mZnNldF0gKiAweDEwMDAwMDAgKyAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNiB8IHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgM10pO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdO1xuICAgIHZhciBtdWwgPSAxO1xuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bDtcbiAgICB9XG5cbiAgICBtdWwgKj0gMHg4MDtcbiAgICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKTtcbiAgICByZXR1cm4gdmFsO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgaSA9IGJ5dGVMZW5ndGg7XG4gICAgdmFyIG11bCA9IDE7XG4gICAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXTtcblxuICAgIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bDtcbiAgICB9XG5cbiAgICBtdWwgKj0gMHg4MDtcbiAgICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKTtcbiAgICByZXR1cm4gdmFsO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCk7XG4gICAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiB0aGlzW29mZnNldF07XG4gICAgcmV0dXJuICgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCB0aGlzW29mZnNldCArIDFdIDw8IDg7XG4gICAgcmV0dXJuIHZhbCAmIDB4ODAwMCA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWw7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8IHRoaXNbb2Zmc2V0XSA8PCA4O1xuICAgIHJldHVybiB2YWwgJiAweDgwMDAgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYgfCB0aGlzW29mZnNldCArIDNdIDw8IDI0O1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSA8PCAyNCB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYgfCB0aGlzW29mZnNldCArIDJdIDw8IDggfCB0aGlzW29mZnNldCArIDNdO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNCk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gcmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNCk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiByZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gcmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gY2hlY2tJbnQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO1xuICAgIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7XG4gICAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKTtcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuXG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMTtcbiAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKTtcbiAgICB9XG5cbiAgICB2YXIgbXVsID0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGO1xuXG4gICAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAvIG11bCAmIDB4RkY7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDA7XG5cbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxO1xuICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApO1xuICAgIH1cblxuICAgIHZhciBpID0gYnl0ZUxlbmd0aCAtIDE7XG4gICAgdmFyIG11bCA9IDE7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRjtcblxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlIC8gbXVsICYgMHhGRjtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4KHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKTtcbiAgICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZjtcbiAgICByZXR1cm4gb2Zmc2V0ICsgMTtcbiAgfTtcblxuICBmdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNihidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgMHhmZiA8PCA4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDg7XG4gICAgfVxuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKTtcblxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmO1xuICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4O1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgMjtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApO1xuXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gODtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgMjtcbiAgfTtcblxuICBmdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMihidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDggJiAweGZmO1xuICAgIH1cbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApO1xuXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICB0aGlzW29mZnNldCArIDNdID0gdmFsdWUgPj4+IDI0O1xuICAgICAgdGhpc1tvZmZzZXQgKyAyXSA9IHZhbHVlID4+PiAxNjtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gODtcbiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZjtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIDQ7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMCk7XG5cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlID4+PiAyNDtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gMTY7XG4gICAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDg7XG4gICAgICB0aGlzW29mZnNldCArIDNdID0gdmFsdWUgJiAweGZmO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIDQ7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG5cbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpO1xuICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpO1xuICAgIH1cblxuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbXVsID0gMTtcbiAgICB2YXIgc3ViID0gMDtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkY7XG5cbiAgICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgICAgc3ViID0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCA+PiAwKSAtIHN1YiAmIDB4RkY7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG5cbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpO1xuICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpO1xuICAgIH1cblxuICAgIHZhciBpID0gYnl0ZUxlbmd0aCAtIDE7XG4gICAgdmFyIG11bCA9IDE7XG4gICAgdmFyIHN1YiA9IDA7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRjtcblxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgICAgc3ViID0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCA+PiAwKSAtIHN1YiAmIDB4RkY7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDgodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKTtcbiAgICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMTtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgcmV0dXJuIG9mZnNldCArIDE7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMCk7XG5cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZjtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gODtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIDI7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMCk7XG5cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlID4+PiA4O1xuICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlICYgMHhmZjtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgKyAyO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCk7XG5cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZjtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gODtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gMTY7XG4gICAgICB0aGlzW29mZnNldCArIDNdID0gdmFsdWUgPj4+IDI0O1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgNDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApO1xuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMTtcblxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDI0O1xuICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiAxNjtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gODtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgNDtcbiAgfTtcblxuICBmdW5jdGlvbiBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gICAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKTtcbiAgICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVGbG9hdChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0KTtcbiAgICB9XG5cbiAgICB3cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpO1xuICAgIHJldHVybiBvZmZzZXQgKyA0O1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydCk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHdyaXRlRG91YmxlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgpO1xuICAgIH1cblxuICAgIHdyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOCk7XG4gICAgcmV0dXJuIG9mZnNldCArIDg7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydCk7XG4gIH07IC8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcblxuXG4gIEJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICAgIGlmICghc3RhcnQpIHN0YXJ0ID0gMDtcbiAgICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGg7XG4gICAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwO1xuICAgIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydDsgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG5cbiAgICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDA7XG4gICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwOyAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG5cbiAgICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJyk7XG4gICAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpOyAvLyBBcmUgd2Ugb29iP1xuXG4gICAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aDtcblxuICAgIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnQ7XG4gICAgfVxuXG4gICAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0O1xuICAgIHZhciBpO1xuXG4gICAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodGFyZ2V0LCB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksIHRhcmdldFN0YXJ0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuO1xuICB9OyAvLyBVc2FnZTpcbiAgLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4gIC8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuICAvLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcblxuXG4gIEJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAgIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBlbmNvZGluZyA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgICBlbmNvZGluZyA9IGVuZDtcbiAgICAgICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgICB2YWwgPSBjb2RlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgdmFsID0gdmFsICYgMjU1O1xuICAgIH0gLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG5cblxuICAgIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpO1xuICAgIH1cblxuICAgIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHN0YXJ0ID0gc3RhcnQgPj4+IDA7XG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMDtcbiAgICBpZiAoIXZhbCkgdmFsID0gMDtcbiAgICB2YXIgaTtcblxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICB0aGlzW2ldID0gdmFsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYnl0ZXMgPSBpbnRlcm5hbElzQnVmZmVyKHZhbCkgPyB2YWwgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpO1xuICAgICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07IC8vIEhFTFBFUiBGVU5DVElPTlNcbiAgLy8gPT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nO1xuXG4gIGZ1bmN0aW9uIGJhc2U2NGNsZWFuKHN0cikge1xuICAgIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICAgIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJyk7IC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcblxuICAgIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnOyAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcblxuICAgIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgICAgc3RyID0gc3RyICsgJz0nO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBmdW5jdGlvbiBzdHJpbmd0cmltKHN0cikge1xuICAgIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKCk7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XG4gIH1cblxuICBmdW5jdGlvbiB0b0hleChuKSB7XG4gICAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpO1xuICAgIHJldHVybiBuLnRvU3RyaW5nKDE2KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cmluZywgdW5pdHMpIHtcbiAgICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5O1xuICAgIHZhciBjb2RlUG9pbnQ7XG4gICAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsO1xuICAgIHZhciBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7IC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcblxuICAgICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gLy8gdmFsaWQgbGVhZFxuXG5cbiAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IC8vIDIgbGVhZHMgaW4gYSByb3dcblxuXG4gICAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuXG5cbiAgICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgIH1cblxuICAgICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGw7IC8vIGVuY29kZSB1dGY4XG5cbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVhaztcbiAgICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpO1xuICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWs7XG4gICAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwKTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWs7XG4gICAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCwgY29kZVBvaW50ICYgMHgzRiB8IDB4ODApO1xuICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWs7XG4gICAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLCBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCwgY29kZVBvaW50ICYgMHgzRiB8IDB4ODApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYnl0ZXM7XG4gIH1cblxuICBmdW5jdGlvbiBhc2NpaVRvQnl0ZXMoc3RyKSB7XG4gICAgdmFyIGJ5dGVBcnJheSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnl0ZUFycmF5O1xuICB9XG5cbiAgZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMoc3RyLCB1bml0cykge1xuICAgIHZhciBjLCBoaSwgbG87XG4gICAgdmFyIGJ5dGVBcnJheSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVhaztcbiAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIGhpID0gYyA+PiA4O1xuICAgICAgbG8gPSBjICUgMjU2O1xuICAgICAgYnl0ZUFycmF5LnB1c2gobG8pO1xuICAgICAgYnl0ZUFycmF5LnB1c2goaGkpO1xuICAgIH1cblxuICAgIHJldHVybiBieXRlQXJyYXk7XG4gIH1cblxuICBmdW5jdGlvbiBiYXNlNjRUb0J5dGVzKHN0cikge1xuICAgIHJldHVybiB0b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJsaXRCdWZmZXIoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCB8fCBpID49IHNyYy5sZW5ndGgpIGJyZWFrO1xuICAgICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNuYW4odmFsKSB7XG4gICAgcmV0dXJuIHZhbCAhPT0gdmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICB9IC8vIHRoZSBmb2xsb3dpbmcgaXMgZnJvbSBpcy1idWZmZXIsIGFsc28gYnkgRmVyb3NzIEFib3VraGFkaWplaCBhbmQgd2l0aCBzYW1lIGxpc2VuY2VcbiAgLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuICAvLyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLiBSZW1vdmUgdGhpcyBldmVudHVhbGx5XG5cblxuICBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgKCEhb2JqLl9pc0J1ZmZlciB8fCBpc0Zhc3RCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0Zhc3RCdWZmZXIob2JqKSB7XG4gICAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaik7XG4gIH0gLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cblxuXG4gIGZ1bmN0aW9uIGlzU2xvd0J1ZmZlcihvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzRmFzdEJ1ZmZlcihvYmouc2xpY2UoMCwgMCkpO1xuICB9XG5cbiAgdmFyIGNvbW1vbmpzR2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge307XG5cbiAgZnVuY3Rpb24gdW53cmFwRXhwb3J0cyAoeCkge1xuICBcdHJldHVybiB4ICYmIHguX19lc01vZHVsZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ2RlZmF1bHQnKSA/IHhbJ2RlZmF1bHQnXSA6IHg7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgbW9kdWxlKSB7XG4gIFx0cmV0dXJuIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZSAobikge1xuICBcdHJldHVybiBuICYmIG5bJ2RlZmF1bHQnXSB8fCBuO1xuICB9XG5cbiAgdmFyIGZzID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShfc2hpbV9mcyQxKTtcblxuICAvKipcbiAgICogQGNsYXNzXG4gICAqL1xuXG5cbiAgY2xhc3MgTGluZUJ5TGluZSB7XG4gICAgY29uc3RydWN0b3IoZmlsZSwgb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICBpZiAoIW9wdGlvbnMucmVhZENodW5rKSBvcHRpb25zLnJlYWRDaHVuayA9IDEwMjQ7XG5cbiAgICAgIGlmICghb3B0aW9ucy5uZXdMaW5lQ2hhcmFjdGVyKSB7XG4gICAgICAgIG9wdGlvbnMubmV3TGluZUNoYXJhY3RlciA9IDB4MGE7IC8vbGludXggbGluZSBlbmRpbmdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMubmV3TGluZUNoYXJhY3RlciA9IG9wdGlvbnMubmV3TGluZUNoYXJhY3Rlci5jaGFyQ29kZUF0KDApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGZpbGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuZmQgPSBmaWxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mZCA9IGZzLm9wZW5TeW5jKGZpbGUsICdyJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB0aGlzLm5ld0xpbmVDaGFyYWN0ZXIgPSBvcHRpb25zLm5ld0xpbmVDaGFyYWN0ZXI7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgX3NlYXJjaEluQnVmZmVyKGJ1ZmZlciwgaGV4TmVlZGxlKSB7XG4gICAgICBsZXQgZm91bmQgPSAtMTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gYnVmZmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBiX2J5dGUgPSBidWZmZXJbaV07XG5cbiAgICAgICAgaWYgKGJfYnl0ZSA9PT0gaGV4TmVlZGxlKSB7XG4gICAgICAgICAgZm91bmQgPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgIHRoaXMuZW9mUmVhY2hlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5saW5lc0NhY2hlID0gW107XG4gICAgICB0aGlzLmZkUG9zaXRpb24gPSAwO1xuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgZnMuY2xvc2VTeW5jKHRoaXMuZmQpO1xuICAgICAgdGhpcy5mZCA9IG51bGw7XG4gICAgfVxuXG4gICAgX2V4dHJhY3RMaW5lcyhidWZmZXIpIHtcbiAgICAgIGxldCBsaW5lO1xuICAgICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAgIGxldCBidWZmZXJQb3NpdGlvbiA9IDA7XG4gICAgICBsZXQgbGFzdE5ld0xpbmVCdWZmZXJQb3NpdGlvbiA9IDA7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCBidWZmZXJQb3NpdGlvblZhbHVlID0gYnVmZmVyW2J1ZmZlclBvc2l0aW9uKytdO1xuXG4gICAgICAgIGlmIChidWZmZXJQb3NpdGlvblZhbHVlID09PSB0aGlzLm5ld0xpbmVDaGFyYWN0ZXIpIHtcbiAgICAgICAgICBsaW5lID0gYnVmZmVyLnNsaWNlKGxhc3ROZXdMaW5lQnVmZmVyUG9zaXRpb24sIGJ1ZmZlclBvc2l0aW9uKTtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIGxhc3ROZXdMaW5lQnVmZmVyUG9zaXRpb24gPSBidWZmZXJQb3NpdGlvbjtcbiAgICAgICAgfSBlbHNlIGlmICghYnVmZmVyUG9zaXRpb25WYWx1ZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBsZWZ0b3ZlcnMgPSBidWZmZXIuc2xpY2UobGFzdE5ld0xpbmVCdWZmZXJQb3NpdGlvbiwgYnVmZmVyUG9zaXRpb24pO1xuXG4gICAgICBpZiAobGVmdG92ZXJzLmxlbmd0aCkge1xuICAgICAgICBsaW5lcy5wdXNoKGxlZnRvdmVycyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG5cbiAgICBfcmVhZENodW5rKGxpbmVMZWZ0b3ZlcnMpIHtcbiAgICAgIGxldCB0b3RhbEJ5dGVzUmVhZCA9IDA7XG4gICAgICBsZXQgYnl0ZXNSZWFkO1xuICAgICAgY29uc3QgYnVmZmVycyA9IFtdO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IHJlYWRCdWZmZXIgPSBuZXcgQnVmZmVyKHRoaXMub3B0aW9ucy5yZWFkQ2h1bmspO1xuICAgICAgICBieXRlc1JlYWQgPSBmcy5yZWFkU3luYyh0aGlzLmZkLCByZWFkQnVmZmVyLCAwLCB0aGlzLm9wdGlvbnMucmVhZENodW5rLCB0aGlzLmZkUG9zaXRpb24pO1xuICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IHRvdGFsQnl0ZXNSZWFkICsgYnl0ZXNSZWFkO1xuICAgICAgICB0aGlzLmZkUG9zaXRpb24gPSB0aGlzLmZkUG9zaXRpb24gKyBieXRlc1JlYWQ7XG4gICAgICAgIGJ1ZmZlcnMucHVzaChyZWFkQnVmZmVyKTtcbiAgICAgIH0gd2hpbGUgKGJ5dGVzUmVhZCAmJiB0aGlzLl9zZWFyY2hJbkJ1ZmZlcihidWZmZXJzW2J1ZmZlcnMubGVuZ3RoIC0gMV0sIHRoaXMub3B0aW9ucy5uZXdMaW5lQ2hhcmFjdGVyKSA9PT0gLTEpO1xuXG4gICAgICBsZXQgYnVmZmVyRGF0YSA9IEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG5cbiAgICAgIGlmIChieXRlc1JlYWQgPCB0aGlzLm9wdGlvbnMucmVhZENodW5rKSB7XG4gICAgICAgIHRoaXMuZW9mUmVhY2hlZCA9IHRydWU7XG4gICAgICAgIGJ1ZmZlckRhdGEgPSBidWZmZXJEYXRhLnNsaWNlKDAsIHRvdGFsQnl0ZXNSZWFkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRvdGFsQnl0ZXNSZWFkKSB7XG4gICAgICAgIHRoaXMubGluZXNDYWNoZSA9IHRoaXMuX2V4dHJhY3RMaW5lcyhidWZmZXJEYXRhKTtcblxuICAgICAgICBpZiAobGluZUxlZnRvdmVycykge1xuICAgICAgICAgIHRoaXMubGluZXNDYWNoZVswXSA9IEJ1ZmZlci5jb25jYXQoW2xpbmVMZWZ0b3ZlcnMsIHRoaXMubGluZXNDYWNoZVswXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b3RhbEJ5dGVzUmVhZDtcbiAgICB9XG5cbiAgICBuZXh0KCkge1xuICAgICAgaWYgKCF0aGlzLmZkKSByZXR1cm4gZmFsc2U7XG4gICAgICBsZXQgbGluZSA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5lb2ZSZWFjaGVkICYmIHRoaXMubGluZXNDYWNoZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgICB9XG5cbiAgICAgIGxldCBieXRlc1JlYWQ7XG5cbiAgICAgIGlmICghdGhpcy5saW5lc0NhY2hlLmxlbmd0aCkge1xuICAgICAgICBieXRlc1JlYWQgPSB0aGlzLl9yZWFkQ2h1bmsoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubGluZXNDYWNoZS5sZW5ndGgpIHtcbiAgICAgICAgbGluZSA9IHRoaXMubGluZXNDYWNoZS5zaGlmdCgpO1xuICAgICAgICBjb25zdCBsYXN0TGluZUNoYXJhY3RlciA9IGxpbmVbbGluZS5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAobGFzdExpbmVDaGFyYWN0ZXIgIT09IDB4MGEpIHtcbiAgICAgICAgICBieXRlc1JlYWQgPSB0aGlzLl9yZWFkQ2h1bmsobGluZSk7XG5cbiAgICAgICAgICBpZiAoYnl0ZXNSZWFkKSB7XG4gICAgICAgICAgICBsaW5lID0gdGhpcy5saW5lc0NhY2hlLnNoaWZ0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVvZlJlYWNoZWQgJiYgdGhpcy5saW5lc0NhY2hlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChsaW5lICYmIGxpbmVbbGluZS5sZW5ndGggLSAxXSA9PT0gdGhpcy5uZXdMaW5lQ2hhcmFjdGVyKSB7XG4gICAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKDAsIGxpbmUubGVuZ3RoIC0gMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cblxuICB9XG5cbiAgdmFyIHJlYWRsaW5lcyA9IExpbmVCeUxpbmU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZFxuICAgKiBmcm9tIGtleS12YWx1ZSBgcGFpcnNgLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBzaW5jZSA0LjAuMFxuICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogXy5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXV0pO1xuICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICovXG4gIGZ1bmN0aW9uIGZyb21QYWlycyhwYWlycykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBwYWlycyA9PSBudWxsID8gMCA6IHBhaXJzLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICByZXN1bHRbcGFpclswXV0gPSBwYWlyWzFdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgZnJvbVBhaXJzXzEgPSBmcm9tUGFpcnM7XG5cbiAgY2xhc3MgQ29uZmlnRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4gIGNsYXNzIERlYnVnRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4gIGNsYXNzIFVuZGVmaW5lZFBhcnNlckVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuICB2YXIgZXJyb3JzID0ge1xuICAgIENvbmZpZ0Vycm9yLFxuICAgIERlYnVnRXJyb3IsXG4gICAgVW5kZWZpbmVkUGFyc2VyRXJyb3JcbiAgfTtcblxuICBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gICAgdmFyIHRhcmdldCA9IHt9O1xuICAgIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICB2YXIga2V5LCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgZnVuY3Rpb24gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChzdHJpbmdzLCByYXcpIHtcbiAgICBpZiAoIXJhdykge1xuICAgICAgcmF3ID0gc3RyaW5ncy5zbGljZSgwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdHJpbmdzLCB7XG4gICAgICByYXc6IHtcbiAgICAgICAgdmFsdWU6IE9iamVjdC5mcmVlemUocmF3KVxuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIGJhc2VkIG9mZiBodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qc1xuXG4gIGZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG4gIH1cblxuICB2YXIgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gIHZhciBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuXG4gIGlmICh0eXBlb2YgZ2xvYmFsJDEuc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnbG9iYWwkMS5jbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXG5cbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG5cblxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHF1ZXVlID0gW107XG4gIHZhciBkcmFpbmluZyA9IGZhbHNlO1xuICB2YXIgY3VycmVudFF1ZXVlO1xuICB2YXIgcXVldWVJbmRleCA9IC0xO1xuXG4gIGZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuXG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG5cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4pIHtcbiAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgcXVldWUgPSBbXTtcblxuICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV4dFRpY2soZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuXG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxuICB9IC8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcblxuICBmdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG4gIH1cblxuICBJdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG4gIH07XG5cbiAgdmFyIHRpdGxlID0gJ2Jyb3dzZXInO1xuICB2YXIgcGxhdGZvcm0gPSAnYnJvd3Nlcic7XG4gIHZhciBicm93c2VyID0gdHJ1ZTtcbiAgdmFyIGVudiA9IHt9O1xuICB2YXIgYXJndiA9IFtdO1xuICB2YXIgdmVyc2lvbiQxID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5cbiAgdmFyIHZlcnNpb25zID0ge307XG4gIHZhciByZWxlYXNlID0ge307XG4gIHZhciBjb25maWcgPSB7fTtcblxuICBmdW5jdGlvbiBub29wKCkge31cblxuICB2YXIgb24gPSBub29wO1xuICB2YXIgYWRkTGlzdGVuZXIgPSBub29wO1xuICB2YXIgb25jZSA9IG5vb3A7XG4gIHZhciBvZmYgPSBub29wO1xuICB2YXIgcmVtb3ZlTGlzdGVuZXIgPSBub29wO1xuICB2YXIgcmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbiAgdmFyIGVtaXQgPSBub29wO1xuICBmdW5jdGlvbiBiaW5kaW5nKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgZnVuY3Rpb24gY3dkKCkge1xuICAgIHJldHVybiAnLyc7XG4gIH1cbiAgZnVuY3Rpb24gY2hkaXIoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuICBmdW5jdGlvbiB1bWFzaygpIHtcbiAgICByZXR1cm4gMDtcbiAgfSAvLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rdW1hdmlzL2Jyb3dzZXItcHJvY2Vzcy1ocnRpbWUvYmxvYi9tYXN0ZXIvaW5kZXguanNcblxuICB2YXIgcGVyZm9ybWFuY2UgPSBnbG9iYWwkMS5wZXJmb3JtYW5jZSB8fCB7fTtcblxuICB2YXIgcGVyZm9ybWFuY2VOb3cgPSBwZXJmb3JtYW5jZS5ub3cgfHwgcGVyZm9ybWFuY2UubW96Tm93IHx8IHBlcmZvcm1hbmNlLm1zTm93IHx8IHBlcmZvcm1hbmNlLm9Ob3cgfHwgcGVyZm9ybWFuY2Uud2Via2l0Tm93IHx8IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH07IC8vIGdlbmVyYXRlIHRpbWVzdGFtcCBvciBkZWx0YVxuICAvLyBzZWUgaHR0cDovL25vZGVqcy5vcmcvYXBpL3Byb2Nlc3MuaHRtbCNwcm9jZXNzX3Byb2Nlc3NfaHJ0aW1lXG5cblxuICBmdW5jdGlvbiBocnRpbWUocHJldmlvdXNUaW1lc3RhbXApIHtcbiAgICB2YXIgY2xvY2t0aW1lID0gcGVyZm9ybWFuY2VOb3cuY2FsbChwZXJmb3JtYW5jZSkgKiAxZS0zO1xuICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihjbG9ja3RpbWUpO1xuICAgIHZhciBuYW5vc2Vjb25kcyA9IE1hdGguZmxvb3IoY2xvY2t0aW1lICUgMSAqIDFlOSk7XG5cbiAgICBpZiAocHJldmlvdXNUaW1lc3RhbXApIHtcbiAgICAgIHNlY29uZHMgPSBzZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMF07XG4gICAgICBuYW5vc2Vjb25kcyA9IG5hbm9zZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMV07XG5cbiAgICAgIGlmIChuYW5vc2Vjb25kcyA8IDApIHtcbiAgICAgICAgc2Vjb25kcy0tO1xuICAgICAgICBuYW5vc2Vjb25kcyArPSAxZTk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtzZWNvbmRzLCBuYW5vc2Vjb25kc107XG4gIH1cbiAgdmFyIHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG4gIGZ1bmN0aW9uIHVwdGltZSgpIHtcbiAgICB2YXIgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgIHZhciBkaWYgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTtcbiAgICByZXR1cm4gZGlmIC8gMTAwMDtcbiAgfVxuICB2YXIgcHJvY2VzcyA9IHtcbiAgICBuZXh0VGljazogbmV4dFRpY2ssXG4gICAgdGl0bGU6IHRpdGxlLFxuICAgIGJyb3dzZXI6IGJyb3dzZXIsXG4gICAgZW52OiBlbnYsXG4gICAgYXJndjogYXJndixcbiAgICB2ZXJzaW9uOiB2ZXJzaW9uJDEsXG4gICAgdmVyc2lvbnM6IHZlcnNpb25zLFxuICAgIG9uOiBvbixcbiAgICBhZGRMaXN0ZW5lcjogYWRkTGlzdGVuZXIsXG4gICAgb25jZTogb25jZSxcbiAgICBvZmY6IG9mZixcbiAgICByZW1vdmVMaXN0ZW5lcjogcmVtb3ZlTGlzdGVuZXIsXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzOiByZW1vdmVBbGxMaXN0ZW5lcnMsXG4gICAgZW1pdDogZW1pdCxcbiAgICBiaW5kaW5nOiBiaW5kaW5nLFxuICAgIGN3ZDogY3dkLFxuICAgIGNoZGlyOiBjaGRpcixcbiAgICB1bWFzazogdW1hc2ssXG4gICAgaHJ0aW1lOiBocnRpbWUsXG4gICAgcGxhdGZvcm06IHBsYXRmb3JtLFxuICAgIHJlbGVhc2U6IHJlbGVhc2UsXG4gICAgY29uZmlnOiBjb25maWcsXG4gICAgdXB0aW1lOiB1cHRpbWVcbiAgfTtcblxuICBjb25zdCBkZWJ1ZyA9IHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpIDogKCkgPT4ge307XG4gIHZhciBkZWJ1Z18xID0gZGVidWc7XG5cbiAgLy8gTm90ZTogdGhpcyBpcyB0aGUgc2VtdmVyLm9yZyB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoYXQgaXQgaW1wbGVtZW50c1xuICAvLyBOb3QgbmVjZXNzYXJpbHkgdGhlIHBhY2thZ2UgdmVyc2lvbiBvZiB0aGlzIGNvZGUuXG4gIGNvbnN0IFNFTVZFUl9TUEVDX1ZFUlNJT04gPSAnMi4wLjAnO1xuICBjb25zdCBNQVhfTEVOR1RIID0gMjU2O1xuICBjb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgOTAwNzE5OTI1NDc0MDk5MTsgLy8gTWF4IHNhZmUgc2VnbWVudCBsZW5ndGggZm9yIGNvZXJjaW9uLlxuXG4gIGNvbnN0IE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEggPSAxNjtcbiAgdmFyIGNvbnN0YW50cyA9IHtcbiAgICBTRU1WRVJfU1BFQ19WRVJTSU9OLFxuICAgIE1BWF9MRU5HVEgsXG4gICAgTUFYX1NBRkVfSU5URUdFUixcbiAgICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIXG4gIH07XG5cbiAgdmFyIHJlXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gICAgY29uc3Qge1xuICAgICAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSFxuICAgIH0gPSBjb25zdGFudHM7XG4gICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge307IC8vIFRoZSBhY3R1YWwgcmVnZXhwcyBnbyBvbiBleHBvcnRzLnJlXG5cbiAgICBjb25zdCByZSA9IGV4cG9ydHMucmUgPSBbXTtcbiAgICBjb25zdCBzcmMgPSBleHBvcnRzLnNyYyA9IFtdO1xuICAgIGNvbnN0IHQgPSBleHBvcnRzLnQgPSB7fTtcbiAgICBsZXQgUiA9IDA7XG5cbiAgICBjb25zdCBjcmVhdGVUb2tlbiA9IChuYW1lLCB2YWx1ZSwgaXNHbG9iYWwpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gUisrO1xuICAgICAgZGVidWdfMShpbmRleCwgdmFsdWUpO1xuICAgICAgdFtuYW1lXSA9IGluZGV4O1xuICAgICAgc3JjW2luZGV4XSA9IHZhbHVlO1xuICAgICAgcmVbaW5kZXhdID0gbmV3IFJlZ0V4cCh2YWx1ZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpO1xuICAgIH07IC8vIFRoZSBmb2xsb3dpbmcgUmVndWxhciBFeHByZXNzaW9ucyBjYW4gYmUgdXNlZCBmb3IgdG9rZW5pemluZyxcbiAgICAvLyB2YWxpZGF0aW5nLCBhbmQgcGFyc2luZyBTZW1WZXIgdmVyc2lvbiBzdHJpbmdzLlxuICAgIC8vICMjIE51bWVyaWMgSWRlbnRpZmllclxuICAgIC8vIEEgc2luZ2xlIGAwYCwgb3IgYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgZGlnaXRzLlxuXG5cbiAgICBjcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVInLCAnMHxbMS05XVxcXFxkKicpO1xuICAgIGNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUkxPT1NFJywgJ1swLTldKycpOyAvLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4gICAgLy8gWmVybyBvciBtb3JlIGRpZ2l0cywgZm9sbG93ZWQgYnkgYSBsZXR0ZXIgb3IgaHlwaGVuLCBhbmQgdGhlbiB6ZXJvIG9yXG4gICAgLy8gbW9yZSBsZXR0ZXJzLCBkaWdpdHMsIG9yIGh5cGhlbnMuXG5cbiAgICBjcmVhdGVUb2tlbignTk9OTlVNRVJJQ0lERU5USUZJRVInLCAnXFxcXGQqW2EtekEtWi1dW2EtekEtWjAtOS1dKicpOyAvLyAjIyBNYWluIFZlcnNpb25cbiAgICAvLyBUaHJlZSBkb3Qtc2VwYXJhdGVkIG51bWVyaWMgaWRlbnRpZmllcnMuXG5cbiAgICBjcmVhdGVUb2tlbignTUFJTlZFUlNJT04nLCBcIihcIi5jb25jYXQoc3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdLCBcIilcXFxcLlwiKSArIFwiKFwiLmNvbmNhdChzcmNbdC5OVU1FUklDSURFTlRJRklFUl0sIFwiKVxcXFwuXCIpICsgXCIoXCIuY29uY2F0KHNyY1t0Lk5VTUVSSUNJREVOVElGSUVSXSwgXCIpXCIpKTtcbiAgICBjcmVhdGVUb2tlbignTUFJTlZFUlNJT05MT09TRScsIFwiKFwiLmNvbmNhdChzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXSwgXCIpXFxcXC5cIikgKyBcIihcIi5jb25jYXQoc3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV0sIFwiKVxcXFwuXCIpICsgXCIoXCIuY29uY2F0KHNyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdLCBcIilcIikpOyAvLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uIElkZW50aWZpZXJcbiAgICAvLyBBIG51bWVyaWMgaWRlbnRpZmllciwgb3IgYSBub24tbnVtZXJpYyBpZGVudGlmaWVyLlxuXG4gICAgY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSJywgXCIoPzpcIi5jb25jYXQoc3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdLCBcInxcIikuY29uY2F0KHNyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXSwgXCIpXCIpKTtcbiAgICBjcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRScsIFwiKD86XCIuY29uY2F0KHNyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdLCBcInxcIikuY29uY2F0KHNyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXSwgXCIpXCIpKTsgLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvblxuICAgIC8vIEh5cGhlbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZG90LXNlcGFyYXRlZCBwcmUtcmVsZWFzZSB2ZXJzaW9uXG4gICAgLy8gaWRlbnRpZmllcnMuXG5cbiAgICBjcmVhdGVUb2tlbignUFJFUkVMRUFTRScsIFwiKD86LShcIi5jb25jYXQoc3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdLCBcIig/OlxcXFwuXCIpLmNvbmNhdChzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl0sIFwiKSopKVwiKSk7XG4gICAgY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VMT09TRScsIFwiKD86LT8oXCIuY29uY2F0KHNyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdLCBcIig/OlxcXFwuXCIpLmNvbmNhdChzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXSwgXCIpKikpXCIpKTsgLy8gIyMgQnVpbGQgTWV0YWRhdGEgSWRlbnRpZmllclxuICAgIC8vIEFueSBjb21iaW5hdGlvbiBvZiBkaWdpdHMsIGxldHRlcnMsIG9yIGh5cGhlbnMuXG5cbiAgICBjcmVhdGVUb2tlbignQlVJTERJREVOVElGSUVSJywgJ1swLTlBLVphLXotXSsnKTsgLy8gIyMgQnVpbGQgTWV0YWRhdGFcbiAgICAvLyBQbHVzIHNpZ24sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBlcmlvZC1zZXBhcmF0ZWQgYnVpbGQgbWV0YWRhdGFcbiAgICAvLyBpZGVudGlmaWVycy5cblxuICAgIGNyZWF0ZVRva2VuKCdCVUlMRCcsIFwiKD86XFxcXCsoXCIuY29uY2F0KHNyY1t0LkJVSUxESURFTlRJRklFUl0sIFwiKD86XFxcXC5cIikuY29uY2F0KHNyY1t0LkJVSUxESURFTlRJRklFUl0sIFwiKSopKVwiKSk7IC8vICMjIEZ1bGwgVmVyc2lvbiBTdHJpbmdcbiAgICAvLyBBIG1haW4gdmVyc2lvbiwgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhIHByZS1yZWxlYXNlIHZlcnNpb24gYW5kXG4gICAgLy8gYnVpbGQgbWV0YWRhdGEuXG4gICAgLy8gTm90ZSB0aGF0IHRoZSBvbmx5IG1ham9yLCBtaW5vciwgcGF0Y2gsIGFuZCBwcmUtcmVsZWFzZSBzZWN0aW9ucyBvZlxuICAgIC8vIHRoZSB2ZXJzaW9uIHN0cmluZyBhcmUgY2FwdHVyaW5nIGdyb3Vwcy4gIFRoZSBidWlsZCBtZXRhZGF0YSBpcyBub3QgYVxuICAgIC8vIGNhcHR1cmluZyBncm91cCwgYmVjYXVzZSBpdCBzaG91bGQgbm90IGV2ZXIgYmUgdXNlZCBpbiB2ZXJzaW9uXG4gICAgLy8gY29tcGFyaXNvbi5cblxuICAgIGNyZWF0ZVRva2VuKCdGVUxMUExBSU4nLCBcInY/XCIuY29uY2F0KHNyY1t0Lk1BSU5WRVJTSU9OXSkuY29uY2F0KHNyY1t0LlBSRVJFTEVBU0VdLCBcIj9cIikuY29uY2F0KHNyY1t0LkJVSUxEXSwgXCI/XCIpKTtcbiAgICBjcmVhdGVUb2tlbignRlVMTCcsIFwiXlwiLmNvbmNhdChzcmNbdC5GVUxMUExBSU5dLCBcIiRcIikpOyAvLyBsaWtlIGZ1bGwsIGJ1dCBhbGxvd3MgdjEuMi4zIGFuZCA9MS4yLjMsIHdoaWNoIHBlb3BsZSBkbyBzb21ldGltZXMuXG4gICAgLy8gYWxzbywgMS4wLjBhbHBoYTEgKHByZXJlbGVhc2Ugd2l0aG91dCB0aGUgaHlwaGVuKSB3aGljaCBpcyBwcmV0dHlcbiAgICAvLyBjb21tb24gaW4gdGhlIG5wbSByZWdpc3RyeS5cblxuICAgIGNyZWF0ZVRva2VuKCdMT09TRVBMQUlOJywgXCJbdj1cXFxcc10qXCIuY29uY2F0KHNyY1t0Lk1BSU5WRVJTSU9OTE9PU0VdKS5jb25jYXQoc3JjW3QuUFJFUkVMRUFTRUxPT1NFXSwgXCI/XCIpLmNvbmNhdChzcmNbdC5CVUlMRF0sIFwiP1wiKSk7XG4gICAgY3JlYXRlVG9rZW4oJ0xPT1NFJywgXCJeXCIuY29uY2F0KHNyY1t0LkxPT1NFUExBSU5dLCBcIiRcIikpO1xuICAgIGNyZWF0ZVRva2VuKCdHVExUJywgJygoPzo8fD4pPz0/KScpOyAvLyBTb21ldGhpbmcgbGlrZSBcIjIuKlwiIG9yIFwiMS4yLnhcIi5cbiAgICAvLyBOb3RlIHRoYXQgXCJ4LnhcIiBpcyBhIHZhbGlkIHhSYW5nZSBpZGVudGlmZXIsIG1lYW5pbmcgXCJhbnkgdmVyc2lvblwiXG4gICAgLy8gT25seSB0aGUgZmlyc3QgaXRlbSBpcyBzdHJpY3RseSByZXF1aXJlZC5cblxuICAgIGNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSTE9PU0UnLCBcIlwiLmNvbmNhdChzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXSwgXCJ8eHxYfFxcXFwqXCIpKTtcbiAgICBjcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUicsIFwiXCIuY29uY2F0KHNyY1t0Lk5VTUVSSUNJREVOVElGSUVSXSwgXCJ8eHxYfFxcXFwqXCIpKTtcbiAgICBjcmVhdGVUb2tlbignWFJBTkdFUExBSU4nLCBcIlt2PVxcXFxzXSooXCIuY29uY2F0KHNyY1t0LlhSQU5HRUlERU5USUZJRVJdLCBcIilcIikgKyBcIig/OlxcXFwuKFwiLmNvbmNhdChzcmNbdC5YUkFOR0VJREVOVElGSUVSXSwgXCIpXCIpICsgXCIoPzpcXFxcLihcIi5jb25jYXQoc3JjW3QuWFJBTkdFSURFTlRJRklFUl0sIFwiKVwiKSArIFwiKD86XCIuY29uY2F0KHNyY1t0LlBSRVJFTEVBU0VdLCBcIik/XCIpLmNvbmNhdChzcmNbdC5CVUlMRF0sIFwiP1wiKSArIFwiKT8pP1wiKTtcbiAgICBjcmVhdGVUb2tlbignWFJBTkdFUExBSU5MT09TRScsIFwiW3Y9XFxcXHNdKihcIi5jb25jYXQoc3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXSwgXCIpXCIpICsgXCIoPzpcXFxcLihcIi5jb25jYXQoc3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXSwgXCIpXCIpICsgXCIoPzpcXFxcLihcIi5jb25jYXQoc3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXSwgXCIpXCIpICsgXCIoPzpcIi5jb25jYXQoc3JjW3QuUFJFUkVMRUFTRUxPT1NFXSwgXCIpP1wiKS5jb25jYXQoc3JjW3QuQlVJTERdLCBcIj9cIikgKyBcIik/KT9cIik7XG4gICAgY3JlYXRlVG9rZW4oJ1hSQU5HRScsIFwiXlwiLmNvbmNhdChzcmNbdC5HVExUXSwgXCJcXFxccypcIikuY29uY2F0KHNyY1t0LlhSQU5HRVBMQUlOXSwgXCIkXCIpKTtcbiAgICBjcmVhdGVUb2tlbignWFJBTkdFTE9PU0UnLCBcIl5cIi5jb25jYXQoc3JjW3QuR1RMVF0sIFwiXFxcXHMqXCIpLmNvbmNhdChzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXSwgXCIkXCIpKTsgLy8gQ29lcmNpb24uXG4gICAgLy8gRXh0cmFjdCBhbnl0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGEgcGFydCBvZiBhIHZhbGlkIHNlbXZlclxuXG4gICAgY3JlYXRlVG9rZW4oJ0NPRVJDRScsIFwiXCIuY29uY2F0KCcoXnxbXlxcXFxkXSknICsgJyhcXFxcZHsxLCcpLmNvbmNhdChNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILCBcIn0pXCIpICsgXCIoPzpcXFxcLihcXFxcZHsxLFwiLmNvbmNhdChNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILCBcIn0pKT9cIikgKyBcIig/OlxcXFwuKFxcXFxkezEsXCIuY29uY2F0KE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgsIFwifSkpP1wiKSArIFwiKD86JHxbXlxcXFxkXSlcIik7XG4gICAgY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTCcsIHNyY1t0LkNPRVJDRV0sIHRydWUpOyAvLyBUaWxkZSByYW5nZXMuXG4gICAgLy8gTWVhbmluZyBpcyBcInJlYXNvbmFibHkgYXQgb3IgZ3JlYXRlciB0aGFuXCJcblxuICAgIGNyZWF0ZVRva2VuKCdMT05FVElMREUnLCAnKD86fj4/KScpO1xuICAgIGNyZWF0ZVRva2VuKCdUSUxERVRSSU0nLCBcIihcXFxccyopXCIuY29uY2F0KHNyY1t0LkxPTkVUSUxERV0sIFwiXFxcXHMrXCIpLCB0cnVlKTtcbiAgICBleHBvcnRzLnRpbGRlVHJpbVJlcGxhY2UgPSAnJDF+JztcbiAgICBjcmVhdGVUb2tlbignVElMREUnLCBcIl5cIi5jb25jYXQoc3JjW3QuTE9ORVRJTERFXSkuY29uY2F0KHNyY1t0LlhSQU5HRVBMQUlOXSwgXCIkXCIpKTtcbiAgICBjcmVhdGVUb2tlbignVElMREVMT09TRScsIFwiXlwiLmNvbmNhdChzcmNbdC5MT05FVElMREVdKS5jb25jYXQoc3JjW3QuWFJBTkdFUExBSU5MT09TRV0sIFwiJFwiKSk7IC8vIENhcmV0IHJhbmdlcy5cbiAgICAvLyBNZWFuaW5nIGlzIFwiYXQgbGVhc3QgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGhcIlxuXG4gICAgY3JlYXRlVG9rZW4oJ0xPTkVDQVJFVCcsICcoPzpcXFxcXiknKTtcbiAgICBjcmVhdGVUb2tlbignQ0FSRVRUUklNJywgXCIoXFxcXHMqKVwiLmNvbmNhdChzcmNbdC5MT05FQ0FSRVRdLCBcIlxcXFxzK1wiKSwgdHJ1ZSk7XG4gICAgZXhwb3J0cy5jYXJldFRyaW1SZXBsYWNlID0gJyQxXic7XG4gICAgY3JlYXRlVG9rZW4oJ0NBUkVUJywgXCJeXCIuY29uY2F0KHNyY1t0LkxPTkVDQVJFVF0pLmNvbmNhdChzcmNbdC5YUkFOR0VQTEFJTl0sIFwiJFwiKSk7XG4gICAgY3JlYXRlVG9rZW4oJ0NBUkVUTE9PU0UnLCBcIl5cIi5jb25jYXQoc3JjW3QuTE9ORUNBUkVUXSkuY29uY2F0KHNyY1t0LlhSQU5HRVBMQUlOTE9PU0VdLCBcIiRcIikpOyAvLyBBIHNpbXBsZSBndC9sdC9lcSB0aGluZywgb3IganVzdCBcIlwiIHRvIGluZGljYXRlIFwiYW55IHZlcnNpb25cIlxuXG4gICAgY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JMT09TRScsIFwiXlwiLmNvbmNhdChzcmNbdC5HVExUXSwgXCJcXFxccyooXCIpLmNvbmNhdChzcmNbdC5MT09TRVBMQUlOXSwgXCIpJHxeJFwiKSk7XG4gICAgY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1InLCBcIl5cIi5jb25jYXQoc3JjW3QuR1RMVF0sIFwiXFxcXHMqKFwiKS5jb25jYXQoc3JjW3QuRlVMTFBMQUlOXSwgXCIpJHxeJFwiKSk7IC8vIEFuIGV4cHJlc3Npb24gdG8gc3RyaXAgYW55IHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgZ3RsdCBhbmQgdGhlIHRoaW5nXG4gICAgLy8gaXQgbW9kaWZpZXMsIHNvIHRoYXQgYD4gMS4yLjNgID09PiBgPjEuMi4zYFxuXG4gICAgY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JUUklNJywgXCIoXFxcXHMqKVwiLmNvbmNhdChzcmNbdC5HVExUXSwgXCJcXFxccyooXCIpLmNvbmNhdChzcmNbdC5MT09TRVBMQUlOXSwgXCJ8XCIpLmNvbmNhdChzcmNbdC5YUkFOR0VQTEFJTl0sIFwiKVwiKSwgdHJ1ZSk7XG4gICAgZXhwb3J0cy5jb21wYXJhdG9yVHJpbVJlcGxhY2UgPSAnJDEkMiQzJzsgLy8gU29tZXRoaW5nIGxpa2UgYDEuMi4zIC0gMS4yLjRgXG4gICAgLy8gTm90ZSB0aGF0IHRoZXNlIGFsbCB1c2UgdGhlIGxvb3NlIGZvcm0sIGJlY2F1c2UgdGhleSdsbCBiZVxuICAgIC8vIGNoZWNrZWQgYWdhaW5zdCBlaXRoZXIgdGhlIHN0cmljdCBvciBsb29zZSBjb21wYXJhdG9yIGZvcm1cbiAgICAvLyBsYXRlci5cblxuICAgIGNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRScsIFwiXlxcXFxzKihcIi5jb25jYXQoc3JjW3QuWFJBTkdFUExBSU5dLCBcIilcIikgKyBcIlxcXFxzKy1cXFxccytcIiArIFwiKFwiLmNvbmNhdChzcmNbdC5YUkFOR0VQTEFJTl0sIFwiKVwiKSArIFwiXFxcXHMqJFwiKTtcbiAgICBjcmVhdGVUb2tlbignSFlQSEVOUkFOR0VMT09TRScsIFwiXlxcXFxzKihcIi5jb25jYXQoc3JjW3QuWFJBTkdFUExBSU5MT09TRV0sIFwiKVwiKSArIFwiXFxcXHMrLVxcXFxzK1wiICsgXCIoXCIuY29uY2F0KHNyY1t0LlhSQU5HRVBMQUlOTE9PU0VdLCBcIilcIikgKyBcIlxcXFxzKiRcIik7IC8vIFN0YXIgcmFuZ2VzIGJhc2ljYWxseSBqdXN0IGFsbG93IGFueXRoaW5nIGF0IGFsbC5cblxuICAgIGNyZWF0ZVRva2VuKCdTVEFSJywgJyg8fD4pPz0/XFxcXHMqXFxcXConKTtcbiAgfSk7XG4gIHZhciByZV8yID0gcmVfMS5yZTtcbiAgdmFyIHJlXzMgPSByZV8xLnNyYztcbiAgdmFyIHJlXzQgPSByZV8xLnQ7XG4gIHZhciByZV81ID0gcmVfMS50aWxkZVRyaW1SZXBsYWNlO1xuICB2YXIgcmVfNiA9IHJlXzEuY2FyZXRUcmltUmVwbGFjZTtcbiAgdmFyIHJlXzcgPSByZV8xLmNvbXBhcmF0b3JUcmltUmVwbGFjZTtcblxuICBjb25zdCBudW1lcmljID0gL15bMC05XSskLztcblxuICBjb25zdCBjb21wYXJlSWRlbnRpZmllcnMgPSAoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFudW0gPSBudW1lcmljLnRlc3QoYSk7XG4gICAgY29uc3QgYm51bSA9IG51bWVyaWMudGVzdChiKTtcblxuICAgIGlmIChhbnVtICYmIGJudW0pIHtcbiAgICAgIGEgPSArYTtcbiAgICAgIGIgPSArYjtcbiAgICB9XG5cbiAgICByZXR1cm4gYSA9PT0gYiA/IDAgOiBhbnVtICYmICFibnVtID8gLTEgOiBibnVtICYmICFhbnVtID8gMSA6IGEgPCBiID8gLTEgOiAxO1xuICB9O1xuXG4gIGNvbnN0IHJjb21wYXJlSWRlbnRpZmllcnMgPSAoYSwgYikgPT4gY29tcGFyZUlkZW50aWZpZXJzKGIsIGEpO1xuXG4gIHZhciBpZGVudGlmaWVycyA9IHtcbiAgICBjb21wYXJlSWRlbnRpZmllcnMsXG4gICAgcmNvbXBhcmVJZGVudGlmaWVyc1xuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBNQVhfTEVOR1RIOiBNQVhfTEVOR1RIJDEsXG4gICAgTUFYX1NBRkVfSU5URUdFUjogTUFYX1NBRkVfSU5URUdFUiQxXG4gIH0gPSBjb25zdGFudHM7XG4gIGNvbnN0IHtcbiAgICByZSxcbiAgICB0XG4gIH0gPSByZV8xO1xuICBjb25zdCB7XG4gICAgY29tcGFyZUlkZW50aWZpZXJzOiBjb21wYXJlSWRlbnRpZmllcnMkMVxuICB9ID0gaWRlbnRpZmllcnM7XG5cbiAgY2xhc3MgU2VtVmVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgICBpZiAoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgbG9vc2U6ICEhb3B0aW9ucyxcbiAgICAgICAgICBpbmNsdWRlUHJlcmVsZWFzZTogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICAgICAgaWYgKHZlcnNpb24ubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJiB2ZXJzaW9uLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi52ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBWZXJzaW9uOiBcIi5jb25jYXQodmVyc2lvbikpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIJDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gXCIuY29uY2F0KE1BWF9MRU5HVEgkMSwgXCIgY2hhcmFjdGVyc1wiKSk7XG4gICAgICB9XG5cbiAgICAgIGRlYnVnXzEoJ1NlbVZlcicsIHZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2U7IC8vIHRoaXMgaXNuJ3QgYWN0dWFsbHkgcmVsZXZhbnQgZm9yIHZlcnNpb25zLCBidXQga2VlcCBpdCBzbyB0aGF0IHdlXG4gICAgICAvLyBkb24ndCBydW4gaW50byB0cm91YmxlIHBhc3NpbmcgdGhpcy5vcHRpb25zIGFyb3VuZC5cblxuICAgICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZTtcbiAgICAgIGNvbnN0IG0gPSB2ZXJzaW9uLnRyaW0oKS5tYXRjaChvcHRpb25zLmxvb3NlID8gcmVbdC5MT09TRV0gOiByZVt0LkZVTExdKTtcblxuICAgICAgaWYgKCFtKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIFZlcnNpb246IFwiLmNvbmNhdCh2ZXJzaW9uKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmF3ID0gdmVyc2lvbjsgLy8gdGhlc2UgYXJlIGFjdHVhbGx5IG51bWJlcnNcblxuICAgICAgdGhpcy5tYWpvciA9ICttWzFdO1xuICAgICAgdGhpcy5taW5vciA9ICttWzJdO1xuICAgICAgdGhpcy5wYXRjaCA9ICttWzNdO1xuXG4gICAgICBpZiAodGhpcy5tYWpvciA+IE1BWF9TQUZFX0lOVEVHRVIkMSB8fCB0aGlzLm1ham9yIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1ham9yIHZlcnNpb24nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWlub3IgPiBNQVhfU0FGRV9JTlRFR0VSJDEgfHwgdGhpcy5taW5vciA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtaW5vciB2ZXJzaW9uJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiQxIHx8IHRoaXMucGF0Y2ggPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgcGF0Y2ggdmVyc2lvbicpO1xuICAgICAgfSAvLyBudW1iZXJpZnkgYW55IHByZXJlbGVhc2UgbnVtZXJpYyBpZHNcblxuXG4gICAgICBpZiAoIW1bNF0pIHtcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBtWzRdLnNwbGl0KCcuJykubWFwKGlkID0+IHtcbiAgICAgICAgICBpZiAoL15bMC05XSskLy50ZXN0KGlkKSkge1xuICAgICAgICAgICAgY29uc3QgbnVtID0gK2lkO1xuXG4gICAgICAgICAgICBpZiAobnVtID49IDAgJiYgbnVtIDwgTUFYX1NBRkVfSU5URUdFUiQxKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5idWlsZCA9IG1bNV0gPyBtWzVdLnNwbGl0KCcuJykgOiBbXTtcbiAgICAgIHRoaXMuZm9ybWF0KCk7XG4gICAgfVxuXG4gICAgZm9ybWF0KCkge1xuICAgICAgdGhpcy52ZXJzaW9uID0gXCJcIi5jb25jYXQodGhpcy5tYWpvciwgXCIuXCIpLmNvbmNhdCh0aGlzLm1pbm9yLCBcIi5cIikuY29uY2F0KHRoaXMucGF0Y2gpO1xuXG4gICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnZlcnNpb24gKz0gXCItXCIuY29uY2F0KHRoaXMucHJlcmVsZWFzZS5qb2luKCcuJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy52ZXJzaW9uO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjtcbiAgICB9XG5cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICBkZWJ1Z18xKCdTZW1WZXIuY29tcGFyZScsIHRoaXMudmVyc2lvbiwgdGhpcy5vcHRpb25zLCBvdGhlcik7XG5cbiAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgICBpZiAodHlwZW9mIG90aGVyID09PSAnc3RyaW5nJyAmJiBvdGhlciA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvdGhlci52ZXJzaW9uID09PSB0aGlzLnZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVNYWluKG90aGVyKSB8fCB0aGlzLmNvbXBhcmVQcmUob3RoZXIpO1xuICAgIH1cblxuICAgIGNvbXBhcmVNYWluKG90aGVyKSB7XG4gICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzJDEodGhpcy5tYWpvciwgb3RoZXIubWFqb3IpIHx8IGNvbXBhcmVJZGVudGlmaWVycyQxKHRoaXMubWlub3IsIG90aGVyLm1pbm9yKSB8fCBjb21wYXJlSWRlbnRpZmllcnMkMSh0aGlzLnBhdGNoLCBvdGhlci5wYXRjaCk7XG4gICAgfVxuXG4gICAgY29tcGFyZVByZShvdGhlcikge1xuICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH0gLy8gTk9UIGhhdmluZyBhIHByZXJlbGVhc2UgaXMgPiBoYXZpbmcgb25lXG5cblxuICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IGEgPSB0aGlzLnByZXJlbGVhc2VbaV07XG4gICAgICAgIGNvbnN0IGIgPSBvdGhlci5wcmVyZWxlYXNlW2ldO1xuICAgICAgICBkZWJ1Z18xKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKTtcblxuICAgICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyQxKGEsIGIpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgrK2kpO1xuICAgIH1cblxuICAgIGNvbXBhcmVCdWlsZChvdGhlcikge1xuICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IGEgPSB0aGlzLmJ1aWxkW2ldO1xuICAgICAgICBjb25zdCBiID0gb3RoZXIuYnVpbGRbaV07XG4gICAgICAgIGRlYnVnXzEoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpO1xuXG4gICAgICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzJDEoYSwgYik7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKCsraSk7XG4gICAgfSAvLyBwcmVtaW5vciB3aWxsIGJ1bXAgdGhlIHZlcnNpb24gdXAgdG8gdGhlIG5leHQgbWlub3IgcmVsZWFzZSwgYW5kIGltbWVkaWF0ZWx5XG4gICAgLy8gZG93biB0byBwcmUtcmVsZWFzZS4gcHJlbWFqb3IgYW5kIHByZXBhdGNoIHdvcmsgdGhlIHNhbWUgd2F5LlxuXG5cbiAgICBpbmMocmVsZWFzZSwgaWRlbnRpZmllcikge1xuICAgICAgc3dpdGNoIChyZWxlYXNlKSB7XG4gICAgICAgIGNhc2UgJ3ByZW1ham9yJzpcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLnBhdGNoID0gMDtcbiAgICAgICAgICB0aGlzLm1pbm9yID0gMDtcbiAgICAgICAgICB0aGlzLm1ham9yKys7XG4gICAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3ByZW1pbm9yJzpcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLnBhdGNoID0gMDtcbiAgICAgICAgICB0aGlzLm1pbm9yKys7XG4gICAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3ByZXBhdGNoJzpcbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSBwcmVyZWxlYXNlLCBpdCB3aWxsIGJ1bXAgdG8gdGhlIG5leHQgdmVyc2lvblxuICAgICAgICAgIC8vIGRyb3AgYW55IHByZXJlbGVhc2VzIHRoYXQgbWlnaHQgYWxyZWFkeSBleGlzdCwgc2luY2UgdGhleSBhcmUgbm90XG4gICAgICAgICAgLy8gcmVsZXZhbnQgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyKTtcbiAgICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIG5vbi1wcmVyZWxlYXNlIHZlcnNpb24sIHRoaXMgYWN0cyB0aGUgc2FtZSBhc1xuICAgICAgICAvLyBwcmVwYXRjaC5cblxuICAgICAgICBjYXNlICdwcmVyZWxlYXNlJzpcbiAgICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ21ham9yJzpcbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1ham9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWFqb3IgdmVyc2lvbi5cbiAgICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1ham9yLlxuICAgICAgICAgIC8vIDEuMC4wLTUgYnVtcHMgdG8gMS4wLjBcbiAgICAgICAgICAvLyAxLjEuMCBidW1wcyB0byAyLjAuMFxuICAgICAgICAgIGlmICh0aGlzLm1pbm9yICE9PSAwIHx8IHRoaXMucGF0Y2ggIT09IDAgfHwgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5tYWpvcisrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMubWlub3IgPSAwO1xuICAgICAgICAgIHRoaXMucGF0Y2ggPSAwO1xuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1pbm9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWlub3IgdmVyc2lvbi5cbiAgICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1pbm9yLlxuICAgICAgICAgIC8vIDEuMi4wLTUgYnVtcHMgdG8gMS4yLjBcbiAgICAgICAgICAvLyAxLjIuMSBidW1wcyB0byAxLjMuMFxuICAgICAgICAgIGlmICh0aGlzLnBhdGNoICE9PSAwIHx8IHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMubWlub3IrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnBhdGNoID0gMDtcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdwYXRjaCc6XG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCBpdCB3aWxsIGluY3JlbWVudCB0aGUgcGF0Y2guXG4gICAgICAgICAgLy8gSWYgaXQgaXMgYSBwcmUtcmVsZWFzZSBpdCB3aWxsIGJ1bXAgdXAgdG8gdGhlIHNhbWUgcGF0Y2ggdmVyc2lvbi5cbiAgICAgICAgICAvLyAxLjIuMC01IHBhdGNoZXMgdG8gMS4yLjBcbiAgICAgICAgICAvLyAxLjIuMCBwYXRjaGVzIHRvIDEuMi4xXG4gICAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucGF0Y2grKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgdXNlZCBwdWJsaWNseS5cbiAgICAgICAgLy8gMS4wLjAgJ3ByZScgd291bGQgYmVjb21lIDEuMC4wLTAgd2hpY2ggaXMgdGhlIHdyb25nIGRpcmVjdGlvbi5cblxuICAgICAgICBjYXNlICdwcmUnOlxuICAgICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbMF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBpID0gdGhpcy5wcmVyZWxlYXNlLmxlbmd0aDtcblxuICAgICAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVyZWxlYXNlW2ldID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZVtpXSsrO1xuICAgICAgICAgICAgICAgIGkgPSAtMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgLy8gZGlkbid0IGluY3JlbWVudCBhbnl0aGluZ1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UucHVzaCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAgICAgLy8gMS4yLjAtYmV0YS4xIGJ1bXBzIHRvIDEuMi4wLWJldGEuMixcbiAgICAgICAgICAgIC8vIDEuMi4wLWJldGEuZm9vYmx6IG9yIDEuMi4wLWJldGEgYnVtcHMgdG8gMS4yLjAtYmV0YS4wXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlWzBdID09PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIGlmIChpc05hTih0aGlzLnByZXJlbGVhc2VbMV0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW2lkZW50aWZpZXIsIDBdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogXCIuY29uY2F0KHJlbGVhc2UpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5mb3JtYXQoKTtcbiAgICAgIHRoaXMucmF3ID0gdGhpcy52ZXJzaW9uO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gIH1cblxuICB2YXIgc2VtdmVyID0gU2VtVmVyO1xuXG4gIGNvbnN0IGNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+IG5ldyBzZW12ZXIoYSwgbG9vc2UpLmNvbXBhcmUobmV3IHNlbXZlcihiLCBsb29zZSkpO1xuXG4gIHZhciBjb21wYXJlXzEgPSBjb21wYXJlO1xuXG4gIGNvbnN0IGx0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlXzEoYSwgYiwgbG9vc2UpIDwgMDtcblxuICB2YXIgbHRfMSA9IGx0O1xuXG4gIGNvbnN0IGd0ZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZV8xKGEsIGIsIGxvb3NlKSA+PSAwO1xuXG4gIHZhciBndGVfMSA9IGd0ZTtcblxuICB2YXIgYXJyYXlpZnkgPSAob2JqZWN0LCBrZXlOYW1lKSA9PiBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBPYmplY3QuYXNzaWduKHtcbiAgICBba2V5TmFtZV06IGtleVxuICB9LCB2YWx1ZSkpO1xuXG4gIHZhciBkZWRlbnRfMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcblxuICAgIGZ1bmN0aW9uIGRlZGVudChzdHJpbmdzKSB7XG4gICAgICB2YXIgcmF3ID0gdm9pZCAwO1xuXG4gICAgICBpZiAodHlwZW9mIHN0cmluZ3MgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gZGVkZW50IGNhbiBiZSB1c2VkIGFzIGEgcGxhaW4gZnVuY3Rpb25cbiAgICAgICAgcmF3ID0gW3N0cmluZ3NdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmF3ID0gc3RyaW5ncy5yYXc7XG4gICAgICB9IC8vIGZpcnN0LCBwZXJmb3JtIGludGVycG9sYXRpb25cblxuXG4gICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ICs9IHJhd1tpXS4gLy8gam9pbiBsaW5lcyB3aGVuIHRoZXJlIGlzIGEgc3VwcHJlc3NlZCBuZXdsaW5lXG4gICAgICAgIHJlcGxhY2UoL1xcXFxcXG5bIFxcdF0qL2csIFwiXCIpLiAvLyBoYW5kbGUgZXNjYXBlZCBiYWNrdGlja3NcbiAgICAgICAgcmVwbGFjZSgvXFxcXGAvZywgXCJgXCIpO1xuXG4gICAgICAgIGlmIChpIDwgKGFyZ3VtZW50cy5sZW5ndGggPD0gMSA/IDAgOiBhcmd1bWVudHMubGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICByZXN1bHQgKz0gYXJndW1lbnRzLmxlbmd0aCA8PSBpICsgMSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1tpICsgMV07XG4gICAgICAgIH1cbiAgICAgIH0gLy8gbm93IHN0cmlwIGluZGVudGF0aW9uXG5cblxuICAgICAgdmFyIGxpbmVzID0gcmVzdWx0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgdmFyIG1pbmRlbnQgPSBudWxsO1xuICAgICAgbGluZXMuZm9yRWFjaChmdW5jdGlvbiAobCkge1xuICAgICAgICB2YXIgbSA9IGwubWF0Y2goL14oXFxzKylcXFMrLyk7XG5cbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICB2YXIgaW5kZW50ID0gbVsxXS5sZW5ndGg7XG5cbiAgICAgICAgICBpZiAoIW1pbmRlbnQpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGZpcnN0IGluZGVudGVkIGxpbmVcbiAgICAgICAgICAgIG1pbmRlbnQgPSBpbmRlbnQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pbmRlbnQgPSBNYXRoLm1pbihtaW5kZW50LCBpbmRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChtaW5kZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdCA9IGxpbmVzLm1hcChmdW5jdGlvbiAobCkge1xuICAgICAgICAgIHJldHVybiBsWzBdID09PSBcIiBcIiA/IGwuc2xpY2UobWluZGVudCkgOiBsO1xuICAgICAgICB9KS5qb2luKFwiXFxuXCIpO1xuICAgICAgfSAvLyBkZWRlbnQgZWF0cyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIHRvb1xuXG5cbiAgICAgIHJlc3VsdCA9IHJlc3VsdC50cmltKCk7IC8vIGhhbmRsZSBlc2NhcGVkIG5ld2xpbmVzIGF0IHRoZSBlbmQgdG8gZW5zdXJlIHRoZXkgZG9uJ3QgZ2V0IHN0cmlwcGVkIHRvb1xuXG4gICAgICByZXR1cm4gcmVzdWx0LnJlcGxhY2UoL1xcXFxuL2csIFwiXFxuXCIpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVkZW50O1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gX3RlbXBsYXRlT2JqZWN0NigpIHtcbiAgICBjb25zdCBkYXRhID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gICAgICBSZXF1aXJlIGVpdGhlciAnQHByZXR0aWVyJyBvciAnQGZvcm1hdCcgdG8gYmUgcHJlc2VudCBpbiB0aGUgZmlsZSdzIGZpcnN0IGRvY2Jsb2NrIGNvbW1lbnRcXG4gICAgICBpbiBvcmRlciBmb3IgaXQgdG8gYmUgZm9ybWF0dGVkLlxcbiAgICBcIl0pO1xuXG4gICAgX3RlbXBsYXRlT2JqZWN0NiA9IGZ1bmN0aW9uIF90ZW1wbGF0ZU9iamVjdDYoKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBmdW5jdGlvbiBfdGVtcGxhdGVPYmplY3Q1KCkge1xuICAgIGNvbnN0IGRhdGEgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgICAgIEZvcm1hdCBjb2RlIHN0YXJ0aW5nIGF0IGEgZ2l2ZW4gY2hhcmFjdGVyIG9mZnNldC5cXG4gICAgICBUaGUgcmFuZ2Ugd2lsbCBleHRlbmQgYmFja3dhcmRzIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgbGluZSBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBzdGF0ZW1lbnQuXFxuICAgICAgVGhpcyBvcHRpb24gY2Fubm90IGJlIHVzZWQgd2l0aCAtLWN1cnNvci1vZmZzZXQuXFxuICAgIFwiXSk7XG5cbiAgICBfdGVtcGxhdGVPYmplY3Q1ID0gZnVuY3Rpb24gX3RlbXBsYXRlT2JqZWN0NSgpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF90ZW1wbGF0ZU9iamVjdDQoKSB7XG4gICAgY29uc3QgZGF0YSA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICAgICAgRm9ybWF0IGNvZGUgZW5kaW5nIGF0IGEgZ2l2ZW4gY2hhcmFjdGVyIG9mZnNldCAoZXhjbHVzaXZlKS5cXG4gICAgICBUaGUgcmFuZ2Ugd2lsbCBleHRlbmQgZm9yd2FyZHMgdG8gdGhlIGVuZCBvZiB0aGUgc2VsZWN0ZWQgc3RhdGVtZW50LlxcbiAgICAgIFRoaXMgb3B0aW9uIGNhbm5vdCBiZSB1c2VkIHdpdGggLS1jdXJzb3Itb2Zmc2V0LlxcbiAgICBcIl0pO1xuXG4gICAgX3RlbXBsYXRlT2JqZWN0NCA9IGZ1bmN0aW9uIF90ZW1wbGF0ZU9iamVjdDQoKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBmdW5jdGlvbiBfdGVtcGxhdGVPYmplY3QzKCkge1xuICAgIGNvbnN0IGRhdGEgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgICAgIEN1c3RvbSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBwcmV0dGllciBwbHVnaW5zIGluIG5vZGVfbW9kdWxlcyBzdWJkaXJlY3RvcnkuXFxuICAgICAgT3ZlcnJpZGVzIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiBwbHVnaW5zIGFyZSBzZWFyY2hlZCByZWxhdGl2ZWx5IHRvIHRoZSBsb2NhdGlvbiBvZiBQcmV0dGllci5cXG4gICAgICBNdWx0aXBsZSB2YWx1ZXMgYXJlIGFjY2VwdGVkLlxcbiAgICBcIl0pO1xuXG4gICAgX3RlbXBsYXRlT2JqZWN0MyA9IGZ1bmN0aW9uIF90ZW1wbGF0ZU9iamVjdDMoKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBmdW5jdGlvbiBfdGVtcGxhdGVPYmplY3QyKCkge1xuICAgIGNvbnN0IGRhdGEgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgICAgICAgICBNYWludGFpbiBleGlzdGluZ1xcbiAgICAgICAgICAobWl4ZWQgdmFsdWVzIHdpdGhpbiBvbmUgZmlsZSBhcmUgbm9ybWFsaXNlZCBieSBsb29raW5nIGF0IHdoYXQncyB1c2VkIGFmdGVyIHRoZSBmaXJzdCBsaW5lKVxcbiAgICAgICAgXCJdKTtcblxuICAgIF90ZW1wbGF0ZU9iamVjdDIgPSBmdW5jdGlvbiBfdGVtcGxhdGVPYmplY3QyKCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gX3RlbXBsYXRlT2JqZWN0KCkge1xuICAgIGNvbnN0IGRhdGEgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgICAgIFByaW50ICh0byBzdGRlcnIpIHdoZXJlIGEgY3Vyc29yIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiB3b3VsZCBtb3ZlIHRvIGFmdGVyIGZvcm1hdHRpbmcuXFxuICAgICAgVGhpcyBvcHRpb24gY2Fubm90IGJlIHVzZWQgd2l0aCAtLXJhbmdlLXN0YXJ0IGFuZCAtLXJhbmdlLWVuZC5cXG4gICAgXCJdKTtcblxuICAgIF90ZW1wbGF0ZU9iamVjdCA9IGZ1bmN0aW9uIF90ZW1wbGF0ZU9iamVjdCgpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0IENBVEVHT1JZX0NPTkZJRyA9IFwiQ29uZmlnXCI7XG4gIGNvbnN0IENBVEVHT1JZX0VESVRPUiA9IFwiRWRpdG9yXCI7XG4gIGNvbnN0IENBVEVHT1JZX0ZPUk1BVCA9IFwiRm9ybWF0XCI7XG4gIGNvbnN0IENBVEVHT1JZX09USEVSID0gXCJPdGhlclwiO1xuICBjb25zdCBDQVRFR09SWV9PVVRQVVQgPSBcIk91dHB1dFwiO1xuICBjb25zdCBDQVRFR09SWV9HTE9CQUwgPSBcIkdsb2JhbFwiO1xuICBjb25zdCBDQVRFR09SWV9TUEVDSUFMID0gXCJTcGVjaWFsXCI7XG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPcHRpb25JbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2luY2VdIC0gYXZhaWxhYmxlIHNpbmNlIHZlcnNpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNhdGVnb3J5XG4gICAqIEBwcm9wZXJ0eSB7J2ludCcgfCAnYm9vbGVhbicgfCAnY2hvaWNlJyB8ICdwYXRoJ30gdHlwZVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthcnJheV0gLSBpbmRpY2F0ZSBpdCdzIGFuIGFycmF5IG9mIHRoZSBzcGVjaWZpZWQgdHlwZVxuICAgKiBAcHJvcGVydHkge09wdGlvblZhbHVlSW5mb30gW2RlZmF1bHRdXG4gICAqIEBwcm9wZXJ0eSB7T3B0aW9uUmFuZ2VJbmZvfSBbcmFuZ2VdIC0gZm9yIHR5cGUgaW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2RlcHJlY2F0ZWRdIC0gZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uXG4gICAqIEBwcm9wZXJ0eSB7T3B0aW9uUmVkaXJlY3RJbmZvfSBbcmVkaXJlY3RdIC0gcmVkaXJlY3QgZGVwcmVjYXRlZCBvcHRpb25cbiAgICogQHByb3BlcnR5IHsodmFsdWU6IGFueSkgPT4gYm9vbGVhbn0gW2V4Y2VwdGlvbl1cbiAgICogQHByb3BlcnR5IHtPcHRpb25DaG9pY2VJbmZvW119IFtjaG9pY2VzXSAtIGZvciB0eXBlIGNob2ljZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2NsaU5hbWVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2xpQ2F0ZWdvcnldXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2xpRGVzY3JpcHRpb25dXG4gICAqXG4gICAqIEB0eXBlZGVmIHtudW1iZXIgfCBib29sZWFuIHwgc3RyaW5nfSBPcHRpb25WYWx1ZVxuICAgKiBAdHlwZWRlZiB7T3B0aW9uVmFsdWUgfCBbeyB2YWx1ZTogT3B0aW9uVmFsdWVbXSB9XSB8IEFycmF5PHsgc2luY2U6IHN0cmluZywgdmFsdWU6IE9wdGlvblZhbHVlfT59IE9wdGlvblZhbHVlSW5mb1xuICAgKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPcHRpb25SZWRpcmVjdEluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IG9wdGlvblxuICAgKiBAcHJvcGVydHkge09wdGlvblZhbHVlfSB2YWx1ZVxuICAgKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPcHRpb25SYW5nZUluZm9cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHN0YXJ0IC0gcmVjb21tZW5kZWQgcmFuZ2Ugc3RhcnRcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGVuZCAtIHJlY29tbWVuZGVkIHJhbmdlIGVuZFxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc3RlcCAtIHJlY29tbWVuZGVkIHJhbmdlIHN0ZXBcbiAgICpcbiAgICogQHR5cGVkZWYge09iamVjdH0gT3B0aW9uQ2hvaWNlSW5mb1xuICAgKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBzdHJpbmd9IHZhbHVlIC0gYm9vbGVhbiBmb3IgdGhlIG9wdGlvbiB0aGF0IGlzIG9yaWdpbmFsbHkgYm9vbGVhbiB0eXBlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3NpbmNlXSAtIHVuZGVmaW5lZCBpZiBhdmFpbGFibGUgc2luY2UgdGhlIGZpcnN0IHZlcnNpb24gb2YgdGhlIG9wdGlvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2RlcHJlY2F0ZWRdIC0gZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uXG4gICAqIEBwcm9wZXJ0eSB7T3B0aW9uVmFsdWVJbmZvfSBbcmVkaXJlY3RdIC0gcmVkaXJlY3QgZGVwcmVjYXRlZCB2YWx1ZVxuICAgKi9cblxuICAvKiogQHR5cGUge3sgW25hbWU6IHN0cmluZ106IE9wdGlvbkluZm8gfX0gKi9cblxuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGN1cnNvck9mZnNldDoge1xuICAgICAgc2luY2U6IFwiMS40LjBcIixcbiAgICAgIGNhdGVnb3J5OiBDQVRFR09SWV9TUEVDSUFMLFxuICAgICAgdHlwZTogXCJpbnRcIixcbiAgICAgIGRlZmF1bHQ6IC0xLFxuICAgICAgcmFuZ2U6IHtcbiAgICAgICAgc3RhcnQ6IC0xLFxuICAgICAgICBlbmQ6IEluZmluaXR5LFxuICAgICAgICBzdGVwOiAxXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IGRlZGVudF8xKF90ZW1wbGF0ZU9iamVjdCgpKSxcbiAgICAgIGNsaUNhdGVnb3J5OiBDQVRFR09SWV9FRElUT1JcbiAgICB9LFxuICAgIGVuZE9mTGluZToge1xuICAgICAgc2luY2U6IFwiMS4xNS4wXCIsXG4gICAgICBjYXRlZ29yeTogQ0FURUdPUllfR0xPQkFMLFxuICAgICAgdHlwZTogXCJjaG9pY2VcIixcbiAgICAgIGRlZmF1bHQ6IFt7XG4gICAgICAgIHNpbmNlOiBcIjEuMTUuMFwiLFxuICAgICAgICB2YWx1ZTogXCJhdXRvXCJcbiAgICAgIH0sIHtcbiAgICAgICAgc2luY2U6IFwiMi4wLjBcIixcbiAgICAgICAgdmFsdWU6IFwibGZcIlxuICAgICAgfV0sXG4gICAgICBkZXNjcmlwdGlvbjogXCJXaGljaCBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzIHRvIGFwcGx5LlwiLFxuICAgICAgY2hvaWNlczogW3tcbiAgICAgICAgdmFsdWU6IFwibGZcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiTGluZSBGZWVkIG9ubHkgKFxcXFxuKSwgY29tbW9uIG9uIExpbnV4IGFuZCBtYWNPUyBhcyB3ZWxsIGFzIGluc2lkZSBnaXQgcmVwb3NcIlxuICAgICAgfSwge1xuICAgICAgICB2YWx1ZTogXCJjcmxmXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkNhcnJpYWdlIFJldHVybiArIExpbmUgRmVlZCBjaGFyYWN0ZXJzIChcXFxcclxcXFxuKSwgY29tbW9uIG9uIFdpbmRvd3NcIlxuICAgICAgfSwge1xuICAgICAgICB2YWx1ZTogXCJjclwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJDYXJyaWFnZSBSZXR1cm4gY2hhcmFjdGVyIG9ubHkgKFxcXFxyKSwgdXNlZCB2ZXJ5IHJhcmVseVwiXG4gICAgICB9LCB7XG4gICAgICAgIHZhbHVlOiBcImF1dG9cIixcbiAgICAgICAgZGVzY3JpcHRpb246IGRlZGVudF8xKF90ZW1wbGF0ZU9iamVjdDIoKSlcbiAgICAgIH1dXG4gICAgfSxcbiAgICBmaWxlcGF0aDoge1xuICAgICAgc2luY2U6IFwiMS40LjBcIixcbiAgICAgIGNhdGVnb3J5OiBDQVRFR09SWV9TUEVDSUFMLFxuICAgICAgdHlwZTogXCJwYXRoXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJTcGVjaWZ5IHRoZSBpbnB1dCBmaWxlcGF0aC4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gZG8gcGFyc2VyIGluZmVyZW5jZS5cIixcbiAgICAgIGNsaU5hbWU6IFwic3RkaW4tZmlsZXBhdGhcIixcbiAgICAgIGNsaUNhdGVnb3J5OiBDQVRFR09SWV9PVEhFUixcbiAgICAgIGNsaURlc2NyaXB0aW9uOiBcIlBhdGggdG8gdGhlIGZpbGUgdG8gcHJldGVuZCB0aGF0IHN0ZGluIGNvbWVzIGZyb20uXCJcbiAgICB9LFxuICAgIGluc2VydFByYWdtYToge1xuICAgICAgc2luY2U6IFwiMS44LjBcIixcbiAgICAgIGNhdGVnb3J5OiBDQVRFR09SWV9TUEVDSUFMLFxuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkluc2VydCBAZm9ybWF0IHByYWdtYSBpbnRvIGZpbGUncyBmaXJzdCBkb2NibG9jayBjb21tZW50LlwiLFxuICAgICAgY2xpQ2F0ZWdvcnk6IENBVEVHT1JZX09USEVSXG4gICAgfSxcbiAgICBwYXJzZXI6IHtcbiAgICAgIHNpbmNlOiBcIjAuMC4xMFwiLFxuICAgICAgY2F0ZWdvcnk6IENBVEVHT1JZX0dMT0JBTCxcbiAgICAgIHR5cGU6IFwiY2hvaWNlXCIsXG4gICAgICBkZWZhdWx0OiBbe1xuICAgICAgICBzaW5jZTogXCIwLjAuMTBcIixcbiAgICAgICAgdmFsdWU6IFwiYmFieWxvblwiXG4gICAgICB9LCB7XG4gICAgICAgIHNpbmNlOiBcIjEuMTMuMFwiLFxuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgICB9XSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldoaWNoIHBhcnNlciB0byB1c2UuXCIsXG4gICAgICBleGNlcHRpb246IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIixcbiAgICAgIGNob2ljZXM6IFt7XG4gICAgICAgIHZhbHVlOiBcImZsb3dcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRmxvd1wiXG4gICAgICB9LCB7XG4gICAgICAgIHZhbHVlOiBcImJhYmVsXCIsXG4gICAgICAgIHNpbmNlOiBcIjEuMTYuMFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJKYXZhU2NyaXB0XCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwiYmFiZWwtZmxvd1wiLFxuICAgICAgICBzaW5jZTogXCIxLjE2LjBcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRmxvd1wiXG4gICAgICB9LCB7XG4gICAgICAgIHZhbHVlOiBcImJhYmVsLXRzXCIsXG4gICAgICAgIHNpbmNlOiBcIjIuMC4wXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlR5cGVTY3JpcHRcIlxuICAgICAgfSwge1xuICAgICAgICB2YWx1ZTogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIHNpbmNlOiBcIjEuNC4wXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlR5cGVTY3JpcHRcIlxuICAgICAgfSwge1xuICAgICAgICB2YWx1ZTogXCJjc3NcIixcbiAgICAgICAgc2luY2U6IFwiMS43LjFcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQ1NTXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwibGVzc1wiLFxuICAgICAgICBzaW5jZTogXCIxLjcuMVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJMZXNzXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwic2Nzc1wiLFxuICAgICAgICBzaW5jZTogXCIxLjcuMVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJTQ1NTXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwianNvblwiLFxuICAgICAgICBzaW5jZTogXCIxLjUuMFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJKU09OXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwianNvbjVcIixcbiAgICAgICAgc2luY2U6IFwiMS4xMy4wXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkpTT041XCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwianNvbi1zdHJpbmdpZnlcIixcbiAgICAgICAgc2luY2U6IFwiMS4xMy4wXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkpTT04uc3RyaW5naWZ5XCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwiZ3JhcGhxbFwiLFxuICAgICAgICBzaW5jZTogXCIxLjUuMFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJHcmFwaFFMXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwibWFya2Rvd25cIixcbiAgICAgICAgc2luY2U6IFwiMS44LjBcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiTWFya2Rvd25cIlxuICAgICAgfSwge1xuICAgICAgICB2YWx1ZTogXCJtZHhcIixcbiAgICAgICAgc2luY2U6IFwiMS4xNS4wXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIk1EWFwiXG4gICAgICB9LCB7XG4gICAgICAgIHZhbHVlOiBcInZ1ZVwiLFxuICAgICAgICBzaW5jZTogXCIxLjEwLjBcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiVnVlXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwieWFtbFwiLFxuICAgICAgICBzaW5jZTogXCIxLjE0LjBcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiWUFNTFwiXG4gICAgICB9LCB7XG4gICAgICAgIHZhbHVlOiBcImdsaW1tZXJcIixcbiAgICAgICAgc2luY2U6IG51bGwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkhhbmRsZWJhcnNcIlxuICAgICAgfSwge1xuICAgICAgICB2YWx1ZTogXCJodG1sXCIsXG4gICAgICAgIHNpbmNlOiBcIjEuMTUuMFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJIVE1MXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwiYW5ndWxhclwiLFxuICAgICAgICBzaW5jZTogXCIxLjE1LjBcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQW5ndWxhclwiXG4gICAgICB9LCB7XG4gICAgICAgIHZhbHVlOiBcImx3Y1wiLFxuICAgICAgICBzaW5jZTogXCIxLjE3LjBcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiTGlnaHRuaW5nIFdlYiBDb21wb25lbnRzXCJcbiAgICAgIH1dXG4gICAgfSxcbiAgICBwbHVnaW5zOiB7XG4gICAgICBzaW5jZTogXCIxLjEwLjBcIixcbiAgICAgIHR5cGU6IFwicGF0aFwiLFxuICAgICAgYXJyYXk6IHRydWUsXG4gICAgICBkZWZhdWx0OiBbe1xuICAgICAgICB2YWx1ZTogW11cbiAgICAgIH1dLFxuICAgICAgY2F0ZWdvcnk6IENBVEVHT1JZX0dMT0JBTCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFkZCBhIHBsdWdpbi4gTXVsdGlwbGUgcGx1Z2lucyBjYW4gYmUgcGFzc2VkIGFzIHNlcGFyYXRlIGAtLXBsdWdpbmBzLlwiLFxuICAgICAgZXhjZXB0aW9uOiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiLFxuICAgICAgY2xpTmFtZTogXCJwbHVnaW5cIixcbiAgICAgIGNsaUNhdGVnb3J5OiBDQVRFR09SWV9DT05GSUdcbiAgICB9LFxuICAgIHBsdWdpblNlYXJjaERpcnM6IHtcbiAgICAgIHNpbmNlOiBcIjEuMTMuMFwiLFxuICAgICAgdHlwZTogXCJwYXRoXCIsXG4gICAgICBhcnJheTogdHJ1ZSxcbiAgICAgIGRlZmF1bHQ6IFt7XG4gICAgICAgIHZhbHVlOiBbXVxuICAgICAgfV0sXG4gICAgICBjYXRlZ29yeTogQ0FURUdPUllfR0xPQkFMLFxuICAgICAgZGVzY3JpcHRpb246IGRlZGVudF8xKF90ZW1wbGF0ZU9iamVjdDMoKSksXG4gICAgICBleGNlcHRpb246IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIsXG4gICAgICBjbGlOYW1lOiBcInBsdWdpbi1zZWFyY2gtZGlyXCIsXG4gICAgICBjbGlDYXRlZ29yeTogQ0FURUdPUllfQ09ORklHXG4gICAgfSxcbiAgICBwcmludFdpZHRoOiB7XG4gICAgICBzaW5jZTogXCIwLjAuMFwiLFxuICAgICAgY2F0ZWdvcnk6IENBVEVHT1JZX0dMT0JBTCxcbiAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICBkZWZhdWx0OiA4MCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBsaW5lIGxlbmd0aCB3aGVyZSBQcmV0dGllciB3aWxsIHRyeSB3cmFwLlwiLFxuICAgICAgcmFuZ2U6IHtcbiAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgIGVuZDogSW5maW5pdHksXG4gICAgICAgIHN0ZXA6IDFcbiAgICAgIH1cbiAgICB9LFxuICAgIHJhbmdlRW5kOiB7XG4gICAgICBzaW5jZTogXCIxLjQuMFwiLFxuICAgICAgY2F0ZWdvcnk6IENBVEVHT1JZX1NQRUNJQUwsXG4gICAgICB0eXBlOiBcImludFwiLFxuICAgICAgZGVmYXVsdDogSW5maW5pdHksXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogMCxcbiAgICAgICAgZW5kOiBJbmZpbml0eSxcbiAgICAgICAgc3RlcDogMVxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZWRlbnRfMShfdGVtcGxhdGVPYmplY3Q0KCkpLFxuICAgICAgY2xpQ2F0ZWdvcnk6IENBVEVHT1JZX0VESVRPUlxuICAgIH0sXG4gICAgcmFuZ2VTdGFydDoge1xuICAgICAgc2luY2U6IFwiMS40LjBcIixcbiAgICAgIGNhdGVnb3J5OiBDQVRFR09SWV9TUEVDSUFMLFxuICAgICAgdHlwZTogXCJpbnRcIixcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogMCxcbiAgICAgICAgZW5kOiBJbmZpbml0eSxcbiAgICAgICAgc3RlcDogMVxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZWRlbnRfMShfdGVtcGxhdGVPYmplY3Q1KCkpLFxuICAgICAgY2xpQ2F0ZWdvcnk6IENBVEVHT1JZX0VESVRPUlxuICAgIH0sXG4gICAgcmVxdWlyZVByYWdtYToge1xuICAgICAgc2luY2U6IFwiMS43LjBcIixcbiAgICAgIGNhdGVnb3J5OiBDQVRFR09SWV9TUEVDSUFMLFxuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZWRlbnRfMShfdGVtcGxhdGVPYmplY3Q2KCkpLFxuICAgICAgY2xpQ2F0ZWdvcnk6IENBVEVHT1JZX09USEVSXG4gICAgfSxcbiAgICB0YWJXaWR0aDoge1xuICAgICAgdHlwZTogXCJpbnRcIixcbiAgICAgIGNhdGVnb3J5OiBDQVRFR09SWV9HTE9CQUwsXG4gICAgICBkZWZhdWx0OiAyLFxuICAgICAgZGVzY3JpcHRpb246IFwiTnVtYmVyIG9mIHNwYWNlcyBwZXIgaW5kZW50YXRpb24gbGV2ZWwuXCIsXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogMCxcbiAgICAgICAgZW5kOiBJbmZpbml0eSxcbiAgICAgICAgc3RlcDogMVxuICAgICAgfVxuICAgIH0sXG4gICAgdXNlVGFiczoge1xuICAgICAgc2luY2U6IFwiMS4wLjBcIixcbiAgICAgIGNhdGVnb3J5OiBDQVRFR09SWV9HTE9CQUwsXG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZGVzY3JpcHRpb246IFwiSW5kZW50IHdpdGggdGFicyBpbnN0ZWFkIG9mIHNwYWNlcy5cIlxuICAgIH1cbiAgfTtcbiAgdmFyIGNvcmVPcHRpb25zID0ge1xuICAgIENBVEVHT1JZX0NPTkZJRyxcbiAgICBDQVRFR09SWV9FRElUT1IsXG4gICAgQ0FURUdPUllfRk9STUFULFxuICAgIENBVEVHT1JZX09USEVSLFxuICAgIENBVEVHT1JZX09VVFBVVCxcbiAgICBDQVRFR09SWV9HTE9CQUwsXG4gICAgQ0FURUdPUllfU1BFQ0lBTCxcbiAgICBvcHRpb25zXG4gIH07XG5cbiAgdmFyIHJlcXVpcmUkJDAgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKF9wYWNrYWdlJDEpO1xuXG4gIGNvbnN0IHNlbXZlciQxID0ge1xuICAgIGNvbXBhcmU6IGNvbXBhcmVfMSxcbiAgICBsdDogbHRfMSxcbiAgICBndGU6IGd0ZV8xXG4gIH07XG4gIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcmVxdWlyZSQkMC52ZXJzaW9uO1xuICBjb25zdCBjb3JlT3B0aW9ucyQxID0gY29yZU9wdGlvbnMub3B0aW9ucztcbiAgLyoqXG4gICAqIFN0cmluZ3MgaW4gYHBsdWdpbnNgIGFuZCBgcGx1Z2luU2VhcmNoRGlyc2AgYXJlIGhhbmRsZWQgYnkgYSB3cmFwcGVkIHZlcnNpb25cbiAgICogb2YgdGhpcyBmdW5jdGlvbiBjcmVhdGVkIGJ5IGB3aXRoUGx1Z2luc2AuIERvbid0IHBhc3MgdGhlbSBoZXJlIGRpcmVjdGx5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW0wXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IG9iamVjdClbXT19IHBhcmFtMC5wbHVnaW5zIFN0cmluZ3MgYXJlIHJlc29sdmVkIGJ5IGB3aXRoUGx1Z2luc2AuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBwYXJhbTAucGx1Z2luU2VhcmNoRGlycyBBZGRlZCBieSBgd2l0aFBsdWdpbnNgLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBwYXJhbTAuc2hvd1VucmVsZWFzZWRcbiAgICogQHBhcmFtIHtib29sZWFuPX0gcGFyYW0wLnNob3dEZXByZWNhdGVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IHBhcmFtMC5zaG93SW50ZXJuYWxcbiAgICovXG5cbiAgZnVuY3Rpb24gZ2V0U3VwcG9ydEluZm8oe1xuICAgIHBsdWdpbnMgPSBbXSxcbiAgICBzaG93VW5yZWxlYXNlZCA9IGZhbHNlLFxuICAgIHNob3dEZXByZWNhdGVkID0gZmFsc2UsXG4gICAgc2hvd0ludGVybmFsID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgLy8gcHJlLXJlbGVhc2UgdmVyc2lvbiBpcyBzbWFsbGVyIHRoYW4gdGhlIG5vcm1hbCB2ZXJzaW9uIGluIHNlbXZlcixcbiAgICAvLyB3ZSBuZWVkIHRvIHRyZWF0IGl0IGFzIHRoZSBub3JtYWwgb25lIHNvIGFzIHRvIHRlc3QgbmV3IGZlYXR1cmVzLlxuICAgIGNvbnN0IHZlcnNpb24gPSBjdXJyZW50VmVyc2lvbi5zcGxpdChcIi1cIiwgMSlbMF07XG4gICAgY29uc3Qgb3B0aW9ucyA9IGFycmF5aWZ5KE9iamVjdC5hc3NpZ24oe30sIC4uLnBsdWdpbnMubWFwKCh7XG4gICAgICBvcHRpb25zXG4gICAgfSkgPT4gb3B0aW9ucyksIGNvcmVPcHRpb25zJDEpLCBcIm5hbWVcIikuZmlsdGVyKG9wdGlvbiA9PiBmaWx0ZXJTaW5jZShvcHRpb24pICYmIGZpbHRlckRlcHJlY2F0ZWQob3B0aW9uKSkuc29ydCgoYSwgYikgPT4gYS5uYW1lID09PSBiLm5hbWUgPyAwIDogYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxKS5tYXAobWFwSW50ZXJuYWwpLm1hcChvcHRpb24gPT4ge1xuICAgICAgb3B0aW9uID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9uKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uLmRlZmF1bHQpKSB7XG4gICAgICAgIG9wdGlvbi5kZWZhdWx0ID0gb3B0aW9uLmRlZmF1bHQubGVuZ3RoID09PSAxID8gb3B0aW9uLmRlZmF1bHRbMF0udmFsdWUgOiBvcHRpb24uZGVmYXVsdC5maWx0ZXIoZmlsdGVyU2luY2UpLnNvcnQoKGluZm8xLCBpbmZvMikgPT4gc2VtdmVyJDEuY29tcGFyZShpbmZvMi5zaW5jZSwgaW5mbzEuc2luY2UpKVswXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uLmNob2ljZXMpKSB7XG4gICAgICAgIG9wdGlvbi5jaG9pY2VzID0gb3B0aW9uLmNob2ljZXMuZmlsdGVyKG9wdGlvbiA9PiBmaWx0ZXJTaW5jZShvcHRpb24pICYmIGZpbHRlckRlcHJlY2F0ZWQob3B0aW9uKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkUGx1Z2lucyA9IHBsdWdpbnMuZmlsdGVyKHBsdWdpbiA9PiBwbHVnaW4uZGVmYXVsdE9wdGlvbnMgJiYgcGx1Z2luLmRlZmF1bHRPcHRpb25zW29wdGlvbi5uYW1lXSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IHBsdWdpbkRlZmF1bHRzID0gZmlsdGVyZWRQbHVnaW5zLnJlZHVjZSgocmVkdWNlZCwgcGx1Z2luKSA9PiB7XG4gICAgICAgIHJlZHVjZWRbcGx1Z2luLm5hbWVdID0gcGx1Z2luLmRlZmF1bHRPcHRpb25zW29wdGlvbi5uYW1lXTtcbiAgICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgICB9LCB7fSk7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9uLCB7XG4gICAgICAgIHBsdWdpbkRlZmF1bHRzXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBsYW5ndWFnZXMgPSBwbHVnaW5zLnJlZHVjZSgoYWxsLCBwbHVnaW4pID0+IGFsbC5jb25jYXQocGx1Z2luLmxhbmd1YWdlcyB8fCBbXSksIFtdKS5maWx0ZXIoZmlsdGVyU2luY2UpO1xuICAgIHJldHVybiB7XG4gICAgICBsYW5ndWFnZXMsXG4gICAgICBvcHRpb25zXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGZpbHRlclNpbmNlKG9iamVjdCkge1xuICAgICAgcmV0dXJuIHNob3dVbnJlbGVhc2VkIHx8ICEoXCJzaW5jZVwiIGluIG9iamVjdCkgfHwgb2JqZWN0LnNpbmNlICYmIHNlbXZlciQxLmd0ZSh2ZXJzaW9uLCBvYmplY3Quc2luY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbHRlckRlcHJlY2F0ZWQob2JqZWN0KSB7XG4gICAgICByZXR1cm4gc2hvd0RlcHJlY2F0ZWQgfHwgIShcImRlcHJlY2F0ZWRcIiBpbiBvYmplY3QpIHx8IG9iamVjdC5kZXByZWNhdGVkICYmIHNlbXZlciQxLmx0KHZlcnNpb24sIG9iamVjdC5kZXByZWNhdGVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXBJbnRlcm5hbChvYmplY3QpIHtcbiAgICAgIGlmIChzaG93SW50ZXJuYWwpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3T2JqZWN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uob2JqZWN0LCBbXCJjbGlOYW1lXCIsIFwiY2xpQ2F0ZWdvcnlcIiwgXCJjbGlEZXNjcmlwdGlvblwiXSk7XG5cbiAgICAgIHJldHVybiBuZXdPYmplY3Q7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN1cHBvcnQgPSB7XG4gICAgZ2V0U3VwcG9ydEluZm9cbiAgfTtcblxuICAvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxuICB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxyXG4gIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG4gIFRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuICBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbiAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuICBNRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuICBTZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcclxuICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuICAvKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgfTtcblxuICAgIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgfTtcblxuICBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICAgIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gICAgZnVuY3Rpb24gX18oKSB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgICB9XG5cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH1cblxuICB2YXIgX2Fzc2lnbiA9IGZ1bmN0aW9uIF9fYXNzaWduKCkge1xuICAgIF9hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH07XG5cbiAgICByZXR1cm4gX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuICBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICAgIHZhciB0ID0ge307XG5cbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG5cbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgfVxuICAgIHJldHVybiB0O1xuICB9XG4gIGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLFxuICAgICAgICBkO1xuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7ZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xuICB9XG4gIGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgICAgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQudmFsdWUpO1xuICAgICAgICB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgICAgfVxuXG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0ge1xuICAgICAgbGFiZWw6IDAsXG4gICAgICBzZW50OiBmdW5jdGlvbiBzZW50KCkge1xuICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07XG4gICAgICAgIHJldHVybiB0WzFdO1xuICAgICAgfSxcbiAgICAgIHRyeXM6IFtdLFxuICAgICAgb3BzOiBbXVxuICAgIH0sXG4gICAgICAgIGYsXG4gICAgICAgIHksXG4gICAgICAgIHQsXG4gICAgICAgIGc7XG4gICAgcmV0dXJuIGcgPSB7XG4gICAgICBuZXh0OiB2ZXJiKDApLFxuICAgICAgXCJ0aHJvd1wiOiB2ZXJiKDEpLFxuICAgICAgXCJyZXR1cm5cIjogdmVyYigyKVxuICAgIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSksIGc7XG5cbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gc3RlcChbbiwgdl0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG5cbiAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcblxuICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmFsdWU6IG9wWzFdLFxuICAgICAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgIHkgPSBvcFsxXTtcbiAgICAgICAgICAgIG9wID0gWzBdO1xuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuXG4gICAgICAgICAgICBfLnRyeXMucG9wKCk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7XG4gICAgICAgICAgICAgIF8gPSAwO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuXG4gICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG5cbiAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb3AgPSBbNiwgZV07XG4gICAgICAgIHkgPSAwO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZiA9IHQgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcbiAgfVxuICBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLFxuICAgICAgICBpID0gMDtcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogbyAmJiBvW2krK10sXG4gICAgICAgICAgZG9uZTogIW9cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksXG4gICAgICAgIHIsXG4gICAgICAgIGFyID0gW10sXG4gICAgICAgIGU7XG5cbiAgICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGUgPSB7XG4gICAgICAgIGVycm9yOiBlcnJvclxuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXI7XG4gIH1cbiAgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcblxuICAgIHJldHVybiBhcjtcbiAgfVxuICBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcblxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKykgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspIHJba10gPSBhW2pdO1xuXG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG4gIH1cbiAgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLFxuICAgICAgICBpLFxuICAgICAgICBxID0gW107XG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBpO1xuXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgICBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnW25dKHYpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2V0dGxlKHFbMF1bM10sIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocikge1xuICAgICAgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkge1xuICAgICAgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgICByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHtcbiAgICAgIGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICAgIHZhciBpLCBwO1xuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIGk7XG5cbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHtcbiAgICAgIGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIChwID0gIXApID8ge1xuICAgICAgICAgIHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLFxuICAgICAgICAgIGRvbmU6IG4gPT09IFwicmV0dXJuXCJcbiAgICAgICAgfSA6IGYgPyBmKHYpIDogdjtcbiAgICAgIH0gOiBmO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sXG4gICAgICAgIGk7XG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIGkpO1xuXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgICBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgICAgZG9uZTogZFxuICAgICAgICB9KTtcbiAgICAgIH0sIHJlamVjdCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwge1xuICAgICAgICB2YWx1ZTogcmF3XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29va2VkLnJhdyA9IHJhdztcbiAgICB9XG5cbiAgICByZXR1cm4gY29va2VkO1xuICB9XG4gIGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICAgIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7XG4gICAgICBkZWZhdWx0OiBtb2RcbiAgICB9O1xuICB9XG5cbiAgdmFyIHRzbGliX2VzNiA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgX19leHRlbmRzOiBfX2V4dGVuZHMsXG4gICAgZ2V0IF9fYXNzaWduICgpIHsgcmV0dXJuIF9hc3NpZ247IH0sXG4gICAgX19yZXN0OiBfX3Jlc3QsXG4gICAgX19kZWNvcmF0ZTogX19kZWNvcmF0ZSxcbiAgICBfX3BhcmFtOiBfX3BhcmFtLFxuICAgIF9fbWV0YWRhdGE6IF9fbWV0YWRhdGEsXG4gICAgX19hd2FpdGVyOiBfX2F3YWl0ZXIsXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxuICAgIF9fZXhwb3J0U3RhcjogX19leHBvcnRTdGFyLFxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcbiAgICBfX3JlYWQ6IF9fcmVhZCxcbiAgICBfX3NwcmVhZDogX19zcHJlYWQsXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXG4gICAgX19hc3luY0dlbmVyYXRvcjogX19hc3luY0dlbmVyYXRvcixcbiAgICBfX2FzeW5jRGVsZWdhdG9yOiBfX2FzeW5jRGVsZWdhdG9yLFxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXG4gICAgX19tYWtlVGVtcGxhdGVPYmplY3Q6IF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICAgIF9faW1wb3J0U3RhcjogX19pbXBvcnRTdGFyLFxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0XG4gIH0pO1xuXG4gIHZhciBhcGkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlXG4gICAgfSk7XG4gICAgZXhwb3J0cy5hcGlEZXNjcmlwdG9yID0ge1xuICAgICAga2V5OiBfa2V5ID0+IC9eWyRfYS16QS1aXVskX2EtekEtWjAtOV0qJC8udGVzdChfa2V5KSA/IF9rZXkgOiBKU09OLnN0cmluZ2lmeShfa2V5KSxcblxuICAgICAgdmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIFwiW1wiLmNvbmNhdCh2YWx1ZS5tYXAoc3ViVmFsdWUgPT4gZXhwb3J0cy5hcGlEZXNjcmlwdG9yLnZhbHVlKHN1YlZhbHVlKSkuam9pbignLCAnKSwgXCJdXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGtleXMubGVuZ3RoID09PSAwID8gJ3t9JyA6IFwieyBcIi5jb25jYXQoa2V5cy5tYXAoa2V5ID0+IFwiXCIuY29uY2F0KGV4cG9ydHMuYXBpRGVzY3JpcHRvci5rZXkoa2V5KSwgXCI6IFwiKS5jb25jYXQoZXhwb3J0cy5hcGlEZXNjcmlwdG9yLnZhbHVlKHZhbHVlW2tleV0pKSkuam9pbignLCAnKSwgXCIgfVwiKTtcbiAgICAgIH0sXG5cbiAgICAgIHBhaXI6ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWVcbiAgICAgIH0pID0+IGV4cG9ydHMuYXBpRGVzY3JpcHRvci52YWx1ZSh7XG4gICAgICAgIFtrZXldOiB2YWx1ZVxuICAgICAgfSlcbiAgICB9O1xuICB9KTtcbiAgdW53cmFwRXhwb3J0cyhhcGkpO1xuICB2YXIgYXBpXzEgPSBhcGkuYXBpRGVzY3JpcHRvcjtcblxuICB2YXIgdHNsaWJfMSA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UodHNsaWJfZXM2KTtcblxuICB2YXIgZGVzY3JpcHRvcnMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlXG4gICAgfSk7XG5cbiAgICB0c2xpYl8xLl9fZXhwb3J0U3RhcihhcGksIGV4cG9ydHMpO1xuICB9KTtcbiAgdW53cmFwRXhwb3J0cyhkZXNjcmlwdG9ycyk7XG5cbiAgdmFyIG1hdGNoT3BlcmF0b3JzUmUgPSAvW3xcXFxce30oKVtcXF1eJCsqPy5dL2c7XG5cbiAgdmFyIGVzY2FwZVN0cmluZ1JlZ2V4cCA9IGZ1bmN0aW9uIGVzY2FwZVN0cmluZ1JlZ2V4cChzdHIpIHtcbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKG1hdGNoT3BlcmF0b3JzUmUsICdcXFxcJCYnKTtcbiAgfTtcblxuICB2YXIgY29sb3JOYW1lID0ge1xuICAgIFwiYWxpY2VibHVlXCI6IFsyNDAsIDI0OCwgMjU1XSxcbiAgICBcImFudGlxdWV3aGl0ZVwiOiBbMjUwLCAyMzUsIDIxNV0sXG4gICAgXCJhcXVhXCI6IFswLCAyNTUsIDI1NV0sXG4gICAgXCJhcXVhbWFyaW5lXCI6IFsxMjcsIDI1NSwgMjEyXSxcbiAgICBcImF6dXJlXCI6IFsyNDAsIDI1NSwgMjU1XSxcbiAgICBcImJlaWdlXCI6IFsyNDUsIDI0NSwgMjIwXSxcbiAgICBcImJpc3F1ZVwiOiBbMjU1LCAyMjgsIDE5Nl0sXG4gICAgXCJibGFja1wiOiBbMCwgMCwgMF0sXG4gICAgXCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LCAyMzUsIDIwNV0sXG4gICAgXCJibHVlXCI6IFswLCAwLCAyNTVdLFxuICAgIFwiYmx1ZXZpb2xldFwiOiBbMTM4LCA0MywgMjI2XSxcbiAgICBcImJyb3duXCI6IFsxNjUsIDQyLCA0Ml0sXG4gICAgXCJidXJseXdvb2RcIjogWzIyMiwgMTg0LCAxMzVdLFxuICAgIFwiY2FkZXRibHVlXCI6IFs5NSwgMTU4LCAxNjBdLFxuICAgIFwiY2hhcnRyZXVzZVwiOiBbMTI3LCAyNTUsIDBdLFxuICAgIFwiY2hvY29sYXRlXCI6IFsyMTAsIDEwNSwgMzBdLFxuICAgIFwiY29yYWxcIjogWzI1NSwgMTI3LCA4MF0sXG4gICAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLCAxNDksIDIzN10sXG4gICAgXCJjb3Juc2lsa1wiOiBbMjU1LCAyNDgsIDIyMF0sXG4gICAgXCJjcmltc29uXCI6IFsyMjAsIDIwLCA2MF0sXG4gICAgXCJjeWFuXCI6IFswLCAyNTUsIDI1NV0sXG4gICAgXCJkYXJrYmx1ZVwiOiBbMCwgMCwgMTM5XSxcbiAgICBcImRhcmtjeWFuXCI6IFswLCAxMzksIDEzOV0sXG4gICAgXCJkYXJrZ29sZGVucm9kXCI6IFsxODQsIDEzNCwgMTFdLFxuICAgIFwiZGFya2dyYXlcIjogWzE2OSwgMTY5LCAxNjldLFxuICAgIFwiZGFya2dyZWVuXCI6IFswLCAxMDAsIDBdLFxuICAgIFwiZGFya2dyZXlcIjogWzE2OSwgMTY5LCAxNjldLFxuICAgIFwiZGFya2toYWtpXCI6IFsxODksIDE4MywgMTA3XSxcbiAgICBcImRhcmttYWdlbnRhXCI6IFsxMzksIDAsIDEzOV0sXG4gICAgXCJkYXJrb2xpdmVncmVlblwiOiBbODUsIDEwNywgNDddLFxuICAgIFwiZGFya29yYW5nZVwiOiBbMjU1LCAxNDAsIDBdLFxuICAgIFwiZGFya29yY2hpZFwiOiBbMTUzLCA1MCwgMjA0XSxcbiAgICBcImRhcmtyZWRcIjogWzEzOSwgMCwgMF0sXG4gICAgXCJkYXJrc2FsbW9uXCI6IFsyMzMsIDE1MCwgMTIyXSxcbiAgICBcImRhcmtzZWFncmVlblwiOiBbMTQzLCAxODgsIDE0M10sXG4gICAgXCJkYXJrc2xhdGVibHVlXCI6IFs3MiwgNjEsIDEzOV0sXG4gICAgXCJkYXJrc2xhdGVncmF5XCI6IFs0NywgNzksIDc5XSxcbiAgICBcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LCA3OSwgNzldLFxuICAgIFwiZGFya3R1cnF1b2lzZVwiOiBbMCwgMjA2LCAyMDldLFxuICAgIFwiZGFya3Zpb2xldFwiOiBbMTQ4LCAwLCAyMTFdLFxuICAgIFwiZGVlcHBpbmtcIjogWzI1NSwgMjAsIDE0N10sXG4gICAgXCJkZWVwc2t5Ymx1ZVwiOiBbMCwgMTkxLCAyNTVdLFxuICAgIFwiZGltZ3JheVwiOiBbMTA1LCAxMDUsIDEwNV0sXG4gICAgXCJkaW1ncmV5XCI6IFsxMDUsIDEwNSwgMTA1XSxcbiAgICBcImRvZGdlcmJsdWVcIjogWzMwLCAxNDQsIDI1NV0sXG4gICAgXCJmaXJlYnJpY2tcIjogWzE3OCwgMzQsIDM0XSxcbiAgICBcImZsb3JhbHdoaXRlXCI6IFsyNTUsIDI1MCwgMjQwXSxcbiAgICBcImZvcmVzdGdyZWVuXCI6IFszNCwgMTM5LCAzNF0sXG4gICAgXCJmdWNoc2lhXCI6IFsyNTUsIDAsIDI1NV0sXG4gICAgXCJnYWluc2Jvcm9cIjogWzIyMCwgMjIwLCAyMjBdLFxuICAgIFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LCAyNDgsIDI1NV0sXG4gICAgXCJnb2xkXCI6IFsyNTUsIDIxNSwgMF0sXG4gICAgXCJnb2xkZW5yb2RcIjogWzIxOCwgMTY1LCAzMl0sXG4gICAgXCJncmF5XCI6IFsxMjgsIDEyOCwgMTI4XSxcbiAgICBcImdyZWVuXCI6IFswLCAxMjgsIDBdLFxuICAgIFwiZ3JlZW55ZWxsb3dcIjogWzE3MywgMjU1LCA0N10sXG4gICAgXCJncmV5XCI6IFsxMjgsIDEyOCwgMTI4XSxcbiAgICBcImhvbmV5ZGV3XCI6IFsyNDAsIDI1NSwgMjQwXSxcbiAgICBcImhvdHBpbmtcIjogWzI1NSwgMTA1LCAxODBdLFxuICAgIFwiaW5kaWFucmVkXCI6IFsyMDUsIDkyLCA5Ml0sXG4gICAgXCJpbmRpZ29cIjogWzc1LCAwLCAxMzBdLFxuICAgIFwiaXZvcnlcIjogWzI1NSwgMjU1LCAyNDBdLFxuICAgIFwia2hha2lcIjogWzI0MCwgMjMwLCAxNDBdLFxuICAgIFwibGF2ZW5kZXJcIjogWzIzMCwgMjMwLCAyNTBdLFxuICAgIFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LCAyNDAsIDI0NV0sXG4gICAgXCJsYXduZ3JlZW5cIjogWzEyNCwgMjUyLCAwXSxcbiAgICBcImxlbW9uY2hpZmZvblwiOiBbMjU1LCAyNTAsIDIwNV0sXG4gICAgXCJsaWdodGJsdWVcIjogWzE3MywgMjE2LCAyMzBdLFxuICAgIFwibGlnaHRjb3JhbFwiOiBbMjQwLCAxMjgsIDEyOF0sXG4gICAgXCJsaWdodGN5YW5cIjogWzIyNCwgMjU1LCAyNTVdLFxuICAgIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwgMjUwLCAyMTBdLFxuICAgIFwibGlnaHRncmF5XCI6IFsyMTEsIDIxMSwgMjExXSxcbiAgICBcImxpZ2h0Z3JlZW5cIjogWzE0NCwgMjM4LCAxNDRdLFxuICAgIFwibGlnaHRncmV5XCI6IFsyMTEsIDIxMSwgMjExXSxcbiAgICBcImxpZ2h0cGlua1wiOiBbMjU1LCAxODIsIDE5M10sXG4gICAgXCJsaWdodHNhbG1vblwiOiBbMjU1LCAxNjAsIDEyMl0sXG4gICAgXCJsaWdodHNlYWdyZWVuXCI6IFszMiwgMTc4LCAxNzBdLFxuICAgIFwibGlnaHRza3libHVlXCI6IFsxMzUsIDIwNiwgMjUwXSxcbiAgICBcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksIDEzNiwgMTUzXSxcbiAgICBcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksIDEzNiwgMTUzXSxcbiAgICBcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsIDE5NiwgMjIyXSxcbiAgICBcImxpZ2h0eWVsbG93XCI6IFsyNTUsIDI1NSwgMjI0XSxcbiAgICBcImxpbWVcIjogWzAsIDI1NSwgMF0sXG4gICAgXCJsaW1lZ3JlZW5cIjogWzUwLCAyMDUsIDUwXSxcbiAgICBcImxpbmVuXCI6IFsyNTAsIDI0MCwgMjMwXSxcbiAgICBcIm1hZ2VudGFcIjogWzI1NSwgMCwgMjU1XSxcbiAgICBcIm1hcm9vblwiOiBbMTI4LCAwLCAwXSxcbiAgICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwgMjA1LCAxNzBdLFxuICAgIFwibWVkaXVtYmx1ZVwiOiBbMCwgMCwgMjA1XSxcbiAgICBcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LCA4NSwgMjExXSxcbiAgICBcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LCAxMTIsIDIxOV0sXG4gICAgXCJtZWRpdW1zZWFncmVlblwiOiBbNjAsIDE3OSwgMTEzXSxcbiAgICBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLCAxMDQsIDIzOF0sXG4gICAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwgMjUwLCAxNTRdLFxuICAgIFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwgMjA5LCAyMDRdLFxuICAgIFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksIDIxLCAxMzNdLFxuICAgIFwibWlkbmlnaHRibHVlXCI6IFsyNSwgMjUsIDExMl0sXG4gICAgXCJtaW50Y3JlYW1cIjogWzI0NSwgMjU1LCAyNTBdLFxuICAgIFwibWlzdHlyb3NlXCI6IFsyNTUsIDIyOCwgMjI1XSxcbiAgICBcIm1vY2Nhc2luXCI6IFsyNTUsIDIyOCwgMTgxXSxcbiAgICBcIm5hdmFqb3doaXRlXCI6IFsyNTUsIDIyMiwgMTczXSxcbiAgICBcIm5hdnlcIjogWzAsIDAsIDEyOF0sXG4gICAgXCJvbGRsYWNlXCI6IFsyNTMsIDI0NSwgMjMwXSxcbiAgICBcIm9saXZlXCI6IFsxMjgsIDEyOCwgMF0sXG4gICAgXCJvbGl2ZWRyYWJcIjogWzEwNywgMTQyLCAzNV0sXG4gICAgXCJvcmFuZ2VcIjogWzI1NSwgMTY1LCAwXSxcbiAgICBcIm9yYW5nZXJlZFwiOiBbMjU1LCA2OSwgMF0sXG4gICAgXCJvcmNoaWRcIjogWzIxOCwgMTEyLCAyMTRdLFxuICAgIFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LCAyMzIsIDE3MF0sXG4gICAgXCJwYWxlZ3JlZW5cIjogWzE1MiwgMjUxLCAxNTJdLFxuICAgIFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LCAyMzgsIDIzOF0sXG4gICAgXCJwYWxldmlvbGV0cmVkXCI6IFsyMTksIDExMiwgMTQ3XSxcbiAgICBcInBhcGF5YXdoaXBcIjogWzI1NSwgMjM5LCAyMTNdLFxuICAgIFwicGVhY2hwdWZmXCI6IFsyNTUsIDIxOCwgMTg1XSxcbiAgICBcInBlcnVcIjogWzIwNSwgMTMzLCA2M10sXG4gICAgXCJwaW5rXCI6IFsyNTUsIDE5MiwgMjAzXSxcbiAgICBcInBsdW1cIjogWzIyMSwgMTYwLCAyMjFdLFxuICAgIFwicG93ZGVyYmx1ZVwiOiBbMTc2LCAyMjQsIDIzMF0sXG4gICAgXCJwdXJwbGVcIjogWzEyOCwgMCwgMTI4XSxcbiAgICBcInJlYmVjY2FwdXJwbGVcIjogWzEwMiwgNTEsIDE1M10sXG4gICAgXCJyZWRcIjogWzI1NSwgMCwgMF0sXG4gICAgXCJyb3N5YnJvd25cIjogWzE4OCwgMTQzLCAxNDNdLFxuICAgIFwicm95YWxibHVlXCI6IFs2NSwgMTA1LCAyMjVdLFxuICAgIFwic2FkZGxlYnJvd25cIjogWzEzOSwgNjksIDE5XSxcbiAgICBcInNhbG1vblwiOiBbMjUwLCAxMjgsIDExNF0sXG4gICAgXCJzYW5keWJyb3duXCI6IFsyNDQsIDE2NCwgOTZdLFxuICAgIFwic2VhZ3JlZW5cIjogWzQ2LCAxMzksIDg3XSxcbiAgICBcInNlYXNoZWxsXCI6IFsyNTUsIDI0NSwgMjM4XSxcbiAgICBcInNpZW5uYVwiOiBbMTYwLCA4MiwgNDVdLFxuICAgIFwic2lsdmVyXCI6IFsxOTIsIDE5MiwgMTkyXSxcbiAgICBcInNreWJsdWVcIjogWzEzNSwgMjA2LCAyMzVdLFxuICAgIFwic2xhdGVibHVlXCI6IFsxMDYsIDkwLCAyMDVdLFxuICAgIFwic2xhdGVncmF5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcbiAgICBcInNsYXRlZ3JleVwiOiBbMTEyLCAxMjgsIDE0NF0sXG4gICAgXCJzbm93XCI6IFsyNTUsIDI1MCwgMjUwXSxcbiAgICBcInNwcmluZ2dyZWVuXCI6IFswLCAyNTUsIDEyN10sXG4gICAgXCJzdGVlbGJsdWVcIjogWzcwLCAxMzAsIDE4MF0sXG4gICAgXCJ0YW5cIjogWzIxMCwgMTgwLCAxNDBdLFxuICAgIFwidGVhbFwiOiBbMCwgMTI4LCAxMjhdLFxuICAgIFwidGhpc3RsZVwiOiBbMjE2LCAxOTEsIDIxNl0sXG4gICAgXCJ0b21hdG9cIjogWzI1NSwgOTksIDcxXSxcbiAgICBcInR1cnF1b2lzZVwiOiBbNjQsIDIyNCwgMjA4XSxcbiAgICBcInZpb2xldFwiOiBbMjM4LCAxMzAsIDIzOF0sXG4gICAgXCJ3aGVhdFwiOiBbMjQ1LCAyMjIsIDE3OV0sXG4gICAgXCJ3aGl0ZVwiOiBbMjU1LCAyNTUsIDI1NV0sXG4gICAgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsIDI0NSwgMjQ1XSxcbiAgICBcInllbGxvd1wiOiBbMjU1LCAyNTUsIDBdLFxuICAgIFwieWVsbG93Z3JlZW5cIjogWzE1NCwgMjA1LCA1MF1cbiAgfTtcblxuICB2YXIgY29udmVyc2lvbnMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gICAgLyogTUlUIGxpY2Vuc2UgKi9cbiAgICAvLyBOT1RFOiBjb252ZXJzaW9ucyBzaG91bGQgb25seSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyAoaS5lLiBhcnJheXMsIG9yXG4gICAgLy8gICAgICAgdmFsdWVzIHRoYXQgZ2l2ZSBjb3JyZWN0IGB0eXBlb2ZgIHJlc3VsdHMpLlxuICAgIC8vICAgICAgIGRvIG5vdCB1c2UgYm94IHZhbHVlcyB0eXBlcyAoaS5lLiBOdW1iZXIoKSwgU3RyaW5nKCksIGV0Yy4pXG4gICAgdmFyIHJldmVyc2VLZXl3b3JkcyA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGNvbG9yTmFtZSkge1xuICAgICAgaWYgKGNvbG9yTmFtZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHJldmVyc2VLZXl3b3Jkc1tjb2xvck5hbWVba2V5XV0gPSBrZXk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNvbnZlcnQgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgIHJnYjoge1xuICAgICAgICBjaGFubmVsczogMyxcbiAgICAgICAgbGFiZWxzOiAncmdiJ1xuICAgICAgfSxcbiAgICAgIGhzbDoge1xuICAgICAgICBjaGFubmVsczogMyxcbiAgICAgICAgbGFiZWxzOiAnaHNsJ1xuICAgICAgfSxcbiAgICAgIGhzdjoge1xuICAgICAgICBjaGFubmVsczogMyxcbiAgICAgICAgbGFiZWxzOiAnaHN2J1xuICAgICAgfSxcbiAgICAgIGh3Yjoge1xuICAgICAgICBjaGFubmVsczogMyxcbiAgICAgICAgbGFiZWxzOiAnaHdiJ1xuICAgICAgfSxcbiAgICAgIGNteWs6IHtcbiAgICAgICAgY2hhbm5lbHM6IDQsXG4gICAgICAgIGxhYmVsczogJ2NteWsnXG4gICAgICB9LFxuICAgICAgeHl6OiB7XG4gICAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgICBsYWJlbHM6ICd4eXonXG4gICAgICB9LFxuICAgICAgbGFiOiB7XG4gICAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgICBsYWJlbHM6ICdsYWInXG4gICAgICB9LFxuICAgICAgbGNoOiB7XG4gICAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgICBsYWJlbHM6ICdsY2gnXG4gICAgICB9LFxuICAgICAgaGV4OiB7XG4gICAgICAgIGNoYW5uZWxzOiAxLFxuICAgICAgICBsYWJlbHM6IFsnaGV4J11cbiAgICAgIH0sXG4gICAgICBrZXl3b3JkOiB7XG4gICAgICAgIGNoYW5uZWxzOiAxLFxuICAgICAgICBsYWJlbHM6IFsna2V5d29yZCddXG4gICAgICB9LFxuICAgICAgYW5zaTE2OiB7XG4gICAgICAgIGNoYW5uZWxzOiAxLFxuICAgICAgICBsYWJlbHM6IFsnYW5zaTE2J11cbiAgICAgIH0sXG4gICAgICBhbnNpMjU2OiB7XG4gICAgICAgIGNoYW5uZWxzOiAxLFxuICAgICAgICBsYWJlbHM6IFsnYW5zaTI1NiddXG4gICAgICB9LFxuICAgICAgaGNnOiB7XG4gICAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgICBsYWJlbHM6IFsnaCcsICdjJywgJ2cnXVxuICAgICAgfSxcbiAgICAgIGFwcGxlOiB7XG4gICAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgICBsYWJlbHM6IFsncjE2JywgJ2cxNicsICdiMTYnXVxuICAgICAgfSxcbiAgICAgIGdyYXk6IHtcbiAgICAgICAgY2hhbm5lbHM6IDEsXG4gICAgICAgIGxhYmVsczogWydncmF5J11cbiAgICAgIH1cbiAgICB9OyAvLyBoaWRlIC5jaGFubmVscyBhbmQgLmxhYmVscyBwcm9wZXJ0aWVzXG5cbiAgICBmb3IgKHZhciBtb2RlbCBpbiBjb252ZXJ0KSB7XG4gICAgICBpZiAoY29udmVydC5oYXNPd25Qcm9wZXJ0eShtb2RlbCkpIHtcbiAgICAgICAgaWYgKCEoJ2NoYW5uZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbCBsYWJlbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udmVydFttb2RlbF0ubGFiZWxzLmxlbmd0aCAhPT0gY29udmVydFttb2RlbF0uY2hhbm5lbHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWwgYW5kIGxhYmVsIGNvdW50cyBtaXNtYXRjaDogJyArIG1vZGVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGFubmVscyA9IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuICAgICAgICB2YXIgbGFiZWxzID0gY29udmVydFttb2RlbF0ubGFiZWxzO1xuICAgICAgICBkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG4gICAgICAgIGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2NoYW5uZWxzJywge1xuICAgICAgICAgIHZhbHVlOiBjaGFubmVsc1xuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnbGFiZWxzJywge1xuICAgICAgICAgIHZhbHVlOiBsYWJlbHNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29udmVydC5yZ2IuaHNsID0gZnVuY3Rpb24gKHJnYikge1xuICAgICAgdmFyIHIgPSByZ2JbMF0gLyAyNTU7XG4gICAgICB2YXIgZyA9IHJnYlsxXSAvIDI1NTtcbiAgICAgIHZhciBiID0gcmdiWzJdIC8gMjU1O1xuICAgICAgdmFyIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuICAgICAgdmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgICAgdmFyIGRlbHRhID0gbWF4IC0gbWluO1xuICAgICAgdmFyIGg7XG4gICAgICB2YXIgcztcbiAgICAgIHZhciBsO1xuXG4gICAgICBpZiAobWF4ID09PSBtaW4pIHtcbiAgICAgICAgaCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHIgPT09IG1heCkge1xuICAgICAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xuICAgICAgfSBlbHNlIGlmIChnID09PSBtYXgpIHtcbiAgICAgICAgaCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG4gICAgICB9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuICAgICAgICBoID0gNCArIChyIC0gZykgLyBkZWx0YTtcbiAgICAgIH1cblxuICAgICAgaCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuICAgICAgaWYgKGggPCAwKSB7XG4gICAgICAgIGggKz0gMzYwO1xuICAgICAgfVxuXG4gICAgICBsID0gKG1pbiArIG1heCkgLyAyO1xuXG4gICAgICBpZiAobWF4ID09PSBtaW4pIHtcbiAgICAgICAgcyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGwgPD0gMC41KSB7XG4gICAgICAgIHMgPSBkZWx0YSAvIChtYXggKyBtaW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcyA9IGRlbHRhIC8gKDIgLSBtYXggLSBtaW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi5oc3YgPSBmdW5jdGlvbiAocmdiKSB7XG4gICAgICB2YXIgcmRpZjtcbiAgICAgIHZhciBnZGlmO1xuICAgICAgdmFyIGJkaWY7XG4gICAgICB2YXIgaDtcbiAgICAgIHZhciBzO1xuICAgICAgdmFyIHIgPSByZ2JbMF0gLyAyNTU7XG4gICAgICB2YXIgZyA9IHJnYlsxXSAvIDI1NTtcbiAgICAgIHZhciBiID0gcmdiWzJdIC8gMjU1O1xuICAgICAgdmFyIHYgPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgICAgIHZhciBkaWZmID0gdiAtIE1hdGgubWluKHIsIGcsIGIpO1xuXG4gICAgICB2YXIgZGlmZmMgPSBmdW5jdGlvbiBkaWZmYyhjKSB7XG4gICAgICAgIHJldHVybiAodiAtIGMpIC8gNiAvIGRpZmYgKyAxIC8gMjtcbiAgICAgIH07XG5cbiAgICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICAgIGggPSBzID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMgPSBkaWZmIC8gdjtcbiAgICAgICAgcmRpZiA9IGRpZmZjKHIpO1xuICAgICAgICBnZGlmID0gZGlmZmMoZyk7XG4gICAgICAgIGJkaWYgPSBkaWZmYyhiKTtcblxuICAgICAgICBpZiAociA9PT0gdikge1xuICAgICAgICAgIGggPSBiZGlmIC0gZ2RpZjtcbiAgICAgICAgfSBlbHNlIGlmIChnID09PSB2KSB7XG4gICAgICAgICAgaCA9IDEgLyAzICsgcmRpZiAtIGJkaWY7XG4gICAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdikge1xuICAgICAgICAgIGggPSAyIC8gMyArIGdkaWYgLSByZGlmO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGggPCAwKSB7XG4gICAgICAgICAgaCArPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKGggPiAxKSB7XG4gICAgICAgICAgaCAtPSAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbaCAqIDM2MCwgcyAqIDEwMCwgdiAqIDEwMF07XG4gICAgfTtcblxuICAgIGNvbnZlcnQucmdiLmh3YiA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICAgIHZhciByID0gcmdiWzBdO1xuICAgICAgdmFyIGcgPSByZ2JbMV07XG4gICAgICB2YXIgYiA9IHJnYlsyXTtcbiAgICAgIHZhciBoID0gY29udmVydC5yZ2IuaHNsKHJnYilbMF07XG4gICAgICB2YXIgdyA9IDEgLyAyNTUgKiBNYXRoLm1pbihyLCBNYXRoLm1pbihnLCBiKSk7XG4gICAgICBiID0gMSAtIDEgLyAyNTUgKiBNYXRoLm1heChyLCBNYXRoLm1heChnLCBiKSk7XG4gICAgICByZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi5jbXlrID0gZnVuY3Rpb24gKHJnYikge1xuICAgICAgdmFyIHIgPSByZ2JbMF0gLyAyNTU7XG4gICAgICB2YXIgZyA9IHJnYlsxXSAvIDI1NTtcbiAgICAgIHZhciBiID0gcmdiWzJdIC8gMjU1O1xuICAgICAgdmFyIGM7XG4gICAgICB2YXIgbTtcbiAgICAgIHZhciB5O1xuICAgICAgdmFyIGs7XG4gICAgICBrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG4gICAgICBjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gICAgICBtID0gKDEgLSBnIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gICAgICB5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gICAgICByZXR1cm4gW2MgKiAxMDAsIG0gKiAxMDAsIHkgKiAxMDAsIGsgKiAxMDBdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2VlIGh0dHBzOi8vZW4ubS53aWtpcGVkaWEub3JnL3dpa2kvRXVjbGlkZWFuX2Rpc3RhbmNlI1NxdWFyZWRfRXVjbGlkZWFuX2Rpc3RhbmNlXG4gICAgICogKi9cblxuXG4gICAgZnVuY3Rpb24gY29tcGFyYXRpdmVEaXN0YW5jZSh4LCB5KSB7XG4gICAgICByZXR1cm4gTWF0aC5wb3coeFswXSAtIHlbMF0sIDIpICsgTWF0aC5wb3coeFsxXSAtIHlbMV0sIDIpICsgTWF0aC5wb3coeFsyXSAtIHlbMl0sIDIpO1xuICAgIH1cblxuICAgIGNvbnZlcnQucmdiLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG4gICAgICB2YXIgcmV2ZXJzZWQgPSByZXZlcnNlS2V5d29yZHNbcmdiXTtcblxuICAgICAgaWYgKHJldmVyc2VkKSB7XG4gICAgICAgIHJldHVybiByZXZlcnNlZDtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgIHZhciBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG5cbiAgICAgIGZvciAodmFyIGtleXdvcmQgaW4gY29sb3JOYW1lKSB7XG4gICAgICAgIGlmIChjb2xvck5hbWUuaGFzT3duUHJvcGVydHkoa2V5d29yZCkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBjb2xvck5hbWVba2V5d29yZF07IC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2VcblxuICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7IC8vIENoZWNrIGlmIGl0cyBsZXNzLCBpZiBzbyBzZXQgYXMgY2xvc2VzdFxuXG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDwgY3VycmVudENsb3Nlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgY3VycmVudENsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgY3VycmVudENsb3Nlc3RLZXl3b3JkID0ga2V5d29yZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcbiAgICB9O1xuXG4gICAgY29udmVydC5rZXl3b3JkLnJnYiA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG4gICAgICByZXR1cm4gY29sb3JOYW1lW2tleXdvcmRdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi54eXogPSBmdW5jdGlvbiAocmdiKSB7XG4gICAgICB2YXIgciA9IHJnYlswXSAvIDI1NTtcbiAgICAgIHZhciBnID0gcmdiWzFdIC8gMjU1O1xuICAgICAgdmFyIGIgPSByZ2JbMl0gLyAyNTU7IC8vIGFzc3VtZSBzUkdCXG5cbiAgICAgIHIgPSByID4gMC4wNDA0NSA/IE1hdGgucG93KChyICsgMC4wNTUpIC8gMS4wNTUsIDIuNCkgOiByIC8gMTIuOTI7XG4gICAgICBnID0gZyA+IDAuMDQwNDUgPyBNYXRoLnBvdygoZyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpIDogZyAvIDEyLjkyO1xuICAgICAgYiA9IGIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKGIgKyAwLjA1NSkgLyAxLjA1NSwgMi40KSA6IGIgLyAxMi45MjtcbiAgICAgIHZhciB4ID0gciAqIDAuNDEyNCArIGcgKiAwLjM1NzYgKyBiICogMC4xODA1O1xuICAgICAgdmFyIHkgPSByICogMC4yMTI2ICsgZyAqIDAuNzE1MiArIGIgKiAwLjA3MjI7XG4gICAgICB2YXIgeiA9IHIgKiAwLjAxOTMgKyBnICogMC4xMTkyICsgYiAqIDAuOTUwNTtcbiAgICAgIHJldHVybiBbeCAqIDEwMCwgeSAqIDEwMCwgeiAqIDEwMF07XG4gICAgfTtcblxuICAgIGNvbnZlcnQucmdiLmxhYiA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICAgIHZhciB4eXogPSBjb252ZXJ0LnJnYi54eXoocmdiKTtcbiAgICAgIHZhciB4ID0geHl6WzBdO1xuICAgICAgdmFyIHkgPSB4eXpbMV07XG4gICAgICB2YXIgeiA9IHh5elsyXTtcbiAgICAgIHZhciBsO1xuICAgICAgdmFyIGE7XG4gICAgICB2YXIgYjtcbiAgICAgIHggLz0gOTUuMDQ3O1xuICAgICAgeSAvPSAxMDA7XG4gICAgICB6IC89IDEwOC44ODM7XG4gICAgICB4ID0geCA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMSAvIDMpIDogNy43ODcgKiB4ICsgMTYgLyAxMTY7XG4gICAgICB5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMSAvIDMpIDogNy43ODcgKiB5ICsgMTYgLyAxMTY7XG4gICAgICB6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMSAvIDMpIDogNy43ODcgKiB6ICsgMTYgLyAxMTY7XG4gICAgICBsID0gMTE2ICogeSAtIDE2O1xuICAgICAgYSA9IDUwMCAqICh4IC0geSk7XG4gICAgICBiID0gMjAwICogKHkgLSB6KTtcbiAgICAgIHJldHVybiBbbCwgYSwgYl07XG4gICAgfTtcblxuICAgIGNvbnZlcnQuaHNsLnJnYiA9IGZ1bmN0aW9uIChoc2wpIHtcbiAgICAgIHZhciBoID0gaHNsWzBdIC8gMzYwO1xuICAgICAgdmFyIHMgPSBoc2xbMV0gLyAxMDA7XG4gICAgICB2YXIgbCA9IGhzbFsyXSAvIDEwMDtcbiAgICAgIHZhciB0MTtcbiAgICAgIHZhciB0MjtcbiAgICAgIHZhciB0MztcbiAgICAgIHZhciByZ2I7XG4gICAgICB2YXIgdmFsO1xuXG4gICAgICBpZiAocyA9PT0gMCkge1xuICAgICAgICB2YWwgPSBsICogMjU1O1xuICAgICAgICByZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuICAgICAgfVxuXG4gICAgICBpZiAobCA8IDAuNSkge1xuICAgICAgICB0MiA9IGwgKiAoMSArIHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdDIgPSBsICsgcyAtIGwgKiBzO1xuICAgICAgfVxuXG4gICAgICB0MSA9IDIgKiBsIC0gdDI7XG4gICAgICByZ2IgPSBbMCwgMCwgMF07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgIHQzID0gaCArIDEgLyAzICogLShpIC0gMSk7XG5cbiAgICAgICAgaWYgKHQzIDwgMCkge1xuICAgICAgICAgIHQzKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodDMgPiAxKSB7XG4gICAgICAgICAgdDMtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICg2ICogdDMgPCAxKSB7XG4gICAgICAgICAgdmFsID0gdDEgKyAodDIgLSB0MSkgKiA2ICogdDM7XG4gICAgICAgIH0gZWxzZSBpZiAoMiAqIHQzIDwgMSkge1xuICAgICAgICAgIHZhbCA9IHQyO1xuICAgICAgICB9IGVsc2UgaWYgKDMgKiB0MyA8IDIpIHtcbiAgICAgICAgICB2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gdDE7XG4gICAgICAgIH1cblxuICAgICAgICByZ2JbaV0gPSB2YWwgKiAyNTU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZ2I7XG4gICAgfTtcblxuICAgIGNvbnZlcnQuaHNsLmhzdiA9IGZ1bmN0aW9uIChoc2wpIHtcbiAgICAgIHZhciBoID0gaHNsWzBdO1xuICAgICAgdmFyIHMgPSBoc2xbMV0gLyAxMDA7XG4gICAgICB2YXIgbCA9IGhzbFsyXSAvIDEwMDtcbiAgICAgIHZhciBzbWluID0gcztcbiAgICAgIHZhciBsbWluID0gTWF0aC5tYXgobCwgMC4wMSk7XG4gICAgICB2YXIgc3Y7XG4gICAgICB2YXIgdjtcbiAgICAgIGwgKj0gMjtcbiAgICAgIHMgKj0gbCA8PSAxID8gbCA6IDIgLSBsO1xuICAgICAgc21pbiAqPSBsbWluIDw9IDEgPyBsbWluIDogMiAtIGxtaW47XG4gICAgICB2ID0gKGwgKyBzKSAvIDI7XG4gICAgICBzdiA9IGwgPT09IDAgPyAyICogc21pbiAvIChsbWluICsgc21pbikgOiAyICogcyAvIChsICsgcyk7XG4gICAgICByZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5oc3YucmdiID0gZnVuY3Rpb24gKGhzdikge1xuICAgICAgdmFyIGggPSBoc3ZbMF0gLyA2MDtcbiAgICAgIHZhciBzID0gaHN2WzFdIC8gMTAwO1xuICAgICAgdmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG4gICAgICB2YXIgaGkgPSBNYXRoLmZsb29yKGgpICUgNjtcbiAgICAgIHZhciBmID0gaCAtIE1hdGguZmxvb3IoaCk7XG4gICAgICB2YXIgcCA9IDI1NSAqIHYgKiAoMSAtIHMpO1xuICAgICAgdmFyIHEgPSAyNTUgKiB2ICogKDEgLSBzICogZik7XG4gICAgICB2YXIgdCA9IDI1NSAqIHYgKiAoMSAtIHMgKiAoMSAtIGYpKTtcbiAgICAgIHYgKj0gMjU1O1xuXG4gICAgICBzd2l0Y2ggKGhpKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gW3YsIHQsIHBdO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gW3EsIHYsIHBdO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICByZXR1cm4gW3AsIHYsIHRdO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gW3AsIHEsIHZdO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICByZXR1cm4gW3QsIHAsIHZdO1xuXG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZXR1cm4gW3YsIHAsIHFdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb252ZXJ0Lmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG4gICAgICB2YXIgaCA9IGhzdlswXTtcbiAgICAgIHZhciBzID0gaHN2WzFdIC8gMTAwO1xuICAgICAgdmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG4gICAgICB2YXIgdm1pbiA9IE1hdGgubWF4KHYsIDAuMDEpO1xuICAgICAgdmFyIGxtaW47XG4gICAgICB2YXIgc2w7XG4gICAgICB2YXIgbDtcbiAgICAgIGwgPSAoMiAtIHMpICogdjtcbiAgICAgIGxtaW4gPSAoMiAtIHMpICogdm1pbjtcbiAgICAgIHNsID0gcyAqIHZtaW47XG4gICAgICBzbCAvPSBsbWluIDw9IDEgPyBsbWluIDogMiAtIGxtaW47XG4gICAgICBzbCA9IHNsIHx8IDA7XG4gICAgICBsIC89IDI7XG4gICAgICByZXR1cm4gW2gsIHNsICogMTAwLCBsICogMTAwXTtcbiAgICB9OyAvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtY29sb3IvI2h3Yi10by1yZ2JcblxuXG4gICAgY29udmVydC5od2IucmdiID0gZnVuY3Rpb24gKGh3Yikge1xuICAgICAgdmFyIGggPSBod2JbMF0gLyAzNjA7XG4gICAgICB2YXIgd2ggPSBod2JbMV0gLyAxMDA7XG4gICAgICB2YXIgYmwgPSBod2JbMl0gLyAxMDA7XG4gICAgICB2YXIgcmF0aW8gPSB3aCArIGJsO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgdjtcbiAgICAgIHZhciBmO1xuICAgICAgdmFyIG47IC8vIHdoICsgYmwgY2FudCBiZSA+IDFcblxuICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICB3aCAvPSByYXRpbztcbiAgICAgICAgYmwgLz0gcmF0aW87XG4gICAgICB9XG5cbiAgICAgIGkgPSBNYXRoLmZsb29yKDYgKiBoKTtcbiAgICAgIHYgPSAxIC0gYmw7XG4gICAgICBmID0gNiAqIGggLSBpO1xuXG4gICAgICBpZiAoKGkgJiAweDAxKSAhPT0gMCkge1xuICAgICAgICBmID0gMSAtIGY7XG4gICAgICB9XG5cbiAgICAgIG4gPSB3aCArIGYgKiAodiAtIHdoKTsgLy8gbGluZWFyIGludGVycG9sYXRpb25cblxuICAgICAgdmFyIHI7XG4gICAgICB2YXIgZztcbiAgICAgIHZhciBiO1xuXG4gICAgICBzd2l0Y2ggKGkpIHtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgciA9IHY7XG4gICAgICAgICAgZyA9IG47XG4gICAgICAgICAgYiA9IHdoO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByID0gbjtcbiAgICAgICAgICBnID0gdjtcbiAgICAgICAgICBiID0gd2g7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHIgPSB3aDtcbiAgICAgICAgICBnID0gdjtcbiAgICAgICAgICBiID0gbjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgciA9IHdoO1xuICAgICAgICAgIGcgPSBuO1xuICAgICAgICAgIGIgPSB2O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICByID0gbjtcbiAgICAgICAgICBnID0gd2g7XG4gICAgICAgICAgYiA9IHY7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHIgPSB2O1xuICAgICAgICAgIGcgPSB3aDtcbiAgICAgICAgICBiID0gbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbiAgICB9O1xuXG4gICAgY29udmVydC5jbXlrLnJnYiA9IGZ1bmN0aW9uIChjbXlrKSB7XG4gICAgICB2YXIgYyA9IGNteWtbMF0gLyAxMDA7XG4gICAgICB2YXIgbSA9IGNteWtbMV0gLyAxMDA7XG4gICAgICB2YXIgeSA9IGNteWtbMl0gLyAxMDA7XG4gICAgICB2YXIgayA9IGNteWtbM10gLyAxMDA7XG4gICAgICB2YXIgcjtcbiAgICAgIHZhciBnO1xuICAgICAgdmFyIGI7XG4gICAgICByID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XG4gICAgICBnID0gMSAtIE1hdGgubWluKDEsIG0gKiAoMSAtIGspICsgayk7XG4gICAgICBiID0gMSAtIE1hdGgubWluKDEsIHkgKiAoMSAtIGspICsgayk7XG4gICAgICByZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0Lnh5ei5yZ2IgPSBmdW5jdGlvbiAoeHl6KSB7XG4gICAgICB2YXIgeCA9IHh5elswXSAvIDEwMDtcbiAgICAgIHZhciB5ID0geHl6WzFdIC8gMTAwO1xuICAgICAgdmFyIHogPSB4eXpbMl0gLyAxMDA7XG4gICAgICB2YXIgcjtcbiAgICAgIHZhciBnO1xuICAgICAgdmFyIGI7XG4gICAgICByID0geCAqIDMuMjQwNiArIHkgKiAtMS41MzcyICsgeiAqIC0wLjQ5ODY7XG4gICAgICBnID0geCAqIC0wLjk2ODkgKyB5ICogMS44NzU4ICsgeiAqIDAuMDQxNTtcbiAgICAgIGIgPSB4ICogMC4wNTU3ICsgeSAqIC0wLjIwNDAgKyB6ICogMS4wNTcwOyAvLyBhc3N1bWUgc1JHQlxuXG4gICAgICByID0gciA+IDAuMDAzMTMwOCA/IDEuMDU1ICogTWF0aC5wb3cociwgMS4wIC8gMi40KSAtIDAuMDU1IDogciAqIDEyLjkyO1xuICAgICAgZyA9IGcgPiAwLjAwMzEzMDggPyAxLjA1NSAqIE1hdGgucG93KGcsIDEuMCAvIDIuNCkgLSAwLjA1NSA6IGcgKiAxMi45MjtcbiAgICAgIGIgPSBiID4gMC4wMDMxMzA4ID8gMS4wNTUgKiBNYXRoLnBvdyhiLCAxLjAgLyAyLjQpIC0gMC4wNTUgOiBiICogMTIuOTI7XG4gICAgICByID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgciksIDEpO1xuICAgICAgZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcbiAgICAgIGIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBiKSwgMSk7XG4gICAgICByZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0Lnh5ei5sYWIgPSBmdW5jdGlvbiAoeHl6KSB7XG4gICAgICB2YXIgeCA9IHh5elswXTtcbiAgICAgIHZhciB5ID0geHl6WzFdO1xuICAgICAgdmFyIHogPSB4eXpbMl07XG4gICAgICB2YXIgbDtcbiAgICAgIHZhciBhO1xuICAgICAgdmFyIGI7XG4gICAgICB4IC89IDk1LjA0NztcbiAgICAgIHkgLz0gMTAwO1xuICAgICAgeiAvPSAxMDguODgzO1xuICAgICAgeCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEgLyAzKSA6IDcuNzg3ICogeCArIDE2IC8gMTE2O1xuICAgICAgeSA9IHkgPiAwLjAwODg1NiA/IE1hdGgucG93KHksIDEgLyAzKSA6IDcuNzg3ICogeSArIDE2IC8gMTE2O1xuICAgICAgeiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEgLyAzKSA6IDcuNzg3ICogeiArIDE2IC8gMTE2O1xuICAgICAgbCA9IDExNiAqIHkgLSAxNjtcbiAgICAgIGEgPSA1MDAgKiAoeCAtIHkpO1xuICAgICAgYiA9IDIwMCAqICh5IC0geik7XG4gICAgICByZXR1cm4gW2wsIGEsIGJdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmxhYi54eXogPSBmdW5jdGlvbiAobGFiKSB7XG4gICAgICB2YXIgbCA9IGxhYlswXTtcbiAgICAgIHZhciBhID0gbGFiWzFdO1xuICAgICAgdmFyIGIgPSBsYWJbMl07XG4gICAgICB2YXIgeDtcbiAgICAgIHZhciB5O1xuICAgICAgdmFyIHo7XG4gICAgICB5ID0gKGwgKyAxNikgLyAxMTY7XG4gICAgICB4ID0gYSAvIDUwMCArIHk7XG4gICAgICB6ID0geSAtIGIgLyAyMDA7XG4gICAgICB2YXIgeTIgPSBNYXRoLnBvdyh5LCAzKTtcbiAgICAgIHZhciB4MiA9IE1hdGgucG93KHgsIDMpO1xuICAgICAgdmFyIHoyID0gTWF0aC5wb3coeiwgMyk7XG4gICAgICB5ID0geTIgPiAwLjAwODg1NiA/IHkyIDogKHkgLSAxNiAvIDExNikgLyA3Ljc4NztcbiAgICAgIHggPSB4MiA+IDAuMDA4ODU2ID8geDIgOiAoeCAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuICAgICAgeiA9IHoyID4gMC4wMDg4NTYgPyB6MiA6ICh6IC0gMTYgLyAxMTYpIC8gNy43ODc7XG4gICAgICB4ICo9IDk1LjA0NztcbiAgICAgIHkgKj0gMTAwO1xuICAgICAgeiAqPSAxMDguODgzO1xuICAgICAgcmV0dXJuIFt4LCB5LCB6XTtcbiAgICB9O1xuXG4gICAgY29udmVydC5sYWIubGNoID0gZnVuY3Rpb24gKGxhYikge1xuICAgICAgdmFyIGwgPSBsYWJbMF07XG4gICAgICB2YXIgYSA9IGxhYlsxXTtcbiAgICAgIHZhciBiID0gbGFiWzJdO1xuICAgICAgdmFyIGhyO1xuICAgICAgdmFyIGg7XG4gICAgICB2YXIgYztcbiAgICAgIGhyID0gTWF0aC5hdGFuMihiLCBhKTtcbiAgICAgIGggPSBociAqIDM2MCAvIDIgLyBNYXRoLlBJO1xuXG4gICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgaCArPSAzNjA7XG4gICAgICB9XG5cbiAgICAgIGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG4gICAgICByZXR1cm4gW2wsIGMsIGhdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmxjaC5sYWIgPSBmdW5jdGlvbiAobGNoKSB7XG4gICAgICB2YXIgbCA9IGxjaFswXTtcbiAgICAgIHZhciBjID0gbGNoWzFdO1xuICAgICAgdmFyIGggPSBsY2hbMl07XG4gICAgICB2YXIgYTtcbiAgICAgIHZhciBiO1xuICAgICAgdmFyIGhyO1xuICAgICAgaHIgPSBoIC8gMzYwICogMiAqIE1hdGguUEk7XG4gICAgICBhID0gYyAqIE1hdGguY29zKGhyKTtcbiAgICAgIGIgPSBjICogTWF0aC5zaW4oaHIpO1xuICAgICAgcmV0dXJuIFtsLCBhLCBiXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5yZ2IuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgIHZhciByID0gYXJnc1swXTtcbiAgICAgIHZhciBnID0gYXJnc1sxXTtcbiAgICAgIHZhciBiID0gYXJnc1syXTtcbiAgICAgIHZhciB2YWx1ZSA9IDEgaW4gYXJndW1lbnRzID8gYXJndW1lbnRzWzFdIDogY29udmVydC5yZ2IuaHN2KGFyZ3MpWzJdOyAvLyBoc3YgLT4gYW5zaTE2IG9wdGltaXphdGlvblxuXG4gICAgICB2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgLyA1MCk7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMzA7XG4gICAgICB9XG5cbiAgICAgIHZhciBhbnNpID0gMzAgKyAoTWF0aC5yb3VuZChiIC8gMjU1KSA8PCAyIHwgTWF0aC5yb3VuZChnIC8gMjU1KSA8PCAxIHwgTWF0aC5yb3VuZChyIC8gMjU1KSk7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gMikge1xuICAgICAgICBhbnNpICs9IDYwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYW5zaTtcbiAgICB9O1xuXG4gICAgY29udmVydC5oc3YuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgIC8vIG9wdGltaXphdGlvbiBoZXJlOyB3ZSBhbHJlYWR5IGtub3cgdGhlIHZhbHVlIGFuZCBkb24ndCBuZWVkIHRvIGdldFxuICAgICAgLy8gaXQgY29udmVydGVkIGZvciB1cy5cbiAgICAgIHJldHVybiBjb252ZXJ0LnJnYi5hbnNpMTYoY29udmVydC5oc3YucmdiKGFyZ3MpLCBhcmdzWzJdKTtcbiAgICB9O1xuXG4gICAgY29udmVydC5yZ2IuYW5zaTI1NiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICB2YXIgciA9IGFyZ3NbMF07XG4gICAgICB2YXIgZyA9IGFyZ3NbMV07XG4gICAgICB2YXIgYiA9IGFyZ3NbMl07IC8vIHdlIHVzZSB0aGUgZXh0ZW5kZWQgZ3JleXNjYWxlIHBhbGV0dGUgaGVyZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG4gICAgICAvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblxuICAgICAgaWYgKHIgPT09IGcgJiYgZyA9PT0gYikge1xuICAgICAgICBpZiAociA8IDgpIHtcbiAgICAgICAgICByZXR1cm4gMTY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAociA+IDI0OCkge1xuICAgICAgICAgIHJldHVybiAyMzE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgociAtIDgpIC8gMjQ3ICogMjQpICsgMjMyO1xuICAgICAgfVxuXG4gICAgICB2YXIgYW5zaSA9IDE2ICsgMzYgKiBNYXRoLnJvdW5kKHIgLyAyNTUgKiA1KSArIDYgKiBNYXRoLnJvdW5kKGcgLyAyNTUgKiA1KSArIE1hdGgucm91bmQoYiAvIDI1NSAqIDUpO1xuICAgICAgcmV0dXJuIGFuc2k7XG4gICAgfTtcblxuICAgIGNvbnZlcnQuYW5zaTE2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICB2YXIgY29sb3IgPSBhcmdzICUgMTA7IC8vIGhhbmRsZSBncmV5c2NhbGVcblxuICAgICAgaWYgKGNvbG9yID09PSAwIHx8IGNvbG9yID09PSA3KSB7XG4gICAgICAgIGlmIChhcmdzID4gNTApIHtcbiAgICAgICAgICBjb2xvciArPSAzLjU7XG4gICAgICAgIH1cblxuICAgICAgICBjb2xvciA9IGNvbG9yIC8gMTAuNSAqIDI1NTtcbiAgICAgICAgcmV0dXJuIFtjb2xvciwgY29sb3IsIGNvbG9yXTtcbiAgICAgIH1cblxuICAgICAgdmFyIG11bHQgPSAofn4oYXJncyA+IDUwKSArIDEpICogMC41O1xuICAgICAgdmFyIHIgPSAoY29sb3IgJiAxKSAqIG11bHQgKiAyNTU7XG4gICAgICB2YXIgZyA9IChjb2xvciA+PiAxICYgMSkgKiBtdWx0ICogMjU1O1xuICAgICAgdmFyIGIgPSAoY29sb3IgPj4gMiAmIDEpICogbXVsdCAqIDI1NTtcbiAgICAgIHJldHVybiBbciwgZywgYl07XG4gICAgfTtcblxuICAgIGNvbnZlcnQuYW5zaTI1Ni5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgLy8gaGFuZGxlIGdyZXlzY2FsZVxuICAgICAgaWYgKGFyZ3MgPj0gMjMyKSB7XG4gICAgICAgIHZhciBjID0gKGFyZ3MgLSAyMzIpICogMTAgKyA4O1xuICAgICAgICByZXR1cm4gW2MsIGMsIGNdO1xuICAgICAgfVxuXG4gICAgICBhcmdzIC09IDE2O1xuICAgICAgdmFyIHJlbTtcbiAgICAgIHZhciByID0gTWF0aC5mbG9vcihhcmdzIC8gMzYpIC8gNSAqIDI1NTtcbiAgICAgIHZhciBnID0gTWF0aC5mbG9vcigocmVtID0gYXJncyAlIDM2KSAvIDYpIC8gNSAqIDI1NTtcbiAgICAgIHZhciBiID0gcmVtICUgNiAvIDUgKiAyNTU7XG4gICAgICByZXR1cm4gW3IsIGcsIGJdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi5oZXggPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgdmFyIGludGVnZXIgPSAoKE1hdGgucm91bmQoYXJnc1swXSkgJiAweEZGKSA8PCAxNikgKyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KSArIChNYXRoLnJvdW5kKGFyZ3NbMl0pICYgMHhGRik7XG4gICAgICB2YXIgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgIHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG4gICAgfTtcblxuICAgIGNvbnZlcnQuaGV4LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBhcmdzLnRvU3RyaW5nKDE2KS5tYXRjaCgvW2EtZjAtOV17Nn18W2EtZjAtOV17M30vaSk7XG5cbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIFswLCAwLCAwXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbG9yU3RyaW5nID0gbWF0Y2hbMF07XG5cbiAgICAgIGlmIChtYXRjaFswXS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgY29sb3JTdHJpbmcgPSBjb2xvclN0cmluZy5zcGxpdCgnJykubWFwKGZ1bmN0aW9uIChjaGFyKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYXIgKyBjaGFyO1xuICAgICAgICB9KS5qb2luKCcnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGludGVnZXIgPSBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuICAgICAgdmFyIHIgPSBpbnRlZ2VyID4+IDE2ICYgMHhGRjtcbiAgICAgIHZhciBnID0gaW50ZWdlciA+PiA4ICYgMHhGRjtcbiAgICAgIHZhciBiID0gaW50ZWdlciAmIDB4RkY7XG4gICAgICByZXR1cm4gW3IsIGcsIGJdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi5oY2cgPSBmdW5jdGlvbiAocmdiKSB7XG4gICAgICB2YXIgciA9IHJnYlswXSAvIDI1NTtcbiAgICAgIHZhciBnID0gcmdiWzFdIC8gMjU1O1xuICAgICAgdmFyIGIgPSByZ2JbMl0gLyAyNTU7XG4gICAgICB2YXIgbWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgociwgZyksIGIpO1xuICAgICAgdmFyIG1pbiA9IE1hdGgubWluKE1hdGgubWluKHIsIGcpLCBiKTtcbiAgICAgIHZhciBjaHJvbWEgPSBtYXggLSBtaW47XG4gICAgICB2YXIgZ3JheXNjYWxlO1xuICAgICAgdmFyIGh1ZTtcblxuICAgICAgaWYgKGNocm9tYSA8IDEpIHtcbiAgICAgICAgZ3JheXNjYWxlID0gbWluIC8gKDEgLSBjaHJvbWEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JheXNjYWxlID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNocm9tYSA8PSAwKSB7XG4gICAgICAgIGh1ZSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKG1heCA9PT0gcikge1xuICAgICAgICBodWUgPSAoZyAtIGIpIC8gY2hyb21hICUgNjtcbiAgICAgIH0gZWxzZSBpZiAobWF4ID09PSBnKSB7XG4gICAgICAgIGh1ZSA9IDIgKyAoYiAtIHIpIC8gY2hyb21hO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHVlID0gNCArIChyIC0gZykgLyBjaHJvbWEgKyA0O1xuICAgICAgfVxuXG4gICAgICBodWUgLz0gNjtcbiAgICAgIGh1ZSAlPSAxO1xuICAgICAgcmV0dXJuIFtodWUgKiAzNjAsIGNocm9tYSAqIDEwMCwgZ3JheXNjYWxlICogMTAwXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5oc2wuaGNnID0gZnVuY3Rpb24gKGhzbCkge1xuICAgICAgdmFyIHMgPSBoc2xbMV0gLyAxMDA7XG4gICAgICB2YXIgbCA9IGhzbFsyXSAvIDEwMDtcbiAgICAgIHZhciBjID0gMTtcbiAgICAgIHZhciBmID0gMDtcblxuICAgICAgaWYgKGwgPCAwLjUpIHtcbiAgICAgICAgYyA9IDIuMCAqIHMgKiBsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYyA9IDIuMCAqIHMgKiAoMS4wIC0gbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjIDwgMS4wKSB7XG4gICAgICAgIGYgPSAobCAtIDAuNSAqIGMpIC8gKDEuMCAtIGMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW2hzbFswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG4gICAgfTtcblxuICAgIGNvbnZlcnQuaHN2LmhjZyA9IGZ1bmN0aW9uIChoc3YpIHtcbiAgICAgIHZhciBzID0gaHN2WzFdIC8gMTAwO1xuICAgICAgdmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG4gICAgICB2YXIgYyA9IHMgKiB2O1xuICAgICAgdmFyIGYgPSAwO1xuXG4gICAgICBpZiAoYyA8IDEuMCkge1xuICAgICAgICBmID0gKHYgLSBjKSAvICgxIC0gYyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbaHN2WzBdLCBjICogMTAwLCBmICogMTAwXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5oY2cucmdiID0gZnVuY3Rpb24gKGhjZykge1xuICAgICAgdmFyIGggPSBoY2dbMF0gLyAzNjA7XG4gICAgICB2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcbiAgICAgIHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG4gICAgICBpZiAoYyA9PT0gMC4wKSB7XG4gICAgICAgIHJldHVybiBbZyAqIDI1NSwgZyAqIDI1NSwgZyAqIDI1NV07XG4gICAgICB9XG5cbiAgICAgIHZhciBwdXJlID0gWzAsIDAsIDBdO1xuICAgICAgdmFyIGhpID0gaCAlIDEgKiA2O1xuICAgICAgdmFyIHYgPSBoaSAlIDE7XG4gICAgICB2YXIgdyA9IDEgLSB2O1xuICAgICAgdmFyIG1nID0gMDtcblxuICAgICAgc3dpdGNoIChNYXRoLmZsb29yKGhpKSkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcHVyZVswXSA9IDE7XG4gICAgICAgICAgcHVyZVsxXSA9IHY7XG4gICAgICAgICAgcHVyZVsyXSA9IDA7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHB1cmVbMF0gPSB3O1xuICAgICAgICAgIHB1cmVbMV0gPSAxO1xuICAgICAgICAgIHB1cmVbMl0gPSAwO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBwdXJlWzBdID0gMDtcbiAgICAgICAgICBwdXJlWzFdID0gMTtcbiAgICAgICAgICBwdXJlWzJdID0gdjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcHVyZVswXSA9IDA7XG4gICAgICAgICAgcHVyZVsxXSA9IHc7XG4gICAgICAgICAgcHVyZVsyXSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHB1cmVbMF0gPSB2O1xuICAgICAgICAgIHB1cmVbMV0gPSAwO1xuICAgICAgICAgIHB1cmVbMl0gPSAxO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcHVyZVswXSA9IDE7XG4gICAgICAgICAgcHVyZVsxXSA9IDA7XG4gICAgICAgICAgcHVyZVsyXSA9IHc7XG4gICAgICB9XG5cbiAgICAgIG1nID0gKDEuMCAtIGMpICogZztcbiAgICAgIHJldHVybiBbKGMgKiBwdXJlWzBdICsgbWcpICogMjU1LCAoYyAqIHB1cmVbMV0gKyBtZykgKiAyNTUsIChjICogcHVyZVsyXSArIG1nKSAqIDI1NV07XG4gICAgfTtcblxuICAgIGNvbnZlcnQuaGNnLmhzdiA9IGZ1bmN0aW9uIChoY2cpIHtcbiAgICAgIHZhciBjID0gaGNnWzFdIC8gMTAwO1xuICAgICAgdmFyIGcgPSBoY2dbMl0gLyAxMDA7XG4gICAgICB2YXIgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuICAgICAgdmFyIGYgPSAwO1xuXG4gICAgICBpZiAodiA+IDAuMCkge1xuICAgICAgICBmID0gYyAvIHY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbaGNnWzBdLCBmICogMTAwLCB2ICogMTAwXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5oY2cuaHNsID0gZnVuY3Rpb24gKGhjZykge1xuICAgICAgdmFyIGMgPSBoY2dbMV0gLyAxMDA7XG4gICAgICB2YXIgZyA9IGhjZ1syXSAvIDEwMDtcbiAgICAgIHZhciBsID0gZyAqICgxLjAgLSBjKSArIDAuNSAqIGM7XG4gICAgICB2YXIgcyA9IDA7XG5cbiAgICAgIGlmIChsID4gMC4wICYmIGwgPCAwLjUpIHtcbiAgICAgICAgcyA9IGMgLyAoMiAqIGwpO1xuICAgICAgfSBlbHNlIGlmIChsID49IDAuNSAmJiBsIDwgMS4wKSB7XG4gICAgICAgIHMgPSBjIC8gKDIgKiAoMSAtIGwpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtoY2dbMF0sIHMgKiAxMDAsIGwgKiAxMDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmhjZy5od2IgPSBmdW5jdGlvbiAoaGNnKSB7XG4gICAgICB2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcbiAgICAgIHZhciBnID0gaGNnWzJdIC8gMTAwO1xuICAgICAgdmFyIHYgPSBjICsgZyAqICgxLjAgLSBjKTtcbiAgICAgIHJldHVybiBbaGNnWzBdLCAodiAtIGMpICogMTAwLCAoMSAtIHYpICogMTAwXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5od2IuaGNnID0gZnVuY3Rpb24gKGh3Yikge1xuICAgICAgdmFyIHcgPSBod2JbMV0gLyAxMDA7XG4gICAgICB2YXIgYiA9IGh3YlsyXSAvIDEwMDtcbiAgICAgIHZhciB2ID0gMSAtIGI7XG4gICAgICB2YXIgYyA9IHYgLSB3O1xuICAgICAgdmFyIGcgPSAwO1xuXG4gICAgICBpZiAoYyA8IDEpIHtcbiAgICAgICAgZyA9ICh2IC0gYykgLyAoMSAtIGMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW2h3YlswXSwgYyAqIDEwMCwgZyAqIDEwMF07XG4gICAgfTtcblxuICAgIGNvbnZlcnQuYXBwbGUucmdiID0gZnVuY3Rpb24gKGFwcGxlKSB7XG4gICAgICByZXR1cm4gW2FwcGxlWzBdIC8gNjU1MzUgKiAyNTUsIGFwcGxlWzFdIC8gNjU1MzUgKiAyNTUsIGFwcGxlWzJdIC8gNjU1MzUgKiAyNTVdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi5hcHBsZSA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICAgIHJldHVybiBbcmdiWzBdIC8gMjU1ICogNjU1MzUsIHJnYlsxXSAvIDI1NSAqIDY1NTM1LCByZ2JbMl0gLyAyNTUgKiA2NTUzNV07XG4gICAgfTtcblxuICAgIGNvbnZlcnQuZ3JheS5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgcmV0dXJuIFthcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1XTtcbiAgICB9O1xuXG4gICAgY29udmVydC5ncmF5LmhzbCA9IGNvbnZlcnQuZ3JheS5oc3YgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgcmV0dXJuIFswLCAwLCBhcmdzWzBdXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5ncmF5Lmh3YiA9IGZ1bmN0aW9uIChncmF5KSB7XG4gICAgICByZXR1cm4gWzAsIDEwMCwgZ3JheVswXV07XG4gICAgfTtcblxuICAgIGNvbnZlcnQuZ3JheS5jbXlrID0gZnVuY3Rpb24gKGdyYXkpIHtcbiAgICAgIHJldHVybiBbMCwgMCwgMCwgZ3JheVswXV07XG4gICAgfTtcblxuICAgIGNvbnZlcnQuZ3JheS5sYWIgPSBmdW5jdGlvbiAoZ3JheSkge1xuICAgICAgcmV0dXJuIFtncmF5WzBdLCAwLCAwXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5ncmF5LmhleCA9IGZ1bmN0aW9uIChncmF5KSB7XG4gICAgICB2YXIgdmFsID0gTWF0aC5yb3VuZChncmF5WzBdIC8gMTAwICogMjU1KSAmIDB4RkY7XG4gICAgICB2YXIgaW50ZWdlciA9ICh2YWwgPDwgMTYpICsgKHZhbCA8PCA4KSArIHZhbDtcbiAgICAgIHZhciBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgcmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbiAgICB9O1xuXG4gICAgY29udmVydC5yZ2IuZ3JheSA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICAgIHZhciB2YWwgPSAocmdiWzBdICsgcmdiWzFdICsgcmdiWzJdKSAvIDM7XG4gICAgICByZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG4gICAgfTtcbiAgfSk7XG4gIHZhciBjb252ZXJzaW9uc18xID0gY29udmVyc2lvbnMucmdiO1xuICB2YXIgY29udmVyc2lvbnNfMiA9IGNvbnZlcnNpb25zLmhzbDtcbiAgdmFyIGNvbnZlcnNpb25zXzMgPSBjb252ZXJzaW9ucy5oc3Y7XG4gIHZhciBjb252ZXJzaW9uc180ID0gY29udmVyc2lvbnMuaHdiO1xuICB2YXIgY29udmVyc2lvbnNfNSA9IGNvbnZlcnNpb25zLmNteWs7XG4gIHZhciBjb252ZXJzaW9uc182ID0gY29udmVyc2lvbnMueHl6O1xuICB2YXIgY29udmVyc2lvbnNfNyA9IGNvbnZlcnNpb25zLmxhYjtcbiAgdmFyIGNvbnZlcnNpb25zXzggPSBjb252ZXJzaW9ucy5sY2g7XG4gIHZhciBjb252ZXJzaW9uc185ID0gY29udmVyc2lvbnMuaGV4O1xuICB2YXIgY29udmVyc2lvbnNfMTAgPSBjb252ZXJzaW9ucy5rZXl3b3JkO1xuICB2YXIgY29udmVyc2lvbnNfMTEgPSBjb252ZXJzaW9ucy5hbnNpMTY7XG4gIHZhciBjb252ZXJzaW9uc18xMiA9IGNvbnZlcnNpb25zLmFuc2kyNTY7XG4gIHZhciBjb252ZXJzaW9uc18xMyA9IGNvbnZlcnNpb25zLmhjZztcbiAgdmFyIGNvbnZlcnNpb25zXzE0ID0gY29udmVyc2lvbnMuYXBwbGU7XG4gIHZhciBjb252ZXJzaW9uc18xNSA9IGNvbnZlcnNpb25zLmdyYXk7XG5cbiAgLypcbiAgXHR0aGlzIGZ1bmN0aW9uIHJvdXRlcyBhIG1vZGVsIHRvIGFsbCBvdGhlciBtb2RlbHMuXG5cbiAgXHRhbGwgZnVuY3Rpb25zIHRoYXQgYXJlIHJvdXRlZCBoYXZlIGEgcHJvcGVydHkgYC5jb252ZXJzaW9uYCBhdHRhY2hlZFxuICBcdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcbiAgXHRvZiBzdHJpbmdzLCBlYWNoIHdpdGggdGhlIHN0ZXBzIGluIGJldHdlZW4gdGhlICdmcm9tJyBhbmQgJ3RvJ1xuICBcdGNvbG9yIG1vZGVscyAoaW5jbHVzaXZlKS5cblxuICBcdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiAgKi9cblxuICBmdW5jdGlvbiBidWlsZEdyYXBoKCkge1xuICAgIHZhciBncmFwaCA9IHt9OyAvLyBodHRwczovL2pzcGVyZi5jb20vb2JqZWN0LWtleXMtdnMtZm9yLWluLXdpdGgtY2xvc3VyZS8zXG5cbiAgICB2YXIgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG4gICAgZm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZ3JhcGhbbW9kZWxzW2ldXSA9IHtcbiAgICAgICAgLy8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuICAgICAgICAvLyBtaWNyby1vcHQsIGJ1dCB0aGlzIGlzIHNpbXBsZS5cbiAgICAgICAgZGlzdGFuY2U6IC0xLFxuICAgICAgICBwYXJlbnQ6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyYXBoO1xuICB9IC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZWFkdGgtZmlyc3Rfc2VhcmNoXG5cblxuICBmdW5jdGlvbiBkZXJpdmVCRlMoZnJvbU1vZGVsKSB7XG4gICAgdmFyIGdyYXBoID0gYnVpbGRHcmFwaCgpO1xuICAgIHZhciBxdWV1ZSA9IFtmcm9tTW9kZWxdOyAvLyB1bnNoaWZ0IC0+IHF1ZXVlIC0+IHBvcFxuXG4gICAgZ3JhcGhbZnJvbU1vZGVsXS5kaXN0YW5jZSA9IDA7XG5cbiAgICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XG4gICAgICB2YXIgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuICAgICAgdmFyIGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuICAgICAgZm9yICh2YXIgbGVuID0gYWRqYWNlbnRzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYWRqYWNlbnQgPSBhZGphY2VudHNbaV07XG4gICAgICAgIHZhciBub2RlID0gZ3JhcGhbYWRqYWNlbnRdO1xuXG4gICAgICAgIGlmIChub2RlLmRpc3RhbmNlID09PSAtMSkge1xuICAgICAgICAgIG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG4gICAgICAgICAgbm9kZS5wYXJlbnQgPSBjdXJyZW50O1xuICAgICAgICAgIHF1ZXVlLnVuc2hpZnQoYWRqYWNlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgZnVuY3Rpb24gbGluayhmcm9tLCB0bykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuICAgICAgcmV0dXJuIHRvKGZyb20oYXJncykpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCkge1xuICAgIHZhciBwYXRoID0gW2dyYXBoW3RvTW9kZWxdLnBhcmVudCwgdG9Nb2RlbF07XG4gICAgdmFyIGZuID0gY29udmVyc2lvbnNbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50XVt0b01vZGVsXTtcbiAgICB2YXIgY3VyID0gZ3JhcGhbdG9Nb2RlbF0ucGFyZW50O1xuXG4gICAgd2hpbGUgKGdyYXBoW2N1cl0ucGFyZW50KSB7XG4gICAgICBwYXRoLnVuc2hpZnQoZ3JhcGhbY3VyXS5wYXJlbnQpO1xuICAgICAgZm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG4gICAgICBjdXIgPSBncmFwaFtjdXJdLnBhcmVudDtcbiAgICB9XG5cbiAgICBmbi5jb252ZXJzaW9uID0gcGF0aDtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgcm91dGUgPSBmdW5jdGlvbiByb3V0ZShmcm9tTW9kZWwpIHtcbiAgICB2YXIgZ3JhcGggPSBkZXJpdmVCRlMoZnJvbU1vZGVsKTtcbiAgICB2YXIgY29udmVyc2lvbiA9IHt9O1xuICAgIHZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhncmFwaCk7XG5cbiAgICBmb3IgKHZhciBsZW4gPSBtb2RlbHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgdG9Nb2RlbCA9IG1vZGVsc1tpXTtcbiAgICAgIHZhciBub2RlID0gZ3JhcGhbdG9Nb2RlbF07XG5cbiAgICAgIGlmIChub2RlLnBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBubyBwb3NzaWJsZSBjb252ZXJzaW9uLCBvciB0aGlzIG5vZGUgaXMgdGhlIHNvdXJjZSBtb2RlbC5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnZlcnNpb25bdG9Nb2RlbF0gPSB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnZlcnNpb247XG4gIH07XG5cbiAgdmFyIGNvbnZlcnQgPSB7fTtcbiAgdmFyIG1vZGVscyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zKTtcblxuICBmdW5jdGlvbiB3cmFwUmF3KGZuKSB7XG4gICAgdmFyIHdyYXBwZWRGbiA9IGZ1bmN0aW9uIHdyYXBwZWRGbihhcmdzKSB7XG4gICAgICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGFyZ3MpO1xuICAgIH07IC8vIHByZXNlcnZlIC5jb252ZXJzaW9uIHByb3BlcnR5IGlmIHRoZXJlIGlzIG9uZVxuXG5cbiAgICBpZiAoJ2NvbnZlcnNpb24nIGluIGZuKSB7XG4gICAgICB3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBwZWRGbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXBSb3VuZGVkKGZuKSB7XG4gICAgdmFyIHdyYXBwZWRGbiA9IGZ1bmN0aW9uIHdyYXBwZWRGbihhcmdzKSB7XG4gICAgICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3VsdCA9IGZuKGFyZ3MpOyAvLyB3ZSdyZSBhc3N1bWluZyB0aGUgcmVzdWx0IGlzIGFuIGFycmF5IGhlcmUuXG4gICAgICAvLyBzZWUgbm90aWNlIGluIGNvbnZlcnNpb25zLmpzOyBkb24ndCB1c2UgYm94IHR5cGVzXG4gICAgICAvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAodmFyIGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICByZXN1bHRbaV0gPSBNYXRoLnJvdW5kKHJlc3VsdFtpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9OyAvLyBwcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblxuXG4gICAgaWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuICAgICAgd3JhcHBlZEZuLmNvbnZlcnNpb24gPSBmbi5jb252ZXJzaW9uO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwcGVkRm47XG4gIH1cblxuICBtb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG4gICAgY29udmVydFtmcm9tTW9kZWxdID0ge307XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2NoYW5uZWxzJywge1xuICAgICAgdmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0uY2hhbm5lbHNcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnbGFiZWxzJywge1xuICAgICAgdmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0ubGFiZWxzXG4gICAgfSk7XG4gICAgdmFyIHJvdXRlcyA9IHJvdXRlKGZyb21Nb2RlbCk7XG4gICAgdmFyIHJvdXRlTW9kZWxzID0gT2JqZWN0LmtleXMocm91dGVzKTtcbiAgICByb3V0ZU1vZGVscy5mb3JFYWNoKGZ1bmN0aW9uICh0b01vZGVsKSB7XG4gICAgICB2YXIgZm4gPSByb3V0ZXNbdG9Nb2RlbF07XG4gICAgICBjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZChmbik7XG4gICAgICBjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0ucmF3ID0gd3JhcFJhdyhmbik7XG4gICAgfSk7XG4gIH0pO1xuICB2YXIgY29sb3JDb252ZXJ0ID0gY29udmVydDtcblxuICB2YXIgYW5zaVN0eWxlcyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcblxuICAgIGNvbnN0IHdyYXBBbnNpMTYgPSAoZm4sIG9mZnNldCkgPT4gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29kZSA9IGZuLmFwcGx5KGNvbG9yQ29udmVydCwgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBcIlxceDFCW1wiLmNvbmNhdChjb2RlICsgb2Zmc2V0LCBcIm1cIik7XG4gICAgfTtcblxuICAgIGNvbnN0IHdyYXBBbnNpMjU2ID0gKGZuLCBvZmZzZXQpID0+IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBmbi5hcHBseShjb2xvckNvbnZlcnQsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gXCJcXHgxQltcIi5jb25jYXQoMzggKyBvZmZzZXQsIFwiOzU7XCIpLmNvbmNhdChjb2RlLCBcIm1cIik7XG4gICAgfTtcblxuICAgIGNvbnN0IHdyYXBBbnNpMTZtID0gKGZuLCBvZmZzZXQpID0+IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJnYiA9IGZuLmFwcGx5KGNvbG9yQ29udmVydCwgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBcIlxceDFCW1wiLmNvbmNhdCgzOCArIG9mZnNldCwgXCI7MjtcIikuY29uY2F0KHJnYlswXSwgXCI7XCIpLmNvbmNhdChyZ2JbMV0sIFwiO1wiKS5jb25jYXQocmdiWzJdLCBcIm1cIik7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFzc2VtYmxlU3R5bGVzKCkge1xuICAgICAgY29uc3QgY29kZXMgPSBuZXcgTWFwKCk7XG4gICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgIG1vZGlmaWVyOiB7XG4gICAgICAgICAgcmVzZXQ6IFswLCAwXSxcbiAgICAgICAgICAvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG4gICAgICAgICAgYm9sZDogWzEsIDIyXSxcbiAgICAgICAgICBkaW06IFsyLCAyMl0sXG4gICAgICAgICAgaXRhbGljOiBbMywgMjNdLFxuICAgICAgICAgIHVuZGVybGluZTogWzQsIDI0XSxcbiAgICAgICAgICBpbnZlcnNlOiBbNywgMjddLFxuICAgICAgICAgIGhpZGRlbjogWzgsIDI4XSxcbiAgICAgICAgICBzdHJpa2V0aHJvdWdoOiBbOSwgMjldXG4gICAgICAgIH0sXG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgYmxhY2s6IFszMCwgMzldLFxuICAgICAgICAgIHJlZDogWzMxLCAzOV0sXG4gICAgICAgICAgZ3JlZW46IFszMiwgMzldLFxuICAgICAgICAgIHllbGxvdzogWzMzLCAzOV0sXG4gICAgICAgICAgYmx1ZTogWzM0LCAzOV0sXG4gICAgICAgICAgbWFnZW50YTogWzM1LCAzOV0sXG4gICAgICAgICAgY3lhbjogWzM2LCAzOV0sXG4gICAgICAgICAgd2hpdGU6IFszNywgMzldLFxuICAgICAgICAgIGdyYXk6IFs5MCwgMzldLFxuICAgICAgICAgIC8vIEJyaWdodCBjb2xvclxuICAgICAgICAgIHJlZEJyaWdodDogWzkxLCAzOV0sXG4gICAgICAgICAgZ3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuICAgICAgICAgIHllbGxvd0JyaWdodDogWzkzLCAzOV0sXG4gICAgICAgICAgYmx1ZUJyaWdodDogWzk0LCAzOV0sXG4gICAgICAgICAgbWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG4gICAgICAgICAgY3lhbkJyaWdodDogWzk2LCAzOV0sXG4gICAgICAgICAgd2hpdGVCcmlnaHQ6IFs5NywgMzldXG4gICAgICAgIH0sXG4gICAgICAgIGJnQ29sb3I6IHtcbiAgICAgICAgICBiZ0JsYWNrOiBbNDAsIDQ5XSxcbiAgICAgICAgICBiZ1JlZDogWzQxLCA0OV0sXG4gICAgICAgICAgYmdHcmVlbjogWzQyLCA0OV0sXG4gICAgICAgICAgYmdZZWxsb3c6IFs0MywgNDldLFxuICAgICAgICAgIGJnQmx1ZTogWzQ0LCA0OV0sXG4gICAgICAgICAgYmdNYWdlbnRhOiBbNDUsIDQ5XSxcbiAgICAgICAgICBiZ0N5YW46IFs0NiwgNDldLFxuICAgICAgICAgIGJnV2hpdGU6IFs0NywgNDldLFxuICAgICAgICAgIC8vIEJyaWdodCBjb2xvclxuICAgICAgICAgIGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcbiAgICAgICAgICBiZ1JlZEJyaWdodDogWzEwMSwgNDldLFxuICAgICAgICAgIGJnR3JlZW5CcmlnaHQ6IFsxMDIsIDQ5XSxcbiAgICAgICAgICBiZ1llbGxvd0JyaWdodDogWzEwMywgNDldLFxuICAgICAgICAgIGJnQmx1ZUJyaWdodDogWzEwNCwgNDldLFxuICAgICAgICAgIGJnTWFnZW50YUJyaWdodDogWzEwNSwgNDldLFxuICAgICAgICAgIGJnQ3lhbkJyaWdodDogWzEwNiwgNDldLFxuICAgICAgICAgIGJnV2hpdGVCcmlnaHQ6IFsxMDcsIDQ5XVxuICAgICAgICB9XG4gICAgICB9OyAvLyBGaXggaHVtYW5zXG5cbiAgICAgIHN0eWxlcy5jb2xvci5ncmV5ID0gc3R5bGVzLmNvbG9yLmdyYXk7XG5cbiAgICAgIGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIE9iamVjdC5rZXlzKHN0eWxlcykpIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBzdHlsZXNbZ3JvdXBOYW1lXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN0eWxlTmFtZSBvZiBPYmplY3Qua2V5cyhncm91cCkpIHtcbiAgICAgICAgICBjb25zdCBzdHlsZSA9IGdyb3VwW3N0eWxlTmFtZV07XG4gICAgICAgICAgc3R5bGVzW3N0eWxlTmFtZV0gPSB7XG4gICAgICAgICAgICBvcGVuOiBcIlxceDFCW1wiLmNvbmNhdChzdHlsZVswXSwgXCJtXCIpLFxuICAgICAgICAgICAgY2xvc2U6IFwiXFx4MUJbXCIuY29uY2F0KHN0eWxlWzFdLCBcIm1cIilcbiAgICAgICAgICB9O1xuICAgICAgICAgIGdyb3VwW3N0eWxlTmFtZV0gPSBzdHlsZXNbc3R5bGVOYW1lXTtcbiAgICAgICAgICBjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsIGdyb3VwTmFtZSwge1xuICAgICAgICAgIHZhbHVlOiBncm91cCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcywgJ2NvZGVzJywge1xuICAgICAgICAgIHZhbHVlOiBjb2RlcyxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYW5zaTJhbnNpID0gbiA9PiBuO1xuXG4gICAgICBjb25zdCByZ2IycmdiID0gKHIsIGcsIGIpID0+IFtyLCBnLCBiXTtcblxuICAgICAgc3R5bGVzLmNvbG9yLmNsb3NlID0gJ1xcdTAwMUJbMzltJztcbiAgICAgIHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcbiAgICAgIHN0eWxlcy5jb2xvci5hbnNpID0ge1xuICAgICAgICBhbnNpOiB3cmFwQW5zaTE2KGFuc2kyYW5zaSwgMClcbiAgICAgIH07XG4gICAgICBzdHlsZXMuY29sb3IuYW5zaTI1NiA9IHtcbiAgICAgICAgYW5zaTI1Njogd3JhcEFuc2kyNTYoYW5zaTJhbnNpLCAwKVxuICAgICAgfTtcbiAgICAgIHN0eWxlcy5jb2xvci5hbnNpMTZtID0ge1xuICAgICAgICByZ2I6IHdyYXBBbnNpMTZtKHJnYjJyZ2IsIDApXG4gICAgICB9O1xuICAgICAgc3R5bGVzLmJnQ29sb3IuYW5zaSA9IHtcbiAgICAgICAgYW5zaTogd3JhcEFuc2kxNihhbnNpMmFuc2ksIDEwKVxuICAgICAgfTtcbiAgICAgIHN0eWxlcy5iZ0NvbG9yLmFuc2kyNTYgPSB7XG4gICAgICAgIGFuc2kyNTY6IHdyYXBBbnNpMjU2KGFuc2kyYW5zaSwgMTApXG4gICAgICB9O1xuICAgICAgc3R5bGVzLmJnQ29sb3IuYW5zaTE2bSA9IHtcbiAgICAgICAgcmdiOiB3cmFwQW5zaTE2bShyZ2IycmdiLCAxMClcbiAgICAgIH07XG5cbiAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhjb2xvckNvbnZlcnQpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29sb3JDb252ZXJ0W2tleV0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWl0ZSA9IGNvbG9yQ29udmVydFtrZXldO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdhbnNpMTYnKSB7XG4gICAgICAgICAga2V5ID0gJ2Fuc2knO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdhbnNpMTYnIGluIHN1aXRlKSB7XG4gICAgICAgICAgc3R5bGVzLmNvbG9yLmFuc2lba2V5XSA9IHdyYXBBbnNpMTYoc3VpdGUuYW5zaTE2LCAwKTtcbiAgICAgICAgICBzdHlsZXMuYmdDb2xvci5hbnNpW2tleV0gPSB3cmFwQW5zaTE2KHN1aXRlLmFuc2kxNiwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdhbnNpMjU2JyBpbiBzdWl0ZSkge1xuICAgICAgICAgIHN0eWxlcy5jb2xvci5hbnNpMjU2W2tleV0gPSB3cmFwQW5zaTI1NihzdWl0ZS5hbnNpMjU2LCAwKTtcbiAgICAgICAgICBzdHlsZXMuYmdDb2xvci5hbnNpMjU2W2tleV0gPSB3cmFwQW5zaTI1NihzdWl0ZS5hbnNpMjU2LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ3JnYicgaW4gc3VpdGUpIHtcbiAgICAgICAgICBzdHlsZXMuY29sb3IuYW5zaTE2bVtrZXldID0gd3JhcEFuc2kxNm0oc3VpdGUucmdiLCAwKTtcbiAgICAgICAgICBzdHlsZXMuYmdDb2xvci5hbnNpMTZtW2tleV0gPSB3cmFwQW5zaTE2bShzdWl0ZS5yZ2IsIDEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3R5bGVzO1xuICAgIH0gLy8gTWFrZSB0aGUgZXhwb3J0IGltbXV0YWJsZVxuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGFzc2VtYmxlU3R5bGVzXG4gICAgfSk7XG4gIH0pO1xuXG4gIHZhciByZXF1aXJlJCQwJDEgPSB7XG4gICAgRU9MOiBcIlxcblwiXG4gIH07XG5cbiAgdmFyIGhhc0ZsYWcgPSAoZmxhZywgYXJndikgPT4ge1xuICAgIGFyZ3YgPSBhcmd2IHx8IHByb2Nlc3MuYXJndjtcbiAgICBjb25zdCBwcmVmaXggPSBmbGFnLnN0YXJ0c1dpdGgoJy0nKSA/ICcnIDogZmxhZy5sZW5ndGggPT09IDEgPyAnLScgOiAnLS0nO1xuICAgIGNvbnN0IHBvcyA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcbiAgICBjb25zdCB0ZXJtaW5hdG9yUG9zID0gYXJndi5pbmRleE9mKCctLScpO1xuICAgIHJldHVybiBwb3MgIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zID09PSAtMSA/IHRydWUgOiBwb3MgPCB0ZXJtaW5hdG9yUG9zKTtcbiAgfTtcblxuICBjb25zdCBlbnYkMSA9IHByb2Nlc3MuZW52O1xuICBsZXQgZm9yY2VDb2xvcjtcblxuICBpZiAoaGFzRmxhZygnbm8tY29sb3InKSB8fCBoYXNGbGFnKCduby1jb2xvcnMnKSB8fCBoYXNGbGFnKCdjb2xvcj1mYWxzZScpKSB7XG4gICAgZm9yY2VDb2xvciA9IGZhbHNlO1xuICB9IGVsc2UgaWYgKGhhc0ZsYWcoJ2NvbG9yJykgfHwgaGFzRmxhZygnY29sb3JzJykgfHwgaGFzRmxhZygnY29sb3I9dHJ1ZScpIHx8IGhhc0ZsYWcoJ2NvbG9yPWFsd2F5cycpKSB7XG4gICAgZm9yY2VDb2xvciA9IHRydWU7XG4gIH1cblxuICBpZiAoJ0ZPUkNFX0NPTE9SJyBpbiBlbnYkMSkge1xuICAgIGZvcmNlQ29sb3IgPSBlbnYkMS5GT1JDRV9DT0xPUi5sZW5ndGggPT09IDAgfHwgcGFyc2VJbnQoZW52JDEuRk9SQ0VfQ09MT1IsIDEwKSAhPT0gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZUxldmVsKGxldmVsKSB7XG4gICAgaWYgKGxldmVsID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxldmVsLFxuICAgICAgaGFzQmFzaWM6IHRydWUsXG4gICAgICBoYXMyNTY6IGxldmVsID49IDIsXG4gICAgICBoYXMxNm06IGxldmVsID49IDNcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc3VwcG9ydHNDb2xvcihzdHJlYW0pIHtcbiAgICBpZiAoZm9yY2VDb2xvciA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmIChoYXNGbGFnKCdjb2xvcj0xNm0nKSB8fCBoYXNGbGFnKCdjb2xvcj1mdWxsJykgfHwgaGFzRmxhZygnY29sb3I9dHJ1ZWNvbG9yJykpIHtcbiAgICAgIHJldHVybiAzO1xuICAgIH1cblxuICAgIGlmIChoYXNGbGFnKCdjb2xvcj0yNTYnKSkge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbSAmJiAhc3RyZWFtLmlzVFRZICYmIGZvcmNlQ29sb3IgIT09IHRydWUpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbiA9IGZvcmNlQ29sb3IgPyAxIDogMDtcblxuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICAvLyBOb2RlLmpzIDcuNS4wIGlzIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIE5vZGUuanMgdG8gaW5jbHVkZSBhIHBhdGNoIHRvXG4gICAgICAvLyBsaWJ1diB0aGF0IGVuYWJsZXMgMjU2IGNvbG9yIG91dHB1dCBvbiBXaW5kb3dzLiBBbnl0aGluZyBlYXJsaWVyIGFuZCBpdFxuICAgICAgLy8gd29uJ3Qgd29yay4gSG93ZXZlciwgaGVyZSB3ZSB0YXJnZXQgTm9kZS5qcyA4IGF0IG1pbmltdW0gYXMgaXQgaXMgYW4gTFRTXG4gICAgICAvLyByZWxlYXNlLCBhbmQgTm9kZS5qcyA3IGlzIG5vdC4gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93c1xuICAgICAgLy8gcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDI1NiBjb2xvcnMuIFdpbmRvd3MgMTAgYnVpbGQgMTQ5MzEgaXMgdGhlIGZpcnN0IHJlbGVhc2VcbiAgICAgIC8vIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cbiAgICAgIGNvbnN0IG9zUmVsZWFzZSA9IHJlcXVpcmUkJDAkMS5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblxuICAgICAgaWYgKE51bWJlcihwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoJy4nKVswXSkgPj0gOCAmJiBOdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMCAmJiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxMDU4Nikge1xuICAgICAgICByZXR1cm4gTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTQ5MzEgPyAzIDogMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgaWYgKCdDSScgaW4gZW52JDEpIHtcbiAgICAgIGlmIChbJ1RSQVZJUycsICdDSVJDTEVDSScsICdBUFBWRVlPUicsICdHSVRMQUJfQ0knXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYkMSkgfHwgZW52JDEuQ0lfTkFNRSA9PT0gJ2NvZGVzaGlwJykge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG5cbiAgICBpZiAoJ1RFQU1DSVRZX1ZFUlNJT04nIGluIGVudiQxKSB7XG4gICAgICByZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52JDEuVEVBTUNJVFlfVkVSU0lPTikgPyAxIDogMDtcbiAgICB9XG5cbiAgICBpZiAoZW52JDEuQ09MT1JURVJNID09PSAndHJ1ZWNvbG9yJykge1xuICAgICAgcmV0dXJuIDM7XG4gICAgfVxuXG4gICAgaWYgKCdURVJNX1BST0dSQU0nIGluIGVudiQxKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gcGFyc2VJbnQoKGVudiQxLlRFUk1fUFJPR1JBTV9WRVJTSU9OIHx8ICcnKS5zcGxpdCgnLicpWzBdLCAxMCk7XG5cbiAgICAgIHN3aXRjaCAoZW52JDEuVEVSTV9QUk9HUkFNKSB7XG4gICAgICAgIGNhc2UgJ2lUZXJtLmFwcCc6XG4gICAgICAgICAgcmV0dXJuIHZlcnNpb24gPj0gMyA/IDMgOiAyO1xuXG4gICAgICAgIGNhc2UgJ0FwcGxlX1Rlcm1pbmFsJzpcbiAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgLy8gTm8gZGVmYXVsdFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52JDEuVEVSTSkpIHtcbiAgICAgIHJldHVybiAyO1xuICAgIH1cblxuICAgIGlmICgvXnNjcmVlbnxeeHRlcm18XnZ0MTAwfF52dDIyMHxecnh2dHxjb2xvcnxhbnNpfGN5Z3dpbnxsaW51eC9pLnRlc3QoZW52JDEuVEVSTSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmICgnQ09MT1JURVJNJyBpbiBlbnYkMSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgaWYgKGVudiQxLlRFUk0gPT09ICdkdW1iJykge1xuICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWluO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3VwcG9ydExldmVsKHN0cmVhbSkge1xuICAgIGNvbnN0IGxldmVsID0gc3VwcG9ydHNDb2xvcihzdHJlYW0pO1xuICAgIHJldHVybiB0cmFuc2xhdGVMZXZlbChsZXZlbCk7XG4gIH1cblxuICB2YXIgc3VwcG9ydHNDb2xvcl8xID0ge1xuICAgIHN1cHBvcnRzQ29sb3I6IGdldFN1cHBvcnRMZXZlbCxcbiAgICBzdGRvdXQ6IGdldFN1cHBvcnRMZXZlbChwcm9jZXNzLnN0ZG91dCksXG4gICAgc3RkZXJyOiBnZXRTdXBwb3J0TGV2ZWwocHJvY2Vzcy5zdGRlcnIpXG4gIH07XG5cbiAgY29uc3QgVEVNUExBVEVfUkVHRVggPSAvKD86XFxcXCh1W2EtZlxcZF17NH18eFthLWZcXGRdezJ9fC4pKXwoPzpcXHsofik/KFxcdysoPzpcXChbXildKlxcKSk/KD86XFwuXFx3Kyg/OlxcKFteKV0qXFwpKT8pKikoPzpbIFxcdF18KD89XFxyP1xcbikpKXwoXFx9KXwoKD86LnxbXFxyXFxuXFxmXSkrPykvZ2k7XG4gIGNvbnN0IFNUWUxFX1JFR0VYID0gLyg/Ol58XFwuKShcXHcrKSg/OlxcKChbXildKilcXCkpPy9nO1xuICBjb25zdCBTVFJJTkdfUkVHRVggPSAvXihbJ1wiXSkoKD86XFxcXC58KD8hXFwxKVteXFxcXF0pKilcXDEkLztcbiAgY29uc3QgRVNDQVBFX1JFR0VYID0gL1xcXFwodVthLWZcXGRdezR9fHhbYS1mXFxkXXsyfXwuKXwoW15cXFxcXSkvZ2k7XG4gIGNvbnN0IEVTQ0FQRVMgPSBuZXcgTWFwKFtbJ24nLCAnXFxuJ10sIFsncicsICdcXHInXSwgWyd0JywgJ1xcdCddLCBbJ2InLCAnXFxiJ10sIFsnZicsICdcXGYnXSwgWyd2JywgJ1xcdiddLCBbJzAnLCAnXFwwJ10sIFsnXFxcXCcsICdcXFxcJ10sIFsnZScsICdcXHUwMDFCJ10sIFsnYScsICdcXHUwMDA3J11dKTtcblxuICBmdW5jdGlvbiB1bmVzY2FwZShjKSB7XG4gICAgaWYgKGNbMF0gPT09ICd1JyAmJiBjLmxlbmd0aCA9PT0gNSB8fCBjWzBdID09PSAneCcgJiYgYy5sZW5ndGggPT09IDMpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGMuc2xpY2UoMSksIDE2KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEVTQ0FQRVMuZ2V0KGMpIHx8IGM7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUFyZ3VtZW50cyhuYW1lLCBhcmdzKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgIGNvbnN0IGNodW5rcyA9IGFyZ3MudHJpbSgpLnNwbGl0KC9cXHMqLFxccyovZyk7XG4gICAgbGV0IG1hdGNoZXM7XG5cbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgaWYgKCFpc05hTihjaHVuaykpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKE51bWJlcihjaHVuaykpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaGVzID0gY2h1bmsubWF0Y2goU1RSSU5HX1JFR0VYKSkge1xuICAgICAgICByZXN1bHRzLnB1c2gobWF0Y2hlc1syXS5yZXBsYWNlKEVTQ0FQRV9SRUdFWCwgKG0sIGVzY2FwZSwgY2hyKSA9PiBlc2NhcGUgPyB1bmVzY2FwZShlc2NhcGUpIDogY2hyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIENoYWxrIHRlbXBsYXRlIHN0eWxlIGFyZ3VtZW50OiBcIi5jb25jYXQoY2h1bmssIFwiIChpbiBzdHlsZSAnXCIpLmNvbmNhdChuYW1lLCBcIicpXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlU3R5bGUoc3R5bGUpIHtcbiAgICBTVFlMRV9SRUdFWC5sYXN0SW5kZXggPSAwO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICBsZXQgbWF0Y2hlcztcblxuICAgIHdoaWxlICgobWF0Y2hlcyA9IFNUWUxFX1JFR0VYLmV4ZWMoc3R5bGUpKSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbmFtZSA9IG1hdGNoZXNbMV07XG5cbiAgICAgIGlmIChtYXRjaGVzWzJdKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwYXJzZUFyZ3VtZW50cyhuYW1lLCBtYXRjaGVzWzJdKTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKFtuYW1lXS5jb25jYXQoYXJncykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKFtuYW1lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFN0eWxlKGNoYWxrLCBzdHlsZXMpIHtcbiAgICBjb25zdCBlbmFibGVkID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHN0eWxlcykge1xuICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBsYXllci5zdHlsZXMpIHtcbiAgICAgICAgZW5hYmxlZFtzdHlsZVswXV0gPSBsYXllci5pbnZlcnNlID8gbnVsbCA6IHN0eWxlLnNsaWNlKDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjdXJyZW50ID0gY2hhbGs7XG5cbiAgICBmb3IgKGNvbnN0IHN0eWxlTmFtZSBvZiBPYmplY3Qua2V5cyhlbmFibGVkKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZW5hYmxlZFtzdHlsZU5hbWVdKSkge1xuICAgICAgICBpZiAoIShzdHlsZU5hbWUgaW4gY3VycmVudCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIENoYWxrIHN0eWxlOiBcIi5jb25jYXQoc3R5bGVOYW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5hYmxlZFtzdHlsZU5hbWVdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtzdHlsZU5hbWVdLmFwcGx5KGN1cnJlbnQsIGVuYWJsZWRbc3R5bGVOYW1lXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbc3R5bGVOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgdmFyIHRlbXBsYXRlcyA9IChjaGFsaywgdG1wKSA9PiB7XG4gICAgY29uc3Qgc3R5bGVzID0gW107XG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgbGV0IGNodW5rID0gW107IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cbiAgICB0bXAucmVwbGFjZShURU1QTEFURV9SRUdFWCwgKG0sIGVzY2FwZUNoYXIsIGludmVyc2UsIHN0eWxlLCBjbG9zZSwgY2hyKSA9PiB7XG4gICAgICBpZiAoZXNjYXBlQ2hhcikge1xuICAgICAgICBjaHVuay5wdXNoKHVuZXNjYXBlKGVzY2FwZUNoYXIpKTtcbiAgICAgIH0gZWxzZSBpZiAoc3R5bGUpIHtcbiAgICAgICAgY29uc3Qgc3RyID0gY2h1bmsuam9pbignJyk7XG4gICAgICAgIGNodW5rID0gW107XG4gICAgICAgIGNodW5rcy5wdXNoKHN0eWxlcy5sZW5ndGggPT09IDAgPyBzdHIgOiBidWlsZFN0eWxlKGNoYWxrLCBzdHlsZXMpKHN0cikpO1xuICAgICAgICBzdHlsZXMucHVzaCh7XG4gICAgICAgICAgaW52ZXJzZSxcbiAgICAgICAgICBzdHlsZXM6IHBhcnNlU3R5bGUoc3R5bGUpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChjbG9zZSkge1xuICAgICAgICBpZiAoc3R5bGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgZXh0cmFuZW91cyB9IGluIENoYWxrIHRlbXBsYXRlIGxpdGVyYWwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNodW5rcy5wdXNoKGJ1aWxkU3R5bGUoY2hhbGssIHN0eWxlcykoY2h1bmsuam9pbignJykpKTtcbiAgICAgICAgY2h1bmsgPSBbXTtcbiAgICAgICAgc3R5bGVzLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2h1bmsucHVzaChjaHIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNodW5rcy5wdXNoKGNodW5rLmpvaW4oJycpKTtcblxuICAgIGlmIChzdHlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXJyTXNnID0gXCJDaGFsayB0ZW1wbGF0ZSBsaXRlcmFsIGlzIG1pc3NpbmcgXCIuY29uY2F0KHN0eWxlcy5sZW5ndGgsIFwiIGNsb3NpbmcgYnJhY2tldFwiKS5jb25jYXQoc3R5bGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnLCBcIiAoYH1gKVwiKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgIH1cblxuICAgIHJldHVybiBjaHVua3Muam9pbignJyk7XG4gIH07XG5cbiAgdmFyIGNoYWxrID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuXG4gICAgY29uc3Qgc3Rkb3V0Q29sb3IgPSBzdXBwb3J0c0NvbG9yXzEuc3Rkb3V0O1xuICAgIGNvbnN0IGlzU2ltcGxlV2luZG93c1Rlcm0gPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInICYmICEocHJvY2Vzcy5lbnYuVEVSTSB8fCAnJykudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCd4dGVybScpOyAvLyBgc3VwcG9ydHNDb2xvci5sZXZlbGAg4oaSIGBhbnNpU3R5bGVzLmNvbG9yW25hbWVdYCBtYXBwaW5nXG5cbiAgICBjb25zdCBsZXZlbE1hcHBpbmcgPSBbJ2Fuc2knLCAnYW5zaScsICdhbnNpMjU2JywgJ2Fuc2kxNm0nXTsgLy8gYGNvbG9yLWNvbnZlcnRgIG1vZGVscyB0byBleGNsdWRlIGZyb20gdGhlIENoYWxrIEFQSSBkdWUgdG8gY29uZmxpY3RzIGFuZCBzdWNoXG5cbiAgICBjb25zdCBza2lwTW9kZWxzID0gbmV3IFNldChbJ2dyYXknXSk7XG4gICAgY29uc3Qgc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIGZ1bmN0aW9uIGFwcGx5T3B0aW9ucyhvYmosIG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OyAvLyBEZXRlY3QgbGV2ZWwgaWYgbm90IHNldCBtYW51YWxseVxuXG4gICAgICBjb25zdCBzY0xldmVsID0gc3Rkb3V0Q29sb3IgPyBzdGRvdXRDb2xvci5sZXZlbCA6IDA7XG4gICAgICBvYmoubGV2ZWwgPSBvcHRpb25zLmxldmVsID09PSB1bmRlZmluZWQgPyBzY0xldmVsIDogb3B0aW9ucy5sZXZlbDtcbiAgICAgIG9iai5lbmFibGVkID0gJ2VuYWJsZWQnIGluIG9wdGlvbnMgPyBvcHRpb25zLmVuYWJsZWQgOiBvYmoubGV2ZWwgPiAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENoYWxrKG9wdGlvbnMpIHtcbiAgICAgIC8vIFdlIGNoZWNrIGZvciB0aGlzLnRlbXBsYXRlIGhlcmUgc2luY2UgY2FsbGluZyBgY2hhbGsuY29uc3RydWN0b3IoKWBcbiAgICAgIC8vIGJ5IGl0c2VsZiB3aWxsIGhhdmUgYSBgdGhpc2Agb2YgYSBwcmV2aW91c2x5IGNvbnN0cnVjdGVkIGNoYWxrIG9iamVjdFxuICAgICAgaWYgKCF0aGlzIHx8ICEodGhpcyBpbnN0YW5jZW9mIENoYWxrKSB8fCB0aGlzLnRlbXBsYXRlKSB7XG4gICAgICAgIGNvbnN0IGNoYWxrID0ge307XG4gICAgICAgIGFwcGx5T3B0aW9ucyhjaGFsaywgb3B0aW9ucyk7XG5cbiAgICAgICAgY2hhbGsudGVtcGxhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICByZXR1cm4gY2hhbGtUYWcuYXBwbHkobnVsbCwgW2NoYWxrLnRlbXBsYXRlXS5jb25jYXQoYXJncykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFsaywgQ2hhbGsucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGNoYWxrLnRlbXBsYXRlLCBjaGFsayk7XG4gICAgICAgIGNoYWxrLnRlbXBsYXRlLmNvbnN0cnVjdG9yID0gQ2hhbGs7XG4gICAgICAgIHJldHVybiBjaGFsay50ZW1wbGF0ZTtcbiAgICAgIH1cblxuICAgICAgYXBwbHlPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICAgIH0gLy8gVXNlIGJyaWdodCBibHVlIG9uIFdpbmRvd3MgYXMgdGhlIG5vcm1hbCBibHVlIGNvbG9yIGlzIGlsbGVnaWJsZVxuXG5cbiAgICBpZiAoaXNTaW1wbGVXaW5kb3dzVGVybSkge1xuICAgICAgYW5zaVN0eWxlcy5ibHVlLm9wZW4gPSAnXFx1MDAxQls5NG0nO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGFuc2lTdHlsZXMpKSB7XG4gICAgICBhbnNpU3R5bGVzW2tleV0uY2xvc2VSZSA9IG5ldyBSZWdFeHAoZXNjYXBlU3RyaW5nUmVnZXhwKGFuc2lTdHlsZXNba2V5XS5jbG9zZSksICdnJyk7XG4gICAgICBzdHlsZXNba2V5XSA9IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIGNvbnN0IGNvZGVzID0gYW5zaVN0eWxlc1trZXldO1xuICAgICAgICAgIHJldHVybiBidWlsZC5jYWxsKHRoaXMsIHRoaXMuX3N0eWxlcyA/IHRoaXMuX3N0eWxlcy5jb25jYXQoY29kZXMpIDogW2NvZGVzXSwgdGhpcy5fZW1wdHksIGtleSk7XG4gICAgICAgIH1cblxuICAgICAgfTtcbiAgICB9XG5cbiAgICBzdHlsZXMudmlzaWJsZSA9IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkLmNhbGwodGhpcywgdGhpcy5fc3R5bGVzIHx8IFtdLCB0cnVlLCAndmlzaWJsZScpO1xuICAgICAgfVxuXG4gICAgfTtcbiAgICBhbnNpU3R5bGVzLmNvbG9yLmNsb3NlUmUgPSBuZXcgUmVnRXhwKGVzY2FwZVN0cmluZ1JlZ2V4cChhbnNpU3R5bGVzLmNvbG9yLmNsb3NlKSwgJ2cnKTtcblxuICAgIGZvciAoY29uc3QgbW9kZWwgb2YgT2JqZWN0LmtleXMoYW5zaVN0eWxlcy5jb2xvci5hbnNpKSkge1xuICAgICAgaWYgKHNraXBNb2RlbHMuaGFzKG1vZGVsKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc3R5bGVzW21vZGVsXSA9IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIGNvbnN0IGxldmVsID0gdGhpcy5sZXZlbDtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgb3BlbiA9IGFuc2lTdHlsZXMuY29sb3JbbGV2ZWxNYXBwaW5nW2xldmVsXV1bbW9kZWxdLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBjb25zdCBjb2RlcyA9IHtcbiAgICAgICAgICAgICAgb3BlbixcbiAgICAgICAgICAgICAgY2xvc2U6IGFuc2lTdHlsZXMuY29sb3IuY2xvc2UsXG4gICAgICAgICAgICAgIGNsb3NlUmU6IGFuc2lTdHlsZXMuY29sb3IuY2xvc2VSZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBidWlsZC5jYWxsKHRoaXMsIHRoaXMuX3N0eWxlcyA/IHRoaXMuX3N0eWxlcy5jb25jYXQoY29kZXMpIDogW2NvZGVzXSwgdGhpcy5fZW1wdHksIG1vZGVsKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgIH07XG4gICAgfVxuXG4gICAgYW5zaVN0eWxlcy5iZ0NvbG9yLmNsb3NlUmUgPSBuZXcgUmVnRXhwKGVzY2FwZVN0cmluZ1JlZ2V4cChhbnNpU3R5bGVzLmJnQ29sb3IuY2xvc2UpLCAnZycpO1xuXG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiBPYmplY3Qua2V5cyhhbnNpU3R5bGVzLmJnQ29sb3IuYW5zaSkpIHtcbiAgICAgIGlmIChza2lwTW9kZWxzLmhhcyhtb2RlbCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJnTW9kZWwgPSAnYmcnICsgbW9kZWxbMF0udG9VcHBlckNhc2UoKSArIG1vZGVsLnNsaWNlKDEpO1xuICAgICAgc3R5bGVzW2JnTW9kZWxdID0ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgbGV2ZWwgPSB0aGlzLmxldmVsO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBvcGVuID0gYW5zaVN0eWxlcy5iZ0NvbG9yW2xldmVsTWFwcGluZ1tsZXZlbF1dW21vZGVsXS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgY29uc3QgY29kZXMgPSB7XG4gICAgICAgICAgICAgIG9wZW4sXG4gICAgICAgICAgICAgIGNsb3NlOiBhbnNpU3R5bGVzLmJnQ29sb3IuY2xvc2UsXG4gICAgICAgICAgICAgIGNsb3NlUmU6IGFuc2lTdHlsZXMuYmdDb2xvci5jbG9zZVJlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkLmNhbGwodGhpcywgdGhpcy5fc3R5bGVzID8gdGhpcy5fc3R5bGVzLmNvbmNhdChjb2RlcykgOiBbY29kZXNdLCB0aGlzLl9lbXB0eSwgbW9kZWwpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCgpID0+IHt9LCBzdHlsZXMpO1xuXG4gICAgZnVuY3Rpb24gYnVpbGQoX3N0eWxlcywgX2VtcHR5LCBrZXkpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmdW5jdGlvbiBidWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gYXBwbHlTdHlsZS5hcHBseShidWlsZGVyLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgICAgYnVpbGRlci5fc3R5bGVzID0gX3N0eWxlcztcbiAgICAgIGJ1aWxkZXIuX2VtcHR5ID0gX2VtcHR5O1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRlciwgJ2xldmVsJywge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuXG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5sZXZlbDtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQobGV2ZWwpIHtcbiAgICAgICAgICBzZWxmLmxldmVsID0gbGV2ZWw7XG4gICAgICAgIH1cblxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRlciwgJ2VuYWJsZWQnLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG5cbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBzZWxmLmVuYWJsZWQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KGVuYWJsZWQpIHtcbiAgICAgICAgICBzZWxmLmVuYWJsZWQgPSBlbmFibGVkO1xuICAgICAgICB9XG5cbiAgICAgIH0pOyAvLyBTZWUgYmVsb3cgZm9yIGZpeCByZWdhcmRpbmcgaW52aXNpYmxlIGdyZXkvZGltIGNvbWJpbmF0aW9uIG9uIFdpbmRvd3NcblxuICAgICAgYnVpbGRlci5oYXNHcmV5ID0gdGhpcy5oYXNHcmV5IHx8IGtleSA9PT0gJ2dyYXknIHx8IGtleSA9PT0gJ2dyZXknOyAvLyBgX19wcm90b19fYCBpcyB1c2VkIGJlY2F1c2Ugd2UgbXVzdCByZXR1cm4gYSBmdW5jdGlvbiwgYnV0IHRoZXJlIGlzXG4gICAgICAvLyBubyB3YXkgdG8gY3JlYXRlIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBwcm90b3R5cGVcblxuICAgICAgYnVpbGRlci5fX3Byb3RvX18gPSBwcm90bzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuXG4gICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseVN0eWxlKCkge1xuICAgICAgLy8gU3VwcG9ydCB2YXJhZ3MsIGJ1dCBzaW1wbHkgY2FzdCB0byBzdHJpbmcgaW4gY2FzZSB0aGVyZSdzIG9ubHkgb25lIGFyZ1xuICAgICAgY29uc3QgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIGNvbnN0IGFyZ3NMZW4gPSBhcmdzLmxlbmd0aDtcbiAgICAgIGxldCBzdHIgPSBTdHJpbmcoYXJndW1lbnRzWzBdKTtcblxuICAgICAgaWYgKGFyZ3NMZW4gPT09IDApIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJnc0xlbiA+IDEpIHtcbiAgICAgICAgLy8gRG9uJ3Qgc2xpY2UgYGFyZ3VtZW50c2AsIGl0IHByZXZlbnRzIFY4IG9wdGltaXphdGlvbnNcbiAgICAgICAgZm9yIChsZXQgYSA9IDE7IGEgPCBhcmdzTGVuOyBhKyspIHtcbiAgICAgICAgICBzdHIgKz0gJyAnICsgYXJnc1thXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCB0aGlzLmxldmVsIDw9IDAgfHwgIXN0cikge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW1wdHkgPyAnJyA6IHN0cjtcbiAgICAgIH0gLy8gVHVybnMgb3V0IHRoYXQgb24gV2luZG93cyBkaW1tZWQgZ3JheSB0ZXh0IGJlY29tZXMgaW52aXNpYmxlIGluIGNtZC5leGUsXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYWxrL2NoYWxrL2lzc3Vlcy81OFxuICAgICAgLy8gSWYgd2UncmUgb24gV2luZG93cyBhbmQgd2UncmUgZGVhbGluZyB3aXRoIGEgZ3JheSBjb2xvciwgdGVtcG9yYXJpbHkgbWFrZSAnZGltJyBhIG5vb3AuXG5cblxuICAgICAgY29uc3Qgb3JpZ2luYWxEaW0gPSBhbnNpU3R5bGVzLmRpbS5vcGVuO1xuXG4gICAgICBpZiAoaXNTaW1wbGVXaW5kb3dzVGVybSAmJiB0aGlzLmhhc0dyZXkpIHtcbiAgICAgICAgYW5zaVN0eWxlcy5kaW0ub3BlbiA9ICcnO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgdGhpcy5fc3R5bGVzLnNsaWNlKCkucmV2ZXJzZSgpKSB7XG4gICAgICAgIC8vIFJlcGxhY2UgYW55IGluc3RhbmNlcyBhbHJlYWR5IHByZXNlbnQgd2l0aCBhIHJlLW9wZW5pbmcgY29kZVxuICAgICAgICAvLyBvdGhlcndpc2Ugb25seSB0aGUgcGFydCBvZiB0aGUgc3RyaW5nIHVudGlsIHNhaWQgY2xvc2luZyBjb2RlXG4gICAgICAgIC8vIHdpbGwgYmUgY29sb3JlZCwgYW5kIHRoZSByZXN0IHdpbGwgc2ltcGx5IGJlICdwbGFpbicuXG4gICAgICAgIHN0ciA9IGNvZGUub3BlbiArIHN0ci5yZXBsYWNlKGNvZGUuY2xvc2VSZSwgY29kZS5vcGVuKSArIGNvZGUuY2xvc2U7IC8vIENsb3NlIHRoZSBzdHlsaW5nIGJlZm9yZSBhIGxpbmVicmVhayBhbmQgcmVvcGVuXG4gICAgICAgIC8vIGFmdGVyIG5leHQgbGluZSB0byBmaXggYSBibGVlZCBpc3N1ZSBvbiBtYWNPU1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhbGsvY2hhbGsvcHVsbC85MlxuXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHI/XFxuL2csIFwiXCIuY29uY2F0KGNvZGUuY2xvc2UsIFwiJCZcIikuY29uY2F0KGNvZGUub3BlbikpO1xuICAgICAgfSAvLyBSZXNldCB0aGUgb3JpZ2luYWwgYGRpbWAgaWYgd2UgY2hhbmdlZCBpdCB0byB3b3JrIGFyb3VuZCB0aGUgV2luZG93cyBkaW1tZWQgZ3JheSBpc3N1ZVxuXG5cbiAgICAgIGFuc2lTdHlsZXMuZGltLm9wZW4gPSBvcmlnaW5hbERpbTtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hhbGtUYWcoY2hhbGssIHN0cmluZ3MpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdHJpbmdzKSkge1xuICAgICAgICAvLyBJZiBjaGFsaygpIHdhcyBjYWxsZWQgYnkgaXRzZWxmIG9yIHdpdGggYSBzdHJpbmcsXG4gICAgICAgIC8vIHJldHVybiB0aGUgc3RyaW5nIGl0c2VsZiBhcyBhIHN0cmluZy5cbiAgICAgICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKS5qb2luKCcgJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtzdHJpbmdzLnJhd1swXV07XG5cbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXJ0cy5wdXNoKFN0cmluZyhhcmdzW2kgLSAxXSkucmVwbGFjZSgvW3t9XFxcXF0vZywgJ1xcXFwkJicpKTtcbiAgICAgICAgcGFydHMucHVzaChTdHJpbmcoc3RyaW5ncy5yYXdbaV0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRlbXBsYXRlcyhjaGFsaywgcGFydHMuam9pbignJykpO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENoYWxrLnByb3RvdHlwZSwgc3R5bGVzKTtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IENoYWxrKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuXG4gICAgbW9kdWxlLmV4cG9ydHMuc3VwcG9ydHNDb2xvciA9IHN0ZG91dENvbG9yO1xuICAgIG1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBtb2R1bGUuZXhwb3J0czsgLy8gRm9yIFR5cGVTY3JpcHRcbiAgfSk7XG4gIHZhciBjaGFsa18xID0gY2hhbGsuc3VwcG9ydHNDb2xvcjtcblxuICB2YXIgY29tbW9uID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZXhwb3J0cy5jb21tb25EZXByZWNhdGVkSGFuZGxlciA9IChrZXlPclBhaXIsIHJlZGlyZWN0VG8sIHtcbiAgICAgIGRlc2NyaXB0b3JcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlcyA9IFtcIlwiLmNvbmNhdChjaGFsay5kZWZhdWx0LnllbGxvdyh0eXBlb2Yga2V5T3JQYWlyID09PSAnc3RyaW5nJyA/IGRlc2NyaXB0b3Iua2V5KGtleU9yUGFpcikgOiBkZXNjcmlwdG9yLnBhaXIoa2V5T3JQYWlyKSksIFwiIGlzIGRlcHJlY2F0ZWRcIildO1xuXG4gICAgICBpZiAocmVkaXJlY3RUbykge1xuICAgICAgICBtZXNzYWdlcy5wdXNoKFwid2Ugbm93IHRyZWF0IGl0IGFzIFwiLmNvbmNhdChjaGFsay5kZWZhdWx0LmJsdWUodHlwZW9mIHJlZGlyZWN0VG8gPT09ICdzdHJpbmcnID8gZGVzY3JpcHRvci5rZXkocmVkaXJlY3RUbykgOiBkZXNjcmlwdG9yLnBhaXIocmVkaXJlY3RUbykpKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXNzYWdlcy5qb2luKCc7ICcpICsgJy4nO1xuICAgIH07XG4gIH0pO1xuICB1bndyYXBFeHBvcnRzKGNvbW1vbik7XG4gIHZhciBjb21tb25fMSA9IGNvbW1vbi5jb21tb25EZXByZWNhdGVkSGFuZGxlcjtcblxuICB2YXIgZGVwcmVjYXRlZCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6IHRydWVcbiAgICB9KTtcblxuICAgIHRzbGliXzEuX19leHBvcnRTdGFyKGNvbW1vbiwgZXhwb3J0cyk7XG4gIH0pO1xuICB1bndyYXBFeHBvcnRzKGRlcHJlY2F0ZWQpO1xuXG4gIHZhciBjb21tb24kMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6IHRydWVcbiAgICB9KTtcblxuICAgIGV4cG9ydHMuY29tbW9uSW52YWxpZEhhbmRsZXIgPSAoa2V5LCB2YWx1ZSwgdXRpbHMpID0+IFtcIkludmFsaWQgXCIuY29uY2F0KGNoYWxrLmRlZmF1bHQucmVkKHV0aWxzLmRlc2NyaXB0b3Iua2V5KGtleSkpLCBcIiB2YWx1ZS5cIiksIFwiRXhwZWN0ZWQgXCIuY29uY2F0KGNoYWxrLmRlZmF1bHQuYmx1ZSh1dGlscy5zY2hlbWFzW2tleV0uZXhwZWN0ZWQodXRpbHMpKSwgXCIsXCIpLCBcImJ1dCByZWNlaXZlZCBcIi5jb25jYXQoY2hhbGsuZGVmYXVsdC5yZWQodXRpbHMuZGVzY3JpcHRvci52YWx1ZSh2YWx1ZSkpLCBcIi5cIildLmpvaW4oJyAnKTtcbiAgfSk7XG4gIHVud3JhcEV4cG9ydHMoY29tbW9uJDEpO1xuICB2YXIgY29tbW9uXzEkMSA9IGNvbW1vbiQxLmNvbW1vbkludmFsaWRIYW5kbGVyO1xuXG4gIHZhciBpbnZhbGlkID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdHNsaWJfMS5fX2V4cG9ydFN0YXIoY29tbW9uJDEsIGV4cG9ydHMpO1xuICB9KTtcbiAgdW53cmFwRXhwb3J0cyhpbnZhbGlkKTtcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuXG4gIHZhciBhcnIgPSBbXTtcbiAgdmFyIGNoYXJDb2RlQ2FjaGUgPSBbXTtcblxuICB2YXIgbGV2ZW4gPSBmdW5jdGlvbiBsZXZlbihhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHZhciBzd2FwID0gYTsgLy8gU3dhcHBpbmcgdGhlIHN0cmluZ3MgaWYgYGFgIGlzIGxvbmdlciB0aGFuIGBiYCBzbyB3ZSBrbm93IHdoaWNoIG9uZSBpcyB0aGVcbiAgICAvLyBzaG9ydGVzdCAmIHdoaWNoIG9uZSBpcyB0aGUgbG9uZ2VzdFxuXG4gICAgaWYgKGEubGVuZ3RoID4gYi5sZW5ndGgpIHtcbiAgICAgIGEgPSBiO1xuICAgICAgYiA9IHN3YXA7XG4gICAgfVxuXG4gICAgdmFyIGFMZW4gPSBhLmxlbmd0aDtcbiAgICB2YXIgYkxlbiA9IGIubGVuZ3RoO1xuXG4gICAgaWYgKGFMZW4gPT09IDApIHtcbiAgICAgIHJldHVybiBiTGVuO1xuICAgIH1cblxuICAgIGlmIChiTGVuID09PSAwKSB7XG4gICAgICByZXR1cm4gYUxlbjtcbiAgICB9IC8vIFBlcmZvcm1pbmcgc3VmZml4IHRyaW1taW5nOlxuICAgIC8vIFdlIGNhbiBsaW5lYXJseSBkcm9wIHN1ZmZpeCBjb21tb24gdG8gYm90aCBzdHJpbmdzIHNpbmNlIHRoZXlcbiAgICAvLyBkb24ndCBpbmNyZWFzZSBkaXN0YW5jZSBhdCBhbGxcbiAgICAvLyBOb3RlOiBgfi1gIGlzIHRoZSBiaXR3aXNlIHdheSB0byBwZXJmb3JtIGEgYC0gMWAgb3BlcmF0aW9uXG5cblxuICAgIHdoaWxlIChhTGVuID4gMCAmJiBhLmNoYXJDb2RlQXQofi1hTGVuKSA9PT0gYi5jaGFyQ29kZUF0KH4tYkxlbikpIHtcbiAgICAgIGFMZW4tLTtcbiAgICAgIGJMZW4tLTtcbiAgICB9XG5cbiAgICBpZiAoYUxlbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJMZW47XG4gICAgfSAvLyBQZXJmb3JtaW5nIHByZWZpeCB0cmltbWluZ1xuICAgIC8vIFdlIGNhbiBsaW5lYXJseSBkcm9wIHByZWZpeCBjb21tb24gdG8gYm90aCBzdHJpbmdzIHNpbmNlIHRoZXlcbiAgICAvLyBkb24ndCBpbmNyZWFzZSBkaXN0YW5jZSBhdCBhbGxcblxuXG4gICAgdmFyIHN0YXJ0ID0gMDtcblxuICAgIHdoaWxlIChzdGFydCA8IGFMZW4gJiYgYS5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gYi5jaGFyQ29kZUF0KHN0YXJ0KSkge1xuICAgICAgc3RhcnQrKztcbiAgICB9XG5cbiAgICBhTGVuIC09IHN0YXJ0O1xuICAgIGJMZW4gLT0gc3RhcnQ7XG5cbiAgICBpZiAoYUxlbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJMZW47XG4gICAgfVxuXG4gICAgdmFyIGJDaGFyQ29kZTtcbiAgICB2YXIgcmV0O1xuICAgIHZhciB0bXA7XG4gICAgdmFyIHRtcDI7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBqID0gMDtcblxuICAgIHdoaWxlIChpIDwgYUxlbikge1xuICAgICAgY2hhckNvZGVDYWNoZVtzdGFydCArIGldID0gYS5jaGFyQ29kZUF0KHN0YXJ0ICsgaSk7XG4gICAgICBhcnJbaV0gPSArK2k7XG4gICAgfVxuXG4gICAgd2hpbGUgKGogPCBiTGVuKSB7XG4gICAgICBiQ2hhckNvZGUgPSBiLmNoYXJDb2RlQXQoc3RhcnQgKyBqKTtcbiAgICAgIHRtcCA9IGorKztcbiAgICAgIHJldCA9IGo7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBhTGVuOyBpKyspIHtcbiAgICAgICAgdG1wMiA9IGJDaGFyQ29kZSA9PT0gY2hhckNvZGVDYWNoZVtzdGFydCArIGldID8gdG1wIDogdG1wICsgMTtcbiAgICAgICAgdG1wID0gYXJyW2ldO1xuICAgICAgICByZXQgPSBhcnJbaV0gPSB0bXAgPiByZXQgPyB0bXAyID4gcmV0ID8gcmV0ICsgMSA6IHRtcDIgOiB0bXAyID4gdG1wID8gdG1wICsgMSA6IHRtcDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICB2YXIgbGV2ZW5fMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6IHRydWVcbiAgICB9KTtcblxuICAgIGV4cG9ydHMubGV2ZW5Vbmtub3duSGFuZGxlciA9IChrZXksIHZhbHVlLCB7XG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgbG9nZ2VyLFxuICAgICAgc2NoZW1hc1xuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gW1wiSWdub3JlZCB1bmtub3duIG9wdGlvbiBcIi5jb25jYXQoY2hhbGsuZGVmYXVsdC55ZWxsb3coZGVzY3JpcHRvci5wYWlyKHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZVxuICAgICAgfSkpLCBcIi5cIildO1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IE9iamVjdC5rZXlzKHNjaGVtYXMpLnNvcnQoKS5maW5kKGtub3duS2V5ID0+IGxldmVuKGtleSwga25vd25LZXkpIDwgMyk7XG5cbiAgICAgIGlmIChzdWdnZXN0aW9uKSB7XG4gICAgICAgIG1lc3NhZ2VzLnB1c2goXCJEaWQgeW91IG1lYW4gXCIuY29uY2F0KGNoYWxrLmRlZmF1bHQuYmx1ZShkZXNjcmlwdG9yLmtleShzdWdnZXN0aW9uKSksIFwiP1wiKSk7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2VzLmpvaW4oJyAnKSk7XG4gICAgfTtcbiAgfSk7XG4gIHVud3JhcEV4cG9ydHMobGV2ZW5fMSk7XG4gIHZhciBsZXZlbl8yID0gbGV2ZW5fMS5sZXZlblVua25vd25IYW5kbGVyO1xuXG4gIHZhciB1bmtub3duID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdHNsaWJfMS5fX2V4cG9ydFN0YXIobGV2ZW5fMSwgZXhwb3J0cyk7XG4gIH0pO1xuICB1bndyYXBFeHBvcnRzKHVua25vd24pO1xuXG4gIHZhciBoYW5kbGVycyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6IHRydWVcbiAgICB9KTtcblxuICAgIHRzbGliXzEuX19leHBvcnRTdGFyKGRlcHJlY2F0ZWQsIGV4cG9ydHMpO1xuXG4gICAgdHNsaWJfMS5fX2V4cG9ydFN0YXIoaW52YWxpZCwgZXhwb3J0cyk7XG5cbiAgICB0c2xpYl8xLl9fZXhwb3J0U3Rhcih1bmtub3duLCBleHBvcnRzKTtcbiAgfSk7XG4gIHVud3JhcEV4cG9ydHMoaGFuZGxlcnMpO1xuXG4gIHZhciBzY2hlbWEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgSEFORExFUl9LRVlTID0gWydkZWZhdWx0JywgJ2V4cGVjdGVkJywgJ3ZhbGlkYXRlJywgJ2RlcHJlY2F0ZWQnLCAnZm9yd2FyZCcsICdyZWRpcmVjdCcsICdvdmVybGFwJywgJ3ByZXByb2Nlc3MnLCAncG9zdHByb2Nlc3MnXTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYShTY2hlbWFDb25zdHJ1Y3RvciwgcGFyYW1ldGVycykge1xuICAgICAgY29uc3Qgc2NoZW1hID0gbmV3IFNjaGVtYUNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpO1xuICAgICAgY29uc3Qgc3ViU2NoZW1hID0gT2JqZWN0LmNyZWF0ZShzY2hlbWEpO1xuXG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXJLZXkgb2YgSEFORExFUl9LRVlTKSB7XG4gICAgICAgIGlmIChoYW5kbGVyS2V5IGluIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBzdWJTY2hlbWFbaGFuZGxlcktleV0gPSBub3JtYWxpemVIYW5kbGVyKHBhcmFtZXRlcnNbaGFuZGxlcktleV0sIHNjaGVtYSwgU2NoZW1hLnByb3RvdHlwZVtoYW5kbGVyS2V5XS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJTY2hlbWE7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5jcmVhdGVTY2hlbWEgPSBjcmVhdGVTY2hlbWE7XG5cbiAgICBjbGFzcyBTY2hlbWEge1xuICAgICAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLm5hbWUgPSBwYXJhbWV0ZXJzLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIHN0YXRpYyBjcmVhdGUocGFyYW1ldGVycykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzU4NjNcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNjaGVtYSh0aGlzLCBwYXJhbWV0ZXJzKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdChfdXRpbHMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0gLy8gaXN0YW5idWwgaWdub3JlIG5leHQ6IHRoaXMgaXMgYWN0dWFsbHkgYW4gYWJzdHJhY3QgbWV0aG9kIGJ1dCB3ZSBuZWVkIGEgcGxhY2Vob2xkZXIgdG8gZ2V0IGBmdW5jdGlvbi5sZW5ndGhgXG5cblxuICAgICAgZXhwZWN0ZWQoX3V0aWxzKSB7XG4gICAgICAgIHJldHVybiAnbm90aGluZyc7XG4gICAgICB9IC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiB0aGlzIGlzIGFjdHVhbGx5IGFuIGFic3RyYWN0IG1ldGhvZCBidXQgd2UgbmVlZCBhIHBsYWNlaG9sZGVyIHRvIGdldCBgZnVuY3Rpb24ubGVuZ3RoYFxuXG5cbiAgICAgIHZhbGlkYXRlKF92YWx1ZSwgX3V0aWxzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZGVwcmVjYXRlZChfdmFsdWUsIF91dGlscykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZvcndhcmQoX3ZhbHVlLCBfdXRpbHMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmVkaXJlY3QoX3ZhbHVlLCBfdXRpbHMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgb3ZlcmxhcChjdXJyZW50VmFsdWUsIF9uZXdWYWx1ZSwgX3V0aWxzKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHByZXByb2Nlc3ModmFsdWUsIF91dGlscykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHBvc3Rwcm9jZXNzKHZhbHVlLCBfdXRpbHMpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgZXhwb3J0cy5TY2hlbWEgPSBTY2hlbWE7XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVIYW5kbGVyKGhhbmRsZXIsIHN1cGVyU2NoZW1hLCBoYW5kbGVyQXJndW1lbnRzTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicgPyAoLi4uYXJncykgPT4gaGFuZGxlciguLi5hcmdzLnNsaWNlKDAsIGhhbmRsZXJBcmd1bWVudHNMZW5ndGggLSAxKSwgc3VwZXJTY2hlbWEsIC4uLmFyZ3Muc2xpY2UoaGFuZGxlckFyZ3VtZW50c0xlbmd0aCAtIDEpKSA6ICgpID0+IGhhbmRsZXI7XG4gICAgfVxuICB9KTtcbiAgdW53cmFwRXhwb3J0cyhzY2hlbWEpO1xuICB2YXIgc2NoZW1hXzEgPSBzY2hlbWEuY3JlYXRlU2NoZW1hO1xuICB2YXIgc2NoZW1hXzIgPSBzY2hlbWEuU2NoZW1hO1xuXG4gIHZhciBhbGlhcyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6IHRydWVcbiAgICB9KTtcblxuICAgIGNsYXNzIEFsaWFzU2NoZW1hIGV4dGVuZHMgc2NoZW1hLlNjaGVtYSB7XG4gICAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLl9zb3VyY2VOYW1lID0gcGFyYW1ldGVycy5zb3VyY2VOYW1lO1xuICAgICAgfVxuXG4gICAgICBleHBlY3RlZCh1dGlscykge1xuICAgICAgICByZXR1cm4gdXRpbHMuc2NoZW1hc1t0aGlzLl9zb3VyY2VOYW1lXS5leHBlY3RlZCh1dGlscyk7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRlKHZhbHVlLCB1dGlscykge1xuICAgICAgICByZXR1cm4gdXRpbHMuc2NoZW1hc1t0aGlzLl9zb3VyY2VOYW1lXS52YWxpZGF0ZSh2YWx1ZSwgdXRpbHMpO1xuICAgICAgfVxuXG4gICAgICByZWRpcmVjdChfdmFsdWUsIF91dGlscykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlTmFtZTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIGV4cG9ydHMuQWxpYXNTY2hlbWEgPSBBbGlhc1NjaGVtYTtcbiAgfSk7XG4gIHVud3JhcEV4cG9ydHMoYWxpYXMpO1xuICB2YXIgYWxpYXNfMSA9IGFsaWFzLkFsaWFzU2NoZW1hO1xuXG4gIHZhciBhbnkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBjbGFzcyBBbnlTY2hlbWEgZXh0ZW5kcyBzY2hlbWEuU2NoZW1hIHtcbiAgICAgIGV4cGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gJ2FueXRoaW5nJztcbiAgICAgIH1cblxuICAgICAgdmFsaWRhdGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgZXhwb3J0cy5BbnlTY2hlbWEgPSBBbnlTY2hlbWE7XG4gIH0pO1xuICB1bndyYXBFeHBvcnRzKGFueSk7XG4gIHZhciBhbnlfMSA9IGFueS5BbnlTY2hlbWE7XG5cbiAgdmFyIGFycmF5ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY2xhc3MgQXJyYXlTY2hlbWEgZXh0ZW5kcyBzY2hlbWEuU2NoZW1hIHtcbiAgICAgIGNvbnN0cnVjdG9yKF9hKSB7XG4gICAgICAgIHZhciB7XG4gICAgICAgICAgdmFsdWVTY2hlbWEsXG4gICAgICAgICAgbmFtZSA9IHZhbHVlU2NoZW1hLm5hbWVcbiAgICAgICAgfSA9IF9hLFxuICAgICAgICAgICAgaGFuZGxlcnMgPSB0c2xpYl8xLl9fcmVzdChfYSwgW1widmFsdWVTY2hlbWFcIiwgXCJuYW1lXCJdKTtcblxuICAgICAgICBzdXBlcihPYmplY3QuYXNzaWduKHt9LCBoYW5kbGVycywge1xuICAgICAgICAgIG5hbWVcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLl92YWx1ZVNjaGVtYSA9IHZhbHVlU2NoZW1hO1xuICAgICAgfVxuXG4gICAgICBleHBlY3RlZCh1dGlscykge1xuICAgICAgICByZXR1cm4gXCJhbiBhcnJheSBvZiBcIi5jb25jYXQodGhpcy5fdmFsdWVTY2hlbWEuZXhwZWN0ZWQodXRpbHMpKTtcbiAgICAgIH1cblxuICAgICAgdmFsaWRhdGUodmFsdWUsIHV0aWxzKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnZhbGlkVmFsdWVzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBzdWJWYWx1ZSBvZiB2YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHN1YlZhbGlkYXRlUmVzdWx0ID0gdXRpbHMubm9ybWFsaXplVmFsaWRhdGVSZXN1bHQodGhpcy5fdmFsdWVTY2hlbWEudmFsaWRhdGUoc3ViVmFsdWUsIHV0aWxzKSwgc3ViVmFsdWUpO1xuXG4gICAgICAgICAgaWYgKHN1YlZhbGlkYXRlUmVzdWx0ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBpbnZhbGlkVmFsdWVzLnB1c2goc3ViVmFsaWRhdGVSZXN1bHQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWVzLmxlbmd0aCA9PT0gMCA/IHRydWUgOiB7XG4gICAgICAgICAgdmFsdWU6IGludmFsaWRWYWx1ZXNcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZGVwcmVjYXRlZCh2YWx1ZSwgdXRpbHMpIHtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJlc3VsdCA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3ViVmFsdWUgb2YgdmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBzdWJEZXByZWNhdGVkUmVzdWx0ID0gdXRpbHMubm9ybWFsaXplRGVwcmVjYXRlZFJlc3VsdCh0aGlzLl92YWx1ZVNjaGVtYS5kZXByZWNhdGVkKHN1YlZhbHVlLCB1dGlscyksIHN1YlZhbHVlKTtcblxuICAgICAgICAgIGlmIChzdWJEZXByZWNhdGVkUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVwcmVjYXRlZFJlc3VsdC5wdXNoKC4uLnN1YkRlcHJlY2F0ZWRSZXN1bHQubWFwKCh7XG4gICAgICAgICAgICAgIHZhbHVlOiBkZXByZWNhdGVkVmFsdWVcbiAgICAgICAgICAgIH0pID0+ICh7XG4gICAgICAgICAgICAgIHZhbHVlOiBbZGVwcmVjYXRlZFZhbHVlXVxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVwcmVjYXRlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZm9yd2FyZCh2YWx1ZSwgdXRpbHMpIHtcbiAgICAgICAgY29uc3QgZm9yd2FyZFJlc3VsdCA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3ViVmFsdWUgb2YgdmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBzdWJGb3J3YXJkUmVzdWx0ID0gdXRpbHMubm9ybWFsaXplRm9yd2FyZFJlc3VsdCh0aGlzLl92YWx1ZVNjaGVtYS5mb3J3YXJkKHN1YlZhbHVlLCB1dGlscyksIHN1YlZhbHVlKTtcbiAgICAgICAgICBmb3J3YXJkUmVzdWx0LnB1c2goLi4uc3ViRm9yd2FyZFJlc3VsdC5tYXAod3JhcFRyYW5zZmVyUmVzdWx0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9yd2FyZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgcmVkaXJlY3QodmFsdWUsIHV0aWxzKSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbiA9IFtdO1xuICAgICAgICBjb25zdCByZWRpcmVjdCA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3ViVmFsdWUgb2YgdmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBzdWJSZWRpcmVjdFJlc3VsdCA9IHV0aWxzLm5vcm1hbGl6ZVJlZGlyZWN0UmVzdWx0KHRoaXMuX3ZhbHVlU2NoZW1hLnJlZGlyZWN0KHN1YlZhbHVlLCB1dGlscyksIHN1YlZhbHVlKTtcblxuICAgICAgICAgIGlmICgncmVtYWluJyBpbiBzdWJSZWRpcmVjdFJlc3VsdCkge1xuICAgICAgICAgICAgcmVtYWluLnB1c2goc3ViUmVkaXJlY3RSZXN1bHQucmVtYWluKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZWRpcmVjdC5wdXNoKC4uLnN1YlJlZGlyZWN0UmVzdWx0LnJlZGlyZWN0Lm1hcCh3cmFwVHJhbnNmZXJSZXN1bHQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW1haW4ubGVuZ3RoID09PSAwID8ge1xuICAgICAgICAgIHJlZGlyZWN0XG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgcmVkaXJlY3QsXG4gICAgICAgICAgcmVtYWluXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG92ZXJsYXAoY3VycmVudFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlLmNvbmNhdChuZXdWYWx1ZSk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBleHBvcnRzLkFycmF5U2NoZW1hID0gQXJyYXlTY2hlbWE7XG5cbiAgICBmdW5jdGlvbiB3cmFwVHJhbnNmZXJSZXN1bHQoe1xuICAgICAgZnJvbSxcbiAgICAgIHRvXG4gICAgfSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbTogW2Zyb21dLFxuICAgICAgICB0b1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xuICB1bndyYXBFeHBvcnRzKGFycmF5KTtcbiAgdmFyIGFycmF5XzEgPSBhcnJheS5BcnJheVNjaGVtYTtcblxuICB2YXIgYm9vbGVhbl8xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY2xhc3MgQm9vbGVhblNjaGVtYSBleHRlbmRzIHNjaGVtYS5TY2hlbWEge1xuICAgICAgZXhwZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiAndHJ1ZSBvciBmYWxzZSc7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgICAgIH1cblxuICAgIH1cblxuICAgIGV4cG9ydHMuQm9vbGVhblNjaGVtYSA9IEJvb2xlYW5TY2hlbWE7XG4gIH0pO1xuICB1bndyYXBFeHBvcnRzKGJvb2xlYW5fMSk7XG4gIHZhciBib29sZWFuXzIgPSBib29sZWFuXzEuQm9vbGVhblNjaGVtYTtcblxuICB2YXIgdXRpbHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiByZWNvcmRGcm9tQXJyYXkoYXJyYXksIG1haW5LZXkpIHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdmFsdWVbbWFpbktleV07IC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbiAgICAgICAgaWYgKHJlY29yZFtrZXldKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlIFwiLmNvbmNhdChtYWluS2V5LCBcIiBcIikuY29uY2F0KEpTT04uc3RyaW5naWZ5KGtleSkpKTtcbiAgICAgICAgfSAvLyBAdHMtaWdub3JlXG5cblxuICAgICAgICByZWNvcmRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH1cblxuICAgIGV4cG9ydHMucmVjb3JkRnJvbUFycmF5ID0gcmVjb3JkRnJvbUFycmF5O1xuXG4gICAgZnVuY3Rpb24gbWFwRnJvbUFycmF5KGFycmF5LCBtYWluS2V5KSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdmFsdWVbbWFpbktleV07IC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbiAgICAgICAgaWYgKG1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkR1cGxpY2F0ZSBcIi5jb25jYXQobWFpbktleSwgXCIgXCIpLmNvbmNhdChKU09OLnN0cmluZ2lmeShrZXkpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwO1xuICAgIH1cblxuICAgIGV4cG9ydHMubWFwRnJvbUFycmF5ID0gbWFwRnJvbUFycmF5O1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlQXV0b0NoZWNrbGlzdCgpIHtcbiAgICAgIGNvbnN0IG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICByZXR1cm4gaWQgPT4ge1xuICAgICAgICBjb25zdCBpZFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGlkKTtcblxuICAgICAgICBpZiAobWFwW2lkU3RyaW5nXSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwW2lkU3RyaW5nXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZXhwb3J0cy5jcmVhdGVBdXRvQ2hlY2tsaXN0ID0gY3JlYXRlQXV0b0NoZWNrbGlzdDtcblxuICAgIGZ1bmN0aW9uIHBhcnRpdGlvbihhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICBjb25zdCB0cnVlQXJyYXkgPSBbXTtcbiAgICAgIGNvbnN0IGZhbHNlQXJyYXkgPSBbXTtcblxuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheSkge1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICAgIHRydWVBcnJheS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYWxzZUFycmF5LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbdHJ1ZUFycmF5LCBmYWxzZUFycmF5XTtcbiAgICB9XG5cbiAgICBleHBvcnRzLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjtcblxuICAgIGZ1bmN0aW9uIGlzSW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IE1hdGguZmxvb3IodmFsdWUpO1xuICAgIH1cblxuICAgIGV4cG9ydHMuaXNJbnQgPSBpc0ludDtcblxuICAgIGZ1bmN0aW9uIGNvbXBhcmVQcmltaXRpdmUoYSwgYikge1xuICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVvZkEgPSB0eXBlb2YgYTtcbiAgICAgIGNvbnN0IHR5cGVvZkIgPSB0eXBlb2YgYjtcbiAgICAgIGNvbnN0IG9yZGVycyA9IFsndW5kZWZpbmVkJywgJ29iamVjdCcsICdib29sZWFuJywgJ251bWJlcicsICdzdHJpbmcnXTtcblxuICAgICAgaWYgKHR5cGVvZkEgIT09IHR5cGVvZkIpIHtcbiAgICAgICAgcmV0dXJuIG9yZGVycy5pbmRleE9mKHR5cGVvZkEpIC0gb3JkZXJzLmluZGV4T2YodHlwZW9mQik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2ZBICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gTnVtYmVyKGEpIC0gTnVtYmVyKGIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICAgIH1cblxuICAgIGV4cG9ydHMuY29tcGFyZVByaW1pdGl2ZSA9IGNvbXBhcmVQcmltaXRpdmU7XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVEZWZhdWx0UmVzdWx0KHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8ge30gOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5ub3JtYWxpemVEZWZhdWx0UmVzdWx0ID0gbm9ybWFsaXplRGVmYXVsdFJlc3VsdDtcblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVZhbGlkYXRlUmVzdWx0KHJlc3VsdCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHRydWUgPyB0cnVlIDogcmVzdWx0ID09PSBmYWxzZSA/IHtcbiAgICAgICAgdmFsdWVcbiAgICAgIH0gOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5ub3JtYWxpemVWYWxpZGF0ZVJlc3VsdCA9IG5vcm1hbGl6ZVZhbGlkYXRlUmVzdWx0O1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplRGVwcmVjYXRlZFJlc3VsdChyZXN1bHQsIHZhbHVlLCBkb05vdE5vcm1hbGl6ZVRydWUgPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gZmFsc2UgPyBmYWxzZSA6IHJlc3VsdCA9PT0gdHJ1ZSA/IGRvTm90Tm9ybWFsaXplVHJ1ZSA/IHRydWUgOiBbe1xuICAgICAgICB2YWx1ZVxuICAgICAgfV0gOiAndmFsdWUnIGluIHJlc3VsdCA/IFtyZXN1bHRdIDogcmVzdWx0Lmxlbmd0aCA9PT0gMCA/IGZhbHNlIDogcmVzdWx0O1xuICAgIH1cblxuICAgIGV4cG9ydHMubm9ybWFsaXplRGVwcmVjYXRlZFJlc3VsdCA9IG5vcm1hbGl6ZURlcHJlY2F0ZWRSZXN1bHQ7XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVUcmFuc2ZlclJlc3VsdChyZXN1bHQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgfHwgJ2tleScgaW4gcmVzdWx0ID8ge1xuICAgICAgICBmcm9tOiB2YWx1ZSxcbiAgICAgICAgdG86IHJlc3VsdFxuICAgICAgfSA6ICdmcm9tJyBpbiByZXN1bHQgPyB7XG4gICAgICAgIGZyb206IHJlc3VsdC5mcm9tLFxuICAgICAgICB0bzogcmVzdWx0LnRvXG4gICAgICB9IDoge1xuICAgICAgICBmcm9tOiB2YWx1ZSxcbiAgICAgICAgdG86IHJlc3VsdC50b1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBleHBvcnRzLm5vcm1hbGl6ZVRyYW5zZmVyUmVzdWx0ID0gbm9ybWFsaXplVHJhbnNmZXJSZXN1bHQ7XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVGb3J3YXJkUmVzdWx0KHJlc3VsdCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IFtdIDogQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0Lm1hcCh0cmFuc2ZlclJlc3VsdCA9PiBub3JtYWxpemVUcmFuc2ZlclJlc3VsdCh0cmFuc2ZlclJlc3VsdCwgdmFsdWUpKSA6IFtub3JtYWxpemVUcmFuc2ZlclJlc3VsdChyZXN1bHQsIHZhbHVlKV07XG4gICAgfVxuXG4gICAgZXhwb3J0cy5ub3JtYWxpemVGb3J3YXJkUmVzdWx0ID0gbm9ybWFsaXplRm9yd2FyZFJlc3VsdDtcblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVJlZGlyZWN0UmVzdWx0KHJlc3VsdCwgdmFsdWUpIHtcbiAgICAgIGNvbnN0IHJlZGlyZWN0ID0gbm9ybWFsaXplRm9yd2FyZFJlc3VsdCh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiAncmVkaXJlY3QnIGluIHJlc3VsdCA/IHJlc3VsdC5yZWRpcmVjdCA6IHJlc3VsdCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHJlZGlyZWN0Lmxlbmd0aCA9PT0gMCA/IHtcbiAgICAgICAgcmVtYWluOiB2YWx1ZSxcbiAgICAgICAgcmVkaXJlY3RcbiAgICAgIH0gOiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiAncmVtYWluJyBpbiByZXN1bHQgPyB7XG4gICAgICAgIHJlbWFpbjogcmVzdWx0LnJlbWFpbixcbiAgICAgICAgcmVkaXJlY3RcbiAgICAgIH0gOiB7XG4gICAgICAgIHJlZGlyZWN0XG4gICAgICB9O1xuICAgIH1cblxuICAgIGV4cG9ydHMubm9ybWFsaXplUmVkaXJlY3RSZXN1bHQgPSBub3JtYWxpemVSZWRpcmVjdFJlc3VsdDtcbiAgfSk7XG4gIHVud3JhcEV4cG9ydHModXRpbHMpO1xuICB2YXIgdXRpbHNfMSA9IHV0aWxzLnJlY29yZEZyb21BcnJheTtcbiAgdmFyIHV0aWxzXzIgPSB1dGlscy5tYXBGcm9tQXJyYXk7XG4gIHZhciB1dGlsc18zID0gdXRpbHMuY3JlYXRlQXV0b0NoZWNrbGlzdDtcbiAgdmFyIHV0aWxzXzQgPSB1dGlscy5wYXJ0aXRpb247XG4gIHZhciB1dGlsc181ID0gdXRpbHMuaXNJbnQ7XG4gIHZhciB1dGlsc182ID0gdXRpbHMuY29tcGFyZVByaW1pdGl2ZTtcbiAgdmFyIHV0aWxzXzcgPSB1dGlscy5ub3JtYWxpemVEZWZhdWx0UmVzdWx0O1xuICB2YXIgdXRpbHNfOCA9IHV0aWxzLm5vcm1hbGl6ZVZhbGlkYXRlUmVzdWx0O1xuICB2YXIgdXRpbHNfOSA9IHV0aWxzLm5vcm1hbGl6ZURlcHJlY2F0ZWRSZXN1bHQ7XG4gIHZhciB1dGlsc18xMCA9IHV0aWxzLm5vcm1hbGl6ZVRyYW5zZmVyUmVzdWx0O1xuICB2YXIgdXRpbHNfMTEgPSB1dGlscy5ub3JtYWxpemVGb3J3YXJkUmVzdWx0O1xuICB2YXIgdXRpbHNfMTIgPSB1dGlscy5ub3JtYWxpemVSZWRpcmVjdFJlc3VsdDtcblxuICB2YXIgY2hvaWNlID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY2xhc3MgQ2hvaWNlU2NoZW1hIGV4dGVuZHMgc2NoZW1hLlNjaGVtYSB7XG4gICAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLl9jaG9pY2VzID0gdXRpbHMubWFwRnJvbUFycmF5KHBhcmFtZXRlcnMuY2hvaWNlcy5tYXAoY2hvaWNlID0+IGNob2ljZSAmJiB0eXBlb2YgY2hvaWNlID09PSAnb2JqZWN0JyA/IGNob2ljZSA6IHtcbiAgICAgICAgICB2YWx1ZTogY2hvaWNlXG4gICAgICAgIH0pLCAndmFsdWUnKTtcbiAgICAgIH1cblxuICAgICAgZXhwZWN0ZWQoe1xuICAgICAgICBkZXNjcmlwdG9yXG4gICAgICB9KSB7XG4gICAgICAgIGNvbnN0IGNob2ljZVZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5fY2hvaWNlcy5rZXlzKCkpLm1hcCh2YWx1ZSA9PiB0aGlzLl9jaG9pY2VzLmdldCh2YWx1ZSkpLmZpbHRlcihjaG9pY2VJbmZvID0+ICFjaG9pY2VJbmZvLmRlcHJlY2F0ZWQpLm1hcChjaG9pY2VJbmZvID0+IGNob2ljZUluZm8udmFsdWUpLnNvcnQodXRpbHMuY29tcGFyZVByaW1pdGl2ZSkubWFwKGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgICBjb25zdCBoZWFkID0gY2hvaWNlVmFsdWVzLnNsaWNlKDAsIC0yKTtcbiAgICAgICAgY29uc3QgdGFpbCA9IGNob2ljZVZhbHVlcy5zbGljZSgtMik7XG4gICAgICAgIHJldHVybiBoZWFkLmNvbmNhdCh0YWlsLmpvaW4oJyBvciAnKSkuam9pbignLCAnKTtcbiAgICAgIH1cblxuICAgICAgdmFsaWRhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nob2ljZXMuaGFzKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZGVwcmVjYXRlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjaG9pY2VJbmZvID0gdGhpcy5fY2hvaWNlcy5nZXQodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBjaG9pY2VJbmZvICYmIGNob2ljZUluZm8uZGVwcmVjYXRlZCA/IHtcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9IDogZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZvcndhcmQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2hvaWNlSW5mbyA9IHRoaXMuX2Nob2ljZXMuZ2V0KHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gY2hvaWNlSW5mbyA/IGNob2ljZUluZm8uZm9yd2FyZCA6IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmVkaXJlY3QodmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2hvaWNlSW5mbyA9IHRoaXMuX2Nob2ljZXMuZ2V0KHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gY2hvaWNlSW5mbyA/IGNob2ljZUluZm8ucmVkaXJlY3QgOiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBleHBvcnRzLkNob2ljZVNjaGVtYSA9IENob2ljZVNjaGVtYTtcbiAgfSk7XG4gIHVud3JhcEV4cG9ydHMoY2hvaWNlKTtcbiAgdmFyIGNob2ljZV8xID0gY2hvaWNlLkNob2ljZVNjaGVtYTtcblxuICB2YXIgbnVtYmVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY2xhc3MgTnVtYmVyU2NoZW1hIGV4dGVuZHMgc2NoZW1hLlNjaGVtYSB7XG4gICAgICBleHBlY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuICdhIG51bWJlcic7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRlKHZhbHVlLCBfdXRpbHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBleHBvcnRzLk51bWJlclNjaGVtYSA9IE51bWJlclNjaGVtYTtcbiAgfSk7XG4gIHVud3JhcEV4cG9ydHMobnVtYmVyKTtcbiAgdmFyIG51bWJlcl8xID0gbnVtYmVyLk51bWJlclNjaGVtYTtcblxuICB2YXIgaW50ZWdlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6IHRydWVcbiAgICB9KTtcblxuICAgIGNsYXNzIEludGVnZXJTY2hlbWEgZXh0ZW5kcyBudW1iZXIuTnVtYmVyU2NoZW1hIHtcbiAgICAgIGV4cGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gJ2FuIGludGVnZXInO1xuICAgICAgfVxuXG4gICAgICB2YWxpZGF0ZSh2YWx1ZSwgdXRpbHMkMSkge1xuICAgICAgICByZXR1cm4gdXRpbHMkMS5ub3JtYWxpemVWYWxpZGF0ZVJlc3VsdChzdXBlci52YWxpZGF0ZSh2YWx1ZSwgdXRpbHMkMSksIHZhbHVlKSA9PT0gdHJ1ZSAmJiB1dGlscy5pc0ludCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBleHBvcnRzLkludGVnZXJTY2hlbWEgPSBJbnRlZ2VyU2NoZW1hO1xuICB9KTtcbiAgdW53cmFwRXhwb3J0cyhpbnRlZ2VyKTtcbiAgdmFyIGludGVnZXJfMSA9IGludGVnZXIuSW50ZWdlclNjaGVtYTtcblxuICB2YXIgc3RyaW5nID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY2xhc3MgU3RyaW5nU2NoZW1hIGV4dGVuZHMgc2NoZW1hLlNjaGVtYSB7XG4gICAgICBleHBlY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuICdhIHN0cmluZyc7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgZXhwb3J0cy5TdHJpbmdTY2hlbWEgPSBTdHJpbmdTY2hlbWE7XG4gIH0pO1xuICB1bndyYXBFeHBvcnRzKHN0cmluZyk7XG4gIHZhciBzdHJpbmdfMSA9IHN0cmluZy5TdHJpbmdTY2hlbWE7XG5cbiAgdmFyIHNjaGVtYXMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlXG4gICAgfSk7XG5cbiAgICB0c2xpYl8xLl9fZXhwb3J0U3RhcihhbGlhcywgZXhwb3J0cyk7XG5cbiAgICB0c2xpYl8xLl9fZXhwb3J0U3RhcihhbnksIGV4cG9ydHMpO1xuXG4gICAgdHNsaWJfMS5fX2V4cG9ydFN0YXIoYXJyYXksIGV4cG9ydHMpO1xuXG4gICAgdHNsaWJfMS5fX2V4cG9ydFN0YXIoYm9vbGVhbl8xLCBleHBvcnRzKTtcblxuICAgIHRzbGliXzEuX19leHBvcnRTdGFyKGNob2ljZSwgZXhwb3J0cyk7XG5cbiAgICB0c2xpYl8xLl9fZXhwb3J0U3RhcihpbnRlZ2VyLCBleHBvcnRzKTtcblxuICAgIHRzbGliXzEuX19leHBvcnRTdGFyKG51bWJlciwgZXhwb3J0cyk7XG5cbiAgICB0c2xpYl8xLl9fZXhwb3J0U3RhcihzdHJpbmcsIGV4cG9ydHMpO1xuICB9KTtcbiAgdW53cmFwRXhwb3J0cyhzY2hlbWFzKTtcblxuICB2YXIgZGVmYXVsdHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlXG4gICAgfSk7XG4gICAgZXhwb3J0cy5kZWZhdWx0RGVzY3JpcHRvciA9IGFwaS5hcGlEZXNjcmlwdG9yO1xuICAgIGV4cG9ydHMuZGVmYXVsdFVua25vd25IYW5kbGVyID0gbGV2ZW5fMS5sZXZlblVua25vd25IYW5kbGVyO1xuICAgIGV4cG9ydHMuZGVmYXVsdEludmFsaWRIYW5kbGVyID0gaW52YWxpZC5jb21tb25JbnZhbGlkSGFuZGxlcjtcbiAgICBleHBvcnRzLmRlZmF1bHREZXByZWNhdGVkSGFuZGxlciA9IGNvbW1vbi5jb21tb25EZXByZWNhdGVkSGFuZGxlcjtcbiAgfSk7XG4gIHVud3JhcEV4cG9ydHMoZGVmYXVsdHMpO1xuICB2YXIgZGVmYXVsdHNfMSA9IGRlZmF1bHRzLmRlZmF1bHREZXNjcmlwdG9yO1xuICB2YXIgZGVmYXVsdHNfMiA9IGRlZmF1bHRzLmRlZmF1bHRVbmtub3duSGFuZGxlcjtcbiAgdmFyIGRlZmF1bHRzXzMgPSBkZWZhdWx0cy5kZWZhdWx0SW52YWxpZEhhbmRsZXI7XG4gIHZhciBkZWZhdWx0c180ID0gZGVmYXVsdHMuZGVmYXVsdERlcHJlY2F0ZWRIYW5kbGVyO1xuXG4gIHZhciBub3JtYWxpemUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBleHBvcnRzLm5vcm1hbGl6ZSA9IChvcHRpb25zLCBzY2hlbWFzLCBvcHRzKSA9PiBuZXcgTm9ybWFsaXplcihzY2hlbWFzLCBvcHRzKS5ub3JtYWxpemUob3B0aW9ucyk7XG5cbiAgICBjbGFzcyBOb3JtYWxpemVyIHtcbiAgICAgIGNvbnN0cnVjdG9yKHNjaGVtYXMsIG9wdHMpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGxvZ2dlciA9IGNvbnNvbGUsXG4gICAgICAgICAgZGVzY3JpcHRvciA9IGRlZmF1bHRzLmRlZmF1bHREZXNjcmlwdG9yLFxuICAgICAgICAgIHVua25vd24gPSBkZWZhdWx0cy5kZWZhdWx0VW5rbm93bkhhbmRsZXIsXG4gICAgICAgICAgaW52YWxpZCA9IGRlZmF1bHRzLmRlZmF1bHRJbnZhbGlkSGFuZGxlcixcbiAgICAgICAgICBkZXByZWNhdGVkID0gZGVmYXVsdHMuZGVmYXVsdERlcHJlY2F0ZWRIYW5kbGVyXG4gICAgICAgIH0gPSBvcHRzIHx8IHt9O1xuICAgICAgICB0aGlzLl91dGlscyA9IHtcbiAgICAgICAgICBkZXNjcmlwdG9yLFxuICAgICAgICAgIGxvZ2dlcjpcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIGxvZ2dlciB8fCB7XG4gICAgICAgICAgICB3YXJuOiAoKSA9PiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2NoZW1hczogdXRpbHMucmVjb3JkRnJvbUFycmF5KHNjaGVtYXMsICduYW1lJyksXG4gICAgICAgICAgbm9ybWFsaXplRGVmYXVsdFJlc3VsdDogdXRpbHMubm9ybWFsaXplRGVmYXVsdFJlc3VsdCxcbiAgICAgICAgICBub3JtYWxpemVEZXByZWNhdGVkUmVzdWx0OiB1dGlscy5ub3JtYWxpemVEZXByZWNhdGVkUmVzdWx0LFxuICAgICAgICAgIG5vcm1hbGl6ZUZvcndhcmRSZXN1bHQ6IHV0aWxzLm5vcm1hbGl6ZUZvcndhcmRSZXN1bHQsXG4gICAgICAgICAgbm9ybWFsaXplUmVkaXJlY3RSZXN1bHQ6IHV0aWxzLm5vcm1hbGl6ZVJlZGlyZWN0UmVzdWx0LFxuICAgICAgICAgIG5vcm1hbGl6ZVZhbGlkYXRlUmVzdWx0OiB1dGlscy5ub3JtYWxpemVWYWxpZGF0ZVJlc3VsdFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl91bmtub3duSGFuZGxlciA9IHVua25vd247XG4gICAgICAgIHRoaXMuX2ludmFsaWRIYW5kbGVyID0gaW52YWxpZDtcbiAgICAgICAgdGhpcy5fZGVwcmVjYXRlZEhhbmRsZXIgPSBkZXByZWNhdGVkO1xuICAgICAgICB0aGlzLmNsZWFuSGlzdG9yeSgpO1xuICAgICAgfVxuXG4gICAgICBjbGVhbkhpc3RvcnkoKSB7XG4gICAgICAgIHRoaXMuX2hhc0RlcHJlY2F0aW9uV2FybmVkID0gdXRpbHMuY3JlYXRlQXV0b0NoZWNrbGlzdCgpO1xuICAgICAgfVxuXG4gICAgICBub3JtYWxpemUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkID0ge307XG4gICAgICAgIGNvbnN0IHJlc3RPcHRpb25zQXJyYXkgPSBbb3B0aW9uc107XG5cbiAgICAgICAgY29uc3QgYXBwbHlOb3JtYWxpemF0aW9uID0gKCkgPT4ge1xuICAgICAgICAgIHdoaWxlIChyZXN0T3B0aW9uc0FycmF5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE9wdGlvbnMgPSByZXN0T3B0aW9uc0FycmF5LnNoaWZ0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVycmVkT3B0aW9uc0FycmF5ID0gdGhpcy5fYXBwbHlOb3JtYWxpemF0aW9uKGN1cnJlbnRPcHRpb25zLCBub3JtYWxpemVkKTtcblxuICAgICAgICAgICAgcmVzdE9wdGlvbnNBcnJheS5wdXNoKC4uLnRyYW5zZmVycmVkT3B0aW9uc0FycmF5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgYXBwbHlOb3JtYWxpemF0aW9uKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5fdXRpbHMuc2NoZW1hcykpIHtcbiAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLl91dGlscy5zY2hlbWFzW2tleV07XG5cbiAgICAgICAgICBpZiAoIShrZXkgaW4gbm9ybWFsaXplZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRSZXN1bHQgPSB1dGlscy5ub3JtYWxpemVEZWZhdWx0UmVzdWx0KHNjaGVtYS5kZWZhdWx0KHRoaXMuX3V0aWxzKSk7XG5cbiAgICAgICAgICAgIGlmICgndmFsdWUnIGluIGRlZmF1bHRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmVzdE9wdGlvbnNBcnJheS5wdXNoKHtcbiAgICAgICAgICAgICAgICBba2V5XTogZGVmYXVsdFJlc3VsdC52YWx1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhcHBseU5vcm1hbGl6YXRpb24oKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLl91dGlscy5zY2hlbWFzKSkge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuX3V0aWxzLnNjaGVtYXNba2V5XTtcblxuICAgICAgICAgIGlmIChrZXkgaW4gbm9ybWFsaXplZCkge1xuICAgICAgICAgICAgbm9ybWFsaXplZFtrZXldID0gc2NoZW1hLnBvc3Rwcm9jZXNzKG5vcm1hbGl6ZWRba2V5XSwgdGhpcy5fdXRpbHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgICAgfVxuXG4gICAgICBfYXBwbHlOb3JtYWxpemF0aW9uKG9wdGlvbnMsIG5vcm1hbGl6ZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJyZWRPcHRpb25zQXJyYXkgPSBbXTtcbiAgICAgICAgY29uc3QgW2tub3duT3B0aW9uTmFtZXMsIHVua25vd25PcHRpb25OYW1lc10gPSB1dGlscy5wYXJ0aXRpb24oT2JqZWN0LmtleXMob3B0aW9ucyksIGtleSA9PiBrZXkgaW4gdGhpcy5fdXRpbHMuc2NoZW1hcyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga25vd25PcHRpb25OYW1lcykge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuX3V0aWxzLnNjaGVtYXNba2V5XTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNjaGVtYS5wcmVwcm9jZXNzKG9wdGlvbnNba2V5XSwgdGhpcy5fdXRpbHMpO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRlUmVzdWx0ID0gdXRpbHMubm9ybWFsaXplVmFsaWRhdGVSZXN1bHQoc2NoZW1hLnZhbGlkYXRlKHZhbHVlLCB0aGlzLl91dGlscyksIHZhbHVlKTtcblxuICAgICAgICAgIGlmICh2YWxpZGF0ZVJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICB2YWx1ZTogaW52YWxpZFZhbHVlXG4gICAgICAgICAgICB9ID0gdmFsaWRhdGVSZXN1bHQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZU9yRXJyb3IgPSB0aGlzLl9pbnZhbGlkSGFuZGxlcihrZXksIGludmFsaWRWYWx1ZSwgdGhpcy5fdXRpbHMpO1xuXG4gICAgICAgICAgICB0aHJvdyB0eXBlb2YgZXJyb3JNZXNzYWdlT3JFcnJvciA9PT0gJ3N0cmluZycgPyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlT3JFcnJvcikgOlxuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQqL1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlT3JFcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhcHBlbmRUcmFuc2ZlcnJlZE9wdGlvbnMgPSAoe1xuICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgIHRvXG4gICAgICAgICAgfSkgPT4ge1xuICAgICAgICAgICAgdHJhbnNmZXJyZWRPcHRpb25zQXJyYXkucHVzaCh0eXBlb2YgdG8gPT09ICdzdHJpbmcnID8ge1xuICAgICAgICAgICAgICBbdG9dOiBmcm9tXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICBbdG8ua2V5XTogdG8udmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCB3YXJuRGVwcmVjYXRlZCA9ICh7XG4gICAgICAgICAgICB2YWx1ZTogY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgcmVkaXJlY3RUb1xuICAgICAgICAgIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSZXN1bHQgPSB1dGlscy5ub3JtYWxpemVEZXByZWNhdGVkUmVzdWx0KHNjaGVtYS5kZXByZWNhdGVkKGN1cnJlbnRWYWx1ZSwgdGhpcy5fdXRpbHMpLCB2YWx1ZSxcbiAgICAgICAgICAgIC8qIGRvTm90Tm9ybWFsaXplVHJ1ZSAqL1xuICAgICAgICAgICAgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmIChkZXByZWNhdGVkUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZXByZWNhdGVkUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5faGFzRGVwcmVjYXRpb25XYXJuZWQoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3V0aWxzLmxvZ2dlci53YXJuKHRoaXMuX2RlcHJlY2F0ZWRIYW5kbGVyKGtleSwgcmVkaXJlY3RUbywgdGhpcy5fdXRpbHMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGRlcHJlY2F0ZWRWYWx1ZVxuICAgICAgICAgICAgICB9IG9mIGRlcHJlY2F0ZWRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0ge1xuICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IGRlcHJlY2F0ZWRWYWx1ZVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2hhc0RlcHJlY2F0aW9uV2FybmVkKHBhaXIpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZWRpcmVjdFRvUGFpciA9IHR5cGVvZiByZWRpcmVjdFRvID09PSAnc3RyaW5nJyA/IHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiByZWRpcmVjdFRvLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGVwcmVjYXRlZFZhbHVlXG4gICAgICAgICAgICAgICAgICB9IDogcmVkaXJlY3RUbztcblxuICAgICAgICAgICAgICAgICAgdGhpcy5fdXRpbHMubG9nZ2VyLndhcm4odGhpcy5fZGVwcmVjYXRlZEhhbmRsZXIocGFpciwgcmVkaXJlY3RUb1BhaXIsIHRoaXMuX3V0aWxzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGZvcndhcmRSZXN1bHQgPSB1dGlscy5ub3JtYWxpemVGb3J3YXJkUmVzdWx0KHNjaGVtYS5mb3J3YXJkKHZhbHVlLCB0aGlzLl91dGlscyksIHZhbHVlKTtcbiAgICAgICAgICBmb3J3YXJkUmVzdWx0LmZvckVhY2goYXBwZW5kVHJhbnNmZXJyZWRPcHRpb25zKTtcbiAgICAgICAgICBjb25zdCByZWRpcmVjdFJlc3VsdCA9IHV0aWxzLm5vcm1hbGl6ZVJlZGlyZWN0UmVzdWx0KHNjaGVtYS5yZWRpcmVjdCh2YWx1ZSwgdGhpcy5fdXRpbHMpLCB2YWx1ZSk7XG4gICAgICAgICAgcmVkaXJlY3RSZXN1bHQucmVkaXJlY3QuZm9yRWFjaChhcHBlbmRUcmFuc2ZlcnJlZE9wdGlvbnMpO1xuXG4gICAgICAgICAgaWYgKCdyZW1haW4nIGluIHJlZGlyZWN0UmVzdWx0KSB7XG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmdWYWx1ZSA9IHJlZGlyZWN0UmVzdWx0LnJlbWFpbjtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGtleSBpbiBub3JtYWxpemVkID8gc2NoZW1hLm92ZXJsYXAobm9ybWFsaXplZFtrZXldLCByZW1haW5pbmdWYWx1ZSwgdGhpcy5fdXRpbHMpIDogcmVtYWluaW5nVmFsdWU7XG4gICAgICAgICAgICB3YXJuRGVwcmVjYXRlZCh7XG4gICAgICAgICAgICAgIHZhbHVlOiByZW1haW5pbmdWYWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG9cbiAgICAgICAgICB9IG9mIHJlZGlyZWN0UmVzdWx0LnJlZGlyZWN0KSB7XG4gICAgICAgICAgICB3YXJuRGVwcmVjYXRlZCh7XG4gICAgICAgICAgICAgIHZhbHVlOiBmcm9tLFxuICAgICAgICAgICAgICByZWRpcmVjdFRvOiB0b1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdW5rbm93bk9wdGlvbk5hbWVzKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW2tleV07XG5cbiAgICAgICAgICBjb25zdCB1bmtub3duUmVzdWx0ID0gdGhpcy5fdW5rbm93bkhhbmRsZXIoa2V5LCB2YWx1ZSwgdGhpcy5fdXRpbHMpO1xuXG4gICAgICAgICAgaWYgKHVua25vd25SZXN1bHQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdW5rbm93bktleSBvZiBPYmplY3Qua2V5cyh1bmtub3duUmVzdWx0KSkge1xuICAgICAgICAgICAgICBjb25zdCB1bmtub3duT3B0aW9uID0ge1xuICAgICAgICAgICAgICAgIFt1bmtub3duS2V5XTogdW5rbm93blJlc3VsdFt1bmtub3duS2V5XVxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGlmICh1bmtub3duS2V5IGluIHRoaXMuX3V0aWxzLnNjaGVtYXMpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZE9wdGlvbnNBcnJheS5wdXNoKHVua25vd25PcHRpb24pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obm9ybWFsaXplZCwgdW5rbm93bk9wdGlvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhbnNmZXJyZWRPcHRpb25zQXJyYXk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBleHBvcnRzLk5vcm1hbGl6ZXIgPSBOb3JtYWxpemVyO1xuICB9KTtcbiAgdW53cmFwRXhwb3J0cyhub3JtYWxpemUpO1xuICB2YXIgbm9ybWFsaXplXzEgPSBub3JtYWxpemUubm9ybWFsaXplO1xuICB2YXIgbm9ybWFsaXplXzIgPSBub3JtYWxpemUuTm9ybWFsaXplcjtcblxuICB2YXIgbGliID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdHNsaWJfMS5fX2V4cG9ydFN0YXIoZGVzY3JpcHRvcnMsIGV4cG9ydHMpO1xuXG4gICAgdHNsaWJfMS5fX2V4cG9ydFN0YXIoaGFuZGxlcnMsIGV4cG9ydHMpO1xuXG4gICAgdHNsaWJfMS5fX2V4cG9ydFN0YXIoc2NoZW1hcywgZXhwb3J0cyk7XG5cbiAgICB0c2xpYl8xLl9fZXhwb3J0U3Rhcihub3JtYWxpemUsIGV4cG9ydHMpO1xuXG4gICAgdHNsaWJfMS5fX2V4cG9ydFN0YXIoc2NoZW1hLCBleHBvcnRzKTtcbiAgfSk7XG4gIHVud3JhcEV4cG9ydHMobGliKTtcblxuICBjb25zdCBhcnJheSQxID0gW107XG4gIGNvbnN0IGNoYXJDb2RlQ2FjaGUkMSA9IFtdO1xuXG4gIGNvbnN0IGxldmVuJDEgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHN3YXAgPSBsZWZ0OyAvLyBTd2FwcGluZyB0aGUgc3RyaW5ncyBpZiBgYWAgaXMgbG9uZ2VyIHRoYW4gYGJgIHNvIHdlIGtub3cgd2hpY2ggb25lIGlzIHRoZVxuICAgIC8vIHNob3J0ZXN0ICYgd2hpY2ggb25lIGlzIHRoZSBsb25nZXN0XG5cbiAgICBpZiAobGVmdC5sZW5ndGggPiByaWdodC5sZW5ndGgpIHtcbiAgICAgIGxlZnQgPSByaWdodDtcbiAgICAgIHJpZ2h0ID0gc3dhcDtcbiAgICB9XG5cbiAgICBsZXQgbGVmdExlbmd0aCA9IGxlZnQubGVuZ3RoO1xuICAgIGxldCByaWdodExlbmd0aCA9IHJpZ2h0Lmxlbmd0aDsgLy8gUGVyZm9ybWluZyBzdWZmaXggdHJpbW1pbmc6XG4gICAgLy8gV2UgY2FuIGxpbmVhcmx5IGRyb3Agc3VmZml4IGNvbW1vbiB0byBib3RoIHN0cmluZ3Mgc2luY2UgdGhleVxuICAgIC8vIGRvbid0IGluY3JlYXNlIGRpc3RhbmNlIGF0IGFsbFxuICAgIC8vIE5vdGU6IGB+LWAgaXMgdGhlIGJpdHdpc2Ugd2F5IHRvIHBlcmZvcm0gYSBgLSAxYCBvcGVyYXRpb25cblxuICAgIHdoaWxlIChsZWZ0TGVuZ3RoID4gMCAmJiBsZWZ0LmNoYXJDb2RlQXQofi1sZWZ0TGVuZ3RoKSA9PT0gcmlnaHQuY2hhckNvZGVBdCh+LXJpZ2h0TGVuZ3RoKSkge1xuICAgICAgbGVmdExlbmd0aC0tO1xuICAgICAgcmlnaHRMZW5ndGgtLTtcbiAgICB9IC8vIFBlcmZvcm1pbmcgcHJlZml4IHRyaW1taW5nXG4gICAgLy8gV2UgY2FuIGxpbmVhcmx5IGRyb3AgcHJlZml4IGNvbW1vbiB0byBib3RoIHN0cmluZ3Mgc2luY2UgdGhleVxuICAgIC8vIGRvbid0IGluY3JlYXNlIGRpc3RhbmNlIGF0IGFsbFxuXG5cbiAgICBsZXQgc3RhcnQgPSAwO1xuXG4gICAgd2hpbGUgKHN0YXJ0IDwgbGVmdExlbmd0aCAmJiBsZWZ0LmNoYXJDb2RlQXQoc3RhcnQpID09PSByaWdodC5jaGFyQ29kZUF0KHN0YXJ0KSkge1xuICAgICAgc3RhcnQrKztcbiAgICB9XG5cbiAgICBsZWZ0TGVuZ3RoIC09IHN0YXJ0O1xuICAgIHJpZ2h0TGVuZ3RoIC09IHN0YXJ0O1xuXG4gICAgaWYgKGxlZnRMZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiByaWdodExlbmd0aDtcbiAgICB9XG5cbiAgICBsZXQgYkNoYXJDb2RlO1xuICAgIGxldCByZXN1bHQ7XG4gICAgbGV0IHRlbXA7XG4gICAgbGV0IHRlbXAyO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgaiA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGxlZnRMZW5ndGgpIHtcbiAgICAgIGNoYXJDb2RlQ2FjaGUkMVtpXSA9IGxlZnQuY2hhckNvZGVBdChzdGFydCArIGkpO1xuICAgICAgYXJyYXkkMVtpXSA9ICsraTtcbiAgICB9XG5cbiAgICB3aGlsZSAoaiA8IHJpZ2h0TGVuZ3RoKSB7XG4gICAgICBiQ2hhckNvZGUgPSByaWdodC5jaGFyQ29kZUF0KHN0YXJ0ICsgaik7XG4gICAgICB0ZW1wID0gaisrO1xuICAgICAgcmVzdWx0ID0gajtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGxlZnRMZW5ndGg7IGkrKykge1xuICAgICAgICB0ZW1wMiA9IGJDaGFyQ29kZSA9PT0gY2hhckNvZGVDYWNoZSQxW2ldID8gdGVtcCA6IHRlbXAgKyAxO1xuICAgICAgICB0ZW1wID0gYXJyYXkkMVtpXTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW11bHRpLWFzc2lnblxuXG4gICAgICAgIHJlc3VsdCA9IGFycmF5JDFbaV0gPSB0ZW1wID4gcmVzdWx0ID8gdGVtcDIgPiByZXN1bHQgPyByZXN1bHQgKyAxIDogdGVtcDIgOiB0ZW1wMiA+IHRlbXAgPyB0ZW1wICsgMSA6IHRlbXAyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIGxldmVuXzEkMSA9IGxldmVuJDE7IC8vIFRPRE86IFJlbW92ZSB0aGlzIGZvciB0aGUgbmV4dCBtYWpvciByZWxlYXNlXG5cbiAgdmFyIGRlZmF1bHRfMSA9IGxldmVuJDE7XG4gIGxldmVuXzEkMS5kZWZhdWx0ID0gZGVmYXVsdF8xO1xuXG4gIHZhciBjb2xvck5hbWUkMSA9IHtcbiAgICBcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXG4gICAgXCJhbnRpcXVld2hpdGVcIjogWzI1MCwgMjM1LCAyMTVdLFxuICAgIFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxuICAgIFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXG4gICAgXCJhenVyZVwiOiBbMjQwLCAyNTUsIDI1NV0sXG4gICAgXCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXG4gICAgXCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxuICAgIFwiYmxhY2tcIjogWzAsIDAsIDBdLFxuICAgIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxuICAgIFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcbiAgICBcImJsdWV2aW9sZXRcIjogWzEzOCwgNDMsIDIyNl0sXG4gICAgXCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxuICAgIFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcbiAgICBcImNhZGV0Ymx1ZVwiOiBbOTUsIDE1OCwgMTYwXSxcbiAgICBcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcbiAgICBcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcbiAgICBcImNvcmFsXCI6IFsyNTUsIDEyNywgODBdLFxuICAgIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxuICAgIFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxuICAgIFwiY3JpbXNvblwiOiBbMjIwLCAyMCwgNjBdLFxuICAgIFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxuICAgIFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXG4gICAgXCJkYXJrY3lhblwiOiBbMCwgMTM5LCAxMzldLFxuICAgIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcbiAgICBcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcbiAgICBcImRhcmtncmVlblwiOiBbMCwgMTAwLCAwXSxcbiAgICBcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcbiAgICBcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXG4gICAgXCJkYXJrbWFnZW50YVwiOiBbMTM5LCAwLCAxMzldLFxuICAgIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcbiAgICBcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcbiAgICBcImRhcmtvcmNoaWRcIjogWzE1MywgNTAsIDIwNF0sXG4gICAgXCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxuICAgIFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXG4gICAgXCJkYXJrc2VhZ3JlZW5cIjogWzE0MywgMTg4LCAxNDNdLFxuICAgIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxuICAgIFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXG4gICAgXCJkYXJrc2xhdGVncmV5XCI6IFs0NywgNzksIDc5XSxcbiAgICBcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcbiAgICBcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcbiAgICBcImRlZXBwaW5rXCI6IFsyNTUsIDIwLCAxNDddLFxuICAgIFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcbiAgICBcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxuICAgIFwiZGltZ3JleVwiOiBbMTA1LCAxMDUsIDEwNV0sXG4gICAgXCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxuICAgIFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXG4gICAgXCJmbG9yYWx3aGl0ZVwiOiBbMjU1LCAyNTAsIDI0MF0sXG4gICAgXCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxuICAgIFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxuICAgIFwiZ2FpbnNib3JvXCI6IFsyMjAsIDIyMCwgMjIwXSxcbiAgICBcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxuICAgIFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxuICAgIFwiZ29sZGVucm9kXCI6IFsyMTgsIDE2NSwgMzJdLFxuICAgIFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXG4gICAgXCJncmVlblwiOiBbMCwgMTI4LCAwXSxcbiAgICBcImdyZWVueWVsbG93XCI6IFsxNzMsIDI1NSwgNDddLFxuICAgIFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXG4gICAgXCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXG4gICAgXCJob3RwaW5rXCI6IFsyNTUsIDEwNSwgMTgwXSxcbiAgICBcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxuICAgIFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcbiAgICBcIml2b3J5XCI6IFsyNTUsIDI1NSwgMjQwXSxcbiAgICBcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcbiAgICBcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcbiAgICBcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwgMjQwLCAyNDVdLFxuICAgIFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXG4gICAgXCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxuICAgIFwibGlnaHRibHVlXCI6IFsxNzMsIDIxNiwgMjMwXSxcbiAgICBcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxuICAgIFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcbiAgICBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsIDI1MCwgMjEwXSxcbiAgICBcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXG4gICAgXCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcbiAgICBcImxpZ2h0Z3JleVwiOiBbMjExLCAyMTEsIDIxMV0sXG4gICAgXCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxuICAgIFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxuICAgIFwibGlnaHRzZWFncmVlblwiOiBbMzIsIDE3OCwgMTcwXSxcbiAgICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXG4gICAgXCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXG4gICAgXCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LCAxMzYsIDE1M10sXG4gICAgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXG4gICAgXCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXG4gICAgXCJsaW1lXCI6IFswLCAyNTUsIDBdLFxuICAgIFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXG4gICAgXCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXG4gICAgXCJtYWdlbnRhXCI6IFsyNTUsIDAsIDI1NV0sXG4gICAgXCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXG4gICAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcbiAgICBcIm1lZGl1bWJsdWVcIjogWzAsIDAsIDIwNV0sXG4gICAgXCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXG4gICAgXCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxuICAgIFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLCAxNzksIDExM10sXG4gICAgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxuICAgIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcbiAgICBcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsIDIwOSwgMjA0XSxcbiAgICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcbiAgICBcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxuICAgIFwibWludGNyZWFtXCI6IFsyNDUsIDI1NSwgMjUwXSxcbiAgICBcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXG4gICAgXCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXG4gICAgXCJuYXZham93aGl0ZVwiOiBbMjU1LCAyMjIsIDE3M10sXG4gICAgXCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxuICAgIFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXG4gICAgXCJvbGl2ZVwiOiBbMTI4LCAxMjgsIDBdLFxuICAgIFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxuICAgIFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXG4gICAgXCJvcmFuZ2VyZWRcIjogWzI1NSwgNjksIDBdLFxuICAgIFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcbiAgICBcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxuICAgIFwicGFsZWdyZWVuXCI6IFsxNTIsIDI1MSwgMTUyXSxcbiAgICBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxuICAgIFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXG4gICAgXCJwYXBheWF3aGlwXCI6IFsyNTUsIDIzOSwgMjEzXSxcbiAgICBcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXG4gICAgXCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxuICAgIFwicGlua1wiOiBbMjU1LCAxOTIsIDIwM10sXG4gICAgXCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcbiAgICBcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxuICAgIFwicHVycGxlXCI6IFsxMjgsIDAsIDEyOF0sXG4gICAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxuICAgIFwicmVkXCI6IFsyNTUsIDAsIDBdLFxuICAgIFwicm9zeWJyb3duXCI6IFsxODgsIDE0MywgMTQzXSxcbiAgICBcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcbiAgICBcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXG4gICAgXCJzYWxtb25cIjogWzI1MCwgMTI4LCAxMTRdLFxuICAgIFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcbiAgICBcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXG4gICAgXCJzZWFzaGVsbFwiOiBbMjU1LCAyNDUsIDIzOF0sXG4gICAgXCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcbiAgICBcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXG4gICAgXCJza3libHVlXCI6IFsxMzUsIDIwNiwgMjM1XSxcbiAgICBcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcbiAgICBcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXG4gICAgXCJzbGF0ZWdyZXlcIjogWzExMiwgMTI4LCAxNDRdLFxuICAgIFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXG4gICAgXCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxuICAgIFwic3RlZWxibHVlXCI6IFs3MCwgMTMwLCAxODBdLFxuICAgIFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcbiAgICBcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcbiAgICBcInRoaXN0bGVcIjogWzIxNiwgMTkxLCAyMTZdLFxuICAgIFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXG4gICAgXCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXG4gICAgXCJ2aW9sZXRcIjogWzIzOCwgMTMwLCAyMzhdLFxuICAgIFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxuICAgIFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxuICAgIFwid2hpdGVzbW9rZVwiOiBbMjQ1LCAyNDUsIDI0NV0sXG4gICAgXCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcbiAgICBcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXG4gIH07XG5cbiAgLyogTUlUIGxpY2Vuc2UgKi9cblxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1taXhlZC1vcGVyYXRvcnMgKi9cbiAgLy8gTk9URTogY29udmVyc2lvbnMgc2hvdWxkIG9ubHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXMgKGkuZS4gYXJyYXlzLCBvclxuICAvLyAgICAgICB2YWx1ZXMgdGhhdCBnaXZlIGNvcnJlY3QgYHR5cGVvZmAgcmVzdWx0cykuXG4gIC8vICAgICAgIGRvIG5vdCB1c2UgYm94IHZhbHVlcyB0eXBlcyAoaS5lLiBOdW1iZXIoKSwgU3RyaW5nKCksIGV0Yy4pXG5cbiAgY29uc3QgcmV2ZXJzZUtleXdvcmRzID0ge307XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29sb3JOYW1lJDEpKSB7XG4gICAgcmV2ZXJzZUtleXdvcmRzW2NvbG9yTmFtZSQxW2tleV1dID0ga2V5O1xuICB9XG5cbiAgY29uc3QgY29udmVydCQxID0ge1xuICAgIHJnYjoge1xuICAgICAgY2hhbm5lbHM6IDMsXG4gICAgICBsYWJlbHM6ICdyZ2InXG4gICAgfSxcbiAgICBoc2w6IHtcbiAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgbGFiZWxzOiAnaHNsJ1xuICAgIH0sXG4gICAgaHN2OiB7XG4gICAgICBjaGFubmVsczogMyxcbiAgICAgIGxhYmVsczogJ2hzdidcbiAgICB9LFxuICAgIGh3Yjoge1xuICAgICAgY2hhbm5lbHM6IDMsXG4gICAgICBsYWJlbHM6ICdod2InXG4gICAgfSxcbiAgICBjbXlrOiB7XG4gICAgICBjaGFubmVsczogNCxcbiAgICAgIGxhYmVsczogJ2NteWsnXG4gICAgfSxcbiAgICB4eXo6IHtcbiAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgbGFiZWxzOiAneHl6J1xuICAgIH0sXG4gICAgbGFiOiB7XG4gICAgICBjaGFubmVsczogMyxcbiAgICAgIGxhYmVsczogJ2xhYidcbiAgICB9LFxuICAgIGxjaDoge1xuICAgICAgY2hhbm5lbHM6IDMsXG4gICAgICBsYWJlbHM6ICdsY2gnXG4gICAgfSxcbiAgICBoZXg6IHtcbiAgICAgIGNoYW5uZWxzOiAxLFxuICAgICAgbGFiZWxzOiBbJ2hleCddXG4gICAgfSxcbiAgICBrZXl3b3JkOiB7XG4gICAgICBjaGFubmVsczogMSxcbiAgICAgIGxhYmVsczogWydrZXl3b3JkJ11cbiAgICB9LFxuICAgIGFuc2kxNjoge1xuICAgICAgY2hhbm5lbHM6IDEsXG4gICAgICBsYWJlbHM6IFsnYW5zaTE2J11cbiAgICB9LFxuICAgIGFuc2kyNTY6IHtcbiAgICAgIGNoYW5uZWxzOiAxLFxuICAgICAgbGFiZWxzOiBbJ2Fuc2kyNTYnXVxuICAgIH0sXG4gICAgaGNnOiB7XG4gICAgICBjaGFubmVsczogMyxcbiAgICAgIGxhYmVsczogWydoJywgJ2MnLCAnZyddXG4gICAgfSxcbiAgICBhcHBsZToge1xuICAgICAgY2hhbm5lbHM6IDMsXG4gICAgICBsYWJlbHM6IFsncjE2JywgJ2cxNicsICdiMTYnXVxuICAgIH0sXG4gICAgZ3JheToge1xuICAgICAgY2hhbm5lbHM6IDEsXG4gICAgICBsYWJlbHM6IFsnZ3JheSddXG4gICAgfVxuICB9O1xuICB2YXIgY29udmVyc2lvbnMkMSA9IGNvbnZlcnQkMTsgLy8gSGlkZSAuY2hhbm5lbHMgYW5kIC5sYWJlbHMgcHJvcGVydGllc1xuXG4gIGZvciAoY29uc3QgbW9kZWwgb2YgT2JqZWN0LmtleXMoY29udmVydCQxKSkge1xuICAgIGlmICghKCdjaGFubmVscycgaW4gY29udmVydCQxW21vZGVsXSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjaGFubmVscyBwcm9wZXJ0eTogJyArIG1vZGVsKTtcbiAgICB9XG5cbiAgICBpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0JDFbbW9kZWxdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWwgbGFiZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuICAgIH1cblxuICAgIGlmIChjb252ZXJ0JDFbbW9kZWxdLmxhYmVscy5sZW5ndGggIT09IGNvbnZlcnQkMVttb2RlbF0uY2hhbm5lbHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2hhbm5lbCBhbmQgbGFiZWwgY291bnRzIG1pc21hdGNoOiAnICsgbW9kZWwpO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxzLFxuICAgICAgbGFiZWxzXG4gICAgfSA9IGNvbnZlcnQkMVttb2RlbF07XG4gICAgZGVsZXRlIGNvbnZlcnQkMVttb2RlbF0uY2hhbm5lbHM7XG4gICAgZGVsZXRlIGNvbnZlcnQkMVttb2RlbF0ubGFiZWxzO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0JDFbbW9kZWxdLCAnY2hhbm5lbHMnLCB7XG4gICAgICB2YWx1ZTogY2hhbm5lbHNcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydCQxW21vZGVsXSwgJ2xhYmVscycsIHtcbiAgICAgIHZhbHVlOiBsYWJlbHNcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnZlcnQkMS5yZ2IuaHNsID0gZnVuY3Rpb24gKHJnYikge1xuICAgIGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG4gICAgY29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcbiAgICBjb25zdCBiID0gcmdiWzJdIC8gMjU1O1xuICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgIGNvbnN0IGRlbHRhID0gbWF4IC0gbWluO1xuICAgIGxldCBoO1xuICAgIGxldCBzO1xuXG4gICAgaWYgKG1heCA9PT0gbWluKSB7XG4gICAgICBoID0gMDtcbiAgICB9IGVsc2UgaWYgKHIgPT09IG1heCkge1xuICAgICAgaCA9IChnIC0gYikgLyBkZWx0YTtcbiAgICB9IGVsc2UgaWYgKGcgPT09IG1heCkge1xuICAgICAgaCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG4gICAgfSBlbHNlIGlmIChiID09PSBtYXgpIHtcbiAgICAgIGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuICAgIH1cblxuICAgIGggPSBNYXRoLm1pbihoICogNjAsIDM2MCk7XG5cbiAgICBpZiAoaCA8IDApIHtcbiAgICAgIGggKz0gMzYwO1xuICAgIH1cblxuICAgIGNvbnN0IGwgPSAobWluICsgbWF4KSAvIDI7XG5cbiAgICBpZiAobWF4ID09PSBtaW4pIHtcbiAgICAgIHMgPSAwO1xuICAgIH0gZWxzZSBpZiAobCA8PSAwLjUpIHtcbiAgICAgIHMgPSBkZWx0YSAvIChtYXggKyBtaW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoLCBzICogMTAwLCBsICogMTAwXTtcbiAgfTtcblxuICBjb252ZXJ0JDEucmdiLmhzdiA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICBsZXQgcmRpZjtcbiAgICBsZXQgZ2RpZjtcbiAgICBsZXQgYmRpZjtcbiAgICBsZXQgaDtcbiAgICBsZXQgcztcbiAgICBjb25zdCByID0gcmdiWzBdIC8gMjU1O1xuICAgIGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG4gICAgY29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcbiAgICBjb25zdCB2ID0gTWF0aC5tYXgociwgZywgYik7XG4gICAgY29uc3QgZGlmZiA9IHYgLSBNYXRoLm1pbihyLCBnLCBiKTtcblxuICAgIGNvbnN0IGRpZmZjID0gZnVuY3Rpb24gZGlmZmMoYykge1xuICAgICAgcmV0dXJuICh2IC0gYykgLyA2IC8gZGlmZiArIDEgLyAyO1xuICAgIH07XG5cbiAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgaCA9IDA7XG4gICAgICBzID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyA9IGRpZmYgLyB2O1xuICAgICAgcmRpZiA9IGRpZmZjKHIpO1xuICAgICAgZ2RpZiA9IGRpZmZjKGcpO1xuICAgICAgYmRpZiA9IGRpZmZjKGIpO1xuXG4gICAgICBpZiAociA9PT0gdikge1xuICAgICAgICBoID0gYmRpZiAtIGdkaWY7XG4gICAgICB9IGVsc2UgaWYgKGcgPT09IHYpIHtcbiAgICAgICAgaCA9IDEgLyAzICsgcmRpZiAtIGJkaWY7XG4gICAgICB9IGVsc2UgaWYgKGIgPT09IHYpIHtcbiAgICAgICAgaCA9IDIgLyAzICsgZ2RpZiAtIHJkaWY7XG4gICAgICB9XG5cbiAgICAgIGlmIChoIDwgMCkge1xuICAgICAgICBoICs9IDE7XG4gICAgICB9IGVsc2UgaWYgKGggPiAxKSB7XG4gICAgICAgIGggLT0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2ggKiAzNjAsIHMgKiAxMDAsIHYgKiAxMDBdO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5yZ2IuaHdiID0gZnVuY3Rpb24gKHJnYikge1xuICAgIGNvbnN0IHIgPSByZ2JbMF07XG4gICAgY29uc3QgZyA9IHJnYlsxXTtcbiAgICBsZXQgYiA9IHJnYlsyXTtcbiAgICBjb25zdCBoID0gY29udmVydCQxLnJnYi5oc2wocmdiKVswXTtcbiAgICBjb25zdCB3ID0gMSAvIDI1NSAqIE1hdGgubWluKHIsIE1hdGgubWluKGcsIGIpKTtcbiAgICBiID0gMSAtIDEgLyAyNTUgKiBNYXRoLm1heChyLCBNYXRoLm1heChnLCBiKSk7XG4gICAgcmV0dXJuIFtoLCB3ICogMTAwLCBiICogMTAwXTtcbiAgfTtcblxuICBjb252ZXJ0JDEucmdiLmNteWsgPSBmdW5jdGlvbiAocmdiKSB7XG4gICAgY29uc3QgciA9IHJnYlswXSAvIDI1NTtcbiAgICBjb25zdCBnID0gcmdiWzFdIC8gMjU1O1xuICAgIGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG4gICAgY29uc3QgayA9IE1hdGgubWluKDEgLSByLCAxIC0gZywgMSAtIGIpO1xuICAgIGNvbnN0IGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcbiAgICBjb25zdCBtID0gKDEgLSBnIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gICAgY29uc3QgeSA9ICgxIC0gYiAtIGspIC8gKDEgLSBrKSB8fCAwO1xuICAgIHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG4gIH07XG5cbiAgZnVuY3Rpb24gY29tcGFyYXRpdmVEaXN0YW5jZSh4LCB5KSB7XG4gICAgLypcbiAgICBcdFNlZSBodHRwczovL2VuLm0ud2lraXBlZGlhLm9yZy93aWtpL0V1Y2xpZGVhbl9kaXN0YW5jZSNTcXVhcmVkX0V1Y2xpZGVhbl9kaXN0YW5jZVxuICAgICovXG4gICAgcmV0dXJuICh4WzBdIC0geVswXSkgKiogMiArICh4WzFdIC0geVsxXSkgKiogMiArICh4WzJdIC0geVsyXSkgKiogMjtcbiAgfVxuXG4gIGNvbnZlcnQkMS5yZ2Iua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICBjb25zdCByZXZlcnNlZCA9IHJldmVyc2VLZXl3b3Jkc1tyZ2JdO1xuXG4gICAgaWYgKHJldmVyc2VkKSB7XG4gICAgICByZXR1cm4gcmV2ZXJzZWQ7XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICBsZXQgY3VycmVudENsb3Nlc3RLZXl3b3JkO1xuXG4gICAgZm9yIChjb25zdCBrZXl3b3JkIG9mIE9iamVjdC5rZXlzKGNvbG9yTmFtZSQxKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb2xvck5hbWUkMVtrZXl3b3JkXTsgLy8gQ29tcHV0ZSBjb21wYXJhdGl2ZSBkaXN0YW5jZVxuXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7IC8vIENoZWNrIGlmIGl0cyBsZXNzLCBpZiBzbyBzZXQgYXMgY2xvc2VzdFxuXG4gICAgICBpZiAoZGlzdGFuY2UgPCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlKSB7XG4gICAgICAgIGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgY3VycmVudENsb3Nlc3RLZXl3b3JkID0ga2V5d29yZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudENsb3Nlc3RLZXl3b3JkO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5rZXl3b3JkLnJnYiA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG4gICAgcmV0dXJuIGNvbG9yTmFtZSQxW2tleXdvcmRdO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5yZ2IueHl6ID0gZnVuY3Rpb24gKHJnYikge1xuICAgIGxldCByID0gcmdiWzBdIC8gMjU1O1xuICAgIGxldCBnID0gcmdiWzFdIC8gMjU1O1xuICAgIGxldCBiID0gcmdiWzJdIC8gMjU1OyAvLyBBc3N1bWUgc1JHQlxuXG4gICAgciA9IHIgPiAwLjA0MDQ1ID8gKChyICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNCA6IHIgLyAxMi45MjtcbiAgICBnID0gZyA+IDAuMDQwNDUgPyAoKGcgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40IDogZyAvIDEyLjkyO1xuICAgIGIgPSBiID4gMC4wNDA0NSA/ICgoYiArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQgOiBiIC8gMTIuOTI7XG4gICAgY29uc3QgeCA9IHIgKiAwLjQxMjQgKyBnICogMC4zNTc2ICsgYiAqIDAuMTgwNTtcbiAgICBjb25zdCB5ID0gciAqIDAuMjEyNiArIGcgKiAwLjcxNTIgKyBiICogMC4wNzIyO1xuICAgIGNvbnN0IHogPSByICogMC4wMTkzICsgZyAqIDAuMTE5MiArIGIgKiAwLjk1MDU7XG4gICAgcmV0dXJuIFt4ICogMTAwLCB5ICogMTAwLCB6ICogMTAwXTtcbiAgfTtcblxuICBjb252ZXJ0JDEucmdiLmxhYiA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICBjb25zdCB4eXogPSBjb252ZXJ0JDEucmdiLnh5eihyZ2IpO1xuICAgIGxldCB4ID0geHl6WzBdO1xuICAgIGxldCB5ID0geHl6WzFdO1xuICAgIGxldCB6ID0geHl6WzJdO1xuICAgIHggLz0gOTUuMDQ3O1xuICAgIHkgLz0gMTAwO1xuICAgIHogLz0gMTA4Ljg4MztcbiAgICB4ID0geCA+IDAuMDA4ODU2ID8geCAqKiAoMSAvIDMpIDogNy43ODcgKiB4ICsgMTYgLyAxMTY7XG4gICAgeSA9IHkgPiAwLjAwODg1NiA/IHkgKiogKDEgLyAzKSA6IDcuNzg3ICogeSArIDE2IC8gMTE2O1xuICAgIHogPSB6ID4gMC4wMDg4NTYgPyB6ICoqICgxIC8gMykgOiA3Ljc4NyAqIHogKyAxNiAvIDExNjtcbiAgICBjb25zdCBsID0gMTE2ICogeSAtIDE2O1xuICAgIGNvbnN0IGEgPSA1MDAgKiAoeCAtIHkpO1xuICAgIGNvbnN0IGIgPSAyMDAgKiAoeSAtIHopO1xuICAgIHJldHVybiBbbCwgYSwgYl07XG4gIH07XG5cbiAgY29udmVydCQxLmhzbC5yZ2IgPSBmdW5jdGlvbiAoaHNsKSB7XG4gICAgY29uc3QgaCA9IGhzbFswXSAvIDM2MDtcbiAgICBjb25zdCBzID0gaHNsWzFdIC8gMTAwO1xuICAgIGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG4gICAgbGV0IHQyO1xuICAgIGxldCB0MztcbiAgICBsZXQgdmFsO1xuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIHZhbCA9IGwgKiAyNTU7XG4gICAgICByZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuICAgIH1cblxuICAgIGlmIChsIDwgMC41KSB7XG4gICAgICB0MiA9IGwgKiAoMSArIHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0MiA9IGwgKyBzIC0gbCAqIHM7XG4gICAgfVxuXG4gICAgY29uc3QgdDEgPSAyICogbCAtIHQyO1xuICAgIGNvbnN0IHJnYiA9IFswLCAwLCAwXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICB0MyA9IGggKyAxIC8gMyAqIC0oaSAtIDEpO1xuXG4gICAgICBpZiAodDMgPCAwKSB7XG4gICAgICAgIHQzKys7XG4gICAgICB9XG5cbiAgICAgIGlmICh0MyA+IDEpIHtcbiAgICAgICAgdDMtLTtcbiAgICAgIH1cblxuICAgICAgaWYgKDYgKiB0MyA8IDEpIHtcbiAgICAgICAgdmFsID0gdDEgKyAodDIgLSB0MSkgKiA2ICogdDM7XG4gICAgICB9IGVsc2UgaWYgKDIgKiB0MyA8IDEpIHtcbiAgICAgICAgdmFsID0gdDI7XG4gICAgICB9IGVsc2UgaWYgKDMgKiB0MyA8IDIpIHtcbiAgICAgICAgdmFsID0gdDEgKyAodDIgLSB0MSkgKiAoMiAvIDMgLSB0MykgKiA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gdDE7XG4gICAgICB9XG5cbiAgICAgIHJnYltpXSA9IHZhbCAqIDI1NTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmdiO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5oc2wuaHN2ID0gZnVuY3Rpb24gKGhzbCkge1xuICAgIGNvbnN0IGggPSBoc2xbMF07XG4gICAgbGV0IHMgPSBoc2xbMV0gLyAxMDA7XG4gICAgbGV0IGwgPSBoc2xbMl0gLyAxMDA7XG4gICAgbGV0IHNtaW4gPSBzO1xuICAgIGNvbnN0IGxtaW4gPSBNYXRoLm1heChsLCAwLjAxKTtcbiAgICBsICo9IDI7XG4gICAgcyAqPSBsIDw9IDEgPyBsIDogMiAtIGw7XG4gICAgc21pbiAqPSBsbWluIDw9IDEgPyBsbWluIDogMiAtIGxtaW47XG4gICAgY29uc3QgdiA9IChsICsgcykgLyAyO1xuICAgIGNvbnN0IHN2ID0gbCA9PT0gMCA/IDIgKiBzbWluIC8gKGxtaW4gKyBzbWluKSA6IDIgKiBzIC8gKGwgKyBzKTtcbiAgICByZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcbiAgfTtcblxuICBjb252ZXJ0JDEuaHN2LnJnYiA9IGZ1bmN0aW9uIChoc3YpIHtcbiAgICBjb25zdCBoID0gaHN2WzBdIC8gNjA7XG4gICAgY29uc3QgcyA9IGhzdlsxXSAvIDEwMDtcbiAgICBsZXQgdiA9IGhzdlsyXSAvIDEwMDtcbiAgICBjb25zdCBoaSA9IE1hdGguZmxvb3IoaCkgJSA2O1xuICAgIGNvbnN0IGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcbiAgICBjb25zdCBwID0gMjU1ICogdiAqICgxIC0gcyk7XG4gICAgY29uc3QgcSA9IDI1NSAqIHYgKiAoMSAtIHMgKiBmKTtcbiAgICBjb25zdCB0ID0gMjU1ICogdiAqICgxIC0gcyAqICgxIC0gZikpO1xuICAgIHYgKj0gMjU1O1xuXG4gICAgc3dpdGNoIChoaSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gW3YsIHQsIHBdO1xuXG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBbcSwgdiwgcF07XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIFtwLCB2LCB0XTtcblxuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gW3AsIHEsIHZdO1xuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiBbdCwgcCwgdl07XG5cbiAgICAgIGNhc2UgNTpcbiAgICAgICAgcmV0dXJuIFt2LCBwLCBxXTtcbiAgICB9XG4gIH07XG5cbiAgY29udmVydCQxLmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG4gICAgY29uc3QgaCA9IGhzdlswXTtcbiAgICBjb25zdCBzID0gaHN2WzFdIC8gMTAwO1xuICAgIGNvbnN0IHYgPSBoc3ZbMl0gLyAxMDA7XG4gICAgY29uc3Qgdm1pbiA9IE1hdGgubWF4KHYsIDAuMDEpO1xuICAgIGxldCBzbDtcbiAgICBsZXQgbDtcbiAgICBsID0gKDIgLSBzKSAqIHY7XG4gICAgY29uc3QgbG1pbiA9ICgyIC0gcykgKiB2bWluO1xuICAgIHNsID0gcyAqIHZtaW47XG4gICAgc2wgLz0gbG1pbiA8PSAxID8gbG1pbiA6IDIgLSBsbWluO1xuICAgIHNsID0gc2wgfHwgMDtcbiAgICBsIC89IDI7XG4gICAgcmV0dXJuIFtoLCBzbCAqIDEwMCwgbCAqIDEwMF07XG4gIH07IC8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzcy1jb2xvci8jaHdiLXRvLXJnYlxuXG5cbiAgY29udmVydCQxLmh3Yi5yZ2IgPSBmdW5jdGlvbiAoaHdiKSB7XG4gICAgY29uc3QgaCA9IGh3YlswXSAvIDM2MDtcbiAgICBsZXQgd2ggPSBod2JbMV0gLyAxMDA7XG4gICAgbGV0IGJsID0gaHdiWzJdIC8gMTAwO1xuICAgIGNvbnN0IHJhdGlvID0gd2ggKyBibDtcbiAgICBsZXQgZjsgLy8gV2ggKyBibCBjYW50IGJlID4gMVxuXG4gICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgd2ggLz0gcmF0aW87XG4gICAgICBibCAvPSByYXRpbztcbiAgICB9XG5cbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcig2ICogaCk7XG4gICAgY29uc3QgdiA9IDEgLSBibDtcbiAgICBmID0gNiAqIGggLSBpO1xuXG4gICAgaWYgKChpICYgMHgwMSkgIT09IDApIHtcbiAgICAgIGYgPSAxIC0gZjtcbiAgICB9XG5cbiAgICBjb25zdCBuID0gd2ggKyBmICogKHYgLSB3aCk7IC8vIExpbmVhciBpbnRlcnBvbGF0aW9uXG5cbiAgICBsZXQgcjtcbiAgICBsZXQgZztcbiAgICBsZXQgYjtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSxuby1tdWx0aS1zcGFjZXMgKi9cblxuICAgIHN3aXRjaCAoaSkge1xuICAgICAgZGVmYXVsdDpcbiAgICAgIGNhc2UgNjpcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgciA9IHY7XG4gICAgICAgIGcgPSBuO1xuICAgICAgICBiID0gd2g7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDE6XG4gICAgICAgIHIgPSBuO1xuICAgICAgICBnID0gdjtcbiAgICAgICAgYiA9IHdoO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICByID0gd2g7XG4gICAgICAgIGcgPSB2O1xuICAgICAgICBiID0gbjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzpcbiAgICAgICAgciA9IHdoO1xuICAgICAgICBnID0gbjtcbiAgICAgICAgYiA9IHY7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHIgPSBuO1xuICAgICAgICBnID0gd2g7XG4gICAgICAgIGIgPSB2O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA1OlxuICAgICAgICByID0gdjtcbiAgICAgICAgZyA9IHdoO1xuICAgICAgICBiID0gbjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUsbm8tbXVsdGktc3BhY2VzICovXG5cblxuICAgIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG4gIH07XG5cbiAgY29udmVydCQxLmNteWsucmdiID0gZnVuY3Rpb24gKGNteWspIHtcbiAgICBjb25zdCBjID0gY215a1swXSAvIDEwMDtcbiAgICBjb25zdCBtID0gY215a1sxXSAvIDEwMDtcbiAgICBjb25zdCB5ID0gY215a1syXSAvIDEwMDtcbiAgICBjb25zdCBrID0gY215a1szXSAvIDEwMDtcbiAgICBjb25zdCByID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XG4gICAgY29uc3QgZyA9IDEgLSBNYXRoLm1pbigxLCBtICogKDEgLSBrKSArIGspO1xuICAgIGNvbnN0IGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcbiAgICByZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xuICB9O1xuXG4gIGNvbnZlcnQkMS54eXoucmdiID0gZnVuY3Rpb24gKHh5eikge1xuICAgIGNvbnN0IHggPSB4eXpbMF0gLyAxMDA7XG4gICAgY29uc3QgeSA9IHh5elsxXSAvIDEwMDtcbiAgICBjb25zdCB6ID0geHl6WzJdIC8gMTAwO1xuICAgIGxldCByO1xuICAgIGxldCBnO1xuICAgIGxldCBiO1xuICAgIHIgPSB4ICogMy4yNDA2ICsgeSAqIC0xLjUzNzIgKyB6ICogLTAuNDk4NjtcbiAgICBnID0geCAqIC0wLjk2ODkgKyB5ICogMS44NzU4ICsgeiAqIDAuMDQxNTtcbiAgICBiID0geCAqIDAuMDU1NyArIHkgKiAtMC4yMDQwICsgeiAqIDEuMDU3MDsgLy8gQXNzdW1lIHNSR0JcblxuICAgIHIgPSByID4gMC4wMDMxMzA4ID8gMS4wNTUgKiByICoqICgxLjAgLyAyLjQpIC0gMC4wNTUgOiByICogMTIuOTI7XG4gICAgZyA9IGcgPiAwLjAwMzEzMDggPyAxLjA1NSAqIGcgKiogKDEuMCAvIDIuNCkgLSAwLjA1NSA6IGcgKiAxMi45MjtcbiAgICBiID0gYiA+IDAuMDAzMTMwOCA/IDEuMDU1ICogYiAqKiAoMS4wIC8gMi40KSAtIDAuMDU1IDogYiAqIDEyLjkyO1xuICAgIHIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCByKSwgMSk7XG4gICAgZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcbiAgICBiID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYiksIDEpO1xuICAgIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG4gIH07XG5cbiAgY29udmVydCQxLnh5ei5sYWIgPSBmdW5jdGlvbiAoeHl6KSB7XG4gICAgbGV0IHggPSB4eXpbMF07XG4gICAgbGV0IHkgPSB4eXpbMV07XG4gICAgbGV0IHogPSB4eXpbMl07XG4gICAgeCAvPSA5NS4wNDc7XG4gICAgeSAvPSAxMDA7XG4gICAgeiAvPSAxMDguODgzO1xuICAgIHggPSB4ID4gMC4wMDg4NTYgPyB4ICoqICgxIC8gMykgOiA3Ljc4NyAqIHggKyAxNiAvIDExNjtcbiAgICB5ID0geSA+IDAuMDA4ODU2ID8geSAqKiAoMSAvIDMpIDogNy43ODcgKiB5ICsgMTYgLyAxMTY7XG4gICAgeiA9IHogPiAwLjAwODg1NiA/IHogKiogKDEgLyAzKSA6IDcuNzg3ICogeiArIDE2IC8gMTE2O1xuICAgIGNvbnN0IGwgPSAxMTYgKiB5IC0gMTY7XG4gICAgY29uc3QgYSA9IDUwMCAqICh4IC0geSk7XG4gICAgY29uc3QgYiA9IDIwMCAqICh5IC0geik7XG4gICAgcmV0dXJuIFtsLCBhLCBiXTtcbiAgfTtcblxuICBjb252ZXJ0JDEubGFiLnh5eiA9IGZ1bmN0aW9uIChsYWIpIHtcbiAgICBjb25zdCBsID0gbGFiWzBdO1xuICAgIGNvbnN0IGEgPSBsYWJbMV07XG4gICAgY29uc3QgYiA9IGxhYlsyXTtcbiAgICBsZXQgeDtcbiAgICBsZXQgeTtcbiAgICBsZXQgejtcbiAgICB5ID0gKGwgKyAxNikgLyAxMTY7XG4gICAgeCA9IGEgLyA1MDAgKyB5O1xuICAgIHogPSB5IC0gYiAvIDIwMDtcbiAgICBjb25zdCB5MiA9IHkgKiogMztcbiAgICBjb25zdCB4MiA9IHggKiogMztcbiAgICBjb25zdCB6MiA9IHogKiogMztcbiAgICB5ID0geTIgPiAwLjAwODg1NiA/IHkyIDogKHkgLSAxNiAvIDExNikgLyA3Ljc4NztcbiAgICB4ID0geDIgPiAwLjAwODg1NiA/IHgyIDogKHggLSAxNiAvIDExNikgLyA3Ljc4NztcbiAgICB6ID0gejIgPiAwLjAwODg1NiA/IHoyIDogKHogLSAxNiAvIDExNikgLyA3Ljc4NztcbiAgICB4ICo9IDk1LjA0NztcbiAgICB5ICo9IDEwMDtcbiAgICB6ICo9IDEwOC44ODM7XG4gICAgcmV0dXJuIFt4LCB5LCB6XTtcbiAgfTtcblxuICBjb252ZXJ0JDEubGFiLmxjaCA9IGZ1bmN0aW9uIChsYWIpIHtcbiAgICBjb25zdCBsID0gbGFiWzBdO1xuICAgIGNvbnN0IGEgPSBsYWJbMV07XG4gICAgY29uc3QgYiA9IGxhYlsyXTtcbiAgICBsZXQgaDtcbiAgICBjb25zdCBociA9IE1hdGguYXRhbjIoYiwgYSk7XG4gICAgaCA9IGhyICogMzYwIC8gMiAvIE1hdGguUEk7XG5cbiAgICBpZiAoaCA8IDApIHtcbiAgICAgIGggKz0gMzYwO1xuICAgIH1cblxuICAgIGNvbnN0IGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG4gICAgcmV0dXJuIFtsLCBjLCBoXTtcbiAgfTtcblxuICBjb252ZXJ0JDEubGNoLmxhYiA9IGZ1bmN0aW9uIChsY2gpIHtcbiAgICBjb25zdCBsID0gbGNoWzBdO1xuICAgIGNvbnN0IGMgPSBsY2hbMV07XG4gICAgY29uc3QgaCA9IGxjaFsyXTtcbiAgICBjb25zdCBociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcbiAgICBjb25zdCBhID0gYyAqIE1hdGguY29zKGhyKTtcbiAgICBjb25zdCBiID0gYyAqIE1hdGguc2luKGhyKTtcbiAgICByZXR1cm4gW2wsIGEsIGJdO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5yZ2IuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MsIHNhdHVyYXRpb24gPSBudWxsKSB7XG4gICAgY29uc3QgW3IsIGcsIGJdID0gYXJncztcbiAgICBsZXQgdmFsdWUgPSBzYXR1cmF0aW9uID09PSBudWxsID8gY29udmVydCQxLnJnYi5oc3YoYXJncylbMl0gOiBzYXR1cmF0aW9uOyAvLyBIc3YgLT4gYW5zaTE2IG9wdGltaXphdGlvblxuXG4gICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gNTApO1xuXG4gICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICByZXR1cm4gMzA7XG4gICAgfVxuXG4gICAgbGV0IGFuc2kgPSAzMCArIChNYXRoLnJvdW5kKGIgLyAyNTUpIDw8IDIgfCBNYXRoLnJvdW5kKGcgLyAyNTUpIDw8IDEgfCBNYXRoLnJvdW5kKHIgLyAyNTUpKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gMikge1xuICAgICAgYW5zaSArPSA2MDtcbiAgICB9XG5cbiAgICByZXR1cm4gYW5zaTtcbiAgfTtcblxuICBjb252ZXJ0JDEuaHN2LmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgLy8gT3B0aW1pemF0aW9uIGhlcmU7IHdlIGFscmVhZHkga25vdyB0aGUgdmFsdWUgYW5kIGRvbid0IG5lZWQgdG8gZ2V0XG4gICAgLy8gaXQgY29udmVydGVkIGZvciB1cy5cbiAgICByZXR1cm4gY29udmVydCQxLnJnYi5hbnNpMTYoY29udmVydCQxLmhzdi5yZ2IoYXJncyksIGFyZ3NbMl0pO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5yZ2IuYW5zaTI1NiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgY29uc3QgciA9IGFyZ3NbMF07XG4gICAgY29uc3QgZyA9IGFyZ3NbMV07XG4gICAgY29uc3QgYiA9IGFyZ3NbMl07IC8vIFdlIHVzZSB0aGUgZXh0ZW5kZWQgZ3JleXNjYWxlIHBhbGV0dGUgaGVyZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG4gICAgLy8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cbiAgICBpZiAociA9PT0gZyAmJiBnID09PSBiKSB7XG4gICAgICBpZiAociA8IDgpIHtcbiAgICAgICAgcmV0dXJuIDE2O1xuICAgICAgfVxuXG4gICAgICBpZiAociA+IDI0OCkge1xuICAgICAgICByZXR1cm4gMjMxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTWF0aC5yb3VuZCgociAtIDgpIC8gMjQ3ICogMjQpICsgMjMyO1xuICAgIH1cblxuICAgIGNvbnN0IGFuc2kgPSAxNiArIDM2ICogTWF0aC5yb3VuZChyIC8gMjU1ICogNSkgKyA2ICogTWF0aC5yb3VuZChnIC8gMjU1ICogNSkgKyBNYXRoLnJvdW5kKGIgLyAyNTUgKiA1KTtcbiAgICByZXR1cm4gYW5zaTtcbiAgfTtcblxuICBjb252ZXJ0JDEuYW5zaTE2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgbGV0IGNvbG9yID0gYXJncyAlIDEwOyAvLyBIYW5kbGUgZ3JleXNjYWxlXG5cbiAgICBpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcbiAgICAgIGlmIChhcmdzID4gNTApIHtcbiAgICAgICAgY29sb3IgKz0gMy41O1xuICAgICAgfVxuXG4gICAgICBjb2xvciA9IGNvbG9yIC8gMTAuNSAqIDI1NTtcbiAgICAgIHJldHVybiBbY29sb3IsIGNvbG9yLCBjb2xvcl07XG4gICAgfVxuXG4gICAgY29uc3QgbXVsdCA9ICh+fihhcmdzID4gNTApICsgMSkgKiAwLjU7XG4gICAgY29uc3QgciA9IChjb2xvciAmIDEpICogbXVsdCAqIDI1NTtcbiAgICBjb25zdCBnID0gKGNvbG9yID4+IDEgJiAxKSAqIG11bHQgKiAyNTU7XG4gICAgY29uc3QgYiA9IChjb2xvciA+PiAyICYgMSkgKiBtdWx0ICogMjU1O1xuICAgIHJldHVybiBbciwgZywgYl07XG4gIH07XG5cbiAgY29udmVydCQxLmFuc2kyNTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAvLyBIYW5kbGUgZ3JleXNjYWxlXG4gICAgaWYgKGFyZ3MgPj0gMjMyKSB7XG4gICAgICBjb25zdCBjID0gKGFyZ3MgLSAyMzIpICogMTAgKyA4O1xuICAgICAgcmV0dXJuIFtjLCBjLCBjXTtcbiAgICB9XG5cbiAgICBhcmdzIC09IDE2O1xuICAgIGxldCByZW07XG4gICAgY29uc3QgciA9IE1hdGguZmxvb3IoYXJncyAvIDM2KSAvIDUgKiAyNTU7XG4gICAgY29uc3QgZyA9IE1hdGguZmxvb3IoKHJlbSA9IGFyZ3MgJSAzNikgLyA2KSAvIDUgKiAyNTU7XG4gICAgY29uc3QgYiA9IHJlbSAlIDYgLyA1ICogMjU1O1xuICAgIHJldHVybiBbciwgZywgYl07XG4gIH07XG5cbiAgY29udmVydCQxLnJnYi5oZXggPSBmdW5jdGlvbiAoYXJncykge1xuICAgIGNvbnN0IGludGVnZXIgPSAoKE1hdGgucm91bmQoYXJnc1swXSkgJiAweEZGKSA8PCAxNikgKyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KSArIChNYXRoLnJvdW5kKGFyZ3NbMl0pICYgMHhGRik7XG4gICAgY29uc3Qgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICByZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5oZXgucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICBjb25zdCBtYXRjaCA9IGFyZ3MudG9TdHJpbmcoMTYpLm1hdGNoKC9bYS1mMC05XXs2fXxbYS1mMC05XXszfS9pKTtcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiBbMCwgMCwgMF07XG4gICAgfVxuXG4gICAgbGV0IGNvbG9yU3RyaW5nID0gbWF0Y2hbMF07XG5cbiAgICBpZiAobWF0Y2hbMF0ubGVuZ3RoID09PSAzKSB7XG4gICAgICBjb2xvclN0cmluZyA9IGNvbG9yU3RyaW5nLnNwbGl0KCcnKS5tYXAoY2hhciA9PiB7XG4gICAgICAgIHJldHVybiBjaGFyICsgY2hhcjtcbiAgICAgIH0pLmpvaW4oJycpO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVnZXIgPSBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuICAgIGNvbnN0IHIgPSBpbnRlZ2VyID4+IDE2ICYgMHhGRjtcbiAgICBjb25zdCBnID0gaW50ZWdlciA+PiA4ICYgMHhGRjtcbiAgICBjb25zdCBiID0gaW50ZWdlciAmIDB4RkY7XG4gICAgcmV0dXJuIFtyLCBnLCBiXTtcbiAgfTtcblxuICBjb252ZXJ0JDEucmdiLmhjZyA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICBjb25zdCByID0gcmdiWzBdIC8gMjU1O1xuICAgIGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG4gICAgY29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcbiAgICBjb25zdCBtYXggPSBNYXRoLm1heChNYXRoLm1heChyLCBnKSwgYik7XG4gICAgY29uc3QgbWluID0gTWF0aC5taW4oTWF0aC5taW4ociwgZyksIGIpO1xuICAgIGNvbnN0IGNocm9tYSA9IG1heCAtIG1pbjtcbiAgICBsZXQgZ3JheXNjYWxlO1xuICAgIGxldCBodWU7XG5cbiAgICBpZiAoY2hyb21hIDwgMSkge1xuICAgICAgZ3JheXNjYWxlID0gbWluIC8gKDEgLSBjaHJvbWEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBncmF5c2NhbGUgPSAwO1xuICAgIH1cblxuICAgIGlmIChjaHJvbWEgPD0gMCkge1xuICAgICAgaHVlID0gMDtcbiAgICB9IGVsc2UgaWYgKG1heCA9PT0gcikge1xuICAgICAgaHVlID0gKGcgLSBiKSAvIGNocm9tYSAlIDY7XG4gICAgfSBlbHNlIGlmIChtYXggPT09IGcpIHtcbiAgICAgIGh1ZSA9IDIgKyAoYiAtIHIpIC8gY2hyb21hO1xuICAgIH0gZWxzZSB7XG4gICAgICBodWUgPSA0ICsgKHIgLSBnKSAvIGNocm9tYTtcbiAgICB9XG5cbiAgICBodWUgLz0gNjtcbiAgICBodWUgJT0gMTtcbiAgICByZXR1cm4gW2h1ZSAqIDM2MCwgY2hyb21hICogMTAwLCBncmF5c2NhbGUgKiAxMDBdO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5oc2wuaGNnID0gZnVuY3Rpb24gKGhzbCkge1xuICAgIGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG4gICAgY29uc3QgbCA9IGhzbFsyXSAvIDEwMDtcbiAgICBjb25zdCBjID0gbCA8IDAuNSA/IDIuMCAqIHMgKiBsIDogMi4wICogcyAqICgxLjAgLSBsKTtcbiAgICBsZXQgZiA9IDA7XG5cbiAgICBpZiAoYyA8IDEuMCkge1xuICAgICAgZiA9IChsIC0gMC41ICogYykgLyAoMS4wIC0gYyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoc2xbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5oc3YuaGNnID0gZnVuY3Rpb24gKGhzdikge1xuICAgIGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG4gICAgY29uc3QgdiA9IGhzdlsyXSAvIDEwMDtcbiAgICBjb25zdCBjID0gcyAqIHY7XG4gICAgbGV0IGYgPSAwO1xuXG4gICAgaWYgKGMgPCAxLjApIHtcbiAgICAgIGYgPSAodiAtIGMpIC8gKDEgLSBjKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2hzdlswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG4gIH07XG5cbiAgY29udmVydCQxLmhjZy5yZ2IgPSBmdW5jdGlvbiAoaGNnKSB7XG4gICAgY29uc3QgaCA9IGhjZ1swXSAvIDM2MDtcbiAgICBjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuICAgIGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cbiAgICBpZiAoYyA9PT0gMC4wKSB7XG4gICAgICByZXR1cm4gW2cgKiAyNTUsIGcgKiAyNTUsIGcgKiAyNTVdO1xuICAgIH1cblxuICAgIGNvbnN0IHB1cmUgPSBbMCwgMCwgMF07XG4gICAgY29uc3QgaGkgPSBoICUgMSAqIDY7XG4gICAgY29uc3QgdiA9IGhpICUgMTtcbiAgICBjb25zdCB3ID0gMSAtIHY7XG4gICAgbGV0IG1nID0gMDtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXG4gICAgc3dpdGNoIChNYXRoLmZsb29yKGhpKSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBwdXJlWzBdID0gMTtcbiAgICAgICAgcHVyZVsxXSA9IHY7XG4gICAgICAgIHB1cmVbMl0gPSAwO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxOlxuICAgICAgICBwdXJlWzBdID0gdztcbiAgICAgICAgcHVyZVsxXSA9IDE7XG4gICAgICAgIHB1cmVbMl0gPSAwO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICBwdXJlWzBdID0gMDtcbiAgICAgICAgcHVyZVsxXSA9IDE7XG4gICAgICAgIHB1cmVbMl0gPSB2O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAzOlxuICAgICAgICBwdXJlWzBdID0gMDtcbiAgICAgICAgcHVyZVsxXSA9IHc7XG4gICAgICAgIHB1cmVbMl0gPSAxO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0OlxuICAgICAgICBwdXJlWzBdID0gdjtcbiAgICAgICAgcHVyZVsxXSA9IDA7XG4gICAgICAgIHB1cmVbMl0gPSAxO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcHVyZVswXSA9IDE7XG4gICAgICAgIHB1cmVbMV0gPSAwO1xuICAgICAgICBwdXJlWzJdID0gdztcbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXG5cbiAgICBtZyA9ICgxLjAgLSBjKSAqIGc7XG4gICAgcmV0dXJuIFsoYyAqIHB1cmVbMF0gKyBtZykgKiAyNTUsIChjICogcHVyZVsxXSArIG1nKSAqIDI1NSwgKGMgKiBwdXJlWzJdICsgbWcpICogMjU1XTtcbiAgfTtcblxuICBjb252ZXJ0JDEuaGNnLmhzdiA9IGZ1bmN0aW9uIChoY2cpIHtcbiAgICBjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuICAgIGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG4gICAgY29uc3QgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuICAgIGxldCBmID0gMDtcblxuICAgIGlmICh2ID4gMC4wKSB7XG4gICAgICBmID0gYyAvIHY7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoY2dbMF0sIGYgKiAxMDAsIHYgKiAxMDBdO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5oY2cuaHNsID0gZnVuY3Rpb24gKGhjZykge1xuICAgIGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG4gICAgY29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcbiAgICBjb25zdCBsID0gZyAqICgxLjAgLSBjKSArIDAuNSAqIGM7XG4gICAgbGV0IHMgPSAwO1xuXG4gICAgaWYgKGwgPiAwLjAgJiYgbCA8IDAuNSkge1xuICAgICAgcyA9IGMgLyAoMiAqIGwpO1xuICAgIH0gZWxzZSBpZiAobCA+PSAwLjUgJiYgbCA8IDEuMCkge1xuICAgICAgcyA9IGMgLyAoMiAqICgxIC0gbCkpO1xuICAgIH1cblxuICAgIHJldHVybiBbaGNnWzBdLCBzICogMTAwLCBsICogMTAwXTtcbiAgfTtcblxuICBjb252ZXJ0JDEuaGNnLmh3YiA9IGZ1bmN0aW9uIChoY2cpIHtcbiAgICBjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuICAgIGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG4gICAgY29uc3QgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuICAgIHJldHVybiBbaGNnWzBdLCAodiAtIGMpICogMTAwLCAoMSAtIHYpICogMTAwXTtcbiAgfTtcblxuICBjb252ZXJ0JDEuaHdiLmhjZyA9IGZ1bmN0aW9uIChod2IpIHtcbiAgICBjb25zdCB3ID0gaHdiWzFdIC8gMTAwO1xuICAgIGNvbnN0IGIgPSBod2JbMl0gLyAxMDA7XG4gICAgY29uc3QgdiA9IDEgLSBiO1xuICAgIGNvbnN0IGMgPSB2IC0gdztcbiAgICBsZXQgZyA9IDA7XG5cbiAgICBpZiAoYyA8IDEpIHtcbiAgICAgIGcgPSAodiAtIGMpIC8gKDEgLSBjKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2h3YlswXSwgYyAqIDEwMCwgZyAqIDEwMF07XG4gIH07XG5cbiAgY29udmVydCQxLmFwcGxlLnJnYiA9IGZ1bmN0aW9uIChhcHBsZSkge1xuICAgIHJldHVybiBbYXBwbGVbMF0gLyA2NTUzNSAqIDI1NSwgYXBwbGVbMV0gLyA2NTUzNSAqIDI1NSwgYXBwbGVbMl0gLyA2NTUzNSAqIDI1NV07XG4gIH07XG5cbiAgY29udmVydCQxLnJnYi5hcHBsZSA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICByZXR1cm4gW3JnYlswXSAvIDI1NSAqIDY1NTM1LCByZ2JbMV0gLyAyNTUgKiA2NTUzNSwgcmdiWzJdIC8gMjU1ICogNjU1MzVdO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5ncmF5LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgcmV0dXJuIFthcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1XTtcbiAgfTtcblxuICBjb252ZXJ0JDEuZ3JheS5oc2wgPSBmdW5jdGlvbiAoYXJncykge1xuICAgIHJldHVybiBbMCwgMCwgYXJnc1swXV07XG4gIH07XG5cbiAgY29udmVydCQxLmdyYXkuaHN2ID0gY29udmVydCQxLmdyYXkuaHNsO1xuXG4gIGNvbnZlcnQkMS5ncmF5Lmh3YiA9IGZ1bmN0aW9uIChncmF5KSB7XG4gICAgcmV0dXJuIFswLCAxMDAsIGdyYXlbMF1dO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5ncmF5LmNteWsgPSBmdW5jdGlvbiAoZ3JheSkge1xuICAgIHJldHVybiBbMCwgMCwgMCwgZ3JheVswXV07XG4gIH07XG5cbiAgY29udmVydCQxLmdyYXkubGFiID0gZnVuY3Rpb24gKGdyYXkpIHtcbiAgICByZXR1cm4gW2dyYXlbMF0sIDAsIDBdO1xuICB9O1xuXG4gIGNvbnZlcnQkMS5ncmF5LmhleCA9IGZ1bmN0aW9uIChncmF5KSB7XG4gICAgY29uc3QgdmFsID0gTWF0aC5yb3VuZChncmF5WzBdIC8gMTAwICogMjU1KSAmIDB4RkY7XG4gICAgY29uc3QgaW50ZWdlciA9ICh2YWwgPDwgMTYpICsgKHZhbCA8PCA4KSArIHZhbDtcbiAgICBjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG4gIH07XG5cbiAgY29udmVydCQxLnJnYi5ncmF5ID0gZnVuY3Rpb24gKHJnYikge1xuICAgIGNvbnN0IHZhbCA9IChyZ2JbMF0gKyByZ2JbMV0gKyByZ2JbMl0pIC8gMztcbiAgICByZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG4gIH07XG5cbiAgLypcbiAgXHRUaGlzIGZ1bmN0aW9uIHJvdXRlcyBhIG1vZGVsIHRvIGFsbCBvdGhlciBtb2RlbHMuXG5cbiAgXHRhbGwgZnVuY3Rpb25zIHRoYXQgYXJlIHJvdXRlZCBoYXZlIGEgcHJvcGVydHkgYC5jb252ZXJzaW9uYCBhdHRhY2hlZFxuICBcdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcbiAgXHRvZiBzdHJpbmdzLCBlYWNoIHdpdGggdGhlIHN0ZXBzIGluIGJldHdlZW4gdGhlICdmcm9tJyBhbmQgJ3RvJ1xuICBcdGNvbG9yIG1vZGVscyAoaW5jbHVzaXZlKS5cblxuICBcdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiAgKi9cblxuICBmdW5jdGlvbiBidWlsZEdyYXBoJDEoKSB7XG4gICAgY29uc3QgZ3JhcGggPSB7fTsgLy8gaHR0cHM6Ly9qc3BlcmYuY29tL29iamVjdC1rZXlzLXZzLWZvci1pbi13aXRoLWNsb3N1cmUvM1xuXG4gICAgY29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMkMSk7XG5cbiAgICBmb3IgKGxldCBsZW4gPSBtb2RlbHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBncmFwaFttb2RlbHNbaV1dID0ge1xuICAgICAgICAvLyBodHRwOi8vanNwZXJmLmNvbS8xLXZzLWluZmluaXR5XG4gICAgICAgIC8vIG1pY3JvLW9wdCwgYnV0IHRoaXMgaXMgc2ltcGxlLlxuICAgICAgICBkaXN0YW5jZTogLTEsXG4gICAgICAgIHBhcmVudDogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JhcGg7XG4gIH0gLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnJlYWR0aC1maXJzdF9zZWFyY2hcblxuXG4gIGZ1bmN0aW9uIGRlcml2ZUJGUyQxKGZyb21Nb2RlbCkge1xuICAgIGNvbnN0IGdyYXBoID0gYnVpbGRHcmFwaCQxKCk7XG4gICAgY29uc3QgcXVldWUgPSBbZnJvbU1vZGVsXTsgLy8gVW5zaGlmdCAtPiBxdWV1ZSAtPiBwb3BcblxuICAgIGdyYXBoW2Zyb21Nb2RlbF0uZGlzdGFuY2UgPSAwO1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuICAgICAgY29uc3QgYWRqYWNlbnRzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMkMVtjdXJyZW50XSk7XG5cbiAgICAgIGZvciAobGV0IGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3QgYWRqYWNlbnQgPSBhZGphY2VudHNbaV07XG4gICAgICAgIGNvbnN0IG5vZGUgPSBncmFwaFthZGphY2VudF07XG5cbiAgICAgICAgaWYgKG5vZGUuZGlzdGFuY2UgPT09IC0xKSB7XG4gICAgICAgICAgbm9kZS5kaXN0YW5jZSA9IGdyYXBoW2N1cnJlbnRdLmRpc3RhbmNlICsgMTtcbiAgICAgICAgICBub2RlLnBhcmVudCA9IGN1cnJlbnQ7XG4gICAgICAgICAgcXVldWUudW5zaGlmdChhZGphY2VudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZ3JhcGg7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5rJDEoZnJvbSwgdG8pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgIHJldHVybiB0byhmcm9tKGFyZ3MpKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gd3JhcENvbnZlcnNpb24kMSh0b01vZGVsLCBncmFwaCkge1xuICAgIGNvbnN0IHBhdGggPSBbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50LCB0b01vZGVsXTtcbiAgICBsZXQgZm4gPSBjb252ZXJzaW9ucyQxW2dyYXBoW3RvTW9kZWxdLnBhcmVudF1bdG9Nb2RlbF07XG4gICAgbGV0IGN1ciA9IGdyYXBoW3RvTW9kZWxdLnBhcmVudDtcblxuICAgIHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuICAgICAgcGF0aC51bnNoaWZ0KGdyYXBoW2N1cl0ucGFyZW50KTtcbiAgICAgIGZuID0gbGluayQxKGNvbnZlcnNpb25zJDFbZ3JhcGhbY3VyXS5wYXJlbnRdW2N1cl0sIGZuKTtcbiAgICAgIGN1ciA9IGdyYXBoW2N1cl0ucGFyZW50O1xuICAgIH1cblxuICAgIGZuLmNvbnZlcnNpb24gPSBwYXRoO1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciByb3V0ZSQxID0gZnVuY3Rpb24gcm91dGUoZnJvbU1vZGVsKSB7XG4gICAgY29uc3QgZ3JhcGggPSBkZXJpdmVCRlMkMShmcm9tTW9kZWwpO1xuICAgIGNvbnN0IGNvbnZlcnNpb24gPSB7fTtcbiAgICBjb25zdCBtb2RlbHMgPSBPYmplY3Qua2V5cyhncmFwaCk7XG5cbiAgICBmb3IgKGxldCBsZW4gPSBtb2RlbHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCB0b01vZGVsID0gbW9kZWxzW2ldO1xuICAgICAgY29uc3Qgbm9kZSA9IGdyYXBoW3RvTW9kZWxdO1xuXG4gICAgICBpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gTm8gcG9zc2libGUgY29udmVyc2lvbiwgb3IgdGhpcyBub2RlIGlzIHRoZSBzb3VyY2UgbW9kZWwuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb252ZXJzaW9uW3RvTW9kZWxdID0gd3JhcENvbnZlcnNpb24kMSh0b01vZGVsLCBncmFwaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnZlcnNpb247XG4gIH07XG5cbiAgY29uc3QgY29udmVydCQyID0ge307XG4gIGNvbnN0IG1vZGVscyQxID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMkMSk7XG5cbiAgZnVuY3Rpb24gd3JhcFJhdyQxKGZuKSB7XG4gICAgY29uc3Qgd3JhcHBlZEZuID0gZnVuY3Rpb24gd3JhcHBlZEZuKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IGFyZzAgPSBhcmdzWzBdO1xuXG4gICAgICBpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGFyZzA7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgYXJncyA9IGFyZzA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihhcmdzKTtcbiAgICB9OyAvLyBQcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblxuXG4gICAgaWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuICAgICAgd3JhcHBlZEZuLmNvbnZlcnNpb24gPSBmbi5jb252ZXJzaW9uO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwcGVkRm47XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwUm91bmRlZCQxKGZuKSB7XG4gICAgY29uc3Qgd3JhcHBlZEZuID0gZnVuY3Rpb24gd3JhcHBlZEZuKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IGFyZzAgPSBhcmdzWzBdO1xuXG4gICAgICBpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGFyZzA7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgYXJncyA9IGFyZzA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZuKGFyZ3MpOyAvLyBXZSdyZSBhc3N1bWluZyB0aGUgcmVzdWx0IGlzIGFuIGFycmF5IGhlcmUuXG4gICAgICAvLyBzZWUgbm90aWNlIGluIGNvbnZlcnNpb25zLmpzOyBkb24ndCB1c2UgYm94IHR5cGVzXG4gICAgICAvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAobGV0IGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICByZXN1bHRbaV0gPSBNYXRoLnJvdW5kKHJlc3VsdFtpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9OyAvLyBQcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblxuXG4gICAgaWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuICAgICAgd3JhcHBlZEZuLmNvbnZlcnNpb24gPSBmbi5jb252ZXJzaW9uO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwcGVkRm47XG4gIH1cblxuICBtb2RlbHMkMS5mb3JFYWNoKGZyb21Nb2RlbCA9PiB7XG4gICAgY29udmVydCQyW2Zyb21Nb2RlbF0gPSB7fTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydCQyW2Zyb21Nb2RlbF0sICdjaGFubmVscycsIHtcbiAgICAgIHZhbHVlOiBjb252ZXJzaW9ucyQxW2Zyb21Nb2RlbF0uY2hhbm5lbHNcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydCQyW2Zyb21Nb2RlbF0sICdsYWJlbHMnLCB7XG4gICAgICB2YWx1ZTogY29udmVyc2lvbnMkMVtmcm9tTW9kZWxdLmxhYmVsc1xuICAgIH0pO1xuICAgIGNvbnN0IHJvdXRlcyA9IHJvdXRlJDEoZnJvbU1vZGVsKTtcbiAgICBjb25zdCByb3V0ZU1vZGVscyA9IE9iamVjdC5rZXlzKHJvdXRlcyk7XG4gICAgcm91dGVNb2RlbHMuZm9yRWFjaCh0b01vZGVsID0+IHtcbiAgICAgIGNvbnN0IGZuID0gcm91dGVzW3RvTW9kZWxdO1xuICAgICAgY29udmVydCQyW2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZCQxKGZuKTtcbiAgICAgIGNvbnZlcnQkMltmcm9tTW9kZWxdW3RvTW9kZWxdLnJhdyA9IHdyYXBSYXckMShmbik7XG4gICAgfSk7XG4gIH0pO1xuICB2YXIgY29sb3JDb252ZXJ0JDEgPSBjb252ZXJ0JDI7XG5cbiAgdmFyIGFuc2lTdHlsZXMkMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcblxuICAgIGNvbnN0IHdyYXBBbnNpMTYgPSAoZm4sIG9mZnNldCkgPT4gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGNvZGUgPSBmbiguLi5hcmdzKTtcbiAgICAgIHJldHVybiBcIlxceDFCW1wiLmNvbmNhdChjb2RlICsgb2Zmc2V0LCBcIm1cIik7XG4gICAgfTtcblxuICAgIGNvbnN0IHdyYXBBbnNpMjU2ID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBjb2RlID0gZm4oLi4uYXJncyk7XG4gICAgICByZXR1cm4gXCJcXHgxQltcIi5jb25jYXQoMzggKyBvZmZzZXQsIFwiOzU7XCIpLmNvbmNhdChjb2RlLCBcIm1cIik7XG4gICAgfTtcblxuICAgIGNvbnN0IHdyYXBBbnNpMTZtID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCByZ2IgPSBmbiguLi5hcmdzKTtcbiAgICAgIHJldHVybiBcIlxceDFCW1wiLmNvbmNhdCgzOCArIG9mZnNldCwgXCI7MjtcIikuY29uY2F0KHJnYlswXSwgXCI7XCIpLmNvbmNhdChyZ2JbMV0sIFwiO1wiKS5jb25jYXQocmdiWzJdLCBcIm1cIik7XG4gICAgfTtcblxuICAgIGNvbnN0IGFuc2kyYW5zaSA9IG4gPT4gbjtcblxuICAgIGNvbnN0IHJnYjJyZ2IgPSAociwgZywgYikgPT4gW3IsIGcsIGJdO1xuXG4gICAgY29uc3Qgc2V0TGF6eVByb3BlcnR5ID0gKG9iamVjdCwgcHJvcGVydHksIF9nZXQpID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gX2dldCgpO1xuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnY29sb3ItY29udmVydCcpfSAqL1xuXG5cbiAgICBsZXQgY29sb3JDb252ZXJ0O1xuXG4gICAgY29uc3QgbWFrZUR5bmFtaWNTdHlsZXMgPSAod3JhcCwgdGFyZ2V0U3BhY2UsIGlkZW50aXR5LCBpc0JhY2tncm91bmQpID0+IHtcbiAgICAgIGlmIChjb2xvckNvbnZlcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb2xvckNvbnZlcnQgPSBjb2xvckNvbnZlcnQkMTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2Zmc2V0ID0gaXNCYWNrZ3JvdW5kID8gMTAgOiAwO1xuICAgICAgY29uc3Qgc3R5bGVzID0ge307XG5cbiAgICAgIGZvciAoY29uc3QgW3NvdXJjZVNwYWNlLCBzdWl0ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29sb3JDb252ZXJ0KSkge1xuICAgICAgICBjb25zdCBuYW1lID0gc291cmNlU3BhY2UgPT09ICdhbnNpMTYnID8gJ2Fuc2knIDogc291cmNlU3BhY2U7XG5cbiAgICAgICAgaWYgKHNvdXJjZVNwYWNlID09PSB0YXJnZXRTcGFjZSkge1xuICAgICAgICAgIHN0eWxlc1tuYW1lXSA9IHdyYXAoaWRlbnRpdHksIG9mZnNldCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN1aXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHN0eWxlc1tuYW1lXSA9IHdyYXAoc3VpdGVbdGFyZ2V0U3BhY2VdLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHlsZXM7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFzc2VtYmxlU3R5bGVzKCkge1xuICAgICAgY29uc3QgY29kZXMgPSBuZXcgTWFwKCk7XG4gICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgIG1vZGlmaWVyOiB7XG4gICAgICAgICAgcmVzZXQ6IFswLCAwXSxcbiAgICAgICAgICAvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG4gICAgICAgICAgYm9sZDogWzEsIDIyXSxcbiAgICAgICAgICBkaW06IFsyLCAyMl0sXG4gICAgICAgICAgaXRhbGljOiBbMywgMjNdLFxuICAgICAgICAgIHVuZGVybGluZTogWzQsIDI0XSxcbiAgICAgICAgICBpbnZlcnNlOiBbNywgMjddLFxuICAgICAgICAgIGhpZGRlbjogWzgsIDI4XSxcbiAgICAgICAgICBzdHJpa2V0aHJvdWdoOiBbOSwgMjldXG4gICAgICAgIH0sXG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgYmxhY2s6IFszMCwgMzldLFxuICAgICAgICAgIHJlZDogWzMxLCAzOV0sXG4gICAgICAgICAgZ3JlZW46IFszMiwgMzldLFxuICAgICAgICAgIHllbGxvdzogWzMzLCAzOV0sXG4gICAgICAgICAgYmx1ZTogWzM0LCAzOV0sXG4gICAgICAgICAgbWFnZW50YTogWzM1LCAzOV0sXG4gICAgICAgICAgY3lhbjogWzM2LCAzOV0sXG4gICAgICAgICAgd2hpdGU6IFszNywgMzldLFxuICAgICAgICAgIC8vIEJyaWdodCBjb2xvclxuICAgICAgICAgIGJsYWNrQnJpZ2h0OiBbOTAsIDM5XSxcbiAgICAgICAgICByZWRCcmlnaHQ6IFs5MSwgMzldLFxuICAgICAgICAgIGdyZWVuQnJpZ2h0OiBbOTIsIDM5XSxcbiAgICAgICAgICB5ZWxsb3dCcmlnaHQ6IFs5MywgMzldLFxuICAgICAgICAgIGJsdWVCcmlnaHQ6IFs5NCwgMzldLFxuICAgICAgICAgIG1hZ2VudGFCcmlnaHQ6IFs5NSwgMzldLFxuICAgICAgICAgIGN5YW5CcmlnaHQ6IFs5NiwgMzldLFxuICAgICAgICAgIHdoaXRlQnJpZ2h0OiBbOTcsIDM5XVxuICAgICAgICB9LFxuICAgICAgICBiZ0NvbG9yOiB7XG4gICAgICAgICAgYmdCbGFjazogWzQwLCA0OV0sXG4gICAgICAgICAgYmdSZWQ6IFs0MSwgNDldLFxuICAgICAgICAgIGJnR3JlZW46IFs0MiwgNDldLFxuICAgICAgICAgIGJnWWVsbG93OiBbNDMsIDQ5XSxcbiAgICAgICAgICBiZ0JsdWU6IFs0NCwgNDldLFxuICAgICAgICAgIGJnTWFnZW50YTogWzQ1LCA0OV0sXG4gICAgICAgICAgYmdDeWFuOiBbNDYsIDQ5XSxcbiAgICAgICAgICBiZ1doaXRlOiBbNDcsIDQ5XSxcbiAgICAgICAgICAvLyBCcmlnaHQgY29sb3JcbiAgICAgICAgICBiZ0JsYWNrQnJpZ2h0OiBbMTAwLCA0OV0sXG4gICAgICAgICAgYmdSZWRCcmlnaHQ6IFsxMDEsIDQ5XSxcbiAgICAgICAgICBiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG4gICAgICAgICAgYmdZZWxsb3dCcmlnaHQ6IFsxMDMsIDQ5XSxcbiAgICAgICAgICBiZ0JsdWVCcmlnaHQ6IFsxMDQsIDQ5XSxcbiAgICAgICAgICBiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcbiAgICAgICAgICBiZ0N5YW5CcmlnaHQ6IFsxMDYsIDQ5XSxcbiAgICAgICAgICBiZ1doaXRlQnJpZ2h0OiBbMTA3LCA0OV1cbiAgICAgICAgfVxuICAgICAgfTsgLy8gQWxpYXMgYnJpZ2h0IGJsYWNrIGFzIGdyYXkgKGFuZCBncmV5KVxuXG4gICAgICBzdHlsZXMuY29sb3IuZ3JheSA9IHN0eWxlcy5jb2xvci5ibGFja0JyaWdodDtcbiAgICAgIHN0eWxlcy5iZ0NvbG9yLmJnR3JheSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG4gICAgICBzdHlsZXMuY29sb3IuZ3JleSA9IHN0eWxlcy5jb2xvci5ibGFja0JyaWdodDtcbiAgICAgIHN0eWxlcy5iZ0NvbG9yLmJnR3JleSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cbiAgICAgIGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZV0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXApKSB7XG4gICAgICAgICAgc3R5bGVzW3N0eWxlTmFtZV0gPSB7XG4gICAgICAgICAgICBvcGVuOiBcIlxceDFCW1wiLmNvbmNhdChzdHlsZVswXSwgXCJtXCIpLFxuICAgICAgICAgICAgY2xvc2U6IFwiXFx4MUJbXCIuY29uY2F0KHN0eWxlWzFdLCBcIm1cIilcbiAgICAgICAgICB9O1xuICAgICAgICAgIGdyb3VwW3N0eWxlTmFtZV0gPSBzdHlsZXNbc3R5bGVOYW1lXTtcbiAgICAgICAgICBjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsIGdyb3VwTmFtZSwge1xuICAgICAgICAgIHZhbHVlOiBncm91cCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcywgJ2NvZGVzJywge1xuICAgICAgICB2YWx1ZTogY29kZXMsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHN0eWxlcy5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG4gICAgICBzdHlsZXMuYmdDb2xvci5jbG9zZSA9ICdcXHUwMDFCWzQ5bSc7XG4gICAgICBzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmNvbG9yLCAnYW5zaScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTYsICdhbnNpMTYnLCBhbnNpMmFuc2ksIGZhbHNlKSk7XG4gICAgICBzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmNvbG9yLCAnYW5zaTI1NicsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMjU2LCAnYW5zaTI1NicsIGFuc2kyYW5zaSwgZmFsc2UpKTtcbiAgICAgIHNldExhenlQcm9wZXJ0eShzdHlsZXMuY29sb3IsICdhbnNpMTZtJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNm0sICdyZ2InLCByZ2IycmdiLCBmYWxzZSkpO1xuICAgICAgc2V0TGF6eVByb3BlcnR5KHN0eWxlcy5iZ0NvbG9yLCAnYW5zaScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTYsICdhbnNpMTYnLCBhbnNpMmFuc2ksIHRydWUpKTtcbiAgICAgIHNldExhenlQcm9wZXJ0eShzdHlsZXMuYmdDb2xvciwgJ2Fuc2kyNTYnLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTI1NiwgJ2Fuc2kyNTYnLCBhbnNpMmFuc2ksIHRydWUpKTtcbiAgICAgIHNldExhenlQcm9wZXJ0eShzdHlsZXMuYmdDb2xvciwgJ2Fuc2kxNm0nLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTE2bSwgJ3JnYicsIHJnYjJyZ2IsIHRydWUpKTtcbiAgICAgIHJldHVybiBzdHlsZXM7XG4gICAgfSAvLyBNYWtlIHRoZSBleHBvcnQgaW1tdXRhYmxlXG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsICdleHBvcnRzJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogYXNzZW1ibGVTdHlsZXNcbiAgICB9KTtcbiAgfSk7XG5cbiAgdmFyIHR0eSA9IHtcbiAgICBpc2F0dHkoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gIH07XG5cbiAgdmFyIGhhc0ZsYWckMSA9IChmbGFnLCBhcmd2ID0gcHJvY2Vzcy5hcmd2KSA9PiB7XG4gICAgY29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IGZsYWcubGVuZ3RoID09PSAxID8gJy0nIDogJy0tJztcbiAgICBjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcbiAgICBjb25zdCB0ZXJtaW5hdG9yUG9zaXRpb24gPSBhcmd2LmluZGV4T2YoJy0tJyk7XG4gICAgcmV0dXJuIHBvc2l0aW9uICE9PSAtMSAmJiAodGVybWluYXRvclBvc2l0aW9uID09PSAtMSB8fCBwb3NpdGlvbiA8IHRlcm1pbmF0b3JQb3NpdGlvbik7XG4gIH07XG5cbiAgY29uc3Qge1xuICAgIGVudjogZW52JDJcbiAgfSA9IHByb2Nlc3M7XG4gIGxldCBmb3JjZUNvbG9yJDE7XG5cbiAgaWYgKGhhc0ZsYWckMSgnbm8tY29sb3InKSB8fCBoYXNGbGFnJDEoJ25vLWNvbG9ycycpIHx8IGhhc0ZsYWckMSgnY29sb3I9ZmFsc2UnKSB8fCBoYXNGbGFnJDEoJ2NvbG9yPW5ldmVyJykpIHtcbiAgICBmb3JjZUNvbG9yJDEgPSAwO1xuICB9IGVsc2UgaWYgKGhhc0ZsYWckMSgnY29sb3InKSB8fCBoYXNGbGFnJDEoJ2NvbG9ycycpIHx8IGhhc0ZsYWckMSgnY29sb3I9dHJ1ZScpIHx8IGhhc0ZsYWckMSgnY29sb3I9YWx3YXlzJykpIHtcbiAgICBmb3JjZUNvbG9yJDEgPSAxO1xuICB9XG5cbiAgaWYgKCdGT1JDRV9DT0xPUicgaW4gZW52JDIpIHtcbiAgICBpZiAoZW52JDIuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuICAgICAgZm9yY2VDb2xvciQxID0gMTtcbiAgICB9IGVsc2UgaWYgKGVudiQyLkZPUkNFX0NPTE9SID09PSAnZmFsc2UnKSB7XG4gICAgICBmb3JjZUNvbG9yJDEgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JjZUNvbG9yJDEgPSBlbnYkMi5GT1JDRV9DT0xPUi5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4ocGFyc2VJbnQoZW52JDIuRk9SQ0VfQ09MT1IsIDEwKSwgMyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlTGV2ZWwkMShsZXZlbCkge1xuICAgIGlmIChsZXZlbCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsZXZlbCxcbiAgICAgIGhhc0Jhc2ljOiB0cnVlLFxuICAgICAgaGFzMjU2OiBsZXZlbCA+PSAyLFxuICAgICAgaGFzMTZtOiBsZXZlbCA+PSAzXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN1cHBvcnRzQ29sb3IkMShoYXZlU3RyZWFtLCBzdHJlYW1Jc1RUWSkge1xuICAgIGlmIChmb3JjZUNvbG9yJDEgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmIChoYXNGbGFnJDEoJ2NvbG9yPTE2bScpIHx8IGhhc0ZsYWckMSgnY29sb3I9ZnVsbCcpIHx8IGhhc0ZsYWckMSgnY29sb3I9dHJ1ZWNvbG9yJykpIHtcbiAgICAgIHJldHVybiAzO1xuICAgIH1cblxuICAgIGlmIChoYXNGbGFnJDEoJ2NvbG9yPTI1NicpKSB7XG4gICAgICByZXR1cm4gMjtcbiAgICB9XG5cbiAgICBpZiAoaGF2ZVN0cmVhbSAmJiAhc3RyZWFtSXNUVFkgJiYgZm9yY2VDb2xvciQxID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbiA9IGZvcmNlQ29sb3IkMSB8fCAwO1xuXG4gICAgaWYgKGVudiQyLlRFUk0gPT09ICdkdW1iJykge1xuICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgLy8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cbiAgICAgIC8vIFdpbmRvd3MgMTAgYnVpbGQgMTQ5MzEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAxNm0vVHJ1ZUNvbG9yLlxuICAgICAgY29uc3Qgb3NSZWxlYXNlID0gcmVxdWlyZSQkMCQxLnJlbGVhc2UoKS5zcGxpdCgnLicpO1xuXG4gICAgICBpZiAoTnVtYmVyKG9zUmVsZWFzZVswXSkgPj0gMTAgJiYgTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTA1ODYpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDE0OTMxID8gMyA6IDI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmICgnQ0knIGluIGVudiQyKSB7XG4gICAgICBpZiAoWydUUkFWSVMnLCAnQ0lSQ0xFQ0knLCAnQVBQVkVZT1InLCAnR0lUTEFCX0NJJ10uc29tZShzaWduID0+IHNpZ24gaW4gZW52JDIpIHx8IGVudiQyLkNJX05BTUUgPT09ICdjb2Rlc2hpcCcpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtaW47XG4gICAgfVxuXG4gICAgaWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYkMikge1xuICAgICAgcmV0dXJuIC9eKDlcXC4oMCpbMS05XVxcZCopXFwufFxcZHsyLH1cXC4pLy50ZXN0KGVudiQyLlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG4gICAgfVxuXG4gICAgaWYgKCdHSVRIVUJfQUNUSU9OUycgaW4gZW52JDIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmIChlbnYkMi5DT0xPUlRFUk0gPT09ICd0cnVlY29sb3InKSB7XG4gICAgICByZXR1cm4gMztcbiAgICB9XG5cbiAgICBpZiAoJ1RFUk1fUFJPR1JBTScgaW4gZW52JDIpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBwYXJzZUludCgoZW52JDIuVEVSTV9QUk9HUkFNX1ZFUlNJT04gfHwgJycpLnNwbGl0KCcuJylbMF0sIDEwKTtcblxuICAgICAgc3dpdGNoIChlbnYkMi5URVJNX1BST0dSQU0pIHtcbiAgICAgICAgY2FzZSAnaVRlcm0uYXBwJzpcbiAgICAgICAgICByZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cbiAgICAgICAgY2FzZSAnQXBwbGVfVGVybWluYWwnOlxuICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICAvLyBObyBkZWZhdWx0XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKC8tMjU2KGNvbG9yKT8kL2kudGVzdChlbnYkMi5URVJNKSkge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfVxuXG4gICAgaWYgKC9ec2NyZWVufF54dGVybXxednQxMDB8XnZ0MjIwfF5yeHZ0fGNvbG9yfGFuc2l8Y3lnd2lufGxpbnV4L2kudGVzdChlbnYkMi5URVJNKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgaWYgKCdDT0xPUlRFUk0nIGluIGVudiQyKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWluO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3VwcG9ydExldmVsJDEoc3RyZWFtKSB7XG4gICAgY29uc3QgbGV2ZWwgPSBzdXBwb3J0c0NvbG9yJDEoc3RyZWFtLCBzdHJlYW0gJiYgc3RyZWFtLmlzVFRZKTtcbiAgICByZXR1cm4gdHJhbnNsYXRlTGV2ZWwkMShsZXZlbCk7XG4gIH1cblxuICB2YXIgc3VwcG9ydHNDb2xvcl8xJDEgPSB7XG4gICAgc3VwcG9ydHNDb2xvcjogZ2V0U3VwcG9ydExldmVsJDEsXG4gICAgc3Rkb3V0OiB0cmFuc2xhdGVMZXZlbCQxKHN1cHBvcnRzQ29sb3IkMSh0cnVlLCB0dHkuaXNhdHR5KDEpKSksXG4gICAgc3RkZXJyOiB0cmFuc2xhdGVMZXZlbCQxKHN1cHBvcnRzQ29sb3IkMSh0cnVlLCB0dHkuaXNhdHR5KDIpKSlcbiAgfTtcblxuICBjb25zdCBzdHJpbmdSZXBsYWNlQWxsID0gKHN0cmluZywgc3Vic3RyaW5nLCByZXBsYWNlcikgPT4ge1xuICAgIGxldCBpbmRleCA9IHN0cmluZy5pbmRleE9mKHN1YnN0cmluZyk7XG5cbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnN0cmluZ0xlbmd0aCA9IHN1YnN0cmluZy5sZW5ndGg7XG4gICAgbGV0IGVuZEluZGV4ID0gMDtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSAnJztcblxuICAgIGRvIHtcbiAgICAgIHJldHVyblZhbHVlICs9IHN0cmluZy5zdWJzdHIoZW5kSW5kZXgsIGluZGV4IC0gZW5kSW5kZXgpICsgc3Vic3RyaW5nICsgcmVwbGFjZXI7XG4gICAgICBlbmRJbmRleCA9IGluZGV4ICsgc3Vic3RyaW5nTGVuZ3RoO1xuICAgICAgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihzdWJzdHJpbmcsIGVuZEluZGV4KTtcbiAgICB9IHdoaWxlIChpbmRleCAhPT0gLTEpO1xuXG4gICAgcmV0dXJuVmFsdWUgKz0gc3RyaW5nLnN1YnN0cihlbmRJbmRleCk7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9O1xuXG4gIGNvbnN0IHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleCA9IChzdHJpbmcsIHByZWZpeCwgcG9zdGZpeCwgaW5kZXgpID0+IHtcbiAgICBsZXQgZW5kSW5kZXggPSAwO1xuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgZ290Q1IgPSBzdHJpbmdbaW5kZXggLSAxXSA9PT0gJ1xccic7XG4gICAgICByZXR1cm5WYWx1ZSArPSBzdHJpbmcuc3Vic3RyKGVuZEluZGV4LCAoZ290Q1IgPyBpbmRleCAtIDEgOiBpbmRleCkgLSBlbmRJbmRleCkgKyBwcmVmaXggKyAoZ290Q1IgPyAnXFxyXFxuJyA6ICdcXG4nKSArIHBvc3RmaXg7XG4gICAgICBlbmRJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIGluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1xcbicsIGVuZEluZGV4KTtcbiAgICB9IHdoaWxlIChpbmRleCAhPT0gLTEpO1xuXG4gICAgcmV0dXJuVmFsdWUgKz0gc3RyaW5nLnN1YnN0cihlbmRJbmRleCk7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9O1xuXG4gIHZhciB1dGlsID0ge1xuICAgIHN0cmluZ1JlcGxhY2VBbGwsXG4gICAgc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4XG4gIH07XG5cbiAgY29uc3QgVEVNUExBVEVfUkVHRVgkMSA9IC8oPzpcXFxcKHUoPzpbYS1mXFxkXXs0fXxcXHtbYS1mXFxkXXsxLDZ9XFx9KXx4W2EtZlxcZF17Mn18LikpfCg/Olxceyh+KT8oXFx3Kyg/OlxcKFteKV0qXFwpKT8oPzpcXC5cXHcrKD86XFwoW14pXSpcXCkpPykqKSg/OlsgXFx0XXwoPz1cXHI/XFxuKSkpfChcXH0pfCgoPzoufFtcXHJcXG5cXGZdKSs/KS9naTtcbiAgY29uc3QgU1RZTEVfUkVHRVgkMSA9IC8oPzpefFxcLikoXFx3KykoPzpcXCgoW14pXSopXFwpKT8vZztcbiAgY29uc3QgU1RSSU5HX1JFR0VYJDEgPSAvXihbJ1wiXSkoKD86XFxcXC58KD8hXFwxKVteXFxcXF0pKilcXDEkLztcbiAgY29uc3QgRVNDQVBFX1JFR0VYJDEgPSAvXFxcXCh1KD86W2EtZlxcZF17NH18e1thLWZcXGRdezEsNn19KXx4W2EtZlxcZF17Mn18Lil8KFteXFxcXF0pL2dpO1xuICBjb25zdCBFU0NBUEVTJDEgPSBuZXcgTWFwKFtbJ24nLCAnXFxuJ10sIFsncicsICdcXHInXSwgWyd0JywgJ1xcdCddLCBbJ2InLCAnXFxiJ10sIFsnZicsICdcXGYnXSwgWyd2JywgJ1xcdiddLCBbJzAnLCAnXFwwJ10sIFsnXFxcXCcsICdcXFxcJ10sIFsnZScsICdcXHUwMDFCJ10sIFsnYScsICdcXHUwMDA3J11dKTtcblxuICBmdW5jdGlvbiB1bmVzY2FwZSQxKGMpIHtcbiAgICBjb25zdCB1ID0gY1swXSA9PT0gJ3UnO1xuICAgIGNvbnN0IGJyYWNrZXQgPSBjWzFdID09PSAneyc7XG5cbiAgICBpZiAodSAmJiAhYnJhY2tldCAmJiBjLmxlbmd0aCA9PT0gNSB8fCBjWzBdID09PSAneCcgJiYgYy5sZW5ndGggPT09IDMpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGMuc2xpY2UoMSksIDE2KSk7XG4gICAgfVxuXG4gICAgaWYgKHUgJiYgYnJhY2tldCkge1xuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KHBhcnNlSW50KGMuc2xpY2UoMiwgLTEpLCAxNikpO1xuICAgIH1cblxuICAgIHJldHVybiBFU0NBUEVTJDEuZ2V0KGMpIHx8IGM7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUFyZ3VtZW50cyQxKG5hbWUsIGFyZ3VtZW50c18pIHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgY29uc3QgY2h1bmtzID0gYXJndW1lbnRzXy50cmltKCkuc3BsaXQoL1xccyosXFxzKi9nKTtcbiAgICBsZXQgbWF0Y2hlcztcblxuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICBjb25zdCBudW1iZXIgPSBOdW1iZXIoY2h1bmspO1xuXG4gICAgICBpZiAoIU51bWJlci5pc05hTihudW1iZXIpKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChudW1iZXIpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaGVzID0gY2h1bmsubWF0Y2goU1RSSU5HX1JFR0VYJDEpKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChtYXRjaGVzWzJdLnJlcGxhY2UoRVNDQVBFX1JFR0VYJDEsIChtLCBlc2NhcGUsIGNoYXJhY3RlcikgPT4gZXNjYXBlID8gdW5lc2NhcGUkMShlc2NhcGUpIDogY2hhcmFjdGVyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIENoYWxrIHRlbXBsYXRlIHN0eWxlIGFyZ3VtZW50OiBcIi5jb25jYXQoY2h1bmssIFwiIChpbiBzdHlsZSAnXCIpLmNvbmNhdChuYW1lLCBcIicpXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlU3R5bGUkMShzdHlsZSkge1xuICAgIFNUWUxFX1JFR0VYJDEubGFzdEluZGV4ID0gMDtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgbGV0IG1hdGNoZXM7XG5cbiAgICB3aGlsZSAoKG1hdGNoZXMgPSBTVFlMRV9SRUdFWCQxLmV4ZWMoc3R5bGUpKSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbmFtZSA9IG1hdGNoZXNbMV07XG5cbiAgICAgIGlmIChtYXRjaGVzWzJdKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwYXJzZUFyZ3VtZW50cyQxKG5hbWUsIG1hdGNoZXNbMl0pO1xuICAgICAgICByZXN1bHRzLnB1c2goW25hbWVdLmNvbmNhdChhcmdzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRzLnB1c2goW25hbWVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkU3R5bGUkMShjaGFsaywgc3R5bGVzKSB7XG4gICAgY29uc3QgZW5hYmxlZCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBsYXllciBvZiBzdHlsZXMpIHtcbiAgICAgIGZvciAoY29uc3Qgc3R5bGUgb2YgbGF5ZXIuc3R5bGVzKSB7XG4gICAgICAgIGVuYWJsZWRbc3R5bGVbMF1dID0gbGF5ZXIuaW52ZXJzZSA/IG51bGwgOiBzdHlsZS5zbGljZSgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY3VycmVudCA9IGNoYWxrO1xuXG4gICAgZm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZXNdIG9mIE9iamVjdC5lbnRyaWVzKGVuYWJsZWQpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3R5bGVzKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoc3R5bGVOYW1lIGluIGN1cnJlbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gQ2hhbGsgc3R5bGU6IFwiLmNvbmNhdChzdHlsZU5hbWUpKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudCA9IHN0eWxlcy5sZW5ndGggPiAwID8gY3VycmVudFtzdHlsZU5hbWVdKC4uLnN0eWxlcykgOiBjdXJyZW50W3N0eWxlTmFtZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICB2YXIgdGVtcGxhdGVzJDEgPSAoY2hhbGssIHRlbXBvcmFyeSkgPT4ge1xuICAgIGNvbnN0IHN0eWxlcyA9IFtdO1xuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGxldCBjaHVuayA9IFtdOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuXG4gICAgdGVtcG9yYXJ5LnJlcGxhY2UoVEVNUExBVEVfUkVHRVgkMSwgKG0sIGVzY2FwZUNoYXJhY3RlciwgaW52ZXJzZSwgc3R5bGUsIGNsb3NlLCBjaGFyYWN0ZXIpID0+IHtcbiAgICAgIGlmIChlc2NhcGVDaGFyYWN0ZXIpIHtcbiAgICAgICAgY2h1bmsucHVzaCh1bmVzY2FwZSQxKGVzY2FwZUNoYXJhY3RlcikpO1xuICAgICAgfSBlbHNlIGlmIChzdHlsZSkge1xuICAgICAgICBjb25zdCBzdHJpbmcgPSBjaHVuay5qb2luKCcnKTtcbiAgICAgICAgY2h1bmsgPSBbXTtcbiAgICAgICAgY2h1bmtzLnB1c2goc3R5bGVzLmxlbmd0aCA9PT0gMCA/IHN0cmluZyA6IGJ1aWxkU3R5bGUkMShjaGFsaywgc3R5bGVzKShzdHJpbmcpKTtcbiAgICAgICAgc3R5bGVzLnB1c2goe1xuICAgICAgICAgIGludmVyc2UsXG4gICAgICAgICAgc3R5bGVzOiBwYXJzZVN0eWxlJDEoc3R5bGUpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChjbG9zZSkge1xuICAgICAgICBpZiAoc3R5bGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgZXh0cmFuZW91cyB9IGluIENoYWxrIHRlbXBsYXRlIGxpdGVyYWwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNodW5rcy5wdXNoKGJ1aWxkU3R5bGUkMShjaGFsaywgc3R5bGVzKShjaHVuay5qb2luKCcnKSkpO1xuICAgICAgICBjaHVuayA9IFtdO1xuICAgICAgICBzdHlsZXMucG9wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaHVuay5wdXNoKGNoYXJhY3Rlcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY2h1bmtzLnB1c2goY2h1bmsuam9pbignJykpO1xuXG4gICAgaWYgKHN0eWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBlcnJNZXNzYWdlID0gXCJDaGFsayB0ZW1wbGF0ZSBsaXRlcmFsIGlzIG1pc3NpbmcgXCIuY29uY2F0KHN0eWxlcy5sZW5ndGgsIFwiIGNsb3NpbmcgYnJhY2tldFwiKS5jb25jYXQoc3R5bGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnLCBcIiAoYH1gKVwiKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2h1bmtzLmpvaW4oJycpO1xuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBzdGRvdXQ6IHN0ZG91dENvbG9yLFxuICAgIHN0ZGVycjogc3RkZXJyQ29sb3JcbiAgfSA9IHN1cHBvcnRzQ29sb3JfMSQxO1xuICBjb25zdCB7XG4gICAgc3RyaW5nUmVwbGFjZUFsbDogc3RyaW5nUmVwbGFjZUFsbCQxLFxuICAgIHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleDogc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4JDFcbiAgfSA9IHV0aWw7IC8vIGBzdXBwb3J0c0NvbG9yLmxldmVsYCDihpIgYGFuc2lTdHlsZXMuY29sb3JbbmFtZV1gIG1hcHBpbmdcblxuICBjb25zdCBsZXZlbE1hcHBpbmcgPSBbJ2Fuc2knLCAnYW5zaScsICdhbnNpMjU2JywgJ2Fuc2kxNm0nXTtcbiAgY29uc3Qgc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBjb25zdCBhcHBseU9wdGlvbnMgPSAob2JqZWN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBpZiAob3B0aW9ucy5sZXZlbCAmJiAhKE51bWJlci5pc0ludGVnZXIob3B0aW9ucy5sZXZlbCkgJiYgb3B0aW9ucy5sZXZlbCA+PSAwICYmIG9wdGlvbnMubGV2ZWwgPD0gMykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBsZXZlbGAgb3B0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMCB0byAzJyk7XG4gICAgfSAvLyBEZXRlY3QgbGV2ZWwgaWYgbm90IHNldCBtYW51YWxseVxuXG5cbiAgICBjb25zdCBjb2xvckxldmVsID0gc3Rkb3V0Q29sb3IgPyBzdGRvdXRDb2xvci5sZXZlbCA6IDA7XG4gICAgb2JqZWN0LmxldmVsID0gb3B0aW9ucy5sZXZlbCA9PT0gdW5kZWZpbmVkID8gY29sb3JMZXZlbCA6IG9wdGlvbnMubGV2ZWw7XG4gIH07XG5cbiAgY2xhc3MgQ2hhbGtDbGFzcyB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0cnVjdG9yLXJldHVyblxuICAgICAgcmV0dXJuIGNoYWxrRmFjdG9yeShvcHRpb25zKTtcbiAgICB9XG5cbiAgfVxuXG4gIGNvbnN0IGNoYWxrRmFjdG9yeSA9IG9wdGlvbnMgPT4ge1xuICAgIGNvbnN0IGNoYWxrID0ge307XG4gICAgYXBwbHlPcHRpb25zKGNoYWxrLCBvcHRpb25zKTtcblxuICAgIGNoYWxrLnRlbXBsYXRlID0gKC4uLmFyZ3VtZW50c18pID0+IGNoYWxrVGFnKGNoYWxrLnRlbXBsYXRlLCAuLi5hcmd1bWVudHNfKTtcblxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFsaywgQ2hhbGsucHJvdG90eXBlKTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoY2hhbGsudGVtcGxhdGUsIGNoYWxrKTtcblxuICAgIGNoYWxrLnRlbXBsYXRlLmNvbnN0cnVjdG9yID0gKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgY2hhbGsuY29uc3RydWN0b3IoKWAgaXMgZGVwcmVjYXRlZC4gVXNlIGBuZXcgY2hhbGsuSW5zdGFuY2UoKWAgaW5zdGVhZC4nKTtcbiAgICB9O1xuXG4gICAgY2hhbGsudGVtcGxhdGUuSW5zdGFuY2UgPSBDaGFsa0NsYXNzO1xuICAgIHJldHVybiBjaGFsay50ZW1wbGF0ZTtcbiAgfTtcblxuICBmdW5jdGlvbiBDaGFsayhvcHRpb25zKSB7XG4gICAgcmV0dXJuIGNoYWxrRmFjdG9yeShvcHRpb25zKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGFuc2lTdHlsZXMkMSkpIHtcbiAgICBzdHlsZXNbc3R5bGVOYW1lXSA9IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGhpcywgY3JlYXRlU3R5bGVyKHN0eWxlLm9wZW4sIHN0eWxlLmNsb3NlLCB0aGlzLl9zdHlsZXIpLCB0aGlzLl9pc0VtcHR5KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHN0eWxlTmFtZSwge1xuICAgICAgICAgIHZhbHVlOiBidWlsZGVyXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICAgIH1cblxuICAgIH07XG4gIH1cblxuICBzdHlsZXMudmlzaWJsZSA9IHtcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCB0aGlzLl9zdHlsZXIsIHRydWUpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd2aXNpYmxlJywge1xuICAgICAgICB2YWx1ZTogYnVpbGRlclxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9XG5cbiAgfTtcbiAgY29uc3QgdXNlZE1vZGVscyA9IFsncmdiJywgJ2hleCcsICdrZXl3b3JkJywgJ2hzbCcsICdoc3YnLCAnaHdiJywgJ2Fuc2knLCAnYW5zaTI1NiddO1xuXG4gIGZvciAoY29uc3QgbW9kZWwgb2YgdXNlZE1vZGVscykge1xuICAgIHN0eWxlc1ttb2RlbF0gPSB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBsZXZlbFxuICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG4gICAgICAgICAgY29uc3Qgc3R5bGVyID0gY3JlYXRlU3R5bGVyKGFuc2lTdHlsZXMkMS5jb2xvcltsZXZlbE1hcHBpbmdbbGV2ZWxdXVttb2RlbF0oLi4uYXJndW1lbnRzXyksIGFuc2lTdHlsZXMkMS5jb2xvci5jbG9zZSwgdGhpcy5fc3R5bGVyKTtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXMuX2lzRW1wdHkpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgfTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbW9kZWwgb2YgdXNlZE1vZGVscykge1xuICAgIGNvbnN0IGJnTW9kZWwgPSAnYmcnICsgbW9kZWxbMF0udG9VcHBlckNhc2UoKSArIG1vZGVsLnNsaWNlKDEpO1xuICAgIHN0eWxlc1tiZ01vZGVsXSA9IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGxldmVsXG4gICAgICAgIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3VtZW50c18pIHtcbiAgICAgICAgICBjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoYW5zaVN0eWxlcyQxLmJnQ29sb3JbbGV2ZWxNYXBwaW5nW2xldmVsXV1bbW9kZWxdKC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzJDEuYmdDb2xvci5jbG9zZSwgdGhpcy5fc3R5bGVyKTtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXMuX2lzRW1wdHkpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoKCkgPT4ge30sIE9iamVjdC5hc3NpZ24oe30sIHN0eWxlcywge1xuICAgIGxldmVsOiB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmF0b3IubGV2ZWw7XG4gICAgICB9LFxuXG4gICAgICBzZXQobGV2ZWwpIHtcbiAgICAgICAgdGhpcy5fZ2VuZXJhdG9yLmxldmVsID0gbGV2ZWw7XG4gICAgICB9XG5cbiAgICB9XG4gIH0pKTtcblxuICBjb25zdCBjcmVhdGVTdHlsZXIgPSAob3BlbiwgY2xvc2UsIHBhcmVudCkgPT4ge1xuICAgIGxldCBvcGVuQWxsO1xuICAgIGxldCBjbG9zZUFsbDtcblxuICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3BlbkFsbCA9IG9wZW47XG4gICAgICBjbG9zZUFsbCA9IGNsb3NlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVuQWxsID0gcGFyZW50Lm9wZW5BbGwgKyBvcGVuO1xuICAgICAgY2xvc2VBbGwgPSBjbG9zZSArIHBhcmVudC5jbG9zZUFsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3BlbixcbiAgICAgIGNsb3NlLFxuICAgICAgb3BlbkFsbCxcbiAgICAgIGNsb3NlQWxsLFxuICAgICAgcGFyZW50XG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBjcmVhdGVCdWlsZGVyID0gKHNlbGYsIF9zdHlsZXIsIF9pc0VtcHR5KSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9ICguLi5hcmd1bWVudHNfKSA9PiB7XG4gICAgICAvLyBTaW5nbGUgYXJndW1lbnQgaXMgaG90IHBhdGgsIGltcGxpY2l0IGNvZXJjaW9uIGlzIGZhc3RlciB0aGFuIGFueXRoaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb25cbiAgICAgIHJldHVybiBhcHBseVN0eWxlKGJ1aWxkZXIsIGFyZ3VtZW50c18ubGVuZ3RoID09PSAxID8gJycgKyBhcmd1bWVudHNfWzBdIDogYXJndW1lbnRzXy5qb2luKCcgJykpO1xuICAgIH07IC8vIFdlIGFsdGVyIHRoZSBwcm90b3R5cGUgYmVjYXVzZSB3ZSBtdXN0IHJldHVybiBhIGZ1bmN0aW9uLCBidXQgdGhlcmUgaXNcbiAgICAvLyBubyB3YXkgdG8gY3JlYXRlIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBwcm90b3R5cGVcblxuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1aWxkZXIsIHByb3RvKTtcbiAgICBidWlsZGVyLl9nZW5lcmF0b3IgPSBzZWxmO1xuICAgIGJ1aWxkZXIuX3N0eWxlciA9IF9zdHlsZXI7XG4gICAgYnVpbGRlci5faXNFbXB0eSA9IF9pc0VtcHR5O1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IGFwcGx5U3R5bGUgPSAoc2VsZiwgc3RyaW5nKSA9PiB7XG4gICAgaWYgKHNlbGYubGV2ZWwgPD0gMCB8fCAhc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc2VsZi5faXNFbXB0eSA/ICcnIDogc3RyaW5nO1xuICAgIH1cblxuICAgIGxldCBzdHlsZXIgPSBzZWxmLl9zdHlsZXI7XG5cbiAgICBpZiAoc3R5bGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgb3BlbkFsbCxcbiAgICAgIGNsb3NlQWxsXG4gICAgfSA9IHN0eWxlcjtcblxuICAgIGlmIChzdHJpbmcuaW5kZXhPZignXFx1MDAxQicpICE9PSAtMSkge1xuICAgICAgd2hpbGUgKHN0eWxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFJlcGxhY2UgYW55IGluc3RhbmNlcyBhbHJlYWR5IHByZXNlbnQgd2l0aCBhIHJlLW9wZW5pbmcgY29kZVxuICAgICAgICAvLyBvdGhlcndpc2Ugb25seSB0aGUgcGFydCBvZiB0aGUgc3RyaW5nIHVudGlsIHNhaWQgY2xvc2luZyBjb2RlXG4gICAgICAgIC8vIHdpbGwgYmUgY29sb3JlZCwgYW5kIHRoZSByZXN0IHdpbGwgc2ltcGx5IGJlICdwbGFpbicuXG4gICAgICAgIHN0cmluZyA9IHN0cmluZ1JlcGxhY2VBbGwkMShzdHJpbmcsIHN0eWxlci5jbG9zZSwgc3R5bGVyLm9wZW4pO1xuICAgICAgICBzdHlsZXIgPSBzdHlsZXIucGFyZW50O1xuICAgICAgfVxuICAgIH0gLy8gV2UgY2FuIG1vdmUgYm90aCBuZXh0IGFjdGlvbnMgb3V0IG9mIGxvb3AsIGJlY2F1c2UgcmVtYWluaW5nIGFjdGlvbnMgaW4gbG9vcCB3b24ndCBoYXZlXG4gICAgLy8gYW55L3Zpc2libGUgZWZmZWN0IG9uIHBhcnRzIHdlIGFkZCBoZXJlLiBDbG9zZSB0aGUgc3R5bGluZyBiZWZvcmUgYSBsaW5lYnJlYWsgYW5kIHJlb3BlblxuICAgIC8vIGFmdGVyIG5leHQgbGluZSB0byBmaXggYSBibGVlZCBpc3N1ZSBvbiBtYWNPUzogaHR0cHM6Ly9naXRodWIuY29tL2NoYWxrL2NoYWxrL3B1bGwvOTJcblxuXG4gICAgY29uc3QgbGZJbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nKTtcblxuICAgIGlmIChsZkluZGV4ICE9PSAtMSkge1xuICAgICAgc3RyaW5nID0gc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4JDEoc3RyaW5nLCBjbG9zZUFsbCwgb3BlbkFsbCwgbGZJbmRleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wZW5BbGwgKyBzdHJpbmcgKyBjbG9zZUFsbDtcbiAgfTtcblxuICBsZXQgdGVtcGxhdGU7XG5cbiAgY29uc3QgY2hhbGtUYWcgPSAoY2hhbGssIC4uLnN0cmluZ3MpID0+IHtcbiAgICBjb25zdCBbZmlyc3RTdHJpbmddID0gc3RyaW5ncztcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShmaXJzdFN0cmluZykpIHtcbiAgICAgIC8vIElmIGNoYWxrKCkgd2FzIGNhbGxlZCBieSBpdHNlbGYgb3Igd2l0aCBhIHN0cmluZyxcbiAgICAgIC8vIHJldHVybiB0aGUgc3RyaW5nIGl0c2VsZiBhcyBhIHN0cmluZy5cbiAgICAgIHJldHVybiBzdHJpbmdzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcmd1bWVudHNfID0gc3RyaW5ncy5zbGljZSgxKTtcbiAgICBjb25zdCBwYXJ0cyA9IFtmaXJzdFN0cmluZy5yYXdbMF1dO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaXJzdFN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFydHMucHVzaChTdHJpbmcoYXJndW1lbnRzX1tpIC0gMV0pLnJlcGxhY2UoL1t7fVxcXFxdL2csICdcXFxcJCYnKSwgU3RyaW5nKGZpcnN0U3RyaW5nLnJhd1tpXSkpO1xuICAgIH1cblxuICAgIGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlcyQxO1xuICAgIH1cblxuICAgIHJldHVybiB0ZW1wbGF0ZShjaGFsaywgcGFydHMuam9pbignJykpO1xuICB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENoYWxrLnByb3RvdHlwZSwgc3R5bGVzKTtcbiAgY29uc3QgY2hhbGskMSA9IENoYWxrKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuXG4gIGNoYWxrJDEuc3VwcG9ydHNDb2xvciA9IHN0ZG91dENvbG9yO1xuICBjaGFsayQxLnN0ZGVyciA9IENoYWxrKHtcbiAgICBsZXZlbDogc3RkZXJyQ29sb3IgPyBzdGRlcnJDb2xvci5sZXZlbCA6IDBcbiAgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuXG4gIGNoYWxrJDEuc3RkZXJyLnN1cHBvcnRzQ29sb3IgPSBzdGRlcnJDb2xvcjtcbiAgdmFyIHNvdXJjZSA9IGNoYWxrJDE7XG5cbiAgY29uc3QgY2xpRGVzY3JpcHRvciA9IHtcbiAgICBrZXk6IF9rZXkgPT4gX2tleS5sZW5ndGggPT09IDEgPyBcIi1cIi5jb25jYXQoX2tleSkgOiBcIi0tXCIuY29uY2F0KF9rZXkpLFxuICAgIHZhbHVlOiBfdmFsdWUgPT4gbGliLmFwaURlc2NyaXB0b3IudmFsdWUoX3ZhbHVlKSxcbiAgICBwYWlyOiAoe1xuICAgICAga2V5LFxuICAgICAgdmFsdWVcbiAgICB9KSA9PiB2YWx1ZSA9PT0gZmFsc2UgPyBcIi0tbm8tXCIuY29uY2F0KGtleSkgOiB2YWx1ZSA9PT0gdHJ1ZSA/IGNsaURlc2NyaXB0b3Iua2V5KGtleSkgOiB2YWx1ZSA9PT0gXCJcIiA/IFwiXCIuY29uY2F0KGNsaURlc2NyaXB0b3Iua2V5KGtleSksIFwiIHdpdGhvdXQgYW4gYXJndW1lbnRcIikgOiBcIlwiLmNvbmNhdChjbGlEZXNjcmlwdG9yLmtleShrZXkpLCBcIj1cIikuY29uY2F0KHZhbHVlKVxuICB9O1xuXG4gIGNsYXNzIEZsYWdTY2hlbWEgZXh0ZW5kcyBsaWIuQ2hvaWNlU2NoZW1hIHtcbiAgICBjb25zdHJ1Y3Rvcih7XG4gICAgICBuYW1lLFxuICAgICAgZmxhZ3NcbiAgICB9KSB7XG4gICAgICBzdXBlcih7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNob2ljZXM6IGZsYWdzXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2ZsYWdzID0gZmxhZ3Muc2xpY2UoKS5zb3J0KCk7XG4gICAgfVxuXG4gICAgcHJlcHJvY2Vzcyh2YWx1ZSwgdXRpbHMpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoICE9PSAwICYmICF0aGlzLl9mbGFncy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IHRoaXMuX2ZsYWdzLmZpbmQoZmxhZyA9PiBsZXZlbl8xJDEoZmxhZywgdmFsdWUpIDwgMyk7XG5cbiAgICAgICAgaWYgKHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICB1dGlscy5sb2dnZXIud2FybihbXCJVbmtub3duIGZsYWcgXCIuY29uY2F0KHNvdXJjZS55ZWxsb3codXRpbHMuZGVzY3JpcHRvci52YWx1ZSh2YWx1ZSkpLCBcIixcIiksIFwiZGlkIHlvdSBtZWFuIFwiLmNvbmNhdChzb3VyY2UuYmx1ZSh1dGlscy5kZXNjcmlwdG9yLnZhbHVlKHN1Z2dlc3Rpb24pKSwgXCI/XCIpXS5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgcmV0dXJuIHN1Z2dlc3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGV4cGVjdGVkKCkge1xuICAgICAgcmV0dXJuIFwiYSBmbGFnXCI7XG4gICAgfVxuXG4gIH1cblxuICBsZXQgaGFzRGVwcmVjYXRpb25XYXJuZWQ7XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zLCBvcHRpb25JbmZvcywge1xuICAgIGxvZ2dlcixcbiAgICBpc0NMSSA9IGZhbHNlLFxuICAgIHBhc3NUaHJvdWdoID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgY29uc3QgdW5rbm93biA9ICFwYXNzVGhyb3VnaCA/IGxpYi5sZXZlblVua25vd25IYW5kbGVyIDogQXJyYXkuaXNBcnJheShwYXNzVGhyb3VnaCkgPyAoa2V5LCB2YWx1ZSkgPT4gIXBhc3NUaHJvdWdoLmluY2x1ZGVzKGtleSkgPyB1bmRlZmluZWQgOiB7XG4gICAgICBba2V5XTogdmFsdWVcbiAgICB9IDogKGtleSwgdmFsdWUpID0+ICh7XG4gICAgICBba2V5XTogdmFsdWVcbiAgICB9KTtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gaXNDTEkgPyBjbGlEZXNjcmlwdG9yIDogbGliLmFwaURlc2NyaXB0b3I7XG4gICAgY29uc3Qgc2NoZW1hcyA9IG9wdGlvbkluZm9zVG9TY2hlbWFzKG9wdGlvbkluZm9zLCB7XG4gICAgICBpc0NMSVxuICAgIH0pO1xuICAgIGNvbnN0IG5vcm1hbGl6ZXIgPSBuZXcgbGliLk5vcm1hbGl6ZXIoc2NoZW1hcywge1xuICAgICAgbG9nZ2VyLFxuICAgICAgdW5rbm93bixcbiAgICAgIGRlc2NyaXB0b3JcbiAgICB9KTtcbiAgICBjb25zdCBzaG91bGRTdXBwcmVzc0R1cGxpY2F0ZURlcHJlY2F0aW9uV2FybmluZ3MgPSBsb2dnZXIgIT09IGZhbHNlO1xuXG4gICAgaWYgKHNob3VsZFN1cHByZXNzRHVwbGljYXRlRGVwcmVjYXRpb25XYXJuaW5ncyAmJiBoYXNEZXByZWNhdGlvbldhcm5lZCkge1xuICAgICAgbm9ybWFsaXplci5faGFzRGVwcmVjYXRpb25XYXJuZWQgPSBoYXNEZXByZWNhdGlvbldhcm5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplci5ub3JtYWxpemUob3B0aW9ucyk7XG5cbiAgICBpZiAoc2hvdWxkU3VwcHJlc3NEdXBsaWNhdGVEZXByZWNhdGlvbldhcm5pbmdzKSB7XG4gICAgICBoYXNEZXByZWNhdGlvbldhcm5lZCA9IG5vcm1hbGl6ZXIuX2hhc0RlcHJlY2F0aW9uV2FybmVkO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgZnVuY3Rpb24gb3B0aW9uSW5mb3NUb1NjaGVtYXMob3B0aW9uSW5mb3MsIHtcbiAgICBpc0NMSVxuICB9KSB7XG4gICAgY29uc3Qgc2NoZW1hcyA9IFtdO1xuXG4gICAgaWYgKGlzQ0xJKSB7XG4gICAgICBzY2hlbWFzLnB1c2gobGliLkFueVNjaGVtYS5jcmVhdGUoe1xuICAgICAgICBuYW1lOiBcIl9cIlxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb3B0aW9uSW5mbyBvZiBvcHRpb25JbmZvcykge1xuICAgICAgc2NoZW1hcy5wdXNoKG9wdGlvbkluZm9Ub1NjaGVtYShvcHRpb25JbmZvLCB7XG4gICAgICAgIGlzQ0xJLFxuICAgICAgICBvcHRpb25JbmZvc1xuICAgICAgfSkpO1xuXG4gICAgICBpZiAob3B0aW9uSW5mby5hbGlhcyAmJiBpc0NMSSkge1xuICAgICAgICBzY2hlbWFzLnB1c2gobGliLkFsaWFzU2NoZW1hLmNyZWF0ZSh7XG4gICAgICAgICAgbmFtZTogb3B0aW9uSW5mby5hbGlhcyxcbiAgICAgICAgICBzb3VyY2VOYW1lOiBvcHRpb25JbmZvLm5hbWVcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzY2hlbWFzO1xuICB9XG5cbiAgZnVuY3Rpb24gb3B0aW9uSW5mb1RvU2NoZW1hKG9wdGlvbkluZm8sIHtcbiAgICBpc0NMSSxcbiAgICBvcHRpb25JbmZvc1xuICB9KSB7XG4gICAgbGV0IFNjaGVtYUNvbnN0cnVjdG9yO1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBuYW1lOiBvcHRpb25JbmZvLm5hbWVcbiAgICB9O1xuICAgIGNvbnN0IGhhbmRsZXJzID0ge307XG5cbiAgICBzd2l0Y2ggKG9wdGlvbkluZm8udHlwZSkge1xuICAgICAgY2FzZSBcImludFwiOlxuICAgICAgICBTY2hlbWFDb25zdHJ1Y3RvciA9IGxpYi5JbnRlZ2VyU2NoZW1hO1xuXG4gICAgICAgIGlmIChpc0NMSSkge1xuICAgICAgICAgIHBhcmFtZXRlcnMucHJlcHJvY2VzcyA9IHZhbHVlID0+IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICBTY2hlbWFDb25zdHJ1Y3RvciA9IGxpYi5TdHJpbmdTY2hlbWE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiY2hvaWNlXCI6XG4gICAgICAgIFNjaGVtYUNvbnN0cnVjdG9yID0gbGliLkNob2ljZVNjaGVtYTtcbiAgICAgICAgcGFyYW1ldGVycy5jaG9pY2VzID0gb3B0aW9uSW5mby5jaG9pY2VzLm1hcChjaG9pY2VJbmZvID0+IHR5cGVvZiBjaG9pY2VJbmZvID09PSBcIm9iamVjdFwiICYmIGNob2ljZUluZm8ucmVkaXJlY3QgPyBPYmplY3QuYXNzaWduKHt9LCBjaG9pY2VJbmZvLCB7XG4gICAgICAgICAgcmVkaXJlY3Q6IHtcbiAgICAgICAgICAgIHRvOiB7XG4gICAgICAgICAgICAgIGtleTogb3B0aW9uSW5mby5uYW1lLFxuICAgICAgICAgICAgICB2YWx1ZTogY2hvaWNlSW5mby5yZWRpcmVjdFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkgOiBjaG9pY2VJbmZvKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIFNjaGVtYUNvbnN0cnVjdG9yID0gbGliLkJvb2xlYW5TY2hlbWE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiZmxhZ1wiOlxuICAgICAgICBTY2hlbWFDb25zdHJ1Y3RvciA9IEZsYWdTY2hlbWE7XG4gICAgICAgIHBhcmFtZXRlcnMuZmxhZ3MgPSBvcHRpb25JbmZvcy5tYXAob3B0aW9uSW5mbyA9PiBbXS5jb25jYXQob3B0aW9uSW5mby5hbGlhcyB8fCBbXSwgb3B0aW9uSW5mby5kZXNjcmlwdGlvbiA/IG9wdGlvbkluZm8ubmFtZSA6IFtdLCBvcHRpb25JbmZvLm9wcG9zaXRlRGVzY3JpcHRpb24gPyBcIm5vLVwiLmNvbmNhdChvcHRpb25JbmZvLm5hbWUpIDogW10pKS5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwicGF0aFwiOlxuICAgICAgICBTY2hlbWFDb25zdHJ1Y3RvciA9IGxpYi5TdHJpbmdTY2hlbWE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHR5cGUgXCIuY29uY2F0KG9wdGlvbkluZm8udHlwZSkpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25JbmZvLmV4Y2VwdGlvbikge1xuICAgICAgcGFyYW1ldGVycy52YWxpZGF0ZSA9ICh2YWx1ZSwgc2NoZW1hLCB1dGlscykgPT4ge1xuICAgICAgICByZXR1cm4gb3B0aW9uSW5mby5leGNlcHRpb24odmFsdWUpIHx8IHNjaGVtYS52YWxpZGF0ZSh2YWx1ZSwgdXRpbHMpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1ldGVycy52YWxpZGF0ZSA9ICh2YWx1ZSwgc2NoZW1hLCB1dGlscykgPT4ge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCBzY2hlbWEudmFsaWRhdGUodmFsdWUsIHV0aWxzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbkluZm8ucmVkaXJlY3QpIHtcbiAgICAgIGhhbmRsZXJzLnJlZGlyZWN0ID0gdmFsdWUgPT4gIXZhbHVlID8gdW5kZWZpbmVkIDoge1xuICAgICAgICB0bzoge1xuICAgICAgICAgIGtleTogb3B0aW9uSW5mby5yZWRpcmVjdC5vcHRpb24sXG4gICAgICAgICAgdmFsdWU6IG9wdGlvbkluZm8ucmVkaXJlY3QudmFsdWVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uSW5mby5kZXByZWNhdGVkKSB7XG4gICAgICBoYW5kbGVycy5kZXByZWNhdGVkID0gdHJ1ZTtcbiAgICB9IC8vIGFsbG93IENMSSBvdmVycmlkaW5nLCBlLmcuLCBwcmV0dGllciBwYWNrYWdlLmpzb24gLS10YWItd2lkdGggMSAtLXRhYi13aWR0aCAyXG5cblxuICAgIGlmIChpc0NMSSAmJiAhb3B0aW9uSW5mby5hcnJheSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxQcmVwcm9jZXNzID0gcGFyYW1ldGVycy5wcmVwcm9jZXNzIHx8ICh4ID0+IHgpO1xuXG4gICAgICBwYXJhbWV0ZXJzLnByZXByb2Nlc3MgPSAodmFsdWUsIHNjaGVtYSwgdXRpbHMpID0+IHNjaGVtYS5wcmVwcm9jZXNzKG9yaWdpbmFsUHJlcHJvY2VzcyhBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdIDogdmFsdWUpLCB1dGlscyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbkluZm8uYXJyYXkgPyBsaWIuQXJyYXlTY2hlbWEuY3JlYXRlKE9iamVjdC5hc3NpZ24oe30sIGlzQ0xJID8ge1xuICAgICAgcHJlcHJvY2VzczogdiA9PiBbXS5jb25jYXQodilcbiAgICB9IDoge30sIHt9LCBoYW5kbGVycywge1xuICAgICAgdmFsdWVTY2hlbWE6IFNjaGVtYUNvbnN0cnVjdG9yLmNyZWF0ZShwYXJhbWV0ZXJzKVxuICAgIH0pKSA6IFNjaGVtYUNvbnN0cnVjdG9yLmNyZWF0ZShPYmplY3QuYXNzaWduKHt9LCBwYXJhbWV0ZXJzLCB7fSwgaGFuZGxlcnMpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUFwaU9wdGlvbnMob3B0aW9ucywgb3B0aW9uSW5mb3MsIG9wdHMpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zLCBvcHRpb25JbmZvcywgb3B0cyk7XG4gIH1cblxuICBmdW5jdGlvbiBub3JtYWxpemVDbGlPcHRpb25zKG9wdGlvbnMsIG9wdGlvbkluZm9zLCBvcHRzKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbnMob3B0aW9ucywgb3B0aW9uSW5mb3MsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgaXNDTEk6IHRydWVcbiAgICB9LCBvcHRzKSk7XG4gIH1cblxuICB2YXIgb3B0aW9uc05vcm1hbGl6ZXIgPSB7XG4gICAgbm9ybWFsaXplQXBpT3B0aW9ucyxcbiAgICBub3JtYWxpemVDbGlPcHRpb25zXG4gIH07XG5cbiAgdmFyIGdldExhc3QgPSBhcnIgPT4gYXJyW2Fyci5sZW5ndGggLSAxXTtcblxuICBmdW5jdGlvbiBsb2NTdGFydChub2RlLCBvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307IC8vIEhhbmRsZSBub2RlcyB3aXRoIGRlY29yYXRvcnMuIFRoZXkgc2hvdWxkIHN0YXJ0IGF0IHRoZSBmaXJzdCBkZWNvcmF0b3JcblxuICAgIGlmICghb3B0cy5pZ25vcmVEZWNvcmF0b3JzICYmIG5vZGUuZGVjbGFyYXRpb24gJiYgbm9kZS5kZWNsYXJhdGlvbi5kZWNvcmF0b3JzICYmIG5vZGUuZGVjbGFyYXRpb24uZGVjb3JhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbG9jU3RhcnQobm9kZS5kZWNsYXJhdGlvbi5kZWNvcmF0b3JzWzBdKTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdHMuaWdub3JlRGVjb3JhdG9ycyAmJiBub2RlLmRlY29yYXRvcnMgJiYgbm9kZS5kZWNvcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBsb2NTdGFydChub2RlLmRlY29yYXRvcnNbMF0pO1xuICAgIH1cblxuICAgIGlmIChub2RlLl9fbG9jYXRpb24pIHtcbiAgICAgIHJldHVybiBub2RlLl9fbG9jYXRpb24uc3RhcnRPZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUucmFuZ2UpIHtcbiAgICAgIHJldHVybiBub2RlLnJhbmdlWzBdO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygbm9kZS5zdGFydCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIG5vZGUuc3RhcnQ7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubG9jKSB7XG4gICAgICByZXR1cm4gbm9kZS5sb2Muc3RhcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBsb2NFbmQobm9kZSkge1xuICAgIGNvbnN0IGVuZE5vZGUgPSBub2RlLm5vZGVzICYmIGdldExhc3Qobm9kZS5ub2Rlcyk7XG5cbiAgICBpZiAoZW5kTm9kZSAmJiBub2RlLnNvdXJjZSAmJiAhbm9kZS5zb3VyY2UuZW5kKSB7XG4gICAgICBub2RlID0gZW5kTm9kZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fX2xvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gbm9kZS5fX2xvY2F0aW9uLmVuZE9mZnNldDtcbiAgICB9XG5cbiAgICBjb25zdCBsb2MgPSBub2RlLnJhbmdlID8gbm9kZS5yYW5nZVsxXSA6IHR5cGVvZiBub2RlLmVuZCA9PT0gXCJudW1iZXJcIiA/IG5vZGUuZW5kIDogbnVsbDtcblxuICAgIGlmIChub2RlLnR5cGVBbm5vdGF0aW9uKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgobG9jLCBsb2NFbmQobm9kZS50eXBlQW5ub3RhdGlvbikpO1xuICAgIH1cblxuICAgIGlmIChub2RlLmxvYyAmJiAhbG9jKSB7XG4gICAgICByZXR1cm4gbm9kZS5sb2MuZW5kO1xuICAgIH1cblxuICAgIHJldHVybiBsb2M7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wb3NlTG9jKHN0YXJ0Tm9kZSwgZW5kTm9kZU9yTGVuZ3RoID0gc3RhcnROb2RlKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gdHlwZW9mIGVuZE5vZGVPckxlbmd0aCA9PT0gXCJudW1iZXJcIiA/IGVuZE5vZGVPckxlbmd0aCA6IC0xO1xuICAgIGNvbnN0IHN0YXJ0ID0gbG9jU3RhcnQoc3RhcnROb2RlKTtcbiAgICBjb25zdCBlbmQgPSBsZW5ndGggIT09IC0xID8gc3RhcnQgKyBsZW5ndGggOiBsb2NFbmQoZW5kTm9kZU9yTGVuZ3RoKTtcbiAgICBjb25zdCBzdGFydExvYyA9IHN0YXJ0Tm9kZS5sb2Muc3RhcnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kLFxuICAgICAgcmFuZ2U6IFtzdGFydCwgZW5kXSxcbiAgICAgIGxvYzoge1xuICAgICAgICBzdGFydDogc3RhcnRMb2MsXG4gICAgICAgIGVuZDogbGVuZ3RoICE9PSAtMSA/IHtcbiAgICAgICAgICBsaW5lOiBzdGFydExvYy5saW5lLFxuICAgICAgICAgIGNvbHVtbjogc3RhcnRMb2MuY29sdW1uICsgbGVuZ3RoXG4gICAgICAgIH0gOiBlbmROb2RlT3JMZW5ndGgubG9jLmVuZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICB2YXIgbG9jID0ge1xuICAgIGxvY1N0YXJ0LFxuICAgIGxvY0VuZCxcbiAgICBjb21wb3NlTG9jXG4gIH07XG5cbiAgdmFyIGpzVG9rZW5zID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAgIC8vIENvcHlyaWdodCAyMDE0LCAyMDE1LCAyMDE2LCAyMDE3LCAyMDE4IFNpbW9uIEx5ZGVsbFxuICAgIC8vIExpY2Vuc2U6IE1JVC4gKFNlZSBMSUNFTlNFLilcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlXG4gICAgfSk7IC8vIFRoaXMgcmVnZXggY29tZXMgZnJvbSByZWdleC5jb2ZmZWUsIGFuZCBpcyBpbnNlcnRlZCBoZXJlIGJ5IGdlbmVyYXRlLWluZGV4LmpzXG4gICAgLy8gKHJ1biBgbnBtIHJ1biBidWlsZGApLlxuXG4gICAgZXhwb3J0cy5kZWZhdWx0ID0gLygoWydcIl0pKD86KD8hXFwyfFxcXFwpLnxcXFxcKD86XFxyXFxufFtcXHNcXFNdKSkqKFxcMik/fGAoPzpbXmBcXFxcJF18XFxcXFtcXHNcXFNdfFxcJCg/IVxceyl8XFwkXFx7KD86W157fV18XFx7W159XSpcXH0/KSpcXH0/KSooYCk/KXwoXFwvXFwvLiopfChcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKihcXCpcXC8pPyl8KFxcLyg/IVxcKikoPzpcXFsoPzooPyFbXFxdXFxcXF0pLnxcXFxcLikqXFxdfCg/IVtcXC9cXF1cXFxcXSkufFxcXFwuKStcXC8oPzooPyFcXHMqKD86XFxifFtcXHUwMDgwLVxcdUZGRkYkXFxcXCdcIn4oe118WytcXC0hXSg/IT0pfFxcLj9cXGQpKXxbZ21peXVzXXsxLDZ9XFxiKD8hW1xcdTAwODAtXFx1RkZGRiRcXFxcXXxcXHMqKD86WytcXC0qJSZ8Xjw+IT0/KHtdfFxcLyg/IVtcXC8qXSkpKSkpfCgwW3hYXVtcXGRhLWZBLUZdK3wwW29PXVswLTddK3wwW2JCXVswMV0rfCg/OlxcZCpcXC5cXGQrfFxcZCtcXC4/KSg/OltlRV1bKy1dP1xcZCspPyl8KCg/IVxcZCkoPzooPyFcXHMpWyRcXHdcXHUwMDgwLVxcdUZGRkZdfFxcXFx1W1xcZGEtZkEtRl17NH18XFxcXHVcXHtbXFxkYS1mQS1GXStcXH0pKyl8KC0tfFxcK1xcK3wmJnxcXHxcXHx8PT58XFwuezN9fCg/OlsrXFwtXFwvJSZ8Xl18XFwqezEsMn18PHsxLDJ9fD57MSwzfXwhPT98PXsxLDJ9KT0/fFs/fi4sOjtbXFxdKCl7fV0pfChcXHMrKXwoXiR8W1xcc1xcU10pL2c7XG5cbiAgICBleHBvcnRzLm1hdGNoVG9Ub2tlbiA9IGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgdmFyIHRva2VuID0ge1xuICAgICAgICB0eXBlOiBcImludmFsaWRcIixcbiAgICAgICAgdmFsdWU6IG1hdGNoWzBdLFxuICAgICAgICBjbG9zZWQ6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIGlmIChtYXRjaFsxXSkgdG9rZW4udHlwZSA9IFwic3RyaW5nXCIsIHRva2VuLmNsb3NlZCA9ICEhKG1hdGNoWzNdIHx8IG1hdGNoWzRdKTtlbHNlIGlmIChtYXRjaFs1XSkgdG9rZW4udHlwZSA9IFwiY29tbWVudFwiO2Vsc2UgaWYgKG1hdGNoWzZdKSB0b2tlbi50eXBlID0gXCJjb21tZW50XCIsIHRva2VuLmNsb3NlZCA9ICEhbWF0Y2hbN107ZWxzZSBpZiAobWF0Y2hbOF0pIHRva2VuLnR5cGUgPSBcInJlZ2V4XCI7ZWxzZSBpZiAobWF0Y2hbOV0pIHRva2VuLnR5cGUgPSBcIm51bWJlclwiO2Vsc2UgaWYgKG1hdGNoWzEwXSkgdG9rZW4udHlwZSA9IFwibmFtZVwiO2Vsc2UgaWYgKG1hdGNoWzExXSkgdG9rZW4udHlwZSA9IFwicHVuY3R1YXRvclwiO2Vsc2UgaWYgKG1hdGNoWzEyXSkgdG9rZW4udHlwZSA9IFwid2hpdGVzcGFjZVwiO1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH07XG4gIH0pO1xuICB1bndyYXBFeHBvcnRzKGpzVG9rZW5zKTtcbiAgdmFyIGpzVG9rZW5zXzEgPSBqc1Rva2Vucy5tYXRjaFRvVG9rZW47XG5cbiAgdmFyIGFzdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgICAvKlxuICAgICAgQ29weXJpZ2h0IChDKSAyMDEzIFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cbiAgICBcbiAgICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICAgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gICAgXG4gICAgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICBcbiAgICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJ0FTIElTJ1xuICAgICAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICAgICAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgICAgIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgICAgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gICAgICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gICAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgICAgIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gICAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgICAgIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gICAgKi9cbiAgICAoZnVuY3Rpb24gKCkge1xuXG4gICAgICBmdW5jdGlvbiBpc0V4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdBcnJheUV4cHJlc3Npb24nOlxuICAgICAgICAgIGNhc2UgJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJzpcbiAgICAgICAgICBjYXNlICdCaW5hcnlFeHByZXNzaW9uJzpcbiAgICAgICAgICBjYXNlICdDYWxsRXhwcmVzc2lvbic6XG4gICAgICAgICAgY2FzZSAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJzpcbiAgICAgICAgICBjYXNlICdGdW5jdGlvbkV4cHJlc3Npb24nOlxuICAgICAgICAgIGNhc2UgJ0lkZW50aWZpZXInOlxuICAgICAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICAgIGNhc2UgJ0xvZ2ljYWxFeHByZXNzaW9uJzpcbiAgICAgICAgICBjYXNlICdNZW1iZXJFeHByZXNzaW9uJzpcbiAgICAgICAgICBjYXNlICdOZXdFeHByZXNzaW9uJzpcbiAgICAgICAgICBjYXNlICdPYmplY3RFeHByZXNzaW9uJzpcbiAgICAgICAgICBjYXNlICdTZXF1ZW5jZUV4cHJlc3Npb24nOlxuICAgICAgICAgIGNhc2UgJ1RoaXNFeHByZXNzaW9uJzpcbiAgICAgICAgICBjYXNlICdVbmFyeUV4cHJlc3Npb24nOlxuICAgICAgICAgIGNhc2UgJ1VwZGF0ZUV4cHJlc3Npb24nOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzSXRlcmF0aW9uU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnRG9XaGlsZVN0YXRlbWVudCc6XG4gICAgICAgICAgY2FzZSAnRm9ySW5TdGF0ZW1lbnQnOlxuICAgICAgICAgIGNhc2UgJ0ZvclN0YXRlbWVudCc6XG4gICAgICAgICAgY2FzZSAnV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnQmxvY2tTdGF0ZW1lbnQnOlxuICAgICAgICAgIGNhc2UgJ0JyZWFrU3RhdGVtZW50JzpcbiAgICAgICAgICBjYXNlICdDb250aW51ZVN0YXRlbWVudCc6XG4gICAgICAgICAgY2FzZSAnRGVidWdnZXJTdGF0ZW1lbnQnOlxuICAgICAgICAgIGNhc2UgJ0RvV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICAgIGNhc2UgJ0VtcHR5U3RhdGVtZW50JzpcbiAgICAgICAgICBjYXNlICdFeHByZXNzaW9uU3RhdGVtZW50JzpcbiAgICAgICAgICBjYXNlICdGb3JJblN0YXRlbWVudCc6XG4gICAgICAgICAgY2FzZSAnRm9yU3RhdGVtZW50JzpcbiAgICAgICAgICBjYXNlICdJZlN0YXRlbWVudCc6XG4gICAgICAgICAgY2FzZSAnTGFiZWxlZFN0YXRlbWVudCc6XG4gICAgICAgICAgY2FzZSAnUmV0dXJuU3RhdGVtZW50JzpcbiAgICAgICAgICBjYXNlICdTd2l0Y2hTdGF0ZW1lbnQnOlxuICAgICAgICAgIGNhc2UgJ1Rocm93U3RhdGVtZW50JzpcbiAgICAgICAgICBjYXNlICdUcnlTdGF0ZW1lbnQnOlxuICAgICAgICAgIGNhc2UgJ1ZhcmlhYmxlRGVjbGFyYXRpb24nOlxuICAgICAgICAgIGNhc2UgJ1doaWxlU3RhdGVtZW50JzpcbiAgICAgICAgICBjYXNlICdXaXRoU3RhdGVtZW50JzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc1NvdXJjZUVsZW1lbnQobm9kZSkge1xuICAgICAgICByZXR1cm4gaXNTdGF0ZW1lbnQobm9kZSkgfHwgbm9kZSAhPSBudWxsICYmIG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0cmFpbGluZ1N0YXRlbWVudChub2RlKSB7XG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnSWZTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgaWYgKG5vZGUuYWx0ZXJuYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuYWx0ZXJuYXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jb25zZXF1ZW50O1xuXG4gICAgICAgICAgY2FzZSAnTGFiZWxlZFN0YXRlbWVudCc6XG4gICAgICAgICAgY2FzZSAnRm9yU3RhdGVtZW50JzpcbiAgICAgICAgICBjYXNlICdGb3JJblN0YXRlbWVudCc6XG4gICAgICAgICAgY2FzZSAnV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICAgIGNhc2UgJ1dpdGhTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgcmV0dXJuIG5vZGUuYm9keTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc1Byb2JsZW1hdGljSWZTdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICB2YXIgY3VycmVudDtcblxuICAgICAgICBpZiAobm9kZS50eXBlICE9PSAnSWZTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUuYWx0ZXJuYXRlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50ID0gbm9kZS5jb25zZXF1ZW50O1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAoY3VycmVudC50eXBlID09PSAnSWZTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5hbHRlcm5hdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjdXJyZW50ID0gdHJhaWxpbmdTdGF0ZW1lbnQoY3VycmVudCk7XG4gICAgICAgIH0gd2hpbGUgKGN1cnJlbnQpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICAgIGlzRXhwcmVzc2lvbjogaXNFeHByZXNzaW9uLFxuICAgICAgICBpc1N0YXRlbWVudDogaXNTdGF0ZW1lbnQsXG4gICAgICAgIGlzSXRlcmF0aW9uU3RhdGVtZW50OiBpc0l0ZXJhdGlvblN0YXRlbWVudCxcbiAgICAgICAgaXNTb3VyY2VFbGVtZW50OiBpc1NvdXJjZUVsZW1lbnQsXG4gICAgICAgIGlzUHJvYmxlbWF0aWNJZlN0YXRlbWVudDogaXNQcm9ibGVtYXRpY0lmU3RhdGVtZW50LFxuICAgICAgICB0cmFpbGluZ1N0YXRlbWVudDogdHJhaWxpbmdTdGF0ZW1lbnRcbiAgICAgIH07XG4gICAgfSkoKTtcbiAgICAvKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuXG4gIH0pO1xuICB2YXIgYXN0XzEgPSBhc3QuaXNFeHByZXNzaW9uO1xuICB2YXIgYXN0XzIgPSBhc3QuaXNTdGF0ZW1lbnQ7XG4gIHZhciBhc3RfMyA9IGFzdC5pc0l0ZXJhdGlvblN0YXRlbWVudDtcbiAgdmFyIGFzdF80ID0gYXN0LmlzU291cmNlRWxlbWVudDtcbiAgdmFyIGFzdF81ID0gYXN0LmlzUHJvYmxlbWF0aWNJZlN0YXRlbWVudDtcbiAgdmFyIGFzdF82ID0gYXN0LnRyYWlsaW5nU3RhdGVtZW50O1xuXG4gIHZhciBjb2RlID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAgIC8qXG4gICAgICBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG4gICAgICBDb3B5cmlnaHQgKEMpIDIwMTQgSXZhbiBOaWt1bGluIDxpZmFhYW5AZ21haWwuY29tPlxuICAgIFxuICAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gICAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAgICBcbiAgICAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICAgIFxuICAgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgICAgIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgICAgIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gICAgICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gICAgICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAgICAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICAgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gICAgICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gICAgICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICAgICovXG4gICAgKGZ1bmN0aW9uICgpIHtcblxuICAgICAgdmFyIEVTNlJlZ2V4LCBFUzVSZWdleCwgTk9OX0FTQ0lJX1dISVRFU1BBQ0VTLCBJREVOVElGSUVSX1NUQVJULCBJREVOVElGSUVSX1BBUlQsIGNoOyAvLyBTZWUgYHRvb2xzL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNgLlxuXG4gICAgICBFUzVSZWdleCA9IHtcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA1LjEvVW5pY29kZSB2OS4wLjAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6XG4gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OiAvW1xceEFBXFx4QjVcXHhCQVxceEMwLVxceEQ2XFx4RDgtXFx4RjZcXHhGOC1cXHUwMkMxXFx1MDJDNi1cXHUwMkQxXFx1MDJFMC1cXHUwMkU0XFx1MDJFQ1xcdTAyRUVcXHUwMzcwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN0EtXFx1MDM3RFxcdTAzN0ZcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0OEEtXFx1MDUyRlxcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjIwLVxcdTA2NEFcXHUwNjZFXFx1MDY2RlxcdTA2NzEtXFx1MDZEM1xcdTA2RDVcXHUwNkU1XFx1MDZFNlxcdTA2RUVcXHUwNkVGXFx1MDZGQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTBcXHUwNzEyLVxcdTA3MkZcXHUwNzRELVxcdTA3QTVcXHUwN0IxXFx1MDdDQS1cXHUwN0VBXFx1MDdGNFxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODE1XFx1MDgxQVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDhBMC1cXHUwOEI0XFx1MDhCNi1cXHUwOEJEXFx1MDkwNC1cXHUwOTM5XFx1MDkzRFxcdTA5NTBcXHUwOTU4LVxcdTA5NjFcXHUwOTcxLVxcdTA5ODBcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJEXFx1MDlDRVxcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUxXFx1MDlGMFxcdTA5RjFcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTcyLVxcdTBBNzRcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkRcXHUwQUQwXFx1MEFFMFxcdTBBRTFcXHUwQUY5XFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0RcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2MVxcdTBCNzFcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCRDBcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzlcXHUwQzNEXFx1MEM1OC1cXHUwQzVBXFx1MEM2MFxcdTBDNjFcXHUwQzgwXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDU0LVxcdTBENTZcXHUwRDVGLVxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4ODRcXHUxODg3LVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUM4MC1cXHUxQzg4XFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0VFXFx1MkNGMlxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDgwLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyRTJGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OURcXHVBNkEwLVxcdUE2RUZcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QUVcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdLyxcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA1LjEvVW5pY29kZSB2OS4wLjAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDpcbiAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDogL1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDMwMC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDgzLVxcdTA0ODdcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDU5MS1cXHUwNUJEXFx1MDVCRlxcdTA1QzFcXHUwNUMyXFx1MDVDNFxcdTA1QzVcXHUwNUM3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYxMC1cXHUwNjFBXFx1MDYyMC1cXHUwNjY5XFx1MDY2RS1cXHUwNkQzXFx1MDZENS1cXHUwNkRDXFx1MDZERi1cXHUwNkU4XFx1MDZFQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTAtXFx1MDc0QVxcdTA3NEQtXFx1MDdCMVxcdTA3QzAtXFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MkRcXHUwODQwLVxcdTA4NUJcXHUwOEEwLVxcdTA4QjRcXHUwOEI2LVxcdTA4QkRcXHUwOEQ0LVxcdTA4RTFcXHUwOEUzLVxcdTA5NjNcXHUwOTY2LVxcdTA5NkZcXHUwOTcxLVxcdTA5ODNcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJDLVxcdTA5QzRcXHUwOUM3XFx1MDlDOFxcdTA5Q0ItXFx1MDlDRVxcdTA5RDdcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFM1xcdTA5RTYtXFx1MDlGMVxcdTBBMDEtXFx1MEEwM1xcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEEzQ1xcdTBBM0UtXFx1MEE0MlxcdTBBNDdcXHUwQTQ4XFx1MEE0Qi1cXHUwQTREXFx1MEE1MVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTY2LVxcdTBBNzVcXHUwQTgxLVxcdTBBODNcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkMtXFx1MEFDNVxcdTBBQzctXFx1MEFDOVxcdTBBQ0ItXFx1MEFDRFxcdTBBRDBcXHUwQUUwLVxcdTBBRTNcXHUwQUU2LVxcdTBBRUZcXHUwQUY5XFx1MEIwMS1cXHUwQjAzXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0MtXFx1MEI0NFxcdTBCNDdcXHUwQjQ4XFx1MEI0Qi1cXHUwQjREXFx1MEI1NlxcdTBCNTdcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2M1xcdTBCNjYtXFx1MEI2RlxcdTBCNzFcXHUwQjgyXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkJFLVxcdTBCQzJcXHUwQkM2LVxcdTBCQzhcXHUwQkNBLVxcdTBCQ0RcXHUwQkQwXFx1MEJEN1xcdTBCRTYtXFx1MEJFRlxcdTBDMDAtXFx1MEMwM1xcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0QtXFx1MEM0NFxcdTBDNDYtXFx1MEM0OFxcdTBDNEEtXFx1MEM0RFxcdTBDNTVcXHUwQzU2XFx1MEM1OC1cXHUwQzVBXFx1MEM2MC1cXHUwQzYzXFx1MEM2Ni1cXHUwQzZGXFx1MEM4MC1cXHUwQzgzXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCQy1cXHUwQ0M0XFx1MENDNi1cXHUwQ0M4XFx1MENDQS1cXHUwQ0NEXFx1MENENVxcdTBDRDZcXHUwQ0RFXFx1MENFMC1cXHUwQ0UzXFx1MENFNi1cXHUwQ0VGXFx1MENGMVxcdTBDRjJcXHUwRDAxLVxcdTBEMDNcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNELVxcdTBENDRcXHUwRDQ2LVxcdTBENDhcXHUwRDRBLVxcdTBENEVcXHUwRDU0LVxcdTBENTdcXHUwRDVGLVxcdTBENjNcXHUwRDY2LVxcdTBENkZcXHUwRDdBLVxcdTBEN0ZcXHUwRDgyXFx1MEQ4M1xcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRENBXFx1MERDRi1cXHUwREQ0XFx1MERENlxcdTBERDgtXFx1MERERlxcdTBERTYtXFx1MERFRlxcdTBERjJcXHUwREYzXFx1MEUwMS1cXHUwRTNBXFx1MEU0MC1cXHUwRTRFXFx1MEU1MC1cXHUwRTU5XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjlcXHUwRUJCLVxcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVDOC1cXHUwRUNEXFx1MEVEMC1cXHUwRUQ5XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGMThcXHUwRjE5XFx1MEYyMC1cXHUwRjI5XFx1MEYzNVxcdTBGMzdcXHUwRjM5XFx1MEYzRS1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY3MS1cXHUwRjg0XFx1MEY4Ni1cXHUwRjk3XFx1MEY5OS1cXHUwRkJDXFx1MEZDNlxcdTEwMDAtXFx1MTA0OVxcdTEwNTAtXFx1MTA5RFxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzVELVxcdTEzNUZcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjVcXHUxM0Y4LVxcdTEzRkRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNkVFLVxcdTE2RjhcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTRcXHUxNzIwLVxcdTE3MzRcXHUxNzQwLVxcdTE3NTNcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzcyXFx1MTc3M1xcdTE3ODAtXFx1MTdEM1xcdTE3RDdcXHUxN0RDXFx1MTdERFxcdTE3RTAtXFx1MTdFOVxcdTE4MEItXFx1MTgwRFxcdTE4MTAtXFx1MTgxOVxcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5MjAtXFx1MTkyQlxcdTE5MzAtXFx1MTkzQlxcdTE5NDYtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTE5RDAtXFx1MTlEOVxcdTFBMDAtXFx1MUExQlxcdTFBMjAtXFx1MUE1RVxcdTFBNjAtXFx1MUE3Q1xcdTFBN0YtXFx1MUE4OVxcdTFBOTAtXFx1MUE5OVxcdTFBQTdcXHUxQUIwLVxcdTFBQkRcXHUxQjAwLVxcdTFCNEJcXHUxQjUwLVxcdTFCNTlcXHUxQjZCLVxcdTFCNzNcXHUxQjgwLVxcdTFCRjNcXHUxQzAwLVxcdTFDMzdcXHUxQzQwLVxcdTFDNDlcXHUxQzRELVxcdTFDN0RcXHUxQzgwLVxcdTFDODhcXHUxQ0QwLVxcdTFDRDJcXHUxQ0Q0LVxcdTFDRjZcXHUxQ0Y4XFx1MUNGOVxcdTFEMDAtXFx1MURGNVxcdTFERkItXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDBDXFx1MjAwRFxcdTIwM0ZcXHUyMDQwXFx1MjA1NFxcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjBEMC1cXHUyMERDXFx1MjBFMVxcdTIwRTUtXFx1MjBGMFxcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTktXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEyRFxcdTIxMkYtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDdGLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyREUwLVxcdTJERkZcXHUyRTJGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDJGXFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5OVxcdTMwOUFcXHUzMDlELVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGRDVcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MkJcXHVBNjQwLVxcdUE2NkZcXHVBNjc0LVxcdUE2N0RcXHVBNjdGLVxcdUE2RjFcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QUVcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MjdcXHVBODQwLVxcdUE4NzNcXHVBODgwLVxcdUE4QzVcXHVBOEQwLVxcdUE4RDlcXHVBOEUwLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MDAtXFx1QTkyRFxcdUE5MzAtXFx1QTk1M1xcdUE5NjAtXFx1QTk3Q1xcdUE5ODAtXFx1QTlDMFxcdUE5Q0YtXFx1QTlEOVxcdUE5RTAtXFx1QTlGRVxcdUFBMDAtXFx1QUEzNlxcdUFBNDAtXFx1QUE0RFxcdUFBNTAtXFx1QUE1OVxcdUFBNjAtXFx1QUE3NlxcdUFBN0EtXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFRlxcdUFBRjItXFx1QUFGNlxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI2NVxcdUFCNzAtXFx1QUJFQVxcdUFCRUNcXHVBQkVEXFx1QUJGMC1cXHVBQkY5XFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRC1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMkZcXHVGRTMzXFx1RkUzNFxcdUZFNEQtXFx1RkU0RlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMTAtXFx1RkYxOVxcdUZGMjEtXFx1RkYzQVxcdUZGM0ZcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdL1xuICAgICAgfTtcbiAgICAgIEVTNlJlZ2V4ID0ge1xuICAgICAgICAvLyBFQ01BU2NyaXB0IDYvVW5pY29kZSB2OS4wLjAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6XG4gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OiAvW1xceEFBXFx4QjVcXHhCQVxceEMwLVxceEQ2XFx4RDgtXFx4RjZcXHhGOC1cXHUwMkMxXFx1MDJDNi1cXHUwMkQxXFx1MDJFMC1cXHUwMkU0XFx1MDJFQ1xcdTAyRUVcXHUwMzcwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN0EtXFx1MDM3RFxcdTAzN0ZcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0OEEtXFx1MDUyRlxcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjIwLVxcdTA2NEFcXHUwNjZFXFx1MDY2RlxcdTA2NzEtXFx1MDZEM1xcdTA2RDVcXHUwNkU1XFx1MDZFNlxcdTA2RUVcXHUwNkVGXFx1MDZGQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTBcXHUwNzEyLVxcdTA3MkZcXHUwNzRELVxcdTA3QTVcXHUwN0IxXFx1MDdDQS1cXHUwN0VBXFx1MDdGNFxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODE1XFx1MDgxQVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDhBMC1cXHUwOEI0XFx1MDhCNi1cXHUwOEJEXFx1MDkwNC1cXHUwOTM5XFx1MDkzRFxcdTA5NTBcXHUwOTU4LVxcdTA5NjFcXHUwOTcxLVxcdTA5ODBcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJEXFx1MDlDRVxcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUxXFx1MDlGMFxcdTA5RjFcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTcyLVxcdTBBNzRcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkRcXHUwQUQwXFx1MEFFMFxcdTBBRTFcXHUwQUY5XFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0RcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2MVxcdTBCNzFcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCRDBcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzlcXHUwQzNEXFx1MEM1OC1cXHUwQzVBXFx1MEM2MFxcdTBDNjFcXHUwQzgwXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDU0LVxcdTBENTZcXHUwRDVGLVxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUM4MC1cXHUxQzg4XFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0VFXFx1MkNGMlxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDgwLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDlCLVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGRDVcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MUZcXHVBNjJBXFx1QTYyQlxcdUE2NDAtXFx1QTY2RVxcdUE2N0YtXFx1QTY5RFxcdUE2QTAtXFx1QTZFRlxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTdBRVxcdUE3QjAtXFx1QTdCN1xcdUE3RjctXFx1QTgwMVxcdUE4MDMtXFx1QTgwNVxcdUE4MDctXFx1QTgwQVxcdUE4MEMtXFx1QTgyMlxcdUE4NDAtXFx1QTg3M1xcdUE4ODItXFx1QThCM1xcdUE4RjItXFx1QThGN1xcdUE4RkJcXHVBOEZEXFx1QTkwQS1cXHVBOTI1XFx1QTkzMC1cXHVBOTQ2XFx1QTk2MC1cXHVBOTdDXFx1QTk4NC1cXHVBOUIyXFx1QTlDRlxcdUE5RTAtXFx1QTlFNFxcdUE5RTYtXFx1QTlFRlxcdUE5RkEtXFx1QTlGRVxcdUFBMDAtXFx1QUEyOFxcdUFBNDAtXFx1QUE0MlxcdUFBNDQtXFx1QUE0QlxcdUFBNjAtXFx1QUE3NlxcdUFBN0FcXHVBQTdFLVxcdUFBQUZcXHVBQUIxXFx1QUFCNVxcdUFBQjZcXHVBQUI5LVxcdUFBQkRcXHVBQUMwXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFQVxcdUFBRjItXFx1QUFGNFxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI2NVxcdUFCNzAtXFx1QUJFMlxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMURcXHVGQjFGLVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMjEtXFx1RkYzQVxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ118XFx1RDgwMFtcXHVEQzAwLVxcdURDMEJcXHVEQzBELVxcdURDMjZcXHVEQzI4LVxcdURDM0FcXHVEQzNDXFx1REMzRFxcdURDM0YtXFx1REM0RFxcdURDNTAtXFx1REM1RFxcdURDODAtXFx1RENGQVxcdURENDAtXFx1REQ3NFxcdURFODAtXFx1REU5Q1xcdURFQTAtXFx1REVEMFxcdURGMDAtXFx1REYxRlxcdURGMzAtXFx1REY0QVxcdURGNTAtXFx1REY3NVxcdURGODAtXFx1REY5RFxcdURGQTAtXFx1REZDM1xcdURGQzgtXFx1REZDRlxcdURGRDEtXFx1REZENV18XFx1RDgwMVtcXHVEQzAwLVxcdURDOURcXHVEQ0IwLVxcdURDRDNcXHVEQ0Q4LVxcdURDRkJcXHVERDAwLVxcdUREMjdcXHVERDMwLVxcdURENjNcXHVERTAwLVxcdURGMzZcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNjddfFxcdUQ4MDJbXFx1REMwMC1cXHVEQzA1XFx1REMwOFxcdURDMEEtXFx1REMzNVxcdURDMzdcXHVEQzM4XFx1REMzQ1xcdURDM0YtXFx1REM1NVxcdURDNjAtXFx1REM3NlxcdURDODAtXFx1REM5RVxcdURDRTAtXFx1RENGMlxcdURDRjRcXHVEQ0Y1XFx1REQwMC1cXHVERDE1XFx1REQyMC1cXHVERDM5XFx1REQ4MC1cXHVEREI3XFx1RERCRVxcdUREQkZcXHVERTAwXFx1REUxMC1cXHVERTEzXFx1REUxNS1cXHVERTE3XFx1REUxOS1cXHVERTMzXFx1REU2MC1cXHVERTdDXFx1REU4MC1cXHVERTlDXFx1REVDMC1cXHVERUM3XFx1REVDOS1cXHVERUU0XFx1REYwMC1cXHVERjM1XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjcyXFx1REY4MC1cXHVERjkxXXxcXHVEODAzW1xcdURDMDAtXFx1REM0OFxcdURDODAtXFx1RENCMlxcdURDQzAtXFx1RENGMl18XFx1RDgwNFtcXHVEQzAzLVxcdURDMzdcXHVEQzgzLVxcdURDQUZcXHVEQ0QwLVxcdURDRThcXHVERDAzLVxcdUREMjZcXHVERDUwLVxcdURENzJcXHVERDc2XFx1REQ4My1cXHVEREIyXFx1RERDMS1cXHVEREM0XFx1REREQVxcdURERENcXHVERTAwLVxcdURFMTFcXHVERTEzLVxcdURFMkJcXHVERTgwLVxcdURFODZcXHVERTg4XFx1REU4QS1cXHVERThEXFx1REU4Ri1cXHVERTlEXFx1REU5Ri1cXHVERUE4XFx1REVCMC1cXHVERURFXFx1REYwNS1cXHVERjBDXFx1REYwRlxcdURGMTBcXHVERjEzLVxcdURGMjhcXHVERjJBLVxcdURGMzBcXHVERjMyXFx1REYzM1xcdURGMzUtXFx1REYzOVxcdURGM0RcXHVERjUwXFx1REY1RC1cXHVERjYxXXxcXHVEODA1W1xcdURDMDAtXFx1REMzNFxcdURDNDctXFx1REM0QVxcdURDODAtXFx1RENBRlxcdURDQzRcXHVEQ0M1XFx1RENDN1xcdUREODAtXFx1RERBRVxcdURERDgtXFx1REREQlxcdURFMDAtXFx1REUyRlxcdURFNDRcXHVERTgwLVxcdURFQUFcXHVERjAwLVxcdURGMTldfFxcdUQ4MDZbXFx1RENBMC1cXHVEQ0RGXFx1RENGRlxcdURFQzAtXFx1REVGOF18XFx1RDgwN1tcXHVEQzAwLVxcdURDMDhcXHVEQzBBLVxcdURDMkVcXHVEQzQwXFx1REM3Mi1cXHVEQzhGXXxcXHVEODA4W1xcdURDMDAtXFx1REY5OV18XFx1RDgwOVtcXHVEQzAwLVxcdURDNkVcXHVEQzgwLVxcdURENDNdfFtcXHVEODBDXFx1RDgxQy1cXHVEODIwXFx1RDg0MC1cXHVEODY4XFx1RDg2QS1cXHVEODZDXFx1RDg2Ri1cXHVEODcyXVtcXHVEQzAwLVxcdURGRkZdfFxcdUQ4MERbXFx1REMwMC1cXHVEQzJFXXxcXHVEODExW1xcdURDMDAtXFx1REU0Nl18XFx1RDgxQVtcXHVEQzAwLVxcdURFMzhcXHVERTQwLVxcdURFNUVcXHVERUQwLVxcdURFRURcXHVERjAwLVxcdURGMkZcXHVERjQwLVxcdURGNDNcXHVERjYzLVxcdURGNzdcXHVERjdELVxcdURGOEZdfFxcdUQ4MUJbXFx1REYwMC1cXHVERjQ0XFx1REY1MFxcdURGOTMtXFx1REY5RlxcdURGRTBdfFxcdUQ4MjFbXFx1REMwMC1cXHVERkVDXXxcXHVEODIyW1xcdURDMDAtXFx1REVGMl18XFx1RDgyQ1tcXHVEQzAwXFx1REMwMV18XFx1RDgyRltcXHVEQzAwLVxcdURDNkFcXHVEQzcwLVxcdURDN0NcXHVEQzgwLVxcdURDODhcXHVEQzkwLVxcdURDOTldfFxcdUQ4MzVbXFx1REMwMC1cXHVEQzU0XFx1REM1Ni1cXHVEQzlDXFx1REM5RVxcdURDOUZcXHVEQ0EyXFx1RENBNVxcdURDQTZcXHVEQ0E5LVxcdURDQUNcXHVEQ0FFLVxcdURDQjlcXHVEQ0JCXFx1RENCRC1cXHVEQ0MzXFx1RENDNS1cXHVERDA1XFx1REQwNy1cXHVERDBBXFx1REQwRC1cXHVERDE0XFx1REQxNi1cXHVERDFDXFx1REQxRS1cXHVERDM5XFx1REQzQi1cXHVERDNFXFx1REQ0MC1cXHVERDQ0XFx1REQ0NlxcdURENEEtXFx1REQ1MFxcdURENTItXFx1REVBNVxcdURFQTgtXFx1REVDMFxcdURFQzItXFx1REVEQVxcdURFREMtXFx1REVGQVxcdURFRkMtXFx1REYxNFxcdURGMTYtXFx1REYzNFxcdURGMzYtXFx1REY0RVxcdURGNTAtXFx1REY2RVxcdURGNzAtXFx1REY4OFxcdURGOEEtXFx1REZBOFxcdURGQUEtXFx1REZDMlxcdURGQzQtXFx1REZDQl18XFx1RDgzQVtcXHVEQzAwLVxcdURDQzRcXHVERDAwLVxcdURENDNdfFxcdUQ4M0JbXFx1REUwMC1cXHVERTAzXFx1REUwNS1cXHVERTFGXFx1REUyMVxcdURFMjJcXHVERTI0XFx1REUyN1xcdURFMjktXFx1REUzMlxcdURFMzQtXFx1REUzN1xcdURFMzlcXHVERTNCXFx1REU0MlxcdURFNDdcXHVERTQ5XFx1REU0QlxcdURFNEQtXFx1REU0RlxcdURFNTFcXHVERTUyXFx1REU1NFxcdURFNTdcXHVERTU5XFx1REU1QlxcdURFNURcXHVERTVGXFx1REU2MVxcdURFNjJcXHVERTY0XFx1REU2Ny1cXHVERTZBXFx1REU2Qy1cXHVERTcyXFx1REU3NC1cXHVERTc3XFx1REU3OS1cXHVERTdDXFx1REU3RVxcdURFODAtXFx1REU4OVxcdURFOEItXFx1REU5QlxcdURFQTEtXFx1REVBM1xcdURFQTUtXFx1REVBOVxcdURFQUItXFx1REVCQl18XFx1RDg2OVtcXHVEQzAwLVxcdURFRDZcXHVERjAwLVxcdURGRkZdfFxcdUQ4NkRbXFx1REMwMC1cXHVERjM0XFx1REY0MC1cXHVERkZGXXxcXHVEODZFW1xcdURDMDAtXFx1REMxRFxcdURDMjAtXFx1REZGRl18XFx1RDg3M1tcXHVEQzAwLVxcdURFQTFdfFxcdUQ4N0VbXFx1REMwMC1cXHVERTFEXS8sXG4gICAgICAgIC8vIEVDTUFTY3JpcHQgNi9Vbmljb2RlIHY5LjAuMCBOb25Bc2NpaUlkZW50aWZpZXJQYXJ0OlxuICAgICAgICBOb25Bc2NpaUlkZW50aWZpZXJQYXJ0OiAvW1xceEFBXFx4QjVcXHhCN1xceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzMDAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODYtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDgzLVxcdTA0ODdcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDU5MS1cXHUwNUJEXFx1MDVCRlxcdTA1QzFcXHUwNUMyXFx1MDVDNFxcdTA1QzVcXHUwNUM3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYxMC1cXHUwNjFBXFx1MDYyMC1cXHUwNjY5XFx1MDY2RS1cXHUwNkQzXFx1MDZENS1cXHUwNkRDXFx1MDZERi1cXHUwNkU4XFx1MDZFQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTAtXFx1MDc0QVxcdTA3NEQtXFx1MDdCMVxcdTA3QzAtXFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MkRcXHUwODQwLVxcdTA4NUJcXHUwOEEwLVxcdTA4QjRcXHUwOEI2LVxcdTA4QkRcXHUwOEQ0LVxcdTA4RTFcXHUwOEUzLVxcdTA5NjNcXHUwOTY2LVxcdTA5NkZcXHUwOTcxLVxcdTA5ODNcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJDLVxcdTA5QzRcXHUwOUM3XFx1MDlDOFxcdTA5Q0ItXFx1MDlDRVxcdTA5RDdcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFM1xcdTA5RTYtXFx1MDlGMVxcdTBBMDEtXFx1MEEwM1xcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEEzQ1xcdTBBM0UtXFx1MEE0MlxcdTBBNDdcXHUwQTQ4XFx1MEE0Qi1cXHUwQTREXFx1MEE1MVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTY2LVxcdTBBNzVcXHUwQTgxLVxcdTBBODNcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkMtXFx1MEFDNVxcdTBBQzctXFx1MEFDOVxcdTBBQ0ItXFx1MEFDRFxcdTBBRDBcXHUwQUUwLVxcdTBBRTNcXHUwQUU2LVxcdTBBRUZcXHUwQUY5XFx1MEIwMS1cXHUwQjAzXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0MtXFx1MEI0NFxcdTBCNDdcXHUwQjQ4XFx1MEI0Qi1cXHUwQjREXFx1MEI1NlxcdTBCNTdcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2M1xcdTBCNjYtXFx1MEI2RlxcdTBCNzFcXHUwQjgyXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkJFLVxcdTBCQzJcXHUwQkM2LVxcdTBCQzhcXHUwQkNBLVxcdTBCQ0RcXHUwQkQwXFx1MEJEN1xcdTBCRTYtXFx1MEJFRlxcdTBDMDAtXFx1MEMwM1xcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0QtXFx1MEM0NFxcdTBDNDYtXFx1MEM0OFxcdTBDNEEtXFx1MEM0RFxcdTBDNTVcXHUwQzU2XFx1MEM1OC1cXHUwQzVBXFx1MEM2MC1cXHUwQzYzXFx1MEM2Ni1cXHUwQzZGXFx1MEM4MC1cXHUwQzgzXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCQy1cXHUwQ0M0XFx1MENDNi1cXHUwQ0M4XFx1MENDQS1cXHUwQ0NEXFx1MENENVxcdTBDRDZcXHUwQ0RFXFx1MENFMC1cXHUwQ0UzXFx1MENFNi1cXHUwQ0VGXFx1MENGMVxcdTBDRjJcXHUwRDAxLVxcdTBEMDNcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNELVxcdTBENDRcXHUwRDQ2LVxcdTBENDhcXHUwRDRBLVxcdTBENEVcXHUwRDU0LVxcdTBENTdcXHUwRDVGLVxcdTBENjNcXHUwRDY2LVxcdTBENkZcXHUwRDdBLVxcdTBEN0ZcXHUwRDgyXFx1MEQ4M1xcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRENBXFx1MERDRi1cXHUwREQ0XFx1MERENlxcdTBERDgtXFx1MERERlxcdTBERTYtXFx1MERFRlxcdTBERjJcXHUwREYzXFx1MEUwMS1cXHUwRTNBXFx1MEU0MC1cXHUwRTRFXFx1MEU1MC1cXHUwRTU5XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjlcXHUwRUJCLVxcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVDOC1cXHUwRUNEXFx1MEVEMC1cXHUwRUQ5XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGMThcXHUwRjE5XFx1MEYyMC1cXHUwRjI5XFx1MEYzNVxcdTBGMzdcXHUwRjM5XFx1MEYzRS1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY3MS1cXHUwRjg0XFx1MEY4Ni1cXHUwRjk3XFx1MEY5OS1cXHUwRkJDXFx1MEZDNlxcdTEwMDAtXFx1MTA0OVxcdTEwNTAtXFx1MTA5RFxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzVELVxcdTEzNUZcXHUxMzY5LVxcdTEzNzFcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjVcXHUxM0Y4LVxcdTEzRkRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNkVFLVxcdTE2RjhcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTRcXHUxNzIwLVxcdTE3MzRcXHUxNzQwLVxcdTE3NTNcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzcyXFx1MTc3M1xcdTE3ODAtXFx1MTdEM1xcdTE3RDdcXHUxN0RDXFx1MTdERFxcdTE3RTAtXFx1MTdFOVxcdTE4MEItXFx1MTgwRFxcdTE4MTAtXFx1MTgxOVxcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5MjAtXFx1MTkyQlxcdTE5MzAtXFx1MTkzQlxcdTE5NDYtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTE5RDAtXFx1MTlEQVxcdTFBMDAtXFx1MUExQlxcdTFBMjAtXFx1MUE1RVxcdTFBNjAtXFx1MUE3Q1xcdTFBN0YtXFx1MUE4OVxcdTFBOTAtXFx1MUE5OVxcdTFBQTdcXHUxQUIwLVxcdTFBQkRcXHUxQjAwLVxcdTFCNEJcXHUxQjUwLVxcdTFCNTlcXHUxQjZCLVxcdTFCNzNcXHUxQjgwLVxcdTFCRjNcXHUxQzAwLVxcdTFDMzdcXHUxQzQwLVxcdTFDNDlcXHUxQzRELVxcdTFDN0RcXHUxQzgwLVxcdTFDODhcXHUxQ0QwLVxcdTFDRDJcXHUxQ0Q0LVxcdTFDRjZcXHUxQ0Y4XFx1MUNGOVxcdTFEMDAtXFx1MURGNVxcdTFERkItXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDBDXFx1MjAwRFxcdTIwM0ZcXHUyMDQwXFx1MjA1NFxcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjBEMC1cXHUyMERDXFx1MjBFMVxcdTIwRTUtXFx1MjBGMFxcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTgtXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDdGLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyREUwLVxcdTJERkZcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMkZcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDk5LVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGRDVcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MkJcXHVBNjQwLVxcdUE2NkZcXHVBNjc0LVxcdUE2N0RcXHVBNjdGLVxcdUE2RjFcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QUVcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MjdcXHVBODQwLVxcdUE4NzNcXHVBODgwLVxcdUE4QzVcXHVBOEQwLVxcdUE4RDlcXHVBOEUwLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MDAtXFx1QTkyRFxcdUE5MzAtXFx1QTk1M1xcdUE5NjAtXFx1QTk3Q1xcdUE5ODAtXFx1QTlDMFxcdUE5Q0YtXFx1QTlEOVxcdUE5RTAtXFx1QTlGRVxcdUFBMDAtXFx1QUEzNlxcdUFBNDAtXFx1QUE0RFxcdUFBNTAtXFx1QUE1OVxcdUFBNjAtXFx1QUE3NlxcdUFBN0EtXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFRlxcdUFBRjItXFx1QUFGNlxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI2NVxcdUFCNzAtXFx1QUJFQVxcdUFCRUNcXHVBQkVEXFx1QUJGMC1cXHVBQkY5XFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRC1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMkZcXHVGRTMzXFx1RkUzNFxcdUZFNEQtXFx1RkU0RlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMTAtXFx1RkYxOVxcdUZGMjEtXFx1RkYzQVxcdUZGM0ZcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdfFxcdUQ4MDBbXFx1REMwMC1cXHVEQzBCXFx1REMwRC1cXHVEQzI2XFx1REMyOC1cXHVEQzNBXFx1REMzQ1xcdURDM0RcXHVEQzNGLVxcdURDNERcXHVEQzUwLVxcdURDNURcXHVEQzgwLVxcdURDRkFcXHVERDQwLVxcdURENzRcXHVEREZEXFx1REU4MC1cXHVERTlDXFx1REVBMC1cXHVERUQwXFx1REVFMFxcdURGMDAtXFx1REYxRlxcdURGMzAtXFx1REY0QVxcdURGNTAtXFx1REY3QVxcdURGODAtXFx1REY5RFxcdURGQTAtXFx1REZDM1xcdURGQzgtXFx1REZDRlxcdURGRDEtXFx1REZENV18XFx1RDgwMVtcXHVEQzAwLVxcdURDOURcXHVEQ0EwLVxcdURDQTlcXHVEQ0IwLVxcdURDRDNcXHVEQ0Q4LVxcdURDRkJcXHVERDAwLVxcdUREMjdcXHVERDMwLVxcdURENjNcXHVERTAwLVxcdURGMzZcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNjddfFxcdUQ4MDJbXFx1REMwMC1cXHVEQzA1XFx1REMwOFxcdURDMEEtXFx1REMzNVxcdURDMzdcXHVEQzM4XFx1REMzQ1xcdURDM0YtXFx1REM1NVxcdURDNjAtXFx1REM3NlxcdURDODAtXFx1REM5RVxcdURDRTAtXFx1RENGMlxcdURDRjRcXHVEQ0Y1XFx1REQwMC1cXHVERDE1XFx1REQyMC1cXHVERDM5XFx1REQ4MC1cXHVEREI3XFx1RERCRVxcdUREQkZcXHVERTAwLVxcdURFMDNcXHVERTA1XFx1REUwNlxcdURFMEMtXFx1REUxM1xcdURFMTUtXFx1REUxN1xcdURFMTktXFx1REUzM1xcdURFMzgtXFx1REUzQVxcdURFM0ZcXHVERTYwLVxcdURFN0NcXHVERTgwLVxcdURFOUNcXHVERUMwLVxcdURFQzdcXHVERUM5LVxcdURFRTZcXHVERjAwLVxcdURGMzVcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNzJcXHVERjgwLVxcdURGOTFdfFxcdUQ4MDNbXFx1REMwMC1cXHVEQzQ4XFx1REM4MC1cXHVEQ0IyXFx1RENDMC1cXHVEQ0YyXXxcXHVEODA0W1xcdURDMDAtXFx1REM0NlxcdURDNjYtXFx1REM2RlxcdURDN0YtXFx1RENCQVxcdURDRDAtXFx1RENFOFxcdURDRjAtXFx1RENGOVxcdUREMDAtXFx1REQzNFxcdUREMzYtXFx1REQzRlxcdURENTAtXFx1REQ3M1xcdURENzZcXHVERDgwLVxcdUREQzRcXHVERENBLVxcdUREQ0NcXHVEREQwLVxcdUREREFcXHVERERDXFx1REUwMC1cXHVERTExXFx1REUxMy1cXHVERTM3XFx1REUzRVxcdURFODAtXFx1REU4NlxcdURFODhcXHVERThBLVxcdURFOERcXHVERThGLVxcdURFOURcXHVERTlGLVxcdURFQThcXHVERUIwLVxcdURFRUFcXHVERUYwLVxcdURFRjlcXHVERjAwLVxcdURGMDNcXHVERjA1LVxcdURGMENcXHVERjBGXFx1REYxMFxcdURGMTMtXFx1REYyOFxcdURGMkEtXFx1REYzMFxcdURGMzJcXHVERjMzXFx1REYzNS1cXHVERjM5XFx1REYzQy1cXHVERjQ0XFx1REY0N1xcdURGNDhcXHVERjRCLVxcdURGNERcXHVERjUwXFx1REY1N1xcdURGNUQtXFx1REY2M1xcdURGNjYtXFx1REY2Q1xcdURGNzAtXFx1REY3NF18XFx1RDgwNVtcXHVEQzAwLVxcdURDNEFcXHVEQzUwLVxcdURDNTlcXHVEQzgwLVxcdURDQzVcXHVEQ0M3XFx1RENEMC1cXHVEQ0Q5XFx1REQ4MC1cXHVEREI1XFx1RERCOC1cXHVEREMwXFx1REREOC1cXHVEREREXFx1REUwMC1cXHVERTQwXFx1REU0NFxcdURFNTAtXFx1REU1OVxcdURFODAtXFx1REVCN1xcdURFQzAtXFx1REVDOVxcdURGMDAtXFx1REYxOVxcdURGMUQtXFx1REYyQlxcdURGMzAtXFx1REYzOV18XFx1RDgwNltcXHVEQ0EwLVxcdURDRTlcXHVEQ0ZGXFx1REVDMC1cXHVERUY4XXxcXHVEODA3W1xcdURDMDAtXFx1REMwOFxcdURDMEEtXFx1REMzNlxcdURDMzgtXFx1REM0MFxcdURDNTAtXFx1REM1OVxcdURDNzItXFx1REM4RlxcdURDOTItXFx1RENBN1xcdURDQTktXFx1RENCNl18XFx1RDgwOFtcXHVEQzAwLVxcdURGOTldfFxcdUQ4MDlbXFx1REMwMC1cXHVEQzZFXFx1REM4MC1cXHVERDQzXXxbXFx1RDgwQ1xcdUQ4MUMtXFx1RDgyMFxcdUQ4NDAtXFx1RDg2OFxcdUQ4NkEtXFx1RDg2Q1xcdUQ4NkYtXFx1RDg3Ml1bXFx1REMwMC1cXHVERkZGXXxcXHVEODBEW1xcdURDMDAtXFx1REMyRV18XFx1RDgxMVtcXHVEQzAwLVxcdURFNDZdfFxcdUQ4MUFbXFx1REMwMC1cXHVERTM4XFx1REU0MC1cXHVERTVFXFx1REU2MC1cXHVERTY5XFx1REVEMC1cXHVERUVEXFx1REVGMC1cXHVERUY0XFx1REYwMC1cXHVERjM2XFx1REY0MC1cXHVERjQzXFx1REY1MC1cXHVERjU5XFx1REY2My1cXHVERjc3XFx1REY3RC1cXHVERjhGXXxcXHVEODFCW1xcdURGMDAtXFx1REY0NFxcdURGNTAtXFx1REY3RVxcdURGOEYtXFx1REY5RlxcdURGRTBdfFxcdUQ4MjFbXFx1REMwMC1cXHVERkVDXXxcXHVEODIyW1xcdURDMDAtXFx1REVGMl18XFx1RDgyQ1tcXHVEQzAwXFx1REMwMV18XFx1RDgyRltcXHVEQzAwLVxcdURDNkFcXHVEQzcwLVxcdURDN0NcXHVEQzgwLVxcdURDODhcXHVEQzkwLVxcdURDOTlcXHVEQzlEXFx1REM5RV18XFx1RDgzNFtcXHVERDY1LVxcdURENjlcXHVERDZELVxcdURENzJcXHVERDdCLVxcdUREODJcXHVERDg1LVxcdUREOEJcXHVEREFBLVxcdUREQURcXHVERTQyLVxcdURFNDRdfFxcdUQ4MzVbXFx1REMwMC1cXHVEQzU0XFx1REM1Ni1cXHVEQzlDXFx1REM5RVxcdURDOUZcXHVEQ0EyXFx1RENBNVxcdURDQTZcXHVEQ0E5LVxcdURDQUNcXHVEQ0FFLVxcdURDQjlcXHVEQ0JCXFx1RENCRC1cXHVEQ0MzXFx1RENDNS1cXHVERDA1XFx1REQwNy1cXHVERDBBXFx1REQwRC1cXHVERDE0XFx1REQxNi1cXHVERDFDXFx1REQxRS1cXHVERDM5XFx1REQzQi1cXHVERDNFXFx1REQ0MC1cXHVERDQ0XFx1REQ0NlxcdURENEEtXFx1REQ1MFxcdURENTItXFx1REVBNVxcdURFQTgtXFx1REVDMFxcdURFQzItXFx1REVEQVxcdURFREMtXFx1REVGQVxcdURFRkMtXFx1REYxNFxcdURGMTYtXFx1REYzNFxcdURGMzYtXFx1REY0RVxcdURGNTAtXFx1REY2RVxcdURGNzAtXFx1REY4OFxcdURGOEEtXFx1REZBOFxcdURGQUEtXFx1REZDMlxcdURGQzQtXFx1REZDQlxcdURGQ0UtXFx1REZGRl18XFx1RDgzNltcXHVERTAwLVxcdURFMzZcXHVERTNCLVxcdURFNkNcXHVERTc1XFx1REU4NFxcdURFOUItXFx1REU5RlxcdURFQTEtXFx1REVBRl18XFx1RDgzOFtcXHVEQzAwLVxcdURDMDZcXHVEQzA4LVxcdURDMThcXHVEQzFCLVxcdURDMjFcXHVEQzIzXFx1REMyNFxcdURDMjYtXFx1REMyQV18XFx1RDgzQVtcXHVEQzAwLVxcdURDQzRcXHVEQ0QwLVxcdURDRDZcXHVERDAwLVxcdURENEFcXHVERDUwLVxcdURENTldfFxcdUQ4M0JbXFx1REUwMC1cXHVERTAzXFx1REUwNS1cXHVERTFGXFx1REUyMVxcdURFMjJcXHVERTI0XFx1REUyN1xcdURFMjktXFx1REUzMlxcdURFMzQtXFx1REUzN1xcdURFMzlcXHVERTNCXFx1REU0MlxcdURFNDdcXHVERTQ5XFx1REU0QlxcdURFNEQtXFx1REU0RlxcdURFNTFcXHVERTUyXFx1REU1NFxcdURFNTdcXHVERTU5XFx1REU1QlxcdURFNURcXHVERTVGXFx1REU2MVxcdURFNjJcXHVERTY0XFx1REU2Ny1cXHVERTZBXFx1REU2Qy1cXHVERTcyXFx1REU3NC1cXHVERTc3XFx1REU3OS1cXHVERTdDXFx1REU3RVxcdURFODAtXFx1REU4OVxcdURFOEItXFx1REU5QlxcdURFQTEtXFx1REVBM1xcdURFQTUtXFx1REVBOVxcdURFQUItXFx1REVCQl18XFx1RDg2OVtcXHVEQzAwLVxcdURFRDZcXHVERjAwLVxcdURGRkZdfFxcdUQ4NkRbXFx1REMwMC1cXHVERjM0XFx1REY0MC1cXHVERkZGXXxcXHVEODZFW1xcdURDMDAtXFx1REMxRFxcdURDMjAtXFx1REZGRl18XFx1RDg3M1tcXHVEQzAwLVxcdURFQTFdfFxcdUQ4N0VbXFx1REMwMC1cXHVERTFEXXxcXHVEQjQwW1xcdUREMDAtXFx1RERFRl0vXG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBpc0RlY2ltYWxEaWdpdChjaCkge1xuICAgICAgICByZXR1cm4gMHgzMCA8PSBjaCAmJiBjaCA8PSAweDM5OyAvLyAwLi45XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzSGV4RGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIDB4MzAgPD0gY2ggJiYgY2ggPD0gMHgzOSB8fCAvLyAwLi45XG4gICAgICAgIDB4NjEgPD0gY2ggJiYgY2ggPD0gMHg2NiB8fCAvLyBhLi5mXG4gICAgICAgIDB4NDEgPD0gY2ggJiYgY2ggPD0gMHg0NjsgLy8gQS4uRlxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc09jdGFsRGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoID49IDB4MzAgJiYgY2ggPD0gMHgzNzsgLy8gMC4uN1xuICAgICAgfSAvLyA3LjIgV2hpdGUgU3BhY2VcblxuXG4gICAgICBOT05fQVNDSUlfV0hJVEVTUEFDRVMgPSBbMHgxNjgwLCAweDIwMDAsIDB4MjAwMSwgMHgyMDAyLCAweDIwMDMsIDB4MjAwNCwgMHgyMDA1LCAweDIwMDYsIDB4MjAwNywgMHgyMDA4LCAweDIwMDksIDB4MjAwQSwgMHgyMDJGLCAweDIwNUYsIDB4MzAwMCwgMHhGRUZGXTtcblxuICAgICAgZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7XG4gICAgICAgIHJldHVybiBjaCA9PT0gMHgyMCB8fCBjaCA9PT0gMHgwOSB8fCBjaCA9PT0gMHgwQiB8fCBjaCA9PT0gMHgwQyB8fCBjaCA9PT0gMHhBMCB8fCBjaCA+PSAweDE2ODAgJiYgTk9OX0FTQ0lJX1dISVRFU1BBQ0VTLmluZGV4T2YoY2gpID49IDA7XG4gICAgICB9IC8vIDcuMyBMaW5lIFRlcm1pbmF0b3JzXG5cblxuICAgICAgZnVuY3Rpb24gaXNMaW5lVGVybWluYXRvcihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPT09IDB4MEEgfHwgY2ggPT09IDB4MEQgfHwgY2ggPT09IDB4MjAyOCB8fCBjaCA9PT0gMHgyMDI5O1xuICAgICAgfSAvLyA3LjYgSWRlbnRpZmllciBOYW1lcyBhbmQgSWRlbnRpZmllcnNcblxuXG4gICAgICBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KGNwKSB7XG4gICAgICAgIGlmIChjcCA8PSAweEZGRkYpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjcCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY3UxID0gU3RyaW5nLmZyb21DaGFyQ29kZShNYXRoLmZsb29yKChjcCAtIDB4MTAwMDApIC8gMHg0MDApICsgMHhEODAwKTtcbiAgICAgICAgdmFyIGN1MiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGNwIC0gMHgxMDAwMCkgJSAweDQwMCArIDB4REMwMCk7XG4gICAgICAgIHJldHVybiBjdTEgKyBjdTI7XG4gICAgICB9XG5cbiAgICAgIElERU5USUZJRVJfU1RBUlQgPSBuZXcgQXJyYXkoMHg4MCk7XG5cbiAgICAgIGZvciAoY2ggPSAwOyBjaCA8IDB4ODA7ICsrY2gpIHtcbiAgICAgICAgSURFTlRJRklFUl9TVEFSVFtjaF0gPSBjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EgfHwgLy8gYS4uelxuICAgICAgICBjaCA+PSAweDQxICYmIGNoIDw9IDB4NUEgfHwgLy8gQS4uWlxuICAgICAgICBjaCA9PT0gMHgyNCB8fCBjaCA9PT0gMHg1RjsgLy8gJCAoZG9sbGFyKSBhbmQgXyAodW5kZXJzY29yZSlcbiAgICAgIH1cblxuICAgICAgSURFTlRJRklFUl9QQVJUID0gbmV3IEFycmF5KDB4ODApO1xuXG4gICAgICBmb3IgKGNoID0gMDsgY2ggPCAweDgwOyArK2NoKSB7XG4gICAgICAgIElERU5USUZJRVJfUEFSVFtjaF0gPSBjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EgfHwgLy8gYS4uelxuICAgICAgICBjaCA+PSAweDQxICYmIGNoIDw9IDB4NUEgfHwgLy8gQS4uWlxuICAgICAgICBjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkgfHwgLy8gMC4uOVxuICAgICAgICBjaCA9PT0gMHgyNCB8fCBjaCA9PT0gMHg1RjsgLy8gJCAoZG9sbGFyKSBhbmQgXyAodW5kZXJzY29yZSlcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnRFUzUoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfU1RBUlRbY2hdIDogRVM1UmVnZXguTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnRFUzUoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfUEFSVFtjaF0gOiBFUzVSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJQYXJ0LnRlc3QoZnJvbUNvZGVQb2ludChjaCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc0lkZW50aWZpZXJTdGFydEVTNihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPCAweDgwID8gSURFTlRJRklFUl9TVEFSVFtjaF0gOiBFUzZSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJTdGFydC50ZXN0KGZyb21Db2RlUG9pbnQoY2gpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyUGFydEVTNihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPCAweDgwID8gSURFTlRJRklFUl9QQVJUW2NoXSA6IEVTNlJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclBhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgICB9XG5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0ge1xuICAgICAgICBpc0RlY2ltYWxEaWdpdDogaXNEZWNpbWFsRGlnaXQsXG4gICAgICAgIGlzSGV4RGlnaXQ6IGlzSGV4RGlnaXQsXG4gICAgICAgIGlzT2N0YWxEaWdpdDogaXNPY3RhbERpZ2l0LFxuICAgICAgICBpc1doaXRlU3BhY2U6IGlzV2hpdGVTcGFjZSxcbiAgICAgICAgaXNMaW5lVGVybWluYXRvcjogaXNMaW5lVGVybWluYXRvcixcbiAgICAgICAgaXNJZGVudGlmaWVyU3RhcnRFUzU6IGlzSWRlbnRpZmllclN0YXJ0RVM1LFxuICAgICAgICBpc0lkZW50aWZpZXJQYXJ0RVM1OiBpc0lkZW50aWZpZXJQYXJ0RVM1LFxuICAgICAgICBpc0lkZW50aWZpZXJTdGFydEVTNjogaXNJZGVudGlmaWVyU3RhcnRFUzYsXG4gICAgICAgIGlzSWRlbnRpZmllclBhcnRFUzY6IGlzSWRlbnRpZmllclBhcnRFUzZcbiAgICAgIH07XG4gICAgfSkoKTtcbiAgICAvKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuXG4gIH0pO1xuICB2YXIgY29kZV8xID0gY29kZS5pc0RlY2ltYWxEaWdpdDtcbiAgdmFyIGNvZGVfMiA9IGNvZGUuaXNIZXhEaWdpdDtcbiAgdmFyIGNvZGVfMyA9IGNvZGUuaXNPY3RhbERpZ2l0O1xuICB2YXIgY29kZV80ID0gY29kZS5pc1doaXRlU3BhY2U7XG4gIHZhciBjb2RlXzUgPSBjb2RlLmlzTGluZVRlcm1pbmF0b3I7XG4gIHZhciBjb2RlXzYgPSBjb2RlLmlzSWRlbnRpZmllclN0YXJ0RVM1O1xuICB2YXIgY29kZV83ID0gY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1O1xuICB2YXIgY29kZV84ID0gY29kZS5pc0lkZW50aWZpZXJTdGFydEVTNjtcbiAgdmFyIGNvZGVfOSA9IGNvZGUuaXNJZGVudGlmaWVyUGFydEVTNjtcblxuICB2YXIga2V5d29yZCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgICAvKlxuICAgICAgQ29weXJpZ2h0IChDKSAyMDEzIFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cbiAgICBcbiAgICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICAgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gICAgXG4gICAgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICBcbiAgICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gICAgICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gICAgICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICAgICAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICAgICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgICAgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICAgICAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICAgICAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAgICAqL1xuICAgIChmdW5jdGlvbiAoKSB7XG5cbiAgICAgIHZhciBjb2RlJDEgPSBjb2RlO1xuXG4gICAgICBmdW5jdGlvbiBpc1N0cmljdE1vZGVSZXNlcnZlZFdvcmRFUzYoaWQpIHtcbiAgICAgICAgc3dpdGNoIChpZCkge1xuICAgICAgICAgIGNhc2UgJ2ltcGxlbWVudHMnOlxuICAgICAgICAgIGNhc2UgJ2ludGVyZmFjZSc6XG4gICAgICAgICAgY2FzZSAncGFja2FnZSc6XG4gICAgICAgICAgY2FzZSAncHJpdmF0ZSc6XG4gICAgICAgICAgY2FzZSAncHJvdGVjdGVkJzpcbiAgICAgICAgICBjYXNlICdwdWJsaWMnOlxuICAgICAgICAgIGNhc2UgJ3N0YXRpYyc6XG4gICAgICAgICAgY2FzZSAnbGV0JzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc0tleXdvcmRFUzUoaWQsIHN0cmljdCkge1xuICAgICAgICAvLyB5aWVsZCBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMga2V5d29yZCB1bmRlciBub24tc3RyaWN0IG1vZGUuXG4gICAgICAgIGlmICghc3RyaWN0ICYmIGlkID09PSAneWllbGQnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlzS2V5d29yZEVTNihpZCwgc3RyaWN0KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNLZXl3b3JkRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgaWYgKHN0cmljdCAmJiBpc1N0cmljdE1vZGVSZXNlcnZlZFdvcmRFUzYoaWQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGlkLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBpZCA9PT0gJ2lmJyB8fCBpZCA9PT0gJ2luJyB8fCBpZCA9PT0gJ2RvJztcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiBpZCA9PT0gJ3ZhcicgfHwgaWQgPT09ICdmb3InIHx8IGlkID09PSAnbmV3JyB8fCBpZCA9PT0gJ3RyeSc7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gaWQgPT09ICd0aGlzJyB8fCBpZCA9PT0gJ2Vsc2UnIHx8IGlkID09PSAnY2FzZScgfHwgaWQgPT09ICd2b2lkJyB8fCBpZCA9PT0gJ3dpdGgnIHx8IGlkID09PSAnZW51bSc7XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICByZXR1cm4gaWQgPT09ICd3aGlsZScgfHwgaWQgPT09ICdicmVhaycgfHwgaWQgPT09ICdjYXRjaCcgfHwgaWQgPT09ICd0aHJvdycgfHwgaWQgPT09ICdjb25zdCcgfHwgaWQgPT09ICd5aWVsZCcgfHwgaWQgPT09ICdjbGFzcycgfHwgaWQgPT09ICdzdXBlcic7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICByZXR1cm4gaWQgPT09ICdyZXR1cm4nIHx8IGlkID09PSAndHlwZW9mJyB8fCBpZCA9PT0gJ2RlbGV0ZScgfHwgaWQgPT09ICdzd2l0Y2gnIHx8IGlkID09PSAnZXhwb3J0JyB8fCBpZCA9PT0gJ2ltcG9ydCc7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZXR1cm4gaWQgPT09ICdkZWZhdWx0JyB8fCBpZCA9PT0gJ2ZpbmFsbHknIHx8IGlkID09PSAnZXh0ZW5kcyc7XG5cbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICByZXR1cm4gaWQgPT09ICdmdW5jdGlvbicgfHwgaWQgPT09ICdjb250aW51ZScgfHwgaWQgPT09ICdkZWJ1Z2dlcic7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgcmV0dXJuIGlkID09PSAnaW5zdGFuY2VvZic7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzUmVzZXJ2ZWRXb3JkRVM1KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlkID09PSAnbnVsbCcgfHwgaWQgPT09ICd0cnVlJyB8fCBpZCA9PT0gJ2ZhbHNlJyB8fCBpc0tleXdvcmRFUzUoaWQsIHN0cmljdCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzUmVzZXJ2ZWRXb3JkRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlkID09PSAnbnVsbCcgfHwgaWQgPT09ICd0cnVlJyB8fCBpZCA9PT0gJ2ZhbHNlJyB8fCBpc0tleXdvcmRFUzYoaWQsIHN0cmljdCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzUmVzdHJpY3RlZFdvcmQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkID09PSAnZXZhbCcgfHwgaWQgPT09ICdhcmd1bWVudHMnO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc0lkZW50aWZpZXJOYW1lRVM1KGlkKSB7XG4gICAgICAgIHZhciBpLCBpeiwgY2g7XG5cbiAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoID0gaWQuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICBpZiAoIWNvZGUkMS5pc0lkZW50aWZpZXJTdGFydEVTNShjaCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IGlkLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICBjaCA9IGlkLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAgICAgICBpZiAoIWNvZGUkMS5pc0lkZW50aWZpZXJQYXJ0RVM1KGNoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWNvZGVVdGYxNihsZWFkLCB0cmFpbCkge1xuICAgICAgICByZXR1cm4gKGxlYWQgLSAweEQ4MDApICogMHg0MDAgKyAodHJhaWwgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyTmFtZUVTNihpZCkge1xuICAgICAgICB2YXIgaSwgaXosIGNoLCBsb3dDaCwgY2hlY2s7XG5cbiAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrID0gY29kZSQxLmlzSWRlbnRpZmllclN0YXJ0RVM2O1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGl6ID0gaWQubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgIGNoID0gaWQuY2hhckNvZGVBdChpKTtcblxuICAgICAgICAgIGlmICgweEQ4MDAgPD0gY2ggJiYgY2ggPD0gMHhEQkZGKSB7XG4gICAgICAgICAgICArK2k7XG5cbiAgICAgICAgICAgIGlmIChpID49IGl6KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG93Q2ggPSBpZC5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgICAgICBpZiAoISgweERDMDAgPD0gbG93Q2ggJiYgbG93Q2ggPD0gMHhERkZGKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoID0gZGVjb2RlVXRmMTYoY2gsIGxvd0NoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWNoZWNrKGNoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoZWNrID0gY29kZSQxLmlzSWRlbnRpZmllclBhcnRFUzY7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyRVM1KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlzSWRlbnRpZmllck5hbWVFUzUoaWQpICYmICFpc1Jlc2VydmVkV29yZEVTNShpZCwgc3RyaWN0KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlzSWRlbnRpZmllck5hbWVFUzYoaWQpICYmICFpc1Jlc2VydmVkV29yZEVTNihpZCwgc3RyaWN0KTtcbiAgICAgIH1cblxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICAgIGlzS2V5d29yZEVTNTogaXNLZXl3b3JkRVM1LFxuICAgICAgICBpc0tleXdvcmRFUzY6IGlzS2V5d29yZEVTNixcbiAgICAgICAgaXNSZXNlcnZlZFdvcmRFUzU6IGlzUmVzZXJ2ZWRXb3JkRVM1LFxuICAgICAgICBpc1Jlc2VydmVkV29yZEVTNjogaXNSZXNlcnZlZFdvcmRFUzYsXG4gICAgICAgIGlzUmVzdHJpY3RlZFdvcmQ6IGlzUmVzdHJpY3RlZFdvcmQsXG4gICAgICAgIGlzSWRlbnRpZmllck5hbWVFUzU6IGlzSWRlbnRpZmllck5hbWVFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllck5hbWVFUzY6IGlzSWRlbnRpZmllck5hbWVFUzYsXG4gICAgICAgIGlzSWRlbnRpZmllckVTNTogaXNJZGVudGlmaWVyRVM1LFxuICAgICAgICBpc0lkZW50aWZpZXJFUzY6IGlzSWRlbnRpZmllckVTNlxuICAgICAgfTtcbiAgICB9KSgpO1xuICAgIC8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG5cbiAgfSk7XG4gIHZhciBrZXl3b3JkXzEgPSBrZXl3b3JkLmlzS2V5d29yZEVTNTtcbiAgdmFyIGtleXdvcmRfMiA9IGtleXdvcmQuaXNLZXl3b3JkRVM2O1xuICB2YXIga2V5d29yZF8zID0ga2V5d29yZC5pc1Jlc2VydmVkV29yZEVTNTtcbiAgdmFyIGtleXdvcmRfNCA9IGtleXdvcmQuaXNSZXNlcnZlZFdvcmRFUzY7XG4gIHZhciBrZXl3b3JkXzUgPSBrZXl3b3JkLmlzUmVzdHJpY3RlZFdvcmQ7XG4gIHZhciBrZXl3b3JkXzYgPSBrZXl3b3JkLmlzSWRlbnRpZmllck5hbWVFUzU7XG4gIHZhciBrZXl3b3JkXzcgPSBrZXl3b3JkLmlzSWRlbnRpZmllck5hbWVFUzY7XG4gIHZhciBrZXl3b3JkXzggPSBrZXl3b3JkLmlzSWRlbnRpZmllckVTNTtcbiAgdmFyIGtleXdvcmRfOSA9IGtleXdvcmQuaXNJZGVudGlmaWVyRVM2O1xuXG4gIHZhciB1dGlscyQxID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAgIC8qXG4gICAgICBDb3B5cmlnaHQgKEMpIDIwMTMgWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPlxuICAgIFxuICAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gICAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAgICBcbiAgICAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICAgIFxuICAgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgICAgIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgICAgIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gICAgICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gICAgICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAgICAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICAgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gICAgICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gICAgICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICAgICovXG4gICAgKGZ1bmN0aW9uICgpIHtcblxuICAgICAgZXhwb3J0cy5hc3QgPSBhc3Q7XG4gICAgICBleHBvcnRzLmNvZGUgPSBjb2RlO1xuICAgICAgZXhwb3J0cy5rZXl3b3JkID0ga2V5d29yZDtcbiAgICB9KSgpO1xuICAgIC8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG5cbiAgfSk7XG4gIHZhciB1dGlsc18xJDEgPSB1dGlscyQxLmFzdDtcbiAgdmFyIHV0aWxzXzIkMSA9IHV0aWxzJDEuY29kZTtcbiAgdmFyIHV0aWxzXzMkMSA9IHV0aWxzJDEua2V5d29yZDtcblxuICB2YXIgbWF0Y2hPcGVyYXRvcnNSZSQxID0gL1t8XFxcXHt9KClbXFxdXiQrKj8uXS9nO1xuXG4gIHZhciBlc2NhcGVTdHJpbmdSZWdleHAkMSA9IGZ1bmN0aW9uIGVzY2FwZVN0cmluZ1JlZ2V4cChzdHIpIHtcbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKG1hdGNoT3BlcmF0b3JzUmUkMSwgJ1xcXFwkJicpO1xuICB9O1xuXG4gIHZhciBjb2xvck5hbWUkMiA9IHtcbiAgICBcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXG4gICAgXCJhbnRpcXVld2hpdGVcIjogWzI1MCwgMjM1LCAyMTVdLFxuICAgIFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxuICAgIFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXG4gICAgXCJhenVyZVwiOiBbMjQwLCAyNTUsIDI1NV0sXG4gICAgXCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXG4gICAgXCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxuICAgIFwiYmxhY2tcIjogWzAsIDAsIDBdLFxuICAgIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxuICAgIFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcbiAgICBcImJsdWV2aW9sZXRcIjogWzEzOCwgNDMsIDIyNl0sXG4gICAgXCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxuICAgIFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcbiAgICBcImNhZGV0Ymx1ZVwiOiBbOTUsIDE1OCwgMTYwXSxcbiAgICBcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcbiAgICBcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcbiAgICBcImNvcmFsXCI6IFsyNTUsIDEyNywgODBdLFxuICAgIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxuICAgIFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxuICAgIFwiY3JpbXNvblwiOiBbMjIwLCAyMCwgNjBdLFxuICAgIFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxuICAgIFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXG4gICAgXCJkYXJrY3lhblwiOiBbMCwgMTM5LCAxMzldLFxuICAgIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcbiAgICBcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcbiAgICBcImRhcmtncmVlblwiOiBbMCwgMTAwLCAwXSxcbiAgICBcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcbiAgICBcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXG4gICAgXCJkYXJrbWFnZW50YVwiOiBbMTM5LCAwLCAxMzldLFxuICAgIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcbiAgICBcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcbiAgICBcImRhcmtvcmNoaWRcIjogWzE1MywgNTAsIDIwNF0sXG4gICAgXCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxuICAgIFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXG4gICAgXCJkYXJrc2VhZ3JlZW5cIjogWzE0MywgMTg4LCAxNDNdLFxuICAgIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxuICAgIFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXG4gICAgXCJkYXJrc2xhdGVncmV5XCI6IFs0NywgNzksIDc5XSxcbiAgICBcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcbiAgICBcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcbiAgICBcImRlZXBwaW5rXCI6IFsyNTUsIDIwLCAxNDddLFxuICAgIFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcbiAgICBcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxuICAgIFwiZGltZ3JleVwiOiBbMTA1LCAxMDUsIDEwNV0sXG4gICAgXCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxuICAgIFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXG4gICAgXCJmbG9yYWx3aGl0ZVwiOiBbMjU1LCAyNTAsIDI0MF0sXG4gICAgXCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxuICAgIFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxuICAgIFwiZ2FpbnNib3JvXCI6IFsyMjAsIDIyMCwgMjIwXSxcbiAgICBcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxuICAgIFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxuICAgIFwiZ29sZGVucm9kXCI6IFsyMTgsIDE2NSwgMzJdLFxuICAgIFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXG4gICAgXCJncmVlblwiOiBbMCwgMTI4LCAwXSxcbiAgICBcImdyZWVueWVsbG93XCI6IFsxNzMsIDI1NSwgNDddLFxuICAgIFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXG4gICAgXCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXG4gICAgXCJob3RwaW5rXCI6IFsyNTUsIDEwNSwgMTgwXSxcbiAgICBcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxuICAgIFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcbiAgICBcIml2b3J5XCI6IFsyNTUsIDI1NSwgMjQwXSxcbiAgICBcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcbiAgICBcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcbiAgICBcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwgMjQwLCAyNDVdLFxuICAgIFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXG4gICAgXCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxuICAgIFwibGlnaHRibHVlXCI6IFsxNzMsIDIxNiwgMjMwXSxcbiAgICBcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxuICAgIFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcbiAgICBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsIDI1MCwgMjEwXSxcbiAgICBcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXG4gICAgXCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcbiAgICBcImxpZ2h0Z3JleVwiOiBbMjExLCAyMTEsIDIxMV0sXG4gICAgXCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxuICAgIFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxuICAgIFwibGlnaHRzZWFncmVlblwiOiBbMzIsIDE3OCwgMTcwXSxcbiAgICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXG4gICAgXCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXG4gICAgXCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LCAxMzYsIDE1M10sXG4gICAgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXG4gICAgXCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXG4gICAgXCJsaW1lXCI6IFswLCAyNTUsIDBdLFxuICAgIFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXG4gICAgXCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXG4gICAgXCJtYWdlbnRhXCI6IFsyNTUsIDAsIDI1NV0sXG4gICAgXCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXG4gICAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcbiAgICBcIm1lZGl1bWJsdWVcIjogWzAsIDAsIDIwNV0sXG4gICAgXCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXG4gICAgXCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxuICAgIFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLCAxNzksIDExM10sXG4gICAgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxuICAgIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcbiAgICBcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsIDIwOSwgMjA0XSxcbiAgICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcbiAgICBcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxuICAgIFwibWludGNyZWFtXCI6IFsyNDUsIDI1NSwgMjUwXSxcbiAgICBcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXG4gICAgXCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXG4gICAgXCJuYXZham93aGl0ZVwiOiBbMjU1LCAyMjIsIDE3M10sXG4gICAgXCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxuICAgIFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXG4gICAgXCJvbGl2ZVwiOiBbMTI4LCAxMjgsIDBdLFxuICAgIFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxuICAgIFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXG4gICAgXCJvcmFuZ2VyZWRcIjogWzI1NSwgNjksIDBdLFxuICAgIFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcbiAgICBcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxuICAgIFwicGFsZWdyZWVuXCI6IFsxNTIsIDI1MSwgMTUyXSxcbiAgICBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxuICAgIFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXG4gICAgXCJwYXBheWF3aGlwXCI6IFsyNTUsIDIzOSwgMjEzXSxcbiAgICBcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXG4gICAgXCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxuICAgIFwicGlua1wiOiBbMjU1LCAxOTIsIDIwM10sXG4gICAgXCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcbiAgICBcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxuICAgIFwicHVycGxlXCI6IFsxMjgsIDAsIDEyOF0sXG4gICAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxuICAgIFwicmVkXCI6IFsyNTUsIDAsIDBdLFxuICAgIFwicm9zeWJyb3duXCI6IFsxODgsIDE0MywgMTQzXSxcbiAgICBcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcbiAgICBcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXG4gICAgXCJzYWxtb25cIjogWzI1MCwgMTI4LCAxMTRdLFxuICAgIFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcbiAgICBcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXG4gICAgXCJzZWFzaGVsbFwiOiBbMjU1LCAyNDUsIDIzOF0sXG4gICAgXCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcbiAgICBcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXG4gICAgXCJza3libHVlXCI6IFsxMzUsIDIwNiwgMjM1XSxcbiAgICBcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcbiAgICBcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXG4gICAgXCJzbGF0ZWdyZXlcIjogWzExMiwgMTI4LCAxNDRdLFxuICAgIFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXG4gICAgXCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxuICAgIFwic3RlZWxibHVlXCI6IFs3MCwgMTMwLCAxODBdLFxuICAgIFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcbiAgICBcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcbiAgICBcInRoaXN0bGVcIjogWzIxNiwgMTkxLCAyMTZdLFxuICAgIFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXG4gICAgXCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXG4gICAgXCJ2aW9sZXRcIjogWzIzOCwgMTMwLCAyMzhdLFxuICAgIFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxuICAgIFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxuICAgIFwid2hpdGVzbW9rZVwiOiBbMjQ1LCAyNDUsIDI0NV0sXG4gICAgXCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcbiAgICBcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXG4gIH07XG5cbiAgdmFyIGNvbnZlcnNpb25zJDIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gICAgLyogTUlUIGxpY2Vuc2UgKi9cbiAgICAvLyBOT1RFOiBjb252ZXJzaW9ucyBzaG91bGQgb25seSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyAoaS5lLiBhcnJheXMsIG9yXG4gICAgLy8gICAgICAgdmFsdWVzIHRoYXQgZ2l2ZSBjb3JyZWN0IGB0eXBlb2ZgIHJlc3VsdHMpLlxuICAgIC8vICAgICAgIGRvIG5vdCB1c2UgYm94IHZhbHVlcyB0eXBlcyAoaS5lLiBOdW1iZXIoKSwgU3RyaW5nKCksIGV0Yy4pXG4gICAgdmFyIHJldmVyc2VLZXl3b3JkcyA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGNvbG9yTmFtZSQyKSB7XG4gICAgICBpZiAoY29sb3JOYW1lJDIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICByZXZlcnNlS2V5d29yZHNbY29sb3JOYW1lJDJba2V5XV0gPSBrZXk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNvbnZlcnQgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgIHJnYjoge1xuICAgICAgICBjaGFubmVsczogMyxcbiAgICAgICAgbGFiZWxzOiAncmdiJ1xuICAgICAgfSxcbiAgICAgIGhzbDoge1xuICAgICAgICBjaGFubmVsczogMyxcbiAgICAgICAgbGFiZWxzOiAnaHNsJ1xuICAgICAgfSxcbiAgICAgIGhzdjoge1xuICAgICAgICBjaGFubmVsczogMyxcbiAgICAgICAgbGFiZWxzOiAnaHN2J1xuICAgICAgfSxcbiAgICAgIGh3Yjoge1xuICAgICAgICBjaGFubmVsczogMyxcbiAgICAgICAgbGFiZWxzOiAnaHdiJ1xuICAgICAgfSxcbiAgICAgIGNteWs6IHtcbiAgICAgICAgY2hhbm5lbHM6IDQsXG4gICAgICAgIGxhYmVsczogJ2NteWsnXG4gICAgICB9LFxuICAgICAgeHl6OiB7XG4gICAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgICBsYWJlbHM6ICd4eXonXG4gICAgICB9LFxuICAgICAgbGFiOiB7XG4gICAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgICBsYWJlbHM6ICdsYWInXG4gICAgICB9LFxuICAgICAgbGNoOiB7XG4gICAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgICBsYWJlbHM6ICdsY2gnXG4gICAgICB9LFxuICAgICAgaGV4OiB7XG4gICAgICAgIGNoYW5uZWxzOiAxLFxuICAgICAgICBsYWJlbHM6IFsnaGV4J11cbiAgICAgIH0sXG4gICAgICBrZXl3b3JkOiB7XG4gICAgICAgIGNoYW5uZWxzOiAxLFxuICAgICAgICBsYWJlbHM6IFsna2V5d29yZCddXG4gICAgICB9LFxuICAgICAgYW5zaTE2OiB7XG4gICAgICAgIGNoYW5uZWxzOiAxLFxuICAgICAgICBsYWJlbHM6IFsnYW5zaTE2J11cbiAgICAgIH0sXG4gICAgICBhbnNpMjU2OiB7XG4gICAgICAgIGNoYW5uZWxzOiAxLFxuICAgICAgICBsYWJlbHM6IFsnYW5zaTI1NiddXG4gICAgICB9LFxuICAgICAgaGNnOiB7XG4gICAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgICBsYWJlbHM6IFsnaCcsICdjJywgJ2cnXVxuICAgICAgfSxcbiAgICAgIGFwcGxlOiB7XG4gICAgICAgIGNoYW5uZWxzOiAzLFxuICAgICAgICBsYWJlbHM6IFsncjE2JywgJ2cxNicsICdiMTYnXVxuICAgICAgfSxcbiAgICAgIGdyYXk6IHtcbiAgICAgICAgY2hhbm5lbHM6IDEsXG4gICAgICAgIGxhYmVsczogWydncmF5J11cbiAgICAgIH1cbiAgICB9OyAvLyBoaWRlIC5jaGFubmVscyBhbmQgLmxhYmVscyBwcm9wZXJ0aWVzXG5cbiAgICBmb3IgKHZhciBtb2RlbCBpbiBjb252ZXJ0KSB7XG4gICAgICBpZiAoY29udmVydC5oYXNPd25Qcm9wZXJ0eShtb2RlbCkpIHtcbiAgICAgICAgaWYgKCEoJ2NoYW5uZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbCBsYWJlbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udmVydFttb2RlbF0ubGFiZWxzLmxlbmd0aCAhPT0gY29udmVydFttb2RlbF0uY2hhbm5lbHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWwgYW5kIGxhYmVsIGNvdW50cyBtaXNtYXRjaDogJyArIG1vZGVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGFubmVscyA9IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuICAgICAgICB2YXIgbGFiZWxzID0gY29udmVydFttb2RlbF0ubGFiZWxzO1xuICAgICAgICBkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG4gICAgICAgIGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2NoYW5uZWxzJywge1xuICAgICAgICAgIHZhbHVlOiBjaGFubmVsc1xuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnbGFiZWxzJywge1xuICAgICAgICAgIHZhbHVlOiBsYWJlbHNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29udmVydC5yZ2IuaHNsID0gZnVuY3Rpb24gKHJnYikge1xuICAgICAgdmFyIHIgPSByZ2JbMF0gLyAyNTU7XG4gICAgICB2YXIgZyA9IHJnYlsxXSAvIDI1NTtcbiAgICAgIHZhciBiID0gcmdiWzJdIC8gMjU1O1xuICAgICAgdmFyIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuICAgICAgdmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgICAgdmFyIGRlbHRhID0gbWF4IC0gbWluO1xuICAgICAgdmFyIGg7XG4gICAgICB2YXIgcztcbiAgICAgIHZhciBsO1xuXG4gICAgICBpZiAobWF4ID09PSBtaW4pIHtcbiAgICAgICAgaCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHIgPT09IG1heCkge1xuICAgICAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xuICAgICAgfSBlbHNlIGlmIChnID09PSBtYXgpIHtcbiAgICAgICAgaCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG4gICAgICB9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuICAgICAgICBoID0gNCArIChyIC0gZykgLyBkZWx0YTtcbiAgICAgIH1cblxuICAgICAgaCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuICAgICAgaWYgKGggPCAwKSB7XG4gICAgICAgIGggKz0gMzYwO1xuICAgICAgfVxuXG4gICAgICBsID0gKG1pbiArIG1heCkgLyAyO1xuXG4gICAgICBpZiAobWF4ID09PSBtaW4pIHtcbiAgICAgICAgcyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGwgPD0gMC41KSB7XG4gICAgICAgIHMgPSBkZWx0YSAvIChtYXggKyBtaW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcyA9IGRlbHRhIC8gKDIgLSBtYXggLSBtaW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi5oc3YgPSBmdW5jdGlvbiAocmdiKSB7XG4gICAgICB2YXIgcmRpZjtcbiAgICAgIHZhciBnZGlmO1xuICAgICAgdmFyIGJkaWY7XG4gICAgICB2YXIgaDtcbiAgICAgIHZhciBzO1xuICAgICAgdmFyIHIgPSByZ2JbMF0gLyAyNTU7XG4gICAgICB2YXIgZyA9IHJnYlsxXSAvIDI1NTtcbiAgICAgIHZhciBiID0gcmdiWzJdIC8gMjU1O1xuICAgICAgdmFyIHYgPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgICAgIHZhciBkaWZmID0gdiAtIE1hdGgubWluKHIsIGcsIGIpO1xuXG4gICAgICB2YXIgZGlmZmMgPSBmdW5jdGlvbiBkaWZmYyhjKSB7XG4gICAgICAgIHJldHVybiAodiAtIGMpIC8gNiAvIGRpZmYgKyAxIC8gMjtcbiAgICAgIH07XG5cbiAgICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICAgIGggPSBzID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMgPSBkaWZmIC8gdjtcbiAgICAgICAgcmRpZiA9IGRpZmZjKHIpO1xuICAgICAgICBnZGlmID0gZGlmZmMoZyk7XG4gICAgICAgIGJkaWYgPSBkaWZmYyhiKTtcblxuICAgICAgICBpZiAociA9PT0gdikge1xuICAgICAgICAgIGggPSBiZGlmIC0gZ2RpZjtcbiAgICAgICAgfSBlbHNlIGlmIChnID09PSB2KSB7XG4gICAgICAgICAgaCA9IDEgLyAzICsgcmRpZiAtIGJkaWY7XG4gICAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdikge1xuICAgICAgICAgIGggPSAyIC8gMyArIGdkaWYgLSByZGlmO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGggPCAwKSB7XG4gICAgICAgICAgaCArPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKGggPiAxKSB7XG4gICAgICAgICAgaCAtPSAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbaCAqIDM2MCwgcyAqIDEwMCwgdiAqIDEwMF07XG4gICAgfTtcblxuICAgIGNvbnZlcnQucmdiLmh3YiA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICAgIHZhciByID0gcmdiWzBdO1xuICAgICAgdmFyIGcgPSByZ2JbMV07XG4gICAgICB2YXIgYiA9IHJnYlsyXTtcbiAgICAgIHZhciBoID0gY29udmVydC5yZ2IuaHNsKHJnYilbMF07XG4gICAgICB2YXIgdyA9IDEgLyAyNTUgKiBNYXRoLm1pbihyLCBNYXRoLm1pbihnLCBiKSk7XG4gICAgICBiID0gMSAtIDEgLyAyNTUgKiBNYXRoLm1heChyLCBNYXRoLm1heChnLCBiKSk7XG4gICAgICByZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi5jbXlrID0gZnVuY3Rpb24gKHJnYikge1xuICAgICAgdmFyIHIgPSByZ2JbMF0gLyAyNTU7XG4gICAgICB2YXIgZyA9IHJnYlsxXSAvIDI1NTtcbiAgICAgIHZhciBiID0gcmdiWzJdIC8gMjU1O1xuICAgICAgdmFyIGM7XG4gICAgICB2YXIgbTtcbiAgICAgIHZhciB5O1xuICAgICAgdmFyIGs7XG4gICAgICBrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG4gICAgICBjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gICAgICBtID0gKDEgLSBnIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gICAgICB5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gICAgICByZXR1cm4gW2MgKiAxMDAsIG0gKiAxMDAsIHkgKiAxMDAsIGsgKiAxMDBdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2VlIGh0dHBzOi8vZW4ubS53aWtpcGVkaWEub3JnL3dpa2kvRXVjbGlkZWFuX2Rpc3RhbmNlI1NxdWFyZWRfRXVjbGlkZWFuX2Rpc3RhbmNlXG4gICAgICogKi9cblxuXG4gICAgZnVuY3Rpb24gY29tcGFyYXRpdmVEaXN0YW5jZSh4LCB5KSB7XG4gICAgICByZXR1cm4gTWF0aC5wb3coeFswXSAtIHlbMF0sIDIpICsgTWF0aC5wb3coeFsxXSAtIHlbMV0sIDIpICsgTWF0aC5wb3coeFsyXSAtIHlbMl0sIDIpO1xuICAgIH1cblxuICAgIGNvbnZlcnQucmdiLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG4gICAgICB2YXIgcmV2ZXJzZWQgPSByZXZlcnNlS2V5d29yZHNbcmdiXTtcblxuICAgICAgaWYgKHJldmVyc2VkKSB7XG4gICAgICAgIHJldHVybiByZXZlcnNlZDtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgIHZhciBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG5cbiAgICAgIGZvciAodmFyIGtleXdvcmQgaW4gY29sb3JOYW1lJDIpIHtcbiAgICAgICAgaWYgKGNvbG9yTmFtZSQyLmhhc093blByb3BlcnR5KGtleXdvcmQpKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gY29sb3JOYW1lJDJba2V5d29yZF07IC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2VcblxuICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7IC8vIENoZWNrIGlmIGl0cyBsZXNzLCBpZiBzbyBzZXQgYXMgY2xvc2VzdFxuXG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDwgY3VycmVudENsb3Nlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgY3VycmVudENsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgY3VycmVudENsb3Nlc3RLZXl3b3JkID0ga2V5d29yZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcbiAgICB9O1xuXG4gICAgY29udmVydC5rZXl3b3JkLnJnYiA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG4gICAgICByZXR1cm4gY29sb3JOYW1lJDJba2V5d29yZF07XG4gICAgfTtcblxuICAgIGNvbnZlcnQucmdiLnh5eiA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICAgIHZhciByID0gcmdiWzBdIC8gMjU1O1xuICAgICAgdmFyIGcgPSByZ2JbMV0gLyAyNTU7XG4gICAgICB2YXIgYiA9IHJnYlsyXSAvIDI1NTsgLy8gYXNzdW1lIHNSR0JcblxuICAgICAgciA9IHIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKHIgKyAwLjA1NSkgLyAxLjA1NSwgMi40KSA6IHIgLyAxMi45MjtcbiAgICAgIGcgPSBnID4gMC4wNDA0NSA/IE1hdGgucG93KChnICsgMC4wNTUpIC8gMS4wNTUsIDIuNCkgOiBnIC8gMTIuOTI7XG4gICAgICBiID0gYiA+IDAuMDQwNDUgPyBNYXRoLnBvdygoYiArIDAuMDU1KSAvIDEuMDU1LCAyLjQpIDogYiAvIDEyLjkyO1xuICAgICAgdmFyIHggPSByICogMC40MTI0ICsgZyAqIDAuMzU3NiArIGIgKiAwLjE4MDU7XG4gICAgICB2YXIgeSA9IHIgKiAwLjIxMjYgKyBnICogMC43MTUyICsgYiAqIDAuMDcyMjtcbiAgICAgIHZhciB6ID0gciAqIDAuMDE5MyArIGcgKiAwLjExOTIgKyBiICogMC45NTA1O1xuICAgICAgcmV0dXJuIFt4ICogMTAwLCB5ICogMTAwLCB6ICogMTAwXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5yZ2IubGFiID0gZnVuY3Rpb24gKHJnYikge1xuICAgICAgdmFyIHh5eiA9IGNvbnZlcnQucmdiLnh5eihyZ2IpO1xuICAgICAgdmFyIHggPSB4eXpbMF07XG4gICAgICB2YXIgeSA9IHh5elsxXTtcbiAgICAgIHZhciB6ID0geHl6WzJdO1xuICAgICAgdmFyIGw7XG4gICAgICB2YXIgYTtcbiAgICAgIHZhciBiO1xuICAgICAgeCAvPSA5NS4wNDc7XG4gICAgICB5IC89IDEwMDtcbiAgICAgIHogLz0gMTA4Ljg4MztcbiAgICAgIHggPSB4ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxIC8gMykgOiA3Ljc4NyAqIHggKyAxNiAvIDExNjtcbiAgICAgIHkgPSB5ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh5LCAxIC8gMykgOiA3Ljc4NyAqIHkgKyAxNiAvIDExNjtcbiAgICAgIHogPSB6ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh6LCAxIC8gMykgOiA3Ljc4NyAqIHogKyAxNiAvIDExNjtcbiAgICAgIGwgPSAxMTYgKiB5IC0gMTY7XG4gICAgICBhID0gNTAwICogKHggLSB5KTtcbiAgICAgIGIgPSAyMDAgKiAoeSAtIHopO1xuICAgICAgcmV0dXJuIFtsLCBhLCBiXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5oc2wucmdiID0gZnVuY3Rpb24gKGhzbCkge1xuICAgICAgdmFyIGggPSBoc2xbMF0gLyAzNjA7XG4gICAgICB2YXIgcyA9IGhzbFsxXSAvIDEwMDtcbiAgICAgIHZhciBsID0gaHNsWzJdIC8gMTAwO1xuICAgICAgdmFyIHQxO1xuICAgICAgdmFyIHQyO1xuICAgICAgdmFyIHQzO1xuICAgICAgdmFyIHJnYjtcbiAgICAgIHZhciB2YWw7XG5cbiAgICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgIHZhbCA9IGwgKiAyNTU7XG4gICAgICAgIHJldHVybiBbdmFsLCB2YWwsIHZhbF07XG4gICAgICB9XG5cbiAgICAgIGlmIChsIDwgMC41KSB7XG4gICAgICAgIHQyID0gbCAqICgxICsgcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0MiA9IGwgKyBzIC0gbCAqIHM7XG4gICAgICB9XG5cbiAgICAgIHQxID0gMiAqIGwgLSB0MjtcbiAgICAgIHJnYiA9IFswLCAwLCAwXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgdDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblxuICAgICAgICBpZiAodDMgPCAwKSB7XG4gICAgICAgICAgdDMrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0MyA+IDEpIHtcbiAgICAgICAgICB0My0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKDYgKiB0MyA8IDEpIHtcbiAgICAgICAgICB2YWwgPSB0MSArICh0MiAtIHQxKSAqIDYgKiB0MztcbiAgICAgICAgfSBlbHNlIGlmICgyICogdDMgPCAxKSB7XG4gICAgICAgICAgdmFsID0gdDI7XG4gICAgICAgIH0gZWxzZSBpZiAoMyAqIHQzIDwgMikge1xuICAgICAgICAgIHZhbCA9IHQxICsgKHQyIC0gdDEpICogKDIgLyAzIC0gdDMpICogNjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSB0MTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJnYltpXSA9IHZhbCAqIDI1NTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJnYjtcbiAgICB9O1xuXG4gICAgY29udmVydC5oc2wuaHN2ID0gZnVuY3Rpb24gKGhzbCkge1xuICAgICAgdmFyIGggPSBoc2xbMF07XG4gICAgICB2YXIgcyA9IGhzbFsxXSAvIDEwMDtcbiAgICAgIHZhciBsID0gaHNsWzJdIC8gMTAwO1xuICAgICAgdmFyIHNtaW4gPSBzO1xuICAgICAgdmFyIGxtaW4gPSBNYXRoLm1heChsLCAwLjAxKTtcbiAgICAgIHZhciBzdjtcbiAgICAgIHZhciB2O1xuICAgICAgbCAqPSAyO1xuICAgICAgcyAqPSBsIDw9IDEgPyBsIDogMiAtIGw7XG4gICAgICBzbWluICo9IGxtaW4gPD0gMSA/IGxtaW4gOiAyIC0gbG1pbjtcbiAgICAgIHYgPSAobCArIHMpIC8gMjtcbiAgICAgIHN2ID0gbCA9PT0gMCA/IDIgKiBzbWluIC8gKGxtaW4gKyBzbWluKSA6IDIgKiBzIC8gKGwgKyBzKTtcbiAgICAgIHJldHVybiBbaCwgc3YgKiAxMDAsIHYgKiAxMDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0Lmhzdi5yZ2IgPSBmdW5jdGlvbiAoaHN2KSB7XG4gICAgICB2YXIgaCA9IGhzdlswXSAvIDYwO1xuICAgICAgdmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG4gICAgICB2YXIgdiA9IGhzdlsyXSAvIDEwMDtcbiAgICAgIHZhciBoaSA9IE1hdGguZmxvb3IoaCkgJSA2O1xuICAgICAgdmFyIGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcbiAgICAgIHZhciBwID0gMjU1ICogdiAqICgxIC0gcyk7XG4gICAgICB2YXIgcSA9IDI1NSAqIHYgKiAoMSAtIHMgKiBmKTtcbiAgICAgIHZhciB0ID0gMjU1ICogdiAqICgxIC0gcyAqICgxIC0gZikpO1xuICAgICAgdiAqPSAyNTU7XG5cbiAgICAgIHN3aXRjaCAoaGkpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBbdiwgdCwgcF07XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBbcSwgdiwgcF07XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiBbcCwgdiwgdF07XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHJldHVybiBbcCwgcSwgdl07XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBbdCwgcCwgdl07XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiBbdiwgcCwgcV07XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnZlcnQuaHN2LmhzbCA9IGZ1bmN0aW9uIChoc3YpIHtcbiAgICAgIHZhciBoID0gaHN2WzBdO1xuICAgICAgdmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG4gICAgICB2YXIgdiA9IGhzdlsyXSAvIDEwMDtcbiAgICAgIHZhciB2bWluID0gTWF0aC5tYXgodiwgMC4wMSk7XG4gICAgICB2YXIgbG1pbjtcbiAgICAgIHZhciBzbDtcbiAgICAgIHZhciBsO1xuICAgICAgbCA9ICgyIC0gcykgKiB2O1xuICAgICAgbG1pbiA9ICgyIC0gcykgKiB2bWluO1xuICAgICAgc2wgPSBzICogdm1pbjtcbiAgICAgIHNsIC89IGxtaW4gPD0gMSA/IGxtaW4gOiAyIC0gbG1pbjtcbiAgICAgIHNsID0gc2wgfHwgMDtcbiAgICAgIGwgLz0gMjtcbiAgICAgIHJldHVybiBbaCwgc2wgKiAxMDAsIGwgKiAxMDBdO1xuICAgIH07IC8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzcy1jb2xvci8jaHdiLXRvLXJnYlxuXG5cbiAgICBjb252ZXJ0Lmh3Yi5yZ2IgPSBmdW5jdGlvbiAoaHdiKSB7XG4gICAgICB2YXIgaCA9IGh3YlswXSAvIDM2MDtcbiAgICAgIHZhciB3aCA9IGh3YlsxXSAvIDEwMDtcbiAgICAgIHZhciBibCA9IGh3YlsyXSAvIDEwMDtcbiAgICAgIHZhciByYXRpbyA9IHdoICsgYmw7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciB2O1xuICAgICAgdmFyIGY7XG4gICAgICB2YXIgbjsgLy8gd2ggKyBibCBjYW50IGJlID4gMVxuXG4gICAgICBpZiAocmF0aW8gPiAxKSB7XG4gICAgICAgIHdoIC89IHJhdGlvO1xuICAgICAgICBibCAvPSByYXRpbztcbiAgICAgIH1cblxuICAgICAgaSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuICAgICAgdiA9IDEgLSBibDtcbiAgICAgIGYgPSA2ICogaCAtIGk7XG5cbiAgICAgIGlmICgoaSAmIDB4MDEpICE9PSAwKSB7XG4gICAgICAgIGYgPSAxIC0gZjtcbiAgICAgIH1cblxuICAgICAgbiA9IHdoICsgZiAqICh2IC0gd2gpOyAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvblxuXG4gICAgICB2YXIgcjtcbiAgICAgIHZhciBnO1xuICAgICAgdmFyIGI7XG5cbiAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICBjYXNlIDY6XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByID0gdjtcbiAgICAgICAgICBnID0gbjtcbiAgICAgICAgICBiID0gd2g7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHIgPSBuO1xuICAgICAgICAgIGcgPSB2O1xuICAgICAgICAgIGIgPSB3aDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgciA9IHdoO1xuICAgICAgICAgIGcgPSB2O1xuICAgICAgICAgIGIgPSBuO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByID0gd2g7XG4gICAgICAgICAgZyA9IG47XG4gICAgICAgICAgYiA9IHY7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHIgPSBuO1xuICAgICAgICAgIGcgPSB3aDtcbiAgICAgICAgICBiID0gdjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgciA9IHY7XG4gICAgICAgICAgZyA9IHdoO1xuICAgICAgICAgIGIgPSBuO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmNteWsucmdiID0gZnVuY3Rpb24gKGNteWspIHtcbiAgICAgIHZhciBjID0gY215a1swXSAvIDEwMDtcbiAgICAgIHZhciBtID0gY215a1sxXSAvIDEwMDtcbiAgICAgIHZhciB5ID0gY215a1syXSAvIDEwMDtcbiAgICAgIHZhciBrID0gY215a1szXSAvIDEwMDtcbiAgICAgIHZhciByO1xuICAgICAgdmFyIGc7XG4gICAgICB2YXIgYjtcbiAgICAgIHIgPSAxIC0gTWF0aC5taW4oMSwgYyAqICgxIC0gaykgKyBrKTtcbiAgICAgIGcgPSAxIC0gTWF0aC5taW4oMSwgbSAqICgxIC0gaykgKyBrKTtcbiAgICAgIGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcbiAgICAgIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG4gICAgfTtcblxuICAgIGNvbnZlcnQueHl6LnJnYiA9IGZ1bmN0aW9uICh4eXopIHtcbiAgICAgIHZhciB4ID0geHl6WzBdIC8gMTAwO1xuICAgICAgdmFyIHkgPSB4eXpbMV0gLyAxMDA7XG4gICAgICB2YXIgeiA9IHh5elsyXSAvIDEwMDtcbiAgICAgIHZhciByO1xuICAgICAgdmFyIGc7XG4gICAgICB2YXIgYjtcbiAgICAgIHIgPSB4ICogMy4yNDA2ICsgeSAqIC0xLjUzNzIgKyB6ICogLTAuNDk4NjtcbiAgICAgIGcgPSB4ICogLTAuOTY4OSArIHkgKiAxLjg3NTggKyB6ICogMC4wNDE1O1xuICAgICAgYiA9IHggKiAwLjA1NTcgKyB5ICogLTAuMjA0MCArIHogKiAxLjA1NzA7IC8vIGFzc3VtZSBzUkdCXG5cbiAgICAgIHIgPSByID4gMC4wMDMxMzA4ID8gMS4wNTUgKiBNYXRoLnBvdyhyLCAxLjAgLyAyLjQpIC0gMC4wNTUgOiByICogMTIuOTI7XG4gICAgICBnID0gZyA+IDAuMDAzMTMwOCA/IDEuMDU1ICogTWF0aC5wb3coZywgMS4wIC8gMi40KSAtIDAuMDU1IDogZyAqIDEyLjkyO1xuICAgICAgYiA9IGIgPiAwLjAwMzEzMDggPyAxLjA1NSAqIE1hdGgucG93KGIsIDEuMCAvIDIuNCkgLSAwLjA1NSA6IGIgKiAxMi45MjtcbiAgICAgIHIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCByKSwgMSk7XG4gICAgICBnID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZyksIDEpO1xuICAgICAgYiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcbiAgICAgIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG4gICAgfTtcblxuICAgIGNvbnZlcnQueHl6LmxhYiA9IGZ1bmN0aW9uICh4eXopIHtcbiAgICAgIHZhciB4ID0geHl6WzBdO1xuICAgICAgdmFyIHkgPSB4eXpbMV07XG4gICAgICB2YXIgeiA9IHh5elsyXTtcbiAgICAgIHZhciBsO1xuICAgICAgdmFyIGE7XG4gICAgICB2YXIgYjtcbiAgICAgIHggLz0gOTUuMDQ3O1xuICAgICAgeSAvPSAxMDA7XG4gICAgICB6IC89IDEwOC44ODM7XG4gICAgICB4ID0geCA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMSAvIDMpIDogNy43ODcgKiB4ICsgMTYgLyAxMTY7XG4gICAgICB5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMSAvIDMpIDogNy43ODcgKiB5ICsgMTYgLyAxMTY7XG4gICAgICB6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMSAvIDMpIDogNy43ODcgKiB6ICsgMTYgLyAxMTY7XG4gICAgICBsID0gMTE2ICogeSAtIDE2O1xuICAgICAgYSA9IDUwMCAqICh4IC0geSk7XG4gICAgICBiID0gMjAwICogKHkgLSB6KTtcbiAgICAgIHJldHVybiBbbCwgYSwgYl07XG4gICAgfTtcblxuICAgIGNvbnZlcnQubGFiLnh5eiA9IGZ1bmN0aW9uIChsYWIpIHtcbiAgICAgIHZhciBsID0gbGFiWzBdO1xuICAgICAgdmFyIGEgPSBsYWJbMV07XG4gICAgICB2YXIgYiA9IGxhYlsyXTtcbiAgICAgIHZhciB4O1xuICAgICAgdmFyIHk7XG4gICAgICB2YXIgejtcbiAgICAgIHkgPSAobCArIDE2KSAvIDExNjtcbiAgICAgIHggPSBhIC8gNTAwICsgeTtcbiAgICAgIHogPSB5IC0gYiAvIDIwMDtcbiAgICAgIHZhciB5MiA9IE1hdGgucG93KHksIDMpO1xuICAgICAgdmFyIHgyID0gTWF0aC5wb3coeCwgMyk7XG4gICAgICB2YXIgejIgPSBNYXRoLnBvdyh6LCAzKTtcbiAgICAgIHkgPSB5MiA+IDAuMDA4ODU2ID8geTIgOiAoeSAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuICAgICAgeCA9IHgyID4gMC4wMDg4NTYgPyB4MiA6ICh4IC0gMTYgLyAxMTYpIC8gNy43ODc7XG4gICAgICB6ID0gejIgPiAwLjAwODg1NiA/IHoyIDogKHogLSAxNiAvIDExNikgLyA3Ljc4NztcbiAgICAgIHggKj0gOTUuMDQ3O1xuICAgICAgeSAqPSAxMDA7XG4gICAgICB6ICo9IDEwOC44ODM7XG4gICAgICByZXR1cm4gW3gsIHksIHpdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmxhYi5sY2ggPSBmdW5jdGlvbiAobGFiKSB7XG4gICAgICB2YXIgbCA9IGxhYlswXTtcbiAgICAgIHZhciBhID0gbGFiWzFdO1xuICAgICAgdmFyIGIgPSBsYWJbMl07XG4gICAgICB2YXIgaHI7XG4gICAgICB2YXIgaDtcbiAgICAgIHZhciBjO1xuICAgICAgaHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuICAgICAgaCA9IGhyICogMzYwIC8gMiAvIE1hdGguUEk7XG5cbiAgICAgIGlmIChoIDwgMCkge1xuICAgICAgICBoICs9IDM2MDtcbiAgICAgIH1cblxuICAgICAgYyA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcbiAgICAgIHJldHVybiBbbCwgYywgaF07XG4gICAgfTtcblxuICAgIGNvbnZlcnQubGNoLmxhYiA9IGZ1bmN0aW9uIChsY2gpIHtcbiAgICAgIHZhciBsID0gbGNoWzBdO1xuICAgICAgdmFyIGMgPSBsY2hbMV07XG4gICAgICB2YXIgaCA9IGxjaFsyXTtcbiAgICAgIHZhciBhO1xuICAgICAgdmFyIGI7XG4gICAgICB2YXIgaHI7XG4gICAgICBociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcbiAgICAgIGEgPSBjICogTWF0aC5jb3MoaHIpO1xuICAgICAgYiA9IGMgKiBNYXRoLnNpbihocik7XG4gICAgICByZXR1cm4gW2wsIGEsIGJdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgdmFyIHIgPSBhcmdzWzBdO1xuICAgICAgdmFyIGcgPSBhcmdzWzFdO1xuICAgICAgdmFyIGIgPSBhcmdzWzJdO1xuICAgICAgdmFyIHZhbHVlID0gMSBpbiBhcmd1bWVudHMgPyBhcmd1bWVudHNbMV0gOiBjb252ZXJ0LnJnYi5oc3YoYXJncylbMl07IC8vIGhzdiAtPiBhbnNpMTYgb3B0aW1pemF0aW9uXG5cbiAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIDUwKTtcblxuICAgICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICAgIHJldHVybiAzMDtcbiAgICAgIH1cblxuICAgICAgdmFyIGFuc2kgPSAzMCArIChNYXRoLnJvdW5kKGIgLyAyNTUpIDw8IDIgfCBNYXRoLnJvdW5kKGcgLyAyNTUpIDw8IDEgfCBNYXRoLnJvdW5kKHIgLyAyNTUpKTtcblxuICAgICAgaWYgKHZhbHVlID09PSAyKSB7XG4gICAgICAgIGFuc2kgKz0gNjA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbnNpO1xuICAgIH07XG5cbiAgICBjb252ZXJ0Lmhzdi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgLy8gb3B0aW1pemF0aW9uIGhlcmU7IHdlIGFscmVhZHkga25vdyB0aGUgdmFsdWUgYW5kIGRvbid0IG5lZWQgdG8gZ2V0XG4gICAgICAvLyBpdCBjb252ZXJ0ZWQgZm9yIHVzLlxuICAgICAgcmV0dXJuIGNvbnZlcnQucmdiLmFuc2kxNihjb252ZXJ0Lmhzdi5yZ2IoYXJncyksIGFyZ3NbMl0pO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi5hbnNpMjU2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgIHZhciByID0gYXJnc1swXTtcbiAgICAgIHZhciBnID0gYXJnc1sxXTtcbiAgICAgIHZhciBiID0gYXJnc1syXTsgLy8gd2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2ZcbiAgICAgIC8vIGJsYWNrIGFuZCB3aGl0ZS4gbm9ybWFsIHBhbGV0dGUgb25seSBoYXMgNCBncmV5c2NhbGUgc2hhZGVzLlxuXG4gICAgICBpZiAociA9PT0gZyAmJiBnID09PSBiKSB7XG4gICAgICAgIGlmIChyIDwgOCkge1xuICAgICAgICAgIHJldHVybiAxNjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyID4gMjQ4KSB7XG4gICAgICAgICAgcmV0dXJuIDIzMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKChyIC0gOCkgLyAyNDcgKiAyNCkgKyAyMzI7XG4gICAgICB9XG5cbiAgICAgIHZhciBhbnNpID0gMTYgKyAzNiAqIE1hdGgucm91bmQociAvIDI1NSAqIDUpICsgNiAqIE1hdGgucm91bmQoZyAvIDI1NSAqIDUpICsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSk7XG4gICAgICByZXR1cm4gYW5zaTtcbiAgICB9O1xuXG4gICAgY29udmVydC5hbnNpMTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgIHZhciBjb2xvciA9IGFyZ3MgJSAxMDsgLy8gaGFuZGxlIGdyZXlzY2FsZVxuXG4gICAgICBpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcbiAgICAgICAgaWYgKGFyZ3MgPiA1MCkge1xuICAgICAgICAgIGNvbG9yICs9IDMuNTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbG9yID0gY29sb3IgLyAxMC41ICogMjU1O1xuICAgICAgICByZXR1cm4gW2NvbG9yLCBjb2xvciwgY29sb3JdO1xuICAgICAgfVxuXG4gICAgICB2YXIgbXVsdCA9ICh+fihhcmdzID4gNTApICsgMSkgKiAwLjU7XG4gICAgICB2YXIgciA9IChjb2xvciAmIDEpICogbXVsdCAqIDI1NTtcbiAgICAgIHZhciBnID0gKGNvbG9yID4+IDEgJiAxKSAqIG11bHQgKiAyNTU7XG4gICAgICB2YXIgYiA9IChjb2xvciA+PiAyICYgMSkgKiBtdWx0ICogMjU1O1xuICAgICAgcmV0dXJuIFtyLCBnLCBiXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5hbnNpMjU2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAvLyBoYW5kbGUgZ3JleXNjYWxlXG4gICAgICBpZiAoYXJncyA+PSAyMzIpIHtcbiAgICAgICAgdmFyIGMgPSAoYXJncyAtIDIzMikgKiAxMCArIDg7XG4gICAgICAgIHJldHVybiBbYywgYywgY107XG4gICAgICB9XG5cbiAgICAgIGFyZ3MgLT0gMTY7XG4gICAgICB2YXIgcmVtO1xuICAgICAgdmFyIHIgPSBNYXRoLmZsb29yKGFyZ3MgLyAzNikgLyA1ICogMjU1O1xuICAgICAgdmFyIGcgPSBNYXRoLmZsb29yKChyZW0gPSBhcmdzICUgMzYpIC8gNikgLyA1ICogMjU1O1xuICAgICAgdmFyIGIgPSByZW0gJSA2IC8gNSAqIDI1NTtcbiAgICAgIHJldHVybiBbciwgZywgYl07XG4gICAgfTtcblxuICAgIGNvbnZlcnQucmdiLmhleCA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICB2YXIgaW50ZWdlciA9ICgoTWF0aC5yb3VuZChhcmdzWzBdKSAmIDB4RkYpIDw8IDE2KSArICgoTWF0aC5yb3VuZChhcmdzWzFdKSAmIDB4RkYpIDw8IDgpICsgKE1hdGgucm91bmQoYXJnc1syXSkgJiAweEZGKTtcbiAgICAgIHZhciBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgcmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbiAgICB9O1xuXG4gICAgY29udmVydC5oZXgucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgIHZhciBtYXRjaCA9IGFyZ3MudG9TdHJpbmcoMTYpLm1hdGNoKC9bYS1mMC05XXs2fXxbYS1mMC05XXszfS9pKTtcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gWzAsIDAsIDBdO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29sb3JTdHJpbmcgPSBtYXRjaFswXTtcblxuICAgICAgaWYgKG1hdGNoWzBdLmxlbmd0aCA9PT0gMykge1xuICAgICAgICBjb2xvclN0cmluZyA9IGNvbG9yU3RyaW5nLnNwbGl0KCcnKS5tYXAoZnVuY3Rpb24gKGNoYXIpIHtcbiAgICAgICAgICByZXR1cm4gY2hhciArIGNoYXI7XG4gICAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW50ZWdlciA9IHBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG4gICAgICB2YXIgciA9IGludGVnZXIgPj4gMTYgJiAweEZGO1xuICAgICAgdmFyIGcgPSBpbnRlZ2VyID4+IDggJiAweEZGO1xuICAgICAgdmFyIGIgPSBpbnRlZ2VyICYgMHhGRjtcbiAgICAgIHJldHVybiBbciwgZywgYl07XG4gICAgfTtcblxuICAgIGNvbnZlcnQucmdiLmhjZyA9IGZ1bmN0aW9uIChyZ2IpIHtcbiAgICAgIHZhciByID0gcmdiWzBdIC8gMjU1O1xuICAgICAgdmFyIGcgPSByZ2JbMV0gLyAyNTU7XG4gICAgICB2YXIgYiA9IHJnYlsyXSAvIDI1NTtcbiAgICAgIHZhciBtYXggPSBNYXRoLm1heChNYXRoLm1heChyLCBnKSwgYik7XG4gICAgICB2YXIgbWluID0gTWF0aC5taW4oTWF0aC5taW4ociwgZyksIGIpO1xuICAgICAgdmFyIGNocm9tYSA9IG1heCAtIG1pbjtcbiAgICAgIHZhciBncmF5c2NhbGU7XG4gICAgICB2YXIgaHVlO1xuXG4gICAgICBpZiAoY2hyb21hIDwgMSkge1xuICAgICAgICBncmF5c2NhbGUgPSBtaW4gLyAoMSAtIGNocm9tYSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncmF5c2NhbGUgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hyb21hIDw9IDApIHtcbiAgICAgICAgaHVlID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobWF4ID09PSByKSB7XG4gICAgICAgIGh1ZSA9IChnIC0gYikgLyBjaHJvbWEgJSA2O1xuICAgICAgfSBlbHNlIGlmIChtYXggPT09IGcpIHtcbiAgICAgICAgaHVlID0gMiArIChiIC0gcikgLyBjaHJvbWE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodWUgPSA0ICsgKHIgLSBnKSAvIGNocm9tYSArIDQ7XG4gICAgICB9XG5cbiAgICAgIGh1ZSAvPSA2O1xuICAgICAgaHVlICU9IDE7XG4gICAgICByZXR1cm4gW2h1ZSAqIDM2MCwgY2hyb21hICogMTAwLCBncmF5c2NhbGUgKiAxMDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmhzbC5oY2cgPSBmdW5jdGlvbiAoaHNsKSB7XG4gICAgICB2YXIgcyA9IGhzbFsxXSAvIDEwMDtcbiAgICAgIHZhciBsID0gaHNsWzJdIC8gMTAwO1xuICAgICAgdmFyIGMgPSAxO1xuICAgICAgdmFyIGYgPSAwO1xuXG4gICAgICBpZiAobCA8IDAuNSkge1xuICAgICAgICBjID0gMi4wICogcyAqIGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjID0gMi4wICogcyAqICgxLjAgLSBsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGMgPCAxLjApIHtcbiAgICAgICAgZiA9IChsIC0gMC41ICogYykgLyAoMS4wIC0gYyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbaHNsWzBdLCBjICogMTAwLCBmICogMTAwXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5oc3YuaGNnID0gZnVuY3Rpb24gKGhzdikge1xuICAgICAgdmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG4gICAgICB2YXIgdiA9IGhzdlsyXSAvIDEwMDtcbiAgICAgIHZhciBjID0gcyAqIHY7XG4gICAgICB2YXIgZiA9IDA7XG5cbiAgICAgIGlmIChjIDwgMS4wKSB7XG4gICAgICAgIGYgPSAodiAtIGMpIC8gKDEgLSBjKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtoc3ZbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmhjZy5yZ2IgPSBmdW5jdGlvbiAoaGNnKSB7XG4gICAgICB2YXIgaCA9IGhjZ1swXSAvIDM2MDtcbiAgICAgIHZhciBjID0gaGNnWzFdIC8gMTAwO1xuICAgICAgdmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cbiAgICAgIGlmIChjID09PSAwLjApIHtcbiAgICAgICAgcmV0dXJuIFtnICogMjU1LCBnICogMjU1LCBnICogMjU1XTtcbiAgICAgIH1cblxuICAgICAgdmFyIHB1cmUgPSBbMCwgMCwgMF07XG4gICAgICB2YXIgaGkgPSBoICUgMSAqIDY7XG4gICAgICB2YXIgdiA9IGhpICUgMTtcbiAgICAgIHZhciB3ID0gMSAtIHY7XG4gICAgICB2YXIgbWcgPSAwO1xuXG4gICAgICBzd2l0Y2ggKE1hdGguZmxvb3IoaGkpKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBwdXJlWzBdID0gMTtcbiAgICAgICAgICBwdXJlWzFdID0gdjtcbiAgICAgICAgICBwdXJlWzJdID0gMDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcHVyZVswXSA9IHc7XG4gICAgICAgICAgcHVyZVsxXSA9IDE7XG4gICAgICAgICAgcHVyZVsyXSA9IDA7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHB1cmVbMF0gPSAwO1xuICAgICAgICAgIHB1cmVbMV0gPSAxO1xuICAgICAgICAgIHB1cmVbMl0gPSB2O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBwdXJlWzBdID0gMDtcbiAgICAgICAgICBwdXJlWzFdID0gdztcbiAgICAgICAgICBwdXJlWzJdID0gMTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcHVyZVswXSA9IHY7XG4gICAgICAgICAgcHVyZVsxXSA9IDA7XG4gICAgICAgICAgcHVyZVsyXSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBwdXJlWzBdID0gMTtcbiAgICAgICAgICBwdXJlWzFdID0gMDtcbiAgICAgICAgICBwdXJlWzJdID0gdztcbiAgICAgIH1cblxuICAgICAgbWcgPSAoMS4wIC0gYykgKiBnO1xuICAgICAgcmV0dXJuIFsoYyAqIHB1cmVbMF0gKyBtZykgKiAyNTUsIChjICogcHVyZVsxXSArIG1nKSAqIDI1NSwgKGMgKiBwdXJlWzJdICsgbWcpICogMjU1XTtcbiAgICB9O1xuXG4gICAgY29udmVydC5oY2cuaHN2ID0gZnVuY3Rpb24gKGhjZykge1xuICAgICAgdmFyIGMgPSBoY2dbMV0gLyAxMDA7XG4gICAgICB2YXIgZyA9IGhjZ1syXSAvIDEwMDtcbiAgICAgIHZhciB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG4gICAgICB2YXIgZiA9IDA7XG5cbiAgICAgIGlmICh2ID4gMC4wKSB7XG4gICAgICAgIGYgPSBjIC8gdjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtoY2dbMF0sIGYgKiAxMDAsIHYgKiAxMDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmhjZy5oc2wgPSBmdW5jdGlvbiAoaGNnKSB7XG4gICAgICB2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcbiAgICAgIHZhciBnID0gaGNnWzJdIC8gMTAwO1xuICAgICAgdmFyIGwgPSBnICogKDEuMCAtIGMpICsgMC41ICogYztcbiAgICAgIHZhciBzID0gMDtcblxuICAgICAgaWYgKGwgPiAwLjAgJiYgbCA8IDAuNSkge1xuICAgICAgICBzID0gYyAvICgyICogbCk7XG4gICAgICB9IGVsc2UgaWYgKGwgPj0gMC41ICYmIGwgPCAxLjApIHtcbiAgICAgICAgcyA9IGMgLyAoMiAqICgxIC0gbCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW2hjZ1swXSwgcyAqIDEwMCwgbCAqIDEwMF07XG4gICAgfTtcblxuICAgIGNvbnZlcnQuaGNnLmh3YiA9IGZ1bmN0aW9uIChoY2cpIHtcbiAgICAgIHZhciBjID0gaGNnWzFdIC8gMTAwO1xuICAgICAgdmFyIGcgPSBoY2dbMl0gLyAxMDA7XG4gICAgICB2YXIgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuICAgICAgcmV0dXJuIFtoY2dbMF0sICh2IC0gYykgKiAxMDAsICgxIC0gdikgKiAxMDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0Lmh3Yi5oY2cgPSBmdW5jdGlvbiAoaHdiKSB7XG4gICAgICB2YXIgdyA9IGh3YlsxXSAvIDEwMDtcbiAgICAgIHZhciBiID0gaHdiWzJdIC8gMTAwO1xuICAgICAgdmFyIHYgPSAxIC0gYjtcbiAgICAgIHZhciBjID0gdiAtIHc7XG4gICAgICB2YXIgZyA9IDA7XG5cbiAgICAgIGlmIChjIDwgMSkge1xuICAgICAgICBnID0gKHYgLSBjKSAvICgxIC0gYyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbaHdiWzBdLCBjICogMTAwLCBnICogMTAwXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5hcHBsZS5yZ2IgPSBmdW5jdGlvbiAoYXBwbGUpIHtcbiAgICAgIHJldHVybiBbYXBwbGVbMF0gLyA2NTUzNSAqIDI1NSwgYXBwbGVbMV0gLyA2NTUzNSAqIDI1NSwgYXBwbGVbMl0gLyA2NTUzNSAqIDI1NV07XG4gICAgfTtcblxuICAgIGNvbnZlcnQucmdiLmFwcGxlID0gZnVuY3Rpb24gKHJnYikge1xuICAgICAgcmV0dXJuIFtyZ2JbMF0gLyAyNTUgKiA2NTUzNSwgcmdiWzFdIC8gMjU1ICogNjU1MzUsIHJnYlsyXSAvIDI1NSAqIDY1NTM1XTtcbiAgICB9O1xuXG4gICAgY29udmVydC5ncmF5LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICByZXR1cm4gW2FyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTVdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmdyYXkuaHNsID0gY29udmVydC5ncmF5LmhzdiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICByZXR1cm4gWzAsIDAsIGFyZ3NbMF1dO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmdyYXkuaHdiID0gZnVuY3Rpb24gKGdyYXkpIHtcbiAgICAgIHJldHVybiBbMCwgMTAwLCBncmF5WzBdXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5ncmF5LmNteWsgPSBmdW5jdGlvbiAoZ3JheSkge1xuICAgICAgcmV0dXJuIFswLCAwLCAwLCBncmF5WzBdXTtcbiAgICB9O1xuXG4gICAgY29udmVydC5ncmF5LmxhYiA9IGZ1bmN0aW9uIChncmF5KSB7XG4gICAgICByZXR1cm4gW2dyYXlbMF0sIDAsIDBdO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LmdyYXkuaGV4ID0gZnVuY3Rpb24gKGdyYXkpIHtcbiAgICAgIHZhciB2YWwgPSBNYXRoLnJvdW5kKGdyYXlbMF0gLyAxMDAgKiAyNTUpICYgMHhGRjtcbiAgICAgIHZhciBpbnRlZ2VyID0gKHZhbCA8PCAxNikgKyAodmFsIDw8IDgpICsgdmFsO1xuICAgICAgdmFyIHN0cmluZyA9IGludGVnZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgICByZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xuICAgIH07XG5cbiAgICBjb252ZXJ0LnJnYi5ncmF5ID0gZnVuY3Rpb24gKHJnYikge1xuICAgICAgdmFyIHZhbCA9IChyZ2JbMF0gKyByZ2JbMV0gKyByZ2JbMl0pIC8gMztcbiAgICAgIHJldHVybiBbdmFsIC8gMjU1ICogMTAwXTtcbiAgICB9O1xuICB9KTtcbiAgdmFyIGNvbnZlcnNpb25zXzEkMSA9IGNvbnZlcnNpb25zJDIucmdiO1xuICB2YXIgY29udmVyc2lvbnNfMiQxID0gY29udmVyc2lvbnMkMi5oc2w7XG4gIHZhciBjb252ZXJzaW9uc18zJDEgPSBjb252ZXJzaW9ucyQyLmhzdjtcbiAgdmFyIGNvbnZlcnNpb25zXzQkMSA9IGNvbnZlcnNpb25zJDIuaHdiO1xuICB2YXIgY29udmVyc2lvbnNfNSQxID0gY29udmVyc2lvbnMkMi5jbXlrO1xuICB2YXIgY29udmVyc2lvbnNfNiQxID0gY29udmVyc2lvbnMkMi54eXo7XG4gIHZhciBjb252ZXJzaW9uc183JDEgPSBjb252ZXJzaW9ucyQyLmxhYjtcbiAgdmFyIGNvbnZlcnNpb25zXzgkMSA9IGNvbnZlcnNpb25zJDIubGNoO1xuICB2YXIgY29udmVyc2lvbnNfOSQxID0gY29udmVyc2lvbnMkMi5oZXg7XG4gIHZhciBjb252ZXJzaW9uc18xMCQxID0gY29udmVyc2lvbnMkMi5rZXl3b3JkO1xuICB2YXIgY29udmVyc2lvbnNfMTEkMSA9IGNvbnZlcnNpb25zJDIuYW5zaTE2O1xuICB2YXIgY29udmVyc2lvbnNfMTIkMSA9IGNvbnZlcnNpb25zJDIuYW5zaTI1NjtcbiAgdmFyIGNvbnZlcnNpb25zXzEzJDEgPSBjb252ZXJzaW9ucyQyLmhjZztcbiAgdmFyIGNvbnZlcnNpb25zXzE0JDEgPSBjb252ZXJzaW9ucyQyLmFwcGxlO1xuICB2YXIgY29udmVyc2lvbnNfMTUkMSA9IGNvbnZlcnNpb25zJDIuZ3JheTtcblxuICAvKlxuICBcdHRoaXMgZnVuY3Rpb24gcm91dGVzIGEgbW9kZWwgdG8gYWxsIG90aGVyIG1vZGVscy5cblxuICBcdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG4gIFx0dG8gdGhlIHJldHVybmVkIHN5bnRoZXRpYyBmdW5jdGlvbi4gVGhpcyBwcm9wZXJ0eSBpcyBhbiBhcnJheVxuICBcdG9mIHN0cmluZ3MsIGVhY2ggd2l0aCB0aGUgc3RlcHMgaW4gYmV0d2VlbiB0aGUgJ2Zyb20nIGFuZCAndG8nXG4gIFx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG4gIFx0Y29udmVyc2lvbnMgdGhhdCBhcmUgbm90IHBvc3NpYmxlIHNpbXBseSBhcmUgbm90IGluY2x1ZGVkLlxuICAqL1xuXG4gIGZ1bmN0aW9uIGJ1aWxkR3JhcGgkMigpIHtcbiAgICB2YXIgZ3JhcGggPSB7fTsgLy8gaHR0cHM6Ly9qc3BlcmYuY29tL29iamVjdC1rZXlzLXZzLWZvci1pbi13aXRoLWNsb3N1cmUvM1xuXG4gICAgdmFyIG1vZGVscyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zJDIpO1xuXG4gICAgZm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZ3JhcGhbbW9kZWxzW2ldXSA9IHtcbiAgICAgICAgLy8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuICAgICAgICAvLyBtaWNyby1vcHQsIGJ1dCB0aGlzIGlzIHNpbXBsZS5cbiAgICAgICAgZGlzdGFuY2U6IC0xLFxuICAgICAgICBwYXJlbnQ6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyYXBoO1xuICB9IC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZWFkdGgtZmlyc3Rfc2VhcmNoXG5cblxuICBmdW5jdGlvbiBkZXJpdmVCRlMkMihmcm9tTW9kZWwpIHtcbiAgICB2YXIgZ3JhcGggPSBidWlsZEdyYXBoJDIoKTtcbiAgICB2YXIgcXVldWUgPSBbZnJvbU1vZGVsXTsgLy8gdW5zaGlmdCAtPiBxdWV1ZSAtPiBwb3BcblxuICAgIGdyYXBoW2Zyb21Nb2RlbF0uZGlzdGFuY2UgPSAwO1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBxdWV1ZS5wb3AoKTtcbiAgICAgIHZhciBhZGphY2VudHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyQyW2N1cnJlbnRdKTtcblxuICAgICAgZm9yICh2YXIgbGVuID0gYWRqYWNlbnRzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYWRqYWNlbnQgPSBhZGphY2VudHNbaV07XG4gICAgICAgIHZhciBub2RlID0gZ3JhcGhbYWRqYWNlbnRdO1xuXG4gICAgICAgIGlmIChub2RlLmRpc3RhbmNlID09PSAtMSkge1xuICAgICAgICAgIG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG4gICAgICAgICAgbm9kZS5wYXJlbnQgPSBjdXJyZW50O1xuICAgICAgICAgIHF1ZXVlLnVuc2hpZnQoYWRqYWNlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgZnVuY3Rpb24gbGluayQyKGZyb20sIHRvKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICByZXR1cm4gdG8oZnJvbShhcmdzKSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXBDb252ZXJzaW9uJDIodG9Nb2RlbCwgZ3JhcGgpIHtcbiAgICB2YXIgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuICAgIHZhciBmbiA9IGNvbnZlcnNpb25zJDJbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50XVt0b01vZGVsXTtcbiAgICB2YXIgY3VyID0gZ3JhcGhbdG9Nb2RlbF0ucGFyZW50O1xuXG4gICAgd2hpbGUgKGdyYXBoW2N1cl0ucGFyZW50KSB7XG4gICAgICBwYXRoLnVuc2hpZnQoZ3JhcGhbY3VyXS5wYXJlbnQpO1xuICAgICAgZm4gPSBsaW5rJDIoY29udmVyc2lvbnMkMltncmFwaFtjdXJdLnBhcmVudF1bY3VyXSwgZm4pO1xuICAgICAgY3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG4gICAgfVxuXG4gICAgZm4uY29udmVyc2lvbiA9IHBhdGg7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHJvdXRlJDIgPSBmdW5jdGlvbiByb3V0ZShmcm9tTW9kZWwpIHtcbiAgICB2YXIgZ3JhcGggPSBkZXJpdmVCRlMkMihmcm9tTW9kZWwpO1xuICAgIHZhciBjb252ZXJzaW9uID0ge307XG4gICAgdmFyIG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblxuICAgIGZvciAodmFyIGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciB0b01vZGVsID0gbW9kZWxzW2ldO1xuICAgICAgdmFyIG5vZGUgPSBncmFwaFt0b01vZGVsXTtcblxuICAgICAgaWYgKG5vZGUucGFyZW50ID09PSBudWxsKSB7XG4gICAgICAgIC8vIG5vIHBvc3NpYmxlIGNvbnZlcnNpb24sIG9yIHRoaXMgbm9kZSBpcyB0aGUgc291cmNlIG1vZGVsLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29udmVyc2lvblt0b01vZGVsXSA9IHdyYXBDb252ZXJzaW9uJDIodG9Nb2RlbCwgZ3JhcGgpO1xuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJzaW9uO1xuICB9O1xuXG4gIHZhciBjb252ZXJ0JDMgPSB7fTtcbiAgdmFyIG1vZGVscyQyID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMkMik7XG5cbiAgZnVuY3Rpb24gd3JhcFJhdyQyKGZuKSB7XG4gICAgdmFyIHdyYXBwZWRGbiA9IGZ1bmN0aW9uIHdyYXBwZWRGbihhcmdzKSB7XG4gICAgICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGFyZ3MpO1xuICAgIH07IC8vIHByZXNlcnZlIC5jb252ZXJzaW9uIHByb3BlcnR5IGlmIHRoZXJlIGlzIG9uZVxuXG5cbiAgICBpZiAoJ2NvbnZlcnNpb24nIGluIGZuKSB7XG4gICAgICB3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBwZWRGbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXBSb3VuZGVkJDIoZm4pIHtcbiAgICB2YXIgd3JhcHBlZEZuID0gZnVuY3Rpb24gd3JhcHBlZEZuKGFyZ3MpIHtcbiAgICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYXJncztcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVzdWx0ID0gZm4oYXJncyk7IC8vIHdlJ3JlIGFzc3VtaW5nIHRoZSByZXN1bHQgaXMgYW4gYXJyYXkgaGVyZS5cbiAgICAgIC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcbiAgICAgIC8vIGluIGNvbnZlcnNpb24gZnVuY3Rpb25zLlxuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yICh2YXIgbGVuID0gcmVzdWx0Lmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHJlc3VsdFtpXSA9IE1hdGgucm91bmQocmVzdWx0W2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07IC8vIHByZXNlcnZlIC5jb252ZXJzaW9uIHByb3BlcnR5IGlmIHRoZXJlIGlzIG9uZVxuXG5cbiAgICBpZiAoJ2NvbnZlcnNpb24nIGluIGZuKSB7XG4gICAgICB3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBwZWRGbjtcbiAgfVxuXG4gIG1vZGVscyQyLmZvckVhY2goZnVuY3Rpb24gKGZyb21Nb2RlbCkge1xuICAgIGNvbnZlcnQkM1tmcm9tTW9kZWxdID0ge307XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnQkM1tmcm9tTW9kZWxdLCAnY2hhbm5lbHMnLCB7XG4gICAgICB2YWx1ZTogY29udmVyc2lvbnMkMltmcm9tTW9kZWxdLmNoYW5uZWxzXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnQkM1tmcm9tTW9kZWxdLCAnbGFiZWxzJywge1xuICAgICAgdmFsdWU6IGNvbnZlcnNpb25zJDJbZnJvbU1vZGVsXS5sYWJlbHNcbiAgICB9KTtcbiAgICB2YXIgcm91dGVzID0gcm91dGUkMihmcm9tTW9kZWwpO1xuICAgIHZhciByb3V0ZU1vZGVscyA9IE9iamVjdC5rZXlzKHJvdXRlcyk7XG4gICAgcm91dGVNb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAodG9Nb2RlbCkge1xuICAgICAgdmFyIGZuID0gcm91dGVzW3RvTW9kZWxdO1xuICAgICAgY29udmVydCQzW2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZCQyKGZuKTtcbiAgICAgIGNvbnZlcnQkM1tmcm9tTW9kZWxdW3RvTW9kZWxdLnJhdyA9IHdyYXBSYXckMihmbik7XG4gICAgfSk7XG4gIH0pO1xuICB2YXIgY29sb3JDb252ZXJ0JDIgPSBjb252ZXJ0JDM7XG5cbiAgdmFyIGFuc2lTdHlsZXMkMiA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcblxuICAgIGNvbnN0IHdyYXBBbnNpMTYgPSAoZm4sIG9mZnNldCkgPT4gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29kZSA9IGZuLmFwcGx5KGNvbG9yQ29udmVydCQyLCBhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIFwiXFx4MUJbXCIuY29uY2F0KGNvZGUgKyBvZmZzZXQsIFwibVwiKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgd3JhcEFuc2kyNTYgPSAoZm4sIG9mZnNldCkgPT4gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29kZSA9IGZuLmFwcGx5KGNvbG9yQ29udmVydCQyLCBhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIFwiXFx4MUJbXCIuY29uY2F0KDM4ICsgb2Zmc2V0LCBcIjs1O1wiKS5jb25jYXQoY29kZSwgXCJtXCIpO1xuICAgIH07XG5cbiAgICBjb25zdCB3cmFwQW5zaTE2bSA9IChmbiwgb2Zmc2V0KSA9PiBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZ2IgPSBmbi5hcHBseShjb2xvckNvbnZlcnQkMiwgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBcIlxceDFCW1wiLmNvbmNhdCgzOCArIG9mZnNldCwgXCI7MjtcIikuY29uY2F0KHJnYlswXSwgXCI7XCIpLmNvbmNhdChyZ2JbMV0sIFwiO1wiKS5jb25jYXQocmdiWzJdLCBcIm1cIik7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFzc2VtYmxlU3R5bGVzKCkge1xuICAgICAgY29uc3QgY29kZXMgPSBuZXcgTWFwKCk7XG4gICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgIG1vZGlmaWVyOiB7XG4gICAgICAgICAgcmVzZXQ6IFswLCAwXSxcbiAgICAgICAgICAvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG4gICAgICAgICAgYm9sZDogWzEsIDIyXSxcbiAgICAgICAgICBkaW06IFsyLCAyMl0sXG4gICAgICAgICAgaXRhbGljOiBbMywgMjNdLFxuICAgICAgICAgIHVuZGVybGluZTogWzQsIDI0XSxcbiAgICAgICAgICBpbnZlcnNlOiBbNywgMjddLFxuICAgICAgICAgIGhpZGRlbjogWzgsIDI4XSxcbiAgICAgICAgICBzdHJpa2V0aHJvdWdoOiBbOSwgMjldXG4gICAgICAgIH0sXG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgYmxhY2s6IFszMCwgMzldLFxuICAgICAgICAgIHJlZDogWzMxLCAzOV0sXG4gICAgICAgICAgZ3JlZW46IFszMiwgMzldLFxuICAgICAgICAgIHllbGxvdzogWzMzLCAzOV0sXG4gICAgICAgICAgYmx1ZTogWzM0LCAzOV0sXG4gICAgICAgICAgbWFnZW50YTogWzM1LCAzOV0sXG4gICAgICAgICAgY3lhbjogWzM2LCAzOV0sXG4gICAgICAgICAgd2hpdGU6IFszNywgMzldLFxuICAgICAgICAgIGdyYXk6IFs5MCwgMzldLFxuICAgICAgICAgIC8vIEJyaWdodCBjb2xvclxuICAgICAgICAgIHJlZEJyaWdodDogWzkxLCAzOV0sXG4gICAgICAgICAgZ3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuICAgICAgICAgIHllbGxvd0JyaWdodDogWzkzLCAzOV0sXG4gICAgICAgICAgYmx1ZUJyaWdodDogWzk0LCAzOV0sXG4gICAgICAgICAgbWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG4gICAgICAgICAgY3lhbkJyaWdodDogWzk2LCAzOV0sXG4gICAgICAgICAgd2hpdGVCcmlnaHQ6IFs5NywgMzldXG4gICAgICAgIH0sXG4gICAgICAgIGJnQ29sb3I6IHtcbiAgICAgICAgICBiZ0JsYWNrOiBbNDAsIDQ5XSxcbiAgICAgICAgICBiZ1JlZDogWzQxLCA0OV0sXG4gICAgICAgICAgYmdHcmVlbjogWzQyLCA0OV0sXG4gICAgICAgICAgYmdZZWxsb3c6IFs0MywgNDldLFxuICAgICAgICAgIGJnQmx1ZTogWzQ0LCA0OV0sXG4gICAgICAgICAgYmdNYWdlbnRhOiBbNDUsIDQ5XSxcbiAgICAgICAgICBiZ0N5YW46IFs0NiwgNDldLFxuICAgICAgICAgIGJnV2hpdGU6IFs0NywgNDldLFxuICAgICAgICAgIC8vIEJyaWdodCBjb2xvclxuICAgICAgICAgIGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcbiAgICAgICAgICBiZ1JlZEJyaWdodDogWzEwMSwgNDldLFxuICAgICAgICAgIGJnR3JlZW5CcmlnaHQ6IFsxMDIsIDQ5XSxcbiAgICAgICAgICBiZ1llbGxvd0JyaWdodDogWzEwMywgNDldLFxuICAgICAgICAgIGJnQmx1ZUJyaWdodDogWzEwNCwgNDldLFxuICAgICAgICAgIGJnTWFnZW50YUJyaWdodDogWzEwNSwgNDldLFxuICAgICAgICAgIGJnQ3lhbkJyaWdodDogWzEwNiwgNDldLFxuICAgICAgICAgIGJnV2hpdGVCcmlnaHQ6IFsxMDcsIDQ5XVxuICAgICAgICB9XG4gICAgICB9OyAvLyBGaXggaHVtYW5zXG5cbiAgICAgIHN0eWxlcy5jb2xvci5ncmV5ID0gc3R5bGVzLmNvbG9yLmdyYXk7XG5cbiAgICAgIGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIE9iamVjdC5rZXlzKHN0eWxlcykpIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBzdHlsZXNbZ3JvdXBOYW1lXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN0eWxlTmFtZSBvZiBPYmplY3Qua2V5cyhncm91cCkpIHtcbiAgICAgICAgICBjb25zdCBzdHlsZSA9IGdyb3VwW3N0eWxlTmFtZV07XG4gICAgICAgICAgc3R5bGVzW3N0eWxlTmFtZV0gPSB7XG4gICAgICAgICAgICBvcGVuOiBcIlxceDFCW1wiLmNvbmNhdChzdHlsZVswXSwgXCJtXCIpLFxuICAgICAgICAgICAgY2xvc2U6IFwiXFx4MUJbXCIuY29uY2F0KHN0eWxlWzFdLCBcIm1cIilcbiAgICAgICAgICB9O1xuICAgICAgICAgIGdyb3VwW3N0eWxlTmFtZV0gPSBzdHlsZXNbc3R5bGVOYW1lXTtcbiAgICAgICAgICBjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsIGdyb3VwTmFtZSwge1xuICAgICAgICAgIHZhbHVlOiBncm91cCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcywgJ2NvZGVzJywge1xuICAgICAgICAgIHZhbHVlOiBjb2RlcyxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYW5zaTJhbnNpID0gbiA9PiBuO1xuXG4gICAgICBjb25zdCByZ2IycmdiID0gKHIsIGcsIGIpID0+IFtyLCBnLCBiXTtcblxuICAgICAgc3R5bGVzLmNvbG9yLmNsb3NlID0gJ1xcdTAwMUJbMzltJztcbiAgICAgIHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcbiAgICAgIHN0eWxlcy5jb2xvci5hbnNpID0ge1xuICAgICAgICBhbnNpOiB3cmFwQW5zaTE2KGFuc2kyYW5zaSwgMClcbiAgICAgIH07XG4gICAgICBzdHlsZXMuY29sb3IuYW5zaTI1NiA9IHtcbiAgICAgICAgYW5zaTI1Njogd3JhcEFuc2kyNTYoYW5zaTJhbnNpLCAwKVxuICAgICAgfTtcbiAgICAgIHN0eWxlcy5jb2xvci5hbnNpMTZtID0ge1xuICAgICAgICByZ2I6IHdyYXBBbnNpMTZtKHJnYjJyZ2IsIDApXG4gICAgICB9O1xuICAgICAgc3R5bGVzLmJnQ29sb3IuYW5zaSA9IHtcbiAgICAgICAgYW5zaTogd3JhcEFuc2kxNihhbnNpMmFuc2ksIDEwKVxuICAgICAgfTtcbiAgICAgIHN0eWxlcy5iZ0NvbG9yLmFuc2kyNTYgPSB7XG4gICAgICAgIGFuc2kyNTY6IHdyYXBBbnNpMjU2KGFuc2kyYW5zaSwgMTApXG4gICAgICB9O1xuICAgICAgc3R5bGVzLmJnQ29sb3IuYW5zaTE2bSA9IHtcbiAgICAgICAgcmdiOiB3cmFwQW5zaTE2bShyZ2IycmdiLCAxMClcbiAgICAgIH07XG5cbiAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhjb2xvckNvbnZlcnQkMikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb2xvckNvbnZlcnQkMltrZXldICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3VpdGUgPSBjb2xvckNvbnZlcnQkMltrZXldO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdhbnNpMTYnKSB7XG4gICAgICAgICAga2V5ID0gJ2Fuc2knO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdhbnNpMTYnIGluIHN1aXRlKSB7XG4gICAgICAgICAgc3R5bGVzLmNvbG9yLmFuc2lba2V5XSA9IHdyYXBBbnNpMTYoc3VpdGUuYW5zaTE2LCAwKTtcbiAgICAgICAgICBzdHlsZXMuYmdDb2xvci5hbnNpW2tleV0gPSB3cmFwQW5zaTE2KHN1aXRlLmFuc2kxNiwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdhbnNpMjU2JyBpbiBzdWl0ZSkge1xuICAgICAgICAgIHN0eWxlcy5jb2xvci5hbnNpMjU2W2tleV0gPSB3cmFwQW5zaTI1NihzdWl0ZS5hbnNpMjU2LCAwKTtcbiAgICAgICAgICBzdHlsZXMuYmdDb2xvci5hbnNpMjU2W2tleV0gPSB3cmFwQW5zaTI1NihzdWl0ZS5hbnNpMjU2LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ3JnYicgaW4gc3VpdGUpIHtcbiAgICAgICAgICBzdHlsZXMuY29sb3IuYW5zaTE2bVtrZXldID0gd3JhcEFuc2kxNm0oc3VpdGUucmdiLCAwKTtcbiAgICAgICAgICBzdHlsZXMuYmdDb2xvci5hbnNpMTZtW2tleV0gPSB3cmFwQW5zaTE2bShzdWl0ZS5yZ2IsIDEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3R5bGVzO1xuICAgIH0gLy8gTWFrZSB0aGUgZXhwb3J0IGltbXV0YWJsZVxuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGFzc2VtYmxlU3R5bGVzXG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGVudiQzID0gcHJvY2Vzcy5lbnY7XG4gIGxldCBmb3JjZUNvbG9yJDI7XG5cbiAgaWYgKGhhc0ZsYWcoJ25vLWNvbG9yJykgfHwgaGFzRmxhZygnbm8tY29sb3JzJykgfHwgaGFzRmxhZygnY29sb3I9ZmFsc2UnKSkge1xuICAgIGZvcmNlQ29sb3IkMiA9IGZhbHNlO1xuICB9IGVsc2UgaWYgKGhhc0ZsYWcoJ2NvbG9yJykgfHwgaGFzRmxhZygnY29sb3JzJykgfHwgaGFzRmxhZygnY29sb3I9dHJ1ZScpIHx8IGhhc0ZsYWcoJ2NvbG9yPWFsd2F5cycpKSB7XG4gICAgZm9yY2VDb2xvciQyID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICgnRk9SQ0VfQ09MT1InIGluIGVudiQzKSB7XG4gICAgZm9yY2VDb2xvciQyID0gZW52JDMuRk9SQ0VfQ09MT1IubGVuZ3RoID09PSAwIHx8IHBhcnNlSW50KGVudiQzLkZPUkNFX0NPTE9SLCAxMCkgIT09IDA7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGVMZXZlbCQyKGxldmVsKSB7XG4gICAgaWYgKGxldmVsID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxldmVsLFxuICAgICAgaGFzQmFzaWM6IHRydWUsXG4gICAgICBoYXMyNTY6IGxldmVsID49IDIsXG4gICAgICBoYXMxNm06IGxldmVsID49IDNcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc3VwcG9ydHNDb2xvciQyKHN0cmVhbSkge1xuICAgIGlmIChmb3JjZUNvbG9yJDIgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAoaGFzRmxhZygnY29sb3I9MTZtJykgfHwgaGFzRmxhZygnY29sb3I9ZnVsbCcpIHx8IGhhc0ZsYWcoJ2NvbG9yPXRydWVjb2xvcicpKSB7XG4gICAgICByZXR1cm4gMztcbiAgICB9XG5cbiAgICBpZiAoaGFzRmxhZygnY29sb3I9MjU2JykpIHtcbiAgICAgIHJldHVybiAyO1xuICAgIH1cblxuICAgIGlmIChzdHJlYW0gJiYgIXN0cmVhbS5pc1RUWSAmJiBmb3JjZUNvbG9yJDIgIT09IHRydWUpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbiA9IGZvcmNlQ29sb3IkMiA/IDEgOiAwO1xuXG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIC8vIE5vZGUuanMgNy41LjAgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgTm9kZS5qcyB0byBpbmNsdWRlIGEgcGF0Y2ggdG9cbiAgICAgIC8vIGxpYnV2IHRoYXQgZW5hYmxlcyAyNTYgY29sb3Igb3V0cHV0IG9uIFdpbmRvd3MuIEFueXRoaW5nIGVhcmxpZXIgYW5kIGl0XG4gICAgICAvLyB3b24ndCB3b3JrLiBIb3dldmVyLCBoZXJlIHdlIHRhcmdldCBOb2RlLmpzIDggYXQgbWluaW11bSBhcyBpdCBpcyBhbiBMVFNcbiAgICAgIC8vIHJlbGVhc2UsIGFuZCBOb2RlLmpzIDcgaXMgbm90LiBXaW5kb3dzIDEwIGJ1aWxkIDEwNTg2IGlzIHRoZSBmaXJzdCBXaW5kb3dzXG4gICAgICAvLyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy4gV2luZG93cyAxMCBidWlsZCAxNDkzMSBpcyB0aGUgZmlyc3QgcmVsZWFzZVxuICAgICAgLy8gdGhhdCBzdXBwb3J0cyAxNm0vVHJ1ZUNvbG9yLlxuICAgICAgY29uc3Qgb3NSZWxlYXNlID0gcmVxdWlyZSQkMCQxLnJlbGVhc2UoKS5zcGxpdCgnLicpO1xuXG4gICAgICBpZiAoTnVtYmVyKHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdCgnLicpWzBdKSA+PSA4ICYmIE51bWJlcihvc1JlbGVhc2VbMF0pID49IDEwICYmIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDEwNTg2KSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxNDkzMSA/IDMgOiAyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBpZiAoJ0NJJyBpbiBlbnYkMykge1xuICAgICAgaWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSSddLnNvbWUoc2lnbiA9PiBzaWduIGluIGVudiQzKSB8fCBlbnYkMy5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWluO1xuICAgIH1cblxuICAgIGlmICgnVEVBTUNJVFlfVkVSU0lPTicgaW4gZW52JDMpIHtcbiAgICAgIHJldHVybiAvXig5XFwuKDAqWzEtOV1cXGQqKVxcLnxcXGR7Mix9XFwuKS8udGVzdChlbnYkMy5URUFNQ0lUWV9WRVJTSU9OKSA/IDEgOiAwO1xuICAgIH1cblxuICAgIGlmIChlbnYkMy5DT0xPUlRFUk0gPT09ICd0cnVlY29sb3InKSB7XG4gICAgICByZXR1cm4gMztcbiAgICB9XG5cbiAgICBpZiAoJ1RFUk1fUFJPR1JBTScgaW4gZW52JDMpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBwYXJzZUludCgoZW52JDMuVEVSTV9QUk9HUkFNX1ZFUlNJT04gfHwgJycpLnNwbGl0KCcuJylbMF0sIDEwKTtcblxuICAgICAgc3dpdGNoIChlbnYkMy5URVJNX1BST0dSQU0pIHtcbiAgICAgICAgY2FzZSAnaVRlcm0uYXBwJzpcbiAgICAgICAgICByZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cbiAgICAgICAgY2FzZSAnQXBwbGVfVGVybWluYWwnOlxuICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICAvLyBObyBkZWZhdWx0XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKC8tMjU2KGNvbG9yKT8kL2kudGVzdChlbnYkMy5URVJNKSkge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfVxuXG4gICAgaWYgKC9ec2NyZWVufF54dGVybXxednQxMDB8XnZ0MjIwfF5yeHZ0fGNvbG9yfGFuc2l8Y3lnd2lufGxpbnV4L2kudGVzdChlbnYkMy5URVJNKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgaWYgKCdDT0xPUlRFUk0nIGluIGVudiQzKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBpZiAoZW52JDMuVEVSTSA9PT0gJ2R1bWInKSB7XG4gICAgICByZXR1cm4gbWluO1xuICAgIH1cblxuICAgIHJldHVybiBtaW47XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTdXBwb3J0TGV2ZWwkMihzdHJlYW0pIHtcbiAgICBjb25zdCBsZXZlbCA9IHN1cHBvcnRzQ29sb3IkMihzdHJlYW0pO1xuICAgIHJldHVybiB0cmFuc2xhdGVMZXZlbCQyKGxldmVsKTtcbiAgfVxuXG4gIHZhciBzdXBwb3J0c0NvbG9yXzEkMiA9IHtcbiAgICBzdXBwb3J0c0NvbG9yOiBnZXRTdXBwb3J0TGV2ZWwkMixcbiAgICBzdGRvdXQ6IGdldFN1cHBvcnRMZXZlbCQyKHByb2Nlc3Muc3Rkb3V0KSxcbiAgICBzdGRlcnI6IGdldFN1cHBvcnRMZXZlbCQyKHByb2Nlc3Muc3RkZXJyKVxuICB9O1xuXG4gIGNvbnN0IFRFTVBMQVRFX1JFR0VYJDIgPSAvKD86XFxcXCh1W2EtZlxcZF17NH18eFthLWZcXGRdezJ9fC4pKXwoPzpcXHsofik/KFxcdysoPzpcXChbXildKlxcKSk/KD86XFwuXFx3Kyg/OlxcKFteKV0qXFwpKT8pKikoPzpbIFxcdF18KD89XFxyP1xcbikpKXwoXFx9KXwoKD86LnxbXFxyXFxuXFxmXSkrPykvZ2k7XG4gIGNvbnN0IFNUWUxFX1JFR0VYJDIgPSAvKD86XnxcXC4pKFxcdyspKD86XFwoKFteKV0qKVxcKSk/L2c7XG4gIGNvbnN0IFNUUklOR19SRUdFWCQyID0gL14oWydcIl0pKCg/OlxcXFwufCg/IVxcMSlbXlxcXFxdKSopXFwxJC87XG4gIGNvbnN0IEVTQ0FQRV9SRUdFWCQyID0gL1xcXFwodVthLWZcXGRdezR9fHhbYS1mXFxkXXsyfXwuKXwoW15cXFxcXSkvZ2k7XG4gIGNvbnN0IEVTQ0FQRVMkMiA9IG5ldyBNYXAoW1snbicsICdcXG4nXSwgWydyJywgJ1xcciddLCBbJ3QnLCAnXFx0J10sIFsnYicsICdcXGInXSwgWydmJywgJ1xcZiddLCBbJ3YnLCAnXFx2J10sIFsnMCcsICdcXDAnXSwgWydcXFxcJywgJ1xcXFwnXSwgWydlJywgJ1xcdTAwMUInXSwgWydhJywgJ1xcdTAwMDcnXV0pO1xuXG4gIGZ1bmN0aW9uIHVuZXNjYXBlJDIoYykge1xuICAgIGlmIChjWzBdID09PSAndScgJiYgYy5sZW5ndGggPT09IDUgfHwgY1swXSA9PT0gJ3gnICYmIGMubGVuZ3RoID09PSAzKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChjLnNsaWNlKDEpLCAxNikpO1xuICAgIH1cblxuICAgIHJldHVybiBFU0NBUEVTJDIuZ2V0KGMpIHx8IGM7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUFyZ3VtZW50cyQyKG5hbWUsIGFyZ3MpIHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgY29uc3QgY2h1bmtzID0gYXJncy50cmltKCkuc3BsaXQoL1xccyosXFxzKi9nKTtcbiAgICBsZXQgbWF0Y2hlcztcblxuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICBpZiAoIWlzTmFOKGNodW5rKSkge1xuICAgICAgICByZXN1bHRzLnB1c2goTnVtYmVyKGNodW5rKSk7XG4gICAgICB9IGVsc2UgaWYgKG1hdGNoZXMgPSBjaHVuay5tYXRjaChTVFJJTkdfUkVHRVgkMikpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKG1hdGNoZXNbMl0ucmVwbGFjZShFU0NBUEVfUkVHRVgkMiwgKG0sIGVzY2FwZSwgY2hyKSA9PiBlc2NhcGUgPyB1bmVzY2FwZSQyKGVzY2FwZSkgOiBjaHIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgQ2hhbGsgdGVtcGxhdGUgc3R5bGUgYXJndW1lbnQ6IFwiLmNvbmNhdChjaHVuaywgXCIgKGluIHN0eWxlICdcIikuY29uY2F0KG5hbWUsIFwiJylcIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VTdHlsZSQyKHN0eWxlKSB7XG4gICAgU1RZTEVfUkVHRVgkMi5sYXN0SW5kZXggPSAwO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICBsZXQgbWF0Y2hlcztcblxuICAgIHdoaWxlICgobWF0Y2hlcyA9IFNUWUxFX1JFR0VYJDIuZXhlYyhzdHlsZSkpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBuYW1lID0gbWF0Y2hlc1sxXTtcblxuICAgICAgaWYgKG1hdGNoZXNbMl0pIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHBhcnNlQXJndW1lbnRzJDIobmFtZSwgbWF0Y2hlc1syXSk7XG4gICAgICAgIHJlc3VsdHMucHVzaChbbmFtZV0uY29uY2F0KGFyZ3MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChbbmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRTdHlsZSQyKGNoYWxrLCBzdHlsZXMpIHtcbiAgICBjb25zdCBlbmFibGVkID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHN0eWxlcykge1xuICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBsYXllci5zdHlsZXMpIHtcbiAgICAgICAgZW5hYmxlZFtzdHlsZVswXV0gPSBsYXllci5pbnZlcnNlID8gbnVsbCA6IHN0eWxlLnNsaWNlKDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjdXJyZW50ID0gY2hhbGs7XG5cbiAgICBmb3IgKGNvbnN0IHN0eWxlTmFtZSBvZiBPYmplY3Qua2V5cyhlbmFibGVkKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZW5hYmxlZFtzdHlsZU5hbWVdKSkge1xuICAgICAgICBpZiAoIShzdHlsZU5hbWUgaW4gY3VycmVudCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIENoYWxrIHN0eWxlOiBcIi5jb25jYXQoc3R5bGVOYW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5hYmxlZFtzdHlsZU5hbWVdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtzdHlsZU5hbWVdLmFwcGx5KGN1cnJlbnQsIGVuYWJsZWRbc3R5bGVOYW1lXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbc3R5bGVOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgdmFyIHRlbXBsYXRlcyQyID0gKGNoYWxrLCB0bXApID0+IHtcbiAgICBjb25zdCBzdHlsZXMgPSBbXTtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICBsZXQgY2h1bmsgPSBbXTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuICAgIHRtcC5yZXBsYWNlKFRFTVBMQVRFX1JFR0VYJDIsIChtLCBlc2NhcGVDaGFyLCBpbnZlcnNlLCBzdHlsZSwgY2xvc2UsIGNocikgPT4ge1xuICAgICAgaWYgKGVzY2FwZUNoYXIpIHtcbiAgICAgICAgY2h1bmsucHVzaCh1bmVzY2FwZSQyKGVzY2FwZUNoYXIpKTtcbiAgICAgIH0gZWxzZSBpZiAoc3R5bGUpIHtcbiAgICAgICAgY29uc3Qgc3RyID0gY2h1bmsuam9pbignJyk7XG4gICAgICAgIGNodW5rID0gW107XG4gICAgICAgIGNodW5rcy5wdXNoKHN0eWxlcy5sZW5ndGggPT09IDAgPyBzdHIgOiBidWlsZFN0eWxlJDIoY2hhbGssIHN0eWxlcykoc3RyKSk7XG4gICAgICAgIHN0eWxlcy5wdXNoKHtcbiAgICAgICAgICBpbnZlcnNlLFxuICAgICAgICAgIHN0eWxlczogcGFyc2VTdHlsZSQyKHN0eWxlKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2xvc2UpIHtcbiAgICAgICAgaWYgKHN0eWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGV4dHJhbmVvdXMgfSBpbiBDaGFsayB0ZW1wbGF0ZSBsaXRlcmFsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjaHVua3MucHVzaChidWlsZFN0eWxlJDIoY2hhbGssIHN0eWxlcykoY2h1bmsuam9pbignJykpKTtcbiAgICAgICAgY2h1bmsgPSBbXTtcbiAgICAgICAgc3R5bGVzLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2h1bmsucHVzaChjaHIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNodW5rcy5wdXNoKGNodW5rLmpvaW4oJycpKTtcblxuICAgIGlmIChzdHlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXJyTXNnID0gXCJDaGFsayB0ZW1wbGF0ZSBsaXRlcmFsIGlzIG1pc3NpbmcgXCIuY29uY2F0KHN0eWxlcy5sZW5ndGgsIFwiIGNsb3NpbmcgYnJhY2tldFwiKS5jb25jYXQoc3R5bGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnLCBcIiAoYH1gKVwiKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgIH1cblxuICAgIHJldHVybiBjaHVua3Muam9pbignJyk7XG4gIH07XG5cbiAgdmFyIGNoYWxrJDIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG5cbiAgICBjb25zdCBzdGRvdXRDb2xvciA9IHN1cHBvcnRzQ29sb3JfMSQyLnN0ZG91dDtcbiAgICBjb25zdCBpc1NpbXBsZVdpbmRvd3NUZXJtID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJiAhKHByb2Nlc3MuZW52LlRFUk0gfHwgJycpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgneHRlcm0nKTsgLy8gYHN1cHBvcnRzQ29sb3IubGV2ZWxgIOKGkiBgYW5zaVN0eWxlcy5jb2xvcltuYW1lXWAgbWFwcGluZ1xuXG4gICAgY29uc3QgbGV2ZWxNYXBwaW5nID0gWydhbnNpJywgJ2Fuc2knLCAnYW5zaTI1NicsICdhbnNpMTZtJ107IC8vIGBjb2xvci1jb252ZXJ0YCBtb2RlbHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBDaGFsayBBUEkgZHVlIHRvIGNvbmZsaWN0cyBhbmQgc3VjaFxuXG4gICAgY29uc3Qgc2tpcE1vZGVscyA9IG5ldyBTZXQoWydncmF5J10pO1xuICAgIGNvbnN0IHN0eWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBmdW5jdGlvbiBhcHBseU9wdGlvbnMob2JqLCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gRGV0ZWN0IGxldmVsIGlmIG5vdCBzZXQgbWFudWFsbHlcblxuICAgICAgY29uc3Qgc2NMZXZlbCA9IHN0ZG91dENvbG9yID8gc3Rkb3V0Q29sb3IubGV2ZWwgOiAwO1xuICAgICAgb2JqLmxldmVsID0gb3B0aW9ucy5sZXZlbCA9PT0gdW5kZWZpbmVkID8gc2NMZXZlbCA6IG9wdGlvbnMubGV2ZWw7XG4gICAgICBvYmouZW5hYmxlZCA9ICdlbmFibGVkJyBpbiBvcHRpb25zID8gb3B0aW9ucy5lbmFibGVkIDogb2JqLmxldmVsID4gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDaGFsayhvcHRpb25zKSB7XG4gICAgICAvLyBXZSBjaGVjayBmb3IgdGhpcy50ZW1wbGF0ZSBoZXJlIHNpbmNlIGNhbGxpbmcgYGNoYWxrLmNvbnN0cnVjdG9yKClgXG4gICAgICAvLyBieSBpdHNlbGYgd2lsbCBoYXZlIGEgYHRoaXNgIG9mIGEgcHJldmlvdXNseSBjb25zdHJ1Y3RlZCBjaGFsayBvYmplY3RcbiAgICAgIGlmICghdGhpcyB8fCAhKHRoaXMgaW5zdGFuY2VvZiBDaGFsaykgfHwgdGhpcy50ZW1wbGF0ZSkge1xuICAgICAgICBjb25zdCBjaGFsayA9IHt9O1xuICAgICAgICBhcHBseU9wdGlvbnMoY2hhbGssIG9wdGlvbnMpO1xuXG4gICAgICAgIGNoYWxrLnRlbXBsYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgcmV0dXJuIGNoYWxrVGFnLmFwcGx5KG51bGwsIFtjaGFsay50ZW1wbGF0ZV0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoY2hhbGssIENoYWxrLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFsay50ZW1wbGF0ZSwgY2hhbGspO1xuICAgICAgICBjaGFsay50ZW1wbGF0ZS5jb25zdHJ1Y3RvciA9IENoYWxrO1xuICAgICAgICByZXR1cm4gY2hhbGsudGVtcGxhdGU7XG4gICAgICB9XG5cbiAgICAgIGFwcGx5T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB9IC8vIFVzZSBicmlnaHQgYmx1ZSBvbiBXaW5kb3dzIGFzIHRoZSBub3JtYWwgYmx1ZSBjb2xvciBpcyBpbGxlZ2libGVcblxuXG4gICAgaWYgKGlzU2ltcGxlV2luZG93c1Rlcm0pIHtcbiAgICAgIGFuc2lTdHlsZXMkMi5ibHVlLm9wZW4gPSAnXFx1MDAxQls5NG0nO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGFuc2lTdHlsZXMkMikpIHtcbiAgICAgIGFuc2lTdHlsZXMkMltrZXldLmNsb3NlUmUgPSBuZXcgUmVnRXhwKGVzY2FwZVN0cmluZ1JlZ2V4cCQxKGFuc2lTdHlsZXMkMltrZXldLmNsb3NlKSwgJ2cnKTtcbiAgICAgIHN0eWxlc1trZXldID0ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgY29kZXMgPSBhbnNpU3R5bGVzJDJba2V5XTtcbiAgICAgICAgICByZXR1cm4gYnVpbGQuY2FsbCh0aGlzLCB0aGlzLl9zdHlsZXMgPyB0aGlzLl9zdHlsZXMuY29uY2F0KGNvZGVzKSA6IFtjb2Rlc10sIHRoaXMuX2VtcHR5LCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgIH07XG4gICAgfVxuXG4gICAgc3R5bGVzLnZpc2libGUgPSB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBidWlsZC5jYWxsKHRoaXMsIHRoaXMuX3N0eWxlcyB8fCBbXSwgdHJ1ZSwgJ3Zpc2libGUnKTtcbiAgICAgIH1cblxuICAgIH07XG4gICAgYW5zaVN0eWxlcyQyLmNvbG9yLmNsb3NlUmUgPSBuZXcgUmVnRXhwKGVzY2FwZVN0cmluZ1JlZ2V4cCQxKGFuc2lTdHlsZXMkMi5jb2xvci5jbG9zZSksICdnJyk7XG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIE9iamVjdC5rZXlzKGFuc2lTdHlsZXMkMi5jb2xvci5hbnNpKSkge1xuICAgICAgaWYgKHNraXBNb2RlbHMuaGFzKG1vZGVsKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc3R5bGVzW21vZGVsXSA9IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIGNvbnN0IGxldmVsID0gdGhpcy5sZXZlbDtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgb3BlbiA9IGFuc2lTdHlsZXMkMi5jb2xvcltsZXZlbE1hcHBpbmdbbGV2ZWxdXVttb2RlbF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVzID0ge1xuICAgICAgICAgICAgICBvcGVuLFxuICAgICAgICAgICAgICBjbG9zZTogYW5zaVN0eWxlcyQyLmNvbG9yLmNsb3NlLFxuICAgICAgICAgICAgICBjbG9zZVJlOiBhbnNpU3R5bGVzJDIuY29sb3IuY2xvc2VSZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBidWlsZC5jYWxsKHRoaXMsIHRoaXMuX3N0eWxlcyA/IHRoaXMuX3N0eWxlcy5jb25jYXQoY29kZXMpIDogW2NvZGVzXSwgdGhpcy5fZW1wdHksIG1vZGVsKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgIH07XG4gICAgfVxuXG4gICAgYW5zaVN0eWxlcyQyLmJnQ29sb3IuY2xvc2VSZSA9IG5ldyBSZWdFeHAoZXNjYXBlU3RyaW5nUmVnZXhwJDEoYW5zaVN0eWxlcyQyLmJnQ29sb3IuY2xvc2UpLCAnZycpO1xuXG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiBPYmplY3Qua2V5cyhhbnNpU3R5bGVzJDIuYmdDb2xvci5hbnNpKSkge1xuICAgICAgaWYgKHNraXBNb2RlbHMuaGFzKG1vZGVsKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmdNb2RlbCA9ICdiZycgKyBtb2RlbFswXS50b1VwcGVyQ2FzZSgpICsgbW9kZWwuc2xpY2UoMSk7XG4gICAgICBzdHlsZXNbYmdNb2RlbF0gPSB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICBjb25zdCBsZXZlbCA9IHRoaXMubGV2ZWw7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wZW4gPSBhbnNpU3R5bGVzJDIuYmdDb2xvcltsZXZlbE1hcHBpbmdbbGV2ZWxdXVttb2RlbF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVzID0ge1xuICAgICAgICAgICAgICBvcGVuLFxuICAgICAgICAgICAgICBjbG9zZTogYW5zaVN0eWxlcyQyLmJnQ29sb3IuY2xvc2UsXG4gICAgICAgICAgICAgIGNsb3NlUmU6IGFuc2lTdHlsZXMkMi5iZ0NvbG9yLmNsb3NlUmVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gYnVpbGQuY2FsbCh0aGlzLCB0aGlzLl9zdHlsZXMgPyB0aGlzLl9zdHlsZXMuY29uY2F0KGNvZGVzKSA6IFtjb2Rlc10sIHRoaXMuX2VtcHR5LCBtb2RlbCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoKCkgPT4ge30sIHN0eWxlcyk7XG5cbiAgICBmdW5jdGlvbiBidWlsZChfc3R5bGVzLCBfZW1wdHksIGtleSkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZ1bmN0aW9uIGJ1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiBhcHBseVN0eWxlLmFwcGx5KGJ1aWxkZXIsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuXG4gICAgICBidWlsZGVyLl9zdHlsZXMgPSBfc3R5bGVzO1xuICAgICAgYnVpbGRlci5fZW1wdHkgPSBfZW1wdHk7XG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShidWlsZGVyLCAnbGV2ZWwnLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG5cbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBzZWxmLmxldmVsO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldChsZXZlbCkge1xuICAgICAgICAgIHNlbGYubGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShidWlsZGVyLCAnZW5hYmxlZCcsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcblxuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuZW5hYmxlZDtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQoZW5hYmxlZCkge1xuICAgICAgICAgIHNlbGYuZW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgfSk7IC8vIFNlZSBiZWxvdyBmb3IgZml4IHJlZ2FyZGluZyBpbnZpc2libGUgZ3JleS9kaW0gY29tYmluYXRpb24gb24gV2luZG93c1xuXG4gICAgICBidWlsZGVyLmhhc0dyZXkgPSB0aGlzLmhhc0dyZXkgfHwga2V5ID09PSAnZ3JheScgfHwga2V5ID09PSAnZ3JleSc7IC8vIGBfX3Byb3RvX19gIGlzIHVzZWQgYmVjYXVzZSB3ZSBtdXN0IHJldHVybiBhIGZ1bmN0aW9uLCBidXQgdGhlcmUgaXNcbiAgICAgIC8vIG5vIHdheSB0byBjcmVhdGUgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHByb3RvdHlwZVxuXG4gICAgICBidWlsZGVyLl9fcHJvdG9fXyA9IHByb3RvOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5U3R5bGUoKSB7XG4gICAgICAvLyBTdXBwb3J0IHZhcmFncywgYnV0IHNpbXBseSBjYXN0IHRvIHN0cmluZyBpbiBjYXNlIHRoZXJlJ3Mgb25seSBvbmUgYXJnXG4gICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgY29uc3QgYXJnc0xlbiA9IGFyZ3MubGVuZ3RoO1xuICAgICAgbGV0IHN0ciA9IFN0cmluZyhhcmd1bWVudHNbMF0pO1xuXG4gICAgICBpZiAoYXJnc0xlbiA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmdzTGVuID4gMSkge1xuICAgICAgICAvLyBEb24ndCBzbGljZSBgYXJndW1lbnRzYCwgaXQgcHJldmVudHMgVjggb3B0aW1pemF0aW9uc1xuICAgICAgICBmb3IgKGxldCBhID0gMTsgYSA8IGFyZ3NMZW47IGErKykge1xuICAgICAgICAgIHN0ciArPSAnICcgKyBhcmdzW2FdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5lbmFibGVkIHx8IHRoaXMubGV2ZWwgPD0gMCB8fCAhc3RyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eSA/ICcnIDogc3RyO1xuICAgICAgfSAvLyBUdXJucyBvdXQgdGhhdCBvbiBXaW5kb3dzIGRpbW1lZCBncmF5IHRleHQgYmVjb21lcyBpbnZpc2libGUgaW4gY21kLmV4ZSxcbiAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhbGsvY2hhbGsvaXNzdWVzLzU4XG4gICAgICAvLyBJZiB3ZSdyZSBvbiBXaW5kb3dzIGFuZCB3ZSdyZSBkZWFsaW5nIHdpdGggYSBncmF5IGNvbG9yLCB0ZW1wb3JhcmlseSBtYWtlICdkaW0nIGEgbm9vcC5cblxuXG4gICAgICBjb25zdCBvcmlnaW5hbERpbSA9IGFuc2lTdHlsZXMkMi5kaW0ub3BlbjtcblxuICAgICAgaWYgKGlzU2ltcGxlV2luZG93c1Rlcm0gJiYgdGhpcy5oYXNHcmV5KSB7XG4gICAgICAgIGFuc2lTdHlsZXMkMi5kaW0ub3BlbiA9ICcnO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgdGhpcy5fc3R5bGVzLnNsaWNlKCkucmV2ZXJzZSgpKSB7XG4gICAgICAgIC8vIFJlcGxhY2UgYW55IGluc3RhbmNlcyBhbHJlYWR5IHByZXNlbnQgd2l0aCBhIHJlLW9wZW5pbmcgY29kZVxuICAgICAgICAvLyBvdGhlcndpc2Ugb25seSB0aGUgcGFydCBvZiB0aGUgc3RyaW5nIHVudGlsIHNhaWQgY2xvc2luZyBjb2RlXG4gICAgICAgIC8vIHdpbGwgYmUgY29sb3JlZCwgYW5kIHRoZSByZXN0IHdpbGwgc2ltcGx5IGJlICdwbGFpbicuXG4gICAgICAgIHN0ciA9IGNvZGUub3BlbiArIHN0ci5yZXBsYWNlKGNvZGUuY2xvc2VSZSwgY29kZS5vcGVuKSArIGNvZGUuY2xvc2U7IC8vIENsb3NlIHRoZSBzdHlsaW5nIGJlZm9yZSBhIGxpbmVicmVhayBhbmQgcmVvcGVuXG4gICAgICAgIC8vIGFmdGVyIG5leHQgbGluZSB0byBmaXggYSBibGVlZCBpc3N1ZSBvbiBtYWNPU1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhbGsvY2hhbGsvcHVsbC85MlxuXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHI/XFxuL2csIFwiXCIuY29uY2F0KGNvZGUuY2xvc2UsIFwiJCZcIikuY29uY2F0KGNvZGUub3BlbikpO1xuICAgICAgfSAvLyBSZXNldCB0aGUgb3JpZ2luYWwgYGRpbWAgaWYgd2UgY2hhbmdlZCBpdCB0byB3b3JrIGFyb3VuZCB0aGUgV2luZG93cyBkaW1tZWQgZ3JheSBpc3N1ZVxuXG5cbiAgICAgIGFuc2lTdHlsZXMkMi5kaW0ub3BlbiA9IG9yaWdpbmFsRGltO1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGFsa1RhZyhjaGFsaywgc3RyaW5ncykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0cmluZ3MpKSB7XG4gICAgICAgIC8vIElmIGNoYWxrKCkgd2FzIGNhbGxlZCBieSBpdHNlbGYgb3Igd2l0aCBhIHN0cmluZyxcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJpbmcgaXRzZWxmIGFzIGEgc3RyaW5nLlxuICAgICAgICByZXR1cm4gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLmpvaW4oJyAnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgIGNvbnN0IHBhcnRzID0gW3N0cmluZ3MucmF3WzBdXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBhcnRzLnB1c2goU3RyaW5nKGFyZ3NbaSAtIDFdKS5yZXBsYWNlKC9be31cXFxcXS9nLCAnXFxcXCQmJykpO1xuICAgICAgICBwYXJ0cy5wdXNoKFN0cmluZyhzdHJpbmdzLnJhd1tpXSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGVtcGxhdGVzJDIoY2hhbGssIHBhcnRzLmpvaW4oJycpKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDaGFsay5wcm90b3R5cGUsIHN0eWxlcyk7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBDaGFsaygpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcblxuICAgIG1vZHVsZS5leHBvcnRzLnN1cHBvcnRzQ29sb3IgPSBzdGRvdXRDb2xvcjtcbiAgICBtb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gbW9kdWxlLmV4cG9ydHM7IC8vIEZvciBUeXBlU2NyaXB0XG4gIH0pO1xuICB2YXIgY2hhbGtfMSQxID0gY2hhbGskMi5zdXBwb3J0c0NvbG9yO1xuXG4gIHZhciBsaWIkMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6IHRydWVcbiAgICB9KTtcbiAgICBleHBvcnRzLnNob3VsZEhpZ2hsaWdodCA9IHNob3VsZEhpZ2hsaWdodDtcbiAgICBleHBvcnRzLmdldENoYWxrID0gZ2V0Q2hhbGs7XG4gICAgZXhwb3J0cy5kZWZhdWx0ID0gaGlnaGxpZ2h0O1xuXG4gICAgdmFyIF9qc1Rva2VucyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKGpzVG9rZW5zKTtcblxuICAgIHZhciBfZXN1dGlscyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQodXRpbHMkMSk7XG5cbiAgICB2YXIgX2NoYWxrID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChjaGFsayQyKTtcblxuICAgIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgICAgICBkZWZhdWx0OiBvYmpcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkge1xuICAgICAgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuICAgICAgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkge1xuICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7XG4gICAgICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9XG5cbiAgICAgIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZWZhdWx0OiBvYmpcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7XG5cbiAgICAgIGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkge1xuICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KG9iaik7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdPYmogPSB7fTtcbiAgICAgIHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgIHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsO1xuXG4gICAgICAgICAgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbmV3T2JqLmRlZmF1bHQgPSBvYmo7XG5cbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjYWNoZS5zZXQob2JqLCBuZXdPYmopO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3T2JqO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERlZnMoY2hhbGspIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleXdvcmQ6IGNoYWxrLmN5YW4sXG4gICAgICAgIGNhcGl0YWxpemVkOiBjaGFsay55ZWxsb3csXG4gICAgICAgIGpzeF90YWc6IGNoYWxrLnllbGxvdyxcbiAgICAgICAgcHVuY3R1YXRvcjogY2hhbGsueWVsbG93LFxuICAgICAgICBudW1iZXI6IGNoYWxrLm1hZ2VudGEsXG4gICAgICAgIHN0cmluZzogY2hhbGsuZ3JlZW4sXG4gICAgICAgIHJlZ2V4OiBjaGFsay5tYWdlbnRhLFxuICAgICAgICBjb21tZW50OiBjaGFsay5ncmV5LFxuICAgICAgICBpbnZhbGlkOiBjaGFsay53aGl0ZS5iZ1JlZC5ib2xkXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IE5FV0xJTkUgPSAvXFxyXFxufFtcXG5cXHJcXHUyMDI4XFx1MjAyOV0vO1xuICAgIGNvbnN0IEpTWF9UQUcgPSAvXlthLXpdW1xcdy1dKiQvaTtcbiAgICBjb25zdCBCUkFDS0VUID0gL15bKClbXFxde31dJC87XG5cbiAgICBmdW5jdGlvbiBnZXRUb2tlblR5cGUobWF0Y2gpIHtcbiAgICAgIGNvbnN0IFtvZmZzZXQsIHRleHRdID0gbWF0Y2guc2xpY2UoLTIpO1xuICAgICAgY29uc3QgdG9rZW4gPSAoMCwgX2pzVG9rZW5zLm1hdGNoVG9Ub2tlbikobWF0Y2gpO1xuXG4gICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgaWYgKF9lc3V0aWxzLmRlZmF1bHQua2V5d29yZC5pc1Jlc2VydmVkV29yZEVTNih0b2tlbi52YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gXCJrZXl3b3JkXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoSlNYX1RBRy50ZXN0KHRva2VuLnZhbHVlKSAmJiAodGV4dFtvZmZzZXQgLSAxXSA9PT0gXCI8XCIgfHwgdGV4dC5zdWJzdHIob2Zmc2V0IC0gMiwgMikgPT0gXCI8L1wiKSkge1xuICAgICAgICAgIHJldHVybiBcImpzeF90YWdcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbi52YWx1ZVswXSAhPT0gdG9rZW4udmFsdWVbMF0udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIHJldHVybiBcImNhcGl0YWxpemVkXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRva2VuLnR5cGUgPT09IFwicHVuY3R1YXRvclwiICYmIEJSQUNLRVQudGVzdCh0b2tlbi52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFwiYnJhY2tldFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJpbnZhbGlkXCIgJiYgKHRva2VuLnZhbHVlID09PSBcIkBcIiB8fCB0b2tlbi52YWx1ZSA9PT0gXCIjXCIpKSB7XG4gICAgICAgIHJldHVybiBcInB1bmN0dWF0b3JcIjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRva2VuLnR5cGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGlnaGxpZ2h0VG9rZW5zKGRlZnMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoX2pzVG9rZW5zLmRlZmF1bHQsIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRUb2tlblR5cGUoYXJncyk7XG4gICAgICAgIGNvbnN0IGNvbG9yaXplID0gZGVmc1t0eXBlXTtcblxuICAgICAgICBpZiAoY29sb3JpemUpIHtcbiAgICAgICAgICByZXR1cm4gYXJnc1swXS5zcGxpdChORVdMSU5FKS5tYXAoc3RyID0+IGNvbG9yaXplKHN0cikpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3NbMF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNob3VsZEhpZ2hsaWdodChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gX2NoYWxrLmRlZmF1bHQuc3VwcG9ydHNDb2xvciB8fCBvcHRpb25zLmZvcmNlQ29sb3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhbGsob3B0aW9ucykge1xuICAgICAgbGV0IGNoYWxrID0gX2NoYWxrLmRlZmF1bHQ7XG5cbiAgICAgIGlmIChvcHRpb25zLmZvcmNlQ29sb3IpIHtcbiAgICAgICAgY2hhbGsgPSBuZXcgX2NoYWxrLmRlZmF1bHQuY29uc3RydWN0b3Ioe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgbGV2ZWw6IDFcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFsaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoaWdobGlnaHQoY29kZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICBpZiAoc2hvdWxkSGlnaGxpZ2h0KG9wdGlvbnMpKSB7XG4gICAgICAgIGNvbnN0IGNoYWxrID0gZ2V0Q2hhbGsob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGRlZnMgPSBnZXREZWZzKGNoYWxrKTtcbiAgICAgICAgcmV0dXJuIGhpZ2hsaWdodFRva2VucyhkZWZzLCBjb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHVud3JhcEV4cG9ydHMobGliJDEpO1xuICB2YXIgbGliXzEgPSBsaWIkMS5zaG91bGRIaWdobGlnaHQ7XG4gIHZhciBsaWJfMiA9IGxpYiQxLmdldENoYWxrO1xuXG4gIHZhciBsaWIkMiA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6IHRydWVcbiAgICB9KTtcbiAgICBleHBvcnRzLmNvZGVGcmFtZUNvbHVtbnMgPSBjb2RlRnJhbWVDb2x1bW5zO1xuICAgIGV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuXG4gICAgdmFyIF9oaWdobGlnaHQgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChsaWIkMSk7XG5cbiAgICBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7XG4gICAgICBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuXG4gICAgICBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiBjYWNoZTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHtcbiAgICAgIGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH1cblxuICAgICAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlZmF1bHQ6IG9ialxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTtcblxuICAgICAgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7XG4gICAgICAgIHJldHVybiBjYWNoZS5nZXQob2JqKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld09iaiA9IHt9O1xuICAgICAgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7XG5cbiAgICAgICAgICBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXdPYmouZGVmYXVsdCA9IG9iajtcblxuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGNhY2hlLnNldChvYmosIG5ld09iaik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdPYmo7XG4gICAgfVxuXG4gICAgbGV0IGRlcHJlY2F0aW9uV2FybmluZ1Nob3duID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBnZXREZWZzKGNoYWxrKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBndXR0ZXI6IGNoYWxrLmdyZXksXG4gICAgICAgIG1hcmtlcjogY2hhbGsucmVkLmJvbGQsXG4gICAgICAgIG1lc3NhZ2U6IGNoYWxrLnJlZC5ib2xkXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IE5FV0xJTkUgPSAvXFxyXFxufFtcXG5cXHJcXHUyMDI4XFx1MjAyOV0vO1xuXG4gICAgZnVuY3Rpb24gZ2V0TWFya2VyTGluZXMobG9jLCBzb3VyY2UsIG9wdHMpIHtcbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGNvbHVtbjogMCxcbiAgICAgICAgbGluZTogLTFcbiAgICAgIH0sIGxvYy5zdGFydCk7XG4gICAgICBjb25zdCBlbmRMb2MgPSBPYmplY3QuYXNzaWduKHt9LCBzdGFydExvYywge30sIGxvYy5lbmQpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBsaW5lc0Fib3ZlID0gMixcbiAgICAgICAgbGluZXNCZWxvdyA9IDNcbiAgICAgIH0gPSBvcHRzIHx8IHt9O1xuICAgICAgY29uc3Qgc3RhcnRMaW5lID0gc3RhcnRMb2MubGluZTtcbiAgICAgIGNvbnN0IHN0YXJ0Q29sdW1uID0gc3RhcnRMb2MuY29sdW1uO1xuICAgICAgY29uc3QgZW5kTGluZSA9IGVuZExvYy5saW5lO1xuICAgICAgY29uc3QgZW5kQ29sdW1uID0gZW5kTG9jLmNvbHVtbjtcbiAgICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHN0YXJ0TGluZSAtIChsaW5lc0Fib3ZlICsgMSksIDApO1xuICAgICAgbGV0IGVuZCA9IE1hdGgubWluKHNvdXJjZS5sZW5ndGgsIGVuZExpbmUgKyBsaW5lc0JlbG93KTtcblxuICAgICAgaWYgKHN0YXJ0TGluZSA9PT0gLTEpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5kTGluZSA9PT0gLTEpIHtcbiAgICAgICAgZW5kID0gc291cmNlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGluZURpZmYgPSBlbmRMaW5lIC0gc3RhcnRMaW5lO1xuICAgICAgY29uc3QgbWFya2VyTGluZXMgPSB7fTtcblxuICAgICAgaWYgKGxpbmVEaWZmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxpbmVEaWZmOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBsaW5lTnVtYmVyID0gaSArIHN0YXJ0TGluZTtcblxuICAgICAgICAgIGlmICghc3RhcnRDb2x1bW4pIHtcbiAgICAgICAgICAgIG1hcmtlckxpbmVzW2xpbmVOdW1iZXJdID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IHNvdXJjZVtsaW5lTnVtYmVyIC0gMV0ubGVuZ3RoO1xuICAgICAgICAgICAgbWFya2VyTGluZXNbbGluZU51bWJlcl0gPSBbc3RhcnRDb2x1bW4sIHNvdXJjZUxlbmd0aCAtIHN0YXJ0Q29sdW1uICsgMV07XG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSBsaW5lRGlmZikge1xuICAgICAgICAgICAgbWFya2VyTGluZXNbbGluZU51bWJlcl0gPSBbMCwgZW5kQ29sdW1uXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGVuZ3RoID0gc291cmNlW2xpbmVOdW1iZXIgLSBpXS5sZW5ndGg7XG4gICAgICAgICAgICBtYXJrZXJMaW5lc1tsaW5lTnVtYmVyXSA9IFswLCBzb3VyY2VMZW5ndGhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXJ0Q29sdW1uID09PSBlbmRDb2x1bW4pIHtcbiAgICAgICAgICBpZiAoc3RhcnRDb2x1bW4pIHtcbiAgICAgICAgICAgIG1hcmtlckxpbmVzW3N0YXJ0TGluZV0gPSBbc3RhcnRDb2x1bW4sIDBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXJrZXJMaW5lc1tzdGFydExpbmVdID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya2VyTGluZXNbc3RhcnRMaW5lXSA9IFtzdGFydENvbHVtbiwgZW5kQ29sdW1uIC0gc3RhcnRDb2x1bW5dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBlbmQsXG4gICAgICAgIG1hcmtlckxpbmVzXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvZGVGcmFtZUNvbHVtbnMocmF3TGluZXMsIGxvYywgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBoaWdobGlnaHRlZCA9IChvcHRzLmhpZ2hsaWdodENvZGUgfHwgb3B0cy5mb3JjZUNvbG9yKSAmJiAoMCwgX2hpZ2hsaWdodC5zaG91bGRIaWdobGlnaHQpKG9wdHMpO1xuICAgICAgY29uc3QgY2hhbGsgPSAoMCwgX2hpZ2hsaWdodC5nZXRDaGFsaykob3B0cyk7XG4gICAgICBjb25zdCBkZWZzID0gZ2V0RGVmcyhjaGFsayk7XG5cbiAgICAgIGNvbnN0IG1heWJlSGlnaGxpZ2h0ID0gKGNoYWxrRm4sIHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gaGlnaGxpZ2h0ZWQgPyBjaGFsa0ZuKHN0cmluZykgOiBzdHJpbmc7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBsaW5lcyA9IHJhd0xpbmVzLnNwbGl0KE5FV0xJTkUpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdGFydCxcbiAgICAgICAgZW5kLFxuICAgICAgICBtYXJrZXJMaW5lc1xuICAgICAgfSA9IGdldE1hcmtlckxpbmVzKGxvYywgbGluZXMsIG9wdHMpO1xuICAgICAgY29uc3QgaGFzQ29sdW1ucyA9IGxvYy5zdGFydCAmJiB0eXBlb2YgbG9jLnN0YXJ0LmNvbHVtbiA9PT0gXCJudW1iZXJcIjtcbiAgICAgIGNvbnN0IG51bWJlck1heFdpZHRoID0gU3RyaW5nKGVuZCkubGVuZ3RoO1xuICAgICAgY29uc3QgaGlnaGxpZ2h0ZWRMaW5lcyA9IGhpZ2hsaWdodGVkID8gKDAsIF9oaWdobGlnaHQuZGVmYXVsdCkocmF3TGluZXMsIG9wdHMpIDogcmF3TGluZXM7XG4gICAgICBsZXQgZnJhbWUgPSBoaWdobGlnaHRlZExpbmVzLnNwbGl0KE5FV0xJTkUpLnNsaWNlKHN0YXJ0LCBlbmQpLm1hcCgobGluZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbnVtYmVyID0gc3RhcnQgKyAxICsgaW5kZXg7XG4gICAgICAgIGNvbnN0IHBhZGRlZE51bWJlciA9IFwiIFwiLmNvbmNhdChudW1iZXIpLnNsaWNlKC1udW1iZXJNYXhXaWR0aCk7XG4gICAgICAgIGNvbnN0IGd1dHRlciA9IFwiIFwiLmNvbmNhdChwYWRkZWROdW1iZXIsIFwiIHwgXCIpO1xuICAgICAgICBjb25zdCBoYXNNYXJrZXIgPSBtYXJrZXJMaW5lc1tudW1iZXJdO1xuICAgICAgICBjb25zdCBsYXN0TWFya2VyTGluZSA9ICFtYXJrZXJMaW5lc1tudW1iZXIgKyAxXTtcblxuICAgICAgICBpZiAoaGFzTWFya2VyKSB7XG4gICAgICAgICAgbGV0IG1hcmtlckxpbmUgPSBcIlwiO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaGFzTWFya2VyKSkge1xuICAgICAgICAgICAgY29uc3QgbWFya2VyU3BhY2luZyA9IGxpbmUuc2xpY2UoMCwgTWF0aC5tYXgoaGFzTWFya2VyWzBdIC0gMSwgMCkpLnJlcGxhY2UoL1teXFx0XS9nLCBcIiBcIik7XG4gICAgICAgICAgICBjb25zdCBudW1iZXJPZk1hcmtlcnMgPSBoYXNNYXJrZXJbMV0gfHwgMTtcbiAgICAgICAgICAgIG1hcmtlckxpbmUgPSBbXCJcXG4gXCIsIG1heWJlSGlnaGxpZ2h0KGRlZnMuZ3V0dGVyLCBndXR0ZXIucmVwbGFjZSgvXFxkL2csIFwiIFwiKSksIG1hcmtlclNwYWNpbmcsIG1heWJlSGlnaGxpZ2h0KGRlZnMubWFya2VyLCBcIl5cIikucmVwZWF0KG51bWJlck9mTWFya2VycyldLmpvaW4oXCJcIik7XG5cbiAgICAgICAgICAgIGlmIChsYXN0TWFya2VyTGluZSAmJiBvcHRzLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgbWFya2VyTGluZSArPSBcIiBcIiArIG1heWJlSGlnaGxpZ2h0KGRlZnMubWVzc2FnZSwgb3B0cy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gW21heWJlSGlnaGxpZ2h0KGRlZnMubWFya2VyLCBcIj5cIiksIG1heWJlSGlnaGxpZ2h0KGRlZnMuZ3V0dGVyLCBndXR0ZXIpLCBsaW5lLCBtYXJrZXJMaW5lXS5qb2luKFwiXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBcIiBcIi5jb25jYXQobWF5YmVIaWdobGlnaHQoZGVmcy5ndXR0ZXIsIGd1dHRlcikpLmNvbmNhdChsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSkuam9pbihcIlxcblwiKTtcblxuICAgICAgaWYgKG9wdHMubWVzc2FnZSAmJiAhaGFzQ29sdW1ucykge1xuICAgICAgICBmcmFtZSA9IFwiXCIuY29uY2F0KFwiIFwiLnJlcGVhdChudW1iZXJNYXhXaWR0aCArIDEpKS5jb25jYXQob3B0cy5tZXNzYWdlLCBcIlxcblwiKS5jb25jYXQoZnJhbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGlnaGxpZ2h0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGNoYWxrLnJlc2V0KGZyYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmcmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfZGVmYXVsdChyYXdMaW5lcywgbGluZU51bWJlciwgY29sTnVtYmVyLCBvcHRzID0ge30pIHtcbiAgICAgIGlmICghZGVwcmVjYXRpb25XYXJuaW5nU2hvd24pIHtcbiAgICAgICAgZGVwcmVjYXRpb25XYXJuaW5nU2hvd24gPSB0cnVlO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gXCJQYXNzaW5nIGxpbmVOdW1iZXIgYW5kIGNvbE51bWJlciBpcyBkZXByZWNhdGVkIHRvIEBiYWJlbC9jb2RlLWZyYW1lLiBQbGVhc2UgdXNlIGBjb2RlRnJhbWVDb2x1bW5zYC5cIjtcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbWl0V2FybmluZykge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobWVzc2FnZSwgXCJEZXByZWNhdGlvbldhcm5pbmdcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVwcmVjYXRpb25FcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICBkZXByZWNhdGlvbkVycm9yLm5hbWUgPSBcIkRlcHJlY2F0aW9uV2FybmluZ1wiO1xuICAgICAgICAgIGNvbnNvbGUud2FybihuZXcgRXJyb3IobWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbE51bWJlciA9IE1hdGgubWF4KGNvbE51bWJlciwgMCk7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHtcbiAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICBjb2x1bW46IGNvbE51bWJlcixcbiAgICAgICAgICBsaW5lOiBsaW5lTnVtYmVyXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gY29kZUZyYW1lQ29sdW1ucyhyYXdMaW5lcywgbG9jYXRpb24sIG9wdHMpO1xuICAgIH1cbiAgfSk7XG4gIHVud3JhcEV4cG9ydHMobGliJDIpO1xuICB2YXIgbGliXzEkMSA9IGxpYiQyLmNvZGVGcmFtZUNvbHVtbnM7XG5cbiAgY29uc3Qge1xuICAgIENvbmZpZ0Vycm9yOiBDb25maWdFcnJvciQxXG4gIH0gPSBlcnJvcnM7XG4gIGNvbnN0IHtcbiAgICBsb2NTdGFydDogbG9jU3RhcnQkMSxcbiAgICBsb2NFbmQ6IGxvY0VuZCQxXG4gIH0gPSBsb2M7IC8vIFVzZSBkZWZpbmVQcm9wZXJ0aWVzKCkvZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCkgdG8gcHJldmVudFxuICAvLyB0cmlnZ2VyaW5nIHRoZSBwYXJzZXJzIGdldHRlcnMuXG5cbiAgY29uc3Qgb3duTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgY29uc3Qgb3duRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgZnVuY3Rpb24gZ2V0UGFyc2VycyhvcHRpb25zKSB7XG4gICAgY29uc3QgcGFyc2VycyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2Ygb3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBpZiAoIXBsdWdpbi5wYXJzZXJzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duTmFtZXMocGx1Z2luLnBhcnNlcnMpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJzZXJzLCBuYW1lLCBvd25EZXNjcmlwdG9yKHBsdWdpbi5wYXJzZXJzLCBuYW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlcnM7XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlUGFyc2VyKG9wdHMsIHBhcnNlcnMpIHtcbiAgICBwYXJzZXJzID0gcGFyc2VycyB8fCBnZXRQYXJzZXJzKG9wdHMpO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnBhcnNlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBDdXN0b20gcGFyc2VyIEFQSSBhbHdheXMgd29ya3Mgd2l0aCBKYXZhU2NyaXB0LlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFyc2U6IG9wdHMucGFyc2VyLFxuICAgICAgICBhc3RGb3JtYXQ6IFwiZXN0cmVlXCIsXG4gICAgICAgIGxvY1N0YXJ0OiBsb2NTdGFydCQxLFxuICAgICAgICBsb2NFbmQ6IGxvY0VuZCQxXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5wYXJzZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyc2Vycywgb3B0cy5wYXJzZXIpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZXJzW29wdHMucGFyc2VyXTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IkMShcIkNvdWxkbid0IHJlc29sdmUgcGFyc2VyIFxcXCJcIi5jb25jYXQob3B0cy5wYXJzZXIsIFwiXFxcIi4gUGFyc2VycyBtdXN0IGJlIGV4cGxpY2l0bHkgYWRkZWQgdG8gdGhlIHN0YW5kYWxvbmUgYnVuZGxlLlwiKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2UodGV4dCwgb3B0cykge1xuICAgIGNvbnN0IHBhcnNlcnMgPSBnZXRQYXJzZXJzKG9wdHMpOyAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHtwYXJzZXJOYW1lOiBwYXJzZUZufS4gVXNlcyBkZWZpbmVQcm9wZXJ0eSgpIHRvIG9ubHkgY2FsbFxuICAgIC8vIHRoZSBwYXJzZXJzIGdldHRlcnMgd2hlbiBhY3R1YWxseSBjYWxsaW5nIHRoZSBwYXJzZXIgYHBhcnNlYCBmdW5jdGlvbi5cblxuICAgIGNvbnN0IHBhcnNlcnNGb3JDdXN0b21QYXJzZXJBcGkgPSBPYmplY3Qua2V5cyhwYXJzZXJzKS5yZWR1Y2UoKG9iamVjdCwgcGFyc2VyTmFtZSkgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcGFyc2VyTmFtZSwge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcblxuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gcGFyc2Vyc1twYXJzZXJOYW1lXS5wYXJzZTtcbiAgICAgIH1cblxuICAgIH0pLCB7fSk7XG4gICAgY29uc3QgcGFyc2VyID0gcmVzb2x2ZVBhcnNlcihvcHRzLCBwYXJzZXJzKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAocGFyc2VyLnByZXByb2Nlc3MpIHtcbiAgICAgICAgdGV4dCA9IHBhcnNlci5wcmVwcm9jZXNzKHRleHQsIG9wdHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0LFxuICAgICAgICBhc3Q6IHBhcnNlci5wYXJzZSh0ZXh0LCBwYXJzZXJzRm9yQ3VzdG9tUGFyc2VyQXBpLCBvcHRzKVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qge1xuICAgICAgICBsb2NcbiAgICAgIH0gPSBlcnJvcjtcblxuICAgICAgaWYgKGxvYykge1xuICAgICAgICBjb25zdCBjb2RlRnJhbWUgPSBsaWIkMjtcbiAgICAgICAgZXJyb3IuY29kZUZyYW1lID0gY29kZUZyYW1lLmNvZGVGcmFtZUNvbHVtbnModGV4dCwgbG9jLCB7XG4gICAgICAgICAgaGlnaGxpZ2h0Q29kZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgZXJyb3IubWVzc2FnZSArPSBcIlxcblwiICsgZXJyb3IuY29kZUZyYW1lO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgICAgdGhyb3cgZXJyb3Iuc3RhY2s7XG4gICAgfVxuICB9XG5cbiAgdmFyIHBhcnNlciA9IHtcbiAgICBwYXJzZSxcbiAgICByZXNvbHZlUGFyc2VyXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIFVuZGVmaW5lZFBhcnNlckVycm9yOiBVbmRlZmluZWRQYXJzZXJFcnJvciQxXG4gIH0gPSBlcnJvcnM7XG4gIGNvbnN0IHtcbiAgICBnZXRTdXBwb3J0SW5mbzogZ2V0U3VwcG9ydEluZm8kMVxuICB9ID0gc3VwcG9ydDtcbiAgY29uc3Qge1xuICAgIHJlc29sdmVQYXJzZXI6IHJlc29sdmVQYXJzZXIkMVxuICB9ID0gcGFyc2VyO1xuICBjb25zdCBoaWRkZW5EZWZhdWx0cyA9IHtcbiAgICBhc3RGb3JtYXQ6IFwiZXN0cmVlXCIsXG4gICAgcHJpbnRlcjoge30sXG4gICAgb3JpZ2luYWxUZXh0OiB1bmRlZmluZWQsXG4gICAgbG9jU3RhcnQ6IG51bGwsXG4gICAgbG9jRW5kOiBudWxsXG4gIH07IC8vIENvcHkgb3B0aW9ucyBhbmQgZmlsbCBpbiBkZWZhdWx0IHZhbHVlcy5cblxuICBmdW5jdGlvbiBub3JtYWxpemUkMShvcHRpb25zLCBvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgY29uc3QgcmF3T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN1cHBvcnRPcHRpb25zID0gZ2V0U3VwcG9ydEluZm8kMSh7XG4gICAgICBwbHVnaW5zOiBvcHRpb25zLnBsdWdpbnMsXG4gICAgICBzaG93VW5yZWxlYXNlZDogdHJ1ZSxcbiAgICAgIHNob3dEZXByZWNhdGVkOiB0cnVlXG4gICAgfSkub3B0aW9ucztcbiAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oe30sIGhpZGRlbkRlZmF1bHRzLCB7fSwgZnJvbVBhaXJzXzEoc3VwcG9ydE9wdGlvbnMuZmlsdGVyKG9wdGlvbkluZm8gPT4gb3B0aW9uSW5mby5kZWZhdWx0ICE9PSB1bmRlZmluZWQpLm1hcChvcHRpb24gPT4gW29wdGlvbi5uYW1lLCBvcHRpb24uZGVmYXVsdF0pKSk7XG5cbiAgICBpZiAoIXJhd09wdGlvbnMucGFyc2VyKSB7XG4gICAgICBpZiAoIXJhd09wdGlvbnMuZmlsZXBhdGgpIHtcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gb3B0cy5sb2dnZXIgfHwgY29uc29sZTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJObyBwYXJzZXIgYW5kIG5vIGZpbGVwYXRoIGdpdmVuLCB1c2luZyAnYmFiZWwnIHRoZSBwYXJzZXIgbm93IFwiICsgXCJidXQgdGhpcyB3aWxsIHRocm93IGFuIGVycm9yIGluIHRoZSBmdXR1cmUuIFwiICsgXCJQbGVhc2Ugc3BlY2lmeSBhIHBhcnNlciBvciBhIGZpbGVwYXRoIHNvIG9uZSBjYW4gYmUgaW5mZXJyZWQuXCIpO1xuICAgICAgICByYXdPcHRpb25zLnBhcnNlciA9IFwiYmFiZWxcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhd09wdGlvbnMucGFyc2VyID0gaW5mZXJQYXJzZXIocmF3T3B0aW9ucy5maWxlcGF0aCwgcmF3T3B0aW9ucy5wbHVnaW5zKTtcblxuICAgICAgICBpZiAoIXJhd09wdGlvbnMucGFyc2VyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZGVmaW5lZFBhcnNlckVycm9yJDEoXCJObyBwYXJzZXIgY291bGQgYmUgaW5mZXJyZWQgZm9yIGZpbGU6IFwiLmNvbmNhdChyYXdPcHRpb25zLmZpbGVwYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZXIgPSByZXNvbHZlUGFyc2VyJDEob3B0aW9uc05vcm1hbGl6ZXIubm9ybWFsaXplQXBpT3B0aW9ucyhyYXdPcHRpb25zLCBbc3VwcG9ydE9wdGlvbnMuZmluZCh4ID0+IHgubmFtZSA9PT0gXCJwYXJzZXJcIildLCB7XG4gICAgICBwYXNzVGhyb3VnaDogdHJ1ZSxcbiAgICAgIGxvZ2dlcjogZmFsc2VcbiAgICB9KSk7XG4gICAgcmF3T3B0aW9ucy5hc3RGb3JtYXQgPSBwYXJzZXIuYXN0Rm9ybWF0O1xuICAgIHJhd09wdGlvbnMubG9jRW5kID0gcGFyc2VyLmxvY0VuZDtcbiAgICByYXdPcHRpb25zLmxvY1N0YXJ0ID0gcGFyc2VyLmxvY1N0YXJ0O1xuICAgIGNvbnN0IHBsdWdpbiA9IGdldFBsdWdpbihyYXdPcHRpb25zKTtcbiAgICByYXdPcHRpb25zLnByaW50ZXIgPSBwbHVnaW4ucHJpbnRlcnNbcmF3T3B0aW9ucy5hc3RGb3JtYXRdO1xuICAgIGNvbnN0IHBsdWdpbkRlZmF1bHRzID0gc3VwcG9ydE9wdGlvbnMuZmlsdGVyKG9wdGlvbkluZm8gPT4gb3B0aW9uSW5mby5wbHVnaW5EZWZhdWx0cyAmJiBvcHRpb25JbmZvLnBsdWdpbkRlZmF1bHRzW3BsdWdpbi5uYW1lXSAhPT0gdW5kZWZpbmVkKS5yZWR1Y2UoKHJlZHVjZWQsIG9wdGlvbkluZm8pID0+IE9iamVjdC5hc3NpZ24ocmVkdWNlZCwge1xuICAgICAgW29wdGlvbkluZm8ubmFtZV06IG9wdGlvbkluZm8ucGx1Z2luRGVmYXVsdHNbcGx1Z2luLm5hbWVdXG4gICAgfSksIHt9KTtcbiAgICBjb25zdCBtaXhlZERlZmF1bHRzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIHt9LCBwbHVnaW5EZWZhdWx0cyk7XG4gICAgT2JqZWN0LmtleXMobWl4ZWREZWZhdWx0cykuZm9yRWFjaChrID0+IHtcbiAgICAgIGlmIChyYXdPcHRpb25zW2tdID09IG51bGwpIHtcbiAgICAgICAgcmF3T3B0aW9uc1trXSA9IG1peGVkRGVmYXVsdHNba107XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocmF3T3B0aW9ucy5wYXJzZXIgPT09IFwianNvblwiKSB7XG4gICAgICByYXdPcHRpb25zLnRyYWlsaW5nQ29tbWEgPSBcIm5vbmVcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uc05vcm1hbGl6ZXIubm9ybWFsaXplQXBpT3B0aW9ucyhyYXdPcHRpb25zLCBzdXBwb3J0T3B0aW9ucywgT2JqZWN0LmFzc2lnbih7XG4gICAgICBwYXNzVGhyb3VnaDogT2JqZWN0LmtleXMoaGlkZGVuRGVmYXVsdHMpXG4gICAgfSwgb3B0cykpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UGx1Z2luKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBhc3RGb3JtYXRcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGlmICghYXN0Rm9ybWF0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnZXRQbHVnaW4oKSByZXF1aXJlcyBhc3RGb3JtYXQgdG8gYmUgc2V0XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW50ZXJQbHVnaW4gPSBvcHRpb25zLnBsdWdpbnMuZmluZChwbHVnaW4gPT4gcGx1Z2luLnByaW50ZXJzICYmIHBsdWdpbi5wcmludGVyc1thc3RGb3JtYXRdKTtcblxuICAgIGlmICghcHJpbnRlclBsdWdpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBwbHVnaW4gZm9yIEFTVCBmb3JtYXQgXFxcIlwiLmNvbmNhdChhc3RGb3JtYXQsIFwiXFxcIlwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByaW50ZXJQbHVnaW47XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJbnRlcnByZXRlcihmaWxlcGF0aCkge1xuICAgIGlmICh0eXBlb2YgZmlsZXBhdGggIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIGxldCBmZDtcblxuICAgIHRyeSB7XG4gICAgICBmZCA9IGZzLm9wZW5TeW5jKGZpbGVwYXRoLCBcInJcIik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxpbmVyID0gbmV3IHJlYWRsaW5lcyhmZCk7XG4gICAgICBjb25zdCBmaXJzdExpbmUgPSBsaW5lci5uZXh0KCkudG9TdHJpbmcoXCJ1dGY4XCIpOyAvLyAjIS9iaW4vZW52IG5vZGUsICMhL3Vzci9iaW4vZW52IG5vZGVcblxuICAgICAgY29uc3QgbTEgPSBmaXJzdExpbmUubWF0Y2goL14jIVxcLyg/OnVzclxcLyk/YmluXFwvZW52XFxzKyhcXFMrKS8pO1xuXG4gICAgICBpZiAobTEpIHtcbiAgICAgICAgcmV0dXJuIG0xWzFdO1xuICAgICAgfSAvLyAjIS9iaW4vbm9kZSwgIyEvdXNyL2Jpbi9ub2RlLCAjIS91c3IvbG9jYWwvYmluL25vZGVcblxuXG4gICAgICBjb25zdCBtMiA9IGZpcnN0TGluZS5tYXRjaCgvXiMhXFwvKD86dXNyXFwvKD86bG9jYWxcXC8pPyk/YmluXFwvKFxcUyspLyk7XG5cbiAgICAgIGlmIChtMikge1xuICAgICAgICByZXR1cm4gbTJbMV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgd2VpcmQgY2FzZXMgd2hlcmUgcGF0aHMgYXJlIG1pc3NpbmcsIGNhdXNpbmcgSmVzdFxuICAgICAgLy8gZmFpbHVyZXMuIEl0J3MgdW5jbGVhciB3aGF0IHRoZXNlIGNvcnJlc3BvbmQgdG8gaW4gdGhlIHJlYWwgd29ybGQuXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgd2VpcmQgY2FzZXMgd2hlcmUgcGF0aHMgYXJlIG1pc3NpbmcsIGNhdXNpbmcgSmVzdFxuICAgICAgICAvLyBmYWlsdXJlcy4gSXQncyB1bmNsZWFyIHdoYXQgdGhlc2UgY29ycmVzcG9uZCB0byBpbiB0aGUgcmVhbCB3b3JsZC5cbiAgICAgICAgZnMuY2xvc2VTeW5jKGZkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikgey8vIG5vcFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluZmVyUGFyc2VyKGZpbGVwYXRoLCBwbHVnaW5zKSB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVwYXRoKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGxhbmd1YWdlcyA9IGdldFN1cHBvcnRJbmZvJDEoe1xuICAgICAgcGx1Z2luc1xuICAgIH0pLmxhbmd1YWdlcy5maWx0ZXIobGFuZ3VhZ2UgPT4gbGFuZ3VhZ2Uuc2luY2UgIT09IG51bGwpOyAvLyBJZiB0aGUgZmlsZSBoYXMgbm8gZXh0ZW5zaW9uLCB3ZSBjYW4gdHJ5IHRvIGluZmVyIHRoZSBsYW5ndWFnZSBmcm9tIHRoZVxuICAgIC8vIGludGVycHJldGVyIGluIHRoZSBzaGViYW5nIGxpbmUsIGlmIGFueTsgYnV0IHNpbmNlIHRoaXMgcmVxdWlyZXMgRlMgYWNjZXNzLFxuICAgIC8vIGRvIGl0IGxhc3QuXG5cbiAgICBsZXQgbGFuZ3VhZ2UgPSBsYW5ndWFnZXMuZmluZChsYW5ndWFnZSA9PiBsYW5ndWFnZS5leHRlbnNpb25zICYmIGxhbmd1YWdlLmV4dGVuc2lvbnMuc29tZShleHRlbnNpb24gPT4gZmlsZW5hbWUuZW5kc1dpdGgoZXh0ZW5zaW9uKSkgfHwgbGFuZ3VhZ2UuZmlsZW5hbWVzICYmIGxhbmd1YWdlLmZpbGVuYW1lcy5maW5kKG5hbWUgPT4gbmFtZS50b0xvd2VyQ2FzZSgpID09PSBmaWxlbmFtZSkpO1xuXG4gICAgaWYgKCFsYW5ndWFnZSAmJiAhZmlsZW5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICBjb25zdCBpbnRlcnByZXRlciA9IGdldEludGVycHJldGVyKGZpbGVwYXRoKTtcbiAgICAgIGxhbmd1YWdlID0gbGFuZ3VhZ2VzLmZpbmQobGFuZ3VhZ2UgPT4gbGFuZ3VhZ2UuaW50ZXJwcmV0ZXJzICYmIGxhbmd1YWdlLmludGVycHJldGVycy5pbmNsdWRlcyhpbnRlcnByZXRlcikpO1xuICAgIH1cblxuICAgIHJldHVybiBsYW5ndWFnZSAmJiBsYW5ndWFnZS5wYXJzZXJzWzBdO1xuICB9XG5cbiAgdmFyIG9wdGlvbnMkMSA9IHtcbiAgICBub3JtYWxpemU6IG5vcm1hbGl6ZSQxLFxuICAgIGhpZGRlbkRlZmF1bHRzLFxuICAgIGluZmVyUGFyc2VyXG4gIH07XG5cbiAgZnVuY3Rpb24gbWFzc2FnZUFTVChhc3QsIG9wdGlvbnMsIHBhcmVudCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFzdCkpIHtcbiAgICAgIHJldHVybiBhc3QubWFwKGUgPT4gbWFzc2FnZUFTVChlLCBvcHRpb25zLCBwYXJlbnQpKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgfVxuXG4gICAgaWYgKCFhc3QgfHwgdHlwZW9mIGFzdCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGFzdDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdPYmogPSB7fTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGFzdCkpIHtcbiAgICAgIGlmICh0eXBlb2YgYXN0W2tleV0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBuZXdPYmpba2V5XSA9IG1hc3NhZ2VBU1QoYXN0W2tleV0sIG9wdGlvbnMsIGFzdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucHJpbnRlci5tYXNzYWdlQXN0Tm9kZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9ucy5wcmludGVyLm1hc3NhZ2VBc3ROb2RlKGFzdCwgbmV3T2JqLCBwYXJlbnQpO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3T2JqO1xuICB9XG5cbiAgdmFyIG1hc3NhZ2VBc3QgPSBtYXNzYWdlQVNUO1xuXG4gIGZ1bmN0aW9uIGFzc2VydCgpIHt9XG5cbiAgYXNzZXJ0Lm9rID0gZnVuY3Rpb24gKCkge307XG5cbiAgYXNzZXJ0LnN0cmljdEVxdWFsID0gZnVuY3Rpb24gKCkge307XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jW119IHBhcnRzXG4gICAqIEByZXR1cm5zIERvY1xuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGNvbmNhdChwYXJ0cykge1xuICAgIC8vIGFjY2VzcyB0aGUgaW50ZXJuYWxzIG9mIGEgZG9jdW1lbnQgZGlyZWN0bHkuXG4gICAgLy8gaWYocGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gICAvLyBJZiBpdCdzIGEgc2luZ2xlIGRvY3VtZW50LCBubyBuZWVkIHRvIGNvbmNhdCBpdC5cbiAgICAvLyAgIHJldHVybiBwYXJ0c1swXTtcbiAgICAvLyB9XG5cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImNvbmNhdFwiLFxuICAgICAgcGFydHNcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY30gY29udGVudHNcbiAgICogQHJldHVybnMgRG9jXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaW5kZW50KGNvbnRlbnRzKSB7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJpbmRlbnRcIixcbiAgICAgIGNvbnRlbnRzXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5cbiAgICogQHBhcmFtIHtEb2N9IGNvbnRlbnRzXG4gICAqIEByZXR1cm5zIERvY1xuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGFsaWduKG4sIGNvbnRlbnRzKSB7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJhbGlnblwiLFxuICAgICAgY29udGVudHMsXG4gICAgICBuXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtEb2N9IGNvbnRlbnRzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0c10gLSBUQkQgPz8/XG4gICAqIEByZXR1cm5zIERvY1xuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdyb3VwKGNvbnRlbnRzLCBvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJncm91cFwiLFxuICAgICAgaWQ6IG9wdHMuaWQsXG4gICAgICBjb250ZW50cyxcbiAgICAgIGJyZWFrOiAhIW9wdHMuc2hvdWxkQnJlYWssXG4gICAgICBleHBhbmRlZFN0YXRlczogb3B0cy5leHBhbmRlZFN0YXRlc1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jfSBjb250ZW50c1xuICAgKiBAcmV0dXJucyBEb2NcbiAgICovXG5cblxuICBmdW5jdGlvbiBkZWRlbnRUb1Jvb3QoY29udGVudHMpIHtcbiAgICByZXR1cm4gYWxpZ24oLUluZmluaXR5LCBjb250ZW50cyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jfSBjb250ZW50c1xuICAgKiBAcmV0dXJucyBEb2NcbiAgICovXG5cblxuICBmdW5jdGlvbiBtYXJrQXNSb290KGNvbnRlbnRzKSB7XG4gICAgLy8gQHRzLWlnbm9yZSAtIFRCRCA/Pz86XG4gICAgcmV0dXJuIGFsaWduKHtcbiAgICAgIHR5cGU6IFwicm9vdFwiXG4gICAgfSwgY29udGVudHMpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY30gY29udGVudHNcbiAgICogQHJldHVybnMgRG9jXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZGVkZW50KGNvbnRlbnRzKSB7XG4gICAgcmV0dXJuIGFsaWduKC0xLCBjb250ZW50cyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jW119IHN0YXRlc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdHNdIC0gVEJEID8/P1xuICAgKiBAcmV0dXJucyBEb2NcbiAgICovXG5cblxuICBmdW5jdGlvbiBjb25kaXRpb25hbEdyb3VwKHN0YXRlcywgb3B0cykge1xuICAgIHJldHVybiBncm91cChzdGF0ZXNbMF0sIE9iamVjdC5hc3NpZ24oe30sIG9wdHMsIHtcbiAgICAgIGV4cGFuZGVkU3RhdGVzOiBzdGF0ZXNcbiAgICB9KSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jW119IHBhcnRzXG4gICAqIEByZXR1cm5zIERvY1xuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGZpbGwocGFydHMpIHtcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImZpbGxcIixcbiAgICAgIHBhcnRzXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtEb2N9IFticmVha0NvbnRlbnRzXVxuICAgKiBAcGFyYW0ge0RvY30gW2ZsYXRDb250ZW50c11cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRzXSAtIFRCRCA/Pz9cbiAgICogQHJldHVybnMgRG9jXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaWZCcmVhayhicmVha0NvbnRlbnRzLCBmbGF0Q29udGVudHMsIG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImlmLWJyZWFrXCIsXG4gICAgICBicmVha0NvbnRlbnRzLFxuICAgICAgZmxhdENvbnRlbnRzLFxuICAgICAgZ3JvdXBJZDogb3B0cy5ncm91cElkXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtEb2N9IGNvbnRlbnRzXG4gICAqIEByZXR1cm5zIERvY1xuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGxpbmVTdWZmaXgoY29udGVudHMpIHtcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImxpbmUtc3VmZml4XCIsXG4gICAgICBjb250ZW50c1xuICAgIH07XG4gIH1cblxuICBjb25zdCBsaW5lU3VmZml4Qm91bmRhcnkgPSB7XG4gICAgdHlwZTogXCJsaW5lLXN1ZmZpeC1ib3VuZGFyeVwiXG4gIH07XG4gIGNvbnN0IGJyZWFrUGFyZW50ID0ge1xuICAgIHR5cGU6IFwiYnJlYWstcGFyZW50XCJcbiAgfTtcbiAgY29uc3QgdHJpbSA9IHtcbiAgICB0eXBlOiBcInRyaW1cIlxuICB9O1xuICBjb25zdCBsaW5lID0ge1xuICAgIHR5cGU6IFwibGluZVwiXG4gIH07XG4gIGNvbnN0IHNvZnRsaW5lID0ge1xuICAgIHR5cGU6IFwibGluZVwiLFxuICAgIHNvZnQ6IHRydWVcbiAgfTtcbiAgY29uc3QgaGFyZGxpbmUgPSBjb25jYXQoW3tcbiAgICB0eXBlOiBcImxpbmVcIixcbiAgICBoYXJkOiB0cnVlXG4gIH0sIGJyZWFrUGFyZW50XSk7XG4gIGNvbnN0IGxpdGVyYWxsaW5lID0gY29uY2F0KFt7XG4gICAgdHlwZTogXCJsaW5lXCIsXG4gICAgaGFyZDogdHJ1ZSxcbiAgICBsaXRlcmFsOiB0cnVlXG4gIH0sIGJyZWFrUGFyZW50XSk7XG4gIGNvbnN0IGN1cnNvciA9IHtcbiAgICB0eXBlOiBcImN1cnNvclwiLFxuICAgIHBsYWNlaG9sZGVyOiBTeW1ib2woXCJjdXJzb3JcIilcbiAgfTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jfSBzZXBcbiAgICogQHBhcmFtIHtEb2NbXX0gYXJyXG4gICAqIEByZXR1cm5zIERvY1xuICAgKi9cblxuICBmdW5jdGlvbiBqb2luKHNlcCwgYXJyKSB7XG4gICAgY29uc3QgcmVzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgcmVzLnB1c2goc2VwKTtcbiAgICAgIH1cblxuICAgICAgcmVzLnB1c2goYXJyW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uY2F0KHJlcyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jfSBkb2NcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRhYldpZHRoXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gYWRkQWxpZ25tZW50VG9Eb2MoZG9jLCBzaXplLCB0YWJXaWR0aCkge1xuICAgIGxldCBhbGlnbmVkID0gZG9jO1xuXG4gICAgaWYgKHNpemUgPiAwKSB7XG4gICAgICAvLyBVc2UgaW5kZW50IHRvIGFkZCB0YWJzIGZvciBhbGwgdGhlIGxldmVscyBvZiB0YWJzIHdlIG5lZWRcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5mbG9vcihzaXplIC8gdGFiV2lkdGgpOyArK2kpIHtcbiAgICAgICAgYWxpZ25lZCA9IGluZGVudChhbGlnbmVkKTtcbiAgICAgIH0gLy8gVXNlIGFsaWduIGZvciBhbGwgdGhlIHNwYWNlcyB0aGF0IGFyZSBuZWVkZWRcblxuXG4gICAgICBhbGlnbmVkID0gYWxpZ24oc2l6ZSAlIHRhYldpZHRoLCBhbGlnbmVkKTsgLy8gc2l6ZSBpcyBhYnNvbHV0ZSBmcm9tIDAgYW5kIG5vdCByZWxhdGl2ZSB0byB0aGUgY3VycmVudFxuICAgICAgLy8gaW5kZW50YXRpb24sIHNvIHdlIHVzZSAtSW5maW5pdHkgdG8gcmVzZXQgdGhlIGluZGVudGF0aW9uIHRvIDBcblxuICAgICAgYWxpZ25lZCA9IGFsaWduKC1JbmZpbml0eSwgYWxpZ25lZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsaWduZWQ7XG4gIH1cblxuICB2YXIgZG9jQnVpbGRlcnMgPSB7XG4gICAgY29uY2F0LFxuICAgIGpvaW4sXG4gICAgbGluZSxcbiAgICBzb2Z0bGluZSxcbiAgICBoYXJkbGluZSxcbiAgICBsaXRlcmFsbGluZSxcbiAgICBncm91cCxcbiAgICBjb25kaXRpb25hbEdyb3VwLFxuICAgIGZpbGwsXG4gICAgbGluZVN1ZmZpeCxcbiAgICBsaW5lU3VmZml4Qm91bmRhcnksXG4gICAgY3Vyc29yLFxuICAgIGJyZWFrUGFyZW50LFxuICAgIGlmQnJlYWssXG4gICAgdHJpbSxcbiAgICBpbmRlbnQsXG4gICAgYWxpZ24sXG4gICAgYWRkQWxpZ25tZW50VG9Eb2MsXG4gICAgbWFya0FzUm9vdCxcbiAgICBkZWRlbnRUb1Jvb3QsXG4gICAgZGVkZW50XG4gIH07XG5cbiAgdmFyIGFuc2lSZWdleCA9ICh7XG4gICAgb25seUZpcnN0ID0gZmFsc2VcbiAgfSA9IHt9KSA9PiB7XG4gICAgY29uc3QgcGF0dGVybiA9IFsnW1xcXFx1MDAxQlxcXFx1MDA5Ql1bW1xcXFxdKCkjOz9dKig/Oig/Oig/OlthLXpBLVpcXFxcZF0qKD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKikqKT9cXFxcdTAwMDcpJywgJyg/Oig/OlxcXFxkezEsNH0oPzo7XFxcXGR7MCw0fSkqKT9bXFxcXGRBLVBSLVRaY2YtbnRxcnk9Pjx+XSkpJ10uam9pbignfCcpO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4sIG9ubHlGaXJzdCA/IHVuZGVmaW5lZCA6ICdnJyk7XG4gIH07XG5cbiAgdmFyIHN0cmlwQW5zaSA9IHN0cmluZyA9PiB0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyA/IHN0cmluZy5yZXBsYWNlKGFuc2lSZWdleCgpLCAnJykgOiBzdHJpbmc7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgeW9kYSAqL1xuXG4gIGNvbnN0IGlzRnVsbHdpZHRoQ29kZVBvaW50ID0gY29kZVBvaW50ID0+IHtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGNvZGVQb2ludCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIENvZGUgcG9pbnRzIGFyZSBkZXJpdmVkIGZyb206XG4gICAgLy8gaHR0cDovL3d3dy51bml4Lm9yZy9QdWJsaWMvVU5JREFUQS9FYXN0QXNpYW5XaWR0aC50eHRcblxuXG4gICAgaWYgKGNvZGVQb2ludCA+PSAweDExMDAgJiYgKGNvZGVQb2ludCA8PSAweDExNUYgfHwgLy8gSGFuZ3VsIEphbW9cbiAgICBjb2RlUG9pbnQgPT09IDB4MjMyOSB8fCAvLyBMRUZULVBPSU5USU5HIEFOR0xFIEJSQUNLRVRcbiAgICBjb2RlUG9pbnQgPT09IDB4MjMyQSB8fCAvLyBSSUdIVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUXG4gICAgLy8gQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQgLi4gRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRoc1xuICAgIDB4MkU4MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MzI0NyAmJiBjb2RlUG9pbnQgIT09IDB4MzAzRiB8fCAvLyBFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzIC4uIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEFcbiAgICAweDMyNTAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDREQkYgfHwgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyAuLiBZaSBSYWRpY2Fsc1xuICAgIDB4NEUwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4QTRDNiB8fCAvLyBIYW5ndWwgSmFtbyBFeHRlbmRlZC1BXG4gICAgMHhBOTYwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhBOTdDIHx8IC8vIEhhbmd1bCBTeWxsYWJsZXNcbiAgICAweEFDMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEQ3QTMgfHwgLy8gQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBoc1xuICAgIDB4RjkwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkFGRiB8fCAvLyBWZXJ0aWNhbCBGb3Jtc1xuICAgIDB4RkUxMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkUxOSB8fCAvLyBDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyAuLiBTbWFsbCBGb3JtIFZhcmlhbnRzXG4gICAgMHhGRTMwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRTZCIHx8IC8vIEhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zXG4gICAgMHhGRjAxIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRjYwIHx8IDB4RkZFMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkZFNiB8fCAvLyBLYW5hIFN1cHBsZW1lbnRcbiAgICAweDFCMDAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxQjAwMSB8fCAvLyBFbmNsb3NlZCBJZGVvZ3JhcGhpYyBTdXBwbGVtZW50XG4gICAgMHgxRjIwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MUYyNTEgfHwgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQiAuLiBUZXJ0aWFyeSBJZGVvZ3JhcGhpYyBQbGFuZVxuICAgIDB4MjAwMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDNGRkZEKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHZhciBpc0Z1bGx3aWR0aENvZGVQb2ludF8xID0gaXNGdWxsd2lkdGhDb2RlUG9pbnQ7XG4gIHZhciBkZWZhdWx0XzEkMSA9IGlzRnVsbHdpZHRoQ29kZVBvaW50O1xuICBpc0Z1bGx3aWR0aENvZGVQb2ludF8xLmRlZmF1bHQgPSBkZWZhdWx0XzEkMTtcblxuICB2YXIgZW1vamlSZWdleCA9IGZ1bmN0aW9uIGVtb2ppUmVnZXgoKSB7XG4gICAgLy8gaHR0cHM6Ly9tdGhzLmJlL2Vtb2ppXG4gICAgcmV0dXJuIC9cXHVEODNDXFx1REZGNFxcdURCNDBcXHVEQzY3XFx1REI0MFxcdURDNjIoPzpcXHVEQjQwXFx1REM2NVxcdURCNDBcXHVEQzZFXFx1REI0MFxcdURDNjd8XFx1REI0MFxcdURDNzNcXHVEQjQwXFx1REM2M1xcdURCNDBcXHVEQzc0fFxcdURCNDBcXHVEQzc3XFx1REI0MFxcdURDNkNcXHVEQjQwXFx1REM3MylcXHVEQjQwXFx1REM3RnxcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4XFx1RDgzQ1xcdURGRkJ8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZGXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkVdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkVcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRF0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRFxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1MjAwRCg/OlxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCk/XFx1RDgzRFxcdURDNjh8KD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY3XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKSl8XFx1RDgzRFxcdURDNjZcXHUyMDBEXFx1RDgzRFxcdURDNjZ8XFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKVxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8W1xcdTI2OTVcXHUyNjk2XFx1MjcwOF1cXHVGRTBGfFxcdUQ4M0RbXFx1REM2NlxcdURDNjddfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXwoPzpcXHVEODNDXFx1REZGQlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XSlcXHVGRTBGfFxcdUQ4M0NcXHVERkZCXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkJcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGQ1xcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OSlcXHVEODNDXFx1REZGQnxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NcXHVERkZGXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDEpfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkVcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGRlxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSkpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkVdKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZDXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkRcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjkpKD86XFx1RDgzQ1tcXHVERkZCXFx1REZGQ10pfFxcdUQ4M0RcXHVEQzY5KD86XFx1RDgzQ1xcdURGRkVcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRFxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkNcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZELVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkJcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkMtXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRFxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNcXHVERkZFXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHUyMDBEKD86XFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pfFxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkZcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2OVxcdTIwMEQoPzpcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSkpfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkRcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGRVxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRF0pfFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY5XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXwoPzpcXHVEODNEXFx1REM0MVxcdUZFMEZcXHUyMDBEXFx1RDgzRFxcdURERTh8XFx1RDgzRFxcdURDNjkoPzpcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF0pfCg/Oig/OlxcdTI2Rjl8XFx1RDgzQ1tcXHVERkNCXFx1REZDQ118XFx1RDgzRFxcdURENzUpXFx1RkUwRnxcXHVEODNEXFx1REM2RnxcXHVEODNFW1xcdUREM0NcXHVERERFXFx1RERERl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18KD86XFx1MjZGOXxcXHVEODNDW1xcdURGQ0JcXHVERkNDXXxcXHVEODNEXFx1REQ3NSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzFcXHVEQzczXFx1REM3N1xcdURDODFcXHVEQzgyXFx1REM4NlxcdURDODdcXHVERTQ1LVxcdURFNDdcXHVERTRCXFx1REU0RFxcdURFNEVcXHVERUEzXFx1REVCNC1cXHVERUI2XXxcXHVEODNFW1xcdUREMjZcXHVERDM3LVxcdUREMzlcXHVERDNEXFx1REQzRVxcdUREQjhcXHVEREI5XFx1RERDRC1cXHVERENGXFx1RERENi1cXHVEREREXSkoPzooPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18XFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml0pfFxcdUQ4M0NcXHVERkY0XFx1MjAwRFxcdTI2MjApXFx1RkUwRnxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8XFx1RDgzQ1xcdURGRjNcXHVGRTBGXFx1MjAwRFxcdUQ4M0NcXHVERjA4fFxcdUQ4M0RcXHVEQzE1XFx1MjAwRFxcdUQ4M0VcXHVEREJBfFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY3fFxcdUQ4M0NcXHVEREZEXFx1RDgzQ1xcdURERjB8XFx1RDgzQ1xcdURERjRcXHVEODNDXFx1RERGMnxcXHVEODNDXFx1RERGNlxcdUQ4M0NcXHVEREU2fFsjXFwqMC05XVxcdUZFMEZcXHUyMEUzfFxcdUQ4M0NcXHVEREU3KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFN1xcdURERTktXFx1RERFRlxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERGOSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREU5XFx1RERFQi1cXHVEREVEXFx1RERFRi1cXHVEREY0XFx1RERGN1xcdURERjlcXHVEREZCXFx1RERGQ1xcdURERkZdKXxcXHVEODNDXFx1RERFQSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBXFx1RERFQ1xcdURERURcXHVEREY3LVxcdURERkFdKXxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8XFx1RDgzQ1xcdURERjcoPzpcXHVEODNDW1xcdURERUFcXHVEREY0XFx1RERGOFxcdURERkFcXHVEREZDXSl8XFx1RDgzRFxcdURDNjkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0NcXHVEREYyKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOC1cXHVEREVEXFx1RERGMC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERTYoPzpcXHVEODNDW1xcdURERTgtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGMlxcdURERjRcXHVEREY2LVxcdURERkFcXHVEREZDXFx1RERGRFxcdURERkZdKXxcXHVEODNDXFx1RERGMCg/OlxcdUQ4M0NbXFx1RERFQVxcdURERUMtXFx1RERFRVxcdURERjJcXHVEREYzXFx1RERGNVxcdURERjdcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFRCg/OlxcdUQ4M0NbXFx1RERGMFxcdURERjJcXHVEREYzXFx1RERGN1xcdURERjlcXHVEREZBXSl8XFx1RDgzQ1xcdURERTkoPzpcXHVEODNDW1xcdURERUFcXHVEREVDXFx1RERFRlxcdURERjBcXHVEREYyXFx1RERGNFxcdURERkZdKXxcXHVEODNDXFx1RERGRSg/OlxcdUQ4M0NbXFx1RERFQVxcdURERjldKXxcXHVEODNDXFx1RERFQyg/OlxcdUQ4M0NbXFx1RERFNlxcdURERTdcXHVEREU5LVxcdURERUVcXHVEREYxLVxcdURERjNcXHVEREY1LVxcdURERkFcXHVEREZDXFx1RERGRV0pfFxcdUQ4M0NcXHVEREY4KD86XFx1RDgzQ1tcXHVEREU2LVxcdURERUFcXHVEREVDLVxcdURERjRcXHVEREY3LVxcdURERjlcXHVEREZCXFx1RERGRC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERUIoPzpcXHVEODNDW1xcdURERUUtXFx1RERGMFxcdURERjJcXHVEREY0XFx1RERGN10pfFxcdUQ4M0NcXHVEREY1KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFQS1cXHVEREVEXFx1RERGMC1cXHVEREYzXFx1RERGNy1cXHVEREY5XFx1RERGQ1xcdURERkVdKXxcXHVEODNDXFx1RERGQig/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBXFx1RERFQ1xcdURERUVcXHVEREYzXFx1RERGQV0pfFxcdUQ4M0NcXHVEREYzKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERUEtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGNFxcdURERjVcXHVEREY3XFx1RERGQVxcdURERkZdKXxcXHVEODNDXFx1RERFOCg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREU5XFx1RERFQi1cXHVEREVFXFx1RERGMC1cXHVEREY1XFx1RERGN1xcdURERkEtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREYxKD86XFx1RDgzQ1tcXHVEREU2LVxcdURERThcXHVEREVFXFx1RERGMFxcdURERjctXFx1RERGQlxcdURERkVdKXxcXHVEODNDXFx1RERGRig/OlxcdUQ4M0NbXFx1RERFNlxcdURERjJcXHVEREZDXSl8XFx1RDgzQ1xcdURERkMoPzpcXHVEODNDW1xcdURERUJcXHVEREY4XSl8XFx1RDgzQ1xcdURERkEoPzpcXHVEODNDW1xcdURERTZcXHVEREVDXFx1RERGMlxcdURERjNcXHVEREY4XFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFRSg/OlxcdUQ4M0NbXFx1RERFOC1cXHVEREVBXFx1RERGMS1cXHVEREY0XFx1RERGNi1cXHVEREY5XSl8XFx1RDgzQ1xcdURERUYoPzpcXHVEODNDW1xcdURERUFcXHVEREYyXFx1RERGNFxcdURERjVdKXwoPzpcXHVEODNDW1xcdURGQzNcXHVERkM0XFx1REZDQV18XFx1RDgzRFtcXHVEQzZFXFx1REM3MVxcdURDNzNcXHVEQzc3XFx1REM4MVxcdURDODJcXHVEQzg2XFx1REM4N1xcdURFNDUtXFx1REU0N1xcdURFNEJcXHVERTREXFx1REU0RVxcdURFQTNcXHVERUI0LVxcdURFQjZdfFxcdUQ4M0VbXFx1REQyNlxcdUREMzctXFx1REQzOVxcdUREM0RcXHVERDNFXFx1RERCOFxcdUREQjlcXHVERENELVxcdUREQ0ZcXHVEREQ2LVxcdURERERdKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8KD86XFx1MjZGOXxcXHVEODNDW1xcdURGQ0JcXHVERkNDXXxcXHVEODNEXFx1REQ3NSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OltcXHUyNjFEXFx1MjcwQS1cXHUyNzBEXXxcXHVEODNDW1xcdURGODVcXHVERkMyXFx1REZDN118XFx1RDgzRFtcXHVEQzQyXFx1REM0M1xcdURDNDYtXFx1REM1MFxcdURDNjZcXHVEQzY3XFx1REM2Qi1cXHVEQzZEXFx1REM3MFxcdURDNzJcXHVEQzc0LVxcdURDNzZcXHVEQzc4XFx1REM3Q1xcdURDODNcXHVEQzg1XFx1RENBQVxcdURENzRcXHVERDdBXFx1REQ5MFxcdUREOTVcXHVERDk2XFx1REU0Q1xcdURFNEZcXHVERUMwXFx1REVDQ118XFx1RDgzRVtcXHVERDBGXFx1REQxOC1cXHVERDFDXFx1REQxRVxcdUREMUZcXHVERDMwLVxcdUREMzZcXHVEREI1XFx1RERCNlxcdUREQkJcXHVEREQyLVxcdURERDVdKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8KD86W1xcdTIzMUFcXHUyMzFCXFx1MjNFOS1cXHUyM0VDXFx1MjNGMFxcdTIzRjNcXHUyNUZEXFx1MjVGRVxcdTI2MTRcXHUyNjE1XFx1MjY0OC1cXHUyNjUzXFx1MjY3RlxcdTI2OTNcXHUyNkExXFx1MjZBQVxcdTI2QUJcXHUyNkJEXFx1MjZCRVxcdTI2QzRcXHUyNkM1XFx1MjZDRVxcdTI2RDRcXHUyNkVBXFx1MjZGMlxcdTI2RjNcXHUyNkY1XFx1MjZGQVxcdTI2RkRcXHUyNzA1XFx1MjcwQVxcdTI3MEJcXHUyNzI4XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc5NS1cXHUyNzk3XFx1MjdCMFxcdTI3QkZcXHUyQjFCXFx1MkIxQ1xcdTJCNTBcXHUyQjU1XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTFBXFx1REUyRlxcdURFMzItXFx1REUzNlxcdURFMzgtXFx1REUzQVxcdURFNTBcXHVERTUxXFx1REYwMC1cXHVERjIwXFx1REYyRC1cXHVERjM1XFx1REYzNy1cXHVERjdDXFx1REY3RS1cXHVERjkzXFx1REZBMC1cXHVERkNBXFx1REZDRi1cXHVERkQzXFx1REZFMC1cXHVERkYwXFx1REZGNFxcdURGRjgtXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDM0VcXHVEQzQwXFx1REM0Mi1cXHVEQ0ZDXFx1RENGRi1cXHVERDNEXFx1REQ0Qi1cXHVERDRFXFx1REQ1MC1cXHVERDY3XFx1REQ3QVxcdUREOTVcXHVERDk2XFx1RERBNFxcdURERkItXFx1REU0RlxcdURFODAtXFx1REVDNVxcdURFQ0NcXHVERUQwLVxcdURFRDJcXHVERUQ1XFx1REVFQlxcdURFRUNcXHVERUY0LVxcdURFRkFcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwRC1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDcxXFx1REQ3My1cXHVERDc2XFx1REQ3QS1cXHVEREEyXFx1RERBNS1cXHVEREFBXFx1RERBRS1cXHVERENBXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTczXFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTgyXFx1REU5MC1cXHVERTk1XSl8KD86WyNcXCowLTlcXHhBOVxceEFFXFx1MjAzQ1xcdTIwNDlcXHUyMTIyXFx1MjEzOVxcdTIxOTQtXFx1MjE5OVxcdTIxQTlcXHUyMUFBXFx1MjMxQVxcdTIzMUJcXHUyMzI4XFx1MjNDRlxcdTIzRTktXFx1MjNGM1xcdTIzRjgtXFx1MjNGQVxcdTI0QzJcXHUyNUFBXFx1MjVBQlxcdTI1QjZcXHUyNUMwXFx1MjVGQi1cXHUyNUZFXFx1MjYwMC1cXHUyNjA0XFx1MjYwRVxcdTI2MTFcXHUyNjE0XFx1MjYxNVxcdTI2MThcXHUyNjFEXFx1MjYyMFxcdTI2MjJcXHUyNjIzXFx1MjYyNlxcdTI2MkFcXHUyNjJFXFx1MjYyRlxcdTI2MzgtXFx1MjYzQVxcdTI2NDBcXHUyNjQyXFx1MjY0OC1cXHUyNjUzXFx1MjY1RlxcdTI2NjBcXHUyNjYzXFx1MjY2NVxcdTI2NjZcXHUyNjY4XFx1MjY3QlxcdTI2N0VcXHUyNjdGXFx1MjY5Mi1cXHUyNjk3XFx1MjY5OVxcdTI2OUJcXHUyNjlDXFx1MjZBMFxcdTI2QTFcXHUyNkFBXFx1MjZBQlxcdTI2QjBcXHUyNkIxXFx1MjZCRFxcdTI2QkVcXHUyNkM0XFx1MjZDNVxcdTI2QzhcXHUyNkNFXFx1MjZDRlxcdTI2RDFcXHUyNkQzXFx1MjZENFxcdTI2RTlcXHUyNkVBXFx1MjZGMC1cXHUyNkY1XFx1MjZGNy1cXHUyNkZBXFx1MjZGRFxcdTI3MDJcXHUyNzA1XFx1MjcwOC1cXHUyNzBEXFx1MjcwRlxcdTI3MTJcXHUyNzE0XFx1MjcxNlxcdTI3MURcXHUyNzIxXFx1MjcyOFxcdTI3MzNcXHUyNzM0XFx1Mjc0NFxcdTI3NDdcXHUyNzRDXFx1Mjc0RVxcdTI3NTMtXFx1Mjc1NVxcdTI3NTdcXHUyNzYzXFx1Mjc2NFxcdTI3OTUtXFx1Mjc5N1xcdTI3QTFcXHUyN0IwXFx1MjdCRlxcdTI5MzRcXHUyOTM1XFx1MkIwNS1cXHUyQjA3XFx1MkIxQlxcdTJCMUNcXHUyQjUwXFx1MkI1NVxcdTMwMzBcXHUzMDNEXFx1MzI5N1xcdTMyOTldfFxcdUQ4M0NbXFx1REMwNFxcdURDQ0ZcXHVERDcwXFx1REQ3MVxcdUREN0VcXHVERDdGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTAyXFx1REUxQVxcdURFMkZcXHVERTMyLVxcdURFM0FcXHVERTUwXFx1REU1MVxcdURGMDAtXFx1REYyMVxcdURGMjQtXFx1REY5M1xcdURGOTZcXHVERjk3XFx1REY5OS1cXHVERjlCXFx1REY5RS1cXHVERkYwXFx1REZGMy1cXHVERkY1XFx1REZGNy1cXHVERkZGXXxcXHVEODNEW1xcdURDMDAtXFx1RENGRFxcdURDRkYtXFx1REQzRFxcdURENDktXFx1REQ0RVxcdURENTAtXFx1REQ2N1xcdURENkZcXHVERDcwXFx1REQ3My1cXHVERDdBXFx1REQ4N1xcdUREOEEtXFx1REQ4RFxcdUREOTBcXHVERDk1XFx1REQ5NlxcdUREQTRcXHVEREE1XFx1RERBOFxcdUREQjFcXHVEREIyXFx1RERCQ1xcdUREQzItXFx1RERDNFxcdURERDEtXFx1REREM1xcdUREREMtXFx1RERERVxcdURERTFcXHVEREUzXFx1RERFOFxcdURERUZcXHVEREYzXFx1RERGQS1cXHVERTRGXFx1REU4MC1cXHVERUM1XFx1REVDQi1cXHVERUQyXFx1REVENVxcdURFRTAtXFx1REVFNVxcdURFRTlcXHVERUVCXFx1REVFQ1xcdURFRjBcXHVERUYzLVxcdURFRkFcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwRC1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDcxXFx1REQ3My1cXHVERDc2XFx1REQ3QS1cXHVEREEyXFx1RERBNS1cXHVEREFBXFx1RERBRS1cXHVERENBXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTczXFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTgyXFx1REU5MC1cXHVERTk1XSlcXHVGRTBGfCg/OltcXHUyNjFEXFx1MjZGOVxcdTI3MEEtXFx1MjcwRF18XFx1RDgzQ1tcXHVERjg1XFx1REZDMi1cXHVERkM0XFx1REZDN1xcdURGQ0EtXFx1REZDQ118XFx1RDgzRFtcXHVEQzQyXFx1REM0M1xcdURDNDYtXFx1REM1MFxcdURDNjYtXFx1REM3OFxcdURDN0NcXHVEQzgxLVxcdURDODNcXHVEQzg1LVxcdURDODdcXHVEQzhGXFx1REM5MVxcdURDQUFcXHVERDc0XFx1REQ3NVxcdUREN0FcXHVERDkwXFx1REQ5NVxcdUREOTZcXHVERTQ1LVxcdURFNDdcXHVERTRCLVxcdURFNEZcXHVERUEzXFx1REVCNC1cXHVERUI2XFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwRlxcdUREMTgtXFx1REQxRlxcdUREMjZcXHVERDMwLVxcdUREMzlcXHVERDNDLVxcdUREM0VcXHVEREI1XFx1RERCNlxcdUREQjhcXHVEREI5XFx1RERCQlxcdUREQ0QtXFx1RERDRlxcdURERDEtXFx1RERERF0pL2c7XG4gIH07XG5cbiAgY29uc3Qgc3RyaW5nV2lkdGggPSBzdHJpbmcgPT4ge1xuICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGVtb2ppUmVnZXgoKSwgJyAgJyk7XG5cbiAgICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycgfHwgc3RyaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgc3RyaW5nID0gc3RyaXBBbnNpKHN0cmluZyk7XG4gICAgbGV0IHdpZHRoID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjb2RlID0gc3RyaW5nLmNvZGVQb2ludEF0KGkpOyAvLyBJZ25vcmUgY29udHJvbCBjaGFyYWN0ZXJzXG5cbiAgICAgIGlmIChjb2RlIDw9IDB4MUYgfHwgY29kZSA+PSAweDdGICYmIGNvZGUgPD0gMHg5Rikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gSWdub3JlIGNvbWJpbmluZyBjaGFyYWN0ZXJzXG5cblxuICAgICAgaWYgKGNvZGUgPj0gMHgzMDAgJiYgY29kZSA8PSAweDM2Rikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gU3Vycm9nYXRlc1xuXG5cbiAgICAgIGlmIChjb2RlID4gMHhGRkZGKSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgd2lkdGggKz0gaXNGdWxsd2lkdGhDb2RlUG9pbnRfMShjb2RlKSA/IDIgOiAxO1xuICAgIH1cblxuICAgIHJldHVybiB3aWR0aDtcbiAgfTtcblxuICB2YXIgc3RyaW5nV2lkdGhfMSA9IHN0cmluZ1dpZHRoOyAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uXG5cbiAgdmFyIGRlZmF1bHRfMSQyID0gc3RyaW5nV2lkdGg7XG4gIHN0cmluZ1dpZHRoXzEuZGVmYXVsdCA9IGRlZmF1bHRfMSQyO1xuXG4gIGNvbnN0IG1hdGNoT3BlcmF0b3JzUmVnZXggPSAvW3xcXFxce30oKVtcXF1eJCsqPy4tXS9nO1xuXG4gIHZhciBlc2NhcGVTdHJpbmdSZWdleHAkMiA9IHN0cmluZyA9PiB7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShtYXRjaE9wZXJhdG9yc1JlZ2V4LCAnXFxcXCQmJyk7XG4gIH07XG5cbiAgY29uc3Qgbm90QXNjaWlSZWdleCA9IC9bXlxceDIwLVxceDdGXS87XG5cbiAgZnVuY3Rpb24gZ2V0UGVudWx0aW1hdGUoYXJyKSB7XG4gICAgaWYgKGFyci5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAyXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogQHR5cGVkZWYge3tiYWNrd2FyZHM/OiBib29sZWFufX0gU2tpcE9wdGlvbnNcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgUmVnRXhwfSBjaGFyc1xuICAgKiBAcmV0dXJucyB7KHRleHQ6IHN0cmluZywgaW5kZXg6IG51bWJlciB8IGZhbHNlLCBvcHRzPzogU2tpcE9wdGlvbnMpID0+IG51bWJlciB8IGZhbHNlfVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHNraXAoY2hhcnMpIHtcbiAgICByZXR1cm4gKHRleHQsIGluZGV4LCBvcHRzKSA9PiB7XG4gICAgICBjb25zdCBiYWNrd2FyZHMgPSBvcHRzICYmIG9wdHMuYmFja3dhcmRzOyAvLyBBbGxvdyBgc2tpcGAgZnVuY3Rpb25zIHRvIGJlIHRocmVhZGVkIHRvZ2V0aGVyIHdpdGhvdXQgaGF2aW5nXG4gICAgICAvLyB0byBjaGVjayBmb3IgZmFpbHVyZXMgKGRpZCBzb21lb25lIHNheSBtb25hZHM/KS5cblxuICAgICAgaWYgKGluZGV4ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGVuZ3RoXG4gICAgICB9ID0gdGV4dDtcbiAgICAgIGxldCBjdXJzb3IgPSBpbmRleDtcblxuICAgICAgd2hpbGUgKGN1cnNvciA+PSAwICYmIGN1cnNvciA8IGxlbmd0aCkge1xuICAgICAgICBjb25zdCBjID0gdGV4dC5jaGFyQXQoY3Vyc29yKTtcblxuICAgICAgICBpZiAoY2hhcnMgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICBpZiAoIWNoYXJzLnRlc3QoYykpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJzb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFjaGFycy5pbmNsdWRlcyhjKSkge1xuICAgICAgICAgIHJldHVybiBjdXJzb3I7XG4gICAgICAgIH1cblxuICAgICAgICBiYWNrd2FyZHMgPyBjdXJzb3ItLSA6IGN1cnNvcisrO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3Vyc29yID09PSAtMSB8fCBjdXJzb3IgPT09IGxlbmd0aCkge1xuICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBmaWxlLCByZXR1cm4gdGhlXG4gICAgICAgIC8vIG91dC1vZi1ib3VuZHMgY3Vyc29yLiBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gaGFuZGxlIHRoaXNcbiAgICAgICAgLy8gY29ycmVjdGx5LiBXZSBkb24ndCB3YW50IHRvIGluZGljYXRlIGBmYWxzZWAgdGhvdWdoIGlmIGl0XG4gICAgICAgIC8vIGFjdHVhbGx5IHNraXBwZWQgdmFsaWQgY2hhcmFjdGVycy5cbiAgICAgICAgcmV0dXJuIGN1cnNvcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEB0eXBlIHsodGV4dDogc3RyaW5nLCBpbmRleDogbnVtYmVyIHwgZmFsc2UsIG9wdHM/OiBTa2lwT3B0aW9ucykgPT4gbnVtYmVyIHwgZmFsc2V9XG4gICAqL1xuXG5cbiAgY29uc3Qgc2tpcFdoaXRlc3BhY2UgPSBza2lwKC9cXHMvKTtcbiAgLyoqXG4gICAqIEB0eXBlIHsodGV4dDogc3RyaW5nLCBpbmRleDogbnVtYmVyIHwgZmFsc2UsIG9wdHM/OiBTa2lwT3B0aW9ucykgPT4gbnVtYmVyIHwgZmFsc2V9XG4gICAqL1xuXG4gIGNvbnN0IHNraXBTcGFjZXMgPSBza2lwKFwiIFxcdFwiKTtcbiAgLyoqXG4gICAqIEB0eXBlIHsodGV4dDogc3RyaW5nLCBpbmRleDogbnVtYmVyIHwgZmFsc2UsIG9wdHM/OiBTa2lwT3B0aW9ucykgPT4gbnVtYmVyIHwgZmFsc2V9XG4gICAqL1xuXG4gIGNvbnN0IHNraXBUb0xpbmVFbmQgPSBza2lwKFwiLDsgXFx0XCIpO1xuICAvKipcbiAgICogQHR5cGUgeyh0ZXh0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIgfCBmYWxzZSwgb3B0cz86IFNraXBPcHRpb25zKSA9PiBudW1iZXIgfCBmYWxzZX1cbiAgICovXG5cbiAgY29uc3Qgc2tpcEV2ZXJ5dGhpbmdCdXROZXdMaW5lID0gc2tpcCgvW15cXHJcXG5dLyk7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0ge251bWJlciB8IGZhbHNlfSBpbmRleFxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgZmFsc2V9XG4gICAqL1xuXG4gIGZ1bmN0aW9uIHNraXBJbmxpbmVDb21tZW50KHRleHQsIGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0ZXh0LmNoYXJBdChpbmRleCkgPT09IFwiL1wiICYmIHRleHQuY2hhckF0KGluZGV4ICsgMSkgPT09IFwiKlwiKSB7XG4gICAgICBmb3IgKGxldCBpID0gaW5kZXggKyAyOyBpIDwgdGV4dC5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwiKlwiICYmIHRleHQuY2hhckF0KGkgKyAxKSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICByZXR1cm4gaSArIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgZmFsc2V9IGluZGV4XG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCBmYWxzZX1cbiAgICovXG5cblxuICBmdW5jdGlvbiBza2lwVHJhaWxpbmdDb21tZW50KHRleHQsIGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0ZXh0LmNoYXJBdChpbmRleCkgPT09IFwiL1wiICYmIHRleHQuY2hhckF0KGluZGV4ICsgMSkgPT09IFwiL1wiKSB7XG4gICAgICByZXR1cm4gc2tpcEV2ZXJ5dGhpbmdCdXROZXdMaW5lKHRleHQsIGluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXg7XG4gIH0gLy8gVGhpcyBvbmUgZG9lc24ndCB1c2UgdGhlIGFib3ZlIGhlbHBlciBmdW5jdGlvbiBiZWNhdXNlIGl0IHdhbnRzIHRvXG4gIC8vIHRlc3QgXFxyXFxuIGluIG9yZGVyIGFuZCBgc2tpcGAgZG9lc24ndCBzdXBwb3J0IG9yZGVyaW5nIGFuZCB3ZSBvbmx5XG4gIC8vIHdhbnQgdG8gc2tpcCBvbmUgbmV3bGluZS4gSXQncyBzaW1wbGUgdG8gaW1wbGVtZW50LlxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0ge251bWJlciB8IGZhbHNlfSBpbmRleFxuICAgKiBAcGFyYW0ge1NraXBPcHRpb25zPX0gb3B0c1xuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgZmFsc2V9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gc2tpcE5ld2xpbmUodGV4dCwgaW5kZXgsIG9wdHMpIHtcbiAgICBjb25zdCBiYWNrd2FyZHMgPSBvcHRzICYmIG9wdHMuYmFja3dhcmRzO1xuXG4gICAgaWYgKGluZGV4ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGF0SW5kZXggPSB0ZXh0LmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoYmFja3dhcmRzKSB7XG4gICAgICBpZiAodGV4dC5jaGFyQXQoaW5kZXggLSAxKSA9PT0gXCJcXHJcIiAmJiBhdEluZGV4ID09PSBcIlxcblwiKSB7XG4gICAgICAgIHJldHVybiBpbmRleCAtIDI7XG4gICAgICB9XG5cbiAgICAgIGlmIChhdEluZGV4ID09PSBcIlxcblwiIHx8IGF0SW5kZXggPT09IFwiXFxyXCIgfHwgYXRJbmRleCA9PT0gXCJcXHUyMDI4XCIgfHwgYXRJbmRleCA9PT0gXCJcXHUyMDI5XCIpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4IC0gMTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGF0SW5kZXggPT09IFwiXFxyXCIgJiYgdGV4dC5jaGFyQXQoaW5kZXggKyAxKSA9PT0gXCJcXG5cIikge1xuICAgICAgICByZXR1cm4gaW5kZXggKyAyO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXRJbmRleCA9PT0gXCJcXG5cIiB8fCBhdEluZGV4ID09PSBcIlxcclwiIHx8IGF0SW5kZXggPT09IFwiXFx1MjAyOFwiIHx8IGF0SW5kZXggPT09IFwiXFx1MjAyOVwiKSB7XG4gICAgICAgIHJldHVybiBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtTa2lwT3B0aW9ucz19IG9wdHNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaGFzTmV3bGluZSh0ZXh0LCBpbmRleCwgb3B0cykge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGNvbnN0IGlkeCA9IHNraXBTcGFjZXModGV4dCwgb3B0cy5iYWNrd2FyZHMgPyBpbmRleCAtIDEgOiBpbmRleCwgb3B0cyk7XG4gICAgY29uc3QgaWR4MiA9IHNraXBOZXdsaW5lKHRleHQsIGlkeCwgb3B0cyk7XG4gICAgcmV0dXJuIGlkeCAhPT0gaWR4MjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlbmRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaGFzTmV3bGluZUluUmFuZ2UodGV4dCwgc3RhcnQsIGVuZCkge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwiXFxuXCIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIE5vdGU6IHRoaXMgZnVuY3Rpb24gZG9lc24ndCBpZ25vcmUgbGVhZGluZyBjb21tZW50cyB1bmxpa2UgaXNOZXh0TGluZUVtcHR5XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBOXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqIEBwYXJhbSB7Tn0gbm9kZVxuICAgKiBAcGFyYW0geyhub2RlOiBOKSA9PiBudW1iZXJ9IGxvY1N0YXJ0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaXNQcmV2aW91c0xpbmVFbXB0eSh0ZXh0LCBub2RlLCBsb2NTdGFydCkge1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyIHwgZmFsc2V9ICovXG4gICAgbGV0IGlkeCA9IGxvY1N0YXJ0KG5vZGUpIC0gMTtcbiAgICBpZHggPSBza2lwU3BhY2VzKHRleHQsIGlkeCwge1xuICAgICAgYmFja3dhcmRzOiB0cnVlXG4gICAgfSk7XG4gICAgaWR4ID0gc2tpcE5ld2xpbmUodGV4dCwgaWR4LCB7XG4gICAgICBiYWNrd2FyZHM6IHRydWVcbiAgICB9KTtcbiAgICBpZHggPSBza2lwU3BhY2VzKHRleHQsIGlkeCwge1xuICAgICAgYmFja3dhcmRzOiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgaWR4MiA9IHNraXBOZXdsaW5lKHRleHQsIGlkeCwge1xuICAgICAgYmFja3dhcmRzOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGlkeCAhPT0gaWR4MjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGlzTmV4dExpbmVFbXB0eUFmdGVySW5kZXgodGV4dCwgaW5kZXgpIHtcbiAgICAvKiogQHR5cGUge251bWJlciB8IGZhbHNlfSAqL1xuICAgIGxldCBvbGRJZHggPSBudWxsO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyIHwgZmFsc2V9ICovXG5cbiAgICBsZXQgaWR4ID0gaW5kZXg7XG5cbiAgICB3aGlsZSAoaWR4ICE9PSBvbGRJZHgpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gc2tpcCBhbGwgdGhlIHBvdGVudGlhbCB0cmFpbGluZyBpbmxpbmUgY29tbWVudHNcbiAgICAgIG9sZElkeCA9IGlkeDtcbiAgICAgIGlkeCA9IHNraXBUb0xpbmVFbmQodGV4dCwgaWR4KTtcbiAgICAgIGlkeCA9IHNraXBJbmxpbmVDb21tZW50KHRleHQsIGlkeCk7XG4gICAgICBpZHggPSBza2lwU3BhY2VzKHRleHQsIGlkeCk7XG4gICAgfVxuXG4gICAgaWR4ID0gc2tpcFRyYWlsaW5nQ29tbWVudCh0ZXh0LCBpZHgpO1xuICAgIGlkeCA9IHNraXBOZXdsaW5lKHRleHQsIGlkeCk7XG4gICAgcmV0dXJuIGlkeCAhPT0gZmFsc2UgJiYgaGFzTmV3bGluZSh0ZXh0LCBpZHgpO1xuICB9XG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgTlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0ge059IG5vZGVcbiAgICogQHBhcmFtIHsobm9kZTogTikgPT4gbnVtYmVyfSBsb2NFbmRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaXNOZXh0TGluZUVtcHR5KHRleHQsIG5vZGUsIGxvY0VuZCkge1xuICAgIHJldHVybiBpc05leHRMaW5lRW1wdHlBZnRlckluZGV4KHRleHQsIGxvY0VuZChub2RlKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZHhcbiAgICogQHJldHVybnMge251bWJlciB8IGZhbHNlfVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldE5leHROb25TcGFjZU5vbkNvbW1lbnRDaGFyYWN0ZXJJbmRleFdpdGhTdGFydEluZGV4KHRleHQsIGlkeCkge1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyIHwgZmFsc2V9ICovXG4gICAgbGV0IG9sZElkeCA9IG51bGw7XG4gICAgLyoqIEB0eXBlIHtudW1iZXIgfCBmYWxzZX0gKi9cblxuICAgIGxldCBuZXh0SWR4ID0gaWR4O1xuXG4gICAgd2hpbGUgKG5leHRJZHggIT09IG9sZElkeCkge1xuICAgICAgb2xkSWR4ID0gbmV4dElkeDtcbiAgICAgIG5leHRJZHggPSBza2lwU3BhY2VzKHRleHQsIG5leHRJZHgpO1xuICAgICAgbmV4dElkeCA9IHNraXBJbmxpbmVDb21tZW50KHRleHQsIG5leHRJZHgpO1xuICAgICAgbmV4dElkeCA9IHNraXBUcmFpbGluZ0NvbW1lbnQodGV4dCwgbmV4dElkeCk7XG4gICAgICBuZXh0SWR4ID0gc2tpcE5ld2xpbmUodGV4dCwgbmV4dElkeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRJZHg7XG4gIH1cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBOXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqIEBwYXJhbSB7Tn0gbm9kZVxuICAgKiBAcGFyYW0geyhub2RlOiBOKSA9PiBudW1iZXJ9IGxvY0VuZFxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgZmFsc2V9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4KHRleHQsIG5vZGUsIGxvY0VuZCkge1xuICAgIHJldHVybiBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXhXaXRoU3RhcnRJbmRleCh0ZXh0LCBsb2NFbmQobm9kZSkpO1xuICB9XG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgTlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0ge059IG5vZGVcbiAgICogQHBhcmFtIHsobm9kZTogTikgPT4gbnVtYmVyfSBsb2NFbmRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyKHRleHQsIG5vZGUsIGxvY0VuZCkge1xuICAgIHJldHVybiB0ZXh0LmNoYXJBdCggLy8gQHRzLWlnbm9yZSA9PiBUQkQ6IGNhbiByZXR1cm4gZmFsc2UsIHNob3VsZCB3ZSBkZWZpbmUgYSBmYWxsYmFjaz9cbiAgICBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXgodGV4dCwgbm9kZSwgbG9jRW5kKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICAgKiBAcGFyYW0ge1NraXBPcHRpb25zPX0gb3B0c1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBmdW5jdGlvbiBoYXNTcGFjZXModGV4dCwgaW5kZXgsIG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBjb25zdCBpZHggPSBza2lwU3BhY2VzKHRleHQsIG9wdHMuYmFja3dhcmRzID8gaW5kZXggLSAxIDogaW5kZXgsIG9wdHMpO1xuICAgIHJldHVybiBpZHggIT09IGluZGV4O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3tyYW5nZT86IFtudW1iZXIsIG51bWJlcl0sIHN0YXJ0PzogbnVtYmVyfX0gbm9kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICovXG5cblxuICBmdW5jdGlvbiBzZXRMb2NTdGFydChub2RlLCBpbmRleCkge1xuICAgIGlmIChub2RlLnJhbmdlKSB7XG4gICAgICBub2RlLnJhbmdlWzBdID0gaW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc3RhcnQgPSBpbmRleDtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7e3JhbmdlPzogW251bWJlciwgbnVtYmVyXSwgZW5kPzogbnVtYmVyfX0gbm9kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICovXG5cblxuICBmdW5jdGlvbiBzZXRMb2NFbmQobm9kZSwgaW5kZXgpIHtcbiAgICBpZiAobm9kZS5yYW5nZSkge1xuICAgICAgbm9kZS5yYW5nZVsxXSA9IGluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmVuZCA9IGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFBSRUNFREVOQ0UgPSB7fTtcbiAgW1tcInw+XCJdLCBbXCI/P1wiXSwgW1wifHxcIl0sIFtcIiYmXCJdLCBbXCJ8XCJdLCBbXCJeXCJdLCBbXCImXCJdLCBbXCI9PVwiLCBcIj09PVwiLCBcIiE9XCIsIFwiIT09XCJdLCBbXCI8XCIsIFwiPlwiLCBcIjw9XCIsIFwiPj1cIiwgXCJpblwiLCBcImluc3RhbmNlb2ZcIl0sIFtcIj4+XCIsIFwiPDxcIiwgXCI+Pj5cIl0sIFtcIitcIiwgXCItXCJdLCBbXCIqXCIsIFwiL1wiLCBcIiVcIl0sIFtcIioqXCJdXS5mb3JFYWNoKCh0aWVyLCBpKSA9PiB7XG4gICAgdGllci5mb3JFYWNoKG9wID0+IHtcbiAgICAgIFBSRUNFREVOQ0Vbb3BdID0gaTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0UHJlY2VkZW5jZShvcCkge1xuICAgIHJldHVybiBQUkVDRURFTkNFW29wXTtcbiAgfVxuXG4gIGNvbnN0IGVxdWFsaXR5T3BlcmF0b3JzID0ge1xuICAgIFwiPT1cIjogdHJ1ZSxcbiAgICBcIiE9XCI6IHRydWUsXG4gICAgXCI9PT1cIjogdHJ1ZSxcbiAgICBcIiE9PVwiOiB0cnVlXG4gIH07XG4gIGNvbnN0IG11bHRpcGxpY2F0aXZlT3BlcmF0b3JzID0ge1xuICAgIFwiKlwiOiB0cnVlLFxuICAgIFwiL1wiOiB0cnVlLFxuICAgIFwiJVwiOiB0cnVlXG4gIH07XG4gIGNvbnN0IGJpdHNoaWZ0T3BlcmF0b3JzID0ge1xuICAgIFwiPj5cIjogdHJ1ZSxcbiAgICBcIj4+PlwiOiB0cnVlLFxuICAgIFwiPDxcIjogdHJ1ZVxuICB9O1xuXG4gIGZ1bmN0aW9uIHNob3VsZEZsYXR0ZW4ocGFyZW50T3AsIG5vZGVPcCkge1xuICAgIGlmIChnZXRQcmVjZWRlbmNlKG5vZGVPcCkgIT09IGdldFByZWNlZGVuY2UocGFyZW50T3ApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyAqKiBpcyByaWdodC1hc3NvY2lhdGl2ZVxuICAgIC8vIHggKiogeSAqKiB6IC0tPiB4ICoqICh5ICoqIHopXG5cblxuICAgIGlmIChwYXJlbnRPcCA9PT0gXCIqKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyB4ID09IHkgPT0geiAtLT4gKHggPT0geSkgPT0gelxuXG5cbiAgICBpZiAoZXF1YWxpdHlPcGVyYXRvcnNbcGFyZW50T3BdICYmIGVxdWFsaXR5T3BlcmF0b3JzW25vZGVPcF0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIHggKiB5ICUgeiAtLT4gKHggKiB5KSAlIHpcblxuXG4gICAgaWYgKG5vZGVPcCA9PT0gXCIlXCIgJiYgbXVsdGlwbGljYXRpdmVPcGVyYXRvcnNbcGFyZW50T3BdIHx8IHBhcmVudE9wID09PSBcIiVcIiAmJiBtdWx0aXBsaWNhdGl2ZU9wZXJhdG9yc1tub2RlT3BdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyB4ICogeSAvIHogLS0+ICh4ICogeSkgLyB6XG4gICAgLy8geCAvIHkgKiB6IC0tPiAoeCAvIHkpICogelxuXG5cbiAgICBpZiAobm9kZU9wICE9PSBwYXJlbnRPcCAmJiBtdWx0aXBsaWNhdGl2ZU9wZXJhdG9yc1tub2RlT3BdICYmIG11bHRpcGxpY2F0aXZlT3BlcmF0b3JzW3BhcmVudE9wXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8geCA8PCB5IDw8IHogLS0+ICh4IDw8IHkpIDw8IHpcblxuXG4gICAgaWYgKGJpdHNoaWZ0T3BlcmF0b3JzW3BhcmVudE9wXSAmJiBiaXRzaGlmdE9wZXJhdG9yc1tub2RlT3BdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBpc0JpdHdpc2VPcGVyYXRvcihvcGVyYXRvcikge1xuICAgIHJldHVybiAhIWJpdHNoaWZ0T3BlcmF0b3JzW29wZXJhdG9yXSB8fCBvcGVyYXRvciA9PT0gXCJ8XCIgfHwgb3BlcmF0b3IgPT09IFwiXlwiIHx8IG9wZXJhdG9yID09PSBcIiZcIjtcbiAgfSAvLyBUZXN0cyBpZiBhbiBleHByZXNzaW9uIHN0YXJ0cyB3aXRoIGB7YCwgb3IgKGlmIGZvcmJpZEZ1bmN0aW9uQ2xhc3NBbmREb0V4cHJcbiAgLy8gaG9sZHMpIGBmdW5jdGlvbmAsIGBjbGFzc2AsIG9yIGBkbyB7fWAuIFdpbGwgYmUgb3ZlcnplYWxvdXMgaWYgdGhlcmUnc1xuICAvLyBhbHJlYWR5IG5lY2Vzc2FyeSBncm91cGluZyBwYXJlbnRoZXNlcy5cblxuXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGhOb0xvb2thaGVhZFRva2VuKG5vZGUsIGZvcmJpZEZ1bmN0aW9uQ2xhc3NBbmREb0V4cHIpIHtcbiAgICBub2RlID0gZ2V0TGVmdE1vc3Qobm9kZSk7XG5cbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIkNsYXNzRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIkRvRXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gZm9yYmlkRnVuY3Rpb25DbGFzc0FuZERvRXhwcjtcblxuICAgICAgY2FzZSBcIk9iamVjdEV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBzdGFydHNXaXRoTm9Mb29rYWhlYWRUb2tlbihub2RlLm9iamVjdCwgZm9yYmlkRnVuY3Rpb25DbGFzc0FuZERvRXhwcik7XG5cbiAgICAgIGNhc2UgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIjpcbiAgICAgICAgaWYgKG5vZGUudGFnLnR5cGUgPT09IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICAvLyBJSUZFcyBhcmUgYWx3YXlzIGFscmVhZHkgcGFyZW50aGVzaXplZFxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdGFydHNXaXRoTm9Mb29rYWhlYWRUb2tlbihub2RlLnRhZywgZm9yYmlkRnVuY3Rpb25DbGFzc0FuZERvRXhwcik7XG5cbiAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgaWYgKG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICAvLyBJSUZFcyBhcmUgYWx3YXlzIGFscmVhZHkgcGFyZW50aGVzaXplZFxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdGFydHNXaXRoTm9Mb29rYWhlYWRUb2tlbihub2RlLmNhbGxlZSwgZm9yYmlkRnVuY3Rpb25DbGFzc0FuZERvRXhwcik7XG5cbiAgICAgIGNhc2UgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGhOb0xvb2thaGVhZFRva2VuKG5vZGUudGVzdCwgZm9yYmlkRnVuY3Rpb25DbGFzc0FuZERvRXhwcik7XG5cbiAgICAgIGNhc2UgXCJVcGRhdGVFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiAhbm9kZS5wcmVmaXggJiYgc3RhcnRzV2l0aE5vTG9va2FoZWFkVG9rZW4obm9kZS5hcmd1bWVudCwgZm9yYmlkRnVuY3Rpb25DbGFzc0FuZERvRXhwcik7XG5cbiAgICAgIGNhc2UgXCJCaW5kRXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gbm9kZS5vYmplY3QgJiYgc3RhcnRzV2l0aE5vTG9va2FoZWFkVG9rZW4obm9kZS5vYmplY3QsIGZvcmJpZEZ1bmN0aW9uQ2xhc3NBbmREb0V4cHIpO1xuXG4gICAgICBjYXNlIFwiU2VxdWVuY2VFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBzdGFydHNXaXRoTm9Mb29rYWhlYWRUb2tlbihub2RlLmV4cHJlc3Npb25zWzBdLCBmb3JiaWRGdW5jdGlvbkNsYXNzQW5kRG9FeHByKTtcblxuICAgICAgY2FzZSBcIlRTQXNFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBzdGFydHNXaXRoTm9Mb29rYWhlYWRUb2tlbihub2RlLmV4cHJlc3Npb24sIGZvcmJpZEZ1bmN0aW9uQ2xhc3NBbmREb0V4cHIpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TGVmdE1vc3Qobm9kZSkge1xuICAgIGlmIChub2RlLmxlZnQpIHtcbiAgICAgIHJldHVybiBnZXRMZWZ0TW9zdChub2RlLmxlZnQpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRhYldpZHRoXG4gICAqIEBwYXJhbSB7bnVtYmVyPX0gc3RhcnRJbmRleFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldEFsaWdubWVudFNpemUodmFsdWUsIHRhYldpZHRoLCBzdGFydEluZGV4KSB7XG4gICAgc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXggfHwgMDtcbiAgICBsZXQgc2l6ZSA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAodmFsdWVbaV0gPT09IFwiXFx0XCIpIHtcbiAgICAgICAgLy8gVGFicyBiZWhhdmUgaW4gYSB3YXkgdGhhdCB0aGV5IGFyZSBhbGlnbmVkIHRvIHRoZSBuZWFyZXN0XG4gICAgICAgIC8vIG11bHRpcGxlIG9mIHRhYldpZHRoOlxuICAgICAgICAvLyAwIC0+IDQsIDEgLT4gNCwgMiAtPiA0LCAzIC0+IDRcbiAgICAgICAgLy8gNCAtPiA4LCA1IC0+IDgsIDYgLT4gOCwgNyAtPiA4IC4uLlxuICAgICAgICBzaXplID0gc2l6ZSArIHRhYldpZHRoIC0gc2l6ZSAlIHRhYldpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2l6ZSsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaXplO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRhYldpZHRoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0SW5kZW50U2l6ZSh2YWx1ZSwgdGFiV2lkdGgpIHtcbiAgICBjb25zdCBsYXN0TmV3bGluZUluZGV4ID0gdmFsdWUubGFzdEluZGV4T2YoXCJcXG5cIik7XG5cbiAgICBpZiAobGFzdE5ld2xpbmVJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRBbGlnbm1lbnRTaXplKCAvLyBBbGwgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZXNcbiAgICB2YWx1ZS5zbGljZShsYXN0TmV3bGluZUluZGV4ICsgMSkubWF0Y2goL15bIFxcdF0qLylbMF0sIHRhYldpZHRoKTtcbiAgfVxuICAvKipcbiAgICogQHR5cGVkZWYgeydcIicgfCBcIidcIn0gUXVvdGVcbiAgICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdcbiAgICogQHBhcmFtIHtRdW90ZX0gcHJlZmVycmVkUXVvdGVcbiAgICogQHJldHVybnMge1F1b3RlfVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFByZWZlcnJlZFF1b3RlKHJhdywgcHJlZmVycmVkUXVvdGUpIHtcbiAgICAvLyBgcmF3Q29udGVudGAgaXMgdGhlIHN0cmluZyBleGFjdGx5IGxpa2UgaXQgYXBwZWFyZWQgaW4gdGhlIGlucHV0IHNvdXJjZVxuICAgIC8vIGNvZGUsIHdpdGhvdXQgaXRzIGVuY2xvc2luZyBxdW90ZXMuXG4gICAgY29uc3QgcmF3Q29udGVudCA9IHJhdy5zbGljZSgxLCAtMSk7XG4gICAgLyoqIEB0eXBlIHt7IHF1b3RlOiAnXCInLCByZWdleDogUmVnRXhwIH19ICovXG5cbiAgICBjb25zdCBkb3VibGUgPSB7XG4gICAgICBxdW90ZTogJ1wiJyxcbiAgICAgIHJlZ2V4OiAvXCIvZ1xuICAgIH07XG4gICAgLyoqIEB0eXBlIHt7IHF1b3RlOiBcIidcIiwgcmVnZXg6IFJlZ0V4cCB9fSAqL1xuXG4gICAgY29uc3Qgc2luZ2xlID0ge1xuICAgICAgcXVvdGU6IFwiJ1wiLFxuICAgICAgcmVnZXg6IC8nL2dcbiAgICB9O1xuICAgIGNvbnN0IHByZWZlcnJlZCA9IHByZWZlcnJlZFF1b3RlID09PSBcIidcIiA/IHNpbmdsZSA6IGRvdWJsZTtcbiAgICBjb25zdCBhbHRlcm5hdGUgPSBwcmVmZXJyZWQgPT09IHNpbmdsZSA/IGRvdWJsZSA6IHNpbmdsZTtcbiAgICBsZXQgcmVzdWx0ID0gcHJlZmVycmVkLnF1b3RlOyAvLyBJZiBgcmF3Q29udGVudGAgY29udGFpbnMgYXQgbGVhc3Qgb25lIG9mIHRoZSBxdW90ZSBwcmVmZXJyZWQgZm9yIGVuY2xvc2luZ1xuICAgIC8vIHRoZSBzdHJpbmcsIHdlIG1pZ2h0IHdhbnQgdG8gZW5jbG9zZSB3aXRoIHRoZSBhbHRlcm5hdGUgcXVvdGUgaW5zdGVhZCwgdG9cbiAgICAvLyBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIGVzY2FwZWQgcXVvdGVzLlxuXG4gICAgaWYgKHJhd0NvbnRlbnQuaW5jbHVkZXMocHJlZmVycmVkLnF1b3RlKSB8fCByYXdDb250ZW50LmluY2x1ZGVzKGFsdGVybmF0ZS5xdW90ZSkpIHtcbiAgICAgIGNvbnN0IG51bVByZWZlcnJlZFF1b3RlcyA9IChyYXdDb250ZW50Lm1hdGNoKHByZWZlcnJlZC5yZWdleCkgfHwgW10pLmxlbmd0aDtcbiAgICAgIGNvbnN0IG51bUFsdGVybmF0ZVF1b3RlcyA9IChyYXdDb250ZW50Lm1hdGNoKGFsdGVybmF0ZS5yZWdleCkgfHwgW10pLmxlbmd0aDtcbiAgICAgIHJlc3VsdCA9IG51bVByZWZlcnJlZFF1b3RlcyA+IG51bUFsdGVybmF0ZVF1b3RlcyA/IGFsdGVybmF0ZS5xdW90ZSA6IHByZWZlcnJlZC5xdW90ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRTdHJpbmcocmF3LCBvcHRpb25zLCBpc0RpcmVjdGl2ZUxpdGVyYWwpIHtcbiAgICAvLyBgcmF3Q29udGVudGAgaXMgdGhlIHN0cmluZyBleGFjdGx5IGxpa2UgaXQgYXBwZWFyZWQgaW4gdGhlIGlucHV0IHNvdXJjZVxuICAgIC8vIGNvZGUsIHdpdGhvdXQgaXRzIGVuY2xvc2luZyBxdW90ZXMuXG4gICAgY29uc3QgcmF3Q29udGVudCA9IHJhdy5zbGljZSgxLCAtMSk7IC8vIENoZWNrIGZvciB0aGUgYWx0ZXJuYXRlIHF1b3RlLCB0byBkZXRlcm1pbmUgaWYgd2UncmUgYWxsb3dlZCB0byBzd2FwXG4gICAgLy8gdGhlIHF1b3RlcyBvbiBhIERpcmVjdGl2ZUxpdGVyYWwuXG5cbiAgICBjb25zdCBjYW5DaGFuZ2VEaXJlY3RpdmVRdW90ZXMgPSAhcmF3Q29udGVudC5pbmNsdWRlcygnXCInKSAmJiAhcmF3Q29udGVudC5pbmNsdWRlcyhcIidcIik7XG4gICAgLyoqIEB0eXBlIHtRdW90ZX0gKi9cblxuICAgIGNvbnN0IGVuY2xvc2luZ1F1b3RlID0gb3B0aW9ucy5wYXJzZXIgPT09IFwianNvblwiID8gJ1wiJyA6IG9wdGlvbnMuX19pc0luSHRtbEF0dHJpYnV0ZSA/IFwiJ1wiIDogZ2V0UHJlZmVycmVkUXVvdGUocmF3LCBvcHRpb25zLnNpbmdsZVF1b3RlID8gXCInXCIgOiAnXCInKTsgLy8gRGlyZWN0aXZlcyBhcmUgZXhhY3QgY29kZSB1bml0IHNlcXVlbmNlcywgd2hpY2ggbWVhbnMgdGhhdCB5b3UgY2FuJ3RcbiAgICAvLyBjaGFuZ2UgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgdGhleSB1c2UuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmV0dGllci9wcmV0dGllci9pc3N1ZXMvMTU1NVxuICAgIC8vIGFuZCBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI2RpcmVjdGl2ZS1wcm9sb2d1ZVxuXG4gICAgaWYgKGlzRGlyZWN0aXZlTGl0ZXJhbCkge1xuICAgICAgaWYgKGNhbkNoYW5nZURpcmVjdGl2ZVF1b3Rlcykge1xuICAgICAgICByZXR1cm4gZW5jbG9zaW5nUXVvdGUgKyByYXdDb250ZW50ICsgZW5jbG9zaW5nUXVvdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByYXc7XG4gICAgfSAvLyBJdCBtaWdodCBzb3VuZCB1bm5lY2Vzc2FyeSB0byB1c2UgYG1ha2VTdHJpbmdgIGV2ZW4gaWYgdGhlIHN0cmluZyBhbHJlYWR5XG4gICAgLy8gaXMgZW5jbG9zZWQgd2l0aCBgZW5jbG9zaW5nUXVvdGVgLCBidXQgaXQgaXNuJ3QuIFRoZSBzdHJpbmcgY291bGQgY29udGFpblxuICAgIC8vIHVubmVjZXNzYXJ5IGVzY2FwZXMgKHN1Y2ggYXMgaW4gYFwiXFwnXCJgKS4gQWx3YXlzIHVzaW5nIGBtYWtlU3RyaW5nYCBtYWtlc1xuICAgIC8vIHN1cmUgdGhhdCB3ZSBjb25zaXN0ZW50bHkgb3V0cHV0IHRoZSBtaW5pbXVtIGFtb3VudCBvZiBlc2NhcGVkIHF1b3Rlcy5cblxuXG4gICAgcmV0dXJuIG1ha2VTdHJpbmcocmF3Q29udGVudCwgZW5jbG9zaW5nUXVvdGUsICEob3B0aW9ucy5wYXJzZXIgPT09IFwiY3NzXCIgfHwgb3B0aW9ucy5wYXJzZXIgPT09IFwibGVzc1wiIHx8IG9wdGlvbnMucGFyc2VyID09PSBcInNjc3NcIiB8fCBvcHRpb25zLmVtYmVkZGVkSW5IdG1sKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdDb250ZW50XG4gICAqIEBwYXJhbSB7UXVvdGV9IGVuY2xvc2luZ1F1b3RlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuZXNjYXBlVW5uZWNlc3NhcnlFc2NhcGVzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gbWFrZVN0cmluZyhyYXdDb250ZW50LCBlbmNsb3NpbmdRdW90ZSwgdW5lc2NhcGVVbm5lY2Vzc2FyeUVzY2FwZXMpIHtcbiAgICBjb25zdCBvdGhlclF1b3RlID0gZW5jbG9zaW5nUXVvdGUgPT09ICdcIicgPyBcIidcIiA6ICdcIic7IC8vIE1hdGNoZXMgX2FueV8gZXNjYXBlIGFuZCB1bmVzY2FwZWQgcXVvdGVzIChib3RoIHNpbmdsZSBhbmQgZG91YmxlKS5cblxuICAgIGNvbnN0IHJlZ2V4ID0gL1xcXFwoW1xcc1xcU10pfChbJ1wiXSkvZzsgLy8gRXNjYXBlIGFuZCB1bmVzY2FwZSBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXMgYXMgbmVlZGVkIHRvIGJlIGFibGUgdG9cbiAgICAvLyBlbmNsb3NlIGByYXdDb250ZW50YCB3aXRoIGBlbmNsb3NpbmdRdW90ZWAuXG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gcmF3Q29udGVudC5yZXBsYWNlKHJlZ2V4LCAobWF0Y2gsIGVzY2FwZWQsIHF1b3RlKSA9PiB7XG4gICAgICAvLyBJZiB3ZSBtYXRjaGVkIGFuIGVzY2FwZSwgYW5kIHRoZSBlc2NhcGVkIGNoYXJhY3RlciBpcyBhIHF1b3RlIG9mIHRoZVxuICAgICAgLy8gb3RoZXIgdHlwZSB0aGFuIHdlIGludGVuZCB0byBlbmNsb3NlIHRoZSBzdHJpbmcgd2l0aCwgdGhlcmUncyBubyBuZWVkIGZvclxuICAgICAgLy8gaXQgdG8gYmUgZXNjYXBlZCwgc28gcmV0dXJuIGl0IF93aXRob3V0XyB0aGUgYmFja3NsYXNoLlxuICAgICAgaWYgKGVzY2FwZWQgPT09IG90aGVyUXVvdGUpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZWQ7XG4gICAgICB9IC8vIElmIHdlIG1hdGNoZWQgYW4gdW5lc2NhcGVkIHF1b3RlIGFuZCBpdCBpcyBvZiB0aGUgX3NhbWVfIHR5cGUgYXMgd2VcbiAgICAgIC8vIGludGVuZCB0byBlbmNsb3NlIHRoZSBzdHJpbmcgd2l0aCwgaXQgbXVzdCBiZSBlc2NhcGVkLCBzbyByZXR1cm4gaXQgd2l0aFxuICAgICAgLy8gYSBiYWNrc2xhc2guXG5cblxuICAgICAgaWYgKHF1b3RlID09PSBlbmNsb3NpbmdRdW90ZSkge1xuICAgICAgICByZXR1cm4gXCJcXFxcXCIgKyBxdW90ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHF1b3RlKSB7XG4gICAgICAgIHJldHVybiBxdW90ZTtcbiAgICAgIH0gLy8gVW5lc2NhcGUgYW55IHVubmVjZXNzYXJpbHkgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAgICAvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9kZTBiNGFkN2JkODIwYWRlNDFiMWY2MDYwMDhiZWE2ODY4M2RjMTFhL2xpYi9ydWxlcy9uby11c2VsZXNzLWVzY2FwZS5qcyNMMjdcblxuXG4gICAgICByZXR1cm4gdW5lc2NhcGVVbm5lY2Vzc2FyeUVzY2FwZXMgJiYgL15bXlxcXFxucnZ0YmZ1eFxcclxcblxcdTIwMjhcXHUyMDI5XCInMC03XSQvLnRlc3QoZXNjYXBlZCkgPyBlc2NhcGVkIDogXCJcXFxcXCIgKyBlc2NhcGVkO1xuICAgIH0pO1xuICAgIHJldHVybiBlbmNsb3NpbmdRdW90ZSArIG5ld0NvbnRlbnQgKyBlbmNsb3NpbmdRdW90ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50TnVtYmVyKHJhd051bWJlcikge1xuICAgIHJldHVybiByYXdOdW1iZXIudG9Mb3dlckNhc2UoKSAvLyBSZW1vdmUgdW5uZWNlc3NhcnkgcGx1cyBhbmQgemVyb2VzIGZyb20gc2NpZW50aWZpYyBub3RhdGlvbi5cbiAgICAucmVwbGFjZSgvXihbKy1dP1tcXGQuXStlKSg/OlxcK3woLSkpPzAqKFxcZCkvLCBcIiQxJDIkM1wiKSAvLyBSZW1vdmUgdW5uZWNlc3Nhcnkgc2NpZW50aWZpYyBub3RhdGlvbiAoMWUwKS5cbiAgICAucmVwbGFjZSgvXihbKy1dP1tcXGQuXSspZVsrLV0/MCskLywgXCIkMVwiKSAvLyBNYWtlIHN1cmUgbnVtYmVycyBhbHdheXMgc3RhcnQgd2l0aCBhIGRpZ2l0LlxuICAgIC5yZXBsYWNlKC9eKFsrLV0pP1xcLi8sIFwiJDEwLlwiKSAvLyBSZW1vdmUgZXh0cmFuZW91cyB0cmFpbGluZyBkZWNpbWFsIHplcm9lcy5cbiAgICAucmVwbGFjZSgvKFxcLlxcZCs/KTArKD89ZXwkKS8sIFwiJDFcIikgLy8gUmVtb3ZlIHRyYWlsaW5nIGRvdC5cbiAgICAucmVwbGFjZSgvXFwuKD89ZXwkKS8sIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRNYXhDb250aW51b3VzQ291bnQoc3RyLCB0YXJnZXQpIHtcbiAgICBjb25zdCByZXN1bHRzID0gc3RyLm1hdGNoKG5ldyBSZWdFeHAoXCIoXCIuY29uY2F0KGVzY2FwZVN0cmluZ1JlZ2V4cCQyKHRhcmdldCksIFwiKStcIiksIFwiZ1wiKSk7XG5cbiAgICBpZiAocmVzdWx0cyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKChtYXhDb3VudCwgcmVzdWx0KSA9PiBNYXRoLm1heChtYXhDb3VudCwgcmVzdWx0Lmxlbmd0aCAvIHRhcmdldC5sZW5ndGgpLCAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1pbk5vdFByZXNlbnRDb250aW51b3VzQ291bnQoc3RyLCB0YXJnZXQpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gc3RyLm1hdGNoKG5ldyBSZWdFeHAoXCIoXCIuY29uY2F0KGVzY2FwZVN0cmluZ1JlZ2V4cCQyKHRhcmdldCksIFwiKStcIiksIFwiZ1wiKSk7XG5cbiAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgY291bnRQcmVzZW50ID0gbmV3IE1hcCgpO1xuICAgIGxldCBtYXggPSAwO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICBjb25zdCBjb3VudCA9IG1hdGNoLmxlbmd0aCAvIHRhcmdldC5sZW5ndGg7XG4gICAgICBjb3VudFByZXNlbnQuc2V0KGNvdW50LCB0cnVlKTtcblxuICAgICAgaWYgKGNvdW50ID4gbWF4KSB7XG4gICAgICAgIG1heCA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgIGlmICghY291bnRQcmVzZW50LmdldChpKSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF4ICsgMTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRTdHJpbmdXaWR0aCh0ZXh0KSB7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IC8vIHNob3J0Y3V0IHRvIGF2b2lkIG5lZWRsZXNzIHN0cmluZyBgUmVnRXhwYHMsIHJlcGxhY2VtZW50cywgYW5kIGFsbG9jYXRpb25zIHdpdGhpbiBgc3RyaW5nLXdpZHRoYFxuXG5cbiAgICBpZiAoIW5vdEFzY2lpUmVnZXgudGVzdCh0ZXh0KSkge1xuICAgICAgcmV0dXJuIHRleHQubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdXaWR0aF8xKHRleHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzSWdub3JlQ29tbWVudChwYXRoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICByZXR1cm4gaGFzTm9kZUlnbm9yZUNvbW1lbnQobm9kZSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNOb2RlSWdub3JlQ29tbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgKG5vZGUuY29tbWVudHMgJiYgbm9kZS5jb21tZW50cy5sZW5ndGggPiAwICYmIG5vZGUuY29tbWVudHMuc29tZShjb21tZW50ID0+IGlzTm9kZUlnbm9yZUNvbW1lbnQoY29tbWVudCkgJiYgIWNvbW1lbnQudW5pZ25vcmUpIHx8IG5vZGUucHJldHRpZXJJZ25vcmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlSWdub3JlQ29tbWVudChjb21tZW50KSB7XG4gICAgcmV0dXJuIGNvbW1lbnQudmFsdWUudHJpbSgpID09PSBcInByZXR0aWVyLWlnbm9yZVwiO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkQ29tbWVudEhlbHBlcihub2RlLCBjb21tZW50KSB7XG4gICAgY29uc3QgY29tbWVudHMgPSBub2RlLmNvbW1lbnRzIHx8IChub2RlLmNvbW1lbnRzID0gW10pO1xuICAgIGNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgY29tbWVudC5wcmludGVkID0gZmFsc2U7IC8vIEZvciBzb21lIHJlYXNvbiwgVHlwZVNjcmlwdCBwYXJzZXMgYC8vIHhgIGluc2lkZSBvZiBKU1hUZXh0IGFzIGEgY29tbWVudFxuICAgIC8vIFdlIGFscmVhZHkgXCJwcmludFwiIGl0IHZpYSB0aGUgcmF3IHRleHQsIHdlIGRvbid0IG5lZWQgdG8gcmUtcHJpbnQgaXQgYXMgYVxuICAgIC8vIGNvbW1lbnRcblxuICAgIGlmIChub2RlLnR5cGUgPT09IFwiSlNYVGV4dFwiKSB7XG4gICAgICBjb21tZW50LnByaW50ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZExlYWRpbmdDb21tZW50KG5vZGUsIGNvbW1lbnQpIHtcbiAgICBjb21tZW50LmxlYWRpbmcgPSB0cnVlO1xuICAgIGNvbW1lbnQudHJhaWxpbmcgPSBmYWxzZTtcbiAgICBhZGRDb21tZW50SGVscGVyKG5vZGUsIGNvbW1lbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkRGFuZ2xpbmdDb21tZW50KG5vZGUsIGNvbW1lbnQpIHtcbiAgICBjb21tZW50LmxlYWRpbmcgPSBmYWxzZTtcbiAgICBjb21tZW50LnRyYWlsaW5nID0gZmFsc2U7XG4gICAgYWRkQ29tbWVudEhlbHBlcihub2RlLCBjb21tZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFRyYWlsaW5nQ29tbWVudChub2RlLCBjb21tZW50KSB7XG4gICAgY29tbWVudC5sZWFkaW5nID0gZmFsc2U7XG4gICAgY29tbWVudC50cmFpbGluZyA9IHRydWU7XG4gICAgYWRkQ29tbWVudEhlbHBlcihub2RlLCBjb21tZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzV2l0aGluUGFyZW50QXJyYXlQcm9wZXJ0eShwYXRoLCBwcm9wZXJ0eU5hbWUpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuXG4gICAgaWYgKHBhcmVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmVudFtwcm9wZXJ0eU5hbWVdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHBhdGguZ2V0TmFtZSgpO1xuICAgIHJldHVybiBwYXJlbnRbcHJvcGVydHlOYW1lXVtrZXldID09PSBub2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVwbGFjZUVuZE9mTGluZVdpdGgodGV4dCwgcmVwbGFjZW1lbnQpIHtcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHRleHQuc3BsaXQoXCJcXG5cIikpIHtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcGFydHMucHVzaChyZXBsYWNlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHBhcnRzLnB1c2gocGFydCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzO1xuICB9XG5cbiAgdmFyIHV0aWwkMSA9IHtcbiAgICByZXBsYWNlRW5kT2ZMaW5lV2l0aCxcbiAgICBnZXRTdHJpbmdXaWR0aCxcbiAgICBnZXRNYXhDb250aW51b3VzQ291bnQsXG4gICAgZ2V0TWluTm90UHJlc2VudENvbnRpbnVvdXNDb3VudCxcbiAgICBnZXRQcmVjZWRlbmNlLFxuICAgIHNob3VsZEZsYXR0ZW4sXG4gICAgaXNCaXR3aXNlT3BlcmF0b3IsXG4gICAgZ2V0UGVudWx0aW1hdGUsXG4gICAgZ2V0TGFzdCxcbiAgICBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXhXaXRoU3RhcnRJbmRleCxcbiAgICBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXgsXG4gICAgZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlcixcbiAgICBza2lwLFxuICAgIHNraXBXaGl0ZXNwYWNlLFxuICAgIHNraXBTcGFjZXMsXG4gICAgc2tpcFRvTGluZUVuZCxcbiAgICBza2lwRXZlcnl0aGluZ0J1dE5ld0xpbmUsXG4gICAgc2tpcElubGluZUNvbW1lbnQsXG4gICAgc2tpcFRyYWlsaW5nQ29tbWVudCxcbiAgICBza2lwTmV3bGluZSxcbiAgICBpc05leHRMaW5lRW1wdHlBZnRlckluZGV4LFxuICAgIGlzTmV4dExpbmVFbXB0eSxcbiAgICBpc1ByZXZpb3VzTGluZUVtcHR5LFxuICAgIGhhc05ld2xpbmUsXG4gICAgaGFzTmV3bGluZUluUmFuZ2UsXG4gICAgaGFzU3BhY2VzLFxuICAgIHNldExvY1N0YXJ0LFxuICAgIHNldExvY0VuZCxcbiAgICBzdGFydHNXaXRoTm9Mb29rYWhlYWRUb2tlbixcbiAgICBnZXRBbGlnbm1lbnRTaXplLFxuICAgIGdldEluZGVudFNpemUsXG4gICAgZ2V0UHJlZmVycmVkUXVvdGUsXG4gICAgcHJpbnRTdHJpbmcsXG4gICAgcHJpbnROdW1iZXIsXG4gICAgaGFzSWdub3JlQ29tbWVudCxcbiAgICBoYXNOb2RlSWdub3JlQ29tbWVudCxcbiAgICBpc05vZGVJZ25vcmVDb21tZW50LFxuICAgIG1ha2VTdHJpbmcsXG4gICAgYWRkTGVhZGluZ0NvbW1lbnQsXG4gICAgYWRkRGFuZ2xpbmdDb21tZW50LFxuICAgIGFkZFRyYWlsaW5nQ29tbWVudCxcbiAgICBpc1dpdGhpblBhcmVudEFycmF5UHJvcGVydHlcbiAgfTtcblxuICBmdW5jdGlvbiBndWVzc0VuZE9mTGluZSh0ZXh0KSB7XG4gICAgY29uc3QgaW5kZXggPSB0ZXh0LmluZGV4T2YoXCJcXHJcIik7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRleHQuY2hhckF0KGluZGV4ICsgMSkgPT09IFwiXFxuXCIgPyBcImNybGZcIiA6IFwiY3JcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJsZlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydEVuZE9mTGluZVRvQ2hhcnModmFsdWUpIHtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlIFwiY3JcIjpcbiAgICAgICAgcmV0dXJuIFwiXFxyXCI7XG5cbiAgICAgIGNhc2UgXCJjcmxmXCI6XG4gICAgICAgIHJldHVybiBcIlxcclxcblwiO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJcXG5cIjtcbiAgICB9XG4gIH1cblxuICB2YXIgZW5kT2ZMaW5lID0ge1xuICAgIGd1ZXNzRW5kT2ZMaW5lLFxuICAgIGNvbnZlcnRFbmRPZkxpbmVUb0NoYXJzXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIGdldFN0cmluZ1dpZHRoOiBnZXRTdHJpbmdXaWR0aCQxXG4gIH0gPSB1dGlsJDE7XG4gIGNvbnN0IHtcbiAgICBjb252ZXJ0RW5kT2ZMaW5lVG9DaGFyczogY29udmVydEVuZE9mTGluZVRvQ2hhcnMkMVxuICB9ID0gZW5kT2ZMaW5lO1xuICBjb25zdCB7XG4gICAgY29uY2F0OiBjb25jYXQkMSxcbiAgICBmaWxsOiBmaWxsJDEsXG4gICAgY3Vyc29yOiBjdXJzb3IkMVxuICB9ID0gZG9jQnVpbGRlcnM7XG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN5bWJvbCwgdHlwZW9mIE1PREVfQlJFQUsgfCB0eXBlb2YgTU9ERV9GTEFUPn0gKi9cblxuICBsZXQgZ3JvdXBNb2RlTWFwO1xuICBjb25zdCBNT0RFX0JSRUFLID0gMTtcbiAgY29uc3QgTU9ERV9GTEFUID0gMjtcblxuICBmdW5jdGlvbiByb290SW5kZW50KCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogXCJcIixcbiAgICAgIGxlbmd0aDogMCxcbiAgICAgIHF1ZXVlOiBbXVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlSW5kZW50KGluZCwgb3B0aW9ucykge1xuICAgIHJldHVybiBnZW5lcmF0ZUluZChpbmQsIHtcbiAgICAgIHR5cGU6IFwiaW5kZW50XCJcbiAgICB9LCBvcHRpb25zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VBbGlnbihpbmQsIG4sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbiA9PT0gLUluZmluaXR5ID8gaW5kLnJvb3QgfHwgcm9vdEluZGVudCgpIDogbiA8IDAgPyBnZW5lcmF0ZUluZChpbmQsIHtcbiAgICAgIHR5cGU6IFwiZGVkZW50XCJcbiAgICB9LCBvcHRpb25zKSA6ICFuID8gaW5kIDogbi50eXBlID09PSBcInJvb3RcIiA/IE9iamVjdC5hc3NpZ24oe30sIGluZCwge1xuICAgICAgcm9vdDogaW5kXG4gICAgfSkgOiB0eXBlb2YgbiA9PT0gXCJzdHJpbmdcIiA/IGdlbmVyYXRlSW5kKGluZCwge1xuICAgICAgdHlwZTogXCJzdHJpbmdBbGlnblwiLFxuICAgICAgblxuICAgIH0sIG9wdGlvbnMpIDogZ2VuZXJhdGVJbmQoaW5kLCB7XG4gICAgICB0eXBlOiBcIm51bWJlckFsaWduXCIsXG4gICAgICBuXG4gICAgfSwgb3B0aW9ucyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZUluZChpbmQsIG5ld1BhcnQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBxdWV1ZSA9IG5ld1BhcnQudHlwZSA9PT0gXCJkZWRlbnRcIiA/IGluZC5xdWV1ZS5zbGljZSgwLCAtMSkgOiBpbmQucXVldWUuY29uY2F0KG5ld1BhcnQpO1xuICAgIGxldCB2YWx1ZSA9IFwiXCI7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IGxhc3RUYWJzID0gMDtcbiAgICBsZXQgbGFzdFNwYWNlcyA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcXVldWUpIHtcbiAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJpbmRlbnRcIjpcbiAgICAgICAgICBmbHVzaCgpO1xuXG4gICAgICAgICAgaWYgKG9wdGlvbnMudXNlVGFicykge1xuICAgICAgICAgICAgYWRkVGFicygxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkU3BhY2VzKG9wdGlvbnMudGFiV2lkdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJzdHJpbmdBbGlnblwiOlxuICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgdmFsdWUgKz0gcGFydC5uO1xuICAgICAgICAgIGxlbmd0aCArPSBwYXJ0Lm4ubGVuZ3RoO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJudW1iZXJBbGlnblwiOlxuICAgICAgICAgIGxhc3RUYWJzICs9IDE7XG4gICAgICAgICAgbGFzdFNwYWNlcyArPSBwYXJ0Lm47XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgdHlwZSAnXCIuY29uY2F0KHBhcnQudHlwZSwgXCInXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbHVzaFNwYWNlcygpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbmQsIHtcbiAgICAgIHZhbHVlLFxuICAgICAgbGVuZ3RoLFxuICAgICAgcXVldWVcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGFkZFRhYnMoY291bnQpIHtcbiAgICAgIHZhbHVlICs9IFwiXFx0XCIucmVwZWF0KGNvdW50KTtcbiAgICAgIGxlbmd0aCArPSBvcHRpb25zLnRhYldpZHRoICogY291bnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3BhY2VzKGNvdW50KSB7XG4gICAgICB2YWx1ZSArPSBcIiBcIi5yZXBlYXQoY291bnQpO1xuICAgICAgbGVuZ3RoICs9IGNvdW50O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgaWYgKG9wdGlvbnMudXNlVGFicykge1xuICAgICAgICBmbHVzaFRhYnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsdXNoU3BhY2VzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmx1c2hUYWJzKCkge1xuICAgICAgaWYgKGxhc3RUYWJzID4gMCkge1xuICAgICAgICBhZGRUYWJzKGxhc3RUYWJzKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRMYXN0KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmx1c2hTcGFjZXMoKSB7XG4gICAgICBpZiAobGFzdFNwYWNlcyA+IDApIHtcbiAgICAgICAgYWRkU3BhY2VzKGxhc3RTcGFjZXMpO1xuICAgICAgfVxuXG4gICAgICByZXNldExhc3QoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNldExhc3QoKSB7XG4gICAgICBsYXN0VGFicyA9IDA7XG4gICAgICBsYXN0U3BhY2VzID0gMDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cmltJDEob3V0KSB7XG4gICAgaWYgKG91dC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGxldCB0cmltQ291bnQgPSAwOyAvLyBUcmltIHdoaXRlc3BhY2UgYXQgdGhlIGVuZCBvZiBsaW5lXG5cbiAgICB3aGlsZSAob3V0Lmxlbmd0aCA+IDAgJiYgdHlwZW9mIG91dFtvdXQubGVuZ3RoIC0gMV0gPT09IFwic3RyaW5nXCIgJiYgb3V0W291dC5sZW5ndGggLSAxXS5tYXRjaCgvXlsgXFx0XSokLykpIHtcbiAgICAgIHRyaW1Db3VudCArPSBvdXQucG9wKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChvdXQubGVuZ3RoICYmIHR5cGVvZiBvdXRbb3V0Lmxlbmd0aCAtIDFdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gb3V0W291dC5sZW5ndGggLSAxXS5yZXBsYWNlKC9bIFxcdF0qJC8sIFwiXCIpO1xuICAgICAgdHJpbUNvdW50ICs9IG91dFtvdXQubGVuZ3RoIC0gMV0ubGVuZ3RoIC0gdHJpbW1lZC5sZW5ndGg7XG4gICAgICBvdXRbb3V0Lmxlbmd0aCAtIDFdID0gdHJpbW1lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJpbUNvdW50O1xuICB9XG5cbiAgZnVuY3Rpb24gZml0cyhuZXh0LCByZXN0Q29tbWFuZHMsIHdpZHRoLCBvcHRpb25zLCBtdXN0QmVGbGF0KSB7XG4gICAgbGV0IHJlc3RJZHggPSByZXN0Q29tbWFuZHMubGVuZ3RoO1xuICAgIGNvbnN0IGNtZHMgPSBbbmV4dF07IC8vIGBvdXRgIGlzIG9ubHkgdXNlZCBmb3Igd2lkdGggY291bnRpbmcgYmVjYXVzZSBgdHJpbWAgcmVxdWlyZXMgdG8gbG9va1xuICAgIC8vIGJhY2t3YXJkcyBmb3Igc3BhY2UgY2hhcmFjdGVycy5cblxuICAgIGNvbnN0IG91dCA9IFtdO1xuXG4gICAgd2hpbGUgKHdpZHRoID49IDApIHtcbiAgICAgIGlmIChjbWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAocmVzdElkeCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY21kcy5wdXNoKHJlc3RDb21tYW5kc1tyZXN0SWR4IC0gMV0pO1xuICAgICAgICByZXN0SWR4LS07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbaW5kLCBtb2RlLCBkb2NdID0gY21kcy5wb3AoKTtcblxuICAgICAgaWYgKHR5cGVvZiBkb2MgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgb3V0LnB1c2goZG9jKTtcbiAgICAgICAgd2lkdGggLT0gZ2V0U3RyaW5nV2lkdGgkMShkb2MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoIChkb2MudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJjb25jYXRcIjpcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBkb2MucGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgY21kcy5wdXNoKFtpbmQsIG1vZGUsIGRvYy5wYXJ0c1tpXV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJpbmRlbnRcIjpcbiAgICAgICAgICAgIGNtZHMucHVzaChbbWFrZUluZGVudChpbmQsIG9wdGlvbnMpLCBtb2RlLCBkb2MuY29udGVudHNdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcImFsaWduXCI6XG4gICAgICAgICAgICBjbWRzLnB1c2goW21ha2VBbGlnbihpbmQsIGRvYy5uLCBvcHRpb25zKSwgbW9kZSwgZG9jLmNvbnRlbnRzXSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJ0cmltXCI6XG4gICAgICAgICAgICB3aWR0aCArPSB0cmltJDEob3V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcImdyb3VwXCI6XG4gICAgICAgICAgICBpZiAobXVzdEJlRmxhdCAmJiBkb2MuYnJlYWspIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbWRzLnB1c2goW2luZCwgZG9jLmJyZWFrID8gTU9ERV9CUkVBSyA6IG1vZGUsIGRvYy5jb250ZW50c10pO1xuXG4gICAgICAgICAgICBpZiAoZG9jLmlkKSB7XG4gICAgICAgICAgICAgIGdyb3VwTW9kZU1hcFtkb2MuaWRdID0gY21kc1tjbWRzLmxlbmd0aCAtIDFdWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJmaWxsXCI6XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZG9jLnBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgIGNtZHMucHVzaChbaW5kLCBtb2RlLCBkb2MucGFydHNbaV1dKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiaWYtYnJlYWtcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgZ3JvdXBNb2RlID0gZG9jLmdyb3VwSWQgPyBncm91cE1vZGVNYXBbZG9jLmdyb3VwSWRdIDogbW9kZTtcblxuICAgICAgICAgICAgICBpZiAoZ3JvdXBNb2RlID09PSBNT0RFX0JSRUFLKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvYy5icmVha0NvbnRlbnRzKSB7XG4gICAgICAgICAgICAgICAgICBjbWRzLnB1c2goW2luZCwgbW9kZSwgZG9jLmJyZWFrQ29udGVudHNdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoZ3JvdXBNb2RlID09PSBNT0RFX0ZMQVQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZG9jLmZsYXRDb250ZW50cykge1xuICAgICAgICAgICAgICAgICAgY21kcy5wdXNoKFtpbmQsIG1vZGUsIGRvYy5mbGF0Q29udGVudHNdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgICAgICAgY2FzZSBNT0RFX0ZMQVQ6XG4gICAgICAgICAgICAgICAgaWYgKCFkb2MuaGFyZCkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFkb2Muc29mdCkge1xuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoIC09IDE7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgIGNhc2UgTU9ERV9CUkVBSzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludERvY1RvU3RyaW5nKGRvYywgb3B0aW9ucykge1xuICAgIGdyb3VwTW9kZU1hcCA9IHt9O1xuICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy5wcmludFdpZHRoO1xuICAgIGNvbnN0IG5ld0xpbmUgPSBjb252ZXJ0RW5kT2ZMaW5lVG9DaGFycyQxKG9wdGlvbnMuZW5kT2ZMaW5lKTtcbiAgICBsZXQgcG9zID0gMDsgLy8gY21kcyBpcyBiYXNpY2FsbHkgYSBzdGFjay4gV2UndmUgdHVybmVkIGEgcmVjdXJzaXZlIGNhbGwgaW50byBhXG4gICAgLy8gd2hpbGUgbG9vcCB3aGljaCBpcyBtdWNoIGZhc3Rlci4gVGhlIHdoaWxlIGxvb3AgYmVsb3cgYWRkcyBuZXdcbiAgICAvLyBjbWRzIHRvIHRoZSBhcnJheSBpbnN0ZWFkIG9mIHJlY3Vyc2l2ZWx5IGNhbGxpbmcgYHByaW50YC5cblxuICAgIGNvbnN0IGNtZHMgPSBbW3Jvb3RJbmRlbnQoKSwgTU9ERV9CUkVBSywgZG9jXV07XG4gICAgY29uc3Qgb3V0ID0gW107XG4gICAgbGV0IHNob3VsZFJlbWVhc3VyZSA9IGZhbHNlO1xuICAgIGxldCBsaW5lU3VmZml4ID0gW107XG5cbiAgICB3aGlsZSAoY21kcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IFtpbmQsIG1vZGUsIGRvY10gPSBjbWRzLnBvcCgpO1xuXG4gICAgICBpZiAodHlwZW9mIGRvYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSBuZXdMaW5lICE9PSBcIlxcblwiICYmIGRvYy5pbmNsdWRlcyhcIlxcblwiKSA/IGRvYy5yZXBsYWNlKC9cXG4vZywgbmV3TGluZSkgOiBkb2M7XG4gICAgICAgIG91dC5wdXNoKGZvcm1hdHRlZCk7XG4gICAgICAgIHBvcyArPSBnZXRTdHJpbmdXaWR0aCQxKGZvcm1hdHRlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKGRvYy50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImN1cnNvclwiOlxuICAgICAgICAgICAgb3V0LnB1c2goY3Vyc29yJDEucGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiY29uY2F0XCI6XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZG9jLnBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgIGNtZHMucHVzaChbaW5kLCBtb2RlLCBkb2MucGFydHNbaV1dKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiaW5kZW50XCI6XG4gICAgICAgICAgICBjbWRzLnB1c2goW21ha2VJbmRlbnQoaW5kLCBvcHRpb25zKSwgbW9kZSwgZG9jLmNvbnRlbnRzXSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJhbGlnblwiOlxuICAgICAgICAgICAgY21kcy5wdXNoKFttYWtlQWxpZ24oaW5kLCBkb2Mubiwgb3B0aW9ucyksIG1vZGUsIGRvYy5jb250ZW50c10pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwidHJpbVwiOlxuICAgICAgICAgICAgcG9zIC09IHRyaW0kMShvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiZ3JvdXBcIjpcbiAgICAgICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgICBjYXNlIE1PREVfRkxBVDpcbiAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFJlbWVhc3VyZSkge1xuICAgICAgICAgICAgICAgICAgY21kcy5wdXNoKFtpbmQsIGRvYy5icmVhayA/IE1PREVfQlJFQUsgOiBNT0RFX0ZMQVQsIGRvYy5jb250ZW50c10pO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoXG5cbiAgICAgICAgICAgICAgY2FzZSBNT0RFX0JSRUFLOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHNob3VsZFJlbWVhc3VyZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFtpbmQsIE1PREVfRkxBVCwgZG9jLmNvbnRlbnRzXTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbSA9IHdpZHRoIC0gcG9zO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoIWRvYy5icmVhayAmJiBmaXRzKG5leHQsIGNtZHMsIHJlbSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICAgICAgY21kcy5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhwYW5kZWQgc3RhdGVzIGFyZSBhIHJhcmUgY2FzZSB3aGVyZSBhIGRvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBtYW51YWxseSBwcm92aWRlIG11bHRpcGxlIHJlcHJlc2VudGF0aW9ucyBvZlxuICAgICAgICAgICAgICAgICAgICAvLyBpdHNlbGYuIEl0IHByb3ZpZGVzIGFuIGFycmF5IG9mIGRvY3VtZW50c1xuICAgICAgICAgICAgICAgICAgICAvLyBnb2luZyBmcm9tIHRoZSBsZWFzdCBleHBhbmRlZCAobW9zdCBmbGF0dGVuZWQpXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZpcnN0IHRvIHRoZSBtb3N0IGV4cGFuZGVkLiBJZiBhXG4gICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwIGhhcyB0aGVzZSwgd2UgbmVlZCB0byBtYW51YWxseSBnbyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHN0YXRlcyBhbmQgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgZml0cy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvYy5leHBhbmRlZFN0YXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vc3RFeHBhbmRlZCA9IGRvYy5leHBhbmRlZFN0YXRlc1tkb2MuZXhwYW5kZWRTdGF0ZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jLmJyZWFrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWRzLnB1c2goW2luZCwgTU9ERV9CUkVBSywgbW9zdEV4cGFuZGVkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBkb2MuZXhwYW5kZWRTdGF0ZXMubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IGRvYy5leHBhbmRlZFN0YXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzLnB1c2goW2luZCwgTU9ERV9CUkVBSywgbW9zdEV4cGFuZGVkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBkb2MuZXhwYW5kZWRTdGF0ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21kID0gW2luZCwgTU9ERV9GTEFULCBzdGF0ZV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml0cyhjbWQsIGNtZHMsIHJlbSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHMucHVzaChjbWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGNtZHMucHVzaChbaW5kLCBNT0RFX0JSRUFLLCBkb2MuY29udGVudHNdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkb2MuaWQpIHtcbiAgICAgICAgICAgICAgZ3JvdXBNb2RlTWFwW2RvYy5pZF0gPSBjbWRzW2NtZHMubGVuZ3RoIC0gMV1bMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIC8vIEZpbGxzIGVhY2ggbGluZSB3aXRoIGFzIG11Y2ggY29kZSBhcyBwb3NzaWJsZSBiZWZvcmUgbW92aW5nIHRvIGEgbmV3XG4gICAgICAgICAgLy8gbGluZSB3aXRoIHRoZSBzYW1lIGluZGVudGF0aW9uLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gRXhwZWN0cyBkb2MucGFydHMgdG8gYmUgYW4gYXJyYXkgb2YgYWx0ZXJuYXRpbmcgY29udGVudCBhbmRcbiAgICAgICAgICAvLyB3aGl0ZXNwYWNlLiBUaGUgd2hpdGVzcGFjZSBjb250YWlucyB0aGUgbGluZWJyZWFrcy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEZvciBleGFtcGxlOlxuICAgICAgICAgIC8vICAgW1wiSVwiLCBsaW5lLCBcImxvdmVcIiwgbGluZSwgXCJtb25rZXlzXCJdXG4gICAgICAgICAgLy8gb3JcbiAgICAgICAgICAvLyAgIFt7IHR5cGU6IGdyb3VwLCAuLi4gfSwgc29mdGxpbmUsIHsgdHlwZTogZ3JvdXAsIC4uLiB9XVxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSXQgdXNlcyB0aGlzIHBhcnRzIHN0cnVjdHVyZSB0byBoYW5kbGUgdGhyZWUgbWFpbiBsYXlvdXQgY2FzZXM6XG4gICAgICAgICAgLy8gKiBUaGUgZmlyc3QgdHdvIGNvbnRlbnQgaXRlbXMgZml0IG9uIHRoZSBzYW1lIGxpbmUgd2l0aG91dFxuICAgICAgICAgIC8vICAgYnJlYWtpbmdcbiAgICAgICAgICAvLyAgIC0+IG91dHB1dCB0aGUgZmlyc3QgY29udGVudCBpdGVtIGFuZCB0aGUgd2hpdGVzcGFjZSBcImZsYXRcIi5cbiAgICAgICAgICAvLyAqIE9ubHkgdGhlIGZpcnN0IGNvbnRlbnQgaXRlbSBmaXRzIG9uIHRoZSBsaW5lIHdpdGhvdXQgYnJlYWtpbmdcbiAgICAgICAgICAvLyAgIC0+IG91dHB1dCB0aGUgZmlyc3QgY29udGVudCBpdGVtIFwiZmxhdFwiIGFuZCB0aGUgd2hpdGVzcGFjZSB3aXRoXG4gICAgICAgICAgLy8gICBcImJyZWFrXCIuXG4gICAgICAgICAgLy8gKiBOZWl0aGVyIGNvbnRlbnQgaXRlbSBmaXRzIG9uIHRoZSBsaW5lIHdpdGhvdXQgYnJlYWtpbmdcbiAgICAgICAgICAvLyAgIC0+IG91dHB1dCB0aGUgZmlyc3QgY29udGVudCBpdGVtIGFuZCB0aGUgd2hpdGVzcGFjZSB3aXRoIFwiYnJlYWtcIi5cblxuICAgICAgICAgIGNhc2UgXCJmaWxsXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbSA9IHdpZHRoIC0gcG9zO1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgcGFydHNcbiAgICAgICAgICAgICAgfSA9IGRvYztcblxuICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBbY29udGVudCwgd2hpdGVzcGFjZV0gPSBwYXJ0cztcbiAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRDbWQgPSBbaW5kLCBNT0RFX0ZMQVQsIGNvbnRlbnRdO1xuICAgICAgICAgICAgICBjb25zdCBjb250ZW50QnJlYWtDbWQgPSBbaW5kLCBNT0RFX0JSRUFLLCBjb250ZW50XTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGVudEZpdHMgPSBmaXRzKGNvbnRlbnRGbGF0Q21kLCBbXSwgcmVtLCBvcHRpb25zLCB0cnVlKTtcblxuICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRGaXRzKSB7XG4gICAgICAgICAgICAgICAgICBjbWRzLnB1c2goY29udGVudEZsYXRDbWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjbWRzLnB1c2goY29udGVudEJyZWFrQ21kKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHdoaXRlc3BhY2VGbGF0Q21kID0gW2luZCwgTU9ERV9GTEFULCB3aGl0ZXNwYWNlXTtcbiAgICAgICAgICAgICAgY29uc3Qgd2hpdGVzcGFjZUJyZWFrQ21kID0gW2luZCwgTU9ERV9CUkVBSywgd2hpdGVzcGFjZV07XG5cbiAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50Rml0cykge1xuICAgICAgICAgICAgICAgICAgY21kcy5wdXNoKHdoaXRlc3BhY2VGbGF0Q21kKTtcbiAgICAgICAgICAgICAgICAgIGNtZHMucHVzaChjb250ZW50RmxhdENtZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNtZHMucHVzaCh3aGl0ZXNwYWNlQnJlYWtDbWQpO1xuICAgICAgICAgICAgICAgICAgY21kcy5wdXNoKGNvbnRlbnRCcmVha0NtZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCB3ZSd2ZSBoYW5kbGVkIHRoZSBmaXJzdCBwYWlyIChjb250ZXh0LCBzZXBhcmF0b3IpXG4gICAgICAgICAgICAgIC8vIGFuZCB3aWxsIGNyZWF0ZSBhIG5ldyBmaWxsIGRvYyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNvbnRlbnQuXG4gICAgICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGRuJ3QgbXV0YXRlIHRoZSBhcnJheSBoZXJlIGJ1dCBjb3B5aW5nIGFsbCB0aGVcbiAgICAgICAgICAgICAgLy8gZWxlbWVudHMgdG8gYSBuZXcgYXJyYXkgd291bGQgbWFrZSB0aGlzIGFsZ29yaXRobSBxdWFkcmF0aWMsXG4gICAgICAgICAgICAgIC8vIHdoaWNoIGlzIHVudXNhYmxlIGZvciBsYXJnZSBhcnJheXMgKGUuZy4gbGFyZ2UgdGV4dHMgaW4gSlNYKS5cblxuXG4gICAgICAgICAgICAgIHBhcnRzLnNwbGljZSgwLCAyKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nQ21kID0gW2luZCwgbW9kZSwgZmlsbCQxKHBhcnRzKV07XG4gICAgICAgICAgICAgIGNvbnN0IHNlY29uZENvbnRlbnQgPSBwYXJ0c1swXTtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3RBbmRTZWNvbmRDb250ZW50RmxhdENtZCA9IFtpbmQsIE1PREVfRkxBVCwgY29uY2F0JDEoW2NvbnRlbnQsIHdoaXRlc3BhY2UsIHNlY29uZENvbnRlbnRdKV07XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0QW5kU2Vjb25kQ29udGVudEZpdHMgPSBmaXRzKGZpcnN0QW5kU2Vjb25kQ29udGVudEZsYXRDbWQsIFtdLCByZW0sIG9wdGlvbnMsIHRydWUpO1xuXG4gICAgICAgICAgICAgIGlmIChmaXJzdEFuZFNlY29uZENvbnRlbnRGaXRzKSB7XG4gICAgICAgICAgICAgICAgY21kcy5wdXNoKHJlbWFpbmluZ0NtZCk7XG4gICAgICAgICAgICAgICAgY21kcy5wdXNoKHdoaXRlc3BhY2VGbGF0Q21kKTtcbiAgICAgICAgICAgICAgICBjbWRzLnB1c2goY29udGVudEZsYXRDbWQpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRGaXRzKSB7XG4gICAgICAgICAgICAgICAgY21kcy5wdXNoKHJlbWFpbmluZ0NtZCk7XG4gICAgICAgICAgICAgICAgY21kcy5wdXNoKHdoaXRlc3BhY2VCcmVha0NtZCk7XG4gICAgICAgICAgICAgICAgY21kcy5wdXNoKGNvbnRlbnRGbGF0Q21kKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbWRzLnB1c2gocmVtYWluaW5nQ21kKTtcbiAgICAgICAgICAgICAgICBjbWRzLnB1c2god2hpdGVzcGFjZUJyZWFrQ21kKTtcbiAgICAgICAgICAgICAgICBjbWRzLnB1c2goY29udGVudEJyZWFrQ21kKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBcImlmLWJyZWFrXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IGdyb3VwTW9kZSA9IGRvYy5ncm91cElkID8gZ3JvdXBNb2RlTWFwW2RvYy5ncm91cElkXSA6IG1vZGU7XG5cbiAgICAgICAgICAgICAgaWYgKGdyb3VwTW9kZSA9PT0gTU9ERV9CUkVBSykge1xuICAgICAgICAgICAgICAgIGlmIChkb2MuYnJlYWtDb250ZW50cykge1xuICAgICAgICAgICAgICAgICAgY21kcy5wdXNoKFtpbmQsIG1vZGUsIGRvYy5icmVha0NvbnRlbnRzXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGdyb3VwTW9kZSA9PT0gTU9ERV9GTEFUKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvYy5mbGF0Q29udGVudHMpIHtcbiAgICAgICAgICAgICAgICAgIGNtZHMucHVzaChbaW5kLCBtb2RlLCBkb2MuZmxhdENvbnRlbnRzXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlIFwibGluZS1zdWZmaXhcIjpcbiAgICAgICAgICAgIGxpbmVTdWZmaXgucHVzaChbaW5kLCBtb2RlLCBkb2MuY29udGVudHNdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcImxpbmUtc3VmZml4LWJvdW5kYXJ5XCI6XG4gICAgICAgICAgICBpZiAobGluZVN1ZmZpeC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNtZHMucHVzaChbaW5kLCBtb2RlLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJsaW5lXCIsXG4gICAgICAgICAgICAgICAgaGFyZDogdHJ1ZVxuICAgICAgICAgICAgICB9XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgICBjYXNlIE1PREVfRkxBVDpcbiAgICAgICAgICAgICAgICBpZiAoIWRvYy5oYXJkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWRvYy5zb2Z0KSB7XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zICs9IDE7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGlzIGxpbmUgd2FzIGZvcmNlZCBpbnRvIHRoZSBvdXRwdXQgZXZlbiBpZiB3ZVxuICAgICAgICAgICAgICAgICAgLy8gd2VyZSBpbiBmbGF0dGVuZWQgbW9kZSwgc28gd2UgbmVlZCB0byB0ZWxsIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAvLyBncm91cCB0aGF0IG5vIG1hdHRlciB3aGF0LCBpdCBuZWVkcyB0byByZW1lYXN1cmVcbiAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHByZXZpb3VzIG1lYXN1cmVtZW50IGRpZG4ndCBhY2N1cmF0ZWx5XG4gICAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiAodGhpcyBpcyBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAgIC8vIGZvciBuZXN0ZWQgZ3JvdXBzKVxuICAgICAgICAgICAgICAgICAgc2hvdWxkUmVtZWFzdXJlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2hcblxuICAgICAgICAgICAgICBjYXNlIE1PREVfQlJFQUs6XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVTdWZmaXgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBjbWRzLnB1c2goW2luZCwgbW9kZSwgZG9jXSk7XG4gICAgICAgICAgICAgICAgICBjbWRzLnB1c2goLi4ubGluZVN1ZmZpeC5yZXZlcnNlKCkpO1xuICAgICAgICAgICAgICAgICAgbGluZVN1ZmZpeCA9IFtdO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRvYy5saXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaW5kLnJvb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2gobmV3TGluZSwgaW5kLnJvb3QudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBwb3MgPSBpbmQucm9vdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChuZXdMaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcG9zIC09IHRyaW0kMShvdXQpO1xuICAgICAgICAgICAgICAgICAgb3V0LnB1c2gobmV3TGluZSArIGluZC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICBwb3MgPSBpbmQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvclBsYWNlaG9sZGVySW5kZXggPSBvdXQuaW5kZXhPZihjdXJzb3IkMS5wbGFjZWhvbGRlcik7XG5cbiAgICBpZiAoY3Vyc29yUGxhY2Vob2xkZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IG90aGVyQ3Vyc29yUGxhY2Vob2xkZXJJbmRleCA9IG91dC5pbmRleE9mKGN1cnNvciQxLnBsYWNlaG9sZGVyLCBjdXJzb3JQbGFjZWhvbGRlckluZGV4ICsgMSk7XG4gICAgICBjb25zdCBiZWZvcmVDdXJzb3IgPSBvdXQuc2xpY2UoMCwgY3Vyc29yUGxhY2Vob2xkZXJJbmRleCkuam9pbihcIlwiKTtcbiAgICAgIGNvbnN0IGFyb3VuZEN1cnNvciA9IG91dC5zbGljZShjdXJzb3JQbGFjZWhvbGRlckluZGV4ICsgMSwgb3RoZXJDdXJzb3JQbGFjZWhvbGRlckluZGV4KS5qb2luKFwiXCIpO1xuICAgICAgY29uc3QgYWZ0ZXJDdXJzb3IgPSBvdXQuc2xpY2Uob3RoZXJDdXJzb3JQbGFjZWhvbGRlckluZGV4ICsgMSkuam9pbihcIlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdHRlZDogYmVmb3JlQ3Vyc29yICsgYXJvdW5kQ3Vyc29yICsgYWZ0ZXJDdXJzb3IsXG4gICAgICAgIGN1cnNvck5vZGVTdGFydDogYmVmb3JlQ3Vyc29yLmxlbmd0aCxcbiAgICAgICAgY3Vyc29yTm9kZVRleHQ6IGFyb3VuZEN1cnNvclxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZm9ybWF0dGVkOiBvdXQuam9pbihcIlwiKVxuICAgIH07XG4gIH1cblxuICB2YXIgZG9jUHJpbnRlciA9IHtcbiAgICBwcmludERvY1RvU3RyaW5nXG4gIH07XG5cbiAgY29uc3QgdHJhdmVyc2VEb2NPbkV4aXRTdGFja01hcmtlciA9IHt9O1xuXG4gIGZ1bmN0aW9uIHRyYXZlcnNlRG9jKGRvYywgb25FbnRlciwgb25FeGl0LCBzaG91bGRUcmF2ZXJzZUNvbmRpdGlvbmFsR3JvdXBzKSB7XG4gICAgY29uc3QgZG9jc1N0YWNrID0gW2RvY107XG5cbiAgICB3aGlsZSAoZG9jc1N0YWNrLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3QgZG9jID0gZG9jc1N0YWNrLnBvcCgpO1xuXG4gICAgICBpZiAoZG9jID09PSB0cmF2ZXJzZURvY09uRXhpdFN0YWNrTWFya2VyKSB7XG4gICAgICAgIG9uRXhpdChkb2NzU3RhY2sucG9wKCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFJlY3Vyc2UgPSB0cnVlO1xuXG4gICAgICBpZiAob25FbnRlcikge1xuICAgICAgICBpZiAob25FbnRlcihkb2MpID09PSBmYWxzZSkge1xuICAgICAgICAgIHNob3VsZFJlY3Vyc2UgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob25FeGl0KSB7XG4gICAgICAgIGRvY3NTdGFjay5wdXNoKGRvYyk7XG4gICAgICAgIGRvY3NTdGFjay5wdXNoKHRyYXZlcnNlRG9jT25FeGl0U3RhY2tNYXJrZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVjdXJzZSkge1xuICAgICAgICAvLyBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXJ0cyB0byBwcm9jZXNzLFxuICAgICAgICAvLyB0aGUgcGFydHMgbmVlZCB0byBiZSBwdXNoZWQgb250byB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcixcbiAgICAgICAgLy8gc28gdGhhdCB0aGV5IGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yaWdpbmFsIG9yZGVyXG4gICAgICAgIC8vIHdoZW4gdGhlIHN0YWNrIGlzIHBvcHBlZC5cbiAgICAgICAgaWYgKGRvYy50eXBlID09PSBcImNvbmNhdFwiIHx8IGRvYy50eXBlID09PSBcImZpbGxcIikge1xuICAgICAgICAgIGZvciAobGV0IGljID0gZG9jLnBhcnRzLmxlbmd0aCwgaSA9IGljIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGRvY3NTdGFjay5wdXNoKGRvYy5wYXJ0c1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRvYy50eXBlID09PSBcImlmLWJyZWFrXCIpIHtcbiAgICAgICAgICBpZiAoZG9jLmZsYXRDb250ZW50cykge1xuICAgICAgICAgICAgZG9jc1N0YWNrLnB1c2goZG9jLmZsYXRDb250ZW50cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRvYy5icmVha0NvbnRlbnRzKSB7XG4gICAgICAgICAgICBkb2NzU3RhY2sucHVzaChkb2MuYnJlYWtDb250ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRvYy50eXBlID09PSBcImdyb3VwXCIgJiYgZG9jLmV4cGFuZGVkU3RhdGVzKSB7XG4gICAgICAgICAgaWYgKHNob3VsZFRyYXZlcnNlQ29uZGl0aW9uYWxHcm91cHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGljID0gZG9jLmV4cGFuZGVkU3RhdGVzLmxlbmd0aCwgaSA9IGljIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgZG9jc1N0YWNrLnB1c2goZG9jLmV4cGFuZGVkU3RhdGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jc1N0YWNrLnB1c2goZG9jLmNvbnRlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jLmNvbnRlbnRzKSB7XG4gICAgICAgICAgZG9jc1N0YWNrLnB1c2goZG9jLmNvbnRlbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1hcERvYyhkb2MsIGNiKSB7XG4gICAgaWYgKGRvYy50eXBlID09PSBcImNvbmNhdFwiIHx8IGRvYy50eXBlID09PSBcImZpbGxcIikge1xuICAgICAgY29uc3QgcGFydHMgPSBkb2MucGFydHMubWFwKHBhcnQgPT4gbWFwRG9jKHBhcnQsIGNiKSk7XG4gICAgICByZXR1cm4gY2IoT2JqZWN0LmFzc2lnbih7fSwgZG9jLCB7XG4gICAgICAgIHBhcnRzXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIGlmIChkb2MudHlwZSA9PT0gXCJpZi1icmVha1wiKSB7XG4gICAgICBjb25zdCBicmVha0NvbnRlbnRzID0gZG9jLmJyZWFrQ29udGVudHMgJiYgbWFwRG9jKGRvYy5icmVha0NvbnRlbnRzLCBjYik7XG4gICAgICBjb25zdCBmbGF0Q29udGVudHMgPSBkb2MuZmxhdENvbnRlbnRzICYmIG1hcERvYyhkb2MuZmxhdENvbnRlbnRzLCBjYik7XG4gICAgICByZXR1cm4gY2IoT2JqZWN0LmFzc2lnbih7fSwgZG9jLCB7XG4gICAgICAgIGJyZWFrQ29udGVudHMsXG4gICAgICAgIGZsYXRDb250ZW50c1xuICAgICAgfSkpO1xuICAgIH0gZWxzZSBpZiAoZG9jLmNvbnRlbnRzKSB7XG4gICAgICBjb25zdCBjb250ZW50cyA9IG1hcERvYyhkb2MuY29udGVudHMsIGNiKTtcbiAgICAgIHJldHVybiBjYihPYmplY3QuYXNzaWduKHt9LCBkb2MsIHtcbiAgICAgICAgY29udGVudHNcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2IoZG9jKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRJbkRvYyhkb2MsIGZuLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBsZXQgcmVzdWx0ID0gZGVmYXVsdFZhbHVlO1xuICAgIGxldCBoYXNTdG9wcGVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBmaW5kSW5Eb2NPbkVudGVyRm4oZG9jKSB7XG4gICAgICBjb25zdCBtYXliZVJlc3VsdCA9IGZuKGRvYyk7XG5cbiAgICAgIGlmIChtYXliZVJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhhc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHQgPSBtYXliZVJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1N0b3BwZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyYXZlcnNlRG9jKGRvYywgZmluZEluRG9jT25FbnRlckZuKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gaXNFbXB0eShuKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuID09PSBcInN0cmluZ1wiICYmIG4ubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNMaW5lTmV4dEZuKGRvYykge1xuICAgIGlmICh0eXBlb2YgZG9jID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRvYy50eXBlID09PSBcImxpbmVcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNMaW5lTmV4dChkb2MpIHtcbiAgICByZXR1cm4gZmluZEluRG9jKGRvYywgaXNMaW5lTmV4dEZuLCBmYWxzZSk7XG4gIH1cblxuICBmdW5jdGlvbiB3aWxsQnJlYWtGbihkb2MpIHtcbiAgICBpZiAoZG9jLnR5cGUgPT09IFwiZ3JvdXBcIiAmJiBkb2MuYnJlYWspIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChkb2MudHlwZSA9PT0gXCJsaW5lXCIgJiYgZG9jLmhhcmQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChkb2MudHlwZSA9PT0gXCJicmVhay1wYXJlbnRcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gd2lsbEJyZWFrKGRvYykge1xuICAgIHJldHVybiBmaW5kSW5Eb2MoZG9jLCB3aWxsQnJlYWtGbiwgZmFsc2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gYnJlYWtQYXJlbnRHcm91cChncm91cFN0YWNrKSB7XG4gICAgaWYgKGdyb3VwU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFyZW50R3JvdXAgPSBncm91cFN0YWNrW2dyb3VwU3RhY2subGVuZ3RoIC0gMV07IC8vIEJyZWFrcyBhcmUgbm90IHByb3BhZ2F0ZWQgdGhyb3VnaCBjb25kaXRpb25hbCBncm91cHMgYmVjYXVzZVxuICAgICAgLy8gdGhlIHVzZXIgaXMgZXhwZWN0ZWQgdG8gbWFudWFsbHkgaGFuZGxlIHdoYXQgYnJlYWtzLlxuXG4gICAgICBpZiAoIXBhcmVudEdyb3VwLmV4cGFuZGVkU3RhdGVzKSB7XG4gICAgICAgIHBhcmVudEdyb3VwLmJyZWFrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb3BhZ2F0ZUJyZWFrcyhkb2MpIHtcbiAgICBjb25zdCBhbHJlYWR5VmlzaXRlZFNldCA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBncm91cFN0YWNrID0gW107XG5cbiAgICBmdW5jdGlvbiBwcm9wYWdhdGVCcmVha3NPbkVudGVyRm4oZG9jKSB7XG4gICAgICBpZiAoZG9jLnR5cGUgPT09IFwiYnJlYWstcGFyZW50XCIpIHtcbiAgICAgICAgYnJlYWtQYXJlbnRHcm91cChncm91cFN0YWNrKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRvYy50eXBlID09PSBcImdyb3VwXCIpIHtcbiAgICAgICAgZ3JvdXBTdGFjay5wdXNoKGRvYyk7XG5cbiAgICAgICAgaWYgKGFscmVhZHlWaXNpdGVkU2V0Lmhhcyhkb2MpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgYWxyZWFkeVZpc2l0ZWRTZXQuYWRkKGRvYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvcGFnYXRlQnJlYWtzT25FeGl0Rm4oZG9jKSB7XG4gICAgICBpZiAoZG9jLnR5cGUgPT09IFwiZ3JvdXBcIikge1xuICAgICAgICBjb25zdCBncm91cCA9IGdyb3VwU3RhY2sucG9wKCk7XG5cbiAgICAgICAgaWYgKGdyb3VwLmJyZWFrKSB7XG4gICAgICAgICAgYnJlYWtQYXJlbnRHcm91cChncm91cFN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRyYXZlcnNlRG9jKGRvYywgcHJvcGFnYXRlQnJlYWtzT25FbnRlckZuLCBwcm9wYWdhdGVCcmVha3NPbkV4aXRGbixcbiAgICAvKiBzaG91bGRUcmF2ZXJzZUNvbmRpdGlvbmFsR3JvdXBzICovXG4gICAgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVMaW5lc0ZuKGRvYykge1xuICAgIC8vIEZvcmNlIHRoaXMgZG9jIGludG8gZmxhdCBtb2RlIGJ5IHN0YXRpY2FsbHkgY29udmVydGluZyBhbGxcbiAgICAvLyBsaW5lcyBpbnRvIHNwYWNlcyAob3Igc29mdCBsaW5lcyBpbnRvIG5vdGhpbmcpLiBIYXJkIGxpbmVzXG4gICAgLy8gc2hvdWxkIHN0aWxsIG91dHB1dCBiZWNhdXNlIHRoZXJlJ3MgdG9vIGdyZWF0IG9mIGEgY2hhbmNlXG4gICAgLy8gb2YgYnJlYWtpbmcgZXhpc3RpbmcgYXNzdW1wdGlvbnMgb3RoZXJ3aXNlLlxuICAgIGlmIChkb2MudHlwZSA9PT0gXCJsaW5lXCIgJiYgIWRvYy5oYXJkKSB7XG4gICAgICByZXR1cm4gZG9jLnNvZnQgPyBcIlwiIDogXCIgXCI7XG4gICAgfSBlbHNlIGlmIChkb2MudHlwZSA9PT0gXCJpZi1icmVha1wiKSB7XG4gICAgICByZXR1cm4gZG9jLmZsYXRDb250ZW50cyB8fCBcIlwiO1xuICAgIH1cblxuICAgIHJldHVybiBkb2M7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVMaW5lcyhkb2MpIHtcbiAgICByZXR1cm4gbWFwRG9jKGRvYywgcmVtb3ZlTGluZXNGbik7XG4gIH1cblxuICBmdW5jdGlvbiBzdHJpcFRyYWlsaW5nSGFyZGxpbmUoZG9jKSB7XG4gICAgLy8gSEFDSyByZW1vdmUgZW5kaW5nIGhhcmRsaW5lLCBvcmlnaW5hbCBQUjogIzE5ODRcbiAgICBpZiAoZG9jLnR5cGUgPT09IFwiY29uY2F0XCIgJiYgZG9jLnBhcnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3QgbGFzdFBhcnQgPSBkb2MucGFydHNbZG9jLnBhcnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAobGFzdFBhcnQudHlwZSA9PT0gXCJjb25jYXRcIikge1xuICAgICAgICBpZiAobGFzdFBhcnQucGFydHMubGVuZ3RoID09PSAyICYmIGxhc3RQYXJ0LnBhcnRzWzBdLmhhcmQgJiYgbGFzdFBhcnQucGFydHNbMV0udHlwZSA9PT0gXCJicmVhay1wYXJlbnRcIikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBcImNvbmNhdFwiLFxuICAgICAgICAgICAgcGFydHM6IGRvYy5wYXJ0cy5zbGljZSgwLCAtMSlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcImNvbmNhdFwiLFxuICAgICAgICAgIHBhcnRzOiBkb2MucGFydHMuc2xpY2UoMCwgLTEpLmNvbmNhdChzdHJpcFRyYWlsaW5nSGFyZGxpbmUobGFzdFBhcnQpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkb2M7XG4gIH1cblxuICB2YXIgZG9jVXRpbHMgPSB7XG4gICAgaXNFbXB0eSxcbiAgICB3aWxsQnJlYWssXG4gICAgaXNMaW5lTmV4dCxcbiAgICB0cmF2ZXJzZURvYyxcbiAgICBmaW5kSW5Eb2MsXG4gICAgbWFwRG9jLFxuICAgIHByb3BhZ2F0ZUJyZWFrcyxcbiAgICByZW1vdmVMaW5lcyxcbiAgICBzdHJpcFRyYWlsaW5nSGFyZGxpbmVcbiAgfTtcblxuICBmdW5jdGlvbiBmbGF0dGVuRG9jKGRvYykge1xuICAgIGlmIChkb2MudHlwZSA9PT0gXCJjb25jYXRcIikge1xuICAgICAgY29uc3QgcmVzID0gW107XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jLnBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGRvYzIgPSBkb2MucGFydHNbaV07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkb2MyICE9PSBcInN0cmluZ1wiICYmIGRvYzIudHlwZSA9PT0gXCJjb25jYXRcIikge1xuICAgICAgICAgIHJlcy5wdXNoKC4uLmZsYXR0ZW5Eb2MoZG9jMikucGFydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGZsYXR0ZW5lZCA9IGZsYXR0ZW5Eb2MoZG9jMik7XG5cbiAgICAgICAgICBpZiAoZmxhdHRlbmVkICE9PSBcIlwiKSB7XG4gICAgICAgICAgICByZXMucHVzaChmbGF0dGVuZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZG9jLCB7XG4gICAgICAgIHBhcnRzOiByZXNcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZG9jLnR5cGUgPT09IFwiaWYtYnJlYWtcIikge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGRvYywge1xuICAgICAgICBicmVha0NvbnRlbnRzOiBkb2MuYnJlYWtDb250ZW50cyAhPSBudWxsID8gZmxhdHRlbkRvYyhkb2MuYnJlYWtDb250ZW50cykgOiBudWxsLFxuICAgICAgICBmbGF0Q29udGVudHM6IGRvYy5mbGF0Q29udGVudHMgIT0gbnVsbCA/IGZsYXR0ZW5Eb2MoZG9jLmZsYXRDb250ZW50cykgOiBudWxsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGRvYy50eXBlID09PSBcImdyb3VwXCIpIHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBkb2MsIHtcbiAgICAgICAgY29udGVudHM6IGZsYXR0ZW5Eb2MoZG9jLmNvbnRlbnRzKSxcbiAgICAgICAgZXhwYW5kZWRTdGF0ZXM6IGRvYy5leHBhbmRlZFN0YXRlcyA/IGRvYy5leHBhbmRlZFN0YXRlcy5tYXAoZmxhdHRlbkRvYykgOiBkb2MuZXhwYW5kZWRTdGF0ZXNcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZG9jLmNvbnRlbnRzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZG9jLCB7XG4gICAgICAgIGNvbnRlbnRzOiBmbGF0dGVuRG9jKGRvYy5jb250ZW50cylcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkb2M7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludERvYyhkb2MpIHtcbiAgICBpZiAodHlwZW9mIGRvYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRvYyk7XG4gICAgfVxuXG4gICAgaWYgKGRvYy50eXBlID09PSBcImxpbmVcIikge1xuICAgICAgaWYgKGRvYy5saXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBcImxpdGVyYWxsaW5lXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChkb2MuaGFyZCkge1xuICAgICAgICByZXR1cm4gXCJoYXJkbGluZVwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoZG9jLnNvZnQpIHtcbiAgICAgICAgcmV0dXJuIFwic29mdGxpbmVcIjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwibGluZVwiO1xuICAgIH1cblxuICAgIGlmIChkb2MudHlwZSA9PT0gXCJicmVhay1wYXJlbnRcIikge1xuICAgICAgcmV0dXJuIFwiYnJlYWtQYXJlbnRcIjtcbiAgICB9XG5cbiAgICBpZiAoZG9jLnR5cGUgPT09IFwidHJpbVwiKSB7XG4gICAgICByZXR1cm4gXCJ0cmltXCI7XG4gICAgfVxuXG4gICAgaWYgKGRvYy50eXBlID09PSBcImNvbmNhdFwiKSB7XG4gICAgICByZXR1cm4gXCJbXCIgKyBkb2MucGFydHMubWFwKHByaW50RG9jKS5qb2luKFwiLCBcIikgKyBcIl1cIjtcbiAgICB9XG5cbiAgICBpZiAoZG9jLnR5cGUgPT09IFwiaW5kZW50XCIpIHtcbiAgICAgIHJldHVybiBcImluZGVudChcIiArIHByaW50RG9jKGRvYy5jb250ZW50cykgKyBcIilcIjtcbiAgICB9XG5cbiAgICBpZiAoZG9jLnR5cGUgPT09IFwiYWxpZ25cIikge1xuICAgICAgcmV0dXJuIGRvYy5uID09PSAtSW5maW5pdHkgPyBcImRlZGVudFRvUm9vdChcIiArIHByaW50RG9jKGRvYy5jb250ZW50cykgKyBcIilcIiA6IGRvYy5uIDwgMCA/IFwiZGVkZW50KFwiICsgcHJpbnREb2MoZG9jLmNvbnRlbnRzKSArIFwiKVwiIDogZG9jLm4udHlwZSA9PT0gXCJyb290XCIgPyBcIm1hcmtBc1Jvb3QoXCIgKyBwcmludERvYyhkb2MuY29udGVudHMpICsgXCIpXCIgOiBcImFsaWduKFwiICsgSlNPTi5zdHJpbmdpZnkoZG9jLm4pICsgXCIsIFwiICsgcHJpbnREb2MoZG9jLmNvbnRlbnRzKSArIFwiKVwiO1xuICAgIH1cblxuICAgIGlmIChkb2MudHlwZSA9PT0gXCJpZi1icmVha1wiKSB7XG4gICAgICByZXR1cm4gXCJpZkJyZWFrKFwiICsgcHJpbnREb2MoZG9jLmJyZWFrQ29udGVudHMpICsgKGRvYy5mbGF0Q29udGVudHMgPyBcIiwgXCIgKyBwcmludERvYyhkb2MuZmxhdENvbnRlbnRzKSA6IFwiXCIpICsgXCIpXCI7XG4gICAgfVxuXG4gICAgaWYgKGRvYy50eXBlID09PSBcImdyb3VwXCIpIHtcbiAgICAgIGlmIChkb2MuZXhwYW5kZWRTdGF0ZXMpIHtcbiAgICAgICAgcmV0dXJuIFwiY29uZGl0aW9uYWxHcm91cChcIiArIFwiW1wiICsgZG9jLmV4cGFuZGVkU3RhdGVzLm1hcChwcmludERvYykuam9pbihcIixcIikgKyBcIl0pXCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoZG9jLmJyZWFrID8gXCJ3cmFwcGVkR3JvdXBcIiA6IFwiZ3JvdXBcIikgKyBcIihcIiArIHByaW50RG9jKGRvYy5jb250ZW50cykgKyBcIilcIjtcbiAgICB9XG5cbiAgICBpZiAoZG9jLnR5cGUgPT09IFwiZmlsbFwiKSB7XG4gICAgICByZXR1cm4gXCJmaWxsXCIgKyBcIihcIiArIGRvYy5wYXJ0cy5tYXAocHJpbnREb2MpLmpvaW4oXCIsIFwiKSArIFwiKVwiO1xuICAgIH1cblxuICAgIGlmIChkb2MudHlwZSA9PT0gXCJsaW5lLXN1ZmZpeFwiKSB7XG4gICAgICByZXR1cm4gXCJsaW5lU3VmZml4KFwiICsgcHJpbnREb2MoZG9jLmNvbnRlbnRzKSArIFwiKVwiO1xuICAgIH1cblxuICAgIGlmIChkb2MudHlwZSA9PT0gXCJsaW5lLXN1ZmZpeC1ib3VuZGFyeVwiKSB7XG4gICAgICByZXR1cm4gXCJsaW5lU3VmZml4Qm91bmRhcnlcIjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGRvYyB0eXBlIFwiICsgZG9jLnR5cGUpO1xuICB9XG5cbiAgdmFyIGRvY0RlYnVnID0ge1xuICAgIHByaW50RG9jVG9EZWJ1Zyhkb2MpIHtcbiAgICAgIHJldHVybiBwcmludERvYyhmbGF0dGVuRG9jKGRvYykpO1xuICAgIH1cblxuICB9O1xuXG4gIHZhciBkb2N1bWVudCA9IHtcbiAgICBidWlsZGVyczogZG9jQnVpbGRlcnMsXG4gICAgcHJpbnRlcjogZG9jUHJpbnRlcixcbiAgICB1dGlsczogZG9jVXRpbHMsXG4gICAgZGVidWc6IGRvY0RlYnVnXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIGdldE1heENvbnRpbnVvdXNDb3VudDogZ2V0TWF4Q29udGludW91c0NvdW50JDEsXG4gICAgZ2V0U3RyaW5nV2lkdGg6IGdldFN0cmluZ1dpZHRoJDIsXG4gICAgZ2V0QWxpZ25tZW50U2l6ZTogZ2V0QWxpZ25tZW50U2l6ZSQxLFxuICAgIGdldEluZGVudFNpemU6IGdldEluZGVudFNpemUkMSxcbiAgICBza2lwOiBza2lwJDEsXG4gICAgc2tpcFdoaXRlc3BhY2U6IHNraXBXaGl0ZXNwYWNlJDEsXG4gICAgc2tpcFNwYWNlczogc2tpcFNwYWNlcyQxLFxuICAgIHNraXBOZXdsaW5lOiBza2lwTmV3bGluZSQxLFxuICAgIHNraXBUb0xpbmVFbmQ6IHNraXBUb0xpbmVFbmQkMSxcbiAgICBza2lwRXZlcnl0aGluZ0J1dE5ld0xpbmU6IHNraXBFdmVyeXRoaW5nQnV0TmV3TGluZSQxLFxuICAgIHNraXBJbmxpbmVDb21tZW50OiBza2lwSW5saW5lQ29tbWVudCQxLFxuICAgIHNraXBUcmFpbGluZ0NvbW1lbnQ6IHNraXBUcmFpbGluZ0NvbW1lbnQkMSxcbiAgICBoYXNOZXdsaW5lOiBoYXNOZXdsaW5lJDEsXG4gICAgaGFzTmV3bGluZUluUmFuZ2U6IGhhc05ld2xpbmVJblJhbmdlJDEsXG4gICAgaGFzU3BhY2VzOiBoYXNTcGFjZXMkMSxcbiAgICBpc05leHRMaW5lRW1wdHk6IGlzTmV4dExpbmVFbXB0eSQxLFxuICAgIGlzTmV4dExpbmVFbXB0eUFmdGVySW5kZXg6IGlzTmV4dExpbmVFbXB0eUFmdGVySW5kZXgkMSxcbiAgICBpc1ByZXZpb3VzTGluZUVtcHR5OiBpc1ByZXZpb3VzTGluZUVtcHR5JDEsXG4gICAgZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4OiBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXgkMSxcbiAgICBtYWtlU3RyaW5nOiBtYWtlU3RyaW5nJDEsXG4gICAgYWRkTGVhZGluZ0NvbW1lbnQ6IGFkZExlYWRpbmdDb21tZW50JDEsXG4gICAgYWRkRGFuZ2xpbmdDb21tZW50OiBhZGREYW5nbGluZ0NvbW1lbnQkMSxcbiAgICBhZGRUcmFpbGluZ0NvbW1lbnQ6IGFkZFRyYWlsaW5nQ29tbWVudCQxXG4gIH0gPSB1dGlsJDE7XG4gIHZhciB1dGlsU2hhcmVkID0ge1xuICAgIGdldE1heENvbnRpbnVvdXNDb3VudDogZ2V0TWF4Q29udGludW91c0NvdW50JDEsXG4gICAgZ2V0U3RyaW5nV2lkdGg6IGdldFN0cmluZ1dpZHRoJDIsXG4gICAgZ2V0QWxpZ25tZW50U2l6ZTogZ2V0QWxpZ25tZW50U2l6ZSQxLFxuICAgIGdldEluZGVudFNpemU6IGdldEluZGVudFNpemUkMSxcbiAgICBza2lwOiBza2lwJDEsXG4gICAgc2tpcFdoaXRlc3BhY2U6IHNraXBXaGl0ZXNwYWNlJDEsXG4gICAgc2tpcFNwYWNlczogc2tpcFNwYWNlcyQxLFxuICAgIHNraXBOZXdsaW5lOiBza2lwTmV3bGluZSQxLFxuICAgIHNraXBUb0xpbmVFbmQ6IHNraXBUb0xpbmVFbmQkMSxcbiAgICBza2lwRXZlcnl0aGluZ0J1dE5ld0xpbmU6IHNraXBFdmVyeXRoaW5nQnV0TmV3TGluZSQxLFxuICAgIHNraXBJbmxpbmVDb21tZW50OiBza2lwSW5saW5lQ29tbWVudCQxLFxuICAgIHNraXBUcmFpbGluZ0NvbW1lbnQ6IHNraXBUcmFpbGluZ0NvbW1lbnQkMSxcbiAgICBoYXNOZXdsaW5lOiBoYXNOZXdsaW5lJDEsXG4gICAgaGFzTmV3bGluZUluUmFuZ2U6IGhhc05ld2xpbmVJblJhbmdlJDEsXG4gICAgaGFzU3BhY2VzOiBoYXNTcGFjZXMkMSxcbiAgICBpc05leHRMaW5lRW1wdHk6IGlzTmV4dExpbmVFbXB0eSQxLFxuICAgIGlzTmV4dExpbmVFbXB0eUFmdGVySW5kZXg6IGlzTmV4dExpbmVFbXB0eUFmdGVySW5kZXgkMSxcbiAgICBpc1ByZXZpb3VzTGluZUVtcHR5OiBpc1ByZXZpb3VzTGluZUVtcHR5JDEsXG4gICAgZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4OiBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXgkMSxcbiAgICBtYWtlU3RyaW5nOiBtYWtlU3RyaW5nJDEsXG4gICAgYWRkTGVhZGluZ0NvbW1lbnQ6IGFkZExlYWRpbmdDb21tZW50JDEsXG4gICAgYWRkRGFuZ2xpbmdDb21tZW50OiBhZGREYW5nbGluZ0NvbW1lbnQkMSxcbiAgICBhZGRUcmFpbGluZ0NvbW1lbnQ6IGFkZFRyYWlsaW5nQ29tbWVudCQxXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIGNvbmNhdDogY29uY2F0JDIsXG4gICAgbGluZTogbGluZSQxLFxuICAgIGhhcmRsaW5lOiBoYXJkbGluZSQxLFxuICAgIGJyZWFrUGFyZW50OiBicmVha1BhcmVudCQxLFxuICAgIGluZGVudDogaW5kZW50JDEsXG4gICAgbGluZVN1ZmZpeDogbGluZVN1ZmZpeCQxLFxuICAgIGpvaW46IGpvaW4kMSxcbiAgICBjdXJzb3I6IGN1cnNvciQyXG4gIH0gPSBkb2N1bWVudC5idWlsZGVycztcbiAgY29uc3Qge1xuICAgIGhhc05ld2xpbmU6IGhhc05ld2xpbmUkMixcbiAgICBza2lwTmV3bGluZTogc2tpcE5ld2xpbmUkMixcbiAgICBpc1ByZXZpb3VzTGluZUVtcHR5OiBpc1ByZXZpb3VzTGluZUVtcHR5JDJcbiAgfSA9IHV0aWwkMTtcbiAgY29uc3Qge1xuICAgIGFkZExlYWRpbmdDb21tZW50OiBhZGRMZWFkaW5nQ29tbWVudCQyLFxuICAgIGFkZERhbmdsaW5nQ29tbWVudDogYWRkRGFuZ2xpbmdDb21tZW50JDIsXG4gICAgYWRkVHJhaWxpbmdDb21tZW50OiBhZGRUcmFpbGluZ0NvbW1lbnQkMlxuICB9ID0gdXRpbFNoYXJlZDtcbiAgY29uc3QgY2hpbGROb2Rlc0NhY2hlS2V5ID0gU3ltYm9sKFwiY2hpbGQtbm9kZXNcIik7XG5cbiAgZnVuY3Rpb24gZ2V0U29ydGVkQ2hpbGROb2Rlcyhub2RlLCBvcHRpb25zLCByZXN1bHRBcnJheSkge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHByaW50ZXIsXG4gICAgICBsb2NTdGFydCxcbiAgICAgIGxvY0VuZFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKHJlc3VsdEFycmF5KSB7XG4gICAgICBpZiAocHJpbnRlci5jYW5BdHRhY2hDb21tZW50ICYmIHByaW50ZXIuY2FuQXR0YWNoQ29tbWVudChub2RlKSkge1xuICAgICAgICAvLyBUaGlzIHJldmVyc2UgaW5zZXJ0aW9uIHNvcnQgYWxtb3N0IGFsd2F5cyB0YWtlcyBjb25zdGFudFxuICAgICAgICAvLyB0aW1lIGJlY2F1c2Ugd2UgYWxtb3N0IGFsd2F5cyAobWF5YmUgYWx3YXlzPykgYXBwZW5kIHRoZVxuICAgICAgICAvLyBub2RlcyBpbiBvcmRlciBhbnl3YXkuXG4gICAgICAgIGxldCBpO1xuXG4gICAgICAgIGZvciAoaSA9IHJlc3VsdEFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgaWYgKGxvY1N0YXJ0KHJlc3VsdEFycmF5W2ldKSA8PSBsb2NTdGFydChub2RlKSAmJiBsb2NFbmQocmVzdWx0QXJyYXlbaV0pIDw9IGxvY0VuZChub2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0QXJyYXkuc3BsaWNlKGkgKyAxLCAwLCBub2RlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZVtjaGlsZE5vZGVzQ2FjaGVLZXldKSB7XG4gICAgICByZXR1cm4gbm9kZVtjaGlsZE5vZGVzQ2FjaGVLZXldO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBwcmludGVyLmdldENvbW1lbnRDaGlsZE5vZGVzICYmIHByaW50ZXIuZ2V0Q29tbWVudENoaWxkTm9kZXMobm9kZSwgb3B0aW9ucykgfHwgdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMobm9kZSkuZmlsdGVyKG4gPT4gbiAhPT0gXCJlbmNsb3NpbmdOb2RlXCIgJiYgbiAhPT0gXCJwcmVjZWRpbmdOb2RlXCIgJiYgbiAhPT0gXCJmb2xsb3dpbmdOb2RlXCIpLm1hcChuID0+IG5vZGVbbl0pO1xuXG4gICAgaWYgKCFjaGlsZE5vZGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHRBcnJheSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIGNoaWxkTm9kZXNDYWNoZUtleSwge1xuICAgICAgICB2YWx1ZTogcmVzdWx0QXJyYXkgPSBbXSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoaWxkTm9kZXMuZm9yRWFjaChjaGlsZE5vZGUgPT4ge1xuICAgICAgZ2V0U29ydGVkQ2hpbGROb2RlcyhjaGlsZE5vZGUsIG9wdGlvbnMsIHJlc3VsdEFycmF5KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0QXJyYXk7XG4gIH0gLy8gQXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUsIGRlY29yYXRlIHRoZSBjb21tZW50IG9iamVjdCB3aXRoXG4gIC8vIC5wcmVjZWRpbmdOb2RlLCAuZW5jbG9zaW5nTm9kZSwgYW5kL29yIC5mb2xsb3dpbmdOb2RlIHByb3BlcnRpZXMsIGF0XG4gIC8vIGxlYXN0IG9uZSBvZiB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGRlZmluZWQuXG5cblxuICBmdW5jdGlvbiBkZWNvcmF0ZUNvbW1lbnQobm9kZSwgY29tbWVudCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvY1N0YXJ0LFxuICAgICAgbG9jRW5kXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY2hpbGROb2RlcyA9IGdldFNvcnRlZENoaWxkTm9kZXMobm9kZSwgb3B0aW9ucyk7XG4gICAgbGV0IHByZWNlZGluZ05vZGU7XG4gICAgbGV0IGZvbGxvd2luZ05vZGU7IC8vIFRpbWUgdG8gZHVzdCBvZmYgdGhlIG9sZCBiaW5hcnkgc2VhcmNoIHJvYmVzIGFuZCB3aXphcmQgaGF0LlxuXG4gICAgbGV0IGxlZnQgPSAwO1xuICAgIGxldCByaWdodCA9IGNoaWxkTm9kZXMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlZnQgPCByaWdodCkge1xuICAgICAgY29uc3QgbWlkZGxlID0gbGVmdCArIHJpZ2h0ID4+IDE7XG4gICAgICBjb25zdCBjaGlsZCA9IGNoaWxkTm9kZXNbbWlkZGxlXTtcblxuICAgICAgaWYgKGxvY1N0YXJ0KGNoaWxkKSAtIGxvY1N0YXJ0KGNvbW1lbnQpIDw9IDAgJiYgbG9jRW5kKGNvbW1lbnQpIC0gbG9jRW5kKGNoaWxkKSA8PSAwKSB7XG4gICAgICAgIC8vIFRoZSBjb21tZW50IGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIGJ5IHRoaXMgY2hpbGQgbm9kZS5cbiAgICAgICAgY29tbWVudC5lbmNsb3NpbmdOb2RlID0gY2hpbGQ7XG4gICAgICAgIGRlY29yYXRlQ29tbWVudChjaGlsZCwgY29tbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybjsgLy8gQWJhbmRvbiB0aGUgYmluYXJ5IHNlYXJjaCBhdCB0aGlzIGxldmVsLlxuICAgICAgfVxuXG4gICAgICBpZiAobG9jRW5kKGNoaWxkKSAtIGxvY1N0YXJ0KGNvbW1lbnQpIDw9IDApIHtcbiAgICAgICAgLy8gVGhpcyBjaGlsZCBub2RlIGZhbGxzIGNvbXBsZXRlbHkgYmVmb3JlIHRoZSBjb21tZW50LlxuICAgICAgICAvLyBCZWNhdXNlIHdlIHdpbGwgbmV2ZXIgY29uc2lkZXIgdGhpcyBub2RlIG9yIGFueSBub2Rlc1xuICAgICAgICAvLyBiZWZvcmUgaXQgYWdhaW4sIHRoaXMgbm9kZSBtdXN0IGJlIHRoZSBjbG9zZXN0IHByZWNlZGluZ1xuICAgICAgICAvLyBub2RlIHdlIGhhdmUgZW5jb3VudGVyZWQgc28gZmFyLlxuICAgICAgICBwcmVjZWRpbmdOb2RlID0gY2hpbGQ7XG4gICAgICAgIGxlZnQgPSBtaWRkbGUgKyAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvY0VuZChjb21tZW50KSAtIGxvY1N0YXJ0KGNoaWxkKSA8PSAwKSB7XG4gICAgICAgIC8vIFRoaXMgY2hpbGQgbm9kZSBmYWxscyBjb21wbGV0ZWx5IGFmdGVyIHRoZSBjb21tZW50LlxuICAgICAgICAvLyBCZWNhdXNlIHdlIHdpbGwgbmV2ZXIgY29uc2lkZXIgdGhpcyBub2RlIG9yIGFueSBub2RlcyBhZnRlclxuICAgICAgICAvLyBpdCBhZ2FpbiwgdGhpcyBub2RlIG11c3QgYmUgdGhlIGNsb3Nlc3QgZm9sbG93aW5nIG5vZGUgd2VcbiAgICAgICAgLy8gaGF2ZSBlbmNvdW50ZXJlZCBzbyBmYXIuXG4gICAgICAgIGZvbGxvd2luZ05vZGUgPSBjaGlsZDtcbiAgICAgICAgcmlnaHQgPSBtaWRkbGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21tZW50IGxvY2F0aW9uIG92ZXJsYXBzIHdpdGggbm9kZSBsb2NhdGlvblwiKTtcbiAgICB9IC8vIFdlIGRvbid0IHdhbnQgY29tbWVudHMgaW5zaWRlIG9mIGRpZmZlcmVudCBleHByZXNzaW9ucyBpbnNpZGUgb2YgdGhlIHNhbWVcbiAgICAvLyB0ZW1wbGF0ZSBsaXRlcmFsIHRvIG1vdmUgdG8gYW5vdGhlciBleHByZXNzaW9uLlxuXG5cbiAgICBpZiAoY29tbWVudC5lbmNsb3NpbmdOb2RlICYmIGNvbW1lbnQuZW5jbG9zaW5nTm9kZS50eXBlID09PSBcIlRlbXBsYXRlTGl0ZXJhbFwiKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHF1YXNpc1xuICAgICAgfSA9IGNvbW1lbnQuZW5jbG9zaW5nTm9kZTtcbiAgICAgIGNvbnN0IGNvbW1lbnRJbmRleCA9IGZpbmRFeHByZXNzaW9uSW5kZXhGb3JDb21tZW50KHF1YXNpcywgY29tbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChwcmVjZWRpbmdOb2RlICYmIGZpbmRFeHByZXNzaW9uSW5kZXhGb3JDb21tZW50KHF1YXNpcywgcHJlY2VkaW5nTm9kZSwgb3B0aW9ucykgIT09IGNvbW1lbnRJbmRleCkge1xuICAgICAgICBwcmVjZWRpbmdOb2RlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvbGxvd2luZ05vZGUgJiYgZmluZEV4cHJlc3Npb25JbmRleEZvckNvbW1lbnQocXVhc2lzLCBmb2xsb3dpbmdOb2RlLCBvcHRpb25zKSAhPT0gY29tbWVudEluZGV4KSB7XG4gICAgICAgIGZvbGxvd2luZ05vZGUgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcmVjZWRpbmdOb2RlKSB7XG4gICAgICBjb21tZW50LnByZWNlZGluZ05vZGUgPSBwcmVjZWRpbmdOb2RlO1xuICAgIH1cblxuICAgIGlmIChmb2xsb3dpbmdOb2RlKSB7XG4gICAgICBjb21tZW50LmZvbGxvd2luZ05vZGUgPSBmb2xsb3dpbmdOb2RlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGF0dGFjaChjb21tZW50cywgYXN0LCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbW1lbnRzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRpZXNUb0JyZWFrID0gW107XG4gICAgY29uc3Qge1xuICAgICAgbG9jU3RhcnQsXG4gICAgICBsb2NFbmRcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb21tZW50cy5mb3JFYWNoKChjb21tZW50LCBpKSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5wYXJzZXIgPT09IFwianNvblwiIHx8IG9wdGlvbnMucGFyc2VyID09PSBcImpzb241XCIgfHwgb3B0aW9ucy5wYXJzZXIgPT09IFwiX19qc19leHByZXNzaW9uXCIgfHwgb3B0aW9ucy5wYXJzZXIgPT09IFwiX192dWVfZXhwcmVzc2lvblwiKSB7XG4gICAgICAgIGlmIChsb2NTdGFydChjb21tZW50KSAtIGxvY1N0YXJ0KGFzdCkgPD0gMCkge1xuICAgICAgICAgIGFkZExlYWRpbmdDb21tZW50JDIoYXN0LCBjb21tZW50KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9jRW5kKGNvbW1lbnQpIC0gbG9jRW5kKGFzdCkgPj0gMCkge1xuICAgICAgICAgIGFkZFRyYWlsaW5nQ29tbWVudCQyKGFzdCwgY29tbWVudCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRlY29yYXRlQ29tbWVudChhc3QsIGNvbW1lbnQsIG9wdGlvbnMpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBwcmVjZWRpbmdOb2RlLFxuICAgICAgICBlbmNsb3NpbmdOb2RlLFxuICAgICAgICBmb2xsb3dpbmdOb2RlXG4gICAgICB9ID0gY29tbWVudDtcbiAgICAgIGNvbnN0IHBsdWdpbkhhbmRsZU93bkxpbmVDb21tZW50ID0gb3B0aW9ucy5wcmludGVyLmhhbmRsZUNvbW1lbnRzICYmIG9wdGlvbnMucHJpbnRlci5oYW5kbGVDb21tZW50cy5vd25MaW5lID8gb3B0aW9ucy5wcmludGVyLmhhbmRsZUNvbW1lbnRzLm93bkxpbmUgOiAoKSA9PiBmYWxzZTtcbiAgICAgIGNvbnN0IHBsdWdpbkhhbmRsZUVuZE9mTGluZUNvbW1lbnQgPSBvcHRpb25zLnByaW50ZXIuaGFuZGxlQ29tbWVudHMgJiYgb3B0aW9ucy5wcmludGVyLmhhbmRsZUNvbW1lbnRzLmVuZE9mTGluZSA/IG9wdGlvbnMucHJpbnRlci5oYW5kbGVDb21tZW50cy5lbmRPZkxpbmUgOiAoKSA9PiBmYWxzZTtcbiAgICAgIGNvbnN0IHBsdWdpbkhhbmRsZVJlbWFpbmluZ0NvbW1lbnQgPSBvcHRpb25zLnByaW50ZXIuaGFuZGxlQ29tbWVudHMgJiYgb3B0aW9ucy5wcmludGVyLmhhbmRsZUNvbW1lbnRzLnJlbWFpbmluZyA/IG9wdGlvbnMucHJpbnRlci5oYW5kbGVDb21tZW50cy5yZW1haW5pbmcgOiAoKSA9PiBmYWxzZTtcbiAgICAgIGNvbnN0IGlzTGFzdENvbW1lbnQgPSBjb21tZW50cy5sZW5ndGggLSAxID09PSBpO1xuXG4gICAgICBpZiAoaGFzTmV3bGluZSQyKHRleHQsIGxvY1N0YXJ0KGNvbW1lbnQpLCB7XG4gICAgICAgIGJhY2t3YXJkczogdHJ1ZVxuICAgICAgfSkpIHtcbiAgICAgICAgLy8gSWYgYSBjb21tZW50IGV4aXN0cyBvbiBpdHMgb3duIGxpbmUsIHByZWZlciBhIGxlYWRpbmcgY29tbWVudC5cbiAgICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZpbGUuXG4gICAgICAgIGlmIChwbHVnaW5IYW5kbGVPd25MaW5lQ29tbWVudChjb21tZW50LCB0ZXh0LCBvcHRpb25zLCBhc3QsIGlzTGFzdENvbW1lbnQpKSA7IGVsc2UgaWYgKGZvbGxvd2luZ05vZGUpIHtcbiAgICAgICAgICAvLyBBbHdheXMgYSBsZWFkaW5nIGNvbW1lbnQuXG4gICAgICAgICAgYWRkTGVhZGluZ0NvbW1lbnQkMihmb2xsb3dpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmVjZWRpbmdOb2RlKSB7XG4gICAgICAgICAgYWRkVHJhaWxpbmdDb21tZW50JDIocHJlY2VkaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5jbG9zaW5nTm9kZSkge1xuICAgICAgICAgIGFkZERhbmdsaW5nQ29tbWVudCQyKGVuY2xvc2luZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGFyZSBubyBub2RlcywgbGV0J3MgYXR0YWNoIGl0IHRvIHRoZSByb290IG9mIHRoZSBhc3RcblxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgYWRkRGFuZ2xpbmdDb21tZW50JDIoYXN0LCBjb21tZW50KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChoYXNOZXdsaW5lJDIodGV4dCwgbG9jRW5kKGNvbW1lbnQpKSkge1xuICAgICAgICBpZiAocGx1Z2luSGFuZGxlRW5kT2ZMaW5lQ29tbWVudChjb21tZW50LCB0ZXh0LCBvcHRpb25zLCBhc3QsIGlzTGFzdENvbW1lbnQpKSA7IGVsc2UgaWYgKHByZWNlZGluZ05vZGUpIHtcbiAgICAgICAgICAvLyBUaGVyZSBpcyBjb250ZW50IGJlZm9yZSB0aGlzIGNvbW1lbnQgb24gdGhlIHNhbWUgbGluZSwgYnV0XG4gICAgICAgICAgLy8gbm9uZSBhZnRlciBpdCwgc28gcHJlZmVyIGEgdHJhaWxpbmcgY29tbWVudCBvZiB0aGUgcHJldmlvdXMgbm9kZS5cbiAgICAgICAgICBhZGRUcmFpbGluZ0NvbW1lbnQkMihwcmVjZWRpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChmb2xsb3dpbmdOb2RlKSB7XG4gICAgICAgICAgYWRkTGVhZGluZ0NvbW1lbnQkMihmb2xsb3dpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChlbmNsb3NpbmdOb2RlKSB7XG4gICAgICAgICAgYWRkRGFuZ2xpbmdDb21tZW50JDIoZW5jbG9zaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlcmUgYXJlIG5vIG5vZGVzLCBsZXQncyBhdHRhY2ggaXQgdG8gdGhlIHJvb3Qgb2YgdGhlIGFzdFxuXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICBhZGREYW5nbGluZ0NvbW1lbnQkMihhc3QsIGNvbW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGx1Z2luSGFuZGxlUmVtYWluaW5nQ29tbWVudChjb21tZW50LCB0ZXh0LCBvcHRpb25zLCBhc3QsIGlzTGFzdENvbW1lbnQpKSA7IGVsc2UgaWYgKHByZWNlZGluZ05vZGUgJiYgZm9sbG93aW5nTm9kZSkge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGV4dCBleGlzdHMgYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjb21tZW50IG9uXG4gICAgICAgICAgLy8gdGhlIHNhbWUgbGluZS4gSWYgdGhlcmUgaXMgYm90aCBhIHByZWNlZGluZyBhbmQgZm9sbG93aW5nXG4gICAgICAgICAgLy8gbm9kZSwgdXNlIGEgdGllLWJyZWFraW5nIGFsZ29yaXRobSB0byBkZXRlcm1pbmUgaWYgaXQgc2hvdWxkXG4gICAgICAgICAgLy8gYmUgYXR0YWNoZWQgdG8gdGhlIG5leHQgb3IgcHJldmlvdXMgbm9kZS4gSW4gdGhlIGxhc3QgY2FzZSxcbiAgICAgICAgICAvLyBzaW1wbHkgYXR0YWNoIHRoZSByaWdodCBub2RlO1xuICAgICAgICAgIGNvbnN0IHRpZUNvdW50ID0gdGllc1RvQnJlYWsubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKHRpZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbGFzdFRpZSA9IHRpZXNUb0JyZWFrW3RpZUNvdW50IC0gMV07XG5cbiAgICAgICAgICAgIGlmIChsYXN0VGllLmZvbGxvd2luZ05vZGUgIT09IGNvbW1lbnQuZm9sbG93aW5nTm9kZSkge1xuICAgICAgICAgICAgICBicmVha1RpZXModGllc1RvQnJlYWssIHRleHQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRpZXNUb0JyZWFrLnB1c2goY29tbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJlY2VkaW5nTm9kZSkge1xuICAgICAgICAgIGFkZFRyYWlsaW5nQ29tbWVudCQyKHByZWNlZGluZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvbGxvd2luZ05vZGUpIHtcbiAgICAgICAgICBhZGRMZWFkaW5nQ29tbWVudCQyKGZvbGxvd2luZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGVuY2xvc2luZ05vZGUpIHtcbiAgICAgICAgICBhZGREYW5nbGluZ0NvbW1lbnQkMihlbmNsb3NpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gbm9kZXMsIGxldCdzIGF0dGFjaCBpdCB0byB0aGUgcm9vdCBvZiB0aGUgYXN0XG5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIGFkZERhbmdsaW5nQ29tbWVudCQyKGFzdCwgY29tbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBicmVha1RpZXModGllc1RvQnJlYWssIHRleHQsIG9wdGlvbnMpO1xuICAgIGNvbW1lbnRzLmZvckVhY2goY29tbWVudCA9PiB7XG4gICAgICAvLyBUaGVzZSBub2RlIHJlZmVyZW5jZXMgd2VyZSB1c2VmdWwgZm9yIGJyZWFraW5nIHRpZXMsIGJ1dCB3ZVxuICAgICAgLy8gZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmUsIGFuZCB0aGV5IGNyZWF0ZSBjeWNsZXMgaW4gdGhlIEFTVCB0aGF0XG4gICAgICAvLyBtYXkgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24gaWYgd2UgZG9uJ3QgZGVsZXRlIHRoZW0gaGVyZS5cbiAgICAgIGRlbGV0ZSBjb21tZW50LnByZWNlZGluZ05vZGU7XG4gICAgICBkZWxldGUgY29tbWVudC5lbmNsb3NpbmdOb2RlO1xuICAgICAgZGVsZXRlIGNvbW1lbnQuZm9sbG93aW5nTm9kZTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJyZWFrVGllcyh0aWVzVG9CcmVhaywgdGV4dCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHRpZUNvdW50ID0gdGllc1RvQnJlYWsubGVuZ3RoO1xuXG4gICAgaWYgKHRpZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgcHJlY2VkaW5nTm9kZSxcbiAgICAgIGZvbGxvd2luZ05vZGUsXG4gICAgICBlbmNsb3NpbmdOb2RlXG4gICAgfSA9IHRpZXNUb0JyZWFrWzBdO1xuICAgIGNvbnN0IGdhcFJlZ0V4cCA9IG9wdGlvbnMucHJpbnRlci5nZXRHYXBSZWdleCAmJiBvcHRpb25zLnByaW50ZXIuZ2V0R2FwUmVnZXgoZW5jbG9zaW5nTm9kZSkgfHwgL15bXFxzKF0qJC87XG4gICAgbGV0IGdhcEVuZFBvcyA9IG9wdGlvbnMubG9jU3RhcnQoZm9sbG93aW5nTm9kZSk7IC8vIEl0ZXJhdGUgYmFja3dhcmRzIHRocm91Z2ggdGllc1RvQnJlYWssIGV4YW1pbmluZyB0aGUgZ2Fwc1xuICAgIC8vIGJldHdlZW4gdGhlIHRpZWQgY29tbWVudHMuIEluIG9yZGVyIHRvIHF1YWxpZnkgYXMgbGVhZGluZywgYVxuICAgIC8vIGNvbW1lbnQgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBmb2xsb3dpbmdOb2RlIGJ5IGFuIHVuYnJva2VuIHNlcmllcyBvZlxuICAgIC8vIGdhcHMgKG9yIG90aGVyIGNvbW1lbnRzKS4gR2FwcyBzaG91bGQgb25seSBjb250YWluIHdoaXRlc3BhY2Ugb3Igb3BlblxuICAgIC8vIHBhcmVudGhlc2VzLlxuXG4gICAgbGV0IGluZGV4T2ZGaXJzdExlYWRpbmdDb21tZW50O1xuXG4gICAgZm9yIChpbmRleE9mRmlyc3RMZWFkaW5nQ29tbWVudCA9IHRpZUNvdW50OyBpbmRleE9mRmlyc3RMZWFkaW5nQ29tbWVudCA+IDA7IC0taW5kZXhPZkZpcnN0TGVhZGluZ0NvbW1lbnQpIHtcbiAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aWVzVG9CcmVha1tpbmRleE9mRmlyc3RMZWFkaW5nQ29tbWVudCAtIDFdO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvbW1lbnQucHJlY2VkaW5nTm9kZSwgcHJlY2VkaW5nTm9kZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY29tbWVudC5mb2xsb3dpbmdOb2RlLCBmb2xsb3dpbmdOb2RlKTtcbiAgICAgIGNvbnN0IGdhcCA9IHRleHQuc2xpY2Uob3B0aW9ucy5sb2NFbmQoY29tbWVudCksIGdhcEVuZFBvcyk7XG5cbiAgICAgIGlmIChnYXBSZWdFeHAudGVzdChnYXApKSB7XG4gICAgICAgIGdhcEVuZFBvcyA9IG9wdGlvbnMubG9jU3RhcnQoY29tbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgZ2FwIHN0cmluZyBjb250YWluZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gd2hpdGVzcGFjZSBvciBvcGVuXG4gICAgICAgIC8vIHBhcmVudGhlc2VzLlxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aWVzVG9CcmVhay5mb3JFYWNoKChjb21tZW50LCBpKSA9PiB7XG4gICAgICBpZiAoaSA8IGluZGV4T2ZGaXJzdExlYWRpbmdDb21tZW50KSB7XG4gICAgICAgIGFkZFRyYWlsaW5nQ29tbWVudCQyKHByZWNlZGluZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkTGVhZGluZ0NvbW1lbnQkMihmb2xsb3dpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aWVzVG9CcmVhay5sZW5ndGggPSAwO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRDb21tZW50KGNvbW1lbnRQYXRoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRQYXRoLmdldFZhbHVlKCk7XG4gICAgY29tbWVudC5wcmludGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gb3B0aW9ucy5wcmludGVyLnByaW50Q29tbWVudChjb21tZW50UGF0aCwgb3B0aW9ucyk7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kRXhwcmVzc2lvbkluZGV4Rm9yQ29tbWVudChxdWFzaXMsIGNvbW1lbnQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzdGFydFBvcyA9IG9wdGlvbnMubG9jU3RhcnQoY29tbWVudCkgLSAxO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBxdWFzaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChzdGFydFBvcyA8IGdldFF1YXNpUmFuZ2UocXVhc2lzW2ldKS5zdGFydCkge1xuICAgICAgICByZXR1cm4gaSAtIDE7XG4gICAgICB9XG4gICAgfSAvLyBXZSBoYXZlbid0IGZvdW5kIGl0LCBpdCBwcm9iYWJseSBtZWFucyB0aGF0IHNvbWUgb2YgdGhlIGxvY2F0aW9ucyBhcmUgb2ZmLlxuICAgIC8vIExldCdzIGp1c3QgcmV0dXJuIHRoZSBmaXJzdCBvbmUuXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFF1YXNpUmFuZ2UoZXhwcikge1xuICAgIGlmIChleHByLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEJhYmVsXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogZXhwci5zdGFydCxcbiAgICAgICAgZW5kOiBleHByLmVuZFxuICAgICAgfTtcbiAgICB9IC8vIEZsb3dcblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBleHByLnJhbmdlWzBdLFxuICAgICAgZW5kOiBleHByLnJhbmdlWzFdXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50TGVhZGluZ0NvbW1lbnQoY29tbWVudFBhdGgsIHByaW50LCBvcHRpb25zKSB7XG4gICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRQYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgY29udGVudHMgPSBwcmludENvbW1lbnQoY29tbWVudFBhdGgsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFjb250ZW50cykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgY29uc3QgaXNCbG9jayA9IG9wdGlvbnMucHJpbnRlci5pc0Jsb2NrQ29tbWVudCAmJiBvcHRpb25zLnByaW50ZXIuaXNCbG9ja0NvbW1lbnQoY29tbWVudCk7IC8vIExlYWRpbmcgYmxvY2sgY29tbWVudHMgc2hvdWxkIHNlZSBpZiB0aGV5IG5lZWQgdG8gc3RheSBvbiB0aGVcbiAgICAvLyBzYW1lIGxpbmUgb3Igbm90LlxuXG4gICAgaWYgKGlzQmxvY2spIHtcbiAgICAgIGNvbnN0IGxpbmVCcmVhayA9IGhhc05ld2xpbmUkMihvcHRpb25zLm9yaWdpbmFsVGV4dCwgb3B0aW9ucy5sb2NFbmQoY29tbWVudCkpID8gaGFzTmV3bGluZSQyKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBvcHRpb25zLmxvY1N0YXJ0KGNvbW1lbnQpLCB7XG4gICAgICAgIGJhY2t3YXJkczogdHJ1ZVxuICAgICAgfSkgPyBoYXJkbGluZSQxIDogbGluZSQxIDogXCIgXCI7XG4gICAgICByZXR1cm4gY29uY2F0JDIoW2NvbnRlbnRzLCBsaW5lQnJlYWtdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uY2F0JDIoW2NvbnRlbnRzLCBoYXJkbGluZSQxXSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludFRyYWlsaW5nQ29tbWVudChjb21tZW50UGF0aCwgcHJpbnQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjb21tZW50ID0gY29tbWVudFBhdGguZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBjb250ZW50cyA9IHByaW50Q29tbWVudChjb21tZW50UGF0aCwgb3B0aW9ucyk7XG5cbiAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0Jsb2NrID0gb3B0aW9ucy5wcmludGVyLmlzQmxvY2tDb21tZW50ICYmIG9wdGlvbnMucHJpbnRlci5pc0Jsb2NrQ29tbWVudChjb21tZW50KTsgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgbGluZSB0byBicmVha1xuICAgIC8vIHdoZW4gdGhlIHBhcmVudFBhcmVudE5vZGUgaXMgYSBDbGFzc0RlY2xhcmF0aW9uLy1FeHByZXNzaW9uXG4gICAgLy8gQW5kIHRoZSBwYXJlbnROb2RlIGlzIGluIHRoZSBzdXBlckNsYXNzIHByb3BlcnR5XG5cbiAgICBjb25zdCBwYXJlbnROb2RlID0gY29tbWVudFBhdGguZ2V0Tm9kZSgxKTtcbiAgICBjb25zdCBwYXJlbnRQYXJlbnROb2RlID0gY29tbWVudFBhdGguZ2V0Tm9kZSgyKTtcbiAgICBjb25zdCBpc1BhcmVudFN1cGVyQ2xhc3MgPSBwYXJlbnRQYXJlbnROb2RlICYmIChwYXJlbnRQYXJlbnROb2RlLnR5cGUgPT09IFwiQ2xhc3NEZWNsYXJhdGlvblwiIHx8IHBhcmVudFBhcmVudE5vZGUudHlwZSA9PT0gXCJDbGFzc0V4cHJlc3Npb25cIikgJiYgcGFyZW50UGFyZW50Tm9kZS5zdXBlckNsYXNzID09PSBwYXJlbnROb2RlO1xuXG4gICAgaWYgKGhhc05ld2xpbmUkMihvcHRpb25zLm9yaWdpbmFsVGV4dCwgb3B0aW9ucy5sb2NTdGFydChjb21tZW50KSwge1xuICAgICAgYmFja3dhcmRzOiB0cnVlXG4gICAgfSkpIHtcbiAgICAgIC8vIFRoaXMgYWxsb3dzIGNvbW1lbnRzIGF0IHRoZSBlbmQgb2YgbmVzdGVkIHN0cnVjdHVyZXM6XG4gICAgICAvLyB7XG4gICAgICAvLyAgIHg6IDEsXG4gICAgICAvLyAgIHk6IDJcbiAgICAgIC8vICAgLy8gQSBjb21tZW50XG4gICAgICAvLyB9XG4gICAgICAvLyBUaG9zZSBraW5kcyBvZiBjb21tZW50cyBhcmUgYWxtb3N0IGFsd2F5cyBsZWFkaW5nIGNvbW1lbnRzLCBidXRcbiAgICAgIC8vIGhlcmUgaXQgZG9lc24ndCBnbyBcIm91dHNpZGVcIiB0aGUgYmxvY2sgYW5kIHR1cm5zIGl0IGludG8gYVxuICAgICAgLy8gdHJhaWxpbmcgY29tbWVudCBmb3IgYDJgLiBXZSBjYW4gc2ltdWxhdGUgdGhlIGFib3ZlIGJ5IGNoZWNraW5nXG4gICAgICAvLyBpZiB0aGlzIGEgY29tbWVudCBvbiBpdHMgb3duIGxpbmU7IG5vcm1hbCB0cmFpbGluZyBjb21tZW50cyBhcmVcbiAgICAgIC8vIGFsd2F5cyBhdCB0aGUgZW5kIG9mIGFub3RoZXIgZXhwcmVzc2lvbi5cbiAgICAgIGNvbnN0IGlzTGluZUJlZm9yZUVtcHR5ID0gaXNQcmV2aW91c0xpbmVFbXB0eSQyKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBjb21tZW50LCBvcHRpb25zLmxvY1N0YXJ0KTtcbiAgICAgIHJldHVybiBsaW5lU3VmZml4JDEoY29uY2F0JDIoW2hhcmRsaW5lJDEsIGlzTGluZUJlZm9yZUVtcHR5ID8gaGFyZGxpbmUkMSA6IFwiXCIsIGNvbnRlbnRzXSkpO1xuICAgIH0gZWxzZSBpZiAoaXNCbG9jayB8fCBpc1BhcmVudFN1cGVyQ2xhc3MpIHtcbiAgICAgIC8vIFRyYWlsaW5nIGJsb2NrIGNvbW1lbnRzIG5ldmVyIG5lZWQgYSBuZXdsaW5lXG4gICAgICByZXR1cm4gY29uY2F0JDIoW1wiIFwiLCBjb250ZW50c10pO1xuICAgIH1cblxuICAgIHJldHVybiBjb25jYXQkMihbbGluZVN1ZmZpeCQxKGNvbmNhdCQyKFtcIiBcIiwgY29udGVudHNdKSksICFpc0Jsb2NrID8gYnJlYWtQYXJlbnQkMSA6IFwiXCJdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50RGFuZ2xpbmdDb21tZW50cyhwYXRoLCBvcHRpb25zLCBzYW1lSW5kZW50LCBmaWx0ZXIpIHtcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG5cbiAgICBpZiAoIW5vZGUgfHwgIW5vZGUuY29tbWVudHMpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHBhdGguZWFjaChjb21tZW50UGF0aCA9PiB7XG4gICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudFBhdGguZ2V0VmFsdWUoKTtcblxuICAgICAgaWYgKGNvbW1lbnQgJiYgIWNvbW1lbnQubGVhZGluZyAmJiAhY29tbWVudC50cmFpbGluZyAmJiAoIWZpbHRlciB8fCBmaWx0ZXIoY29tbWVudCkpKSB7XG4gICAgICAgIHBhcnRzLnB1c2gocHJpbnRDb21tZW50KGNvbW1lbnRQYXRoLCBvcHRpb25zKSk7XG4gICAgICB9XG4gICAgfSwgXCJjb21tZW50c1wiKTtcblxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIGlmIChzYW1lSW5kZW50KSB7XG4gICAgICByZXR1cm4gam9pbiQxKGhhcmRsaW5lJDEsIHBhcnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZW50JDEoY29uY2F0JDIoW2hhcmRsaW5lJDEsIGpvaW4kMShoYXJkbGluZSQxLCBwYXJ0cyldKSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwZW5kQ3Vyc29yUGxhY2Vob2xkZXIocGF0aCwgb3B0aW9ucywgcHJpbnRlZCkge1xuICAgIGlmIChwYXRoLmdldE5vZGUoKSA9PT0gb3B0aW9ucy5jdXJzb3JOb2RlICYmIHBhdGguZ2V0VmFsdWUoKSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCQyKFtjdXJzb3IkMiwgcHJpbnRlZCwgY3Vyc29yJDJdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJpbnRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50Q29tbWVudHMocGF0aCwgcHJpbnQsIG9wdGlvbnMsIG5lZWRzU2VtaSkge1xuICAgIGNvbnN0IHZhbHVlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHByaW50ZWQgPSBwcmludChwYXRoKTtcbiAgICBjb25zdCBjb21tZW50cyA9IHZhbHVlICYmIHZhbHVlLmNvbW1lbnRzO1xuXG4gICAgaWYgKCFjb21tZW50cyB8fCBjb21tZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBwcmVwZW5kQ3Vyc29yUGxhY2Vob2xkZXIocGF0aCwgb3B0aW9ucywgcHJpbnRlZCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGVhZGluZ1BhcnRzID0gW107XG4gICAgY29uc3QgdHJhaWxpbmdQYXJ0cyA9IFtuZWVkc1NlbWkgPyBcIjtcIiA6IFwiXCIsIHByaW50ZWRdO1xuICAgIHBhdGguZWFjaChjb21tZW50UGF0aCA9PiB7XG4gICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudFBhdGguZ2V0VmFsdWUoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGVhZGluZyxcbiAgICAgICAgdHJhaWxpbmdcbiAgICAgIH0gPSBjb21tZW50O1xuXG4gICAgICBpZiAobGVhZGluZykge1xuICAgICAgICBjb25zdCBjb250ZW50cyA9IHByaW50TGVhZGluZ0NvbW1lbnQoY29tbWVudFBhdGgsIHByaW50LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVhZGluZ1BhcnRzLnB1c2goY29udGVudHMpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gb3B0aW9ucy5vcmlnaW5hbFRleHQ7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gc2tpcE5ld2xpbmUkMih0ZXh0LCBvcHRpb25zLmxvY0VuZChjb21tZW50KSk7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSBmYWxzZSAmJiBoYXNOZXdsaW5lJDIodGV4dCwgaW5kZXgpKSB7XG4gICAgICAgICAgbGVhZGluZ1BhcnRzLnB1c2goaGFyZGxpbmUkMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHJhaWxpbmcpIHtcbiAgICAgICAgdHJhaWxpbmdQYXJ0cy5wdXNoKHByaW50VHJhaWxpbmdDb21tZW50KGNvbW1lbnRQYXRoLCBwcmludCwgb3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0sIFwiY29tbWVudHNcIik7XG4gICAgcmV0dXJuIHByZXBlbmRDdXJzb3JQbGFjZWhvbGRlcihwYXRoLCBvcHRpb25zLCBjb25jYXQkMihsZWFkaW5nUGFydHMuY29uY2F0KHRyYWlsaW5nUGFydHMpKSk7XG4gIH1cblxuICB2YXIgY29tbWVudHMgPSB7XG4gICAgYXR0YWNoLFxuICAgIHByaW50Q29tbWVudHMsXG4gICAgcHJpbnREYW5nbGluZ0NvbW1lbnRzLFxuICAgIGdldFNvcnRlZENoaWxkTm9kZXNcbiAgfTtcblxuICBmdW5jdGlvbiBnZXROb2RlSGVscGVyKHBhdGgsIGNvdW50KSB7XG4gICAgY29uc3Qgc3RhY2tJbmRleCA9IGdldE5vZGVTdGFja0luZGV4SGVscGVyKHBhdGguc3RhY2ssIGNvdW50KTtcbiAgICByZXR1cm4gc3RhY2tJbmRleCA9PT0gLTEgPyBudWxsIDogcGF0aC5zdGFja1tzdGFja0luZGV4XTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE5vZGVTdGFja0luZGV4SGVscGVyKHN0YWNrLCBjb3VudCkge1xuICAgIGZvciAobGV0IGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMikge1xuICAgICAgY29uc3QgdmFsdWUgPSBzdGFja1tpXTtcblxuICAgICAgaWYgKHZhbHVlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAtLWNvdW50IDwgMCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBjbGFzcyBGYXN0UGF0aCB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBbdmFsdWVdO1xuICAgIH0gLy8gVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcHJvcGVydHkgaXMgYWx3YXlzIHRoZSBwZW51bHRpbWF0ZSBlbGVtZW50IG9mXG4gICAgLy8gdGhpcy5zdGFjaywgYW5kIGFsd2F5cyBhIFN0cmluZy5cblxuXG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3RhY2tcbiAgICAgIH0gPSB0aGlzO1xuICAgICAgY29uc3Qge1xuICAgICAgICBsZW5ndGhcbiAgICAgIH0gPSBzdGFjaztcblxuICAgICAgaWYgKGxlbmd0aCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrW2xlbmd0aCAtIDJdO1xuICAgICAgfSAvLyBTaW5jZSB0aGUgbmFtZSBpcyBhbHdheXMgYSBzdHJpbmcsIG51bGwgaXMgYSBzYWZlIHNlbnRpbmVsIHZhbHVlIHRvXG4gICAgICAvLyByZXR1cm4gaWYgd2UgZG8gbm90IGtub3cgdGhlIG5hbWUgb2YgdGhlIChyb290KSB2YWx1ZS5cblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIFRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBwcm9wZXJ0eSBpcyBhbHdheXMgdGhlIGZpbmFsIGVsZW1lbnQgb2ZcbiAgICAvLyB0aGlzLnN0YWNrLlxuXG5cbiAgICBnZXRWYWx1ZSgpIHtcbiAgICAgIHJldHVybiBnZXRMYXN0KHRoaXMuc3RhY2spO1xuICAgIH1cblxuICAgIGdldE5vZGUoY291bnQgPSAwKSB7XG4gICAgICByZXR1cm4gZ2V0Tm9kZUhlbHBlcih0aGlzLCBjb3VudCk7XG4gICAgfVxuXG4gICAgZ2V0UGFyZW50Tm9kZShjb3VudCA9IDApIHtcbiAgICAgIHJldHVybiBnZXROb2RlSGVscGVyKHRoaXMsIGNvdW50ICsgMSk7XG4gICAgfSAvLyBUZW1wb3JhcmlseSBwdXNoIHByb3BlcnRpZXMgbmFtZWQgYnkgc3RyaW5nIGFyZ3VtZW50cyBnaXZlbiBhZnRlciB0aGVcbiAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBvbnRvIHRoaXMuc3RhY2ssIHRoZW4gY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBhXG4gICAgLy8gcmVmZXJlbmNlIHRvIHRoaXMgKG1vZGlmaWVkKSBGYXN0UGF0aCBvYmplY3QuIE5vdGUgdGhhdCB0aGUgc3RhY2sgd2lsbFxuICAgIC8vIGJlIHJlc3RvcmVkIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZSBhZnRlciB0aGUgY2FsbGJhY2sgaXMgZmluaXNoZWQsIHNvIGl0XG4gICAgLy8gaXMgcHJvYmFibHkgYSBtaXN0YWtlIHRvIHJldGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgcGF0aC5cblxuXG4gICAgY2FsbChjYWxsYmFjaywgLi4ubmFtZXMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3RhY2tcbiAgICAgIH0gPSB0aGlzO1xuICAgICAgY29uc3Qge1xuICAgICAgICBsZW5ndGhcbiAgICAgIH0gPSBzdGFjaztcbiAgICAgIGxldCB2YWx1ZSA9IGdldExhc3Qoc3RhY2spO1xuXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZVtuYW1lXTtcbiAgICAgICAgc3RhY2sucHVzaChuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKHRoaXMpO1xuICAgICAgc3RhY2subGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjYWxsUGFyZW50KGNhbGxiYWNrLCBjb3VudCA9IDApIHtcbiAgICAgIGNvbnN0IHN0YWNrSW5kZXggPSBnZXROb2RlU3RhY2tJbmRleEhlbHBlcih0aGlzLnN0YWNrLCBjb3VudCArIDEpO1xuICAgICAgY29uc3QgcGFyZW50VmFsdWVzID0gdGhpcy5zdGFjay5zcGxpY2Uoc3RhY2tJbmRleCArIDEpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2sodGhpcyk7XG4gICAgICB0aGlzLnN0YWNrLnB1c2goLi4ucGFyZW50VmFsdWVzKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSAvLyBTaW1pbGFyIHRvIEZhc3RQYXRoLnByb3RvdHlwZS5jYWxsLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUgb2J0YWluZWQgYnlcbiAgICAvLyBhY2Nlc3NpbmcgdGhpcy5nZXRWYWx1ZSgpW25hbWUxXVtuYW1lMl0uLi4gc2hvdWxkIGJlIGFycmF5LWxpa2UuIFRoZVxuICAgIC8vIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGggYSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoIG9iamVjdCBmb3IgZWFjaFxuICAgIC8vIGVsZW1lbnQgb2YgdGhlIGFycmF5LlxuXG5cbiAgICBlYWNoKGNhbGxiYWNrLCAuLi5uYW1lcykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdGFja1xuICAgICAgfSA9IHRoaXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxlbmd0aFxuICAgICAgfSA9IHN0YWNrO1xuICAgICAgbGV0IHZhbHVlID0gZ2V0TGFzdChzdGFjayk7XG5cbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlW25hbWVdO1xuICAgICAgICBzdGFjay5wdXNoKG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSBpbiB2YWx1ZSkge1xuICAgICAgICAgIHN0YWNrLnB1c2goaSwgdmFsdWVbaV0pOyAvLyBJZiB0aGUgY2FsbGJhY2sgbmVlZHMgdG8ga25vdyB0aGUgdmFsdWUgb2YgaSwgY2FsbFxuICAgICAgICAgIC8vIHBhdGguZ2V0TmFtZSgpLCBhc3N1bWluZyBwYXRoIGlzIHRoZSBwYXJhbWV0ZXIgbmFtZS5cblxuICAgICAgICAgIGNhbGxiYWNrKHRoaXMpO1xuICAgICAgICAgIHN0YWNrLmxlbmd0aCAtPSAyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0YWNrLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB9IC8vIFNpbWlsYXIgdG8gRmFzdFBhdGgucHJvdG90eXBlLmVhY2gsIGV4Y2VwdCB0aGF0IHRoZSByZXN1bHRzIG9mIHRoZVxuICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIGludm9jYXRpb25zIGFyZSBzdG9yZWQgaW4gYW4gYXJyYXkgYW5kIHJldHVybmVkIGF0XG4gICAgLy8gdGhlIGVuZCBvZiB0aGUgaXRlcmF0aW9uLlxuXG5cbiAgICBtYXAoY2FsbGJhY2ssIC4uLm5hbWVzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0YWNrXG4gICAgICB9ID0gdGhpcztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGVuZ3RoXG4gICAgICB9ID0gc3RhY2s7XG4gICAgICBsZXQgdmFsdWUgPSBnZXRMYXN0KHN0YWNrKTtcblxuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVbbmFtZV07XG4gICAgICAgIHN0YWNrLnB1c2gobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkodmFsdWUubGVuZ3RoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSBpbiB2YWx1ZSkge1xuICAgICAgICAgIHN0YWNrLnB1c2goaSwgdmFsdWVbaV0pO1xuICAgICAgICAgIHJlc3VsdFtpXSA9IGNhbGxiYWNrKHRoaXMsIGkpO1xuICAgICAgICAgIHN0YWNrLmxlbmd0aCAtPSAyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0YWNrLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Li4uKFxuICAgICAqICAgfCAoKG5vZGU6IGFueSwgbmFtZTogc3RyaW5nIHwgbnVsbCwgbnVtYmVyOiBudW1iZXIgfCBudWxsKSA9PiBib29sZWFuKVxuICAgICAqICAgfCB1bmRlZmluZWRcbiAgICAgKiApfSBwcmVkaWNhdGVzXG4gICAgICovXG5cblxuICAgIG1hdGNoKC4uLnByZWRpY2F0ZXMpIHtcbiAgICAgIGxldCBzdGFja1BvaW50ZXIgPSB0aGlzLnN0YWNrLmxlbmd0aCAtIDE7XG4gICAgICBsZXQgbmFtZSA9IG51bGw7XG4gICAgICBsZXQgbm9kZSA9IHRoaXMuc3RhY2tbc3RhY2tQb2ludGVyLS1dO1xuXG4gICAgICBmb3IgKGNvbnN0IHByZWRpY2F0ZSBvZiBwcmVkaWNhdGVzKSB7XG4gICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gLy8gc2tpcCBpbmRleC9hcnJheVxuXG5cbiAgICAgICAgbGV0IG51bWJlciA9IG51bGw7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgbnVtYmVyID0gbmFtZTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5zdGFja1tzdGFja1BvaW50ZXItLV07XG4gICAgICAgICAgbm9kZSA9IHRoaXMuc3RhY2tbc3RhY2tQb2ludGVyLS1dO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZWRpY2F0ZSAmJiAhcHJlZGljYXRlKG5vZGUsIG5hbWUsIG51bWJlcikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBuYW1lID0gdGhpcy5zdGFja1tzdGFja1BvaW50ZXItLV07XG4gICAgICAgIG5vZGUgPSB0aGlzLnN0YWNrW3N0YWNrUG9pbnRlci0tXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gIH1cblxuICB2YXIgZmFzdFBhdGggPSBGYXN0UGF0aDtcblxuICBjb25zdCB7XG4gICAgbm9ybWFsaXplOiBub3JtYWxpemUkMlxuICB9ID0gb3B0aW9ucyQxO1xuXG4gIGZ1bmN0aW9uIHByaW50U3VidHJlZShwYXRoLCBwcmludCwgb3B0aW9ucywgcHJpbnRBc3RUb0RvYykge1xuICAgIGlmIChvcHRpb25zLnByaW50ZXIuZW1iZWQpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnByaW50ZXIuZW1iZWQocGF0aCwgcHJpbnQsICh0ZXh0LCBwYXJ0aWFsTmV4dE9wdGlvbnMpID0+IHRleHRUb0RvYyh0ZXh0LCBwYXJ0aWFsTmV4dE9wdGlvbnMsIG9wdGlvbnMsIHByaW50QXN0VG9Eb2MpLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0ZXh0VG9Eb2ModGV4dCwgcGFydGlhbE5leHRPcHRpb25zLCBwYXJlbnRPcHRpb25zLCBwcmludEFzdFRvRG9jKSB7XG4gICAgY29uc3QgbmV4dE9wdGlvbnMgPSBub3JtYWxpemUkMihPYmplY3QuYXNzaWduKHt9LCBwYXJlbnRPcHRpb25zLCB7fSwgcGFydGlhbE5leHRPcHRpb25zLCB7XG4gICAgICBwYXJlbnRQYXJzZXI6IHBhcmVudE9wdGlvbnMucGFyc2VyLFxuICAgICAgZW1iZWRkZWRJbkh0bWw6ICEhKHBhcmVudE9wdGlvbnMuZW1iZWRkZWRJbkh0bWwgfHwgcGFyZW50T3B0aW9ucy5wYXJzZXIgPT09IFwiaHRtbFwiIHx8IHBhcmVudE9wdGlvbnMucGFyc2VyID09PSBcInZ1ZVwiIHx8IHBhcmVudE9wdGlvbnMucGFyc2VyID09PSBcImFuZ3VsYXJcIiB8fCBwYXJlbnRPcHRpb25zLnBhcnNlciA9PT0gXCJsd2NcIiksXG4gICAgICBvcmlnaW5hbFRleHQ6IHRleHRcbiAgICB9KSwge1xuICAgICAgcGFzc1Rocm91Z2g6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIucGFyc2UodGV4dCwgbmV4dE9wdGlvbnMpO1xuICAgIGNvbnN0IHtcbiAgICAgIGFzdFxuICAgIH0gPSByZXN1bHQ7XG4gICAgdGV4dCA9IHJlc3VsdC50ZXh0O1xuICAgIGNvbnN0IGFzdENvbW1lbnRzID0gYXN0LmNvbW1lbnRzO1xuICAgIGRlbGV0ZSBhc3QuY29tbWVudHM7XG4gICAgY29tbWVudHMuYXR0YWNoKGFzdENvbW1lbnRzLCBhc3QsIHRleHQsIG5leHRPcHRpb25zKTtcbiAgICByZXR1cm4gcHJpbnRBc3RUb0RvYyhhc3QsIG5leHRPcHRpb25zKTtcbiAgfVxuXG4gIHZhciBtdWx0aXBhcnNlciA9IHtcbiAgICBwcmludFN1YnRyZWVcbiAgfTtcblxuICBjb25zdCBkb2MgPSBkb2N1bWVudDtcbiAgY29uc3QgZG9jQnVpbGRlcnMkMSA9IGRvYy5idWlsZGVycztcbiAgY29uc3Qge1xuICAgIGNvbmNhdDogY29uY2F0JDMsXG4gICAgaGFyZGxpbmU6IGhhcmRsaW5lJDIsXG4gICAgYWRkQWxpZ25tZW50VG9Eb2M6IGFkZEFsaWdubWVudFRvRG9jJDFcbiAgfSA9IGRvY0J1aWxkZXJzJDE7XG4gIGNvbnN0IGRvY1V0aWxzJDEgPSBkb2MudXRpbHM7XG4gIC8qKlxuICAgKiBUYWtlcyBhbiBhYnN0cmFjdCBzeW50YXggdHJlZSAoQVNUKSBhbmQgcmVjdXJzaXZlbHkgY29udmVydHMgaXQgdG8gYVxuICAgKiBkb2N1bWVudCAoc2VyaWVzIG9mIHByaW50aW5nIHByaW1pdGl2ZXMpLlxuICAgKlxuICAgKiBUaGlzIGlzIGRvbmUgYnkgZGVzY2VuZGluZyBkb3duIHRoZSBBU1QgcmVjdXJzaXZlbHkuIFRoZSByZWN1cnNpb25cbiAgICogaW52b2x2ZXMgdHdvIGZ1bmN0aW9ucyB0aGF0IGNhbGwgZWFjaCBvdGhlcjpcbiAgICpcbiAgICogMS4gcHJpbnRHZW5lcmljYWxseSgpLCB3aGljaCBpcyBkZWZpbmVkIGFzIGFuIGlubmVyIGZ1bmN0aW9uIGhlcmUuXG4gICAqICAgIEl0IGJhc2ljYWxseSB0YWtlcyBjYXJlIG9mIG5vZGUgY2FjaGluZy5cbiAgICogMi4gY2FsbFBsdWdpblByaW50RnVuY3Rpb24oKSwgd2hpY2ggY2hlY2tzIGZvciBzb21lIG9wdGlvbnMsIGFuZFxuICAgKiAgICB1bHRpbWF0ZWx5IGNhbGxzIHRoZSBwcmludCgpIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoZSBwbHVnaW4uXG4gICAqXG4gICAqIFRoZSBwbHVnaW4gZnVuY3Rpb24gd2lsbCBjYWxsIHByaW50R2VuZXJpY2FsbHkoKSBhZ2FpbiBmb3IgY2hpbGQgbm9kZXNcbiAgICogb2YgdGhlIGN1cnJlbnQgbm9kZSwgd2hpY2ggd2lsbCBkbyBpdHMgaG91c2VrZWVwaW5nLCB0aGVuIGNhbGwgdGhlXG4gICAqIHBsdWdpbiBmdW5jdGlvbiBhZ2FpbiwgYW5kIHNvIG9uLlxuICAgKlxuICAgKiBBbGwgdGhlIHdoaWxlLCB0aGVzZSBmdW5jdGlvbnMgcGFzcyBhIFwicGF0aFwiIHZhcmlhYmxlIGFyb3VuZCwgd2hpY2hcbiAgICogaXMgYSBzdGFjay1saWtlIGRhdGEgc3RydWN0dXJlIChGYXN0UGF0aCkgdGhhdCBtYWludGFpbnMgdGhlIGN1cnJlbnRcbiAgICogc3RhdGUgb2YgdGhlIHJlY3Vyc2lvbi4gSXQgaXMgY2FsbGVkIFwicGF0aFwiLCBiZWNhdXNlIGl0IHJlcHJlc2VudHNcbiAgICogdGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgbm9kZSB0aHJvdWdoIHRoZSBBYnN0cmFjdCBTeW50YXggVHJlZS5cbiAgICovXG5cbiAgZnVuY3Rpb24gcHJpbnRBc3RUb0RvYyhhc3QsIG9wdGlvbnMsIGFsaWdubWVudFNpemUgPSAwKSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJpbnRlclxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKHByaW50ZXIucHJlcHJvY2Vzcykge1xuICAgICAgYXN0ID0gcHJpbnRlci5wcmVwcm9jZXNzKGFzdCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKCk7XG5cbiAgICBmdW5jdGlvbiBwcmludEdlbmVyaWNhbGx5KHBhdGgsIGFyZ3MpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgICBjb25zdCBzaG91bGRDYWNoZSA9IG5vZGUgJiYgdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgYXJncyA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoc2hvdWxkQ2FjaGUgJiYgY2FjaGUuaGFzKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBjYWNoZS5nZXQobm9kZSk7XG4gICAgICB9IC8vIFdlIGxldCBKU1hFbGVtZW50IHByaW50IGl0cyBjb21tZW50cyBpdHNlbGYgYmVjYXVzZSBpdCBhZGRzICgpIGFyb3VuZFxuICAgICAgLy8gVW5pb25UeXBlQW5ub3RhdGlvbiBoYXMgdG8gYWxpZ24gdGhlIGNoaWxkIHdpdGhvdXQgdGhlIGNvbW1lbnRzXG5cblxuICAgICAgbGV0IHJlcztcblxuICAgICAgaWYgKHByaW50ZXIud2lsbFByaW50T3duQ29tbWVudHMgJiYgcHJpbnRlci53aWxsUHJpbnRPd25Db21tZW50cyhwYXRoLCBvcHRpb25zKSkge1xuICAgICAgICByZXMgPSBjYWxsUGx1Z2luUHJpbnRGdW5jdGlvbihwYXRoLCBvcHRpb25zLCBwcmludEdlbmVyaWNhbGx5LCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHByaW50Q29tbWVudHMgd2lsbCBjYWxsIHRoZSBwbHVnaW4gcHJpbnQgZnVuY3Rpb24gYW5kIGNoZWNrIGZvclxuICAgICAgICAvLyBjb21tZW50cyB0byBwcmludFxuICAgICAgICByZXMgPSBjb21tZW50cy5wcmludENvbW1lbnRzKHBhdGgsIHAgPT4gY2FsbFBsdWdpblByaW50RnVuY3Rpb24ocCwgb3B0aW9ucywgcHJpbnRHZW5lcmljYWxseSwgYXJncyksIG9wdGlvbnMsIGFyZ3MgJiYgYXJncy5uZWVkc1NlbWkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkQ2FjaGUpIHtcbiAgICAgICAgY2FjaGUuc2V0KG5vZGUsIHJlcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgbGV0IGRvYyA9IHByaW50R2VuZXJpY2FsbHkobmV3IGZhc3RQYXRoKGFzdCkpO1xuXG4gICAgaWYgKGFsaWdubWVudFNpemUgPiAwKSB7XG4gICAgICAvLyBBZGQgYSBoYXJkbGluZSB0byBtYWtlIHRoZSBpbmRlbnRzIHRha2UgZWZmZWN0XG4gICAgICAvLyBJdCBzaG91bGQgYmUgcmVtb3ZlZCBpbiBpbmRleC5qcyBmb3JtYXQoKVxuICAgICAgZG9jID0gYWRkQWxpZ25tZW50VG9Eb2MkMShjb25jYXQkMyhbaGFyZGxpbmUkMiwgZG9jXSksIGFsaWdubWVudFNpemUsIG9wdGlvbnMudGFiV2lkdGgpO1xuICAgIH1cblxuICAgIGRvY1V0aWxzJDEucHJvcGFnYXRlQnJlYWtzKGRvYyk7XG4gICAgcmV0dXJuIGRvYztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbGxQbHVnaW5QcmludEZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMsIHByaW50UGF0aCwgYXJncykge1xuICAgIGFzc2VydC5vayhwYXRoIGluc3RhbmNlb2YgZmFzdFBhdGgpO1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3Qge1xuICAgICAgcHJpbnRlclxuICAgIH0gPSBvcHRpb25zOyAvLyBFc2NhcGUgaGF0Y2hcblxuICAgIGlmIChwcmludGVyLmhhc1ByZXR0aWVySWdub3JlICYmIHByaW50ZXIuaGFzUHJldHRpZXJJZ25vcmUocGF0aCkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShvcHRpb25zLmxvY1N0YXJ0KG5vZGUpLCBvcHRpb25zLmxvY0VuZChub2RlKSk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFBvdGVudGlhbGx5IHN3aXRjaCB0byBhIGRpZmZlcmVudCBwYXJzZXJcbiAgICAgICAgY29uc3Qgc3ViID0gbXVsdGlwYXJzZXIucHJpbnRTdWJ0cmVlKHBhdGgsIHByaW50UGF0aCwgb3B0aW9ucywgcHJpbnRBc3RUb0RvYyk7XG5cbiAgICAgICAgaWYgKHN1Yikge1xuICAgICAgICAgIHJldHVybiBzdWI7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoY29tbW9uanNHbG9iYWwuUFJFVFRJRVJfREVCVUcpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSAvLyBDb250aW51ZSB3aXRoIGN1cnJlbnQgcGFyc2VyXG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJpbnRlci5wcmludChwYXRoLCBvcHRpb25zLCBwcmludFBhdGgsIGFyZ3MpO1xuICB9XG5cbiAgdmFyIGFzdFRvRG9jID0gcHJpbnRBc3RUb0RvYztcblxuICBmdW5jdGlvbiBmaW5kU2libGluZ0FuY2VzdG9ycyhzdGFydE5vZGVBbmRQYXJlbnRzLCBlbmROb2RlQW5kUGFyZW50cywgb3B0cykge1xuICAgIGxldCByZXN1bHRTdGFydE5vZGUgPSBzdGFydE5vZGVBbmRQYXJlbnRzLm5vZGU7XG4gICAgbGV0IHJlc3VsdEVuZE5vZGUgPSBlbmROb2RlQW5kUGFyZW50cy5ub2RlO1xuXG4gICAgaWYgKHJlc3VsdFN0YXJ0Tm9kZSA9PT0gcmVzdWx0RW5kTm9kZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnROb2RlOiByZXN1bHRTdGFydE5vZGUsXG4gICAgICAgIGVuZE5vZGU6IHJlc3VsdEVuZE5vZGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbmRQYXJlbnQgb2YgZW5kTm9kZUFuZFBhcmVudHMucGFyZW50Tm9kZXMpIHtcbiAgICAgIGlmIChlbmRQYXJlbnQudHlwZSAhPT0gXCJQcm9ncmFtXCIgJiYgZW5kUGFyZW50LnR5cGUgIT09IFwiRmlsZVwiICYmIG9wdHMubG9jU3RhcnQoZW5kUGFyZW50KSA+PSBvcHRzLmxvY1N0YXJ0KHN0YXJ0Tm9kZUFuZFBhcmVudHMubm9kZSkpIHtcbiAgICAgICAgcmVzdWx0RW5kTm9kZSA9IGVuZFBhcmVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3RhcnRQYXJlbnQgb2Ygc3RhcnROb2RlQW5kUGFyZW50cy5wYXJlbnROb2Rlcykge1xuICAgICAgaWYgKHN0YXJ0UGFyZW50LnR5cGUgIT09IFwiUHJvZ3JhbVwiICYmIHN0YXJ0UGFyZW50LnR5cGUgIT09IFwiRmlsZVwiICYmIG9wdHMubG9jRW5kKHN0YXJ0UGFyZW50KSA8PSBvcHRzLmxvY0VuZChlbmROb2RlQW5kUGFyZW50cy5ub2RlKSkge1xuICAgICAgICByZXN1bHRTdGFydE5vZGUgPSBzdGFydFBhcmVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydE5vZGU6IHJlc3VsdFN0YXJ0Tm9kZSxcbiAgICAgIGVuZE5vZGU6IHJlc3VsdEVuZE5vZGVcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZE5vZGVBdE9mZnNldChub2RlLCBvZmZzZXQsIG9wdGlvbnMsIHByZWRpY2F0ZSwgcGFyZW50Tm9kZXMpIHtcbiAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUgfHwgKCgpID0+IHRydWUpO1xuXG4gICAgcGFyZW50Tm9kZXMgPSBwYXJlbnROb2RlcyB8fCBbXTtcbiAgICBjb25zdCBzdGFydCA9IG9wdGlvbnMubG9jU3RhcnQobm9kZSwgb3B0aW9ucy5sb2NTdGFydCk7XG4gICAgY29uc3QgZW5kID0gb3B0aW9ucy5sb2NFbmQobm9kZSwgb3B0aW9ucy5sb2NFbmQpO1xuXG4gICAgaWYgKHN0YXJ0IDw9IG9mZnNldCAmJiBvZmZzZXQgPD0gZW5kKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBjb21tZW50cy5nZXRTb3J0ZWRDaGlsZE5vZGVzKG5vZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gZmluZE5vZGVBdE9mZnNldChjaGlsZE5vZGUsIG9mZnNldCwgb3B0aW9ucywgcHJlZGljYXRlLCBbbm9kZV0uY29uY2F0KHBhcmVudE5vZGVzKSk7XG5cbiAgICAgICAgaWYgKGNoaWxkUmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkUmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHBhcmVudE5vZGVzXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFNlZSBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLUEuNVxuXG5cbiAgZnVuY3Rpb24gaXNTb3VyY2VFbGVtZW50KG9wdHMsIG5vZGUpIHtcbiAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBKUyBhbmQgSlMgbGlrZSB0byBhdm9pZCByZXBldGl0aW9uc1xuXG5cbiAgICBjb25zdCBqc1NvdXJjZUVsZW1lbnRzID0gW1wiRnVuY3Rpb25EZWNsYXJhdGlvblwiLCBcIkJsb2NrU3RhdGVtZW50XCIsIFwiQnJlYWtTdGF0ZW1lbnRcIiwgXCJDb250aW51ZVN0YXRlbWVudFwiLCBcIkRlYnVnZ2VyU3RhdGVtZW50XCIsIFwiRG9XaGlsZVN0YXRlbWVudFwiLCBcIkVtcHR5U3RhdGVtZW50XCIsIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLCBcIkZvckluU3RhdGVtZW50XCIsIFwiRm9yU3RhdGVtZW50XCIsIFwiSWZTdGF0ZW1lbnRcIiwgXCJMYWJlbGVkU3RhdGVtZW50XCIsIFwiUmV0dXJuU3RhdGVtZW50XCIsIFwiU3dpdGNoU3RhdGVtZW50XCIsIFwiVGhyb3dTdGF0ZW1lbnRcIiwgXCJUcnlTdGF0ZW1lbnRcIiwgXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIsIFwiV2hpbGVTdGF0ZW1lbnRcIiwgXCJXaXRoU3RhdGVtZW50XCIsIFwiQ2xhc3NEZWNsYXJhdGlvblwiLCAvLyBFUyAyMDE1XG4gICAgXCJJbXBvcnREZWNsYXJhdGlvblwiLCAvLyBNb2R1bGVcbiAgICBcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiLCAvLyBNb2R1bGVcbiAgICBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIiwgLy8gTW9kdWxlXG4gICAgXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiLCAvLyBNb2R1bGVcbiAgICBcIlR5cGVBbGlhc1wiLCAvLyBGbG93XG4gICAgXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiLCAvLyBGbG93LCBUeXBlU2NyaXB0XG4gICAgXCJUeXBlQWxpYXNEZWNsYXJhdGlvblwiLCAvLyBUeXBlU2NyaXB0XG4gICAgXCJFeHBvcnRBc3NpZ25tZW50XCIsIC8vIFR5cGVTY3JpcHRcbiAgICBcIkV4cG9ydERlY2xhcmF0aW9uXCIgLy8gVHlwZVNjcmlwdFxuICAgIF07XG4gICAgY29uc3QganNvblNvdXJjZUVsZW1lbnRzID0gW1wiT2JqZWN0RXhwcmVzc2lvblwiLCBcIkFycmF5RXhwcmVzc2lvblwiLCBcIlN0cmluZ0xpdGVyYWxcIiwgXCJOdW1lcmljTGl0ZXJhbFwiLCBcIkJvb2xlYW5MaXRlcmFsXCIsIFwiTnVsbExpdGVyYWxcIl07XG4gICAgY29uc3QgZ3JhcGhxbFNvdXJjZUVsZW1lbnRzID0gW1wiT3BlcmF0aW9uRGVmaW5pdGlvblwiLCBcIkZyYWdtZW50RGVmaW5pdGlvblwiLCBcIlZhcmlhYmxlRGVmaW5pdGlvblwiLCBcIlR5cGVFeHRlbnNpb25EZWZpbml0aW9uXCIsIFwiT2JqZWN0VHlwZURlZmluaXRpb25cIiwgXCJGaWVsZERlZmluaXRpb25cIiwgXCJEaXJlY3RpdmVEZWZpbml0aW9uXCIsIFwiRW51bVR5cGVEZWZpbml0aW9uXCIsIFwiRW51bVZhbHVlRGVmaW5pdGlvblwiLCBcIklucHV0VmFsdWVEZWZpbml0aW9uXCIsIFwiSW5wdXRPYmplY3RUeXBlRGVmaW5pdGlvblwiLCBcIlNjaGVtYURlZmluaXRpb25cIiwgXCJPcGVyYXRpb25UeXBlRGVmaW5pdGlvblwiLCBcIkludGVyZmFjZVR5cGVEZWZpbml0aW9uXCIsIFwiVW5pb25UeXBlRGVmaW5pdGlvblwiLCBcIlNjYWxhclR5cGVEZWZpbml0aW9uXCJdO1xuXG4gICAgc3dpdGNoIChvcHRzLnBhcnNlcikge1xuICAgICAgY2FzZSBcImZsb3dcIjpcbiAgICAgIGNhc2UgXCJiYWJlbFwiOlxuICAgICAgY2FzZSBcImJhYmVsLWZsb3dcIjpcbiAgICAgIGNhc2UgXCJiYWJlbC10c1wiOlxuICAgICAgY2FzZSBcInR5cGVzY3JpcHRcIjpcbiAgICAgICAgcmV0dXJuIGpzU291cmNlRWxlbWVudHMuaW5jbHVkZXMobm9kZS50eXBlKTtcblxuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIGpzb25Tb3VyY2VFbGVtZW50cy5pbmNsdWRlcyhub2RlLnR5cGUpO1xuXG4gICAgICBjYXNlIFwiZ3JhcGhxbFwiOlxuICAgICAgICByZXR1cm4gZ3JhcGhxbFNvdXJjZUVsZW1lbnRzLmluY2x1ZGVzKG5vZGUua2luZCk7XG5cbiAgICAgIGNhc2UgXCJ2dWVcIjpcbiAgICAgICAgcmV0dXJuIG5vZGUudGFnICE9PSBcInJvb3RcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjdWxhdGVSYW5nZSh0ZXh0LCBvcHRzLCBhc3QpIHtcbiAgICAvLyBDb250cmFjdCB0aGUgcmFuZ2Ugc28gdGhhdCBpdCBoYXMgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBhdCBpdHMgZW5kcG9pbnRzLlxuICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBjYW4gZm9ybWF0IGEgcmFuZ2UgdGhhdCBkb2Vzbid0IGVuZCBvbiBhIG5vZGUuXG4gICAgY29uc3QgcmFuZ2VTdHJpbmdPcmlnID0gdGV4dC5zbGljZShvcHRzLnJhbmdlU3RhcnQsIG9wdHMucmFuZ2VFbmQpO1xuICAgIGNvbnN0IHN0YXJ0Tm9uV2hpdGVzcGFjZSA9IE1hdGgubWF4KG9wdHMucmFuZ2VTdGFydCArIHJhbmdlU3RyaW5nT3JpZy5zZWFyY2goL1xcUy8pLCBvcHRzLnJhbmdlU3RhcnQpO1xuICAgIGxldCBlbmROb25XaGl0ZXNwYWNlO1xuXG4gICAgZm9yIChlbmROb25XaGl0ZXNwYWNlID0gb3B0cy5yYW5nZUVuZDsgZW5kTm9uV2hpdGVzcGFjZSA+IG9wdHMucmFuZ2VTdGFydDsgLS1lbmROb25XaGl0ZXNwYWNlKSB7XG4gICAgICBpZiAodGV4dFtlbmROb25XaGl0ZXNwYWNlIC0gMV0ubWF0Y2goL1xcUy8pKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0Tm9kZUFuZFBhcmVudHMgPSBmaW5kTm9kZUF0T2Zmc2V0KGFzdCwgc3RhcnROb25XaGl0ZXNwYWNlLCBvcHRzLCBub2RlID0+IGlzU291cmNlRWxlbWVudChvcHRzLCBub2RlKSk7XG4gICAgY29uc3QgZW5kTm9kZUFuZFBhcmVudHMgPSBmaW5kTm9kZUF0T2Zmc2V0KGFzdCwgZW5kTm9uV2hpdGVzcGFjZSwgb3B0cywgbm9kZSA9PiBpc1NvdXJjZUVsZW1lbnQob3B0cywgbm9kZSkpO1xuXG4gICAgaWYgKCFzdGFydE5vZGVBbmRQYXJlbnRzIHx8ICFlbmROb2RlQW5kUGFyZW50cykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmFuZ2VTdGFydDogMCxcbiAgICAgICAgcmFuZ2VFbmQ6IDBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2libGluZ0FuY2VzdG9ycyA9IGZpbmRTaWJsaW5nQW5jZXN0b3JzKHN0YXJ0Tm9kZUFuZFBhcmVudHMsIGVuZE5vZGVBbmRQYXJlbnRzLCBvcHRzKTtcbiAgICBjb25zdCB7XG4gICAgICBzdGFydE5vZGUsXG4gICAgICBlbmROb2RlXG4gICAgfSA9IHNpYmxpbmdBbmNlc3RvcnM7XG4gICAgY29uc3QgcmFuZ2VTdGFydCA9IE1hdGgubWluKG9wdHMubG9jU3RhcnQoc3RhcnROb2RlLCBvcHRzLmxvY1N0YXJ0KSwgb3B0cy5sb2NTdGFydChlbmROb2RlLCBvcHRzLmxvY1N0YXJ0KSk7XG4gICAgY29uc3QgcmFuZ2VFbmQgPSBNYXRoLm1heChvcHRzLmxvY0VuZChzdGFydE5vZGUsIG9wdHMubG9jRW5kKSwgb3B0cy5sb2NFbmQoZW5kTm9kZSwgb3B0cy5sb2NFbmQpKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmFuZ2VTdGFydCxcbiAgICAgIHJhbmdlRW5kXG4gICAgfTtcbiAgfVxuXG4gIHZhciByYW5nZVV0aWwgPSB7XG4gICAgY2FsY3VsYXRlUmFuZ2UsXG4gICAgZmluZE5vZGVBdE9mZnNldFxuICB9O1xuXG4gIHZhciBkaWZmID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShpbmRleF9lczYpO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZU9wdGlvbnMkMSA9IG9wdGlvbnMkMS5ub3JtYWxpemU7XG4gIGNvbnN0IHtcbiAgICBndWVzc0VuZE9mTGluZTogZ3Vlc3NFbmRPZkxpbmUkMSxcbiAgICBjb252ZXJ0RW5kT2ZMaW5lVG9DaGFyczogY29udmVydEVuZE9mTGluZVRvQ2hhcnMkMlxuICB9ID0gZW5kT2ZMaW5lO1xuICBjb25zdCB7XG4gICAgcHJpbnRlcjoge1xuICAgICAgcHJpbnREb2NUb1N0cmluZzogcHJpbnREb2NUb1N0cmluZyQxXG4gICAgfSxcbiAgICBkZWJ1Zzoge1xuICAgICAgcHJpbnREb2NUb0RlYnVnXG4gICAgfVxuICB9ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IEJPTSA9IFwiXFx1RkVGRlwiO1xuICBjb25zdCBDVVJTT1IgPSBTeW1ib2woXCJjdXJzb3JcIik7XG4gIGNvbnN0IFBMQUNFSE9MREVSUyA9IHtcbiAgICBjdXJzb3JPZmZzZXQ6IFwiPDw8UFJFVFRJRVJfQ1VSU09SPj4+XCIsXG4gICAgcmFuZ2VTdGFydDogXCI8PDxQUkVUVElFUl9SQU5HRV9TVEFSVD4+PlwiLFxuICAgIHJhbmdlRW5kOiBcIjw8PFBSRVRUSUVSX1JBTkdFX0VORD4+PlwiXG4gIH07XG5cbiAgZnVuY3Rpb24gZW5zdXJlQWxsQ29tbWVudHNQcmludGVkKGFzdENvbW1lbnRzKSB7XG4gICAgaWYgKCFhc3RDb21tZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXN0Q29tbWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICh1dGlsJDEuaXNOb2RlSWdub3JlQ29tbWVudChhc3RDb21tZW50c1tpXSkpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhIHByZXR0aWVyLWlnbm9yZSwgd2UncmUgbm90IHByaW50aW5nIHRoYXQgc3ViLXRyZWUgc28gd2VcbiAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB0aGUgY29tbWVudHMgd2FzIHByaW50ZWQgb3Igbm90LlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN0Q29tbWVudHMuZm9yRWFjaChjb21tZW50ID0+IHtcbiAgICAgIGlmICghY29tbWVudC5wcmludGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tbWVudCBcIicgKyBjb21tZW50LnZhbHVlLnRyaW0oKSArICdcIiB3YXMgbm90IHByaW50ZWQuIFBsZWFzZSByZXBvcnQgdGhpcyBlcnJvciEnKTtcbiAgICAgIH1cblxuICAgICAgZGVsZXRlIGNvbW1lbnQucHJpbnRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0dGFjaENvbW1lbnRzKHRleHQsIGFzdCwgb3B0cykge1xuICAgIGNvbnN0IGFzdENvbW1lbnRzID0gYXN0LmNvbW1lbnRzO1xuXG4gICAgaWYgKGFzdENvbW1lbnRzKSB7XG4gICAgICBkZWxldGUgYXN0LmNvbW1lbnRzO1xuICAgICAgY29tbWVudHMuYXR0YWNoKGFzdENvbW1lbnRzLCBhc3QsIHRleHQsIG9wdHMpO1xuICAgIH1cblxuICAgIGFzdC50b2tlbnMgPSBbXTtcbiAgICBvcHRzLm9yaWdpbmFsVGV4dCA9IG9wdHMucGFyc2VyID09PSBcInlhbWxcIiA/IHRleHQgOiB0ZXh0LnRyaW1FbmQoKTtcbiAgICByZXR1cm4gYXN0Q29tbWVudHM7XG4gIH1cblxuICBmdW5jdGlvbiBjb3JlRm9ybWF0KHRleHQsIG9wdHMsIGFkZEFsaWdubWVudFNpemUpIHtcbiAgICBpZiAoIXRleHQgfHwgIXRleHQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0dGVkOiBcIlwiLFxuICAgICAgICBjdXJzb3JPZmZzZXQ6IDBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgYWRkQWxpZ25tZW50U2l6ZSA9IGFkZEFsaWdubWVudFNpemUgfHwgMDtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZXIucGFyc2UodGV4dCwgb3B0cyk7XG4gICAgY29uc3Qge1xuICAgICAgYXN0XG4gICAgfSA9IHBhcnNlZDtcbiAgICB0ZXh0ID0gcGFyc2VkLnRleHQ7XG5cbiAgICBpZiAob3B0cy5jdXJzb3JPZmZzZXQgPj0gMCkge1xuICAgICAgY29uc3Qgbm9kZVJlc3VsdCA9IHJhbmdlVXRpbC5maW5kTm9kZUF0T2Zmc2V0KGFzdCwgb3B0cy5jdXJzb3JPZmZzZXQsIG9wdHMpO1xuXG4gICAgICBpZiAobm9kZVJlc3VsdCAmJiBub2RlUmVzdWx0Lm5vZGUpIHtcbiAgICAgICAgb3B0cy5jdXJzb3JOb2RlID0gbm9kZVJlc3VsdC5ub2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFzdENvbW1lbnRzID0gYXR0YWNoQ29tbWVudHModGV4dCwgYXN0LCBvcHRzKTtcbiAgICBjb25zdCBkb2MgPSBhc3RUb0RvYyhhc3QsIG9wdHMsIGFkZEFsaWdubWVudFNpemUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHByaW50RG9jVG9TdHJpbmckMShkb2MsIG9wdHMpO1xuICAgIGVuc3VyZUFsbENvbW1lbnRzUHJpbnRlZChhc3RDb21tZW50cyk7IC8vIFJlbW92ZSBleHRyYSBsZWFkaW5nIGluZGVudGF0aW9uIGFzIHdlbGwgYXMgdGhlIGFkZGVkIGluZGVudGF0aW9uIGFmdGVyIGxhc3QgbmV3bGluZVxuXG4gICAgaWYgKGFkZEFsaWdubWVudFNpemUgPiAwKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gcmVzdWx0LmZvcm1hdHRlZC50cmltKCk7XG5cbiAgICAgIGlmIChyZXN1bHQuY3Vyc29yTm9kZVN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0LmN1cnNvck5vZGVTdGFydCAtPSByZXN1bHQuZm9ybWF0dGVkLmluZGV4T2YodHJpbW1lZCk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC5mb3JtYXR0ZWQgPSB0cmltbWVkICsgY29udmVydEVuZE9mTGluZVRvQ2hhcnMkMihvcHRzLmVuZE9mTGluZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY3Vyc29yT2Zmc2V0ID49IDApIHtcbiAgICAgIGxldCBvbGRDdXJzb3JOb2RlU3RhcnQ7XG4gICAgICBsZXQgb2xkQ3Vyc29yTm9kZVRleHQ7XG4gICAgICBsZXQgY3Vyc29yT2Zmc2V0UmVsYXRpdmVUb09sZEN1cnNvck5vZGU7XG4gICAgICBsZXQgbmV3Q3Vyc29yTm9kZVN0YXJ0O1xuICAgICAgbGV0IG5ld0N1cnNvck5vZGVUZXh0O1xuXG4gICAgICBpZiAob3B0cy5jdXJzb3JOb2RlICYmIHJlc3VsdC5jdXJzb3JOb2RlVGV4dCkge1xuICAgICAgICBvbGRDdXJzb3JOb2RlU3RhcnQgPSBvcHRzLmxvY1N0YXJ0KG9wdHMuY3Vyc29yTm9kZSk7XG4gICAgICAgIG9sZEN1cnNvck5vZGVUZXh0ID0gdGV4dC5zbGljZShvbGRDdXJzb3JOb2RlU3RhcnQsIG9wdHMubG9jRW5kKG9wdHMuY3Vyc29yTm9kZSkpO1xuICAgICAgICBjdXJzb3JPZmZzZXRSZWxhdGl2ZVRvT2xkQ3Vyc29yTm9kZSA9IG9wdHMuY3Vyc29yT2Zmc2V0IC0gb2xkQ3Vyc29yTm9kZVN0YXJ0O1xuICAgICAgICBuZXdDdXJzb3JOb2RlU3RhcnQgPSByZXN1bHQuY3Vyc29yTm9kZVN0YXJ0O1xuICAgICAgICBuZXdDdXJzb3JOb2RlVGV4dCA9IHJlc3VsdC5jdXJzb3JOb2RlVGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9sZEN1cnNvck5vZGVTdGFydCA9IDA7XG4gICAgICAgIG9sZEN1cnNvck5vZGVUZXh0ID0gdGV4dDtcbiAgICAgICAgY3Vyc29yT2Zmc2V0UmVsYXRpdmVUb09sZEN1cnNvck5vZGUgPSBvcHRzLmN1cnNvck9mZnNldDtcbiAgICAgICAgbmV3Q3Vyc29yTm9kZVN0YXJ0ID0gMDtcbiAgICAgICAgbmV3Q3Vyc29yTm9kZVRleHQgPSByZXN1bHQuZm9ybWF0dGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkQ3Vyc29yTm9kZVRleHQgPT09IG5ld0N1cnNvck5vZGVUZXh0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9ybWF0dGVkOiByZXN1bHQuZm9ybWF0dGVkLFxuICAgICAgICAgIGN1cnNvck9mZnNldDogbmV3Q3Vyc29yTm9kZVN0YXJ0ICsgY3Vyc29yT2Zmc2V0UmVsYXRpdmVUb09sZEN1cnNvck5vZGVcbiAgICAgICAgfTtcbiAgICAgIH0gLy8gZGlmZiBvbGQgYW5kIG5ldyBjdXJzb3Igbm9kZSB0ZXh0cywgd2l0aCBhIHNwZWNpYWwgY3Vyc29yXG4gICAgICAvLyBzeW1ib2wgaW5zZXJ0ZWQgdG8gZmluZCBvdXQgd2hlcmUgaXQgbW92ZXMgdG9cblxuXG4gICAgICBjb25zdCBvbGRDdXJzb3JOb2RlQ2hhckFycmF5ID0gb2xkQ3Vyc29yTm9kZVRleHQuc3BsaXQoXCJcIik7XG4gICAgICBvbGRDdXJzb3JOb2RlQ2hhckFycmF5LnNwbGljZShjdXJzb3JPZmZzZXRSZWxhdGl2ZVRvT2xkQ3Vyc29yTm9kZSwgMCwgQ1VSU09SKTtcbiAgICAgIGNvbnN0IG5ld0N1cnNvck5vZGVDaGFyQXJyYXkgPSBuZXdDdXJzb3JOb2RlVGV4dC5zcGxpdChcIlwiKTtcbiAgICAgIGNvbnN0IGN1cnNvck5vZGVEaWZmID0gZGlmZi5kaWZmQXJyYXlzKG9sZEN1cnNvck5vZGVDaGFyQXJyYXksIG5ld0N1cnNvck5vZGVDaGFyQXJyYXkpO1xuICAgICAgbGV0IGN1cnNvck9mZnNldCA9IG5ld0N1cnNvck5vZGVTdGFydDtcblxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjdXJzb3JOb2RlRGlmZikge1xuICAgICAgICBpZiAoZW50cnkucmVtb3ZlZCkge1xuICAgICAgICAgIGlmIChlbnRyeS52YWx1ZS5pbmNsdWRlcyhDVVJTT1IpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3Vyc29yT2Zmc2V0ICs9IGVudHJ5LmNvdW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdHRlZDogcmVzdWx0LmZvcm1hdHRlZCxcbiAgICAgICAgY3Vyc29yT2Zmc2V0XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXR0ZWQ6IHJlc3VsdC5mb3JtYXR0ZWRcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UmFuZ2UodGV4dCwgb3B0cykge1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlci5wYXJzZSh0ZXh0LCBvcHRzKTtcbiAgICBjb25zdCB7XG4gICAgICBhc3RcbiAgICB9ID0gcGFyc2VkO1xuICAgIHRleHQgPSBwYXJzZWQudGV4dDtcbiAgICBjb25zdCByYW5nZSA9IHJhbmdlVXRpbC5jYWxjdWxhdGVSYW5nZSh0ZXh0LCBvcHRzLCBhc3QpO1xuICAgIGNvbnN0IHtcbiAgICAgIHJhbmdlU3RhcnQsXG4gICAgICByYW5nZUVuZFxuICAgIH0gPSByYW5nZTtcbiAgICBjb25zdCByYW5nZVN0cmluZyA9IHRleHQuc2xpY2UocmFuZ2VTdGFydCwgcmFuZ2VFbmQpOyAvLyBUcnkgdG8gZXh0ZW5kIHRoZSByYW5nZSBiYWNrd2FyZHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS5cbiAgICAvLyBUaGlzIGlzIHNvIHdlIGNhbiBkZXRlY3QgaW5kZW50YXRpb24gY29ycmVjdGx5IGFuZCByZXN0b3JlIGl0LlxuICAgIC8vIFVzZSBgTWF0aC5taW5gIHNpbmNlIGBsYXN0SW5kZXhPZmAgcmV0dXJucyAwIHdoZW4gYHJhbmdlU3RhcnRgIGlzIDBcblxuICAgIGNvbnN0IHJhbmdlU3RhcnQyID0gTWF0aC5taW4ocmFuZ2VTdGFydCwgdGV4dC5sYXN0SW5kZXhPZihcIlxcblwiLCByYW5nZVN0YXJ0KSArIDEpO1xuICAgIGNvbnN0IGluZGVudFN0cmluZyA9IHRleHQuc2xpY2UocmFuZ2VTdGFydDIsIHJhbmdlU3RhcnQpO1xuICAgIGNvbnN0IGFsaWdubWVudFNpemUgPSB1dGlsJDEuZ2V0QWxpZ25tZW50U2l6ZShpbmRlbnRTdHJpbmcsIG9wdHMudGFiV2lkdGgpO1xuICAgIGNvbnN0IHJhbmdlUmVzdWx0ID0gY29yZUZvcm1hdChyYW5nZVN0cmluZywgT2JqZWN0LmFzc2lnbih7fSwgb3B0cywge1xuICAgICAgcmFuZ2VTdGFydDogMCxcbiAgICAgIHJhbmdlRW5kOiBJbmZpbml0eSxcbiAgICAgIC8vIHRyYWNrIHRoZSBjdXJzb3Igb2Zmc2V0IG9ubHkgaWYgaXQncyB3aXRoaW4gb3VyIHJhbmdlXG4gICAgICBjdXJzb3JPZmZzZXQ6IG9wdHMuY3Vyc29yT2Zmc2V0ID49IHJhbmdlU3RhcnQgJiYgb3B0cy5jdXJzb3JPZmZzZXQgPCByYW5nZUVuZCA/IG9wdHMuY3Vyc29yT2Zmc2V0IC0gcmFuZ2VTdGFydCA6IC0xXG4gICAgfSksIGFsaWdubWVudFNpemUpOyAvLyBTaW5jZSB0aGUgcmFuZ2UgY29udHJhY3RzIHRvIGF2b2lkIHRyYWlsaW5nIHdoaXRlc3BhY2UsXG4gICAgLy8gd2UgbmVlZCB0byByZW1vdmUgdGhlIG5ld2xpbmUgdGhhdCB3YXMgaW5zZXJ0ZWQgYnkgdGhlIGBmb3JtYXRgIGNhbGwuXG5cbiAgICBjb25zdCByYW5nZVRyaW1tZWQgPSByYW5nZVJlc3VsdC5mb3JtYXR0ZWQudHJpbUVuZCgpO1xuICAgIGNvbnN0IHJhbmdlTGVmdCA9IHRleHQuc2xpY2UoMCwgcmFuZ2VTdGFydCk7XG4gICAgY29uc3QgcmFuZ2VSaWdodCA9IHRleHQuc2xpY2UocmFuZ2VFbmQpO1xuICAgIGxldCB7XG4gICAgICBjdXJzb3JPZmZzZXRcbiAgICB9ID0gb3B0cztcblxuICAgIGlmIChvcHRzLmN1cnNvck9mZnNldCA+PSByYW5nZUVuZCkge1xuICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjdXJzb3Igd2FzIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2VcbiAgICAgIGN1cnNvck9mZnNldCA9IG9wdHMuY3Vyc29yT2Zmc2V0IC0gcmFuZ2VFbmQgKyAocmFuZ2VTdGFydCArIHJhbmdlVHJpbW1lZC5sZW5ndGgpO1xuICAgIH0gZWxzZSBpZiAocmFuZ2VSZXN1bHQuY3Vyc29yT2Zmc2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgY3Vyc29yIHdhcyBpbiB0aGUgcmFuZ2VcbiAgICAgIGN1cnNvck9mZnNldCA9IHJhbmdlUmVzdWx0LmN1cnNvck9mZnNldCArIHJhbmdlU3RhcnQ7XG4gICAgfSAvLyBrZWVwIHRoZSBjdXJzb3IgYXMgaXQgd2FzIGlmIGl0IHdhcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZVxuXG5cbiAgICBsZXQgZm9ybWF0dGVkO1xuXG4gICAgaWYgKG9wdHMuZW5kT2ZMaW5lID09PSBcImxmXCIpIHtcbiAgICAgIGZvcm1hdHRlZCA9IHJhbmdlTGVmdCArIHJhbmdlVHJpbW1lZCArIHJhbmdlUmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVvbCA9IGNvbnZlcnRFbmRPZkxpbmVUb0NoYXJzJDIob3B0cy5lbmRPZkxpbmUpO1xuXG4gICAgICBpZiAoY3Vyc29yT2Zmc2V0ID49IDApIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbcmFuZ2VMZWZ0LCByYW5nZVRyaW1tZWQsIHJhbmdlUmlnaHRdO1xuICAgICAgICBsZXQgcGFydEluZGV4ID0gMDtcbiAgICAgICAgbGV0IHBhcnRPZmZzZXQgPSBjdXJzb3JPZmZzZXQ7XG5cbiAgICAgICAgd2hpbGUgKHBhcnRJbmRleCA8IHBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1twYXJ0SW5kZXhdO1xuXG4gICAgICAgICAgaWYgKHBhcnRPZmZzZXQgPCBwYXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcGFydHNbcGFydEluZGV4XSA9IHBhcnRzW3BhcnRJbmRleF0uc2xpY2UoMCwgcGFydE9mZnNldCkgKyBQTEFDRUhPTERFUlMuY3Vyc29yT2Zmc2V0ICsgcGFydHNbcGFydEluZGV4XS5zbGljZShwYXJ0T2Zmc2V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRJbmRleCsrO1xuICAgICAgICAgIHBhcnRPZmZzZXQgLT0gcGFydC5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbbmV3UmFuZ2VMZWZ0LCBuZXdSYW5nZVRyaW1tZWQsIG5ld1JhbmdlUmlnaHRdID0gcGFydHM7XG4gICAgICAgIGZvcm1hdHRlZCA9IChuZXdSYW5nZUxlZnQucmVwbGFjZSgvXFxuL2csIGVvbCkgKyBuZXdSYW5nZVRyaW1tZWQgKyBuZXdSYW5nZVJpZ2h0LnJlcGxhY2UoL1xcbi9nLCBlb2wpKS5yZXBsYWNlKFBMQUNFSE9MREVSUy5jdXJzb3JPZmZzZXQsIChfLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGN1cnNvck9mZnNldCA9IGluZGV4O1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1hdHRlZCA9IHJhbmdlTGVmdC5yZXBsYWNlKC9cXG4vZywgZW9sKSArIHJhbmdlVHJpbW1lZCArIHJhbmdlUmlnaHQucmVwbGFjZSgvXFxuL2csIGVvbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1hdHRlZCxcbiAgICAgIGN1cnNvck9mZnNldFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXQodGV4dCwgb3B0cykge1xuICAgIGNvbnN0IHNlbGVjdGVkUGFyc2VyID0gcGFyc2VyLnJlc29sdmVQYXJzZXIob3B0cyk7XG4gICAgY29uc3QgaGFzUHJhZ21hID0gIXNlbGVjdGVkUGFyc2VyLmhhc1ByYWdtYSB8fCBzZWxlY3RlZFBhcnNlci5oYXNQcmFnbWEodGV4dCk7XG5cbiAgICBpZiAob3B0cy5yZXF1aXJlUHJhZ21hICYmICFoYXNQcmFnbWEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdHRlZDogdGV4dFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5lbmRPZkxpbmUgPT09IFwiYXV0b1wiKSB7XG4gICAgICBvcHRzLmVuZE9mTGluZSA9IGd1ZXNzRW5kT2ZMaW5lJDEodGV4dCk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQ3Vyc29yID0gb3B0cy5jdXJzb3JPZmZzZXQgPj0gMDtcbiAgICBjb25zdCBoYXNSYW5nZVN0YXJ0ID0gb3B0cy5yYW5nZVN0YXJ0ID4gMDtcbiAgICBjb25zdCBoYXNSYW5nZUVuZCA9IG9wdHMucmFuZ2VFbmQgPCB0ZXh0Lmxlbmd0aDsgLy8gZ2V0IHJpZCBvZiBDUi9DUkxGIHBhcnNpbmdcblxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKFwiXFxyXCIpKSB7XG4gICAgICBjb25zdCBvZmZzZXRLZXlzID0gW2hhc0N1cnNvciAmJiBcImN1cnNvck9mZnNldFwiLCBoYXNSYW5nZVN0YXJ0ICYmIFwicmFuZ2VTdGFydFwiLCBoYXNSYW5nZUVuZCAmJiBcInJhbmdlRW5kXCJdLmZpbHRlcihCb29sZWFuKS5zb3J0KChhS2V5LCBiS2V5KSA9PiBvcHRzW2FLZXldIC0gb3B0c1tiS2V5XSk7XG5cbiAgICAgIGZvciAobGV0IGkgPSBvZmZzZXRLZXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG9mZnNldEtleXNbaV07XG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIG9wdHNba2V5XSkgKyBQTEFDRUhPTERFUlNba2V5XSArIHRleHQuc2xpY2Uob3B0c1trZXldKTtcbiAgICAgIH1cblxuICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmZzZXRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG9mZnNldEtleXNbaV07XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoUExBQ0VIT0xERVJTW2tleV0sIChfLCBpbmRleCkgPT4ge1xuICAgICAgICAgIG9wdHNba2V5XSA9IGluZGV4O1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYXNVbmljb2RlQk9NID0gdGV4dC5jaGFyQXQoMCkgPT09IEJPTTtcblxuICAgIGlmIChoYXNVbmljb2RlQk9NKSB7XG4gICAgICB0ZXh0ID0gdGV4dC5zbGljZSgxKTtcblxuICAgICAgaWYgKGhhc0N1cnNvcikge1xuICAgICAgICBvcHRzLmN1cnNvck9mZnNldCsrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzUmFuZ2VTdGFydCkge1xuICAgICAgICBvcHRzLnJhbmdlU3RhcnQrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1JhbmdlRW5kKSB7XG4gICAgICAgIG9wdHMucmFuZ2VFbmQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWhhc0N1cnNvcikge1xuICAgICAgb3B0cy5jdXJzb3JPZmZzZXQgPSAtMTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yYW5nZVN0YXJ0IDwgMCkge1xuICAgICAgb3B0cy5yYW5nZVN0YXJ0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yYW5nZUVuZCA+IHRleHQubGVuZ3RoKSB7XG4gICAgICBvcHRzLnJhbmdlRW5kID0gdGV4dC5sZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gaGFzUmFuZ2VTdGFydCB8fCBoYXNSYW5nZUVuZCA/IGZvcm1hdFJhbmdlKHRleHQsIG9wdHMpIDogY29yZUZvcm1hdChvcHRzLmluc2VydFByYWdtYSAmJiBvcHRzLnByaW50ZXIuaW5zZXJ0UHJhZ21hICYmICFoYXNQcmFnbWEgPyBvcHRzLnByaW50ZXIuaW5zZXJ0UHJhZ21hKHRleHQpIDogdGV4dCwgb3B0cyk7XG5cbiAgICBpZiAoaGFzVW5pY29kZUJPTSkge1xuICAgICAgcmVzdWx0LmZvcm1hdHRlZCA9IEJPTSArIHJlc3VsdC5mb3JtYXR0ZWQ7XG5cbiAgICAgIGlmIChoYXNDdXJzb3IpIHtcbiAgICAgICAgcmVzdWx0LmN1cnNvck9mZnNldCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgY29yZSA9IHtcbiAgICBmb3JtYXRXaXRoQ3Vyc29yKHRleHQsIG9wdHMpIHtcbiAgICAgIG9wdHMgPSBub3JtYWxpemVPcHRpb25zJDEob3B0cyk7XG4gICAgICByZXR1cm4gZm9ybWF0KHRleHQsIG9wdHMpO1xuICAgIH0sXG5cbiAgICBwYXJzZSh0ZXh0LCBvcHRzLCBtYXNzYWdlKSB7XG4gICAgICBvcHRzID0gbm9ybWFsaXplT3B0aW9ucyQxKG9wdHMpO1xuXG4gICAgICBpZiAodGV4dC5pbmNsdWRlcyhcIlxcclwiKSkge1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZXIucGFyc2UodGV4dCwgb3B0cyk7XG5cbiAgICAgIGlmIChtYXNzYWdlKSB7XG4gICAgICAgIHBhcnNlZC5hc3QgPSBtYXNzYWdlQXN0KHBhcnNlZC5hc3QsIG9wdHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH0sXG5cbiAgICBmb3JtYXRBU1QoYXN0LCBvcHRzKSB7XG4gICAgICBvcHRzID0gbm9ybWFsaXplT3B0aW9ucyQxKG9wdHMpO1xuICAgICAgY29uc3QgZG9jID0gYXN0VG9Eb2MoYXN0LCBvcHRzKTtcbiAgICAgIHJldHVybiBwcmludERvY1RvU3RyaW5nJDEoZG9jLCBvcHRzKTtcbiAgICB9LFxuXG4gICAgLy8gRG9lc24ndCBoYW5kbGUgc2hlYmFuZyBmb3Igbm93XG4gICAgZm9ybWF0RG9jKGRvYywgb3B0cykge1xuICAgICAgY29uc3QgZGVidWcgPSBwcmludERvY1RvRGVidWcoZG9jKTtcbiAgICAgIG9wdHMgPSBub3JtYWxpemVPcHRpb25zJDEoT2JqZWN0LmFzc2lnbih7fSwgb3B0cywge1xuICAgICAgICBwYXJzZXI6IFwiYmFiZWxcIlxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIGZvcm1hdChkZWJ1Zywgb3B0cykuZm9ybWF0dGVkO1xuICAgIH0sXG5cbiAgICBwcmludFRvRG9jKHRleHQsIG9wdHMpIHtcbiAgICAgIG9wdHMgPSBub3JtYWxpemVPcHRpb25zJDEob3B0cyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZXIucGFyc2UodGV4dCwgb3B0cyk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFzdFxuICAgICAgfSA9IHBhcnNlZDtcbiAgICAgIHRleHQgPSBwYXJzZWQudGV4dDtcbiAgICAgIGF0dGFjaENvbW1lbnRzKHRleHQsIGFzdCwgb3B0cyk7XG4gICAgICByZXR1cm4gYXN0VG9Eb2MoYXN0LCBvcHRzKTtcbiAgICB9LFxuXG4gICAgcHJpbnREb2NUb1N0cmluZyhkb2MsIG9wdHMpIHtcbiAgICAgIHJldHVybiBwcmludERvY1RvU3RyaW5nJDEoZG9jLCBub3JtYWxpemVPcHRpb25zJDEob3B0cykpO1xuICAgIH1cblxuICB9O1xuXG4gIGZ1bmN0aW9uIGNsZWFuKGFzdCwgbmV3T2JqLCBwYXJlbnQpIHtcbiAgICBbXCJyYXdcIiwgLy8gZnJvbnQtbWF0dGVyXG4gICAgXCJyYXdzXCIsIFwic291cmNlSW5kZXhcIiwgXCJzb3VyY2VcIiwgXCJiZWZvcmVcIiwgXCJhZnRlclwiLCBcInRyYWlsaW5nQ29tbWFcIl0uZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGRlbGV0ZSBuZXdPYmpbbmFtZV07XG4gICAgfSk7XG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwieWFtbFwiKSB7XG4gICAgICBkZWxldGUgbmV3T2JqLnZhbHVlO1xuICAgIH0gLy8gLS1pbnNlcnQtcHJhZ21hXG5cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJjc3MtY29tbWVudFwiICYmIHBhcmVudC50eXBlID09PSBcImNzcy1yb290XCIgJiYgcGFyZW50Lm5vZGVzLmxlbmd0aCAhPT0gMCAmJiAoIC8vIGZpcnN0IG5vbi1mcm9udC1tYXR0ZXIgY29tbWVudFxuICAgIHBhcmVudC5ub2Rlc1swXSA9PT0gYXN0IHx8IChwYXJlbnQubm9kZXNbMF0udHlwZSA9PT0gXCJ5YW1sXCIgfHwgcGFyZW50Lm5vZGVzWzBdLnR5cGUgPT09IFwidG9tbFwiKSAmJiBwYXJlbnQubm9kZXNbMV0gPT09IGFzdCkpIHtcbiAgICAgIC8qKlxuICAgICAgICogc29tZXRoaW5nXG4gICAgICAgKlxuICAgICAgICogQGZvcm1hdFxuICAgICAgICovXG4gICAgICBkZWxldGUgbmV3T2JqLnRleHQ7IC8vIHN0YW5kYWxvbmUgcHJhZ21hXG5cbiAgICAgIGlmICgvXlxcKlxccypAKGZvcm1hdHxwcmV0dGllcilcXHMqJC8udGVzdChhc3QudGV4dCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFzdC50eXBlID09PSBcIm1lZGlhLXF1ZXJ5XCIgfHwgYXN0LnR5cGUgPT09IFwibWVkaWEtcXVlcnktbGlzdFwiIHx8IGFzdC50eXBlID09PSBcIm1lZGlhLWZlYXR1cmUtZXhwcmVzc2lvblwiKSB7XG4gICAgICBkZWxldGUgbmV3T2JqLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJjc3MtcnVsZVwiKSB7XG4gICAgICBkZWxldGUgbmV3T2JqLnBhcmFtcztcbiAgICB9XG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwic2VsZWN0b3ItY29tYmluYXRvclwiKSB7XG4gICAgICBuZXdPYmoudmFsdWUgPSBuZXdPYmoudmFsdWUucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG4gICAgfVxuXG4gICAgaWYgKGFzdC50eXBlID09PSBcIm1lZGlhLWZlYXR1cmVcIikge1xuICAgICAgbmV3T2JqLnZhbHVlID0gbmV3T2JqLnZhbHVlLnJlcGxhY2UoLyAvZywgXCJcIik7XG4gICAgfVxuXG4gICAgaWYgKGFzdC50eXBlID09PSBcInZhbHVlLXdvcmRcIiAmJiAoYXN0LmlzQ29sb3IgJiYgYXN0LmlzSGV4IHx8IFtcImluaXRpYWxcIiwgXCJpbmhlcml0XCIsIFwidW5zZXRcIiwgXCJyZXZlcnRcIl0uaW5jbHVkZXMobmV3T2JqLnZhbHVlLnJlcGxhY2UoKS50b0xvd2VyQ2FzZSgpKSkgfHwgYXN0LnR5cGUgPT09IFwibWVkaWEtZmVhdHVyZVwiIHx8IGFzdC50eXBlID09PSBcInNlbGVjdG9yLXJvb3QtaW52YWxpZFwiIHx8IGFzdC50eXBlID09PSBcInNlbGVjdG9yLXBzZXVkb1wiKSB7XG4gICAgICBuZXdPYmoudmFsdWUgPSBuZXdPYmoudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwiY3NzLWRlY2xcIikge1xuICAgICAgbmV3T2JqLnByb3AgPSBuZXdPYmoucHJvcC50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJjc3MtYXRydWxlXCIgfHwgYXN0LnR5cGUgPT09IFwiY3NzLWltcG9ydFwiKSB7XG4gICAgICBuZXdPYmoubmFtZSA9IG5ld09iai5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKGFzdC50eXBlID09PSBcInZhbHVlLW51bWJlclwiKSB7XG4gICAgICBuZXdPYmoudW5pdCA9IG5ld09iai51bml0LnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKChhc3QudHlwZSA9PT0gXCJtZWRpYS1mZWF0dXJlXCIgfHwgYXN0LnR5cGUgPT09IFwibWVkaWEta2V5d29yZFwiIHx8IGFzdC50eXBlID09PSBcIm1lZGlhLXR5cGVcIiB8fCBhc3QudHlwZSA9PT0gXCJtZWRpYS11bmtub3duXCIgfHwgYXN0LnR5cGUgPT09IFwibWVkaWEtdXJsXCIgfHwgYXN0LnR5cGUgPT09IFwibWVkaWEtdmFsdWVcIiB8fCBhc3QudHlwZSA9PT0gXCJzZWxlY3Rvci1hdHRyaWJ1dGVcIiB8fCBhc3QudHlwZSA9PT0gXCJzZWxlY3Rvci1zdHJpbmdcIiB8fCBhc3QudHlwZSA9PT0gXCJzZWxlY3Rvci1jbGFzc1wiIHx8IGFzdC50eXBlID09PSBcInNlbGVjdG9yLWNvbWJpbmF0b3JcIiB8fCBhc3QudHlwZSA9PT0gXCJ2YWx1ZS1zdHJpbmdcIikgJiYgbmV3T2JqLnZhbHVlKSB7XG4gICAgICBuZXdPYmoudmFsdWUgPSBjbGVhbkNTU1N0cmluZ3MobmV3T2JqLnZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwic2VsZWN0b3ItYXR0cmlidXRlXCIpIHtcbiAgICAgIG5ld09iai5hdHRyaWJ1dGUgPSBuZXdPYmouYXR0cmlidXRlLnRyaW0oKTtcblxuICAgICAgaWYgKG5ld09iai5uYW1lc3BhY2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdPYmoubmFtZXNwYWNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgbmV3T2JqLm5hbWVzcGFjZSA9IG5ld09iai5uYW1lc3BhY2UudHJpbSgpO1xuXG4gICAgICAgICAgaWYgKG5ld09iai5uYW1lc3BhY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBuZXdPYmoubmFtZXNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5ld09iai52YWx1ZSkge1xuICAgICAgICBuZXdPYmoudmFsdWUgPSBuZXdPYmoudmFsdWUudHJpbSgpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgXCJcIik7XG4gICAgICAgIGRlbGV0ZSBuZXdPYmoucXVvdGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoYXN0LnR5cGUgPT09IFwibWVkaWEtdmFsdWVcIiB8fCBhc3QudHlwZSA9PT0gXCJtZWRpYS10eXBlXCIgfHwgYXN0LnR5cGUgPT09IFwidmFsdWUtbnVtYmVyXCIgfHwgYXN0LnR5cGUgPT09IFwic2VsZWN0b3Itcm9vdC1pbnZhbGlkXCIgfHwgYXN0LnR5cGUgPT09IFwic2VsZWN0b3ItY2xhc3NcIiB8fCBhc3QudHlwZSA9PT0gXCJzZWxlY3Rvci1jb21iaW5hdG9yXCIgfHwgYXN0LnR5cGUgPT09IFwic2VsZWN0b3ItdGFnXCIpICYmIG5ld09iai52YWx1ZSkge1xuICAgICAgbmV3T2JqLnZhbHVlID0gbmV3T2JqLnZhbHVlLnJlcGxhY2UoLyhbXFxkLmVFKy1dKykoW2EtekEtWl0qKS9nLCAobWF0Y2gsIG51bVN0ciwgdW5pdCkgPT4ge1xuICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIobnVtU3RyKTtcbiAgICAgICAgcmV0dXJuIGlzTmFOKG51bSkgPyBtYXRjaCA6IG51bSArIHVuaXQudG9Mb3dlckNhc2UoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJzZWxlY3Rvci10YWdcIikge1xuICAgICAgY29uc3QgbG93ZXJjYXNlZFZhbHVlID0gYXN0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChbXCJmcm9tXCIsIFwidG9cIl0uaW5jbHVkZXMobG93ZXJjYXNlZFZhbHVlKSkge1xuICAgICAgICBuZXdPYmoudmFsdWUgPSBsb3dlcmNhc2VkVmFsdWU7XG4gICAgICB9XG4gICAgfSAvLyBXb3JrYXJvdW5kIHdoZW4gYHBvc3Rjc3MtdmFsdWVzLXBhcnNlcmAgcGFyc2UgYG5vdGAsIGBhbmRgIG9yIGBvcmAga2V5d29yZHMgYXMgYHZhbHVlLWZ1bmNgXG5cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJjc3MtYXRydWxlXCIgJiYgYXN0Lm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdXBwb3J0c1wiKSB7XG4gICAgICBkZWxldGUgbmV3T2JqLnZhbHVlO1xuICAgIH0gLy8gV29ya2Fyb3VuZCBmb3IgU0NTUyBuZXN0ZWQgcHJvcGVydGllc1xuXG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwic2VsZWN0b3ItdW5rbm93blwiKSB7XG4gICAgICBkZWxldGUgbmV3T2JqLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFuQ1NTU3RyaW5ncyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8nL2csICdcIicpLnJlcGxhY2UoL1xcXFwoW15hLWZBLUZcXGRdKS9nLCBcIiQxXCIpO1xuICB9XG5cbiAgdmFyIGNsZWFuXzEgPSBjbGVhbjtcblxuICBjb25zdCB7XG4gICAgYnVpbGRlcnM6IHtcbiAgICAgIGhhcmRsaW5lOiBoYXJkbGluZSQzLFxuICAgICAgbGl0ZXJhbGxpbmU6IGxpdGVyYWxsaW5lJDEsXG4gICAgICBjb25jYXQ6IGNvbmNhdCQ0LFxuICAgICAgbWFya0FzUm9vdDogbWFya0FzUm9vdCQxXG4gICAgfSxcbiAgICB1dGlsczoge1xuICAgICAgbWFwRG9jOiBtYXBEb2MkMVxuICAgIH1cbiAgfSA9IGRvY3VtZW50O1xuXG4gIGZ1bmN0aW9uIGVtYmVkKHBhdGgsIHByaW50LCB0ZXh0VG9Eb2NcbiAgLyosIG9wdGlvbnMgKi9cbiAgKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcblxuICAgIGlmIChub2RlLnR5cGUgPT09IFwieWFtbFwiKSB7XG4gICAgICByZXR1cm4gbWFya0FzUm9vdCQxKGNvbmNhdCQ0KFtcIi0tLVwiLCBoYXJkbGluZSQzLCBub2RlLnZhbHVlLnRyaW0oKSA/IHJlcGxhY2VOZXdsaW5lc1dpdGhMaXRlcmFsbGluZXModGV4dFRvRG9jKG5vZGUudmFsdWUsIHtcbiAgICAgICAgcGFyc2VyOiBcInlhbWxcIlxuICAgICAgfSkpIDogXCJcIiwgXCItLS1cIiwgaGFyZGxpbmUkM10pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VOZXdsaW5lc1dpdGhMaXRlcmFsbGluZXMoZG9jKSB7XG4gICAgICByZXR1cm4gbWFwRG9jJDEoZG9jLCBjdXJyZW50RG9jID0+IHR5cGVvZiBjdXJyZW50RG9jID09PSBcInN0cmluZ1wiICYmIGN1cnJlbnREb2MuaW5jbHVkZXMoXCJcXG5cIikgPyBjb25jYXQkNChjdXJyZW50RG9jLnNwbGl0KC8oXFxuKS9nKS5tYXAoKHYsIGkpID0+IGkgJSAyID09PSAwID8gdiA6IGxpdGVyYWxsaW5lJDEpKSA6IGN1cnJlbnREb2MpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBlbWJlZF8xID0gZW1iZWQ7XG5cbiAgY29uc3QgZGV0ZWN0TmV3bGluZSA9IHN0cmluZyA9PiB7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld2xpbmVzID0gc3RyaW5nLm1hdGNoKC8oPzpcXHI/XFxuKS9nKSB8fCBbXTtcblxuICAgIGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcbiAgICBjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG4gICAgcmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG4gIH07XG5cbiAgdmFyIGRldGVjdE5ld2xpbmVfMSA9IGRldGVjdE5ld2xpbmU7XG5cbiAgdmFyIGdyYWNlZnVsID0gc3RyaW5nID0+IHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB8fCAnXFxuJztcbiAgZGV0ZWN0TmV3bGluZV8xLmdyYWNlZnVsID0gZ3JhY2VmdWw7XG5cbiAgdmFyIGJ1aWxkID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICAgICAgdmFsdWU6IHRydWVcbiAgICB9KTtcbiAgICBleHBvcnRzLmV4dHJhY3QgPSBleHRyYWN0O1xuICAgIGV4cG9ydHMuc3RyaXAgPSBzdHJpcDtcbiAgICBleHBvcnRzLnBhcnNlID0gcGFyc2U7XG4gICAgZXhwb3J0cy5wYXJzZVdpdGhDb21tZW50cyA9IHBhcnNlV2l0aENvbW1lbnRzO1xuICAgIGV4cG9ydHMucHJpbnQgPSBwcmludDtcblxuICAgIGZ1bmN0aW9uIF9vcygpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXF1aXJlJCQwJDE7XG5cbiAgICAgIF9vcyA9IGZ1bmN0aW9uIF9vcygpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfZGV0ZWN0TmV3bGluZSgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGRldGVjdE5ld2xpbmVfMSk7XG5cbiAgICAgIF9kZXRlY3ROZXdsaW5lID0gZnVuY3Rpb24gX2RldGVjdE5ld2xpbmUoKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgICAgIGRlZmF1bHQ6IG9ialxuICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAgICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gICAgICovXG5cblxuICAgIGNvbnN0IGNvbW1lbnRFbmRSZSA9IC9cXCpcXC8kLztcbiAgICBjb25zdCBjb21tZW50U3RhcnRSZSA9IC9eXFwvXFwqXFwqLztcbiAgICBjb25zdCBkb2NibG9ja1JlID0gL15cXHMqKFxcL1xcKlxcKj8oLnxcXHI/XFxuKSo/XFwqXFwvKS87XG4gICAgY29uc3QgbGluZUNvbW1lbnRSZSA9IC8oXnxcXHMrKVxcL1xcLyhbXlxcclxcbl0qKS9nO1xuICAgIGNvbnN0IGx0cmltTmV3bGluZVJlID0gL14oXFxyP1xcbikrLztcbiAgICBjb25zdCBtdWx0aWxpbmVSZSA9IC8oPzpefFxccj9cXG4pICooQFteXFxyXFxuXSo/KSAqXFxyP1xcbiAqKD8hW15AXFxyXFxuXSpcXC9cXC9bXl0qKShbXkBcXHJcXG5cXHNdW15AXFxyXFxuXSs/KSAqXFxyP1xcbi9nO1xuICAgIGNvbnN0IHByb3BlcnR5UmUgPSAvKD86XnxcXHI/XFxuKSAqQChcXFMrKSAqKFteXFxyXFxuXSopL2c7XG4gICAgY29uc3Qgc3RyaW5nU3RhcnRSZSA9IC8oXFxyP1xcbnxeKSAqXFwqID8vZztcblxuICAgIGZ1bmN0aW9uIGV4dHJhY3QoY29udGVudHMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gY29udGVudHMubWF0Y2goZG9jYmxvY2tSZSk7XG4gICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFswXS50cmltTGVmdCgpIDogJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RyaXAoY29udGVudHMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gY29udGVudHMubWF0Y2goZG9jYmxvY2tSZSk7XG4gICAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMF0gPyBjb250ZW50cy5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKSA6IGNvbnRlbnRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlKGRvY2Jsb2NrKSB7XG4gICAgICByZXR1cm4gcGFyc2VXaXRoQ29tbWVudHMoZG9jYmxvY2spLnByYWdtYXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VXaXRoQ29tbWVudHMoZG9jYmxvY2spIHtcbiAgICAgIGNvbnN0IGxpbmUgPSAoMCwgX2RldGVjdE5ld2xpbmUoKS5kZWZhdWx0KShkb2NibG9jaykgfHwgX29zKCkuRU9MO1xuXG4gICAgICBkb2NibG9jayA9IGRvY2Jsb2NrLnJlcGxhY2UoY29tbWVudFN0YXJ0UmUsICcnKS5yZXBsYWNlKGNvbW1lbnRFbmRSZSwgJycpLnJlcGxhY2Uoc3RyaW5nU3RhcnRSZSwgJyQxJyk7IC8vIE5vcm1hbGl6ZSBtdWx0aS1saW5lIGRpcmVjdGl2ZXNcblxuICAgICAgbGV0IHByZXYgPSAnJztcblxuICAgICAgd2hpbGUgKHByZXYgIT09IGRvY2Jsb2NrKSB7XG4gICAgICAgIHByZXYgPSBkb2NibG9jaztcbiAgICAgICAgZG9jYmxvY2sgPSBkb2NibG9jay5yZXBsYWNlKG11bHRpbGluZVJlLCBcIlwiLmNvbmNhdChsaW5lLCBcIiQxICQyXCIpLmNvbmNhdChsaW5lKSk7XG4gICAgICB9XG5cbiAgICAgIGRvY2Jsb2NrID0gZG9jYmxvY2sucmVwbGFjZShsdHJpbU5ld2xpbmVSZSwgJycpLnRyaW1SaWdodCgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGNvbnN0IGNvbW1lbnRzID0gZG9jYmxvY2sucmVwbGFjZShwcm9wZXJ0eVJlLCAnJykucmVwbGFjZShsdHJpbU5ld2xpbmVSZSwgJycpLnRyaW1SaWdodCgpO1xuICAgICAgbGV0IG1hdGNoO1xuXG4gICAgICB3aGlsZSAobWF0Y2ggPSBwcm9wZXJ0eVJlLmV4ZWMoZG9jYmxvY2spKSB7XG4gICAgICAgIC8vIHN0cmlwIGxpbmVjb21tZW50cyBmcm9tIHByYWdtYXNcbiAgICAgICAgY29uc3QgbmV4dFByYWdtYSA9IG1hdGNoWzJdLnJlcGxhY2UobGluZUNvbW1lbnRSZSwgJycpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0W21hdGNoWzFdXSA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheShyZXN1bHRbbWF0Y2hbMV1dKSkge1xuICAgICAgICAgIHJlc3VsdFttYXRjaFsxXV0gPSBbXS5jb25jYXQocmVzdWx0W21hdGNoWzFdXSwgbmV4dFByYWdtYSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W21hdGNoWzFdXSA9IG5leHRQcmFnbWE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWVudHMsXG4gICAgICAgIHByYWdtYXM6IHJlc3VsdFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmludCh7XG4gICAgICBjb21tZW50cyA9ICcnLFxuICAgICAgcHJhZ21hcyA9IHt9XG4gICAgfSkge1xuICAgICAgY29uc3QgbGluZSA9ICgwLCBfZGV0ZWN0TmV3bGluZSgpLmRlZmF1bHQpKGNvbW1lbnRzKSB8fCBfb3MoKS5FT0w7XG5cbiAgICAgIGNvbnN0IGhlYWQgPSAnLyoqJztcbiAgICAgIGNvbnN0IHN0YXJ0ID0gJyAqJztcbiAgICAgIGNvbnN0IHRhaWwgPSAnICovJztcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcmFnbWFzKTtcbiAgICAgIGNvbnN0IHByaW50ZWRPYmplY3QgPSBrZXlzLm1hcChrZXkgPT4gcHJpbnRLZXlWYWx1ZXMoa2V5LCBwcmFnbWFzW2tleV0pKS5yZWR1Y2UoKGFyciwgbmV4dCkgPT4gYXJyLmNvbmNhdChuZXh0KSwgW10pLm1hcChrZXlWYWx1ZSA9PiBzdGFydCArICcgJyArIGtleVZhbHVlICsgbGluZSkuam9pbignJyk7XG5cbiAgICAgIGlmICghY29tbWVudHMpIHtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmICFBcnJheS5pc0FycmF5KHByYWdtYXNba2V5c1swXV0pKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBwcmFnbWFzW2tleXNbMF1dO1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChoZWFkLCBcIiBcIikuY29uY2F0KHByaW50S2V5VmFsdWVzKGtleXNbMF0sIHZhbHVlKVswXSkuY29uY2F0KHRhaWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByaW50ZWRDb21tZW50cyA9IGNvbW1lbnRzLnNwbGl0KGxpbmUpLm1hcCh0ZXh0TGluZSA9PiBcIlwiLmNvbmNhdChzdGFydCwgXCIgXCIpLmNvbmNhdCh0ZXh0TGluZSkpLmpvaW4obGluZSkgKyBsaW5lO1xuICAgICAgcmV0dXJuIGhlYWQgKyBsaW5lICsgKGNvbW1lbnRzID8gcHJpbnRlZENvbW1lbnRzIDogJycpICsgKGNvbW1lbnRzICYmIGtleXMubGVuZ3RoID8gc3RhcnQgKyBsaW5lIDogJycpICsgcHJpbnRlZE9iamVjdCArIHRhaWw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJpbnRLZXlWYWx1ZXMoa2V5LCB2YWx1ZU9yQXJyYXkpIHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQodmFsdWVPckFycmF5KS5tYXAodmFsdWUgPT4gXCJAXCIuY29uY2F0KGtleSwgXCIgXCIpLmNvbmNhdCh2YWx1ZSkudHJpbSgpKTtcbiAgICB9XG4gIH0pO1xuICB1bndyYXBFeHBvcnRzKGJ1aWxkKTtcbiAgdmFyIGJ1aWxkXzEgPSBidWlsZC5leHRyYWN0O1xuICB2YXIgYnVpbGRfMiA9IGJ1aWxkLnN0cmlwO1xuICB2YXIgYnVpbGRfMyA9IGJ1aWxkLnBhcnNlO1xuICB2YXIgYnVpbGRfNCA9IGJ1aWxkLnBhcnNlV2l0aENvbW1lbnRzO1xuICB2YXIgYnVpbGRfNSA9IGJ1aWxkLnByaW50O1xuXG4gIGZ1bmN0aW9uIGhhc1ByYWdtYSh0ZXh0KSB7XG4gICAgY29uc3QgcHJhZ21hcyA9IE9iamVjdC5rZXlzKGJ1aWxkLnBhcnNlKGJ1aWxkLmV4dHJhY3QodGV4dCkpKTtcbiAgICByZXR1cm4gcHJhZ21hcy5pbmNsdWRlcyhcInByZXR0aWVyXCIpIHx8IHByYWdtYXMuaW5jbHVkZXMoXCJmb3JtYXRcIik7XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRQcmFnbWEodGV4dCkge1xuICAgIGNvbnN0IHBhcnNlZERvY2Jsb2NrID0gYnVpbGQucGFyc2VXaXRoQ29tbWVudHMoYnVpbGQuZXh0cmFjdCh0ZXh0KSk7XG4gICAgY29uc3QgcHJhZ21hcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZm9ybWF0OiBcIlwiXG4gICAgfSwgcGFyc2VkRG9jYmxvY2sucHJhZ21hcyk7XG4gICAgY29uc3QgbmV3RG9jYmxvY2sgPSBidWlsZC5wcmludCh7XG4gICAgICBwcmFnbWFzLFxuICAgICAgY29tbWVudHM6IHBhcnNlZERvY2Jsb2NrLmNvbW1lbnRzLnJlcGxhY2UoL14oXFxzKz9cXHI/XFxuKSsvLCBcIlwiKSAvLyByZW1vdmUgbGVhZGluZyBuZXdsaW5lc1xuXG4gICAgfSkucmVwbGFjZSgvKFxcclxcbnxcXHIpL2csIFwiXFxuXCIpOyAvLyBub3JtYWxpc2UgbmV3bGluZXMgKG1pdGlnYXRlIHVzZSBvZiBvcy5FT0wgYnkgamVzdC1kb2NibG9jaylcblxuICAgIGNvbnN0IHN0cmlwcGVkVGV4dCA9IGJ1aWxkLnN0cmlwKHRleHQpO1xuICAgIGNvbnN0IHNlcGFyYXRpbmdOZXdsaW5lcyA9IHN0cmlwcGVkVGV4dC5zdGFydHNXaXRoKFwiXFxuXCIpID8gXCJcXG5cIiA6IFwiXFxuXFxuXCI7XG4gICAgcmV0dXJuIG5ld0RvY2Jsb2NrICsgc2VwYXJhdGluZ05ld2xpbmVzICsgc3RyaXBwZWRUZXh0O1xuICB9XG5cbiAgdmFyIHByYWdtYSA9IHtcbiAgICBoYXNQcmFnbWEsXG4gICAgaW5zZXJ0UHJhZ21hXG4gIH07XG5cbiAgY29uc3QgREVMSU1JVEVSX01BUCA9IHtcbiAgICBcIi0tLVwiOiBcInlhbWxcIixcbiAgICBcIisrK1wiOiBcInRvbWxcIlxuICB9O1xuXG4gIGZ1bmN0aW9uIHBhcnNlJDEodGV4dCkge1xuICAgIGNvbnN0IGRlbGltaXRlclJlZ2V4ID0gT2JqZWN0LmtleXMoREVMSU1JVEVSX01BUCkubWFwKGVzY2FwZVN0cmluZ1JlZ2V4cCQyKS5qb2luKFwifFwiKTtcbiAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goIC8vIHRyYWlsaW5nIHNwYWNlcyBhZnRlciBkZWxpbWl0ZXJzIGFyZSBhbGxvd2VkXG4gICAgbmV3IFJlZ0V4cChcIl4oXCIuY29uY2F0KGRlbGltaXRlclJlZ2V4LCBcIilbXlxcXFxuXFxcXFNdKlxcXFxuKD86KFtcXFxcc1xcXFxTXSo/KVxcXFxuKT9cXFxcMVteXFxcXG5cXFxcU10qKFxcXFxufCQpXCIpKSk7XG5cbiAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZyb250TWF0dGVyOiBudWxsLFxuICAgICAgICBjb250ZW50OiB0ZXh0XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IFtyYXcsIGRlbGltaXRlciwgdmFsdWVdID0gbWF0Y2g7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb250TWF0dGVyOiB7XG4gICAgICAgIHR5cGU6IERFTElNSVRFUl9NQVBbZGVsaW1pdGVyXSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHJhdzogcmF3LnJlcGxhY2UoL1xcbiQvLCBcIlwiKVxuICAgICAgfSxcbiAgICAgIGNvbnRlbnQ6IHJhdy5yZXBsYWNlKC9bXlxcbl0vZywgXCIgXCIpICsgdGV4dC5zbGljZShyYXcubGVuZ3RoKVxuICAgIH07XG4gIH1cblxuICB2YXIgZnJvbnRNYXR0ZXIgPSBwYXJzZSQxO1xuXG4gIGZ1bmN0aW9uIGhhc1ByYWdtYSQxKHRleHQpIHtcbiAgICByZXR1cm4gcHJhZ21hLmhhc1ByYWdtYShmcm9udE1hdHRlcih0ZXh0KS5jb250ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydFByYWdtYSQxKHRleHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcm9udE1hdHRlcjogZnJvbnRNYXR0ZXIkMSxcbiAgICAgIGNvbnRlbnRcbiAgICB9ID0gZnJvbnRNYXR0ZXIodGV4dCk7XG4gICAgcmV0dXJuIChmcm9udE1hdHRlciQxID8gZnJvbnRNYXR0ZXIkMS5yYXcgKyBcIlxcblxcblwiIDogXCJcIikgKyBwcmFnbWEuaW5zZXJ0UHJhZ21hKGNvbnRlbnQpO1xuICB9XG5cbiAgdmFyIHByYWdtYSQxID0ge1xuICAgIGhhc1ByYWdtYTogaGFzUHJhZ21hJDEsXG4gICAgaW5zZXJ0UHJhZ21hOiBpbnNlcnRQcmFnbWEkMVxuICB9O1xuXG4gIHZhciBsaW5lQ29sdW1uVG9JbmRleCA9IGZ1bmN0aW9uIGxpbmVDb2x1bW5Ub0luZGV4KGxpbmVDb2x1bW4sIHRleHQpIHtcbiAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQ29sdW1uLmxpbmUgLSAxOyArK2kpIHtcbiAgICAgIGluZGV4ID0gdGV4dC5pbmRleE9mKFwiXFxuXCIsIGluZGV4KSArIDE7XG5cbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmRleCArIGxpbmVDb2x1bW4uY29sdW1uO1xuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBnZXRMYXN0OiBnZXRMYXN0JDEsXG4gICAgc2tpcEV2ZXJ5dGhpbmdCdXROZXdMaW5lOiBza2lwRXZlcnl0aGluZ0J1dE5ld0xpbmUkMlxuICB9ID0gdXRpbCQxO1xuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZUxvY1N0YXJ0KG5vZGUsIHRleHQpIHtcbiAgICBpZiAobm9kZS5zb3VyY2UpIHtcbiAgICAgIHJldHVybiBsaW5lQ29sdW1uVG9JbmRleChub2RlLnNvdXJjZS5zdGFydCwgdGV4dCkgLSAxO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlTG9jRW5kKG5vZGUsIHRleHQpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSBcImNzcy1jb21tZW50XCIgJiYgbm9kZS5pbmxpbmUpIHtcbiAgICAgIHJldHVybiBza2lwRXZlcnl0aGluZ0J1dE5ld0xpbmUkMih0ZXh0LCBub2RlLnNvdXJjZS5zdGFydE9mZnNldCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kTm9kZSA9IG5vZGUubm9kZXMgJiYgZ2V0TGFzdCQxKG5vZGUubm9kZXMpO1xuXG4gICAgaWYgKGVuZE5vZGUgJiYgbm9kZS5zb3VyY2UgJiYgIW5vZGUuc291cmNlLmVuZCkge1xuICAgICAgbm9kZSA9IGVuZE5vZGU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuc291cmNlICYmIG5vZGUuc291cmNlLmVuZCkge1xuICAgICAgcmV0dXJuIGxpbmVDb2x1bW5Ub0luZGV4KG5vZGUuc291cmNlLmVuZCwgdGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjdWxhdGVMb2Mobm9kZSwgdGV4dCkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAobm9kZS5zb3VyY2UpIHtcbiAgICAgICAgbm9kZS5zb3VyY2Uuc3RhcnRPZmZzZXQgPSBjYWxjdWxhdGVMb2NTdGFydChub2RlLCB0ZXh0KTtcbiAgICAgICAgbm9kZS5zb3VyY2UuZW5kT2Zmc2V0ID0gY2FsY3VsYXRlTG9jRW5kKG5vZGUsIHRleHQpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBub2RlKSB7XG4gICAgICAgIGNhbGN1bGF0ZUxvYyhub2RlW2tleV0sIHRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogV29ya2Fyb3VuZCBmb3IgYSBidWc6IHF1b3RlcyBpbiBpbmxpbmUgY29tbWVudHMgY29ycnVwdCBsb2MgZGF0YSBvZiBzdWJzZXF1ZW50IG5vZGVzLlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBxdW90ZXMgd2l0aCBVK0ZGRkUgYW5kIFUrRkZGRi4gTGF0ZXIsIHdoZW4gdGhlIGNvbW1lbnRzIGFyZSBwcmludGVkLFxuICAgKiB0aGVpciBjb250ZW50IGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCB0ZXh0IG9yIHJlc3RvcmVkIGJ5IHJlcGxhY2luZyB0aGUgcGxhY2Vob2xkZXJcbiAgICogY2hhcmFjdGVycyBiYWNrIHdpdGggcXVvdGVzLlxuICAgKiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmV0dGllci9wcmV0dGllci9pc3N1ZXMvNzc4MFxuICAgKiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9zaGVsbHNjYXBlL3Bvc3Rjc3MtbGVzcy9pc3N1ZXMvMTQ1XG4gICAqIC0gQWJvdXQgbm9uY2hhcmFjdGVycyAoVStGRkZFIGFuZCBVK0ZGRkYpOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2ZhcS9wcml2YXRlX3VzZS5odG1sI25vbmNoYXIxXG4gICAqIEBwYXJhbSB0ZXh0IHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVF1b3Rlc0luSW5saW5lQ29tbWVudHModGV4dCkge1xuICAgIC8qKiBAdHlwZWRlZiB7ICdpbml0aWFsJyB8ICdzaW5nbGUtcXVvdGVzJyB8ICdkb3VibGUtcXVvdGVzJyB8ICd1cmwnIHwgJ2NvbW1lbnQtYmxvY2snIHwgJ2NvbW1lbnQtaW5saW5lJyB9IFN0YXRlICovXG5cbiAgICAvKiogQHR5cGUge1N0YXRlfSAqL1xuICAgIGxldCBzdGF0ZSA9IFwiaW5pdGlhbFwiO1xuICAgIC8qKiBAdHlwZSB7U3RhdGV9ICovXG5cbiAgICBsZXQgc3RhdGVUb1JldHVybkZyb21RdW90ZXMgPSBcImluaXRpYWxcIjtcbiAgICBsZXQgaW5saW5lQ29tbWVudFN0YXJ0SW5kZXg7XG4gICAgbGV0IGlubGluZUNvbW1lbnRDb250YWluc1F1b3RlcyA9IGZhbHNlO1xuICAgIGNvbnN0IGlubGluZUNvbW1lbnRzVG9SZXBsYWNlID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGMgPSB0ZXh0W2ldO1xuXG4gICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgIGNhc2UgXCJpbml0aWFsXCI6XG4gICAgICAgICAgaWYgKGMgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFwic2luZ2xlLXF1b3Rlc1wiO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGMgPT09ICdcIicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gXCJkb3VibGUtcXVvdGVzXCI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoKGMgPT09IFwidVwiIHx8IGMgPT09IFwiVVwiKSAmJiB0ZXh0LnNsaWNlKGksIGkgKyA0KS50b0xvd2VyQ2FzZSgpID09PSBcInVybChcIikge1xuICAgICAgICAgICAgc3RhdGUgPSBcInVybFwiO1xuICAgICAgICAgICAgaSArPSAzO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGMgPT09IFwiKlwiICYmIHRleHRbaSAtIDFdID09PSBcIi9cIikge1xuICAgICAgICAgICAgc3RhdGUgPSBcImNvbW1lbnQtYmxvY2tcIjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjID09PSBcIi9cIiAmJiB0ZXh0W2kgLSAxXSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgIHN0YXRlID0gXCJjb21tZW50LWlubGluZVwiO1xuICAgICAgICAgICAgaW5saW5lQ29tbWVudFN0YXJ0SW5kZXggPSBpIC0gMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIGNhc2UgXCJzaW5nbGUtcXVvdGVzXCI6XG4gICAgICAgICAgaWYgKGMgPT09IFwiJ1wiICYmIHRleHRbaSAtIDFdICE9PSBcIlxcXFxcIikge1xuICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZVRvUmV0dXJuRnJvbVF1b3RlcztcbiAgICAgICAgICAgIHN0YXRlVG9SZXR1cm5Gcm9tUXVvdGVzID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGMgPT09IFwiXFxuXCIgfHwgYyA9PT0gXCJcXHJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7IC8vIGludmFsaWQgaW5wdXRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBjYXNlIFwiZG91YmxlLXF1b3Rlc1wiOlxuICAgICAgICAgIGlmIChjID09PSAnXCInICYmIHRleHRbaSAtIDFdICE9PSBcIlxcXFxcIikge1xuICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZVRvUmV0dXJuRnJvbVF1b3RlcztcbiAgICAgICAgICAgIHN0YXRlVG9SZXR1cm5Gcm9tUXVvdGVzID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGMgPT09IFwiXFxuXCIgfHwgYyA9PT0gXCJcXHJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7IC8vIGludmFsaWQgaW5wdXRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgICAgaWYgKGMgPT09IFwiKVwiKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFwiaW5pdGlhbFwiO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjID09PSBcIlxcblwiIHx8IGMgPT09IFwiXFxyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0OyAvLyBpbnZhbGlkIGlucHV0XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGMgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFwic2luZ2xlLXF1b3Rlc1wiO1xuICAgICAgICAgICAgc3RhdGVUb1JldHVybkZyb21RdW90ZXMgPSBcInVybFwiO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGMgPT09ICdcIicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gXCJkb3VibGUtcXVvdGVzXCI7XG4gICAgICAgICAgICBzdGF0ZVRvUmV0dXJuRnJvbVF1b3RlcyA9IFwidXJsXCI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBjYXNlIFwiY29tbWVudC1ibG9ja1wiOlxuICAgICAgICAgIGlmIChjID09PSBcIi9cIiAmJiB0ZXh0W2kgLSAxXSA9PT0gXCIqXCIpIHtcbiAgICAgICAgICAgIHN0YXRlID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgY2FzZSBcImNvbW1lbnQtaW5saW5lXCI6XG4gICAgICAgICAgaWYgKGMgPT09ICdcIicgfHwgYyA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIGlubGluZUNvbW1lbnRDb250YWluc1F1b3RlcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGMgPT09IFwiXFxuXCIgfHwgYyA9PT0gXCJcXHJcIikge1xuICAgICAgICAgICAgaWYgKGlubGluZUNvbW1lbnRDb250YWluc1F1b3Rlcykge1xuICAgICAgICAgICAgICBpbmxpbmVDb21tZW50c1RvUmVwbGFjZS5wdXNoKFtpbmxpbmVDb21tZW50U3RhcnRJbmRleCwgaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0ZSA9IFwiaW5pdGlhbFwiO1xuICAgICAgICAgICAgaW5saW5lQ29tbWVudENvbnRhaW5zUXVvdGVzID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3RhcnQsIGVuZF0gb2YgaW5saW5lQ29tbWVudHNUb1JlcGxhY2UpIHtcbiAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIHN0YXJ0KSArIHRleHQuc2xpY2Uoc3RhcnQsIGVuZCkucmVwbGFjZSgvJy9nLCBcIlxcdWZmZmVcIikucmVwbGFjZSgvXCIvZywgXCJcXHVmZmZmXCIpICsgdGV4dC5zbGljZShlbmQpO1xuICAgIH1cblxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzdG9yZVF1b3Rlc0luSW5saW5lQ29tbWVudHModGV4dCkge1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcdWZmZmUvZywgXCInXCIpLnJlcGxhY2UoL1xcdWZmZmYvZywgJ1wiJyk7XG4gIH1cblxuICB2YXIgbG9jJDEgPSB7XG4gICAgY2FsY3VsYXRlTG9jLFxuICAgIHJlcGxhY2VRdW90ZXNJbklubGluZUNvbW1lbnRzLFxuICAgIHJlc3RvcmVRdW90ZXNJbklubGluZUNvbW1lbnRzXG4gIH07XG5cbiAgY29uc3QgY29sb3JBZGp1c3RlckZ1bmN0aW9ucyA9IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiLCBcImFscGhhXCIsIFwiYVwiLCBcInJnYlwiLCBcImh1ZVwiLCBcImhcIiwgXCJzYXR1cmF0aW9uXCIsIFwic1wiLCBcImxpZ2h0bmVzc1wiLCBcImxcIiwgXCJ3aGl0ZW5lc3NcIiwgXCJ3XCIsIFwiYmxhY2tuZXNzXCIsIFwiYlwiLCBcInRpbnRcIiwgXCJzaGFkZVwiLCBcImJsZW5kXCIsIFwiYmxlbmRhXCIsIFwiY29udHJhc3RcIiwgXCJoc2xcIiwgXCJoc2xhXCIsIFwiaHdiXCIsIFwiaHdiYVwiXTtcblxuICBmdW5jdGlvbiBnZXRBbmNlc3RvckNvdW50ZXIocGF0aCwgdHlwZU9yVHlwZXMpIHtcbiAgICBjb25zdCB0eXBlcyA9IFtdLmNvbmNhdCh0eXBlT3JUeXBlcyk7XG4gICAgbGV0IGNvdW50ZXIgPSAtMTtcbiAgICBsZXQgYW5jZXN0b3JOb2RlO1xuXG4gICAgd2hpbGUgKGFuY2VzdG9yTm9kZSA9IHBhdGguZ2V0UGFyZW50Tm9kZSgrK2NvdW50ZXIpKSB7XG4gICAgICBpZiAodHlwZXMuaW5jbHVkZXMoYW5jZXN0b3JOb2RlLnR5cGUpKSB7XG4gICAgICAgIHJldHVybiBjb3VudGVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEFuY2VzdG9yTm9kZShwYXRoLCB0eXBlT3JUeXBlcykge1xuICAgIGNvbnN0IGNvdW50ZXIgPSBnZXRBbmNlc3RvckNvdW50ZXIocGF0aCwgdHlwZU9yVHlwZXMpO1xuICAgIHJldHVybiBjb3VudGVyID09PSAtMSA/IG51bGwgOiBwYXRoLmdldFBhcmVudE5vZGUoY291bnRlcik7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQcm9wT2ZEZWNsTm9kZShwYXRoKSB7XG4gICAgY29uc3QgZGVjbEFuY2VzdG9yTm9kZSA9IGdldEFuY2VzdG9yTm9kZShwYXRoLCBcImNzcy1kZWNsXCIpO1xuICAgIHJldHVybiBkZWNsQW5jZXN0b3JOb2RlICYmIGRlY2xBbmNlc3Rvck5vZGUucHJvcCAmJiBkZWNsQW5jZXN0b3JOb2RlLnByb3AudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU0NTUyhwYXJzZXIsIHRleHQpIHtcbiAgICBjb25zdCBoYXNFeHBsaWNpdFBhcnNlckNob2ljZSA9IHBhcnNlciA9PT0gXCJsZXNzXCIgfHwgcGFyc2VyID09PSBcInNjc3NcIjtcbiAgICBjb25zdCBJU19QT1NTSUJMWV9TQ1NTID0gLyhcXHdcXHMqOlxccypbXn06XSt8Iyl7fEBpbXBvcnRbXlxcbl0rKD86dXJsfCwpLztcbiAgICByZXR1cm4gaGFzRXhwbGljaXRQYXJzZXJDaG9pY2UgPyBwYXJzZXIgPT09IFwic2Nzc1wiIDogSVNfUE9TU0lCTFlfU0NTUy50ZXN0KHRleHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNXaWRlS2V5d29yZHModmFsdWUpIHtcbiAgICByZXR1cm4gW1wiaW5pdGlhbFwiLCBcImluaGVyaXRcIiwgXCJ1bnNldFwiLCBcInJldmVydFwiXS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzS2V5ZnJhbWVBdFJ1bGVLZXl3b3JkcyhwYXRoLCB2YWx1ZSkge1xuICAgIGNvbnN0IGF0UnVsZUFuY2VzdG9yTm9kZSA9IGdldEFuY2VzdG9yTm9kZShwYXRoLCBcImNzcy1hdHJ1bGVcIik7XG4gICAgcmV0dXJuIGF0UnVsZUFuY2VzdG9yTm9kZSAmJiBhdFJ1bGVBbmNlc3Rvck5vZGUubmFtZSAmJiBhdFJ1bGVBbmNlc3Rvck5vZGUubmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFwia2V5ZnJhbWVzXCIpICYmIFtcImZyb21cIiwgXCJ0b1wiXS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1heWJlVG9Mb3dlckNhc2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5jbHVkZXMoXCIkXCIpIHx8IHZhbHVlLmluY2x1ZGVzKFwiQFwiKSB8fCB2YWx1ZS5pbmNsdWRlcyhcIiNcIikgfHwgdmFsdWUuc3RhcnRzV2l0aChcIiVcIikgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi0tXCIpIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCI6LS1cIikgfHwgdmFsdWUuaW5jbHVkZXMoXCIoXCIpICYmIHZhbHVlLmluY2x1ZGVzKFwiKVwiKSA/IHZhbHVlIDogdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2lkZVZhbHVlRnVuY3Rpb25Ob2RlKHBhdGgsIGZ1bmN0aW9uTmFtZSkge1xuICAgIGNvbnN0IGZ1bmNBbmNlc3Rvck5vZGUgPSBnZXRBbmNlc3Rvck5vZGUocGF0aCwgXCJ2YWx1ZS1mdW5jXCIpO1xuICAgIHJldHVybiBmdW5jQW5jZXN0b3JOb2RlICYmIGZ1bmNBbmNlc3Rvck5vZGUudmFsdWUgJiYgZnVuY0FuY2VzdG9yTm9kZS52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBmdW5jdGlvbk5hbWU7XG4gIH1cblxuICBmdW5jdGlvbiBpbnNpZGVJQ1NTUnVsZU5vZGUocGF0aCkge1xuICAgIGNvbnN0IHJ1bGVBbmNlc3Rvck5vZGUgPSBnZXRBbmNlc3Rvck5vZGUocGF0aCwgXCJjc3MtcnVsZVwiKTtcbiAgICByZXR1cm4gcnVsZUFuY2VzdG9yTm9kZSAmJiBydWxlQW5jZXN0b3JOb2RlLnJhd3MgJiYgcnVsZUFuY2VzdG9yTm9kZS5yYXdzLnNlbGVjdG9yICYmIChydWxlQW5jZXN0b3JOb2RlLnJhd3Muc2VsZWN0b3Iuc3RhcnRzV2l0aChcIjppbXBvcnRcIikgfHwgcnVsZUFuY2VzdG9yTm9kZS5yYXdzLnNlbGVjdG9yLnN0YXJ0c1dpdGgoXCI6ZXhwb3J0XCIpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2lkZUF0UnVsZU5vZGUocGF0aCwgYXRSdWxlTmFtZU9yQXRSdWxlTmFtZXMpIHtcbiAgICBjb25zdCBhdFJ1bGVOYW1lcyA9IFtdLmNvbmNhdChhdFJ1bGVOYW1lT3JBdFJ1bGVOYW1lcyk7XG4gICAgY29uc3QgYXRSdWxlQW5jZXN0b3JOb2RlID0gZ2V0QW5jZXN0b3JOb2RlKHBhdGgsIFwiY3NzLWF0cnVsZVwiKTtcbiAgICByZXR1cm4gYXRSdWxlQW5jZXN0b3JOb2RlICYmIGF0UnVsZU5hbWVzLmluY2x1ZGVzKGF0UnVsZUFuY2VzdG9yTm9kZS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zaWRlVVJMRnVuY3Rpb25JbkltcG9ydEF0UnVsZU5vZGUocGF0aCkge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgYXRSdWxlQW5jZXN0b3JOb2RlID0gZ2V0QW5jZXN0b3JOb2RlKHBhdGgsIFwiY3NzLWF0cnVsZVwiKTtcbiAgICByZXR1cm4gYXRSdWxlQW5jZXN0b3JOb2RlICYmIGF0UnVsZUFuY2VzdG9yTm9kZS5uYW1lID09PSBcImltcG9ydFwiICYmIG5vZGUuZ3JvdXBzWzBdLnZhbHVlID09PSBcInVybFwiICYmIG5vZGUuZ3JvdXBzLmxlbmd0aCA9PT0gMjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVVJMRnVuY3Rpb25Ob2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLWZ1bmNcIiAmJiBub2RlLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidXJsXCI7XG4gIH1cblxuICBmdW5jdGlvbiBpc0xhc3ROb2RlKHBhdGgsIG5vZGUpIHtcbiAgICBjb25zdCBwYXJlbnROb2RlID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG5cbiAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBub2Rlc1xuICAgIH0gPSBwYXJlbnROb2RlO1xuICAgIHJldHVybiBub2RlcyAmJiBub2Rlcy5pbmRleE9mKG5vZGUpID09PSBub2Rlcy5sZW5ndGggLSAxO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNEZXRhY2hlZFJ1bGVzZXREZWNsYXJhdGlvbk5vZGUobm9kZSkge1xuICAgIC8vIElmIGEgTGVzcyBmaWxlIGVuZHMgdXAgYmVpbmcgcGFyc2VkIHdpdGggdGhlIFNDU1MgcGFyc2VyLCBMZXNzXG4gICAgLy8gdmFyaWFibGUgZGVjbGFyYXRpb25zIHdpbGwgYmUgcGFyc2VkIGFzIGF0cnVsZXMgd2l0aCBuYW1lcyBlbmRpbmdcbiAgICAvLyB3aXRoIGEgY29sb24sIHNvIGtlZXAgdGhlIG9yaWdpbmFsIGNhc2UgdGhlbi5cbiAgICBpZiAoIW5vZGUuc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIG5vZGUuc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgJiYgL15ALis6LiokLy50ZXN0KG5vZGUuc2VsZWN0b3IpIHx8IG5vZGUuc2VsZWN0b3IudmFsdWUgJiYgL15ALis6LiokLy50ZXN0KG5vZGUuc2VsZWN0b3IudmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNGb3JLZXl3b3JkTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJ2YWx1ZS13b3JkXCIgJiYgW1wiZnJvbVwiLCBcInRocm91Z2hcIiwgXCJlbmRcIl0uaW5jbHVkZXMobm9kZS52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0lmRWxzZUtleXdvcmROb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLXdvcmRcIiAmJiBbXCJhbmRcIiwgXCJvclwiLCBcIm5vdFwiXS5pbmNsdWRlcyhub2RlLnZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRWFjaEtleXdvcmROb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLXdvcmRcIiAmJiBub2RlLnZhbHVlID09PSBcImluXCI7XG4gIH1cblxuICBmdW5jdGlvbiBpc011bHRpcGxpY2F0aW9uTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJ2YWx1ZS1vcGVyYXRvclwiICYmIG5vZGUudmFsdWUgPT09IFwiKlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNEaXZpc2lvbk5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwidmFsdWUtb3BlcmF0b3JcIiAmJiBub2RlLnZhbHVlID09PSBcIi9cIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQWRkaXRpb25Ob2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLW9wZXJhdG9yXCIgJiYgbm9kZS52YWx1ZSA9PT0gXCIrXCI7XG4gIH1cblxuICBmdW5jdGlvbiBpc1N1YnRyYWN0aW9uTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJ2YWx1ZS1vcGVyYXRvclwiICYmIG5vZGUudmFsdWUgPT09IFwiLVwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNNb2R1bG9Ob2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLW9wZXJhdG9yXCIgJiYgbm9kZS52YWx1ZSA9PT0gXCIlXCI7XG4gIH1cblxuICBmdW5jdGlvbiBpc01hdGhPcGVyYXRvck5vZGUobm9kZSkge1xuICAgIHJldHVybiBpc011bHRpcGxpY2F0aW9uTm9kZShub2RlKSB8fCBpc0RpdmlzaW9uTm9kZShub2RlKSB8fCBpc0FkZGl0aW9uTm9kZShub2RlKSB8fCBpc1N1YnRyYWN0aW9uTm9kZShub2RlKSB8fCBpc01vZHVsb05vZGUobm9kZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0VxdWFsaXR5T3BlcmF0b3JOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLXdvcmRcIiAmJiBbXCI9PVwiLCBcIiE9XCJdLmluY2x1ZGVzKG5vZGUudmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNSZWxhdGlvbmFsT3BlcmF0b3JOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLXdvcmRcIiAmJiBbXCI8XCIsIFwiPlwiLCBcIjw9XCIsIFwiPj1cIl0uaW5jbHVkZXMobm9kZS52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc1NDU1NDb250cm9sRGlyZWN0aXZlTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJjc3MtYXRydWxlXCIgJiYgW1wiaWZcIiwgXCJlbHNlXCIsIFwiZm9yXCIsIFwiZWFjaFwiLCBcIndoaWxlXCJdLmluY2x1ZGVzKG5vZGUubmFtZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc1NDU1NOZXN0ZWRQcm9wZXJ0eU5vZGUobm9kZSkge1xuICAgIGlmICghbm9kZS5zZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlLnNlbGVjdG9yLnJlcGxhY2UoL1xcL1xcKi4qP1xcKlxcLy8sIFwiXCIpLnJlcGxhY2UoL1xcL1xcLy4qP1xcbi8sIFwiXCIpLnRyaW0oKS5lbmRzV2l0aChcIjpcIik7XG4gIH1cblxuICBmdW5jdGlvbiBpc0RldGFjaGVkUnVsZXNldENhbGxOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5yYXdzICYmIG5vZGUucmF3cy5wYXJhbXMgJiYgL15cXChcXHMqXFwpJC8udGVzdChub2RlLnJhd3MucGFyYW1zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVGVtcGxhdGVQbGFjZWhvbGRlck5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5hbWUuc3RhcnRzV2l0aChcInByZXR0aWVyLXBsYWNlaG9sZGVyXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNUZW1wbGF0ZVByb3BOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5wcm9wLnN0YXJ0c1dpdGgoXCJAcHJldHRpZXItcGxhY2Vob2xkZXJcIik7XG4gIH1cblxuICBmdW5jdGlvbiBpc1Bvc3Rjc3NTaW1wbGVWYXJOb2RlKGN1cnJlbnROb2RlLCBuZXh0Tm9kZSkge1xuICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZSA9PT0gXCIkJFwiICYmIGN1cnJlbnROb2RlLnR5cGUgPT09IFwidmFsdWUtZnVuY1wiICYmIG5leHROb2RlICYmIG5leHROb2RlLnR5cGUgPT09IFwidmFsdWUtd29yZFwiICYmICFuZXh0Tm9kZS5yYXdzLmJlZm9yZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0NvbXBvc2VzTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWUgJiYgbm9kZS52YWx1ZS50eXBlID09PSBcInZhbHVlLXJvb3RcIiAmJiBub2RlLnZhbHVlLmdyb3VwICYmIG5vZGUudmFsdWUuZ3JvdXAudHlwZSA9PT0gXCJ2YWx1ZS12YWx1ZVwiICYmIG5vZGUucHJvcC50b0xvd2VyQ2FzZSgpID09PSBcImNvbXBvc2VzXCI7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNQYXJlbnNBcm91bmROb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS52YWx1ZSAmJiBub2RlLnZhbHVlLmdyb3VwICYmIG5vZGUudmFsdWUuZ3JvdXAuZ3JvdXAgJiYgbm9kZS52YWx1ZS5ncm91cC5ncm91cC50eXBlID09PSBcInZhbHVlLXBhcmVuX2dyb3VwXCIgJiYgbm9kZS52YWx1ZS5ncm91cC5ncm91cC5vcGVuICE9PSBudWxsICYmIG5vZGUudmFsdWUuZ3JvdXAuZ3JvdXAuY2xvc2UgIT09IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNFbXB0eVJhd0JlZm9yZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUucmF3cyAmJiBub2RlLnJhd3MuYmVmb3JlID09PSBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNLZXlWYWx1ZVBhaXJOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLWNvbW1hX2dyb3VwXCIgJiYgbm9kZS5ncm91cHMgJiYgbm9kZS5ncm91cHNbMV0gJiYgbm9kZS5ncm91cHNbMV0udHlwZSA9PT0gXCJ2YWx1ZS1jb2xvblwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNLZXlWYWx1ZVBhaXJJblBhcmVuR3JvdXBOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLXBhcmVuX2dyb3VwXCIgJiYgbm9kZS5ncm91cHMgJiYgbm9kZS5ncm91cHNbMF0gJiYgaXNLZXlWYWx1ZVBhaXJOb2RlKG5vZGUuZ3JvdXBzWzBdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU0NTU01hcEl0ZW1Ob2RlKHBhdGgpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpOyAvLyBJZ25vcmUgZW1wdHkgaXRlbSAoaS5lLiBgJGtleTogKClgKVxuXG4gICAgaWYgKG5vZGUuZ3JvdXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudFBhcmVudE5vZGUgPSBwYXRoLmdldFBhcmVudE5vZGUoMSk7IC8vIENoZWNrIG9wZW4gcGFyZW5zIGNvbnRhaW4ga2V5L3ZhbHVlIHBhaXIgKGkuZS4gYChrZXk6IHZhbHVlKWAgYW5kIGAoa2V5OiAodmFsdWUsIG90aGVyLXZhbHVlKWApXG5cbiAgICBpZiAoIWlzS2V5VmFsdWVQYWlySW5QYXJlbkdyb3VwTm9kZShub2RlKSAmJiAhKHBhcmVudFBhcmVudE5vZGUgJiYgaXNLZXlWYWx1ZVBhaXJJblBhcmVuR3JvdXBOb2RlKHBhcmVudFBhcmVudE5vZGUpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY2xOb2RlID0gZ2V0QW5jZXN0b3JOb2RlKHBhdGgsIFwiY3NzLWRlY2xcIik7IC8vIFNDU1MgbWFwIGRlY2xhcmF0aW9uIChpLmUuIGAkbWFwOiAoa2V5OiB2YWx1ZSwgb3RoZXIta2V5OiBvdGhlci12YWx1ZSlgKVxuXG4gICAgaWYgKGRlY2xOb2RlICYmIGRlY2xOb2RlLnByb3AgJiYgZGVjbE5vZGUucHJvcC5zdGFydHNXaXRoKFwiJFwiKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBMaXN0IGFzIHZhbHVlIG9mIGtleSBpbnNpZGUgU0NTUyBtYXAgKGkuZS4gYCRtYXA6IChrZXk6ICh2YWx1ZSBvdGhlci12YWx1ZSBvdGhlci1vdGhlci12YWx1ZSkpYClcblxuXG4gICAgaWYgKGlzS2V5VmFsdWVQYWlySW5QYXJlbkdyb3VwTm9kZShwYXJlbnRQYXJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBTQ1NTIE1hcCBpcyBhcmd1bWVudCBvZiBmdW5jdGlvbiAoaS5lLiBgZnVuYygoa2V5OiB2YWx1ZSwgb3RoZXIta2V5OiBvdGhlci12YWx1ZSkpYClcblxuXG4gICAgaWYgKHBhcmVudFBhcmVudE5vZGUudHlwZSA9PT0gXCJ2YWx1ZS1mdW5jXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW5saW5lVmFsdWVDb21tZW50Tm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJ2YWx1ZS1jb21tZW50XCIgJiYgbm9kZS5pbmxpbmU7XG4gIH1cblxuICBmdW5jdGlvbiBpc0hhc2hOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLXdvcmRcIiAmJiBub2RlLnZhbHVlID09PSBcIiNcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTGVmdEN1cmx5QnJhY2VOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcInZhbHVlLXdvcmRcIiAmJiBub2RlLnZhbHVlID09PSBcIntcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUmlnaHRDdXJseUJyYWNlTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJ2YWx1ZS13b3JkXCIgJiYgbm9kZS52YWx1ZSA9PT0gXCJ9XCI7XG4gIH1cblxuICBmdW5jdGlvbiBpc1dvcmROb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gW1widmFsdWUtd29yZFwiLCBcInZhbHVlLWF0d29yZFwiXS5pbmNsdWRlcyhub2RlLnR5cGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNDb2xvbk5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwidmFsdWUtY29sb25cIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTWVkaWFBbmRTdXBwb3J0c0tleXdvcmRzKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS52YWx1ZSAmJiBbXCJub3RcIiwgXCJhbmRcIiwgXCJvclwiXS5pbmNsdWRlcyhub2RlLnZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNDb2xvckFkanVzdGVyRnVuY05vZGUobm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgIT09IFwidmFsdWUtZnVuY1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbG9yQWRqdXN0ZXJGdW5jdGlvbnMuaW5jbHVkZXMobm9kZS52YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfSAvLyBUT0RPOiBvbmx5IGNoZWNrIGBsZXNzYCB3aGVuIHdlIGRvbid0IHVzZSBgbGVzc2AgdG8gcGFyc2UgYGNzc2BcblxuXG4gIGZ1bmN0aW9uIGlzTGVzc1BhcnNlcihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMucGFyc2VyID09PSBcImNzc1wiIHx8IG9wdGlvbnMucGFyc2VyID09PSBcImxlc3NcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxhc3RMaW5lSGFzSW5saW5lQ29tbWVudCh0ZXh0KSB7XG4gICAgcmV0dXJuIC9cXC9cXC8vLnRlc3QodGV4dC5zcGxpdCgvW1xcclxcbl0vKS5wb3AoKSk7XG4gIH1cblxuICB2YXIgdXRpbHMkMiA9IHtcbiAgICBnZXRBbmNlc3RvckNvdW50ZXIsXG4gICAgZ2V0QW5jZXN0b3JOb2RlLFxuICAgIGdldFByb3BPZkRlY2xOb2RlLFxuICAgIG1heWJlVG9Mb3dlckNhc2UsXG4gICAgaW5zaWRlVmFsdWVGdW5jdGlvbk5vZGUsXG4gICAgaW5zaWRlSUNTU1J1bGVOb2RlLFxuICAgIGluc2lkZUF0UnVsZU5vZGUsXG4gICAgaW5zaWRlVVJMRnVuY3Rpb25JbkltcG9ydEF0UnVsZU5vZGUsXG4gICAgaXNLZXlmcmFtZUF0UnVsZUtleXdvcmRzLFxuICAgIGlzV2lkZUtleXdvcmRzLFxuICAgIGlzU0NTUyxcbiAgICBpc0xhc3ROb2RlLFxuICAgIGlzTGVzc1BhcnNlcixcbiAgICBpc1NDU1NDb250cm9sRGlyZWN0aXZlTm9kZSxcbiAgICBpc0RldGFjaGVkUnVsZXNldERlY2xhcmF0aW9uTm9kZSxcbiAgICBpc1JlbGF0aW9uYWxPcGVyYXRvck5vZGUsXG4gICAgaXNFcXVhbGl0eU9wZXJhdG9yTm9kZSxcbiAgICBpc011bHRpcGxpY2F0aW9uTm9kZSxcbiAgICBpc0RpdmlzaW9uTm9kZSxcbiAgICBpc0FkZGl0aW9uTm9kZSxcbiAgICBpc1N1YnRyYWN0aW9uTm9kZSxcbiAgICBpc01vZHVsb05vZGUsXG4gICAgaXNNYXRoT3BlcmF0b3JOb2RlLFxuICAgIGlzRWFjaEtleXdvcmROb2RlLFxuICAgIGlzRm9yS2V5d29yZE5vZGUsXG4gICAgaXNVUkxGdW5jdGlvbk5vZGUsXG4gICAgaXNJZkVsc2VLZXl3b3JkTm9kZSxcbiAgICBoYXNDb21wb3Nlc05vZGUsXG4gICAgaGFzUGFyZW5zQXJvdW5kTm9kZSxcbiAgICBoYXNFbXB0eVJhd0JlZm9yZSxcbiAgICBpc1NDU1NOZXN0ZWRQcm9wZXJ0eU5vZGUsXG4gICAgaXNEZXRhY2hlZFJ1bGVzZXRDYWxsTm9kZSxcbiAgICBpc1RlbXBsYXRlUGxhY2Vob2xkZXJOb2RlLFxuICAgIGlzVGVtcGxhdGVQcm9wTm9kZSxcbiAgICBpc1Bvc3Rjc3NTaW1wbGVWYXJOb2RlLFxuICAgIGlzS2V5VmFsdWVQYWlyTm9kZSxcbiAgICBpc0tleVZhbHVlUGFpckluUGFyZW5Hcm91cE5vZGUsXG4gICAgaXNTQ1NTTWFwSXRlbU5vZGUsXG4gICAgaXNJbmxpbmVWYWx1ZUNvbW1lbnROb2RlLFxuICAgIGlzSGFzaE5vZGUsXG4gICAgaXNMZWZ0Q3VybHlCcmFjZU5vZGUsXG4gICAgaXNSaWdodEN1cmx5QnJhY2VOb2RlLFxuICAgIGlzV29yZE5vZGUsXG4gICAgaXNDb2xvbk5vZGUsXG4gICAgaXNNZWRpYUFuZFN1cHBvcnRzS2V5d29yZHMsXG4gICAgaXNDb2xvckFkanVzdGVyRnVuY05vZGUsXG4gICAgbGFzdExpbmVIYXNJbmxpbmVDb21tZW50XG4gIH07XG5cbiAgY29uc3Qge1xuICAgIGluc2VydFByYWdtYTogaW5zZXJ0UHJhZ21hJDJcbiAgfSA9IHByYWdtYSQxO1xuICBjb25zdCB7XG4gICAgcHJpbnROdW1iZXI6IHByaW50TnVtYmVyJDEsXG4gICAgcHJpbnRTdHJpbmc6IHByaW50U3RyaW5nJDEsXG4gICAgaGFzSWdub3JlQ29tbWVudDogaGFzSWdub3JlQ29tbWVudCQxLFxuICAgIGhhc05ld2xpbmU6IGhhc05ld2xpbmUkM1xuICB9ID0gdXRpbCQxO1xuICBjb25zdCB7XG4gICAgaXNOZXh0TGluZUVtcHR5OiBpc05leHRMaW5lRW1wdHkkMlxuICB9ID0gdXRpbFNoYXJlZDtcbiAgY29uc3Qge1xuICAgIHJlc3RvcmVRdW90ZXNJbklubGluZUNvbW1lbnRzOiByZXN0b3JlUXVvdGVzSW5JbmxpbmVDb21tZW50cyQxXG4gIH0gPSBsb2MkMTtcbiAgY29uc3Qge1xuICAgIGJ1aWxkZXJzOiB7XG4gICAgICBjb25jYXQ6IGNvbmNhdCQ1LFxuICAgICAgam9pbjogam9pbiQyLFxuICAgICAgbGluZTogbGluZSQyLFxuICAgICAgaGFyZGxpbmU6IGhhcmRsaW5lJDQsXG4gICAgICBzb2Z0bGluZTogc29mdGxpbmUkMSxcbiAgICAgIGdyb3VwOiBncm91cCQxLFxuICAgICAgZmlsbDogZmlsbCQyLFxuICAgICAgaW5kZW50OiBpbmRlbnQkMixcbiAgICAgIGRlZGVudDogZGVkZW50JDEsXG4gICAgICBpZkJyZWFrOiBpZkJyZWFrJDFcbiAgICB9LFxuICAgIHV0aWxzOiB7XG4gICAgICByZW1vdmVMaW5lczogcmVtb3ZlTGluZXMkMVxuICAgIH1cbiAgfSA9IGRvY3VtZW50O1xuICBjb25zdCB7XG4gICAgZ2V0QW5jZXN0b3JOb2RlOiBnZXRBbmNlc3Rvck5vZGUkMSxcbiAgICBnZXRQcm9wT2ZEZWNsTm9kZTogZ2V0UHJvcE9mRGVjbE5vZGUkMSxcbiAgICBtYXliZVRvTG93ZXJDYXNlOiBtYXliZVRvTG93ZXJDYXNlJDEsXG4gICAgaW5zaWRlVmFsdWVGdW5jdGlvbk5vZGU6IGluc2lkZVZhbHVlRnVuY3Rpb25Ob2RlJDEsXG4gICAgaW5zaWRlSUNTU1J1bGVOb2RlOiBpbnNpZGVJQ1NTUnVsZU5vZGUkMSxcbiAgICBpbnNpZGVBdFJ1bGVOb2RlOiBpbnNpZGVBdFJ1bGVOb2RlJDEsXG4gICAgaW5zaWRlVVJMRnVuY3Rpb25JbkltcG9ydEF0UnVsZU5vZGU6IGluc2lkZVVSTEZ1bmN0aW9uSW5JbXBvcnRBdFJ1bGVOb2RlJDEsXG4gICAgaXNLZXlmcmFtZUF0UnVsZUtleXdvcmRzOiBpc0tleWZyYW1lQXRSdWxlS2V5d29yZHMkMSxcbiAgICBpc1dpZGVLZXl3b3JkczogaXNXaWRlS2V5d29yZHMkMSxcbiAgICBpc1NDU1M6IGlzU0NTUyQxLFxuICAgIGlzTGFzdE5vZGU6IGlzTGFzdE5vZGUkMSxcbiAgICBpc0xlc3NQYXJzZXI6IGlzTGVzc1BhcnNlciQxLFxuICAgIGlzU0NTU0NvbnRyb2xEaXJlY3RpdmVOb2RlOiBpc1NDU1NDb250cm9sRGlyZWN0aXZlTm9kZSQxLFxuICAgIGlzRGV0YWNoZWRSdWxlc2V0RGVjbGFyYXRpb25Ob2RlOiBpc0RldGFjaGVkUnVsZXNldERlY2xhcmF0aW9uTm9kZSQxLFxuICAgIGlzUmVsYXRpb25hbE9wZXJhdG9yTm9kZTogaXNSZWxhdGlvbmFsT3BlcmF0b3JOb2RlJDEsXG4gICAgaXNFcXVhbGl0eU9wZXJhdG9yTm9kZTogaXNFcXVhbGl0eU9wZXJhdG9yTm9kZSQxLFxuICAgIGlzTXVsdGlwbGljYXRpb25Ob2RlOiBpc011bHRpcGxpY2F0aW9uTm9kZSQxLFxuICAgIGlzRGl2aXNpb25Ob2RlOiBpc0RpdmlzaW9uTm9kZSQxLFxuICAgIGlzQWRkaXRpb25Ob2RlOiBpc0FkZGl0aW9uTm9kZSQxLFxuICAgIGlzU3VidHJhY3Rpb25Ob2RlOiBpc1N1YnRyYWN0aW9uTm9kZSQxLFxuICAgIGlzTWF0aE9wZXJhdG9yTm9kZTogaXNNYXRoT3BlcmF0b3JOb2RlJDEsXG4gICAgaXNFYWNoS2V5d29yZE5vZGU6IGlzRWFjaEtleXdvcmROb2RlJDEsXG4gICAgaXNGb3JLZXl3b3JkTm9kZTogaXNGb3JLZXl3b3JkTm9kZSQxLFxuICAgIGlzVVJMRnVuY3Rpb25Ob2RlOiBpc1VSTEZ1bmN0aW9uTm9kZSQxLFxuICAgIGlzSWZFbHNlS2V5d29yZE5vZGU6IGlzSWZFbHNlS2V5d29yZE5vZGUkMSxcbiAgICBoYXNDb21wb3Nlc05vZGU6IGhhc0NvbXBvc2VzTm9kZSQxLFxuICAgIGhhc1BhcmVuc0Fyb3VuZE5vZGU6IGhhc1BhcmVuc0Fyb3VuZE5vZGUkMSxcbiAgICBoYXNFbXB0eVJhd0JlZm9yZTogaGFzRW1wdHlSYXdCZWZvcmUkMSxcbiAgICBpc0tleVZhbHVlUGFpck5vZGU6IGlzS2V5VmFsdWVQYWlyTm9kZSQxLFxuICAgIGlzRGV0YWNoZWRSdWxlc2V0Q2FsbE5vZGU6IGlzRGV0YWNoZWRSdWxlc2V0Q2FsbE5vZGUkMSxcbiAgICBpc1RlbXBsYXRlUGxhY2Vob2xkZXJOb2RlOiBpc1RlbXBsYXRlUGxhY2Vob2xkZXJOb2RlJDEsXG4gICAgaXNUZW1wbGF0ZVByb3BOb2RlOiBpc1RlbXBsYXRlUHJvcE5vZGUkMSxcbiAgICBpc1Bvc3Rjc3NTaW1wbGVWYXJOb2RlOiBpc1Bvc3Rjc3NTaW1wbGVWYXJOb2RlJDEsXG4gICAgaXNTQ1NTTWFwSXRlbU5vZGU6IGlzU0NTU01hcEl0ZW1Ob2RlJDEsXG4gICAgaXNJbmxpbmVWYWx1ZUNvbW1lbnROb2RlOiBpc0lubGluZVZhbHVlQ29tbWVudE5vZGUkMSxcbiAgICBpc0hhc2hOb2RlOiBpc0hhc2hOb2RlJDEsXG4gICAgaXNMZWZ0Q3VybHlCcmFjZU5vZGU6IGlzTGVmdEN1cmx5QnJhY2VOb2RlJDEsXG4gICAgaXNSaWdodEN1cmx5QnJhY2VOb2RlOiBpc1JpZ2h0Q3VybHlCcmFjZU5vZGUkMSxcbiAgICBpc1dvcmROb2RlOiBpc1dvcmROb2RlJDEsXG4gICAgaXNDb2xvbk5vZGU6IGlzQ29sb25Ob2RlJDEsXG4gICAgaXNNZWRpYUFuZFN1cHBvcnRzS2V5d29yZHM6IGlzTWVkaWFBbmRTdXBwb3J0c0tleXdvcmRzJDEsXG4gICAgaXNDb2xvckFkanVzdGVyRnVuY05vZGU6IGlzQ29sb3JBZGp1c3RlckZ1bmNOb2RlJDEsXG4gICAgbGFzdExpbmVIYXNJbmxpbmVDb21tZW50OiBsYXN0TGluZUhhc0lubGluZUNvbW1lbnQkMVxuICB9ID0gdXRpbHMkMjtcblxuICBmdW5jdGlvbiBzaG91bGRQcmludENvbW1hKG9wdGlvbnMpIHtcbiAgICBzd2l0Y2ggKG9wdGlvbnMudHJhaWxpbmdDb21tYSkge1xuICAgICAgY2FzZSBcImFsbFwiOlxuICAgICAgY2FzZSBcImVzNVwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgY2FzZSBcIm5vbmVcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmljUHJpbnQocGF0aCwgb3B0aW9ucywgcHJpbnQpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuXG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwieWFtbFwiOlxuICAgICAgY2FzZSBcInRvbWxcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtub2RlLnJhdywgaGFyZGxpbmUkNF0pO1xuXG4gICAgICBjYXNlIFwiY3NzLXJvb3RcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IG5vZGVzID0gcHJpbnROb2RlU2VxdWVuY2UocGF0aCwgb3B0aW9ucywgcHJpbnQpO1xuXG4gICAgICAgICAgaWYgKG5vZGVzLnBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtub2Rlcywgb3B0aW9ucy5fX2lzSFRNTFN0eWxlQXR0cmlidXRlID8gXCJcIiA6IGhhcmRsaW5lJDRdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcImNzcy1jb21tZW50XCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBpc0lubGluZUNvbW1lbnQgPSBub2RlLmlubGluZSB8fCBub2RlLnJhd3MuaW5saW5lO1xuICAgICAgICAgIGNvbnN0IHRleHQgPSBvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShvcHRpb25zLmxvY1N0YXJ0KG5vZGUpLCBvcHRpb25zLmxvY0VuZChub2RlKSk7XG4gICAgICAgICAgcmV0dXJuIGlzSW5saW5lQ29tbWVudCA/IHRleHQudHJpbUVuZCgpIDogdGV4dDtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiY3NzLXJ1bGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBjb25jYXQkNShbcGF0aC5jYWxsKHByaW50LCBcInNlbGVjdG9yXCIpLCBub2RlLmltcG9ydGFudCA/IFwiICFpbXBvcnRhbnRcIiA6IFwiXCIsIG5vZGUubm9kZXMgPyBjb25jYXQkNShbbm9kZS5zZWxlY3RvciAmJiBub2RlLnNlbGVjdG9yLnR5cGUgPT09IFwic2VsZWN0b3ItdW5rbm93blwiICYmIGxhc3RMaW5lSGFzSW5saW5lQ29tbWVudCQxKG5vZGUuc2VsZWN0b3IudmFsdWUpID8gbGluZSQyIDogXCIgXCIsIFwie1wiLCBub2RlLm5vZGVzLmxlbmd0aCA+IDAgPyBpbmRlbnQkMihjb25jYXQkNShbaGFyZGxpbmUkNCwgcHJpbnROb2RlU2VxdWVuY2UocGF0aCwgb3B0aW9ucywgcHJpbnQpXSkpIDogXCJcIiwgaGFyZGxpbmUkNCwgXCJ9XCIsIGlzRGV0YWNoZWRSdWxlc2V0RGVjbGFyYXRpb25Ob2RlJDEobm9kZSkgPyBcIjtcIiA6IFwiXCJdKSA6IFwiO1wiXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcImNzcy1kZWNsXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtub2RlLnJhd3MuYmVmb3JlLnJlcGxhY2UoL1tcXHM7XS9nLCBcIlwiKSwgaW5zaWRlSUNTU1J1bGVOb2RlJDEocGF0aCkgPyBub2RlLnByb3AgOiBtYXliZVRvTG93ZXJDYXNlJDEobm9kZS5wcm9wKSwgbm9kZS5yYXdzLmJldHdlZW4udHJpbSgpID09PSBcIjpcIiA/IFwiOlwiIDogbm9kZS5yYXdzLmJldHdlZW4udHJpbSgpLCBub2RlLmV4dGVuZCA/IFwiXCIgOiBcIiBcIiwgaGFzQ29tcG9zZXNOb2RlJDEobm9kZSkgPyByZW1vdmVMaW5lcyQxKHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKSkgOiBwYXRoLmNhbGwocHJpbnQsIFwidmFsdWVcIiksIG5vZGUucmF3cy5pbXBvcnRhbnQgPyBub2RlLnJhd3MuaW1wb3J0YW50LnJlcGxhY2UoL1xccyohXFxzKmltcG9ydGFudC9pLCBcIiAhaW1wb3J0YW50XCIpIDogbm9kZS5pbXBvcnRhbnQgPyBcIiAhaW1wb3J0YW50XCIgOiBcIlwiLCBub2RlLnJhd3Muc2Nzc0RlZmF1bHQgPyBub2RlLnJhd3Muc2Nzc0RlZmF1bHQucmVwbGFjZSgvXFxzKiFkZWZhdWx0L2ksIFwiICFkZWZhdWx0XCIpIDogbm9kZS5zY3NzRGVmYXVsdCA/IFwiICFkZWZhdWx0XCIgOiBcIlwiLCBub2RlLnJhd3Muc2Nzc0dsb2JhbCA/IG5vZGUucmF3cy5zY3NzR2xvYmFsLnJlcGxhY2UoL1xccyohZ2xvYmFsL2ksIFwiICFnbG9iYWxcIikgOiBub2RlLnNjc3NHbG9iYWwgPyBcIiAhZ2xvYmFsXCIgOiBcIlwiLCBub2RlLm5vZGVzID8gY29uY2F0JDUoW1wiIHtcIiwgaW5kZW50JDIoY29uY2F0JDUoW3NvZnRsaW5lJDEsIHByaW50Tm9kZVNlcXVlbmNlKHBhdGgsIG9wdGlvbnMsIHByaW50KV0pKSwgc29mdGxpbmUkMSwgXCJ9XCJdKSA6IGlzVGVtcGxhdGVQcm9wTm9kZSQxKG5vZGUpICYmICFwYXJlbnROb2RlLnJhd3Muc2VtaWNvbG9uICYmIG9wdGlvbnMub3JpZ2luYWxUZXh0W29wdGlvbnMubG9jRW5kKG5vZGUpIC0gMV0gIT09IFwiO1wiID8gXCJcIiA6IFwiO1wiXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcImNzcy1hdHJ1bGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcbiAgICAgICAgICBjb25zdCBpc1RlbXBsYXRlUGxhY2Vob2xkZXJOb2RlV2l0aG91dFNlbWlDb2xvbiA9IGlzVGVtcGxhdGVQbGFjZWhvbGRlck5vZGUkMShub2RlKSAmJiAhcGFyZW50Tm9kZS5yYXdzLnNlbWljb2xvbiAmJiBvcHRpb25zLm9yaWdpbmFsVGV4dFtvcHRpb25zLmxvY0VuZChub2RlKSAtIDFdICE9PSBcIjtcIjtcblxuICAgICAgICAgIGlmIChpc0xlc3NQYXJzZXIkMShvcHRpb25zKSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubWl4aW4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtwYXRoLmNhbGwocHJpbnQsIFwic2VsZWN0b3JcIiksIG5vZGUuaW1wb3J0YW50ID8gXCIgIWltcG9ydGFudFwiIDogXCJcIiwgaXNUZW1wbGF0ZVBsYWNlaG9sZGVyTm9kZVdpdGhvdXRTZW1pQ29sb24gPyBcIlwiIDogXCI7XCJdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGUuZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtub2RlLm5hbWUsIGNvbmNhdCQ1KFtwYXRoLmNhbGwocHJpbnQsIFwicGFyYW1zXCIpXSksIGlzVGVtcGxhdGVQbGFjZWhvbGRlck5vZGVXaXRob3V0U2VtaUNvbG9uID8gXCJcIiA6IFwiO1wiXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlLnZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb25jYXQkNShbXCJAXCIsIG5vZGUubmFtZSwgXCI6IFwiLCBub2RlLnZhbHVlID8gY29uY2F0JDUoW3BhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKV0pIDogXCJcIiwgbm9kZS5yYXdzLmJldHdlZW4udHJpbSgpID8gbm9kZS5yYXdzLmJldHdlZW4udHJpbSgpICsgXCIgXCIgOiBcIlwiLCBub2RlLm5vZGVzID8gY29uY2F0JDUoW1wie1wiLCBpbmRlbnQkMihjb25jYXQkNShbbm9kZS5ub2Rlcy5sZW5ndGggPiAwID8gc29mdGxpbmUkMSA6IFwiXCIsIHByaW50Tm9kZVNlcXVlbmNlKHBhdGgsIG9wdGlvbnMsIHByaW50KV0pKSwgc29mdGxpbmUkMSwgXCJ9XCJdKSA6IFwiXCIsIGlzVGVtcGxhdGVQbGFjZWhvbGRlck5vZGVXaXRob3V0U2VtaUNvbG9uID8gXCJcIiA6IFwiO1wiXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtcIkBcIiwgLy8gSWYgYSBMZXNzIGZpbGUgZW5kcyB1cCBiZWluZyBwYXJzZWQgd2l0aCB0aGUgU0NTUyBwYXJzZXIsIExlc3NcbiAgICAgICAgICAvLyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgd2lsbCBiZSBwYXJzZWQgYXMgYXQtcnVsZXMgd2l0aCBuYW1lcyBlbmRpbmdcbiAgICAgICAgICAvLyB3aXRoIGEgY29sb24sIHNvIGtlZXAgdGhlIG9yaWdpbmFsIGNhc2UgdGhlbi5cbiAgICAgICAgICBpc0RldGFjaGVkUnVsZXNldENhbGxOb2RlJDEobm9kZSkgfHwgbm9kZS5uYW1lLmVuZHNXaXRoKFwiOlwiKSA/IG5vZGUubmFtZSA6IG1heWJlVG9Mb3dlckNhc2UkMShub2RlLm5hbWUpLCBub2RlLnBhcmFtcyA/IGNvbmNhdCQ1KFtpc0RldGFjaGVkUnVsZXNldENhbGxOb2RlJDEobm9kZSkgPyBcIlwiIDogaXNUZW1wbGF0ZVBsYWNlaG9sZGVyTm9kZSQxKG5vZGUpID8gbm9kZS5yYXdzLmFmdGVyTmFtZSA9PT0gXCJcIiA/IFwiXCIgOiBub2RlLm5hbWUuZW5kc1dpdGgoXCI6XCIpID8gXCIgXCIgOiAvXlxccypcXG5cXHMqXFxuLy50ZXN0KG5vZGUucmF3cy5hZnRlck5hbWUpID8gY29uY2F0JDUoW2hhcmRsaW5lJDQsIGhhcmRsaW5lJDRdKSA6IC9eXFxzKlxcbi8udGVzdChub2RlLnJhd3MuYWZ0ZXJOYW1lKSA/IGhhcmRsaW5lJDQgOiBcIiBcIiA6IFwiIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwicGFyYW1zXCIpXSkgOiBcIlwiLCBub2RlLnNlbGVjdG9yID8gaW5kZW50JDIoY29uY2F0JDUoW1wiIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwic2VsZWN0b3JcIildKSkgOiBcIlwiLCBub2RlLnZhbHVlID8gZ3JvdXAkMShjb25jYXQkNShbXCIgXCIsIHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKSwgaXNTQ1NTQ29udHJvbERpcmVjdGl2ZU5vZGUkMShub2RlKSA/IGhhc1BhcmVuc0Fyb3VuZE5vZGUkMShub2RlKSA/IFwiIFwiIDogbGluZSQyIDogXCJcIl0pKSA6IG5vZGUubmFtZSA9PT0gXCJlbHNlXCIgPyBcIiBcIiA6IFwiXCIsIG5vZGUubm9kZXMgPyBjb25jYXQkNShbaXNTQ1NTQ29udHJvbERpcmVjdGl2ZU5vZGUkMShub2RlKSA/IFwiXCIgOiBcIiBcIiwgXCJ7XCIsIGluZGVudCQyKGNvbmNhdCQ1KFtub2RlLm5vZGVzLmxlbmd0aCA+IDAgPyBzb2Z0bGluZSQxIDogXCJcIiwgcHJpbnROb2RlU2VxdWVuY2UocGF0aCwgb3B0aW9ucywgcHJpbnQpXSkpLCBzb2Z0bGluZSQxLCBcIn1cIl0pIDogaXNUZW1wbGF0ZVBsYWNlaG9sZGVyTm9kZVdpdGhvdXRTZW1pQ29sb24gPyBcIlwiIDogXCI7XCJdKTtcbiAgICAgICAgfVxuICAgICAgLy8gcG9zdGNzcy1tZWRpYS1xdWVyeS1wYXJzZXJcblxuICAgICAgY2FzZSBcIm1lZGlhLXF1ZXJ5LWxpc3RcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICAgICAgcGF0aC5lYWNoKGNoaWxkUGF0aCA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gY2hpbGRQYXRoLmdldFZhbHVlKCk7XG5cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09IFwibWVkaWEtcXVlcnlcIiAmJiBub2RlLnZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFydHMucHVzaChjaGlsZFBhdGguY2FsbChwcmludCkpO1xuICAgICAgICAgIH0sIFwibm9kZXNcIik7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwJDEoaW5kZW50JDIoam9pbiQyKGxpbmUkMiwgcGFydHMpKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIm1lZGlhLXF1ZXJ5XCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDUoW2pvaW4kMihcIiBcIiwgcGF0aC5tYXAocHJpbnQsIFwibm9kZXNcIikpLCBpc0xhc3ROb2RlJDEocGF0aCwgbm9kZSkgPyBcIlwiIDogXCIsXCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwibWVkaWEtdHlwZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGFkanVzdE51bWJlcnMoYWRqdXN0U3RyaW5ncyhub2RlLnZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIm1lZGlhLWZlYXR1cmUtZXhwcmVzc2lvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCFub2RlLm5vZGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29uY2F0JDUoW1wiKFwiLCBjb25jYXQkNShwYXRoLm1hcChwcmludCwgXCJub2Rlc1wiKSksIFwiKVwiXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIm1lZGlhLWZlYXR1cmVcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBtYXliZVRvTG93ZXJDYXNlJDEoYWRqdXN0U3RyaW5ncyhub2RlLnZhbHVlLnJlcGxhY2UoLyArL2csIFwiIFwiKSwgb3B0aW9ucykpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJtZWRpYS1jb2xvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtub2RlLnZhbHVlLCBcIiBcIl0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJtZWRpYS12YWx1ZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGFkanVzdE51bWJlcnMoYWRqdXN0U3RyaW5ncyhub2RlLnZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIm1lZGlhLWtleXdvcmRcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBhZGp1c3RTdHJpbmdzKG5vZGUudmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJtZWRpYS11cmxcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBhZGp1c3RTdHJpbmdzKG5vZGUudmFsdWUucmVwbGFjZSgvXnVybFxcKFxccysvZ2ksIFwidXJsKFwiKS5yZXBsYWNlKC9cXHMrXFwpJC9naSwgXCIpXCIpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwibWVkaWEtdW5rbm93blwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIC8vIHBvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyXG5cbiAgICAgIGNhc2UgXCJzZWxlY3Rvci1yb290XCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gZ3JvdXAkMShjb25jYXQkNShbaW5zaWRlQXRSdWxlTm9kZSQxKHBhdGgsIFwiY3VzdG9tLXNlbGVjdG9yXCIpID8gY29uY2F0JDUoW2dldEFuY2VzdG9yTm9kZSQxKHBhdGgsIFwiY3NzLWF0cnVsZVwiKS5jdXN0b21TZWxlY3RvciwgbGluZSQyXSkgOiBcIlwiLCBqb2luJDIoY29uY2F0JDUoW1wiLFwiLCBpbnNpZGVBdFJ1bGVOb2RlJDEocGF0aCwgW1wiZXh0ZW5kXCIsIFwiY3VzdG9tLXNlbGVjdG9yXCIsIFwibmVzdFwiXSkgPyBsaW5lJDIgOiBoYXJkbGluZSQ0XSksIHBhdGgubWFwKHByaW50LCBcIm5vZGVzXCIpKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwic2VsZWN0b3Itc2VsZWN0b3JcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBncm91cCQxKGluZGVudCQyKGNvbmNhdCQ1KHBhdGgubWFwKHByaW50LCBcIm5vZGVzXCIpKSkpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJzZWxlY3Rvci1jb21tZW50XCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwic2VsZWN0b3Itc3RyaW5nXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gYWRqdXN0U3RyaW5ncyhub2RlLnZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwic2VsZWN0b3ItdGFnXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnROb2RlICYmIHBhcmVudE5vZGUubm9kZXMuaW5kZXhPZihub2RlKTtcbiAgICAgICAgICBjb25zdCBwcmV2Tm9kZSA9IGluZGV4ICYmIHBhcmVudE5vZGUubm9kZXNbaW5kZXggLSAxXTtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDUoW25vZGUubmFtZXNwYWNlID8gY29uY2F0JDUoW25vZGUubmFtZXNwYWNlID09PSB0cnVlID8gXCJcIiA6IG5vZGUubmFtZXNwYWNlLnRyaW0oKSwgXCJ8XCJdKSA6IFwiXCIsIHByZXZOb2RlLnR5cGUgPT09IFwic2VsZWN0b3ItbmVzdGluZ1wiID8gbm9kZS52YWx1ZSA6IGFkanVzdE51bWJlcnMoaXNLZXlmcmFtZUF0UnVsZUtleXdvcmRzJDEocGF0aCwgbm9kZS52YWx1ZSkgPyBub2RlLnZhbHVlLnRvTG93ZXJDYXNlKCkgOiBub2RlLnZhbHVlKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJzZWxlY3Rvci1pZFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtcIiNcIiwgbm9kZS52YWx1ZV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJzZWxlY3Rvci1jbGFzc1wiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtcIi5cIiwgYWRqdXN0TnVtYmVycyhhZGp1c3RTdHJpbmdzKG5vZGUudmFsdWUsIG9wdGlvbnMpKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJzZWxlY3Rvci1hdHRyaWJ1dGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBjb25jYXQkNShbXCJbXCIsIG5vZGUubmFtZXNwYWNlID8gY29uY2F0JDUoW25vZGUubmFtZXNwYWNlID09PSB0cnVlID8gXCJcIiA6IG5vZGUubmFtZXNwYWNlLnRyaW0oKSwgXCJ8XCJdKSA6IFwiXCIsIG5vZGUuYXR0cmlidXRlLnRyaW0oKSwgbm9kZS5vcGVyYXRvciA/IG5vZGUub3BlcmF0b3IgOiBcIlwiLCBub2RlLnZhbHVlID8gcXVvdGVBdHRyaWJ1dGVWYWx1ZShhZGp1c3RTdHJpbmdzKG5vZGUudmFsdWUudHJpbSgpLCBvcHRpb25zKSwgb3B0aW9ucykgOiBcIlwiLCBub2RlLmluc2Vuc2l0aXZlID8gXCIgaVwiIDogXCJcIiwgXCJdXCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwic2VsZWN0b3ItY29tYmluYXRvclwiOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKG5vZGUudmFsdWUgPT09IFwiK1wiIHx8IG5vZGUudmFsdWUgPT09IFwiPlwiIHx8IG5vZGUudmFsdWUgPT09IFwiflwiIHx8IG5vZGUudmFsdWUgPT09IFwiPj4+XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGxlYWRpbmcgPSBwYXJlbnROb2RlLnR5cGUgPT09IFwic2VsZWN0b3Itc2VsZWN0b3JcIiAmJiBwYXJlbnROb2RlLm5vZGVzWzBdID09PSBub2RlID8gXCJcIiA6IGxpbmUkMjtcbiAgICAgICAgICAgIHJldHVybiBjb25jYXQkNShbbGVhZGluZywgbm9kZS52YWx1ZSwgaXNMYXN0Tm9kZSQxKHBhdGgsIG5vZGUpID8gXCJcIiA6IFwiIFwiXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbGVhZGluZyA9IG5vZGUudmFsdWUudHJpbSgpLnN0YXJ0c1dpdGgoXCIoXCIpID8gbGluZSQyIDogXCJcIjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFkanVzdE51bWJlcnMoYWRqdXN0U3RyaW5ncyhub2RlLnZhbHVlLnRyaW0oKSwgb3B0aW9ucykpIHx8IGxpbmUkMjtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDUoW2xlYWRpbmcsIHZhbHVlXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInNlbGVjdG9yLXVuaXZlcnNhbFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtub2RlLm5hbWVzcGFjZSA/IGNvbmNhdCQ1KFtub2RlLm5hbWVzcGFjZSA9PT0gdHJ1ZSA/IFwiXCIgOiBub2RlLm5hbWVzcGFjZS50cmltKCksIFwifFwiXSkgOiBcIlwiLCBub2RlLnZhbHVlXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInNlbGVjdG9yLXBzZXVkb1wiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFttYXliZVRvTG93ZXJDYXNlJDEobm9kZS52YWx1ZSksIG5vZGUubm9kZXMgJiYgbm9kZS5ub2Rlcy5sZW5ndGggPiAwID8gY29uY2F0JDUoW1wiKFwiLCBqb2luJDIoXCIsIFwiLCBwYXRoLm1hcChwcmludCwgXCJub2Rlc1wiKSksIFwiKVwiXSkgOiBcIlwiXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInNlbGVjdG9yLW5lc3RpbmdcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJzZWxlY3Rvci11bmtub3duXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBydWxlQW5jZXN0b3JOb2RlID0gZ2V0QW5jZXN0b3JOb2RlJDEocGF0aCwgXCJjc3MtcnVsZVwiKTsgLy8gTmVzdGVkIFNDU1MgcHJvcGVydHlcblxuICAgICAgICAgIGlmIChydWxlQW5jZXN0b3JOb2RlICYmIHJ1bGVBbmNlc3Rvck5vZGUuaXNTQ1NTTmVzdGVyUHJvcGVydHkpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGp1c3ROdW1iZXJzKGFkanVzdFN0cmluZ3MobWF5YmVUb0xvd2VyQ2FzZSQxKG5vZGUudmFsdWUpLCBvcHRpb25zKSk7XG4gICAgICAgICAgfSAvLyBvcmlnaW5hbFRleHQgaGFzIHRvIGJlIHVzZWQgZm9yIExlc3MsIHNlZSByZXBsYWNlUXVvdGVzSW5JbmxpbmVDb21tZW50cyBpbiBsb2MuanNcblxuXG4gICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuXG4gICAgICAgICAgaWYgKHBhcmVudE5vZGUucmF3cyAmJiBwYXJlbnROb2RlLnJhd3Muc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gb3B0aW9ucy5sb2NTdGFydChwYXJlbnROb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgcGFyZW50Tm9kZS5yYXdzLnNlbGVjdG9yLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShzdGFydCwgZW5kKS50cmltKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIC8vIHBvc3Rjc3MtdmFsdWVzLXBhcnNlclxuXG4gICAgICBjYXNlIFwidmFsdWUtdmFsdWVcIjpcbiAgICAgIGNhc2UgXCJ2YWx1ZS1yb290XCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gcGF0aC5jYWxsKHByaW50LCBcImdyb3VwXCIpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJ2YWx1ZS1jb21tZW50XCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDUoW25vZGUuaW5saW5lID8gXCIvL1wiIDogXCIvKlwiLCAvLyBzZWUgcmVwbGFjZVF1b3Rlc0luSW5saW5lQ29tbWVudHMgaW4gbG9jLmpzXG4gICAgICAgICAgLy8gdmFsdWUtKiBub2RlcyBkb24ndCBoYXZlIGNvcnJlY3QgbG9jYXRpb24gZGF0YSwgc28gd2UgaGF2ZSB0byByZWx5IG9uIHBsYWNlaG9sZGVyIGNoYXJhY3RlcnMuXG4gICAgICAgICAgcmVzdG9yZVF1b3Rlc0luSW5saW5lQ29tbWVudHMkMShub2RlLnZhbHVlKSwgbm9kZS5pbmxpbmUgPyBcIlwiIDogXCIqL1wiXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInZhbHVlLWNvbW1hX2dyb3VwXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgICAgICAgY29uc3QgcGFyZW50UGFyZW50Tm9kZSA9IHBhdGguZ2V0UGFyZW50Tm9kZSgxKTtcbiAgICAgICAgICBjb25zdCBkZWNsQW5jZXN0b3JQcm9wID0gZ2V0UHJvcE9mRGVjbE5vZGUkMShwYXRoKTtcbiAgICAgICAgICBjb25zdCBpc0dyaWRWYWx1ZSA9IGRlY2xBbmNlc3RvclByb3AgJiYgcGFyZW50Tm9kZS50eXBlID09PSBcInZhbHVlLXZhbHVlXCIgJiYgKGRlY2xBbmNlc3RvclByb3AgPT09IFwiZ3JpZFwiIHx8IGRlY2xBbmNlc3RvclByb3Auc3RhcnRzV2l0aChcImdyaWQtdGVtcGxhdGVcIikpO1xuICAgICAgICAgIGNvbnN0IGF0UnVsZUFuY2VzdG9yTm9kZSA9IGdldEFuY2VzdG9yTm9kZSQxKHBhdGgsIFwiY3NzLWF0cnVsZVwiKTtcbiAgICAgICAgICBjb25zdCBpc0NvbnRyb2xEaXJlY3RpdmUgPSBhdFJ1bGVBbmNlc3Rvck5vZGUgJiYgaXNTQ1NTQ29udHJvbERpcmVjdGl2ZU5vZGUkMShhdFJ1bGVBbmNlc3Rvck5vZGUpO1xuICAgICAgICAgIGNvbnN0IHByaW50ZWQgPSBwYXRoLm1hcChwcmludCwgXCJncm91cHNcIik7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICAgICAgICBjb25zdCBpbnNpZGVVUkxGdW5jdGlvbiA9IGluc2lkZVZhbHVlRnVuY3Rpb25Ob2RlJDEocGF0aCwgXCJ1cmxcIik7XG4gICAgICAgICAgbGV0IGluc2lkZVNDU1NJbnRlcnBvbGF0aW9uSW5TdHJpbmcgPSBmYWxzZTtcbiAgICAgICAgICBsZXQgZGlkQnJlYWsgPSBmYWxzZTtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5ncm91cHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2gocHJpbnRlZFtpXSk7XG4gICAgICAgICAgICBjb25zdCBpUHJldk5vZGUgPSBub2RlLmdyb3Vwc1tpIC0gMV07XG4gICAgICAgICAgICBjb25zdCBpTm9kZSA9IG5vZGUuZ3JvdXBzW2ldO1xuICAgICAgICAgICAgY29uc3QgaU5leHROb2RlID0gbm9kZS5ncm91cHNbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgaU5leHROZXh0Tm9kZSA9IG5vZGUuZ3JvdXBzW2kgKyAyXTtcblxuICAgICAgICAgICAgaWYgKGluc2lkZVVSTEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChpTmV4dE5vZGUgJiYgaXNBZGRpdGlvbk5vZGUkMShpTmV4dE5vZGUpIHx8IGlzQWRkaXRpb25Ob2RlJDEoaU5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChcIiBcIik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gLy8gSWdub3JlIGFmdGVyIGxhdGVzdCBub2RlIChpLmUuIGJlZm9yZSBzZW1pY29sb24pXG5cblxuICAgICAgICAgICAgaWYgKCFpTmV4dE5vZGUpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IC8vIHN0eWxlZC5kaXZgIGJhY2tncm91bmQ6IHZhcigtLSR7b25lfSk7IGBcblxuXG4gICAgICAgICAgICBpZiAoIWlQcmV2Tm9kZSAmJiBpTm9kZS52YWx1ZSA9PT0gXCItLVwiICYmIGlOZXh0Tm9kZS50eXBlID09PSBcInZhbHVlLWF0d29yZFwiKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSAvLyBJZ25vcmUgc3BhY2VzIGJlZm9yZS9hZnRlciBzdHJpbmcgaW50ZXJwb2xhdGlvbiAoaS5lLiBgXCIje215LWZuKFwiX1wiKX1cImApXG5cblxuICAgICAgICAgICAgY29uc3QgaXNTdGFydFNDU1NJbnRlcnBvbGF0aW9uSW5TdHJpbmcgPSBpTm9kZS50eXBlID09PSBcInZhbHVlLXN0cmluZ1wiICYmIGlOb2RlLnZhbHVlLnN0YXJ0c1dpdGgoXCIje1wiKTtcbiAgICAgICAgICAgIGNvbnN0IGlzRW5kaW5nU0NTU0ludGVycG9sYXRpb25JblN0cmluZyA9IGluc2lkZVNDU1NJbnRlcnBvbGF0aW9uSW5TdHJpbmcgJiYgaU5leHROb2RlLnR5cGUgPT09IFwidmFsdWUtc3RyaW5nXCIgJiYgaU5leHROb2RlLnZhbHVlLmVuZHNXaXRoKFwifVwiKTtcblxuICAgICAgICAgICAgaWYgKGlzU3RhcnRTQ1NTSW50ZXJwb2xhdGlvbkluU3RyaW5nIHx8IGlzRW5kaW5nU0NTU0ludGVycG9sYXRpb25JblN0cmluZykge1xuICAgICAgICAgICAgICBpbnNpZGVTQ1NTSW50ZXJwb2xhdGlvbkluU3RyaW5nID0gIWluc2lkZVNDU1NJbnRlcnBvbGF0aW9uSW5TdHJpbmc7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5zaWRlU0NTU0ludGVycG9sYXRpb25JblN0cmluZykge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gLy8gSWdub3JlIGNvbG9uIChpLmUuIGA6YClcblxuXG4gICAgICAgICAgICBpZiAoaXNDb2xvbk5vZGUkMShpTm9kZSkgfHwgaXNDb2xvbk5vZGUkMShpTmV4dE5vZGUpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSAvLyBJZ25vcmUgYEBgIGluIExlc3MgKGkuZS4gYEBAdmFyO2ApXG5cblxuICAgICAgICAgICAgaWYgKGlOb2RlLnR5cGUgPT09IFwidmFsdWUtYXR3b3JkXCIgJiYgaU5vZGUudmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IC8vIElnbm9yZSBgfmAgaW4gTGVzcyAoaS5lLiBgY29udGVudDogflwiXi8vKiBzb21lIGhvcnJpYmxlIGJ1dCBuZWVkZWQgY3NzIGhhY2tcIjtgKVxuXG5cbiAgICAgICAgICAgIGlmIChpTm9kZS52YWx1ZSA9PT0gXCJ+XCIpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IC8vIElnbm9yZSBlc2NhcGUgYFxcYFxuXG5cbiAgICAgICAgICAgIGlmIChpTm9kZS52YWx1ZSAmJiBpTm9kZS52YWx1ZS5pbmNsdWRlcyhcIlxcXFxcIikgJiYgaU5leHROb2RlICYmIGlOZXh0Tm9kZS50eXBlICE9PSBcInZhbHVlLWNvbW1lbnRcIikge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gLy8gSWdub3JlIGVzY2FwZWQgYC9gXG5cblxuICAgICAgICAgICAgaWYgKGlQcmV2Tm9kZSAmJiBpUHJldk5vZGUudmFsdWUgJiYgaVByZXZOb2RlLnZhbHVlLmluZGV4T2YoXCJcXFxcXCIpID09PSBpUHJldk5vZGUudmFsdWUubGVuZ3RoIC0gMSAmJiBpTm9kZS50eXBlID09PSBcInZhbHVlLW9wZXJhdG9yXCIgJiYgaU5vZGUudmFsdWUgPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSAvLyBJZ25vcmUgYFxcYCAoaS5lLiBgJHZhcmlhYmxlOiBcXEBzbWFsbDtgKVxuXG5cbiAgICAgICAgICAgIGlmIChpTm9kZS52YWx1ZSA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IC8vIElnbm9yZSBgJCRgIChpLmUuIGBiYWNrZ3JvdW5kLWNvbG9yOiAkJChzdHlsZSlDb2xvcjtgKVxuXG5cbiAgICAgICAgICAgIGlmIChpc1Bvc3Rjc3NTaW1wbGVWYXJOb2RlJDEoaU5vZGUsIGlOZXh0Tm9kZSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IC8vIElnbm9yZSBzcGFjZXMgYWZ0ZXIgYCNgIGFuZCBhZnRlciBge2AgYW5kIGJlZm9yZSBgfWAgaW4gU0NTUyBpbnRlcnBvbGF0aW9uIChpLmUuIGAje3ZhcmlhYmxlfWApXG5cblxuICAgICAgICAgICAgaWYgKGlzSGFzaE5vZGUkMShpTm9kZSkgfHwgaXNMZWZ0Q3VybHlCcmFjZU5vZGUkMShpTm9kZSkgfHwgaXNSaWdodEN1cmx5QnJhY2VOb2RlJDEoaU5leHROb2RlKSB8fCBpc0xlZnRDdXJseUJyYWNlTm9kZSQxKGlOZXh0Tm9kZSkgJiYgaGFzRW1wdHlSYXdCZWZvcmUkMShpTmV4dE5vZGUpIHx8IGlzUmlnaHRDdXJseUJyYWNlTm9kZSQxKGlOb2RlKSAmJiBoYXNFbXB0eVJhd0JlZm9yZSQxKGlOZXh0Tm9kZSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IC8vIElnbm9yZSBjc3MgdmFyaWFibGVzIGFuZCBpbnRlcnBvbGF0aW9uIGluIFNDU1MgKGkuZS4gYC0tI3skdmFyfWApXG5cblxuICAgICAgICAgICAgaWYgKGlOb2RlLnZhbHVlID09PSBcIi0tXCIgJiYgaXNIYXNoTm9kZSQxKGlOZXh0Tm9kZSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IC8vIEZvcm1hdHRpbmcgbWF0aCBvcGVyYXRpb25zXG5cblxuICAgICAgICAgICAgY29uc3QgaXNNYXRoT3BlcmF0b3IgPSBpc01hdGhPcGVyYXRvck5vZGUkMShpTm9kZSk7XG4gICAgICAgICAgICBjb25zdCBpc05leHRNYXRoT3BlcmF0b3IgPSBpc01hdGhPcGVyYXRvck5vZGUkMShpTmV4dE5vZGUpOyAvLyBQcmludCBzcGFjZXMgYmVmb3JlIGFuZCBhZnRlciBtYXRoIG9wZXJhdG9ycyBiZXNpZGUgU0NTUyBpbnRlcnBvbGF0aW9uIGFzIGlzXG4gICAgICAgICAgICAvLyAoaS5lLiBgI3skdmFyfSs1YCwgYCN7JHZhcn0gKzVgLCBgI3skdmFyfSsgNWAsIGAjeyR2YXJ9ICsgNWApXG4gICAgICAgICAgICAvLyAoaS5lLiBgNSsjeyR2YXJ9YCwgYDUgKyN7JHZhcn1gLCBgNSsgI3skdmFyfWAsIGA1ICsgI3skdmFyfWApXG5cbiAgICAgICAgICAgIGlmICgoaXNNYXRoT3BlcmF0b3IgJiYgaXNIYXNoTm9kZSQxKGlOZXh0Tm9kZSkgfHwgaXNOZXh0TWF0aE9wZXJhdG9yICYmIGlzUmlnaHRDdXJseUJyYWNlTm9kZSQxKGlOb2RlKSkgJiYgaGFzRW1wdHlSYXdCZWZvcmUkMShpTmV4dE5vZGUpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSAvLyBQcmludCBzcGFjZXMgYmVmb3JlIGFuZCBhZnRlciBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gbWF0aCBvcGVyYXRvcnMgYXMgaXMgaW4gYGNhbGNgIGZ1bmN0aW9uXG4gICAgICAgICAgICAvLyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBpdCBpcyBub3QgdmFsaWQgc3ludGF4XG4gICAgICAgICAgICAvLyAoaS5lLiBgY2FsYygxcHgrMXB4KWAsIGBjYWxjKDFweCsgMXB4KWAsIGBjYWxjKDFweCArMXB4KWAsIGBjYWxjKDFweCArIDFweClgKVxuXG5cbiAgICAgICAgICAgIGlmIChpbnNpZGVWYWx1ZUZ1bmN0aW9uTm9kZSQxKHBhdGgsIFwiY2FsY1wiKSAmJiAoaXNBZGRpdGlvbk5vZGUkMShpTm9kZSkgfHwgaXNBZGRpdGlvbk5vZGUkMShpTmV4dE5vZGUpIHx8IGlzU3VidHJhY3Rpb25Ob2RlJDEoaU5vZGUpIHx8IGlzU3VidHJhY3Rpb25Ob2RlJDEoaU5leHROb2RlKSkgJiYgaGFzRW1wdHlSYXdCZWZvcmUkMShpTmV4dE5vZGUpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSAvLyBQcmludCBzcGFjZXMgYWZ0ZXIgYCtgIGFuZCBgLWAgaW4gY29sb3IgYWRqdXN0ZXIgZnVuY3Rpb25zIGFzIGlzIChlLmcuIGBjb2xvcihyZWQgbCgrIDIwJSkpYClcbiAgICAgICAgICAgIC8vIEFkanVzdGVycyB3aXRoIHNpZ25lZCBudW1iZXJzIChlLmcuIGBjb2xvcihyZWQgbCgrMjAlKSlgKSBvdXRwdXQgYXMtaXMuXG5cblxuICAgICAgICAgICAgY29uc3QgaXNDb2xvckFkanVzdGVyTm9kZSA9IChpc0FkZGl0aW9uTm9kZSQxKGlOb2RlKSB8fCBpc1N1YnRyYWN0aW9uTm9kZSQxKGlOb2RlKSkgJiYgaSA9PT0gMCAmJiAoaU5leHROb2RlLnR5cGUgPT09IFwidmFsdWUtbnVtYmVyXCIgfHwgaU5leHROb2RlLmlzSGV4KSAmJiBwYXJlbnRQYXJlbnROb2RlICYmIGlzQ29sb3JBZGp1c3RlckZ1bmNOb2RlJDEocGFyZW50UGFyZW50Tm9kZSkgJiYgIWhhc0VtcHR5UmF3QmVmb3JlJDEoaU5leHROb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVTcGFjZUJlZm9yZU9wZXJhdG9yID0gaU5leHROZXh0Tm9kZSAmJiBpTmV4dE5leHROb2RlLnR5cGUgPT09IFwidmFsdWUtZnVuY1wiIHx8IGlOZXh0TmV4dE5vZGUgJiYgaXNXb3JkTm9kZSQxKGlOZXh0TmV4dE5vZGUpIHx8IGlOb2RlLnR5cGUgPT09IFwidmFsdWUtZnVuY1wiIHx8IGlzV29yZE5vZGUkMShpTm9kZSk7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlU3BhY2VBZnRlck9wZXJhdG9yID0gaU5leHROb2RlLnR5cGUgPT09IFwidmFsdWUtZnVuY1wiIHx8IGlzV29yZE5vZGUkMShpTmV4dE5vZGUpIHx8IGlQcmV2Tm9kZSAmJiBpUHJldk5vZGUudHlwZSA9PT0gXCJ2YWx1ZS1mdW5jXCIgfHwgaVByZXZOb2RlICYmIGlzV29yZE5vZGUkMShpUHJldk5vZGUpOyAvLyBGb3JtYXR0aW5nIGAvYCwgYCtgLCBgLWAgc2lnblxuXG4gICAgICAgICAgICBpZiAoIShpc011bHRpcGxpY2F0aW9uTm9kZSQxKGlOZXh0Tm9kZSkgfHwgaXNNdWx0aXBsaWNhdGlvbk5vZGUkMShpTm9kZSkpICYmICFpbnNpZGVWYWx1ZUZ1bmN0aW9uTm9kZSQxKHBhdGgsIFwiY2FsY1wiKSAmJiAhaXNDb2xvckFkanVzdGVyTm9kZSAmJiAoaXNEaXZpc2lvbk5vZGUkMShpTmV4dE5vZGUpICYmICFyZXF1aXJlU3BhY2VCZWZvcmVPcGVyYXRvciB8fCBpc0RpdmlzaW9uTm9kZSQxKGlOb2RlKSAmJiAhcmVxdWlyZVNwYWNlQWZ0ZXJPcGVyYXRvciB8fCBpc0FkZGl0aW9uTm9kZSQxKGlOZXh0Tm9kZSkgJiYgIXJlcXVpcmVTcGFjZUJlZm9yZU9wZXJhdG9yIHx8IGlzQWRkaXRpb25Ob2RlJDEoaU5vZGUpICYmICFyZXF1aXJlU3BhY2VBZnRlck9wZXJhdG9yIHx8IGlzU3VidHJhY3Rpb25Ob2RlJDEoaU5leHROb2RlKSB8fCBpc1N1YnRyYWN0aW9uTm9kZSQxKGlOb2RlKSkgJiYgKGhhc0VtcHR5UmF3QmVmb3JlJDEoaU5leHROb2RlKSB8fCBpc01hdGhPcGVyYXRvciAmJiAoIWlQcmV2Tm9kZSB8fCBpUHJldk5vZGUgJiYgaXNNYXRoT3BlcmF0b3JOb2RlJDEoaVByZXZOb2RlKSkpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSAvLyBBZGQgYGhhcmRsaW5lYCBhZnRlciBpbmxpbmUgY29tbWVudCAoaS5lLiBgLy8gY29tbWVudFxcbiBmb286IGJhcjtgKVxuXG5cbiAgICAgICAgICAgIGlmIChpc0lubGluZVZhbHVlQ29tbWVudE5vZGUkMShpTm9kZSkpIHtcbiAgICAgICAgICAgICAgcGFydHMucHVzaChoYXJkbGluZSQ0KTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IC8vIEhhbmRsZSBrZXl3b3JkcyBpbiBTQ1NTIGNvbnRyb2wgZGlyZWN0aXZlXG5cblxuICAgICAgICAgICAgaWYgKGlzQ29udHJvbERpcmVjdGl2ZSAmJiAoaXNFcXVhbGl0eU9wZXJhdG9yTm9kZSQxKGlOZXh0Tm9kZSkgfHwgaXNSZWxhdGlvbmFsT3BlcmF0b3JOb2RlJDEoaU5leHROb2RlKSB8fCBpc0lmRWxzZUtleXdvcmROb2RlJDEoaU5leHROb2RlKSB8fCBpc0VhY2hLZXl3b3JkTm9kZSQxKGlOb2RlKSB8fCBpc0ZvcktleXdvcmROb2RlJDEoaU5vZGUpKSkge1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFwiIFwiKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IC8vIEF0LXJ1bGUgYG5hbWVzcGFjZWAgc2hvdWxkIGJlIGluIG9uZSBsaW5lXG5cblxuICAgICAgICAgICAgaWYgKGF0UnVsZUFuY2VzdG9yTm9kZSAmJiBhdFJ1bGVBbmNlc3Rvck5vZGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIm5hbWVzcGFjZVwiKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goXCIgXCIpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gLy8gRm9ybWF0dGluZyBgZ3JpZGAgcHJvcGVydHlcblxuXG4gICAgICAgICAgICBpZiAoaXNHcmlkVmFsdWUpIHtcbiAgICAgICAgICAgICAgaWYgKGlOb2RlLnNvdXJjZSAmJiBpTmV4dE5vZGUuc291cmNlICYmIGlOb2RlLnNvdXJjZS5zdGFydC5saW5lICE9PSBpTmV4dE5vZGUuc291cmNlLnN0YXJ0LmxpbmUpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGhhcmRsaW5lJDQpO1xuICAgICAgICAgICAgICAgIGRpZEJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFwiIFwiKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSAvLyBBZGQgYHNwYWNlYCBiZWZvcmUgbmV4dCBtYXRoIG9wZXJhdGlvblxuICAgICAgICAgICAgLy8gTm90ZTogYGdyaXBgIHByb3BlcnR5IGhhdmUgYC9gIGRlbGltaXRlciBhbmQgaXQgaXMgbm90IG1hdGggb3BlcmF0aW9uLCBzb1xuICAgICAgICAgICAgLy8gYGdyaWRgIHByb3BlcnR5IGhhbmRsZXMgYWJvdmVcblxuXG4gICAgICAgICAgICBpZiAoaXNOZXh0TWF0aE9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goXCIgXCIpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gLy8gQmUgZGVmYXVsdCBhbGwgdmFsdWVzIGdvIHRocm91Z2ggYGxpbmVgXG5cblxuICAgICAgICAgICAgcGFydHMucHVzaChsaW5lJDIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkaWRCcmVhaykge1xuICAgICAgICAgICAgcGFydHMudW5zaGlmdChoYXJkbGluZSQ0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNDb250cm9sRGlyZWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAkMShpbmRlbnQkMihjb25jYXQkNShwYXJ0cykpKTtcbiAgICAgICAgICB9IC8vIEluZGVudCBpcyBub3QgbmVlZGVkIGZvciBpbXBvcnQgdXJsIHdoZW4gdXJsIGlzIHZlcnkgbG9uZ1xuICAgICAgICAgIC8vIGFuZCBub2RlIGhhcyB0d28gZ3JvdXBzXG4gICAgICAgICAgLy8gd2hlbiB0eXBlIGlzIHZhbHVlLWNvbW1hX2dyb3VwXG4gICAgICAgICAgLy8gZXhhbXBsZSBAaW1wb3J0IHVybChcInZlcnlsb25ndXJsXCIpIHByb2plY3Rpb24sdHZcblxuXG4gICAgICAgICAgaWYgKGluc2lkZVVSTEZ1bmN0aW9uSW5JbXBvcnRBdFJ1bGVOb2RlJDEocGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBncm91cCQxKGZpbGwkMihwYXJ0cykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBncm91cCQxKGluZGVudCQyKGZpbGwkMihwYXJ0cykpKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwidmFsdWUtcGFyZW5fZ3JvdXBcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcblxuICAgICAgICAgIGlmIChwYXJlbnROb2RlICYmIGlzVVJMRnVuY3Rpb25Ob2RlJDEocGFyZW50Tm9kZSkgJiYgKG5vZGUuZ3JvdXBzLmxlbmd0aCA9PT0gMSB8fCBub2RlLmdyb3Vwcy5sZW5ndGggPiAwICYmIG5vZGUuZ3JvdXBzWzBdLnR5cGUgPT09IFwidmFsdWUtY29tbWFfZ3JvdXBcIiAmJiBub2RlLmdyb3Vwc1swXS5ncm91cHMubGVuZ3RoID4gMCAmJiBub2RlLmdyb3Vwc1swXS5ncm91cHNbMF0udHlwZSA9PT0gXCJ2YWx1ZS13b3JkXCIgJiYgbm9kZS5ncm91cHNbMF0uZ3JvdXBzWzBdLnZhbHVlLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jYXQkNShbbm9kZS5vcGVuID8gcGF0aC5jYWxsKHByaW50LCBcIm9wZW5cIikgOiBcIlwiLCBqb2luJDIoXCIsXCIsIHBhdGgubWFwKHByaW50LCBcImdyb3Vwc1wiKSksIG5vZGUuY2xvc2UgPyBwYXRoLmNhbGwocHJpbnQsIFwiY2xvc2VcIikgOiBcIlwiXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFub2RlLm9wZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHByaW50ZWQgPSBwYXRoLm1hcChwcmludCwgXCJncm91cHNcIik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmludGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goY29uY2F0JDUoW1wiLFwiLCBsaW5lJDJdKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXMucHVzaChwcmludGVkW2ldKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGdyb3VwJDEoaW5kZW50JDIoZmlsbCQyKHJlcykpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc1NDU1NNYXBJdGVtID0gaXNTQ1NTTWFwSXRlbU5vZGUkMShwYXRoKTtcbiAgICAgICAgICBjb25zdCBsYXN0SXRlbSA9IG5vZGUuZ3JvdXBzW25vZGUuZ3JvdXBzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGNvbnN0IGlzTGFzdEl0ZW1Db21tZW50ID0gbGFzdEl0ZW0gJiYgbGFzdEl0ZW0udHlwZSA9PT0gXCJ2YWx1ZS1jb21tZW50XCI7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwJDEoY29uY2F0JDUoW25vZGUub3BlbiA/IHBhdGguY2FsbChwcmludCwgXCJvcGVuXCIpIDogXCJcIiwgaW5kZW50JDIoY29uY2F0JDUoW3NvZnRsaW5lJDEsIGpvaW4kMihjb25jYXQkNShbXCIsXCIsIGxpbmUkMl0pLCBwYXRoLm1hcChjaGlsZFBhdGggPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGNoaWxkUGF0aC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgY29uc3QgcHJpbnRlZCA9IHByaW50KGNoaWxkUGF0aCk7IC8vIEtleS9WYWx1ZSBwYWlyIGluIG9wZW4gcGFyZW4gYWxyZWFkeSBpbmRlbnRlZFxuXG4gICAgICAgICAgICBpZiAoaXNLZXlWYWx1ZVBhaXJOb2RlJDEobm9kZSkgJiYgbm9kZS50eXBlID09PSBcInZhbHVlLWNvbW1hX2dyb3VwXCIgJiYgbm9kZS5ncm91cHMgJiYgbm9kZS5ncm91cHNbMl0gJiYgbm9kZS5ncm91cHNbMl0udHlwZSA9PT0gXCJ2YWx1ZS1wYXJlbl9ncm91cFwiKSB7XG4gICAgICAgICAgICAgIHByaW50ZWQuY29udGVudHMuY29udGVudHMucGFydHNbMV0gPSBncm91cCQxKHByaW50ZWQuY29udGVudHMuY29udGVudHMucGFydHNbMV0pO1xuICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAkMShkZWRlbnQkMShwcmludGVkKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwcmludGVkO1xuICAgICAgICAgIH0sIFwiZ3JvdXBzXCIpKV0pKSwgaWZCcmVhayQxKCFpc0xhc3RJdGVtQ29tbWVudCAmJiBpc1NDU1MkMShvcHRpb25zLnBhcnNlciwgb3B0aW9ucy5vcmlnaW5hbFRleHQpICYmIGlzU0NTU01hcEl0ZW0gJiYgc2hvdWxkUHJpbnRDb21tYShvcHRpb25zKSA/IFwiLFwiIDogXCJcIiksIHNvZnRsaW5lJDEsIG5vZGUuY2xvc2UgPyBwYXRoLmNhbGwocHJpbnQsIFwiY2xvc2VcIikgOiBcIlwiXSksIHtcbiAgICAgICAgICAgIHNob3VsZEJyZWFrOiBpc1NDU1NNYXBJdGVtXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInZhbHVlLWZ1bmNcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBjb25jYXQkNShbbm9kZS52YWx1ZSwgaW5zaWRlQXRSdWxlTm9kZSQxKHBhdGgsIFwic3VwcG9ydHNcIikgJiYgaXNNZWRpYUFuZFN1cHBvcnRzS2V5d29yZHMkMShub2RlKSA/IFwiIFwiIDogXCJcIiwgcGF0aC5jYWxsKHByaW50LCBcImdyb3VwXCIpXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInZhbHVlLXBhcmVuXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwidmFsdWUtbnVtYmVyXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDUoW3ByaW50Q3NzTnVtYmVyKG5vZGUudmFsdWUpLCBtYXliZVRvTG93ZXJDYXNlJDEobm9kZS51bml0KV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJ2YWx1ZS1vcGVyYXRvclwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInZhbHVlLXdvcmRcIjpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChub2RlLmlzQ29sb3IgJiYgbm9kZS5pc0hleCB8fCBpc1dpZGVLZXl3b3JkcyQxKG5vZGUudmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJ2YWx1ZS1jb2xvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtub2RlLnZhbHVlLCAvLyBEb24ndCBhZGQgc3BhY2VzIG9uIGA6YCBpbiBgdXJsYCBmdW5jdGlvbiAoaS5lLiBgdXJsKGZiZ2x5cGg6IGNyb3NzLW91dGxpbmUsIGZpZy13aGl0ZSlgKVxuICAgICAgICAgIGluc2lkZVZhbHVlRnVuY3Rpb25Ob2RlJDEocGF0aCwgXCJ1cmxcIikgPyBcIlwiIDogbGluZSQyXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInZhbHVlLWNvbW1hXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDUoW25vZGUudmFsdWUsIFwiIFwiXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInZhbHVlLXN0cmluZ1wiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHByaW50U3RyaW5nJDEobm9kZS5yYXdzLnF1b3RlICsgbm9kZS52YWx1ZSArIG5vZGUucmF3cy5xdW90ZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInZhbHVlLWF0d29yZFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ1KFtcIkBcIiwgbm9kZS52YWx1ZV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJ2YWx1ZS11bmljb2RlLXJhbmdlXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwidmFsdWUtdW5rbm93blwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBwb3N0Y3NzIHR5cGUgXCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KG5vZGUudHlwZSkpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcmludE5vZGVTZXF1ZW5jZShwYXRoLCBvcHRpb25zLCBwcmludCkge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICBsZXQgaSA9IDA7XG4gICAgcGF0aC5tYXAocGF0aENoaWxkID0+IHtcbiAgICAgIGNvbnN0IHByZXZOb2RlID0gbm9kZS5ub2Rlc1tpIC0gMV07XG5cbiAgICAgIGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZS50eXBlID09PSBcImNzcy1jb21tZW50XCIgJiYgcHJldk5vZGUudGV4dC50cmltKCkgPT09IFwicHJldHRpZXItaWdub3JlXCIpIHtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcGF0aENoaWxkLmdldFZhbHVlKCk7XG4gICAgICAgIHBhcnRzLnB1c2gob3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2Uob3B0aW9ucy5sb2NTdGFydChjaGlsZE5vZGUpLCBvcHRpb25zLmxvY0VuZChjaGlsZE5vZGUpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5wdXNoKHBhdGhDaGlsZC5jYWxsKHByaW50KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpICE9PSBub2RlLm5vZGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZXNbaSArIDFdLnR5cGUgPT09IFwiY3NzLWNvbW1lbnRcIiAmJiAhaGFzTmV3bGluZSQzKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBvcHRpb25zLmxvY1N0YXJ0KG5vZGUubm9kZXNbaSArIDFdKSwge1xuICAgICAgICAgIGJhY2t3YXJkczogdHJ1ZVxuICAgICAgICB9KSAmJiBub2RlLm5vZGVzW2ldLnR5cGUgIT09IFwieWFtbFwiICYmIG5vZGUubm9kZXNbaV0udHlwZSAhPT0gXCJ0b21sXCIgfHwgbm9kZS5ub2Rlc1tpICsgMV0udHlwZSA9PT0gXCJjc3MtYXRydWxlXCIgJiYgbm9kZS5ub2Rlc1tpICsgMV0ubmFtZSA9PT0gXCJlbHNlXCIgJiYgbm9kZS5ub2Rlc1tpXS50eXBlICE9PSBcImNzcy1jb21tZW50XCIpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiIFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKG9wdGlvbnMuX19pc0hUTUxTdHlsZUF0dHJpYnV0ZSA/IGxpbmUkMiA6IGhhcmRsaW5lJDQpO1xuXG4gICAgICAgICAgaWYgKGlzTmV4dExpbmVFbXB0eSQyKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBwYXRoQ2hpbGQuZ2V0VmFsdWUoKSwgb3B0aW9ucy5sb2NFbmQpICYmIG5vZGUubm9kZXNbaV0udHlwZSAhPT0gXCJ5YW1sXCIgJiYgbm9kZS5ub2Rlc1tpXS50eXBlICE9PSBcInRvbWxcIikge1xuICAgICAgICAgICAgcGFydHMucHVzaChoYXJkbGluZSQ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH0sIFwibm9kZXNcIik7XG4gICAgcmV0dXJuIGNvbmNhdCQ1KHBhcnRzKTtcbiAgfVxuXG4gIGNvbnN0IFNUUklOR19SRUdFWCQzID0gLyhbJ1wiXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMS9nO1xuICBjb25zdCBOVU1CRVJfUkVHRVggPSAvKD86XFxkKlxcLlxcZCt8XFxkK1xcLj8pKD86W2VFXVsrLV0/XFxkKyk/L2c7XG4gIGNvbnN0IFNUQU5EQVJEX1VOSVRfUkVHRVggPSAvW2EtekEtWl0rL2c7XG4gIGNvbnN0IFdPUkRfUEFSVF9SRUdFWCA9IC9bJEBdP1thLXpBLVpfXFx1MDA4MC1cXHVGRkZGXVtcXHdcXC1cXHUwMDgwLVxcdUZGRkZdKi9nO1xuICBjb25zdCBBREpVU1RfTlVNQkVSU19SRUdFWCA9IG5ldyBSZWdFeHAoU1RSSU5HX1JFR0VYJDMuc291cmNlICsgXCJ8XCIgKyBcIihcIi5jb25jYXQoV09SRF9QQVJUX1JFR0VYLnNvdXJjZSwgXCIpP1wiKSArIFwiKFwiLmNvbmNhdChOVU1CRVJfUkVHRVguc291cmNlLCBcIilcIikgKyBcIihcIi5jb25jYXQoU1RBTkRBUkRfVU5JVF9SRUdFWC5zb3VyY2UsIFwiKT9cIiksIFwiZ1wiKTtcblxuICBmdW5jdGlvbiBhZGp1c3RTdHJpbmdzKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoU1RSSU5HX1JFR0VYJDMsIG1hdGNoID0+IHByaW50U3RyaW5nJDEobWF0Y2gsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHF1b3RlQXR0cmlidXRlVmFsdWUodmFsdWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBxdW90ZSA9IG9wdGlvbnMuc2luZ2xlUXVvdGUgPyBcIidcIiA6ICdcIic7XG4gICAgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKCdcIicpIHx8IHZhbHVlLmluY2x1ZGVzKFwiJ1wiKSA/IHZhbHVlIDogcXVvdGUgKyB2YWx1ZSArIHF1b3RlO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRqdXN0TnVtYmVycyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKEFESlVTVF9OVU1CRVJTX1JFR0VYLCAobWF0Y2gsIHF1b3RlLCB3b3JkUGFydCwgbnVtYmVyLCB1bml0KSA9PiAhd29yZFBhcnQgJiYgbnVtYmVyID8gcHJpbnRDc3NOdW1iZXIobnVtYmVyKSArIG1heWJlVG9Mb3dlckNhc2UkMSh1bml0IHx8IFwiXCIpIDogbWF0Y2gpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRDc3NOdW1iZXIocmF3TnVtYmVyKSB7XG4gICAgcmV0dXJuIHByaW50TnVtYmVyJDEocmF3TnVtYmVyKSAvLyBSZW1vdmUgdHJhaWxpbmcgYC4wYC5cbiAgICAucmVwbGFjZSgvXFwuMCg/PSR8ZSkvLCBcIlwiKTtcbiAgfVxuXG4gIHZhciBwcmludGVyUG9zdGNzcyA9IHtcbiAgICBwcmludDogZ2VuZXJpY1ByaW50LFxuICAgIGVtYmVkOiBlbWJlZF8xLFxuICAgIGluc2VydFByYWdtYTogaW5zZXJ0UHJhZ21hJDIsXG4gICAgaGFzUHJldHRpZXJJZ25vcmU6IGhhc0lnbm9yZUNvbW1lbnQkMSxcbiAgICBtYXNzYWdlQXN0Tm9kZTogY2xlYW5fMVxuICB9O1xuXG4gIGNvbnN0IENBVEVHT1JZX0NPTU1PTiA9IFwiQ29tbW9uXCI7IC8vIGZvcm1hdCBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vcHJldHRpZXIvcHJldHRpZXIvYmxvYi9tYXN0ZXIvc3JjL21haW4vY29yZS1vcHRpb25zLmpzXG5cbiAgdmFyIGNvbW1vbk9wdGlvbnMgPSB7XG4gICAgYnJhY2tldFNwYWNpbmc6IHtcbiAgICAgIHNpbmNlOiBcIjAuMC4wXCIsXG4gICAgICBjYXRlZ29yeTogQ0FURUdPUllfQ09NTU9OLFxuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgZGVzY3JpcHRpb246IFwiUHJpbnQgc3BhY2VzIGJldHdlZW4gYnJhY2tldHMuXCIsXG4gICAgICBvcHBvc2l0ZURlc2NyaXB0aW9uOiBcIkRvIG5vdCBwcmludCBzcGFjZXMgYmV0d2VlbiBicmFja2V0cy5cIlxuICAgIH0sXG4gICAgc2luZ2xlUXVvdGU6IHtcbiAgICAgIHNpbmNlOiBcIjAuMC4wXCIsXG4gICAgICBjYXRlZ29yeTogQ0FURUdPUllfQ09NTU9OLFxuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlVzZSBzaW5nbGUgcXVvdGVzIGluc3RlYWQgb2YgZG91YmxlIHF1b3Rlcy5cIlxuICAgIH0sXG4gICAgcHJvc2VXcmFwOiB7XG4gICAgICBzaW5jZTogXCIxLjguMlwiLFxuICAgICAgY2F0ZWdvcnk6IENBVEVHT1JZX0NPTU1PTixcbiAgICAgIHR5cGU6IFwiY2hvaWNlXCIsXG4gICAgICBkZWZhdWx0OiBbe1xuICAgICAgICBzaW5jZTogXCIxLjguMlwiLFxuICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBzaW5jZTogXCIxLjkuMFwiLFxuICAgICAgICB2YWx1ZTogXCJwcmVzZXJ2ZVwiXG4gICAgICB9XSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkhvdyB0byB3cmFwIHByb3NlLlwiLFxuICAgICAgY2hvaWNlczogW3tcbiAgICAgICAgc2luY2U6IFwiMS45LjBcIixcbiAgICAgICAgdmFsdWU6IFwiYWx3YXlzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIldyYXAgcHJvc2UgaWYgaXQgZXhjZWVkcyB0aGUgcHJpbnQgd2lkdGguXCJcbiAgICAgIH0sIHtcbiAgICAgICAgc2luY2U6IFwiMS45LjBcIixcbiAgICAgICAgdmFsdWU6IFwibmV2ZXJcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRG8gbm90IHdyYXAgcHJvc2UuXCJcbiAgICAgIH0sIHtcbiAgICAgICAgc2luY2U6IFwiMS45LjBcIixcbiAgICAgICAgdmFsdWU6IFwicHJlc2VydmVcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiV3JhcCBwcm9zZSBhcy1pcy5cIlxuICAgICAgfV1cbiAgICB9XG4gIH07XG5cbiAgdmFyIG9wdGlvbnMkMiA9IHtcbiAgICBzaW5nbGVRdW90ZTogY29tbW9uT3B0aW9ucy5zaW5nbGVRdW90ZVxuICB9O1xuXG4gIHZhciBjcmVhdGVMYW5ndWFnZSA9IGZ1bmN0aW9uIGNyZWF0ZUxhbmd1YWdlKGxpbmd1aXN0RGF0YSwgb3ZlcnJpZGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBsYW5ndWFnZUlkXG4gICAgfSA9IGxpbmd1aXN0RGF0YSxcbiAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UobGluZ3Vpc3REYXRhLCBbXCJsYW5ndWFnZUlkXCJdKTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgIGxpbmd1aXN0TGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZFxuICAgIH0sIHJlc3QsIHt9LCBvdmVycmlkZShsaW5ndWlzdERhdGEpKTtcbiAgfTtcblxuICB2YXIgbmFtZSQxID0gXCJDU1NcIjtcbiAgdmFyIHR5cGUgPSBcIm1hcmt1cFwiO1xuICB2YXIgdG1TY29wZSA9IFwic291cmNlLmNzc1wiO1xuICB2YXIgYWNlTW9kZSA9IFwiY3NzXCI7XG4gIHZhciBjb2RlbWlycm9yTW9kZSA9IFwiY3NzXCI7XG4gIHZhciBjb2RlbWlycm9yTWltZVR5cGUgPSBcInRleHQvY3NzXCI7XG4gIHZhciBjb2xvciA9IFwiIzU2M2Q3Y1wiO1xuICB2YXIgZXh0ZW5zaW9ucyA9IFtcbiAgXHRcIi5jc3NcIlxuICBdO1xuICB2YXIgbGFuZ3VhZ2VJZCA9IDUwO1xuICB2YXIgQ1NTID0ge1xuICBcdG5hbWU6IG5hbWUkMSxcbiAgXHR0eXBlOiB0eXBlLFxuICBcdHRtU2NvcGU6IHRtU2NvcGUsXG4gIFx0YWNlTW9kZTogYWNlTW9kZSxcbiAgXHRjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUsXG4gIFx0Y29kZW1pcnJvck1pbWVUeXBlOiBjb2RlbWlycm9yTWltZVR5cGUsXG4gIFx0Y29sb3I6IGNvbG9yLFxuICBcdGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMsXG4gIFx0bGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZFxuICB9O1xuXG4gIHZhciBDU1MkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgbmFtZTogbmFtZSQxLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgdG1TY29wZTogdG1TY29wZSxcbiAgICBhY2VNb2RlOiBhY2VNb2RlLFxuICAgIGNvZGVtaXJyb3JNb2RlOiBjb2RlbWlycm9yTW9kZSxcbiAgICBjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSxcbiAgICBjb2xvcjogY29sb3IsXG4gICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyxcbiAgICBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkLFxuICAgICdkZWZhdWx0JzogQ1NTXG4gIH0pO1xuXG4gIHZhciBuYW1lJDIgPSBcIlBvc3RDU1NcIjtcbiAgdmFyIHR5cGUkMSA9IFwibWFya3VwXCI7XG4gIHZhciB0bVNjb3BlJDEgPSBcInNvdXJjZS5wb3N0Y3NzXCI7XG4gIHZhciBncm91cCQyID0gXCJDU1NcIjtcbiAgdmFyIGV4dGVuc2lvbnMkMSA9IFtcbiAgXHRcIi5wY3NzXCIsXG4gIFx0XCIucG9zdGNzc1wiXG4gIF07XG4gIHZhciBhY2VNb2RlJDEgPSBcInRleHRcIjtcbiAgdmFyIGxhbmd1YWdlSWQkMSA9IDI2Mjc2NDQzNztcbiAgdmFyIFBvc3RDU1MgPSB7XG4gIFx0bmFtZTogbmFtZSQyLFxuICBcdHR5cGU6IHR5cGUkMSxcbiAgXHR0bVNjb3BlOiB0bVNjb3BlJDEsXG4gIFx0Z3JvdXA6IGdyb3VwJDIsXG4gIFx0ZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyQxLFxuICBcdGFjZU1vZGU6IGFjZU1vZGUkMSxcbiAgXHRsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJDFcbiAgfTtcblxuICB2YXIgUG9zdENTUyQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBuYW1lOiBuYW1lJDIsXG4gICAgdHlwZTogdHlwZSQxLFxuICAgIHRtU2NvcGU6IHRtU2NvcGUkMSxcbiAgICBncm91cDogZ3JvdXAkMixcbiAgICBleHRlbnNpb25zOiBleHRlbnNpb25zJDEsXG4gICAgYWNlTW9kZTogYWNlTW9kZSQxLFxuICAgIGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWQkMSxcbiAgICAnZGVmYXVsdCc6IFBvc3RDU1NcbiAgfSk7XG5cbiAgdmFyIG5hbWUkMyA9IFwiTGVzc1wiO1xuICB2YXIgdHlwZSQyID0gXCJtYXJrdXBcIjtcbiAgdmFyIGdyb3VwJDMgPSBcIkNTU1wiO1xuICB2YXIgZXh0ZW5zaW9ucyQyID0gW1xuICBcdFwiLmxlc3NcIlxuICBdO1xuICB2YXIgdG1TY29wZSQyID0gXCJzb3VyY2UuY3NzLmxlc3NcIjtcbiAgdmFyIGFjZU1vZGUkMiA9IFwibGVzc1wiO1xuICB2YXIgY29kZW1pcnJvck1vZGUkMSA9IFwiY3NzXCI7XG4gIHZhciBjb2RlbWlycm9yTWltZVR5cGUkMSA9IFwidGV4dC9jc3NcIjtcbiAgdmFyIGxhbmd1YWdlSWQkMiA9IDE5ODtcbiAgdmFyIExlc3MgPSB7XG4gIFx0bmFtZTogbmFtZSQzLFxuICBcdHR5cGU6IHR5cGUkMixcbiAgXHRncm91cDogZ3JvdXAkMyxcbiAgXHRleHRlbnNpb25zOiBleHRlbnNpb25zJDIsXG4gIFx0dG1TY29wZTogdG1TY29wZSQyLFxuICBcdGFjZU1vZGU6IGFjZU1vZGUkMixcbiAgXHRjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUkMSxcbiAgXHRjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSQxLFxuICBcdGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWQkMlxuICB9O1xuXG4gIHZhciBMZXNzJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIG5hbWU6IG5hbWUkMyxcbiAgICB0eXBlOiB0eXBlJDIsXG4gICAgZ3JvdXA6IGdyb3VwJDMsXG4gICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyQyLFxuICAgIHRtU2NvcGU6IHRtU2NvcGUkMixcbiAgICBhY2VNb2RlOiBhY2VNb2RlJDIsXG4gICAgY29kZW1pcnJvck1vZGU6IGNvZGVtaXJyb3JNb2RlJDEsXG4gICAgY29kZW1pcnJvck1pbWVUeXBlOiBjb2RlbWlycm9yTWltZVR5cGUkMSxcbiAgICBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJDIsXG4gICAgJ2RlZmF1bHQnOiBMZXNzXG4gIH0pO1xuXG4gIHZhciBuYW1lJDQgPSBcIlNDU1NcIjtcbiAgdmFyIHR5cGUkMyA9IFwibWFya3VwXCI7XG4gIHZhciB0bVNjb3BlJDMgPSBcInNvdXJjZS5jc3Muc2Nzc1wiO1xuICB2YXIgZ3JvdXAkNCA9IFwiQ1NTXCI7XG4gIHZhciBhY2VNb2RlJDMgPSBcInNjc3NcIjtcbiAgdmFyIGNvZGVtaXJyb3JNb2RlJDIgPSBcImNzc1wiO1xuICB2YXIgY29kZW1pcnJvck1pbWVUeXBlJDIgPSBcInRleHQveC1zY3NzXCI7XG4gIHZhciBleHRlbnNpb25zJDMgPSBbXG4gIFx0XCIuc2Nzc1wiXG4gIF07XG4gIHZhciBsYW5ndWFnZUlkJDMgPSAzMjk7XG4gIHZhciBTQ1NTID0ge1xuICBcdG5hbWU6IG5hbWUkNCxcbiAgXHR0eXBlOiB0eXBlJDMsXG4gIFx0dG1TY29wZTogdG1TY29wZSQzLFxuICBcdGdyb3VwOiBncm91cCQ0LFxuICBcdGFjZU1vZGU6IGFjZU1vZGUkMyxcbiAgXHRjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUkMixcbiAgXHRjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSQyLFxuICBcdGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMkMyxcbiAgXHRsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJDNcbiAgfTtcblxuICB2YXIgU0NTUyQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBuYW1lOiBuYW1lJDQsXG4gICAgdHlwZTogdHlwZSQzLFxuICAgIHRtU2NvcGU6IHRtU2NvcGUkMyxcbiAgICBncm91cDogZ3JvdXAkNCxcbiAgICBhY2VNb2RlOiBhY2VNb2RlJDMsXG4gICAgY29kZW1pcnJvck1vZGU6IGNvZGVtaXJyb3JNb2RlJDIsXG4gICAgY29kZW1pcnJvck1pbWVUeXBlOiBjb2RlbWlycm9yTWltZVR5cGUkMixcbiAgICBleHRlbnNpb25zOiBleHRlbnNpb25zJDMsXG4gICAgbGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZCQzLFxuICAgICdkZWZhdWx0JzogU0NTU1xuICB9KTtcblxuICB2YXIgcmVxdWlyZSQkMCQyID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShDU1MkMSk7XG5cbiAgdmFyIHJlcXVpcmUkJDEgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKFBvc3RDU1MkMSk7XG5cbiAgdmFyIHJlcXVpcmUkJDIgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKExlc3MkMSk7XG5cbiAgdmFyIHJlcXVpcmUkJDMgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKFNDU1MkMSk7XG5cbiAgY29uc3QgbGFuZ3VhZ2VzID0gW2NyZWF0ZUxhbmd1YWdlKHJlcXVpcmUkJDAkMiwgKCkgPT4gKHtcbiAgICBzaW5jZTogXCIxLjQuMFwiLFxuICAgIHBhcnNlcnM6IFtcImNzc1wiXSxcbiAgICB2c2NvZGVMYW5ndWFnZUlkczogW1wiY3NzXCJdXG4gIH0pKSwgY3JlYXRlTGFuZ3VhZ2UocmVxdWlyZSQkMSwgKCkgPT4gKHtcbiAgICBzaW5jZTogXCIxLjQuMFwiLFxuICAgIHBhcnNlcnM6IFtcImNzc1wiXSxcbiAgICB2c2NvZGVMYW5ndWFnZUlkczogW1wicG9zdGNzc1wiXVxuICB9KSksIGNyZWF0ZUxhbmd1YWdlKHJlcXVpcmUkJDIsICgpID0+ICh7XG4gICAgc2luY2U6IFwiMS40LjBcIixcbiAgICBwYXJzZXJzOiBbXCJsZXNzXCJdLFxuICAgIHZzY29kZUxhbmd1YWdlSWRzOiBbXCJsZXNzXCJdXG4gIH0pKSwgY3JlYXRlTGFuZ3VhZ2UocmVxdWlyZSQkMywgKCkgPT4gKHtcbiAgICBzaW5jZTogXCIxLjQuMFwiLFxuICAgIHBhcnNlcnM6IFtcInNjc3NcIl0sXG4gICAgdnNjb2RlTGFuZ3VhZ2VJZHM6IFtcInNjc3NcIl1cbiAgfSkpXTtcbiAgY29uc3QgcHJpbnRlcnMgPSB7XG4gICAgcG9zdGNzczogcHJpbnRlclBvc3Rjc3NcbiAgfTtcbiAgdmFyIGxhbmd1YWdlQ3NzID0ge1xuICAgIGxhbmd1YWdlcyxcbiAgICBvcHRpb25zOiBvcHRpb25zJDIsXG4gICAgcHJpbnRlcnNcbiAgfTtcblxuICBmdW5jdGlvbiBoYXNQcmFnbWEkMih0ZXh0KSB7XG4gICAgcmV0dXJuIC9eXFxzKiNbXlxcblxcU10qQChmb3JtYXR8cHJldHRpZXIpXFxzKihcXG58JCkvLnRlc3QodGV4dCk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRQcmFnbWEkMyh0ZXh0KSB7XG4gICAgcmV0dXJuIFwiIyBAZm9ybWF0XFxuXFxuXCIgKyB0ZXh0O1xuICB9XG5cbiAgdmFyIHByYWdtYSQyID0ge1xuICAgIGhhc1ByYWdtYTogaGFzUHJhZ21hJDIsXG4gICAgaW5zZXJ0UHJhZ21hOiBpbnNlcnRQcmFnbWEkM1xuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBjb25jYXQ6IGNvbmNhdCQ2LFxuICAgIGpvaW46IGpvaW4kMyxcbiAgICBoYXJkbGluZTogaGFyZGxpbmUkNSxcbiAgICBsaW5lOiBsaW5lJDMsXG4gICAgc29mdGxpbmU6IHNvZnRsaW5lJDIsXG4gICAgZ3JvdXA6IGdyb3VwJDUsXG4gICAgaW5kZW50OiBpbmRlbnQkMyxcbiAgICBpZkJyZWFrOiBpZkJyZWFrJDJcbiAgfSA9IGRvY3VtZW50LmJ1aWxkZXJzO1xuICBjb25zdCB7XG4gICAgaGFzSWdub3JlQ29tbWVudDogaGFzSWdub3JlQ29tbWVudCQyXG4gIH0gPSB1dGlsJDE7XG4gIGNvbnN0IHtcbiAgICBpc05leHRMaW5lRW1wdHk6IGlzTmV4dExpbmVFbXB0eSQzXG4gIH0gPSB1dGlsU2hhcmVkO1xuICBjb25zdCB7XG4gICAgaW5zZXJ0UHJhZ21hOiBpbnNlcnRQcmFnbWEkNFxuICB9ID0gcHJhZ21hJDI7XG5cbiAgZnVuY3Rpb24gZ2VuZXJpY1ByaW50JDEocGF0aCwgb3B0aW9ucywgcHJpbnQpIHtcbiAgICBjb25zdCBuID0gcGF0aC5nZXRWYWx1ZSgpO1xuXG4gICAgaWYgKCFuKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIHN3aXRjaCAobi5raW5kKSB7XG4gICAgICBjYXNlIFwiRG9jdW1lbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICAgICAgcGF0aC5tYXAoKHBhdGhDaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goY29uY2F0JDYoW3BhdGhDaGlsZC5jYWxsKHByaW50KV0pKTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSBuLmRlZmluaXRpb25zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgcGFydHMucHVzaChoYXJkbGluZSQ1KTtcblxuICAgICAgICAgICAgICBpZiAoaXNOZXh0TGluZUVtcHR5JDMob3B0aW9ucy5vcmlnaW5hbFRleHQsIHBhdGhDaGlsZC5nZXRWYWx1ZSgpLCBvcHRpb25zLmxvY0VuZCkpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGhhcmRsaW5lJDUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgXCJkZWZpbml0aW9uc1wiKTtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDYoW2NvbmNhdCQ2KHBhcnRzKSwgaGFyZGxpbmUkNV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJPcGVyYXRpb25EZWZpbml0aW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBoYXNPcGVyYXRpb24gPSBvcHRpb25zLm9yaWdpbmFsVGV4dFtvcHRpb25zLmxvY1N0YXJ0KG4pXSAhPT0gXCJ7XCI7XG4gICAgICAgICAgY29uc3QgaGFzTmFtZSA9ICEhbi5uYW1lO1xuICAgICAgICAgIHJldHVybiBjb25jYXQkNihbaGFzT3BlcmF0aW9uID8gbi5vcGVyYXRpb24gOiBcIlwiLCBoYXNPcGVyYXRpb24gJiYgaGFzTmFtZSA/IGNvbmNhdCQ2KFtcIiBcIiwgcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIildKSA6IFwiXCIsIG4udmFyaWFibGVEZWZpbml0aW9ucyAmJiBuLnZhcmlhYmxlRGVmaW5pdGlvbnMubGVuZ3RoID8gZ3JvdXAkNShjb25jYXQkNihbXCIoXCIsIGluZGVudCQzKGNvbmNhdCQ2KFtzb2Z0bGluZSQyLCBqb2luJDMoY29uY2F0JDYoW2lmQnJlYWskMihcIlwiLCBcIiwgXCIpLCBzb2Z0bGluZSQyXSksIHBhdGgubWFwKHByaW50LCBcInZhcmlhYmxlRGVmaW5pdGlvbnNcIikpXSkpLCBzb2Z0bGluZSQyLCBcIilcIl0pKSA6IFwiXCIsIHByaW50RGlyZWN0aXZlcyhwYXRoLCBwcmludCwgbiksIG4uc2VsZWN0aW9uU2V0ID8gIWhhc09wZXJhdGlvbiAmJiAhaGFzTmFtZSA/IFwiXCIgOiBcIiBcIiA6IFwiXCIsIHBhdGguY2FsbChwcmludCwgXCJzZWxlY3Rpb25TZXRcIildKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiRnJhZ21lbnREZWZpbml0aW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDYoW1wiZnJhZ21lbnQgXCIsIHBhdGguY2FsbChwcmludCwgXCJuYW1lXCIpLCBuLnZhcmlhYmxlRGVmaW5pdGlvbnMgJiYgbi52YXJpYWJsZURlZmluaXRpb25zLmxlbmd0aCA/IGdyb3VwJDUoY29uY2F0JDYoW1wiKFwiLCBpbmRlbnQkMyhjb25jYXQkNihbc29mdGxpbmUkMiwgam9pbiQzKGNvbmNhdCQ2KFtpZkJyZWFrJDIoXCJcIiwgXCIsIFwiKSwgc29mdGxpbmUkMl0pLCBwYXRoLm1hcChwcmludCwgXCJ2YXJpYWJsZURlZmluaXRpb25zXCIpKV0pKSwgc29mdGxpbmUkMiwgXCIpXCJdKSkgOiBcIlwiLCBcIiBvbiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVDb25kaXRpb25cIiksIHByaW50RGlyZWN0aXZlcyhwYXRoLCBwcmludCwgbiksIFwiIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwic2VsZWN0aW9uU2V0XCIpXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIlNlbGVjdGlvblNldFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtcIntcIiwgaW5kZW50JDMoY29uY2F0JDYoW2hhcmRsaW5lJDUsIGpvaW4kMyhoYXJkbGluZSQ1LCBwYXRoLmNhbGwoc2VsZWN0aW9uc1BhdGggPT4gcHJpbnRTZXF1ZW5jZShzZWxlY3Rpb25zUGF0aCwgb3B0aW9ucywgcHJpbnQpLCBcInNlbGVjdGlvbnNcIikpXSkpLCBoYXJkbGluZSQ1LCBcIn1cIl0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJGaWVsZFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwJDUoY29uY2F0JDYoW24uYWxpYXMgPyBjb25jYXQkNihbcGF0aC5jYWxsKHByaW50LCBcImFsaWFzXCIpLCBcIjogXCJdKSA6IFwiXCIsIHBhdGguY2FsbChwcmludCwgXCJuYW1lXCIpLCBuLmFyZ3VtZW50cy5sZW5ndGggPiAwID8gZ3JvdXAkNShjb25jYXQkNihbXCIoXCIsIGluZGVudCQzKGNvbmNhdCQ2KFtzb2Z0bGluZSQyLCBqb2luJDMoY29uY2F0JDYoW2lmQnJlYWskMihcIlwiLCBcIiwgXCIpLCBzb2Z0bGluZSQyXSksIHBhdGguY2FsbChhcmdzUGF0aCA9PiBwcmludFNlcXVlbmNlKGFyZ3NQYXRoLCBvcHRpb25zLCBwcmludCksIFwiYXJndW1lbnRzXCIpKV0pKSwgc29mdGxpbmUkMiwgXCIpXCJdKSkgOiBcIlwiLCBwcmludERpcmVjdGl2ZXMocGF0aCwgcHJpbnQsIG4pLCBuLnNlbGVjdGlvblNldCA/IFwiIFwiIDogXCJcIiwgcGF0aC5jYWxsKHByaW50LCBcInNlbGVjdGlvblNldFwiKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiTmFtZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIG4udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIlN0cmluZ1ZhbHVlXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAobi5ibG9jaykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFsnXCJcIlwiJywgaGFyZGxpbmUkNSwgam9pbiQzKGhhcmRsaW5lJDUsIG4udmFsdWUucmVwbGFjZSgvXCJcIlwiL2csIFwiXFxcXCQmXCIpLnNwbGl0KFwiXFxuXCIpKSwgaGFyZGxpbmUkNSwgJ1wiXCJcIiddKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29uY2F0JDYoWydcIicsIG4udmFsdWUucmVwbGFjZSgvW1wiXFxcXF0vZywgXCJcXFxcJCZcIikucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIiksICdcIiddKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiSW50VmFsdWVcIjpcbiAgICAgIGNhc2UgXCJGbG9hdFZhbHVlXCI6XG4gICAgICBjYXNlIFwiRW51bVZhbHVlXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gbi52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiQm9vbGVhblZhbHVlXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gbi52YWx1ZSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJOdWxsVmFsdWVcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiVmFyaWFibGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBjb25jYXQkNihbXCIkXCIsIHBhdGguY2FsbChwcmludCwgXCJuYW1lXCIpXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkxpc3RWYWx1ZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwJDUoY29uY2F0JDYoW1wiW1wiLCBpbmRlbnQkMyhjb25jYXQkNihbc29mdGxpbmUkMiwgam9pbiQzKGNvbmNhdCQ2KFtpZkJyZWFrJDIoXCJcIiwgXCIsIFwiKSwgc29mdGxpbmUkMl0pLCBwYXRoLm1hcChwcmludCwgXCJ2YWx1ZXNcIikpXSkpLCBzb2Z0bGluZSQyLCBcIl1cIl0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiT2JqZWN0VmFsdWVcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBncm91cCQ1KGNvbmNhdCQ2KFtcIntcIiwgb3B0aW9ucy5icmFja2V0U3BhY2luZyAmJiBuLmZpZWxkcy5sZW5ndGggPiAwID8gXCIgXCIgOiBcIlwiLCBpbmRlbnQkMyhjb25jYXQkNihbc29mdGxpbmUkMiwgam9pbiQzKGNvbmNhdCQ2KFtpZkJyZWFrJDIoXCJcIiwgXCIsIFwiKSwgc29mdGxpbmUkMl0pLCBwYXRoLm1hcChwcmludCwgXCJmaWVsZHNcIikpXSkpLCBzb2Z0bGluZSQyLCBpZkJyZWFrJDIoXCJcIiwgb3B0aW9ucy5icmFja2V0U3BhY2luZyAmJiBuLmZpZWxkcy5sZW5ndGggPiAwID8gXCIgXCIgOiBcIlwiKSwgXCJ9XCJdKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIk9iamVjdEZpZWxkXCI6XG4gICAgICBjYXNlIFwiQXJndW1lbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBjb25jYXQkNihbcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIiksIFwiOiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInZhbHVlXCIpXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkRpcmVjdGl2ZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtcIkBcIiwgcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIiksIG4uYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBncm91cCQ1KGNvbmNhdCQ2KFtcIihcIiwgaW5kZW50JDMoY29uY2F0JDYoW3NvZnRsaW5lJDIsIGpvaW4kMyhjb25jYXQkNihbaWZCcmVhayQyKFwiXCIsIFwiLCBcIiksIHNvZnRsaW5lJDJdKSwgcGF0aC5jYWxsKGFyZ3NQYXRoID0+IHByaW50U2VxdWVuY2UoYXJnc1BhdGgsIG9wdGlvbnMsIHByaW50KSwgXCJhcmd1bWVudHNcIikpXSkpLCBzb2Z0bGluZSQyLCBcIilcIl0pKSA6IFwiXCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiTmFtZWRUeXBlXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIik7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIlZhcmlhYmxlRGVmaW5pdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtwYXRoLmNhbGwocHJpbnQsIFwidmFyaWFibGVcIiksIFwiOiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVcIiksIG4uZGVmYXVsdFZhbHVlID8gY29uY2F0JDYoW1wiID0gXCIsIHBhdGguY2FsbChwcmludCwgXCJkZWZhdWx0VmFsdWVcIildKSA6IFwiXCIsIHByaW50RGlyZWN0aXZlcyhwYXRoLCBwcmludCwgbildKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiVHlwZUV4dGVuc2lvbkRlZmluaXRpb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBjb25jYXQkNihbXCJleHRlbmQgXCIsIHBhdGguY2FsbChwcmludCwgXCJkZWZpbml0aW9uXCIpXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIk9iamVjdFR5cGVFeHRlbnNpb25cIjpcbiAgICAgIGNhc2UgXCJPYmplY3RUeXBlRGVmaW5pdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtwYXRoLmNhbGwocHJpbnQsIFwiZGVzY3JpcHRpb25cIiksIG4uZGVzY3JpcHRpb24gPyBoYXJkbGluZSQ1IDogXCJcIiwgbi5raW5kID09PSBcIk9iamVjdFR5cGVFeHRlbnNpb25cIiA/IFwiZXh0ZW5kIFwiIDogXCJcIiwgXCJ0eXBlIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwibmFtZVwiKSwgbi5pbnRlcmZhY2VzLmxlbmd0aCA+IDAgPyBjb25jYXQkNihbXCIgaW1wbGVtZW50cyBcIiwgY29uY2F0JDYocHJpbnRJbnRlcmZhY2VzKHBhdGgsIG9wdGlvbnMsIHByaW50KSldKSA6IFwiXCIsIHByaW50RGlyZWN0aXZlcyhwYXRoLCBwcmludCwgbiksIG4uZmllbGRzLmxlbmd0aCA+IDAgPyBjb25jYXQkNihbXCIge1wiLCBpbmRlbnQkMyhjb25jYXQkNihbaGFyZGxpbmUkNSwgam9pbiQzKGhhcmRsaW5lJDUsIHBhdGguY2FsbChmaWVsZHNQYXRoID0+IHByaW50U2VxdWVuY2UoZmllbGRzUGF0aCwgb3B0aW9ucywgcHJpbnQpLCBcImZpZWxkc1wiKSldKSksIGhhcmRsaW5lJDUsIFwifVwiXSkgOiBcIlwiXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkZpZWxkRGVmaW5pdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtwYXRoLmNhbGwocHJpbnQsIFwiZGVzY3JpcHRpb25cIiksIG4uZGVzY3JpcHRpb24gPyBoYXJkbGluZSQ1IDogXCJcIiwgcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIiksIG4uYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBncm91cCQ1KGNvbmNhdCQ2KFtcIihcIiwgaW5kZW50JDMoY29uY2F0JDYoW3NvZnRsaW5lJDIsIGpvaW4kMyhjb25jYXQkNihbaWZCcmVhayQyKFwiXCIsIFwiLCBcIiksIHNvZnRsaW5lJDJdKSwgcGF0aC5jYWxsKGFyZ3NQYXRoID0+IHByaW50U2VxdWVuY2UoYXJnc1BhdGgsIG9wdGlvbnMsIHByaW50KSwgXCJhcmd1bWVudHNcIikpXSkpLCBzb2Z0bGluZSQyLCBcIilcIl0pKSA6IFwiXCIsIFwiOiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVcIiksIHByaW50RGlyZWN0aXZlcyhwYXRoLCBwcmludCwgbildKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiRGlyZWN0aXZlRGVmaW5pdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtwYXRoLmNhbGwocHJpbnQsIFwiZGVzY3JpcHRpb25cIiksIG4uZGVzY3JpcHRpb24gPyBoYXJkbGluZSQ1IDogXCJcIiwgXCJkaXJlY3RpdmUgXCIsIFwiQFwiLCBwYXRoLmNhbGwocHJpbnQsIFwibmFtZVwiKSwgbi5hcmd1bWVudHMubGVuZ3RoID4gMCA/IGdyb3VwJDUoY29uY2F0JDYoW1wiKFwiLCBpbmRlbnQkMyhjb25jYXQkNihbc29mdGxpbmUkMiwgam9pbiQzKGNvbmNhdCQ2KFtpZkJyZWFrJDIoXCJcIiwgXCIsIFwiKSwgc29mdGxpbmUkMl0pLCBwYXRoLmNhbGwoYXJnc1BhdGggPT4gcHJpbnRTZXF1ZW5jZShhcmdzUGF0aCwgb3B0aW9ucywgcHJpbnQpLCBcImFyZ3VtZW50c1wiKSldKSksIHNvZnRsaW5lJDIsIFwiKVwiXSkpIDogXCJcIiwgbi5yZXBlYXRhYmxlID8gXCIgcmVwZWF0YWJsZVwiIDogXCJcIiwgY29uY2F0JDYoW1wiIG9uIFwiLCBqb2luJDMoXCIgfCBcIiwgcGF0aC5tYXAocHJpbnQsIFwibG9jYXRpb25zXCIpKV0pXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkVudW1UeXBlRXh0ZW5zaW9uXCI6XG4gICAgICBjYXNlIFwiRW51bVR5cGVEZWZpbml0aW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDYoW3BhdGguY2FsbChwcmludCwgXCJkZXNjcmlwdGlvblwiKSwgbi5kZXNjcmlwdGlvbiA/IGhhcmRsaW5lJDUgOiBcIlwiLCBuLmtpbmQgPT09IFwiRW51bVR5cGVFeHRlbnNpb25cIiA/IFwiZXh0ZW5kIFwiIDogXCJcIiwgXCJlbnVtIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwibmFtZVwiKSwgcHJpbnREaXJlY3RpdmVzKHBhdGgsIHByaW50LCBuKSwgbi52YWx1ZXMubGVuZ3RoID4gMCA/IGNvbmNhdCQ2KFtcIiB7XCIsIGluZGVudCQzKGNvbmNhdCQ2KFtoYXJkbGluZSQ1LCBqb2luJDMoaGFyZGxpbmUkNSwgcGF0aC5jYWxsKHZhbHVlc1BhdGggPT4gcHJpbnRTZXF1ZW5jZSh2YWx1ZXNQYXRoLCBvcHRpb25zLCBwcmludCksIFwidmFsdWVzXCIpKV0pKSwgaGFyZGxpbmUkNSwgXCJ9XCJdKSA6IFwiXCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiRW51bVZhbHVlRGVmaW5pdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtwYXRoLmNhbGwocHJpbnQsIFwiZGVzY3JpcHRpb25cIiksIG4uZGVzY3JpcHRpb24gPyBoYXJkbGluZSQ1IDogXCJcIiwgcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIiksIHByaW50RGlyZWN0aXZlcyhwYXRoLCBwcmludCwgbildKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiSW5wdXRWYWx1ZURlZmluaXRpb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBjb25jYXQkNihbcGF0aC5jYWxsKHByaW50LCBcImRlc2NyaXB0aW9uXCIpLCBuLmRlc2NyaXB0aW9uID8gbi5kZXNjcmlwdGlvbi5ibG9jayA/IGhhcmRsaW5lJDUgOiBsaW5lJDMgOiBcIlwiLCBwYXRoLmNhbGwocHJpbnQsIFwibmFtZVwiKSwgXCI6IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZVwiKSwgbi5kZWZhdWx0VmFsdWUgPyBjb25jYXQkNihbXCIgPSBcIiwgcGF0aC5jYWxsKHByaW50LCBcImRlZmF1bHRWYWx1ZVwiKV0pIDogXCJcIiwgcHJpbnREaXJlY3RpdmVzKHBhdGgsIHByaW50LCBuKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJJbnB1dE9iamVjdFR5cGVFeHRlbnNpb25cIjpcbiAgICAgIGNhc2UgXCJJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDYoW3BhdGguY2FsbChwcmludCwgXCJkZXNjcmlwdGlvblwiKSwgbi5kZXNjcmlwdGlvbiA/IGhhcmRsaW5lJDUgOiBcIlwiLCBuLmtpbmQgPT09IFwiSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uXCIgPyBcImV4dGVuZCBcIiA6IFwiXCIsIFwiaW5wdXQgXCIsIHBhdGguY2FsbChwcmludCwgXCJuYW1lXCIpLCBwcmludERpcmVjdGl2ZXMocGF0aCwgcHJpbnQsIG4pLCBuLmZpZWxkcy5sZW5ndGggPiAwID8gY29uY2F0JDYoW1wiIHtcIiwgaW5kZW50JDMoY29uY2F0JDYoW2hhcmRsaW5lJDUsIGpvaW4kMyhoYXJkbGluZSQ1LCBwYXRoLmNhbGwoZmllbGRzUGF0aCA9PiBwcmludFNlcXVlbmNlKGZpZWxkc1BhdGgsIG9wdGlvbnMsIHByaW50KSwgXCJmaWVsZHNcIikpXSkpLCBoYXJkbGluZSQ1LCBcIn1cIl0pIDogXCJcIl0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJTY2hlbWFEZWZpbml0aW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDYoW1wic2NoZW1hXCIsIHByaW50RGlyZWN0aXZlcyhwYXRoLCBwcmludCwgbiksIFwiIHtcIiwgbi5vcGVyYXRpb25UeXBlcy5sZW5ndGggPiAwID8gaW5kZW50JDMoY29uY2F0JDYoW2hhcmRsaW5lJDUsIGpvaW4kMyhoYXJkbGluZSQ1LCBwYXRoLmNhbGwob3BzUGF0aCA9PiBwcmludFNlcXVlbmNlKG9wc1BhdGgsIG9wdGlvbnMsIHByaW50KSwgXCJvcGVyYXRpb25UeXBlc1wiKSldKSkgOiBcIlwiLCBoYXJkbGluZSQ1LCBcIn1cIl0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJPcGVyYXRpb25UeXBlRGVmaW5pdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtwYXRoLmNhbGwocHJpbnQsIFwib3BlcmF0aW9uXCIpLCBcIjogXCIsIHBhdGguY2FsbChwcmludCwgXCJ0eXBlXCIpXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkludGVyZmFjZVR5cGVFeHRlbnNpb25cIjpcbiAgICAgIGNhc2UgXCJJbnRlcmZhY2VUeXBlRGVmaW5pdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtwYXRoLmNhbGwocHJpbnQsIFwiZGVzY3JpcHRpb25cIiksIG4uZGVzY3JpcHRpb24gPyBoYXJkbGluZSQ1IDogXCJcIiwgbi5raW5kID09PSBcIkludGVyZmFjZVR5cGVFeHRlbnNpb25cIiA/IFwiZXh0ZW5kIFwiIDogXCJcIiwgXCJpbnRlcmZhY2UgXCIsIHBhdGguY2FsbChwcmludCwgXCJuYW1lXCIpLCBwcmludERpcmVjdGl2ZXMocGF0aCwgcHJpbnQsIG4pLCBuLmZpZWxkcy5sZW5ndGggPiAwID8gY29uY2F0JDYoW1wiIHtcIiwgaW5kZW50JDMoY29uY2F0JDYoW2hhcmRsaW5lJDUsIGpvaW4kMyhoYXJkbGluZSQ1LCBwYXRoLmNhbGwoZmllbGRzUGF0aCA9PiBwcmludFNlcXVlbmNlKGZpZWxkc1BhdGgsIG9wdGlvbnMsIHByaW50KSwgXCJmaWVsZHNcIikpXSkpLCBoYXJkbGluZSQ1LCBcIn1cIl0pIDogXCJcIl0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJGcmFnbWVudFNwcmVhZFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtcIi4uLlwiLCBwYXRoLmNhbGwocHJpbnQsIFwibmFtZVwiKSwgcHJpbnREaXJlY3RpdmVzKHBhdGgsIHByaW50LCBuKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJJbmxpbmVGcmFnbWVudFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ2KFtcIi4uLlwiLCBuLnR5cGVDb25kaXRpb24gPyBjb25jYXQkNihbXCIgb24gXCIsIHBhdGguY2FsbChwcmludCwgXCJ0eXBlQ29uZGl0aW9uXCIpXSkgOiBcIlwiLCBwcmludERpcmVjdGl2ZXMocGF0aCwgcHJpbnQsIG4pLCBcIiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInNlbGVjdGlvblNldFwiKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJVbmlvblR5cGVFeHRlbnNpb25cIjpcbiAgICAgIGNhc2UgXCJVbmlvblR5cGVEZWZpbml0aW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gZ3JvdXAkNShjb25jYXQkNihbcGF0aC5jYWxsKHByaW50LCBcImRlc2NyaXB0aW9uXCIpLCBuLmRlc2NyaXB0aW9uID8gaGFyZGxpbmUkNSA6IFwiXCIsIGdyb3VwJDUoY29uY2F0JDYoW24ua2luZCA9PT0gXCJVbmlvblR5cGVFeHRlbnNpb25cIiA/IFwiZXh0ZW5kIFwiIDogXCJcIiwgXCJ1bmlvbiBcIiwgcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIiksIHByaW50RGlyZWN0aXZlcyhwYXRoLCBwcmludCwgbiksIG4udHlwZXMubGVuZ3RoID4gMCA/IGNvbmNhdCQ2KFtcIiA9XCIsIGlmQnJlYWskMihcIlwiLCBcIiBcIiksIGluZGVudCQzKGNvbmNhdCQ2KFtpZkJyZWFrJDIoY29uY2F0JDYoW2xpbmUkMywgXCIgIFwiXSkpLCBqb2luJDMoY29uY2F0JDYoW2xpbmUkMywgXCJ8IFwiXSksIHBhdGgubWFwKHByaW50LCBcInR5cGVzXCIpKV0pKV0pIDogXCJcIl0pKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiU2NhbGFyVHlwZUV4dGVuc2lvblwiOlxuICAgICAgY2FzZSBcIlNjYWxhclR5cGVEZWZpbml0aW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDYoW3BhdGguY2FsbChwcmludCwgXCJkZXNjcmlwdGlvblwiKSwgbi5kZXNjcmlwdGlvbiA/IGhhcmRsaW5lJDUgOiBcIlwiLCBuLmtpbmQgPT09IFwiU2NhbGFyVHlwZUV4dGVuc2lvblwiID8gXCJleHRlbmQgXCIgOiBcIlwiLCBcInNjYWxhciBcIiwgcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIiksIHByaW50RGlyZWN0aXZlcyhwYXRoLCBwcmludCwgbildKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiTm9uTnVsbFR5cGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBjb25jYXQkNihbcGF0aC5jYWxsKHByaW50LCBcInR5cGVcIiksIFwiIVwiXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkxpc3RUeXBlXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDYoW1wiW1wiLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZVwiKSwgXCJdXCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGdyYXBocWwgdHlwZTogXCIgKyBKU09OLnN0cmluZ2lmeShuLmtpbmQpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcmludERpcmVjdGl2ZXMocGF0aCwgcHJpbnQsIG4pIHtcbiAgICBpZiAobi5kaXJlY3RpdmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmNhdCQ2KFtcIiBcIiwgZ3JvdXAkNShpbmRlbnQkMyhjb25jYXQkNihbc29mdGxpbmUkMiwgam9pbiQzKGNvbmNhdCQ2KFtpZkJyZWFrJDIoXCJcIiwgXCIgXCIpLCBzb2Z0bGluZSQyXSksIHBhdGgubWFwKHByaW50LCBcImRpcmVjdGl2ZXNcIikpXSkpKV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRTZXF1ZW5jZShzZXF1ZW5jZVBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3QgY291bnQgPSBzZXF1ZW5jZVBhdGguZ2V0VmFsdWUoKS5sZW5ndGg7XG4gICAgcmV0dXJuIHNlcXVlbmNlUGF0aC5tYXAoKHBhdGgsIGkpID0+IHtcbiAgICAgIGNvbnN0IHByaW50ZWQgPSBwcmludChwYXRoKTtcblxuICAgICAgaWYgKGlzTmV4dExpbmVFbXB0eSQzKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBwYXRoLmdldFZhbHVlKCksIG9wdGlvbnMubG9jRW5kKSAmJiBpIDwgY291bnQgLSAxKSB7XG4gICAgICAgIHJldHVybiBjb25jYXQkNihbcHJpbnRlZCwgaGFyZGxpbmUkNV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJpbnRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbkF0dGFjaENvbW1lbnQobm9kZSkge1xuICAgIHJldHVybiBub2RlLmtpbmQgJiYgbm9kZS5raW5kICE9PSBcIkNvbW1lbnRcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50Q29tbWVudCQxKGNvbW1lbnRQYXRoKSB7XG4gICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRQYXRoLmdldFZhbHVlKCk7XG5cbiAgICBpZiAoY29tbWVudC5raW5kID09PSBcIkNvbW1lbnRcIikge1xuICAgICAgcmV0dXJuIFwiI1wiICsgY29tbWVudC52YWx1ZS50cmltRW5kKCk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGEgY29tbWVudDogXCIgKyBKU09OLnN0cmluZ2lmeShjb21tZW50KSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXRlcm1pbmVJbnRlcmZhY2VTZXBhcmF0b3JCZXR3ZWVuKGZpcnN0LCBzZWNvbmQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB0ZXh0QmV0d2VlbiA9IG9wdGlvbnMub3JpZ2luYWxUZXh0LnNsaWNlKGZpcnN0LmxvYy5lbmQsIHNlY29uZC5sb2Muc3RhcnQpLnJlcGxhY2UoLyMuKi9nLCBcIlwiKS50cmltKCk7XG4gICAgcmV0dXJuIHRleHRCZXR3ZWVuID09PSBcIixcIiA/IFwiLCBcIiA6IFwiICYgXCI7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludEludGVyZmFjZXMocGF0aCwgb3B0aW9ucywgcHJpbnQpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXROb2RlKCk7XG4gICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcmZhY2VzXG4gICAgfSA9IG5vZGU7XG4gICAgY29uc3QgcHJpbnRlZCA9IHBhdGgubWFwKG5vZGUgPT4gcHJpbnQobm9kZSksIFwiaW50ZXJmYWNlc1wiKTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpbnRlcmZhY2VzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgaW50ZXJmYWNlTm9kZSA9IGludGVyZmFjZXNbaW5kZXhdO1xuXG4gICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgIHBhcnRzLnB1c2goZGV0ZXJtaW5lSW50ZXJmYWNlU2VwYXJhdG9yQmV0d2VlbihpbnRlcmZhY2VzW2luZGV4IC0gMV0sIGludGVyZmFjZU5vZGUsIG9wdGlvbnMpKTtcbiAgICAgIH1cblxuICAgICAgcGFydHMucHVzaChwcmludGVkW2luZGV4XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW4kMShub2RlLCBuZXdOb2RlXG4gIC8qLCBwYXJlbnQqL1xuICApIHtcbiAgICBkZWxldGUgbmV3Tm9kZS5sb2M7XG4gICAgZGVsZXRlIG5ld05vZGUuY29tbWVudHM7XG4gIH1cblxuICB2YXIgcHJpbnRlckdyYXBocWwgPSB7XG4gICAgcHJpbnQ6IGdlbmVyaWNQcmludCQxLFxuICAgIG1hc3NhZ2VBc3ROb2RlOiBjbGVhbiQxLFxuICAgIGhhc1ByZXR0aWVySWdub3JlOiBoYXNJZ25vcmVDb21tZW50JDIsXG4gICAgaW5zZXJ0UHJhZ21hOiBpbnNlcnRQcmFnbWEkNCxcbiAgICBwcmludENvbW1lbnQ6IHByaW50Q29tbWVudCQxLFxuICAgIGNhbkF0dGFjaENvbW1lbnRcbiAgfTtcblxuICB2YXIgb3B0aW9ucyQzID0ge1xuICAgIGJyYWNrZXRTcGFjaW5nOiBjb21tb25PcHRpb25zLmJyYWNrZXRTcGFjaW5nXG4gIH07XG5cbiAgdmFyIG5hbWUkNSA9IFwiR3JhcGhRTFwiO1xuICB2YXIgdHlwZSQ0ID0gXCJkYXRhXCI7XG4gIHZhciBleHRlbnNpb25zJDQgPSBbXG4gIFx0XCIuZ3JhcGhxbFwiLFxuICBcdFwiLmdxbFwiLFxuICBcdFwiLmdyYXBocWxzXCJcbiAgXTtcbiAgdmFyIHRtU2NvcGUkNCA9IFwic291cmNlLmdyYXBocWxcIjtcbiAgdmFyIGFjZU1vZGUkNCA9IFwidGV4dFwiO1xuICB2YXIgbGFuZ3VhZ2VJZCQ0ID0gMTM5O1xuICB2YXIgR3JhcGhRTCA9IHtcbiAgXHRuYW1lOiBuYW1lJDUsXG4gIFx0dHlwZTogdHlwZSQ0LFxuICBcdGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMkNCxcbiAgXHR0bVNjb3BlOiB0bVNjb3BlJDQsXG4gIFx0YWNlTW9kZTogYWNlTW9kZSQ0LFxuICBcdGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWQkNFxuICB9O1xuXG4gIHZhciBHcmFwaFFMJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIG5hbWU6IG5hbWUkNSxcbiAgICB0eXBlOiB0eXBlJDQsXG4gICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyQ0LFxuICAgIHRtU2NvcGU6IHRtU2NvcGUkNCxcbiAgICBhY2VNb2RlOiBhY2VNb2RlJDQsXG4gICAgbGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZCQ0LFxuICAgICdkZWZhdWx0JzogR3JhcGhRTFxuICB9KTtcblxuICB2YXIgcmVxdWlyZSQkMCQzID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShHcmFwaFFMJDEpO1xuXG4gIGNvbnN0IGxhbmd1YWdlcyQxID0gW2NyZWF0ZUxhbmd1YWdlKHJlcXVpcmUkJDAkMywgKCkgPT4gKHtcbiAgICBzaW5jZTogXCIxLjUuMFwiLFxuICAgIHBhcnNlcnM6IFtcImdyYXBocWxcIl0sXG4gICAgdnNjb2RlTGFuZ3VhZ2VJZHM6IFtcImdyYXBocWxcIl1cbiAgfSkpXTtcbiAgY29uc3QgcHJpbnRlcnMkMSA9IHtcbiAgICBncmFwaHFsOiBwcmludGVyR3JhcGhxbFxuICB9O1xuICB2YXIgbGFuZ3VhZ2VHcmFwaHFsID0ge1xuICAgIGxhbmd1YWdlczogbGFuZ3VhZ2VzJDEsXG4gICAgb3B0aW9uczogb3B0aW9ucyQzLFxuICAgIHByaW50ZXJzOiBwcmludGVycyQxXG4gIH07XG5cbiAgdmFyIGNsZWFuJDIgPSBmdW5jdGlvbiBjbGVhbihhc3QsIG5ld05vZGUpIHtcbiAgICBkZWxldGUgbmV3Tm9kZS5sb2M7XG4gICAgZGVsZXRlIG5ld05vZGUuc2VsZkNsb3Npbmc7IC8vIChHbGltbWVyL0hUTUwpIGlnbm9yZSBUZXh0Tm9kZSB3aGl0ZXNwYWNlXG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwiVGV4dE5vZGVcIikge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGFzdC5jaGFycy50cmltKCk7XG5cbiAgICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbmV3Tm9kZS5jaGFycyA9IHRyaW1tZWQ7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGlzVXBwZXJjYXNlKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcudG9VcHBlckNhc2UoKSA9PT0gc3RyaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNHbGltbWVyQ29tcG9uZW50KG5vZGUpIHtcbiAgICByZXR1cm4gaXNOb2RlT2ZTb21lVHlwZShub2RlLCBbXCJFbGVtZW50Tm9kZVwiXSkgJiYgdHlwZW9mIG5vZGUudGFnID09PSBcInN0cmluZ1wiICYmIChpc1VwcGVyY2FzZShub2RlLnRhZ1swXSkgfHwgbm9kZS50YWcuaW5jbHVkZXMoXCIuXCIpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzV2hpdGVzcGFjZU5vZGUobm9kZSkge1xuICAgIHJldHVybiBpc05vZGVPZlNvbWVUeXBlKG5vZGUsIFtcIlRleHROb2RlXCJdKSAmJiAhL1xcUy8udGVzdChub2RlLmNoYXJzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZU9mU29tZVR5cGUobm9kZSwgdHlwZXMpIHtcbiAgICByZXR1cm4gbm9kZSAmJiB0eXBlcy5zb21lKHR5cGUgPT4gbm9kZS50eXBlID09PSB0eXBlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUGFyZW50T2ZTb21lVHlwZShwYXRoLCB0eXBlcykge1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBwYXRoLmdldFBhcmVudE5vZGUoMCk7XG4gICAgcmV0dXJuIGlzTm9kZU9mU29tZVR5cGUocGFyZW50Tm9kZSwgdHlwZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNQcmV2aW91c05vZGVPZlNvbWVUeXBlKHBhdGgsIHR5cGVzKSB7XG4gICAgY29uc3QgcHJldmlvdXNOb2RlID0gZ2V0UHJldmlvdXNOb2RlKHBhdGgpO1xuICAgIHJldHVybiBpc05vZGVPZlNvbWVUeXBlKHByZXZpb3VzTm9kZSwgdHlwZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOZXh0Tm9kZU9mU29tZVR5cGUocGF0aCwgdHlwZXMpIHtcbiAgICBjb25zdCBuZXh0Tm9kZSA9IGdldE5leHROb2RlKHBhdGgpO1xuICAgIHJldHVybiBpc05vZGVPZlNvbWVUeXBlKG5leHROb2RlLCB0eXBlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTaWJsaW5nTm9kZShwYXRoLCBvZmZzZXQpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBwYXRoLmdldFBhcmVudE5vZGUoMCkgfHwge307XG4gICAgY29uc3QgY2hpbGRyZW4gPSBwYXJlbnROb2RlLmNoaWxkcmVuIHx8IHBhcmVudE5vZGUuYm9keSB8fCBbXTtcbiAgICBjb25zdCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2Yobm9kZSk7XG4gICAgcmV0dXJuIGluZGV4ICE9PSAtMSAmJiBjaGlsZHJlbltpbmRleCArIG9mZnNldF07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQcmV2aW91c05vZGUocGF0aCwgbG9va0JhY2sgPSAxKSB7XG4gICAgcmV0dXJuIGdldFNpYmxpbmdOb2RlKHBhdGgsIC1sb29rQmFjayk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXROZXh0Tm9kZShwYXRoKSB7XG4gICAgcmV0dXJuIGdldFNpYmxpbmdOb2RlKHBhdGgsIDEpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNQcmV0dGllcklnbm9yZU5vZGUobm9kZSkge1xuICAgIHJldHVybiBpc05vZGVPZlNvbWVUeXBlKG5vZGUsIFtcIk11c3RhY2hlQ29tbWVudFN0YXRlbWVudFwiXSkgJiYgdHlwZW9mIG5vZGUudmFsdWUgPT09IFwic3RyaW5nXCIgJiYgbm9kZS52YWx1ZS50cmltKCkgPT09IFwicHJldHRpZXItaWdub3JlXCI7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNQcmV0dGllcklnbm9yZShwYXRoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBwcmV2aW91c1ByZXZpb3VzTm9kZSA9IGdldFByZXZpb3VzTm9kZShwYXRoLCAyKTtcbiAgICByZXR1cm4gaXNQcmV0dGllcklnbm9yZU5vZGUobm9kZSkgfHwgaXNQcmV0dGllcklnbm9yZU5vZGUocHJldmlvdXNQcmV2aW91c05vZGUpO1xuICB9XG5cbiAgdmFyIHV0aWxzJDMgPSB7XG4gICAgZ2V0TmV4dE5vZGUsXG4gICAgZ2V0UHJldmlvdXNOb2RlLFxuICAgIGhhc1ByZXR0aWVySWdub3JlLFxuICAgIGlzR2xpbW1lckNvbXBvbmVudCxcbiAgICBpc05leHROb2RlT2ZTb21lVHlwZSxcbiAgICBpc05vZGVPZlNvbWVUeXBlLFxuICAgIGlzUGFyZW50T2ZTb21lVHlwZSxcbiAgICBpc1ByZXZpb3VzTm9kZU9mU29tZVR5cGUsXG4gICAgaXNXaGl0ZXNwYWNlTm9kZVxuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBjb25jYXQ6IGNvbmNhdCQ3LFxuICAgIGpvaW46IGpvaW4kNCxcbiAgICBzb2Z0bGluZTogc29mdGxpbmUkMyxcbiAgICBoYXJkbGluZTogaGFyZGxpbmUkNixcbiAgICBsaW5lOiBsaW5lJDQsXG4gICAgZ3JvdXA6IGdyb3VwJDYsXG4gICAgaW5kZW50OiBpbmRlbnQkNCxcbiAgICBpZkJyZWFrOiBpZkJyZWFrJDNcbiAgfSA9IGRvY3VtZW50LmJ1aWxkZXJzO1xuICBjb25zdCB7XG4gICAgZ2V0TmV4dE5vZGU6IGdldE5leHROb2RlJDEsXG4gICAgZ2V0UHJldmlvdXNOb2RlOiBnZXRQcmV2aW91c05vZGUkMSxcbiAgICBoYXNQcmV0dGllcklnbm9yZTogaGFzUHJldHRpZXJJZ25vcmUkMSxcbiAgICBpc0dsaW1tZXJDb21wb25lbnQ6IGlzR2xpbW1lckNvbXBvbmVudCQxLFxuICAgIGlzTmV4dE5vZGVPZlNvbWVUeXBlOiBpc05leHROb2RlT2ZTb21lVHlwZSQxLFxuICAgIGlzUGFyZW50T2ZTb21lVHlwZTogaXNQYXJlbnRPZlNvbWVUeXBlJDEsXG4gICAgaXNQcmV2aW91c05vZGVPZlNvbWVUeXBlOiBpc1ByZXZpb3VzTm9kZU9mU29tZVR5cGUkMSxcbiAgICBpc1doaXRlc3BhY2VOb2RlOiBpc1doaXRlc3BhY2VOb2RlJDFcbiAgfSA9IHV0aWxzJDM7IC8vIGh0dHA6Ly93M2MuZ2l0aHViLmlvL2h0bWwvc2luZ2xlLXBhZ2UuaHRtbCN2b2lkLWVsZW1lbnRzXG5cbiAgY29uc3Qgdm9pZFRhZ3MgPSBbXCJhcmVhXCIsIFwiYmFzZVwiLCBcImJyXCIsIFwiY29sXCIsIFwiZW1iZWRcIiwgXCJoclwiLCBcImltZ1wiLCBcImlucHV0XCIsIFwibGlua1wiLCBcIm1ldGFcIiwgXCJwYXJhbVwiLCBcInNvdXJjZVwiLCBcInRyYWNrXCIsIFwid2JyXCJdOyAvLyBGb3JtYXR0ZXIgYmFzZWQgb24gQGdsaW1tZXJqcy9zeW50YXgncyBidWlsdC1pbiB0ZXN0IGZvcm1hdHRlcjpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dsaW1tZXJqcy9nbGltbWVyLXZtL2Jsb2IvbWFzdGVyL3BhY2thZ2VzLyU0MGdsaW1tZXIvc3ludGF4L2xpYi9nZW5lcmF0aW9uL3ByaW50LnRzXG5cbiAgZnVuY3Rpb24gcHJpbnQocGF0aCwgb3B0aW9ucywgcHJpbnQpIHtcbiAgICBjb25zdCBuID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiovXG5cbiAgICBpZiAoIW4pIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIGlmIChoYXNQcmV0dGllcklnbm9yZSQxKHBhdGgpKSB7XG4gICAgICBjb25zdCBzdGFydE9mZnNldCA9IGxvY2F0aW9uVG9PZmZzZXQob3B0aW9ucy5vcmlnaW5hbFRleHQsIG4ubG9jLnN0YXJ0LmxpbmUgLSAxLCBuLmxvYy5zdGFydC5jb2x1bW4pO1xuICAgICAgY29uc3QgZW5kT2Zmc2V0ID0gbG9jYXRpb25Ub09mZnNldChvcHRpb25zLm9yaWdpbmFsVGV4dCwgbi5sb2MuZW5kLmxpbmUgLSAxLCBuLmxvYy5lbmQuY29sdW1uKTtcbiAgICAgIGNvbnN0IGlnbm9yZWRUZXh0ID0gb3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2Uoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCk7XG4gICAgICByZXR1cm4gaWdub3JlZFRleHQ7XG4gICAgfVxuXG4gICAgc3dpdGNoIChuLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJCbG9ja1wiOlxuICAgICAgY2FzZSBcIlByb2dyYW1cIjpcbiAgICAgIGNhc2UgXCJUZW1wbGF0ZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwJDYoY29uY2F0JDcocGF0aC5tYXAocHJpbnQsIFwiYm9keVwiKSkpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJFbGVtZW50Tm9kZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBuLmNoaWxkcmVuLmxlbmd0aCA+IDA7XG4gICAgICAgICAgY29uc3QgaGFzTm9uV2hpdGVzcGFjZUNoaWxkcmVuID0gbi5jaGlsZHJlbi5zb21lKG4gPT4gIWlzV2hpdGVzcGFjZU5vZGUkMShuKSk7XG4gICAgICAgICAgY29uc3QgaXNWb2lkID0gaXNHbGltbWVyQ29tcG9uZW50JDEobikgJiYgKCFoYXNDaGlsZHJlbiB8fCAhaGFzTm9uV2hpdGVzcGFjZUNoaWxkcmVuKSB8fCB2b2lkVGFncy5pbmNsdWRlcyhuLnRhZyk7XG4gICAgICAgICAgY29uc3QgY2xvc2VUYWdGb3JOb0JyZWFrID0gaXNWb2lkID8gY29uY2F0JDcoW1wiIC8+XCIsIHNvZnRsaW5lJDNdKSA6IFwiPlwiO1xuICAgICAgICAgIGNvbnN0IGNsb3NlVGFnRm9yQnJlYWsgPSBpc1ZvaWQgPyBcIi8+XCIgOiBcIj5cIjtcblxuICAgICAgICAgIGNvbnN0IHByaW50UGFyYW1zID0gKHBhdGgsIHByaW50KSA9PiBpbmRlbnQkNChjb25jYXQkNyhbbi5hdHRyaWJ1dGVzLmxlbmd0aCA/IGxpbmUkNCA6IFwiXCIsIGpvaW4kNChsaW5lJDQsIHBhdGgubWFwKHByaW50LCBcImF0dHJpYnV0ZXNcIikpLCBuLm1vZGlmaWVycy5sZW5ndGggPyBsaW5lJDQgOiBcIlwiLCBqb2luJDQobGluZSQ0LCBwYXRoLm1hcChwcmludCwgXCJtb2RpZmllcnNcIikpLCBuLmNvbW1lbnRzLmxlbmd0aCA/IGxpbmUkNCA6IFwiXCIsIGpvaW4kNChsaW5lJDQsIHBhdGgubWFwKHByaW50LCBcImNvbW1lbnRzXCIpKV0pKTtcblxuICAgICAgICAgIGNvbnN0IG5leHROb2RlID0gZ2V0TmV4dE5vZGUkMShwYXRoKTtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDcoW2dyb3VwJDYoY29uY2F0JDcoW1wiPFwiLCBuLnRhZywgcHJpbnRQYXJhbXMocGF0aCwgcHJpbnQpLCBuLmJsb2NrUGFyYW1zLmxlbmd0aCA/IFwiIGFzIHxcIi5jb25jYXQobi5ibG9ja1BhcmFtcy5qb2luKFwiIFwiKSwgXCJ8XCIpIDogXCJcIiwgaWZCcmVhayQzKHNvZnRsaW5lJDMsIFwiXCIpLCBpZkJyZWFrJDMoY2xvc2VUYWdGb3JCcmVhaywgY2xvc2VUYWdGb3JOb0JyZWFrKV0pKSwgIWlzVm9pZCA/IGdyb3VwJDYoY29uY2F0JDcoW2hhc05vbldoaXRlc3BhY2VDaGlsZHJlbiA/IGluZGVudCQ0KHByaW50Q2hpbGRyZW4ocGF0aCwgb3B0aW9ucywgcHJpbnQpKSA6IFwiXCIsIGlmQnJlYWskMyhoYXNDaGlsZHJlbiA/IGhhcmRsaW5lJDYgOiBcIlwiLCBcIlwiKSwgY29uY2F0JDcoW1wiPC9cIiwgbi50YWcsIFwiPlwiXSldKSkgOiBcIlwiLCBuZXh0Tm9kZSAmJiBuZXh0Tm9kZS50eXBlID09PSBcIkVsZW1lbnROb2RlXCIgPyBoYXJkbGluZSQ2IDogXCJcIl0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJCbG9ja1N0YXRlbWVudFwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcHAgPSBwYXRoLmdldFBhcmVudE5vZGUoMSk7XG4gICAgICAgICAgY29uc3QgaXNFbHNlSWYgPSBwcCAmJiBwcC5pbnZlcnNlICYmIHBwLmludmVyc2UuYm9keS5sZW5ndGggPT09IDEgJiYgcHAuaW52ZXJzZS5ib2R5WzBdID09PSBuICYmIHBwLmludmVyc2UuYm9keVswXS5wYXRoLnBhcnRzWzBdID09PSBcImlmXCI7XG4gICAgICAgICAgY29uc3QgaGFzRWxzZUlmID0gbi5pbnZlcnNlICYmIG4uaW52ZXJzZS5ib2R5Lmxlbmd0aCA9PT0gMSAmJiBuLmludmVyc2UuYm9keVswXS50eXBlID09PSBcIkJsb2NrU3RhdGVtZW50XCIgJiYgbi5pbnZlcnNlLmJvZHlbMF0ucGF0aC5wYXJ0c1swXSA9PT0gXCJpZlwiO1xuICAgICAgICAgIGNvbnN0IGluZGVudEVsc2UgPSBoYXNFbHNlSWYgPyBhID0+IGEgOiBpbmRlbnQkNDtcbiAgICAgICAgICBjb25zdCBpbnZlcnNlRWxzZVN0YXRlbWVudCA9IChuLmludmVyc2VTdHJpcC5vcGVuID8gXCJ7e35cIiA6IFwie3tcIikgKyBcImVsc2VcIiArIChuLmludmVyc2VTdHJpcC5jbG9zZSA/IFwifn19XCIgOiBcIn19XCIpO1xuXG4gICAgICAgICAgaWYgKG4uaW52ZXJzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCQ3KFtpc0Vsc2VJZiA/IGNvbmNhdCQ3KFtuLm9wZW5TdHJpcC5vcGVuID8gXCJ7e35lbHNlIFwiIDogXCJ7e2Vsc2UgXCIsIHByaW50UGF0aFBhcmFtcyhwYXRoLCBwcmludCksIG4ub3BlblN0cmlwLmNsb3NlID8gXCJ+fX1cIiA6IFwifX1cIl0pIDogcHJpbnRPcGVuQmxvY2socGF0aCwgcHJpbnQsIG4ub3BlblN0cmlwKSwgaW5kZW50JDQoY29uY2F0JDcoW2hhcmRsaW5lJDYsIHBhdGguY2FsbChwcmludCwgXCJwcm9ncmFtXCIpXSkpLCBuLmludmVyc2UgJiYgIWhhc0Vsc2VJZiA/IGNvbmNhdCQ3KFtoYXJkbGluZSQ2LCBpbnZlcnNlRWxzZVN0YXRlbWVudF0pIDogXCJcIiwgbi5pbnZlcnNlID8gaW5kZW50RWxzZShjb25jYXQkNyhbaGFyZGxpbmUkNiwgcGF0aC5jYWxsKHByaW50LCBcImludmVyc2VcIildKSkgOiBcIlwiLCBpc0Vsc2VJZiA/IFwiXCIgOiBjb25jYXQkNyhbaGFyZGxpbmUkNiwgcHJpbnRDbG9zZUJsb2NrKHBhdGgsIHByaW50LCBuLmNsb3NlU3RyaXApXSldKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRWxzZUlmKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JDcoW2NvbmNhdCQ3KFtuLm9wZW5TdHJpcC5vcGVuID8gXCJ7e35lbHNlXCIgOiBcInt7ZWxzZSBcIiwgcHJpbnRQYXRoUGFyYW1zKHBhdGgsIHByaW50KSwgbi5vcGVuU3RyaXAuY2xvc2UgPyBcIn59fVwiIDogXCJ9fVwiXSksIGluZGVudCQ0KGNvbmNhdCQ3KFtoYXJkbGluZSQ2LCBwYXRoLmNhbGwocHJpbnQsIFwicHJvZ3JhbVwiKV0pKV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGhhc05vbldoaXRlc3BhY2VDaGlsZHJlbiA9IG4ucHJvZ3JhbS5ib2R5LnNvbWUobiA9PiAhaXNXaGl0ZXNwYWNlTm9kZSQxKG4pKTtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDcoW3ByaW50T3BlbkJsb2NrKHBhdGgsIHByaW50LCBuLm9wZW5TdHJpcCksIGdyb3VwJDYoY29uY2F0JDcoW2luZGVudCQ0KGNvbmNhdCQ3KFtzb2Z0bGluZSQzLCBwYXRoLmNhbGwocHJpbnQsIFwicHJvZ3JhbVwiKV0pKSwgaGFzTm9uV2hpdGVzcGFjZUNoaWxkcmVuID8gaGFyZGxpbmUkNiA6IHNvZnRsaW5lJDMsIHByaW50Q2xvc2VCbG9jayhwYXRoLCBwcmludCwgbi5jbG9zZVN0cmlwKV0pKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJFbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBncm91cCQ2KGNvbmNhdCQ3KFtcInt7XCIsIHByaW50UGF0aFBhcmFtcyhwYXRoLCBwcmludCksIHNvZnRsaW5lJDMsIFwifX1cIl0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiTXVzdGFjaGVTdGF0ZW1lbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IGlzRXNjYXBlZCA9IG4uZXNjYXBlZCA9PT0gZmFsc2U7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgb3Blbjogb3BlblN0cmlwLFxuICAgICAgICAgICAgY2xvc2U6IGNsb3NlU3RyaXBcbiAgICAgICAgICB9ID0gbi5zdHJpcDtcbiAgICAgICAgICBjb25zdCBvcGVuaW5nID0gKGlzRXNjYXBlZCA/IFwie3t7XCIgOiBcInt7XCIpICsgKG9wZW5TdHJpcCA/IFwiflwiIDogXCJcIik7XG4gICAgICAgICAgY29uc3QgY2xvc2luZyA9IChjbG9zZVN0cmlwID8gXCJ+XCIgOiBcIlwiKSArIChpc0VzY2FwZWQgPyBcIn19fVwiIDogXCJ9fVwiKTtcbiAgICAgICAgICBjb25zdCBsZWFkaW5nID0gaXNQYXJlbnRPZlNvbWVUeXBlJDEocGF0aCwgW1wiQXR0ck5vZGVcIiwgXCJDb25jYXRTdGF0ZW1lbnRcIiwgXCJFbGVtZW50Tm9kZVwiXSkgPyBbb3BlbmluZywgaW5kZW50JDQoc29mdGxpbmUkMyldIDogW29wZW5pbmddO1xuICAgICAgICAgIHJldHVybiBncm91cCQ2KGNvbmNhdCQ3KFsuLi5sZWFkaW5nLCBwcmludFBhdGhQYXJhbXMocGF0aCwgcHJpbnQpLCBzb2Z0bGluZSQzLCBjbG9zaW5nXSkpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJTdWJFeHByZXNzaW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSBwcmludFBhcmFtcyhwYXRoLCBwcmludCk7XG4gICAgICAgICAgY29uc3QgcHJpbnRlZFBhcmFtcyA9IHBhcmFtcy5sZW5ndGggPiAwID8gaW5kZW50JDQoY29uY2F0JDcoW2xpbmUkNCwgZ3JvdXAkNihqb2luJDQobGluZSQ0LCBwYXJhbXMpKV0pKSA6IFwiXCI7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwJDYoY29uY2F0JDcoW1wiKFwiLCBwcmludFBhdGgocGF0aCwgcHJpbnQpLCBwcmludGVkUGFyYW1zLCBzb2Z0bGluZSQzLCBcIilcIl0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiQXR0ck5vZGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IGlzVGV4dCA9IG4udmFsdWUudHlwZSA9PT0gXCJUZXh0Tm9kZVwiO1xuICAgICAgICAgIGNvbnN0IGlzRW1wdHlUZXh0ID0gaXNUZXh0ICYmIG4udmFsdWUuY2hhcnMgPT09IFwiXCI7IC8vIElmIHRoZSB0ZXh0IGlzIGVtcHR5IGFuZCB0aGUgdmFsdWUncyBsb2Mgc3RhcnQgYW5kIGVuZCBjb2x1bW5zIGFyZSB0aGVcbiAgICAgICAgICAvLyBzYW1lLCB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgdGhpcyBBdHRyTm9kZSBhbmQgaXQgc2hvdWxkIGJlIHByaW50ZWRcbiAgICAgICAgICAvLyB3aXRob3V0IHRoZSBgPVwiXCJgLiBFeGFtcGxlOiBgPGltZyBkYXRhLXRlc3Q+YCAtPiBgPGltZyBkYXRhLXRlc3Q+YFxuXG4gICAgICAgICAgY29uc3QgaXNFbXB0eVZhbHVlID0gaXNFbXB0eVRleHQgJiYgbi52YWx1ZS5sb2Muc3RhcnQuY29sdW1uID09PSBuLnZhbHVlLmxvYy5lbmQuY29sdW1uO1xuXG4gICAgICAgICAgaWYgKGlzRW1wdHlWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCQ3KFtuLm5hbWVdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgICBjb25zdCBxdW90ZWRWYWx1ZSA9IGlzVGV4dCA/IHByaW50U3RyaW5nTGl0ZXJhbCh2YWx1ZS5wYXJ0cy5qb2luKCksIG9wdGlvbnMpIDogdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ3KFtuLm5hbWUsIFwiPVwiLCBxdW90ZWRWYWx1ZV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJDb25jYXRTdGF0ZW1lbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBjb25jYXQkNyhbJ1wiJywgY29uY2F0JDcocGF0aC5tYXAocGFydFBhdGggPT4gcHJpbnQocGFydFBhdGgpLCBcInBhcnRzXCIpLmZpbHRlcihhID0+IGEgIT09IFwiXCIpKSwgJ1wiJ10pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJIYXNoXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDcoW2pvaW4kNChsaW5lJDQsIHBhdGgubWFwKHByaW50LCBcInBhaXJzXCIpKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJIYXNoUGFpclwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ3KFtuLmtleSwgXCI9XCIsIHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJUZXh0Tm9kZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgbWF4TGluZUJyZWFrc1RvUHJlc2VydmUgPSAyO1xuICAgICAgICAgIGNvbnN0IGlzRmlyc3RFbGVtZW50ID0gIWdldFByZXZpb3VzTm9kZSQxKHBhdGgpO1xuICAgICAgICAgIGNvbnN0IGlzTGFzdEVsZW1lbnQgPSAhZ2V0TmV4dE5vZGUkMShwYXRoKTtcbiAgICAgICAgICBjb25zdCBpc1doaXRlc3BhY2VPbmx5ID0gIS9cXFMvLnRlc3Qobi5jaGFycyk7XG4gICAgICAgICAgY29uc3QgbGluZUJyZWFrc0NvdW50ID0gY291bnROZXdMaW5lcyhuLmNoYXJzKTtcbiAgICAgICAgICBjb25zdCBoYXNCbG9ja1BhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgwKS50eXBlID09PSBcIkJsb2NrXCI7XG4gICAgICAgICAgY29uc3QgaGFzRWxlbWVudFBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgwKS50eXBlID09PSBcIkVsZW1lbnROb2RlXCI7XG4gICAgICAgICAgY29uc3QgaGFzVGVtcGxhdGVQYXJlbnQgPSBwYXRoLmdldFBhcmVudE5vZGUoMCkudHlwZSA9PT0gXCJUZW1wbGF0ZVwiO1xuICAgICAgICAgIGxldCBsZWFkaW5nTGluZUJyZWFrc0NvdW50ID0gY291bnRMZWFkaW5nTmV3TGluZXMobi5jaGFycyk7XG4gICAgICAgICAgbGV0IHRyYWlsaW5nTGluZUJyZWFrc0NvdW50ID0gY291bnRUcmFpbGluZ05ld0xpbmVzKG4uY2hhcnMpO1xuXG4gICAgICAgICAgaWYgKChpc0ZpcnN0RWxlbWVudCB8fCBpc0xhc3RFbGVtZW50KSAmJiBpc1doaXRlc3BhY2VPbmx5ICYmIChoYXNCbG9ja1BhcmVudCB8fCBoYXNFbGVtZW50UGFyZW50IHx8IGhhc1RlbXBsYXRlUGFyZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZU9ubHkgJiYgbGluZUJyZWFrc0NvdW50KSB7XG4gICAgICAgICAgICBsZWFkaW5nTGluZUJyZWFrc0NvdW50ID0gTWF0aC5taW4obGluZUJyZWFrc0NvdW50LCBtYXhMaW5lQnJlYWtzVG9QcmVzZXJ2ZSk7XG4gICAgICAgICAgICB0cmFpbGluZ0xpbmVCcmVha3NDb3VudCA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc05leHROb2RlT2ZTb21lVHlwZSQxKHBhdGgsIFtcIkJsb2NrU3RhdGVtZW50XCIsIFwiRWxlbWVudE5vZGVcIl0pKSB7XG4gICAgICAgICAgICAgIHRyYWlsaW5nTGluZUJyZWFrc0NvdW50ID0gTWF0aC5tYXgodHJhaWxpbmdMaW5lQnJlYWtzQ291bnQsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNQcmV2aW91c05vZGVPZlNvbWVUeXBlJDEocGF0aCwgW1wiRWxlbWVudE5vZGVcIl0pIHx8IGlzUHJldmlvdXNOb2RlT2ZTb21lVHlwZSQxKHBhdGgsIFtcIkJsb2NrU3RhdGVtZW50XCJdKSkge1xuICAgICAgICAgICAgICBsZWFkaW5nTGluZUJyZWFrc0NvdW50ID0gTWF0aC5tYXgobGVhZGluZ0xpbmVCcmVha3NDb3VudCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IGxlYWRpbmdTcGFjZSA9IFwiXCI7XG4gICAgICAgICAgbGV0IHRyYWlsaW5nU3BhY2UgPSBcIlwiOyAvLyBwcmVzZXJ2ZSBhIHNwYWNlIGluc2lkZSBvZiBhbiBhdHRyaWJ1dGUgbm9kZSB3aGVyZSB3aGl0ZXNwYWNlIHByZXNlbnQsXG4gICAgICAgICAgLy8gd2hlbiBuZXh0IHRvIG11c3RhY2hlIHN0YXRlbWVudC5cblxuICAgICAgICAgIGNvbnN0IGluQXR0ck5vZGUgPSBwYXRoLnN0YWNrLmluY2x1ZGVzKFwiYXR0cmlidXRlc1wiKTtcblxuICAgICAgICAgIGlmIChpbkF0dHJOb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gcGF0aC5nZXRQYXJlbnROb2RlKDApO1xuICAgICAgICAgICAgY29uc3QgaXNDb25jYXQgPSBwYXJlbnROb2RlLnR5cGUgPT09IFwiQ29uY2F0U3RhdGVtZW50XCI7XG5cbiAgICAgICAgICAgIGlmIChpc0NvbmNhdCkge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgcGFydHNcbiAgICAgICAgICAgICAgfSA9IHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcnRJbmRleCA9IHBhcnRzLmluZGV4T2Yobik7XG5cbiAgICAgICAgICAgICAgaWYgKHBhcnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VHlwZSA9IHBhcnRzW3BhcnRJbmRleCAtIDFdLnR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNNdXN0YWNoZSA9IHBhcnRUeXBlID09PSBcIk11c3RhY2hlU3RhdGVtZW50XCI7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNNdXN0YWNoZSkge1xuICAgICAgICAgICAgICAgICAgbGVhZGluZ1NwYWNlID0gXCIgXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHBhcnRJbmRleCA8IHBhcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VHlwZSA9IHBhcnRzW3BhcnRJbmRleCArIDFdLnR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNNdXN0YWNoZSA9IHBhcnRUeXBlID09PSBcIk11c3RhY2hlU3RhdGVtZW50XCI7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNNdXN0YWNoZSkge1xuICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZSA9IFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodHJhaWxpbmdMaW5lQnJlYWtzQ291bnQgPT09IDAgJiYgaXNOZXh0Tm9kZU9mU29tZVR5cGUkMShwYXRoLCBbXCJNdXN0YWNoZVN0YXRlbWVudFwiXSkpIHtcbiAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZSA9IFwiIFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGVhZGluZ0xpbmVCcmVha3NDb3VudCA9PT0gMCAmJiBpc1ByZXZpb3VzTm9kZU9mU29tZVR5cGUkMShwYXRoLCBbXCJNdXN0YWNoZVN0YXRlbWVudFwiXSkpIHtcbiAgICAgICAgICAgICAgbGVhZGluZ1NwYWNlID0gXCIgXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0ZpcnN0RWxlbWVudCkge1xuICAgICAgICAgICAgICBsZWFkaW5nTGluZUJyZWFrc0NvdW50ID0gMDtcbiAgICAgICAgICAgICAgbGVhZGluZ1NwYWNlID0gXCJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTGFzdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgdHJhaWxpbmdMaW5lQnJlYWtzQ291bnQgPSAwO1xuICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29uY2F0JDcoWy4uLmdlbmVyYXRlSGFyZGxpbmVzKGxlYWRpbmdMaW5lQnJlYWtzQ291bnQsIG1heExpbmVCcmVha3NUb1ByZXNlcnZlKSwgbi5jaGFycy5yZXBsYWNlKC9eW1xccyBdKy9nLCBsZWFkaW5nU3BhY2UpLnJlcGxhY2UoL1tcXHMgXSskLywgdHJhaWxpbmdTcGFjZSksIC4uLmdlbmVyYXRlSGFyZGxpbmVzKHRyYWlsaW5nTGluZUJyZWFrc0NvdW50LCBtYXhMaW5lQnJlYWtzVG9QcmVzZXJ2ZSldLmZpbHRlcihCb29sZWFuKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIk11c3RhY2hlQ29tbWVudFN0YXRlbWVudFwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgZGFzaGVzID0gbi52YWx1ZS5pbmNsdWRlcyhcIn19XCIpID8gXCItLVwiIDogXCJcIjtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JDcoW1wie3shXCIsIGRhc2hlcywgbi52YWx1ZSwgZGFzaGVzLCBcIn19XCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiUGF0aEV4cHJlc3Npb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBuLm9yaWdpbmFsO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyhuLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiQ29tbWVudFN0YXRlbWVudFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCQ3KFtcIjwhLS1cIiwgbi52YWx1ZSwgXCItLT5cIl0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJTdHJpbmdMaXRlcmFsXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gcHJpbnRTdHJpbmdMaXRlcmFsKG4udmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJOdW1iZXJMaXRlcmFsXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKG4udmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJVbmRlZmluZWRMaXRlcmFsXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiTnVsbExpdGVyYWxcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgfVxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGdsaW1tZXIgdHlwZTogXCIgKyBKU09OLnN0cmluZ2lmeShuLnR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcmludENoaWxkcmVuKHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgcmV0dXJuIGNvbmNhdCQ3KHBhdGgubWFwKChjaGlsZFBhdGgsIGNoaWxkSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICAgIGNvbnN0IGlzRmlyc3ROb2RlID0gY2hpbGRJbmRleCA9PT0gMDtcbiAgICAgIGNvbnN0IGlzTGFzdE5vZGUgPSBjaGlsZEluZGV4ID09PSBwYXRoLmdldFBhcmVudE5vZGUoMCkuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgIGNvbnN0IGlzTGFzdE5vZGVJbk11bHRpTm9kZUxpc3QgPSBpc0xhc3ROb2RlICYmICFpc0ZpcnN0Tm9kZTtcbiAgICAgIGNvbnN0IGlzV2hpdGVzcGFjZSA9IGlzV2hpdGVzcGFjZU5vZGUkMShjaGlsZE5vZGUpO1xuXG4gICAgICBpZiAoaXNXaGl0ZXNwYWNlICYmIGlzTGFzdE5vZGVJbk11bHRpTm9kZUxpc3QpIHtcbiAgICAgICAgcmV0dXJuIHByaW50KGNoaWxkUGF0aCwgb3B0aW9ucywgcHJpbnQpO1xuICAgICAgfSBlbHNlIGlmIChpc0ZpcnN0Tm9kZSkge1xuICAgICAgICByZXR1cm4gY29uY2F0JDcoW3NvZnRsaW5lJDMsIHByaW50KGNoaWxkUGF0aCwgb3B0aW9ucywgcHJpbnQpXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmludChjaGlsZFBhdGgsIG9wdGlvbnMsIHByaW50KTtcbiAgICB9LCBcImNoaWxkcmVuXCIpKTtcbiAgfVxuICAvKipcbiAgICogUHJpbnRzIGEgc3RyaW5nIGxpdGVyYWwgd2l0aCB0aGUgY29ycmVjdCBzdXJyb3VuZGluZyBxdW90ZXMgYmFzZWQgb25cbiAgICogYG9wdGlvbnMuc2luZ2xlUXVvdGVgIGFuZCB0aGUgbnVtYmVyIG9mIGVzY2FwZWQgcXVvdGVzIGNvbnRhaW5lZCBpblxuICAgKiB0aGUgc3RyaW5nIGxpdGVyYWwuIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGdsaW1tZXIgZXF1aXZhbGVudCBvZiBgcHJpbnRTdHJpbmdgXG4gICAqIGluIGBjb21tb24vdXRpbGAsIGJ1dCBoYXMgZGlmZmVyZW5jZXMgYmVjYXVzZSBvZiB0aGUgd2F5IGVzY2FwZWQgY2hhcmFjdGVyc1xuICAgKiBhcmUgdHJlYXRlZCBpbiBoYnMgc3RyaW5nIGxpdGVyYWxzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nTGl0ZXJhbCAtIHRoZSBzdHJpbmcgbGl0ZXJhbCB2YWx1ZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIHRoZSBwcmV0dGllciBvcHRpb25zIG9iamVjdFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHByaW50U3RyaW5nTGl0ZXJhbChzdHJpbmdMaXRlcmFsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZG91YmxlID0ge1xuICAgICAgcXVvdGU6ICdcIicsXG4gICAgICByZWdleDogL1wiL2dcbiAgICB9O1xuICAgIGNvbnN0IHNpbmdsZSA9IHtcbiAgICAgIHF1b3RlOiBcIidcIixcbiAgICAgIHJlZ2V4OiAvJy9nXG4gICAgfTtcbiAgICBjb25zdCBwcmVmZXJyZWQgPSBvcHRpb25zLnNpbmdsZVF1b3RlID8gc2luZ2xlIDogZG91YmxlO1xuICAgIGNvbnN0IGFsdGVybmF0ZSA9IHByZWZlcnJlZCA9PT0gc2luZ2xlID8gZG91YmxlIDogc2luZ2xlO1xuICAgIGxldCBzaG91bGRVc2VBbHRlcm5hdGVRdW90ZSA9IGZhbHNlOyAvLyBJZiBgc3RyaW5nTGl0ZXJhbGAgY29udGFpbnMgYXQgbGVhc3Qgb25lIG9mIHRoZSBxdW90ZSBwcmVmZXJyZWQgZm9yXG4gICAgLy8gZW5jbG9zaW5nIHRoZSBzdHJpbmcsIHdlIG1pZ2h0IHdhbnQgdG8gZW5jbG9zZSB3aXRoIHRoZSBhbHRlcm5hdGUgcXVvdGVcbiAgICAvLyBpbnN0ZWFkLCB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIGVzY2FwZWQgcXVvdGVzLlxuXG4gICAgaWYgKHN0cmluZ0xpdGVyYWwuaW5jbHVkZXMocHJlZmVycmVkLnF1b3RlKSB8fCBzdHJpbmdMaXRlcmFsLmluY2x1ZGVzKGFsdGVybmF0ZS5xdW90ZSkpIHtcbiAgICAgIGNvbnN0IG51bVByZWZlcnJlZFF1b3RlcyA9IChzdHJpbmdMaXRlcmFsLm1hdGNoKHByZWZlcnJlZC5yZWdleCkgfHwgW10pLmxlbmd0aDtcbiAgICAgIGNvbnN0IG51bUFsdGVybmF0ZVF1b3RlcyA9IChzdHJpbmdMaXRlcmFsLm1hdGNoKGFsdGVybmF0ZS5yZWdleCkgfHwgW10pLmxlbmd0aDtcbiAgICAgIHNob3VsZFVzZUFsdGVybmF0ZVF1b3RlID0gbnVtUHJlZmVycmVkUXVvdGVzID4gbnVtQWx0ZXJuYXRlUXVvdGVzO1xuICAgIH1cblxuICAgIGNvbnN0IGVuY2xvc2luZ1F1b3RlID0gc2hvdWxkVXNlQWx0ZXJuYXRlUXVvdGUgPyBhbHRlcm5hdGUgOiBwcmVmZXJyZWQ7XG4gICAgY29uc3QgZXNjYXBlZFN0cmluZ0xpdGVyYWwgPSBzdHJpbmdMaXRlcmFsLnJlcGxhY2UoZW5jbG9zaW5nUXVvdGUucmVnZXgsIFwiXFxcXFwiLmNvbmNhdChlbmNsb3NpbmdRdW90ZS5xdW90ZSkpO1xuICAgIHJldHVybiBjb25jYXQkNyhbZW5jbG9zaW5nUXVvdGUucXVvdGUsIGVzY2FwZWRTdHJpbmdMaXRlcmFsLCBlbmNsb3NpbmdRdW90ZS5xdW90ZV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRQYXRoKHBhdGgsIHByaW50KSB7XG4gICAgcmV0dXJuIHBhdGguY2FsbChwcmludCwgXCJwYXRoXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRQYXJhbXMocGF0aCwgcHJpbnQpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGxldCBwYXJ0cyA9IFtdO1xuXG4gICAgaWYgKG5vZGUucGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzID0gcGFydHMuY29uY2F0KHBhdGgubWFwKHByaW50LCBcInBhcmFtc1wiKSk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuaGFzaCAmJiBub2RlLmhhc2gucGFpcnMubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChwYXRoLmNhbGwocHJpbnQsIFwiaGFzaFwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRQYXRoUGFyYW1zKHBhdGgsIHByaW50KSB7XG4gICAgY29uc3QgcHJpbnRlZFBhdGggPSBwcmludFBhdGgocGF0aCwgcHJpbnQpO1xuICAgIGNvbnN0IHByaW50ZWRQYXJhbXMgPSBwcmludFBhcmFtcyhwYXRoLCBwcmludCk7XG4gICAgY29uc3QgcGFydHMgPSBbcHJpbnRlZFBhdGgsIC4uLnByaW50ZWRQYXJhbXNdO1xuICAgIHJldHVybiBpbmRlbnQkNChncm91cCQ2KGpvaW4kNChsaW5lJDQsIHBhcnRzKSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRCbG9ja1BhcmFtcyhwYXRoKSB7XG4gICAgY29uc3QgYmxvY2sgPSBwYXRoLmdldFZhbHVlKCk7XG5cbiAgICBpZiAoIWJsb2NrLnByb2dyYW0gfHwgIWJsb2NrLnByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uY2F0JDcoW1wiIGFzIHxcIiwgYmxvY2sucHJvZ3JhbS5ibG9ja1BhcmFtcy5qb2luKFwiIFwiKSwgXCJ8XCJdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50T3BlbkJsb2NrKHBhdGgsIHByaW50LCB7XG4gICAgb3BlbjogaXNPcGVuU3RyaXAgPSBmYWxzZSxcbiAgICBjbG9zZTogaXNDbG9zZVN0cmlwID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIGdyb3VwJDYoY29uY2F0JDcoW2lzT3BlblN0cmlwID8gXCJ7e34jXCIgOiBcInt7I1wiLCBwcmludFBhdGhQYXJhbXMocGF0aCwgcHJpbnQpLCBwcmludEJsb2NrUGFyYW1zKHBhdGgpLCBzb2Z0bGluZSQzLCBpc0Nsb3NlU3RyaXAgPyBcIn59fVwiIDogXCJ9fVwiXSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRDbG9zZUJsb2NrKHBhdGgsIHByaW50LCB7XG4gICAgb3BlbjogaXNPcGVuU3RyaXAgPSBmYWxzZSxcbiAgICBjbG9zZTogaXNDbG9zZVN0cmlwID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIGNvbmNhdCQ3KFtpc09wZW5TdHJpcCA/IFwie3t+L1wiIDogXCJ7ey9cIiwgcGF0aC5jYWxsKHByaW50LCBcInBhdGhcIiksIGlzQ2xvc2VTdHJpcCA/IFwifn19XCIgOiBcIn19XCJdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvdW50TmV3TGluZXMoc3RyaW5nKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBzdHJpbmcgPSB0eXBlb2Ygc3RyaW5nID09PSBcInN0cmluZ1wiID8gc3RyaW5nIDogXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KFwiXFxuXCIpLmxlbmd0aCAtIDE7XG4gIH1cblxuICBmdW5jdGlvbiBjb3VudExlYWRpbmdOZXdMaW5lcyhzdHJpbmcpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHN0cmluZyA9IHR5cGVvZiBzdHJpbmcgPT09IFwic3RyaW5nXCIgPyBzdHJpbmcgOiBcIlwiO1xuICAgIGNvbnN0IG5ld0xpbmVzID0gKHN0cmluZy5tYXRjaCgvXihbXlxcU1xcclxcbl0qW1xcclxcbl0pKy9nKSB8fCBbXSlbMF0gfHwgXCJcIjtcbiAgICByZXR1cm4gY291bnROZXdMaW5lcyhuZXdMaW5lcyk7XG4gIH1cblxuICBmdW5jdGlvbiBjb3VudFRyYWlsaW5nTmV3TGluZXMoc3RyaW5nKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBzdHJpbmcgPSB0eXBlb2Ygc3RyaW5nID09PSBcInN0cmluZ1wiID8gc3RyaW5nIDogXCJcIjtcbiAgICBjb25zdCBuZXdMaW5lcyA9IChzdHJpbmcubWF0Y2goLyhbXFxyXFxuXVteXFxTXFxyXFxuXSopKyQvZykgfHwgW10pWzBdIHx8IFwiXCI7XG4gICAgcmV0dXJuIGNvdW50TmV3TGluZXMobmV3TGluZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVIYXJkbGluZXMobnVtYmVyID0gMCwgbWF4ID0gMCkge1xuICAgIHJldHVybiBuZXcgQXJyYXkoTWF0aC5taW4obnVtYmVyLCBtYXgpKS5maWxsKGhhcmRsaW5lJDYpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9nbGltbWVyanMvZ2xpbW1lci12bS9ibG9iL21hc3Rlci9wYWNrYWdlcy8lNDBnbGltbWVyL2NvbXBpbGVyL2xpYi9sb2NhdGlvbi50cyNMNS1MMjlcbiAgKi9cblxuXG4gIGZ1bmN0aW9uIGxvY2F0aW9uVG9PZmZzZXQoc291cmNlLCBsaW5lLCBjb2x1bW4pIHtcbiAgICBsZXQgc2VlbkxpbmVzID0gMDtcbiAgICBsZXQgc2VlbkNoYXJzID0gMDsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChzZWVuQ2hhcnMgPT09IHNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXh0TGluZSA9IHNvdXJjZS5pbmRleE9mKFwiXFxuXCIsIHNlZW5DaGFycyk7XG5cbiAgICAgIGlmIChuZXh0TGluZSA9PT0gLTEpIHtcbiAgICAgICAgbmV4dExpbmUgPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VlbkxpbmVzID09PSBsaW5lKSB7XG4gICAgICAgIGlmIChzZWVuQ2hhcnMgKyBjb2x1bW4gPiBuZXh0TGluZSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlZW5DaGFycyArIGNvbHVtbjtcbiAgICAgIH0gZWxzZSBpZiAobmV4dExpbmUgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBzZWVuTGluZXMgKz0gMTtcbiAgICAgIHNlZW5DaGFycyA9IG5leHRMaW5lICsgMTtcbiAgICB9XG4gIH1cblxuICB2YXIgcHJpbnRlckdsaW1tZXIgPSB7XG4gICAgcHJpbnQsXG4gICAgbWFzc2FnZUFzdE5vZGU6IGNsZWFuJDJcbiAgfTtcblxuICB2YXIgbmFtZSQ2ID0gXCJIYW5kbGViYXJzXCI7XG4gIHZhciB0eXBlJDUgPSBcIm1hcmt1cFwiO1xuICB2YXIgZ3JvdXAkNyA9IFwiSFRNTFwiO1xuICB2YXIgYWxpYXNlcyA9IFtcbiAgXHRcImhic1wiLFxuICBcdFwiaHRtbGJhcnNcIlxuICBdO1xuICB2YXIgZXh0ZW5zaW9ucyQ1ID0gW1xuICBcdFwiLmhhbmRsZWJhcnNcIixcbiAgXHRcIi5oYnNcIlxuICBdO1xuICB2YXIgdG1TY29wZSQ1ID0gXCJ0ZXh0Lmh0bWwuaGFuZGxlYmFyc1wiO1xuICB2YXIgYWNlTW9kZSQ1ID0gXCJoYW5kbGViYXJzXCI7XG4gIHZhciBsYW5ndWFnZUlkJDUgPSAxNTU7XG4gIHZhciBIYW5kbGViYXJzID0ge1xuICBcdG5hbWU6IG5hbWUkNixcbiAgXHR0eXBlOiB0eXBlJDUsXG4gIFx0Z3JvdXA6IGdyb3VwJDcsXG4gIFx0YWxpYXNlczogYWxpYXNlcyxcbiAgXHRleHRlbnNpb25zOiBleHRlbnNpb25zJDUsXG4gIFx0dG1TY29wZTogdG1TY29wZSQ1LFxuICBcdGFjZU1vZGU6IGFjZU1vZGUkNSxcbiAgXHRsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJDVcbiAgfTtcblxuICB2YXIgSGFuZGxlYmFycyQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBuYW1lOiBuYW1lJDYsXG4gICAgdHlwZTogdHlwZSQ1LFxuICAgIGdyb3VwOiBncm91cCQ3LFxuICAgIGFsaWFzZXM6IGFsaWFzZXMsXG4gICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyQ1LFxuICAgIHRtU2NvcGU6IHRtU2NvcGUkNSxcbiAgICBhY2VNb2RlOiBhY2VNb2RlJDUsXG4gICAgbGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZCQ1LFxuICAgICdkZWZhdWx0JzogSGFuZGxlYmFyc1xuICB9KTtcblxuICB2YXIgcmVxdWlyZSQkMCQ0ID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShIYW5kbGViYXJzJDEpO1xuXG4gIGNvbnN0IGxhbmd1YWdlcyQyID0gW2NyZWF0ZUxhbmd1YWdlKHJlcXVpcmUkJDAkNCwgKCkgPT4gKHtcbiAgICBzaW5jZTogbnVsbCxcbiAgICAvLyB1bnJlbGVhc2VkXG4gICAgcGFyc2VyczogW1wiZ2xpbW1lclwiXSxcbiAgICB2c2NvZGVMYW5ndWFnZUlkczogW1wiaGFuZGxlYmFyc1wiXVxuICB9KSldO1xuICBjb25zdCBwcmludGVycyQyID0ge1xuICAgIGdsaW1tZXI6IHByaW50ZXJHbGltbWVyXG4gIH07XG4gIHZhciBsYW5ndWFnZUhhbmRsZWJhcnMgPSB7XG4gICAgbGFuZ3VhZ2VzOiBsYW5ndWFnZXMkMixcbiAgICBwcmludGVyczogcHJpbnRlcnMkMlxuICB9O1xuXG4gIHZhciBjbGVhbiQzID0gZnVuY3Rpb24gY2xlYW4oYXN0LCBuZXdOb2RlKSB7XG4gICAgZGVsZXRlIG5ld05vZGUuc291cmNlU3BhbjtcbiAgICBkZWxldGUgbmV3Tm9kZS5zdGFydFNvdXJjZVNwYW47XG4gICAgZGVsZXRlIG5ld05vZGUuZW5kU291cmNlU3BhbjtcbiAgICBkZWxldGUgbmV3Tm9kZS5uYW1lU3BhbjtcbiAgICBkZWxldGUgbmV3Tm9kZS52YWx1ZVNwYW47XG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwidGV4dFwiIHx8IGFzdC50eXBlID09PSBcImNvbW1lbnRcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBtYXkgYmUgZm9ybWF0dGVkIGJ5IG11bHRpcGFyc2VyXG5cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJ5YW1sXCIgfHwgYXN0LnR5cGUgPT09IFwidG9tbFwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwiYXR0cmlidXRlXCIpIHtcbiAgICAgIGRlbGV0ZSBuZXdOb2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJkb2NUeXBlXCIpIHtcbiAgICAgIGRlbGV0ZSBuZXdOb2RlLnZhbHVlO1xuICAgIH1cbiAgfTtcblxuICB2YXIganNvbiA9IHtcbiAgICBcIkNTU19ESVNQTEFZX1RBR1NcIjoge1xuICAgICAgXCJhcmVhXCI6IFwibm9uZVwiLFxuICAgICAgXCJiYXNlXCI6IFwibm9uZVwiLFxuICAgICAgXCJiYXNlZm9udFwiOiBcIm5vbmVcIixcbiAgICAgIFwiZGF0YWxpc3RcIjogXCJub25lXCIsXG4gICAgICBcImhlYWRcIjogXCJub25lXCIsXG4gICAgICBcImxpbmtcIjogXCJub25lXCIsXG4gICAgICBcIm1ldGFcIjogXCJub25lXCIsXG4gICAgICBcIm5vZW1iZWRcIjogXCJub25lXCIsXG4gICAgICBcIm5vZnJhbWVzXCI6IFwibm9uZVwiLFxuICAgICAgXCJwYXJhbVwiOiBcIm5vbmVcIixcbiAgICAgIFwicnBcIjogXCJub25lXCIsXG4gICAgICBcInNjcmlwdFwiOiBcImJsb2NrXCIsXG4gICAgICBcInNvdXJjZVwiOiBcImJsb2NrXCIsXG4gICAgICBcInN0eWxlXCI6IFwibm9uZVwiLFxuICAgICAgXCJ0ZW1wbGF0ZVwiOiBcImlubGluZVwiLFxuICAgICAgXCJ0cmFja1wiOiBcImJsb2NrXCIsXG4gICAgICBcInRpdGxlXCI6IFwibm9uZVwiLFxuICAgICAgXCJodG1sXCI6IFwiYmxvY2tcIixcbiAgICAgIFwiYm9keVwiOiBcImJsb2NrXCIsXG4gICAgICBcImFkZHJlc3NcIjogXCJibG9ja1wiLFxuICAgICAgXCJibG9ja3F1b3RlXCI6IFwiYmxvY2tcIixcbiAgICAgIFwiY2VudGVyXCI6IFwiYmxvY2tcIixcbiAgICAgIFwiZGl2XCI6IFwiYmxvY2tcIixcbiAgICAgIFwiZmlndXJlXCI6IFwiYmxvY2tcIixcbiAgICAgIFwiZmlnY2FwdGlvblwiOiBcImJsb2NrXCIsXG4gICAgICBcImZvb3RlclwiOiBcImJsb2NrXCIsXG4gICAgICBcImZvcm1cIjogXCJibG9ja1wiLFxuICAgICAgXCJoZWFkZXJcIjogXCJibG9ja1wiLFxuICAgICAgXCJoclwiOiBcImJsb2NrXCIsXG4gICAgICBcImxlZ2VuZFwiOiBcImJsb2NrXCIsXG4gICAgICBcImxpc3RpbmdcIjogXCJibG9ja1wiLFxuICAgICAgXCJtYWluXCI6IFwiYmxvY2tcIixcbiAgICAgIFwicFwiOiBcImJsb2NrXCIsXG4gICAgICBcInBsYWludGV4dFwiOiBcImJsb2NrXCIsXG4gICAgICBcInByZVwiOiBcImJsb2NrXCIsXG4gICAgICBcInhtcFwiOiBcImJsb2NrXCIsXG4gICAgICBcInNsb3RcIjogXCJjb250ZW50c1wiLFxuICAgICAgXCJydWJ5XCI6IFwicnVieVwiLFxuICAgICAgXCJydFwiOiBcInJ1YnktdGV4dFwiLFxuICAgICAgXCJhcnRpY2xlXCI6IFwiYmxvY2tcIixcbiAgICAgIFwiYXNpZGVcIjogXCJibG9ja1wiLFxuICAgICAgXCJoMVwiOiBcImJsb2NrXCIsXG4gICAgICBcImgyXCI6IFwiYmxvY2tcIixcbiAgICAgIFwiaDNcIjogXCJibG9ja1wiLFxuICAgICAgXCJoNFwiOiBcImJsb2NrXCIsXG4gICAgICBcImg1XCI6IFwiYmxvY2tcIixcbiAgICAgIFwiaDZcIjogXCJibG9ja1wiLFxuICAgICAgXCJoZ3JvdXBcIjogXCJibG9ja1wiLFxuICAgICAgXCJuYXZcIjogXCJibG9ja1wiLFxuICAgICAgXCJzZWN0aW9uXCI6IFwiYmxvY2tcIixcbiAgICAgIFwiZGlyXCI6IFwiYmxvY2tcIixcbiAgICAgIFwiZGRcIjogXCJibG9ja1wiLFxuICAgICAgXCJkbFwiOiBcImJsb2NrXCIsXG4gICAgICBcImR0XCI6IFwiYmxvY2tcIixcbiAgICAgIFwib2xcIjogXCJibG9ja1wiLFxuICAgICAgXCJ1bFwiOiBcImJsb2NrXCIsXG4gICAgICBcImxpXCI6IFwibGlzdC1pdGVtXCIsXG4gICAgICBcInRhYmxlXCI6IFwidGFibGVcIixcbiAgICAgIFwiY2FwdGlvblwiOiBcInRhYmxlLWNhcHRpb25cIixcbiAgICAgIFwiY29sZ3JvdXBcIjogXCJ0YWJsZS1jb2x1bW4tZ3JvdXBcIixcbiAgICAgIFwiY29sXCI6IFwidGFibGUtY29sdW1uXCIsXG4gICAgICBcInRoZWFkXCI6IFwidGFibGUtaGVhZGVyLWdyb3VwXCIsXG4gICAgICBcInRib2R5XCI6IFwidGFibGUtcm93LWdyb3VwXCIsXG4gICAgICBcInRmb290XCI6IFwidGFibGUtZm9vdGVyLWdyb3VwXCIsXG4gICAgICBcInRyXCI6IFwidGFibGUtcm93XCIsXG4gICAgICBcInRkXCI6IFwidGFibGUtY2VsbFwiLFxuICAgICAgXCJ0aFwiOiBcInRhYmxlLWNlbGxcIixcbiAgICAgIFwiZmllbGRzZXRcIjogXCJibG9ja1wiLFxuICAgICAgXCJidXR0b25cIjogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgIFwidmlkZW9cIjogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgIFwiYXVkaW9cIjogXCJpbmxpbmUtYmxvY2tcIlxuICAgIH0sXG4gICAgXCJDU1NfRElTUExBWV9ERUZBVUxUXCI6IFwiaW5saW5lXCIsXG4gICAgXCJDU1NfV0hJVEVfU1BBQ0VfVEFHU1wiOiB7XG4gICAgICBcImxpc3RpbmdcIjogXCJwcmVcIixcbiAgICAgIFwicGxhaW50ZXh0XCI6IFwicHJlXCIsXG4gICAgICBcInByZVwiOiBcInByZVwiLFxuICAgICAgXCJ4bXBcIjogXCJwcmVcIixcbiAgICAgIFwibm9iclwiOiBcIm5vd3JhcFwiLFxuICAgICAgXCJ0YWJsZVwiOiBcImluaXRpYWxcIixcbiAgICAgIFwidGV4dGFyZWFcIjogXCJwcmUtd3JhcFwiXG4gICAgfSxcbiAgICBcIkNTU19XSElURV9TUEFDRV9ERUZBVUxUXCI6IFwibm9ybWFsXCJcbiAgfTtcblxuICB2YXIgaW5kZXggPSBbXG4gIFx0XCJhXCIsXG4gIFx0XCJhYmJyXCIsXG4gIFx0XCJhY3JvbnltXCIsXG4gIFx0XCJhZGRyZXNzXCIsXG4gIFx0XCJhcHBsZXRcIixcbiAgXHRcImFyZWFcIixcbiAgXHRcImFydGljbGVcIixcbiAgXHRcImFzaWRlXCIsXG4gIFx0XCJhdWRpb1wiLFxuICBcdFwiYlwiLFxuICBcdFwiYmFzZVwiLFxuICBcdFwiYmFzZWZvbnRcIixcbiAgXHRcImJkaVwiLFxuICBcdFwiYmRvXCIsXG4gIFx0XCJiZ3NvdW5kXCIsXG4gIFx0XCJiaWdcIixcbiAgXHRcImJsaW5rXCIsXG4gIFx0XCJibG9ja3F1b3RlXCIsXG4gIFx0XCJib2R5XCIsXG4gIFx0XCJiclwiLFxuICBcdFwiYnV0dG9uXCIsXG4gIFx0XCJjYW52YXNcIixcbiAgXHRcImNhcHRpb25cIixcbiAgXHRcImNlbnRlclwiLFxuICBcdFwiY2l0ZVwiLFxuICBcdFwiY29kZVwiLFxuICBcdFwiY29sXCIsXG4gIFx0XCJjb2xncm91cFwiLFxuICBcdFwiY29tbWFuZFwiLFxuICBcdFwiY29udGVudFwiLFxuICBcdFwiZGF0YVwiLFxuICBcdFwiZGF0YWxpc3RcIixcbiAgXHRcImRkXCIsXG4gIFx0XCJkZWxcIixcbiAgXHRcImRldGFpbHNcIixcbiAgXHRcImRmblwiLFxuICBcdFwiZGlhbG9nXCIsXG4gIFx0XCJkaXJcIixcbiAgXHRcImRpdlwiLFxuICBcdFwiZGxcIixcbiAgXHRcImR0XCIsXG4gIFx0XCJlbGVtZW50XCIsXG4gIFx0XCJlbVwiLFxuICBcdFwiZW1iZWRcIixcbiAgXHRcImZpZWxkc2V0XCIsXG4gIFx0XCJmaWdjYXB0aW9uXCIsXG4gIFx0XCJmaWd1cmVcIixcbiAgXHRcImZvbnRcIixcbiAgXHRcImZvb3RlclwiLFxuICBcdFwiZm9ybVwiLFxuICBcdFwiZnJhbWVcIixcbiAgXHRcImZyYW1lc2V0XCIsXG4gIFx0XCJoMVwiLFxuICBcdFwiaDJcIixcbiAgXHRcImgzXCIsXG4gIFx0XCJoNFwiLFxuICBcdFwiaDVcIixcbiAgXHRcImg2XCIsXG4gIFx0XCJoZWFkXCIsXG4gIFx0XCJoZWFkZXJcIixcbiAgXHRcImhncm91cFwiLFxuICBcdFwiaHJcIixcbiAgXHRcImh0bWxcIixcbiAgXHRcImlcIixcbiAgXHRcImlmcmFtZVwiLFxuICBcdFwiaW1hZ2VcIixcbiAgXHRcImltZ1wiLFxuICBcdFwiaW5wdXRcIixcbiAgXHRcImluc1wiLFxuICBcdFwiaXNpbmRleFwiLFxuICBcdFwia2JkXCIsXG4gIFx0XCJrZXlnZW5cIixcbiAgXHRcImxhYmVsXCIsXG4gIFx0XCJsZWdlbmRcIixcbiAgXHRcImxpXCIsXG4gIFx0XCJsaW5rXCIsXG4gIFx0XCJsaXN0aW5nXCIsXG4gIFx0XCJtYWluXCIsXG4gIFx0XCJtYXBcIixcbiAgXHRcIm1hcmtcIixcbiAgXHRcIm1hcnF1ZWVcIixcbiAgXHRcIm1hdGhcIixcbiAgXHRcIm1lbnVcIixcbiAgXHRcIm1lbnVpdGVtXCIsXG4gIFx0XCJtZXRhXCIsXG4gIFx0XCJtZXRlclwiLFxuICBcdFwibXVsdGljb2xcIixcbiAgXHRcIm5hdlwiLFxuICBcdFwibmV4dGlkXCIsXG4gIFx0XCJub2JyXCIsXG4gIFx0XCJub2VtYmVkXCIsXG4gIFx0XCJub2ZyYW1lc1wiLFxuICBcdFwibm9zY3JpcHRcIixcbiAgXHRcIm9iamVjdFwiLFxuICBcdFwib2xcIixcbiAgXHRcIm9wdGdyb3VwXCIsXG4gIFx0XCJvcHRpb25cIixcbiAgXHRcIm91dHB1dFwiLFxuICBcdFwicFwiLFxuICBcdFwicGFyYW1cIixcbiAgXHRcInBpY3R1cmVcIixcbiAgXHRcInBsYWludGV4dFwiLFxuICBcdFwicHJlXCIsXG4gIFx0XCJwcm9ncmVzc1wiLFxuICBcdFwicVwiLFxuICBcdFwicmJcIixcbiAgXHRcInJiY1wiLFxuICBcdFwicnBcIixcbiAgXHRcInJ0XCIsXG4gIFx0XCJydGNcIixcbiAgXHRcInJ1YnlcIixcbiAgXHRcInNcIixcbiAgXHRcInNhbXBcIixcbiAgXHRcInNjcmlwdFwiLFxuICBcdFwic2VjdGlvblwiLFxuICBcdFwic2VsZWN0XCIsXG4gIFx0XCJzaGFkb3dcIixcbiAgXHRcInNsb3RcIixcbiAgXHRcInNtYWxsXCIsXG4gIFx0XCJzb3VyY2VcIixcbiAgXHRcInNwYWNlclwiLFxuICBcdFwic3BhblwiLFxuICBcdFwic3RyaWtlXCIsXG4gIFx0XCJzdHJvbmdcIixcbiAgXHRcInN0eWxlXCIsXG4gIFx0XCJzdWJcIixcbiAgXHRcInN1bW1hcnlcIixcbiAgXHRcInN1cFwiLFxuICBcdFwic3ZnXCIsXG4gIFx0XCJ0YWJsZVwiLFxuICBcdFwidGJvZHlcIixcbiAgXHRcInRkXCIsXG4gIFx0XCJ0ZW1wbGF0ZVwiLFxuICBcdFwidGV4dGFyZWFcIixcbiAgXHRcInRmb290XCIsXG4gIFx0XCJ0aFwiLFxuICBcdFwidGhlYWRcIixcbiAgXHRcInRpbWVcIixcbiAgXHRcInRpdGxlXCIsXG4gIFx0XCJ0clwiLFxuICBcdFwidHJhY2tcIixcbiAgXHRcInR0XCIsXG4gIFx0XCJ1XCIsXG4gIFx0XCJ1bFwiLFxuICBcdFwidmFyXCIsXG4gIFx0XCJ2aWRlb1wiLFxuICBcdFwid2JyXCIsXG4gIFx0XCJ4bXBcIlxuICBdO1xuXG4gIHZhciBodG1sVGFnTmFtZXMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgICdkZWZhdWx0JzogaW5kZXhcbiAgfSk7XG5cbiAgdmFyIGEgPSBbXG4gIFx0XCJhY2Nlc3NrZXlcIixcbiAgXHRcImNoYXJzZXRcIixcbiAgXHRcImNvb3Jkc1wiLFxuICBcdFwiZG93bmxvYWRcIixcbiAgXHRcImhyZWZcIixcbiAgXHRcImhyZWZsYW5nXCIsXG4gIFx0XCJuYW1lXCIsXG4gIFx0XCJwaW5nXCIsXG4gIFx0XCJyZWZlcnJlcnBvbGljeVwiLFxuICBcdFwicmVsXCIsXG4gIFx0XCJyZXZcIixcbiAgXHRcInNoYXBlXCIsXG4gIFx0XCJ0YWJpbmRleFwiLFxuICBcdFwidGFyZ2V0XCIsXG4gIFx0XCJ0eXBlXCJcbiAgXTtcbiAgdmFyIGFiYnIgPSBbXG4gIFx0XCJ0aXRsZVwiXG4gIF07XG4gIHZhciBhcHBsZXQgPSBbXG4gIFx0XCJhbGlnblwiLFxuICBcdFwiYWx0XCIsXG4gIFx0XCJhcmNoaXZlXCIsXG4gIFx0XCJjb2RlXCIsXG4gIFx0XCJjb2RlYmFzZVwiLFxuICBcdFwiaGVpZ2h0XCIsXG4gIFx0XCJoc3BhY2VcIixcbiAgXHRcIm5hbWVcIixcbiAgXHRcIm9iamVjdFwiLFxuICBcdFwidnNwYWNlXCIsXG4gIFx0XCJ3aWR0aFwiXG4gIF07XG4gIHZhciBhcmVhID0gW1xuICBcdFwiYWNjZXNza2V5XCIsXG4gIFx0XCJhbHRcIixcbiAgXHRcImNvb3Jkc1wiLFxuICBcdFwiZG93bmxvYWRcIixcbiAgXHRcImhyZWZcIixcbiAgXHRcImhyZWZsYW5nXCIsXG4gIFx0XCJub2hyZWZcIixcbiAgXHRcInBpbmdcIixcbiAgXHRcInJlZmVycmVycG9saWN5XCIsXG4gIFx0XCJyZWxcIixcbiAgXHRcInNoYXBlXCIsXG4gIFx0XCJ0YWJpbmRleFwiLFxuICBcdFwidGFyZ2V0XCIsXG4gIFx0XCJ0eXBlXCJcbiAgXTtcbiAgdmFyIGF1ZGlvID0gW1xuICBcdFwiYXV0b3BsYXlcIixcbiAgXHRcImNvbnRyb2xzXCIsXG4gIFx0XCJjcm9zc29yaWdpblwiLFxuICBcdFwibG9vcFwiLFxuICBcdFwibXV0ZWRcIixcbiAgXHRcInByZWxvYWRcIixcbiAgXHRcInNyY1wiXG4gIF07XG4gIHZhciBiYXNlID0gW1xuICBcdFwiaHJlZlwiLFxuICBcdFwidGFyZ2V0XCJcbiAgXTtcbiAgdmFyIGJhc2Vmb250ID0gW1xuICBcdFwiY29sb3JcIixcbiAgXHRcImZhY2VcIixcbiAgXHRcInNpemVcIlxuICBdO1xuICB2YXIgYmRvID0gW1xuICBcdFwiZGlyXCJcbiAgXTtcbiAgdmFyIGJsb2NrcXVvdGUgPSBbXG4gIFx0XCJjaXRlXCJcbiAgXTtcbiAgdmFyIGJvZHkgPSBbXG4gIFx0XCJhbGlua1wiLFxuICBcdFwiYmFja2dyb3VuZFwiLFxuICBcdFwiYmdjb2xvclwiLFxuICBcdFwibGlua1wiLFxuICBcdFwidGV4dFwiLFxuICBcdFwidmxpbmtcIlxuICBdO1xuICB2YXIgYnIgPSBbXG4gIFx0XCJjbGVhclwiXG4gIF07XG4gIHZhciBidXR0b24gPSBbXG4gIFx0XCJhY2Nlc3NrZXlcIixcbiAgXHRcImF1dG9mb2N1c1wiLFxuICBcdFwiZGlzYWJsZWRcIixcbiAgXHRcImZvcm1cIixcbiAgXHRcImZvcm1hY3Rpb25cIixcbiAgXHRcImZvcm1lbmN0eXBlXCIsXG4gIFx0XCJmb3JtbWV0aG9kXCIsXG4gIFx0XCJmb3Jtbm92YWxpZGF0ZVwiLFxuICBcdFwiZm9ybXRhcmdldFwiLFxuICBcdFwibmFtZVwiLFxuICBcdFwidGFiaW5kZXhcIixcbiAgXHRcInR5cGVcIixcbiAgXHRcInZhbHVlXCJcbiAgXTtcbiAgdmFyIGNhbnZhcyA9IFtcbiAgXHRcImhlaWdodFwiLFxuICBcdFwid2lkdGhcIlxuICBdO1xuICB2YXIgY2FwdGlvbiA9IFtcbiAgXHRcImFsaWduXCJcbiAgXTtcbiAgdmFyIGNvbCA9IFtcbiAgXHRcImFsaWduXCIsXG4gIFx0XCJjaGFyXCIsXG4gIFx0XCJjaGFyb2ZmXCIsXG4gIFx0XCJzcGFuXCIsXG4gIFx0XCJ2YWxpZ25cIixcbiAgXHRcIndpZHRoXCJcbiAgXTtcbiAgdmFyIGNvbGdyb3VwID0gW1xuICBcdFwiYWxpZ25cIixcbiAgXHRcImNoYXJcIixcbiAgXHRcImNoYXJvZmZcIixcbiAgXHRcInNwYW5cIixcbiAgXHRcInZhbGlnblwiLFxuICBcdFwid2lkdGhcIlxuICBdO1xuICB2YXIgZGF0YSA9IFtcbiAgXHRcInZhbHVlXCJcbiAgXTtcbiAgdmFyIGRlbCA9IFtcbiAgXHRcImNpdGVcIixcbiAgXHRcImRhdGV0aW1lXCJcbiAgXTtcbiAgdmFyIGRldGFpbHMgPSBbXG4gIFx0XCJvcGVuXCJcbiAgXTtcbiAgdmFyIGRmbiA9IFtcbiAgXHRcInRpdGxlXCJcbiAgXTtcbiAgdmFyIGRpYWxvZyA9IFtcbiAgXHRcIm9wZW5cIlxuICBdO1xuICB2YXIgZGlyID0gW1xuICBcdFwiY29tcGFjdFwiXG4gIF07XG4gIHZhciBkaXYgPSBbXG4gIFx0XCJhbGlnblwiXG4gIF07XG4gIHZhciBkbCA9IFtcbiAgXHRcImNvbXBhY3RcIlxuICBdO1xuICB2YXIgZW1iZWQkMSA9IFtcbiAgXHRcImhlaWdodFwiLFxuICBcdFwic3JjXCIsXG4gIFx0XCJ0eXBlXCIsXG4gIFx0XCJ3aWR0aFwiXG4gIF07XG4gIHZhciBmaWVsZHNldCA9IFtcbiAgXHRcImRpc2FibGVkXCIsXG4gIFx0XCJmb3JtXCIsXG4gIFx0XCJuYW1lXCJcbiAgXTtcbiAgdmFyIGZvbnQgPSBbXG4gIFx0XCJjb2xvclwiLFxuICBcdFwiZmFjZVwiLFxuICBcdFwic2l6ZVwiXG4gIF07XG4gIHZhciBmb3JtID0gW1xuICBcdFwiYWNjZXB0XCIsXG4gIFx0XCJhY2NlcHQtY2hhcnNldFwiLFxuICBcdFwiYWN0aW9uXCIsXG4gIFx0XCJhdXRvY29tcGxldGVcIixcbiAgXHRcImVuY3R5cGVcIixcbiAgXHRcIm1ldGhvZFwiLFxuICBcdFwibmFtZVwiLFxuICBcdFwibm92YWxpZGF0ZVwiLFxuICBcdFwidGFyZ2V0XCJcbiAgXTtcbiAgdmFyIGZyYW1lID0gW1xuICBcdFwiZnJhbWVib3JkZXJcIixcbiAgXHRcImxvbmdkZXNjXCIsXG4gIFx0XCJtYXJnaW5oZWlnaHRcIixcbiAgXHRcIm1hcmdpbndpZHRoXCIsXG4gIFx0XCJuYW1lXCIsXG4gIFx0XCJub3Jlc2l6ZVwiLFxuICBcdFwic2Nyb2xsaW5nXCIsXG4gIFx0XCJzcmNcIlxuICBdO1xuICB2YXIgZnJhbWVzZXQgPSBbXG4gIFx0XCJjb2xzXCIsXG4gIFx0XCJyb3dzXCJcbiAgXTtcbiAgdmFyIGgxID0gW1xuICBcdFwiYWxpZ25cIlxuICBdO1xuICB2YXIgaDIgPSBbXG4gIFx0XCJhbGlnblwiXG4gIF07XG4gIHZhciBoMyA9IFtcbiAgXHRcImFsaWduXCJcbiAgXTtcbiAgdmFyIGg0ID0gW1xuICBcdFwiYWxpZ25cIlxuICBdO1xuICB2YXIgaDUgPSBbXG4gIFx0XCJhbGlnblwiXG4gIF07XG4gIHZhciBoNiA9IFtcbiAgXHRcImFsaWduXCJcbiAgXTtcbiAgdmFyIGhlYWQgPSBbXG4gIFx0XCJwcm9maWxlXCJcbiAgXTtcbiAgdmFyIGhyID0gW1xuICBcdFwiYWxpZ25cIixcbiAgXHRcIm5vc2hhZGVcIixcbiAgXHRcInNpemVcIixcbiAgXHRcIndpZHRoXCJcbiAgXTtcbiAgdmFyIGh0bWwgPSBbXG4gIFx0XCJtYW5pZmVzdFwiLFxuICBcdFwidmVyc2lvblwiXG4gIF07XG4gIHZhciBpZnJhbWUgPSBbXG4gIFx0XCJhbGlnblwiLFxuICBcdFwiYWxsb3dcIixcbiAgXHRcImFsbG93ZnVsbHNjcmVlblwiLFxuICBcdFwiYWxsb3dwYXltZW50cmVxdWVzdFwiLFxuICBcdFwiYWxsb3d1c2VybWVkaWFcIixcbiAgXHRcImZyYW1lYm9yZGVyXCIsXG4gIFx0XCJoZWlnaHRcIixcbiAgXHRcImxvbmdkZXNjXCIsXG4gIFx0XCJtYXJnaW5oZWlnaHRcIixcbiAgXHRcIm1hcmdpbndpZHRoXCIsXG4gIFx0XCJuYW1lXCIsXG4gIFx0XCJyZWZlcnJlcnBvbGljeVwiLFxuICBcdFwic2FuZGJveFwiLFxuICBcdFwic2Nyb2xsaW5nXCIsXG4gIFx0XCJzcmNcIixcbiAgXHRcInNyY2RvY1wiLFxuICBcdFwid2lkdGhcIlxuICBdO1xuICB2YXIgaW1nID0gW1xuICBcdFwiYWxpZ25cIixcbiAgXHRcImFsdFwiLFxuICBcdFwiYm9yZGVyXCIsXG4gIFx0XCJjcm9zc29yaWdpblwiLFxuICBcdFwiZGVjb2RpbmdcIixcbiAgXHRcImhlaWdodFwiLFxuICBcdFwiaHNwYWNlXCIsXG4gIFx0XCJpc21hcFwiLFxuICBcdFwibG9uZ2Rlc2NcIixcbiAgXHRcIm5hbWVcIixcbiAgXHRcInJlZmVycmVycG9saWN5XCIsXG4gIFx0XCJzaXplc1wiLFxuICBcdFwic3JjXCIsXG4gIFx0XCJzcmNzZXRcIixcbiAgXHRcInVzZW1hcFwiLFxuICBcdFwidnNwYWNlXCIsXG4gIFx0XCJ3aWR0aFwiXG4gIF07XG4gIHZhciBpbnB1dCA9IFtcbiAgXHRcImFjY2VwdFwiLFxuICBcdFwiYWNjZXNza2V5XCIsXG4gIFx0XCJhbGlnblwiLFxuICBcdFwiYWx0XCIsXG4gIFx0XCJhdXRvY29tcGxldGVcIixcbiAgXHRcImF1dG9mb2N1c1wiLFxuICBcdFwiY2hlY2tlZFwiLFxuICBcdFwiZGlybmFtZVwiLFxuICBcdFwiZGlzYWJsZWRcIixcbiAgXHRcImZvcm1cIixcbiAgXHRcImZvcm1hY3Rpb25cIixcbiAgXHRcImZvcm1lbmN0eXBlXCIsXG4gIFx0XCJmb3JtbWV0aG9kXCIsXG4gIFx0XCJmb3Jtbm92YWxpZGF0ZVwiLFxuICBcdFwiZm9ybXRhcmdldFwiLFxuICBcdFwiaGVpZ2h0XCIsXG4gIFx0XCJpc21hcFwiLFxuICBcdFwibGlzdFwiLFxuICBcdFwibWF4XCIsXG4gIFx0XCJtYXhsZW5ndGhcIixcbiAgXHRcIm1pblwiLFxuICBcdFwibWlubGVuZ3RoXCIsXG4gIFx0XCJtdWx0aXBsZVwiLFxuICBcdFwibmFtZVwiLFxuICBcdFwicGF0dGVyblwiLFxuICBcdFwicGxhY2Vob2xkZXJcIixcbiAgXHRcInJlYWRvbmx5XCIsXG4gIFx0XCJyZXF1aXJlZFwiLFxuICBcdFwic2l6ZVwiLFxuICBcdFwic3JjXCIsXG4gIFx0XCJzdGVwXCIsXG4gIFx0XCJ0YWJpbmRleFwiLFxuICBcdFwidGl0bGVcIixcbiAgXHRcInR5cGVcIixcbiAgXHRcInVzZW1hcFwiLFxuICBcdFwidmFsdWVcIixcbiAgXHRcIndpZHRoXCJcbiAgXTtcbiAgdmFyIGlucyA9IFtcbiAgXHRcImNpdGVcIixcbiAgXHRcImRhdGV0aW1lXCJcbiAgXTtcbiAgdmFyIGlzaW5kZXggPSBbXG4gIFx0XCJwcm9tcHRcIlxuICBdO1xuICB2YXIgbGFiZWwgPSBbXG4gIFx0XCJhY2Nlc3NrZXlcIixcbiAgXHRcImZvclwiLFxuICBcdFwiZm9ybVwiXG4gIF07XG4gIHZhciBsZWdlbmQgPSBbXG4gIFx0XCJhY2Nlc3NrZXlcIixcbiAgXHRcImFsaWduXCJcbiAgXTtcbiAgdmFyIGxpID0gW1xuICBcdFwidHlwZVwiLFxuICBcdFwidmFsdWVcIlxuICBdO1xuICB2YXIgbGluayQzID0gW1xuICBcdFwiYXNcIixcbiAgXHRcImNoYXJzZXRcIixcbiAgXHRcImNvbG9yXCIsXG4gIFx0XCJjcm9zc29yaWdpblwiLFxuICBcdFwiaHJlZlwiLFxuICBcdFwiaHJlZmxhbmdcIixcbiAgXHRcImltYWdlc2l6ZXNcIixcbiAgXHRcImltYWdlc3Jjc2V0XCIsXG4gIFx0XCJpbnRlZ3JpdHlcIixcbiAgXHRcIm1lZGlhXCIsXG4gIFx0XCJub25jZVwiLFxuICBcdFwicmVmZXJyZXJwb2xpY3lcIixcbiAgXHRcInJlbFwiLFxuICBcdFwicmV2XCIsXG4gIFx0XCJzaXplc1wiLFxuICBcdFwidGFyZ2V0XCIsXG4gIFx0XCJ0aXRsZVwiLFxuICBcdFwidHlwZVwiXG4gIF07XG4gIHZhciBtYXAgPSBbXG4gIFx0XCJuYW1lXCJcbiAgXTtcbiAgdmFyIG1lbnUgPSBbXG4gIFx0XCJjb21wYWN0XCJcbiAgXTtcbiAgdmFyIG1ldGEgPSBbXG4gIFx0XCJjaGFyc2V0XCIsXG4gIFx0XCJjb250ZW50XCIsXG4gIFx0XCJodHRwLWVxdWl2XCIsXG4gIFx0XCJuYW1lXCIsXG4gIFx0XCJzY2hlbWVcIlxuICBdO1xuICB2YXIgbWV0ZXIgPSBbXG4gIFx0XCJoaWdoXCIsXG4gIFx0XCJsb3dcIixcbiAgXHRcIm1heFwiLFxuICBcdFwibWluXCIsXG4gIFx0XCJvcHRpbXVtXCIsXG4gIFx0XCJ2YWx1ZVwiXG4gIF07XG4gIHZhciBvYmplY3QgPSBbXG4gIFx0XCJhbGlnblwiLFxuICBcdFwiYXJjaGl2ZVwiLFxuICBcdFwiYm9yZGVyXCIsXG4gIFx0XCJjbGFzc2lkXCIsXG4gIFx0XCJjb2RlYmFzZVwiLFxuICBcdFwiY29kZXR5cGVcIixcbiAgXHRcImRhdGFcIixcbiAgXHRcImRlY2xhcmVcIixcbiAgXHRcImZvcm1cIixcbiAgXHRcImhlaWdodFwiLFxuICBcdFwiaHNwYWNlXCIsXG4gIFx0XCJuYW1lXCIsXG4gIFx0XCJzdGFuZGJ5XCIsXG4gIFx0XCJ0YWJpbmRleFwiLFxuICBcdFwidHlwZVwiLFxuICBcdFwidHlwZW11c3RtYXRjaFwiLFxuICBcdFwidXNlbWFwXCIsXG4gIFx0XCJ2c3BhY2VcIixcbiAgXHRcIndpZHRoXCJcbiAgXTtcbiAgdmFyIG9sID0gW1xuICBcdFwiY29tcGFjdFwiLFxuICBcdFwicmV2ZXJzZWRcIixcbiAgXHRcInN0YXJ0XCIsXG4gIFx0XCJ0eXBlXCJcbiAgXTtcbiAgdmFyIG9wdGdyb3VwID0gW1xuICBcdFwiZGlzYWJsZWRcIixcbiAgXHRcImxhYmVsXCJcbiAgXTtcbiAgdmFyIG9wdGlvbiA9IFtcbiAgXHRcImRpc2FibGVkXCIsXG4gIFx0XCJsYWJlbFwiLFxuICBcdFwic2VsZWN0ZWRcIixcbiAgXHRcInZhbHVlXCJcbiAgXTtcbiAgdmFyIG91dHB1dCA9IFtcbiAgXHRcImZvclwiLFxuICBcdFwiZm9ybVwiLFxuICBcdFwibmFtZVwiXG4gIF07XG4gIHZhciBwID0gW1xuICBcdFwiYWxpZ25cIlxuICBdO1xuICB2YXIgcGFyYW0gPSBbXG4gIFx0XCJuYW1lXCIsXG4gIFx0XCJ0eXBlXCIsXG4gIFx0XCJ2YWx1ZVwiLFxuICBcdFwidmFsdWV0eXBlXCJcbiAgXTtcbiAgdmFyIHByZSA9IFtcbiAgXHRcIndpZHRoXCJcbiAgXTtcbiAgdmFyIHByb2dyZXNzID0gW1xuICBcdFwibWF4XCIsXG4gIFx0XCJ2YWx1ZVwiXG4gIF07XG4gIHZhciBxID0gW1xuICBcdFwiY2l0ZVwiXG4gIF07XG4gIHZhciBzY3JpcHQgPSBbXG4gIFx0XCJhc3luY1wiLFxuICBcdFwiY2hhcnNldFwiLFxuICBcdFwiY3Jvc3NvcmlnaW5cIixcbiAgXHRcImRlZmVyXCIsXG4gIFx0XCJpbnRlZ3JpdHlcIixcbiAgXHRcImxhbmd1YWdlXCIsXG4gIFx0XCJub21vZHVsZVwiLFxuICBcdFwibm9uY2VcIixcbiAgXHRcInJlZmVycmVycG9saWN5XCIsXG4gIFx0XCJzcmNcIixcbiAgXHRcInR5cGVcIlxuICBdO1xuICB2YXIgc2VsZWN0ID0gW1xuICBcdFwiYXV0b2NvbXBsZXRlXCIsXG4gIFx0XCJhdXRvZm9jdXNcIixcbiAgXHRcImRpc2FibGVkXCIsXG4gIFx0XCJmb3JtXCIsXG4gIFx0XCJtdWx0aXBsZVwiLFxuICBcdFwibmFtZVwiLFxuICBcdFwicmVxdWlyZWRcIixcbiAgXHRcInNpemVcIixcbiAgXHRcInRhYmluZGV4XCJcbiAgXTtcbiAgdmFyIHNsb3QgPSBbXG4gIFx0XCJuYW1lXCJcbiAgXTtcbiAgdmFyIHNvdXJjZSQxID0gW1xuICBcdFwibWVkaWFcIixcbiAgXHRcInNpemVzXCIsXG4gIFx0XCJzcmNcIixcbiAgXHRcInNyY3NldFwiLFxuICBcdFwidHlwZVwiXG4gIF07XG4gIHZhciBzdHlsZSA9IFtcbiAgXHRcIm1lZGlhXCIsXG4gIFx0XCJub25jZVwiLFxuICBcdFwidGl0bGVcIixcbiAgXHRcInR5cGVcIlxuICBdO1xuICB2YXIgdGFibGUgPSBbXG4gIFx0XCJhbGlnblwiLFxuICBcdFwiYmdjb2xvclwiLFxuICBcdFwiYm9yZGVyXCIsXG4gIFx0XCJjZWxscGFkZGluZ1wiLFxuICBcdFwiY2VsbHNwYWNpbmdcIixcbiAgXHRcImZyYW1lXCIsXG4gIFx0XCJydWxlc1wiLFxuICBcdFwic3VtbWFyeVwiLFxuICBcdFwid2lkdGhcIlxuICBdO1xuICB2YXIgdGJvZHkgPSBbXG4gIFx0XCJhbGlnblwiLFxuICBcdFwiY2hhclwiLFxuICBcdFwiY2hhcm9mZlwiLFxuICBcdFwidmFsaWduXCJcbiAgXTtcbiAgdmFyIHRkID0gW1xuICBcdFwiYWJiclwiLFxuICBcdFwiYWxpZ25cIixcbiAgXHRcImF4aXNcIixcbiAgXHRcImJnY29sb3JcIixcbiAgXHRcImNoYXJcIixcbiAgXHRcImNoYXJvZmZcIixcbiAgXHRcImNvbHNwYW5cIixcbiAgXHRcImhlYWRlcnNcIixcbiAgXHRcImhlaWdodFwiLFxuICBcdFwibm93cmFwXCIsXG4gIFx0XCJyb3dzcGFuXCIsXG4gIFx0XCJzY29wZVwiLFxuICBcdFwidmFsaWduXCIsXG4gIFx0XCJ3aWR0aFwiXG4gIF07XG4gIHZhciB0ZXh0YXJlYSA9IFtcbiAgXHRcImFjY2Vzc2tleVwiLFxuICBcdFwiYXV0b2NvbXBsZXRlXCIsXG4gIFx0XCJhdXRvZm9jdXNcIixcbiAgXHRcImNvbHNcIixcbiAgXHRcImRpcm5hbWVcIixcbiAgXHRcImRpc2FibGVkXCIsXG4gIFx0XCJmb3JtXCIsXG4gIFx0XCJtYXhsZW5ndGhcIixcbiAgXHRcIm1pbmxlbmd0aFwiLFxuICBcdFwibmFtZVwiLFxuICBcdFwicGxhY2Vob2xkZXJcIixcbiAgXHRcInJlYWRvbmx5XCIsXG4gIFx0XCJyZXF1aXJlZFwiLFxuICBcdFwicm93c1wiLFxuICBcdFwidGFiaW5kZXhcIixcbiAgXHRcIndyYXBcIlxuICBdO1xuICB2YXIgdGZvb3QgPSBbXG4gIFx0XCJhbGlnblwiLFxuICBcdFwiY2hhclwiLFxuICBcdFwiY2hhcm9mZlwiLFxuICBcdFwidmFsaWduXCJcbiAgXTtcbiAgdmFyIHRoID0gW1xuICBcdFwiYWJiclwiLFxuICBcdFwiYWxpZ25cIixcbiAgXHRcImF4aXNcIixcbiAgXHRcImJnY29sb3JcIixcbiAgXHRcImNoYXJcIixcbiAgXHRcImNoYXJvZmZcIixcbiAgXHRcImNvbHNwYW5cIixcbiAgXHRcImhlYWRlcnNcIixcbiAgXHRcImhlaWdodFwiLFxuICBcdFwibm93cmFwXCIsXG4gIFx0XCJyb3dzcGFuXCIsXG4gIFx0XCJzY29wZVwiLFxuICBcdFwidmFsaWduXCIsXG4gIFx0XCJ3aWR0aFwiXG4gIF07XG4gIHZhciB0aGVhZCA9IFtcbiAgXHRcImFsaWduXCIsXG4gIFx0XCJjaGFyXCIsXG4gIFx0XCJjaGFyb2ZmXCIsXG4gIFx0XCJ2YWxpZ25cIlxuICBdO1xuICB2YXIgdGltZSA9IFtcbiAgXHRcImRhdGV0aW1lXCJcbiAgXTtcbiAgdmFyIHRyID0gW1xuICBcdFwiYWxpZ25cIixcbiAgXHRcImJnY29sb3JcIixcbiAgXHRcImNoYXJcIixcbiAgXHRcImNoYXJvZmZcIixcbiAgXHRcInZhbGlnblwiXG4gIF07XG4gIHZhciB0cmFjayA9IFtcbiAgXHRcImRlZmF1bHRcIixcbiAgXHRcImtpbmRcIixcbiAgXHRcImxhYmVsXCIsXG4gIFx0XCJzcmNcIixcbiAgXHRcInNyY2xhbmdcIlxuICBdO1xuICB2YXIgdWwgPSBbXG4gIFx0XCJjb21wYWN0XCIsXG4gIFx0XCJ0eXBlXCJcbiAgXTtcbiAgdmFyIHZpZGVvID0gW1xuICBcdFwiYXV0b3BsYXlcIixcbiAgXHRcImNvbnRyb2xzXCIsXG4gIFx0XCJjcm9zc29yaWdpblwiLFxuICBcdFwiaGVpZ2h0XCIsXG4gIFx0XCJsb29wXCIsXG4gIFx0XCJtdXRlZFwiLFxuICBcdFwicGxheXNpbmxpbmVcIixcbiAgXHRcInBvc3RlclwiLFxuICBcdFwicHJlbG9hZFwiLFxuICBcdFwic3JjXCIsXG4gIFx0XCJ3aWR0aFwiXG4gIF07XG4gIHZhciBpbmRleCQxID0ge1xuICBcdFwiKlwiOiBbXG4gIFx0XCJhY2Nlc3NrZXlcIixcbiAgXHRcImF1dG9jYXBpdGFsaXplXCIsXG4gIFx0XCJhdXRvZm9jdXNcIixcbiAgXHRcImNsYXNzXCIsXG4gIFx0XCJjb250ZW50ZWRpdGFibGVcIixcbiAgXHRcImRpclwiLFxuICBcdFwiZHJhZ2dhYmxlXCIsXG4gIFx0XCJlbnRlcmtleWhpbnRcIixcbiAgXHRcImhpZGRlblwiLFxuICBcdFwiaWRcIixcbiAgXHRcImlucHV0bW9kZVwiLFxuICBcdFwiaXNcIixcbiAgXHRcIml0ZW1pZFwiLFxuICBcdFwiaXRlbXByb3BcIixcbiAgXHRcIml0ZW1yZWZcIixcbiAgXHRcIml0ZW1zY29wZVwiLFxuICBcdFwiaXRlbXR5cGVcIixcbiAgXHRcImxhbmdcIixcbiAgXHRcIm5vbmNlXCIsXG4gIFx0XCJzbG90XCIsXG4gIFx0XCJzcGVsbGNoZWNrXCIsXG4gIFx0XCJzdHlsZVwiLFxuICBcdFwidGFiaW5kZXhcIixcbiAgXHRcInRpdGxlXCIsXG4gIFx0XCJ0cmFuc2xhdGVcIlxuICBdLFxuICBcdGE6IGEsXG4gIFx0YWJicjogYWJicixcbiAgXHRhcHBsZXQ6IGFwcGxldCxcbiAgXHRhcmVhOiBhcmVhLFxuICBcdGF1ZGlvOiBhdWRpbyxcbiAgXHRiYXNlOiBiYXNlLFxuICBcdGJhc2Vmb250OiBiYXNlZm9udCxcbiAgXHRiZG86IGJkbyxcbiAgXHRibG9ja3F1b3RlOiBibG9ja3F1b3RlLFxuICBcdGJvZHk6IGJvZHksXG4gIFx0YnI6IGJyLFxuICBcdGJ1dHRvbjogYnV0dG9uLFxuICBcdGNhbnZhczogY2FudmFzLFxuICBcdGNhcHRpb246IGNhcHRpb24sXG4gIFx0Y29sOiBjb2wsXG4gIFx0Y29sZ3JvdXA6IGNvbGdyb3VwLFxuICBcdGRhdGE6IGRhdGEsXG4gIFx0ZGVsOiBkZWwsXG4gIFx0ZGV0YWlsczogZGV0YWlscyxcbiAgXHRkZm46IGRmbixcbiAgXHRkaWFsb2c6IGRpYWxvZyxcbiAgXHRkaXI6IGRpcixcbiAgXHRkaXY6IGRpdixcbiAgXHRkbDogZGwsXG4gIFx0ZW1iZWQ6IGVtYmVkJDEsXG4gIFx0ZmllbGRzZXQ6IGZpZWxkc2V0LFxuICBcdGZvbnQ6IGZvbnQsXG4gIFx0Zm9ybTogZm9ybSxcbiAgXHRmcmFtZTogZnJhbWUsXG4gIFx0ZnJhbWVzZXQ6IGZyYW1lc2V0LFxuICBcdGgxOiBoMSxcbiAgXHRoMjogaDIsXG4gIFx0aDM6IGgzLFxuICBcdGg0OiBoNCxcbiAgXHRoNTogaDUsXG4gIFx0aDY6IGg2LFxuICBcdGhlYWQ6IGhlYWQsXG4gIFx0aHI6IGhyLFxuICBcdGh0bWw6IGh0bWwsXG4gIFx0aWZyYW1lOiBpZnJhbWUsXG4gIFx0aW1nOiBpbWcsXG4gIFx0aW5wdXQ6IGlucHV0LFxuICBcdGluczogaW5zLFxuICBcdGlzaW5kZXg6IGlzaW5kZXgsXG4gIFx0bGFiZWw6IGxhYmVsLFxuICBcdGxlZ2VuZDogbGVnZW5kLFxuICBcdGxpOiBsaSxcbiAgXHRsaW5rOiBsaW5rJDMsXG4gIFx0bWFwOiBtYXAsXG4gIFx0bWVudTogbWVudSxcbiAgXHRtZXRhOiBtZXRhLFxuICBcdG1ldGVyOiBtZXRlcixcbiAgXHRvYmplY3Q6IG9iamVjdCxcbiAgXHRvbDogb2wsXG4gIFx0b3B0Z3JvdXA6IG9wdGdyb3VwLFxuICBcdG9wdGlvbjogb3B0aW9uLFxuICBcdG91dHB1dDogb3V0cHV0LFxuICBcdHA6IHAsXG4gIFx0cGFyYW06IHBhcmFtLFxuICBcdHByZTogcHJlLFxuICBcdHByb2dyZXNzOiBwcm9ncmVzcyxcbiAgXHRxOiBxLFxuICBcdHNjcmlwdDogc2NyaXB0LFxuICBcdHNlbGVjdDogc2VsZWN0LFxuICBcdHNsb3Q6IHNsb3QsXG4gIFx0c291cmNlOiBzb3VyY2UkMSxcbiAgXHRzdHlsZTogc3R5bGUsXG4gIFx0dGFibGU6IHRhYmxlLFxuICBcdHRib2R5OiB0Ym9keSxcbiAgXHR0ZDogdGQsXG4gIFx0dGV4dGFyZWE6IHRleHRhcmVhLFxuICBcdHRmb290OiB0Zm9vdCxcbiAgXHR0aDogdGgsXG4gIFx0dGhlYWQ6IHRoZWFkLFxuICBcdHRpbWU6IHRpbWUsXG4gIFx0dHI6IHRyLFxuICBcdHRyYWNrOiB0cmFjayxcbiAgXHR1bDogdWwsXG4gIFx0dmlkZW86IHZpZGVvXG4gIH07XG5cbiAgdmFyIGh0bWxFbGVtZW50QXR0cmlidXRlcyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgYTogYSxcbiAgICBhYmJyOiBhYmJyLFxuICAgIGFwcGxldDogYXBwbGV0LFxuICAgIGFyZWE6IGFyZWEsXG4gICAgYXVkaW86IGF1ZGlvLFxuICAgIGJhc2U6IGJhc2UsXG4gICAgYmFzZWZvbnQ6IGJhc2Vmb250LFxuICAgIGJkbzogYmRvLFxuICAgIGJsb2NrcXVvdGU6IGJsb2NrcXVvdGUsXG4gICAgYm9keTogYm9keSxcbiAgICBicjogYnIsXG4gICAgYnV0dG9uOiBidXR0b24sXG4gICAgY2FudmFzOiBjYW52YXMsXG4gICAgY2FwdGlvbjogY2FwdGlvbixcbiAgICBjb2w6IGNvbCxcbiAgICBjb2xncm91cDogY29sZ3JvdXAsXG4gICAgZGF0YTogZGF0YSxcbiAgICBkZWw6IGRlbCxcbiAgICBkZXRhaWxzOiBkZXRhaWxzLFxuICAgIGRmbjogZGZuLFxuICAgIGRpYWxvZzogZGlhbG9nLFxuICAgIGRpcjogZGlyLFxuICAgIGRpdjogZGl2LFxuICAgIGRsOiBkbCxcbiAgICBlbWJlZDogZW1iZWQkMSxcbiAgICBmaWVsZHNldDogZmllbGRzZXQsXG4gICAgZm9udDogZm9udCxcbiAgICBmb3JtOiBmb3JtLFxuICAgIGZyYW1lOiBmcmFtZSxcbiAgICBmcmFtZXNldDogZnJhbWVzZXQsXG4gICAgaDE6IGgxLFxuICAgIGgyOiBoMixcbiAgICBoMzogaDMsXG4gICAgaDQ6IGg0LFxuICAgIGg1OiBoNSxcbiAgICBoNjogaDYsXG4gICAgaGVhZDogaGVhZCxcbiAgICBocjogaHIsXG4gICAgaHRtbDogaHRtbCxcbiAgICBpZnJhbWU6IGlmcmFtZSxcbiAgICBpbWc6IGltZyxcbiAgICBpbnB1dDogaW5wdXQsXG4gICAgaW5zOiBpbnMsXG4gICAgaXNpbmRleDogaXNpbmRleCxcbiAgICBsYWJlbDogbGFiZWwsXG4gICAgbGVnZW5kOiBsZWdlbmQsXG4gICAgbGk6IGxpLFxuICAgIGxpbms6IGxpbmskMyxcbiAgICBtYXA6IG1hcCxcbiAgICBtZW51OiBtZW51LFxuICAgIG1ldGE6IG1ldGEsXG4gICAgbWV0ZXI6IG1ldGVyLFxuICAgIG9iamVjdDogb2JqZWN0LFxuICAgIG9sOiBvbCxcbiAgICBvcHRncm91cDogb3B0Z3JvdXAsXG4gICAgb3B0aW9uOiBvcHRpb24sXG4gICAgb3V0cHV0OiBvdXRwdXQsXG4gICAgcDogcCxcbiAgICBwYXJhbTogcGFyYW0sXG4gICAgcHJlOiBwcmUsXG4gICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgIHE6IHEsXG4gICAgc2NyaXB0OiBzY3JpcHQsXG4gICAgc2VsZWN0OiBzZWxlY3QsXG4gICAgc2xvdDogc2xvdCxcbiAgICBzb3VyY2U6IHNvdXJjZSQxLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICB0YWJsZTogdGFibGUsXG4gICAgdGJvZHk6IHRib2R5LFxuICAgIHRkOiB0ZCxcbiAgICB0ZXh0YXJlYTogdGV4dGFyZWEsXG4gICAgdGZvb3Q6IHRmb290LFxuICAgIHRoOiB0aCxcbiAgICB0aGVhZDogdGhlYWQsXG4gICAgdGltZTogdGltZSxcbiAgICB0cjogdHIsXG4gICAgdHJhY2s6IHRyYWNrLFxuICAgIHVsOiB1bCxcbiAgICB2aWRlbzogdmlkZW8sXG4gICAgJ2RlZmF1bHQnOiBpbmRleCQxXG4gIH0pO1xuXG4gIHZhciBodG1sVGFnTmFtZXMkMSA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoaHRtbFRhZ05hbWVzKTtcblxuICB2YXIgaHRtbEVsZW1lbnRBdHRyaWJ1dGVzJDEgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKGh0bWxFbGVtZW50QXR0cmlidXRlcyk7XG5cbiAgY29uc3Qge1xuICAgIENTU19ESVNQTEFZX1RBR1MsXG4gICAgQ1NTX0RJU1BMQVlfREVGQVVMVCxcbiAgICBDU1NfV0hJVEVfU1BBQ0VfVEFHUyxcbiAgICBDU1NfV0hJVEVfU1BBQ0VfREVGQVVMVFxuICB9ID0ganNvbjtcbiAgY29uc3QgSFRNTF9UQUdTID0gYXJyYXlUb01hcChodG1sVGFnTmFtZXMkMSk7XG4gIGNvbnN0IEhUTUxfRUxFTUVOVF9BVFRSSUJVVEVTID0gbWFwT2JqZWN0KGh0bWxFbGVtZW50QXR0cmlidXRlcyQxLCBhcnJheVRvTWFwKTtcblxuICBmdW5jdGlvbiBhcnJheVRvTWFwKGFycmF5KSB7XG4gICAgY29uc3QgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXkpIHtcbiAgICAgIG1hcFt2YWx1ZV0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBPYmplY3Qob2JqZWN0LCBmbikge1xuICAgIGNvbnN0IG5ld09iamVjdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmplY3QpKSB7XG4gICAgICBuZXdPYmplY3Rba2V5XSA9IGZuKG9iamVjdFtrZXldLCBrZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdPYmplY3Q7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZUNvbnRlbnQobm9kZSwgb3B0aW9ucykge1xuICAgIGlmICghbm9kZS5lbmRTb3VyY2VTcGFuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIgJiYgbm9kZS5mdWxsTmFtZSA9PT0gXCJ0ZW1wbGF0ZVwiICYmIG5vZGUuYXR0ck1hcC5sYW5nICYmIG5vZGUuYXR0ck1hcC5sYW5nICE9PSBcImh0bWxcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyB1bnRlcm1pbmF0ZWQgbm9kZSBpbiBpZSBjb25kaXRpb25hbCBjb21tZW50XG4gICAgLy8gZS5nLiA8IS0tW2lmIGx0IElFIDldPjxodG1sPjwhW2VuZGlmXS0tPlxuXG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcImllQ29uZGl0aW9uYWxDb21tZW50XCIgJiYgbm9kZS5sYXN0Q2hpbGQgJiYgIW5vZGUubGFzdENoaWxkLmlzU2VsZkNsb3NpbmcgJiYgIW5vZGUubGFzdENoaWxkLmVuZFNvdXJjZVNwYW4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gaW5jb21wbGV0ZSBodG1sIGluIGllIGNvbmRpdGlvbmFsIGNvbW1lbnRcbiAgICAvLyBlLmcuIDwhLS1baWYgbHQgSUUgOV0+PC9kaXY+PCFbZW5kaWZdLS0+XG5cblxuICAgIGlmIChub2RlLnR5cGUgPT09IFwiaWVDb25kaXRpb25hbENvbW1lbnRcIiAmJiAhbm9kZS5jb21wbGV0ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyB0b3AtbGV2ZWwgZWxlbWVudHMgKGV4Y2x1ZGluZyA8dGVtcGxhdGU+LCA8c3R5bGU+IGFuZCA8c2NyaXB0PikgaW4gVnVlIFNGQyBhcmUgY29uc2lkZXJlZCBjdXN0b20gYmxvY2tcbiAgICAvLyBjdXN0b20gYmxvY2tzIGNhbiBiZSB3cml0dGVuIGluIG90aGVyIGxhbmd1YWdlcyBzbyB3ZSBzaG91bGQgcHJlc2VydmUgdGhlbSB0byBub3QgYnJlYWsgdGhlIGNvZGVcblxuXG4gICAgaWYgKG9wdGlvbnMucGFyc2VyID09PSBcInZ1ZVwiICYmIG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIgJiYgbm9kZS5wYXJlbnQudHlwZSA9PT0gXCJyb290XCIgJiYgIVtcInRlbXBsYXRlXCIsIFwic3R5bGVcIiwgXCJzY3JpcHRcIiwgLy8gdnVlIHBhcnNlciBjYW4gYmUgdXNlZCBmb3IgdnVlIGRvbSB0ZW1wbGF0ZSBhcyB3ZWxsLCBzbyB3ZSBzaG91bGQgc3RpbGwgZm9ybWF0IHRvcC1sZXZlbCA8aHRtbD5cbiAgICBcImh0bWxcIl0uaW5jbHVkZXMobm9kZS5mdWxsTmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gVE9ETzogaGFuZGxlIG5vbi10ZXh0IGNoaWxkcmVuIGluIDxwcmU+XG5cblxuICAgIGlmIChpc1ByZUxpa2VOb2RlKG5vZGUpICYmIG5vZGUuY2hpbGRyZW4uc29tZShjaGlsZCA9PiBjaGlsZC50eXBlICE9PSBcInRleHRcIiAmJiBjaGlsZC50eXBlICE9PSBcImludGVycG9sYXRpb25cIikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc1ByZXR0aWVySWdub3JlJDIobm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgPT09IFwiYXR0cmlidXRlXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUucGFyZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBub2RlLmluZGV4ICE9PSBcIm51bWJlclwiIHx8IG5vZGUuaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2Tm9kZSA9IG5vZGUucGFyZW50LmNoaWxkcmVuW25vZGUuaW5kZXggLSAxXTtcbiAgICByZXR1cm4gaXNQcmV0dGllcklnbm9yZShwcmV2Tm9kZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc1ByZXR0aWVySWdub3JlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcImNvbW1lbnRcIiAmJiBub2RlLnZhbHVlLnRyaW0oKSA9PT0gXCJwcmV0dGllci1pZ25vcmVcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByZXR0aWVySWdub3JlQXR0cmlidXRlQ29tbWVudERhdGEodmFsdWUpIHtcbiAgICBjb25zdCBtYXRjaCA9IHZhbHVlLnRyaW0oKS5tYXRjaCgvXnByZXR0aWVyLWlnbm9yZS1hdHRyaWJ1dGUoPzpcXHMrKFteXSspKT8kLyk7XG5cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFtYXRjaFsxXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoWzFdLnNwbGl0KC9cXHMrLyk7XG4gIH1cbiAgLyoqIHRoZXJlJ3Mgbm8gb3BlbmluZy9jbG9zaW5nIHRhZyBvciBpdCdzIGNvbnNpZGVyZWQgbm90IGJyZWFrYWJsZSAqL1xuXG5cbiAgZnVuY3Rpb24gaXNUZXh0TGlrZU5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwidGV4dFwiIHx8IG5vZGUudHlwZSA9PT0gXCJjb21tZW50XCI7XG4gIH1cblxuICBmdW5jdGlvbiBpc1NjcmlwdExpa2VUYWcobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwiZWxlbWVudFwiICYmIChub2RlLmZ1bGxOYW1lID09PSBcInNjcmlwdFwiIHx8IG5vZGUuZnVsbE5hbWUgPT09IFwic3R5bGVcIiB8fCBub2RlLmZ1bGxOYW1lID09PSBcInN2ZzpzdHlsZVwiIHx8IGlzVW5rbm93bk5hbWVzcGFjZShub2RlKSAmJiAobm9kZS5uYW1lID09PSBcInNjcmlwdFwiIHx8IG5vZGUubmFtZSA9PT0gXCJzdHlsZVwiKSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0Zyb250TWF0dGVyTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJ5YW1sXCIgfHwgbm9kZS50eXBlID09PSBcInRvbWxcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbkhhdmVJbnRlcnBvbGF0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5jaGlsZHJlbiAmJiAhaXNTY3JpcHRMaWtlVGFnKG5vZGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNXaGl0ZXNwYWNlU2Vuc2l0aXZlTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIGlzU2NyaXB0TGlrZVRhZyhub2RlKSB8fCBub2RlLnR5cGUgPT09IFwiaW50ZXJwb2xhdGlvblwiIHx8IGlzSW5kZW50YXRpb25TZW5zaXRpdmVOb2RlKG5vZGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNJbmRlbnRhdGlvblNlbnNpdGl2ZU5vZGUobm9kZSkge1xuICAgIHJldHVybiBnZXROb2RlQ3NzU3R5bGVXaGl0ZVNwYWNlKG5vZGUpLnN0YXJ0c1dpdGgoXCJwcmVcIik7XG4gIH1cblxuICBmdW5jdGlvbiBpc0xlYWRpbmdTcGFjZVNlbnNpdGl2ZU5vZGUobm9kZSkge1xuICAgIGNvbnN0IGlzTGVhZGluZ1NwYWNlU2Vuc2l0aXZlID0gX2lzTGVhZGluZ1NwYWNlU2Vuc2l0aXZlTm9kZSgpO1xuXG4gICAgaWYgKGlzTGVhZGluZ1NwYWNlU2Vuc2l0aXZlICYmICFub2RlLnByZXYgJiYgbm9kZS5wYXJlbnQgJiYgbm9kZS5wYXJlbnQudGFnRGVmaW5pdGlvbiAmJiBub2RlLnBhcmVudC50YWdEZWZpbml0aW9uLmlnbm9yZUZpcnN0TGYpIHtcbiAgICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwiaW50ZXJwb2xhdGlvblwiO1xuICAgIH1cblxuICAgIHJldHVybiBpc0xlYWRpbmdTcGFjZVNlbnNpdGl2ZTtcblxuICAgIGZ1bmN0aW9uIF9pc0xlYWRpbmdTcGFjZVNlbnNpdGl2ZU5vZGUoKSB7XG4gICAgICBpZiAoaXNGcm9udE1hdHRlck5vZGUobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5vZGUudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgbm9kZS50eXBlID09PSBcImludGVycG9sYXRpb25cIikgJiYgbm9kZS5wcmV2ICYmIChub2RlLnByZXYudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgbm9kZS5wcmV2LnR5cGUgPT09IFwiaW50ZXJwb2xhdGlvblwiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFub2RlLnBhcmVudCB8fCBub2RlLnBhcmVudC5jc3NEaXNwbGF5ID09PSBcIm5vbmVcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1ByZUxpa2VOb2RlKG5vZGUucGFyZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFub2RlLnByZXYgJiYgKG5vZGUucGFyZW50LnR5cGUgPT09IFwicm9vdFwiIHx8IGlzUHJlTGlrZU5vZGUobm9kZSkgJiYgbm9kZS5wYXJlbnQgfHwgaXNTY3JpcHRMaWtlVGFnKG5vZGUucGFyZW50KSB8fCAhaXNGaXJzdENoaWxkTGVhZGluZ1NwYWNlU2Vuc2l0aXZlQ3NzRGlzcGxheShub2RlLnBhcmVudC5jc3NEaXNwbGF5KSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5wcmV2ICYmICFpc05leHRMZWFkaW5nU3BhY2VTZW5zaXRpdmVDc3NEaXNwbGF5KG5vZGUucHJldi5jc3NEaXNwbGF5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVHJhaWxpbmdTcGFjZVNlbnNpdGl2ZU5vZGUobm9kZSkge1xuICAgIGlmIChpc0Zyb250TWF0dGVyTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgobm9kZS50eXBlID09PSBcInRleHRcIiB8fCBub2RlLnR5cGUgPT09IFwiaW50ZXJwb2xhdGlvblwiKSAmJiBub2RlLm5leHQgJiYgKG5vZGUubmV4dC50eXBlID09PSBcInRleHRcIiB8fCBub2RlLm5leHQudHlwZSA9PT0gXCJpbnRlcnBvbGF0aW9uXCIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUucGFyZW50IHx8IG5vZGUucGFyZW50LmNzc0Rpc3BsYXkgPT09IFwibm9uZVwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzUHJlTGlrZU5vZGUobm9kZS5wYXJlbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUubmV4dCAmJiAobm9kZS5wYXJlbnQudHlwZSA9PT0gXCJyb290XCIgfHwgaXNQcmVMaWtlTm9kZShub2RlKSAmJiBub2RlLnBhcmVudCB8fCBpc1NjcmlwdExpa2VUYWcobm9kZS5wYXJlbnQpIHx8ICFpc0xhc3RDaGlsZFRyYWlsaW5nU3BhY2VTZW5zaXRpdmVDc3NEaXNwbGF5KG5vZGUucGFyZW50LmNzc0Rpc3BsYXkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5leHQgJiYgIWlzUHJldlRyYWlsaW5nU3BhY2VTZW5zaXRpdmVDc3NEaXNwbGF5KG5vZGUubmV4dC5jc3NEaXNwbGF5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNEYW5nbGluZ1NwYWNlU2Vuc2l0aXZlTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIGlzRGFuZ2xpbmdTcGFjZVNlbnNpdGl2ZUNzc0Rpc3BsYXkobm9kZS5jc3NEaXNwbGF5KSAmJiAhaXNTY3JpcHRMaWtlVGFnKG5vZGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9yY2VOZXh0RW1wdHlMaW5lKG5vZGUpIHtcbiAgICByZXR1cm4gaXNGcm9udE1hdHRlck5vZGUobm9kZSkgfHwgbm9kZS5uZXh0ICYmIG5vZGUuc291cmNlU3Bhbi5lbmQubGluZSArIDEgPCBub2RlLm5leHQuc291cmNlU3Bhbi5zdGFydC5saW5lO1xuICB9XG4gIC8qKiBmaXJzdENoaWxkIGxlYWRpbmdTcGFjZXMgYW5kIGxhc3RDaGlsZCB0cmFpbGluZ1NwYWNlcyAqL1xuXG5cbiAgZnVuY3Rpb24gZm9yY2VCcmVha0NvbnRlbnQobm9kZSkge1xuICAgIHJldHVybiBmb3JjZUJyZWFrQ2hpbGRyZW4obm9kZSkgfHwgbm9kZS50eXBlID09PSBcImVsZW1lbnRcIiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCAhPT0gMCAmJiAoW1wiYm9keVwiLCBcInNjcmlwdFwiLCBcInN0eWxlXCJdLmluY2x1ZGVzKG5vZGUubmFtZSkgfHwgbm9kZS5jaGlsZHJlbi5zb21lKGNoaWxkID0+IGhhc05vblRleHRDaGlsZChjaGlsZCkpKSB8fCBub2RlLmZpcnN0Q2hpbGQgJiYgbm9kZS5maXJzdENoaWxkID09PSBub2RlLmxhc3RDaGlsZCAmJiBoYXNMZWFkaW5nTGluZUJyZWFrKG5vZGUuZmlyc3RDaGlsZCkgJiYgKCFub2RlLmxhc3RDaGlsZC5pc1RyYWlsaW5nU3BhY2VTZW5zaXRpdmUgfHwgaGFzVHJhaWxpbmdMaW5lQnJlYWsobm9kZS5sYXN0Q2hpbGQpKTtcbiAgfVxuICAvKiogc3BhY2VzIGJldHdlZW4gY2hpbGRyZW4gKi9cblxuXG4gIGZ1bmN0aW9uIGZvcmNlQnJlYWtDaGlsZHJlbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggIT09IDAgJiYgKFtcImh0bWxcIiwgXCJoZWFkXCIsIFwidWxcIiwgXCJvbFwiLCBcInNlbGVjdFwiXS5pbmNsdWRlcyhub2RlLm5hbWUpIHx8IG5vZGUuY3NzRGlzcGxheS5zdGFydHNXaXRoKFwidGFibGVcIikgJiYgbm9kZS5jc3NEaXNwbGF5ICE9PSBcInRhYmxlLWNlbGxcIik7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVmZXJIYXJkbGluZUFzTGVhZGluZ1NwYWNlcyhub2RlKSB7XG4gICAgcmV0dXJuIHByZWZlckhhcmRsaW5lQXNTdXJyb3VuZGluZ1NwYWNlcyhub2RlKSB8fCBub2RlLnByZXYgJiYgcHJlZmVySGFyZGxpbmVBc1RyYWlsaW5nU3BhY2VzKG5vZGUucHJldikgfHwgaGFzU3Vycm91bmRpbmdMaW5lQnJlYWsobm9kZSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVmZXJIYXJkbGluZUFzVHJhaWxpbmdTcGFjZXMobm9kZSkge1xuICAgIHJldHVybiBwcmVmZXJIYXJkbGluZUFzU3Vycm91bmRpbmdTcGFjZXMobm9kZSkgfHwgbm9kZS50eXBlID09PSBcImVsZW1lbnRcIiAmJiBub2RlLmZ1bGxOYW1lID09PSBcImJyXCIgfHwgaGFzU3Vycm91bmRpbmdMaW5lQnJlYWsobm9kZSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNTdXJyb3VuZGluZ0xpbmVCcmVhayhub2RlKSB7XG4gICAgcmV0dXJuIGhhc0xlYWRpbmdMaW5lQnJlYWsobm9kZSkgJiYgaGFzVHJhaWxpbmdMaW5lQnJlYWsobm9kZSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNMZWFkaW5nTGluZUJyZWFrKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5oYXNMZWFkaW5nU3BhY2VzICYmIChub2RlLnByZXYgPyBub2RlLnByZXYuc291cmNlU3Bhbi5lbmQubGluZSA8IG5vZGUuc291cmNlU3Bhbi5zdGFydC5saW5lIDogbm9kZS5wYXJlbnQudHlwZSA9PT0gXCJyb290XCIgfHwgbm9kZS5wYXJlbnQuc3RhcnRTb3VyY2VTcGFuLmVuZC5saW5lIDwgbm9kZS5zb3VyY2VTcGFuLnN0YXJ0LmxpbmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzVHJhaWxpbmdMaW5lQnJlYWsobm9kZSkge1xuICAgIHJldHVybiBub2RlLmhhc1RyYWlsaW5nU3BhY2VzICYmIChub2RlLm5leHQgPyBub2RlLm5leHQuc291cmNlU3Bhbi5zdGFydC5saW5lID4gbm9kZS5zb3VyY2VTcGFuLmVuZC5saW5lIDogbm9kZS5wYXJlbnQudHlwZSA9PT0gXCJyb290XCIgfHwgbm9kZS5wYXJlbnQuZW5kU291cmNlU3BhbiAmJiBub2RlLnBhcmVudC5lbmRTb3VyY2VTcGFuLnN0YXJ0LmxpbmUgPiBub2RlLnNvdXJjZVNwYW4uZW5kLmxpbmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlZmVySGFyZGxpbmVBc1N1cnJvdW5kaW5nU3BhY2VzKG5vZGUpIHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcImllQ29uZGl0aW9uYWxDb21tZW50XCI6XG4gICAgICBjYXNlIFwiY29tbWVudFwiOlxuICAgICAgY2FzZSBcImRpcmVjdGl2ZVwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgY2FzZSBcImVsZW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIFtcInNjcmlwdFwiLCBcInNlbGVjdFwiXS5pbmNsdWRlcyhub2RlLm5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExhc3REZXNjZW5kYW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5sYXN0Q2hpbGQgPyBnZXRMYXN0RGVzY2VuZGFudChub2RlLmxhc3RDaGlsZCkgOiBub2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzTm9uVGV4dENoaWxkKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLnNvbWUoY2hpbGQgPT4gY2hpbGQudHlwZSAhPT0gXCJ0ZXh0XCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5mZXJTY3JpcHRQYXJzZXIobm9kZSkge1xuICAgIGlmIChub2RlLm5hbWUgPT09IFwic2NyaXB0XCIgJiYgIW5vZGUuYXR0ck1hcC5zcmMpIHtcbiAgICAgIGlmICghbm9kZS5hdHRyTWFwLmxhbmcgJiYgIW5vZGUuYXR0ck1hcC50eXBlIHx8IG5vZGUuYXR0ck1hcC50eXBlID09PSBcIm1vZHVsZVwiIHx8IG5vZGUuYXR0ck1hcC50eXBlID09PSBcInRleHQvamF2YXNjcmlwdFwiIHx8IG5vZGUuYXR0ck1hcC50eXBlID09PSBcInRleHQvYmFiZWxcIiB8fCBub2RlLmF0dHJNYXAudHlwZSA9PT0gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgfHwgbm9kZS5hdHRyTWFwLmxhbmcgPT09IFwianN4XCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYmFiZWxcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuYXR0ck1hcC50eXBlID09PSBcImFwcGxpY2F0aW9uL3gtdHlwZXNjcmlwdFwiIHx8IG5vZGUuYXR0ck1hcC5sYW5nID09PSBcInRzXCIgfHwgbm9kZS5hdHRyTWFwLmxhbmcgPT09IFwidHN4XCIpIHtcbiAgICAgICAgcmV0dXJuIFwidHlwZXNjcmlwdFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5hdHRyTWFwLnR5cGUgPT09IFwidGV4dC9tYXJrZG93blwiKSB7XG4gICAgICAgIHJldHVybiBcIm1hcmtkb3duXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmF0dHJNYXAudHlwZS5lbmRzV2l0aChcImpzb25cIikgfHwgbm9kZS5hdHRyTWFwLnR5cGUuZW5kc1dpdGgoXCJpbXBvcnRtYXBcIikpIHtcbiAgICAgICAgcmV0dXJuIFwianNvblwiO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5hdHRyTWFwLnR5cGUgPT09IFwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIikge1xuICAgICAgICByZXR1cm4gXCJnbGltbWVyXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICBpZiAoIW5vZGUuYXR0ck1hcC5sYW5nIHx8IG5vZGUuYXR0ck1hcC5sYW5nID09PSBcInBvc3Rjc3NcIiB8fCBub2RlLmF0dHJNYXAubGFuZyA9PT0gXCJjc3NcIikge1xuICAgICAgICByZXR1cm4gXCJjc3NcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuYXR0ck1hcC5sYW5nID09PSBcInNjc3NcIikge1xuICAgICAgICByZXR1cm4gXCJzY3NzXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmF0dHJNYXAubGFuZyA9PT0gXCJsZXNzXCIpIHtcbiAgICAgICAgcmV0dXJuIFwibGVzc1wiO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNCbG9ja0xpa2VDc3NEaXNwbGF5KGNzc0Rpc3BsYXkpIHtcbiAgICByZXR1cm4gY3NzRGlzcGxheSA9PT0gXCJibG9ja1wiIHx8IGNzc0Rpc3BsYXkgPT09IFwibGlzdC1pdGVtXCIgfHwgY3NzRGlzcGxheS5zdGFydHNXaXRoKFwidGFibGVcIik7XG4gIH1cblxuICBmdW5jdGlvbiBpc0ZpcnN0Q2hpbGRMZWFkaW5nU3BhY2VTZW5zaXRpdmVDc3NEaXNwbGF5KGNzc0Rpc3BsYXkpIHtcbiAgICByZXR1cm4gIWlzQmxvY2tMaWtlQ3NzRGlzcGxheShjc3NEaXNwbGF5KSAmJiBjc3NEaXNwbGF5ICE9PSBcImlubGluZS1ibG9ja1wiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNMYXN0Q2hpbGRUcmFpbGluZ1NwYWNlU2Vuc2l0aXZlQ3NzRGlzcGxheShjc3NEaXNwbGF5KSB7XG4gICAgcmV0dXJuICFpc0Jsb2NrTGlrZUNzc0Rpc3BsYXkoY3NzRGlzcGxheSkgJiYgY3NzRGlzcGxheSAhPT0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUHJldlRyYWlsaW5nU3BhY2VTZW5zaXRpdmVDc3NEaXNwbGF5KGNzc0Rpc3BsYXkpIHtcbiAgICByZXR1cm4gIWlzQmxvY2tMaWtlQ3NzRGlzcGxheShjc3NEaXNwbGF5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTmV4dExlYWRpbmdTcGFjZVNlbnNpdGl2ZUNzc0Rpc3BsYXkoY3NzRGlzcGxheSkge1xuICAgIHJldHVybiAhaXNCbG9ja0xpa2VDc3NEaXNwbGF5KGNzc0Rpc3BsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNEYW5nbGluZ1NwYWNlU2Vuc2l0aXZlQ3NzRGlzcGxheShjc3NEaXNwbGF5KSB7XG4gICAgcmV0dXJuICFpc0Jsb2NrTGlrZUNzc0Rpc3BsYXkoY3NzRGlzcGxheSkgJiYgY3NzRGlzcGxheSAhPT0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUHJlTGlrZU5vZGUobm9kZSkge1xuICAgIHJldHVybiBnZXROb2RlQ3NzU3R5bGVXaGl0ZVNwYWNlKG5vZGUpLnN0YXJ0c1dpdGgoXCJwcmVcIik7XG4gIH1cblxuICBmdW5jdGlvbiBjb3VudFBhcmVudHMocGF0aCwgcHJlZGljYXRlID0gKCkgPT4gdHJ1ZSkge1xuICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgIGZvciAobGV0IGkgPSBwYXRoLnN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHBhdGguc3RhY2tbaV07XG5cbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgY291bnRlcisrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3VudGVyO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzUGFyZW50KG5vZGUsIGZuKSB7XG4gICAgbGV0IGN1cnJlbnQgPSBub2RlO1xuXG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGlmIChmbihjdXJyZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE5vZGVDc3NTdHlsZURpc3BsYXkobm9kZSwgb3B0aW9ucykge1xuICAgIGlmIChub2RlLnByZXYgJiYgbm9kZS5wcmV2LnR5cGUgPT09IFwiY29tbWVudFwiKSB7XG4gICAgICAvLyA8IS0tIGRpc3BsYXk6IGJsb2NrIC0tPlxuICAgICAgY29uc3QgbWF0Y2ggPSBub2RlLnByZXYudmFsdWUubWF0Y2goL15cXHMqZGlzcGxheTpcXHMqKFthLXpdKylcXHMqJC8pO1xuXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBpc0luU3ZnRm9yZWlnbk9iamVjdCA9IGZhbHNlO1xuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIgJiYgbm9kZS5uYW1lc3BhY2UgPT09IFwic3ZnXCIpIHtcbiAgICAgIGlmIChoYXNQYXJlbnQobm9kZSwgcGFyZW50ID0+IHBhcmVudC5mdWxsTmFtZSA9PT0gXCJzdmc6Zm9yZWlnbk9iamVjdFwiKSkge1xuICAgICAgICBpc0luU3ZnRm9yZWlnbk9iamVjdCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbm9kZS5uYW1lID09PSBcInN2Z1wiID8gXCJpbmxpbmUtYmxvY2tcIiA6IFwiYmxvY2tcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKG9wdGlvbnMuaHRtbFdoaXRlc3BhY2VTZW5zaXRpdml0eSkge1xuICAgICAgY2FzZSBcInN0cmljdFwiOlxuICAgICAgICByZXR1cm4gXCJpbmxpbmVcIjtcblxuICAgICAgY2FzZSBcImlnbm9yZVwiOlxuICAgICAgICByZXR1cm4gXCJibG9ja1wiO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbm9kZS50eXBlID09PSBcImVsZW1lbnRcIiAmJiAoIW5vZGUubmFtZXNwYWNlIHx8IGlzSW5TdmdGb3JlaWduT2JqZWN0IHx8IGlzVW5rbm93bk5hbWVzcGFjZShub2RlKSkgJiYgQ1NTX0RJU1BMQVlfVEFHU1tub2RlLm5hbWVdIHx8IENTU19ESVNQTEFZX0RFRkFVTFQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNVbmtub3duTmFtZXNwYWNlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcImVsZW1lbnRcIiAmJiAhbm9kZS5oYXNFeHBsaWNpdE5hbWVzcGFjZSAmJiAhW1wiaHRtbFwiLCBcInN2Z1wiXS5pbmNsdWRlcyhub2RlLm5hbWVzcGFjZSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXROb2RlQ3NzU3R5bGVXaGl0ZVNwYWNlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcImVsZW1lbnRcIiAmJiAoIW5vZGUubmFtZXNwYWNlIHx8IGlzVW5rbm93bk5hbWVzcGFjZShub2RlKSkgJiYgQ1NTX1dISVRFX1NQQUNFX1RBR1Nbbm9kZS5uYW1lXSB8fCBDU1NfV0hJVEVfU1BBQ0VfREVGQVVMVDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1pbkluZGVudGF0aW9uKHRleHQpIHtcbiAgICBsZXQgbWluSW5kZW50YXRpb24gPSBJbmZpbml0eTtcblxuICAgIGZvciAoY29uc3QgbGluZVRleHQgb2YgdGV4dC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgaWYgKGxpbmVUZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKC9cXFMvLnRlc3QobGluZVRleHRbMF0pKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmRlbnRhdGlvbiA9IGxpbmVUZXh0Lm1hdGNoKC9eXFxzKi8pWzBdLmxlbmd0aDtcblxuICAgICAgaWYgKGxpbmVUZXh0Lmxlbmd0aCA9PT0gaW5kZW50YXRpb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmRlbnRhdGlvbiA8IG1pbkluZGVudGF0aW9uKSB7XG4gICAgICAgIG1pbkluZGVudGF0aW9uID0gaW5kZW50YXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1pbkluZGVudGF0aW9uID09PSBJbmZpbml0eSA/IDAgOiBtaW5JbmRlbnRhdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZGVudFN0cmluZyh0ZXh0LCBtaW5JbmRlbnQgPSBnZXRNaW5JbmRlbnRhdGlvbih0ZXh0KSkge1xuICAgIHJldHVybiBtaW5JbmRlbnQgPT09IDAgPyB0ZXh0IDogdGV4dC5zcGxpdChcIlxcblwiKS5tYXAobGluZVRleHQgPT4gbGluZVRleHQuc2xpY2UobWluSW5kZW50KSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnRzKHBhcnRzKSB7XG4gICAgY29uc3QgbmV3UGFydHMgPSBbXTtcbiAgICBjb25zdCByZXN0UGFydHMgPSBwYXJ0cy5zbGljZSgpO1xuXG4gICAgd2hpbGUgKHJlc3RQYXJ0cy5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IHBhcnQgPSByZXN0UGFydHMuc2hpZnQoKTtcblxuICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFydC50eXBlID09PSBcImNvbmNhdFwiKSB7XG4gICAgICAgIHJlc3RQYXJ0cy51bnNoaWZ0KC4uLnBhcnQucGFydHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld1BhcnRzLmxlbmd0aCAhPT0gMCAmJiB0eXBlb2YgbmV3UGFydHNbbmV3UGFydHMubGVuZ3RoIC0gMV0gPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbmV3UGFydHMucHVzaChuZXdQYXJ0cy5wb3AoKSArIHBhcnQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbmV3UGFydHMucHVzaChwYXJ0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3UGFydHM7XG4gIH1cblxuICBmdW5jdGlvbiBpZGVudGl0eSh4KSB7XG4gICAgcmV0dXJuIHg7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGROb3RQcmludENsb3NpbmdUYWcobm9kZSwgb3B0aW9ucykge1xuICAgIHJldHVybiAhbm9kZS5pc1NlbGZDbG9zaW5nICYmICFub2RlLmVuZFNvdXJjZVNwYW4gJiYgKGhhc1ByZXR0aWVySWdub3JlJDIobm9kZSkgfHwgc2hvdWxkUHJlc2VydmVDb250ZW50KG5vZGUucGFyZW50LCBvcHRpb25zKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjb3VudENoYXJzKHRleHQsIGNoYXIpIHtcbiAgICBsZXQgY291bnRlciA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0ZXh0W2ldID09PSBjaGFyKSB7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuZXNjYXBlUXVvdGVFbnRpdGllcyh0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgvJmFwb3M7L2csIFwiJ1wiKS5yZXBsYWNlKC8mcXVvdDsvZywgJ1wiJyk7XG4gIH1cblxuICB2YXIgdXRpbHMkNCA9IHtcbiAgICBIVE1MX0VMRU1FTlRfQVRUUklCVVRFUyxcbiAgICBIVE1MX1RBR1MsXG4gICAgY2FuSGF2ZUludGVycG9sYXRpb24sXG4gICAgY291bnRDaGFycyxcbiAgICBjb3VudFBhcmVudHMsXG4gICAgZGVkZW50U3RyaW5nLFxuICAgIGZvcmNlQnJlYWtDaGlsZHJlbixcbiAgICBmb3JjZUJyZWFrQ29udGVudCxcbiAgICBmb3JjZU5leHRFbXB0eUxpbmUsXG4gICAgZ2V0TGFzdERlc2NlbmRhbnQsXG4gICAgZ2V0Tm9kZUNzc1N0eWxlRGlzcGxheSxcbiAgICBnZXROb2RlQ3NzU3R5bGVXaGl0ZVNwYWNlLFxuICAgIGdldFByZXR0aWVySWdub3JlQXR0cmlidXRlQ29tbWVudERhdGEsXG4gICAgaGFzUHJldHRpZXJJZ25vcmU6IGhhc1ByZXR0aWVySWdub3JlJDIsXG4gICAgaWRlbnRpdHksXG4gICAgaW5mZXJTY3JpcHRQYXJzZXIsXG4gICAgaXNEYW5nbGluZ1NwYWNlU2Vuc2l0aXZlTm9kZSxcbiAgICBpc0Zyb250TWF0dGVyTm9kZSxcbiAgICBpc0luZGVudGF0aW9uU2Vuc2l0aXZlTm9kZSxcbiAgICBpc0xlYWRpbmdTcGFjZVNlbnNpdGl2ZU5vZGUsXG4gICAgaXNQcmVMaWtlTm9kZSxcbiAgICBpc1NjcmlwdExpa2VUYWcsXG4gICAgaXNUZXh0TGlrZU5vZGUsXG4gICAgaXNUcmFpbGluZ1NwYWNlU2Vuc2l0aXZlTm9kZSxcbiAgICBpc1doaXRlc3BhY2VTZW5zaXRpdmVOb2RlLFxuICAgIGlzVW5rbm93bk5hbWVzcGFjZSxcbiAgICBub3JtYWxpemVQYXJ0cyxcbiAgICBwcmVmZXJIYXJkbGluZUFzTGVhZGluZ1NwYWNlcyxcbiAgICBwcmVmZXJIYXJkbGluZUFzVHJhaWxpbmdTcGFjZXMsXG4gICAgc2hvdWxkTm90UHJpbnRDbG9zaW5nVGFnLFxuICAgIHNob3VsZFByZXNlcnZlQ29udGVudCxcbiAgICB1bmVzY2FwZVF1b3RlRW50aXRpZXNcbiAgfTtcblxuICBjb25zdCB7XG4gICAgY2FuSGF2ZUludGVycG9sYXRpb246IGNhbkhhdmVJbnRlcnBvbGF0aW9uJDEsXG4gICAgZ2V0Tm9kZUNzc1N0eWxlRGlzcGxheTogZ2V0Tm9kZUNzc1N0eWxlRGlzcGxheSQxLFxuICAgIGlzRGFuZ2xpbmdTcGFjZVNlbnNpdGl2ZU5vZGU6IGlzRGFuZ2xpbmdTcGFjZVNlbnNpdGl2ZU5vZGUkMSxcbiAgICBpc0luZGVudGF0aW9uU2Vuc2l0aXZlTm9kZTogaXNJbmRlbnRhdGlvblNlbnNpdGl2ZU5vZGUkMSxcbiAgICBpc0xlYWRpbmdTcGFjZVNlbnNpdGl2ZU5vZGU6IGlzTGVhZGluZ1NwYWNlU2Vuc2l0aXZlTm9kZSQxLFxuICAgIGlzVHJhaWxpbmdTcGFjZVNlbnNpdGl2ZU5vZGU6IGlzVHJhaWxpbmdTcGFjZVNlbnNpdGl2ZU5vZGUkMSxcbiAgICBpc1doaXRlc3BhY2VTZW5zaXRpdmVOb2RlOiBpc1doaXRlc3BhY2VTZW5zaXRpdmVOb2RlJDFcbiAgfSA9IHV0aWxzJDQ7XG4gIGNvbnN0IFBSRVBST0NFU1NfUElQRUxJTkUgPSBbcmVtb3ZlSWdub3JhYmxlRmlyc3RMZiwgbWVyZ2VJZUNvbmRpdG9uYWxTdGFydEVuZENvbW1lbnRJbnRvRWxlbWVudE9wZW5pbmdUYWcsIG1lcmdlQ2RhdGFJbnRvVGV4dCwgZXh0cmFjdEludGVycG9sYXRpb24sIGV4dHJhY3RXaGl0ZXNwYWNlcywgYWRkQ3NzRGlzcGxheSwgYWRkSXNTZWxmQ2xvc2luZywgYWRkSGFzSHRtQ29tcG9uZW50Q2xvc2luZ1RhZywgYWRkSXNTcGFjZVNlbnNpdGl2ZSwgbWVyZ2VTaW1wbGVFbGVtZW50SW50b1RleHRdO1xuXG4gIGZ1bmN0aW9uIHByZXByb2Nlc3MoYXN0LCBvcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBmbiBvZiBQUkVQUk9DRVNTX1BJUEVMSU5FKSB7XG4gICAgICBhc3QgPSBmbihhc3QsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBhc3Q7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVJZ25vcmFibGVGaXJzdExmKGFzdFxuICAvKiwgb3B0aW9ucyAqL1xuICApIHtcbiAgICByZXR1cm4gYXN0Lm1hcChub2RlID0+IHtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09IFwiZWxlbWVudFwiICYmIG5vZGUudGFnRGVmaW5pdGlvbi5pZ25vcmVGaXJzdExmICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoICE9PSAwICYmIG5vZGUuY2hpbGRyZW5bMF0udHlwZSA9PT0gXCJ0ZXh0XCIgJiYgbm9kZS5jaGlsZHJlblswXS52YWx1ZVswXSA9PT0gXCJcXG5cIikge1xuICAgICAgICBjb25zdCBbdGV4dCwgLi4ucmVzdF0gPSBub2RlLmNoaWxkcmVuO1xuICAgICAgICByZXR1cm4gbm9kZS5jbG9uZSh7XG4gICAgICAgICAgY2hpbGRyZW46IHRleHQudmFsdWUubGVuZ3RoID09PSAxID8gcmVzdCA6IFt0ZXh0LmNsb25lKHtcbiAgICAgICAgICAgIHZhbHVlOiB0ZXh0LnZhbHVlLnNsaWNlKDEpXG4gICAgICAgICAgfSksIC4uLnJlc3RdXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlSWVDb25kaXRvbmFsU3RhcnRFbmRDb21tZW50SW50b0VsZW1lbnRPcGVuaW5nVGFnKGFzdFxuICAvKiwgb3B0aW9ucyAqL1xuICApIHtcbiAgICAvKipcbiAgICAgKiAgICAgPCEtLVtpZiAuLi5dPjwhLS0+PHRhcmdldD48IS0tPCFbZW5kaWZdLS0+XG4gICAgICovXG4gICAgY29uc3QgaXNUYXJnZXQgPSBub2RlID0+IG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIgJiYgbm9kZS5wcmV2ICYmIG5vZGUucHJldi50eXBlID09PSBcImllQ29uZGl0aW9uYWxTdGFydENvbW1lbnRcIiAmJiBub2RlLnByZXYuc291cmNlU3Bhbi5lbmQub2Zmc2V0ID09PSBub2RlLnN0YXJ0U291cmNlU3Bhbi5zdGFydC5vZmZzZXQgJiYgbm9kZS5maXJzdENoaWxkICYmIG5vZGUuZmlyc3RDaGlsZC50eXBlID09PSBcImllQ29uZGl0aW9uYWxFbmRDb21tZW50XCIgJiYgbm9kZS5maXJzdENoaWxkLnNvdXJjZVNwYW4uc3RhcnQub2Zmc2V0ID09PSBub2RlLnN0YXJ0U291cmNlU3Bhbi5lbmQub2Zmc2V0O1xuXG4gICAgcmV0dXJuIGFzdC5tYXAobm9kZSA9PiB7XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBpc1RhcmdldFJlc3VsdHMgPSBub2RlLmNoaWxkcmVuLm1hcChpc1RhcmdldCk7XG5cbiAgICAgICAgaWYgKGlzVGFyZ2V0UmVzdWx0cy5zb21lKEJvb2xlYW4pKSB7XG4gICAgICAgICAgY29uc3QgbmV3Q2hpbGRyZW4gPSBbXTtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuXG4gICAgICAgICAgICBpZiAoaXNUYXJnZXRSZXN1bHRzW2kgKyAxXSkge1xuICAgICAgICAgICAgICAvLyBpZUNvbmRpdGlvbmFsU3RhcnRDb21tZW50XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNUYXJnZXRSZXN1bHRzW2ldKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGllQ29uZGl0aW9uYWxTdGFydENvbW1lbnQgPSBjaGlsZC5wcmV2O1xuICAgICAgICAgICAgICBjb25zdCBpZUNvbmRpdGlvbmFsRW5kQ29tbWVudCA9IGNoaWxkLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgIGNvbnN0IFBhcnNlU291cmNlU3BhbiA9IGNoaWxkLnNvdXJjZVNwYW4uY29uc3RydWN0b3I7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXJ0U291cmNlU3BhbiA9IG5ldyBQYXJzZVNvdXJjZVNwYW4oaWVDb25kaXRpb25hbFN0YXJ0Q29tbWVudC5zb3VyY2VTcGFuLnN0YXJ0LCBpZUNvbmRpdGlvbmFsRW5kQ29tbWVudC5zb3VyY2VTcGFuLmVuZCk7XG4gICAgICAgICAgICAgIGNvbnN0IHNvdXJjZVNwYW4gPSBuZXcgUGFyc2VTb3VyY2VTcGFuKHN0YXJ0U291cmNlU3Bhbi5zdGFydCwgY2hpbGQuc291cmNlU3Bhbi5lbmQpO1xuICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKGNoaWxkLmNsb25lKHtcbiAgICAgICAgICAgICAgICBjb25kaXRpb246IGllQ29uZGl0aW9uYWxTdGFydENvbW1lbnQuY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgIHNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgICAgc3RhcnRTb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZC5jaGlsZHJlbi5zbGljZSgxKVxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbm9kZS5jbG9uZSh7XG4gICAgICAgICAgICBjaGlsZHJlbjogbmV3Q2hpbGRyZW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTm9kZUludG9UZXh0KGFzdCwgc2hvdWxkTWVyZ2UsIGdldFZhbHVlKSB7XG4gICAgcmV0dXJuIGFzdC5tYXAobm9kZSA9PiB7XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBzaG91bGRNZXJnZVJlc3VsdHMgPSBub2RlLmNoaWxkcmVuLm1hcChzaG91bGRNZXJnZSk7XG5cbiAgICAgICAgaWYgKHNob3VsZE1lcmdlUmVzdWx0cy5zb21lKEJvb2xlYW4pKSB7XG4gICAgICAgICAgY29uc3QgbmV3Q2hpbGRyZW4gPSBbXTtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGQudHlwZSAhPT0gXCJ0ZXh0XCIgJiYgIXNob3VsZE1lcmdlUmVzdWx0c1tpXSkge1xuICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0NoaWxkID0gY2hpbGQudHlwZSA9PT0gXCJ0ZXh0XCIgPyBjaGlsZCA6IGNoaWxkLmNsb25lKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZShjaGlsZClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAobmV3Q2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IG5ld0NoaWxkcmVuW25ld0NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGUgIT09IFwidGV4dFwiKSB7XG4gICAgICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2gobmV3Q2hpbGQpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGFzdENoaWxkID0gbmV3Q2hpbGRyZW4ucG9wKCk7XG4gICAgICAgICAgICBjb25zdCBQYXJzZVNvdXJjZVNwYW4gPSBsYXN0Q2hpbGQuc291cmNlU3Bhbi5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2gobGFzdENoaWxkLmNsb25lKHtcbiAgICAgICAgICAgICAgdmFsdWU6IGxhc3RDaGlsZC52YWx1ZSArIG5ld0NoaWxkLnZhbHVlLFxuICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBuZXcgUGFyc2VTb3VyY2VTcGFuKGxhc3RDaGlsZC5zb3VyY2VTcGFuLnN0YXJ0LCBuZXdDaGlsZC5zb3VyY2VTcGFuLmVuZClcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbm9kZS5jbG9uZSh7XG4gICAgICAgICAgICBjaGlsZHJlbjogbmV3Q2hpbGRyZW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlQ2RhdGFJbnRvVGV4dChhc3RcbiAgLyosIG9wdGlvbnMgKi9cbiAgKSB7XG4gICAgcmV0dXJuIG1lcmdlTm9kZUludG9UZXh0KGFzdCwgbm9kZSA9PiBub2RlLnR5cGUgPT09IFwiY2RhdGFcIiwgbm9kZSA9PiBcIjwhW0NEQVRBW1wiLmNvbmNhdChub2RlLnZhbHVlLCBcIl1dPlwiKSk7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZVNpbXBsZUVsZW1lbnRJbnRvVGV4dChhc3RcbiAgLyosIG9wdGlvbnMgKi9cbiAgKSB7XG4gICAgY29uc3QgaXNTaW1wbGVFbGVtZW50ID0gbm9kZSA9PiBub2RlLnR5cGUgPT09IFwiZWxlbWVudFwiICYmIG5vZGUuYXR0cnMubGVuZ3RoID09PSAwICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG5vZGUuZmlyc3RDaGlsZC50eXBlID09PSBcInRleHRcIiAmJiAvLyBcXHhBMDogbm9uLWJyZWFraW5nIHdoaXRlc3BhY2VcbiAgICAhL1teXFxTXFx4QTBdLy50ZXN0KG5vZGUuY2hpbGRyZW5bMF0udmFsdWUpICYmICFub2RlLmZpcnN0Q2hpbGQuaGFzTGVhZGluZ1NwYWNlcyAmJiAhbm9kZS5maXJzdENoaWxkLmhhc1RyYWlsaW5nU3BhY2VzICYmIG5vZGUuaXNMZWFkaW5nU3BhY2VTZW5zaXRpdmUgJiYgIW5vZGUuaGFzTGVhZGluZ1NwYWNlcyAmJiBub2RlLmlzVHJhaWxpbmdTcGFjZVNlbnNpdGl2ZSAmJiAhbm9kZS5oYXNUcmFpbGluZ1NwYWNlcyAmJiBub2RlLnByZXYgJiYgbm9kZS5wcmV2LnR5cGUgPT09IFwidGV4dFwiICYmIG5vZGUubmV4dCAmJiBub2RlLm5leHQudHlwZSA9PT0gXCJ0ZXh0XCI7XG5cbiAgICByZXR1cm4gYXN0Lm1hcChub2RlID0+IHtcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGlzU2ltcGxlRWxlbWVudFJlc3VsdHMgPSBub2RlLmNoaWxkcmVuLm1hcChpc1NpbXBsZUVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChpc1NpbXBsZUVsZW1lbnRSZXN1bHRzLnNvbWUoQm9vbGVhbikpIHtcbiAgICAgICAgICBjb25zdCBuZXdDaGlsZHJlbiA9IFtdO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG5cbiAgICAgICAgICAgIGlmIChpc1NpbXBsZUVsZW1lbnRSZXN1bHRzW2ldKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IG5ld0NoaWxkcmVuLnBvcCgpO1xuICAgICAgICAgICAgICBjb25zdCBuZXh0Q2hpbGQgPSBub2RlLmNoaWxkcmVuWysraV07XG4gICAgICAgICAgICAgIGNvbnN0IFBhcnNlU291cmNlU3BhbiA9IG5vZGUuc291cmNlU3Bhbi5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGlzVHJhaWxpbmdTcGFjZVNlbnNpdGl2ZSxcbiAgICAgICAgICAgICAgICBoYXNUcmFpbGluZ1NwYWNlc1xuICAgICAgICAgICAgICB9ID0gbmV4dENoaWxkO1xuICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKGxhc3RDaGlsZC5jbG9uZSh7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGxhc3RDaGlsZC52YWx1ZSArIFwiPFwiLmNvbmNhdChjaGlsZC5yYXdOYW1lLCBcIj5cIikgKyBjaGlsZC5maXJzdENoaWxkLnZhbHVlICsgXCI8L1wiLmNvbmNhdChjaGlsZC5yYXdOYW1lLCBcIj5cIikgKyBuZXh0Q2hpbGQudmFsdWUsXG4gICAgICAgICAgICAgICAgc291cmNlU3BhbjogbmV3IFBhcnNlU291cmNlU3BhbihsYXN0Q2hpbGQuc291cmNlU3Bhbi5zdGFydCwgbmV4dENoaWxkLnNvdXJjZVNwYW4uZW5kKSxcbiAgICAgICAgICAgICAgICBpc1RyYWlsaW5nU3BhY2VTZW5zaXRpdmUsXG4gICAgICAgICAgICAgICAgaGFzVHJhaWxpbmdTcGFjZXNcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5vZGUuY2xvbmUoe1xuICAgICAgICAgICAgY2hpbGRyZW46IG5ld0NoaWxkcmVuXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBleHRyYWN0SW50ZXJwb2xhdGlvbihhc3QsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5wYXJzZXIgPT09IFwiaHRtbFwiKSB7XG4gICAgICByZXR1cm4gYXN0O1xuICAgIH1cblxuICAgIGNvbnN0IGludGVycG9sYXRpb25SZWdleCA9IC9cXHtcXHsoW1xcc1xcU10rPylcXH1cXH0vZztcbiAgICByZXR1cm4gYXN0Lm1hcChub2RlID0+IHtcbiAgICAgIGlmICghY2FuSGF2ZUludGVycG9sYXRpb24kMShub2RlKSkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3Q2hpbGRyZW4gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChjaGlsZC50eXBlICE9PSBcInRleHRcIikge1xuICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgUGFyc2VTb3VyY2VTcGFuID0gY2hpbGQuc291cmNlU3Bhbi5jb25zdHJ1Y3RvcjtcbiAgICAgICAgbGV0IHN0YXJ0U291cmNlU3BhbiA9IGNoaWxkLnNvdXJjZVNwYW4uc3RhcnQ7XG4gICAgICAgIGxldCBlbmRTb3VyY2VTcGFuID0gbnVsbDtcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IGNoaWxkLnZhbHVlLnNwbGl0KGludGVycG9sYXRpb25SZWdleCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrLCBzdGFydFNvdXJjZVNwYW4gPSBlbmRTb3VyY2VTcGFuKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjb21wb25lbnRzW2ldO1xuXG4gICAgICAgICAgaWYgKGkgJSAyID09PSAwKSB7XG4gICAgICAgICAgICBlbmRTb3VyY2VTcGFuID0gc3RhcnRTb3VyY2VTcGFuLm1vdmVCeSh2YWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIHNvdXJjZVNwYW46IG5ldyBQYXJzZVNvdXJjZVNwYW4oc3RhcnRTb3VyY2VTcGFuLCBlbmRTb3VyY2VTcGFuKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZW5kU291cmNlU3BhbiA9IHN0YXJ0U291cmNlU3Bhbi5tb3ZlQnkodmFsdWUubGVuZ3RoICsgNCk7IC8vIGB7e2AgKyBgfX1gXG5cbiAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZXJwb2xhdGlvblwiLFxuICAgICAgICAgICAgc291cmNlU3BhbjogbmV3IFBhcnNlU291cmNlU3BhbihzdGFydFNvdXJjZVNwYW4sIGVuZFNvdXJjZVNwYW4pLFxuICAgICAgICAgICAgY2hpbGRyZW46IHZhbHVlLmxlbmd0aCA9PT0gMCA/IFtdIDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBuZXcgUGFyc2VTb3VyY2VTcGFuKHN0YXJ0U291cmNlU3Bhbi5tb3ZlQnkoMiksIGVuZFNvdXJjZVNwYW4ubW92ZUJ5KC0yKSlcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5vZGUuY2xvbmUoe1xuICAgICAgICBjaGlsZHJlbjogbmV3Q2hpbGRyZW5cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiAtIGFkZCBgaGFzTGVhZGluZ1NwYWNlc2AgZmllbGRcbiAgICogLSBhZGQgYGhhc1RyYWlsaW5nU3BhY2VzYCBmaWVsZFxuICAgKiAtIGFkZCBgaGFzRGFuZ2xpbmdTcGFjZXNgIGZpZWxkIGZvciBwYXJlbnQgbm9kZXNcbiAgICogLSBhZGQgYGlzV2hpdGVzcGFjZVNlbnNpdGl2ZWAsIGBpc0luZGVudGF0aW9uU2Vuc2l0aXZlYCBmaWVsZCBmb3IgdGV4dCBub2Rlc1xuICAgKiAtIHJlbW92ZSBpbnNlbnNpdGl2ZSB3aGl0ZXNwYWNlc1xuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGV4dHJhY3RXaGl0ZXNwYWNlcyhhc3RcbiAgLyosIG9wdGlvbnMqL1xuICApIHtcbiAgICBjb25zdCBUWVBFX1dISVRFU1BBQ0UgPSBcIndoaXRlc3BhY2VcIjtcbiAgICByZXR1cm4gYXN0Lm1hcChub2RlID0+IHtcbiAgICAgIGlmICghbm9kZS5jaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG5vZGUuY2hpbGRyZW5bMF0udHlwZSA9PT0gXCJ0ZXh0XCIgJiYgbm9kZS5jaGlsZHJlblswXS52YWx1ZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBub2RlLmNsb25lKHtcbiAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgaGFzRGFuZ2xpbmdTcGFjZXM6IG5vZGUuY2hpbGRyZW4ubGVuZ3RoICE9PSAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc1doaXRlc3BhY2VTZW5zaXRpdmUgPSBpc1doaXRlc3BhY2VTZW5zaXRpdmVOb2RlJDEobm9kZSk7XG4gICAgICBjb25zdCBpc0luZGVudGF0aW9uU2Vuc2l0aXZlID0gaXNJbmRlbnRhdGlvblNlbnNpdGl2ZU5vZGUkMShub2RlKTtcbiAgICAgIHJldHVybiBub2RlLmNsb25lKHtcbiAgICAgICAgaXNXaGl0ZXNwYWNlU2Vuc2l0aXZlLFxuICAgICAgICBpc0luZGVudGF0aW9uU2Vuc2l0aXZlLFxuICAgICAgICBjaGlsZHJlbjogbm9kZS5jaGlsZHJlbiAvLyBleHRyYWN0IHdoaXRlc3BhY2Ugbm9kZXNcbiAgICAgICAgLnJlZHVjZSgobmV3Q2hpbGRyZW4sIGNoaWxkKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLnR5cGUgIT09IFwidGV4dFwiIHx8IGlzV2hpdGVzcGFjZVNlbnNpdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NoaWxkcmVuLmNvbmNhdChjaGlsZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbG9jYWxDaGlsZHJlbiA9IFtdO1xuICAgICAgICAgIGNvbnN0IFssIGxlYWRpbmdTcGFjZXMsIHRleHQsIHRyYWlsaW5nU3BhY2VzXSA9IGNoaWxkLnZhbHVlLm1hdGNoKC9eKFxccyopKFtcXHNcXFNdKj8pKFxccyopJC8pO1xuXG4gICAgICAgICAgaWYgKGxlYWRpbmdTcGFjZXMpIHtcbiAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFRZUEVfV0hJVEVTUEFDRVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgUGFyc2VTb3VyY2VTcGFuID0gY2hpbGQuc291cmNlU3Bhbi5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICBsb2NhbENoaWxkcmVuLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdmFsdWU6IHRleHQsXG4gICAgICAgICAgICAgIHNvdXJjZVNwYW46IG5ldyBQYXJzZVNvdXJjZVNwYW4oY2hpbGQuc291cmNlU3Bhbi5zdGFydC5tb3ZlQnkobGVhZGluZ1NwYWNlcy5sZW5ndGgpLCBjaGlsZC5zb3VyY2VTcGFuLmVuZC5tb3ZlQnkoLXRyYWlsaW5nU3BhY2VzLmxlbmd0aCkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJhaWxpbmdTcGFjZXMpIHtcbiAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFRZUEVfV0hJVEVTUEFDRVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5ld0NoaWxkcmVuLmNvbmNhdChsb2NhbENoaWxkcmVuKTtcbiAgICAgICAgfSwgW10pIC8vIHNldCBoYXNMZWFkaW5nU3BhY2VzL2hhc1RyYWlsaW5nU3BhY2VzIGFuZCBmaWx0ZXIgd2hpdGVzcGFjZSBub2Rlc1xuICAgICAgICAucmVkdWNlKChuZXdDaGlsZHJlbiwgY2hpbGQsIGksIGNoaWxkcmVuKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IFRZUEVfV0hJVEVTUEFDRSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NoaWxkcmVuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGhhc0xlYWRpbmdTcGFjZXMgPSBpICE9PSAwICYmIGNoaWxkcmVuW2kgLSAxXS50eXBlID09PSBUWVBFX1dISVRFU1BBQ0U7XG4gICAgICAgICAgY29uc3QgaGFzVHJhaWxpbmdTcGFjZXMgPSBpICE9PSBjaGlsZHJlbi5sZW5ndGggLSAxICYmIGNoaWxkcmVuW2kgKyAxXS50eXBlID09PSBUWVBFX1dISVRFU1BBQ0U7XG4gICAgICAgICAgcmV0dXJuIG5ld0NoaWxkcmVuLmNvbmNhdChPYmplY3QuYXNzaWduKHt9LCBjaGlsZCwge1xuICAgICAgICAgICAgaGFzTGVhZGluZ1NwYWNlcyxcbiAgICAgICAgICAgIGhhc1RyYWlsaW5nU3BhY2VzXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9LCBbXSlcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkSXNTZWxmQ2xvc2luZyhhc3RcbiAgLyosIG9wdGlvbnMgKi9cbiAgKSB7XG4gICAgcmV0dXJuIGFzdC5tYXAobm9kZSA9PiBPYmplY3QuYXNzaWduKG5vZGUsIHtcbiAgICAgIGlzU2VsZkNsb3Npbmc6ICFub2RlLmNoaWxkcmVuIHx8IG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIgJiYgKG5vZGUudGFnRGVmaW5pdGlvbi5pc1ZvaWQgfHwgLy8gc2VsZi1jbG9zaW5nXG4gICAgICBub2RlLnN0YXJ0U291cmNlU3BhbiA9PT0gbm9kZS5lbmRTb3VyY2VTcGFuKVxuICAgIH0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZEhhc0h0bUNvbXBvbmVudENsb3NpbmdUYWcoYXN0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGFzdC5tYXAobm9kZSA9PiBub2RlLnR5cGUgIT09IFwiZWxlbWVudFwiID8gbm9kZSA6IE9iamVjdC5hc3NpZ24obm9kZSwge1xuICAgICAgaGFzSHRtQ29tcG9uZW50Q2xvc2luZ1RhZzogbm9kZS5lbmRTb3VyY2VTcGFuICYmIC9ePFxccypcXC9cXHMqXFwvXFxzKj4kLy50ZXN0KG9wdGlvbnMub3JpZ2luYWxUZXh0LnNsaWNlKG5vZGUuZW5kU291cmNlU3Bhbi5zdGFydC5vZmZzZXQsIG5vZGUuZW5kU291cmNlU3Bhbi5lbmQub2Zmc2V0KSlcbiAgICB9KSk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRDc3NEaXNwbGF5KGFzdCwgb3B0aW9ucykge1xuICAgIHJldHVybiBhc3QubWFwKG5vZGUgPT4gT2JqZWN0LmFzc2lnbihub2RlLCB7XG4gICAgICBjc3NEaXNwbGF5OiBnZXROb2RlQ3NzU3R5bGVEaXNwbGF5JDEobm9kZSwgb3B0aW9ucylcbiAgICB9KSk7XG4gIH1cbiAgLyoqXG4gICAqIC0gYWRkIGBpc0xlYWRpbmdTcGFjZVNlbnNpdGl2ZWAgZmllbGRcbiAgICogLSBhZGQgYGlzVHJhaWxpbmdTcGFjZVNlbnNpdGl2ZWAgZmllbGRcbiAgICogLSBhZGQgYGlzRGFuZ2xpbmdTcGFjZVNlbnNpdGl2ZWAgZmllbGQgZm9yIHBhcmVudCBub2Rlc1xuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGFkZElzU3BhY2VTZW5zaXRpdmUoYXN0XG4gIC8qLCBvcHRpb25zICovXG4gICkge1xuICAgIHJldHVybiBhc3QubWFwKG5vZGUgPT4ge1xuICAgICAgaWYgKCFub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuY2xvbmUoe1xuICAgICAgICAgIGlzRGFuZ2xpbmdTcGFjZVNlbnNpdGl2ZTogaXNEYW5nbGluZ1NwYWNlU2Vuc2l0aXZlTm9kZSQxKG5vZGUpXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZS5jbG9uZSh7XG4gICAgICAgIGNoaWxkcmVuOiBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNoaWxkLCB7XG4gICAgICAgICAgICBpc0xlYWRpbmdTcGFjZVNlbnNpdGl2ZTogaXNMZWFkaW5nU3BhY2VTZW5zaXRpdmVOb2RlJDEoY2hpbGQpLFxuICAgICAgICAgICAgaXNUcmFpbGluZ1NwYWNlU2Vuc2l0aXZlOiBpc1RyYWlsaW5nU3BhY2VTZW5zaXRpdmVOb2RlJDEoY2hpbGQpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLm1hcCgoY2hpbGQsIGluZGV4LCBjaGlsZHJlbikgPT4gT2JqZWN0LmFzc2lnbih7fSwgY2hpbGQsIHtcbiAgICAgICAgICBpc0xlYWRpbmdTcGFjZVNlbnNpdGl2ZTogaW5kZXggPT09IDAgPyBjaGlsZC5pc0xlYWRpbmdTcGFjZVNlbnNpdGl2ZSA6IGNoaWxkcmVuW2luZGV4IC0gMV0uaXNUcmFpbGluZ1NwYWNlU2Vuc2l0aXZlICYmIGNoaWxkLmlzTGVhZGluZ1NwYWNlU2Vuc2l0aXZlLFxuICAgICAgICAgIGlzVHJhaWxpbmdTcGFjZVNlbnNpdGl2ZTogaW5kZXggPT09IGNoaWxkcmVuLmxlbmd0aCAtIDEgPyBjaGlsZC5pc1RyYWlsaW5nU3BhY2VTZW5zaXRpdmUgOiBjaGlsZHJlbltpbmRleCArIDFdLmlzTGVhZGluZ1NwYWNlU2Vuc2l0aXZlICYmIGNoaWxkLmlzVHJhaWxpbmdTcGFjZVNlbnNpdGl2ZVxuICAgICAgICB9KSlcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHByZXByb2Nlc3NfMSA9IHByZXByb2Nlc3M7XG5cbiAgZnVuY3Rpb24gaGFzUHJhZ21hJDModGV4dCkge1xuICAgIHJldHVybiAvXlxccyo8IS0tXFxzKkAoZm9ybWF0fHByZXR0aWVyKVxccyotLT4vLnRlc3QodGV4dCk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRQcmFnbWEkNSh0ZXh0KSB7XG4gICAgcmV0dXJuIFwiPCEtLSBAZm9ybWF0IC0tPlxcblxcblwiICsgdGV4dC5yZXBsYWNlKC9eXFxzKlxcbi8sIFwiXCIpO1xuICB9XG5cbiAgdmFyIHByYWdtYSQzID0ge1xuICAgIGhhc1ByYWdtYTogaGFzUHJhZ21hJDMsXG4gICAgaW5zZXJ0UHJhZ21hOiBpbnNlcnRQcmFnbWEkNVxuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBidWlsZGVyczoge1xuICAgICAgY29uY2F0OiBjb25jYXQkOCxcbiAgICAgIGdyb3VwOiBncm91cCQ4XG4gICAgfVxuICB9ID0gZG9jdW1lbnQ7XG4gIC8qKlxuICAgKiAgICAgdi1mb3I9XCIuLi4gaW4gLi4uXCJcbiAgICogICAgIHYtZm9yPVwiLi4uIG9mIC4uLlwiXG4gICAqICAgICB2LWZvcj1cIiguLi4sIC4uLikgaW4gLi4uXCJcbiAgICogICAgIHYtZm9yPVwiKC4uLiwgLi4uKSBvZiAuLi5cIlxuICAgKi9cblxuICBmdW5jdGlvbiBwcmludFZ1ZUZvcih2YWx1ZSwgdGV4dFRvRG9jKSB7XG4gICAgY29uc3Qge1xuICAgICAgbGVmdCxcbiAgICAgIG9wZXJhdG9yLFxuICAgICAgcmlnaHRcbiAgICB9ID0gcGFyc2VWdWVGb3IodmFsdWUpO1xuICAgIHJldHVybiBjb25jYXQkOChbZ3JvdXAkOCh0ZXh0VG9Eb2MoXCJmdW5jdGlvbiBfKFwiLmNvbmNhdChsZWZ0LCBcIikge31cIiksIHtcbiAgICAgIHBhcnNlcjogXCJiYWJlbFwiLFxuICAgICAgX19pc1Z1ZUZvckJpbmRpbmdMZWZ0OiB0cnVlXG4gICAgfSkpLCBcIiBcIiwgb3BlcmF0b3IsIFwiIFwiLCB0ZXh0VG9Eb2MocmlnaHQsIHtcbiAgICAgIHBhcnNlcjogXCJfX2pzX2V4cHJlc3Npb25cIlxuICAgIH0pXSk7XG4gIH0gLy8gbW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL2Jsb2IvdjIuNS4xNy9zcmMvY29tcGlsZXIvcGFyc2VyL2luZGV4LmpzI0wzNzAtTDM4N1xuXG5cbiAgZnVuY3Rpb24gcGFyc2VWdWVGb3IodmFsdWUpIHtcbiAgICBjb25zdCBmb3JBbGlhc1JFID0gLyhbXl0qPylcXHMrKGlufG9mKVxccysoW15dKikvO1xuICAgIGNvbnN0IGZvckl0ZXJhdG9yUkUgPSAvLChbXix9XFxdXSopKD86LChbXix9XFxdXSopKT8kLztcbiAgICBjb25zdCBzdHJpcFBhcmVuc1JFID0gL15cXCh8XFwpJC9nO1xuICAgIGNvbnN0IGluTWF0Y2ggPSB2YWx1ZS5tYXRjaChmb3JBbGlhc1JFKTtcblxuICAgIGlmICghaW5NYXRjaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIHJlcy5mb3IgPSBpbk1hdGNoWzNdLnRyaW0oKTtcbiAgICBjb25zdCBhbGlhcyA9IGluTWF0Y2hbMV0udHJpbSgpLnJlcGxhY2Uoc3RyaXBQYXJlbnNSRSwgXCJcIik7XG4gICAgY29uc3QgaXRlcmF0b3JNYXRjaCA9IGFsaWFzLm1hdGNoKGZvckl0ZXJhdG9yUkUpO1xuXG4gICAgaWYgKGl0ZXJhdG9yTWF0Y2gpIHtcbiAgICAgIHJlcy5hbGlhcyA9IGFsaWFzLnJlcGxhY2UoZm9ySXRlcmF0b3JSRSwgXCJcIik7XG4gICAgICByZXMuaXRlcmF0b3IxID0gaXRlcmF0b3JNYXRjaFsxXS50cmltKCk7XG5cbiAgICAgIGlmIChpdGVyYXRvck1hdGNoWzJdKSB7XG4gICAgICAgIHJlcy5pdGVyYXRvcjIgPSBpdGVyYXRvck1hdGNoWzJdLnRyaW0oKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLmFsaWFzID0gYWxpYXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IFwiXCIuY29uY2F0KFtyZXMuYWxpYXMsIHJlcy5pdGVyYXRvcjEsIHJlcy5pdGVyYXRvcjJdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiLFwiKSksXG4gICAgICBvcGVyYXRvcjogaW5NYXRjaFsyXSxcbiAgICAgIHJpZ2h0OiByZXMuZm9yXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50VnVlU2xvdFNjb3BlKHZhbHVlLCB0ZXh0VG9Eb2MpIHtcbiAgICByZXR1cm4gdGV4dFRvRG9jKFwiZnVuY3Rpb24gXyhcIi5jb25jYXQodmFsdWUsIFwiKSB7fVwiKSwge1xuICAgICAgcGFyc2VyOiBcImJhYmVsXCIsXG4gICAgICBfX2lzVnVlU2xvdFNjb3BlOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc1Z1ZUV2ZW50QmluZGluZ0V4cHJlc3Npb24oZXZlbnRCaW5kaW5nVmFsdWUpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL2Jsb2IvdjIuNS4xNy9zcmMvY29tcGlsZXIvY29kZWdlbi9ldmVudHMuanMjTDMtTDRcbiAgICAvLyBhcnJvdyBmdW5jdGlvbiBvciBhbm9ueW1vdXMgZnVuY3Rpb25cbiAgICBjb25zdCBmbkV4cFJFID0gL14oW1xcdyRfXSt8XFwoW14pXSo/XFwpKVxccyo9PnxeZnVuY3Rpb25cXHMqXFwoLzsgLy8gc2ltcGxlIG1lbWJlciBleHByZXNzaW9uIGNoYWluIChhLCBhLmIsIGFbJ2InXSwgYVtcImJcIl0sIGFbMF0sIGFbYl0pXG5cbiAgICBjb25zdCBzaW1wbGVQYXRoUkUgPSAvXltBLVphLXpfJF1bXFx3JF0qKD86XFwuW0EtWmEtel8kXVtcXHckXSp8XFxbJ1teJ10qPyddfFxcW1wiW15cIl0qP1wiXXxcXFtcXGQrXXxcXFtbQS1aYS16XyRdW1xcdyRdKl0pKiQvOyAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL2Jsb2IvdjIuNS4xNy9zcmMvY29tcGlsZXIvaGVscGVycy5qcyNMMTA0XG5cbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50QmluZGluZ1ZhbHVlLnRyaW0oKTtcbiAgICByZXR1cm4gZm5FeHBSRS50ZXN0KHZhbHVlKSB8fCBzaW1wbGVQYXRoUkUudGVzdCh2YWx1ZSk7XG4gIH1cblxuICB2YXIgc3ludGF4VnVlID0ge1xuICAgIGlzVnVlRXZlbnRCaW5kaW5nRXhwcmVzc2lvbixcbiAgICBwcmludFZ1ZUZvcixcbiAgICBwcmludFZ1ZVNsb3RTY29wZVxuICB9O1xuXG4gIGNvbnN0IGludGVnZXJSZWdleCA9IC9eXFxkKyQvO1xuXG4gIGZ1bmN0aW9uIGRlZXBVbmlxdWUoYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkuc29ydCgpLmZpbHRlcigoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlbGVtZW50KSAhPT0gSlNPTi5zdHJpbmdpZnkoYXJyYXlbaW5kZXggLSAxXSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgcGFyc2UkMiA9IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIGRlZXBVbmlxdWUoc3RyaW5nLnNwbGl0KCcsJykubWFwKHBhcnQgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICBwYXJ0LnRyaW0oKS5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIHJlc3VsdC51cmwgPSBlbGVtZW50O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5zbGljZSgwLCBlbGVtZW50Lmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCBwb3N0Zml4ID0gZWxlbWVudFtlbGVtZW50Lmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBpbnRlZ2VyVmFsdWUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICBjb25zdCBmbG9hdFZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHBvc3RmaXggPT09ICd3JyAmJiBpbnRlZ2VyUmVnZXgudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXN1bHQud2lkdGggPSBpbnRlZ2VyVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zdGZpeCA9PT0gJ2gnICYmIGludGVnZXJSZWdleC50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgIHJlc3VsdC5oZWlnaHQgPSBpbnRlZ2VyVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zdGZpeCA9PT0gJ3gnICYmICFOdW1iZXIuaXNOYU4oZmxvYXRWYWx1ZSkpIHtcbiAgICAgICAgICByZXN1bHQuZGVuc2l0eSA9IGZsb2F0VmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzcmNzZXQgZGVzY3JpcHRvcjogXCIuY29uY2F0KGVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKTtcbiAgfTtcblxuICB2YXIgc3RyaW5naWZ5ID0gYXJyYXkgPT4ge1xuICAgIHJldHVybiBbLi4ubmV3IFNldChhcnJheS5tYXAoZWxlbWVudCA9PiB7XG4gICAgICBpZiAoIWVsZW1lbnQudXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVVJMIGlzIHJlcXVpcmVkJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtlbGVtZW50LnVybF07XG5cbiAgICAgIGlmIChlbGVtZW50LndpZHRoKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFwiXCIuY29uY2F0KGVsZW1lbnQud2lkdGgsIFwid1wiKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50LmhlaWdodCkge1xuICAgICAgICByZXN1bHQucHVzaChcIlwiLmNvbmNhdChlbGVtZW50LmhlaWdodCwgXCJoXCIpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQuZGVuc2l0eSkge1xuICAgICAgICByZXN1bHQucHVzaChcIlwiLmNvbmNhdChlbGVtZW50LmRlbnNpdHksIFwieFwiKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQuam9pbignICcpO1xuICAgIH0pKV0uam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgc3Jjc2V0ID0ge1xuICAgIHBhcnNlOiBwYXJzZSQyLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5XG4gIH07XG5cbiAgY29uc3Qge1xuICAgIGJ1aWxkZXJzOiB7XG4gICAgICBjb25jYXQ6IGNvbmNhdCQ5LFxuICAgICAgaWZCcmVhazogaWZCcmVhayQ0LFxuICAgICAgam9pbjogam9pbiQ1LFxuICAgICAgbGluZTogbGluZSQ1XG4gICAgfVxuICB9ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHBhcnNlU3Jjc2V0ID0gc3Jjc2V0LnBhcnNlO1xuXG4gIGZ1bmN0aW9uIHByaW50SW1nU3Jjc2V0KHZhbHVlKSB7XG4gICAgY29uc3Qgc3Jjc2V0ID0gcGFyc2VTcmNzZXQodmFsdWUpO1xuICAgIGNvbnN0IGhhc1cgPSBzcmNzZXQuc29tZShzcmMgPT4gc3JjLndpZHRoKTtcbiAgICBjb25zdCBoYXNIID0gc3Jjc2V0LnNvbWUoc3JjID0+IHNyYy5oZWlnaHQpO1xuICAgIGNvbnN0IGhhc1ggPSBzcmNzZXQuc29tZShzcmMgPT4gc3JjLmRlbnNpdHkpO1xuXG4gICAgaWYgKGhhc1cgKyBoYXNIICsgaGFzWCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1peGVkIGRlc2NyaXB0b3IgaW4gc3Jjc2V0IGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gaGFzVyA/IFwid2lkdGhcIiA6IGhhc0ggPyBcImhlaWdodFwiIDogXCJkZW5zaXR5XCI7XG4gICAgY29uc3QgdW5pdCA9IGhhc1cgPyBcIndcIiA6IGhhc0ggPyBcImhcIiA6IFwieFwiO1xuXG4gICAgY29uc3QgZ2V0TWF4ID0gdmFsdWVzID0+IE1hdGgubWF4KC4uLnZhbHVlcyk7XG5cbiAgICBjb25zdCB1cmxzID0gc3Jjc2V0Lm1hcChzcmMgPT4gc3JjLnVybCk7XG4gICAgY29uc3QgbWF4VXJsTGVuZ3RoID0gZ2V0TWF4KHVybHMubWFwKHVybCA9PiB1cmwubGVuZ3RoKSk7XG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBzcmNzZXQubWFwKHNyYyA9PiBzcmNba2V5XSkubWFwKGRlc2NyaXB0b3IgPT4gZGVzY3JpcHRvciA/IGRlc2NyaXB0b3IudG9TdHJpbmcoKSA6IFwiXCIpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JMZWZ0TGVuZ3RocyA9IGRlc2NyaXB0b3JzLm1hcChkZXNjcmlwdG9yID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZGVzY3JpcHRvci5pbmRleE9mKFwiLlwiKTtcbiAgICAgIHJldHVybiBpbmRleCA9PT0gLTEgPyBkZXNjcmlwdG9yLmxlbmd0aCA6IGluZGV4O1xuICAgIH0pO1xuICAgIGNvbnN0IG1heERlc2NyaXB0b3JMZWZ0TGVuZ3RoID0gZ2V0TWF4KGRlc2NyaXB0b3JMZWZ0TGVuZ3Rocyk7XG4gICAgcmV0dXJuIGpvaW4kNShjb25jYXQkOShbXCIsXCIsIGxpbmUkNV0pLCB1cmxzLm1hcCgodXJsLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBbdXJsXTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1tpbmRleF07XG5cbiAgICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICAgIGNvbnN0IHVybFBhZGRpbmcgPSBtYXhVcmxMZW5ndGggLSB1cmwubGVuZ3RoICsgMTtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvclBhZGRpbmcgPSBtYXhEZXNjcmlwdG9yTGVmdExlbmd0aCAtIGRlc2NyaXB0b3JMZWZ0TGVuZ3Roc1tpbmRleF07XG4gICAgICAgIGNvbnN0IGFsaWdubWVudCA9IFwiIFwiLnJlcGVhdCh1cmxQYWRkaW5nICsgZGVzY3JpcHRvclBhZGRpbmcpO1xuICAgICAgICBwYXJ0cy5wdXNoKGlmQnJlYWskNChhbGlnbm1lbnQsIFwiIFwiKSwgZGVzY3JpcHRvciArIHVuaXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uY2F0JDkocGFydHMpO1xuICAgIH0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50Q2xhc3NOYW1lcyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS50cmltKCkuc3BsaXQoL1xccysvKS5qb2luKFwiIFwiKTtcbiAgfVxuXG4gIHZhciBzeW50YXhBdHRyaWJ1dGUgPSB7XG4gICAgcHJpbnRJbWdTcmNzZXQsXG4gICAgcHJpbnRDbGFzc05hbWVzXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIGJ1aWxkZXJzLFxuICAgIHV0aWxzOiB7XG4gICAgICBzdHJpcFRyYWlsaW5nSGFyZGxpbmU6IHN0cmlwVHJhaWxpbmdIYXJkbGluZSQxLFxuICAgICAgbWFwRG9jOiBtYXBEb2MkMlxuICAgIH1cbiAgfSA9IGRvY3VtZW50O1xuICBjb25zdCB7XG4gICAgYnJlYWtQYXJlbnQ6IGJyZWFrUGFyZW50JDIsXG4gICAgZGVkZW50VG9Sb290OiBkZWRlbnRUb1Jvb3QkMSxcbiAgICBmaWxsOiBmaWxsJDMsXG4gICAgZ3JvdXA6IGdyb3VwJDksXG4gICAgaGFyZGxpbmU6IGhhcmRsaW5lJDcsXG4gICAgaWZCcmVhazogaWZCcmVhayQ1LFxuICAgIGluZGVudDogaW5kZW50JDUsXG4gICAgam9pbjogam9pbiQ2LFxuICAgIGxpbmU6IGxpbmUkNixcbiAgICBsaXRlcmFsbGluZTogbGl0ZXJhbGxpbmUkMixcbiAgICBtYXJrQXNSb290OiBtYXJrQXNSb290JDIsXG4gICAgc29mdGxpbmU6IHNvZnRsaW5lJDRcbiAgfSA9IGJ1aWxkZXJzO1xuICBjb25zdCB7XG4gICAgY291bnRDaGFyczogY291bnRDaGFycyQxLFxuICAgIGNvdW50UGFyZW50czogY291bnRQYXJlbnRzJDEsXG4gICAgZGVkZW50U3RyaW5nOiBkZWRlbnRTdHJpbmckMSxcbiAgICBmb3JjZUJyZWFrQ2hpbGRyZW46IGZvcmNlQnJlYWtDaGlsZHJlbiQxLFxuICAgIGZvcmNlQnJlYWtDb250ZW50OiBmb3JjZUJyZWFrQ29udGVudCQxLFxuICAgIGZvcmNlTmV4dEVtcHR5TGluZTogZm9yY2VOZXh0RW1wdHlMaW5lJDEsXG4gICAgZ2V0TGFzdERlc2NlbmRhbnQ6IGdldExhc3REZXNjZW5kYW50JDEsXG4gICAgZ2V0UHJldHRpZXJJZ25vcmVBdHRyaWJ1dGVDb21tZW50RGF0YTogZ2V0UHJldHRpZXJJZ25vcmVBdHRyaWJ1dGVDb21tZW50RGF0YSQxLFxuICAgIGhhc1ByZXR0aWVySWdub3JlOiBoYXNQcmV0dGllcklnbm9yZSQzLFxuICAgIGluZmVyU2NyaXB0UGFyc2VyOiBpbmZlclNjcmlwdFBhcnNlciQxLFxuICAgIGlzU2NyaXB0TGlrZVRhZzogaXNTY3JpcHRMaWtlVGFnJDEsXG4gICAgaXNUZXh0TGlrZU5vZGU6IGlzVGV4dExpa2VOb2RlJDEsXG4gICAgbm9ybWFsaXplUGFydHM6IG5vcm1hbGl6ZVBhcnRzJDEsXG4gICAgcHJlZmVySGFyZGxpbmVBc0xlYWRpbmdTcGFjZXM6IHByZWZlckhhcmRsaW5lQXNMZWFkaW5nU3BhY2VzJDEsXG4gICAgc2hvdWxkTm90UHJpbnRDbG9zaW5nVGFnOiBzaG91bGROb3RQcmludENsb3NpbmdUYWckMSxcbiAgICBzaG91bGRQcmVzZXJ2ZUNvbnRlbnQ6IHNob3VsZFByZXNlcnZlQ29udGVudCQxLFxuICAgIHVuZXNjYXBlUXVvdGVFbnRpdGllczogdW5lc2NhcGVRdW90ZUVudGl0aWVzJDFcbiAgfSA9IHV0aWxzJDQ7XG4gIGNvbnN0IHtcbiAgICByZXBsYWNlRW5kT2ZMaW5lV2l0aDogcmVwbGFjZUVuZE9mTGluZVdpdGgkMVxuICB9ID0gdXRpbCQxO1xuICBjb25zdCB7XG4gICAgaW5zZXJ0UHJhZ21hOiBpbnNlcnRQcmFnbWEkNlxuICB9ID0gcHJhZ21hJDM7XG4gIGNvbnN0IHtcbiAgICBwcmludFZ1ZUZvcjogcHJpbnRWdWVGb3IkMSxcbiAgICBwcmludFZ1ZVNsb3RTY29wZTogcHJpbnRWdWVTbG90U2NvcGUkMSxcbiAgICBpc1Z1ZUV2ZW50QmluZGluZ0V4cHJlc3Npb246IGlzVnVlRXZlbnRCaW5kaW5nRXhwcmVzc2lvbiQxXG4gIH0gPSBzeW50YXhWdWU7XG4gIGNvbnN0IHtcbiAgICBwcmludEltZ1NyY3NldDogcHJpbnRJbWdTcmNzZXQkMSxcbiAgICBwcmludENsYXNzTmFtZXM6IHByaW50Q2xhc3NOYW1lcyQxXG4gIH0gPSBzeW50YXhBdHRyaWJ1dGU7XG5cbiAgZnVuY3Rpb24gY29uY2F0JGEocGFydHMpIHtcbiAgICBjb25zdCBuZXdQYXJ0cyA9IG5vcm1hbGl6ZVBhcnRzJDEocGFydHMpO1xuICAgIHJldHVybiBuZXdQYXJ0cy5sZW5ndGggPT09IDAgPyBcIlwiIDogbmV3UGFydHMubGVuZ3RoID09PSAxID8gbmV3UGFydHNbMF0gOiBidWlsZGVycy5jb25jYXQobmV3UGFydHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gZW1iZWQkMihwYXRoLCBwcmludCwgdGV4dFRvRG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGlzU2NyaXB0TGlrZVRhZyQxKG5vZGUucGFyZW50KSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gaW5mZXJTY3JpcHRQYXJzZXIkMShub2RlLnBhcmVudCk7XG5cbiAgICAgICAgICAgIGlmIChwYXJzZXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZXIgPT09IFwibWFya2Rvd25cIiA/IGRlZGVudFN0cmluZyQxKG5vZGUudmFsdWUucmVwbGFjZSgvXlteXFxTXFxuXSo/XFxuLywgXCJcIikpIDogbm9kZS52YWx1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXJzLmNvbmNhdChbY29uY2F0JGEoW2JyZWFrUGFyZW50JDIsIHByaW50T3BlbmluZ1RhZ1ByZWZpeChub2RlLCBvcHRpb25zKSwgc3RyaXBUcmFpbGluZ0hhcmRsaW5lJDEodGV4dFRvRG9jKHZhbHVlLCB7XG4gICAgICAgICAgICAgICAgcGFyc2VyXG4gICAgICAgICAgICAgIH0pKSwgcHJpbnRDbG9zaW5nVGFnU3VmZml4KG5vZGUsIG9wdGlvbnMpXSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUucGFyZW50LnR5cGUgPT09IFwiaW50ZXJwb2xhdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGEoW2luZGVudCQ1KGNvbmNhdCRhKFtsaW5lJDYsIHRleHRUb0RvYyhub2RlLnZhbHVlLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgX19pc0luSHRtbEludGVycG9sYXRpb246IHRydWVcbiAgICAgICAgICAgIH0sIG9wdGlvbnMucGFyc2VyID09PSBcImFuZ3VsYXJcIiA/IHtcbiAgICAgICAgICAgICAgcGFyc2VyOiBcIl9fbmdfaW50ZXJwb2xhdGlvblwiLFxuICAgICAgICAgICAgICB0cmFpbGluZ0NvbW1hOiBcIm5vbmVcIlxuICAgICAgICAgICAgfSA6IG9wdGlvbnMucGFyc2VyID09PSBcInZ1ZVwiID8ge1xuICAgICAgICAgICAgICBwYXJzZXI6IFwiX192dWVfZXhwcmVzc2lvblwiXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICBwYXJzZXI6IFwiX19qc19leHByZXNzaW9uXCJcbiAgICAgICAgICAgIH0pKV0pKSwgbm9kZS5wYXJlbnQubmV4dCAmJiBuZWVkc1RvQm9ycm93UHJldkNsb3NpbmdUYWdFbmRNYXJrZXIobm9kZS5wYXJlbnQubmV4dCkgPyBcIiBcIiA6IGxpbmUkNl0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJhdHRyaWJ1dGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICghbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSAvLyBsaXQtaHRtbDogaHRtbGA8bXktZWxlbWVudCBvYmo9JHtvYmp9PjwvbXktZWxlbWVudD5gXG5cblxuICAgICAgICAgIGlmICgvXlBSRVRUSUVSX0hUTUxfUExBQ0VIT0xERVJfXFxkK19cXGQrX0lOX0pTJC8udGVzdChvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShub2RlLnZhbHVlU3Bhbi5zdGFydC5vZmZzZXQsIG5vZGUudmFsdWVTcGFuLmVuZC5vZmZzZXQpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRhKFtub2RlLnJhd05hbWUsIFwiPVwiLCBub2RlLnZhbHVlXSk7XG4gICAgICAgICAgfSAvLyBsd2M6IGh0bWxgPG15LWVsZW1lbnQgZGF0YS1mb3I9e3ZhbHVlfT48L215LWVsZW1lbnQ+YFxuXG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZXIgPT09IFwibHdjXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb25SZWdleCA9IC9eXFx7W1xcc1xcU10qXFx9JC87XG5cbiAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0aW9uUmVnZXgudGVzdChvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShub2RlLnZhbHVlU3Bhbi5zdGFydC5vZmZzZXQsIG5vZGUudmFsdWVTcGFuLmVuZC5vZmZzZXQpKSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29uY2F0JGEoW25vZGUucmF3TmFtZSwgXCI9XCIsIG5vZGUudmFsdWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbWJlZGRlZEF0dHJpYnV0ZVZhbHVlRG9jID0gcHJpbnRFbWJlZGRlZEF0dHJpYnV0ZVZhbHVlKG5vZGUsIChjb2RlLCBvcHRzKSA9PiAvLyBzdHJpY3RseSBwcmVmZXIgc2luZ2xlIHF1b3RlIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGh0bWwgZW50aXR5IGVzY2FwZVxuICAgICAgICAgIHRleHRUb0RvYyhjb2RlLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIF9faXNJbkh0bWxBdHRyaWJ1dGU6IHRydWVcbiAgICAgICAgICB9LCBvcHRzKSksIG9wdGlvbnMpO1xuXG4gICAgICAgICAgaWYgKGVtYmVkZGVkQXR0cmlidXRlVmFsdWVEb2MpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jYXQkYShbbm9kZS5yYXdOYW1lLCAnPVwiJywgZ3JvdXAkOShtYXBEb2MkMihlbWJlZGRlZEF0dHJpYnV0ZVZhbHVlRG9jLCBkb2MgPT4gdHlwZW9mIGRvYyA9PT0gXCJzdHJpbmdcIiA/IGRvYy5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKSA6IGRvYykpLCAnXCInXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInlhbWxcIjpcbiAgICAgICAgcmV0dXJuIG1hcmtBc1Jvb3QkMihjb25jYXQkYShbXCItLS1cIiwgaGFyZGxpbmUkNywgbm9kZS52YWx1ZS50cmltKCkubGVuZ3RoID09PSAwID8gXCJcIiA6IHRleHRUb0RvYyhub2RlLnZhbHVlLCB7XG4gICAgICAgICAgcGFyc2VyOiBcInlhbWxcIlxuICAgICAgICB9KSwgXCItLS1cIl0pKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmljUHJpbnQkMihwYXRoLCBvcHRpb25zLCBwcmludCkge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG5cbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcInJvb3RcIjpcbiAgICAgICAgaWYgKG9wdGlvbnMuX19vbkh0bWxSb290KSB7XG4gICAgICAgICAgb3B0aW9ucy5fX29uSHRtbFJvb3Qobm9kZSk7XG4gICAgICAgIH0gLy8gdXNlIG9yaWdpbmFsIGNvbmNhdCB0byBub3QgYnJlYWsgc3RyaXBUcmFpbGluZ0hhcmRsaW5lXG5cblxuICAgICAgICByZXR1cm4gYnVpbGRlcnMuY29uY2F0KFtncm91cCQ5KHByaW50Q2hpbGRyZW4kMShwYXRoLCBvcHRpb25zLCBwcmludCkpLCBoYXJkbGluZSQ3XSk7XG5cbiAgICAgIGNhc2UgXCJlbGVtZW50XCI6XG4gICAgICBjYXNlIFwiaWVDb25kaXRpb25hbENvbW1lbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIGRvIG5vdCBicmVhazpcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqICAgICA8ZGl2Pnt7XG4gICAgICAgICAgICogICAgICAgICB+XG4gICAgICAgICAgICogICAgICAgaW50ZXJwb2xhdGlvblxuICAgICAgICAgICAqICAgICB9fTwvZGl2PlxuICAgICAgICAgICAqICAgICAgICAgICAgflxuICAgICAgICAgICAqXG4gICAgICAgICAgICogZXhjZXB0aW9uOiBicmVhayBpZiB0aGUgb3BlbmluZyB0YWcgYnJlYWtzXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiAgICAgPGRpdlxuICAgICAgICAgICAqICAgICAgIGxvbmdcbiAgICAgICAgICAgKiAgICAgICAgICAgflxuICAgICAgICAgICAqICAgICAgID57e1xuICAgICAgICAgICAqICAgICAgICAgaW50ZXJwb2xhdGlvblxuICAgICAgICAgICAqICAgICAgIH19PC9kaXZcbiAgICAgICAgICAgKiAgICAgICAgICAgICAgflxuICAgICAgICAgICAqICAgICA+XG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3Qgc2hvdWxkSHVnQ29udGVudCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG5vZGUuZmlyc3RDaGlsZC50eXBlID09PSBcImludGVycG9sYXRpb25cIiAmJiBub2RlLmZpcnN0Q2hpbGQuaXNMZWFkaW5nU3BhY2VTZW5zaXRpdmUgJiYgIW5vZGUuZmlyc3RDaGlsZC5oYXNMZWFkaW5nU3BhY2VzICYmIG5vZGUubGFzdENoaWxkLmlzVHJhaWxpbmdTcGFjZVNlbnNpdGl2ZSAmJiAhbm9kZS5sYXN0Q2hpbGQuaGFzVHJhaWxpbmdTcGFjZXM7XG4gICAgICAgICAgY29uc3QgYXR0ckdyb3VwSWQgPSBTeW1ib2woXCJlbGVtZW50LWF0dHItZ3JvdXAtaWRcIik7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRhKFtncm91cCQ5KGNvbmNhdCRhKFtncm91cCQ5KHByaW50T3BlbmluZ1RhZyhwYXRoLCBvcHRpb25zLCBwcmludCksIHtcbiAgICAgICAgICAgIGlkOiBhdHRyR3JvdXBJZFxuICAgICAgICAgIH0pLCBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCA/IG5vZGUuaGFzRGFuZ2xpbmdTcGFjZXMgJiYgbm9kZS5pc0RhbmdsaW5nU3BhY2VTZW5zaXRpdmUgPyBsaW5lJDYgOiBcIlwiIDogY29uY2F0JGEoW2ZvcmNlQnJlYWtDb250ZW50JDEobm9kZSkgPyBicmVha1BhcmVudCQyIDogXCJcIiwgKGNoaWxkcmVuRG9jID0+IHNob3VsZEh1Z0NvbnRlbnQgPyBpZkJyZWFrJDUoaW5kZW50JDUoY2hpbGRyZW5Eb2MpLCBjaGlsZHJlbkRvYywge1xuICAgICAgICAgICAgZ3JvdXBJZDogYXR0ckdyb3VwSWRcbiAgICAgICAgICB9KSA6IGlzU2NyaXB0TGlrZVRhZyQxKG5vZGUpICYmIG5vZGUucGFyZW50LnR5cGUgPT09IFwicm9vdFwiICYmIG9wdGlvbnMucGFyc2VyID09PSBcInZ1ZVwiICYmICFvcHRpb25zLnZ1ZUluZGVudFNjcmlwdEFuZFN0eWxlID8gY2hpbGRyZW5Eb2MgOiBpbmRlbnQkNShjaGlsZHJlbkRvYykpKGNvbmNhdCRhKFtzaG91bGRIdWdDb250ZW50ID8gaWZCcmVhayQ1KHNvZnRsaW5lJDQsIFwiXCIsIHtcbiAgICAgICAgICAgIGdyb3VwSWQ6IGF0dHJHcm91cElkXG4gICAgICAgICAgfSkgOiBub2RlLmZpcnN0Q2hpbGQuaGFzTGVhZGluZ1NwYWNlcyAmJiBub2RlLmZpcnN0Q2hpbGQuaXNMZWFkaW5nU3BhY2VTZW5zaXRpdmUgPyBsaW5lJDYgOiBub2RlLmZpcnN0Q2hpbGQudHlwZSA9PT0gXCJ0ZXh0XCIgJiYgbm9kZS5pc1doaXRlc3BhY2VTZW5zaXRpdmUgJiYgbm9kZS5pc0luZGVudGF0aW9uU2Vuc2l0aXZlID8gZGVkZW50VG9Sb290JDEoc29mdGxpbmUkNCkgOiBzb2Z0bGluZSQ0LCBwcmludENoaWxkcmVuJDEocGF0aCwgb3B0aW9ucywgcHJpbnQpXSkpLCAobm9kZS5uZXh0ID8gbmVlZHNUb0JvcnJvd1ByZXZDbG9zaW5nVGFnRW5kTWFya2VyKG5vZGUubmV4dCkgOiBuZWVkc1RvQm9ycm93TGFzdENoaWxkQ2xvc2luZ1RhZ0VuZE1hcmtlcihub2RlLnBhcmVudCkpID8gbm9kZS5sYXN0Q2hpbGQuaGFzVHJhaWxpbmdTcGFjZXMgJiYgbm9kZS5sYXN0Q2hpbGQuaXNUcmFpbGluZ1NwYWNlU2Vuc2l0aXZlID8gXCIgXCIgOiBcIlwiIDogc2hvdWxkSHVnQ29udGVudCA/IGlmQnJlYWskNShzb2Z0bGluZSQ0LCBcIlwiLCB7XG4gICAgICAgICAgICBncm91cElkOiBhdHRyR3JvdXBJZFxuICAgICAgICAgIH0pIDogbm9kZS5sYXN0Q2hpbGQuaGFzVHJhaWxpbmdTcGFjZXMgJiYgbm9kZS5sYXN0Q2hpbGQuaXNUcmFpbGluZ1NwYWNlU2Vuc2l0aXZlID8gbGluZSQ2IDogKG5vZGUubGFzdENoaWxkLnR5cGUgPT09IFwiY29tbWVudFwiIHx8IG5vZGUubGFzdENoaWxkLnR5cGUgPT09IFwidGV4dFwiICYmIG5vZGUuaXNXaGl0ZXNwYWNlU2Vuc2l0aXZlICYmIG5vZGUuaXNJbmRlbnRhdGlvblNlbnNpdGl2ZSkgJiYgbmV3IFJlZ0V4cChcIlxcXFxuXFxcXHN7XCIuY29uY2F0KG9wdGlvbnMudGFiV2lkdGggKiBjb3VudFBhcmVudHMkMShwYXRoLCBuID0+IG4ucGFyZW50ICYmIG4ucGFyZW50LnR5cGUgIT09IFwicm9vdFwiKSwgXCJ9JFwiKSkudGVzdChub2RlLmxhc3RDaGlsZC52YWx1ZSkgP1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqICAgICA8ZGl2PlxuICAgICAgICAgICAqICAgICAgIDxwcmU+XG4gICAgICAgICAgICogICAgICAgICBzb21ldGhpbmdcbiAgICAgICAgICAgKiAgICAgICA8L3ByZT5cbiAgICAgICAgICAgKiAgICAgICAgICAgIH5cbiAgICAgICAgICAgKiAgICAgPC9kaXY+XG4gICAgICAgICAgICovXG4gICAgICAgICAgXCJcIiA6IHNvZnRsaW5lJDRdKV0pKSwgcHJpbnRDbG9zaW5nVGFnKG5vZGUsIG9wdGlvbnMpXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcImllQ29uZGl0aW9uYWxTdGFydENvbW1lbnRcIjpcbiAgICAgIGNhc2UgXCJpZUNvbmRpdGlvbmFsRW5kQ29tbWVudFwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGEoW3ByaW50T3BlbmluZ1RhZ1N0YXJ0KG5vZGUpLCBwcmludENsb3NpbmdUYWdFbmQobm9kZSldKTtcblxuICAgICAgY2FzZSBcImludGVycG9sYXRpb25cIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRhKFtwcmludE9wZW5pbmdUYWdTdGFydChub2RlLCBvcHRpb25zKSwgY29uY2F0JGEocGF0aC5tYXAocHJpbnQsIFwiY2hpbGRyZW5cIikpLCBwcmludENsb3NpbmdUYWdFbmQobm9kZSwgb3B0aW9ucyldKTtcblxuICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChub2RlLnBhcmVudC50eXBlID09PSBcImludGVycG9sYXRpb25cIikge1xuICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgdHJhaWxpbmcgbGl0ZXJhbGxpbmUgd2l0aCBoYXJkbGluZSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5XG4gICAgICAgICAgICBjb25zdCB0cmFpbGluZ05ld2xpbmVSZWdleCA9IC9cXG5bXlxcU1xcbl0qPyQvO1xuICAgICAgICAgICAgY29uc3QgaGFzVHJhaWxpbmdOZXdsaW5lID0gdHJhaWxpbmdOZXdsaW5lUmVnZXgudGVzdChub2RlLnZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGFzVHJhaWxpbmdOZXdsaW5lID8gbm9kZS52YWx1ZS5yZXBsYWNlKHRyYWlsaW5nTmV3bGluZVJlZ2V4LCBcIlwiKSA6IG5vZGUudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGEoW2NvbmNhdCRhKHJlcGxhY2VFbmRPZkxpbmVXaXRoJDEodmFsdWUsIGxpdGVyYWxsaW5lJDIpKSwgaGFzVHJhaWxpbmdOZXdsaW5lID8gaGFyZGxpbmUkNyA6IFwiXCJdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmlsbCQzKG5vcm1hbGl6ZVBhcnRzJDEoW10uY29uY2F0KHByaW50T3BlbmluZ1RhZ1ByZWZpeChub2RlLCBvcHRpb25zKSwgZ2V0VGV4dFZhbHVlUGFydHMobm9kZSksIHByaW50Q2xvc2luZ1RhZ1N1ZmZpeChub2RlLCBvcHRpb25zKSkpKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiZG9jVHlwZVwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGEoW2dyb3VwJDkoY29uY2F0JGEoW3ByaW50T3BlbmluZ1RhZ1N0YXJ0KG5vZGUsIG9wdGlvbnMpLCBcIiBcIiwgbm9kZS52YWx1ZS5yZXBsYWNlKC9eaHRtbFxcYi9pLCBcImh0bWxcIikucmVwbGFjZSgvXFxzKy9nLCBcIiBcIildKSksIHByaW50Q2xvc2luZ1RhZ0VuZChub2RlLCBvcHRpb25zKV0pO1xuXG4gICAgICBjYXNlIFwiY29tbWVudFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRhKFtwcmludE9wZW5pbmdUYWdQcmVmaXgobm9kZSwgb3B0aW9ucyksIGNvbmNhdCRhKHJlcGxhY2VFbmRPZkxpbmVXaXRoJDEob3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2Uob3B0aW9ucy5sb2NTdGFydChub2RlKSwgb3B0aW9ucy5sb2NFbmQobm9kZSkpLCBsaXRlcmFsbGluZSQyKSksIHByaW50Q2xvc2luZ1RhZ1N1ZmZpeChub2RlLCBvcHRpb25zKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJhdHRyaWJ1dGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChub2RlLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5yYXdOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdW5lc2NhcGVRdW90ZUVudGl0aWVzJDEobm9kZS52YWx1ZSk7XG4gICAgICAgICAgY29uc3Qgc2luZ2xlUXVvdGVDb3VudCA9IGNvdW50Q2hhcnMkMSh2YWx1ZSwgXCInXCIpO1xuICAgICAgICAgIGNvbnN0IGRvdWJsZVF1b3RlQ291bnQgPSBjb3VudENoYXJzJDEodmFsdWUsICdcIicpO1xuICAgICAgICAgIGNvbnN0IHF1b3RlID0gc2luZ2xlUXVvdGVDb3VudCA8IGRvdWJsZVF1b3RlQ291bnQgPyBcIidcIiA6ICdcIic7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRhKFtub2RlLnJhd05hbWUsIGNvbmNhdCRhKFtcIj1cIiwgcXVvdGUsIGNvbmNhdCRhKHJlcGxhY2VFbmRPZkxpbmVXaXRoJDEocXVvdGUgPT09ICdcIicgPyB2YWx1ZS5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKSA6IHZhbHVlLnJlcGxhY2UoLycvZywgXCImYXBvcztcIiksIGxpdGVyYWxsaW5lJDIpKSwgcXVvdGVdKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJ5YW1sXCI6XG4gICAgICBjYXNlIFwidG9tbFwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGEocmVwbGFjZUVuZE9mTGluZVdpdGgkMShub2RlLnJhdywgbGl0ZXJhbGxpbmUkMikpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIG5vZGUgdHlwZSBcIi5jb25jYXQobm9kZS50eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRDaGlsZHJlbiQxKHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcblxuICAgIGlmIChmb3JjZUJyZWFrQ2hpbGRyZW4kMShub2RlKSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCRhKFticmVha1BhcmVudCQyLCBjb25jYXQkYShwYXRoLm1hcChjaGlsZFBhdGggPT4ge1xuICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBjaGlsZFBhdGguZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgcHJldkJldHdlZW5MaW5lID0gIWNoaWxkTm9kZS5wcmV2ID8gXCJcIiA6IHByaW50QmV0d2VlbkxpbmUoY2hpbGROb2RlLnByZXYsIGNoaWxkTm9kZSk7XG4gICAgICAgIHJldHVybiBjb25jYXQkYShbIXByZXZCZXR3ZWVuTGluZSA/IFwiXCIgOiBjb25jYXQkYShbcHJldkJldHdlZW5MaW5lLCBmb3JjZU5leHRFbXB0eUxpbmUkMShjaGlsZE5vZGUucHJldikgPyBoYXJkbGluZSQ3IDogXCJcIl0pLCBwcmludENoaWxkKGNoaWxkUGF0aCldKTtcbiAgICAgIH0sIFwiY2hpbGRyZW5cIikpXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBJZHMgPSBub2RlLmNoaWxkcmVuLm1hcCgoKSA9PiBTeW1ib2woXCJcIikpO1xuICAgIHJldHVybiBjb25jYXQkYShwYXRoLm1hcCgoY2hpbGRQYXRoLCBjaGlsZEluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZE5vZGUgPSBjaGlsZFBhdGguZ2V0VmFsdWUoKTtcblxuICAgICAgaWYgKGlzVGV4dExpa2VOb2RlJDEoY2hpbGROb2RlKSkge1xuICAgICAgICBpZiAoY2hpbGROb2RlLnByZXYgJiYgaXNUZXh0TGlrZU5vZGUkMShjaGlsZE5vZGUucHJldikpIHtcbiAgICAgICAgICBjb25zdCBwcmV2QmV0d2VlbkxpbmUgPSBwcmludEJldHdlZW5MaW5lKGNoaWxkTm9kZS5wcmV2LCBjaGlsZE5vZGUpO1xuXG4gICAgICAgICAgaWYgKHByZXZCZXR3ZWVuTGluZSkge1xuICAgICAgICAgICAgaWYgKGZvcmNlTmV4dEVtcHR5TGluZSQxKGNoaWxkTm9kZS5wcmV2KSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29uY2F0JGEoW2hhcmRsaW5lJDcsIGhhcmRsaW5lJDcsIHByaW50Q2hpbGQoY2hpbGRQYXRoKV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGEoW3ByZXZCZXR3ZWVuTGluZSwgcHJpbnRDaGlsZChjaGlsZFBhdGgpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByaW50Q2hpbGQoY2hpbGRQYXRoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldlBhcnRzID0gW107XG4gICAgICBjb25zdCBsZWFkaW5nUGFydHMgPSBbXTtcbiAgICAgIGNvbnN0IHRyYWlsaW5nUGFydHMgPSBbXTtcbiAgICAgIGNvbnN0IG5leHRQYXJ0cyA9IFtdO1xuICAgICAgY29uc3QgcHJldkJldHdlZW5MaW5lID0gY2hpbGROb2RlLnByZXYgPyBwcmludEJldHdlZW5MaW5lKGNoaWxkTm9kZS5wcmV2LCBjaGlsZE5vZGUpIDogXCJcIjtcbiAgICAgIGNvbnN0IG5leHRCZXR3ZWVuTGluZSA9IGNoaWxkTm9kZS5uZXh0ID8gcHJpbnRCZXR3ZWVuTGluZShjaGlsZE5vZGUsIGNoaWxkTm9kZS5uZXh0KSA6IFwiXCI7XG5cbiAgICAgIGlmIChwcmV2QmV0d2VlbkxpbmUpIHtcbiAgICAgICAgaWYgKGZvcmNlTmV4dEVtcHR5TGluZSQxKGNoaWxkTm9kZS5wcmV2KSkge1xuICAgICAgICAgIHByZXZQYXJ0cy5wdXNoKGhhcmRsaW5lJDcsIGhhcmRsaW5lJDcpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZXZCZXR3ZWVuTGluZSA9PT0gaGFyZGxpbmUkNykge1xuICAgICAgICAgIHByZXZQYXJ0cy5wdXNoKGhhcmRsaW5lJDcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc1RleHRMaWtlTm9kZSQxKGNoaWxkTm9kZS5wcmV2KSkge1xuICAgICAgICAgICAgbGVhZGluZ1BhcnRzLnB1c2gocHJldkJldHdlZW5MaW5lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGVhZGluZ1BhcnRzLnB1c2goaWZCcmVhayQ1KFwiXCIsIHNvZnRsaW5lJDQsIHtcbiAgICAgICAgICAgICAgZ3JvdXBJZDogZ3JvdXBJZHNbY2hpbGRJbmRleCAtIDFdXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0QmV0d2VlbkxpbmUpIHtcbiAgICAgICAgaWYgKGZvcmNlTmV4dEVtcHR5TGluZSQxKGNoaWxkTm9kZSkpIHtcbiAgICAgICAgICBpZiAoaXNUZXh0TGlrZU5vZGUkMShjaGlsZE5vZGUubmV4dCkpIHtcbiAgICAgICAgICAgIG5leHRQYXJ0cy5wdXNoKGhhcmRsaW5lJDcsIGhhcmRsaW5lJDcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChuZXh0QmV0d2VlbkxpbmUgPT09IGhhcmRsaW5lJDcpIHtcbiAgICAgICAgICBpZiAoaXNUZXh0TGlrZU5vZGUkMShjaGlsZE5vZGUubmV4dCkpIHtcbiAgICAgICAgICAgIG5leHRQYXJ0cy5wdXNoKGhhcmRsaW5lJDcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cmFpbGluZ1BhcnRzLnB1c2gobmV4dEJldHdlZW5MaW5lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uY2F0JGEoW10uY29uY2F0KHByZXZQYXJ0cywgZ3JvdXAkOShjb25jYXQkYShbY29uY2F0JGEobGVhZGluZ1BhcnRzKSwgZ3JvdXAkOShjb25jYXQkYShbcHJpbnRDaGlsZChjaGlsZFBhdGgpLCBjb25jYXQkYSh0cmFpbGluZ1BhcnRzKV0pLCB7XG4gICAgICAgIGlkOiBncm91cElkc1tjaGlsZEluZGV4XVxuICAgICAgfSldKSksIG5leHRQYXJ0cykpO1xuICAgIH0sIFwiY2hpbGRyZW5cIikpO1xuXG4gICAgZnVuY3Rpb24gcHJpbnRDaGlsZChjaGlsZFBhdGgpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRQYXRoLmdldFZhbHVlKCk7XG5cbiAgICAgIGlmIChoYXNQcmV0dGllcklnbm9yZSQzKGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gY29uY2F0JGEoW10uY29uY2F0KHByaW50T3BlbmluZ1RhZ1ByZWZpeChjaGlsZCwgb3B0aW9ucyksIHJlcGxhY2VFbmRPZkxpbmVXaXRoJDEob3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2Uob3B0aW9ucy5sb2NTdGFydChjaGlsZCkgKyAoY2hpbGQucHJldiAmJiBuZWVkc1RvQm9ycm93TmV4dE9wZW5pbmdUYWdTdGFydE1hcmtlcihjaGlsZC5wcmV2KSA/IHByaW50T3BlbmluZ1RhZ1N0YXJ0TWFya2VyKGNoaWxkKS5sZW5ndGggOiAwKSwgb3B0aW9ucy5sb2NFbmQoY2hpbGQpIC0gKGNoaWxkLm5leHQgJiYgbmVlZHNUb0JvcnJvd1ByZXZDbG9zaW5nVGFnRW5kTWFya2VyKGNoaWxkLm5leHQpID8gcHJpbnRDbG9zaW5nVGFnRW5kTWFya2VyKGNoaWxkLCBvcHRpb25zKS5sZW5ndGggOiAwKSksIGxpdGVyYWxsaW5lJDIpLCBwcmludENsb3NpbmdUYWdTdWZmaXgoY2hpbGQsIG9wdGlvbnMpKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRQcmVzZXJ2ZUNvbnRlbnQkMShjaGlsZCwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRhKFtdLmNvbmNhdChwcmludE9wZW5pbmdUYWdQcmVmaXgoY2hpbGQsIG9wdGlvbnMpLCBncm91cCQ5KHByaW50T3BlbmluZ1RhZyhjaGlsZFBhdGgsIG9wdGlvbnMsIHByaW50KSksIHJlcGxhY2VFbmRPZkxpbmVXaXRoJDEob3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2UoY2hpbGQuc3RhcnRTb3VyY2VTcGFuLmVuZC5vZmZzZXQgKyAoY2hpbGQuZmlyc3RDaGlsZCAmJiBuZWVkc1RvQm9ycm93UGFyZW50T3BlbmluZ1RhZ0VuZE1hcmtlcihjaGlsZC5maXJzdENoaWxkKSA/IC1wcmludE9wZW5pbmdUYWdFbmRNYXJrZXIoY2hpbGQpLmxlbmd0aCA6IDApLCBjaGlsZC5lbmRTb3VyY2VTcGFuLnN0YXJ0Lm9mZnNldCArIChjaGlsZC5sYXN0Q2hpbGQgJiYgbmVlZHNUb0JvcnJvd1BhcmVudENsb3NpbmdUYWdTdGFydE1hcmtlcihjaGlsZC5sYXN0Q2hpbGQpID8gcHJpbnRDbG9zaW5nVGFnU3RhcnRNYXJrZXIoY2hpbGQsIG9wdGlvbnMpLmxlbmd0aCA6IG5lZWRzVG9Cb3Jyb3dMYXN0Q2hpbGRDbG9zaW5nVGFnRW5kTWFya2VyKGNoaWxkKSA/IC1wcmludENsb3NpbmdUYWdFbmRNYXJrZXIoY2hpbGQubGFzdENoaWxkLCBvcHRpb25zKS5sZW5ndGggOiAwKSksIGxpdGVyYWxsaW5lJDIpLCBwcmludENsb3NpbmdUYWcoY2hpbGQsIG9wdGlvbnMpLCBwcmludENsb3NpbmdUYWdTdWZmaXgoY2hpbGQsIG9wdGlvbnMpKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmludChjaGlsZFBhdGgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByaW50QmV0d2VlbkxpbmUocHJldk5vZGUsIG5leHROb2RlKSB7XG4gICAgICByZXR1cm4gaXNUZXh0TGlrZU5vZGUkMShwcmV2Tm9kZSkgJiYgaXNUZXh0TGlrZU5vZGUkMShuZXh0Tm9kZSkgPyBwcmV2Tm9kZS5pc1RyYWlsaW5nU3BhY2VTZW5zaXRpdmUgPyBwcmV2Tm9kZS5oYXNUcmFpbGluZ1NwYWNlcyA/IHByZWZlckhhcmRsaW5lQXNMZWFkaW5nU3BhY2VzJDEobmV4dE5vZGUpID8gaGFyZGxpbmUkNyA6IGxpbmUkNiA6IFwiXCIgOiBwcmVmZXJIYXJkbGluZUFzTGVhZGluZ1NwYWNlcyQxKG5leHROb2RlKSA/IGhhcmRsaW5lJDcgOiBzb2Z0bGluZSQ0IDogbmVlZHNUb0JvcnJvd05leHRPcGVuaW5nVGFnU3RhcnRNYXJrZXIocHJldk5vZGUpICYmIChoYXNQcmV0dGllcklnbm9yZSQzKG5leHROb2RlKSB8fFxuICAgICAgLyoqXG4gICAgICAgKiAgICAgMTIzPGFcbiAgICAgICAqICAgICAgICAgIH5cbiAgICAgICAqICAgICAgID48Yj5cbiAgICAgICAqL1xuICAgICAgbmV4dE5vZGUuZmlyc3RDaGlsZCB8fFxuICAgICAgLyoqXG4gICAgICAgKiAgICAgMTIzPCEtLVxuICAgICAgICogICAgICAgICAgICB+XG4gICAgICAgKiAgICAgLS0+XG4gICAgICAgKi9cbiAgICAgIG5leHROb2RlLmlzU2VsZkNsb3NpbmcgfHxcbiAgICAgIC8qKlxuICAgICAgICogICAgIDEyMzxzcGFuXG4gICAgICAgKiAgICAgICAgICAgICB+XG4gICAgICAgKiAgICAgICBhdHRyXG4gICAgICAgKi9cbiAgICAgIG5leHROb2RlLnR5cGUgPT09IFwiZWxlbWVudFwiICYmIG5leHROb2RlLmF0dHJzLmxlbmd0aCAhPT0gMCkgfHxcbiAgICAgIC8qKlxuICAgICAgICogICAgIDxpbWdcbiAgICAgICAqICAgICAgIHNyYz1cImxvbmdcIlxuICAgICAgICogICAgICAgICAgICAgICAgIH5cbiAgICAgICAqICAgICAvPjEyM1xuICAgICAgICovXG4gICAgICBwcmV2Tm9kZS50eXBlID09PSBcImVsZW1lbnRcIiAmJiBwcmV2Tm9kZS5pc1NlbGZDbG9zaW5nICYmIG5lZWRzVG9Cb3Jyb3dQcmV2Q2xvc2luZ1RhZ0VuZE1hcmtlcihuZXh0Tm9kZSkgPyBcIlwiIDogIW5leHROb2RlLmlzTGVhZGluZ1NwYWNlU2Vuc2l0aXZlIHx8IHByZWZlckhhcmRsaW5lQXNMZWFkaW5nU3BhY2VzJDEobmV4dE5vZGUpIHx8XG4gICAgICAvKipcbiAgICAgICAqICAgICAgIFdhbnQgdG8gd3JpdGUgdXMgYSBsZXR0ZXI/IFVzZSBvdXI8YVxuICAgICAgICogICAgICAgICA+PGI+PGE+bWFpbGluZyBhZGRyZXNzPC9hPjwvYj48L2FcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgflxuICAgICAgICogICAgICAgPi5cbiAgICAgICAqL1xuICAgICAgbmVlZHNUb0JvcnJvd1ByZXZDbG9zaW5nVGFnRW5kTWFya2VyKG5leHROb2RlKSAmJiBwcmV2Tm9kZS5sYXN0Q2hpbGQgJiYgbmVlZHNUb0JvcnJvd1BhcmVudENsb3NpbmdUYWdTdGFydE1hcmtlcihwcmV2Tm9kZS5sYXN0Q2hpbGQpICYmIHByZXZOb2RlLmxhc3RDaGlsZC5sYXN0Q2hpbGQgJiYgbmVlZHNUb0JvcnJvd1BhcmVudENsb3NpbmdUYWdTdGFydE1hcmtlcihwcmV2Tm9kZS5sYXN0Q2hpbGQubGFzdENoaWxkKSA/IGhhcmRsaW5lJDcgOiBuZXh0Tm9kZS5oYXNMZWFkaW5nU3BhY2VzID8gbGluZSQ2IDogc29mdGxpbmUkNDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcmludE9wZW5pbmdUYWcocGF0aCwgb3B0aW9ucywgcHJpbnQpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IGZvcmNlTm90VG9CcmVha0F0dHJDb250ZW50ID0gbm9kZS50eXBlID09PSBcImVsZW1lbnRcIiAmJiBub2RlLmZ1bGxOYW1lID09PSBcInNjcmlwdFwiICYmIG5vZGUuYXR0cnMubGVuZ3RoID09PSAxICYmIG5vZGUuYXR0cnNbMF0uZnVsbE5hbWUgPT09IFwic3JjXCIgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDA7XG4gICAgcmV0dXJuIGNvbmNhdCRhKFtwcmludE9wZW5pbmdUYWdTdGFydChub2RlLCBvcHRpb25zKSwgIW5vZGUuYXR0cnMgfHwgbm9kZS5hdHRycy5sZW5ndGggPT09IDAgPyBub2RlLmlzU2VsZkNsb3NpbmcgP1xuICAgIC8qKlxuICAgICAqICAgICA8YnIgLz5cbiAgICAgKiAgICAgICAgXlxuICAgICAqL1xuICAgIFwiIFwiIDogXCJcIiA6IGNvbmNhdCRhKFtpbmRlbnQkNShjb25jYXQkYShbZm9yY2VOb3RUb0JyZWFrQXR0ckNvbnRlbnQgPyBcIiBcIiA6IGxpbmUkNiwgam9pbiQ2KGxpbmUkNiwgKGlnbm9yZUF0dHJpYnV0ZURhdGEgPT4ge1xuICAgICAgY29uc3QgaGFzUHJldHRpZXJJZ25vcmVBdHRyaWJ1dGUgPSB0eXBlb2YgaWdub3JlQXR0cmlidXRlRGF0YSA9PT0gXCJib29sZWFuXCIgPyAoKSA9PiBpZ25vcmVBdHRyaWJ1dGVEYXRhIDogQXJyYXkuaXNBcnJheShpZ25vcmVBdHRyaWJ1dGVEYXRhKSA/IGF0dHIgPT4gaWdub3JlQXR0cmlidXRlRGF0YS5pbmNsdWRlcyhhdHRyLnJhd05hbWUpIDogKCkgPT4gZmFsc2U7XG4gICAgICByZXR1cm4gcGF0aC5tYXAoYXR0clBhdGggPT4ge1xuICAgICAgICBjb25zdCBhdHRyID0gYXR0clBhdGguZ2V0VmFsdWUoKTtcbiAgICAgICAgcmV0dXJuIGhhc1ByZXR0aWVySWdub3JlQXR0cmlidXRlKGF0dHIpID8gY29uY2F0JGEocmVwbGFjZUVuZE9mTGluZVdpdGgkMShvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShvcHRpb25zLmxvY1N0YXJ0KGF0dHIpLCBvcHRpb25zLmxvY0VuZChhdHRyKSksIGxpdGVyYWxsaW5lJDIpKSA6IHByaW50KGF0dHJQYXRoKTtcbiAgICAgIH0sIFwiYXR0cnNcIik7XG4gICAgfSkobm9kZS5wcmV2ICYmIG5vZGUucHJldi50eXBlID09PSBcImNvbW1lbnRcIiAmJiBnZXRQcmV0dGllcklnbm9yZUF0dHJpYnV0ZUNvbW1lbnREYXRhJDEobm9kZS5wcmV2LnZhbHVlKSkpXSkpLFxuICAgIC8qKlxuICAgICAqICAgICAxMjM8YVxuICAgICAqICAgICAgIGF0dHJcbiAgICAgKiAgICAgICAgICAgflxuICAgICAqICAgICAgID40NTZcbiAgICAgKi9cbiAgICBub2RlLmZpcnN0Q2hpbGQgJiYgbmVlZHNUb0JvcnJvd1BhcmVudE9wZW5pbmdUYWdFbmRNYXJrZXIobm9kZS5maXJzdENoaWxkKSB8fFxuICAgIC8qKlxuICAgICAqICAgICA8c3BhblxuICAgICAqICAgICAgID4xMjM8bWV0YVxuICAgICAqICAgICAgICAgICAgICAgIH5cbiAgICAgKiAgICAgLz48L3NwYW4+XG4gICAgICovXG4gICAgbm9kZS5pc1NlbGZDbG9zaW5nICYmIG5lZWRzVG9Cb3Jyb3dMYXN0Q2hpbGRDbG9zaW5nVGFnRW5kTWFya2VyKG5vZGUucGFyZW50KSA/IG5vZGUuaXNTZWxmQ2xvc2luZyA/IFwiIFwiIDogXCJcIiA6IG5vZGUuaXNTZWxmQ2xvc2luZyA/IGZvcmNlTm90VG9CcmVha0F0dHJDb250ZW50ID8gXCIgXCIgOiBsaW5lJDYgOiBmb3JjZU5vdFRvQnJlYWtBdHRyQ29udGVudCA/IFwiXCIgOiBzb2Z0bGluZSQ0XSksIG5vZGUuaXNTZWxmQ2xvc2luZyA/IFwiXCIgOiBwcmludE9wZW5pbmdUYWdFbmQobm9kZSldKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50T3BlbmluZ1RhZ1N0YXJ0KG5vZGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbm9kZS5wcmV2ICYmIG5lZWRzVG9Cb3Jyb3dOZXh0T3BlbmluZ1RhZ1N0YXJ0TWFya2VyKG5vZGUucHJldikgPyBcIlwiIDogY29uY2F0JGEoW3ByaW50T3BlbmluZ1RhZ1ByZWZpeChub2RlLCBvcHRpb25zKSwgcHJpbnRPcGVuaW5nVGFnU3RhcnRNYXJrZXIobm9kZSldKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50T3BlbmluZ1RhZ0VuZChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuZmlyc3RDaGlsZCAmJiBuZWVkc1RvQm9ycm93UGFyZW50T3BlbmluZ1RhZ0VuZE1hcmtlcihub2RlLmZpcnN0Q2hpbGQpID8gXCJcIiA6IHByaW50T3BlbmluZ1RhZ0VuZE1hcmtlcihub2RlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50Q2xvc2luZ1RhZyhub2RlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGNvbmNhdCRhKFtub2RlLmlzU2VsZkNsb3NpbmcgPyBcIlwiIDogcHJpbnRDbG9zaW5nVGFnU3RhcnQobm9kZSwgb3B0aW9ucyksIHByaW50Q2xvc2luZ1RhZ0VuZChub2RlLCBvcHRpb25zKV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRDbG9zaW5nVGFnU3RhcnQobm9kZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBub2RlLmxhc3RDaGlsZCAmJiBuZWVkc1RvQm9ycm93UGFyZW50Q2xvc2luZ1RhZ1N0YXJ0TWFya2VyKG5vZGUubGFzdENoaWxkKSA/IFwiXCIgOiBjb25jYXQkYShbcHJpbnRDbG9zaW5nVGFnUHJlZml4KG5vZGUsIG9wdGlvbnMpLCBwcmludENsb3NpbmdUYWdTdGFydE1hcmtlcihub2RlLCBvcHRpb25zKV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRDbG9zaW5nVGFnRW5kKG5vZGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKG5vZGUubmV4dCA/IG5lZWRzVG9Cb3Jyb3dQcmV2Q2xvc2luZ1RhZ0VuZE1hcmtlcihub2RlLm5leHQpIDogbmVlZHNUb0JvcnJvd0xhc3RDaGlsZENsb3NpbmdUYWdFbmRNYXJrZXIobm9kZS5wYXJlbnQpKSA/IFwiXCIgOiBjb25jYXQkYShbcHJpbnRDbG9zaW5nVGFnRW5kTWFya2VyKG5vZGUsIG9wdGlvbnMpLCBwcmludENsb3NpbmdUYWdTdWZmaXgobm9kZSwgb3B0aW9ucyldKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5lZWRzVG9Cb3Jyb3dOZXh0T3BlbmluZ1RhZ1N0YXJ0TWFya2VyKG5vZGUpIHtcbiAgICAvKipcbiAgICAgKiAgICAgMTIzPHBcbiAgICAgKiAgICAgICAgXl5cbiAgICAgKiAgICAgPlxuICAgICAqL1xuICAgIHJldHVybiBub2RlLm5leHQgJiYgIWlzVGV4dExpa2VOb2RlJDEobm9kZS5uZXh0KSAmJiBpc1RleHRMaWtlTm9kZSQxKG5vZGUpICYmIG5vZGUuaXNUcmFpbGluZ1NwYWNlU2Vuc2l0aXZlICYmICFub2RlLmhhc1RyYWlsaW5nU3BhY2VzO1xuICB9XG5cbiAgZnVuY3Rpb24gbmVlZHNUb0JvcnJvd1BhcmVudE9wZW5pbmdUYWdFbmRNYXJrZXIobm9kZSkge1xuICAgIC8qKlxuICAgICAqICAgICA8cFxuICAgICAqICAgICAgID4xMjNcbiAgICAgKiAgICAgICBeXG4gICAgICpcbiAgICAgKiAgICAgPHBcbiAgICAgKiAgICAgICA+PGFcbiAgICAgKiAgICAgICBeXG4gICAgICovXG4gICAgcmV0dXJuICFub2RlLnByZXYgJiYgbm9kZS5pc0xlYWRpbmdTcGFjZVNlbnNpdGl2ZSAmJiAhbm9kZS5oYXNMZWFkaW5nU3BhY2VzO1xuICB9XG5cbiAgZnVuY3Rpb24gbmVlZHNUb0JvcnJvd1ByZXZDbG9zaW5nVGFnRW5kTWFya2VyKG5vZGUpIHtcbiAgICAvKipcbiAgICAgKiAgICAgPHA+PC9wXG4gICAgICogICAgID4xMjNcbiAgICAgKiAgICAgXlxuICAgICAqXG4gICAgICogICAgIDxwPjwvcFxuICAgICAqICAgICA+PGFcbiAgICAgKiAgICAgXlxuICAgICAqL1xuICAgIHJldHVybiBub2RlLnByZXYgJiYgIWlzVGV4dExpa2VOb2RlJDEobm9kZS5wcmV2KSAmJiBub2RlLmlzTGVhZGluZ1NwYWNlU2Vuc2l0aXZlICYmICFub2RlLmhhc0xlYWRpbmdTcGFjZXM7XG4gIH1cblxuICBmdW5jdGlvbiBuZWVkc1RvQm9ycm93TGFzdENoaWxkQ2xvc2luZ1RhZ0VuZE1hcmtlcihub2RlKSB7XG4gICAgLyoqXG4gICAgICogICAgIDxwXG4gICAgICogICAgICAgPjxhPjwvYVxuICAgICAqICAgICAgID48L3BcbiAgICAgKiAgICAgICBeXG4gICAgICogICAgID5cbiAgICAgKi9cbiAgICByZXR1cm4gbm9kZS5sYXN0Q2hpbGQgJiYgbm9kZS5sYXN0Q2hpbGQuaXNUcmFpbGluZ1NwYWNlU2Vuc2l0aXZlICYmICFub2RlLmxhc3RDaGlsZC5oYXNUcmFpbGluZ1NwYWNlcyAmJiAhaXNUZXh0TGlrZU5vZGUkMShnZXRMYXN0RGVzY2VuZGFudCQxKG5vZGUubGFzdENoaWxkKSk7XG4gIH1cblxuICBmdW5jdGlvbiBuZWVkc1RvQm9ycm93UGFyZW50Q2xvc2luZ1RhZ1N0YXJ0TWFya2VyKG5vZGUpIHtcbiAgICAvKipcbiAgICAgKiAgICAgPHA+XG4gICAgICogICAgICAgMTIzPC9wXG4gICAgICogICAgICAgICAgXl5eXG4gICAgICogICAgID5cbiAgICAgKlxuICAgICAqICAgICAgICAgMTIzPC9iXG4gICAgICogICAgICAgPjwvYVxuICAgICAqICAgICAgICBeXl5cbiAgICAgKiAgICAgPlxuICAgICAqL1xuICAgIHJldHVybiAhbm9kZS5uZXh0ICYmICFub2RlLmhhc1RyYWlsaW5nU3BhY2VzICYmIG5vZGUuaXNUcmFpbGluZ1NwYWNlU2Vuc2l0aXZlICYmIGlzVGV4dExpa2VOb2RlJDEoZ2V0TGFzdERlc2NlbmRhbnQkMShub2RlKSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludE9wZW5pbmdUYWdQcmVmaXgobm9kZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZWVkc1RvQm9ycm93UGFyZW50T3BlbmluZ1RhZ0VuZE1hcmtlcihub2RlKSA/IHByaW50T3BlbmluZ1RhZ0VuZE1hcmtlcihub2RlLnBhcmVudCkgOiBuZWVkc1RvQm9ycm93UHJldkNsb3NpbmdUYWdFbmRNYXJrZXIobm9kZSkgPyBwcmludENsb3NpbmdUYWdFbmRNYXJrZXIobm9kZS5wcmV2LCBvcHRpb25zKSA6IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludENsb3NpbmdUYWdQcmVmaXgobm9kZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZWVkc1RvQm9ycm93TGFzdENoaWxkQ2xvc2luZ1RhZ0VuZE1hcmtlcihub2RlKSA/IHByaW50Q2xvc2luZ1RhZ0VuZE1hcmtlcihub2RlLmxhc3RDaGlsZCwgb3B0aW9ucykgOiBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRDbG9zaW5nVGFnU3VmZml4KG5vZGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmVlZHNUb0JvcnJvd1BhcmVudENsb3NpbmdUYWdTdGFydE1hcmtlcihub2RlKSA/IHByaW50Q2xvc2luZ1RhZ1N0YXJ0TWFya2VyKG5vZGUucGFyZW50LCBvcHRpb25zKSA6IG5lZWRzVG9Cb3Jyb3dOZXh0T3BlbmluZ1RhZ1N0YXJ0TWFya2VyKG5vZGUpID8gcHJpbnRPcGVuaW5nVGFnU3RhcnRNYXJrZXIobm9kZS5uZXh0KSA6IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludE9wZW5pbmdUYWdTdGFydE1hcmtlcihub2RlKSB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJpZUNvbmRpdGlvbmFsQ29tbWVudFwiOlxuICAgICAgY2FzZSBcImllQ29uZGl0aW9uYWxTdGFydENvbW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIFwiPCEtLVtpZiBcIi5jb25jYXQobm9kZS5jb25kaXRpb24pO1xuXG4gICAgICBjYXNlIFwiaWVDb25kaXRpb25hbEVuZENvbW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIFwiPCEtLTwhXCI7XG5cbiAgICAgIGNhc2UgXCJpbnRlcnBvbGF0aW9uXCI6XG4gICAgICAgIHJldHVybiBcInt7XCI7XG5cbiAgICAgIGNhc2UgXCJkb2NUeXBlXCI6XG4gICAgICAgIHJldHVybiBcIjwhRE9DVFlQRVwiO1xuXG4gICAgICBjYXNlIFwiZWxlbWVudFwiOlxuICAgICAgICBpZiAobm9kZS5jb25kaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gXCI8IS0tW2lmIFwiLmNvbmNhdChub2RlLmNvbmRpdGlvbiwgXCJdPjwhLS0+PFwiKS5jb25jYXQobm9kZS5yYXdOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAvLyBmYWxsIHRocm91Z2hcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiPFwiLmNvbmNhdChub2RlLnJhd05hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50T3BlbmluZ1RhZ0VuZE1hcmtlcihub2RlKSB7XG4gICAgYXNzZXJ0KCFub2RlLmlzU2VsZkNsb3NpbmcpO1xuXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJpZUNvbmRpdGlvbmFsQ29tbWVudFwiOlxuICAgICAgICByZXR1cm4gXCJdPlwiO1xuXG4gICAgICBjYXNlIFwiZWxlbWVudFwiOlxuICAgICAgICBpZiAobm9kZS5jb25kaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gXCI+PCEtLTwhW2VuZGlmXS0tPlwiO1xuICAgICAgICB9XG5cbiAgICAgIC8vIGZhbGwgdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCI+XCI7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRDbG9zaW5nVGFnU3RhcnRNYXJrZXIobm9kZSwgb3B0aW9ucykge1xuICAgIGFzc2VydCghbm9kZS5pc1NlbGZDbG9zaW5nKTtcblxuICAgIGlmIChzaG91bGROb3RQcmludENsb3NpbmdUYWckMShub2RlLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJpZUNvbmRpdGlvbmFsQ29tbWVudFwiOlxuICAgICAgICByZXR1cm4gXCI8IVwiO1xuXG4gICAgICBjYXNlIFwiZWxlbWVudFwiOlxuICAgICAgICBpZiAobm9kZS5oYXNIdG1Db21wb25lbnRDbG9zaW5nVGFnKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPC8vXCI7XG4gICAgICAgIH1cblxuICAgICAgLy8gZmFsbCB0aHJvdWdoXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcIjwvXCIuY29uY2F0KG5vZGUucmF3TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRDbG9zaW5nVGFnRW5kTWFya2VyKG5vZGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoc2hvdWxkTm90UHJpbnRDbG9zaW5nVGFnJDEobm9kZSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwiaWVDb25kaXRpb25hbENvbW1lbnRcIjpcbiAgICAgIGNhc2UgXCJpZUNvbmRpdGlvbmFsRW5kQ29tbWVudFwiOlxuICAgICAgICByZXR1cm4gXCJbZW5kaWZdLS0+XCI7XG5cbiAgICAgIGNhc2UgXCJpZUNvbmRpdGlvbmFsU3RhcnRDb21tZW50XCI6XG4gICAgICAgIHJldHVybiBcIl0+PCEtLT5cIjtcblxuICAgICAgY2FzZSBcImludGVycG9sYXRpb25cIjpcbiAgICAgICAgcmV0dXJuIFwifX1cIjtcblxuICAgICAgY2FzZSBcImVsZW1lbnRcIjpcbiAgICAgICAgaWYgKG5vZGUuaXNTZWxmQ2xvc2luZykge1xuICAgICAgICAgIHJldHVybiBcIi8+XCI7XG4gICAgICAgIH1cblxuICAgICAgLy8gZmFsbCB0aHJvdWdoXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcIj5cIjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUZXh0VmFsdWVQYXJ0cyhub2RlLCB2YWx1ZSA9IG5vZGUudmFsdWUpIHtcbiAgICByZXR1cm4gbm9kZS5wYXJlbnQuaXNXaGl0ZXNwYWNlU2Vuc2l0aXZlID8gbm9kZS5wYXJlbnQuaXNJbmRlbnRhdGlvblNlbnNpdGl2ZSA/IHJlcGxhY2VFbmRPZkxpbmVXaXRoJDEodmFsdWUsIGxpdGVyYWxsaW5lJDIpIDogcmVwbGFjZUVuZE9mTGluZVdpdGgkMShkZWRlbnRTdHJpbmckMSh2YWx1ZS5yZXBsYWNlKC9eXFxzKj9cXG58XFxuXFxzKj8kL2csIFwiXCIpKSwgaGFyZGxpbmUkNykgOiAvLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktd2hpdGVzcGFjZVxuICAgIGpvaW4kNihsaW5lJDYsIHZhbHVlLnNwbGl0KC9bXFx0XFxuXFxmXFxyIF0rLykpLnBhcnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRFbWJlZGRlZEF0dHJpYnV0ZVZhbHVlKG5vZGUsIG9yaWdpbmFsVGV4dFRvRG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3QgaXNLZXlNYXRjaGVkID0gcGF0dGVybnMgPT4gbmV3IFJlZ0V4cChwYXR0ZXJucy5qb2luKFwifFwiKSkudGVzdChub2RlLmZ1bGxOYW1lKTtcblxuICAgIGNvbnN0IGdldFZhbHVlID0gKCkgPT4gdW5lc2NhcGVRdW90ZUVudGl0aWVzJDEobm9kZS52YWx1ZSk7XG5cbiAgICBsZXQgc2hvdWxkSHVnID0gZmFsc2U7XG5cbiAgICBjb25zdCBfX29uSHRtbEJpbmRpbmdSb290ID0gKHJvb3QsIG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IHJvb3ROb2RlID0gcm9vdC50eXBlID09PSBcIk5HUm9vdFwiID8gcm9vdC5ub2RlLnR5cGUgPT09IFwiTkdNaWNyb3N5bnRheFwiICYmIHJvb3Qubm9kZS5ib2R5Lmxlbmd0aCA9PT0gMSAmJiByb290Lm5vZGUuYm9keVswXS50eXBlID09PSBcIk5HTWljcm9zeW50YXhFeHByZXNzaW9uXCIgPyByb290Lm5vZGUuYm9keVswXS5leHByZXNzaW9uIDogcm9vdC5ub2RlIDogcm9vdC50eXBlID09PSBcIkpzRXhwcmVzc2lvblJvb3RcIiA/IHJvb3Qubm9kZSA6IHJvb3Q7XG5cbiAgICAgIGlmIChyb290Tm9kZSAmJiAocm9vdE5vZGUudHlwZSA9PT0gXCJPYmplY3RFeHByZXNzaW9uXCIgfHwgcm9vdE5vZGUudHlwZSA9PT0gXCJBcnJheUV4cHJlc3Npb25cIiB8fCBvcHRpb25zLnBhcnNlciA9PT0gXCJfX3Z1ZV9leHByZXNzaW9uXCIgJiYgKHJvb3ROb2RlLnR5cGUgPT09IFwiVGVtcGxhdGVMaXRlcmFsXCIgfHwgcm9vdE5vZGUudHlwZSA9PT0gXCJTdHJpbmdMaXRlcmFsXCIpKSkge1xuICAgICAgICBzaG91bGRIdWcgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBwcmludEh1ZyA9IGRvYyA9PiBncm91cCQ5KGRvYyk7XG5cbiAgICBjb25zdCBwcmludEV4cGFuZCA9IChkb2MsIGNhbkhhdmVUcmFpbGluZ1doaXRlc3BhY2UgPSB0cnVlKSA9PiBncm91cCQ5KGNvbmNhdCRhKFtpbmRlbnQkNShjb25jYXQkYShbc29mdGxpbmUkNCwgZG9jXSkpLCBjYW5IYXZlVHJhaWxpbmdXaGl0ZXNwYWNlID8gc29mdGxpbmUkNCA6IFwiXCJdKSk7XG5cbiAgICBjb25zdCBwcmludE1heWJlSHVnID0gZG9jID0+IHNob3VsZEh1ZyA/IHByaW50SHVnKGRvYykgOiBwcmludEV4cGFuZChkb2MpO1xuXG4gICAgY29uc3QgdGV4dFRvRG9jID0gKGNvZGUsIG9wdHMpID0+IG9yaWdpbmFsVGV4dFRvRG9jKGNvZGUsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgX19vbkh0bWxCaW5kaW5nUm9vdFxuICAgIH0sIG9wdHMpKTtcblxuICAgIGlmIChub2RlLmZ1bGxOYW1lID09PSBcInNyY3NldFwiICYmIChub2RlLnBhcmVudC5mdWxsTmFtZSA9PT0gXCJpbWdcIiB8fCBub2RlLnBhcmVudC5mdWxsTmFtZSA9PT0gXCJzb3VyY2VcIikpIHtcbiAgICAgIHJldHVybiBwcmludEV4cGFuZChwcmludEltZ1NyY3NldCQxKGdldFZhbHVlKCkpKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5mdWxsTmFtZSA9PT0gXCJjbGFzc1wiICYmICFvcHRpb25zLnBhcmVudFBhcnNlcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXRWYWx1ZSgpO1xuXG4gICAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKFwie3tcIikpIHtcbiAgICAgICAgcmV0dXJuIHByaW50Q2xhc3NOYW1lcyQxKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZS5mdWxsTmFtZSA9PT0gXCJzdHlsZVwiICYmICFvcHRpb25zLnBhcmVudFBhcnNlcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXRWYWx1ZSgpO1xuXG4gICAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKFwie3tcIikpIHtcbiAgICAgICAgcmV0dXJuIHByaW50RXhwYW5kKHRleHRUb0RvYyh2YWx1ZSwge1xuICAgICAgICAgIHBhcnNlcjogXCJjc3NcIixcbiAgICAgICAgICBfX2lzSFRNTFN0eWxlQXR0cmlidXRlOiB0cnVlXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wYXJzZXIgPT09IFwidnVlXCIpIHtcbiAgICAgIGlmIChub2RlLmZ1bGxOYW1lID09PSBcInYtZm9yXCIpIHtcbiAgICAgICAgcmV0dXJuIHByaW50VnVlRm9yJDEoZ2V0VmFsdWUoKSwgdGV4dFRvRG9jKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuZnVsbE5hbWUgPT09IFwic2xvdC1zY29wZVwiKSB7XG4gICAgICAgIHJldHVybiBwcmludFZ1ZVNsb3RTY29wZSQxKGdldFZhbHVlKCksIHRleHRUb0RvYyk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqICAgICBAY2xpY2s9XCJqc1N0YXRlbWVudFwiXG4gICAgICAgKiAgICAgQGNsaWNrPVwianNFeHByZXNzaW9uXCJcbiAgICAgICAqICAgICB2LW9uOmNsaWNrPVwianNTdGF0ZW1lbnRcIlxuICAgICAgICogICAgIHYtb246Y2xpY2s9XCJqc0V4cHJlc3Npb25cIlxuICAgICAgICovXG5cblxuICAgICAgY29uc3QgdnVlRXZlbnRCaW5kaW5nUGF0dGVybnMgPSBbXCJeQFwiLCBcIl52LW9uOlwiXTtcbiAgICAgIC8qKlxuICAgICAgICogICAgIDpjbGFzcz1cInZ1ZUV4cHJlc3Npb25cIlxuICAgICAgICogICAgIHYtYmluZDppZD1cInZ1ZUV4cHJlc3Npb25cIlxuICAgICAgICovXG5cbiAgICAgIGNvbnN0IHZ1ZUV4cHJlc3Npb25CaW5kaW5nUGF0dGVybnMgPSBbXCJeOlwiLCBcIl52LWJpbmQ6XCJdO1xuICAgICAgLyoqXG4gICAgICAgKiAgICAgdi1pZj1cImpzRXhwcmVzc2lvblwiXG4gICAgICAgKi9cblxuICAgICAgY29uc3QganNFeHByZXNzaW9uQmluZGluZ1BhdHRlcm5zID0gW1wiXnYtXCJdO1xuXG4gICAgICBpZiAoaXNLZXlNYXRjaGVkKHZ1ZUV2ZW50QmluZGluZ1BhdHRlcm5zKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldFZhbHVlKCk7XG4gICAgICAgIHJldHVybiBwcmludE1heWJlSHVnKGlzVnVlRXZlbnRCaW5kaW5nRXhwcmVzc2lvbiQxKHZhbHVlKSA/IHRleHRUb0RvYyh2YWx1ZSwge1xuICAgICAgICAgIHBhcnNlcjogXCJfX2pzX2V4cHJlc3Npb25cIlxuICAgICAgICB9KSA6IHN0cmlwVHJhaWxpbmdIYXJkbGluZSQxKHRleHRUb0RvYyh2YWx1ZSwge1xuICAgICAgICAgIHBhcnNlcjogXCJfX3Z1ZV9ldmVudF9iaW5kaW5nXCJcbiAgICAgICAgfSkpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzS2V5TWF0Y2hlZCh2dWVFeHByZXNzaW9uQmluZGluZ1BhdHRlcm5zKSkge1xuICAgICAgICByZXR1cm4gcHJpbnRNYXliZUh1Zyh0ZXh0VG9Eb2MoZ2V0VmFsdWUoKSwge1xuICAgICAgICAgIHBhcnNlcjogXCJfX3Z1ZV9leHByZXNzaW9uXCJcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNLZXlNYXRjaGVkKGpzRXhwcmVzc2lvbkJpbmRpbmdQYXR0ZXJucykpIHtcbiAgICAgICAgcmV0dXJuIHByaW50TWF5YmVIdWcodGV4dFRvRG9jKGdldFZhbHVlKCksIHtcbiAgICAgICAgICBwYXJzZXI6IFwiX19qc19leHByZXNzaW9uXCJcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnBhcnNlciA9PT0gXCJhbmd1bGFyXCIpIHtcbiAgICAgIGNvbnN0IG5nVGV4dFRvRG9jID0gKGNvZGUsIG9wdHMpID0+IC8vIGFuZ3VsYXIgZG9lcyBub3QgYWxsb3cgdHJhaWxpbmcgY29tbWFcbiAgICAgIHRleHRUb0RvYyhjb2RlLCBPYmplY3QuYXNzaWduKHt9LCBvcHRzLCB7XG4gICAgICAgIHRyYWlsaW5nQ29tbWE6IFwibm9uZVwiXG4gICAgICB9KSk7XG4gICAgICAvKipcbiAgICAgICAqICAgICAqZGlyZWN0aXZlPVwiYW5ndWxhckRpcmVjdGl2ZVwiXG4gICAgICAgKi9cblxuXG4gICAgICBjb25zdCBuZ0RpcmVjdGl2ZUJpbmRpbmdQYXR0ZXJucyA9IFtcIl5cXFxcKlwiXTtcbiAgICAgIC8qKlxuICAgICAgICogICAgIChjbGljayk9XCJhbmd1bGFyU3RhdGVtZW50XCJcbiAgICAgICAqICAgICBvbi1jbGljaz1cImFuZ3VsYXJTdGF0ZW1lbnRcIlxuICAgICAgICovXG5cbiAgICAgIGNvbnN0IG5nU3RhdGVtZW50QmluZGluZ1BhdHRlcm5zID0gW1wiXlxcXFwoLitcXFxcKSRcIiwgXCJeb24tXCJdO1xuICAgICAgLyoqXG4gICAgICAgKiAgICAgW3RhcmdldF09XCJhbmd1bGFyRXhwcmVzc2lvblwiXG4gICAgICAgKiAgICAgYmluZC10YXJnZXQ9XCJhbmd1bGFyRXhwcmVzc2lvblwiXG4gICAgICAgKiAgICAgWyh0YXJnZXQpXT1cImFuZ3VsYXJFeHByZXNzaW9uXCJcbiAgICAgICAqICAgICBiaW5kb24tdGFyZ2V0PVwiYW5ndWxhckV4cHJlc3Npb25cIlxuICAgICAgICovXG5cbiAgICAgIGNvbnN0IG5nRXhwcmVzc2lvbkJpbmRpbmdQYXR0ZXJucyA9IFtcIl5cXFxcWy4rXFxcXF0kXCIsIFwiXmJpbmQob24pPy1cIiwgLy8gVW5vZmZpY2lhbCBydWRpbWVudGFyeSBzdXBwb3J0IGZvciBzb21lIG9mIHRoZSBtb3N0IHVzZWQgZGlyZWN0aXZlcyBvZiBBbmd1bGFySlMgMS54XG4gICAgICBcIl5uZy0oaWZ8c2hvd3xoaWRlfGNsYXNzfHN0eWxlKSRcIl07XG4gICAgICAvKipcbiAgICAgICAqICAgICBpMThuPVwibG9uZ0Rlc2NyaXB0aW9uXCJcbiAgICAgICAqICAgICBpMThuLWF0dHI9XCJsb25nRGVzY3JpcHRpb25cIlxuICAgICAgICovXG5cbiAgICAgIGNvbnN0IG5nSTE4blBhdHRlcm5zID0gW1wiXmkxOG4oLS4rKT8kXCJdO1xuXG4gICAgICBpZiAoaXNLZXlNYXRjaGVkKG5nU3RhdGVtZW50QmluZGluZ1BhdHRlcm5zKSkge1xuICAgICAgICByZXR1cm4gcHJpbnRNYXliZUh1ZyhuZ1RleHRUb0RvYyhnZXRWYWx1ZSgpLCB7XG4gICAgICAgICAgcGFyc2VyOiBcIl9fbmdfYWN0aW9uXCJcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNLZXlNYXRjaGVkKG5nRXhwcmVzc2lvbkJpbmRpbmdQYXR0ZXJucykpIHtcbiAgICAgICAgcmV0dXJuIHByaW50TWF5YmVIdWcobmdUZXh0VG9Eb2MoZ2V0VmFsdWUoKSwge1xuICAgICAgICAgIHBhcnNlcjogXCJfX25nX2JpbmRpbmdcIlxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0tleU1hdGNoZWQobmdJMThuUGF0dGVybnMpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgIHJldHVybiBwcmludEV4cGFuZChmaWxsJDMoZ2V0VGV4dFZhbHVlUGFydHMobm9kZSwgdmFsdWUpKSwgIXZhbHVlLmluY2x1ZGVzKFwiQEBcIikpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNLZXlNYXRjaGVkKG5nRGlyZWN0aXZlQmluZGluZ1BhdHRlcm5zKSkge1xuICAgICAgICByZXR1cm4gcHJpbnRNYXliZUh1ZyhuZ1RleHRUb0RvYyhnZXRWYWx1ZSgpLCB7XG4gICAgICAgICAgcGFyc2VyOiBcIl9fbmdfZGlyZWN0aXZlXCJcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnRlcnBvbGF0aW9uUmVnZXggPSAvXFx7XFx7KFtcXHNcXFNdKz8pXFx9XFx9L2c7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdldFZhbHVlKCk7XG5cbiAgICAgIGlmIChpbnRlcnBvbGF0aW9uUmVnZXgudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICAgICAgdmFsdWUuc3BsaXQoaW50ZXJwb2xhdGlvblJlZ2V4KS5mb3JFYWNoKChwYXJ0LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChpbmRleCAlIDIgPT09IDApIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goY29uY2F0JGEocmVwbGFjZUVuZE9mTGluZVdpdGgkMShwYXJ0LCBsaXRlcmFsbGluZSQyKSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGdyb3VwJDkoY29uY2F0JGEoW1wie3tcIiwgaW5kZW50JDUoY29uY2F0JGEoW2xpbmUkNiwgbmdUZXh0VG9Eb2MocGFydCwge1xuICAgICAgICAgICAgICAgIHBhcnNlcjogXCJfX25nX2ludGVycG9sYXRpb25cIixcbiAgICAgICAgICAgICAgICBfX2lzSW5IdG1sSW50ZXJwb2xhdGlvbjogdHJ1ZSAvLyB0byBhdm9pZCB1bmV4cGVjdGVkIGB9fWBcblxuICAgICAgICAgICAgICB9KV0pKSwgbGluZSQ2LCBcIn19XCJdKSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFwie3tcIiwgY29uY2F0JGEocmVwbGFjZUVuZE9mTGluZVdpdGgkMShwYXJ0LCBsaXRlcmFsbGluZSQyKSksIFwifX1cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGdyb3VwJDkoY29uY2F0JGEocGFydHMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBwcmludGVySHRtbCA9IHtcbiAgICBwcmVwcm9jZXNzOiBwcmVwcm9jZXNzXzEsXG4gICAgcHJpbnQ6IGdlbmVyaWNQcmludCQyLFxuICAgIGluc2VydFByYWdtYTogaW5zZXJ0UHJhZ21hJDYsXG4gICAgbWFzc2FnZUFzdE5vZGU6IGNsZWFuJDMsXG4gICAgZW1iZWQ6IGVtYmVkJDJcbiAgfTtcblxuICBjb25zdCBDQVRFR09SWV9IVE1MID0gXCJIVE1MXCI7IC8vIGZvcm1hdCBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vcHJldHRpZXIvcHJldHRpZXIvYmxvYi9tYXN0ZXIvc3JjL21haW4vY29yZS1vcHRpb25zLmpzXG5cbiAgdmFyIG9wdGlvbnMkNCA9IHtcbiAgICBodG1sV2hpdGVzcGFjZVNlbnNpdGl2aXR5OiB7XG4gICAgICBzaW5jZTogXCIxLjE1LjBcIixcbiAgICAgIGNhdGVnb3J5OiBDQVRFR09SWV9IVE1MLFxuICAgICAgdHlwZTogXCJjaG9pY2VcIixcbiAgICAgIGRlZmF1bHQ6IFwiY3NzXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJIb3cgdG8gaGFuZGxlIHdoaXRlc3BhY2VzIGluIEhUTUwuXCIsXG4gICAgICBjaG9pY2VzOiBbe1xuICAgICAgICB2YWx1ZTogXCJjc3NcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVzcGVjdCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBDU1MgZGlzcGxheSBwcm9wZXJ0eS5cIlxuICAgICAgfSwge1xuICAgICAgICB2YWx1ZTogXCJzdHJpY3RcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiV2hpdGVzcGFjZXMgYXJlIGNvbnNpZGVyZWQgc2Vuc2l0aXZlLlwiXG4gICAgICB9LCB7XG4gICAgICAgIHZhbHVlOiBcImlnbm9yZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJXaGl0ZXNwYWNlcyBhcmUgY29uc2lkZXJlZCBpbnNlbnNpdGl2ZS5cIlxuICAgICAgfV1cbiAgICB9LFxuICAgIHZ1ZUluZGVudFNjcmlwdEFuZFN0eWxlOiB7XG4gICAgICBzaW5jZTogXCIxLjE5LjBcIixcbiAgICAgIGNhdGVnb3J5OiBDQVRFR09SWV9IVE1MLFxuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkluZGVudCBzY3JpcHQgYW5kIHN0eWxlIHRhZ3MgaW4gVnVlIGZpbGVzLlwiXG4gICAgfVxuICB9O1xuXG4gIHZhciBuYW1lJDcgPSBcIkhUTUxcIjtcbiAgdmFyIHR5cGUkNiA9IFwibWFya3VwXCI7XG4gIHZhciB0bVNjb3BlJDYgPSBcInRleHQuaHRtbC5iYXNpY1wiO1xuICB2YXIgYWNlTW9kZSQ2ID0gXCJodG1sXCI7XG4gIHZhciBjb2RlbWlycm9yTW9kZSQzID0gXCJodG1sbWl4ZWRcIjtcbiAgdmFyIGNvZGVtaXJyb3JNaW1lVHlwZSQzID0gXCJ0ZXh0L2h0bWxcIjtcbiAgdmFyIGNvbG9yJDEgPSBcIiNlMzRjMjZcIjtcbiAgdmFyIGFsaWFzZXMkMSA9IFtcbiAgXHRcInhodG1sXCJcbiAgXTtcbiAgdmFyIGV4dGVuc2lvbnMkNiA9IFtcbiAgXHRcIi5odG1sXCIsXG4gIFx0XCIuaHRtXCIsXG4gIFx0XCIuaHRtbC5obFwiLFxuICBcdFwiLmluY1wiLFxuICBcdFwiLnN0XCIsXG4gIFx0XCIueGh0XCIsXG4gIFx0XCIueGh0bWxcIlxuICBdO1xuICB2YXIgbGFuZ3VhZ2VJZCQ2ID0gMTQ2O1xuICB2YXIgSFRNTCA9IHtcbiAgXHRuYW1lOiBuYW1lJDcsXG4gIFx0dHlwZTogdHlwZSQ2LFxuICBcdHRtU2NvcGU6IHRtU2NvcGUkNixcbiAgXHRhY2VNb2RlOiBhY2VNb2RlJDYsXG4gIFx0Y29kZW1pcnJvck1vZGU6IGNvZGVtaXJyb3JNb2RlJDMsXG4gIFx0Y29kZW1pcnJvck1pbWVUeXBlOiBjb2RlbWlycm9yTWltZVR5cGUkMyxcbiAgXHRjb2xvcjogY29sb3IkMSxcbiAgXHRhbGlhc2VzOiBhbGlhc2VzJDEsXG4gIFx0ZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyQ2LFxuICBcdGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWQkNlxuICB9O1xuXG4gIHZhciBIVE1MJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIG5hbWU6IG5hbWUkNyxcbiAgICB0eXBlOiB0eXBlJDYsXG4gICAgdG1TY29wZTogdG1TY29wZSQ2LFxuICAgIGFjZU1vZGU6IGFjZU1vZGUkNixcbiAgICBjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUkMyxcbiAgICBjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSQzLFxuICAgIGNvbG9yOiBjb2xvciQxLFxuICAgIGFsaWFzZXM6IGFsaWFzZXMkMSxcbiAgICBleHRlbnNpb25zOiBleHRlbnNpb25zJDYsXG4gICAgbGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZCQ2LFxuICAgICdkZWZhdWx0JzogSFRNTFxuICB9KTtcblxuICB2YXIgbmFtZSQ4ID0gXCJWdWVcIjtcbiAgdmFyIHR5cGUkNyA9IFwibWFya3VwXCI7XG4gIHZhciBjb2xvciQyID0gXCIjMmMzZTUwXCI7XG4gIHZhciBleHRlbnNpb25zJDcgPSBbXG4gIFx0XCIudnVlXCJcbiAgXTtcbiAgdmFyIHRtU2NvcGUkNyA9IFwidGV4dC5odG1sLnZ1ZVwiO1xuICB2YXIgYWNlTW9kZSQ3ID0gXCJodG1sXCI7XG4gIHZhciBsYW5ndWFnZUlkJDcgPSAzOTE7XG4gIHZhciBWdWUgPSB7XG4gIFx0bmFtZTogbmFtZSQ4LFxuICBcdHR5cGU6IHR5cGUkNyxcbiAgXHRjb2xvcjogY29sb3IkMixcbiAgXHRleHRlbnNpb25zOiBleHRlbnNpb25zJDcsXG4gIFx0dG1TY29wZTogdG1TY29wZSQ3LFxuICBcdGFjZU1vZGU6IGFjZU1vZGUkNyxcbiAgXHRsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJDdcbiAgfTtcblxuICB2YXIgVnVlJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIG5hbWU6IG5hbWUkOCxcbiAgICB0eXBlOiB0eXBlJDcsXG4gICAgY29sb3I6IGNvbG9yJDIsXG4gICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyQ3LFxuICAgIHRtU2NvcGU6IHRtU2NvcGUkNyxcbiAgICBhY2VNb2RlOiBhY2VNb2RlJDcsXG4gICAgbGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZCQ3LFxuICAgICdkZWZhdWx0JzogVnVlXG4gIH0pO1xuXG4gIHZhciByZXF1aXJlJCQwJDUgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKEhUTUwkMSk7XG5cbiAgdmFyIHJlcXVpcmUkJDEkMSA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoVnVlJDEpO1xuXG4gIGNvbnN0IGxhbmd1YWdlcyQzID0gW2NyZWF0ZUxhbmd1YWdlKHJlcXVpcmUkJDAkNSwgKCkgPT4gKHtcbiAgICBuYW1lOiBcIkFuZ3VsYXJcIixcbiAgICBzaW5jZTogXCIxLjE1LjBcIixcbiAgICBwYXJzZXJzOiBbXCJhbmd1bGFyXCJdLFxuICAgIHZzY29kZUxhbmd1YWdlSWRzOiBbXCJodG1sXCJdLFxuICAgIGV4dGVuc2lvbnM6IFtcIi5jb21wb25lbnQuaHRtbFwiXSxcbiAgICBmaWxlbmFtZXM6IFtdXG4gIH0pKSwgY3JlYXRlTGFuZ3VhZ2UocmVxdWlyZSQkMCQ1LCBkYXRhID0+ICh7XG4gICAgc2luY2U6IFwiMS4xNS4wXCIsXG4gICAgcGFyc2VyczogW1wiaHRtbFwiXSxcbiAgICB2c2NvZGVMYW5ndWFnZUlkczogW1wiaHRtbFwiXSxcbiAgICBleHRlbnNpb25zOiBkYXRhLmV4dGVuc2lvbnMuY29uY2F0KFtcIi5tam1sXCIgLy8gTUpNTCBpcyBjb25zaWRlcmVkIFhNTCBpbiBMaW5ndWlzdCBidXQgaXQgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBIVE1MXG4gICAgXSlcbiAgfSkpLCBjcmVhdGVMYW5ndWFnZShyZXF1aXJlJCQwJDUsICgpID0+ICh7XG4gICAgbmFtZTogXCJMaWdodG5pbmcgV2ViIENvbXBvbmVudHNcIixcbiAgICBzaW5jZTogXCIxLjE3LjBcIixcbiAgICBwYXJzZXJzOiBbXCJsd2NcIl0sXG4gICAgdnNjb2RlTGFuZ3VhZ2VJZHM6IFtcImh0bWxcIl0sXG4gICAgZXh0ZW5zaW9uczogW10sXG4gICAgZmlsZW5hbWVzOiBbXVxuICB9KSksIGNyZWF0ZUxhbmd1YWdlKHJlcXVpcmUkJDEkMSwgKCkgPT4gKHtcbiAgICBzaW5jZTogXCIxLjEwLjBcIixcbiAgICBwYXJzZXJzOiBbXCJ2dWVcIl0sXG4gICAgdnNjb2RlTGFuZ3VhZ2VJZHM6IFtcInZ1ZVwiXVxuICB9KSldO1xuICBjb25zdCBwcmludGVycyQzID0ge1xuICAgIGh0bWw6IHByaW50ZXJIdG1sXG4gIH07XG4gIHZhciBsYW5ndWFnZUh0bWwgPSB7XG4gICAgbGFuZ3VhZ2VzOiBsYW5ndWFnZXMkMyxcbiAgICBwcmludGVyczogcHJpbnRlcnMkMyxcbiAgICBvcHRpb25zOiBvcHRpb25zJDRcbiAgfTtcblxuICBjb25zdCB7XG4gICAgYWRkTGVhZGluZ0NvbW1lbnQ6IGFkZExlYWRpbmdDb21tZW50JDMsXG4gICAgYWRkVHJhaWxpbmdDb21tZW50OiBhZGRUcmFpbGluZ0NvbW1lbnQkMyxcbiAgICBhZGREYW5nbGluZ0NvbW1lbnQ6IGFkZERhbmdsaW5nQ29tbWVudCQzLFxuICAgIGdldE5leHROb25TcGFjZU5vbkNvbW1lbnRDaGFyYWN0ZXJJbmRleDogZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4JDJcbiAgfSA9IHV0aWxTaGFyZWQ7XG5cbiAgZnVuY3Rpb24gaGFuZGxlT3duTGluZUNvbW1lbnQoY29tbWVudCwgdGV4dCwgb3B0aW9ucywgYXN0LCBpc0xhc3RDb21tZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJlY2VkaW5nTm9kZSxcbiAgICAgIGVuY2xvc2luZ05vZGUsXG4gICAgICBmb2xsb3dpbmdOb2RlXG4gICAgfSA9IGNvbW1lbnQ7XG4gICAgcmV0dXJuIGhhbmRsZUxhc3RGdW5jdGlvbkFyZ0NvbW1lbnRzKHRleHQsIHByZWNlZGluZ05vZGUsIGVuY2xvc2luZ05vZGUsIGZvbGxvd2luZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHx8IGhhbmRsZU1lbWJlckV4cHJlc3Npb25Db21tZW50cyhlbmNsb3NpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50KSB8fCBoYW5kbGVJZlN0YXRlbWVudENvbW1lbnRzKHRleHQsIHByZWNlZGluZ05vZGUsIGVuY2xvc2luZ05vZGUsIGZvbGxvd2luZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHx8IGhhbmRsZVdoaWxlQ29tbWVudHModGV4dCwgcHJlY2VkaW5nTm9kZSwgZW5jbG9zaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCwgb3B0aW9ucykgfHwgaGFuZGxlVHJ5U3RhdGVtZW50Q29tbWVudHMoZW5jbG9zaW5nTm9kZSwgcHJlY2VkaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCkgfHwgaGFuZGxlQ2xhc3NDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBwcmVjZWRpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50KSB8fCBoYW5kbGVJbXBvcnRTcGVjaWZpZXJDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBjb21tZW50KSB8fCBoYW5kbGVGb3JDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBwcmVjZWRpbmdOb2RlLCBjb21tZW50KSB8fCBoYW5kbGVVbmlvblR5cGVDb21tZW50cyhwcmVjZWRpbmdOb2RlLCBlbmNsb3NpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50KSB8fCBoYW5kbGVPbmx5Q29tbWVudHMoZW5jbG9zaW5nTm9kZSwgYXN0LCBjb21tZW50LCBpc0xhc3RDb21tZW50KSB8fCBoYW5kbGVJbXBvcnREZWNsYXJhdGlvbkNvbW1lbnRzKHRleHQsIGVuY2xvc2luZ05vZGUsIHByZWNlZGluZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHx8IGhhbmRsZUFzc2lnbm1lbnRQYXR0ZXJuQ29tbWVudHMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCkgfHwgaGFuZGxlTWV0aG9kTmFtZUNvbW1lbnRzKHRleHQsIGVuY2xvc2luZ05vZGUsIHByZWNlZGluZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHx8IGhhbmRsZUxhYmVsZWRTdGF0ZW1lbnRDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBjb21tZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUVuZE9mTGluZUNvbW1lbnQoY29tbWVudCwgdGV4dCwgb3B0aW9ucywgYXN0LCBpc0xhc3RDb21tZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJlY2VkaW5nTm9kZSxcbiAgICAgIGVuY2xvc2luZ05vZGUsXG4gICAgICBmb2xsb3dpbmdOb2RlXG4gICAgfSA9IGNvbW1lbnQ7XG4gICAgcmV0dXJuIGhhbmRsZUNsb3N1cmVUeXBlQ2FzdENvbW1lbnRzKGZvbGxvd2luZ05vZGUsIGNvbW1lbnQpIHx8IGhhbmRsZUxhc3RGdW5jdGlvbkFyZ0NvbW1lbnRzKHRleHQsIHByZWNlZGluZ05vZGUsIGVuY2xvc2luZ05vZGUsIGZvbGxvd2luZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHx8IGhhbmRsZUNvbmRpdGlvbmFsRXhwcmVzc2lvbkNvbW1lbnRzKGVuY2xvc2luZ05vZGUsIHByZWNlZGluZ05vZGUsIGZvbGxvd2luZ05vZGUsIGNvbW1lbnQsIHRleHQsIG9wdGlvbnMpIHx8IGhhbmRsZUltcG9ydFNwZWNpZmllckNvbW1lbnRzKGVuY2xvc2luZ05vZGUsIGNvbW1lbnQpIHx8IGhhbmRsZUlmU3RhdGVtZW50Q29tbWVudHModGV4dCwgcHJlY2VkaW5nTm9kZSwgZW5jbG9zaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCwgb3B0aW9ucykgfHwgaGFuZGxlV2hpbGVDb21tZW50cyh0ZXh0LCBwcmVjZWRpbmdOb2RlLCBlbmNsb3NpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50LCBvcHRpb25zKSB8fCBoYW5kbGVUcnlTdGF0ZW1lbnRDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBwcmVjZWRpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50KSB8fCBoYW5kbGVDbGFzc0NvbW1lbnRzKGVuY2xvc2luZ05vZGUsIHByZWNlZGluZ05vZGUsIGZvbGxvd2luZ05vZGUsIGNvbW1lbnQpIHx8IGhhbmRsZUxhYmVsZWRTdGF0ZW1lbnRDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBjb21tZW50KSB8fCBoYW5kbGVDYWxsRXhwcmVzc2lvbkNvbW1lbnRzKHByZWNlZGluZ05vZGUsIGVuY2xvc2luZ05vZGUsIGNvbW1lbnQpIHx8IGhhbmRsZVByb3BlcnR5Q29tbWVudHMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCkgfHwgaGFuZGxlT25seUNvbW1lbnRzKGVuY2xvc2luZ05vZGUsIGFzdCwgY29tbWVudCwgaXNMYXN0Q29tbWVudCkgfHwgaGFuZGxlVHlwZUFsaWFzQ29tbWVudHMoZW5jbG9zaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCkgfHwgaGFuZGxlVmFyaWFibGVEZWNsYXJhdG9yQ29tbWVudHMoZW5jbG9zaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVSZW1haW5pbmdDb21tZW50KGNvbW1lbnQsIHRleHQsIG9wdGlvbnMsIGFzdCwgaXNMYXN0Q29tbWVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHByZWNlZGluZ05vZGUsXG4gICAgICBlbmNsb3NpbmdOb2RlLFxuICAgICAgZm9sbG93aW5nTm9kZVxuICAgIH0gPSBjb21tZW50O1xuXG4gICAgaWYgKGhhbmRsZUlmU3RhdGVtZW50Q29tbWVudHModGV4dCwgcHJlY2VkaW5nTm9kZSwgZW5jbG9zaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCwgb3B0aW9ucykgfHwgaGFuZGxlV2hpbGVDb21tZW50cyh0ZXh0LCBwcmVjZWRpbmdOb2RlLCBlbmNsb3NpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50LCBvcHRpb25zKSB8fCBoYW5kbGVPYmplY3RQcm9wZXJ0eUFzc2lnbm1lbnQoZW5jbG9zaW5nTm9kZSwgcHJlY2VkaW5nTm9kZSwgY29tbWVudCkgfHwgaGFuZGxlQ29tbWVudEluRW1wdHlQYXJlbnModGV4dCwgZW5jbG9zaW5nTm9kZSwgY29tbWVudCwgb3B0aW9ucykgfHwgaGFuZGxlTWV0aG9kTmFtZUNvbW1lbnRzKHRleHQsIGVuY2xvc2luZ05vZGUsIHByZWNlZGluZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHx8IGhhbmRsZU9ubHlDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBhc3QsIGNvbW1lbnQsIGlzTGFzdENvbW1lbnQpIHx8IGhhbmRsZUNvbW1lbnRBZnRlckFycm93UGFyYW1zKHRleHQsIGVuY2xvc2luZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHx8IGhhbmRsZUZ1bmN0aW9uTmFtZUNvbW1lbnRzKHRleHQsIGVuY2xvc2luZ05vZGUsIHByZWNlZGluZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHx8IGhhbmRsZVRTTWFwcGVkVHlwZUNvbW1lbnRzKHRleHQsIGVuY2xvc2luZ05vZGUsIHByZWNlZGluZ05vZGUsIGZvbGxvd2luZ05vZGUsIGNvbW1lbnQpIHx8IGhhbmRsZUJyZWFrQW5kQ29udGludWVTdGF0ZW1lbnRDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBjb21tZW50KSB8fCBoYW5kbGVUU0Z1bmN0aW9uVHJhaWxpbmdDb21tZW50cyh0ZXh0LCBlbmNsb3NpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50LCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkQmxvY2tTdGF0ZW1lbnRGaXJzdENvbW1lbnQobm9kZSwgY29tbWVudCkge1xuICAgIGNvbnN0IGJvZHkgPSBub2RlLmJvZHkuZmlsdGVyKG4gPT4gbi50eXBlICE9PSBcIkVtcHR5U3RhdGVtZW50XCIpO1xuXG4gICAgaWYgKGJvZHkubGVuZ3RoID09PSAwKSB7XG4gICAgICBhZGREYW5nbGluZ0NvbW1lbnQkMyhub2RlLCBjb21tZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkTGVhZGluZ0NvbW1lbnQkMyhib2R5WzBdLCBjb21tZW50KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRCbG9ja09yTm90Q29tbWVudChub2RlLCBjb21tZW50KSB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiKSB7XG4gICAgICBhZGRCbG9ja1N0YXRlbWVudEZpcnN0Q29tbWVudChub2RlLCBjb21tZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkTGVhZGluZ0NvbW1lbnQkMyhub2RlLCBjb21tZW50KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVDbG9zdXJlVHlwZUNhc3RDb21tZW50cyhmb2xsb3dpbmdOb2RlLCBjb21tZW50KSB7XG4gICAgaWYgKGZvbGxvd2luZ05vZGUgJiYgaXNUeXBlQ2FzdENvbW1lbnQoY29tbWVudCkpIHtcbiAgICAgIGFkZExlYWRpbmdDb21tZW50JDMoZm9sbG93aW5nTm9kZSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGhlcmUgYXJlIG9mdGVuIGNvbW1lbnRzIGJlZm9yZSB0aGUgZWxzZSBjbGF1c2Ugb2YgaWYgc3RhdGVtZW50cyBsaWtlXG4gIC8vXG4gIC8vICAgaWYgKDEpIHsgLi4uIH1cbiAgLy8gICAvLyBjb21tZW50XG4gIC8vICAgZWxzZSB7IC4uLiB9XG4gIC8vXG4gIC8vIFRoZXkgYXJlIGJlaW5nIGF0dGFjaGVkIGFzIGxlYWRpbmcgY29tbWVudHMgb2YgdGhlIEJsb2NrRXhwcmVzc2lvbiB3aGljaFxuICAvLyBpcyBub3Qgd2VsbCBwcmludGVkLiBXaGF0IHdlIHdhbnQgaXMgdG8gaW5zdGVhZCBtb3ZlIHRoZSBjb21tZW50IGluc2lkZVxuICAvLyBvZiB0aGUgYmxvY2sgYW5kIG1ha2UgaXQgbGVhZGluZ0NvbW1lbnQgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGJsb2NrXG4gIC8vIG9yIGRhbmdsaW5nIGNvbW1lbnQgb2YgdGhlIGJsb2NrIGlmIHRoZXJlIGlzIG5vdGhpbmcgaW5zaWRlXG4gIC8vXG4gIC8vICAgaWYgKDEpIHsgLi4uIH1cbiAgLy8gICBlbHNlIHtcbiAgLy8gICAgIC8vIGNvbW1lbnRcbiAgLy8gICAgIC4uLlxuICAvLyAgIH1cblxuXG4gIGZ1bmN0aW9uIGhhbmRsZUlmU3RhdGVtZW50Q29tbWVudHModGV4dCwgcHJlY2VkaW5nTm9kZSwgZW5jbG9zaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCwgb3B0aW9ucykge1xuICAgIGlmICghZW5jbG9zaW5nTm9kZSB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgIT09IFwiSWZTdGF0ZW1lbnRcIiB8fCAhZm9sbG93aW5nTm9kZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gV2UgdW5mb3J0dW5hdGVseSBoYXZlIG5vIHdheSB1c2luZyB0aGUgQVNUIG9yIGxvY2F0aW9uIG9mIG5vZGVzIHRvIGtub3dcbiAgICAvLyBpZiB0aGUgY29tbWVudCBpcyBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgY29uZGl0aW9uIHBhcmVudGhlc2lzOlxuICAgIC8vICAgaWYgKGEgLyogY29tbWVudCAqLykge31cbiAgICAvLyBUaGUgb25seSB3b3JrYXJvdW5kIEkgZm91bmQgaXMgdG8gbG9vayBhdCB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gc2VlIGlmXG4gICAgLy8gaXQgaXMgYSApLlxuXG5cbiAgICBjb25zdCBuZXh0Q2hhcmFjdGVyID0gdXRpbCQxLmdldE5leHROb25TcGFjZU5vbkNvbW1lbnRDaGFyYWN0ZXIodGV4dCwgY29tbWVudCwgb3B0aW9ucy5sb2NFbmQpO1xuXG4gICAgaWYgKG5leHRDaGFyYWN0ZXIgPT09IFwiKVwiKSB7XG4gICAgICBhZGRUcmFpbGluZ0NvbW1lbnQkMyhwcmVjZWRpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gQ29tbWVudHMgYmVmb3JlIGBlbHNlYDpcbiAgICAvLyAtIHRyZWF0IGFzIHRyYWlsaW5nIGNvbW1lbnRzIG9mIHRoZSBjb25zZXF1ZW50LCBpZiBpdCdzIGEgQmxvY2tTdGF0ZW1lbnRcbiAgICAvLyAtIHRyZWF0IGFzIGEgZGFuZ2xpbmcgY29tbWVudCBvdGhlcndpc2VcblxuXG4gICAgaWYgKHByZWNlZGluZ05vZGUgPT09IGVuY2xvc2luZ05vZGUuY29uc2VxdWVudCAmJiBmb2xsb3dpbmdOb2RlID09PSBlbmNsb3NpbmdOb2RlLmFsdGVybmF0ZSkge1xuICAgICAgaWYgKHByZWNlZGluZ05vZGUudHlwZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiKSB7XG4gICAgICAgIGFkZFRyYWlsaW5nQ29tbWVudCQzKHByZWNlZGluZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkRGFuZ2xpbmdDb21tZW50JDMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChmb2xsb3dpbmdOb2RlLnR5cGUgPT09IFwiQmxvY2tTdGF0ZW1lbnRcIikge1xuICAgICAgYWRkQmxvY2tTdGF0ZW1lbnRGaXJzdENvbW1lbnQoZm9sbG93aW5nTm9kZSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZm9sbG93aW5nTm9kZS50eXBlID09PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIGFkZEJsb2NrT3JOb3RDb21tZW50KGZvbGxvd2luZ05vZGUuY29uc2VxdWVudCwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIEZvciBjb21tZW50cyBwb3NpdGlvbmVkIGFmdGVyIHRoZSBjb25kaXRpb24gcGFyZW50aGVzaXMgaW4gYW4gaWYgc3RhdGVtZW50XG4gICAgLy8gYmVmb3JlIHRoZSBjb25zZXF1ZW50IHdpdGhvdXQgYnJhY2tldHMgb24sIHN1Y2ggYXNcbiAgICAvLyBpZiAoYSkgLyogY29tbWVudCAqLyB0cnVlLFxuICAgIC8vIHdlIGxvb2sgYXQgdGhlIG5leHQgY2hhcmFjdGVyIHRvIHNlZSBpZiB0aGUgZm9sbG93aW5nIG5vZGVcbiAgICAvLyBpcyB0aGUgY29uc2VxdWVudCBmb3IgdGhlIGlmIHN0YXRlbWVudFxuXG5cbiAgICBpZiAoZW5jbG9zaW5nTm9kZS5jb25zZXF1ZW50ID09PSBmb2xsb3dpbmdOb2RlKSB7XG4gICAgICBhZGRMZWFkaW5nQ29tbWVudCQzKGZvbGxvd2luZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlV2hpbGVDb21tZW50cyh0ZXh0LCBwcmVjZWRpbmdOb2RlLCBlbmNsb3NpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50LCBvcHRpb25zKSB7XG4gICAgaWYgKCFlbmNsb3NpbmdOb2RlIHx8IGVuY2xvc2luZ05vZGUudHlwZSAhPT0gXCJXaGlsZVN0YXRlbWVudFwiIHx8ICFmb2xsb3dpbmdOb2RlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBXZSB1bmZvcnR1bmF0ZWx5IGhhdmUgbm8gd2F5IHVzaW5nIHRoZSBBU1Qgb3IgbG9jYXRpb24gb2Ygbm9kZXMgdG8ga25vd1xuICAgIC8vIGlmIHRoZSBjb21tZW50IGlzIHBvc2l0aW9uZWQgYmVmb3JlIHRoZSBjb25kaXRpb24gcGFyZW50aGVzaXM6XG4gICAgLy8gICB3aGlsZSAoYSAvKiBjb21tZW50ICovKSB7fVxuICAgIC8vIFRoZSBvbmx5IHdvcmthcm91bmQgSSBmb3VuZCBpcyB0byBsb29rIGF0IHRoZSBuZXh0IGNoYXJhY3RlciB0byBzZWUgaWZcbiAgICAvLyBpdCBpcyBhICkuXG5cblxuICAgIGNvbnN0IG5leHRDaGFyYWN0ZXIgPSB1dGlsJDEuZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3Rlcih0ZXh0LCBjb21tZW50LCBvcHRpb25zLmxvY0VuZCk7XG5cbiAgICBpZiAobmV4dENoYXJhY3RlciA9PT0gXCIpXCIpIHtcbiAgICAgIGFkZFRyYWlsaW5nQ29tbWVudCQzKHByZWNlZGluZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGZvbGxvd2luZ05vZGUudHlwZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiKSB7XG4gICAgICBhZGRCbG9ja1N0YXRlbWVudEZpcnN0Q29tbWVudChmb2xsb3dpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBTYW1lIGFzIElmU3RhdGVtZW50IGJ1dCBmb3IgVHJ5U3RhdGVtZW50XG5cblxuICBmdW5jdGlvbiBoYW5kbGVUcnlTdGF0ZW1lbnRDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBwcmVjZWRpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50KSB7XG4gICAgaWYgKCFlbmNsb3NpbmdOb2RlIHx8IGVuY2xvc2luZ05vZGUudHlwZSAhPT0gXCJUcnlTdGF0ZW1lbnRcIiAmJiBlbmNsb3NpbmdOb2RlLnR5cGUgIT09IFwiQ2F0Y2hDbGF1c2VcIiB8fCAhZm9sbG93aW5nTm9kZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiQ2F0Y2hDbGF1c2VcIiAmJiBwcmVjZWRpbmdOb2RlKSB7XG4gICAgICBhZGRUcmFpbGluZ0NvbW1lbnQkMyhwcmVjZWRpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChmb2xsb3dpbmdOb2RlLnR5cGUgPT09IFwiQmxvY2tTdGF0ZW1lbnRcIikge1xuICAgICAgYWRkQmxvY2tTdGF0ZW1lbnRGaXJzdENvbW1lbnQoZm9sbG93aW5nTm9kZSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZm9sbG93aW5nTm9kZS50eXBlID09PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgICBhZGRCbG9ja09yTm90Q29tbWVudChmb2xsb3dpbmdOb2RlLmZpbmFsaXplciwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZm9sbG93aW5nTm9kZS50eXBlID09PSBcIkNhdGNoQ2xhdXNlXCIpIHtcbiAgICAgIGFkZEJsb2NrT3JOb3RDb21tZW50KGZvbGxvd2luZ05vZGUuYm9keSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVNZW1iZXJFeHByZXNzaW9uQ29tbWVudHMoZW5jbG9zaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCkge1xuICAgIGlmIChlbmNsb3NpbmdOb2RlICYmIChlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIikgJiYgZm9sbG93aW5nTm9kZSAmJiBmb2xsb3dpbmdOb2RlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICBhZGRMZWFkaW5nQ29tbWVudCQzKGVuY2xvc2luZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29tbWVudHMoZW5jbG9zaW5nTm9kZSwgcHJlY2VkaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCwgdGV4dCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGlzU2FtZUxpbmVBc1ByZWNlZGluZ05vZGUgPSBwcmVjZWRpbmdOb2RlICYmICF1dGlsJDEuaGFzTmV3bGluZUluUmFuZ2UodGV4dCwgb3B0aW9ucy5sb2NFbmQocHJlY2VkaW5nTm9kZSksIG9wdGlvbnMubG9jU3RhcnQoY29tbWVudCkpO1xuXG4gICAgaWYgKCghcHJlY2VkaW5nTm9kZSB8fCAhaXNTYW1lTGluZUFzUHJlY2VkaW5nTm9kZSkgJiYgZW5jbG9zaW5nTm9kZSAmJiBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIgJiYgZm9sbG93aW5nTm9kZSkge1xuICAgICAgYWRkTGVhZGluZ0NvbW1lbnQkMyhmb2xsb3dpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU9iamVjdFByb3BlcnR5QXNzaWdubWVudChlbmNsb3NpbmdOb2RlLCBwcmVjZWRpbmdOb2RlLCBjb21tZW50KSB7XG4gICAgaWYgKGVuY2xvc2luZ05vZGUgJiYgKGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJPYmplY3RQcm9wZXJ0eVwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJQcm9wZXJ0eVwiKSAmJiBlbmNsb3NpbmdOb2RlLnNob3J0aGFuZCAmJiBlbmNsb3NpbmdOb2RlLmtleSA9PT0gcHJlY2VkaW5nTm9kZSAmJiBlbmNsb3NpbmdOb2RlLnZhbHVlLnR5cGUgPT09IFwiQXNzaWdubWVudFBhdHRlcm5cIikge1xuICAgICAgYWRkVHJhaWxpbmdDb21tZW50JDMoZW5jbG9zaW5nTm9kZS52YWx1ZS5sZWZ0LCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNsYXNzQ29tbWVudHMoZW5jbG9zaW5nTm9kZSwgcHJlY2VkaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCkge1xuICAgIGlmIChlbmNsb3NpbmdOb2RlICYmIChlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiQ2xhc3NEZWNsYXJhdGlvblwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJDbGFzc0V4cHJlc3Npb25cIikgJiYgZW5jbG9zaW5nTm9kZS5kZWNvcmF0b3JzICYmIGVuY2xvc2luZ05vZGUuZGVjb3JhdG9ycy5sZW5ndGggPiAwICYmICEoZm9sbG93aW5nTm9kZSAmJiBmb2xsb3dpbmdOb2RlLnR5cGUgPT09IFwiRGVjb3JhdG9yXCIpKSB7XG4gICAgICBpZiAoIWVuY2xvc2luZ05vZGUuZGVjb3JhdG9ycyB8fCBlbmNsb3NpbmdOb2RlLmRlY29yYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGFkZExlYWRpbmdDb21tZW50JDMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRUcmFpbGluZ0NvbW1lbnQkMyhlbmNsb3NpbmdOb2RlLmRlY29yYXRvcnNbZW5jbG9zaW5nTm9kZS5kZWNvcmF0b3JzLmxlbmd0aCAtIDFdLCBjb21tZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTWV0aG9kTmFtZUNvbW1lbnRzKHRleHQsIGVuY2xvc2luZ05vZGUsIHByZWNlZGluZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHtcbiAgICAvLyBUaGlzIGlzIG9ubHkgbmVlZGVkIGZvciBlc3RyZWUgcGFyc2VycyAoZmxvdywgdHlwZXNjcmlwdCkgdG8gYXR0YWNoXG4gICAgLy8gYWZ0ZXIgYSBtZXRob2QgbmFtZTpcbiAgICAvLyBvYmogPSB7IGZuIC8qY29tbWVudCovKCkge30gfTtcbiAgICBpZiAoZW5jbG9zaW5nTm9kZSAmJiBwcmVjZWRpbmdOb2RlICYmICggLy8gXCJNZXRob2REZWZpbml0aW9uXCIgaXMgaGFuZGxlZCBpbiBnZXRDb21tZW50Q2hpbGROb2Rlc1xuICAgIGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJQcm9wZXJ0eVwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJUU0RlY2xhcmVNZXRob2RcIiB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiVFNBYnN0cmFjdE1ldGhvZERlZmluaXRpb25cIikgJiYgcHJlY2VkaW5nTm9kZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBlbmNsb3NpbmdOb2RlLmtleSA9PT0gcHJlY2VkaW5nTm9kZSAmJiAvLyBzcGVjaWFsIFByb3BlcnR5IGNhc2U6IHsga2V5OiAvKmNvbW1lbnQqLyh2YWx1ZSkgfTtcbiAgICAvLyBjb21tZW50IHNob3VsZCBiZSBhdHRhY2hlZCB0byB2YWx1ZSBpbnN0ZWFkIG9mIGtleVxuICAgIHV0aWwkMS5nZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyKHRleHQsIHByZWNlZGluZ05vZGUsIG9wdGlvbnMubG9jRW5kKSAhPT0gXCI6XCIpIHtcbiAgICAgIGFkZFRyYWlsaW5nQ29tbWVudCQzKHByZWNlZGluZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBQcmludCBjb21tZW50cyBiZXR3ZWVuIGRlY29yYXRvcnMgYW5kIGNsYXNzIG1ldGhvZHMgYXMgYSB0cmFpbGluZyBjb21tZW50XG4gICAgLy8gb24gdGhlIGRlY29yYXRvciBub2RlIGluc3RlYWQgb2YgdGhlIG1ldGhvZCBub2RlXG5cblxuICAgIGlmIChwcmVjZWRpbmdOb2RlICYmIGVuY2xvc2luZ05vZGUgJiYgcHJlY2VkaW5nTm9kZS50eXBlID09PSBcIkRlY29yYXRvclwiICYmIChlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiQ2xhc3NNZXRob2RcIiB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiQ2xhc3NQcm9wZXJ0eVwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJUU0Fic3RyYWN0Q2xhc3NQcm9wZXJ0eVwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJUU0Fic3RyYWN0TWV0aG9kRGVmaW5pdGlvblwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJUU0RlY2xhcmVNZXRob2RcIiB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiTWV0aG9kRGVmaW5pdGlvblwiKSkge1xuICAgICAgYWRkVHJhaWxpbmdDb21tZW50JDMocHJlY2VkaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVGdW5jdGlvbk5hbWVDb21tZW50cyh0ZXh0LCBlbmNsb3NpbmdOb2RlLCBwcmVjZWRpbmdOb2RlLCBjb21tZW50LCBvcHRpb25zKSB7XG4gICAgaWYgKHV0aWwkMS5nZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyKHRleHQsIGNvbW1lbnQsIG9wdGlvbnMubG9jRW5kKSAhPT0gXCIoXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJlY2VkaW5nTm9kZSAmJiBlbmNsb3NpbmdOb2RlICYmIChlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJGdW5jdGlvbkV4cHJlc3Npb25cIiB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiQ2xhc3NNZXRob2RcIiB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiTWV0aG9kRGVmaW5pdGlvblwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJPYmplY3RNZXRob2RcIikpIHtcbiAgICAgIGFkZFRyYWlsaW5nQ29tbWVudCQzKHByZWNlZGluZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQ29tbWVudEFmdGVyQXJyb3dQYXJhbXModGV4dCwgZW5jbG9zaW5nTm9kZSwgY29tbWVudCwgb3B0aW9ucykge1xuICAgIGlmICghKGVuY2xvc2luZ05vZGUgJiYgZW5jbG9zaW5nTm9kZS50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXgkMih0ZXh0LCBjb21tZW50LCBvcHRpb25zLmxvY0VuZCk7XG5cbiAgICBpZiAodGV4dC5zbGljZShpbmRleCwgaW5kZXggKyAyKSA9PT0gXCI9PlwiKSB7XG4gICAgICBhZGREYW5nbGluZ0NvbW1lbnQkMyhlbmNsb3NpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNvbW1lbnRJbkVtcHR5UGFyZW5zKHRleHQsIGVuY2xvc2luZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHtcbiAgICBpZiAodXRpbCQxLmdldE5leHROb25TcGFjZU5vbkNvbW1lbnRDaGFyYWN0ZXIodGV4dCwgY29tbWVudCwgb3B0aW9ucy5sb2NFbmQpICE9PSBcIilcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gT25seSBhZGQgZGFuZ2xpbmcgY29tbWVudHMgdG8gZml4IHRoZSBjYXNlIHdoZW4gbm8gcGFyYW1zIGFyZSBwcmVzZW50LFxuICAgIC8vIGkuZS4gYSBmdW5jdGlvbiB3aXRob3V0IGFueSBhcmd1bWVudC5cblxuXG4gICAgaWYgKGVuY2xvc2luZ05vZGUgJiYgKGlzUmVhbEZ1bmN0aW9uTGlrZU5vZGUoZW5jbG9zaW5nTm9kZSkgJiYgLy8gYHBhcmFtc2AgdnMgYHBhcmFtZXRlcnNgIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9pc3N1ZXMvOTIzMVxuICAgIChlbmNsb3NpbmdOb2RlLnBhcmFtcyB8fCBlbmNsb3NpbmdOb2RlLnBhcmFtZXRlcnMpLmxlbmd0aCA9PT0gMCB8fCAoZW5jbG9zaW5nTm9kZS50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgfHwgZW5jbG9zaW5nTm9kZS50eXBlID09PSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIiB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiTmV3RXhwcmVzc2lvblwiKSAmJiBlbmNsb3NpbmdOb2RlLmFyZ3VtZW50cy5sZW5ndGggPT09IDApKSB7XG4gICAgICBhZGREYW5nbGluZ0NvbW1lbnQkMyhlbmNsb3NpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChlbmNsb3NpbmdOb2RlICYmIGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJNZXRob2REZWZpbml0aW9uXCIgJiYgZW5jbG9zaW5nTm9kZS52YWx1ZS5wYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhZGREYW5nbGluZ0NvbW1lbnQkMyhlbmNsb3NpbmdOb2RlLnZhbHVlLCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUxhc3RGdW5jdGlvbkFyZ0NvbW1lbnRzKHRleHQsIHByZWNlZGluZ05vZGUsIGVuY2xvc2luZ05vZGUsIGZvbGxvd2luZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHtcbiAgICAvLyBGbG93IGZ1bmN0aW9uIHR5cGUgZGVmaW5pdGlvbnNcbiAgICBpZiAocHJlY2VkaW5nTm9kZSAmJiBwcmVjZWRpbmdOb2RlLnR5cGUgPT09IFwiRnVuY3Rpb25UeXBlUGFyYW1cIiAmJiBlbmNsb3NpbmdOb2RlICYmIGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIgJiYgZm9sbG93aW5nTm9kZSAmJiBmb2xsb3dpbmdOb2RlLnR5cGUgIT09IFwiRnVuY3Rpb25UeXBlUGFyYW1cIikge1xuICAgICAgYWRkVHJhaWxpbmdDb21tZW50JDMocHJlY2VkaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFJlYWwgZnVuY3Rpb25zIGFuZCBUeXBlU2NyaXB0IGZ1bmN0aW9uIHR5cGUgZGVmaW5pdGlvbnNcblxuXG4gICAgaWYgKHByZWNlZGluZ05vZGUgJiYgKHByZWNlZGluZ05vZGUudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgfHwgcHJlY2VkaW5nTm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpICYmIGVuY2xvc2luZ05vZGUgJiYgaXNSZWFsRnVuY3Rpb25MaWtlTm9kZShlbmNsb3NpbmdOb2RlKSAmJiB1dGlsJDEuZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3Rlcih0ZXh0LCBjb21tZW50LCBvcHRpb25zLmxvY0VuZCkgPT09IFwiKVwiKSB7XG4gICAgICBhZGRUcmFpbGluZ0NvbW1lbnQkMyhwcmVjZWRpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChlbmNsb3NpbmdOb2RlICYmIGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgJiYgZm9sbG93aW5nTm9kZSAmJiBmb2xsb3dpbmdOb2RlLnR5cGUgPT09IFwiQmxvY2tTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgZnVuY3Rpb25QYXJhbVJpZ2h0UGFyZW5JbmRleCA9ICgoKSA9PiB7XG4gICAgICAgIGlmICgoZW5jbG9zaW5nTm9kZS5wYXJhbXMgfHwgZW5jbG9zaW5nTm9kZS5wYXJhbWV0ZXJzKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdXRpbCQxLmdldE5leHROb25TcGFjZU5vbkNvbW1lbnRDaGFyYWN0ZXJJbmRleFdpdGhTdGFydEluZGV4KHRleHQsIG9wdGlvbnMubG9jRW5kKHV0aWwkMS5nZXRMYXN0KGVuY2xvc2luZ05vZGUucGFyYW1zIHx8IGVuY2xvc2luZ05vZGUucGFyYW1ldGVycykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uUGFyYW1MZWZ0UGFyZW5JbmRleCA9IHV0aWwkMS5nZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXhXaXRoU3RhcnRJbmRleCh0ZXh0LCBvcHRpb25zLmxvY0VuZChlbmNsb3NpbmdOb2RlLmlkKSk7XG4gICAgICAgIHJldHVybiB1dGlsJDEuZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlckluZGV4V2l0aFN0YXJ0SW5kZXgodGV4dCwgZnVuY3Rpb25QYXJhbUxlZnRQYXJlbkluZGV4ICsgMSk7XG4gICAgICB9KSgpO1xuXG4gICAgICBpZiAob3B0aW9ucy5sb2NTdGFydChjb21tZW50KSA+IGZ1bmN0aW9uUGFyYW1SaWdodFBhcmVuSW5kZXgpIHtcbiAgICAgICAgYWRkQmxvY2tTdGF0ZW1lbnRGaXJzdENvbW1lbnQoZm9sbG93aW5nTm9kZSwgY29tbWVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUltcG9ydFNwZWNpZmllckNvbW1lbnRzKGVuY2xvc2luZ05vZGUsIGNvbW1lbnQpIHtcbiAgICBpZiAoZW5jbG9zaW5nTm9kZSAmJiBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiSW1wb3J0U3BlY2lmaWVyXCIpIHtcbiAgICAgIGFkZExlYWRpbmdDb21tZW50JDMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVMYWJlbGVkU3RhdGVtZW50Q29tbWVudHMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCkge1xuICAgIGlmIChlbmNsb3NpbmdOb2RlICYmIGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJMYWJlbGVkU3RhdGVtZW50XCIpIHtcbiAgICAgIGFkZExlYWRpbmdDb21tZW50JDMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVCcmVha0FuZENvbnRpbnVlU3RhdGVtZW50Q29tbWVudHMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCkge1xuICAgIGlmIChlbmNsb3NpbmdOb2RlICYmIChlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiQ29udGludWVTdGF0ZW1lbnRcIiB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiQnJlYWtTdGF0ZW1lbnRcIikgJiYgIWVuY2xvc2luZ05vZGUubGFiZWwpIHtcbiAgICAgIGFkZFRyYWlsaW5nQ29tbWVudCQzKGVuY2xvc2luZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQ2FsbEV4cHJlc3Npb25Db21tZW50cyhwcmVjZWRpbmdOb2RlLCBlbmNsb3NpbmdOb2RlLCBjb21tZW50KSB7XG4gICAgaWYgKGVuY2xvc2luZ05vZGUgJiYgKGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCIpICYmIHByZWNlZGluZ05vZGUgJiYgZW5jbG9zaW5nTm9kZS5jYWxsZWUgPT09IHByZWNlZGluZ05vZGUgJiYgZW5jbG9zaW5nTm9kZS5hcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgYWRkTGVhZGluZ0NvbW1lbnQkMyhlbmNsb3NpbmdOb2RlLmFyZ3VtZW50c1swXSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVVbmlvblR5cGVDb21tZW50cyhwcmVjZWRpbmdOb2RlLCBlbmNsb3NpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50KSB7XG4gICAgaWYgKGVuY2xvc2luZ05vZGUgJiYgKGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJVbmlvblR5cGVBbm5vdGF0aW9uXCIgfHwgZW5jbG9zaW5nTm9kZS50eXBlID09PSBcIlRTVW5pb25UeXBlXCIpKSB7XG4gICAgICBpZiAodXRpbCQxLmlzTm9kZUlnbm9yZUNvbW1lbnQoY29tbWVudCkpIHtcbiAgICAgICAgZm9sbG93aW5nTm9kZS5wcmV0dGllcklnbm9yZSA9IHRydWU7XG4gICAgICAgIGNvbW1lbnQudW5pZ25vcmUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJlY2VkaW5nTm9kZSkge1xuICAgICAgICBhZGRUcmFpbGluZ0NvbW1lbnQkMyhwcmVjZWRpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZm9sbG93aW5nTm9kZSAmJiAoZm9sbG93aW5nTm9kZS50eXBlID09PSBcIlVuaW9uVHlwZUFubm90YXRpb25cIiB8fCBmb2xsb3dpbmdOb2RlLnR5cGUgPT09IFwiVFNVbmlvblR5cGVcIikgJiYgdXRpbCQxLmlzTm9kZUlnbm9yZUNvbW1lbnQoY29tbWVudCkpIHtcbiAgICAgIGZvbGxvd2luZ05vZGUudHlwZXNbMF0ucHJldHRpZXJJZ25vcmUgPSB0cnVlO1xuICAgICAgY29tbWVudC51bmlnbm9yZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBjb21tZW50KSB7XG4gICAgaWYgKGVuY2xvc2luZ05vZGUgJiYgKGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJQcm9wZXJ0eVwiIHx8IGVuY2xvc2luZ05vZGUudHlwZSA9PT0gXCJPYmplY3RQcm9wZXJ0eVwiKSkge1xuICAgICAgYWRkTGVhZGluZ0NvbW1lbnQkMyhlbmNsb3NpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU9ubHlDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBhc3QsIGNvbW1lbnQsIGlzTGFzdENvbW1lbnQpIHtcbiAgICAvLyBXaXRoIEZsb3cgdGhlIGVuY2xvc2luZ05vZGUgaXMgdW5kZWZpbmVkIHNvIHVzZSB0aGUgQVNUIGluc3RlYWQuXG4gICAgaWYgKGFzdCAmJiBhc3QuYm9keSAmJiBhc3QuYm9keS5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChpc0xhc3RDb21tZW50KSB7XG4gICAgICAgIGFkZERhbmdsaW5nQ29tbWVudCQzKGFzdCwgY29tbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRMZWFkaW5nQ29tbWVudCQzKGFzdCwgY29tbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZW5jbG9zaW5nTm9kZSAmJiBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiUHJvZ3JhbVwiICYmIGVuY2xvc2luZ05vZGUuYm9keS5sZW5ndGggPT09IDAgJiYgZW5jbG9zaW5nTm9kZS5kaXJlY3RpdmVzICYmIGVuY2xvc2luZ05vZGUuZGlyZWN0aXZlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChpc0xhc3RDb21tZW50KSB7XG4gICAgICAgIGFkZERhbmdsaW5nQ29tbWVudCQzKGVuY2xvc2luZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkTGVhZGluZ0NvbW1lbnQkMyhlbmNsb3NpbmdOb2RlLCBjb21tZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlRm9yQ29tbWVudHMoZW5jbG9zaW5nTm9kZSwgcHJlY2VkaW5nTm9kZSwgY29tbWVudCkge1xuICAgIGlmIChlbmNsb3NpbmdOb2RlICYmIChlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiRm9ySW5TdGF0ZW1lbnRcIiB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiRm9yT2ZTdGF0ZW1lbnRcIikpIHtcbiAgICAgIGFkZExlYWRpbmdDb21tZW50JDMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVJbXBvcnREZWNsYXJhdGlvbkNvbW1lbnRzKHRleHQsIGVuY2xvc2luZ05vZGUsIHByZWNlZGluZ05vZGUsIGNvbW1lbnQsIG9wdGlvbnMpIHtcbiAgICBpZiAocHJlY2VkaW5nTm9kZSAmJiBwcmVjZWRpbmdOb2RlLnR5cGUgPT09IFwiSW1wb3J0U3BlY2lmaWVyXCIgJiYgZW5jbG9zaW5nTm9kZSAmJiBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiSW1wb3J0RGVjbGFyYXRpb25cIiAmJiB1dGlsJDEuaGFzTmV3bGluZSh0ZXh0LCBvcHRpb25zLmxvY0VuZChjb21tZW50KSkpIHtcbiAgICAgIGFkZFRyYWlsaW5nQ29tbWVudCQzKHByZWNlZGluZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQXNzaWdubWVudFBhdHRlcm5Db21tZW50cyhlbmNsb3NpbmdOb2RlLCBjb21tZW50KSB7XG4gICAgaWYgKGVuY2xvc2luZ05vZGUgJiYgZW5jbG9zaW5nTm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpIHtcbiAgICAgIGFkZExlYWRpbmdDb21tZW50JDMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVUeXBlQWxpYXNDb21tZW50cyhlbmNsb3NpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50KSB7XG4gICAgaWYgKGVuY2xvc2luZ05vZGUgJiYgZW5jbG9zaW5nTm9kZS50eXBlID09PSBcIlR5cGVBbGlhc1wiKSB7XG4gICAgICBhZGRMZWFkaW5nQ29tbWVudCQzKGVuY2xvc2luZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlVmFyaWFibGVEZWNsYXJhdG9yQ29tbWVudHMoZW5jbG9zaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCkge1xuICAgIGlmIChlbmNsb3NpbmdOb2RlICYmIChlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdG9yXCIgfHwgZW5jbG9zaW5nTm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIpICYmIGZvbGxvd2luZ05vZGUgJiYgKGZvbGxvd2luZ05vZGUudHlwZSA9PT0gXCJPYmplY3RFeHByZXNzaW9uXCIgfHwgZm9sbG93aW5nTm9kZS50eXBlID09PSBcIkFycmF5RXhwcmVzc2lvblwiIHx8IGZvbGxvd2luZ05vZGUudHlwZSA9PT0gXCJUZW1wbGF0ZUxpdGVyYWxcIiB8fCBmb2xsb3dpbmdOb2RlLnR5cGUgPT09IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIgfHwgaXNCbG9ja0NvbW1lbnQoY29tbWVudCkpKSB7XG4gICAgICBhZGRMZWFkaW5nQ29tbWVudCQzKGZvbGxvd2luZ05vZGUsIGNvbW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlVFNGdW5jdGlvblRyYWlsaW5nQ29tbWVudHModGV4dCwgZW5jbG9zaW5nTm9kZSwgZm9sbG93aW5nTm9kZSwgY29tbWVudCwgb3B0aW9ucykge1xuICAgIGlmICghZm9sbG93aW5nTm9kZSAmJiBlbmNsb3NpbmdOb2RlICYmIChlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiVFNNZXRob2RTaWduYXR1cmVcIiB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiVFNEZWNsYXJlRnVuY3Rpb25cIiB8fCBlbmNsb3NpbmdOb2RlLnR5cGUgPT09IFwiVFNBYnN0cmFjdE1ldGhvZERlZmluaXRpb25cIikgJiYgdXRpbCQxLmdldE5leHROb25TcGFjZU5vbkNvbW1lbnRDaGFyYWN0ZXIodGV4dCwgY29tbWVudCwgb3B0aW9ucy5sb2NFbmQpID09PSBcIjtcIikge1xuICAgICAgYWRkVHJhaWxpbmdDb21tZW50JDMoZW5jbG9zaW5nTm9kZSwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVUU01hcHBlZFR5cGVDb21tZW50cyh0ZXh0LCBlbmNsb3NpbmdOb2RlLCBwcmVjZWRpbmdOb2RlLCBmb2xsb3dpbmdOb2RlLCBjb21tZW50KSB7XG4gICAgaWYgKCFlbmNsb3NpbmdOb2RlIHx8IGVuY2xvc2luZ05vZGUudHlwZSAhPT0gXCJUU01hcHBlZFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChmb2xsb3dpbmdOb2RlICYmIGZvbGxvd2luZ05vZGUudHlwZSA9PT0gXCJUU1R5cGVQYXJhbWV0ZXJcIiAmJiBmb2xsb3dpbmdOb2RlLm5hbWUpIHtcbiAgICAgIGFkZExlYWRpbmdDb21tZW50JDMoZm9sbG93aW5nTm9kZS5uYW1lLCBjb21tZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwcmVjZWRpbmdOb2RlICYmIHByZWNlZGluZ05vZGUudHlwZSA9PT0gXCJUU1R5cGVQYXJhbWV0ZXJcIiAmJiBwcmVjZWRpbmdOb2RlLmNvbnN0cmFpbnQpIHtcbiAgICAgIGFkZFRyYWlsaW5nQ29tbWVudCQzKHByZWNlZGluZ05vZGUuY29uc3RyYWludCwgY29tbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBpc0Jsb2NrQ29tbWVudChjb21tZW50KSB7XG4gICAgcmV0dXJuIGNvbW1lbnQudHlwZSA9PT0gXCJCbG9ja1wiIHx8IGNvbW1lbnQudHlwZSA9PT0gXCJDb21tZW50QmxvY2tcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0xlYWRpbmdDb21tZW50KG5vZGUsIGZuID0gKCkgPT4gdHJ1ZSkge1xuICAgIGlmIChub2RlLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgcmV0dXJuIG5vZGUubGVhZGluZ0NvbW1lbnRzLnNvbWUoZm4pO1xuICAgIH1cblxuICAgIGlmIChub2RlLmNvbW1lbnRzKSB7XG4gICAgICByZXR1cm4gbm9kZS5jb21tZW50cy5zb21lKGNvbW1lbnQgPT4gY29tbWVudC5sZWFkaW5nICYmIGZuKGNvbW1lbnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBpc1JlYWxGdW5jdGlvbkxpa2VOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgfHwgbm9kZS50eXBlID09PSBcIk9iamVjdE1ldGhvZFwiIHx8IG5vZGUudHlwZSA9PT0gXCJDbGFzc01ldGhvZFwiIHx8IG5vZGUudHlwZSA9PT0gXCJUU0RlY2xhcmVGdW5jdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJUU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIgfHwgbm9kZS50eXBlID09PSBcIlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb25cIiB8fCBub2RlLnR5cGUgPT09IFwiVFNNZXRob2RTaWduYXR1cmVcIiB8fCBub2RlLnR5cGUgPT09IFwiVFNDb25zdHJ1Y3RvclR5cGVcIiB8fCBub2RlLnR5cGUgPT09IFwiVFNGdW5jdGlvblR5cGVcIiB8fCBub2RlLnR5cGUgPT09IFwiVFNEZWNsYXJlTWV0aG9kXCI7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRHYXBSZWdleChlbmNsb3NpbmdOb2RlKSB7XG4gICAgaWYgKGVuY2xvc2luZ05vZGUgJiYgZW5jbG9zaW5nTm9kZS50eXBlICE9PSBcIkJpbmFyeUV4cHJlc3Npb25cIiAmJiBlbmNsb3NpbmdOb2RlLnR5cGUgIT09IFwiTG9naWNhbEV4cHJlc3Npb25cIikge1xuICAgICAgLy8gU3VwcG9ydCBkZWdlbmVyYXRlIHNpbmdsZS1lbGVtZW50IHVuaW9ucyBhbmQgaW50ZXJzZWN0aW9ucy5cbiAgICAgIC8vIEUuZy46IGB0eXBlIEEgPSAvKiAxICovICYgQmBcbiAgICAgIHJldHVybiAvXltcXHMoJnxdKiQvO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldENvbW1lbnRDaGlsZE5vZGVzKG5vZGUsIG9wdGlvbnMpIHtcbiAgICAvLyBQcmV2ZW50IGF0dGFjaGluZyBjb21tZW50cyB0byBGdW5jdGlvbkV4cHJlc3Npb24gaW4gdGhpcyBjYXNlOlxuICAgIC8vICAgICBjbGFzcyBGb28ge1xuICAgIC8vICAgICAgIGJhcigpIC8vIGNvbW1lbnRcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBiYXooKTtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICBpZiAoKG9wdGlvbnMucGFyc2VyID09PSBcInR5cGVzY3JpcHRcIiB8fCBvcHRpb25zLnBhcnNlciA9PT0gXCJmbG93XCIpICYmIG5vZGUudHlwZSA9PT0gXCJNZXRob2REZWZpbml0aW9uXCIgJiYgbm9kZS52YWx1ZSAmJiBub2RlLnZhbHVlLnR5cGUgPT09IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIgJiYgbm9kZS52YWx1ZS5wYXJhbXMubGVuZ3RoID09PSAwICYmICFub2RlLnZhbHVlLnJldHVyblR5cGUgJiYgKCFub2RlLnZhbHVlLnR5cGVQYXJhbWV0ZXJzIHx8IG5vZGUudmFsdWUudHlwZVBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSAmJiBub2RlLnZhbHVlLmJvZHkpIHtcbiAgICAgIHJldHVybiBbLi4uKG5vZGUuZGVjb3JhdG9ycyB8fCBbXSksIG5vZGUua2V5LCBub2RlLnZhbHVlLmJvZHldO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVHlwZUNhc3RDb21tZW50KGNvbW1lbnQpIHtcbiAgICByZXR1cm4gaXNCbG9ja0NvbW1lbnQoY29tbWVudCkgJiYgY29tbWVudC52YWx1ZVswXSA9PT0gXCIqXCIgJiYgLy8gVHlwZVNjcmlwdCBleHBlY3RzIHRoZSB0eXBlIHRvIGJlIGVuY2xvc2VkIGluIGN1cmx5IGJyYWNrZXRzLCBob3dldmVyXG4gICAgLy8gQ2xvc3VyZSBDb21waWxlciBhY2NlcHRzIHR5cGVzIGluIHBhcmVucyBhbmQgZXZlbiB3aXRob3V0IGFueSBkZWxpbWl0ZXJzIGF0IGFsbC5cbiAgICAvLyBUaGF0J3Mgd2h5IHdlIGp1c3Qgc2VhcmNoIGZvciBcIkB0eXBlXCIuXG4gICAgL0B0eXBlXFxiLy50ZXN0KGNvbW1lbnQudmFsdWUpO1xuICB9XG5cbiAgdmFyIGNvbW1lbnRzJDEgPSB7XG4gICAgaGFuZGxlT3duTGluZUNvbW1lbnQsXG4gICAgaGFuZGxlRW5kT2ZMaW5lQ29tbWVudCxcbiAgICBoYW5kbGVSZW1haW5pbmdDb21tZW50LFxuICAgIGhhc0xlYWRpbmdDb21tZW50LFxuICAgIGlzQmxvY2tDb21tZW50LFxuICAgIGlzVHlwZUNhc3RDb21tZW50LFxuICAgIGdldEdhcFJlZ2V4LFxuICAgIGdldENvbW1lbnRDaGlsZE5vZGVzXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIGlzQmxvY2tDb21tZW50OiBpc0Jsb2NrQ29tbWVudCQxLFxuICAgIGhhc0xlYWRpbmdDb21tZW50OiBoYXNMZWFkaW5nQ29tbWVudCQxXG4gIH0gPSBjb21tZW50cyQxO1xuICBjb25zdCB7XG4gICAgYnVpbGRlcnM6IHtcbiAgICAgIGluZGVudDogaW5kZW50JDYsXG4gICAgICBqb2luOiBqb2luJDcsXG4gICAgICBsaW5lOiBsaW5lJDcsXG4gICAgICBoYXJkbGluZTogaGFyZGxpbmUkOCxcbiAgICAgIHNvZnRsaW5lOiBzb2Z0bGluZSQ1LFxuICAgICAgbGl0ZXJhbGxpbmU6IGxpdGVyYWxsaW5lJDMsXG4gICAgICBjb25jYXQ6IGNvbmNhdCRiLFxuICAgICAgZ3JvdXA6IGdyb3VwJGEsXG4gICAgICBkZWRlbnRUb1Jvb3Q6IGRlZGVudFRvUm9vdCQyXG4gICAgfSxcbiAgICB1dGlsczoge1xuICAgICAgbWFwRG9jOiBtYXBEb2MkMyxcbiAgICAgIHN0cmlwVHJhaWxpbmdIYXJkbGluZTogc3RyaXBUcmFpbGluZ0hhcmRsaW5lJDJcbiAgICB9XG4gIH0gPSBkb2N1bWVudDtcblxuICBmdW5jdGlvbiBlbWJlZCQzKHBhdGgsIHByaW50LCB0ZXh0VG9Eb2MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuICAgIGNvbnN0IHBhcmVudFBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgxKTtcblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwiVGVtcGxhdGVMaXRlcmFsXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBpc0NzcyA9IFtpc1N0eWxlZEpzeCwgaXNTdHlsZWRDb21wb25lbnRzLCBpc0Nzc1Byb3AsIGlzQW5ndWxhckNvbXBvbmVudFN0eWxlc10uc29tZShpc0l0ID0+IGlzSXQocGF0aCkpO1xuXG4gICAgICAgICAgaWYgKGlzQ3NzKSB7XG4gICAgICAgICAgICAvLyBHZXQgZnVsbCB0ZW1wbGF0ZSBsaXRlcmFsIHdpdGggZXhwcmVzc2lvbnMgcmVwbGFjZWQgYnkgcGxhY2Vob2xkZXJzXG4gICAgICAgICAgICBjb25zdCByYXdRdWFzaXMgPSBub2RlLnF1YXNpcy5tYXAocSA9PiBxLnZhbHVlLnJhdyk7XG4gICAgICAgICAgICBsZXQgcGxhY2Vob2xkZXJJRCA9IDA7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gcmF3UXVhc2lzLnJlZHVjZSgocHJldlZhbCwgY3VyclZhbCwgaWR4KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpZHggPT09IDAgPyBjdXJyVmFsIDogcHJldlZhbCArIFwiQHByZXR0aWVyLXBsYWNlaG9sZGVyLVwiICsgcGxhY2Vob2xkZXJJRCsrICsgXCItaWRcIiArIGN1cnJWYWw7XG4gICAgICAgICAgICB9LCBcIlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IHRleHRUb0RvYyh0ZXh0LCB7XG4gICAgICAgICAgICAgIHBhcnNlcjogXCJzY3NzXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUNzc0RvYyhkb2MsIHBhdGgsIHByaW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiByZWFjdC1yZWxheSBhbmQgZ3JhcGhxbC10YWdcbiAgICAgICAgICAgKiBncmFwaHFsYC4uLmBcbiAgICAgICAgICAgKiBncmFwaHFsLmV4cGVyaW1lbnRhbGAuLi5gXG4gICAgICAgICAgICogZ3FsYC4uLmBcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFRoaXMgaW50ZW50aW9uYWxseSBleGNsdWRlcyBSZWxheSBDbGFzc2ljIHRhZ3MsIGFzIFByZXR0aWVyIGRvZXMgbm90XG4gICAgICAgICAgICogc3VwcG9ydCBSZWxheSBDbGFzc2ljIGZvcm1hdHRpbmcuXG4gICAgICAgICAgICovXG5cblxuICAgICAgICAgIGlmIChpc0dyYXBoUUwocGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25Eb2NzID0gbm9kZS5leHByZXNzaW9ucyA/IHBhdGgubWFwKHByaW50LCBcImV4cHJlc3Npb25zXCIpIDogW107XG4gICAgICAgICAgICBjb25zdCBudW1RdWFzaXMgPSBub2RlLnF1YXNpcy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChudW1RdWFzaXMgPT09IDEgJiYgbm9kZS5xdWFzaXNbMF0udmFsdWUucmF3LnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICByZXR1cm4gXCJgYFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVF1YXNpczsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IG5vZGUucXVhc2lzW2ldO1xuICAgICAgICAgICAgICBjb25zdCBpc0ZpcnN0ID0gaSA9PT0gMDtcbiAgICAgICAgICAgICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gbnVtUXVhc2lzIC0gMTtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRlbXBsYXRlRWxlbWVudC52YWx1ZS5jb29rZWQ7IC8vIEJhaWwgb3V0IGlmIGFueSBvZiB0aGUgcXVhc2lzIGhhdmUgYW4gaW52YWxpZCBlc2NhcGUgc2VxdWVuY2VcbiAgICAgICAgICAgICAgLy8gKHdoaWNoIHdvdWxkIG1ha2UgdGhlIGBjb29rZWRgIHZhbHVlIGJlIGBudWxsYCBvciBgdW5kZWZpbmVkYClcblxuICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgICAgICAgY29uc3QgbnVtTGluZXMgPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25Eb2MgPSBleHByZXNzaW9uRG9jc1tpXTtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhcnRzV2l0aEJsYW5rTGluZSA9IG51bUxpbmVzID4gMiAmJiBsaW5lc1swXS50cmltKCkgPT09IFwiXCIgJiYgbGluZXNbMV0udHJpbSgpID09PSBcIlwiO1xuICAgICAgICAgICAgICBjb25zdCBlbmRzV2l0aEJsYW5rTGluZSA9IG51bUxpbmVzID4gMiAmJiBsaW5lc1tudW1MaW5lcyAtIDFdLnRyaW0oKSA9PT0gXCJcIiAmJiBsaW5lc1tudW1MaW5lcyAtIDJdLnRyaW0oKSA9PT0gXCJcIjtcbiAgICAgICAgICAgICAgY29uc3QgY29tbWVudHNBbmRXaGl0ZXNwYWNlT25seSA9IGxpbmVzLmV2ZXJ5KGxpbmUgPT4gL15cXHMqKD86I1teXFxyXFxuXSopPyQvLnRlc3QobGluZSkpOyAvLyBCYWlsIG91dCBpZiBhbiBpbnRlcnBvbGF0aW9uIG9jY3VycyB3aXRoaW4gYSBjb21tZW50LlxuXG4gICAgICAgICAgICAgIGlmICghaXNMYXN0ICYmIC8jW15cXHJcXG5dKiQvLnRlc3QobGluZXNbbnVtTGluZXMgLSAxXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxldCBkb2MgPSBudWxsO1xuXG4gICAgICAgICAgICAgIGlmIChjb21tZW50c0FuZFdoaXRlc3BhY2VPbmx5KSB7XG4gICAgICAgICAgICAgICAgZG9jID0gcHJpbnRHcmFwaHFsQ29tbWVudHMobGluZXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvYyA9IHN0cmlwVHJhaWxpbmdIYXJkbGluZSQyKHRleHRUb0RvYyh0ZXh0LCB7XG4gICAgICAgICAgICAgICAgICBwYXJzZXI6IFwiZ3JhcGhxbFwiXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIGRvYyA9IGVzY2FwZVRlbXBsYXRlQ2hhcmFjdGVycyhkb2MsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIGlmICghaXNGaXJzdCAmJiBzdGFydHNXaXRoQmxhbmtMaW5lKSB7XG4gICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goZG9jKTtcblxuICAgICAgICAgICAgICAgIGlmICghaXNMYXN0ICYmIGVuZHNXaXRoQmxhbmtMaW5lKSB7XG4gICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNGaXJzdCAmJiAhaXNMYXN0ICYmIHN0YXJ0c1dpdGhCbGFua0xpbmUpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFwiXCIpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25Eb2MpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGNvbmNhdCRiKFtcIiR7XCIsIGV4cHJlc3Npb25Eb2MsIFwifVwiXSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb25jYXQkYihbXCJgXCIsIGluZGVudCQ2KGNvbmNhdCRiKFtoYXJkbGluZSQ4LCBqb2luJDcoaGFyZGxpbmUkOCwgcGFydHMpXSkpLCBoYXJkbGluZSQ4LCBcImBcIl0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGh0bWxQYXJzZXIgPSBpc0h0bWwocGF0aCkgPyBcImh0bWxcIiA6IGlzQW5ndWxhckNvbXBvbmVudFRlbXBsYXRlKHBhdGgpID8gXCJhbmd1bGFyXCIgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoaHRtbFBhcnNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHByaW50SHRtbFRlbXBsYXRlTGl0ZXJhbChwYXRoLCBwcmludCwgdGV4dFRvRG9jLCBodG1sUGFyc2VyLCBvcHRpb25zKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiVGVtcGxhdGVFbGVtZW50XCI6XG4gICAgICAgIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBtZGAuLi5gXG4gICAgICAgICAgICogbWFya2Rvd25gLi4uYFxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChwYXJlbnRQYXJlbnQgJiYgcGFyZW50UGFyZW50LnR5cGUgPT09IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIgJiYgcGFyZW50LnF1YXNpcy5sZW5ndGggPT09IDEgJiYgcGFyZW50UGFyZW50LnRhZy50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiAocGFyZW50UGFyZW50LnRhZy5uYW1lID09PSBcIm1kXCIgfHwgcGFyZW50UGFyZW50LnRhZy5uYW1lID09PSBcIm1hcmtkb3duXCIpKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gcGFyZW50LnF1YXNpc1swXS52YWx1ZS5yYXcucmVwbGFjZSgvKCg/OlxcXFxcXFxcKSopXFxcXGAvZywgKF8sIGJhY2tzbGFzaGVzKSA9PiBcIlxcXFxcIi5yZXBlYXQoYmFja3NsYXNoZXMubGVuZ3RoIC8gMikgKyBcImBcIik7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnRhdGlvbiA9IGdldEluZGVudGF0aW9uKHRleHQpO1xuICAgICAgICAgICAgY29uc3QgaGFzSW5kZW50ID0gaW5kZW50YXRpb24gIT09IFwiXCI7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGIoW2hhc0luZGVudCA/IGluZGVudCQ2KGNvbmNhdCRiKFtzb2Z0bGluZSQ1LCBwcmludE1hcmtkb3duKHRleHQucmVwbGFjZShuZXcgUmVnRXhwKFwiXlwiLmNvbmNhdChpbmRlbnRhdGlvbiksIFwiZ21cIiksIFwiXCIpKV0pKSA6IGNvbmNhdCRiKFtsaXRlcmFsbGluZSQzLCBkZWRlbnRUb1Jvb3QkMihwcmludE1hcmtkb3duKHRleHQpKV0pLCBzb2Z0bGluZSQ1XSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmludE1hcmtkb3duKHRleHQpIHtcbiAgICAgIGNvbnN0IGRvYyA9IHRleHRUb0RvYyh0ZXh0LCB7XG4gICAgICAgIHBhcnNlcjogXCJtYXJrZG93blwiLFxuICAgICAgICBfX2luSnNUZW1wbGF0ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3RyaXBUcmFpbGluZ0hhcmRsaW5lJDIoZXNjYXBlVGVtcGxhdGVDaGFyYWN0ZXJzKGRvYywgdHJ1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluZGVudGF0aW9uKHN0cikge1xuICAgIGNvbnN0IGZpcnN0TWF0Y2hlZEluZGVudCA9IHN0ci5tYXRjaCgvXihbXlxcU1xcbl0qKVxcUy9tKTtcbiAgICByZXR1cm4gZmlyc3RNYXRjaGVkSW5kZW50ID09PSBudWxsID8gXCJcIiA6IGZpcnN0TWF0Y2hlZEluZGVudFsxXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuY29vayhjb29rZWRWYWx1ZSkge1xuICAgIHJldHVybiBjb29rZWRWYWx1ZS5yZXBsYWNlKC8oW1xcXFxgXXxcXCRcXHspL2csIFwiXFxcXCQxXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXNjYXBlVGVtcGxhdGVDaGFyYWN0ZXJzKGRvYywgcmF3KSB7XG4gICAgcmV0dXJuIG1hcERvYyQzKGRvYywgY3VycmVudERvYyA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnREb2MucGFydHMpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREb2M7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICBjdXJyZW50RG9jLnBhcnRzLmZvckVhY2gocGFydCA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHBhcnRzLnB1c2gocmF3ID8gcGFydC5yZXBsYWNlKC8oXFxcXCopYC9nLCBcIiQxJDFcXFxcYFwiKSA6IHVuY29vayhwYXJ0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudERvYywge1xuICAgICAgICBwYXJ0c1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1Dc3NEb2MocXVhc2lzRG9jLCBwYXRoLCBwcmludCkge1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgaXNFbXB0eSA9IHBhcmVudE5vZGUucXVhc2lzLmxlbmd0aCA9PT0gMSAmJiAhcGFyZW50Tm9kZS5xdWFzaXNbMF0udmFsdWUucmF3LnRyaW0oKTtcblxuICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICByZXR1cm4gXCJgYFwiO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb25Eb2NzID0gcGFyZW50Tm9kZS5leHByZXNzaW9ucyA/IHBhdGgubWFwKHByaW50LCBcImV4cHJlc3Npb25zXCIpIDogW107XG4gICAgY29uc3QgbmV3RG9jID0gcmVwbGFjZVBsYWNlaG9sZGVycyhxdWFzaXNEb2MsIGV4cHJlc3Npb25Eb2NzKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cblxuICAgIGlmICghbmV3RG9jKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBpbnNlcnQgYWxsIHRoZSBleHByZXNzaW9uc1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uY2F0JGIoW1wiYFwiLCBpbmRlbnQkNihjb25jYXQkYihbaGFyZGxpbmUkOCwgc3RyaXBUcmFpbGluZ0hhcmRsaW5lJDIobmV3RG9jKV0pKSwgc29mdGxpbmUkNSwgXCJgXCJdKTtcbiAgfSAvLyBTZWFyY2ggYWxsIHRoZSBwbGFjZWhvbGRlcnMgaW4gdGhlIHF1YXNpc0RvYyB0cmVlXG4gIC8vIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgZXhwcmVzc2lvbiBkb2NzIG9uZSBieSBvbmVcbiAgLy8gcmV0dXJucyBhIG5ldyBkb2Mgd2l0aCBhbGwgdGhlIHBsYWNlaG9sZGVycyByZXBsYWNlZCxcbiAgLy8gb3IgbnVsbCBpZiBpdCBjb3VsZG4ndCByZXBsYWNlIGFueSBleHByZXNzaW9uXG5cblxuICBmdW5jdGlvbiByZXBsYWNlUGxhY2Vob2xkZXJzKHF1YXNpc0RvYywgZXhwcmVzc2lvbkRvY3MpIHtcbiAgICBpZiAoIWV4cHJlc3Npb25Eb2NzIHx8ICFleHByZXNzaW9uRG9jcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBxdWFzaXNEb2M7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uRG9jcy5zbGljZSgpO1xuICAgIGxldCByZXBsYWNlQ291bnRlciA9IDA7XG4gICAgY29uc3QgbmV3RG9jID0gbWFwRG9jJDMocXVhc2lzRG9jLCBkb2MgPT4ge1xuICAgICAgaWYgKCFkb2MgfHwgIWRvYy5wYXJ0cyB8fCAhZG9jLnBhcnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZG9jO1xuICAgICAgfVxuXG4gICAgICBsZXQge1xuICAgICAgICBwYXJ0c1xuICAgICAgfSA9IGRvYztcbiAgICAgIGNvbnN0IGF0SW5kZXggPSBwYXJ0cy5pbmRleE9mKFwiQFwiKTtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVySW5kZXggPSBhdEluZGV4ICsgMTtcblxuICAgICAgaWYgKGF0SW5kZXggPiAtMSAmJiB0eXBlb2YgcGFydHNbcGxhY2Vob2xkZXJJbmRleF0gPT09IFwic3RyaW5nXCIgJiYgcGFydHNbcGxhY2Vob2xkZXJJbmRleF0uc3RhcnRzV2l0aChcInByZXR0aWVyLXBsYWNlaG9sZGVyXCIpKSB7XG4gICAgICAgIC8vIElmIHBsYWNlaG9sZGVyIGlzIHNwbGl0LCBqb2luIGl0XG4gICAgICAgIGNvbnN0IGF0ID0gcGFydHNbYXRJbmRleF07XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gcGFydHNbcGxhY2Vob2xkZXJJbmRleF07XG4gICAgICAgIGNvbnN0IHJlc3QgPSBwYXJ0cy5zbGljZShwbGFjZWhvbGRlckluZGV4ICsgMSk7XG4gICAgICAgIHBhcnRzID0gcGFydHMuc2xpY2UoMCwgYXRJbmRleCkuY29uY2F0KFthdCArIHBsYWNlaG9sZGVyXSkuY29uY2F0KHJlc3QpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdFBsYWNlaG9sZGVySW5kZXggPSBwYXJ0cy5maW5kSW5kZXgocGFydCA9PiB0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIiAmJiBwYXJ0LnN0YXJ0c1dpdGgoXCJAcHJldHRpZXItcGxhY2Vob2xkZXJcIikpO1xuXG4gICAgICBpZiAoYXRQbGFjZWhvbGRlckluZGV4ID4gLTEpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBwYXJ0c1thdFBsYWNlaG9sZGVySW5kZXhdO1xuICAgICAgICBjb25zdCByZXN0ID0gcGFydHMuc2xpY2UoYXRQbGFjZWhvbGRlckluZGV4ICsgMSk7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyTWF0Y2ggPSBwbGFjZWhvbGRlci5tYXRjaCgvQHByZXR0aWVyLXBsYWNlaG9sZGVyLSguKyktaWQoW1xcc1xcU10qKS8pO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcklEID0gcGxhY2Vob2xkZXJNYXRjaFsxXTsgLy8gV2hlbiB0aGUgZXhwcmVzc2lvbiBoYXMgYSBzdWZmaXggYXBwZW5kZWQsIGxpa2U6XG4gICAgICAgIC8vIGFuaW1hdGlvbjogbGluZWFyICR7dGltZX1zIGVhc2Utb3V0O1xuXG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IHBsYWNlaG9sZGVyTWF0Y2hbMl07XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBleHByZXNzaW9uc1twbGFjZWhvbGRlcklEXTtcbiAgICAgICAgcmVwbGFjZUNvdW50ZXIrKztcbiAgICAgICAgcGFydHMgPSBwYXJ0cy5zbGljZSgwLCBhdFBsYWNlaG9sZGVySW5kZXgpLmNvbmNhdChbXCIke1wiLCBleHByZXNzaW9uLCBcIn1cIiArIHN1ZmZpeF0pLmNvbmNhdChyZXN0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGRvYywge1xuICAgICAgICBwYXJ0c1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25zLmxlbmd0aCA9PT0gcmVwbGFjZUNvdW50ZXIgPyBuZXdEb2MgOiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRHcmFwaHFsQ29tbWVudHMobGluZXMpIHtcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgIGxldCBzZWVuQ29tbWVudCA9IGZhbHNlO1xuICAgIGxpbmVzLm1hcCh0ZXh0TGluZSA9PiB0ZXh0TGluZS50cmltKCkpLmZvckVhY2goKHRleHRMaW5lLCBpLCBhcnJheSkgPT4ge1xuICAgICAgLy8gTGluZXMgYXJlIGVpdGhlciB3aGl0ZXNwYWNlIG9ubHksIG9yIGEgY29tbWVudCAod2l0aCBwb3RlbnRpYWwgd2hpdGVzcGFjZVxuICAgICAgLy8gYXJvdW5kIGl0KS4gRHJvcCB3aGl0ZXNwYWNlLW9ubHkgbGluZXMuXG4gICAgICBpZiAodGV4dExpbmUgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJyYXlbaSAtIDFdID09PSBcIlwiICYmIHNlZW5Db21tZW50KSB7XG4gICAgICAgIC8vIElmIGEgbm9uLWZpcnN0IGNvbW1lbnQgaXMgcHJlY2VkZWQgYnkgYSBibGFuayAod2hpdGVzcGFjZSBvbmx5KSBsaW5lLFxuICAgICAgICAvLyBhZGQgaW4gYSBibGFuayBsaW5lLlxuICAgICAgICBwYXJ0cy5wdXNoKGNvbmNhdCRiKFtoYXJkbGluZSQ4LCB0ZXh0TGluZV0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnB1c2godGV4dExpbmUpO1xuICAgICAgfVxuXG4gICAgICBzZWVuQ29tbWVudCA9IHRydWU7XG4gICAgfSk7IC8vIElmIGBsaW5lc2Agd2FzIHdoaXRlc3BhY2Ugb25seSwgcmV0dXJuIGBudWxsYC5cblxuICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPT09IDAgPyBudWxsIDogam9pbiQ3KGhhcmRsaW5lJDgsIHBhcnRzKTtcbiAgfVxuICAvKipcbiAgICogVGVtcGxhdGUgbGl0ZXJhbCBpbiB0aGVzZSBjb250ZXh0czpcbiAgICogPHN0eWxlIGpzeD57YGRpdntjb2xvcjpyZWR9YH08L3N0eWxlPlxuICAgKiBjc3NgYFxuICAgKiBjc3MuZ2xvYmFsYGBcbiAgICogY3NzLnJlc29sdmVgYFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGlzU3R5bGVkSnN4KHBhdGgpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuICAgIGNvbnN0IHBhcmVudFBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgxKTtcbiAgICByZXR1cm4gcGFyZW50UGFyZW50ICYmIG5vZGUucXVhc2lzICYmIHBhcmVudC50eXBlID09PSBcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIiAmJiBwYXJlbnRQYXJlbnQudHlwZSA9PT0gXCJKU1hFbGVtZW50XCIgJiYgcGFyZW50UGFyZW50Lm9wZW5pbmdFbGVtZW50Lm5hbWUubmFtZSA9PT0gXCJzdHlsZVwiICYmIHBhcmVudFBhcmVudC5vcGVuaW5nRWxlbWVudC5hdHRyaWJ1dGVzLnNvbWUoYXR0cmlidXRlID0+IGF0dHJpYnV0ZS5uYW1lLm5hbWUgPT09IFwianN4XCIpIHx8IHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIiAmJiBwYXJlbnQudGFnLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIHBhcmVudC50YWcubmFtZSA9PT0gXCJjc3NcIiB8fCBwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIgJiYgcGFyZW50LnRhZy50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiAmJiBwYXJlbnQudGFnLm9iamVjdC5uYW1lID09PSBcImNzc1wiICYmIChwYXJlbnQudGFnLnByb3BlcnR5Lm5hbWUgPT09IFwiZ2xvYmFsXCIgfHwgcGFyZW50LnRhZy5wcm9wZXJ0eS5uYW1lID09PSBcInJlc29sdmVcIik7XG4gIH1cbiAgLyoqXG4gICAqIEFuZ3VsYXIgQ29tcG9uZW50cyBjYW4gaGF2ZTpcbiAgICogLSBJbmxpbmUgSFRNTCB0ZW1wbGF0ZVxuICAgKiAtIElubGluZSBDU1Mgc3R5bGVzXG4gICAqXG4gICAqIC4uLndoaWNoIGFyZSBib3RoIHdpdGhpbiB0ZW1wbGF0ZSBsaXRlcmFscyBzb21ld2hlcmVcbiAgICogaW5zaWRlIG9mIHRoZSBDb21wb25lbnQgZGVjb3JhdG9yIGZhY3RvcnkuXG4gICAqXG4gICAqIEUuZy5cbiAgICogQENvbXBvbmVudCh7XG4gICAqICB0ZW1wbGF0ZTogYDxkaXY+Li4uPC9kaXY+YCxcbiAgICogIHN0eWxlczogW2BoMSB7IGNvbG9yOiBibHVlOyB9YF1cbiAgICogfSlcbiAgICovXG5cblxuICBmdW5jdGlvbiBpc0FuZ3VsYXJDb21wb25lbnRTdHlsZXMocGF0aCkge1xuICAgIHJldHVybiBwYXRoLm1hdGNoKG5vZGUgPT4gbm9kZS50eXBlID09PSBcIlRlbXBsYXRlTGl0ZXJhbFwiLCAobm9kZSwgbmFtZSkgPT4gbm9kZS50eXBlID09PSBcIkFycmF5RXhwcmVzc2lvblwiICYmIG5hbWUgPT09IFwiZWxlbWVudHNcIiwgKG5vZGUsIG5hbWUpID0+IChub2RlLnR5cGUgPT09IFwiUHJvcGVydHlcIiB8fCBub2RlLnR5cGUgPT09IFwiT2JqZWN0UHJvcGVydHlcIikgJiYgbm9kZS5rZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgbm9kZS5rZXkubmFtZSA9PT0gXCJzdHlsZXNcIiAmJiBuYW1lID09PSBcInZhbHVlXCIsIC4uLmFuZ3VsYXJDb21wb25lbnRPYmplY3RFeHByZXNzaW9uUHJlZGljYXRlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0FuZ3VsYXJDb21wb25lbnRUZW1wbGF0ZShwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGgubWF0Y2gobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiVGVtcGxhdGVMaXRlcmFsXCIsIChub2RlLCBuYW1lKSA9PiAobm9kZS50eXBlID09PSBcIlByb3BlcnR5XCIgfHwgbm9kZS50eXBlID09PSBcIk9iamVjdFByb3BlcnR5XCIpICYmIG5vZGUua2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIG5vZGUua2V5Lm5hbWUgPT09IFwidGVtcGxhdGVcIiAmJiBuYW1lID09PSBcInZhbHVlXCIsIC4uLmFuZ3VsYXJDb21wb25lbnRPYmplY3RFeHByZXNzaW9uUHJlZGljYXRlcyk7XG4gIH1cblxuICBjb25zdCBhbmd1bGFyQ29tcG9uZW50T2JqZWN0RXhwcmVzc2lvblByZWRpY2F0ZXMgPSBbKG5vZGUsIG5hbWUpID0+IG5vZGUudHlwZSA9PT0gXCJPYmplY3RFeHByZXNzaW9uXCIgJiYgbmFtZSA9PT0gXCJwcm9wZXJ0aWVzXCIsIChub2RlLCBuYW1lKSA9PiBub2RlLnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiAmJiBub2RlLmNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBub2RlLmNhbGxlZS5uYW1lID09PSBcIkNvbXBvbmVudFwiICYmIG5hbWUgPT09IFwiYXJndW1lbnRzXCIsIChub2RlLCBuYW1lKSA9PiBub2RlLnR5cGUgPT09IFwiRGVjb3JhdG9yXCIgJiYgbmFtZSA9PT0gXCJleHByZXNzaW9uXCJdO1xuICAvKipcbiAgICogc3R5bGVkLWNvbXBvbmVudHMgdGVtcGxhdGUgbGl0ZXJhbHNcbiAgICovXG5cbiAgZnVuY3Rpb24gaXNTdHlsZWRDb21wb25lbnRzKHBhdGgpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcblxuICAgIGlmICghcGFyZW50IHx8IHBhcmVudC50eXBlICE9PSBcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgdGFnXG4gICAgfSA9IHBhcmVudDtcblxuICAgIHN3aXRjaCAodGFnLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiAoLy8gc3R5bGVkLmZvb2BgXG4gICAgICAgICAgaXNTdHlsZWRJZGVudGlmaWVyKHRhZy5vYmplY3QpIHx8IC8vIENvbXBvbmVudC5leHRlbmRgYFxuICAgICAgICAgIGlzU3R5bGVkRXh0ZW5kKHRhZylcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSBcIkNhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiAoLy8gc3R5bGVkKENvbXBvbmVudClgYFxuICAgICAgICAgIGlzU3R5bGVkSWRlbnRpZmllcih0YWcuY2FsbGVlKSB8fCB0YWcuY2FsbGVlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmICh0YWcuY2FsbGVlLm9iamVjdC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiAmJiAoIC8vIHN0eWxlZC5mb28uYXR0cnMoe30pYGBcbiAgICAgICAgICBpc1N0eWxlZElkZW50aWZpZXIodGFnLmNhbGxlZS5vYmplY3Qub2JqZWN0KSB8fCAvLyBDb21wb25lbnQuZXh0ZW5kLmF0dHJzKHt9KWBgXG4gICAgICAgICAgaXNTdHlsZWRFeHRlbmQodGFnLmNhbGxlZS5vYmplY3QpKSB8fCAvLyBzdHlsZWQoQ29tcG9uZW50KS5hdHRycyh7fSlgYFxuICAgICAgICAgIHRhZy5jYWxsZWUub2JqZWN0LnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiAmJiBpc1N0eWxlZElkZW50aWZpZXIodGFnLmNhbGxlZS5vYmplY3QuY2FsbGVlKSlcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSBcIklkZW50aWZpZXJcIjpcbiAgICAgICAgLy8gY3NzYGBcbiAgICAgICAgcmV0dXJuIHRhZy5uYW1lID09PSBcImNzc1wiO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBKU1ggZWxlbWVudCB3aXRoIENTUyBwcm9wXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaXNDc3NQcm9wKHBhdGgpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcbiAgICBjb25zdCBwYXJlbnRQYXJlbnQgPSBwYXRoLmdldFBhcmVudE5vZGUoMSk7XG4gICAgcmV0dXJuIHBhcmVudFBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIgJiYgcGFyZW50UGFyZW50LnR5cGUgPT09IFwiSlNYQXR0cmlidXRlXCIgJiYgcGFyZW50UGFyZW50Lm5hbWUudHlwZSA9PT0gXCJKU1hJZGVudGlmaWVyXCIgJiYgcGFyZW50UGFyZW50Lm5hbWUubmFtZSA9PT0gXCJjc3NcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3R5bGVkSWRlbnRpZmllcihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgbm9kZS5uYW1lID09PSBcInN0eWxlZFwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNTdHlsZWRFeHRlbmQobm9kZSkge1xuICAgIHJldHVybiAvXltBLVpdLy50ZXN0KG5vZGUub2JqZWN0Lm5hbWUpICYmIG5vZGUucHJvcGVydHkubmFtZSA9PT0gXCJleHRlbmRcIjtcbiAgfVxuICAvKlxuICAgKiByZWFjdC1yZWxheSBhbmQgZ3JhcGhxbC10YWdcbiAgICogZ3JhcGhxbGAuLi5gXG4gICAqIGdyYXBocWwuZXhwZXJpbWVudGFsYC4uLmBcbiAgICogZ3FsYC4uLmBcbiAgICogR3JhcGhRTCBjb21tZW50IGJsb2NrXG4gICAqXG4gICAqIFRoaXMgaW50ZW50aW9uYWxseSBleGNsdWRlcyBSZWxheSBDbGFzc2ljIHRhZ3MsIGFzIFByZXR0aWVyIGRvZXMgbm90XG4gICAqIHN1cHBvcnQgUmVsYXkgQ2xhc3NpYyBmb3JtYXR0aW5nLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGlzR3JhcGhRTChwYXRoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcbiAgICByZXR1cm4gaGFzTGFuZ3VhZ2VDb21tZW50KG5vZGUsIFwiR3JhcGhRTFwiKSB8fCBwYXJlbnQgJiYgKHBhcmVudC50eXBlID09PSBcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiICYmIChwYXJlbnQudGFnLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmIHBhcmVudC50YWcub2JqZWN0Lm5hbWUgPT09IFwiZ3JhcGhxbFwiICYmIHBhcmVudC50YWcucHJvcGVydHkubmFtZSA9PT0gXCJleHBlcmltZW50YWxcIiB8fCBwYXJlbnQudGFnLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIChwYXJlbnQudGFnLm5hbWUgPT09IFwiZ3FsXCIgfHwgcGFyZW50LnRhZy5uYW1lID09PSBcImdyYXBocWxcIikpIHx8IHBhcmVudC50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgJiYgcGFyZW50LmNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBwYXJlbnQuY2FsbGVlLm5hbWUgPT09IFwiZ3JhcGhxbFwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0xhbmd1YWdlQ29tbWVudChub2RlLCBsYW5ndWFnZU5hbWUpIHtcbiAgICAvLyBUaGlzIGNoZWNrcyBmb3IgYSBsZWFkaW5nIGNvbW1lbnQgdGhhdCBpcyBleGFjdGx5IGAvKiBHcmFwaFFMICovYFxuICAgIC8vIEluIG9yZGVyIHRvIGJlIGluIGxpbmUgd2l0aCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjb21tZW50IHRhZ1xuICAgIC8vIHdlIHdpbGwgbm90IHRyaW0gdGhlIGNvbW1lbnQgdmFsdWUgYW5kIHdlIHdpbGwgZXhwZWN0IGV4YWN0bHkgb25lIHNwYWNlIG9uXG4gICAgLy8gZWl0aGVyIHNpZGUgb2YgdGhlIEdyYXBoUUwgc3RyaW5nXG4gICAgLy8gQWxzbyBzZWUgLi9jbGVhbi5qc1xuICAgIHJldHVybiBoYXNMZWFkaW5nQ29tbWVudCQxKG5vZGUsIGNvbW1lbnQgPT4gaXNCbG9ja0NvbW1lbnQkMShjb21tZW50KSAmJiBjb21tZW50LnZhbHVlID09PSBcIiBcIi5jb25jYXQobGFuZ3VhZ2VOYW1lLCBcIiBcIikpO1xuICB9XG4gIC8qKlxuICAgKiAgICAgLSBodG1sYC4uLmBcbiAgICogICAgIC0gSFRNTCBjb21tZW50IGJsb2NrXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaXNIdG1sKHBhdGgpIHtcbiAgICByZXR1cm4gaGFzTGFuZ3VhZ2VDb21tZW50KHBhdGguZ2V0VmFsdWUoKSwgXCJIVE1MXCIpIHx8IHBhdGgubWF0Y2gobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiVGVtcGxhdGVMaXRlcmFsXCIsIChub2RlLCBuYW1lKSA9PiBub2RlLnR5cGUgPT09IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIgJiYgbm9kZS50YWcudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgbm9kZS50YWcubmFtZSA9PT0gXCJodG1sXCIgJiYgbmFtZSA9PT0gXCJxdWFzaVwiKTtcbiAgfSAvLyBUaGUgY291bnRlciBpcyBuZWVkZWQgdG8gZGlzdGluZ3Vpc2ggbmVzdGVkIGVtYmVkcy5cblxuXG4gIGxldCBodG1sVGVtcGxhdGVMaXRlcmFsQ291bnRlciA9IDA7XG5cbiAgZnVuY3Rpb24gcHJpbnRIdG1sVGVtcGxhdGVMaXRlcmFsKHBhdGgsIHByaW50LCB0ZXh0VG9Eb2MsIHBhcnNlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgY291bnRlciA9IGh0bWxUZW1wbGF0ZUxpdGVyYWxDb3VudGVyO1xuICAgIGh0bWxUZW1wbGF0ZUxpdGVyYWxDb3VudGVyID0gaHRtbFRlbXBsYXRlTGl0ZXJhbENvdW50ZXIgKyAxID4+PiAwO1xuXG4gICAgY29uc3QgY29tcG9zZVBsYWNlaG9sZGVyID0gaW5kZXggPT4gXCJQUkVUVElFUl9IVE1MX1BMQUNFSE9MREVSX1wiLmNvbmNhdChpbmRleCwgXCJfXCIpLmNvbmNhdChjb3VudGVyLCBcIl9JTl9KU1wiKTtcblxuICAgIGNvbnN0IHRleHQgPSBub2RlLnF1YXNpcy5tYXAoKHF1YXNpLCBpbmRleCwgcXVhc2lzKSA9PiBpbmRleCA9PT0gcXVhc2lzLmxlbmd0aCAtIDEgPyBxdWFzaS52YWx1ZS5jb29rZWQgOiBxdWFzaS52YWx1ZS5jb29rZWQgKyBjb21wb3NlUGxhY2Vob2xkZXIoaW5kZXgpKS5qb2luKFwiXCIpO1xuICAgIGNvbnN0IGV4cHJlc3Npb25Eb2NzID0gcGF0aC5tYXAocHJpbnQsIFwiZXhwcmVzc2lvbnNcIik7XG5cbiAgICBpZiAoZXhwcmVzc2lvbkRvY3MubGVuZ3RoID09PSAwICYmIHRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwiYGBcIjtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFjZWhvbGRlclJlZ2V4ID0gbmV3IFJlZ0V4cChjb21wb3NlUGxhY2Vob2xkZXIoXCIoXFxcXGQrKVwiKSwgXCJnXCIpO1xuICAgIGxldCB0b3BMZXZlbENvdW50ID0gMDtcbiAgICBjb25zdCBjb250ZW50RG9jID0gbWFwRG9jJDMoc3RyaXBUcmFpbGluZ0hhcmRsaW5lJDIodGV4dFRvRG9jKHRleHQsIHtcbiAgICAgIHBhcnNlcixcblxuICAgICAgX19vbkh0bWxSb290KHJvb3QpIHtcbiAgICAgICAgdG9wTGV2ZWxDb3VudCA9IHJvb3QuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgfSkpLCBkb2MgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBkb2MgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGRvYztcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBkb2Muc3BsaXQocGxhY2Vob2xkZXJSZWdleCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcblxuICAgICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb21wb25lbnQgPSB1bmNvb2soY29tcG9uZW50KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW1iZWRkZWRJbkh0bWwpIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50LnJlcGxhY2UoLzxcXC8oc2NyaXB0KVxcYi9naSwgXCI8XFxcXC8kMVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFydHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJJbmRleCA9ICtjb21wb25lbnQ7XG4gICAgICAgIHBhcnRzLnB1c2goY29uY2F0JGIoW1wiJHtcIiwgZ3JvdXAkYShleHByZXNzaW9uRG9jc1twbGFjZWhvbGRlckluZGV4XSksIFwifVwiXSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uY2F0JGIocGFydHMpO1xuICAgIH0pO1xuICAgIGNvbnN0IGxlYWRpbmdXaGl0ZXNwYWNlID0gL15cXHMvLnRlc3QodGV4dCkgPyBcIiBcIiA6IFwiXCI7XG4gICAgY29uc3QgdHJhaWxpbmdXaGl0ZXNwYWNlID0gL1xccyQvLnRlc3QodGV4dCkgPyBcIiBcIiA6IFwiXCI7XG4gICAgY29uc3QgbGluZWJyZWFrID0gb3B0aW9ucy5odG1sV2hpdGVzcGFjZVNlbnNpdGl2aXR5ID09PSBcImlnbm9yZVwiID8gaGFyZGxpbmUkOCA6IGxlYWRpbmdXaGl0ZXNwYWNlICYmIHRyYWlsaW5nV2hpdGVzcGFjZSA/IGxpbmUkNyA6IG51bGw7XG5cbiAgICBpZiAobGluZWJyZWFrKSB7XG4gICAgICByZXR1cm4gZ3JvdXAkYShjb25jYXQkYihbXCJgXCIsIGluZGVudCQ2KGNvbmNhdCRiKFtsaW5lYnJlYWssIGdyb3VwJGEoY29udGVudERvYyldKSksIGxpbmVicmVhaywgXCJgXCJdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3VwJGEoY29uY2F0JGIoW1wiYFwiLCBsZWFkaW5nV2hpdGVzcGFjZSwgdG9wTGV2ZWxDb3VudCA+IDEgPyBpbmRlbnQkNihncm91cCRhKGNvbnRlbnREb2MpKSA6IGdyb3VwJGEoY29udGVudERvYyksIHRyYWlsaW5nV2hpdGVzcGFjZSwgXCJgXCJdKSk7XG4gIH1cblxuICB2YXIgZW1iZWRfMSQxID0gZW1iZWQkMztcblxuICBmdW5jdGlvbiBjbGVhbiQ0KGFzdCwgbmV3T2JqLCBwYXJlbnQpIHtcbiAgICBbXCJyYW5nZVwiLCBcInJhd1wiLCBcImNvbW1lbnRzXCIsIFwibGVhZGluZ0NvbW1lbnRzXCIsIFwidHJhaWxpbmdDb21tZW50c1wiLCBcImlubmVyQ29tbWVudHNcIiwgXCJleHRyYVwiLCBcInN0YXJ0XCIsIFwiZW5kXCIsIFwiZmxhZ3NcIiwgXCJlcnJvcnNcIl0uZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGRlbGV0ZSBuZXdPYmpbbmFtZV07XG4gICAgfSk7XG5cbiAgICBpZiAoYXN0LmxvYyAmJiBhc3QubG9jLnNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgZGVsZXRlIG5ld09iai5sb2Muc291cmNlO1xuICAgIH1cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJCaWdJbnRMaXRlcmFsXCIpIHtcbiAgICAgIG5ld09iai52YWx1ZSA9IG5ld09iai52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIH0gLy8gV2UgcmVtb3ZlIGV4dHJhIGA7YCBhbmQgYWRkIHRoZW0gd2hlbiBuZWVkZWRcblxuXG4gICAgaWYgKGFzdC50eXBlID09PSBcIkVtcHR5U3RhdGVtZW50XCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gV2UgbW92ZSB0ZXh0IGFyb3VuZCwgaW5jbHVkaW5nIHdoaXRlc3BhY2VzIGFuZCBhZGQge1wiIFwifVxuXG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwiSlNYVGV4dFwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiICYmIGFzdC5leHByZXNzaW9uLnR5cGUgPT09IFwiTGl0ZXJhbFwiICYmIGFzdC5leHByZXNzaW9uLnZhbHVlID09PSBcIiBcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyAoVHlwZVNjcmlwdCkgSWdub3JlIGBzdGF0aWNgIGluIGBjb25zdHJ1Y3RvcihzdGF0aWMgcCkge31gXG4gICAgLy8gYW5kIGBleHBvcnRgIGluIGBjb25zdHJ1Y3RvcihleHBvcnQgcCkge31gXG5cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJUU1BhcmFtZXRlclByb3BlcnR5XCIgJiYgYXN0LmFjY2Vzc2liaWxpdHkgPT09IG51bGwgJiYgIWFzdC5yZWFkb25seSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJJZGVudGlmaWVyXCIsXG4gICAgICAgIG5hbWU6IGFzdC5wYXJhbWV0ZXIubmFtZSxcbiAgICAgICAgdHlwZUFubm90YXRpb246IG5ld09iai5wYXJhbWV0ZXIudHlwZUFubm90YXRpb24sXG4gICAgICAgIGRlY29yYXRvcnM6IG5ld09iai5kZWNvcmF0b3JzXG4gICAgICB9O1xuICAgIH0gLy8gKFR5cGVTY3JpcHQpIGlnbm9yZSBlbXB0eSBgc3BlY2lmaWVyc2AgYXJyYXlcblxuXG4gICAgaWYgKGFzdC50eXBlID09PSBcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIiAmJiBhc3Quc3BlY2lmaWVycyAmJiBhc3Quc3BlY2lmaWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBuZXdPYmouc3BlY2lmaWVycztcbiAgICB9IC8vIFdlIGNvbnZlcnQgPGRpdj48L2Rpdj4gdG8gPGRpdiAvPlxuXG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwiSlNYT3BlbmluZ0VsZW1lbnRcIikge1xuICAgICAgZGVsZXRlIG5ld09iai5zZWxmQ2xvc2luZztcbiAgICB9XG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwiSlNYRWxlbWVudFwiKSB7XG4gICAgICBkZWxldGUgbmV3T2JqLmNsb3NpbmdFbGVtZW50O1xuICAgIH0gLy8gV2UgY2hhbmdlIHsna2V5JzogdmFsdWV9IGludG8ge2tleTogdmFsdWV9XG5cblxuICAgIGlmICgoYXN0LnR5cGUgPT09IFwiUHJvcGVydHlcIiB8fCBhc3QudHlwZSA9PT0gXCJPYmplY3RQcm9wZXJ0eVwiIHx8IGFzdC50eXBlID09PSBcIk1ldGhvZERlZmluaXRpb25cIiB8fCBhc3QudHlwZSA9PT0gXCJDbGFzc1Byb3BlcnR5XCIgfHwgYXN0LnR5cGUgPT09IFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiIHx8IGFzdC50eXBlID09PSBcIk9iamVjdFR5cGVQcm9wZXJ0eVwiKSAmJiB0eXBlb2YgYXN0LmtleSA9PT0gXCJvYmplY3RcIiAmJiBhc3Qua2V5ICYmIChhc3Qua2V5LnR5cGUgPT09IFwiTGl0ZXJhbFwiIHx8IGFzdC5rZXkudHlwZSA9PT0gXCJTdHJpbmdMaXRlcmFsXCIgfHwgYXN0LmtleS50eXBlID09PSBcIklkZW50aWZpZXJcIikpIHtcbiAgICAgIGRlbGV0ZSBuZXdPYmoua2V5O1xuICAgIH1cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIiAmJiBhc3Qub3B0aW9uYWwgPT09IGZhbHNlKSB7XG4gICAgICBuZXdPYmoudHlwZSA9IFwiTWVtYmVyRXhwcmVzc2lvblwiO1xuICAgICAgZGVsZXRlIG5ld09iai5vcHRpb25hbDtcbiAgICB9IC8vIFJlbW92ZSByYXcgYW5kIGNvb2tlZCB2YWx1ZXMgZnJvbSBUZW1wbGF0ZUVsZW1lbnQgd2hlbiBpdCdzIENTU1xuICAgIC8vIHN0eWxlZC1qc3hcblxuXG4gICAgaWYgKGFzdC50eXBlID09PSBcIkpTWEVsZW1lbnRcIiAmJiBhc3Qub3BlbmluZ0VsZW1lbnQubmFtZS5uYW1lID09PSBcInN0eWxlXCIgJiYgYXN0Lm9wZW5pbmdFbGVtZW50LmF0dHJpYnV0ZXMuc29tZShhdHRyID0+IGF0dHIubmFtZS5uYW1lID09PSBcImpzeFwiKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVMaXRlcmFscyA9IG5ld09iai5jaGlsZHJlbi5maWx0ZXIoY2hpbGQgPT4gY2hpbGQudHlwZSA9PT0gXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIgJiYgY2hpbGQuZXhwcmVzc2lvbi50eXBlID09PSBcIlRlbXBsYXRlTGl0ZXJhbFwiKS5tYXAoY29udGFpbmVyID0+IGNvbnRhaW5lci5leHByZXNzaW9uKTtcbiAgICAgIGNvbnN0IHF1YXNpcyA9IHRlbXBsYXRlTGl0ZXJhbHMucmVkdWNlKChxdWFzaXMsIHRlbXBsYXRlTGl0ZXJhbCkgPT4gcXVhc2lzLmNvbmNhdCh0ZW1wbGF0ZUxpdGVyYWwucXVhc2lzKSwgW10pO1xuICAgICAgcXVhc2lzLmZvckVhY2gocSA9PiBkZWxldGUgcS52YWx1ZSk7XG4gICAgfSAvLyBDU1MgdGVtcGxhdGUgbGl0ZXJhbHMgaW4gY3NzIHByb3BcblxuXG4gICAgaWYgKGFzdC50eXBlID09PSBcIkpTWEF0dHJpYnV0ZVwiICYmIGFzdC5uYW1lLm5hbWUgPT09IFwiY3NzXCIgJiYgYXN0LnZhbHVlLnR5cGUgPT09IFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiICYmIGFzdC52YWx1ZS5leHByZXNzaW9uLnR5cGUgPT09IFwiVGVtcGxhdGVMaXRlcmFsXCIpIHtcbiAgICAgIG5ld09iai52YWx1ZS5leHByZXNzaW9uLnF1YXNpcy5mb3JFYWNoKHEgPT4gZGVsZXRlIHEudmFsdWUpO1xuICAgIH0gLy8gQW5ndWxhciBDb21wb25lbnRzOiBJbmxpbmUgSFRNTCB0ZW1wbGF0ZSBhbmQgSW5saW5lIENTUyBzdHlsZXNcblxuXG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IGFzdC5leHByZXNzaW9uIHx8IGFzdC5jYWxsZWU7XG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwiRGVjb3JhdG9yXCIgJiYgZXhwcmVzc2lvbi50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgJiYgZXhwcmVzc2lvbi5jYWxsZWUubmFtZSA9PT0gXCJDb21wb25lbnRcIiAmJiBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGFzdFByb3BzID0gYXN0LmV4cHJlc3Npb24uYXJndW1lbnRzWzBdLnByb3BlcnRpZXM7XG4gICAgICBuZXdPYmouZXhwcmVzc2lvbi5hcmd1bWVudHNbMF0ucHJvcGVydGllcy5mb3JFYWNoKChwcm9wLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgdGVtcGxhdGVMaXRlcmFsID0gbnVsbDtcblxuICAgICAgICBzd2l0Y2ggKGFzdFByb3BzW2luZGV4XS5rZXkubmFtZSkge1xuICAgICAgICAgIGNhc2UgXCJzdHlsZXNcIjpcbiAgICAgICAgICAgIGlmIChwcm9wLnZhbHVlLnR5cGUgPT09IFwiQXJyYXlFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICAgICAgdGVtcGxhdGVMaXRlcmFsID0gcHJvcC52YWx1ZS5lbGVtZW50c1swXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwidGVtcGxhdGVcIjpcbiAgICAgICAgICAgIGlmIChwcm9wLnZhbHVlLnR5cGUgPT09IFwiVGVtcGxhdGVMaXRlcmFsXCIpIHtcbiAgICAgICAgICAgICAgdGVtcGxhdGVMaXRlcmFsID0gcHJvcC52YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVtcGxhdGVMaXRlcmFsKSB7XG4gICAgICAgICAgdGVtcGxhdGVMaXRlcmFsLnF1YXNpcy5mb3JFYWNoKHEgPT4gZGVsZXRlIHEudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IC8vIHN0eWxlZC1jb21wb25lbnRzLCBncmFwaHFsLCBtYXJrZG93blxuXG5cbiAgICBpZiAoYXN0LnR5cGUgPT09IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIgJiYgKGFzdC50YWcudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgfHwgYXN0LnRhZy50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiAoYXN0LnRhZy5uYW1lID09PSBcImdxbFwiIHx8IGFzdC50YWcubmFtZSA9PT0gXCJncmFwaHFsXCIgfHwgYXN0LnRhZy5uYW1lID09PSBcImNzc1wiIHx8IGFzdC50YWcubmFtZSA9PT0gXCJtZFwiIHx8IGFzdC50YWcubmFtZSA9PT0gXCJtYXJrZG93blwiIHx8IGFzdC50YWcubmFtZSA9PT0gXCJodG1sXCIpIHx8IGFzdC50YWcudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiKSkge1xuICAgICAgbmV3T2JqLnF1YXNpLnF1YXNpcy5mb3JFYWNoKHF1YXNpID0+IGRlbGV0ZSBxdWFzaS52YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFzdC50eXBlID09PSBcIlRlbXBsYXRlTGl0ZXJhbFwiKSB7XG4gICAgICAvLyBUaGlzIGNoZWNrcyBmb3IgYSBsZWFkaW5nIGNvbW1lbnQgdGhhdCBpcyBleGFjdGx5IGAvKiBHcmFwaFFMICovYFxuICAgICAgLy8gSW4gb3JkZXIgdG8gYmUgaW4gbGluZSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNvbW1lbnQgdGFnXG4gICAgICAvLyB3ZSB3aWxsIG5vdCB0cmltIHRoZSBjb21tZW50IHZhbHVlIGFuZCB3ZSB3aWxsIGV4cGVjdCBleGFjdGx5IG9uZSBzcGFjZSBvblxuICAgICAgLy8gZWl0aGVyIHNpZGUgb2YgdGhlIEdyYXBoUUwgc3RyaW5nXG4gICAgICAvLyBBbHNvIHNlZSAuL2VtYmVkLmpzXG4gICAgICBjb25zdCBoYXNMYW5ndWFnZUNvbW1lbnQgPSBhc3QubGVhZGluZ0NvbW1lbnRzICYmIGFzdC5sZWFkaW5nQ29tbWVudHMuc29tZShjb21tZW50ID0+IGNvbW1lbnQudHlwZSA9PT0gXCJDb21tZW50QmxvY2tcIiAmJiBbXCJHcmFwaFFMXCIsIFwiSFRNTFwiXS5zb21lKGxhbmd1YWdlTmFtZSA9PiBjb21tZW50LnZhbHVlID09PSBcIiBcIi5jb25jYXQobGFuZ3VhZ2VOYW1lLCBcIiBcIikpKTtcblxuICAgICAgaWYgKGhhc0xhbmd1YWdlQ29tbWVudCB8fCBwYXJlbnQudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiICYmIHBhcmVudC5jYWxsZWUubmFtZSA9PT0gXCJncmFwaHFsXCIpIHtcbiAgICAgICAgbmV3T2JqLnF1YXNpcy5mb3JFYWNoKHF1YXNpID0+IGRlbGV0ZSBxdWFzaS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNsZWFuXzEkMSA9IGNsZWFuJDQ7XG5cbiAgY29uc3Qge1xuICAgIGdldExhc3Q6IGdldExhc3QkMixcbiAgICBoYXNOZXdsaW5lOiBoYXNOZXdsaW5lJDQsXG4gICAgaGFzTmV3bGluZUluUmFuZ2U6IGhhc05ld2xpbmVJblJhbmdlJDIsXG4gICAgaGFzSWdub3JlQ29tbWVudDogaGFzSWdub3JlQ29tbWVudCQzLFxuICAgIGhhc05vZGVJZ25vcmVDb21tZW50OiBoYXNOb2RlSWdub3JlQ29tbWVudCQxLFxuICAgIHNraXBXaGl0ZXNwYWNlOiBza2lwV2hpdGVzcGFjZSQyXG4gIH0gPSB1dGlsJDE7XG4gIGNvbnN0IGlzSWRlbnRpZmllck5hbWUgPSB1dGlscyQxLmtleXdvcmQuaXNJZGVudGlmaWVyTmFtZUVTNTsgLy8gV2UgbWF0Y2ggYW55IHdoaXRlc3BhY2UgZXhjZXB0IGxpbmUgdGVybWluYXRvcnMgYmVjYXVzZVxuICAvLyBGbG93IGFubm90YXRpb24gY29tbWVudHMgY2Fubm90IGJlIHNwbGl0IGFjcm9zcyBsaW5lcy4gRm9yIGV4YW1wbGU6XG4gIC8vXG4gIC8vICh0aGlzIC8qXG4gIC8vIDogYW55ICovKS5mb28gPSA1O1xuICAvL1xuICAvLyBpcyBub3QgcGlja2VkIHVwIGJ5IEZsb3cgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNzA1MCksIHNvXG4gIC8vIHJlbW92aW5nIHRoZSBuZXdsaW5lIHdvdWxkIGNyZWF0ZSBhIHR5cGUgYW5ub3RhdGlvbiB0aGF0IHRoZSB1c2VyIGRpZCBub3QgaW50ZW5kXG4gIC8vIHRvIGNyZWF0ZS5cblxuICBjb25zdCBOT05fTElORV9URVJNSU5BVElOR19XSElURV9TUEFDRSA9IFwiKD86KD89LilcXFxccylcIjtcbiAgY29uc3QgRkxPV19TSE9SVEhBTkRfQU5OT1RBVElPTiA9IG5ldyBSZWdFeHAoXCJeXCIuY29uY2F0KE5PTl9MSU5FX1RFUk1JTkFUSU5HX1dISVRFX1NQQUNFLCBcIio6XCIpKTtcbiAgY29uc3QgRkxPV19BTk5PVEFUSU9OID0gbmV3IFJlZ0V4cChcIl5cIi5jb25jYXQoTk9OX0xJTkVfVEVSTUlOQVRJTkdfV0hJVEVfU1BBQ0UsIFwiKjo6XCIpKTtcblxuICBmdW5jdGlvbiBoYXNGbG93U2hvcnRoYW5kQW5ub3RhdGlvbkNvbW1lbnQobm9kZSkge1xuICAgIC8vIGh0dHBzOi8vZmxvdy5vcmcvZW4vZG9jcy90eXBlcy9jb21tZW50cy9cbiAgICAvLyBTeW50YXggZXhhbXBsZTogY29uc3QgciA9IG5ldyAod2luZG93LlJlcXVlc3QgLyo6IENsYXNzPFJlcXVlc3Q+ICovKShcIlwiKTtcbiAgICByZXR1cm4gbm9kZS5leHRyYSAmJiBub2RlLmV4dHJhLnBhcmVudGhlc2l6ZWQgJiYgbm9kZS50cmFpbGluZ0NvbW1lbnRzICYmIG5vZGUudHJhaWxpbmdDb21tZW50c1swXS52YWx1ZS5tYXRjaChGTE9XX1NIT1JUSEFORF9BTk5PVEFUSU9OKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0Zsb3dBbm5vdGF0aW9uQ29tbWVudChjb21tZW50cykge1xuICAgIHJldHVybiBjb21tZW50cyAmJiBjb21tZW50c1swXS52YWx1ZS5tYXRjaChGTE9XX0FOTk9UQVRJT04pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzTm9kZShub2RlLCBmbikge1xuICAgIGlmICghbm9kZSB8fCB0eXBlb2Ygbm9kZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZS5zb21lKHZhbHVlID0+IGhhc05vZGUodmFsdWUsIGZuKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gZm4obm9kZSk7XG4gICAgcmV0dXJuIHR5cGVvZiByZXN1bHQgPT09IFwiYm9vbGVhblwiID8gcmVzdWx0IDogT2JqZWN0LmtleXMobm9kZSkuc29tZShrZXkgPT4gaGFzTm9kZShub2RlW2tleV0sIGZuKSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNOYWtlZExlZnRTaWRlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkJpbmFyeUV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiTG9naWNhbEV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiTkdQaXBlRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkJpbmRFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIlVwZGF0ZUV4cHJlc3Npb25cIiAmJiAhbm9kZS5wcmVmaXggfHwgbm9kZS50eXBlID09PSBcIlRTQXNFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExlZnRTaWRlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5leHByZXNzaW9ucykge1xuICAgICAgcmV0dXJuIG5vZGUuZXhwcmVzc2lvbnNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGUubGVmdCB8fCBub2RlLnRlc3QgfHwgbm9kZS5jYWxsZWUgfHwgbm9kZS5vYmplY3QgfHwgbm9kZS50YWcgfHwgbm9kZS5hcmd1bWVudCB8fCBub2RlLmV4cHJlc3Npb247XG4gIH1cblxuICBmdW5jdGlvbiBnZXRMZWZ0U2lkZVBhdGhOYW1lKHBhdGgsIG5vZGUpIHtcbiAgICBpZiAobm9kZS5leHByZXNzaW9ucykge1xuICAgICAgcmV0dXJuIFtcImV4cHJlc3Npb25zXCIsIDBdO1xuICAgIH1cblxuICAgIGlmIChub2RlLmxlZnQpIHtcbiAgICAgIHJldHVybiBbXCJsZWZ0XCJdO1xuICAgIH1cblxuICAgIGlmIChub2RlLnRlc3QpIHtcbiAgICAgIHJldHVybiBbXCJ0ZXN0XCJdO1xuICAgIH1cblxuICAgIGlmIChub2RlLm9iamVjdCkge1xuICAgICAgcmV0dXJuIFtcIm9iamVjdFwiXTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5jYWxsZWUpIHtcbiAgICAgIHJldHVybiBbXCJjYWxsZWVcIl07XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudGFnKSB7XG4gICAgICByZXR1cm4gW1widGFnXCJdO1xuICAgIH1cblxuICAgIGlmIChub2RlLmFyZ3VtZW50KSB7XG4gICAgICByZXR1cm4gW1wiYXJndW1lbnRcIl07XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuZXhwcmVzc2lvbikge1xuICAgICAgcmV0dXJuIFtcImV4cHJlc3Npb25cIl07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBub2RlIGhhcyBubyBsZWZ0IHNpZGVcIiwgbm9kZSk7XG4gIH1cblxuICBjb25zdCBleHBvcnREZWNsYXJhdGlvblR5cGVzID0gbmV3IFNldChbXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIiwgXCJFeHBvcnREZWZhdWx0U3BlY2lmaWVyXCIsIFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCIsIFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiLCBcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCJdKTtcblxuICBmdW5jdGlvbiBpc0V4cG9ydERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZSAmJiBleHBvcnREZWNsYXJhdGlvblR5cGVzLmhhcyhub2RlLnR5cGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UGFyZW50RXhwb3J0RGVjbGFyYXRpb24ocGF0aCkge1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcblxuICAgIGlmIChwYXRoLmdldE5hbWUoKSA9PT0gXCJkZWNsYXJhdGlvblwiICYmIGlzRXhwb3J0RGVjbGFyYXRpb24ocGFyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBwYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNMaXRlcmFsKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIkJvb2xlYW5MaXRlcmFsXCIgfHwgbm9kZS50eXBlID09PSBcIkRpcmVjdGl2ZUxpdGVyYWxcIiB8fCBub2RlLnR5cGUgPT09IFwiTGl0ZXJhbFwiIHx8IG5vZGUudHlwZSA9PT0gXCJOdWxsTGl0ZXJhbFwiIHx8IG5vZGUudHlwZSA9PT0gXCJOdW1lcmljTGl0ZXJhbFwiIHx8IG5vZGUudHlwZSA9PT0gXCJSZWdFeHBMaXRlcmFsXCIgfHwgbm9kZS50eXBlID09PSBcIlN0cmluZ0xpdGVyYWxcIiB8fCBub2RlLnR5cGUgPT09IFwiVGVtcGxhdGVMaXRlcmFsXCIgfHwgbm9kZS50eXBlID09PSBcIlRTVHlwZUxpdGVyYWxcIiB8fCBub2RlLnR5cGUgPT09IFwiSlNYVGV4dFwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOdW1lcmljTGl0ZXJhbChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJOdW1lcmljTGl0ZXJhbFwiIHx8IG5vZGUudHlwZSA9PT0gXCJMaXRlcmFsXCIgJiYgdHlwZW9mIG5vZGUudmFsdWUgPT09IFwibnVtYmVyXCI7XG4gIH1cblxuICBmdW5jdGlvbiBpc1N0cmluZ0xpdGVyYWwobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwiU3RyaW5nTGl0ZXJhbFwiIHx8IG5vZGUudHlwZSA9PT0gXCJMaXRlcmFsXCIgJiYgdHlwZW9mIG5vZGUudmFsdWUgPT09IFwic3RyaW5nXCI7XG4gIH1cblxuICBmdW5jdGlvbiBpc09iamVjdFR5cGUobikge1xuICAgIHJldHVybiBuLnR5cGUgPT09IFwiT2JqZWN0VHlwZUFubm90YXRpb25cIiB8fCBuLnR5cGUgPT09IFwiVFNUeXBlTGl0ZXJhbFwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbk9yQXJyb3dFeHByZXNzaW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbk9yQXJyb3dFeHByZXNzaW9uV2l0aEJvZHkobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgJiYgbm9kZS5ib2R5LnR5cGUgPT09IFwiQmxvY2tTdGF0ZW1lbnRcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVGVtcGxhdGVMaXRlcmFsKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIlRlbXBsYXRlTGl0ZXJhbFwiO1xuICB9IC8vIGBpbmplY3RgIGlzIHVzZWQgaW4gQW5ndWxhckpTIDEueCwgYGFzeW5jYCBpbiBBbmd1bGFyIDIrXG4gIC8vIGV4YW1wbGU6IGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2d1aWRlL3VuaXQtdGVzdGluZyN1c2luZy1iZWZvcmVhbGwtXG5cblxuICBmdW5jdGlvbiBpc0FuZ3VsYXJUZXN0V3JhcHBlcihub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiKSAmJiBub2RlLmNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiAobm9kZS5jYWxsZWUubmFtZSA9PT0gXCJhc3luY1wiIHx8IG5vZGUuY2FsbGVlLm5hbWUgPT09IFwiaW5qZWN0XCIgfHwgbm9kZS5jYWxsZWUubmFtZSA9PT0gXCJmYWtlQXN5bmNcIik7XG4gIH1cblxuICBmdW5jdGlvbiBpc0pTWE5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwiSlNYRWxlbWVudFwiIHx8IG5vZGUudHlwZSA9PT0gXCJKU1hGcmFnbWVudFwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNUaGVPbmx5SlNYRWxlbWVudEluTWFya2Rvd24ob3B0aW9ucywgcGF0aCkge1xuICAgIGlmIChvcHRpb25zLnBhcmVudFBhcnNlciAhPT0gXCJtYXJrZG93blwiICYmIG9wdGlvbnMucGFyZW50UGFyc2VyICE9PSBcIm1keFwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0Tm9kZSgpO1xuXG4gICAgaWYgKCFub2RlLmV4cHJlc3Npb24gfHwgIWlzSlNYTm9kZShub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgcmV0dXJuIHBhcmVudC50eXBlID09PSBcIlByb2dyYW1cIiAmJiBwYXJlbnQuYm9keS5sZW5ndGggPT09IDE7XG4gIH0gLy8gRGV0ZWN0IGFuIGV4cHJlc3Npb24gbm9kZSByZXByZXNlbnRpbmcgYHtcIiBcIn1gXG5cblxuICBmdW5jdGlvbiBpc0pTWFdoaXRlc3BhY2VFeHByZXNzaW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIiAmJiBpc0xpdGVyYWwobm9kZS5leHByZXNzaW9uKSAmJiBub2RlLmV4cHJlc3Npb24udmFsdWUgPT09IFwiIFwiICYmICFub2RlLmV4cHJlc3Npb24uY29tbWVudHM7XG4gIH1cblxuICBmdW5jdGlvbiBpc01lbWJlckV4cHJlc3Npb25DaGFpbihub2RlKSB7XG4gICAgaWYgKG5vZGUudHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiYgbm9kZS50eXBlICE9PSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUub2JqZWN0LnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNNZW1iZXJFeHByZXNzaW9uQ2hhaW4obm9kZS5vYmplY3QpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNHZXR0ZXJPclNldHRlcihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUua2luZCA9PT0gXCJnZXRcIiB8fCBub2RlLmtpbmQgPT09IFwic2V0XCI7XG4gIH1cblxuICBmdW5jdGlvbiBzYW1lTG9jU3RhcnQobm9kZUEsIG5vZGVCLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9jU3RhcnQobm9kZUEpID09PSBvcHRpb25zLmxvY1N0YXJ0KG5vZGVCKTtcbiAgfSAvLyBUT0RPOiBUaGlzIGlzIGEgYmFkIGhhY2sgYW5kIHdlIG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW5cbiAgLy8gYXJyb3cgZnVuY3Rpb25zIGFuZCBvdGhlcndpc2VcblxuXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb25Ob3RhdGlvbihub2RlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGlzR2V0dGVyT3JTZXR0ZXIobm9kZSkgfHwgc2FtZUxvY1N0YXJ0KG5vZGUsIG5vZGUudmFsdWUsIG9wdGlvbnMpO1xuICB9IC8vIEhhY2sgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBmb2xsb3dpbmcgdHdvIHdoaWNoIGhhdmUgdGhlIHNhbWUgYXN0XG4gIC8vIHR5cGUgVCA9IHsgbWV0aG9kOiAoKSA9PiB2b2lkIH07XG4gIC8vIHR5cGUgVCA9IHsgbWV0aG9kKCk6IHZvaWQgfTtcblxuXG4gIGZ1bmN0aW9uIGlzT2JqZWN0VHlwZVByb3BlcnR5QUZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKG5vZGUudHlwZSA9PT0gXCJPYmplY3RUeXBlUHJvcGVydHlcIiB8fCBub2RlLnR5cGUgPT09IFwiT2JqZWN0VHlwZUludGVybmFsU2xvdFwiKSAmJiBub2RlLnZhbHVlLnR5cGUgPT09IFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiICYmICFub2RlLnN0YXRpYyAmJiAhaXNGdW5jdGlvbk5vdGF0aW9uKG5vZGUsIG9wdGlvbnMpO1xuICB9IC8vIEhhY2sgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBmb2xsb3dpbmcgdHdvIHdoaWNoIGhhdmUgdGhlIHNhbWUgYXN0XG4gIC8vIGRlY2xhcmUgZnVuY3Rpb24gZihhKTogdm9pZDtcbiAgLy8gdmFyIGY6IChhKSA9PiB2b2lkO1xuXG5cbiAgZnVuY3Rpb24gaXNUeXBlQW5ub3RhdGlvbkFGdW5jdGlvbihub2RlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIChub2RlLnR5cGUgPT09IFwiVHlwZUFubm90YXRpb25cIiB8fCBub2RlLnR5cGUgPT09IFwiVFNUeXBlQW5ub3RhdGlvblwiKSAmJiBub2RlLnR5cGVBbm5vdGF0aW9uLnR5cGUgPT09IFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiICYmICFub2RlLnN0YXRpYyAmJiAhc2FtZUxvY1N0YXJ0KG5vZGUsIG5vZGUudHlwZUFubm90YXRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgYmluYXJ5aXNoTm9kZVR5cGVzID0gbmV3IFNldChbXCJCaW5hcnlFeHByZXNzaW9uXCIsIFwiTG9naWNhbEV4cHJlc3Npb25cIiwgXCJOR1BpcGVFeHByZXNzaW9uXCJdKTtcblxuICBmdW5jdGlvbiBpc0JpbmFyeWlzaChub2RlKSB7XG4gICAgcmV0dXJuIGJpbmFyeWlzaE5vZGVUeXBlcy5oYXMobm9kZS50eXBlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTWVtYmVyaXNoKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkJpbmRFeHByZXNzaW9uXCIgJiYgbm9kZS5vYmplY3Q7XG4gIH1cblxuICBmdW5jdGlvbiBpc1NpbXBsZUZsb3dUeXBlKG5vZGUpIHtcbiAgICBjb25zdCBmbG93VHlwZUFubm90YXRpb25zID0gW1wiQW55VHlwZUFubm90YXRpb25cIiwgXCJOdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsIFwiR2VuZXJpY1R5cGVBbm5vdGF0aW9uXCIsIFwiVGhpc1R5cGVBbm5vdGF0aW9uXCIsIFwiTnVtYmVyVHlwZUFubm90YXRpb25cIiwgXCJWb2lkVHlwZUFubm90YXRpb25cIiwgXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCIsIFwiTWl4ZWRUeXBlQW5ub3RhdGlvblwiLCBcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiLCBcIkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb25cIiwgXCJTdHJpbmdUeXBlQW5ub3RhdGlvblwiXTtcbiAgICByZXR1cm4gbm9kZSAmJiBmbG93VHlwZUFubm90YXRpb25zLmluY2x1ZGVzKG5vZGUudHlwZSkgJiYgIShub2RlLnR5cGUgPT09IFwiR2VuZXJpY1R5cGVBbm5vdGF0aW9uXCIgJiYgbm9kZS50eXBlUGFyYW1ldGVycyk7XG4gIH1cblxuICBjb25zdCB1bml0VGVzdFJlID0gL14oc2tpcHxbZnhdPyhpdHxkZXNjcmliZXx0ZXN0KSkkLztcblxuICBmdW5jdGlvbiBpc1NraXBPck9ubHlCbG9jayhub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLmNhbGxlZS50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fCBub2RlLmNhbGxlZS50eXBlID09PSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiKSAmJiBub2RlLmNhbGxlZS5vYmplY3QudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgbm9kZS5jYWxsZWUucHJvcGVydHkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgdW5pdFRlc3RSZS50ZXN0KG5vZGUuY2FsbGVlLm9iamVjdC5uYW1lKSAmJiAobm9kZS5jYWxsZWUucHJvcGVydHkubmFtZSA9PT0gXCJvbmx5XCIgfHwgbm9kZS5jYWxsZWUucHJvcGVydHkubmFtZSA9PT0gXCJza2lwXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNVbml0VGVzdFNldFVwKG4pIHtcbiAgICBjb25zdCB1bml0VGVzdFNldFVwUmUgPSAvXihiZWZvcmV8YWZ0ZXIpKEVhY2h8QWxsKSQvO1xuICAgIHJldHVybiBuLmNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiB1bml0VGVzdFNldFVwUmUudGVzdChuLmNhbGxlZS5uYW1lKSAmJiBuLmFyZ3VtZW50cy5sZW5ndGggPT09IDE7XG4gIH0gLy8gZWc7IGBkZXNjcmliZShcInNvbWUgc3RyaW5nXCIsIChkb25lKSA9PiB7fSlgXG5cblxuICBmdW5jdGlvbiBpc1Rlc3RDYWxsKG4sIHBhcmVudCkge1xuICAgIGlmIChuLnR5cGUgIT09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChuLmFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChpc0FuZ3VsYXJUZXN0V3JhcHBlcihuKSAmJiBwYXJlbnQgJiYgaXNUZXN0Q2FsbChwYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uT3JBcnJvd0V4cHJlc3Npb24obi5hcmd1bWVudHNbMF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVbml0VGVzdFNldFVwKG4pKSB7XG4gICAgICAgIHJldHVybiBpc0FuZ3VsYXJUZXN0V3JhcHBlcihuLmFyZ3VtZW50c1swXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuLmFyZ3VtZW50cy5sZW5ndGggPT09IDIgfHwgbi5hcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBpZiAoKG4uY2FsbGVlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIHVuaXRUZXN0UmUudGVzdChuLmNhbGxlZS5uYW1lKSB8fCBpc1NraXBPck9ubHlCbG9jayhuKSkgJiYgKGlzVGVtcGxhdGVMaXRlcmFsKG4uYXJndW1lbnRzWzBdKSB8fCBpc1N0cmluZ0xpdGVyYWwobi5hcmd1bWVudHNbMF0pKSkge1xuICAgICAgICAvLyBpdChcIm5hbWVcIiwgKCkgPT4geyAuLi4gfSwgMjUwMClcbiAgICAgICAgaWYgKG4uYXJndW1lbnRzWzJdICYmICFpc051bWVyaWNMaXRlcmFsKG4uYXJndW1lbnRzWzJdKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobi5hcmd1bWVudHMubGVuZ3RoID09PSAyID8gaXNGdW5jdGlvbk9yQXJyb3dFeHByZXNzaW9uKG4uYXJndW1lbnRzWzFdKSA6IGlzRnVuY3Rpb25PckFycm93RXhwcmVzc2lvbldpdGhCb2R5KG4uYXJndW1lbnRzWzFdKSAmJiBuLmFyZ3VtZW50c1sxXS5wYXJhbXMubGVuZ3RoIDw9IDEpIHx8IGlzQW5ndWxhclRlc3RXcmFwcGVyKG4uYXJndW1lbnRzWzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNMZWFkaW5nQ29tbWVudCQyKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5jb21tZW50cyAmJiBub2RlLmNvbW1lbnRzLnNvbWUoY29tbWVudCA9PiBjb21tZW50LmxlYWRpbmcpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzVHJhaWxpbmdDb21tZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5jb21tZW50cyAmJiBub2RlLmNvbW1lbnRzLnNvbWUoY29tbWVudCA9PiBjb21tZW50LnRyYWlsaW5nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQ2FsbE9yT3B0aW9uYWxDYWxsRXhwcmVzc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCI7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNEYW5nbGluZ0NvbW1lbnRzKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5jb21tZW50cyAmJiBub2RlLmNvbW1lbnRzLnNvbWUoY29tbWVudCA9PiAhY29tbWVudC5sZWFkaW5nICYmICFjb21tZW50LnRyYWlsaW5nKTtcbiAgfVxuICAvKiogaWRlbnRpZnkgaWYgYW4gYW5ndWxhciBleHByZXNzaW9uIHNlZW1zIHRvIGhhdmUgc2lkZSBlZmZlY3RzICovXG5cblxuICBmdW5jdGlvbiBoYXNOZ1NpZGVFZmZlY3QocGF0aCkge1xuICAgIHJldHVybiBoYXNOb2RlKHBhdGguZ2V0VmFsdWUoKSwgbm9kZSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY2FzZSBcIkNhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgIGNhc2UgXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOZ0Zvck9mKG5vZGUsIGluZGV4LCBwYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJOR01pY3Jvc3ludGF4S2V5ZWRFeHByZXNzaW9uXCIgJiYgbm9kZS5rZXkubmFtZSA9PT0gXCJvZlwiICYmIGluZGV4ID09PSAxICYmIHBhcmVudE5vZGUuYm9keVswXS50eXBlID09PSBcIk5HTWljcm9zeW50YXhMZXRcIiAmJiBwYXJlbnROb2RlLmJvZHlbMF0udmFsdWUgPT09IG51bGw7XG4gIH1cbiAgLyoqIEBwYXJhbSBub2RlIHtpbXBvcnQoXCJlc3RyZWVcIikuVGVtcGxhdGVMaXRlcmFsfSAqL1xuXG5cbiAgZnVuY3Rpb24gaXNTaW1wbGVUZW1wbGF0ZUxpdGVyYWwobm9kZSkge1xuICAgIGlmIChub2RlLmV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlLmV4cHJlc3Npb25zLmV2ZXJ5KGV4cHIgPT4ge1xuICAgICAgLy8gRGlzYWxsb3cgY29tbWVudHMgc2luY2UgcHJpbnREb2NUb1N0cmluZyBjYW4ndCBwcmludCB0aGVtIGhlcmVcbiAgICAgIGlmIChleHByLmNvbW1lbnRzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gQWxsb3cgYHhgIGFuZCBgdGhpc2BcblxuXG4gICAgICBpZiAoZXhwci50eXBlID09PSBcIklkZW50aWZpZXJcIiB8fCBleHByLnR5cGUgPT09IFwiVGhpc0V4cHJlc3Npb25cIikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gQWxsb3cgYGEuYi5jYCwgYGEuYltjXWAsIGFuZCBgdGhpcy54LnlgXG5cblxuICAgICAgaWYgKGV4cHIudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgfHwgZXhwci50eXBlID09PSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiKSB7XG4gICAgICAgIGxldCBoZWFkID0gZXhwcjtcblxuICAgICAgICB3aGlsZSAoaGVhZC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fCBoZWFkLnR5cGUgPT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICBpZiAoaGVhZC5wcm9wZXJ0eS50eXBlICE9PSBcIklkZW50aWZpZXJcIiAmJiBoZWFkLnByb3BlcnR5LnR5cGUgIT09IFwiTGl0ZXJhbFwiICYmIGhlYWQucHJvcGVydHkudHlwZSAhPT0gXCJTdHJpbmdMaXRlcmFsXCIgJiYgaGVhZC5wcm9wZXJ0eS50eXBlICE9PSBcIk51bWVyaWNMaXRlcmFsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBoZWFkID0gaGVhZC5vYmplY3Q7XG5cbiAgICAgICAgICBpZiAoaGVhZC5jb21tZW50cykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoZWFkLnR5cGUgPT09IFwiSWRlbnRpZmllclwiIHx8IGhlYWQudHlwZSA9PT0gXCJUaGlzRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZsb3dWYXJpYW5jZShwYXRoKSB7XG4gICAgaWYgKCFwYXRoLnZhcmlhbmNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIEJhYmVsIDcuMCBjdXJyZW50bHkgdXNlcyB2YXJpYW5jZSBub2RlIHR5cGUsIGFuZCBmbG93IHNob3VsZFxuICAgIC8vIGZvbGxvdyBzdWl0IHNvb246XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmVsL2lzc3Vlcy80NzIyXG5cblxuICAgIGNvbnN0IHZhcmlhbmNlID0gcGF0aC52YXJpYW5jZS5raW5kIHx8IHBhdGgudmFyaWFuY2U7XG5cbiAgICBzd2l0Y2ggKHZhcmlhbmNlKSB7XG4gICAgICBjYXNlIFwicGx1c1wiOlxuICAgICAgICByZXR1cm4gXCIrXCI7XG5cbiAgICAgIGNhc2UgXCJtaW51c1wiOlxuICAgICAgICByZXR1cm4gXCItXCI7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHJldHVybiB2YXJpYW5jZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGFzc1Byb3BNYXlDYXVzZUFTSVByb2JsZW1zKHBhdGgpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXROb2RlKCk7XG5cbiAgICBpZiAobm9kZS50eXBlICE9PSBcIkNsYXNzUHJvcGVydHlcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSBub2RlLmtleSAmJiBub2RlLmtleS5uYW1lOyAvLyB0aGlzIGlzbid0IGFjdHVhbGx5IHBvc3NpYmxlIHlldCB3aXRoIG1vc3QgcGFyc2VycyBhdmFpbGFibGUgdG9kYXlcbiAgICAvLyBzbyBpc24ndCBwcm9wZXJseSB0ZXN0ZWQgeWV0LlxuXG4gICAgaWYgKChuYW1lID09PSBcInN0YXRpY1wiIHx8IG5hbWUgPT09IFwiZ2V0XCIgfHwgbmFtZSA9PT0gXCJzZXRcIikgJiYgIW5vZGUudmFsdWUgJiYgIW5vZGUudHlwZUFubm90YXRpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsYXNzQ2hpbGROZWVkc0FTSVByb3RlY3Rpb24obm9kZSkge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLnN0YXRpYyB8fCBub2RlLmFjY2Vzc2liaWxpdHkgLy8gVHlwZVNjcmlwdFxuICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBpZiAoIW5vZGUuY29tcHV0ZWQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBub2RlLmtleSAmJiBub2RlLmtleS5uYW1lO1xuXG4gICAgICBpZiAobmFtZSA9PT0gXCJpblwiIHx8IG5hbWUgPT09IFwiaW5zdGFuY2VvZlwiKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwiQ2xhc3NQcm9wZXJ0eVwiOlxuICAgICAgY2FzZSBcIlRTQWJzdHJhY3RDbGFzc1Byb3BlcnR5XCI6XG4gICAgICAgIHJldHVybiBub2RlLmNvbXB1dGVkO1xuXG4gICAgICBjYXNlIFwiTWV0aG9kRGVmaW5pdGlvblwiOiAvLyBGbG93XG5cbiAgICAgIGNhc2UgXCJUU0Fic3RyYWN0TWV0aG9kRGVmaW5pdGlvblwiOiAvLyBUeXBlU2NyaXB0XG5cbiAgICAgIGNhc2UgXCJDbGFzc01ldGhvZFwiOlxuICAgICAgY2FzZSBcIkNsYXNzUHJpdmF0ZU1ldGhvZFwiOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gQmFiZWxcbiAgICAgICAgICBjb25zdCBpc0FzeW5jID0gbm9kZS52YWx1ZSA/IG5vZGUudmFsdWUuYXN5bmMgOiBub2RlLmFzeW5jO1xuICAgICAgICAgIGNvbnN0IGlzR2VuZXJhdG9yID0gbm9kZS52YWx1ZSA/IG5vZGUudmFsdWUuZ2VuZXJhdG9yIDogbm9kZS5nZW5lcmF0b3I7XG5cbiAgICAgICAgICBpZiAoaXNBc3luYyB8fCBub2RlLmtpbmQgPT09IFwiZ2V0XCIgfHwgbm9kZS5raW5kID09PSBcInNldFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5vZGUuY29tcHV0ZWQgfHwgaXNHZW5lcmF0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiVFNJbmRleFNpZ25hdHVyZVwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFR5cGVTY3JpcHRNYXBwZWRUeXBlTW9kaWZpZXIodG9rZW5Ob2RlLCBrZXl3b3JkKSB7XG4gICAgaWYgKHRva2VuTm9kZSA9PT0gXCIrXCIpIHtcbiAgICAgIHJldHVybiBcIitcIiArIGtleXdvcmQ7XG4gICAgfSBlbHNlIGlmICh0b2tlbk5vZGUgPT09IFwiLVwiKSB7XG4gICAgICByZXR1cm4gXCItXCIgKyBrZXl3b3JkO1xuICAgIH1cblxuICAgIHJldHVybiBrZXl3b3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzTmV3bGluZUJldHdlZW5PckFmdGVyRGVjb3JhdG9ycyhub2RlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGhhc05ld2xpbmVJblJhbmdlJDIob3B0aW9ucy5vcmlnaW5hbFRleHQsIG9wdGlvbnMubG9jU3RhcnQobm9kZS5kZWNvcmF0b3JzWzBdKSwgb3B0aW9ucy5sb2NFbmQoZ2V0TGFzdCQyKG5vZGUuZGVjb3JhdG9ycykpKSB8fCBoYXNOZXdsaW5lJDQob3B0aW9ucy5vcmlnaW5hbFRleHQsIG9wdGlvbnMubG9jRW5kKGdldExhc3QkMihub2RlLmRlY29yYXRvcnMpKSk7XG4gIH0gLy8gT25seSBzcGFjZSwgbmV3bGluZSwgY2FycmlhZ2UgcmV0dXJuLCBhbmQgdGFiIGFyZSB0cmVhdGVkIGFzIHdoaXRlc3BhY2VcbiAgLy8gaW5zaWRlIEpTWC5cblxuXG4gIGNvbnN0IGpzeFdoaXRlc3BhY2VDaGFycyA9IFwiIFxcblxcclxcdFwiO1xuICBjb25zdCBtYXRjaEpzeFdoaXRlc3BhY2VSZWdleCA9IG5ldyBSZWdFeHAoXCIoW1wiICsganN4V2hpdGVzcGFjZUNoYXJzICsgXCJdKylcIik7XG4gIGNvbnN0IGNvbnRhaW5zTm9uSnN4V2hpdGVzcGFjZVJlZ2V4ID0gbmV3IFJlZ0V4cChcIlteXCIgKyBqc3hXaGl0ZXNwYWNlQ2hhcnMgKyBcIl1cIik7IC8vIE1lYW5pbmdmdWwgaWYgaXQgY29udGFpbnMgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyxcbiAgLy8gb3IgaXQgY29udGFpbnMgd2hpdGVzcGFjZSB3aXRob3V0IGEgbmV3IGxpbmUuXG5cbiAgZnVuY3Rpb24gaXNNZWFuaW5nZnVsSlNYVGV4dChub2RlKSB7XG4gICAgcmV0dXJuIGlzTGl0ZXJhbChub2RlKSAmJiAoY29udGFpbnNOb25Kc3hXaGl0ZXNwYWNlUmVnZXgudGVzdChyYXdUZXh0KG5vZGUpKSB8fCAhL1xcbi8udGVzdChyYXdUZXh0KG5vZGUpKSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNKc3hJZ25vcmVDb21tZW50KHBhdGgpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuXG4gICAgaWYgKCFwYXJlbnQgfHwgIW5vZGUgfHwgIWlzSlNYTm9kZShub2RlKSB8fCAhaXNKU1hOb2RlKHBhcmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIExvb2t1cCB0aGUgcHJldmlvdXMgc2libGluZywgaWdub3JpbmcgYW55IGVtcHR5IEpTWFRleHQgZWxlbWVudHNcblxuXG4gICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKTtcbiAgICBsZXQgcHJldlNpYmxpbmcgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgaSA9IGluZGV4OyBpID4gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXJlbnQuY2hpbGRyZW5baSAtIDFdO1xuXG4gICAgICBpZiAoY2FuZGlkYXRlLnR5cGUgPT09IFwiSlNYVGV4dFwiICYmICFpc01lYW5pbmdmdWxKU1hUZXh0KGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByZXZTaWJsaW5nID0gY2FuZGlkYXRlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZTaWJsaW5nICYmIHByZXZTaWJsaW5nLnR5cGUgPT09IFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiICYmIHByZXZTaWJsaW5nLmV4cHJlc3Npb24udHlwZSA9PT0gXCJKU1hFbXB0eUV4cHJlc3Npb25cIiAmJiBwcmV2U2libGluZy5leHByZXNzaW9uLmNvbW1lbnRzICYmIHByZXZTaWJsaW5nLmV4cHJlc3Npb24uY29tbWVudHMuZmluZChjb21tZW50ID0+IGNvbW1lbnQudmFsdWUudHJpbSgpID09PSBcInByZXR0aWVyLWlnbm9yZVwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRW1wdHlKU1hFbGVtZW50KG5vZGUpIHtcbiAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGlmIHRoZXJlIGlzIG9uZSB0ZXh0IGNoaWxkIGFuZCBkb2VzIG5vdCBjb250YWluIGFueSBtZWFuaW5nZnVsIHRleHRcbiAgICAvLyB3ZSBjYW4gdHJlYXQgdGhlIGVsZW1lbnQgYXMgZW1wdHkuXG5cblxuICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlblswXTtcbiAgICByZXR1cm4gaXNMaXRlcmFsKGNoaWxkKSAmJiAhaXNNZWFuaW5nZnVsSlNYVGV4dChjaGlsZCk7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNQcmV0dGllcklnbm9yZSQ0KHBhdGgpIHtcbiAgICByZXR1cm4gaGFzSWdub3JlQ29tbWVudCQzKHBhdGgpIHx8IGhhc0pzeElnbm9yZUNvbW1lbnQocGF0aCk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0xhc3RTdGF0ZW1lbnQocGF0aCkge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgYm9keSA9IChwYXJlbnQuYm9keSB8fCBwYXJlbnQuY29uc2VxdWVudCkuZmlsdGVyKHN0bXQgPT4gc3RtdC50eXBlICE9PSBcIkVtcHR5U3RhdGVtZW50XCIpO1xuICAgIHJldHVybiBib2R5ICYmIGJvZHlbYm9keS5sZW5ndGggLSAxXSA9PT0gbm9kZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRmxvd0Fubm90YXRpb25Db21tZW50KHRleHQsIHR5cGVBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBvcHRpb25zLmxvY1N0YXJ0KHR5cGVBbm5vdGF0aW9uKTtcbiAgICBjb25zdCBlbmQgPSBza2lwV2hpdGVzcGFjZSQyKHRleHQsIG9wdGlvbnMubG9jRW5kKHR5cGVBbm5vdGF0aW9uKSk7XG4gICAgcmV0dXJuIHRleHQuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgMikgPT09IFwiLypcIiAmJiB0ZXh0LnNsaWNlKGVuZCwgZW5kICsgMikgPT09IFwiKi9cIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0xlYWRpbmdPd25MaW5lQ29tbWVudCh0ZXh0LCBub2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKGlzSlNYTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIGhhc05vZGVJZ25vcmVDb21tZW50JDEobm9kZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gbm9kZS5jb21tZW50cyAmJiBub2RlLmNvbW1lbnRzLnNvbWUoY29tbWVudCA9PiBjb21tZW50LmxlYWRpbmcgJiYgaGFzTmV3bGluZSQ0KHRleHQsIG9wdGlvbnMubG9jRW5kKGNvbW1lbnQpKSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBUaGlzIHJlY3Vyc2VzIHRoZSByZXR1cm4gYXJndW1lbnQsIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCB0b2tlblxuICAvLyAodGhlIGxlZnRtb3N0IGxlYWYgbm9kZSkgYW5kLCBpZiBpdCAob3IgaXRzIHBhcmVudHMpIGhhcyBhbnlcbiAgLy8gbGVhZGluZ0NvbW1lbnRzLCByZXR1cm5zIHRydWUgKHNvIGl0IGNhbiBiZSB3cmFwcGVkIGluIHBhcmVucykuXG5cblxuICBmdW5jdGlvbiByZXR1cm5Bcmd1bWVudEhhc0xlYWRpbmdDb21tZW50KG9wdGlvbnMsIGFyZ3VtZW50KSB7XG4gICAgaWYgKGhhc0xlYWRpbmdPd25MaW5lQ29tbWVudChvcHRpb25zLm9yaWdpbmFsVGV4dCwgYXJndW1lbnQsIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaGFzTmFrZWRMZWZ0U2lkZShhcmd1bWVudCkpIHtcbiAgICAgIGxldCBsZWZ0TW9zdCA9IGFyZ3VtZW50O1xuICAgICAgbGV0IG5ld0xlZnRNb3N0O1xuXG4gICAgICB3aGlsZSAobmV3TGVmdE1vc3QgPSBnZXRMZWZ0U2lkZShsZWZ0TW9zdCkpIHtcbiAgICAgICAgbGVmdE1vc3QgPSBuZXdMZWZ0TW9zdDtcblxuICAgICAgICBpZiAoaGFzTGVhZGluZ093bkxpbmVDb21tZW50KG9wdGlvbnMub3JpZ2luYWxUZXh0LCBsZWZ0TW9zdCwgb3B0aW9ucykpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3RyaW5nUHJvcFNhZmVUb0NvZXJjZVRvSWRlbnRpZmllcihub2RlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nTGl0ZXJhbChub2RlLmtleSkgJiYgaXNJZGVudGlmaWVyTmFtZShub2RlLmtleS52YWx1ZSkgJiYgb3B0aW9ucy5wYXJzZXIgIT09IFwianNvblwiICYmIC8vIFdpdGggYC0tc3RyaWN0UHJvcGVydHlJbml0aWFsaXphdGlvbmAsIFRTIHRyZWF0cyBwcm9wZXJ0aWVzIHdpdGggcXVvdGVkIG5hbWVzIGRpZmZlcmVudGx5IHRoYW4gdW5xdW90ZWQgb25lcy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L3B1bGwvMjAwNzVcbiAgICAhKChvcHRpb25zLnBhcnNlciA9PT0gXCJ0eXBlc2NyaXB0XCIgfHwgb3B0aW9ucy5wYXJzZXIgPT09IFwiYmFiZWwtdHNcIikgJiYgbm9kZS50eXBlID09PSBcIkNsYXNzUHJvcGVydHlcIik7XG4gIH1cblxuICBmdW5jdGlvbiBpc0plc3RFYWNoVGVtcGxhdGVMaXRlcmFsKG5vZGUsIHBhcmVudE5vZGUpIHtcbiAgICAvKipcbiAgICAgKiBkZXNjcmliZS5lYWNoYHRhYmxlYChuYW1lLCBmbilcbiAgICAgKiBkZXNjcmliZS5vbmx5LmVhY2hgdGFibGVgKG5hbWUsIGZuKVxuICAgICAqIGRlc2NyaWJlLnNraXAuZWFjaGB0YWJsZWAobmFtZSwgZm4pXG4gICAgICogdGVzdC5lYWNoYHRhYmxlYChuYW1lLCBmbilcbiAgICAgKiB0ZXN0Lm9ubHkuZWFjaGB0YWJsZWAobmFtZSwgZm4pXG4gICAgICogdGVzdC5za2lwLmVhY2hgdGFibGVgKG5hbWUsIGZuKVxuICAgICAqXG4gICAgICogUmVmOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svamVzdC9wdWxsLzYxMDJcbiAgICAgKi9cbiAgICBjb25zdCBqZXN0RWFjaFRyaWdnZXJSZWdleCA9IC9eW3hmXT8oZGVzY3JpYmV8aXR8dGVzdCkkLztcbiAgICByZXR1cm4gcGFyZW50Tm9kZS50eXBlID09PSBcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiICYmIHBhcmVudE5vZGUucXVhc2kgPT09IG5vZGUgJiYgcGFyZW50Tm9kZS50YWcudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiYgcGFyZW50Tm9kZS50YWcucHJvcGVydHkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgcGFyZW50Tm9kZS50YWcucHJvcGVydHkubmFtZSA9PT0gXCJlYWNoXCIgJiYgKHBhcmVudE5vZGUudGFnLm9iamVjdC50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBqZXN0RWFjaFRyaWdnZXJSZWdleC50ZXN0KHBhcmVudE5vZGUudGFnLm9iamVjdC5uYW1lKSB8fCBwYXJlbnROb2RlLnRhZy5vYmplY3QudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiYgcGFyZW50Tm9kZS50YWcub2JqZWN0LnByb3BlcnR5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIChwYXJlbnROb2RlLnRhZy5vYmplY3QucHJvcGVydHkubmFtZSA9PT0gXCJvbmx5XCIgfHwgcGFyZW50Tm9kZS50YWcub2JqZWN0LnByb3BlcnR5Lm5hbWUgPT09IFwic2tpcFwiKSAmJiBwYXJlbnROb2RlLnRhZy5vYmplY3Qub2JqZWN0LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIGplc3RFYWNoVHJpZ2dlclJlZ2V4LnRlc3QocGFyZW50Tm9kZS50YWcub2JqZWN0Lm9iamVjdC5uYW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0ZW1wbGF0ZUxpdGVyYWxIYXNOZXdMaW5lcyh0ZW1wbGF0ZSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZS5xdWFzaXMuc29tZShxdWFzaSA9PiBxdWFzaS52YWx1ZS5yYXcuaW5jbHVkZXMoXCJcXG5cIikpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNUZW1wbGF0ZU9uSXRzT3duTGluZShuLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIChuLnR5cGUgPT09IFwiVGVtcGxhdGVMaXRlcmFsXCIgJiYgdGVtcGxhdGVMaXRlcmFsSGFzTmV3TGluZXMobikgfHwgbi50eXBlID09PSBcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiICYmIHRlbXBsYXRlTGl0ZXJhbEhhc05ld0xpbmVzKG4ucXVhc2kpKSAmJiAhaGFzTmV3bGluZSQ0KHRleHQsIG9wdGlvbnMubG9jU3RhcnQobiksIHtcbiAgICAgIGJhY2t3YXJkczogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbmVlZHNIYXJkbGluZUFmdGVyRGFuZ2xpbmdDb21tZW50KG5vZGUpIHtcbiAgICBpZiAoIW5vZGUuY29tbWVudHMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXN0RGFuZ2xpbmdDb21tZW50ID0gZ2V0TGFzdCQyKG5vZGUuY29tbWVudHMuZmlsdGVyKGNvbW1lbnQgPT4gIWNvbW1lbnQubGVhZGluZyAmJiAhY29tbWVudC50cmFpbGluZykpO1xuICAgIHJldHVybiBsYXN0RGFuZ2xpbmdDb21tZW50ICYmICFjb21tZW50cyQxLmlzQmxvY2tDb21tZW50KGxhc3REYW5nbGluZ0NvbW1lbnQpO1xuICB9IC8vIElmIHdlIGhhdmUgbmVzdGVkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zLCB3ZSB3YW50IHRvIHByaW50IHRoZW0gaW4gSlNYIG1vZGVcbiAgLy8gaWYgdGhlcmUncyBhdCBsZWFzdCBvbmUgSlNYRWxlbWVudCBzb21ld2hlcmUgaW4gdGhlIHRyZWUuXG4gIC8vXG4gIC8vIEEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBjaGFpbiBsaWtlIHRoaXMgc2hvdWxkIGJlIHByaW50ZWQgaW4gbm9ybWFsIG1vZGUsXG4gIC8vIGJlY2F1c2UgdGhlcmUgYXJlbid0IEpTWEVsZW1lbnRzIGFueXdoZXJlIGluIGl0OlxuICAvL1xuICAvLyBpc0EgPyBcIkFcIiA6IGlzQiA/IFwiQlwiIDogaXNDID8gXCJDXCIgOiBcIlVua25vd25cIjtcbiAgLy9cbiAgLy8gQnV0IGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBjaGFpbiBsaWtlIHRoaXMgc2hvdWxkIGJlIHByaW50ZWQgaW4gSlNYIG1vZGUsXG4gIC8vIGJlY2F1c2UgdGhlcmUgaXMgYSBKU1hFbGVtZW50IGluIHRoZSBsYXN0IENvbmRpdGlvbmFsRXhwcmVzc2lvbjpcbiAgLy9cbiAgLy8gaXNBID8gXCJBXCIgOiBpc0IgPyBcIkJcIiA6IGlzQyA/IFwiQ1wiIDogPHNwYW4gY2xhc3NOYW1lPVwid2FybmluZ1wiPlVua25vd248L3NwYW4+O1xuICAvL1xuICAvLyBUaGlzIHR5cGUgb2YgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNoYWluIGlzIHN0cnVjdHVyZWQgbGlrZSB0aGlzIGluIHRoZSBBU1Q6XG4gIC8vXG4gIC8vIENvbmRpdGlvbmFsRXhwcmVzc2lvbiB7XG4gIC8vICAgdGVzdDogLi4uLFxuICAvLyAgIGNvbnNlcXVlbnQ6IC4uLixcbiAgLy8gICBhbHRlcm5hdGU6IENvbmRpdGlvbmFsRXhwcmVzc2lvbiB7XG4gIC8vICAgICB0ZXN0OiAuLi4sXG4gIC8vICAgICBjb25zZXF1ZW50OiAuLi4sXG4gIC8vICAgICBhbHRlcm5hdGU6IENvbmRpdGlvbmFsRXhwcmVzc2lvbiB7XG4gIC8vICAgICAgIHRlc3Q6IC4uLixcbiAgLy8gICAgICAgY29uc2VxdWVudDogLi4uLFxuICAvLyAgICAgICBhbHRlcm5hdGU6IC4uLixcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cbiAgLy9cbiAgLy8gV2Ugd2FudCB0byB0cmF2ZXJzZSBvdmVyIHRoYXQgc2hhcGUgYW5kIGNvbnZlcnQgaXQgaW50byBhIGZsYXQgc3RydWN0dXJlIHNvXG4gIC8vIHRoYXQgd2UgY2FuIGZpbmQgaWYgdGhlcmUncyBhIEpTWEVsZW1lbnQgc29tZXdoZXJlIGluc2lkZS5cblxuXG4gIGZ1bmN0aW9uIGdldENvbmRpdGlvbmFsQ2hhaW5Db250ZW50cyhub2RlKSB7XG4gICAgLy8gR2l2ZW4gdGhpcyBjb2RlOlxuICAgIC8vXG4gICAgLy8gLy8gVXNpbmcgYSBDb25kaXRpb25hbEV4cHJlc3Npb24gYXMgdGhlIGNvbnNlcXVlbnQgaXMgdW5jb21tb24sIGJ1dCBzaG91bGRcbiAgICAvLyAvLyBiZSBoYW5kbGVkLlxuICAgIC8vIEEgPyBCIDogQyA/IEQgOiBFID8gRiA/IEcgOiBIIDogSVxuICAgIC8vXG4gICAgLy8gd2hpY2ggaGFzIHRoaXMgQVNUOlxuICAgIC8vXG4gICAgLy8gQ29uZGl0aW9uYWxFeHByZXNzaW9uIHtcbiAgICAvLyAgIHRlc3Q6IElkZW50aWZpZXIoQSksXG4gICAgLy8gICBjb25zZXF1ZW50OiBJZGVudGlmaWVyKEIpLFxuICAgIC8vICAgYWx0ZXJuYXRlOiBDb25kaXRpb25hbEV4cHJlc3Npb24ge1xuICAgIC8vICAgICB0ZXN0OiBJZGVudGlmaWVyKEMpLFxuICAgIC8vICAgICBjb25zZXF1ZW50OiBJZGVudGlmaWVyKEQpLFxuICAgIC8vICAgICBhbHRlcm5hdGU6IENvbmRpdGlvbmFsRXhwcmVzc2lvbiB7XG4gICAgLy8gICAgICAgdGVzdDogSWRlbnRpZmllcihFKSxcbiAgICAvLyAgICAgICBjb25zZXF1ZW50OiBDb25kaXRpb25hbEV4cHJlc3Npb24ge1xuICAgIC8vICAgICAgICAgdGVzdDogSWRlbnRpZmllcihGKSxcbiAgICAvLyAgICAgICAgIGNvbnNlcXVlbnQ6IElkZW50aWZpZXIoRyksXG4gICAgLy8gICAgICAgICBhbHRlcm5hdGU6IElkZW50aWZpZXIoSCksXG4gICAgLy8gICAgICAgfSxcbiAgICAvLyAgICAgICBhbHRlcm5hdGU6IElkZW50aWZpZXIoSSksXG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gICAgLy9cbiAgICAvLyB3ZSBzaG91bGQgcmV0dXJuIHRoaXMgQXJyYXk6XG4gICAgLy9cbiAgICAvLyBbXG4gICAgLy8gICBJZGVudGlmaWVyKEEpLFxuICAgIC8vICAgSWRlbnRpZmllcihCKSxcbiAgICAvLyAgIElkZW50aWZpZXIoQyksXG4gICAgLy8gICBJZGVudGlmaWVyKEQpLFxuICAgIC8vICAgSWRlbnRpZmllcihFKSxcbiAgICAvLyAgIElkZW50aWZpZXIoRiksXG4gICAgLy8gICBJZGVudGlmaWVyKEcpLFxuICAgIC8vICAgSWRlbnRpZmllcihIKSxcbiAgICAvLyAgIElkZW50aWZpZXIoSSlcbiAgICAvLyBdO1xuICAgIC8vXG4gICAgLy8gVGhpcyBsb3NlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBlYWNoIG5vZGUgd2FzIHRoZSB0ZXN0LFxuICAgIC8vIGNvbnNlcXVlbnQsIG9yIGFsdGVybmF0ZSwgYnV0IHdlIGRvbid0IGNhcmUgYWJvdXQgdGhhdCBoZXJlLSB3ZSBhcmUgb25seVxuICAgIC8vIGZsYXR0ZW5pbmcgdGhpcyBzdHJ1Y3R1cmUgdG8gZmluZCBpZiB0aGVyZSdzIGFueSBKU1hFbGVtZW50cyBpbnNpZGUuXG4gICAgY29uc3Qgbm9uQ29uZGl0aW9uYWxFeHByZXNzaW9ucyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gcmVjdXJzZShub2RlKSB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHJlY3Vyc2Uobm9kZS50ZXN0KTtcbiAgICAgICAgcmVjdXJzZShub2RlLmNvbnNlcXVlbnQpO1xuICAgICAgICByZWN1cnNlKG5vZGUuYWx0ZXJuYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vbkNvbmRpdGlvbmFsRXhwcmVzc2lvbnMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWN1cnNlKG5vZGUpO1xuICAgIHJldHVybiBub25Db25kaXRpb25hbEV4cHJlc3Npb25zO1xuICB9XG5cbiAgZnVuY3Rpb24gY29uZGl0aW9uYWxFeHByZXNzaW9uQ2hhaW5Db250YWluc0pTWChub2RlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oZ2V0Q29uZGl0aW9uYWxDaGFpbkNvbnRlbnRzKG5vZGUpLmZpbmQoaXNKU1hOb2RlKSk7XG4gIH0gLy8gTG9naWMgdG8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBtdWx0aXBsZSBhbm9ueW1vdXMgZnVuY3Rpb25zLiBGb3IgaW5zdGFuY2UsXG4gIC8vIHRoZSBmb2xsb3dpbmcgY2FsbCBzaG91bGQgYmUgc3BsaXQgb24gbXVsdGlwbGUgbGluZXMgZm9yIHJlYWRhYmlsaXR5OlxuICAvLyBzb3VyY2UucGlwZShtYXAoKHgpID0+IHggKyB4KSwgZmlsdGVyKCh4KSA9PiB4ICUgMiA9PT0gMCkpXG5cblxuICBmdW5jdGlvbiBpc0Z1bmN0aW9uQ29tcG9zaXRpb25BcmdzKGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbk9yQXJyb3dFeHByZXNzaW9uKGFyZykpIHtcbiAgICAgICAgY291bnQgKz0gMTtcblxuICAgICAgICBpZiAoY291bnQgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDYWxsT3JPcHRpb25hbENhbGxFeHByZXNzaW9uKGFyZykpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZEFyZyBvZiBhcmcuYXJndW1lbnRzKSB7XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb25PckFycm93RXhwcmVzc2lvbihjaGlsZEFyZykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBMb2dpYyB0byBkZXRlcm1pbmUgaWYgYSBjYWxsIGlzIGEg4oCcbG9uZyBjdXJyaWVkIGZ1bmN0aW9uIGNhbGzigJ0uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJldHRpZXIvcHJldHRpZXIvaXNzdWVzLzE0MjAuXG4gIC8vXG4gIC8vIGBjb25uZWN0KGEsIGIsIGMpKGQpYFxuICAvLyBJbiB0aGUgYWJvdmUgY2FsbCBleHByZXNzaW9uLCB0aGUgc2Vjb25kIGNhbGwgaXMgdGhlIHBhcmVudCBub2RlIGFuZCB0aGVcbiAgLy8gZmlyc3QgY2FsbCBpcyB0aGUgY3VycmVudCBub2RlLlxuXG5cbiAgZnVuY3Rpb24gaXNMb25nQ3VycmllZENhbGxFeHByZXNzaW9uKHBhdGgpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuICAgIHJldHVybiBpc0NhbGxPck9wdGlvbmFsQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgaXNDYWxsT3JPcHRpb25hbENhbGxFeHByZXNzaW9uKHBhcmVudCkgJiYgcGFyZW50LmNhbGxlZSA9PT0gbm9kZSAmJiBub2RlLmFyZ3VtZW50cy5sZW5ndGggPiBwYXJlbnQuYXJndW1lbnRzLmxlbmd0aCAmJiBwYXJlbnQuYXJndW1lbnRzLmxlbmd0aCA+IDA7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdlc3RyZWUnKS5Ob2RlfSBub2RlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBmdW5jdGlvbiBpc1NpbXBsZUNhbGxBcmd1bWVudChub2RlLCBkZXB0aCkge1xuICAgIGlmIChkZXB0aCA+PSAyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaXNDaGlsZFNpbXBsZSA9IGNoaWxkID0+IGlzU2ltcGxlQ2FsbEFyZ3VtZW50KGNoaWxkLCBkZXB0aCArIDEpO1xuXG4gICAgY29uc3QgcmVnZXhwUGF0dGVybiA9IG5vZGUudHlwZSA9PT0gXCJMaXRlcmFsXCIgJiYgbm9kZS5yZWdleCAmJiBub2RlLnJlZ2V4LnBhdHRlcm4gfHwgbm9kZS50eXBlID09PSBcIlJlZ0V4cExpdGVyYWxcIiAmJiBub2RlLnBhdHRlcm47XG5cbiAgICBpZiAocmVnZXhwUGF0dGVybiAmJiByZWdleHBQYXR0ZXJuLmxlbmd0aCA+IDUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcIkxpdGVyYWxcIiB8fCBub2RlLnR5cGUgPT09IFwiQm9vbGVhbkxpdGVyYWxcIiB8fCBub2RlLnR5cGUgPT09IFwiTnVsbExpdGVyYWxcIiB8fCBub2RlLnR5cGUgPT09IFwiTnVtZXJpY0xpdGVyYWxcIiB8fCBub2RlLnR5cGUgPT09IFwiU3RyaW5nTGl0ZXJhbFwiIHx8IG5vZGUudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgfHwgbm9kZS50eXBlID09PSBcIlRoaXNFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIlN1cGVyXCIgfHwgbm9kZS50eXBlID09PSBcIkJpZ0ludExpdGVyYWxcIiB8fCBub2RlLnR5cGUgPT09IFwiUHJpdmF0ZU5hbWVcIiB8fCBub2RlLnR5cGUgPT09IFwiQXJndW1lbnRQbGFjZWhvbGRlclwiIHx8IG5vZGUudHlwZSA9PT0gXCJSZWdFeHBMaXRlcmFsXCIgfHwgbm9kZS50eXBlID09PSBcIkltcG9ydFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcIlRlbXBsYXRlTGl0ZXJhbFwiKSB7XG4gICAgICByZXR1cm4gbm9kZS5leHByZXNzaW9ucy5ldmVyeShpc0NoaWxkU2ltcGxlKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcIk9iamVjdEV4cHJlc3Npb25cIikge1xuICAgICAgcmV0dXJuIG5vZGUucHJvcGVydGllcy5ldmVyeShwID0+ICFwLmNvbXB1dGVkICYmIChwLnNob3J0aGFuZCB8fCBwLnZhbHVlICYmIGlzQ2hpbGRTaW1wbGUocC52YWx1ZSkpKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcIkFycmF5RXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gbm9kZS5lbGVtZW50cy5ldmVyeSh4ID0+IHggPT0gbnVsbCB8fCBpc0NoaWxkU2ltcGxlKHgpKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiTmV3RXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gaXNTaW1wbGVDYWxsQXJndW1lbnQobm9kZS5jYWxsZWUsIGRlcHRoKSAmJiBub2RlLmFyZ3VtZW50cy5ldmVyeShpc0NoaWxkU2ltcGxlKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgIHJldHVybiBpc1NpbXBsZUNhbGxBcmd1bWVudChub2RlLm9iamVjdCwgZGVwdGgpICYmIGlzU2ltcGxlQ2FsbEFyZ3VtZW50KG5vZGUucHJvcGVydHksIGRlcHRoKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcIlVuYXJ5RXhwcmVzc2lvblwiICYmIChub2RlLm9wZXJhdG9yID09PSBcIiFcIiB8fCBub2RlLm9wZXJhdG9yID09PSBcIi1cIikpIHtcbiAgICAgIHJldHVybiBpc1NpbXBsZUNhbGxBcmd1bWVudChub2RlLmFyZ3VtZW50LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJUU05vbk51bGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIHJldHVybiBpc1NpbXBsZUNhbGxBcmd1bWVudChub2RlLmV4cHJlc3Npb24sIGRlcHRoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiByYXdUZXh0KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5leHRyYSA/IG5vZGUuZXh0cmEucmF3IDogbm9kZS5yYXc7XG4gIH1cblxuICBmdW5jdGlvbiBpZGVudGl0eSQxKHgpIHtcbiAgICByZXR1cm4geDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVFNYRmlsZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZmlsZXBhdGggJiYgL1xcLnRzeCQvaS50ZXN0KG9wdGlvbnMuZmlsZXBhdGgpO1xuICB9XG5cbiAgdmFyIHV0aWxzJDUgPSB7XG4gICAgY2xhc3NDaGlsZE5lZWRzQVNJUHJvdGVjdGlvbixcbiAgICBjbGFzc1Byb3BNYXlDYXVzZUFTSVByb2JsZW1zLFxuICAgIGNvbmRpdGlvbmFsRXhwcmVzc2lvbkNoYWluQ29udGFpbnNKU1gsXG4gICAgZ2V0Rmxvd1ZhcmlhbmNlLFxuICAgIGdldExlZnRTaWRlUGF0aE5hbWUsXG4gICAgZ2V0UGFyZW50RXhwb3J0RGVjbGFyYXRpb24sXG4gICAgZ2V0VHlwZVNjcmlwdE1hcHBlZFR5cGVNb2RpZmllcixcbiAgICBoYXNEYW5nbGluZ0NvbW1lbnRzLFxuICAgIGhhc0Zsb3dBbm5vdGF0aW9uQ29tbWVudCxcbiAgICBoYXNGbG93U2hvcnRoYW5kQW5ub3RhdGlvbkNvbW1lbnQsXG4gICAgaGFzTGVhZGluZ0NvbW1lbnQ6IGhhc0xlYWRpbmdDb21tZW50JDIsXG4gICAgaGFzTGVhZGluZ093bkxpbmVDb21tZW50LFxuICAgIGhhc05ha2VkTGVmdFNpZGUsXG4gICAgaGFzTmV3bGluZUJldHdlZW5PckFmdGVyRGVjb3JhdG9ycyxcbiAgICBoYXNOZ1NpZGVFZmZlY3QsXG4gICAgaGFzTm9kZSxcbiAgICBoYXNQcmV0dGllcklnbm9yZTogaGFzUHJldHRpZXJJZ25vcmUkNCxcbiAgICBoYXNUcmFpbGluZ0NvbW1lbnQsXG4gICAgaWRlbnRpdHk6IGlkZW50aXR5JDEsXG4gICAgaXNCaW5hcnlpc2gsXG4gICAgaXNDYWxsT3JPcHRpb25hbENhbGxFeHByZXNzaW9uLFxuICAgIGlzRW1wdHlKU1hFbGVtZW50LFxuICAgIGlzRXhwb3J0RGVjbGFyYXRpb24sXG4gICAgaXNGbG93QW5ub3RhdGlvbkNvbW1lbnQsXG4gICAgaXNGdW5jdGlvbkNvbXBvc2l0aW9uQXJncyxcbiAgICBpc0Z1bmN0aW9uTm90YXRpb24sXG4gICAgaXNGdW5jdGlvbk9yQXJyb3dFeHByZXNzaW9uLFxuICAgIGlzR2V0dGVyT3JTZXR0ZXIsXG4gICAgaXNKZXN0RWFjaFRlbXBsYXRlTGl0ZXJhbCxcbiAgICBpc0pTWE5vZGUsXG4gICAgaXNKU1hXaGl0ZXNwYWNlRXhwcmVzc2lvbixcbiAgICBpc0xhc3RTdGF0ZW1lbnQsXG4gICAgaXNMaXRlcmFsLFxuICAgIGlzTG9uZ0N1cnJpZWRDYWxsRXhwcmVzc2lvbixcbiAgICBpc1NpbXBsZUNhbGxBcmd1bWVudCxcbiAgICBpc01lYW5pbmdmdWxKU1hUZXh0LFxuICAgIGlzTWVtYmVyRXhwcmVzc2lvbkNoYWluLFxuICAgIGlzTWVtYmVyaXNoLFxuICAgIGlzTmdGb3JPZixcbiAgICBpc051bWVyaWNMaXRlcmFsLFxuICAgIGlzT2JqZWN0VHlwZSxcbiAgICBpc09iamVjdFR5cGVQcm9wZXJ0eUFGdW5jdGlvbixcbiAgICBpc1NpbXBsZUZsb3dUeXBlLFxuICAgIGlzU2ltcGxlVGVtcGxhdGVMaXRlcmFsLFxuICAgIGlzU3RyaW5nTGl0ZXJhbCxcbiAgICBpc1N0cmluZ1Byb3BTYWZlVG9Db2VyY2VUb0lkZW50aWZpZXIsXG4gICAgaXNUZW1wbGF0ZU9uSXRzT3duTGluZSxcbiAgICBpc1Rlc3RDYWxsLFxuICAgIGlzVGhlT25seUpTWEVsZW1lbnRJbk1hcmtkb3duLFxuICAgIGlzVFNYRmlsZSxcbiAgICBpc1R5cGVBbm5vdGF0aW9uQUZ1bmN0aW9uLFxuICAgIG1hdGNoSnN4V2hpdGVzcGFjZVJlZ2V4LFxuICAgIG5lZWRzSGFyZGxpbmVBZnRlckRhbmdsaW5nQ29tbWVudCxcbiAgICByYXdUZXh0LFxuICAgIHJldHVybkFyZ3VtZW50SGFzTGVhZGluZ0NvbW1lbnRcbiAgfTtcblxuICBjb25zdCB7XG4gICAgZ2V0TGVmdFNpZGVQYXRoTmFtZTogZ2V0TGVmdFNpZGVQYXRoTmFtZSQxLFxuICAgIGhhc0Zsb3dTaG9ydGhhbmRBbm5vdGF0aW9uQ29tbWVudDogaGFzRmxvd1Nob3J0aGFuZEFubm90YXRpb25Db21tZW50JDEsXG4gICAgaGFzTmFrZWRMZWZ0U2lkZTogaGFzTmFrZWRMZWZ0U2lkZSQxLFxuICAgIGhhc05vZGU6IGhhc05vZGUkMVxuICB9ID0gdXRpbHMkNTtcblxuICBmdW5jdGlvbiBuZWVkc1BhcmVucyhwYXRoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG5cbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSBwYXRoLmdldE5hbWUoKTtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXROb2RlKCk7IC8vIElmIHRoZSB2YWx1ZSBvZiB0aGlzIHBhdGggaXMgc29tZSBjaGlsZCBvZiBhIE5vZGUgYW5kIG5vdCBhIE5vZGVcbiAgICAvLyBpdHNlbGYsIHRoZW4gaXQgZG9lc24ndCBuZWVkIHBhcmVudGhlc2VzLiBPbmx5IE5vZGUgb2JqZWN0cyAoaW5cbiAgICAvLyBmYWN0LCBvbmx5IEV4cHJlc3Npb24gbm9kZXMpIG5lZWQgcGFyZW50aGVzZXMuXG5cbiAgICBpZiAocGF0aC5nZXRWYWx1ZSgpICE9PSBub2RlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyB0byBhdm9pZCB1bmV4cGVjdGVkIGB9fWAgaW4gSFRNTCBpbnRlcnBvbGF0aW9uc1xuXG5cbiAgICBpZiAob3B0aW9ucy5fX2lzSW5IdG1sSW50ZXJwb2xhdGlvbiAmJiAhb3B0aW9ucy5icmFja2V0U3BhY2luZyAmJiBlbmRzV2l0aFJpZ2h0QnJhY2tldChub2RlKSAmJiBpc0ZvbGxvd2VkQnlSaWdodEJyYWNrZXQocGF0aCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gT25seSBzdGF0ZW1lbnRzIGRvbid0IG5lZWQgcGFyZW50aGVzZXMuXG5cblxuICAgIGlmIChpc1N0YXRlbWVudChub2RlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICggLy8gUHJlc2VydmUgcGFyZW5zIGlmIHdlIGhhdmUgYSBGbG93IGFubm90YXRpb24gY29tbWVudCwgdW5sZXNzIHdlJ3JlIHVzaW5nIHRoZSBGbG93XG4gICAgLy8gcGFyc2VyLiBUaGUgRmxvdyBwYXJzZXIgdHVybnMgRmxvdyBjb21tZW50cyBpbnRvIHR5cGUgYW5ub3RhdGlvbiBub2RlcyBpbiBpdHNcbiAgICAvLyBBU1QsIHdoaWNoIHdlIGhhbmRsZSBzZXBhcmF0ZWx5LlxuICAgIG9wdGlvbnMucGFyc2VyICE9PSBcImZsb3dcIiAmJiBoYXNGbG93U2hvcnRoYW5kQW5ub3RhdGlvbkNvbW1lbnQkMShwYXRoLmdldFZhbHVlKCkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIElkZW50aWZpZXJzIG5ldmVyIG5lZWQgcGFyZW50aGVzZXMuXG5cblxuICAgIGlmIChub2RlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAvLyAuLi51bmxlc3MgdGhvc2UgaWRlbnRpZmllcnMgYXJlIGVtYmVkIHBsYWNlaG9sZGVycy4gVGhleSBtaWdodCBiZSBzdWJzdGl0dXRlZCBieSBjb21wbGV4XG4gICAgICAvLyBleHByZXNzaW9ucywgc28gdGhlIHBhcmVucyBhcm91bmQgdGhlbSBzaG91bGQgbm90IGJlIGRyb3BwZWQuIEV4YW1wbGUgKEpTLWluLUhUTUwtaW4tSlMpOlxuICAgICAgLy8gICAgIGxldCB0cGwgPSBodG1sYDxzY3JpcHQ+IGYoKCR7ZXhwcn0pIC8gMik7IDwvc2NyaXB0PmA7XG4gICAgICAvLyBJZiB0aGUgaW5uZXIgSlMgZm9ybWF0dGVyIHJlbW92ZXMgdGhlIHBhcmVucywgdGhlIGV4cHJlc3Npb24gbWlnaHQgY2hhbmdlIGl0cyBtZWFuaW5nOlxuICAgICAgLy8gICAgIGYoKGEgKyBiKSAvIDIpICB2cyAgZihhICsgYiAvIDIpXG4gICAgICBpZiAobm9kZS5leHRyYSAmJiBub2RlLmV4dHJhLnBhcmVudGhlc2l6ZWQgJiYgL15QUkVUVElFUl9IVE1MX1BMQUNFSE9MREVSX1xcZCtfXFxkK19JTl9KUyQvLnRlc3Qobm9kZS5uYW1lKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBBZGQgcGFyZW5zIGFyb3VuZCB0aGUgZXh0ZW5kcyBjbGF1c2Ugb2YgYSBjbGFzcy4gSXQgaXMgbmVlZGVkIGZvciBhbG1vc3RcbiAgICAvLyBhbGwgZXhwcmVzc2lvbnMuXG5cblxuICAgIGlmICgocGFyZW50LnR5cGUgPT09IFwiQ2xhc3NEZWNsYXJhdGlvblwiIHx8IHBhcmVudC50eXBlID09PSBcIkNsYXNzRXhwcmVzc2lvblwiKSAmJiBwYXJlbnQuc3VwZXJDbGFzcyA9PT0gbm9kZSAmJiAobm9kZS50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkF3YWl0RXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJCaW5hcnlFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJMb2dpY2FsRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIk9iamVjdEV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiU2VxdWVuY2VFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJVbmFyeUV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiVXBkYXRlRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJZaWVsZEV4cHJlc3Npb25cIikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIikge1xuICAgICAgcmV0dXJuICgvLyBgZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb25gIG9yIGBleHBvcnQgZGVmYXVsdCBjbGFzc2AgY2FuJ3QgYmUgZm9sbG93ZWQgYnlcbiAgICAgICAgLy8gYW55dGhpbmcgYWZ0ZXIuIFNvIGFuIGV4cHJlc3Npb24gbGlrZSBgZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uKCl7fSkudG9TdHJpbmcoKWBcbiAgICAgICAgLy8gbmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkgYSBwYXJlbnRoZXNlc1xuICAgICAgICBzaG91bGRXcmFwRnVuY3Rpb25Gb3JFeHBvcnREZWZhdWx0KHBhdGgsIG9wdGlvbnMpIHx8IC8vIGBleHBvcnQgZGVmYXVsdCAoZm9vLCBiYXIpYCBhbHNvIG5lZWRzIHBhcmVudGhlc2VzXG4gICAgICAgIG5vZGUudHlwZSA9PT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50LnR5cGUgPT09IFwiRGVjb3JhdG9yXCIgJiYgcGFyZW50LmV4cHJlc3Npb24gPT09IG5vZGUpIHtcbiAgICAgIGxldCBoYXNDYWxsRXhwcmVzc2lvbiA9IGZhbHNlO1xuICAgICAgbGV0IGhhc01lbWJlckV4cHJlc3Npb24gPSBmYWxzZTtcbiAgICAgIGxldCBjdXJyZW50ID0gbm9kZTtcblxuICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgc3dpdGNoIChjdXJyZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgaGFzTWVtYmVyRXhwcmVzc2lvbiA9IHRydWU7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5vYmplY3Q7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLyoqIEAoeCgpLnkpICovXG4gICAgICAgICAgICBoYXNNZW1iZXJFeHByZXNzaW9uIHx8XG4gICAgICAgICAgICAvKiogQCh4KCkueSgpKSAqL1xuICAgICAgICAgICAgaGFzQ2FsbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhhc0NhbGxFeHByZXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNhbGxlZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIklkZW50aWZpZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50LnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiAmJiBwYXJlbnQuYm9keSA9PT0gbm9kZSAmJiBub2RlLnR5cGUgIT09IFwiU2VxdWVuY2VFeHByZXNzaW9uXCIgJiYgLy8gdGhlc2UgaGF2ZSBwYXJlbnMgYWRkZWQgYW55d2F5XG4gICAgdXRpbCQxLnN0YXJ0c1dpdGhOb0xvb2thaGVhZFRva2VuKG5vZGUsXG4gICAgLyogZm9yYmlkRnVuY3Rpb25DbGFzc0FuZERvRXhwciAqL1xuICAgIGZhbHNlKSB8fCBwYXJlbnQudHlwZSA9PT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgJiYgdXRpbCQxLnN0YXJ0c1dpdGhOb0xvb2thaGVhZFRva2VuKG5vZGUsXG4gICAgLyogZm9yYmlkRnVuY3Rpb25DbGFzc0FuZERvRXhwciAqL1xuICAgIHRydWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgICByZXR1cm4gcGFyZW50LnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmIG5hbWUgPT09IFwib2JqZWN0XCIgJiYgcGFyZW50Lm9iamVjdCA9PT0gbm9kZTtcblxuICAgICAgY2FzZSBcIlVwZGF0ZUV4cHJlc3Npb25cIjpcbiAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUucHJlZml4ICYmIChub2RlLm9wZXJhdG9yID09PSBcIisrXCIgJiYgcGFyZW50Lm9wZXJhdG9yID09PSBcIitcIiB8fCBub2RlLm9wZXJhdG9yID09PSBcIi0tXCIgJiYgcGFyZW50Lm9wZXJhdG9yID09PSBcIi1cIik7XG4gICAgICAgIH1cblxuICAgICAgLy8gZWxzZSBmYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5vcGVyYXRvciA9PT0gcGFyZW50Lm9wZXJhdG9yICYmIChub2RlLm9wZXJhdG9yID09PSBcIitcIiB8fCBub2RlLm9wZXJhdG9yID09PSBcIi1cIik7XG5cbiAgICAgICAgICBjYXNlIFwiQmluZEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gXCJvYmplY3RcIjtcblxuICAgICAgICAgIGNhc2UgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgY2FzZSBcIk5ld0V4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IFwiY2FsbGVlXCI7XG5cbiAgICAgICAgICBjYXNlIFwiQmluYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5vcGVyYXRvciA9PT0gXCIqKlwiICYmIG5hbWUgPT09IFwibGVmdFwiO1xuXG4gICAgICAgICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiQmluYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSBcIlVwZGF0ZUV4cHJlc3Npb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaXNMZWZ0T2ZBRm9yU3RhdGVtZW50ID0gbm9kZSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZShpKyspO1xuXG4gICAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSBcIkZvclN0YXRlbWVudFwiICYmIHBhcmVudC5pbml0ID09PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChub2RlLm9wZXJhdG9yID09PSBcImluXCIgJiYgaXNMZWZ0T2ZBRm9yU3RhdGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIC8vIGZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJUU1R5cGVBc3NlcnRpb25cIjpcbiAgICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIlRTQXNFeHByZXNzaW9uXCI7XG5cbiAgICAgICAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiTmV3RXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gXCJjYWxsZWVcIjtcblxuICAgICAgICAgIGNhc2UgXCJDbGFzc0V4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiQ2xhc3NEZWNsYXJhdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IFwic3VwZXJDbGFzc1wiICYmIHBhcmVudC5zdXBlckNsYXNzID09PSBub2RlO1xuXG4gICAgICAgICAgY2FzZSBcIlRTVHlwZUFzc2VydGlvblwiOlxuICAgICAgICAgIGNhc2UgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkpTWFNwcmVhZEF0dHJpYnV0ZVwiOlxuICAgICAgICAgIGNhc2UgXCJTcHJlYWRFbGVtZW50XCI6XG4gICAgICAgICAgY2FzZSBcIlNwcmVhZFByb3BlcnR5XCI6XG4gICAgICAgICAgY2FzZSBcIkJpbmRFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkF3YWl0RXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJUU05vbk51bGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIlVwZGF0ZUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gXCJvYmplY3RcIjtcblxuICAgICAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5sZWZ0ID09PSBub2RlICYmIChub2RlLnR5cGUgPT09IFwiVFNUeXBlQXNzZXJ0aW9uXCIgfHwgbm9kZS50eXBlID09PSBcIlRTQXNFeHByZXNzaW9uXCIpO1xuXG4gICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSBcIkxvZ2ljYWxFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5vcGVyYXRvciAhPT0gbm9kZS5vcGVyYXRvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGVsc2UgZmFsbHRocm91Z2hcblxuICAgICAgICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICghbm9kZS5vcGVyYXRvciAmJiBub2RlLnR5cGUgIT09IFwiVFNUeXBlQXNzZXJ0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHBvID0gcGFyZW50Lm9wZXJhdG9yO1xuICAgICAgICAgICAgICBjb25zdCBwcCA9IHV0aWwkMS5nZXRQcmVjZWRlbmNlKHBvKTtcbiAgICAgICAgICAgICAgY29uc3Qgbm8gPSBub2RlLm9wZXJhdG9yO1xuICAgICAgICAgICAgICBjb25zdCBucCA9IHV0aWwkMS5nZXRQcmVjZWRlbmNlKG5vKTtcblxuICAgICAgICAgICAgICBpZiAocHAgPiBucCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHBwID09PSBucCAmJiBuYW1lID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyZW50LnJpZ2h0LCBub2RlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChwcCA9PT0gbnAgJiYgIXV0aWwkMS5zaG91bGRGbGF0dGVuKHBvLCBubykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChwcCA8IG5wICYmIG5vID09PSBcIiVcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwbyA9PT0gXCIrXCIgfHwgcG8gPT09IFwiLVwiO1xuICAgICAgICAgICAgICB9IC8vIEFkZCBwYXJlbnRoZXNpcyB3aGVuIHdvcmtpbmcgd2l0aCBiaXR3aXNlIG9wZXJhdG9yc1xuICAgICAgICAgICAgICAvLyBJdCdzIG5vdCBzdHJpY3RseSBuZWVkZWQgYnV0IGhlbHBzIHdpdGggY29kZSB1bmRlcnN0YW5kaW5nXG5cblxuICAgICAgICAgICAgICBpZiAodXRpbCQxLmlzQml0d2lzZU9wZXJhdG9yKHBvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiU2VxdWVuY2VFeHByZXNzaW9uXCI6XG4gICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiUmV0dXJuU3RhdGVtZW50XCI6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICBjYXNlIFwiRm9yU3RhdGVtZW50XCI6XG4gICAgICAgICAgICAvLyBBbHRob3VnaCBwYXJlbnRoZXNlcyB3b3VsZG4ndCBodXJ0IGFyb3VuZCBzZXF1ZW5jZVxuICAgICAgICAgICAgLy8gZXhwcmVzc2lvbnMgaW4gdGhlIGhlYWQgb2YgZm9yIGxvb3BzLCB0cmFkaXRpb25hbCBzdHlsZVxuICAgICAgICAgICAgLy8gZGljdGF0ZXMgdGhhdCBlLmcuIGkrKywgaisrIHNob3VsZCBub3QgYmUgd3JhcHBlZCB3aXRoXG4gICAgICAgICAgICAvLyBwYXJlbnRoZXNlcy5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgIGNhc2UgXCJFeHByZXNzaW9uU3RhdGVtZW50XCI6XG4gICAgICAgICAgICByZXR1cm4gbmFtZSAhPT0gXCJleHByZXNzaW9uXCI7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIC8vIFdlIGRvIG5lZWQgcGFyZW50aGVzZXMsIGJ1dCBTZXF1ZW5jZUV4cHJlc3Npb25zIGFyZSBoYW5kbGVkXG4gICAgICAgICAgICAvLyBzcGVjaWFsbHkgd2hlbiBwcmludGluZyBib2RpZXMgb2YgYXJyb3cgZnVuY3Rpb25zLlxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgIT09IFwiYm9keVwiO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBlcnIgb24gdGhlIHNpZGUgb2Ygb3ZlcnBhcmVudGhlc2l6YXRpb24sIGFkZGluZ1xuICAgICAgICAgICAgLy8gZXhwbGljaXQgZXhjZXB0aW9ucyBhYm92ZSBpZiB0aGlzIHByb3ZlcyBvdmVyemVhbG91cy5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJZaWVsZEV4cHJlc3Npb25cIjpcbiAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSBcIlVuYXJ5RXhwcmVzc2lvblwiIHx8IHBhcmVudC50eXBlID09PSBcIkF3YWl0RXhwcmVzc2lvblwiIHx8IHBhcmVudC50eXBlID09PSBcIlRTQXNFeHByZXNzaW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiVFNOb25OdWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgLy8gZWxzZSBmYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFwiQXdhaXRFeHByZXNzaW9uXCI6XG4gICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIlVuYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICAgICAgICBjYXNlIFwiU3ByZWFkUHJvcGVydHlcIjpcbiAgICAgICAgICBjYXNlIFwiVFNBc0V4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiVFNOb25OdWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJCaW5kRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIHJldHVybiBuYW1lID09PSBcIm9iamVjdFwiO1xuXG4gICAgICAgICAgY2FzZSBcIk5ld0V4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IFwiY2FsbGVlXCI7XG5cbiAgICAgICAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LnRlc3QgPT09IG5vZGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJUU0pTRG9jRnVuY3Rpb25UeXBlXCI6XG4gICAgICBjYXNlIFwiVFNDb25kaXRpb25hbFR5cGVcIjpcbiAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSBcIlRTQ29uZGl0aW9uYWxUeXBlXCIgJiYgbm9kZSA9PT0gcGFyZW50LmV4dGVuZHNUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgLy8gZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBcIlRTRnVuY3Rpb25UeXBlXCI6XG4gICAgICBjYXNlIFwiVFNDb25zdHJ1Y3RvclR5cGVcIjpcbiAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSBcIlRTQ29uZGl0aW9uYWxUeXBlXCIgJiYgbm9kZSA9PT0gcGFyZW50LmNoZWNrVHlwZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIC8vIGZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJUU1VuaW9uVHlwZVwiOlxuICAgICAgY2FzZSBcIlRTSW50ZXJzZWN0aW9uVHlwZVwiOlxuICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09IFwiVFNVbmlvblR5cGVcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJUU0ludGVyc2VjdGlvblR5cGVcIikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIC8vIGZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJUU1R5cGVPcGVyYXRvclwiOlxuICAgICAgY2FzZSBcIlRTSW5mZXJUeXBlXCI6XG4gICAgICAgIHJldHVybiBwYXJlbnQudHlwZSA9PT0gXCJUU0FycmF5VHlwZVwiIHx8IHBhcmVudC50eXBlID09PSBcIlRTT3B0aW9uYWxUeXBlXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiVFNSZXN0VHlwZVwiIHx8IHBhcmVudC50eXBlID09PSBcIlRTSW5kZXhlZEFjY2Vzc1R5cGVcIiAmJiBub2RlID09PSBwYXJlbnQub2JqZWN0VHlwZSB8fCBwYXJlbnQudHlwZSA9PT0gXCJUU1R5cGVPcGVyYXRvclwiIHx8IHBhcmVudC50eXBlID09PSBcIlRTVHlwZUFubm90YXRpb25cIiAmJiAvXlRTSlNEb2MvLnRlc3QocGF0aC5nZXRQYXJlbnROb2RlKDEpLnR5cGUpO1xuXG4gICAgICBjYXNlIFwiQXJyYXlUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICByZXR1cm4gcGFyZW50LnR5cGUgPT09IFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiO1xuXG4gICAgICBjYXNlIFwiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb25cIjpcbiAgICAgIGNhc2UgXCJVbmlvblR5cGVBbm5vdGF0aW9uXCI6XG4gICAgICAgIHJldHVybiBwYXJlbnQudHlwZSA9PT0gXCJBcnJheVR5cGVBbm5vdGF0aW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiIHx8IHBhcmVudC50eXBlID09PSBcIkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiVW5pb25UeXBlQW5ub3RhdGlvblwiO1xuXG4gICAgICBjYXNlIFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICByZXR1cm4gcGFyZW50LnR5cGUgPT09IFwiQXJyYXlUeXBlQW5ub3RhdGlvblwiO1xuXG4gICAgICBjYXNlIFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgYW5jZXN0b3IgPSBwYXJlbnQudHlwZSA9PT0gXCJOdWxsYWJsZVR5cGVBbm5vdGF0aW9uXCIgPyBwYXRoLmdldFBhcmVudE5vZGUoMSkgOiBwYXJlbnQ7XG4gICAgICAgICAgcmV0dXJuIGFuY2VzdG9yLnR5cGUgPT09IFwiVW5pb25UeXBlQW5ub3RhdGlvblwiIHx8IGFuY2VzdG9yLnR5cGUgPT09IFwiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb25cIiB8fCBhbmNlc3Rvci50eXBlID09PSBcIkFycmF5VHlwZUFubm90YXRpb25cIiB8fCAvLyBXZSBzaG91bGQgY2hlY2sgYW5jZXN0b3IncyBwYXJlbnQgdG8ga25vdyB3aGV0aGVyIHRoZSBwYXJlbnRoZXNlc1xuICAgICAgICAgIC8vIGFyZSByZWFsbHkgbmVlZGVkLCBidXQgc2luY2UgPz9UIGRvZXNuJ3QgbWFrZSBzZW5zZSB0aGlzIGNoZWNrXG4gICAgICAgICAgLy8gd2lsbCBhbG1vc3QgbmV2ZXIgYmUgdHJ1ZS5cbiAgICAgICAgICBhbmNlc3Rvci50eXBlID09PSBcIk51bGxhYmxlVHlwZUFubm90YXRpb25cIjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiU3RyaW5nTGl0ZXJhbFwiOlxuICAgICAgY2FzZSBcIk51bWVyaWNMaXRlcmFsXCI6XG4gICAgICBjYXNlIFwiTGl0ZXJhbFwiOlxuICAgICAgICBpZiAodHlwZW9mIG5vZGUudmFsdWUgPT09IFwic3RyaW5nXCIgJiYgcGFyZW50LnR5cGUgPT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiICYmICggLy8gVHlwZVNjcmlwdCB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSmFtZXNIZW5yeS90eXBlc2NyaXB0LWVzdHJlZS9pc3N1ZXMvMlxuICAgICAgICAvLyBTZWUgY29ycmVzcG9uZGluZyB3b3JrYXJvdW5kIGluIHByaW50ZXIuanMgY2FzZTogXCJMaXRlcmFsXCJcbiAgICAgICAgb3B0aW9ucy5wYXJzZXIgIT09IFwidHlwZXNjcmlwdFwiICYmICFwYXJlbnQuZGlyZWN0aXZlIHx8IG9wdGlvbnMucGFyc2VyID09PSBcInR5cGVzY3JpcHRcIiAmJiBvcHRpb25zLm9yaWdpbmFsVGV4dC5jaGFyQXQob3B0aW9ucy5sb2NTdGFydChub2RlKSAtIDEpID09PSBcIihcIikpIHtcbiAgICAgICAgICAvLyBUbyBhdm9pZCBiZWNvbWluZyBhIGRpcmVjdGl2ZVxuICAgICAgICAgIGNvbnN0IGdyYW5kUGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKDEpO1xuICAgICAgICAgIHJldHVybiBncmFuZFBhcmVudC50eXBlID09PSBcIlByb2dyYW1cIiB8fCBncmFuZFBhcmVudC50eXBlID09PSBcIkJsb2NrU3RhdGVtZW50XCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyZW50LnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmIHR5cGVvZiBub2RlLnZhbHVlID09PSBcIm51bWJlclwiICYmIG5hbWUgPT09IFwib2JqZWN0XCIgJiYgcGFyZW50Lm9iamVjdCA9PT0gbm9kZTtcblxuICAgICAgY2FzZSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBncmFuZFBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgxKTtcblxuICAgICAgICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiICYmIHBhcmVudC5ib2R5ID09PSBub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC50eXBlID09PSBcIkNsYXNzUHJvcGVydHlcIiAmJiBwYXJlbnQua2V5ID09PSBub2RlICYmIHBhcmVudC5jb21wdXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50LnR5cGUgPT09IFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiICYmIHBhcmVudC5uYW1lID09PSBub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQudHlwZSA9PT0gXCJGb3JTdGF0ZW1lbnRcIiAmJiAocGFyZW50LmluaXQgPT09IG5vZGUgfHwgcGFyZW50LnVwZGF0ZSA9PT0gbm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC50eXBlID09PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubGVmdC50eXBlID09PSBcIk9iamVjdFBhdHRlcm5cIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC50eXBlID09PSBcIlRTUHJvcGVydHlTaWduYXR1cmVcIiAmJiBwYXJlbnQua2V5ID09PSBub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQudHlwZSA9PT0gXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQudHlwZSA9PT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIiAmJiBncmFuZFBhcmVudCAmJiBncmFuZFBhcmVudC50eXBlID09PSBcIkZvclN0YXRlbWVudFwiICYmIChncmFuZFBhcmVudC5pbml0ID09PSBwYXJlbnQgfHwgZ3JhbmRQYXJlbnQudXBkYXRlID09PSBwYXJlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQudHlwZSA9PT0gXCJQcm9wZXJ0eVwiICYmIHBhcmVudC52YWx1ZSA9PT0gbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50LnR5cGUgPT09IFwiTkdDaGFpbmVkRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgICAgICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJVbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiU3ByZWFkRWxlbWVudFwiOlxuICAgICAgICAgIGNhc2UgXCJTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIk5HUGlwZUV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkF3YWl0RXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIjpcbiAgICAgICAgICBjYXNlIFwiVFNUeXBlQXNzZXJ0aW9uXCI6XG4gICAgICAgICAgY2FzZSBcIlR5cGVDYXN0RXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJUU05vbk51bGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgIGNhc2UgXCJOZXdFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkNhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIHJldHVybiBuYW1lID09PSBcImNhbGxlZVwiO1xuXG4gICAgICAgICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IFwidGVzdFwiICYmIHBhcmVudC50ZXN0ID09PSBub2RlO1xuXG4gICAgICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gXCJvYmplY3RcIjtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgICAgICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcIk5ld0V4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgLy8gTm90IGFsd2F5cyBuZWNlc3NhcnksIGJ1dCBpdCdzIGNsZWFyZXIgdG8gdGhlIHJlYWRlciBpZiBJSUZFcyBhcmUgd3JhcHBlZCBpbiBwYXJlbnRoZXNlcy5cbiAgICAgICAgICAgIC8vIElzIG5lY2Vzc2FyeSBpZiBpdCBpcyBgZXhwcmVzc2lvbmAgb2YgYEV4cHJlc3Npb25TdGF0ZW1lbnRgLlxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IFwiY2FsbGVlXCI7XG5cbiAgICAgICAgICBjYXNlIFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAvLyBUaGlzIGlzIGJhc2ljYWxseSBhIGtpbmQgb2YgSUlGRS5cblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiTmV3RXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gXCJjYWxsZWVcIjtcblxuICAgICAgICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IFwib2JqZWN0XCI7XG5cbiAgICAgICAgICBjYXNlIFwiVFNBc0V4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiQmluZEV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIlVuYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJMb2dpY2FsRXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkF3YWl0RXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJUU1R5cGVBc3NlcnRpb25cIjpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IFwidGVzdFwiO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiQ2xhc3NFeHByZXNzaW9uXCI6XG4gICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiTmV3RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IFwiY2FsbGVlXCIgJiYgcGFyZW50LmNhbGxlZSA9PT0gbm9kZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiAmJiBuYW1lID09PSBcIm9iamVjdFwiIHx8IChwYXJlbnQudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiIHx8IHBhcmVudC50eXBlID09PSBcIk5ld0V4cHJlc3Npb25cIikgJiYgbmFtZSA9PT0gXCJjYWxsZWVcIikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIC8vIGZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJUU05vbk51bGxFeHByZXNzaW9uXCI6XG4gICAgICAgIGlmICgocGFyZW50LnR5cGUgPT09IFwiQmluZEV4cHJlc3Npb25cIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIpICYmIG5hbWUgPT09IFwiY2FsbGVlXCIpIHtcbiAgICAgICAgICBsZXQgb2JqZWN0ID0gbm9kZTtcblxuICAgICAgICAgIHdoaWxlIChvYmplY3QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAob2JqZWN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkNhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgY2FzZSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQmluZEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICBvYmplY3QgPSBvYmplY3Qub2JqZWN0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAvLyB0YWdnZWQgdGVtcGxhdGVzIGFyZSBiYXNpY2FsbHkgbWVtYmVyIGV4cHJlc3Npb25zIGZyb20gYSBncmFtbWFyIHBlcnNwZWN0aXZlXG4gICAgICAgICAgICAgIC8vIHNlZSBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3Byb2QtTWVtYmVyRXhwcmVzc2lvblxuXG4gICAgICAgICAgICAgIGNhc2UgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICBvYmplY3QgPSBvYmplY3QudGFnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJUU05vbk51bGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjYXNlIFwiQmluZEV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIChwYXJlbnQudHlwZSA9PT0gXCJCaW5kRXhwcmVzc2lvblwiIHx8IHBhcmVudC50eXBlID09PSBcIk5ld0V4cHJlc3Npb25cIikgJiYgbmFtZSA9PT0gXCJjYWxsZWVcIiB8fCAocGFyZW50LnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiIHx8IHBhcmVudC50eXBlID09PSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiKSAmJiBuYW1lID09PSBcIm9iamVjdFwiO1xuXG4gICAgICBjYXNlIFwiTkdQaXBlRXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09IFwiTkdSb290XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiTkdNaWNyb3N5bnRheEV4cHJlc3Npb25cIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJPYmplY3RQcm9wZXJ0eVwiIHx8IHBhcmVudC50eXBlID09PSBcIkFycmF5RXhwcmVzc2lvblwiIHx8IChwYXJlbnQudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiIHx8IHBhcmVudC50eXBlID09PSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIikgJiYgcGFyZW50LmFyZ3VtZW50c1tuYW1lXSA9PT0gbm9kZSB8fCBwYXJlbnQudHlwZSA9PT0gXCJOR1BpcGVFeHByZXNzaW9uXCIgJiYgbmFtZSA9PT0gXCJyaWdodFwiIHx8IHBhcmVudC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiAmJiBuYW1lID09PSBcInByb3BlcnR5XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiQXNzaWdubWVudEV4cHJlc3Npb25cIikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBjYXNlIFwiSlNYRnJhZ21lbnRcIjpcbiAgICAgIGNhc2UgXCJKU1hFbGVtZW50XCI6XG4gICAgICAgIHJldHVybiBuYW1lID09PSBcImNhbGxlZVwiIHx8IHBhcmVudC50eXBlICE9PSBcIkFycmF5RXhwcmVzc2lvblwiICYmIHBhcmVudC50eXBlICE9PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgJiYgcGFyZW50LnR5cGUgIT09IFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJBc3NpZ25tZW50UGF0dGVyblwiICYmIHBhcmVudC50eXBlICE9PSBcIkJpbmFyeUV4cHJlc3Npb25cIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJDYWxsRXhwcmVzc2lvblwiICYmIHBhcmVudC50eXBlICE9PSBcIk5ld0V4cHJlc3Npb25cIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgJiYgcGFyZW50LnR5cGUgIT09IFwiSnNFeHByZXNzaW9uUm9vdFwiICYmIHBhcmVudC50eXBlICE9PSBcIkpTWEF0dHJpYnV0ZVwiICYmIHBhcmVudC50eXBlICE9PSBcIkpTWEVsZW1lbnRcIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIgJiYgcGFyZW50LnR5cGUgIT09IFwiSlNYRnJhZ21lbnRcIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJMb2dpY2FsRXhwcmVzc2lvblwiICYmIHBhcmVudC50eXBlICE9PSBcIk9iamVjdFByb3BlcnR5XCIgJiYgcGFyZW50LnR5cGUgIT09IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiICYmIHBhcmVudC50eXBlICE9PSBcIlByb3BlcnR5XCIgJiYgcGFyZW50LnR5cGUgIT09IFwiUmV0dXJuU3RhdGVtZW50XCIgJiYgcGFyZW50LnR5cGUgIT09IFwiVGhyb3dTdGF0ZW1lbnRcIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJUeXBlQ2FzdEV4cHJlc3Npb25cIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJWYXJpYWJsZURlY2xhcmF0b3JcIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJZaWVsZEV4cHJlc3Npb25cIjtcblxuICAgICAgY2FzZSBcIlR5cGVBbm5vdGF0aW9uXCI6XG4gICAgICAgIHJldHVybiBuYW1lID09PSBcInJldHVyblR5cGVcIiAmJiBwYXJlbnQudHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiICYmIGluY2x1ZGVzRnVuY3Rpb25UeXBlSW5PYmplY3RUeXBlKG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3RhdGVtZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIkJsb2NrU3RhdGVtZW50XCIgfHwgbm9kZS50eXBlID09PSBcIkJyZWFrU3RhdGVtZW50XCIgfHwgbm9kZS50eXBlID09PSBcIkNsYXNzQm9keVwiIHx8IG5vZGUudHlwZSA9PT0gXCJDbGFzc0RlY2xhcmF0aW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkNsYXNzTWV0aG9kXCIgfHwgbm9kZS50eXBlID09PSBcIkNsYXNzUHJvcGVydHlcIiB8fCBub2RlLnR5cGUgPT09IFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIiB8fCBub2RlLnR5cGUgPT09IFwiQ29udGludWVTdGF0ZW1lbnRcIiB8fCBub2RlLnR5cGUgPT09IFwiRGVidWdnZXJTdGF0ZW1lbnRcIiB8fCBub2RlLnR5cGUgPT09IFwiRGVjbGFyZUNsYXNzXCIgfHwgbm9kZS50eXBlID09PSBcIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb25cIiB8fCBub2RlLnR5cGUgPT09IFwiRGVjbGFyZUZ1bmN0aW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkRlY2xhcmVJbnRlcmZhY2VcIiB8fCBub2RlLnR5cGUgPT09IFwiRGVjbGFyZU1vZHVsZVwiIHx8IG5vZGUudHlwZSA9PT0gXCJEZWNsYXJlTW9kdWxlRXhwb3J0c1wiIHx8IG5vZGUudHlwZSA9PT0gXCJEZWNsYXJlVmFyaWFibGVcIiB8fCBub2RlLnR5cGUgPT09IFwiRG9XaGlsZVN0YXRlbWVudFwiIHx8IG5vZGUudHlwZSA9PT0gXCJFbnVtRGVjbGFyYXRpb25cIiB8fCBub2RlLnR5cGUgPT09IFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIiB8fCBub2RlLnR5cGUgPT09IFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIiB8fCBub2RlLnR5cGUgPT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8IG5vZGUudHlwZSA9PT0gXCJGb3JJblN0YXRlbWVudFwiIHx8IG5vZGUudHlwZSA9PT0gXCJGb3JPZlN0YXRlbWVudFwiIHx8IG5vZGUudHlwZSA9PT0gXCJGb3JTdGF0ZW1lbnRcIiB8fCBub2RlLnR5cGUgPT09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJJZlN0YXRlbWVudFwiIHx8IG5vZGUudHlwZSA9PT0gXCJJbXBvcnREZWNsYXJhdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJMYWJlbGVkU3RhdGVtZW50XCIgfHwgbm9kZS50eXBlID09PSBcIk1ldGhvZERlZmluaXRpb25cIiB8fCBub2RlLnR5cGUgPT09IFwiUmV0dXJuU3RhdGVtZW50XCIgfHwgbm9kZS50eXBlID09PSBcIlN3aXRjaFN0YXRlbWVudFwiIHx8IG5vZGUudHlwZSA9PT0gXCJUaHJvd1N0YXRlbWVudFwiIHx8IG5vZGUudHlwZSA9PT0gXCJUcnlTdGF0ZW1lbnRcIiB8fCBub2RlLnR5cGUgPT09IFwiVFNEZWNsYXJlRnVuY3Rpb25cIiB8fCBub2RlLnR5cGUgPT09IFwiVFNFbnVtRGVjbGFyYXRpb25cIiB8fCBub2RlLnR5cGUgPT09IFwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJUU0ludGVyZmFjZURlY2xhcmF0aW9uXCIgfHwgbm9kZS50eXBlID09PSBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIiB8fCBub2RlLnR5cGUgPT09IFwiVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJUeXBlQWxpYXNcIiB8fCBub2RlLnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJXaGlsZVN0YXRlbWVudFwiIHx8IG5vZGUudHlwZSA9PT0gXCJXaXRoU3RhdGVtZW50XCI7XG4gIH1cblxuICBmdW5jdGlvbiBpbmNsdWRlc0Z1bmN0aW9uVHlwZUluT2JqZWN0VHlwZShub2RlKSB7XG4gICAgcmV0dXJuIGhhc05vZGUkMShub2RlLCBuMSA9PiBuMS50eXBlID09PSBcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCIgJiYgaGFzTm9kZSQxKG4xLCBuMiA9PiBuMi50eXBlID09PSBcIkZ1bmN0aW9uVHlwZUFubm90YXRpb25cIiB8fCB1bmRlZmluZWQpIHx8IHVuZGVmaW5lZCk7XG4gIH1cblxuICBmdW5jdGlvbiBlbmRzV2l0aFJpZ2h0QnJhY2tldChub2RlKSB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJPYmplY3RFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNGb2xsb3dlZEJ5UmlnaHRCcmFja2V0KHBhdGgpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuICAgIGNvbnN0IG5hbWUgPSBwYXRoLmdldE5hbWUoKTtcblxuICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgXCJOR1BpcGVFeHByZXNzaW9uXCI6XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJudW1iZXJcIiAmJiBwYXJlbnQuYXJndW1lbnRzW25hbWVdID09PSBub2RlICYmIHBhcmVudC5hcmd1bWVudHMubGVuZ3RoIC0gMSA9PT0gbmFtZSkge1xuICAgICAgICAgIHJldHVybiBwYXRoLmNhbGxQYXJlbnQoaXNGb2xsb3dlZEJ5UmlnaHRCcmFja2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiT2JqZWN0UHJvcGVydHlcIjpcbiAgICAgICAgaWYgKG5hbWUgPT09IFwidmFsdWVcIikge1xuICAgICAgICAgIGNvbnN0IHBhcmVudFBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgxKTtcbiAgICAgICAgICByZXR1cm4gcGFyZW50UGFyZW50LnByb3BlcnRpZXNbcGFyZW50UGFyZW50LnByb3BlcnRpZXMubGVuZ3RoIC0gMV0gPT09IHBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiQmluYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgIGlmIChuYW1lID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICByZXR1cm4gcGF0aC5jYWxsUGFyZW50KGlzRm9sbG93ZWRCeVJpZ2h0QnJhY2tldCk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAobmFtZSA9PT0gXCJhbHRlcm5hdGVcIikge1xuICAgICAgICAgIHJldHVybiBwYXRoLmNhbGxQYXJlbnQoaXNGb2xsb3dlZEJ5UmlnaHRCcmFja2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgIGlmIChwYXJlbnQucHJlZml4KSB7XG4gICAgICAgICAgcmV0dXJuIHBhdGguY2FsbFBhcmVudChpc0ZvbGxvd2VkQnlSaWdodEJyYWNrZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkV3JhcEZ1bmN0aW9uRm9yRXhwb3J0RGVmYXVsdChwYXRoLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcblxuICAgIGlmIChub2RlLnR5cGUgPT09IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkNsYXNzRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gcGFyZW50LnR5cGUgPT09IFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIgfHwgLy8gaW4gc29tZSBjYXNlcyB0aGUgZnVuY3Rpb24gaXMgYWxyZWFkeSB3cmFwcGVkXG4gICAgICAvLyAoZS5nLiBgZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uKCkge30pKCk7YClcbiAgICAgIC8vIGluIHRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIGFkZCBleHRyYSBwYXJlbnNcbiAgICAgICFuZWVkc1BhcmVucyhwYXRoLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc05ha2VkTGVmdFNpZGUkMShub2RlKSB8fCBwYXJlbnQudHlwZSAhPT0gXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIiAmJiBuZWVkc1BhcmVucyhwYXRoLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoLmNhbGwoY2hpbGRQYXRoID0+IHNob3VsZFdyYXBGdW5jdGlvbkZvckV4cG9ydERlZmF1bHQoY2hpbGRQYXRoLCBvcHRpb25zKSwgLi4uZ2V0TGVmdFNpZGVQYXRoTmFtZSQxKHBhdGgsIG5vZGUpKTtcbiAgfVxuXG4gIHZhciBuZWVkc1BhcmVuc18xID0gbmVlZHNQYXJlbnM7XG5cbiAgY29uc3Qge1xuICAgIGJ1aWxkZXJzOiB7XG4gICAgICBjb25jYXQ6IGNvbmNhdCRjLFxuICAgICAgam9pbjogam9pbiQ4LFxuICAgICAgbGluZTogbGluZSQ4XG4gICAgfVxuICB9ID0gZG9jdW1lbnQ7XG5cbiAgZnVuY3Rpb24gcHJpbnRIdG1sQmluZGluZyhwYXRoLCBvcHRpb25zLCBwcmludCkge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG5cbiAgICBpZiAob3B0aW9ucy5fX29uSHRtbEJpbmRpbmdSb290ICYmIHBhdGguZ2V0TmFtZSgpID09PSBudWxsKSB7XG4gICAgICBvcHRpb25zLl9fb25IdG1sQmluZGluZ1Jvb3Qobm9kZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSAhPT0gXCJGaWxlXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5fX2lzVnVlRm9yQmluZGluZ0xlZnQpIHtcbiAgICAgIHJldHVybiBwYXRoLmNhbGwoZnVuY3Rpb25EZWNsYXJhdGlvblBhdGggPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcGFyYW1zXG4gICAgICAgIH0gPSBmdW5jdGlvbkRlY2xhcmF0aW9uUGF0aC5nZXRWYWx1ZSgpO1xuICAgICAgICByZXR1cm4gY29uY2F0JGMoW3BhcmFtcy5sZW5ndGggPiAxID8gXCIoXCIgOiBcIlwiLCBqb2luJDgoY29uY2F0JGMoW1wiLFwiLCBsaW5lJDhdKSwgZnVuY3Rpb25EZWNsYXJhdGlvblBhdGgubWFwKHByaW50LCBcInBhcmFtc1wiKSksIHBhcmFtcy5sZW5ndGggPiAxID8gXCIpXCIgOiBcIlwiXSk7XG4gICAgICB9LCBcInByb2dyYW1cIiwgXCJib2R5XCIsIDApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLl9faXNWdWVTbG90U2NvcGUpIHtcbiAgICAgIHJldHVybiBwYXRoLmNhbGwoZnVuY3Rpb25EZWNsYXJhdGlvblBhdGggPT4gam9pbiQ4KGNvbmNhdCRjKFtcIixcIiwgbGluZSQ4XSksIGZ1bmN0aW9uRGVjbGFyYXRpb25QYXRoLm1hcChwcmludCwgXCJwYXJhbXNcIikpLCBcInByb2dyYW1cIiwgXCJib2R5XCIsIDApO1xuICAgIH1cbiAgfSAvLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vcHJldHRpZXIvcHJldHRpZXIvYmxvYi9tYXN0ZXIvc3JjL2xhbmd1YWdlLWh0bWwvc3ludGF4LXZ1ZS5qcyBpc1Z1ZUV2ZW50QmluZGluZ0V4cHJlc3Npb24oKVxuXG5cbiAgZnVuY3Rpb24gaXNWdWVFdmVudEJpbmRpbmdFeHByZXNzaW9uJDIobm9kZSkge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICBzd2l0Y2ggKG5vZGUucHJvcGVydHkudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgICAgICAgY2FzZSBcIk51bWVyaWNMaXRlcmFsXCI6XG4gICAgICAgICAgY2FzZSBcIlN0cmluZ0xpdGVyYWxcIjpcbiAgICAgICAgICAgIHJldHVybiBpc1Z1ZUV2ZW50QmluZGluZ0V4cHJlc3Npb24kMihub2RlLm9iamVjdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdmFyIGh0bWxCaW5kaW5nID0ge1xuICAgIGlzVnVlRXZlbnRCaW5kaW5nRXhwcmVzc2lvbjogaXNWdWVFdmVudEJpbmRpbmdFeHByZXNzaW9uJDIsXG4gICAgcHJpbnRIdG1sQmluZGluZ1xuICB9O1xuXG4gIGZ1bmN0aW9uIHByZXByb2Nlc3MkMShhc3QsIG9wdGlvbnMpIHtcbiAgICBzd2l0Y2ggKG9wdGlvbnMucGFyc2VyKSB7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgY2FzZSBcImpzb241XCI6XG4gICAgICBjYXNlIFwianNvbi1zdHJpbmdpZnlcIjpcbiAgICAgIGNhc2UgXCJfX2pzX2V4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJfX3Z1ZV9leHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBhc3QsIHtcbiAgICAgICAgICB0eXBlOiBvcHRpb25zLnBhcnNlci5zdGFydHNXaXRoKFwiX19cIikgPyBcIkpzRXhwcmVzc2lvblJvb3RcIiA6IFwiSnNvblJvb3RcIixcbiAgICAgICAgICBub2RlOiBhc3QsXG4gICAgICAgICAgY29tbWVudHM6IFtdLFxuICAgICAgICAgIHJvb3RNYXJrZXI6IG9wdGlvbnMucm9vdE1hcmtlclxuICAgICAgICB9KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGFzdDtcbiAgICB9XG4gIH1cblxuICB2YXIgcHJlcHJvY2Vzc18xJDEgPSBwcmVwcm9jZXNzJDE7XG5cbiAgY29uc3Qge1xuICAgIHNob3VsZEZsYXR0ZW46IHNob3VsZEZsYXR0ZW4kMSxcbiAgICBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyOiBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyJDEsXG4gICAgaGFzTmV3bGluZTogaGFzTmV3bGluZSQ1LFxuICAgIGhhc05ld2xpbmVJblJhbmdlOiBoYXNOZXdsaW5lSW5SYW5nZSQzLFxuICAgIGdldExhc3Q6IGdldExhc3QkMyxcbiAgICBnZXRTdHJpbmdXaWR0aDogZ2V0U3RyaW5nV2lkdGgkMyxcbiAgICBwcmludFN0cmluZzogcHJpbnRTdHJpbmckMixcbiAgICBwcmludE51bWJlcjogcHJpbnROdW1iZXIkMixcbiAgICBoYXNJZ25vcmVDb21tZW50OiBoYXNJZ25vcmVDb21tZW50JDQsXG4gICAgaGFzTm9kZUlnbm9yZUNvbW1lbnQ6IGhhc05vZGVJZ25vcmVDb21tZW50JDIsXG4gICAgZ2V0UGVudWx0aW1hdGU6IGdldFBlbnVsdGltYXRlJDEsXG4gICAgc3RhcnRzV2l0aE5vTG9va2FoZWFkVG9rZW46IHN0YXJ0c1dpdGhOb0xvb2thaGVhZFRva2VuJDEsXG4gICAgZ2V0SW5kZW50U2l6ZTogZ2V0SW5kZW50U2l6ZSQyLFxuICAgIGdldFByZWZlcnJlZFF1b3RlOiBnZXRQcmVmZXJyZWRRdW90ZSQxXG4gIH0gPSB1dGlsJDE7XG4gIGNvbnN0IHtcbiAgICBpc05leHRMaW5lRW1wdHk6IGlzTmV4dExpbmVFbXB0eSQ0LFxuICAgIGlzTmV4dExpbmVFbXB0eUFmdGVySW5kZXg6IGlzTmV4dExpbmVFbXB0eUFmdGVySW5kZXgkMixcbiAgICBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXg6IGdldE5leHROb25TcGFjZU5vbkNvbW1lbnRDaGFyYWN0ZXJJbmRleCQzXG4gIH0gPSB1dGlsU2hhcmVkO1xuICBjb25zdCB7XG4gICAgaW5zZXJ0UHJhZ21hOiBpbnNlcnRQcmFnbWEkN1xuICB9ID0gcHJhZ21hO1xuICBjb25zdCB7XG4gICAgcHJpbnRIdG1sQmluZGluZzogcHJpbnRIdG1sQmluZGluZyQxLFxuICAgIGlzVnVlRXZlbnRCaW5kaW5nRXhwcmVzc2lvbjogaXNWdWVFdmVudEJpbmRpbmdFeHByZXNzaW9uJDNcbiAgfSA9IGh0bWxCaW5kaW5nO1xuICBjb25zdCB7XG4gICAgY2xhc3NDaGlsZE5lZWRzQVNJUHJvdGVjdGlvbjogY2xhc3NDaGlsZE5lZWRzQVNJUHJvdGVjdGlvbiQxLFxuICAgIGNsYXNzUHJvcE1heUNhdXNlQVNJUHJvYmxlbXM6IGNsYXNzUHJvcE1heUNhdXNlQVNJUHJvYmxlbXMkMSxcbiAgICBjb25kaXRpb25hbEV4cHJlc3Npb25DaGFpbkNvbnRhaW5zSlNYOiBjb25kaXRpb25hbEV4cHJlc3Npb25DaGFpbkNvbnRhaW5zSlNYJDEsXG4gICAgZ2V0Rmxvd1ZhcmlhbmNlOiBnZXRGbG93VmFyaWFuY2UkMSxcbiAgICBnZXRMZWZ0U2lkZVBhdGhOYW1lOiBnZXRMZWZ0U2lkZVBhdGhOYW1lJDIsXG4gICAgZ2V0UGFyZW50RXhwb3J0RGVjbGFyYXRpb246IGdldFBhcmVudEV4cG9ydERlY2xhcmF0aW9uJDEsXG4gICAgZ2V0VHlwZVNjcmlwdE1hcHBlZFR5cGVNb2RpZmllcjogZ2V0VHlwZVNjcmlwdE1hcHBlZFR5cGVNb2RpZmllciQxLFxuICAgIGhhc0RhbmdsaW5nQ29tbWVudHM6IGhhc0RhbmdsaW5nQ29tbWVudHMkMSxcbiAgICBoYXNGbG93QW5ub3RhdGlvbkNvbW1lbnQ6IGhhc0Zsb3dBbm5vdGF0aW9uQ29tbWVudCQxLFxuICAgIGhhc0Zsb3dTaG9ydGhhbmRBbm5vdGF0aW9uQ29tbWVudDogaGFzRmxvd1Nob3J0aGFuZEFubm90YXRpb25Db21tZW50JDIsXG4gICAgaGFzTGVhZGluZ0NvbW1lbnQ6IGhhc0xlYWRpbmdDb21tZW50JDMsXG4gICAgaGFzTGVhZGluZ093bkxpbmVDb21tZW50OiBoYXNMZWFkaW5nT3duTGluZUNvbW1lbnQkMSxcbiAgICBoYXNOYWtlZExlZnRTaWRlOiBoYXNOYWtlZExlZnRTaWRlJDIsXG4gICAgaGFzTmV3bGluZUJldHdlZW5PckFmdGVyRGVjb3JhdG9yczogaGFzTmV3bGluZUJldHdlZW5PckFmdGVyRGVjb3JhdG9ycyQxLFxuICAgIGhhc05nU2lkZUVmZmVjdDogaGFzTmdTaWRlRWZmZWN0JDEsXG4gICAgaGFzUHJldHRpZXJJZ25vcmU6IGhhc1ByZXR0aWVySWdub3JlJDUsXG4gICAgaGFzVHJhaWxpbmdDb21tZW50OiBoYXNUcmFpbGluZ0NvbW1lbnQkMSxcbiAgICBpZGVudGl0eTogaWRlbnRpdHkkMixcbiAgICBpc0JpbmFyeWlzaDogaXNCaW5hcnlpc2gkMSxcbiAgICBpc0NhbGxPck9wdGlvbmFsQ2FsbEV4cHJlc3Npb246IGlzQ2FsbE9yT3B0aW9uYWxDYWxsRXhwcmVzc2lvbiQxLFxuICAgIGlzRW1wdHlKU1hFbGVtZW50OiBpc0VtcHR5SlNYRWxlbWVudCQxLFxuICAgIGlzRXhwb3J0RGVjbGFyYXRpb246IGlzRXhwb3J0RGVjbGFyYXRpb24kMSxcbiAgICBpc0Zsb3dBbm5vdGF0aW9uQ29tbWVudDogaXNGbG93QW5ub3RhdGlvbkNvbW1lbnQkMSxcbiAgICBpc0Z1bmN0aW9uQ29tcG9zaXRpb25BcmdzOiBpc0Z1bmN0aW9uQ29tcG9zaXRpb25BcmdzJDEsXG4gICAgaXNGdW5jdGlvbk5vdGF0aW9uOiBpc0Z1bmN0aW9uTm90YXRpb24kMSxcbiAgICBpc0Z1bmN0aW9uT3JBcnJvd0V4cHJlc3Npb246IGlzRnVuY3Rpb25PckFycm93RXhwcmVzc2lvbiQxLFxuICAgIGlzR2V0dGVyT3JTZXR0ZXI6IGlzR2V0dGVyT3JTZXR0ZXIkMSxcbiAgICBpc0plc3RFYWNoVGVtcGxhdGVMaXRlcmFsOiBpc0plc3RFYWNoVGVtcGxhdGVMaXRlcmFsJDEsXG4gICAgaXNKU1hOb2RlOiBpc0pTWE5vZGUkMSxcbiAgICBpc0pTWFdoaXRlc3BhY2VFeHByZXNzaW9uOiBpc0pTWFdoaXRlc3BhY2VFeHByZXNzaW9uJDEsXG4gICAgaXNMYXN0U3RhdGVtZW50OiBpc0xhc3RTdGF0ZW1lbnQkMSxcbiAgICBpc0xpdGVyYWw6IGlzTGl0ZXJhbCQxLFxuICAgIGlzTG9uZ0N1cnJpZWRDYWxsRXhwcmVzc2lvbjogaXNMb25nQ3VycmllZENhbGxFeHByZXNzaW9uJDEsXG4gICAgaXNNZWFuaW5nZnVsSlNYVGV4dDogaXNNZWFuaW5nZnVsSlNYVGV4dCQxLFxuICAgIGlzTWVtYmVyRXhwcmVzc2lvbkNoYWluOiBpc01lbWJlckV4cHJlc3Npb25DaGFpbiQxLFxuICAgIGlzTWVtYmVyaXNoOiBpc01lbWJlcmlzaCQxLFxuICAgIGlzTmdGb3JPZjogaXNOZ0Zvck9mJDEsXG4gICAgaXNOdW1lcmljTGl0ZXJhbDogaXNOdW1lcmljTGl0ZXJhbCQxLFxuICAgIGlzT2JqZWN0VHlwZTogaXNPYmplY3RUeXBlJDEsXG4gICAgaXNPYmplY3RUeXBlUHJvcGVydHlBRnVuY3Rpb246IGlzT2JqZWN0VHlwZVByb3BlcnR5QUZ1bmN0aW9uJDEsXG4gICAgaXNTaW1wbGVDYWxsQXJndW1lbnQ6IGlzU2ltcGxlQ2FsbEFyZ3VtZW50JDEsXG4gICAgaXNTaW1wbGVGbG93VHlwZTogaXNTaW1wbGVGbG93VHlwZSQxLFxuICAgIGlzU2ltcGxlVGVtcGxhdGVMaXRlcmFsOiBpc1NpbXBsZVRlbXBsYXRlTGl0ZXJhbCQxLFxuICAgIGlzU3RyaW5nTGl0ZXJhbDogaXNTdHJpbmdMaXRlcmFsJDEsXG4gICAgaXNTdHJpbmdQcm9wU2FmZVRvQ29lcmNlVG9JZGVudGlmaWVyOiBpc1N0cmluZ1Byb3BTYWZlVG9Db2VyY2VUb0lkZW50aWZpZXIkMSxcbiAgICBpc1RlbXBsYXRlT25JdHNPd25MaW5lOiBpc1RlbXBsYXRlT25JdHNPd25MaW5lJDEsXG4gICAgaXNUZXN0Q2FsbDogaXNUZXN0Q2FsbCQxLFxuICAgIGlzVGhlT25seUpTWEVsZW1lbnRJbk1hcmtkb3duOiBpc1RoZU9ubHlKU1hFbGVtZW50SW5NYXJrZG93biQxLFxuICAgIGlzVFNYRmlsZTogaXNUU1hGaWxlJDEsXG4gICAgaXNUeXBlQW5ub3RhdGlvbkFGdW5jdGlvbjogaXNUeXBlQW5ub3RhdGlvbkFGdW5jdGlvbiQxLFxuICAgIG1hdGNoSnN4V2hpdGVzcGFjZVJlZ2V4OiBtYXRjaEpzeFdoaXRlc3BhY2VSZWdleCQxLFxuICAgIG5lZWRzSGFyZGxpbmVBZnRlckRhbmdsaW5nQ29tbWVudDogbmVlZHNIYXJkbGluZUFmdGVyRGFuZ2xpbmdDb21tZW50JDEsXG4gICAgcmF3VGV4dDogcmF3VGV4dCQxLFxuICAgIHJldHVybkFyZ3VtZW50SGFzTGVhZGluZ0NvbW1lbnQ6IHJldHVybkFyZ3VtZW50SGFzTGVhZGluZ0NvbW1lbnQkMVxuICB9ID0gdXRpbHMkNTtcbiAgY29uc3QgbmVlZHNRdW90ZVByb3BzID0gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3Qge1xuICAgIGJ1aWxkZXJzOiB7XG4gICAgICBjb25jYXQ6IGNvbmNhdCRkLFxuICAgICAgam9pbjogam9pbiQ5LFxuICAgICAgbGluZTogbGluZSQ5LFxuICAgICAgaGFyZGxpbmU6IGhhcmRsaW5lJDksXG4gICAgICBzb2Z0bGluZTogc29mdGxpbmUkNixcbiAgICAgIGxpdGVyYWxsaW5lOiBsaXRlcmFsbGluZSQ0LFxuICAgICAgZ3JvdXA6IGdyb3VwJGIsXG4gICAgICBpbmRlbnQ6IGluZGVudCQ3LFxuICAgICAgYWxpZ246IGFsaWduJDEsXG4gICAgICBjb25kaXRpb25hbEdyb3VwOiBjb25kaXRpb25hbEdyb3VwJDEsXG4gICAgICBmaWxsOiBmaWxsJDQsXG4gICAgICBpZkJyZWFrOiBpZkJyZWFrJDYsXG4gICAgICBicmVha1BhcmVudDogYnJlYWtQYXJlbnQkMyxcbiAgICAgIGxpbmVTdWZmaXhCb3VuZGFyeTogbGluZVN1ZmZpeEJvdW5kYXJ5JDEsXG4gICAgICBhZGRBbGlnbm1lbnRUb0RvYzogYWRkQWxpZ25tZW50VG9Eb2MkMixcbiAgICAgIGRlZGVudDogZGVkZW50JDJcbiAgICB9LFxuICAgIHV0aWxzOiB7XG4gICAgICB3aWxsQnJlYWs6IHdpbGxCcmVhayQxLFxuICAgICAgaXNMaW5lTmV4dDogaXNMaW5lTmV4dCQxLFxuICAgICAgaXNFbXB0eTogaXNFbXB0eSQxLFxuICAgICAgcmVtb3ZlTGluZXM6IHJlbW92ZUxpbmVzJDJcbiAgICB9LFxuICAgIHByaW50ZXI6IHtcbiAgICAgIHByaW50RG9jVG9TdHJpbmc6IHByaW50RG9jVG9TdHJpbmckMlxuICAgIH1cbiAgfSA9IGRvY3VtZW50O1xuICBsZXQgdWlkID0gMDtcblxuICBmdW5jdGlvbiBzaG91bGRQcmludENvbW1hJDEob3B0aW9ucywgbGV2ZWwpIHtcbiAgICBsZXZlbCA9IGxldmVsIHx8IFwiZXM1XCI7XG5cbiAgICBzd2l0Y2ggKG9wdGlvbnMudHJhaWxpbmdDb21tYSkge1xuICAgICAgY2FzZSBcImFsbFwiOlxuICAgICAgICBpZiAobGV2ZWwgPT09IFwiYWxsXCIpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAvLyBmYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFwiZXM1XCI6XG4gICAgICAgIGlmIChsZXZlbCA9PT0gXCJlczVcIikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIC8vIGZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJub25lXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2VuZXJpY1ByaW50JDMocGF0aCwgb3B0aW9ucywgcHJpbnRQYXRoLCBhcmdzKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICBsZXQgbmVlZHNQYXJlbnMgPSBmYWxzZTtcbiAgICBjb25zdCBsaW5lc1dpdGhvdXRQYXJlbnMgPSBwcmludFBhdGhOb1BhcmVucyhwYXRoLCBvcHRpb25zLCBwcmludFBhdGgsIGFyZ3MpO1xuXG4gICAgaWYgKCFub2RlIHx8IGlzRW1wdHkkMShsaW5lc1dpdGhvdXRQYXJlbnMpKSB7XG4gICAgICByZXR1cm4gbGluZXNXaXRob3V0UGFyZW5zO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEV4cG9ydERlY2wgPSBnZXRQYXJlbnRFeHBvcnREZWNsYXJhdGlvbiQxKHBhdGgpO1xuICAgIGNvbnN0IGRlY29yYXRvcnMgPSBbXTtcblxuICAgIGlmIChub2RlLnR5cGUgPT09IFwiQ2xhc3NNZXRob2RcIiB8fCBub2RlLnR5cGUgPT09IFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIgfHwgbm9kZS50eXBlID09PSBcIkNsYXNzUHJvcGVydHlcIiB8fCBub2RlLnR5cGUgPT09IFwiVFNBYnN0cmFjdENsYXNzUHJvcGVydHlcIiB8fCBub2RlLnR5cGUgPT09IFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIiB8fCBub2RlLnR5cGUgPT09IFwiTWV0aG9kRGVmaW5pdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJUU0Fic3RyYWN0TWV0aG9kRGVmaW5pdGlvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJUU0RlY2xhcmVNZXRob2RcIikgOyBlbHNlIGlmIChub2RlLmRlY29yYXRvcnMgJiYgbm9kZS5kZWNvcmF0b3JzLmxlbmd0aCA+IDAgJiYgLy8gSWYgdGhlIHBhcmVudCBub2RlIGlzIGFuIGV4cG9ydCBkZWNsYXJhdGlvbiBhbmQgdGhlIGRlY29yYXRvclxuICAgIC8vIHdhcyB3cml0dGVuIGJlZm9yZSB0aGUgZXhwb3J0LCB0aGUgZXhwb3J0IHdpbGwgYmUgcmVzcG9uc2libGVcbiAgICAvLyBmb3IgcHJpbnRpbmcgdGhlIGRlY29yYXRvcnMuXG4gICAgIShwYXJlbnRFeHBvcnREZWNsICYmIG9wdGlvbnMubG9jU3RhcnQocGFyZW50RXhwb3J0RGVjbCwge1xuICAgICAgaWdub3JlRGVjb3JhdG9yczogdHJ1ZVxuICAgIH0pID4gb3B0aW9ucy5sb2NTdGFydChub2RlLmRlY29yYXRvcnNbMF0pKSkge1xuICAgICAgY29uc3Qgc2hvdWxkQnJlYWsgPSBub2RlLnR5cGUgPT09IFwiQ2xhc3NFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkNsYXNzRGVjbGFyYXRpb25cIiB8fCBoYXNOZXdsaW5lQmV0d2Vlbk9yQWZ0ZXJEZWNvcmF0b3JzJDEobm9kZSwgb3B0aW9ucyk7XG4gICAgICBjb25zdCBzZXBhcmF0b3IgPSBzaG91bGRCcmVhayA/IGhhcmRsaW5lJDkgOiBsaW5lJDk7XG4gICAgICBwYXRoLmVhY2goZGVjb3JhdG9yUGF0aCA9PiB7XG4gICAgICAgIGxldCBkZWNvcmF0b3IgPSBkZWNvcmF0b3JQYXRoLmdldFZhbHVlKCk7XG5cbiAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uKSB7XG4gICAgICAgICAgZGVjb3JhdG9yID0gZGVjb3JhdG9yLmV4cHJlc3Npb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVjb3JhdG9yID0gZGVjb3JhdG9yLmNhbGxlZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29yYXRvcnMucHVzaChwcmludFBhdGgoZGVjb3JhdG9yUGF0aCksIHNlcGFyYXRvcik7XG4gICAgICB9LCBcImRlY29yYXRvcnNcIik7XG5cbiAgICAgIGlmIChwYXJlbnRFeHBvcnREZWNsKSB7XG4gICAgICAgIGRlY29yYXRvcnMudW5zaGlmdChoYXJkbGluZSQ5KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzRXhwb3J0RGVjbGFyYXRpb24kMShub2RlKSAmJiBub2RlLmRlY2xhcmF0aW9uICYmIG5vZGUuZGVjbGFyYXRpb24uZGVjb3JhdG9ycyAmJiBub2RlLmRlY2xhcmF0aW9uLmRlY29yYXRvcnMubGVuZ3RoID4gMCAmJiAvLyBPbmx5IHByaW50IGRlY29yYXRvcnMgaGVyZSBpZiB0aGV5IHdlcmUgd3JpdHRlbiBiZWZvcmUgdGhlIGV4cG9ydCxcbiAgICAvLyBvdGhlcndpc2UgdGhleSBhcmUgcHJpbnRlZCBieSB0aGUgbm9kZS5kZWNsYXJhdGlvblxuICAgIG9wdGlvbnMubG9jU3RhcnQobm9kZSwge1xuICAgICAgaWdub3JlRGVjb3JhdG9yczogdHJ1ZVxuICAgIH0pID4gb3B0aW9ucy5sb2NTdGFydChub2RlLmRlY2xhcmF0aW9uLmRlY29yYXRvcnNbMF0pKSB7XG4gICAgICAvLyBFeHBvcnQgZGVjbGFyYXRpb25zIGFyZSByZXNwb25zaWJsZSBmb3IgcHJpbnRpbmcgYW55IGRlY29yYXRvcnNcbiAgICAgIC8vIHRoYXQgbG9naWNhbGx5IGFwcGx5IHRvIG5vZGUuZGVjbGFyYXRpb24uXG4gICAgICBwYXRoLmVhY2goZGVjb3JhdG9yUGF0aCA9PiB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvciA9IGRlY29yYXRvclBhdGguZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gZGVjb3JhdG9yLnR5cGUgPT09IFwiRGVjb3JhdG9yXCIgPyBcIlwiIDogXCJAXCI7XG4gICAgICAgIGRlY29yYXRvcnMucHVzaChwcmVmaXgsIHByaW50UGF0aChkZWNvcmF0b3JQYXRoKSwgaGFyZGxpbmUkOSk7XG4gICAgICB9LCBcImRlY2xhcmF0aW9uXCIsIFwiZGVjb3JhdG9yc1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm9kZXMgd2l0aCBkZWNvcmF0b3JzIGNhbid0IGhhdmUgcGFyZW50aGVzZXMsIHNvIHdlIGNhbiBhdm9pZFxuICAgICAgLy8gY29tcHV0aW5nIHBhdGhOZWVkc1BhcmVucygpIGV4Y2VwdCBpbiB0aGlzIGNhc2UuXG4gICAgICBuZWVkc1BhcmVucyA9IG5lZWRzUGFyZW5zXzEocGF0aCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBbXTtcblxuICAgIGlmIChuZWVkc1BhcmVucykge1xuICAgICAgcGFydHMudW5zaGlmdChcIihcIik7XG4gICAgfVxuXG4gICAgcGFydHMucHVzaChsaW5lc1dpdGhvdXRQYXJlbnMpO1xuXG4gICAgaWYgKG5lZWRzUGFyZW5zKSB7XG4gICAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuXG4gICAgICBpZiAoaGFzRmxvd1Nob3J0aGFuZEFubm90YXRpb25Db21tZW50JDIobm9kZSkpIHtcbiAgICAgICAgcGFydHMucHVzaChcIiAvKlwiKTtcbiAgICAgICAgcGFydHMucHVzaChub2RlLnRyYWlsaW5nQ29tbWVudHNbMF0udmFsdWUudHJpbVN0YXJ0KCkpO1xuICAgICAgICBwYXJ0cy5wdXNoKFwiKi9cIik7XG4gICAgICAgIG5vZGUudHJhaWxpbmdDb21tZW50c1swXS5wcmludGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcGFydHMucHVzaChcIilcIik7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoZGVjb3JhdG9ycy5jb25jYXQocGFydHMpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50RGVjb3JhdG9ycyhwYXRoLCBvcHRpb25zLCBwcmludCkge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW2pvaW4kOShsaW5lJDksIHBhdGgubWFwKHByaW50LCBcImRlY29yYXRvcnNcIikpLCBoYXNOZXdsaW5lQmV0d2Vlbk9yQWZ0ZXJEZWNvcmF0b3JzJDEobm9kZSwgb3B0aW9ucykgPyBoYXJkbGluZSQ5IDogbGluZSQ5XSkpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZm9sbG93aW5nIGlzIHRoZSBzaGFyZWQgbG9naWMgZm9yXG4gICAqIHRlcm5hcnkgb3BlcmF0b3JzLCBuYW1lbHkgQ29uZGl0aW9uYWxFeHByZXNzaW9uXG4gICAqIGFuZCBUU0NvbmRpdGlvbmFsVHlwZVxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPcGVyYXRvck9wdGlvbnNcbiAgICogQHByb3BlcnR5IHsoKSA9PiBBcnJheTxzdHJpbmcgfCBEb2M+fSBiZWZvcmVQYXJ0cyAtIFBhcnRzIHRvIHByaW50IGJlZm9yZSB0aGUgYD9gLlxuICAgKiBAcHJvcGVydHkgeyhicmVha0Nsb3NpbmdQYXJlbjogYm9vbGVhbikgPT4gQXJyYXk8c3RyaW5nIHwgRG9jPn0gYWZ0ZXJQYXJ0cyAtIFBhcnRzIHRvIHByaW50IGFmdGVyIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uLlxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3VsZENoZWNrSnN4IC0gV2hldGhlciB0byBjaGVjayBmb3IgYW5kIHByaW50IGluIEpTWCBtb2RlLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29uZGl0aW9uYWxOb2RlVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uIG5vZGUsIGllIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIgb3IgXCJUU0NvbmRpdGlvbmFsVHlwZVwiLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29uc2VxdWVudE5vZGVQcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgYXQgd2hpY2ggdGhlIGNvbnNlcXVlbnQgbm9kZSBjYW4gYmUgZm91bmQgb24gdGhlIG1haW4gbm9kZSwgZWcgXCJjb25zZXF1ZW50XCIuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhbHRlcm5hdGVOb2RlUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IGF0IHdoaWNoIHRoZSBhbHRlcm5hdGUgbm9kZSBjYW4gYmUgZm91bmQgb24gdGhlIG1haW4gbm9kZSwgZWcgXCJhbHRlcm5hdGVcIi5cbiAgICogQHByb3BlcnR5IHtzdHJpbmdbXX0gdGVzdE5vZGVQcm9wZXJ0eU5hbWVzIC0gVGhlIHByb3BlcnRpZXMgYXQgd2hpY2ggdGhlIHRlc3Qgbm9kZXMgY2FuIGJlIGZvdW5kIG9uIHRoZSBtYWluIG5vZGUsIGVnIFwidGVzdFwiLlxuICAgKiBAcGFyYW0ge0Zhc3RQYXRofSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIENvbmRpdGlvbmFsRXhwcmVzc2lvbi9UU0NvbmRpdGlvbmFsVHlwZSBub2RlLlxuICAgKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnMgLSBQcmV0dGllciBvcHRpb25zXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByaW50IC0gUHJpbnQgZnVuY3Rpb24gdG8gY2FsbCByZWN1cnNpdmVseVxuICAgKiBAcGFyYW0ge09wZXJhdG9yT3B0aW9uc30gb3BlcmF0b3JPcHRpb25zXG4gICAqIEByZXR1cm5zIERvY1xuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHByaW50VGVybmFyeU9wZXJhdG9yKHBhdGgsIG9wdGlvbnMsIHByaW50LCBvcGVyYXRvck9wdGlvbnMpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IGNvbnNlcXVlbnROb2RlID0gbm9kZVtvcGVyYXRvck9wdGlvbnMuY29uc2VxdWVudE5vZGVQcm9wZXJ0eU5hbWVdO1xuICAgIGNvbnN0IGFsdGVybmF0ZU5vZGUgPSBub2RlW29wZXJhdG9yT3B0aW9ucy5hbHRlcm5hdGVOb2RlUHJvcGVydHlOYW1lXTtcbiAgICBjb25zdCBwYXJ0cyA9IFtdOyAvLyBXZSBwcmludCBhIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBpbiBlaXRoZXIgXCJKU1ggbW9kZVwiIG9yIFwibm9ybWFsIG1vZGVcIi5cbiAgICAvLyBTZWUgdGVzdHMvanN4L2NvbmRpdGlvbmFsLWV4cHJlc3Npb24uanMgZm9yIG1vcmUgaW5mby5cblxuICAgIGxldCBqc3hNb2RlID0gZmFsc2U7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgY29uc3QgaXNQYXJlbnRUZXN0ID0gcGFyZW50LnR5cGUgPT09IG9wZXJhdG9yT3B0aW9ucy5jb25kaXRpb25hbE5vZGVUeXBlICYmIG9wZXJhdG9yT3B0aW9ucy50ZXN0Tm9kZVByb3BlcnR5TmFtZXMuc29tZShwcm9wID0+IHBhcmVudFtwcm9wXSA9PT0gbm9kZSk7XG4gICAgbGV0IGZvcmNlTm9JbmRlbnQgPSBwYXJlbnQudHlwZSA9PT0gb3BlcmF0b3JPcHRpb25zLmNvbmRpdGlvbmFsTm9kZVR5cGUgJiYgIWlzUGFyZW50VGVzdDsgLy8gRmluZCB0aGUgb3V0ZXJtb3N0IG5vbi1Db25kaXRpb25hbEV4cHJlc3Npb24gcGFyZW50LCBhbmQgdGhlIG91dGVybW9zdFxuICAgIC8vIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBwYXJlbnQuIFdlJ2xsIHVzZSB0aGVzZSB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkXG4gICAgLy8gcHJpbnQgaW4gSlNYIG1vZGUuXG5cbiAgICBsZXQgY3VycmVudFBhcmVudDtcbiAgICBsZXQgcHJldmlvdXNQYXJlbnQ7XG4gICAgbGV0IGkgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgcHJldmlvdXNQYXJlbnQgPSBjdXJyZW50UGFyZW50IHx8IG5vZGU7XG4gICAgICBjdXJyZW50UGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKGkpO1xuICAgICAgaSsrO1xuICAgIH0gd2hpbGUgKGN1cnJlbnRQYXJlbnQgJiYgY3VycmVudFBhcmVudC50eXBlID09PSBvcGVyYXRvck9wdGlvbnMuY29uZGl0aW9uYWxOb2RlVHlwZSAmJiBvcGVyYXRvck9wdGlvbnMudGVzdE5vZGVQcm9wZXJ0eU5hbWVzLmV2ZXJ5KHByb3AgPT4gY3VycmVudFBhcmVudFtwcm9wXSAhPT0gcHJldmlvdXNQYXJlbnQpKTtcblxuICAgIGNvbnN0IGZpcnN0Tm9uQ29uZGl0aW9uYWxQYXJlbnQgPSBjdXJyZW50UGFyZW50IHx8IHBhcmVudDtcbiAgICBjb25zdCBsYXN0Q29uZGl0aW9uYWxQYXJlbnQgPSBwcmV2aW91c1BhcmVudDtcblxuICAgIGlmIChvcGVyYXRvck9wdGlvbnMuc2hvdWxkQ2hlY2tKc3ggJiYgKGlzSlNYTm9kZSQxKG5vZGVbb3BlcmF0b3JPcHRpb25zLnRlc3ROb2RlUHJvcGVydHlOYW1lc1swXV0pIHx8IGlzSlNYTm9kZSQxKGNvbnNlcXVlbnROb2RlKSB8fCBpc0pTWE5vZGUkMShhbHRlcm5hdGVOb2RlKSB8fCBjb25kaXRpb25hbEV4cHJlc3Npb25DaGFpbkNvbnRhaW5zSlNYJDEobGFzdENvbmRpdGlvbmFsUGFyZW50KSkpIHtcbiAgICAgIGpzeE1vZGUgPSB0cnVlO1xuICAgICAgZm9yY2VOb0luZGVudCA9IHRydWU7IC8vIEV2ZW4gdGhvdWdoIHRoZXkgZG9uJ3QgbmVlZCBwYXJlbnMsIHdlIHdyYXAgKGFsbW9zdCkgZXZlcnl0aGluZyBpblxuICAgICAgLy8gcGFyZW5zIHdoZW4gdXNpbmcgPzogd2l0aGluIEpTWCwgYmVjYXVzZSB0aGUgcGFyZW5zIGFyZSBhbmFsb2dvdXMgdG9cbiAgICAgIC8vIGN1cmx5IGJyYWNlcyBpbiBhbiBpZiBzdGF0ZW1lbnQuXG5cbiAgICAgIGNvbnN0IHdyYXAgPSBkb2MgPT4gY29uY2F0JGQoW2lmQnJlYWskNihcIihcIiwgXCJcIiksIGluZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBkb2NdKSksIHNvZnRsaW5lJDYsIGlmQnJlYWskNihcIilcIiwgXCJcIildKTsgLy8gVGhlIG9ubHkgdGhpbmdzIHdlIGRvbid0IHdyYXAgYXJlOlxuICAgICAgLy8gKiBOZXN0ZWQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgaW4gYWx0ZXJuYXRlc1xuICAgICAgLy8gKiBudWxsXG4gICAgICAvLyAqIHVuZGVmaW5lZFxuXG5cbiAgICAgIGNvbnN0IGlzTmlsID0gbm9kZSA9PiBub2RlLnR5cGUgPT09IFwiTnVsbExpdGVyYWxcIiB8fCBub2RlLnR5cGUgPT09IFwiTGl0ZXJhbFwiICYmIG5vZGUudmFsdWUgPT09IG51bGwgfHwgbm9kZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBub2RlLm5hbWUgPT09IFwidW5kZWZpbmVkXCI7XG5cbiAgICAgIHBhcnRzLnB1c2goXCIgPyBcIiwgaXNOaWwoY29uc2VxdWVudE5vZGUpID8gcGF0aC5jYWxsKHByaW50LCBvcGVyYXRvck9wdGlvbnMuY29uc2VxdWVudE5vZGVQcm9wZXJ0eU5hbWUpIDogd3JhcChwYXRoLmNhbGwocHJpbnQsIG9wZXJhdG9yT3B0aW9ucy5jb25zZXF1ZW50Tm9kZVByb3BlcnR5TmFtZSkpLCBcIiA6IFwiLCBhbHRlcm5hdGVOb2RlLnR5cGUgPT09IG9wZXJhdG9yT3B0aW9ucy5jb25kaXRpb25hbE5vZGVUeXBlIHx8IGlzTmlsKGFsdGVybmF0ZU5vZGUpID8gcGF0aC5jYWxsKHByaW50LCBvcGVyYXRvck9wdGlvbnMuYWx0ZXJuYXRlTm9kZVByb3BlcnR5TmFtZSkgOiB3cmFwKHBhdGguY2FsbChwcmludCwgb3BlcmF0b3JPcHRpb25zLmFsdGVybmF0ZU5vZGVQcm9wZXJ0eU5hbWUpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vcm1hbCBtb2RlXG4gICAgICBjb25zdCBwYXJ0ID0gY29uY2F0JGQoW2xpbmUkOSwgXCI/IFwiLCBjb25zZXF1ZW50Tm9kZS50eXBlID09PSBvcGVyYXRvck9wdGlvbnMuY29uZGl0aW9uYWxOb2RlVHlwZSA/IGlmQnJlYWskNihcIlwiLCBcIihcIikgOiBcIlwiLCBhbGlnbiQxKDIsIHBhdGguY2FsbChwcmludCwgb3BlcmF0b3JPcHRpb25zLmNvbnNlcXVlbnROb2RlUHJvcGVydHlOYW1lKSksIGNvbnNlcXVlbnROb2RlLnR5cGUgPT09IG9wZXJhdG9yT3B0aW9ucy5jb25kaXRpb25hbE5vZGVUeXBlID8gaWZCcmVhayQ2KFwiXCIsIFwiKVwiKSA6IFwiXCIsIGxpbmUkOSwgXCI6IFwiLCBhbHRlcm5hdGVOb2RlLnR5cGUgPT09IG9wZXJhdG9yT3B0aW9ucy5jb25kaXRpb25hbE5vZGVUeXBlID8gcGF0aC5jYWxsKHByaW50LCBvcGVyYXRvck9wdGlvbnMuYWx0ZXJuYXRlTm9kZVByb3BlcnR5TmFtZSkgOiBhbGlnbiQxKDIsIHBhdGguY2FsbChwcmludCwgb3BlcmF0b3JPcHRpb25zLmFsdGVybmF0ZU5vZGVQcm9wZXJ0eU5hbWUpKV0pO1xuICAgICAgcGFydHMucHVzaChwYXJlbnQudHlwZSAhPT0gb3BlcmF0b3JPcHRpb25zLmNvbmRpdGlvbmFsTm9kZVR5cGUgfHwgcGFyZW50W29wZXJhdG9yT3B0aW9ucy5hbHRlcm5hdGVOb2RlUHJvcGVydHlOYW1lXSA9PT0gbm9kZSB8fCBpc1BhcmVudFRlc3QgPyBwYXJ0IDogb3B0aW9ucy51c2VUYWJzID8gZGVkZW50JDIoaW5kZW50JDcocGFydCkpIDogYWxpZ24kMShNYXRoLm1heCgwLCBvcHRpb25zLnRhYldpZHRoIC0gMiksIHBhcnQpKTtcbiAgICB9IC8vIFdlIHdhbnQgYSB3aG9sZSBjaGFpbiBvZiBDb25kaXRpb25hbEV4cHJlc3Npb25zIHRvIGFsbFxuICAgIC8vIGJyZWFrIGlmIGFueSBvZiB0aGVtIGJyZWFrLiBUaGF0IG1lYW5zIHdlIHNob3VsZCBvbmx5IGdyb3VwIGFyb3VuZCB0aGVcbiAgICAvLyBvdXRlci1tb3N0IENvbmRpdGlvbmFsRXhwcmVzc2lvbi5cblxuXG4gICAgY29uc3QgbWF5YmVHcm91cCA9IGRvYyA9PiBwYXJlbnQgPT09IGZpcnN0Tm9uQ29uZGl0aW9uYWxQYXJlbnQgPyBncm91cCRiKGRvYykgOiBkb2M7IC8vIEJyZWFrIHRoZSBjbG9zaW5nIHBhcmVuIHRvIGtlZXAgdGhlIGNoYWluIHJpZ2h0IGFmdGVyIGl0OlxuICAgIC8vIChhXG4gICAgLy8gICA/IGJcbiAgICAvLyAgIDogY1xuICAgIC8vICkuY2FsbCgpXG5cblxuICAgIGNvbnN0IGJyZWFrQ2xvc2luZ1BhcmVuID0gIWpzeE1vZGUgJiYgKHBhcmVudC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJOR1BpcGVFeHByZXNzaW9uXCIgJiYgcGFyZW50LmxlZnQgPT09IG5vZGUpICYmICFwYXJlbnQuY29tcHV0ZWQ7XG4gICAgY29uc3QgcmVzdWx0ID0gbWF5YmVHcm91cChjb25jYXQkZChbXS5jb25jYXQoKHRlc3REb2MgPT5cbiAgICAvKipcbiAgICAgKiAgICAgYVxuICAgICAqICAgICAgID8gYlxuICAgICAqICAgICAgIDogbXVsdGlsaW5lXG4gICAgICogICAgICAgICB0ZXN0XG4gICAgICogICAgICAgICBub2RlXG4gICAgICogICAgICAgXl4gYWxpZ24oMilcbiAgICAgKiAgICAgICA/IGRcbiAgICAgKiAgICAgICA6IGVcbiAgICAgKi9cbiAgICBwYXJlbnQudHlwZSA9PT0gb3BlcmF0b3JPcHRpb25zLmNvbmRpdGlvbmFsTm9kZVR5cGUgJiYgcGFyZW50W29wZXJhdG9yT3B0aW9ucy5hbHRlcm5hdGVOb2RlUHJvcGVydHlOYW1lXSA9PT0gbm9kZSA/IGFsaWduJDEoMiwgdGVzdERvYykgOiB0ZXN0RG9jKShjb25jYXQkZChvcGVyYXRvck9wdGlvbnMuYmVmb3JlUGFydHMoKSkpLCBmb3JjZU5vSW5kZW50ID8gY29uY2F0JGQocGFydHMpIDogaW5kZW50JDcoY29uY2F0JGQocGFydHMpKSwgb3BlcmF0b3JPcHRpb25zLmFmdGVyUGFydHMoYnJlYWtDbG9zaW5nUGFyZW4pKSkpO1xuICAgIHJldHVybiBpc1BhcmVudFRlc3QgPyBncm91cCRiKGNvbmNhdCRkKFtpbmRlbnQkNyhjb25jYXQkZChbc29mdGxpbmUkNiwgcmVzdWx0XSkpLCBzb2Z0bGluZSQ2XSkpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRQYXRoTm9QYXJlbnMocGF0aCwgb3B0aW9ucywgcHJpbnQsIGFyZ3MpIHtcbiAgICBjb25zdCBuID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHNlbWkgPSBvcHRpb25zLnNlbWkgPyBcIjtcIiA6IFwiXCI7XG5cbiAgICBpZiAoIW4pIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG47XG4gICAgfVxuXG4gICAgY29uc3QgaHRtbEJpbmRpbmcgPSBwcmludEh0bWxCaW5kaW5nJDEocGF0aCwgb3B0aW9ucywgcHJpbnQpO1xuXG4gICAgaWYgKGh0bWxCaW5kaW5nKSB7XG4gICAgICByZXR1cm4gaHRtbEJpbmRpbmc7XG4gICAgfVxuXG4gICAgbGV0IHBhcnRzID0gW107XG5cbiAgICBzd2l0Y2ggKG4udHlwZSkge1xuICAgICAgY2FzZSBcIkpzRXhwcmVzc2lvblJvb3RcIjpcbiAgICAgICAgcmV0dXJuIHBhdGguY2FsbChwcmludCwgXCJub2RlXCIpO1xuXG4gICAgICBjYXNlIFwiSnNvblJvb3RcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwibm9kZVwiKSwgaGFyZGxpbmUkOV0pO1xuXG4gICAgICBjYXNlIFwiRmlsZVwiOlxuICAgICAgICAvLyBQcmludCBAYmFiZWwvcGFyc2VyJ3MgSW50ZXJwcmV0ZXJEaXJlY3RpdmUgaGVyZSBzbyB0aGF0XG4gICAgICAgIC8vIGxlYWRpbmcgY29tbWVudHMgb24gdGhlIGBQcm9ncmFtYCBub2RlIGdldCBwcmludGVkIGFmdGVyIHRoZSBoYXNoYmFuZy5cbiAgICAgICAgaWYgKG4ucHJvZ3JhbSAmJiBuLnByb2dyYW0uaW50ZXJwcmV0ZXIpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcm9ncmFtUGF0aCA9PiBwcm9ncmFtUGF0aC5jYWxsKHByaW50LCBcImludGVycHJldGVyXCIpLCBcInByb2dyYW1cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaChwYXRoLmNhbGwocHJpbnQsIFwicHJvZ3JhbVwiKSk7XG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJQcm9ncmFtXCI6XG4gICAgICAgIC8vIEJhYmVsIDZcbiAgICAgICAgaWYgKG4uZGlyZWN0aXZlcykge1xuICAgICAgICAgIHBhdGguZWFjaChjaGlsZFBhdGggPT4ge1xuICAgICAgICAgICAgcGFydHMucHVzaChwcmludChjaGlsZFBhdGgpLCBzZW1pLCBoYXJkbGluZSQ5KTtcblxuICAgICAgICAgICAgaWYgKGlzTmV4dExpbmVFbXB0eSQ0KG9wdGlvbnMub3JpZ2luYWxUZXh0LCBjaGlsZFBhdGguZ2V0VmFsdWUoKSwgb3B0aW9ucy5sb2NFbmQpKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goaGFyZGxpbmUkOSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgXCJkaXJlY3RpdmVzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaChwYXRoLmNhbGwoYm9keVBhdGggPT4ge1xuICAgICAgICAgIHJldHVybiBwcmludFN0YXRlbWVudFNlcXVlbmNlKGJvZHlQYXRoLCBvcHRpb25zLCBwcmludCk7XG4gICAgICAgIH0sIFwiYm9keVwiKSk7XG4gICAgICAgIHBhcnRzLnB1c2goY29tbWVudHMucHJpbnREYW5nbGluZ0NvbW1lbnRzKHBhdGgsIG9wdGlvbnMsXG4gICAgICAgIC8qIHNhbWVJbmRlbnQgKi9cbiAgICAgICAgdHJ1ZSkpOyAvLyBPbmx5IGZvcmNlIGEgdHJhaWxpbmcgbmV3bGluZSBpZiB0aGVyZSB3ZXJlIGFueSBjb250ZW50cy5cblxuICAgICAgICBpZiAoIW4uYm9keS5ldmVyeSgoe1xuICAgICAgICAgIHR5cGVcbiAgICAgICAgfSkgPT4gdHlwZSA9PT0gXCJFbXB0eVN0YXRlbWVudFwiKSB8fCBuLmNvbW1lbnRzKSB7XG4gICAgICAgICAgcGFydHMucHVzaChoYXJkbGluZSQ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG4gICAgICAvLyBCYWJlbCBleHRlbnNpb24uXG5cbiAgICAgIGNhc2UgXCJFbXB0eVN0YXRlbWVudFwiOlxuICAgICAgICByZXR1cm4gXCJcIjtcblxuICAgICAgY2FzZSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIjpcbiAgICAgICAgLy8gRGV0ZWN0IEZsb3ctcGFyc2VkIGRpcmVjdGl2ZXNcbiAgICAgICAgaWYgKG4uZGlyZWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtub2RlU3RyKG4uZXhwcmVzc2lvbiwgb3B0aW9ucywgdHJ1ZSksIHNlbWldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBhcnNlciA9PT0gXCJfX3Z1ZV9ldmVudF9iaW5kaW5nXCIpIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcblxuICAgICAgICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJQcm9ncmFtXCIgJiYgcGFyZW50LmJvZHkubGVuZ3RoID09PSAxICYmIHBhcmVudC5ib2R5WzBdID09PSBuKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGQoW3BhdGguY2FsbChwcmludCwgXCJleHByZXNzaW9uXCIpLCBpc1Z1ZUV2ZW50QmluZGluZ0V4cHJlc3Npb24kMyhuLmV4cHJlc3Npb24pID8gXCI7XCIgOiBcIlwiXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIERvIG5vdCBhcHBlbmQgc2VtaWNvbG9uIGFmdGVyIHRoZSBvbmx5IEpTWCBlbGVtZW50IGluIGEgcHJvZ3JhbVxuXG5cbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwiZXhwcmVzc2lvblwiKSwgaXNUaGVPbmx5SlNYRWxlbWVudEluTWFya2Rvd24kMShvcHRpb25zLCBwYXRoKSA/IFwiXCIgOiBzZW1pXSk7XG4gICAgICAvLyBCYWJlbCBub24tc3RhbmRhcmQgbm9kZS4gVXNlZCBmb3IgQ2xvc3VyZS1zdHlsZSB0eXBlIGNhc3RzLiBTZWUgcG9zdHByb2Nlc3MuanMuXG5cbiAgICAgIGNhc2UgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkSHVnID0gIW4uZXhwcmVzc2lvbi5jb21tZW50cztcblxuICAgICAgICAgIGlmIChzaG91bGRIdWcpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jYXQkZChbXCIoXCIsIHBhdGguY2FsbChwcmludCwgXCJleHByZXNzaW9uXCIpLCBcIilcIl0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKFtcIihcIiwgaW5kZW50JDcoY29uY2F0JGQoW3NvZnRsaW5lJDYsIHBhdGguY2FsbChwcmludCwgXCJleHByZXNzaW9uXCIpXSkpLCBzb2Z0bGluZSQ2LCBcIilcIl0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIHByaW50QXNzaWdubWVudChuLmxlZnQsIHBhdGguY2FsbChwcmludCwgXCJsZWZ0XCIpLCBjb25jYXQkZChbXCIgXCIsIG4ub3BlcmF0b3JdKSwgbi5yaWdodCwgcGF0aC5jYWxsKHByaW50LCBcInJpZ2h0XCIpLCBvcHRpb25zKTtcblxuICAgICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMb2dpY2FsRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIk5HUGlwZUV4cHJlc3Npb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuICAgICAgICAgIGNvbnN0IHBhcmVudFBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgxKTtcbiAgICAgICAgICBjb25zdCBpc0luc2lkZVBhcmVudGhlc2lzID0gbiAhPT0gcGFyZW50LmJvZHkgJiYgKHBhcmVudC50eXBlID09PSBcIklmU3RhdGVtZW50XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiV2hpbGVTdGF0ZW1lbnRcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJTd2l0Y2hTdGF0ZW1lbnRcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJEb1doaWxlU3RhdGVtZW50XCIpO1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gcHJpbnRCaW5hcnlpc2hFeHByZXNzaW9ucyhwYXRoLCBwcmludCwgb3B0aW9ucyxcbiAgICAgICAgICAvKiBpc05lc3RlZCAqL1xuICAgICAgICAgIGZhbHNlLCBpc0luc2lkZVBhcmVudGhlc2lzKTsgLy8gICBpZiAoXG4gICAgICAgICAgLy8gICAgIHRoaXMuaGFzUGx1Z2luKFwiZHluYW1pY0ltcG9ydHNcIikgJiYgdGhpcy5sb29rYWhlYWQoKS50eXBlID09PSB0dC5wYXJlbkxlZnRcbiAgICAgICAgICAvLyAgICkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gbG9va3Mgc3VwZXIgd2VpcmQsIHdlIHdhbnQgdG8gYnJlYWsgdGhlIGNoaWxkcmVuIGlmIHRoZSBwYXJlbnQgYnJlYWtzXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIGlmIChcbiAgICAgICAgICAvLyAgICAgdGhpcy5oYXNQbHVnaW4oXCJkeW5hbWljSW1wb3J0c1wiKSAmJlxuICAgICAgICAgIC8vICAgICB0aGlzLmxvb2thaGVhZCgpLnR5cGUgPT09IHR0LnBhcmVuTGVmdFxuICAgICAgICAgIC8vICAgKSB7XG5cbiAgICAgICAgICBpZiAoaXNJbnNpZGVQYXJlbnRoZXNpcykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcbiAgICAgICAgICB9IC8vIEJyZWFrIGJldHdlZW4gdGhlIHBhcmVucyBpblxuICAgICAgICAgIC8vIHVuYXJpZXMgb3IgaW4gYSBtZW1iZXIgb3Igc3BlY2lmaWMgY2FsbCBleHByZXNzaW9uLCBpLmUuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIChcbiAgICAgICAgICAvLyAgICAgYSAmJlxuICAgICAgICAgIC8vICAgICBiICYmXG4gICAgICAgICAgLy8gICAgIGNcbiAgICAgICAgICAvLyAgICkuY2FsbCgpXG5cblxuICAgICAgICAgIGlmICgocGFyZW50LnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCIpICYmIHBhcmVudC5jYWxsZWUgPT09IG4gfHwgcGFyZW50LnR5cGUgPT09IFwiVW5hcnlFeHByZXNzaW9uXCIgfHwgKHBhcmVudC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIikgJiYgIXBhcmVudC5jb21wdXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW2luZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBjb25jYXQkZChwYXJ0cyldKSksIHNvZnRsaW5lJDZdKSk7XG4gICAgICAgICAgfSAvLyBBdm9pZCBpbmRlbnRpbmcgc3ViLWV4cHJlc3Npb25zIGluIHNvbWUgY2FzZXMgd2hlcmUgdGhlIGZpcnN0IHN1Yi1leHByZXNzaW9uIGlzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbmRlbnRlZCBhY2NvcmRpbmdseS4gV2Ugc2hvdWxkIGluZGVudCBzdWItZXhwcmVzc2lvbnMgd2hlcmUgdGhlIGZpcnN0IGNhc2UgaXNuJ3QgaW5kZW50ZWQuXG5cblxuICAgICAgICAgIGNvbnN0IHNob3VsZE5vdEluZGVudCA9IHBhcmVudC50eXBlID09PSBcIlJldHVyblN0YXRlbWVudFwiIHx8IHBhcmVudC50eXBlID09PSBcIlRocm93U3RhdGVtZW50XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiICYmIHBhcmVudFBhcmVudC50eXBlID09PSBcIkpTWEF0dHJpYnV0ZVwiIHx8IG4ub3BlcmF0b3IgIT09IFwifFwiICYmIHBhcmVudC50eXBlID09PSBcIkpzRXhwcmVzc2lvblJvb3RcIiB8fCBuLnR5cGUgIT09IFwiTkdQaXBlRXhwcmVzc2lvblwiICYmIChwYXJlbnQudHlwZSA9PT0gXCJOR1Jvb3RcIiAmJiBvcHRpb25zLnBhcnNlciA9PT0gXCJfX25nX2JpbmRpbmdcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJOR01pY3Jvc3ludGF4RXhwcmVzc2lvblwiICYmIHBhcmVudFBhcmVudC50eXBlID09PSBcIk5HTWljcm9zeW50YXhcIiAmJiBwYXJlbnRQYXJlbnQuYm9keS5sZW5ndGggPT09IDEpIHx8IG4gPT09IHBhcmVudC5ib2R5ICYmIHBhcmVudC50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgbiAhPT0gcGFyZW50LmJvZHkgJiYgcGFyZW50LnR5cGUgPT09IFwiRm9yU3RhdGVtZW50XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIgJiYgcGFyZW50UGFyZW50LnR5cGUgIT09IFwiUmV0dXJuU3RhdGVtZW50XCIgJiYgcGFyZW50UGFyZW50LnR5cGUgIT09IFwiVGhyb3dTdGF0ZW1lbnRcIiAmJiBwYXJlbnRQYXJlbnQudHlwZSAhPT0gXCJDYWxsRXhwcmVzc2lvblwiICYmIHBhcmVudFBhcmVudC50eXBlICE9PSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJUZW1wbGF0ZUxpdGVyYWxcIjtcbiAgICAgICAgICBjb25zdCBzaG91bGRJbmRlbnRJZklubGluaW5nID0gcGFyZW50LnR5cGUgPT09IFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0b3JcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJDbGFzc1Byb3BlcnR5XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiVFNBYnN0cmFjdENsYXNzUHJvcGVydHlcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiIHx8IHBhcmVudC50eXBlID09PSBcIk9iamVjdFByb3BlcnR5XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiUHJvcGVydHlcIjtcbiAgICAgICAgICBjb25zdCBzYW1lUHJlY2VkZW5jZVN1YkV4cHJlc3Npb24gPSBpc0JpbmFyeWlzaCQxKG4ubGVmdCkgJiYgc2hvdWxkRmxhdHRlbiQxKG4ub3BlcmF0b3IsIG4ubGVmdC5vcGVyYXRvcik7XG5cbiAgICAgICAgICBpZiAoc2hvdWxkTm90SW5kZW50IHx8IHNob3VsZElubGluZUxvZ2ljYWxFeHByZXNzaW9uKG4pICYmICFzYW1lUHJlY2VkZW5jZVN1YkV4cHJlc3Npb24gfHwgIXNob3VsZElubGluZUxvZ2ljYWxFeHByZXNzaW9uKG4pICYmIHNob3VsZEluZGVudElmSW5saW5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKHBhcnRzKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgfSAvLyBJZiB0aGUgcmlnaHQgcGFydCBpcyBhIEpTWCBub2RlLCB3ZSBpbmNsdWRlIGl0IGluIGEgc2VwYXJhdGUgZ3JvdXAgdG9cbiAgICAgICAgICAvLyBwcmV2ZW50IGl0IGJyZWFraW5nIHRoZSB3aG9sZSBjaGFpbiwgc28gd2UgY2FuIHByaW50IHRoZSBleHByZXNzaW9uIGxpa2U6XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIGZvbyAmJiBiYXIgJiYgKFxuICAgICAgICAgIC8vICAgICA8Rm9vPlxuICAgICAgICAgIC8vICAgICAgIDxCYXIgLz5cbiAgICAgICAgICAvLyAgICAgPC9Gb28+XG4gICAgICAgICAgLy8gICApXG5cblxuICAgICAgICAgIGNvbnN0IGhhc0pTWCA9IGlzSlNYTm9kZSQxKG4ucmlnaHQpO1xuICAgICAgICAgIGNvbnN0IHJlc3QgPSBjb25jYXQkZChoYXNKU1ggPyBwYXJ0cy5zbGljZSgxLCAtMSkgOiBwYXJ0cy5zbGljZSgxKSk7XG4gICAgICAgICAgY29uc3QgZ3JvdXBJZCA9IFN5bWJvbChcImxvZ2ljYWxDaGFpbi1cIiArICsrdWlkKTtcbiAgICAgICAgICBjb25zdCBjaGFpbiA9IGdyb3VwJGIoY29uY2F0JGQoWy8vIERvbid0IGluY2x1ZGUgdGhlIGluaXRpYWwgZXhwcmVzc2lvbiBpbiB0aGUgaW5kZW50YXRpb25cbiAgICAgICAgICAvLyBsZXZlbC4gVGhlIGZpcnN0IGl0ZW0gaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgZmlyc3RcbiAgICAgICAgICAvLyBsZWZ0LW1vc3QgZXhwcmVzc2lvbi5cbiAgICAgICAgICBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbMF0gOiBcIlwiLCBpbmRlbnQkNyhyZXN0KV0pLCB7XG4gICAgICAgICAgICBpZDogZ3JvdXBJZFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFoYXNKU1gpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGFpbjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBqc3hQYXJ0ID0gZ2V0TGFzdCQzKHBhcnRzKTtcbiAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChbY2hhaW4sIGlmQnJlYWskNihpbmRlbnQkNyhqc3hQYXJ0KSwganN4UGFydCwge1xuICAgICAgICAgICAgZ3JvdXBJZFxuICAgICAgICAgIH0pXSkpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJBc3NpZ25tZW50UGF0dGVyblwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW3BhdGguY2FsbChwcmludCwgXCJsZWZ0XCIpLCBcIiA9IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwicmlnaHRcIildKTtcblxuICAgICAgY2FzZSBcIlRTVHlwZUFzc2VydGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkQnJlYWtBZnRlckNhc3QgPSAhKG4uZXhwcmVzc2lvbi50eXBlID09PSBcIkFycmF5RXhwcmVzc2lvblwiIHx8IG4uZXhwcmVzc2lvbi50eXBlID09PSBcIk9iamVjdEV4cHJlc3Npb25cIik7XG4gICAgICAgICAgY29uc3QgY2FzdEdyb3VwID0gZ3JvdXAkYihjb25jYXQkZChbXCI8XCIsIGluZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZUFubm90YXRpb25cIildKSksIHNvZnRsaW5lJDYsIFwiPlwiXSkpO1xuICAgICAgICAgIGNvbnN0IGV4cHJDb250ZW50cyA9IGNvbmNhdCRkKFtpZkJyZWFrJDYoXCIoXCIpLCBpbmRlbnQkNyhjb25jYXQkZChbc29mdGxpbmUkNiwgcGF0aC5jYWxsKHByaW50LCBcImV4cHJlc3Npb25cIildKSksIHNvZnRsaW5lJDYsIGlmQnJlYWskNihcIilcIildKTtcblxuICAgICAgICAgIGlmIChzaG91bGRCcmVha0FmdGVyQ2FzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbmFsR3JvdXAkMShbY29uY2F0JGQoW2Nhc3RHcm91cCwgcGF0aC5jYWxsKHByaW50LCBcImV4cHJlc3Npb25cIildKSwgY29uY2F0JGQoW2Nhc3RHcm91cCwgZ3JvdXAkYihleHByQ29udGVudHMsIHtcbiAgICAgICAgICAgICAgc2hvdWxkQnJlYWs6IHRydWVcbiAgICAgICAgICAgIH0pXSksIGNvbmNhdCRkKFtjYXN0R3JvdXAsIHBhdGguY2FsbChwcmludCwgXCJleHByZXNzaW9uXCIpXSldKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChbY2FzdEdyb3VwLCBwYXRoLmNhbGwocHJpbnQsIFwiZXhwcmVzc2lvblwiKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgICAgICAgbGV0IGZpcnN0Tm9uTWVtYmVyUGFyZW50O1xuICAgICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGZpcnN0Tm9uTWVtYmVyUGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKGkpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH0gd2hpbGUgKGZpcnN0Tm9uTWVtYmVyUGFyZW50ICYmIChmaXJzdE5vbk1lbWJlclBhcmVudC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fCBmaXJzdE5vbk1lbWJlclBhcmVudC50eXBlID09PSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiIHx8IGZpcnN0Tm9uTWVtYmVyUGFyZW50LnR5cGUgPT09IFwiVFNOb25OdWxsRXhwcmVzc2lvblwiKSk7XG5cbiAgICAgICAgICBjb25zdCBzaG91bGRJbmxpbmUgPSBmaXJzdE5vbk1lbWJlclBhcmVudCAmJiAoZmlyc3ROb25NZW1iZXJQYXJlbnQudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIgfHwgZmlyc3ROb25NZW1iZXJQYXJlbnQudHlwZSA9PT0gXCJCaW5kRXhwcmVzc2lvblwiIHx8IGZpcnN0Tm9uTWVtYmVyUGFyZW50LnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdG9yXCIgJiYgZmlyc3ROb25NZW1iZXJQYXJlbnQuaWQudHlwZSAhPT0gXCJJZGVudGlmaWVyXCIgfHwgZmlyc3ROb25NZW1iZXJQYXJlbnQudHlwZSA9PT0gXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiICYmIGZpcnN0Tm9uTWVtYmVyUGFyZW50LmxlZnQudHlwZSAhPT0gXCJJZGVudGlmaWVyXCIpIHx8IG4uY29tcHV0ZWQgfHwgbi5vYmplY3QudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgbi5wcm9wZXJ0eS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiYgcGFyZW50LnR5cGUgIT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwib2JqZWN0XCIpLCBzaG91bGRJbmxpbmUgPyBwcmludE1lbWJlckxvb2t1cChwYXRoLCBvcHRpb25zLCBwcmludCkgOiBncm91cCRiKGluZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBwcmludE1lbWJlckxvb2t1cChwYXRoLCBvcHRpb25zLCBwcmludCldKSkpXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIk1ldGFQcm9wZXJ0eVwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW3BhdGguY2FsbChwcmludCwgXCJtZXRhXCIpLCBcIi5cIiwgcGF0aC5jYWxsKHByaW50LCBcInByb3BlcnR5XCIpXSk7XG5cbiAgICAgIGNhc2UgXCJCaW5kRXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAobi5vYmplY3QpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcmludCwgXCJvYmplY3RcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaChncm91cCRiKGluZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBwcmludEJpbmRFeHByZXNzaW9uQ2FsbGVlKHBhdGgsIG9wdGlvbnMsIHByaW50KV0pKSkpO1xuICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuXG4gICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtuLm5hbWUsIHByaW50T3B0aW9uYWxUb2tlbihwYXRoKSwgcHJpbnRUeXBlQW5ub3RhdGlvbihwYXRoLCBvcHRpb25zLCBwcmludCldKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiVjhJbnRyaW5zaWNJZGVudGlmaWVyXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCIlXCIsIG4ubmFtZV0pO1xuXG4gICAgICBjYXNlIFwiU3ByZWFkRWxlbWVudFwiOlxuICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRQYXR0ZXJuXCI6XG4gICAgICBjYXNlIFwiU3ByZWFkUHJvcGVydHlcIjpcbiAgICAgIGNhc2UgXCJTcHJlYWRQcm9wZXJ0eVBhdHRlcm5cIjpcbiAgICAgIGNhc2UgXCJSZXN0RWxlbWVudFwiOlxuICAgICAgY2FzZSBcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW1wiLi4uXCIsIHBhdGguY2FsbChwcmludCwgXCJhcmd1bWVudFwiKSwgcHJpbnRUeXBlQW5ub3RhdGlvbihwYXRoLCBvcHRpb25zLCBwcmludCldKTtcblxuICAgICAgY2FzZSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIjpcbiAgICAgIGNhc2UgXCJGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICAgICAgcGFydHMucHVzaChwcmludEZ1bmN0aW9uRGVjbGFyYXRpb24ocGF0aCwgcHJpbnQsIG9wdGlvbnMpKTtcblxuICAgICAgICBpZiAoIW4uYm9keSkge1xuICAgICAgICAgIHBhcnRzLnB1c2goc2VtaSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuXG4gICAgICBjYXNlIFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChuLmFzeW5jKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiYXN5bmMgXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRQcmludFBhcmFtc1dpdGhvdXRQYXJlbnMocGF0aCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2gocGF0aC5jYWxsKHByaW50LCBcInBhcmFtc1wiLCAwKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goZ3JvdXAkYihjb25jYXQkZChbcHJpbnRGdW5jdGlvblBhcmFtcyhwYXRoLCBwcmludCwgb3B0aW9ucyxcbiAgICAgICAgICAgIC8qIGV4cGFuZExhc3QgKi9cbiAgICAgICAgICAgIGFyZ3MgJiYgKGFyZ3MuZXhwYW5kTGFzdEFyZyB8fCBhcmdzLmV4cGFuZEZpcnN0QXJnKSxcbiAgICAgICAgICAgIC8qIHByaW50VHlwZVBhcmFtcyAqL1xuICAgICAgICAgICAgdHJ1ZSksIHByaW50UmV0dXJuVHlwZShwYXRoLCBwcmludCwgb3B0aW9ucyldKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGRhbmdsaW5nID0gY29tbWVudHMucHJpbnREYW5nbGluZ0NvbW1lbnRzKHBhdGgsIG9wdGlvbnMsXG4gICAgICAgICAgLyogc2FtZUluZGVudCAqL1xuICAgICAgICAgIHRydWUsIGNvbW1lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV4dENoYXJhY3RlciA9IGdldE5leHROb25TcGFjZU5vbkNvbW1lbnRDaGFyYWN0ZXJJbmRleCQzKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBjb21tZW50LCBvcHRpb25zLmxvY0VuZCk7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2UobmV4dENoYXJhY3RlciwgbmV4dENoYXJhY3RlciArIDIpID09PSBcIj0+XCI7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoZGFuZ2xpbmcpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCIgXCIsIGRhbmdsaW5nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiID0+XCIpO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBwYXRoLmNhbGwoYm9keVBhdGggPT4gcHJpbnQoYm9keVBhdGgsIGFyZ3MpLCBcImJvZHlcIik7IC8vIFdlIHdhbnQgdG8gYWx3YXlzIGtlZXAgdGhlc2UgdHlwZXMgb2Ygbm9kZXMgb24gdGhlIHNhbWUgbGluZVxuICAgICAgICAgIC8vIGFzIHRoZSBhcnJvdy5cblxuICAgICAgICAgIGlmICghaGFzTGVhZGluZ093bkxpbmVDb21tZW50JDEob3B0aW9ucy5vcmlnaW5hbFRleHQsIG4uYm9keSwgb3B0aW9ucykgJiYgKG4uYm9keS50eXBlID09PSBcIkFycmF5RXhwcmVzc2lvblwiIHx8IG4uYm9keS50eXBlID09PSBcIk9iamVjdEV4cHJlc3Npb25cIiB8fCBuLmJvZHkudHlwZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiIHx8IGlzSlNYTm9kZSQxKG4uYm9keSkgfHwgaXNUZW1wbGF0ZU9uSXRzT3duTGluZSQxKG4uYm9keSwgb3B0aW9ucy5vcmlnaW5hbFRleHQsIG9wdGlvbnMpIHx8IG4uYm9keS50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgbi5ib2R5LnR5cGUgPT09IFwiRG9FeHByZXNzaW9uXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChbY29uY2F0JGQocGFydHMpLCBcIiBcIiwgYm9keV0pKTtcbiAgICAgICAgICB9IC8vIFdlIGhhbmRsZSBzZXF1ZW5jZSBleHByZXNzaW9ucyBhcyB0aGUgYm9keSBvZiBhcnJvd3Mgc3BlY2lhbGx5LFxuICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIHJlcXVpcmVkIHBhcmVudGhlc2VzIGVuZCB1cCBvbiB0aGVpciBvd24gbGluZXMuXG5cblxuICAgICAgICAgIGlmIChuLmJvZHkudHlwZSA9PT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW2NvbmNhdCRkKHBhcnRzKSwgZ3JvdXAkYihjb25jYXQkZChbXCIgKFwiLCBpbmRlbnQkNyhjb25jYXQkZChbc29mdGxpbmUkNiwgYm9keV0pKSwgc29mdGxpbmUkNiwgXCIpXCJdKSldKSk7XG4gICAgICAgICAgfSAvLyBpZiB0aGUgYXJyb3cgZnVuY3Rpb24gaXMgZXhwYW5kZWQgYXMgbGFzdCBhcmd1bWVudCwgd2UgYXJlIGFkZGluZyBhXG4gICAgICAgICAgLy8gbGV2ZWwgb2YgaW5kZW50YXRpb24gYW5kIG5lZWQgdG8gYWRkIGEgc29mdGxpbmUgdG8gYWxpZ24gdGhlIGNsb3NpbmcgKVxuICAgICAgICAgIC8vIHdpdGggdGhlIG9wZW5pbmcgKCwgb3IgaWYgaXQncyBpbnNpZGUgYSBKU1hFeHByZXNzaW9uIChlLmcuIGFuIGF0dHJpYnV0ZSlcbiAgICAgICAgICAvLyB3ZSBzaG91bGQgYWxpZ24gdGhlIGV4cHJlc3Npb24ncyBjbG9zaW5nIH0gd2l0aCB0aGUgbGluZSB3aXRoIHRoZSBvcGVuaW5nIHsuXG5cblxuICAgICAgICAgIGNvbnN0IHNob3VsZEFkZFNvZnRMaW5lID0gKGFyZ3MgJiYgYXJncy5leHBhbmRMYXN0QXJnIHx8IHBhdGguZ2V0UGFyZW50Tm9kZSgpLnR5cGUgPT09IFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiKSAmJiAhKG4uY29tbWVudHMgJiYgbi5jb21tZW50cy5sZW5ndGgpO1xuICAgICAgICAgIGNvbnN0IHByaW50VHJhaWxpbmdDb21tYSA9IGFyZ3MgJiYgYXJncy5leHBhbmRMYXN0QXJnICYmIHNob3VsZFByaW50Q29tbWEkMShvcHRpb25zLCBcImFsbFwiKTsgLy8gSW4gb3JkZXIgdG8gYXZvaWQgY29uZnVzaW9uIGJldHdlZW5cbiAgICAgICAgICAvLyBhID0+IGEgPyBhIDogYVxuICAgICAgICAgIC8vIGEgPD0gYSA/IGEgOiBhXG5cbiAgICAgICAgICBjb25zdCBzaG91bGRBZGRQYXJlbnMgPSBuLmJvZHkudHlwZSA9PT0gXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIiAmJiAhc3RhcnRzV2l0aE5vTG9va2FoZWFkVG9rZW4kMShuLmJvZHksXG4gICAgICAgICAgLyogZm9yYmlkRnVuY3Rpb25BbmRDbGFzcyAqL1xuICAgICAgICAgIGZhbHNlKTtcbiAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChbY29uY2F0JGQocGFydHMpLCBncm91cCRiKGNvbmNhdCRkKFtpbmRlbnQkNyhjb25jYXQkZChbbGluZSQ5LCBzaG91bGRBZGRQYXJlbnMgPyBpZkJyZWFrJDYoXCJcIiwgXCIoXCIpIDogXCJcIiwgYm9keSwgc2hvdWxkQWRkUGFyZW5zID8gaWZCcmVhayQ2KFwiXCIsIFwiKVwiKSA6IFwiXCJdKSksIHNob3VsZEFkZFNvZnRMaW5lID8gY29uY2F0JGQoW2lmQnJlYWskNihwcmludFRyYWlsaW5nQ29tbWEgPyBcIixcIiA6IFwiXCIpLCBzb2Z0bGluZSQ2XSkgOiBcIlwiXSkpXSkpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJZaWVsZEV4cHJlc3Npb25cIjpcbiAgICAgICAgcGFydHMucHVzaChcInlpZWxkXCIpO1xuXG4gICAgICAgIGlmIChuLmRlbGVnYXRlKSB7XG4gICAgICAgICAgcGFydHMucHVzaChcIipcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobi5hcmd1bWVudCkge1xuICAgICAgICAgIHBhcnRzLnB1c2goXCIgXCIsIHBhdGguY2FsbChwcmludCwgXCJhcmd1bWVudFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuXG4gICAgICBjYXNlIFwiQXdhaXRFeHByZXNzaW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiYXdhaXQgXCIsIHBhdGguY2FsbChwcmludCwgXCJhcmd1bWVudFwiKSk7XG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG5cbiAgICAgICAgICBpZiAoKHBhcmVudC50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiKSAmJiBwYXJlbnQuY2FsbGVlID09PSBuIHx8IChwYXJlbnQudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIpICYmIHBhcmVudC5vYmplY3QgPT09IG4pIHtcbiAgICAgICAgICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKFtpbmRlbnQkNyhjb25jYXQkZChbc29mdGxpbmUkNiwgY29uY2F0JGQocGFydHMpXSkpLCBzb2Z0bGluZSQ2XSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkltcG9ydFNwZWNpZmllclwiOlxuICAgICAgICBpZiAobi5pbXBvcnRLaW5kKSB7XG4gICAgICAgICAgcGFydHMucHVzaChwYXRoLmNhbGwocHJpbnQsIFwiaW1wb3J0S2luZFwiKSwgXCIgXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaChwYXRoLmNhbGwocHJpbnQsIFwiaW1wb3J0ZWRcIikpO1xuXG4gICAgICAgIGlmIChuLmxvY2FsICYmIG4ubG9jYWwubmFtZSAhPT0gbi5pbXBvcnRlZC5uYW1lKSB7XG4gICAgICAgICAgcGFydHMucHVzaChcIiBhcyBcIiwgcGF0aC5jYWxsKHByaW50LCBcImxvY2FsXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJFeHBvcnRTcGVjaWZpZXJcIjpcbiAgICAgICAgcGFydHMucHVzaChwYXRoLmNhbGwocHJpbnQsIFwibG9jYWxcIikpO1xuXG4gICAgICAgIGlmIChuLmV4cG9ydGVkICYmIG4uZXhwb3J0ZWQubmFtZSAhPT0gbi5sb2NhbC5uYW1lKSB7XG4gICAgICAgICAgcGFydHMucHVzaChcIiBhcyBcIiwgcGF0aC5jYWxsKHByaW50LCBcImV4cG9ydGVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIjpcbiAgICAgICAgcGFydHMucHVzaChcIiogYXMgXCIpO1xuICAgICAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcmludCwgXCJsb2NhbFwiKSk7XG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCI6XG4gICAgICAgIHJldHVybiBwYXRoLmNhbGwocHJpbnQsIFwibG9jYWxcIik7XG5cbiAgICAgIGNhc2UgXCJUU0V4cG9ydEFzc2lnbm1lbnRcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcImV4cG9ydCA9IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiZXhwcmVzc2lvblwiKSwgc2VtaV0pO1xuXG4gICAgICBjYXNlIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCI6XG4gICAgICBjYXNlIFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiOlxuICAgICAgICByZXR1cm4gcHJpbnRFeHBvcnREZWNsYXJhdGlvbihwYXRoLCBvcHRpb25zLCBwcmludCk7XG5cbiAgICAgIGNhc2UgXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiOlxuICAgICAgICBwYXJ0cy5wdXNoKFwiZXhwb3J0IFwiKTtcblxuICAgICAgICBpZiAobi5leHBvcnRLaW5kID09PSBcInR5cGVcIikge1xuICAgICAgICAgIHBhcnRzLnB1c2goXCJ0eXBlIFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcnRzLnB1c2goXCIqIFwiKTtcblxuICAgICAgICBpZiAobi5leHBvcnRlZCkge1xuICAgICAgICAgIHBhcnRzLnB1c2goXCJhcyBcIiwgcGF0aC5jYWxsKHByaW50LCBcImV4cG9ydGVkXCIpLCBcIiBcIik7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cy5wdXNoKFwiZnJvbSBcIiwgcGF0aC5jYWxsKHByaW50LCBcInNvdXJjZVwiKSwgc2VtaSk7XG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIjpcbiAgICAgIGNhc2UgXCJFeHBvcnREZWZhdWx0U3BlY2lmaWVyXCI6XG4gICAgICAgIHJldHVybiBwYXRoLmNhbGwocHJpbnQsIFwiZXhwb3J0ZWRcIik7XG5cbiAgICAgIGNhc2UgXCJJbXBvcnREZWNsYXJhdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgcGFydHMucHVzaChcImltcG9ydCBcIik7XG5cbiAgICAgICAgICBpZiAobi5pbXBvcnRLaW5kICYmIG4uaW1wb3J0S2luZCAhPT0gXCJ2YWx1ZVwiKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKG4uaW1wb3J0S2luZCArIFwiIFwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdGFuZGFsb25lcyA9IFtdO1xuICAgICAgICAgIGNvbnN0IGdyb3VwZWQgPSBbXTtcblxuICAgICAgICAgIGlmIChuLnNwZWNpZmllcnMgJiYgbi5zcGVjaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBhdGguZWFjaChzcGVjaWZpZXJQYXRoID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGVjaWZpZXJQYXRoLmdldFZhbHVlKCk7XG5cbiAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09IFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiIHx8IHZhbHVlLnR5cGUgPT09IFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpIHtcbiAgICAgICAgICAgICAgICBzdGFuZGFsb25lcy5wdXNoKHByaW50KHNwZWNpZmllclBhdGgpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBncm91cGVkLnB1c2gocHJpbnQoc3BlY2lmaWVyUGF0aCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBcInNwZWNpZmllcnNcIik7XG5cbiAgICAgICAgICAgIGlmIChzdGFuZGFsb25lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goam9pbiQ5KFwiLCBcIiwgc3RhbmRhbG9uZXMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0YW5kYWxvbmVzLmxlbmd0aCA+IDAgJiYgZ3JvdXBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goXCIsIFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdyb3VwZWQubGVuZ3RoID09PSAxICYmIHN0YW5kYWxvbmVzLmxlbmd0aCA9PT0gMCAmJiBuLnNwZWNpZmllcnMgJiYgIW4uc3BlY2lmaWVycy5zb21lKG5vZGUgPT4gbm9kZS5jb21tZW50cykpIHtcbiAgICAgICAgICAgICAgcGFydHMucHVzaChjb25jYXQkZChbXCJ7XCIsIG9wdGlvbnMuYnJhY2tldFNwYWNpbmcgPyBcIiBcIiA6IFwiXCIsIGNvbmNhdCRkKGdyb3VwZWQpLCBvcHRpb25zLmJyYWNrZXRTcGFjaW5nID8gXCIgXCIgOiBcIlwiLCBcIn1cIl0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXBlZC5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGdyb3VwJGIoY29uY2F0JGQoW1wie1wiLCBpbmRlbnQkNyhjb25jYXQkZChbb3B0aW9ucy5icmFja2V0U3BhY2luZyA/IGxpbmUkOSA6IHNvZnRsaW5lJDYsIGpvaW4kOShjb25jYXQkZChbXCIsXCIsIGxpbmUkOV0pLCBncm91cGVkKV0pKSwgaWZCcmVhayQ2KHNob3VsZFByaW50Q29tbWEkMShvcHRpb25zKSA/IFwiLFwiIDogXCJcIiksIG9wdGlvbnMuYnJhY2tldFNwYWNpbmcgPyBsaW5lJDkgOiBzb2Z0bGluZSQ2LCBcIn1cIl0pKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCIgZnJvbSBcIik7XG4gICAgICAgICAgfSBlbHNlIGlmIChuLmltcG9ydEtpbmQgJiYgbi5pbXBvcnRLaW5kID09PSBcInR5cGVcIiB8fCAvLyBpbXBvcnQge30gZnJvbSAneCdcbiAgICAgICAgICAve1xccyp9Ly50ZXN0KG9wdGlvbnMub3JpZ2luYWxUZXh0LnNsaWNlKG9wdGlvbnMubG9jU3RhcnQobiksIG9wdGlvbnMubG9jU3RhcnQobi5zb3VyY2UpKSkpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCJ7fSBmcm9tIFwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcmludCwgXCJzb3VyY2VcIiksIHNlbWkpO1xuICAgICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkltcG9ydFwiOlxuICAgICAgICByZXR1cm4gXCJpbXBvcnRcIjtcblxuICAgICAgY2FzZSBcIlRTTW9kdWxlQmxvY2tcIjpcbiAgICAgIGNhc2UgXCJCbG9ja1N0YXRlbWVudFwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgbmFrZWQgPSBwYXRoLmNhbGwoYm9keVBhdGggPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByaW50U3RhdGVtZW50U2VxdWVuY2UoYm9keVBhdGgsIG9wdGlvbnMsIHByaW50KTtcbiAgICAgICAgICB9LCBcImJvZHlcIik7XG4gICAgICAgICAgY29uc3QgaGFzQ29udGVudCA9IG4uYm9keS5maW5kKG5vZGUgPT4gbm9kZS50eXBlICE9PSBcIkVtcHR5U3RhdGVtZW50XCIpO1xuICAgICAgICAgIGNvbnN0IGhhc0RpcmVjdGl2ZXMgPSBuLmRpcmVjdGl2ZXMgJiYgbi5kaXJlY3RpdmVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgICAgICAgY29uc3QgcGFyZW50UGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKDEpO1xuXG4gICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmICFoYXNEaXJlY3RpdmVzICYmICFoYXNEYW5nbGluZ0NvbW1lbnRzJDEobikgJiYgKHBhcmVudC50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiIHx8IHBhcmVudC50eXBlID09PSBcIk9iamVjdE1ldGhvZFwiIHx8IHBhcmVudC50eXBlID09PSBcIkNsYXNzTWV0aG9kXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiRm9yU3RhdGVtZW50XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiV2hpbGVTdGF0ZW1lbnRcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJEb1doaWxlU3RhdGVtZW50XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiRG9FeHByZXNzaW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiQ2F0Y2hDbGF1c2VcIiAmJiAhcGFyZW50UGFyZW50LmZpbmFsaXplciB8fCBwYXJlbnQudHlwZSA9PT0gXCJUU01vZHVsZURlY2xhcmF0aW9uXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ7fVwiO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRzLnB1c2goXCJ7XCIpOyAvLyBCYWJlbCA2XG5cbiAgICAgICAgICBpZiAoaGFzRGlyZWN0aXZlcykge1xuICAgICAgICAgICAgcGF0aC5lYWNoKGNoaWxkUGF0aCA9PiB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goaW5kZW50JDcoY29uY2F0JGQoW2hhcmRsaW5lJDksIHByaW50KGNoaWxkUGF0aCksIHNlbWldKSkpO1xuXG4gICAgICAgICAgICAgIGlmIChpc05leHRMaW5lRW1wdHkkNChvcHRpb25zLm9yaWdpbmFsVGV4dCwgY2hpbGRQYXRoLmdldFZhbHVlKCksIG9wdGlvbnMubG9jRW5kKSkge1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goaGFyZGxpbmUkOSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIFwiZGlyZWN0aXZlc1wiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ29udGVudCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChpbmRlbnQkNyhjb25jYXQkZChbaGFyZGxpbmUkOSwgbmFrZWRdKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRzLnB1c2goY29tbWVudHMucHJpbnREYW5nbGluZ0NvbW1lbnRzKHBhdGgsIG9wdGlvbnMpKTtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGhhcmRsaW5lJDksIFwifVwiKTtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJSZXR1cm5TdGF0ZW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcInJldHVyblwiLCBwcmludFJldHVybkFuZFRocm93QXJndW1lbnQocGF0aCwgb3B0aW9ucywgcHJpbnQpXSk7XG5cbiAgICAgIGNhc2UgXCJOZXdFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIkNhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBpc05ldyA9IG4udHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCI7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uYWwgPSBwcmludE9wdGlvbmFsVG9rZW4ocGF0aCk7XG5cbiAgICAgICAgICBpZiAoIC8vIFdlIHdhbnQgdG8ga2VlcCBDb21tb25KUy0gYW5kIEFNRC1zdHlsZSByZXF1aXJlIGNhbGxzLCBhbmQgQU1ELXN0eWxlXG4gICAgICAgICAgLy8gZGVmaW5lIGNhbGxzLCBhcyBhIHVuaXQuXG4gICAgICAgICAgLy8gZS5nLiBgZGVmaW5lKFtcInNvbWUvbGliXCIsIChsaWIpID0+IHtgXG4gICAgICAgICAgIWlzTmV3ICYmIG4uY2FsbGVlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIChuLmNhbGxlZS5uYW1lID09PSBcInJlcXVpcmVcIiB8fCBuLmNhbGxlZS5uYW1lID09PSBcImRlZmluZVwiKSB8fCAvLyBUZW1wbGF0ZSBsaXRlcmFscyBhcyBzaW5nbGUgYXJndW1lbnRzXG4gICAgICAgICAgbi5hcmd1bWVudHMubGVuZ3RoID09PSAxICYmIGlzVGVtcGxhdGVPbkl0c093bkxpbmUkMShuLmFyZ3VtZW50c1swXSwgb3B0aW9ucy5vcmlnaW5hbFRleHQsIG9wdGlvbnMpIHx8IC8vIEtlZXAgdGVzdCBkZWNsYXJhdGlvbnMgb24gYSBzaW5nbGUgbGluZVxuICAgICAgICAgIC8vIGUuZy4gYGl0KCdsb25nIG5hbWUnLCAoKSA9PiB7YFxuICAgICAgICAgICFpc05ldyAmJiBpc1Rlc3RDYWxsJDEobiwgcGF0aC5nZXRQYXJlbnROb2RlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGQoW2lzTmV3ID8gXCJuZXcgXCIgOiBcIlwiLCBwYXRoLmNhbGwocHJpbnQsIFwiY2FsbGVlXCIpLCBvcHRpb25hbCwgcHJpbnRGdW5jdGlvblR5cGVQYXJhbWV0ZXJzKHBhdGgsIG9wdGlvbnMsIHByaW50KSwgY29uY2F0JGQoW1wiKFwiLCBqb2luJDkoXCIsIFwiLCBwYXRoLm1hcChwcmludCwgXCJhcmd1bWVudHNcIikpLCBcIilcIl0pXSk7XG4gICAgICAgICAgfSAvLyBJbmxpbmUgRmxvdyBhbm5vdGF0aW9uIGNvbW1lbnRzIGZvbGxvd2luZyBJZGVudGlmaWVycyBpbiBDYWxsIG5vZGVzIG5lZWQgdG9cbiAgICAgICAgICAvLyBzdGF5IHdpdGggdGhlIElkZW50aWZpZXIuIEZvciBleGFtcGxlOlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gZm9vIC8qOjogPFNvbWVHZW5lcmljPiAqLyhiYXIpO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSGVyZSwgd2UgZW5zdXJlIHRoYXQgc3VjaCBjb21tZW50cyBzdGF5IGJldHdlZW4gdGhlIElkZW50aWZpZXIgYW5kIHRoZSBDYWxsZWUuXG5cblxuICAgICAgICAgIGNvbnN0IGlzSWRlbnRpZmllcldpdGhGbG93QW5ub3RhdGlvbiA9IG4uY2FsbGVlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIGhhc0Zsb3dBbm5vdGF0aW9uQ29tbWVudCQxKG4uY2FsbGVlLnRyYWlsaW5nQ29tbWVudHMpO1xuXG4gICAgICAgICAgaWYgKGlzSWRlbnRpZmllcldpdGhGbG93QW5ub3RhdGlvbikge1xuICAgICAgICAgICAgbi5jYWxsZWUudHJhaWxpbmdDb21tZW50c1swXS5wcmludGVkID0gdHJ1ZTtcbiAgICAgICAgICB9IC8vIFdlIGRldGVjdCBjYWxscyBvbiBtZW1iZXIgbG9va3VwcyBhbmQgcG9zc2libHkgcHJpbnQgdGhlbSBpbiBhXG4gICAgICAgICAgLy8gc3BlY2lhbCBjaGFpbiBmb3JtYXQuIFNlZSBgcHJpbnRNZW1iZXJDaGFpbmAgZm9yIG1vcmUgaW5mby5cblxuXG4gICAgICAgICAgaWYgKCFpc05ldyAmJiBpc01lbWJlcmlzaCQxKG4uY2FsbGVlKSAmJiAhcGF0aC5jYWxsKHBhdGggPT4gbmVlZHNQYXJlbnNfMShwYXRoLCBvcHRpb25zKSwgXCJjYWxsZWVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBwcmludE1lbWJlckNoYWluKHBhdGgsIG9wdGlvbnMsIHByaW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50cyA9IGNvbmNhdCRkKFtpc05ldyA/IFwibmV3IFwiIDogXCJcIiwgcGF0aC5jYWxsKHByaW50LCBcImNhbGxlZVwiKSwgb3B0aW9uYWwsIGlzSWRlbnRpZmllcldpdGhGbG93QW5ub3RhdGlvbiA/IFwiLyo6OiBcIi5jb25jYXQobi5jYWxsZWUudHJhaWxpbmdDb21tZW50c1swXS52YWx1ZS5zbGljZSgyKS50cmltKCksIFwiICovXCIpIDogXCJcIiwgcHJpbnRGdW5jdGlvblR5cGVQYXJhbWV0ZXJzKHBhdGgsIG9wdGlvbnMsIHByaW50KSwgcHJpbnRBcmd1bWVudHNMaXN0KHBhdGgsIG9wdGlvbnMsIHByaW50KV0pOyAvLyBXZSBncm91cCBoZXJlIHdoZW4gdGhlIGNhbGxlZSBpcyBpdHNlbGYgYSBjYWxsIGV4cHJlc3Npb24uXG4gICAgICAgICAgLy8gU2VlIGBpc0xvbmdDdXJyaWVkQ2FsbEV4cHJlc3Npb25gIGZvciBtb3JlIGluZm8uXG5cbiAgICAgICAgICBpZiAoaXNDYWxsT3JPcHRpb25hbENhbGxFeHByZXNzaW9uJDEobi5jYWxsZWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb250ZW50cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJUU0ludGVyZmFjZURlY2xhcmF0aW9uXCI6XG4gICAgICAgIGlmIChuLmRlY2xhcmUpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiZGVjbGFyZSBcIik7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cy5wdXNoKG4uYWJzdHJhY3QgPyBcImFic3RyYWN0IFwiIDogXCJcIiwgcHJpbnRUeXBlU2NyaXB0TW9kaWZpZXJzKHBhdGgsIG9wdGlvbnMsIHByaW50KSwgXCJpbnRlcmZhY2UgXCIsIHBhdGguY2FsbChwcmludCwgXCJpZFwiKSwgbi50eXBlUGFyYW1ldGVycyA/IHBhdGguY2FsbChwcmludCwgXCJ0eXBlUGFyYW1ldGVyc1wiKSA6IFwiXCIsIFwiIFwiKTtcblxuICAgICAgICBpZiAobi5leHRlbmRzICYmIG4uZXh0ZW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGdyb3VwJGIoaW5kZW50JDcoY29uY2F0JGQoW3NvZnRsaW5lJDYsIFwiZXh0ZW5kcyBcIiwgKG4uZXh0ZW5kcy5sZW5ndGggPT09IDEgPyBpZGVudGl0eSQyIDogaW5kZW50JDcpKGpvaW4kOShjb25jYXQkZChbXCIsXCIsIGxpbmUkOV0pLCBwYXRoLm1hcChwcmludCwgXCJleHRlbmRzXCIpKSksIFwiIFwiXSkpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcmludCwgXCJib2R5XCIpKTtcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcblxuICAgICAgY2FzZSBcIk9iamVjdFR5cGVJbnRlcm5hbFNsb3RcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtuLnN0YXRpYyA/IFwic3RhdGljIFwiIDogXCJcIiwgXCJbW1wiLCBwYXRoLmNhbGwocHJpbnQsIFwiaWRcIiksIFwiXV1cIiwgcHJpbnRPcHRpb25hbFRva2VuKHBhdGgpLCBuLm1ldGhvZCA/IFwiXCIgOiBcIjogXCIsIHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKV0pO1xuXG4gICAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICAgIGNhc2UgXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgY2FzZSBcIlRTSW50ZXJmYWNlQm9keVwiOlxuICAgICAgY2FzZSBcIlRTVHlwZUxpdGVyYWxcIjpcbiAgICAgICAge1xuICAgICAgICAgIGxldCBwcm9wZXJ0aWVzRmllbGQ7XG5cbiAgICAgICAgICBpZiAobi50eXBlID09PSBcIlRTVHlwZUxpdGVyYWxcIikge1xuICAgICAgICAgICAgcHJvcGVydGllc0ZpZWxkID0gXCJtZW1iZXJzXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChuLnR5cGUgPT09IFwiVFNJbnRlcmZhY2VCb2R5XCIpIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXNGaWVsZCA9IFwiYm9keVwiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzRmllbGQgPSBcInByb3BlcnRpZXNcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc1R5cGVBbm5vdGF0aW9uID0gbi50eXBlID09PSBcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCI7XG4gICAgICAgICAgY29uc3QgZmllbGRzID0gW107XG5cbiAgICAgICAgICBpZiAoaXNUeXBlQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgZmllbGRzLnB1c2goXCJpbmRleGVyc1wiLCBcImNhbGxQcm9wZXJ0aWVzXCIsIFwiaW50ZXJuYWxTbG90c1wiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWVsZHMucHVzaChwcm9wZXJ0aWVzRmllbGQpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0UHJvcGVydHkgPSBmaWVsZHMubWFwKGZpZWxkID0+IG5bZmllbGRdWzBdKS5zb3J0KChhLCBiKSA9PiBvcHRpb25zLmxvY1N0YXJ0KGEpIC0gb3B0aW9ucy5sb2NTdGFydChiKSlbMF07XG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKDApO1xuICAgICAgICAgIGNvbnN0IGlzRmxvd0ludGVyZmFjZUxpa2VCb2R5ID0gaXNUeXBlQW5ub3RhdGlvbiAmJiBwYXJlbnQgJiYgKHBhcmVudC50eXBlID09PSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiRGVjbGFyZUludGVyZmFjZVwiIHx8IHBhcmVudC50eXBlID09PSBcIkRlY2xhcmVDbGFzc1wiKSAmJiBwYXRoLmdldE5hbWUoKSA9PT0gXCJib2R5XCI7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkQnJlYWsgPSBuLnR5cGUgPT09IFwiVFNJbnRlcmZhY2VCb2R5XCIgfHwgaXNGbG93SW50ZXJmYWNlTGlrZUJvZHkgfHwgbi50eXBlID09PSBcIk9iamVjdFBhdHRlcm5cIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgJiYgcGFyZW50LnR5cGUgIT09IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIgJiYgcGFyZW50LnR5cGUgIT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJPYmplY3RNZXRob2RcIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJDbGFzc01ldGhvZFwiICYmIHBhcmVudC50eXBlICE9PSBcIkNsYXNzUHJpdmF0ZU1ldGhvZFwiICYmIHBhcmVudC50eXBlICE9PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIgJiYgcGFyZW50LnR5cGUgIT09IFwiQ2F0Y2hDbGF1c2VcIiAmJiBuLnByb3BlcnRpZXMuc29tZShwcm9wZXJ0eSA9PiBwcm9wZXJ0eS52YWx1ZSAmJiAocHJvcGVydHkudmFsdWUudHlwZSA9PT0gXCJPYmplY3RQYXR0ZXJuXCIgfHwgcHJvcGVydHkudmFsdWUudHlwZSA9PT0gXCJBcnJheVBhdHRlcm5cIikpIHx8IG4udHlwZSAhPT0gXCJPYmplY3RQYXR0ZXJuXCIgJiYgZmlyc3RQcm9wZXJ0eSAmJiBoYXNOZXdsaW5lSW5SYW5nZSQzKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBvcHRpb25zLmxvY1N0YXJ0KG4pLCBvcHRpb25zLmxvY1N0YXJ0KGZpcnN0UHJvcGVydHkpKTtcbiAgICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSBpc0Zsb3dJbnRlcmZhY2VMaWtlQm9keSA/IFwiO1wiIDogbi50eXBlID09PSBcIlRTSW50ZXJmYWNlQm9keVwiIHx8IG4udHlwZSA9PT0gXCJUU1R5cGVMaXRlcmFsXCIgPyBpZkJyZWFrJDYoc2VtaSwgXCI7XCIpIDogXCIsXCI7XG4gICAgICAgICAgY29uc3QgbGVmdEJyYWNlID0gbi5leGFjdCA/IFwie3xcIiA6IFwie1wiO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0QnJhY2UgPSBuLmV4YWN0ID8gXCJ8fVwiIDogXCJ9XCI7IC8vIFVuZm9ydHVuYXRlbHksIHRoaW5ncyBhcmUgZ3JvdXBlZCB0b2dldGhlciBpbiB0aGUgYXN0IGNhbiBiZVxuICAgICAgICAgIC8vIGludGVybGVhdmVkIGluIHRoZSBzb3VyY2UgY29kZS4gU28gd2UgbmVlZCB0byByZW9yZGVyIHRoZW0gYmVmb3JlXG4gICAgICAgICAgLy8gcHJpbnRpbmcgdGhlbS5cblxuICAgICAgICAgIGNvbnN0IHByb3BzQW5kTG9jID0gW107XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgcGF0aC5lYWNoKGNoaWxkUGF0aCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjaGlsZFBhdGguZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgcHJvcHNBbmRMb2MucHVzaCh7XG4gICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICBwcmludGVkOiBwcmludChjaGlsZFBhdGgpLFxuICAgICAgICAgICAgICAgIGxvYzogb3B0aW9ucy5sb2NTdGFydChub2RlKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGZpZWxkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXQgc2VwYXJhdG9yUGFydHMgPSBbXTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHByb3BzQW5kTG9jLnNvcnQoKGEsIGIpID0+IGEubG9jIC0gYi5sb2MpLm1hcChwcm9wID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNhdCRkKHNlcGFyYXRvclBhcnRzLmNvbmNhdChncm91cCRiKHByb3AucHJpbnRlZCkpKTtcbiAgICAgICAgICAgIHNlcGFyYXRvclBhcnRzID0gW3NlcGFyYXRvciwgbGluZSQ5XTtcblxuICAgICAgICAgICAgaWYgKChwcm9wLm5vZGUudHlwZSA9PT0gXCJUU1Byb3BlcnR5U2lnbmF0dXJlXCIgfHwgcHJvcC5ub2RlLnR5cGUgPT09IFwiVFNNZXRob2RTaWduYXR1cmVcIiB8fCBwcm9wLm5vZGUudHlwZSA9PT0gXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIpICYmIGhhc05vZGVJZ25vcmVDb21tZW50JDIocHJvcC5ub2RlKSkge1xuICAgICAgICAgICAgICBzZXBhcmF0b3JQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNOZXh0TGluZUVtcHR5JDQob3B0aW9ucy5vcmlnaW5hbFRleHQsIHByb3Aubm9kZSwgb3B0aW9ucy5sb2NFbmQpKSB7XG4gICAgICAgICAgICAgIHNlcGFyYXRvclBhcnRzLnB1c2goaGFyZGxpbmUkOSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAobi5pbmV4YWN0KSB7XG4gICAgICAgICAgICBsZXQgcHJpbnRlZDtcblxuICAgICAgICAgICAgaWYgKGhhc0RhbmdsaW5nQ29tbWVudHMkMShuKSkge1xuICAgICAgICAgICAgICBjb25zdCBoYXNMaW5lQ29tbWVudHMgPSAhbi5jb21tZW50cy5ldmVyeShjb21tZW50cyQxLmlzQmxvY2tDb21tZW50KTtcbiAgICAgICAgICAgICAgY29uc3QgcHJpbnRlZERhbmdsaW5nQ29tbWVudHMgPSBjb21tZW50cy5wcmludERhbmdsaW5nQ29tbWVudHMocGF0aCwgb3B0aW9ucyxcbiAgICAgICAgICAgICAgLyogc2FtZUluZGVudCAqL1xuICAgICAgICAgICAgICB0cnVlKTtcbiAgICAgICAgICAgICAgcHJpbnRlZCA9IGNvbmNhdCRkKFtwcmludGVkRGFuZ2xpbmdDb21tZW50cywgaGFzTGluZUNvbW1lbnRzIHx8IGhhc05ld2xpbmUkNShvcHRpb25zLm9yaWdpbmFsVGV4dCwgb3B0aW9ucy5sb2NFbmQobi5jb21tZW50c1tuLmNvbW1lbnRzLmxlbmd0aCAtIDFdKSkgPyBoYXJkbGluZSQ5IDogbGluZSQ5LCBcIi4uLlwiXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwcmludGVkID0gXCIuLi5cIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvcHMucHVzaChjb25jYXQkZChzZXBhcmF0b3JQYXJ0cy5jb25jYXQocHJpbnRlZCkpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBsYXN0RWxlbSA9IGdldExhc3QkMyhuW3Byb3BlcnRpZXNGaWVsZF0pO1xuICAgICAgICAgIGNvbnN0IGNhbkhhdmVUcmFpbGluZ1NlcGFyYXRvciA9ICEobi5pbmV4YWN0IHx8IGxhc3RFbGVtICYmIChsYXN0RWxlbS50eXBlID09PSBcIlJlc3RFbGVtZW50XCIgfHwgaGFzTm9kZUlnbm9yZUNvbW1lbnQkMihsYXN0RWxlbSkpKTtcbiAgICAgICAgICBsZXQgY29udGVudDtcblxuICAgICAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmICghaGFzRGFuZ2xpbmdDb21tZW50cyQxKG4pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb25jYXQkZChbbGVmdEJyYWNlLCByaWdodEJyYWNlLCBwcmludFR5cGVBbm5vdGF0aW9uKHBhdGgsIG9wdGlvbnMsIHByaW50KV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250ZW50ID0gZ3JvdXAkYihjb25jYXQkZChbbGVmdEJyYWNlLCBjb21tZW50cy5wcmludERhbmdsaW5nQ29tbWVudHMocGF0aCwgb3B0aW9ucyksIHNvZnRsaW5lJDYsIHJpZ2h0QnJhY2UsIHByaW50T3B0aW9uYWxUb2tlbihwYXRoKSwgcHJpbnRUeXBlQW5ub3RhdGlvbihwYXRoLCBvcHRpb25zLCBwcmludCldKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb25jYXQkZChbbGVmdEJyYWNlLCBpbmRlbnQkNyhjb25jYXQkZChbb3B0aW9ucy5icmFja2V0U3BhY2luZyA/IGxpbmUkOSA6IHNvZnRsaW5lJDYsIGNvbmNhdCRkKHByb3BzKV0pKSwgaWZCcmVhayQ2KGNhbkhhdmVUcmFpbGluZ1NlcGFyYXRvciAmJiAoc2VwYXJhdG9yICE9PSBcIixcIiB8fCBzaG91bGRQcmludENvbW1hJDEob3B0aW9ucykpID8gc2VwYXJhdG9yIDogXCJcIiksIGNvbmNhdCRkKFtvcHRpb25zLmJyYWNrZXRTcGFjaW5nID8gbGluZSQ5IDogc29mdGxpbmUkNiwgcmlnaHRCcmFjZV0pLCBwcmludE9wdGlvbmFsVG9rZW4ocGF0aCksIHByaW50VHlwZUFubm90YXRpb24ocGF0aCwgb3B0aW9ucywgcHJpbnQpXSk7XG4gICAgICAgICAgfSAvLyBJZiB3ZSBpbmxpbmUgdGhlIG9iamVjdCBhcyBmaXJzdCBhcmd1bWVudCBvZiB0aGUgcGFyZW50LCB3ZSBkb24ndCB3YW50XG4gICAgICAgICAgLy8gdG8gY3JlYXRlIGFub3RoZXIgZ3JvdXAgc28gdGhhdCB0aGUgb2JqZWN0IGJyZWFrcyBiZWZvcmUgdGhlIHJldHVyblxuICAgICAgICAgIC8vIHR5cGVcblxuXG4gICAgICAgICAgaWYgKHBhdGgubWF0Y2gobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiT2JqZWN0UGF0dGVyblwiICYmICFub2RlLmRlY29yYXRvcnMsIChub2RlLCBuYW1lLCBudW1iZXIpID0+IHNob3VsZEh1Z0FyZ3VtZW50cyhub2RlKSAmJiAobmFtZSA9PT0gXCJwYXJhbXNcIiB8fCBuYW1lID09PSBcInBhcmFtZXRlcnNcIikgJiYgbnVtYmVyID09PSAwKSB8fCBwYXRoLm1hdGNoKHNob3VsZEh1Z1R5cGUsIChub2RlLCBuYW1lKSA9PiBuYW1lID09PSBcInR5cGVBbm5vdGF0aW9uXCIsIChub2RlLCBuYW1lKSA9PiBuYW1lID09PSBcInR5cGVBbm5vdGF0aW9uXCIsIChub2RlLCBuYW1lLCBudW1iZXIpID0+IHNob3VsZEh1Z0FyZ3VtZW50cyhub2RlKSAmJiAobmFtZSA9PT0gXCJwYXJhbXNcIiB8fCBuYW1lID09PSBcInBhcmFtZXRlcnNcIikgJiYgbnVtYmVyID09PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGdyb3VwJGIoY29udGVudCwge1xuICAgICAgICAgICAgc2hvdWxkQnJlYWtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgLy8gQmFiZWwgNlxuXG4gICAgICBjYXNlIFwiT2JqZWN0UHJvcGVydHlcIjogLy8gTm9uLXN0YW5kYXJkIEFTVCBub2RlIHR5cGUuXG5cbiAgICAgIGNhc2UgXCJQcm9wZXJ0eVwiOlxuICAgICAgICBpZiAobi5tZXRob2QgfHwgbi5raW5kID09PSBcImdldFwiIHx8IG4ua2luZCA9PT0gXCJzZXRcIikge1xuICAgICAgICAgIHJldHVybiBwcmludE1ldGhvZChwYXRoLCBvcHRpb25zLCBwcmludCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobi5zaG9ydGhhbmQpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydHMucHVzaChwcmludEFzc2lnbm1lbnQobi5rZXksIHByaW50UHJvcGVydHlLZXkocGF0aCwgb3B0aW9ucywgcHJpbnQpLCBcIjpcIiwgbi52YWx1ZSwgcGF0aC5jYWxsKHByaW50LCBcInZhbHVlXCIpLCBvcHRpb25zKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuICAgICAgLy8gQmFiZWwgNlxuXG4gICAgICBjYXNlIFwiQ2xhc3NNZXRob2RcIjpcbiAgICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVNZXRob2RcIjpcbiAgICAgIGNhc2UgXCJNZXRob2REZWZpbml0aW9uXCI6XG4gICAgICBjYXNlIFwiVFNBYnN0cmFjdE1ldGhvZERlZmluaXRpb25cIjpcbiAgICAgIGNhc2UgXCJUU0RlY2xhcmVNZXRob2RcIjpcbiAgICAgICAgaWYgKG4uZGVjb3JhdG9ycyAmJiBuLmRlY29yYXRvcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgcGFydHMucHVzaChwcmludERlY29yYXRvcnMocGF0aCwgb3B0aW9ucywgcHJpbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuLmFjY2Vzc2liaWxpdHkpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKG4uYWNjZXNzaWJpbGl0eSArIFwiIFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuLnN0YXRpYykge1xuICAgICAgICAgIHBhcnRzLnB1c2goXCJzdGF0aWMgXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG4udHlwZSA9PT0gXCJUU0Fic3RyYWN0TWV0aG9kRGVmaW5pdGlvblwiIHx8IG4uYWJzdHJhY3QpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiYWJzdHJhY3QgXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaChwcmludE1ldGhvZChwYXRoLCBvcHRpb25zLCBwcmludCkpO1xuICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuXG4gICAgICBjYXNlIFwiT2JqZWN0TWV0aG9kXCI6XG4gICAgICAgIHJldHVybiBwcmludE1ldGhvZChwYXRoLCBvcHRpb25zLCBwcmludCk7XG5cbiAgICAgIGNhc2UgXCJEZWNvcmF0b3JcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcIkBcIiwgcGF0aC5jYWxsKHByaW50LCBcImV4cHJlc3Npb25cIiksIHBhdGguY2FsbChwcmludCwgXCJjYWxsZWVcIildKTtcblxuICAgICAgY2FzZSBcIkFycmF5RXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgICAgICBpZiAobi5lbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAoIWhhc0RhbmdsaW5nQ29tbWVudHMkMShuKSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIltdXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGdyb3VwJGIoY29uY2F0JGQoW1wiW1wiLCBjb21tZW50cy5wcmludERhbmdsaW5nQ29tbWVudHMocGF0aCwgb3B0aW9ucyksIHNvZnRsaW5lJDYsIFwiXVwiXSkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbGFzdEVsZW0gPSBnZXRMYXN0JDMobi5lbGVtZW50cyk7XG4gICAgICAgICAgY29uc3QgY2FuSGF2ZVRyYWlsaW5nQ29tbWEgPSAhKGxhc3RFbGVtICYmIGxhc3RFbGVtLnR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIik7IC8vIEphdmFTY3JpcHQgYWxsb3dzIHlvdSB0byBoYXZlIGVtcHR5IGVsZW1lbnRzIGluIGFuIGFycmF5IHdoaWNoXG4gICAgICAgICAgLy8gY2hhbmdlcyBpdHMgbGVuZ3RoIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29tbWFzLiBUaGUgYWxnb3JpdGhtXG4gICAgICAgICAgLy8gaXMgdGhhdCBpZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBudWxsLCB3ZSBuZWVkIHRvIGZvcmNlIGluc2VydFxuICAgICAgICAgIC8vIGEgY29tbWEgdG8gZW5zdXJlIEphdmFTY3JpcHQgcmVjb2duaXplcyBpdC5cbiAgICAgICAgICAvLyAgIFssXS5sZW5ndGggPT09IDFcbiAgICAgICAgICAvLyAgIFsxLF0ubGVuZ3RoID09PSAxXG4gICAgICAgICAgLy8gICBbMSwsXS5sZW5ndGggPT09IDJcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIE5vdGUgdGhhdCBnZXRMYXN0IHJldHVybnMgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHksIGJ1dFxuICAgICAgICAgIC8vIHdlIGFscmVhZHkgY2hlY2sgZm9yIGFuIGVtcHR5IGFycmF5IGp1c3QgYWJvdmUgc28gd2UgYXJlIHNhZmVcblxuICAgICAgICAgIGNvbnN0IG5lZWRzRm9yY2VkVHJhaWxpbmdDb21tYSA9IGNhbkhhdmVUcmFpbGluZ0NvbW1hICYmIGxhc3RFbGVtID09PSBudWxsO1xuICAgICAgICAgIGNvbnN0IHNob3VsZEJyZWFrID0gbi5lbGVtZW50cy5sZW5ndGggPiAxICYmIG4uZWxlbWVudHMuZXZlcnkoKGVsZW1lbnQsIGksIGVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50VHlwZSA9IGVsZW1lbnQgJiYgZWxlbWVudC50eXBlO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUgIT09IFwiQXJyYXlFeHByZXNzaW9uXCIgJiYgZWxlbWVudFR5cGUgIT09IFwiT2JqZWN0RXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBlbGVtZW50c1tpICsgMV07XG5cbiAgICAgICAgICAgIGlmIChuZXh0RWxlbWVudCAmJiBlbGVtZW50VHlwZSAhPT0gbmV4dEVsZW1lbnQudHlwZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zS2V5ID0gZWxlbWVudFR5cGUgPT09IFwiQXJyYXlFeHByZXNzaW9uXCIgPyBcImVsZW1lbnRzXCIgOiBcInByb3BlcnRpZXNcIjtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50W2l0ZW1zS2V5XSAmJiBlbGVtZW50W2l0ZW1zS2V5XS5sZW5ndGggPiAxO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBhcnRzLnB1c2goZ3JvdXAkYihjb25jYXQkZChbXCJbXCIsIGluZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBwcmludEFycmF5SXRlbXMocGF0aCwgb3B0aW9ucywgXCJlbGVtZW50c1wiLCBwcmludCldKSksIG5lZWRzRm9yY2VkVHJhaWxpbmdDb21tYSA/IFwiLFwiIDogXCJcIiwgaWZCcmVhayQ2KGNhbkhhdmVUcmFpbGluZ0NvbW1hICYmICFuZWVkc0ZvcmNlZFRyYWlsaW5nQ29tbWEgJiYgc2hvdWxkUHJpbnRDb21tYSQxKG9wdGlvbnMpID8gXCIsXCIgOiBcIlwiKSwgY29tbWVudHMucHJpbnREYW5nbGluZ0NvbW1lbnRzKHBhdGgsIG9wdGlvbnMsXG4gICAgICAgICAgLyogc2FtZUluZGVudCAqL1xuICAgICAgICAgIHRydWUpLCBzb2Z0bGluZSQ2LCBcIl1cIl0pLCB7XG4gICAgICAgICAgICBzaG91bGRCcmVha1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcnRzLnB1c2gocHJpbnRPcHRpb25hbFRva2VuKHBhdGgpLCBwcmludFR5cGVBbm5vdGF0aW9uKHBhdGgsIG9wdGlvbnMsIHByaW50KSk7XG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJTZXF1ZW5jZUV4cHJlc3Npb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgwKTtcblxuICAgICAgICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiRm9yU3RhdGVtZW50XCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBFeHByZXNzaW9uU3RhdGVtZW50cyBhbmQgZm9yLWxvb3AgaGVhZHMsIHdoaWNoIGFyZSBhbW9uZ1xuICAgICAgICAgICAgLy8gdGhlIGZldyBwbGFjZXMgYSBTZXF1ZW5jZUV4cHJlc3Npb24gYXBwZWFycyB1bnBhcmVudGhlc2l6ZWQsIHdlIHdhbnRcbiAgICAgICAgICAgIC8vIHRvIGluZGVudCBleHByZXNzaW9ucyBhZnRlciB0aGUgZmlyc3QuXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgICAgICAgICAgcGF0aC5lYWNoKHAgPT4ge1xuICAgICAgICAgICAgICBpZiAocC5nZXROYW1lKCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHByaW50KHApKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFwiLFwiLCBpbmRlbnQkNyhjb25jYXQkZChbbGluZSQ5LCBwcmludChwKV0pKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIFwiZXhwcmVzc2lvbnNcIik7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChwYXJ0cykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKFtqb2luJDkoY29uY2F0JGQoW1wiLFwiLCBsaW5lJDldKSwgcGF0aC5tYXAocHJpbnQsIFwiZXhwcmVzc2lvbnNcIikpXSkpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJUaGlzRXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gXCJ0aGlzXCI7XG5cbiAgICAgIGNhc2UgXCJTdXBlclwiOlxuICAgICAgICByZXR1cm4gXCJzdXBlclwiO1xuXG4gICAgICBjYXNlIFwiTnVsbExpdGVyYWxcIjpcbiAgICAgICAgLy8gQmFiZWwgNiBMaXRlcmFsIHNwbGl0XG4gICAgICAgIHJldHVybiBcIm51bGxcIjtcblxuICAgICAgY2FzZSBcIlJlZ0V4cExpdGVyYWxcIjpcbiAgICAgICAgLy8gQmFiZWwgNiBMaXRlcmFsIHNwbGl0XG4gICAgICAgIHJldHVybiBwcmludFJlZ2V4KG4pO1xuXG4gICAgICBjYXNlIFwiTnVtZXJpY0xpdGVyYWxcIjpcbiAgICAgICAgLy8gQmFiZWwgNiBMaXRlcmFsIHNwbGl0XG4gICAgICAgIHJldHVybiBwcmludE51bWJlciQyKG4uZXh0cmEucmF3KTtcblxuICAgICAgY2FzZSBcIkJpZ0ludExpdGVyYWxcIjpcbiAgICAgICAgLy8gYmFiZWw6IG4uZXh0cmEucmF3LCB0eXBlc2NyaXB0OiBuLnJhdywgZmxvdzogbi5iaWdpbnRcbiAgICAgICAgcmV0dXJuIChuLmJpZ2ludCB8fCAobi5leHRyYSA/IG4uZXh0cmEucmF3IDogbi5yYXcpKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBjYXNlIFwiQm9vbGVhbkxpdGVyYWxcIjogLy8gQmFiZWwgNiBMaXRlcmFsIHNwbGl0XG5cbiAgICAgIGNhc2UgXCJTdHJpbmdMaXRlcmFsXCI6IC8vIEJhYmVsIDYgTGl0ZXJhbCBzcGxpdFxuXG4gICAgICBjYXNlIFwiTGl0ZXJhbFwiOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKG4ucmVnZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBwcmludFJlZ2V4KG4ucmVnZXgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2Ygbi52YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHByaW50TnVtYmVyJDIobi5yYXcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2Ygbi52YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBuLnZhbHVlO1xuICAgICAgICAgIH0gLy8gVHlwZVNjcmlwdCB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSmFtZXNIZW5yeS90eXBlc2NyaXB0LWVzdHJlZS9pc3N1ZXMvMlxuICAgICAgICAgIC8vIFNlZSBjb3JyZXNwb25kaW5nIHdvcmthcm91bmQgaW4gbmVlZHMtcGFyZW5zLmpzXG5cblxuICAgICAgICAgIGNvbnN0IGdyYW5kUGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKDEpO1xuICAgICAgICAgIGNvbnN0IGlzVHlwZVNjcmlwdERpcmVjdGl2ZSA9IG9wdGlvbnMucGFyc2VyID09PSBcInR5cGVzY3JpcHRcIiAmJiB0eXBlb2Ygbi52YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBncmFuZFBhcmVudCAmJiAoZ3JhbmRQYXJlbnQudHlwZSA9PT0gXCJQcm9ncmFtXCIgfHwgZ3JhbmRQYXJlbnQudHlwZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiKTtcbiAgICAgICAgICByZXR1cm4gbm9kZVN0cihuLCBvcHRpb25zLCBpc1R5cGVTY3JpcHREaXJlY3RpdmUpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJEaXJlY3RpdmVcIjpcbiAgICAgICAgcmV0dXJuIHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKTtcbiAgICAgIC8vIEJhYmVsIDZcblxuICAgICAgY2FzZSBcIkRpcmVjdGl2ZUxpdGVyYWxcIjpcbiAgICAgICAgcmV0dXJuIG5vZGVTdHIobiwgb3B0aW9ucyk7XG5cbiAgICAgIGNhc2UgXCJVbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgcGFydHMucHVzaChuLm9wZXJhdG9yKTtcblxuICAgICAgICBpZiAoL1thLXpdJC8udGVzdChuLm9wZXJhdG9yKSkge1xuICAgICAgICAgIHBhcnRzLnB1c2goXCIgXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG4uYXJndW1lbnQuY29tbWVudHMgJiYgbi5hcmd1bWVudC5jb21tZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcGFydHMucHVzaChncm91cCRiKGNvbmNhdCRkKFtcIihcIiwgaW5kZW50JDcoY29uY2F0JGQoW3NvZnRsaW5lJDYsIHBhdGguY2FsbChwcmludCwgXCJhcmd1bWVudFwiKV0pKSwgc29mdGxpbmUkNiwgXCIpXCJdKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnRzLnB1c2gocGF0aC5jYWxsKHByaW50LCBcImFyZ3VtZW50XCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJVcGRhdGVFeHByZXNzaW9uXCI6XG4gICAgICAgIHBhcnRzLnB1c2gocGF0aC5jYWxsKHByaW50LCBcImFyZ3VtZW50XCIpLCBuLm9wZXJhdG9yKTtcblxuICAgICAgICBpZiAobi5wcmVmaXgpIHtcbiAgICAgICAgICBwYXJ0cy5yZXZlcnNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuXG4gICAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBwcmludFRlcm5hcnlPcGVyYXRvcihwYXRoLCBvcHRpb25zLCBwcmludCwge1xuICAgICAgICAgIGJlZm9yZVBhcnRzOiAoKSA9PiBbcGF0aC5jYWxsKHByaW50LCBcInRlc3RcIildLFxuICAgICAgICAgIGFmdGVyUGFydHM6IGJyZWFrQ2xvc2luZ1BhcmVuID0+IFticmVha0Nsb3NpbmdQYXJlbiA/IHNvZnRsaW5lJDYgOiBcIlwiXSxcbiAgICAgICAgICBzaG91bGRDaGVja0pzeDogdHJ1ZSxcbiAgICAgICAgICBjb25kaXRpb25hbE5vZGVUeXBlOiBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiLFxuICAgICAgICAgIGNvbnNlcXVlbnROb2RlUHJvcGVydHlOYW1lOiBcImNvbnNlcXVlbnRcIixcbiAgICAgICAgICBhbHRlcm5hdGVOb2RlUHJvcGVydHlOYW1lOiBcImFsdGVybmF0ZVwiLFxuICAgICAgICAgIHRlc3ROb2RlUHJvcGVydHlOYW1lczogW1widGVzdFwiXVxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHByaW50ZWQgPSBwYXRoLm1hcChjaGlsZFBhdGggPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByaW50KGNoaWxkUGF0aCk7XG4gICAgICAgICAgfSwgXCJkZWNsYXJhdGlvbnNcIik7IC8vIFdlIGdlbmVyYWxseSB3YW50IHRvIHRlcm1pbmF0ZSBhbGwgdmFyaWFibGUgZGVjbGFyYXRpb25zIHdpdGggYVxuICAgICAgICAgIC8vIHNlbWljb2xvbiwgZXhjZXB0IHdoZW4gdGhleSBpbiB0aGUgKCkgcGFydCBvZiBmb3IgbG9vcHMuXG5cbiAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgICAgICAgY29uc3QgaXNQYXJlbnRGb3JMb29wID0gcGFyZW50Tm9kZS50eXBlID09PSBcIkZvclN0YXRlbWVudFwiIHx8IHBhcmVudE5vZGUudHlwZSA9PT0gXCJGb3JJblN0YXRlbWVudFwiIHx8IHBhcmVudE5vZGUudHlwZSA9PT0gXCJGb3JPZlN0YXRlbWVudFwiO1xuICAgICAgICAgIGNvbnN0IGhhc1ZhbHVlID0gbi5kZWNsYXJhdGlvbnMuc29tZShkZWNsID0+IGRlY2wuaW5pdCk7XG4gICAgICAgICAgbGV0IGZpcnN0VmFyaWFibGU7XG5cbiAgICAgICAgICBpZiAocHJpbnRlZC5sZW5ndGggPT09IDEgJiYgIW4uZGVjbGFyYXRpb25zWzBdLmNvbW1lbnRzKSB7XG4gICAgICAgICAgICBmaXJzdFZhcmlhYmxlID0gcHJpbnRlZFswXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByaW50ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gSW5kZW50IGZpcnN0IHZhciB0byBjb21wbHkgd2l0aCBlc2xpbnQgb25lLXZhciBydWxlXG4gICAgICAgICAgICBmaXJzdFZhcmlhYmxlID0gaW5kZW50JDcocHJpbnRlZFswXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFydHMgPSBbbi5kZWNsYXJlID8gXCJkZWNsYXJlIFwiIDogXCJcIiwgbi5raW5kLCBmaXJzdFZhcmlhYmxlID8gY29uY2F0JGQoW1wiIFwiLCBmaXJzdFZhcmlhYmxlXSkgOiBcIlwiLCBpbmRlbnQkNyhjb25jYXQkZChwcmludGVkLnNsaWNlKDEpLm1hcChwID0+IGNvbmNhdCRkKFtcIixcIiwgaGFzVmFsdWUgJiYgIWlzUGFyZW50Rm9yTG9vcCA/IGhhcmRsaW5lJDkgOiBsaW5lJDksIHBdKSkpKV07XG5cbiAgICAgICAgICBpZiAoIShpc1BhcmVudEZvckxvb3AgJiYgcGFyZW50Tm9kZS5ib2R5ICE9PSBuKSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChzZW1pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChwYXJ0cykpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAobi5kZWNsYXJlKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiZGVjbGFyZSBcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcHJpbnRlZCA9IHByaW50QXNzaWdubWVudFJpZ2h0KG4uaWQsIG4udHlwZUFubm90YXRpb24sIG4udHlwZUFubm90YXRpb24gJiYgcGF0aC5jYWxsKHByaW50LCBcInR5cGVBbm5vdGF0aW9uXCIpLCBvcHRpb25zKTtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwidHlwZSBcIiwgcGF0aC5jYWxsKHByaW50LCBcImlkXCIpLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZVBhcmFtZXRlcnNcIiksIFwiID1cIiwgcHJpbnRlZCwgc2VtaSk7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQocGFydHMpKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiVmFyaWFibGVEZWNsYXJhdG9yXCI6XG4gICAgICAgIHJldHVybiBwcmludEFzc2lnbm1lbnQobi5pZCwgcGF0aC5jYWxsKHByaW50LCBcImlkXCIpLCBcIiA9XCIsIG4uaW5pdCwgbi5pbml0ICYmIHBhdGguY2FsbChwcmludCwgXCJpbml0XCIpLCBvcHRpb25zKTtcblxuICAgICAgY2FzZSBcIldpdGhTdGF0ZW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW1wid2l0aCAoXCIsIHBhdGguY2FsbChwcmludCwgXCJvYmplY3RcIiksIFwiKVwiLCBhZGp1c3RDbGF1c2Uobi5ib2R5LCBwYXRoLmNhbGwocHJpbnQsIFwiYm9keVwiKSldKSk7XG5cbiAgICAgIGNhc2UgXCJJZlN0YXRlbWVudFwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgY29uID0gYWRqdXN0Q2xhdXNlKG4uY29uc2VxdWVudCwgcGF0aC5jYWxsKHByaW50LCBcImNvbnNlcXVlbnRcIikpO1xuICAgICAgICAgIGNvbnN0IG9wZW5pbmcgPSBncm91cCRiKGNvbmNhdCRkKFtcImlmIChcIiwgZ3JvdXAkYihjb25jYXQkZChbaW5kZW50JDcoY29uY2F0JGQoW3NvZnRsaW5lJDYsIHBhdGguY2FsbChwcmludCwgXCJ0ZXN0XCIpXSkpLCBzb2Z0bGluZSQ2XSkpLCBcIilcIiwgY29uXSkpO1xuICAgICAgICAgIHBhcnRzLnB1c2gob3BlbmluZyk7XG5cbiAgICAgICAgICBpZiAobi5hbHRlcm5hdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRPbk93bkxpbmUgPSBoYXNUcmFpbGluZ0NvbW1lbnQkMShuLmNvbnNlcXVlbnQpICYmIG4uY29uc2VxdWVudC5jb21tZW50cy5zb21lKGNvbW1lbnQgPT4gY29tbWVudC50cmFpbGluZyAmJiAhY29tbWVudHMkMS5pc0Jsb2NrQ29tbWVudChjb21tZW50KSkgfHwgbmVlZHNIYXJkbGluZUFmdGVyRGFuZ2xpbmdDb21tZW50JDEobik7XG4gICAgICAgICAgICBjb25zdCBlbHNlT25TYW1lTGluZSA9IG4uY29uc2VxdWVudC50eXBlID09PSBcIkJsb2NrU3RhdGVtZW50XCIgJiYgIWNvbW1lbnRPbk93bkxpbmU7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGVsc2VPblNhbWVMaW5lID8gXCIgXCIgOiBoYXJkbGluZSQ5KTtcblxuICAgICAgICAgICAgaWYgKGhhc0RhbmdsaW5nQ29tbWVudHMkMShuKSkge1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGNvbW1lbnRzLnByaW50RGFuZ2xpbmdDb21tZW50cyhwYXRoLCBvcHRpb25zLCB0cnVlKSwgY29tbWVudE9uT3duTGluZSA/IGhhcmRsaW5lJDkgOiBcIiBcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCJlbHNlXCIsIGdyb3VwJGIoYWRqdXN0Q2xhdXNlKG4uYWx0ZXJuYXRlLCBwYXRoLmNhbGwocHJpbnQsIFwiYWx0ZXJuYXRlXCIpLCBuLmFsdGVybmF0ZS50eXBlID09PSBcIklmU3RhdGVtZW50XCIpKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiRm9yU3RhdGVtZW50XCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gYWRqdXN0Q2xhdXNlKG4uYm9keSwgcGF0aC5jYWxsKHByaW50LCBcImJvZHlcIikpOyAvLyBXZSB3YW50IHRvIGtlZXAgZGFuZ2xpbmcgY29tbWVudHMgYWJvdmUgdGhlIGxvb3AgdG8gc3RheSBjb25zaXN0ZW50LlxuICAgICAgICAgIC8vIEFueSBjb21tZW50IHBvc2l0aW9uZWQgYmV0d2VlbiB0aGUgZm9yIHN0YXRlbWVudCBhbmQgdGhlIHBhcmVudGhlc2VzXG4gICAgICAgICAgLy8gaXMgZ29pbmcgdG8gYmUgcHJpbnRlZCBiZWZvcmUgdGhlIHN0YXRlbWVudC5cblxuICAgICAgICAgIGNvbnN0IGRhbmdsaW5nID0gY29tbWVudHMucHJpbnREYW5nbGluZ0NvbW1lbnRzKHBhdGgsIG9wdGlvbnMsXG4gICAgICAgICAgLyogc2FtZUxpbmUgKi9cbiAgICAgICAgICB0cnVlKTtcbiAgICAgICAgICBjb25zdCBwcmludGVkQ29tbWVudHMgPSBkYW5nbGluZyA/IGNvbmNhdCRkKFtkYW5nbGluZywgc29mdGxpbmUkNl0pIDogXCJcIjtcblxuICAgICAgICAgIGlmICghbi5pbml0ICYmICFuLnRlc3QgJiYgIW4udXBkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGQoW3ByaW50ZWRDb21tZW50cywgZ3JvdXAkYihjb25jYXQkZChbXCJmb3IgKDs7KVwiLCBib2R5XSkpXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwcmludGVkQ29tbWVudHMsIGdyb3VwJGIoY29uY2F0JGQoW1wiZm9yIChcIiwgZ3JvdXAkYihjb25jYXQkZChbaW5kZW50JDcoY29uY2F0JGQoW3NvZnRsaW5lJDYsIHBhdGguY2FsbChwcmludCwgXCJpbml0XCIpLCBcIjtcIiwgbGluZSQ5LCBwYXRoLmNhbGwocHJpbnQsIFwidGVzdFwiKSwgXCI7XCIsIGxpbmUkOSwgcGF0aC5jYWxsKHByaW50LCBcInVwZGF0ZVwiKV0pKSwgc29mdGxpbmUkNl0pKSwgXCIpXCIsIGJvZHldKSldKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiV2hpbGVTdGF0ZW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW1wid2hpbGUgKFwiLCBncm91cCRiKGNvbmNhdCRkKFtpbmRlbnQkNyhjb25jYXQkZChbc29mdGxpbmUkNiwgcGF0aC5jYWxsKHByaW50LCBcInRlc3RcIildKSksIHNvZnRsaW5lJDZdKSksIFwiKVwiLCBhZGp1c3RDbGF1c2Uobi5ib2R5LCBwYXRoLmNhbGwocHJpbnQsIFwiYm9keVwiKSldKSk7XG5cbiAgICAgIGNhc2UgXCJGb3JJblN0YXRlbWVudFwiOlxuICAgICAgICAvLyBOb3RlOiBlc3ByaW1hIGNhbid0IGFjdHVhbGx5IHBhcnNlIFwiZm9yIGVhY2ggKFwiLlxuICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChbbi5lYWNoID8gXCJmb3IgZWFjaCAoXCIgOiBcImZvciAoXCIsIHBhdGguY2FsbChwcmludCwgXCJsZWZ0XCIpLCBcIiBpbiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInJpZ2h0XCIpLCBcIilcIiwgYWRqdXN0Q2xhdXNlKG4uYm9keSwgcGF0aC5jYWxsKHByaW50LCBcImJvZHlcIikpXSkpO1xuXG4gICAgICBjYXNlIFwiRm9yT2ZTdGF0ZW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW1wiZm9yXCIsIG4uYXdhaXQgPyBcIiBhd2FpdFwiIDogXCJcIiwgXCIgKFwiLCBwYXRoLmNhbGwocHJpbnQsIFwibGVmdFwiKSwgXCIgb2YgXCIsIHBhdGguY2FsbChwcmludCwgXCJyaWdodFwiKSwgXCIpXCIsIGFkanVzdENsYXVzZShuLmJvZHksIHBhdGguY2FsbChwcmludCwgXCJib2R5XCIpKV0pKTtcblxuICAgICAgY2FzZSBcIkRvV2hpbGVTdGF0ZW1lbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IGNsYXVzZSA9IGFkanVzdENsYXVzZShuLmJvZHksIHBhdGguY2FsbChwcmludCwgXCJib2R5XCIpKTtcbiAgICAgICAgICBjb25zdCBkb0JvZHkgPSBncm91cCRiKGNvbmNhdCRkKFtcImRvXCIsIGNsYXVzZV0pKTtcbiAgICAgICAgICBwYXJ0cyA9IFtkb0JvZHldO1xuXG4gICAgICAgICAgaWYgKG4uYm9keS50eXBlID09PSBcIkJsb2NrU3RhdGVtZW50XCIpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCIgXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGhhcmRsaW5lJDkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRzLnB1c2goXCJ3aGlsZSAoXCIpO1xuICAgICAgICAgIHBhcnRzLnB1c2goZ3JvdXAkYihjb25jYXQkZChbaW5kZW50JDcoY29uY2F0JGQoW3NvZnRsaW5lJDYsIHBhdGguY2FsbChwcmludCwgXCJ0ZXN0XCIpXSkpLCBzb2Z0bGluZSQ2XSkpLCBcIilcIiwgc2VtaSk7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiRG9FeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJkbyBcIiwgcGF0aC5jYWxsKHByaW50LCBcImJvZHlcIildKTtcblxuICAgICAgY2FzZSBcIkJyZWFrU3RhdGVtZW50XCI6XG4gICAgICAgIHBhcnRzLnB1c2goXCJicmVha1wiKTtcblxuICAgICAgICBpZiAobi5sYWJlbCkge1xuICAgICAgICAgIHBhcnRzLnB1c2goXCIgXCIsIHBhdGguY2FsbChwcmludCwgXCJsYWJlbFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cy5wdXNoKHNlbWkpO1xuICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuXG4gICAgICBjYXNlIFwiQ29udGludWVTdGF0ZW1lbnRcIjpcbiAgICAgICAgcGFydHMucHVzaChcImNvbnRpbnVlXCIpO1xuXG4gICAgICAgIGlmIChuLmxhYmVsKSB7XG4gICAgICAgICAgcGFydHMucHVzaChcIiBcIiwgcGF0aC5jYWxsKHByaW50LCBcImxhYmVsXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcnRzLnB1c2goc2VtaSk7XG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJMYWJlbGVkU3RhdGVtZW50XCI6XG4gICAgICAgIGlmIChuLmJvZHkudHlwZSA9PT0gXCJFbXB0eVN0YXRlbWVudFwiKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwibGFiZWxcIiksIFwiOjtcIl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwibGFiZWxcIiksIFwiOiBcIiwgcGF0aC5jYWxsKHByaW50LCBcImJvZHlcIildKTtcblxuICAgICAgY2FzZSBcIlRyeVN0YXRlbWVudFwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW1widHJ5IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiYmxvY2tcIiksIG4uaGFuZGxlciA/IGNvbmNhdCRkKFtcIiBcIiwgcGF0aC5jYWxsKHByaW50LCBcImhhbmRsZXJcIildKSA6IFwiXCIsIG4uZmluYWxpemVyID8gY29uY2F0JGQoW1wiIGZpbmFsbHkgXCIsIHBhdGguY2FsbChwcmludCwgXCJmaW5hbGl6ZXJcIildKSA6IFwiXCJdKTtcblxuICAgICAgY2FzZSBcIkNhdGNoQ2xhdXNlXCI6XG4gICAgICAgIGlmIChuLnBhcmFtKSB7XG4gICAgICAgICAgY29uc3QgaGFzQ29tbWVudHMgPSBuLnBhcmFtLmNvbW1lbnRzICYmIG4ucGFyYW0uY29tbWVudHMuc29tZShjb21tZW50ID0+ICFjb21tZW50cyQxLmlzQmxvY2tDb21tZW50KGNvbW1lbnQpIHx8IGNvbW1lbnQubGVhZGluZyAmJiBoYXNOZXdsaW5lJDUob3B0aW9ucy5vcmlnaW5hbFRleHQsIG9wdGlvbnMubG9jRW5kKGNvbW1lbnQpKSB8fCBjb21tZW50LnRyYWlsaW5nICYmIGhhc05ld2xpbmUkNShvcHRpb25zLm9yaWdpbmFsVGV4dCwgb3B0aW9ucy5sb2NTdGFydChjb21tZW50KSwge1xuICAgICAgICAgICAgYmFja3dhcmRzOiB0cnVlXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtID0gcGF0aC5jYWxsKHByaW50LCBcInBhcmFtXCIpO1xuICAgICAgICAgIHJldHVybiBjb25jYXQkZChbXCJjYXRjaCBcIiwgaGFzQ29tbWVudHMgPyBjb25jYXQkZChbXCIoXCIsIGluZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBwYXJhbV0pKSwgc29mdGxpbmUkNiwgXCIpIFwiXSkgOiBjb25jYXQkZChbXCIoXCIsIHBhcmFtLCBcIikgXCJdKSwgcGF0aC5jYWxsKHByaW50LCBcImJvZHlcIildKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJjYXRjaCBcIiwgcGF0aC5jYWxsKHByaW50LCBcImJvZHlcIildKTtcblxuICAgICAgY2FzZSBcIlRocm93U3RhdGVtZW50XCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJ0aHJvd1wiLCBwcmludFJldHVybkFuZFRocm93QXJndW1lbnQocGF0aCwgb3B0aW9ucywgcHJpbnQpXSk7XG4gICAgICAvLyBOb3RlOiBpZ25vcmluZyBuLmxleGljYWwgYmVjYXVzZSBpdCBoYXMgbm8gcHJpbnRpbmcgY29uc2VxdWVuY2VzLlxuXG4gICAgICBjYXNlIFwiU3dpdGNoU3RhdGVtZW50XCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbZ3JvdXAkYihjb25jYXQkZChbXCJzd2l0Y2ggKFwiLCBpbmRlbnQkNyhjb25jYXQkZChbc29mdGxpbmUkNiwgcGF0aC5jYWxsKHByaW50LCBcImRpc2NyaW1pbmFudFwiKV0pKSwgc29mdGxpbmUkNiwgXCIpXCJdKSksIFwiIHtcIiwgbi5jYXNlcy5sZW5ndGggPiAwID8gaW5kZW50JDcoY29uY2F0JGQoW2hhcmRsaW5lJDksIGpvaW4kOShoYXJkbGluZSQ5LCBwYXRoLm1hcChjYXNlUGF0aCA9PiB7XG4gICAgICAgICAgY29uc3QgY2FzZU5vZGUgPSBjYXNlUGF0aC5nZXRWYWx1ZSgpO1xuICAgICAgICAgIHJldHVybiBjb25jYXQkZChbY2FzZVBhdGguY2FsbChwcmludCksIG4uY2FzZXMuaW5kZXhPZihjYXNlTm9kZSkgIT09IG4uY2FzZXMubGVuZ3RoIC0gMSAmJiBpc05leHRMaW5lRW1wdHkkNChvcHRpb25zLm9yaWdpbmFsVGV4dCwgY2FzZU5vZGUsIG9wdGlvbnMubG9jRW5kKSA/IGhhcmRsaW5lJDkgOiBcIlwiXSk7XG4gICAgICAgIH0sIFwiY2FzZXNcIikpXSkpIDogXCJcIiwgaGFyZGxpbmUkOSwgXCJ9XCJdKTtcblxuICAgICAgY2FzZSBcIlN3aXRjaENhc2VcIjpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChuLnRlc3QpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCJjYXNlIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwidGVzdFwiKSwgXCI6XCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiZGVmYXVsdDpcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29uc2VxdWVudCA9IG4uY29uc2VxdWVudC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgIT09IFwiRW1wdHlTdGF0ZW1lbnRcIik7XG5cbiAgICAgICAgICBpZiAoY29uc2VxdWVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjb25zID0gcGF0aC5jYWxsKGNvbnNlcXVlbnRQYXRoID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHByaW50U3RhdGVtZW50U2VxdWVuY2UoY29uc2VxdWVudFBhdGgsIG9wdGlvbnMsIHByaW50KTtcbiAgICAgICAgICAgIH0sIFwiY29uc2VxdWVudFwiKTtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goY29uc2VxdWVudC5sZW5ndGggPT09IDEgJiYgY29uc2VxdWVudFswXS50eXBlID09PSBcIkJsb2NrU3RhdGVtZW50XCIgPyBjb25jYXQkZChbXCIgXCIsIGNvbnNdKSA6IGluZGVudCQ3KGNvbmNhdCRkKFtoYXJkbGluZSQ5LCBjb25zXSkpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuICAgICAgICB9XG4gICAgICAvLyBKU1ggZXh0ZW5zaW9ucyBiZWxvdy5cblxuICAgICAgY2FzZSBcIkRlYnVnZ2VyU3RhdGVtZW50XCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJkZWJ1Z2dlclwiLCBzZW1pXSk7XG5cbiAgICAgIGNhc2UgXCJKU1hBdHRyaWJ1dGVcIjpcbiAgICAgICAgcGFydHMucHVzaChwYXRoLmNhbGwocHJpbnQsIFwibmFtZVwiKSk7XG5cbiAgICAgICAgaWYgKG4udmFsdWUpIHtcbiAgICAgICAgICBsZXQgcmVzO1xuXG4gICAgICAgICAgaWYgKGlzU3RyaW5nTGl0ZXJhbCQxKG4udmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCByYXcgPSByYXdUZXh0JDEobi52YWx1ZSk7IC8vIFVuZXNjYXBlIGFsbCBxdW90ZXMgc28gd2UgZ2V0IGFuIGFjY3VyYXRlIHByZWZlcnJlZCBxdW90ZVxuXG4gICAgICAgICAgICBsZXQgZmluYWwgPSByYXcucmVwbGFjZSgvJmFwb3M7L2csIFwiJ1wiKS5yZXBsYWNlKC8mcXVvdDsvZywgJ1wiJyk7XG4gICAgICAgICAgICBjb25zdCBxdW90ZSA9IGdldFByZWZlcnJlZFF1b3RlJDEoZmluYWwsIG9wdGlvbnMuanN4U2luZ2xlUXVvdGUgPyBcIidcIiA6ICdcIicpO1xuICAgICAgICAgICAgY29uc3QgZXNjYXBlID0gcXVvdGUgPT09IFwiJ1wiID8gXCImYXBvcztcIiA6IFwiJnF1b3Q7XCI7XG4gICAgICAgICAgICBmaW5hbCA9IGZpbmFsLnNsaWNlKDEsIC0xKS5yZXBsYWNlKG5ldyBSZWdFeHAocXVvdGUsIFwiZ1wiKSwgZXNjYXBlKTtcbiAgICAgICAgICAgIHJlcyA9IGNvbmNhdCRkKFtxdW90ZSwgZmluYWwsIHF1b3RlXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiPVwiLCByZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcblxuICAgICAgY2FzZSBcIkpTWElkZW50aWZpZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiXCIgKyBuLm5hbWU7XG5cbiAgICAgIGNhc2UgXCJKU1hOYW1lc3BhY2VkTmFtZVwiOlxuICAgICAgICByZXR1cm4gam9pbiQ5KFwiOlwiLCBbcGF0aC5jYWxsKHByaW50LCBcIm5hbWVzcGFjZVwiKSwgcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIildKTtcblxuICAgICAgY2FzZSBcIkpTWE1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIGpvaW4kOShcIi5cIiwgW3BhdGguY2FsbChwcmludCwgXCJvYmplY3RcIiksIHBhdGguY2FsbChwcmludCwgXCJwcm9wZXJ0eVwiKV0pO1xuXG4gICAgICBjYXNlIFwiVFNRdWFsaWZpZWROYW1lXCI6XG4gICAgICAgIHJldHVybiBqb2luJDkoXCIuXCIsIFtwYXRoLmNhbGwocHJpbnQsIFwibGVmdFwiKSwgcGF0aC5jYWxsKHByaW50LCBcInJpZ2h0XCIpXSk7XG5cbiAgICAgIGNhc2UgXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIjpcbiAgICAgIGNhc2UgXCJKU1hTcHJlYWRDaGlsZFwiOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcIntcIiwgcGF0aC5jYWxsKHAgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJpbnRlZCA9IGNvbmNhdCRkKFtcIi4uLlwiLCBwcmludChwKV0pO1xuICAgICAgICAgICAgY29uc3QgbiA9IHAuZ2V0VmFsdWUoKTtcblxuICAgICAgICAgICAgaWYgKCFuLmNvbW1lbnRzIHx8ICFuLmNvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gcHJpbnRlZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtpbmRlbnQkNyhjb25jYXQkZChbc29mdGxpbmUkNiwgY29tbWVudHMucHJpbnRDb21tZW50cyhwLCAoKSA9PiBwcmludGVkLCBvcHRpb25zKV0pKSwgc29mdGxpbmUkNl0pO1xuICAgICAgICAgIH0sIG4udHlwZSA9PT0gXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIiA/IFwiYXJndW1lbnRcIiA6IFwiZXhwcmVzc2lvblwiKSwgXCJ9XCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKDApO1xuICAgICAgICAgIGNvbnN0IGhhc0NvbW1lbnRzID0gbi5leHByZXNzaW9uLmNvbW1lbnRzICYmIG4uZXhwcmVzc2lvbi5jb21tZW50cy5sZW5ndGggPiAwO1xuICAgICAgICAgIGNvbnN0IHNob3VsZElubGluZSA9IG4uZXhwcmVzc2lvbi50eXBlID09PSBcIkpTWEVtcHR5RXhwcmVzc2lvblwiIHx8ICFoYXNDb21tZW50cyAmJiAobi5leHByZXNzaW9uLnR5cGUgPT09IFwiQXJyYXlFeHByZXNzaW9uXCIgfHwgbi5leHByZXNzaW9uLnR5cGUgPT09IFwiT2JqZWN0RXhwcmVzc2lvblwiIHx8IG4uZXhwcmVzc2lvbi50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgbi5leHByZXNzaW9uLnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiB8fCBuLmV4cHJlc3Npb24udHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCIgfHwgbi5leHByZXNzaW9uLnR5cGUgPT09IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgbi5leHByZXNzaW9uLnR5cGUgPT09IFwiVGVtcGxhdGVMaXRlcmFsXCIgfHwgbi5leHByZXNzaW9uLnR5cGUgPT09IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIgfHwgbi5leHByZXNzaW9uLnR5cGUgPT09IFwiRG9FeHByZXNzaW9uXCIgfHwgaXNKU1hOb2RlJDEocGFyZW50KSAmJiAobi5leHByZXNzaW9uLnR5cGUgPT09IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIgfHwgaXNCaW5hcnlpc2gkMShuLmV4cHJlc3Npb24pKSk7XG5cbiAgICAgICAgICBpZiAoc2hvdWxkSW5saW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChbXCJ7XCIsIHBhdGguY2FsbChwcmludCwgXCJleHByZXNzaW9uXCIpLCBsaW5lU3VmZml4Qm91bmRhcnkkMSwgXCJ9XCJdKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW1wie1wiLCBpbmRlbnQkNyhjb25jYXQkZChbc29mdGxpbmUkNiwgcGF0aC5jYWxsKHByaW50LCBcImV4cHJlc3Npb25cIildKSksIHNvZnRsaW5lJDYsIGxpbmVTdWZmaXhCb3VuZGFyeSQxLCBcIn1cIl0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiSlNYRnJhZ21lbnRcIjpcbiAgICAgIGNhc2UgXCJKU1hFbGVtZW50XCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBlbGVtID0gY29tbWVudHMucHJpbnRDb21tZW50cyhwYXRoLCAoKSA9PiBwcmludEpTWEVsZW1lbnQocGF0aCwgb3B0aW9ucywgcHJpbnQpLCBvcHRpb25zKTtcbiAgICAgICAgICByZXR1cm4gbWF5YmVXcmFwSlNYRWxlbWVudEluUGFyZW5zKHBhdGgsIGVsZW0sIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJKU1hPcGVuaW5nRWxlbWVudFwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgbiA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICAgICAgICBjb25zdCBuYW1lSGFzQ29tbWVudHMgPSBuLm5hbWUgJiYgbi5uYW1lLmNvbW1lbnRzICYmIG4ubmFtZS5jb21tZW50cy5sZW5ndGggPiAwIHx8IG4udHlwZVBhcmFtZXRlcnMgJiYgbi50eXBlUGFyYW1ldGVycy5jb21tZW50cyAmJiBuLnR5cGVQYXJhbWV0ZXJzLmNvbW1lbnRzLmxlbmd0aCA+IDA7IC8vIERvbid0IGJyZWFrIHNlbGYtY2xvc2luZyBlbGVtZW50cyB3aXRoIG5vIGF0dHJpYnV0ZXMgYW5kIG5vIGNvbW1lbnRzXG5cbiAgICAgICAgICBpZiAobi5zZWxmQ2xvc2luZyAmJiAhbi5hdHRyaWJ1dGVzLmxlbmd0aCAmJiAhbmFtZUhhc0NvbW1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGQoW1wiPFwiLCBwYXRoLmNhbGwocHJpbnQsIFwibmFtZVwiKSwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVQYXJhbWV0ZXJzXCIpLCBcIiAvPlwiXSk7XG4gICAgICAgICAgfSAvLyBkb24ndCBicmVhayB1cCBvcGVuaW5nIGVsZW1lbnRzIHdpdGggYSBzaW5nbGUgbG9uZyB0ZXh0IGF0dHJpYnV0ZVxuXG5cbiAgICAgICAgICBpZiAobi5hdHRyaWJ1dGVzICYmIG4uYXR0cmlidXRlcy5sZW5ndGggPT09IDEgJiYgbi5hdHRyaWJ1dGVzWzBdLnZhbHVlICYmIGlzU3RyaW5nTGl0ZXJhbCQxKG4uYXR0cmlidXRlc1swXS52YWx1ZSkgJiYgIW4uYXR0cmlidXRlc1swXS52YWx1ZS52YWx1ZS5pbmNsdWRlcyhcIlxcblwiKSAmJiAvLyBXZSBzaG91bGQgYnJlYWsgZm9yIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gICAgICAgICAgLy8gPGRpdlxuICAgICAgICAgIC8vICAgLy8gY29tbWVudFxuICAgICAgICAgIC8vICAgYXR0cj1cInZhbHVlXCJcbiAgICAgICAgICAvLyA+XG4gICAgICAgICAgLy8gPGRpdlxuICAgICAgICAgIC8vICAgYXR0cj1cInZhbHVlXCJcbiAgICAgICAgICAvLyAgIC8vIGNvbW1lbnRcbiAgICAgICAgICAvLyA+XG4gICAgICAgICAgIW5hbWVIYXNDb21tZW50cyAmJiAoIW4uYXR0cmlidXRlc1swXS5jb21tZW50cyB8fCAhbi5hdHRyaWJ1dGVzWzBdLmNvbW1lbnRzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKFtcIjxcIiwgcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIiksIHBhdGguY2FsbChwcmludCwgXCJ0eXBlUGFyYW1ldGVyc1wiKSwgXCIgXCIsIGNvbmNhdCRkKHBhdGgubWFwKHByaW50LCBcImF0dHJpYnV0ZXNcIikpLCBuLnNlbGZDbG9zaW5nID8gXCIgLz5cIiA6IFwiPlwiXSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxhc3RBdHRySGFzVHJhaWxpbmdDb21tZW50cyA9IG4uYXR0cmlidXRlcy5sZW5ndGggJiYgaGFzVHJhaWxpbmdDb21tZW50JDEoZ2V0TGFzdCQzKG4uYXR0cmlidXRlcykpO1xuICAgICAgICAgIGNvbnN0IGJyYWNrZXRTYW1lTGluZSA9IC8vIFNpbXBsZSB0YWdzIChubyBhdHRyaWJ1dGVzIGFuZCBubyBjb21tZW50IGluIHRhZyBuYW1lKSBzaG91bGQgYmVcbiAgICAgICAgICAvLyBrZXB0IHVuYnJva2VuIHJlZ2FyZGxlc3Mgb2YgYGpzeEJyYWNrZXRTYW1lTGluZWBcbiAgICAgICAgICAhbi5hdHRyaWJ1dGVzLmxlbmd0aCAmJiAhbmFtZUhhc0NvbW1lbnRzIHx8IG9wdGlvbnMuanN4QnJhY2tldFNhbWVMaW5lICYmICggLy8gV2Ugc2hvdWxkIHByaW50IHRoZSBicmFja2V0IGluIGEgbmV3IGxpbmUgZm9yIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gICAgICAgICAgLy8gPGRpdlxuICAgICAgICAgIC8vICAgLy8gY29tbWVudFxuICAgICAgICAgIC8vID5cbiAgICAgICAgICAvLyA8ZGl2XG4gICAgICAgICAgLy8gICBhdHRyIC8vIGNvbW1lbnRcbiAgICAgICAgICAvLyA+XG4gICAgICAgICAgIW5hbWVIYXNDb21tZW50cyB8fCBuLmF0dHJpYnV0ZXMubGVuZ3RoKSAmJiAhbGFzdEF0dHJIYXNUcmFpbGluZ0NvbW1lbnRzOyAvLyBXZSBzaG91bGQgcHJpbnQgdGhlIG9wZW5pbmcgZWxlbWVudCBleHBhbmRlZCBpZiBhbnkgcHJvcCB2YWx1ZSBpcyBhXG4gICAgICAgICAgLy8gc3RyaW5nIGxpdGVyYWwgd2l0aCBuZXdsaW5lc1xuXG4gICAgICAgICAgY29uc3Qgc2hvdWxkQnJlYWsgPSBuLmF0dHJpYnV0ZXMgJiYgbi5hdHRyaWJ1dGVzLnNvbWUoYXR0ciA9PiBhdHRyLnZhbHVlICYmIGlzU3RyaW5nTGl0ZXJhbCQxKGF0dHIudmFsdWUpICYmIGF0dHIudmFsdWUudmFsdWUuaW5jbHVkZXMoXCJcXG5cIikpO1xuICAgICAgICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKFtcIjxcIiwgcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIiksIHBhdGguY2FsbChwcmludCwgXCJ0eXBlUGFyYW1ldGVyc1wiKSwgY29uY2F0JGQoW2luZGVudCQ3KGNvbmNhdCRkKHBhdGgubWFwKGF0dHIgPT4gY29uY2F0JGQoW2xpbmUkOSwgcHJpbnQoYXR0cildKSwgXCJhdHRyaWJ1dGVzXCIpKSksIG4uc2VsZkNsb3NpbmcgPyBsaW5lJDkgOiBicmFja2V0U2FtZUxpbmUgPyBcIj5cIiA6IHNvZnRsaW5lJDZdKSwgbi5zZWxmQ2xvc2luZyA/IFwiLz5cIiA6IGJyYWNrZXRTYW1lTGluZSA/IFwiXCIgOiBcIj5cIl0pLCB7XG4gICAgICAgICAgICBzaG91bGRCcmVha1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJKU1hDbG9zaW5nRWxlbWVudFwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW1wiPC9cIiwgcGF0aC5jYWxsKHByaW50LCBcIm5hbWVcIiksIFwiPlwiXSk7XG5cbiAgICAgIGNhc2UgXCJKU1hPcGVuaW5nRnJhZ21lbnRcIjpcbiAgICAgIGNhc2UgXCJKU1hDbG9zaW5nRnJhZ21lbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IGhhc0NvbW1lbnQgPSBuLmNvbW1lbnRzICYmIG4uY29tbWVudHMubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IGhhc093bkxpbmVDb21tZW50ID0gaGFzQ29tbWVudCAmJiAhbi5jb21tZW50cy5ldmVyeShjb21tZW50cyQxLmlzQmxvY2tDb21tZW50KTtcbiAgICAgICAgICBjb25zdCBpc09wZW5pbmdGcmFnbWVudCA9IG4udHlwZSA9PT0gXCJKU1hPcGVuaW5nRnJhZ21lbnRcIjtcbiAgICAgICAgICByZXR1cm4gY29uY2F0JGQoW2lzT3BlbmluZ0ZyYWdtZW50ID8gXCI8XCIgOiBcIjwvXCIsIGluZGVudCQ3KGNvbmNhdCRkKFtoYXNPd25MaW5lQ29tbWVudCA/IGhhcmRsaW5lJDkgOiBoYXNDb21tZW50ICYmICFpc09wZW5pbmdGcmFnbWVudCA/IFwiIFwiIDogXCJcIiwgY29tbWVudHMucHJpbnREYW5nbGluZ0NvbW1lbnRzKHBhdGgsIG9wdGlvbnMsIHRydWUpXSkpLCBoYXNPd25MaW5lQ29tbWVudCA/IGhhcmRsaW5lJDkgOiBcIlwiLCBcIj5cIl0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJKU1hUZXh0XCI6XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkpTWFRlc3Qgc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNYRWxlbWVudFwiKTtcblxuICAgICAgY2FzZSBcIkpTWEVtcHR5RXhwcmVzc2lvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcmVxdWlyZXNIYXJkbGluZSA9IG4uY29tbWVudHMgJiYgIW4uY29tbWVudHMuZXZlcnkoY29tbWVudHMkMS5pc0Jsb2NrQ29tbWVudCk7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtjb21tZW50cy5wcmludERhbmdsaW5nQ29tbWVudHMocGF0aCwgb3B0aW9ucyxcbiAgICAgICAgICAvKiBzYW1lSW5kZW50ICovXG4gICAgICAgICAgIXJlcXVpcmVzSGFyZGxpbmUpLCByZXF1aXJlc0hhcmRsaW5lID8gaGFyZGxpbmUkOSA6IFwiXCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiQ2xhc3NCb2R5XCI6XG4gICAgICAgIGlmICghbi5jb21tZW50cyAmJiBuLmJvZHkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIFwie31cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJ7XCIsIG4uYm9keS5sZW5ndGggPiAwID8gaW5kZW50JDcoY29uY2F0JGQoW2hhcmRsaW5lJDksIHBhdGguY2FsbChib2R5UGF0aCA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByaW50U3RhdGVtZW50U2VxdWVuY2UoYm9keVBhdGgsIG9wdGlvbnMsIHByaW50KTtcbiAgICAgICAgfSwgXCJib2R5XCIpXSkpIDogY29tbWVudHMucHJpbnREYW5nbGluZ0NvbW1lbnRzKHBhdGgsIG9wdGlvbnMpLCBoYXJkbGluZSQ5LCBcIn1cIl0pO1xuXG4gICAgICBjYXNlIFwiQ2xhc3NQcm9wZXJ0eVwiOlxuICAgICAgY2FzZSBcIlRTQWJzdHJhY3RDbGFzc1Byb3BlcnR5XCI6XG4gICAgICBjYXNlIFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIjpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChuLmRlY29yYXRvcnMgJiYgbi5kZWNvcmF0b3JzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChwcmludERlY29yYXRvcnMocGF0aCwgb3B0aW9ucywgcHJpbnQpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobi5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKG4uYWNjZXNzaWJpbGl0eSArIFwiIFwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobi5kZWNsYXJlKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiZGVjbGFyZSBcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG4uc3RhdGljKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwic3RhdGljIFwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobi50eXBlID09PSBcIlRTQWJzdHJhY3RDbGFzc1Byb3BlcnR5XCIgfHwgbi5hYnN0cmFjdCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChcImFic3RyYWN0IFwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobi5yZWFkb25seSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChcInJlYWRvbmx5IFwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB2YXJpYW5jZSA9IGdldEZsb3dWYXJpYW5jZSQxKG4pO1xuXG4gICAgICAgICAgaWYgKHZhcmlhbmNlKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHZhcmlhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0cy5wdXNoKHByaW50UHJvcGVydHlLZXkocGF0aCwgb3B0aW9ucywgcHJpbnQpLCBwcmludE9wdGlvbmFsVG9rZW4ocGF0aCksIHByaW50VHlwZUFubm90YXRpb24ocGF0aCwgb3B0aW9ucywgcHJpbnQpKTtcblxuICAgICAgICAgIGlmIChuLnZhbHVlKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiID1cIiwgcHJpbnRBc3NpZ25tZW50UmlnaHQobi5rZXksIG4udmFsdWUsIHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKSwgb3B0aW9ucykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRzLnB1c2goc2VtaSk7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQocGFydHMpKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiQ2xhc3NEZWNsYXJhdGlvblwiOlxuICAgICAgY2FzZSBcIkNsYXNzRXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAobi5kZWNsYXJlKSB7XG4gICAgICAgICAgcGFydHMucHVzaChcImRlY2xhcmUgXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaChjb25jYXQkZChwcmludENsYXNzKHBhdGgsIG9wdGlvbnMsIHByaW50KSkpO1xuICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuXG4gICAgICBjYXNlIFwiVFNJbnRlcmZhY2VIZXJpdGFnZVwiOlxuICAgICAgY2FzZSBcIlRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXCI6XG4gICAgICAgIC8vIEJhYmVsIEFTVFxuICAgICAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcmludCwgXCJleHByZXNzaW9uXCIpKTtcblxuICAgICAgICBpZiAobi50eXBlUGFyYW1ldGVycykge1xuICAgICAgICAgIHBhcnRzLnB1c2gocGF0aC5jYWxsKHByaW50LCBcInR5cGVQYXJhbWV0ZXJzXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJUZW1wbGF0ZUVsZW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIGpvaW4kOShsaXRlcmFsbGluZSQ0LCBuLnZhbHVlLnJhdy5zcGxpdCgvXFxyP1xcbi9nKSk7XG5cbiAgICAgIGNhc2UgXCJUZW1wbGF0ZUxpdGVyYWxcIjpcbiAgICAgICAge1xuICAgICAgICAgIGxldCBleHByZXNzaW9ucyA9IHBhdGgubWFwKHByaW50LCBcImV4cHJlc3Npb25zXCIpO1xuICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcblxuICAgICAgICAgIGlmIChpc0plc3RFYWNoVGVtcGxhdGVMaXRlcmFsJDEobiwgcGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByaW50ZWQgPSBwcmludEplc3RFYWNoVGVtcGxhdGVMaXRlcmFsKG4sIGV4cHJlc3Npb25zLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKHByaW50ZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHByaW50ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaXNTaW1wbGUgPSBpc1NpbXBsZVRlbXBsYXRlTGl0ZXJhbCQxKG4pO1xuXG4gICAgICAgICAgaWYgKGlzU2ltcGxlKSB7XG4gICAgICAgICAgICBleHByZXNzaW9ucyA9IGV4cHJlc3Npb25zLm1hcChkb2MgPT4gcHJpbnREb2NUb1N0cmluZyQyKGRvYywgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgICBwcmludFdpZHRoOiBJbmZpbml0eVxuICAgICAgICAgICAgfSkpLmZvcm1hdHRlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFydHMucHVzaChsaW5lU3VmZml4Qm91bmRhcnkkMSwgXCJgXCIpO1xuICAgICAgICAgIHBhdGguZWFjaChjaGlsZFBhdGggPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IGNoaWxkUGF0aC5nZXROYW1lKCk7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHByaW50KGNoaWxkUGF0aCkpO1xuXG4gICAgICAgICAgICBpZiAoaSA8IGV4cHJlc3Npb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAvLyBGb3IgYSB0ZW1wbGF0ZSBsaXRlcmFsIG9mIHRoZSBmb2xsb3dpbmcgZm9ybTpcbiAgICAgICAgICAgICAgLy8gICBgc29tZVF1ZXJ5IHtcbiAgICAgICAgICAgICAgLy8gICAgICR7Y2FsbCh7XG4gICAgICAgICAgICAgIC8vICAgICAgIGEsXG4gICAgICAgICAgICAgIC8vICAgICAgIGIsXG4gICAgICAgICAgICAgIC8vICAgICB9KX1cbiAgICAgICAgICAgICAgLy8gICB9YFxuICAgICAgICAgICAgICAvLyB0aGUgZXhwcmVzc2lvbiBpcyBvbiBpdHMgb3duIGxpbmUgKHRoZXJlIGlzIGEgXFxuIGluIHRoZSBwcmV2aW91c1xuICAgICAgICAgICAgICAvLyBxdWFzaSBsaXRlcmFsKSwgdGhlcmVmb3JlIHdlIHdhbnQgdG8gaW5kZW50IHRoZSBKYXZhU2NyaXB0XG4gICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24gaW5zaWRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgJHsgaW5zdGVhZCBvZiB0aGUgYmVnaW5uaW5nXG4gICAgICAgICAgICAgIC8vIG9mIHRoZSBgLlxuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgdGFiV2lkdGhcbiAgICAgICAgICAgICAgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgIGNvbnN0IHF1YXNpID0gY2hpbGRQYXRoLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGVudFNpemUgPSBnZXRJbmRlbnRTaXplJDIocXVhc2kudmFsdWUucmF3LCB0YWJXaWR0aCk7XG4gICAgICAgICAgICAgIGxldCBwcmludGVkID0gZXhwcmVzc2lvbnNbaV07XG5cbiAgICAgICAgICAgICAgaWYgKCFpc1NpbXBsZSkge1xuICAgICAgICAgICAgICAgIC8vIEJyZWFrcyBhdCB0aGUgdGVtcGxhdGUgZWxlbWVudCBib3VuZGFyaWVzICgkeyBhbmQgfSkgYXJlIHByZWZlcnJlZCB0byBicmVha2luZ1xuICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgYSBNZW1iZXJFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgaWYgKG4uZXhwcmVzc2lvbnNbaV0uY29tbWVudHMgJiYgbi5leHByZXNzaW9uc1tpXS5jb21tZW50cy5sZW5ndGggfHwgbi5leHByZXNzaW9uc1tpXS50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fCBuLmV4cHJlc3Npb25zW2ldLnR5cGUgPT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIgfHwgbi5leHByZXNzaW9uc1tpXS50eXBlID09PSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiIHx8IG4uZXhwcmVzc2lvbnNbaV0udHlwZSA9PT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIiB8fCBuLmV4cHJlc3Npb25zW2ldLnR5cGUgPT09IFwiVFNBc0V4cHJlc3Npb25cIiB8fCBpc0JpbmFyeWlzaCQxKG4uZXhwcmVzc2lvbnNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICBwcmludGVkID0gY29uY2F0JGQoW2luZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBwcmludGVkXSkpLCBzb2Z0bGluZSQ2XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgYWxpZ25lZCA9IGluZGVudFNpemUgPT09IDAgJiYgcXVhc2kudmFsdWUucmF3LmVuZHNXaXRoKFwiXFxuXCIpID8gYWxpZ24kMSgtSW5maW5pdHksIHByaW50ZWQpIDogYWRkQWxpZ25tZW50VG9Eb2MkMihwcmludGVkLCBpbmRlbnRTaXplLCB0YWJXaWR0aCk7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goZ3JvdXAkYihjb25jYXQkZChbXCIke1wiLCBhbGlnbmVkLCBsaW5lU3VmZml4Qm91bmRhcnkkMSwgXCJ9XCJdKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIFwicXVhc2lzXCIpO1xuICAgICAgICAgIHBhcnRzLnB1c2goXCJgXCIpO1xuICAgICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG4gICAgICAgIH1cbiAgICAgIC8vIFRoZXNlIHR5cGVzIGFyZSB1bnByaW50YWJsZSBiZWNhdXNlIHRoZXkgc2VydmUgYXMgYWJzdHJhY3RcbiAgICAgIC8vIHN1cGVydHlwZXMgZm9yIG90aGVyIChwcmludGFibGUpIHR5cGVzLlxuXG4gICAgICBjYXNlIFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbcGF0aC5jYWxsKHByaW50LCBcInRhZ1wiKSwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVQYXJhbWV0ZXJzXCIpLCBwYXRoLmNhbGwocHJpbnQsIFwicXVhc2lcIildKTtcblxuICAgICAgY2FzZSBcIk5vZGVcIjpcbiAgICAgIGNhc2UgXCJQcmludGFibGVcIjpcbiAgICAgIGNhc2UgXCJTb3VyY2VMb2NhdGlvblwiOlxuICAgICAgY2FzZSBcIlBvc2l0aW9uXCI6XG4gICAgICBjYXNlIFwiU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiRnVuY3Rpb25cIjpcbiAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICBjYXNlIFwiRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIkRlY2xhcmF0aW9uXCI6XG4gICAgICBjYXNlIFwiU3BlY2lmaWVyXCI6XG4gICAgICBjYXNlIFwiTmFtZWRTcGVjaWZpZXJcIjpcbiAgICAgIGNhc2UgXCJDb21tZW50XCI6XG4gICAgICBjYXNlIFwiTWVtYmVyVHlwZUFubm90YXRpb25cIjogLy8gRmxvd1xuXG4gICAgICBjYXNlIFwiVHlwZVwiOlxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bnByaW50YWJsZSB0eXBlOiBcIiArIEpTT04uc3RyaW5naWZ5KG4udHlwZSkpO1xuICAgICAgLy8gVHlwZSBBbm5vdGF0aW9ucyBmb3IgRmFjZWJvb2sgRmxvdywgdHlwaWNhbGx5IHN0cmlwcGVkIG91dCBvclxuICAgICAgLy8gdHJhbnNmb3JtZWQgYXdheSBiZWZvcmUgcHJpbnRpbmcuXG5cbiAgICAgIGNhc2UgXCJUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgY2FzZSBcIlRTVHlwZUFubm90YXRpb25cIjpcbiAgICAgICAgaWYgKG4udHlwZUFubm90YXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gcGF0aC5jYWxsKHByaW50LCBcInR5cGVBbm5vdGF0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgICAgICByZXR1cm4gXCJcIjtcblxuICAgICAgY2FzZSBcIlRTVHVwbGVUeXBlXCI6XG4gICAgICBjYXNlIFwiVHVwbGVUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgdHlwZXNGaWVsZCA9IG4udHlwZSA9PT0gXCJUU1R1cGxlVHlwZVwiID8gXCJlbGVtZW50VHlwZXNcIiA6IFwidHlwZXNcIjtcbiAgICAgICAgICBjb25zdCBoYXNSZXN0ID0gblt0eXBlc0ZpZWxkXS5sZW5ndGggPiAwICYmIGdldExhc3QkMyhuW3R5cGVzRmllbGRdKS50eXBlID09PSBcIlRTUmVzdFR5cGVcIjtcbiAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChbXCJbXCIsIGluZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBwcmludEFycmF5SXRlbXMocGF0aCwgb3B0aW9ucywgdHlwZXNGaWVsZCwgcHJpbnQpXSkpLCBpZkJyZWFrJDYoc2hvdWxkUHJpbnRDb21tYSQxKG9wdGlvbnMsIFwiYWxsXCIpICYmICFoYXNSZXN0ID8gXCIsXCIgOiBcIlwiKSwgY29tbWVudHMucHJpbnREYW5nbGluZ0NvbW1lbnRzKHBhdGgsIG9wdGlvbnMsXG4gICAgICAgICAgLyogc2FtZUluZGVudCAqL1xuICAgICAgICAgIHRydWUpLCBzb2Z0bGluZSQ2LCBcIl1cIl0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiRXhpc3RzVHlwZUFubm90YXRpb25cIjpcbiAgICAgICAgcmV0dXJuIFwiKlwiO1xuXG4gICAgICBjYXNlIFwiRW1wdHlUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICByZXR1cm4gXCJlbXB0eVwiO1xuXG4gICAgICBjYXNlIFwiQW55VHlwZUFubm90YXRpb25cIjpcbiAgICAgICAgcmV0dXJuIFwiYW55XCI7XG5cbiAgICAgIGNhc2UgXCJNaXhlZFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgICAgIHJldHVybiBcIm1peGVkXCI7XG5cbiAgICAgIGNhc2UgXCJBcnJheVR5cGVBbm5vdGF0aW9uXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbcGF0aC5jYWxsKHByaW50LCBcImVsZW1lbnRUeXBlXCIpLCBcIltdXCJdKTtcblxuICAgICAgY2FzZSBcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICByZXR1cm4gXCJib29sZWFuXCI7XG5cbiAgICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgICAgIHJldHVybiBcIlwiICsgbi52YWx1ZTtcblxuICAgICAgY2FzZSBcIkRlY2xhcmVDbGFzc1wiOlxuICAgICAgICByZXR1cm4gcHJpbnRGbG93RGVjbGFyYXRpb24ocGF0aCwgcHJpbnRDbGFzcyhwYXRoLCBvcHRpb25zLCBwcmludCkpO1xuXG4gICAgICBjYXNlIFwiVFNEZWNsYXJlRnVuY3Rpb25cIjpcbiAgICAgICAgLy8gRm9yIFR5cGVTY3JpcHQgdGhlIFRTRGVjbGFyZUZ1bmN0aW9uIG5vZGUgc2hhcmVzIHRoZSBBU1RcbiAgICAgICAgLy8gc3RydWN0dXJlIHdpdGggRnVuY3Rpb25EZWNsYXJhdGlvblxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW24uZGVjbGFyZSA/IFwiZGVjbGFyZSBcIiA6IFwiXCIsIHByaW50RnVuY3Rpb25EZWNsYXJhdGlvbihwYXRoLCBwcmludCwgb3B0aW9ucyksIHNlbWldKTtcblxuICAgICAgY2FzZSBcIkRlY2xhcmVGdW5jdGlvblwiOlxuICAgICAgICByZXR1cm4gcHJpbnRGbG93RGVjbGFyYXRpb24ocGF0aCwgW1wiZnVuY3Rpb24gXCIsIHBhdGguY2FsbChwcmludCwgXCJpZFwiKSwgbi5wcmVkaWNhdGUgPyBcIiBcIiA6IFwiXCIsIHBhdGguY2FsbChwcmludCwgXCJwcmVkaWNhdGVcIiksIHNlbWldKTtcblxuICAgICAgY2FzZSBcIkRlY2xhcmVNb2R1bGVcIjpcbiAgICAgICAgcmV0dXJuIHByaW50Rmxvd0RlY2xhcmF0aW9uKHBhdGgsIFtcIm1vZHVsZSBcIiwgcGF0aC5jYWxsKHByaW50LCBcImlkXCIpLCBcIiBcIiwgcGF0aC5jYWxsKHByaW50LCBcImJvZHlcIildKTtcblxuICAgICAgY2FzZSBcIkRlY2xhcmVNb2R1bGVFeHBvcnRzXCI6XG4gICAgICAgIHJldHVybiBwcmludEZsb3dEZWNsYXJhdGlvbihwYXRoLCBbXCJtb2R1bGUuZXhwb3J0c1wiLCBcIjogXCIsIHBhdGguY2FsbChwcmludCwgXCJ0eXBlQW5ub3RhdGlvblwiKSwgc2VtaV0pO1xuXG4gICAgICBjYXNlIFwiRGVjbGFyZVZhcmlhYmxlXCI6XG4gICAgICAgIHJldHVybiBwcmludEZsb3dEZWNsYXJhdGlvbihwYXRoLCBbXCJ2YXIgXCIsIHBhdGguY2FsbChwcmludCwgXCJpZFwiKSwgc2VtaV0pO1xuXG4gICAgICBjYXNlIFwiRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJkZWNsYXJlIGV4cG9ydCAqIGZyb20gXCIsIHBhdGguY2FsbChwcmludCwgXCJzb3VyY2VcIildKTtcblxuICAgICAgY2FzZSBcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW1wiZGVjbGFyZSBcIiwgcHJpbnRFeHBvcnREZWNsYXJhdGlvbihwYXRoLCBvcHRpb25zLCBwcmludCldKTtcblxuICAgICAgY2FzZSBcIkRlY2xhcmVPcGFxdWVUeXBlXCI6XG4gICAgICBjYXNlIFwiT3BhcXVlVHlwZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgcGFydHMucHVzaChcIm9wYXF1ZSB0eXBlIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiaWRcIiksIHBhdGguY2FsbChwcmludCwgXCJ0eXBlUGFyYW1ldGVyc1wiKSk7XG5cbiAgICAgICAgICBpZiAobi5zdXBlcnR5cGUpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCI6IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwic3VwZXJ0eXBlXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobi5pbXBsdHlwZSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIiA9IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiaW1wbHR5cGVcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRzLnB1c2goc2VtaSk7XG5cbiAgICAgICAgICBpZiAobi50eXBlID09PSBcIkRlY2xhcmVPcGFxdWVUeXBlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBwcmludEZsb3dEZWNsYXJhdGlvbihwYXRoLCBwYXJ0cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiRW51bURlY2xhcmF0aW9uXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJlbnVtIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiaWRcIiksIFwiIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiYm9keVwiKV0pO1xuXG4gICAgICBjYXNlIFwiRW51bUJvb2xlYW5Cb2R5XCI6XG4gICAgICBjYXNlIFwiRW51bU51bWJlckJvZHlcIjpcbiAgICAgIGNhc2UgXCJFbnVtU3RyaW5nQm9keVwiOlxuICAgICAgY2FzZSBcIkVudW1TeW1ib2xCb2R5XCI6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAobi50eXBlID09PSBcIkVudW1TeW1ib2xCb2R5XCIgfHwgbi5leHBsaWNpdFR5cGUpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gbnVsbDtcblxuICAgICAgICAgICAgc3dpdGNoIChuLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkVudW1Cb29sZWFuQm9keVwiOlxuICAgICAgICAgICAgICAgIHR5cGUgPSBcImJvb2xlYW5cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwiRW51bU51bWJlckJvZHlcIjpcbiAgICAgICAgICAgICAgICB0eXBlID0gXCJudW1iZXJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwiRW51bVN0cmluZ0JvZHlcIjpcbiAgICAgICAgICAgICAgICB0eXBlID0gXCJzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwiRW51bVN5bWJvbEJvZHlcIjpcbiAgICAgICAgICAgICAgICB0eXBlID0gXCJzeW1ib2xcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFydHMucHVzaChcIm9mIFwiLCB0eXBlLCBcIiBcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG4ubWVtYmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goZ3JvdXAkYihjb25jYXQkZChbXCJ7XCIsIGNvbW1lbnRzLnByaW50RGFuZ2xpbmdDb21tZW50cyhwYXRoLCBvcHRpb25zKSwgc29mdGxpbmUkNiwgXCJ9XCJdKSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGdyb3VwJGIoY29uY2F0JGQoW1wie1wiLCBpbmRlbnQkNyhjb25jYXQkZChbaGFyZGxpbmUkOSwgcHJpbnRBcnJheUl0ZW1zKHBhdGgsIG9wdGlvbnMsIFwibWVtYmVyc1wiLCBwcmludCksIHNob3VsZFByaW50Q29tbWEkMShvcHRpb25zKSA/IFwiLFwiIDogXCJcIl0pKSwgY29tbWVudHMucHJpbnREYW5nbGluZ0NvbW1lbnRzKHBhdGgsIG9wdGlvbnMsXG4gICAgICAgICAgICAvKiBzYW1lSW5kZW50ICovXG4gICAgICAgICAgICB0cnVlKSwgaGFyZGxpbmUkOSwgXCJ9XCJdKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIkVudW1Cb29sZWFuTWVtYmVyXCI6XG4gICAgICBjYXNlIFwiRW51bU51bWJlck1lbWJlclwiOlxuICAgICAgY2FzZSBcIkVudW1TdHJpbmdNZW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwiaWRcIiksIFwiID0gXCIsIHR5cGVvZiBuLmluaXQgPT09IFwib2JqZWN0XCIgPyBwYXRoLmNhbGwocHJpbnQsIFwiaW5pdFwiKSA6IFN0cmluZyhuLmluaXQpXSk7XG5cbiAgICAgIGNhc2UgXCJFbnVtRGVmYXVsdGVkTWVtYmVyXCI6XG4gICAgICAgIHJldHVybiBwYXRoLmNhbGwocHJpbnQsIFwiaWRcIik7XG5cbiAgICAgIGNhc2UgXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCI6XG4gICAgICBjYXNlIFwiVFNGdW5jdGlvblR5cGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIC8vIEZ1bmN0aW9uVHlwZUFubm90YXRpb24gaXMgYW1iaWd1b3VzOlxuICAgICAgICAgIC8vIGRlY2xhcmUgZnVuY3Rpb24gZm9vKGE6IEIpOiB2b2lkOyBPUlxuICAgICAgICAgIC8vIHZhciBBOiAoYTogQikgPT4gdm9pZDtcbiAgICAgICAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmdldFBhcmVudE5vZGUoMCk7XG4gICAgICAgICAgY29uc3QgcGFyZW50UGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKDEpO1xuICAgICAgICAgIGNvbnN0IHBhcmVudFBhcmVudFBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgyKTtcbiAgICAgICAgICBsZXQgaXNBcnJvd0Z1bmN0aW9uVHlwZUFubm90YXRpb24gPSBuLnR5cGUgPT09IFwiVFNGdW5jdGlvblR5cGVcIiB8fCAhKChwYXJlbnQudHlwZSA9PT0gXCJPYmplY3RUeXBlUHJvcGVydHlcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJPYmplY3RUeXBlSW50ZXJuYWxTbG90XCIpICYmICFnZXRGbG93VmFyaWFuY2UkMShwYXJlbnQpICYmICFwYXJlbnQub3B0aW9uYWwgJiYgb3B0aW9ucy5sb2NTdGFydChwYXJlbnQpID09PSBvcHRpb25zLmxvY1N0YXJ0KG4pIHx8IHBhcmVudC50eXBlID09PSBcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIiB8fCBwYXJlbnRQYXJlbnRQYXJlbnQgJiYgcGFyZW50UGFyZW50UGFyZW50LnR5cGUgPT09IFwiRGVjbGFyZUZ1bmN0aW9uXCIpO1xuICAgICAgICAgIGxldCBuZWVkc0NvbG9uID0gaXNBcnJvd0Z1bmN0aW9uVHlwZUFubm90YXRpb24gJiYgKHBhcmVudC50eXBlID09PSBcIlR5cGVBbm5vdGF0aW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiVFNUeXBlQW5ub3RhdGlvblwiKTsgLy8gU2FkbHkgd2UgY2FuJ3QgcHV0IGl0IGluc2lkZSBvZiBGYXN0UGF0aDo6bmVlZHNDb2xvbiBiZWNhdXNlIHdlIGFyZVxuICAgICAgICAgIC8vIHByaW50aW5nIFwiOlwiIGFzIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24gYW5kIGl0IHdvdWxkIHB1dCBwYXJlbnRoZXNpc1xuICAgICAgICAgIC8vIGFyb3VuZCA6KFxuXG4gICAgICAgICAgY29uc3QgbmVlZHNQYXJlbnMgPSBuZWVkc0NvbG9uICYmIGlzQXJyb3dGdW5jdGlvblR5cGVBbm5vdGF0aW9uICYmIChwYXJlbnQudHlwZSA9PT0gXCJUeXBlQW5ub3RhdGlvblwiIHx8IHBhcmVudC50eXBlID09PSBcIlRTVHlwZUFubm90YXRpb25cIikgJiYgcGFyZW50UGFyZW50LnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIjtcblxuICAgICAgICAgIGlmIChpc09iamVjdFR5cGVQcm9wZXJ0eUFGdW5jdGlvbiQxKHBhcmVudCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGlzQXJyb3dGdW5jdGlvblR5cGVBbm5vdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIG5lZWRzQ29sb24gPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZWVkc1BhcmVucykge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIihcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFydHMucHVzaChwcmludEZ1bmN0aW9uUGFyYW1zKHBhdGgsIHByaW50LCBvcHRpb25zLFxuICAgICAgICAgIC8qIGV4cGFuZEFyZyAqL1xuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIC8qIHByaW50VHlwZVBhcmFtcyAqL1xuICAgICAgICAgIHRydWUpKTsgLy8gVGhlIHJldHVyblR5cGUgaXMgbm90IHdyYXBwZWQgaW4gYSBUeXBlQW5ub3RhdGlvbiwgc28gdGhlIGNvbG9uXG4gICAgICAgICAgLy8gbmVlZHMgdG8gYmUgYWRkZWQgc2VwYXJhdGVseS5cblxuICAgICAgICAgIGlmIChuLnJldHVyblR5cGUgfHwgbi5wcmVkaWNhdGUgfHwgbi50eXBlQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgcGFydHMucHVzaChpc0Fycm93RnVuY3Rpb25UeXBlQW5ub3RhdGlvbiA/IFwiID0+IFwiIDogXCI6IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwicmV0dXJuVHlwZVwiKSwgcGF0aC5jYWxsKHByaW50LCBcInByZWRpY2F0ZVwiKSwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVBbm5vdGF0aW9uXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmVlZHNQYXJlbnMpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCIpXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKHBhcnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIlRTUmVzdFR5cGVcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcIi4uLlwiLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZUFubm90YXRpb25cIildKTtcblxuICAgICAgY2FzZSBcIlRTT3B0aW9uYWxUeXBlXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbcGF0aC5jYWxsKHByaW50LCBcInR5cGVBbm5vdGF0aW9uXCIpLCBcIj9cIl0pO1xuXG4gICAgICBjYXNlIFwiRnVuY3Rpb25UeXBlUGFyYW1cIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwibmFtZVwiKSwgcHJpbnRPcHRpb25hbFRva2VuKHBhdGgpLCBuLm5hbWUgPyBcIjogXCIgOiBcIlwiLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZUFubm90YXRpb25cIildKTtcblxuICAgICAgY2FzZSBcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW3BhdGguY2FsbChwcmludCwgXCJpZFwiKSwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVQYXJhbWV0ZXJzXCIpXSk7XG5cbiAgICAgIGNhc2UgXCJEZWNsYXJlSW50ZXJmYWNlXCI6XG4gICAgICBjYXNlIFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIjpcbiAgICAgIGNhc2UgXCJJbnRlcmZhY2VUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKG4udHlwZSA9PT0gXCJEZWNsYXJlSW50ZXJmYWNlXCIgfHwgbi5kZWNsYXJlKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiZGVjbGFyZSBcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFydHMucHVzaChcImludGVyZmFjZVwiKTtcblxuICAgICAgICAgIGlmIChuLnR5cGUgPT09IFwiRGVjbGFyZUludGVyZmFjZVwiIHx8IG4udHlwZSA9PT0gXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiaWRcIiksIHBhdGguY2FsbChwcmludCwgXCJ0eXBlUGFyYW1ldGVyc1wiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG4uZXh0ZW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGdyb3VwJGIoaW5kZW50JDcoY29uY2F0JGQoW2xpbmUkOSwgXCJleHRlbmRzIFwiLCAobi5leHRlbmRzLmxlbmd0aCA9PT0gMSA/IGlkZW50aXR5JDIgOiBpbmRlbnQkNykoam9pbiQ5KGNvbmNhdCRkKFtcIixcIiwgbGluZSQ5XSksIHBhdGgubWFwKHByaW50LCBcImV4dGVuZHNcIikpKV0pKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRzLnB1c2goXCIgXCIsIHBhdGguY2FsbChwcmludCwgXCJib2R5XCIpKTtcbiAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChwYXJ0cykpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJDbGFzc0ltcGxlbWVudHNcIjpcbiAgICAgIGNhc2UgXCJJbnRlcmZhY2VFeHRlbmRzXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbcGF0aC5jYWxsKHByaW50LCBcImlkXCIpLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZVBhcmFtZXRlcnNcIildKTtcblxuICAgICAgY2FzZSBcIlRTQ2xhc3NJbXBsZW1lbnRzXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbcGF0aC5jYWxsKHByaW50LCBcImV4cHJlc3Npb25cIiksIHBhdGguY2FsbChwcmludCwgXCJ0eXBlUGFyYW1ldGVyc1wiKV0pO1xuXG4gICAgICBjYXNlIFwiVFNJbnRlcnNlY3Rpb25UeXBlXCI6XG4gICAgICBjYXNlIFwiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHR5cGVzID0gcGF0aC5tYXAocHJpbnQsIFwidHlwZXNcIik7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgICAgbGV0IHdhc0luZGVudGVkID0gZmFsc2U7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlc1tpXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VHlwZSQxKG4udHlwZXNbaSAtIDFdKSAmJiBpc09iamVjdFR5cGUkMShuLnR5cGVzW2ldKSkge1xuICAgICAgICAgICAgICAvLyBJZiBib3RoIGFyZSBvYmplY3RzLCBkb24ndCBpbmRlbnRcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29uY2F0JGQoW1wiICYgXCIsIHdhc0luZGVudGVkID8gaW5kZW50JDcodHlwZXNbaV0pIDogdHlwZXNbaV1dKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc09iamVjdFR5cGUkMShuLnR5cGVzW2kgLSAxXSkgJiYgIWlzT2JqZWN0VHlwZSQxKG4udHlwZXNbaV0pKSB7XG4gICAgICAgICAgICAgIC8vIElmIG5vIG9iamVjdCBpcyBpbnZvbHZlZCwgZ28gdG8gdGhlIG5leHQgbGluZSBpZiBpdCBicmVha3NcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50JDcoY29uY2F0JGQoW1wiICZcIiwgbGluZSQ5LCB0eXBlc1tpXV0pKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBJZiB5b3UgZ28gZnJvbSBvYmplY3QgdG8gbm9uLW9iamVjdCBvciB2aXMtdmVyc2EsIHRoZW4gaW5saW5lIGl0XG4gICAgICAgICAgICAgIGlmIChpID4gMSkge1xuICAgICAgICAgICAgICAgIHdhc0luZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFwiICYgXCIsIGkgPiAxID8gaW5kZW50JDcodHlwZXNbaV0pIDogdHlwZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKHJlc3VsdCkpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJUU1VuaW9uVHlwZVwiOlxuICAgICAgY2FzZSBcIlVuaW9uVHlwZUFubm90YXRpb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIC8vIHNpbmdsZS1saW5lIHZhcmlhdGlvblxuICAgICAgICAgIC8vIEEgfCBCIHwgQ1xuICAgICAgICAgIC8vIG11bHRpLWxpbmUgdmFyaWF0aW9uXG4gICAgICAgICAgLy8gfCBBXG4gICAgICAgICAgLy8gfCBCXG4gICAgICAgICAgLy8gfCBDXG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7IC8vIElmIHRoZXJlJ3MgYSBsZWFkaW5nIGNvbW1lbnQsIHRoZSBwYXJlbnQgaXMgZG9pbmcgdGhlIGluZGVudGF0aW9uXG5cbiAgICAgICAgICBjb25zdCBzaG91bGRJbmRlbnQgPSBwYXJlbnQudHlwZSAhPT0gXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiICYmIHBhcmVudC50eXBlICE9PSBcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJHZW5lcmljVHlwZUFubm90YXRpb25cIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJUU1R5cGVSZWZlcmVuY2VcIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJUU1R5cGVBc3NlcnRpb25cIiAmJiBwYXJlbnQudHlwZSAhPT0gXCJUdXBsZVR5cGVBbm5vdGF0aW9uXCIgJiYgcGFyZW50LnR5cGUgIT09IFwiVFNUdXBsZVR5cGVcIiAmJiAhKHBhcmVudC50eXBlID09PSBcIkZ1bmN0aW9uVHlwZVBhcmFtXCIgJiYgIXBhcmVudC5uYW1lKSAmJiAhKChwYXJlbnQudHlwZSA9PT0gXCJUeXBlQWxpYXNcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0b3JcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCIpICYmIGhhc0xlYWRpbmdPd25MaW5lQ29tbWVudCQxKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBuLCBvcHRpb25zKSk7IC8vIHtcbiAgICAgICAgICAvLyAgIGE6IHN0cmluZ1xuICAgICAgICAgIC8vIH0gfCBudWxsIHwgdm9pZFxuICAgICAgICAgIC8vIHNob3VsZCBiZSBpbmxpbmVkIGFuZCBub3QgYmUgcHJpbnRlZCBpbiB0aGUgbXVsdGktbGluZSB2YXJpYW50XG5cbiAgICAgICAgICBjb25zdCBzaG91bGRIdWcgPSBzaG91bGRIdWdUeXBlKG4pOyAvLyBXZSB3YW50IHRvIGFsaWduIHRoZSBjaGlsZHJlbiBidXQgd2l0aG91dCBpdHMgY29tbWVudCwgc28gaXQgbG9va3MgbGlrZVxuICAgICAgICAgIC8vIHwgY2hpbGQxXG4gICAgICAgICAgLy8gLy8gY29tbWVudFxuICAgICAgICAgIC8vIHwgY2hpbGQyXG5cbiAgICAgICAgICBjb25zdCBwcmludGVkID0gcGF0aC5tYXAodHlwZVBhdGggPT4ge1xuICAgICAgICAgICAgbGV0IHByaW50ZWRUeXBlID0gdHlwZVBhdGguY2FsbChwcmludCk7XG5cbiAgICAgICAgICAgIGlmICghc2hvdWxkSHVnKSB7XG4gICAgICAgICAgICAgIHByaW50ZWRUeXBlID0gYWxpZ24kMSgyLCBwcmludGVkVHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb21tZW50cy5wcmludENvbW1lbnRzKHR5cGVQYXRoLCAoKSA9PiBwcmludGVkVHlwZSwgb3B0aW9ucyk7XG4gICAgICAgICAgfSwgXCJ0eXBlc1wiKTtcblxuICAgICAgICAgIGlmIChzaG91bGRIdWcpIHtcbiAgICAgICAgICAgIHJldHVybiBqb2luJDkoXCIgfCBcIiwgcHJpbnRlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2hvdWxkQWRkU3RhcnRMaW5lID0gc2hvdWxkSW5kZW50ICYmICFoYXNMZWFkaW5nT3duTGluZUNvbW1lbnQkMShvcHRpb25zLm9yaWdpbmFsVGV4dCwgbiwgb3B0aW9ucyk7XG4gICAgICAgICAgY29uc3QgY29kZSA9IGNvbmNhdCRkKFtpZkJyZWFrJDYoY29uY2F0JGQoW3Nob3VsZEFkZFN0YXJ0TGluZSA/IGxpbmUkOSA6IFwiXCIsIFwifCBcIl0pKSwgam9pbiQ5KGNvbmNhdCRkKFtsaW5lJDksIFwifCBcIl0pLCBwcmludGVkKV0pO1xuXG4gICAgICAgICAgaWYgKG5lZWRzUGFyZW5zXzEocGF0aCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKFtpbmRlbnQkNyhjb2RlKSwgc29mdGxpbmUkNl0pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09IFwiVHVwbGVUeXBlQW5ub3RhdGlvblwiICYmIHBhcmVudC50eXBlcy5sZW5ndGggPiAxIHx8IHBhcmVudC50eXBlID09PSBcIlRTVHVwbGVUeXBlXCIgJiYgcGFyZW50LmVsZW1lbnRUeXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChbaW5kZW50JDcoY29uY2F0JGQoW2lmQnJlYWskNihjb25jYXQkZChbXCIoXCIsIHNvZnRsaW5lJDZdKSksIGNvZGVdKSksIHNvZnRsaW5lJDYsIGlmQnJlYWskNihcIilcIildKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGdyb3VwJGIoc2hvdWxkSW5kZW50ID8gaW5kZW50JDcoY29kZSkgOiBjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW1wiP1wiLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZUFubm90YXRpb25cIildKTtcblxuICAgICAgY2FzZSBcIlRTTnVsbEtleXdvcmRcIjpcbiAgICAgIGNhc2UgXCJOdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgICAgIHJldHVybiBcIm51bGxcIjtcblxuICAgICAgY2FzZSBcIlRoaXNUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICByZXR1cm4gXCJ0aGlzXCI7XG5cbiAgICAgIGNhc2UgXCJOdW1iZXJUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICByZXR1cm4gXCJudW1iZXJcIjtcblxuICAgICAgY2FzZSBcIlN5bWJvbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgICAgIHJldHVybiBcInN5bWJvbFwiO1xuXG4gICAgICBjYXNlIFwiT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eVwiOlxuICAgICAgICBpZiAobi5zdGF0aWMpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwic3RhdGljIFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcnRzLnB1c2gocGF0aC5jYWxsKHByaW50LCBcInZhbHVlXCIpKTtcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcblxuICAgICAgY2FzZSBcIk9iamVjdFR5cGVJbmRleGVyXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCB2YXJpYW5jZSA9IGdldEZsb3dWYXJpYW5jZSQxKG4pO1xuICAgICAgICAgIHJldHVybiBjb25jYXQkZChbdmFyaWFuY2UgfHwgXCJcIiwgXCJbXCIsIHBhdGguY2FsbChwcmludCwgXCJpZFwiKSwgbi5pZCA/IFwiOiBcIiA6IFwiXCIsIHBhdGguY2FsbChwcmludCwgXCJrZXlcIiksIFwiXTogXCIsIHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJPYmplY3RUeXBlUHJvcGVydHlcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHZhcmlhbmNlID0gZ2V0Rmxvd1ZhcmlhbmNlJDEobik7XG4gICAgICAgICAgbGV0IG1vZGlmaWVyID0gXCJcIjtcblxuICAgICAgICAgIGlmIChuLnByb3RvKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwicHJvdG8gXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChuLnN0YXRpYykge1xuICAgICAgICAgICAgbW9kaWZpZXIgPSBcInN0YXRpYyBcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29uY2F0JGQoW21vZGlmaWVyLCBpc0dldHRlck9yU2V0dGVyJDEobikgPyBuLmtpbmQgKyBcIiBcIiA6IFwiXCIsIHZhcmlhbmNlIHx8IFwiXCIsIHByaW50UHJvcGVydHlLZXkocGF0aCwgb3B0aW9ucywgcHJpbnQpLCBwcmludE9wdGlvbmFsVG9rZW4ocGF0aCksIGlzRnVuY3Rpb25Ob3RhdGlvbiQxKG4sIG9wdGlvbnMpID8gXCJcIiA6IFwiOiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInZhbHVlXCIpXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbcGF0aC5jYWxsKHByaW50LCBcInF1YWxpZmljYXRpb25cIiksIFwiLlwiLCBwYXRoLmNhbGwocHJpbnQsIFwiaWRcIildKTtcblxuICAgICAgY2FzZSBcIlN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICByZXR1cm4gbm9kZVN0cihuLCBvcHRpb25zKTtcblxuICAgICAgY2FzZSBcIk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIG4udmFsdWUsIFwibnVtYmVyXCIpO1xuXG4gICAgICAgIGlmIChuLmV4dHJhICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcHJpbnROdW1iZXIkMihuLmV4dHJhLnJhdyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJpbnROdW1iZXIkMihuLnJhdyk7XG5cbiAgICAgIGNhc2UgXCJTdHJpbmdUeXBlQW5ub3RhdGlvblwiOlxuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcblxuICAgICAgY2FzZSBcIkRlY2xhcmVUeXBlQWxpYXNcIjpcbiAgICAgIGNhc2UgXCJUeXBlQWxpYXNcIjpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChuLnR5cGUgPT09IFwiRGVjbGFyZVR5cGVBbGlhc1wiIHx8IG4uZGVjbGFyZSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChcImRlY2xhcmUgXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHByaW50ZWQgPSBwcmludEFzc2lnbm1lbnRSaWdodChuLmlkLCBuLnJpZ2h0LCBwYXRoLmNhbGwocHJpbnQsIFwicmlnaHRcIiksIG9wdGlvbnMpO1xuICAgICAgICAgIHBhcnRzLnB1c2goXCJ0eXBlIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiaWRcIiksIHBhdGguY2FsbChwcmludCwgXCJ0eXBlUGFyYW1ldGVyc1wiKSwgXCIgPVwiLCBwcmludGVkLCBzZW1pKTtcbiAgICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChwYXJ0cykpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJUeXBlQ2FzdEV4cHJlc3Npb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBjb25jYXQkZChbXCIoXCIsIHBhdGguY2FsbChwcmludCwgXCJleHByZXNzaW9uXCIpLCBwcmludFR5cGVBbm5vdGF0aW9uKHBhdGgsIG9wdGlvbnMsIHByaW50KSwgXCIpXCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCI6XG4gICAgICBjYXNlIFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgICAgICAgIGNvbnN0IGNvbW1lbnRTdGFydCA9IHZhbHVlLnJhbmdlID8gb3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2UoMCwgdmFsdWUucmFuZ2VbMF0pLmxhc3RJbmRleE9mKFwiLypcIikgOiAtMTsgLy8gQXMgbm90ZWQgaW4gdGhlIFR5cGVDYXN0RXhwcmVzc2lvbiBjb21tZW50cyBhYm92ZSwgd2UncmUgYWJsZSB0byB1c2UgYSBub3JtYWwgd2hpdGVzcGFjZSByZWdleCBoZXJlXG4gICAgICAgICAgLy8gYmVjYXVzZSB3ZSBrbm93IGZvciBzdXJlIHRoYXQgdGhpcyBpcyBhIHR5cGUgZGVmaW5pdGlvbi5cblxuICAgICAgICAgIGNvbnN0IGNvbW1lbnRTeW50YXggPSBjb21tZW50U3RhcnQgPj0gMCAmJiBvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShjb21tZW50U3RhcnQpLm1hdGNoKC9eXFwvXFwqXFxzKjo6Lyk7XG5cbiAgICAgICAgICBpZiAoY29tbWVudFN5bnRheCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcIi8qOjogXCIsIHByaW50VHlwZVBhcmFtZXRlcnMocGF0aCwgb3B0aW9ucywgcHJpbnQsIFwicGFyYW1zXCIpLCBcIiAqL1wiXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHByaW50VHlwZVBhcmFtZXRlcnMocGF0aCwgb3B0aW9ucywgcHJpbnQsIFwicGFyYW1zXCIpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiOlxuICAgICAgY2FzZSBcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIjpcbiAgICAgICAgcmV0dXJuIHByaW50VHlwZVBhcmFtZXRlcnMocGF0aCwgb3B0aW9ucywgcHJpbnQsIFwicGFyYW1zXCIpO1xuXG4gICAgICBjYXNlIFwiVFNUeXBlUGFyYW1ldGVyXCI6XG4gICAgICBjYXNlIFwiVHlwZVBhcmFtZXRlclwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG5cbiAgICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09IFwiVFNNYXBwZWRUeXBlXCIpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCJbXCIsIHBhdGguY2FsbChwcmludCwgXCJuYW1lXCIpKTtcblxuICAgICAgICAgICAgaWYgKG4uY29uc3RyYWludCkge1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFwiIGluIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiY29uc3RyYWludFwiKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCJdXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB2YXJpYW5jZSA9IGdldEZsb3dWYXJpYW5jZSQxKG4pO1xuXG4gICAgICAgICAgaWYgKHZhcmlhbmNlKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHZhcmlhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcmludCwgXCJuYW1lXCIpKTtcblxuICAgICAgICAgIGlmIChuLmJvdW5kKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiOiBcIik7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcmludCwgXCJib3VuZFwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG4uY29uc3RyYWludCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIiBleHRlbmRzIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiY29uc3RyYWludFwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG4uZGVmYXVsdCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIiA9IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiZGVmYXVsdFwiKSk7XG4gICAgICAgICAgfSAvLyBLZWVwIGNvbW1hIGlmIHRoZSBmaWxlIGV4dGVuc2lvbiBpcyAudHN4IGFuZFxuICAgICAgICAgIC8vIGhhcyBvbmUgdHlwZSBwYXJhbWV0ZXIgdGhhdCBpc24ndCBleHRlbmQgd2l0aCBhbnkgdHlwZXMuXG4gICAgICAgICAgLy8gQmVjYXVzZSwgb3RoZXJ3aXNlIGZvcm1hdHRlZCByZXN1bHQgd2lsbCBiZSBpbnZhbGlkIGFzIHRzeC5cblxuXG4gICAgICAgICAgY29uc3QgZ3JhbmRQYXJlbnQgPSBwYXRoLmdldE5vZGUoMik7XG5cbiAgICAgICAgICBpZiAocGFyZW50LnBhcmFtcyAmJiBwYXJlbnQucGFyYW1zLmxlbmd0aCA9PT0gMSAmJiBpc1RTWEZpbGUkMShvcHRpb25zKSAmJiAhbi5jb25zdHJhaW50ICYmIGdyYW5kUGFyZW50LnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIikge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIixcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiVHlwZW9mVHlwZUFubm90YXRpb25cIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcInR5cGVvZiBcIiwgcGF0aC5jYWxsKHByaW50LCBcImFyZ3VtZW50XCIpXSk7XG5cbiAgICAgIGNhc2UgXCJWb2lkVHlwZUFubm90YXRpb25cIjpcbiAgICAgICAgcmV0dXJuIFwidm9pZFwiO1xuXG4gICAgICBjYXNlIFwiSW5mZXJyZWRQcmVkaWNhdGVcIjpcbiAgICAgICAgcmV0dXJuIFwiJWNoZWNrc1wiO1xuICAgICAgLy8gVW5oYW5kbGVkIHR5cGVzIGJlbG93LiBJZiBlbmNvdW50ZXJlZCwgbm9kZXMgb2YgdGhlc2UgdHlwZXMgc2hvdWxkXG4gICAgICAvLyBiZSBlaXRoZXIgbGVmdCBhbG9uZSBvciBkZXN1Z2FyZWQgaW50byBBU1QgdHlwZXMgdGhhdCBhcmUgZnVsbHlcbiAgICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgcHJldHR5LXByaW50ZXIuXG5cbiAgICAgIGNhc2UgXCJEZWNsYXJlZFByZWRpY2F0ZVwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW1wiJWNoZWNrcyhcIiwgcGF0aC5jYWxsKHByaW50LCBcInZhbHVlXCIpLCBcIilcIl0pO1xuXG4gICAgICBjYXNlIFwiVFNBYnN0cmFjdEtleXdvcmRcIjpcbiAgICAgICAgcmV0dXJuIFwiYWJzdHJhY3RcIjtcblxuICAgICAgY2FzZSBcIlRTQW55S2V5d29yZFwiOlxuICAgICAgICByZXR1cm4gXCJhbnlcIjtcblxuICAgICAgY2FzZSBcIlRTQXN5bmNLZXl3b3JkXCI6XG4gICAgICAgIHJldHVybiBcImFzeW5jXCI7XG5cbiAgICAgIGNhc2UgXCJUU0Jvb2xlYW5LZXl3b3JkXCI6XG4gICAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcblxuICAgICAgY2FzZSBcIlRTQmlnSW50S2V5d29yZFwiOlxuICAgICAgICByZXR1cm4gXCJiaWdpbnRcIjtcblxuICAgICAgY2FzZSBcIlRTQ29uc3RLZXl3b3JkXCI6XG4gICAgICAgIHJldHVybiBcImNvbnN0XCI7XG5cbiAgICAgIGNhc2UgXCJUU0RlY2xhcmVLZXl3b3JkXCI6XG4gICAgICAgIHJldHVybiBcImRlY2xhcmVcIjtcblxuICAgICAgY2FzZSBcIlRTRXhwb3J0S2V5d29yZFwiOlxuICAgICAgICByZXR1cm4gXCJleHBvcnRcIjtcblxuICAgICAgY2FzZSBcIlRTTmV2ZXJLZXl3b3JkXCI6XG4gICAgICAgIHJldHVybiBcIm5ldmVyXCI7XG5cbiAgICAgIGNhc2UgXCJUU051bWJlcktleXdvcmRcIjpcbiAgICAgICAgcmV0dXJuIFwibnVtYmVyXCI7XG5cbiAgICAgIGNhc2UgXCJUU09iamVjdEtleXdvcmRcIjpcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCI7XG5cbiAgICAgIGNhc2UgXCJUU1Byb3RlY3RlZEtleXdvcmRcIjpcbiAgICAgICAgcmV0dXJuIFwicHJvdGVjdGVkXCI7XG5cbiAgICAgIGNhc2UgXCJUU1ByaXZhdGVLZXl3b3JkXCI6XG4gICAgICAgIHJldHVybiBcInByaXZhdGVcIjtcblxuICAgICAgY2FzZSBcIlRTUHVibGljS2V5d29yZFwiOlxuICAgICAgICByZXR1cm4gXCJwdWJsaWNcIjtcblxuICAgICAgY2FzZSBcIlRTUmVhZG9ubHlLZXl3b3JkXCI6XG4gICAgICAgIHJldHVybiBcInJlYWRvbmx5XCI7XG5cbiAgICAgIGNhc2UgXCJUU1N5bWJvbEtleXdvcmRcIjpcbiAgICAgICAgcmV0dXJuIFwic3ltYm9sXCI7XG5cbiAgICAgIGNhc2UgXCJUU1N0YXRpY0tleXdvcmRcIjpcbiAgICAgICAgcmV0dXJuIFwic3RhdGljXCI7XG5cbiAgICAgIGNhc2UgXCJUU1N0cmluZ0tleXdvcmRcIjpcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG5cbiAgICAgIGNhc2UgXCJUU1VuZGVmaW5lZEtleXdvcmRcIjpcbiAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG5cbiAgICAgIGNhc2UgXCJUU1Vua25vd25LZXl3b3JkXCI6XG4gICAgICAgIHJldHVybiBcInVua25vd25cIjtcblxuICAgICAgY2FzZSBcIlRTVm9pZEtleXdvcmRcIjpcbiAgICAgICAgcmV0dXJuIFwidm9pZFwiO1xuXG4gICAgICBjYXNlIFwiVFNBc0V4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwiZXhwcmVzc2lvblwiKSwgXCIgYXMgXCIsIHBhdGguY2FsbChwcmludCwgXCJ0eXBlQW5ub3RhdGlvblwiKV0pO1xuXG4gICAgICBjYXNlIFwiVFNBcnJheVR5cGVcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwiZWxlbWVudFR5cGVcIiksIFwiW11cIl0pO1xuXG4gICAgICBjYXNlIFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKG4uZXhwb3J0KSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiZXhwb3J0IFwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobi5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKG4uYWNjZXNzaWJpbGl0eSArIFwiIFwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobi5zdGF0aWMpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCJzdGF0aWMgXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwicmVhZG9ubHkgXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRzLnB1c2gocHJpbnRQcm9wZXJ0eUtleShwYXRoLCBvcHRpb25zLCBwcmludCksIHByaW50T3B0aW9uYWxUb2tlbihwYXRoKSk7XG5cbiAgICAgICAgICBpZiAobi50eXBlQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIjogXCIpO1xuICAgICAgICAgICAgcGFydHMucHVzaChwYXRoLmNhbGwocHJpbnQsIFwidHlwZUFubm90YXRpb25cIikpO1xuICAgICAgICAgIH0gLy8gVGhpcyBpc24ndCB2YWxpZCBzZW1hbnRpY2FsbHksIGJ1dCBpdCdzIGluIHRoZSBBU1Qgc28gd2UgY2FuIHByaW50IGl0LlxuXG5cbiAgICAgICAgICBpZiAobi5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIiA9IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiaW5pdGlhbGl6ZXJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIlRTUGFyYW1ldGVyUHJvcGVydHlcIjpcbiAgICAgICAgaWYgKG4uYWNjZXNzaWJpbGl0eSkge1xuICAgICAgICAgIHBhcnRzLnB1c2gobi5hY2Nlc3NpYmlsaXR5ICsgXCIgXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG4uZXhwb3J0KSB7XG4gICAgICAgICAgcGFydHMucHVzaChcImV4cG9ydCBcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobi5zdGF0aWMpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwic3RhdGljIFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuLnJlYWRvbmx5KSB7XG4gICAgICAgICAgcGFydHMucHVzaChcInJlYWRvbmx5IFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcnRzLnB1c2gocGF0aC5jYWxsKHByaW50LCBcInBhcmFtZXRlclwiKSk7XG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJUU1R5cGVSZWZlcmVuY2VcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwidHlwZU5hbWVcIiksIHByaW50VHlwZVBhcmFtZXRlcnMocGF0aCwgb3B0aW9ucywgcHJpbnQsIFwidHlwZVBhcmFtZXRlcnNcIildKTtcblxuICAgICAgY2FzZSBcIlRTVHlwZVF1ZXJ5XCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJ0eXBlb2YgXCIsIHBhdGguY2FsbChwcmludCwgXCJleHByTmFtZVwiKV0pO1xuXG4gICAgICBjYXNlIFwiVFNJbmRleFNpZ25hdHVyZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7IC8vIFRoZSB0eXBlc2NyaXB0IHBhcnNlciBhY2NlcHRzIG11bHRpcGxlIHBhcmFtZXRlcnMgaGVyZS4gSWYgeW91J3JlXG4gICAgICAgICAgLy8gdXNpbmcgdGhlbSwgaXQgbWFrZXMgc2Vuc2UgdG8gaGF2ZSBhIHRyYWlsaW5nIGNvbW1hLiBCdXQgaWYgeW91XG4gICAgICAgICAgLy8gYXJlbid0LCB0aGlzIGlzIG1vcmUgbGlrZSBhIGNvbXB1dGVkIHByb3BlcnR5IG5hbWUgdGhhbiBhbiBhcnJheS5cbiAgICAgICAgICAvLyBTbyB3ZSBsZWF2ZSBvZmYgdGhlIHRyYWlsaW5nIGNvbW1hIHdoZW4gdGhlcmUncyBqdXN0IG9uZSBwYXJhbWV0ZXIuXG5cbiAgICAgICAgICBjb25zdCB0cmFpbGluZ0NvbW1hID0gbi5wYXJhbWV0ZXJzLmxlbmd0aCA+IDEgPyBpZkJyZWFrJDYoc2hvdWxkUHJpbnRDb21tYSQxKG9wdGlvbnMpID8gXCIsXCIgOiBcIlwiKSA6IFwiXCI7XG4gICAgICAgICAgY29uc3QgcGFyYW1ldGVyc0dyb3VwID0gZ3JvdXAkYihjb25jYXQkZChbaW5kZW50JDcoY29uY2F0JGQoW3NvZnRsaW5lJDYsIGpvaW4kOShjb25jYXQkZChbXCIsIFwiLCBzb2Z0bGluZSQ2XSksIHBhdGgubWFwKHByaW50LCBcInBhcmFtZXRlcnNcIikpXSkpLCB0cmFpbGluZ0NvbW1hLCBzb2Z0bGluZSQ2XSkpO1xuICAgICAgICAgIHJldHVybiBjb25jYXQkZChbbi5leHBvcnQgPyBcImV4cG9ydCBcIiA6IFwiXCIsIG4uYWNjZXNzaWJpbGl0eSA/IGNvbmNhdCRkKFtuLmFjY2Vzc2liaWxpdHksIFwiIFwiXSkgOiBcIlwiLCBuLnN0YXRpYyA/IFwic3RhdGljIFwiIDogXCJcIiwgbi5yZWFkb25seSA/IFwicmVhZG9ubHkgXCIgOiBcIlwiLCBcIltcIiwgbi5wYXJhbWV0ZXJzID8gcGFyYW1ldGVyc0dyb3VwIDogXCJcIiwgbi50eXBlQW5ub3RhdGlvbiA/IFwiXTogXCIgOiBcIl1cIiwgbi50eXBlQW5ub3RhdGlvbiA/IHBhdGguY2FsbChwcmludCwgXCJ0eXBlQW5ub3RhdGlvblwiKSA6IFwiXCIsIHBhcmVudC50eXBlID09PSBcIkNsYXNzQm9keVwiID8gc2VtaSA6IFwiXCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiVFNUeXBlUHJlZGljYXRlXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbbi5hc3NlcnRzID8gXCJhc3NlcnRzIFwiIDogXCJcIiwgcGF0aC5jYWxsKHByaW50LCBcInBhcmFtZXRlck5hbWVcIiksIG4udHlwZUFubm90YXRpb24gPyBjb25jYXQkZChbXCIgaXMgXCIsIHBhdGguY2FsbChwcmludCwgXCJ0eXBlQW5ub3RhdGlvblwiKV0pIDogXCJcIl0pO1xuXG4gICAgICBjYXNlIFwiVFNOb25OdWxsRXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW3BhdGguY2FsbChwcmludCwgXCJleHByZXNzaW9uXCIpLCBcIiFcIl0pO1xuXG4gICAgICBjYXNlIFwiVFNUaGlzVHlwZVwiOlxuICAgICAgICByZXR1cm4gXCJ0aGlzXCI7XG5cbiAgICAgIGNhc2UgXCJUU0ltcG9ydFR5cGVcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFshbi5pc1R5cGVPZiA/IFwiXCIgOiBcInR5cGVvZiBcIiwgXCJpbXBvcnQoXCIsIHBhdGguY2FsbChwcmludCwgbi5wYXJhbWV0ZXIgPyBcInBhcmFtZXRlclwiIDogXCJhcmd1bWVudFwiKSwgXCIpXCIsICFuLnF1YWxpZmllciA/IFwiXCIgOiBjb25jYXQkZChbXCIuXCIsIHBhdGguY2FsbChwcmludCwgXCJxdWFsaWZpZXJcIildKSwgcHJpbnRUeXBlUGFyYW1ldGVycyhwYXRoLCBvcHRpb25zLCBwcmludCwgXCJ0eXBlUGFyYW1ldGVyc1wiKV0pO1xuXG4gICAgICBjYXNlIFwiVFNMaXRlcmFsVHlwZVwiOlxuICAgICAgICByZXR1cm4gcGF0aC5jYWxsKHByaW50LCBcImxpdGVyYWxcIik7XG5cbiAgICAgIGNhc2UgXCJUU0luZGV4ZWRBY2Nlc3NUeXBlXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbcGF0aC5jYWxsKHByaW50LCBcIm9iamVjdFR5cGVcIiksIFwiW1wiLCBwYXRoLmNhbGwocHJpbnQsIFwiaW5kZXhUeXBlXCIpLCBcIl1cIl0pO1xuXG4gICAgICBjYXNlIFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiOlxuICAgICAgY2FzZSBcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCI6XG4gICAgICBjYXNlIFwiVFNDb25zdHJ1Y3RvclR5cGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChuLnR5cGUgIT09IFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIikge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIm5ldyBcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFydHMucHVzaChncm91cCRiKHByaW50RnVuY3Rpb25QYXJhbXMocGF0aCwgcHJpbnQsIG9wdGlvbnMsXG4gICAgICAgICAgLyogZXhwYW5kQXJnICovXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgLyogcHJpbnRUeXBlUGFyYW1zICovXG4gICAgICAgICAgdHJ1ZSkpKTtcblxuICAgICAgICAgIGlmIChuLnJldHVyblR5cGUgfHwgbi50eXBlQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlID0gbi50eXBlID09PSBcIlRTQ29uc3RydWN0b3JUeXBlXCI7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGlzVHlwZSA/IFwiID0+IFwiIDogXCI6IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwicmV0dXJuVHlwZVwiKSwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVBbm5vdGF0aW9uXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJUU1R5cGVPcGVyYXRvclwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW24ub3BlcmF0b3IsIFwiIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZUFubm90YXRpb25cIildKTtcblxuICAgICAgY2FzZSBcIlRTTWFwcGVkVHlwZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkQnJlYWsgPSBoYXNOZXdsaW5lSW5SYW5nZSQzKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBvcHRpb25zLmxvY1N0YXJ0KG4pLCBvcHRpb25zLmxvY0VuZChuKSk7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW1wie1wiLCBpbmRlbnQkNyhjb25jYXQkZChbb3B0aW9ucy5icmFja2V0U3BhY2luZyA/IGxpbmUkOSA6IHNvZnRsaW5lJDYsIG4ucmVhZG9ubHkgPyBjb25jYXQkZChbZ2V0VHlwZVNjcmlwdE1hcHBlZFR5cGVNb2RpZmllciQxKG4ucmVhZG9ubHksIFwicmVhZG9ubHlcIiksIFwiIFwiXSkgOiBcIlwiLCBwcmludFR5cGVTY3JpcHRNb2RpZmllcnMocGF0aCwgb3B0aW9ucywgcHJpbnQpLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZVBhcmFtZXRlclwiKSwgbi5vcHRpb25hbCA/IGdldFR5cGVTY3JpcHRNYXBwZWRUeXBlTW9kaWZpZXIkMShuLm9wdGlvbmFsLCBcIj9cIikgOiBcIlwiLCBuLnR5cGVBbm5vdGF0aW9uID8gXCI6IFwiIDogXCJcIiwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVBbm5vdGF0aW9uXCIpLCBpZkJyZWFrJDYoc2VtaSwgXCJcIildKSksIGNvbW1lbnRzLnByaW50RGFuZ2xpbmdDb21tZW50cyhwYXRoLCBvcHRpb25zLFxuICAgICAgICAgIC8qIHNhbWVJbmRlbnQgKi9cbiAgICAgICAgICB0cnVlKSwgb3B0aW9ucy5icmFja2V0U3BhY2luZyA/IGxpbmUkOSA6IHNvZnRsaW5lJDYsIFwifVwiXSksIHtcbiAgICAgICAgICAgIHNob3VsZEJyZWFrXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIlRTTWV0aG9kU2lnbmF0dXJlXCI6XG4gICAgICAgIHBhcnRzLnB1c2gobi5hY2Nlc3NpYmlsaXR5ID8gY29uY2F0JGQoW24uYWNjZXNzaWJpbGl0eSwgXCIgXCJdKSA6IFwiXCIsIG4uZXhwb3J0ID8gXCJleHBvcnQgXCIgOiBcIlwiLCBuLnN0YXRpYyA/IFwic3RhdGljIFwiIDogXCJcIiwgbi5yZWFkb25seSA/IFwicmVhZG9ubHkgXCIgOiBcIlwiLCBuLmNvbXB1dGVkID8gXCJbXCIgOiBcIlwiLCBwYXRoLmNhbGwocHJpbnQsIFwia2V5XCIpLCBuLmNvbXB1dGVkID8gXCJdXCIgOiBcIlwiLCBwcmludE9wdGlvbmFsVG9rZW4ocGF0aCksIHByaW50RnVuY3Rpb25QYXJhbXMocGF0aCwgcHJpbnQsIG9wdGlvbnMsXG4gICAgICAgIC8qIGV4cGFuZEFyZyAqL1xuICAgICAgICBmYWxzZSxcbiAgICAgICAgLyogcHJpbnRUeXBlUGFyYW1zICovXG4gICAgICAgIHRydWUpKTtcblxuICAgICAgICBpZiAobi5yZXR1cm5UeXBlIHx8IG4udHlwZUFubm90YXRpb24pIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiOiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInJldHVyblR5cGVcIiksIHBhdGguY2FsbChwcmludCwgXCJ0eXBlQW5ub3RhdGlvblwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChwYXJ0cykpO1xuXG4gICAgICBjYXNlIFwiVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvblwiOlxuICAgICAgICBwYXJ0cy5wdXNoKFwiZXhwb3J0IGFzIG5hbWVzcGFjZSBcIiwgcGF0aC5jYWxsKHByaW50LCBcImlkXCIpKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5zZW1pKSB7XG4gICAgICAgICAgcGFydHMucHVzaChcIjtcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChwYXJ0cykpO1xuXG4gICAgICBjYXNlIFwiVFNFbnVtRGVjbGFyYXRpb25cIjpcbiAgICAgICAgaWYgKG4uZGVjbGFyZSkge1xuICAgICAgICAgIHBhcnRzLnB1c2goXCJkZWNsYXJlIFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuLm1vZGlmaWVycykge1xuICAgICAgICAgIHBhcnRzLnB1c2gocHJpbnRUeXBlU2NyaXB0TW9kaWZpZXJzKHBhdGgsIG9wdGlvbnMsIHByaW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobi5jb25zdCkge1xuICAgICAgICAgIHBhcnRzLnB1c2goXCJjb25zdCBcIik7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cy5wdXNoKFwiZW51bSBcIiwgcGF0aC5jYWxsKHByaW50LCBcImlkXCIpLCBcIiBcIik7XG5cbiAgICAgICAgaWYgKG4ubWVtYmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGdyb3VwJGIoY29uY2F0JGQoW1wie1wiLCBjb21tZW50cy5wcmludERhbmdsaW5nQ29tbWVudHMocGF0aCwgb3B0aW9ucyksIHNvZnRsaW5lJDYsIFwifVwiXSkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGdyb3VwJGIoY29uY2F0JGQoW1wie1wiLCBpbmRlbnQkNyhjb25jYXQkZChbaGFyZGxpbmUkOSwgcHJpbnRBcnJheUl0ZW1zKHBhdGgsIG9wdGlvbnMsIFwibWVtYmVyc1wiLCBwcmludCksIHNob3VsZFByaW50Q29tbWEkMShvcHRpb25zLCBcImVzNVwiKSA/IFwiLFwiIDogXCJcIl0pKSwgY29tbWVudHMucHJpbnREYW5nbGluZ0NvbW1lbnRzKHBhdGgsIG9wdGlvbnMsXG4gICAgICAgICAgLyogc2FtZUluZGVudCAqL1xuICAgICAgICAgIHRydWUpLCBoYXJkbGluZSQ5LCBcIn1cIl0pKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuXG4gICAgICBjYXNlIFwiVFNFbnVtTWVtYmVyXCI6XG4gICAgICAgIHBhcnRzLnB1c2gocGF0aC5jYWxsKHByaW50LCBcImlkXCIpKTtcblxuICAgICAgICBpZiAobi5pbml0aWFsaXplcikge1xuICAgICAgICAgIHBhcnRzLnB1c2goXCIgPSBcIiwgcGF0aC5jYWxsKHByaW50LCBcImluaXRpYWxpemVyXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG5cbiAgICAgIGNhc2UgXCJUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uXCI6XG4gICAgICAgIGlmIChuLmlzRXhwb3J0KSB7XG4gICAgICAgICAgcGFydHMucHVzaChcImV4cG9ydCBcIik7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cy5wdXNoKFwiaW1wb3J0IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiaWRcIiksIFwiID0gXCIsIHBhdGguY2FsbChwcmludCwgXCJtb2R1bGVSZWZlcmVuY2VcIikpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNlbWkpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiO1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKHBhcnRzKSk7XG5cbiAgICAgIGNhc2UgXCJUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJyZXF1aXJlKFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiZXhwcmVzc2lvblwiKSwgXCIpXCJdKTtcblxuICAgICAgY2FzZSBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuICAgICAgICAgIGNvbnN0IGlzRXh0ZXJuYWxNb2R1bGUgPSBpc0xpdGVyYWwkMShuLmlkKTtcbiAgICAgICAgICBjb25zdCBwYXJlbnRJc0RlY2xhcmF0aW9uID0gcGFyZW50LnR5cGUgPT09IFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiO1xuICAgICAgICAgIGNvbnN0IGJvZHlJc0RlY2xhcmF0aW9uID0gbi5ib2R5ICYmIG4uYm9keS50eXBlID09PSBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIjtcblxuICAgICAgICAgIGlmIChwYXJlbnRJc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiLlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG4uZGVjbGFyZSkge1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFwiZGVjbGFyZSBcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcnRzLnB1c2gocHJpbnRUeXBlU2NyaXB0TW9kaWZpZXJzKHBhdGgsIG9wdGlvbnMsIHByaW50KSk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0QmV0d2Vlbk5vZGVBbmRJdHNJZCA9IG9wdGlvbnMub3JpZ2luYWxUZXh0LnNsaWNlKG9wdGlvbnMubG9jU3RhcnQobiksIG9wdGlvbnMubG9jU3RhcnQobi5pZCkpOyAvLyBHbG9iYWwgZGVjbGFyYXRpb24gbG9va3MgbGlrZSB0aGlzOlxuICAgICAgICAgICAgLy8gKGRlY2xhcmUpPyBnbG9iYWwgeyAuLi4gfVxuXG4gICAgICAgICAgICBjb25zdCBpc0dsb2JhbERlY2xhcmF0aW9uID0gbi5pZC50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBuLmlkLm5hbWUgPT09IFwiZ2xvYmFsXCIgJiYgIS9uYW1lc3BhY2V8bW9kdWxlLy50ZXN0KHRleHRCZXR3ZWVuTm9kZUFuZEl0c0lkKTtcblxuICAgICAgICAgICAgaWYgKCFpc0dsb2JhbERlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goaXNFeHRlcm5hbE1vZHVsZSB8fCAvKF58XFxzKW1vZHVsZShcXHN8JCkvLnRlc3QodGV4dEJldHdlZW5Ob2RlQW5kSXRzSWQpID8gXCJtb2R1bGUgXCIgOiBcIm5hbWVzcGFjZSBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFydHMucHVzaChwYXRoLmNhbGwocHJpbnQsIFwiaWRcIikpO1xuXG4gICAgICAgICAgaWYgKGJvZHlJc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcmludCwgXCJib2R5XCIpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG4uYm9keSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIiBcIiwgZ3JvdXAkYihwYXRoLmNhbGwocHJpbnQsIFwiYm9keVwiKSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHNlbWkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcIlByaXZhdGVOYW1lXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCIjXCIsIHBhdGguY2FsbChwcmludCwgXCJpZFwiKV0pO1xuICAgICAgLy8gVE9ETzogVGVtcG9yYXJ5IGF1dG8tZ2VuZXJhdGVkIG5vZGUgdHlwZS4gVG8gcmVtb3ZlIHdoZW4gdHlwZXNjcmlwdC1lc3RyZWUgaGFzIHByb3BlciBzdXBwb3J0IGZvciBwcml2YXRlIGZpZWxkcy5cblxuICAgICAgY2FzZSBcIlRTUHJpdmF0ZUlkZW50aWZpZXJcIjpcbiAgICAgICAgcmV0dXJuIG4uZXNjYXBlZFRleHQ7XG5cbiAgICAgIGNhc2UgXCJUU0NvbmRpdGlvbmFsVHlwZVwiOlxuICAgICAgICByZXR1cm4gcHJpbnRUZXJuYXJ5T3BlcmF0b3IocGF0aCwgb3B0aW9ucywgcHJpbnQsIHtcbiAgICAgICAgICBiZWZvcmVQYXJ0czogKCkgPT4gW3BhdGguY2FsbChwcmludCwgXCJjaGVja1R5cGVcIiksIFwiIFwiLCBcImV4dGVuZHNcIiwgXCIgXCIsIHBhdGguY2FsbChwcmludCwgXCJleHRlbmRzVHlwZVwiKV0sXG4gICAgICAgICAgYWZ0ZXJQYXJ0czogKCkgPT4gW10sXG4gICAgICAgICAgc2hvdWxkQ2hlY2tKc3g6IGZhbHNlLFxuICAgICAgICAgIGNvbmRpdGlvbmFsTm9kZVR5cGU6IFwiVFNDb25kaXRpb25hbFR5cGVcIixcbiAgICAgICAgICBjb25zZXF1ZW50Tm9kZVByb3BlcnR5TmFtZTogXCJ0cnVlVHlwZVwiLFxuICAgICAgICAgIGFsdGVybmF0ZU5vZGVQcm9wZXJ0eU5hbWU6IFwiZmFsc2VUeXBlXCIsXG4gICAgICAgICAgdGVzdE5vZGVQcm9wZXJ0eU5hbWVzOiBbXCJjaGVja1R5cGVcIiwgXCJleHRlbmRzVHlwZVwiXVxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSBcIlRTSW5mZXJUeXBlXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJpbmZlclwiLCBcIiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVQYXJhbWV0ZXJcIildKTtcblxuICAgICAgY2FzZSBcIkludGVycHJldGVyRGlyZWN0aXZlXCI6XG4gICAgICAgIHBhcnRzLnB1c2goXCIjIVwiLCBuLnZhbHVlLCBoYXJkbGluZSQ5KTtcblxuICAgICAgICBpZiAoaXNOZXh0TGluZUVtcHR5JDQob3B0aW9ucy5vcmlnaW5hbFRleHQsIG4sIG9wdGlvbnMubG9jRW5kKSkge1xuICAgICAgICAgIHBhcnRzLnB1c2goaGFyZGxpbmUkOSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuXG4gICAgICBjYXNlIFwiTkdSb290XCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXS5jb25jYXQocGF0aC5jYWxsKHByaW50LCBcIm5vZGVcIiksICFuLm5vZGUuY29tbWVudHMgfHwgbi5ub2RlLmNvbW1lbnRzLmxlbmd0aCA9PT0gMCA/IFtdIDogY29uY2F0JGQoW1wiIC8vXCIsIG4ubm9kZS5jb21tZW50c1swXS52YWx1ZS50cmltRW5kKCldKSkpO1xuXG4gICAgICBjYXNlIFwiTkdDaGFpbmVkRXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gZ3JvdXAkYihqb2luJDkoY29uY2F0JGQoW1wiO1wiLCBsaW5lJDldKSwgcGF0aC5tYXAoY2hpbGRQYXRoID0+IGhhc05nU2lkZUVmZmVjdCQxKGNoaWxkUGF0aCkgPyBwcmludChjaGlsZFBhdGgpIDogY29uY2F0JGQoW1wiKFwiLCBwcmludChjaGlsZFBhdGgpLCBcIilcIl0pLCBcImV4cHJlc3Npb25zXCIpKSk7XG5cbiAgICAgIGNhc2UgXCJOR0VtcHR5RXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gXCJcIjtcblxuICAgICAgY2FzZSBcIk5HUXVvdGVkRXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW24ucHJlZml4LCBcIjogXCIsIG4udmFsdWUudHJpbSgpXSk7XG5cbiAgICAgIGNhc2UgXCJOR01pY3Jvc3ludGF4XCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChwYXRoLm1hcCgoY2hpbGRQYXRoLCBpbmRleCkgPT4gY29uY2F0JGQoW2luZGV4ID09PSAwID8gXCJcIiA6IGlzTmdGb3JPZiQxKGNoaWxkUGF0aC5nZXRWYWx1ZSgpLCBpbmRleCwgbikgPyBcIiBcIiA6IGNvbmNhdCRkKFtcIjtcIiwgbGluZSQ5XSksIHByaW50KGNoaWxkUGF0aCldKSwgXCJib2R5XCIpKTtcblxuICAgICAgY2FzZSBcIk5HTWljcm9zeW50YXhLZXlcIjpcbiAgICAgICAgcmV0dXJuIC9eW2Etel8kXVthLXowLTlfJF0qKC1bYS16XyRdW2EtejAtOV8kXSkqJC9pLnRlc3Qobi5uYW1lKSA/IG4ubmFtZSA6IEpTT04uc3RyaW5naWZ5KG4ubmFtZSk7XG5cbiAgICAgIGNhc2UgXCJOR01pY3Jvc3ludGF4RXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW3BhdGguY2FsbChwcmludCwgXCJleHByZXNzaW9uXCIpLCBuLmFsaWFzID09PSBudWxsID8gXCJcIiA6IGNvbmNhdCRkKFtcIiBhcyBcIiwgcGF0aC5jYWxsKHByaW50LCBcImFsaWFzXCIpXSldKTtcblxuICAgICAgY2FzZSBcIk5HTWljcm9zeW50YXhLZXllZEV4cHJlc3Npb25cIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGF0aC5nZXROYW1lKCk7XG4gICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuICAgICAgICAgIGNvbnN0IHNob3VsZE5vdFByaW50Q29sb24gPSBpc05nRm9yT2YkMShuLCBpbmRleCwgcGFyZW50Tm9kZSkgfHwgKGluZGV4ID09PSAxICYmIChuLmtleS5uYW1lID09PSBcInRoZW5cIiB8fCBuLmtleS5uYW1lID09PSBcImVsc2VcIikgfHwgaW5kZXggPT09IDIgJiYgbi5rZXkubmFtZSA9PT0gXCJlbHNlXCIgJiYgcGFyZW50Tm9kZS5ib2R5W2luZGV4IC0gMV0udHlwZSA9PT0gXCJOR01pY3Jvc3ludGF4S2V5ZWRFeHByZXNzaW9uXCIgJiYgcGFyZW50Tm9kZS5ib2R5W2luZGV4IC0gMV0ua2V5Lm5hbWUgPT09IFwidGhlblwiKSAmJiBwYXJlbnROb2RlLmJvZHlbMF0udHlwZSA9PT0gXCJOR01pY3Jvc3ludGF4RXhwcmVzc2lvblwiO1xuICAgICAgICAgIHJldHVybiBjb25jYXQkZChbcGF0aC5jYWxsKHByaW50LCBcImtleVwiKSwgc2hvdWxkTm90UHJpbnRDb2xvbiA/IFwiIFwiIDogXCI6IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiZXhwcmVzc2lvblwiKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJOR01pY3Jvc3ludGF4TGV0XCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCJsZXQgXCIsIHBhdGguY2FsbChwcmludCwgXCJrZXlcIiksIG4udmFsdWUgPT09IG51bGwgPyBcIlwiIDogY29uY2F0JGQoW1wiID0gXCIsIHBhdGguY2FsbChwcmludCwgXCJ2YWx1ZVwiKV0pXSk7XG5cbiAgICAgIGNhc2UgXCJOR01pY3Jvc3ludGF4QXNcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtwYXRoLmNhbGwocHJpbnQsIFwia2V5XCIpLCBcIiBhcyBcIiwgcGF0aC5jYWxsKHByaW50LCBcImFsaWFzXCIpXSk7XG5cbiAgICAgIGNhc2UgXCJBcmd1bWVudFBsYWNlaG9sZGVyXCI6XG4gICAgICAgIHJldHVybiBcIj9cIjtcbiAgICAgIC8vIFRoZXNlIGFyZSBub3QgdmFsaWQgVHlwZVNjcmlwdC4gUHJpbnRpbmcgdGhlbSBqdXN0IGZvciB0aGUgc2FrZSBvZiBlcnJvciByZWNvdmVyeS5cblxuICAgICAgY2FzZSBcIlRTSlNEb2NBbGxUeXBlXCI6XG4gICAgICAgIHJldHVybiBcIipcIjtcblxuICAgICAgY2FzZSBcIlRTSlNEb2NVbmtub3duVHlwZVwiOlxuICAgICAgICByZXR1cm4gXCI/XCI7XG5cbiAgICAgIGNhc2UgXCJUU0pTRG9jTnVsbGFibGVUeXBlXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZChbXCI/XCIsIHBhdGguY2FsbChwcmludCwgXCJ0eXBlQW5ub3RhdGlvblwiKV0pO1xuXG4gICAgICBjYXNlIFwiVFNKU0RvY05vbk51bGxhYmxlVHlwZVwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGQoW1wiIVwiLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZUFubm90YXRpb25cIildKTtcblxuICAgICAgY2FzZSBcIlRTSlNEb2NGdW5jdGlvblR5cGVcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcImZ1bmN0aW9uKFwiLCAvLyBUaGUgcGFyYW1ldGVycyBjb3VsZCBiZSBoZXJlLCBidXQgdHlwZXNjcmlwdC1lc3RyZWUgZG9lc24ndCBjb252ZXJ0IHRoZW0gYW55d2F5ICh0aHJvd3MgYW4gZXJyb3IpLlxuICAgICAgICBcIik6IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwidHlwZUFubm90YXRpb25cIildKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIEpTT04uc3RyaW5naWZ5KG4udHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50U3RhdGVtZW50U2VxdWVuY2UocGF0aCwgb3B0aW9ucywgcHJpbnQpIHtcbiAgICBjb25zdCBwcmludGVkID0gW107XG4gICAgY29uc3QgYm9keU5vZGUgPSBwYXRoLmdldE5vZGUoKTtcbiAgICBjb25zdCBpc0NsYXNzID0gYm9keU5vZGUudHlwZSA9PT0gXCJDbGFzc0JvZHlcIjtcbiAgICBwYXRoLm1hcCgoc3RtdFBhdGgsIGkpID0+IHtcbiAgICAgIGNvbnN0IHN0bXQgPSBzdG10UGF0aC5nZXRWYWx1ZSgpOyAvLyBKdXN0IGluIGNhc2UgdGhlIEFTVCBoYXMgYmVlbiBtb2RpZmllZCB0byBjb250YWluIGZhbHN5XG4gICAgICAvLyBcInN0YXRlbWVudHMsXCIgaXQncyBzYWZlciBzaW1wbHkgdG8gc2tpcCB0aGVtLlxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cblxuICAgICAgaWYgKCFzdG10KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gU2tpcCBwcmludGluZyBFbXB0eVN0YXRlbWVudCBub2RlcyB0byBhdm9pZCBsZWF2aW5nIHN0cmF5XG4gICAgICAvLyBzZW1pY29sb25zIGx5aW5nIGFyb3VuZC5cblxuXG4gICAgICBpZiAoc3RtdC50eXBlID09PSBcIkVtcHR5U3RhdGVtZW50XCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG10UHJpbnRlZCA9IHByaW50KHN0bXRQYXRoKTtcbiAgICAgIGNvbnN0IHRleHQgPSBvcHRpb25zLm9yaWdpbmFsVGV4dDtcbiAgICAgIGNvbnN0IHBhcnRzID0gW107IC8vIGluIG5vLXNlbWkgbW9kZSwgcHJlcGVuZCBzdGF0ZW1lbnQgd2l0aCBzZW1pY29sb24gaWYgaXQgbWlnaHQgYnJlYWsgQVNJXG4gICAgICAvLyBkb24ndCBwcmVwZW5kIHRoZSBvbmx5IEpTWCBlbGVtZW50IGluIGEgcHJvZ3JhbSB3aXRoIHNlbWljb2xvblxuXG4gICAgICBpZiAoIW9wdGlvbnMuc2VtaSAmJiAhaXNDbGFzcyAmJiAhaXNUaGVPbmx5SlNYRWxlbWVudEluTWFya2Rvd24kMShvcHRpb25zLCBzdG10UGF0aCkgJiYgc3RtdE5lZWRzQVNJUHJvdGVjdGlvbihzdG10UGF0aCwgb3B0aW9ucykpIHtcbiAgICAgICAgaWYgKHN0bXQuY29tbWVudHMgJiYgc3RtdC5jb21tZW50cy5zb21lKGNvbW1lbnQgPT4gY29tbWVudC5sZWFkaW5nKSkge1xuICAgICAgICAgIHBhcnRzLnB1c2gocHJpbnQoc3RtdFBhdGgsIHtcbiAgICAgICAgICAgIG5lZWRzU2VtaTogdHJ1ZVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiO1wiLCBzdG10UHJpbnRlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnB1c2goc3RtdFByaW50ZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnMuc2VtaSAmJiBpc0NsYXNzKSB7XG4gICAgICAgIGlmIChjbGFzc1Byb3BNYXlDYXVzZUFTSVByb2JsZW1zJDEoc3RtdFBhdGgpKSB7XG4gICAgICAgICAgcGFydHMucHVzaChcIjtcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RtdC50eXBlID09PSBcIkNsYXNzUHJvcGVydHlcIikge1xuICAgICAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGJvZHlOb2RlLmJvZHlbaSArIDFdO1xuXG4gICAgICAgICAgaWYgKGNsYXNzQ2hpbGROZWVkc0FTSVByb3RlY3Rpb24kMShuZXh0Q2hpbGQpKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiO1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzTmV4dExpbmVFbXB0eSQ0KHRleHQsIHN0bXQsIG9wdGlvbnMubG9jRW5kKSAmJiAhaXNMYXN0U3RhdGVtZW50JDEoc3RtdFBhdGgpKSB7XG4gICAgICAgIHBhcnRzLnB1c2goaGFyZGxpbmUkOSk7XG4gICAgICB9XG5cbiAgICAgIHByaW50ZWQucHVzaChjb25jYXQkZChwYXJ0cykpO1xuICAgIH0pO1xuICAgIHJldHVybiBqb2luJDkoaGFyZGxpbmUkOSwgcHJpbnRlZCk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludFByb3BlcnR5S2V5KHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0Tm9kZSgpO1xuXG4gICAgaWYgKG5vZGUuY29tcHV0ZWQpIHtcbiAgICAgIHJldHVybiBjb25jYXQkZChbXCJbXCIsIHBhdGguY2FsbChwcmludCwgXCJrZXlcIiksIFwiXVwiXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgY29uc3Qge1xuICAgICAga2V5XG4gICAgfSA9IG5vZGU7XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcIkNsYXNzUHJpdmF0ZVByb3BlcnR5XCIgJiYgLy8gZmxvdyBoYXMgYElkZW50aWZpZXJgIGtleSwgYW5kIGJhYmVsIGhhcyBgUHJpdmF0ZU5hbWVgIGtleVxuICAgIGtleS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcIiNcIiwgcGF0aC5jYWxsKHByaW50LCBcImtleVwiKV0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnF1b3RlUHJvcHMgPT09IFwiY29uc2lzdGVudFwiICYmICFuZWVkc1F1b3RlUHJvcHMuaGFzKHBhcmVudCkpIHtcbiAgICAgIGNvbnN0IG9iamVjdEhhc1N0cmluZ1Byb3AgPSAocGFyZW50LnByb3BlcnRpZXMgfHwgcGFyZW50LmJvZHkgfHwgcGFyZW50Lm1lbWJlcnMpLnNvbWUocHJvcCA9PiAhcHJvcC5jb21wdXRlZCAmJiBwcm9wLmtleSAmJiBpc1N0cmluZ0xpdGVyYWwkMShwcm9wLmtleSkgJiYgIWlzU3RyaW5nUHJvcFNhZmVUb0NvZXJjZVRvSWRlbnRpZmllciQxKHByb3AsIG9wdGlvbnMpKTtcbiAgICAgIG5lZWRzUXVvdGVQcm9wcy5zZXQocGFyZW50LCBvYmplY3RIYXNTdHJpbmdQcm9wKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIChvcHRpb25zLnBhcnNlciA9PT0gXCJqc29uXCIgfHwgb3B0aW9ucy5xdW90ZVByb3BzID09PSBcImNvbnNpc3RlbnRcIiAmJiBuZWVkc1F1b3RlUHJvcHMuZ2V0KHBhcmVudCkpKSB7XG4gICAgICAvLyBhIC0+IFwiYVwiXG4gICAgICBjb25zdCBwcm9wID0gcHJpbnRTdHJpbmckMihKU09OLnN0cmluZ2lmeShrZXkubmFtZSksIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHBhdGguY2FsbChrZXlQYXRoID0+IGNvbW1lbnRzLnByaW50Q29tbWVudHMoa2V5UGF0aCwgKCkgPT4gcHJvcCwgb3B0aW9ucyksIFwia2V5XCIpO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZ1Byb3BTYWZlVG9Db2VyY2VUb0lkZW50aWZpZXIkMShub2RlLCBvcHRpb25zKSAmJiAob3B0aW9ucy5xdW90ZVByb3BzID09PSBcImFzLW5lZWRlZFwiIHx8IG9wdGlvbnMucXVvdGVQcm9wcyA9PT0gXCJjb25zaXN0ZW50XCIgJiYgIW5lZWRzUXVvdGVQcm9wcy5nZXQocGFyZW50KSkpIHtcbiAgICAgIC8vICdhJyAtPiBhXG4gICAgICByZXR1cm4gcGF0aC5jYWxsKGtleVBhdGggPT4gY29tbWVudHMucHJpbnRDb21tZW50cyhrZXlQYXRoLCAoKSA9PiBrZXkudmFsdWUsIG9wdGlvbnMpLCBcImtleVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aC5jYWxsKHByaW50LCBcImtleVwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50TWV0aG9kKHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0Tm9kZSgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGtpbmRcbiAgICB9ID0gbm9kZTtcbiAgICBjb25zdCB2YWx1ZSA9IG5vZGUudmFsdWUgfHwgbm9kZTtcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuXG4gICAgaWYgKCFraW5kIHx8IGtpbmQgPT09IFwiaW5pdFwiIHx8IGtpbmQgPT09IFwibWV0aG9kXCIgfHwga2luZCA9PT0gXCJjb25zdHJ1Y3RvclwiKSB7XG4gICAgICBpZiAodmFsdWUuYXN5bmMpIHtcbiAgICAgICAgcGFydHMucHVzaChcImFzeW5jIFwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlLmdlbmVyYXRvcikge1xuICAgICAgICBwYXJ0cy5wdXNoKFwiKlwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0Lm9rKGtpbmQgPT09IFwiZ2V0XCIgfHwga2luZCA9PT0gXCJzZXRcIik7XG4gICAgICBwYXJ0cy5wdXNoKGtpbmQsIFwiIFwiKTtcbiAgICB9XG5cbiAgICBwYXJ0cy5wdXNoKHByaW50UHJvcGVydHlLZXkocGF0aCwgb3B0aW9ucywgcHJpbnQpLCBub2RlLm9wdGlvbmFsIHx8IG5vZGUua2V5Lm9wdGlvbmFsID8gXCI/XCIgOiBcIlwiLCBub2RlID09PSB2YWx1ZSA/IHByaW50TWV0aG9kSW50ZXJuYWwocGF0aCwgb3B0aW9ucywgcHJpbnQpIDogcGF0aC5jYWxsKHBhdGggPT4gcHJpbnRNZXRob2RJbnRlcm5hbChwYXRoLCBvcHRpb25zLCBwcmludCksIFwidmFsdWVcIikpO1xuICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludE1ldGhvZEludGVybmFsKHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3QgcGFydHMgPSBbcHJpbnRGdW5jdGlvblR5cGVQYXJhbWV0ZXJzKHBhdGgsIG9wdGlvbnMsIHByaW50KSwgZ3JvdXAkYihjb25jYXQkZChbcHJpbnRGdW5jdGlvblBhcmFtcyhwYXRoLCBwcmludCwgb3B0aW9ucyksIHByaW50UmV0dXJuVHlwZShwYXRoLCBwcmludCwgb3B0aW9ucyldKSldO1xuXG4gICAgaWYgKHBhdGguZ2V0Tm9kZSgpLmJvZHkpIHtcbiAgICAgIHBhcnRzLnB1c2goXCIgXCIsIHBhdGguY2FsbChwcmludCwgXCJib2R5XCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydHMucHVzaChvcHRpb25zLnNlbWkgPyBcIjtcIiA6IFwiXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG4gIH1cblxuICBmdW5jdGlvbiBjb3VsZEdyb3VwQXJnKGFyZykge1xuICAgIHJldHVybiBhcmcudHlwZSA9PT0gXCJPYmplY3RFeHByZXNzaW9uXCIgJiYgKGFyZy5wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgfHwgYXJnLmNvbW1lbnRzKSB8fCBhcmcudHlwZSA9PT0gXCJBcnJheUV4cHJlc3Npb25cIiAmJiAoYXJnLmVsZW1lbnRzLmxlbmd0aCA+IDAgfHwgYXJnLmNvbW1lbnRzKSB8fCBhcmcudHlwZSA9PT0gXCJUU1R5cGVBc3NlcnRpb25cIiAmJiBjb3VsZEdyb3VwQXJnKGFyZy5leHByZXNzaW9uKSB8fCBhcmcudHlwZSA9PT0gXCJUU0FzRXhwcmVzc2lvblwiICYmIGNvdWxkR3JvdXBBcmcoYXJnLmV4cHJlc3Npb24pIHx8IGFyZy50eXBlID09PSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiIHx8IGFyZy50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgJiYgKCAvLyB3ZSB3YW50IHRvIGF2b2lkIGJyZWFraW5nIGluc2lkZSBjb21wb3NpdGUgcmV0dXJuIHR5cGVzIGJ1dCBub3Qgc2ltcGxlIGtleXdvcmRzXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ByZXR0aWVyL3ByZXR0aWVyL2lzc3Vlcy80MDcwXG4gICAgLy8gZXhwb3J0IGNsYXNzIFRoaW5nIGltcGxlbWVudHMgT3RoZXJUaGluZyB7XG4gICAgLy8gICBkbzogKHR5cGU6IFR5cGUpID0+IFByb3ZpZGVyPFByb3A+ID0gbWVtb2l6ZShcbiAgICAvLyAgICAgKHR5cGU6IE9iamVjdFR5cGUpOiBQcm92aWRlcjxPcHRzPiA9PiB7fVxuICAgIC8vICAgKTtcbiAgICAvLyB9XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ByZXR0aWVyL3ByZXR0aWVyL2lzc3Vlcy82MDk5XG4gICAgLy8gYXBwLmdldChcIi9cIiwgKHJlcSwgcmVzKTogdm9pZCA9PiB7XG4gICAgLy8gICByZXMuc2VuZChcIkhlbGxvIFdvcmxkIVwiKTtcbiAgICAvLyB9KTtcbiAgICAhYXJnLnJldHVyblR5cGUgfHwgIWFyZy5yZXR1cm5UeXBlLnR5cGVBbm5vdGF0aW9uIHx8IGFyZy5yZXR1cm5UeXBlLnR5cGVBbm5vdGF0aW9uLnR5cGUgIT09IFwiVFNUeXBlUmVmZXJlbmNlXCIpICYmIChhcmcuYm9keS50eXBlID09PSBcIkJsb2NrU3RhdGVtZW50XCIgfHwgYXJnLmJvZHkudHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiIHx8IGFyZy5ib2R5LnR5cGUgPT09IFwiT2JqZWN0RXhwcmVzc2lvblwiIHx8IGFyZy5ib2R5LnR5cGUgPT09IFwiQXJyYXlFeHByZXNzaW9uXCIgfHwgYXJnLmJvZHkudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiIHx8IGFyZy5ib2R5LnR5cGUgPT09IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiIHx8IGFyZy5ib2R5LnR5cGUgPT09IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIgfHwgaXNKU1hOb2RlJDEoYXJnLmJvZHkpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEdyb3VwTGFzdEFyZyhhcmdzKSB7XG4gICAgY29uc3QgbGFzdEFyZyA9IGdldExhc3QkMyhhcmdzKTtcbiAgICBjb25zdCBwZW51bHRpbWF0ZUFyZyA9IGdldFBlbnVsdGltYXRlJDEoYXJncyk7XG4gICAgcmV0dXJuICFoYXNMZWFkaW5nQ29tbWVudCQzKGxhc3RBcmcpICYmICFoYXNUcmFpbGluZ0NvbW1lbnQkMShsYXN0QXJnKSAmJiBjb3VsZEdyb3VwQXJnKGxhc3RBcmcpICYmICggLy8gSWYgdGhlIGxhc3QgdHdvIGFyZ3VtZW50cyBhcmUgb2YgdGhlIHNhbWUgdHlwZSxcbiAgICAvLyBkaXNhYmxlIGxhc3QgZWxlbWVudCBleHBhbnNpb24uXG4gICAgIXBlbnVsdGltYXRlQXJnIHx8IHBlbnVsdGltYXRlQXJnLnR5cGUgIT09IGxhc3RBcmcudHlwZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRHcm91cEZpcnN0QXJnKGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBbZmlyc3RBcmcsIHNlY29uZEFyZ10gPSBhcmdzO1xuICAgIHJldHVybiAoIWZpcnN0QXJnLmNvbW1lbnRzIHx8ICFmaXJzdEFyZy5jb21tZW50cy5sZW5ndGgpICYmIChmaXJzdEFyZy50eXBlID09PSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiIHx8IGZpcnN0QXJnLnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiAmJiBmaXJzdEFyZy5ib2R5LnR5cGUgPT09IFwiQmxvY2tTdGF0ZW1lbnRcIikgJiYgc2Vjb25kQXJnLnR5cGUgIT09IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIgJiYgc2Vjb25kQXJnLnR5cGUgIT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiAmJiBzZWNvbmRBcmcudHlwZSAhPT0gXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIiAmJiAhY291bGRHcm91cEFyZyhzZWNvbmRBcmcpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRKZXN0RWFjaFRlbXBsYXRlTGl0ZXJhbChub2RlLCBleHByZXNzaW9ucywgb3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIGEgICAgfCBiICAgIHwgZXhwZWN0ZWRcbiAgICAgKiAkezF9IHwgJHsxfSB8ICR7Mn1cbiAgICAgKiAkezF9IHwgJHsyfSB8ICR7M31cbiAgICAgKiAkezJ9IHwgJHsxfSB8ICR7M31cbiAgICAgKi9cbiAgICBjb25zdCBoZWFkZXJOYW1lcyA9IG5vZGUucXVhc2lzWzBdLnZhbHVlLnJhdy50cmltKCkuc3BsaXQoL1xccypcXHxcXHMqLyk7XG5cbiAgICBpZiAoaGVhZGVyTmFtZXMubGVuZ3RoID4gMSB8fCBoZWFkZXJOYW1lcy5zb21lKGhlYWRlck5hbWUgPT4gaGVhZGVyTmFtZS5sZW5ndGggIT09IDApKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWRFeHByZXNzaW9ucyA9IGV4cHJlc3Npb25zLm1hcChkb2MgPT4gXCIke1wiICsgcHJpbnREb2NUb1N0cmluZyQyKGRvYywgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xuICAgICAgICBwcmludFdpZHRoOiBJbmZpbml0eSxcbiAgICAgICAgZW5kT2ZMaW5lOiBcImxmXCJcbiAgICAgIH0pKS5mb3JtYXR0ZWQgKyBcIn1cIik7XG4gICAgICBjb25zdCB0YWJsZUJvZHkgPSBbe1xuICAgICAgICBoYXNMaW5lQnJlYWs6IGZhbHNlLFxuICAgICAgICBjZWxsczogW11cbiAgICAgIH1dO1xuXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5vZGUucXVhc2lzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRhYmxlQm9keVt0YWJsZUJvZHkubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IGNvcnJlc3BvbmRpbmdFeHByZXNzaW9uID0gc3RyaW5naWZpZWRFeHByZXNzaW9uc1tpIC0gMV07XG4gICAgICAgIHJvdy5jZWxscy5wdXNoKGNvcnJlc3BvbmRpbmdFeHByZXNzaW9uKTtcblxuICAgICAgICBpZiAoY29ycmVzcG9uZGluZ0V4cHJlc3Npb24uaW5jbHVkZXMoXCJcXG5cIikpIHtcbiAgICAgICAgICByb3cuaGFzTGluZUJyZWFrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLnF1YXNpc1tpXS52YWx1ZS5yYXcuaW5jbHVkZXMoXCJcXG5cIikpIHtcbiAgICAgICAgICB0YWJsZUJvZHkucHVzaCh7XG4gICAgICAgICAgICBoYXNMaW5lQnJlYWs6IGZhbHNlLFxuICAgICAgICAgICAgY2VsbHM6IFtdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF4Q29sdW1uQ291bnQgPSBNYXRoLm1heChoZWFkZXJOYW1lcy5sZW5ndGgsIC4uLnRhYmxlQm9keS5tYXAocm93ID0+IHJvdy5jZWxscy5sZW5ndGgpKTtcbiAgICAgIGNvbnN0IG1heENvbHVtbldpZHRocyA9IEFycmF5LmZyb20oe1xuICAgICAgICBsZW5ndGg6IG1heENvbHVtbkNvdW50XG4gICAgICB9KS5maWxsKDApO1xuICAgICAgY29uc3QgdGFibGUgPSBbe1xuICAgICAgICBjZWxsczogaGVhZGVyTmFtZXNcbiAgICAgIH0sIC4uLnRhYmxlQm9keS5maWx0ZXIocm93ID0+IHJvdy5jZWxscy5sZW5ndGggIT09IDApXTtcblxuICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgIGNlbGxzXG4gICAgICB9IG9mIHRhYmxlLmZpbHRlcihyb3cgPT4gIXJvdy5oYXNMaW5lQnJlYWspKSB7XG4gICAgICAgIGNlbGxzLmZvckVhY2goKGNlbGwsIGluZGV4KSA9PiB7XG4gICAgICAgICAgbWF4Q29sdW1uV2lkdGhzW2luZGV4XSA9IE1hdGgubWF4KG1heENvbHVtbldpZHRoc1tpbmRleF0sIGdldFN0cmluZ1dpZHRoJDMoY2VsbCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcGFydHMucHVzaChsaW5lU3VmZml4Qm91bmRhcnkkMSwgXCJgXCIsIGluZGVudCQ3KGNvbmNhdCRkKFtoYXJkbGluZSQ5LCBqb2luJDkoaGFyZGxpbmUkOSwgdGFibGUubWFwKHJvdyA9PiBqb2luJDkoXCIgfCBcIiwgcm93LmNlbGxzLm1hcCgoY2VsbCwgaW5kZXgpID0+IHJvdy5oYXNMaW5lQnJlYWsgPyBjZWxsIDogY2VsbCArIFwiIFwiLnJlcGVhdChtYXhDb2x1bW5XaWR0aHNbaW5kZXhdIC0gZ2V0U3RyaW5nV2lkdGgkMyhjZWxsKSkpKSkpXSkpLCBoYXJkbGluZSQ5LCBcImBcIik7XG4gICAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50QXJndW1lbnRzTGlzdChwYXRoLCBvcHRpb25zLCBwcmludCkge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgYXJncyA9IG5vZGUuYXJndW1lbnRzO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY29uY2F0JGQoW1wiKFwiLCBjb21tZW50cy5wcmludERhbmdsaW5nQ29tbWVudHMocGF0aCwgb3B0aW9ucyxcbiAgICAgIC8qIHNhbWVJbmRlbnQgKi9cbiAgICAgIHRydWUpLCBcIilcIl0pO1xuICAgIH0gLy8gdXNlRWZmZWN0KCgpID0+IHsgLi4uIH0sIFtmb28sIGJhciwgYmF6XSlcblxuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyICYmIGFyZ3NbMF0udHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiICYmIGFyZ3NbMF0ucGFyYW1zLmxlbmd0aCA9PT0gMCAmJiBhcmdzWzBdLmJvZHkudHlwZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiICYmIGFyZ3NbMV0udHlwZSA9PT0gXCJBcnJheUV4cHJlc3Npb25cIiAmJiAhYXJncy5maW5kKGFyZyA9PiBhcmcuY29tbWVudHMpKSB7XG4gICAgICByZXR1cm4gY29uY2F0JGQoW1wiKFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiYXJndW1lbnRzXCIsIDApLCBcIiwgXCIsIHBhdGguY2FsbChwcmludCwgXCJhcmd1bWVudHNcIiwgMSksIFwiKVwiXSk7XG4gICAgfSAvLyBmdW5jKFxuICAgIC8vICAgKHtcbiAgICAvLyAgICAgYSxcbiAgICAvLyAgICAgYlxuICAgIC8vICAgfSkgPT4ge31cbiAgICAvLyApO1xuXG5cbiAgICBmdW5jdGlvbiBzaG91bGRCcmVha0ZvckFycm93RnVuY3Rpb25JbkFyZ3VtZW50cyhhcmcsIGFyZ1BhdGgpIHtcbiAgICAgIGlmICghYXJnIHx8IGFyZy50eXBlICE9PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfHwgIWFyZy5ib2R5IHx8IGFyZy5ib2R5LnR5cGUgIT09IFwiQmxvY2tTdGF0ZW1lbnRcIiB8fCAhYXJnLnBhcmFtcyB8fCBhcmcucGFyYW1zLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkQnJlYWsgPSBmYWxzZTtcbiAgICAgIGFyZ1BhdGguZWFjaChwYXJhbVBhdGggPT4ge1xuICAgICAgICBjb25zdCBwcmludGVkID0gY29uY2F0JGQoW3ByaW50KHBhcmFtUGF0aCldKTtcbiAgICAgICAgc2hvdWxkQnJlYWsgPSBzaG91bGRCcmVhayB8fCB3aWxsQnJlYWskMShwcmludGVkKTtcbiAgICAgIH0sIFwicGFyYW1zXCIpO1xuICAgICAgcmV0dXJuIHNob3VsZEJyZWFrO1xuICAgIH1cblxuICAgIGxldCBhbnlBcmdFbXB0eUxpbmUgPSBmYWxzZTtcbiAgICBsZXQgc2hvdWxkQnJlYWtGb3JBcnJvd0Z1bmN0aW9uID0gZmFsc2U7XG4gICAgbGV0IGhhc0VtcHR5TGluZUZvbGxvd2luZ0ZpcnN0QXJnID0gZmFsc2U7XG4gICAgY29uc3QgbGFzdEFyZ0luZGV4ID0gYXJncy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHByaW50ZWRBcmd1bWVudHMgPSBwYXRoLm1hcCgoYXJnUGF0aCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGFyZyA9IGFyZ1BhdGguZ2V0Tm9kZSgpO1xuICAgICAgY29uc3QgcGFydHMgPSBbcHJpbnQoYXJnUGF0aCldO1xuXG4gICAgICBpZiAoaW5kZXggPT09IGxhc3RBcmdJbmRleCkgOyBlbHNlIGlmIChpc05leHRMaW5lRW1wdHkkNChvcHRpb25zLm9yaWdpbmFsVGV4dCwgYXJnLCBvcHRpb25zLmxvY0VuZCkpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgaGFzRW1wdHlMaW5lRm9sbG93aW5nRmlyc3RBcmcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYW55QXJnRW1wdHlMaW5lID0gdHJ1ZTtcbiAgICAgICAgcGFydHMucHVzaChcIixcIiwgaGFyZGxpbmUkOSwgaGFyZGxpbmUkOSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5wdXNoKFwiLFwiLCBsaW5lJDkpO1xuICAgICAgfVxuXG4gICAgICBzaG91bGRCcmVha0ZvckFycm93RnVuY3Rpb24gPSBzaG91bGRCcmVha0ZvckFycm93RnVuY3Rpb25JbkFyZ3VtZW50cyhhcmcsIGFyZ1BhdGgpO1xuICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcbiAgICB9LCBcImFyZ3VtZW50c1wiKTtcbiAgICBjb25zdCBtYXliZVRyYWlsaW5nQ29tbWEgPSAvLyBEeW5hbWljIGltcG9ydHMgY2Fubm90IGhhdmUgdHJhaWxpbmcgY29tbWFzXG4gICAgIShub2RlLmNhbGxlZSAmJiBub2RlLmNhbGxlZS50eXBlID09PSBcIkltcG9ydFwiKSAmJiBzaG91bGRQcmludENvbW1hJDEob3B0aW9ucywgXCJhbGxcIikgPyBcIixcIiA6IFwiXCI7XG5cbiAgICBmdW5jdGlvbiBhbGxBcmdzQnJva2VuT3V0KCkge1xuICAgICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW1wiKFwiLCBpbmRlbnQkNyhjb25jYXQkZChbbGluZSQ5LCBjb25jYXQkZChwcmludGVkQXJndW1lbnRzKV0pKSwgbWF5YmVUcmFpbGluZ0NvbW1hLCBsaW5lJDksIFwiKVwiXSksIHtcbiAgICAgICAgc2hvdWxkQnJlYWs6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwYXRoLmdldFBhcmVudE5vZGUoKS50eXBlICE9PSBcIkRlY29yYXRvclwiICYmIGlzRnVuY3Rpb25Db21wb3NpdGlvbkFyZ3MkMShhcmdzKSkge1xuICAgICAgcmV0dXJuIGFsbEFyZ3NCcm9rZW5PdXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRHcm91cEZpcnN0ID0gc2hvdWxkR3JvdXBGaXJzdEFyZyhhcmdzKTtcbiAgICBjb25zdCBzaG91bGRHcm91cExhc3QgPSBzaG91bGRHcm91cExhc3RBcmcoYXJncyk7XG5cbiAgICBpZiAoc2hvdWxkR3JvdXBGaXJzdCB8fCBzaG91bGRHcm91cExhc3QpIHtcbiAgICAgIGNvbnN0IHNob3VsZEJyZWFrID0gKHNob3VsZEdyb3VwRmlyc3QgPyBwcmludGVkQXJndW1lbnRzLnNsaWNlKDEpLnNvbWUod2lsbEJyZWFrJDEpIDogcHJpbnRlZEFyZ3VtZW50cy5zbGljZSgwLCAtMSkuc29tZSh3aWxsQnJlYWskMSkpIHx8IGFueUFyZ0VtcHR5TGluZSB8fCBzaG91bGRCcmVha0ZvckFycm93RnVuY3Rpb247IC8vIFdlIHdhbnQgdG8gcHJpbnQgdGhlIGxhc3QgYXJndW1lbnQgd2l0aCBhIHNwZWNpYWwgZmxhZ1xuXG4gICAgICBsZXQgcHJpbnRlZEV4cGFuZGVkO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgcGF0aC5lYWNoKGFyZ1BhdGggPT4ge1xuICAgICAgICBpZiAoc2hvdWxkR3JvdXBGaXJzdCAmJiBpID09PSAwKSB7XG4gICAgICAgICAgcHJpbnRlZEV4cGFuZGVkID0gW2NvbmNhdCRkKFthcmdQYXRoLmNhbGwocCA9PiBwcmludChwLCB7XG4gICAgICAgICAgICBleHBhbmRGaXJzdEFyZzogdHJ1ZVxuICAgICAgICAgIH0pKSwgcHJpbnRlZEFyZ3VtZW50cy5sZW5ndGggPiAxID8gXCIsXCIgOiBcIlwiLCBoYXNFbXB0eUxpbmVGb2xsb3dpbmdGaXJzdEFyZyA/IGhhcmRsaW5lJDkgOiBsaW5lJDksIGhhc0VtcHR5TGluZUZvbGxvd2luZ0ZpcnN0QXJnID8gaGFyZGxpbmUkOSA6IFwiXCJdKV0uY29uY2F0KHByaW50ZWRBcmd1bWVudHMuc2xpY2UoMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNob3VsZEdyb3VwTGFzdCAmJiBpID09PSBhcmdzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBwcmludGVkRXhwYW5kZWQgPSBwcmludGVkQXJndW1lbnRzLnNsaWNlKDAsIC0xKS5jb25jYXQoYXJnUGF0aC5jYWxsKHAgPT4gcHJpbnQocCwge1xuICAgICAgICAgICAgZXhwYW5kTGFzdEFyZzogdHJ1ZVxuICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9LCBcImFyZ3VtZW50c1wiKTtcbiAgICAgIGNvbnN0IHNvbWVQcmludGVkQXJndW1lbnRzV2lsbEJyZWFrID0gcHJpbnRlZEFyZ3VtZW50cy5zb21lKHdpbGxCcmVhayQxKTtcbiAgICAgIGNvbnN0IHNpbXBsZUNvbmNhdCA9IGNvbmNhdCRkKFtcIihcIiwgY29uY2F0JGQocHJpbnRlZEV4cGFuZGVkKSwgXCIpXCJdKTtcbiAgICAgIHJldHVybiBjb25jYXQkZChbc29tZVByaW50ZWRBcmd1bWVudHNXaWxsQnJlYWsgPyBicmVha1BhcmVudCQzIDogXCJcIiwgY29uZGl0aW9uYWxHcm91cCQxKFshc29tZVByaW50ZWRBcmd1bWVudHNXaWxsQnJlYWsgJiYgIW5vZGUudHlwZUFyZ3VtZW50cyAmJiAhbm9kZS50eXBlUGFyYW1ldGVycyA/IHNpbXBsZUNvbmNhdCA6IGlmQnJlYWskNihhbGxBcmdzQnJva2VuT3V0KCksIHNpbXBsZUNvbmNhdCksIHNob3VsZEdyb3VwRmlyc3QgPyBjb25jYXQkZChbXCIoXCIsIGdyb3VwJGIocHJpbnRlZEV4cGFuZGVkWzBdLCB7XG4gICAgICAgIHNob3VsZEJyZWFrOiB0cnVlXG4gICAgICB9KSwgY29uY2F0JGQocHJpbnRlZEV4cGFuZGVkLnNsaWNlKDEpKSwgXCIpXCJdKSA6IGNvbmNhdCRkKFtcIihcIiwgY29uY2F0JGQocHJpbnRlZEFyZ3VtZW50cy5zbGljZSgwLCAtMSkpLCBncm91cCRiKGdldExhc3QkMyhwcmludGVkRXhwYW5kZWQpLCB7XG4gICAgICAgIHNob3VsZEJyZWFrOiB0cnVlXG4gICAgICB9KSwgXCIpXCJdKSwgYWxsQXJnc0Jyb2tlbk91dCgpXSwge1xuICAgICAgICBzaG91bGRCcmVha1xuICAgICAgfSldKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50cyA9IGNvbmNhdCRkKFtcIihcIiwgaW5kZW50JDcoY29uY2F0JGQoW3NvZnRsaW5lJDYsIGNvbmNhdCRkKHByaW50ZWRBcmd1bWVudHMpXSkpLCBpZkJyZWFrJDYobWF5YmVUcmFpbGluZ0NvbW1hKSwgc29mdGxpbmUkNiwgXCIpXCJdKTtcblxuICAgIGlmIChpc0xvbmdDdXJyaWVkQ2FsbEV4cHJlc3Npb24kMShwYXRoKSkge1xuICAgICAgLy8gQnkgbm90IHdyYXBwaW5nIHRoZSBhcmd1bWVudHMgaW4gYSBncm91cCwgdGhlIHByaW50ZXIgcHJpb3JpdGl6ZXNcbiAgICAgIC8vIGJyZWFraW5nIHVwIHRoZXNlIGFyZ3VtZW50cyByYXRoZXIgdGhhbiB0aGUgYXJncyBvZiB0aGUgcGFyZW50IGNhbGwuXG4gICAgICByZXR1cm4gY29udGVudHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3VwJGIoY29udGVudHMsIHtcbiAgICAgIHNob3VsZEJyZWFrOiBwcmludGVkQXJndW1lbnRzLnNvbWUod2lsbEJyZWFrJDEpIHx8IGFueUFyZ0VtcHR5TGluZVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRUeXBlQW5ub3RhdGlvbihwYXRoLCBvcHRpb25zLCBwcmludCkge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG5cbiAgICBpZiAoIW5vZGUudHlwZUFubm90YXRpb24pIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBwYXRoLmdldFBhcmVudE5vZGUoKTtcbiAgICBjb25zdCBpc0RlZmluaXRlID0gbm9kZS5kZWZpbml0ZSB8fCBwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0b3JcIiAmJiBwYXJlbnROb2RlLmRlZmluaXRlO1xuICAgIGNvbnN0IGlzRnVuY3Rpb25EZWNsYXJhdGlvbklkZW50aWZpZXIgPSBwYXJlbnROb2RlLnR5cGUgPT09IFwiRGVjbGFyZUZ1bmN0aW9uXCIgJiYgcGFyZW50Tm9kZS5pZCA9PT0gbm9kZTtcblxuICAgIGlmIChpc0Zsb3dBbm5vdGF0aW9uQ29tbWVudCQxKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBub2RlLnR5cGVBbm5vdGF0aW9uLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcIiAvKjogXCIsIHBhdGguY2FsbChwcmludCwgXCJ0eXBlQW5ub3RhdGlvblwiKSwgXCIgKi9cIl0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb25jYXQkZChbaXNGdW5jdGlvbkRlY2xhcmF0aW9uSWRlbnRpZmllciA/IFwiXCIgOiBpc0RlZmluaXRlID8gXCIhOiBcIiA6IFwiOiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInR5cGVBbm5vdGF0aW9uXCIpXSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludEZ1bmN0aW9uVHlwZVBhcmFtZXRlcnMocGF0aCwgb3B0aW9ucywgcHJpbnQpIHtcbiAgICBjb25zdCBmdW4gPSBwYXRoLmdldFZhbHVlKCk7XG5cbiAgICBpZiAoZnVuLnR5cGVBcmd1bWVudHMpIHtcbiAgICAgIHJldHVybiBwYXRoLmNhbGwocHJpbnQsIFwidHlwZUFyZ3VtZW50c1wiKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICByZXR1cm4gcGF0aC5jYWxsKHByaW50LCBcInR5cGVQYXJhbWV0ZXJzXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRGdW5jdGlvblBhcmFtcyhwYXRoLCBwcmludCwgb3B0aW9ucywgZXhwYW5kQXJnLCBwcmludFR5cGVQYXJhbXMpIHtcbiAgICBjb25zdCBmdW4gPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgY29uc3QgcGFyYW1zRmllbGQgPSBmdW4ucGFyYW1ldGVycyA/IFwicGFyYW1ldGVyc1wiIDogXCJwYXJhbXNcIjtcbiAgICBjb25zdCBpc1BhcmFtZXRlcnNJblRlc3RDYWxsID0gaXNUZXN0Q2FsbCQxKHBhcmVudCk7XG4gICAgY29uc3Qgc2hvdWxkSHVnUGFyYW1ldGVycyA9IHNob3VsZEh1Z0FyZ3VtZW50cyhmdW4pO1xuICAgIGNvbnN0IHNob3VsZEV4cGFuZFBhcmFtZXRlcnMgPSBleHBhbmRBcmcgJiYgIShmdW5bcGFyYW1zRmllbGRdICYmIGZ1bltwYXJhbXNGaWVsZF0uc29tZShuID0+IG4uY29tbWVudHMpKTtcbiAgICBjb25zdCB0eXBlUGFyYW1zID0gcHJpbnRUeXBlUGFyYW1zID8gcHJpbnRGdW5jdGlvblR5cGVQYXJhbWV0ZXJzKHBhdGgsIG9wdGlvbnMsIHByaW50KSA6IFwiXCI7XG4gICAgbGV0IHByaW50ZWQgPSBbXTtcblxuICAgIGlmIChmdW5bcGFyYW1zRmllbGRdKSB7XG4gICAgICBjb25zdCBsYXN0QXJnSW5kZXggPSBmdW5bcGFyYW1zRmllbGRdLmxlbmd0aCAtIDE7XG4gICAgICBwcmludGVkID0gcGF0aC5tYXAoKGNoaWxkUGF0aCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICAgICAgY29uc3QgcGFyYW0gPSBjaGlsZFBhdGguZ2V0VmFsdWUoKTtcbiAgICAgICAgcGFydHMucHVzaChwcmludChjaGlsZFBhdGgpKTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IGxhc3RBcmdJbmRleCkge1xuICAgICAgICAgIGlmIChmdW4ucmVzdCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIixcIiwgbGluZSQ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQYXJhbWV0ZXJzSW5UZXN0Q2FsbCB8fCBzaG91bGRIdWdQYXJhbWV0ZXJzIHx8IHNob3VsZEV4cGFuZFBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiLCBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOZXh0TGluZUVtcHR5JDQob3B0aW9ucy5vcmlnaW5hbFRleHQsIHBhcmFtLCBvcHRpb25zLmxvY0VuZCkpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiLFwiLCBoYXJkbGluZSQ5LCBoYXJkbGluZSQ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFwiLFwiLCBsaW5lJDkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcbiAgICAgIH0sIHBhcmFtc0ZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuLnJlc3QpIHtcbiAgICAgIHByaW50ZWQucHVzaChjb25jYXQkZChbXCIuLi5cIiwgcGF0aC5jYWxsKHByaW50LCBcInJlc3RcIildKSk7XG4gICAgfVxuXG4gICAgaWYgKHByaW50ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY29uY2F0JGQoW3R5cGVQYXJhbXMsIFwiKFwiLCBjb21tZW50cy5wcmludERhbmdsaW5nQ29tbWVudHMocGF0aCwgb3B0aW9ucyxcbiAgICAgIC8qIHNhbWVJbmRlbnQgKi9cbiAgICAgIHRydWUsIGNvbW1lbnQgPT4gZ2V0TmV4dE5vblNwYWNlTm9uQ29tbWVudENoYXJhY3RlciQxKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBjb21tZW50LCBvcHRpb25zLmxvY0VuZCkgPT09IFwiKVwiKSwgXCIpXCJdKTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXN0UGFyYW0gPSBnZXRMYXN0JDMoZnVuW3BhcmFtc0ZpZWxkXSk7IC8vIElmIHRoZSBwYXJlbnQgaXMgYSBjYWxsIHdpdGggdGhlIGZpcnN0L2xhc3QgYXJndW1lbnQgZXhwYW5zaW9uIGFuZCB0aGlzIGlzIHRoZVxuICAgIC8vIHBhcmFtcyBvZiB0aGUgZmlyc3QvbGFzdCBhcmd1bWVudCwgd2UgZG9uJ3Qgd2FudCB0aGUgYXJndW1lbnRzIHRvIGJyZWFrIGFuZCBpbnN0ZWFkXG4gICAgLy8gd2FudCB0aGUgd2hvbGUgZXhwcmVzc2lvbiB0byBiZSBvbiBhIG5ldyBsaW5lLlxuICAgIC8vXG4gICAgLy8gR29vZDogICAgICAgICAgICAgICAgIEJhZDpcbiAgICAvLyAgIHZlcnlsb25nY2FsbCggICAgICAgICB2ZXJ5bG9uZ2NhbGwoKFxuICAgIC8vICAgICAoYSwgYikgPT4geyAgICAgICAgICAgYSxcbiAgICAvLyAgICAgfSAgICAgICAgICAgICAgICAgICAgIGIsXG4gICAgLy8gICB9KSAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgIGlmIChzaG91bGRFeHBhbmRQYXJhbWV0ZXJzKSB7XG4gICAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChbcmVtb3ZlTGluZXMkMih0eXBlUGFyYW1zKSwgXCIoXCIsIGNvbmNhdCRkKHByaW50ZWQubWFwKHJlbW92ZUxpbmVzJDIpKSwgXCIpXCJdKSk7XG4gICAgfSAvLyBTaW5nbGUgb2JqZWN0IGRlc3RydWN0dXJpbmcgc2hvdWxkIGh1Z1xuICAgIC8vXG4gICAgLy8gZnVuY3Rpb24oe1xuICAgIC8vICAgYSxcbiAgICAvLyAgIGIsXG4gICAgLy8gICBjXG4gICAgLy8gfSkge31cblxuXG4gICAgY29uc3QgaGFzTm90UGFyYW1ldGVyRGVjb3JhdG9yID0gZnVuW3BhcmFtc0ZpZWxkXS5ldmVyeShwYXJhbSA9PiAhcGFyYW0uZGVjb3JhdG9ycyk7XG5cbiAgICBpZiAoc2hvdWxkSHVnUGFyYW1ldGVycyAmJiBoYXNOb3RQYXJhbWV0ZXJEZWNvcmF0b3IpIHtcbiAgICAgIHJldHVybiBjb25jYXQkZChbdHlwZVBhcmFtcywgXCIoXCIsIGNvbmNhdCRkKHByaW50ZWQpLCBcIilcIl0pO1xuICAgIH0gLy8gZG9uJ3QgYnJlYWsgaW4gc3BlY3MsIGVnOyBgaXQoXCJzaG91bGQgbWFpbnRhaW4gcGFyZW5zIGFyb3VuZCBkb25lIGV2ZW4gd2hlbiBsb25nXCIsIChkb25lKSA9PiB7fSlgXG5cblxuICAgIGlmIChpc1BhcmFtZXRlcnNJblRlc3RDYWxsKSB7XG4gICAgICByZXR1cm4gY29uY2F0JGQoW3R5cGVQYXJhbXMsIFwiKFwiLCBjb25jYXQkZChwcmludGVkKSwgXCIpXCJdKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0Zsb3dTaG9ydGhhbmRXaXRoT25lQXJnID0gKGlzT2JqZWN0VHlwZVByb3BlcnR5QUZ1bmN0aW9uJDEocGFyZW50LCBvcHRpb25zKSB8fCBpc1R5cGVBbm5vdGF0aW9uQUZ1bmN0aW9uJDEocGFyZW50LCBvcHRpb25zKSB8fCBwYXJlbnQudHlwZSA9PT0gXCJUeXBlQWxpYXNcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJVbmlvblR5cGVBbm5vdGF0aW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiVFNVbmlvblR5cGVcIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvblwiIHx8IHBhcmVudC50eXBlID09PSBcIkZ1bmN0aW9uVHlwZUFubm90YXRpb25cIiAmJiBwYXJlbnQucmV0dXJuVHlwZSA9PT0gZnVuKSAmJiBmdW5bcGFyYW1zRmllbGRdLmxlbmd0aCA9PT0gMSAmJiBmdW5bcGFyYW1zRmllbGRdWzBdLm5hbWUgPT09IG51bGwgJiYgZnVuW3BhcmFtc0ZpZWxkXVswXS50eXBlQW5ub3RhdGlvbiAmJiBmdW4udHlwZVBhcmFtZXRlcnMgPT09IG51bGwgJiYgaXNTaW1wbGVGbG93VHlwZSQxKGZ1bltwYXJhbXNGaWVsZF1bMF0udHlwZUFubm90YXRpb24pICYmICFmdW4ucmVzdDtcblxuICAgIGlmIChpc0Zsb3dTaG9ydGhhbmRXaXRoT25lQXJnKSB7XG4gICAgICBpZiAob3B0aW9ucy5hcnJvd1BhcmVucyA9PT0gXCJhbHdheXNcIikge1xuICAgICAgICByZXR1cm4gY29uY2F0JGQoW1wiKFwiLCBjb25jYXQkZChwcmludGVkKSwgXCIpXCJdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbmNhdCRkKHByaW50ZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGNhbkhhdmVUcmFpbGluZ0NvbW1hID0gIShsYXN0UGFyYW0gJiYgbGFzdFBhcmFtLnR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIikgJiYgIWZ1bi5yZXN0O1xuICAgIHJldHVybiBjb25jYXQkZChbdHlwZVBhcmFtcywgXCIoXCIsIGluZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBjb25jYXQkZChwcmludGVkKV0pKSwgaWZCcmVhayQ2KGNhbkhhdmVUcmFpbGluZ0NvbW1hICYmIHNob3VsZFByaW50Q29tbWEkMShvcHRpb25zLCBcImFsbFwiKSA/IFwiLFwiIDogXCJcIiksIHNvZnRsaW5lJDYsIFwiKVwiXSk7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRQcmludFBhcmFtc1dpdGhvdXRQYXJlbnMocGF0aCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmFycm93UGFyZW5zID09PSBcImFsd2F5c1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXJyb3dQYXJlbnMgPT09IFwiYXZvaWRcIikge1xuICAgICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICAgIHJldHVybiBjYW5QcmludFBhcmFtc1dpdGhvdXRQYXJlbnMobm9kZSk7XG4gICAgfSAvLyBGYWxsYmFjayBkZWZhdWx0OyBzaG91bGQgYmUgdW5yZWFjaGFibGVcblxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuUHJpbnRQYXJhbXNXaXRob3V0UGFyZW5zKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5wYXJhbXMubGVuZ3RoID09PSAxICYmICFub2RlLnJlc3QgJiYgIW5vZGUudHlwZVBhcmFtZXRlcnMgJiYgIWhhc0RhbmdsaW5nQ29tbWVudHMkMShub2RlKSAmJiBub2RlLnBhcmFtc1swXS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiAhbm9kZS5wYXJhbXNbMF0udHlwZUFubm90YXRpb24gJiYgIW5vZGUucGFyYW1zWzBdLmNvbW1lbnRzICYmICFub2RlLnBhcmFtc1swXS5vcHRpb25hbCAmJiAhbm9kZS5wcmVkaWNhdGUgJiYgIW5vZGUucmV0dXJuVHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50RnVuY3Rpb25EZWNsYXJhdGlvbihwYXRoLCBwcmludCwgb3B0aW9ucykge1xuICAgIGNvbnN0IG4gPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgcGFydHMgPSBbXTtcblxuICAgIGlmIChuLmFzeW5jKSB7XG4gICAgICBwYXJ0cy5wdXNoKFwiYXN5bmMgXCIpO1xuICAgIH1cblxuICAgIGlmIChuLmdlbmVyYXRvcikge1xuICAgICAgcGFydHMucHVzaChcImZ1bmN0aW9uKiBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRzLnB1c2goXCJmdW5jdGlvbiBcIik7XG4gICAgfVxuXG4gICAgaWYgKG4uaWQpIHtcbiAgICAgIHBhcnRzLnB1c2gocGF0aC5jYWxsKHByaW50LCBcImlkXCIpKTtcbiAgICB9XG5cbiAgICBwYXJ0cy5wdXNoKHByaW50RnVuY3Rpb25UeXBlUGFyYW1ldGVycyhwYXRoLCBvcHRpb25zLCBwcmludCksIGdyb3VwJGIoY29uY2F0JGQoW3ByaW50RnVuY3Rpb25QYXJhbXMocGF0aCwgcHJpbnQsIG9wdGlvbnMpLCBwcmludFJldHVyblR5cGUocGF0aCwgcHJpbnQsIG9wdGlvbnMpXSkpLCBuLmJvZHkgPyBcIiBcIiA6IFwiXCIsIHBhdGguY2FsbChwcmludCwgXCJib2R5XCIpKTtcbiAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRSZXR1cm5UeXBlKHBhdGgsIHByaW50LCBvcHRpb25zKSB7XG4gICAgY29uc3QgbiA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gcGF0aC5jYWxsKHByaW50LCBcInJldHVyblR5cGVcIik7XG5cbiAgICBpZiAobi5yZXR1cm5UeXBlICYmIGlzRmxvd0Fubm90YXRpb25Db21tZW50JDEob3B0aW9ucy5vcmlnaW5hbFRleHQsIG4ucmV0dXJuVHlwZSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBjb25jYXQkZChbXCIgLyo6IFwiLCByZXR1cm5UeXBlLCBcIiAqL1wiXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBbcmV0dXJuVHlwZV07IC8vIHByZXBlbmQgY29sb24gdG8gVHlwZVNjcmlwdCB0eXBlIGFubm90YXRpb25cblxuICAgIGlmIChuLnJldHVyblR5cGUgJiYgbi5yZXR1cm5UeXBlLnR5cGVBbm5vdGF0aW9uKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KFwiOiBcIik7XG4gICAgfVxuXG4gICAgaWYgKG4ucHJlZGljYXRlKSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHR5cGUgd2lsbCBhbHJlYWR5IGFkZCB0aGUgY29sb24sIGJ1dCBvdGhlcndpc2Ugd2VcbiAgICAgIC8vIG5lZWQgdG8gZG8gaXQgb3Vyc2VsdmVzXG4gICAgICBwYXJ0cy5wdXNoKG4ucmV0dXJuVHlwZSA/IFwiIFwiIDogXCI6IFwiLCBwYXRoLmNhbGwocHJpbnQsIFwicHJlZGljYXRlXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRFeHBvcnREZWNsYXJhdGlvbihwYXRoLCBvcHRpb25zLCBwcmludCkge1xuICAgIGNvbnN0IGRlY2wgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3Qgc2VtaSA9IG9wdGlvbnMuc2VtaSA/IFwiO1wiIDogXCJcIjtcbiAgICBjb25zdCBwYXJ0cyA9IFtcImV4cG9ydCBcIl07XG4gICAgY29uc3QgaXNEZWZhdWx0ID0gZGVjbC5kZWZhdWx0IHx8IGRlY2wudHlwZSA9PT0gXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIjtcblxuICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgIHBhcnRzLnB1c2goXCJkZWZhdWx0IFwiKTtcbiAgICB9XG5cbiAgICBwYXJ0cy5wdXNoKGNvbW1lbnRzLnByaW50RGFuZ2xpbmdDb21tZW50cyhwYXRoLCBvcHRpb25zLFxuICAgIC8qIHNhbWVJbmRlbnQgKi9cbiAgICB0cnVlKSk7XG5cbiAgICBpZiAobmVlZHNIYXJkbGluZUFmdGVyRGFuZ2xpbmdDb21tZW50JDEoZGVjbCkpIHtcbiAgICAgIHBhcnRzLnB1c2goaGFyZGxpbmUkOSk7XG4gICAgfVxuXG4gICAgaWYgKGRlY2wuZGVjbGFyYXRpb24pIHtcbiAgICAgIHBhcnRzLnB1c2gocGF0aC5jYWxsKHByaW50LCBcImRlY2xhcmF0aW9uXCIpKTtcblxuICAgICAgaWYgKGlzRGVmYXVsdCAmJiBkZWNsLmRlY2xhcmF0aW9uLnR5cGUgIT09IFwiQ2xhc3NEZWNsYXJhdGlvblwiICYmIGRlY2wuZGVjbGFyYXRpb24udHlwZSAhPT0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgJiYgZGVjbC5kZWNsYXJhdGlvbi50eXBlICE9PSBcIlRTSW50ZXJmYWNlRGVjbGFyYXRpb25cIiAmJiBkZWNsLmRlY2xhcmF0aW9uLnR5cGUgIT09IFwiRGVjbGFyZUNsYXNzXCIgJiYgZGVjbC5kZWNsYXJhdGlvbi50eXBlICE9PSBcIkRlY2xhcmVGdW5jdGlvblwiICYmIGRlY2wuZGVjbGFyYXRpb24udHlwZSAhPT0gXCJUU0RlY2xhcmVGdW5jdGlvblwiKSB7XG4gICAgICAgIHBhcnRzLnB1c2goc2VtaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkZWNsLnNwZWNpZmllcnMgJiYgZGVjbC5zcGVjaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3BlY2lmaWVycyA9IFtdO1xuICAgICAgICBjb25zdCBkZWZhdWx0U3BlY2lmaWVycyA9IFtdO1xuICAgICAgICBjb25zdCBuYW1lc3BhY2VTcGVjaWZpZXJzID0gW107XG4gICAgICAgIHBhdGguZWFjaChzcGVjaWZpZXJQYXRoID0+IHtcbiAgICAgICAgICBjb25zdCBzcGVjaWZpZXJUeXBlID0gcGF0aC5nZXRWYWx1ZSgpLnR5cGU7XG5cbiAgICAgICAgICBpZiAoc3BlY2lmaWVyVHlwZSA9PT0gXCJFeHBvcnRTcGVjaWZpZXJcIikge1xuICAgICAgICAgICAgc3BlY2lmaWVycy5wdXNoKHByaW50KHNwZWNpZmllclBhdGgpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNwZWNpZmllclR5cGUgPT09IFwiRXhwb3J0RGVmYXVsdFNwZWNpZmllclwiKSB7XG4gICAgICAgICAgICBkZWZhdWx0U3BlY2lmaWVycy5wdXNoKHByaW50KHNwZWNpZmllclBhdGgpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNwZWNpZmllclR5cGUgPT09IFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpIHtcbiAgICAgICAgICAgIG5hbWVzcGFjZVNwZWNpZmllcnMucHVzaChjb25jYXQkZChbXCIqIGFzIFwiLCBwcmludChzcGVjaWZpZXJQYXRoKV0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIFwic3BlY2lmaWVyc1wiKTtcbiAgICAgICAgY29uc3QgaXNOYW1lc3BhY2VGb2xsb3dlZCA9IG5hbWVzcGFjZVNwZWNpZmllcnMubGVuZ3RoICE9PSAwICYmIHNwZWNpZmllcnMubGVuZ3RoICE9PSAwO1xuICAgICAgICBjb25zdCBpc0RlZmF1bHRGb2xsb3dlZCA9IGRlZmF1bHRTcGVjaWZpZXJzLmxlbmd0aCAhPT0gMCAmJiAobmFtZXNwYWNlU3BlY2lmaWVycy5sZW5ndGggIT09IDAgfHwgc3BlY2lmaWVycy5sZW5ndGggIT09IDApO1xuICAgICAgICBjb25zdCBjYW5CcmVhayA9IHNwZWNpZmllcnMubGVuZ3RoID4gMSB8fCBkZWZhdWx0U3BlY2lmaWVycy5sZW5ndGggPiAwIHx8IGRlY2wuc3BlY2lmaWVycyAmJiBkZWNsLnNwZWNpZmllcnMuc29tZShub2RlID0+IG5vZGUuY29tbWVudHMpO1xuICAgICAgICBsZXQgcHJpbnRlZCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgaWYgKGNhbkJyZWFrKSB7XG4gICAgICAgICAgICBwcmludGVkID0gZ3JvdXAkYihjb25jYXQkZChbXCJ7XCIsIGluZGVudCQ3KGNvbmNhdCRkKFtvcHRpb25zLmJyYWNrZXRTcGFjaW5nID8gbGluZSQ5IDogc29mdGxpbmUkNiwgam9pbiQ5KGNvbmNhdCRkKFtcIixcIiwgbGluZSQ5XSksIHNwZWNpZmllcnMpXSkpLCBpZkJyZWFrJDYoc2hvdWxkUHJpbnRDb21tYSQxKG9wdGlvbnMpID8gXCIsXCIgOiBcIlwiKSwgb3B0aW9ucy5icmFja2V0U3BhY2luZyA/IGxpbmUkOSA6IHNvZnRsaW5lJDYsIFwifVwiXSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmludGVkID0gY29uY2F0JGQoW1wie1wiLCBvcHRpb25zLmJyYWNrZXRTcGFjaW5nID8gXCIgXCIgOiBcIlwiLCBjb25jYXQkZChzcGVjaWZpZXJzKSwgb3B0aW9ucy5icmFja2V0U3BhY2luZyA/IFwiIFwiIDogXCJcIiwgXCJ9XCJdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cy5wdXNoKGRlY2wuZXhwb3J0S2luZCA9PT0gXCJ0eXBlXCIgPyBcInR5cGUgXCIgOiBcIlwiLCBjb25jYXQkZChkZWZhdWx0U3BlY2lmaWVycyksIGNvbmNhdCRkKFtpc0RlZmF1bHRGb2xsb3dlZCA/IFwiLCBcIiA6IFwiXCJdKSwgY29uY2F0JGQobmFtZXNwYWNlU3BlY2lmaWVycyksIGNvbmNhdCRkKFtpc05hbWVzcGFjZUZvbGxvd2VkID8gXCIsIFwiIDogXCJcIl0pLCBwcmludGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnB1c2goXCJ7fVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlY2wuc291cmNlKSB7XG4gICAgICAgIHBhcnRzLnB1c2goXCIgZnJvbSBcIiwgcGF0aC5jYWxsKHByaW50LCBcInNvdXJjZVwiKSk7XG4gICAgICB9XG5cbiAgICAgIHBhcnRzLnB1c2goc2VtaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmNhdCRkKHBhcnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50Rmxvd0RlY2xhcmF0aW9uKHBhdGgsIHBhcnRzKSB7XG4gICAgY29uc3QgcGFyZW50RXhwb3J0RGVjbCA9IGdldFBhcmVudEV4cG9ydERlY2xhcmF0aW9uJDEocGF0aCk7XG5cbiAgICBpZiAocGFyZW50RXhwb3J0RGVjbCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcmVudEV4cG9ydERlY2wudHlwZSwgXCJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb25cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBwYXJlbnQgbm9kZSBoYXMgdHlwZSBEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb24sIHRoZW4gaXRcbiAgICAgIC8vIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHByaW50aW5nIHRoZSBcImRlY2xhcmVcIiB0b2tlbi4gT3RoZXJ3aXNlXG4gICAgICAvLyBpdCBuZWVkcyB0byBiZSBwcmludGVkIHdpdGggdGhpcyBub24tZXhwb3J0ZWQgZGVjbGFyYXRpb24gbm9kZS5cbiAgICAgIHBhcnRzLnVuc2hpZnQoXCJkZWNsYXJlIFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uY2F0JGQocGFydHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRUeXBlU2NyaXB0TW9kaWZpZXJzKHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3QgbiA9IHBhdGguZ2V0VmFsdWUoKTtcblxuICAgIGlmICghbi5tb2RpZmllcnMgfHwgIW4ubW9kaWZpZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmNhdCRkKFtqb2luJDkoXCIgXCIsIHBhdGgubWFwKHByaW50LCBcIm1vZGlmaWVyc1wiKSksIFwiIFwiXSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludFR5cGVQYXJhbWV0ZXJzKHBhdGgsIG9wdGlvbnMsIHByaW50LCBwYXJhbXNLZXkpIHtcbiAgICBjb25zdCBuID0gcGF0aC5nZXRWYWx1ZSgpO1xuXG4gICAgaWYgKCFuW3BhcmFtc0tleV0pIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH0gLy8gZm9yIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVycyBpcyBhIHNpbmdsZSBub2RlXG5cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShuW3BhcmFtc0tleV0pKSB7XG4gICAgICByZXR1cm4gcGF0aC5jYWxsKHByaW50LCBwYXJhbXNLZXkpO1xuICAgIH1cblxuICAgIGNvbnN0IGdyYW5kcGFyZW50ID0gcGF0aC5nZXROb2RlKDIpO1xuICAgIGNvbnN0IGdyZWF0R3JhbmRQYXJlbnQgPSBwYXRoLmdldE5vZGUoMyk7XG4gICAgY29uc3QgZ3JlYXRHcmVhdEdyYW5kUGFyZW50ID0gcGF0aC5nZXROb2RlKDQpO1xuICAgIGNvbnN0IGlzUGFyYW1ldGVySW5UZXN0Q2FsbCA9IGdyYW5kcGFyZW50ICE9IG51bGwgJiYgaXNUZXN0Q2FsbCQxKGdyYW5kcGFyZW50KTtcbiAgICBjb25zdCBzaG91bGRJbmxpbmUgPSBpc1BhcmFtZXRlckluVGVzdENhbGwgfHwgbltwYXJhbXNLZXldLmxlbmd0aCA9PT0gMCB8fCBuW3BhcmFtc0tleV0ubGVuZ3RoID09PSAxICYmIChzaG91bGRIdWdUeXBlKG5bcGFyYW1zS2V5XVswXSkgfHwgbltwYXJhbXNLZXldWzBdLnR5cGUgPT09IFwiR2VuZXJpY1R5cGVBbm5vdGF0aW9uXCIgJiYgc2hvdWxkSHVnVHlwZShuW3BhcmFtc0tleV1bMF0uaWQpIHx8IG5bcGFyYW1zS2V5XVswXS50eXBlID09PSBcIlRTVHlwZVJlZmVyZW5jZVwiICYmIHNob3VsZEh1Z1R5cGUobltwYXJhbXNLZXldWzBdLnR5cGVOYW1lKSB8fCBuW3BhcmFtc0tleV1bMF0udHlwZSA9PT0gXCJOdWxsYWJsZVR5cGVBbm5vdGF0aW9uXCIgfHwgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmV0dGllci9wcmV0dGllci9wdWxsLzY0NjcgZm9yIHRoZSBjb250ZXh0LlxuICAgIGdyZWF0R3JlYXRHcmFuZFBhcmVudCAmJiBncmVhdEdyZWF0R3JhbmRQYXJlbnQudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0b3JcIiAmJiBncmFuZHBhcmVudC50eXBlID09PSBcIlRTVHlwZUFubm90YXRpb25cIiAmJiBncmVhdEdyYW5kUGFyZW50LnR5cGUgIT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiAmJiBuW3BhcmFtc0tleV1bMF0udHlwZSAhPT0gXCJUU1VuaW9uVHlwZVwiICYmIG5bcGFyYW1zS2V5XVswXS50eXBlICE9PSBcIlVuaW9uVHlwZUFubm90YXRpb25cIiAmJiBuW3BhcmFtc0tleV1bMF0udHlwZSAhPT0gXCJUU0ludGVyc2VjdGlvblR5cGVcIiAmJiBuW3BhcmFtc0tleV1bMF0udHlwZSAhPT0gXCJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvblwiICYmIG5bcGFyYW1zS2V5XVswXS50eXBlICE9PSBcIlRTQ29uZGl0aW9uYWxUeXBlXCIgJiYgbltwYXJhbXNLZXldWzBdLnR5cGUgIT09IFwiVFNNYXBwZWRUeXBlXCIgJiYgbltwYXJhbXNLZXldWzBdLnR5cGUgIT09IFwiVFNUeXBlT3BlcmF0b3JcIiAmJiBuW3BhcmFtc0tleV1bMF0udHlwZSAhPT0gXCJUU0luZGV4ZWRBY2Nlc3NUeXBlXCIgJiYgbltwYXJhbXNLZXldWzBdLnR5cGUgIT09IFwiVFNBcnJheVR5cGVcIik7XG5cbiAgICBmdW5jdGlvbiBwcmludERhbmdsaW5nQ29tbWVudHNGb3JJbmxpbmUobikge1xuICAgICAgaWYgKCFoYXNEYW5nbGluZ0NvbW1lbnRzJDEobikpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc09ubHlCbG9ja0NvbW1lbnRzID0gbi5jb21tZW50cy5ldmVyeShjb21tZW50cyQxLmlzQmxvY2tDb21tZW50KTtcbiAgICAgIGNvbnN0IHByaW50ZWQgPSBjb21tZW50cy5wcmludERhbmdsaW5nQ29tbWVudHMocGF0aCwgb3B0aW9ucyxcbiAgICAgIC8qIHNhbWVJbmRlbnQgKi9cbiAgICAgIGhhc09ubHlCbG9ja0NvbW1lbnRzKTtcblxuICAgICAgaWYgKGhhc09ubHlCbG9ja0NvbW1lbnRzKSB7XG4gICAgICAgIHJldHVybiBwcmludGVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uY2F0JGQoW3ByaW50ZWQsIGhhcmRsaW5lJDldKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkSW5saW5lKSB7XG4gICAgICByZXR1cm4gY29uY2F0JGQoW1wiPFwiLCBqb2luJDkoXCIsIFwiLCBwYXRoLm1hcChwcmludCwgcGFyYW1zS2V5KSksIHByaW50RGFuZ2xpbmdDb21tZW50c0ZvcklubGluZShuKSwgXCI+XCJdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXAkYihjb25jYXQkZChbXCI8XCIsIGluZGVudCQ3KGNvbmNhdCRkKFtzb2Z0bGluZSQ2LCBqb2luJDkoY29uY2F0JGQoW1wiLFwiLCBsaW5lJDldKSwgcGF0aC5tYXAocHJpbnQsIHBhcmFtc0tleSkpXSkpLCBpZkJyZWFrJDYob3B0aW9ucy5wYXJzZXIgIT09IFwidHlwZXNjcmlwdFwiICYmIG9wdGlvbnMucGFyc2VyICE9PSBcImJhYmVsLXRzXCIgJiYgc2hvdWxkUHJpbnRDb21tYSQxKG9wdGlvbnMsIFwiYWxsXCIpID8gXCIsXCIgOiBcIlwiKSwgc29mdGxpbmUkNiwgXCI+XCJdKSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludENsYXNzKHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3QgbiA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuXG4gICAgaWYgKG4uYWJzdHJhY3QpIHtcbiAgICAgIHBhcnRzLnB1c2goXCJhYnN0cmFjdCBcIik7XG4gICAgfVxuXG4gICAgcGFydHMucHVzaChcImNsYXNzXCIpO1xuXG4gICAgaWYgKG4uaWQpIHtcbiAgICAgIHBhcnRzLnB1c2goXCIgXCIsIHBhdGguY2FsbChwcmludCwgXCJpZFwiKSk7XG4gICAgfVxuXG4gICAgcGFydHMucHVzaChwYXRoLmNhbGwocHJpbnQsIFwidHlwZVBhcmFtZXRlcnNcIikpO1xuICAgIGNvbnN0IHBhcnRzR3JvdXAgPSBbXTtcblxuICAgIGlmIChuLnN1cGVyQ2xhc3MpIHtcbiAgICAgIGNvbnN0IHByaW50ZWQgPSBjb25jYXQkZChbXCJleHRlbmRzIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwic3VwZXJDbGFzc1wiKSwgcGF0aC5jYWxsKHByaW50LCBcInN1cGVyVHlwZVBhcmFtZXRlcnNcIildKTsgLy8gS2VlcCBvbGQgYmVoYXZpb3VyIG9mIGV4dGVuZHMgaW4gc2FtZSBsaW5lXG4gICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uIGV4dGVuZHMgYW5kIHRoZXJlIGFyZSBub3QgY29tbWVudHNcblxuICAgICAgaWYgKCghbi5pbXBsZW1lbnRzIHx8IG4uaW1wbGVtZW50cy5sZW5ndGggPT09IDApICYmICghbi5zdXBlckNsYXNzLmNvbW1lbnRzIHx8IG4uc3VwZXJDbGFzcy5jb21tZW50cy5sZW5ndGggPT09IDApKSB7XG4gICAgICAgIHBhcnRzLnB1c2goY29uY2F0JGQoW1wiIFwiLCBwYXRoLmNhbGwoc3VwZXJDbGFzcyA9PiBjb21tZW50cy5wcmludENvbW1lbnRzKHN1cGVyQ2xhc3MsICgpID0+IHByaW50ZWQsIG9wdGlvbnMpLCBcInN1cGVyQ2xhc3NcIildKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0c0dyb3VwLnB1c2goZ3JvdXAkYihjb25jYXQkZChbbGluZSQ5LCBwYXRoLmNhbGwoc3VwZXJDbGFzcyA9PiBjb21tZW50cy5wcmludENvbW1lbnRzKHN1cGVyQ2xhc3MsICgpID0+IHByaW50ZWQsIG9wdGlvbnMpLCBcInN1cGVyQ2xhc3NcIildKSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobi5leHRlbmRzICYmIG4uZXh0ZW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKFwiIGV4dGVuZHMgXCIsIGpvaW4kOShcIiwgXCIsIHBhdGgubWFwKHByaW50LCBcImV4dGVuZHNcIikpKTtcbiAgICB9XG5cbiAgICBpZiAobi5taXhpbnMgJiYgbi5taXhpbnMubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHNHcm91cC5wdXNoKGxpbmUkOSwgXCJtaXhpbnMgXCIsIGdyb3VwJGIoaW5kZW50JDcoam9pbiQ5KGNvbmNhdCRkKFtcIixcIiwgbGluZSQ5XSksIHBhdGgubWFwKHByaW50LCBcIm1peGluc1wiKSkpKSk7XG4gICAgfVxuXG4gICAgaWYgKG4uaW1wbGVtZW50cyAmJiBuLmltcGxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHNHcm91cC5wdXNoKGxpbmUkOSwgXCJpbXBsZW1lbnRzXCIsIGdyb3VwJGIoaW5kZW50JDcoY29uY2F0JGQoW2xpbmUkOSwgam9pbiQ5KGNvbmNhdCRkKFtcIixcIiwgbGluZSQ5XSksIHBhdGgubWFwKHByaW50LCBcImltcGxlbWVudHNcIikpXSkpKSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzR3JvdXAubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChncm91cCRiKGluZGVudCQ3KGNvbmNhdCRkKHBhcnRzR3JvdXApKSkpO1xuICAgIH1cblxuICAgIGlmIChuLmJvZHkgJiYgbi5ib2R5LmNvbW1lbnRzICYmIGhhc0xlYWRpbmdPd25MaW5lQ29tbWVudCQxKG9wdGlvbnMub3JpZ2luYWxUZXh0LCBuLmJvZHksIG9wdGlvbnMpKSB7XG4gICAgICBwYXJ0cy5wdXNoKGhhcmRsaW5lJDkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0cy5wdXNoKFwiIFwiKTtcbiAgICB9XG5cbiAgICBwYXJ0cy5wdXNoKHBhdGguY2FsbChwcmludCwgXCJib2R5XCIpKTtcbiAgICByZXR1cm4gcGFydHM7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludE9wdGlvbmFsVG9rZW4ocGF0aCkge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG5cbiAgICBpZiAoIW5vZGUub3B0aW9uYWwgfHwgLy8gSXQncyBhbiBvcHRpb25hbCBjb21wdXRlZCBtZXRob2QgcGFyc2VkIGJ5IHR5cGVzY3JpcHQtZXN0cmVlLlxuICAgIC8vIFwiP1wiIGlzIHByaW50ZWQgaW4gYHByaW50TWV0aG9kYC5cbiAgICBub2RlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIG5vZGUgPT09IHBhdGguZ2V0UGFyZW50Tm9kZSgpLmtleSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiICYmIG5vZGUuY29tcHV0ZWQpIHtcbiAgICAgIHJldHVybiBcIj8uXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiP1wiO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRNZW1iZXJMb29rdXAocGF0aCwgb3B0aW9ucywgcHJpbnQpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHBhdGguY2FsbChwcmludCwgXCJwcm9wZXJ0eVwiKTtcbiAgICBjb25zdCBuID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IG9wdGlvbmFsID0gcHJpbnRPcHRpb25hbFRva2VuKHBhdGgpO1xuXG4gICAgaWYgKCFuLmNvbXB1dGVkKSB7XG4gICAgICByZXR1cm4gY29uY2F0JGQoW29wdGlvbmFsLCBcIi5cIiwgcHJvcGVydHldKTtcbiAgICB9XG5cbiAgICBpZiAoIW4ucHJvcGVydHkgfHwgaXNOdW1lcmljTGl0ZXJhbCQxKG4ucHJvcGVydHkpKSB7XG4gICAgICByZXR1cm4gY29uY2F0JGQoW29wdGlvbmFsLCBcIltcIiwgcHJvcGVydHksIFwiXVwiXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW29wdGlvbmFsLCBcIltcIiwgaW5kZW50JDcoY29uY2F0JGQoW3NvZnRsaW5lJDYsIHByb3BlcnR5XSkpLCBzb2Z0bGluZSQ2LCBcIl1cIl0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50QmluZEV4cHJlc3Npb25DYWxsZWUocGF0aCwgb3B0aW9ucywgcHJpbnQpIHtcbiAgICByZXR1cm4gY29uY2F0JGQoW1wiOjpcIiwgcGF0aC5jYWxsKHByaW50LCBcImNhbGxlZVwiKV0pO1xuICB9IC8vIFdlIGRldGVjdCBjYWxscyBvbiBtZW1iZXIgZXhwcmVzc2lvbnMgc3BlY2lhbGx5IHRvIGZvcm1hdCBhXG4gIC8vIGNvbW1vbiBwYXR0ZXJuIGJldHRlci4gVGhlIHBhdHRlcm4gd2UgYXJlIGxvb2tpbmcgZm9yIGlzIHRoaXM6XG4gIC8vXG4gIC8vIGFyclxuICAvLyAgIC5tYXAoeCA9PiB4ICsgMSlcbiAgLy8gICAuZmlsdGVyKHggPT4geCA+IDEwKVxuICAvLyAgIC5zb21lKHggPT4geCAlIDIpXG4gIC8vXG4gIC8vIFRoZSB3YXkgaXQgaXMgc3RydWN0dXJlZCBpbiB0aGUgQVNUIGlzIHZpYSBhIG5lc3RlZCBzZXF1ZW5jZSBvZlxuICAvLyBNZW1iZXJFeHByZXNzaW9uIGFuZCBDYWxsRXhwcmVzc2lvbi4gV2UgbmVlZCB0byB0cmF2ZXJzZSB0aGUgQVNUXG4gIC8vIGFuZCBtYWtlIGdyb3VwcyBvdXQgb2YgaXQgdG8gcHJpbnQgaXQgaW4gdGhlIGRlc2lyZWQgd2F5LlxuXG5cbiAgZnVuY3Rpb24gcHJpbnRNZW1iZXJDaGFpbihwYXRoLCBvcHRpb25zLCBwcmludCkge1xuICAgIC8vIFRoZSBmaXJzdCBwaGFzZSBpcyB0byBsaW5lYXJpemUgdGhlIEFTVCBieSB0cmF2ZXJzaW5nIGl0IGRvd24uXG4gICAgLy9cbiAgICAvLyAgIGEoKS5iKClcbiAgICAvLyBoYXMgdGhlIGZvbGxvd2luZyBBU1Qgc3RydWN0dXJlOlxuICAgIC8vICAgQ2FsbEV4cHJlc3Npb24oTWVtYmVyRXhwcmVzc2lvbihDYWxsRXhwcmVzc2lvbihJZGVudGlmaWVyKSkpXG4gICAgLy8gYW5kIHdlIHRyYW5zZm9ybSBpdCBpbnRvXG4gICAgLy8gICBbSWRlbnRpZmllciwgQ2FsbEV4cHJlc3Npb24sIE1lbWJlckV4cHJlc3Npb24sIENhbGxFeHByZXNzaW9uXVxuICAgIGNvbnN0IHByaW50ZWROb2RlcyA9IFtdOyAvLyBIZXJlIHdlIHRyeSB0byByZXRhaW4gb25lIHR5cGVkIGVtcHR5IGxpbmUgYWZ0ZXIgZWFjaCBjYWxsIGV4cHJlc3Npb24gb3JcbiAgICAvLyB0aGUgZmlyc3QgZ3JvdXAgd2hldGhlciBpdCBpcyBpbiBwYXJlbnRoZXNlcyBvciBub3RcblxuICAgIGZ1bmN0aW9uIHNob3VsZEluc2VydEVtcHR5TGluZUFmdGVyKG5vZGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb3JpZ2luYWxUZXh0XG4gICAgICB9ID0gb3B0aW9ucztcbiAgICAgIGNvbnN0IG5leHRDaGFySW5kZXggPSBnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXgkMyhvcmlnaW5hbFRleHQsIG5vZGUsIG9wdGlvbnMubG9jRW5kKTtcbiAgICAgIGNvbnN0IG5leHRDaGFyID0gb3JpZ2luYWxUZXh0LmNoYXJBdChuZXh0Q2hhckluZGV4KTsgLy8gaWYgaXQgaXMgY3V0IG9mZiBieSBhIHBhcmVudGhlc2lzLCB3ZSBvbmx5IGFjY291bnQgZm9yIG9uZSB0eXBlZCBlbXB0eVxuICAgICAgLy8gbGluZSBhZnRlciB0aGF0IHBhcmVudGhlc2lzXG5cbiAgICAgIGlmIChuZXh0Q2hhciA9PT0gXCIpXCIpIHtcbiAgICAgICAgcmV0dXJuIGlzTmV4dExpbmVFbXB0eUFmdGVySW5kZXgkMihvcmlnaW5hbFRleHQsIG5leHRDaGFySW5kZXggKyAxLCBvcHRpb25zLmxvY0VuZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc05leHRMaW5lRW1wdHkkNChvcmlnaW5hbFRleHQsIG5vZGUsIG9wdGlvbnMubG9jRW5kKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWMocGF0aCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcblxuICAgICAgaWYgKChub2RlLnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiKSAmJiAoaXNNZW1iZXJpc2gkMShub2RlLmNhbGxlZSkgfHwgbm9kZS5jYWxsZWUudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiIHx8IG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiKSkge1xuICAgICAgICBwcmludGVkTm9kZXMudW5zaGlmdCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBwcmludGVkOiBjb25jYXQkZChbY29tbWVudHMucHJpbnRDb21tZW50cyhwYXRoLCAoKSA9PiBjb25jYXQkZChbcHJpbnRPcHRpb25hbFRva2VuKHBhdGgpLCBwcmludEZ1bmN0aW9uVHlwZVBhcmFtZXRlcnMocGF0aCwgb3B0aW9ucywgcHJpbnQpLCBwcmludEFyZ3VtZW50c0xpc3QocGF0aCwgb3B0aW9ucywgcHJpbnQpXSksIG9wdGlvbnMpLCBzaG91bGRJbnNlcnRFbXB0eUxpbmVBZnRlcihub2RlKSA/IGhhcmRsaW5lJDkgOiBcIlwiXSlcbiAgICAgICAgfSk7XG4gICAgICAgIHBhdGguY2FsbChjYWxsZWUgPT4gcmVjKGNhbGxlZSksIFwiY2FsbGVlXCIpO1xuICAgICAgfSBlbHNlIGlmIChpc01lbWJlcmlzaCQxKG5vZGUpKSB7XG4gICAgICAgIHByaW50ZWROb2Rlcy51bnNoaWZ0KHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG5lZWRzUGFyZW5zOiBuZWVkc1BhcmVuc18xKHBhdGgsIG9wdGlvbnMpLFxuICAgICAgICAgIHByaW50ZWQ6IGNvbW1lbnRzLnByaW50Q29tbWVudHMocGF0aCwgKCkgPT4gbm9kZS50eXBlID09PSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgPyBwcmludE1lbWJlckxvb2t1cChwYXRoLCBvcHRpb25zLCBwcmludCkgOiBwcmludEJpbmRFeHByZXNzaW9uQ2FsbGVlKHBhdGgsIG9wdGlvbnMsIHByaW50KSwgb3B0aW9ucylcbiAgICAgICAgfSk7XG4gICAgICAgIHBhdGguY2FsbChvYmplY3QgPT4gcmVjKG9iamVjdCksIFwib2JqZWN0XCIpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IFwiVFNOb25OdWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHByaW50ZWROb2Rlcy51bnNoaWZ0KHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHByaW50ZWQ6IGNvbW1lbnRzLnByaW50Q29tbWVudHMocGF0aCwgKCkgPT4gXCIhXCIsIG9wdGlvbnMpXG4gICAgICAgIH0pO1xuICAgICAgICBwYXRoLmNhbGwoZXhwcmVzc2lvbiA9PiByZWMoZXhwcmVzc2lvbiksIFwiZXhwcmVzc2lvblwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByaW50ZWROb2Rlcy51bnNoaWZ0KHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHByaW50ZWQ6IHBhdGguY2FsbChwcmludClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSAvLyBOb3RlOiB0aGUgY29tbWVudHMgb2YgdGhlIHJvb3Qgbm9kZSBoYXZlIGFscmVhZHkgYmVlbiBwcmludGVkLCBzbyB3ZVxuICAgIC8vIG5lZWQgdG8gZXh0cmFjdCB0aGlzIGZpcnN0IGNhbGwgd2l0aG91dCBwcmludGluZyB0aGVtIGFzIHRoZXkgd291bGRcbiAgICAvLyBpZiBoYW5kbGVkIGluc2lkZSBvZiB0aGUgcmVjdXJzaXZlIGNhbGwuXG5cblxuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgcHJpbnRlZE5vZGVzLnVuc2hpZnQoe1xuICAgICAgbm9kZSxcbiAgICAgIHByaW50ZWQ6IGNvbmNhdCRkKFtwcmludE9wdGlvbmFsVG9rZW4ocGF0aCksIHByaW50RnVuY3Rpb25UeXBlUGFyYW1ldGVycyhwYXRoLCBvcHRpb25zLCBwcmludCksIHByaW50QXJndW1lbnRzTGlzdChwYXRoLCBvcHRpb25zLCBwcmludCldKVxuICAgIH0pO1xuICAgIHBhdGguY2FsbChjYWxsZWUgPT4gcmVjKGNhbGxlZSksIFwiY2FsbGVlXCIpOyAvLyBPbmNlIHdlIGhhdmUgYSBsaW5lYXIgbGlzdCBvZiBwcmludGVkIG5vZGVzLCB3ZSB3YW50IHRvIGNyZWF0ZSBncm91cHMgb3V0XG4gICAgLy8gb2YgaXQuXG4gICAgLy9cbiAgICAvLyAgIGEoKS5iLmMoKS5kKCkuZVxuICAgIC8vIHdpbGwgYmUgZ3JvdXBlZCBhc1xuICAgIC8vICAgW1xuICAgIC8vICAgICBbSWRlbnRpZmllciwgQ2FsbEV4cHJlc3Npb25dLFxuICAgIC8vICAgICBbTWVtYmVyRXhwcmVzc2lvbiwgTWVtYmVyRXhwcmVzc2lvbiwgQ2FsbEV4cHJlc3Npb25dLFxuICAgIC8vICAgICBbTWVtYmVyRXhwcmVzc2lvbiwgQ2FsbEV4cHJlc3Npb25dLFxuICAgIC8vICAgICBbTWVtYmVyRXhwcmVzc2lvbl0sXG4gICAgLy8gICBdXG4gICAgLy8gc28gdGhhdCB3ZSBjYW4gcHJpbnQgaXQgYXNcbiAgICAvLyAgIGEoKVxuICAgIC8vICAgICAuYi5jKClcbiAgICAvLyAgICAgLmQoKVxuICAgIC8vICAgICAuZVxuICAgIC8vIFRoZSBmaXJzdCBncm91cCBpcyB0aGUgZmlyc3Qgbm9kZSBmb2xsb3dlZCBieVxuICAgIC8vICAgLSBhcyBtYW55IENhbGxFeHByZXNzaW9uIGFzIHBvc3NpYmxlXG4gICAgLy8gICAgICAgPCBmbigpKCkoKSA+LnNvbWV0aGluZygpXG4gICAgLy8gICAtIGFzIG1hbnkgYXJyYXkgYWNjZXNzb3JzIGFzIHBvc3NpYmxlXG4gICAgLy8gICAgICAgPCBmbigpWzBdWzFdWzJdID4uc29tZXRoaW5nKClcbiAgICAvLyAgIC0gdGhlbiwgYXMgbWFueSBNZW1iZXJFeHByZXNzaW9uIGFzIHBvc3NpYmxlIGJ1dCB0aGUgbGFzdCBvbmVcbiAgICAvLyAgICAgICA8IHRoaXMuaXRlbXMgPi5zb21ldGhpbmcoKVxuXG4gICAgY29uc3QgZ3JvdXBzID0gW107XG4gICAgbGV0IGN1cnJlbnRHcm91cCA9IFtwcmludGVkTm9kZXNbMF1dO1xuICAgIGxldCBpID0gMTtcblxuICAgIGZvciAoOyBpIDwgcHJpbnRlZE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAocHJpbnRlZE5vZGVzW2ldLm5vZGUudHlwZSA9PT0gXCJUU05vbk51bGxFeHByZXNzaW9uXCIgfHwgcHJpbnRlZE5vZGVzW2ldLm5vZGUudHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCIgfHwgcHJpbnRlZE5vZGVzW2ldLm5vZGUudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiIHx8IChwcmludGVkTm9kZXNbaV0ubm9kZS50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fCBwcmludGVkTm9kZXNbaV0ubm9kZS50eXBlID09PSBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiKSAmJiBwcmludGVkTm9kZXNbaV0ubm9kZS5jb21wdXRlZCAmJiBpc051bWVyaWNMaXRlcmFsJDEocHJpbnRlZE5vZGVzW2ldLm5vZGUucHJvcGVydHkpKSB7XG4gICAgICAgIGN1cnJlbnRHcm91cC5wdXNoKHByaW50ZWROb2Rlc1tpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJpbnRlZE5vZGVzWzBdLm5vZGUudHlwZSAhPT0gXCJDYWxsRXhwcmVzc2lvblwiICYmIHByaW50ZWROb2Rlc1swXS5ub2RlLnR5cGUgIT09IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICBmb3IgKDsgaSArIDEgPCBwcmludGVkTm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGlzTWVtYmVyaXNoJDEocHJpbnRlZE5vZGVzW2ldLm5vZGUpICYmIGlzTWVtYmVyaXNoJDEocHJpbnRlZE5vZGVzW2kgKyAxXS5ub2RlKSkge1xuICAgICAgICAgIGN1cnJlbnRHcm91cC5wdXNoKHByaW50ZWROb2Rlc1tpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBncm91cHMucHVzaChjdXJyZW50R3JvdXApO1xuICAgIGN1cnJlbnRHcm91cCA9IFtdOyAvLyBUaGVuLCBlYWNoIGZvbGxvd2luZyBncm91cCBpcyBhIHNlcXVlbmNlIG9mIE1lbWJlckV4cHJlc3Npb24gZm9sbG93ZWQgYnlcbiAgICAvLyBhIHNlcXVlbmNlIG9mIENhbGxFeHByZXNzaW9uLiBUbyBjb21wdXRlIGl0LCB3ZSBrZWVwIGFkZGluZyB0aGluZ3MgdG8gdGhlXG4gICAgLy8gZ3JvdXAgdW50aWwgd2UgaGFzIHNlZW4gYSBDYWxsRXhwcmVzc2lvbiBpbiB0aGUgcGFzdCBhbmQgcmVhY2ggYVxuICAgIC8vIE1lbWJlckV4cHJlc3Npb25cblxuICAgIGxldCBoYXNTZWVuQ2FsbEV4cHJlc3Npb24gPSBmYWxzZTtcblxuICAgIGZvciAoOyBpIDwgcHJpbnRlZE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaGFzU2VlbkNhbGxFeHByZXNzaW9uICYmIGlzTWVtYmVyaXNoJDEocHJpbnRlZE5vZGVzW2ldLm5vZGUpKSB7XG4gICAgICAgIC8vIFswXSBzaG91bGQgYmUgYXBwZW5kZWQgYXQgdGhlIGVuZCBvZiB0aGUgZ3JvdXAgaW5zdGVhZCBvZiB0aGVcbiAgICAgICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBuZXh0IG9uZVxuICAgICAgICBpZiAocHJpbnRlZE5vZGVzW2ldLm5vZGUuY29tcHV0ZWQgJiYgaXNOdW1lcmljTGl0ZXJhbCQxKHByaW50ZWROb2Rlc1tpXS5ub2RlLnByb3BlcnR5KSkge1xuICAgICAgICAgIGN1cnJlbnRHcm91cC5wdXNoKHByaW50ZWROb2Rlc1tpXSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBncm91cHMucHVzaChjdXJyZW50R3JvdXApO1xuICAgICAgICBjdXJyZW50R3JvdXAgPSBbXTtcbiAgICAgICAgaGFzU2VlbkNhbGxFeHByZXNzaW9uID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmludGVkTm9kZXNbaV0ubm9kZS50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgfHwgcHJpbnRlZE5vZGVzW2ldLm5vZGUudHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgaGFzU2VlbkNhbGxFeHByZXNzaW9uID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudEdyb3VwLnB1c2gocHJpbnRlZE5vZGVzW2ldKTtcblxuICAgICAgaWYgKHByaW50ZWROb2Rlc1tpXS5ub2RlLmNvbW1lbnRzICYmIHByaW50ZWROb2Rlc1tpXS5ub2RlLmNvbW1lbnRzLnNvbWUoY29tbWVudCA9PiBjb21tZW50LnRyYWlsaW5nKSkge1xuICAgICAgICBncm91cHMucHVzaChjdXJyZW50R3JvdXApO1xuICAgICAgICBjdXJyZW50R3JvdXAgPSBbXTtcbiAgICAgICAgaGFzU2VlbkNhbGxFeHByZXNzaW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRHcm91cC5sZW5ndGggPiAwKSB7XG4gICAgICBncm91cHMucHVzaChjdXJyZW50R3JvdXApO1xuICAgIH0gLy8gVGhlcmUgYXJlIGNhc2VzIGxpa2UgT2JqZWN0LmtleXMoKSwgT2JzZXJ2YWJsZS5vZigpLCBfLnZhbHVlcygpIHdoZXJlXG4gICAgLy8gdGhleSBhcmUgdGhlIHN1YmplY3Qgb2YgYWxsIHRoZSBjaGFpbmVkIGNhbGxzIGFuZCB0aGVyZWZvcmUgc2hvdWxkXG4gICAgLy8gYmUga2VwdCBvbiB0aGUgc2FtZSBsaW5lOlxuICAgIC8vXG4gICAgLy8gICBPYmplY3Qua2V5cyhpdGVtcylcbiAgICAvLyAgICAgLmZpbHRlcih4ID0+IHgpXG4gICAgLy8gICAgIC5tYXAoeCA9PiB4KVxuICAgIC8vXG4gICAgLy8gSW4gb3JkZXIgdG8gZGV0ZWN0IHRob3NlIGNhc2VzLCB3ZSB1c2UgYW4gaGV1cmlzdGljOiBpZiB0aGUgZmlyc3RcbiAgICAvLyBub2RlIGlzIGFuIGlkZW50aWZpZXIgd2l0aCB0aGUgbmFtZSBzdGFydGluZyB3aXRoIGEgY2FwaXRhbFxuICAgIC8vIGxldHRlciBvciBqdXN0IGEgc2VxdWVuY2Ugb2YgXyQuIFRoZSByYXRpb25hbGUgaXMgdGhhdCB0aGV5IGFyZVxuICAgIC8vIGxpa2VseSB0byBiZSBmYWN0b3JpZXMuXG5cblxuICAgIGZ1bmN0aW9uIGlzRmFjdG9yeShuYW1lKSB7XG4gICAgICByZXR1cm4gL15bQS1aXXxeW18kXSskLy50ZXN0KG5hbWUpO1xuICAgIH0gLy8gSW4gY2FzZSB0aGUgSWRlbnRpZmllciBpcyBzaG9ydGVyIHRoYW4gdGFiIHdpZHRoLCB3ZSBjYW4ga2VlcCB0aGVcbiAgICAvLyBmaXJzdCBjYWxsIGluIGEgc2luZ2xlIGxpbmUsIGlmIGl0J3MgYW4gRXhwcmVzc2lvblN0YXRlbWVudC5cbiAgICAvL1xuICAgIC8vICAgZDMuc2NhbGVMaW5lYXIoKVxuICAgIC8vICAgICAuZG9tYWluKFswLCAxMDBdKVxuICAgIC8vICAgICAucmFuZ2UoWzAsIHdpZHRoXSk7XG4gICAgLy9cblxuXG4gICAgZnVuY3Rpb24gaXNTaG9ydChuYW1lKSB7XG4gICAgICByZXR1cm4gbmFtZS5sZW5ndGggPD0gb3B0aW9ucy50YWJXaWR0aDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzaG91bGROb3RXcmFwKGdyb3Vwcykge1xuICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgICBjb25zdCBpc0V4cHJlc3Npb24gPSBwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiO1xuICAgICAgY29uc3QgaGFzQ29tcHV0ZWQgPSBncm91cHNbMV0ubGVuZ3RoICYmIGdyb3Vwc1sxXVswXS5ub2RlLmNvbXB1dGVkO1xuXG4gICAgICBpZiAoZ3JvdXBzWzBdLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBmaXJzdE5vZGUgPSBncm91cHNbMF1bMF0ubm9kZTtcbiAgICAgICAgcmV0dXJuIGZpcnN0Tm9kZS50eXBlID09PSBcIlRoaXNFeHByZXNzaW9uXCIgfHwgZmlyc3ROb2RlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIChpc0ZhY3RvcnkoZmlyc3ROb2RlLm5hbWUpIHx8IGlzRXhwcmVzc2lvbiAmJiBpc1Nob3J0KGZpcnN0Tm9kZS5uYW1lKSB8fCBoYXNDb21wdXRlZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxhc3ROb2RlID0gZ2V0TGFzdCQzKGdyb3Vwc1swXSkubm9kZTtcbiAgICAgIHJldHVybiAobGFzdE5vZGUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgfHwgbGFzdE5vZGUudHlwZSA9PT0gXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIikgJiYgbGFzdE5vZGUucHJvcGVydHkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgKGlzRmFjdG9yeShsYXN0Tm9kZS5wcm9wZXJ0eS5uYW1lKSB8fCBoYXNDb21wdXRlZCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkTWVyZ2UgPSBncm91cHMubGVuZ3RoID49IDIgJiYgIWdyb3Vwc1sxXVswXS5ub2RlLmNvbW1lbnRzICYmIHNob3VsZE5vdFdyYXAoZ3JvdXBzKTtcblxuICAgIGZ1bmN0aW9uIHByaW50R3JvdXAocHJpbnRlZEdyb3VwKSB7XG4gICAgICBjb25zdCBwcmludGVkID0gcHJpbnRlZEdyb3VwLm1hcCh0dXBsZSA9PiB0dXBsZS5wcmludGVkKTsgLy8gQ2hlY2tzIGlmIHRoZSBsYXN0IG5vZGUgKGkuZS4gdGhlIHBhcmVudCBub2RlKSBuZWVkcyBwYXJlbnMgYW5kIHByaW50XG4gICAgICAvLyBhY2NvcmRpbmdseVxuXG4gICAgICBpZiAocHJpbnRlZEdyb3VwLmxlbmd0aCA+IDAgJiYgcHJpbnRlZEdyb3VwW3ByaW50ZWRHcm91cC5sZW5ndGggLSAxXS5uZWVkc1BhcmVucykge1xuICAgICAgICByZXR1cm4gY29uY2F0JGQoW1wiKFwiLCAuLi5wcmludGVkLCBcIilcIl0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uY2F0JGQocHJpbnRlZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJpbnRJbmRlbnRlZEdyb3VwKGdyb3Vwcykge1xuICAgICAgaWYgKGdyb3Vwcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbmRlbnQkNyhncm91cCRiKGNvbmNhdCRkKFtoYXJkbGluZSQ5LCBqb2luJDkoaGFyZGxpbmUkOSwgZ3JvdXBzLm1hcChwcmludEdyb3VwKSldKSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW50ZWRHcm91cHMgPSBncm91cHMubWFwKHByaW50R3JvdXApO1xuICAgIGNvbnN0IG9uZUxpbmUgPSBjb25jYXQkZChwcmludGVkR3JvdXBzKTtcbiAgICBjb25zdCBjdXRvZmYgPSBzaG91bGRNZXJnZSA/IDMgOiAyO1xuICAgIGNvbnN0IGZsYXRHcm91cHMgPSBncm91cHMucmVkdWNlKChyZXMsIGdyb3VwKSA9PiByZXMuY29uY2F0KGdyb3VwKSwgW10pO1xuICAgIGNvbnN0IGhhc0NvbW1lbnQgPSBmbGF0R3JvdXBzLnNsaWNlKDEsIC0xKS5zb21lKG5vZGUgPT4gaGFzTGVhZGluZ0NvbW1lbnQkMyhub2RlLm5vZGUpKSB8fCBmbGF0R3JvdXBzLnNsaWNlKDAsIC0xKS5zb21lKG5vZGUgPT4gaGFzVHJhaWxpbmdDb21tZW50JDEobm9kZS5ub2RlKSkgfHwgZ3JvdXBzW2N1dG9mZl0gJiYgaGFzTGVhZGluZ0NvbW1lbnQkMyhncm91cHNbY3V0b2ZmXVswXS5ub2RlKTsgLy8gSWYgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGAuYCwgd2Ugc2hvdWxkbid0IGRvIGFueXRoaW5nIGZhbmN5IGFuZCBqdXN0XG4gICAgLy8gcmVuZGVyIGV2ZXJ5dGhpbmcgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyLlxuXG4gICAgaWYgKGdyb3Vwcy5sZW5ndGggPD0gY3V0b2ZmICYmICFoYXNDb21tZW50KSB7XG4gICAgICBpZiAoaXNMb25nQ3VycmllZENhbGxFeHByZXNzaW9uJDEocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIG9uZUxpbmU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBncm91cCRiKG9uZUxpbmUpO1xuICAgIH0gLy8gRmluZCBvdXQgdGhlIGxhc3Qgbm9kZSBpbiB0aGUgZmlyc3QgZ3JvdXAgYW5kIGNoZWNrIGlmIGl0IGhhcyBhblxuICAgIC8vIGVtcHR5IGxpbmUgYWZ0ZXJcblxuXG4gICAgY29uc3QgbGFzdE5vZGVCZWZvcmVJbmRlbnQgPSBnZXRMYXN0JDMoc2hvdWxkTWVyZ2UgPyBncm91cHMuc2xpY2UoMSwgMilbMF0gOiBncm91cHNbMF0pLm5vZGU7XG4gICAgY29uc3Qgc2hvdWxkSGF2ZUVtcHR5TGluZUJlZm9yZUluZGVudCA9IGxhc3ROb2RlQmVmb3JlSW5kZW50LnR5cGUgIT09IFwiQ2FsbEV4cHJlc3Npb25cIiAmJiBsYXN0Tm9kZUJlZm9yZUluZGVudC50eXBlICE9PSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIiAmJiBzaG91bGRJbnNlcnRFbXB0eUxpbmVBZnRlcihsYXN0Tm9kZUJlZm9yZUluZGVudCk7XG4gICAgY29uc3QgZXhwYW5kZWQgPSBjb25jYXQkZChbcHJpbnRHcm91cChncm91cHNbMF0pLCBzaG91bGRNZXJnZSA/IGNvbmNhdCRkKGdyb3Vwcy5zbGljZSgxLCAyKS5tYXAocHJpbnRHcm91cCkpIDogXCJcIiwgc2hvdWxkSGF2ZUVtcHR5TGluZUJlZm9yZUluZGVudCA/IGhhcmRsaW5lJDkgOiBcIlwiLCBwcmludEluZGVudGVkR3JvdXAoZ3JvdXBzLnNsaWNlKHNob3VsZE1lcmdlID8gMiA6IDEpKV0pO1xuICAgIGNvbnN0IGNhbGxFeHByZXNzaW9ucyA9IHByaW50ZWROb2Rlcy5tYXAoKHtcbiAgICAgIG5vZGVcbiAgICB9KSA9PiBub2RlKS5maWx0ZXIoaXNDYWxsT3JPcHRpb25hbENhbGxFeHByZXNzaW9uJDEpOyAvLyBXZSBkb24ndCB3YW50IHRvIHByaW50IGluIG9uZSBsaW5lIGlmIHRoZSBjaGFpbiBoYXM6XG4gICAgLy8gICogQSBjb21tZW50LlxuICAgIC8vICAqIE5vbi10cml2aWFsIGFyZ3VtZW50cy5cbiAgICAvLyAgKiBBbnkgZ3JvdXAgYnV0IHRoZSBsYXN0IG9uZSBoYXMgYSBoYXJkIGxpbmUuXG4gICAgLy8gSWYgdGhlIGxhc3QgZ3JvdXAgaXMgYSBmdW5jdGlvbiBpdCdzIG9rYXkgdG8gaW5saW5lIGlmIGl0IGZpdHMuXG5cbiAgICBpZiAoaGFzQ29tbWVudCB8fCBjYWxsRXhwcmVzc2lvbnMubGVuZ3RoID4gMiAmJiBjYWxsRXhwcmVzc2lvbnMuc29tZShleHByID0+ICFleHByLmFyZ3VtZW50cy5ldmVyeShhcmcgPT4gaXNTaW1wbGVDYWxsQXJndW1lbnQkMShhcmcsIDApKSkgfHwgcHJpbnRlZEdyb3Vwcy5zbGljZSgwLCAtMSkuc29tZSh3aWxsQnJlYWskMSkgfHxcbiAgICAvKipcbiAgICAgKiAgICAgc2NvcGVzLmZpbHRlcihzY29wZSA9PiBzY29wZS52YWx1ZSAhPT0gJycpLm1hcCgoc2NvcGUsIGkpID0+IHtcbiAgICAgKiAgICAgICAvLyBtdWx0aSBsaW5lIGNvbnRlbnRcbiAgICAgKiAgICAgfSlcbiAgICAgKi9cbiAgICAoKGxhc3RHcm91cERvYywgbGFzdEdyb3VwTm9kZSkgPT4gaXNDYWxsT3JPcHRpb25hbENhbGxFeHByZXNzaW9uJDEobGFzdEdyb3VwTm9kZSkgJiYgd2lsbEJyZWFrJDEobGFzdEdyb3VwRG9jKSkoZ2V0TGFzdCQzKHByaW50ZWRHcm91cHMpLCBnZXRMYXN0JDMoZ2V0TGFzdCQzKGdyb3VwcykpLm5vZGUpICYmIGNhbGxFeHByZXNzaW9ucy5zbGljZSgwLCAtMSkuc29tZShuID0+IG4uYXJndW1lbnRzLnNvbWUoaXNGdW5jdGlvbk9yQXJyb3dFeHByZXNzaW9uJDEpKSkge1xuICAgICAgcmV0dXJuIGdyb3VwJGIoZXhwYW5kZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25jYXQkZChbLy8gV2Ugb25seSBuZWVkIHRvIGNoZWNrIGBvbmVMaW5lYCBiZWNhdXNlIGlmIGBleHBhbmRlZGAgaXMgY2hvc2VuXG4gICAgLy8gdGhhdCBtZWFucyB0aGF0IHRoZSBwYXJlbnQgZ3JvdXAgaGFzIGFscmVhZHkgYmVlbiBicm9rZW5cbiAgICAvLyBuYXR1cmFsbHlcbiAgICB3aWxsQnJlYWskMShvbmVMaW5lKSB8fCBzaG91bGRIYXZlRW1wdHlMaW5lQmVmb3JlSW5kZW50ID8gYnJlYWtQYXJlbnQkMyA6IFwiXCIsIGNvbmRpdGlvbmFsR3JvdXAkMShbb25lTGluZSwgZXhwYW5kZWRdKV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VwYXJhdG9yTm9XaGl0ZXNwYWNlKGlzRmFjZWJvb2tUcmFuc2xhdGlvblRhZywgY2hpbGQsIGNoaWxkTm9kZSwgbmV4dE5vZGUpIHtcbiAgICBpZiAoaXNGYWNlYm9va1RyYW5zbGF0aW9uVGFnKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGROb2RlLnR5cGUgPT09IFwiSlNYRWxlbWVudFwiICYmICFjaGlsZE5vZGUuY2xvc2luZ0VsZW1lbnQgfHwgbmV4dE5vZGUgJiYgbmV4dE5vZGUudHlwZSA9PT0gXCJKU1hFbGVtZW50XCIgJiYgIW5leHROb2RlLmNsb3NpbmdFbGVtZW50KSB7XG4gICAgICByZXR1cm4gY2hpbGQubGVuZ3RoID09PSAxID8gc29mdGxpbmUkNiA6IGhhcmRsaW5lJDk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvZnRsaW5lJDY7XG4gIH1cblxuICBmdW5jdGlvbiBzZXBhcmF0b3JXaXRoV2hpdGVzcGFjZShpc0ZhY2Vib29rVHJhbnNsYXRpb25UYWcsIGNoaWxkLCBjaGlsZE5vZGUsIG5leHROb2RlKSB7XG4gICAgaWYgKGlzRmFjZWJvb2tUcmFuc2xhdGlvblRhZykge1xuICAgICAgcmV0dXJuIGhhcmRsaW5lJDk7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGNoaWxkTm9kZS50eXBlID09PSBcIkpTWEVsZW1lbnRcIiAmJiAhY2hpbGROb2RlLmNsb3NpbmdFbGVtZW50IHx8IG5leHROb2RlICYmIG5leHROb2RlLnR5cGUgPT09IFwiSlNYRWxlbWVudFwiICYmICFuZXh0Tm9kZS5jbG9zaW5nRWxlbWVudCA/IGhhcmRsaW5lJDkgOiBzb2Z0bGluZSQ2O1xuICAgIH1cblxuICAgIHJldHVybiBoYXJkbGluZSQ5O1xuICB9IC8vIEpTWCBDaGlsZHJlbiBhcmUgc3RyYW5nZSwgbW9zdGx5IGZvciB0d28gcmVhc29uczpcbiAgLy8gMS4gSlNYIHJlYWRzIG5ld2xpbmVzIGludG8gc3RyaW5nIHZhbHVlcywgaW5zdGVhZCBvZiBza2lwcGluZyB0aGVtIGxpa2UgSlNcbiAgLy8gMi4gdXAgdG8gb25lIHdoaXRlc3BhY2UgYmV0d2VlbiBlbGVtZW50cyB3aXRoaW4gYSBsaW5lIGlzIHNpZ25pZmljYW50LFxuICAvLyAgICBidXQgbm90IGJldHdlZW4gbGluZXMuXG4gIC8vXG4gIC8vIExlYWRpbmcsIHRyYWlsaW5nLCBhbmQgbG9uZSB3aGl0ZXNwYWNlIGFsbCBuZWVkIHRvXG4gIC8vIHR1cm4gdGhlbXNlbHZlcyBpbnRvIHRoZSByYXRoZXIgdWdseSBgeycgJ31gIHdoZW4gYnJlYWtpbmcuXG4gIC8vXG4gIC8vIFdlIHByaW50IEpTWCB1c2luZyB0aGUgYGZpbGxgIGRvYyBwcmltaXRpdmUuXG4gIC8vIFRoaXMgcmVxdWlyZXMgdGhhdCB3ZSBnaXZlIGl0IGFuIGFycmF5IG9mIGFsdGVybmF0aW5nXG4gIC8vIGNvbnRlbnQgYW5kIHdoaXRlc3BhY2UgZWxlbWVudHMuXG4gIC8vIFRvIGVuc3VyZSB0aGlzIHdlIGFkZCBkdW1teSBgXCJcImAgY29udGVudCBlbGVtZW50cyBhcyBuZWVkZWQuXG5cblxuICBmdW5jdGlvbiBwcmludEpTWENoaWxkcmVuKHBhdGgsIG9wdGlvbnMsIHByaW50LCBqc3hXaGl0ZXNwYWNlLCBpc0ZhY2Vib29rVHJhbnNsYXRpb25UYWcpIHtcbiAgICBjb25zdCBuID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gW107IC8vIHVzaW5nIGBtYXBgIGluc3RlYWQgb2YgYGVhY2hgIGJlY2F1c2UgaXQgcHJvdmlkZXMgYGlgXG5cbiAgICBwYXRoLm1hcCgoY2hpbGRQYXRoLCBpKSA9PiB7XG4gICAgICBjb25zdCBjaGlsZCA9IGNoaWxkUGF0aC5nZXRWYWx1ZSgpO1xuXG4gICAgICBpZiAoaXNMaXRlcmFsJDEoY2hpbGQpKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSByYXdUZXh0JDEoY2hpbGQpOyAvLyBDb250YWlucyBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlclxuXG4gICAgICAgIGlmIChpc01lYW5pbmdmdWxKU1hUZXh0JDEoY2hpbGQpKSB7XG4gICAgICAgICAgY29uc3Qgd29yZHMgPSB0ZXh0LnNwbGl0KG1hdGNoSnN4V2hpdGVzcGFjZVJlZ2V4JDEpOyAvLyBTdGFydHMgd2l0aCB3aGl0ZXNwYWNlXG5cbiAgICAgICAgICBpZiAod29yZHNbMF0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXCJcIik7XG4gICAgICAgICAgICB3b3Jkcy5zaGlmdCgpO1xuXG4gICAgICAgICAgICBpZiAoL1xcbi8udGVzdCh3b3Jkc1swXSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IG4uY2hpbGRyZW5baSArIDFdO1xuICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHNlcGFyYXRvcldpdGhXaGl0ZXNwYWNlKGlzRmFjZWJvb2tUcmFuc2xhdGlvblRhZywgd29yZHNbMV0sIGNoaWxkLCBuZXh0KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGpzeFdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3b3Jkcy5zaGlmdCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBlbmRXaGl0ZXNwYWNlOyAvLyBFbmRzIHdpdGggd2hpdGVzcGFjZVxuXG4gICAgICAgICAgaWYgKGdldExhc3QkMyh3b3JkcykgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdvcmRzLnBvcCgpO1xuICAgICAgICAgICAgZW5kV2hpdGVzcGFjZSA9IHdvcmRzLnBvcCgpO1xuICAgICAgICAgIH0gLy8gVGhpcyB3YXMgd2hpdGVzcGFjZSBvbmx5IHdpdGhvdXQgYSBuZXcgbGluZS5cblxuXG4gICAgICAgICAgaWYgKHdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHdvcmRzLmZvckVhY2goKHdvcmQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMSkge1xuICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGxpbmUkOSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHdvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGVuZFdoaXRlc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKC9cXG4vLnRlc3QoZW5kV2hpdGVzcGFjZSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IG4uY2hpbGRyZW5baSArIDFdO1xuICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHNlcGFyYXRvcldpdGhXaGl0ZXNwYWNlKGlzRmFjZWJvb2tUcmFuc2xhdGlvblRhZywgZ2V0TGFzdCQzKGNoaWxkcmVuKSwgY2hpbGQsIG5leHQpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goanN4V2hpdGVzcGFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuLmNoaWxkcmVuW2kgKyAxXTtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goc2VwYXJhdG9yTm9XaGl0ZXNwYWNlKGlzRmFjZWJvb2tUcmFuc2xhdGlvblRhZywgZ2V0TGFzdCQzKGNoaWxkcmVuKSwgY2hpbGQsIG5leHQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoL1xcbi8udGVzdCh0ZXh0KSkge1xuICAgICAgICAgIC8vIEtlZXAgKHVwIHRvIG9uZSkgYmxhbmsgbGluZSBiZXR3ZWVuIHRhZ3MvZXhwcmVzc2lvbnMvdGV4dC5cbiAgICAgICAgICAvLyBOb3RlOiBXZSBkb24ndCBrZWVwIGJsYW5rIGxpbmVzIGJldHdlZW4gdGV4dCBlbGVtZW50cy5cbiAgICAgICAgICBpZiAodGV4dC5tYXRjaCgvXFxuL2cpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXCJcIik7XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGhhcmRsaW5lJDkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGlsZHJlbi5wdXNoKFwiXCIpO1xuICAgICAgICAgIGNoaWxkcmVuLnB1c2goanN4V2hpdGVzcGFjZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByaW50ZWRDaGlsZCA9IHByaW50KGNoaWxkUGF0aCk7XG4gICAgICAgIGNoaWxkcmVuLnB1c2gocHJpbnRlZENoaWxkKTtcbiAgICAgICAgY29uc3QgbmV4dCA9IG4uY2hpbGRyZW5baSArIDFdO1xuICAgICAgICBjb25zdCBkaXJlY3RseUZvbGxvd2VkQnlNZWFuaW5nZnVsVGV4dCA9IG5leHQgJiYgaXNNZWFuaW5nZnVsSlNYVGV4dCQxKG5leHQpO1xuXG4gICAgICAgIGlmIChkaXJlY3RseUZvbGxvd2VkQnlNZWFuaW5nZnVsVGV4dCkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0V29yZCA9IHJhd1RleHQkMShuZXh0KS50cmltKCkuc3BsaXQobWF0Y2hKc3hXaGl0ZXNwYWNlUmVnZXgkMSlbMF07XG4gICAgICAgICAgY2hpbGRyZW4ucHVzaChzZXBhcmF0b3JOb1doaXRlc3BhY2UoaXNGYWNlYm9va1RyYW5zbGF0aW9uVGFnLCBmaXJzdFdvcmQsIGNoaWxkLCBuZXh0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hpbGRyZW4ucHVzaChoYXJkbGluZSQ5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFwiY2hpbGRyZW5cIik7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9IC8vIEpTWCBleHBhbmRzIGNoaWxkcmVuIGZyb20gdGhlIGluc2lkZS1vdXQsIGluc3RlYWQgb2YgdGhlIG91dHNpZGUtaW4uXG4gIC8vIFRoaXMgaXMgYm90aCB0byBicmVhayBjaGlsZHJlbiBiZWZvcmUgYXR0cmlidXRlcyxcbiAgLy8gYW5kIHRvIGVuc3VyZSB0aGF0IHdoZW4gY2hpbGRyZW4gYnJlYWssIHRoZWlyIHBhcmVudHMgZG8gYXMgd2VsbC5cbiAgLy9cbiAgLy8gQW55IGVsZW1lbnQgdGhhdCBpcyB3cml0dGVuIHdpdGhvdXQgYW55IG5ld2xpbmVzIGFuZCBmaXRzIG9uIGEgc2luZ2xlIGxpbmVcbiAgLy8gaXMgbGVmdCB0aGF0IHdheS5cbiAgLy8gTm90IG9ubHkgdGhhdCwgYW55IHVzZXItd3JpdHRlbi1saW5lIGNvbnRhaW5pbmcgbXVsdGlwbGUgSlNYIHNpYmxpbmdzXG4gIC8vIHNob3VsZCBhbHNvIGJlIGtlcHQgb24gb25lIGxpbmUgaWYgcG9zc2libGUsXG4gIC8vIHNvIGVhY2ggdXNlci13cml0dGVuLWxpbmUgaXMgd3JhcHBlZCBpbiBpdHMgb3duIGdyb3VwLlxuICAvL1xuICAvLyBFbGVtZW50cyB0aGF0IGNvbnRhaW4gbmV3bGluZXMgb3IgZG9uJ3QgZml0IG9uIGEgc2luZ2xlIGxpbmUgKHJlY3Vyc2l2ZWx5KVxuICAvLyBhcmUgZnVsbHktc3BsaXQsIHVzaW5nIGhhcmRsaW5lIGFuZCBzaG91bGRCcmVhazogdHJ1ZS5cbiAgLy9cbiAgLy8gVG8gc3VwcG9ydCB0aGF0IGNhc2UgcHJvcGVybHksIGFsbCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXNcbiAgLy8gYXJlIHN0cmlwcGVkIGZyb20gdGhlIGxpc3Qgb2YgY2hpbGRyZW4sIGFuZCByZXBsYWNlZCB3aXRoIGEgc2luZ2xlIGhhcmRsaW5lLlxuXG5cbiAgZnVuY3Rpb24gcHJpbnRKU1hFbGVtZW50KHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3QgbiA9IHBhdGguZ2V0VmFsdWUoKTtcblxuICAgIGlmIChuLnR5cGUgPT09IFwiSlNYRWxlbWVudFwiICYmIGlzRW1wdHlKU1hFbGVtZW50JDEobikpIHtcbiAgICAgIHJldHVybiBjb25jYXQkZChbcGF0aC5jYWxsKHByaW50LCBcIm9wZW5pbmdFbGVtZW50XCIpLCBwYXRoLmNhbGwocHJpbnQsIFwiY2xvc2luZ0VsZW1lbnRcIildKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVuaW5nTGluZXMgPSBuLnR5cGUgPT09IFwiSlNYRWxlbWVudFwiID8gcGF0aC5jYWxsKHByaW50LCBcIm9wZW5pbmdFbGVtZW50XCIpIDogcGF0aC5jYWxsKHByaW50LCBcIm9wZW5pbmdGcmFnbWVudFwiKTtcbiAgICBjb25zdCBjbG9zaW5nTGluZXMgPSBuLnR5cGUgPT09IFwiSlNYRWxlbWVudFwiID8gcGF0aC5jYWxsKHByaW50LCBcImNsb3NpbmdFbGVtZW50XCIpIDogcGF0aC5jYWxsKHByaW50LCBcImNsb3NpbmdGcmFnbWVudFwiKTtcblxuICAgIGlmIChuLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBuLmNoaWxkcmVuWzBdLnR5cGUgPT09IFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiICYmIChuLmNoaWxkcmVuWzBdLmV4cHJlc3Npb24udHlwZSA9PT0gXCJUZW1wbGF0ZUxpdGVyYWxcIiB8fCBuLmNoaWxkcmVuWzBdLmV4cHJlc3Npb24udHlwZSA9PT0gXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIikpIHtcbiAgICAgIHJldHVybiBjb25jYXQkZChbb3BlbmluZ0xpbmVzLCBjb25jYXQkZChwYXRoLm1hcChwcmludCwgXCJjaGlsZHJlblwiKSksIGNsb3NpbmdMaW5lc10pO1xuICAgIH0gLy8gQ29udmVydCBge1wiIFwifWAgdG8gdGV4dCBub2RlcyBjb250YWluaW5nIGEgc3BhY2UuXG4gICAgLy8gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHR1cm4gdGhlbSBpbnRvIGBqc3hXaGl0ZXNwYWNlYCB3aGljaFxuICAgIC8vIGNhbiB0aGVuIHByaW50IGFzIGVpdGhlciBhIHNwYWNlIG9yIGB7XCIgXCJ9YCB3aGVuIGJyZWFraW5nLlxuXG5cbiAgICBuLmNoaWxkcmVuID0gbi5jaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgICAgaWYgKGlzSlNYV2hpdGVzcGFjZUV4cHJlc3Npb24kMShjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcIkpTWFRleHRcIixcbiAgICAgICAgICB2YWx1ZTogXCIgXCIsXG4gICAgICAgICAgcmF3OiBcIiBcIlxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfSk7XG4gICAgY29uc3QgY29udGFpbnNUYWcgPSBuLmNoaWxkcmVuLmZpbHRlcihpc0pTWE5vZGUkMSkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBjb250YWluc011bHRpcGxlRXhwcmVzc2lvbnMgPSBuLmNoaWxkcmVuLmZpbHRlcihjaGlsZCA9PiBjaGlsZC50eXBlID09PSBcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIikubGVuZ3RoID4gMTtcbiAgICBjb25zdCBjb250YWluc011bHRpcGxlQXR0cmlidXRlcyA9IG4udHlwZSA9PT0gXCJKU1hFbGVtZW50XCIgJiYgbi5vcGVuaW5nRWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aCA+IDE7IC8vIFJlY29yZCBhbnkgYnJlYWtzLiBTaG91bGQgbmV2ZXIgZ28gZnJvbSB0cnVlIHRvIGZhbHNlLCBvbmx5IGZhbHNlIHRvIHRydWUuXG5cbiAgICBsZXQgZm9yY2VkQnJlYWsgPSB3aWxsQnJlYWskMShvcGVuaW5nTGluZXMpIHx8IGNvbnRhaW5zVGFnIHx8IGNvbnRhaW5zTXVsdGlwbGVBdHRyaWJ1dGVzIHx8IGNvbnRhaW5zTXVsdGlwbGVFeHByZXNzaW9ucztcbiAgICBjb25zdCBpc01keEJsb2NrID0gcGF0aC5nZXRQYXJlbnROb2RlKCkucm9vdE1hcmtlciA9PT0gXCJtZHhcIjtcbiAgICBjb25zdCByYXdKc3hXaGl0ZXNwYWNlID0gb3B0aW9ucy5zaW5nbGVRdW90ZSA/IFwieycgJ31cIiA6ICd7XCIgXCJ9JztcbiAgICBjb25zdCBqc3hXaGl0ZXNwYWNlID0gaXNNZHhCbG9jayA/IGNvbmNhdCRkKFtcIiBcIl0pIDogaWZCcmVhayQ2KGNvbmNhdCRkKFtyYXdKc3hXaGl0ZXNwYWNlLCBzb2Z0bGluZSQ2XSksIFwiIFwiKTtcbiAgICBjb25zdCBpc0ZhY2Vib29rVHJhbnNsYXRpb25UYWcgPSBuLm9wZW5pbmdFbGVtZW50ICYmIG4ub3BlbmluZ0VsZW1lbnQubmFtZSAmJiBuLm9wZW5pbmdFbGVtZW50Lm5hbWUubmFtZSA9PT0gXCJmYnRcIjtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHByaW50SlNYQ2hpbGRyZW4ocGF0aCwgb3B0aW9ucywgcHJpbnQsIGpzeFdoaXRlc3BhY2UsIGlzRmFjZWJvb2tUcmFuc2xhdGlvblRhZyk7XG4gICAgY29uc3QgY29udGFpbnNUZXh0ID0gbi5jaGlsZHJlbi5zb21lKGNoaWxkID0+IGlzTWVhbmluZ2Z1bEpTWFRleHQkMShjaGlsZCkpOyAvLyBXZSBjYW4gZW5kIHVwIHdlIG11bHRpcGxlIHdoaXRlc3BhY2UgZWxlbWVudHMgd2l0aCBlbXB0eSBzdHJpbmdcbiAgICAvLyBjb250ZW50IGJldHdlZW4gdGhlbS5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbW92ZSBlbXB0eSB3aGl0ZXNwYWNlIGFuZCBzb2Z0bGluZXMgYmVmb3JlIEpTWCB3aGl0ZXNwYWNlXG4gICAgLy8gdG8gZ2V0IHRoZSBjb3JyZWN0IG91dHB1dC5cblxuICAgIGZvciAobGV0IGkgPSBjaGlsZHJlbi5sZW5ndGggLSAyOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgaXNQYWlyT2ZFbXB0eVN0cmluZ3MgPSBjaGlsZHJlbltpXSA9PT0gXCJcIiAmJiBjaGlsZHJlbltpICsgMV0gPT09IFwiXCI7XG4gICAgICBjb25zdCBpc1BhaXJPZkhhcmRsaW5lcyA9IGNoaWxkcmVuW2ldID09PSBoYXJkbGluZSQ5ICYmIGNoaWxkcmVuW2kgKyAxXSA9PT0gXCJcIiAmJiBjaGlsZHJlbltpICsgMl0gPT09IGhhcmRsaW5lJDk7XG4gICAgICBjb25zdCBpc0xpbmVGb2xsb3dlZEJ5SlNYV2hpdGVzcGFjZSA9IChjaGlsZHJlbltpXSA9PT0gc29mdGxpbmUkNiB8fCBjaGlsZHJlbltpXSA9PT0gaGFyZGxpbmUkOSkgJiYgY2hpbGRyZW5baSArIDFdID09PSBcIlwiICYmIGNoaWxkcmVuW2kgKyAyXSA9PT0ganN4V2hpdGVzcGFjZTtcbiAgICAgIGNvbnN0IGlzSlNYV2hpdGVzcGFjZUZvbGxvd2VkQnlMaW5lID0gY2hpbGRyZW5baV0gPT09IGpzeFdoaXRlc3BhY2UgJiYgY2hpbGRyZW5baSArIDFdID09PSBcIlwiICYmIChjaGlsZHJlbltpICsgMl0gPT09IHNvZnRsaW5lJDYgfHwgY2hpbGRyZW5baSArIDJdID09PSBoYXJkbGluZSQ5KTtcbiAgICAgIGNvbnN0IGlzRG91YmxlSlNYV2hpdGVzcGFjZSA9IGNoaWxkcmVuW2ldID09PSBqc3hXaGl0ZXNwYWNlICYmIGNoaWxkcmVuW2kgKyAxXSA9PT0gXCJcIiAmJiBjaGlsZHJlbltpICsgMl0gPT09IGpzeFdoaXRlc3BhY2U7XG4gICAgICBjb25zdCBpc1BhaXJPZkhhcmRPclNvZnRMaW5lcyA9IGNoaWxkcmVuW2ldID09PSBzb2Z0bGluZSQ2ICYmIGNoaWxkcmVuW2kgKyAxXSA9PT0gXCJcIiAmJiBjaGlsZHJlbltpICsgMl0gPT09IGhhcmRsaW5lJDkgfHwgY2hpbGRyZW5baV0gPT09IGhhcmRsaW5lJDkgJiYgY2hpbGRyZW5baSArIDFdID09PSBcIlwiICYmIGNoaWxkcmVuW2kgKyAyXSA9PT0gc29mdGxpbmUkNjtcblxuICAgICAgaWYgKGlzUGFpck9mSGFyZGxpbmVzICYmIGNvbnRhaW5zVGV4dCB8fCBpc1BhaXJPZkVtcHR5U3RyaW5ncyB8fCBpc0xpbmVGb2xsb3dlZEJ5SlNYV2hpdGVzcGFjZSB8fCBpc0RvdWJsZUpTWFdoaXRlc3BhY2UgfHwgaXNQYWlyT2ZIYXJkT3JTb2Z0TGluZXMpIHtcbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDIpO1xuICAgICAgfSBlbHNlIGlmIChpc0pTWFdoaXRlc3BhY2VGb2xsb3dlZEJ5TGluZSkge1xuICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSArIDEsIDIpO1xuICAgICAgfVxuICAgIH0gLy8gVHJpbSB0cmFpbGluZyBsaW5lcyAob3IgZW1wdHkgc3RyaW5ncylcblxuXG4gICAgd2hpbGUgKGNoaWxkcmVuLmxlbmd0aCAmJiAoaXNMaW5lTmV4dCQxKGdldExhc3QkMyhjaGlsZHJlbikpIHx8IGlzRW1wdHkkMShnZXRMYXN0JDMoY2hpbGRyZW4pKSkpIHtcbiAgICAgIGNoaWxkcmVuLnBvcCgpO1xuICAgIH0gLy8gVHJpbSBsZWFkaW5nIGxpbmVzIChvciBlbXB0eSBzdHJpbmdzKVxuXG5cbiAgICB3aGlsZSAoY2hpbGRyZW4ubGVuZ3RoICYmIChpc0xpbmVOZXh0JDEoY2hpbGRyZW5bMF0pIHx8IGlzRW1wdHkkMShjaGlsZHJlblswXSkpICYmIChpc0xpbmVOZXh0JDEoY2hpbGRyZW5bMV0pIHx8IGlzRW1wdHkkMShjaGlsZHJlblsxXSkpKSB7XG4gICAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICB9IC8vIFR3ZWFrIGhvdyB3ZSBmb3JtYXQgY2hpbGRyZW4gaWYgb3V0cHV0dGluZyB0aGlzIGVsZW1lbnQgb3ZlciBtdWx0aXBsZSBsaW5lcy5cbiAgICAvLyBBbHNvIGRldGVjdCB3aGV0aGVyIHdlIHdpbGwgZm9yY2UgdGhpcyBlbGVtZW50IHRvIG91dHB1dCBvdmVyIG11bHRpcGxlIGxpbmVzLlxuXG5cbiAgICBjb25zdCBtdWx0aWxpbmVDaGlsZHJlbiA9IFtdO1xuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpKSA9PiB7XG4gICAgICAvLyBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygc2l0dWF0aW9ucyB3aGVyZSB3ZSBuZWVkIHRvIGVuc3VyZSB3ZSBkaXNwbGF5XG4gICAgICAvLyB3aGl0ZXNwYWNlIGFzIGB7XCIgXCJ9YCB3aGVuIG91dHB1dHRpbmcgdGhpcyBlbGVtZW50IG92ZXIgbXVsdGlwbGUgbGluZXMuXG4gICAgICBpZiAoY2hpbGQgPT09IGpzeFdoaXRlc3BhY2UpIHtcbiAgICAgICAgaWYgKGkgPT09IDEgJiYgY2hpbGRyZW5baSAtIDFdID09PSBcIlwiKSB7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgLy8gU29saXRhcnkgd2hpdGVzcGFjZVxuICAgICAgICAgICAgbXVsdGlsaW5lQ2hpbGRyZW4ucHVzaChyYXdKc3hXaGl0ZXNwYWNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IC8vIExlYWRpbmcgd2hpdGVzcGFjZVxuXG5cbiAgICAgICAgICBtdWx0aWxpbmVDaGlsZHJlbi5wdXNoKGNvbmNhdCRkKFtyYXdKc3hXaGl0ZXNwYWNlLCBoYXJkbGluZSQ5XSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChpID09PSBjaGlsZHJlbi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgLy8gVHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgIG11bHRpbGluZUNoaWxkcmVuLnB1c2gocmF3SnN4V2hpdGVzcGFjZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuW2kgLSAxXSA9PT0gXCJcIiAmJiBjaGlsZHJlbltpIC0gMl0gPT09IGhhcmRsaW5lJDkpIHtcbiAgICAgICAgICAvLyBXaGl0ZXNwYWNlIGFmdGVyIGxpbmUgYnJlYWtcbiAgICAgICAgICBtdWx0aWxpbmVDaGlsZHJlbi5wdXNoKHJhd0pzeFdoaXRlc3BhY2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtdWx0aWxpbmVDaGlsZHJlbi5wdXNoKGNoaWxkKTtcblxuICAgICAgaWYgKHdpbGxCcmVhayQxKGNoaWxkKSkge1xuICAgICAgICBmb3JjZWRCcmVhayA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7IC8vIElmIHRoZXJlIGlzIHRleHQgd2UgdXNlIGBmaWxsYCB0byBmaXQgYXMgbXVjaCBvbnRvIGVhY2ggbGluZSBhcyBwb3NzaWJsZS5cbiAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIHRleHQgKGp1c3QgdGFncyBhbmQgZXhwcmVzc2lvbnMpIHdlIHVzZSBgZ3JvdXBgXG4gICAgLy8gdG8gb3V0cHV0IGVhY2ggb24gYSBzZXBhcmF0ZSBsaW5lLlxuXG4gICAgY29uc3QgY29udGVudCA9IGNvbnRhaW5zVGV4dCA/IGZpbGwkNChtdWx0aWxpbmVDaGlsZHJlbikgOiBncm91cCRiKGNvbmNhdCRkKG11bHRpbGluZUNoaWxkcmVuKSwge1xuICAgICAgc2hvdWxkQnJlYWs6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChpc01keEJsb2NrKSB7XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG5cbiAgICBjb25zdCBtdWx0aUxpbmVFbGVtID0gZ3JvdXAkYihjb25jYXQkZChbb3BlbmluZ0xpbmVzLCBpbmRlbnQkNyhjb25jYXQkZChbaGFyZGxpbmUkOSwgY29udGVudF0pKSwgaGFyZGxpbmUkOSwgY2xvc2luZ0xpbmVzXSkpO1xuXG4gICAgaWYgKGZvcmNlZEJyZWFrKSB7XG4gICAgICByZXR1cm4gbXVsdGlMaW5lRWxlbTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZGl0aW9uYWxHcm91cCQxKFtncm91cCRiKGNvbmNhdCRkKFtvcGVuaW5nTGluZXMsIGNvbmNhdCRkKGNoaWxkcmVuKSwgY2xvc2luZ0xpbmVzXSkpLCBtdWx0aUxpbmVFbGVtXSk7XG4gIH1cblxuICBmdW5jdGlvbiBtYXliZVdyYXBKU1hFbGVtZW50SW5QYXJlbnMocGF0aCwgZWxlbSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cblxuICAgIGNvbnN0IE5PX1dSQVBfUEFSRU5UUyA9IHtcbiAgICAgIEFycmF5RXhwcmVzc2lvbjogdHJ1ZSxcbiAgICAgIEpTWEF0dHJpYnV0ZTogdHJ1ZSxcbiAgICAgIEpTWEVsZW1lbnQ6IHRydWUsXG4gICAgICBKU1hFeHByZXNzaW9uQ29udGFpbmVyOiB0cnVlLFxuICAgICAgSlNYRnJhZ21lbnQ6IHRydWUsXG4gICAgICBFeHByZXNzaW9uU3RhdGVtZW50OiB0cnVlLFxuICAgICAgQ2FsbEV4cHJlc3Npb246IHRydWUsXG4gICAgICBPcHRpb25hbENhbGxFeHByZXNzaW9uOiB0cnVlLFxuICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiB0cnVlLFxuICAgICAgSnNFeHByZXNzaW9uUm9vdDogdHJ1ZVxuICAgIH07XG5cbiAgICBpZiAoTk9fV1JBUF9QQVJFTlRTW3BhcmVudC50eXBlXSkge1xuICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkQnJlYWsgPSBwYXRoLm1hdGNoKHVuZGVmaW5lZCwgbm9kZSA9PiBub2RlLnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiwgaXNDYWxsT3JPcHRpb25hbENhbGxFeHByZXNzaW9uJDEsIG5vZGUgPT4gbm9kZS50eXBlID09PSBcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIik7XG4gICAgY29uc3QgbmVlZHNQYXJlbnMgPSBuZWVkc1BhcmVuc18xKHBhdGgsIG9wdGlvbnMpO1xuICAgIHJldHVybiBncm91cCRiKGNvbmNhdCRkKFtuZWVkc1BhcmVucyA/IFwiXCIgOiBpZkJyZWFrJDYoXCIoXCIpLCBpbmRlbnQkNyhjb25jYXQkZChbc29mdGxpbmUkNiwgZWxlbV0pKSwgc29mdGxpbmUkNiwgbmVlZHNQYXJlbnMgPyBcIlwiIDogaWZCcmVhayQ2KFwiKVwiKV0pLCB7XG4gICAgICBzaG91bGRCcmVha1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW5saW5lTG9naWNhbEV4cHJlc3Npb24obm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgIT09IFwiTG9naWNhbEV4cHJlc3Npb25cIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnJpZ2h0LnR5cGUgPT09IFwiT2JqZWN0RXhwcmVzc2lvblwiICYmIG5vZGUucmlnaHQucHJvcGVydGllcy5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnJpZ2h0LnR5cGUgPT09IFwiQXJyYXlFeHByZXNzaW9uXCIgJiYgbm9kZS5yaWdodC5lbGVtZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0pTWE5vZGUkMShub2RlLnJpZ2h0KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIEZvciBiaW5hcnkgZXhwcmVzc2lvbnMgdG8gYmUgY29uc2lzdGVudCwgd2UgbmVlZCB0byBncm91cFxuICAvLyBzdWJzZXF1ZW50IG9wZXJhdG9ycyB3aXRoIHRoZSBzYW1lIHByZWNlZGVuY2UgbGV2ZWwgdW5kZXIgYSBzaW5nbGVcbiAgLy8gZ3JvdXAuIE90aGVyd2lzZSB0aGV5IHdpbGwgYmUgbmVzdGVkIHN1Y2ggdGhhdCBzb21lIG9mIHRoZW0gYnJlYWtcbiAgLy8gb250byBuZXcgbGluZXMgYnV0IG5vdCBhbGwuIE9wZXJhdG9ycyB3aXRoIHRoZSBzYW1lIHByZWNlZGVuY2VcbiAgLy8gbGV2ZWwgc2hvdWxkIGVpdGhlciBhbGwgYnJlYWsgb3Igbm90LiBCZWNhdXNlIHdlIGdyb3VwIHRoZW0gYnlcbiAgLy8gcHJlY2VkZW5jZSBsZXZlbCBhbmQgdGhlIEFTVCBpcyBzdHJ1Y3R1cmVkIGJhc2VkIG9uIHByZWNlZGVuY2VcbiAgLy8gbGV2ZWwsIHRoaW5ncyBhcmUgbmF0dXJhbGx5IGJyb2tlbiB1cCBjb3JyZWN0bHksIGkuZS4gYCYmYCBpc1xuICAvLyBicm9rZW4gYmVmb3JlIGArYC5cblxuXG4gIGZ1bmN0aW9uIHByaW50QmluYXJ5aXNoRXhwcmVzc2lvbnMocGF0aCwgcHJpbnQsIG9wdGlvbnMsIGlzTmVzdGVkLCBpc0luc2lkZVBhcmVudGhlc2lzKSB7XG4gICAgbGV0IHBhcnRzID0gW107XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTsgLy8gV2UgdHJlYXQgQmluYXJ5RXhwcmVzc2lvbiBhbmQgTG9naWNhbEV4cHJlc3Npb24gbm9kZXMgdGhlIHNhbWUuXG5cbiAgICBpZiAoaXNCaW5hcnlpc2gkMShub2RlKSkge1xuICAgICAgLy8gUHV0IGFsbCBvcGVyYXRvcnMgd2l0aCB0aGUgc2FtZSBwcmVjZWRlbmNlIGxldmVsIGluIHRoZSBzYW1lXG4gICAgICAvLyBncm91cC4gVGhlIHJlYXNvbiB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyB3aXRoIHRoZSBgbGVmdGBcbiAgICAgIC8vIGV4cHJlc3Npb24gaXMgYmVjYXVzZSBnaXZlbiBhbiBleHByZXNzaW9uIGxpa2UgYDEgKyAyIC0gM2AsIGl0XG4gICAgICAvLyBpcyBhbHdheXMgcGFyc2VkIGxpa2UgYCgoMSArIDIpIC0gMylgLCBtZWFuaW5nIHRoZSBgbGVmdGAgc2lkZVxuICAgICAgLy8gaXMgd2hlcmUgdGhlIHJlc3Qgb2YgdGhlIGV4cHJlc3Npb24gd2lsbCBleGlzdC4gQmluYXJ5XG4gICAgICAvLyBleHByZXNzaW9ucyBvbiB0aGUgcmlnaHQgc2lkZSBtZWFuIHRoZXkgaGF2ZSBhIGRpZmZlcmVuY2VcbiAgICAgIC8vIHByZWNlZGVuY2UgbGV2ZWwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc2VwYXJhdGUgZ3JvdXAsIHNvXG4gICAgICAvLyBwcmludCB0aGVtIG5vcm1hbGx5LiAoVGhpcyBkb2Vzbid0IGhvbGQgZm9yIHRoZSBgKipgIG9wZXJhdG9yLFxuICAgICAgLy8gd2hpY2ggaXMgdW5pcXVlIGluIHRoYXQgaXQgaXMgcmlnaHQtYXNzb2NpYXRpdmUuKVxuICAgICAgaWYgKHNob3VsZEZsYXR0ZW4kMShub2RlLm9wZXJhdG9yLCBub2RlLmxlZnQub3BlcmF0b3IpKSB7XG4gICAgICAgIC8vIEZsYXR0ZW4gdGhlbSBvdXQgYnkgcmVjdXJzaXZlbHkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChwYXRoLmNhbGwobGVmdCA9PiBwcmludEJpbmFyeWlzaEV4cHJlc3Npb25zKGxlZnQsIHByaW50LCBvcHRpb25zLFxuICAgICAgICAvKiBpc05lc3RlZCAqL1xuICAgICAgICB0cnVlLCBpc0luc2lkZVBhcmVudGhlc2lzKSwgXCJsZWZ0XCIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnB1c2gocGF0aC5jYWxsKHByaW50LCBcImxlZnRcIikpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaG91bGRJbmxpbmUgPSBzaG91bGRJbmxpbmVMb2dpY2FsRXhwcmVzc2lvbihub2RlKTtcbiAgICAgIGNvbnN0IGxpbmVCZWZvcmVPcGVyYXRvciA9IChub2RlLm9wZXJhdG9yID09PSBcInw+XCIgfHwgbm9kZS50eXBlID09PSBcIk5HUGlwZUV4cHJlc3Npb25cIiB8fCBub2RlLm9wZXJhdG9yID09PSBcInxcIiAmJiBvcHRpb25zLnBhcnNlciA9PT0gXCJfX3Z1ZV9leHByZXNzaW9uXCIpICYmICFoYXNMZWFkaW5nT3duTGluZUNvbW1lbnQkMShvcHRpb25zLm9yaWdpbmFsVGV4dCwgbm9kZS5yaWdodCwgb3B0aW9ucyk7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IG5vZGUudHlwZSA9PT0gXCJOR1BpcGVFeHByZXNzaW9uXCIgPyBcInxcIiA6IG5vZGUub3BlcmF0b3I7XG4gICAgICBjb25zdCByaWdodFN1ZmZpeCA9IG5vZGUudHlwZSA9PT0gXCJOR1BpcGVFeHByZXNzaW9uXCIgJiYgbm9kZS5hcmd1bWVudHMubGVuZ3RoICE9PSAwID8gZ3JvdXAkYihpbmRlbnQkNyhjb25jYXQkZChbc29mdGxpbmUkNiwgXCI6IFwiLCBqb2luJDkoY29uY2F0JGQoW3NvZnRsaW5lJDYsIFwiOlwiLCBpZkJyZWFrJDYoXCIgXCIpXSksIHBhdGgubWFwKHByaW50LCBcImFyZ3VtZW50c1wiKS5tYXAoYXJnID0+IGFsaWduJDEoMiwgZ3JvdXAkYihhcmcpKSkpXSkpKSA6IFwiXCI7XG4gICAgICBjb25zdCByaWdodCA9IHNob3VsZElubGluZSA/IGNvbmNhdCRkKFtvcGVyYXRvciwgXCIgXCIsIHBhdGguY2FsbChwcmludCwgXCJyaWdodFwiKSwgcmlnaHRTdWZmaXhdKSA6IGNvbmNhdCRkKFtsaW5lQmVmb3JlT3BlcmF0b3IgPyBzb2Z0bGluZSQ2IDogXCJcIiwgb3BlcmF0b3IsIGxpbmVCZWZvcmVPcGVyYXRvciA/IFwiIFwiIDogbGluZSQ5LCBwYXRoLmNhbGwocHJpbnQsIFwicmlnaHRcIiksIHJpZ2h0U3VmZml4XSk7IC8vIElmIHRoZXJlJ3Mgb25seSBhIHNpbmdsZSBiaW5hcnkgZXhwcmVzc2lvbiwgd2Ugd2FudCB0byBjcmVhdGUgYSBncm91cFxuICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgaGF2aW5nIGEgc21hbGwgcmlnaHQgcGFydCBsaWtlIC0xIGJlIG9uIGl0cyBvd24gbGluZS5cblxuICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgICBjb25zdCBzaG91bGRHcm91cCA9ICEoaXNJbnNpZGVQYXJlbnRoZXNpcyAmJiBub2RlLnR5cGUgPT09IFwiTG9naWNhbEV4cHJlc3Npb25cIikgJiYgcGFyZW50LnR5cGUgIT09IG5vZGUudHlwZSAmJiBub2RlLmxlZnQudHlwZSAhPT0gbm9kZS50eXBlICYmIG5vZGUucmlnaHQudHlwZSAhPT0gbm9kZS50eXBlO1xuICAgICAgcGFydHMucHVzaChcIiBcIiwgc2hvdWxkR3JvdXAgPyBncm91cCRiKHJpZ2h0KSA6IHJpZ2h0KTsgLy8gVGhlIHJvb3QgY29tbWVudHMgYXJlIGFscmVhZHkgcHJpbnRlZCwgYnV0IHdlIG5lZWQgdG8gbWFudWFsbHkgcHJpbnRcbiAgICAgIC8vIHRoZSBvdGhlciBvbmVzIHNpbmNlIHdlIGRvbid0IGNhbGwgdGhlIG5vcm1hbCBwcmludCBvbiBCaW5hcnlFeHByZXNzaW9uLFxuICAgICAgLy8gb25seSBmb3IgdGhlIGxlZnQgYW5kIHJpZ2h0IHBhcnRzXG5cbiAgICAgIGlmIChpc05lc3RlZCAmJiBub2RlLmNvbW1lbnRzKSB7XG4gICAgICAgIHBhcnRzID0gY29tbWVudHMucHJpbnRDb21tZW50cyhwYXRoLCAoKSA9PiBjb25jYXQkZChwYXJ0cyksIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdXIgc3RvcHBpbmcgY2FzZS4gU2ltcGx5IHByaW50IHRoZSBub2RlIG5vcm1hbGx5LlxuICAgICAgcGFydHMucHVzaChwYXRoLmNhbGwocHJpbnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHM7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludEFzc2lnbm1lbnRSaWdodChsZWZ0Tm9kZSwgcmlnaHROb2RlLCBwcmludGVkUmlnaHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoaGFzTGVhZGluZ093bkxpbmVDb21tZW50JDEob3B0aW9ucy5vcmlnaW5hbFRleHQsIHJpZ2h0Tm9kZSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBpbmRlbnQkNyhjb25jYXQkZChbbGluZSQ5LCBwcmludGVkUmlnaHRdKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FuQnJlYWsgPSBpc0JpbmFyeWlzaCQxKHJpZ2h0Tm9kZSkgJiYgIXNob3VsZElubGluZUxvZ2ljYWxFeHByZXNzaW9uKHJpZ2h0Tm9kZSkgfHwgcmlnaHROb2RlLnR5cGUgPT09IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIgJiYgaXNCaW5hcnlpc2gkMShyaWdodE5vZGUudGVzdCkgJiYgIXNob3VsZElubGluZUxvZ2ljYWxFeHByZXNzaW9uKHJpZ2h0Tm9kZS50ZXN0KSB8fCByaWdodE5vZGUudHlwZSA9PT0gXCJTdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb25cIiB8fCByaWdodE5vZGUudHlwZSA9PT0gXCJDbGFzc0V4cHJlc3Npb25cIiAmJiByaWdodE5vZGUuZGVjb3JhdG9ycyAmJiByaWdodE5vZGUuZGVjb3JhdG9ycy5sZW5ndGggfHwgKGxlZnROb2RlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiIHx8IGlzU3RyaW5nTGl0ZXJhbCQxKGxlZnROb2RlKSB8fCBsZWZ0Tm9kZS50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIikgJiYgKGlzU3RyaW5nTGl0ZXJhbCQxKHJpZ2h0Tm9kZSkgfHwgaXNNZW1iZXJFeHByZXNzaW9uQ2hhaW4kMShyaWdodE5vZGUpKSAmJiAvLyBkbyBub3QgcHV0IHZhbHVlcyBvbiBhIHNlcGFyYXRlIGxpbmUgZnJvbSB0aGUga2V5IGluIGpzb25cbiAgICBvcHRpb25zLnBhcnNlciAhPT0gXCJqc29uXCIgJiYgb3B0aW9ucy5wYXJzZXIgIT09IFwianNvbjVcIiB8fCByaWdodE5vZGUudHlwZSA9PT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIjtcblxuICAgIGlmIChjYW5CcmVhaykge1xuICAgICAgcmV0dXJuIGdyb3VwJGIoaW5kZW50JDcoY29uY2F0JGQoW2xpbmUkOSwgcHJpbnRlZFJpZ2h0XSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uY2F0JGQoW1wiIFwiLCBwcmludGVkUmlnaHRdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50QXNzaWdubWVudChsZWZ0Tm9kZSwgcHJpbnRlZExlZnQsIG9wZXJhdG9yLCByaWdodE5vZGUsIHByaW50ZWRSaWdodCwgb3B0aW9ucykge1xuICAgIGlmICghcmlnaHROb2RlKSB7XG4gICAgICByZXR1cm4gcHJpbnRlZExlZnQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJpbnRlZCA9IHByaW50QXNzaWdubWVudFJpZ2h0KGxlZnROb2RlLCByaWdodE5vZGUsIHByaW50ZWRSaWdodCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGdyb3VwJGIoY29uY2F0JGQoW3ByaW50ZWRMZWZ0LCBvcGVyYXRvciwgcHJpbnRlZF0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkanVzdENsYXVzZShub2RlLCBjbGF1c2UsIGZvcmNlU3BhY2UpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSBcIkVtcHR5U3RhdGVtZW50XCIpIHtcbiAgICAgIHJldHVybiBcIjtcIjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcIkJsb2NrU3RhdGVtZW50XCIgfHwgZm9yY2VTcGFjZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCRkKFtcIiBcIiwgY2xhdXNlXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGVudCQ3KGNvbmNhdCRkKFtsaW5lJDksIGNsYXVzZV0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vZGVTdHIobm9kZSwgb3B0aW9ucywgaXNGbG93T3JUeXBlU2NyaXB0RGlyZWN0aXZlTGl0ZXJhbCkge1xuICAgIGNvbnN0IHJhdyA9IHJhd1RleHQkMShub2RlKTtcbiAgICBjb25zdCBpc0RpcmVjdGl2ZUxpdGVyYWwgPSBpc0Zsb3dPclR5cGVTY3JpcHREaXJlY3RpdmVMaXRlcmFsIHx8IG5vZGUudHlwZSA9PT0gXCJEaXJlY3RpdmVMaXRlcmFsXCI7XG4gICAgcmV0dXJuIHByaW50U3RyaW5nJDIocmF3LCBvcHRpb25zLCBpc0RpcmVjdGl2ZUxpdGVyYWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRSZWdleChub2RlKSB7XG4gICAgY29uc3QgZmxhZ3MgPSBub2RlLmZsYWdzLnNwbGl0KFwiXCIpLnNvcnQoKS5qb2luKFwiXCIpO1xuICAgIHJldHVybiBcIi9cIi5jb25jYXQobm9kZS5wYXR0ZXJuLCBcIi9cIikuY29uY2F0KGZsYWdzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4cHJOZWVkc0FTSVByb3RlY3Rpb24ocGF0aCwgb3B0aW9ucykge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgbWF5YmVBU0lQcm9ibGVtID0gbmVlZHNQYXJlbnNfMShwYXRoLCBvcHRpb25zKSB8fCBub2RlLnR5cGUgPT09IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIiB8fCBub2RlLnR5cGUgPT09IFwiVHlwZUNhc3RFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgJiYgIXNob3VsZFByaW50UGFyYW1zV2l0aG91dFBhcmVucyhwYXRoLCBvcHRpb25zKSB8fCBub2RlLnR5cGUgPT09IFwiQXJyYXlFeHByZXNzaW9uXCIgfHwgbm9kZS50eXBlID09PSBcIkFycmF5UGF0dGVyblwiIHx8IG5vZGUudHlwZSA9PT0gXCJVbmFyeUV4cHJlc3Npb25cIiAmJiBub2RlLnByZWZpeCAmJiAobm9kZS5vcGVyYXRvciA9PT0gXCIrXCIgfHwgbm9kZS5vcGVyYXRvciA9PT0gXCItXCIpIHx8IG5vZGUudHlwZSA9PT0gXCJUZW1wbGF0ZUxpdGVyYWxcIiB8fCBub2RlLnR5cGUgPT09IFwiVGVtcGxhdGVFbGVtZW50XCIgfHwgaXNKU1hOb2RlJDEobm9kZSkgfHwgbm9kZS50eXBlID09PSBcIkJpbmRFeHByZXNzaW9uXCIgJiYgIW5vZGUub2JqZWN0IHx8IG5vZGUudHlwZSA9PT0gXCJSZWdFeHBMaXRlcmFsXCIgfHwgbm9kZS50eXBlID09PSBcIkxpdGVyYWxcIiAmJiBub2RlLnBhdHRlcm4gfHwgbm9kZS50eXBlID09PSBcIkxpdGVyYWxcIiAmJiBub2RlLnJlZ2V4O1xuXG4gICAgaWYgKG1heWJlQVNJUHJvYmxlbSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNOYWtlZExlZnRTaWRlJDIobm9kZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aC5jYWxsKGNoaWxkUGF0aCA9PiBleHByTmVlZHNBU0lQcm90ZWN0aW9uKGNoaWxkUGF0aCwgb3B0aW9ucyksIC4uLmdldExlZnRTaWRlUGF0aE5hbWUkMihwYXRoLCBub2RlKSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdG10TmVlZHNBU0lQcm90ZWN0aW9uKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXROb2RlKCk7XG5cbiAgICBpZiAobm9kZS50eXBlICE9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoLmNhbGwoY2hpbGRQYXRoID0+IGV4cHJOZWVkc0FTSVByb3RlY3Rpb24oY2hpbGRQYXRoLCBvcHRpb25zKSwgXCJleHByZXNzaW9uXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSHVnVHlwZShub2RlKSB7XG4gICAgaWYgKGlzU2ltcGxlRmxvd1R5cGUkMShub2RlKSB8fCBpc09iamVjdFR5cGUkMShub2RlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJVbmlvblR5cGVBbm5vdGF0aW9uXCIgfHwgbm9kZS50eXBlID09PSBcIlRTVW5pb25UeXBlXCIpIHtcbiAgICAgIGNvbnN0IHZvaWRDb3VudCA9IG5vZGUudHlwZXMuZmlsdGVyKG4gPT4gbi50eXBlID09PSBcIlZvaWRUeXBlQW5ub3RhdGlvblwiIHx8IG4udHlwZSA9PT0gXCJUU1ZvaWRLZXl3b3JkXCIgfHwgbi50eXBlID09PSBcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIiB8fCBuLnR5cGUgPT09IFwiVFNOdWxsS2V5d29yZFwiKS5sZW5ndGg7XG4gICAgICBjb25zdCBoYXNPYmplY3QgPSBub2RlLnR5cGVzLnNvbWUobiA9PiBuLnR5cGUgPT09IFwiT2JqZWN0VHlwZUFubm90YXRpb25cIiB8fCBuLnR5cGUgPT09IFwiVFNUeXBlTGl0ZXJhbFwiIHx8IC8vIFRoaXMgaXMgYSBiaXQgYWdncmVzc2l2ZSBidXQgY2FwdHVyZXMgQXJyYXk8e3h9PlxuICAgICAgbi50eXBlID09PSBcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiIHx8IG4udHlwZSA9PT0gXCJUU1R5cGVSZWZlcmVuY2VcIik7XG5cbiAgICAgIGlmIChub2RlLnR5cGVzLmxlbmd0aCAtIDEgPT09IHZvaWRDb3VudCAmJiBoYXNPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSHVnQXJndW1lbnRzKGZ1bikge1xuICAgIGlmICghZnVuIHx8IGZ1bi5yZXN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zID0gZnVuLnBhcmFtcyB8fCBmdW4ucGFyYW1ldGVycztcblxuICAgIGlmICghcGFyYW1zIHx8IHBhcmFtcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICByZXR1cm4gIXBhcmFtLmNvbW1lbnRzICYmIChwYXJhbS50eXBlID09PSBcIk9iamVjdFBhdHRlcm5cIiB8fCBwYXJhbS50eXBlID09PSBcIkFycmF5UGF0dGVyblwiIHx8IHBhcmFtLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIHBhcmFtLnR5cGVBbm5vdGF0aW9uICYmIChwYXJhbS50eXBlQW5ub3RhdGlvbi50eXBlID09PSBcIlR5cGVBbm5vdGF0aW9uXCIgfHwgcGFyYW0udHlwZUFubm90YXRpb24udHlwZSA9PT0gXCJUU1R5cGVBbm5vdGF0aW9uXCIpICYmIGlzT2JqZWN0VHlwZSQxKHBhcmFtLnR5cGVBbm5vdGF0aW9uLnR5cGVBbm5vdGF0aW9uKSB8fCBwYXJhbS50eXBlID09PSBcIkZ1bmN0aW9uVHlwZVBhcmFtXCIgJiYgaXNPYmplY3RUeXBlJDEocGFyYW0udHlwZUFubm90YXRpb24pIHx8IHBhcmFtLnR5cGUgPT09IFwiQXNzaWdubWVudFBhdHRlcm5cIiAmJiAocGFyYW0ubGVmdC50eXBlID09PSBcIk9iamVjdFBhdHRlcm5cIiB8fCBwYXJhbS5sZWZ0LnR5cGUgPT09IFwiQXJyYXlQYXR0ZXJuXCIpICYmIChwYXJhbS5yaWdodC50eXBlID09PSBcIklkZW50aWZpZXJcIiB8fCBwYXJhbS5yaWdodC50eXBlID09PSBcIk9iamVjdEV4cHJlc3Npb25cIiAmJiBwYXJhbS5yaWdodC5wcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCB8fCBwYXJhbS5yaWdodC50eXBlID09PSBcIkFycmF5RXhwcmVzc2lvblwiICYmIHBhcmFtLnJpZ2h0LmVsZW1lbnRzLmxlbmd0aCA9PT0gMCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRBcnJheUl0ZW1zKHBhdGgsIG9wdGlvbnMsIHByaW50UGF0aCwgcHJpbnQpIHtcbiAgICBjb25zdCBwcmludGVkRWxlbWVudHMgPSBbXTtcbiAgICBsZXQgc2VwYXJhdG9yUGFydHMgPSBbXTtcbiAgICBwYXRoLmVhY2goY2hpbGRQYXRoID0+IHtcbiAgICAgIHByaW50ZWRFbGVtZW50cy5wdXNoKGNvbmNhdCRkKHNlcGFyYXRvclBhcnRzKSk7XG4gICAgICBwcmludGVkRWxlbWVudHMucHVzaChncm91cCRiKHByaW50KGNoaWxkUGF0aCkpKTtcbiAgICAgIHNlcGFyYXRvclBhcnRzID0gW1wiLFwiLCBsaW5lJDldO1xuXG4gICAgICBpZiAoY2hpbGRQYXRoLmdldFZhbHVlKCkgJiYgaXNOZXh0TGluZUVtcHR5JDQob3B0aW9ucy5vcmlnaW5hbFRleHQsIGNoaWxkUGF0aC5nZXRWYWx1ZSgpLCBvcHRpb25zLmxvY0VuZCkpIHtcbiAgICAgICAgc2VwYXJhdG9yUGFydHMucHVzaChzb2Z0bGluZSQ2KTtcbiAgICAgIH1cbiAgICB9LCBwcmludFBhdGgpO1xuICAgIHJldHVybiBjb25jYXQkZChwcmludGVkRWxlbWVudHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRSZXR1cm5BbmRUaHJvd0FyZ3VtZW50KHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBzZW1pID0gb3B0aW9ucy5zZW1pID8gXCI7XCIgOiBcIlwiO1xuICAgIGNvbnN0IHBhcnRzID0gW107XG5cbiAgICBpZiAobm9kZS5hcmd1bWVudCkge1xuICAgICAgaWYgKHJldHVybkFyZ3VtZW50SGFzTGVhZGluZ0NvbW1lbnQkMShvcHRpb25zLCBub2RlLmFyZ3VtZW50KSkge1xuICAgICAgICBwYXJ0cy5wdXNoKGNvbmNhdCRkKFtcIiAoXCIsIGluZGVudCQ3KGNvbmNhdCRkKFtoYXJkbGluZSQ5LCBwYXRoLmNhbGwocHJpbnQsIFwiYXJndW1lbnRcIildKSksIGhhcmRsaW5lJDksIFwiKVwiXSkpO1xuICAgICAgfSBlbHNlIGlmIChpc0JpbmFyeWlzaCQxKG5vZGUuYXJndW1lbnQpIHx8IG5vZGUuYXJndW1lbnQudHlwZSA9PT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIikge1xuICAgICAgICBwYXJ0cy5wdXNoKGdyb3VwJGIoY29uY2F0JGQoW2lmQnJlYWskNihcIiAoXCIsIFwiIFwiKSwgaW5kZW50JDcoY29uY2F0JGQoW3NvZnRsaW5lJDYsIHBhdGguY2FsbChwcmludCwgXCJhcmd1bWVudFwiKV0pKSwgc29mdGxpbmUkNiwgaWZCcmVhayQ2KFwiKVwiKV0pKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5wdXNoKFwiIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiYXJndW1lbnRcIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxhc3RDb21tZW50ID0gQXJyYXkuaXNBcnJheShub2RlLmNvbW1lbnRzKSAmJiBub2RlLmNvbW1lbnRzW25vZGUuY29tbWVudHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgaXNMYXN0Q29tbWVudExpbmUgPSBsYXN0Q29tbWVudCAmJiAobGFzdENvbW1lbnQudHlwZSA9PT0gXCJDb21tZW50TGluZVwiIHx8IGxhc3RDb21tZW50LnR5cGUgPT09IFwiTGluZVwiKTtcblxuICAgIGlmIChpc0xhc3RDb21tZW50TGluZSkge1xuICAgICAgcGFydHMucHVzaChzZW1pKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzRGFuZ2xpbmdDb21tZW50cyQxKG5vZGUpKSB7XG4gICAgICBwYXJ0cy5wdXNoKFwiIFwiLCBjb21tZW50cy5wcmludERhbmdsaW5nQ29tbWVudHMocGF0aCwgb3B0aW9ucyxcbiAgICAgIC8qIHNhbWVJbmRlbnQgKi9cbiAgICAgIHRydWUpKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTGFzdENvbW1lbnRMaW5lKSB7XG4gICAgICBwYXJ0cy5wdXNoKHNlbWkpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25jYXQkZChwYXJ0cyk7XG4gIH1cblxuICBmdW5jdGlvbiB3aWxsUHJpbnRPd25Db21tZW50cyhwYXRoXG4gIC8qLCBvcHRpb25zICovXG4gICkge1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgcmV0dXJuIChub2RlICYmIChpc0pTWE5vZGUkMShub2RlKSB8fCBoYXNGbG93U2hvcnRoYW5kQW5ub3RhdGlvbkNvbW1lbnQkMihub2RlKSB8fCBwYXJlbnQgJiYgKHBhcmVudC50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiKSAmJiAoaGFzRmxvd0Fubm90YXRpb25Db21tZW50JDEobm9kZS5sZWFkaW5nQ29tbWVudHMpIHx8IGhhc0Zsb3dBbm5vdGF0aW9uQ29tbWVudCQxKG5vZGUudHJhaWxpbmdDb21tZW50cykpKSB8fCBwYXJlbnQgJiYgKHBhcmVudC50eXBlID09PSBcIkpTWFNwcmVhZEF0dHJpYnV0ZVwiIHx8IHBhcmVudC50eXBlID09PSBcIkpTWFNwcmVhZENoaWxkXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiVW5pb25UeXBlQW5ub3RhdGlvblwiIHx8IHBhcmVudC50eXBlID09PSBcIlRTVW5pb25UeXBlXCIgfHwgKHBhcmVudC50eXBlID09PSBcIkNsYXNzRGVjbGFyYXRpb25cIiB8fCBwYXJlbnQudHlwZSA9PT0gXCJDbGFzc0V4cHJlc3Npb25cIikgJiYgcGFyZW50LnN1cGVyQ2xhc3MgPT09IG5vZGUpKSAmJiAoIWhhc0lnbm9yZUNvbW1lbnQkNChwYXRoKSB8fCBwYXJlbnQudHlwZSA9PT0gXCJVbmlvblR5cGVBbm5vdGF0aW9uXCIgfHwgcGFyZW50LnR5cGUgPT09IFwiVFNVbmlvblR5cGVcIik7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5BdHRhY2hDb21tZW50JDEobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgJiYgbm9kZS50eXBlICE9PSBcIkNvbW1lbnRCbG9ja1wiICYmIG5vZGUudHlwZSAhPT0gXCJDb21tZW50TGluZVwiICYmIG5vZGUudHlwZSAhPT0gXCJMaW5lXCIgJiYgbm9kZS50eXBlICE9PSBcIkJsb2NrXCIgJiYgbm9kZS50eXBlICE9PSBcIkVtcHR5U3RhdGVtZW50XCIgJiYgbm9kZS50eXBlICE9PSBcIlRlbXBsYXRlRWxlbWVudFwiICYmIG5vZGUudHlwZSAhPT0gXCJJbXBvcnRcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50Q29tbWVudCQyKGNvbW1lbnRQYXRoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRQYXRoLmdldFZhbHVlKCk7XG5cbiAgICBzd2l0Y2ggKGNvbW1lbnQudHlwZSkge1xuICAgICAgY2FzZSBcIkNvbW1lbnRCbG9ja1wiOlxuICAgICAgY2FzZSBcIkJsb2NrXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaXNJbmRlbnRhYmxlQmxvY2tDb21tZW50KGNvbW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBwcmludGVkID0gcHJpbnRJbmRlbnRhYmxlQmxvY2tDb21tZW50KGNvbW1lbnQpOyAvLyBXZSBuZWVkIHRvIHByZXZlbnQgYW4gZWRnZSBjYXNlIG9mIGEgcHJldmlvdXMgdHJhaWxpbmcgY29tbWVudFxuICAgICAgICAgICAgLy8gcHJpbnRlZCBhcyBhIGBsaW5lU3VmZml4YCB3aGljaCBjYXVzZXMgdGhlIGNvbW1lbnRzIHRvIGJlXG4gICAgICAgICAgICAvLyBpbnRlcmxlYXZlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmV0dGllci9wcmV0dGllci9pc3N1ZXMvNDQxMlxuXG4gICAgICAgICAgICBpZiAoY29tbWVudC50cmFpbGluZyAmJiAhaGFzTmV3bGluZSQ1KG9wdGlvbnMub3JpZ2luYWxUZXh0LCBvcHRpb25zLmxvY1N0YXJ0KGNvbW1lbnQpLCB7XG4gICAgICAgICAgICAgIGJhY2t3YXJkczogdHJ1ZVxuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRkKFtoYXJkbGluZSQ5LCBwcmludGVkXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwcmludGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbW1lbnRFbmQgPSBvcHRpb25zLmxvY0VuZChjb21tZW50KTtcbiAgICAgICAgICBjb25zdCBpc0luc2lkZUZsb3dDb21tZW50ID0gb3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2UoY29tbWVudEVuZCAtIDMsIGNvbW1lbnRFbmQpID09PSBcIiotL1wiO1xuICAgICAgICAgIHJldHVybiBcIi8qXCIgKyBjb21tZW50LnZhbHVlICsgKGlzSW5zaWRlRmxvd0NvbW1lbnQgPyBcIiotL1wiIDogXCIqL1wiKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiQ29tbWVudExpbmVcIjpcbiAgICAgIGNhc2UgXCJMaW5lXCI6XG4gICAgICAgIC8vIFByaW50IHNoZWJhbmdzIHdpdGggdGhlIHByb3BlciBjb21tZW50IGNoYXJhY3RlcnNcbiAgICAgICAgaWYgKG9wdGlvbnMub3JpZ2luYWxUZXh0LnNsaWNlKG9wdGlvbnMubG9jU3RhcnQoY29tbWVudCkpLnN0YXJ0c1dpdGgoXCIjIVwiKSkge1xuICAgICAgICAgIHJldHVybiBcIiMhXCIgKyBjb21tZW50LnZhbHVlLnRyaW1FbmQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIi8vXCIgKyBjb21tZW50LnZhbHVlLnRyaW1FbmQoKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGEgY29tbWVudDogXCIgKyBKU09OLnN0cmluZ2lmeShjb21tZW50KSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNJbmRlbnRhYmxlQmxvY2tDb21tZW50KGNvbW1lbnQpIHtcbiAgICAvLyBJZiB0aGUgY29tbWVudCBoYXMgbXVsdGlwbGUgbGluZXMgYW5kIGV2ZXJ5IGxpbmUgc3RhcnRzIHdpdGggYSBzdGFyXG4gICAgLy8gd2UgY2FuIGZpeCB0aGUgaW5kZW50YXRpb24gb2YgZWFjaCBsaW5lLiBUaGUgc3RhcnMgaW4gdGhlIGAvKmAgYW5kXG4gICAgLy8gYCovYCBkZWxpbWl0ZXJzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGNvbW1lbnQgdmFsdWUsIHNvIGFkZCB0aGVtXG4gICAgLy8gYmFjayBmaXJzdC5cbiAgICBjb25zdCBsaW5lcyA9IFwiKlwiLmNvbmNhdChjb21tZW50LnZhbHVlLCBcIipcIikuc3BsaXQoXCJcXG5cIik7XG4gICAgcmV0dXJuIGxpbmVzLmxlbmd0aCA+IDEgJiYgbGluZXMuZXZlcnkobGluZSA9PiBsaW5lLnRyaW0oKVswXSA9PT0gXCIqXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRJbmRlbnRhYmxlQmxvY2tDb21tZW50KGNvbW1lbnQpIHtcbiAgICBjb25zdCBsaW5lcyA9IGNvbW1lbnQudmFsdWUuc3BsaXQoXCJcXG5cIik7XG4gICAgcmV0dXJuIGNvbmNhdCRkKFtcIi8qXCIsIGpvaW4kOShoYXJkbGluZSQ5LCBsaW5lcy5tYXAoKGxpbmUsIGluZGV4KSA9PiBpbmRleCA9PT0gMCA/IGxpbmUudHJpbUVuZCgpIDogXCIgXCIgKyAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxID8gbGluZS50cmltKCkgOiBsaW5lLnRyaW1TdGFydCgpKSkpLCBcIiovXCJdKTtcbiAgfVxuXG4gIHZhciBwcmludGVyRXN0cmVlID0ge1xuICAgIHByZXByb2Nlc3M6IHByZXByb2Nlc3NfMSQxLFxuICAgIHByaW50OiBnZW5lcmljUHJpbnQkMyxcbiAgICBlbWJlZDogZW1iZWRfMSQxLFxuICAgIGluc2VydFByYWdtYTogaW5zZXJ0UHJhZ21hJDcsXG4gICAgbWFzc2FnZUFzdE5vZGU6IGNsZWFuXzEkMSxcbiAgICBoYXNQcmV0dGllcklnbm9yZTogaGFzUHJldHRpZXJJZ25vcmUkNSxcbiAgICB3aWxsUHJpbnRPd25Db21tZW50cyxcbiAgICBjYW5BdHRhY2hDb21tZW50OiBjYW5BdHRhY2hDb21tZW50JDEsXG4gICAgcHJpbnRDb21tZW50OiBwcmludENvbW1lbnQkMixcbiAgICBpc0Jsb2NrQ29tbWVudDogY29tbWVudHMkMS5pc0Jsb2NrQ29tbWVudCxcbiAgICBoYW5kbGVDb21tZW50czoge1xuICAgICAgb3duTGluZTogY29tbWVudHMkMS5oYW5kbGVPd25MaW5lQ29tbWVudCxcbiAgICAgIGVuZE9mTGluZTogY29tbWVudHMkMS5oYW5kbGVFbmRPZkxpbmVDb21tZW50LFxuICAgICAgcmVtYWluaW5nOiBjb21tZW50cyQxLmhhbmRsZVJlbWFpbmluZ0NvbW1lbnRcbiAgICB9LFxuICAgIGdldEdhcFJlZ2V4OiBjb21tZW50cyQxLmdldEdhcFJlZ2V4LFxuICAgIGdldENvbW1lbnRDaGlsZE5vZGVzOiBjb21tZW50cyQxLmdldENvbW1lbnRDaGlsZE5vZGVzXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIGNvbmNhdDogY29uY2F0JGUsXG4gICAgaGFyZGxpbmU6IGhhcmRsaW5lJGEsXG4gICAgaW5kZW50OiBpbmRlbnQkOCxcbiAgICBqb2luOiBqb2luJGFcbiAgfSA9IGRvY3VtZW50LmJ1aWxkZXJzO1xuXG4gIGZ1bmN0aW9uIGdlbmVyaWNQcmludCQ0KHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwiSnNvblJvb3RcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRlKFtwYXRoLmNhbGwocHJpbnQsIFwibm9kZVwiKSwgaGFyZGxpbmUkYV0pO1xuXG4gICAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBub2RlLmVsZW1lbnRzLmxlbmd0aCA9PT0gMCA/IFwiW11cIiA6IGNvbmNhdCRlKFtcIltcIiwgaW5kZW50JDgoY29uY2F0JGUoW2hhcmRsaW5lJGEsIGpvaW4kYShjb25jYXQkZShbXCIsXCIsIGhhcmRsaW5lJGFdKSwgcGF0aC5tYXAocHJpbnQsIFwiZWxlbWVudHNcIikpXSkpLCBoYXJkbGluZSRhLCBcIl1cIl0pO1xuXG4gICAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gbm9kZS5wcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCA/IFwie31cIiA6IGNvbmNhdCRlKFtcIntcIiwgaW5kZW50JDgoY29uY2F0JGUoW2hhcmRsaW5lJGEsIGpvaW4kYShjb25jYXQkZShbXCIsXCIsIGhhcmRsaW5lJGFdKSwgcGF0aC5tYXAocHJpbnQsIFwicHJvcGVydGllc1wiKSldKSksIGhhcmRsaW5lJGEsIFwifVwiXSk7XG5cbiAgICAgIGNhc2UgXCJPYmplY3RQcm9wZXJ0eVwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGUoW3BhdGguY2FsbChwcmludCwgXCJrZXlcIiksIFwiOiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInZhbHVlXCIpXSk7XG5cbiAgICAgIGNhc2UgXCJVbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRlKFtub2RlLm9wZXJhdG9yID09PSBcIitcIiA/IFwiXCIgOiBub2RlLm9wZXJhdG9yLCBwYXRoLmNhbGwocHJpbnQsIFwiYXJndW1lbnRcIildKTtcblxuICAgICAgY2FzZSBcIk51bGxMaXRlcmFsXCI6XG4gICAgICAgIHJldHVybiBcIm51bGxcIjtcblxuICAgICAgY2FzZSBcIkJvb2xlYW5MaXRlcmFsXCI6XG4gICAgICAgIHJldHVybiBub2RlLnZhbHVlID8gXCJ0cnVlXCIgOiBcImZhbHNlXCI7XG5cbiAgICAgIGNhc2UgXCJTdHJpbmdMaXRlcmFsXCI6XG4gICAgICBjYXNlIFwiTnVtZXJpY0xpdGVyYWxcIjpcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5vZGUudmFsdWUpO1xuXG4gICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobm9kZS5uYW1lKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIEpTT04uc3RyaW5naWZ5KG5vZGUudHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFuJDUobm9kZSwgbmV3Tm9kZVxuICAvKiwgcGFyZW50Ki9cbiAgKSB7XG4gICAgZGVsZXRlIG5ld05vZGUuc3RhcnQ7XG4gICAgZGVsZXRlIG5ld05vZGUuZW5kO1xuICAgIGRlbGV0ZSBuZXdOb2RlLmV4dHJhO1xuICAgIGRlbGV0ZSBuZXdOb2RlLmxvYztcbiAgICBkZWxldGUgbmV3Tm9kZS5jb21tZW50cztcbiAgICBkZWxldGUgbmV3Tm9kZS5lcnJvcnM7XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJTdHJpbmdMaXRlcmFsXCIsXG4gICAgICAgIHZhbHVlOiBub2RlLm5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJVbmFyeUV4cHJlc3Npb25cIiAmJiBub2RlLm9wZXJhdG9yID09PSBcIitcIikge1xuICAgICAgcmV0dXJuIG5ld05vZGUuYXJndW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByaW50ZXJFc3RyZWVKc29uID0ge1xuICAgIHByZXByb2Nlc3M6IHByZXByb2Nlc3NfMSQxLFxuICAgIHByaW50OiBnZW5lcmljUHJpbnQkNCxcbiAgICBtYXNzYWdlQXN0Tm9kZTogY2xlYW4kNVxuICB9O1xuXG4gIGNvbnN0IENBVEVHT1JZX0pBVkFTQ1JJUFQgPSBcIkphdmFTY3JpcHRcIjsgLy8gZm9ybWF0IGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmV0dGllci9wcmV0dGllci9ibG9iL21hc3Rlci9zcmMvbWFpbi9jb3JlLW9wdGlvbnMuanNcblxuICB2YXIgb3B0aW9ucyQ1ID0ge1xuICAgIGFycm93UGFyZW5zOiB7XG4gICAgICBzaW5jZTogXCIxLjkuMFwiLFxuICAgICAgY2F0ZWdvcnk6IENBVEVHT1JZX0pBVkFTQ1JJUFQsXG4gICAgICB0eXBlOiBcImNob2ljZVwiLFxuICAgICAgZGVmYXVsdDogW3tcbiAgICAgICAgc2luY2U6IFwiMS45LjBcIixcbiAgICAgICAgdmFsdWU6IFwiYXZvaWRcIlxuICAgICAgfSwge1xuICAgICAgICBzaW5jZTogXCIyLjAuMFwiLFxuICAgICAgICB2YWx1ZTogXCJhbHdheXNcIlxuICAgICAgfV0sXG4gICAgICBkZXNjcmlwdGlvbjogXCJJbmNsdWRlIHBhcmVudGhlc2VzIGFyb3VuZCBhIHNvbGUgYXJyb3cgZnVuY3Rpb24gcGFyYW1ldGVyLlwiLFxuICAgICAgY2hvaWNlczogW3tcbiAgICAgICAgdmFsdWU6IFwiYWx3YXlzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkFsd2F5cyBpbmNsdWRlIHBhcmVucy4gRXhhbXBsZTogYCh4KSA9PiB4YFwiXG4gICAgICB9LCB7XG4gICAgICAgIHZhbHVlOiBcImF2b2lkXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIk9taXQgcGFyZW5zIHdoZW4gcG9zc2libGUuIEV4YW1wbGU6IGB4ID0+IHhgXCJcbiAgICAgIH1dXG4gICAgfSxcbiAgICBicmFja2V0U3BhY2luZzogY29tbW9uT3B0aW9ucy5icmFja2V0U3BhY2luZyxcbiAgICBqc3hCcmFja2V0U2FtZUxpbmU6IHtcbiAgICAgIHNpbmNlOiBcIjAuMTcuMFwiLFxuICAgICAgY2F0ZWdvcnk6IENBVEVHT1JZX0pBVkFTQ1JJUFQsXG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZGVzY3JpcHRpb246IFwiUHV0ID4gb24gdGhlIGxhc3QgbGluZSBpbnN0ZWFkIG9mIGF0IGEgbmV3IGxpbmUuXCJcbiAgICB9LFxuICAgIHNlbWk6IHtcbiAgICAgIHNpbmNlOiBcIjEuMC4wXCIsXG4gICAgICBjYXRlZ29yeTogQ0FURUdPUllfSkFWQVNDUklQVCxcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlByaW50IHNlbWljb2xvbnMuXCIsXG4gICAgICBvcHBvc2l0ZURlc2NyaXB0aW9uOiBcIkRvIG5vdCBwcmludCBzZW1pY29sb25zLCBleGNlcHQgYXQgdGhlIGJlZ2lubmluZyBvZiBsaW5lcyB3aGljaCBtYXkgbmVlZCB0aGVtLlwiXG4gICAgfSxcbiAgICBzaW5nbGVRdW90ZTogY29tbW9uT3B0aW9ucy5zaW5nbGVRdW90ZSxcbiAgICBqc3hTaW5nbGVRdW90ZToge1xuICAgICAgc2luY2U6IFwiMS4xNS4wXCIsXG4gICAgICBjYXRlZ29yeTogQ0FURUdPUllfSkFWQVNDUklQVCxcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBkZXNjcmlwdGlvbjogXCJVc2Ugc2luZ2xlIHF1b3RlcyBpbiBKU1guXCJcbiAgICB9LFxuICAgIHF1b3RlUHJvcHM6IHtcbiAgICAgIHNpbmNlOiBcIjEuMTcuMFwiLFxuICAgICAgY2F0ZWdvcnk6IENBVEVHT1JZX0pBVkFTQ1JJUFQsXG4gICAgICB0eXBlOiBcImNob2ljZVwiLFxuICAgICAgZGVmYXVsdDogXCJhcy1uZWVkZWRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNoYW5nZSB3aGVuIHByb3BlcnRpZXMgaW4gb2JqZWN0cyBhcmUgcXVvdGVkLlwiLFxuICAgICAgY2hvaWNlczogW3tcbiAgICAgICAgdmFsdWU6IFwiYXMtbmVlZGVkXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIk9ubHkgYWRkIHF1b3RlcyBhcm91bmQgb2JqZWN0IHByb3BlcnRpZXMgd2hlcmUgcmVxdWlyZWQuXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwiY29uc2lzdGVudFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJJZiBhdCBsZWFzdCBvbmUgcHJvcGVydHkgaW4gYW4gb2JqZWN0IHJlcXVpcmVzIHF1b3RlcywgcXVvdGUgYWxsIHByb3BlcnRpZXMuXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdmFsdWU6IFwicHJlc2VydmVcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVzcGVjdCB0aGUgaW5wdXQgdXNlIG9mIHF1b3RlcyBpbiBvYmplY3QgcHJvcGVydGllcy5cIlxuICAgICAgfV1cbiAgICB9LFxuICAgIHRyYWlsaW5nQ29tbWE6IHtcbiAgICAgIHNpbmNlOiBcIjAuMC4wXCIsXG4gICAgICBjYXRlZ29yeTogQ0FURUdPUllfSkFWQVNDUklQVCxcbiAgICAgIHR5cGU6IFwiY2hvaWNlXCIsXG4gICAgICBkZWZhdWx0OiBbe1xuICAgICAgICBzaW5jZTogXCIwLjAuMFwiLFxuICAgICAgICB2YWx1ZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgc2luY2U6IFwiMC4xOS4wXCIsXG4gICAgICAgIHZhbHVlOiBcIm5vbmVcIlxuICAgICAgfSwge1xuICAgICAgICBzaW5jZTogXCIyLjAuMFwiLFxuICAgICAgICB2YWx1ZTogXCJlczVcIlxuICAgICAgfV0sXG4gICAgICBkZXNjcmlwdGlvbjogXCJQcmludCB0cmFpbGluZyBjb21tYXMgd2hlcmV2ZXIgcG9zc2libGUgd2hlbiBtdWx0aS1saW5lLlwiLFxuICAgICAgY2hvaWNlczogW3tcbiAgICAgICAgdmFsdWU6IFwiZXM1XCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlRyYWlsaW5nIGNvbW1hcyB3aGVyZSB2YWxpZCBpbiBFUzUgKG9iamVjdHMsIGFycmF5cywgZXRjLilcIlxuICAgICAgfSwge1xuICAgICAgICB2YWx1ZTogXCJub25lXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIk5vIHRyYWlsaW5nIGNvbW1hcy5cIlxuICAgICAgfSwge1xuICAgICAgICB2YWx1ZTogXCJhbGxcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiVHJhaWxpbmcgY29tbWFzIHdoZXJldmVyIHBvc3NpYmxlIChpbmNsdWRpbmcgZnVuY3Rpb24gYXJndW1lbnRzKS5cIlxuICAgICAgfV1cbiAgICB9XG4gIH07XG5cbiAgdmFyIG5hbWUkOSA9IFwiSmF2YVNjcmlwdFwiO1xuICB2YXIgdHlwZSQ4ID0gXCJwcm9ncmFtbWluZ1wiO1xuICB2YXIgdG1TY29wZSQ4ID0gXCJzb3VyY2UuanNcIjtcbiAgdmFyIGFjZU1vZGUkOCA9IFwiamF2YXNjcmlwdFwiO1xuICB2YXIgY29kZW1pcnJvck1vZGUkNCA9IFwiamF2YXNjcmlwdFwiO1xuICB2YXIgY29kZW1pcnJvck1pbWVUeXBlJDQgPSBcInRleHQvamF2YXNjcmlwdFwiO1xuICB2YXIgY29sb3IkMyA9IFwiI2YxZTA1YVwiO1xuICB2YXIgYWxpYXNlcyQyID0gW1xuICBcdFwianNcIixcbiAgXHRcIm5vZGVcIlxuICBdO1xuICB2YXIgZXh0ZW5zaW9ucyQ4ID0gW1xuICBcdFwiLmpzXCIsXG4gIFx0XCIuX2pzXCIsXG4gIFx0XCIuYm9uZXNcIixcbiAgXHRcIi5janNcIixcbiAgXHRcIi5lc1wiLFxuICBcdFwiLmVzNlwiLFxuICBcdFwiLmZyYWdcIixcbiAgXHRcIi5nc1wiLFxuICBcdFwiLmpha2VcIixcbiAgXHRcIi5qc2JcIixcbiAgXHRcIi5qc2NhZFwiLFxuICBcdFwiLmpzZmxcIixcbiAgXHRcIi5qc21cIixcbiAgXHRcIi5qc3NcIixcbiAgXHRcIi5tanNcIixcbiAgXHRcIi5uanNcIixcbiAgXHRcIi5wYWNcIixcbiAgXHRcIi5zanNcIixcbiAgXHRcIi5zc2pzXCIsXG4gIFx0XCIueHNqc1wiLFxuICBcdFwiLnhzanNsaWJcIlxuICBdO1xuICB2YXIgZmlsZW5hbWVzID0gW1xuICBcdFwiSmFrZWZpbGVcIlxuICBdO1xuICB2YXIgaW50ZXJwcmV0ZXJzID0gW1xuICBcdFwiY2hha3JhXCIsXG4gIFx0XCJkOFwiLFxuICBcdFwiZ2pzXCIsXG4gIFx0XCJqc1wiLFxuICBcdFwibm9kZVwiLFxuICBcdFwicWpzXCIsXG4gIFx0XCJyaGlub1wiLFxuICBcdFwidjhcIixcbiAgXHRcInY4LXNoZWxsXCJcbiAgXTtcbiAgdmFyIGxhbmd1YWdlSWQkOCA9IDE4MztcbiAgdmFyIEphdmFTY3JpcHQgPSB7XG4gIFx0bmFtZTogbmFtZSQ5LFxuICBcdHR5cGU6IHR5cGUkOCxcbiAgXHR0bVNjb3BlOiB0bVNjb3BlJDgsXG4gIFx0YWNlTW9kZTogYWNlTW9kZSQ4LFxuICBcdGNvZGVtaXJyb3JNb2RlOiBjb2RlbWlycm9yTW9kZSQ0LFxuICBcdGNvZGVtaXJyb3JNaW1lVHlwZTogY29kZW1pcnJvck1pbWVUeXBlJDQsXG4gIFx0Y29sb3I6IGNvbG9yJDMsXG4gIFx0YWxpYXNlczogYWxpYXNlcyQyLFxuICBcdGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMkOCxcbiAgXHRmaWxlbmFtZXM6IGZpbGVuYW1lcyxcbiAgXHRpbnRlcnByZXRlcnM6IGludGVycHJldGVycyxcbiAgXHRsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJDhcbiAgfTtcblxuICB2YXIgSmF2YVNjcmlwdCQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBuYW1lOiBuYW1lJDksXG4gICAgdHlwZTogdHlwZSQ4LFxuICAgIHRtU2NvcGU6IHRtU2NvcGUkOCxcbiAgICBhY2VNb2RlOiBhY2VNb2RlJDgsXG4gICAgY29kZW1pcnJvck1vZGU6IGNvZGVtaXJyb3JNb2RlJDQsXG4gICAgY29kZW1pcnJvck1pbWVUeXBlOiBjb2RlbWlycm9yTWltZVR5cGUkNCxcbiAgICBjb2xvcjogY29sb3IkMyxcbiAgICBhbGlhc2VzOiBhbGlhc2VzJDIsXG4gICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyQ4LFxuICAgIGZpbGVuYW1lczogZmlsZW5hbWVzLFxuICAgIGludGVycHJldGVyczogaW50ZXJwcmV0ZXJzLFxuICAgIGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWQkOCxcbiAgICAnZGVmYXVsdCc6IEphdmFTY3JpcHRcbiAgfSk7XG5cbiAgdmFyIG5hbWUkYSA9IFwiSlNYXCI7XG4gIHZhciB0eXBlJDkgPSBcInByb2dyYW1taW5nXCI7XG4gIHZhciBncm91cCRjID0gXCJKYXZhU2NyaXB0XCI7XG4gIHZhciBleHRlbnNpb25zJDkgPSBbXG4gIFx0XCIuanN4XCJcbiAgXTtcbiAgdmFyIHRtU2NvcGUkOSA9IFwic291cmNlLmpzLmpzeFwiO1xuICB2YXIgYWNlTW9kZSQ5ID0gXCJqYXZhc2NyaXB0XCI7XG4gIHZhciBjb2RlbWlycm9yTW9kZSQ1ID0gXCJqc3hcIjtcbiAgdmFyIGNvZGVtaXJyb3JNaW1lVHlwZSQ1ID0gXCJ0ZXh0L2pzeFwiO1xuICB2YXIgbGFuZ3VhZ2VJZCQ5ID0gMTc4O1xuICB2YXIgSlNYID0ge1xuICBcdG5hbWU6IG5hbWUkYSxcbiAgXHR0eXBlOiB0eXBlJDksXG4gIFx0Z3JvdXA6IGdyb3VwJGMsXG4gIFx0ZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyQ5LFxuICBcdHRtU2NvcGU6IHRtU2NvcGUkOSxcbiAgXHRhY2VNb2RlOiBhY2VNb2RlJDksXG4gIFx0Y29kZW1pcnJvck1vZGU6IGNvZGVtaXJyb3JNb2RlJDUsXG4gIFx0Y29kZW1pcnJvck1pbWVUeXBlOiBjb2RlbWlycm9yTWltZVR5cGUkNSxcbiAgXHRsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJDlcbiAgfTtcblxuICB2YXIgSlNYJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIG5hbWU6IG5hbWUkYSxcbiAgICB0eXBlOiB0eXBlJDksXG4gICAgZ3JvdXA6IGdyb3VwJGMsXG4gICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyQ5LFxuICAgIHRtU2NvcGU6IHRtU2NvcGUkOSxcbiAgICBhY2VNb2RlOiBhY2VNb2RlJDksXG4gICAgY29kZW1pcnJvck1vZGU6IGNvZGVtaXJyb3JNb2RlJDUsXG4gICAgY29kZW1pcnJvck1pbWVUeXBlOiBjb2RlbWlycm9yTWltZVR5cGUkNSxcbiAgICBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJDksXG4gICAgJ2RlZmF1bHQnOiBKU1hcbiAgfSk7XG5cbiAgdmFyIG5hbWUkYiA9IFwiVHlwZVNjcmlwdFwiO1xuICB2YXIgdHlwZSRhID0gXCJwcm9ncmFtbWluZ1wiO1xuICB2YXIgY29sb3IkNCA9IFwiIzJiNzQ4OVwiO1xuICB2YXIgYWxpYXNlcyQzID0gW1xuICBcdFwidHNcIlxuICBdO1xuICB2YXIgaW50ZXJwcmV0ZXJzJDEgPSBbXG4gIFx0XCJkZW5vXCIsXG4gIFx0XCJ0cy1ub2RlXCJcbiAgXTtcbiAgdmFyIGV4dGVuc2lvbnMkYSA9IFtcbiAgXHRcIi50c1wiXG4gIF07XG4gIHZhciB0bVNjb3BlJGEgPSBcInNvdXJjZS50c1wiO1xuICB2YXIgYWNlTW9kZSRhID0gXCJ0eXBlc2NyaXB0XCI7XG4gIHZhciBjb2RlbWlycm9yTW9kZSQ2ID0gXCJqYXZhc2NyaXB0XCI7XG4gIHZhciBjb2RlbWlycm9yTWltZVR5cGUkNiA9IFwiYXBwbGljYXRpb24vdHlwZXNjcmlwdFwiO1xuICB2YXIgbGFuZ3VhZ2VJZCRhID0gMzc4O1xuICB2YXIgVHlwZVNjcmlwdCA9IHtcbiAgXHRuYW1lOiBuYW1lJGIsXG4gIFx0dHlwZTogdHlwZSRhLFxuICBcdGNvbG9yOiBjb2xvciQ0LFxuICBcdGFsaWFzZXM6IGFsaWFzZXMkMyxcbiAgXHRpbnRlcnByZXRlcnM6IGludGVycHJldGVycyQxLFxuICBcdGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMkYSxcbiAgXHR0bVNjb3BlOiB0bVNjb3BlJGEsXG4gIFx0YWNlTW9kZTogYWNlTW9kZSRhLFxuICBcdGNvZGVtaXJyb3JNb2RlOiBjb2RlbWlycm9yTW9kZSQ2LFxuICBcdGNvZGVtaXJyb3JNaW1lVHlwZTogY29kZW1pcnJvck1pbWVUeXBlJDYsXG4gIFx0bGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZCRhXG4gIH07XG5cbiAgdmFyIFR5cGVTY3JpcHQkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgbmFtZTogbmFtZSRiLFxuICAgIHR5cGU6IHR5cGUkYSxcbiAgICBjb2xvcjogY29sb3IkNCxcbiAgICBhbGlhc2VzOiBhbGlhc2VzJDMsXG4gICAgaW50ZXJwcmV0ZXJzOiBpbnRlcnByZXRlcnMkMSxcbiAgICBleHRlbnNpb25zOiBleHRlbnNpb25zJGEsXG4gICAgdG1TY29wZTogdG1TY29wZSRhLFxuICAgIGFjZU1vZGU6IGFjZU1vZGUkYSxcbiAgICBjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUkNixcbiAgICBjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSQ2LFxuICAgIGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWQkYSxcbiAgICAnZGVmYXVsdCc6IFR5cGVTY3JpcHRcbiAgfSk7XG5cbiAgdmFyIG5hbWUkYyA9IFwiVFNYXCI7XG4gIHZhciB0eXBlJGIgPSBcInByb2dyYW1taW5nXCI7XG4gIHZhciBncm91cCRkID0gXCJUeXBlU2NyaXB0XCI7XG4gIHZhciBleHRlbnNpb25zJGIgPSBbXG4gIFx0XCIudHN4XCJcbiAgXTtcbiAgdmFyIHRtU2NvcGUkYiA9IFwic291cmNlLnRzeFwiO1xuICB2YXIgYWNlTW9kZSRiID0gXCJqYXZhc2NyaXB0XCI7XG4gIHZhciBjb2RlbWlycm9yTW9kZSQ3ID0gXCJqc3hcIjtcbiAgdmFyIGNvZGVtaXJyb3JNaW1lVHlwZSQ3ID0gXCJ0ZXh0L2pzeFwiO1xuICB2YXIgbGFuZ3VhZ2VJZCRiID0gOTQ5MDE5MjQ7XG4gIHZhciBUU1ggPSB7XG4gIFx0bmFtZTogbmFtZSRjLFxuICBcdHR5cGU6IHR5cGUkYixcbiAgXHRncm91cDogZ3JvdXAkZCxcbiAgXHRleHRlbnNpb25zOiBleHRlbnNpb25zJGIsXG4gIFx0dG1TY29wZTogdG1TY29wZSRiLFxuICBcdGFjZU1vZGU6IGFjZU1vZGUkYixcbiAgXHRjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUkNyxcbiAgXHRjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSQ3LFxuICBcdGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWQkYlxuICB9O1xuXG4gIHZhciBUU1gkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgbmFtZTogbmFtZSRjLFxuICAgIHR5cGU6IHR5cGUkYixcbiAgICBncm91cDogZ3JvdXAkZCxcbiAgICBleHRlbnNpb25zOiBleHRlbnNpb25zJGIsXG4gICAgdG1TY29wZTogdG1TY29wZSRiLFxuICAgIGFjZU1vZGU6IGFjZU1vZGUkYixcbiAgICBjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUkNyxcbiAgICBjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSQ3LFxuICAgIGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWQkYixcbiAgICAnZGVmYXVsdCc6IFRTWFxuICB9KTtcblxuICB2YXIgbmFtZSRkID0gXCJKU09OXCI7XG4gIHZhciB0eXBlJGMgPSBcImRhdGFcIjtcbiAgdmFyIHRtU2NvcGUkYyA9IFwic291cmNlLmpzb25cIjtcbiAgdmFyIGFjZU1vZGUkYyA9IFwianNvblwiO1xuICB2YXIgY29kZW1pcnJvck1vZGUkOCA9IFwiamF2YXNjcmlwdFwiO1xuICB2YXIgY29kZW1pcnJvck1pbWVUeXBlJDggPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgdmFyIHNlYXJjaGFibGUgPSBmYWxzZTtcbiAgdmFyIGV4dGVuc2lvbnMkYyA9IFtcbiAgXHRcIi5qc29uXCIsXG4gIFx0XCIuYXZzY1wiLFxuICBcdFwiLmdlb2pzb25cIixcbiAgXHRcIi5nbHRmXCIsXG4gIFx0XCIuaGFyXCIsXG4gIFx0XCIuaWNlXCIsXG4gIFx0XCIuSlNPTi10bUxhbmd1YWdlXCIsXG4gIFx0XCIuanNvbmxcIixcbiAgXHRcIi5tY21ldGFcIixcbiAgXHRcIi50ZnN0YXRlXCIsXG4gIFx0XCIudGZzdGF0ZS5iYWNrdXBcIixcbiAgXHRcIi50b3BvanNvblwiLFxuICBcdFwiLndlYmFwcFwiLFxuICBcdFwiLndlYm1hbmlmZXN0XCIsXG4gIFx0XCIueXlcIixcbiAgXHRcIi55eXBcIlxuICBdO1xuICB2YXIgZmlsZW5hbWVzJDEgPSBbXG4gIFx0XCIuYXJjY29uZmlnXCIsXG4gIFx0XCIuaHRtbGhpbnRyY1wiLFxuICBcdFwiLnRlcm4tY29uZmlnXCIsXG4gIFx0XCIudGVybi1wcm9qZWN0XCIsXG4gIFx0XCIud2F0Y2htYW5jb25maWdcIixcbiAgXHRcImNvbXBvc2VyLmxvY2tcIixcbiAgXHRcIm1jbW9kLmluZm9cIlxuICBdO1xuICB2YXIgbGFuZ3VhZ2VJZCRjID0gMTc0O1xuICB2YXIgX0pTT04gPSB7XG4gIFx0bmFtZTogbmFtZSRkLFxuICBcdHR5cGU6IHR5cGUkYyxcbiAgXHR0bVNjb3BlOiB0bVNjb3BlJGMsXG4gIFx0YWNlTW9kZTogYWNlTW9kZSRjLFxuICBcdGNvZGVtaXJyb3JNb2RlOiBjb2RlbWlycm9yTW9kZSQ4LFxuICBcdGNvZGVtaXJyb3JNaW1lVHlwZTogY29kZW1pcnJvck1pbWVUeXBlJDgsXG4gIFx0c2VhcmNoYWJsZTogc2VhcmNoYWJsZSxcbiAgXHRleHRlbnNpb25zOiBleHRlbnNpb25zJGMsXG4gIFx0ZmlsZW5hbWVzOiBmaWxlbmFtZXMkMSxcbiAgXHRsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJGNcbiAgfTtcblxuICB2YXIgX0pTT04kMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgbmFtZTogbmFtZSRkLFxuICAgIHR5cGU6IHR5cGUkYyxcbiAgICB0bVNjb3BlOiB0bVNjb3BlJGMsXG4gICAgYWNlTW9kZTogYWNlTW9kZSRjLFxuICAgIGNvZGVtaXJyb3JNb2RlOiBjb2RlbWlycm9yTW9kZSQ4LFxuICAgIGNvZGVtaXJyb3JNaW1lVHlwZTogY29kZW1pcnJvck1pbWVUeXBlJDgsXG4gICAgc2VhcmNoYWJsZTogc2VhcmNoYWJsZSxcbiAgICBleHRlbnNpb25zOiBleHRlbnNpb25zJGMsXG4gICAgZmlsZW5hbWVzOiBmaWxlbmFtZXMkMSxcbiAgICBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJGMsXG4gICAgJ2RlZmF1bHQnOiBfSlNPTlxuICB9KTtcblxuICB2YXIgbmFtZSRlID0gXCJKU09OIHdpdGggQ29tbWVudHNcIjtcbiAgdmFyIHR5cGUkZCA9IFwiZGF0YVwiO1xuICB2YXIgZ3JvdXAkZSA9IFwiSlNPTlwiO1xuICB2YXIgdG1TY29wZSRkID0gXCJzb3VyY2UuanNcIjtcbiAgdmFyIGFjZU1vZGUkZCA9IFwiamF2YXNjcmlwdFwiO1xuICB2YXIgY29kZW1pcnJvck1vZGUkOSA9IFwiamF2YXNjcmlwdFwiO1xuICB2YXIgY29kZW1pcnJvck1pbWVUeXBlJDkgPSBcInRleHQvamF2YXNjcmlwdFwiO1xuICB2YXIgYWxpYXNlcyQ0ID0gW1xuICBcdFwianNvbmNcIlxuICBdO1xuICB2YXIgZXh0ZW5zaW9ucyRkID0gW1xuICBcdFwiLmpzb25jXCIsXG4gIFx0XCIuc3VibGltZS1idWlsZFwiLFxuICBcdFwiLnN1YmxpbWUtY29tbWFuZHNcIixcbiAgXHRcIi5zdWJsaW1lLWNvbXBsZXRpb25zXCIsXG4gIFx0XCIuc3VibGltZS1rZXltYXBcIixcbiAgXHRcIi5zdWJsaW1lLW1hY3JvXCIsXG4gIFx0XCIuc3VibGltZS1tZW51XCIsXG4gIFx0XCIuc3VibGltZS1tb3VzZW1hcFwiLFxuICBcdFwiLnN1YmxpbWUtcHJvamVjdFwiLFxuICBcdFwiLnN1YmxpbWUtc2V0dGluZ3NcIixcbiAgXHRcIi5zdWJsaW1lLXRoZW1lXCIsXG4gIFx0XCIuc3VibGltZS13b3Jrc3BhY2VcIixcbiAgXHRcIi5zdWJsaW1lX21ldHJpY3NcIixcbiAgXHRcIi5zdWJsaW1lX3Nlc3Npb25cIlxuICBdO1xuICB2YXIgZmlsZW5hbWVzJDIgPSBbXG4gIFx0XCIuYmFiZWxyY1wiLFxuICBcdFwiLmVzbGludHJjLmpzb25cIixcbiAgXHRcIi5qc2NzcmNcIixcbiAgXHRcIi5qc2hpbnRyY1wiLFxuICBcdFwiLmpzbGludHJjXCIsXG4gIFx0XCJqc2NvbmZpZy5qc29uXCIsXG4gIFx0XCJsYW5ndWFnZS1jb25maWd1cmF0aW9uLmpzb25cIixcbiAgXHRcInRzY29uZmlnLmpzb25cIlxuICBdO1xuICB2YXIgbGFuZ3VhZ2VJZCRkID0gNDIzO1xuICB2YXIgSlNPTl93aXRoX0NvbW1lbnRzID0ge1xuICBcdG5hbWU6IG5hbWUkZSxcbiAgXHR0eXBlOiB0eXBlJGQsXG4gIFx0Z3JvdXA6IGdyb3VwJGUsXG4gIFx0dG1TY29wZTogdG1TY29wZSRkLFxuICBcdGFjZU1vZGU6IGFjZU1vZGUkZCxcbiAgXHRjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUkOSxcbiAgXHRjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSQ5LFxuICBcdGFsaWFzZXM6IGFsaWFzZXMkNCxcbiAgXHRleHRlbnNpb25zOiBleHRlbnNpb25zJGQsXG4gIFx0ZmlsZW5hbWVzOiBmaWxlbmFtZXMkMixcbiAgXHRsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJGRcbiAgfTtcblxuICB2YXIgSlNPTl93aXRoX0NvbW1lbnRzJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIG5hbWU6IG5hbWUkZSxcbiAgICB0eXBlOiB0eXBlJGQsXG4gICAgZ3JvdXA6IGdyb3VwJGUsXG4gICAgdG1TY29wZTogdG1TY29wZSRkLFxuICAgIGFjZU1vZGU6IGFjZU1vZGUkZCxcbiAgICBjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUkOSxcbiAgICBjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSQ5LFxuICAgIGFsaWFzZXM6IGFsaWFzZXMkNCxcbiAgICBleHRlbnNpb25zOiBleHRlbnNpb25zJGQsXG4gICAgZmlsZW5hbWVzOiBmaWxlbmFtZXMkMixcbiAgICBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJGQsXG4gICAgJ2RlZmF1bHQnOiBKU09OX3dpdGhfQ29tbWVudHNcbiAgfSk7XG5cbiAgdmFyIG5hbWUkZiA9IFwiSlNPTjVcIjtcbiAgdmFyIHR5cGUkZSA9IFwiZGF0YVwiO1xuICB2YXIgZXh0ZW5zaW9ucyRlID0gW1xuICBcdFwiLmpzb241XCJcbiAgXTtcbiAgdmFyIHRtU2NvcGUkZSA9IFwic291cmNlLmpzXCI7XG4gIHZhciBhY2VNb2RlJGUgPSBcImphdmFzY3JpcHRcIjtcbiAgdmFyIGNvZGVtaXJyb3JNb2RlJGEgPSBcImphdmFzY3JpcHRcIjtcbiAgdmFyIGNvZGVtaXJyb3JNaW1lVHlwZSRhID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gIHZhciBsYW5ndWFnZUlkJGUgPSAxNzU7XG4gIHZhciBKU09ONSA9IHtcbiAgXHRuYW1lOiBuYW1lJGYsXG4gIFx0dHlwZTogdHlwZSRlLFxuICBcdGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMkZSxcbiAgXHR0bVNjb3BlOiB0bVNjb3BlJGUsXG4gIFx0YWNlTW9kZTogYWNlTW9kZSRlLFxuICBcdGNvZGVtaXJyb3JNb2RlOiBjb2RlbWlycm9yTW9kZSRhLFxuICBcdGNvZGVtaXJyb3JNaW1lVHlwZTogY29kZW1pcnJvck1pbWVUeXBlJGEsXG4gIFx0bGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZCRlXG4gIH07XG5cbiAgdmFyIEpTT041JDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIG5hbWU6IG5hbWUkZixcbiAgICB0eXBlOiB0eXBlJGUsXG4gICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyRlLFxuICAgIHRtU2NvcGU6IHRtU2NvcGUkZSxcbiAgICBhY2VNb2RlOiBhY2VNb2RlJGUsXG4gICAgY29kZW1pcnJvck1vZGU6IGNvZGVtaXJyb3JNb2RlJGEsXG4gICAgY29kZW1pcnJvck1pbWVUeXBlOiBjb2RlbWlycm9yTWltZVR5cGUkYSxcbiAgICBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJGUsXG4gICAgJ2RlZmF1bHQnOiBKU09ONVxuICB9KTtcblxuICB2YXIgcmVxdWlyZSQkMCQ2ID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShKYXZhU2NyaXB0JDEpO1xuXG4gIHZhciByZXF1aXJlJCQxJDIgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKEpTWCQxKTtcblxuICB2YXIgcmVxdWlyZSQkMiQxID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShUeXBlU2NyaXB0JDEpO1xuXG4gIHZhciByZXF1aXJlJCQzJDEgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKFRTWCQxKTtcblxuICB2YXIgcmVxdWlyZSQkNCA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoX0pTT04kMSk7XG5cbiAgdmFyIHJlcXVpcmUkJDUgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKEpTT05fd2l0aF9Db21tZW50cyQxKTtcblxuICB2YXIgcmVxdWlyZSQkNiA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoSlNPTjUkMSk7XG5cbiAgY29uc3QgbGFuZ3VhZ2VzJDQgPSBbY3JlYXRlTGFuZ3VhZ2UocmVxdWlyZSQkMCQ2LCBkYXRhID0+ICh7XG4gICAgc2luY2U6IFwiMC4wLjBcIixcbiAgICBwYXJzZXJzOiBbXCJiYWJlbFwiLCBcImZsb3dcIl0sXG4gICAgdnNjb2RlTGFuZ3VhZ2VJZHM6IFtcImphdmFzY3JpcHRcIiwgXCJtb25nb1wiXSxcbiAgICBpbnRlcnByZXRlcnM6IGRhdGEuaW50ZXJwcmV0ZXJzLmNvbmNhdChbXCJub2RlanNcIl0pXG4gIH0pKSwgY3JlYXRlTGFuZ3VhZ2UocmVxdWlyZSQkMCQ2LCAoKSA9PiAoe1xuICAgIG5hbWU6IFwiRmxvd1wiLFxuICAgIHNpbmNlOiBcIjAuMC4wXCIsXG4gICAgcGFyc2VyczogW1wiYmFiZWxcIiwgXCJmbG93XCJdLFxuICAgIHZzY29kZUxhbmd1YWdlSWRzOiBbXCJqYXZhc2NyaXB0XCJdLFxuICAgIGFsaWFzZXM6IFtdLFxuICAgIGZpbGVuYW1lczogW10sXG4gICAgZXh0ZW5zaW9uczogW1wiLmpzLmZsb3dcIl1cbiAgfSkpLCBjcmVhdGVMYW5ndWFnZShyZXF1aXJlJCQxJDIsICgpID0+ICh7XG4gICAgc2luY2U6IFwiMC4wLjBcIixcbiAgICBwYXJzZXJzOiBbXCJiYWJlbFwiLCBcImZsb3dcIl0sXG4gICAgdnNjb2RlTGFuZ3VhZ2VJZHM6IFtcImphdmFzY3JpcHRyZWFjdFwiXVxuICB9KSksIGNyZWF0ZUxhbmd1YWdlKHJlcXVpcmUkJDIkMSwgKCkgPT4gKHtcbiAgICBzaW5jZTogXCIxLjQuMFwiLFxuICAgIHBhcnNlcnM6IFtcInR5cGVzY3JpcHRcIiwgXCJiYWJlbC10c1wiXSxcbiAgICB2c2NvZGVMYW5ndWFnZUlkczogW1widHlwZXNjcmlwdFwiXVxuICB9KSksIGNyZWF0ZUxhbmd1YWdlKHJlcXVpcmUkJDMkMSwgKCkgPT4gKHtcbiAgICBzaW5jZTogXCIxLjQuMFwiLFxuICAgIHBhcnNlcnM6IFtcInR5cGVzY3JpcHRcIiwgXCJiYWJlbC10c1wiXSxcbiAgICB2c2NvZGVMYW5ndWFnZUlkczogW1widHlwZXNjcmlwdHJlYWN0XCJdXG4gIH0pKSwgY3JlYXRlTGFuZ3VhZ2UocmVxdWlyZSQkNCwgKCkgPT4gKHtcbiAgICBuYW1lOiBcIkpTT04uc3RyaW5naWZ5XCIsXG4gICAgc2luY2U6IFwiMS4xMy4wXCIsXG4gICAgcGFyc2VyczogW1wianNvbi1zdHJpbmdpZnlcIl0sXG4gICAgdnNjb2RlTGFuZ3VhZ2VJZHM6IFtcImpzb25cIl0sXG4gICAgZXh0ZW5zaW9uczogW10sXG4gICAgLy8gLmpzb24gZmlsZSBkZWZhdWx0cyB0byBqc29uIGluc3RlYWQgb2YganNvbi1zdHJpbmdpZnlcbiAgICBmaWxlbmFtZXM6IFtcInBhY2thZ2UuanNvblwiLCBcInBhY2thZ2UtbG9jay5qc29uXCIsIFwiY29tcG9zZXIuanNvblwiXVxuICB9KSksIGNyZWF0ZUxhbmd1YWdlKHJlcXVpcmUkJDQsIGRhdGEgPT4gKHtcbiAgICBzaW5jZTogXCIxLjUuMFwiLFxuICAgIHBhcnNlcnM6IFtcImpzb25cIl0sXG4gICAgdnNjb2RlTGFuZ3VhZ2VJZHM6IFtcImpzb25cIl0sXG4gICAgZmlsZW5hbWVzOiBkYXRhLmZpbGVuYW1lcy5jb25jYXQoW1wiLnByZXR0aWVycmNcIl0pXG4gIH0pKSwgY3JlYXRlTGFuZ3VhZ2UocmVxdWlyZSQkNSwgZGF0YSA9PiAoe1xuICAgIHNpbmNlOiBcIjEuNS4wXCIsXG4gICAgcGFyc2VyczogW1wianNvblwiXSxcbiAgICB2c2NvZGVMYW5ndWFnZUlkczogW1wianNvbmNcIl0sXG4gICAgZmlsZW5hbWVzOiBkYXRhLmZpbGVuYW1lcy5jb25jYXQoW1wiLmVzbGludHJjXCJdKVxuICB9KSksIGNyZWF0ZUxhbmd1YWdlKHJlcXVpcmUkJDYsICgpID0+ICh7XG4gICAgc2luY2U6IFwiMS4xMy4wXCIsXG4gICAgcGFyc2VyczogW1wianNvbjVcIl0sXG4gICAgdnNjb2RlTGFuZ3VhZ2VJZHM6IFtcImpzb241XCJdXG4gIH0pKV07XG4gIGNvbnN0IHByaW50ZXJzJDQgPSB7XG4gICAgZXN0cmVlOiBwcmludGVyRXN0cmVlLFxuICAgIFwiZXN0cmVlLWpzb25cIjogcHJpbnRlckVzdHJlZUpzb25cbiAgfTtcbiAgdmFyIGxhbmd1YWdlSnMgPSB7XG4gICAgbGFuZ3VhZ2VzOiBsYW5ndWFnZXMkNCxcbiAgICBvcHRpb25zOiBvcHRpb25zJDUsXG4gICAgcHJpbnRlcnM6IHByaW50ZXJzJDRcbiAgfTtcblxuICB2YXIganNvbiQxID0ge1xuICAgIFwiY2prUGF0dGVyblwiOiBcIltcXFxcdTAyZWEtXFxcXHUwMmViXFxcXHUxMTAwLVxcXFx1MTFmZlxcXFx1MmU4MC1cXFxcdTJlOTlcXFxcdTJlOWItXFxcXHUyZWYzXFxcXHUyZjAwLVxcXFx1MmZkNVxcXFx1MzAwMC1cXFxcdTMwM2ZcXFxcdTMwNDEtXFxcXHUzMDk2XFxcXHUzMDk5LVxcXFx1MzA5ZlxcXFx1MzBhMS1cXFxcdTMwZmFcXFxcdTMwZmMtXFxcXHUzMGZmXFxcXHUzMTA1LVxcXFx1MzEyZlxcXFx1MzEzMS1cXFxcdTMxOGVcXFxcdTMxOTAtXFxcXHUzMTkxXFxcXHUzMTk2LVxcXFx1MzFiYVxcXFx1MzFjMC1cXFxcdTMxZTNcXFxcdTMxZjAtXFxcXHUzMjFlXFxcXHUzMjJhLVxcXFx1MzI0N1xcXFx1MzI2MC1cXFxcdTMyN2VcXFxcdTMyOGEtXFxcXHUzMmIwXFxcXHUzMmMwLVxcXFx1MzJjYlxcXFx1MzJkMC1cXFxcdTMzNzBcXFxcdTMzN2ItXFxcXHUzMzdmXFxcXHUzM2UwLVxcXFx1MzNmZVxcXFx1MzQwMC1cXFxcdTRkYjVcXFxcdTRlMDAtXFxcXHU5ZmVmXFxcXHVhOTYwLVxcXFx1YTk3Y1xcXFx1YWMwMC1cXFxcdWQ3YTNcXFxcdWQ3YjAtXFxcXHVkN2M2XFxcXHVkN2NiLVxcXFx1ZDdmYlxcXFx1ZjkwMC1cXFxcdWZhNmRcXFxcdWZhNzAtXFxcXHVmYWQ5XFxcXHVmZTEwLVxcXFx1ZmUxZlxcXFx1ZmUzMC1cXFxcdWZlNmZcXFxcdWZmMDAtXFxcXHVmZmVmXXxbXFxcXHVkODQwLVxcXFx1ZDg2OFxcXFx1ZDg2YS1cXFxcdWQ4NmNcXFxcdWQ4NmYtXFxcXHVkODcyXFxcXHVkODc0LVxcXFx1ZDg3OV1bXFxcXHVkYzAwLVxcXFx1ZGZmZl18XFxcXHVkODJjW1xcXFx1ZGMwMC1cXFxcdWRkMWVcXFxcdWRkNTAtXFxcXHVkZDUyXFxcXHVkZDY0LVxcXFx1ZGQ2N118XFxcXHVkODNjW1xcXFx1ZGUwMFxcXFx1ZGU1MC1cXFxcdWRlNTFdfFxcXFx1ZDg2OVtcXFxcdWRjMDAtXFxcXHVkZWQ2XFxcXHVkZjAwLVxcXFx1ZGZmZl18XFxcXHVkODZkW1xcXFx1ZGMwMC1cXFxcdWRmMzRcXFxcdWRmNDAtXFxcXHVkZmZmXXxcXFxcdWQ4NmVbXFxcXHVkYzAwLVxcXFx1ZGMxZFxcXFx1ZGMyMC1cXFxcdWRmZmZdfFxcXFx1ZDg3M1tcXFxcdWRjMDAtXFxcXHVkZWExXFxcXHVkZWIwLVxcXFx1ZGZmZl18XFxcXHVkODdhW1xcXFx1ZGMwMC1cXFxcdWRmZTBdfFxcXFx1ZDg3ZVtcXFxcdWRjMDAtXFxcXHVkZTFkXVwiLFxuICAgIFwia1BhdHRlcm5cIjogXCJbXFxcXHUxMTAwLVxcXFx1MTFmZlxcXFx1MzAwMS1cXFxcdTMwMDNcXFxcdTMwMDgtXFxcXHUzMDExXFxcXHUzMDEzLVxcXFx1MzAxZlxcXFx1MzAyZS1cXFxcdTMwMzBcXFxcdTMwMzdcXFxcdTMwZmJcXFxcdTMxMzEtXFxcXHUzMThlXFxcXHUzMjAwLVxcXFx1MzIxZVxcXFx1MzI2MC1cXFxcdTMyN2VcXFxcdWE5NjAtXFxcXHVhOTdjXFxcXHVhYzAwLVxcXFx1ZDdhM1xcXFx1ZDdiMC1cXFxcdWQ3YzZcXFxcdWQ3Y2ItXFxcXHVkN2ZiXFxcXHVmZTQ1LVxcXFx1ZmU0NlxcXFx1ZmY2MS1cXFxcdWZmNjVcXFxcdWZmYTAtXFxcXHVmZmJlXFxcXHVmZmMyLVxcXFx1ZmZjN1xcXFx1ZmZjYS1cXFxcdWZmY2ZcXFxcdWZmZDItXFxcXHVmZmQ3XFxcXHVmZmRhLVxcXFx1ZmZkY11cIixcbiAgICBcInB1bmN0dWF0aW9uUGF0dGVyblwiOiBcIltcXFxcdTAwMjEtXFxcXHUwMDJmXFxcXHUwMDNhLVxcXFx1MDA0MFxcXFx1MDA1Yi1cXFxcdTAwNjBcXFxcdTAwN2ItXFxcXHUwMDdlXFxcXHUwMGExXFxcXHUwMGE3XFxcXHUwMGFiXFxcXHUwMGI2LVxcXFx1MDBiN1xcXFx1MDBiYlxcXFx1MDBiZlxcXFx1MDM3ZVxcXFx1MDM4N1xcXFx1MDU1YS1cXFxcdTA1NWZcXFxcdTA1ODktXFxcXHUwNThhXFxcXHUwNWJlXFxcXHUwNWMwXFxcXHUwNWMzXFxcXHUwNWM2XFxcXHUwNWYzLVxcXFx1MDVmNFxcXFx1MDYwOS1cXFxcdTA2MGFcXFxcdTA2MGMtXFxcXHUwNjBkXFxcXHUwNjFiXFxcXHUwNjFlLVxcXFx1MDYxZlxcXFx1MDY2YS1cXFxcdTA2NmRcXFxcdTA2ZDRcXFxcdTA3MDAtXFxcXHUwNzBkXFxcXHUwN2Y3LVxcXFx1MDdmOVxcXFx1MDgzMC1cXFxcdTA4M2VcXFxcdTA4NWVcXFxcdTA5NjQtXFxcXHUwOTY1XFxcXHUwOTcwXFxcXHUwOWZkXFxcXHUwYTc2XFxcXHUwYWYwXFxcXHUwYzc3XFxcXHUwYzg0XFxcXHUwZGY0XFxcXHUwZTRmXFxcXHUwZTVhLVxcXFx1MGU1YlxcXFx1MGYwNC1cXFxcdTBmMTJcXFxcdTBmMTRcXFxcdTBmM2EtXFxcXHUwZjNkXFxcXHUwZjg1XFxcXHUwZmQwLVxcXFx1MGZkNFxcXFx1MGZkOS1cXFxcdTBmZGFcXFxcdTEwNGEtXFxcXHUxMDRmXFxcXHUxMGZiXFxcXHUxMzYwLVxcXFx1MTM2OFxcXFx1MTQwMFxcXFx1MTY2ZVxcXFx1MTY5Yi1cXFxcdTE2OWNcXFxcdTE2ZWItXFxcXHUxNmVkXFxcXHUxNzM1LVxcXFx1MTczNlxcXFx1MTdkNC1cXFxcdTE3ZDZcXFxcdTE3ZDgtXFxcXHUxN2RhXFxcXHUxODAwLVxcXFx1MTgwYVxcXFx1MTk0NC1cXFxcdTE5NDVcXFxcdTFhMWUtXFxcXHUxYTFmXFxcXHUxYWEwLVxcXFx1MWFhNlxcXFx1MWFhOC1cXFxcdTFhYWRcXFxcdTFiNWEtXFxcXHUxYjYwXFxcXHUxYmZjLVxcXFx1MWJmZlxcXFx1MWMzYi1cXFxcdTFjM2ZcXFxcdTFjN2UtXFxcXHUxYzdmXFxcXHUxY2MwLVxcXFx1MWNjN1xcXFx1MWNkM1xcXFx1MjAxMC1cXFxcdTIwMjdcXFxcdTIwMzAtXFxcXHUyMDQzXFxcXHUyMDQ1LVxcXFx1MjA1MVxcXFx1MjA1My1cXFxcdTIwNWVcXFxcdTIwN2QtXFxcXHUyMDdlXFxcXHUyMDhkLVxcXFx1MjA4ZVxcXFx1MjMwOC1cXFxcdTIzMGJcXFxcdTIzMjktXFxcXHUyMzJhXFxcXHUyNzY4LVxcXFx1Mjc3NVxcXFx1MjdjNS1cXFxcdTI3YzZcXFxcdTI3ZTYtXFxcXHUyN2VmXFxcXHUyOTgzLVxcXFx1Mjk5OFxcXFx1MjlkOC1cXFxcdTI5ZGJcXFxcdTI5ZmMtXFxcXHUyOWZkXFxcXHUyY2Y5LVxcXFx1MmNmY1xcXFx1MmNmZS1cXFxcdTJjZmZcXFxcdTJkNzBcXFxcdTJlMDAtXFxcXHUyZTJlXFxcXHUyZTMwLVxcXFx1MmU0ZlxcXFx1MzAwMS1cXFxcdTMwMDNcXFxcdTMwMDgtXFxcXHUzMDExXFxcXHUzMDE0LVxcXFx1MzAxZlxcXFx1MzAzMFxcXFx1MzAzZFxcXFx1MzBhMFxcXFx1MzBmYlxcXFx1YTRmZS1cXFxcdWE0ZmZcXFxcdWE2MGQtXFxcXHVhNjBmXFxcXHVhNjczXFxcXHVhNjdlXFxcXHVhNmYyLVxcXFx1YTZmN1xcXFx1YTg3NC1cXFxcdWE4NzdcXFxcdWE4Y2UtXFxcXHVhOGNmXFxcXHVhOGY4LVxcXFx1YThmYVxcXFx1YThmY1xcXFx1YTkyZS1cXFxcdWE5MmZcXFxcdWE5NWZcXFxcdWE5YzEtXFxcXHVhOWNkXFxcXHVhOWRlLVxcXFx1YTlkZlxcXFx1YWE1Yy1cXFxcdWFhNWZcXFxcdWFhZGUtXFxcXHVhYWRmXFxcXHVhYWYwLVxcXFx1YWFmMVxcXFx1YWJlYlxcXFx1ZmQzZS1cXFxcdWZkM2ZcXFxcdWZlMTAtXFxcXHVmZTE5XFxcXHVmZTMwLVxcXFx1ZmU1MlxcXFx1ZmU1NC1cXFxcdWZlNjFcXFxcdWZlNjNcXFxcdWZlNjhcXFxcdWZlNmEtXFxcXHVmZTZiXFxcXHVmZjAxLVxcXFx1ZmYwM1xcXFx1ZmYwNS1cXFxcdWZmMGFcXFxcdWZmMGMtXFxcXHVmZjBmXFxcXHVmZjFhLVxcXFx1ZmYxYlxcXFx1ZmYxZi1cXFxcdWZmMjBcXFxcdWZmM2ItXFxcXHVmZjNkXFxcXHVmZjNmXFxcXHVmZjViXFxcXHVmZjVkXFxcXHVmZjVmLVxcXFx1ZmY2NV18XFxcXHVkODAwW1xcXFx1ZGQwMC1cXFxcdWRkMDJcXFxcdWRmOWZcXFxcdWRmZDBdfFxcXFx1ZDgwMVtcXFxcdWRkNmZdfFxcXFx1ZDgwMltcXFxcdWRjNTdcXFxcdWRkMWZcXFxcdWRkM2ZcXFxcdWRlNTAtXFxcXHVkZTU4XFxcXHVkZTdmXFxcXHVkZWYwLVxcXFx1ZGVmNlxcXFx1ZGYzOS1cXFxcdWRmM2ZcXFxcdWRmOTktXFxcXHVkZjljXXxcXFxcdWQ4MDNbXFxcXHVkZjU1LVxcXFx1ZGY1OV18XFxcXHVkODA0W1xcXFx1ZGM0Ny1cXFxcdWRjNGRcXFxcdWRjYmItXFxcXHVkY2JjXFxcXHVkY2JlLVxcXFx1ZGNjMVxcXFx1ZGQ0MC1cXFxcdWRkNDNcXFxcdWRkNzQtXFxcXHVkZDc1XFxcXHVkZGM1LVxcXFx1ZGRjOFxcXFx1ZGRjZFxcXFx1ZGRkYlxcXFx1ZGRkZC1cXFxcdWRkZGZcXFxcdWRlMzgtXFxcXHVkZTNkXFxcXHVkZWE5XXxcXFxcdWQ4MDVbXFxcXHVkYzRiLVxcXFx1ZGM0ZlxcXFx1ZGM1YlxcXFx1ZGM1ZFxcXFx1ZGNjNlxcXFx1ZGRjMS1cXFxcdWRkZDdcXFxcdWRlNDEtXFxcXHVkZTQzXFxcXHVkZTYwLVxcXFx1ZGU2Y1xcXFx1ZGYzYy1cXFxcdWRmM2VdfFxcXFx1ZDgwNltcXFxcdWRjM2JcXFxcdWRkZTJcXFxcdWRlM2YtXFxcXHVkZTQ2XFxcXHVkZTlhLVxcXFx1ZGU5Y1xcXFx1ZGU5ZS1cXFxcdWRlYTJdfFxcXFx1ZDgwN1tcXFxcdWRjNDEtXFxcXHVkYzQ1XFxcXHVkYzcwLVxcXFx1ZGM3MVxcXFx1ZGVmNy1cXFxcdWRlZjhcXFxcdWRmZmZdfFxcXFx1ZDgwOVtcXFxcdWRjNzAtXFxcXHVkYzc0XXxcXFxcdWQ4MWFbXFxcXHVkZTZlLVxcXFx1ZGU2ZlxcXFx1ZGVmNVxcXFx1ZGYzNy1cXFxcdWRmM2JcXFxcdWRmNDRdfFxcXFx1ZDgxYltcXFxcdWRlOTctXFxcXHVkZTlhXFxcXHVkZmUyXXxcXFxcdWQ4MmZbXFxcXHVkYzlmXXxcXFxcdWQ4MzZbXFxcXHVkZTg3LVxcXFx1ZGU4Yl18XFxcXHVkODNhW1xcXFx1ZGQ1ZS1cXFxcdWRkNWZdXCJcbiAgfTtcblxuICBjb25zdCB7XG4gICAgY2prUGF0dGVybixcbiAgICBrUGF0dGVybixcbiAgICBwdW5jdHVhdGlvblBhdHRlcm5cbiAgfSA9IGpzb24kMTtcbiAgY29uc3Qge1xuICAgIGdldExhc3Q6IGdldExhc3QkNFxuICB9ID0gdXRpbCQxO1xuICBjb25zdCBJTkxJTkVfTk9ERV9UWVBFUyA9IFtcImxpcXVpZE5vZGVcIiwgXCJpbmxpbmVDb2RlXCIsIFwiZW1waGFzaXNcIiwgXCJzdHJvbmdcIiwgXCJkZWxldGVcIiwgXCJsaW5rXCIsIFwibGlua1JlZmVyZW5jZVwiLCBcImltYWdlXCIsIFwiaW1hZ2VSZWZlcmVuY2VcIiwgXCJmb290bm90ZVwiLCBcImZvb3Rub3RlUmVmZXJlbmNlXCIsIFwic2VudGVuY2VcIiwgXCJ3aGl0ZXNwYWNlXCIsIFwid29yZFwiLCBcImJyZWFrXCIsIFwiaW5saW5lTWF0aFwiXTtcbiAgY29uc3QgSU5MSU5FX05PREVfV1JBUFBFUl9UWVBFUyA9IElOTElORV9OT0RFX1RZUEVTLmNvbmNhdChbXCJ0YWJsZUNlbGxcIiwgXCJwYXJhZ3JhcGhcIiwgXCJoZWFkaW5nXCJdKTtcbiAgY29uc3Qga1JlZ2V4ID0gbmV3IFJlZ0V4cChrUGF0dGVybik7XG4gIGNvbnN0IHB1bmN0dWF0aW9uUmVnZXggPSBuZXcgUmVnRXhwKHB1bmN0dWF0aW9uUGF0dGVybik7XG4gIC8qKlxuICAgKiBzcGxpdCB0ZXh0IGludG8gd2hpdGVzcGFjZXMgYW5kIHdvcmRzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqIEByZXR1cm4ge0FycmF5PHsgdHlwZTogXCJ3aGl0ZXNwYWNlXCIsIHZhbHVlOiBcIiBcIiB8IFwiXFxuXCIgfCBcIlwiIH0gfCB7IHR5cGU6IFwid29yZFwiLCB2YWx1ZTogc3RyaW5nIH0+fVxuICAgKi9cblxuICBmdW5jdGlvbiBzcGxpdFRleHQodGV4dCwgb3B0aW9ucykge1xuICAgIGNvbnN0IEtJTkRfTk9OX0NKSyA9IFwibm9uLWNqa1wiO1xuICAgIGNvbnN0IEtJTkRfQ0pfTEVUVEVSID0gXCJjai1sZXR0ZXJcIjtcbiAgICBjb25zdCBLSU5EX0tfTEVUVEVSID0gXCJrLWxldHRlclwiO1xuICAgIGNvbnN0IEtJTkRfQ0pLX1BVTkNUVUFUSU9OID0gXCJjamstcHVuY3R1YXRpb25cIjtcbiAgICBjb25zdCBub2RlcyA9IFtdO1xuICAgIChvcHRpb25zLnByb3NlV3JhcCA9PT0gXCJwcmVzZXJ2ZVwiID8gdGV4dCA6IHRleHQucmVwbGFjZShuZXcgUmVnRXhwKFwiKFwiLmNvbmNhdChjamtQYXR0ZXJuLCBcIilcXG4oXCIpLmNvbmNhdChjamtQYXR0ZXJuLCBcIilcIiksIFwiZ1wiKSwgXCIkMSQyXCIpKS5zcGxpdCgvKFsgXFx0XFxuXSspLykuZm9yRWFjaCgodG9rZW4sIGluZGV4LCB0b2tlbnMpID0+IHtcbiAgICAgIC8vIHdoaXRlc3BhY2VcbiAgICAgIGlmIChpbmRleCAlIDIgPT09IDEpIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ3aGl0ZXNwYWNlXCIsXG4gICAgICAgICAgdmFsdWU6IC9cXG4vLnRlc3QodG9rZW4pID8gXCJcXG5cIiA6IFwiIFwiXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIHdvcmQgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2VcblxuXG4gICAgICBpZiAoKGluZGV4ID09PSAwIHx8IGluZGV4ID09PSB0b2tlbnMubGVuZ3RoIC0gMSkgJiYgdG9rZW4gPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0b2tlbi5zcGxpdChuZXcgUmVnRXhwKFwiKFwiLmNvbmNhdChjamtQYXR0ZXJuLCBcIilcIikpKS5mb3JFYWNoKChpbm5lclRva2VuLCBpbm5lckluZGV4LCBpbm5lclRva2VucykgPT4ge1xuICAgICAgICBpZiAoKGlubmVySW5kZXggPT09IDAgfHwgaW5uZXJJbmRleCA9PT0gaW5uZXJUb2tlbnMubGVuZ3RoIC0gMSkgJiYgaW5uZXJUb2tlbiA9PT0gXCJcIikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBub24tQ0pLIHdvcmRcblxuXG4gICAgICAgIGlmIChpbm5lckluZGV4ICUgMiA9PT0gMCkge1xuICAgICAgICAgIGlmIChpbm5lclRva2VuICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBhcHBlbmROb2RlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ3b3JkXCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBpbm5lclRva2VuLFxuICAgICAgICAgICAgICBraW5kOiBLSU5EX05PTl9DSkssXG4gICAgICAgICAgICAgIGhhc0xlYWRpbmdQdW5jdHVhdGlvbjogcHVuY3R1YXRpb25SZWdleC50ZXN0KGlubmVyVG9rZW5bMF0pLFxuICAgICAgICAgICAgICBoYXNUcmFpbGluZ1B1bmN0dWF0aW9uOiBwdW5jdHVhdGlvblJlZ2V4LnRlc3QoZ2V0TGFzdCQ0KGlubmVyVG9rZW4pKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIENKSyBjaGFyYWN0ZXJcblxuXG4gICAgICAgIGFwcGVuZE5vZGUocHVuY3R1YXRpb25SZWdleC50ZXN0KGlubmVyVG9rZW4pID8ge1xuICAgICAgICAgIHR5cGU6IFwid29yZFwiLFxuICAgICAgICAgIHZhbHVlOiBpbm5lclRva2VuLFxuICAgICAgICAgIGtpbmQ6IEtJTkRfQ0pLX1BVTkNUVUFUSU9OLFxuICAgICAgICAgIGhhc0xlYWRpbmdQdW5jdHVhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBoYXNUcmFpbGluZ1B1bmN0dWF0aW9uOiB0cnVlXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgdHlwZTogXCJ3b3JkXCIsXG4gICAgICAgICAgdmFsdWU6IGlubmVyVG9rZW4sXG4gICAgICAgICAga2luZDoga1JlZ2V4LnRlc3QoaW5uZXJUb2tlbikgPyBLSU5EX0tfTEVUVEVSIDogS0lORF9DSl9MRVRURVIsXG4gICAgICAgICAgaGFzTGVhZGluZ1B1bmN0dWF0aW9uOiBmYWxzZSxcbiAgICAgICAgICBoYXNUcmFpbGluZ1B1bmN0dWF0aW9uOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBub2RlcztcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE5vZGUobm9kZSkge1xuICAgICAgY29uc3QgbGFzdE5vZGUgPSBnZXRMYXN0JDQobm9kZXMpO1xuXG4gICAgICBpZiAobGFzdE5vZGUgJiYgbGFzdE5vZGUudHlwZSA9PT0gXCJ3b3JkXCIpIHtcbiAgICAgICAgaWYgKGxhc3ROb2RlLmtpbmQgPT09IEtJTkRfTk9OX0NKSyAmJiBub2RlLmtpbmQgPT09IEtJTkRfQ0pfTEVUVEVSICYmICFsYXN0Tm9kZS5oYXNUcmFpbGluZ1B1bmN0dWF0aW9uIHx8IGxhc3ROb2RlLmtpbmQgPT09IEtJTkRfQ0pfTEVUVEVSICYmIG5vZGUua2luZCA9PT0gS0lORF9OT05fQ0pLICYmICFub2RlLmhhc0xlYWRpbmdQdW5jdHVhdGlvbikge1xuICAgICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ3aGl0ZXNwYWNlXCIsXG4gICAgICAgICAgICB2YWx1ZTogXCIgXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNCZXR3ZWVuKEtJTkRfTk9OX0NKSywgS0lORF9DSktfUFVOQ1RVQVRJT04pICYmIC8vIGRpc2FsbG93IGxlYWRpbmcvdHJhaWxpbmcgZnVsbC13aWR0aCB3aGl0ZXNwYWNlXG4gICAgICAgICFbbGFzdE5vZGUudmFsdWUsIG5vZGUudmFsdWVdLnNvbWUodmFsdWUgPT4gL1xcdTMwMDAvLnRlc3QodmFsdWUpKSkge1xuICAgICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ3aGl0ZXNwYWNlXCIsXG4gICAgICAgICAgICB2YWx1ZTogXCJcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG5cbiAgICAgIGZ1bmN0aW9uIGlzQmV0d2VlbihraW5kMSwga2luZDIpIHtcbiAgICAgICAgcmV0dXJuIGxhc3ROb2RlLmtpbmQgPT09IGtpbmQxICYmIG5vZGUua2luZCA9PT0ga2luZDIgfHwgbGFzdE5vZGUua2luZCA9PT0ga2luZDIgJiYgbm9kZS5raW5kID09PSBraW5kMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRPcmRlcmVkTGlzdEl0ZW1JbmZvKG9yZGVyTGlzdEl0ZW0sIG9yaWdpbmFsVGV4dCkge1xuICAgIGNvbnN0IFssIG51bWJlclRleHQsIG1hcmtlciwgbGVhZGluZ1NwYWNlc10gPSBvcmlnaW5hbFRleHQuc2xpY2Uob3JkZXJMaXN0SXRlbS5wb3NpdGlvbi5zdGFydC5vZmZzZXQsIG9yZGVyTGlzdEl0ZW0ucG9zaXRpb24uZW5kLm9mZnNldCkubWF0Y2goL15cXHMqKFxcZCspKFxcLnxcXCkpKFxccyopLyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG51bWJlclRleHQsXG4gICAgICBtYXJrZXIsXG4gICAgICBsZWFkaW5nU3BhY2VzXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0dpdERpZmZGcmllbmRseU9yZGVyZWRMaXN0KG5vZGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW5vZGUub3JkZXJlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdE51bWJlciA9IE51bWJlcihnZXRPcmRlcmVkTGlzdEl0ZW1JbmZvKG5vZGUuY2hpbGRyZW5bMF0sIG9wdGlvbnMub3JpZ2luYWxUZXh0KS5udW1iZXJUZXh0KTtcbiAgICBjb25zdCBzZWNvbmROdW1iZXIgPSBOdW1iZXIoZ2V0T3JkZXJlZExpc3RJdGVtSW5mbyhub2RlLmNoaWxkcmVuWzFdLCBvcHRpb25zLm9yaWdpbmFsVGV4dCkubnVtYmVyVGV4dCk7XG5cbiAgICBpZiAoZmlyc3ROdW1iZXIgPT09IDAgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAyKSB7XG4gICAgICBjb25zdCB0aGlyZE51bWJlciA9IE51bWJlcihnZXRPcmRlcmVkTGlzdEl0ZW1JbmZvKG5vZGUuY2hpbGRyZW5bMl0sIG9wdGlvbnMub3JpZ2luYWxUZXh0KS5udW1iZXJUZXh0KTtcbiAgICAgIHJldHVybiBzZWNvbmROdW1iZXIgPT09IDEgJiYgdGhpcmROdW1iZXIgPT09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY29uZE51bWJlciA9PT0gMTtcbiAgfSAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vcmVtYXJranMvcmVtYXJrL2lzc3Vlcy8zNTFcbiAgLy8gbGVhZGluZyBhbmQgdHJhaWxpbmcgbmV3bGluZXMgYXJlIHN0cmlwcGVkIGJ5IHJlbWFya1xuXG5cbiAgZnVuY3Rpb24gZ2V0RmVuY2VkQ29kZUJsb2NrVmFsdWUobm9kZSwgb3JpZ2luYWxUZXh0KSB7XG4gICAgY29uc3QgdGV4dCA9IG9yaWdpbmFsVGV4dC5zbGljZShub2RlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCwgbm9kZS5wb3NpdGlvbi5lbmQub2Zmc2V0KTtcbiAgICBjb25zdCBsZWFkaW5nU3BhY2VDb3VudCA9IHRleHQubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoO1xuICAgIGNvbnN0IHJlcGxhY2VSZWdleCA9IG5ldyBSZWdFeHAoXCJeXFxcXHN7MCxcIi5jb25jYXQobGVhZGluZ1NwYWNlQ291bnQsIFwifVwiKSk7XG4gICAgY29uc3QgbGluZUNvbnRlbnRzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICBjb25zdCBtYXJrZXJTdHlsZSA9IHRleHRbbGVhZGluZ1NwYWNlQ291bnRdOyAvLyBgIG9yIH5cblxuICAgIGNvbnN0IG1hcmtlciA9IHRleHQuc2xpY2UobGVhZGluZ1NwYWNlQ291bnQpLm1hdGNoKG5ldyBSZWdFeHAoXCJeW1wiLmNvbmNhdChtYXJrZXJTdHlsZSwgXCJdK1wiKSkpWzBdOyAvLyBodHRwczovL3NwZWMuY29tbW9ubWFyay5vcmcvMC4yOC8jZXhhbXBsZS0xMDQ6IENsb3NpbmcgZmVuY2VzIG1heSBiZSBpbmRlbnRlZCBieSAwLTMgc3BhY2VzXG4gICAgLy8gaHR0cHM6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMjgvI2V4YW1wbGUtOTM6IFRoZSBjbG9zaW5nIGNvZGUgZmVuY2UgbXVzdCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBvcGVuaW5nIGZlbmNlXG5cbiAgICBjb25zdCBoYXNFbmRNYXJrZXIgPSBuZXcgUmVnRXhwKFwiXlxcXFxzezAsM31cIi5jb25jYXQobWFya2VyKSkudGVzdChsaW5lQ29udGVudHNbbGluZUNvbnRlbnRzLmxlbmd0aCAtIDFdLnNsaWNlKGdldEluZGVudChsaW5lQ29udGVudHMubGVuZ3RoIC0gMSkpKTtcbiAgICByZXR1cm4gbGluZUNvbnRlbnRzLnNsaWNlKDEsIGhhc0VuZE1hcmtlciA/IC0xIDogdW5kZWZpbmVkKS5tYXAoKHgsIGkpID0+IHguc2xpY2UoZ2V0SW5kZW50KGkgKyAxKSkucmVwbGFjZShyZXBsYWNlUmVnZXgsIFwiXCIpKS5qb2luKFwiXFxuXCIpO1xuXG4gICAgZnVuY3Rpb24gZ2V0SW5kZW50KGxpbmVJbmRleCkge1xuICAgICAgcmV0dXJuIG5vZGUucG9zaXRpb24uaW5kZW50W2xpbmVJbmRleCAtIDFdIC0gMTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYXBBc3QoYXN0LCBoYW5kbGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHByZW9yZGVyKG5vZGUsIGluZGV4LCBwYXJlbnRTdGFjaykge1xuICAgICAgcGFyZW50U3RhY2sgPSBwYXJlbnRTdGFjayB8fCBbXTtcbiAgICAgIGNvbnN0IG5ld05vZGUgPSBPYmplY3QuYXNzaWduKHt9LCBoYW5kbGVyKG5vZGUsIGluZGV4LCBwYXJlbnRTdGFjaykpO1xuXG4gICAgICBpZiAobmV3Tm9kZS5jaGlsZHJlbikge1xuICAgICAgICBuZXdOb2RlLmNoaWxkcmVuID0gbmV3Tm9kZS5jaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgIHJldHVybiBwcmVvcmRlcihjaGlsZCwgaW5kZXgsIFtuZXdOb2RlXS5jb25jYXQocGFyZW50U3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgIH0oYXN0LCBudWxsLCBudWxsKTtcbiAgfVxuXG4gIHZhciB1dGlscyQ2ID0ge1xuICAgIG1hcEFzdCxcbiAgICBzcGxpdFRleHQsXG4gICAgcHVuY3R1YXRpb25QYXR0ZXJuLFxuICAgIGdldEZlbmNlZENvZGVCbG9ja1ZhbHVlLFxuICAgIGdldE9yZGVyZWRMaXN0SXRlbUluZm8sXG4gICAgaGFzR2l0RGlmZkZyaWVuZGx5T3JkZXJlZExpc3QsXG4gICAgSU5MSU5FX05PREVfVFlQRVMsXG4gICAgSU5MSU5FX05PREVfV1JBUFBFUl9UWVBFU1xuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBidWlsZGVyczoge1xuICAgICAgaGFyZGxpbmU6IGhhcmRsaW5lJGIsXG4gICAgICBsaXRlcmFsbGluZTogbGl0ZXJhbGxpbmUkNSxcbiAgICAgIGNvbmNhdDogY29uY2F0JGYsXG4gICAgICBtYXJrQXNSb290OiBtYXJrQXNSb290JDNcbiAgICB9LFxuICAgIHV0aWxzOiB7XG4gICAgICBtYXBEb2M6IG1hcERvYyQ0XG4gICAgfVxuICB9ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHtcbiAgICBnZXRGZW5jZWRDb2RlQmxvY2tWYWx1ZTogZ2V0RmVuY2VkQ29kZUJsb2NrVmFsdWUkMVxuICB9ID0gdXRpbHMkNjtcblxuICBmdW5jdGlvbiBlbWJlZCQ0KHBhdGgsIHByaW50LCB0ZXh0VG9Eb2MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJjb2RlXCIgJiYgbm9kZS5sYW5nICE9PSBudWxsKSB7XG4gICAgICAvLyBvbmx5IGxvb2sgZm9yIHRoZSBmaXJzdCBzdHJpbmcgc28gYXMgdG8gc3VwcG9ydCBbbWFya2Rvd24tcHJldmlldy1lbmhhbmNlZF0oaHR0cHM6Ly9zaGQxMDF3eXkuZ2l0aHViLmlvL21hcmtkb3duLXByZXZpZXctZW5oYW5jZWQvIy9jb2RlLWNodW5rKVxuICAgICAgY29uc3QgbGFuZ01hdGNoID0gbm9kZS5sYW5nLm1hdGNoKC9eW0EtWmEtejAtOV8tXSsvKTtcbiAgICAgIGNvbnN0IGxhbmcgPSBsYW5nTWF0Y2ggPyBsYW5nTWF0Y2hbMF0gOiBcIlwiO1xuICAgICAgY29uc3QgcGFyc2VyID0gZ2V0UGFyc2VyTmFtZShsYW5nKTtcblxuICAgICAgaWYgKHBhcnNlcikge1xuICAgICAgICBjb25zdCBzdHlsZVVuaXQgPSBvcHRpb25zLl9faW5Kc1RlbXBsYXRlID8gXCJ+XCIgOiBcImBcIjtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZVVuaXQucmVwZWF0KE1hdGgubWF4KDMsIHV0aWwkMS5nZXRNYXhDb250aW51b3VzQ291bnQobm9kZS52YWx1ZSwgc3R5bGVVbml0KSArIDEpKTtcbiAgICAgICAgY29uc3QgZG9jID0gdGV4dFRvRG9jKGdldEZlbmNlZENvZGVCbG9ja1ZhbHVlJDEobm9kZSwgb3B0aW9ucy5vcmlnaW5hbFRleHQpLCB7XG4gICAgICAgICAgcGFyc2VyXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWFya0FzUm9vdCQzKGNvbmNhdCRmKFtzdHlsZSwgbm9kZS5sYW5nLCBoYXJkbGluZSRiLCByZXBsYWNlTmV3bGluZXNXaXRoTGl0ZXJhbGxpbmVzKGRvYyksIHN0eWxlXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09IFwieWFtbFwiKSB7XG4gICAgICByZXR1cm4gbWFya0FzUm9vdCQzKGNvbmNhdCRmKFtcIi0tLVwiLCBoYXJkbGluZSRiLCBub2RlLnZhbHVlICYmIG5vZGUudmFsdWUudHJpbSgpID8gcmVwbGFjZU5ld2xpbmVzV2l0aExpdGVyYWxsaW5lcyh0ZXh0VG9Eb2Mobm9kZS52YWx1ZSwge1xuICAgICAgICBwYXJzZXI6IFwieWFtbFwiXG4gICAgICB9KSkgOiBcIlwiLCBcIi0tLVwiXSkpO1xuICAgIH0gLy8gTURYXG5cblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwiaW1wb3J0RXhwb3J0XCI6XG4gICAgICAgIHJldHVybiB0ZXh0VG9Eb2Mobm9kZS52YWx1ZSwge1xuICAgICAgICAgIHBhcnNlcjogXCJiYWJlbFwiXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlIFwianN4XCI6XG4gICAgICAgIHJldHVybiB0ZXh0VG9Eb2MoXCI8JD5cIi5jb25jYXQobm9kZS52YWx1ZSwgXCI8LyQ+XCIpLCB7XG4gICAgICAgICAgcGFyc2VyOiBcIl9fanNfZXhwcmVzc2lvblwiLFxuICAgICAgICAgIHJvb3RNYXJrZXI6IFwibWR4XCJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgICBmdW5jdGlvbiBnZXRQYXJzZXJOYW1lKGxhbmcpIHtcbiAgICAgIGNvbnN0IHN1cHBvcnRJbmZvID0gc3VwcG9ydC5nZXRTdXBwb3J0SW5mbyh7XG4gICAgICAgIHBsdWdpbnM6IG9wdGlvbnMucGx1Z2luc1xuICAgICAgfSk7XG4gICAgICBjb25zdCBsYW5ndWFnZSA9IHN1cHBvcnRJbmZvLmxhbmd1YWdlcy5maW5kKGxhbmd1YWdlID0+IGxhbmd1YWdlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbGFuZyB8fCBsYW5ndWFnZS5hbGlhc2VzICYmIGxhbmd1YWdlLmFsaWFzZXMuaW5jbHVkZXMobGFuZykgfHwgbGFuZ3VhZ2UuZXh0ZW5zaW9ucyAmJiBsYW5ndWFnZS5leHRlbnNpb25zLmZpbmQoZXh0ID0+IGV4dCA9PT0gXCIuXCIuY29uY2F0KGxhbmcpKSk7XG5cbiAgICAgIGlmIChsYW5ndWFnZSkge1xuICAgICAgICByZXR1cm4gbGFuZ3VhZ2UucGFyc2Vyc1swXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVwbGFjZU5ld2xpbmVzV2l0aExpdGVyYWxsaW5lcyhkb2MpIHtcbiAgICAgIHJldHVybiBtYXBEb2MkNChkb2MsIGN1cnJlbnREb2MgPT4gdHlwZW9mIGN1cnJlbnREb2MgPT09IFwic3RyaW5nXCIgJiYgY3VycmVudERvYy5pbmNsdWRlcyhcIlxcblwiKSA/IGNvbmNhdCRmKGN1cnJlbnREb2Muc3BsaXQoLyhcXG4pL2cpLm1hcCgodiwgaSkgPT4gaSAlIDIgPT09IDAgPyB2IDogbGl0ZXJhbGxpbmUkNSkpIDogY3VycmVudERvYyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVtYmVkXzEkMiA9IGVtYmVkJDQ7XG5cbiAgY29uc3QgcHJhZ21hcyA9IFtcImZvcm1hdFwiLCBcInByZXR0aWVyXCJdO1xuXG4gIGZ1bmN0aW9uIHN0YXJ0V2l0aFByYWdtYSh0ZXh0KSB7XG4gICAgY29uc3QgcHJhZ21hID0gXCJAKFwiLmNvbmNhdChwcmFnbWFzLmpvaW4oXCJ8XCIpLCBcIilcIik7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFtcIjwhLS1cXFxccypcIi5jb25jYXQocHJhZ21hLCBcIlxcXFxzKi0tPlwiKSwgXCI8IS0tLipcXHI/XFxuW1xcXFxzXFxcXFNdKihefFxcbilbXlxcXFxTXFxuXSpcIi5jb25jYXQocHJhZ21hLCBcIlteXFxcXFNcXG5dKigkfFxcbilbXFxcXHNcXFxcU10qXFxuLiotLT5cIildLmpvaW4oXCJ8XCIpLCBcIm1cIik7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHRleHQubWF0Y2gocmVnZXgpO1xuICAgIHJldHVybiBtYXRjaGVkICYmIG1hdGNoZWQuaW5kZXggPT09IDA7XG4gIH1cblxuICB2YXIgcHJhZ21hJDQgPSB7XG4gICAgc3RhcnRXaXRoUHJhZ21hLFxuICAgIGhhc1ByYWdtYTogdGV4dCA9PiBzdGFydFdpdGhQcmFnbWEoZnJvbnRNYXR0ZXIodGV4dCkuY29udGVudC50cmltU3RhcnQoKSksXG4gICAgaW5zZXJ0UHJhZ21hOiB0ZXh0ID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RlZCA9IGZyb250TWF0dGVyKHRleHQpO1xuICAgICAgY29uc3QgcHJhZ21hID0gXCI8IS0tIEBcIi5jb25jYXQocHJhZ21hc1swXSwgXCIgLS0+XCIpO1xuICAgICAgcmV0dXJuIGV4dHJhY3RlZC5mcm9udE1hdHRlciA/IFwiXCIuY29uY2F0KGV4dHJhY3RlZC5mcm9udE1hdHRlci5yYXcsIFwiXFxuXFxuXCIpLmNvbmNhdChwcmFnbWEsIFwiXFxuXFxuXCIpLmNvbmNhdChleHRyYWN0ZWQuY29udGVudCkgOiBcIlwiLmNvbmNhdChwcmFnbWEsIFwiXFxuXFxuXCIpLmNvbmNhdChleHRyYWN0ZWQuY29udGVudCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBnZXRPcmRlcmVkTGlzdEl0ZW1JbmZvOiBnZXRPcmRlcmVkTGlzdEl0ZW1JbmZvJDEsXG4gICAgbWFwQXN0OiBtYXBBc3QkMSxcbiAgICBzcGxpdFRleHQ6IHNwbGl0VGV4dCQxXG4gIH0gPSB1dGlscyQ2OyAvLyAweDAgfiAweDEwZmZmZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuXG4gIGNvbnN0IGlzU2luZ2xlQ2hhclJlZ2V4ID0gL14oW1xcdTAwMDAtXFx1ZmZmZl18W1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSkkLztcblxuICBmdW5jdGlvbiBwcmVwcm9jZXNzJDIoYXN0LCBvcHRpb25zKSB7XG4gICAgYXN0ID0gcmVzdG9yZVVuZXNjYXBlZENoYXJhY3Rlcihhc3QsIG9wdGlvbnMpO1xuICAgIGFzdCA9IG1lcmdlQ29udGludW91c1RleHRzKGFzdCk7XG4gICAgYXN0ID0gdHJhbnNmb3JtSW5saW5lQ29kZShhc3QpO1xuICAgIGFzdCA9IHRyYW5zZm9ybUluZGVudGVkQ29kZWJsb2NrQW5kTWFya0l0c1BhcmVudExpc3QoYXN0LCBvcHRpb25zKTtcbiAgICBhc3QgPSBtYXJrQWxpZ25lZExpc3QoYXN0LCBvcHRpb25zKTtcbiAgICBhc3QgPSBzcGxpdFRleHRJbnRvU2VudGVuY2VzKGFzdCwgb3B0aW9ucyk7XG4gICAgYXN0ID0gdHJhbnNmb3JtSW1wb3J0RXhwb3J0KGFzdCk7XG4gICAgYXN0ID0gbWVyZ2VDb250aW51b3VzSW1wb3J0RXhwb3J0KGFzdCk7XG4gICAgcmV0dXJuIGFzdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybUltcG9ydEV4cG9ydChhc3QpIHtcbiAgICByZXR1cm4gbWFwQXN0JDEoYXN0LCBub2RlID0+IHtcbiAgICAgIGlmIChub2RlLnR5cGUgIT09IFwiaW1wb3J0XCIgJiYgbm9kZS50eXBlICE9PSBcImV4cG9ydFwiKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgbm9kZSwge1xuICAgICAgICB0eXBlOiBcImltcG9ydEV4cG9ydFwiXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybUlubGluZUNvZGUoYXN0KSB7XG4gICAgcmV0dXJuIG1hcEFzdCQxKGFzdCwgbm9kZSA9PiB7XG4gICAgICBpZiAobm9kZS50eXBlICE9PSBcImlubGluZUNvZGVcIikge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG5vZGUsIHtcbiAgICAgICAgdmFsdWU6IG5vZGUudmFsdWUucmVwbGFjZSgvXFxzKy9nLCBcIiBcIilcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzdG9yZVVuZXNjYXBlZENoYXJhY3Rlcihhc3QsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbWFwQXN0JDEoYXN0LCBub2RlID0+IHtcbiAgICAgIHJldHVybiBub2RlLnR5cGUgIT09IFwidGV4dFwiID8gbm9kZSA6IE9iamVjdC5hc3NpZ24oe30sIG5vZGUsIHtcbiAgICAgICAgdmFsdWU6IG5vZGUudmFsdWUgIT09IFwiKlwiICYmIG5vZGUudmFsdWUgIT09IFwiX1wiICYmIG5vZGUudmFsdWUgIT09IFwiJFwiICYmIC8vIGhhbmRsZSB0aGVzZSBjYXNlcyBpbiBwcmludGVyXG4gICAgICAgIGlzU2luZ2xlQ2hhclJlZ2V4LnRlc3Qobm9kZS52YWx1ZSkgJiYgbm9kZS5wb3NpdGlvbi5lbmQub2Zmc2V0IC0gbm9kZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgIT09IG5vZGUudmFsdWUubGVuZ3RoID8gb3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2Uobm9kZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQsIG5vZGUucG9zaXRpb24uZW5kLm9mZnNldCkgOiBub2RlLnZhbHVlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlQ29udGludW91c0ltcG9ydEV4cG9ydChhc3QpIHtcbiAgICByZXR1cm4gbWVyZ2VDaGlsZHJlbihhc3QsIChwcmV2Tm9kZSwgbm9kZSkgPT4gcHJldk5vZGUudHlwZSA9PT0gXCJpbXBvcnRFeHBvcnRcIiAmJiBub2RlLnR5cGUgPT09IFwiaW1wb3J0RXhwb3J0XCIsIChwcmV2Tm9kZSwgbm9kZSkgPT4gKHtcbiAgICAgIHR5cGU6IFwiaW1wb3J0RXhwb3J0XCIsXG4gICAgICB2YWx1ZTogcHJldk5vZGUudmFsdWUgKyBcIlxcblxcblwiICsgbm9kZS52YWx1ZSxcbiAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIHN0YXJ0OiBwcmV2Tm9kZS5wb3NpdGlvbi5zdGFydCxcbiAgICAgICAgZW5kOiBub2RlLnBvc2l0aW9uLmVuZFxuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlQ2hpbGRyZW4oYXN0LCBzaG91bGRNZXJnZSwgbWVyZ2VOb2RlKSB7XG4gICAgcmV0dXJuIG1hcEFzdCQxKGFzdCwgbm9kZSA9PiB7XG4gICAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbi5yZWR1Y2UoKGN1cnJlbnQsIGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IGN1cnJlbnRbY3VycmVudC5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAobGFzdENoaWxkICYmIHNob3VsZE1lcmdlKGxhc3RDaGlsZCwgY2hpbGQpKSB7XG4gICAgICAgICAgY3VycmVudC5zcGxpY2UoLTEsIDEsIG1lcmdlTm9kZShsYXN0Q2hpbGQsIGNoaWxkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudC5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSwgW10pO1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG5vZGUsIHtcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VDb250aW51b3VzVGV4dHMoYXN0KSB7XG4gICAgcmV0dXJuIG1lcmdlQ2hpbGRyZW4oYXN0LCAocHJldk5vZGUsIG5vZGUpID0+IHByZXZOb2RlLnR5cGUgPT09IFwidGV4dFwiICYmIG5vZGUudHlwZSA9PT0gXCJ0ZXh0XCIsIChwcmV2Tm9kZSwgbm9kZSkgPT4gKHtcbiAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgdmFsdWU6IHByZXZOb2RlLnZhbHVlICsgbm9kZS52YWx1ZSxcbiAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIHN0YXJ0OiBwcmV2Tm9kZS5wb3NpdGlvbi5zdGFydCxcbiAgICAgICAgZW5kOiBub2RlLnBvc2l0aW9uLmVuZFxuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNwbGl0VGV4dEludG9TZW50ZW5jZXMoYXN0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG1hcEFzdCQxKGFzdCwgKG5vZGUsIGluZGV4LCBbcGFyZW50Tm9kZV0pID0+IHtcbiAgICAgIGlmIChub2RlLnR5cGUgIT09IFwidGV4dFwiKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuXG4gICAgICBsZXQge1xuICAgICAgICB2YWx1ZVxuICAgICAgfSA9IG5vZGU7XG5cbiAgICAgIGlmIChwYXJlbnROb2RlLnR5cGUgPT09IFwicGFyYWdyYXBoXCIpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltU3RhcnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA9PT0gcGFyZW50Tm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltRW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJzZW50ZW5jZVwiLFxuICAgICAgICBwb3NpdGlvbjogbm9kZS5wb3NpdGlvbixcbiAgICAgICAgY2hpbGRyZW46IHNwbGl0VGV4dCQxKHZhbHVlLCBvcHRpb25zKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybUluZGVudGVkQ29kZWJsb2NrQW5kTWFya0l0c1BhcmVudExpc3QoYXN0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG1hcEFzdCQxKGFzdCwgKG5vZGUsIGluZGV4LCBwYXJlbnRTdGFjaykgPT4ge1xuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gXCJjb2RlXCIpIHtcbiAgICAgICAgLy8gdGhlIGZpcnN0IGNoYXIgbWF5IHBvaW50IHRvIGBcXG5gLCBlLmcuIGBcXG5cXHRcXHRiYXJgLCBqdXN0IGlnbm9yZSBpdFxuICAgICAgICBjb25zdCBpc0luZGVudGVkID0gL15cXG4/KCB7NCx9fFxcdCkvLnRlc3Qob3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2Uobm9kZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQsIG5vZGUucG9zaXRpb24uZW5kLm9mZnNldCkpO1xuICAgICAgICBub2RlLmlzSW5kZW50ZWQgPSBpc0luZGVudGVkO1xuXG4gICAgICAgIGlmIChpc0luZGVudGVkKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRTdGFjay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gcGFyZW50U3RhY2tbaV07IC8vIG5vIG5lZWQgdG8gY2hlY2sgY2hlY2tlZCBpdGVtc1xuXG4gICAgICAgICAgICBpZiAocGFyZW50Lmhhc0luZGVudGVkQ29kZWJsb2NrKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09IFwibGlzdFwiKSB7XG4gICAgICAgICAgICAgIHBhcmVudC5oYXNJbmRlbnRlZENvZGVibG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFya0FsaWduZWRMaXN0KGFzdCwgb3B0aW9ucykge1xuICAgIHJldHVybiBtYXBBc3QkMShhc3QsIChub2RlLCBpbmRleCwgcGFyZW50U3RhY2spID0+IHtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09IFwibGlzdFwiICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIC8vIGlmIG9uZSBvZiBpdHMgcGFyZW50cyBpcyBub3QgYWxpZ25lZCwgaXQncyBub3QgcG9zc2libGUgdG8gYmUgYWxpZ25lZCBpbiBzdWItbGlzdHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRTdGFjay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudFN0YWNrW2ldO1xuXG4gICAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSBcImxpc3RcIiAmJiAhcGFyZW50LmlzQWxpZ25lZCkge1xuICAgICAgICAgICAgbm9kZS5pc0FsaWduZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuaXNBbGlnbmVkID0gaXNBbGlnbmVkKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldExpc3RJdGVtU3RhcnQobGlzdEl0ZW0pIHtcbiAgICAgIHJldHVybiBsaXN0SXRlbS5jaGlsZHJlbi5sZW5ndGggPT09IDAgPyAtMSA6IGxpc3RJdGVtLmNoaWxkcmVuWzBdLnBvc2l0aW9uLnN0YXJ0LmNvbHVtbiAtIDE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBbGlnbmVkKGxpc3QpIHtcbiAgICAgIGlmICghbGlzdC5vcmRlcmVkKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAtIDEyM1xuICAgICAgICAgKiAtIDEyM1xuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtmaXJzdEl0ZW0sIHNlY29uZEl0ZW1dID0gbGlzdC5jaGlsZHJlbjtcbiAgICAgIGNvbnN0IGZpcnN0SW5mbyA9IGdldE9yZGVyZWRMaXN0SXRlbUluZm8kMShmaXJzdEl0ZW0sIG9wdGlvbnMub3JpZ2luYWxUZXh0KTtcblxuICAgICAgaWYgKGZpcnN0SW5mby5sZWFkaW5nU3BhY2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIDEuICAgMTIzXG4gICAgICAgICAqXG4gICAgICAgICAqIDEuICAgMTIzXG4gICAgICAgICAqIDEuIDEyM1xuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0U3RhcnQgPSBnZXRMaXN0SXRlbVN0YXJ0KGZpcnN0SXRlbSk7XG5cbiAgICAgIGlmIChmaXJzdFN0YXJ0ID09PSAtMSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogMS5cbiAgICAgICAgICpcbiAgICAgICAgICogMS5cbiAgICAgICAgICogMS5cbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxpc3QuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbGlnbmVkOlxuICAgICAgICAgKlxuICAgICAgICAgKiAxMS4gMTIzXG4gICAgICAgICAqXG4gICAgICAgICAqIG5vdCBhbGlnbmVkOlxuICAgICAgICAgKlxuICAgICAgICAgKiAxLiAxMjNcbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiBmaXJzdFN0YXJ0ICUgb3B0aW9ucy50YWJXaWR0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2Vjb25kU3RhcnQgPSBnZXRMaXN0SXRlbVN0YXJ0KHNlY29uZEl0ZW0pO1xuXG4gICAgICBpZiAoZmlyc3RTdGFydCAhPT0gc2Vjb25kU3RhcnQpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIDExLiAxMjNcbiAgICAgICAgICogMS4gMTIzXG4gICAgICAgICAqXG4gICAgICAgICAqIDEuIDEyM1xuICAgICAgICAgKiAxMS4gMTIzXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdFN0YXJ0ICUgb3B0aW9ucy50YWJXaWR0aCA9PT0gMCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogMTEuIDEyM1xuICAgICAgICAgKiAxMi4gMTIzXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogYWxpZ25lZDpcbiAgICAgICAqXG4gICAgICAgKiAxMS4gMTIzXG4gICAgICAgKiAxLiAgMTIzXG4gICAgICAgKlxuICAgICAgICogbm90IGFsaWduZWQ6XG4gICAgICAgKlxuICAgICAgICogMS4gMTIzXG4gICAgICAgKiAyLiAxMjNcbiAgICAgICAqL1xuXG5cbiAgICAgIGNvbnN0IHNlY29uZEluZm8gPSBnZXRPcmRlcmVkTGlzdEl0ZW1JbmZvJDEoc2Vjb25kSXRlbSwgb3B0aW9ucy5vcmlnaW5hbFRleHQpO1xuICAgICAgcmV0dXJuIHNlY29uZEluZm8ubGVhZGluZ1NwYWNlcy5sZW5ndGggPiAxO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcmVwcm9jZXNzXzEkMiA9IHByZXByb2Nlc3MkMjtcblxuICBjb25zdCB7XG4gICAgYnVpbGRlcnM6IHtcbiAgICAgIGJyZWFrUGFyZW50OiBicmVha1BhcmVudCQ0LFxuICAgICAgY29uY2F0OiBjb25jYXQkZyxcbiAgICAgIGpvaW46IGpvaW4kYixcbiAgICAgIGxpbmU6IGxpbmUkYSxcbiAgICAgIGxpdGVyYWxsaW5lOiBsaXRlcmFsbGluZSQ2LFxuICAgICAgbWFya0FzUm9vdDogbWFya0FzUm9vdCQ0LFxuICAgICAgaGFyZGxpbmU6IGhhcmRsaW5lJGMsXG4gICAgICBzb2Z0bGluZTogc29mdGxpbmUkNyxcbiAgICAgIGlmQnJlYWs6IGlmQnJlYWskNyxcbiAgICAgIGZpbGw6IGZpbGwkNSxcbiAgICAgIGFsaWduOiBhbGlnbiQyLFxuICAgICAgaW5kZW50OiBpbmRlbnQkOSxcbiAgICAgIGdyb3VwOiBncm91cCRmXG4gICAgfSxcbiAgICB1dGlsczoge1xuICAgICAgbWFwRG9jOiBtYXBEb2MkNVxuICAgIH0sXG4gICAgcHJpbnRlcjoge1xuICAgICAgcHJpbnREb2NUb1N0cmluZzogcHJpbnREb2NUb1N0cmluZyQzXG4gICAgfVxuICB9ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHtcbiAgICBnZXRGZW5jZWRDb2RlQmxvY2tWYWx1ZTogZ2V0RmVuY2VkQ29kZUJsb2NrVmFsdWUkMixcbiAgICBoYXNHaXREaWZmRnJpZW5kbHlPcmRlcmVkTGlzdDogaGFzR2l0RGlmZkZyaWVuZGx5T3JkZXJlZExpc3QkMSxcbiAgICBzcGxpdFRleHQ6IHNwbGl0VGV4dCQyLFxuICAgIHB1bmN0dWF0aW9uUGF0dGVybjogcHVuY3R1YXRpb25QYXR0ZXJuJDEsXG4gICAgSU5MSU5FX05PREVfVFlQRVM6IElOTElORV9OT0RFX1RZUEVTJDEsXG4gICAgSU5MSU5FX05PREVfV1JBUFBFUl9UWVBFUzogSU5MSU5FX05PREVfV1JBUFBFUl9UWVBFUyQxXG4gIH0gPSB1dGlscyQ2O1xuICBjb25zdCB7XG4gICAgcmVwbGFjZUVuZE9mTGluZVdpdGg6IHJlcGxhY2VFbmRPZkxpbmVXaXRoJDJcbiAgfSA9IHV0aWwkMTtcbiAgY29uc3QgVFJBSUxJTkdfSEFSRExJTkVfTk9ERVMgPSBbXCJpbXBvcnRFeHBvcnRcIl07XG4gIGNvbnN0IFNJTkdMRV9MSU5FX05PREVfVFlQRVMgPSBbXCJoZWFkaW5nXCIsIFwidGFibGVDZWxsXCIsIFwibGlua1wiXTtcbiAgY29uc3QgU0lCTElOR19OT0RFX1RZUEVTID0gW1wibGlzdEl0ZW1cIiwgXCJkZWZpbml0aW9uXCIsIFwiZm9vdG5vdGVEZWZpbml0aW9uXCJdO1xuXG4gIGZ1bmN0aW9uIGdlbmVyaWNQcmludCQ1KHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcblxuICAgIGlmIChzaG91bGRSZW1haW5UaGVTYW1lQ29udGVudChwYXRoKSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCRnKHNwbGl0VGV4dCQyKG9wdGlvbnMub3JpZ2luYWxUZXh0LnNsaWNlKG5vZGUucG9zaXRpb24uc3RhcnQub2Zmc2V0LCBub2RlLnBvc2l0aW9uLmVuZC5vZmZzZXQpLCBvcHRpb25zKS5tYXAobm9kZSA9PiBub2RlLnR5cGUgPT09IFwid29yZFwiID8gbm9kZS52YWx1ZSA6IG5vZGUudmFsdWUgPT09IFwiXCIgPyBcIlwiIDogcHJpbnRMaW5lKHBhdGgsIG5vZGUudmFsdWUsIG9wdGlvbnMpKSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJyb290XCI6XG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtub3JtYWxpemVEb2MocHJpbnRSb290KHBhdGgsIG9wdGlvbnMsIHByaW50KSksICFUUkFJTElOR19IQVJETElORV9OT0RFUy5pbmNsdWRlcyhnZXRMYXN0RGVzY2VuZGFudE5vZGUobm9kZSkudHlwZSkgPyBoYXJkbGluZSRjIDogXCJcIl0pO1xuXG4gICAgICBjYXNlIFwicGFyYWdyYXBoXCI6XG4gICAgICAgIHJldHVybiBwcmludENoaWxkcmVuJDIocGF0aCwgb3B0aW9ucywgcHJpbnQsIHtcbiAgICAgICAgICBwb3N0cHJvY2Vzc29yOiBmaWxsJDVcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgXCJzZW50ZW5jZVwiOlxuICAgICAgICByZXR1cm4gcHJpbnRDaGlsZHJlbiQyKHBhdGgsIG9wdGlvbnMsIHByaW50KTtcblxuICAgICAgY2FzZSBcIndvcmRcIjpcbiAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUucmVwbGFjZSgvWyokXS9nLCBcIlxcXFwkJlwiKSAvLyBlc2NhcGUgYWxsIGAqYCBhbmQgYCRgIChtYXRoKVxuICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKFtcIihefFwiLmNvbmNhdChwdW5jdHVhdGlvblBhdHRlcm4kMSwgXCIpKF8rKVwiKSwgXCIoXyspKFwiLmNvbmNhdChwdW5jdHVhdGlvblBhdHRlcm4kMSwgXCJ8JClcIildLmpvaW4oXCJ8XCIpLCBcImdcIiksIChfLCB0ZXh0MSwgdW5kZXJzY29yZTEsIHVuZGVyc2NvcmUyLCB0ZXh0MikgPT4gKHVuZGVyc2NvcmUxID8gXCJcIi5jb25jYXQodGV4dDEpLmNvbmNhdCh1bmRlcnNjb3JlMSkgOiBcIlwiLmNvbmNhdCh1bmRlcnNjb3JlMikuY29uY2F0KHRleHQyKSkucmVwbGFjZSgvXy9nLCBcIlxcXFxfXCIpKTtcbiAgICAgIC8vIGVzY2FwZSBhbGwgYF9gIGV4Y2VwdCBjb25jYXRpbmcgd2l0aCBub24tcHVuY3R1YXRpb24sIGUuZy4gYDFfMl8zYCBpcyBub3QgY29uc2lkZXJlZCBlbXBoYXNpc1xuXG4gICAgICBjYXNlIFwid2hpdGVzcGFjZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50Tm9kZS5jaGlsZHJlbi5pbmRleE9mKG5vZGUpO1xuICAgICAgICAgIGNvbnN0IG5leHROb2RlID0gcGFyZW50Tm9kZS5jaGlsZHJlbltpbmRleCArIDFdO1xuICAgICAgICAgIGNvbnN0IHByb3NlV3JhcCA9IC8vIGxlYWRpbmcgY2hhciB0aGF0IG1heSBjYXVzZSBkaWZmZXJlbnQgc3ludGF4XG4gICAgICAgICAgbmV4dE5vZGUgJiYgL14+fF4oWy0rKl18I3sxLDZ9fFswLTldK1suKV0pJC8udGVzdChuZXh0Tm9kZS52YWx1ZSkgPyBcIm5ldmVyXCIgOiBvcHRpb25zLnByb3NlV3JhcDtcbiAgICAgICAgICByZXR1cm4gcHJpbnRMaW5lKHBhdGgsIG5vZGUudmFsdWUsIHtcbiAgICAgICAgICAgIHByb3NlV3JhcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJlbXBoYXNpc1wiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50Tm9kZS5jaGlsZHJlbi5pbmRleE9mKG5vZGUpO1xuICAgICAgICAgIGNvbnN0IHByZXZOb2RlID0gcGFyZW50Tm9kZS5jaGlsZHJlbltpbmRleCAtIDFdO1xuICAgICAgICAgIGNvbnN0IG5leHROb2RlID0gcGFyZW50Tm9kZS5jaGlsZHJlbltpbmRleCArIDFdO1xuICAgICAgICAgIGNvbnN0IGhhc1ByZXZPck5leHRXb3JkID0gLy8gYDEqMiozYCBpcyBjb25zaWRlcmVkIGVtcGhhc2lzIGJ1dCBgMV8yXzNgIGlzIG5vdFxuICAgICAgICAgIHByZXZOb2RlICYmIHByZXZOb2RlLnR5cGUgPT09IFwic2VudGVuY2VcIiAmJiBwcmV2Tm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHV0aWwkMS5nZXRMYXN0KHByZXZOb2RlLmNoaWxkcmVuKS50eXBlID09PSBcIndvcmRcIiAmJiAhdXRpbCQxLmdldExhc3QocHJldk5vZGUuY2hpbGRyZW4pLmhhc1RyYWlsaW5nUHVuY3R1YXRpb24gfHwgbmV4dE5vZGUgJiYgbmV4dE5vZGUudHlwZSA9PT0gXCJzZW50ZW5jZVwiICYmIG5leHROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgbmV4dE5vZGUuY2hpbGRyZW5bMF0udHlwZSA9PT0gXCJ3b3JkXCIgJiYgIW5leHROb2RlLmNoaWxkcmVuWzBdLmhhc0xlYWRpbmdQdW5jdHVhdGlvbjtcbiAgICAgICAgICBjb25zdCBzdHlsZSA9IGhhc1ByZXZPck5leHRXb3JkIHx8IGdldEFuY2VzdG9yTm9kZSQyKHBhdGgsIFwiZW1waGFzaXNcIikgPyBcIipcIiA6IFwiX1wiO1xuICAgICAgICAgIHJldHVybiBjb25jYXQkZyhbc3R5bGUsIHByaW50Q2hpbGRyZW4kMihwYXRoLCBvcHRpb25zLCBwcmludCksIHN0eWxlXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInN0cm9uZ1wiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGcoW1wiKipcIiwgcHJpbnRDaGlsZHJlbiQyKHBhdGgsIG9wdGlvbnMsIHByaW50KSwgXCIqKlwiXSk7XG5cbiAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtcIn5+XCIsIHByaW50Q2hpbGRyZW4kMihwYXRoLCBvcHRpb25zLCBwcmludCksIFwifn5cIl0pO1xuXG4gICAgICBjYXNlIFwiaW5saW5lQ29kZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgYmFja3RpY2tDb3VudCA9IHV0aWwkMS5nZXRNaW5Ob3RQcmVzZW50Q29udGludW91c0NvdW50KG5vZGUudmFsdWUsIFwiYFwiKTtcbiAgICAgICAgICBjb25zdCBzdHlsZSA9IFwiYFwiLnJlcGVhdChiYWNrdGlja0NvdW50IHx8IDEpO1xuICAgICAgICAgIGNvbnN0IGdhcCA9IGJhY2t0aWNrQ291bnQgPyBcIiBcIiA6IFwiXCI7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtzdHlsZSwgZ2FwLCBub2RlLnZhbHVlLCBnYXAsIHN0eWxlXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcImxpbmtcIjpcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLm9yaWdpbmFsVGV4dFtub2RlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldF0pIHtcbiAgICAgICAgICBjYXNlIFwiPFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCBtYWlsdG8gPSBcIm1haWx0bzpcIjtcbiAgICAgICAgICAgICAgY29uc3QgdXJsID0gLy8gPGhlbGxvQGV4YW1wbGUuY29tPiBpcyBwYXJzZWQgYXMgeyB1cmw6IFwibWFpbHRvOmhlbGxvQGV4YW1wbGUuY29tXCIgfVxuICAgICAgICAgICAgICBub2RlLnVybC5zdGFydHNXaXRoKG1haWx0bykgJiYgb3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2Uobm9kZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgKyAxLCBub2RlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCArIDEgKyBtYWlsdG8ubGVuZ3RoKSAhPT0gbWFpbHRvID8gbm9kZS51cmwuc2xpY2UobWFpbHRvLmxlbmd0aCkgOiBub2RlLnVybDtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtcIjxcIiwgdXJsLCBcIj5cIl0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBcIltcIjpcbiAgICAgICAgICAgIHJldHVybiBjb25jYXQkZyhbXCJbXCIsIHByaW50Q2hpbGRyZW4kMihwYXRoLCBvcHRpb25zLCBwcmludCksIFwiXShcIiwgcHJpbnRVcmwobm9kZS51cmwsIFwiKVwiKSwgcHJpbnRUaXRsZShub2RlLnRpdGxlLCBvcHRpb25zKSwgXCIpXCJdKTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2Uobm9kZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQsIG5vZGUucG9zaXRpb24uZW5kLm9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZyhbXCIhW1wiLCBub2RlLmFsdCB8fCBcIlwiLCBcIl0oXCIsIHByaW50VXJsKG5vZGUudXJsLCBcIilcIiksIHByaW50VGl0bGUobm9kZS50aXRsZSwgb3B0aW9ucyksIFwiKVwiXSk7XG5cbiAgICAgIGNhc2UgXCJibG9ja3F1b3RlXCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkZyhbXCI+IFwiLCBhbGlnbiQyKFwiPiBcIiwgcHJpbnRDaGlsZHJlbiQyKHBhdGgsIG9wdGlvbnMsIHByaW50KSldKTtcblxuICAgICAgY2FzZSBcImhlYWRpbmdcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtcIiNcIi5yZXBlYXQobm9kZS5kZXB0aCkgKyBcIiBcIiwgcHJpbnRDaGlsZHJlbiQyKHBhdGgsIG9wdGlvbnMsIHByaW50KV0pO1xuXG4gICAgICBjYXNlIFwiY29kZVwiOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKG5vZGUuaXNJbmRlbnRlZCkge1xuICAgICAgICAgICAgLy8gaW5kZW50ZWQgY29kZSBibG9ja1xuICAgICAgICAgICAgY29uc3QgYWxpZ25tZW50ID0gXCIgXCIucmVwZWF0KDQpO1xuICAgICAgICAgICAgcmV0dXJuIGFsaWduJDIoYWxpZ25tZW50LCBjb25jYXQkZyhbYWxpZ25tZW50LCBjb25jYXQkZyhyZXBsYWNlRW5kT2ZMaW5lV2l0aCQyKG5vZGUudmFsdWUsIGhhcmRsaW5lJGMpKV0pKTtcbiAgICAgICAgICB9IC8vIGZlbmNlZCBjb2RlIGJsb2NrXG5cblxuICAgICAgICAgIGNvbnN0IHN0eWxlVW5pdCA9IG9wdGlvbnMuX19pbkpzVGVtcGxhdGUgPyBcIn5cIiA6IFwiYFwiO1xuICAgICAgICAgIGNvbnN0IHN0eWxlID0gc3R5bGVVbml0LnJlcGVhdChNYXRoLm1heCgzLCB1dGlsJDEuZ2V0TWF4Q29udGludW91c0NvdW50KG5vZGUudmFsdWUsIHN0eWxlVW5pdCkgKyAxKSk7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtzdHlsZSwgbm9kZS5sYW5nIHx8IFwiXCIsIGhhcmRsaW5lJGMsIGNvbmNhdCRnKHJlcGxhY2VFbmRPZkxpbmVXaXRoJDIoZ2V0RmVuY2VkQ29kZUJsb2NrVmFsdWUkMihub2RlLCBvcHRpb25zLm9yaWdpbmFsVGV4dCksIGhhcmRsaW5lJGMpKSwgaGFyZGxpbmUkYywgc3R5bGVdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwieWFtbFwiOlxuICAgICAgY2FzZSBcInRvbWxcIjpcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMub3JpZ2luYWxUZXh0LnNsaWNlKG5vZGUucG9zaXRpb24uc3RhcnQub2Zmc2V0LCBub2RlLnBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuXG4gICAgICBjYXNlIFwiaHRtbFwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyZW50Tm9kZS50eXBlID09PSBcInJvb3RcIiAmJiB1dGlsJDEuZ2V0TGFzdChwYXJlbnROb2RlLmNoaWxkcmVuKSA9PT0gbm9kZSA/IG5vZGUudmFsdWUudHJpbUVuZCgpIDogbm9kZS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBpc0h0bWxDb21tZW50ID0gL148IS0tW1xcc1xcU10qLS0+JC8udGVzdCh2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRnKHJlcGxhY2VFbmRPZkxpbmVXaXRoJDIodmFsdWUsIGlzSHRtbENvbW1lbnQgPyBoYXJkbGluZSRjIDogbWFya0FzUm9vdCQ0KGxpdGVyYWxsaW5lJDYpKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcImxpc3RcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IG50aFNpYmxpbmdJbmRleCA9IGdldE50aExpc3RTaWJsaW5nSW5kZXgobm9kZSwgcGF0aC5nZXRQYXJlbnROb2RlKCkpO1xuICAgICAgICAgIGNvbnN0IGlzR2l0RGlmZkZyaWVuZGx5T3JkZXJlZExpc3QgPSBoYXNHaXREaWZmRnJpZW5kbHlPcmRlcmVkTGlzdCQxKG5vZGUsIG9wdGlvbnMpO1xuICAgICAgICAgIHJldHVybiBwcmludENoaWxkcmVuJDIocGF0aCwgb3B0aW9ucywgcHJpbnQsIHtcbiAgICAgICAgICAgIHByb2Nlc3NvcjogKGNoaWxkUGF0aCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gZ2V0UHJlZml4KCk7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IGNoaWxkUGF0aC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAyICYmIGNoaWxkTm9kZS5jaGlsZHJlblsxXS50eXBlID09PSBcImh0bWxcIiAmJiBjaGlsZE5vZGUuY2hpbGRyZW5bMF0ucG9zaXRpb24uc3RhcnQuY29sdW1uICE9PSBjaGlsZE5vZGUuY2hpbGRyZW5bMV0ucG9zaXRpb24uc3RhcnQuY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtwcmVmaXgsIHByaW50TGlzdEl0ZW0oY2hpbGRQYXRoLCBvcHRpb25zLCBwcmludCwgcHJlZml4KV0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtwcmVmaXgsIGFsaWduJDIoXCIgXCIucmVwZWF0KHByZWZpeC5sZW5ndGgpLCBwcmludExpc3RJdGVtKGNoaWxkUGF0aCwgb3B0aW9ucywgcHJpbnQsIHByZWZpeCkpXSk7XG5cbiAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJlZml4KCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhd1ByZWZpeCA9IG5vZGUub3JkZXJlZCA/IChpbmRleCA9PT0gMCA/IG5vZGUuc3RhcnQgOiBpc0dpdERpZmZGcmllbmRseU9yZGVyZWRMaXN0ID8gMSA6IG5vZGUuc3RhcnQgKyBpbmRleCkgKyAobnRoU2libGluZ0luZGV4ICUgMiA9PT0gMCA/IFwiLiBcIiA6IFwiKSBcIikgOiBudGhTaWJsaW5nSW5kZXggJSAyID09PSAwID8gXCItIFwiIDogXCIqIFwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmlzQWxpZ25lZCB8fFxuICAgICAgICAgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9yZW1hcmtqcy9yZW1hcmsvaXNzdWVzLzMxNSAqL1xuICAgICAgICAgICAgICAgIG5vZGUuaGFzSW5kZW50ZWRDb2RlYmxvY2sgPyBhbGlnbkxpc3RQcmVmaXgocmF3UHJlZml4LCBvcHRpb25zKSA6IHJhd1ByZWZpeDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJ0aGVtYXRpY0JyZWFrXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBjb3VudGVyID0gZ2V0QW5jZXN0b3JDb3VudGVyJDEocGF0aCwgXCJsaXN0XCIpO1xuXG4gICAgICAgICAgaWYgKGNvdW50ZXIgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gXCItLS1cIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBudGhTaWJsaW5nSW5kZXggPSBnZXROdGhMaXN0U2libGluZ0luZGV4KHBhdGguZ2V0UGFyZW50Tm9kZShjb3VudGVyKSwgcGF0aC5nZXRQYXJlbnROb2RlKGNvdW50ZXIgKyAxKSk7XG4gICAgICAgICAgcmV0dXJuIG50aFNpYmxpbmdJbmRleCAlIDIgPT09IDAgPyBcIioqKlwiIDogXCItLS1cIjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwibGlua1JlZmVyZW5jZVwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGcoW1wiW1wiLCBwcmludENoaWxkcmVuJDIocGF0aCwgb3B0aW9ucywgcHJpbnQpLCBcIl1cIiwgbm9kZS5yZWZlcmVuY2VUeXBlID09PSBcImZ1bGxcIiA/IGNvbmNhdCRnKFtcIltcIiwgbm9kZS5pZGVudGlmaWVyLCBcIl1cIl0pIDogbm9kZS5yZWZlcmVuY2VUeXBlID09PSBcImNvbGxhcHNlZFwiID8gXCJbXVwiIDogXCJcIl0pO1xuXG4gICAgICBjYXNlIFwiaW1hZ2VSZWZlcmVuY2VcIjpcbiAgICAgICAgc3dpdGNoIChub2RlLnJlZmVyZW5jZVR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiZnVsbFwiOlxuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtcIiFbXCIsIG5vZGUuYWx0IHx8IFwiXCIsIFwiXVtcIiwgbm9kZS5pZGVudGlmaWVyLCBcIl1cIl0pO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjb25jYXQkZyhbXCIhW1wiLCBub2RlLmFsdCwgXCJdXCIsIG5vZGUucmVmZXJlbmNlVHlwZSA9PT0gXCJjb2xsYXBzZWRcIiA/IFwiW11cIiA6IFwiXCJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiZGVmaW5pdGlvblwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgbGluZU9yU3BhY2UgPSBvcHRpb25zLnByb3NlV3JhcCA9PT0gXCJhbHdheXNcIiA/IGxpbmUkYSA6IFwiIFwiO1xuICAgICAgICAgIHJldHVybiBncm91cCRmKGNvbmNhdCRnKFtjb25jYXQkZyhbXCJbXCIsIG5vZGUuaWRlbnRpZmllciwgXCJdOlwiXSksIGluZGVudCQ5KGNvbmNhdCRnKFtsaW5lT3JTcGFjZSwgcHJpbnRVcmwobm9kZS51cmwpLCBub2RlLnRpdGxlID09PSBudWxsID8gXCJcIiA6IGNvbmNhdCRnKFtsaW5lT3JTcGFjZSwgcHJpbnRUaXRsZShub2RlLnRpdGxlLCBvcHRpb25zLCBmYWxzZSldKV0pKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiZm9vdG5vdGVcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtcIlteXCIsIHByaW50Q2hpbGRyZW4kMihwYXRoLCBvcHRpb25zLCBwcmludCksIFwiXVwiXSk7XG5cbiAgICAgIGNhc2UgXCJmb290bm90ZVJlZmVyZW5jZVwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGcoW1wiW15cIiwgbm9kZS5pZGVudGlmaWVyLCBcIl1cIl0pO1xuXG4gICAgICBjYXNlIFwiZm9vdG5vdGVEZWZpbml0aW9uXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpLmNoaWxkcmVuW3BhdGguZ2V0TmFtZSgpICsgMV07XG4gICAgICAgICAgY29uc3Qgc2hvdWxkSW5saW5lRm9vdG5vdGUgPSBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBub2RlLmNoaWxkcmVuWzBdLnR5cGUgPT09IFwicGFyYWdyYXBoXCIgJiYgKG9wdGlvbnMucHJvc2VXcmFwID09PSBcIm5ldmVyXCIgfHwgb3B0aW9ucy5wcm9zZVdyYXAgPT09IFwicHJlc2VydmVcIiAmJiBub2RlLmNoaWxkcmVuWzBdLnBvc2l0aW9uLnN0YXJ0LmxpbmUgPT09IG5vZGUuY2hpbGRyZW5bMF0ucG9zaXRpb24uZW5kLmxpbmUpO1xuICAgICAgICAgIHJldHVybiBjb25jYXQkZyhbXCJbXlwiLCBub2RlLmlkZW50aWZpZXIsIFwiXTogXCIsIHNob3VsZElubGluZUZvb3Rub3RlID8gcHJpbnRDaGlsZHJlbiQyKHBhdGgsIG9wdGlvbnMsIHByaW50KSA6IGdyb3VwJGYoY29uY2F0JGcoW2FsaWduJDIoXCIgXCIucmVwZWF0KG9wdGlvbnMudGFiV2lkdGgpLCBwcmludENoaWxkcmVuJDIocGF0aCwgb3B0aW9ucywgcHJpbnQsIHtcbiAgICAgICAgICAgIHByb2Nlc3NvcjogKGNoaWxkUGF0aCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09PSAwID8gZ3JvdXAkZihjb25jYXQkZyhbc29mdGxpbmUkNywgY2hpbGRQYXRoLmNhbGwocHJpbnQpXSkpIDogY2hpbGRQYXRoLmNhbGwocHJpbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKSwgbmV4dE5vZGUgJiYgbmV4dE5vZGUudHlwZSA9PT0gXCJmb290bm90ZURlZmluaXRpb25cIiA/IHNvZnRsaW5lJDcgOiBcIlwiXSkpXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInRhYmxlXCI6XG4gICAgICAgIHJldHVybiBwcmludFRhYmxlKHBhdGgsIG9wdGlvbnMsIHByaW50KTtcblxuICAgICAgY2FzZSBcInRhYmxlQ2VsbFwiOlxuICAgICAgICByZXR1cm4gcHJpbnRDaGlsZHJlbiQyKHBhdGgsIG9wdGlvbnMsIHByaW50KTtcblxuICAgICAgY2FzZSBcImJyZWFrXCI6XG4gICAgICAgIHJldHVybiAvXFxzLy50ZXN0KG9wdGlvbnMub3JpZ2luYWxUZXh0W25vZGUucG9zaXRpb24uc3RhcnQub2Zmc2V0XSkgPyBjb25jYXQkZyhbXCIgIFwiLCBtYXJrQXNSb290JDQobGl0ZXJhbGxpbmUkNildKSA6IGNvbmNhdCRnKFtcIlxcXFxcIiwgaGFyZGxpbmUkY10pO1xuXG4gICAgICBjYXNlIFwibGlxdWlkTm9kZVwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGcocmVwbGFjZUVuZE9mTGluZVdpdGgkMihub2RlLnZhbHVlLCBoYXJkbGluZSRjKSk7XG4gICAgICAvLyBNRFhcblxuICAgICAgY2FzZSBcImltcG9ydEV4cG9ydFwiOlxuICAgICAgY2FzZSBcImpzeFwiOlxuICAgICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICAgIC8vIGZhbGxiYWNrIHRvIHRoZSBvcmlnaW5hbCB0ZXh0IGlmIG11bHRpcGFyc2VyIGZhaWxlZFxuXG4gICAgICBjYXNlIFwibWF0aFwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGcoW1wiJCRcIiwgaGFyZGxpbmUkYywgbm9kZS52YWx1ZSA/IGNvbmNhdCRnKFtjb25jYXQkZyhyZXBsYWNlRW5kT2ZMaW5lV2l0aCQyKG5vZGUudmFsdWUsIGhhcmRsaW5lJGMpKSwgaGFyZGxpbmUkY10pIDogXCJcIiwgXCIkJFwiXSk7XG5cbiAgICAgIGNhc2UgXCJpbmxpbmVNYXRoXCI6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyByZW1hcmstbWF0aCB0cmltcyBjb250ZW50IGJ1dCB3ZSBkb24ndCB3YW50IHRvIHJlbW92ZSB3aGl0ZXNwYWNlc1xuICAgICAgICAgIC8vIHNpbmNlIGl0J3MgdmVyeSBwb3NzaWJsZSB0aGF0IGl0J3MgcmVjb2duaXplZCBhcyBtYXRoIGFjY2lkZW50YWxseVxuICAgICAgICAgIHJldHVybiBvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShvcHRpb25zLmxvY1N0YXJ0KG5vZGUpLCBvcHRpb25zLmxvY0VuZChub2RlKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInRhYmxlUm93XCI6IC8vIGhhbmRsZWQgaW4gXCJ0YWJsZVwiXG5cbiAgICAgIGNhc2UgXCJsaXN0SXRlbVwiOiAvLyBoYW5kbGVkIGluIFwibGlzdFwiXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gbWFya2Rvd24gdHlwZSBcIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkobm9kZS50eXBlKSkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50TGlzdEl0ZW0ocGF0aCwgb3B0aW9ucywgcHJpbnQsIGxpc3RQcmVmaXgpIHtcbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHByZWZpeCA9IG5vZGUuY2hlY2tlZCA9PT0gbnVsbCA/IFwiXCIgOiBub2RlLmNoZWNrZWQgPyBcIlt4XSBcIiA6IFwiWyBdIFwiO1xuICAgIHJldHVybiBjb25jYXQkZyhbcHJlZml4LCBwcmludENoaWxkcmVuJDIocGF0aCwgb3B0aW9ucywgcHJpbnQsIHtcbiAgICAgIHByb2Nlc3NvcjogKGNoaWxkUGF0aCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIGNoaWxkUGF0aC5nZXRWYWx1ZSgpLnR5cGUgIT09IFwibGlzdFwiKSB7XG4gICAgICAgICAgcmV0dXJuIGFsaWduJDIoXCIgXCIucmVwZWF0KHByZWZpeC5sZW5ndGgpLCBjaGlsZFBhdGguY2FsbChwcmludCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWxpZ25tZW50ID0gXCIgXCIucmVwZWF0KGNsYW1wKG9wdGlvbnMudGFiV2lkdGggLSBsaXN0UHJlZml4Lmxlbmd0aCwgMCwgMykgLy8gNCsgd2lsbCBjYXVzZSBpbmRlbnRlZCBjb2RlIGJsb2NrXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBjb25jYXQkZyhbYWxpZ25tZW50LCBhbGlnbiQyKGFsaWdubWVudCwgY2hpbGRQYXRoLmNhbGwocHJpbnQpKV0pO1xuICAgICAgfVxuICAgIH0pXSk7XG4gIH1cblxuICBmdW5jdGlvbiBhbGlnbkxpc3RQcmVmaXgocHJlZml4LCBvcHRpb25zKSB7XG4gICAgY29uc3QgYWRkaXRpb25hbFNwYWNlcyA9IGdldEFkZGl0aW9uYWxTcGFjZXMoKTtcbiAgICByZXR1cm4gcHJlZml4ICsgXCIgXCIucmVwZWF0KGFkZGl0aW9uYWxTcGFjZXMgPj0gNCA/IDAgOiBhZGRpdGlvbmFsU3BhY2VzIC8vIDQrIHdpbGwgY2F1c2UgaW5kZW50ZWQgY29kZSBibG9ja1xuICAgICk7XG5cbiAgICBmdW5jdGlvbiBnZXRBZGRpdGlvbmFsU3BhY2VzKCkge1xuICAgICAgY29uc3QgcmVzdFNwYWNlcyA9IHByZWZpeC5sZW5ndGggJSBvcHRpb25zLnRhYldpZHRoO1xuICAgICAgcmV0dXJuIHJlc3RTcGFjZXMgPT09IDAgPyAwIDogb3B0aW9ucy50YWJXaWR0aCAtIHJlc3RTcGFjZXM7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TnRoTGlzdFNpYmxpbmdJbmRleChub2RlLCBwYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIGdldE50aFNpYmxpbmdJbmRleChub2RlLCBwYXJlbnROb2RlLCBzaWJsaW5nTm9kZSA9PiBzaWJsaW5nTm9kZS5vcmRlcmVkID09PSBub2RlLm9yZGVyZWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TnRoU2libGluZ0luZGV4KG5vZGUsIHBhcmVudE5vZGUsIGNvbmRpdGlvbikge1xuICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbiB8fCAoKCkgPT4gdHJ1ZSk7XG5cbiAgICBsZXQgaW5kZXggPSAtMTtcblxuICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIHBhcmVudE5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjaGlsZE5vZGUudHlwZSA9PT0gbm9kZS50eXBlICYmIGNvbmRpdGlvbihjaGlsZE5vZGUpKSB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGROb2RlID09PSBub2RlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRBbmNlc3RvckNvdW50ZXIkMShwYXRoLCB0eXBlT3JUeXBlcykge1xuICAgIGNvbnN0IHR5cGVzID0gW10uY29uY2F0KHR5cGVPclR5cGVzKTtcbiAgICBsZXQgY291bnRlciA9IC0xO1xuICAgIGxldCBhbmNlc3Rvck5vZGU7XG5cbiAgICB3aGlsZSAoYW5jZXN0b3JOb2RlID0gcGF0aC5nZXRQYXJlbnROb2RlKCsrY291bnRlcikpIHtcbiAgICAgIGlmICh0eXBlcy5pbmNsdWRlcyhhbmNlc3Rvck5vZGUudHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGNvdW50ZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QW5jZXN0b3JOb2RlJDIocGF0aCwgdHlwZU9yVHlwZXMpIHtcbiAgICBjb25zdCBjb3VudGVyID0gZ2V0QW5jZXN0b3JDb3VudGVyJDEocGF0aCwgdHlwZU9yVHlwZXMpO1xuICAgIHJldHVybiBjb3VudGVyID09PSAtMSA/IG51bGwgOiBwYXRoLmdldFBhcmVudE5vZGUoY291bnRlcik7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludExpbmUocGF0aCwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5wcm9zZVdyYXAgPT09IFwicHJlc2VydmVcIiAmJiB2YWx1ZSA9PT0gXCJcXG5cIikge1xuICAgICAgcmV0dXJuIGhhcmRsaW5lJGM7XG4gICAgfVxuXG4gICAgY29uc3QgaXNCcmVha2FibGUgPSBvcHRpb25zLnByb3NlV3JhcCA9PT0gXCJhbHdheXNcIiAmJiAhZ2V0QW5jZXN0b3JOb2RlJDIocGF0aCwgU0lOR0xFX0xJTkVfTk9ERV9UWVBFUyk7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiID8gaXNCcmVha2FibGUgPyBsaW5lJGEgOiBcIiBcIiA6IGlzQnJlYWthYmxlID8gc29mdGxpbmUkNyA6IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludFRhYmxlKHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3QgaGFyZGxpbmVXaXRob3V0QnJlYWtQYXJlbnQgPSBoYXJkbGluZSRjLnBhcnRzWzBdO1xuICAgIGNvbnN0IG5vZGUgPSBwYXRoLmdldFZhbHVlKCk7XG4gICAgY29uc3QgY29udGVudHMgPSBbXTsgLy8geyBbcm93SW5kZXg6IG51bWJlcl06IHsgW2NvbHVtbkluZGV4OiBudW1iZXJdOiBzdHJpbmcgfSB9XG5cbiAgICBwYXRoLm1hcChyb3dQYXRoID0+IHtcbiAgICAgIGNvbnN0IHJvd0NvbnRlbnRzID0gW107XG4gICAgICByb3dQYXRoLm1hcChjZWxsUGF0aCA9PiB7XG4gICAgICAgIHJvd0NvbnRlbnRzLnB1c2gocHJpbnREb2NUb1N0cmluZyQzKGNlbGxQYXRoLmNhbGwocHJpbnQpLCBvcHRpb25zKS5mb3JtYXR0ZWQpO1xuICAgICAgfSwgXCJjaGlsZHJlblwiKTtcbiAgICAgIGNvbnRlbnRzLnB1c2gocm93Q29udGVudHMpO1xuICAgIH0sIFwiY2hpbGRyZW5cIik7IC8vIEdldCB0aGUgd2lkdGggb2YgZWFjaCBjb2x1bW5cblxuICAgIGNvbnN0IGNvbHVtbk1heFdpZHRocyA9IGNvbnRlbnRzLnJlZHVjZSgoY3VycmVudFdpZHRocywgcm93Q29udGVudHMpID0+IGN1cnJlbnRXaWR0aHMubWFwKCh3aWR0aCwgY29sdW1uSW5kZXgpID0+IE1hdGgubWF4KHdpZHRoLCB1dGlsJDEuZ2V0U3RyaW5nV2lkdGgocm93Q29udGVudHNbY29sdW1uSW5kZXhdKSkpLCBjb250ZW50c1swXS5tYXAoKCkgPT4gMykgLy8gbWluaW11bSB3aWR0aCA9IDMgKC0tLSwgOi0tLCA6LTosIC0tOilcbiAgICApO1xuICAgIGNvbnN0IGFsaWduZWRUYWJsZSA9IGpvaW4kYihoYXJkbGluZVdpdGhvdXRCcmVha1BhcmVudCwgW3ByaW50Um93KGNvbnRlbnRzWzBdKSwgcHJpbnRTZXBhcmF0b3IoKSwgam9pbiRiKGhhcmRsaW5lV2l0aG91dEJyZWFrUGFyZW50LCBjb250ZW50cy5zbGljZSgxKS5tYXAocm93Q29udGVudHMgPT4gcHJpbnRSb3cocm93Q29udGVudHMpKSldKTtcblxuICAgIGlmIChvcHRpb25zLnByb3NlV3JhcCAhPT0gXCJuZXZlclwiKSB7XG4gICAgICByZXR1cm4gY29uY2F0JGcoW2JyZWFrUGFyZW50JDQsIGFsaWduZWRUYWJsZV0pO1xuICAgIH0gLy8gT25seSBpZiB0aGUgLS1wcm9zZS13cmFwIG5ldmVyIGlzIHNldCBhbmQgaXQgZXhjZWVkcyB0aGUgcHJpbnQgd2lkdGguXG5cblxuICAgIGNvbnN0IGNvbXBhY3RUYWJsZSA9IGpvaW4kYihoYXJkbGluZVdpdGhvdXRCcmVha1BhcmVudCwgW3ByaW50Um93KGNvbnRlbnRzWzBdLFxuICAgIC8qIGlzQ29tcGFjdCAqL1xuICAgIHRydWUpLCBwcmludFNlcGFyYXRvcihcbiAgICAvKiBpc0NvbXBhY3QgKi9cbiAgICB0cnVlKSwgam9pbiRiKGhhcmRsaW5lV2l0aG91dEJyZWFrUGFyZW50LCBjb250ZW50cy5zbGljZSgxKS5tYXAocm93Q29udGVudHMgPT4gcHJpbnRSb3cocm93Q29udGVudHMsXG4gICAgLyogaXNDb21wYWN0ICovXG4gICAgdHJ1ZSkpKV0pO1xuICAgIHJldHVybiBjb25jYXQkZyhbYnJlYWtQYXJlbnQkNCwgZ3JvdXAkZihpZkJyZWFrJDcoY29tcGFjdFRhYmxlLCBhbGlnbmVkVGFibGUpKV0pO1xuXG4gICAgZnVuY3Rpb24gcHJpbnRTZXBhcmF0b3IoaXNDb21wYWN0KSB7XG4gICAgICByZXR1cm4gY29uY2F0JGcoW1wifCBcIiwgam9pbiRiKFwiIHwgXCIsIGNvbHVtbk1heFdpZHRocy5tYXAoKHdpZHRoLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzcGFjZXMgPSBpc0NvbXBhY3QgPyAzIDogd2lkdGg7XG5cbiAgICAgICAgc3dpdGNoIChub2RlLmFsaWduW2luZGV4XSkge1xuICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICByZXR1cm4gXCI6XCIgKyBcIi1cIi5yZXBlYXQoc3BhY2VzIC0gMSk7XG5cbiAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgICAgICAgIHJldHVybiBcIi1cIi5yZXBlYXQoc3BhY2VzIC0gMSkgKyBcIjpcIjtcblxuICAgICAgICAgIGNhc2UgXCJjZW50ZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBcIjpcIiArIFwiLVwiLnJlcGVhdChzcGFjZXMgLSAyKSArIFwiOlwiO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBcIi1cIi5yZXBlYXQoc3BhY2VzKTtcbiAgICAgICAgfVxuICAgICAgfSkpLCBcIiB8XCJdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmludFJvdyhyb3dDb250ZW50cywgaXNDb21wYWN0KSB7XG4gICAgICByZXR1cm4gY29uY2F0JGcoW1wifCBcIiwgam9pbiRiKFwiIHwgXCIsIGlzQ29tcGFjdCA/IHJvd0NvbnRlbnRzIDogcm93Q29udGVudHMubWFwKChyb3dDb250ZW50LCBjb2x1bW5JbmRleCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKG5vZGUuYWxpZ25bY29sdW1uSW5kZXhdKSB7XG4gICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICByZXR1cm4gYWxpZ25SaWdodChyb3dDb250ZW50LCBjb2x1bW5NYXhXaWR0aHNbY29sdW1uSW5kZXhdKTtcblxuICAgICAgICAgIGNhc2UgXCJjZW50ZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBhbGlnbkNlbnRlcihyb3dDb250ZW50LCBjb2x1bW5NYXhXaWR0aHNbY29sdW1uSW5kZXhdKTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gYWxpZ25MZWZ0KHJvd0NvbnRlbnQsIGNvbHVtbk1heFdpZHRoc1tjb2x1bW5JbmRleF0pO1xuICAgICAgICB9XG4gICAgICB9KSksIFwiIHxcIl0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFsaWduTGVmdCh0ZXh0LCB3aWR0aCkge1xuICAgICAgY29uc3Qgc3BhY2VzID0gd2lkdGggLSB1dGlsJDEuZ2V0U3RyaW5nV2lkdGgodGV4dCk7XG4gICAgICByZXR1cm4gY29uY2F0JGcoW3RleHQsIFwiIFwiLnJlcGVhdChzcGFjZXMpXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWxpZ25SaWdodCh0ZXh0LCB3aWR0aCkge1xuICAgICAgY29uc3Qgc3BhY2VzID0gd2lkdGggLSB1dGlsJDEuZ2V0U3RyaW5nV2lkdGgodGV4dCk7XG4gICAgICByZXR1cm4gY29uY2F0JGcoW1wiIFwiLnJlcGVhdChzcGFjZXMpLCB0ZXh0XSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWxpZ25DZW50ZXIodGV4dCwgd2lkdGgpIHtcbiAgICAgIGNvbnN0IHNwYWNlcyA9IHdpZHRoIC0gdXRpbCQxLmdldFN0cmluZ1dpZHRoKHRleHQpO1xuICAgICAgY29uc3QgbGVmdCA9IE1hdGguZmxvb3Ioc3BhY2VzIC8gMik7XG4gICAgICBjb25zdCByaWdodCA9IHNwYWNlcyAtIGxlZnQ7XG4gICAgICByZXR1cm4gY29uY2F0JGcoW1wiIFwiLnJlcGVhdChsZWZ0KSwgdGV4dCwgXCIgXCIucmVwZWF0KHJpZ2h0KV0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50Um9vdChwYXRoLCBvcHRpb25zLCBwcmludCkge1xuICAgIC8qKiBAdHlwZWRlZiB7eyBpbmRleDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlciB9fSBJZ25vcmVQb3NpdGlvbiAqL1xuXG4gICAgLyoqIEB0eXBlIHtBcnJheTx7c3RhcnQ6IElnbm9yZVBvc2l0aW9uLCBlbmQ6IElnbm9yZVBvc2l0aW9ufT59ICovXG4gICAgY29uc3QgaWdub3JlUmFuZ2VzID0gW107XG4gICAgLyoqIEB0eXBlIHtJZ25vcmVQb3NpdGlvbiB8IG51bGx9ICovXG5cbiAgICBsZXQgaWdub3JlU3RhcnQgPSBudWxsO1xuICAgIGNvbnN0IHtcbiAgICAgIGNoaWxkcmVuXG4gICAgfSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZE5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBzd2l0Y2ggKGlzUHJldHRpZXJJZ25vcmUkMShjaGlsZE5vZGUpKSB7XG4gICAgICAgIGNhc2UgXCJzdGFydFwiOlxuICAgICAgICAgIGlmIChpZ25vcmVTdGFydCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWdub3JlU3RhcnQgPSB7XG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBvZmZzZXQ6IGNoaWxkTm9kZS5wb3NpdGlvbi5lbmQub2Zmc2V0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICBpZiAoaWdub3JlU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlnbm9yZVJhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgc3RhcnQ6IGlnbm9yZVN0YXJ0LFxuICAgICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IGNoaWxkTm9kZS5wb3NpdGlvbi5zdGFydC5vZmZzZXRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZ25vcmVTdGFydCA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByaW50Q2hpbGRyZW4kMihwYXRoLCBvcHRpb25zLCBwcmludCwge1xuICAgICAgcHJvY2Vzc29yOiAoY2hpbGRQYXRoLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoaWdub3JlUmFuZ2VzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IGlnbm9yZVJhbmdlID0gaWdub3JlUmFuZ2VzWzBdO1xuXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBpZ25vcmVSYW5nZS5zdGFydC5pbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCRnKFtjaGlsZHJlbltpZ25vcmVSYW5nZS5zdGFydC5pbmRleF0udmFsdWUsIG9wdGlvbnMub3JpZ2luYWxUZXh0LnNsaWNlKGlnbm9yZVJhbmdlLnN0YXJ0Lm9mZnNldCwgaWdub3JlUmFuZ2UuZW5kLm9mZnNldCksIGNoaWxkcmVuW2lnbm9yZVJhbmdlLmVuZC5pbmRleF0udmFsdWVdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaWdub3JlUmFuZ2Uuc3RhcnQuaW5kZXggPCBpbmRleCAmJiBpbmRleCA8IGlnbm9yZVJhbmdlLmVuZC5pbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbmRleCA9PT0gaWdub3JlUmFuZ2UuZW5kLmluZGV4KSB7XG4gICAgICAgICAgICBpZ25vcmVSYW5nZXMuc2hpZnQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGRQYXRoLmNhbGwocHJpbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRDaGlsZHJlbiQyKHBhdGgsIG9wdGlvbnMsIHByaW50LCBldmVudHMpIHtcbiAgICBldmVudHMgPSBldmVudHMgfHwge307XG4gICAgY29uc3QgcG9zdHByb2Nlc3NvciA9IGV2ZW50cy5wb3N0cHJvY2Vzc29yIHx8IGNvbmNhdCRnO1xuXG4gICAgY29uc3QgcHJvY2Vzc29yID0gZXZlbnRzLnByb2Nlc3NvciB8fCAoY2hpbGRQYXRoID0+IGNoaWxkUGF0aC5jYWxsKHByaW50KSk7XG5cbiAgICBjb25zdCBub2RlID0gcGF0aC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgbGV0IGxhc3RDaGlsZE5vZGU7XG4gICAgcGF0aC5tYXAoKGNoaWxkUGF0aCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IGNoaWxkUGF0aC5nZXRWYWx1ZSgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcHJvY2Vzc29yKGNoaWxkUGF0aCwgaW5kZXgpO1xuXG4gICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgIHBhcnRzLFxuICAgICAgICAgIHByZXZOb2RlOiBsYXN0Q2hpbGROb2RlLFxuICAgICAgICAgIHBhcmVudE5vZGU6IG5vZGUsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghc2hvdWxkTm90UHJlUHJpbnRIYXJkbGluZShjaGlsZE5vZGUsIGRhdGEpKSB7XG4gICAgICAgICAgcGFydHMucHVzaChoYXJkbGluZSRjKTtcblxuICAgICAgICAgIGlmIChsYXN0Q2hpbGROb2RlICYmIFRSQUlMSU5HX0hBUkRMSU5FX05PREVTLmluY2x1ZGVzKGxhc3RDaGlsZE5vZGUudHlwZSkpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRQcmVQcmludFRyaXBsZUhhcmRsaW5lKGNoaWxkTm9kZSwgZGF0YSkpIHtcbiAgICAgICAgICAgICAgcGFydHMucHVzaChoYXJkbGluZSRjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNob3VsZFByZVByaW50RG91YmxlSGFyZGxpbmUoY2hpbGROb2RlLCBkYXRhKSB8fCBzaG91bGRQcmVQcmludFRyaXBsZUhhcmRsaW5lKGNoaWxkTm9kZSwgZGF0YSkpIHtcbiAgICAgICAgICAgICAgcGFydHMucHVzaChoYXJkbGluZSRjKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNob3VsZFByZVByaW50VHJpcGxlSGFyZGxpbmUoY2hpbGROb2RlLCBkYXRhKSkge1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGhhcmRsaW5lJGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHBhcnRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgbGFzdENoaWxkTm9kZSA9IGNoaWxkTm9kZTtcbiAgICAgIH1cbiAgICB9LCBcImNoaWxkcmVuXCIpO1xuICAgIHJldHVybiBwb3N0cHJvY2Vzc29yKHBhcnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExhc3REZXNjZW5kYW50Tm9kZShub2RlKSB7XG4gICAgbGV0IGN1cnJlbnQgPSBub2RlO1xuXG4gICAgd2hpbGUgKGN1cnJlbnQuY2hpbGRyZW4gJiYgY3VycmVudC5jaGlsZHJlbi5sZW5ndGggIT09IDApIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW2N1cnJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbiAgLyoqIEByZXR1cm4ge2ZhbHNlIHwgJ25leHQnIHwgJ3N0YXJ0JyB8ICdlbmQnfSAqL1xuXG5cbiAgZnVuY3Rpb24gaXNQcmV0dGllcklnbm9yZSQxKG5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlICE9PSBcImh0bWxcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gbm9kZS52YWx1ZS5tYXRjaCgvXjwhLS1cXHMqcHJldHRpZXItaWdub3JlKD86LShzdGFydHxlbmQpKT9cXHMqLS0+JC8pO1xuICAgIHJldHVybiBtYXRjaCA9PT0gbnVsbCA/IGZhbHNlIDogbWF0Y2hbMV0gPyBtYXRjaFsxXSA6IFwibmV4dFwiO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkTm90UHJlUHJpbnRIYXJkbGluZShub2RlLCBkYXRhKSB7XG4gICAgY29uc3QgaXNGaXJzdE5vZGUgPSBkYXRhLnBhcnRzLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBpc0lubGluZU5vZGUgPSBJTkxJTkVfTk9ERV9UWVBFUyQxLmluY2x1ZGVzKG5vZGUudHlwZSk7XG4gICAgY29uc3QgaXNJbmxpbmVIVE1MID0gbm9kZS50eXBlID09PSBcImh0bWxcIiAmJiBJTkxJTkVfTk9ERV9XUkFQUEVSX1RZUEVTJDEuaW5jbHVkZXMoZGF0YS5wYXJlbnROb2RlLnR5cGUpO1xuICAgIHJldHVybiBpc0ZpcnN0Tm9kZSB8fCBpc0lubGluZU5vZGUgfHwgaXNJbmxpbmVIVE1MO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkUHJlUHJpbnREb3VibGVIYXJkbGluZShub2RlLCBkYXRhKSB7XG4gICAgY29uc3QgaXNTZXF1ZW5jZSA9IChkYXRhLnByZXZOb2RlICYmIGRhdGEucHJldk5vZGUudHlwZSkgPT09IG5vZGUudHlwZTtcbiAgICBjb25zdCBpc1NpYmxpbmdOb2RlID0gaXNTZXF1ZW5jZSAmJiBTSUJMSU5HX05PREVfVFlQRVMuaW5jbHVkZXMobm9kZS50eXBlKTtcbiAgICBjb25zdCBpc0luVGlnaHRMaXN0SXRlbSA9IGRhdGEucGFyZW50Tm9kZS50eXBlID09PSBcImxpc3RJdGVtXCIgJiYgIWRhdGEucGFyZW50Tm9kZS5sb29zZTtcbiAgICBjb25zdCBpc1ByZXZOb2RlTG9vc2VMaXN0SXRlbSA9IGRhdGEucHJldk5vZGUgJiYgZGF0YS5wcmV2Tm9kZS50eXBlID09PSBcImxpc3RJdGVtXCIgJiYgZGF0YS5wcmV2Tm9kZS5sb29zZTtcbiAgICBjb25zdCBpc1ByZXZOb2RlUHJldHRpZXJJZ25vcmUgPSBpc1ByZXR0aWVySWdub3JlJDEoZGF0YS5wcmV2Tm9kZSkgPT09IFwibmV4dFwiO1xuICAgIGNvbnN0IGlzQmxvY2tIdG1sV2l0aG91dEJsYW5rTGluZUJldHdlZW5QcmV2SHRtbCA9IG5vZGUudHlwZSA9PT0gXCJodG1sXCIgJiYgZGF0YS5wcmV2Tm9kZSAmJiBkYXRhLnByZXZOb2RlLnR5cGUgPT09IFwiaHRtbFwiICYmIGRhdGEucHJldk5vZGUucG9zaXRpb24uZW5kLmxpbmUgKyAxID09PSBub2RlLnBvc2l0aW9uLnN0YXJ0LmxpbmU7XG4gICAgY29uc3QgaXNIdG1sRGlyZWN0QWZ0ZXJMaXN0SXRlbSA9IG5vZGUudHlwZSA9PT0gXCJodG1sXCIgJiYgZGF0YS5wYXJlbnROb2RlLnR5cGUgPT09IFwibGlzdEl0ZW1cIiAmJiBkYXRhLnByZXZOb2RlICYmIGRhdGEucHJldk5vZGUudHlwZSA9PT0gXCJwYXJhZ3JhcGhcIiAmJiBkYXRhLnByZXZOb2RlLnBvc2l0aW9uLmVuZC5saW5lICsgMSA9PT0gbm9kZS5wb3NpdGlvbi5zdGFydC5saW5lO1xuICAgIHJldHVybiBpc1ByZXZOb2RlTG9vc2VMaXN0SXRlbSB8fCAhKGlzU2libGluZ05vZGUgfHwgaXNJblRpZ2h0TGlzdEl0ZW0gfHwgaXNQcmV2Tm9kZVByZXR0aWVySWdub3JlIHx8IGlzQmxvY2tIdG1sV2l0aG91dEJsYW5rTGluZUJldHdlZW5QcmV2SHRtbCB8fCBpc0h0bWxEaXJlY3RBZnRlckxpc3RJdGVtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZFByZVByaW50VHJpcGxlSGFyZGxpbmUobm9kZSwgZGF0YSkge1xuICAgIGNvbnN0IGlzUHJldk5vZGVMaXN0ID0gZGF0YS5wcmV2Tm9kZSAmJiBkYXRhLnByZXZOb2RlLnR5cGUgPT09IFwibGlzdFwiO1xuICAgIGNvbnN0IGlzSW5kZW50ZWRDb2RlID0gbm9kZS50eXBlID09PSBcImNvZGVcIiAmJiBub2RlLmlzSW5kZW50ZWQ7XG4gICAgcmV0dXJuIGlzUHJldk5vZGVMaXN0ICYmIGlzSW5kZW50ZWRDb2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkUmVtYWluVGhlU2FtZUNvbnRlbnQocGF0aCkge1xuICAgIGNvbnN0IGFuY2VzdG9yTm9kZSA9IGdldEFuY2VzdG9yTm9kZSQyKHBhdGgsIFtcImxpbmtSZWZlcmVuY2VcIiwgXCJpbWFnZVJlZmVyZW5jZVwiXSk7XG4gICAgcmV0dXJuIGFuY2VzdG9yTm9kZSAmJiAoYW5jZXN0b3JOb2RlLnR5cGUgIT09IFwibGlua1JlZmVyZW5jZVwiIHx8IGFuY2VzdG9yTm9kZS5yZWZlcmVuY2VUeXBlICE9PSBcImZ1bGxcIik7XG4gIH1cblxuICBmdW5jdGlvbiBub3JtYWxpemVEb2MoZG9jKSB7XG4gICAgcmV0dXJuIG1hcERvYyQ1KGRvYywgY3VycmVudERvYyA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnREb2MucGFydHMpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREb2M7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50RG9jLnR5cGUgPT09IFwiY29uY2F0XCIgJiYgY3VycmVudERvYy5wYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREb2MucGFydHNbMF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnRzID0gY3VycmVudERvYy5wYXJ0cy5yZWR1Y2UoKHBhcnRzLCBwYXJ0KSA9PiB7XG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiY29uY2F0XCIpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKC4uLnBhcnQucGFydHMpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnQgIT09IFwiXCIpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcnRzO1xuICAgICAgfSwgW10pO1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnREb2MsIHtcbiAgICAgICAgcGFydHM6IG5vcm1hbGl6ZVBhcnRzJDIocGFydHMpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50VXJsKHVybCwgZGFuZ2Vyb3VzQ2hhck9yQ2hhcnMpIHtcbiAgICBjb25zdCBkYW5nZXJvdXNDaGFycyA9IFtcIiBcIl0uY29uY2F0KGRhbmdlcm91c0NoYXJPckNoYXJzIHx8IFtdKTtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChkYW5nZXJvdXNDaGFycy5tYXAoeCA9PiBcIlxcXFxcIi5jb25jYXQoeCkpLmpvaW4oXCJ8XCIpKS50ZXN0KHVybCkgPyBcIjxcIi5jb25jYXQodXJsLCBcIj5cIikgOiB1cmw7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludFRpdGxlKHRpdGxlLCBvcHRpb25zLCBwcmludFNwYWNlKSB7XG4gICAgaWYgKHByaW50U3BhY2UgPT0gbnVsbCkge1xuICAgICAgcHJpbnRTcGFjZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aXRsZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgaWYgKHByaW50U3BhY2UpIHtcbiAgICAgIHJldHVybiBcIiBcIiArIHByaW50VGl0bGUodGl0bGUsIG9wdGlvbnMsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAodGl0bGUuaW5jbHVkZXMoJ1wiJykgJiYgdGl0bGUuaW5jbHVkZXMoXCInXCIpICYmICF0aXRsZS5pbmNsdWRlcyhcIilcIikpIHtcbiAgICAgIHJldHVybiBcIihcIi5jb25jYXQodGl0bGUsIFwiKVwiKTsgLy8gYXZvaWQgZXNjYXBlZCBxdW90ZXNcbiAgICB9IC8vIGZhc3RlciB0aGFuIHVzaW5nIFJlZ0V4cHM6IGh0dHBzOi8vanNwZXJmLmNvbS9wZXJmb3JtYW5jZS1vZi1tYXRjaC12cy1zcGxpdFxuXG5cbiAgICBjb25zdCBzaW5nbGVDb3VudCA9IHRpdGxlLnNwbGl0KFwiJ1wiKS5sZW5ndGggLSAxO1xuICAgIGNvbnN0IGRvdWJsZUNvdW50ID0gdGl0bGUuc3BsaXQoJ1wiJykubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBxdW90ZSA9IHNpbmdsZUNvdW50ID4gZG91YmxlQ291bnQgPyAnXCInIDogZG91YmxlQ291bnQgPiBzaW5nbGVDb3VudCA/IFwiJ1wiIDogb3B0aW9ucy5zaW5nbGVRdW90ZSA/IFwiJ1wiIDogJ1wiJztcbiAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cChcIihcIi5jb25jYXQocXVvdGUsIFwiKVwiKSwgXCJnXCIpLCBcIlxcXFwkMVwiKTtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQocXVvdGUpLmNvbmNhdCh0aXRsZSkuY29uY2F0KHF1b3RlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnRzJDIocGFydHMpIHtcbiAgICByZXR1cm4gcGFydHMucmVkdWNlKChjdXJyZW50LCBwYXJ0KSA9PiB7XG4gICAgICBjb25zdCBsYXN0UGFydCA9IHV0aWwkMS5nZXRMYXN0KGN1cnJlbnQpO1xuXG4gICAgICBpZiAodHlwZW9mIGxhc3RQYXJ0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKC0xLCAxLCBsYXN0UGFydCArIHBhcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudC5wdXNoKHBhcnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9LCBbXSk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGFtcCh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICByZXR1cm4gdmFsdWUgPCBtaW4gPyBtaW4gOiB2YWx1ZSA+IG1heCA/IG1heCA6IHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW4kNihhc3QsIG5ld09iaiwgcGFyZW50KSB7XG4gICAgZGVsZXRlIG5ld09iai5wb3NpdGlvbjtcbiAgICBkZWxldGUgbmV3T2JqLnJhdzsgLy8gZnJvbnQtbWF0dGVyXG4gICAgLy8gZm9yIGNvZGVibG9ja1xuXG4gICAgaWYgKGFzdC50eXBlID09PSBcImNvZGVcIiB8fCBhc3QudHlwZSA9PT0gXCJ5YW1sXCIgfHwgYXN0LnR5cGUgPT09IFwiaW1wb3J0XCIgfHwgYXN0LnR5cGUgPT09IFwiZXhwb3J0XCIgfHwgYXN0LnR5cGUgPT09IFwianN4XCIpIHtcbiAgICAgIGRlbGV0ZSBuZXdPYmoudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGFzdC50eXBlID09PSBcImxpc3RcIikge1xuICAgICAgZGVsZXRlIG5ld09iai5pc0FsaWduZWQ7XG4gICAgfSAvLyB0ZXh0cyBjYW4gYmUgc3BsaXR0ZWQgb3IgbWVyZ2VkXG5cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChhc3QudHlwZSA9PT0gXCJpbmxpbmVDb2RlXCIpIHtcbiAgICAgIG5ld09iai52YWx1ZSA9IGFzdC52YWx1ZS5yZXBsYWNlKC9bIFxcdFxcbl0rL2csIFwiIFwiKTtcbiAgICB9IC8vIGZvciBpbnNlcnQgcHJhZ21hXG5cblxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09IFwicm9vdFwiICYmIHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPiAwICYmIChwYXJlbnQuY2hpbGRyZW5bMF0gPT09IGFzdCB8fCAocGFyZW50LmNoaWxkcmVuWzBdLnR5cGUgPT09IFwieWFtbFwiIHx8IHBhcmVudC5jaGlsZHJlblswXS50eXBlID09PSBcInRvbWxcIikgJiYgcGFyZW50LmNoaWxkcmVuWzFdID09PSBhc3QpICYmIGFzdC50eXBlID09PSBcImh0bWxcIiAmJiBwcmFnbWEkNC5zdGFydFdpdGhQcmFnbWEoYXN0LnZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFzUHJldHRpZXJJZ25vcmUkNihwYXRoKSB7XG4gICAgY29uc3QgaW5kZXggPSArcGF0aC5nZXROYW1lKCk7XG5cbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2Tm9kZSA9IHBhdGguZ2V0UGFyZW50Tm9kZSgpLmNoaWxkcmVuW2luZGV4IC0gMV07XG4gICAgcmV0dXJuIGlzUHJldHRpZXJJZ25vcmUkMShwcmV2Tm9kZSkgPT09IFwibmV4dFwiO1xuICB9XG5cbiAgdmFyIHByaW50ZXJNYXJrZG93biA9IHtcbiAgICBwcmVwcm9jZXNzOiBwcmVwcm9jZXNzXzEkMixcbiAgICBwcmludDogZ2VuZXJpY1ByaW50JDUsXG4gICAgZW1iZWQ6IGVtYmVkXzEkMixcbiAgICBtYXNzYWdlQXN0Tm9kZTogY2xlYW4kNixcbiAgICBoYXNQcmV0dGllcklnbm9yZTogaGFzUHJldHRpZXJJZ25vcmUkNixcbiAgICBpbnNlcnRQcmFnbWE6IHByYWdtYSQ0Lmluc2VydFByYWdtYVxuICB9O1xuXG4gIHZhciBvcHRpb25zJDYgPSB7XG4gICAgcHJvc2VXcmFwOiBjb21tb25PcHRpb25zLnByb3NlV3JhcCxcbiAgICBzaW5nbGVRdW90ZTogY29tbW9uT3B0aW9ucy5zaW5nbGVRdW90ZVxuICB9O1xuXG4gIHZhciBuYW1lJGcgPSBcIk1hcmtkb3duXCI7XG4gIHZhciB0eXBlJGYgPSBcInByb3NlXCI7XG4gIHZhciBhbGlhc2VzJDUgPSBbXG4gIFx0XCJwYW5kb2NcIlxuICBdO1xuICB2YXIgYWNlTW9kZSRmID0gXCJtYXJrZG93blwiO1xuICB2YXIgY29kZW1pcnJvck1vZGUkYiA9IFwiZ2ZtXCI7XG4gIHZhciBjb2RlbWlycm9yTWltZVR5cGUkYiA9IFwidGV4dC94LWdmbVwiO1xuICB2YXIgd3JhcCA9IHRydWU7XG4gIHZhciBleHRlbnNpb25zJGYgPSBbXG4gIFx0XCIubWRcIixcbiAgXHRcIi5tYXJrZG93blwiLFxuICBcdFwiLm1kb3duXCIsXG4gIFx0XCIubWR3blwiLFxuICBcdFwiLm1keFwiLFxuICBcdFwiLm1rZFwiLFxuICBcdFwiLm1rZG5cIixcbiAgXHRcIi5ta2Rvd25cIixcbiAgXHRcIi5yb25uXCIsXG4gIFx0XCIud29ya2Jvb2tcIlxuICBdO1xuICB2YXIgZmlsZW5hbWVzJDMgPSBbXG4gIFx0XCJjb250ZW50cy5sclwiXG4gIF07XG4gIHZhciB0bVNjb3BlJGYgPSBcInNvdXJjZS5nZm1cIjtcbiAgdmFyIGxhbmd1YWdlSWQkZiA9IDIyMjtcbiAgdmFyIE1hcmtkb3duID0ge1xuICBcdG5hbWU6IG5hbWUkZyxcbiAgXHR0eXBlOiB0eXBlJGYsXG4gIFx0YWxpYXNlczogYWxpYXNlcyQ1LFxuICBcdGFjZU1vZGU6IGFjZU1vZGUkZixcbiAgXHRjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUkYixcbiAgXHRjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSRiLFxuICBcdHdyYXA6IHdyYXAsXG4gIFx0ZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyRmLFxuICBcdGZpbGVuYW1lczogZmlsZW5hbWVzJDMsXG4gIFx0dG1TY29wZTogdG1TY29wZSRmLFxuICBcdGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWQkZlxuICB9O1xuXG4gIHZhciBNYXJrZG93biQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBuYW1lOiBuYW1lJGcsXG4gICAgdHlwZTogdHlwZSRmLFxuICAgIGFsaWFzZXM6IGFsaWFzZXMkNSxcbiAgICBhY2VNb2RlOiBhY2VNb2RlJGYsXG4gICAgY29kZW1pcnJvck1vZGU6IGNvZGVtaXJyb3JNb2RlJGIsXG4gICAgY29kZW1pcnJvck1pbWVUeXBlOiBjb2RlbWlycm9yTWltZVR5cGUkYixcbiAgICB3cmFwOiB3cmFwLFxuICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMkZixcbiAgICBmaWxlbmFtZXM6IGZpbGVuYW1lcyQzLFxuICAgIHRtU2NvcGU6IHRtU2NvcGUkZixcbiAgICBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJGYsXG4gICAgJ2RlZmF1bHQnOiBNYXJrZG93blxuICB9KTtcblxuICB2YXIgcmVxdWlyZSQkMCQ3ID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShNYXJrZG93biQxKTtcblxuICBjb25zdCBsYW5ndWFnZXMkNSA9IFtjcmVhdGVMYW5ndWFnZShyZXF1aXJlJCQwJDcsIGRhdGEgPT4gKHtcbiAgICBzaW5jZTogXCIxLjguMFwiLFxuICAgIHBhcnNlcnM6IFtcIm1hcmtkb3duXCJdLFxuICAgIHZzY29kZUxhbmd1YWdlSWRzOiBbXCJtYXJrZG93blwiXSxcbiAgICBmaWxlbmFtZXM6IGRhdGEuZmlsZW5hbWVzLmNvbmNhdChbXCJSRUFETUVcIl0pLFxuICAgIGV4dGVuc2lvbnM6IGRhdGEuZXh0ZW5zaW9ucy5maWx0ZXIoZXh0ZW5zaW9uID0+IGV4dGVuc2lvbiAhPT0gXCIubWR4XCIpXG4gIH0pKSwgY3JlYXRlTGFuZ3VhZ2UocmVxdWlyZSQkMCQ3LCAoKSA9PiAoe1xuICAgIG5hbWU6IFwiTURYXCIsXG4gICAgc2luY2U6IFwiMS4xNS4wXCIsXG4gICAgcGFyc2VyczogW1wibWR4XCJdLFxuICAgIHZzY29kZUxhbmd1YWdlSWRzOiBbXCJtZHhcIl0sXG4gICAgZmlsZW5hbWVzOiBbXSxcbiAgICBleHRlbnNpb25zOiBbXCIubWR4XCJdXG4gIH0pKV07XG4gIGNvbnN0IHByaW50ZXJzJDUgPSB7XG4gICAgbWRhc3Q6IHByaW50ZXJNYXJrZG93blxuICB9O1xuICB2YXIgbGFuZ3VhZ2VNYXJrZG93biA9IHtcbiAgICBsYW5ndWFnZXM6IGxhbmd1YWdlcyQ1LFxuICAgIG9wdGlvbnM6IG9wdGlvbnMkNixcbiAgICBwcmludGVyczogcHJpbnRlcnMkNVxuICB9O1xuXG4gIGZ1bmN0aW9uIGlzUHJhZ21hKHRleHQpIHtcbiAgICByZXR1cm4gL15cXHMqQChwcmV0dGllcnxmb3JtYXQpXFxzKiQvLnRlc3QodGV4dCk7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNQcmFnbWEkNCh0ZXh0KSB7XG4gICAgcmV0dXJuIC9eXFxzKiNbXlxcblxcU10qQChwcmV0dGllcnxmb3JtYXQpXFxzKj8oXFxufCQpLy50ZXN0KHRleHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0UHJhZ21hJDgodGV4dCkge1xuICAgIHJldHVybiBcIiMgQGZvcm1hdFxcblxcblwiLmNvbmNhdCh0ZXh0KTtcbiAgfVxuXG4gIHZhciBwcmFnbWEkNSA9IHtcbiAgICBpc1ByYWdtYSxcbiAgICBoYXNQcmFnbWE6IGhhc1ByYWdtYSQ0LFxuICAgIGluc2VydFByYWdtYTogaW5zZXJ0UHJhZ21hJDhcbiAgfTtcblxuICBjb25zdCB7XG4gICAgZ2V0TGFzdDogZ2V0TGFzdCQ1XG4gIH0gPSB1dGlsJDE7XG5cbiAgZnVuY3Rpb24gZ2V0QW5jZXN0b3JDb3VudChwYXRoLCBmaWx0ZXIpIHtcbiAgICBsZXQgY291bnRlciA9IDA7XG4gICAgY29uc3QgcGF0aFN0YWNrTGVuZ3RoID0gcGF0aC5zdGFjay5sZW5ndGggLSAxO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoU3RhY2tMZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBwYXRoLnN0YWNrW2ldO1xuXG4gICAgICBpZiAoaXNOb2RlKHZhbHVlKSAmJiBmaWx0ZXIodmFsdWUpKSB7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRlcjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSB0eXBlc1xuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGlzTm9kZSh2YWx1ZSwgdHlwZXMpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgKCF0eXBlcyB8fCB0eXBlcy5pbmNsdWRlcyh2YWx1ZS50eXBlKSk7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBOb2RlKG5vZGUsIGNhbGxiYWNrLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soXCJjaGlsZHJlblwiIGluIG5vZGUgPyBPYmplY3QuYXNzaWduKHt9LCBub2RlLCB7XG4gICAgICBjaGlsZHJlbjogbm9kZS5jaGlsZHJlbi5tYXAoY2hpbGROb2RlID0+IG1hcE5vZGUoY2hpbGROb2RlLCBjYWxsYmFjaywgbm9kZSkpXG4gICAgfSkgOiBub2RlLCBwYXJlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmaW5lU2hvcnRjdXQoeCwga2V5LCBnZXR0ZXIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoeCwga2V5LCB7XG4gICAgICBnZXQ6IGdldHRlcixcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05leHRMaW5lRW1wdHkkNShub2RlLCB0ZXh0KSB7XG4gICAgbGV0IG5ld2xpbmVDb3VudCA9IDA7XG4gICAgY29uc3QgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IG5vZGUucG9zaXRpb24uZW5kLm9mZnNldCAtIDE7IGkgPCB0ZXh0TGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSB0ZXh0W2ldO1xuXG4gICAgICBpZiAoY2hhciA9PT0gXCJcXG5cIikge1xuICAgICAgICBuZXdsaW5lQ291bnQrKztcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld2xpbmVDb3VudCA9PT0gMSAmJiAvXFxTLy50ZXN0KGNoYXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld2xpbmVDb3VudCA9PT0gMikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBpc0xhc3REZXNjZW5kYW50Tm9kZShwYXRoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwidGFnXCI6XG4gICAgICBjYXNlIFwiYW5jaG9yXCI6XG4gICAgICBjYXNlIFwiY29tbWVudFwiOlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aFN0YWNrTGVuZ3RoID0gcGF0aC5zdGFjay5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhdGhTdGFja0xlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gcGF0aC5zdGFja1tpXTtcbiAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSBwYXRoLnN0YWNrW2kgLSAxXTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyZW50SXRlbSkgJiYgdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIgJiYgaXRlbSAhPT0gcGFyZW50SXRlbS5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExhc3REZXNjZW5kYW50Tm9kZSQxKG5vZGUpIHtcbiAgICByZXR1cm4gXCJjaGlsZHJlblwiIGluIG5vZGUgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggIT09IDAgPyBnZXRMYXN0RGVzY2VuZGFudE5vZGUkMShnZXRMYXN0JDUobm9kZS5jaGlsZHJlbikpIDogbm9kZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUHJldHRpZXJJZ25vcmUkMihjb21tZW50KSB7XG4gICAgcmV0dXJuIGNvbW1lbnQudmFsdWUudHJpbSgpID09PSBcInByZXR0aWVyLWlnbm9yZVwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzUHJldHRpZXJJZ25vcmUkNyhwYXRoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcblxuICAgIGlmIChub2RlLnR5cGUgPT09IFwiZG9jdW1lbnRCb2R5XCIpIHtcbiAgICAgIGNvbnN0IGRvY3VtZW50ID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgICByZXR1cm4gaGFzRW5kQ29tbWVudHMoZG9jdW1lbnQuaGVhZCkgJiYgaXNQcmV0dGllcklnbm9yZSQyKGdldExhc3QkNShkb2N1bWVudC5oZWFkLmVuZENvbW1lbnRzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc0xlYWRpbmdDb21tZW50cyhub2RlKSAmJiBpc1ByZXR0aWVySWdub3JlJDIoZ2V0TGFzdCQ1KG5vZGUubGVhZGluZ0NvbW1lbnRzKSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0VtcHR5Tm9kZShub2RlKSB7XG4gICAgcmV0dXJuICghbm9kZS5jaGlsZHJlbiB8fCBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgJiYgIWhhc0NvbW1lbnRzKG5vZGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzQ29tbWVudHMobm9kZSkge1xuICAgIHJldHVybiBoYXNMZWFkaW5nQ29tbWVudHMobm9kZSkgfHwgaGFzTWlkZGxlQ29tbWVudHMobm9kZSkgfHwgaGFzSW5kaWNhdG9yQ29tbWVudChub2RlKSB8fCBoYXNUcmFpbGluZ0NvbW1lbnQkMihub2RlKSB8fCBoYXNFbmRDb21tZW50cyhub2RlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0xlYWRpbmdDb21tZW50cyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5sZWFkaW5nQ29tbWVudHMgJiYgbm9kZS5sZWFkaW5nQ29tbWVudHMubGVuZ3RoICE9PSAwO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzTWlkZGxlQ29tbWVudHMobm9kZSkge1xuICAgIHJldHVybiBub2RlICYmIG5vZGUubWlkZGxlQ29tbWVudHMgJiYgbm9kZS5taWRkbGVDb21tZW50cy5sZW5ndGggIT09IDA7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNJbmRpY2F0b3JDb21tZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZSAmJiBub2RlLmluZGljYXRvckNvbW1lbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNUcmFpbGluZ0NvbW1lbnQkMihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgbm9kZS50cmFpbGluZ0NvbW1lbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNFbmRDb21tZW50cyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5lbmRDb21tZW50cyAmJiBub2RlLmVuZENvbW1lbnRzLmxlbmd0aCAhPT0gMDtcbiAgfVxuICAvKipcbiAgICogXCIgYSAgIGIgYyAgIGQgZSAgIGYgXCIgLT4gW1wiIGEgICBiXCIsIFwiYyAgIGRcIiwgXCJlICAgZiBcIl1cbiAgICovXG5cblxuICBmdW5jdGlvbiBzcGxpdFdpdGhTaW5nbGVTcGFjZSh0ZXh0KSB7XG4gICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICBsZXQgbGFzdFBhcnQgPSB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgdGV4dC5zcGxpdCgvKCArKS9nKSkge1xuICAgICAgaWYgKHBhcnQgIT09IFwiIFwiKSB7XG4gICAgICAgIGlmIChsYXN0UGFydCA9PT0gXCIgXCIpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnRzLnB1c2goKHBhcnRzLnBvcCgpIHx8IFwiXCIpICsgcGFydCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobGFzdFBhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KFwiXCIpO1xuICAgICAgfVxuXG4gICAgICBsYXN0UGFydCA9IHBhcnQ7XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQYXJ0ID09PSBcIiBcIikge1xuICAgICAgcGFydHMucHVzaCgocGFydHMucG9wKCkgfHwgXCJcIikgKyBcIiBcIik7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzWzBdID09PSBcIlwiKSB7XG4gICAgICBwYXJ0cy5zaGlmdCgpO1xuICAgICAgcGFydHMudW5zaGlmdChcIiBcIiArIChwYXJ0cy5zaGlmdCgpIHx8IFwiXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHM7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGbG93U2NhbGFyTGluZUNvbnRlbnRzKG5vZGVUeXBlLCBjb250ZW50LCBvcHRpb25zKSB7XG4gICAgY29uc3QgcmF3TGluZUNvbnRlbnRzID0gY29udGVudC5zcGxpdChcIlxcblwiKS5tYXAoKGxpbmVDb250ZW50LCBpbmRleCwgbGluZUNvbnRlbnRzKSA9PiBpbmRleCA9PT0gMCAmJiBpbmRleCA9PT0gbGluZUNvbnRlbnRzLmxlbmd0aCAtIDEgPyBsaW5lQ29udGVudCA6IGluZGV4ICE9PSAwICYmIGluZGV4ICE9PSBsaW5lQ29udGVudHMubGVuZ3RoIC0gMSA/IGxpbmVDb250ZW50LnRyaW0oKSA6IGluZGV4ID09PSAwID8gbGluZUNvbnRlbnQudHJpbUVuZCgpIDogbGluZUNvbnRlbnQudHJpbVN0YXJ0KCkpO1xuXG4gICAgaWYgKG9wdGlvbnMucHJvc2VXcmFwID09PSBcInByZXNlcnZlXCIpIHtcbiAgICAgIHJldHVybiByYXdMaW5lQ29udGVudHMubWFwKGxpbmVDb250ZW50ID0+IGxpbmVDb250ZW50Lmxlbmd0aCA9PT0gMCA/IFtdIDogW2xpbmVDb250ZW50XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0xpbmVDb250ZW50cy5tYXAobGluZUNvbnRlbnQgPT4gbGluZUNvbnRlbnQubGVuZ3RoID09PSAwID8gW10gOiBzcGxpdFdpdGhTaW5nbGVTcGFjZShsaW5lQ29udGVudCkpLnJlZHVjZSgocmVkdWNlZCwgbGluZUNvbnRlbnRXb3JkcywgaW5kZXgpID0+IGluZGV4ICE9PSAwICYmIHJhd0xpbmVDb250ZW50c1tpbmRleCAtIDFdLmxlbmd0aCAhPT0gMCAmJiBsaW5lQ29udGVudFdvcmRzLmxlbmd0aCAhPT0gMCAmJiAhKCAvLyB0cmFpbGluZyBiYWNrc2xhc2ggaW4gcXVvdGVEb3VibGUgc2hvdWxkIGJlIHByZXNlcnZlZFxuICAgIG5vZGVUeXBlID09PSBcInF1b3RlRG91YmxlXCIgJiYgZ2V0TGFzdCQ1KGdldExhc3QkNShyZWR1Y2VkKSkuZW5kc1dpdGgoXCJcXFxcXCIpKSA/IHJlZHVjZWQuY29uY2F0KFtyZWR1Y2VkLnBvcCgpLmNvbmNhdChsaW5lQ29udGVudFdvcmRzKV0pIDogcmVkdWNlZC5jb25jYXQoW2xpbmVDb250ZW50V29yZHNdKSwgW10pLm1hcChsaW5lQ29udGVudFdvcmRzID0+IG9wdGlvbnMucHJvc2VXcmFwID09PSBcIm5ldmVyXCIgPyBbbGluZUNvbnRlbnRXb3Jkcy5qb2luKFwiIFwiKV0gOiBsaW5lQ29udGVudFdvcmRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJsb2NrVmFsdWVMaW5lQ29udGVudHMobm9kZSwge1xuICAgIHBhcmVudEluZGVudCxcbiAgICBpc0xhc3REZXNjZW5kYW50LFxuICAgIG9wdGlvbnNcbiAgfSkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBub2RlLnBvc2l0aW9uLnN0YXJ0LmxpbmUgPT09IG5vZGUucG9zaXRpb24uZW5kLmxpbmUgPyBcIlwiIDogb3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2Uobm9kZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQsIG5vZGUucG9zaXRpb24uZW5kLm9mZnNldCkgLy8gZXhjbHVkZSBvcGVuIGxpbmUgYD5gIG9yIGB8YFxuICAgIC5tYXRjaCgvXlteXFxuXSo/XFxuKFtcXHNcXFNdKikkLylbMV07XG4gICAgY29uc3QgbGVhZGluZ1NwYWNlQ291bnQgPSBub2RlLmluZGVudCA9PT0gbnVsbCA/IChtYXRjaCA9PiBtYXRjaCA/IG1hdGNoWzFdLmxlbmd0aCA6IEluZmluaXR5KShjb250ZW50Lm1hdGNoKC9eKCAqKVxcUy9tKSkgOiBub2RlLmluZGVudCAtIDEgKyBwYXJlbnRJbmRlbnQ7XG4gICAgY29uc3QgcmF3TGluZUNvbnRlbnRzID0gY29udGVudC5zcGxpdChcIlxcblwiKS5tYXAobGluZUNvbnRlbnQgPT4gbGluZUNvbnRlbnQuc2xpY2UobGVhZGluZ1NwYWNlQ291bnQpKTtcblxuICAgIGlmIChvcHRpb25zLnByb3NlV3JhcCA9PT0gXCJwcmVzZXJ2ZVwiIHx8IG5vZGUudHlwZSA9PT0gXCJibG9ja0xpdGVyYWxcIikge1xuICAgICAgcmV0dXJuIHJlbW92ZVVubmVjZXNzYXJ5VHJhaWxpbmdOZXdsaW5lcyhyYXdMaW5lQ29udGVudHMubWFwKGxpbmVDb250ZW50ID0+IGxpbmVDb250ZW50Lmxlbmd0aCA9PT0gMCA/IFtdIDogW2xpbmVDb250ZW50XSkpO1xuICAgIH1cblxuICAgIHJldHVybiByZW1vdmVVbm5lY2Vzc2FyeVRyYWlsaW5nTmV3bGluZXMocmF3TGluZUNvbnRlbnRzLm1hcChsaW5lQ29udGVudCA9PiBsaW5lQ29udGVudC5sZW5ndGggPT09IDAgPyBbXSA6IHNwbGl0V2l0aFNpbmdsZVNwYWNlKGxpbmVDb250ZW50KSkucmVkdWNlKChyZWR1Y2VkLCBsaW5lQ29udGVudFdvcmRzLCBpbmRleCkgPT4gaW5kZXggIT09IDAgJiYgcmF3TGluZUNvbnRlbnRzW2luZGV4IC0gMV0ubGVuZ3RoICE9PSAwICYmIGxpbmVDb250ZW50V29yZHMubGVuZ3RoICE9PSAwICYmICEvXlxccy8udGVzdChsaW5lQ29udGVudFdvcmRzWzBdKSAmJiAhL15cXHN8XFxzJC8udGVzdChnZXRMYXN0JDUocmVkdWNlZCkpID8gcmVkdWNlZC5jb25jYXQoW3JlZHVjZWQucG9wKCkuY29uY2F0KGxpbmVDb250ZW50V29yZHMpXSkgOiByZWR1Y2VkLmNvbmNhdChbbGluZUNvbnRlbnRXb3Jkc10pLCBbXSkubWFwKGxpbmVDb250ZW50V29yZHMgPT4gbGluZUNvbnRlbnRXb3Jkcy5yZWR1Y2UoKHJlZHVjZWQsIHdvcmQpID0+IC8vIGRpc2FsbG93IHRyYWlsaW5nIHNwYWNlc1xuICAgIHJlZHVjZWQubGVuZ3RoICE9PSAwICYmIC9cXHMkLy50ZXN0KGdldExhc3QkNShyZWR1Y2VkKSkgPyByZWR1Y2VkLmNvbmNhdChyZWR1Y2VkLnBvcCgpICsgXCIgXCIgKyB3b3JkKSA6IHJlZHVjZWQuY29uY2F0KHdvcmQpLCBbXSkpLm1hcChsaW5lQ29udGVudFdvcmRzID0+IG9wdGlvbnMucHJvc2VXcmFwID09PSBcIm5ldmVyXCIgPyBbbGluZUNvbnRlbnRXb3Jkcy5qb2luKFwiIFwiKV0gOiBsaW5lQ29udGVudFdvcmRzKSk7XG5cbiAgICBmdW5jdGlvbiByZW1vdmVVbm5lY2Vzc2FyeVRyYWlsaW5nTmV3bGluZXMobGluZUNvbnRlbnRzKSB7XG4gICAgICBpZiAobm9kZS5jaG9tcGluZyA9PT0gXCJrZWVwXCIpIHtcbiAgICAgICAgcmV0dXJuIGdldExhc3QkNShsaW5lQ29udGVudHMpLmxlbmd0aCA9PT0gMCA/IGxpbmVDb250ZW50cy5zbGljZSgwLCAtMSkgOiBsaW5lQ29udGVudHM7XG4gICAgICB9XG5cbiAgICAgIGxldCB0cmFpbGluZ05ld2xpbmVDb3VudCA9IDA7XG5cbiAgICAgIGZvciAobGV0IGkgPSBsaW5lQ29udGVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGxpbmVDb250ZW50c1tpXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0cmFpbGluZ05ld2xpbmVDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cmFpbGluZ05ld2xpbmVDb3VudCA9PT0gMCA/IGxpbmVDb250ZW50cyA6IHRyYWlsaW5nTmV3bGluZUNvdW50ID49IDIgJiYgIWlzTGFzdERlc2NlbmRhbnQgPyAvLyBuZXh0IGVtcHR5IGxpbmVcbiAgICAgIGxpbmVDb250ZW50cy5zbGljZSgwLCAtKHRyYWlsaW5nTmV3bGluZUNvdW50IC0gMSkpIDogbGluZUNvbnRlbnRzLnNsaWNlKDAsIC10cmFpbGluZ05ld2xpbmVDb3VudCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHV0aWxzJDcgPSB7XG4gICAgZ2V0TGFzdDogZ2V0TGFzdCQ1LFxuICAgIGdldEFuY2VzdG9yQ291bnQsXG4gICAgaXNOb2RlLFxuICAgIGlzRW1wdHlOb2RlLFxuICAgIG1hcE5vZGUsXG4gICAgZGVmaW5lU2hvcnRjdXQsXG4gICAgaXNOZXh0TGluZUVtcHR5OiBpc05leHRMaW5lRW1wdHkkNSxcbiAgICBpc0xhc3REZXNjZW5kYW50Tm9kZSxcbiAgICBnZXRCbG9ja1ZhbHVlTGluZUNvbnRlbnRzLFxuICAgIGdldEZsb3dTY2FsYXJMaW5lQ29udGVudHMsXG4gICAgZ2V0TGFzdERlc2NlbmRhbnROb2RlOiBnZXRMYXN0RGVzY2VuZGFudE5vZGUkMSxcbiAgICBoYXNQcmV0dGllcklnbm9yZTogaGFzUHJldHRpZXJJZ25vcmUkNyxcbiAgICBoYXNMZWFkaW5nQ29tbWVudHMsXG4gICAgaGFzTWlkZGxlQ29tbWVudHMsXG4gICAgaGFzSW5kaWNhdG9yQ29tbWVudCxcbiAgICBoYXNUcmFpbGluZ0NvbW1lbnQ6IGhhc1RyYWlsaW5nQ29tbWVudCQyLFxuICAgIGhhc0VuZENvbW1lbnRzXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIGluc2VydFByYWdtYTogaW5zZXJ0UHJhZ21hJDksXG4gICAgaXNQcmFnbWE6IGlzUHJhZ21hJDFcbiAgfSA9IHByYWdtYSQ1O1xuICBjb25zdCB7XG4gICAgZ2V0QW5jZXN0b3JDb3VudDogZ2V0QW5jZXN0b3JDb3VudCQxLFxuICAgIGdldEJsb2NrVmFsdWVMaW5lQ29udGVudHM6IGdldEJsb2NrVmFsdWVMaW5lQ29udGVudHMkMSxcbiAgICBnZXRGbG93U2NhbGFyTGluZUNvbnRlbnRzOiBnZXRGbG93U2NhbGFyTGluZUNvbnRlbnRzJDEsXG4gICAgZ2V0TGFzdDogZ2V0TGFzdCQ2LFxuICAgIGdldExhc3REZXNjZW5kYW50Tm9kZTogZ2V0TGFzdERlc2NlbmRhbnROb2RlJDIsXG4gICAgaGFzTGVhZGluZ0NvbW1lbnRzOiBoYXNMZWFkaW5nQ29tbWVudHMkMSxcbiAgICBoYXNNaWRkbGVDb21tZW50czogaGFzTWlkZGxlQ29tbWVudHMkMSxcbiAgICBoYXNJbmRpY2F0b3JDb21tZW50OiBoYXNJbmRpY2F0b3JDb21tZW50JDEsXG4gICAgaGFzVHJhaWxpbmdDb21tZW50OiBoYXNUcmFpbGluZ0NvbW1lbnQkMyxcbiAgICBoYXNFbmRDb21tZW50czogaGFzRW5kQ29tbWVudHMkMSxcbiAgICBoYXNQcmV0dGllcklnbm9yZTogaGFzUHJldHRpZXJJZ25vcmUkOCxcbiAgICBpc0xhc3REZXNjZW5kYW50Tm9kZTogaXNMYXN0RGVzY2VuZGFudE5vZGUkMSxcbiAgICBpc05leHRMaW5lRW1wdHk6IGlzTmV4dExpbmVFbXB0eSQ2LFxuICAgIGlzTm9kZTogaXNOb2RlJDEsXG4gICAgaXNFbXB0eU5vZGU6IGlzRW1wdHlOb2RlJDEsXG4gICAgZGVmaW5lU2hvcnRjdXQ6IGRlZmluZVNob3J0Y3V0JDEsXG4gICAgbWFwTm9kZTogbWFwTm9kZSQxXG4gIH0gPSB1dGlscyQ3O1xuICBjb25zdCBkb2NCdWlsZGVycyQyID0gZG9jdW1lbnQuYnVpbGRlcnM7XG4gIGNvbnN0IHtcbiAgICBjb25kaXRpb25hbEdyb3VwOiBjb25kaXRpb25hbEdyb3VwJDIsXG4gICAgYnJlYWtQYXJlbnQ6IGJyZWFrUGFyZW50JDUsXG4gICAgY29uY2F0OiBjb25jYXQkaCxcbiAgICBkZWRlbnQ6IGRlZGVudCQzLFxuICAgIGRlZGVudFRvUm9vdDogZGVkZW50VG9Sb290JDMsXG4gICAgZmlsbDogZmlsbCQ2LFxuICAgIGdyb3VwOiBncm91cCRnLFxuICAgIGhhcmRsaW5lOiBoYXJkbGluZSRkLFxuICAgIGlmQnJlYWs6IGlmQnJlYWskOCxcbiAgICBqb2luOiBqb2luJGMsXG4gICAgbGluZTogbGluZSRiLFxuICAgIGxpbmVTdWZmaXg6IGxpbmVTdWZmaXgkMixcbiAgICBsaXRlcmFsbGluZTogbGl0ZXJhbGxpbmUkNyxcbiAgICBtYXJrQXNSb290OiBtYXJrQXNSb290JDUsXG4gICAgc29mdGxpbmU6IHNvZnRsaW5lJDhcbiAgfSA9IGRvY0J1aWxkZXJzJDI7XG4gIGNvbnN0IHtcbiAgICByZXBsYWNlRW5kT2ZMaW5lV2l0aDogcmVwbGFjZUVuZE9mTGluZVdpdGgkM1xuICB9ID0gdXRpbCQxO1xuXG4gIGZ1bmN0aW9uIHByZXByb2Nlc3MkMyhhc3QpIHtcbiAgICByZXR1cm4gbWFwTm9kZSQxKGFzdCwgZGVmaW5lU2hvcnRjdXRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZmluZVNob3J0Y3V0cyhub2RlKSB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJkb2N1bWVudFwiOlxuICAgICAgICBkZWZpbmVTaG9ydGN1dCQxKG5vZGUsIFwiaGVhZFwiLCAoKSA9PiBub2RlLmNoaWxkcmVuWzBdKTtcbiAgICAgICAgZGVmaW5lU2hvcnRjdXQkMShub2RlLCBcImJvZHlcIiwgKCkgPT4gbm9kZS5jaGlsZHJlblsxXSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiZG9jdW1lbnRCb2R5XCI6XG4gICAgICBjYXNlIFwic2VxdWVuY2VJdGVtXCI6XG4gICAgICBjYXNlIFwiZmxvd1NlcXVlbmNlSXRlbVwiOlxuICAgICAgY2FzZSBcIm1hcHBpbmdLZXlcIjpcbiAgICAgIGNhc2UgXCJtYXBwaW5nVmFsdWVcIjpcbiAgICAgICAgZGVmaW5lU2hvcnRjdXQkMShub2RlLCBcImNvbnRlbnRcIiwgKCkgPT4gbm9kZS5jaGlsZHJlblswXSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwibWFwcGluZ0l0ZW1cIjpcbiAgICAgIGNhc2UgXCJmbG93TWFwcGluZ0l0ZW1cIjpcbiAgICAgICAgZGVmaW5lU2hvcnRjdXQkMShub2RlLCBcImtleVwiLCAoKSA9PiBub2RlLmNoaWxkcmVuWzBdKTtcbiAgICAgICAgZGVmaW5lU2hvcnRjdXQkMShub2RlLCBcInZhbHVlXCIsICgpID0+IG5vZGUuY2hpbGRyZW5bMV0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyaWNQcmludCQ2KHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBwYXJlbnROb2RlID0gcGF0aC5nZXRQYXJlbnROb2RlKCk7XG4gICAgY29uc3QgdGFnID0gIW5vZGUudGFnID8gXCJcIiA6IHBhdGguY2FsbChwcmludCwgXCJ0YWdcIik7XG4gICAgY29uc3QgYW5jaG9yID0gIW5vZGUuYW5jaG9yID8gXCJcIiA6IHBhdGguY2FsbChwcmludCwgXCJhbmNob3JcIik7XG4gICAgY29uc3QgbmV4dEVtcHR5TGluZSA9IGlzTm9kZSQxKG5vZGUsIFtcIm1hcHBpbmdcIiwgXCJzZXF1ZW5jZVwiLCBcImNvbW1lbnRcIiwgXCJkaXJlY3RpdmVcIiwgXCJtYXBwaW5nSXRlbVwiLCBcInNlcXVlbmNlSXRlbVwiXSkgJiYgIWlzTGFzdERlc2NlbmRhbnROb2RlJDEocGF0aCkgPyBwcmludE5leHRFbXB0eUxpbmUocGF0aCwgb3B0aW9ucy5vcmlnaW5hbFRleHQpIDogXCJcIjtcbiAgICByZXR1cm4gY29uY2F0JGgoW25vZGUudHlwZSAhPT0gXCJtYXBwaW5nVmFsdWVcIiAmJiBoYXNMZWFkaW5nQ29tbWVudHMkMShub2RlKSA/IGNvbmNhdCRoKFtqb2luJGMoaGFyZGxpbmUkZCwgcGF0aC5tYXAocHJpbnQsIFwibGVhZGluZ0NvbW1lbnRzXCIpKSwgaGFyZGxpbmUkZF0pIDogXCJcIiwgdGFnLCB0YWcgJiYgYW5jaG9yID8gXCIgXCIgOiBcIlwiLCBhbmNob3IsIHRhZyB8fCBhbmNob3IgPyBpc05vZGUkMShub2RlLCBbXCJzZXF1ZW5jZVwiLCBcIm1hcHBpbmdcIl0pICYmICFoYXNNaWRkbGVDb21tZW50cyQxKG5vZGUpID8gaGFyZGxpbmUkZCA6IFwiIFwiIDogXCJcIiwgaGFzTWlkZGxlQ29tbWVudHMkMShub2RlKSA/IGNvbmNhdCRoKFtub2RlLm1pZGRsZUNvbW1lbnRzLmxlbmd0aCA9PT0gMSA/IFwiXCIgOiBoYXJkbGluZSRkLCBqb2luJGMoaGFyZGxpbmUkZCwgcGF0aC5tYXAocHJpbnQsIFwibWlkZGxlQ29tbWVudHNcIikpLCBoYXJkbGluZSRkXSkgOiBcIlwiLCBoYXNQcmV0dGllcklnbm9yZSQ4KHBhdGgpID8gY29uY2F0JGgocmVwbGFjZUVuZE9mTGluZVdpdGgkMyhvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShub2RlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCwgbm9kZS5wb3NpdGlvbi5lbmQub2Zmc2V0KSwgbGl0ZXJhbGxpbmUkNykpIDogZ3JvdXAkZyhfcHJpbnQobm9kZSwgcGFyZW50Tm9kZSwgcGF0aCwgb3B0aW9ucywgcHJpbnQpKSwgaGFzVHJhaWxpbmdDb21tZW50JDMobm9kZSkgJiYgIWlzTm9kZSQxKG5vZGUsIFtcImRvY3VtZW50XCIsIFwiZG9jdW1lbnRIZWFkXCJdKSA/IGxpbmVTdWZmaXgkMihjb25jYXQkaChbbm9kZS50eXBlID09PSBcIm1hcHBpbmdWYWx1ZVwiICYmICFub2RlLmNvbnRlbnQgPyBcIlwiIDogXCIgXCIsIHBhcmVudE5vZGUudHlwZSA9PT0gXCJtYXBwaW5nS2V5XCIgJiYgcGF0aC5nZXRQYXJlbnROb2RlKDIpLnR5cGUgPT09IFwibWFwcGluZ1wiICYmIGlzSW5saW5lTm9kZShub2RlKSA/IFwiXCIgOiBicmVha1BhcmVudCQ1LCBwYXRoLmNhbGwocHJpbnQsIFwidHJhaWxpbmdDb21tZW50XCIpXSkpIDogXCJcIiwgbmV4dEVtcHR5TGluZSwgaGFzRW5kQ29tbWVudHMkMShub2RlKSAmJiAhaXNOb2RlJDEobm9kZSwgW1wiZG9jdW1lbnRIZWFkXCIsIFwiZG9jdW1lbnRCb2R5XCJdKSA/IGFsaWduJDMobm9kZS50eXBlID09PSBcInNlcXVlbmNlSXRlbVwiID8gMiA6IDAsIGNvbmNhdCRoKFtoYXJkbGluZSRkLCBqb2luJGMoaGFyZGxpbmUkZCwgcGF0aC5tYXAocHJpbnQsIFwiZW5kQ29tbWVudHNcIikpXSkpIDogXCJcIl0pO1xuICB9XG5cbiAgZnVuY3Rpb24gX3ByaW50KG5vZGUsIHBhcmVudE5vZGUsIHBhdGgsIG9wdGlvbnMsIHByaW50KSB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJyb290XCI6XG4gICAgICAgIHJldHVybiBjb25jYXQkaChbam9pbiRjKGhhcmRsaW5lJGQsIHBhdGgubWFwKChjaGlsZFBhdGgsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBub2RlLmNoaWxkcmVuW2luZGV4XTtcbiAgICAgICAgICBjb25zdCBuZXh0RG9jdW1lbnQgPSBub2RlLmNoaWxkcmVuW2luZGV4ICsgMV07XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRoKFtwcmludChjaGlsZFBhdGgpLCBzaG91bGRQcmludERvY3VtZW50RW5kTWFya2VyKGRvY3VtZW50LCBuZXh0RG9jdW1lbnQpID8gY29uY2F0JGgoW2hhcmRsaW5lJGQsIFwiLi4uXCIsIGhhc1RyYWlsaW5nQ29tbWVudCQzKGRvY3VtZW50KSA/IGNvbmNhdCRoKFtcIiBcIiwgcGF0aC5jYWxsKHByaW50LCBcInRyYWlsaW5nQ29tbWVudFwiKV0pIDogXCJcIl0pIDogIW5leHREb2N1bWVudCB8fCBoYXNUcmFpbGluZ0NvbW1lbnQkMyhuZXh0RG9jdW1lbnQuaGVhZCkgPyBcIlwiIDogY29uY2F0JGgoW2hhcmRsaW5lJGQsIFwiLS0tXCJdKV0pO1xuICAgICAgICB9LCBcImNoaWxkcmVuXCIpKSwgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDAgfHwgKGxhc3REZXNjZW5kYW50Tm9kZSA9PiBpc05vZGUkMShsYXN0RGVzY2VuZGFudE5vZGUsIFtcImJsb2NrTGl0ZXJhbFwiLCBcImJsb2NrRm9sZGVkXCJdKSAmJiBsYXN0RGVzY2VuZGFudE5vZGUuY2hvbXBpbmcgPT09IFwia2VlcFwiKShnZXRMYXN0RGVzY2VuZGFudE5vZGUkMihub2RlKSkgPyBcIlwiIDogaGFyZGxpbmUkZF0pO1xuXG4gICAgICBjYXNlIFwiZG9jdW1lbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IG5leHREb2N1bWVudCA9IHBhcmVudE5vZGUuY2hpbGRyZW5bcGF0aC5nZXROYW1lKCkgKyAxXTtcbiAgICAgICAgICByZXR1cm4gam9pbiRjKGhhcmRsaW5lJGQsIFtzaG91bGRQcmludERvY3VtZW50SGVhZEVuZE1hcmtlcihub2RlLCBuZXh0RG9jdW1lbnQsIHBhcmVudE5vZGUsIG9wdGlvbnMpID09PSBcImhlYWRcIiA/IGpvaW4kYyhoYXJkbGluZSRkLCBbbm9kZS5oZWFkLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiBub2RlLmhlYWQuZW5kQ29tbWVudHMubGVuZ3RoID09PSAwID8gXCJcIiA6IHBhdGguY2FsbChwcmludCwgXCJoZWFkXCIpLCBjb25jYXQkaChbXCItLS1cIiwgaGFzVHJhaWxpbmdDb21tZW50JDMobm9kZS5oZWFkKSA/IGNvbmNhdCRoKFtcIiBcIiwgcGF0aC5jYWxsKHByaW50LCBcImhlYWRcIiwgXCJ0cmFpbGluZ0NvbW1lbnRcIildKSA6IFwiXCJdKV0uZmlsdGVyKEJvb2xlYW4pKSA6IFwiXCIsIHNob3VsZFByaW50RG9jdW1lbnRCb2R5KG5vZGUpID8gcGF0aC5jYWxsKHByaW50LCBcImJvZHlcIikgOiBcIlwiXS5maWx0ZXIoQm9vbGVhbikpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJkb2N1bWVudEhlYWRcIjpcbiAgICAgICAgcmV0dXJuIGpvaW4kYyhoYXJkbGluZSRkLCBbXS5jb25jYXQocGF0aC5tYXAocHJpbnQsIFwiY2hpbGRyZW5cIiksIHBhdGgubWFwKHByaW50LCBcImVuZENvbW1lbnRzXCIpKSk7XG5cbiAgICAgIGNhc2UgXCJkb2N1bWVudEJvZHlcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gam9pbiRjKGhhcmRsaW5lJGQsIHBhdGgubWFwKHByaW50LCBcImNoaWxkcmVuXCIpKS5wYXJ0cztcbiAgICAgICAgICBjb25zdCBlbmRDb21tZW50cyA9IGpvaW4kYyhoYXJkbGluZSRkLCBwYXRoLm1hcChwcmludCwgXCJlbmRDb21tZW50c1wiKSkucGFydHM7XG4gICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IGVuZENvbW1lbnRzLmxlbmd0aCA9PT0gMCA/IFwiXCIgOiAobGFzdERlc2NlbmRhbnROb2RlID0+IGlzTm9kZSQxKGxhc3REZXNjZW5kYW50Tm9kZSwgW1wiYmxvY2tGb2xkZWRcIiwgXCJibG9ja0xpdGVyYWxcIl0pID8gbGFzdERlc2NlbmRhbnROb2RlLmNob21waW5nID09PSBcImtlZXBcIiA/IC8vIHRoZXJlJ3MgYWxyZWFkeSBhIG5ld2xpbmUgcHJpbnRlZCBhdCB0aGUgZW5kIG9mIGJsb2NrVmFsdWUgKGNob21waW5nPWtlZXAsIGxhc3REZXNjZW5kYW50PXRydWUpXG4gICAgICAgICAgXCJcIiA6IC8vIGFuIGV4dHJhIG5ld2xpbmUgZm9yIGJldHRlciByZWFkYWJpbGl0eVxuICAgICAgICAgIGNvbmNhdCRoKFtoYXJkbGluZSRkLCBoYXJkbGluZSRkXSkgOiBoYXJkbGluZSRkKShnZXRMYXN0RGVzY2VuZGFudE5vZGUkMihub2RlKSk7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRoKFtdLmNvbmNhdChjaGlsZHJlbiwgc2VwYXJhdG9yLCBlbmRDb21tZW50cykpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJkaXJlY3RpdmVcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRoKFtcIiVcIiwgam9pbiRjKFwiIFwiLCBbbm9kZS5uYW1lXS5jb25jYXQobm9kZS5wYXJhbWV0ZXJzKSldKTtcblxuICAgICAgY2FzZSBcImNvbW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRoKFtcIiNcIiwgbm9kZS52YWx1ZV0pO1xuXG4gICAgICBjYXNlIFwiYWxpYXNcIjpcbiAgICAgICAgcmV0dXJuIGNvbmNhdCRoKFtcIipcIiwgbm9kZS52YWx1ZV0pO1xuXG4gICAgICBjYXNlIFwidGFnXCI6XG4gICAgICAgIHJldHVybiBvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShub2RlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCwgbm9kZS5wb3NpdGlvbi5lbmQub2Zmc2V0KTtcblxuICAgICAgY2FzZSBcImFuY2hvclwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGgoW1wiJlwiLCBub2RlLnZhbHVlXSk7XG5cbiAgICAgIGNhc2UgXCJwbGFpblwiOlxuICAgICAgICByZXR1cm4gcHJpbnRGbG93U2NhbGFyQ29udGVudChub2RlLnR5cGUsIG9wdGlvbnMub3JpZ2luYWxUZXh0LnNsaWNlKG5vZGUucG9zaXRpb24uc3RhcnQub2Zmc2V0LCBub2RlLnBvc2l0aW9uLmVuZC5vZmZzZXQpLCBvcHRpb25zKTtcblxuICAgICAgY2FzZSBcInF1b3RlRG91YmxlXCI6XG4gICAgICBjYXNlIFwicXVvdGVTaW5nbGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHNpbmdsZVF1b3RlID0gXCInXCI7XG4gICAgICAgICAgY29uc3QgZG91YmxlUXVvdGUgPSAnXCInO1xuICAgICAgICAgIGNvbnN0IHJhdyA9IG9wdGlvbnMub3JpZ2luYWxUZXh0LnNsaWNlKG5vZGUucG9zaXRpb24uc3RhcnQub2Zmc2V0ICsgMSwgbm9kZS5wb3NpdGlvbi5lbmQub2Zmc2V0IC0gMSk7XG5cbiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSBcInF1b3RlU2luZ2xlXCIgJiYgcmF3LmluY2x1ZGVzKFwiXFxcXFwiKSB8fCBub2RlLnR5cGUgPT09IFwicXVvdGVEb3VibGVcIiAmJiAvXFxcXFteXCJdLy50ZXN0KHJhdykpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgcXVvdGVEb3VibGUgY2FuIHVzZSBlc2NhcGUgY2hhcnNcbiAgICAgICAgICAgIC8vIGFuZCBxdW90ZVNpbmdsZSBkbyBub3QgbmVlZCB0byBlc2NhcGUgYmFja3NsYXNoZXNcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUXVvdGUgPSBub2RlLnR5cGUgPT09IFwicXVvdGVEb3VibGVcIiA/IGRvdWJsZVF1b3RlIDogc2luZ2xlUXVvdGU7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGgoW29yaWdpbmFsUXVvdGUsIHByaW50Rmxvd1NjYWxhckNvbnRlbnQobm9kZS50eXBlLCByYXcsIG9wdGlvbnMpLCBvcmlnaW5hbFF1b3RlXSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyYXcuaW5jbHVkZXMoZG91YmxlUXVvdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGgoW3NpbmdsZVF1b3RlLCBwcmludEZsb3dTY2FsYXJDb250ZW50KG5vZGUudHlwZSwgbm9kZS50eXBlID09PSBcInF1b3RlRG91YmxlXCIgPyByYXcgLy8gZG91YmxlIHF1b3RlIG5lZWRzIHRvIGJlIGVzY2FwZWQgYnkgYmFja3NsYXNoIGluIHF1b3RlRG91YmxlXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csIGRvdWJsZVF1b3RlKS5yZXBsYWNlKC8nL2csIHNpbmdsZVF1b3RlLnJlcGVhdCgyKSkgOiByYXcsIG9wdGlvbnMpLCBzaW5nbGVRdW90ZV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyYXcuaW5jbHVkZXMoc2luZ2xlUXVvdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGgoW2RvdWJsZVF1b3RlLCBwcmludEZsb3dTY2FsYXJDb250ZW50KG5vZGUudHlwZSwgbm9kZS50eXBlID09PSBcInF1b3RlU2luZ2xlXCIgPyAvLyBzaW5nbGUgcXVvdGUgbmVlZHMgdG8gYmUgZXNjYXBlZCBieSAyIHNpbmdsZSBxdW90ZXMgaW4gcXVvdGVTaW5nbGVcbiAgICAgICAgICAgIHJhdy5yZXBsYWNlKC8nJy9nLCBzaW5nbGVRdW90ZSkgOiByYXcsIG9wdGlvbnMpLCBkb3VibGVRdW90ZV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHF1b3RlID0gb3B0aW9ucy5zaW5nbGVRdW90ZSA/IHNpbmdsZVF1b3RlIDogZG91YmxlUXVvdGU7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRoKFtxdW90ZSwgcHJpbnRGbG93U2NhbGFyQ29udGVudChub2RlLnR5cGUsIHJhdywgb3B0aW9ucyksIHF1b3RlXSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcImJsb2NrRm9sZGVkXCI6XG4gICAgICBjYXNlIFwiYmxvY2tMaXRlcmFsXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRJbmRlbnQgPSBnZXRBbmNlc3RvckNvdW50JDEocGF0aCwgYW5jZXN0b3JOb2RlID0+IGlzTm9kZSQxKGFuY2VzdG9yTm9kZSwgW1wic2VxdWVuY2VcIiwgXCJtYXBwaW5nXCJdKSk7XG4gICAgICAgICAgY29uc3QgaXNMYXN0RGVzY2VuZGFudCA9IGlzTGFzdERlc2NlbmRhbnROb2RlJDEocGF0aCk7XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRoKFtub2RlLnR5cGUgPT09IFwiYmxvY2tGb2xkZWRcIiA/IFwiPlwiIDogXCJ8XCIsIG5vZGUuaW5kZW50ID09PSBudWxsID8gXCJcIiA6IG5vZGUuaW5kZW50LnRvU3RyaW5nKCksIG5vZGUuY2hvbXBpbmcgPT09IFwiY2xpcFwiID8gXCJcIiA6IG5vZGUuY2hvbXBpbmcgPT09IFwia2VlcFwiID8gXCIrXCIgOiBcIi1cIiwgaGFzSW5kaWNhdG9yQ29tbWVudCQxKG5vZGUpID8gY29uY2F0JGgoW1wiIFwiLCBwYXRoLmNhbGwocHJpbnQsIFwiaW5kaWNhdG9yQ29tbWVudFwiKV0pIDogXCJcIiwgKG5vZGUuaW5kZW50ID09PSBudWxsID8gZGVkZW50JDMgOiBkZWRlbnRUb1Jvb3QkMykoYWxpZ24kMyhub2RlLmluZGVudCA9PT0gbnVsbCA/IG9wdGlvbnMudGFiV2lkdGggOiBub2RlLmluZGVudCAtIDEgKyBwYXJlbnRJbmRlbnQsIGNvbmNhdCRoKGdldEJsb2NrVmFsdWVMaW5lQ29udGVudHMkMShub2RlLCB7XG4gICAgICAgICAgICBwYXJlbnRJbmRlbnQsXG4gICAgICAgICAgICBpc0xhc3REZXNjZW5kYW50LFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgIH0pLnJlZHVjZSgocmVkdWNlZCwgbGluZVdvcmRzLCBpbmRleCwgbGluZUNvbnRlbnRzKSA9PiByZWR1Y2VkLmNvbmNhdChpbmRleCA9PT0gMCA/IGhhcmRsaW5lJGQgOiBcIlwiLCBmaWxsJDYoam9pbiRjKGxpbmUkYiwgbGluZVdvcmRzKS5wYXJ0cyksIGluZGV4ICE9PSBsaW5lQ29udGVudHMubGVuZ3RoIC0gMSA/IGxpbmVXb3Jkcy5sZW5ndGggPT09IDAgPyBoYXJkbGluZSRkIDogbWFya0FzUm9vdCQ1KGxpdGVyYWxsaW5lJDcpIDogbm9kZS5jaG9tcGluZyA9PT0gXCJrZWVwXCIgJiYgaXNMYXN0RGVzY2VuZGFudCA/IGxpbmVXb3Jkcy5sZW5ndGggPT09IDAgPyBkZWRlbnRUb1Jvb3QkMyhoYXJkbGluZSRkKSA6IGRlZGVudFRvUm9vdCQzKGxpdGVyYWxsaW5lJDcpIDogXCJcIiksIFtdKSkpKV0pO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJzZXF1ZW5jZVwiOlxuICAgICAgICByZXR1cm4gam9pbiRjKGhhcmRsaW5lJGQsIHBhdGgubWFwKHByaW50LCBcImNoaWxkcmVuXCIpKTtcblxuICAgICAgY2FzZSBcInNlcXVlbmNlSXRlbVwiOlxuICAgICAgICByZXR1cm4gY29uY2F0JGgoW1wiLSBcIiwgYWxpZ24kMygyLCAhbm9kZS5jb250ZW50ID8gXCJcIiA6IHBhdGguY2FsbChwcmludCwgXCJjb250ZW50XCIpKV0pO1xuXG4gICAgICBjYXNlIFwibWFwcGluZ0tleVwiOlxuICAgICAgICByZXR1cm4gIW5vZGUuY29udGVudCA/IFwiXCIgOiBwYXRoLmNhbGwocHJpbnQsIFwiY29udGVudFwiKTtcblxuICAgICAgY2FzZSBcIm1hcHBpbmdWYWx1ZVwiOlxuICAgICAgICByZXR1cm4gIW5vZGUuY29udGVudCA/IFwiXCIgOiBwYXRoLmNhbGwocHJpbnQsIFwiY29udGVudFwiKTtcblxuICAgICAgY2FzZSBcIm1hcHBpbmdcIjpcbiAgICAgICAgcmV0dXJuIGpvaW4kYyhoYXJkbGluZSRkLCBwYXRoLm1hcChwcmludCwgXCJjaGlsZHJlblwiKSk7XG5cbiAgICAgIGNhc2UgXCJtYXBwaW5nSXRlbVwiOlxuICAgICAgY2FzZSBcImZsb3dNYXBwaW5nSXRlbVwiOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgaXNFbXB0eU1hcHBpbmdLZXkgPSBpc0VtcHR5Tm9kZSQxKG5vZGUua2V5KTtcbiAgICAgICAgICBjb25zdCBpc0VtcHR5TWFwcGluZ1ZhbHVlID0gaXNFbXB0eU5vZGUkMShub2RlLnZhbHVlKTtcblxuICAgICAgICAgIGlmIChpc0VtcHR5TWFwcGluZ0tleSAmJiBpc0VtcHR5TWFwcGluZ1ZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2F0JGgoW1wiOiBcIl0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGtleSA9IHBhdGguY2FsbChwcmludCwgXCJrZXlcIik7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXRoLmNhbGwocHJpbnQsIFwidmFsdWVcIik7XG5cbiAgICAgICAgICBpZiAoaXNFbXB0eU1hcHBpbmdWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJmbG93TWFwcGluZ0l0ZW1cIiAmJiBwYXJlbnROb2RlLnR5cGUgPT09IFwiZmxvd01hcHBpbmdcIiA/IGtleSA6IG5vZGUudHlwZSA9PT0gXCJtYXBwaW5nSXRlbVwiICYmIGlzQWJzb2x1dGVseVByaW50ZWRBc1NpbmdsZUxpbmVOb2RlKG5vZGUua2V5LmNvbnRlbnQsIG9wdGlvbnMpICYmICFoYXNUcmFpbGluZ0NvbW1lbnQkMyhub2RlLmtleS5jb250ZW50KSAmJiAoIXBhcmVudE5vZGUudGFnIHx8IHBhcmVudE5vZGUudGFnLnZhbHVlICE9PSBcInRhZzp5YW1sLm9yZywyMDAyOnNldFwiKSA/IGNvbmNhdCRoKFtrZXksIG5lZWRzU3BhY2VJbkZyb250T2ZNYXBwaW5nVmFsdWUobm9kZSkgPyBcIiBcIiA6IFwiXCIsIFwiOlwiXSkgOiBjb25jYXQkaChbXCI/IFwiLCBhbGlnbiQzKDIsIGtleSldKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNFbXB0eU1hcHBpbmdLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jYXQkaChbXCI6IFwiLCBhbGlnbiQzKDIsIHZhbHVlKV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGdyb3VwSWQgPSBTeW1ib2woXCJtYXBwaW5nS2V5XCIpO1xuICAgICAgICAgIGNvbnN0IGZvcmNlRXhwbGljaXRLZXkgPSBoYXNMZWFkaW5nQ29tbWVudHMkMShub2RlLnZhbHVlKSB8fCAhaXNJbmxpbmVOb2RlKG5vZGUua2V5LmNvbnRlbnQpO1xuICAgICAgICAgIHJldHVybiBmb3JjZUV4cGxpY2l0S2V5ID8gY29uY2F0JGgoW1wiPyBcIiwgYWxpZ24kMygyLCBrZXkpLCBoYXJkbGluZSRkLCBqb2luJGMoXCJcIiwgcGF0aC5tYXAocHJpbnQsIFwidmFsdWVcIiwgXCJsZWFkaW5nQ29tbWVudHNcIikubWFwKGNvbW1lbnQgPT4gY29uY2F0JGgoW2NvbW1lbnQsIGhhcmRsaW5lJGRdKSkpLCBcIjogXCIsIGFsaWduJDMoMiwgdmFsdWUpXSkgOiAvLyBmb3JjZSBzaW5nbGVsaW5lXG4gICAgICAgICAgaXNTaW5nbGVMaW5lTm9kZShub2RlLmtleS5jb250ZW50KSAmJiAhaGFzTGVhZGluZ0NvbW1lbnRzJDEobm9kZS5rZXkuY29udGVudCkgJiYgIWhhc01pZGRsZUNvbW1lbnRzJDEobm9kZS5rZXkuY29udGVudCkgJiYgIWhhc1RyYWlsaW5nQ29tbWVudCQzKG5vZGUua2V5LmNvbnRlbnQpICYmICFoYXNFbmRDb21tZW50cyQxKG5vZGUua2V5KSAmJiAhaGFzTGVhZGluZ0NvbW1lbnRzJDEobm9kZS52YWx1ZS5jb250ZW50KSAmJiAhaGFzTWlkZGxlQ29tbWVudHMkMShub2RlLnZhbHVlLmNvbnRlbnQpICYmICFoYXNFbmRDb21tZW50cyQxKG5vZGUudmFsdWUpICYmIGlzQWJzb2x1dGVseVByaW50ZWRBc1NpbmdsZUxpbmVOb2RlKG5vZGUudmFsdWUuY29udGVudCwgb3B0aW9ucykgPyBjb25jYXQkaChba2V5LCBuZWVkc1NwYWNlSW5Gcm9udE9mTWFwcGluZ1ZhbHVlKG5vZGUpID8gXCIgXCIgOiBcIlwiLCBcIjogXCIsIHZhbHVlXSkgOiBjb25kaXRpb25hbEdyb3VwJDIoW2NvbmNhdCRoKFtncm91cCRnKGNvbmNhdCRoKFtpZkJyZWFrJDgoXCI/IFwiKSwgZ3JvdXAkZyhhbGlnbiQzKDIsIGtleSksIHtcbiAgICAgICAgICAgIGlkOiBncm91cElkXG4gICAgICAgICAgfSldKSksIGlmQnJlYWskOChjb25jYXQkaChbaGFyZGxpbmUkZCwgXCI6IFwiLCBhbGlnbiQzKDIsIHZhbHVlKV0pLCBpbmRlbnQoY29uY2F0JGgoW25lZWRzU3BhY2VJbkZyb250T2ZNYXBwaW5nVmFsdWUobm9kZSkgPyBcIiBcIiA6IFwiXCIsIFwiOlwiLCBoYXNMZWFkaW5nQ29tbWVudHMkMShub2RlLnZhbHVlLmNvbnRlbnQpIHx8IGhhc0VuZENvbW1lbnRzJDEobm9kZS52YWx1ZSkgJiYgbm9kZS52YWx1ZS5jb250ZW50ICYmICFpc05vZGUkMShub2RlLnZhbHVlLmNvbnRlbnQsIFtcIm1hcHBpbmdcIiwgXCJzZXF1ZW5jZVwiXSkgfHwgcGFyZW50Tm9kZS50eXBlID09PSBcIm1hcHBpbmdcIiAmJiBoYXNUcmFpbGluZ0NvbW1lbnQkMyhub2RlLmtleS5jb250ZW50KSAmJiBpc0lubGluZU5vZGUobm9kZS52YWx1ZS5jb250ZW50KSB8fCBpc05vZGUkMShub2RlLnZhbHVlLmNvbnRlbnQsIFtcIm1hcHBpbmdcIiwgXCJzZXF1ZW5jZVwiXSkgJiYgbm9kZS52YWx1ZS5jb250ZW50LnRhZyA9PT0gbnVsbCAmJiBub2RlLnZhbHVlLmNvbnRlbnQuYW5jaG9yID09PSBudWxsID8gaGFyZGxpbmUkZCA6ICFub2RlLnZhbHVlLmNvbnRlbnQgPyBcIlwiIDogbGluZSRiLCB2YWx1ZV0pKSwge1xuICAgICAgICAgICAgZ3JvdXBJZFxuICAgICAgICAgIH0pXSldKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiZmxvd01hcHBpbmdcIjpcbiAgICAgIGNhc2UgXCJmbG93U2VxdWVuY2VcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IG9wZW5NYXJrZXIgPSBub2RlLnR5cGUgPT09IFwiZmxvd01hcHBpbmdcIiA/IFwie1wiIDogXCJbXCI7XG4gICAgICAgICAgY29uc3QgY2xvc2VNYXJrZXIgPSBub2RlLnR5cGUgPT09IFwiZmxvd01hcHBpbmdcIiA/IFwifVwiIDogXCJdXCI7XG4gICAgICAgICAgY29uc3QgYnJhY2tldFNwYWNpbmcgPSBub2RlLnR5cGUgPT09IFwiZmxvd01hcHBpbmdcIiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCAhPT0gMCAmJiBvcHRpb25zLmJyYWNrZXRTcGFjaW5nID8gbGluZSRiIDogc29mdGxpbmUkODtcblxuICAgICAgICAgIGNvbnN0IGlzTGFzdEl0ZW1FbXB0eU1hcHBpbmdJdGVtID0gbm9kZS5jaGlsZHJlbi5sZW5ndGggIT09IDAgJiYgKGxhc3RJdGVtID0+IGxhc3RJdGVtLnR5cGUgPT09IFwiZmxvd01hcHBpbmdJdGVtXCIgJiYgaXNFbXB0eU5vZGUkMShsYXN0SXRlbS5rZXkpICYmIGlzRW1wdHlOb2RlJDEobGFzdEl0ZW0udmFsdWUpKShnZXRMYXN0JDYobm9kZS5jaGlsZHJlbikpO1xuXG4gICAgICAgICAgcmV0dXJuIGNvbmNhdCRoKFtvcGVuTWFya2VyLCBpbmRlbnQoY29uY2F0JGgoW2JyYWNrZXRTcGFjaW5nLCBjb25jYXQkaChwYXRoLm1hcCgoY2hpbGRQYXRoLCBpbmRleCkgPT4gY29uY2F0JGgoW3ByaW50KGNoaWxkUGF0aCksIGluZGV4ID09PSBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDEgPyBcIlwiIDogY29uY2F0JGgoW1wiLFwiLCBsaW5lJGIsIG5vZGUuY2hpbGRyZW5baW5kZXhdLnBvc2l0aW9uLnN0YXJ0LmxpbmUgIT09IG5vZGUuY2hpbGRyZW5baW5kZXggKyAxXS5wb3NpdGlvbi5zdGFydC5saW5lID8gcHJpbnROZXh0RW1wdHlMaW5lKGNoaWxkUGF0aCwgb3B0aW9ucy5vcmlnaW5hbFRleHQpIDogXCJcIl0pXSksIFwiY2hpbGRyZW5cIikpLCBpZkJyZWFrJDgoXCIsXCIsIFwiXCIpXSkpLCBpc0xhc3RJdGVtRW1wdHlNYXBwaW5nSXRlbSA/IFwiXCIgOiBicmFja2V0U3BhY2luZywgY2xvc2VNYXJrZXJdKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFwiZmxvd1NlcXVlbmNlSXRlbVwiOlxuICAgICAgICByZXR1cm4gcGF0aC5jYWxsKHByaW50LCBcImNvbnRlbnRcIik7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIG5vZGUgdHlwZSBcIi5jb25jYXQobm9kZS50eXBlKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5kZW50KGRvYykge1xuICAgICAgcmV0dXJuIGRvY0J1aWxkZXJzJDIuYWxpZ24oXCIgXCIucmVwZWF0KG9wdGlvbnMudGFiV2lkdGgpLCBkb2MpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFsaWduJDMobiwgZG9jKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuID09PSBcIm51bWJlclwiICYmIG4gPiAwID8gZG9jQnVpbGRlcnMkMi5hbGlnbihcIiBcIi5yZXBlYXQobiksIGRvYykgOiBkb2NCdWlsZGVycyQyLmFsaWduKG4sIGRvYyk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0lubGluZU5vZGUobm9kZSkge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJwbGFpblwiOlxuICAgICAgY2FzZSBcInF1b3RlRG91YmxlXCI6XG4gICAgICBjYXNlIFwicXVvdGVTaW5nbGVcIjpcbiAgICAgIGNhc2UgXCJhbGlhc1wiOlxuICAgICAgY2FzZSBcImZsb3dNYXBwaW5nXCI6XG4gICAgICBjYXNlIFwiZmxvd1NlcXVlbmNlXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTaW5nbGVMaW5lTm9kZShub2RlKSB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcInBsYWluXCI6XG4gICAgICBjYXNlIFwicXVvdGVEb3VibGVcIjpcbiAgICAgIGNhc2UgXCJxdW90ZVNpbmdsZVwiOlxuICAgICAgICByZXR1cm4gbm9kZS5wb3NpdGlvbi5zdGFydC5saW5lID09PSBub2RlLnBvc2l0aW9uLmVuZC5saW5lO1xuXG4gICAgICBjYXNlIFwiYWxpYXNcIjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRQcmludERvY3VtZW50Qm9keShkb2N1bWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmNoaWxkcmVuLmxlbmd0aCAhPT0gMCB8fCBoYXNFbmRDb21tZW50cyQxKGRvY3VtZW50LmJvZHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkUHJpbnREb2N1bWVudEVuZE1hcmtlcihkb2N1bWVudCwgbmV4dERvY3VtZW50KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIC8qKlxuICAgICAgICouLi4gIyB0cmFpbGluZ0NvbW1lbnRcbiAgICAgICAqL1xuICAgICAgaGFzVHJhaWxpbmdDb21tZW50JDMoZG9jdW1lbnQpIHx8IG5leHREb2N1bWVudCAmJiAoXG4gICAgICAvKipcbiAgICAgICAqIC4uLlxuICAgICAgICogJURJUkVDVElWRVxuICAgICAgICogLS0tXG4gICAgICAgKi9cbiAgICAgIG5leHREb2N1bWVudC5oZWFkLmNoaWxkcmVuLmxlbmd0aCAhPT0gMCB8fFxuICAgICAgLyoqXG4gICAgICAgKiAuLi5cbiAgICAgICAqICMgZW5kQ29tbWVudFxuICAgICAgICogLS0tXG4gICAgICAgKi9cbiAgICAgIGhhc0VuZENvbW1lbnRzJDEobmV4dERvY3VtZW50LmhlYWQpKVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRQcmludERvY3VtZW50SGVhZEVuZE1hcmtlcihkb2N1bWVudCwgbmV4dERvY3VtZW50LCByb290LCBvcHRpb25zKSB7XG4gICAgaWYgKFxuICAgIC8qKlxuICAgICAqIC0tLVxuICAgICAqIHByZXNlcnZlIHRoZSBmaXJzdCBkb2N1bWVudCBoZWFkIGVuZCBtYXJrZXJcbiAgICAgKi9cbiAgICByb290LmNoaWxkcmVuWzBdID09PSBkb2N1bWVudCAmJiAvLS0tKFxcc3wkKS8udGVzdChvcHRpb25zLm9yaWdpbmFsVGV4dC5zbGljZShvcHRpb25zLmxvY1N0YXJ0KGRvY3VtZW50KSwgb3B0aW9ucy5sb2NTdGFydChkb2N1bWVudCkgKyA0KSkgfHxcbiAgICAvKipcbiAgICAgKiAlRElSRUNUSVZFXG4gICAgICogLS0tXG4gICAgICovXG4gICAgZG9jdW1lbnQuaGVhZC5jaGlsZHJlbi5sZW5ndGggIT09IDAgfHxcbiAgICAvKipcbiAgICAgKiAjIGVuZCBjb21tZW50XG4gICAgICogLS0tXG4gICAgICovXG4gICAgaGFzRW5kQ29tbWVudHMkMShkb2N1bWVudC5oZWFkKSB8fFxuICAgIC8qKlxuICAgICAqIC0tLSAjIHRyYWlsaW5nIGNvbW1lbnRcbiAgICAgKi9cbiAgICBoYXNUcmFpbGluZ0NvbW1lbnQkMyhkb2N1bWVudC5oZWFkKSkge1xuICAgICAgcmV0dXJuIFwiaGVhZFwiO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRQcmludERvY3VtZW50RW5kTWFya2VyKGRvY3VtZW50LCBuZXh0RG9jdW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHREb2N1bWVudCA/IFwicm9vdFwiIDogZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBpc0Fic29sdXRlbHlQcmludGVkQXNTaW5nbGVMaW5lTm9kZShub2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcInBsYWluXCI6XG4gICAgICBjYXNlIFwicXVvdGVTaW5nbGVcIjpcbiAgICAgIGNhc2UgXCJxdW90ZURvdWJsZVwiOlxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImFsaWFzXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucHJvc2VXcmFwID09PSBcInByZXNlcnZlXCIpIHtcbiAgICAgIHJldHVybiBub2RlLnBvc2l0aW9uLnN0YXJ0LmxpbmUgPT09IG5vZGUucG9zaXRpb24uZW5kLmxpbmU7XG4gICAgfVxuXG4gICAgaWYgKCAvLyBiYWNrc2xhc2gtbmV3bGluZVxuICAgIC9cXFxcJC9tLnRlc3Qob3B0aW9ucy5vcmlnaW5hbFRleHQuc2xpY2Uobm9kZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQsIG5vZGUucG9zaXRpb24uZW5kLm9mZnNldCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3dpdGNoIChvcHRpb25zLnByb3NlV3JhcCkge1xuICAgICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICAgIHJldHVybiAhbm9kZS52YWx1ZS5pbmNsdWRlcyhcIlxcblwiKTtcblxuICAgICAgY2FzZSBcImFsd2F5c1wiOlxuICAgICAgICByZXR1cm4gIS9bXFxuIF0vLnRlc3Qobm9kZS52YWx1ZSk7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbmVlZHNTcGFjZUluRnJvbnRPZk1hcHBpbmdWYWx1ZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUua2V5LmNvbnRlbnQgJiYgbm9kZS5rZXkuY29udGVudC50eXBlID09PSBcImFsaWFzXCI7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludE5leHRFbXB0eUxpbmUocGF0aCwgb3JpZ2luYWxUZXh0KSB7XG4gICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0VmFsdWUoKTtcbiAgICBjb25zdCByb290ID0gcGF0aC5zdGFja1swXTtcbiAgICByb290LmlzTmV4dEVtcHR5TGluZVByaW50ZWRDaGVja2xpc3QgPSByb290LmlzTmV4dEVtcHR5TGluZVByaW50ZWRDaGVja2xpc3QgfHwgW107XG5cbiAgICBpZiAoIXJvb3QuaXNOZXh0RW1wdHlMaW5lUHJpbnRlZENoZWNrbGlzdFtub2RlLnBvc2l0aW9uLmVuZC5saW5lXSkge1xuICAgICAgaWYgKGlzTmV4dExpbmVFbXB0eSQ2KG5vZGUsIG9yaWdpbmFsVGV4dCkpIHtcbiAgICAgICAgcm9vdC5pc05leHRFbXB0eUxpbmVQcmludGVkQ2hlY2tsaXN0W25vZGUucG9zaXRpb24uZW5kLmxpbmVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHNvZnRsaW5lJDg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiBwcmludEZsb3dTY2FsYXJDb250ZW50KG5vZGVUeXBlLCBjb250ZW50LCBvcHRpb25zKSB7XG4gICAgY29uc3QgbGluZUNvbnRlbnRzID0gZ2V0Rmxvd1NjYWxhckxpbmVDb250ZW50cyQxKG5vZGVUeXBlLCBjb250ZW50LCBvcHRpb25zKTtcbiAgICByZXR1cm4gam9pbiRjKGhhcmRsaW5lJGQsIGxpbmVDb250ZW50cy5tYXAobGluZUNvbnRlbnRXb3JkcyA9PiBmaWxsJDYoam9pbiRjKGxpbmUkYiwgbGluZUNvbnRlbnRXb3JkcykucGFydHMpKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbiQ3KG5vZGUsIG5ld05vZGVcbiAgLyosIHBhcmVudCAqL1xuICApIHtcbiAgICBpZiAoaXNOb2RlJDEobmV3Tm9kZSkpIHtcbiAgICAgIGRlbGV0ZSBuZXdOb2RlLnBvc2l0aW9uO1xuXG4gICAgICBzd2l0Y2ggKG5ld05vZGUudHlwZSkge1xuICAgICAgICBjYXNlIFwiY29tbWVudFwiOlxuICAgICAgICAgIC8vIGluc2VydCBwcmFnbWFcbiAgICAgICAgICBpZiAoaXNQcmFnbWEkMShuZXdOb2RlLnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcInF1b3RlRG91YmxlXCI6XG4gICAgICAgIGNhc2UgXCJxdW90ZVNpbmdsZVwiOlxuICAgICAgICAgIG5ld05vZGUudHlwZSA9IFwicXVvdGVcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJpbnRlcllhbWwgPSB7XG4gICAgcHJlcHJvY2VzczogcHJlcHJvY2VzcyQzLFxuICAgIHByaW50OiBnZW5lcmljUHJpbnQkNixcbiAgICBtYXNzYWdlQXN0Tm9kZTogY2xlYW4kNyxcbiAgICBpbnNlcnRQcmFnbWE6IGluc2VydFByYWdtYSQ5XG4gIH07XG5cbiAgdmFyIG9wdGlvbnMkNyA9IHtcbiAgICBicmFja2V0U3BhY2luZzogY29tbW9uT3B0aW9ucy5icmFja2V0U3BhY2luZyxcbiAgICBzaW5nbGVRdW90ZTogY29tbW9uT3B0aW9ucy5zaW5nbGVRdW90ZSxcbiAgICBwcm9zZVdyYXA6IGNvbW1vbk9wdGlvbnMucHJvc2VXcmFwXG4gIH07XG5cbiAgdmFyIG5hbWUkaCA9IFwiWUFNTFwiO1xuICB2YXIgdHlwZSRnID0gXCJkYXRhXCI7XG4gIHZhciB0bVNjb3BlJGcgPSBcInNvdXJjZS55YW1sXCI7XG4gIHZhciBhbGlhc2VzJDYgPSBbXG4gIFx0XCJ5bWxcIlxuICBdO1xuICB2YXIgZXh0ZW5zaW9ucyRnID0gW1xuICBcdFwiLnltbFwiLFxuICBcdFwiLm1pclwiLFxuICBcdFwiLnJlZWtcIixcbiAgXHRcIi5ydml6XCIsXG4gIFx0XCIuc3VibGltZS1zeW50YXhcIixcbiAgXHRcIi5zeW50YXhcIixcbiAgXHRcIi55YW1sXCIsXG4gIFx0XCIueWFtbC10bWxhbmd1YWdlXCIsXG4gIFx0XCIueWFtbC5zZWRcIixcbiAgXHRcIi55bWwubXlzcWxcIlxuICBdO1xuICB2YXIgZmlsZW5hbWVzJDQgPSBbXG4gIFx0XCIuY2xhbmctZm9ybWF0XCIsXG4gIFx0XCIuY2xhbmctdGlkeVwiLFxuICBcdFwiLmdlbXJjXCIsXG4gIFx0XCJnbGlkZS5sb2NrXCIsXG4gIFx0XCJ5YXJuLmxvY2tcIlxuICBdO1xuICB2YXIgYWNlTW9kZSRnID0gXCJ5YW1sXCI7XG4gIHZhciBjb2RlbWlycm9yTW9kZSRjID0gXCJ5YW1sXCI7XG4gIHZhciBjb2RlbWlycm9yTWltZVR5cGUkYyA9IFwidGV4dC94LXlhbWxcIjtcbiAgdmFyIGxhbmd1YWdlSWQkZyA9IDQwNztcbiAgdmFyIFlBTUwgPSB7XG4gIFx0bmFtZTogbmFtZSRoLFxuICBcdHR5cGU6IHR5cGUkZyxcbiAgXHR0bVNjb3BlOiB0bVNjb3BlJGcsXG4gIFx0YWxpYXNlczogYWxpYXNlcyQ2LFxuICBcdGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMkZyxcbiAgXHRmaWxlbmFtZXM6IGZpbGVuYW1lcyQ0LFxuICBcdGFjZU1vZGU6IGFjZU1vZGUkZyxcbiAgXHRjb2RlbWlycm9yTW9kZTogY29kZW1pcnJvck1vZGUkYyxcbiAgXHRjb2RlbWlycm9yTWltZVR5cGU6IGNvZGVtaXJyb3JNaW1lVHlwZSRjLFxuICBcdGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWQkZ1xuICB9O1xuXG4gIHZhciBZQU1MJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIG5hbWU6IG5hbWUkaCxcbiAgICB0eXBlOiB0eXBlJGcsXG4gICAgdG1TY29wZTogdG1TY29wZSRnLFxuICAgIGFsaWFzZXM6IGFsaWFzZXMkNixcbiAgICBleHRlbnNpb25zOiBleHRlbnNpb25zJGcsXG4gICAgZmlsZW5hbWVzOiBmaWxlbmFtZXMkNCxcbiAgICBhY2VNb2RlOiBhY2VNb2RlJGcsXG4gICAgY29kZW1pcnJvck1vZGU6IGNvZGVtaXJyb3JNb2RlJGMsXG4gICAgY29kZW1pcnJvck1pbWVUeXBlOiBjb2RlbWlycm9yTWltZVR5cGUkYyxcbiAgICBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkJGcsXG4gICAgJ2RlZmF1bHQnOiBZQU1MXG4gIH0pO1xuXG4gIHZhciByZXF1aXJlJCQwJDggPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKFlBTUwkMSk7XG5cbiAgY29uc3QgbGFuZ3VhZ2VzJDYgPSBbY3JlYXRlTGFuZ3VhZ2UocmVxdWlyZSQkMCQ4LCBkYXRhID0+ICh7XG4gICAgc2luY2U6IFwiMS4xNC4wXCIsXG4gICAgcGFyc2VyczogW1wieWFtbFwiXSxcbiAgICB2c2NvZGVMYW5ndWFnZUlkczogW1wieWFtbFwiXSxcbiAgICAvLyB5YXJuLmxvY2sgaXMgbm90IFlBTUw6IGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL3lhcm4vaXNzdWVzLzU2MjlcbiAgICBmaWxlbmFtZXM6IGRhdGEuZmlsZW5hbWVzLmZpbHRlcihmaWxlbmFtZSA9PiBmaWxlbmFtZSAhPT0gXCJ5YXJuLmxvY2tcIilcbiAgfSkpXTtcbiAgdmFyIGxhbmd1YWdlWWFtbCA9IHtcbiAgICBsYW5ndWFnZXM6IGxhbmd1YWdlcyQ2LFxuICAgIHByaW50ZXJzOiB7XG4gICAgICB5YW1sOiBwcmludGVyWWFtbFxuICAgIH0sXG4gICAgb3B0aW9uczogb3B0aW9ucyQ3XG4gIH07XG5cbiAgY29uc3Qge1xuICAgIHZlcnNpb246IHZlcnNpb24kMlxuICB9ID0gcmVxdWlyZSQkMDtcbiAgY29uc3Qge1xuICAgIGdldFN1cHBvcnRJbmZvOiBnZXRTdXBwb3J0SW5mbyQyXG4gIH0gPSBzdXBwb3J0O1xuICBjb25zdCBpbnRlcm5hbFBsdWdpbnMgPSBbbGFuZ3VhZ2VDc3MsIGxhbmd1YWdlR3JhcGhxbCwgbGFuZ3VhZ2VIYW5kbGViYXJzLCBsYW5ndWFnZUh0bWwsIGxhbmd1YWdlSnMsIGxhbmd1YWdlTWFya2Rvd24sIGxhbmd1YWdlWWFtbF07XG5cbiAgZnVuY3Rpb24gd2l0aFBsdWdpbnMoZm4sIG9wdHNBcmdJZHggPSAxIC8vIFVzdWFsbHkgYG9wdHNgIGlzIHRoZSAybmQgYXJndW1lbnRcbiAgKSB7XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gYXJnc1tvcHRzQXJnSWR4XSB8fCB7fTtcbiAgICAgIGNvbnN0IHBsdWdpbnMgPSBvcHRzLnBsdWdpbnMgfHwgW107XG4gICAgICBhcmdzW29wdHNBcmdJZHhdID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0cywge1xuICAgICAgICBwbHVnaW5zOiBbLi4uaW50ZXJuYWxQbHVnaW5zLCAuLi4oQXJyYXkuaXNBcnJheShwbHVnaW5zKSA/IHBsdWdpbnMgOiBPYmplY3QudmFsdWVzKHBsdWdpbnMpKV1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBmb3JtYXRXaXRoQ3Vyc29yID0gd2l0aFBsdWdpbnMoY29yZS5mb3JtYXRXaXRoQ3Vyc29yKTtcbiAgdmFyIHN0YW5kYWxvbmUgPSB7XG4gICAgZm9ybWF0V2l0aEN1cnNvcixcblxuICAgIGZvcm1hdCh0ZXh0LCBvcHRzKSB7XG4gICAgICByZXR1cm4gZm9ybWF0V2l0aEN1cnNvcih0ZXh0LCBvcHRzKS5mb3JtYXR0ZWQ7XG4gICAgfSxcblxuICAgIGNoZWNrKHRleHQsIG9wdHMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZm9ybWF0dGVkXG4gICAgICB9ID0gZm9ybWF0V2l0aEN1cnNvcih0ZXh0LCBvcHRzKTtcbiAgICAgIHJldHVybiBmb3JtYXR0ZWQgPT09IHRleHQ7XG4gICAgfSxcblxuICAgIGRvYzogZG9jdW1lbnQsXG4gICAgZ2V0U3VwcG9ydEluZm86IHdpdGhQbHVnaW5zKGdldFN1cHBvcnRJbmZvJDIsIDApLFxuICAgIHZlcnNpb246IHZlcnNpb24kMixcbiAgICB1dGlsOiB1dGlsU2hhcmVkLFxuICAgIF9fZGVidWc6IHtcbiAgICAgIHBhcnNlOiB3aXRoUGx1Z2lucyhjb3JlLnBhcnNlKSxcbiAgICAgIGZvcm1hdEFTVDogd2l0aFBsdWdpbnMoY29yZS5mb3JtYXRBU1QpLFxuICAgICAgZm9ybWF0RG9jOiB3aXRoUGx1Z2lucyhjb3JlLmZvcm1hdERvYyksXG4gICAgICBwcmludFRvRG9jOiB3aXRoUGx1Z2lucyhjb3JlLnByaW50VG9Eb2MpLFxuICAgICAgcHJpbnREb2NUb1N0cmluZzogd2l0aFBsdWdpbnMoY29yZS5wcmludERvY1RvU3RyaW5nKVxuICAgIH1cbiAgfTtcblxuICB2YXIgc3RhbmRhbG9uZSQxID0gc3RhbmRhbG9uZTtcblxuICByZXR1cm4gc3RhbmRhbG9uZSQxO1xuXG59KSkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAoIXByb2Nlc3MudmVyc2lvbiB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MC4nKSA9PT0gMCB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS4nKSA9PT0gMCAmJiBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuOC4nKSAhPT0gMCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHsgbmV4dFRpY2s6IG5leHRUaWNrIH07XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByb2Nlc3Ncbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4sIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiY2FsbGJhY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGFyZ3MsIGk7XG4gIHN3aXRjaCAobGVuKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSk7XG4gICAgfSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIpO1xuICAgIH0pO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tpKytdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufVxuXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlclxudmFyIG5vdyA9IHJlcXVpcmUoJ3JpZ2h0LW5vdycpXG52YXIgcmFmID0gcmVxdWlyZSgncmFmJylcblxubW9kdWxlLmV4cG9ydHMgPSBFbmdpbmVcbmZ1bmN0aW9uIEVuZ2luZShmbikge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFbmdpbmUpKSBcbiAgICAgICAgcmV0dXJuIG5ldyBFbmdpbmUoZm4pXG4gICAgdGhpcy5ydW5uaW5nID0gZmFsc2VcbiAgICB0aGlzLmxhc3QgPSBub3coKVxuICAgIHRoaXMuX2ZyYW1lID0gMFxuICAgIHRoaXMuX3RpY2sgPSB0aGlzLnRpY2suYmluZCh0aGlzKVxuXG4gICAgaWYgKGZuKVxuICAgICAgICB0aGlzLm9uKCd0aWNrJywgZm4pXG59XG5cbmluaGVyaXRzKEVuZ2luZSwgRXZlbnRFbWl0dGVyKVxuXG5FbmdpbmUucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMucnVubmluZykgXG4gICAgICAgIHJldHVyblxuICAgIHRoaXMucnVubmluZyA9IHRydWVcbiAgICB0aGlzLmxhc3QgPSBub3coKVxuICAgIHRoaXMuX2ZyYW1lID0gcmFmKHRoaXMuX3RpY2spXG4gICAgcmV0dXJuIHRoaXNcbn1cblxuRW5naW5lLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5ydW5uaW5nID0gZmFsc2VcbiAgICBpZiAodGhpcy5fZnJhbWUgIT09IDApXG4gICAgICAgIHJhZi5jYW5jZWwodGhpcy5fZnJhbWUpXG4gICAgdGhpcy5fZnJhbWUgPSAwXG4gICAgcmV0dXJuIHRoaXNcbn1cblxuRW5naW5lLnByb3RvdHlwZS50aWNrID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fZnJhbWUgPSByYWYodGhpcy5fdGljaylcbiAgICB2YXIgdGltZSA9IG5vdygpXG4gICAgdmFyIGR0ID0gdGltZSAtIHRoaXMubGFzdFxuICAgIHRoaXMuZW1pdCgndGljaycsIGR0KVxuICAgIHRoaXMubGFzdCA9IHRpbWVcbn0iLCJ2YXIgbm93ID0gcmVxdWlyZSgncGVyZm9ybWFuY2Utbm93JylcbiAgLCByb290ID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3dcbiAgLCB2ZW5kb3JzID0gWydtb3onLCAnd2Via2l0J11cbiAgLCBzdWZmaXggPSAnQW5pbWF0aW9uRnJhbWUnXG4gICwgcmFmID0gcm9vdFsncmVxdWVzdCcgKyBzdWZmaXhdXG4gICwgY2FmID0gcm9vdFsnY2FuY2VsJyArIHN1ZmZpeF0gfHwgcm9vdFsnY2FuY2VsUmVxdWVzdCcgKyBzdWZmaXhdXG5cbmZvcih2YXIgaSA9IDA7ICFyYWYgJiYgaSA8IHZlbmRvcnMubGVuZ3RoOyBpKyspIHtcbiAgcmFmID0gcm9vdFt2ZW5kb3JzW2ldICsgJ1JlcXVlc3QnICsgc3VmZml4XVxuICBjYWYgPSByb290W3ZlbmRvcnNbaV0gKyAnQ2FuY2VsJyArIHN1ZmZpeF1cbiAgICAgIHx8IHJvb3RbdmVuZG9yc1tpXSArICdDYW5jZWxSZXF1ZXN0JyArIHN1ZmZpeF1cbn1cblxuLy8gU29tZSB2ZXJzaW9ucyBvZiBGRiBoYXZlIHJBRiBidXQgbm90IGNBRlxuaWYoIXJhZiB8fCAhY2FmKSB7XG4gIHZhciBsYXN0ID0gMFxuICAgICwgaWQgPSAwXG4gICAgLCBxdWV1ZSA9IFtdXG4gICAgLCBmcmFtZUR1cmF0aW9uID0gMTAwMCAvIDYwXG5cbiAgcmFmID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZihxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHZhciBfbm93ID0gbm93KClcbiAgICAgICAgLCBuZXh0ID0gTWF0aC5tYXgoMCwgZnJhbWVEdXJhdGlvbiAtIChfbm93IC0gbGFzdCkpXG4gICAgICBsYXN0ID0gbmV4dCArIF9ub3dcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjcCA9IHF1ZXVlLnNsaWNlKDApXG4gICAgICAgIC8vIENsZWFyIHF1ZXVlIGhlcmUgdG8gcHJldmVudFxuICAgICAgICAvLyBjYWxsYmFja3MgZnJvbSBhcHBlbmRpbmcgbGlzdGVuZXJzXG4gICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGZyYW1lJ3MgcXVldWVcbiAgICAgICAgcXVldWUubGVuZ3RoID0gMFxuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZighY3BbaV0uY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgIGNwW2ldLmNhbGxiYWNrKGxhc3QpXG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgdGhyb3cgZSB9LCAwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgTWF0aC5yb3VuZChuZXh0KSlcbiAgICB9XG4gICAgcXVldWUucHVzaCh7XG4gICAgICBoYW5kbGU6ICsraWQsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICBjYW5jZWxsZWQ6IGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm4gaWRcbiAgfVxuXG4gIGNhZiA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYocXVldWVbaV0uaGFuZGxlID09PSBoYW5kbGUpIHtcbiAgICAgICAgcXVldWVbaV0uY2FuY2VsbGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuKSB7XG4gIC8vIFdyYXAgaW4gYSBuZXcgZnVuY3Rpb24gdG8gcHJldmVudFxuICAvLyBgY2FuY2VsYCBwb3RlbnRpYWxseSBiZWluZyBhc3NpZ25lZFxuICAvLyB0byB0aGUgbmF0aXZlIHJBRiBmdW5jdGlvblxuICByZXR1cm4gcmFmLmNhbGwocm9vdCwgZm4pXG59XG5tb2R1bGUuZXhwb3J0cy5jYW5jZWwgPSBmdW5jdGlvbigpIHtcbiAgY2FmLmFwcGx5KHJvb3QsIGFyZ3VtZW50cylcbn1cbm1vZHVsZS5leHBvcnRzLnBvbHlmaWxsID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gIGlmICghb2JqZWN0KSB7XG4gICAgb2JqZWN0ID0gcm9vdDtcbiAgfVxuICBvYmplY3QucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gcmFmXG4gIG9iamVjdC5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGNhZlxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIG9sZEJyb3dzZXIgKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXFxuVXNlIENocm9tZSwgRmlyZWZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMScpXG59XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxudmFyIGNyeXB0byA9IGdsb2JhbC5jcnlwdG8gfHwgZ2xvYmFsLm1zQ3J5cHRvXG5cbmlmIChjcnlwdG8gJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJhbmRvbUJ5dGVzXG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IG9sZEJyb3dzZXJcbn1cblxuZnVuY3Rpb24gcmFuZG9tQnl0ZXMgKHNpemUsIGNiKSB7XG4gIC8vIHBoYW50b21qcyBuZWVkcyB0byB0aHJvd1xuICBpZiAoc2l6ZSA+IDY1NTM2KSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVlc3RlZCB0b28gbWFueSByYW5kb20gYnl0ZXMnKVxuICAvLyBpbiBjYXNlIGJyb3dzZXJpZnkgIGlzbid0IHVzaW5nIHRoZSBVaW50OEFycmF5IHZlcnNpb25cbiAgdmFyIHJhd0J5dGVzID0gbmV3IGdsb2JhbC5VaW50OEFycmF5KHNpemUpXG5cbiAgLy8gVGhpcyB3aWxsIG5vdCB3b3JrIGluIG9sZGVyIGJyb3dzZXJzLlxuICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzXG4gIGlmIChzaXplID4gMCkgeyAgLy8gZ2V0UmFuZG9tVmFsdWVzIGZhaWxzIG9uIElFIGlmIHNpemUgPT0gMFxuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMocmF3Qnl0ZXMpXG4gIH1cblxuICAvLyBYWFg6IHBoYW50b21qcyBkb2Vzbid0IGxpa2UgYSBidWZmZXIgYmVpbmcgcGFzc2VkIGhlcmVcbiAgdmFyIGJ5dGVzID0gQnVmZmVyLmZyb20ocmF3Qnl0ZXMuYnVmZmVyKVxuXG4gIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBjYihudWxsLCBieXRlcylcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBkdXBsZXggc3RyZWFtIGlzIGp1c3QgYSBzdHJlYW0gdGhhdCBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZS5cbi8vIFNpbmNlIEpTIGRvZXNuJ3QgaGF2ZSBtdWx0aXBsZSBwcm90b3R5cGFsIGluaGVyaXRhbmNlLCB0aGlzIGNsYXNzXG4vLyBwcm90b3R5cGFsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKS5uZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fcmVhZGFibGUnKTtcbnZhciBXcml0YWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV93cml0YWJsZScpO1xuXG51dGlsLmluaGVyaXRzKER1cGxleCwgUmVhZGFibGUpO1xuXG52YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbmZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xufVxuXG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBwcm9jZXNzTmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5EdXBsZXgucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICB0aGlzLmVuZCgpO1xuXG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXJyKTtcbn07XG5cbmZ1bmN0aW9uIGZvckVhY2goeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9fc3RyZWFtX3RyYW5zZm9ybScpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59OyIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpLm5leHRUaWNrO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcblxudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB2b2lkIDA7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QnKTtcbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG52YXIgU3RyaW5nRGVjb2RlcjtcblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxudmFyIGtQcm94eUV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcblxuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7XG5cbiAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIGFueVxuICAvLyB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy4gVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgbmVlZHNcbiAgLy8gdG8gY29udGludWUgdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIE5vZGUuanMgdGhhdCBkbyBub3QgaW5jbHVkZVxuICAvLyB0aGUgcHJlcGVuZExpc3RlbmVyKCkgbWV0aG9kLiBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlbW92ZSB0aGlzIGhhY2suXG4gIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSBlbWl0dGVyLm9uKGV2ZW50LCBmbik7ZWxzZSBpZiAoaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgdmFyIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgcmVhZGFibGVId20gPSBvcHRpb25zLnJlYWRhYmxlSGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcblxuICBpZiAoaHdtIHx8IGh3bSA9PT0gMCkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtO2Vsc2UgaWYgKGlzRHVwbGV4ICYmIChyZWFkYWJsZUh3bSB8fCByZWFkYWJsZUh3bSA9PT0gMCkpIHRoaXMuaGlnaFdhdGVyTWFyayA9IHJlYWRhYmxlSHdtO2Vsc2UgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgZXZlbnQgJ3JlYWRhYmxlJy8nZGF0YScgaXMgZW1pdHRlZFxuICAvLyBpbW1lZGlhdGVseSwgb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZVxuICAvLyBhbnkgYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgcmVhZCBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKSByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICBjYihlcnIpO1xufTtcblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBza2lwQ2h1bmtDaGVjaztcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCBmYWxzZSwgc2tpcENodW5rQ2hlY2spO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBudWxsLCB0cnVlLCBmYWxzZSk7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250LCBza2lwQ2h1bmtDaGVjaykge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiAhc3RhdGUub2JqZWN0TW9kZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2h1bmspICE9PSBCdWZmZXIucHJvdG90eXBlKSB7XG4gICAgICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50JykpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyO1xuICBpZiAoIV9pc1VpbnQ4QXJyYXkoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiAxO1xuICBpZiAobiAhPT0gbikge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG47XG4gIC8vIERvbid0IGhhdmUgZW5vdWdoXG4gIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIG4gPSBwYXJzZUludChuLCAxMCk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH0gZWxzZSBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICAgIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICAgIGlmICghc3RhdGUucmVhZGluZykgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcbiAgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gbjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKSBwcm9jZXNzTmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7ZWxzZSBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3NOZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsIHVucGlwZUluZm8pIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgdXNlciBwdXNoZXMgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHdyaXRpbmcgdG8gZGVzdCB0aGVuIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBvbmRhdGEgYWdhaW4uIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byBpbmNyZWFzZSBhd2FpdERyYWluIG9uY2UgYmVjYXVzZVxuICAvLyBkZXN0IHdpbGwgb25seSBlbWl0IG9uZSAnZHJhaW4nIGV2ZW50IGZvciB0aGUgbXVsdGlwbGUgd3JpdGVzLlxuICAvLyA9PiBJbnRyb2R1Y2UgYSBndWFyZCBvbiBpbmNyZWFzaW5nIGF3YWl0RHJhaW4uXG4gIHZhciBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0ICYmICFpbmNyZWFzZWRBd2FpdERyYWluKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgdW5waXBlSW5mbyA9IHsgaGFzVW5waXBlZDogZmFsc2UgfTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgICB9cmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaW5kZXggPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gU3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3NOZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgX3RoaXMucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgX3RoaXMucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IF90aGlzLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwga1Byb3h5RXZlbnRzLmxlbmd0aDsgbisrKSB7XG4gICAgc3RyZWFtLm9uKGtQcm94eUV2ZW50c1tuXSwgdGhpcy5lbWl0LmJpbmQodGhpcywga1Byb3h5RXZlbnRzW25dKSk7XG4gIH1cblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICB0aGlzLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2goeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCd3cml0ZSBjYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnKSk7XG4gIH1cblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT0gbnVsbCkgLy8gc2luZ2xlIGVxdWFscyBjaGVjayBmb3IgYm90aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgXG4gICAgdGhpcy5wdXNoKGRhdGEpO1xuXG4gIGNiKGVyKTtcblxuICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0ge1xuICAgIGFmdGVyVHJhbnNmb3JtOiBhZnRlclRyYW5zZm9ybS5iaW5kKHRoaXMpLFxuICAgIG5lZWRUcmFuc2Zvcm06IGZhbHNlLFxuICAgIHRyYW5zZm9ybWluZzogZmFsc2UsXG4gICAgd3JpdGVjYjogbnVsbCxcbiAgICB3cml0ZWNodW5rOiBudWxsLFxuICAgIHdyaXRlZW5jb2Rpbmc6IG51bGxcbiAgfTtcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB0aGlzLm9uKCdwcmVmaW5pc2gnLCBwcmVmaW5pc2gpO1xufVxuXG5mdW5jdGlvbiBwcmVmaW5pc2goKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgICAgZG9uZShfdGhpcywgZXIsIGRhdGEpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGRvbmUodGhpcywgbnVsbCwgbnVsbCk7XG4gIH1cbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignX3RyYW5zZm9ybSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIER1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLCBlcnIsIGZ1bmN0aW9uIChlcnIyKSB7XG4gICAgY2IoZXJyMik7XG4gICAgX3RoaXMyLmVtaXQoJ2Nsb3NlJyk7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICBzdHJlYW0ucHVzaChkYXRhKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICBpZiAoc3RyZWFtLl93cml0YWJsZVN0YXRlLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAoc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpLm5leHRUaWNrO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qIDxyZXBsYWNlbWVudD4gKi9cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxuLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgb25Db3JrZWRGaW5pc2goX3RoaXMsIHN0YXRlKTtcbiAgfTtcbn1cbi8qIDwvcmVwbGFjZW1lbnQ+ICovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYXN5bmNXcml0ZSA9ICFwcm9jZXNzLmJyb3dzZXIgJiYgWyd2MC4xMCcsICd2MC45LiddLmluZGV4T2YocHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDAsIDUpKSA+IC0xID8gc2V0SW1tZWRpYXRlIDogcHJvY2Vzc05leHRUaWNrO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcblxudXRpbC5pbmhlcml0cyhXcml0YWJsZSwgU3RyZWFtKTtcblxuZnVuY3Rpb24gbm9wKCkge31cblxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBEdXBsZXggc3RyZWFtcyBhcmUgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUsIGJ1dCBzaGFyZVxuICAvLyB0aGUgc2FtZSBvcHRpb25zIG9iamVjdC5cbiAgLy8gSG93ZXZlciwgc29tZSBjYXNlcyByZXF1aXJlIHNldHRpbmcgb3B0aW9ucyB0byBkaWZmZXJlbnRcbiAgLy8gdmFsdWVzIGZvciB0aGUgcmVhZGFibGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlcyBvZiB0aGUgZHVwbGV4IHN0cmVhbS5cbiAgLy8gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgc2VwYXJhdGVseSBhcyByZWFkYWJsZVhYWCBhbmQgd3JpdGFibGVYWFguXG4gIHZhciBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleDtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCB3cml0ZSgpIHN0YXJ0cyByZXR1cm5pbmcgZmFsc2VcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyB0aGF0IHdlIGFsd2F5cyByZXR1cm4gZmFsc2UgaWZcbiAgLy8gdGhlIGVudGlyZSBidWZmZXIgaXMgbm90IGZsdXNoZWQgaW1tZWRpYXRlbHkgb24gd3JpdGUoKVxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgd3JpdGFibGVId20gPSBvcHRpb25zLndyaXRhYmxlSGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcblxuICBpZiAoaHdtIHx8IGh3bSA9PT0gMCkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtO2Vsc2UgaWYgKGlzRHVwbGV4ICYmICh3cml0YWJsZUh3bSB8fCB3cml0YWJsZUh3bSA9PT0gMCkpIHRoaXMuaGlnaFdhdGVyTWFyayA9IHdyaXRhYmxlSHdtO2Vsc2UgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBpZiBfZmluYWwgaGFzIGJlZW4gY2FsbGVkXG4gIHRoaXMuZmluYWxDYWxsZWQgPSBmYWxzZTtcblxuICAvLyBkcmFpbiBldmVudCBmbGFnLlxuICB0aGlzLm5lZWREcmFpbiA9IGZhbHNlO1xuICAvLyBhdCB0aGUgc3RhcnQgb2YgY2FsbGluZyBlbmQoKVxuICB0aGlzLmVuZGluZyA9IGZhbHNlO1xuICAvLyB3aGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkXG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgLy8gd2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkXG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBzaG91bGQgd2UgZGVjb2RlIHN0cmluZ3MgaW50byBidWZmZXJzIGJlZm9yZSBwYXNzaW5nIHRvIF93cml0ZT9cbiAgLy8gdGhpcyBpcyBoZXJlIHNvIHRoYXQgc29tZSBub2RlLWNvcmUgc3RyZWFtcyBjYW4gb3B0aW1pemUgc3RyaW5nXG4gIC8vIGhhbmRsaW5nIGF0IGEgbG93ZXIgbGV2ZWwuXG4gIHZhciBub0RlY29kZSA9IG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyBub3QgYW4gYWN0dWFsIGJ1ZmZlciB3ZSBrZWVwIHRyYWNrIG9mLCBidXQgYSBtZWFzdXJlbWVudFxuICAvLyBvZiBob3cgbXVjaCB3ZSdyZSB3YWl0aW5nIHRvIGdldCBwdXNoZWQgdG8gc29tZSB1bmRlcmx5aW5nXG4gIC8vIHNvY2tldCBvciBmaWxlLlxuICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cbiAgdGhpcy53cml0aW5nID0gZmFsc2U7XG5cbiAgLy8gd2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbFxuICB0aGlzLmNvcmtlZCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gYSBmbGFnIHRvIGtub3cgaWYgd2UncmUgcHJvY2Vzc2luZyBwcmV2aW91c2x5IGJ1ZmZlcmVkIGl0ZW1zLCB3aGljaFxuICAvLyBtYXkgY2FsbCB0aGUgX3dyaXRlKCkgY2FsbGJhY2sgaW4gdGhlIHNhbWUgdGljaywgc28gdGhhdCB3ZSBkb24ndFxuICAvLyBlbmQgdXAgaW4gYW4gb3ZlcmxhcHBlZCBvbndyaXRlIHNpdHVhdGlvbi5cbiAgdGhpcy5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLGNiKVxuICB0aGlzLm9ud3JpdGUgPSBmdW5jdGlvbiAoZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9O1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuXG4gIC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG5cbiAgdGhpcy5idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuXG4gIC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuICB0aGlzLnBlbmRpbmdjYiA9IDA7XG5cbiAgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAvLyBhbGxvY2F0ZSB0aGUgZmlyc3QgQ29ya2VkUmVxdWVzdCwgdGhlcmUgaXMgYWx3YXlzXG4gIC8vIG9uZSBhbGxvY2F0ZWQgYW5kIGZyZWUgdG8gdXNlLCBhbmQgd2UgbWFpbnRhaW4gYXQgbW9zdCB0d29cbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbn1cblxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJywgJ0RFUDAwMDMnKVxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7fVxufSkoKTtcblxuLy8gVGVzdCBfd3JpdGFibGVTdGF0ZSBmb3IgaW5oZXJpdGFuY2UgdG8gYWNjb3VudCBmb3IgRHVwbGV4IHN0cmVhbXMsXG4vLyB3aG9zZSBwcm90b3R5cGUgY2hhaW4gb25seSBwb2ludHMgdG8gUmVhZGFibGUuXG52YXIgcmVhbEhhc0luc3RhbmNlO1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmhhc0luc3RhbmNlICYmIHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICByZWFsSGFzSW5zdGFuY2UgPSBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgaWYgKHJlYWxIYXNJbnN0YW5jZS5jYWxsKHRoaXMsIG9iamVjdCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHRoaXMgIT09IFdyaXRhYmxlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgV3JpdGFibGVTdGF0ZTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiB0aGlzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gIGlmICghcmVhbEhhc0luc3RhbmNlLmNhbGwoV3JpdGFibGUsIHRoaXMpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHtcbiAgICByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB9XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmluYWwgPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZpbmFsID0gb3B0aW9ucy5maW5hbDtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZScpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhIHVzZXItc3VwcGxpZWQgY2h1bmsgaXMgdmFsaWQsIGVzcGVjaWFsbHkgZm9yIHRoZSBwYXJ0aWN1bGFyXG4vLyBtb2RlIHRoZSBzdHJlYW0gaXMgaW4uIEN1cnJlbnRseSB0aGlzIG1lYW5zIHRoYXQgYG51bGxgIGlzIG5ldmVyIGFjY2VwdGVkXG4vLyBhbmQgdW5kZWZpbmVkL25vbi1zdHJpbmcgdmFsdWVzIGFyZSBvbmx5IGFsbG93ZWQgaW4gb2JqZWN0IG1vZGUuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICB2YXIgZXIgPSBmYWxzZTtcblxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG4gIHZhciBpc0J1ZiA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIF9pc1VpbnQ4QXJyYXkoY2h1bmspO1xuXG4gIGlmIChpc0J1ZiAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoaXNCdWYpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcblxuICBpZiAoc3RhdGUuZW5kZWQpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKGlzQnVmIHx8IHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKCFpc0J1Zikge1xuICAgIHZhciBuZXdDaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICAgIGlmIChjaHVuayAhPT0gbmV3Q2h1bmspIHtcbiAgICAgIGlzQnVmID0gdHJ1ZTtcbiAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gICAgICBjaHVuayA9IG5ld0NodW5rO1xuICAgIH1cbiAgfVxuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0ge1xuICAgICAgY2h1bms6IGNodW5rLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgaXNCdWY6IGlzQnVmLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcblxuICBpZiAoc3luYykge1xuICAgIC8vIGRlZmVyIHRoZSBjYWxsYmFjayBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIHN5bmNocm9ub3VzbHlcbiAgICAvLyB0byBhdm9pZCBwaWxpbmcgdXAgdGhpbmdzIG9uIHRoZSBzdGFja1xuICAgIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBhbmQgaXQgd2lsbCBhbHdheXMgaGFwcGVuXG4gICAgLy8gYWZ0ZXIgZXJyb3JcbiAgICBwcm9jZXNzTmV4dFRpY2soZmluaXNoTWF5YmUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY2FsbGVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWZvcmUgaWZcbiAgICAvLyBpdCBpcyBhc3luY1xuICAgIGNiKGVyKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGJ1dCBmaW5pc2ggbXVzdFxuICAgIC8vIGFsd2F5cyBmb2xsb3cgZXJyb3JcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvKjxyZXBsYWNlbWVudD4qL1xuICAgICAgYXN5bmNXcml0ZShhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgLyo8L3JlcGxhY2VtZW50PiovXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgYWxsQnVmZmVycyA9IHRydWU7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBpZiAoIWVudHJ5LmlzQnVmKSBhbGxCdWZmZXJzID0gZmFsc2U7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBidWZmZXIuYWxsQnVmZmVycyA9IGFsbEJ1ZmZlcnM7XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS07XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ193cml0ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RyZWFtLl9maW5hbChmdW5jdGlvbiAoZXJyKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgaWYgKGVycikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkICYmICFzdGF0ZS5maW5hbENhbGxlZCkge1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtLl9maW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgICBzdGF0ZS5maW5hbENhbGxlZCA9IHRydWU7XG4gICAgICBwcm9jZXNzTmV4dFRpY2soY2FsbEZpbmFsLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsIHN0YXRlLCBlcnIpIHtcbiAgdmFyIGVudHJ5ID0gY29ya1JlcS5lbnRyeTtcbiAgY29ya1JlcS5lbnRyeSA9IG51bGw7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgIGNiKGVycik7XG4gICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICB9XG4gIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gY29ya1JlcTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMuZW5kKCk7XG4gIGNiKGVycik7XG59OyIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIGNvcHlCdWZmZXIoc3JjLCB0YXJnZXQsIG9mZnNldCkge1xuICBzcmMuY29weSh0YXJnZXQsIG9mZnNldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCdWZmZXJMaXN0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCdWZmZXJMaXN0KTtcblxuICAgIHRoaXMuaGVhZCA9IG51bGw7XG4gICAgdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCh2KSB7XG4gICAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiBudWxsIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMCkgdGhpcy50YWlsLm5leHQgPSBlbnRyeTtlbHNlIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgICsrdGhpcy5sZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIHVuc2hpZnQodikge1xuICAgIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogdGhpcy5oZWFkIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICArK3RoaXMubGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdmFyIHJldCA9IHRoaXMuaGVhZC5kYXRhO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgIC0tdGhpcy5sZW5ndGg7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBqb2luKHMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgcmV0ID0gJycgKyBwLmRhdGE7XG4gICAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICAgIHJldCArPSBzICsgcC5kYXRhO1xuICAgIH1yZXR1cm4gcmV0O1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdChuKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMuaGVhZC5kYXRhO1xuICAgIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChwKSB7XG4gICAgICBjb3B5QnVmZmVyKHAuZGF0YSwgcmV0LCBpKTtcbiAgICAgIGkgKz0gcC5kYXRhLmxlbmd0aDtcbiAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgcmV0dXJuIEJ1ZmZlckxpc3Q7XG59KCk7XG5cbmlmICh1dGlsICYmIHV0aWwuaW5zcGVjdCAmJiB1dGlsLmluc3BlY3QuY3VzdG9tKSB7XG4gIG1vZHVsZS5leHBvcnRzLnByb3RvdHlwZVt1dGlsLmluc3BlY3QuY3VzdG9tXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb2JqID0gdXRpbC5pbnNwZWN0KHsgbGVuZ3RoOiB0aGlzLmxlbmd0aCB9KTtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnICsgb2JqO1xuICB9O1xufSIsIid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJykubmV4dFRpY2s7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLy8gdW5kb2N1bWVudGVkIGNiKCkgQVBJLCBuZWVkZWQgZm9yIGNvcmUsIG5vdCBmb3IgcHVibGljIEFQSVxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlYWRhYmxlRGVzdHJveWVkID0gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgdmFyIHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcblxuICBpZiAocmVhZGFibGVEZXN0cm95ZWQgfHwgd3JpdGFibGVEZXN0cm95ZWQpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIGlmIChlcnIgJiYgKCF0aGlzLl93cml0YWJsZVN0YXRlIHx8ICF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkpIHtcbiAgICAgIHByb2Nlc3NOZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB3ZSBzZXQgZGVzdHJveWVkIHRvIHRydWUgYmVmb3JlIGZpcmluZyBlcnJvciBjYWxsYmFja3MgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBpdCByZS1lbnRyYW5jZSBzYWZlIGluIGNhc2UgZGVzdHJveSgpIGlzIGNhbGxlZCB3aXRoaW4gY2FsbGJhY2tzXG5cbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGEgZHVwbGV4IHN0cmVhbSBtYXJrIHRoZSB3cml0YWJsZSBwYXJ0IGFzIGRlc3Ryb3llZCBhcyB3ZWxsXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fZGVzdHJveShlcnIgfHwgbnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghY2IgJiYgZXJyKSB7XG4gICAgICBwcm9jZXNzTmV4dFRpY2soZW1pdEVycm9yTlQsIF90aGlzLCBlcnIpO1xuICAgICAgaWYgKF90aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIF90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVzdHJveTogZGVzdHJveSxcbiAgdW5kZXN0cm95OiB1bmRlc3Ryb3lcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4iLCJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IGV4cG9ydHM7XG5leHBvcnRzLlJlYWRhYmxlID0gZXhwb3J0cztcbmV4cG9ydHMuV3JpdGFibGUgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG5leHBvcnRzLkR1cGxleCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7XG5leHBvcnRzLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzJyk7XG5leHBvcnRzLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcycpO1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICAoZ2xvYmFsLmNyZWF0ZVJFR0wgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbnZhciBpc1R5cGVkQXJyYXkgPSBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4gKFxuICAgIHggaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8XG4gICAgeCBpbnN0YW5jZW9mIFVpbnQxNkFycmF5IHx8XG4gICAgeCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8XG4gICAgeCBpbnN0YW5jZW9mIEludDhBcnJheSB8fFxuICAgIHggaW5zdGFuY2VvZiBJbnQxNkFycmF5IHx8XG4gICAgeCBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHxcbiAgICB4IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8XG4gICAgeCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSB8fFxuICAgIHggaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheVxuICApXG59XG5cbnZhciBleHRlbmQgPSBmdW5jdGlvbiAoYmFzZSwgb3B0cykge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdHMpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgIGJhc2Vba2V5c1tpXV0gPSBvcHRzW2tleXNbaV1dXG4gIH1cbiAgcmV0dXJuIGJhc2Vcbn1cblxuLy8gRXJyb3IgY2hlY2tpbmcgYW5kIHBhcmFtZXRlciB2YWxpZGF0aW9uLlxuLy9cbi8vIFN0YXRlbWVudHMgZm9yIHRoZSBmb3JtIGBjaGVjay5zb21lUHJvY2VkdXJlKC4uLilgIGdldCByZW1vdmVkIGJ5XG4vLyBhIGJyb3dzZXJpZnkgdHJhbnNmb3JtIGZvciBvcHRpbWl6ZWQvbWluaWZpZWQgYnVuZGxlcy5cbi8vXG4vKiBnbG9iYWxzIGF0b2IgKi9cbnZhciBlbmRsID0gJ1xcbidcblxuLy8gb25seSB1c2VkIGZvciBleHRyYWN0aW5nIHNoYWRlciBuYW1lcy4gIGlmIGF0b2Igbm90IHByZXNlbnQsIHRoZW4gZXJyb3JzXG4vLyB3aWxsIGJlIHNsaWdodGx5IGNyYXBwaWVyXG5mdW5jdGlvbiBkZWNvZGVCNjQgKHN0cikge1xuICBpZiAodHlwZW9mIGF0b2IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGF0b2Ioc3RyKVxuICB9XG4gIHJldHVybiAnYmFzZTY0OicgKyBzdHJcbn1cblxuZnVuY3Rpb24gcmFpc2UgKG1lc3NhZ2UpIHtcbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKCcocmVnbCkgJyArIG1lc3NhZ2UpXG4gIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gIHRocm93IGVycm9yXG59XG5cbmZ1bmN0aW9uIGNoZWNrIChwcmVkLCBtZXNzYWdlKSB7XG4gIGlmICghcHJlZCkge1xuICAgIHJhaXNlKG1lc3NhZ2UpXG4gIH1cbn1cblxuZnVuY3Rpb24gZW5jb2xvbiAobWVzc2FnZSkge1xuICBpZiAobWVzc2FnZSkge1xuICAgIHJldHVybiAnOiAnICsgbWVzc2FnZVxuICB9XG4gIHJldHVybiAnJ1xufVxuXG5mdW5jdGlvbiBjaGVja1BhcmFtZXRlciAocGFyYW0sIHBvc3NpYmlsaXRpZXMsIG1lc3NhZ2UpIHtcbiAgaWYgKCEocGFyYW0gaW4gcG9zc2liaWxpdGllcykpIHtcbiAgICByYWlzZSgndW5rbm93biBwYXJhbWV0ZXIgKCcgKyBwYXJhbSArICcpJyArIGVuY29sb24obWVzc2FnZSkgK1xuICAgICAgICAgICcuIHBvc3NpYmxlIHZhbHVlczogJyArIE9iamVjdC5rZXlzKHBvc3NpYmlsaXRpZXMpLmpvaW4oKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0lzVHlwZWRBcnJheSAoZGF0YSwgbWVzc2FnZSkge1xuICBpZiAoIWlzVHlwZWRBcnJheShkYXRhKSkge1xuICAgIHJhaXNlKFxuICAgICAgJ2ludmFsaWQgcGFyYW1ldGVyIHR5cGUnICsgZW5jb2xvbihtZXNzYWdlKSArXG4gICAgICAnLiBtdXN0IGJlIGEgdHlwZWQgYXJyYXknKVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0YW5kYXJkVHlwZUVoICh2YWx1ZSwgdHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdudW1iZXInOiByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJ1xuICAgIGNhc2UgJ29iamVjdCc6IHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgY2FzZSAnc3RyaW5nJzogcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICBjYXNlICdib29sZWFuJzogcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nXG4gICAgY2FzZSAnZnVuY3Rpb24nOiByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG4gICAgY2FzZSAndW5kZWZpbmVkJzogcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICBjYXNlICdzeW1ib2wnOiByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJ1xuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrVHlwZU9mICh2YWx1ZSwgdHlwZSwgbWVzc2FnZSkge1xuICBpZiAoIXN0YW5kYXJkVHlwZUVoKHZhbHVlLCB0eXBlKSkge1xuICAgIHJhaXNlKFxuICAgICAgJ2ludmFsaWQgcGFyYW1ldGVyIHR5cGUnICsgZW5jb2xvbihtZXNzYWdlKSArXG4gICAgICAnLiBleHBlY3RlZCAnICsgdHlwZSArICcsIGdvdCAnICsgKHR5cGVvZiB2YWx1ZSkpXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tOb25OZWdhdGl2ZUludCAodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCEoKHZhbHVlID49IDApICYmXG4gICAgICAgICgodmFsdWUgfCAwKSA9PT0gdmFsdWUpKSkge1xuICAgIHJhaXNlKCdpbnZhbGlkIHBhcmFtZXRlciB0eXBlLCAoJyArIHZhbHVlICsgJyknICsgZW5jb2xvbihtZXNzYWdlKSArXG4gICAgICAgICAgJy4gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXInKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrT25lT2YgKHZhbHVlLCBsaXN0LCBtZXNzYWdlKSB7XG4gIGlmIChsaXN0LmluZGV4T2YodmFsdWUpIDwgMCkge1xuICAgIHJhaXNlKCdpbnZhbGlkIHZhbHVlJyArIGVuY29sb24obWVzc2FnZSkgKyAnLiBtdXN0IGJlIG9uZSBvZjogJyArIGxpc3QpXG4gIH1cbn1cblxudmFyIGNvbnN0cnVjdG9yS2V5cyA9IFtcbiAgJ2dsJyxcbiAgJ2NhbnZhcycsXG4gICdjb250YWluZXInLFxuICAnYXR0cmlidXRlcycsXG4gICdwaXhlbFJhdGlvJyxcbiAgJ2V4dGVuc2lvbnMnLFxuICAnb3B0aW9uYWxFeHRlbnNpb25zJyxcbiAgJ3Byb2ZpbGUnLFxuICAnb25Eb25lJ1xuXVxuXG5mdW5jdGlvbiBjaGVja0NvbnN0cnVjdG9yIChvYmopIHtcbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoY29uc3RydWN0b3JLZXlzLmluZGV4T2Yoa2V5KSA8IDApIHtcbiAgICAgIHJhaXNlKCdpbnZhbGlkIHJlZ2wgY29uc3RydWN0b3IgYXJndW1lbnQgXCInICsga2V5ICsgJ1wiLiBtdXN0IGJlIG9uZSBvZiAnICsgY29uc3RydWN0b3JLZXlzKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gbGVmdFBhZCAoc3RyLCBuKSB7XG4gIHN0ciA9IHN0ciArICcnXG4gIHdoaWxlIChzdHIubGVuZ3RoIDwgbikge1xuICAgIHN0ciA9ICcgJyArIHN0clxuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gU2hhZGVyRmlsZSAoKSB7XG4gIHRoaXMubmFtZSA9ICd1bmtub3duJ1xuICB0aGlzLmxpbmVzID0gW11cbiAgdGhpcy5pbmRleCA9IHt9XG4gIHRoaXMuaGFzRXJyb3JzID0gZmFsc2Vcbn1cblxuZnVuY3Rpb24gU2hhZGVyTGluZSAobnVtYmVyLCBsaW5lKSB7XG4gIHRoaXMubnVtYmVyID0gbnVtYmVyXG4gIHRoaXMubGluZSA9IGxpbmVcbiAgdGhpcy5lcnJvcnMgPSBbXVxufVxuXG5mdW5jdGlvbiBTaGFkZXJFcnJvciAoZmlsZU51bWJlciwgbGluZU51bWJlciwgbWVzc2FnZSkge1xuICB0aGlzLmZpbGUgPSBmaWxlTnVtYmVyXG4gIHRoaXMubGluZSA9IGxpbmVOdW1iZXJcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZVxufVxuXG5mdW5jdGlvbiBndWVzc0NvbW1hbmQgKCkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICB2YXIgc3RhY2sgPSAoZXJyb3Iuc3RhY2sgfHwgZXJyb3IpLnRvU3RyaW5nKClcbiAgdmFyIHBhdCA9IC9jb21waWxlUHJvY2VkdXJlLipcXG5cXHMqYXQuKlxcKCguKilcXCkvLmV4ZWMoc3RhY2spXG4gIGlmIChwYXQpIHtcbiAgICByZXR1cm4gcGF0WzFdXG4gIH1cbiAgdmFyIHBhdDIgPSAvY29tcGlsZVByb2NlZHVyZS4qXFxuXFxzKmF0XFxzKyguKikoXFxufCQpLy5leGVjKHN0YWNrKVxuICBpZiAocGF0Mikge1xuICAgIHJldHVybiBwYXQyWzFdXG4gIH1cbiAgcmV0dXJuICd1bmtub3duJ1xufVxuXG5mdW5jdGlvbiBndWVzc0NhbGxTaXRlICgpIHtcbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKClcbiAgdmFyIHN0YWNrID0gKGVycm9yLnN0YWNrIHx8IGVycm9yKS50b1N0cmluZygpXG4gIHZhciBwYXQgPSAvYXQgUkVHTENvbW1hbmQuKlxcblxccythdC4qXFwoKC4qKVxcKS8uZXhlYyhzdGFjaylcbiAgaWYgKHBhdCkge1xuICAgIHJldHVybiBwYXRbMV1cbiAgfVxuICB2YXIgcGF0MiA9IC9hdCBSRUdMQ29tbWFuZC4qXFxuXFxzK2F0XFxzKyguKilcXG4vLmV4ZWMoc3RhY2spXG4gIGlmIChwYXQyKSB7XG4gICAgcmV0dXJuIHBhdDJbMV1cbiAgfVxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmZ1bmN0aW9uIHBhcnNlU291cmNlIChzb3VyY2UsIGNvbW1hbmQpIHtcbiAgdmFyIGxpbmVzID0gc291cmNlLnNwbGl0KCdcXG4nKVxuICB2YXIgbGluZU51bWJlciA9IDFcbiAgdmFyIGZpbGVOdW1iZXIgPSAwXG4gIHZhciBmaWxlcyA9IHtcbiAgICB1bmtub3duOiBuZXcgU2hhZGVyRmlsZSgpLFxuICAgIDA6IG5ldyBTaGFkZXJGaWxlKClcbiAgfVxuICBmaWxlcy51bmtub3duLm5hbWUgPSBmaWxlc1swXS5uYW1lID0gY29tbWFuZCB8fCBndWVzc0NvbW1hbmQoKVxuICBmaWxlcy51bmtub3duLmxpbmVzLnB1c2gobmV3IFNoYWRlckxpbmUoMCwgJycpKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGxpbmUgPSBsaW5lc1tpXVxuICAgIHZhciBwYXJ0cyA9IC9eXFxzKiNcXHMqKFxcdyspXFxzKyguKylcXHMqJC8uZXhlYyhsaW5lKVxuICAgIGlmIChwYXJ0cykge1xuICAgICAgc3dpdGNoIChwYXJ0c1sxXSkge1xuICAgICAgICBjYXNlICdsaW5lJzpcbiAgICAgICAgICB2YXIgbGluZU51bWJlckluZm8gPSAvKFxcZCspKFxccytcXGQrKT8vLmV4ZWMocGFydHNbMl0pXG4gICAgICAgICAgaWYgKGxpbmVOdW1iZXJJbmZvKSB7XG4gICAgICAgICAgICBsaW5lTnVtYmVyID0gbGluZU51bWJlckluZm9bMV0gfCAwXG4gICAgICAgICAgICBpZiAobGluZU51bWJlckluZm9bMl0pIHtcbiAgICAgICAgICAgICAgZmlsZU51bWJlciA9IGxpbmVOdW1iZXJJbmZvWzJdIHwgMFxuICAgICAgICAgICAgICBpZiAoIShmaWxlTnVtYmVyIGluIGZpbGVzKSkge1xuICAgICAgICAgICAgICAgIGZpbGVzW2ZpbGVOdW1iZXJdID0gbmV3IFNoYWRlckZpbGUoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2RlZmluZSc6XG4gICAgICAgICAgdmFyIG5hbWVJbmZvID0gL1NIQURFUl9OQU1FKF9CNjQpP1xccysoLiopJC8uZXhlYyhwYXJ0c1syXSlcbiAgICAgICAgICBpZiAobmFtZUluZm8pIHtcbiAgICAgICAgICAgIGZpbGVzW2ZpbGVOdW1iZXJdLm5hbWUgPSAobmFtZUluZm9bMV1cbiAgICAgICAgICAgICAgPyBkZWNvZGVCNjQobmFtZUluZm9bMl0pXG4gICAgICAgICAgICAgIDogbmFtZUluZm9bMl0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGZpbGVzW2ZpbGVOdW1iZXJdLmxpbmVzLnB1c2gobmV3IFNoYWRlckxpbmUobGluZU51bWJlcisrLCBsaW5lKSlcbiAgfVxuICBPYmplY3Qua2V5cyhmaWxlcykuZm9yRWFjaChmdW5jdGlvbiAoZmlsZU51bWJlcikge1xuICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZU51bWJlcl1cbiAgICBmaWxlLmxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGZpbGUuaW5kZXhbbGluZS5udW1iZXJdID0gbGluZVxuICAgIH0pXG4gIH0pXG4gIHJldHVybiBmaWxlc1xufVxuXG5mdW5jdGlvbiBwYXJzZUVycm9yTG9nIChlcnJMb2cpIHtcbiAgdmFyIHJlc3VsdCA9IFtdXG4gIGVyckxvZy5zcGxpdCgnXFxuJykuZm9yRWFjaChmdW5jdGlvbiAoZXJyTXNnKSB7XG4gICAgaWYgKGVyck1zZy5sZW5ndGggPCA1KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdmFyIHBhcnRzID0gL15FUlJPUjpcXHMrKFxcZCspOihcXGQrKTpcXHMqKC4qKSQvLmV4ZWMoZXJyTXNnKVxuICAgIGlmIChwYXJ0cykge1xuICAgICAgcmVzdWx0LnB1c2gobmV3IFNoYWRlckVycm9yKFxuICAgICAgICBwYXJ0c1sxXSB8IDAsXG4gICAgICAgIHBhcnRzWzJdIHwgMCxcbiAgICAgICAgcGFydHNbM10udHJpbSgpKSlcbiAgICB9IGVsc2UgaWYgKGVyck1zZy5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQucHVzaChuZXcgU2hhZGVyRXJyb3IoJ3Vua25vd24nLCAwLCBlcnJNc2cpKVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBhbm5vdGF0ZUZpbGVzIChmaWxlcywgZXJyb3JzKSB7XG4gIGVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgIHZhciBmaWxlID0gZmlsZXNbZXJyb3IuZmlsZV1cbiAgICBpZiAoZmlsZSkge1xuICAgICAgdmFyIGxpbmUgPSBmaWxlLmluZGV4W2Vycm9yLmxpbmVdXG4gICAgICBpZiAobGluZSkge1xuICAgICAgICBsaW5lLmVycm9ycy5wdXNoKGVycm9yKVxuICAgICAgICBmaWxlLmhhc0Vycm9ycyA9IHRydWVcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIGZpbGVzLnVua25vd24uaGFzRXJyb3JzID0gdHJ1ZVxuICAgIGZpbGVzLnVua25vd24ubGluZXNbMF0uZXJyb3JzLnB1c2goZXJyb3IpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGNoZWNrU2hhZGVyRXJyb3IgKGdsLCBzaGFkZXIsIHNvdXJjZSwgdHlwZSwgY29tbWFuZCkge1xuICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgIHZhciBlcnJMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcilcbiAgICB2YXIgdHlwZU5hbWUgPSB0eXBlID09PSBnbC5GUkFHTUVOVF9TSEFERVIgPyAnZnJhZ21lbnQnIDogJ3ZlcnRleCdcbiAgICBjaGVja0NvbW1hbmRUeXBlKHNvdXJjZSwgJ3N0cmluZycsIHR5cGVOYW1lICsgJyBzaGFkZXIgc291cmNlIG11c3QgYmUgYSBzdHJpbmcnLCBjb21tYW5kKVxuICAgIHZhciBmaWxlcyA9IHBhcnNlU291cmNlKHNvdXJjZSwgY29tbWFuZClcbiAgICB2YXIgZXJyb3JzID0gcGFyc2VFcnJvckxvZyhlcnJMb2cpXG4gICAgYW5ub3RhdGVGaWxlcyhmaWxlcywgZXJyb3JzKVxuXG4gICAgT2JqZWN0LmtleXMoZmlsZXMpLmZvckVhY2goZnVuY3Rpb24gKGZpbGVOdW1iZXIpIHtcbiAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZU51bWJlcl1cbiAgICAgIGlmICghZmlsZS5oYXNFcnJvcnMpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHZhciBzdHJpbmdzID0gWycnXVxuICAgICAgdmFyIHN0eWxlcyA9IFsnJ11cblxuICAgICAgZnVuY3Rpb24gcHVzaCAoc3RyLCBzdHlsZSkge1xuICAgICAgICBzdHJpbmdzLnB1c2goc3RyKVxuICAgICAgICBzdHlsZXMucHVzaChzdHlsZSB8fCAnJylcbiAgICAgIH1cblxuICAgICAgcHVzaCgnZmlsZSBudW1iZXIgJyArIGZpbGVOdW1iZXIgKyAnOiAnICsgZmlsZS5uYW1lICsgJ1xcbicsICdjb2xvcjpyZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtmb250LXdlaWdodDpib2xkJylcblxuICAgICAgZmlsZS5saW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIGlmIChsaW5lLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcHVzaChsZWZ0UGFkKGxpbmUubnVtYmVyLCA0KSArICd8ICAnLCAnYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IGZvbnQtd2VpZ2h0OmJvbGQnKVxuICAgICAgICAgIHB1c2gobGluZS5saW5lICsgZW5kbCwgJ2NvbG9yOnJlZDsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IGZvbnQtd2VpZ2h0OmJvbGQnKVxuXG4gICAgICAgICAgLy8gdHJ5IHRvIGd1ZXNzIHRva2VuXG4gICAgICAgICAgdmFyIG9mZnNldCA9IDBcbiAgICAgICAgICBsaW5lLmVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICB2YXIgdG9rZW4gPSAvXlxccyonKC4qKSdcXHMqOlxccyooLiopJC8uZXhlYyhtZXNzYWdlKVxuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgIHZhciB0b2tlblBhdCA9IHRva2VuWzFdXG4gICAgICAgICAgICAgIG1lc3NhZ2UgPSB0b2tlblsyXVxuICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuUGF0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXNzaWduJzpcbiAgICAgICAgICAgICAgICAgIHRva2VuUGF0ID0gJz0nXG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWF4KGxpbmUubGluZS5pbmRleE9mKHRva2VuUGF0LCBvZmZzZXQpLCAwKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gMFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdXNoKGxlZnRQYWQoJ3wgJywgNikpXG4gICAgICAgICAgICBwdXNoKGxlZnRQYWQoJ15eXicsIG9mZnNldCArIDMpICsgZW5kbCwgJ2ZvbnQtd2VpZ2h0OmJvbGQnKVxuICAgICAgICAgICAgcHVzaChsZWZ0UGFkKCd8ICcsIDYpKVxuICAgICAgICAgICAgcHVzaChtZXNzYWdlICsgZW5kbCwgJ2ZvbnQtd2VpZ2h0OmJvbGQnKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgcHVzaChsZWZ0UGFkKCd8ICcsIDYpICsgZW5kbClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwdXNoKGxlZnRQYWQobGluZS5udW1iZXIsIDQpICsgJ3wgICcpXG4gICAgICAgICAgcHVzaChsaW5lLmxpbmUgKyBlbmRsLCAnY29sb3I6cmVkJylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmICF3aW5kb3cuY2hyb21lKSB7XG4gICAgICAgIHN0eWxlc1swXSA9IHN0cmluZ3Muam9pbignJWMnKVxuICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBzdHlsZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhzdHJpbmdzLmpvaW4oJycpKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjaGVjay5yYWlzZSgnRXJyb3IgY29tcGlsaW5nICcgKyB0eXBlTmFtZSArICcgc2hhZGVyLCAnICsgZmlsZXNbMF0ubmFtZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0xpbmtFcnJvciAoZ2wsIHByb2dyYW0sIGZyYWdTaGFkZXIsIHZlcnRTaGFkZXIsIGNvbW1hbmQpIHtcbiAgaWYgKCFnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkge1xuICAgIHZhciBlcnJMb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKVxuICAgIHZhciBmcmFnUGFyc2UgPSBwYXJzZVNvdXJjZShmcmFnU2hhZGVyLCBjb21tYW5kKVxuICAgIHZhciB2ZXJ0UGFyc2UgPSBwYXJzZVNvdXJjZSh2ZXJ0U2hhZGVyLCBjb21tYW5kKVxuXG4gICAgdmFyIGhlYWRlciA9ICdFcnJvciBsaW5raW5nIHByb2dyYW0gd2l0aCB2ZXJ0ZXggc2hhZGVyLCBcIicgK1xuICAgICAgdmVydFBhcnNlWzBdLm5hbWUgKyAnXCIsIGFuZCBmcmFnbWVudCBzaGFkZXIgXCInICsgZnJhZ1BhcnNlWzBdLm5hbWUgKyAnXCInXG5cbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5sb2coJyVjJyArIGhlYWRlciArIGVuZGwgKyAnJWMnICsgZXJyTG9nLFxuICAgICAgICAnY29sb3I6cmVkO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Zm9udC13ZWlnaHQ6Ym9sZCcsXG4gICAgICAgICdjb2xvcjpyZWQnKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhoZWFkZXIgKyBlbmRsICsgZXJyTG9nKVxuICAgIH1cbiAgICBjaGVjay5yYWlzZShoZWFkZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gc2F2ZUNvbW1hbmRSZWYgKG9iamVjdCkge1xuICBvYmplY3QuX2NvbW1hbmRSZWYgPSBndWVzc0NvbW1hbmQoKVxufVxuXG5mdW5jdGlvbiBzYXZlRHJhd0NvbW1hbmRJbmZvIChvcHRzLCB1bmlmb3JtcywgYXR0cmlidXRlcywgc3RyaW5nU3RvcmUpIHtcbiAgc2F2ZUNvbW1hbmRSZWYob3B0cylcblxuICBmdW5jdGlvbiBpZCAoc3RyKSB7XG4gICAgaWYgKHN0cikge1xuICAgICAgcmV0dXJuIHN0cmluZ1N0b3JlLmlkKHN0cilcbiAgICB9XG4gICAgcmV0dXJuIDBcbiAgfVxuICBvcHRzLl9mcmFnSWQgPSBpZChvcHRzLnN0YXRpYy5mcmFnKVxuICBvcHRzLl92ZXJ0SWQgPSBpZChvcHRzLnN0YXRpYy52ZXJ0KVxuXG4gIGZ1bmN0aW9uIGFkZFByb3BzIChkaWN0LCBzZXQpIHtcbiAgICBPYmplY3Qua2V5cyhzZXQpLmZvckVhY2goZnVuY3Rpb24gKHUpIHtcbiAgICAgIGRpY3Rbc3RyaW5nU3RvcmUuaWQodSldID0gdHJ1ZVxuICAgIH0pXG4gIH1cblxuICB2YXIgdW5pZm9ybVNldCA9IG9wdHMuX3VuaWZvcm1TZXQgPSB7fVxuICBhZGRQcm9wcyh1bmlmb3JtU2V0LCB1bmlmb3Jtcy5zdGF0aWMpXG4gIGFkZFByb3BzKHVuaWZvcm1TZXQsIHVuaWZvcm1zLmR5bmFtaWMpXG5cbiAgdmFyIGF0dHJpYnV0ZVNldCA9IG9wdHMuX2F0dHJpYnV0ZVNldCA9IHt9XG4gIGFkZFByb3BzKGF0dHJpYnV0ZVNldCwgYXR0cmlidXRlcy5zdGF0aWMpXG4gIGFkZFByb3BzKGF0dHJpYnV0ZVNldCwgYXR0cmlidXRlcy5keW5hbWljKVxuXG4gIG9wdHMuX2hhc0NvdW50ID0gKFxuICAgICdjb3VudCcgaW4gb3B0cy5zdGF0aWMgfHxcbiAgICAnY291bnQnIGluIG9wdHMuZHluYW1pYyB8fFxuICAgICdlbGVtZW50cycgaW4gb3B0cy5zdGF0aWMgfHxcbiAgICAnZWxlbWVudHMnIGluIG9wdHMuZHluYW1pYylcbn1cblxuZnVuY3Rpb24gY29tbWFuZFJhaXNlIChtZXNzYWdlLCBjb21tYW5kKSB7XG4gIHZhciBjYWxsU2l0ZSA9IGd1ZXNzQ2FsbFNpdGUoKVxuICByYWlzZShtZXNzYWdlICtcbiAgICAnIGluIGNvbW1hbmQgJyArIChjb21tYW5kIHx8IGd1ZXNzQ29tbWFuZCgpKSArXG4gICAgKGNhbGxTaXRlID09PSAndW5rbm93bicgPyAnJyA6ICcgY2FsbGVkIGZyb20gJyArIGNhbGxTaXRlKSlcbn1cblxuZnVuY3Rpb24gY2hlY2tDb21tYW5kIChwcmVkLCBtZXNzYWdlLCBjb21tYW5kKSB7XG4gIGlmICghcHJlZCkge1xuICAgIGNvbW1hbmRSYWlzZShtZXNzYWdlLCBjb21tYW5kIHx8IGd1ZXNzQ29tbWFuZCgpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUGFyYW1ldGVyQ29tbWFuZCAocGFyYW0sIHBvc3NpYmlsaXRpZXMsIG1lc3NhZ2UsIGNvbW1hbmQpIHtcbiAgaWYgKCEocGFyYW0gaW4gcG9zc2liaWxpdGllcykpIHtcbiAgICBjb21tYW5kUmFpc2UoXG4gICAgICAndW5rbm93biBwYXJhbWV0ZXIgKCcgKyBwYXJhbSArICcpJyArIGVuY29sb24obWVzc2FnZSkgK1xuICAgICAgJy4gcG9zc2libGUgdmFsdWVzOiAnICsgT2JqZWN0LmtleXMocG9zc2liaWxpdGllcykuam9pbigpLFxuICAgICAgY29tbWFuZCB8fCBndWVzc0NvbW1hbmQoKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0NvbW1hbmRUeXBlICh2YWx1ZSwgdHlwZSwgbWVzc2FnZSwgY29tbWFuZCkge1xuICBpZiAoIXN0YW5kYXJkVHlwZUVoKHZhbHVlLCB0eXBlKSkge1xuICAgIGNvbW1hbmRSYWlzZShcbiAgICAgICdpbnZhbGlkIHBhcmFtZXRlciB0eXBlJyArIGVuY29sb24obWVzc2FnZSkgK1xuICAgICAgJy4gZXhwZWN0ZWQgJyArIHR5cGUgKyAnLCBnb3QgJyArICh0eXBlb2YgdmFsdWUpLFxuICAgICAgY29tbWFuZCB8fCBndWVzc0NvbW1hbmQoKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja09wdGlvbmFsIChibG9jaykge1xuICBibG9jaygpXG59XG5cbmZ1bmN0aW9uIGNoZWNrRnJhbWVidWZmZXJGb3JtYXQgKGF0dGFjaG1lbnQsIHRleEZvcm1hdHMsIHJiRm9ybWF0cykge1xuICBpZiAoYXR0YWNobWVudC50ZXh0dXJlKSB7XG4gICAgY2hlY2tPbmVPZihcbiAgICAgIGF0dGFjaG1lbnQudGV4dHVyZS5fdGV4dHVyZS5pbnRlcm5hbGZvcm1hdCxcbiAgICAgIHRleEZvcm1hdHMsXG4gICAgICAndW5zdXBwb3J0ZWQgdGV4dHVyZSBmb3JtYXQgZm9yIGF0dGFjaG1lbnQnKVxuICB9IGVsc2Uge1xuICAgIGNoZWNrT25lT2YoXG4gICAgICBhdHRhY2htZW50LnJlbmRlcmJ1ZmZlci5fcmVuZGVyYnVmZmVyLmZvcm1hdCxcbiAgICAgIHJiRm9ybWF0cyxcbiAgICAgICd1bnN1cHBvcnRlZCByZW5kZXJidWZmZXIgZm9ybWF0IGZvciBhdHRhY2htZW50JylcbiAgfVxufVxuXG52YXIgR0xfQ0xBTVBfVE9fRURHRSA9IDB4ODEyRlxuXG52YXIgR0xfTkVBUkVTVCA9IDB4MjYwMFxudmFyIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgPSAweDI3MDBcbnZhciBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgPSAweDI3MDFcbnZhciBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgPSAweDI3MDJcbnZhciBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiA9IDB4MjcwM1xuXG52YXIgR0xfQllURSA9IDUxMjBcbnZhciBHTF9VTlNJR05FRF9CWVRFID0gNTEyMVxudmFyIEdMX1NIT1JUID0gNTEyMlxudmFyIEdMX1VOU0lHTkVEX1NIT1JUID0gNTEyM1xudmFyIEdMX0lOVCA9IDUxMjRcbnZhciBHTF9VTlNJR05FRF9JTlQgPSA1MTI1XG52YXIgR0xfRkxPQVQgPSA1MTI2XG5cbnZhciBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ID0gMHg4MDMzXG52YXIgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSA9IDB4ODAzNFxudmFyIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ID0gMHg4MzYzXG52YXIgR0xfVU5TSUdORURfSU5UXzI0XzhfV0VCR0wgPSAweDg0RkFcblxudmFyIEdMX0hBTEZfRkxPQVRfT0VTID0gMHg4RDYxXG5cbnZhciBUWVBFX1NJWkUgPSB7fVxuXG5UWVBFX1NJWkVbR0xfQllURV0gPVxuVFlQRV9TSVpFW0dMX1VOU0lHTkVEX0JZVEVdID0gMVxuXG5UWVBFX1NJWkVbR0xfU0hPUlRdID1cblRZUEVfU0laRVtHTF9VTlNJR05FRF9TSE9SVF0gPVxuVFlQRV9TSVpFW0dMX0hBTEZfRkxPQVRfT0VTXSA9XG5UWVBFX1NJWkVbR0xfVU5TSUdORURfU0hPUlRfNV82XzVdID1cblRZUEVfU0laRVtHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80XSA9XG5UWVBFX1NJWkVbR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMV0gPSAyXG5cblRZUEVfU0laRVtHTF9JTlRdID1cblRZUEVfU0laRVtHTF9VTlNJR05FRF9JTlRdID1cblRZUEVfU0laRVtHTF9GTE9BVF0gPVxuVFlQRV9TSVpFW0dMX1VOU0lHTkVEX0lOVF8yNF84X1dFQkdMXSA9IDRcblxuZnVuY3Rpb24gcGl4ZWxTaXplICh0eXBlLCBjaGFubmVscykge1xuICBpZiAodHlwZSA9PT0gR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSB8fFxuICAgICAgdHlwZSA9PT0gR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCB8fFxuICAgICAgdHlwZSA9PT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUpIHtcbiAgICByZXR1cm4gMlxuICB9IGVsc2UgaWYgKHR5cGUgPT09IEdMX1VOU0lHTkVEX0lOVF8yNF84X1dFQkdMKSB7XG4gICAgcmV0dXJuIDRcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gVFlQRV9TSVpFW3R5cGVdICogY2hhbm5lbHNcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1BvdzIgKHYpIHtcbiAgcmV0dXJuICEodiAmICh2IC0gMSkpICYmICghIXYpXG59XG5cbmZ1bmN0aW9uIGNoZWNrVGV4dHVyZTJEIChpbmZvLCBtaXBEYXRhLCBsaW1pdHMpIHtcbiAgdmFyIGlcbiAgdmFyIHcgPSBtaXBEYXRhLndpZHRoXG4gIHZhciBoID0gbWlwRGF0YS5oZWlnaHRcbiAgdmFyIGMgPSBtaXBEYXRhLmNoYW5uZWxzXG5cbiAgLy8gQ2hlY2sgdGV4dHVyZSBzaGFwZVxuICBjaGVjayh3ID4gMCAmJiB3IDw9IGxpbWl0cy5tYXhUZXh0dXJlU2l6ZSAmJlxuICAgICAgICBoID4gMCAmJiBoIDw9IGxpbWl0cy5tYXhUZXh0dXJlU2l6ZSxcbiAgJ2ludmFsaWQgdGV4dHVyZSBzaGFwZScpXG5cbiAgLy8gY2hlY2sgd3JhcCBtb2RlXG4gIGlmIChpbmZvLndyYXBTICE9PSBHTF9DTEFNUF9UT19FREdFIHx8IGluZm8ud3JhcFQgIT09IEdMX0NMQU1QX1RPX0VER0UpIHtcbiAgICBjaGVjayhpc1BvdzIodykgJiYgaXNQb3cyKGgpLFxuICAgICAgJ2luY29tcGF0aWJsZSB3cmFwIG1vZGUgZm9yIHRleHR1cmUsIGJvdGggd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIHBvd2VyIG9mIDInKVxuICB9XG5cbiAgaWYgKG1pcERhdGEubWlwbWFzayA9PT0gMSkge1xuICAgIGlmICh3ICE9PSAxICYmIGggIT09IDEpIHtcbiAgICAgIGNoZWNrKFxuICAgICAgICBpbmZvLm1pbkZpbHRlciAhPT0gR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAmJlxuICAgICAgICBpbmZvLm1pbkZpbHRlciAhPT0gR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICYmXG4gICAgICAgIGluZm8ubWluRmlsdGVyICE9PSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgJiZcbiAgICAgICAgaW5mby5taW5GaWx0ZXIgIT09IEdMX0xJTkVBUl9NSVBNQVBfTElORUFSLFxuICAgICAgICAnbWluIGZpbHRlciByZXF1aXJlcyBtaXBtYXAnKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyB0ZXh0dXJlIG11c3QgYmUgcG93ZXIgb2YgMlxuICAgIGNoZWNrKGlzUG93Mih3KSAmJiBpc1BvdzIoaCksXG4gICAgICAndGV4dHVyZSBtdXN0IGJlIGEgc3F1YXJlIHBvd2VyIG9mIDIgdG8gc3VwcG9ydCBtaXBtYXBwaW5nJylcbiAgICBjaGVjayhtaXBEYXRhLm1pcG1hc2sgPT09ICh3IDw8IDEpIC0gMSxcbiAgICAgICdtaXNzaW5nIG9yIGluY29tcGxldGUgbWlwbWFwIGRhdGEnKVxuICB9XG5cbiAgaWYgKG1pcERhdGEudHlwZSA9PT0gR0xfRkxPQVQpIHtcbiAgICBpZiAobGltaXRzLmV4dGVuc2lvbnMuaW5kZXhPZignb2VzX3RleHR1cmVfZmxvYXRfbGluZWFyJykgPCAwKSB7XG4gICAgICBjaGVjayhpbmZvLm1pbkZpbHRlciA9PT0gR0xfTkVBUkVTVCAmJiBpbmZvLm1hZ0ZpbHRlciA9PT0gR0xfTkVBUkVTVCxcbiAgICAgICAgJ2ZpbHRlciBub3Qgc3VwcG9ydGVkLCBtdXN0IGVuYWJsZSBvZXNfdGV4dHVyZV9mbG9hdF9saW5lYXInKVxuICAgIH1cbiAgICBjaGVjayghaW5mby5nZW5NaXBtYXBzLFxuICAgICAgJ21pcG1hcCBnZW5lcmF0aW9uIG5vdCBzdXBwb3J0ZWQgd2l0aCBmbG9hdCB0ZXh0dXJlcycpXG4gIH1cblxuICAvLyBjaGVjayBpbWFnZSBjb21wbGV0ZVxuICB2YXIgbWlwaW1hZ2VzID0gbWlwRGF0YS5pbWFnZXNcbiAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICBpZiAobWlwaW1hZ2VzW2ldKSB7XG4gICAgICB2YXIgbXcgPSB3ID4+IGlcbiAgICAgIHZhciBtaCA9IGggPj4gaVxuICAgICAgY2hlY2sobWlwRGF0YS5taXBtYXNrICYgKDEgPDwgaSksICdtaXNzaW5nIG1pcG1hcCBkYXRhJylcblxuICAgICAgdmFyIGltZyA9IG1pcGltYWdlc1tpXVxuXG4gICAgICBjaGVjayhcbiAgICAgICAgaW1nLndpZHRoID09PSBtdyAmJlxuICAgICAgICBpbWcuaGVpZ2h0ID09PSBtaCxcbiAgICAgICAgJ2ludmFsaWQgc2hhcGUgZm9yIG1pcCBpbWFnZXMnKVxuXG4gICAgICBjaGVjayhcbiAgICAgICAgaW1nLmZvcm1hdCA9PT0gbWlwRGF0YS5mb3JtYXQgJiZcbiAgICAgICAgaW1nLmludGVybmFsZm9ybWF0ID09PSBtaXBEYXRhLmludGVybmFsZm9ybWF0ICYmXG4gICAgICAgIGltZy50eXBlID09PSBtaXBEYXRhLnR5cGUsXG4gICAgICAgICdpbmNvbXBhdGlibGUgdHlwZSBmb3IgbWlwIGltYWdlJylcblxuICAgICAgaWYgKGltZy5jb21wcmVzc2VkKSB7XG4gICAgICAgIC8vIFRPRE86IGNoZWNrIHNpemUgZm9yIGNvbXByZXNzZWQgaW1hZ2VzXG4gICAgICB9IGVsc2UgaWYgKGltZy5kYXRhKSB7XG4gICAgICAgIC8vIGNoZWNrKGltZy5kYXRhLmJ5dGVMZW5ndGggPT09IG13ICogbWggKlxuICAgICAgICAvLyBNYXRoLm1heChwaXhlbFNpemUoaW1nLnR5cGUsIGMpLCBpbWcudW5wYWNrQWxpZ25tZW50KSxcbiAgICAgICAgdmFyIHJvd1NpemUgPSBNYXRoLmNlaWwocGl4ZWxTaXplKGltZy50eXBlLCBjKSAqIG13IC8gaW1nLnVucGFja0FsaWdubWVudCkgKiBpbWcudW5wYWNrQWxpZ25tZW50XG4gICAgICAgIGNoZWNrKGltZy5kYXRhLmJ5dGVMZW5ndGggPT09IHJvd1NpemUgKiBtaCxcbiAgICAgICAgICAnaW52YWxpZCBkYXRhIGZvciBpbWFnZSwgYnVmZmVyIHNpemUgaXMgaW5jb25zaXN0ZW50IHdpdGggaW1hZ2UgZm9ybWF0JylcbiAgICAgIH0gZWxzZSBpZiAoaW1nLmVsZW1lbnQpIHtcbiAgICAgICAgLy8gVE9ETzogY2hlY2sgZWxlbWVudCBjYW4gYmUgbG9hZGVkXG4gICAgICB9IGVsc2UgaWYgKGltZy5jb3B5KSB7XG4gICAgICAgIC8vIFRPRE86IGNoZWNrIGNvbXBhdGlibGUgZm9ybWF0IGFuZCB0eXBlXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaW5mby5nZW5NaXBtYXBzKSB7XG4gICAgICBjaGVjaygobWlwRGF0YS5taXBtYXNrICYgKDEgPDwgaSkpID09PSAwLCAnZXh0cmEgbWlwbWFwIGRhdGEnKVxuICAgIH1cbiAgfVxuXG4gIGlmIChtaXBEYXRhLmNvbXByZXNzZWQpIHtcbiAgICBjaGVjayghaW5mby5nZW5NaXBtYXBzLFxuICAgICAgJ21pcG1hcCBnZW5lcmF0aW9uIGZvciBjb21wcmVzc2VkIGltYWdlcyBub3Qgc3VwcG9ydGVkJylcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1RleHR1cmVDdWJlICh0ZXh0dXJlLCBpbmZvLCBmYWNlcywgbGltaXRzKSB7XG4gIHZhciB3ID0gdGV4dHVyZS53aWR0aFxuICB2YXIgaCA9IHRleHR1cmUuaGVpZ2h0XG4gIHZhciBjID0gdGV4dHVyZS5jaGFubmVsc1xuXG4gIC8vIENoZWNrIHRleHR1cmUgc2hhcGVcbiAgY2hlY2soXG4gICAgdyA+IDAgJiYgdyA8PSBsaW1pdHMubWF4VGV4dHVyZVNpemUgJiYgaCA+IDAgJiYgaCA8PSBsaW1pdHMubWF4VGV4dHVyZVNpemUsXG4gICAgJ2ludmFsaWQgdGV4dHVyZSBzaGFwZScpXG4gIGNoZWNrKFxuICAgIHcgPT09IGgsXG4gICAgJ2N1YmUgbWFwIG11c3QgYmUgc3F1YXJlJylcbiAgY2hlY2soXG4gICAgaW5mby53cmFwUyA9PT0gR0xfQ0xBTVBfVE9fRURHRSAmJiBpbmZvLndyYXBUID09PSBHTF9DTEFNUF9UT19FREdFLFxuICAgICd3cmFwIG1vZGUgbm90IHN1cHBvcnRlZCBieSBjdWJlIG1hcCcpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmYWNlcy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBmYWNlID0gZmFjZXNbaV1cbiAgICBjaGVjayhcbiAgICAgIGZhY2Uud2lkdGggPT09IHcgJiYgZmFjZS5oZWlnaHQgPT09IGgsXG4gICAgICAnaW5jb25zaXN0ZW50IGN1YmUgbWFwIGZhY2Ugc2hhcGUnKVxuXG4gICAgaWYgKGluZm8uZ2VuTWlwbWFwcykge1xuICAgICAgY2hlY2soIWZhY2UuY29tcHJlc3NlZCxcbiAgICAgICAgJ2NhbiBub3QgZ2VuZXJhdGUgbWlwbWFwIGZvciBjb21wcmVzc2VkIHRleHR1cmVzJylcbiAgICAgIGNoZWNrKGZhY2UubWlwbWFzayA9PT0gMSxcbiAgICAgICAgJ2NhbiBub3Qgc3BlY2lmeSBtaXBtYXBzIGFuZCBnZW5lcmF0ZSBtaXBtYXBzJylcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETzogY2hlY2sgbWlwIGFuZCBmaWx0ZXIgbW9kZVxuICAgIH1cblxuICAgIHZhciBtaXBtYXBzID0gZmFjZS5pbWFnZXNcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIHZhciBpbWcgPSBtaXBtYXBzW2pdXG4gICAgICBpZiAoaW1nKSB7XG4gICAgICAgIHZhciBtdyA9IHcgPj4galxuICAgICAgICB2YXIgbWggPSBoID4+IGpcbiAgICAgICAgY2hlY2soZmFjZS5taXBtYXNrICYgKDEgPDwgaiksICdtaXNzaW5nIG1pcG1hcCBkYXRhJylcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgaW1nLndpZHRoID09PSBtdyAmJlxuICAgICAgICAgIGltZy5oZWlnaHQgPT09IG1oLFxuICAgICAgICAgICdpbnZhbGlkIHNoYXBlIGZvciBtaXAgaW1hZ2VzJylcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgaW1nLmZvcm1hdCA9PT0gdGV4dHVyZS5mb3JtYXQgJiZcbiAgICAgICAgICBpbWcuaW50ZXJuYWxmb3JtYXQgPT09IHRleHR1cmUuaW50ZXJuYWxmb3JtYXQgJiZcbiAgICAgICAgICBpbWcudHlwZSA9PT0gdGV4dHVyZS50eXBlLFxuICAgICAgICAgICdpbmNvbXBhdGlibGUgdHlwZSBmb3IgbWlwIGltYWdlJylcblxuICAgICAgICBpZiAoaW1nLmNvbXByZXNzZWQpIHtcbiAgICAgICAgICAvLyBUT0RPOiBjaGVjayBzaXplIGZvciBjb21wcmVzc2VkIGltYWdlc1xuICAgICAgICB9IGVsc2UgaWYgKGltZy5kYXRhKSB7XG4gICAgICAgICAgY2hlY2soaW1nLmRhdGEuYnl0ZUxlbmd0aCA9PT0gbXcgKiBtaCAqXG4gICAgICAgICAgICBNYXRoLm1heChwaXhlbFNpemUoaW1nLnR5cGUsIGMpLCBpbWcudW5wYWNrQWxpZ25tZW50KSxcbiAgICAgICAgICAnaW52YWxpZCBkYXRhIGZvciBpbWFnZSwgYnVmZmVyIHNpemUgaXMgaW5jb25zaXN0ZW50IHdpdGggaW1hZ2UgZm9ybWF0JylcbiAgICAgICAgfSBlbHNlIGlmIChpbWcuZWxlbWVudCkge1xuICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGVsZW1lbnQgY2FuIGJlIGxvYWRlZFxuICAgICAgICB9IGVsc2UgaWYgKGltZy5jb3B5KSB7XG4gICAgICAgICAgLy8gVE9ETzogY2hlY2sgY29tcGF0aWJsZSBmb3JtYXQgYW5kIHR5cGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgY2hlY2skMSA9IGV4dGVuZChjaGVjaywge1xuICBvcHRpb25hbDogY2hlY2tPcHRpb25hbCxcbiAgcmFpc2U6IHJhaXNlLFxuICBjb21tYW5kUmFpc2U6IGNvbW1hbmRSYWlzZSxcbiAgY29tbWFuZDogY2hlY2tDb21tYW5kLFxuICBwYXJhbWV0ZXI6IGNoZWNrUGFyYW1ldGVyLFxuICBjb21tYW5kUGFyYW1ldGVyOiBjaGVja1BhcmFtZXRlckNvbW1hbmQsXG4gIGNvbnN0cnVjdG9yOiBjaGVja0NvbnN0cnVjdG9yLFxuICB0eXBlOiBjaGVja1R5cGVPZixcbiAgY29tbWFuZFR5cGU6IGNoZWNrQ29tbWFuZFR5cGUsXG4gIGlzVHlwZWRBcnJheTogY2hlY2tJc1R5cGVkQXJyYXksXG4gIG5uaTogY2hlY2tOb25OZWdhdGl2ZUludCxcbiAgb25lT2Y6IGNoZWNrT25lT2YsXG4gIHNoYWRlckVycm9yOiBjaGVja1NoYWRlckVycm9yLFxuICBsaW5rRXJyb3I6IGNoZWNrTGlua0Vycm9yLFxuICBjYWxsU2l0ZTogZ3Vlc3NDYWxsU2l0ZSxcbiAgc2F2ZUNvbW1hbmRSZWY6IHNhdmVDb21tYW5kUmVmLFxuICBzYXZlRHJhd0luZm86IHNhdmVEcmF3Q29tbWFuZEluZm8sXG4gIGZyYW1lYnVmZmVyRm9ybWF0OiBjaGVja0ZyYW1lYnVmZmVyRm9ybWF0LFxuICBndWVzc0NvbW1hbmQ6IGd1ZXNzQ29tbWFuZCxcbiAgdGV4dHVyZTJEOiBjaGVja1RleHR1cmUyRCxcbiAgdGV4dHVyZUN1YmU6IGNoZWNrVGV4dHVyZUN1YmVcbn0pO1xuXG52YXIgVkFSSUFCTEVfQ09VTlRFUiA9IDBcblxudmFyIERZTl9GVU5DID0gMFxudmFyIERZTl9DT05TVEFOVCA9IDVcbnZhciBEWU5fQVJSQVkgPSA2XG5cbmZ1bmN0aW9uIER5bmFtaWNWYXJpYWJsZSAodHlwZSwgZGF0YSkge1xuICB0aGlzLmlkID0gKFZBUklBQkxFX0NPVU5URVIrKylcbiAgdGhpcy50eXBlID0gdHlwZVxuICB0aGlzLmRhdGEgPSBkYXRhXG59XG5cbmZ1bmN0aW9uIGVzY2FwZVN0ciAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJylcbn1cblxuZnVuY3Rpb24gc3BsaXRQYXJ0cyAoc3RyKSB7XG4gIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICB2YXIgZmlyc3RDaGFyID0gc3RyLmNoYXJBdCgwKVxuICB2YXIgbGFzdENoYXIgPSBzdHIuY2hhckF0KHN0ci5sZW5ndGggLSAxKVxuXG4gIGlmIChzdHIubGVuZ3RoID4gMSAmJlxuICAgICAgZmlyc3RDaGFyID09PSBsYXN0Q2hhciAmJlxuICAgICAgKGZpcnN0Q2hhciA9PT0gJ1wiJyB8fCBmaXJzdENoYXIgPT09IFwiJ1wiKSkge1xuICAgIHJldHVybiBbJ1wiJyArIGVzY2FwZVN0cihzdHIuc3Vic3RyKDEsIHN0ci5sZW5ndGggLSAyKSkgKyAnXCInXVxuICB9XG5cbiAgdmFyIHBhcnRzID0gL1xcWyhmYWxzZXx0cnVlfG51bGx8XFxkK3wnW14nXSonfFwiW15cIl0qXCIpXFxdLy5leGVjKHN0cilcbiAgaWYgKHBhcnRzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHNwbGl0UGFydHMoc3RyLnN1YnN0cigwLCBwYXJ0cy5pbmRleCkpXG4gICAgICAgIC5jb25jYXQoc3BsaXRQYXJ0cyhwYXJ0c1sxXSkpXG4gICAgICAgIC5jb25jYXQoc3BsaXRQYXJ0cyhzdHIuc3Vic3RyKHBhcnRzLmluZGV4ICsgcGFydHNbMF0ubGVuZ3RoKSkpXG4gICAgKVxuICB9XG5cbiAgdmFyIHN1YnBhcnRzID0gc3RyLnNwbGl0KCcuJylcbiAgaWYgKHN1YnBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBbJ1wiJyArIGVzY2FwZVN0cihzdHIpICsgJ1wiJ11cbiAgfVxuXG4gIHZhciByZXN1bHQgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YnBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChzcGxpdFBhcnRzKHN1YnBhcnRzW2ldKSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHRvQWNjZXNzb3JTdHJpbmcgKHN0cikge1xuICByZXR1cm4gJ1snICsgc3BsaXRQYXJ0cyhzdHIpLmpvaW4oJ11bJykgKyAnXSdcbn1cblxuZnVuY3Rpb24gZGVmaW5lRHluYW1pYyAodHlwZSwgZGF0YSkge1xuICByZXR1cm4gbmV3IER5bmFtaWNWYXJpYWJsZSh0eXBlLCB0b0FjY2Vzc29yU3RyaW5nKGRhdGEgKyAnJykpXG59XG5cbmZ1bmN0aW9uIGlzRHluYW1pYyAoeCkge1xuICByZXR1cm4gKHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nICYmICF4Ll9yZWdsVHlwZSkgfHwgKHggaW5zdGFuY2VvZiBEeW5hbWljVmFyaWFibGUpXG59XG5cbmZ1bmN0aW9uIHVuYm94ICh4LCBwYXRoKSB7XG4gIGlmICh0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBuZXcgRHluYW1pY1ZhcmlhYmxlKERZTl9GVU5DLCB4KVxuICB9IGVsc2UgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgeCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIG5ldyBEeW5hbWljVmFyaWFibGUoRFlOX0NPTlNUQU5ULCB4KVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gbmV3IER5bmFtaWNWYXJpYWJsZShEWU5fQVJSQVksIHgubWFwKCh5LCBpKSA9PiB1bmJveCh5LCBwYXRoICsgJ1snICsgaSArICddJykpKVxuICB9IGVsc2UgaWYgKHggaW5zdGFuY2VvZiBEeW5hbWljVmFyaWFibGUpIHtcbiAgICByZXR1cm4geFxuICB9XG4gIGNoZWNrJDEoZmFsc2UsICdpbnZhbGlkIG9wdGlvbiB0eXBlIGluIHVuaWZvcm0gJyArIHBhdGgpXG59XG5cbnZhciBkeW5hbWljID0ge1xuICBEeW5hbWljVmFyaWFibGU6IER5bmFtaWNWYXJpYWJsZSxcbiAgZGVmaW5lOiBkZWZpbmVEeW5hbWljLFxuICBpc0R5bmFtaWM6IGlzRHluYW1pYyxcbiAgdW5ib3g6IHVuYm94LFxuICBhY2Nlc3NvcjogdG9BY2Nlc3NvclN0cmluZ1xufTtcblxuLyogZ2xvYmFscyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsIGNhbmNlbEFuaW1hdGlvbkZyYW1lICovXG52YXIgcmFmID0ge1xuICBuZXh0OiB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nXG4gICAgPyBmdW5jdGlvbiAoY2IpIHsgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZShjYikgfVxuICAgIDogZnVuY3Rpb24gKGNiKSB7IHJldHVybiBzZXRUaW1lb3V0KGNiLCAxNikgfSxcbiAgY2FuY2VsOiB0eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICA/IGZ1bmN0aW9uIChyYWYpIHsgcmV0dXJuIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZikgfVxuICAgIDogY2xlYXJUaW1lb3V0XG59O1xuXG4vKiBnbG9iYWxzIHBlcmZvcm1hbmNlICovXG52YXIgY2xvY2sgPSAodHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyAmJiBwZXJmb3JtYW5jZS5ub3cpXG4gICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBwZXJmb3JtYW5jZS5ub3coKSB9XG4gICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiArKG5ldyBEYXRlKCkpIH07XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0cmluZ1N0b3JlICgpIHtcbiAgdmFyIHN0cmluZ0lkcyA9IHsgJyc6IDAgfVxuICB2YXIgc3RyaW5nVmFsdWVzID0gWycnXVxuICByZXR1cm4ge1xuICAgIGlkOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gc3RyaW5nSWRzW3N0cl1cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuICAgICAgcmVzdWx0ID0gc3RyaW5nSWRzW3N0cl0gPSBzdHJpbmdWYWx1ZXMubGVuZ3RoXG4gICAgICBzdHJpbmdWYWx1ZXMucHVzaChzdHIpXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSxcblxuICAgIHN0cjogZnVuY3Rpb24gKGlkKSB7XG4gICAgICByZXR1cm4gc3RyaW5nVmFsdWVzW2lkXVxuICAgIH1cbiAgfVxufVxuXG4vLyBDb250ZXh0IGFuZCBjYW52YXMgY3JlYXRpb24gaGVscGVyIGZ1bmN0aW9uc1xuZnVuY3Rpb24gY3JlYXRlQ2FudmFzIChlbGVtZW50LCBvbkRvbmUsIHBpeGVsUmF0aW8pIHtcbiAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gIGV4dGVuZChjYW52YXMuc3R5bGUsIHtcbiAgICBib3JkZXI6IDAsXG4gICAgbWFyZ2luOiAwLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDBcbiAgfSlcbiAgZWxlbWVudC5hcHBlbmRDaGlsZChjYW52YXMpXG5cbiAgaWYgKGVsZW1lbnQgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICBjYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgZXh0ZW5kKGVsZW1lbnQuc3R5bGUsIHtcbiAgICAgIG1hcmdpbjogMCxcbiAgICAgIHBhZGRpbmc6IDBcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzaXplICgpIHtcbiAgICB2YXIgdyA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgdmFyIGggPSB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICBpZiAoZWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgdmFyIGJvdW5kcyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIHcgPSBib3VuZHMucmlnaHQgLSBib3VuZHMubGVmdFxuICAgICAgaCA9IGJvdW5kcy5ib3R0b20gLSBib3VuZHMudG9wXG4gICAgfVxuICAgIGNhbnZhcy53aWR0aCA9IHBpeGVsUmF0aW8gKiB3XG4gICAgY2FudmFzLmhlaWdodCA9IHBpeGVsUmF0aW8gKiBoXG4gICAgZXh0ZW5kKGNhbnZhcy5zdHlsZSwge1xuICAgICAgd2lkdGg6IHcgKyAncHgnLFxuICAgICAgaGVpZ2h0OiBoICsgJ3B4J1xuICAgIH0pXG4gIH1cblxuICB2YXIgcmVzaXplT2JzZXJ2ZXJcbiAgaWYgKGVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkgJiYgdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gaWdub3JlICdSZXNpemVPYnNlcnZlcicgaXMgbm90IGRlZmluZWRcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzZXRUaW1lb3V0IHRvIGF2b2lkIGZsaWNrZXJcbiAgICAgIHNldFRpbWVvdXQocmVzaXplKVxuICAgIH0pXG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50KVxuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemUsIGZhbHNlKVxuICB9XG5cbiAgZnVuY3Rpb24gb25EZXN0cm95ICgpIHtcbiAgICBpZiAocmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcmVzaXplKVxuICAgIH1cbiAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNhbnZhcylcbiAgfVxuXG4gIHJlc2l6ZSgpXG5cbiAgcmV0dXJuIHtcbiAgICBjYW52YXM6IGNhbnZhcyxcbiAgICBvbkRlc3Ryb3k6IG9uRGVzdHJveVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQgKGNhbnZhcywgY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgZnVuY3Rpb24gZ2V0IChuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjYW52YXMuZ2V0Q29udGV4dChuYW1lLCBjb250ZXh0QXR0cmlidXRlcylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgIGdldCgnd2ViZ2wnKSB8fFxuICAgIGdldCgnZXhwZXJpbWVudGFsLXdlYmdsJykgfHxcbiAgICBnZXQoJ3dlYmdsLWV4cGVyaW1lbnRhbCcpXG4gIClcbn1cblxuZnVuY3Rpb24gaXNIVE1MRWxlbWVudCAob2JqKSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG9iai5ub2RlTmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2Ygb2JqLmFwcGVuZENoaWxkID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iai5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbidcbiAgKVxufVxuXG5mdW5jdGlvbiBpc1dlYkdMQ29udGV4dCAob2JqKSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG9iai5kcmF3QXJyYXlzID09PSAnZnVuY3Rpb24nIHx8XG4gICAgdHlwZW9mIG9iai5kcmF3RWxlbWVudHMgPT09ICdmdW5jdGlvbidcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUV4dGVuc2lvbnMgKGlucHV0KSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGlucHV0LnNwbGl0KClcbiAgfVxuICBjaGVjayQxKEFycmF5LmlzQXJyYXkoaW5wdXQpLCAnaW52YWxpZCBleHRlbnNpb24gYXJyYXknKVxuICByZXR1cm4gaW5wdXRcbn1cblxuZnVuY3Rpb24gZ2V0RWxlbWVudCAoZGVzYykge1xuICBpZiAodHlwZW9mIGRlc2MgPT09ICdzdHJpbmcnKSB7XG4gICAgY2hlY2skMSh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnLCAnbm90IHN1cHBvcnRlZCBvdXRzaWRlIG9mIERPTScpXG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZGVzYylcbiAgfVxuICByZXR1cm4gZGVzY1xufVxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MgKGFyZ3NfKSB7XG4gIHZhciBhcmdzID0gYXJnc18gfHwge31cbiAgdmFyIGVsZW1lbnQsIGNvbnRhaW5lciwgY2FudmFzLCBnbFxuICB2YXIgY29udGV4dEF0dHJpYnV0ZXMgPSB7fVxuICB2YXIgZXh0ZW5zaW9ucyA9IFtdXG4gIHZhciBvcHRpb25hbEV4dGVuc2lvbnMgPSBbXVxuICB2YXIgcGl4ZWxSYXRpbyA9ICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IDEgOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbylcbiAgdmFyIHByb2ZpbGUgPSBmYWxzZVxuICB2YXIgb25Eb25lID0gZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNoZWNrJDEucmFpc2UoZXJyKVxuICAgIH1cbiAgfVxuICB2YXIgb25EZXN0cm95ID0gZnVuY3Rpb24gKCkge31cbiAgaWYgKHR5cGVvZiBhcmdzID09PSAnc3RyaW5nJykge1xuICAgIGNoZWNrJDEoXG4gICAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnLFxuICAgICAgJ3NlbGVjdG9yIHF1ZXJpZXMgb25seSBzdXBwb3J0ZWQgaW4gRE9NIGVudmlyb21lbnRzJylcbiAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhcmdzKVxuICAgIGNoZWNrJDEoZWxlbWVudCwgJ2ludmFsaWQgcXVlcnkgc3RyaW5nIGZvciBlbGVtZW50JylcbiAgfSBlbHNlIGlmICh0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoaXNIVE1MRWxlbWVudChhcmdzKSkge1xuICAgICAgZWxlbWVudCA9IGFyZ3NcbiAgICB9IGVsc2UgaWYgKGlzV2ViR0xDb250ZXh0KGFyZ3MpKSB7XG4gICAgICBnbCA9IGFyZ3NcbiAgICAgIGNhbnZhcyA9IGdsLmNhbnZhc1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVjayQxLmNvbnN0cnVjdG9yKGFyZ3MpXG4gICAgICBpZiAoJ2dsJyBpbiBhcmdzKSB7XG4gICAgICAgIGdsID0gYXJncy5nbFxuICAgICAgfSBlbHNlIGlmICgnY2FudmFzJyBpbiBhcmdzKSB7XG4gICAgICAgIGNhbnZhcyA9IGdldEVsZW1lbnQoYXJncy5jYW52YXMpXG4gICAgICB9IGVsc2UgaWYgKCdjb250YWluZXInIGluIGFyZ3MpIHtcbiAgICAgICAgY29udGFpbmVyID0gZ2V0RWxlbWVudChhcmdzLmNvbnRhaW5lcilcbiAgICAgIH1cbiAgICAgIGlmICgnYXR0cmlidXRlcycgaW4gYXJncykge1xuICAgICAgICBjb250ZXh0QXR0cmlidXRlcyA9IGFyZ3MuYXR0cmlidXRlc1xuICAgICAgICBjaGVjayQxLnR5cGUoY29udGV4dEF0dHJpYnV0ZXMsICdvYmplY3QnLCAnaW52YWxpZCBjb250ZXh0IGF0dHJpYnV0ZXMnKVxuICAgICAgfVxuICAgICAgaWYgKCdleHRlbnNpb25zJyBpbiBhcmdzKSB7XG4gICAgICAgIGV4dGVuc2lvbnMgPSBwYXJzZUV4dGVuc2lvbnMoYXJncy5leHRlbnNpb25zKVxuICAgICAgfVxuICAgICAgaWYgKCdvcHRpb25hbEV4dGVuc2lvbnMnIGluIGFyZ3MpIHtcbiAgICAgICAgb3B0aW9uYWxFeHRlbnNpb25zID0gcGFyc2VFeHRlbnNpb25zKGFyZ3Mub3B0aW9uYWxFeHRlbnNpb25zKVxuICAgICAgfVxuICAgICAgaWYgKCdvbkRvbmUnIGluIGFyZ3MpIHtcbiAgICAgICAgY2hlY2skMS50eXBlKFxuICAgICAgICAgIGFyZ3Mub25Eb25lLCAnZnVuY3Rpb24nLFxuICAgICAgICAgICdpbnZhbGlkIG9yIG1pc3Npbmcgb25Eb25lIGNhbGxiYWNrJylcbiAgICAgICAgb25Eb25lID0gYXJncy5vbkRvbmVcbiAgICAgIH1cbiAgICAgIGlmICgncHJvZmlsZScgaW4gYXJncykge1xuICAgICAgICBwcm9maWxlID0gISFhcmdzLnByb2ZpbGVcbiAgICAgIH1cbiAgICAgIGlmICgncGl4ZWxSYXRpbycgaW4gYXJncykge1xuICAgICAgICBwaXhlbFJhdGlvID0gK2FyZ3MucGl4ZWxSYXRpb1xuICAgICAgICBjaGVjayQxKHBpeGVsUmF0aW8gPiAwLCAnaW52YWxpZCBwaXhlbCByYXRpbycpXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNoZWNrJDEucmFpc2UoJ2ludmFsaWQgYXJndW1lbnRzIHRvIHJlZ2wnKVxuICB9XG5cbiAgaWYgKGVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnY2FudmFzJykge1xuICAgICAgY2FudmFzID0gZWxlbWVudFxuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIgPSBlbGVtZW50XG4gICAgfVxuICB9XG5cbiAgaWYgKCFnbCkge1xuICAgIGlmICghY2FudmFzKSB7XG4gICAgICBjaGVjayQxKFxuICAgICAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAnbXVzdCBtYW51YWxseSBzcGVjaWZ5IHdlYmdsIGNvbnRleHQgb3V0c2lkZSBvZiBET00gZW52aXJvbm1lbnRzJylcbiAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVDYW52YXMoY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHksIG9uRG9uZSwgcGl4ZWxSYXRpbylcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBjYW52YXMgPSByZXN1bHQuY2FudmFzXG4gICAgICBvbkRlc3Ryb3kgPSByZXN1bHQub25EZXN0cm95XG4gICAgfVxuICAgIC8vIHdvcmthcm91bmQgZm9yIGNocm9taXVtIGJ1ZywgcHJlbXVsdGlwbGllZCBhbHBoYSB2YWx1ZSBpcyBwbGF0Zm9ybSBkZXBlbmRlbnRcbiAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMucHJlbXVsdGlwbGllZEFscGhhID09PSB1bmRlZmluZWQpIGNvbnRleHRBdHRyaWJ1dGVzLnByZW11bHRpcGxpZWRBbHBoYSA9IHRydWVcbiAgICBnbCA9IGNyZWF0ZUNvbnRleHQoY2FudmFzLCBjb250ZXh0QXR0cmlidXRlcylcbiAgfVxuXG4gIGlmICghZ2wpIHtcbiAgICBvbkRlc3Ryb3koKVxuICAgIG9uRG9uZSgnd2ViZ2wgbm90IHN1cHBvcnRlZCwgdHJ5IHVwZ3JhZGluZyB5b3VyIGJyb3dzZXIgb3IgZ3JhcGhpY3MgZHJpdmVycyBodHRwOi8vZ2V0LndlYmdsLm9yZycpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2w6IGdsLFxuICAgIGNhbnZhczogY2FudmFzLFxuICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMsXG4gICAgb3B0aW9uYWxFeHRlbnNpb25zOiBvcHRpb25hbEV4dGVuc2lvbnMsXG4gICAgcGl4ZWxSYXRpbzogcGl4ZWxSYXRpbyxcbiAgICBwcm9maWxlOiBwcm9maWxlLFxuICAgIG9uRG9uZTogb25Eb25lLFxuICAgIG9uRGVzdHJveTogb25EZXN0cm95XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXh0ZW5zaW9uQ2FjaGUgKGdsLCBjb25maWcpIHtcbiAgdmFyIGV4dGVuc2lvbnMgPSB7fVxuXG4gIGZ1bmN0aW9uIHRyeUxvYWRFeHRlbnNpb24gKG5hbWVfKSB7XG4gICAgY2hlY2skMS50eXBlKG5hbWVfLCAnc3RyaW5nJywgJ2V4dGVuc2lvbiBuYW1lIG11c3QgYmUgc3RyaW5nJylcbiAgICB2YXIgbmFtZSA9IG5hbWVfLnRvTG93ZXJDYXNlKClcbiAgICB2YXIgZXh0XG4gICAgdHJ5IHtcbiAgICAgIGV4dCA9IGV4dGVuc2lvbnNbbmFtZV0gPSBnbC5nZXRFeHRlbnNpb24obmFtZSlcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiAhIWV4dFxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWcuZXh0ZW5zaW9ucy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBuYW1lID0gY29uZmlnLmV4dGVuc2lvbnNbaV1cbiAgICBpZiAoIXRyeUxvYWRFeHRlbnNpb24obmFtZSkpIHtcbiAgICAgIGNvbmZpZy5vbkRlc3Ryb3koKVxuICAgICAgY29uZmlnLm9uRG9uZSgnXCInICsgbmFtZSArICdcIiBleHRlbnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBXZWJHTCBjb250ZXh0LCB0cnkgdXBncmFkaW5nIHlvdXIgc3lzdGVtIG9yIGEgZGlmZmVyZW50IGJyb3dzZXInKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBjb25maWcub3B0aW9uYWxFeHRlbnNpb25zLmZvckVhY2godHJ5TG9hZEV4dGVuc2lvbilcblxuICByZXR1cm4ge1xuICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMsXG4gICAgcmVzdG9yZTogZnVuY3Rpb24gKCkge1xuICAgICAgT2JqZWN0LmtleXMoZXh0ZW5zaW9ucykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uc1tuYW1lXSAmJiAhdHJ5TG9hZEV4dGVuc2lvbihuYW1lKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignKHJlZ2wpOiBlcnJvciByZXN0b3JpbmcgZXh0ZW5zaW9uICcgKyBuYW1lKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsb29wIChuLCBmKSB7XG4gIHZhciByZXN1bHQgPSBBcnJheShuKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgIHJlc3VsdFtpXSA9IGYoaSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbnZhciBHTF9CWVRFJDEgPSA1MTIwXG52YXIgR0xfVU5TSUdORURfQllURSQyID0gNTEyMVxudmFyIEdMX1NIT1JUJDEgPSA1MTIyXG52YXIgR0xfVU5TSUdORURfU0hPUlQkMSA9IDUxMjNcbnZhciBHTF9JTlQkMSA9IDUxMjRcbnZhciBHTF9VTlNJR05FRF9JTlQkMSA9IDUxMjVcbnZhciBHTF9GTE9BVCQyID0gNTEyNlxuXG5mdW5jdGlvbiBuZXh0UG93MTYgKHYpIHtcbiAgZm9yICh2YXIgaSA9IDE2OyBpIDw9ICgxIDw8IDI4KTsgaSAqPSAxNikge1xuICAgIGlmICh2IDw9IGkpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG4gIHJldHVybiAwXG59XG5cbmZ1bmN0aW9uIGxvZzIgKHYpIHtcbiAgdmFyIHIsIHNoaWZ0XG4gIHIgPSAodiA+IDB4RkZGRikgPDwgNFxuICB2ID4+Pj0gclxuICBzaGlmdCA9ICh2ID4gMHhGRikgPDwgM1xuICB2ID4+Pj0gc2hpZnQ7IHIgfD0gc2hpZnRcbiAgc2hpZnQgPSAodiA+IDB4RikgPDwgMlxuICB2ID4+Pj0gc2hpZnQ7IHIgfD0gc2hpZnRcbiAgc2hpZnQgPSAodiA+IDB4MykgPDwgMVxuICB2ID4+Pj0gc2hpZnQ7IHIgfD0gc2hpZnRcbiAgcmV0dXJuIHIgfCAodiA+PiAxKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVQb29sICgpIHtcbiAgdmFyIGJ1ZmZlclBvb2wgPSBsb29wKDgsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gW11cbiAgfSlcblxuICBmdW5jdGlvbiBhbGxvYyAobikge1xuICAgIHZhciBzeiA9IG5leHRQb3cxNihuKVxuICAgIHZhciBiaW4gPSBidWZmZXJQb29sW2xvZzIoc3opID4+IDJdXG4gICAgaWYgKGJpbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYmluLnBvcCgpXG4gICAgfVxuICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoc3opXG4gIH1cblxuICBmdW5jdGlvbiBmcmVlIChidWYpIHtcbiAgICBidWZmZXJQb29sW2xvZzIoYnVmLmJ5dGVMZW5ndGgpID4+IDJdLnB1c2goYnVmKVxuICB9XG5cbiAgZnVuY3Rpb24gYWxsb2NUeXBlICh0eXBlLCBuKSB7XG4gICAgdmFyIHJlc3VsdCA9IG51bGxcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgR0xfQllURSQxOlxuICAgICAgICByZXN1bHQgPSBuZXcgSW50OEFycmF5KGFsbG9jKG4pLCAwLCBuKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFJDI6XG4gICAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGFsbG9jKG4pLCAwLCBuKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBHTF9TSE9SVCQxOlxuICAgICAgICByZXN1bHQgPSBuZXcgSW50MTZBcnJheShhbGxvYygyICogbiksIDAsIG4pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUJDE6XG4gICAgICAgIHJlc3VsdCA9IG5ldyBVaW50MTZBcnJheShhbGxvYygyICogbiksIDAsIG4pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIEdMX0lOVCQxOlxuICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheShhbGxvYyg0ICogbiksIDAsIG4pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVCQxOlxuICAgICAgICByZXN1bHQgPSBuZXcgVWludDMyQXJyYXkoYWxsb2MoNCAqIG4pLCAwLCBuKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBHTF9GTE9BVCQyOlxuICAgICAgICByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KGFsbG9jKDQgKiBuKSwgMCwgbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSBuKSB7XG4gICAgICByZXR1cm4gcmVzdWx0LnN1YmFycmF5KDAsIG4pXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyZWVUeXBlIChhcnJheSkge1xuICAgIGZyZWUoYXJyYXkuYnVmZmVyKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhbGxvYzogYWxsb2MsXG4gICAgZnJlZTogZnJlZSxcbiAgICBhbGxvY1R5cGU6IGFsbG9jVHlwZSxcbiAgICBmcmVlVHlwZTogZnJlZVR5cGVcbiAgfVxufVxuXG52YXIgcG9vbCA9IGNyZWF0ZVBvb2woKVxuXG4vLyB6ZXJvIHBvb2wgZm9yIGluaXRpYWwgemVybyBkYXRhXG5wb29sLnplcm8gPSBjcmVhdGVQb29sKClcblxudmFyIEdMX1NVQlBJWEVMX0JJVFMgPSAweDBENTBcbnZhciBHTF9SRURfQklUUyA9IDB4MEQ1MlxudmFyIEdMX0dSRUVOX0JJVFMgPSAweDBENTNcbnZhciBHTF9CTFVFX0JJVFMgPSAweDBENTRcbnZhciBHTF9BTFBIQV9CSVRTID0gMHgwRDU1XG52YXIgR0xfREVQVEhfQklUUyA9IDB4MEQ1NlxudmFyIEdMX1NURU5DSUxfQklUUyA9IDB4MEQ1N1xuXG52YXIgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFID0gMHg4NDZEXG52YXIgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFID0gMHg4NDZFXG5cbnZhciBHTF9NQVhfVEVYVFVSRV9TSVpFID0gMHgwRDMzXG52YXIgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgPSAweDBEM0FcbnZhciBHTF9NQVhfVkVSVEVYX0FUVFJJQlMgPSAweDg4NjlcbnZhciBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyA9IDB4OERGQlxudmFyIEdMX01BWF9WQVJZSU5HX1ZFQ1RPUlMgPSAweDhERkNcbnZhciBHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyA9IDB4OEI0RFxudmFyIEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyA9IDB4OEI0Q1xudmFyIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTID0gMHg4ODcyXG52YXIgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyA9IDB4OERGRFxudmFyIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgPSAweDg1MUNcbnZhciBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkUgPSAweDg0RThcblxudmFyIEdMX1ZFTkRPUiA9IDB4MUYwMFxudmFyIEdMX1JFTkRFUkVSID0gMHgxRjAxXG52YXIgR0xfVkVSU0lPTiA9IDB4MUYwMlxudmFyIEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiA9IDB4OEI4Q1xuXG52YXIgR0xfTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUID0gMHg4NEZGXG5cbnZhciBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfV0VCR0wgPSAweDhDREZcbnZhciBHTF9NQVhfRFJBV19CVUZGRVJTX1dFQkdMID0gMHg4ODI0XG5cbnZhciBHTF9URVhUVVJFXzJEID0gMHgwREUxXG52YXIgR0xfVEVYVFVSRV9DVUJFX01BUCA9IDB4ODUxM1xudmFyIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCA9IDB4ODUxNVxudmFyIEdMX1RFWFRVUkUwID0gMHg4NEMwXG52YXIgR0xfUkdCQSA9IDB4MTkwOFxudmFyIEdMX0ZMT0FUJDEgPSAweDE0MDZcbnZhciBHTF9VTlNJR05FRF9CWVRFJDEgPSAweDE0MDFcbnZhciBHTF9GUkFNRUJVRkZFUiA9IDB4OEQ0MFxudmFyIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFID0gMHg4Q0Q1XG52YXIgR0xfQ09MT1JfQVRUQUNITUVOVDAgPSAweDhDRTBcbnZhciBHTF9DT0xPUl9CVUZGRVJfQklUJDEgPSAweDQwMDBcblxudmFyIHdyYXBMaW1pdHMgPSBmdW5jdGlvbiAoZ2wsIGV4dGVuc2lvbnMpIHtcbiAgdmFyIG1heEFuaXNvdHJvcGljID0gMVxuICBpZiAoZXh0ZW5zaW9ucy5leHRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMpIHtcbiAgICBtYXhBbmlzb3Ryb3BpYyA9IGdsLmdldFBhcmFtZXRlcihHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpXG4gIH1cblxuICB2YXIgbWF4RHJhd2J1ZmZlcnMgPSAxXG4gIHZhciBtYXhDb2xvckF0dGFjaG1lbnRzID0gMVxuICBpZiAoZXh0ZW5zaW9ucy53ZWJnbF9kcmF3X2J1ZmZlcnMpIHtcbiAgICBtYXhEcmF3YnVmZmVycyA9IGdsLmdldFBhcmFtZXRlcihHTF9NQVhfRFJBV19CVUZGRVJTX1dFQkdMKVxuICAgIG1heENvbG9yQXR0YWNobWVudHMgPSBnbC5nZXRQYXJhbWV0ZXIoR0xfTUFYX0NPTE9SX0FUVEFDSE1FTlRTX1dFQkdMKVxuICB9XG5cbiAgLy8gZGV0ZWN0IGlmIHJlYWRpbmcgZmxvYXQgdGV4dHVyZXMgaXMgYXZhaWxhYmxlIChTYWZhcmkgZG9lc24ndCBzdXBwb3J0KVxuICB2YXIgcmVhZEZsb2F0ID0gISFleHRlbnNpb25zLm9lc190ZXh0dXJlX2Zsb2F0XG4gIGlmIChyZWFkRmxvYXQpIHtcbiAgICB2YXIgcmVhZEZsb2F0VGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKVxuICAgIGdsLmJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHJlYWRGbG9hdFRleHR1cmUpXG4gICAgZ2wudGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCAxLCAxLCAwLCBHTF9SR0JBLCBHTF9GTE9BVCQxLCBudWxsKVxuXG4gICAgdmFyIGZibyA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKClcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGZibylcbiAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RFWFRVUkVfMkQsIHJlYWRGbG9hdFRleHR1cmUsIDApXG4gICAgZ2wuYmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbnVsbClcblxuICAgIGlmIChnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKSAhPT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUpIHJlYWRGbG9hdCA9IGZhbHNlXG5cbiAgICBlbHNlIHtcbiAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIDEsIDEpXG4gICAgICBnbC5jbGVhckNvbG9yKDEuMCwgMC4wLCAwLjAsIDEuMClcbiAgICAgIGdsLmNsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQkMSlcbiAgICAgIHZhciBwaXhlbHMgPSBwb29sLmFsbG9jVHlwZShHTF9GTE9BVCQxLCA0KVxuICAgICAgZ2wucmVhZFBpeGVscygwLCAwLCAxLCAxLCBHTF9SR0JBLCBHTF9GTE9BVCQxLCBwaXhlbHMpXG5cbiAgICAgIGlmIChnbC5nZXRFcnJvcigpKSByZWFkRmxvYXQgPSBmYWxzZVxuICAgICAgZWxzZSB7XG4gICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZibylcbiAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZShyZWFkRmxvYXRUZXh0dXJlKVxuXG4gICAgICAgIHJlYWRGbG9hdCA9IHBpeGVsc1swXSA9PT0gMS4wXG4gICAgICB9XG5cbiAgICAgIHBvb2wuZnJlZVR5cGUocGl4ZWxzKVxuICAgIH1cbiAgfVxuXG4gIC8vIGRldGVjdCBub24gcG93ZXIgb2YgdHdvIGN1YmUgdGV4dHVyZXMgc3VwcG9ydCAoSUUgZG9lc24ndCBzdXBwb3J0KVxuICB2YXIgaXNJRSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmICgvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSB8fCAvVHJpZGVudFxcLy8udGVzdChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgfHwgL0VkZ2UvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpXG5cbiAgdmFyIG5wb3RUZXh0dXJlQ3ViZSA9IHRydWVcblxuICBpZiAoIWlzSUUpIHtcbiAgICB2YXIgY3ViZVRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKClcbiAgICB2YXIgZGF0YSA9IHBvb2wuYWxsb2NUeXBlKEdMX1VOU0lHTkVEX0JZVEUkMSwgMzYpXG4gICAgZ2wuYWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMClcbiAgICBnbC5iaW5kVGV4dHVyZShHTF9URVhUVVJFX0NVQkVfTUFQLCBjdWJlVGV4dHVyZSlcbiAgICBnbC50ZXhJbWFnZTJEKEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgMCwgR0xfUkdCQSwgMywgMywgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSQxLCBkYXRhKVxuICAgIHBvb2wuZnJlZVR5cGUoZGF0YSlcbiAgICBnbC5iaW5kVGV4dHVyZShHTF9URVhUVVJFX0NVQkVfTUFQLCBudWxsKVxuICAgIGdsLmRlbGV0ZVRleHR1cmUoY3ViZVRleHR1cmUpXG4gICAgbnBvdFRleHR1cmVDdWJlID0gIWdsLmdldEVycm9yKClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gZHJhd2luZyBidWZmZXIgYml0IGRlcHRoXG4gICAgY29sb3JCaXRzOiBbXG4gICAgICBnbC5nZXRQYXJhbWV0ZXIoR0xfUkVEX0JJVFMpLFxuICAgICAgZ2wuZ2V0UGFyYW1ldGVyKEdMX0dSRUVOX0JJVFMpLFxuICAgICAgZ2wuZ2V0UGFyYW1ldGVyKEdMX0JMVUVfQklUUyksXG4gICAgICBnbC5nZXRQYXJhbWV0ZXIoR0xfQUxQSEFfQklUUylcbiAgICBdLFxuICAgIGRlcHRoQml0czogZ2wuZ2V0UGFyYW1ldGVyKEdMX0RFUFRIX0JJVFMpLFxuICAgIHN0ZW5jaWxCaXRzOiBnbC5nZXRQYXJhbWV0ZXIoR0xfU1RFTkNJTF9CSVRTKSxcbiAgICBzdWJwaXhlbEJpdHM6IGdsLmdldFBhcmFtZXRlcihHTF9TVUJQSVhFTF9CSVRTKSxcblxuICAgIC8vIHN1cHBvcnRlZCBleHRlbnNpb25zXG4gICAgZXh0ZW5zaW9uczogT2JqZWN0LmtleXMoZXh0ZW5zaW9ucykuZmlsdGVyKGZ1bmN0aW9uIChleHQpIHtcbiAgICAgIHJldHVybiAhIWV4dGVuc2lvbnNbZXh0XVxuICAgIH0pLFxuXG4gICAgLy8gbWF4IGFuaXNvIHNhbXBsZXNcbiAgICBtYXhBbmlzb3Ryb3BpYzogbWF4QW5pc290cm9waWMsXG5cbiAgICAvLyBtYXggZHJhdyBidWZmZXJzXG4gICAgbWF4RHJhd2J1ZmZlcnM6IG1heERyYXdidWZmZXJzLFxuICAgIG1heENvbG9yQXR0YWNobWVudHM6IG1heENvbG9yQXR0YWNobWVudHMsXG5cbiAgICAvLyBwb2ludCBhbmQgbGluZSBzaXplIHJhbmdlc1xuICAgIHBvaW50U2l6ZURpbXM6IGdsLmdldFBhcmFtZXRlcihHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UpLFxuICAgIGxpbmVXaWR0aERpbXM6IGdsLmdldFBhcmFtZXRlcihHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UpLFxuICAgIG1heFZpZXdwb3J0RGltczogZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9WSUVXUE9SVF9ESU1TKSxcbiAgICBtYXhDb21iaW5lZFRleHR1cmVVbml0czogZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTKSxcbiAgICBtYXhDdWJlTWFwU2l6ZTogZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUpLFxuICAgIG1heFJlbmRlcmJ1ZmZlclNpemU6IGdsLmdldFBhcmFtZXRlcihHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkUpLFxuICAgIG1heFRleHR1cmVVbml0czogZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSxcbiAgICBtYXhUZXh0dXJlU2l6ZTogZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9URVhUVVJFX1NJWkUpLFxuICAgIG1heEF0dHJpYnV0ZXM6IGdsLmdldFBhcmFtZXRlcihHTF9NQVhfVkVSVEVYX0FUVFJJQlMpLFxuICAgIG1heFZlcnRleFVuaWZvcm1zOiBnbC5nZXRQYXJhbWV0ZXIoR0xfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMpLFxuICAgIG1heFZlcnRleFRleHR1cmVVbml0czogZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyksXG4gICAgbWF4VmFyeWluZ1ZlY3RvcnM6IGdsLmdldFBhcmFtZXRlcihHTF9NQVhfVkFSWUlOR19WRUNUT1JTKSxcbiAgICBtYXhGcmFnbWVudFVuaWZvcm1zOiBnbC5nZXRQYXJhbWV0ZXIoR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyksXG5cbiAgICAvLyB2ZW5kb3IgaW5mb1xuICAgIGdsc2w6IGdsLmdldFBhcmFtZXRlcihHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04pLFxuICAgIHJlbmRlcmVyOiBnbC5nZXRQYXJhbWV0ZXIoR0xfUkVOREVSRVIpLFxuICAgIHZlbmRvcjogZ2wuZ2V0UGFyYW1ldGVyKEdMX1ZFTkRPUiksXG4gICAgdmVyc2lvbjogZ2wuZ2V0UGFyYW1ldGVyKEdMX1ZFUlNJT04pLFxuXG4gICAgLy8gcXVpcmtzXG4gICAgcmVhZEZsb2F0OiByZWFkRmxvYXQsXG4gICAgbnBvdFRleHR1cmVDdWJlOiBucG90VGV4dHVyZUN1YmVcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05EQXJyYXlMaWtlIChvYmopIHtcbiAgcmV0dXJuIChcbiAgICAhIW9iaiAmJlxuICAgIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmXG4gICAgQXJyYXkuaXNBcnJheShvYmouc2hhcGUpICYmXG4gICAgQXJyYXkuaXNBcnJheShvYmouc3RyaWRlKSAmJlxuICAgIHR5cGVvZiBvYmoub2Zmc2V0ID09PSAnbnVtYmVyJyAmJlxuICAgIG9iai5zaGFwZS5sZW5ndGggPT09IG9iai5zdHJpZGUubGVuZ3RoICYmXG4gICAgKEFycmF5LmlzQXJyYXkob2JqLmRhdGEpIHx8XG4gICAgICBpc1R5cGVkQXJyYXkob2JqLmRhdGEpKSlcbn1cblxudmFyIHZhbHVlcyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIG9ialtrZXldIH0pXG59XG5cbnZhciBmbGF0dGVuVXRpbHMgPSB7XG4gIHNoYXBlOiBhcnJheVNoYXBlJDEsXG4gIGZsYXR0ZW46IGZsYXR0ZW5BcnJheVxufTtcblxuZnVuY3Rpb24gZmxhdHRlbjFEIChhcnJheSwgbngsIG91dCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG54OyArK2kpIHtcbiAgICBvdXRbaV0gPSBhcnJheVtpXVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW4yRCAoYXJyYXksIG54LCBueSwgb3V0KSB7XG4gIHZhciBwdHIgPSAwXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbng7ICsraSkge1xuICAgIHZhciByb3cgPSBhcnJheVtpXVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnk7ICsraikge1xuICAgICAgb3V0W3B0cisrXSA9IHJvd1tqXVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbGF0dGVuM0QgKGFycmF5LCBueCwgbnksIG56LCBvdXQsIHB0cl8pIHtcbiAgdmFyIHB0ciA9IHB0cl9cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBueDsgKytpKSB7XG4gICAgdmFyIHJvdyA9IGFycmF5W2ldXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBueTsgKytqKSB7XG4gICAgICB2YXIgY29sID0gcm93W2pdXG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IG56OyArK2spIHtcbiAgICAgICAgb3V0W3B0cisrXSA9IGNvbFtrXVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbGF0dGVuUmVjIChhcnJheSwgc2hhcGUsIGxldmVsLCBvdXQsIHB0cikge1xuICB2YXIgc3RyaWRlID0gMVxuICBmb3IgKHZhciBpID0gbGV2ZWwgKyAxOyBpIDwgc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICBzdHJpZGUgKj0gc2hhcGVbaV1cbiAgfVxuICB2YXIgbiA9IHNoYXBlW2xldmVsXVxuICBpZiAoc2hhcGUubGVuZ3RoIC0gbGV2ZWwgPT09IDQpIHtcbiAgICB2YXIgbnggPSBzaGFwZVtsZXZlbCArIDFdXG4gICAgdmFyIG55ID0gc2hhcGVbbGV2ZWwgKyAyXVxuICAgIHZhciBueiA9IHNoYXBlW2xldmVsICsgM11cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBmbGF0dGVuM0QoYXJyYXlbaV0sIG54LCBueSwgbnosIG91dCwgcHRyKVxuICAgICAgcHRyICs9IHN0cmlkZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBmbGF0dGVuUmVjKGFycmF5W2ldLCBzaGFwZSwgbGV2ZWwgKyAxLCBvdXQsIHB0cilcbiAgICAgIHB0ciArPSBzdHJpZGVcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmxhdHRlbkFycmF5IChhcnJheSwgc2hhcGUsIHR5cGUsIG91dF8pIHtcbiAgdmFyIHN6ID0gMVxuICBpZiAoc2hhcGUubGVuZ3RoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgc3ogKj0gc2hhcGVbaV1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3ogPSAwXG4gIH1cbiAgdmFyIG91dCA9IG91dF8gfHwgcG9vbC5hbGxvY1R5cGUodHlwZSwgc3opXG4gIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgYnJlYWtcbiAgICBjYXNlIDE6XG4gICAgICBmbGF0dGVuMUQoYXJyYXksIHNoYXBlWzBdLCBvdXQpXG4gICAgICBicmVha1xuICAgIGNhc2UgMjpcbiAgICAgIGZsYXR0ZW4yRChhcnJheSwgc2hhcGVbMF0sIHNoYXBlWzFdLCBvdXQpXG4gICAgICBicmVha1xuICAgIGNhc2UgMzpcbiAgICAgIGZsYXR0ZW4zRChhcnJheSwgc2hhcGVbMF0sIHNoYXBlWzFdLCBzaGFwZVsyXSwgb3V0LCAwKVxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgZmxhdHRlblJlYyhhcnJheSwgc2hhcGUsIDAsIG91dCwgMClcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIGFycmF5U2hhcGUkMSAoYXJyYXlfKSB7XG4gIHZhciBzaGFwZSA9IFtdXG4gIGZvciAodmFyIGFycmF5ID0gYXJyYXlfOyBhcnJheS5sZW5ndGg7IGFycmF5ID0gYXJyYXlbMF0pIHtcbiAgICBzaGFwZS5wdXNoKGFycmF5Lmxlbmd0aClcbiAgfVxuICByZXR1cm4gc2hhcGVcbn1cblxudmFyIGFycmF5VHlwZXMgPSAge1xuXHRcIltvYmplY3QgSW50OEFycmF5XVwiOiA1MTIwLFxuXHRcIltvYmplY3QgSW50MTZBcnJheV1cIjogNTEyMixcblx0XCJbb2JqZWN0IEludDMyQXJyYXldXCI6IDUxMjQsXG5cdFwiW29iamVjdCBVaW50OEFycmF5XVwiOiA1MTIxLFxuXHRcIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldXCI6IDUxMjEsXG5cdFwiW29iamVjdCBVaW50MTZBcnJheV1cIjogNTEyMyxcblx0XCJbb2JqZWN0IFVpbnQzMkFycmF5XVwiOiA1MTI1LFxuXHRcIltvYmplY3QgRmxvYXQzMkFycmF5XVwiOiA1MTI2LFxuXHRcIltvYmplY3QgRmxvYXQ2NEFycmF5XVwiOiA1MTIxLFxuXHRcIltvYmplY3QgQXJyYXlCdWZmZXJdXCI6IDUxMjFcbn07XG5cbnZhciBpbnQ4ID0gNTEyMDtcbnZhciBpbnQxNiA9IDUxMjI7XG52YXIgaW50MzIgPSA1MTI0O1xudmFyIHVpbnQ4ID0gNTEyMTtcbnZhciB1aW50MTYgPSA1MTIzO1xudmFyIHVpbnQzMiA9IDUxMjU7XG52YXIgZmxvYXQgPSA1MTI2O1xudmFyIGZsb2F0MzIgPSA1MTI2O1xudmFyIGdsVHlwZXMgPSB7XG5cdGludDg6IGludDgsXG5cdGludDE2OiBpbnQxNixcblx0aW50MzI6IGludDMyLFxuXHR1aW50ODogdWludDgsXG5cdHVpbnQxNjogdWludDE2LFxuXHR1aW50MzI6IHVpbnQzMixcblx0ZmxvYXQ6IGZsb2F0LFxuXHRmbG9hdDMyOiBmbG9hdDMyXG59O1xuXG52YXIgZHluYW1pYyQxID0gMzUwNDg7XG52YXIgc3RyZWFtID0gMzUwNDA7XG52YXIgdXNhZ2VUeXBlcyA9IHtcblx0ZHluYW1pYzogZHluYW1pYyQxLFxuXHRzdHJlYW06IHN0cmVhbSxcblx0XCJzdGF0aWNcIjogMzUwNDRcbn07XG5cbnZhciBhcnJheUZsYXR0ZW4gPSBmbGF0dGVuVXRpbHMuZmxhdHRlblxudmFyIGFycmF5U2hhcGUgPSBmbGF0dGVuVXRpbHMuc2hhcGVcblxudmFyIEdMX1NUQVRJQ19EUkFXID0gMHg4OEU0XG52YXIgR0xfU1RSRUFNX0RSQVcgPSAweDg4RTBcblxudmFyIEdMX1VOU0lHTkVEX0JZVEUkMyA9IDUxMjFcbnZhciBHTF9GTE9BVCQzID0gNTEyNlxuXG52YXIgRFRZUEVTX1NJWkVTID0gW11cbkRUWVBFU19TSVpFU1s1MTIwXSA9IDEgLy8gaW50OFxuRFRZUEVTX1NJWkVTWzUxMjJdID0gMiAvLyBpbnQxNlxuRFRZUEVTX1NJWkVTWzUxMjRdID0gNCAvLyBpbnQzMlxuRFRZUEVTX1NJWkVTWzUxMjFdID0gMSAvLyB1aW50OFxuRFRZUEVTX1NJWkVTWzUxMjNdID0gMiAvLyB1aW50MTZcbkRUWVBFU19TSVpFU1s1MTI1XSA9IDQgLy8gdWludDMyXG5EVFlQRVNfU0laRVNbNTEyNl0gPSA0IC8vIGZsb2F0MzJcblxuZnVuY3Rpb24gdHlwZWRBcnJheUNvZGUgKGRhdGEpIHtcbiAgcmV0dXJuIGFycmF5VHlwZXNbT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGEpXSB8IDBcbn1cblxuZnVuY3Rpb24gY29weUFycmF5IChvdXQsIGlucCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGlucC5sZW5ndGg7ICsraSkge1xuICAgIG91dFtpXSA9IGlucFtpXVxuICB9XG59XG5cbmZ1bmN0aW9uIHRyYW5zcG9zZSAoXG4gIHJlc3VsdCwgZGF0YSwgc2hhcGVYLCBzaGFwZVksIHN0cmlkZVgsIHN0cmlkZVksIG9mZnNldCkge1xuICB2YXIgcHRyID0gMFxuICBmb3IgKHZhciBpID0gMDsgaSA8IHNoYXBlWDsgKytpKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaGFwZVk7ICsraikge1xuICAgICAgcmVzdWx0W3B0cisrXSA9IGRhdGFbc3RyaWRlWCAqIGkgKyBzdHJpZGVZICogaiArIG9mZnNldF1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JhcEJ1ZmZlclN0YXRlIChnbCwgc3RhdHMsIGNvbmZpZywgZGVzdHJveUJ1ZmZlcikge1xuICB2YXIgYnVmZmVyQ291bnQgPSAwXG4gIHZhciBidWZmZXJTZXQgPSB7fVxuXG4gIGZ1bmN0aW9uIFJFR0xCdWZmZXIgKHR5cGUpIHtcbiAgICB0aGlzLmlkID0gYnVmZmVyQ291bnQrK1xuICAgIHRoaXMuYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKClcbiAgICB0aGlzLnR5cGUgPSB0eXBlXG4gICAgdGhpcy51c2FnZSA9IEdMX1NUQVRJQ19EUkFXXG4gICAgdGhpcy5ieXRlTGVuZ3RoID0gMFxuICAgIHRoaXMuZGltZW5zaW9uID0gMVxuICAgIHRoaXMuZHR5cGUgPSBHTF9VTlNJR05FRF9CWVRFJDNcblxuICAgIHRoaXMucGVyc2lzdGVudERhdGEgPSBudWxsXG5cbiAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgIHRoaXMuc3RhdHMgPSB7IHNpemU6IDAgfVxuICAgIH1cbiAgfVxuXG4gIFJFR0xCdWZmZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZ2wuYmluZEJ1ZmZlcih0aGlzLnR5cGUsIHRoaXMuYnVmZmVyKVxuICB9XG5cbiAgUkVHTEJ1ZmZlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICBkZXN0cm95KHRoaXMpXG4gIH1cblxuICB2YXIgc3RyZWFtUG9vbCA9IFtdXG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyZWFtICh0eXBlLCBkYXRhKSB7XG4gICAgdmFyIGJ1ZmZlciA9IHN0cmVhbVBvb2wucG9wKClcbiAgICBpZiAoIWJ1ZmZlcikge1xuICAgICAgYnVmZmVyID0gbmV3IFJFR0xCdWZmZXIodHlwZSlcbiAgICB9XG4gICAgYnVmZmVyLmJpbmQoKVxuICAgIGluaXRCdWZmZXJGcm9tRGF0YShidWZmZXIsIGRhdGEsIEdMX1NUUkVBTV9EUkFXLCAwLCAxLCBmYWxzZSlcbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95U3RyZWFtIChzdHJlYW0kJDEpIHtcbiAgICBzdHJlYW1Qb29sLnB1c2goc3RyZWFtJCQxKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdEJ1ZmZlckZyb21UeXBlZEFycmF5IChidWZmZXIsIGRhdGEsIHVzYWdlKSB7XG4gICAgYnVmZmVyLmJ5dGVMZW5ndGggPSBkYXRhLmJ5dGVMZW5ndGhcbiAgICBnbC5idWZmZXJEYXRhKGJ1ZmZlci50eXBlLCBkYXRhLCB1c2FnZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRCdWZmZXJGcm9tRGF0YSAoYnVmZmVyLCBkYXRhLCB1c2FnZSwgZHR5cGUsIGRpbWVuc2lvbiwgcGVyc2lzdCkge1xuICAgIHZhciBzaGFwZVxuICAgIGJ1ZmZlci51c2FnZSA9IHVzYWdlXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGJ1ZmZlci5kdHlwZSA9IGR0eXBlIHx8IEdMX0ZMT0FUJDNcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGZsYXREYXRhXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFbMF0pKSB7XG4gICAgICAgICAgc2hhcGUgPSBhcnJheVNoYXBlKGRhdGEpXG4gICAgICAgICAgdmFyIGRpbSA9IDFcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBkaW0gKj0gc2hhcGVbaV1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyLmRpbWVuc2lvbiA9IGRpbVxuICAgICAgICAgIGZsYXREYXRhID0gYXJyYXlGbGF0dGVuKGRhdGEsIHNoYXBlLCBidWZmZXIuZHR5cGUpXG4gICAgICAgICAgaW5pdEJ1ZmZlckZyb21UeXBlZEFycmF5KGJ1ZmZlciwgZmxhdERhdGEsIHVzYWdlKVxuICAgICAgICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICAgICAgICBidWZmZXIucGVyc2lzdGVudERhdGEgPSBmbGF0RGF0YVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb29sLmZyZWVUeXBlKGZsYXREYXRhKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBidWZmZXIuZGltZW5zaW9uID0gZGltZW5zaW9uXG4gICAgICAgICAgdmFyIHR5cGVkRGF0YSA9IHBvb2wuYWxsb2NUeXBlKGJ1ZmZlci5kdHlwZSwgZGF0YS5sZW5ndGgpXG4gICAgICAgICAgY29weUFycmF5KHR5cGVkRGF0YSwgZGF0YSlcbiAgICAgICAgICBpbml0QnVmZmVyRnJvbVR5cGVkQXJyYXkoYnVmZmVyLCB0eXBlZERhdGEsIHVzYWdlKVxuICAgICAgICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICAgICAgICBidWZmZXIucGVyc2lzdGVudERhdGEgPSB0eXBlZERhdGFcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9vbC5mcmVlVHlwZSh0eXBlZERhdGEpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzVHlwZWRBcnJheShkYXRhWzBdKSkge1xuICAgICAgICAgIGJ1ZmZlci5kaW1lbnNpb24gPSBkYXRhWzBdLmxlbmd0aFxuICAgICAgICAgIGJ1ZmZlci5kdHlwZSA9IGR0eXBlIHx8IHR5cGVkQXJyYXlDb2RlKGRhdGFbMF0pIHx8IEdMX0ZMT0FUJDNcbiAgICAgICAgICBmbGF0RGF0YSA9IGFycmF5RmxhdHRlbihcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBbZGF0YS5sZW5ndGgsIGRhdGFbMF0ubGVuZ3RoXSxcbiAgICAgICAgICAgIGJ1ZmZlci5kdHlwZSlcbiAgICAgICAgICBpbml0QnVmZmVyRnJvbVR5cGVkQXJyYXkoYnVmZmVyLCBmbGF0RGF0YSwgdXNhZ2UpXG4gICAgICAgICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgICAgICAgIGJ1ZmZlci5wZXJzaXN0ZW50RGF0YSA9IGZsYXREYXRhXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvb2wuZnJlZVR5cGUoZmxhdERhdGEpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoZWNrJDEucmFpc2UoJ2ludmFsaWQgYnVmZmVyIGRhdGEnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1R5cGVkQXJyYXkoZGF0YSkpIHtcbiAgICAgIGJ1ZmZlci5kdHlwZSA9IGR0eXBlIHx8IHR5cGVkQXJyYXlDb2RlKGRhdGEpXG4gICAgICBidWZmZXIuZGltZW5zaW9uID0gZGltZW5zaW9uXG4gICAgICBpbml0QnVmZmVyRnJvbVR5cGVkQXJyYXkoYnVmZmVyLCBkYXRhLCB1c2FnZSlcbiAgICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICAgIGJ1ZmZlci5wZXJzaXN0ZW50RGF0YSA9IG5ldyBVaW50OEFycmF5KG5ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyKSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTkRBcnJheUxpa2UoZGF0YSkpIHtcbiAgICAgIHNoYXBlID0gZGF0YS5zaGFwZVxuICAgICAgdmFyIHN0cmlkZSA9IGRhdGEuc3RyaWRlXG4gICAgICB2YXIgb2Zmc2V0ID0gZGF0YS5vZmZzZXRcblxuICAgICAgdmFyIHNoYXBlWCA9IDBcbiAgICAgIHZhciBzaGFwZVkgPSAwXG4gICAgICB2YXIgc3RyaWRlWCA9IDBcbiAgICAgIHZhciBzdHJpZGVZID0gMFxuICAgICAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBzaGFwZVggPSBzaGFwZVswXVxuICAgICAgICBzaGFwZVkgPSAxXG4gICAgICAgIHN0cmlkZVggPSBzdHJpZGVbMF1cbiAgICAgICAgc3RyaWRlWSA9IDBcbiAgICAgIH0gZWxzZSBpZiAoc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHNoYXBlWCA9IHNoYXBlWzBdXG4gICAgICAgIHNoYXBlWSA9IHNoYXBlWzFdXG4gICAgICAgIHN0cmlkZVggPSBzdHJpZGVbMF1cbiAgICAgICAgc3RyaWRlWSA9IHN0cmlkZVsxXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2skMS5yYWlzZSgnaW52YWxpZCBzaGFwZScpXG4gICAgICB9XG5cbiAgICAgIGJ1ZmZlci5kdHlwZSA9IGR0eXBlIHx8IHR5cGVkQXJyYXlDb2RlKGRhdGEuZGF0YSkgfHwgR0xfRkxPQVQkM1xuICAgICAgYnVmZmVyLmRpbWVuc2lvbiA9IHNoYXBlWVxuXG4gICAgICB2YXIgdHJhbnNwb3NlRGF0YSA9IHBvb2wuYWxsb2NUeXBlKGJ1ZmZlci5kdHlwZSwgc2hhcGVYICogc2hhcGVZKVxuICAgICAgdHJhbnNwb3NlKHRyYW5zcG9zZURhdGEsXG4gICAgICAgIGRhdGEuZGF0YSxcbiAgICAgICAgc2hhcGVYLCBzaGFwZVksXG4gICAgICAgIHN0cmlkZVgsIHN0cmlkZVksXG4gICAgICAgIG9mZnNldClcbiAgICAgIGluaXRCdWZmZXJGcm9tVHlwZWRBcnJheShidWZmZXIsIHRyYW5zcG9zZURhdGEsIHVzYWdlKVxuICAgICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgICAgYnVmZmVyLnBlcnNpc3RlbnREYXRhID0gdHJhbnNwb3NlRGF0YVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9vbC5mcmVlVHlwZSh0cmFuc3Bvc2VEYXRhKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICBidWZmZXIuZHR5cGUgPSBHTF9VTlNJR05FRF9CWVRFJDNcbiAgICAgIGJ1ZmZlci5kaW1lbnNpb24gPSBkaW1lbnNpb25cbiAgICAgIGluaXRCdWZmZXJGcm9tVHlwZWRBcnJheShidWZmZXIsIGRhdGEsIHVzYWdlKVxuICAgICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgICAgYnVmZmVyLnBlcnNpc3RlbnREYXRhID0gbmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQ4QXJyYXkoZGF0YSkpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrJDEucmFpc2UoJ2ludmFsaWQgYnVmZmVyIGRhdGEnKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3kgKGJ1ZmZlcikge1xuICAgIHN0YXRzLmJ1ZmZlckNvdW50LS1cblxuICAgIC8vIHJlbW92ZSBhdHRyaWJ1dGUgbGlua1xuICAgIGRlc3Ryb3lCdWZmZXIoYnVmZmVyKVxuXG4gICAgdmFyIGhhbmRsZSA9IGJ1ZmZlci5idWZmZXJcbiAgICBjaGVjayQxKGhhbmRsZSwgJ2J1ZmZlciBtdXN0IG5vdCBiZSBkZWxldGVkIGFscmVhZHknKVxuICAgIGdsLmRlbGV0ZUJ1ZmZlcihoYW5kbGUpXG4gICAgYnVmZmVyLmJ1ZmZlciA9IG51bGxcbiAgICBkZWxldGUgYnVmZmVyU2V0W2J1ZmZlci5pZF1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAob3B0aW9ucywgdHlwZSwgZGVmZXJJbml0LCBwZXJzaXN0ZW50KSB7XG4gICAgc3RhdHMuYnVmZmVyQ291bnQrK1xuXG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBSRUdMQnVmZmVyKHR5cGUpXG4gICAgYnVmZmVyU2V0W2J1ZmZlci5pZF0gPSBidWZmZXJcblxuICAgIGZ1bmN0aW9uIHJlZ2xCdWZmZXIgKG9wdGlvbnMpIHtcbiAgICAgIHZhciB1c2FnZSA9IEdMX1NUQVRJQ19EUkFXXG4gICAgICB2YXIgZGF0YSA9IG51bGxcbiAgICAgIHZhciBieXRlTGVuZ3RoID0gMFxuICAgICAgdmFyIGR0eXBlID0gMFxuICAgICAgdmFyIGRpbWVuc2lvbiA9IDFcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpIHx8XG4gICAgICAgICAgaXNUeXBlZEFycmF5KG9wdGlvbnMpIHx8XG4gICAgICAgICAgaXNOREFycmF5TGlrZShvcHRpb25zKSB8fFxuICAgICAgICAgIG9wdGlvbnMgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICBkYXRhID0gb3B0aW9uc1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgYnl0ZUxlbmd0aCA9IG9wdGlvbnMgfCAwXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgY2hlY2skMS50eXBlKFxuICAgICAgICAgIG9wdGlvbnMsICdvYmplY3QnLFxuICAgICAgICAgICdidWZmZXIgYXJndW1lbnRzIG11c3QgYmUgYW4gb2JqZWN0LCBhIG51bWJlciBvciBhbiBhcnJheScpXG5cbiAgICAgICAgaWYgKCdkYXRhJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgY2hlY2skMShcbiAgICAgICAgICAgIGRhdGEgPT09IG51bGwgfHxcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgfHxcbiAgICAgICAgICAgIGlzVHlwZWRBcnJheShkYXRhKSB8fFxuICAgICAgICAgICAgaXNOREFycmF5TGlrZShkYXRhKSxcbiAgICAgICAgICAgICdpbnZhbGlkIGRhdGEgZm9yIGJ1ZmZlcicpXG4gICAgICAgICAgZGF0YSA9IG9wdGlvbnMuZGF0YVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCd1c2FnZScgaW4gb3B0aW9ucykge1xuICAgICAgICAgIGNoZWNrJDEucGFyYW1ldGVyKG9wdGlvbnMudXNhZ2UsIHVzYWdlVHlwZXMsICdpbnZhbGlkIGJ1ZmZlciB1c2FnZScpXG4gICAgICAgICAgdXNhZ2UgPSB1c2FnZVR5cGVzW29wdGlvbnMudXNhZ2VdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ3R5cGUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBjaGVjayQxLnBhcmFtZXRlcihvcHRpb25zLnR5cGUsIGdsVHlwZXMsICdpbnZhbGlkIGJ1ZmZlciB0eXBlJylcbiAgICAgICAgICBkdHlwZSA9IGdsVHlwZXNbb3B0aW9ucy50eXBlXVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdkaW1lbnNpb24nIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBjaGVjayQxLnR5cGUob3B0aW9ucy5kaW1lbnNpb24sICdudW1iZXInLCAnaW52YWxpZCBkaW1lbnNpb24nKVxuICAgICAgICAgIGRpbWVuc2lvbiA9IG9wdGlvbnMuZGltZW5zaW9uIHwgMFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdsZW5ndGgnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBjaGVjayQxLm5uaShieXRlTGVuZ3RoLCAnYnVmZmVyIGxlbmd0aCBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlcicpXG4gICAgICAgICAgYnl0ZUxlbmd0aCA9IG9wdGlvbnMubGVuZ3RoIHwgMFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJ1ZmZlci5iaW5kKClcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAvLyAjNDc1XG4gICAgICAgIGlmIChieXRlTGVuZ3RoKSBnbC5idWZmZXJEYXRhKGJ1ZmZlci50eXBlLCBieXRlTGVuZ3RoLCB1c2FnZSlcbiAgICAgICAgYnVmZmVyLmR0eXBlID0gZHR5cGUgfHwgR0xfVU5TSUdORURfQllURSQzXG4gICAgICAgIGJ1ZmZlci51c2FnZSA9IHVzYWdlXG4gICAgICAgIGJ1ZmZlci5kaW1lbnNpb24gPSBkaW1lbnNpb25cbiAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbml0QnVmZmVyRnJvbURhdGEoYnVmZmVyLCBkYXRhLCB1c2FnZSwgZHR5cGUsIGRpbWVuc2lvbiwgcGVyc2lzdGVudClcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICAgIGJ1ZmZlci5zdGF0cy5zaXplID0gYnVmZmVyLmJ5dGVMZW5ndGggKiBEVFlQRVNfU0laRVNbYnVmZmVyLmR0eXBlXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVnbEJ1ZmZlclxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFN1YkRhdGEgKGRhdGEsIG9mZnNldCkge1xuICAgICAgY2hlY2skMShvZmZzZXQgKyBkYXRhLmJ5dGVMZW5ndGggPD0gYnVmZmVyLmJ5dGVMZW5ndGgsXG4gICAgICAgICdpbnZhbGlkIGJ1ZmZlciBzdWJkYXRhIGNhbGwsIGJ1ZmZlciBpcyB0b28gc21hbGwuICcgKyAnIENhblxcJ3Qgd3JpdGUgZGF0YSBvZiBzaXplICcgKyBkYXRhLmJ5dGVMZW5ndGggKyAnIHN0YXJ0aW5nIGZyb20gb2Zmc2V0ICcgKyBvZmZzZXQgKyAnIHRvIGEgYnVmZmVyIG9mIHNpemUgJyArIGJ1ZmZlci5ieXRlTGVuZ3RoKVxuXG4gICAgICBnbC5idWZmZXJTdWJEYXRhKGJ1ZmZlci50eXBlLCBvZmZzZXQsIGRhdGEpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ViZGF0YSAoZGF0YSwgb2Zmc2V0Xykge1xuICAgICAgdmFyIG9mZnNldCA9IChvZmZzZXRfIHx8IDApIHwgMFxuICAgICAgdmFyIHNoYXBlXG4gICAgICBidWZmZXIuYmluZCgpXG4gICAgICBpZiAoaXNUeXBlZEFycmF5KGRhdGEpIHx8IGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICBzZXRTdWJEYXRhKGRhdGEsIG9mZnNldClcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IHBvb2wuYWxsb2NUeXBlKGJ1ZmZlci5kdHlwZSwgZGF0YS5sZW5ndGgpXG4gICAgICAgICAgICBjb3B5QXJyYXkoY29udmVydGVkLCBkYXRhKVxuICAgICAgICAgICAgc2V0U3ViRGF0YShjb252ZXJ0ZWQsIG9mZnNldClcbiAgICAgICAgICAgIHBvb2wuZnJlZVR5cGUoY29udmVydGVkKVxuICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhWzBdKSB8fCBpc1R5cGVkQXJyYXkoZGF0YVswXSkpIHtcbiAgICAgICAgICAgIHNoYXBlID0gYXJyYXlTaGFwZShkYXRhKVxuICAgICAgICAgICAgdmFyIGZsYXREYXRhID0gYXJyYXlGbGF0dGVuKGRhdGEsIHNoYXBlLCBidWZmZXIuZHR5cGUpXG4gICAgICAgICAgICBzZXRTdWJEYXRhKGZsYXREYXRhLCBvZmZzZXQpXG4gICAgICAgICAgICBwb29sLmZyZWVUeXBlKGZsYXREYXRhKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGVjayQxLnJhaXNlKCdpbnZhbGlkIGJ1ZmZlciBkYXRhJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNOREFycmF5TGlrZShkYXRhKSkge1xuICAgICAgICBzaGFwZSA9IGRhdGEuc2hhcGVcbiAgICAgICAgdmFyIHN0cmlkZSA9IGRhdGEuc3RyaWRlXG5cbiAgICAgICAgdmFyIHNoYXBlWCA9IDBcbiAgICAgICAgdmFyIHNoYXBlWSA9IDBcbiAgICAgICAgdmFyIHN0cmlkZVggPSAwXG4gICAgICAgIHZhciBzdHJpZGVZID0gMFxuICAgICAgICBpZiAoc2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgc2hhcGVYID0gc2hhcGVbMF1cbiAgICAgICAgICBzaGFwZVkgPSAxXG4gICAgICAgICAgc3RyaWRlWCA9IHN0cmlkZVswXVxuICAgICAgICAgIHN0cmlkZVkgPSAwXG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgc2hhcGVYID0gc2hhcGVbMF1cbiAgICAgICAgICBzaGFwZVkgPSBzaGFwZVsxXVxuICAgICAgICAgIHN0cmlkZVggPSBzdHJpZGVbMF1cbiAgICAgICAgICBzdHJpZGVZID0gc3RyaWRlWzFdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hlY2skMS5yYWlzZSgnaW52YWxpZCBzaGFwZScpXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGR0eXBlID0gQXJyYXkuaXNBcnJheShkYXRhLmRhdGEpXG4gICAgICAgICAgPyBidWZmZXIuZHR5cGVcbiAgICAgICAgICA6IHR5cGVkQXJyYXlDb2RlKGRhdGEuZGF0YSlcblxuICAgICAgICB2YXIgdHJhbnNwb3NlRGF0YSA9IHBvb2wuYWxsb2NUeXBlKGR0eXBlLCBzaGFwZVggKiBzaGFwZVkpXG4gICAgICAgIHRyYW5zcG9zZSh0cmFuc3Bvc2VEYXRhLFxuICAgICAgICAgIGRhdGEuZGF0YSxcbiAgICAgICAgICBzaGFwZVgsIHNoYXBlWSxcbiAgICAgICAgICBzdHJpZGVYLCBzdHJpZGVZLFxuICAgICAgICAgIGRhdGEub2Zmc2V0KVxuICAgICAgICBzZXRTdWJEYXRhKHRyYW5zcG9zZURhdGEsIG9mZnNldClcbiAgICAgICAgcG9vbC5mcmVlVHlwZSh0cmFuc3Bvc2VEYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2skMS5yYWlzZSgnaW52YWxpZCBkYXRhIGZvciBidWZmZXIgc3ViZGF0YScpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVnbEJ1ZmZlclxuICAgIH1cblxuICAgIGlmICghZGVmZXJJbml0KSB7XG4gICAgICByZWdsQnVmZmVyKG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmVnbEJ1ZmZlci5fcmVnbFR5cGUgPSAnYnVmZmVyJ1xuICAgIHJlZ2xCdWZmZXIuX2J1ZmZlciA9IGJ1ZmZlclxuICAgIHJlZ2xCdWZmZXIuc3ViZGF0YSA9IHN1YmRhdGFcbiAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgIHJlZ2xCdWZmZXIuc3RhdHMgPSBidWZmZXIuc3RhdHNcbiAgICB9XG4gICAgcmVnbEJ1ZmZlci5kZXN0cm95ID0gZnVuY3Rpb24gKCkgeyBkZXN0cm95KGJ1ZmZlcikgfVxuXG4gICAgcmV0dXJuIHJlZ2xCdWZmZXJcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RvcmVCdWZmZXJzICgpIHtcbiAgICB2YWx1ZXMoYnVmZmVyU2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAgIGJ1ZmZlci5idWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKVxuICAgICAgZ2wuYmluZEJ1ZmZlcihidWZmZXIudHlwZSwgYnVmZmVyLmJ1ZmZlcilcbiAgICAgIGdsLmJ1ZmZlckRhdGEoXG4gICAgICAgIGJ1ZmZlci50eXBlLCBidWZmZXIucGVyc2lzdGVudERhdGEgfHwgYnVmZmVyLmJ5dGVMZW5ndGgsIGJ1ZmZlci51c2FnZSlcbiAgICB9KVxuICB9XG5cbiAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgc3RhdHMuZ2V0VG90YWxCdWZmZXJTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRvdGFsID0gMFxuICAgICAgLy8gVE9ETzogUmlnaHQgbm93LCB0aGUgc3RyZWFtcyBhcmUgbm90IHBhcnQgb2YgdGhlIHRvdGFsIGNvdW50LlxuICAgICAgT2JqZWN0LmtleXMoYnVmZmVyU2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdG90YWwgKz0gYnVmZmVyU2V0W2tleV0uc3RhdHMuc2l6ZVxuICAgICAgfSlcbiAgICAgIHJldHVybiB0b3RhbFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3JlYXRlOiBjcmVhdGVCdWZmZXIsXG5cbiAgICBjcmVhdGVTdHJlYW06IGNyZWF0ZVN0cmVhbSxcbiAgICBkZXN0cm95U3RyZWFtOiBkZXN0cm95U3RyZWFtLFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhbHVlcyhidWZmZXJTZXQpLmZvckVhY2goZGVzdHJveSlcbiAgICAgIHN0cmVhbVBvb2wuZm9yRWFjaChkZXN0cm95KVxuICAgIH0sXG5cbiAgICBnZXRCdWZmZXI6IGZ1bmN0aW9uICh3cmFwcGVyKSB7XG4gICAgICBpZiAod3JhcHBlciAmJiB3cmFwcGVyLl9idWZmZXIgaW5zdGFuY2VvZiBSRUdMQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLl9idWZmZXJcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIHJlc3RvcmU6IHJlc3RvcmVCdWZmZXJzLFxuXG4gICAgX2luaXRCdWZmZXI6IGluaXRCdWZmZXJGcm9tRGF0YVxuICB9XG59XG5cbnZhciBwb2ludHMgPSAwO1xudmFyIHBvaW50ID0gMDtcbnZhciBsaW5lcyA9IDE7XG52YXIgbGluZSA9IDE7XG52YXIgdHJpYW5nbGVzID0gNDtcbnZhciB0cmlhbmdsZSA9IDQ7XG52YXIgcHJpbVR5cGVzID0ge1xuXHRwb2ludHM6IHBvaW50cyxcblx0cG9pbnQ6IHBvaW50LFxuXHRsaW5lczogbGluZXMsXG5cdGxpbmU6IGxpbmUsXG5cdHRyaWFuZ2xlczogdHJpYW5nbGVzLFxuXHR0cmlhbmdsZTogdHJpYW5nbGUsXG5cdFwibGluZSBsb29wXCI6IDIsXG5cdFwibGluZSBzdHJpcFwiOiAzLFxuXHRcInRyaWFuZ2xlIHN0cmlwXCI6IDUsXG5cdFwidHJpYW5nbGUgZmFuXCI6IDZcbn07XG5cbnZhciBHTF9QT0lOVFMgPSAwXG52YXIgR0xfTElORVMgPSAxXG52YXIgR0xfVFJJQU5HTEVTID0gNFxuXG52YXIgR0xfQllURSQyID0gNTEyMFxudmFyIEdMX1VOU0lHTkVEX0JZVEUkNCA9IDUxMjFcbnZhciBHTF9TSE9SVCQyID0gNTEyMlxudmFyIEdMX1VOU0lHTkVEX1NIT1JUJDIgPSA1MTIzXG52YXIgR0xfSU5UJDIgPSA1MTI0XG52YXIgR0xfVU5TSUdORURfSU5UJDIgPSA1MTI1XG5cbnZhciBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiA9IDM0OTYzXG5cbnZhciBHTF9TVFJFQU1fRFJBVyQxID0gMHg4OEUwXG52YXIgR0xfU1RBVElDX0RSQVckMSA9IDB4ODhFNFxuXG5mdW5jdGlvbiB3cmFwRWxlbWVudHNTdGF0ZSAoZ2wsIGV4dGVuc2lvbnMsIGJ1ZmZlclN0YXRlLCBzdGF0cykge1xuICB2YXIgZWxlbWVudFNldCA9IHt9XG4gIHZhciBlbGVtZW50Q291bnQgPSAwXG5cbiAgdmFyIGVsZW1lbnRUeXBlcyA9IHtcbiAgICAndWludDgnOiBHTF9VTlNJR05FRF9CWVRFJDQsXG4gICAgJ3VpbnQxNic6IEdMX1VOU0lHTkVEX1NIT1JUJDJcbiAgfVxuXG4gIGlmIChleHRlbnNpb25zLm9lc19lbGVtZW50X2luZGV4X3VpbnQpIHtcbiAgICBlbGVtZW50VHlwZXMudWludDMyID0gR0xfVU5TSUdORURfSU5UJDJcbiAgfVxuXG4gIGZ1bmN0aW9uIFJFR0xFbGVtZW50QnVmZmVyIChidWZmZXIpIHtcbiAgICB0aGlzLmlkID0gZWxlbWVudENvdW50KytcbiAgICBlbGVtZW50U2V0W3RoaXMuaWRdID0gdGhpc1xuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyXG4gICAgdGhpcy5wcmltVHlwZSA9IEdMX1RSSUFOR0xFU1xuICAgIHRoaXMudmVydENvdW50ID0gMFxuICAgIHRoaXMudHlwZSA9IDBcbiAgfVxuXG4gIFJFR0xFbGVtZW50QnVmZmVyLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYnVmZmVyLmJpbmQoKVxuICB9XG5cbiAgdmFyIGJ1ZmZlclBvb2wgPSBbXVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRTdHJlYW0gKGRhdGEpIHtcbiAgICB2YXIgcmVzdWx0ID0gYnVmZmVyUG9vbC5wb3AoKVxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXN1bHQgPSBuZXcgUkVHTEVsZW1lbnRCdWZmZXIoYnVmZmVyU3RhdGUuY3JlYXRlKFxuICAgICAgICBudWxsLFxuICAgICAgICBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUixcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgZmFsc2UpLl9idWZmZXIpXG4gICAgfVxuICAgIGluaXRFbGVtZW50cyhyZXN1bHQsIGRhdGEsIEdMX1NUUkVBTV9EUkFXJDEsIC0xLCAtMSwgMCwgMClcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95RWxlbWVudFN0cmVhbSAoZWxlbWVudHMpIHtcbiAgICBidWZmZXJQb29sLnB1c2goZWxlbWVudHMpXG4gIH1cblxuICBmdW5jdGlvbiBpbml0RWxlbWVudHMgKFxuICAgIGVsZW1lbnRzLFxuICAgIGRhdGEsXG4gICAgdXNhZ2UsXG4gICAgcHJpbSxcbiAgICBjb3VudCxcbiAgICBieXRlTGVuZ3RoLFxuICAgIHR5cGUpIHtcbiAgICBlbGVtZW50cy5idWZmZXIuYmluZCgpXG4gICAgdmFyIGR0eXBlXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHZhciBwcmVkaWN0ZWRUeXBlID0gdHlwZVxuICAgICAgaWYgKCF0eXBlICYmIChcbiAgICAgICAgIWlzVHlwZWRBcnJheShkYXRhKSB8fFxuICAgICAgICAgKGlzTkRBcnJheUxpa2UoZGF0YSkgJiYgIWlzVHlwZWRBcnJheShkYXRhLmRhdGEpKSkpIHtcbiAgICAgICAgcHJlZGljdGVkVHlwZSA9IGV4dGVuc2lvbnMub2VzX2VsZW1lbnRfaW5kZXhfdWludFxuICAgICAgICAgID8gR0xfVU5TSUdORURfSU5UJDJcbiAgICAgICAgICA6IEdMX1VOU0lHTkVEX1NIT1JUJDJcbiAgICAgIH1cbiAgICAgIGJ1ZmZlclN0YXRlLl9pbml0QnVmZmVyKFxuICAgICAgICBlbGVtZW50cy5idWZmZXIsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHVzYWdlLFxuICAgICAgICBwcmVkaWN0ZWRUeXBlLFxuICAgICAgICAzKVxuICAgIH0gZWxzZSB7XG4gICAgICBnbC5idWZmZXJEYXRhKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBieXRlTGVuZ3RoLCB1c2FnZSlcbiAgICAgIGVsZW1lbnRzLmJ1ZmZlci5kdHlwZSA9IGR0eXBlIHx8IEdMX1VOU0lHTkVEX0JZVEUkNFxuICAgICAgZWxlbWVudHMuYnVmZmVyLnVzYWdlID0gdXNhZ2VcbiAgICAgIGVsZW1lbnRzLmJ1ZmZlci5kaW1lbnNpb24gPSAzXG4gICAgICBlbGVtZW50cy5idWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbiAgICB9XG5cbiAgICBkdHlwZSA9IHR5cGVcbiAgICBpZiAoIXR5cGUpIHtcbiAgICAgIHN3aXRjaCAoZWxlbWVudHMuYnVmZmVyLmR0eXBlKSB7XG4gICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURSQ0OlxuICAgICAgICBjYXNlIEdMX0JZVEUkMjpcbiAgICAgICAgICBkdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEUkNFxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVCQyOlxuICAgICAgICBjYXNlIEdMX1NIT1JUJDI6XG4gICAgICAgICAgZHR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVCQyXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVCQyOlxuICAgICAgICBjYXNlIEdMX0lOVCQyOlxuICAgICAgICAgIGR0eXBlID0gR0xfVU5TSUdORURfSU5UJDJcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2hlY2skMS5yYWlzZSgndW5zdXBwb3J0ZWQgdHlwZSBmb3IgZWxlbWVudCBhcnJheScpXG4gICAgICB9XG4gICAgICBlbGVtZW50cy5idWZmZXIuZHR5cGUgPSBkdHlwZVxuICAgIH1cbiAgICBlbGVtZW50cy50eXBlID0gZHR5cGVcblxuICAgIC8vIENoZWNrIG9lc19lbGVtZW50X2luZGV4X3VpbnQgZXh0ZW5zaW9uXG4gICAgY2hlY2skMShcbiAgICAgIGR0eXBlICE9PSBHTF9VTlNJR05FRF9JTlQkMiB8fFxuICAgICAgISFleHRlbnNpb25zLm9lc19lbGVtZW50X2luZGV4X3VpbnQsXG4gICAgICAnMzIgYml0IGVsZW1lbnQgYnVmZmVycyBub3Qgc3VwcG9ydGVkLCBlbmFibGUgb2VzX2VsZW1lbnRfaW5kZXhfdWludCBmaXJzdCcpXG5cbiAgICAvLyB0cnkgdG8gZ3Vlc3MgZGVmYXVsdCBwcmltaXRpdmUgdHlwZSBhbmQgYXJndW1lbnRzXG4gICAgdmFyIHZlcnRDb3VudCA9IGNvdW50XG4gICAgaWYgKHZlcnRDb3VudCA8IDApIHtcbiAgICAgIHZlcnRDb3VudCA9IGVsZW1lbnRzLmJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICBpZiAoZHR5cGUgPT09IEdMX1VOU0lHTkVEX1NIT1JUJDIpIHtcbiAgICAgICAgdmVydENvdW50ID4+PSAxXG4gICAgICB9IGVsc2UgaWYgKGR0eXBlID09PSBHTF9VTlNJR05FRF9JTlQkMikge1xuICAgICAgICB2ZXJ0Q291bnQgPj49IDJcbiAgICAgIH1cbiAgICB9XG4gICAgZWxlbWVudHMudmVydENvdW50ID0gdmVydENvdW50XG5cbiAgICAvLyB0cnkgdG8gZ3Vlc3MgcHJpbWl0aXZlIHR5cGUgZnJvbSBjZWxsIGRpbWVuc2lvblxuICAgIHZhciBwcmltVHlwZSA9IHByaW1cbiAgICBpZiAocHJpbSA8IDApIHtcbiAgICAgIHByaW1UeXBlID0gR0xfVFJJQU5HTEVTXG4gICAgICB2YXIgZGltZW5zaW9uID0gZWxlbWVudHMuYnVmZmVyLmRpbWVuc2lvblxuICAgICAgaWYgKGRpbWVuc2lvbiA9PT0gMSkgcHJpbVR5cGUgPSBHTF9QT0lOVFNcbiAgICAgIGlmIChkaW1lbnNpb24gPT09IDIpIHByaW1UeXBlID0gR0xfTElORVNcbiAgICAgIGlmIChkaW1lbnNpb24gPT09IDMpIHByaW1UeXBlID0gR0xfVFJJQU5HTEVTXG4gICAgfVxuICAgIGVsZW1lbnRzLnByaW1UeXBlID0gcHJpbVR5cGVcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3lFbGVtZW50cyAoZWxlbWVudHMpIHtcbiAgICBzdGF0cy5lbGVtZW50c0NvdW50LS1cblxuICAgIGNoZWNrJDEoZWxlbWVudHMuYnVmZmVyICE9PSBudWxsLCAnbXVzdCBub3QgZG91YmxlIGRlc3Ryb3kgZWxlbWVudHMnKVxuICAgIGRlbGV0ZSBlbGVtZW50U2V0W2VsZW1lbnRzLmlkXVxuICAgIGVsZW1lbnRzLmJ1ZmZlci5kZXN0cm95KClcbiAgICBlbGVtZW50cy5idWZmZXIgPSBudWxsXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50cyAob3B0aW9ucywgcGVyc2lzdGVudCkge1xuICAgIHZhciBidWZmZXIgPSBidWZmZXJTdGF0ZS5jcmVhdGUobnVsbCwgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRydWUpXG4gICAgdmFyIGVsZW1lbnRzID0gbmV3IFJFR0xFbGVtZW50QnVmZmVyKGJ1ZmZlci5fYnVmZmVyKVxuICAgIHN0YXRzLmVsZW1lbnRzQ291bnQrK1xuXG4gICAgZnVuY3Rpb24gcmVnbEVsZW1lbnRzIChvcHRpb25zKSB7XG4gICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgYnVmZmVyKClcbiAgICAgICAgZWxlbWVudHMucHJpbVR5cGUgPSBHTF9UUklBTkdMRVNcbiAgICAgICAgZWxlbWVudHMudmVydENvdW50ID0gMFxuICAgICAgICBlbGVtZW50cy50eXBlID0gR0xfVU5TSUdORURfQllURSQ0XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykge1xuICAgICAgICBidWZmZXIob3B0aW9ucylcbiAgICAgICAgZWxlbWVudHMucHJpbVR5cGUgPSBHTF9UUklBTkdMRVNcbiAgICAgICAgZWxlbWVudHMudmVydENvdW50ID0gb3B0aW9ucyB8IDBcbiAgICAgICAgZWxlbWVudHMudHlwZSA9IEdMX1VOU0lHTkVEX0JZVEUkNFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGRhdGEgPSBudWxsXG4gICAgICAgIHZhciB1c2FnZSA9IEdMX1NUQVRJQ19EUkFXJDFcbiAgICAgICAgdmFyIHByaW1UeXBlID0gLTFcbiAgICAgICAgdmFyIHZlcnRDb3VudCA9IC0xXG4gICAgICAgIHZhciBieXRlTGVuZ3RoID0gMFxuICAgICAgICB2YXIgZHR5cGUgPSAwXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpIHx8XG4gICAgICAgICAgICBpc1R5cGVkQXJyYXkob3B0aW9ucykgfHxcbiAgICAgICAgICAgIGlzTkRBcnJheUxpa2Uob3B0aW9ucykpIHtcbiAgICAgICAgICBkYXRhID0gb3B0aW9uc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoZWNrJDEudHlwZShvcHRpb25zLCAnb2JqZWN0JywgJ2ludmFsaWQgYXJndW1lbnRzIGZvciBlbGVtZW50cycpXG4gICAgICAgICAgaWYgKCdkYXRhJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBkYXRhID0gb3B0aW9ucy5kYXRhXG4gICAgICAgICAgICBjaGVjayQxKFxuICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGRhdGEpIHx8XG4gICAgICAgICAgICAgICAgaXNUeXBlZEFycmF5KGRhdGEpIHx8XG4gICAgICAgICAgICAgICAgaXNOREFycmF5TGlrZShkYXRhKSxcbiAgICAgICAgICAgICAgJ2ludmFsaWQgZGF0YSBmb3IgZWxlbWVudCBidWZmZXInKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ3VzYWdlJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjaGVjayQxLnBhcmFtZXRlcihcbiAgICAgICAgICAgICAgb3B0aW9ucy51c2FnZSxcbiAgICAgICAgICAgICAgdXNhZ2VUeXBlcyxcbiAgICAgICAgICAgICAgJ2ludmFsaWQgZWxlbWVudCBidWZmZXIgdXNhZ2UnKVxuICAgICAgICAgICAgdXNhZ2UgPSB1c2FnZVR5cGVzW29wdGlvbnMudXNhZ2VdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgncHJpbWl0aXZlJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjaGVjayQxLnBhcmFtZXRlcihcbiAgICAgICAgICAgICAgb3B0aW9ucy5wcmltaXRpdmUsXG4gICAgICAgICAgICAgIHByaW1UeXBlcyxcbiAgICAgICAgICAgICAgJ2ludmFsaWQgZWxlbWVudCBidWZmZXIgcHJpbWl0aXZlJylcbiAgICAgICAgICAgIHByaW1UeXBlID0gcHJpbVR5cGVzW29wdGlvbnMucHJpbWl0aXZlXVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ2NvdW50JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjaGVjayQxKFxuICAgICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5jb3VudCA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5jb3VudCA+PSAwLFxuICAgICAgICAgICAgICAnaW52YWxpZCB2ZXJ0ZXggY291bnQgZm9yIGVsZW1lbnRzJylcbiAgICAgICAgICAgIHZlcnRDb3VudCA9IG9wdGlvbnMuY291bnQgfCAwXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgndHlwZScgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgY2hlY2skMS5wYXJhbWV0ZXIoXG4gICAgICAgICAgICAgIG9wdGlvbnMudHlwZSxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGVzLFxuICAgICAgICAgICAgICAnaW52YWxpZCBidWZmZXIgdHlwZScpXG4gICAgICAgICAgICBkdHlwZSA9IGVsZW1lbnRUeXBlc1tvcHRpb25zLnR5cGVdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnbGVuZ3RoJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gb3B0aW9ucy5sZW5ndGggfCAwXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSB2ZXJ0Q291bnRcbiAgICAgICAgICAgIGlmIChkdHlwZSA9PT0gR0xfVU5TSUdORURfU0hPUlQkMiB8fCBkdHlwZSA9PT0gR0xfU0hPUlQkMikge1xuICAgICAgICAgICAgICBieXRlTGVuZ3RoICo9IDJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZHR5cGUgPT09IEdMX1VOU0lHTkVEX0lOVCQyIHx8IGR0eXBlID09PSBHTF9JTlQkMikge1xuICAgICAgICAgICAgICBieXRlTGVuZ3RoICo9IDRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5pdEVsZW1lbnRzKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgcHJpbVR5cGUsXG4gICAgICAgICAgdmVydENvdW50LFxuICAgICAgICAgIGJ5dGVMZW5ndGgsXG4gICAgICAgICAgZHR5cGUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWdsRWxlbWVudHNcbiAgICB9XG5cbiAgICByZWdsRWxlbWVudHMob3B0aW9ucylcblxuICAgIHJlZ2xFbGVtZW50cy5fcmVnbFR5cGUgPSAnZWxlbWVudHMnXG4gICAgcmVnbEVsZW1lbnRzLl9lbGVtZW50cyA9IGVsZW1lbnRzXG4gICAgcmVnbEVsZW1lbnRzLnN1YmRhdGEgPSBmdW5jdGlvbiAoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICBidWZmZXIuc3ViZGF0YShkYXRhLCBvZmZzZXQpXG4gICAgICByZXR1cm4gcmVnbEVsZW1lbnRzXG4gICAgfVxuICAgIHJlZ2xFbGVtZW50cy5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZGVzdHJveUVsZW1lbnRzKGVsZW1lbnRzKVxuICAgIH1cblxuICAgIHJldHVybiByZWdsRWxlbWVudHNcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3JlYXRlOiBjcmVhdGVFbGVtZW50cyxcbiAgICBjcmVhdGVTdHJlYW06IGNyZWF0ZUVsZW1lbnRTdHJlYW0sXG4gICAgZGVzdHJveVN0cmVhbTogZGVzdHJveUVsZW1lbnRTdHJlYW0sXG4gICAgZ2V0RWxlbWVudHM6IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50cyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgIGVsZW1lbnRzLl9lbGVtZW50cyBpbnN0YW5jZW9mIFJFR0xFbGVtZW50QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5fZWxlbWVudHNcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFsdWVzKGVsZW1lbnRTZXQpLmZvckVhY2goZGVzdHJveUVsZW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG52YXIgRkxPQVQgPSBuZXcgRmxvYXQzMkFycmF5KDEpXG52YXIgSU5UID0gbmV3IFVpbnQzMkFycmF5KEZMT0FULmJ1ZmZlcilcblxudmFyIEdMX1VOU0lHTkVEX1NIT1JUJDQgPSA1MTIzXG5cbmZ1bmN0aW9uIGNvbnZlcnRUb0hhbGZGbG9hdCAoYXJyYXkpIHtcbiAgdmFyIHVzaG9ydHMgPSBwb29sLmFsbG9jVHlwZShHTF9VTlNJR05FRF9TSE9SVCQ0LCBhcnJheS5sZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkge1xuICAgIGlmIChpc05hTihhcnJheVtpXSkpIHtcbiAgICAgIHVzaG9ydHNbaV0gPSAweGZmZmZcbiAgICB9IGVsc2UgaWYgKGFycmF5W2ldID09PSBJbmZpbml0eSkge1xuICAgICAgdXNob3J0c1tpXSA9IDB4N2MwMFxuICAgIH0gZWxzZSBpZiAoYXJyYXlbaV0gPT09IC1JbmZpbml0eSkge1xuICAgICAgdXNob3J0c1tpXSA9IDB4ZmMwMFxuICAgIH0gZWxzZSB7XG4gICAgICBGTE9BVFswXSA9IGFycmF5W2ldXG4gICAgICB2YXIgeCA9IElOVFswXVxuXG4gICAgICB2YXIgc2duID0gKHggPj4+IDMxKSA8PCAxNVxuICAgICAgdmFyIGV4cCA9ICgoeCA8PCAxKSA+Pj4gMjQpIC0gMTI3XG4gICAgICB2YXIgZnJhYyA9ICh4ID4+IDEzKSAmICgoMSA8PCAxMCkgLSAxKVxuXG4gICAgICBpZiAoZXhwIDwgLTI0KSB7XG4gICAgICAgIC8vIHJvdW5kIG5vbi1yZXByZXNlbnRhYmxlIGRlbm9ybWFscyB0byAwXG4gICAgICAgIHVzaG9ydHNbaV0gPSBzZ25cbiAgICAgIH0gZWxzZSBpZiAoZXhwIDwgLTE0KSB7XG4gICAgICAgIC8vIGhhbmRsZSBkZW5vcm1hbHNcbiAgICAgICAgdmFyIHMgPSAtMTQgLSBleHBcbiAgICAgICAgdXNob3J0c1tpXSA9IHNnbiArICgoZnJhYyArICgxIDw8IDEwKSkgPj4gcylcbiAgICAgIH0gZWxzZSBpZiAoZXhwID4gMTUpIHtcbiAgICAgICAgLy8gcm91bmQgb3ZlcmZsb3cgdG8gKy8tIEluZmluaXR5XG4gICAgICAgIHVzaG9ydHNbaV0gPSBzZ24gKyAweDdjMDBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSBjb252ZXJ0IGRpcmVjdGx5XG4gICAgICAgIHVzaG9ydHNbaV0gPSBzZ24gKyAoKGV4cCArIDE1KSA8PCAxMCkgKyBmcmFjXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVzaG9ydHNcbn1cblxuZnVuY3Rpb24gaXNBcnJheUxpa2UgKHMpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocykgfHwgaXNUeXBlZEFycmF5KHMpXG59XG5cbnZhciBpc1BvdzIkMSA9IGZ1bmN0aW9uICh2KSB7XG4gIHJldHVybiAhKHYgJiAodiAtIDEpKSAmJiAoISF2KVxufVxuXG52YXIgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgPSAweDg2QTNcblxudmFyIEdMX1RFWFRVUkVfMkQkMSA9IDB4MERFMVxudmFyIEdMX1RFWFRVUkVfQ1VCRV9NQVAkMSA9IDB4ODUxM1xudmFyIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCQxID0gMHg4NTE1XG5cbnZhciBHTF9SR0JBJDEgPSAweDE5MDhcbnZhciBHTF9BTFBIQSA9IDB4MTkwNlxudmFyIEdMX1JHQiA9IDB4MTkwN1xudmFyIEdMX0xVTUlOQU5DRSA9IDB4MTkwOVxudmFyIEdMX0xVTUlOQU5DRV9BTFBIQSA9IDB4MTkwQVxuXG52YXIgR0xfUkdCQTQgPSAweDgwNTZcbnZhciBHTF9SR0I1X0ExID0gMHg4MDU3XG52YXIgR0xfUkdCNTY1ID0gMHg4RDYyXG5cbnZhciBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80JDEgPSAweDgwMzNcbnZhciBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xJDEgPSAweDgwMzRcbnZhciBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSQxID0gMHg4MzYzXG52YXIgR0xfVU5TSUdORURfSU5UXzI0XzhfV0VCR0wkMSA9IDB4ODRGQVxuXG52YXIgR0xfREVQVEhfQ09NUE9ORU5UID0gMHgxOTAyXG52YXIgR0xfREVQVEhfU1RFTkNJTCA9IDB4ODRGOVxuXG52YXIgR0xfU1JHQl9FWFQgPSAweDhDNDBcbnZhciBHTF9TUkdCX0FMUEhBX0VYVCA9IDB4OEM0MlxuXG52YXIgR0xfSEFMRl9GTE9BVF9PRVMkMSA9IDB4OEQ2MVxuXG52YXIgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCA9IDB4ODNGMFxudmFyIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUID0gMHg4M0YxXG52YXIgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQgPSAweDgzRjJcbnZhciBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCA9IDB4ODNGM1xuXG52YXIgR0xfQ09NUFJFU1NFRF9SR0JfQVRDX1dFQkdMID0gMHg4QzkyXG52YXIgR0xfQ09NUFJFU1NFRF9SR0JBX0FUQ19FWFBMSUNJVF9BTFBIQV9XRUJHTCA9IDB4OEM5M1xudmFyIEdMX0NPTVBSRVNTRURfUkdCQV9BVENfSU5URVJQT0xBVEVEX0FMUEhBX1dFQkdMID0gMHg4N0VFXG5cbnZhciBHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HID0gMHg4QzAwXG52YXIgR0xfQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRyA9IDB4OEMwMVxudmFyIEdMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HID0gMHg4QzAyXG52YXIgR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUcgPSAweDhDMDNcblxudmFyIEdMX0NPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0wgPSAweDhENjRcblxudmFyIEdMX1VOU0lHTkVEX0JZVEUkNSA9IDB4MTQwMVxudmFyIEdMX1VOU0lHTkVEX1NIT1JUJDMgPSAweDE0MDNcbnZhciBHTF9VTlNJR05FRF9JTlQkMyA9IDB4MTQwNVxudmFyIEdMX0ZMT0FUJDQgPSAweDE0MDZcblxudmFyIEdMX1RFWFRVUkVfV1JBUF9TID0gMHgyODAyXG52YXIgR0xfVEVYVFVSRV9XUkFQX1QgPSAweDI4MDNcblxudmFyIEdMX1JFUEVBVCA9IDB4MjkwMVxudmFyIEdMX0NMQU1QX1RPX0VER0UkMSA9IDB4ODEyRlxudmFyIEdMX01JUlJPUkVEX1JFUEVBVCA9IDB4ODM3MFxuXG52YXIgR0xfVEVYVFVSRV9NQUdfRklMVEVSID0gMHgyODAwXG52YXIgR0xfVEVYVFVSRV9NSU5fRklMVEVSID0gMHgyODAxXG5cbnZhciBHTF9ORUFSRVNUJDEgPSAweDI2MDBcbnZhciBHTF9MSU5FQVIgPSAweDI2MDFcbnZhciBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUJDEgPSAweDI3MDBcbnZhciBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QkMSA9IDB4MjcwMVxudmFyIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiQxID0gMHgyNzAyXG52YXIgR0xfTElORUFSX01JUE1BUF9MSU5FQVIkMSA9IDB4MjcwM1xuXG52YXIgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgPSAweDgxOTJcbnZhciBHTF9ET05UX0NBUkUgPSAweDExMDBcbnZhciBHTF9GQVNURVNUID0gMHgxMTAxXG52YXIgR0xfTklDRVNUID0gMHgxMTAyXG5cbnZhciBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCA9IDB4ODRGRVxuXG52YXIgR0xfVU5QQUNLX0FMSUdOTUVOVCA9IDB4MENGNVxudmFyIEdMX1VOUEFDS19GTElQX1lfV0VCR0wgPSAweDkyNDBcbnZhciBHTF9VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wgPSAweDkyNDFcbnZhciBHTF9VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMID0gMHg5MjQzXG5cbnZhciBHTF9CUk9XU0VSX0RFRkFVTFRfV0VCR0wgPSAweDkyNDRcblxudmFyIEdMX1RFWFRVUkUwJDEgPSAweDg0QzBcblxudmFyIE1JUE1BUF9GSUxURVJTID0gW1xuICBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUJDEsXG4gIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiQxLFxuICBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QkMSxcbiAgR0xfTElORUFSX01JUE1BUF9MSU5FQVIkMVxuXVxuXG52YXIgQ0hBTk5FTFNfRk9STUFUID0gW1xuICAwLFxuICBHTF9MVU1JTkFOQ0UsXG4gIEdMX0xVTUlOQU5DRV9BTFBIQSxcbiAgR0xfUkdCLFxuICBHTF9SR0JBJDFcbl1cblxudmFyIEZPUk1BVF9DSEFOTkVMUyA9IHt9XG5GT1JNQVRfQ0hBTk5FTFNbR0xfTFVNSU5BTkNFXSA9XG5GT1JNQVRfQ0hBTk5FTFNbR0xfQUxQSEFdID1cbkZPUk1BVF9DSEFOTkVMU1tHTF9ERVBUSF9DT01QT05FTlRdID0gMVxuRk9STUFUX0NIQU5ORUxTW0dMX0RFUFRIX1NURU5DSUxdID1cbkZPUk1BVF9DSEFOTkVMU1tHTF9MVU1JTkFOQ0VfQUxQSEFdID0gMlxuRk9STUFUX0NIQU5ORUxTW0dMX1JHQl0gPVxuRk9STUFUX0NIQU5ORUxTW0dMX1NSR0JfRVhUXSA9IDNcbkZPUk1BVF9DSEFOTkVMU1tHTF9SR0JBJDFdID1cbkZPUk1BVF9DSEFOTkVMU1tHTF9TUkdCX0FMUEhBX0VYVF0gPSA0XG5cbmZ1bmN0aW9uIG9iamVjdE5hbWUgKHN0cikge1xuICByZXR1cm4gJ1tvYmplY3QgJyArIHN0ciArICddJ1xufVxuXG52YXIgQ0FOVkFTX0NMQVNTID0gb2JqZWN0TmFtZSgnSFRNTENhbnZhc0VsZW1lbnQnKVxudmFyIE9GRlNDUkVFTkNBTlZBU19DTEFTUyA9IG9iamVjdE5hbWUoJ09mZnNjcmVlbkNhbnZhcycpXG52YXIgQ09OVEVYVDJEX0NMQVNTID0gb2JqZWN0TmFtZSgnQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEJylcbnZhciBCSVRNQVBfQ0xBU1MgPSBvYmplY3ROYW1lKCdJbWFnZUJpdG1hcCcpXG52YXIgSU1BR0VfQ0xBU1MgPSBvYmplY3ROYW1lKCdIVE1MSW1hZ2VFbGVtZW50JylcbnZhciBWSURFT19DTEFTUyA9IG9iamVjdE5hbWUoJ0hUTUxWaWRlb0VsZW1lbnQnKVxuXG52YXIgUElYRUxfQ0xBU1NFUyA9IE9iamVjdC5rZXlzKGFycmF5VHlwZXMpLmNvbmNhdChbXG4gIENBTlZBU19DTEFTUyxcbiAgT0ZGU0NSRUVOQ0FOVkFTX0NMQVNTLFxuICBDT05URVhUMkRfQ0xBU1MsXG4gIEJJVE1BUF9DTEFTUyxcbiAgSU1BR0VfQ0xBU1MsXG4gIFZJREVPX0NMQVNTXG5dKVxuXG4vLyBmb3IgZXZlcnkgdGV4dHVyZSB0eXBlLCBzdG9yZVxuLy8gdGhlIHNpemUgaW4gYnl0ZXMuXG52YXIgVFlQRV9TSVpFUyA9IFtdXG5UWVBFX1NJWkVTW0dMX1VOU0lHTkVEX0JZVEUkNV0gPSAxXG5UWVBFX1NJWkVTW0dMX0ZMT0FUJDRdID0gNFxuVFlQRV9TSVpFU1tHTF9IQUxGX0ZMT0FUX09FUyQxXSA9IDJcblxuVFlQRV9TSVpFU1tHTF9VTlNJR05FRF9TSE9SVCQzXSA9IDJcblRZUEVfU0laRVNbR0xfVU5TSUdORURfSU5UJDNdID0gNFxuXG52YXIgRk9STUFUX1NJWkVTX1NQRUNJQUwgPSBbXVxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfUkdCQTRdID0gMlxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfUkdCNV9BMV0gPSAyXG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9SR0I1NjVdID0gMlxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfREVQVEhfU1RFTkNJTF0gPSA0XG5cbkZPUk1BVF9TSVpFU19TUEVDSUFMW0dMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFRdID0gMC41XG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVF0gPSAwLjVcbkZPUk1BVF9TSVpFU19TUEVDSUFMW0dMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUXSA9IDFcbkZPUk1BVF9TSVpFU19TUEVDSUFMW0dMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUXSA9IDFcblxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfQ09NUFJFU1NFRF9SR0JfQVRDX1dFQkdMXSA9IDAuNVxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfQ09NUFJFU1NFRF9SR0JBX0FUQ19FWFBMSUNJVF9BTFBIQV9XRUJHTF0gPSAxXG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9DT01QUkVTU0VEX1JHQkFfQVRDX0lOVEVSUE9MQVRFRF9BTFBIQV9XRUJHTF0gPSAxXG5cbkZPUk1BVF9TSVpFU19TUEVDSUFMW0dMX0NPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUddID0gMC41XG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HXSA9IDAuMjVcbkZPUk1BVF9TSVpFU19TUEVDSUFMW0dMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HXSA9IDAuNVxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUddID0gMC4yNVxuXG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMXSA9IDAuNVxuXG5mdW5jdGlvbiBpc051bWVyaWNBcnJheSAoYXJyKSB7XG4gIHJldHVybiAoXG4gICAgQXJyYXkuaXNBcnJheShhcnIpICYmXG4gICAgKGFyci5sZW5ndGggPT09IDAgfHxcbiAgICB0eXBlb2YgYXJyWzBdID09PSAnbnVtYmVyJykpXG59XG5cbmZ1bmN0aW9uIGlzUmVjdEFycmF5IChhcnIpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICB2YXIgd2lkdGggPSBhcnIubGVuZ3RoXG4gIGlmICh3aWR0aCA9PT0gMCB8fCAhaXNBcnJheUxpa2UoYXJyWzBdKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGNsYXNzU3RyaW5nICh4KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeClcbn1cblxuZnVuY3Rpb24gaXNDYW52YXNFbGVtZW50IChvYmplY3QpIHtcbiAgcmV0dXJuIGNsYXNzU3RyaW5nKG9iamVjdCkgPT09IENBTlZBU19DTEFTU1xufVxuXG5mdW5jdGlvbiBpc09mZnNjcmVlbkNhbnZhcyAob2JqZWN0KSB7XG4gIHJldHVybiBjbGFzc1N0cmluZyhvYmplY3QpID09PSBPRkZTQ1JFRU5DQU5WQVNfQ0xBU1Ncbn1cblxuZnVuY3Rpb24gaXNDb250ZXh0MkQgKG9iamVjdCkge1xuICByZXR1cm4gY2xhc3NTdHJpbmcob2JqZWN0KSA9PT0gQ09OVEVYVDJEX0NMQVNTXG59XG5cbmZ1bmN0aW9uIGlzQml0bWFwIChvYmplY3QpIHtcbiAgcmV0dXJuIGNsYXNzU3RyaW5nKG9iamVjdCkgPT09IEJJVE1BUF9DTEFTU1xufVxuXG5mdW5jdGlvbiBpc0ltYWdlRWxlbWVudCAob2JqZWN0KSB7XG4gIHJldHVybiBjbGFzc1N0cmluZyhvYmplY3QpID09PSBJTUFHRV9DTEFTU1xufVxuXG5mdW5jdGlvbiBpc1ZpZGVvRWxlbWVudCAob2JqZWN0KSB7XG4gIHJldHVybiBjbGFzc1N0cmluZyhvYmplY3QpID09PSBWSURFT19DTEFTU1xufVxuXG5mdW5jdGlvbiBpc1BpeGVsRGF0YSAob2JqZWN0KSB7XG4gIGlmICghb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzU3RyaW5nKG9iamVjdClcbiAgaWYgKFBJWEVMX0NMQVNTRVMuaW5kZXhPZihjbGFzc05hbWUpID49IDApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiAoXG4gICAgaXNOdW1lcmljQXJyYXkob2JqZWN0KSB8fFxuICAgIGlzUmVjdEFycmF5KG9iamVjdCkgfHxcbiAgICBpc05EQXJyYXlMaWtlKG9iamVjdCkpXG59XG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlDb2RlJDEgKGRhdGEpIHtcbiAgcmV0dXJuIGFycmF5VHlwZXNbT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGEpXSB8IDBcbn1cblxuZnVuY3Rpb24gY29udmVydERhdGEgKHJlc3VsdCwgZGF0YSkge1xuICB2YXIgbiA9IGRhdGEubGVuZ3RoXG4gIHN3aXRjaCAocmVzdWx0LnR5cGUpIHtcbiAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEUkNTpcbiAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUJDM6XG4gICAgY2FzZSBHTF9VTlNJR05FRF9JTlQkMzpcbiAgICBjYXNlIEdMX0ZMT0FUJDQ6XG4gICAgICB2YXIgY29udmVydGVkID0gcG9vbC5hbGxvY1R5cGUocmVzdWx0LnR5cGUsIG4pXG4gICAgICBjb252ZXJ0ZWQuc2V0KGRhdGEpXG4gICAgICByZXN1bHQuZGF0YSA9IGNvbnZlcnRlZFxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgR0xfSEFMRl9GTE9BVF9PRVMkMTpcbiAgICAgIHJlc3VsdC5kYXRhID0gY29udmVydFRvSGFsZkZsb2F0KGRhdGEpXG4gICAgICBicmVha1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGNoZWNrJDEucmFpc2UoJ3Vuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSwgbXVzdCBzcGVjaWZ5IGEgdHlwZWQgYXJyYXknKVxuICB9XG59XG5cbmZ1bmN0aW9uIHByZUNvbnZlcnQgKGltYWdlLCBuKSB7XG4gIHJldHVybiBwb29sLmFsbG9jVHlwZShcbiAgICBpbWFnZS50eXBlID09PSBHTF9IQUxGX0ZMT0FUX09FUyQxXG4gICAgICA/IEdMX0ZMT0FUJDRcbiAgICAgIDogaW1hZ2UudHlwZSwgbilcbn1cblxuZnVuY3Rpb24gcG9zdENvbnZlcnQgKGltYWdlLCBkYXRhKSB7XG4gIGlmIChpbWFnZS50eXBlID09PSBHTF9IQUxGX0ZMT0FUX09FUyQxKSB7XG4gICAgaW1hZ2UuZGF0YSA9IGNvbnZlcnRUb0hhbGZGbG9hdChkYXRhKVxuICAgIHBvb2wuZnJlZVR5cGUoZGF0YSlcbiAgfSBlbHNlIHtcbiAgICBpbWFnZS5kYXRhID0gZGF0YVxuICB9XG59XG5cbmZ1bmN0aW9uIHRyYW5zcG9zZURhdGEgKGltYWdlLCBhcnJheSwgc3RyaWRlWCwgc3RyaWRlWSwgc3RyaWRlQywgb2Zmc2V0KSB7XG4gIHZhciB3ID0gaW1hZ2Uud2lkdGhcbiAgdmFyIGggPSBpbWFnZS5oZWlnaHRcbiAgdmFyIGMgPSBpbWFnZS5jaGFubmVsc1xuICB2YXIgbiA9IHcgKiBoICogY1xuICB2YXIgZGF0YSA9IHByZUNvbnZlcnQoaW1hZ2UsIG4pXG5cbiAgdmFyIHAgPSAwXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaDsgKytpKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB3OyArK2opIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYzsgKytrKSB7XG4gICAgICAgIGRhdGFbcCsrXSA9IGFycmF5W3N0cmlkZVggKiBqICsgc3RyaWRlWSAqIGkgKyBzdHJpZGVDICogayArIG9mZnNldF1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwb3N0Q29udmVydChpbWFnZSwgZGF0YSlcbn1cblxuZnVuY3Rpb24gZ2V0VGV4dHVyZVNpemUgKGZvcm1hdCwgdHlwZSwgd2lkdGgsIGhlaWdodCwgaXNNaXBtYXAsIGlzQ3ViZSkge1xuICB2YXIgc1xuICBpZiAodHlwZW9mIEZPUk1BVF9TSVpFU19TUEVDSUFMW2Zvcm1hdF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gd2UgaGF2ZSBhIHNwZWNpYWwgYXJyYXkgZm9yIGRlYWxpbmcgd2l0aCB3ZWlyZCBjb2xvciBmb3JtYXRzIHN1Y2ggYXMgUkdCNUExXG4gICAgcyA9IEZPUk1BVF9TSVpFU19TUEVDSUFMW2Zvcm1hdF1cbiAgfSBlbHNlIHtcbiAgICBzID0gRk9STUFUX0NIQU5ORUxTW2Zvcm1hdF0gKiBUWVBFX1NJWkVTW3R5cGVdXG4gIH1cblxuICBpZiAoaXNDdWJlKSB7XG4gICAgcyAqPSA2XG4gIH1cblxuICBpZiAoaXNNaXBtYXApIHtcbiAgICAvLyBjb21wdXRlIHRoZSB0b3RhbCBzaXplIG9mIGFsbCB0aGUgbWlwbWFwcy5cbiAgICB2YXIgdG90YWwgPSAwXG5cbiAgICB2YXIgdyA9IHdpZHRoXG4gICAgd2hpbGUgKHcgPj0gMSkge1xuICAgICAgLy8gd2UgY2FuIG9ubHkgdXNlIG1pcG1hcHMgb24gYSBzcXVhcmUgaW1hZ2UsXG4gICAgICAvLyBzbyB3ZSBjYW4gc2ltcGx5IHVzZSB0aGUgd2lkdGggYW5kIGlnbm9yZSB0aGUgaGVpZ2h0OlxuICAgICAgdG90YWwgKz0gcyAqIHcgKiB3XG4gICAgICB3IC89IDJcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHMgKiB3aWR0aCAqIGhlaWdodFxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRleHR1cmVTZXQgKFxuICBnbCwgZXh0ZW5zaW9ucywgbGltaXRzLCByZWdsUG9sbCwgY29udGV4dFN0YXRlLCBzdGF0cywgY29uZmlnKSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gSW5pdGlhbGl6ZSBjb25zdGFudHMgYW5kIHBhcmFtZXRlciB0YWJsZXMgaGVyZVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHZhciBtaXBtYXBIaW50ID0ge1xuICAgIFwiZG9uJ3QgY2FyZVwiOiBHTF9ET05UX0NBUkUsXG4gICAgJ2RvbnQgY2FyZSc6IEdMX0RPTlRfQ0FSRSxcbiAgICAnbmljZSc6IEdMX05JQ0VTVCxcbiAgICAnZmFzdCc6IEdMX0ZBU1RFU1RcbiAgfVxuXG4gIHZhciB3cmFwTW9kZXMgPSB7XG4gICAgJ3JlcGVhdCc6IEdMX1JFUEVBVCxcbiAgICAnY2xhbXAnOiBHTF9DTEFNUF9UT19FREdFJDEsXG4gICAgJ21pcnJvcic6IEdMX01JUlJPUkVEX1JFUEVBVFxuICB9XG5cbiAgdmFyIG1hZ0ZpbHRlcnMgPSB7XG4gICAgJ25lYXJlc3QnOiBHTF9ORUFSRVNUJDEsXG4gICAgJ2xpbmVhcic6IEdMX0xJTkVBUlxuICB9XG5cbiAgdmFyIG1pbkZpbHRlcnMgPSBleHRlbmQoe1xuICAgICdtaXBtYXAnOiBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiQxLFxuICAgICduZWFyZXN0IG1pcG1hcCBuZWFyZXN0JzogR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCQxLFxuICAgICdsaW5lYXIgbWlwbWFwIG5lYXJlc3QnOiBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QkMSxcbiAgICAnbmVhcmVzdCBtaXBtYXAgbGluZWFyJzogR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSJDEsXG4gICAgJ2xpbmVhciBtaXBtYXAgbGluZWFyJzogR0xfTElORUFSX01JUE1BUF9MSU5FQVIkMVxuICB9LCBtYWdGaWx0ZXJzKVxuXG4gIHZhciBjb2xvclNwYWNlID0ge1xuICAgICdub25lJzogMCxcbiAgICAnYnJvd3Nlcic6IEdMX0JST1dTRVJfREVGQVVMVF9XRUJHTFxuICB9XG5cbiAgdmFyIHRleHR1cmVUeXBlcyA9IHtcbiAgICAndWludDgnOiBHTF9VTlNJR05FRF9CWVRFJDUsXG4gICAgJ3JnYmE0JzogR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCQxLFxuICAgICdyZ2I1NjUnOiBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSQxLFxuICAgICdyZ2I1IGExJzogR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSQxXG4gIH1cblxuICB2YXIgdGV4dHVyZUZvcm1hdHMgPSB7XG4gICAgJ2FscGhhJzogR0xfQUxQSEEsXG4gICAgJ2x1bWluYW5jZSc6IEdMX0xVTUlOQU5DRSxcbiAgICAnbHVtaW5hbmNlIGFscGhhJzogR0xfTFVNSU5BTkNFX0FMUEhBLFxuICAgICdyZ2InOiBHTF9SR0IsXG4gICAgJ3JnYmEnOiBHTF9SR0JBJDEsXG4gICAgJ3JnYmE0JzogR0xfUkdCQTQsXG4gICAgJ3JnYjUgYTEnOiBHTF9SR0I1X0ExLFxuICAgICdyZ2I1NjUnOiBHTF9SR0I1NjVcbiAgfVxuXG4gIHZhciBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSB7fVxuXG4gIGlmIChleHRlbnNpb25zLmV4dF9zcmdiKSB7XG4gICAgdGV4dHVyZUZvcm1hdHMuc3JnYiA9IEdMX1NSR0JfRVhUXG4gICAgdGV4dHVyZUZvcm1hdHMuc3JnYmEgPSBHTF9TUkdCX0FMUEhBX0VYVFxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMub2VzX3RleHR1cmVfZmxvYXQpIHtcbiAgICB0ZXh0dXJlVHlwZXMuZmxvYXQzMiA9IHRleHR1cmVUeXBlcy5mbG9hdCA9IEdMX0ZMT0FUJDRcbiAgfVxuXG4gIGlmIChleHRlbnNpb25zLm9lc190ZXh0dXJlX2hhbGZfZmxvYXQpIHtcbiAgICB0ZXh0dXJlVHlwZXNbJ2Zsb2F0MTYnXSA9IHRleHR1cmVUeXBlc1snaGFsZiBmbG9hdCddID0gR0xfSEFMRl9GTE9BVF9PRVMkMVxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMud2ViZ2xfZGVwdGhfdGV4dHVyZSkge1xuICAgIGV4dGVuZCh0ZXh0dXJlRm9ybWF0cywge1xuICAgICAgJ2RlcHRoJzogR0xfREVQVEhfQ09NUE9ORU5ULFxuICAgICAgJ2RlcHRoIHN0ZW5jaWwnOiBHTF9ERVBUSF9TVEVOQ0lMXG4gICAgfSlcblxuICAgIGV4dGVuZCh0ZXh0dXJlVHlwZXMsIHtcbiAgICAgICd1aW50MTYnOiBHTF9VTlNJR05FRF9TSE9SVCQzLFxuICAgICAgJ3VpbnQzMic6IEdMX1VOU0lHTkVEX0lOVCQzLFxuICAgICAgJ2RlcHRoIHN0ZW5jaWwnOiBHTF9VTlNJR05FRF9JTlRfMjRfOF9XRUJHTCQxXG4gICAgfSlcbiAgfVxuXG4gIGlmIChleHRlbnNpb25zLndlYmdsX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjKSB7XG4gICAgZXh0ZW5kKGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cywge1xuICAgICAgJ3JnYiBzM3RjIGR4dDEnOiBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhULFxuICAgICAgJ3JnYmEgczN0YyBkeHQxJzogR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQsXG4gICAgICAncmdiYSBzM3RjIGR4dDMnOiBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCxcbiAgICAgICdyZ2JhIHMzdGMgZHh0NSc6IEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUXG4gICAgfSlcbiAgfVxuXG4gIGlmIChleHRlbnNpb25zLndlYmdsX2NvbXByZXNzZWRfdGV4dHVyZV9hdGMpIHtcbiAgICBleHRlbmQoY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLCB7XG4gICAgICAncmdiIGF0Yyc6IEdMX0NPTVBSRVNTRURfUkdCX0FUQ19XRUJHTCxcbiAgICAgICdyZ2JhIGF0YyBleHBsaWNpdCBhbHBoYSc6IEdMX0NPTVBSRVNTRURfUkdCQV9BVENfRVhQTElDSVRfQUxQSEFfV0VCR0wsXG4gICAgICAncmdiYSBhdGMgaW50ZXJwb2xhdGVkIGFscGhhJzogR0xfQ09NUFJFU1NFRF9SR0JBX0FUQ19JTlRFUlBPTEFURURfQUxQSEFfV0VCR0xcbiAgICB9KVxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMud2ViZ2xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjKSB7XG4gICAgZXh0ZW5kKGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cywge1xuICAgICAgJ3JnYiBwdnJ0YyA0YnBwdjEnOiBHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HLFxuICAgICAgJ3JnYiBwdnJ0YyAyYnBwdjEnOiBHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HLFxuICAgICAgJ3JnYmEgcHZydGMgNGJwcHYxJzogR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUcsXG4gICAgICAncmdiYSBwdnJ0YyAyYnBwdjEnOiBHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNR1xuICAgIH0pXG4gIH1cblxuICBpZiAoZXh0ZW5zaW9ucy53ZWJnbF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSkge1xuICAgIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0c1sncmdiIGV0YzEnXSA9IEdMX0NPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0xcbiAgfVxuXG4gIC8vIENvcHkgb3ZlciBhbGwgdGV4dHVyZSBmb3JtYXRzXG4gIHZhciBzdXBwb3J0ZWRDb21wcmVzc2VkRm9ybWF0cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFxuICAgIGdsLmdldFBhcmFtZXRlcihHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUykpXG4gIE9iamVjdC5rZXlzKGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBmb3JtYXQgPSBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHNbbmFtZV1cbiAgICBpZiAoc3VwcG9ydGVkQ29tcHJlc3NlZEZvcm1hdHMuaW5kZXhPZihmb3JtYXQpID49IDApIHtcbiAgICAgIHRleHR1cmVGb3JtYXRzW25hbWVdID0gZm9ybWF0XG4gICAgfVxuICB9KVxuXG4gIHZhciBzdXBwb3J0ZWRGb3JtYXRzID0gT2JqZWN0LmtleXModGV4dHVyZUZvcm1hdHMpXG4gIGxpbWl0cy50ZXh0dXJlRm9ybWF0cyA9IHN1cHBvcnRlZEZvcm1hdHNcblxuICAvLyBhc3NvY2lhdGUgd2l0aCBldmVyeSBmb3JtYXQgc3RyaW5nIGl0c1xuICAvLyBjb3JyZXNwb25kaW5nIEdMLXZhbHVlLlxuICB2YXIgdGV4dHVyZUZvcm1hdHNJbnZlcnQgPSBbXVxuICBPYmplY3Qua2V5cyh0ZXh0dXJlRm9ybWF0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbCA9IHRleHR1cmVGb3JtYXRzW2tleV1cbiAgICB0ZXh0dXJlRm9ybWF0c0ludmVydFt2YWxdID0ga2V5XG4gIH0pXG5cbiAgLy8gYXNzb2NpYXRlIHdpdGggZXZlcnkgdHlwZSBzdHJpbmcgaXRzXG4gIC8vIGNvcnJlc3BvbmRpbmcgR0wtdmFsdWUuXG4gIHZhciB0ZXh0dXJlVHlwZXNJbnZlcnQgPSBbXVxuICBPYmplY3Qua2V5cyh0ZXh0dXJlVHlwZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciB2YWwgPSB0ZXh0dXJlVHlwZXNba2V5XVxuICAgIHRleHR1cmVUeXBlc0ludmVydFt2YWxdID0ga2V5XG4gIH0pXG5cbiAgdmFyIG1hZ0ZpbHRlcnNJbnZlcnQgPSBbXVxuICBPYmplY3Qua2V5cyhtYWdGaWx0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgdmFsID0gbWFnRmlsdGVyc1trZXldXG4gICAgbWFnRmlsdGVyc0ludmVydFt2YWxdID0ga2V5XG4gIH0pXG5cbiAgdmFyIG1pbkZpbHRlcnNJbnZlcnQgPSBbXVxuICBPYmplY3Qua2V5cyhtaW5GaWx0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgdmFsID0gbWluRmlsdGVyc1trZXldXG4gICAgbWluRmlsdGVyc0ludmVydFt2YWxdID0ga2V5XG4gIH0pXG5cbiAgdmFyIHdyYXBNb2Rlc0ludmVydCA9IFtdXG4gIE9iamVjdC5rZXlzKHdyYXBNb2RlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbCA9IHdyYXBNb2Rlc1trZXldXG4gICAgd3JhcE1vZGVzSW52ZXJ0W3ZhbF0gPSBrZXlcbiAgfSlcblxuICAvLyBjb2xvckZvcm1hdHNbXSBnaXZlcyB0aGUgZm9ybWF0IChjaGFubmVscykgYXNzb2NpYXRlZCB0byBhblxuICAvLyBpbnRlcm5hbGZvcm1hdFxuICB2YXIgY29sb3JGb3JtYXRzID0gc3VwcG9ydGVkRm9ybWF0cy5yZWR1Y2UoZnVuY3Rpb24gKGNvbG9yLCBrZXkpIHtcbiAgICB2YXIgZ2xlbnVtID0gdGV4dHVyZUZvcm1hdHNba2V5XVxuICAgIGlmIChnbGVudW0gPT09IEdMX0xVTUlOQU5DRSB8fFxuICAgICAgICBnbGVudW0gPT09IEdMX0FMUEhBIHx8XG4gICAgICAgIGdsZW51bSA9PT0gR0xfTFVNSU5BTkNFIHx8XG4gICAgICAgIGdsZW51bSA9PT0gR0xfTFVNSU5BTkNFX0FMUEhBIHx8XG4gICAgICAgIGdsZW51bSA9PT0gR0xfREVQVEhfQ09NUE9ORU5UIHx8XG4gICAgICAgIGdsZW51bSA9PT0gR0xfREVQVEhfU1RFTkNJTCB8fFxuICAgICAgICAoZXh0ZW5zaW9ucy5leHRfc3JnYiAmJlxuICAgICAgICAgICAgICAgIChnbGVudW0gPT09IEdMX1NSR0JfRVhUIHx8XG4gICAgICAgICAgICAgICAgIGdsZW51bSA9PT0gR0xfU1JHQl9BTFBIQV9FWFQpKSkge1xuICAgICAgY29sb3JbZ2xlbnVtXSA9IGdsZW51bVxuICAgIH0gZWxzZSBpZiAoZ2xlbnVtID09PSBHTF9SR0I1X0ExIHx8IGtleS5pbmRleE9mKCdyZ2JhJykgPj0gMCkge1xuICAgICAgY29sb3JbZ2xlbnVtXSA9IEdMX1JHQkEkMVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2xvcltnbGVudW1dID0gR0xfUkdCXG4gICAgfVxuICAgIHJldHVybiBjb2xvclxuICB9LCB7fSlcblxuICBmdW5jdGlvbiBUZXhGbGFncyAoKSB7XG4gICAgLy8gZm9ybWF0IGluZm9cbiAgICB0aGlzLmludGVybmFsZm9ybWF0ID0gR0xfUkdCQSQxXG4gICAgdGhpcy5mb3JtYXQgPSBHTF9SR0JBJDFcbiAgICB0aGlzLnR5cGUgPSBHTF9VTlNJR05FRF9CWVRFJDVcbiAgICB0aGlzLmNvbXByZXNzZWQgPSBmYWxzZVxuXG4gICAgLy8gcGl4ZWwgc3RvcmFnZVxuICAgIHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IGZhbHNlXG4gICAgdGhpcy5mbGlwWSA9IGZhbHNlXG4gICAgdGhpcy51bnBhY2tBbGlnbm1lbnQgPSAxXG4gICAgdGhpcy5jb2xvclNwYWNlID0gR0xfQlJPV1NFUl9ERUZBVUxUX1dFQkdMXG5cbiAgICAvLyBzaGFwZSBpbmZvXG4gICAgdGhpcy53aWR0aCA9IDBcbiAgICB0aGlzLmhlaWdodCA9IDBcbiAgICB0aGlzLmNoYW5uZWxzID0gMFxuICB9XG5cbiAgZnVuY3Rpb24gY29weUZsYWdzIChyZXN1bHQsIG90aGVyKSB7XG4gICAgcmVzdWx0LmludGVybmFsZm9ybWF0ID0gb3RoZXIuaW50ZXJuYWxmb3JtYXRcbiAgICByZXN1bHQuZm9ybWF0ID0gb3RoZXIuZm9ybWF0XG4gICAgcmVzdWx0LnR5cGUgPSBvdGhlci50eXBlXG4gICAgcmVzdWx0LmNvbXByZXNzZWQgPSBvdGhlci5jb21wcmVzc2VkXG5cbiAgICByZXN1bHQucHJlbXVsdGlwbHlBbHBoYSA9IG90aGVyLnByZW11bHRpcGx5QWxwaGFcbiAgICByZXN1bHQuZmxpcFkgPSBvdGhlci5mbGlwWVxuICAgIHJlc3VsdC51bnBhY2tBbGlnbm1lbnQgPSBvdGhlci51bnBhY2tBbGlnbm1lbnRcbiAgICByZXN1bHQuY29sb3JTcGFjZSA9IG90aGVyLmNvbG9yU3BhY2VcblxuICAgIHJlc3VsdC53aWR0aCA9IG90aGVyLndpZHRoXG4gICAgcmVzdWx0LmhlaWdodCA9IG90aGVyLmhlaWdodFxuICAgIHJlc3VsdC5jaGFubmVscyA9IG90aGVyLmNoYW5uZWxzXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUZsYWdzIChmbGFncywgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcgfHwgIW9wdGlvbnMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICgncHJlbXVsdGlwbHlBbHBoYScgaW4gb3B0aW9ucykge1xuICAgICAgY2hlY2skMS50eXBlKG9wdGlvbnMucHJlbXVsdGlwbHlBbHBoYSwgJ2Jvb2xlYW4nLFxuICAgICAgICAnaW52YWxpZCBwcmVtdWx0aXBseUFscGhhJylcbiAgICAgIGZsYWdzLnByZW11bHRpcGx5QWxwaGEgPSBvcHRpb25zLnByZW11bHRpcGx5QWxwaGFcbiAgICB9XG5cbiAgICBpZiAoJ2ZsaXBZJyBpbiBvcHRpb25zKSB7XG4gICAgICBjaGVjayQxLnR5cGUob3B0aW9ucy5mbGlwWSwgJ2Jvb2xlYW4nLFxuICAgICAgICAnaW52YWxpZCB0ZXh0dXJlIGZsaXAnKVxuICAgICAgZmxhZ3MuZmxpcFkgPSBvcHRpb25zLmZsaXBZXG4gICAgfVxuXG4gICAgaWYgKCdhbGlnbm1lbnQnIGluIG9wdGlvbnMpIHtcbiAgICAgIGNoZWNrJDEub25lT2Yob3B0aW9ucy5hbGlnbm1lbnQsIFsxLCAyLCA0LCA4XSxcbiAgICAgICAgJ2ludmFsaWQgdGV4dHVyZSB1bnBhY2sgYWxpZ25tZW50JylcbiAgICAgIGZsYWdzLnVucGFja0FsaWdubWVudCA9IG9wdGlvbnMuYWxpZ25tZW50XG4gICAgfVxuXG4gICAgaWYgKCdjb2xvclNwYWNlJyBpbiBvcHRpb25zKSB7XG4gICAgICBjaGVjayQxLnBhcmFtZXRlcihvcHRpb25zLmNvbG9yU3BhY2UsIGNvbG9yU3BhY2UsXG4gICAgICAgICdpbnZhbGlkIGNvbG9yU3BhY2UnKVxuICAgICAgZmxhZ3MuY29sb3JTcGFjZSA9IGNvbG9yU3BhY2Vbb3B0aW9ucy5jb2xvclNwYWNlXVxuICAgIH1cblxuICAgIGlmICgndHlwZScgaW4gb3B0aW9ucykge1xuICAgICAgdmFyIHR5cGUgPSBvcHRpb25zLnR5cGVcbiAgICAgIGNoZWNrJDEoZXh0ZW5zaW9ucy5vZXNfdGV4dHVyZV9mbG9hdCB8fFxuICAgICAgICAhKHR5cGUgPT09ICdmbG9hdCcgfHwgdHlwZSA9PT0gJ2Zsb2F0MzInKSxcbiAgICAgICd5b3UgbXVzdCBlbmFibGUgdGhlIE9FU190ZXh0dXJlX2Zsb2F0IGV4dGVuc2lvbiBpbiBvcmRlciB0byB1c2UgZmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMuJylcbiAgICAgIGNoZWNrJDEoZXh0ZW5zaW9ucy5vZXNfdGV4dHVyZV9oYWxmX2Zsb2F0IHx8XG4gICAgICAgICEodHlwZSA9PT0gJ2hhbGYgZmxvYXQnIHx8IHR5cGUgPT09ICdmbG9hdDE2JyksXG4gICAgICAneW91IG11c3QgZW5hYmxlIHRoZSBPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IGV4dGVuc2lvbiBpbiBvcmRlciB0byB1c2UgMTYtYml0IGZsb2F0aW5nIHBvaW50IHRleHR1cmVzLicpXG4gICAgICBjaGVjayQxKGV4dGVuc2lvbnMud2ViZ2xfZGVwdGhfdGV4dHVyZSB8fFxuICAgICAgICAhKHR5cGUgPT09ICd1aW50MTYnIHx8IHR5cGUgPT09ICd1aW50MzInIHx8IHR5cGUgPT09ICdkZXB0aCBzdGVuY2lsJyksXG4gICAgICAneW91IG11c3QgZW5hYmxlIHRoZSBXRUJHTF9kZXB0aF90ZXh0dXJlIGV4dGVuc2lvbiBpbiBvcmRlciB0byB1c2UgZGVwdGgvc3RlbmNpbCB0ZXh0dXJlcy4nKVxuICAgICAgY2hlY2skMS5wYXJhbWV0ZXIodHlwZSwgdGV4dHVyZVR5cGVzLFxuICAgICAgICAnaW52YWxpZCB0ZXh0dXJlIHR5cGUnKVxuICAgICAgZmxhZ3MudHlwZSA9IHRleHR1cmVUeXBlc1t0eXBlXVxuICAgIH1cblxuICAgIHZhciB3ID0gZmxhZ3Mud2lkdGhcbiAgICB2YXIgaCA9IGZsYWdzLmhlaWdodFxuICAgIHZhciBjID0gZmxhZ3MuY2hhbm5lbHNcbiAgICB2YXIgaGFzQ2hhbm5lbHMgPSBmYWxzZVxuICAgIGlmICgnc2hhcGUnIGluIG9wdGlvbnMpIHtcbiAgICAgIGNoZWNrJDEoQXJyYXkuaXNBcnJheShvcHRpb25zLnNoYXBlKSAmJiBvcHRpb25zLnNoYXBlLmxlbmd0aCA+PSAyLFxuICAgICAgICAnc2hhcGUgbXVzdCBiZSBhbiBhcnJheScpXG4gICAgICB3ID0gb3B0aW9ucy5zaGFwZVswXVxuICAgICAgaCA9IG9wdGlvbnMuc2hhcGVbMV1cbiAgICAgIGlmIChvcHRpb25zLnNoYXBlLmxlbmd0aCA9PT0gMykge1xuICAgICAgICBjID0gb3B0aW9ucy5zaGFwZVsyXVxuICAgICAgICBjaGVjayQxKGMgPiAwICYmIGMgPD0gNCwgJ2ludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzJylcbiAgICAgICAgaGFzQ2hhbm5lbHMgPSB0cnVlXG4gICAgICB9XG4gICAgICBjaGVjayQxKHcgPj0gMCAmJiB3IDw9IGxpbWl0cy5tYXhUZXh0dXJlU2l6ZSwgJ2ludmFsaWQgd2lkdGgnKVxuICAgICAgY2hlY2skMShoID49IDAgJiYgaCA8PSBsaW1pdHMubWF4VGV4dHVyZVNpemUsICdpbnZhbGlkIGhlaWdodCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgncmFkaXVzJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIHcgPSBoID0gb3B0aW9ucy5yYWRpdXNcbiAgICAgICAgY2hlY2skMSh3ID49IDAgJiYgdyA8PSBsaW1pdHMubWF4VGV4dHVyZVNpemUsICdpbnZhbGlkIHJhZGl1cycpXG4gICAgICB9XG4gICAgICBpZiAoJ3dpZHRoJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIHcgPSBvcHRpb25zLndpZHRoXG4gICAgICAgIGNoZWNrJDEodyA+PSAwICYmIHcgPD0gbGltaXRzLm1heFRleHR1cmVTaXplLCAnaW52YWxpZCB3aWR0aCcpXG4gICAgICB9XG4gICAgICBpZiAoJ2hlaWdodCcgaW4gb3B0aW9ucykge1xuICAgICAgICBoID0gb3B0aW9ucy5oZWlnaHRcbiAgICAgICAgY2hlY2skMShoID49IDAgJiYgaCA8PSBsaW1pdHMubWF4VGV4dHVyZVNpemUsICdpbnZhbGlkIGhlaWdodCcpXG4gICAgICB9XG4gICAgICBpZiAoJ2NoYW5uZWxzJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIGMgPSBvcHRpb25zLmNoYW5uZWxzXG4gICAgICAgIGNoZWNrJDEoYyA+IDAgJiYgYyA8PSA0LCAnaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMnKVxuICAgICAgICBoYXNDaGFubmVscyA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgZmxhZ3Mud2lkdGggPSB3IHwgMFxuICAgIGZsYWdzLmhlaWdodCA9IGggfCAwXG4gICAgZmxhZ3MuY2hhbm5lbHMgPSBjIHwgMFxuXG4gICAgdmFyIGhhc0Zvcm1hdCA9IGZhbHNlXG4gICAgaWYgKCdmb3JtYXQnIGluIG9wdGlvbnMpIHtcbiAgICAgIHZhciBmb3JtYXRTdHIgPSBvcHRpb25zLmZvcm1hdFxuICAgICAgY2hlY2skMShleHRlbnNpb25zLndlYmdsX2RlcHRoX3RleHR1cmUgfHxcbiAgICAgICAgIShmb3JtYXRTdHIgPT09ICdkZXB0aCcgfHwgZm9ybWF0U3RyID09PSAnZGVwdGggc3RlbmNpbCcpLFxuICAgICAgJ3lvdSBtdXN0IGVuYWJsZSB0aGUgV0VCR0xfZGVwdGhfdGV4dHVyZSBleHRlbnNpb24gaW4gb3JkZXIgdG8gdXNlIGRlcHRoL3N0ZW5jaWwgdGV4dHVyZXMuJylcbiAgICAgIGNoZWNrJDEucGFyYW1ldGVyKGZvcm1hdFN0ciwgdGV4dHVyZUZvcm1hdHMsXG4gICAgICAgICdpbnZhbGlkIHRleHR1cmUgZm9ybWF0JylcbiAgICAgIHZhciBpbnRlcm5hbGZvcm1hdCA9IGZsYWdzLmludGVybmFsZm9ybWF0ID0gdGV4dHVyZUZvcm1hdHNbZm9ybWF0U3RyXVxuICAgICAgZmxhZ3MuZm9ybWF0ID0gY29sb3JGb3JtYXRzW2ludGVybmFsZm9ybWF0XVxuICAgICAgaWYgKGZvcm1hdFN0ciBpbiB0ZXh0dXJlVHlwZXMpIHtcbiAgICAgICAgaWYgKCEoJ3R5cGUnIGluIG9wdGlvbnMpKSB7XG4gICAgICAgICAgZmxhZ3MudHlwZSA9IHRleHR1cmVUeXBlc1tmb3JtYXRTdHJdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3JtYXRTdHIgaW4gY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKSB7XG4gICAgICAgIGZsYWdzLmNvbXByZXNzZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICBoYXNGb3JtYXQgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gUmVjb25jaWxlIGNoYW5uZWxzIGFuZCBmb3JtYXRcbiAgICBpZiAoIWhhc0NoYW5uZWxzICYmIGhhc0Zvcm1hdCkge1xuICAgICAgZmxhZ3MuY2hhbm5lbHMgPSBGT1JNQVRfQ0hBTk5FTFNbZmxhZ3MuZm9ybWF0XVxuICAgIH0gZWxzZSBpZiAoaGFzQ2hhbm5lbHMgJiYgIWhhc0Zvcm1hdCkge1xuICAgICAgaWYgKGZsYWdzLmNoYW5uZWxzICE9PSBDSEFOTkVMU19GT1JNQVRbZmxhZ3MuZm9ybWF0XSkge1xuICAgICAgICBmbGFncy5mb3JtYXQgPSBmbGFncy5pbnRlcm5hbGZvcm1hdCA9IENIQU5ORUxTX0ZPUk1BVFtmbGFncy5jaGFubmVsc11cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhhc0Zvcm1hdCAmJiBoYXNDaGFubmVscykge1xuICAgICAgY2hlY2skMShcbiAgICAgICAgZmxhZ3MuY2hhbm5lbHMgPT09IEZPUk1BVF9DSEFOTkVMU1tmbGFncy5mb3JtYXRdLFxuICAgICAgICAnbnVtYmVyIG9mIGNoYW5uZWxzIGluY29uc2lzdGVudCB3aXRoIHNwZWNpZmllZCBmb3JtYXQnKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEZsYWdzIChmbGFncykge1xuICAgIGdsLnBpeGVsU3RvcmVpKEdMX1VOUEFDS19GTElQX1lfV0VCR0wsIGZsYWdzLmZsaXBZKVxuICAgIGdsLnBpeGVsU3RvcmVpKEdMX1VOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgZmxhZ3MucHJlbXVsdGlwbHlBbHBoYSlcbiAgICBnbC5waXhlbFN0b3JlaShHTF9VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMLCBmbGFncy5jb2xvclNwYWNlKVxuICAgIGdsLnBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIGZsYWdzLnVucGFja0FsaWdubWVudClcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gVGV4IGltYWdlIGRhdGFcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBmdW5jdGlvbiBUZXhJbWFnZSAoKSB7XG4gICAgVGV4RmxhZ3MuY2FsbCh0aGlzKVxuXG4gICAgdGhpcy54T2Zmc2V0ID0gMFxuICAgIHRoaXMueU9mZnNldCA9IDBcblxuICAgIC8vIGRhdGFcbiAgICB0aGlzLmRhdGEgPSBudWxsXG4gICAgdGhpcy5uZWVkc0ZyZWUgPSBmYWxzZVxuXG4gICAgLy8gaHRtbCBlbGVtZW50XG4gICAgdGhpcy5lbGVtZW50ID0gbnVsbFxuXG4gICAgLy8gY29weVRleEltYWdlIGluZm9cbiAgICB0aGlzLm5lZWRzQ29weSA9IGZhbHNlXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUltYWdlIChpbWFnZSwgb3B0aW9ucykge1xuICAgIHZhciBkYXRhID0gbnVsbFxuICAgIGlmIChpc1BpeGVsRGF0YShvcHRpb25zKSkge1xuICAgICAgZGF0YSA9IG9wdGlvbnNcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGNoZWNrJDEudHlwZShvcHRpb25zLCAnb2JqZWN0JywgJ2ludmFsaWQgcGl4ZWwgZGF0YSB0eXBlJylcbiAgICAgIHBhcnNlRmxhZ3MoaW1hZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoJ3gnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaW1hZ2UueE9mZnNldCA9IG9wdGlvbnMueCB8IDBcbiAgICAgIH1cbiAgICAgIGlmICgneScgaW4gb3B0aW9ucykge1xuICAgICAgICBpbWFnZS55T2Zmc2V0ID0gb3B0aW9ucy55IHwgMFxuICAgICAgfVxuICAgICAgaWYgKGlzUGl4ZWxEYXRhKG9wdGlvbnMuZGF0YSkpIHtcbiAgICAgICAgZGF0YSA9IG9wdGlvbnMuZGF0YVxuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrJDEoXG4gICAgICAhaW1hZ2UuY29tcHJlc3NlZCB8fFxuICAgICAgZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksXG4gICAgICAnY29tcHJlc3NlZCB0ZXh0dXJlIGRhdGEgbXVzdCBiZSBzdG9yZWQgaW4gYSB1aW50OGFycmF5JylcblxuICAgIGlmIChvcHRpb25zLmNvcHkpIHtcbiAgICAgIGNoZWNrJDEoIWRhdGEsICdjYW4gbm90IHNwZWNpZnkgY29weSBhbmQgZGF0YSBmaWVsZCBmb3IgdGhlIHNhbWUgdGV4dHVyZScpXG4gICAgICB2YXIgdmlld1cgPSBjb250ZXh0U3RhdGUudmlld3BvcnRXaWR0aFxuICAgICAgdmFyIHZpZXdIID0gY29udGV4dFN0YXRlLnZpZXdwb3J0SGVpZ2h0XG4gICAgICBpbWFnZS53aWR0aCA9IGltYWdlLndpZHRoIHx8ICh2aWV3VyAtIGltYWdlLnhPZmZzZXQpXG4gICAgICBpbWFnZS5oZWlnaHQgPSBpbWFnZS5oZWlnaHQgfHwgKHZpZXdIIC0gaW1hZ2UueU9mZnNldClcbiAgICAgIGltYWdlLm5lZWRzQ29weSA9IHRydWVcbiAgICAgIGNoZWNrJDEoaW1hZ2UueE9mZnNldCA+PSAwICYmIGltYWdlLnhPZmZzZXQgPCB2aWV3VyAmJlxuICAgICAgICAgICAgaW1hZ2UueU9mZnNldCA+PSAwICYmIGltYWdlLnlPZmZzZXQgPCB2aWV3SCAmJlxuICAgICAgICAgICAgaW1hZ2Uud2lkdGggPiAwICYmIGltYWdlLndpZHRoIDw9IHZpZXdXICYmXG4gICAgICAgICAgICBpbWFnZS5oZWlnaHQgPiAwICYmIGltYWdlLmhlaWdodCA8PSB2aWV3SCxcbiAgICAgICdjb3B5IHRleHR1cmUgcmVhZCBvdXQgb2YgYm91bmRzJylcbiAgICB9IGVsc2UgaWYgKCFkYXRhKSB7XG4gICAgICBpbWFnZS53aWR0aCA9IGltYWdlLndpZHRoIHx8IDFcbiAgICAgIGltYWdlLmhlaWdodCA9IGltYWdlLmhlaWdodCB8fCAxXG4gICAgICBpbWFnZS5jaGFubmVscyA9IGltYWdlLmNoYW5uZWxzIHx8IDRcbiAgICB9IGVsc2UgaWYgKGlzVHlwZWRBcnJheShkYXRhKSkge1xuICAgICAgaW1hZ2UuY2hhbm5lbHMgPSBpbWFnZS5jaGFubmVscyB8fCA0XG4gICAgICBpbWFnZS5kYXRhID0gZGF0YVxuICAgICAgaWYgKCEoJ3R5cGUnIGluIG9wdGlvbnMpICYmIGltYWdlLnR5cGUgPT09IEdMX1VOU0lHTkVEX0JZVEUkNSkge1xuICAgICAgICBpbWFnZS50eXBlID0gdHlwZWRBcnJheUNvZGUkMShkYXRhKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXkoZGF0YSkpIHtcbiAgICAgIGltYWdlLmNoYW5uZWxzID0gaW1hZ2UuY2hhbm5lbHMgfHwgNFxuICAgICAgY29udmVydERhdGEoaW1hZ2UsIGRhdGEpXG4gICAgICBpbWFnZS5hbGlnbm1lbnQgPSAxXG4gICAgICBpbWFnZS5uZWVkc0ZyZWUgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChpc05EQXJyYXlMaWtlKGRhdGEpKSB7XG4gICAgICB2YXIgYXJyYXkgPSBkYXRhLmRhdGFcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkgJiYgaW1hZ2UudHlwZSA9PT0gR0xfVU5TSUdORURfQllURSQ1KSB7XG4gICAgICAgIGltYWdlLnR5cGUgPSB0eXBlZEFycmF5Q29kZSQxKGFycmF5KVxuICAgICAgfVxuICAgICAgdmFyIHNoYXBlID0gZGF0YS5zaGFwZVxuICAgICAgdmFyIHN0cmlkZSA9IGRhdGEuc3RyaWRlXG4gICAgICB2YXIgc2hhcGVYLCBzaGFwZVksIHNoYXBlQywgc3RyaWRlWCwgc3RyaWRlWSwgc3RyaWRlQ1xuICAgICAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMykge1xuICAgICAgICBzaGFwZUMgPSBzaGFwZVsyXVxuICAgICAgICBzdHJpZGVDID0gc3RyaWRlWzJdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVjayQxKHNoYXBlLmxlbmd0aCA9PT0gMiwgJ2ludmFsaWQgbmRhcnJheSBwaXhlbCBkYXRhLCBtdXN0IGJlIDIgb3IgM0QnKVxuICAgICAgICBzaGFwZUMgPSAxXG4gICAgICAgIHN0cmlkZUMgPSAxXG4gICAgICB9XG4gICAgICBzaGFwZVggPSBzaGFwZVswXVxuICAgICAgc2hhcGVZID0gc2hhcGVbMV1cbiAgICAgIHN0cmlkZVggPSBzdHJpZGVbMF1cbiAgICAgIHN0cmlkZVkgPSBzdHJpZGVbMV1cbiAgICAgIGltYWdlLmFsaWdubWVudCA9IDFcbiAgICAgIGltYWdlLndpZHRoID0gc2hhcGVYXG4gICAgICBpbWFnZS5oZWlnaHQgPSBzaGFwZVlcbiAgICAgIGltYWdlLmNoYW5uZWxzID0gc2hhcGVDXG4gICAgICBpbWFnZS5mb3JtYXQgPSBpbWFnZS5pbnRlcm5hbGZvcm1hdCA9IENIQU5ORUxTX0ZPUk1BVFtzaGFwZUNdXG4gICAgICBpbWFnZS5uZWVkc0ZyZWUgPSB0cnVlXG4gICAgICB0cmFuc3Bvc2VEYXRhKGltYWdlLCBhcnJheSwgc3RyaWRlWCwgc3RyaWRlWSwgc3RyaWRlQywgZGF0YS5vZmZzZXQpXG4gICAgfSBlbHNlIGlmIChpc0NhbnZhc0VsZW1lbnQoZGF0YSkgfHwgaXNPZmZzY3JlZW5DYW52YXMoZGF0YSkgfHwgaXNDb250ZXh0MkQoZGF0YSkpIHtcbiAgICAgIGlmIChpc0NhbnZhc0VsZW1lbnQoZGF0YSkgfHwgaXNPZmZzY3JlZW5DYW52YXMoZGF0YSkpIHtcbiAgICAgICAgaW1hZ2UuZWxlbWVudCA9IGRhdGFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltYWdlLmVsZW1lbnQgPSBkYXRhLmNhbnZhc1xuICAgICAgfVxuICAgICAgaW1hZ2Uud2lkdGggPSBpbWFnZS5lbGVtZW50LndpZHRoXG4gICAgICBpbWFnZS5oZWlnaHQgPSBpbWFnZS5lbGVtZW50LmhlaWdodFxuICAgICAgaW1hZ2UuY2hhbm5lbHMgPSA0XG4gICAgfSBlbHNlIGlmIChpc0JpdG1hcChkYXRhKSkge1xuICAgICAgaW1hZ2UuZWxlbWVudCA9IGRhdGFcbiAgICAgIGltYWdlLndpZHRoID0gZGF0YS53aWR0aFxuICAgICAgaW1hZ2UuaGVpZ2h0ID0gZGF0YS5oZWlnaHRcbiAgICAgIGltYWdlLmNoYW5uZWxzID0gNFxuICAgIH0gZWxzZSBpZiAoaXNJbWFnZUVsZW1lbnQoZGF0YSkpIHtcbiAgICAgIGltYWdlLmVsZW1lbnQgPSBkYXRhXG4gICAgICBpbWFnZS53aWR0aCA9IGRhdGEubmF0dXJhbFdpZHRoXG4gICAgICBpbWFnZS5oZWlnaHQgPSBkYXRhLm5hdHVyYWxIZWlnaHRcbiAgICAgIGltYWdlLmNoYW5uZWxzID0gNFxuICAgIH0gZWxzZSBpZiAoaXNWaWRlb0VsZW1lbnQoZGF0YSkpIHtcbiAgICAgIGltYWdlLmVsZW1lbnQgPSBkYXRhXG4gICAgICBpbWFnZS53aWR0aCA9IGRhdGEudmlkZW9XaWR0aFxuICAgICAgaW1hZ2UuaGVpZ2h0ID0gZGF0YS52aWRlb0hlaWdodFxuICAgICAgaW1hZ2UuY2hhbm5lbHMgPSA0XG4gICAgfSBlbHNlIGlmIChpc1JlY3RBcnJheShkYXRhKSkge1xuICAgICAgdmFyIHcgPSBpbWFnZS53aWR0aCB8fCBkYXRhWzBdLmxlbmd0aFxuICAgICAgdmFyIGggPSBpbWFnZS5oZWlnaHQgfHwgZGF0YS5sZW5ndGhcbiAgICAgIHZhciBjID0gaW1hZ2UuY2hhbm5lbHNcbiAgICAgIGlmIChpc0FycmF5TGlrZShkYXRhWzBdWzBdKSkge1xuICAgICAgICBjID0gYyB8fCBkYXRhWzBdWzBdLmxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYyA9IGMgfHwgMVxuICAgICAgfVxuICAgICAgdmFyIGFycmF5U2hhcGUgPSBmbGF0dGVuVXRpbHMuc2hhcGUoZGF0YSlcbiAgICAgIHZhciBuID0gMVxuICAgICAgZm9yICh2YXIgZGQgPSAwOyBkZCA8IGFycmF5U2hhcGUubGVuZ3RoOyArK2RkKSB7XG4gICAgICAgIG4gKj0gYXJyYXlTaGFwZVtkZF1cbiAgICAgIH1cbiAgICAgIHZhciBhbGxvY0RhdGEgPSBwcmVDb252ZXJ0KGltYWdlLCBuKVxuICAgICAgZmxhdHRlblV0aWxzLmZsYXR0ZW4oZGF0YSwgYXJyYXlTaGFwZSwgJycsIGFsbG9jRGF0YSlcbiAgICAgIHBvc3RDb252ZXJ0KGltYWdlLCBhbGxvY0RhdGEpXG4gICAgICBpbWFnZS5hbGlnbm1lbnQgPSAxXG4gICAgICBpbWFnZS53aWR0aCA9IHdcbiAgICAgIGltYWdlLmhlaWdodCA9IGhcbiAgICAgIGltYWdlLmNoYW5uZWxzID0gY1xuICAgICAgaW1hZ2UuZm9ybWF0ID0gaW1hZ2UuaW50ZXJuYWxmb3JtYXQgPSBDSEFOTkVMU19GT1JNQVRbY11cbiAgICAgIGltYWdlLm5lZWRzRnJlZSA9IHRydWVcbiAgICB9XG5cbiAgICBpZiAoaW1hZ2UudHlwZSA9PT0gR0xfRkxPQVQkNCkge1xuICAgICAgY2hlY2skMShsaW1pdHMuZXh0ZW5zaW9ucy5pbmRleE9mKCdvZXNfdGV4dHVyZV9mbG9hdCcpID49IDAsXG4gICAgICAgICdvZXNfdGV4dHVyZV9mbG9hdCBleHRlbnNpb24gbm90IGVuYWJsZWQnKVxuICAgIH0gZWxzZSBpZiAoaW1hZ2UudHlwZSA9PT0gR0xfSEFMRl9GTE9BVF9PRVMkMSkge1xuICAgICAgY2hlY2skMShsaW1pdHMuZXh0ZW5zaW9ucy5pbmRleE9mKCdvZXNfdGV4dHVyZV9oYWxmX2Zsb2F0JykgPj0gMCxcbiAgICAgICAgJ29lc190ZXh0dXJlX2hhbGZfZmxvYXQgZXh0ZW5zaW9uIG5vdCBlbmFibGVkJylcbiAgICB9XG5cbiAgICAvLyBkbyBjb21wcmVzc2VkIHRleHR1cmUgIHZhbGlkYXRpb24gaGVyZS5cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEltYWdlIChpbmZvLCB0YXJnZXQsIG1pcGxldmVsKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBpbmZvLmVsZW1lbnRcbiAgICB2YXIgZGF0YSA9IGluZm8uZGF0YVxuICAgIHZhciBpbnRlcm5hbGZvcm1hdCA9IGluZm8uaW50ZXJuYWxmb3JtYXRcbiAgICB2YXIgZm9ybWF0ID0gaW5mby5mb3JtYXRcbiAgICB2YXIgdHlwZSA9IGluZm8udHlwZVxuICAgIHZhciB3aWR0aCA9IGluZm8ud2lkdGhcbiAgICB2YXIgaGVpZ2h0ID0gaW5mby5oZWlnaHRcblxuICAgIHNldEZsYWdzKGluZm8pXG5cbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZ2wudGV4SW1hZ2UyRCh0YXJnZXQsIG1pcGxldmVsLCBmb3JtYXQsIGZvcm1hdCwgdHlwZSwgZWxlbWVudClcbiAgICB9IGVsc2UgaWYgKGluZm8uY29tcHJlc3NlZCkge1xuICAgICAgZ2wuY29tcHJlc3NlZFRleEltYWdlMkQodGFyZ2V0LCBtaXBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGRhdGEpXG4gICAgfSBlbHNlIGlmIChpbmZvLm5lZWRzQ29weSkge1xuICAgICAgcmVnbFBvbGwoKVxuICAgICAgZ2wuY29weVRleEltYWdlMkQoXG4gICAgICAgIHRhcmdldCwgbWlwbGV2ZWwsIGZvcm1hdCwgaW5mby54T2Zmc2V0LCBpbmZvLnlPZmZzZXQsIHdpZHRoLCBoZWlnaHQsIDApXG4gICAgfSBlbHNlIHtcbiAgICAgIGdsLnRleEltYWdlMkQodGFyZ2V0LCBtaXBsZXZlbCwgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBmb3JtYXQsIHR5cGUsIGRhdGEgfHwgbnVsbClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTdWJJbWFnZSAoaW5mbywgdGFyZ2V0LCB4LCB5LCBtaXBsZXZlbCkge1xuICAgIHZhciBlbGVtZW50ID0gaW5mby5lbGVtZW50XG4gICAgdmFyIGRhdGEgPSBpbmZvLmRhdGFcbiAgICB2YXIgaW50ZXJuYWxmb3JtYXQgPSBpbmZvLmludGVybmFsZm9ybWF0XG4gICAgdmFyIGZvcm1hdCA9IGluZm8uZm9ybWF0XG4gICAgdmFyIHR5cGUgPSBpbmZvLnR5cGVcbiAgICB2YXIgd2lkdGggPSBpbmZvLndpZHRoXG4gICAgdmFyIGhlaWdodCA9IGluZm8uaGVpZ2h0XG5cbiAgICBzZXRGbGFncyhpbmZvKVxuXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIGdsLnRleFN1YkltYWdlMkQoXG4gICAgICAgIHRhcmdldCwgbWlwbGV2ZWwsIHgsIHksIGZvcm1hdCwgdHlwZSwgZWxlbWVudClcbiAgICB9IGVsc2UgaWYgKGluZm8uY29tcHJlc3NlZCkge1xuICAgICAgZ2wuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoXG4gICAgICAgIHRhcmdldCwgbWlwbGV2ZWwsIHgsIHksIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkYXRhKVxuICAgIH0gZWxzZSBpZiAoaW5mby5uZWVkc0NvcHkpIHtcbiAgICAgIHJlZ2xQb2xsKClcbiAgICAgIGdsLmNvcHlUZXhTdWJJbWFnZTJEKFxuICAgICAgICB0YXJnZXQsIG1pcGxldmVsLCB4LCB5LCBpbmZvLnhPZmZzZXQsIGluZm8ueU9mZnNldCwgd2lkdGgsIGhlaWdodClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2wudGV4U3ViSW1hZ2UyRChcbiAgICAgICAgdGFyZ2V0LCBtaXBsZXZlbCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBkYXRhKVxuICAgIH1cbiAgfVxuXG4gIC8vIHRleEltYWdlIHBvb2xcbiAgdmFyIGltYWdlUG9vbCA9IFtdXG5cbiAgZnVuY3Rpb24gYWxsb2NJbWFnZSAoKSB7XG4gICAgcmV0dXJuIGltYWdlUG9vbC5wb3AoKSB8fCBuZXcgVGV4SW1hZ2UoKVxuICB9XG5cbiAgZnVuY3Rpb24gZnJlZUltYWdlIChpbWFnZSkge1xuICAgIGlmIChpbWFnZS5uZWVkc0ZyZWUpIHtcbiAgICAgIHBvb2wuZnJlZVR5cGUoaW1hZ2UuZGF0YSlcbiAgICB9XG4gICAgVGV4SW1hZ2UuY2FsbChpbWFnZSlcbiAgICBpbWFnZVBvb2wucHVzaChpbWFnZSlcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gTWlwIG1hcFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGZ1bmN0aW9uIE1pcE1hcCAoKSB7XG4gICAgVGV4RmxhZ3MuY2FsbCh0aGlzKVxuXG4gICAgdGhpcy5nZW5NaXBtYXBzID0gZmFsc2VcbiAgICB0aGlzLm1pcG1hcEhpbnQgPSBHTF9ET05UX0NBUkVcbiAgICB0aGlzLm1pcG1hc2sgPSAwXG4gICAgdGhpcy5pbWFnZXMgPSBBcnJheSgxNilcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlTWlwTWFwRnJvbVNoYXBlIChtaXBtYXAsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICB2YXIgaW1nID0gbWlwbWFwLmltYWdlc1swXSA9IGFsbG9jSW1hZ2UoKVxuICAgIG1pcG1hcC5taXBtYXNrID0gMVxuICAgIGltZy53aWR0aCA9IG1pcG1hcC53aWR0aCA9IHdpZHRoXG4gICAgaW1nLmhlaWdodCA9IG1pcG1hcC5oZWlnaHQgPSBoZWlnaHRcbiAgICBpbWcuY2hhbm5lbHMgPSBtaXBtYXAuY2hhbm5lbHMgPSA0XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZU1pcE1hcEZyb21PYmplY3QgKG1pcG1hcCwgb3B0aW9ucykge1xuICAgIHZhciBpbWdEYXRhID0gbnVsbFxuICAgIGlmIChpc1BpeGVsRGF0YShvcHRpb25zKSkge1xuICAgICAgaW1nRGF0YSA9IG1pcG1hcC5pbWFnZXNbMF0gPSBhbGxvY0ltYWdlKClcbiAgICAgIGNvcHlGbGFncyhpbWdEYXRhLCBtaXBtYXApXG4gICAgICBwYXJzZUltYWdlKGltZ0RhdGEsIG9wdGlvbnMpXG4gICAgICBtaXBtYXAubWlwbWFzayA9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VGbGFncyhtaXBtYXAsIG9wdGlvbnMpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLm1pcG1hcCkpIHtcbiAgICAgICAgdmFyIG1pcERhdGEgPSBvcHRpb25zLm1pcG1hcFxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1pcERhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpbWdEYXRhID0gbWlwbWFwLmltYWdlc1tpXSA9IGFsbG9jSW1hZ2UoKVxuICAgICAgICAgIGNvcHlGbGFncyhpbWdEYXRhLCBtaXBtYXApXG4gICAgICAgICAgaW1nRGF0YS53aWR0aCA+Pj0gaVxuICAgICAgICAgIGltZ0RhdGEuaGVpZ2h0ID4+PSBpXG4gICAgICAgICAgcGFyc2VJbWFnZShpbWdEYXRhLCBtaXBEYXRhW2ldKVxuICAgICAgICAgIG1pcG1hcC5taXBtYXNrIHw9ICgxIDw8IGkpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltZ0RhdGEgPSBtaXBtYXAuaW1hZ2VzWzBdID0gYWxsb2NJbWFnZSgpXG4gICAgICAgIGNvcHlGbGFncyhpbWdEYXRhLCBtaXBtYXApXG4gICAgICAgIHBhcnNlSW1hZ2UoaW1nRGF0YSwgb3B0aW9ucylcbiAgICAgICAgbWlwbWFwLm1pcG1hc2sgPSAxXG4gICAgICB9XG4gICAgfVxuICAgIGNvcHlGbGFncyhtaXBtYXAsIG1pcG1hcC5pbWFnZXNbMF0pXG5cbiAgICAvLyBGb3IgdGV4dHVyZXMgb2YgdGhlIGNvbXByZXNzZWQgZm9ybWF0IFdFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjXG4gICAgLy8gd2UgbXVzdCBoYXZlIHRoYXRcbiAgICAvL1xuICAgIC8vIFwiV2hlbiBsZXZlbCBlcXVhbHMgemVybyB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LlxuICAgIC8vIFdoZW4gbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIDAgd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIDAsIDEsIDIgb3IgYSBtdWx0aXBsZSBvZiA0LiBcIlxuICAgIC8vXG4gICAgLy8gYnV0IHdlIGRvIG5vdCB5ZXQgc3VwcG9ydCBoYXZpbmcgbXVsdGlwbGUgbWlwbWFwIGxldmVscyBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlcyxcbiAgICAvLyBzbyB3ZSBvbmx5IHRlc3QgZm9yIGxldmVsIHplcm8uXG5cbiAgICBpZiAoXG4gICAgICBtaXBtYXAuY29tcHJlc3NlZCAmJlxuICAgICAgKFxuICAgICAgICBtaXBtYXAuaW50ZXJuYWxmb3JtYXQgPT09IEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgfHxcbiAgICAgICAgbWlwbWFwLmludGVybmFsZm9ybWF0ID09PSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCB8fFxuICAgICAgICBtaXBtYXAuaW50ZXJuYWxmb3JtYXQgPT09IEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUIHx8XG4gICAgICAgIG1pcG1hcC5pbnRlcm5hbGZvcm1hdCA9PT0gR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFRcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNoZWNrJDEobWlwbWFwLndpZHRoICUgNCA9PT0gMCAmJiBtaXBtYXAuaGVpZ2h0ICUgNCA9PT0gMCxcbiAgICAgICAgJ2ZvciBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0cywgbWlwbWFwIGxldmVsIDAgbXVzdCBoYXZlIHdpZHRoIGFuZCBoZWlnaHQgdGhhdCBhcmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRNaXBNYXAgKG1pcG1hcCwgdGFyZ2V0KSB7XG4gICAgdmFyIGltYWdlcyA9IG1pcG1hcC5pbWFnZXNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKCFpbWFnZXNbaV0pIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBzZXRJbWFnZShpbWFnZXNbaV0sIHRhcmdldCwgaSlcbiAgICB9XG4gIH1cblxuICB2YXIgbWlwUG9vbCA9IFtdXG5cbiAgZnVuY3Rpb24gYWxsb2NNaXBNYXAgKCkge1xuICAgIHZhciByZXN1bHQgPSBtaXBQb29sLnBvcCgpIHx8IG5ldyBNaXBNYXAoKVxuICAgIFRleEZsYWdzLmNhbGwocmVzdWx0KVxuICAgIHJlc3VsdC5taXBtYXNrID0gMFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgcmVzdWx0LmltYWdlc1tpXSA9IG51bGxcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gZnJlZU1pcE1hcCAobWlwbWFwKSB7XG4gICAgdmFyIGltYWdlcyA9IG1pcG1hcC5pbWFnZXNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGltYWdlc1tpXSkge1xuICAgICAgICBmcmVlSW1hZ2UoaW1hZ2VzW2ldKVxuICAgICAgfVxuICAgICAgaW1hZ2VzW2ldID0gbnVsbFxuICAgIH1cbiAgICBtaXBQb29sLnB1c2gobWlwbWFwKVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBUZXggaW5mb1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGZ1bmN0aW9uIFRleEluZm8gKCkge1xuICAgIHRoaXMubWluRmlsdGVyID0gR0xfTkVBUkVTVCQxXG4gICAgdGhpcy5tYWdGaWx0ZXIgPSBHTF9ORUFSRVNUJDFcblxuICAgIHRoaXMud3JhcFMgPSBHTF9DTEFNUF9UT19FREdFJDFcbiAgICB0aGlzLndyYXBUID0gR0xfQ0xBTVBfVE9fRURHRSQxXG5cbiAgICB0aGlzLmFuaXNvdHJvcGljID0gMVxuXG4gICAgdGhpcy5nZW5NaXBtYXBzID0gZmFsc2VcbiAgICB0aGlzLm1pcG1hcEhpbnQgPSBHTF9ET05UX0NBUkVcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlVGV4SW5mbyAoaW5mbywgb3B0aW9ucykge1xuICAgIGlmICgnbWluJyBpbiBvcHRpb25zKSB7XG4gICAgICB2YXIgbWluRmlsdGVyID0gb3B0aW9ucy5taW5cbiAgICAgIGNoZWNrJDEucGFyYW1ldGVyKG1pbkZpbHRlciwgbWluRmlsdGVycylcbiAgICAgIGluZm8ubWluRmlsdGVyID0gbWluRmlsdGVyc1ttaW5GaWx0ZXJdXG4gICAgICBpZiAoTUlQTUFQX0ZJTFRFUlMuaW5kZXhPZihpbmZvLm1pbkZpbHRlcikgPj0gMCAmJiAhKCdmYWNlcycgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgaW5mby5nZW5NaXBtYXBzID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgnbWFnJyBpbiBvcHRpb25zKSB7XG4gICAgICB2YXIgbWFnRmlsdGVyID0gb3B0aW9ucy5tYWdcbiAgICAgIGNoZWNrJDEucGFyYW1ldGVyKG1hZ0ZpbHRlciwgbWFnRmlsdGVycylcbiAgICAgIGluZm8ubWFnRmlsdGVyID0gbWFnRmlsdGVyc1ttYWdGaWx0ZXJdXG4gICAgfVxuXG4gICAgdmFyIHdyYXBTID0gaW5mby53cmFwU1xuICAgIHZhciB3cmFwVCA9IGluZm8ud3JhcFRcbiAgICBpZiAoJ3dyYXAnIGluIG9wdGlvbnMpIHtcbiAgICAgIHZhciB3cmFwID0gb3B0aW9ucy53cmFwXG4gICAgICBpZiAodHlwZW9mIHdyYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNoZWNrJDEucGFyYW1ldGVyKHdyYXAsIHdyYXBNb2RlcylcbiAgICAgICAgd3JhcFMgPSB3cmFwVCA9IHdyYXBNb2Rlc1t3cmFwXVxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHdyYXApKSB7XG4gICAgICAgIGNoZWNrJDEucGFyYW1ldGVyKHdyYXBbMF0sIHdyYXBNb2RlcylcbiAgICAgICAgY2hlY2skMS5wYXJhbWV0ZXIod3JhcFsxXSwgd3JhcE1vZGVzKVxuICAgICAgICB3cmFwUyA9IHdyYXBNb2Rlc1t3cmFwWzBdXVxuICAgICAgICB3cmFwVCA9IHdyYXBNb2Rlc1t3cmFwWzFdXVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoJ3dyYXBTJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIHZhciBvcHRXcmFwUyA9IG9wdGlvbnMud3JhcFNcbiAgICAgICAgY2hlY2skMS5wYXJhbWV0ZXIob3B0V3JhcFMsIHdyYXBNb2RlcylcbiAgICAgICAgd3JhcFMgPSB3cmFwTW9kZXNbb3B0V3JhcFNdXG4gICAgICB9XG4gICAgICBpZiAoJ3dyYXBUJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIHZhciBvcHRXcmFwVCA9IG9wdGlvbnMud3JhcFRcbiAgICAgICAgY2hlY2skMS5wYXJhbWV0ZXIob3B0V3JhcFQsIHdyYXBNb2RlcylcbiAgICAgICAgd3JhcFQgPSB3cmFwTW9kZXNbb3B0V3JhcFRdXG4gICAgICB9XG4gICAgfVxuICAgIGluZm8ud3JhcFMgPSB3cmFwU1xuICAgIGluZm8ud3JhcFQgPSB3cmFwVFxuXG4gICAgaWYgKCdhbmlzb3Ryb3BpYycgaW4gb3B0aW9ucykge1xuICAgICAgdmFyIGFuaXNvdHJvcGljID0gb3B0aW9ucy5hbmlzb3Ryb3BpY1xuICAgICAgY2hlY2skMSh0eXBlb2YgYW5pc290cm9waWMgPT09ICdudW1iZXInICYmXG4gICAgICAgICBhbmlzb3Ryb3BpYyA+PSAxICYmIGFuaXNvdHJvcGljIDw9IGxpbWl0cy5tYXhBbmlzb3Ryb3BpYyxcbiAgICAgICdhbmlzbyBzYW1wbGVzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAnKVxuICAgICAgaW5mby5hbmlzb3Ryb3BpYyA9IG9wdGlvbnMuYW5pc290cm9waWNcbiAgICB9XG5cbiAgICBpZiAoJ21pcG1hcCcgaW4gb3B0aW9ucykge1xuICAgICAgdmFyIGhhc01pcE1hcCA9IGZhbHNlXG4gICAgICBzd2l0Y2ggKHR5cGVvZiBvcHRpb25zLm1pcG1hcCkge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIGNoZWNrJDEucGFyYW1ldGVyKG9wdGlvbnMubWlwbWFwLCBtaXBtYXBIaW50LFxuICAgICAgICAgICAgJ2ludmFsaWQgbWlwbWFwIGhpbnQnKVxuICAgICAgICAgIGluZm8ubWlwbWFwSGludCA9IG1pcG1hcEhpbnRbb3B0aW9ucy5taXBtYXBdXG4gICAgICAgICAgaW5mby5nZW5NaXBtYXBzID0gdHJ1ZVxuICAgICAgICAgIGhhc01pcE1hcCA9IHRydWVcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgIGhhc01pcE1hcCA9IGluZm8uZ2VuTWlwbWFwcyA9IG9wdGlvbnMubWlwbWFwXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIGNoZWNrJDEoQXJyYXkuaXNBcnJheShvcHRpb25zLm1pcG1hcCksICdpbnZhbGlkIG1pcG1hcCB0eXBlJylcbiAgICAgICAgICBpbmZvLmdlbk1pcG1hcHMgPSBmYWxzZVxuICAgICAgICAgIGhhc01pcE1hcCA9IHRydWVcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2hlY2skMS5yYWlzZSgnaW52YWxpZCBtaXBtYXAgdHlwZScpXG4gICAgICB9XG4gICAgICBpZiAoaGFzTWlwTWFwICYmICEoJ21pbicgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgaW5mby5taW5GaWx0ZXIgPSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUJDFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRUZXhJbmZvIChpbmZvLCB0YXJnZXQpIHtcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKHRhcmdldCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBpbmZvLm1pbkZpbHRlcilcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKHRhcmdldCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBpbmZvLm1hZ0ZpbHRlcilcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKHRhcmdldCwgR0xfVEVYVFVSRV9XUkFQX1MsIGluZm8ud3JhcFMpXG4gICAgZ2wudGV4UGFyYW1ldGVyaSh0YXJnZXQsIEdMX1RFWFRVUkVfV1JBUF9ULCBpbmZvLndyYXBUKVxuICAgIGlmIChleHRlbnNpb25zLmV4dF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYykge1xuICAgICAgZ2wudGV4UGFyYW1ldGVyaSh0YXJnZXQsIEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCBpbmZvLmFuaXNvdHJvcGljKVxuICAgIH1cbiAgICBpZiAoaW5mby5nZW5NaXBtYXBzKSB7XG4gICAgICBnbC5oaW50KEdMX0dFTkVSQVRFX01JUE1BUF9ISU5ULCBpbmZvLm1pcG1hcEhpbnQpXG4gICAgICBnbC5nZW5lcmF0ZU1pcG1hcCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBGdWxsIHRleHR1cmUgb2JqZWN0XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgdmFyIHRleHR1cmVDb3VudCA9IDBcbiAgdmFyIHRleHR1cmVTZXQgPSB7fVxuICB2YXIgbnVtVGV4VW5pdHMgPSBsaW1pdHMubWF4VGV4dHVyZVVuaXRzXG4gIHZhciB0ZXh0dXJlVW5pdHMgPSBBcnJheShudW1UZXhVbml0cykubWFwKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9KVxuXG4gIGZ1bmN0aW9uIFJFR0xUZXh0dXJlICh0YXJnZXQpIHtcbiAgICBUZXhGbGFncy5jYWxsKHRoaXMpXG4gICAgdGhpcy5taXBtYXNrID0gMFxuICAgIHRoaXMuaW50ZXJuYWxmb3JtYXQgPSBHTF9SR0JBJDFcblxuICAgIHRoaXMuaWQgPSB0ZXh0dXJlQ291bnQrK1xuXG4gICAgdGhpcy5yZWZDb3VudCA9IDFcblxuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0XG4gICAgdGhpcy50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpXG5cbiAgICB0aGlzLnVuaXQgPSAtMVxuICAgIHRoaXMuYmluZENvdW50ID0gMFxuXG4gICAgdGhpcy50ZXhJbmZvID0gbmV3IFRleEluZm8oKVxuXG4gICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICB0aGlzLnN0YXRzID0geyBzaXplOiAwIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0ZW1wQmluZCAodGV4dHVyZSkge1xuICAgIGdsLmFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAkMSlcbiAgICBnbC5iaW5kVGV4dHVyZSh0ZXh0dXJlLnRhcmdldCwgdGV4dHVyZS50ZXh0dXJlKVxuICB9XG5cbiAgZnVuY3Rpb24gdGVtcFJlc3RvcmUgKCkge1xuICAgIHZhciBwcmV2ID0gdGV4dHVyZVVuaXRzWzBdXG4gICAgaWYgKHByZXYpIHtcbiAgICAgIGdsLmJpbmRUZXh0dXJlKHByZXYudGFyZ2V0LCBwcmV2LnRleHR1cmUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdsLmJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQkMSwgbnVsbClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95ICh0ZXh0dXJlKSB7XG4gICAgdmFyIGhhbmRsZSA9IHRleHR1cmUudGV4dHVyZVxuICAgIGNoZWNrJDEoaGFuZGxlLCAnbXVzdCBub3QgZG91YmxlIGRlc3Ryb3kgdGV4dHVyZScpXG4gICAgdmFyIHVuaXQgPSB0ZXh0dXJlLnVuaXRcbiAgICB2YXIgdGFyZ2V0ID0gdGV4dHVyZS50YXJnZXRcbiAgICBpZiAodW5pdCA+PSAwKSB7XG4gICAgICBnbC5hY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwJDEgKyB1bml0KVxuICAgICAgZ2wuYmluZFRleHR1cmUodGFyZ2V0LCBudWxsKVxuICAgICAgdGV4dHVyZVVuaXRzW3VuaXRdID0gbnVsbFxuICAgIH1cbiAgICBnbC5kZWxldGVUZXh0dXJlKGhhbmRsZSlcbiAgICB0ZXh0dXJlLnRleHR1cmUgPSBudWxsXG4gICAgdGV4dHVyZS5wYXJhbXMgPSBudWxsXG4gICAgdGV4dHVyZS5waXhlbHMgPSBudWxsXG4gICAgdGV4dHVyZS5yZWZDb3VudCA9IDBcbiAgICBkZWxldGUgdGV4dHVyZVNldFt0ZXh0dXJlLmlkXVxuICAgIHN0YXRzLnRleHR1cmVDb3VudC0tXG4gIH1cblxuICBleHRlbmQoUkVHTFRleHR1cmUucHJvdG90eXBlLCB7XG4gICAgYmluZDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRleHR1cmUgPSB0aGlzXG4gICAgICB0ZXh0dXJlLmJpbmRDb3VudCArPSAxXG4gICAgICB2YXIgdW5pdCA9IHRleHR1cmUudW5pdFxuICAgICAgaWYgKHVuaXQgPCAwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVGV4VW5pdHM7ICsraSkge1xuICAgICAgICAgIHZhciBvdGhlciA9IHRleHR1cmVVbml0c1tpXVxuICAgICAgICAgIGlmIChvdGhlcikge1xuICAgICAgICAgICAgaWYgKG90aGVyLmJpbmRDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG90aGVyLnVuaXQgPSAtMVxuICAgICAgICAgIH1cbiAgICAgICAgICB0ZXh0dXJlVW5pdHNbaV0gPSB0ZXh0dXJlXG4gICAgICAgICAgdW5pdCA9IGlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bml0ID49IG51bVRleFVuaXRzKSB7XG4gICAgICAgICAgY2hlY2skMS5yYWlzZSgnaW5zdWZmaWNpZW50IG51bWJlciBvZiB0ZXh0dXJlIHVuaXRzJylcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnByb2ZpbGUgJiYgc3RhdHMubWF4VGV4dHVyZVVuaXRzIDwgKHVuaXQgKyAxKSkge1xuICAgICAgICAgIHN0YXRzLm1heFRleHR1cmVVbml0cyA9IHVuaXQgKyAxIC8vICsxLCBzaW5jZSB0aGUgdW5pdHMgYXJlIHplcm8tYmFzZWRcbiAgICAgICAgfVxuICAgICAgICB0ZXh0dXJlLnVuaXQgPSB1bml0XG4gICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAkMSArIHVuaXQpXG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKHRleHR1cmUudGFyZ2V0LCB0ZXh0dXJlLnRleHR1cmUpXG4gICAgICB9XG4gICAgICByZXR1cm4gdW5pdFxuICAgIH0sXG5cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuYmluZENvdW50IC09IDFcbiAgICB9LFxuXG4gICAgZGVjUmVmOiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoLS10aGlzLnJlZkNvdW50IDw9IDApIHtcbiAgICAgICAgZGVzdHJveSh0aGlzKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlMkQgKGEsIGIpIHtcbiAgICB2YXIgdGV4dHVyZSA9IG5ldyBSRUdMVGV4dHVyZShHTF9URVhUVVJFXzJEJDEpXG4gICAgdGV4dHVyZVNldFt0ZXh0dXJlLmlkXSA9IHRleHR1cmVcbiAgICBzdGF0cy50ZXh0dXJlQ291bnQrK1xuXG4gICAgZnVuY3Rpb24gcmVnbFRleHR1cmUyRCAoYSwgYikge1xuICAgICAgdmFyIHRleEluZm8gPSB0ZXh0dXJlLnRleEluZm9cbiAgICAgIFRleEluZm8uY2FsbCh0ZXhJbmZvKVxuICAgICAgdmFyIG1pcERhdGEgPSBhbGxvY01pcE1hcCgpXG5cbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHBhcnNlTWlwTWFwRnJvbVNoYXBlKG1pcERhdGEsIGEgfCAwLCBiIHwgMClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJzZU1pcE1hcEZyb21TaGFwZShtaXBEYXRhLCBhIHwgMCwgYSB8IDApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYSkge1xuICAgICAgICBjaGVjayQxLnR5cGUoYSwgJ29iamVjdCcsICdpbnZhbGlkIGFyZ3VtZW50cyB0byByZWdsLnRleHR1cmUnKVxuICAgICAgICBwYXJzZVRleEluZm8odGV4SW5mbywgYSlcbiAgICAgICAgcGFyc2VNaXBNYXBGcm9tT2JqZWN0KG1pcERhdGEsIGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlbXB0eSB0ZXh0dXJlcyBnZXQgYXNzaWduZWQgYSBkZWZhdWx0IHNoYXBlIG9mIDF4MVxuICAgICAgICBwYXJzZU1pcE1hcEZyb21TaGFwZShtaXBEYXRhLCAxLCAxKVxuICAgICAgfVxuXG4gICAgICBpZiAodGV4SW5mby5nZW5NaXBtYXBzKSB7XG4gICAgICAgIG1pcERhdGEubWlwbWFzayA9IChtaXBEYXRhLndpZHRoIDw8IDEpIC0gMVxuICAgICAgfVxuICAgICAgdGV4dHVyZS5taXBtYXNrID0gbWlwRGF0YS5taXBtYXNrXG5cbiAgICAgIGNvcHlGbGFncyh0ZXh0dXJlLCBtaXBEYXRhKVxuXG4gICAgICBjaGVjayQxLnRleHR1cmUyRCh0ZXhJbmZvLCBtaXBEYXRhLCBsaW1pdHMpXG4gICAgICB0ZXh0dXJlLmludGVybmFsZm9ybWF0ID0gbWlwRGF0YS5pbnRlcm5hbGZvcm1hdFxuXG4gICAgICByZWdsVGV4dHVyZTJELndpZHRoID0gbWlwRGF0YS53aWR0aFxuICAgICAgcmVnbFRleHR1cmUyRC5oZWlnaHQgPSBtaXBEYXRhLmhlaWdodFxuXG4gICAgICB0ZW1wQmluZCh0ZXh0dXJlKVxuICAgICAgc2V0TWlwTWFwKG1pcERhdGEsIEdMX1RFWFRVUkVfMkQkMSlcbiAgICAgIHNldFRleEluZm8odGV4SW5mbywgR0xfVEVYVFVSRV8yRCQxKVxuICAgICAgdGVtcFJlc3RvcmUoKVxuXG4gICAgICBmcmVlTWlwTWFwKG1pcERhdGEpXG5cbiAgICAgIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgICAgICB0ZXh0dXJlLnN0YXRzLnNpemUgPSBnZXRUZXh0dXJlU2l6ZShcbiAgICAgICAgICB0ZXh0dXJlLmludGVybmFsZm9ybWF0LFxuICAgICAgICAgIHRleHR1cmUudHlwZSxcbiAgICAgICAgICBtaXBEYXRhLndpZHRoLFxuICAgICAgICAgIG1pcERhdGEuaGVpZ2h0LFxuICAgICAgICAgIHRleEluZm8uZ2VuTWlwbWFwcyxcbiAgICAgICAgICBmYWxzZSlcbiAgICAgIH1cbiAgICAgIHJlZ2xUZXh0dXJlMkQuZm9ybWF0ID0gdGV4dHVyZUZvcm1hdHNJbnZlcnRbdGV4dHVyZS5pbnRlcm5hbGZvcm1hdF1cbiAgICAgIHJlZ2xUZXh0dXJlMkQudHlwZSA9IHRleHR1cmVUeXBlc0ludmVydFt0ZXh0dXJlLnR5cGVdXG5cbiAgICAgIHJlZ2xUZXh0dXJlMkQubWFnID0gbWFnRmlsdGVyc0ludmVydFt0ZXhJbmZvLm1hZ0ZpbHRlcl1cbiAgICAgIHJlZ2xUZXh0dXJlMkQubWluID0gbWluRmlsdGVyc0ludmVydFt0ZXhJbmZvLm1pbkZpbHRlcl1cblxuICAgICAgcmVnbFRleHR1cmUyRC53cmFwUyA9IHdyYXBNb2Rlc0ludmVydFt0ZXhJbmZvLndyYXBTXVxuICAgICAgcmVnbFRleHR1cmUyRC53cmFwVCA9IHdyYXBNb2Rlc0ludmVydFt0ZXhJbmZvLndyYXBUXVxuXG4gICAgICByZXR1cm4gcmVnbFRleHR1cmUyRFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN1YmltYWdlIChpbWFnZSwgeF8sIHlfLCBsZXZlbF8pIHtcbiAgICAgIGNoZWNrJDEoISFpbWFnZSwgJ211c3Qgc3BlY2lmeSBpbWFnZSBkYXRhJylcblxuICAgICAgdmFyIHggPSB4XyB8IDBcbiAgICAgIHZhciB5ID0geV8gfCAwXG4gICAgICB2YXIgbGV2ZWwgPSBsZXZlbF8gfCAwXG5cbiAgICAgIHZhciBpbWFnZURhdGEgPSBhbGxvY0ltYWdlKClcbiAgICAgIGNvcHlGbGFncyhpbWFnZURhdGEsIHRleHR1cmUpXG4gICAgICBpbWFnZURhdGEud2lkdGggPSAwXG4gICAgICBpbWFnZURhdGEuaGVpZ2h0ID0gMFxuICAgICAgcGFyc2VJbWFnZShpbWFnZURhdGEsIGltYWdlKVxuICAgICAgaW1hZ2VEYXRhLndpZHRoID0gaW1hZ2VEYXRhLndpZHRoIHx8ICgodGV4dHVyZS53aWR0aCA+PiBsZXZlbCkgLSB4KVxuICAgICAgaW1hZ2VEYXRhLmhlaWdodCA9IGltYWdlRGF0YS5oZWlnaHQgfHwgKCh0ZXh0dXJlLmhlaWdodCA+PiBsZXZlbCkgLSB5KVxuXG4gICAgICBjaGVjayQxKFxuICAgICAgICB0ZXh0dXJlLnR5cGUgPT09IGltYWdlRGF0YS50eXBlICYmXG4gICAgICAgIHRleHR1cmUuZm9ybWF0ID09PSBpbWFnZURhdGEuZm9ybWF0ICYmXG4gICAgICAgIHRleHR1cmUuaW50ZXJuYWxmb3JtYXQgPT09IGltYWdlRGF0YS5pbnRlcm5hbGZvcm1hdCxcbiAgICAgICAgJ2luY29tcGF0aWJsZSBmb3JtYXQgZm9yIHRleHR1cmUuc3ViaW1hZ2UnKVxuICAgICAgY2hlY2skMShcbiAgICAgICAgeCA+PSAwICYmIHkgPj0gMCAmJlxuICAgICAgICB4ICsgaW1hZ2VEYXRhLndpZHRoIDw9IHRleHR1cmUud2lkdGggJiZcbiAgICAgICAgeSArIGltYWdlRGF0YS5oZWlnaHQgPD0gdGV4dHVyZS5oZWlnaHQsXG4gICAgICAgICd0ZXh0dXJlLnN1YmltYWdlIHdyaXRlIG91dCBvZiBib3VuZHMnKVxuICAgICAgY2hlY2skMShcbiAgICAgICAgdGV4dHVyZS5taXBtYXNrICYgKDEgPDwgbGV2ZWwpLFxuICAgICAgICAnbWlzc2luZyBtaXBtYXAgZGF0YScpXG4gICAgICBjaGVjayQxKFxuICAgICAgICBpbWFnZURhdGEuZGF0YSB8fCBpbWFnZURhdGEuZWxlbWVudCB8fCBpbWFnZURhdGEubmVlZHNDb3B5LFxuICAgICAgICAnbWlzc2luZyBpbWFnZSBkYXRhJylcblxuICAgICAgdGVtcEJpbmQodGV4dHVyZSlcbiAgICAgIHNldFN1YkltYWdlKGltYWdlRGF0YSwgR0xfVEVYVFVSRV8yRCQxLCB4LCB5LCBsZXZlbClcbiAgICAgIHRlbXBSZXN0b3JlKClcblxuICAgICAgZnJlZUltYWdlKGltYWdlRGF0YSlcblxuICAgICAgcmV0dXJuIHJlZ2xUZXh0dXJlMkRcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemUgKHdfLCBoXykge1xuICAgICAgdmFyIHcgPSB3XyB8IDBcbiAgICAgIHZhciBoID0gKGhfIHwgMCkgfHwgd1xuICAgICAgaWYgKHcgPT09IHRleHR1cmUud2lkdGggJiYgaCA9PT0gdGV4dHVyZS5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2xUZXh0dXJlMkRcbiAgICAgIH1cblxuICAgICAgcmVnbFRleHR1cmUyRC53aWR0aCA9IHRleHR1cmUud2lkdGggPSB3XG4gICAgICByZWdsVGV4dHVyZTJELmhlaWdodCA9IHRleHR1cmUuaGVpZ2h0ID0gaFxuXG4gICAgICB0ZW1wQmluZCh0ZXh0dXJlKVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgdGV4dHVyZS5taXBtYXNrID4+IGk7ICsraSkge1xuICAgICAgICB2YXIgX3cgPSB3ID4+IGlcbiAgICAgICAgdmFyIF9oID0gaCA+PiBpXG4gICAgICAgIGlmICghX3cgfHwgIV9oKSBicmVha1xuICAgICAgICBnbC50ZXhJbWFnZTJEKFxuICAgICAgICAgIEdMX1RFWFRVUkVfMkQkMSxcbiAgICAgICAgICBpLFxuICAgICAgICAgIHRleHR1cmUuZm9ybWF0LFxuICAgICAgICAgIF93LFxuICAgICAgICAgIF9oLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgdGV4dHVyZS5mb3JtYXQsXG4gICAgICAgICAgdGV4dHVyZS50eXBlLFxuICAgICAgICAgIG51bGwpXG4gICAgICB9XG4gICAgICB0ZW1wUmVzdG9yZSgpXG5cbiAgICAgIC8vIGFsc28sIHJlY29tcHV0ZSB0aGUgdGV4dHVyZSBzaXplLlxuICAgICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICAgIHRleHR1cmUuc3RhdHMuc2l6ZSA9IGdldFRleHR1cmVTaXplKFxuICAgICAgICAgIHRleHR1cmUuaW50ZXJuYWxmb3JtYXQsXG4gICAgICAgICAgdGV4dHVyZS50eXBlLFxuICAgICAgICAgIHcsXG4gICAgICAgICAgaCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBmYWxzZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZ2xUZXh0dXJlMkRcbiAgICB9XG5cbiAgICByZWdsVGV4dHVyZTJEKGEsIGIpXG5cbiAgICByZWdsVGV4dHVyZTJELnN1YmltYWdlID0gc3ViaW1hZ2VcbiAgICByZWdsVGV4dHVyZTJELnJlc2l6ZSA9IHJlc2l6ZVxuICAgIHJlZ2xUZXh0dXJlMkQuX3JlZ2xUeXBlID0gJ3RleHR1cmUyZCdcbiAgICByZWdsVGV4dHVyZTJELl90ZXh0dXJlID0gdGV4dHVyZVxuICAgIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgICAgcmVnbFRleHR1cmUyRC5zdGF0cyA9IHRleHR1cmUuc3RhdHNcbiAgICB9XG4gICAgcmVnbFRleHR1cmUyRC5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGV4dHVyZS5kZWNSZWYoKVxuICAgIH1cblxuICAgIHJldHVybiByZWdsVGV4dHVyZTJEXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlQ3ViZSAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICAgIHZhciB0ZXh0dXJlID0gbmV3IFJFR0xUZXh0dXJlKEdMX1RFWFRVUkVfQ1VCRV9NQVAkMSlcbiAgICB0ZXh0dXJlU2V0W3RleHR1cmUuaWRdID0gdGV4dHVyZVxuICAgIHN0YXRzLmN1YmVDb3VudCsrXG5cbiAgICB2YXIgZmFjZXMgPSBuZXcgQXJyYXkoNilcblxuICAgIGZ1bmN0aW9uIHJlZ2xUZXh0dXJlQ3ViZSAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICAgICAgdmFyIGlcbiAgICAgIHZhciB0ZXhJbmZvID0gdGV4dHVyZS50ZXhJbmZvXG4gICAgICBUZXhJbmZvLmNhbGwodGV4SW5mbylcbiAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHtcbiAgICAgICAgZmFjZXNbaV0gPSBhbGxvY01pcE1hcCgpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgYTAgPT09ICdudW1iZXInIHx8ICFhMCkge1xuICAgICAgICB2YXIgcyA9IChhMCB8IDApIHx8IDFcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICAgIHBhcnNlTWlwTWFwRnJvbVNoYXBlKGZhY2VzW2ldLCBzLCBzKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhMCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGExKSB7XG4gICAgICAgICAgcGFyc2VNaXBNYXBGcm9tT2JqZWN0KGZhY2VzWzBdLCBhMClcbiAgICAgICAgICBwYXJzZU1pcE1hcEZyb21PYmplY3QoZmFjZXNbMV0sIGExKVxuICAgICAgICAgIHBhcnNlTWlwTWFwRnJvbU9iamVjdChmYWNlc1syXSwgYTIpXG4gICAgICAgICAgcGFyc2VNaXBNYXBGcm9tT2JqZWN0KGZhY2VzWzNdLCBhMylcbiAgICAgICAgICBwYXJzZU1pcE1hcEZyb21PYmplY3QoZmFjZXNbNF0sIGE0KVxuICAgICAgICAgIHBhcnNlTWlwTWFwRnJvbU9iamVjdChmYWNlc1s1XSwgYTUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyc2VUZXhJbmZvKHRleEluZm8sIGEwKVxuICAgICAgICAgIHBhcnNlRmxhZ3ModGV4dHVyZSwgYTApXG4gICAgICAgICAgaWYgKCdmYWNlcycgaW4gYTApIHtcbiAgICAgICAgICAgIHZhciBmYWNlSW5wdXQgPSBhMC5mYWNlc1xuICAgICAgICAgICAgY2hlY2skMShBcnJheS5pc0FycmF5KGZhY2VJbnB1dCkgJiYgZmFjZUlucHV0Lmxlbmd0aCA9PT0gNixcbiAgICAgICAgICAgICAgJ2N1YmUgZmFjZXMgbXVzdCBiZSBhIGxlbmd0aCA2IGFycmF5JylcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHtcbiAgICAgICAgICAgICAgY2hlY2skMSh0eXBlb2YgZmFjZUlucHV0W2ldID09PSAnb2JqZWN0JyAmJiAhIWZhY2VJbnB1dFtpXSxcbiAgICAgICAgICAgICAgICAnaW52YWxpZCBpbnB1dCBmb3IgY3ViZSBtYXAgZmFjZScpXG4gICAgICAgICAgICAgIGNvcHlGbGFncyhmYWNlc1tpXSwgdGV4dHVyZSlcbiAgICAgICAgICAgICAgcGFyc2VNaXBNYXBGcm9tT2JqZWN0KGZhY2VzW2ldLCBmYWNlSW5wdXRbaV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHtcbiAgICAgICAgICAgICAgcGFyc2VNaXBNYXBGcm9tT2JqZWN0KGZhY2VzW2ldLCBhMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrJDEucmFpc2UoJ2ludmFsaWQgYXJndW1lbnRzIHRvIGN1YmUgbWFwJylcbiAgICAgIH1cblxuICAgICAgY29weUZsYWdzKHRleHR1cmUsIGZhY2VzWzBdKVxuXG4gICAgICBpZiAoIWxpbWl0cy5ucG90VGV4dHVyZUN1YmUpIHtcbiAgICAgICAgY2hlY2skMShpc1BvdzIkMSh0ZXh0dXJlLndpZHRoKSAmJiBpc1BvdzIkMSh0ZXh0dXJlLmhlaWdodCksICd5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBub24gcG93ZXIgb3IgdHdvIHRleHR1cmUgZGltZW5zaW9ucycpXG4gICAgICB9XG5cbiAgICAgIGlmICh0ZXhJbmZvLmdlbk1pcG1hcHMpIHtcbiAgICAgICAgdGV4dHVyZS5taXBtYXNrID0gKGZhY2VzWzBdLndpZHRoIDw8IDEpIC0gMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dHVyZS5taXBtYXNrID0gZmFjZXNbMF0ubWlwbWFza1xuICAgICAgfVxuXG4gICAgICBjaGVjayQxLnRleHR1cmVDdWJlKHRleHR1cmUsIHRleEluZm8sIGZhY2VzLCBsaW1pdHMpXG4gICAgICB0ZXh0dXJlLmludGVybmFsZm9ybWF0ID0gZmFjZXNbMF0uaW50ZXJuYWxmb3JtYXRcblxuICAgICAgcmVnbFRleHR1cmVDdWJlLndpZHRoID0gZmFjZXNbMF0ud2lkdGhcbiAgICAgIHJlZ2xUZXh0dXJlQ3ViZS5oZWlnaHQgPSBmYWNlc1swXS5oZWlnaHRcblxuICAgICAgdGVtcEJpbmQodGV4dHVyZSlcbiAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHtcbiAgICAgICAgc2V0TWlwTWFwKGZhY2VzW2ldLCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gkMSArIGkpXG4gICAgICB9XG4gICAgICBzZXRUZXhJbmZvKHRleEluZm8sIEdMX1RFWFRVUkVfQ1VCRV9NQVAkMSlcbiAgICAgIHRlbXBSZXN0b3JlKClcblxuICAgICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICAgIHRleHR1cmUuc3RhdHMuc2l6ZSA9IGdldFRleHR1cmVTaXplKFxuICAgICAgICAgIHRleHR1cmUuaW50ZXJuYWxmb3JtYXQsXG4gICAgICAgICAgdGV4dHVyZS50eXBlLFxuICAgICAgICAgIHJlZ2xUZXh0dXJlQ3ViZS53aWR0aCxcbiAgICAgICAgICByZWdsVGV4dHVyZUN1YmUuaGVpZ2h0LFxuICAgICAgICAgIHRleEluZm8uZ2VuTWlwbWFwcyxcbiAgICAgICAgICB0cnVlKVxuICAgICAgfVxuXG4gICAgICByZWdsVGV4dHVyZUN1YmUuZm9ybWF0ID0gdGV4dHVyZUZvcm1hdHNJbnZlcnRbdGV4dHVyZS5pbnRlcm5hbGZvcm1hdF1cbiAgICAgIHJlZ2xUZXh0dXJlQ3ViZS50eXBlID0gdGV4dHVyZVR5cGVzSW52ZXJ0W3RleHR1cmUudHlwZV1cblxuICAgICAgcmVnbFRleHR1cmVDdWJlLm1hZyA9IG1hZ0ZpbHRlcnNJbnZlcnRbdGV4SW5mby5tYWdGaWx0ZXJdXG4gICAgICByZWdsVGV4dHVyZUN1YmUubWluID0gbWluRmlsdGVyc0ludmVydFt0ZXhJbmZvLm1pbkZpbHRlcl1cblxuICAgICAgcmVnbFRleHR1cmVDdWJlLndyYXBTID0gd3JhcE1vZGVzSW52ZXJ0W3RleEluZm8ud3JhcFNdXG4gICAgICByZWdsVGV4dHVyZUN1YmUud3JhcFQgPSB3cmFwTW9kZXNJbnZlcnRbdGV4SW5mby53cmFwVF1cblxuICAgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICBmcmVlTWlwTWFwKGZhY2VzW2ldKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVnbFRleHR1cmVDdWJlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ViaW1hZ2UgKGZhY2UsIGltYWdlLCB4XywgeV8sIGxldmVsXykge1xuICAgICAgY2hlY2skMSghIWltYWdlLCAnbXVzdCBzcGVjaWZ5IGltYWdlIGRhdGEnKVxuICAgICAgY2hlY2skMSh0eXBlb2YgZmFjZSA9PT0gJ251bWJlcicgJiYgZmFjZSA9PT0gKGZhY2UgfCAwKSAmJlxuICAgICAgICBmYWNlID49IDAgJiYgZmFjZSA8IDYsICdpbnZhbGlkIGZhY2UnKVxuXG4gICAgICB2YXIgeCA9IHhfIHwgMFxuICAgICAgdmFyIHkgPSB5XyB8IDBcbiAgICAgIHZhciBsZXZlbCA9IGxldmVsXyB8IDBcblxuICAgICAgdmFyIGltYWdlRGF0YSA9IGFsbG9jSW1hZ2UoKVxuICAgICAgY29weUZsYWdzKGltYWdlRGF0YSwgdGV4dHVyZSlcbiAgICAgIGltYWdlRGF0YS53aWR0aCA9IDBcbiAgICAgIGltYWdlRGF0YS5oZWlnaHQgPSAwXG4gICAgICBwYXJzZUltYWdlKGltYWdlRGF0YSwgaW1hZ2UpXG4gICAgICBpbWFnZURhdGEud2lkdGggPSBpbWFnZURhdGEud2lkdGggfHwgKCh0ZXh0dXJlLndpZHRoID4+IGxldmVsKSAtIHgpXG4gICAgICBpbWFnZURhdGEuaGVpZ2h0ID0gaW1hZ2VEYXRhLmhlaWdodCB8fCAoKHRleHR1cmUuaGVpZ2h0ID4+IGxldmVsKSAtIHkpXG5cbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIHRleHR1cmUudHlwZSA9PT0gaW1hZ2VEYXRhLnR5cGUgJiZcbiAgICAgICAgdGV4dHVyZS5mb3JtYXQgPT09IGltYWdlRGF0YS5mb3JtYXQgJiZcbiAgICAgICAgdGV4dHVyZS5pbnRlcm5hbGZvcm1hdCA9PT0gaW1hZ2VEYXRhLmludGVybmFsZm9ybWF0LFxuICAgICAgICAnaW5jb21wYXRpYmxlIGZvcm1hdCBmb3IgdGV4dHVyZS5zdWJpbWFnZScpXG4gICAgICBjaGVjayQxKFxuICAgICAgICB4ID49IDAgJiYgeSA+PSAwICYmXG4gICAgICAgIHggKyBpbWFnZURhdGEud2lkdGggPD0gdGV4dHVyZS53aWR0aCAmJlxuICAgICAgICB5ICsgaW1hZ2VEYXRhLmhlaWdodCA8PSB0ZXh0dXJlLmhlaWdodCxcbiAgICAgICAgJ3RleHR1cmUuc3ViaW1hZ2Ugd3JpdGUgb3V0IG9mIGJvdW5kcycpXG4gICAgICBjaGVjayQxKFxuICAgICAgICB0ZXh0dXJlLm1pcG1hc2sgJiAoMSA8PCBsZXZlbCksXG4gICAgICAgICdtaXNzaW5nIG1pcG1hcCBkYXRhJylcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIGltYWdlRGF0YS5kYXRhIHx8IGltYWdlRGF0YS5lbGVtZW50IHx8IGltYWdlRGF0YS5uZWVkc0NvcHksXG4gICAgICAgICdtaXNzaW5nIGltYWdlIGRhdGEnKVxuXG4gICAgICB0ZW1wQmluZCh0ZXh0dXJlKVxuICAgICAgc2V0U3ViSW1hZ2UoaW1hZ2VEYXRhLCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gkMSArIGZhY2UsIHgsIHksIGxldmVsKVxuICAgICAgdGVtcFJlc3RvcmUoKVxuXG4gICAgICBmcmVlSW1hZ2UoaW1hZ2VEYXRhKVxuXG4gICAgICByZXR1cm4gcmVnbFRleHR1cmVDdWJlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzaXplIChyYWRpdXNfKSB7XG4gICAgICB2YXIgcmFkaXVzID0gcmFkaXVzXyB8IDBcbiAgICAgIGlmIChyYWRpdXMgPT09IHRleHR1cmUud2lkdGgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHJlZ2xUZXh0dXJlQ3ViZS53aWR0aCA9IHRleHR1cmUud2lkdGggPSByYWRpdXNcbiAgICAgIHJlZ2xUZXh0dXJlQ3ViZS5oZWlnaHQgPSB0ZXh0dXJlLmhlaWdodCA9IHJhZGl1c1xuXG4gICAgICB0ZW1wQmluZCh0ZXh0dXJlKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyArK2kpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IHRleHR1cmUubWlwbWFzayA+PiBqOyArK2opIHtcbiAgICAgICAgICBnbC50ZXhJbWFnZTJEKFxuICAgICAgICAgICAgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YJDEgKyBpLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIHRleHR1cmUuZm9ybWF0LFxuICAgICAgICAgICAgcmFkaXVzID4+IGosXG4gICAgICAgICAgICByYWRpdXMgPj4gaixcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0ZXh0dXJlLmZvcm1hdCxcbiAgICAgICAgICAgIHRleHR1cmUudHlwZSxcbiAgICAgICAgICAgIG51bGwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRlbXBSZXN0b3JlKClcblxuICAgICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICAgIHRleHR1cmUuc3RhdHMuc2l6ZSA9IGdldFRleHR1cmVTaXplKFxuICAgICAgICAgIHRleHR1cmUuaW50ZXJuYWxmb3JtYXQsXG4gICAgICAgICAgdGV4dHVyZS50eXBlLFxuICAgICAgICAgIHJlZ2xUZXh0dXJlQ3ViZS53aWR0aCxcbiAgICAgICAgICByZWdsVGV4dHVyZUN1YmUuaGVpZ2h0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHRydWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWdsVGV4dHVyZUN1YmVcbiAgICB9XG5cbiAgICByZWdsVGV4dHVyZUN1YmUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSlcblxuICAgIHJlZ2xUZXh0dXJlQ3ViZS5zdWJpbWFnZSA9IHN1YmltYWdlXG4gICAgcmVnbFRleHR1cmVDdWJlLnJlc2l6ZSA9IHJlc2l6ZVxuICAgIHJlZ2xUZXh0dXJlQ3ViZS5fcmVnbFR5cGUgPSAndGV4dHVyZUN1YmUnXG4gICAgcmVnbFRleHR1cmVDdWJlLl90ZXh0dXJlID0gdGV4dHVyZVxuICAgIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgICAgcmVnbFRleHR1cmVDdWJlLnN0YXRzID0gdGV4dHVyZS5zdGF0c1xuICAgIH1cbiAgICByZWdsVGV4dHVyZUN1YmUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRleHR1cmUuZGVjUmVmKClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVnbFRleHR1cmVDdWJlXG4gIH1cblxuICAvLyBDYWxsZWQgd2hlbiByZWdsIGlzIGRlc3Ryb3llZFxuICBmdW5jdGlvbiBkZXN0cm95VGV4dHVyZXMgKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVGV4VW5pdHM7ICsraSkge1xuICAgICAgZ2wuYWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCQxICsgaSlcbiAgICAgIGdsLmJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQkMSwgbnVsbClcbiAgICAgIHRleHR1cmVVbml0c1tpXSA9IG51bGxcbiAgICB9XG4gICAgdmFsdWVzKHRleHR1cmVTZXQpLmZvckVhY2goZGVzdHJveSlcblxuICAgIHN0YXRzLmN1YmVDb3VudCA9IDBcbiAgICBzdGF0cy50ZXh0dXJlQ291bnQgPSAwXG4gIH1cblxuICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICBzdGF0cy5nZXRUb3RhbFRleHR1cmVTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRvdGFsID0gMFxuICAgICAgT2JqZWN0LmtleXModGV4dHVyZVNldCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHRvdGFsICs9IHRleHR1cmVTZXRba2V5XS5zdGF0cy5zaXplXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHRvdGFsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdG9yZVRleHR1cmVzICgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVRleFVuaXRzOyArK2kpIHtcbiAgICAgIHZhciB0ZXggPSB0ZXh0dXJlVW5pdHNbaV1cbiAgICAgIGlmICh0ZXgpIHtcbiAgICAgICAgdGV4LmJpbmRDb3VudCA9IDBcbiAgICAgICAgdGV4LnVuaXQgPSAtMVxuICAgICAgICB0ZXh0dXJlVW5pdHNbaV0gPSBudWxsXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsdWVzKHRleHR1cmVTZXQpLmZvckVhY2goZnVuY3Rpb24gKHRleHR1cmUpIHtcbiAgICAgIHRleHR1cmUudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKVxuICAgICAgZ2wuYmluZFRleHR1cmUodGV4dHVyZS50YXJnZXQsIHRleHR1cmUudGV4dHVyZSlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7ICsraSkge1xuICAgICAgICBpZiAoKHRleHR1cmUubWlwbWFzayAmICgxIDw8IGkpKSA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHR1cmUudGFyZ2V0ID09PSBHTF9URVhUVVJFXzJEJDEpIHtcbiAgICAgICAgICBnbC50ZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQkMSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICB0ZXh0dXJlLmludGVybmFsZm9ybWF0LFxuICAgICAgICAgICAgdGV4dHVyZS53aWR0aCA+PiBpLFxuICAgICAgICAgICAgdGV4dHVyZS5oZWlnaHQgPj4gaSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0ZXh0dXJlLmludGVybmFsZm9ybWF0LFxuICAgICAgICAgICAgdGV4dHVyZS50eXBlLFxuICAgICAgICAgICAgbnVsbClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDY7ICsraikge1xuICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gkMSArIGosXG4gICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgIHRleHR1cmUuaW50ZXJuYWxmb3JtYXQsXG4gICAgICAgICAgICAgIHRleHR1cmUud2lkdGggPj4gaSxcbiAgICAgICAgICAgICAgdGV4dHVyZS5oZWlnaHQgPj4gaSxcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgdGV4dHVyZS5pbnRlcm5hbGZvcm1hdCxcbiAgICAgICAgICAgICAgdGV4dHVyZS50eXBlLFxuICAgICAgICAgICAgICBudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0VGV4SW5mbyh0ZXh0dXJlLnRleEluZm8sIHRleHR1cmUudGFyZ2V0KVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiByZWZyZXNoVGV4dHVyZXMgKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVGV4VW5pdHM7ICsraSkge1xuICAgICAgdmFyIHRleCA9IHRleHR1cmVVbml0c1tpXVxuICAgICAgaWYgKHRleCkge1xuICAgICAgICB0ZXguYmluZENvdW50ID0gMFxuICAgICAgICB0ZXgudW5pdCA9IC0xXG4gICAgICAgIHRleHR1cmVVbml0c1tpXSA9IG51bGxcbiAgICAgIH1cbiAgICAgIGdsLmFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAkMSArIGkpXG4gICAgICBnbC5iaW5kVGV4dHVyZShHTF9URVhUVVJFXzJEJDEsIG51bGwpXG4gICAgICBnbC5iaW5kVGV4dHVyZShHTF9URVhUVVJFX0NVQkVfTUFQJDEsIG51bGwpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjcmVhdGUyRDogY3JlYXRlVGV4dHVyZTJELFxuICAgIGNyZWF0ZUN1YmU6IGNyZWF0ZVRleHR1cmVDdWJlLFxuICAgIGNsZWFyOiBkZXN0cm95VGV4dHVyZXMsXG4gICAgZ2V0VGV4dHVyZTogZnVuY3Rpb24gKHdyYXBwZXIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcbiAgICByZXN0b3JlOiByZXN0b3JlVGV4dHVyZXMsXG4gICAgcmVmcmVzaDogcmVmcmVzaFRleHR1cmVzXG4gIH1cbn1cblxudmFyIEdMX1JFTkRFUkJVRkZFUiA9IDB4OEQ0MVxuXG52YXIgR0xfUkdCQTQkMSA9IDB4ODA1NlxudmFyIEdMX1JHQjVfQTEkMSA9IDB4ODA1N1xudmFyIEdMX1JHQjU2NSQxID0gMHg4RDYyXG52YXIgR0xfREVQVEhfQ09NUE9ORU5UMTYgPSAweDgxQTVcbnZhciBHTF9TVEVOQ0lMX0lOREVYOCA9IDB4OEQ0OFxudmFyIEdMX0RFUFRIX1NURU5DSUwkMSA9IDB4ODRGOVxuXG52YXIgR0xfU1JHQjhfQUxQSEE4X0VYVCA9IDB4OEM0M1xuXG52YXIgR0xfUkdCQTMyRl9FWFQgPSAweDg4MTRcblxudmFyIEdMX1JHQkExNkZfRVhUID0gMHg4ODFBXG52YXIgR0xfUkdCMTZGX0VYVCA9IDB4ODgxQlxuXG52YXIgRk9STUFUX1NJWkVTID0gW11cblxuRk9STUFUX1NJWkVTW0dMX1JHQkE0JDFdID0gMlxuRk9STUFUX1NJWkVTW0dMX1JHQjVfQTEkMV0gPSAyXG5GT1JNQVRfU0laRVNbR0xfUkdCNTY1JDFdID0gMlxuXG5GT1JNQVRfU0laRVNbR0xfREVQVEhfQ09NUE9ORU5UMTZdID0gMlxuRk9STUFUX1NJWkVTW0dMX1NURU5DSUxfSU5ERVg4XSA9IDFcbkZPUk1BVF9TSVpFU1tHTF9ERVBUSF9TVEVOQ0lMJDFdID0gNFxuXG5GT1JNQVRfU0laRVNbR0xfU1JHQjhfQUxQSEE4X0VYVF0gPSA0XG5GT1JNQVRfU0laRVNbR0xfUkdCQTMyRl9FWFRdID0gMTZcbkZPUk1BVF9TSVpFU1tHTF9SR0JBMTZGX0VYVF0gPSA4XG5GT1JNQVRfU0laRVNbR0xfUkdCMTZGX0VYVF0gPSA2XG5cbmZ1bmN0aW9uIGdldFJlbmRlcmJ1ZmZlclNpemUgKGZvcm1hdCwgd2lkdGgsIGhlaWdodCkge1xuICByZXR1cm4gRk9STUFUX1NJWkVTW2Zvcm1hdF0gKiB3aWR0aCAqIGhlaWdodFxufVxuXG52YXIgd3JhcFJlbmRlcmJ1ZmZlcnMgPSBmdW5jdGlvbiAoZ2wsIGV4dGVuc2lvbnMsIGxpbWl0cywgc3RhdHMsIGNvbmZpZykge1xuICB2YXIgZm9ybWF0VHlwZXMgPSB7XG4gICAgJ3JnYmE0JzogR0xfUkdCQTQkMSxcbiAgICAncmdiNTY1JzogR0xfUkdCNTY1JDEsXG4gICAgJ3JnYjUgYTEnOiBHTF9SR0I1X0ExJDEsXG4gICAgJ2RlcHRoJzogR0xfREVQVEhfQ09NUE9ORU5UMTYsXG4gICAgJ3N0ZW5jaWwnOiBHTF9TVEVOQ0lMX0lOREVYOCxcbiAgICAnZGVwdGggc3RlbmNpbCc6IEdMX0RFUFRIX1NURU5DSUwkMVxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMuZXh0X3NyZ2IpIHtcbiAgICBmb3JtYXRUeXBlc1snc3JnYmEnXSA9IEdMX1NSR0I4X0FMUEhBOF9FWFRcbiAgfVxuXG4gIGlmIChleHRlbnNpb25zLmV4dF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCkge1xuICAgIGZvcm1hdFR5cGVzWydyZ2JhMTZmJ10gPSBHTF9SR0JBMTZGX0VYVFxuICAgIGZvcm1hdFR5cGVzWydyZ2IxNmYnXSA9IEdMX1JHQjE2Rl9FWFRcbiAgfVxuXG4gIGlmIChleHRlbnNpb25zLndlYmdsX2NvbG9yX2J1ZmZlcl9mbG9hdCkge1xuICAgIGZvcm1hdFR5cGVzWydyZ2JhMzJmJ10gPSBHTF9SR0JBMzJGX0VYVFxuICB9XG5cbiAgdmFyIGZvcm1hdFR5cGVzSW52ZXJ0ID0gW11cbiAgT2JqZWN0LmtleXMoZm9ybWF0VHlwZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciB2YWwgPSBmb3JtYXRUeXBlc1trZXldXG4gICAgZm9ybWF0VHlwZXNJbnZlcnRbdmFsXSA9IGtleVxuICB9KVxuXG4gIHZhciByZW5kZXJidWZmZXJDb3VudCA9IDBcbiAgdmFyIHJlbmRlcmJ1ZmZlclNldCA9IHt9XG5cbiAgZnVuY3Rpb24gUkVHTFJlbmRlcmJ1ZmZlciAocmVuZGVyYnVmZmVyKSB7XG4gICAgdGhpcy5pZCA9IHJlbmRlcmJ1ZmZlckNvdW50KytcbiAgICB0aGlzLnJlZkNvdW50ID0gMVxuXG4gICAgdGhpcy5yZW5kZXJidWZmZXIgPSByZW5kZXJidWZmZXJcblxuICAgIHRoaXMuZm9ybWF0ID0gR0xfUkdCQTQkMVxuICAgIHRoaXMud2lkdGggPSAwXG4gICAgdGhpcy5oZWlnaHQgPSAwXG5cbiAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgIHRoaXMuc3RhdHMgPSB7IHNpemU6IDAgfVxuICAgIH1cbiAgfVxuXG4gIFJFR0xSZW5kZXJidWZmZXIucHJvdG90eXBlLmRlY1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoLS10aGlzLnJlZkNvdW50IDw9IDApIHtcbiAgICAgIGRlc3Ryb3kodGhpcylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95IChyYikge1xuICAgIHZhciBoYW5kbGUgPSByYi5yZW5kZXJidWZmZXJcbiAgICBjaGVjayQxKGhhbmRsZSwgJ211c3Qgbm90IGRvdWJsZSBkZXN0cm95IHJlbmRlcmJ1ZmZlcicpXG4gICAgZ2wuYmluZFJlbmRlcmJ1ZmZlcihHTF9SRU5ERVJCVUZGRVIsIG51bGwpXG4gICAgZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKGhhbmRsZSlcbiAgICByYi5yZW5kZXJidWZmZXIgPSBudWxsXG4gICAgcmIucmVmQ291bnQgPSAwXG4gICAgZGVsZXRlIHJlbmRlcmJ1ZmZlclNldFtyYi5pZF1cbiAgICBzdGF0cy5yZW5kZXJidWZmZXJDb3VudC0tXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVSZW5kZXJidWZmZXIgKGEsIGIpIHtcbiAgICB2YXIgcmVuZGVyYnVmZmVyID0gbmV3IFJFR0xSZW5kZXJidWZmZXIoZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCkpXG4gICAgcmVuZGVyYnVmZmVyU2V0W3JlbmRlcmJ1ZmZlci5pZF0gPSByZW5kZXJidWZmZXJcbiAgICBzdGF0cy5yZW5kZXJidWZmZXJDb3VudCsrXG5cbiAgICBmdW5jdGlvbiByZWdsUmVuZGVyYnVmZmVyIChhLCBiKSB7XG4gICAgICB2YXIgdyA9IDBcbiAgICAgIHZhciBoID0gMFxuICAgICAgdmFyIGZvcm1hdCA9IEdMX1JHQkE0JDFcblxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiBhKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gYVxuICAgICAgICBpZiAoJ3NoYXBlJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgdmFyIHNoYXBlID0gb3B0aW9ucy5zaGFwZVxuICAgICAgICAgIGNoZWNrJDEoQXJyYXkuaXNBcnJheShzaGFwZSkgJiYgc2hhcGUubGVuZ3RoID49IDIsXG4gICAgICAgICAgICAnaW52YWxpZCByZW5kZXJidWZmZXIgc2hhcGUnKVxuICAgICAgICAgIHcgPSBzaGFwZVswXSB8IDBcbiAgICAgICAgICBoID0gc2hhcGVbMV0gfCAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCdyYWRpdXMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHcgPSBoID0gb3B0aW9ucy5yYWRpdXMgfCAwXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnd2lkdGgnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHcgPSBvcHRpb25zLndpZHRoIHwgMFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ2hlaWdodCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgaCA9IG9wdGlvbnMuaGVpZ2h0IHwgMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2Zvcm1hdCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgIGNoZWNrJDEucGFyYW1ldGVyKG9wdGlvbnMuZm9ybWF0LCBmb3JtYXRUeXBlcyxcbiAgICAgICAgICAgICdpbnZhbGlkIHJlbmRlcmJ1ZmZlciBmb3JtYXQnKVxuICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdFR5cGVzW29wdGlvbnMuZm9ybWF0XVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhID09PSAnbnVtYmVyJykge1xuICAgICAgICB3ID0gYSB8IDBcbiAgICAgICAgaWYgKHR5cGVvZiBiID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGggPSBiIHwgMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGggPSB3XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWEpIHtcbiAgICAgICAgdyA9IGggPSAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVjayQxLnJhaXNlKCdpbnZhbGlkIGFyZ3VtZW50cyB0byByZW5kZXJidWZmZXIgY29uc3RydWN0b3InKVxuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBzaGFwZVxuICAgICAgY2hlY2skMShcbiAgICAgICAgdyA+IDAgJiYgaCA+IDAgJiZcbiAgICAgICAgdyA8PSBsaW1pdHMubWF4UmVuZGVyYnVmZmVyU2l6ZSAmJiBoIDw9IGxpbWl0cy5tYXhSZW5kZXJidWZmZXJTaXplLFxuICAgICAgICAnaW52YWxpZCByZW5kZXJidWZmZXIgc2l6ZScpXG5cbiAgICAgIGlmICh3ID09PSByZW5kZXJidWZmZXIud2lkdGggJiZcbiAgICAgICAgICBoID09PSByZW5kZXJidWZmZXIuaGVpZ2h0ICYmXG4gICAgICAgICAgZm9ybWF0ID09PSByZW5kZXJidWZmZXIuZm9ybWF0KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByZWdsUmVuZGVyYnVmZmVyLndpZHRoID0gcmVuZGVyYnVmZmVyLndpZHRoID0gd1xuICAgICAgcmVnbFJlbmRlcmJ1ZmZlci5oZWlnaHQgPSByZW5kZXJidWZmZXIuaGVpZ2h0ID0gaFxuICAgICAgcmVuZGVyYnVmZmVyLmZvcm1hdCA9IGZvcm1hdFxuXG4gICAgICBnbC5iaW5kUmVuZGVyYnVmZmVyKEdMX1JFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyLnJlbmRlcmJ1ZmZlcilcbiAgICAgIGdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoR0xfUkVOREVSQlVGRkVSLCBmb3JtYXQsIHcsIGgpXG5cbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIGdsLmdldEVycm9yKCkgPT09IDAsXG4gICAgICAgICdpbnZhbGlkIHJlbmRlciBidWZmZXIgZm9ybWF0JylcblxuICAgICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICAgIHJlbmRlcmJ1ZmZlci5zdGF0cy5zaXplID0gZ2V0UmVuZGVyYnVmZmVyU2l6ZShyZW5kZXJidWZmZXIuZm9ybWF0LCByZW5kZXJidWZmZXIud2lkdGgsIHJlbmRlcmJ1ZmZlci5oZWlnaHQpXG4gICAgICB9XG4gICAgICByZWdsUmVuZGVyYnVmZmVyLmZvcm1hdCA9IGZvcm1hdFR5cGVzSW52ZXJ0W3JlbmRlcmJ1ZmZlci5mb3JtYXRdXG5cbiAgICAgIHJldHVybiByZWdsUmVuZGVyYnVmZmVyXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzaXplICh3XywgaF8pIHtcbiAgICAgIHZhciB3ID0gd18gfCAwXG4gICAgICB2YXIgaCA9IChoXyB8IDApIHx8IHdcblxuICAgICAgaWYgKHcgPT09IHJlbmRlcmJ1ZmZlci53aWR0aCAmJiBoID09PSByZW5kZXJidWZmZXIuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiByZWdsUmVuZGVyYnVmZmVyXG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIHNoYXBlXG4gICAgICBjaGVjayQxKFxuICAgICAgICB3ID4gMCAmJiBoID4gMCAmJlxuICAgICAgICB3IDw9IGxpbWl0cy5tYXhSZW5kZXJidWZmZXJTaXplICYmIGggPD0gbGltaXRzLm1heFJlbmRlcmJ1ZmZlclNpemUsXG4gICAgICAgICdpbnZhbGlkIHJlbmRlcmJ1ZmZlciBzaXplJylcblxuICAgICAgcmVnbFJlbmRlcmJ1ZmZlci53aWR0aCA9IHJlbmRlcmJ1ZmZlci53aWR0aCA9IHdcbiAgICAgIHJlZ2xSZW5kZXJidWZmZXIuaGVpZ2h0ID0gcmVuZGVyYnVmZmVyLmhlaWdodCA9IGhcblxuICAgICAgZ2wuYmluZFJlbmRlcmJ1ZmZlcihHTF9SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlci5yZW5kZXJidWZmZXIpXG4gICAgICBnbC5yZW5kZXJidWZmZXJTdG9yYWdlKEdMX1JFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyLmZvcm1hdCwgdywgaClcblxuICAgICAgY2hlY2skMShcbiAgICAgICAgZ2wuZ2V0RXJyb3IoKSA9PT0gMCxcbiAgICAgICAgJ2ludmFsaWQgcmVuZGVyIGJ1ZmZlciBmb3JtYXQnKVxuXG4gICAgICAvLyBhbHNvLCByZWNvbXB1dGUgc2l6ZS5cbiAgICAgIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgICAgICByZW5kZXJidWZmZXIuc3RhdHMuc2l6ZSA9IGdldFJlbmRlcmJ1ZmZlclNpemUoXG4gICAgICAgICAgcmVuZGVyYnVmZmVyLmZvcm1hdCwgcmVuZGVyYnVmZmVyLndpZHRoLCByZW5kZXJidWZmZXIuaGVpZ2h0KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVnbFJlbmRlcmJ1ZmZlclxuICAgIH1cblxuICAgIHJlZ2xSZW5kZXJidWZmZXIoYSwgYilcblxuICAgIHJlZ2xSZW5kZXJidWZmZXIucmVzaXplID0gcmVzaXplXG4gICAgcmVnbFJlbmRlcmJ1ZmZlci5fcmVnbFR5cGUgPSAncmVuZGVyYnVmZmVyJ1xuICAgIHJlZ2xSZW5kZXJidWZmZXIuX3JlbmRlcmJ1ZmZlciA9IHJlbmRlcmJ1ZmZlclxuICAgIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgICAgcmVnbFJlbmRlcmJ1ZmZlci5zdGF0cyA9IHJlbmRlcmJ1ZmZlci5zdGF0c1xuICAgIH1cbiAgICByZWdsUmVuZGVyYnVmZmVyLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZW5kZXJidWZmZXIuZGVjUmVmKClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVnbFJlbmRlcmJ1ZmZlclxuICB9XG5cbiAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgc3RhdHMuZ2V0VG90YWxSZW5kZXJidWZmZXJTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRvdGFsID0gMFxuICAgICAgT2JqZWN0LmtleXMocmVuZGVyYnVmZmVyU2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdG90YWwgKz0gcmVuZGVyYnVmZmVyU2V0W2tleV0uc3RhdHMuc2l6ZVxuICAgICAgfSlcbiAgICAgIHJldHVybiB0b3RhbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RvcmVSZW5kZXJidWZmZXJzICgpIHtcbiAgICB2YWx1ZXMocmVuZGVyYnVmZmVyU2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChyYikge1xuICAgICAgcmIucmVuZGVyYnVmZmVyID0gZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKClcbiAgICAgIGdsLmJpbmRSZW5kZXJidWZmZXIoR0xfUkVOREVSQlVGRkVSLCByYi5yZW5kZXJidWZmZXIpXG4gICAgICBnbC5yZW5kZXJidWZmZXJTdG9yYWdlKEdMX1JFTkRFUkJVRkZFUiwgcmIuZm9ybWF0LCByYi53aWR0aCwgcmIuaGVpZ2h0KVxuICAgIH0pXG4gICAgZ2wuYmluZFJlbmRlcmJ1ZmZlcihHTF9SRU5ERVJCVUZGRVIsIG51bGwpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogY3JlYXRlUmVuZGVyYnVmZmVyLFxuICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YWx1ZXMocmVuZGVyYnVmZmVyU2V0KS5mb3JFYWNoKGRlc3Ryb3kpXG4gICAgfSxcbiAgICByZXN0b3JlOiByZXN0b3JlUmVuZGVyYnVmZmVyc1xuICB9XG59XG5cbi8vIFdlIHN0b3JlIHRoZXNlIGNvbnN0YW50cyBzbyB0aGF0IHRoZSBtaW5pZmllciBjYW4gaW5saW5lIHRoZW1cbnZhciBHTF9GUkFNRUJVRkZFUiQxID0gMHg4RDQwXG52YXIgR0xfUkVOREVSQlVGRkVSJDEgPSAweDhENDFcblxudmFyIEdMX1RFWFRVUkVfMkQkMiA9IDB4MERFMVxudmFyIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCQyID0gMHg4NTE1XG5cbnZhciBHTF9DT0xPUl9BVFRBQ0hNRU5UMCQxID0gMHg4Q0UwXG52YXIgR0xfREVQVEhfQVRUQUNITUVOVCA9IDB4OEQwMFxudmFyIEdMX1NURU5DSUxfQVRUQUNITUVOVCA9IDB4OEQyMFxudmFyIEdMX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA9IDB4ODIxQVxuXG52YXIgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUkMSA9IDB4OENENVxudmFyIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCA9IDB4OENENlxudmFyIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UID0gMHg4Q0Q3XG52YXIgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TID0gMHg4Q0Q5XG52YXIgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQgPSAweDhDRERcblxudmFyIEdMX0hBTEZfRkxPQVRfT0VTJDIgPSAweDhENjFcbnZhciBHTF9VTlNJR05FRF9CWVRFJDYgPSAweDE0MDFcbnZhciBHTF9GTE9BVCQ1ID0gMHgxNDA2XG5cbnZhciBHTF9SR0IkMSA9IDB4MTkwN1xudmFyIEdMX1JHQkEkMiA9IDB4MTkwOFxuXG52YXIgR0xfREVQVEhfQ09NUE9ORU5UJDEgPSAweDE5MDJcblxudmFyIGNvbG9yVGV4dHVyZUZvcm1hdEVudW1zID0gW1xuICBHTF9SR0IkMSxcbiAgR0xfUkdCQSQyXG5dXG5cbi8vIGZvciBldmVyeSB0ZXh0dXJlIGZvcm1hdCwgc3RvcmVcbi8vIHRoZSBudW1iZXIgb2YgY2hhbm5lbHNcbnZhciB0ZXh0dXJlRm9ybWF0Q2hhbm5lbHMgPSBbXVxudGV4dHVyZUZvcm1hdENoYW5uZWxzW0dMX1JHQkEkMl0gPSA0XG50ZXh0dXJlRm9ybWF0Q2hhbm5lbHNbR0xfUkdCJDFdID0gM1xuXG4vLyBmb3IgZXZlcnkgdGV4dHVyZSB0eXBlLCBzdG9yZVxuLy8gdGhlIHNpemUgaW4gYnl0ZXMuXG52YXIgdGV4dHVyZVR5cGVTaXplcyA9IFtdXG50ZXh0dXJlVHlwZVNpemVzW0dMX1VOU0lHTkVEX0JZVEUkNl0gPSAxXG50ZXh0dXJlVHlwZVNpemVzW0dMX0ZMT0FUJDVdID0gNFxudGV4dHVyZVR5cGVTaXplc1tHTF9IQUxGX0ZMT0FUX09FUyQyXSA9IDJcblxudmFyIEdMX1JHQkE0JDIgPSAweDgwNTZcbnZhciBHTF9SR0I1X0ExJDIgPSAweDgwNTdcbnZhciBHTF9SR0I1NjUkMiA9IDB4OEQ2MlxudmFyIEdMX0RFUFRIX0NPTVBPTkVOVDE2JDEgPSAweDgxQTVcbnZhciBHTF9TVEVOQ0lMX0lOREVYOCQxID0gMHg4RDQ4XG52YXIgR0xfREVQVEhfU1RFTkNJTCQyID0gMHg4NEY5XG5cbnZhciBHTF9TUkdCOF9BTFBIQThfRVhUJDEgPSAweDhDNDNcblxudmFyIEdMX1JHQkEzMkZfRVhUJDEgPSAweDg4MTRcblxudmFyIEdMX1JHQkExNkZfRVhUJDEgPSAweDg4MUFcbnZhciBHTF9SR0IxNkZfRVhUJDEgPSAweDg4MUJcblxudmFyIGNvbG9yUmVuZGVyYnVmZmVyRm9ybWF0RW51bXMgPSBbXG4gIEdMX1JHQkE0JDIsXG4gIEdMX1JHQjVfQTEkMixcbiAgR0xfUkdCNTY1JDIsXG4gIEdMX1NSR0I4X0FMUEhBOF9FWFQkMSxcbiAgR0xfUkdCQTE2Rl9FWFQkMSxcbiAgR0xfUkdCMTZGX0VYVCQxLFxuICBHTF9SR0JBMzJGX0VYVCQxXG5dXG5cbnZhciBzdGF0dXNDb2RlID0ge31cbnN0YXR1c0NvZGVbR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUkMV0gPSAnY29tcGxldGUnXG5zdGF0dXNDb2RlW0dMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVF0gPSAnaW5jb21wbGV0ZSBhdHRhY2htZW50J1xuc3RhdHVzQ29kZVtHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNdID0gJ2luY29tcGxldGUgZGltZW5zaW9ucydcbnN0YXR1c0NvZGVbR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRdID0gJ2luY29tcGxldGUsIG1pc3NpbmcgYXR0YWNobWVudCdcbnN0YXR1c0NvZGVbR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURdID0gJ3Vuc3VwcG9ydGVkJ1xuXG5mdW5jdGlvbiB3cmFwRkJPU3RhdGUgKFxuICBnbCxcbiAgZXh0ZW5zaW9ucyxcbiAgbGltaXRzLFxuICB0ZXh0dXJlU3RhdGUsXG4gIHJlbmRlcmJ1ZmZlclN0YXRlLFxuICBzdGF0cykge1xuICB2YXIgZnJhbWVidWZmZXJTdGF0ZSA9IHtcbiAgICBjdXI6IG51bGwsXG4gICAgbmV4dDogbnVsbCxcbiAgICBkaXJ0eTogZmFsc2UsXG4gICAgc2V0RkJPOiBudWxsXG4gIH1cblxuICB2YXIgY29sb3JUZXh0dXJlRm9ybWF0cyA9IFsncmdiYSddXG4gIHZhciBjb2xvclJlbmRlcmJ1ZmZlckZvcm1hdHMgPSBbJ3JnYmE0JywgJ3JnYjU2NScsICdyZ2I1IGExJ11cblxuICBpZiAoZXh0ZW5zaW9ucy5leHRfc3JnYikge1xuICAgIGNvbG9yUmVuZGVyYnVmZmVyRm9ybWF0cy5wdXNoKCdzcmdiYScpXG4gIH1cblxuICBpZiAoZXh0ZW5zaW9ucy5leHRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQpIHtcbiAgICBjb2xvclJlbmRlcmJ1ZmZlckZvcm1hdHMucHVzaCgncmdiYTE2ZicsICdyZ2IxNmYnKVxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMud2ViZ2xfY29sb3JfYnVmZmVyX2Zsb2F0KSB7XG4gICAgY29sb3JSZW5kZXJidWZmZXJGb3JtYXRzLnB1c2goJ3JnYmEzMmYnKVxuICB9XG5cbiAgdmFyIGNvbG9yVHlwZXMgPSBbJ3VpbnQ4J11cbiAgaWYgKGV4dGVuc2lvbnMub2VzX3RleHR1cmVfaGFsZl9mbG9hdCkge1xuICAgIGNvbG9yVHlwZXMucHVzaCgnaGFsZiBmbG9hdCcsICdmbG9hdDE2JylcbiAgfVxuICBpZiAoZXh0ZW5zaW9ucy5vZXNfdGV4dHVyZV9mbG9hdCkge1xuICAgIGNvbG9yVHlwZXMucHVzaCgnZmxvYXQnLCAnZmxvYXQzMicpXG4gIH1cblxuICBmdW5jdGlvbiBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQgKHRhcmdldCwgdGV4dHVyZSwgcmVuZGVyYnVmZmVyKSB7XG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXRcbiAgICB0aGlzLnRleHR1cmUgPSB0ZXh0dXJlXG4gICAgdGhpcy5yZW5kZXJidWZmZXIgPSByZW5kZXJidWZmZXJcblxuICAgIHZhciB3ID0gMFxuICAgIHZhciBoID0gMFxuICAgIGlmICh0ZXh0dXJlKSB7XG4gICAgICB3ID0gdGV4dHVyZS53aWR0aFxuICAgICAgaCA9IHRleHR1cmUuaGVpZ2h0XG4gICAgfSBlbHNlIGlmIChyZW5kZXJidWZmZXIpIHtcbiAgICAgIHcgPSByZW5kZXJidWZmZXIud2lkdGhcbiAgICAgIGggPSByZW5kZXJidWZmZXIuaGVpZ2h0XG4gICAgfVxuICAgIHRoaXMud2lkdGggPSB3XG4gICAgdGhpcy5oZWlnaHQgPSBoXG4gIH1cblxuICBmdW5jdGlvbiBkZWNSZWYgKGF0dGFjaG1lbnQpIHtcbiAgICBpZiAoYXR0YWNobWVudCkge1xuICAgICAgaWYgKGF0dGFjaG1lbnQudGV4dHVyZSkge1xuICAgICAgICBhdHRhY2htZW50LnRleHR1cmUuX3RleHR1cmUuZGVjUmVmKClcbiAgICAgIH1cbiAgICAgIGlmIChhdHRhY2htZW50LnJlbmRlcmJ1ZmZlcikge1xuICAgICAgICBhdHRhY2htZW50LnJlbmRlcmJ1ZmZlci5fcmVuZGVyYnVmZmVyLmRlY1JlZigpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5jUmVmQW5kQ2hlY2tTaGFwZSAoYXR0YWNobWVudCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGlmICghYXR0YWNobWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChhdHRhY2htZW50LnRleHR1cmUpIHtcbiAgICAgIHZhciB0ZXh0dXJlID0gYXR0YWNobWVudC50ZXh0dXJlLl90ZXh0dXJlXG4gICAgICB2YXIgdHcgPSBNYXRoLm1heCgxLCB0ZXh0dXJlLndpZHRoKVxuICAgICAgdmFyIHRoID0gTWF0aC5tYXgoMSwgdGV4dHVyZS5oZWlnaHQpXG4gICAgICBjaGVjayQxKHR3ID09PSB3aWR0aCAmJiB0aCA9PT0gaGVpZ2h0LFxuICAgICAgICAnaW5jb25zaXN0ZW50IHdpZHRoL2hlaWdodCBmb3Igc3VwcGxpZWQgdGV4dHVyZScpXG4gICAgICB0ZXh0dXJlLnJlZkNvdW50ICs9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlbmRlcmJ1ZmZlciA9IGF0dGFjaG1lbnQucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXJcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIHJlbmRlcmJ1ZmZlci53aWR0aCA9PT0gd2lkdGggJiYgcmVuZGVyYnVmZmVyLmhlaWdodCA9PT0gaGVpZ2h0LFxuICAgICAgICAnaW5jb25zaXN0ZW50IHdpZHRoL2hlaWdodCBmb3IgcmVuZGVyYnVmZmVyJylcbiAgICAgIHJlbmRlcmJ1ZmZlci5yZWZDb3VudCArPSAxXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYXR0YWNoIChsb2NhdGlvbiwgYXR0YWNobWVudCkge1xuICAgIGlmIChhdHRhY2htZW50KSB7XG4gICAgICBpZiAoYXR0YWNobWVudC50ZXh0dXJlKSB7XG4gICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgICAgIEdMX0ZSQU1FQlVGRkVSJDEsXG4gICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgYXR0YWNobWVudC50YXJnZXQsXG4gICAgICAgICAgYXR0YWNobWVudC50ZXh0dXJlLl90ZXh0dXJlLnRleHR1cmUsXG4gICAgICAgICAgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKFxuICAgICAgICAgIEdMX0ZSQU1FQlVGRkVSJDEsXG4gICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgR0xfUkVOREVSQlVGRkVSJDEsXG4gICAgICAgICAgYXR0YWNobWVudC5yZW5kZXJidWZmZXIuX3JlbmRlcmJ1ZmZlci5yZW5kZXJidWZmZXIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VBdHRhY2htZW50IChhdHRhY2htZW50KSB7XG4gICAgdmFyIHRhcmdldCA9IEdMX1RFWFRVUkVfMkQkMlxuICAgIHZhciB0ZXh0dXJlID0gbnVsbFxuICAgIHZhciByZW5kZXJidWZmZXIgPSBudWxsXG5cbiAgICB2YXIgZGF0YSA9IGF0dGFjaG1lbnRcbiAgICBpZiAodHlwZW9mIGF0dGFjaG1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICBkYXRhID0gYXR0YWNobWVudC5kYXRhXG4gICAgICBpZiAoJ3RhcmdldCcgaW4gYXR0YWNobWVudCkge1xuICAgICAgICB0YXJnZXQgPSBhdHRhY2htZW50LnRhcmdldCB8IDBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVjayQxLnR5cGUoZGF0YSwgJ2Z1bmN0aW9uJywgJ2ludmFsaWQgYXR0YWNobWVudCBkYXRhJylcblxuICAgIHZhciB0eXBlID0gZGF0YS5fcmVnbFR5cGVcbiAgICBpZiAodHlwZSA9PT0gJ3RleHR1cmUyZCcpIHtcbiAgICAgIHRleHR1cmUgPSBkYXRhXG4gICAgICBjaGVjayQxKHRhcmdldCA9PT0gR0xfVEVYVFVSRV8yRCQyKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RleHR1cmVDdWJlJykge1xuICAgICAgdGV4dHVyZSA9IGRhdGFcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIHRhcmdldCA+PSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gkMiAmJlxuICAgICAgICB0YXJnZXQgPCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gkMiArIDYsXG4gICAgICAgICdpbnZhbGlkIGN1YmUgbWFwIHRhcmdldCcpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAncmVuZGVyYnVmZmVyJykge1xuICAgICAgcmVuZGVyYnVmZmVyID0gZGF0YVxuICAgICAgdGFyZ2V0ID0gR0xfUkVOREVSQlVGRkVSJDFcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2skMS5yYWlzZSgnaW52YWxpZCByZWdsIG9iamVjdCBmb3IgYXR0YWNobWVudCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQodGFyZ2V0LCB0ZXh0dXJlLCByZW5kZXJidWZmZXIpXG4gIH1cblxuICBmdW5jdGlvbiBhbGxvY0F0dGFjaG1lbnQgKFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBpc1RleHR1cmUsXG4gICAgZm9ybWF0LFxuICAgIHR5cGUpIHtcbiAgICBpZiAoaXNUZXh0dXJlKSB7XG4gICAgICB2YXIgdGV4dHVyZSA9IHRleHR1cmVTdGF0ZS5jcmVhdGUyRCh7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGZvcm1hdDogZm9ybWF0LFxuICAgICAgICB0eXBlOiB0eXBlXG4gICAgICB9KVxuICAgICAgdGV4dHVyZS5fdGV4dHVyZS5yZWZDb3VudCA9IDBcbiAgICAgIHJldHVybiBuZXcgRnJhbWVidWZmZXJBdHRhY2htZW50KEdMX1RFWFRVUkVfMkQkMiwgdGV4dHVyZSwgbnVsbClcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJiID0gcmVuZGVyYnVmZmVyU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgZm9ybWF0OiBmb3JtYXRcbiAgICAgIH0pXG4gICAgICByYi5fcmVuZGVyYnVmZmVyLnJlZkNvdW50ID0gMFxuICAgICAgcmV0dXJuIG5ldyBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQoR0xfUkVOREVSQlVGRkVSJDEsIG51bGwsIHJiKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVud3JhcEF0dGFjaG1lbnQgKGF0dGFjaG1lbnQpIHtcbiAgICByZXR1cm4gYXR0YWNobWVudCAmJiAoYXR0YWNobWVudC50ZXh0dXJlIHx8IGF0dGFjaG1lbnQucmVuZGVyYnVmZmVyKVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzaXplQXR0YWNobWVudCAoYXR0YWNobWVudCwgdywgaCkge1xuICAgIGlmIChhdHRhY2htZW50KSB7XG4gICAgICBpZiAoYXR0YWNobWVudC50ZXh0dXJlKSB7XG4gICAgICAgIGF0dGFjaG1lbnQudGV4dHVyZS5yZXNpemUodywgaClcbiAgICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudC5yZW5kZXJidWZmZXIpIHtcbiAgICAgICAgYXR0YWNobWVudC5yZW5kZXJidWZmZXIucmVzaXplKHcsIGgpXG4gICAgICB9XG4gICAgICBhdHRhY2htZW50LndpZHRoID0gd1xuICAgICAgYXR0YWNobWVudC5oZWlnaHQgPSBoXG4gICAgfVxuICB9XG5cbiAgdmFyIGZyYW1lYnVmZmVyQ291bnQgPSAwXG4gIHZhciBmcmFtZWJ1ZmZlclNldCA9IHt9XG5cbiAgZnVuY3Rpb24gUkVHTEZyYW1lYnVmZmVyICgpIHtcbiAgICB0aGlzLmlkID0gZnJhbWVidWZmZXJDb3VudCsrXG4gICAgZnJhbWVidWZmZXJTZXRbdGhpcy5pZF0gPSB0aGlzXG5cbiAgICB0aGlzLmZyYW1lYnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKVxuICAgIHRoaXMud2lkdGggPSAwXG4gICAgdGhpcy5oZWlnaHQgPSAwXG5cbiAgICB0aGlzLmNvbG9yQXR0YWNobWVudHMgPSBbXVxuICAgIHRoaXMuZGVwdGhBdHRhY2htZW50ID0gbnVsbFxuICAgIHRoaXMuc3RlbmNpbEF0dGFjaG1lbnQgPSBudWxsXG4gICAgdGhpcy5kZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gbnVsbFxuICB9XG5cbiAgZnVuY3Rpb24gZGVjRkJPUmVmcyAoZnJhbWVidWZmZXIpIHtcbiAgICBmcmFtZWJ1ZmZlci5jb2xvckF0dGFjaG1lbnRzLmZvckVhY2goZGVjUmVmKVxuICAgIGRlY1JlZihmcmFtZWJ1ZmZlci5kZXB0aEF0dGFjaG1lbnQpXG4gICAgZGVjUmVmKGZyYW1lYnVmZmVyLnN0ZW5jaWxBdHRhY2htZW50KVxuICAgIGRlY1JlZihmcmFtZWJ1ZmZlci5kZXB0aFN0ZW5jaWxBdHRhY2htZW50KVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSAoZnJhbWVidWZmZXIpIHtcbiAgICB2YXIgaGFuZGxlID0gZnJhbWVidWZmZXIuZnJhbWVidWZmZXJcbiAgICBjaGVjayQxKGhhbmRsZSwgJ211c3Qgbm90IGRvdWJsZSBkZXN0cm95IGZyYW1lYnVmZmVyJylcbiAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihoYW5kbGUpXG4gICAgZnJhbWVidWZmZXIuZnJhbWVidWZmZXIgPSBudWxsXG4gICAgc3RhdHMuZnJhbWVidWZmZXJDb3VudC0tXG4gICAgZGVsZXRlIGZyYW1lYnVmZmVyU2V0W2ZyYW1lYnVmZmVyLmlkXVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJhbWVidWZmZXIgKGZyYW1lYnVmZmVyKSB7XG4gICAgdmFyIGlcblxuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiQxLCBmcmFtZWJ1ZmZlci5mcmFtZWJ1ZmZlcilcbiAgICB2YXIgY29sb3JBdHRhY2htZW50cyA9IGZyYW1lYnVmZmVyLmNvbG9yQXR0YWNobWVudHNcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JBdHRhY2htZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgYXR0YWNoKEdMX0NPTE9SX0FUVEFDSE1FTlQwJDEgKyBpLCBjb2xvckF0dGFjaG1lbnRzW2ldKVxuICAgIH1cbiAgICBmb3IgKGkgPSBjb2xvckF0dGFjaG1lbnRzLmxlbmd0aDsgaSA8IGxpbWl0cy5tYXhDb2xvckF0dGFjaG1lbnRzOyArK2kpIHtcbiAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgICBHTF9GUkFNRUJVRkZFUiQxLFxuICAgICAgICBHTF9DT0xPUl9BVFRBQ0hNRU5UMCQxICsgaSxcbiAgICAgICAgR0xfVEVYVFVSRV8yRCQyLFxuICAgICAgICBudWxsLFxuICAgICAgICAwKVxuICAgIH1cblxuICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgR0xfRlJBTUVCVUZGRVIkMSxcbiAgICAgIEdMX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVCxcbiAgICAgIEdMX1RFWFRVUkVfMkQkMixcbiAgICAgIG51bGwsXG4gICAgICAwKVxuICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgR0xfRlJBTUVCVUZGRVIkMSxcbiAgICAgIEdMX0RFUFRIX0FUVEFDSE1FTlQsXG4gICAgICBHTF9URVhUVVJFXzJEJDIsXG4gICAgICBudWxsLFxuICAgICAgMClcbiAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChcbiAgICAgIEdMX0ZSQU1FQlVGRkVSJDEsXG4gICAgICBHTF9TVEVOQ0lMX0FUVEFDSE1FTlQsXG4gICAgICBHTF9URVhUVVJFXzJEJDIsXG4gICAgICBudWxsLFxuICAgICAgMClcblxuICAgIGF0dGFjaChHTF9ERVBUSF9BVFRBQ0hNRU5ULCBmcmFtZWJ1ZmZlci5kZXB0aEF0dGFjaG1lbnQpXG4gICAgYXR0YWNoKEdMX1NURU5DSUxfQVRUQUNITUVOVCwgZnJhbWVidWZmZXIuc3RlbmNpbEF0dGFjaG1lbnQpXG4gICAgYXR0YWNoKEdMX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgZnJhbWVidWZmZXIuZGVwdGhTdGVuY2lsQXR0YWNobWVudClcblxuICAgIC8vIENoZWNrIHN0YXR1cyBjb2RlXG4gICAgdmFyIHN0YXR1cyA9IGdsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIkMSlcbiAgICBpZiAoIWdsLmlzQ29udGV4dExvc3QoKSAmJiBzdGF0dXMgIT09IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFJDEpIHtcbiAgICAgIGNoZWNrJDEucmFpc2UoJ2ZyYW1lYnVmZmVyIGNvbmZpZ3VyYXRpb24gbm90IHN1cHBvcnRlZCwgc3RhdHVzID0gJyArXG4gICAgICAgIHN0YXR1c0NvZGVbc3RhdHVzXSlcbiAgICB9XG5cbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIkMSwgZnJhbWVidWZmZXJTdGF0ZS5uZXh0ID8gZnJhbWVidWZmZXJTdGF0ZS5uZXh0LmZyYW1lYnVmZmVyIDogbnVsbClcbiAgICBmcmFtZWJ1ZmZlclN0YXRlLmN1ciA9IGZyYW1lYnVmZmVyU3RhdGUubmV4dFxuXG4gICAgLy8gRklYTUU6IENsZWFyIGVycm9yIGNvZGUgaGVyZS4gIFRoaXMgaXMgYSB3b3JrIGFyb3VuZCBmb3IgYSBidWcgaW5cbiAgICAvLyBoZWFkbGVzcy1nbFxuICAgIGdsLmdldEVycm9yKClcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUZCTyAoYTAsIGExKSB7XG4gICAgdmFyIGZyYW1lYnVmZmVyID0gbmV3IFJFR0xGcmFtZWJ1ZmZlcigpXG4gICAgc3RhdHMuZnJhbWVidWZmZXJDb3VudCsrXG5cbiAgICBmdW5jdGlvbiByZWdsRnJhbWVidWZmZXIgKGEsIGIpIHtcbiAgICAgIHZhciBpXG5cbiAgICAgIGNoZWNrJDEoZnJhbWVidWZmZXJTdGF0ZS5uZXh0ICE9PSBmcmFtZWJ1ZmZlcixcbiAgICAgICAgJ2NhbiBub3QgdXBkYXRlIGZyYW1lYnVmZmVyIHdoaWNoIGlzIGN1cnJlbnRseSBpbiB1c2UnKVxuXG4gICAgICB2YXIgd2lkdGggPSAwXG4gICAgICB2YXIgaGVpZ2h0ID0gMFxuXG4gICAgICB2YXIgbmVlZHNEZXB0aCA9IHRydWVcbiAgICAgIHZhciBuZWVkc1N0ZW5jaWwgPSB0cnVlXG5cbiAgICAgIHZhciBjb2xvckJ1ZmZlciA9IG51bGxcbiAgICAgIHZhciBjb2xvclRleHR1cmUgPSB0cnVlXG4gICAgICB2YXIgY29sb3JGb3JtYXQgPSAncmdiYSdcbiAgICAgIHZhciBjb2xvclR5cGUgPSAndWludDgnXG4gICAgICB2YXIgY29sb3JDb3VudCA9IDFcblxuICAgICAgdmFyIGRlcHRoQnVmZmVyID0gbnVsbFxuICAgICAgdmFyIHN0ZW5jaWxCdWZmZXIgPSBudWxsXG4gICAgICB2YXIgZGVwdGhTdGVuY2lsQnVmZmVyID0gbnVsbFxuICAgICAgdmFyIGRlcHRoU3RlbmNpbFRleHR1cmUgPSBmYWxzZVxuXG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHdpZHRoID0gYSB8IDBcbiAgICAgICAgaGVpZ2h0ID0gKGIgfCAwKSB8fCB3aWR0aFxuICAgICAgfSBlbHNlIGlmICghYSkge1xuICAgICAgICB3aWR0aCA9IGhlaWdodCA9IDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrJDEudHlwZShhLCAnb2JqZWN0JywgJ2ludmFsaWQgYXJndW1lbnRzIGZvciBmcmFtZWJ1ZmZlcicpXG4gICAgICAgIHZhciBvcHRpb25zID0gYVxuXG4gICAgICAgIGlmICgnc2hhcGUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICB2YXIgc2hhcGUgPSBvcHRpb25zLnNoYXBlXG4gICAgICAgICAgY2hlY2skMShBcnJheS5pc0FycmF5KHNoYXBlKSAmJiBzaGFwZS5sZW5ndGggPj0gMixcbiAgICAgICAgICAgICdpbnZhbGlkIHNoYXBlIGZvciBmcmFtZWJ1ZmZlcicpXG4gICAgICAgICAgd2lkdGggPSBzaGFwZVswXVxuICAgICAgICAgIGhlaWdodCA9IHNoYXBlWzFdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCdyYWRpdXMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ID0gb3B0aW9ucy5yYWRpdXNcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCd3aWR0aCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgd2lkdGggPSBvcHRpb25zLndpZHRoXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnaGVpZ2h0JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBoZWlnaHQgPSBvcHRpb25zLmhlaWdodFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnY29sb3InIGluIG9wdGlvbnMgfHxcbiAgICAgICAgICAgICdjb2xvcnMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBjb2xvckJ1ZmZlciA9XG4gICAgICAgICAgICBvcHRpb25zLmNvbG9yIHx8XG4gICAgICAgICAgICBvcHRpb25zLmNvbG9yc1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbG9yQnVmZmVyKSkge1xuICAgICAgICAgICAgY2hlY2skMShcbiAgICAgICAgICAgICAgY29sb3JCdWZmZXIubGVuZ3RoID09PSAxIHx8IGV4dGVuc2lvbnMud2ViZ2xfZHJhd19idWZmZXJzLFxuICAgICAgICAgICAgICAnbXVsdGlwbGUgcmVuZGVyIHRhcmdldHMgbm90IHN1cHBvcnRlZCcpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb2xvckJ1ZmZlcikge1xuICAgICAgICAgIGlmICgnY29sb3JDb3VudCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgY29sb3JDb3VudCA9IG9wdGlvbnMuY29sb3JDb3VudCB8IDBcbiAgICAgICAgICAgIGNoZWNrJDEoY29sb3JDb3VudCA+IDAsICdpbnZhbGlkIGNvbG9yIGJ1ZmZlciBjb3VudCcpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCdjb2xvclRleHR1cmUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbG9yVGV4dHVyZSA9ICEhb3B0aW9ucy5jb2xvclRleHR1cmVcbiAgICAgICAgICAgIGNvbG9yRm9ybWF0ID0gJ3JnYmE0J1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgnY29sb3JUeXBlJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb2xvclR5cGUgPSBvcHRpb25zLmNvbG9yVHlwZVxuICAgICAgICAgICAgaWYgKCFjb2xvclRleHR1cmUpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbG9yVHlwZSA9PT0gJ2hhbGYgZmxvYXQnIHx8IGNvbG9yVHlwZSA9PT0gJ2Zsb2F0MTYnKSB7XG4gICAgICAgICAgICAgICAgY2hlY2skMShleHRlbnNpb25zLmV4dF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCxcbiAgICAgICAgICAgICAgICAgICd5b3UgbXVzdCBlbmFibGUgRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0IHRvIHVzZSAxNi1iaXQgcmVuZGVyIGJ1ZmZlcnMnKVxuICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0ID0gJ3JnYmExNmYnXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sb3JUeXBlID09PSAnZmxvYXQnIHx8IGNvbG9yVHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgICAgICAgY2hlY2skMShleHRlbnNpb25zLndlYmdsX2NvbG9yX2J1ZmZlcl9mbG9hdCxcbiAgICAgICAgICAgICAgICAgICd5b3UgbXVzdCBlbmFibGUgV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IGluIG9yZGVyIHRvIHVzZSAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgcmVuZGVyYnVmZmVycycpXG4gICAgICAgICAgICAgICAgY29sb3JGb3JtYXQgPSAncmdiYTMyZidcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2hlY2skMShleHRlbnNpb25zLm9lc190ZXh0dXJlX2Zsb2F0IHx8XG4gICAgICAgICAgICAgICAgIShjb2xvclR5cGUgPT09ICdmbG9hdCcgfHwgY29sb3JUeXBlID09PSAnZmxvYXQzMicpLFxuICAgICAgICAgICAgICAneW91IG11c3QgZW5hYmxlIE9FU190ZXh0dXJlX2Zsb2F0IGluIG9yZGVyIHRvIHVzZSBmbG9hdGluZyBwb2ludCBmcmFtZWJ1ZmZlciBvYmplY3RzJylcbiAgICAgICAgICAgICAgY2hlY2skMShleHRlbnNpb25zLm9lc190ZXh0dXJlX2hhbGZfZmxvYXQgfHxcbiAgICAgICAgICAgICAgICAhKGNvbG9yVHlwZSA9PT0gJ2hhbGYgZmxvYXQnIHx8IGNvbG9yVHlwZSA9PT0gJ2Zsb2F0MTYnKSxcbiAgICAgICAgICAgICAgJ3lvdSBtdXN0IGVuYWJsZSBPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IGluIG9yZGVyIHRvIHVzZSAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgZnJhbWVidWZmZXIgb2JqZWN0cycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGVjayQxLm9uZU9mKGNvbG9yVHlwZSwgY29sb3JUeXBlcywgJ2ludmFsaWQgY29sb3IgdHlwZScpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCdjb2xvckZvcm1hdCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgY29sb3JGb3JtYXQgPSBvcHRpb25zLmNvbG9yRm9ybWF0XG4gICAgICAgICAgICBpZiAoY29sb3JUZXh0dXJlRm9ybWF0cy5pbmRleE9mKGNvbG9yRm9ybWF0KSA+PSAwKSB7XG4gICAgICAgICAgICAgIGNvbG9yVGV4dHVyZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sb3JSZW5kZXJidWZmZXJGb3JtYXRzLmluZGV4T2YoY29sb3JGb3JtYXQpID49IDApIHtcbiAgICAgICAgICAgICAgY29sb3JUZXh0dXJlID0gZmFsc2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChjb2xvclRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICBjaGVjayQxLm9uZU9mKFxuICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jb2xvckZvcm1hdCwgY29sb3JUZXh0dXJlRm9ybWF0cyxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkIGNvbG9yIGZvcm1hdCBmb3IgdGV4dHVyZScpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2hlY2skMS5vbmVPZihcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29sb3JGb3JtYXQsIGNvbG9yUmVuZGVyYnVmZmVyRm9ybWF0cyxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkIGNvbG9yIGZvcm1hdCBmb3IgcmVuZGVyYnVmZmVyJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnZGVwdGhUZXh0dXJlJyBpbiBvcHRpb25zIHx8ICdkZXB0aFN0ZW5jaWxUZXh0dXJlJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgZGVwdGhTdGVuY2lsVGV4dHVyZSA9ICEhKG9wdGlvbnMuZGVwdGhUZXh0dXJlIHx8XG4gICAgICAgICAgICBvcHRpb25zLmRlcHRoU3RlbmNpbFRleHR1cmUpXG4gICAgICAgICAgY2hlY2skMSghZGVwdGhTdGVuY2lsVGV4dHVyZSB8fCBleHRlbnNpb25zLndlYmdsX2RlcHRoX3RleHR1cmUsXG4gICAgICAgICAgICAnd2ViZ2xfZGVwdGhfdGV4dHVyZSBleHRlbnNpb24gbm90IHN1cHBvcnRlZCcpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ2RlcHRoJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlcHRoID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIG5lZWRzRGVwdGggPSBvcHRpb25zLmRlcHRoXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlcHRoQnVmZmVyID0gb3B0aW9ucy5kZXB0aFxuICAgICAgICAgICAgbmVlZHNTdGVuY2lsID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ3N0ZW5jaWwnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc3RlbmNpbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBuZWVkc1N0ZW5jaWwgPSBvcHRpb25zLnN0ZW5jaWxcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RlbmNpbEJ1ZmZlciA9IG9wdGlvbnMuc3RlbmNpbFxuICAgICAgICAgICAgbmVlZHNEZXB0aCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdkZXB0aFN0ZW5jaWwnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVwdGhTdGVuY2lsID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIG5lZWRzRGVwdGggPSBuZWVkc1N0ZW5jaWwgPSBvcHRpb25zLmRlcHRoU3RlbmNpbFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXB0aFN0ZW5jaWxCdWZmZXIgPSBvcHRpb25zLmRlcHRoU3RlbmNpbFxuICAgICAgICAgICAgbmVlZHNEZXB0aCA9IGZhbHNlXG4gICAgICAgICAgICBuZWVkc1N0ZW5jaWwgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBwYXJzZSBhdHRhY2htZW50c1xuICAgICAgdmFyIGNvbG9yQXR0YWNobWVudHMgPSBudWxsXG4gICAgICB2YXIgZGVwdGhBdHRhY2htZW50ID0gbnVsbFxuICAgICAgdmFyIHN0ZW5jaWxBdHRhY2htZW50ID0gbnVsbFxuICAgICAgdmFyIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBudWxsXG5cbiAgICAgIC8vIFNldCB1cCBjb2xvciBhdHRhY2htZW50c1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sb3JCdWZmZXIpKSB7XG4gICAgICAgIGNvbG9yQXR0YWNobWVudHMgPSBjb2xvckJ1ZmZlci5tYXAocGFyc2VBdHRhY2htZW50KVxuICAgICAgfSBlbHNlIGlmIChjb2xvckJ1ZmZlcikge1xuICAgICAgICBjb2xvckF0dGFjaG1lbnRzID0gW3BhcnNlQXR0YWNobWVudChjb2xvckJ1ZmZlcildXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xvckF0dGFjaG1lbnRzID0gbmV3IEFycmF5KGNvbG9yQ291bnQpXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvckNvdW50OyArK2kpIHtcbiAgICAgICAgICBjb2xvckF0dGFjaG1lbnRzW2ldID0gYWxsb2NBdHRhY2htZW50KFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICBjb2xvclRleHR1cmUsXG4gICAgICAgICAgICBjb2xvckZvcm1hdCxcbiAgICAgICAgICAgIGNvbG9yVHlwZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjaGVjayQxKGV4dGVuc2lvbnMud2ViZ2xfZHJhd19idWZmZXJzIHx8IGNvbG9yQXR0YWNobWVudHMubGVuZ3RoIDw9IDEsXG4gICAgICAgICd5b3UgbXVzdCBlbmFibGUgdGhlIFdFQkdMX2RyYXdfYnVmZmVycyBleHRlbnNpb24gaW4gb3JkZXIgdG8gdXNlIG11bHRpcGxlIGNvbG9yIGJ1ZmZlcnMuJylcbiAgICAgIGNoZWNrJDEoY29sb3JBdHRhY2htZW50cy5sZW5ndGggPD0gbGltaXRzLm1heENvbG9yQXR0YWNobWVudHMsXG4gICAgICAgICd0b28gbWFueSBjb2xvciBhdHRhY2htZW50cywgbm90IHN1cHBvcnRlZCcpXG5cbiAgICAgIHdpZHRoID0gd2lkdGggfHwgY29sb3JBdHRhY2htZW50c1swXS53aWR0aFxuICAgICAgaGVpZ2h0ID0gaGVpZ2h0IHx8IGNvbG9yQXR0YWNobWVudHNbMF0uaGVpZ2h0XG5cbiAgICAgIGlmIChkZXB0aEJ1ZmZlcikge1xuICAgICAgICBkZXB0aEF0dGFjaG1lbnQgPSBwYXJzZUF0dGFjaG1lbnQoZGVwdGhCdWZmZXIpXG4gICAgICB9IGVsc2UgaWYgKG5lZWRzRGVwdGggJiYgIW5lZWRzU3RlbmNpbCkge1xuICAgICAgICBkZXB0aEF0dGFjaG1lbnQgPSBhbGxvY0F0dGFjaG1lbnQoXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGRlcHRoU3RlbmNpbFRleHR1cmUsXG4gICAgICAgICAgJ2RlcHRoJyxcbiAgICAgICAgICAndWludDMyJylcbiAgICAgIH1cblxuICAgICAgaWYgKHN0ZW5jaWxCdWZmZXIpIHtcbiAgICAgICAgc3RlbmNpbEF0dGFjaG1lbnQgPSBwYXJzZUF0dGFjaG1lbnQoc3RlbmNpbEJ1ZmZlcilcbiAgICAgIH0gZWxzZSBpZiAobmVlZHNTdGVuY2lsICYmICFuZWVkc0RlcHRoKSB7XG4gICAgICAgIHN0ZW5jaWxBdHRhY2htZW50ID0gYWxsb2NBdHRhY2htZW50KFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAnc3RlbmNpbCcsXG4gICAgICAgICAgJ3VpbnQ4JylcbiAgICAgIH1cblxuICAgICAgaWYgKGRlcHRoU3RlbmNpbEJ1ZmZlcikge1xuICAgICAgICBkZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gcGFyc2VBdHRhY2htZW50KGRlcHRoU3RlbmNpbEJ1ZmZlcilcbiAgICAgIH0gZWxzZSBpZiAoIWRlcHRoQnVmZmVyICYmICFzdGVuY2lsQnVmZmVyICYmIG5lZWRzU3RlbmNpbCAmJiBuZWVkc0RlcHRoKSB7XG4gICAgICAgIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBhbGxvY0F0dGFjaG1lbnQoXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGRlcHRoU3RlbmNpbFRleHR1cmUsXG4gICAgICAgICAgJ2RlcHRoIHN0ZW5jaWwnLFxuICAgICAgICAgICdkZXB0aCBzdGVuY2lsJylcbiAgICAgIH1cblxuICAgICAgY2hlY2skMShcbiAgICAgICAgKCEhZGVwdGhCdWZmZXIpICsgKCEhc3RlbmNpbEJ1ZmZlcikgKyAoISFkZXB0aFN0ZW5jaWxCdWZmZXIpIDw9IDEsXG4gICAgICAgICdpbnZhbGlkIGZyYW1lYnVmZmVyIGNvbmZpZ3VyYXRpb24sIGNhbiBzcGVjaWZ5IGV4YWN0bHkgb25lIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCcpXG5cbiAgICAgIHZhciBjb21tb25Db2xvckF0dGFjaG1lbnRTaXplID0gbnVsbFxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JBdHRhY2htZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpbmNSZWZBbmRDaGVja1NoYXBlKGNvbG9yQXR0YWNobWVudHNbaV0sIHdpZHRoLCBoZWlnaHQpXG4gICAgICAgIGNoZWNrJDEoIWNvbG9yQXR0YWNobWVudHNbaV0gfHxcbiAgICAgICAgICAoY29sb3JBdHRhY2htZW50c1tpXS50ZXh0dXJlICYmXG4gICAgICAgICAgICBjb2xvclRleHR1cmVGb3JtYXRFbnVtcy5pbmRleE9mKGNvbG9yQXR0YWNobWVudHNbaV0udGV4dHVyZS5fdGV4dHVyZS5mb3JtYXQpID49IDApIHx8XG4gICAgICAgICAgKGNvbG9yQXR0YWNobWVudHNbaV0ucmVuZGVyYnVmZmVyICYmXG4gICAgICAgICAgICBjb2xvclJlbmRlcmJ1ZmZlckZvcm1hdEVudW1zLmluZGV4T2YoY29sb3JBdHRhY2htZW50c1tpXS5yZW5kZXJidWZmZXIuX3JlbmRlcmJ1ZmZlci5mb3JtYXQpID49IDApLFxuICAgICAgICAnZnJhbWVidWZmZXIgY29sb3IgYXR0YWNobWVudCAnICsgaSArICcgaXMgaW52YWxpZCcpXG5cbiAgICAgICAgaWYgKGNvbG9yQXR0YWNobWVudHNbaV0gJiYgY29sb3JBdHRhY2htZW50c1tpXS50ZXh0dXJlKSB7XG4gICAgICAgICAgdmFyIGNvbG9yQXR0YWNobWVudFNpemUgPVxuICAgICAgICAgICAgICB0ZXh0dXJlRm9ybWF0Q2hhbm5lbHNbY29sb3JBdHRhY2htZW50c1tpXS50ZXh0dXJlLl90ZXh0dXJlLmZvcm1hdF0gKlxuICAgICAgICAgICAgICB0ZXh0dXJlVHlwZVNpemVzW2NvbG9yQXR0YWNobWVudHNbaV0udGV4dHVyZS5fdGV4dHVyZS50eXBlXVxuXG4gICAgICAgICAgaWYgKGNvbW1vbkNvbG9yQXR0YWNobWVudFNpemUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbW1vbkNvbG9yQXR0YWNobWVudFNpemUgPSBjb2xvckF0dGFjaG1lbnRTaXplXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIGNvbG9yIGF0dGFjaG1lbnRzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGJpdHBsYW5lc1xuICAgICAgICAgICAgLy8gKHRoYXQgaXMsIHRoZSBzYW1lIG51bWVyIG9mIGJpdHMgcGVyIHBpeGVsKVxuICAgICAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgR0xFUzIuMCBzdGFuZGFyZC4gU2VlIHRoZSBiZWdpbm5pbmcgb2YgQ2hhcHRlciA0IGluIHRoYXQgZG9jdW1lbnQuXG4gICAgICAgICAgICBjaGVjayQxKGNvbW1vbkNvbG9yQXR0YWNobWVudFNpemUgPT09IGNvbG9yQXR0YWNobWVudFNpemUsXG4gICAgICAgICAgICAgICdhbGwgY29sb3IgYXR0YWNobWVudHMgbXVjaCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbC4nKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW5jUmVmQW5kQ2hlY2tTaGFwZShkZXB0aEF0dGFjaG1lbnQsIHdpZHRoLCBoZWlnaHQpXG4gICAgICBjaGVjayQxKCFkZXB0aEF0dGFjaG1lbnQgfHxcbiAgICAgICAgKGRlcHRoQXR0YWNobWVudC50ZXh0dXJlICYmXG4gICAgICAgICAgZGVwdGhBdHRhY2htZW50LnRleHR1cmUuX3RleHR1cmUuZm9ybWF0ID09PSBHTF9ERVBUSF9DT01QT05FTlQkMSkgfHxcbiAgICAgICAgKGRlcHRoQXR0YWNobWVudC5yZW5kZXJidWZmZXIgJiZcbiAgICAgICAgICBkZXB0aEF0dGFjaG1lbnQucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIuZm9ybWF0ID09PSBHTF9ERVBUSF9DT01QT05FTlQxNiQxKSxcbiAgICAgICdpbnZhbGlkIGRlcHRoIGF0dGFjaG1lbnQgZm9yIGZyYW1lYnVmZmVyIG9iamVjdCcpXG4gICAgICBpbmNSZWZBbmRDaGVja1NoYXBlKHN0ZW5jaWxBdHRhY2htZW50LCB3aWR0aCwgaGVpZ2h0KVxuICAgICAgY2hlY2skMSghc3RlbmNpbEF0dGFjaG1lbnQgfHxcbiAgICAgICAgKHN0ZW5jaWxBdHRhY2htZW50LnJlbmRlcmJ1ZmZlciAmJlxuICAgICAgICAgIHN0ZW5jaWxBdHRhY2htZW50LnJlbmRlcmJ1ZmZlci5fcmVuZGVyYnVmZmVyLmZvcm1hdCA9PT0gR0xfU1RFTkNJTF9JTkRFWDgkMSksXG4gICAgICAnaW52YWxpZCBzdGVuY2lsIGF0dGFjaG1lbnQgZm9yIGZyYW1lYnVmZmVyIG9iamVjdCcpXG4gICAgICBpbmNSZWZBbmRDaGVja1NoYXBlKGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQsIHdpZHRoLCBoZWlnaHQpXG4gICAgICBjaGVjayQxKCFkZXB0aFN0ZW5jaWxBdHRhY2htZW50IHx8XG4gICAgICAgIChkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnRleHR1cmUgJiZcbiAgICAgICAgICBkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnRleHR1cmUuX3RleHR1cmUuZm9ybWF0ID09PSBHTF9ERVBUSF9TVEVOQ0lMJDIpIHx8XG4gICAgICAgIChkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnJlbmRlcmJ1ZmZlciAmJlxuICAgICAgICAgIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIuZm9ybWF0ID09PSBHTF9ERVBUSF9TVEVOQ0lMJDIpLFxuICAgICAgJ2ludmFsaWQgZGVwdGgtc3RlbmNpbCBhdHRhY2htZW50IGZvciBmcmFtZWJ1ZmZlciBvYmplY3QnKVxuXG4gICAgICAvLyBkZWNyZW1lbnQgcmVmZXJlbmNlc1xuICAgICAgZGVjRkJPUmVmcyhmcmFtZWJ1ZmZlcilcblxuICAgICAgZnJhbWVidWZmZXIud2lkdGggPSB3aWR0aFxuICAgICAgZnJhbWVidWZmZXIuaGVpZ2h0ID0gaGVpZ2h0XG5cbiAgICAgIGZyYW1lYnVmZmVyLmNvbG9yQXR0YWNobWVudHMgPSBjb2xvckF0dGFjaG1lbnRzXG4gICAgICBmcmFtZWJ1ZmZlci5kZXB0aEF0dGFjaG1lbnQgPSBkZXB0aEF0dGFjaG1lbnRcbiAgICAgIGZyYW1lYnVmZmVyLnN0ZW5jaWxBdHRhY2htZW50ID0gc3RlbmNpbEF0dGFjaG1lbnRcbiAgICAgIGZyYW1lYnVmZmVyLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBkZXB0aFN0ZW5jaWxBdHRhY2htZW50XG5cbiAgICAgIHJlZ2xGcmFtZWJ1ZmZlci5jb2xvciA9IGNvbG9yQXR0YWNobWVudHMubWFwKHVud3JhcEF0dGFjaG1lbnQpXG4gICAgICByZWdsRnJhbWVidWZmZXIuZGVwdGggPSB1bndyYXBBdHRhY2htZW50KGRlcHRoQXR0YWNobWVudClcbiAgICAgIHJlZ2xGcmFtZWJ1ZmZlci5zdGVuY2lsID0gdW53cmFwQXR0YWNobWVudChzdGVuY2lsQXR0YWNobWVudClcbiAgICAgIHJlZ2xGcmFtZWJ1ZmZlci5kZXB0aFN0ZW5jaWwgPSB1bndyYXBBdHRhY2htZW50KGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQpXG5cbiAgICAgIHJlZ2xGcmFtZWJ1ZmZlci53aWR0aCA9IGZyYW1lYnVmZmVyLndpZHRoXG4gICAgICByZWdsRnJhbWVidWZmZXIuaGVpZ2h0ID0gZnJhbWVidWZmZXIuaGVpZ2h0XG5cbiAgICAgIHVwZGF0ZUZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyKVxuXG4gICAgICByZXR1cm4gcmVnbEZyYW1lYnVmZmVyXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzaXplICh3XywgaF8pIHtcbiAgICAgIGNoZWNrJDEoZnJhbWVidWZmZXJTdGF0ZS5uZXh0ICE9PSBmcmFtZWJ1ZmZlcixcbiAgICAgICAgJ2NhbiBub3QgcmVzaXplIGEgZnJhbWVidWZmZXIgd2hpY2ggaXMgY3VycmVudGx5IGluIHVzZScpXG5cbiAgICAgIHZhciB3ID0gTWF0aC5tYXgod18gfCAwLCAxKVxuICAgICAgdmFyIGggPSBNYXRoLm1heCgoaF8gfCAwKSB8fCB3LCAxKVxuICAgICAgaWYgKHcgPT09IGZyYW1lYnVmZmVyLndpZHRoICYmIGggPT09IGZyYW1lYnVmZmVyLmhlaWdodCkge1xuICAgICAgICByZXR1cm4gcmVnbEZyYW1lYnVmZmVyXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc2l6ZSBhbGwgYnVmZmVyc1xuICAgICAgdmFyIGNvbG9yQXR0YWNobWVudHMgPSBmcmFtZWJ1ZmZlci5jb2xvckF0dGFjaG1lbnRzXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbG9yQXR0YWNobWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcmVzaXplQXR0YWNobWVudChjb2xvckF0dGFjaG1lbnRzW2ldLCB3LCBoKVxuICAgICAgfVxuICAgICAgcmVzaXplQXR0YWNobWVudChmcmFtZWJ1ZmZlci5kZXB0aEF0dGFjaG1lbnQsIHcsIGgpXG4gICAgICByZXNpemVBdHRhY2htZW50KGZyYW1lYnVmZmVyLnN0ZW5jaWxBdHRhY2htZW50LCB3LCBoKVxuICAgICAgcmVzaXplQXR0YWNobWVudChmcmFtZWJ1ZmZlci5kZXB0aFN0ZW5jaWxBdHRhY2htZW50LCB3LCBoKVxuXG4gICAgICBmcmFtZWJ1ZmZlci53aWR0aCA9IHJlZ2xGcmFtZWJ1ZmZlci53aWR0aCA9IHdcbiAgICAgIGZyYW1lYnVmZmVyLmhlaWdodCA9IHJlZ2xGcmFtZWJ1ZmZlci5oZWlnaHQgPSBoXG5cbiAgICAgIHVwZGF0ZUZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyKVxuXG4gICAgICByZXR1cm4gcmVnbEZyYW1lYnVmZmVyXG4gICAgfVxuXG4gICAgcmVnbEZyYW1lYnVmZmVyKGEwLCBhMSlcblxuICAgIHJldHVybiBleHRlbmQocmVnbEZyYW1lYnVmZmVyLCB7XG4gICAgICByZXNpemU6IHJlc2l6ZSxcbiAgICAgIF9yZWdsVHlwZTogJ2ZyYW1lYnVmZmVyJyxcbiAgICAgIF9mcmFtZWJ1ZmZlcjogZnJhbWVidWZmZXIsXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc3Ryb3koZnJhbWVidWZmZXIpXG4gICAgICAgIGRlY0ZCT1JlZnMoZnJhbWVidWZmZXIpXG4gICAgICB9LFxuICAgICAgdXNlOiBmdW5jdGlvbiAoYmxvY2spIHtcbiAgICAgICAgZnJhbWVidWZmZXJTdGF0ZS5zZXRGQk8oe1xuICAgICAgICAgIGZyYW1lYnVmZmVyOiByZWdsRnJhbWVidWZmZXJcbiAgICAgICAgfSwgYmxvY2spXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUN1YmVGQk8gKG9wdGlvbnMpIHtcbiAgICB2YXIgZmFjZXMgPSBBcnJheSg2KVxuXG4gICAgZnVuY3Rpb24gcmVnbEZyYW1lYnVmZmVyQ3ViZSAoYSkge1xuICAgICAgdmFyIGlcblxuICAgICAgY2hlY2skMShmYWNlcy5pbmRleE9mKGZyYW1lYnVmZmVyU3RhdGUubmV4dCkgPCAwLFxuICAgICAgICAnY2FuIG5vdCB1cGRhdGUgZnJhbWVidWZmZXIgd2hpY2ggaXMgY3VycmVudGx5IGluIHVzZScpXG5cbiAgICAgIHZhciBwYXJhbXMgPSB7XG4gICAgICAgIGNvbG9yOiBudWxsXG4gICAgICB9XG5cbiAgICAgIHZhciByYWRpdXMgPSAwXG5cbiAgICAgIHZhciBjb2xvckJ1ZmZlciA9IG51bGxcbiAgICAgIHZhciBjb2xvckZvcm1hdCA9ICdyZ2JhJ1xuICAgICAgdmFyIGNvbG9yVHlwZSA9ICd1aW50OCdcbiAgICAgIHZhciBjb2xvckNvdW50ID0gMVxuXG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJhZGl1cyA9IGEgfCAwXG4gICAgICB9IGVsc2UgaWYgKCFhKSB7XG4gICAgICAgIHJhZGl1cyA9IDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrJDEudHlwZShhLCAnb2JqZWN0JywgJ2ludmFsaWQgYXJndW1lbnRzIGZvciBmcmFtZWJ1ZmZlcicpXG4gICAgICAgIHZhciBvcHRpb25zID0gYVxuXG4gICAgICAgIGlmICgnc2hhcGUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICB2YXIgc2hhcGUgPSBvcHRpb25zLnNoYXBlXG4gICAgICAgICAgY2hlY2skMShcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoc2hhcGUpICYmIHNoYXBlLmxlbmd0aCA+PSAyLFxuICAgICAgICAgICAgJ2ludmFsaWQgc2hhcGUgZm9yIGZyYW1lYnVmZmVyJylcbiAgICAgICAgICBjaGVjayQxKFxuICAgICAgICAgICAgc2hhcGVbMF0gPT09IHNoYXBlWzFdLFxuICAgICAgICAgICAgJ2N1YmUgZnJhbWVidWZmZXIgbXVzdCBiZSBzcXVhcmUnKVxuICAgICAgICAgIHJhZGl1cyA9IHNoYXBlWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCdyYWRpdXMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJhZGl1cyA9IG9wdGlvbnMucmFkaXVzIHwgMFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ3dpZHRoJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICByYWRpdXMgPSBvcHRpb25zLndpZHRoIHwgMFxuICAgICAgICAgICAgaWYgKCdoZWlnaHQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgY2hlY2skMShvcHRpb25zLmhlaWdodCA9PT0gcmFkaXVzLCAnbXVzdCBiZSBzcXVhcmUnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoJ2hlaWdodCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgcmFkaXVzID0gb3B0aW9ucy5oZWlnaHQgfCAwXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdjb2xvcicgaW4gb3B0aW9ucyB8fFxuICAgICAgICAgICAgJ2NvbG9ycycgaW4gb3B0aW9ucykge1xuICAgICAgICAgIGNvbG9yQnVmZmVyID1cbiAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgfHxcbiAgICAgICAgICAgIG9wdGlvbnMuY29sb3JzXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sb3JCdWZmZXIpKSB7XG4gICAgICAgICAgICBjaGVjayQxKFxuICAgICAgICAgICAgICBjb2xvckJ1ZmZlci5sZW5ndGggPT09IDEgfHwgZXh0ZW5zaW9ucy53ZWJnbF9kcmF3X2J1ZmZlcnMsXG4gICAgICAgICAgICAgICdtdWx0aXBsZSByZW5kZXIgdGFyZ2V0cyBub3Qgc3VwcG9ydGVkJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbG9yQnVmZmVyKSB7XG4gICAgICAgICAgaWYgKCdjb2xvckNvdW50JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb2xvckNvdW50ID0gb3B0aW9ucy5jb2xvckNvdW50IHwgMFxuICAgICAgICAgICAgY2hlY2skMShjb2xvckNvdW50ID4gMCwgJ2ludmFsaWQgY29sb3IgYnVmZmVyIGNvdW50JylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoJ2NvbG9yVHlwZScgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgY2hlY2skMS5vbmVPZihcbiAgICAgICAgICAgICAgb3B0aW9ucy5jb2xvclR5cGUsIGNvbG9yVHlwZXMsXG4gICAgICAgICAgICAgICdpbnZhbGlkIGNvbG9yIHR5cGUnKVxuICAgICAgICAgICAgY29sb3JUeXBlID0gb3B0aW9ucy5jb2xvclR5cGVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoJ2NvbG9yRm9ybWF0JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb2xvckZvcm1hdCA9IG9wdGlvbnMuY29sb3JGb3JtYXRcbiAgICAgICAgICAgIGNoZWNrJDEub25lT2YoXG4gICAgICAgICAgICAgIG9wdGlvbnMuY29sb3JGb3JtYXQsIGNvbG9yVGV4dHVyZUZvcm1hdHMsXG4gICAgICAgICAgICAgICdpbnZhbGlkIGNvbG9yIGZvcm1hdCBmb3IgdGV4dHVyZScpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdkZXB0aCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgIHBhcmFtcy5kZXB0aCA9IG9wdGlvbnMuZGVwdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnc3RlbmNpbCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgIHBhcmFtcy5zdGVuY2lsID0gb3B0aW9ucy5zdGVuY2lsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ2RlcHRoU3RlbmNpbCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgIHBhcmFtcy5kZXB0aFN0ZW5jaWwgPSBvcHRpb25zLmRlcHRoU3RlbmNpbFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBjb2xvckN1YmVzXG4gICAgICBpZiAoY29sb3JCdWZmZXIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sb3JCdWZmZXIpKSB7XG4gICAgICAgICAgY29sb3JDdWJlcyA9IFtdXG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9yQnVmZmVyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb2xvckN1YmVzW2ldID0gY29sb3JCdWZmZXJbaV1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sb3JDdWJlcyA9IFsgY29sb3JCdWZmZXIgXVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xvckN1YmVzID0gQXJyYXkoY29sb3JDb3VudClcbiAgICAgICAgdmFyIGN1YmVNYXBQYXJhbXMgPSB7XG4gICAgICAgICAgcmFkaXVzOiByYWRpdXMsXG4gICAgICAgICAgZm9ybWF0OiBjb2xvckZvcm1hdCxcbiAgICAgICAgICB0eXBlOiBjb2xvclR5cGVcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JDb3VudDsgKytpKSB7XG4gICAgICAgICAgY29sb3JDdWJlc1tpXSA9IHRleHR1cmVTdGF0ZS5jcmVhdGVDdWJlKGN1YmVNYXBQYXJhbXMpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgY29sb3IgY3ViZXNcbiAgICAgIHBhcmFtcy5jb2xvciA9IEFycmF5KGNvbG9yQ3ViZXMubGVuZ3RoKVxuICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9yQ3ViZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGN1YmUgPSBjb2xvckN1YmVzW2ldXG4gICAgICAgIGNoZWNrJDEoXG4gICAgICAgICAgdHlwZW9mIGN1YmUgPT09ICdmdW5jdGlvbicgJiYgY3ViZS5fcmVnbFR5cGUgPT09ICd0ZXh0dXJlQ3ViZScsXG4gICAgICAgICAgJ2ludmFsaWQgY3ViZSBtYXAnKVxuICAgICAgICByYWRpdXMgPSByYWRpdXMgfHwgY3ViZS53aWR0aFxuICAgICAgICBjaGVjayQxKFxuICAgICAgICAgIGN1YmUud2lkdGggPT09IHJhZGl1cyAmJiBjdWJlLmhlaWdodCA9PT0gcmFkaXVzLFxuICAgICAgICAgICdpbnZhbGlkIGN1YmUgbWFwIHNoYXBlJylcbiAgICAgICAgcGFyYW1zLmNvbG9yW2ldID0ge1xuICAgICAgICAgIHRhcmdldDogR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YJDIsXG4gICAgICAgICAgZGF0YTogY29sb3JDdWJlc1tpXVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb2xvckN1YmVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgcGFyYW1zLmNvbG9yW2pdLnRhcmdldCA9IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCQyICsgaVxuICAgICAgICB9XG4gICAgICAgIC8vIHJldXNlIGRlcHRoLXN0ZW5jaWwgYXR0YWNobWVudHMgYWNyb3NzIGFsbCBjdWJlIG1hcHNcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgcGFyYW1zLmRlcHRoID0gZmFjZXNbMF0uZGVwdGhcbiAgICAgICAgICBwYXJhbXMuc3RlbmNpbCA9IGZhY2VzWzBdLnN0ZW5jaWxcbiAgICAgICAgICBwYXJhbXMuZGVwdGhTdGVuY2lsID0gZmFjZXNbMF0uZGVwdGhTdGVuY2lsXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhY2VzW2ldKSB7XG4gICAgICAgICAgKGZhY2VzW2ldKShwYXJhbXMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmFjZXNbaV0gPSBjcmVhdGVGQk8ocGFyYW1zKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleHRlbmQocmVnbEZyYW1lYnVmZmVyQ3ViZSwge1xuICAgICAgICB3aWR0aDogcmFkaXVzLFxuICAgICAgICBoZWlnaHQ6IHJhZGl1cyxcbiAgICAgICAgY29sb3I6IGNvbG9yQ3ViZXNcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzaXplIChyYWRpdXNfKSB7XG4gICAgICB2YXIgaVxuICAgICAgdmFyIHJhZGl1cyA9IHJhZGl1c18gfCAwXG4gICAgICBjaGVjayQxKHJhZGl1cyA+IDAgJiYgcmFkaXVzIDw9IGxpbWl0cy5tYXhDdWJlTWFwU2l6ZSxcbiAgICAgICAgJ2ludmFsaWQgcmFkaXVzIGZvciBjdWJlIGZibycpXG5cbiAgICAgIGlmIChyYWRpdXMgPT09IHJlZ2xGcmFtZWJ1ZmZlckN1YmUud2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2xGcmFtZWJ1ZmZlckN1YmVcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbG9ycyA9IHJlZ2xGcmFtZWJ1ZmZlckN1YmUuY29sb3JcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29sb3JzW2ldLnJlc2l6ZShyYWRpdXMpXG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHtcbiAgICAgICAgZmFjZXNbaV0ucmVzaXplKHJhZGl1cylcbiAgICAgIH1cblxuICAgICAgcmVnbEZyYW1lYnVmZmVyQ3ViZS53aWR0aCA9IHJlZ2xGcmFtZWJ1ZmZlckN1YmUuaGVpZ2h0ID0gcmFkaXVzXG5cbiAgICAgIHJldHVybiByZWdsRnJhbWVidWZmZXJDdWJlXG4gICAgfVxuXG4gICAgcmVnbEZyYW1lYnVmZmVyQ3ViZShvcHRpb25zKVxuXG4gICAgcmV0dXJuIGV4dGVuZChyZWdsRnJhbWVidWZmZXJDdWJlLCB7XG4gICAgICBmYWNlczogZmFjZXMsXG4gICAgICByZXNpemU6IHJlc2l6ZSxcbiAgICAgIF9yZWdsVHlwZTogJ2ZyYW1lYnVmZmVyQ3ViZScsXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZhY2VzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgICBmLmRlc3Ryb3koKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlRnJhbWVidWZmZXJzICgpIHtcbiAgICBmcmFtZWJ1ZmZlclN0YXRlLmN1ciA9IG51bGxcbiAgICBmcmFtZWJ1ZmZlclN0YXRlLm5leHQgPSBudWxsXG4gICAgZnJhbWVidWZmZXJTdGF0ZS5kaXJ0eSA9IHRydWVcbiAgICB2YWx1ZXMoZnJhbWVidWZmZXJTZXQpLmZvckVhY2goZnVuY3Rpb24gKGZiKSB7XG4gICAgICBmYi5mcmFtZWJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKClcbiAgICAgIHVwZGF0ZUZyYW1lYnVmZmVyKGZiKVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gZXh0ZW5kKGZyYW1lYnVmZmVyU3RhdGUsIHtcbiAgICBnZXRGcmFtZWJ1ZmZlcjogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdmdW5jdGlvbicgJiYgb2JqZWN0Ll9yZWdsVHlwZSA9PT0gJ2ZyYW1lYnVmZmVyJykge1xuICAgICAgICB2YXIgZmJvID0gb2JqZWN0Ll9mcmFtZWJ1ZmZlclxuICAgICAgICBpZiAoZmJvIGluc3RhbmNlb2YgUkVHTEZyYW1lYnVmZmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGZib1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG4gICAgY3JlYXRlOiBjcmVhdGVGQk8sXG4gICAgY3JlYXRlQ3ViZTogY3JlYXRlQ3ViZUZCTyxcbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFsdWVzKGZyYW1lYnVmZmVyU2V0KS5mb3JFYWNoKGRlc3Ryb3kpXG4gICAgfSxcbiAgICByZXN0b3JlOiByZXN0b3JlRnJhbWVidWZmZXJzXG4gIH0pXG59XG5cbnZhciBHTF9GTE9BVCQ2ID0gNTEyNlxudmFyIEdMX0FSUkFZX0JVRkZFUiQxID0gMzQ5NjJcblxuZnVuY3Rpb24gQXR0cmlidXRlUmVjb3JkICgpIHtcbiAgdGhpcy5zdGF0ZSA9IDBcblxuICB0aGlzLnggPSAwLjBcbiAgdGhpcy55ID0gMC4wXG4gIHRoaXMueiA9IDAuMFxuICB0aGlzLncgPSAwLjBcblxuICB0aGlzLmJ1ZmZlciA9IG51bGxcbiAgdGhpcy5zaXplID0gMFxuICB0aGlzLm5vcm1hbGl6ZWQgPSBmYWxzZVxuICB0aGlzLnR5cGUgPSBHTF9GTE9BVCQ2XG4gIHRoaXMub2Zmc2V0ID0gMFxuICB0aGlzLnN0cmlkZSA9IDBcbiAgdGhpcy5kaXZpc29yID0gMFxufVxuXG5mdW5jdGlvbiB3cmFwQXR0cmlidXRlU3RhdGUgKFxuICBnbCxcbiAgZXh0ZW5zaW9ucyxcbiAgbGltaXRzLFxuICBzdGF0cyxcbiAgYnVmZmVyU3RhdGUpIHtcbiAgdmFyIE5VTV9BVFRSSUJVVEVTID0gbGltaXRzLm1heEF0dHJpYnV0ZXNcbiAgdmFyIGF0dHJpYnV0ZUJpbmRpbmdzID0gbmV3IEFycmF5KE5VTV9BVFRSSUJVVEVTKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IE5VTV9BVFRSSUJVVEVTOyArK2kpIHtcbiAgICBhdHRyaWJ1dGVCaW5kaW5nc1tpXSA9IG5ldyBBdHRyaWJ1dGVSZWNvcmQoKVxuICB9XG4gIHZhciB2YW9Db3VudCA9IDBcbiAgdmFyIHZhb1NldCA9IHt9XG5cbiAgdmFyIHN0YXRlID0ge1xuICAgIFJlY29yZDogQXR0cmlidXRlUmVjb3JkLFxuICAgIHNjb3BlOiB7fSxcbiAgICBzdGF0ZTogYXR0cmlidXRlQmluZGluZ3MsXG4gICAgY3VycmVudFZBTzogbnVsbCxcbiAgICB0YXJnZXRWQU86IG51bGwsXG4gICAgcmVzdG9yZTogZXh0VkFPKCkgPyByZXN0b3JlVkFPIDogZnVuY3Rpb24gKCkge30sXG4gICAgY3JlYXRlVkFPOiBjcmVhdGVWQU8sXG4gICAgZ2V0VkFPOiBnZXRWQU8sXG4gICAgZGVzdHJveUJ1ZmZlcjogZGVzdHJveUJ1ZmZlcixcbiAgICBzZXRWQU86IGV4dFZBTygpID8gc2V0VkFPRVhUIDogc2V0VkFPRW11bGF0ZWQsXG4gICAgY2xlYXI6IGV4dFZBTygpID8gZGVzdHJveVZBT0VYVCA6IGZ1bmN0aW9uICgpIHt9XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95QnVmZmVyIChidWZmZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZUJpbmRpbmdzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgcmVjb3JkID0gYXR0cmlidXRlQmluZGluZ3NbaV1cbiAgICAgIGlmIChyZWNvcmQuYnVmZmVyID09PSBidWZmZXIpIHtcbiAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpXG4gICAgICAgIHJlY29yZC5idWZmZXIgPSBudWxsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXh0VkFPICgpIHtcbiAgICByZXR1cm4gZXh0ZW5zaW9ucy5vZXNfdmVydGV4X2FycmF5X29iamVjdFxuICB9XG5cbiAgZnVuY3Rpb24gZXh0SW5zdGFuY2VkICgpIHtcbiAgICByZXR1cm4gZXh0ZW5zaW9ucy5hbmdsZV9pbnN0YW5jZWRfYXJyYXlzXG4gIH1cblxuICBmdW5jdGlvbiBnZXRWQU8gKHZhbykge1xuICAgIGlmICh0eXBlb2YgdmFvID09PSAnZnVuY3Rpb24nICYmIHZhby5fdmFvKSB7XG4gICAgICByZXR1cm4gdmFvLl92YW9cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFZBT0VYVCAodmFvKSB7XG4gICAgaWYgKHZhbyA9PT0gc3RhdGUuY3VycmVudFZBTykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHZhciBleHQgPSBleHRWQU8oKVxuICAgIGlmICh2YW8pIHtcbiAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVModmFvLnZhbylcbiAgICB9IGVsc2Uge1xuICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyhudWxsKVxuICAgIH1cbiAgICBzdGF0ZS5jdXJyZW50VkFPID0gdmFvXG4gIH1cblxuICBmdW5jdGlvbiBzZXRWQU9FbXVsYXRlZCAodmFvKSB7XG4gICAgaWYgKHZhbyA9PT0gc3RhdGUuY3VycmVudFZBTykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh2YW8pIHtcbiAgICAgIHZhby5iaW5kQXR0cnMoKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZXh0aSA9IGV4dEluc3RhbmNlZCgpXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZUJpbmRpbmdzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBiaW5kaW5nID0gYXR0cmlidXRlQmluZGluZ3NbaV1cbiAgICAgICAgaWYgKGJpbmRpbmcuYnVmZmVyKSB7XG4gICAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaSlcbiAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGksIGJpbmRpbmcuc2l6ZSwgYmluZGluZy50eXBlLCBiaW5kaW5nLm5vcm1hbGl6ZWQsIGJpbmRpbmcuc3RyaWRlLCBiaW5kaW5nLm9mZmZzZXQpXG4gICAgICAgICAgaWYgKGV4dGkgJiYgYmluZGluZy5kaXZpc29yKSB7XG4gICAgICAgICAgICBleHRpLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRShpLCBiaW5kaW5nLmRpdmlzb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpKVxuICAgICAgICAgIGdsLnZlcnRleEF0dHJpYjRmKGksIGJpbmRpbmcueCwgYmluZGluZy55LCBiaW5kaW5nLnosIGJpbmRpbmcudylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzdGF0ZS5jdXJyZW50VkFPID0gdmFvXG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95VkFPRVhUICgpIHtcbiAgICB2YWx1ZXModmFvU2V0KS5mb3JFYWNoKGZ1bmN0aW9uICh2YW8pIHtcbiAgICAgIHZhby5kZXN0cm95KClcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gUkVHTFZBTyAoKSB7XG4gICAgdGhpcy5pZCA9ICsrdmFvQ291bnRcbiAgICB0aGlzLmF0dHJpYnV0ZXMgPSBbXVxuICAgIHZhciBleHRlbnNpb24gPSBleHRWQU8oKVxuICAgIGlmIChleHRlbnNpb24pIHtcbiAgICAgIHRoaXMudmFvID0gZXh0ZW5zaW9uLmNyZWF0ZVZlcnRleEFycmF5T0VTKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YW8gPSBudWxsXG4gICAgfVxuICAgIHZhb1NldFt0aGlzLmlkXSA9IHRoaXNcbiAgICB0aGlzLmJ1ZmZlcnMgPSBbXVxuICB9XG5cbiAgUkVHTFZBTy5wcm90b3R5cGUuYmluZEF0dHJzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRpID0gZXh0SW5zdGFuY2VkKClcbiAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGF0dHIgPSBhdHRyaWJ1dGVzW2ldXG4gICAgICBpZiAoYXR0ci5idWZmZXIpIHtcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaSlcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIkMSwgYXR0ci5idWZmZXIuYnVmZmVyKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGksIGF0dHIuc2l6ZSwgYXR0ci50eXBlLCBhdHRyLm5vcm1hbGl6ZWQsIGF0dHIuc3RyaWRlLCBhdHRyLm9mZnNldClcbiAgICAgICAgaWYgKGV4dGkgJiYgYXR0ci5kaXZpc29yKSB7XG4gICAgICAgICAgZXh0aS52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoaSwgYXR0ci5kaXZpc29yKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaSlcbiAgICAgICAgZ2wudmVydGV4QXR0cmliNGYoaSwgYXR0ci54LCBhdHRyLnksIGF0dHIueiwgYXR0ci53KVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBqID0gYXR0cmlidXRlcy5sZW5ndGg7IGogPCBOVU1fQVRUUklCVVRFUzsgKytqKSB7XG4gICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoailcbiAgICB9XG4gIH1cblxuICBSRUdMVkFPLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHQgPSBleHRWQU8oKVxuICAgIGlmIChleHQpIHtcbiAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVModGhpcy52YW8pXG4gICAgICB0aGlzLmJpbmRBdHRycygpXG4gICAgICBzdGF0ZS5jdXJyZW50VkFPID0gdGhpc1xuICAgIH1cbiAgfVxuXG4gIFJFR0xWQU8ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMudmFvKSB7XG4gICAgICB2YXIgZXh0ZW5zaW9uID0gZXh0VkFPKClcbiAgICAgIGlmICh0aGlzID09PSBzdGF0ZS5jdXJyZW50VkFPKSB7XG4gICAgICAgIHN0YXRlLmN1cnJlbnRWQU8gPSBudWxsXG4gICAgICAgIGV4dGVuc2lvbi5iaW5kVmVydGV4QXJyYXlPRVMobnVsbClcbiAgICAgIH1cbiAgICAgIGV4dGVuc2lvbi5kZWxldGVWZXJ0ZXhBcnJheU9FUyh0aGlzLnZhbylcbiAgICAgIHRoaXMudmFvID0gbnVsbFxuICAgIH1cbiAgICBpZiAodmFvU2V0W3RoaXMuaWRdKSB7XG4gICAgICBkZWxldGUgdmFvU2V0W3RoaXMuaWRdXG4gICAgICBzdGF0cy52YW9Db3VudCAtPSAxXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdG9yZVZBTyAoKSB7XG4gICAgdmFyIGV4dCA9IGV4dFZBTygpXG4gICAgaWYgKGV4dCkge1xuICAgICAgdmFsdWVzKHZhb1NldCkuZm9yRWFjaChmdW5jdGlvbiAodmFvKSB7XG4gICAgICAgIHZhby5yZWZyZXNoKClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlVkFPIChfYXR0cikge1xuICAgIHZhciB2YW8gPSBuZXcgUkVHTFZBTygpXG4gICAgc3RhdHMudmFvQ291bnQgKz0gMVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlVkFPIChhdHRyaWJ1dGVzKSB7XG4gICAgICBjaGVjayQxKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcyksICdhcmd1bWVudHMgdG8gdmVydGV4IGFycmF5IGNvbnN0cnVjdG9yIG11c3QgYmUgYW4gYXJyYXknKVxuICAgICAgY2hlY2skMShhdHRyaWJ1dGVzLmxlbmd0aCA8IE5VTV9BVFRSSUJVVEVTLCAndG9vIG1hbnkgYXR0cmlidXRlcycpXG4gICAgICBjaGVjayQxKGF0dHJpYnV0ZXMubGVuZ3RoID4gMCwgJ211c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgYXR0cmlidXRlJylcblxuICAgICAgdmFyIGJ1ZlVwZGF0ZWQgPSB7fVxuICAgICAgdmFyIG5hdHRyaWJ1dGVzID0gdmFvLmF0dHJpYnV0ZXNcbiAgICAgIG5hdHRyaWJ1dGVzLmxlbmd0aCA9IGF0dHJpYnV0ZXMubGVuZ3RoXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHNwZWMgPSBhdHRyaWJ1dGVzW2ldXG4gICAgICAgIHZhciByZWMgPSBuYXR0cmlidXRlc1tpXSA9IG5ldyBBdHRyaWJ1dGVSZWNvcmQoKVxuICAgICAgICB2YXIgZGF0YSA9IHNwZWMuZGF0YSB8fCBzcGVjXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpIHx8IGlzVHlwZWRBcnJheShkYXRhKSB8fCBpc05EQXJyYXlMaWtlKGRhdGEpKSB7XG4gICAgICAgICAgdmFyIGJ1ZlxuICAgICAgICAgIGlmICh2YW8uYnVmZmVyc1tpXSkge1xuICAgICAgICAgICAgYnVmID0gdmFvLmJ1ZmZlcnNbaV1cbiAgICAgICAgICAgIGlmIChpc1R5cGVkQXJyYXkoZGF0YSkgJiYgYnVmLl9idWZmZXIuYnl0ZUxlbmd0aCA+PSBkYXRhLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgYnVmLnN1YmRhdGEoZGF0YSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJ1Zi5kZXN0cm95KClcbiAgICAgICAgICAgICAgdmFvLmJ1ZmZlcnNbaV0gPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdmFvLmJ1ZmZlcnNbaV0pIHtcbiAgICAgICAgICAgIGJ1ZiA9IHZhby5idWZmZXJzW2ldID0gYnVmZmVyU3RhdGUuY3JlYXRlKHNwZWMsIEdMX0FSUkFZX0JVRkZFUiQxLCBmYWxzZSwgdHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjLmJ1ZmZlciA9IGJ1ZmZlclN0YXRlLmdldEJ1ZmZlcihidWYpXG4gICAgICAgICAgcmVjLnNpemUgPSByZWMuYnVmZmVyLmRpbWVuc2lvbiB8IDBcbiAgICAgICAgICByZWMubm9ybWFsaXplZCA9IGZhbHNlXG4gICAgICAgICAgcmVjLnR5cGUgPSByZWMuYnVmZmVyLmR0eXBlXG4gICAgICAgICAgcmVjLm9mZnNldCA9IDBcbiAgICAgICAgICByZWMuc3RyaWRlID0gMFxuICAgICAgICAgIHJlYy5kaXZpc29yID0gMFxuICAgICAgICAgIHJlYy5zdGF0ZSA9IDFcbiAgICAgICAgICBidWZVcGRhdGVkW2ldID0gMVxuICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlclN0YXRlLmdldEJ1ZmZlcihzcGVjKSkge1xuICAgICAgICAgIHJlYy5idWZmZXIgPSBidWZmZXJTdGF0ZS5nZXRCdWZmZXIoc3BlYylcbiAgICAgICAgICByZWMuc2l6ZSA9IHJlYy5idWZmZXIuZGltZW5zaW9uIHwgMFxuICAgICAgICAgIHJlYy5ub3JtYWxpemVkID0gZmFsc2VcbiAgICAgICAgICByZWMudHlwZSA9IHJlYy5idWZmZXIuZHR5cGVcbiAgICAgICAgICByZWMub2Zmc2V0ID0gMFxuICAgICAgICAgIHJlYy5zdHJpZGUgPSAwXG4gICAgICAgICAgcmVjLmRpdmlzb3IgPSAwXG4gICAgICAgICAgcmVjLnN0YXRlID0gMVxuICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlclN0YXRlLmdldEJ1ZmZlcihzcGVjLmJ1ZmZlcikpIHtcbiAgICAgICAgICByZWMuYnVmZmVyID0gYnVmZmVyU3RhdGUuZ2V0QnVmZmVyKHNwZWMuYnVmZmVyKVxuICAgICAgICAgIHJlYy5zaXplID0gKCgrc3BlYy5zaXplKSB8fCByZWMuYnVmZmVyLmRpbWVuc2lvbikgfCAwXG4gICAgICAgICAgcmVjLm5vcm1hbGl6ZWQgPSAhIXNwZWMubm9ybWFsaXplZCB8fCBmYWxzZVxuICAgICAgICAgIGlmICgndHlwZScgaW4gc3BlYykge1xuICAgICAgICAgICAgY2hlY2skMS5wYXJhbWV0ZXIoc3BlYy50eXBlLCBnbFR5cGVzLCAnaW52YWxpZCBidWZmZXIgdHlwZScpXG4gICAgICAgICAgICByZWMudHlwZSA9IGdsVHlwZXNbc3BlYy50eXBlXVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWMudHlwZSA9IHJlYy5idWZmZXIuZHR5cGVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjLm9mZnNldCA9IChzcGVjLm9mZnNldCB8fCAwKSB8IDBcbiAgICAgICAgICByZWMuc3RyaWRlID0gKHNwZWMuc3RyaWRlIHx8IDApIHwgMFxuICAgICAgICAgIHJlYy5kaXZpc29yID0gKHNwZWMuZGl2aXNvciB8fCAwKSB8IDBcbiAgICAgICAgICByZWMuc3RhdGUgPSAxXG5cbiAgICAgICAgICBjaGVjayQxKHJlYy5zaXplID49IDEgJiYgcmVjLnNpemUgPD0gNCwgJ3NpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDQnKVxuICAgICAgICAgIGNoZWNrJDEocmVjLm9mZnNldCA+PSAwLCAnaW52YWxpZCBvZmZzZXQnKVxuICAgICAgICAgIGNoZWNrJDEocmVjLnN0cmlkZSA+PSAwICYmIHJlYy5zdHJpZGUgPD0gMjU1LCAnc3RyaWRlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUnKVxuICAgICAgICAgIGNoZWNrJDEocmVjLmRpdmlzb3IgPj0gMCwgJ2Rpdmlzb3IgbXVzdCBiZSBwb3NpdGl2ZScpXG4gICAgICAgICAgY2hlY2skMSghcmVjLmRpdmlzb3IgfHwgISFleHRlbnNpb25zLmFuZ2xlX2luc3RhbmNlZF9hcnJheXMsICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIG11c3QgYmUgZW5hYmxlZCB0byB1c2UgZGl2aXNvcicpXG4gICAgICAgIH0gZWxzZSBpZiAoJ3gnIGluIHNwZWMpIHtcbiAgICAgICAgICBjaGVjayQxKGkgPiAwLCAnZmlyc3QgYXR0cmlidXRlIG11c3Qgbm90IGJlIGEgY29uc3RhbnQnKVxuICAgICAgICAgIHJlYy54ID0gK3NwZWMueCB8fCAwXG4gICAgICAgICAgcmVjLnkgPSArc3BlYy55IHx8IDBcbiAgICAgICAgICByZWMueiA9ICtzcGVjLnogfHwgMFxuICAgICAgICAgIHJlYy53ID0gK3NwZWMudyB8fCAwXG4gICAgICAgICAgcmVjLnN0YXRlID0gMlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoZWNrJDEoZmFsc2UsICdpbnZhbGlkIGF0dHJpYnV0ZSBzcGVjIGZvciBsb2NhdGlvbiAnICsgaSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyByZXRpcmUgdW51c2VkIGJ1ZmZlcnNcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFvLmJ1ZmZlcnMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgaWYgKCFidWZVcGRhdGVkW2pdICYmIHZhby5idWZmZXJzW2pdKSB7XG4gICAgICAgICAgdmFvLmJ1ZmZlcnNbal0uZGVzdHJveSgpXG4gICAgICAgICAgdmFvLmJ1ZmZlcnNbal0gPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFvLnJlZnJlc2goKVxuICAgICAgcmV0dXJuIHVwZGF0ZVZBT1xuICAgIH1cblxuICAgIHVwZGF0ZVZBTy5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YW8uYnVmZmVycy5sZW5ndGg7ICsraikge1xuICAgICAgICBpZiAodmFvLmJ1ZmZlcnNbal0pIHtcbiAgICAgICAgICB2YW8uYnVmZmVyc1tqXS5kZXN0cm95KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFvLmJ1ZmZlcnMubGVuZ3RoID0gMFxuICAgICAgdmFvLmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHVwZGF0ZVZBTy5fdmFvID0gdmFvXG4gICAgdXBkYXRlVkFPLl9yZWdsVHlwZSA9ICd2YW8nXG5cbiAgICByZXR1cm4gdXBkYXRlVkFPKF9hdHRyKVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlXG59XG5cbnZhciBHTF9GUkFHTUVOVF9TSEFERVIgPSAzNTYzMlxudmFyIEdMX1ZFUlRFWF9TSEFERVIgPSAzNTYzM1xuXG52YXIgR0xfQUNUSVZFX1VOSUZPUk1TID0gMHg4Qjg2XG52YXIgR0xfQUNUSVZFX0FUVFJJQlVURVMgPSAweDhCODlcblxuZnVuY3Rpb24gd3JhcFNoYWRlclN0YXRlIChnbCwgc3RyaW5nU3RvcmUsIHN0YXRzLCBjb25maWcpIHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIGdsc2wgY29tcGlsYXRpb24gYW5kIGxpbmtpbmdcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBmcmFnU2hhZGVycyA9IHt9XG4gIHZhciB2ZXJ0U2hhZGVycyA9IHt9XG5cbiAgZnVuY3Rpb24gQWN0aXZlSW5mbyAobmFtZSwgaWQsIGxvY2F0aW9uLCBpbmZvKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvblxuICAgIHRoaXMuaW5mbyA9IGluZm9cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEFjdGl2ZUluZm8gKGxpc3QsIGluZm8pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChsaXN0W2ldLmlkID09PSBpbmZvLmlkKSB7XG4gICAgICAgIGxpc3RbaV0ubG9jYXRpb24gPSBpbmZvLmxvY2F0aW9uXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICBsaXN0LnB1c2goaW5mbylcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNoYWRlciAodHlwZSwgaWQsIGNvbW1hbmQpIHtcbiAgICB2YXIgY2FjaGUgPSB0eXBlID09PSBHTF9GUkFHTUVOVF9TSEFERVIgPyBmcmFnU2hhZGVycyA6IHZlcnRTaGFkZXJzXG4gICAgdmFyIHNoYWRlciA9IGNhY2hlW2lkXVxuXG4gICAgaWYgKCFzaGFkZXIpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzdHJpbmdTdG9yZS5zdHIoaWQpXG4gICAgICBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIodHlwZSlcbiAgICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSlcbiAgICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKVxuICAgICAgY2hlY2skMS5zaGFkZXJFcnJvcihnbCwgc2hhZGVyLCBzb3VyY2UsIHR5cGUsIGNvbW1hbmQpXG4gICAgICBjYWNoZVtpZF0gPSBzaGFkZXJcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhZGVyXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHJvZ3JhbSBsaW5raW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcHJvZ3JhbUNhY2hlID0ge31cbiAgdmFyIHByb2dyYW1MaXN0ID0gW11cblxuICB2YXIgUFJPR1JBTV9DT1VOVEVSID0gMFxuXG4gIGZ1bmN0aW9uIFJFR0xQcm9ncmFtIChmcmFnSWQsIHZlcnRJZCkge1xuICAgIHRoaXMuaWQgPSBQUk9HUkFNX0NPVU5URVIrK1xuICAgIHRoaXMuZnJhZ0lkID0gZnJhZ0lkXG4gICAgdGhpcy52ZXJ0SWQgPSB2ZXJ0SWRcbiAgICB0aGlzLnByb2dyYW0gPSBudWxsXG4gICAgdGhpcy51bmlmb3JtcyA9IFtdXG4gICAgdGhpcy5hdHRyaWJ1dGVzID0gW11cbiAgICB0aGlzLnJlZkNvdW50ID0gMVxuXG4gICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICB0aGlzLnN0YXRzID0ge1xuICAgICAgICB1bmlmb3Jtc0NvdW50OiAwLFxuICAgICAgICBhdHRyaWJ1dGVzQ291bnQ6IDBcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsaW5rUHJvZ3JhbSAoZGVzYywgY29tbWFuZCwgYXR0cmlidXRlTG9jYXRpb25zKSB7XG4gICAgdmFyIGksIGluZm9cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBjb21waWxlICYgbGlua1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB2YXIgZnJhZ1NoYWRlciA9IGdldFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIGRlc2MuZnJhZ0lkKVxuICAgIHZhciB2ZXJ0U2hhZGVyID0gZ2V0U2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIGRlc2MudmVydElkKVxuXG4gICAgdmFyIHByb2dyYW0gPSBkZXNjLnByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKClcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ1NoYWRlcilcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydFNoYWRlcilcbiAgICBpZiAoYXR0cmlidXRlTG9jYXRpb25zKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYXR0cmlidXRlTG9jYXRpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBiaW5kaW5nID0gYXR0cmlidXRlTG9jYXRpb25zW2ldXG4gICAgICAgIGdsLmJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBiaW5kaW5nWzBdLCBiaW5kaW5nWzFdKVxuICAgICAgfVxuICAgIH1cblxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pXG4gICAgY2hlY2skMS5saW5rRXJyb3IoXG4gICAgICBnbCxcbiAgICAgIHByb2dyYW0sXG4gICAgICBzdHJpbmdTdG9yZS5zdHIoZGVzYy5mcmFnSWQpLFxuICAgICAgc3RyaW5nU3RvcmUuc3RyKGRlc2MudmVydElkKSxcbiAgICAgIGNvbW1hbmQpXG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gZ3JhYiB1bmlmb3Jtc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB2YXIgbnVtVW5pZm9ybXMgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIEdMX0FDVElWRV9VTklGT1JNUylcbiAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgIGRlc2Muc3RhdHMudW5pZm9ybXNDb3VudCA9IG51bVVuaWZvcm1zXG4gICAgfVxuICAgIHZhciB1bmlmb3JtcyA9IGRlc2MudW5pZm9ybXNcbiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVW5pZm9ybXM7ICsraSkge1xuICAgICAgaW5mbyA9IGdsLmdldEFjdGl2ZVVuaWZvcm0ocHJvZ3JhbSwgaSlcbiAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLnNpemUgPiAxKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbmZvLnNpemU7ICsraikge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBpbmZvLm5hbWUucmVwbGFjZSgnWzBdJywgJ1snICsgaiArICddJylcbiAgICAgICAgICAgIGluc2VydEFjdGl2ZUluZm8odW5pZm9ybXMsIG5ldyBBY3RpdmVJbmZvKFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBzdHJpbmdTdG9yZS5pZChuYW1lKSxcbiAgICAgICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLFxuICAgICAgICAgICAgICBpbmZvKSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5zZXJ0QWN0aXZlSW5mbyh1bmlmb3JtcywgbmV3IEFjdGl2ZUluZm8oXG4gICAgICAgICAgICBpbmZvLm5hbWUsXG4gICAgICAgICAgICBzdHJpbmdTdG9yZS5pZChpbmZvLm5hbWUpLFxuICAgICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIGluZm8ubmFtZSksXG4gICAgICAgICAgICBpbmZvKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBncmFiIGF0dHJpYnV0ZXNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgdmFyIG51bUF0dHJpYnV0ZXMgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIEdMX0FDVElWRV9BVFRSSUJVVEVTKVxuICAgIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgICAgZGVzYy5zdGF0cy5hdHRyaWJ1dGVzQ291bnQgPSBudW1BdHRyaWJ1dGVzXG4gICAgfVxuXG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBkZXNjLmF0dHJpYnV0ZXNcbiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQXR0cmlidXRlczsgKytpKSB7XG4gICAgICBpbmZvID0gZ2wuZ2V0QWN0aXZlQXR0cmliKHByb2dyYW0sIGkpXG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbnNlcnRBY3RpdmVJbmZvKGF0dHJpYnV0ZXMsIG5ldyBBY3RpdmVJbmZvKFxuICAgICAgICAgIGluZm8ubmFtZSxcbiAgICAgICAgICBzdHJpbmdTdG9yZS5pZChpbmZvLm5hbWUpLFxuICAgICAgICAgIGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIGluZm8ubmFtZSksXG4gICAgICAgICAgaW5mbykpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgc3RhdHMuZ2V0TWF4VW5pZm9ybXNDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBtID0gMFxuICAgICAgcHJvZ3JhbUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZGVzYykge1xuICAgICAgICBpZiAoZGVzYy5zdGF0cy51bmlmb3Jtc0NvdW50ID4gbSkge1xuICAgICAgICAgIG0gPSBkZXNjLnN0YXRzLnVuaWZvcm1zQ291bnRcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVybiBtXG4gICAgfVxuXG4gICAgc3RhdHMuZ2V0TWF4QXR0cmlidXRlc0NvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG0gPSAwXG4gICAgICBwcm9ncmFtTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChkZXNjKSB7XG4gICAgICAgIGlmIChkZXNjLnN0YXRzLmF0dHJpYnV0ZXNDb3VudCA+IG0pIHtcbiAgICAgICAgICBtID0gZGVzYy5zdGF0cy5hdHRyaWJ1dGVzQ291bnRcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVybiBtXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdG9yZVNoYWRlcnMgKCkge1xuICAgIGZyYWdTaGFkZXJzID0ge31cbiAgICB2ZXJ0U2hhZGVycyA9IHt9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9ncmFtTGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGlua1Byb2dyYW0ocHJvZ3JhbUxpc3RbaV0sIG51bGwsIHByb2dyYW1MaXN0W2ldLmF0dHJpYnV0ZXMubWFwKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAgIHJldHVybiBbaW5mby5sb2NhdGlvbiwgaW5mby5uYW1lXVxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGRlbGV0ZVNoYWRlciA9IGdsLmRlbGV0ZVNoYWRlci5iaW5kKGdsKVxuICAgICAgdmFsdWVzKGZyYWdTaGFkZXJzKS5mb3JFYWNoKGRlbGV0ZVNoYWRlcilcbiAgICAgIGZyYWdTaGFkZXJzID0ge31cbiAgICAgIHZhbHVlcyh2ZXJ0U2hhZGVycykuZm9yRWFjaChkZWxldGVTaGFkZXIpXG4gICAgICB2ZXJ0U2hhZGVycyA9IHt9XG5cbiAgICAgIHByb2dyYW1MaXN0LmZvckVhY2goZnVuY3Rpb24gKGRlc2MpIHtcbiAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShkZXNjLnByb2dyYW0pXG4gICAgICB9KVxuICAgICAgcHJvZ3JhbUxpc3QubGVuZ3RoID0gMFxuICAgICAgcHJvZ3JhbUNhY2hlID0ge31cblxuICAgICAgc3RhdHMuc2hhZGVyQ291bnQgPSAwXG4gICAgfSxcblxuICAgIHByb2dyYW06IGZ1bmN0aW9uICh2ZXJ0SWQsIGZyYWdJZCwgY29tbWFuZCwgYXR0cmliTG9jYXRpb25zKSB7XG4gICAgICBjaGVjayQxLmNvbW1hbmQodmVydElkID49IDAsICdtaXNzaW5nIHZlcnRleCBzaGFkZXInLCBjb21tYW5kKVxuICAgICAgY2hlY2skMS5jb21tYW5kKGZyYWdJZCA+PSAwLCAnbWlzc2luZyBmcmFnbWVudCBzaGFkZXInLCBjb21tYW5kKVxuXG4gICAgICB2YXIgY2FjaGUgPSBwcm9ncmFtQ2FjaGVbZnJhZ0lkXVxuICAgICAgaWYgKCFjYWNoZSkge1xuICAgICAgICBjYWNoZSA9IHByb2dyYW1DYWNoZVtmcmFnSWRdID0ge31cbiAgICAgIH1cbiAgICAgIHZhciBwcmV2UHJvZ3JhbSA9IGNhY2hlW3ZlcnRJZF1cbiAgICAgIGlmIChwcmV2UHJvZ3JhbSkge1xuICAgICAgICBwcmV2UHJvZ3JhbS5yZWZDb3VudCsrXG4gICAgICAgIGlmICghYXR0cmliTG9jYXRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZQcm9ncmFtXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBwcm9ncmFtID0gbmV3IFJFR0xQcm9ncmFtKGZyYWdJZCwgdmVydElkKVxuICAgICAgc3RhdHMuc2hhZGVyQ291bnQrK1xuICAgICAgbGlua1Byb2dyYW0ocHJvZ3JhbSwgY29tbWFuZCwgYXR0cmliTG9jYXRpb25zKVxuICAgICAgaWYgKCFwcmV2UHJvZ3JhbSkge1xuICAgICAgICBjYWNoZVt2ZXJ0SWRdID0gcHJvZ3JhbVxuICAgICAgfVxuICAgICAgcHJvZ3JhbUxpc3QucHVzaChwcm9ncmFtKVxuICAgICAgcmV0dXJuIGV4dGVuZChwcm9ncmFtLCB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwcm9ncmFtLnJlZkNvdW50LS1cbiAgICAgICAgICBpZiAocHJvZ3JhbS5yZWZDb3VudCA8PSAwKSB7XG4gICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0ucHJvZ3JhbSlcbiAgICAgICAgICAgIHZhciBpZHggPSBwcm9ncmFtTGlzdC5pbmRleE9mKHByb2dyYW0pXG4gICAgICAgICAgICBwcm9ncmFtTGlzdC5zcGxpY2UoaWR4LCAxKVxuICAgICAgICAgICAgc3RhdHMuc2hhZGVyQ291bnQtLVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBubyBwcm9ncmFtIGlzIGxpbmtlZCB0byB0aGlzIHZlcnQgYW55bW9yZVxuICAgICAgICAgIGlmIChjYWNoZVtwcm9ncmFtLnZlcnRJZF0ucmVmQ291bnQgPD0gMCkge1xuICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKHZlcnRTaGFkZXJzW3Byb2dyYW0udmVydElkXSlcbiAgICAgICAgICAgIGRlbGV0ZSB2ZXJ0U2hhZGVyc1twcm9ncmFtLnZlcnRJZF1cbiAgICAgICAgICAgIGRlbGV0ZSBwcm9ncmFtQ2FjaGVbcHJvZ3JhbS5mcmFnSWRdW3Byb2dyYW0udmVydElkXVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBubyBwcm9ncmFtIGlzIGxpbmtlZCB0byB0aGlzIGZyYWcgYW55bW9yZVxuICAgICAgICAgIGlmICghT2JqZWN0LmtleXMocHJvZ3JhbUNhY2hlW3Byb2dyYW0uZnJhZ0lkXSkubGVuZ3RoKSB7XG4gICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ1NoYWRlcnNbcHJvZ3JhbS5mcmFnSWRdKVxuICAgICAgICAgICAgZGVsZXRlIGZyYWdTaGFkZXJzW3Byb2dyYW0uZnJhZ0lkXVxuICAgICAgICAgICAgZGVsZXRlIHByb2dyYW1DYWNoZVtwcm9ncmFtLmZyYWdJZF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHJlc3RvcmU6IHJlc3RvcmVTaGFkZXJzLFxuXG4gICAgc2hhZGVyOiBnZXRTaGFkZXIsXG5cbiAgICBmcmFnOiAtMSxcbiAgICB2ZXJ0OiAtMVxuICB9XG59XG5cbnZhciBHTF9SR0JBJDMgPSA2NDA4XG52YXIgR0xfVU5TSUdORURfQllURSQ3ID0gNTEyMVxudmFyIEdMX1BBQ0tfQUxJR05NRU5UID0gMHgwRDA1XG52YXIgR0xfRkxPQVQkNyA9IDB4MTQwNiAvLyA1MTI2XG5cbmZ1bmN0aW9uIHdyYXBSZWFkUGl4ZWxzIChcbiAgZ2wsXG4gIGZyYW1lYnVmZmVyU3RhdGUsXG4gIHJlZ2xQb2xsLFxuICBjb250ZXh0LFxuICBnbEF0dHJpYnV0ZXMsXG4gIGV4dGVuc2lvbnMsXG4gIGxpbWl0cykge1xuICBmdW5jdGlvbiByZWFkUGl4ZWxzSW1wbCAoaW5wdXQpIHtcbiAgICB2YXIgdHlwZVxuICAgIGlmIChmcmFtZWJ1ZmZlclN0YXRlLm5leHQgPT09IG51bGwpIHtcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIGdsQXR0cmlidXRlcy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsXG4gICAgICAgICd5b3UgbXVzdCBjcmVhdGUgYSB3ZWJnbCBjb250ZXh0IHdpdGggXCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXJcIjp0cnVlIGluIG9yZGVyIHRvIHJlYWQgcGl4ZWxzIGZyb20gdGhlIGRyYXdpbmcgYnVmZmVyJylcbiAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9CWVRFJDdcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2skMShcbiAgICAgICAgZnJhbWVidWZmZXJTdGF0ZS5uZXh0LmNvbG9yQXR0YWNobWVudHNbMF0udGV4dHVyZSAhPT0gbnVsbCxcbiAgICAgICAgJ1lvdSBjYW5ub3QgcmVhZCBmcm9tIGEgcmVuZGVyYnVmZmVyJylcbiAgICAgIHR5cGUgPSBmcmFtZWJ1ZmZlclN0YXRlLm5leHQuY29sb3JBdHRhY2htZW50c1swXS50ZXh0dXJlLl90ZXh0dXJlLnR5cGVcblxuICAgICAgaWYgKGV4dGVuc2lvbnMub2VzX3RleHR1cmVfZmxvYXQpIHtcbiAgICAgICAgY2hlY2skMShcbiAgICAgICAgICB0eXBlID09PSBHTF9VTlNJR05FRF9CWVRFJDcgfHwgdHlwZSA9PT0gR0xfRkxPQVQkNyxcbiAgICAgICAgICAnUmVhZGluZyBmcm9tIGEgZnJhbWVidWZmZXIgaXMgb25seSBhbGxvd2VkIGZvciB0aGUgdHlwZXMgXFwndWludDhcXCcgYW5kIFxcJ2Zsb2F0XFwnJylcblxuICAgICAgICBpZiAodHlwZSA9PT0gR0xfRkxPQVQkNykge1xuICAgICAgICAgIGNoZWNrJDEobGltaXRzLnJlYWRGbG9hdCwgJ1JlYWRpbmcgXFwnZmxvYXRcXCcgdmFsdWVzIGlzIG5vdCBwZXJtaXR0ZWQgaW4geW91ciBicm93c2VyLiBGb3IgYSBmYWxsYmFjaywgcGxlYXNlIHNlZTogaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZ2xzbC1yZWFkLWZsb2F0JylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2skMShcbiAgICAgICAgICB0eXBlID09PSBHTF9VTlNJR05FRF9CWVRFJDcsXG4gICAgICAgICAgJ1JlYWRpbmcgZnJvbSBhIGZyYW1lYnVmZmVyIGlzIG9ubHkgYWxsb3dlZCBmb3IgdGhlIHR5cGUgXFwndWludDhcXCcnKVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB4ID0gMFxuICAgIHZhciB5ID0gMFxuICAgIHZhciB3aWR0aCA9IGNvbnRleHQuZnJhbWVidWZmZXJXaWR0aFxuICAgIHZhciBoZWlnaHQgPSBjb250ZXh0LmZyYW1lYnVmZmVySGVpZ2h0XG4gICAgdmFyIGRhdGEgPSBudWxsXG5cbiAgICBpZiAoaXNUeXBlZEFycmF5KGlucHV0KSkge1xuICAgICAgZGF0YSA9IGlucHV0XG4gICAgfSBlbHNlIGlmIChpbnB1dCkge1xuICAgICAgY2hlY2skMS50eXBlKGlucHV0LCAnb2JqZWN0JywgJ2ludmFsaWQgYXJndW1lbnRzIHRvIHJlZ2wucmVhZCgpJylcbiAgICAgIHggPSBpbnB1dC54IHwgMFxuICAgICAgeSA9IGlucHV0LnkgfCAwXG4gICAgICBjaGVjayQxKFxuICAgICAgICB4ID49IDAgJiYgeCA8IGNvbnRleHQuZnJhbWVidWZmZXJXaWR0aCxcbiAgICAgICAgJ2ludmFsaWQgeCBvZmZzZXQgZm9yIHJlZ2wucmVhZCcpXG4gICAgICBjaGVjayQxKFxuICAgICAgICB5ID49IDAgJiYgeSA8IGNvbnRleHQuZnJhbWVidWZmZXJIZWlnaHQsXG4gICAgICAgICdpbnZhbGlkIHkgb2Zmc2V0IGZvciByZWdsLnJlYWQnKVxuICAgICAgd2lkdGggPSAoaW5wdXQud2lkdGggfHwgKGNvbnRleHQuZnJhbWVidWZmZXJXaWR0aCAtIHgpKSB8IDBcbiAgICAgIGhlaWdodCA9IChpbnB1dC5oZWlnaHQgfHwgKGNvbnRleHQuZnJhbWVidWZmZXJIZWlnaHQgLSB5KSkgfCAwXG4gICAgICBkYXRhID0gaW5wdXQuZGF0YSB8fCBudWxsXG4gICAgfVxuXG4gICAgLy8gc2FuaXR5IGNoZWNrIGlucHV0LmRhdGFcbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKHR5cGUgPT09IEdMX1VOU0lHTkVEX0JZVEUkNykge1xuICAgICAgICBjaGVjayQxKFxuICAgICAgICAgIGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAgICAgICAgICdidWZmZXIgbXVzdCBiZSBcXCdVaW50OEFycmF5XFwnIHdoZW4gcmVhZGluZyBmcm9tIGEgZnJhbWVidWZmZXIgb2YgdHlwZSBcXCd1aW50OFxcJycpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEdMX0ZMT0FUJDcpIHtcbiAgICAgICAgY2hlY2skMShcbiAgICAgICAgICBkYXRhIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5LFxuICAgICAgICAgICdidWZmZXIgbXVzdCBiZSBcXCdGbG9hdDMyQXJyYXlcXCcgd2hlbiByZWFkaW5nIGZyb20gYSBmcmFtZWJ1ZmZlciBvZiB0eXBlIFxcJ2Zsb2F0XFwnJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVjayQxKFxuICAgICAgd2lkdGggPiAwICYmIHdpZHRoICsgeCA8PSBjb250ZXh0LmZyYW1lYnVmZmVyV2lkdGgsXG4gICAgICAnaW52YWxpZCB3aWR0aCBmb3IgcmVhZCBwaXhlbHMnKVxuICAgIGNoZWNrJDEoXG4gICAgICBoZWlnaHQgPiAwICYmIGhlaWdodCArIHkgPD0gY29udGV4dC5mcmFtZWJ1ZmZlckhlaWdodCxcbiAgICAgICdpbnZhbGlkIGhlaWdodCBmb3IgcmVhZCBwaXhlbHMnKVxuXG4gICAgLy8gVXBkYXRlIFdlYkdMIHN0YXRlXG4gICAgcmVnbFBvbGwoKVxuXG4gICAgLy8gQ29tcHV0ZSBzaXplXG4gICAgdmFyIHNpemUgPSB3aWR0aCAqIGhlaWdodCAqIDRcblxuICAgIC8vIEFsbG9jYXRlIGRhdGFcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGlmICh0eXBlID09PSBHTF9VTlNJR05FRF9CWVRFJDcpIHtcbiAgICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KHNpemUpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEdMX0ZMT0FUJDcpIHtcbiAgICAgICAgZGF0YSA9IGRhdGEgfHwgbmV3IEZsb2F0MzJBcnJheShzaXplKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFR5cGUgY2hlY2tcbiAgICBjaGVjayQxLmlzVHlwZWRBcnJheShkYXRhLCAnZGF0YSBidWZmZXIgZm9yIHJlZ2wucmVhZCgpIG11c3QgYmUgYSB0eXBlZGFycmF5JylcbiAgICBjaGVjayQxKGRhdGEuYnl0ZUxlbmd0aCA+PSBzaXplLCAnZGF0YSBidWZmZXIgZm9yIHJlZ2wucmVhZCgpIHRvbyBzbWFsbCcpXG5cbiAgICAvLyBSdW4gcmVhZCBwaXhlbHNcbiAgICBnbC5waXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgNClcbiAgICBnbC5yZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQsIEdMX1JHQkEkMyxcbiAgICAgIHR5cGUsXG4gICAgICBkYXRhKVxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRQaXhlbHNGQk8gKG9wdGlvbnMpIHtcbiAgICB2YXIgcmVzdWx0XG4gICAgZnJhbWVidWZmZXJTdGF0ZS5zZXRGQk8oe1xuICAgICAgZnJhbWVidWZmZXI6IG9wdGlvbnMuZnJhbWVidWZmZXJcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXN1bHQgPSByZWFkUGl4ZWxzSW1wbChvcHRpb25zKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZFBpeGVscyAob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucyB8fCAhKCdmcmFtZWJ1ZmZlcicgaW4gb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiByZWFkUGl4ZWxzSW1wbChvcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVhZFBpeGVsc0ZCTyhvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkUGl4ZWxzXG59XG5cbmZ1bmN0aW9uIHNsaWNlICh4KSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh4KVxufVxuXG5mdW5jdGlvbiBqb2luICh4KSB7XG4gIHJldHVybiBzbGljZSh4KS5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudCAoKSB7XG4gIC8vIFVuaXF1ZSB2YXJpYWJsZSBpZCBjb3VudGVyXG4gIHZhciB2YXJDb3VudGVyID0gMFxuXG4gIC8vIExpbmtlZCB2YWx1ZXMgYXJlIHBhc3NlZCBmcm9tIHRoaXMgc2NvcGUgaW50byB0aGUgZ2VuZXJhdGVkIGNvZGUgYmxvY2tcbiAgLy8gQ2FsbGluZyBsaW5rKCkgcGFzc2VzIGEgdmFsdWUgaW50byB0aGUgZ2VuZXJhdGVkIHNjb3BlIGFuZCByZXR1cm5zXG4gIC8vIHRoZSB2YXJpYWJsZSBuYW1lIHdoaWNoIGl0IGlzIGJvdW5kIHRvXG4gIHZhciBsaW5rZWROYW1lcyA9IFtdXG4gIHZhciBsaW5rZWRWYWx1ZXMgPSBbXVxuICBmdW5jdGlvbiBsaW5rICh2YWx1ZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlua2VkVmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAobGlua2VkVmFsdWVzW2ldID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbGlua2VkTmFtZXNbaV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9ICdnJyArICh2YXJDb3VudGVyKyspXG4gICAgbGlua2VkTmFtZXMucHVzaChuYW1lKVxuICAgIGxpbmtlZFZhbHVlcy5wdXNoKHZhbHVlKVxuICAgIHJldHVybiBuYW1lXG4gIH1cblxuICAvLyBjcmVhdGUgYSBjb2RlIGJsb2NrXG4gIGZ1bmN0aW9uIGJsb2NrICgpIHtcbiAgICB2YXIgY29kZSA9IFtdXG4gICAgZnVuY3Rpb24gcHVzaCAoKSB7XG4gICAgICBjb2RlLnB1c2guYXBwbHkoY29kZSwgc2xpY2UoYXJndW1lbnRzKSlcbiAgICB9XG5cbiAgICB2YXIgdmFycyA9IFtdXG4gICAgZnVuY3Rpb24gZGVmICgpIHtcbiAgICAgIHZhciBuYW1lID0gJ3YnICsgKHZhckNvdW50ZXIrKylcbiAgICAgIHZhcnMucHVzaChuYW1lKVxuXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29kZS5wdXNoKG5hbWUsICc9JylcbiAgICAgICAgY29kZS5wdXNoLmFwcGx5KGNvZGUsIHNsaWNlKGFyZ3VtZW50cykpXG4gICAgICAgIGNvZGUucHVzaCgnOycpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuYW1lXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dGVuZChwdXNoLCB7XG4gICAgICBkZWY6IGRlZixcbiAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBqb2luKFtcbiAgICAgICAgICAodmFycy5sZW5ndGggPiAwID8gJ3ZhciAnICsgdmFycy5qb2luKCcsJykgKyAnOycgOiAnJyksXG4gICAgICAgICAgam9pbihjb2RlKVxuICAgICAgICBdKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBzY29wZSAoKSB7XG4gICAgdmFyIGVudHJ5ID0gYmxvY2soKVxuICAgIHZhciBleGl0ID0gYmxvY2soKVxuXG4gICAgdmFyIGVudHJ5VG9TdHJpbmcgPSBlbnRyeS50b1N0cmluZ1xuICAgIHZhciBleGl0VG9TdHJpbmcgPSBleGl0LnRvU3RyaW5nXG5cbiAgICBmdW5jdGlvbiBzYXZlIChvYmplY3QsIHByb3ApIHtcbiAgICAgIGV4aXQob2JqZWN0LCBwcm9wLCAnPScsIGVudHJ5LmRlZihvYmplY3QsIHByb3ApLCAnOycpXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgICBlbnRyeS5hcHBseShlbnRyeSwgc2xpY2UoYXJndW1lbnRzKSlcbiAgICB9LCB7XG4gICAgICBkZWY6IGVudHJ5LmRlZixcbiAgICAgIGVudHJ5OiBlbnRyeSxcbiAgICAgIGV4aXQ6IGV4aXQsXG4gICAgICBzYXZlOiBzYXZlLFxuICAgICAgc2V0OiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICBzYXZlKG9iamVjdCwgcHJvcClcbiAgICAgICAgZW50cnkob2JqZWN0LCBwcm9wLCAnPScsIHZhbHVlLCAnOycpXG4gICAgICB9LFxuICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5VG9TdHJpbmcoKSArIGV4aXRUb1N0cmluZygpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbmRpdGlvbmFsICgpIHtcbiAgICB2YXIgcHJlZCA9IGpvaW4oYXJndW1lbnRzKVxuICAgIHZhciB0aGVuQmxvY2sgPSBzY29wZSgpXG4gICAgdmFyIGVsc2VCbG9jayA9IHNjb3BlKClcblxuICAgIHZhciB0aGVuVG9TdHJpbmcgPSB0aGVuQmxvY2sudG9TdHJpbmdcbiAgICB2YXIgZWxzZVRvU3RyaW5nID0gZWxzZUJsb2NrLnRvU3RyaW5nXG5cbiAgICByZXR1cm4gZXh0ZW5kKHRoZW5CbG9jaywge1xuICAgICAgdGhlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGVuQmxvY2suYXBwbHkodGhlbkJsb2NrLCBzbGljZShhcmd1bWVudHMpKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSxcbiAgICAgIGVsc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZWxzZUJsb2NrLmFwcGx5KGVsc2VCbG9jaywgc2xpY2UoYXJndW1lbnRzKSlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgIH0sXG4gICAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZWxzZUNsYXVzZSA9IGVsc2VUb1N0cmluZygpXG4gICAgICAgIGlmIChlbHNlQ2xhdXNlKSB7XG4gICAgICAgICAgZWxzZUNsYXVzZSA9ICdlbHNleycgKyBlbHNlQ2xhdXNlICsgJ30nXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpvaW4oW1xuICAgICAgICAgICdpZignLCBwcmVkLCAnKXsnLFxuICAgICAgICAgIHRoZW5Ub1N0cmluZygpLFxuICAgICAgICAgICd9JywgZWxzZUNsYXVzZVxuICAgICAgICBdKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLyBwcm9jZWR1cmUgbGlzdFxuICB2YXIgZ2xvYmFsQmxvY2sgPSBibG9jaygpXG4gIHZhciBwcm9jZWR1cmVzID0ge31cbiAgZnVuY3Rpb24gcHJvYyAobmFtZSwgY291bnQpIHtcbiAgICB2YXIgYXJncyA9IFtdXG4gICAgZnVuY3Rpb24gYXJnICgpIHtcbiAgICAgIHZhciBuYW1lID0gJ2EnICsgYXJncy5sZW5ndGhcbiAgICAgIGFyZ3MucHVzaChuYW1lKVxuICAgICAgcmV0dXJuIG5hbWVcbiAgICB9XG5cbiAgICBjb3VudCA9IGNvdW50IHx8IDBcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgIGFyZygpXG4gICAgfVxuXG4gICAgdmFyIGJvZHkgPSBzY29wZSgpXG4gICAgdmFyIGJvZHlUb1N0cmluZyA9IGJvZHkudG9TdHJpbmdcblxuICAgIHZhciByZXN1bHQgPSBwcm9jZWR1cmVzW25hbWVdID0gZXh0ZW5kKGJvZHksIHtcbiAgICAgIGFyZzogYXJnLFxuICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGpvaW4oW1xuICAgICAgICAgICdmdW5jdGlvbignLCBhcmdzLmpvaW4oKSwgJyl7JyxcbiAgICAgICAgICBib2R5VG9TdHJpbmcoKSxcbiAgICAgICAgICAnfSdcbiAgICAgICAgXSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGlsZSAoKSB7XG4gICAgdmFyIGNvZGUgPSBbJ1widXNlIHN0cmljdFwiOycsXG4gICAgICBnbG9iYWxCbG9jayxcbiAgICAgICdyZXR1cm4geyddXG4gICAgT2JqZWN0LmtleXMocHJvY2VkdXJlcykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgY29kZS5wdXNoKCdcIicsIG5hbWUsICdcIjonLCBwcm9jZWR1cmVzW25hbWVdLnRvU3RyaW5nKCksICcsJylcbiAgICB9KVxuICAgIGNvZGUucHVzaCgnfScpXG4gICAgdmFyIHNyYyA9IGpvaW4oY29kZSlcbiAgICAgIC5yZXBsYWNlKC87L2csICc7XFxuJylcbiAgICAgIC5yZXBsYWNlKC99L2csICd9XFxuJylcbiAgICAgIC5yZXBsYWNlKC97L2csICd7XFxuJylcbiAgICB2YXIgcHJvYyA9IEZ1bmN0aW9uLmFwcGx5KG51bGwsIGxpbmtlZE5hbWVzLmNvbmNhdChzcmMpKVxuICAgIHJldHVybiBwcm9jLmFwcGx5KG51bGwsIGxpbmtlZFZhbHVlcylcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2xvYmFsOiBnbG9iYWxCbG9jayxcbiAgICBsaW5rOiBsaW5rLFxuICAgIGJsb2NrOiBibG9jayxcbiAgICBwcm9jOiBwcm9jLFxuICAgIHNjb3BlOiBzY29wZSxcbiAgICBjb25kOiBjb25kaXRpb25hbCxcbiAgICBjb21waWxlOiBjb21waWxlXG4gIH1cbn1cblxuLy8gXCJjdXRlXCIgbmFtZXMgZm9yIHZlY3RvciBjb21wb25lbnRzXG52YXIgQ1VURV9DT01QT05FTlRTID0gJ3h5encnLnNwbGl0KCcnKVxuXG52YXIgR0xfVU5TSUdORURfQllURSQ4ID0gNTEyMVxuXG52YXIgQVRUUklCX1NUQVRFX1BPSU5URVIgPSAxXG52YXIgQVRUUklCX1NUQVRFX0NPTlNUQU5UID0gMlxuXG52YXIgRFlOX0ZVTkMkMSA9IDBcbnZhciBEWU5fUFJPUCQxID0gMVxudmFyIERZTl9DT05URVhUJDEgPSAyXG52YXIgRFlOX1NUQVRFJDEgPSAzXG52YXIgRFlOX1RIVU5LID0gNFxudmFyIERZTl9DT05TVEFOVCQxID0gNVxudmFyIERZTl9BUlJBWSQxID0gNlxuXG52YXIgU19ESVRIRVIgPSAnZGl0aGVyJ1xudmFyIFNfQkxFTkRfRU5BQkxFID0gJ2JsZW5kLmVuYWJsZSdcbnZhciBTX0JMRU5EX0NPTE9SID0gJ2JsZW5kLmNvbG9yJ1xudmFyIFNfQkxFTkRfRVFVQVRJT04gPSAnYmxlbmQuZXF1YXRpb24nXG52YXIgU19CTEVORF9GVU5DID0gJ2JsZW5kLmZ1bmMnXG52YXIgU19ERVBUSF9FTkFCTEUgPSAnZGVwdGguZW5hYmxlJ1xudmFyIFNfREVQVEhfRlVOQyA9ICdkZXB0aC5mdW5jJ1xudmFyIFNfREVQVEhfUkFOR0UgPSAnZGVwdGgucmFuZ2UnXG52YXIgU19ERVBUSF9NQVNLID0gJ2RlcHRoLm1hc2snXG52YXIgU19DT0xPUl9NQVNLID0gJ2NvbG9yTWFzaydcbnZhciBTX0NVTExfRU5BQkxFID0gJ2N1bGwuZW5hYmxlJ1xudmFyIFNfQ1VMTF9GQUNFID0gJ2N1bGwuZmFjZSdcbnZhciBTX0ZST05UX0ZBQ0UgPSAnZnJvbnRGYWNlJ1xudmFyIFNfTElORV9XSURUSCA9ICdsaW5lV2lkdGgnXG52YXIgU19QT0xZR09OX09GRlNFVF9FTkFCTEUgPSAncG9seWdvbk9mZnNldC5lbmFibGUnXG52YXIgU19QT0xZR09OX09GRlNFVF9PRkZTRVQgPSAncG9seWdvbk9mZnNldC5vZmZzZXQnXG52YXIgU19TQU1QTEVfQUxQSEEgPSAnc2FtcGxlLmFscGhhJ1xudmFyIFNfU0FNUExFX0VOQUJMRSA9ICdzYW1wbGUuZW5hYmxlJ1xudmFyIFNfU0FNUExFX0NPVkVSQUdFID0gJ3NhbXBsZS5jb3ZlcmFnZSdcbnZhciBTX1NURU5DSUxfRU5BQkxFID0gJ3N0ZW5jaWwuZW5hYmxlJ1xudmFyIFNfU1RFTkNJTF9NQVNLID0gJ3N0ZW5jaWwubWFzaydcbnZhciBTX1NURU5DSUxfRlVOQyA9ICdzdGVuY2lsLmZ1bmMnXG52YXIgU19TVEVOQ0lMX09QRlJPTlQgPSAnc3RlbmNpbC5vcEZyb250J1xudmFyIFNfU1RFTkNJTF9PUEJBQ0sgPSAnc3RlbmNpbC5vcEJhY2snXG52YXIgU19TQ0lTU09SX0VOQUJMRSA9ICdzY2lzc29yLmVuYWJsZSdcbnZhciBTX1NDSVNTT1JfQk9YID0gJ3NjaXNzb3IuYm94J1xudmFyIFNfVklFV1BPUlQgPSAndmlld3BvcnQnXG5cbnZhciBTX1BST0ZJTEUgPSAncHJvZmlsZSdcblxudmFyIFNfRlJBTUVCVUZGRVIgPSAnZnJhbWVidWZmZXInXG52YXIgU19WRVJUID0gJ3ZlcnQnXG52YXIgU19GUkFHID0gJ2ZyYWcnXG52YXIgU19FTEVNRU5UUyA9ICdlbGVtZW50cydcbnZhciBTX1BSSU1JVElWRSA9ICdwcmltaXRpdmUnXG52YXIgU19DT1VOVCA9ICdjb3VudCdcbnZhciBTX09GRlNFVCA9ICdvZmZzZXQnXG52YXIgU19JTlNUQU5DRVMgPSAnaW5zdGFuY2VzJ1xudmFyIFNfVkFPID0gJ3ZhbydcblxudmFyIFNVRkZJWF9XSURUSCA9ICdXaWR0aCdcbnZhciBTVUZGSVhfSEVJR0hUID0gJ0hlaWdodCdcblxudmFyIFNfRlJBTUVCVUZGRVJfV0lEVEggPSBTX0ZSQU1FQlVGRkVSICsgU1VGRklYX1dJRFRIXG52YXIgU19GUkFNRUJVRkZFUl9IRUlHSFQgPSBTX0ZSQU1FQlVGRkVSICsgU1VGRklYX0hFSUdIVFxudmFyIFNfVklFV1BPUlRfV0lEVEggPSBTX1ZJRVdQT1JUICsgU1VGRklYX1dJRFRIXG52YXIgU19WSUVXUE9SVF9IRUlHSFQgPSBTX1ZJRVdQT1JUICsgU1VGRklYX0hFSUdIVFxudmFyIFNfRFJBV0lOR0JVRkZFUiA9ICdkcmF3aW5nQnVmZmVyJ1xudmFyIFNfRFJBV0lOR0JVRkZFUl9XSURUSCA9IFNfRFJBV0lOR0JVRkZFUiArIFNVRkZJWF9XSURUSFxudmFyIFNfRFJBV0lOR0JVRkZFUl9IRUlHSFQgPSBTX0RSQVdJTkdCVUZGRVIgKyBTVUZGSVhfSEVJR0hUXG5cbnZhciBORVNURURfT1BUSU9OUyA9IFtcbiAgU19CTEVORF9GVU5DLFxuICBTX0JMRU5EX0VRVUFUSU9OLFxuICBTX1NURU5DSUxfRlVOQyxcbiAgU19TVEVOQ0lMX09QRlJPTlQsXG4gIFNfU1RFTkNJTF9PUEJBQ0ssXG4gIFNfU0FNUExFX0NPVkVSQUdFLFxuICBTX1ZJRVdQT1JULFxuICBTX1NDSVNTT1JfQk9YLFxuICBTX1BPTFlHT05fT0ZGU0VUX09GRlNFVFxuXVxuXG52YXIgR0xfQVJSQVlfQlVGRkVSJDIgPSAzNDk2MlxudmFyIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSJDEgPSAzNDk2M1xuXG52YXIgR0xfRlJBR01FTlRfU0hBREVSJDEgPSAzNTYzMlxudmFyIEdMX1ZFUlRFWF9TSEFERVIkMSA9IDM1NjMzXG5cbnZhciBHTF9URVhUVVJFXzJEJDMgPSAweDBERTFcbnZhciBHTF9URVhUVVJFX0NVQkVfTUFQJDIgPSAweDg1MTNcblxudmFyIEdMX0NVTExfRkFDRSA9IDB4MEI0NFxudmFyIEdMX0JMRU5EID0gMHgwQkUyXG52YXIgR0xfRElUSEVSID0gMHgwQkQwXG52YXIgR0xfU1RFTkNJTF9URVNUID0gMHgwQjkwXG52YXIgR0xfREVQVEhfVEVTVCA9IDB4MEI3MVxudmFyIEdMX1NDSVNTT1JfVEVTVCA9IDB4MEMxMVxudmFyIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgPSAweDgwMzdcbnZhciBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgPSAweDgwOUVcbnZhciBHTF9TQU1QTEVfQ09WRVJBR0UgPSAweDgwQTBcblxudmFyIEdMX0ZMT0FUJDggPSA1MTI2XG52YXIgR0xfRkxPQVRfVkVDMiA9IDM1NjY0XG52YXIgR0xfRkxPQVRfVkVDMyA9IDM1NjY1XG52YXIgR0xfRkxPQVRfVkVDNCA9IDM1NjY2XG52YXIgR0xfSU5UJDMgPSA1MTI0XG52YXIgR0xfSU5UX1ZFQzIgPSAzNTY2N1xudmFyIEdMX0lOVF9WRUMzID0gMzU2NjhcbnZhciBHTF9JTlRfVkVDNCA9IDM1NjY5XG52YXIgR0xfQk9PTCA9IDM1NjcwXG52YXIgR0xfQk9PTF9WRUMyID0gMzU2NzFcbnZhciBHTF9CT09MX1ZFQzMgPSAzNTY3MlxudmFyIEdMX0JPT0xfVkVDNCA9IDM1NjczXG52YXIgR0xfRkxPQVRfTUFUMiA9IDM1Njc0XG52YXIgR0xfRkxPQVRfTUFUMyA9IDM1Njc1XG52YXIgR0xfRkxPQVRfTUFUNCA9IDM1Njc2XG52YXIgR0xfU0FNUExFUl8yRCA9IDM1Njc4XG52YXIgR0xfU0FNUExFUl9DVUJFID0gMzU2ODBcblxudmFyIEdMX1RSSUFOR0xFUyQxID0gNFxuXG52YXIgR0xfRlJPTlQgPSAxMDI4XG52YXIgR0xfQkFDSyA9IDEwMjlcbnZhciBHTF9DVyA9IDB4MDkwMFxudmFyIEdMX0NDVyA9IDB4MDkwMVxudmFyIEdMX01JTl9FWFQgPSAweDgwMDdcbnZhciBHTF9NQVhfRVhUID0gMHg4MDA4XG52YXIgR0xfQUxXQVlTID0gNTE5XG52YXIgR0xfS0VFUCA9IDc2ODBcbnZhciBHTF9aRVJPID0gMFxudmFyIEdMX09ORSA9IDFcbnZhciBHTF9GVU5DX0FERCA9IDB4ODAwNlxudmFyIEdMX0xFU1MgPSA1MTNcblxudmFyIEdMX0ZSQU1FQlVGRkVSJDIgPSAweDhENDBcbnZhciBHTF9DT0xPUl9BVFRBQ0hNRU5UMCQyID0gMHg4Q0UwXG5cbnZhciBibGVuZEZ1bmNzID0ge1xuICAnMCc6IDAsXG4gICcxJzogMSxcbiAgJ3plcm8nOiAwLFxuICAnb25lJzogMSxcbiAgJ3NyYyBjb2xvcic6IDc2OCxcbiAgJ29uZSBtaW51cyBzcmMgY29sb3InOiA3NjksXG4gICdzcmMgYWxwaGEnOiA3NzAsXG4gICdvbmUgbWludXMgc3JjIGFscGhhJzogNzcxLFxuICAnZHN0IGNvbG9yJzogNzc0LFxuICAnb25lIG1pbnVzIGRzdCBjb2xvcic6IDc3NSxcbiAgJ2RzdCBhbHBoYSc6IDc3MixcbiAgJ29uZSBtaW51cyBkc3QgYWxwaGEnOiA3NzMsXG4gICdjb25zdGFudCBjb2xvcic6IDMyNzY5LFxuICAnb25lIG1pbnVzIGNvbnN0YW50IGNvbG9yJzogMzI3NzAsXG4gICdjb25zdGFudCBhbHBoYSc6IDMyNzcxLFxuICAnb25lIG1pbnVzIGNvbnN0YW50IGFscGhhJzogMzI3NzIsXG4gICdzcmMgYWxwaGEgc2F0dXJhdGUnOiA3NzZcbn1cblxuLy8gVGhlcmUgYXJlIGludmFsaWQgdmFsdWVzIGZvciBzcmNSR0IgYW5kIGRzdFJHQi4gU2VlOlxuLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvc3BlY3MvMS4wLyM2LjEzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1dlYkdML2Jsb2IvMGQzMjAxZjVmN2VjM2MwMDYwYmMxZjA0MDc3NDYxNTQxZjE5ODdiOS9jb25mb3JtYW5jZS1zdWl0ZXMvMS4wLjMvY29uZm9ybWFuY2UvbWlzYy93ZWJnbC1zcGVjaWZpYy5odG1sI0w1NlxudmFyIGludmFsaWRCbGVuZENvbWJpbmF0aW9ucyA9IFtcbiAgJ2NvbnN0YW50IGNvbG9yLCBjb25zdGFudCBhbHBoYScsXG4gICdvbmUgbWludXMgY29uc3RhbnQgY29sb3IsIGNvbnN0YW50IGFscGhhJyxcbiAgJ2NvbnN0YW50IGNvbG9yLCBvbmUgbWludXMgY29uc3RhbnQgYWxwaGEnLFxuICAnb25lIG1pbnVzIGNvbnN0YW50IGNvbG9yLCBvbmUgbWludXMgY29uc3RhbnQgYWxwaGEnLFxuICAnY29uc3RhbnQgYWxwaGEsIGNvbnN0YW50IGNvbG9yJyxcbiAgJ2NvbnN0YW50IGFscGhhLCBvbmUgbWludXMgY29uc3RhbnQgY29sb3InLFxuICAnb25lIG1pbnVzIGNvbnN0YW50IGFscGhhLCBjb25zdGFudCBjb2xvcicsXG4gICdvbmUgbWludXMgY29uc3RhbnQgYWxwaGEsIG9uZSBtaW51cyBjb25zdGFudCBjb2xvcidcbl1cblxudmFyIGNvbXBhcmVGdW5jcyA9IHtcbiAgJ25ldmVyJzogNTEyLFxuICAnbGVzcyc6IDUxMyxcbiAgJzwnOiA1MTMsXG4gICdlcXVhbCc6IDUxNCxcbiAgJz0nOiA1MTQsXG4gICc9PSc6IDUxNCxcbiAgJz09PSc6IDUxNCxcbiAgJ2xlcXVhbCc6IDUxNSxcbiAgJzw9JzogNTE1LFxuICAnZ3JlYXRlcic6IDUxNixcbiAgJz4nOiA1MTYsXG4gICdub3RlcXVhbCc6IDUxNyxcbiAgJyE9JzogNTE3LFxuICAnIT09JzogNTE3LFxuICAnZ2VxdWFsJzogNTE4LFxuICAnPj0nOiA1MTgsXG4gICdhbHdheXMnOiA1MTlcbn1cblxudmFyIHN0ZW5jaWxPcHMgPSB7XG4gICcwJzogMCxcbiAgJ3plcm8nOiAwLFxuICAna2VlcCc6IDc2ODAsXG4gICdyZXBsYWNlJzogNzY4MSxcbiAgJ2luY3JlbWVudCc6IDc2ODIsXG4gICdkZWNyZW1lbnQnOiA3NjgzLFxuICAnaW5jcmVtZW50IHdyYXAnOiAzNDA1NSxcbiAgJ2RlY3JlbWVudCB3cmFwJzogMzQwNTYsXG4gICdpbnZlcnQnOiA1Mzg2XG59XG5cbnZhciBzaGFkZXJUeXBlID0ge1xuICAnZnJhZyc6IEdMX0ZSQUdNRU5UX1NIQURFUiQxLFxuICAndmVydCc6IEdMX1ZFUlRFWF9TSEFERVIkMVxufVxuXG52YXIgb3JpZW50YXRpb25UeXBlID0ge1xuICAnY3cnOiBHTF9DVyxcbiAgJ2Njdyc6IEdMX0NDV1xufVxuXG5mdW5jdGlvbiBpc0J1ZmZlckFyZ3MgKHgpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoeCkgfHxcbiAgICBpc1R5cGVkQXJyYXkoeCkgfHxcbiAgICBpc05EQXJyYXlMaWtlKHgpXG59XG5cbi8vIE1ha2Ugc3VyZSB2aWV3cG9ydCBpcyBwcm9jZXNzZWQgZmlyc3RcbmZ1bmN0aW9uIHNvcnRTdGF0ZSAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gU19WSUVXUE9SVCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfSBlbHNlIGlmIChiID09PSBTX1ZJRVdQT1JUKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cbiAgICByZXR1cm4gKGEgPCBiKSA/IC0xIDogMVxuICB9KVxufVxuXG5mdW5jdGlvbiBEZWNsYXJhdGlvbiAodGhpc0RlcCwgY29udGV4dERlcCwgcHJvcERlcCwgYXBwZW5kKSB7XG4gIHRoaXMudGhpc0RlcCA9IHRoaXNEZXBcbiAgdGhpcy5jb250ZXh0RGVwID0gY29udGV4dERlcFxuICB0aGlzLnByb3BEZXAgPSBwcm9wRGVwXG4gIHRoaXMuYXBwZW5kID0gYXBwZW5kXG59XG5cbmZ1bmN0aW9uIGlzU3RhdGljIChkZWNsKSB7XG4gIHJldHVybiBkZWNsICYmICEoZGVjbC50aGlzRGVwIHx8IGRlY2wuY29udGV4dERlcCB8fCBkZWNsLnByb3BEZXApXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRpY0RlY2wgKGFwcGVuZCkge1xuICByZXR1cm4gbmV3IERlY2xhcmF0aW9uKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGFwcGVuZClcbn1cblxuZnVuY3Rpb24gY3JlYXRlRHluYW1pY0RlY2wgKGR5biwgYXBwZW5kKSB7XG4gIHZhciB0eXBlID0gZHluLnR5cGVcbiAgaWYgKHR5cGUgPT09IERZTl9GVU5DJDEpIHtcbiAgICB2YXIgbnVtQXJncyA9IGR5bi5kYXRhLmxlbmd0aFxuICAgIHJldHVybiBuZXcgRGVjbGFyYXRpb24oXG4gICAgICB0cnVlLFxuICAgICAgbnVtQXJncyA+PSAxLFxuICAgICAgbnVtQXJncyA+PSAyLFxuICAgICAgYXBwZW5kKVxuICB9IGVsc2UgaWYgKHR5cGUgPT09IERZTl9USFVOSykge1xuICAgIHZhciBkYXRhID0gZHluLmRhdGFcbiAgICByZXR1cm4gbmV3IERlY2xhcmF0aW9uKFxuICAgICAgZGF0YS50aGlzRGVwLFxuICAgICAgZGF0YS5jb250ZXh0RGVwLFxuICAgICAgZGF0YS5wcm9wRGVwLFxuICAgICAgYXBwZW5kKVxuICB9IGVsc2UgaWYgKHR5cGUgPT09IERZTl9DT05TVEFOVCQxKSB7XG4gICAgcmV0dXJuIG5ldyBEZWNsYXJhdGlvbihcbiAgICAgIGZhbHNlLFxuICAgICAgZmFsc2UsXG4gICAgICBmYWxzZSxcbiAgICAgIGFwcGVuZClcbiAgfSBlbHNlIGlmICh0eXBlID09PSBEWU5fQVJSQVkkMSkge1xuICAgIHZhciB0aGlzRGVwID0gZmFsc2VcbiAgICB2YXIgY29udGV4dERlcCA9IGZhbHNlXG4gICAgdmFyIHByb3BEZXAgPSBmYWxzZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHluLmRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBzdWJEeW4gPSBkeW4uZGF0YVtpXVxuICAgICAgaWYgKHN1YkR5bi50eXBlID09PSBEWU5fUFJPUCQxKSB7XG4gICAgICAgIHByb3BEZXAgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN1YkR5bi50eXBlID09PSBEWU5fQ09OVEVYVCQxKSB7XG4gICAgICAgIGNvbnRleHREZXAgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN1YkR5bi50eXBlID09PSBEWU5fU1RBVEUkMSkge1xuICAgICAgICB0aGlzRGVwID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdWJEeW4udHlwZSA9PT0gRFlOX0ZVTkMkMSkge1xuICAgICAgICB0aGlzRGVwID0gdHJ1ZVxuICAgICAgICB2YXIgc3ViQXJncyA9IHN1YkR5bi5kYXRhXG4gICAgICAgIGlmIChzdWJBcmdzID49IDEpIHtcbiAgICAgICAgICBjb250ZXh0RGVwID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdWJBcmdzID49IDIpIHtcbiAgICAgICAgICBwcm9wRGVwID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN1YkR5bi50eXBlID09PSBEWU5fVEhVTkspIHtcbiAgICAgICAgdGhpc0RlcCA9IHRoaXNEZXAgfHwgc3ViRHluLmRhdGEudGhpc0RlcFxuICAgICAgICBjb250ZXh0RGVwID0gY29udGV4dERlcCB8fCBzdWJEeW4uZGF0YS5jb250ZXh0RGVwXG4gICAgICAgIHByb3BEZXAgPSBwcm9wRGVwIHx8IHN1YkR5bi5kYXRhLnByb3BEZXBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEZWNsYXJhdGlvbihcbiAgICAgIHRoaXNEZXAsXG4gICAgICBjb250ZXh0RGVwLFxuICAgICAgcHJvcERlcCxcbiAgICAgIGFwcGVuZClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IERlY2xhcmF0aW9uKFxuICAgICAgdHlwZSA9PT0gRFlOX1NUQVRFJDEsXG4gICAgICB0eXBlID09PSBEWU5fQ09OVEVYVCQxLFxuICAgICAgdHlwZSA9PT0gRFlOX1BST1AkMSxcbiAgICAgIGFwcGVuZClcbiAgfVxufVxuXG52YXIgU0NPUEVfREVDTCA9IG5ldyBEZWNsYXJhdGlvbihmYWxzZSwgZmFsc2UsIGZhbHNlLCBmdW5jdGlvbiAoKSB7fSlcblxuZnVuY3Rpb24gcmVnbENvcmUgKFxuICBnbCxcbiAgc3RyaW5nU3RvcmUsXG4gIGV4dGVuc2lvbnMsXG4gIGxpbWl0cyxcbiAgYnVmZmVyU3RhdGUsXG4gIGVsZW1lbnRTdGF0ZSxcbiAgdGV4dHVyZVN0YXRlLFxuICBmcmFtZWJ1ZmZlclN0YXRlLFxuICB1bmlmb3JtU3RhdGUsXG4gIGF0dHJpYnV0ZVN0YXRlLFxuICBzaGFkZXJTdGF0ZSxcbiAgZHJhd1N0YXRlLFxuICBjb250ZXh0U3RhdGUsXG4gIHRpbWVyLFxuICBjb25maWcpIHtcbiAgdmFyIEF0dHJpYnV0ZVJlY29yZCA9IGF0dHJpYnV0ZVN0YXRlLlJlY29yZFxuXG4gIHZhciBibGVuZEVxdWF0aW9ucyA9IHtcbiAgICAnYWRkJzogMzI3NzQsXG4gICAgJ3N1YnRyYWN0JzogMzI3NzgsXG4gICAgJ3JldmVyc2Ugc3VidHJhY3QnOiAzMjc3OVxuICB9XG4gIGlmIChleHRlbnNpb25zLmV4dF9ibGVuZF9taW5tYXgpIHtcbiAgICBibGVuZEVxdWF0aW9ucy5taW4gPSBHTF9NSU5fRVhUXG4gICAgYmxlbmRFcXVhdGlvbnMubWF4ID0gR0xfTUFYX0VYVFxuICB9XG5cbiAgdmFyIGV4dEluc3RhbmNpbmcgPSBleHRlbnNpb25zLmFuZ2xlX2luc3RhbmNlZF9hcnJheXNcbiAgdmFyIGV4dERyYXdCdWZmZXJzID0gZXh0ZW5zaW9ucy53ZWJnbF9kcmF3X2J1ZmZlcnNcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFdFQkdMIFNUQVRFXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHtcbiAgICBkaXJ0eTogdHJ1ZSxcbiAgICBwcm9maWxlOiBjb25maWcucHJvZmlsZVxuICB9XG4gIHZhciBuZXh0U3RhdGUgPSB7fVxuICB2YXIgR0xfU1RBVEVfTkFNRVMgPSBbXVxuICB2YXIgR0xfRkxBR1MgPSB7fVxuICB2YXIgR0xfVkFSSUFCTEVTID0ge31cblxuICBmdW5jdGlvbiBwcm9wTmFtZSAobmFtZSkge1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJy4nLCAnXycpXG4gIH1cblxuICBmdW5jdGlvbiBzdGF0ZUZsYWcgKHNuYW1lLCBjYXAsIGluaXQpIHtcbiAgICB2YXIgbmFtZSA9IHByb3BOYW1lKHNuYW1lKVxuICAgIEdMX1NUQVRFX05BTUVTLnB1c2goc25hbWUpXG4gICAgbmV4dFN0YXRlW25hbWVdID0gY3VycmVudFN0YXRlW25hbWVdID0gISFpbml0XG4gICAgR0xfRkxBR1NbbmFtZV0gPSBjYXBcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXRlVmFyaWFibGUgKHNuYW1lLCBmdW5jLCBpbml0KSB7XG4gICAgdmFyIG5hbWUgPSBwcm9wTmFtZShzbmFtZSlcbiAgICBHTF9TVEFURV9OQU1FUy5wdXNoKHNuYW1lKVxuICAgIGlmIChBcnJheS5pc0FycmF5KGluaXQpKSB7XG4gICAgICBjdXJyZW50U3RhdGVbbmFtZV0gPSBpbml0LnNsaWNlKClcbiAgICAgIG5leHRTdGF0ZVtuYW1lXSA9IGluaXQuc2xpY2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50U3RhdGVbbmFtZV0gPSBuZXh0U3RhdGVbbmFtZV0gPSBpbml0XG4gICAgfVxuICAgIEdMX1ZBUklBQkxFU1tuYW1lXSA9IGZ1bmNcbiAgfVxuXG4gIC8vIERpdGhlcmluZ1xuICBzdGF0ZUZsYWcoU19ESVRIRVIsIEdMX0RJVEhFUilcblxuICAvLyBCbGVuZGluZ1xuICBzdGF0ZUZsYWcoU19CTEVORF9FTkFCTEUsIEdMX0JMRU5EKVxuICBzdGF0ZVZhcmlhYmxlKFNfQkxFTkRfQ09MT1IsICdibGVuZENvbG9yJywgWzAsIDAsIDAsIDBdKVxuICBzdGF0ZVZhcmlhYmxlKFNfQkxFTkRfRVFVQVRJT04sICdibGVuZEVxdWF0aW9uU2VwYXJhdGUnLFxuICAgIFtHTF9GVU5DX0FERCwgR0xfRlVOQ19BRERdKVxuICBzdGF0ZVZhcmlhYmxlKFNfQkxFTkRfRlVOQywgJ2JsZW5kRnVuY1NlcGFyYXRlJyxcbiAgICBbR0xfT05FLCBHTF9aRVJPLCBHTF9PTkUsIEdMX1pFUk9dKVxuXG4gIC8vIERlcHRoXG4gIHN0YXRlRmxhZyhTX0RFUFRIX0VOQUJMRSwgR0xfREVQVEhfVEVTVCwgdHJ1ZSlcbiAgc3RhdGVWYXJpYWJsZShTX0RFUFRIX0ZVTkMsICdkZXB0aEZ1bmMnLCBHTF9MRVNTKVxuICBzdGF0ZVZhcmlhYmxlKFNfREVQVEhfUkFOR0UsICdkZXB0aFJhbmdlJywgWzAsIDFdKVxuICBzdGF0ZVZhcmlhYmxlKFNfREVQVEhfTUFTSywgJ2RlcHRoTWFzaycsIHRydWUpXG5cbiAgLy8gQ29sb3IgbWFza1xuICBzdGF0ZVZhcmlhYmxlKFNfQ09MT1JfTUFTSywgU19DT0xPUl9NQVNLLCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pXG5cbiAgLy8gRmFjZSBjdWxsaW5nXG4gIHN0YXRlRmxhZyhTX0NVTExfRU5BQkxFLCBHTF9DVUxMX0ZBQ0UpXG4gIHN0YXRlVmFyaWFibGUoU19DVUxMX0ZBQ0UsICdjdWxsRmFjZScsIEdMX0JBQ0spXG5cbiAgLy8gRnJvbnQgZmFjZSBvcmllbnRhdGlvblxuICBzdGF0ZVZhcmlhYmxlKFNfRlJPTlRfRkFDRSwgU19GUk9OVF9GQUNFLCBHTF9DQ1cpXG5cbiAgLy8gTGluZSB3aWR0aFxuICBzdGF0ZVZhcmlhYmxlKFNfTElORV9XSURUSCwgU19MSU5FX1dJRFRILCAxKVxuXG4gIC8vIFBvbHlnb24gb2Zmc2V0XG4gIHN0YXRlRmxhZyhTX1BPTFlHT05fT0ZGU0VUX0VOQUJMRSwgR0xfUE9MWUdPTl9PRkZTRVRfRklMTClcbiAgc3RhdGVWYXJpYWJsZShTX1BPTFlHT05fT0ZGU0VUX09GRlNFVCwgJ3BvbHlnb25PZmZzZXQnLCBbMCwgMF0pXG5cbiAgLy8gU2FtcGxlIGNvdmVyYWdlXG4gIHN0YXRlRmxhZyhTX1NBTVBMRV9BTFBIQSwgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKVxuICBzdGF0ZUZsYWcoU19TQU1QTEVfRU5BQkxFLCBHTF9TQU1QTEVfQ09WRVJBR0UpXG4gIHN0YXRlVmFyaWFibGUoU19TQU1QTEVfQ09WRVJBR0UsICdzYW1wbGVDb3ZlcmFnZScsIFsxLCBmYWxzZV0pXG5cbiAgLy8gU3RlbmNpbFxuICBzdGF0ZUZsYWcoU19TVEVOQ0lMX0VOQUJMRSwgR0xfU1RFTkNJTF9URVNUKVxuICBzdGF0ZVZhcmlhYmxlKFNfU1RFTkNJTF9NQVNLLCAnc3RlbmNpbE1hc2snLCAtMSlcbiAgc3RhdGVWYXJpYWJsZShTX1NURU5DSUxfRlVOQywgJ3N0ZW5jaWxGdW5jJywgW0dMX0FMV0FZUywgMCwgLTFdKVxuICBzdGF0ZVZhcmlhYmxlKFNfU1RFTkNJTF9PUEZST05ULCAnc3RlbmNpbE9wU2VwYXJhdGUnLFxuICAgIFtHTF9GUk9OVCwgR0xfS0VFUCwgR0xfS0VFUCwgR0xfS0VFUF0pXG4gIHN0YXRlVmFyaWFibGUoU19TVEVOQ0lMX09QQkFDSywgJ3N0ZW5jaWxPcFNlcGFyYXRlJyxcbiAgICBbR0xfQkFDSywgR0xfS0VFUCwgR0xfS0VFUCwgR0xfS0VFUF0pXG5cbiAgLy8gU2Npc3NvclxuICBzdGF0ZUZsYWcoU19TQ0lTU09SX0VOQUJMRSwgR0xfU0NJU1NPUl9URVNUKVxuICBzdGF0ZVZhcmlhYmxlKFNfU0NJU1NPUl9CT1gsICdzY2lzc29yJyxcbiAgICBbMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XSlcblxuICAvLyBWaWV3cG9ydFxuICBzdGF0ZVZhcmlhYmxlKFNfVklFV1BPUlQsIFNfVklFV1BPUlQsXG4gICAgWzAsIDAsIGdsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodF0pXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFTlZJUk9OTUVOVFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzaGFyZWRTdGF0ZSA9IHtcbiAgICBnbDogZ2wsXG4gICAgY29udGV4dDogY29udGV4dFN0YXRlLFxuICAgIHN0cmluZ3M6IHN0cmluZ1N0b3JlLFxuICAgIG5leHQ6IG5leHRTdGF0ZSxcbiAgICBjdXJyZW50OiBjdXJyZW50U3RhdGUsXG4gICAgZHJhdzogZHJhd1N0YXRlLFxuICAgIGVsZW1lbnRzOiBlbGVtZW50U3RhdGUsXG4gICAgYnVmZmVyOiBidWZmZXJTdGF0ZSxcbiAgICBzaGFkZXI6IHNoYWRlclN0YXRlLFxuICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZVN0YXRlLnN0YXRlLFxuICAgIHZhbzogYXR0cmlidXRlU3RhdGUsXG4gICAgdW5pZm9ybXM6IHVuaWZvcm1TdGF0ZSxcbiAgICBmcmFtZWJ1ZmZlcjogZnJhbWVidWZmZXJTdGF0ZSxcbiAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLFxuXG4gICAgdGltZXI6IHRpbWVyLFxuICAgIGlzQnVmZmVyQXJnczogaXNCdWZmZXJBcmdzXG4gIH1cblxuICB2YXIgc2hhcmVkQ29uc3RhbnRzID0ge1xuICAgIHByaW1UeXBlczogcHJpbVR5cGVzLFxuICAgIGNvbXBhcmVGdW5jczogY29tcGFyZUZ1bmNzLFxuICAgIGJsZW5kRnVuY3M6IGJsZW5kRnVuY3MsXG4gICAgYmxlbmRFcXVhdGlvbnM6IGJsZW5kRXF1YXRpb25zLFxuICAgIHN0ZW5jaWxPcHM6IHN0ZW5jaWxPcHMsXG4gICAgZ2xUeXBlczogZ2xUeXBlcyxcbiAgICBvcmllbnRhdGlvblR5cGU6IG9yaWVudGF0aW9uVHlwZVxuICB9XG5cbiAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgc2hhcmVkU3RhdGUuaXNBcnJheUxpa2UgPSBpc0FycmF5TGlrZVxuICB9KVxuXG4gIGlmIChleHREcmF3QnVmZmVycykge1xuICAgIHNoYXJlZENvbnN0YW50cy5iYWNrQnVmZmVyID0gW0dMX0JBQ0tdXG4gICAgc2hhcmVkQ29uc3RhbnRzLmRyYXdCdWZmZXIgPSBsb29wKGxpbWl0cy5tYXhEcmF3YnVmZmVycywgZnVuY3Rpb24gKGkpIHtcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbMF1cbiAgICAgIH1cbiAgICAgIHJldHVybiBsb29wKGksIGZ1bmN0aW9uIChqKSB7XG4gICAgICAgIHJldHVybiBHTF9DT0xPUl9BVFRBQ0hNRU5UMCQyICsgalxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdmFyIGRyYXdDYWxsQ291bnRlciA9IDBcbiAgZnVuY3Rpb24gY3JlYXRlUkVHTEVudmlyb25tZW50ICgpIHtcbiAgICB2YXIgZW52ID0gY3JlYXRlRW52aXJvbm1lbnQoKVxuICAgIHZhciBsaW5rID0gZW52LmxpbmtcbiAgICB2YXIgZ2xvYmFsID0gZW52Lmdsb2JhbFxuICAgIGVudi5pZCA9IGRyYXdDYWxsQ291bnRlcisrXG5cbiAgICBlbnYuYmF0Y2hJZCA9ICcwJ1xuXG4gICAgLy8gbGluayBzaGFyZWQgc3RhdGVcbiAgICB2YXIgU0hBUkVEID0gbGluayhzaGFyZWRTdGF0ZSlcbiAgICB2YXIgc2hhcmVkID0gZW52LnNoYXJlZCA9IHtcbiAgICAgIHByb3BzOiAnYTAnXG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHNoYXJlZFN0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBzaGFyZWRbcHJvcF0gPSBnbG9iYWwuZGVmKFNIQVJFRCwgJy4nLCBwcm9wKVxuICAgIH0pXG5cbiAgICAvLyBJbmplY3QgcnVudGltZSBhc3NlcnRpb24gc3R1ZmYgZm9yIGRlYnVnIGJ1aWxkc1xuICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgZW52LkNIRUNLID0gbGluayhjaGVjayQxKVxuICAgICAgZW52LmNvbW1hbmRTdHIgPSBjaGVjayQxLmd1ZXNzQ29tbWFuZCgpXG4gICAgICBlbnYuY29tbWFuZCA9IGxpbmsoZW52LmNvbW1hbmRTdHIpXG4gICAgICBlbnYuYXNzZXJ0ID0gZnVuY3Rpb24gKGJsb2NrLCBwcmVkLCBtZXNzYWdlKSB7XG4gICAgICAgIGJsb2NrKFxuICAgICAgICAgICdpZighKCcsIHByZWQsICcpKScsXG4gICAgICAgICAgdGhpcy5DSEVDSywgJy5jb21tYW5kUmFpc2UoJywgbGluayhtZXNzYWdlKSwgJywnLCB0aGlzLmNvbW1hbmQsICcpOycpXG4gICAgICB9XG5cbiAgICAgIHNoYXJlZENvbnN0YW50cy5pbnZhbGlkQmxlbmRDb21iaW5hdGlvbnMgPSBpbnZhbGlkQmxlbmRDb21iaW5hdGlvbnNcbiAgICB9KVxuXG4gICAgLy8gQ29weSBHTCBzdGF0ZSB2YXJpYWJsZXMgb3ZlclxuICAgIHZhciBuZXh0VmFycyA9IGVudi5uZXh0ID0ge31cbiAgICB2YXIgY3VycmVudFZhcnMgPSBlbnYuY3VycmVudCA9IHt9XG4gICAgT2JqZWN0LmtleXMoR0xfVkFSSUFCTEVTKS5mb3JFYWNoKGZ1bmN0aW9uICh2YXJpYWJsZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFN0YXRlW3ZhcmlhYmxlXSkpIHtcbiAgICAgICAgbmV4dFZhcnNbdmFyaWFibGVdID0gZ2xvYmFsLmRlZihzaGFyZWQubmV4dCwgJy4nLCB2YXJpYWJsZSlcbiAgICAgICAgY3VycmVudFZhcnNbdmFyaWFibGVdID0gZ2xvYmFsLmRlZihzaGFyZWQuY3VycmVudCwgJy4nLCB2YXJpYWJsZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBzaGFyZWQgY29uc3RhbnRzXG4gICAgdmFyIGNvbnN0YW50cyA9IGVudi5jb25zdGFudHMgPSB7fVxuICAgIE9iamVjdC5rZXlzKHNoYXJlZENvbnN0YW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgY29uc3RhbnRzW25hbWVdID0gZ2xvYmFsLmRlZihKU09OLnN0cmluZ2lmeShzaGFyZWRDb25zdGFudHNbbmFtZV0pKVxuICAgIH0pXG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGNhbGxpbmcgYSBibG9ja1xuICAgIGVudi5pbnZva2UgPSBmdW5jdGlvbiAoYmxvY2ssIHgpIHtcbiAgICAgIHN3aXRjaCAoeC50eXBlKSB7XG4gICAgICAgIGNhc2UgRFlOX0ZVTkMkMTpcbiAgICAgICAgICB2YXIgYXJnTGlzdCA9IFtcbiAgICAgICAgICAgICd0aGlzJyxcbiAgICAgICAgICAgIHNoYXJlZC5jb250ZXh0LFxuICAgICAgICAgICAgc2hhcmVkLnByb3BzLFxuICAgICAgICAgICAgZW52LmJhdGNoSWRcbiAgICAgICAgICBdXG4gICAgICAgICAgcmV0dXJuIGJsb2NrLmRlZihcbiAgICAgICAgICAgIGxpbmsoeC5kYXRhKSwgJy5jYWxsKCcsXG4gICAgICAgICAgICBhcmdMaXN0LnNsaWNlKDAsIE1hdGgubWF4KHguZGF0YS5sZW5ndGggKyAxLCA0KSksXG4gICAgICAgICAgICAnKScpXG4gICAgICAgIGNhc2UgRFlOX1BST1AkMTpcbiAgICAgICAgICByZXR1cm4gYmxvY2suZGVmKHNoYXJlZC5wcm9wcywgeC5kYXRhKVxuICAgICAgICBjYXNlIERZTl9DT05URVhUJDE6XG4gICAgICAgICAgcmV0dXJuIGJsb2NrLmRlZihzaGFyZWQuY29udGV4dCwgeC5kYXRhKVxuICAgICAgICBjYXNlIERZTl9TVEFURSQxOlxuICAgICAgICAgIHJldHVybiBibG9jay5kZWYoJ3RoaXMnLCB4LmRhdGEpXG4gICAgICAgIGNhc2UgRFlOX1RIVU5LOlxuICAgICAgICAgIHguZGF0YS5hcHBlbmQoZW52LCBibG9jaylcbiAgICAgICAgICByZXR1cm4geC5kYXRhLnJlZlxuICAgICAgICBjYXNlIERZTl9DT05TVEFOVCQxOlxuICAgICAgICAgIHJldHVybiB4LmRhdGEudG9TdHJpbmcoKVxuICAgICAgICBjYXNlIERZTl9BUlJBWSQxOlxuICAgICAgICAgIHJldHVybiB4LmRhdGEubWFwKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW52Lmludm9rZShibG9jaywgeSlcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGVudi5hdHRyaWJDYWNoZSA9IHt9XG5cbiAgICB2YXIgc2NvcGVBdHRyaWJzID0ge31cbiAgICBlbnYuc2NvcGVBdHRyaWIgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGlkID0gc3RyaW5nU3RvcmUuaWQobmFtZSlcbiAgICAgIGlmIChpZCBpbiBzY29wZUF0dHJpYnMpIHtcbiAgICAgICAgcmV0dXJuIHNjb3BlQXR0cmlic1tpZF1cbiAgICAgIH1cbiAgICAgIHZhciBiaW5kaW5nID0gYXR0cmlidXRlU3RhdGUuc2NvcGVbaWRdXG4gICAgICBpZiAoIWJpbmRpbmcpIHtcbiAgICAgICAgYmluZGluZyA9IGF0dHJpYnV0ZVN0YXRlLnNjb3BlW2lkXSA9IG5ldyBBdHRyaWJ1dGVSZWNvcmQoKVxuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHNjb3BlQXR0cmlic1tpZF0gPSBsaW5rKGJpbmRpbmcpXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudlxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQQVJTSU5HXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gcGFyc2VQcm9maWxlIChvcHRpb25zKSB7XG4gICAgdmFyIHN0YXRpY09wdGlvbnMgPSBvcHRpb25zLnN0YXRpY1xuICAgIHZhciBkeW5hbWljT3B0aW9ucyA9IG9wdGlvbnMuZHluYW1pY1xuXG4gICAgdmFyIHByb2ZpbGVFbmFibGVcbiAgICBpZiAoU19QUk9GSUxFIGluIHN0YXRpY09wdGlvbnMpIHtcbiAgICAgIHZhciB2YWx1ZSA9ICEhc3RhdGljT3B0aW9uc1tTX1BST0ZJTEVdXG4gICAgICBwcm9maWxlRW5hYmxlID0gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH0pXG4gICAgICBwcm9maWxlRW5hYmxlLmVuYWJsZSA9IHZhbHVlXG4gICAgfSBlbHNlIGlmIChTX1BST0ZJTEUgaW4gZHluYW1pY09wdGlvbnMpIHtcbiAgICAgIHZhciBkeW4gPSBkeW5hbWljT3B0aW9uc1tTX1BST0ZJTEVdXG4gICAgICBwcm9maWxlRW5hYmxlID0gY3JlYXRlRHluYW1pY0RlY2woZHluLCBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICByZXR1cm4gZW52Lmludm9rZShzY29wZSwgZHluKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvZmlsZUVuYWJsZVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VGcmFtZWJ1ZmZlciAob3B0aW9ucywgZW52KSB7XG4gICAgdmFyIHN0YXRpY09wdGlvbnMgPSBvcHRpb25zLnN0YXRpY1xuICAgIHZhciBkeW5hbWljT3B0aW9ucyA9IG9wdGlvbnMuZHluYW1pY1xuXG4gICAgaWYgKFNfRlJBTUVCVUZGRVIgaW4gc3RhdGljT3B0aW9ucykge1xuICAgICAgdmFyIGZyYW1lYnVmZmVyID0gc3RhdGljT3B0aW9uc1tTX0ZSQU1FQlVGRkVSXVxuICAgICAgaWYgKGZyYW1lYnVmZmVyKSB7XG4gICAgICAgIGZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXJTdGF0ZS5nZXRGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcilcbiAgICAgICAgY2hlY2skMS5jb21tYW5kKGZyYW1lYnVmZmVyLCAnaW52YWxpZCBmcmFtZWJ1ZmZlciBvYmplY3QnKVxuICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52LCBibG9jaykge1xuICAgICAgICAgIHZhciBGUkFNRUJVRkZFUiA9IGVudi5saW5rKGZyYW1lYnVmZmVyKVxuICAgICAgICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG4gICAgICAgICAgYmxvY2suc2V0KFxuICAgICAgICAgICAgc2hhcmVkLmZyYW1lYnVmZmVyLFxuICAgICAgICAgICAgJy5uZXh0JyxcbiAgICAgICAgICAgIEZSQU1FQlVGRkVSKVxuICAgICAgICAgIHZhciBDT05URVhUID0gc2hhcmVkLmNvbnRleHRcbiAgICAgICAgICBibG9jay5zZXQoXG4gICAgICAgICAgICBDT05URVhULFxuICAgICAgICAgICAgJy4nICsgU19GUkFNRUJVRkZFUl9XSURUSCxcbiAgICAgICAgICAgIEZSQU1FQlVGRkVSICsgJy53aWR0aCcpXG4gICAgICAgICAgYmxvY2suc2V0KFxuICAgICAgICAgICAgQ09OVEVYVCxcbiAgICAgICAgICAgICcuJyArIFNfRlJBTUVCVUZGRVJfSEVJR0hULFxuICAgICAgICAgICAgRlJBTUVCVUZGRVIgKyAnLmhlaWdodCcpXG4gICAgICAgICAgcmV0dXJuIEZSQU1FQlVGRkVSXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG4gICAgICAgICAgc2NvcGUuc2V0KFxuICAgICAgICAgICAgc2hhcmVkLmZyYW1lYnVmZmVyLFxuICAgICAgICAgICAgJy5uZXh0JyxcbiAgICAgICAgICAgICdudWxsJylcbiAgICAgICAgICB2YXIgQ09OVEVYVCA9IHNoYXJlZC5jb250ZXh0XG4gICAgICAgICAgc2NvcGUuc2V0KFxuICAgICAgICAgICAgQ09OVEVYVCxcbiAgICAgICAgICAgICcuJyArIFNfRlJBTUVCVUZGRVJfV0lEVEgsXG4gICAgICAgICAgICBDT05URVhUICsgJy4nICsgU19EUkFXSU5HQlVGRkVSX1dJRFRIKVxuICAgICAgICAgIHNjb3BlLnNldChcbiAgICAgICAgICAgIENPTlRFWFQsXG4gICAgICAgICAgICAnLicgKyBTX0ZSQU1FQlVGRkVSX0hFSUdIVCxcbiAgICAgICAgICAgIENPTlRFWFQgKyAnLicgKyBTX0RSQVdJTkdCVUZGRVJfSEVJR0hUKVxuICAgICAgICAgIHJldHVybiAnbnVsbCdcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFNfRlJBTUVCVUZGRVIgaW4gZHluYW1pY09wdGlvbnMpIHtcbiAgICAgIHZhciBkeW4gPSBkeW5hbWljT3B0aW9uc1tTX0ZSQU1FQlVGRkVSXVxuICAgICAgcmV0dXJuIGNyZWF0ZUR5bmFtaWNEZWNsKGR5biwgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgdmFyIEZSQU1FQlVGRkVSX0ZVTkMgPSBlbnYuaW52b2tlKHNjb3BlLCBkeW4pXG4gICAgICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG4gICAgICAgIHZhciBGUkFNRUJVRkZFUl9TVEFURSA9IHNoYXJlZC5mcmFtZWJ1ZmZlclxuICAgICAgICB2YXIgRlJBTUVCVUZGRVIgPSBzY29wZS5kZWYoXG4gICAgICAgICAgRlJBTUVCVUZGRVJfU1RBVEUsICcuZ2V0RnJhbWVidWZmZXIoJywgRlJBTUVCVUZGRVJfRlVOQywgJyknKVxuXG4gICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAnIScgKyBGUkFNRUJVRkZFUl9GVU5DICsgJ3x8JyArIEZSQU1FQlVGRkVSLFxuICAgICAgICAgICAgJ2ludmFsaWQgZnJhbWVidWZmZXIgb2JqZWN0JylcbiAgICAgICAgfSlcblxuICAgICAgICBzY29wZS5zZXQoXG4gICAgICAgICAgRlJBTUVCVUZGRVJfU1RBVEUsXG4gICAgICAgICAgJy5uZXh0JyxcbiAgICAgICAgICBGUkFNRUJVRkZFUilcbiAgICAgICAgdmFyIENPTlRFWFQgPSBzaGFyZWQuY29udGV4dFxuICAgICAgICBzY29wZS5zZXQoXG4gICAgICAgICAgQ09OVEVYVCxcbiAgICAgICAgICAnLicgKyBTX0ZSQU1FQlVGRkVSX1dJRFRILFxuICAgICAgICAgIEZSQU1FQlVGRkVSICsgJz8nICsgRlJBTUVCVUZGRVIgKyAnLndpZHRoOicgK1xuICAgICAgICAgIENPTlRFWFQgKyAnLicgKyBTX0RSQVdJTkdCVUZGRVJfV0lEVEgpXG4gICAgICAgIHNjb3BlLnNldChcbiAgICAgICAgICBDT05URVhULFxuICAgICAgICAgICcuJyArIFNfRlJBTUVCVUZGRVJfSEVJR0hULFxuICAgICAgICAgIEZSQU1FQlVGRkVSICtcbiAgICAgICAgICAnPycgKyBGUkFNRUJVRkZFUiArICcuaGVpZ2h0OicgK1xuICAgICAgICAgIENPTlRFWFQgKyAnLicgKyBTX0RSQVdJTkdCVUZGRVJfSEVJR0hUKVxuICAgICAgICByZXR1cm4gRlJBTUVCVUZGRVJcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VWaWV3cG9ydFNjaXNzb3IgKG9wdGlvbnMsIGZyYW1lYnVmZmVyLCBlbnYpIHtcbiAgICB2YXIgc3RhdGljT3B0aW9ucyA9IG9wdGlvbnMuc3RhdGljXG4gICAgdmFyIGR5bmFtaWNPcHRpb25zID0gb3B0aW9ucy5keW5hbWljXG5cbiAgICBmdW5jdGlvbiBwYXJzZUJveCAocGFyYW0pIHtcbiAgICAgIGlmIChwYXJhbSBpbiBzdGF0aWNPcHRpb25zKSB7XG4gICAgICAgIHZhciBib3ggPSBzdGF0aWNPcHRpb25zW3BhcmFtXVxuICAgICAgICBjaGVjayQxLmNvbW1hbmRUeXBlKGJveCwgJ29iamVjdCcsICdpbnZhbGlkICcgKyBwYXJhbSwgZW52LmNvbW1hbmRTdHIpXG5cbiAgICAgICAgdmFyIGlzU3RhdGljID0gdHJ1ZVxuICAgICAgICB2YXIgeCA9IGJveC54IHwgMFxuICAgICAgICB2YXIgeSA9IGJveC55IHwgMFxuICAgICAgICB2YXIgdywgaFxuICAgICAgICBpZiAoJ3dpZHRoJyBpbiBib3gpIHtcbiAgICAgICAgICB3ID0gYm94LndpZHRoIHwgMFxuICAgICAgICAgIGNoZWNrJDEuY29tbWFuZCh3ID49IDAsICdpbnZhbGlkICcgKyBwYXJhbSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXNTdGF0aWMgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmICgnaGVpZ2h0JyBpbiBib3gpIHtcbiAgICAgICAgICBoID0gYm94LmhlaWdodCB8IDBcbiAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoaCA+PSAwLCAnaW52YWxpZCAnICsgcGFyYW0sIGVudi5jb21tYW5kU3RyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzU3RhdGljID0gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRGVjbGFyYXRpb24oXG4gICAgICAgICAgIWlzU3RhdGljICYmIGZyYW1lYnVmZmVyICYmIGZyYW1lYnVmZmVyLnRoaXNEZXAsXG4gICAgICAgICAgIWlzU3RhdGljICYmIGZyYW1lYnVmZmVyICYmIGZyYW1lYnVmZmVyLmNvbnRleHREZXAsXG4gICAgICAgICAgIWlzU3RhdGljICYmIGZyYW1lYnVmZmVyICYmIGZyYW1lYnVmZmVyLnByb3BEZXAsXG4gICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICAgIHZhciBDT05URVhUID0gZW52LnNoYXJlZC5jb250ZXh0XG4gICAgICAgICAgICB2YXIgQk9YX1cgPSB3XG4gICAgICAgICAgICBpZiAoISgnd2lkdGgnIGluIGJveCkpIHtcbiAgICAgICAgICAgICAgQk9YX1cgPSBzY29wZS5kZWYoQ09OVEVYVCwgJy4nLCBTX0ZSQU1FQlVGRkVSX1dJRFRILCAnLScsIHgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgQk9YX0ggPSBoXG4gICAgICAgICAgICBpZiAoISgnaGVpZ2h0JyBpbiBib3gpKSB7XG4gICAgICAgICAgICAgIEJPWF9IID0gc2NvcGUuZGVmKENPTlRFWFQsICcuJywgU19GUkFNRUJVRkZFUl9IRUlHSFQsICctJywgeSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbeCwgeSwgQk9YX1csIEJPWF9IXVxuICAgICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtIGluIGR5bmFtaWNPcHRpb25zKSB7XG4gICAgICAgIHZhciBkeW5Cb3ggPSBkeW5hbWljT3B0aW9uc1twYXJhbV1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUR5bmFtaWNEZWNsKGR5bkJveCwgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICB2YXIgQk9YID0gZW52Lmludm9rZShzY29wZSwgZHluQm94KVxuXG4gICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICBCT1ggKyAnJiZ0eXBlb2YgJyArIEJPWCArICc9PT1cIm9iamVjdFwiJyxcbiAgICAgICAgICAgICAgJ2ludmFsaWQgJyArIHBhcmFtKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICB2YXIgQ09OVEVYVCA9IGVudi5zaGFyZWQuY29udGV4dFxuICAgICAgICAgIHZhciBCT1hfWCA9IHNjb3BlLmRlZihCT1gsICcueHwwJylcbiAgICAgICAgICB2YXIgQk9YX1kgPSBzY29wZS5kZWYoQk9YLCAnLnl8MCcpXG4gICAgICAgICAgdmFyIEJPWF9XID0gc2NvcGUuZGVmKFxuICAgICAgICAgICAgJ1wid2lkdGhcIiBpbiAnLCBCT1gsICc/JywgQk9YLCAnLndpZHRofDA6JyxcbiAgICAgICAgICAgICcoJywgQ09OVEVYVCwgJy4nLCBTX0ZSQU1FQlVGRkVSX1dJRFRILCAnLScsIEJPWF9YLCAnKScpXG4gICAgICAgICAgdmFyIEJPWF9IID0gc2NvcGUuZGVmKFxuICAgICAgICAgICAgJ1wiaGVpZ2h0XCIgaW4gJywgQk9YLCAnPycsIEJPWCwgJy5oZWlnaHR8MDonLFxuICAgICAgICAgICAgJygnLCBDT05URVhULCAnLicsIFNfRlJBTUVCVUZGRVJfSEVJR0hULCAnLScsIEJPWF9ZLCAnKScpXG5cbiAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgIEJPWF9XICsgJz49MCYmJyArXG4gICAgICAgICAgICAgIEJPWF9IICsgJz49MCcsXG4gICAgICAgICAgICAgICdpbnZhbGlkICcgKyBwYXJhbSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcmV0dXJuIFtCT1hfWCwgQk9YX1ksIEJPWF9XLCBCT1hfSF1cbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGZyYW1lYnVmZmVyKSB7XG4gICAgICAgICAgcmVzdWx0LnRoaXNEZXAgPSByZXN1bHQudGhpc0RlcCB8fCBmcmFtZWJ1ZmZlci50aGlzRGVwXG4gICAgICAgICAgcmVzdWx0LmNvbnRleHREZXAgPSByZXN1bHQuY29udGV4dERlcCB8fCBmcmFtZWJ1ZmZlci5jb250ZXh0RGVwXG4gICAgICAgICAgcmVzdWx0LnByb3BEZXAgPSByZXN1bHQucHJvcERlcCB8fCBmcmFtZWJ1ZmZlci5wcm9wRGVwXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfSBlbHNlIGlmIChmcmFtZWJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gbmV3IERlY2xhcmF0aW9uKFxuICAgICAgICAgIGZyYW1lYnVmZmVyLnRoaXNEZXAsXG4gICAgICAgICAgZnJhbWVidWZmZXIuY29udGV4dERlcCxcbiAgICAgICAgICBmcmFtZWJ1ZmZlci5wcm9wRGVwLFxuICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgICB2YXIgQ09OVEVYVCA9IGVudi5zaGFyZWQuY29udGV4dFxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgMCwgMCxcbiAgICAgICAgICAgICAgc2NvcGUuZGVmKENPTlRFWFQsICcuJywgU19GUkFNRUJVRkZFUl9XSURUSCksXG4gICAgICAgICAgICAgIHNjb3BlLmRlZihDT05URVhULCAnLicsIFNfRlJBTUVCVUZGRVJfSEVJR0hUKV1cbiAgICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdmlld3BvcnQgPSBwYXJzZUJveChTX1ZJRVdQT1JUKVxuXG4gICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICB2YXIgcHJldlZpZXdwb3J0ID0gdmlld3BvcnRcbiAgICAgIHZpZXdwb3J0ID0gbmV3IERlY2xhcmF0aW9uKFxuICAgICAgICB2aWV3cG9ydC50aGlzRGVwLFxuICAgICAgICB2aWV3cG9ydC5jb250ZXh0RGVwLFxuICAgICAgICB2aWV3cG9ydC5wcm9wRGVwLFxuICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIHZhciBWSUVXUE9SVCA9IHByZXZWaWV3cG9ydC5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgICAgICB2YXIgQ09OVEVYVCA9IGVudi5zaGFyZWQuY29udGV4dFxuICAgICAgICAgIHNjb3BlLnNldChcbiAgICAgICAgICAgIENPTlRFWFQsXG4gICAgICAgICAgICAnLicgKyBTX1ZJRVdQT1JUX1dJRFRILFxuICAgICAgICAgICAgVklFV1BPUlRbMl0pXG4gICAgICAgICAgc2NvcGUuc2V0KFxuICAgICAgICAgICAgQ09OVEVYVCxcbiAgICAgICAgICAgICcuJyArIFNfVklFV1BPUlRfSEVJR0hULFxuICAgICAgICAgICAgVklFV1BPUlRbM10pXG4gICAgICAgICAgcmV0dXJuIFZJRVdQT1JUXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydCxcbiAgICAgIHNjaXNzb3JfYm94OiBwYXJzZUJveChTX1NDSVNTT1JfQk9YKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlQXR0cmliTG9jYXRpb25zIChvcHRpb25zLCBhdHRyaWJ1dGVzKSB7XG4gICAgdmFyIHN0YXRpY09wdGlvbnMgPSBvcHRpb25zLnN0YXRpY1xuICAgIHZhciBzdGF0aWNQcm9ncmFtID1cbiAgICAgIHR5cGVvZiBzdGF0aWNPcHRpb25zW1NfRlJBR10gPT09ICdzdHJpbmcnICYmXG4gICAgICB0eXBlb2Ygc3RhdGljT3B0aW9uc1tTX1ZFUlRdID09PSAnc3RyaW5nJ1xuICAgIGlmIChzdGF0aWNQcm9ncmFtKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoYXR0cmlidXRlcy5keW5hbWljKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICB2YXIgc3RhdGljQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuc3RhdGljXG4gICAgICB2YXIgc0F0dHJpYnV0ZXMgPSBPYmplY3Qua2V5cyhzdGF0aWNBdHRyaWJ1dGVzKVxuICAgICAgaWYgKHNBdHRyaWJ1dGVzLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHN0YXRpY0F0dHJpYnV0ZXNbc0F0dHJpYnV0ZXNbMF1dID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgYmluZGluZ3MgPSBbXVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNBdHRyaWJ1dGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY2hlY2skMSh0eXBlb2Ygc3RhdGljQXR0cmlidXRlc1tzQXR0cmlidXRlc1tpXV0gPT09ICdudW1iZXInLCAnbXVzdCBzcGVjaWZ5IGFsbCB2ZXJ0ZXggYXR0cmlidXRlIGxvY2F0aW9ucyB3aGVuIHVzaW5nIHZhb3MnKVxuICAgICAgICAgIGJpbmRpbmdzLnB1c2goW3N0YXRpY0F0dHJpYnV0ZXNbc0F0dHJpYnV0ZXNbaV1dIHwgMCwgc0F0dHJpYnV0ZXNbaV1dKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiaW5kaW5nc1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VQcm9ncmFtIChvcHRpb25zLCBlbnYsIGF0dHJpYkxvY2F0aW9ucykge1xuICAgIHZhciBzdGF0aWNPcHRpb25zID0gb3B0aW9ucy5zdGF0aWNcbiAgICB2YXIgZHluYW1pY09wdGlvbnMgPSBvcHRpb25zLmR5bmFtaWNcblxuICAgIGZ1bmN0aW9uIHBhcnNlU2hhZGVyIChuYW1lKSB7XG4gICAgICBpZiAobmFtZSBpbiBzdGF0aWNPcHRpb25zKSB7XG4gICAgICAgIHZhciBpZCA9IHN0cmluZ1N0b3JlLmlkKHN0YXRpY09wdGlvbnNbbmFtZV0pXG4gICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNoYWRlclN0YXRlLnNoYWRlcihzaGFkZXJUeXBlW25hbWVdLCBpZCwgY2hlY2skMS5ndWVzc0NvbW1hbmQoKSlcbiAgICAgICAgfSlcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpZFxuICAgICAgICB9KVxuICAgICAgICByZXN1bHQuaWQgPSBpZFxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9IGVsc2UgaWYgKG5hbWUgaW4gZHluYW1pY09wdGlvbnMpIHtcbiAgICAgICAgdmFyIGR5biA9IGR5bmFtaWNPcHRpb25zW25hbWVdXG4gICAgICAgIHJldHVybiBjcmVhdGVEeW5hbWljRGVjbChkeW4sIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgdmFyIHN0ciA9IGVudi5pbnZva2Uoc2NvcGUsIGR5bilcbiAgICAgICAgICB2YXIgaWQgPSBzY29wZS5kZWYoZW52LnNoYXJlZC5zdHJpbmdzLCAnLmlkKCcsIHN0ciwgJyknKVxuICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2NvcGUoXG4gICAgICAgICAgICAgIGVudi5zaGFyZWQuc2hhZGVyLCAnLnNoYWRlcignLFxuICAgICAgICAgICAgICBzaGFkZXJUeXBlW25hbWVdLCAnLCcsXG4gICAgICAgICAgICAgIGlkLCAnLCcsXG4gICAgICAgICAgICAgIGVudi5jb21tYW5kLCAnKTsnKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuIGlkXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHZhciBmcmFnID0gcGFyc2VTaGFkZXIoU19GUkFHKVxuICAgIHZhciB2ZXJ0ID0gcGFyc2VTaGFkZXIoU19WRVJUKVxuXG4gICAgdmFyIHByb2dyYW0gPSBudWxsXG4gICAgdmFyIHByb2dWYXJcbiAgICBpZiAoaXNTdGF0aWMoZnJhZykgJiYgaXNTdGF0aWModmVydCkpIHtcbiAgICAgIHByb2dyYW0gPSBzaGFkZXJTdGF0ZS5wcm9ncmFtKHZlcnQuaWQsIGZyYWcuaWQsIG51bGwsIGF0dHJpYkxvY2F0aW9ucylcbiAgICAgIHByb2dWYXIgPSBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBlbnYubGluayhwcm9ncmFtKVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ1ZhciA9IG5ldyBEZWNsYXJhdGlvbihcbiAgICAgICAgKGZyYWcgJiYgZnJhZy50aGlzRGVwKSB8fCAodmVydCAmJiB2ZXJ0LnRoaXNEZXApLFxuICAgICAgICAoZnJhZyAmJiBmcmFnLmNvbnRleHREZXApIHx8ICh2ZXJ0ICYmIHZlcnQuY29udGV4dERlcCksXG4gICAgICAgIChmcmFnICYmIGZyYWcucHJvcERlcCkgfHwgKHZlcnQgJiYgdmVydC5wcm9wRGVwKSxcbiAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICB2YXIgU0hBREVSX1NUQVRFID0gZW52LnNoYXJlZC5zaGFkZXJcbiAgICAgICAgICB2YXIgZnJhZ0lkXG4gICAgICAgICAgaWYgKGZyYWcpIHtcbiAgICAgICAgICAgIGZyYWdJZCA9IGZyYWcuYXBwZW5kKGVudiwgc2NvcGUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyYWdJZCA9IHNjb3BlLmRlZihTSEFERVJfU1RBVEUsICcuJywgU19GUkFHKVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgdmVydElkXG4gICAgICAgICAgaWYgKHZlcnQpIHtcbiAgICAgICAgICAgIHZlcnRJZCA9IHZlcnQuYXBwZW5kKGVudiwgc2NvcGUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZlcnRJZCA9IHNjb3BlLmRlZihTSEFERVJfU1RBVEUsICcuJywgU19WRVJUKVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcHJvZ0RlZiA9IFNIQURFUl9TVEFURSArICcucHJvZ3JhbSgnICsgdmVydElkICsgJywnICsgZnJhZ0lkXG4gICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBwcm9nRGVmICs9ICcsJyArIGVudi5jb21tYW5kXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm4gc2NvcGUuZGVmKHByb2dEZWYgKyAnKScpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZyYWc6IGZyYWcsXG4gICAgICB2ZXJ0OiB2ZXJ0LFxuICAgICAgcHJvZ1ZhcjogcHJvZ1ZhcixcbiAgICAgIHByb2dyYW06IHByb2dyYW1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZURyYXcgKG9wdGlvbnMsIGVudikge1xuICAgIHZhciBzdGF0aWNPcHRpb25zID0gb3B0aW9ucy5zdGF0aWNcbiAgICB2YXIgZHluYW1pY09wdGlvbnMgPSBvcHRpb25zLmR5bmFtaWNcblxuICAgIGZ1bmN0aW9uIHBhcnNlRWxlbWVudHMgKCkge1xuICAgICAgaWYgKFNfRUxFTUVOVFMgaW4gc3RhdGljT3B0aW9ucykge1xuICAgICAgICB2YXIgZWxlbWVudHMgPSBzdGF0aWNPcHRpb25zW1NfRUxFTUVOVFNdXG4gICAgICAgIGlmIChpc0J1ZmZlckFyZ3MoZWxlbWVudHMpKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBlbGVtZW50U3RhdGUuZ2V0RWxlbWVudHMoZWxlbWVudFN0YXRlLmNyZWF0ZShlbGVtZW50cywgdHJ1ZSkpXG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHMpIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGVsZW1lbnRTdGF0ZS5nZXRFbGVtZW50cyhlbGVtZW50cylcbiAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoZWxlbWVudHMsICdpbnZhbGlkIGVsZW1lbnRzJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudHMpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBlbnYubGluayhlbGVtZW50cylcbiAgICAgICAgICAgIGVudi5FTEVNRU5UUyA9IHJlc3VsdFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgIH1cbiAgICAgICAgICBlbnYuRUxFTUVOVFMgPSBudWxsXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSlcbiAgICAgICAgcmVzdWx0LnZhbHVlID0gZWxlbWVudHNcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfSBlbHNlIGlmIChTX0VMRU1FTlRTIGluIGR5bmFtaWNPcHRpb25zKSB7XG4gICAgICAgIHZhciBkeW4gPSBkeW5hbWljT3B0aW9uc1tTX0VMRU1FTlRTXVxuICAgICAgICByZXR1cm4gY3JlYXRlRHluYW1pY0RlY2woZHluLCBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG5cbiAgICAgICAgICB2YXIgSVNfQlVGRkVSX0FSR1MgPSBzaGFyZWQuaXNCdWZmZXJBcmdzXG4gICAgICAgICAgdmFyIEVMRU1FTlRfU1RBVEUgPSBzaGFyZWQuZWxlbWVudHNcblxuICAgICAgICAgIHZhciBlbGVtZW50RGVmbiA9IGVudi5pbnZva2Uoc2NvcGUsIGR5bilcbiAgICAgICAgICB2YXIgZWxlbWVudHMgPSBzY29wZS5kZWYoJ251bGwnKVxuICAgICAgICAgIHZhciBlbGVtZW50U3RyZWFtID0gc2NvcGUuZGVmKElTX0JVRkZFUl9BUkdTLCAnKCcsIGVsZW1lbnREZWZuLCAnKScpXG5cbiAgICAgICAgICB2YXIgaWZ0ZSA9IGVudi5jb25kKGVsZW1lbnRTdHJlYW0pXG4gICAgICAgICAgICAudGhlbihlbGVtZW50cywgJz0nLCBFTEVNRU5UX1NUQVRFLCAnLmNyZWF0ZVN0cmVhbSgnLCBlbGVtZW50RGVmbiwgJyk7JylcbiAgICAgICAgICAgIC5lbHNlKGVsZW1lbnRzLCAnPScsIEVMRU1FTlRfU1RBVEUsICcuZ2V0RWxlbWVudHMoJywgZWxlbWVudERlZm4sICcpOycpXG5cbiAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVudi5hc3NlcnQoaWZ0ZS5lbHNlLFxuICAgICAgICAgICAgICAnIScgKyBlbGVtZW50RGVmbiArICd8fCcgKyBlbGVtZW50cyxcbiAgICAgICAgICAgICAgJ2ludmFsaWQgZWxlbWVudHMnKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBzY29wZS5lbnRyeShpZnRlKVxuICAgICAgICAgIHNjb3BlLmV4aXQoXG4gICAgICAgICAgICBlbnYuY29uZChlbGVtZW50U3RyZWFtKVxuICAgICAgICAgICAgICAudGhlbihFTEVNRU5UX1NUQVRFLCAnLmRlc3Ryb3lTdHJlYW0oJywgZWxlbWVudHMsICcpOycpKVxuXG4gICAgICAgICAgZW52LkVMRU1FTlRTID0gZWxlbWVudHNcblxuICAgICAgICAgIHJldHVybiBlbGVtZW50c1xuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHZhciBlbGVtZW50cyA9IHBhcnNlRWxlbWVudHMoKVxuXG4gICAgZnVuY3Rpb24gcGFyc2VQcmltaXRpdmUgKCkge1xuICAgICAgaWYgKFNfUFJJTUlUSVZFIGluIHN0YXRpY09wdGlvbnMpIHtcbiAgICAgICAgdmFyIHByaW1pdGl2ZSA9IHN0YXRpY09wdGlvbnNbU19QUklNSVRJVkVdXG4gICAgICAgIGNoZWNrJDEuY29tbWFuZFBhcmFtZXRlcihwcmltaXRpdmUsIHByaW1UeXBlcywgJ2ludmFsaWQgcHJpbWl0dmUnLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICByZXR1cm4gcHJpbVR5cGVzW3ByaW1pdGl2ZV1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoU19QUklNSVRJVkUgaW4gZHluYW1pY09wdGlvbnMpIHtcbiAgICAgICAgdmFyIGR5blByaW1pdGl2ZSA9IGR5bmFtaWNPcHRpb25zW1NfUFJJTUlUSVZFXVxuICAgICAgICByZXR1cm4gY3JlYXRlRHluYW1pY0RlY2woZHluUHJpbWl0aXZlLCBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIHZhciBQUklNX1RZUEVTID0gZW52LmNvbnN0YW50cy5wcmltVHlwZXNcbiAgICAgICAgICB2YXIgcHJpbSA9IGVudi5pbnZva2Uoc2NvcGUsIGR5blByaW1pdGl2ZSlcbiAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgIHByaW0gKyAnIGluICcgKyBQUklNX1RZUEVTLFxuICAgICAgICAgICAgICAnaW52YWxpZCBwcmltaXRpdmUsIG11c3QgYmUgb25lIG9mICcgKyBPYmplY3Qua2V5cyhwcmltVHlwZXMpKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuIHNjb3BlLmRlZihQUklNX1RZUEVTLCAnWycsIHByaW0sICddJylcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHMpIHtcbiAgICAgICAgaWYgKGlzU3RhdGljKGVsZW1lbnRzKSkge1xuICAgICAgICAgIGlmIChlbGVtZW50cy52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmRlZihlbnYuRUxFTUVOVFMsICcucHJpbVR5cGUnKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gR0xfVFJJQU5HTEVTJDFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBuZXcgRGVjbGFyYXRpb24oXG4gICAgICAgICAgICBlbGVtZW50cy50aGlzRGVwLFxuICAgICAgICAgICAgZWxlbWVudHMuY29udGV4dERlcCxcbiAgICAgICAgICAgIGVsZW1lbnRzLnByb3BEZXAsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgICB2YXIgZWxlbWVudHMgPSBlbnYuRUxFTUVOVFNcbiAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmRlZihlbGVtZW50cywgJz8nLCBlbGVtZW50cywgJy5wcmltVHlwZTonLCBHTF9UUklBTkdMRVMkMSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VQYXJhbSAocGFyYW0sIGlzT2Zmc2V0KSB7XG4gICAgICBpZiAocGFyYW0gaW4gc3RhdGljT3B0aW9ucykge1xuICAgICAgICB2YXIgdmFsdWUgPSBzdGF0aWNPcHRpb25zW3BhcmFtXSB8IDBcbiAgICAgICAgY2hlY2skMS5jb21tYW5kKCFpc09mZnNldCB8fCB2YWx1ZSA+PSAwLCAnaW52YWxpZCAnICsgcGFyYW0sIGVudi5jb21tYW5kU3RyKVxuICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIGlmIChpc09mZnNldCkge1xuICAgICAgICAgICAgZW52Lk9GRlNFVCA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbiBkeW5hbWljT3B0aW9ucykge1xuICAgICAgICB2YXIgZHluVmFsdWUgPSBkeW5hbWljT3B0aW9uc1twYXJhbV1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR5bmFtaWNEZWNsKGR5blZhbHVlLCBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSBlbnYuaW52b2tlKHNjb3BlLCBkeW5WYWx1ZSlcbiAgICAgICAgICBpZiAoaXNPZmZzZXQpIHtcbiAgICAgICAgICAgIGVudi5PRkZTRVQgPSByZXN1bHRcbiAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgIHJlc3VsdCArICc+PTAnLFxuICAgICAgICAgICAgICAgICdpbnZhbGlkICcgKyBwYXJhbSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoaXNPZmZzZXQgJiYgZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICBlbnYuT0ZGU0VUID0gJzAnXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdmFyIE9GRlNFVCA9IHBhcnNlUGFyYW0oU19PRkZTRVQsIHRydWUpXG5cbiAgICBmdW5jdGlvbiBwYXJzZVZlcnRDb3VudCAoKSB7XG4gICAgICBpZiAoU19DT1VOVCBpbiBzdGF0aWNPcHRpb25zKSB7XG4gICAgICAgIHZhciBjb3VudCA9IHN0YXRpY09wdGlvbnNbU19DT1VOVF0gfCAwXG4gICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICB0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmIGNvdW50ID49IDAsICdpbnZhbGlkIHZlcnRleCBjb3VudCcsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvdW50XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKFNfQ09VTlQgaW4gZHluYW1pY09wdGlvbnMpIHtcbiAgICAgICAgdmFyIGR5bkNvdW50ID0gZHluYW1pY09wdGlvbnNbU19DT1VOVF1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR5bmFtaWNEZWNsKGR5bkNvdW50LCBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSBlbnYuaW52b2tlKHNjb3BlLCBkeW5Db3VudClcbiAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICd0eXBlb2YgJyArIHJlc3VsdCArICc9PT1cIm51bWJlclwiJiYnICtcbiAgICAgICAgICAgICAgcmVzdWx0ICsgJz49MCYmJyArXG4gICAgICAgICAgICAgIHJlc3VsdCArICc9PT0oJyArIHJlc3VsdCArICd8MCknLFxuICAgICAgICAgICAgICAnaW52YWxpZCB2ZXJ0ZXggY291bnQnKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChlbGVtZW50cykge1xuICAgICAgICBpZiAoaXNTdGF0aWMoZWxlbWVudHMpKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnRzKSB7XG4gICAgICAgICAgICBpZiAoT0ZGU0VUKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgRGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgICAgT0ZGU0VULnRoaXNEZXAsXG4gICAgICAgICAgICAgICAgT0ZGU0VULmNvbnRleHREZXAsXG4gICAgICAgICAgICAgICAgT0ZGU0VULnByb3BEZXAsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBzY29wZS5kZWYoXG4gICAgICAgICAgICAgICAgICAgIGVudi5FTEVNRU5UUywgJy52ZXJ0Q291bnQtJywgZW52Lk9GRlNFVClcblxuICAgICAgICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICsgJz49MCcsXG4gICAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgdmVydGV4IG9mZnNldC9lbGVtZW50IGJ1ZmZlciB0b28gc21hbGwnKVxuICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY29wZS5kZWYoZW52LkVMRU1FTlRTLCAnLnZlcnRDb3VudCcpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5NSVNTSU5HID0gdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHZhcmlhYmxlID0gbmV3IERlY2xhcmF0aW9uKFxuICAgICAgICAgICAgZWxlbWVudHMudGhpc0RlcCB8fCBPRkZTRVQudGhpc0RlcCxcbiAgICAgICAgICAgIGVsZW1lbnRzLmNvbnRleHREZXAgfHwgT0ZGU0VULmNvbnRleHREZXAsXG4gICAgICAgICAgICBlbGVtZW50cy5wcm9wRGVwIHx8IE9GRlNFVC5wcm9wRGVwLFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gZW52LkVMRU1FTlRTXG4gICAgICAgICAgICAgIGlmIChlbnYuT0ZGU0VUKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmRlZihlbGVtZW50cywgJz8nLCBlbGVtZW50cywgJy52ZXJ0Q291bnQtJyxcbiAgICAgICAgICAgICAgICAgIGVudi5PRkZTRVQsICc6LTEnKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBzY29wZS5kZWYoZWxlbWVudHMsICc/JywgZWxlbWVudHMsICcudmVydENvdW50Oi0xJylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXJpYWJsZS5EWU5BTUlDID0gdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuIHZhcmlhYmxlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBlbGVtZW50cyxcbiAgICAgIHByaW1pdGl2ZTogcGFyc2VQcmltaXRpdmUoKSxcbiAgICAgIGNvdW50OiBwYXJzZVZlcnRDb3VudCgpLFxuICAgICAgaW5zdGFuY2VzOiBwYXJzZVBhcmFtKFNfSU5TVEFOQ0VTLCBmYWxzZSksXG4gICAgICBvZmZzZXQ6IE9GRlNFVFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlR0xTdGF0ZSAob3B0aW9ucywgZW52KSB7XG4gICAgdmFyIHN0YXRpY09wdGlvbnMgPSBvcHRpb25zLnN0YXRpY1xuICAgIHZhciBkeW5hbWljT3B0aW9ucyA9IG9wdGlvbnMuZHluYW1pY1xuXG4gICAgdmFyIFNUQVRFID0ge31cblxuICAgIEdMX1NUQVRFX05BTUVTLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHZhciBwYXJhbSA9IHByb3BOYW1lKHByb3ApXG5cbiAgICAgIGZ1bmN0aW9uIHBhcnNlUGFyYW0gKHBhcnNlU3RhdGljLCBwYXJzZUR5bmFtaWMpIHtcbiAgICAgICAgaWYgKHByb3AgaW4gc3RhdGljT3B0aW9ucykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHBhcnNlU3RhdGljKHN0YXRpY09wdGlvbnNbcHJvcF0pXG4gICAgICAgICAgU1RBVEVbcGFyYW1dID0gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHByb3AgaW4gZHluYW1pY09wdGlvbnMpIHtcbiAgICAgICAgICB2YXIgZHluID0gZHluYW1pY09wdGlvbnNbcHJvcF1cbiAgICAgICAgICBTVEFURVtwYXJhbV0gPSBjcmVhdGVEeW5hbWljRGVjbChkeW4sIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VEeW5hbWljKGVudiwgc2NvcGUsIGVudi5pbnZva2Uoc2NvcGUsIGR5bikpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgY2FzZSBTX0NVTExfRU5BQkxFOlxuICAgICAgICBjYXNlIFNfQkxFTkRfRU5BQkxFOlxuICAgICAgICBjYXNlIFNfRElUSEVSOlxuICAgICAgICBjYXNlIFNfU1RFTkNJTF9FTkFCTEU6XG4gICAgICAgIGNhc2UgU19ERVBUSF9FTkFCTEU6XG4gICAgICAgIGNhc2UgU19TQ0lTU09SX0VOQUJMRTpcbiAgICAgICAgY2FzZSBTX1BPTFlHT05fT0ZGU0VUX0VOQUJMRTpcbiAgICAgICAgY2FzZSBTX1NBTVBMRV9BTFBIQTpcbiAgICAgICAgY2FzZSBTX1NBTVBMRV9FTkFCTEU6XG4gICAgICAgIGNhc2UgU19ERVBUSF9NQVNLOlxuICAgICAgICAgIHJldHVybiBwYXJzZVBhcmFtKFxuICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUodmFsdWUsICdib29sZWFuJywgcHJvcCwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgJ3R5cGVvZiAnICsgdmFsdWUgKyAnPT09XCJib29sZWFuXCInLFxuICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgZmxhZyAnICsgcHJvcCwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfREVQVEhfRlVOQzpcbiAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbShcbiAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIodmFsdWUsIGNvbXBhcmVGdW5jcywgJ2ludmFsaWQgJyArIHByb3AsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZUZ1bmNzW3ZhbHVlXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICB2YXIgQ09NUEFSRV9GVU5DUyA9IGVudi5jb25zdGFudHMuY29tcGFyZUZ1bmNzXG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArICcgaW4gJyArIENPTVBBUkVfRlVOQ1MsXG4gICAgICAgICAgICAgICAgICAnaW52YWxpZCAnICsgcHJvcCArICcsIG11c3QgYmUgb25lIG9mICcgKyBPYmplY3Qua2V5cyhjb21wYXJlRnVuY3MpKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXR1cm4gc2NvcGUuZGVmKENPTVBBUkVfRlVOQ1MsICdbJywgdmFsdWUsICddJylcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgY2FzZSBTX0RFUFRIX1JBTkdFOlxuICAgICAgICAgIHJldHVybiBwYXJzZVBhcmFtKFxuICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICBpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWVbMF0gPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlWzFdID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICAgIHZhbHVlWzBdIDw9IHZhbHVlWzFdLFxuICAgICAgICAgICAgICAgICdkZXB0aCByYW5nZSBpcyAyZCBhcnJheScsXG4gICAgICAgICAgICAgICAgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgZW52LnNoYXJlZC5pc0FycmF5TGlrZSArICcoJyArIHZhbHVlICsgJykmJicgK1xuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnLmxlbmd0aD09PTImJicgK1xuICAgICAgICAgICAgICAgICAgJ3R5cGVvZiAnICsgdmFsdWUgKyAnWzBdPT09XCJudW1iZXJcIiYmJyArXG4gICAgICAgICAgICAgICAgICAndHlwZW9mICcgKyB2YWx1ZSArICdbMV09PT1cIm51bWJlclwiJiYnICtcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJ1swXTw9JyArIHZhbHVlICsgJ1sxXScsXG4gICAgICAgICAgICAgICAgICAnZGVwdGggcmFuZ2UgbXVzdCBiZSBhIDJkIGFycmF5JylcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICB2YXIgWl9ORUFSID0gc2NvcGUuZGVmKCcrJywgdmFsdWUsICdbMF0nKVxuICAgICAgICAgICAgICB2YXIgWl9GQVIgPSBzY29wZS5kZWYoJysnLCB2YWx1ZSwgJ1sxXScpXG4gICAgICAgICAgICAgIHJldHVybiBbWl9ORUFSLCBaX0ZBUl1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgY2FzZSBTX0JMRU5EX0ZVTkM6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kVHlwZSh2YWx1ZSwgJ29iamVjdCcsICdibGVuZC5mdW5jJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHZhciBzcmNSR0IgPSAoJ3NyY1JHQicgaW4gdmFsdWUgPyB2YWx1ZS5zcmNSR0IgOiB2YWx1ZS5zcmMpXG4gICAgICAgICAgICAgIHZhciBzcmNBbHBoYSA9ICgnc3JjQWxwaGEnIGluIHZhbHVlID8gdmFsdWUuc3JjQWxwaGEgOiB2YWx1ZS5zcmMpXG4gICAgICAgICAgICAgIHZhciBkc3RSR0IgPSAoJ2RzdFJHQicgaW4gdmFsdWUgPyB2YWx1ZS5kc3RSR0IgOiB2YWx1ZS5kc3QpXG4gICAgICAgICAgICAgIHZhciBkc3RBbHBoYSA9ICgnZHN0QWxwaGEnIGluIHZhbHVlID8gdmFsdWUuZHN0QWxwaGEgOiB2YWx1ZS5kc3QpXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFBhcmFtZXRlcihzcmNSR0IsIGJsZW5kRnVuY3MsIHBhcmFtICsgJy5zcmNSR0InLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kUGFyYW1ldGVyKHNyY0FscGhhLCBibGVuZEZ1bmNzLCBwYXJhbSArICcuc3JjQWxwaGEnLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kUGFyYW1ldGVyKGRzdFJHQiwgYmxlbmRGdW5jcywgcGFyYW0gKyAnLmRzdFJHQicsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIoZHN0QWxwaGEsIGJsZW5kRnVuY3MsIHBhcmFtICsgJy5kc3RBbHBoYScsIGVudi5jb21tYW5kU3RyKVxuXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICAoaW52YWxpZEJsZW5kQ29tYmluYXRpb25zLmluZGV4T2Yoc3JjUkdCICsgJywgJyArIGRzdFJHQikgPT09IC0xKSxcbiAgICAgICAgICAgICAgICAndW5hbGxvd2VkIGJsZW5kaW5nIGNvbWJpbmF0aW9uIChzcmNSR0IsIGRzdFJHQikgPSAoJyArIHNyY1JHQiArICcsICcgKyBkc3RSR0IgKyAnKScsIGVudi5jb21tYW5kU3RyKVxuXG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgYmxlbmRGdW5jc1tzcmNSR0JdLFxuICAgICAgICAgICAgICAgIGJsZW5kRnVuY3NbZHN0UkdCXSxcbiAgICAgICAgICAgICAgICBibGVuZEZ1bmNzW3NyY0FscGhhXSxcbiAgICAgICAgICAgICAgICBibGVuZEZ1bmNzW2RzdEFscGhhXVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIHZhciBCTEVORF9GVU5DUyA9IGVudi5jb25zdGFudHMuYmxlbmRGdW5jc1xuXG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArICcmJnR5cGVvZiAnICsgdmFsdWUgKyAnPT09XCJvYmplY3RcIicsXG4gICAgICAgICAgICAgICAgICAnaW52YWxpZCBibGVuZCBmdW5jLCBtdXN0IGJlIGFuIG9iamVjdCcpXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgZnVuY3Rpb24gcmVhZCAocHJlZml4LCBzdWZmaXgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IHNjb3BlLmRlZihcbiAgICAgICAgICAgICAgICAgICdcIicsIHByZWZpeCwgc3VmZml4LCAnXCIgaW4gJywgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAnPycsIHZhbHVlLCAnLicsIHByZWZpeCwgc3VmZml4LFxuICAgICAgICAgICAgICAgICAgJzonLCB2YWx1ZSwgJy4nLCBwcmVmaXgpXG5cbiAgICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICAgIGZ1bmMgKyAnIGluICcgKyBCTEVORF9GVU5DUyxcbiAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgJyArIHByb3AgKyAnLicgKyBwcmVmaXggKyBzdWZmaXggKyAnLCBtdXN0IGJlIG9uZSBvZiAnICsgT2JqZWN0LmtleXMoYmxlbmRGdW5jcykpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgc3JjUkdCID0gcmVhZCgnc3JjJywgJ1JHQicpXG4gICAgICAgICAgICAgIHZhciBkc3RSR0IgPSByZWFkKCdkc3QnLCAnUkdCJylcblxuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgSU5WQUxJRF9CTEVORF9DT01CSU5BVElPTlMgPSBlbnYuY29uc3RhbnRzLmludmFsaWRCbGVuZENvbWJpbmF0aW9uc1xuXG4gICAgICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgICAgIElOVkFMSURfQkxFTkRfQ09NQklOQVRJT05TICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICcuaW5kZXhPZignICsgc3JjUkdCICsgJytcIiwgXCIrJyArIGRzdFJHQiArICcpID09PSAtMSAnLFxuICAgICAgICAgICAgICAgICAgJ3VuYWxsb3dlZCBibGVuZGluZyBjb21iaW5hdGlvbiBmb3IgKHNyY1JHQiwgZHN0UkdCKSdcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgdmFyIFNSQ19SR0IgPSBzY29wZS5kZWYoQkxFTkRfRlVOQ1MsICdbJywgc3JjUkdCLCAnXScpXG4gICAgICAgICAgICAgIHZhciBTUkNfQUxQSEEgPSBzY29wZS5kZWYoQkxFTkRfRlVOQ1MsICdbJywgcmVhZCgnc3JjJywgJ0FscGhhJyksICddJylcbiAgICAgICAgICAgICAgdmFyIERTVF9SR0IgPSBzY29wZS5kZWYoQkxFTkRfRlVOQ1MsICdbJywgZHN0UkdCLCAnXScpXG4gICAgICAgICAgICAgIHZhciBEU1RfQUxQSEEgPSBzY29wZS5kZWYoQkxFTkRfRlVOQ1MsICdbJywgcmVhZCgnZHN0JywgJ0FscGhhJyksICddJylcblxuICAgICAgICAgICAgICByZXR1cm4gW1NSQ19SR0IsIERTVF9SR0IsIFNSQ19BTFBIQSwgRFNUX0FMUEhBXVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfQkxFTkRfRVFVQVRJT046XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIodmFsdWUsIGJsZW5kRXF1YXRpb25zLCAnaW52YWxpZCAnICsgcHJvcCwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgIGJsZW5kRXF1YXRpb25zW3ZhbHVlXSxcbiAgICAgICAgICAgICAgICAgIGJsZW5kRXF1YXRpb25zW3ZhbHVlXVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kUGFyYW1ldGVyKFxuICAgICAgICAgICAgICAgICAgdmFsdWUucmdiLCBibGVuZEVxdWF0aW9ucywgcHJvcCArICcucmdiJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kUGFyYW1ldGVyKFxuICAgICAgICAgICAgICAgICAgdmFsdWUuYWxwaGEsIGJsZW5kRXF1YXRpb25zLCBwcm9wICsgJy5hbHBoYScsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICBibGVuZEVxdWF0aW9uc1t2YWx1ZS5yZ2JdLFxuICAgICAgICAgICAgICAgICAgYmxlbmRFcXVhdGlvbnNbdmFsdWUuYWxwaGFdXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFJhaXNlKCdpbnZhbGlkIGJsZW5kLmVxdWF0aW9uJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgdmFyIEJMRU5EX0VRVUFUSU9OUyA9IGVudi5jb25zdGFudHMuYmxlbmRFcXVhdGlvbnNcblxuICAgICAgICAgICAgICB2YXIgUkdCID0gc2NvcGUuZGVmKClcbiAgICAgICAgICAgICAgdmFyIEFMUEhBID0gc2NvcGUuZGVmKClcblxuICAgICAgICAgICAgICB2YXIgaWZ0ZSA9IGVudi5jb25kKCd0eXBlb2YgJywgdmFsdWUsICc9PT1cInN0cmluZ1wiJylcblxuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjaGVja1Byb3AgKGJsb2NrLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgZW52LmFzc2VydChibG9jayxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnIGluICcgKyBCTEVORF9FUVVBVElPTlMsXG4gICAgICAgICAgICAgICAgICAgICdpbnZhbGlkICcgKyBuYW1lICsgJywgbXVzdCBiZSBvbmUgb2YgJyArIE9iamVjdC5rZXlzKGJsZW5kRXF1YXRpb25zKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tQcm9wKGlmdGUudGhlbiwgcHJvcCwgdmFsdWUpXG5cbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KGlmdGUuZWxzZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJyYmdHlwZW9mICcgKyB2YWx1ZSArICc9PT1cIm9iamVjdFwiJyxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkICcgKyBwcm9wKVxuICAgICAgICAgICAgICAgIGNoZWNrUHJvcChpZnRlLmVsc2UsIHByb3AgKyAnLnJnYicsIHZhbHVlICsgJy5yZ2InKVxuICAgICAgICAgICAgICAgIGNoZWNrUHJvcChpZnRlLmVsc2UsIHByb3AgKyAnLmFscGhhJywgdmFsdWUgKyAnLmFscGhhJylcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBpZnRlLnRoZW4oXG4gICAgICAgICAgICAgICAgUkdCLCAnPScsIEFMUEhBLCAnPScsIEJMRU5EX0VRVUFUSU9OUywgJ1snLCB2YWx1ZSwgJ107JylcbiAgICAgICAgICAgICAgaWZ0ZS5lbHNlKFxuICAgICAgICAgICAgICAgIFJHQiwgJz0nLCBCTEVORF9FUVVBVElPTlMsICdbJywgdmFsdWUsICcucmdiXTsnLFxuICAgICAgICAgICAgICAgIEFMUEhBLCAnPScsIEJMRU5EX0VRVUFUSU9OUywgJ1snLCB2YWx1ZSwgJy5hbHBoYV07JylcblxuICAgICAgICAgICAgICBzY29wZShpZnRlKVxuXG4gICAgICAgICAgICAgIHJldHVybiBbUkdCLCBBTFBIQV1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgY2FzZSBTX0JMRU5EX0NPTE9SOlxuICAgICAgICAgIHJldHVybiBwYXJzZVBhcmFtKFxuICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICBpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZS5sZW5ndGggPT09IDQsXG4gICAgICAgICAgICAgICAgJ2JsZW5kLmNvbG9yIG11c3QgYmUgYSA0ZCBhcnJheScsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICByZXR1cm4gbG9vcCg0LCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgIHJldHVybiArdmFsdWVbaV1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgICAgIGVudi5zaGFyZWQuaXNBcnJheUxpa2UgKyAnKCcgKyB2YWx1ZSArICcpJiYnICtcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJy5sZW5ndGg9PT00JyxcbiAgICAgICAgICAgICAgICAgICdibGVuZC5jb2xvciBtdXN0IGJlIGEgNGQgYXJyYXknKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXR1cm4gbG9vcCg0LCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY29wZS5kZWYoJysnLCB2YWx1ZSwgJ1snLCBpLCAnXScpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGNhc2UgU19TVEVOQ0lMX01BU0s6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kVHlwZSh2YWx1ZSwgJ251bWJlcicsIHBhcmFtLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIHwgMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgJ3R5cGVvZiAnICsgdmFsdWUgKyAnPT09XCJudW1iZXJcIicsXG4gICAgICAgICAgICAgICAgICAnaW52YWxpZCBzdGVuY2lsLm1hc2snKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXR1cm4gc2NvcGUuZGVmKHZhbHVlLCAnfDAnKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfU1RFTkNJTF9GVU5DOlxuICAgICAgICAgIHJldHVybiBwYXJzZVBhcmFtKFxuICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUodmFsdWUsICdvYmplY3QnLCBwYXJhbSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHZhciBjbXAgPSB2YWx1ZS5jbXAgfHwgJ2tlZXAnXG4gICAgICAgICAgICAgIHZhciByZWYgPSB2YWx1ZS5yZWYgfHwgMFxuICAgICAgICAgICAgICB2YXIgbWFzayA9ICdtYXNrJyBpbiB2YWx1ZSA/IHZhbHVlLm1hc2sgOiAtMVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIoY21wLCBjb21wYXJlRnVuY3MsIHByb3AgKyAnLmNtcCcsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRUeXBlKHJlZiwgJ251bWJlcicsIHByb3AgKyAnLnJlZicsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRUeXBlKG1hc2ssICdudW1iZXInLCBwcm9wICsgJy5tYXNrJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgY29tcGFyZUZ1bmNzW2NtcF0sXG4gICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgIG1hc2tcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICB2YXIgQ09NUEFSRV9GVU5DUyA9IGVudi5jb25zdGFudHMuY29tcGFyZUZ1bmNzXG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFzc2VydCAoKSB7XG4gICAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKGFyZ3VtZW50cywgJycpLFxuICAgICAgICAgICAgICAgICAgICAnaW52YWxpZCBzdGVuY2lsLmZ1bmMnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc3NlcnQodmFsdWUgKyAnJiZ0eXBlb2YgJywgdmFsdWUsICc9PT1cIm9iamVjdFwiJylcbiAgICAgICAgICAgICAgICBhc3NlcnQoJyEoXCJjbXBcIiBpbiAnLCB2YWx1ZSwgJyl8fCgnLFxuICAgICAgICAgICAgICAgICAgdmFsdWUsICcuY21wIGluICcsIENPTVBBUkVfRlVOQ1MsICcpJylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgdmFyIGNtcCA9IHNjb3BlLmRlZihcbiAgICAgICAgICAgICAgICAnXCJjbXBcIiBpbiAnLCB2YWx1ZSxcbiAgICAgICAgICAgICAgICAnPycsIENPTVBBUkVfRlVOQ1MsICdbJywgdmFsdWUsICcuY21wXScsXG4gICAgICAgICAgICAgICAgJzonLCBHTF9LRUVQKVxuICAgICAgICAgICAgICB2YXIgcmVmID0gc2NvcGUuZGVmKHZhbHVlLCAnLnJlZnwwJylcbiAgICAgICAgICAgICAgdmFyIG1hc2sgPSBzY29wZS5kZWYoXG4gICAgICAgICAgICAgICAgJ1wibWFza1wiIGluICcsIHZhbHVlLFxuICAgICAgICAgICAgICAgICc/JywgdmFsdWUsICcubWFza3wwOi0xJylcbiAgICAgICAgICAgICAgcmV0dXJuIFtjbXAsIHJlZiwgbWFza11cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgY2FzZSBTX1NURU5DSUxfT1BGUk9OVDpcbiAgICAgICAgY2FzZSBTX1NURU5DSUxfT1BCQUNLOlxuICAgICAgICAgIHJldHVybiBwYXJzZVBhcmFtKFxuICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUodmFsdWUsICdvYmplY3QnLCBwYXJhbSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHZhciBmYWlsID0gdmFsdWUuZmFpbCB8fCAna2VlcCdcbiAgICAgICAgICAgICAgdmFyIHpmYWlsID0gdmFsdWUuemZhaWwgfHwgJ2tlZXAnXG4gICAgICAgICAgICAgIHZhciB6cGFzcyA9IHZhbHVlLnpwYXNzIHx8ICdrZWVwJ1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIoZmFpbCwgc3RlbmNpbE9wcywgcHJvcCArICcuZmFpbCcsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIoemZhaWwsIHN0ZW5jaWxPcHMsIHByb3AgKyAnLnpmYWlsJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFBhcmFtZXRlcih6cGFzcywgc3RlbmNpbE9wcywgcHJvcCArICcuenBhc3MnLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBwcm9wID09PSBTX1NURU5DSUxfT1BCQUNLID8gR0xfQkFDSyA6IEdMX0ZST05ULFxuICAgICAgICAgICAgICAgIHN0ZW5jaWxPcHNbZmFpbF0sXG4gICAgICAgICAgICAgICAgc3RlbmNpbE9wc1t6ZmFpbF0sXG4gICAgICAgICAgICAgICAgc3RlbmNpbE9wc1t6cGFzc11cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICB2YXIgU1RFTkNJTF9PUFMgPSBlbnYuY29uc3RhbnRzLnN0ZW5jaWxPcHNcblxuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnJiZ0eXBlb2YgJyArIHZhbHVlICsgJz09PVwib2JqZWN0XCInLFxuICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgJyArIHByb3ApXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgZnVuY3Rpb24gcmVhZCAobmFtZSkge1xuICAgICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgICAgICAgJyEoXCInICsgbmFtZSArICdcIiBpbiAnICsgdmFsdWUgKyAnKXx8JyArXG4gICAgICAgICAgICAgICAgICAgICcoJyArIHZhbHVlICsgJy4nICsgbmFtZSArICcgaW4gJyArIFNURU5DSUxfT1BTICsgJyknLFxuICAgICAgICAgICAgICAgICAgICAnaW52YWxpZCAnICsgcHJvcCArICcuJyArIG5hbWUgKyAnLCBtdXN0IGJlIG9uZSBvZiAnICsgT2JqZWN0LmtleXMoc3RlbmNpbE9wcykpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHJldHVybiBzY29wZS5kZWYoXG4gICAgICAgICAgICAgICAgICAnXCInLCBuYW1lLCAnXCIgaW4gJywgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAnPycsIFNURU5DSUxfT1BTLCAnWycsIHZhbHVlLCAnLicsIG5hbWUsICddOicsXG4gICAgICAgICAgICAgICAgICBHTF9LRUVQKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBwcm9wID09PSBTX1NURU5DSUxfT1BCQUNLID8gR0xfQkFDSyA6IEdMX0ZST05ULFxuICAgICAgICAgICAgICAgIHJlYWQoJ2ZhaWwnKSxcbiAgICAgICAgICAgICAgICByZWFkKCd6ZmFpbCcpLFxuICAgICAgICAgICAgICAgIHJlYWQoJ3pwYXNzJylcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfUE9MWUdPTl9PRkZTRVRfT0ZGU0VUOlxuICAgICAgICAgIHJldHVybiBwYXJzZVBhcmFtKFxuICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUodmFsdWUsICdvYmplY3QnLCBwYXJhbSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHZhciBmYWN0b3IgPSB2YWx1ZS5mYWN0b3IgfCAwXG4gICAgICAgICAgICAgIHZhciB1bml0cyA9IHZhbHVlLnVuaXRzIHwgMFxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRUeXBlKGZhY3RvciwgJ251bWJlcicsIHBhcmFtICsgJy5mYWN0b3InLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kVHlwZSh1bml0cywgJ251bWJlcicsIHBhcmFtICsgJy51bml0cycsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICByZXR1cm4gW2ZhY3RvciwgdW5pdHNdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArICcmJnR5cGVvZiAnICsgdmFsdWUgKyAnPT09XCJvYmplY3RcIicsXG4gICAgICAgICAgICAgICAgICAnaW52YWxpZCAnICsgcHJvcClcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICB2YXIgRkFDVE9SID0gc2NvcGUuZGVmKHZhbHVlLCAnLmZhY3RvcnwwJylcbiAgICAgICAgICAgICAgdmFyIFVOSVRTID0gc2NvcGUuZGVmKHZhbHVlLCAnLnVuaXRzfDAnKVxuXG4gICAgICAgICAgICAgIHJldHVybiBbRkFDVE9SLCBVTklUU11cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgY2FzZSBTX0NVTExfRkFDRTpcbiAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbShcbiAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICB2YXIgZmFjZSA9IDBcbiAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnZnJvbnQnKSB7XG4gICAgICAgICAgICAgICAgZmFjZSA9IEdMX0ZST05UXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdiYWNrJykge1xuICAgICAgICAgICAgICAgIGZhY2UgPSBHTF9CQUNLXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKCEhZmFjZSwgcGFyYW0sIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICByZXR1cm4gZmFjZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnPT09XCJmcm9udFwifHwnICtcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJz09PVwiYmFja1wiJyxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkIGN1bGwuZmFjZScpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiBzY29wZS5kZWYodmFsdWUsICc9PT1cImZyb250XCI/JywgR0xfRlJPTlQsICc6JywgR0xfQkFDSylcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgY2FzZSBTX0xJTkVfV0lEVEg6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZSA+PSBsaW1pdHMubGluZVdpZHRoRGltc1swXSAmJlxuICAgICAgICAgICAgICAgIHZhbHVlIDw9IGxpbWl0cy5saW5lV2lkdGhEaW1zWzFdLFxuICAgICAgICAgICAgICAgICdpbnZhbGlkIGxpbmUgd2lkdGgsIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgYmV0d2VlbiAnICtcbiAgICAgICAgICAgICAgICBsaW1pdHMubGluZVdpZHRoRGltc1swXSArICcgYW5kICcgKyBsaW1pdHMubGluZVdpZHRoRGltc1sxXSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgJ3R5cGVvZiAnICsgdmFsdWUgKyAnPT09XCJudW1iZXJcIiYmJyArXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArICc+PScgKyBsaW1pdHMubGluZVdpZHRoRGltc1swXSArICcmJicgK1xuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnPD0nICsgbGltaXRzLmxpbmVXaWR0aERpbXNbMV0sXG4gICAgICAgICAgICAgICAgICAnaW52YWxpZCBsaW5lIHdpZHRoJylcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgY2FzZSBTX0ZST05UX0ZBQ0U6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kUGFyYW1ldGVyKHZhbHVlLCBvcmllbnRhdGlvblR5cGUsIHBhcmFtLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgcmV0dXJuIG9yaWVudGF0aW9uVHlwZVt2YWx1ZV1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJz09PVwiY3dcInx8JyArXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArICc9PT1cImNjd1wiJyxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkIGZyb250RmFjZSwgbXVzdCBiZSBvbmUgb2YgY3csY2N3JylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmRlZih2YWx1ZSArICc9PT1cImN3XCI/JyArIEdMX0NXICsgJzonICsgR0xfQ0NXKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfQ09MT1JfTUFTSzpcbiAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbShcbiAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgaXNBcnJheUxpa2UodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gNCxcbiAgICAgICAgICAgICAgICAnY29sb3IubWFzayBtdXN0IGJlIGxlbmd0aCA0IGFycmF5JywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuICEhdiB9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgZW52LnNoYXJlZC5pc0FycmF5TGlrZSArICcoJyArIHZhbHVlICsgJykmJicgK1xuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnLmxlbmd0aD09PTQnLFxuICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgY29sb3IubWFzaycpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiBsb29wKDQsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICchIScgKyB2YWx1ZSArICdbJyArIGkgKyAnXSdcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgY2FzZSBTX1NBTVBMRV9DT1ZFUkFHRTpcbiAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbShcbiAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSwgcGFyYW0sIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICB2YXIgc2FtcGxlVmFsdWUgPSAndmFsdWUnIGluIHZhbHVlID8gdmFsdWUudmFsdWUgOiAxXG4gICAgICAgICAgICAgIHZhciBzYW1wbGVJbnZlcnQgPSAhIXZhbHVlLmludmVydFxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgdHlwZW9mIHNhbXBsZVZhbHVlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICAgIHNhbXBsZVZhbHVlID49IDAgJiYgc2FtcGxlVmFsdWUgPD0gMSxcbiAgICAgICAgICAgICAgICAnc2FtcGxlLmNvdmVyYWdlLnZhbHVlIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHJldHVybiBbc2FtcGxlVmFsdWUsIHNhbXBsZUludmVydF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJyYmdHlwZW9mICcgKyB2YWx1ZSArICc9PT1cIm9iamVjdFwiJyxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkIHNhbXBsZS5jb3ZlcmFnZScpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHZhciBWQUxVRSA9IHNjb3BlLmRlZihcbiAgICAgICAgICAgICAgICAnXCJ2YWx1ZVwiIGluICcsIHZhbHVlLCAnPysnLCB2YWx1ZSwgJy52YWx1ZToxJylcbiAgICAgICAgICAgICAgdmFyIElOVkVSVCA9IHNjb3BlLmRlZignISEnLCB2YWx1ZSwgJy5pbnZlcnQnKVxuICAgICAgICAgICAgICByZXR1cm4gW1ZBTFVFLCBJTlZFUlRdXG4gICAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gU1RBVEVcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlVW5pZm9ybXMgKHVuaWZvcm1zLCBlbnYpIHtcbiAgICB2YXIgc3RhdGljVW5pZm9ybXMgPSB1bmlmb3Jtcy5zdGF0aWNcbiAgICB2YXIgZHluYW1pY1VuaWZvcm1zID0gdW5pZm9ybXMuZHluYW1pY1xuXG4gICAgdmFyIFVOSUZPUk1TID0ge31cblxuICAgIE9iamVjdC5rZXlzKHN0YXRpY1VuaWZvcm1zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBzdGF0aWNVbmlmb3Jtc1tuYW1lXVxuICAgICAgdmFyIHJlc3VsdFxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciByZWdsVHlwZSA9IHZhbHVlLl9yZWdsVHlwZVxuICAgICAgICBpZiAocmVnbFR5cGUgPT09ICd0ZXh0dXJlMmQnIHx8XG4gICAgICAgICAgICByZWdsVHlwZSA9PT0gJ3RleHR1cmVDdWJlJykge1xuICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKGVudikge1xuICAgICAgICAgICAgcmV0dXJuIGVudi5saW5rKHZhbHVlKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocmVnbFR5cGUgPT09ICdmcmFtZWJ1ZmZlcicgfHxcbiAgICAgICAgICAgICAgICAgICByZWdsVHlwZSA9PT0gJ2ZyYW1lYnVmZmVyQ3ViZScpIHtcbiAgICAgICAgICBjaGVjayQxLmNvbW1hbmQodmFsdWUuY29sb3IubGVuZ3RoID4gMCxcbiAgICAgICAgICAgICdtaXNzaW5nIGNvbG9yIGF0dGFjaG1lbnQgZm9yIGZyYW1lYnVmZmVyIHNlbnQgdG8gdW5pZm9ybSBcIicgKyBuYW1lICsgJ1wiJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgcmVzdWx0ID0gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgICAgICByZXR1cm4gZW52LmxpbmsodmFsdWUuY29sb3JbMF0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGVjayQxLmNvbW1hbmRSYWlzZSgnaW52YWxpZCBkYXRhIGZvciB1bmlmb3JtIFwiJyArIG5hbWUgKyAnXCInLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgICAgdmFyIElURU0gPSBlbnYuZ2xvYmFsLmRlZignWycsXG4gICAgICAgICAgICBsb29wKHZhbHVlLmxlbmd0aCwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZVtpXSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWVbaV0gPT09ICdib29sZWFuJyxcbiAgICAgICAgICAgICAgICAnaW52YWxpZCB1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW2ldXG4gICAgICAgICAgICB9KSwgJ10nKVxuICAgICAgICAgIHJldHVybiBJVEVNXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVjayQxLmNvbW1hbmRSYWlzZSgnaW52YWxpZCBvciBtaXNzaW5nIGRhdGEgZm9yIHVuaWZvcm0gXCInICsgbmFtZSArICdcIicsIGVudi5jb21tYW5kU3RyKVxuICAgICAgfVxuICAgICAgcmVzdWx0LnZhbHVlID0gdmFsdWVcbiAgICAgIFVOSUZPUk1TW25hbWVdID0gcmVzdWx0XG4gICAgfSlcblxuICAgIE9iamVjdC5rZXlzKGR5bmFtaWNVbmlmb3JtcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgZHluID0gZHluYW1pY1VuaWZvcm1zW2tleV1cbiAgICAgIFVOSUZPUk1TW2tleV0gPSBjcmVhdGVEeW5hbWljRGVjbChkeW4sIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBlbnYuaW52b2tlKHNjb3BlLCBkeW4pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4gVU5JRk9STVNcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyAoYXR0cmlidXRlcywgZW52KSB7XG4gICAgdmFyIHN0YXRpY0F0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLnN0YXRpY1xuICAgIHZhciBkeW5hbWljQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuZHluYW1pY1xuXG4gICAgdmFyIGF0dHJpYnV0ZURlZnMgPSB7fVxuXG4gICAgT2JqZWN0LmtleXMoc3RhdGljQXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICB2YXIgdmFsdWUgPSBzdGF0aWNBdHRyaWJ1dGVzW2F0dHJpYnV0ZV1cbiAgICAgIHZhciBpZCA9IHN0cmluZ1N0b3JlLmlkKGF0dHJpYnV0ZSlcblxuICAgICAgdmFyIHJlY29yZCA9IG5ldyBBdHRyaWJ1dGVSZWNvcmQoKVxuICAgICAgaWYgKGlzQnVmZmVyQXJncyh2YWx1ZSkpIHtcbiAgICAgICAgcmVjb3JkLnN0YXRlID0gQVRUUklCX1NUQVRFX1BPSU5URVJcbiAgICAgICAgcmVjb3JkLmJ1ZmZlciA9IGJ1ZmZlclN0YXRlLmdldEJ1ZmZlcihcbiAgICAgICAgICBidWZmZXJTdGF0ZS5jcmVhdGUodmFsdWUsIEdMX0FSUkFZX0JVRkZFUiQyLCBmYWxzZSwgdHJ1ZSkpXG4gICAgICAgIHJlY29yZC50eXBlID0gMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IGJ1ZmZlclN0YXRlLmdldEJ1ZmZlcih2YWx1ZSlcbiAgICAgICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICAgIHJlY29yZC5zdGF0ZSA9IEFUVFJJQl9TVEFURV9QT0lOVEVSXG4gICAgICAgICAgcmVjb3JkLmJ1ZmZlciA9IGJ1ZmZlclxuICAgICAgICAgIHJlY29yZC50eXBlID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoZWNrJDEuY29tbWFuZCh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLFxuICAgICAgICAgICAgJ2ludmFsaWQgZGF0YSBmb3IgYXR0cmlidXRlICcgKyBhdHRyaWJ1dGUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgIGlmICgnY29uc3RhbnQnIGluIHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgY29uc3RhbnQgPSB2YWx1ZS5jb25zdGFudFxuICAgICAgICAgICAgcmVjb3JkLmJ1ZmZlciA9ICdudWxsJ1xuICAgICAgICAgICAgcmVjb3JkLnN0YXRlID0gQVRUUklCX1NUQVRFX0NPTlNUQU5UXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnN0YW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICByZWNvcmQueCA9IGNvbnN0YW50XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgaXNBcnJheUxpa2UoY29uc3RhbnQpICYmXG4gICAgICAgICAgICAgICAgY29uc3RhbnQubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgIGNvbnN0YW50Lmxlbmd0aCA8PSA0LFxuICAgICAgICAgICAgICAgICdpbnZhbGlkIGNvbnN0YW50IGZvciBhdHRyaWJ1dGUgJyArIGF0dHJpYnV0ZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIENVVEVfQ09NUE9ORU5UUy5mb3JFYWNoKGZ1bmN0aW9uIChjLCBpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBjb25zdGFudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHJlY29yZFtjXSA9IGNvbnN0YW50W2ldXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNCdWZmZXJBcmdzKHZhbHVlLmJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyU3RhdGUuZ2V0QnVmZmVyKFxuICAgICAgICAgICAgICAgIGJ1ZmZlclN0YXRlLmNyZWF0ZSh2YWx1ZS5idWZmZXIsIEdMX0FSUkFZX0JVRkZFUiQyLCBmYWxzZSwgdHJ1ZSkpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXJTdGF0ZS5nZXRCdWZmZXIodmFsdWUuYnVmZmVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKCEhYnVmZmVyLCAnbWlzc2luZyBidWZmZXIgZm9yIGF0dHJpYnV0ZSBcIicgKyBhdHRyaWJ1dGUgKyAnXCInLCBlbnYuY29tbWFuZFN0cilcblxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHZhbHVlLm9mZnNldCB8IDBcbiAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChvZmZzZXQgPj0gMCxcbiAgICAgICAgICAgICAgJ2ludmFsaWQgb2Zmc2V0IGZvciBhdHRyaWJ1dGUgXCInICsgYXR0cmlidXRlICsgJ1wiJywgZW52LmNvbW1hbmRTdHIpXG5cbiAgICAgICAgICAgIHZhciBzdHJpZGUgPSB2YWx1ZS5zdHJpZGUgfCAwXG4gICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoc3RyaWRlID49IDAgJiYgc3RyaWRlIDwgMjU2LFxuICAgICAgICAgICAgICAnaW52YWxpZCBzdHJpZGUgZm9yIGF0dHJpYnV0ZSBcIicgKyBhdHRyaWJ1dGUgKyAnXCIsIG11c3QgYmUgaW50ZWdlciBiZXR3ZWVlbiBbMCwgMjU1XScsIGVudi5jb21tYW5kU3RyKVxuXG4gICAgICAgICAgICB2YXIgc2l6ZSA9IHZhbHVlLnNpemUgfCAwXG4gICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoISgnc2l6ZScgaW4gdmFsdWUpIHx8IChzaXplID4gMCAmJiBzaXplIDw9IDQpLFxuICAgICAgICAgICAgICAnaW52YWxpZCBzaXplIGZvciBhdHRyaWJ1dGUgXCInICsgYXR0cmlidXRlICsgJ1wiLCBtdXN0IGJlIDEsMiwzLDQnLCBlbnYuY29tbWFuZFN0cilcblxuICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWQgPSAhIXZhbHVlLm5vcm1hbGl6ZWRcblxuICAgICAgICAgICAgdmFyIHR5cGUgPSAwXG4gICAgICAgICAgICBpZiAoJ3R5cGUnIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFBhcmFtZXRlcihcbiAgICAgICAgICAgICAgICB2YWx1ZS50eXBlLCBnbFR5cGVzLFxuICAgICAgICAgICAgICAgICdpbnZhbGlkIHR5cGUgZm9yIGF0dHJpYnV0ZSAnICsgYXR0cmlidXRlLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgdHlwZSA9IGdsVHlwZXNbdmFsdWUudHlwZV1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGRpdmlzb3IgPSB2YWx1ZS5kaXZpc29yIHwgMFxuICAgICAgICAgICAgaWYgKCdkaXZpc29yJyBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoZGl2aXNvciA9PT0gMCB8fCBleHRJbnN0YW5jaW5nLFxuICAgICAgICAgICAgICAgICdjYW5ub3Qgc3BlY2lmeSBkaXZpc29yIGZvciBhdHRyaWJ1dGUgXCInICsgYXR0cmlidXRlICsgJ1wiLCBpbnN0YW5jaW5nIG5vdCBzdXBwb3J0ZWQnLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKGRpdmlzb3IgPj0gMCxcbiAgICAgICAgICAgICAgICAnaW52YWxpZCBkaXZpc29yIGZvciBhdHRyaWJ1dGUgXCInICsgYXR0cmlidXRlICsgJ1wiJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgY29tbWFuZCA9IGVudi5jb21tYW5kU3RyXG5cbiAgICAgICAgICAgICAgdmFyIFZBTElEX0tFWVMgPSBbXG4gICAgICAgICAgICAgICAgJ2J1ZmZlcicsXG4gICAgICAgICAgICAgICAgJ29mZnNldCcsXG4gICAgICAgICAgICAgICAgJ2Rpdmlzb3InLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJyxcbiAgICAgICAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgICAgICAgJ3NpemUnLFxuICAgICAgICAgICAgICAgICdzdHJpZGUnXG4gICAgICAgICAgICAgIF1cblxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICAgIFZBTElEX0tFWVMuaW5kZXhPZihwcm9wKSA+PSAwLFxuICAgICAgICAgICAgICAgICAgJ3Vua25vd24gcGFyYW1ldGVyIFwiJyArIHByb3AgKyAnXCIgZm9yIGF0dHJpYnV0ZSBwb2ludGVyIFwiJyArIGF0dHJpYnV0ZSArICdcIiAodmFsaWQgcGFyYW1ldGVycyBhcmUgJyArIFZBTElEX0tFWVMgKyAnKScsXG4gICAgICAgICAgICAgICAgICBjb21tYW5kKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgcmVjb3JkLmJ1ZmZlciA9IGJ1ZmZlclxuICAgICAgICAgICAgcmVjb3JkLnN0YXRlID0gQVRUUklCX1NUQVRFX1BPSU5URVJcbiAgICAgICAgICAgIHJlY29yZC5zaXplID0gc2l6ZVxuICAgICAgICAgICAgcmVjb3JkLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkXG4gICAgICAgICAgICByZWNvcmQudHlwZSA9IHR5cGUgfHwgYnVmZmVyLmR0eXBlXG4gICAgICAgICAgICByZWNvcmQub2Zmc2V0ID0gb2Zmc2V0XG4gICAgICAgICAgICByZWNvcmQuc3RyaWRlID0gc3RyaWRlXG4gICAgICAgICAgICByZWNvcmQuZGl2aXNvciA9IGRpdmlzb3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXR0cmlidXRlRGVmc1thdHRyaWJ1dGVdID0gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICB2YXIgY2FjaGUgPSBlbnYuYXR0cmliQ2FjaGVcbiAgICAgICAgaWYgKGlkIGluIGNhY2hlKSB7XG4gICAgICAgICAgcmV0dXJuIGNhY2hlW2lkXVxuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgICAgaXNTdHJlYW06IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmtleXMocmVjb3JkKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHJlY29yZFtrZXldXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChyZWNvcmQuYnVmZmVyKSB7XG4gICAgICAgICAgcmVzdWx0LmJ1ZmZlciA9IGVudi5saW5rKHJlY29yZC5idWZmZXIpXG4gICAgICAgICAgcmVzdWx0LnR5cGUgPSByZXN1bHQudHlwZSB8fCAocmVzdWx0LmJ1ZmZlciArICcuZHR5cGUnKVxuICAgICAgICB9XG4gICAgICAgIGNhY2hlW2lkXSA9IHJlc3VsdFxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBPYmplY3Qua2V5cyhkeW5hbWljQXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICB2YXIgZHluID0gZHluYW1pY0F0dHJpYnV0ZXNbYXR0cmlidXRlXVxuXG4gICAgICBmdW5jdGlvbiBhcHBlbmRBdHRyaWJ1dGVDb2RlIChlbnYsIGJsb2NrKSB7XG4gICAgICAgIHZhciBWQUxVRSA9IGVudi5pbnZva2UoYmxvY2ssIGR5bilcblxuICAgICAgICB2YXIgc2hhcmVkID0gZW52LnNoYXJlZFxuICAgICAgICB2YXIgY29uc3RhbnRzID0gZW52LmNvbnN0YW50c1xuXG4gICAgICAgIHZhciBJU19CVUZGRVJfQVJHUyA9IHNoYXJlZC5pc0J1ZmZlckFyZ3NcbiAgICAgICAgdmFyIEJVRkZFUl9TVEFURSA9IHNoYXJlZC5idWZmZXJcblxuICAgICAgICAvLyBQZXJmb3JtIHZhbGlkYXRpb24gb24gYXR0cmlidXRlXG4gICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGVudi5hc3NlcnQoYmxvY2ssXG4gICAgICAgICAgICBWQUxVRSArICcmJih0eXBlb2YgJyArIFZBTFVFICsgJz09PVwib2JqZWN0XCJ8fHR5cGVvZiAnICtcbiAgICAgICAgICAgIFZBTFVFICsgJz09PVwiZnVuY3Rpb25cIikmJignICtcbiAgICAgICAgICAgIElTX0JVRkZFUl9BUkdTICsgJygnICsgVkFMVUUgKyAnKXx8JyArXG4gICAgICAgICAgICBCVUZGRVJfU1RBVEUgKyAnLmdldEJ1ZmZlcignICsgVkFMVUUgKyAnKXx8JyArXG4gICAgICAgICAgICBCVUZGRVJfU1RBVEUgKyAnLmdldEJ1ZmZlcignICsgVkFMVUUgKyAnLmJ1ZmZlcil8fCcgK1xuICAgICAgICAgICAgSVNfQlVGRkVSX0FSR1MgKyAnKCcgKyBWQUxVRSArICcuYnVmZmVyKXx8JyArXG4gICAgICAgICAgICAnKFwiY29uc3RhbnRcIiBpbiAnICsgVkFMVUUgK1xuICAgICAgICAgICAgJyYmKHR5cGVvZiAnICsgVkFMVUUgKyAnLmNvbnN0YW50PT09XCJudW1iZXJcInx8JyArXG4gICAgICAgICAgICBzaGFyZWQuaXNBcnJheUxpa2UgKyAnKCcgKyBWQUxVRSArICcuY29uc3RhbnQpKSkpJyxcbiAgICAgICAgICAgICdpbnZhbGlkIGR5bmFtaWMgYXR0cmlidXRlIFwiJyArIGF0dHJpYnV0ZSArICdcIicpXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gYWxsb2NhdGUgbmFtZXMgZm9yIHJlc3VsdFxuICAgICAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICAgIGlzU3RyZWFtOiBibG9jay5kZWYoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlZmF1bHRSZWNvcmQgPSBuZXcgQXR0cmlidXRlUmVjb3JkKClcbiAgICAgICAgZGVmYXVsdFJlY29yZC5zdGF0ZSA9IEFUVFJJQl9TVEFURV9QT0lOVEVSXG4gICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRSZWNvcmQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gYmxvY2suZGVmKCcnICsgZGVmYXVsdFJlY29yZFtrZXldKVxuICAgICAgICB9KVxuXG4gICAgICAgIHZhciBCVUZGRVIgPSByZXN1bHQuYnVmZmVyXG4gICAgICAgIHZhciBUWVBFID0gcmVzdWx0LnR5cGVcbiAgICAgICAgYmxvY2soXG4gICAgICAgICAgJ2lmKCcsIElTX0JVRkZFUl9BUkdTLCAnKCcsIFZBTFVFLCAnKSl7JyxcbiAgICAgICAgICByZXN1bHQuaXNTdHJlYW0sICc9dHJ1ZTsnLFxuICAgICAgICAgIEJVRkZFUiwgJz0nLCBCVUZGRVJfU1RBVEUsICcuY3JlYXRlU3RyZWFtKCcsIEdMX0FSUkFZX0JVRkZFUiQyLCAnLCcsIFZBTFVFLCAnKTsnLFxuICAgICAgICAgIFRZUEUsICc9JywgQlVGRkVSLCAnLmR0eXBlOycsXG4gICAgICAgICAgJ31lbHNleycsXG4gICAgICAgICAgQlVGRkVSLCAnPScsIEJVRkZFUl9TVEFURSwgJy5nZXRCdWZmZXIoJywgVkFMVUUsICcpOycsXG4gICAgICAgICAgJ2lmKCcsIEJVRkZFUiwgJyl7JyxcbiAgICAgICAgICBUWVBFLCAnPScsIEJVRkZFUiwgJy5kdHlwZTsnLFxuICAgICAgICAgICd9ZWxzZSBpZihcImNvbnN0YW50XCIgaW4gJywgVkFMVUUsICcpeycsXG4gICAgICAgICAgcmVzdWx0LnN0YXRlLCAnPScsIEFUVFJJQl9TVEFURV9DT05TVEFOVCwgJzsnLFxuICAgICAgICAgICdpZih0eXBlb2YgJyArIFZBTFVFICsgJy5jb25zdGFudCA9PT0gXCJudW1iZXJcIil7JyxcbiAgICAgICAgICByZXN1bHRbQ1VURV9DT01QT05FTlRTWzBdXSwgJz0nLCBWQUxVRSwgJy5jb25zdGFudDsnLFxuICAgICAgICAgIENVVEVfQ09NUE9ORU5UUy5zbGljZSgxKS5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRbbl1cbiAgICAgICAgICB9KS5qb2luKCc9JyksICc9MDsnLFxuICAgICAgICAgICd9ZWxzZXsnLFxuICAgICAgICAgIENVVEVfQ09NUE9ORU5UUy5tYXAoZnVuY3Rpb24gKG5hbWUsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSArICc9JyArIFZBTFVFICsgJy5jb25zdGFudC5sZW5ndGg+JyArIGkgK1xuICAgICAgICAgICAgICAnPycgKyBWQUxVRSArICcuY29uc3RhbnRbJyArIGkgKyAnXTowOydcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KS5qb2luKCcnKSxcbiAgICAgICAgICAnfX1lbHNleycsXG4gICAgICAgICAgJ2lmKCcsIElTX0JVRkZFUl9BUkdTLCAnKCcsIFZBTFVFLCAnLmJ1ZmZlcikpeycsXG4gICAgICAgICAgQlVGRkVSLCAnPScsIEJVRkZFUl9TVEFURSwgJy5jcmVhdGVTdHJlYW0oJywgR0xfQVJSQVlfQlVGRkVSJDIsICcsJywgVkFMVUUsICcuYnVmZmVyKTsnLFxuICAgICAgICAgICd9ZWxzZXsnLFxuICAgICAgICAgIEJVRkZFUiwgJz0nLCBCVUZGRVJfU1RBVEUsICcuZ2V0QnVmZmVyKCcsIFZBTFVFLCAnLmJ1ZmZlcik7JyxcbiAgICAgICAgICAnfScsXG4gICAgICAgICAgVFlQRSwgJz1cInR5cGVcIiBpbiAnLCBWQUxVRSwgJz8nLFxuICAgICAgICAgIGNvbnN0YW50cy5nbFR5cGVzLCAnWycsIFZBTFVFLCAnLnR5cGVdOicsIEJVRkZFUiwgJy5kdHlwZTsnLFxuICAgICAgICAgIHJlc3VsdC5ub3JtYWxpemVkLCAnPSEhJywgVkFMVUUsICcubm9ybWFsaXplZDsnKVxuICAgICAgICBmdW5jdGlvbiBlbWl0UmVhZFJlY29yZCAobmFtZSkge1xuICAgICAgICAgIGJsb2NrKHJlc3VsdFtuYW1lXSwgJz0nLCBWQUxVRSwgJy4nLCBuYW1lLCAnfDA7JylcbiAgICAgICAgfVxuICAgICAgICBlbWl0UmVhZFJlY29yZCgnc2l6ZScpXG4gICAgICAgIGVtaXRSZWFkUmVjb3JkKCdvZmZzZXQnKVxuICAgICAgICBlbWl0UmVhZFJlY29yZCgnc3RyaWRlJylcbiAgICAgICAgZW1pdFJlYWRSZWNvcmQoJ2Rpdmlzb3InKVxuXG4gICAgICAgIGJsb2NrKCd9fScpXG5cbiAgICAgICAgYmxvY2suZXhpdChcbiAgICAgICAgICAnaWYoJywgcmVzdWx0LmlzU3RyZWFtLCAnKXsnLFxuICAgICAgICAgIEJVRkZFUl9TVEFURSwgJy5kZXN0cm95U3RyZWFtKCcsIEJVRkZFUiwgJyk7JyxcbiAgICAgICAgICAnfScpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuXG4gICAgICBhdHRyaWJ1dGVEZWZzW2F0dHJpYnV0ZV0gPSBjcmVhdGVEeW5hbWljRGVjbChkeW4sIGFwcGVuZEF0dHJpYnV0ZUNvZGUpXG4gICAgfSlcblxuICAgIHJldHVybiBhdHRyaWJ1dGVEZWZzXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVZBTyAob3B0aW9ucywgZW52KSB7XG4gICAgdmFyIHN0YXRpY09wdGlvbnMgPSBvcHRpb25zLnN0YXRpY1xuICAgIHZhciBkeW5hbWljT3B0aW9ucyA9IG9wdGlvbnMuZHluYW1pY1xuICAgIGlmIChTX1ZBTyBpbiBzdGF0aWNPcHRpb25zKSB7XG4gICAgICB2YXIgdmFvID0gc3RhdGljT3B0aW9uc1tTX1ZBT11cbiAgICAgIGlmICh2YW8gIT09IG51bGwgJiYgYXR0cmlidXRlU3RhdGUuZ2V0VkFPKHZhbykgPT09IG51bGwpIHtcbiAgICAgICAgdmFvID0gYXR0cmlidXRlU3RhdGUuY3JlYXRlVkFPKHZhbylcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgcmV0dXJuIGVudi5saW5rKGF0dHJpYnV0ZVN0YXRlLmdldFZBTyh2YW8pKVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKFNfVkFPIGluIGR5bmFtaWNPcHRpb25zKSB7XG4gICAgICB2YXIgZHluID0gZHluYW1pY09wdGlvbnNbU19WQU9dXG4gICAgICByZXR1cm4gY3JlYXRlRHluYW1pY0RlY2woZHluLCBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICB2YXIgdmFvUmVmID0gZW52Lmludm9rZShzY29wZSwgZHluKVxuICAgICAgICByZXR1cm4gc2NvcGUuZGVmKGVudi5zaGFyZWQudmFvICsgJy5nZXRWQU8oJyArIHZhb1JlZiArICcpJylcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNvbnRleHQgKGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGljQ29udGV4dCA9IGNvbnRleHQuc3RhdGljXG4gICAgdmFyIGR5bmFtaWNDb250ZXh0ID0gY29udGV4dC5keW5hbWljXG4gICAgdmFyIHJlc3VsdCA9IHt9XG5cbiAgICBPYmplY3Qua2V5cyhzdGF0aWNDb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBzdGF0aWNDb250ZXh0W25hbWVdXG4gICAgICByZXN1bHRbbmFtZV0gPSBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgcmV0dXJuICcnICsgdmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZW52LmxpbmsodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIE9iamVjdC5rZXlzKGR5bmFtaWNDb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgZHluID0gZHluYW1pY0NvbnRleHRbbmFtZV1cbiAgICAgIHJlc3VsdFtuYW1lXSA9IGNyZWF0ZUR5bmFtaWNEZWNsKGR5biwgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIGVudi5pbnZva2Uoc2NvcGUsIGR5bilcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlQXJndW1lbnRzIChvcHRpb25zLCBhdHRyaWJ1dGVzLCB1bmlmb3JtcywgY29udGV4dCwgZW52KSB7XG4gICAgdmFyIHN0YXRpY09wdGlvbnMgPSBvcHRpb25zLnN0YXRpY1xuICAgIHZhciBkeW5hbWljT3B0aW9ucyA9IG9wdGlvbnMuZHluYW1pY1xuXG4gICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgS0VZX05BTUVTID0gW1xuICAgICAgICBTX0ZSQU1FQlVGRkVSLFxuICAgICAgICBTX1ZFUlQsXG4gICAgICAgIFNfRlJBRyxcbiAgICAgICAgU19FTEVNRU5UUyxcbiAgICAgICAgU19QUklNSVRJVkUsXG4gICAgICAgIFNfT0ZGU0VULFxuICAgICAgICBTX0NPVU5ULFxuICAgICAgICBTX0lOU1RBTkNFUyxcbiAgICAgICAgU19QUk9GSUxFLFxuICAgICAgICBTX1ZBT1xuICAgICAgXS5jb25jYXQoR0xfU1RBVEVfTkFNRVMpXG5cbiAgICAgIGZ1bmN0aW9uIGNoZWNrS2V5cyAoZGljdCkge1xuICAgICAgICBPYmplY3Qua2V5cyhkaWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICBLRVlfTkFNRVMuaW5kZXhPZihrZXkpID49IDAsXG4gICAgICAgICAgICAndW5rbm93biBwYXJhbWV0ZXIgXCInICsga2V5ICsgJ1wiJyxcbiAgICAgICAgICAgIGVudi5jb21tYW5kU3RyKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjaGVja0tleXMoc3RhdGljT3B0aW9ucylcbiAgICAgIGNoZWNrS2V5cyhkeW5hbWljT3B0aW9ucylcbiAgICB9KVxuXG4gICAgdmFyIGF0dHJpYkxvY2F0aW9ucyA9IHBhcnNlQXR0cmliTG9jYXRpb25zKG9wdGlvbnMsIGF0dHJpYnV0ZXMpXG5cbiAgICB2YXIgZnJhbWVidWZmZXIgPSBwYXJzZUZyYW1lYnVmZmVyKG9wdGlvbnMsIGVudilcbiAgICB2YXIgdmlld3BvcnRBbmRTY2lzc29yID0gcGFyc2VWaWV3cG9ydFNjaXNzb3Iob3B0aW9ucywgZnJhbWVidWZmZXIsIGVudilcbiAgICB2YXIgZHJhdyA9IHBhcnNlRHJhdyhvcHRpb25zLCBlbnYpXG4gICAgdmFyIHN0YXRlID0gcGFyc2VHTFN0YXRlKG9wdGlvbnMsIGVudilcbiAgICB2YXIgc2hhZGVyID0gcGFyc2VQcm9ncmFtKG9wdGlvbnMsIGVudiwgYXR0cmliTG9jYXRpb25zKVxuXG4gICAgZnVuY3Rpb24gY29weUJveCAobmFtZSkge1xuICAgICAgdmFyIGRlZm4gPSB2aWV3cG9ydEFuZFNjaXNzb3JbbmFtZV1cbiAgICAgIGlmIChkZWZuKSB7XG4gICAgICAgIHN0YXRlW25hbWVdID0gZGVmblxuICAgICAgfVxuICAgIH1cbiAgICBjb3B5Qm94KFNfVklFV1BPUlQpXG4gICAgY29weUJveChwcm9wTmFtZShTX1NDSVNTT1JfQk9YKSlcblxuICAgIHZhciBkaXJ0eSA9IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGggPiAwXG5cbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgZnJhbWVidWZmZXI6IGZyYW1lYnVmZmVyLFxuICAgICAgZHJhdzogZHJhdyxcbiAgICAgIHNoYWRlcjogc2hhZGVyLFxuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgZGlydHk6IGRpcnR5LFxuICAgICAgc2NvcGVWQU86IG51bGwsXG4gICAgICBkcmF3VkFPOiBudWxsLFxuICAgICAgdXNlVkFPOiBmYWxzZSxcbiAgICAgIGF0dHJpYnV0ZXM6IHt9XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb2ZpbGUgPSBwYXJzZVByb2ZpbGUob3B0aW9ucywgZW52KVxuICAgIHJlc3VsdC51bmlmb3JtcyA9IHBhcnNlVW5pZm9ybXModW5pZm9ybXMsIGVudilcbiAgICByZXN1bHQuZHJhd1ZBTyA9IHJlc3VsdC5zY29wZVZBTyA9IHBhcnNlVkFPKG9wdGlvbnMsIGVudilcbiAgICAvLyBzcGVjaWFsIGNhc2U6IGNoZWNrIGlmIHdlIGNhbiBzdGF0aWNhbGx5IGFsbG9jYXRlIGEgdmVydGV4IGFycmF5IG9iamVjdCBmb3IgdGhpcyBwcm9ncmFtXG4gICAgaWYgKCFyZXN1bHQuZHJhd1ZBTyAmJiBzaGFkZXIucHJvZ3JhbSAmJiAhYXR0cmliTG9jYXRpb25zICYmIGV4dGVuc2lvbnMuYW5nbGVfaW5zdGFuY2VkX2FycmF5cykge1xuICAgICAgdmFyIHVzZVZBTyA9IHRydWVcbiAgICAgIHZhciBzdGF0aWNCaW5kaW5ncyA9IHNoYWRlci5wcm9ncmFtLmF0dHJpYnV0ZXMubWFwKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICAgIHZhciBiaW5kaW5nID0gYXR0cmlidXRlcy5zdGF0aWNbYXR0cl1cbiAgICAgICAgdXNlVkFPID0gdXNlVkFPICYmICEhYmluZGluZ1xuICAgICAgICByZXR1cm4gYmluZGluZ1xuICAgICAgfSlcbiAgICAgIGlmICh1c2VWQU8gJiYgc3RhdGljQmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgdmFvID0gYXR0cmlidXRlU3RhdGUuZ2V0VkFPKGF0dHJpYnV0ZVN0YXRlLmNyZWF0ZVZBTyhzdGF0aWNCaW5kaW5ncykpXG4gICAgICAgIHJlc3VsdC5kcmF3VkFPID0gbmV3IERlY2xhcmF0aW9uKG51bGwsIG51bGwsIG51bGwsIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgcmV0dXJuIGVudi5saW5rKHZhbylcbiAgICAgICAgfSlcbiAgICAgICAgcmVzdWx0LnVzZVZBTyA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGF0dHJpYkxvY2F0aW9ucykge1xuICAgICAgcmVzdWx0LnVzZVZBTyA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoYXR0cmlidXRlcywgZW52KVxuICAgIH1cbiAgICByZXN1bHQuY29udGV4dCA9IHBhcnNlQ29udGV4dChjb250ZXh0LCBlbnYpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDT01NT04gVVBEQVRFIEZVTkNUSU9OU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIGVtaXRDb250ZXh0IChlbnYsIHNjb3BlLCBjb250ZXh0KSB7XG4gICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcbiAgICB2YXIgQ09OVEVYVCA9IHNoYXJlZC5jb250ZXh0XG5cbiAgICB2YXIgY29udGV4dEVudGVyID0gZW52LnNjb3BlKClcblxuICAgIE9iamVjdC5rZXlzKGNvbnRleHQpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHNjb3BlLnNhdmUoQ09OVEVYVCwgJy4nICsgbmFtZSlcbiAgICAgIHZhciBkZWZuID0gY29udGV4dFtuYW1lXVxuICAgICAgdmFyIHZhbHVlID0gZGVmbi5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBjb250ZXh0RW50ZXIoQ09OVEVYVCwgJy4nLCBuYW1lLCAnPVsnLCB2YWx1ZS5qb2luKCksICddOycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0RW50ZXIoQ09OVEVYVCwgJy4nLCBuYW1lLCAnPScsIHZhbHVlLCAnOycpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHNjb3BlKGNvbnRleHRFbnRlcilcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ09NTU9OIERSQVdJTkcgRlVOQ1RJT05TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZW1pdFBvbGxGcmFtZWJ1ZmZlciAoZW52LCBzY29wZSwgZnJhbWVidWZmZXIsIHNraXBDaGVjaykge1xuICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG5cbiAgICB2YXIgR0wgPSBzaGFyZWQuZ2xcbiAgICB2YXIgRlJBTUVCVUZGRVJfU1RBVEUgPSBzaGFyZWQuZnJhbWVidWZmZXJcbiAgICB2YXIgRVhUX0RSQVdfQlVGRkVSU1xuICAgIGlmIChleHREcmF3QnVmZmVycykge1xuICAgICAgRVhUX0RSQVdfQlVGRkVSUyA9IHNjb3BlLmRlZihzaGFyZWQuZXh0ZW5zaW9ucywgJy53ZWJnbF9kcmF3X2J1ZmZlcnMnKVxuICAgIH1cblxuICAgIHZhciBjb25zdGFudHMgPSBlbnYuY29uc3RhbnRzXG5cbiAgICB2YXIgRFJBV19CVUZGRVJTID0gY29uc3RhbnRzLmRyYXdCdWZmZXJcbiAgICB2YXIgQkFDS19CVUZGRVIgPSBjb25zdGFudHMuYmFja0J1ZmZlclxuXG4gICAgdmFyIE5FWFRcbiAgICBpZiAoZnJhbWVidWZmZXIpIHtcbiAgICAgIE5FWFQgPSBmcmFtZWJ1ZmZlci5hcHBlbmQoZW52LCBzY29wZSlcbiAgICB9IGVsc2Uge1xuICAgICAgTkVYVCA9IHNjb3BlLmRlZihGUkFNRUJVRkZFUl9TVEFURSwgJy5uZXh0JylcbiAgICB9XG5cbiAgICBpZiAoIXNraXBDaGVjaykge1xuICAgICAgc2NvcGUoJ2lmKCcsIE5FWFQsICchPT0nLCBGUkFNRUJVRkZFUl9TVEFURSwgJy5jdXIpeycpXG4gICAgfVxuICAgIHNjb3BlKFxuICAgICAgJ2lmKCcsIE5FWFQsICcpeycsXG4gICAgICBHTCwgJy5iaW5kRnJhbWVidWZmZXIoJywgR0xfRlJBTUVCVUZGRVIkMiwgJywnLCBORVhULCAnLmZyYW1lYnVmZmVyKTsnKVxuICAgIGlmIChleHREcmF3QnVmZmVycykge1xuICAgICAgc2NvcGUoRVhUX0RSQVdfQlVGRkVSUywgJy5kcmF3QnVmZmVyc1dFQkdMKCcsXG4gICAgICAgIERSQVdfQlVGRkVSUywgJ1snLCBORVhULCAnLmNvbG9yQXR0YWNobWVudHMubGVuZ3RoXSk7JylcbiAgICB9XG4gICAgc2NvcGUoJ31lbHNleycsXG4gICAgICBHTCwgJy5iaW5kRnJhbWVidWZmZXIoJywgR0xfRlJBTUVCVUZGRVIkMiwgJyxudWxsKTsnKVxuICAgIGlmIChleHREcmF3QnVmZmVycykge1xuICAgICAgc2NvcGUoRVhUX0RSQVdfQlVGRkVSUywgJy5kcmF3QnVmZmVyc1dFQkdMKCcsIEJBQ0tfQlVGRkVSLCAnKTsnKVxuICAgIH1cbiAgICBzY29wZShcbiAgICAgICd9JyxcbiAgICAgIEZSQU1FQlVGRkVSX1NUQVRFLCAnLmN1cj0nLCBORVhULCAnOycpXG4gICAgaWYgKCFza2lwQ2hlY2spIHtcbiAgICAgIHNjb3BlKCd9JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbWl0UG9sbFN0YXRlIChlbnYsIHNjb3BlLCBhcmdzKSB7XG4gICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcblxuICAgIHZhciBHTCA9IHNoYXJlZC5nbFxuXG4gICAgdmFyIENVUlJFTlRfVkFSUyA9IGVudi5jdXJyZW50XG4gICAgdmFyIE5FWFRfVkFSUyA9IGVudi5uZXh0XG4gICAgdmFyIENVUlJFTlRfU1RBVEUgPSBzaGFyZWQuY3VycmVudFxuICAgIHZhciBORVhUX1NUQVRFID0gc2hhcmVkLm5leHRcblxuICAgIHZhciBibG9jayA9IGVudi5jb25kKENVUlJFTlRfU1RBVEUsICcuZGlydHknKVxuXG4gICAgR0xfU1RBVEVfTkFNRVMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgdmFyIHBhcmFtID0gcHJvcE5hbWUocHJvcClcbiAgICAgIGlmIChwYXJhbSBpbiBhcmdzLnN0YXRlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB2YXIgTkVYVCwgQ1VSUkVOVFxuICAgICAgaWYgKHBhcmFtIGluIE5FWFRfVkFSUykge1xuICAgICAgICBORVhUID0gTkVYVF9WQVJTW3BhcmFtXVxuICAgICAgICBDVVJSRU5UID0gQ1VSUkVOVF9WQVJTW3BhcmFtXVxuICAgICAgICB2YXIgcGFydHMgPSBsb29wKGN1cnJlbnRTdGF0ZVtwYXJhbV0ubGVuZ3RoLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiBibG9jay5kZWYoTkVYVCwgJ1snLCBpLCAnXScpXG4gICAgICAgIH0pXG4gICAgICAgIGJsb2NrKGVudi5jb25kKHBhcnRzLm1hcChmdW5jdGlvbiAocCwgaSkge1xuICAgICAgICAgIHJldHVybiBwICsgJyE9PScgKyBDVVJSRU5UICsgJ1snICsgaSArICddJ1xuICAgICAgICB9KS5qb2luKCd8fCcpKVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgR0wsICcuJywgR0xfVkFSSUFCTEVTW3BhcmFtXSwgJygnLCBwYXJ0cywgJyk7JyxcbiAgICAgICAgICAgIHBhcnRzLm1hcChmdW5jdGlvbiAocCwgaSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ1VSUkVOVCArICdbJyArIGkgKyAnXT0nICsgcFxuICAgICAgICAgICAgfSkuam9pbignOycpLCAnOycpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTkVYVCA9IGJsb2NrLmRlZihORVhUX1NUQVRFLCAnLicsIHBhcmFtKVxuICAgICAgICB2YXIgaWZ0ZSA9IGVudi5jb25kKE5FWFQsICchPT0nLCBDVVJSRU5UX1NUQVRFLCAnLicsIHBhcmFtKVxuICAgICAgICBibG9jayhpZnRlKVxuICAgICAgICBpZiAocGFyYW0gaW4gR0xfRkxBR1MpIHtcbiAgICAgICAgICBpZnRlKFxuICAgICAgICAgICAgZW52LmNvbmQoTkVYVClcbiAgICAgICAgICAgICAgLnRoZW4oR0wsICcuZW5hYmxlKCcsIEdMX0ZMQUdTW3BhcmFtXSwgJyk7JylcbiAgICAgICAgICAgICAgLmVsc2UoR0wsICcuZGlzYWJsZSgnLCBHTF9GTEFHU1twYXJhbV0sICcpOycpLFxuICAgICAgICAgICAgQ1VSUkVOVF9TVEFURSwgJy4nLCBwYXJhbSwgJz0nLCBORVhULCAnOycpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWZ0ZShcbiAgICAgICAgICAgIEdMLCAnLicsIEdMX1ZBUklBQkxFU1twYXJhbV0sICcoJywgTkVYVCwgJyk7JyxcbiAgICAgICAgICAgIENVUlJFTlRfU1RBVEUsICcuJywgcGFyYW0sICc9JywgTkVYVCwgJzsnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoT2JqZWN0LmtleXMoYXJncy5zdGF0ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBibG9jayhDVVJSRU5UX1NUQVRFLCAnLmRpcnR5PWZhbHNlOycpXG4gICAgfVxuICAgIHNjb3BlKGJsb2NrKVxuICB9XG5cbiAgZnVuY3Rpb24gZW1pdFNldE9wdGlvbnMgKGVudiwgc2NvcGUsIG9wdGlvbnMsIGZpbHRlcikge1xuICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG4gICAgdmFyIENVUlJFTlRfVkFSUyA9IGVudi5jdXJyZW50XG4gICAgdmFyIENVUlJFTlRfU1RBVEUgPSBzaGFyZWQuY3VycmVudFxuICAgIHZhciBHTCA9IHNoYXJlZC5nbFxuICAgIHNvcnRTdGF0ZShPYmplY3Qua2V5cyhvcHRpb25zKSkuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgIHZhciBkZWZuID0gb3B0aW9uc1twYXJhbV1cbiAgICAgIGlmIChmaWx0ZXIgJiYgIWZpbHRlcihkZWZuKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHZhciB2YXJpYWJsZSA9IGRlZm4uYXBwZW5kKGVudiwgc2NvcGUpXG4gICAgICBpZiAoR0xfRkxBR1NbcGFyYW1dKSB7XG4gICAgICAgIHZhciBmbGFnID0gR0xfRkxBR1NbcGFyYW1dXG4gICAgICAgIGlmIChpc1N0YXRpYyhkZWZuKSkge1xuICAgICAgICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgICAgICAgc2NvcGUoR0wsICcuZW5hYmxlKCcsIGZsYWcsICcpOycpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjb3BlKEdMLCAnLmRpc2FibGUoJywgZmxhZywgJyk7JylcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NvcGUoZW52LmNvbmQodmFyaWFibGUpXG4gICAgICAgICAgICAudGhlbihHTCwgJy5lbmFibGUoJywgZmxhZywgJyk7JylcbiAgICAgICAgICAgIC5lbHNlKEdMLCAnLmRpc2FibGUoJywgZmxhZywgJyk7JykpXG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUoQ1VSUkVOVF9TVEFURSwgJy4nLCBwYXJhbSwgJz0nLCB2YXJpYWJsZSwgJzsnKVxuICAgICAgfSBlbHNlIGlmIChpc0FycmF5TGlrZSh2YXJpYWJsZSkpIHtcbiAgICAgICAgdmFyIENVUlJFTlQgPSBDVVJSRU5UX1ZBUlNbcGFyYW1dXG4gICAgICAgIHNjb3BlKFxuICAgICAgICAgIEdMLCAnLicsIEdMX1ZBUklBQkxFU1twYXJhbV0sICcoJywgdmFyaWFibGUsICcpOycsXG4gICAgICAgICAgdmFyaWFibGUubWFwKGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ1VSUkVOVCArICdbJyArIGkgKyAnXT0nICsgdlxuICAgICAgICAgIH0pLmpvaW4oJzsnKSwgJzsnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NvcGUoXG4gICAgICAgICAgR0wsICcuJywgR0xfVkFSSUFCTEVTW3BhcmFtXSwgJygnLCB2YXJpYWJsZSwgJyk7JyxcbiAgICAgICAgICBDVVJSRU5UX1NUQVRFLCAnLicsIHBhcmFtLCAnPScsIHZhcmlhYmxlLCAnOycpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluamVjdEV4dGVuc2lvbnMgKGVudiwgc2NvcGUpIHtcbiAgICBpZiAoZXh0SW5zdGFuY2luZykge1xuICAgICAgZW52Lmluc3RhbmNpbmcgPSBzY29wZS5kZWYoXG4gICAgICAgIGVudi5zaGFyZWQuZXh0ZW5zaW9ucywgJy5hbmdsZV9pbnN0YW5jZWRfYXJyYXlzJylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbWl0UHJvZmlsZSAoZW52LCBzY29wZSwgYXJncywgdXNlU2NvcGUsIGluY3JlbWVudENvdW50ZXIpIHtcbiAgICB2YXIgc2hhcmVkID0gZW52LnNoYXJlZFxuICAgIHZhciBTVEFUUyA9IGVudi5zdGF0c1xuICAgIHZhciBDVVJSRU5UX1NUQVRFID0gc2hhcmVkLmN1cnJlbnRcbiAgICB2YXIgVElNRVIgPSBzaGFyZWQudGltZXJcbiAgICB2YXIgcHJvZmlsZUFyZyA9IGFyZ3MucHJvZmlsZVxuXG4gICAgZnVuY3Rpb24gcGVyZkNvdW50ZXIgKCkge1xuICAgICAgaWYgKHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICdEYXRlLm5vdygpJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICdwZXJmb3JtYW5jZS5ub3coKSdcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgQ1BVX1NUQVJULCBRVUVSWV9DT1VOVEVSXG4gICAgZnVuY3Rpb24gZW1pdFByb2ZpbGVTdGFydCAoYmxvY2spIHtcbiAgICAgIENQVV9TVEFSVCA9IHNjb3BlLmRlZigpXG4gICAgICBibG9jayhDUFVfU1RBUlQsICc9JywgcGVyZkNvdW50ZXIoKSwgJzsnKVxuICAgICAgaWYgKHR5cGVvZiBpbmNyZW1lbnRDb3VudGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICBibG9jayhTVEFUUywgJy5jb3VudCs9JywgaW5jcmVtZW50Q291bnRlciwgJzsnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmxvY2soU1RBVFMsICcuY291bnQrKzsnKVxuICAgICAgfVxuICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgIGlmICh1c2VTY29wZSkge1xuICAgICAgICAgIFFVRVJZX0NPVU5URVIgPSBzY29wZS5kZWYoKVxuICAgICAgICAgIGJsb2NrKFFVRVJZX0NPVU5URVIsICc9JywgVElNRVIsICcuZ2V0TnVtUGVuZGluZ1F1ZXJpZXMoKTsnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJsb2NrKFRJTUVSLCAnLmJlZ2luUXVlcnkoJywgU1RBVFMsICcpOycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbWl0UHJvZmlsZUVuZCAoYmxvY2spIHtcbiAgICAgIGJsb2NrKFNUQVRTLCAnLmNwdVRpbWUrPScsIHBlcmZDb3VudGVyKCksICctJywgQ1BVX1NUQVJULCAnOycpXG4gICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgaWYgKHVzZVNjb3BlKSB7XG4gICAgICAgICAgYmxvY2soVElNRVIsICcucHVzaFNjb3BlU3RhdHMoJyxcbiAgICAgICAgICAgIFFVRVJZX0NPVU5URVIsICcsJyxcbiAgICAgICAgICAgIFRJTUVSLCAnLmdldE51bVBlbmRpbmdRdWVyaWVzKCksJyxcbiAgICAgICAgICAgIFNUQVRTLCAnKTsnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJsb2NrKFRJTUVSLCAnLmVuZFF1ZXJ5KCk7JylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjb3BlUHJvZmlsZSAodmFsdWUpIHtcbiAgICAgIHZhciBwcmV2ID0gc2NvcGUuZGVmKENVUlJFTlRfU1RBVEUsICcucHJvZmlsZScpXG4gICAgICBzY29wZShDVVJSRU5UX1NUQVRFLCAnLnByb2ZpbGU9JywgdmFsdWUsICc7JylcbiAgICAgIHNjb3BlLmV4aXQoQ1VSUkVOVF9TVEFURSwgJy5wcm9maWxlPScsIHByZXYsICc7JylcbiAgICB9XG5cbiAgICB2YXIgVVNFX1BST0ZJTEVcbiAgICBpZiAocHJvZmlsZUFyZykge1xuICAgICAgaWYgKGlzU3RhdGljKHByb2ZpbGVBcmcpKSB7XG4gICAgICAgIGlmIChwcm9maWxlQXJnLmVuYWJsZSkge1xuICAgICAgICAgIGVtaXRQcm9maWxlU3RhcnQoc2NvcGUpXG4gICAgICAgICAgZW1pdFByb2ZpbGVFbmQoc2NvcGUuZXhpdClcbiAgICAgICAgICBzY29wZVByb2ZpbGUoJ3RydWUnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjb3BlUHJvZmlsZSgnZmFsc2UnKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgVVNFX1BST0ZJTEUgPSBwcm9maWxlQXJnLmFwcGVuZChlbnYsIHNjb3BlKVxuICAgICAgc2NvcGVQcm9maWxlKFVTRV9QUk9GSUxFKVxuICAgIH0gZWxzZSB7XG4gICAgICBVU0VfUFJPRklMRSA9IHNjb3BlLmRlZihDVVJSRU5UX1NUQVRFLCAnLnByb2ZpbGUnKVxuICAgIH1cblxuICAgIHZhciBzdGFydCA9IGVudi5ibG9jaygpXG4gICAgZW1pdFByb2ZpbGVTdGFydChzdGFydClcbiAgICBzY29wZSgnaWYoJywgVVNFX1BST0ZJTEUsICcpeycsIHN0YXJ0LCAnfScpXG4gICAgdmFyIGVuZCA9IGVudi5ibG9jaygpXG4gICAgZW1pdFByb2ZpbGVFbmQoZW5kKVxuICAgIHNjb3BlLmV4aXQoJ2lmKCcsIFVTRV9QUk9GSUxFLCAnKXsnLCBlbmQsICd9JylcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXRBdHRyaWJ1dGVzIChlbnYsIHNjb3BlLCBhcmdzLCBhdHRyaWJ1dGVzLCBmaWx0ZXIpIHtcbiAgICB2YXIgc2hhcmVkID0gZW52LnNoYXJlZFxuXG4gICAgZnVuY3Rpb24gdHlwZUxlbmd0aCAoeCkge1xuICAgICAgc3dpdGNoICh4KSB7XG4gICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMjpcbiAgICAgICAgY2FzZSBHTF9JTlRfVkVDMjpcbiAgICAgICAgY2FzZSBHTF9CT09MX1ZFQzI6XG4gICAgICAgICAgcmV0dXJuIDJcbiAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUMzOlxuICAgICAgICBjYXNlIEdMX0lOVF9WRUMzOlxuICAgICAgICBjYXNlIEdMX0JPT0xfVkVDMzpcbiAgICAgICAgICByZXR1cm4gM1xuICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzQ6XG4gICAgICAgIGNhc2UgR0xfSU5UX1ZFQzQ6XG4gICAgICAgIGNhc2UgR0xfQk9PTF9WRUM0OlxuICAgICAgICAgIHJldHVybiA0XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbWl0QmluZEF0dHJpYnV0ZSAoQVRUUklCVVRFLCBzaXplLCByZWNvcmQpIHtcbiAgICAgIHZhciBHTCA9IHNoYXJlZC5nbFxuXG4gICAgICB2YXIgTE9DQVRJT04gPSBzY29wZS5kZWYoQVRUUklCVVRFLCAnLmxvY2F0aW9uJylcbiAgICAgIHZhciBCSU5ESU5HID0gc2NvcGUuZGVmKHNoYXJlZC5hdHRyaWJ1dGVzLCAnWycsIExPQ0FUSU9OLCAnXScpXG5cbiAgICAgIHZhciBTVEFURSA9IHJlY29yZC5zdGF0ZVxuICAgICAgdmFyIEJVRkZFUiA9IHJlY29yZC5idWZmZXJcbiAgICAgIHZhciBDT05TVF9DT01QT05FTlRTID0gW1xuICAgICAgICByZWNvcmQueCxcbiAgICAgICAgcmVjb3JkLnksXG4gICAgICAgIHJlY29yZC56LFxuICAgICAgICByZWNvcmQud1xuICAgICAgXVxuXG4gICAgICB2YXIgQ09NTU9OX0tFWVMgPSBbXG4gICAgICAgICdidWZmZXInLFxuICAgICAgICAnbm9ybWFsaXplZCcsXG4gICAgICAgICdvZmZzZXQnLFxuICAgICAgICAnc3RyaWRlJ1xuICAgICAgXVxuXG4gICAgICBmdW5jdGlvbiBlbWl0QnVmZmVyICgpIHtcbiAgICAgICAgc2NvcGUoXG4gICAgICAgICAgJ2lmKCEnLCBCSU5ESU5HLCAnLmJ1ZmZlcil7JyxcbiAgICAgICAgICBHTCwgJy5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgnLCBMT0NBVElPTiwgJyk7fScpXG5cbiAgICAgICAgdmFyIFRZUEUgPSByZWNvcmQudHlwZVxuICAgICAgICB2YXIgU0laRVxuICAgICAgICBpZiAoIXJlY29yZC5zaXplKSB7XG4gICAgICAgICAgU0laRSA9IHNpemVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBTSVpFID0gc2NvcGUuZGVmKHJlY29yZC5zaXplLCAnfHwnLCBzaXplKVxuICAgICAgICB9XG5cbiAgICAgICAgc2NvcGUoJ2lmKCcsXG4gICAgICAgICAgQklORElORywgJy50eXBlIT09JywgVFlQRSwgJ3x8JyxcbiAgICAgICAgICBCSU5ESU5HLCAnLnNpemUhPT0nLCBTSVpFLCAnfHwnLFxuICAgICAgICAgIENPTU1PTl9LRVlTLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gQklORElORyArICcuJyArIGtleSArICchPT0nICsgcmVjb3JkW2tleV1cbiAgICAgICAgICB9KS5qb2luKCd8fCcpLFxuICAgICAgICAgICcpeycsXG4gICAgICAgICAgR0wsICcuYmluZEJ1ZmZlcignLCBHTF9BUlJBWV9CVUZGRVIkMiwgJywnLCBCVUZGRVIsICcuYnVmZmVyKTsnLFxuICAgICAgICAgIEdMLCAnLnZlcnRleEF0dHJpYlBvaW50ZXIoJywgW1xuICAgICAgICAgICAgTE9DQVRJT04sXG4gICAgICAgICAgICBTSVpFLFxuICAgICAgICAgICAgVFlQRSxcbiAgICAgICAgICAgIHJlY29yZC5ub3JtYWxpemVkLFxuICAgICAgICAgICAgcmVjb3JkLnN0cmlkZSxcbiAgICAgICAgICAgIHJlY29yZC5vZmZzZXRcbiAgICAgICAgICBdLCAnKTsnLFxuICAgICAgICAgIEJJTkRJTkcsICcudHlwZT0nLCBUWVBFLCAnOycsXG4gICAgICAgICAgQklORElORywgJy5zaXplPScsIFNJWkUsICc7JyxcbiAgICAgICAgICBDT01NT05fS0VZUy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIEJJTkRJTkcgKyAnLicgKyBrZXkgKyAnPScgKyByZWNvcmRba2V5XSArICc7J1xuICAgICAgICAgIH0pLmpvaW4oJycpLFxuICAgICAgICAgICd9JylcblxuICAgICAgICBpZiAoZXh0SW5zdGFuY2luZykge1xuICAgICAgICAgIHZhciBESVZJU09SID0gcmVjb3JkLmRpdmlzb3JcbiAgICAgICAgICBzY29wZShcbiAgICAgICAgICAgICdpZignLCBCSU5ESU5HLCAnLmRpdmlzb3IhPT0nLCBESVZJU09SLCAnKXsnLFxuICAgICAgICAgICAgZW52Lmluc3RhbmNpbmcsICcudmVydGV4QXR0cmliRGl2aXNvckFOR0xFKCcsIFtMT0NBVElPTiwgRElWSVNPUl0sICcpOycsXG4gICAgICAgICAgICBCSU5ESU5HLCAnLmRpdmlzb3I9JywgRElWSVNPUiwgJzt9JylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBlbWl0Q29uc3RhbnQgKCkge1xuICAgICAgICBzY29wZShcbiAgICAgICAgICAnaWYoJywgQklORElORywgJy5idWZmZXIpeycsXG4gICAgICAgICAgR0wsICcuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCcsIExPQ0FUSU9OLCAnKTsnLFxuICAgICAgICAgIEJJTkRJTkcsICcuYnVmZmVyPW51bGw7JyxcbiAgICAgICAgICAnfWlmKCcsIENVVEVfQ09NUE9ORU5UUy5tYXAoZnVuY3Rpb24gKGMsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiBCSU5ESU5HICsgJy4nICsgYyArICchPT0nICsgQ09OU1RfQ09NUE9ORU5UU1tpXVxuICAgICAgICAgIH0pLmpvaW4oJ3x8JyksICcpeycsXG4gICAgICAgICAgR0wsICcudmVydGV4QXR0cmliNGYoJywgTE9DQVRJT04sICcsJywgQ09OU1RfQ09NUE9ORU5UUywgJyk7JyxcbiAgICAgICAgICBDVVRFX0NPTVBPTkVOVFMubWFwKGZ1bmN0aW9uIChjLCBpKSB7XG4gICAgICAgICAgICByZXR1cm4gQklORElORyArICcuJyArIGMgKyAnPScgKyBDT05TVF9DT01QT05FTlRTW2ldICsgJzsnXG4gICAgICAgICAgfSkuam9pbignJyksXG4gICAgICAgICAgJ30nKVxuICAgICAgfVxuXG4gICAgICBpZiAoU1RBVEUgPT09IEFUVFJJQl9TVEFURV9QT0lOVEVSKSB7XG4gICAgICAgIGVtaXRCdWZmZXIoKVxuICAgICAgfSBlbHNlIGlmIChTVEFURSA9PT0gQVRUUklCX1NUQVRFX0NPTlNUQU5UKSB7XG4gICAgICAgIGVtaXRDb25zdGFudCgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY29wZSgnaWYoJywgU1RBVEUsICc9PT0nLCBBVFRSSUJfU1RBVEVfUE9JTlRFUiwgJyl7JylcbiAgICAgICAgZW1pdEJ1ZmZlcigpXG4gICAgICAgIHNjb3BlKCd9ZWxzZXsnKVxuICAgICAgICBlbWl0Q29uc3RhbnQoKVxuICAgICAgICBzY29wZSgnfScpXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlLm5hbWVcbiAgICAgIHZhciBhcmcgPSBhcmdzLmF0dHJpYnV0ZXNbbmFtZV1cbiAgICAgIHZhciByZWNvcmRcbiAgICAgIGlmIChhcmcpIHtcbiAgICAgICAgaWYgKCFmaWx0ZXIoYXJnKSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJlY29yZCA9IGFyZy5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghZmlsdGVyKFNDT1BFX0RFQ0wpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNjb3BlQXR0cmliID0gZW52LnNjb3BlQXR0cmliKG5hbWUpXG4gICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICBzY29wZUF0dHJpYiArICcuc3RhdGUnLFxuICAgICAgICAgICAgJ21pc3NpbmcgYXR0cmlidXRlICcgKyBuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZWNvcmQgPSB7fVxuICAgICAgICBPYmplY3Qua2V5cyhuZXcgQXR0cmlidXRlUmVjb3JkKCkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJlY29yZFtrZXldID0gc2NvcGUuZGVmKHNjb3BlQXR0cmliLCAnLicsIGtleSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVtaXRCaW5kQXR0cmlidXRlKFxuICAgICAgICBlbnYubGluayhhdHRyaWJ1dGUpLCB0eXBlTGVuZ3RoKGF0dHJpYnV0ZS5pbmZvLnR5cGUpLCByZWNvcmQpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXRVbmlmb3JtcyAoZW52LCBzY29wZSwgYXJncywgdW5pZm9ybXMsIGZpbHRlcikge1xuICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG4gICAgdmFyIEdMID0gc2hhcmVkLmdsXG5cbiAgICB2YXIgaW5maXhcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVuaWZvcm1zLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgdW5pZm9ybSA9IHVuaWZvcm1zW2ldXG4gICAgICB2YXIgbmFtZSA9IHVuaWZvcm0ubmFtZVxuICAgICAgdmFyIHR5cGUgPSB1bmlmb3JtLmluZm8udHlwZVxuICAgICAgdmFyIGFyZyA9IGFyZ3MudW5pZm9ybXNbbmFtZV1cbiAgICAgIHZhciBVTklGT1JNID0gZW52LmxpbmsodW5pZm9ybSlcbiAgICAgIHZhciBMT0NBVElPTiA9IFVOSUZPUk0gKyAnLmxvY2F0aW9uJ1xuXG4gICAgICB2YXIgVkFMVUVcbiAgICAgIGlmIChhcmcpIHtcbiAgICAgICAgaWYgKCFmaWx0ZXIoYXJnKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU3RhdGljKGFyZykpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBhcmcudmFsdWVcbiAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgJ21pc3NpbmcgdW5pZm9ybSBcIicgKyBuYW1lICsgJ1wiJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgaWYgKHR5cGUgPT09IEdMX1NBTVBMRVJfMkQgfHwgdHlwZSA9PT0gR0xfU0FNUExFUl9DVUJFKSB7XG4gICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgICAoKHR5cGUgPT09IEdMX1NBTVBMRVJfMkQgJiZcbiAgICAgICAgICAgICAgICAodmFsdWUuX3JlZ2xUeXBlID09PSAndGV4dHVyZTJkJyB8fFxuICAgICAgICAgICAgICAgIHZhbHVlLl9yZWdsVHlwZSA9PT0gJ2ZyYW1lYnVmZmVyJykpIHx8XG4gICAgICAgICAgICAgICh0eXBlID09PSBHTF9TQU1QTEVSX0NVQkUgJiZcbiAgICAgICAgICAgICAgICAodmFsdWUuX3JlZ2xUeXBlID09PSAndGV4dHVyZUN1YmUnIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUuX3JlZ2xUeXBlID09PSAnZnJhbWVidWZmZXJDdWJlJykpKSxcbiAgICAgICAgICAgICAgJ2ludmFsaWQgdGV4dHVyZSBmb3IgdW5pZm9ybSAnICsgbmFtZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICB2YXIgVEVYX1ZBTFVFID0gZW52LmxpbmsodmFsdWUuX3RleHR1cmUgfHwgdmFsdWUuY29sb3JbMF0uX3RleHR1cmUpXG4gICAgICAgICAgICBzY29wZShHTCwgJy51bmlmb3JtMWkoJywgTE9DQVRJT04sICcsJywgVEVYX1ZBTFVFICsgJy5iaW5kKCkpOycpXG4gICAgICAgICAgICBzY29wZS5leGl0KFRFWF9WQUxVRSwgJy51bmJpbmQoKTsnKVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0eXBlID09PSBHTF9GTE9BVF9NQVQyIHx8XG4gICAgICAgICAgICB0eXBlID09PSBHTF9GTE9BVF9NQVQzIHx8XG4gICAgICAgICAgICB0eXBlID09PSBHTF9GTE9BVF9NQVQ0KSB7XG4gICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKGlzQXJyYXlMaWtlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICAnaW52YWxpZCBtYXRyaXggZm9yIHVuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgKHR5cGUgPT09IEdMX0ZMT0FUX01BVDIgJiYgdmFsdWUubGVuZ3RoID09PSA0KSB8fFxuICAgICAgICAgICAgICAgICh0eXBlID09PSBHTF9GTE9BVF9NQVQzICYmIHZhbHVlLmxlbmd0aCA9PT0gOSkgfHxcbiAgICAgICAgICAgICAgICAodHlwZSA9PT0gR0xfRkxPQVRfTUFUNCAmJiB2YWx1ZS5sZW5ndGggPT09IDE2KSxcbiAgICAgICAgICAgICAgICAnaW52YWxpZCBsZW5ndGggZm9yIG1hdHJpeCB1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB2YXIgTUFUX1ZBTFVFID0gZW52Lmdsb2JhbC5kZWYoJ25ldyBGbG9hdDMyQXJyYXkoWycgK1xuICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh2YWx1ZSkgKyAnXSknKVxuICAgICAgICAgICAgdmFyIGRpbSA9IDJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBHTF9GTE9BVF9NQVQzKSB7XG4gICAgICAgICAgICAgIGRpbSA9IDNcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gR0xfRkxPQVRfTUFUNCkge1xuICAgICAgICAgICAgICBkaW0gPSA0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZShcbiAgICAgICAgICAgICAgR0wsICcudW5pZm9ybU1hdHJpeCcsIGRpbSwgJ2Z2KCcsXG4gICAgICAgICAgICAgIExPQ0FUSU9OLCAnLGZhbHNlLCcsIE1BVF9WQUxVRSwgJyk7JylcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgR0xfRkxPQVQkODpcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRUeXBlKHZhbHVlLCAnbnVtYmVyJywgJ3VuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICAgIGluZml4ID0gJzFmJ1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMjpcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgICBpc0FycmF5TGlrZSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAyLFxuICAgICAgICAgICAgICAgICAgJ3VuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICAgIGluZml4ID0gJzJmJ1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMzpcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgICBpc0FycmF5TGlrZSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAzLFxuICAgICAgICAgICAgICAgICAgJ3VuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICAgIGluZml4ID0gJzNmJ1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDNDpcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgICBpc0FycmF5TGlrZSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSA0LFxuICAgICAgICAgICAgICAgICAgJ3VuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICAgIGluZml4ID0gJzRmJ1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgR0xfQk9PTDpcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRUeXBlKHZhbHVlLCAnYm9vbGVhbicsICd1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgICBpbmZpeCA9ICcxaSdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIEdMX0lOVCQzOlxuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUodmFsdWUsICdudW1iZXInLCAndW5pZm9ybSAnICsgbmFtZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgaW5maXggPSAnMWknXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSBHTF9CT09MX1ZFQzI6XG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgICAgaXNBcnJheUxpa2UodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMixcbiAgICAgICAgICAgICAgICAgICd1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgICBpbmZpeCA9ICcyaSdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIEdMX0lOVF9WRUMyOlxuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXlMaWtlKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDIsXG4gICAgICAgICAgICAgICAgICAndW5pZm9ybSAnICsgbmFtZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgaW5maXggPSAnMmknXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSBHTF9CT09MX1ZFQzM6XG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgICAgaXNBcnJheUxpa2UodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMyxcbiAgICAgICAgICAgICAgICAgICd1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgICBpbmZpeCA9ICczaSdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIEdMX0lOVF9WRUMzOlxuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXlMaWtlKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDMsXG4gICAgICAgICAgICAgICAgICAndW5pZm9ybSAnICsgbmFtZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgaW5maXggPSAnM2knXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSBHTF9CT09MX1ZFQzQ6XG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgICAgaXNBcnJheUxpa2UodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gNCxcbiAgICAgICAgICAgICAgICAgICd1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgICBpbmZpeCA9ICc0aSdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIEdMX0lOVF9WRUM0OlxuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXlMaWtlKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDQsXG4gICAgICAgICAgICAgICAgICAndW5pZm9ybSAnICsgbmFtZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgaW5maXggPSAnNGknXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlKEdMLCAnLnVuaWZvcm0nLCBpbmZpeCwgJygnLCBMT0NBVElPTiwgJywnLFxuICAgICAgICAgICAgICBpc0FycmF5TGlrZSh2YWx1ZSkgPyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh2YWx1ZSkgOiB2YWx1ZSxcbiAgICAgICAgICAgICAgJyk7JylcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBWQUxVRSA9IGFyZy5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFmaWx0ZXIoU0NPUEVfREVDTCkpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIFZBTFVFID0gc2NvcGUuZGVmKHNoYXJlZC51bmlmb3JtcywgJ1snLCBzdHJpbmdTdG9yZS5pZChuYW1lKSwgJ10nKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gR0xfU0FNUExFUl8yRCkge1xuICAgICAgICBjaGVjayQxKCFBcnJheS5pc0FycmF5KFZBTFVFKSwgJ211c3Qgc3BlY2lmeSBhIHNjYWxhciBwcm9wIGZvciB0ZXh0dXJlcycpXG4gICAgICAgIHNjb3BlKFxuICAgICAgICAgICdpZignLCBWQUxVRSwgJyYmJywgVkFMVUUsICcuX3JlZ2xUeXBlPT09XCJmcmFtZWJ1ZmZlclwiKXsnLFxuICAgICAgICAgIFZBTFVFLCAnPScsIFZBTFVFLCAnLmNvbG9yWzBdOycsXG4gICAgICAgICAgJ30nKVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBHTF9TQU1QTEVSX0NVQkUpIHtcbiAgICAgICAgY2hlY2skMSghQXJyYXkuaXNBcnJheShWQUxVRSksICdtdXN0IHNwZWNpZnkgYSBzY2FsYXIgcHJvcCBmb3IgY3ViZSBtYXBzJylcbiAgICAgICAgc2NvcGUoXG4gICAgICAgICAgJ2lmKCcsIFZBTFVFLCAnJiYnLCBWQUxVRSwgJy5fcmVnbFR5cGU9PT1cImZyYW1lYnVmZmVyQ3ViZVwiKXsnLFxuICAgICAgICAgIFZBTFVFLCAnPScsIFZBTFVFLCAnLmNvbG9yWzBdOycsXG4gICAgICAgICAgJ30nKVxuICAgICAgfVxuXG4gICAgICAvLyBwZXJmb3JtIHR5cGUgdmFsaWRhdGlvblxuICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGVtaXRDaGVjayAocHJlZCwgbWVzc2FnZSkge1xuICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsIHByZWQsXG4gICAgICAgICAgICAnYmFkIGRhdGEgb3IgbWlzc2luZyBmb3IgdW5pZm9ybSBcIicgKyBuYW1lICsgJ1wiLiAgJyArIG1lc3NhZ2UpXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjaGVja1R5cGUgKHR5cGUpIHtcbiAgICAgICAgICBjaGVjayQxKCFBcnJheS5pc0FycmF5KFZBTFVFKSwgJ211c3Qgbm90IHNwZWNpZnkgYW4gYXJyYXkgdHlwZSBmb3IgdW5pZm9ybScpXG4gICAgICAgICAgZW1pdENoZWNrKFxuICAgICAgICAgICAgJ3R5cGVvZiAnICsgVkFMVUUgKyAnPT09XCInICsgdHlwZSArICdcIicsXG4gICAgICAgICAgICAnaW52YWxpZCB0eXBlLCBleHBlY3RlZCAnICsgdHlwZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrVmVjdG9yIChuLCB0eXBlKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoVkFMVUUpKSB7XG4gICAgICAgICAgICBjaGVjayQxKFZBTFVFLmxlbmd0aCA9PT0gbiwgJ211c3QgaGF2ZSBsZW5ndGggJyArIG4pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVtaXRDaGVjayhcbiAgICAgICAgICAgICAgc2hhcmVkLmlzQXJyYXlMaWtlICsgJygnICsgVkFMVUUgKyAnKSYmJyArIFZBTFVFICsgJy5sZW5ndGg9PT0nICsgbixcbiAgICAgICAgICAgICAgJ2ludmFsaWQgdmVjdG9yLCBzaG91bGQgaGF2ZSBsZW5ndGggJyArIG4sIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrVGV4dHVyZSAodGFyZ2V0KSB7XG4gICAgICAgICAgY2hlY2skMSghQXJyYXkuaXNBcnJheShWQUxVRSksICdtdXN0IG5vdCBzcGVjaWZ5IGEgdmFsdWUgdHlwZScpXG4gICAgICAgICAgZW1pdENoZWNrKFxuICAgICAgICAgICAgJ3R5cGVvZiAnICsgVkFMVUUgKyAnPT09XCJmdW5jdGlvblwiJiYnICtcbiAgICAgICAgICAgIFZBTFVFICsgJy5fcmVnbFR5cGU9PT1cInRleHR1cmUnICtcbiAgICAgICAgICAgICh0YXJnZXQgPT09IEdMX1RFWFRVUkVfMkQkMyA/ICcyZCcgOiAnQ3ViZScpICsgJ1wiJyxcbiAgICAgICAgICAgICdpbnZhbGlkIHRleHR1cmUgdHlwZScsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBHTF9JTlQkMzpcbiAgICAgICAgICAgIGNoZWNrVHlwZSgnbnVtYmVyJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9JTlRfVkVDMjpcbiAgICAgICAgICAgIGNoZWNrVmVjdG9yKDIsICdudW1iZXInKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX0lOVF9WRUMzOlxuICAgICAgICAgICAgY2hlY2tWZWN0b3IoMywgJ251bWJlcicpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgR0xfSU5UX1ZFQzQ6XG4gICAgICAgICAgICBjaGVja1ZlY3Rvcig0LCAnbnVtYmVyJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9GTE9BVCQ4OlxuICAgICAgICAgICAgY2hlY2tUeXBlKCdudW1iZXInKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzI6XG4gICAgICAgICAgICBjaGVja1ZlY3RvcigyLCAnbnVtYmVyJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUMzOlxuICAgICAgICAgICAgY2hlY2tWZWN0b3IoMywgJ251bWJlcicpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDNDpcbiAgICAgICAgICAgIGNoZWNrVmVjdG9yKDQsICdudW1iZXInKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX0JPT0w6XG4gICAgICAgICAgICBjaGVja1R5cGUoJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX0JPT0xfVkVDMjpcbiAgICAgICAgICAgIGNoZWNrVmVjdG9yKDIsICdib29sZWFuJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9CT09MX1ZFQzM6XG4gICAgICAgICAgICBjaGVja1ZlY3RvcigzLCAnYm9vbGVhbicpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgR0xfQk9PTF9WRUM0OlxuICAgICAgICAgICAgY2hlY2tWZWN0b3IoNCwgJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX0ZMT0FUX01BVDI6XG4gICAgICAgICAgICBjaGVja1ZlY3Rvcig0LCAnbnVtYmVyJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQzOlxuICAgICAgICAgICAgY2hlY2tWZWN0b3IoOSwgJ251bWJlcicpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUNDpcbiAgICAgICAgICAgIGNoZWNrVmVjdG9yKDE2LCAnbnVtYmVyJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9TQU1QTEVSXzJEOlxuICAgICAgICAgICAgY2hlY2tUZXh0dXJlKEdMX1RFWFRVUkVfMkQkMylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9TQU1QTEVSX0NVQkU6XG4gICAgICAgICAgICBjaGVja1RleHR1cmUoR0xfVEVYVFVSRV9DVUJFX01BUCQyKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgdmFyIHVucm9sbCA9IDFcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIEdMX1NBTVBMRVJfMkQ6XG4gICAgICAgIGNhc2UgR0xfU0FNUExFUl9DVUJFOlxuICAgICAgICAgIHZhciBURVggPSBzY29wZS5kZWYoVkFMVUUsICcuX3RleHR1cmUnKVxuICAgICAgICAgIHNjb3BlKEdMLCAnLnVuaWZvcm0xaSgnLCBMT0NBVElPTiwgJywnLCBURVgsICcuYmluZCgpKTsnKVxuICAgICAgICAgIHNjb3BlLmV4aXQoVEVYLCAnLnVuYmluZCgpOycpXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIEdMX0lOVCQzOlxuICAgICAgICBjYXNlIEdMX0JPT0w6XG4gICAgICAgICAgaW5maXggPSAnMWknXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIEdMX0lOVF9WRUMyOlxuICAgICAgICBjYXNlIEdMX0JPT0xfVkVDMjpcbiAgICAgICAgICBpbmZpeCA9ICcyaSdcbiAgICAgICAgICB1bnJvbGwgPSAyXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIEdMX0lOVF9WRUMzOlxuICAgICAgICBjYXNlIEdMX0JPT0xfVkVDMzpcbiAgICAgICAgICBpbmZpeCA9ICczaSdcbiAgICAgICAgICB1bnJvbGwgPSAzXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIEdMX0lOVF9WRUM0OlxuICAgICAgICBjYXNlIEdMX0JPT0xfVkVDNDpcbiAgICAgICAgICBpbmZpeCA9ICc0aSdcbiAgICAgICAgICB1bnJvbGwgPSA0XG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIEdMX0ZMT0FUJDg6XG4gICAgICAgICAgaW5maXggPSAnMWYnXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzI6XG4gICAgICAgICAgaW5maXggPSAnMmYnXG4gICAgICAgICAgdW5yb2xsID0gMlxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUMzOlxuICAgICAgICAgIGluZml4ID0gJzNmJ1xuICAgICAgICAgIHVucm9sbCA9IDNcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDNDpcbiAgICAgICAgICBpbmZpeCA9ICc0ZidcbiAgICAgICAgICB1bnJvbGwgPSA0XG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIEdMX0ZMT0FUX01BVDI6XG4gICAgICAgICAgaW5maXggPSAnTWF0cml4MmZ2J1xuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQzOlxuICAgICAgICAgIGluZml4ID0gJ01hdHJpeDNmdidcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUNDpcbiAgICAgICAgICBpbmZpeCA9ICdNYXRyaXg0ZnYnXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgc2NvcGUoR0wsICcudW5pZm9ybScsIGluZml4LCAnKCcsIExPQ0FUSU9OLCAnLCcpXG4gICAgICBpZiAoaW5maXguY2hhckF0KDApID09PSAnTScpIHtcbiAgICAgICAgdmFyIG1hdFNpemUgPSBNYXRoLnBvdyh0eXBlIC0gR0xfRkxPQVRfTUFUMiArIDIsIDIpXG4gICAgICAgIHZhciBTVE9SQUdFID0gZW52Lmdsb2JhbC5kZWYoJ25ldyBGbG9hdDMyQXJyYXkoJywgbWF0U2l6ZSwgJyknKVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShWQUxVRSkpIHtcbiAgICAgICAgICBzY29wZShcbiAgICAgICAgICAgICdmYWxzZSwoJyxcbiAgICAgICAgICAgIGxvb3AobWF0U2l6ZSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFNUT1JBR0UgKyAnWycgKyBpICsgJ109JyArIFZBTFVFW2ldXG4gICAgICAgICAgICB9KSwgJywnLCBTVE9SQUdFLCAnKScpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NvcGUoXG4gICAgICAgICAgICAnZmFsc2UsKEFycmF5LmlzQXJyYXkoJywgVkFMVUUsICcpfHwnLCBWQUxVRSwgJyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSk/JywgVkFMVUUsICc6KCcsXG4gICAgICAgICAgICBsb29wKG1hdFNpemUsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBTVE9SQUdFICsgJ1snICsgaSArICddPScgKyBWQUxVRSArICdbJyArIGkgKyAnXSdcbiAgICAgICAgICAgIH0pLCAnLCcsIFNUT1JBR0UsICcpJylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh1bnJvbGwgPiAxKSB7XG4gICAgICAgIHNjb3BlKGxvb3AodW5yb2xsLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KFZBTFVFKSA/IFZBTFVFW2ldIDogVkFMVUUgKyAnWycgKyBpICsgJ10nXG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2skMSghQXJyYXkuaXNBcnJheShWQUxVRSksICd1bmlmb3JtIHZhbHVlIG11c3Qgbm90IGJlIGFuIGFycmF5JylcbiAgICAgICAgc2NvcGUoVkFMVUUpXG4gICAgICB9XG4gICAgICBzY29wZSgnKTsnKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXREcmF3IChlbnYsIG91dGVyLCBpbm5lciwgYXJncykge1xuICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG4gICAgdmFyIEdMID0gc2hhcmVkLmdsXG4gICAgdmFyIERSQVdfU1RBVEUgPSBzaGFyZWQuZHJhd1xuXG4gICAgdmFyIGRyYXdPcHRpb25zID0gYXJncy5kcmF3XG5cbiAgICBmdW5jdGlvbiBlbWl0RWxlbWVudHMgKCkge1xuICAgICAgdmFyIGRlZm4gPSBkcmF3T3B0aW9ucy5lbGVtZW50c1xuICAgICAgdmFyIEVMRU1FTlRTXG4gICAgICB2YXIgc2NvcGUgPSBvdXRlclxuICAgICAgaWYgKGRlZm4pIHtcbiAgICAgICAgaWYgKChkZWZuLmNvbnRleHREZXAgJiYgYXJncy5jb250ZXh0RHluYW1pYykgfHwgZGVmbi5wcm9wRGVwKSB7XG4gICAgICAgICAgc2NvcGUgPSBpbm5lclxuICAgICAgICB9XG4gICAgICAgIEVMRU1FTlRTID0gZGVmbi5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEVMRU1FTlRTID0gc2NvcGUuZGVmKERSQVdfU1RBVEUsICcuJywgU19FTEVNRU5UUylcbiAgICAgIH1cbiAgICAgIGlmIChFTEVNRU5UUykge1xuICAgICAgICBzY29wZShcbiAgICAgICAgICAnaWYoJyArIEVMRU1FTlRTICsgJyknICtcbiAgICAgICAgICBHTCArICcuYmluZEJ1ZmZlcignICsgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIkMSArICcsJyArIEVMRU1FTlRTICsgJy5idWZmZXIuYnVmZmVyKTsnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIEVMRU1FTlRTXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW1pdENvdW50ICgpIHtcbiAgICAgIHZhciBkZWZuID0gZHJhd09wdGlvbnMuY291bnRcbiAgICAgIHZhciBDT1VOVFxuICAgICAgdmFyIHNjb3BlID0gb3V0ZXJcbiAgICAgIGlmIChkZWZuKSB7XG4gICAgICAgIGlmICgoZGVmbi5jb250ZXh0RGVwICYmIGFyZ3MuY29udGV4dER5bmFtaWMpIHx8IGRlZm4ucHJvcERlcCkge1xuICAgICAgICAgIHNjb3BlID0gaW5uZXJcbiAgICAgICAgfVxuICAgICAgICBDT1VOVCA9IGRlZm4uYXBwZW5kKGVudiwgc2NvcGUpXG4gICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChkZWZuLk1JU1NJTkcpIHtcbiAgICAgICAgICAgIGVudi5hc3NlcnQob3V0ZXIsICdmYWxzZScsICdtaXNzaW5nIHZlcnRleCBjb3VudCcpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZWZuLkRZTkFNSUMpIHtcbiAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsIENPVU5UICsgJz49MCcsICdtaXNzaW5nIHZlcnRleCBjb3VudCcpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ09VTlQgPSBzY29wZS5kZWYoRFJBV19TVEFURSwgJy4nLCBTX0NPVU5UKVxuICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLCBDT1VOVCArICc+PTAnLCAnbWlzc2luZyB2ZXJ0ZXggY291bnQnKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIENPVU5UXG4gICAgfVxuXG4gICAgdmFyIEVMRU1FTlRTID0gZW1pdEVsZW1lbnRzKClcbiAgICBmdW5jdGlvbiBlbWl0VmFsdWUgKG5hbWUpIHtcbiAgICAgIHZhciBkZWZuID0gZHJhd09wdGlvbnNbbmFtZV1cbiAgICAgIGlmIChkZWZuKSB7XG4gICAgICAgIGlmICgoZGVmbi5jb250ZXh0RGVwICYmIGFyZ3MuY29udGV4dER5bmFtaWMpIHx8IGRlZm4ucHJvcERlcCkge1xuICAgICAgICAgIHJldHVybiBkZWZuLmFwcGVuZChlbnYsIGlubmVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBkZWZuLmFwcGVuZChlbnYsIG91dGVyKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gb3V0ZXIuZGVmKERSQVdfU1RBVEUsICcuJywgbmFtZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgUFJJTUlUSVZFID0gZW1pdFZhbHVlKFNfUFJJTUlUSVZFKVxuICAgIHZhciBPRkZTRVQgPSBlbWl0VmFsdWUoU19PRkZTRVQpXG5cbiAgICB2YXIgQ09VTlQgPSBlbWl0Q291bnQoKVxuICAgIGlmICh0eXBlb2YgQ09VTlQgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoQ09VTlQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlubmVyKCdpZignLCBDT1VOVCwgJyl7JylcbiAgICAgIGlubmVyLmV4aXQoJ30nKVxuICAgIH1cblxuICAgIHZhciBJTlNUQU5DRVMsIEVYVF9JTlNUQU5DSU5HXG4gICAgaWYgKGV4dEluc3RhbmNpbmcpIHtcbiAgICAgIElOU1RBTkNFUyA9IGVtaXRWYWx1ZShTX0lOU1RBTkNFUylcbiAgICAgIEVYVF9JTlNUQU5DSU5HID0gZW52Lmluc3RhbmNpbmdcbiAgICB9XG5cbiAgICB2YXIgRUxFTUVOVF9UWVBFID0gRUxFTUVOVFMgKyAnLnR5cGUnXG5cbiAgICB2YXIgZWxlbWVudHNTdGF0aWMgPSBkcmF3T3B0aW9ucy5lbGVtZW50cyAmJiBpc1N0YXRpYyhkcmF3T3B0aW9ucy5lbGVtZW50cylcblxuICAgIGZ1bmN0aW9uIGVtaXRJbnN0YW5jaW5nICgpIHtcbiAgICAgIGZ1bmN0aW9uIGRyYXdFbGVtZW50cyAoKSB7XG4gICAgICAgIGlubmVyKEVYVF9JTlNUQU5DSU5HLCAnLmRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFKCcsIFtcbiAgICAgICAgICBQUklNSVRJVkUsXG4gICAgICAgICAgQ09VTlQsXG4gICAgICAgICAgRUxFTUVOVF9UWVBFLFxuICAgICAgICAgIE9GRlNFVCArICc8PCgoJyArIEVMRU1FTlRfVFlQRSArICctJyArIEdMX1VOU0lHTkVEX0JZVEUkOCArICcpPj4xKScsXG4gICAgICAgICAgSU5TVEFOQ0VTXG4gICAgICAgIF0sICcpOycpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRyYXdBcnJheXMgKCkge1xuICAgICAgICBpbm5lcihFWFRfSU5TVEFOQ0lORywgJy5kcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUoJyxcbiAgICAgICAgICBbUFJJTUlUSVZFLCBPRkZTRVQsIENPVU5ULCBJTlNUQU5DRVNdLCAnKTsnKVxuICAgICAgfVxuXG4gICAgICBpZiAoRUxFTUVOVFMpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50c1N0YXRpYykge1xuICAgICAgICAgIGlubmVyKCdpZignLCBFTEVNRU5UUywgJyl7JylcbiAgICAgICAgICBkcmF3RWxlbWVudHMoKVxuICAgICAgICAgIGlubmVyKCd9ZWxzZXsnKVxuICAgICAgICAgIGRyYXdBcnJheXMoKVxuICAgICAgICAgIGlubmVyKCd9JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkcmF3RWxlbWVudHMoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmF3QXJyYXlzKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbWl0UmVndWxhciAoKSB7XG4gICAgICBmdW5jdGlvbiBkcmF3RWxlbWVudHMgKCkge1xuICAgICAgICBpbm5lcihHTCArICcuZHJhd0VsZW1lbnRzKCcgKyBbXG4gICAgICAgICAgUFJJTUlUSVZFLFxuICAgICAgICAgIENPVU5ULFxuICAgICAgICAgIEVMRU1FTlRfVFlQRSxcbiAgICAgICAgICBPRkZTRVQgKyAnPDwoKCcgKyBFTEVNRU5UX1RZUEUgKyAnLScgKyBHTF9VTlNJR05FRF9CWVRFJDggKyAnKT4+MSknXG4gICAgICAgIF0gKyAnKTsnKVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkcmF3QXJyYXlzICgpIHtcbiAgICAgICAgaW5uZXIoR0wgKyAnLmRyYXdBcnJheXMoJyArIFtQUklNSVRJVkUsIE9GRlNFVCwgQ09VTlRdICsgJyk7JylcbiAgICAgIH1cblxuICAgICAgaWYgKEVMRU1FTlRTKSB7XG4gICAgICAgIGlmICghZWxlbWVudHNTdGF0aWMpIHtcbiAgICAgICAgICBpbm5lcignaWYoJywgRUxFTUVOVFMsICcpeycpXG4gICAgICAgICAgZHJhd0VsZW1lbnRzKClcbiAgICAgICAgICBpbm5lcignfWVsc2V7JylcbiAgICAgICAgICBkcmF3QXJyYXlzKClcbiAgICAgICAgICBpbm5lcignfScpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZHJhd0VsZW1lbnRzKClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhd0FycmF5cygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4dEluc3RhbmNpbmcgJiYgKHR5cGVvZiBJTlNUQU5DRVMgIT09ICdudW1iZXInIHx8IElOU1RBTkNFUyA+PSAwKSkge1xuICAgICAgaWYgKHR5cGVvZiBJTlNUQU5DRVMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlubmVyKCdpZignLCBJTlNUQU5DRVMsICc+MCl7JylcbiAgICAgICAgZW1pdEluc3RhbmNpbmcoKVxuICAgICAgICBpbm5lcignfWVsc2UgaWYoJywgSU5TVEFOQ0VTLCAnPDApeycpXG4gICAgICAgIGVtaXRSZWd1bGFyKClcbiAgICAgICAgaW5uZXIoJ30nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdEluc3RhbmNpbmcoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0UmVndWxhcigpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQm9keSAoZW1pdEJvZHksIHBhcmVudEVudiwgYXJncywgcHJvZ3JhbSwgY291bnQpIHtcbiAgICB2YXIgZW52ID0gY3JlYXRlUkVHTEVudmlyb25tZW50KClcbiAgICB2YXIgc2NvcGUgPSBlbnYucHJvYygnYm9keScsIGNvdW50KVxuICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgZW52LmNvbW1hbmRTdHIgPSBwYXJlbnRFbnYuY29tbWFuZFN0clxuICAgICAgZW52LmNvbW1hbmQgPSBlbnYubGluayhwYXJlbnRFbnYuY29tbWFuZFN0cilcbiAgICB9KVxuICAgIGlmIChleHRJbnN0YW5jaW5nKSB7XG4gICAgICBlbnYuaW5zdGFuY2luZyA9IHNjb3BlLmRlZihcbiAgICAgICAgZW52LnNoYXJlZC5leHRlbnNpb25zLCAnLmFuZ2xlX2luc3RhbmNlZF9hcnJheXMnKVxuICAgIH1cbiAgICBlbWl0Qm9keShlbnYsIHNjb3BlLCBhcmdzLCBwcm9ncmFtKVxuICAgIHJldHVybiBlbnYuY29tcGlsZSgpLmJvZHlcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRFJBVyBQUk9DXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZW1pdERyYXdCb2R5IChlbnYsIGRyYXcsIGFyZ3MsIHByb2dyYW0pIHtcbiAgICBpbmplY3RFeHRlbnNpb25zKGVudiwgZHJhdylcbiAgICBpZiAoYXJncy51c2VWQU8pIHtcbiAgICAgIGlmIChhcmdzLmRyYXdWQU8pIHtcbiAgICAgICAgZHJhdyhlbnYuc2hhcmVkLnZhbywgJy5zZXRWQU8oJywgYXJncy5kcmF3VkFPLmFwcGVuZChlbnYsIGRyYXcpLCAnKTsnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhdyhlbnYuc2hhcmVkLnZhbywgJy5zZXRWQU8oJywgZW52LnNoYXJlZC52YW8sICcudGFyZ2V0VkFPKTsnKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkcmF3KGVudi5zaGFyZWQudmFvLCAnLnNldFZBTyhudWxsKTsnKVxuICAgICAgZW1pdEF0dHJpYnV0ZXMoZW52LCBkcmF3LCBhcmdzLCBwcm9ncmFtLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGVtaXRVbmlmb3JtcyhlbnYsIGRyYXcsIGFyZ3MsIHByb2dyYW0udW5pZm9ybXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSlcbiAgICBlbWl0RHJhdyhlbnYsIGRyYXcsIGRyYXcsIGFyZ3MpXG4gIH1cblxuICBmdW5jdGlvbiBlbWl0RHJhd1Byb2MgKGVudiwgYXJncykge1xuICAgIHZhciBkcmF3ID0gZW52LnByb2MoJ2RyYXcnLCAxKVxuXG4gICAgaW5qZWN0RXh0ZW5zaW9ucyhlbnYsIGRyYXcpXG5cbiAgICBlbWl0Q29udGV4dChlbnYsIGRyYXcsIGFyZ3MuY29udGV4dClcbiAgICBlbWl0UG9sbEZyYW1lYnVmZmVyKGVudiwgZHJhdywgYXJncy5mcmFtZWJ1ZmZlcilcblxuICAgIGVtaXRQb2xsU3RhdGUoZW52LCBkcmF3LCBhcmdzKVxuICAgIGVtaXRTZXRPcHRpb25zKGVudiwgZHJhdywgYXJncy5zdGF0ZSlcblxuICAgIGVtaXRQcm9maWxlKGVudiwgZHJhdywgYXJncywgZmFsc2UsIHRydWUpXG5cbiAgICB2YXIgcHJvZ3JhbSA9IGFyZ3Muc2hhZGVyLnByb2dWYXIuYXBwZW5kKGVudiwgZHJhdylcbiAgICBkcmF3KGVudi5zaGFyZWQuZ2wsICcudXNlUHJvZ3JhbSgnLCBwcm9ncmFtLCAnLnByb2dyYW0pOycpXG5cbiAgICBpZiAoYXJncy5zaGFkZXIucHJvZ3JhbSkge1xuICAgICAgZW1pdERyYXdCb2R5KGVudiwgZHJhdywgYXJncywgYXJncy5zaGFkZXIucHJvZ3JhbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZHJhdyhlbnYuc2hhcmVkLnZhbywgJy5zZXRWQU8obnVsbCk7JylcbiAgICAgIHZhciBkcmF3Q2FjaGUgPSBlbnYuZ2xvYmFsLmRlZigne30nKVxuICAgICAgdmFyIFBST0dfSUQgPSBkcmF3LmRlZihwcm9ncmFtLCAnLmlkJylcbiAgICAgIHZhciBDQUNIRURfUFJPQyA9IGRyYXcuZGVmKGRyYXdDYWNoZSwgJ1snLCBQUk9HX0lELCAnXScpXG4gICAgICBkcmF3KFxuICAgICAgICBlbnYuY29uZChDQUNIRURfUFJPQylcbiAgICAgICAgICAudGhlbihDQUNIRURfUFJPQywgJy5jYWxsKHRoaXMsYTApOycpXG4gICAgICAgICAgLmVsc2UoXG4gICAgICAgICAgICBDQUNIRURfUFJPQywgJz0nLCBkcmF3Q2FjaGUsICdbJywgUFJPR19JRCwgJ109JyxcbiAgICAgICAgICAgIGVudi5saW5rKGZ1bmN0aW9uIChwcm9ncmFtKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjcmVhdGVCb2R5KGVtaXREcmF3Qm9keSwgZW52LCBhcmdzLCBwcm9ncmFtLCAxKVxuICAgICAgICAgICAgfSksICcoJywgcHJvZ3JhbSwgJyk7JyxcbiAgICAgICAgICAgIENBQ0hFRF9QUk9DLCAnLmNhbGwodGhpcyxhMCk7JykpXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGFyZ3Muc3RhdGUpLmxlbmd0aCA+IDApIHtcbiAgICAgIGRyYXcoZW52LnNoYXJlZC5jdXJyZW50LCAnLmRpcnR5PXRydWU7JylcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJBVENIIFBST0NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIGVtaXRCYXRjaER5bmFtaWNTaGFkZXJCb2R5IChlbnYsIHNjb3BlLCBhcmdzLCBwcm9ncmFtKSB7XG4gICAgZW52LmJhdGNoSWQgPSAnYTEnXG5cbiAgICBpbmplY3RFeHRlbnNpb25zKGVudiwgc2NvcGUpXG5cbiAgICBmdW5jdGlvbiBhbGwgKCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBlbWl0QXR0cmlidXRlcyhlbnYsIHNjb3BlLCBhcmdzLCBwcm9ncmFtLmF0dHJpYnV0ZXMsIGFsbClcbiAgICBlbWl0VW5pZm9ybXMoZW52LCBzY29wZSwgYXJncywgcHJvZ3JhbS51bmlmb3JtcywgYWxsKVxuICAgIGVtaXREcmF3KGVudiwgc2NvcGUsIHNjb3BlLCBhcmdzKVxuICB9XG5cbiAgZnVuY3Rpb24gZW1pdEJhdGNoQm9keSAoZW52LCBzY29wZSwgYXJncywgcHJvZ3JhbSkge1xuICAgIGluamVjdEV4dGVuc2lvbnMoZW52LCBzY29wZSlcblxuICAgIHZhciBjb250ZXh0RHluYW1pYyA9IGFyZ3MuY29udGV4dERlcFxuXG4gICAgdmFyIEJBVENIX0lEID0gc2NvcGUuZGVmKClcbiAgICB2YXIgUFJPUF9MSVNUID0gJ2EwJ1xuICAgIHZhciBOVU1fUFJPUFMgPSAnYTEnXG4gICAgdmFyIFBST1BTID0gc2NvcGUuZGVmKClcbiAgICBlbnYuc2hhcmVkLnByb3BzID0gUFJPUFNcbiAgICBlbnYuYmF0Y2hJZCA9IEJBVENIX0lEXG5cbiAgICB2YXIgb3V0ZXIgPSBlbnYuc2NvcGUoKVxuICAgIHZhciBpbm5lciA9IGVudi5zY29wZSgpXG5cbiAgICBzY29wZShcbiAgICAgIG91dGVyLmVudHJ5LFxuICAgICAgJ2ZvcignLCBCQVRDSF9JRCwgJz0wOycsIEJBVENIX0lELCAnPCcsIE5VTV9QUk9QUywgJzsrKycsIEJBVENIX0lELCAnKXsnLFxuICAgICAgUFJPUFMsICc9JywgUFJPUF9MSVNULCAnWycsIEJBVENIX0lELCAnXTsnLFxuICAgICAgaW5uZXIsXG4gICAgICAnfScsXG4gICAgICBvdXRlci5leGl0KVxuXG4gICAgZnVuY3Rpb24gaXNJbm5lckRlZm4gKGRlZm4pIHtcbiAgICAgIHJldHVybiAoKGRlZm4uY29udGV4dERlcCAmJiBjb250ZXh0RHluYW1pYykgfHwgZGVmbi5wcm9wRGVwKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT3V0ZXJEZWZuIChkZWZuKSB7XG4gICAgICByZXR1cm4gIWlzSW5uZXJEZWZuKGRlZm4pXG4gICAgfVxuXG4gICAgaWYgKGFyZ3MubmVlZHNDb250ZXh0KSB7XG4gICAgICBlbWl0Q29udGV4dChlbnYsIGlubmVyLCBhcmdzLmNvbnRleHQpXG4gICAgfVxuICAgIGlmIChhcmdzLm5lZWRzRnJhbWVidWZmZXIpIHtcbiAgICAgIGVtaXRQb2xsRnJhbWVidWZmZXIoZW52LCBpbm5lciwgYXJncy5mcmFtZWJ1ZmZlcilcbiAgICB9XG4gICAgZW1pdFNldE9wdGlvbnMoZW52LCBpbm5lciwgYXJncy5zdGF0ZSwgaXNJbm5lckRlZm4pXG5cbiAgICBpZiAoYXJncy5wcm9maWxlICYmIGlzSW5uZXJEZWZuKGFyZ3MucHJvZmlsZSkpIHtcbiAgICAgIGVtaXRQcm9maWxlKGVudiwgaW5uZXIsIGFyZ3MsIGZhbHNlLCB0cnVlKVxuICAgIH1cblxuICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgdmFyIHByb2dDYWNoZSA9IGVudi5nbG9iYWwuZGVmKCd7fScpXG4gICAgICB2YXIgUFJPR1JBTSA9IGFyZ3Muc2hhZGVyLnByb2dWYXIuYXBwZW5kKGVudiwgaW5uZXIpXG4gICAgICB2YXIgUFJPR19JRCA9IGlubmVyLmRlZihQUk9HUkFNLCAnLmlkJylcbiAgICAgIHZhciBDQUNIRURfUFJPQyA9IGlubmVyLmRlZihwcm9nQ2FjaGUsICdbJywgUFJPR19JRCwgJ10nKVxuICAgICAgaW5uZXIoXG4gICAgICAgIGVudi5zaGFyZWQuZ2wsICcudXNlUHJvZ3JhbSgnLCBQUk9HUkFNLCAnLnByb2dyYW0pOycsXG4gICAgICAgICdpZighJywgQ0FDSEVEX1BST0MsICcpeycsXG4gICAgICAgIENBQ0hFRF9QUk9DLCAnPScsIHByb2dDYWNoZSwgJ1snLCBQUk9HX0lELCAnXT0nLFxuICAgICAgICBlbnYubGluayhmdW5jdGlvbiAocHJvZ3JhbSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVCb2R5KFxuICAgICAgICAgICAgZW1pdEJhdGNoRHluYW1pY1NoYWRlckJvZHksIGVudiwgYXJncywgcHJvZ3JhbSwgMilcbiAgICAgICAgfSksICcoJywgUFJPR1JBTSwgJyk7fScsXG4gICAgICAgIENBQ0hFRF9QUk9DLCAnLmNhbGwodGhpcyxhMFsnLCBCQVRDSF9JRCwgJ10sJywgQkFUQ0hfSUQsICcpOycpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcmdzLnVzZVZBTykge1xuICAgICAgICBpZiAoYXJncy5kcmF3VkFPKSB7XG4gICAgICAgICAgaWYgKGlzSW5uZXJEZWZuKGFyZ3MuZHJhd1ZBTykpIHtcbiAgICAgICAgICAgIC8vIHZhbyBpcyBhIHByb3BcbiAgICAgICAgICAgIGlubmVyKGVudi5zaGFyZWQudmFvLCAnLnNldFZBTygnLCBhcmdzLmRyYXdWQU8uYXBwZW5kKGVudiwgaW5uZXIpLCAnKTsnKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB2YW8gaXMgaW52YXJpYW50XG4gICAgICAgICAgICBvdXRlcihlbnYuc2hhcmVkLnZhbywgJy5zZXRWQU8oJywgYXJncy5kcmF3VkFPLmFwcGVuZChlbnYsIG91dGVyKSwgJyk7JylcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gc2NvcGVkIHZhbyBiaW5kaW5nXG4gICAgICAgICAgb3V0ZXIoZW52LnNoYXJlZC52YW8sICcuc2V0VkFPKCcsIGVudi5zaGFyZWQudmFvLCAnLnRhcmdldFZBTyk7JylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ZXIoZW52LnNoYXJlZC52YW8sICcuc2V0VkFPKG51bGwpOycpXG4gICAgICAgIGVtaXRBdHRyaWJ1dGVzKGVudiwgb3V0ZXIsIGFyZ3MsIHByb2dyYW0uYXR0cmlidXRlcywgaXNPdXRlckRlZm4pXG4gICAgICAgIGVtaXRBdHRyaWJ1dGVzKGVudiwgaW5uZXIsIGFyZ3MsIHByb2dyYW0uYXR0cmlidXRlcywgaXNJbm5lckRlZm4pXG4gICAgICB9XG4gICAgICBlbWl0VW5pZm9ybXMoZW52LCBvdXRlciwgYXJncywgcHJvZ3JhbS51bmlmb3JtcywgaXNPdXRlckRlZm4pXG4gICAgICBlbWl0VW5pZm9ybXMoZW52LCBpbm5lciwgYXJncywgcHJvZ3JhbS51bmlmb3JtcywgaXNJbm5lckRlZm4pXG4gICAgICBlbWl0RHJhdyhlbnYsIG91dGVyLCBpbm5lciwgYXJncylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbWl0QmF0Y2hQcm9jIChlbnYsIGFyZ3MpIHtcbiAgICB2YXIgYmF0Y2ggPSBlbnYucHJvYygnYmF0Y2gnLCAyKVxuICAgIGVudi5iYXRjaElkID0gJzAnXG5cbiAgICBpbmplY3RFeHRlbnNpb25zKGVudiwgYmF0Y2gpXG5cbiAgICAvLyBDaGVjayBpZiBhbnkgY29udGV4dCB2YXJpYWJsZXMgZGVwZW5kIG9uIHByb3BzXG4gICAgdmFyIGNvbnRleHREeW5hbWljID0gZmFsc2VcbiAgICB2YXIgbmVlZHNDb250ZXh0ID0gdHJ1ZVxuICAgIE9iamVjdC5rZXlzKGFyZ3MuY29udGV4dCkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgY29udGV4dER5bmFtaWMgPSBjb250ZXh0RHluYW1pYyB8fCBhcmdzLmNvbnRleHRbbmFtZV0ucHJvcERlcFxuICAgIH0pXG4gICAgaWYgKCFjb250ZXh0RHluYW1pYykge1xuICAgICAgZW1pdENvbnRleHQoZW52LCBiYXRjaCwgYXJncy5jb250ZXh0KVxuICAgICAgbmVlZHNDb250ZXh0ID0gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBmcmFtZWJ1ZmZlciBzdGF0ZSBhZmZlY3RzIGZyYW1lYnVmZmVyV2lkdGgvaGVpZ2h0IGNvbnRleHQgdmFyc1xuICAgIHZhciBmcmFtZWJ1ZmZlciA9IGFyZ3MuZnJhbWVidWZmZXJcbiAgICB2YXIgbmVlZHNGcmFtZWJ1ZmZlciA9IGZhbHNlXG4gICAgaWYgKGZyYW1lYnVmZmVyKSB7XG4gICAgICBpZiAoZnJhbWVidWZmZXIucHJvcERlcCkge1xuICAgICAgICBjb250ZXh0RHluYW1pYyA9IG5lZWRzRnJhbWVidWZmZXIgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKGZyYW1lYnVmZmVyLmNvbnRleHREZXAgJiYgY29udGV4dER5bmFtaWMpIHtcbiAgICAgICAgbmVlZHNGcmFtZWJ1ZmZlciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmICghbmVlZHNGcmFtZWJ1ZmZlcikge1xuICAgICAgICBlbWl0UG9sbEZyYW1lYnVmZmVyKGVudiwgYmF0Y2gsIGZyYW1lYnVmZmVyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0UG9sbEZyYW1lYnVmZmVyKGVudiwgYmF0Y2gsIG51bGwpXG4gICAgfVxuXG4gICAgLy8gdmlld3BvcnQgaXMgd2VpcmQgYmVjYXVzZSBpdCBjYW4gYWZmZWN0IGNvbnRleHQgdmFyc1xuICAgIGlmIChhcmdzLnN0YXRlLnZpZXdwb3J0ICYmIGFyZ3Muc3RhdGUudmlld3BvcnQucHJvcERlcCkge1xuICAgICAgY29udGV4dER5bmFtaWMgPSB0cnVlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJbm5lckRlZm4gKGRlZm4pIHtcbiAgICAgIHJldHVybiAoZGVmbi5jb250ZXh0RGVwICYmIGNvbnRleHREeW5hbWljKSB8fCBkZWZuLnByb3BEZXBcbiAgICB9XG5cbiAgICAvLyBzZXQgd2ViZ2wgb3B0aW9uc1xuICAgIGVtaXRQb2xsU3RhdGUoZW52LCBiYXRjaCwgYXJncylcbiAgICBlbWl0U2V0T3B0aW9ucyhlbnYsIGJhdGNoLCBhcmdzLnN0YXRlLCBmdW5jdGlvbiAoZGVmbikge1xuICAgICAgcmV0dXJuICFpc0lubmVyRGVmbihkZWZuKVxuICAgIH0pXG5cbiAgICBpZiAoIWFyZ3MucHJvZmlsZSB8fCAhaXNJbm5lckRlZm4oYXJncy5wcm9maWxlKSkge1xuICAgICAgZW1pdFByb2ZpbGUoZW52LCBiYXRjaCwgYXJncywgZmFsc2UsICdhMScpXG4gICAgfVxuXG4gICAgLy8gU2F2ZSB0aGVzZSB2YWx1ZXMgdG8gYXJncyBzbyB0aGF0IHRoZSBiYXRjaCBib2R5IHJvdXRpbmUgY2FuIHVzZSB0aGVtXG4gICAgYXJncy5jb250ZXh0RGVwID0gY29udGV4dER5bmFtaWNcbiAgICBhcmdzLm5lZWRzQ29udGV4dCA9IG5lZWRzQ29udGV4dFxuICAgIGFyZ3MubmVlZHNGcmFtZWJ1ZmZlciA9IG5lZWRzRnJhbWVidWZmZXJcblxuICAgIC8vIGRldGVybWluZSBpZiBzaGFkZXIgaXMgZHluYW1pY1xuICAgIHZhciBwcm9nRGVmbiA9IGFyZ3Muc2hhZGVyLnByb2dWYXJcbiAgICBpZiAoKHByb2dEZWZuLmNvbnRleHREZXAgJiYgY29udGV4dER5bmFtaWMpIHx8IHByb2dEZWZuLnByb3BEZXApIHtcbiAgICAgIGVtaXRCYXRjaEJvZHkoXG4gICAgICAgIGVudixcbiAgICAgICAgYmF0Y2gsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIG51bGwpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBQUk9HUkFNID0gcHJvZ0RlZm4uYXBwZW5kKGVudiwgYmF0Y2gpXG4gICAgICBiYXRjaChlbnYuc2hhcmVkLmdsLCAnLnVzZVByb2dyYW0oJywgUFJPR1JBTSwgJy5wcm9ncmFtKTsnKVxuICAgICAgaWYgKGFyZ3Muc2hhZGVyLnByb2dyYW0pIHtcbiAgICAgICAgZW1pdEJhdGNoQm9keShcbiAgICAgICAgICBlbnYsXG4gICAgICAgICAgYmF0Y2gsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgICBhcmdzLnNoYWRlci5wcm9ncmFtKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmF0Y2goZW52LnNoYXJlZC52YW8sICcuc2V0VkFPKG51bGwpOycpXG4gICAgICAgIHZhciBiYXRjaENhY2hlID0gZW52Lmdsb2JhbC5kZWYoJ3t9JylcbiAgICAgICAgdmFyIFBST0dfSUQgPSBiYXRjaC5kZWYoUFJPR1JBTSwgJy5pZCcpXG4gICAgICAgIHZhciBDQUNIRURfUFJPQyA9IGJhdGNoLmRlZihiYXRjaENhY2hlLCAnWycsIFBST0dfSUQsICddJylcbiAgICAgICAgYmF0Y2goXG4gICAgICAgICAgZW52LmNvbmQoQ0FDSEVEX1BST0MpXG4gICAgICAgICAgICAudGhlbihDQUNIRURfUFJPQywgJy5jYWxsKHRoaXMsYTAsYTEpOycpXG4gICAgICAgICAgICAuZWxzZShcbiAgICAgICAgICAgICAgQ0FDSEVEX1BST0MsICc9JywgYmF0Y2hDYWNoZSwgJ1snLCBQUk9HX0lELCAnXT0nLFxuICAgICAgICAgICAgICBlbnYubGluayhmdW5jdGlvbiAocHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVCb2R5KGVtaXRCYXRjaEJvZHksIGVudiwgYXJncywgcHJvZ3JhbSwgMilcbiAgICAgICAgICAgICAgfSksICcoJywgUFJPR1JBTSwgJyk7JyxcbiAgICAgICAgICAgICAgQ0FDSEVEX1BST0MsICcuY2FsbCh0aGlzLGEwLGExKTsnKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoYXJncy5zdGF0ZSkubGVuZ3RoID4gMCkge1xuICAgICAgYmF0Y2goZW52LnNoYXJlZC5jdXJyZW50LCAnLmRpcnR5PXRydWU7JylcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNDT1BFIENPTU1BTkRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBlbWl0U2NvcGVQcm9jIChlbnYsIGFyZ3MpIHtcbiAgICB2YXIgc2NvcGUgPSBlbnYucHJvYygnc2NvcGUnLCAzKVxuICAgIGVudi5iYXRjaElkID0gJ2EyJ1xuXG4gICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcbiAgICB2YXIgQ1VSUkVOVF9TVEFURSA9IHNoYXJlZC5jdXJyZW50XG5cbiAgICBlbWl0Q29udGV4dChlbnYsIHNjb3BlLCBhcmdzLmNvbnRleHQpXG5cbiAgICBpZiAoYXJncy5mcmFtZWJ1ZmZlcikge1xuICAgICAgYXJncy5mcmFtZWJ1ZmZlci5hcHBlbmQoZW52LCBzY29wZSlcbiAgICB9XG5cbiAgICBzb3J0U3RhdGUoT2JqZWN0LmtleXMoYXJncy5zdGF0ZSkpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBkZWZuID0gYXJncy5zdGF0ZVtuYW1lXVxuICAgICAgdmFyIHZhbHVlID0gZGVmbi5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICAgIHNjb3BlLnNldChlbnYubmV4dFtuYW1lXSwgJ1snICsgaSArICddJywgdilcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjb3BlLnNldChzaGFyZWQubmV4dCwgJy4nICsgbmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGVtaXRQcm9maWxlKGVudiwgc2NvcGUsIGFyZ3MsIHRydWUsIHRydWUpXG5cbiAgICA7W1NfRUxFTUVOVFMsIFNfT0ZGU0VULCBTX0NPVU5ULCBTX0lOU1RBTkNFUywgU19QUklNSVRJVkVdLmZvckVhY2goXG4gICAgICBmdW5jdGlvbiAob3B0KSB7XG4gICAgICAgIHZhciB2YXJpYWJsZSA9IGFyZ3MuZHJhd1tvcHRdXG4gICAgICAgIGlmICghdmFyaWFibGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzY29wZS5zZXQoc2hhcmVkLmRyYXcsICcuJyArIG9wdCwgJycgKyB2YXJpYWJsZS5hcHBlbmQoZW52LCBzY29wZSkpXG4gICAgICB9KVxuXG4gICAgT2JqZWN0LmtleXMoYXJncy51bmlmb3JtcykuZm9yRWFjaChmdW5jdGlvbiAob3B0KSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmdzLnVuaWZvcm1zW29wdF0uYXBwZW5kKGVudiwgc2NvcGUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSAnWycgKyB2YWx1ZS5qb2luKCkgKyAnXSdcbiAgICAgIH1cbiAgICAgIHNjb3BlLnNldChcbiAgICAgICAgc2hhcmVkLnVuaWZvcm1zLFxuICAgICAgICAnWycgKyBzdHJpbmdTdG9yZS5pZChvcHQpICsgJ10nLFxuICAgICAgICB2YWx1ZSlcbiAgICB9KVxuXG4gICAgT2JqZWN0LmtleXMoYXJncy5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgcmVjb3JkID0gYXJncy5hdHRyaWJ1dGVzW25hbWVdLmFwcGVuZChlbnYsIHNjb3BlKVxuICAgICAgdmFyIHNjb3BlQXR0cmliID0gZW52LnNjb3BlQXR0cmliKG5hbWUpXG4gICAgICBPYmplY3Qua2V5cyhuZXcgQXR0cmlidXRlUmVjb3JkKCkpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgc2NvcGUuc2V0KHNjb3BlQXR0cmliLCAnLicgKyBwcm9wLCByZWNvcmRbcHJvcF0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpZiAoYXJncy5zY29wZVZBTykge1xuICAgICAgc2NvcGUuc2V0KHNoYXJlZC52YW8sICcudGFyZ2V0VkFPJywgYXJncy5zY29wZVZBTy5hcHBlbmQoZW52LCBzY29wZSkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2F2ZVNoYWRlciAobmFtZSkge1xuICAgICAgdmFyIHNoYWRlciA9IGFyZ3Muc2hhZGVyW25hbWVdXG4gICAgICBpZiAoc2hhZGVyKSB7XG4gICAgICAgIHNjb3BlLnNldChzaGFyZWQuc2hhZGVyLCAnLicgKyBuYW1lLCBzaGFkZXIuYXBwZW5kKGVudiwgc2NvcGUpKVxuICAgICAgfVxuICAgIH1cbiAgICBzYXZlU2hhZGVyKFNfVkVSVClcbiAgICBzYXZlU2hhZGVyKFNfRlJBRylcblxuICAgIGlmIChPYmplY3Qua2V5cyhhcmdzLnN0YXRlKS5sZW5ndGggPiAwKSB7XG4gICAgICBzY29wZShDVVJSRU5UX1NUQVRFLCAnLmRpcnR5PXRydWU7JylcbiAgICAgIHNjb3BlLmV4aXQoQ1VSUkVOVF9TVEFURSwgJy5kaXJ0eT10cnVlOycpXG4gICAgfVxuXG4gICAgc2NvcGUoJ2ExKCcsIGVudi5zaGFyZWQuY29udGV4dCwgJyxhMCwnLCBlbnYuYmF0Y2hJZCwgJyk7JylcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRHluYW1pY09iamVjdCAob2JqZWN0KSB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnIHx8IGlzQXJyYXlMaWtlKG9iamVjdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgcHJvcHMgPSBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGR5bmFtaWMuaXNEeW5hbWljKG9iamVjdFtwcm9wc1tpXV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZnVuY3Rpb24gc3BsYXRPYmplY3QgKGVudiwgb3B0aW9ucywgbmFtZSkge1xuICAgIHZhciBvYmplY3QgPSBvcHRpb25zLnN0YXRpY1tuYW1lXVxuICAgIGlmICghb2JqZWN0IHx8ICFpc0R5bmFtaWNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGdsb2JhbHMgPSBlbnYuZ2xvYmFsXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgdmFyIHRoaXNEZXAgPSBmYWxzZVxuICAgIHZhciBjb250ZXh0RGVwID0gZmFsc2VcbiAgICB2YXIgcHJvcERlcCA9IGZhbHNlXG4gICAgdmFyIG9iamVjdFJlZiA9IGVudi5nbG9iYWwuZGVmKCd7fScpXG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldXG4gICAgICBpZiAoZHluYW1pYy5pc0R5bmFtaWModmFsdWUpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldID0gZHluYW1pYy51bmJveCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVwcyA9IGNyZWF0ZUR5bmFtaWNEZWNsKHZhbHVlLCBudWxsKVxuICAgICAgICB0aGlzRGVwID0gdGhpc0RlcCB8fCBkZXBzLnRoaXNEZXBcbiAgICAgICAgcHJvcERlcCA9IHByb3BEZXAgfHwgZGVwcy5wcm9wRGVwXG4gICAgICAgIGNvbnRleHREZXAgPSBjb250ZXh0RGVwIHx8IGRlcHMuY29udGV4dERlcFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2xvYmFscyhvYmplY3RSZWYsICcuJywga2V5LCAnPScpXG4gICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgIGdsb2JhbHModmFsdWUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICBnbG9iYWxzKCdcIicsIHZhbHVlLCAnXCInKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGdsb2JhbHMoJ1snLCB2YWx1ZS5qb2luKCksICddJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGdsb2JhbHMoZW52LmxpbmsodmFsdWUpKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBnbG9iYWxzKCc7JylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgZnVuY3Rpb24gYXBwZW5kQmxvY2sgKGVudiwgYmxvY2spIHtcbiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldXG4gICAgICAgIGlmICghZHluYW1pYy5pc0R5bmFtaWModmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlZiA9IGVudi5pbnZva2UoYmxvY2ssIHZhbHVlKVxuICAgICAgICBibG9jayhvYmplY3RSZWYsICcuJywga2V5LCAnPScsIHJlZiwgJzsnKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBvcHRpb25zLmR5bmFtaWNbbmFtZV0gPSBuZXcgZHluYW1pYy5EeW5hbWljVmFyaWFibGUoRFlOX1RIVU5LLCB7XG4gICAgICB0aGlzRGVwOiB0aGlzRGVwLFxuICAgICAgY29udGV4dERlcDogY29udGV4dERlcCxcbiAgICAgIHByb3BEZXA6IHByb3BEZXAsXG4gICAgICByZWY6IG9iamVjdFJlZixcbiAgICAgIGFwcGVuZDogYXBwZW5kQmxvY2tcbiAgICB9KVxuICAgIGRlbGV0ZSBvcHRpb25zLnN0YXRpY1tuYW1lXVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNQUlOIERSQVcgQ09NTUFORFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIGNvbXBpbGVDb21tYW5kIChvcHRpb25zLCBhdHRyaWJ1dGVzLCB1bmlmb3JtcywgY29udGV4dCwgc3RhdHMpIHtcbiAgICB2YXIgZW52ID0gY3JlYXRlUkVHTEVudmlyb25tZW50KClcblxuICAgIC8vIGxpbmsgc3RhdHMsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBhY2Nlc3MgaXQgaW4gdGhlIHByb2dyYW0uXG4gICAgZW52LnN0YXRzID0gZW52Lmxpbmsoc3RhdHMpXG5cbiAgICAvLyBzcGxhdCBvcHRpb25zIGFuZCBhdHRyaWJ1dGVzIHRvIGFsbG93IGZvciBkeW5hbWljIG5lc3RlZCBwcm9wZXJ0aWVzXG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcy5zdGF0aWMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgc3BsYXRPYmplY3QoZW52LCBhdHRyaWJ1dGVzLCBrZXkpXG4gICAgfSlcbiAgICBORVNURURfT1BUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBzcGxhdE9iamVjdChlbnYsIG9wdGlvbnMsIG5hbWUpXG4gICAgfSlcblxuICAgIHZhciBhcmdzID0gcGFyc2VBcmd1bWVudHMob3B0aW9ucywgYXR0cmlidXRlcywgdW5pZm9ybXMsIGNvbnRleHQsIGVudilcblxuICAgIGVtaXREcmF3UHJvYyhlbnYsIGFyZ3MpXG4gICAgZW1pdFNjb3BlUHJvYyhlbnYsIGFyZ3MpXG4gICAgZW1pdEJhdGNoUHJvYyhlbnYsIGFyZ3MpXG5cbiAgICByZXR1cm4gZXh0ZW5kKGVudi5jb21waWxlKCksIHtcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXJncy5zaGFkZXIucHJvZ3JhbS5kZXN0cm95KClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQT0xMIC8gUkVGUkVTSFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiB7XG4gICAgbmV4dDogbmV4dFN0YXRlLFxuICAgIGN1cnJlbnQ6IGN1cnJlbnRTdGF0ZSxcbiAgICBwcm9jczogKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlbnYgPSBjcmVhdGVSRUdMRW52aXJvbm1lbnQoKVxuICAgICAgdmFyIHBvbGwgPSBlbnYucHJvYygncG9sbCcpXG4gICAgICB2YXIgcmVmcmVzaCA9IGVudi5wcm9jKCdyZWZyZXNoJylcbiAgICAgIHZhciBjb21tb24gPSBlbnYuYmxvY2soKVxuICAgICAgcG9sbChjb21tb24pXG4gICAgICByZWZyZXNoKGNvbW1vbilcblxuICAgICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcbiAgICAgIHZhciBHTCA9IHNoYXJlZC5nbFxuICAgICAgdmFyIE5FWFRfU1RBVEUgPSBzaGFyZWQubmV4dFxuICAgICAgdmFyIENVUlJFTlRfU1RBVEUgPSBzaGFyZWQuY3VycmVudFxuXG4gICAgICBjb21tb24oQ1VSUkVOVF9TVEFURSwgJy5kaXJ0eT1mYWxzZTsnKVxuXG4gICAgICBlbWl0UG9sbEZyYW1lYnVmZmVyKGVudiwgcG9sbClcbiAgICAgIGVtaXRQb2xsRnJhbWVidWZmZXIoZW52LCByZWZyZXNoLCBudWxsLCB0cnVlKVxuXG4gICAgICAvLyBSZWZyZXNoIHVwZGF0ZXMgYWxsIGF0dHJpYnV0ZSBzdGF0ZSBjaGFuZ2VzXG4gICAgICB2YXIgSU5TVEFOQ0lOR1xuICAgICAgaWYgKGV4dEluc3RhbmNpbmcpIHtcbiAgICAgICAgSU5TVEFOQ0lORyA9IGVudi5saW5rKGV4dEluc3RhbmNpbmcpXG4gICAgICB9XG5cbiAgICAgIC8vIHVwZGF0ZSB2ZXJ0ZXggYXJyYXkgYmluZGluZ3NcbiAgICAgIGlmIChleHRlbnNpb25zLm9lc192ZXJ0ZXhfYXJyYXlfb2JqZWN0KSB7XG4gICAgICAgIHJlZnJlc2goZW52LmxpbmsoZXh0ZW5zaW9ucy5vZXNfdmVydGV4X2FycmF5X29iamVjdCksICcuYmluZFZlcnRleEFycmF5T0VTKG51bGwpOycpXG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbWl0cy5tYXhBdHRyaWJ1dGVzOyArK2kpIHtcbiAgICAgICAgdmFyIEJJTkRJTkcgPSByZWZyZXNoLmRlZihzaGFyZWQuYXR0cmlidXRlcywgJ1snLCBpLCAnXScpXG4gICAgICAgIHZhciBpZnRlID0gZW52LmNvbmQoQklORElORywgJy5idWZmZXInKVxuICAgICAgICBpZnRlLnRoZW4oXG4gICAgICAgICAgR0wsICcuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoJywgaSwgJyk7JyxcbiAgICAgICAgICBHTCwgJy5iaW5kQnVmZmVyKCcsXG4gICAgICAgICAgR0xfQVJSQVlfQlVGRkVSJDIsICcsJyxcbiAgICAgICAgICBCSU5ESU5HLCAnLmJ1ZmZlci5idWZmZXIpOycsXG4gICAgICAgICAgR0wsICcudmVydGV4QXR0cmliUG9pbnRlcignLFxuICAgICAgICAgIGksICcsJyxcbiAgICAgICAgICBCSU5ESU5HLCAnLnNpemUsJyxcbiAgICAgICAgICBCSU5ESU5HLCAnLnR5cGUsJyxcbiAgICAgICAgICBCSU5ESU5HLCAnLm5vcm1hbGl6ZWQsJyxcbiAgICAgICAgICBCSU5ESU5HLCAnLnN0cmlkZSwnLFxuICAgICAgICAgIEJJTkRJTkcsICcub2Zmc2V0KTsnXG4gICAgICAgICkuZWxzZShcbiAgICAgICAgICBHTCwgJy5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoJywgaSwgJyk7JyxcbiAgICAgICAgICBHTCwgJy52ZXJ0ZXhBdHRyaWI0ZignLFxuICAgICAgICAgIGksICcsJyxcbiAgICAgICAgICBCSU5ESU5HLCAnLngsJyxcbiAgICAgICAgICBCSU5ESU5HLCAnLnksJyxcbiAgICAgICAgICBCSU5ESU5HLCAnLnosJyxcbiAgICAgICAgICBCSU5ESU5HLCAnLncpOycsXG4gICAgICAgICAgQklORElORywgJy5idWZmZXI9bnVsbDsnKVxuICAgICAgICByZWZyZXNoKGlmdGUpXG4gICAgICAgIGlmIChleHRJbnN0YW5jaW5nKSB7XG4gICAgICAgICAgcmVmcmVzaChcbiAgICAgICAgICAgIElOU1RBTkNJTkcsICcudmVydGV4QXR0cmliRGl2aXNvckFOR0xFKCcsXG4gICAgICAgICAgICBpLCAnLCcsXG4gICAgICAgICAgICBCSU5ESU5HLCAnLmRpdmlzb3IpOycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZnJlc2goXG4gICAgICAgIGVudi5zaGFyZWQudmFvLCAnLmN1cnJlbnRWQU89bnVsbDsnLFxuICAgICAgICBlbnYuc2hhcmVkLnZhbywgJy5zZXRWQU8oJywgZW52LnNoYXJlZC52YW8sICcudGFyZ2V0VkFPKTsnKVxuXG4gICAgICBPYmplY3Qua2V5cyhHTF9GTEFHUykuZm9yRWFjaChmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgY2FwID0gR0xfRkxBR1NbZmxhZ11cbiAgICAgICAgdmFyIE5FWFQgPSBjb21tb24uZGVmKE5FWFRfU1RBVEUsICcuJywgZmxhZylcbiAgICAgICAgdmFyIGJsb2NrID0gZW52LmJsb2NrKClcbiAgICAgICAgYmxvY2soJ2lmKCcsIE5FWFQsICcpeycsXG4gICAgICAgICAgR0wsICcuZW5hYmxlKCcsIGNhcCwgJyl9ZWxzZXsnLFxuICAgICAgICAgIEdMLCAnLmRpc2FibGUoJywgY2FwLCAnKX0nLFxuICAgICAgICAgIENVUlJFTlRfU1RBVEUsICcuJywgZmxhZywgJz0nLCBORVhULCAnOycpXG4gICAgICAgIHJlZnJlc2goYmxvY2spXG4gICAgICAgIHBvbGwoXG4gICAgICAgICAgJ2lmKCcsIE5FWFQsICchPT0nLCBDVVJSRU5UX1NUQVRFLCAnLicsIGZsYWcsICcpeycsXG4gICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgJ30nKVxuICAgICAgfSlcblxuICAgICAgT2JqZWN0LmtleXMoR0xfVkFSSUFCTEVTKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBmdW5jID0gR0xfVkFSSUFCTEVTW25hbWVdXG4gICAgICAgIHZhciBpbml0ID0gY3VycmVudFN0YXRlW25hbWVdXG4gICAgICAgIHZhciBORVhULCBDVVJSRU5UXG4gICAgICAgIHZhciBibG9jayA9IGVudi5ibG9jaygpXG4gICAgICAgIGJsb2NrKEdMLCAnLicsIGZ1bmMsICcoJylcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGluaXQpKSB7XG4gICAgICAgICAgdmFyIG4gPSBpbml0Lmxlbmd0aFxuICAgICAgICAgIE5FWFQgPSBlbnYuZ2xvYmFsLmRlZihORVhUX1NUQVRFLCAnLicsIG5hbWUpXG4gICAgICAgICAgQ1VSUkVOVCA9IGVudi5nbG9iYWwuZGVmKENVUlJFTlRfU1RBVEUsICcuJywgbmFtZSlcbiAgICAgICAgICBibG9jayhcbiAgICAgICAgICAgIGxvb3AobiwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIE5FWFQgKyAnWycgKyBpICsgJ10nXG4gICAgICAgICAgICB9KSwgJyk7JyxcbiAgICAgICAgICAgIGxvb3AobiwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIENVUlJFTlQgKyAnWycgKyBpICsgJ109JyArIE5FWFQgKyAnWycgKyBpICsgJ107J1xuICAgICAgICAgICAgfSkuam9pbignJykpXG4gICAgICAgICAgcG9sbChcbiAgICAgICAgICAgICdpZignLCBsb29wKG4sIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBORVhUICsgJ1snICsgaSArICddIT09JyArIENVUlJFTlQgKyAnWycgKyBpICsgJ10nXG4gICAgICAgICAgICB9KS5qb2luKCd8fCcpLCAnKXsnLFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICAnfScpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTkVYVCA9IGNvbW1vbi5kZWYoTkVYVF9TVEFURSwgJy4nLCBuYW1lKVxuICAgICAgICAgIENVUlJFTlQgPSBjb21tb24uZGVmKENVUlJFTlRfU1RBVEUsICcuJywgbmFtZSlcbiAgICAgICAgICBibG9jayhcbiAgICAgICAgICAgIE5FWFQsICcpOycsXG4gICAgICAgICAgICBDVVJSRU5UX1NUQVRFLCAnLicsIG5hbWUsICc9JywgTkVYVCwgJzsnKVxuICAgICAgICAgIHBvbGwoXG4gICAgICAgICAgICAnaWYoJywgTkVYVCwgJyE9PScsIENVUlJFTlQsICcpeycsXG4gICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgICd9JylcbiAgICAgICAgfVxuICAgICAgICByZWZyZXNoKGJsb2NrKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGVudi5jb21waWxlKClcbiAgICB9KSgpLFxuICAgIGNvbXBpbGU6IGNvbXBpbGVDb21tYW5kXG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhdHMgKCkge1xuICByZXR1cm4ge1xuICAgIHZhb0NvdW50OiAwLFxuICAgIGJ1ZmZlckNvdW50OiAwLFxuICAgIGVsZW1lbnRzQ291bnQ6IDAsXG4gICAgZnJhbWVidWZmZXJDb3VudDogMCxcbiAgICBzaGFkZXJDb3VudDogMCxcbiAgICB0ZXh0dXJlQ291bnQ6IDAsXG4gICAgY3ViZUNvdW50OiAwLFxuICAgIHJlbmRlcmJ1ZmZlckNvdW50OiAwLFxuICAgIG1heFRleHR1cmVVbml0czogMFxuICB9XG59XG5cbnZhciBHTF9RVUVSWV9SRVNVTFRfRVhUID0gMHg4ODY2XG52YXIgR0xfUVVFUllfUkVTVUxUX0FWQUlMQUJMRV9FWFQgPSAweDg4NjdcbnZhciBHTF9USU1FX0VMQVBTRURfRVhUID0gMHg4OEJGXG5cbnZhciBjcmVhdGVUaW1lciA9IGZ1bmN0aW9uIChnbCwgZXh0ZW5zaW9ucykge1xuICBpZiAoIWV4dGVuc2lvbnMuZXh0X2Rpc2pvaW50X3RpbWVyX3F1ZXJ5KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIFFVRVJZIFBPT0wgQkVHSU5cbiAgdmFyIHF1ZXJ5UG9vbCA9IFtdXG4gIGZ1bmN0aW9uIGFsbG9jUXVlcnkgKCkge1xuICAgIHJldHVybiBxdWVyeVBvb2wucG9wKCkgfHwgZXh0ZW5zaW9ucy5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkuY3JlYXRlUXVlcnlFWFQoKVxuICB9XG4gIGZ1bmN0aW9uIGZyZWVRdWVyeSAocXVlcnkpIHtcbiAgICBxdWVyeVBvb2wucHVzaChxdWVyeSlcbiAgfVxuICAvLyBRVUVSWSBQT09MIEVORFxuXG4gIHZhciBwZW5kaW5nUXVlcmllcyA9IFtdXG4gIGZ1bmN0aW9uIGJlZ2luUXVlcnkgKHN0YXRzKSB7XG4gICAgdmFyIHF1ZXJ5ID0gYWxsb2NRdWVyeSgpXG4gICAgZXh0ZW5zaW9ucy5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkuYmVnaW5RdWVyeUVYVChHTF9USU1FX0VMQVBTRURfRVhULCBxdWVyeSlcbiAgICBwZW5kaW5nUXVlcmllcy5wdXNoKHF1ZXJ5KVxuICAgIHB1c2hTY29wZVN0YXRzKHBlbmRpbmdRdWVyaWVzLmxlbmd0aCAtIDEsIHBlbmRpbmdRdWVyaWVzLmxlbmd0aCwgc3RhdHMpXG4gIH1cblxuICBmdW5jdGlvbiBlbmRRdWVyeSAoKSB7XG4gICAgZXh0ZW5zaW9ucy5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkuZW5kUXVlcnlFWFQoR0xfVElNRV9FTEFQU0VEX0VYVClcbiAgfVxuXG4gIC8vXG4gIC8vIFBlbmRpbmcgc3RhdHMgcG9vbC5cbiAgLy9cbiAgZnVuY3Rpb24gUGVuZGluZ1N0YXRzICgpIHtcbiAgICB0aGlzLnN0YXJ0UXVlcnlJbmRleCA9IC0xXG4gICAgdGhpcy5lbmRRdWVyeUluZGV4ID0gLTFcbiAgICB0aGlzLnN1bSA9IDBcbiAgICB0aGlzLnN0YXRzID0gbnVsbFxuICB9XG4gIHZhciBwZW5kaW5nU3RhdHNQb29sID0gW11cbiAgZnVuY3Rpb24gYWxsb2NQZW5kaW5nU3RhdHMgKCkge1xuICAgIHJldHVybiBwZW5kaW5nU3RhdHNQb29sLnBvcCgpIHx8IG5ldyBQZW5kaW5nU3RhdHMoKVxuICB9XG4gIGZ1bmN0aW9uIGZyZWVQZW5kaW5nU3RhdHMgKHBlbmRpbmdTdGF0cykge1xuICAgIHBlbmRpbmdTdGF0c1Bvb2wucHVzaChwZW5kaW5nU3RhdHMpXG4gIH1cbiAgLy8gUGVuZGluZyBzdGF0cyBwb29sIGVuZFxuXG4gIHZhciBwZW5kaW5nU3RhdHMgPSBbXVxuICBmdW5jdGlvbiBwdXNoU2NvcGVTdGF0cyAoc3RhcnQsIGVuZCwgc3RhdHMpIHtcbiAgICB2YXIgcHMgPSBhbGxvY1BlbmRpbmdTdGF0cygpXG4gICAgcHMuc3RhcnRRdWVyeUluZGV4ID0gc3RhcnRcbiAgICBwcy5lbmRRdWVyeUluZGV4ID0gZW5kXG4gICAgcHMuc3VtID0gMFxuICAgIHBzLnN0YXRzID0gc3RhdHNcbiAgICBwZW5kaW5nU3RhdHMucHVzaChwcylcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBjYWxsIHRoaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUsXG4gIC8vIGluIG9yZGVyIHRvIHVwZGF0ZSBncHVUaW1lXG4gIHZhciB0aW1lU3VtID0gW11cbiAgdmFyIHF1ZXJ5UHRyID0gW11cbiAgZnVuY3Rpb24gdXBkYXRlICgpIHtcbiAgICB2YXIgcHRyLCBpXG5cbiAgICB2YXIgbiA9IHBlbmRpbmdRdWVyaWVzLmxlbmd0aFxuICAgIGlmIChuID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBSZXNlcnZlIHNwYWNlXG4gICAgcXVlcnlQdHIubGVuZ3RoID0gTWF0aC5tYXgocXVlcnlQdHIubGVuZ3RoLCBuICsgMSlcbiAgICB0aW1lU3VtLmxlbmd0aCA9IE1hdGgubWF4KHRpbWVTdW0ubGVuZ3RoLCBuICsgMSlcbiAgICB0aW1lU3VtWzBdID0gMFxuICAgIHF1ZXJ5UHRyWzBdID0gMFxuXG4gICAgLy8gVXBkYXRlIGFsbCBwZW5kaW5nIHRpbWVyIHF1ZXJpZXNcbiAgICB2YXIgcXVlcnlUaW1lID0gMFxuICAgIHB0ciA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGVuZGluZ1F1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxdWVyeSA9IHBlbmRpbmdRdWVyaWVzW2ldXG4gICAgICBpZiAoZXh0ZW5zaW9ucy5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkuZ2V0UXVlcnlPYmplY3RFWFQocXVlcnksIEdMX1FVRVJZX1JFU1VMVF9BVkFJTEFCTEVfRVhUKSkge1xuICAgICAgICBxdWVyeVRpbWUgKz0gZXh0ZW5zaW9ucy5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkuZ2V0UXVlcnlPYmplY3RFWFQocXVlcnksIEdMX1FVRVJZX1JFU1VMVF9FWFQpXG4gICAgICAgIGZyZWVRdWVyeShxdWVyeSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlbmRpbmdRdWVyaWVzW3B0cisrXSA9IHF1ZXJ5XG4gICAgICB9XG4gICAgICB0aW1lU3VtW2kgKyAxXSA9IHF1ZXJ5VGltZVxuICAgICAgcXVlcnlQdHJbaSArIDFdID0gcHRyXG4gICAgfVxuICAgIHBlbmRpbmdRdWVyaWVzLmxlbmd0aCA9IHB0clxuXG4gICAgLy8gVXBkYXRlIGFsbCBwZW5kaW5nIHN0YXQgcXVlcmllc1xuICAgIHB0ciA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGVuZGluZ1N0YXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgc3RhdHMgPSBwZW5kaW5nU3RhdHNbaV1cbiAgICAgIHZhciBzdGFydCA9IHN0YXRzLnN0YXJ0UXVlcnlJbmRleFxuICAgICAgdmFyIGVuZCA9IHN0YXRzLmVuZFF1ZXJ5SW5kZXhcbiAgICAgIHN0YXRzLnN1bSArPSB0aW1lU3VtW2VuZF0gLSB0aW1lU3VtW3N0YXJ0XVxuICAgICAgdmFyIHN0YXJ0UHRyID0gcXVlcnlQdHJbc3RhcnRdXG4gICAgICB2YXIgZW5kUHRyID0gcXVlcnlQdHJbZW5kXVxuICAgICAgaWYgKGVuZFB0ciA9PT0gc3RhcnRQdHIpIHtcbiAgICAgICAgc3RhdHMuc3RhdHMuZ3B1VGltZSArPSBzdGF0cy5zdW0gLyAxZTZcbiAgICAgICAgZnJlZVBlbmRpbmdTdGF0cyhzdGF0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRzLnN0YXJ0UXVlcnlJbmRleCA9IHN0YXJ0UHRyXG4gICAgICAgIHN0YXRzLmVuZFF1ZXJ5SW5kZXggPSBlbmRQdHJcbiAgICAgICAgcGVuZGluZ1N0YXRzW3B0cisrXSA9IHN0YXRzXG4gICAgICB9XG4gICAgfVxuICAgIHBlbmRpbmdTdGF0cy5sZW5ndGggPSBwdHJcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmVnaW5RdWVyeTogYmVnaW5RdWVyeSxcbiAgICBlbmRRdWVyeTogZW5kUXVlcnksXG4gICAgcHVzaFNjb3BlU3RhdHM6IHB1c2hTY29wZVN0YXRzLFxuICAgIHVwZGF0ZTogdXBkYXRlLFxuICAgIGdldE51bVBlbmRpbmdRdWVyaWVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcGVuZGluZ1F1ZXJpZXMubGVuZ3RoXG4gICAgfSxcbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgcXVlcnlQb29sLnB1c2guYXBwbHkocXVlcnlQb29sLCBwZW5kaW5nUXVlcmllcylcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlcnlQb29sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGV4dGVuc2lvbnMuZXh0X2Rpc2pvaW50X3RpbWVyX3F1ZXJ5LmRlbGV0ZVF1ZXJ5RVhUKHF1ZXJ5UG9vbFtpXSlcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdRdWVyaWVzLmxlbmd0aCA9IDBcbiAgICAgIHF1ZXJ5UG9vbC5sZW5ndGggPSAwXG4gICAgfSxcbiAgICByZXN0b3JlOiBmdW5jdGlvbiAoKSB7XG4gICAgICBwZW5kaW5nUXVlcmllcy5sZW5ndGggPSAwXG4gICAgICBxdWVyeVBvb2wubGVuZ3RoID0gMFxuICAgIH1cbiAgfVxufVxuXG52YXIgR0xfQ09MT1JfQlVGRkVSX0JJVCA9IDE2Mzg0XG52YXIgR0xfREVQVEhfQlVGRkVSX0JJVCA9IDI1NlxudmFyIEdMX1NURU5DSUxfQlVGRkVSX0JJVCA9IDEwMjRcblxudmFyIEdMX0FSUkFZX0JVRkZFUiA9IDM0OTYyXG5cbnZhciBDT05URVhUX0xPU1RfRVZFTlQgPSAnd2ViZ2xjb250ZXh0bG9zdCdcbnZhciBDT05URVhUX1JFU1RPUkVEX0VWRU5UID0gJ3dlYmdsY29udGV4dHJlc3RvcmVkJ1xuXG52YXIgRFlOX1BST1AgPSAxXG52YXIgRFlOX0NPTlRFWFQgPSAyXG52YXIgRFlOX1NUQVRFID0gM1xuXG5mdW5jdGlvbiBmaW5kIChoYXlzdGFjaywgbmVlZGxlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaGF5c3RhY2subGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoaGF5c3RhY2tbaV0gPT09IG5lZWRsZSkge1xuICAgICAgcmV0dXJuIGlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xXG59XG5cbmZ1bmN0aW9uIHdyYXBSRUdMIChhcmdzKSB7XG4gIHZhciBjb25maWcgPSBwYXJzZUFyZ3MoYXJncylcbiAgaWYgKCFjb25maWcpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgdmFyIGdsID0gY29uZmlnLmdsXG4gIHZhciBnbEF0dHJpYnV0ZXMgPSBnbC5nZXRDb250ZXh0QXR0cmlidXRlcygpXG4gIHZhciBjb250ZXh0TG9zdCA9IGdsLmlzQ29udGV4dExvc3QoKVxuXG4gIHZhciBleHRlbnNpb25TdGF0ZSA9IGNyZWF0ZUV4dGVuc2lvbkNhY2hlKGdsLCBjb25maWcpXG4gIGlmICghZXh0ZW5zaW9uU3RhdGUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgdmFyIHN0cmluZ1N0b3JlID0gY3JlYXRlU3RyaW5nU3RvcmUoKVxuICB2YXIgc3RhdHMkJDEgPSBzdGF0cygpXG4gIHZhciBleHRlbnNpb25zID0gZXh0ZW5zaW9uU3RhdGUuZXh0ZW5zaW9uc1xuICB2YXIgdGltZXIgPSBjcmVhdGVUaW1lcihnbCwgZXh0ZW5zaW9ucylcblxuICB2YXIgU1RBUlRfVElNRSA9IGNsb2NrKClcbiAgdmFyIFdJRFRIID0gZ2wuZHJhd2luZ0J1ZmZlcldpZHRoXG4gIHZhciBIRUlHSFQgPSBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XG5cbiAgdmFyIGNvbnRleHRTdGF0ZSA9IHtcbiAgICB0aWNrOiAwLFxuICAgIHRpbWU6IDAsXG4gICAgdmlld3BvcnRXaWR0aDogV0lEVEgsXG4gICAgdmlld3BvcnRIZWlnaHQ6IEhFSUdIVCxcbiAgICBmcmFtZWJ1ZmZlcldpZHRoOiBXSURUSCxcbiAgICBmcmFtZWJ1ZmZlckhlaWdodDogSEVJR0hULFxuICAgIGRyYXdpbmdCdWZmZXJXaWR0aDogV0lEVEgsXG4gICAgZHJhd2luZ0J1ZmZlckhlaWdodDogSEVJR0hULFxuICAgIHBpeGVsUmF0aW86IGNvbmZpZy5waXhlbFJhdGlvXG4gIH1cbiAgdmFyIHVuaWZvcm1TdGF0ZSA9IHt9XG4gIHZhciBkcmF3U3RhdGUgPSB7XG4gICAgZWxlbWVudHM6IG51bGwsXG4gICAgcHJpbWl0aXZlOiA0LCAvLyBHTF9UUklBTkdMRVNcbiAgICBjb3VudDogLTEsXG4gICAgb2Zmc2V0OiAwLFxuICAgIGluc3RhbmNlczogLTFcbiAgfVxuXG4gIHZhciBsaW1pdHMgPSB3cmFwTGltaXRzKGdsLCBleHRlbnNpb25zKVxuICB2YXIgYnVmZmVyU3RhdGUgPSB3cmFwQnVmZmVyU3RhdGUoXG4gICAgZ2wsXG4gICAgc3RhdHMkJDEsXG4gICAgY29uZmlnLFxuICAgIGRlc3Ryb3lCdWZmZXIpXG4gIHZhciBhdHRyaWJ1dGVTdGF0ZSA9IHdyYXBBdHRyaWJ1dGVTdGF0ZShcbiAgICBnbCxcbiAgICBleHRlbnNpb25zLFxuICAgIGxpbWl0cyxcbiAgICBzdGF0cyQkMSxcbiAgICBidWZmZXJTdGF0ZSlcbiAgZnVuY3Rpb24gZGVzdHJveUJ1ZmZlciAoYnVmZmVyKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVN0YXRlLmRlc3Ryb3lCdWZmZXIoYnVmZmVyKVxuICB9XG4gIHZhciBlbGVtZW50U3RhdGUgPSB3cmFwRWxlbWVudHNTdGF0ZShnbCwgZXh0ZW5zaW9ucywgYnVmZmVyU3RhdGUsIHN0YXRzJCQxKVxuICB2YXIgc2hhZGVyU3RhdGUgPSB3cmFwU2hhZGVyU3RhdGUoZ2wsIHN0cmluZ1N0b3JlLCBzdGF0cyQkMSwgY29uZmlnKVxuICB2YXIgdGV4dHVyZVN0YXRlID0gY3JlYXRlVGV4dHVyZVNldChcbiAgICBnbCxcbiAgICBleHRlbnNpb25zLFxuICAgIGxpbWl0cyxcbiAgICBmdW5jdGlvbiAoKSB7IGNvcmUucHJvY3MucG9sbCgpIH0sXG4gICAgY29udGV4dFN0YXRlLFxuICAgIHN0YXRzJCQxLFxuICAgIGNvbmZpZylcbiAgdmFyIHJlbmRlcmJ1ZmZlclN0YXRlID0gd3JhcFJlbmRlcmJ1ZmZlcnMoZ2wsIGV4dGVuc2lvbnMsIGxpbWl0cywgc3RhdHMkJDEsIGNvbmZpZylcbiAgdmFyIGZyYW1lYnVmZmVyU3RhdGUgPSB3cmFwRkJPU3RhdGUoXG4gICAgZ2wsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICBsaW1pdHMsXG4gICAgdGV4dHVyZVN0YXRlLFxuICAgIHJlbmRlcmJ1ZmZlclN0YXRlLFxuICAgIHN0YXRzJCQxKVxuICB2YXIgY29yZSA9IHJlZ2xDb3JlKFxuICAgIGdsLFxuICAgIHN0cmluZ1N0b3JlLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgbGltaXRzLFxuICAgIGJ1ZmZlclN0YXRlLFxuICAgIGVsZW1lbnRTdGF0ZSxcbiAgICB0ZXh0dXJlU3RhdGUsXG4gICAgZnJhbWVidWZmZXJTdGF0ZSxcbiAgICB1bmlmb3JtU3RhdGUsXG4gICAgYXR0cmlidXRlU3RhdGUsXG4gICAgc2hhZGVyU3RhdGUsXG4gICAgZHJhd1N0YXRlLFxuICAgIGNvbnRleHRTdGF0ZSxcbiAgICB0aW1lcixcbiAgICBjb25maWcpXG4gIHZhciByZWFkUGl4ZWxzID0gd3JhcFJlYWRQaXhlbHMoXG4gICAgZ2wsXG4gICAgZnJhbWVidWZmZXJTdGF0ZSxcbiAgICBjb3JlLnByb2NzLnBvbGwsXG4gICAgY29udGV4dFN0YXRlLFxuICAgIGdsQXR0cmlidXRlcywgZXh0ZW5zaW9ucywgbGltaXRzKVxuXG4gIHZhciBuZXh0U3RhdGUgPSBjb3JlLm5leHRcbiAgdmFyIGNhbnZhcyA9IGdsLmNhbnZhc1xuXG4gIHZhciByYWZDYWxsYmFja3MgPSBbXVxuICB2YXIgbG9zc0NhbGxiYWNrcyA9IFtdXG4gIHZhciByZXN0b3JlQ2FsbGJhY2tzID0gW11cbiAgdmFyIGRlc3Ryb3lDYWxsYmFja3MgPSBbY29uZmlnLm9uRGVzdHJveV1cblxuICB2YXIgYWN0aXZlUkFGID0gbnVsbFxuICBmdW5jdGlvbiBoYW5kbGVSQUYgKCkge1xuICAgIGlmIChyYWZDYWxsYmFja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgdGltZXIudXBkYXRlKClcbiAgICAgIH1cbiAgICAgIGFjdGl2ZVJBRiA9IG51bGxcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHNjaGVkdWxlIG5leHQgYW5pbWF0aW9uIGZyYW1lXG4gICAgYWN0aXZlUkFGID0gcmFmLm5leHQoaGFuZGxlUkFGKVxuXG4gICAgLy8gcG9sbCBmb3IgY2hhbmdlc1xuICAgIHBvbGwoKVxuXG4gICAgLy8gZmlyZSBhIGNhbGxiYWNrIGZvciBhbGwgcGVuZGluZyByYWZzXG4gICAgZm9yICh2YXIgaSA9IHJhZkNhbGxiYWNrcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdmFyIGNiID0gcmFmQ2FsbGJhY2tzW2ldXG4gICAgICBpZiAoY2IpIHtcbiAgICAgICAgY2IoY29udGV4dFN0YXRlLCBudWxsLCAwKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZsdXNoIGFsbCBwZW5kaW5nIHdlYmdsIGNhbGxzXG4gICAgZ2wuZmx1c2goKVxuXG4gICAgLy8gcG9sbCBHUFUgdGltZXJzICphZnRlciogZ2wuZmx1c2ggc28gd2UgZG9uJ3QgZGVsYXkgY29tbWFuZCBkaXNwYXRjaFxuICAgIGlmICh0aW1lcikge1xuICAgICAgdGltZXIudXBkYXRlKClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydFJBRiAoKSB7XG4gICAgaWYgKCFhY3RpdmVSQUYgJiYgcmFmQ2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFjdGl2ZVJBRiA9IHJhZi5uZXh0KGhhbmRsZVJBRilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wUkFGICgpIHtcbiAgICBpZiAoYWN0aXZlUkFGKSB7XG4gICAgICByYWYuY2FuY2VsKGhhbmRsZVJBRilcbiAgICAgIGFjdGl2ZVJBRiA9IG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVDb250ZXh0TG9zcyAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAvLyBzZXQgY29udGV4dCBsb3N0IGZsYWdcbiAgICBjb250ZXh0TG9zdCA9IHRydWVcblxuICAgIC8vIHBhdXNlIHJlcXVlc3QgYW5pbWF0aW9uIGZyYW1lXG4gICAgc3RvcFJBRigpXG5cbiAgICAvLyBsb3NlIGNvbnRleHRcbiAgICBsb3NzQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7XG4gICAgICBjYigpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNvbnRleHRSZXN0b3JlZCAoZXZlbnQpIHtcbiAgICAvLyBjbGVhciBlcnJvciBjb2RlXG4gICAgZ2wuZ2V0RXJyb3IoKVxuXG4gICAgLy8gY2xlYXIgY29udGV4dCBsb3N0IGZsYWdcbiAgICBjb250ZXh0TG9zdCA9IGZhbHNlXG5cbiAgICAvLyByZWZyZXNoIHN0YXRlXG4gICAgZXh0ZW5zaW9uU3RhdGUucmVzdG9yZSgpXG4gICAgc2hhZGVyU3RhdGUucmVzdG9yZSgpXG4gICAgYnVmZmVyU3RhdGUucmVzdG9yZSgpXG4gICAgdGV4dHVyZVN0YXRlLnJlc3RvcmUoKVxuICAgIHJlbmRlcmJ1ZmZlclN0YXRlLnJlc3RvcmUoKVxuICAgIGZyYW1lYnVmZmVyU3RhdGUucmVzdG9yZSgpXG4gICAgYXR0cmlidXRlU3RhdGUucmVzdG9yZSgpXG4gICAgaWYgKHRpbWVyKSB7XG4gICAgICB0aW1lci5yZXN0b3JlKClcbiAgICB9XG5cbiAgICAvLyByZWZyZXNoIHN0YXRlXG4gICAgY29yZS5wcm9jcy5yZWZyZXNoKClcblxuICAgIC8vIHJlc3RhcnQgUkFGXG4gICAgc3RhcnRSQUYoKVxuXG4gICAgLy8gcmVzdG9yZSBjb250ZXh0XG4gICAgcmVzdG9yZUNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgY2IoKVxuICAgIH0pXG4gIH1cblxuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoQ09OVEVYVF9MT1NUX0VWRU5ULCBoYW5kbGVDb250ZXh0TG9zcywgZmFsc2UpXG4gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoQ09OVEVYVF9SRVNUT1JFRF9FVkVOVCwgaGFuZGxlQ29udGV4dFJlc3RvcmVkLCBmYWxzZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3kgKCkge1xuICAgIHJhZkNhbGxiYWNrcy5sZW5ndGggPSAwXG4gICAgc3RvcFJBRigpXG5cbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICBjYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihDT05URVhUX0xPU1RfRVZFTlQsIGhhbmRsZUNvbnRleHRMb3NzKVxuICAgICAgY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoQ09OVEVYVF9SRVNUT1JFRF9FVkVOVCwgaGFuZGxlQ29udGV4dFJlc3RvcmVkKVxuICAgIH1cblxuICAgIHNoYWRlclN0YXRlLmNsZWFyKClcbiAgICBmcmFtZWJ1ZmZlclN0YXRlLmNsZWFyKClcbiAgICByZW5kZXJidWZmZXJTdGF0ZS5jbGVhcigpXG4gICAgdGV4dHVyZVN0YXRlLmNsZWFyKClcbiAgICBlbGVtZW50U3RhdGUuY2xlYXIoKVxuICAgIGJ1ZmZlclN0YXRlLmNsZWFyKClcbiAgICBhdHRyaWJ1dGVTdGF0ZS5jbGVhcigpXG5cbiAgICBpZiAodGltZXIpIHtcbiAgICAgIHRpbWVyLmNsZWFyKClcbiAgICB9XG5cbiAgICBkZXN0cm95Q2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7XG4gICAgICBjYigpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBpbGVQcm9jZWR1cmUgKG9wdGlvbnMpIHtcbiAgICBjaGVjayQxKCEhb3B0aW9ucywgJ2ludmFsaWQgYXJncyB0byByZWdsKHsuLi59KScpXG4gICAgY2hlY2skMS50eXBlKG9wdGlvbnMsICdvYmplY3QnLCAnaW52YWxpZCBhcmdzIHRvIHJlZ2woey4uLn0pJylcblxuICAgIGZ1bmN0aW9uIGZsYXR0ZW5OZXN0ZWRPcHRpb25zIChvcHRpb25zKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZXh0ZW5kKHt9LCBvcHRpb25zKVxuICAgICAgZGVsZXRlIHJlc3VsdC51bmlmb3Jtc1xuICAgICAgZGVsZXRlIHJlc3VsdC5hdHRyaWJ1dGVzXG4gICAgICBkZWxldGUgcmVzdWx0LmNvbnRleHRcbiAgICAgIGRlbGV0ZSByZXN1bHQudmFvXG5cbiAgICAgIGlmICgnc3RlbmNpbCcgaW4gcmVzdWx0ICYmIHJlc3VsdC5zdGVuY2lsLm9wKSB7XG4gICAgICAgIHJlc3VsdC5zdGVuY2lsLm9wQmFjayA9IHJlc3VsdC5zdGVuY2lsLm9wRnJvbnQgPSByZXN1bHQuc3RlbmNpbC5vcFxuICAgICAgICBkZWxldGUgcmVzdWx0LnN0ZW5jaWwub3BcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbWVyZ2UgKG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gcmVzdWx0W25hbWVdXG4gICAgICAgICAgZGVsZXRlIHJlc3VsdFtuYW1lXVxuICAgICAgICAgIE9iamVjdC5rZXlzKGNoaWxkKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICByZXN1bHRbbmFtZSArICcuJyArIHByb3BdID0gY2hpbGRbcHJvcF1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtZXJnZSgnYmxlbmQnKVxuICAgICAgbWVyZ2UoJ2RlcHRoJylcbiAgICAgIG1lcmdlKCdjdWxsJylcbiAgICAgIG1lcmdlKCdzdGVuY2lsJylcbiAgICAgIG1lcmdlKCdwb2x5Z29uT2Zmc2V0JylcbiAgICAgIG1lcmdlKCdzY2lzc29yJylcbiAgICAgIG1lcmdlKCdzYW1wbGUnKVxuXG4gICAgICBpZiAoJ3ZhbycgaW4gb3B0aW9ucykge1xuICAgICAgICByZXN1bHQudmFvID0gb3B0aW9ucy52YW9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNlcGFyYXRlRHluYW1pYyAob2JqZWN0LCB1c2VBcnJheXMpIHtcbiAgICAgIHZhciBzdGF0aWNJdGVtcyA9IHt9XG4gICAgICB2YXIgZHluYW1pY0l0ZW1zID0ge31cbiAgICAgIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaChmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtvcHRpb25dXG4gICAgICAgIGlmIChkeW5hbWljLmlzRHluYW1pYyh2YWx1ZSkpIHtcbiAgICAgICAgICBkeW5hbWljSXRlbXNbb3B0aW9uXSA9IGR5bmFtaWMudW5ib3godmFsdWUsIG9wdGlvbilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfSBlbHNlIGlmICh1c2VBcnJheXMgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoZHluYW1pYy5pc0R5bmFtaWModmFsdWVbaV0pKSB7XG4gICAgICAgICAgICAgIGR5bmFtaWNJdGVtc1tvcHRpb25dID0gZHluYW1pYy51bmJveCh2YWx1ZSwgb3B0aW9uKVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljSXRlbXNbb3B0aW9uXSA9IHZhbHVlXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZHluYW1pYzogZHluYW1pY0l0ZW1zLFxuICAgICAgICBzdGF0aWM6IHN0YXRpY0l0ZW1zXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJlYXQgY29udGV4dCB2YXJpYWJsZXMgc2VwYXJhdGUgZnJvbSBvdGhlciBkeW5hbWljIHZhcmlhYmxlc1xuICAgIHZhciBjb250ZXh0ID0gc2VwYXJhdGVEeW5hbWljKG9wdGlvbnMuY29udGV4dCB8fCB7fSwgdHJ1ZSlcbiAgICB2YXIgdW5pZm9ybXMgPSBzZXBhcmF0ZUR5bmFtaWMob3B0aW9ucy51bmlmb3JtcyB8fCB7fSwgdHJ1ZSlcbiAgICB2YXIgYXR0cmlidXRlcyA9IHNlcGFyYXRlRHluYW1pYyhvcHRpb25zLmF0dHJpYnV0ZXMgfHwge30sIGZhbHNlKVxuICAgIHZhciBvcHRzID0gc2VwYXJhdGVEeW5hbWljKGZsYXR0ZW5OZXN0ZWRPcHRpb25zKG9wdGlvbnMpLCBmYWxzZSlcblxuICAgIHZhciBzdGF0cyQkMSA9IHtcbiAgICAgIGdwdVRpbWU6IDAuMCxcbiAgICAgIGNwdVRpbWU6IDAuMCxcbiAgICAgIGNvdW50OiAwXG4gICAgfVxuXG4gICAgdmFyIGNvbXBpbGVkID0gY29yZS5jb21waWxlKG9wdHMsIGF0dHJpYnV0ZXMsIHVuaWZvcm1zLCBjb250ZXh0LCBzdGF0cyQkMSlcblxuICAgIHZhciBkcmF3ID0gY29tcGlsZWQuZHJhd1xuICAgIHZhciBiYXRjaCA9IGNvbXBpbGVkLmJhdGNoXG4gICAgdmFyIHNjb3BlID0gY29tcGlsZWQuc2NvcGVcblxuICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgbW9kaWZ5IGNvZGUgZ2VuZXJhdGlvbiBmb3IgYmF0Y2ggY29tbWFuZHMgc28gdGhpc1xuICAgIC8vIGlzbid0IG5lY2Vzc2FyeVxuICAgIHZhciBFTVBUWV9BUlJBWSA9IFtdXG4gICAgZnVuY3Rpb24gcmVzZXJ2ZSAoY291bnQpIHtcbiAgICAgIHdoaWxlIChFTVBUWV9BUlJBWS5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBFTVBUWV9BUlJBWS5wdXNoKG51bGwpXG4gICAgICB9XG4gICAgICByZXR1cm4gRU1QVFlfQVJSQVlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBSRUdMQ29tbWFuZCAoYXJncywgYm9keSkge1xuICAgICAgdmFyIGlcbiAgICAgIGlmIChjb250ZXh0TG9zdCkge1xuICAgICAgICBjaGVjayQxLnJhaXNlKCdjb250ZXh0IGxvc3QnKVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBhcmdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBzY29wZS5jYWxsKHRoaXMsIG51bGwsIGFyZ3MsIDApXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJncyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnczsgKytpKSB7XG4gICAgICAgICAgICBzY29wZS5jYWxsKHRoaXMsIG51bGwsIGJvZHksIGkpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJncykpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgc2NvcGUuY2FsbCh0aGlzLCBhcmdzW2ldLCBib2R5LCBpKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc2NvcGUuY2FsbCh0aGlzLCBhcmdzLCBib2R5LCAwKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoYXJncyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gYmF0Y2guY2FsbCh0aGlzLCByZXNlcnZlKGFyZ3MgfCAwKSwgYXJncyB8IDApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gYmF0Y2guY2FsbCh0aGlzLCBhcmdzLCBhcmdzLmxlbmd0aClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRyYXcuY2FsbCh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleHRlbmQoUkVHTENvbW1hbmQsIHtcbiAgICAgIHN0YXRzOiBzdGF0cyQkMSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29tcGlsZWQuZGVzdHJveSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHZhciBzZXRGQk8gPSBmcmFtZWJ1ZmZlclN0YXRlLnNldEZCTyA9IGNvbXBpbGVQcm9jZWR1cmUoe1xuICAgIGZyYW1lYnVmZmVyOiBkeW5hbWljLmRlZmluZS5jYWxsKG51bGwsIERZTl9QUk9QLCAnZnJhbWVidWZmZXInKVxuICB9KVxuXG4gIGZ1bmN0aW9uIGNsZWFySW1wbCAoXywgb3B0aW9ucykge1xuICAgIHZhciBjbGVhckZsYWdzID0gMFxuICAgIGNvcmUucHJvY3MucG9sbCgpXG5cbiAgICB2YXIgYyA9IG9wdGlvbnMuY29sb3JcbiAgICBpZiAoYykge1xuICAgICAgZ2wuY2xlYXJDb2xvcigrY1swXSB8fCAwLCArY1sxXSB8fCAwLCArY1syXSB8fCAwLCArY1szXSB8fCAwKVxuICAgICAgY2xlYXJGbGFncyB8PSBHTF9DT0xPUl9CVUZGRVJfQklUXG4gICAgfVxuICAgIGlmICgnZGVwdGgnIGluIG9wdGlvbnMpIHtcbiAgICAgIGdsLmNsZWFyRGVwdGgoK29wdGlvbnMuZGVwdGgpXG4gICAgICBjbGVhckZsYWdzIHw9IEdMX0RFUFRIX0JVRkZFUl9CSVRcbiAgICB9XG4gICAgaWYgKCdzdGVuY2lsJyBpbiBvcHRpb25zKSB7XG4gICAgICBnbC5jbGVhclN0ZW5jaWwob3B0aW9ucy5zdGVuY2lsIHwgMClcbiAgICAgIGNsZWFyRmxhZ3MgfD0gR0xfU1RFTkNJTF9CVUZGRVJfQklUXG4gICAgfVxuXG4gICAgY2hlY2skMSghIWNsZWFyRmxhZ3MsICdjYWxsZWQgcmVnbC5jbGVhciB3aXRoIG5vIGJ1ZmZlciBzcGVjaWZpZWQnKVxuICAgIGdsLmNsZWFyKGNsZWFyRmxhZ3MpXG4gIH1cblxuICBmdW5jdGlvbiBjbGVhciAob3B0aW9ucykge1xuICAgIGNoZWNrJDEoXG4gICAgICB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyxcbiAgICAgICdyZWdsLmNsZWFyKCkgdGFrZXMgYW4gb2JqZWN0IGFzIGlucHV0JylcbiAgICBpZiAoJ2ZyYW1lYnVmZmVyJyBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAob3B0aW9ucy5mcmFtZWJ1ZmZlciAmJlxuICAgICAgICAgIG9wdGlvbnMuZnJhbWVidWZmZXJfcmVnbFR5cGUgPT09ICdmcmFtZWJ1ZmZlckN1YmUnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjsgKytpKSB7XG4gICAgICAgICAgc2V0RkJPKGV4dGVuZCh7XG4gICAgICAgICAgICBmcmFtZWJ1ZmZlcjogb3B0aW9ucy5mcmFtZWJ1ZmZlci5mYWNlc1tpXVxuICAgICAgICAgIH0sIG9wdGlvbnMpLCBjbGVhckltcGwpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEZCTyhvcHRpb25zLCBjbGVhckltcGwpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsZWFySW1wbChudWxsLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGZyYW1lIChjYikge1xuICAgIGNoZWNrJDEudHlwZShjYiwgJ2Z1bmN0aW9uJywgJ3JlZ2wuZnJhbWUoKSBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKVxuICAgIHJhZkNhbGxiYWNrcy5wdXNoKGNiKVxuXG4gICAgZnVuY3Rpb24gY2FuY2VsICgpIHtcbiAgICAgIC8vIEZJWE1FOiAgc2hvdWxkIHdlIGNoZWNrIHNvbWV0aGluZyBvdGhlciB0aGFuIGVxdWFscyBjYiBoZXJlP1xuICAgICAgLy8gd2hhdCBpZiBhIHVzZXIgY2FsbHMgZnJhbWUgdHdpY2Ugd2l0aCB0aGUgc2FtZSBjYWxsYmFjay4uLlxuICAgICAgLy9cbiAgICAgIHZhciBpID0gZmluZChyYWZDYWxsYmFja3MsIGNiKVxuICAgICAgY2hlY2skMShpID49IDAsICdjYW5ub3QgY2FuY2VsIGEgZnJhbWUgdHdpY2UnKVxuICAgICAgZnVuY3Rpb24gcGVuZGluZ0NhbmNlbCAoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmQocmFmQ2FsbGJhY2tzLCBwZW5kaW5nQ2FuY2VsKVxuICAgICAgICByYWZDYWxsYmFja3NbaW5kZXhdID0gcmFmQ2FsbGJhY2tzW3JhZkNhbGxiYWNrcy5sZW5ndGggLSAxXVxuICAgICAgICByYWZDYWxsYmFja3MubGVuZ3RoIC09IDFcbiAgICAgICAgaWYgKHJhZkNhbGxiYWNrcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgIHN0b3BSQUYoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByYWZDYWxsYmFja3NbaV0gPSBwZW5kaW5nQ2FuY2VsXG4gICAgfVxuXG4gICAgc3RhcnRSQUYoKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbmNlbDogY2FuY2VsXG4gICAgfVxuICB9XG5cbiAgLy8gcG9sbCB2aWV3cG9ydFxuICBmdW5jdGlvbiBwb2xsVmlld3BvcnQgKCkge1xuICAgIHZhciB2aWV3cG9ydCA9IG5leHRTdGF0ZS52aWV3cG9ydFxuICAgIHZhciBzY2lzc29yQm94ID0gbmV4dFN0YXRlLnNjaXNzb3JfYm94XG4gICAgdmlld3BvcnRbMF0gPSB2aWV3cG9ydFsxXSA9IHNjaXNzb3JCb3hbMF0gPSBzY2lzc29yQm94WzFdID0gMFxuICAgIGNvbnRleHRTdGF0ZS52aWV3cG9ydFdpZHRoID1cbiAgICAgIGNvbnRleHRTdGF0ZS5mcmFtZWJ1ZmZlcldpZHRoID1cbiAgICAgIGNvbnRleHRTdGF0ZS5kcmF3aW5nQnVmZmVyV2lkdGggPVxuICAgICAgdmlld3BvcnRbMl0gPVxuICAgICAgc2Npc3NvckJveFsyXSA9IGdsLmRyYXdpbmdCdWZmZXJXaWR0aFxuICAgIGNvbnRleHRTdGF0ZS52aWV3cG9ydEhlaWdodCA9XG4gICAgICBjb250ZXh0U3RhdGUuZnJhbWVidWZmZXJIZWlnaHQgPVxuICAgICAgY29udGV4dFN0YXRlLmRyYXdpbmdCdWZmZXJIZWlnaHQgPVxuICAgICAgdmlld3BvcnRbM10gPVxuICAgICAgc2Npc3NvckJveFszXSA9IGdsLmRyYXdpbmdCdWZmZXJIZWlnaHRcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvbGwgKCkge1xuICAgIGNvbnRleHRTdGF0ZS50aWNrICs9IDFcbiAgICBjb250ZXh0U3RhdGUudGltZSA9IG5vdygpXG4gICAgcG9sbFZpZXdwb3J0KClcbiAgICBjb3JlLnByb2NzLnBvbGwoKVxuICB9XG5cbiAgZnVuY3Rpb24gcmVmcmVzaCAoKSB7XG4gICAgdGV4dHVyZVN0YXRlLnJlZnJlc2goKVxuICAgIHBvbGxWaWV3cG9ydCgpXG4gICAgY29yZS5wcm9jcy5yZWZyZXNoKClcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIHRpbWVyLnVwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbm93ICgpIHtcbiAgICByZXR1cm4gKGNsb2NrKCkgLSBTVEFSVF9USU1FKSAvIDEwMDAuMFxuICB9XG5cbiAgcmVmcmVzaCgpXG5cbiAgZnVuY3Rpb24gYWRkTGlzdGVuZXIgKGV2ZW50LCBjYWxsYmFjaykge1xuICAgIGNoZWNrJDEudHlwZShjYWxsYmFjaywgJ2Z1bmN0aW9uJywgJ2xpc3RlbmVyIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpXG5cbiAgICB2YXIgY2FsbGJhY2tzXG4gICAgc3dpdGNoIChldmVudCkge1xuICAgICAgY2FzZSAnZnJhbWUnOlxuICAgICAgICByZXR1cm4gZnJhbWUoY2FsbGJhY2spXG4gICAgICBjYXNlICdsb3N0JzpcbiAgICAgICAgY2FsbGJhY2tzID0gbG9zc0NhbGxiYWNrc1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncmVzdG9yZSc6XG4gICAgICAgIGNhbGxiYWNrcyA9IHJlc3RvcmVDYWxsYmFja3NcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2Rlc3Ryb3knOlxuICAgICAgICBjYWxsYmFja3MgPSBkZXN0cm95Q2FsbGJhY2tzXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjaGVjayQxLnJhaXNlKCdpbnZhbGlkIGV2ZW50LCBtdXN0IGJlIG9uZSBvZiBmcmFtZSxsb3N0LHJlc3RvcmUsZGVzdHJveScpXG4gICAgfVxuXG4gICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmIChjYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFja3NbaV0gPSBjYWxsYmFja3NbY2FsbGJhY2tzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICBjYWxsYmFja3MucG9wKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciByZWdsID0gZXh0ZW5kKGNvbXBpbGVQcm9jZWR1cmUsIHtcbiAgICAvLyBDbGVhciBjdXJyZW50IEZCT1xuICAgIGNsZWFyOiBjbGVhcixcblxuICAgIC8vIFNob3J0IGN1dHMgZm9yIGR5bmFtaWMgdmFyaWFibGVzXG4gICAgcHJvcDogZHluYW1pYy5kZWZpbmUuYmluZChudWxsLCBEWU5fUFJPUCksXG4gICAgY29udGV4dDogZHluYW1pYy5kZWZpbmUuYmluZChudWxsLCBEWU5fQ09OVEVYVCksXG4gICAgdGhpczogZHluYW1pYy5kZWZpbmUuYmluZChudWxsLCBEWU5fU1RBVEUpLFxuXG4gICAgLy8gZXhlY3V0ZXMgYW4gZW1wdHkgZHJhdyBjb21tYW5kXG4gICAgZHJhdzogY29tcGlsZVByb2NlZHVyZSh7fSksXG5cbiAgICAvLyBSZXNvdXJjZXNcbiAgICBidWZmZXI6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYnVmZmVyU3RhdGUuY3JlYXRlKG9wdGlvbnMsIEdMX0FSUkFZX0JVRkZFUiwgZmFsc2UsIGZhbHNlKVxuICAgIH0sXG4gICAgZWxlbWVudHM6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gZWxlbWVudFN0YXRlLmNyZWF0ZShvcHRpb25zLCBmYWxzZSlcbiAgICB9LFxuICAgIHRleHR1cmU6IHRleHR1cmVTdGF0ZS5jcmVhdGUyRCxcbiAgICBjdWJlOiB0ZXh0dXJlU3RhdGUuY3JlYXRlQ3ViZSxcbiAgICByZW5kZXJidWZmZXI6IHJlbmRlcmJ1ZmZlclN0YXRlLmNyZWF0ZSxcbiAgICBmcmFtZWJ1ZmZlcjogZnJhbWVidWZmZXJTdGF0ZS5jcmVhdGUsXG4gICAgZnJhbWVidWZmZXJDdWJlOiBmcmFtZWJ1ZmZlclN0YXRlLmNyZWF0ZUN1YmUsXG4gICAgdmFvOiBhdHRyaWJ1dGVTdGF0ZS5jcmVhdGVWQU8sXG5cbiAgICAvLyBFeHBvc2UgY29udGV4dCBhdHRyaWJ1dGVzXG4gICAgYXR0cmlidXRlczogZ2xBdHRyaWJ1dGVzLFxuXG4gICAgLy8gRnJhbWUgcmVuZGVyaW5nXG4gICAgZnJhbWU6IGZyYW1lLFxuICAgIG9uOiBhZGRMaXN0ZW5lcixcblxuICAgIC8vIFN5c3RlbSBsaW1pdHNcbiAgICBsaW1pdHM6IGxpbWl0cyxcbiAgICBoYXNFeHRlbnNpb246IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gbGltaXRzLmV4dGVuc2lvbnMuaW5kZXhPZihuYW1lLnRvTG93ZXJDYXNlKCkpID49IDBcbiAgICB9LFxuXG4gICAgLy8gUmVhZCBwaXhlbHNcbiAgICByZWFkOiByZWFkUGl4ZWxzLFxuXG4gICAgLy8gRGVzdHJveSByZWdsIGFuZCBhbGwgYXNzb2NpYXRlZCByZXNvdXJjZXNcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuXG4gICAgLy8gRGlyZWN0IEdMIHN0YXRlIG1hbmlwdWxhdGlvblxuICAgIF9nbDogZ2wsXG4gICAgX3JlZnJlc2g6IHJlZnJlc2gsXG5cbiAgICBwb2xsOiBmdW5jdGlvbiAoKSB7XG4gICAgICBwb2xsKClcbiAgICAgIGlmICh0aW1lcikge1xuICAgICAgICB0aW1lci51cGRhdGUoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDdXJyZW50IHRpbWVcbiAgICBub3c6IG5vdyxcblxuICAgIC8vIHJlZ2wgU3RhdGlzdGljcyBJbmZvcm1hdGlvblxuICAgIHN0YXRzOiBzdGF0cyQkMVxuICB9KVxuXG4gIGNvbmZpZy5vbkRvbmUobnVsbCwgcmVnbClcblxuICByZXR1cm4gcmVnbFxufVxuXG5yZXR1cm4gd3JhcFJFR0w7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdsLmpzLm1hcFxuIiwibW9kdWxlLmV4cG9ydHMgPVxuICBnbG9iYWwucGVyZm9ybWFuY2UgJiZcbiAgZ2xvYmFsLnBlcmZvcm1hbmNlLm5vdyA/IGZ1bmN0aW9uIG5vdygpIHtcbiAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KClcbiAgfSA6IERhdGUubm93IHx8IGZ1bmN0aW9uIG5vdygpIHtcbiAgICByZXR1cm4gK25ldyBEYXRlXG4gIH1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2luZGV4Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByYW5kb21Gcm9tU2VlZCA9IHJlcXVpcmUoJy4vcmFuZG9tL3JhbmRvbS1mcm9tLXNlZWQnKTtcblxudmFyIE9SSUdJTkFMID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXy0nO1xudmFyIGFscGhhYmV0O1xudmFyIHByZXZpb3VzU2VlZDtcblxudmFyIHNodWZmbGVkO1xuXG5mdW5jdGlvbiByZXNldCgpIHtcbiAgICBzaHVmZmxlZCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzZXRDaGFyYWN0ZXJzKF9hbHBoYWJldF8pIHtcbiAgICBpZiAoIV9hbHBoYWJldF8pIHtcbiAgICAgICAgaWYgKGFscGhhYmV0ICE9PSBPUklHSU5BTCkge1xuICAgICAgICAgICAgYWxwaGFiZXQgPSBPUklHSU5BTDtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfYWxwaGFiZXRfID09PSBhbHBoYWJldCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKF9hbHBoYWJldF8ubGVuZ3RoICE9PSBPUklHSU5BTC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDdXN0b20gYWxwaGFiZXQgZm9yIHNob3J0aWQgbXVzdCBiZSAnICsgT1JJR0lOQUwubGVuZ3RoICsgJyB1bmlxdWUgY2hhcmFjdGVycy4gWW91IHN1Ym1pdHRlZCAnICsgX2FscGhhYmV0Xy5sZW5ndGggKyAnIGNoYXJhY3RlcnM6ICcgKyBfYWxwaGFiZXRfKTtcbiAgICB9XG5cbiAgICB2YXIgdW5pcXVlID0gX2FscGhhYmV0Xy5zcGxpdCgnJykuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0sIGluZCwgYXJyKXtcbiAgICAgICByZXR1cm4gaW5kICE9PSBhcnIubGFzdEluZGV4T2YoaXRlbSk7XG4gICAgfSk7XG5cbiAgICBpZiAodW5pcXVlLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0N1c3RvbSBhbHBoYWJldCBmb3Igc2hvcnRpZCBtdXN0IGJlICcgKyBPUklHSU5BTC5sZW5ndGggKyAnIHVuaXF1ZSBjaGFyYWN0ZXJzLiBUaGVzZSBjaGFyYWN0ZXJzIHdlcmUgbm90IHVuaXF1ZTogJyArIHVuaXF1ZS5qb2luKCcsICcpKTtcbiAgICB9XG5cbiAgICBhbHBoYWJldCA9IF9hbHBoYWJldF87XG4gICAgcmVzZXQoKTtcbn1cblxuZnVuY3Rpb24gY2hhcmFjdGVycyhfYWxwaGFiZXRfKSB7XG4gICAgc2V0Q2hhcmFjdGVycyhfYWxwaGFiZXRfKTtcbiAgICByZXR1cm4gYWxwaGFiZXQ7XG59XG5cbmZ1bmN0aW9uIHNldFNlZWQoc2VlZCkge1xuICAgIHJhbmRvbUZyb21TZWVkLnNlZWQoc2VlZCk7XG4gICAgaWYgKHByZXZpb3VzU2VlZCAhPT0gc2VlZCkge1xuICAgICAgICByZXNldCgpO1xuICAgICAgICBwcmV2aW91c1NlZWQgPSBzZWVkO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2h1ZmZsZSgpIHtcbiAgICBpZiAoIWFscGhhYmV0KSB7XG4gICAgICAgIHNldENoYXJhY3RlcnMoT1JJR0lOQUwpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VBcnJheSA9IGFscGhhYmV0LnNwbGl0KCcnKTtcbiAgICB2YXIgdGFyZ2V0QXJyYXkgPSBbXTtcbiAgICB2YXIgciA9IHJhbmRvbUZyb21TZWVkLm5leHRWYWx1ZSgpO1xuICAgIHZhciBjaGFyYWN0ZXJJbmRleDtcblxuICAgIHdoaWxlIChzb3VyY2VBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHIgPSByYW5kb21Gcm9tU2VlZC5uZXh0VmFsdWUoKTtcbiAgICAgICAgY2hhcmFjdGVySW5kZXggPSBNYXRoLmZsb29yKHIgKiBzb3VyY2VBcnJheS5sZW5ndGgpO1xuICAgICAgICB0YXJnZXRBcnJheS5wdXNoKHNvdXJjZUFycmF5LnNwbGljZShjaGFyYWN0ZXJJbmRleCwgMSlbMF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0QXJyYXkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGdldFNodWZmbGVkKCkge1xuICAgIGlmIChzaHVmZmxlZCkge1xuICAgICAgICByZXR1cm4gc2h1ZmZsZWQ7XG4gICAgfVxuICAgIHNodWZmbGVkID0gc2h1ZmZsZSgpO1xuICAgIHJldHVybiBzaHVmZmxlZDtcbn1cblxuLyoqXG4gKiBsb29rdXAgc2h1ZmZsZWQgbGV0dGVyXG4gKiBAcGFyYW0gaW5kZXhcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGxvb2t1cChpbmRleCkge1xuICAgIHZhciBhbHBoYWJldFNodWZmbGVkID0gZ2V0U2h1ZmZsZWQoKTtcbiAgICByZXR1cm4gYWxwaGFiZXRTaHVmZmxlZFtpbmRleF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGNoYXJhY3RlcnM6IGNoYXJhY3RlcnMsXG4gICAgc2VlZDogc2V0U2VlZCxcbiAgICBsb29rdXA6IGxvb2t1cCxcbiAgICBzaHVmZmxlZDogZ2V0U2h1ZmZsZWRcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBlbmNvZGUgPSByZXF1aXJlKCcuL2VuY29kZScpO1xudmFyIGFscGhhYmV0ID0gcmVxdWlyZSgnLi9hbHBoYWJldCcpO1xuXG4vLyBJZ25vcmUgYWxsIG1pbGxpc2Vjb25kcyBiZWZvcmUgYSBjZXJ0YWluIHRpbWUgdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBkYXRlIGVudHJvcHkgd2l0aG91dCBzYWNyaWZpY2luZyB1bmlxdWVuZXNzLlxuLy8gVGhpcyBudW1iZXIgc2hvdWxkIGJlIHVwZGF0ZWQgZXZlcnkgeWVhciBvciBzbyB0byBrZWVwIHRoZSBnZW5lcmF0ZWQgaWQgc2hvcnQuXG4vLyBUbyByZWdlbmVyYXRlIGBuZXcgRGF0ZSgpIC0gMGAgYW5kIGJ1bXAgdGhlIHZlcnNpb24uIEFsd2F5cyBidW1wIHRoZSB2ZXJzaW9uIVxudmFyIFJFRFVDRV9USU1FID0gMTQ1OTcwNzYwNjUxODtcblxuLy8gZG9uJ3QgY2hhbmdlIHVubGVzcyB3ZSBjaGFuZ2UgdGhlIGFsZ29zIG9yIFJFRFVDRV9USU1FXG4vLyBtdXN0IGJlIGFuIGludGVnZXIgYW5kIGxlc3MgdGhhbiAxNlxudmFyIHZlcnNpb24gPSA2O1xuXG4vLyBDb3VudGVyIGlzIHVzZWQgd2hlbiBzaG9ydGlkIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpbiBvbmUgc2Vjb25kLlxudmFyIGNvdW50ZXI7XG5cbi8vIFJlbWVtYmVyIHRoZSBsYXN0IHRpbWUgc2hvcnRpZCB3YXMgY2FsbGVkIGluIGNhc2UgY291bnRlciBpcyBuZWVkZWQuXG52YXIgcHJldmlvdXNTZWNvbmRzO1xuXG4vKipcbiAqIEdlbmVyYXRlIHVuaXF1ZSBpZFxuICogUmV0dXJucyBzdHJpbmcgaWRcbiAqL1xuZnVuY3Rpb24gYnVpbGQoY2x1c3RlcldvcmtlcklkKSB7XG5cbiAgICB2YXIgc3RyID0gJyc7XG5cbiAgICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IoKERhdGUubm93KCkgLSBSRURVQ0VfVElNRSkgKiAwLjAwMSk7XG5cbiAgICBpZiAoc2Vjb25kcyA9PT0gcHJldmlvdXNTZWNvbmRzKSB7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb3VudGVyID0gMDtcbiAgICAgICAgcHJldmlvdXNTZWNvbmRzID0gc2Vjb25kcztcbiAgICB9XG5cbiAgICBzdHIgPSBzdHIgKyBlbmNvZGUoYWxwaGFiZXQubG9va3VwLCB2ZXJzaW9uKTtcbiAgICBzdHIgPSBzdHIgKyBlbmNvZGUoYWxwaGFiZXQubG9va3VwLCBjbHVzdGVyV29ya2VySWQpO1xuICAgIGlmIChjb3VudGVyID4gMCkge1xuICAgICAgICBzdHIgPSBzdHIgKyBlbmNvZGUoYWxwaGFiZXQubG9va3VwLCBjb3VudGVyKTtcbiAgICB9XG4gICAgc3RyID0gc3RyICsgZW5jb2RlKGFscGhhYmV0Lmxvb2t1cCwgc2Vjb25kcyk7XG5cbiAgICByZXR1cm4gc3RyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1aWxkO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFscGhhYmV0ID0gcmVxdWlyZSgnLi9hbHBoYWJldCcpO1xuXG4vKipcbiAqIERlY29kZSB0aGUgaWQgdG8gZ2V0IHRoZSB2ZXJzaW9uIGFuZCB3b3JrZXJcbiAqIE1haW5seSBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nLlxuICogQHBhcmFtIGlkIC0gdGhlIHNob3J0aWQtZ2VuZXJhdGVkIGlkLlxuICovXG5mdW5jdGlvbiBkZWNvZGUoaWQpIHtcbiAgICB2YXIgY2hhcmFjdGVycyA9IGFscGhhYmV0LnNodWZmbGVkKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmVyc2lvbjogY2hhcmFjdGVycy5pbmRleE9mKGlkLnN1YnN0cigwLCAxKSkgJiAweDBmLFxuICAgICAgICB3b3JrZXI6IGNoYXJhY3RlcnMuaW5kZXhPZihpZC5zdWJzdHIoMSwgMSkpICYgMHgwZlxuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVjb2RlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmFuZG9tQnl0ZSA9IHJlcXVpcmUoJy4vcmFuZG9tL3JhbmRvbS1ieXRlJyk7XG5cbmZ1bmN0aW9uIGVuY29kZShsb29rdXAsIG51bWJlcikge1xuICAgIHZhciBsb29wQ291bnRlciA9IDA7XG4gICAgdmFyIGRvbmU7XG5cbiAgICB2YXIgc3RyID0gJyc7XG5cbiAgICB3aGlsZSAoIWRvbmUpIHtcbiAgICAgICAgc3RyID0gc3RyICsgbG9va3VwKCAoIChudW1iZXIgPj4gKDQgKiBsb29wQ291bnRlcikpICYgMHgwZiApIHwgcmFuZG9tQnl0ZSgpICk7XG4gICAgICAgIGRvbmUgPSBudW1iZXIgPCAoTWF0aC5wb3coMTYsIGxvb3BDb3VudGVyICsgMSApICk7XG4gICAgICAgIGxvb3BDb3VudGVyKys7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZW5jb2RlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYWxwaGFiZXQgPSByZXF1aXJlKCcuL2FscGhhYmV0Jyk7XG52YXIgZW5jb2RlID0gcmVxdWlyZSgnLi9lbmNvZGUnKTtcbnZhciBkZWNvZGUgPSByZXF1aXJlKCcuL2RlY29kZScpO1xudmFyIGJ1aWxkID0gcmVxdWlyZSgnLi9idWlsZCcpO1xudmFyIGlzVmFsaWQgPSByZXF1aXJlKCcuL2lzLXZhbGlkJyk7XG5cbi8vIGlmIHlvdSBhcmUgdXNpbmcgY2x1c3RlciBvciBtdWx0aXBsZSBzZXJ2ZXJzIHVzZSB0aGlzIHRvIG1ha2UgZWFjaCBpbnN0YW5jZVxuLy8gaGFzIGEgdW5pcXVlIHZhbHVlIGZvciB3b3JrZXJcbi8vIE5vdGU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gdXNpbmcgdGhpcmRcbi8vIHBhcnR5IGNsdXN0ZXIgc29sdXRpb25zIHN1Y2ggYXMgcG0yLlxudmFyIGNsdXN0ZXJXb3JrZXJJZCA9IHJlcXVpcmUoJy4vdXRpbC9jbHVzdGVyLXdvcmtlci1pZCcpIHx8IDA7XG5cbi8qKlxuICogU2V0IHRoZSBzZWVkLlxuICogSGlnaGx5IHJlY29tbWVuZGVkIGlmIHlvdSBkb24ndCB3YW50IHBlb3BsZSB0byB0cnkgdG8gZmlndXJlIG91dCB5b3VyIGlkIHNjaGVtYS5cbiAqIGV4cG9zZWQgYXMgc2hvcnRpZC5zZWVkKGludClcbiAqIEBwYXJhbSBzZWVkIEludGVnZXIgdmFsdWUgdG8gc2VlZCB0aGUgcmFuZG9tIGFscGhhYmV0LiAgQUxXQVlTIFVTRSBUSEUgU0FNRSBTRUVEIG9yIHlvdSBtaWdodCBnZXQgb3ZlcmxhcHMuXG4gKi9cbmZ1bmN0aW9uIHNlZWQoc2VlZFZhbHVlKSB7XG4gICAgYWxwaGFiZXQuc2VlZChzZWVkVmFsdWUpO1xuICAgIHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGNsdXN0ZXIgd29ya2VyIG9yIG1hY2hpbmUgaWRcbiAqIGV4cG9zZWQgYXMgc2hvcnRpZC53b3JrZXIoaW50KVxuICogQHBhcmFtIHdvcmtlcklkIHdvcmtlciBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIuICBOdW1iZXIgbGVzcyB0aGFuIDE2IGlzIHJlY29tbWVuZGVkLlxuICogcmV0dXJucyBzaG9ydGlkIG1vZHVsZSBzbyBpdCBjYW4gYmUgY2hhaW5lZC5cbiAqL1xuZnVuY3Rpb24gd29ya2VyKHdvcmtlcklkKSB7XG4gICAgY2x1c3RlcldvcmtlcklkID0gd29ya2VySWQ7XG4gICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vKipcbiAqXG4gKiBzZXRzIG5ldyBjaGFyYWN0ZXJzIHRvIHVzZSBpbiB0aGUgYWxwaGFiZXRcbiAqIHJldHVybnMgdGhlIHNodWZmbGVkIGFscGhhYmV0XG4gKi9cbmZ1bmN0aW9uIGNoYXJhY3RlcnMobmV3Q2hhcmFjdGVycykge1xuICAgIGlmIChuZXdDaGFyYWN0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWxwaGFiZXQuY2hhcmFjdGVycyhuZXdDaGFyYWN0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWxwaGFiZXQuc2h1ZmZsZWQoKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSB1bmlxdWUgaWRcbiAqIFJldHVybnMgc3RyaW5nIGlkXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlKCkge1xuICByZXR1cm4gYnVpbGQoY2x1c3RlcldvcmtlcklkKTtcbn1cblxuLy8gRXhwb3J0IGFsbCBvdGhlciBmdW5jdGlvbnMgYXMgcHJvcGVydGllcyBvZiB0aGUgZ2VuZXJhdGUgZnVuY3Rpb25cbm1vZHVsZS5leHBvcnRzID0gZ2VuZXJhdGU7XG5tb2R1bGUuZXhwb3J0cy5nZW5lcmF0ZSA9IGdlbmVyYXRlO1xubW9kdWxlLmV4cG9ydHMuc2VlZCA9IHNlZWQ7XG5tb2R1bGUuZXhwb3J0cy53b3JrZXIgPSB3b3JrZXI7XG5tb2R1bGUuZXhwb3J0cy5jaGFyYWN0ZXJzID0gY2hhcmFjdGVycztcbm1vZHVsZS5leHBvcnRzLmRlY29kZSA9IGRlY29kZTtcbm1vZHVsZS5leHBvcnRzLmlzVmFsaWQgPSBpc1ZhbGlkO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFscGhhYmV0ID0gcmVxdWlyZSgnLi9hbHBoYWJldCcpO1xuXG5mdW5jdGlvbiBpc1Nob3J0SWQoaWQpIHtcbiAgICBpZiAoIWlkIHx8IHR5cGVvZiBpZCAhPT0gJ3N0cmluZycgfHwgaWQubGVuZ3RoIDwgNiApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBjaGFyYWN0ZXJzID0gYWxwaGFiZXQuY2hhcmFjdGVycygpO1xuICAgIHZhciBsZW4gPSBpZC5sZW5ndGg7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjtpKyspIHtcbiAgICAgICAgaWYgKGNoYXJhY3RlcnMuaW5kZXhPZihpZFtpXSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTaG9ydElkO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3J5cHRvID0gdHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgJiYgKHdpbmRvdy5jcnlwdG8gfHwgd2luZG93Lm1zQ3J5cHRvKTsgLy8gSUUgMTEgdXNlcyB3aW5kb3cubXNDcnlwdG9cblxuZnVuY3Rpb24gcmFuZG9tQnl0ZSgpIHtcbiAgICBpZiAoIWNyeXB0byB8fCAhY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KSAmIDB4MzA7XG4gICAgfVxuICAgIHZhciBkZXN0ID0gbmV3IFVpbnQ4QXJyYXkoMSk7XG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhkZXN0KTtcbiAgICByZXR1cm4gZGVzdFswXSAmIDB4MzA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuZG9tQnl0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gRm91bmQgdGhpcyBzZWVkLWJhc2VkIHJhbmRvbSBnZW5lcmF0b3Igc29tZXdoZXJlXG4vLyBCYXNlZCBvbiBUaGUgQ2VudHJhbCBSYW5kb21pemVyIDEuMyAoQykgMTk5NyBieSBQYXVsIEhvdWxlIChob3VsZUBtc2MuY29ybmVsbC5lZHUpXG5cbnZhciBzZWVkID0gMTtcblxuLyoqXG4gKiByZXR1cm4gYSByYW5kb20gbnVtYmVyIGJhc2VkIG9uIGEgc2VlZFxuICogQHBhcmFtIHNlZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldE5leHRWYWx1ZSgpIHtcbiAgICBzZWVkID0gKHNlZWQgKiA5MzAxICsgNDkyOTcpICUgMjMzMjgwO1xuICAgIHJldHVybiBzZWVkLygyMzMyODAuMCk7XG59XG5cbmZ1bmN0aW9uIHNldFNlZWQoX3NlZWRfKSB7XG4gICAgc2VlZCA9IF9zZWVkXztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmV4dFZhbHVlOiBnZXROZXh0VmFsdWUsXG4gICAgc2VlZDogc2V0U2VlZFxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSAwO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBQZWVyXG5cbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ3NpbXBsZS1wZWVyJylcbnZhciBnZXRCcm93c2VyUlRDID0gcmVxdWlyZSgnZ2V0LWJyb3dzZXItcnRjJylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciByYW5kb21ieXRlcyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJylcbnZhciBzdHJlYW0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKVxuXG52YXIgTUFYX0JVRkZFUkVEX0FNT1VOVCA9IDY0ICogMTAyNFxuXG5pbmhlcml0cyhQZWVyLCBzdHJlYW0uRHVwbGV4KVxuXG4vKipcbiAqIFdlYlJUQyBwZWVyIGNvbm5lY3Rpb24uIFNhbWUgQVBJIGFzIG5vZGUgY29yZSBgbmV0LlNvY2tldGAsIHBsdXMgYSBmZXcgZXh0cmEgbWV0aG9kcy5cbiAqIER1cGxleCBzdHJlYW0uXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICovXG5mdW5jdGlvbiBQZWVyIChvcHRzKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoIShzZWxmIGluc3RhbmNlb2YgUGVlcikpIHJldHVybiBuZXcgUGVlcihvcHRzKVxuXG4gIHNlbGYuX2lkID0gcmFuZG9tYnl0ZXMoNCkudG9TdHJpbmcoJ2hleCcpLnNsaWNlKDAsIDcpXG4gIHNlbGYuX2RlYnVnKCduZXcgcGVlciAlbycsIG9wdHMpXG5cbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGFsbG93SGFsZk9wZW46IGZhbHNlXG4gIH0sIG9wdHMpXG5cbiAgc3RyZWFtLkR1cGxleC5jYWxsKHNlbGYsIG9wdHMpXG5cbiAgc2VsZi5jaGFubmVsTmFtZSA9IG9wdHMuaW5pdGlhdG9yXG4gICAgPyBvcHRzLmNoYW5uZWxOYW1lIHx8IHJhbmRvbWJ5dGVzKDIwKS50b1N0cmluZygnaGV4JylcbiAgICA6IG51bGxcblxuICAvLyBOZWVkZWQgYnkgX3RyYW5zZm9ybUNvbnN0cmFpbnRzLCBzbyBzZXQgdGhpcyBlYXJseVxuICBzZWxmLl9pc0Nocm9taXVtID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgISF3aW5kb3cud2Via2l0UlRDUGVlckNvbm5lY3Rpb25cblxuICBzZWxmLmluaXRpYXRvciA9IG9wdHMuaW5pdGlhdG9yIHx8IGZhbHNlXG4gIHNlbGYuY2hhbm5lbENvbmZpZyA9IG9wdHMuY2hhbm5lbENvbmZpZyB8fCBQZWVyLmNoYW5uZWxDb25maWdcbiAgc2VsZi5jb25maWcgPSBvcHRzLmNvbmZpZyB8fCBQZWVyLmNvbmZpZ1xuICBzZWxmLmNvbnN0cmFpbnRzID0gc2VsZi5fdHJhbnNmb3JtQ29uc3RyYWludHMob3B0cy5jb25zdHJhaW50cyB8fCBQZWVyLmNvbnN0cmFpbnRzKVxuICBzZWxmLm9mZmVyQ29uc3RyYWludHMgPSBzZWxmLl90cmFuc2Zvcm1Db25zdHJhaW50cyhvcHRzLm9mZmVyQ29uc3RyYWludHMgfHwge30pXG4gIHNlbGYuYW5zd2VyQ29uc3RyYWludHMgPSBzZWxmLl90cmFuc2Zvcm1Db25zdHJhaW50cyhvcHRzLmFuc3dlckNvbnN0cmFpbnRzIHx8IHt9KVxuICBzZWxmLnNkcFRyYW5zZm9ybSA9IG9wdHMuc2RwVHJhbnNmb3JtIHx8IGZ1bmN0aW9uIChzZHApIHsgcmV0dXJuIHNkcCB9XG4gIHNlbGYuc3RyZWFtcyA9IG9wdHMuc3RyZWFtcyB8fCAob3B0cy5zdHJlYW0gPyBbb3B0cy5zdHJlYW1dIDogW10pIC8vIHN1cHBvcnQgb2xkIFwic3RyZWFtXCIgb3B0aW9uXG4gIHNlbGYudHJpY2tsZSA9IG9wdHMudHJpY2tsZSAhPT0gdW5kZWZpbmVkID8gb3B0cy50cmlja2xlIDogdHJ1ZVxuXG4gIHNlbGYuZGVzdHJveWVkID0gZmFsc2VcbiAgc2VsZi5jb25uZWN0ZWQgPSBmYWxzZVxuXG4gIHNlbGYucmVtb3RlQWRkcmVzcyA9IHVuZGVmaW5lZFxuICBzZWxmLnJlbW90ZUZhbWlseSA9IHVuZGVmaW5lZFxuICBzZWxmLnJlbW90ZVBvcnQgPSB1bmRlZmluZWRcbiAgc2VsZi5sb2NhbEFkZHJlc3MgPSB1bmRlZmluZWRcbiAgc2VsZi5sb2NhbFBvcnQgPSB1bmRlZmluZWRcblxuICBzZWxmLl93cnRjID0gKG9wdHMud3J0YyAmJiB0eXBlb2Ygb3B0cy53cnRjID09PSAnb2JqZWN0JylcbiAgICA/IG9wdHMud3J0Y1xuICAgIDogZ2V0QnJvd3NlclJUQygpXG5cbiAgaWYgKCFzZWxmLl93cnRjKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBtYWtlRXJyb3IoJ05vIFdlYlJUQyBzdXBwb3J0OiBTcGVjaWZ5IGBvcHRzLndydGNgIG9wdGlvbiBpbiB0aGlzIGVudmlyb25tZW50JywgJ0VSUl9XRUJSVENfU1VQUE9SVCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG1ha2VFcnJvcignTm8gV2ViUlRDIHN1cHBvcnQ6IE5vdCBhIHN1cHBvcnRlZCBicm93c2VyJywgJ0VSUl9XRUJSVENfU1VQUE9SVCcpXG4gICAgfVxuICB9XG5cbiAgc2VsZi5fcGNSZWFkeSA9IGZhbHNlXG4gIHNlbGYuX2NoYW5uZWxSZWFkeSA9IGZhbHNlXG4gIHNlbGYuX2ljZUNvbXBsZXRlID0gZmFsc2UgLy8gaWNlIGNhbmRpZGF0ZSB0cmlja2xlIGRvbmUgKGdvdCBudWxsIGNhbmRpZGF0ZSlcbiAgc2VsZi5fY2hhbm5lbCA9IG51bGxcbiAgc2VsZi5fcGVuZGluZ0NhbmRpZGF0ZXMgPSBbXVxuXG4gIHNlbGYuX2lzTmVnb3RpYXRpbmcgPSBmYWxzZSAvLyBpcyB0aGlzIHBlZXIgd2FpdGluZyBmb3IgbmVnb3RpYXRpb24gdG8gY29tcGxldGU/XG4gIHNlbGYuX2JhdGNoZWROZWdvdGlhdGlvbiA9IGZhbHNlIC8vIGJhdGNoIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uc1xuICBzZWxmLl9xdWV1ZWROZWdvdGlhdGlvbiA9IGZhbHNlIC8vIGlzIHRoZXJlIGEgcXVldWVkIG5lZ290aWF0aW9uIHJlcXVlc3Q/XG4gIHNlbGYuX3NlbmRlcnNBd2FpdGluZ1N0YWJsZSA9IFtdXG4gIHNlbGYuX3NlbmRlck1hcCA9IG5ldyBXZWFrTWFwKClcblxuICBzZWxmLl9yZW1vdGVUcmFja3MgPSBbXVxuICBzZWxmLl9yZW1vdGVTdHJlYW1zID0gW11cblxuICBzZWxmLl9jaHVuayA9IG51bGxcbiAgc2VsZi5fY2IgPSBudWxsXG4gIHNlbGYuX2ludGVydmFsID0gbnVsbFxuXG4gIHNlbGYuX3BjID0gbmV3IChzZWxmLl93cnRjLlJUQ1BlZXJDb25uZWN0aW9uKShzZWxmLmNvbmZpZywgc2VsZi5jb25zdHJhaW50cylcblxuICAvLyBXZSBwcmVmZXIgZmVhdHVyZSBkZXRlY3Rpb24gd2hlbmV2ZXIgcG9zc2libGUsIGJ1dCBzb21ldGltZXMgdGhhdCdzIG5vdFxuICAvLyBwb3NzaWJsZSBmb3IgY2VydGFpbiBpbXBsZW1lbnRhdGlvbnMuXG4gIHNlbGYuX2lzUmVhY3ROYXRpdmVXZWJydGMgPSB0eXBlb2Ygc2VsZi5fcGMuX3BlZXJDb25uZWN0aW9uSWQgPT09ICdudW1iZXInXG5cbiAgc2VsZi5fcGMub25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fb25JY2VTdGF0ZUNoYW5nZSgpXG4gIH1cbiAgc2VsZi5fcGMub25pY2VnYXRoZXJpbmdzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLl9vbkljZVN0YXRlQ2hhbmdlKClcbiAgfVxuICBzZWxmLl9wYy5vbnNpZ25hbGluZ3N0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuX29uU2lnbmFsaW5nU3RhdGVDaGFuZ2UoKVxuICB9XG4gIHNlbGYuX3BjLm9uaWNlY2FuZGlkYXRlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgc2VsZi5fb25JY2VDYW5kaWRhdGUoZXZlbnQpXG4gIH1cblxuICAvLyBPdGhlciBzcGVjIGV2ZW50cywgdW51c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb246XG4gIC8vIC0gb25jb25uZWN0aW9uc3RhdGVjaGFuZ2VcbiAgLy8gLSBvbmljZWNhbmRpZGF0ZWVycm9yXG4gIC8vIC0gb25maW5nZXJwcmludGZhaWx1cmVcbiAgLy8gLSBvbm5lZ290aWF0aW9ubmVlZGVkXG5cbiAgaWYgKHNlbGYuaW5pdGlhdG9yKSB7XG4gICAgc2VsZi5fc2V0dXBEYXRhKHtcbiAgICAgIGNoYW5uZWw6IHNlbGYuX3BjLmNyZWF0ZURhdGFDaGFubmVsKHNlbGYuY2hhbm5lbE5hbWUsIHNlbGYuY2hhbm5lbENvbmZpZylcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHNlbGYuX3BjLm9uZGF0YWNoYW5uZWwgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHNlbGYuX3NldHVwRGF0YShldmVudClcbiAgICB9XG4gIH1cblxuICBpZiAoJ2FkZFRyYWNrJyBpbiBzZWxmLl9wYykge1xuICAgIGlmIChzZWxmLnN0cmVhbXMpIHtcbiAgICAgIHNlbGYuc3RyZWFtcy5mb3JFYWNoKGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgICAgc2VsZi5hZGRTdHJlYW0oc3RyZWFtKVxuICAgICAgfSlcbiAgICB9XG4gICAgc2VsZi5fcGMub250cmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgc2VsZi5fb25UcmFjayhldmVudClcbiAgICB9XG4gIH1cblxuICBpZiAoc2VsZi5pbml0aWF0b3IpIHtcbiAgICBzZWxmLl9uZWVkc05lZ290aWF0aW9uKClcbiAgfVxuXG4gIHNlbGYuX29uRmluaXNoQm91bmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fb25GaW5pc2goKVxuICB9XG4gIHNlbGYub25jZSgnZmluaXNoJywgc2VsZi5fb25GaW5pc2hCb3VuZClcbn1cblxuUGVlci5XRUJSVENfU1VQUE9SVCA9ICEhZ2V0QnJvd3NlclJUQygpXG5cbi8qKlxuICogRXhwb3NlIGNvbmZpZywgY29uc3RyYWludHMsIGFuZCBkYXRhIGNoYW5uZWwgY29uZmlnIGZvciBvdmVycmlkaW5nIGFsbCBQZWVyXG4gKiBpbnN0YW5jZXMuIE90aGVyd2lzZSwganVzdCBzZXQgb3B0cy5jb25maWcsIG9wdHMuY29uc3RyYWludHMsIG9yIG9wdHMuY2hhbm5lbENvbmZpZ1xuICogd2hlbiBjb25zdHJ1Y3RpbmcgYSBQZWVyLlxuICovXG5QZWVyLmNvbmZpZyA9IHtcbiAgaWNlU2VydmVyczogW1xuICAgIHtcbiAgICAgIHVybHM6ICdzdHVuOnN0dW4ubC5nb29nbGUuY29tOjE5MzAyJ1xuICAgIH0sXG4gICAge1xuICAgICAgdXJsczogJ3N0dW46Z2xvYmFsLnN0dW4udHdpbGlvLmNvbTozNDc4P3RyYW5zcG9ydD11ZHAnXG4gICAgfVxuICBdXG59XG5QZWVyLmNvbnN0cmFpbnRzID0ge31cblBlZXIuY2hhbm5lbENvbmZpZyA9IHt9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShQZWVyLnByb3RvdHlwZSwgJ2J1ZmZlclNpemUnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpc1xuICAgIHJldHVybiAoc2VsZi5fY2hhbm5lbCAmJiBzZWxmLl9jaGFubmVsLmJ1ZmZlcmVkQW1vdW50KSB8fCAwXG4gIH1cbn0pXG5cblBlZXIucHJvdG90eXBlLmFkZHJlc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICByZXR1cm4geyBwb3J0OiBzZWxmLmxvY2FsUG9ydCwgZmFtaWx5OiAnSVB2NCcsIGFkZHJlc3M6IHNlbGYubG9jYWxBZGRyZXNzIH1cbn1cblxuUGVlci5wcm90b3R5cGUuc2lnbmFsID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgdGhyb3cgbWFrZUVycm9yKCdjYW5ub3Qgc2lnbmFsIGFmdGVyIHBlZXIgaXMgZGVzdHJveWVkJywgJ0VSUl9TSUdOQUxJTkcnKVxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBkYXRhID0ge31cbiAgICB9XG4gIH1cbiAgc2VsZi5fZGVidWcoJ3NpZ25hbCgpJylcblxuICBpZiAoZGF0YS5yZW5lZ290aWF0ZSkge1xuICAgIHNlbGYuX2RlYnVnKCdnb3QgcmVxdWVzdCB0byByZW5lZ290aWF0ZScpXG4gICAgc2VsZi5fbmVlZHNOZWdvdGlhdGlvbigpXG4gIH1cbiAgaWYgKGRhdGEuY2FuZGlkYXRlKSB7XG4gICAgaWYgKHNlbGYuX3BjLnJlbW90ZURlc2NyaXB0aW9uICYmIHNlbGYuX3BjLnJlbW90ZURlc2NyaXB0aW9uLnR5cGUpIHNlbGYuX2FkZEljZUNhbmRpZGF0ZShkYXRhLmNhbmRpZGF0ZSlcbiAgICBlbHNlIHNlbGYuX3BlbmRpbmdDYW5kaWRhdGVzLnB1c2goZGF0YS5jYW5kaWRhdGUpXG4gIH1cbiAgaWYgKGRhdGEuc2RwKSB7XG4gICAgc2VsZi5fcGMuc2V0UmVtb3RlRGVzY3JpcHRpb24obmV3IChzZWxmLl93cnRjLlJUQ1Nlc3Npb25EZXNjcmlwdGlvbikoZGF0YSksIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuXG5cbiAgICAgIHNlbGYuX3BlbmRpbmdDYW5kaWRhdGVzLmZvckVhY2goZnVuY3Rpb24gKGNhbmRpZGF0ZSkge1xuICAgICAgICBzZWxmLl9hZGRJY2VDYW5kaWRhdGUoY2FuZGlkYXRlKVxuICAgICAgfSlcbiAgICAgIHNlbGYuX3BlbmRpbmdDYW5kaWRhdGVzID0gW11cblxuICAgICAgaWYgKHNlbGYuX3BjLnJlbW90ZURlc2NyaXB0aW9uLnR5cGUgPT09ICdvZmZlcicpIHNlbGYuX2NyZWF0ZUFuc3dlcigpXG4gICAgfSwgZnVuY3Rpb24gKGVycikgeyBzZWxmLmRlc3Ryb3kobWFrZUVycm9yKGVyciwgJ0VSUl9TRVRfUkVNT1RFX0RFU0NSSVBUSU9OJykpIH0pXG4gIH1cbiAgaWYgKCFkYXRhLnNkcCAmJiAhZGF0YS5jYW5kaWRhdGUgJiYgIWRhdGEucmVuZWdvdGlhdGUpIHtcbiAgICBzZWxmLmRlc3Ryb3kobWFrZUVycm9yKCdzaWduYWwoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIHNpZ25hbCBkYXRhJywgJ0VSUl9TSUdOQUxJTkcnKSlcbiAgfVxufVxuXG5QZWVyLnByb3RvdHlwZS5fYWRkSWNlQ2FuZGlkYXRlID0gZnVuY3Rpb24gKGNhbmRpZGF0ZSkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdHJ5IHtcbiAgICBzZWxmLl9wYy5hZGRJY2VDYW5kaWRhdGUoXG4gICAgICBuZXcgc2VsZi5fd3J0Yy5SVENJY2VDYW5kaWRhdGUoY2FuZGlkYXRlKSxcbiAgICAgIG5vb3AsXG4gICAgICBmdW5jdGlvbiAoZXJyKSB7IHNlbGYuZGVzdHJveShtYWtlRXJyb3IoZXJyLCAnRVJSX0FERF9JQ0VfQ0FORElEQVRFJykpIH1cbiAgICApXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNlbGYuZGVzdHJveShtYWtlRXJyb3IoJ2Vycm9yIGFkZGluZyBjYW5kaWRhdGU6ICcgKyBlcnIubWVzc2FnZSwgJ0VSUl9BRERfSUNFX0NBTkRJREFURScpKVxuICB9XG59XG5cbi8qKlxuICogU2VuZCB0ZXh0L2JpbmFyeSBkYXRhIHRvIHRoZSByZW1vdGUgcGVlci5cbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJWaWV3fEFycmF5QnVmZmVyfEJ1ZmZlcnxzdHJpbmd8QmxvYn0gY2h1bmtcbiAqL1xuUGVlci5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgc2VsZi5fY2hhbm5lbC5zZW5kKGNodW5rKVxufVxuXG4vKipcbiAqIEFkZCBhIE1lZGlhU3RyZWFtIHRvIHRoZSBjb25uZWN0aW9uLlxuICogQHBhcmFtIHtNZWRpYVN0cmVhbX0gc3RyZWFtXG4gKi9cblBlZXIucHJvdG90eXBlLmFkZFN0cmVhbSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgc2VsZi5fZGVidWcoJ2FkZFN0cmVhbSgpJylcblxuICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHtcbiAgICBzZWxmLmFkZFRyYWNrKHRyYWNrLCBzdHJlYW0pXG4gIH0pXG59XG5cbi8qKlxuICogQWRkIGEgTWVkaWFTdHJlYW1UcmFjayB0byB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSB7TWVkaWFTdHJlYW1UcmFja30gdHJhY2tcbiAqIEBwYXJhbSB7TWVkaWFTdHJlYW19IHN0cmVhbVxuICovXG5QZWVyLnByb3RvdHlwZS5hZGRUcmFjayA9IGZ1bmN0aW9uICh0cmFjaywgc3RyZWFtKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHNlbGYuX2RlYnVnKCdhZGRUcmFjaygpJylcblxuICB2YXIgc2VuZGVyID0gc2VsZi5fcGMuYWRkVHJhY2sodHJhY2ssIHN0cmVhbSlcbiAgdmFyIHN1Ym1hcCA9IHNlbGYuX3NlbmRlck1hcC5nZXQodHJhY2spIHx8IG5ldyBXZWFrTWFwKCkgLy8gbmVzdGVkIFdlYWtNYXBzIG1hcCBbdHJhY2ssIHN0cmVhbV0gdG8gc2VuZGVyXG4gIHN1Ym1hcC5zZXQoc3RyZWFtLCBzZW5kZXIpXG4gIHNlbGYuX3NlbmRlck1hcC5zZXQodHJhY2ssIHN1Ym1hcClcbiAgc2VsZi5fbmVlZHNOZWdvdGlhdGlvbigpXG59XG5cbi8qKlxuICogUmVtb3ZlIGEgTWVkaWFTdHJlYW1UcmFjayBmcm9tIHRoZSBjb25uZWN0aW9uLlxuICogQHBhcmFtIHtNZWRpYVN0cmVhbVRyYWNrfSB0cmFja1xuICogQHBhcmFtIHtNZWRpYVN0cmVhbX0gc3RyZWFtXG4gKi9cblBlZXIucHJvdG90eXBlLnJlbW92ZVRyYWNrID0gZnVuY3Rpb24gKHRyYWNrLCBzdHJlYW0pIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgc2VsZi5fZGVidWcoJ3JlbW92ZVNlbmRlcigpJylcblxuICB2YXIgc3VibWFwID0gc2VsZi5fc2VuZGVyTWFwLmdldCh0cmFjaylcbiAgdmFyIHNlbmRlciA9IHN1Ym1hcCA/IHN1Ym1hcC5nZXQoc3RyZWFtKSA6IG51bGxcbiAgaWYgKCFzZW5kZXIpIHtcbiAgICBzZWxmLmRlc3Ryb3kobmV3IEVycm9yKCdDYW5ub3QgcmVtb3ZlIHRyYWNrIHRoYXQgd2FzIG5ldmVyIGFkZGVkLicpKVxuICB9XG4gIHRyeSB7XG4gICAgc2VsZi5fcGMucmVtb3ZlVHJhY2soc2VuZGVyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLm5hbWUgPT09ICdOU19FUlJPUl9VTkVYUEVDVEVEJykge1xuICAgICAgc2VsZi5fc2VuZGVyc0F3YWl0aW5nU3RhYmxlLnB1c2goc2VuZGVyKSAvLyBIQUNLOiBGaXJlZm94IG11c3Qgd2FpdCB1bnRpbCAoc2lnbmFsaW5nU3RhdGUgPT09IHN0YWJsZSkgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTEzMzg3NFxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmRlc3Ryb3koZXJyKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBhIE1lZGlhU3RyZWFtIGZyb20gdGhlIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBzdHJlYW1cbiAqL1xuUGVlci5wcm90b3R5cGUucmVtb3ZlU3RyZWFtID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBzZWxmLl9kZWJ1ZygncmVtb3ZlU2VuZGVycygpJylcblxuICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHtcbiAgICBzZWxmLnJlbW92ZVRyYWNrKHRyYWNrLCBzdHJlYW0pXG4gIH0pXG59XG5cblBlZXIucHJvdG90eXBlLl9uZWVkc05lZ290aWF0aW9uID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBzZWxmLl9kZWJ1ZygnX25lZWRzTmVnb3RpYXRpb24nKVxuICBpZiAoc2VsZi5fYmF0Y2hlZE5lZ290aWF0aW9uKSByZXR1cm4gLy8gYmF0Y2ggc3luY2hyb25vdXMgcmVuZWdvdGlhdGlvbnNcbiAgc2VsZi5fYmF0Y2hlZE5lZ290aWF0aW9uID0gdHJ1ZVxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLl9iYXRjaGVkTmVnb3RpYXRpb24gPSBmYWxzZVxuICAgIHNlbGYuX2RlYnVnKCdzdGFydGluZyBiYXRjaGVkIG5lZ290aWF0aW9uJylcbiAgICBzZWxmLm5lZ290aWF0ZSgpXG4gIH0sIDApXG59XG5cblBlZXIucHJvdG90eXBlLm5lZ290aWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgaWYgKHNlbGYuaW5pdGlhdG9yKSB7XG4gICAgaWYgKHNlbGYuX2lzTmVnb3RpYXRpbmcpIHtcbiAgICAgIHNlbGYuX3F1ZXVlZE5lZ290aWF0aW9uID0gdHJ1ZVxuICAgICAgc2VsZi5fZGVidWcoJ2FscmVhZHkgbmVnb3RpYXRpbmcsIHF1ZXVlaW5nJylcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5fZGVidWcoJ3N0YXJ0IG5lZ290aWF0aW9uJylcbiAgICAgIHNlbGYuX2NyZWF0ZU9mZmVyKClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2VsZi5fZGVidWcoJ3JlcXVlc3RpbmcgbmVnb3RpYXRpb24gZnJvbSBpbml0aWF0b3InKVxuICAgIHNlbGYuZW1pdCgnc2lnbmFsJywgeyAvLyByZXF1ZXN0IGluaXRpYXRvciB0byByZW5lZ290aWF0ZVxuICAgICAgcmVuZWdvdGlhdGU6IHRydWVcbiAgICB9KVxuICB9XG4gIHNlbGYuX2lzTmVnb3RpYXRpbmcgPSB0cnVlXG59XG5cbi8vIFRPRE86IERlbGV0ZSB0aGlzIG1ldGhvZCBvbmNlIHJlYWRhYmxlLXN0cmVhbSBpcyB1cGRhdGVkIHRvIGNvbnRhaW4gYSBkZWZhdWx0XG4vLyBpbXBsZW1lbnRhdGlvbiBvZiBkZXN0cm95KCkgdGhhdCBhdXRvbWF0aWNhbGx5IGNhbGxzIF9kZXN0cm95KClcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9yZWFkYWJsZS1zdHJlYW0vaXNzdWVzLzI4M1xuUGVlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHNlbGYuX2Rlc3Ryb3koZXJyLCBmdW5jdGlvbiAoKSB7fSlcbn1cblxuUGVlci5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cblxuICBzZWxmLl9kZWJ1ZygnZGVzdHJveSAoZXJyb3I6ICVzKScsIGVyciAmJiAoZXJyLm1lc3NhZ2UgfHwgZXJyKSlcblxuICBzZWxmLnJlYWRhYmxlID0gc2VsZi53cml0YWJsZSA9IGZhbHNlXG5cbiAgaWYgKCFzZWxmLl9yZWFkYWJsZVN0YXRlLmVuZGVkKSBzZWxmLnB1c2gobnVsbClcbiAgaWYgKCFzZWxmLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkKSBzZWxmLmVuZCgpXG5cbiAgc2VsZi5kZXN0cm95ZWQgPSB0cnVlXG4gIHNlbGYuY29ubmVjdGVkID0gZmFsc2VcbiAgc2VsZi5fcGNSZWFkeSA9IGZhbHNlXG4gIHNlbGYuX2NoYW5uZWxSZWFkeSA9IGZhbHNlXG4gIHNlbGYuX3JlbW90ZVRyYWNrcyA9IG51bGxcbiAgc2VsZi5fcmVtb3RlU3RyZWFtcyA9IG51bGxcbiAgc2VsZi5fc2VuZGVyTWFwID0gbnVsbFxuXG4gIGNsZWFySW50ZXJ2YWwoc2VsZi5faW50ZXJ2YWwpXG4gIHNlbGYuX2ludGVydmFsID0gbnVsbFxuICBzZWxmLl9jaHVuayA9IG51bGxcbiAgc2VsZi5fY2IgPSBudWxsXG5cbiAgaWYgKHNlbGYuX29uRmluaXNoQm91bmQpIHNlbGYucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIHNlbGYuX29uRmluaXNoQm91bmQpXG4gIHNlbGYuX29uRmluaXNoQm91bmQgPSBudWxsXG5cbiAgaWYgKHNlbGYuX2NoYW5uZWwpIHtcbiAgICB0cnkge1xuICAgICAgc2VsZi5fY2hhbm5lbC5jbG9zZSgpXG4gICAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gICAgc2VsZi5fY2hhbm5lbC5vbm1lc3NhZ2UgPSBudWxsXG4gICAgc2VsZi5fY2hhbm5lbC5vbm9wZW4gPSBudWxsXG4gICAgc2VsZi5fY2hhbm5lbC5vbmNsb3NlID0gbnVsbFxuICAgIHNlbGYuX2NoYW5uZWwub25lcnJvciA9IG51bGxcbiAgfVxuICBpZiAoc2VsZi5fcGMpIHtcbiAgICB0cnkge1xuICAgICAgc2VsZi5fcGMuY2xvc2UoKVxuICAgIH0gY2F0Y2ggKGVycikge31cblxuICAgIHNlbGYuX3BjLm9uaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlID0gbnVsbFxuICAgIHNlbGYuX3BjLm9uaWNlZ2F0aGVyaW5nc3RhdGVjaGFuZ2UgPSBudWxsXG4gICAgc2VsZi5fcGMub25zaWduYWxpbmdzdGF0ZWNoYW5nZSA9IG51bGxcbiAgICBzZWxmLl9wYy5vbmljZWNhbmRpZGF0ZSA9IG51bGxcbiAgICBpZiAoJ2FkZFRyYWNrJyBpbiBzZWxmLl9wYykge1xuICAgICAgc2VsZi5fcGMub250cmFjayA9IG51bGxcbiAgICB9XG4gICAgc2VsZi5fcGMub25kYXRhY2hhbm5lbCA9IG51bGxcbiAgfVxuICBzZWxmLl9wYyA9IG51bGxcbiAgc2VsZi5fY2hhbm5lbCA9IG51bGxcblxuICBpZiAoZXJyKSBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuICBzZWxmLmVtaXQoJ2Nsb3NlJylcbiAgY2IoKVxufVxuXG5QZWVyLnByb3RvdHlwZS5fc2V0dXBEYXRhID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoIWV2ZW50LmNoYW5uZWwpIHtcbiAgICAvLyBJbiBzb21lIHNpdHVhdGlvbnMgYHBjLmNyZWF0ZURhdGFDaGFubmVsKClgIHJldHVybnMgYHVuZGVmaW5lZGAgKGluIHdydGMpLFxuICAgIC8vIHdoaWNoIGlzIGludmFsaWQgYmVoYXZpb3IuIEhhbmRsZSBpdCBncmFjZWZ1bGx5LlxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9zaW1wbGUtcGVlci9pc3N1ZXMvMTYzXG4gICAgcmV0dXJuIHNlbGYuZGVzdHJveShtYWtlRXJyb3IoJ0RhdGEgY2hhbm5lbCBldmVudCBpcyBtaXNzaW5nIGBjaGFubmVsYCBwcm9wZXJ0eScsICdFUlJfREFUQV9DSEFOTkVMJykpXG4gIH1cblxuICBzZWxmLl9jaGFubmVsID0gZXZlbnQuY2hhbm5lbFxuICBzZWxmLl9jaGFubmVsLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInXG5cbiAgaWYgKHR5cGVvZiBzZWxmLl9jaGFubmVsLmJ1ZmZlcmVkQW1vdW50TG93VGhyZXNob2xkID09PSAnbnVtYmVyJykge1xuICAgIHNlbGYuX2NoYW5uZWwuYnVmZmVyZWRBbW91bnRMb3dUaHJlc2hvbGQgPSBNQVhfQlVGRkVSRURfQU1PVU5UXG4gIH1cblxuICBzZWxmLmNoYW5uZWxOYW1lID0gc2VsZi5fY2hhbm5lbC5sYWJlbFxuXG4gIHNlbGYuX2NoYW5uZWwub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgc2VsZi5fb25DaGFubmVsTWVzc2FnZShldmVudClcbiAgfVxuICBzZWxmLl9jaGFubmVsLm9uYnVmZmVyZWRhbW91bnRsb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fb25DaGFubmVsQnVmZmVyZWRBbW91bnRMb3coKVxuICB9XG4gIHNlbGYuX2NoYW5uZWwub25vcGVuID0gZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuX29uQ2hhbm5lbE9wZW4oKVxuICB9XG4gIHNlbGYuX2NoYW5uZWwub25jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLl9vbkNoYW5uZWxDbG9zZSgpXG4gIH1cbiAgc2VsZi5fY2hhbm5lbC5vbmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgIHNlbGYuZGVzdHJveShtYWtlRXJyb3IoZXJyLCAnRVJSX0RBVEFfQ0hBTk5FTCcpKVxuICB9XG59XG5cblBlZXIucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge31cblxuUGVlci5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuIGNiKG1ha2VFcnJvcignY2Fubm90IHdyaXRlIGFmdGVyIHBlZXIgaXMgZGVzdHJveWVkJywgJ0VSUl9EQVRBX0NIQU5ORUwnKSlcblxuICBpZiAoc2VsZi5jb25uZWN0ZWQpIHtcbiAgICB0cnkge1xuICAgICAgc2VsZi5zZW5kKGNodW5rKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHNlbGYuZGVzdHJveShtYWtlRXJyb3IoZXJyLCAnRVJSX0RBVEFfQ0hBTk5FTCcpKVxuICAgIH1cbiAgICBpZiAoc2VsZi5fY2hhbm5lbC5idWZmZXJlZEFtb3VudCA+IE1BWF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgIHNlbGYuX2RlYnVnKCdzdGFydCBiYWNrcHJlc3N1cmU6IGJ1ZmZlcmVkQW1vdW50ICVkJywgc2VsZi5fY2hhbm5lbC5idWZmZXJlZEFtb3VudClcbiAgICAgIHNlbGYuX2NiID0gY2JcbiAgICB9IGVsc2Uge1xuICAgICAgY2IobnVsbClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2VsZi5fZGVidWcoJ3dyaXRlIGJlZm9yZSBjb25uZWN0JylcbiAgICBzZWxmLl9jaHVuayA9IGNodW5rXG4gICAgc2VsZi5fY2IgPSBjYlxuICB9XG59XG5cbi8vIFdoZW4gc3RyZWFtIGZpbmlzaGVzIHdyaXRpbmcsIGNsb3NlIHNvY2tldC4gSGFsZiBvcGVuIGNvbm5lY3Rpb25zIGFyZSBub3Rcbi8vIHN1cHBvcnRlZC5cblBlZXIucHJvdG90eXBlLl9vbkZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuXG5cbiAgaWYgKHNlbGYuY29ubmVjdGVkKSB7XG4gICAgZGVzdHJveVNvb24oKVxuICB9IGVsc2Uge1xuICAgIHNlbGYub25jZSgnY29ubmVjdCcsIGRlc3Ryb3lTb29uKVxuICB9XG5cbiAgLy8gV2FpdCBhIGJpdCBiZWZvcmUgZGVzdHJveWluZyBzbyB0aGUgc29ja2V0IGZsdXNoZXMuXG4gIC8vIFRPRE86IGlzIHRoZXJlIGEgbW9yZSByZWxpYWJsZSB3YXkgdG8gYWNjb21wbGlzaCB0aGlzP1xuICBmdW5jdGlvbiBkZXN0cm95U29vbiAoKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmRlc3Ryb3koKVxuICAgIH0sIDEwMDApXG4gIH1cbn1cblxuUGVlci5wcm90b3R5cGUuX2NyZWF0ZU9mZmVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cblxuICBzZWxmLl9wYy5jcmVhdGVPZmZlcihmdW5jdGlvbiAob2ZmZXIpIHtcbiAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuICAgIG9mZmVyLnNkcCA9IHNlbGYuc2RwVHJhbnNmb3JtKG9mZmVyLnNkcClcbiAgICBzZWxmLl9wYy5zZXRMb2NhbERlc2NyaXB0aW9uKG9mZmVyLCBvblN1Y2Nlc3MsIG9uRXJyb3IpXG5cbiAgICBmdW5jdGlvbiBvblN1Y2Nlc3MgKCkge1xuICAgICAgc2VsZi5fZGVidWcoJ2NyZWF0ZU9mZmVyIHN1Y2Nlc3MnKVxuICAgICAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cbiAgICAgIGlmIChzZWxmLnRyaWNrbGUgfHwgc2VsZi5faWNlQ29tcGxldGUpIHNlbmRPZmZlcigpXG4gICAgICBlbHNlIHNlbGYub25jZSgnX2ljZUNvbXBsZXRlJywgc2VuZE9mZmVyKSAvLyB3YWl0IGZvciBjYW5kaWRhdGVzXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25FcnJvciAoZXJyKSB7XG4gICAgICBzZWxmLmRlc3Ryb3kobWFrZUVycm9yKGVyciwgJ0VSUl9TRVRfTE9DQUxfREVTQ1JJUFRJT04nKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZW5kT2ZmZXIgKCkge1xuICAgICAgdmFyIHNpZ25hbCA9IHNlbGYuX3BjLmxvY2FsRGVzY3JpcHRpb24gfHwgb2ZmZXJcbiAgICAgIHNlbGYuX2RlYnVnKCdzaWduYWwnKVxuICAgICAgc2VsZi5lbWl0KCdzaWduYWwnLCB7XG4gICAgICAgIHR5cGU6IHNpZ25hbC50eXBlLFxuICAgICAgICBzZHA6IHNpZ25hbC5zZHBcbiAgICAgIH0pXG4gICAgfVxuICB9LCBmdW5jdGlvbiAoZXJyKSB7IHNlbGYuZGVzdHJveShtYWtlRXJyb3IoZXJyLCAnRVJSX0NSRUFURV9PRkZFUicpKSB9LCBzZWxmLm9mZmVyQ29uc3RyYWludHMpXG59XG5cblBlZXIucHJvdG90eXBlLl9jcmVhdGVBbnN3ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuXG4gIHNlbGYuX3BjLmNyZWF0ZUFuc3dlcihmdW5jdGlvbiAoYW5zd2VyKSB7XG4gICAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cbiAgICBhbnN3ZXIuc2RwID0gc2VsZi5zZHBUcmFuc2Zvcm0oYW5zd2VyLnNkcClcbiAgICBzZWxmLl9wYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlciwgb25TdWNjZXNzLCBvbkVycm9yKVxuXG4gICAgZnVuY3Rpb24gb25TdWNjZXNzICgpIHtcbiAgICAgIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuXG4gICAgICBpZiAoc2VsZi50cmlja2xlIHx8IHNlbGYuX2ljZUNvbXBsZXRlKSBzZW5kQW5zd2VyKClcbiAgICAgIGVsc2Ugc2VsZi5vbmNlKCdfaWNlQ29tcGxldGUnLCBzZW5kQW5zd2VyKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRXJyb3IgKGVycikge1xuICAgICAgc2VsZi5kZXN0cm95KG1ha2VFcnJvcihlcnIsICdFUlJfU0VUX0xPQ0FMX0RFU0NSSVBUSU9OJykpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2VuZEFuc3dlciAoKSB7XG4gICAgICB2YXIgc2lnbmFsID0gc2VsZi5fcGMubG9jYWxEZXNjcmlwdGlvbiB8fCBhbnN3ZXJcbiAgICAgIHNlbGYuX2RlYnVnKCdzaWduYWwnKVxuICAgICAgc2VsZi5lbWl0KCdzaWduYWwnLCB7XG4gICAgICAgIHR5cGU6IHNpZ25hbC50eXBlLFxuICAgICAgICBzZHA6IHNpZ25hbC5zZHBcbiAgICAgIH0pXG4gICAgfVxuICB9LCBmdW5jdGlvbiAoZXJyKSB7IHNlbGYuZGVzdHJveShtYWtlRXJyb3IoZXJyLCAnRVJSX0NSRUFURV9BTlNXRVInKSkgfSwgc2VsZi5hbnN3ZXJDb25zdHJhaW50cylcbn1cblxuUGVlci5wcm90b3R5cGUuX29uSWNlU3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuICB2YXIgaWNlQ29ubmVjdGlvblN0YXRlID0gc2VsZi5fcGMuaWNlQ29ubmVjdGlvblN0YXRlXG4gIHZhciBpY2VHYXRoZXJpbmdTdGF0ZSA9IHNlbGYuX3BjLmljZUdhdGhlcmluZ1N0YXRlXG5cbiAgc2VsZi5fZGVidWcoXG4gICAgJ2ljZVN0YXRlQ2hhbmdlIChjb25uZWN0aW9uOiAlcykgKGdhdGhlcmluZzogJXMpJyxcbiAgICBpY2VDb25uZWN0aW9uU3RhdGUsXG4gICAgaWNlR2F0aGVyaW5nU3RhdGVcbiAgKVxuICBzZWxmLmVtaXQoJ2ljZVN0YXRlQ2hhbmdlJywgaWNlQ29ubmVjdGlvblN0YXRlLCBpY2VHYXRoZXJpbmdTdGF0ZSlcblxuICBpZiAoaWNlQ29ubmVjdGlvblN0YXRlID09PSAnY29ubmVjdGVkJyB8fCBpY2VDb25uZWN0aW9uU3RhdGUgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgc2VsZi5fcGNSZWFkeSA9IHRydWVcbiAgICBzZWxmLl9tYXliZVJlYWR5KClcbiAgfVxuICBpZiAoaWNlQ29ubmVjdGlvblN0YXRlID09PSAnZmFpbGVkJykge1xuICAgIHNlbGYuZGVzdHJveShtYWtlRXJyb3IoJ0ljZSBjb25uZWN0aW9uIGZhaWxlZC4nLCAnRVJSX0lDRV9DT05ORUNUSU9OX0ZBSUxVUkUnKSlcbiAgfVxuICBpZiAoaWNlQ29ubmVjdGlvblN0YXRlID09PSAnY2xvc2VkJykge1xuICAgIHNlbGYuZGVzdHJveShuZXcgRXJyb3IoJ0ljZSBjb25uZWN0aW9uIGNsb3NlZC4nKSlcbiAgfVxufVxuXG5QZWVyLnByb3RvdHlwZS5nZXRTdGF0cyA9IGZ1bmN0aW9uIChjYikge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICAvLyBQcm9taXNlLWJhc2VkIGdldFN0YXRzKCkgKHN0YW5kYXJkKVxuICBpZiAoc2VsZi5fcGMuZ2V0U3RhdHMubGVuZ3RoID09PSAwKSB7XG4gICAgc2VsZi5fcGMuZ2V0U3RhdHMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHZhciByZXBvcnRzID0gW11cbiAgICAgIHJlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZXBvcnQpIHtcbiAgICAgICAgcmVwb3J0cy5wdXNoKHJlcG9ydClcbiAgICAgIH0pXG4gICAgICBjYihudWxsLCByZXBvcnRzKVxuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsgY2IoZXJyKSB9KVxuXG4gIC8vIFR3by1wYXJhbWV0ZXIgY2FsbGJhY2stYmFzZWQgZ2V0U3RhdHMoKSAoZGVwcmVjYXRlZCwgZm9ybWVyIHN0YW5kYXJkKVxuICB9IGVsc2UgaWYgKHNlbGYuX2lzUmVhY3ROYXRpdmVXZWJydGMpIHtcbiAgICBzZWxmLl9wYy5nZXRTdGF0cyhudWxsLCBmdW5jdGlvbiAocmVzKSB7XG4gICAgICB2YXIgcmVwb3J0cyA9IFtdXG4gICAgICByZXMuZm9yRWFjaChmdW5jdGlvbiAocmVwb3J0KSB7XG4gICAgICAgIHJlcG9ydHMucHVzaChyZXBvcnQpXG4gICAgICB9KVxuICAgICAgY2IobnVsbCwgcmVwb3J0cylcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7IGNiKGVycikgfSlcblxuICAvLyBTaW5nbGUtcGFyYW1ldGVyIGNhbGxiYWNrLWJhc2VkIGdldFN0YXRzKCkgKG5vbi1zdGFuZGFyZClcbiAgfSBlbHNlIGlmIChzZWxmLl9wYy5nZXRTdGF0cy5sZW5ndGggPiAwKSB7XG4gICAgc2VsZi5fcGMuZ2V0U3RhdHMoZnVuY3Rpb24gKHJlcykge1xuICAgICAgLy8gSWYgd2UgZGVzdHJveSBjb25uZWN0aW9uIGluIGBjb25uZWN0YCBjYWxsYmFjayB0aGlzIGNvZGUgbWlnaHQgaGFwcGVuIHRvIHJ1biB3aGVuIGFjdHVhbCBjb25uZWN0aW9uIGlzIGFscmVhZHkgY2xvc2VkXG4gICAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuXG4gICAgICB2YXIgcmVwb3J0cyA9IFtdXG4gICAgICByZXMucmVzdWx0KCkuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIHZhciByZXBvcnQgPSB7fVxuICAgICAgICByZXN1bHQubmFtZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgcmVwb3J0W25hbWVdID0gcmVzdWx0LnN0YXQobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmVwb3J0LmlkID0gcmVzdWx0LmlkXG4gICAgICAgIHJlcG9ydC50eXBlID0gcmVzdWx0LnR5cGVcbiAgICAgICAgcmVwb3J0LnRpbWVzdGFtcCA9IHJlc3VsdC50aW1lc3RhbXBcbiAgICAgICAgcmVwb3J0cy5wdXNoKHJlcG9ydClcbiAgICAgIH0pXG4gICAgICBjYihudWxsLCByZXBvcnRzKVxuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsgY2IoZXJyKSB9KVxuXG4gIC8vIFVua25vd24gYnJvd3Nlciwgc2tpcCBnZXRTdGF0cygpIHNpbmNlIGl0J3MgYW55b25lJ3MgZ3Vlc3Mgd2hpY2ggc3R5bGUgb2ZcbiAgLy8gZ2V0U3RhdHMoKSB0aGV5IGltcGxlbWVudC5cbiAgfSBlbHNlIHtcbiAgICBjYihudWxsLCBbXSlcbiAgfVxufVxuXG5QZWVyLnByb3RvdHlwZS5fbWF5YmVSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHNlbGYuX2RlYnVnKCdtYXliZVJlYWR5IHBjICVzIGNoYW5uZWwgJXMnLCBzZWxmLl9wY1JlYWR5LCBzZWxmLl9jaGFubmVsUmVhZHkpXG4gIGlmIChzZWxmLmNvbm5lY3RlZCB8fCBzZWxmLl9jb25uZWN0aW5nIHx8ICFzZWxmLl9wY1JlYWR5IHx8ICFzZWxmLl9jaGFubmVsUmVhZHkpIHJldHVyblxuXG4gIHNlbGYuX2Nvbm5lY3RpbmcgPSB0cnVlXG5cbiAgLy8gSEFDSzogV2UgY2FuJ3QgcmVseSBvbiBvcmRlciBoZXJlLCBmb3IgZGV0YWlscyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2pzLXBsYXRmb3JtL25vZGUtd2VicnRjL2lzc3Vlcy8zMzlcbiAgZnVuY3Rpb24gZmluZENhbmRpZGF0ZVBhaXIgKCkge1xuICAgIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuXG5cbiAgICBzZWxmLmdldFN0YXRzKGZ1bmN0aW9uIChlcnIsIGl0ZW1zKSB7XG4gICAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuXG4gICAgICAvLyBUcmVhdCBnZXRTdGF0cyBlcnJvciBhcyBub24tZmF0YWwuIEl0J3Mgbm90IGVzc2VudGlhbC5cbiAgICAgIGlmIChlcnIpIGl0ZW1zID0gW11cblxuICAgICAgdmFyIHJlbW90ZUNhbmRpZGF0ZXMgPSB7fVxuICAgICAgdmFyIGxvY2FsQ2FuZGlkYXRlcyA9IHt9XG4gICAgICB2YXIgY2FuZGlkYXRlUGFpcnMgPSB7fVxuICAgICAgdmFyIGZvdW5kU2VsZWN0ZWRDYW5kaWRhdGVQYWlyID0gZmFsc2VcblxuICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAvLyBUT0RPOiBPbmNlIGFsbCBicm93c2VycyBzdXBwb3J0IHRoZSBoeXBoZW5hdGVkIHN0YXRzIHJlcG9ydCB0eXBlcywgcmVtb3ZlXG4gICAgICAgIC8vIHRoZSBub24taHlwZW5hdGVkIG9uZXNcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3JlbW90ZWNhbmRpZGF0ZScgfHwgaXRlbS50eXBlID09PSAncmVtb3RlLWNhbmRpZGF0ZScpIHtcbiAgICAgICAgICByZW1vdGVDYW5kaWRhdGVzW2l0ZW0uaWRdID0gaXRlbVxuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdsb2NhbGNhbmRpZGF0ZScgfHwgaXRlbS50eXBlID09PSAnbG9jYWwtY2FuZGlkYXRlJykge1xuICAgICAgICAgIGxvY2FsQ2FuZGlkYXRlc1tpdGVtLmlkXSA9IGl0ZW1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnY2FuZGlkYXRlcGFpcicgfHwgaXRlbS50eXBlID09PSAnY2FuZGlkYXRlLXBhaXInKSB7XG4gICAgICAgICAgY2FuZGlkYXRlUGFpcnNbaXRlbS5pZF0gPSBpdGVtXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgLy8gU3BlYy1jb21wbGlhbnRcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3RyYW5zcG9ydCcgJiYgaXRlbS5zZWxlY3RlZENhbmRpZGF0ZVBhaXJJZCkge1xuICAgICAgICAgIHNldFNlbGVjdGVkQ2FuZGlkYXRlUGFpcihjYW5kaWRhdGVQYWlyc1tpdGVtLnNlbGVjdGVkQ2FuZGlkYXRlUGFpcklkXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9sZCBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChpdGVtLnR5cGUgPT09ICdnb29nQ2FuZGlkYXRlUGFpcicgJiYgaXRlbS5nb29nQWN0aXZlQ29ubmVjdGlvbiA9PT0gJ3RydWUnKSB8fFxuICAgICAgICAgICgoaXRlbS50eXBlID09PSAnY2FuZGlkYXRlcGFpcicgfHwgaXRlbS50eXBlID09PSAnY2FuZGlkYXRlLXBhaXInKSAmJiBpdGVtLnNlbGVjdGVkKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRTZWxlY3RlZENhbmRpZGF0ZVBhaXIoaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgZnVuY3Rpb24gc2V0U2VsZWN0ZWRDYW5kaWRhdGVQYWlyIChzZWxlY3RlZENhbmRpZGF0ZVBhaXIpIHtcbiAgICAgICAgZm91bmRTZWxlY3RlZENhbmRpZGF0ZVBhaXIgPSB0cnVlXG5cbiAgICAgICAgdmFyIGxvY2FsID0gbG9jYWxDYW5kaWRhdGVzW3NlbGVjdGVkQ2FuZGlkYXRlUGFpci5sb2NhbENhbmRpZGF0ZUlkXVxuXG4gICAgICAgIGlmIChsb2NhbCAmJiBsb2NhbC5pcCkge1xuICAgICAgICAgIC8vIFNwZWNcbiAgICAgICAgICBzZWxmLmxvY2FsQWRkcmVzcyA9IGxvY2FsLmlwXG4gICAgICAgICAgc2VsZi5sb2NhbFBvcnQgPSBOdW1iZXIobG9jYWwucG9ydClcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbCAmJiBsb2NhbC5pcEFkZHJlc3MpIHtcbiAgICAgICAgICAvLyBGaXJlZm94XG4gICAgICAgICAgc2VsZi5sb2NhbEFkZHJlc3MgPSBsb2NhbC5pcEFkZHJlc3NcbiAgICAgICAgICBzZWxmLmxvY2FsUG9ydCA9IE51bWJlcihsb2NhbC5wb3J0TnVtYmVyKVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxlY3RlZENhbmRpZGF0ZVBhaXIuZ29vZ0xvY2FsQWRkcmVzcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBvbmNlIENocm9tZSA1OCBpcyByZWxlYXNlZFxuICAgICAgICAgIGxvY2FsID0gc2VsZWN0ZWRDYW5kaWRhdGVQYWlyLmdvb2dMb2NhbEFkZHJlc3Muc3BsaXQoJzonKVxuICAgICAgICAgIHNlbGYubG9jYWxBZGRyZXNzID0gbG9jYWxbMF1cbiAgICAgICAgICBzZWxmLmxvY2FsUG9ydCA9IE51bWJlcihsb2NhbFsxXSlcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZW1vdGUgPSByZW1vdGVDYW5kaWRhdGVzW3NlbGVjdGVkQ2FuZGlkYXRlUGFpci5yZW1vdGVDYW5kaWRhdGVJZF1cblxuICAgICAgICBpZiAocmVtb3RlICYmIHJlbW90ZS5pcCkge1xuICAgICAgICAgIC8vIFNwZWNcbiAgICAgICAgICBzZWxmLnJlbW90ZUFkZHJlc3MgPSByZW1vdGUuaXBcbiAgICAgICAgICBzZWxmLnJlbW90ZVBvcnQgPSBOdW1iZXIocmVtb3RlLnBvcnQpXG4gICAgICAgIH0gZWxzZSBpZiAocmVtb3RlICYmIHJlbW90ZS5pcEFkZHJlc3MpIHtcbiAgICAgICAgICAvLyBGaXJlZm94XG4gICAgICAgICAgc2VsZi5yZW1vdGVBZGRyZXNzID0gcmVtb3RlLmlwQWRkcmVzc1xuICAgICAgICAgIHNlbGYucmVtb3RlUG9ydCA9IE51bWJlcihyZW1vdGUucG9ydE51bWJlcilcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZWN0ZWRDYW5kaWRhdGVQYWlyLmdvb2dSZW1vdGVBZGRyZXNzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIG9uY2UgQ2hyb21lIDU4IGlzIHJlbGVhc2VkXG4gICAgICAgICAgcmVtb3RlID0gc2VsZWN0ZWRDYW5kaWRhdGVQYWlyLmdvb2dSZW1vdGVBZGRyZXNzLnNwbGl0KCc6JylcbiAgICAgICAgICBzZWxmLnJlbW90ZUFkZHJlc3MgPSByZW1vdGVbMF1cbiAgICAgICAgICBzZWxmLnJlbW90ZVBvcnQgPSBOdW1iZXIocmVtb3RlWzFdKVxuICAgICAgICB9XG4gICAgICAgIHNlbGYucmVtb3RlRmFtaWx5ID0gJ0lQdjQnXG5cbiAgICAgICAgc2VsZi5fZGVidWcoXG4gICAgICAgICAgJ2Nvbm5lY3QgbG9jYWw6ICVzOiVzIHJlbW90ZTogJXM6JXMnLFxuICAgICAgICAgIHNlbGYubG9jYWxBZGRyZXNzLCBzZWxmLmxvY2FsUG9ydCwgc2VsZi5yZW1vdGVBZGRyZXNzLCBzZWxmLnJlbW90ZVBvcnRcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBJZ25vcmUgY2FuZGlkYXRlIHBhaXIgc2VsZWN0aW9uIGluIGJyb3dzZXJzIGxpa2UgU2FmYXJpIDExIHRoYXQgZG8gbm90IGhhdmUgYW55IGxvY2FsIG9yIHJlbW90ZSBjYW5kaWRhdGVzXG4gICAgICAvLyBCdXQgd2FpdCB1bnRpbCBhdCBsZWFzdCAxIGNhbmRpZGF0ZSBwYWlyIGlzIGF2YWlsYWJsZVxuICAgICAgaWYgKCFmb3VuZFNlbGVjdGVkQ2FuZGlkYXRlUGFpciAmJiAoIU9iamVjdC5rZXlzKGNhbmRpZGF0ZVBhaXJzKS5sZW5ndGggfHwgT2JqZWN0LmtleXMobG9jYWxDYW5kaWRhdGVzKS5sZW5ndGgpKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZmluZENhbmRpZGF0ZVBhaXIsIDEwMClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLl9jb25uZWN0aW5nID0gZmFsc2VcbiAgICAgICAgc2VsZi5jb25uZWN0ZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9jaHVuaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNlbGYuc2VuZChzZWxmLl9jaHVuaylcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuZGVzdHJveShtYWtlRXJyb3IoZXJyLCAnRVJSX0RBVEFfQ0hBTk5FTCcpKVxuICAgICAgICB9XG4gICAgICAgIHNlbGYuX2NodW5rID0gbnVsbFxuICAgICAgICBzZWxmLl9kZWJ1Zygnc2VudCBjaHVuayBmcm9tIFwid3JpdGUgYmVmb3JlIGNvbm5lY3RcIicpXG5cbiAgICAgICAgdmFyIGNiID0gc2VsZi5fY2JcbiAgICAgICAgc2VsZi5fY2IgPSBudWxsXG4gICAgICAgIGNiKG51bGwpXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGBidWZmZXJlZEFtb3VudExvd1RocmVzaG9sZGAgYW5kICdvbmJ1ZmZlcmVkYW1vdW50bG93JyBhcmUgdW5zdXBwb3J0ZWQsXG4gICAgICAvLyBmYWxsYmFjayB0byB1c2luZyBzZXRJbnRlcnZhbCB0byBpbXBsZW1lbnQgYmFja3ByZXNzdXJlLlxuICAgICAgaWYgKHR5cGVvZiBzZWxmLl9jaGFubmVsLmJ1ZmZlcmVkQW1vdW50TG93VGhyZXNob2xkICE9PSAnbnVtYmVyJykge1xuICAgICAgICBzZWxmLl9pbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsgc2VsZi5fb25JbnRlcnZhbCgpIH0sIDE1MClcbiAgICAgICAgaWYgKHNlbGYuX2ludGVydmFsLnVucmVmKSBzZWxmLl9pbnRlcnZhbC51bnJlZigpXG4gICAgICB9XG5cbiAgICAgIHNlbGYuX2RlYnVnKCdjb25uZWN0JylcbiAgICAgIHNlbGYuZW1pdCgnY29ubmVjdCcpXG4gICAgfSlcbiAgfVxuICBmaW5kQ2FuZGlkYXRlUGFpcigpXG59XG5cblBlZXIucHJvdG90eXBlLl9vbkludGVydmFsID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKCFzZWxmLl9jYiB8fCAhc2VsZi5fY2hhbm5lbCB8fCBzZWxmLl9jaGFubmVsLmJ1ZmZlcmVkQW1vdW50ID4gTUFYX0JVRkZFUkVEX0FNT1VOVCkge1xuICAgIHJldHVyblxuICB9XG4gIHNlbGYuX29uQ2hhbm5lbEJ1ZmZlcmVkQW1vdW50TG93KClcbn1cblxuUGVlci5wcm90b3R5cGUuX29uU2lnbmFsaW5nU3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuXG4gIGlmIChzZWxmLl9wYy5zaWduYWxpbmdTdGF0ZSA9PT0gJ3N0YWJsZScpIHtcbiAgICBzZWxmLl9pc05lZ290aWF0aW5nID0gZmFsc2VcblxuICAgIC8vIEhBQ0s6IEZpcmVmb3ggZG9lc24ndCB5ZXQgc3VwcG9ydCByZW1vdmluZyB0cmFja3Mgd2hlbiBzaWduYWxpbmdTdGF0ZSAhPT0gJ3N0YWJsZSdcbiAgICBzZWxmLl9kZWJ1ZygnZmx1c2hpbmcgc2VuZGVyIHF1ZXVlJywgc2VsZi5fc2VuZGVyc0F3YWl0aW5nU3RhYmxlKVxuICAgIHNlbGYuX3NlbmRlcnNBd2FpdGluZ1N0YWJsZS5mb3JFYWNoKGZ1bmN0aW9uIChzZW5kZXIpIHtcbiAgICAgIHNlbGYucmVtb3ZlVHJhY2soc2VuZGVyKVxuICAgICAgc2VsZi5fcXVldWVkTmVnb3RpYXRpb24gPSB0cnVlXG4gICAgfSlcbiAgICBzZWxmLl9zZW5kZXJzQXdhaXRpbmdTdGFibGUgPSBbXVxuXG4gICAgaWYgKHNlbGYuX3F1ZXVlZE5lZ290aWF0aW9uKSB7XG4gICAgICBzZWxmLl9kZWJ1ZygnZmx1c2hpbmcgbmVnb3RpYXRpb24gcXVldWUnKVxuICAgICAgc2VsZi5fcXVldWVkTmVnb3RpYXRpb24gPSBmYWxzZVxuICAgICAgc2VsZi5fbmVlZHNOZWdvdGlhdGlvbigpIC8vIG5lZ290aWF0ZSBhZ2FpblxuICAgIH1cblxuICAgIHNlbGYuX2RlYnVnKCduZWdvdGlhdGUnKVxuICAgIHNlbGYuZW1pdCgnbmVnb3RpYXRlJylcbiAgfVxuXG4gIHNlbGYuX2RlYnVnKCdzaWduYWxpbmdTdGF0ZUNoYW5nZSAlcycsIHNlbGYuX3BjLnNpZ25hbGluZ1N0YXRlKVxuICBzZWxmLmVtaXQoJ3NpZ25hbGluZ1N0YXRlQ2hhbmdlJywgc2VsZi5fcGMuc2lnbmFsaW5nU3RhdGUpXG59XG5cblBlZXIucHJvdG90eXBlLl9vbkljZUNhbmRpZGF0ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cbiAgaWYgKGV2ZW50LmNhbmRpZGF0ZSAmJiBzZWxmLnRyaWNrbGUpIHtcbiAgICBzZWxmLmVtaXQoJ3NpZ25hbCcsIHtcbiAgICAgIGNhbmRpZGF0ZToge1xuICAgICAgICBjYW5kaWRhdGU6IGV2ZW50LmNhbmRpZGF0ZS5jYW5kaWRhdGUsXG4gICAgICAgIHNkcE1MaW5lSW5kZXg6IGV2ZW50LmNhbmRpZGF0ZS5zZHBNTGluZUluZGV4LFxuICAgICAgICBzZHBNaWQ6IGV2ZW50LmNhbmRpZGF0ZS5zZHBNaWRcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKCFldmVudC5jYW5kaWRhdGUpIHtcbiAgICBzZWxmLl9pY2VDb21wbGV0ZSA9IHRydWVcbiAgICBzZWxmLmVtaXQoJ19pY2VDb21wbGV0ZScpXG4gIH1cbn1cblxuUGVlci5wcm90b3R5cGUuX29uQ2hhbm5lbE1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuXG4gIHZhciBkYXRhID0gZXZlbnQuZGF0YVxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSBkYXRhID0gQnVmZmVyLmZyb20oZGF0YSlcbiAgc2VsZi5wdXNoKGRhdGEpXG59XG5cblBlZXIucHJvdG90eXBlLl9vbkNoYW5uZWxCdWZmZXJlZEFtb3VudExvdyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLmRlc3Ryb3llZCB8fCAhc2VsZi5fY2IpIHJldHVyblxuICBzZWxmLl9kZWJ1ZygnZW5kaW5nIGJhY2twcmVzc3VyZTogYnVmZmVyZWRBbW91bnQgJWQnLCBzZWxmLl9jaGFubmVsLmJ1ZmZlcmVkQW1vdW50KVxuICB2YXIgY2IgPSBzZWxmLl9jYlxuICBzZWxmLl9jYiA9IG51bGxcbiAgY2IobnVsbClcbn1cblxuUGVlci5wcm90b3R5cGUuX29uQ2hhbm5lbE9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5jb25uZWN0ZWQgfHwgc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuICBzZWxmLl9kZWJ1Zygnb24gY2hhbm5lbCBvcGVuJylcbiAgc2VsZi5fY2hhbm5lbFJlYWR5ID0gdHJ1ZVxuICBzZWxmLl9tYXliZVJlYWR5KClcbn1cblxuUGVlci5wcm90b3R5cGUuX29uQ2hhbm5lbENsb3NlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cbiAgc2VsZi5fZGVidWcoJ29uIGNoYW5uZWwgY2xvc2UnKVxuICBzZWxmLmRlc3Ryb3koKVxufVxuXG5QZWVyLnByb3RvdHlwZS5fb25UcmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cblxuICBldmVudC5zdHJlYW1zLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50U3RyZWFtKSB7XG4gICAgc2VsZi5fZGVidWcoJ29uIHRyYWNrJylcbiAgICBzZWxmLmVtaXQoJ3RyYWNrJywgZXZlbnQudHJhY2ssIGV2ZW50U3RyZWFtKVxuXG4gICAgc2VsZi5fcmVtb3RlVHJhY2tzLnB1c2goe1xuICAgICAgdHJhY2s6IGV2ZW50LnRyYWNrLFxuICAgICAgc3RyZWFtOiBldmVudFN0cmVhbVxuICAgIH0pXG5cbiAgICBpZiAoc2VsZi5fcmVtb3RlU3RyZWFtcy5zb21lKGZ1bmN0aW9uIChyZW1vdGVTdHJlYW0pIHtcbiAgICAgIHJldHVybiByZW1vdGVTdHJlYW0uaWQgPT09IGV2ZW50U3RyZWFtLmlkXG4gICAgfSkpIHJldHVybiAvLyBPbmx5IGZpcmUgb25lICdzdHJlYW0nIGV2ZW50LCBldmVuIHRob3VnaCB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgdHJhY2tzIHBlciBzdHJlYW1cblxuICAgIHNlbGYuX3JlbW90ZVN0cmVhbXMucHVzaChldmVudFN0cmVhbSlcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuZW1pdCgnc3RyZWFtJywgZXZlbnRTdHJlYW0pIC8vIGVuc3VyZSBhbGwgdHJhY2tzIGhhdmUgYmVlbiBhZGRlZFxuICAgIH0sIDApXG4gIH0pXG59XG5cblBlZXIucHJvdG90eXBlLl9kZWJ1ZyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gIGFyZ3NbMF0gPSAnWycgKyBzZWxmLl9pZCArICddICcgKyBhcmdzWzBdXG4gIGRlYnVnLmFwcGx5KG51bGwsIGFyZ3MpXG59XG5cbi8vIFRyYW5zZm9ybSBjb25zdHJhaW50cyBvYmplY3RzIGludG8gdGhlIG5ldyBmb3JtYXQgKHVubGVzcyBDaHJvbWl1bSlcbi8vIFRPRE86IFRoaXMgY2FuIGJlIHJlbW92ZWQgd2hlbiBDaHJvbWl1bSBzdXBwb3J0cyB0aGUgbmV3IGZvcm1hdFxuUGVlci5wcm90b3R5cGUuX3RyYW5zZm9ybUNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKGNvbnN0cmFpbnRzKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGlmIChPYmplY3Qua2V5cyhjb25zdHJhaW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGNvbnN0cmFpbnRzXG4gIH1cblxuICBpZiAoKGNvbnN0cmFpbnRzLm1hbmRhdG9yeSB8fCBjb25zdHJhaW50cy5vcHRpb25hbCkgJiYgIXNlbGYuX2lzQ2hyb21pdW0pIHtcbiAgICAvLyBjb252ZXJ0IHRvIG5ldyBmb3JtYXRcblxuICAgIC8vIE1lcmdlIG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgb2JqZWN0cywgcHJpb3JpdGl6aW5nIG1hbmRhdG9yeVxuICAgIHZhciBuZXdDb25zdHJhaW50cyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbnN0cmFpbnRzLm9wdGlvbmFsLCBjb25zdHJhaW50cy5tYW5kYXRvcnkpXG5cbiAgICAvLyBmaXggY2FzaW5nXG4gICAgaWYgKG5ld0NvbnN0cmFpbnRzLk9mZmVyVG9SZWNlaXZlVmlkZW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV3Q29uc3RyYWludHMub2ZmZXJUb1JlY2VpdmVWaWRlbyA9IG5ld0NvbnN0cmFpbnRzLk9mZmVyVG9SZWNlaXZlVmlkZW9cbiAgICAgIGRlbGV0ZSBuZXdDb25zdHJhaW50c1snT2ZmZXJUb1JlY2VpdmVWaWRlbyddXG4gICAgfVxuXG4gICAgaWYgKG5ld0NvbnN0cmFpbnRzLk9mZmVyVG9SZWNlaXZlQXVkaW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV3Q29uc3RyYWludHMub2ZmZXJUb1JlY2VpdmVBdWRpbyA9IG5ld0NvbnN0cmFpbnRzLk9mZmVyVG9SZWNlaXZlQXVkaW9cbiAgICAgIGRlbGV0ZSBuZXdDb25zdHJhaW50c1snT2ZmZXJUb1JlY2VpdmVBdWRpbyddXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0NvbnN0cmFpbnRzXG4gIH0gZWxzZSBpZiAoIWNvbnN0cmFpbnRzLm1hbmRhdG9yeSAmJiAhY29uc3RyYWludHMub3B0aW9uYWwgJiYgc2VsZi5faXNDaHJvbWl1bSkge1xuICAgIC8vIGNvbnZlcnQgdG8gb2xkIGZvcm1hdFxuXG4gICAgLy8gZml4IGNhc2luZ1xuICAgIGlmIChjb25zdHJhaW50cy5vZmZlclRvUmVjZWl2ZVZpZGVvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0cmFpbnRzLk9mZmVyVG9SZWNlaXZlVmlkZW8gPSBjb25zdHJhaW50cy5vZmZlclRvUmVjZWl2ZVZpZGVvXG4gICAgICBkZWxldGUgY29uc3RyYWludHNbJ29mZmVyVG9SZWNlaXZlVmlkZW8nXVxuICAgIH1cblxuICAgIGlmIChjb25zdHJhaW50cy5vZmZlclRvUmVjZWl2ZUF1ZGlvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0cmFpbnRzLk9mZmVyVG9SZWNlaXZlQXVkaW8gPSBjb25zdHJhaW50cy5vZmZlclRvUmVjZWl2ZUF1ZGlvXG4gICAgICBkZWxldGUgY29uc3RyYWludHNbJ29mZmVyVG9SZWNlaXZlQXVkaW8nXVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtYW5kYXRvcnk6IGNvbnN0cmFpbnRzIC8vIE5PVEU6IEFsbCBjb25zdHJhaW50cyBhcmUgdXBncmFkZWQgdG8gbWFuZGF0b3J5XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbnN0cmFpbnRzXG59XG5cbmZ1bmN0aW9uIG1ha2VFcnJvciAobWVzc2FnZSwgY29kZSkge1xuICB2YXIgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpXG4gIGVyci5jb2RlID0gY29kZVxuICByZXR1cm4gZXJyXG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cbiIsIi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZVxuICAgICAgICAgICAgICAgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZS5zdG9yYWdlXG4gICAgICAgICAgICAgICAgICA/IGNocm9tZS5zdG9yYWdlLmxvY2FsXG4gICAgICAgICAgICAgICAgICA6IGxvY2Fsc3RvcmFnZSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcbiAgJyMwMDAwQ0MnLCAnIzAwMDBGRicsICcjMDAzM0NDJywgJyMwMDMzRkYnLCAnIzAwNjZDQycsICcjMDA2NkZGJywgJyMwMDk5Q0MnLFxuICAnIzAwOTlGRicsICcjMDBDQzAwJywgJyMwMENDMzMnLCAnIzAwQ0M2NicsICcjMDBDQzk5JywgJyMwMENDQ0MnLCAnIzAwQ0NGRicsXG4gICcjMzMwMENDJywgJyMzMzAwRkYnLCAnIzMzMzNDQycsICcjMzMzM0ZGJywgJyMzMzY2Q0MnLCAnIzMzNjZGRicsICcjMzM5OUNDJyxcbiAgJyMzMzk5RkYnLCAnIzMzQ0MwMCcsICcjMzNDQzMzJywgJyMzM0NDNjYnLCAnIzMzQ0M5OScsICcjMzNDQ0NDJywgJyMzM0NDRkYnLFxuICAnIzY2MDBDQycsICcjNjYwMEZGJywgJyM2NjMzQ0MnLCAnIzY2MzNGRicsICcjNjZDQzAwJywgJyM2NkNDMzMnLCAnIzk5MDBDQycsXG4gICcjOTkwMEZGJywgJyM5OTMzQ0MnLCAnIzk5MzNGRicsICcjOTlDQzAwJywgJyM5OUNDMzMnLCAnI0NDMDAwMCcsICcjQ0MwMDMzJyxcbiAgJyNDQzAwNjYnLCAnI0NDMDA5OScsICcjQ0MwMENDJywgJyNDQzAwRkYnLCAnI0NDMzMwMCcsICcjQ0MzMzMzJywgJyNDQzMzNjYnLFxuICAnI0NDMzM5OScsICcjQ0MzM0NDJywgJyNDQzMzRkYnLCAnI0NDNjYwMCcsICcjQ0M2NjMzJywgJyNDQzk5MDAnLCAnI0NDOTkzMycsXG4gICcjQ0NDQzAwJywgJyNDQ0NDMzMnLCAnI0ZGMDAwMCcsICcjRkYwMDMzJywgJyNGRjAwNjYnLCAnI0ZGMDA5OScsICcjRkYwMENDJyxcbiAgJyNGRjAwRkYnLCAnI0ZGMzMwMCcsICcjRkYzMzMzJywgJyNGRjMzNjYnLCAnI0ZGMzM5OScsICcjRkYzM0NDJywgJyNGRjMzRkYnLFxuICAnI0ZGNjYwMCcsICcjRkY2NjMzJywgJyNGRjk5MDAnLCAnI0ZGOTkzMycsICcjRkZDQzAwJywgJyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgLy8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuICAvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuICAvLyBleHBsaWNpdGx5XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGlzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG4gIC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG4gIHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuICAgIC8vIGlzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuICAgIC8vIGlzIGZpcmVmb3ggPj0gdjMxP1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuICAgIC8vIGRvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uKHYpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnIubWVzc2FnZTtcbiAgfVxufTtcblxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuICB2YXIgdXNlQ29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cbiAgYXJnc1swXSA9ICh1c2VDb2xvcnMgPyAnJWMnIDogJycpXG4gICAgKyB0aGlzLm5hbWVzcGFjZVxuICAgICsgKHVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKVxuICAgICsgYXJnc1swXVxuICAgICsgKHVzZUNvbG9ycyA/ICclYyAnIDogJyAnKVxuICAgICsgJysnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG4gIGlmICghdXNlQ29sb3JzKSByZXR1cm47XG5cbiAgdmFyIGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuICBhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKVxuXG4gIC8vIHRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG4gIC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cbiAgLy8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0QyA9IDA7XG4gIGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIGlmICgnJSUnID09PSBtYXRjaCkgcmV0dXJuO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCclYycgPT09IG1hdGNoKSB7XG4gICAgICAvLyB3ZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcbiAgICAgIC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG4gICAgICBsYXN0QyA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgYXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUubG9nKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5sb2dgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgLy8gdGhpcyBoYWNrZXJ5IGlzIHJlcXVpcmVkIGZvciBJRTgvOSwgd2hlcmVcbiAgLy8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24gZG9lc24ndCBoYXZlICdhcHBseSdcbiAgcmV0dXJuICdvYmplY3QnID09PSB0eXBlb2YgY29uc29sZVxuICAgICYmIGNvbnNvbGUubG9nXG4gICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICB0cnkge1xuICAgIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UuZGVidWcgPSBuYW1lc3BhY2VzO1xuICAgIH1cbiAgfSBjYXRjaChlKSB7fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIHIgPSBleHBvcnRzLnN0b3JhZ2UuZGVidWc7XG4gIH0gY2F0Y2goZSkge31cblxuICAvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG4gIGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuICAgIHIgPSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfVxuXG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgbG9jYWxTdG9yYWdlLmRlYnVnYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG4iLCJcbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdXJsID0gcmVxdWlyZSgnLi91cmwnKTtcbnZhciBwYXJzZXIgPSByZXF1aXJlKCdzb2NrZXQuaW8tcGFyc2VyJyk7XG52YXIgTWFuYWdlciA9IHJlcXVpcmUoJy4vbWFuYWdlcicpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnc29ja2V0LmlvLWNsaWVudCcpO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGxvb2t1cDtcblxuLyoqXG4gKiBNYW5hZ2VycyBjYWNoZS5cbiAqL1xuXG52YXIgY2FjaGUgPSBleHBvcnRzLm1hbmFnZXJzID0ge307XG5cbi8qKlxuICogTG9va3MgdXAgYW4gZXhpc3RpbmcgYE1hbmFnZXJgIGZvciBtdWx0aXBsZXhpbmcuXG4gKiBJZiB0aGUgdXNlciBzdW1tb25zOlxuICpcbiAqICAgYGlvKCdodHRwOi8vbG9jYWxob3N0L2EnKTtgXG4gKiAgIGBpbygnaHR0cDovL2xvY2FsaG9zdC9iJyk7YFxuICpcbiAqIFdlIHJldXNlIHRoZSBleGlzdGluZyBpbnN0YW5jZSBiYXNlZCBvbiBzYW1lIHNjaGVtZS9wb3J0L2hvc3QsXG4gKiBhbmQgd2UgaW5pdGlhbGl6ZSBzb2NrZXRzIGZvciBlYWNoIG5hbWVzcGFjZS5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvb2t1cCAodXJpLCBvcHRzKSB7XG4gIGlmICh0eXBlb2YgdXJpID09PSAnb2JqZWN0Jykge1xuICAgIG9wdHMgPSB1cmk7XG4gICAgdXJpID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgdmFyIHBhcnNlZCA9IHVybCh1cmkpO1xuICB2YXIgc291cmNlID0gcGFyc2VkLnNvdXJjZTtcbiAgdmFyIGlkID0gcGFyc2VkLmlkO1xuICB2YXIgcGF0aCA9IHBhcnNlZC5wYXRoO1xuICB2YXIgc2FtZU5hbWVzcGFjZSA9IGNhY2hlW2lkXSAmJiBwYXRoIGluIGNhY2hlW2lkXS5uc3BzO1xuICB2YXIgbmV3Q29ubmVjdGlvbiA9IG9wdHMuZm9yY2VOZXcgfHwgb3B0c1snZm9yY2UgbmV3IGNvbm5lY3Rpb24nXSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGZhbHNlID09PSBvcHRzLm11bHRpcGxleCB8fCBzYW1lTmFtZXNwYWNlO1xuXG4gIHZhciBpbztcblxuICBpZiAobmV3Q29ubmVjdGlvbikge1xuICAgIGRlYnVnKCdpZ25vcmluZyBzb2NrZXQgY2FjaGUgZm9yICVzJywgc291cmNlKTtcbiAgICBpbyA9IE1hbmFnZXIoc291cmNlLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWNhY2hlW2lkXSkge1xuICAgICAgZGVidWcoJ25ldyBpbyBpbnN0YW5jZSBmb3IgJXMnLCBzb3VyY2UpO1xuICAgICAgY2FjaGVbaWRdID0gTWFuYWdlcihzb3VyY2UsIG9wdHMpO1xuICAgIH1cbiAgICBpbyA9IGNhY2hlW2lkXTtcbiAgfVxuICBpZiAocGFyc2VkLnF1ZXJ5ICYmICFvcHRzLnF1ZXJ5KSB7XG4gICAgb3B0cy5xdWVyeSA9IHBhcnNlZC5xdWVyeTtcbiAgfVxuICByZXR1cm4gaW8uc29ja2V0KHBhcnNlZC5wYXRoLCBvcHRzKTtcbn1cblxuLyoqXG4gKiBQcm90b2NvbCB2ZXJzaW9uLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5wcm90b2NvbCA9IHBhcnNlci5wcm90b2NvbDtcblxuLyoqXG4gKiBgY29ubmVjdGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmNvbm5lY3QgPSBsb29rdXA7XG5cbi8qKlxuICogRXhwb3NlIGNvbnN0cnVjdG9ycyBmb3Igc3RhbmRhbG9uZSBidWlsZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuTWFuYWdlciA9IHJlcXVpcmUoJy4vbWFuYWdlcicpO1xuZXhwb3J0cy5Tb2NrZXQgPSByZXF1aXJlKCcuL3NvY2tldCcpO1xuIiwiXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGVpbyA9IHJlcXVpcmUoJ2VuZ2luZS5pby1jbGllbnQnKTtcbnZhciBTb2NrZXQgPSByZXF1aXJlKCcuL3NvY2tldCcpO1xudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCdjb21wb25lbnQtZW1pdHRlcicpO1xudmFyIHBhcnNlciA9IHJlcXVpcmUoJ3NvY2tldC5pby1wYXJzZXInKTtcbnZhciBvbiA9IHJlcXVpcmUoJy4vb24nKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnY29tcG9uZW50LWJpbmQnKTtcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ3NvY2tldC5pby1jbGllbnQ6bWFuYWdlcicpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCdpbmRleG9mJyk7XG52YXIgQmFja29mZiA9IHJlcXVpcmUoJ2JhY2tvMicpO1xuXG4vKipcbiAqIElFNisgaGFzT3duUHJvcGVydHlcbiAqL1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0c1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gTWFuYWdlcjtcblxuLyoqXG4gKiBgTWFuYWdlcmAgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGVuZ2luZSBpbnN0YW5jZSBvciBlbmdpbmUgdXJpL29wdHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIE1hbmFnZXIgKHVyaSwgb3B0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTWFuYWdlcikpIHJldHVybiBuZXcgTWFuYWdlcih1cmksIG9wdHMpO1xuICBpZiAodXJpICYmICgnb2JqZWN0JyA9PT0gdHlwZW9mIHVyaSkpIHtcbiAgICBvcHRzID0gdXJpO1xuICAgIHVyaSA9IHVuZGVmaW5lZDtcbiAgfVxuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICBvcHRzLnBhdGggPSBvcHRzLnBhdGggfHwgJy9zb2NrZXQuaW8nO1xuICB0aGlzLm5zcHMgPSB7fTtcbiAgdGhpcy5zdWJzID0gW107XG4gIHRoaXMub3B0cyA9IG9wdHM7XG4gIHRoaXMucmVjb25uZWN0aW9uKG9wdHMucmVjb25uZWN0aW9uICE9PSBmYWxzZSk7XG4gIHRoaXMucmVjb25uZWN0aW9uQXR0ZW1wdHMob3B0cy5yZWNvbm5lY3Rpb25BdHRlbXB0cyB8fCBJbmZpbml0eSk7XG4gIHRoaXMucmVjb25uZWN0aW9uRGVsYXkob3B0cy5yZWNvbm5lY3Rpb25EZWxheSB8fCAxMDAwKTtcbiAgdGhpcy5yZWNvbm5lY3Rpb25EZWxheU1heChvcHRzLnJlY29ubmVjdGlvbkRlbGF5TWF4IHx8IDUwMDApO1xuICB0aGlzLnJhbmRvbWl6YXRpb25GYWN0b3Iob3B0cy5yYW5kb21pemF0aW9uRmFjdG9yIHx8IDAuNSk7XG4gIHRoaXMuYmFja29mZiA9IG5ldyBCYWNrb2ZmKHtcbiAgICBtaW46IHRoaXMucmVjb25uZWN0aW9uRGVsYXkoKSxcbiAgICBtYXg6IHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgoKSxcbiAgICBqaXR0ZXI6IHRoaXMucmFuZG9taXphdGlvbkZhY3RvcigpXG4gIH0pO1xuICB0aGlzLnRpbWVvdXQobnVsbCA9PSBvcHRzLnRpbWVvdXQgPyAyMDAwMCA6IG9wdHMudGltZW91dCk7XG4gIHRoaXMucmVhZHlTdGF0ZSA9ICdjbG9zZWQnO1xuICB0aGlzLnVyaSA9IHVyaTtcbiAgdGhpcy5jb25uZWN0aW5nID0gW107XG4gIHRoaXMubGFzdFBpbmcgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gZmFsc2U7XG4gIHRoaXMucGFja2V0QnVmZmVyID0gW107XG4gIHZhciBfcGFyc2VyID0gb3B0cy5wYXJzZXIgfHwgcGFyc2VyO1xuICB0aGlzLmVuY29kZXIgPSBuZXcgX3BhcnNlci5FbmNvZGVyKCk7XG4gIHRoaXMuZGVjb2RlciA9IG5ldyBfcGFyc2VyLkRlY29kZXIoKTtcbiAgdGhpcy5hdXRvQ29ubmVjdCA9IG9wdHMuYXV0b0Nvbm5lY3QgIT09IGZhbHNlO1xuICBpZiAodGhpcy5hdXRvQ29ubmVjdCkgdGhpcy5vcGVuKCk7XG59XG5cbi8qKlxuICogUHJvcGFnYXRlIGdpdmVuIGV2ZW50IHRvIHNvY2tldHMgYW5kIGVtaXQgb24gYHRoaXNgXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUuZW1pdEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIGZvciAodmFyIG5zcCBpbiB0aGlzLm5zcHMpIHtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5uc3BzLCBuc3ApKSB7XG4gICAgICB0aGlzLm5zcHNbbnNwXS5lbWl0LmFwcGx5KHRoaXMubnNwc1tuc3BdLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBVcGRhdGUgYHNvY2tldC5pZGAgb2YgYWxsIHNvY2tldHNcbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS51cGRhdGVTb2NrZXRJZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIG5zcCBpbiB0aGlzLm5zcHMpIHtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5uc3BzLCBuc3ApKSB7XG4gICAgICB0aGlzLm5zcHNbbnNwXS5pZCA9IHRoaXMuZ2VuZXJhdGVJZChuc3ApO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBnZW5lcmF0ZSBgc29ja2V0LmlkYCBmb3IgdGhlIGdpdmVuIGBuc3BgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5zcFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUuZ2VuZXJhdGVJZCA9IGZ1bmN0aW9uIChuc3ApIHtcbiAgcmV0dXJuIChuc3AgPT09ICcvJyA/ICcnIDogKG5zcCArICcjJykpICsgdGhpcy5lbmdpbmUuaWQ7XG59O1xuXG4vKipcbiAqIE1peCBpbiBgRW1pdHRlcmAuXG4gKi9cblxuRW1pdHRlcihNYW5hZ2VyLnByb3RvdHlwZSk7XG5cbi8qKlxuICogU2V0cyB0aGUgYHJlY29ubmVjdGlvbmAgY29uZmlnLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdHJ1ZS9mYWxzZSBpZiBpdCBzaG91bGQgYXV0b21hdGljYWxseSByZWNvbm5lY3RcbiAqIEByZXR1cm4ge01hbmFnZXJ9IHNlbGYgb3IgdmFsdWVcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUucmVjb25uZWN0aW9uID0gZnVuY3Rpb24gKHYpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uO1xuICB0aGlzLl9yZWNvbm5lY3Rpb24gPSAhIXY7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgY29uZmlnLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXggcmVjb25uZWN0aW9uIGF0dGVtcHRzIGJlZm9yZSBnaXZpbmcgdXBcbiAqIEByZXR1cm4ge01hbmFnZXJ9IHNlbGYgb3IgdmFsdWVcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUucmVjb25uZWN0aW9uQXR0ZW1wdHMgPSBmdW5jdGlvbiAodikge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cztcbiAgdGhpcy5fcmVjb25uZWN0aW9uQXR0ZW1wdHMgPSB2O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgZGVsYXkgYmV0d2VlbiByZWNvbm5lY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBkZWxheVxuICogQHJldHVybiB7TWFuYWdlcn0gc2VsZiBvciB2YWx1ZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5yZWNvbm5lY3Rpb25EZWxheSA9IGZ1bmN0aW9uICh2KSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkRlbGF5O1xuICB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheSA9IHY7XG4gIHRoaXMuYmFja29mZiAmJiB0aGlzLmJhY2tvZmYuc2V0TWluKHYpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbk1hbmFnZXIucHJvdG90eXBlLnJhbmRvbWl6YXRpb25GYWN0b3IgPSBmdW5jdGlvbiAodikge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzLl9yYW5kb21pemF0aW9uRmFjdG9yO1xuICB0aGlzLl9yYW5kb21pemF0aW9uRmFjdG9yID0gdjtcbiAgdGhpcy5iYWNrb2ZmICYmIHRoaXMuYmFja29mZi5zZXRKaXR0ZXIodik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBtYXhpbXVtIGRlbGF5IGJldHdlZW4gcmVjb25uZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gZGVsYXlcbiAqIEByZXR1cm4ge01hbmFnZXJ9IHNlbGYgb3IgdmFsdWVcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUucmVjb25uZWN0aW9uRGVsYXlNYXggPSBmdW5jdGlvbiAodikge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heDtcbiAgdGhpcy5fcmVjb25uZWN0aW9uRGVsYXlNYXggPSB2O1xuICB0aGlzLmJhY2tvZmYgJiYgdGhpcy5iYWNrb2ZmLnNldE1heCh2KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGNvbm5lY3Rpb24gdGltZW91dC4gYGZhbHNlYCB0byBkaXNhYmxlXG4gKlxuICogQHJldHVybiB7TWFuYWdlcn0gc2VsZiBvciB2YWx1ZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS50aW1lb3V0ID0gZnVuY3Rpb24gKHYpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpcy5fdGltZW91dDtcbiAgdGhpcy5fdGltZW91dCA9IHY7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTdGFydHMgdHJ5aW5nIHRvIHJlY29ubmVjdCBpZiByZWNvbm5lY3Rpb24gaXMgZW5hYmxlZCBhbmQgd2UgaGF2ZSBub3RcbiAqIHN0YXJ0ZWQgcmVjb25uZWN0aW5nIHlldFxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLm1heWJlUmVjb25uZWN0T25PcGVuID0gZnVuY3Rpb24gKCkge1xuICAvLyBPbmx5IHRyeSB0byByZWNvbm5lY3QgaWYgaXQncyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBjb25uZWN0aW5nXG4gIGlmICghdGhpcy5yZWNvbm5lY3RpbmcgJiYgdGhpcy5fcmVjb25uZWN0aW9uICYmIHRoaXMuYmFja29mZi5hdHRlbXB0cyA9PT0gMCkge1xuICAgIC8vIGtlZXBzIHJlY29ubmVjdGlvbiBmcm9tIGZpcmluZyB0d2ljZSBmb3IgdGhlIHNhbWUgcmVjb25uZWN0aW9uIGxvb3BcbiAgICB0aGlzLnJlY29ubmVjdCgpO1xuICB9XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGN1cnJlbnQgdHJhbnNwb3J0IGBzb2NrZXRgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbmFsLCBjYWxsYmFja1xuICogQHJldHVybiB7TWFuYWdlcn0gc2VsZlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5vcGVuID1cbk1hbmFnZXIucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoZm4sIG9wdHMpIHtcbiAgZGVidWcoJ3JlYWR5U3RhdGUgJXMnLCB0aGlzLnJlYWR5U3RhdGUpO1xuICBpZiAofnRoaXMucmVhZHlTdGF0ZS5pbmRleE9mKCdvcGVuJykpIHJldHVybiB0aGlzO1xuXG4gIGRlYnVnKCdvcGVuaW5nICVzJywgdGhpcy51cmkpO1xuICB0aGlzLmVuZ2luZSA9IGVpbyh0aGlzLnVyaSwgdGhpcy5vcHRzKTtcbiAgdmFyIHNvY2tldCA9IHRoaXMuZW5naW5lO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucmVhZHlTdGF0ZSA9ICdvcGVuaW5nJztcbiAgdGhpcy5za2lwUmVjb25uZWN0ID0gZmFsc2U7XG5cbiAgLy8gZW1pdCBgb3BlbmBcbiAgdmFyIG9wZW5TdWIgPSBvbihzb2NrZXQsICdvcGVuJywgZnVuY3Rpb24gKCkge1xuICAgIHNlbGYub25vcGVuKCk7XG4gICAgZm4gJiYgZm4oKTtcbiAgfSk7XG5cbiAgLy8gZW1pdCBgY29ubmVjdF9lcnJvcmBcbiAgdmFyIGVycm9yU3ViID0gb24oc29ja2V0LCAnZXJyb3InLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGRlYnVnKCdjb25uZWN0X2Vycm9yJyk7XG4gICAgc2VsZi5jbGVhbnVwKCk7XG4gICAgc2VsZi5yZWFkeVN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgc2VsZi5lbWl0QWxsKCdjb25uZWN0X2Vycm9yJywgZGF0YSk7XG4gICAgaWYgKGZuKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdDb25uZWN0aW9uIGVycm9yJyk7XG4gICAgICBlcnIuZGF0YSA9IGRhdGE7XG4gICAgICBmbihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgdGhlcmUgaXMgbm8gZm4gdG8gaGFuZGxlIHRoZSBlcnJvclxuICAgICAgc2VsZi5tYXliZVJlY29ubmVjdE9uT3BlbigpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gZW1pdCBgY29ubmVjdF90aW1lb3V0YFxuICBpZiAoZmFsc2UgIT09IHRoaXMuX3RpbWVvdXQpIHtcbiAgICB2YXIgdGltZW91dCA9IHRoaXMuX3RpbWVvdXQ7XG4gICAgZGVidWcoJ2Nvbm5lY3QgYXR0ZW1wdCB3aWxsIHRpbWVvdXQgYWZ0ZXIgJWQnLCB0aW1lb3V0KTtcblxuICAgIC8vIHNldCB0aW1lclxuICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZGVidWcoJ2Nvbm5lY3QgYXR0ZW1wdCB0aW1lZCBvdXQgYWZ0ZXIgJWQnLCB0aW1lb3V0KTtcbiAgICAgIG9wZW5TdWIuZGVzdHJveSgpO1xuICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICBzb2NrZXQuZW1pdCgnZXJyb3InLCAndGltZW91dCcpO1xuICAgICAgc2VsZi5lbWl0QWxsKCdjb25uZWN0X3RpbWVvdXQnLCB0aW1lb3V0KTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIHRoaXMuc3Vicy5wdXNoKHtcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHRoaXMuc3Vicy5wdXNoKG9wZW5TdWIpO1xuICB0aGlzLnN1YnMucHVzaChlcnJvclN1Yik7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIHRyYW5zcG9ydCBvcGVuLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLm9ub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ29wZW4nKTtcblxuICAvLyBjbGVhciBvbGQgc3Vic1xuICB0aGlzLmNsZWFudXAoKTtcblxuICAvLyBtYXJrIGFzIG9wZW5cbiAgdGhpcy5yZWFkeVN0YXRlID0gJ29wZW4nO1xuICB0aGlzLmVtaXQoJ29wZW4nKTtcblxuICAvLyBhZGQgbmV3IHN1YnNcbiAgdmFyIHNvY2tldCA9IHRoaXMuZW5naW5lO1xuICB0aGlzLnN1YnMucHVzaChvbihzb2NrZXQsICdkYXRhJywgYmluZCh0aGlzLCAnb25kYXRhJykpKTtcbiAgdGhpcy5zdWJzLnB1c2gob24oc29ja2V0LCAncGluZycsIGJpbmQodGhpcywgJ29ucGluZycpKSk7XG4gIHRoaXMuc3Vicy5wdXNoKG9uKHNvY2tldCwgJ3BvbmcnLCBiaW5kKHRoaXMsICdvbnBvbmcnKSkpO1xuICB0aGlzLnN1YnMucHVzaChvbihzb2NrZXQsICdlcnJvcicsIGJpbmQodGhpcywgJ29uZXJyb3InKSkpO1xuICB0aGlzLnN1YnMucHVzaChvbihzb2NrZXQsICdjbG9zZScsIGJpbmQodGhpcywgJ29uY2xvc2UnKSkpO1xuICB0aGlzLnN1YnMucHVzaChvbih0aGlzLmRlY29kZXIsICdkZWNvZGVkJywgYmluZCh0aGlzLCAnb25kZWNvZGVkJykpKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gYSBwaW5nLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLm9ucGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5sYXN0UGluZyA9IG5ldyBEYXRlKCk7XG4gIHRoaXMuZW1pdEFsbCgncGluZycpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBhIHBhY2tldC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5vbnBvbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdEFsbCgncG9uZycsIG5ldyBEYXRlKCkgLSB0aGlzLmxhc3RQaW5nKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdpdGggZGF0YS5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5vbmRhdGEgPSBmdW5jdGlvbiAoZGF0YSkge1xuICB0aGlzLmRlY29kZXIuYWRkKGRhdGEpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgd2hlbiBwYXJzZXIgZnVsbHkgZGVjb2RlcyBhIHBhY2tldC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5vbmRlY29kZWQgPSBmdW5jdGlvbiAocGFja2V0KSB7XG4gIHRoaXMuZW1pdCgncGFja2V0JywgcGFja2V0KTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gc29ja2V0IGVycm9yLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gIGRlYnVnKCdlcnJvcicsIGVycik7XG4gIHRoaXMuZW1pdEFsbCgnZXJyb3InLCBlcnIpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBmb3IgdGhlIGdpdmVuIGBuc3BgLlxuICpcbiAqIEByZXR1cm4ge1NvY2tldH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUuc29ja2V0ID0gZnVuY3Rpb24gKG5zcCwgb3B0cykge1xuICB2YXIgc29ja2V0ID0gdGhpcy5uc3BzW25zcF07XG4gIGlmICghc29ja2V0KSB7XG4gICAgc29ja2V0ID0gbmV3IFNvY2tldCh0aGlzLCBuc3AsIG9wdHMpO1xuICAgIHRoaXMubnNwc1tuc3BdID0gc29ja2V0O1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBzb2NrZXQub24oJ2Nvbm5lY3RpbmcnLCBvbkNvbm5lY3RpbmcpO1xuICAgIHNvY2tldC5vbignY29ubmVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNvY2tldC5pZCA9IHNlbGYuZ2VuZXJhdGVJZChuc3ApO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYXV0b0Nvbm5lY3QpIHtcbiAgICAgIC8vIG1hbnVhbGx5IGNhbGwgaGVyZSBzaW5jZSBjb25uZWN0aW5nIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBsaXN0ZW5pbmdcbiAgICAgIG9uQ29ubmVjdGluZygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ29ubmVjdGluZyAoKSB7XG4gICAgaWYgKCF+aW5kZXhPZihzZWxmLmNvbm5lY3RpbmcsIHNvY2tldCkpIHtcbiAgICAgIHNlbGYuY29ubmVjdGluZy5wdXNoKHNvY2tldCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNvY2tldDtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gYSBzb2NrZXQgY2xvc2UuXG4gKlxuICogQHBhcmFtIHtTb2NrZXR9IHNvY2tldFxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoc29ja2V0KSB7XG4gIHZhciBpbmRleCA9IGluZGV4T2YodGhpcy5jb25uZWN0aW5nLCBzb2NrZXQpO1xuICBpZiAofmluZGV4KSB0aGlzLmNvbm5lY3Rpbmcuc3BsaWNlKGluZGV4LCAxKTtcbiAgaWYgKHRoaXMuY29ubmVjdGluZy5sZW5ndGgpIHJldHVybjtcblxuICB0aGlzLmNsb3NlKCk7XG59O1xuXG4vKipcbiAqIFdyaXRlcyBhIHBhY2tldC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5wYWNrZXQgPSBmdW5jdGlvbiAocGFja2V0KSB7XG4gIGRlYnVnKCd3cml0aW5nIHBhY2tldCAlaicsIHBhY2tldCk7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHBhY2tldC5xdWVyeSAmJiBwYWNrZXQudHlwZSA9PT0gMCkgcGFja2V0Lm5zcCArPSAnPycgKyBwYWNrZXQucXVlcnk7XG5cbiAgaWYgKCFzZWxmLmVuY29kaW5nKSB7XG4gICAgLy8gZW5jb2RlLCB0aGVuIHdyaXRlIHRvIGVuZ2luZSB3aXRoIHJlc3VsdFxuICAgIHNlbGYuZW5jb2RpbmcgPSB0cnVlO1xuICAgIHRoaXMuZW5jb2Rlci5lbmNvZGUocGFja2V0LCBmdW5jdGlvbiAoZW5jb2RlZFBhY2tldHMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5jb2RlZFBhY2tldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2VsZi5lbmdpbmUud3JpdGUoZW5jb2RlZFBhY2tldHNbaV0sIHBhY2tldC5vcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW5jb2RpbmcgPSBmYWxzZTtcbiAgICAgIHNlbGYucHJvY2Vzc1BhY2tldFF1ZXVlKCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7IC8vIGFkZCBwYWNrZXQgdG8gdGhlIHF1ZXVlXG4gICAgc2VsZi5wYWNrZXRCdWZmZXIucHVzaChwYWNrZXQpO1xuICB9XG59O1xuXG4vKipcbiAqIElmIHBhY2tldCBidWZmZXIgaXMgbm9uLWVtcHR5LCBiZWdpbnMgZW5jb2RpbmcgdGhlXG4gKiBuZXh0IHBhY2tldCBpbiBsaW5lLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLnByb2Nlc3NQYWNrZXRRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucGFja2V0QnVmZmVyLmxlbmd0aCA+IDAgJiYgIXRoaXMuZW5jb2RpbmcpIHtcbiAgICB2YXIgcGFjayA9IHRoaXMucGFja2V0QnVmZmVyLnNoaWZ0KCk7XG4gICAgdGhpcy5wYWNrZXQocGFjayk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2xlYW4gdXAgdHJhbnNwb3J0IHN1YnNjcmlwdGlvbnMgYW5kIHBhY2tldCBidWZmZXIuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUuY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NsZWFudXAnKTtcblxuICB2YXIgc3Vic0xlbmd0aCA9IHRoaXMuc3Vicy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic0xlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN1YiA9IHRoaXMuc3Vicy5zaGlmdCgpO1xuICAgIHN1Yi5kZXN0cm95KCk7XG4gIH1cblxuICB0aGlzLnBhY2tldEJ1ZmZlciA9IFtdO1xuICB0aGlzLmVuY29kaW5nID0gZmFsc2U7XG4gIHRoaXMubGFzdFBpbmcgPSBudWxsO1xuXG4gIHRoaXMuZGVjb2Rlci5kZXN0cm95KCk7XG59O1xuXG4vKipcbiAqIENsb3NlIHRoZSBjdXJyZW50IHNvY2tldC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5jbG9zZSA9XG5NYW5hZ2VyLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnZGlzY29ubmVjdCcpO1xuICB0aGlzLnNraXBSZWNvbm5lY3QgPSB0cnVlO1xuICB0aGlzLnJlY29ubmVjdGluZyA9IGZhbHNlO1xuICBpZiAoJ29wZW5pbmcnID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAvLyBgb25jbG9zZWAgd2lsbCBub3QgZmlyZSBiZWNhdXNlXG4gICAgLy8gYW4gb3BlbiBldmVudCBuZXZlciBoYXBwZW5lZFxuICAgIHRoaXMuY2xlYW51cCgpO1xuICB9XG4gIHRoaXMuYmFja29mZi5yZXNldCgpO1xuICB0aGlzLnJlYWR5U3RhdGUgPSAnY2xvc2VkJztcbiAgaWYgKHRoaXMuZW5naW5lKSB0aGlzLmVuZ2luZS5jbG9zZSgpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBlbmdpbmUgY2xvc2UuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUub25jbG9zZSA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgZGVidWcoJ29uY2xvc2UnKTtcblxuICB0aGlzLmNsZWFudXAoKTtcbiAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gIHRoaXMucmVhZHlTdGF0ZSA9ICdjbG9zZWQnO1xuICB0aGlzLmVtaXQoJ2Nsb3NlJywgcmVhc29uKTtcblxuICBpZiAodGhpcy5fcmVjb25uZWN0aW9uICYmICF0aGlzLnNraXBSZWNvbm5lY3QpIHtcbiAgICB0aGlzLnJlY29ubmVjdCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEF0dGVtcHQgYSByZWNvbm5lY3Rpb24uXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUucmVjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZWNvbm5lY3RpbmcgfHwgdGhpcy5za2lwUmVjb25uZWN0KSByZXR1cm4gdGhpcztcblxuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKHRoaXMuYmFja29mZi5hdHRlbXB0cyA+PSB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cykge1xuICAgIGRlYnVnKCdyZWNvbm5lY3QgZmFpbGVkJyk7XG4gICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgdGhpcy5lbWl0QWxsKCdyZWNvbm5lY3RfZmFpbGVkJyk7XG4gICAgdGhpcy5yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZGVsYXkgPSB0aGlzLmJhY2tvZmYuZHVyYXRpb24oKTtcbiAgICBkZWJ1Zygnd2lsbCB3YWl0ICVkbXMgYmVmb3JlIHJlY29ubmVjdCBhdHRlbXB0JywgZGVsYXkpO1xuXG4gICAgdGhpcy5yZWNvbm5lY3RpbmcgPSB0cnVlO1xuICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYuc2tpcFJlY29ubmVjdCkgcmV0dXJuO1xuXG4gICAgICBkZWJ1ZygnYXR0ZW1wdGluZyByZWNvbm5lY3QnKTtcbiAgICAgIHNlbGYuZW1pdEFsbCgncmVjb25uZWN0X2F0dGVtcHQnLCBzZWxmLmJhY2tvZmYuYXR0ZW1wdHMpO1xuICAgICAgc2VsZi5lbWl0QWxsKCdyZWNvbm5lY3RpbmcnLCBzZWxmLmJhY2tvZmYuYXR0ZW1wdHMpO1xuXG4gICAgICAvLyBjaGVjayBhZ2FpbiBmb3IgdGhlIGNhc2Ugc29ja2V0IGNsb3NlZCBpbiBhYm92ZSBldmVudHNcbiAgICAgIGlmIChzZWxmLnNraXBSZWNvbm5lY3QpIHJldHVybjtcblxuICAgICAgc2VsZi5vcGVuKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGRlYnVnKCdyZWNvbm5lY3QgYXR0ZW1wdCBlcnJvcicpO1xuICAgICAgICAgIHNlbGYucmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgc2VsZi5yZWNvbm5lY3QoKTtcbiAgICAgICAgICBzZWxmLmVtaXRBbGwoJ3JlY29ubmVjdF9lcnJvcicsIGVyci5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWJ1ZygncmVjb25uZWN0IHN1Y2Nlc3MnKTtcbiAgICAgICAgICBzZWxmLm9ucmVjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcblxuICAgIHRoaXMuc3Vicy5wdXNoKHtcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBzdWNjZXNzZnVsIHJlY29ubmVjdC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5vbnJlY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGF0dGVtcHQgPSB0aGlzLmJhY2tvZmYuYXR0ZW1wdHM7XG4gIHRoaXMucmVjb25uZWN0aW5nID0gZmFsc2U7XG4gIHRoaXMuYmFja29mZi5yZXNldCgpO1xuICB0aGlzLnVwZGF0ZVNvY2tldElkcygpO1xuICB0aGlzLmVtaXRBbGwoJ3JlY29ubmVjdCcsIGF0dGVtcHQpO1xufTtcbiIsIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9uO1xuXG4vKipcbiAqIEhlbHBlciBmb3Igc3Vic2NyaXB0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxFdmVudEVtaXR0ZXJ9IG9iaiB3aXRoIGBFbWl0dGVyYCBtaXhpbiBvciBgRXZlbnRFbWl0dGVyYFxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIG9uIChvYmosIGV2LCBmbikge1xuICBvYmoub24oZXYsIGZuKTtcbiAgcmV0dXJuIHtcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgICBvYmoucmVtb3ZlTGlzdGVuZXIoZXYsIGZuKTtcbiAgICB9XG4gIH07XG59XG4iLCJcbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgcGFyc2VyID0gcmVxdWlyZSgnc29ja2V0LmlvLXBhcnNlcicpO1xudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCdjb21wb25lbnQtZW1pdHRlcicpO1xudmFyIHRvQXJyYXkgPSByZXF1aXJlKCd0by1hcnJheScpO1xudmFyIG9uID0gcmVxdWlyZSgnLi9vbicpO1xudmFyIGJpbmQgPSByZXF1aXJlKCdjb21wb25lbnQtYmluZCcpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnc29ja2V0LmlvLWNsaWVudDpzb2NrZXQnKTtcbnZhciBwYXJzZXFzID0gcmVxdWlyZSgncGFyc2VxcycpO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IFNvY2tldDtcblxuLyoqXG4gKiBJbnRlcm5hbCBldmVudHMgKGJsYWNrbGlzdGVkKS5cbiAqIFRoZXNlIGV2ZW50cyBjYW4ndCBiZSBlbWl0dGVkIGJ5IHRoZSB1c2VyLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnZhciBldmVudHMgPSB7XG4gIGNvbm5lY3Q6IDEsXG4gIGNvbm5lY3RfZXJyb3I6IDEsXG4gIGNvbm5lY3RfdGltZW91dDogMSxcbiAgY29ubmVjdGluZzogMSxcbiAgZGlzY29ubmVjdDogMSxcbiAgZXJyb3I6IDEsXG4gIHJlY29ubmVjdDogMSxcbiAgcmVjb25uZWN0X2F0dGVtcHQ6IDEsXG4gIHJlY29ubmVjdF9mYWlsZWQ6IDEsXG4gIHJlY29ubmVjdF9lcnJvcjogMSxcbiAgcmVjb25uZWN0aW5nOiAxLFxuICBwaW5nOiAxLFxuICBwb25nOiAxXG59O1xuXG4vKipcbiAqIFNob3J0Y3V0IHRvIGBFbWl0dGVyI2VtaXRgLlxuICovXG5cbnZhciBlbWl0ID0gRW1pdHRlci5wcm90b3R5cGUuZW1pdDtcblxuLyoqXG4gKiBgU29ja2V0YCBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFNvY2tldCAoaW8sIG5zcCwgb3B0cykge1xuICB0aGlzLmlvID0gaW87XG4gIHRoaXMubnNwID0gbnNwO1xuICB0aGlzLmpzb24gPSB0aGlzOyAvLyBjb21wYXRcbiAgdGhpcy5pZHMgPSAwO1xuICB0aGlzLmFja3MgPSB7fTtcbiAgdGhpcy5yZWNlaXZlQnVmZmVyID0gW107XG4gIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG4gIGlmIChvcHRzICYmIG9wdHMucXVlcnkpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gb3B0cy5xdWVyeTtcbiAgfVxuICBpZiAodGhpcy5pby5hdXRvQ29ubmVjdCkgdGhpcy5vcGVuKCk7XG59XG5cbi8qKlxuICogTWl4IGluIGBFbWl0dGVyYC5cbiAqL1xuXG5FbWl0dGVyKFNvY2tldC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIFN1YnNjcmliZSB0byBvcGVuLCBjbG9zZSBhbmQgcGFja2V0IGV2ZW50c1xuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUuc3ViRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5zdWJzKSByZXR1cm47XG5cbiAgdmFyIGlvID0gdGhpcy5pbztcbiAgdGhpcy5zdWJzID0gW1xuICAgIG9uKGlvLCAnb3BlbicsIGJpbmQodGhpcywgJ29ub3BlbicpKSxcbiAgICBvbihpbywgJ3BhY2tldCcsIGJpbmQodGhpcywgJ29ucGFja2V0JykpLFxuICAgIG9uKGlvLCAnY2xvc2UnLCBiaW5kKHRoaXMsICdvbmNsb3NlJykpXG4gIF07XG59O1xuXG4vKipcbiAqIFwiT3BlbnNcIiB0aGUgc29ja2V0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5vcGVuID1cblNvY2tldC5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY29ubmVjdGVkKSByZXR1cm4gdGhpcztcblxuICB0aGlzLnN1YkV2ZW50cygpO1xuICB0aGlzLmlvLm9wZW4oKTsgLy8gZW5zdXJlIG9wZW5cbiAgaWYgKCdvcGVuJyA9PT0gdGhpcy5pby5yZWFkeVN0YXRlKSB0aGlzLm9ub3BlbigpO1xuICB0aGlzLmVtaXQoJ2Nvbm5lY3RpbmcnKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNlbmRzIGEgYG1lc3NhZ2VgIGV2ZW50LlxuICpcbiAqIEByZXR1cm4ge1NvY2tldH0gc2VsZlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMpO1xuICBhcmdzLnVuc2hpZnQoJ21lc3NhZ2UnKTtcbiAgdGhpcy5lbWl0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogT3ZlcnJpZGUgYGVtaXRgLlxuICogSWYgdGhlIGV2ZW50IGlzIGluIGBldmVudHNgLCBpdCdzIGVtaXR0ZWQgbm9ybWFsbHkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50IG5hbWVcbiAqIEByZXR1cm4ge1NvY2tldH0gc2VsZlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgaWYgKGV2ZW50cy5oYXNPd25Qcm9wZXJ0eShldikpIHtcbiAgICBlbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzKTtcbiAgdmFyIHBhY2tldCA9IHsgdHlwZTogcGFyc2VyLkVWRU5ULCBkYXRhOiBhcmdzIH07XG5cbiAgcGFja2V0Lm9wdGlvbnMgPSB7fTtcbiAgcGFja2V0Lm9wdGlvbnMuY29tcHJlc3MgPSAhdGhpcy5mbGFncyB8fCBmYWxzZSAhPT0gdGhpcy5mbGFncy5jb21wcmVzcztcblxuICAvLyBldmVudCBhY2sgY2FsbGJhY2tcbiAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pIHtcbiAgICBkZWJ1ZygnZW1pdHRpbmcgcGFja2V0IHdpdGggYWNrIGlkICVkJywgdGhpcy5pZHMpO1xuICAgIHRoaXMuYWNrc1t0aGlzLmlkc10gPSBhcmdzLnBvcCgpO1xuICAgIHBhY2tldC5pZCA9IHRoaXMuaWRzKys7XG4gIH1cblxuICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICB0aGlzLnBhY2tldChwYWNrZXQpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc2VuZEJ1ZmZlci5wdXNoKHBhY2tldCk7XG4gIH1cblxuICBkZWxldGUgdGhpcy5mbGFncztcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2VuZHMgYSBwYWNrZXQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhY2tldFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5wYWNrZXQgPSBmdW5jdGlvbiAocGFja2V0KSB7XG4gIHBhY2tldC5uc3AgPSB0aGlzLm5zcDtcbiAgdGhpcy5pby5wYWNrZXQocGFja2V0KTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gZW5naW5lIGBvcGVuYC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLm9ub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ3RyYW5zcG9ydCBpcyBvcGVuIC0gY29ubmVjdGluZycpO1xuXG4gIC8vIHdyaXRlIGNvbm5lY3QgcGFja2V0IGlmIG5lY2Vzc2FyeVxuICBpZiAoJy8nICE9PSB0aGlzLm5zcCkge1xuICAgIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgICB2YXIgcXVlcnkgPSB0eXBlb2YgdGhpcy5xdWVyeSA9PT0gJ29iamVjdCcgPyBwYXJzZXFzLmVuY29kZSh0aGlzLnF1ZXJ5KSA6IHRoaXMucXVlcnk7XG4gICAgICBkZWJ1Zygnc2VuZGluZyBjb25uZWN0IHBhY2tldCB3aXRoIHF1ZXJ5ICVzJywgcXVlcnkpO1xuICAgICAgdGhpcy5wYWNrZXQoe3R5cGU6IHBhcnNlci5DT05ORUNULCBxdWVyeTogcXVlcnl9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWNrZXQoe3R5cGU6IHBhcnNlci5DT05ORUNUfSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIGVuZ2luZSBgY2xvc2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByZWFzb25cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25jbG9zZSA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgZGVidWcoJ2Nsb3NlICglcyknLCByZWFzb24pO1xuICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG4gIGRlbGV0ZSB0aGlzLmlkO1xuICB0aGlzLmVtaXQoJ2Rpc2Nvbm5lY3QnLCByZWFzb24pO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgd2l0aCBzb2NrZXQgcGFja2V0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25wYWNrZXQgPSBmdW5jdGlvbiAocGFja2V0KSB7XG4gIGlmIChwYWNrZXQubnNwICE9PSB0aGlzLm5zcCkgcmV0dXJuO1xuXG4gIHN3aXRjaCAocGFja2V0LnR5cGUpIHtcbiAgICBjYXNlIHBhcnNlci5DT05ORUNUOlxuICAgICAgdGhpcy5vbmNvbm5lY3QoKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBwYXJzZXIuRVZFTlQ6XG4gICAgICB0aGlzLm9uZXZlbnQocGFja2V0KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBwYXJzZXIuQklOQVJZX0VWRU5UOlxuICAgICAgdGhpcy5vbmV2ZW50KHBhY2tldCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcGFyc2VyLkFDSzpcbiAgICAgIHRoaXMub25hY2socGFja2V0KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBwYXJzZXIuQklOQVJZX0FDSzpcbiAgICAgIHRoaXMub25hY2socGFja2V0KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBwYXJzZXIuRElTQ09OTkVDVDpcbiAgICAgIHRoaXMub25kaXNjb25uZWN0KCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcGFyc2VyLkVSUk9SOlxuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHBhY2tldC5kYXRhKTtcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIGEgc2VydmVyIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25ldmVudCA9IGZ1bmN0aW9uIChwYWNrZXQpIHtcbiAgdmFyIGFyZ3MgPSBwYWNrZXQuZGF0YSB8fCBbXTtcbiAgZGVidWcoJ2VtaXR0aW5nIGV2ZW50ICVqJywgYXJncyk7XG5cbiAgaWYgKG51bGwgIT0gcGFja2V0LmlkKSB7XG4gICAgZGVidWcoJ2F0dGFjaGluZyBhY2sgY2FsbGJhY2sgdG8gZXZlbnQnKTtcbiAgICBhcmdzLnB1c2godGhpcy5hY2socGFja2V0LmlkKSk7XG4gIH1cblxuICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICBlbWl0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5wdXNoKGFyZ3MpO1xuICB9XG59O1xuXG4vKipcbiAqIFByb2R1Y2VzIGFuIGFjayBjYWxsYmFjayB0byBlbWl0IHdpdGggYW4gZXZlbnQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5hY2sgPSBmdW5jdGlvbiAoaWQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc2VudCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIC8vIHByZXZlbnQgZG91YmxlIGNhbGxiYWNrc1xuICAgIGlmIChzZW50KSByZXR1cm47XG4gICAgc2VudCA9IHRydWU7XG4gICAgdmFyIGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cyk7XG4gICAgZGVidWcoJ3NlbmRpbmcgYWNrICVqJywgYXJncyk7XG5cbiAgICBzZWxmLnBhY2tldCh7XG4gICAgICB0eXBlOiBwYXJzZXIuQUNLLFxuICAgICAgaWQ6IGlkLFxuICAgICAgZGF0YTogYXJnc1xuICAgIH0pO1xuICB9O1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBhIHNlcnZlciBhY2tub3dsZWdlbWVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLm9uYWNrID0gZnVuY3Rpb24gKHBhY2tldCkge1xuICB2YXIgYWNrID0gdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgYWNrKSB7XG4gICAgZGVidWcoJ2NhbGxpbmcgYWNrICVzIHdpdGggJWonLCBwYWNrZXQuaWQsIHBhY2tldC5kYXRhKTtcbiAgICBhY2suYXBwbHkodGhpcywgcGFja2V0LmRhdGEpO1xuICAgIGRlbGV0ZSB0aGlzLmFja3NbcGFja2V0LmlkXTtcbiAgfSBlbHNlIHtcbiAgICBkZWJ1ZygnYmFkIGFjayAlcycsIHBhY2tldC5pZCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gc2VydmVyIGNvbm5lY3QuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5vbmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgdGhpcy5kaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgdGhpcy5lbWl0KCdjb25uZWN0Jyk7XG4gIHRoaXMuZW1pdEJ1ZmZlcmVkKCk7XG59O1xuXG4vKipcbiAqIEVtaXQgYnVmZmVyZWQgZXZlbnRzIChyZWNlaXZlZCBhbmQgZW1pdHRlZCkuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5lbWl0QnVmZmVyZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgZW1pdC5hcHBseSh0aGlzLCB0aGlzLnJlY2VpdmVCdWZmZXJbaV0pO1xuICB9XG4gIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IFtdO1xuXG4gIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNlbmRCdWZmZXIubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnBhY2tldCh0aGlzLnNlbmRCdWZmZXJbaV0pO1xuICB9XG4gIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBzZXJ2ZXIgZGlzY29ubmVjdC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLm9uZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ3NlcnZlciBkaXNjb25uZWN0ICglcyknLCB0aGlzLm5zcCk7XG4gIHRoaXMuZGVzdHJveSgpO1xuICB0aGlzLm9uY2xvc2UoJ2lvIHNlcnZlciBkaXNjb25uZWN0Jyk7XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIGZvcmNlZCBjbGllbnQvc2VydmVyIHNpZGUgZGlzY29ubmVjdGlvbnMsXG4gKiB0aGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBtYW5hZ2VyIHN0b3BzIHRyYWNraW5nIHVzIGFuZFxuICogdGhhdCByZWNvbm5lY3Rpb25zIGRvbid0IGdldCB0cmlnZ2VyZWQgZm9yIHRoaXMuXG4gKlxuICogQGFwaSBwcml2YXRlLlxuICovXG5cblNvY2tldC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuc3Vicykge1xuICAgIC8vIGNsZWFuIHN1YnNjcmlwdGlvbnMgdG8gYXZvaWQgcmVjb25uZWN0aW9uc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN1YnNbaV0uZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLnN1YnMgPSBudWxsO1xuICB9XG5cbiAgdGhpcy5pby5kZXN0cm95KHRoaXMpO1xufTtcblxuLyoqXG4gKiBEaXNjb25uZWN0cyB0aGUgc29ja2V0IG1hbnVhbGx5LlxuICpcbiAqIEByZXR1cm4ge1NvY2tldH0gc2VsZlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLmNsb3NlID1cblNvY2tldC5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgZGVidWcoJ3BlcmZvcm1pbmcgZGlzY29ubmVjdCAoJXMpJywgdGhpcy5uc3ApO1xuICAgIHRoaXMucGFja2V0KHsgdHlwZTogcGFyc2VyLkRJU0NPTk5FQ1QgfSk7XG4gIH1cblxuICAvLyByZW1vdmUgc29ja2V0IGZyb20gcG9vbFxuICB0aGlzLmRlc3Ryb3koKTtcblxuICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICAvLyBmaXJlIGV2ZW50c1xuICAgIHRoaXMub25jbG9zZSgnaW8gY2xpZW50IGRpc2Nvbm5lY3QnKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgY29tcHJlc3MgZmxhZy5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlmIGB0cnVlYCwgY29tcHJlc3NlcyB0aGUgc2VuZGluZyBkYXRhXG4gKiBAcmV0dXJuIHtTb2NrZXR9IHNlbGZcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5jb21wcmVzcyA9IGZ1bmN0aW9uIChjb21wcmVzcykge1xuICB0aGlzLmZsYWdzID0gdGhpcy5mbGFncyB8fCB7fTtcbiAgdGhpcy5mbGFncy5jb21wcmVzcyA9IGNvbXByZXNzO1xuICByZXR1cm4gdGhpcztcbn07XG4iLCJcbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgcGFyc2V1cmkgPSByZXF1aXJlKCdwYXJzZXVyaScpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnc29ja2V0LmlvLWNsaWVudDp1cmwnKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVybDtcblxuLyoqXG4gKiBVUkwgcGFyc2VyLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7T2JqZWN0fSBBbiBvYmplY3QgbWVhbnQgdG8gbWltaWMgd2luZG93LmxvY2F0aW9uLlxuICogICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHdpbmRvdy5sb2NhdGlvbi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gdXJsICh1cmksIGxvYykge1xuICB2YXIgb2JqID0gdXJpO1xuXG4gIC8vIGRlZmF1bHQgdG8gd2luZG93LmxvY2F0aW9uXG4gIGxvYyA9IGxvYyB8fCBnbG9iYWwubG9jYXRpb247XG4gIGlmIChudWxsID09IHVyaSkgdXJpID0gbG9jLnByb3RvY29sICsgJy8vJyArIGxvYy5ob3N0O1xuXG4gIC8vIHJlbGF0aXZlIHBhdGggc3VwcG9ydFxuICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiB1cmkpIHtcbiAgICBpZiAoJy8nID09PSB1cmkuY2hhckF0KDApKSB7XG4gICAgICBpZiAoJy8nID09PSB1cmkuY2hhckF0KDEpKSB7XG4gICAgICAgIHVyaSA9IGxvYy5wcm90b2NvbCArIHVyaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVyaSA9IGxvYy5ob3N0ICsgdXJpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghL14oaHR0cHM/fHdzcz8pOlxcL1xcLy8udGVzdCh1cmkpKSB7XG4gICAgICBkZWJ1ZygncHJvdG9jb2wtbGVzcyB1cmwgJXMnLCB1cmkpO1xuICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgbG9jKSB7XG4gICAgICAgIHVyaSA9IGxvYy5wcm90b2NvbCArICcvLycgKyB1cmk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cmkgPSAnaHR0cHM6Ly8nICsgdXJpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlXG4gICAgZGVidWcoJ3BhcnNlICVzJywgdXJpKTtcbiAgICBvYmogPSBwYXJzZXVyaSh1cmkpO1xuICB9XG5cbiAgLy8gbWFrZSBzdXJlIHdlIHRyZWF0IGBsb2NhbGhvc3Q6ODBgIGFuZCBgbG9jYWxob3N0YCBlcXVhbGx5XG4gIGlmICghb2JqLnBvcnQpIHtcbiAgICBpZiAoL14oaHR0cHx3cykkLy50ZXN0KG9iai5wcm90b2NvbCkpIHtcbiAgICAgIG9iai5wb3J0ID0gJzgwJztcbiAgICB9IGVsc2UgaWYgKC9eKGh0dHB8d3MpcyQvLnRlc3Qob2JqLnByb3RvY29sKSkge1xuICAgICAgb2JqLnBvcnQgPSAnNDQzJztcbiAgICB9XG4gIH1cblxuICBvYmoucGF0aCA9IG9iai5wYXRoIHx8ICcvJztcblxuICB2YXIgaXB2NiA9IG9iai5ob3N0LmluZGV4T2YoJzonKSAhPT0gLTE7XG4gIHZhciBob3N0ID0gaXB2NiA/ICdbJyArIG9iai5ob3N0ICsgJ10nIDogb2JqLmhvc3Q7XG5cbiAgLy8gZGVmaW5lIHVuaXF1ZSBpZFxuICBvYmouaWQgPSBvYmoucHJvdG9jb2wgKyAnOi8vJyArIGhvc3QgKyAnOicgKyBvYmoucG9ydDtcbiAgLy8gZGVmaW5lIGhyZWZcbiAgb2JqLmhyZWYgPSBvYmoucHJvdG9jb2wgKyAnOi8vJyArIGhvc3QgKyAobG9jICYmIGxvYy5wb3J0ID09PSBvYmoucG9ydCA/ICcnIDogKCc6JyArIG9iai5wb3J0KSk7XG5cbiAgcmV0dXJuIG9iajtcbn1cbiIsIi8qZ2xvYmFsIEJsb2IsRmlsZSovXG5cbi8qKlxuICogTW9kdWxlIHJlcXVpcmVtZW50c1xuICovXG5cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xudmFyIGlzQnVmID0gcmVxdWlyZSgnLi9pcy1idWZmZXInKTtcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgd2l0aE5hdGl2ZUJsb2IgPSB0eXBlb2YgZ2xvYmFsLkJsb2IgPT09ICdmdW5jdGlvbicgfHwgdG9TdHJpbmcuY2FsbChnbG9iYWwuQmxvYikgPT09ICdbb2JqZWN0IEJsb2JDb25zdHJ1Y3Rvcl0nO1xudmFyIHdpdGhOYXRpdmVGaWxlID0gdHlwZW9mIGdsb2JhbC5GaWxlID09PSAnZnVuY3Rpb24nIHx8IHRvU3RyaW5nLmNhbGwoZ2xvYmFsLkZpbGUpID09PSAnW29iamVjdCBGaWxlQ29uc3RydWN0b3JdJztcblxuLyoqXG4gKiBSZXBsYWNlcyBldmVyeSBCdWZmZXIgfCBBcnJheUJ1ZmZlciBpbiBwYWNrZXQgd2l0aCBhIG51bWJlcmVkIHBsYWNlaG9sZGVyLlxuICogQW55dGhpbmcgd2l0aCBibG9icyBvciBmaWxlcyBzaG91bGQgYmUgZmVkIHRocm91Z2ggcmVtb3ZlQmxvYnMgYmVmb3JlIGNvbWluZ1xuICogaGVyZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gc29ja2V0LmlvIGV2ZW50IHBhY2tldFxuICogQHJldHVybiB7T2JqZWN0fSB3aXRoIGRlY29uc3RydWN0ZWQgcGFja2V0IGFuZCBsaXN0IG9mIGJ1ZmZlcnNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5kZWNvbnN0cnVjdFBhY2tldCA9IGZ1bmN0aW9uKHBhY2tldCkge1xuICB2YXIgYnVmZmVycyA9IFtdO1xuICB2YXIgcGFja2V0RGF0YSA9IHBhY2tldC5kYXRhO1xuICB2YXIgcGFjayA9IHBhY2tldDtcbiAgcGFjay5kYXRhID0gX2RlY29uc3RydWN0UGFja2V0KHBhY2tldERhdGEsIGJ1ZmZlcnMpO1xuICBwYWNrLmF0dGFjaG1lbnRzID0gYnVmZmVycy5sZW5ndGg7IC8vIG51bWJlciBvZiBiaW5hcnkgJ2F0dGFjaG1lbnRzJ1xuICByZXR1cm4ge3BhY2tldDogcGFjaywgYnVmZmVyczogYnVmZmVyc307XG59O1xuXG5mdW5jdGlvbiBfZGVjb25zdHJ1Y3RQYWNrZXQoZGF0YSwgYnVmZmVycykge1xuICBpZiAoIWRhdGEpIHJldHVybiBkYXRhO1xuXG4gIGlmIChpc0J1ZihkYXRhKSkge1xuICAgIHZhciBwbGFjZWhvbGRlciA9IHsgX3BsYWNlaG9sZGVyOiB0cnVlLCBudW06IGJ1ZmZlcnMubGVuZ3RoIH07XG4gICAgYnVmZmVycy5wdXNoKGRhdGEpO1xuICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGRhdGEpKSB7XG4gICAgdmFyIG5ld0RhdGEgPSBuZXcgQXJyYXkoZGF0YS5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgbmV3RGF0YVtpXSA9IF9kZWNvbnN0cnVjdFBhY2tldChkYXRhW2ldLCBidWZmZXJzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0RhdGE7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICEoZGF0YSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgdmFyIG5ld0RhdGEgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgbmV3RGF0YVtrZXldID0gX2RlY29uc3RydWN0UGFja2V0KGRhdGFba2V5XSwgYnVmZmVycyk7XG4gICAgfVxuICAgIHJldHVybiBuZXdEYXRhO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFJlY29uc3RydWN0cyBhIGJpbmFyeSBwYWNrZXQgZnJvbSBpdHMgcGxhY2Vob2xkZXIgcGFja2V0IGFuZCBidWZmZXJzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhY2tldCAtIGV2ZW50IHBhY2tldCB3aXRoIHBsYWNlaG9sZGVyc1xuICogQHBhcmFtIHtBcnJheX0gYnVmZmVycyAtIGJpbmFyeSBidWZmZXJzIHRvIHB1dCBpbiBwbGFjZWhvbGRlciBwb3NpdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gcmVjb25zdHJ1Y3RlZCBwYWNrZXRcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5yZWNvbnN0cnVjdFBhY2tldCA9IGZ1bmN0aW9uKHBhY2tldCwgYnVmZmVycykge1xuICBwYWNrZXQuZGF0YSA9IF9yZWNvbnN0cnVjdFBhY2tldChwYWNrZXQuZGF0YSwgYnVmZmVycyk7XG4gIHBhY2tldC5hdHRhY2htZW50cyA9IHVuZGVmaW5lZDsgLy8gbm8gbG9uZ2VyIHVzZWZ1bFxuICByZXR1cm4gcGFja2V0O1xufTtcblxuZnVuY3Rpb24gX3JlY29uc3RydWN0UGFja2V0KGRhdGEsIGJ1ZmZlcnMpIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gZGF0YTtcblxuICBpZiAoZGF0YSAmJiBkYXRhLl9wbGFjZWhvbGRlcikge1xuICAgIHJldHVybiBidWZmZXJzW2RhdGEubnVtXTsgLy8gYXBwcm9wcmlhdGUgYnVmZmVyIChzaG91bGQgYmUgbmF0dXJhbCBvcmRlciBhbnl3YXkpXG4gIH0gZWxzZSBpZiAoaXNBcnJheShkYXRhKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgZGF0YVtpXSA9IF9yZWNvbnN0cnVjdFBhY2tldChkYXRhW2ldLCBidWZmZXJzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgIGRhdGFba2V5XSA9IF9yZWNvbnN0cnVjdFBhY2tldChkYXRhW2tleV0sIGJ1ZmZlcnMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgQmxvYnMgb3IgRmlsZXMgZnJvbSBkYXRhIHZpYVxuICogRmlsZVJlYWRlcidzIHJlYWRBc0FycmF5QnVmZmVyIG1ldGhvZC4gVXNlZCBiZWZvcmUgZW5jb2RpbmdcbiAqIGRhdGEgYXMgbXNncGFjay4gQ2FsbHMgY2FsbGJhY2sgd2l0aCB0aGUgYmxvYmxlc3MgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMucmVtb3ZlQmxvYnMgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFjaykge1xuICBmdW5jdGlvbiBfcmVtb3ZlQmxvYnMob2JqLCBjdXJLZXksIGNvbnRhaW5pbmdPYmplY3QpIHtcbiAgICBpZiAoIW9iaikgcmV0dXJuIG9iajtcblxuICAgIC8vIGNvbnZlcnQgYW55IGJsb2JcbiAgICBpZiAoKHdpdGhOYXRpdmVCbG9iICYmIG9iaiBpbnN0YW5jZW9mIEJsb2IpIHx8XG4gICAgICAgICh3aXRoTmF0aXZlRmlsZSAmJiBvYmogaW5zdGFuY2VvZiBGaWxlKSkge1xuICAgICAgcGVuZGluZ0Jsb2JzKys7XG5cbiAgICAgIC8vIGFzeW5jIGZpbGVyZWFkZXJcbiAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7IC8vIHRoaXMucmVzdWx0ID09IGFycmF5YnVmZmVyXG4gICAgICAgIGlmIChjb250YWluaW5nT2JqZWN0KSB7XG4gICAgICAgICAgY29udGFpbmluZ09iamVjdFtjdXJLZXldID0gdGhpcy5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYmxvYmxlc3NEYXRhID0gdGhpcy5yZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBub3RoaW5nIHBlbmRpbmcgaXRzIGNhbGxiYWNrIHRpbWVcbiAgICAgICAgaWYoISAtLXBlbmRpbmdCbG9icykge1xuICAgICAgICAgIGNhbGxiYWNrKGJsb2JsZXNzRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIob2JqKTsgLy8gYmxvYiAtPiBhcnJheWJ1ZmZlclxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmopKSB7IC8vIGhhbmRsZSBhcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgX3JlbW92ZUJsb2JzKG9ialtpXSwgaSwgb2JqKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFpc0J1ZihvYmopKSB7IC8vIGFuZCBvYmplY3RcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgX3JlbW92ZUJsb2JzKG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHBlbmRpbmdCbG9icyA9IDA7XG4gIHZhciBibG9ibGVzc0RhdGEgPSBkYXRhO1xuICBfcmVtb3ZlQmxvYnMoYmxvYmxlc3NEYXRhKTtcbiAgaWYgKCFwZW5kaW5nQmxvYnMpIHtcbiAgICBjYWxsYmFjayhibG9ibGVzc0RhdGEpO1xuICB9XG59O1xuIiwiXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnc29ja2V0LmlvLXBhcnNlcicpO1xudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCdjb21wb25lbnQtZW1pdHRlcicpO1xudmFyIGhhc0JpbiA9IHJlcXVpcmUoJ2hhcy1iaW5hcnkyJyk7XG52YXIgYmluYXJ5ID0gcmVxdWlyZSgnLi9iaW5hcnknKTtcbnZhciBpc0J1ZiA9IHJlcXVpcmUoJy4vaXMtYnVmZmVyJyk7XG5cbi8qKlxuICogUHJvdG9jb2wgdmVyc2lvbi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMucHJvdG9jb2wgPSA0O1xuXG4vKipcbiAqIFBhY2tldCB0eXBlcy5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMudHlwZXMgPSBbXG4gICdDT05ORUNUJyxcbiAgJ0RJU0NPTk5FQ1QnLFxuICAnRVZFTlQnLFxuICAnQUNLJyxcbiAgJ0VSUk9SJyxcbiAgJ0JJTkFSWV9FVkVOVCcsXG4gICdCSU5BUllfQUNLJ1xuXTtcblxuLyoqXG4gKiBQYWNrZXQgdHlwZSBgY29ubmVjdGAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLkNPTk5FQ1QgPSAwO1xuXG4vKipcbiAqIFBhY2tldCB0eXBlIGBkaXNjb25uZWN0YC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuRElTQ09OTkVDVCA9IDE7XG5cbi8qKlxuICogUGFja2V0IHR5cGUgYGV2ZW50YC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuRVZFTlQgPSAyO1xuXG4vKipcbiAqIFBhY2tldCB0eXBlIGBhY2tgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5BQ0sgPSAzO1xuXG4vKipcbiAqIFBhY2tldCB0eXBlIGBlcnJvcmAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLkVSUk9SID0gNDtcblxuLyoqXG4gKiBQYWNrZXQgdHlwZSAnYmluYXJ5IGV2ZW50J1xuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5CSU5BUllfRVZFTlQgPSA1O1xuXG4vKipcbiAqIFBhY2tldCB0eXBlIGBiaW5hcnkgYWNrYC4gRm9yIGFja3Mgd2l0aCBiaW5hcnkgYXJndW1lbnRzLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5CSU5BUllfQUNLID0gNjtcblxuLyoqXG4gKiBFbmNvZGVyIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5FbmNvZGVyID0gRW5jb2RlcjtcblxuLyoqXG4gKiBEZWNvZGVyIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5EZWNvZGVyID0gRGVjb2RlcjtcblxuLyoqXG4gKiBBIHNvY2tldC5pbyBFbmNvZGVyIGluc3RhbmNlXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBFbmNvZGVyKCkge31cblxuLyoqXG4gKiBFbmNvZGUgYSBwYWNrZXQgYXMgYSBzaW5nbGUgc3RyaW5nIGlmIG5vbi1iaW5hcnksIG9yIGFzIGFcbiAqIGJ1ZmZlciBzZXF1ZW5jZSwgZGVwZW5kaW5nIG9uIHBhY2tldCB0eXBlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBwYWNrZXQgb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIGZ1bmN0aW9uIHRvIGhhbmRsZSBlbmNvZGluZ3MgKGxpa2VseSBlbmdpbmUud3JpdGUpXG4gKiBAcmV0dXJuIENhbGxzIGNhbGxiYWNrIHdpdGggQXJyYXkgb2YgZW5jb2RpbmdzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2spe1xuICBpZiAoKG9iai50eXBlID09PSBleHBvcnRzLkVWRU5UIHx8IG9iai50eXBlID09PSBleHBvcnRzLkFDSykgJiYgaGFzQmluKG9iai5kYXRhKSkge1xuICAgIG9iai50eXBlID0gb2JqLnR5cGUgPT09IGV4cG9ydHMuRVZFTlQgPyBleHBvcnRzLkJJTkFSWV9FVkVOVCA6IGV4cG9ydHMuQklOQVJZX0FDSztcbiAgfVxuXG4gIGRlYnVnKCdlbmNvZGluZyBwYWNrZXQgJWonLCBvYmopO1xuXG4gIGlmIChleHBvcnRzLkJJTkFSWV9FVkVOVCA9PT0gb2JqLnR5cGUgfHwgZXhwb3J0cy5CSU5BUllfQUNLID09PSBvYmoudHlwZSkge1xuICAgIGVuY29kZUFzQmluYXJ5KG9iaiwgY2FsbGJhY2spO1xuICB9XG4gIGVsc2Uge1xuICAgIHZhciBlbmNvZGluZyA9IGVuY29kZUFzU3RyaW5nKG9iaik7XG4gICAgY2FsbGJhY2soW2VuY29kaW5nXSk7XG4gIH1cbn07XG5cbi8qKlxuICogRW5jb2RlIHBhY2tldCBhcyBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhY2tldFxuICogQHJldHVybiB7U3RyaW5nfSBlbmNvZGVkXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBlbmNvZGVBc1N0cmluZyhvYmopIHtcblxuICAvLyBmaXJzdCBpcyB0eXBlXG4gIHZhciBzdHIgPSAnJyArIG9iai50eXBlO1xuXG4gIC8vIGF0dGFjaG1lbnRzIGlmIHdlIGhhdmUgdGhlbVxuICBpZiAoZXhwb3J0cy5CSU5BUllfRVZFTlQgPT09IG9iai50eXBlIHx8IGV4cG9ydHMuQklOQVJZX0FDSyA9PT0gb2JqLnR5cGUpIHtcbiAgICBzdHIgKz0gb2JqLmF0dGFjaG1lbnRzICsgJy0nO1xuICB9XG5cbiAgLy8gaWYgd2UgaGF2ZSBhIG5hbWVzcGFjZSBvdGhlciB0aGFuIGAvYFxuICAvLyB3ZSBhcHBlbmQgaXQgZm9sbG93ZWQgYnkgYSBjb21tYSBgLGBcbiAgaWYgKG9iai5uc3AgJiYgJy8nICE9PSBvYmoubnNwKSB7XG4gICAgc3RyICs9IG9iai5uc3AgKyAnLCc7XG4gIH1cblxuICAvLyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgaWRcbiAgaWYgKG51bGwgIT0gb2JqLmlkKSB7XG4gICAgc3RyICs9IG9iai5pZDtcbiAgfVxuXG4gIC8vIGpzb24gZGF0YVxuICBpZiAobnVsbCAhPSBvYmouZGF0YSkge1xuICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShvYmouZGF0YSk7XG4gIH1cblxuICBkZWJ1ZygnZW5jb2RlZCAlaiBhcyAlcycsIG9iaiwgc3RyKTtcbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiBFbmNvZGUgcGFja2V0IGFzICdidWZmZXIgc2VxdWVuY2UnIGJ5IHJlbW92aW5nIGJsb2JzLCBhbmRcbiAqIGRlY29uc3RydWN0aW5nIHBhY2tldCBpbnRvIG9iamVjdCB3aXRoIHBsYWNlaG9sZGVycyBhbmRcbiAqIGEgbGlzdCBvZiBidWZmZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXRcbiAqIEByZXR1cm4ge0J1ZmZlcn0gZW5jb2RlZFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZW5jb2RlQXNCaW5hcnkob2JqLCBjYWxsYmFjaykge1xuXG4gIGZ1bmN0aW9uIHdyaXRlRW5jb2RpbmcoYmxvYmxlc3NEYXRhKSB7XG4gICAgdmFyIGRlY29uc3RydWN0aW9uID0gYmluYXJ5LmRlY29uc3RydWN0UGFja2V0KGJsb2JsZXNzRGF0YSk7XG4gICAgdmFyIHBhY2sgPSBlbmNvZGVBc1N0cmluZyhkZWNvbnN0cnVjdGlvbi5wYWNrZXQpO1xuICAgIHZhciBidWZmZXJzID0gZGVjb25zdHJ1Y3Rpb24uYnVmZmVycztcblxuICAgIGJ1ZmZlcnMudW5zaGlmdChwYWNrKTsgLy8gYWRkIHBhY2tldCBpbmZvIHRvIGJlZ2lubmluZyBvZiBkYXRhIGxpc3RcbiAgICBjYWxsYmFjayhidWZmZXJzKTsgLy8gd3JpdGUgYWxsIHRoZSBidWZmZXJzXG4gIH1cblxuICBiaW5hcnkucmVtb3ZlQmxvYnMob2JqLCB3cml0ZUVuY29kaW5nKTtcbn1cblxuLyoqXG4gKiBBIHNvY2tldC5pbyBEZWNvZGVyIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBkZWNvZGVyXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIERlY29kZXIoKSB7XG4gIHRoaXMucmVjb25zdHJ1Y3RvciA9IG51bGw7XG59XG5cbi8qKlxuICogTWl4IGluIGBFbWl0dGVyYCB3aXRoIERlY29kZXIuXG4gKi9cblxuRW1pdHRlcihEZWNvZGVyLnByb3RvdHlwZSk7XG5cbi8qKlxuICogRGVjb2RlcyBhbiBlY29kZWQgcGFja2V0IHN0cmluZyBpbnRvIHBhY2tldCBKU09OLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmogLSBlbmNvZGVkIHBhY2tldFxuICogQHJldHVybiB7T2JqZWN0fSBwYWNrZXRcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRGVjb2Rlci5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24ob2JqKSB7XG4gIHZhciBwYWNrZXQ7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgIHBhY2tldCA9IGRlY29kZVN0cmluZyhvYmopO1xuICAgIGlmIChleHBvcnRzLkJJTkFSWV9FVkVOVCA9PT0gcGFja2V0LnR5cGUgfHwgZXhwb3J0cy5CSU5BUllfQUNLID09PSBwYWNrZXQudHlwZSkgeyAvLyBiaW5hcnkgcGFja2V0J3MganNvblxuICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbmV3IEJpbmFyeVJlY29uc3RydWN0b3IocGFja2V0KTtcblxuICAgICAgLy8gbm8gYXR0YWNobWVudHMsIGxhYmVsZWQgYmluYXJ5IGJ1dCBubyBiaW5hcnkgZGF0YSB0byBmb2xsb3dcbiAgICAgIGlmICh0aGlzLnJlY29uc3RydWN0b3IucmVjb25QYWNrLmF0dGFjaG1lbnRzID09PSAwKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZGVjb2RlZCcsIHBhY2tldCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gbm9uLWJpbmFyeSBmdWxsIHBhY2tldFxuICAgICAgdGhpcy5lbWl0KCdkZWNvZGVkJywgcGFja2V0KTtcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAoaXNCdWYob2JqKSB8fCBvYmouYmFzZTY0KSB7IC8vIHJhdyBiaW5hcnkgZGF0YVxuICAgIGlmICghdGhpcy5yZWNvbnN0cnVjdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvdCBiaW5hcnkgZGF0YSB3aGVuIG5vdCByZWNvbnN0cnVjdGluZyBhIHBhY2tldCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWNrZXQgPSB0aGlzLnJlY29uc3RydWN0b3IudGFrZUJpbmFyeURhdGEob2JqKTtcbiAgICAgIGlmIChwYWNrZXQpIHsgLy8gcmVjZWl2ZWQgZmluYWwgYnVmZmVyXG4gICAgICAgIHRoaXMucmVjb25zdHJ1Y3RvciA9IG51bGw7XG4gICAgICAgIHRoaXMuZW1pdCgnZGVjb2RlZCcsIHBhY2tldCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB0eXBlOiAnICsgb2JqKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBwYWNrZXQgU3RyaW5nIChKU09OIGRhdGEpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7T2JqZWN0fSBwYWNrZXRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGRlY29kZVN0cmluZyhzdHIpIHtcbiAgdmFyIGkgPSAwO1xuICAvLyBsb29rIHVwIHR5cGVcbiAgdmFyIHAgPSB7XG4gICAgdHlwZTogTnVtYmVyKHN0ci5jaGFyQXQoMCkpXG4gIH07XG5cbiAgaWYgKG51bGwgPT0gZXhwb3J0cy50eXBlc1twLnR5cGVdKSByZXR1cm4gZXJyb3IoKTtcblxuICAvLyBsb29rIHVwIGF0dGFjaG1lbnRzIGlmIHR5cGUgYmluYXJ5XG4gIGlmIChleHBvcnRzLkJJTkFSWV9FVkVOVCA9PT0gcC50eXBlIHx8IGV4cG9ydHMuQklOQVJZX0FDSyA9PT0gcC50eXBlKSB7XG4gICAgdmFyIGJ1ZiA9ICcnO1xuICAgIHdoaWxlIChzdHIuY2hhckF0KCsraSkgIT09ICctJykge1xuICAgICAgYnVmICs9IHN0ci5jaGFyQXQoaSk7XG4gICAgICBpZiAoaSA9PSBzdHIubGVuZ3RoKSBicmVhaztcbiAgICB9XG4gICAgaWYgKGJ1ZiAhPSBOdW1iZXIoYnVmKSB8fCBzdHIuY2hhckF0KGkpICE9PSAnLScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBhdHRhY2htZW50cycpO1xuICAgIH1cbiAgICBwLmF0dGFjaG1lbnRzID0gTnVtYmVyKGJ1Zik7XG4gIH1cblxuICAvLyBsb29rIHVwIG5hbWVzcGFjZSAoaWYgYW55KVxuICBpZiAoJy8nID09PSBzdHIuY2hhckF0KGkgKyAxKSkge1xuICAgIHAubnNwID0gJyc7XG4gICAgd2hpbGUgKCsraSkge1xuICAgICAgdmFyIGMgPSBzdHIuY2hhckF0KGkpO1xuICAgICAgaWYgKCcsJyA9PT0gYykgYnJlYWs7XG4gICAgICBwLm5zcCArPSBjO1xuICAgICAgaWYgKGkgPT09IHN0ci5sZW5ndGgpIGJyZWFrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwLm5zcCA9ICcvJztcbiAgfVxuXG4gIC8vIGxvb2sgdXAgaWRcbiAgdmFyIG5leHQgPSBzdHIuY2hhckF0KGkgKyAxKTtcbiAgaWYgKCcnICE9PSBuZXh0ICYmIE51bWJlcihuZXh0KSA9PSBuZXh0KSB7XG4gICAgcC5pZCA9ICcnO1xuICAgIHdoaWxlICgrK2kpIHtcbiAgICAgIHZhciBjID0gc3RyLmNoYXJBdChpKTtcbiAgICAgIGlmIChudWxsID09IGMgfHwgTnVtYmVyKGMpICE9IGMpIHtcbiAgICAgICAgLS1pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHAuaWQgKz0gc3RyLmNoYXJBdChpKTtcbiAgICAgIGlmIChpID09PSBzdHIubGVuZ3RoKSBicmVhaztcbiAgICB9XG4gICAgcC5pZCA9IE51bWJlcihwLmlkKTtcbiAgfVxuXG4gIC8vIGxvb2sgdXAganNvbiBkYXRhXG4gIGlmIChzdHIuY2hhckF0KCsraSkpIHtcbiAgICBwID0gdHJ5UGFyc2UocCwgc3RyLnN1YnN0cihpKSk7XG4gIH1cblxuICBkZWJ1ZygnZGVjb2RlZCAlcyBhcyAlaicsIHN0ciwgcCk7XG4gIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiB0cnlQYXJzZShwLCBzdHIpIHtcbiAgdHJ5IHtcbiAgICBwLmRhdGEgPSBKU09OLnBhcnNlKHN0cik7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIGVycm9yKCk7XG4gIH1cbiAgcmV0dXJuIHA7IFxufVxuXG4vKipcbiAqIERlYWxsb2NhdGVzIGEgcGFyc2VyJ3MgcmVzb3VyY2VzXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5EZWNvZGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnJlY29uc3RydWN0b3IpIHtcbiAgICB0aGlzLnJlY29uc3RydWN0b3IuZmluaXNoZWRSZWNvbnN0cnVjdGlvbigpO1xuICB9XG59O1xuXG4vKipcbiAqIEEgbWFuYWdlciBvZiBhIGJpbmFyeSBldmVudCdzICdidWZmZXIgc2VxdWVuY2UnLiBTaG91bGRcbiAqIGJlIGNvbnN0cnVjdGVkIHdoZW5ldmVyIGEgcGFja2V0IG9mIHR5cGUgQklOQVJZX0VWRU5UIGlzXG4gKiBkZWNvZGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXRcbiAqIEByZXR1cm4ge0JpbmFyeVJlY29uc3RydWN0b3J9IGluaXRpYWxpemVkIHJlY29uc3RydWN0b3JcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIEJpbmFyeVJlY29uc3RydWN0b3IocGFja2V0KSB7XG4gIHRoaXMucmVjb25QYWNrID0gcGFja2V0O1xuICB0aGlzLmJ1ZmZlcnMgPSBbXTtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gYmUgY2FsbGVkIHdoZW4gYmluYXJ5IGRhdGEgcmVjZWl2ZWQgZnJvbSBjb25uZWN0aW9uXG4gKiBhZnRlciBhIEJJTkFSWV9FVkVOVCBwYWNrZXQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXIgfCBBcnJheUJ1ZmZlcn0gYmluRGF0YSAtIHRoZSByYXcgYmluYXJ5IGRhdGEgcmVjZWl2ZWRcbiAqIEByZXR1cm4ge251bGwgfCBPYmplY3R9IHJldHVybnMgbnVsbCBpZiBtb3JlIGJpbmFyeSBkYXRhIGlzIGV4cGVjdGVkIG9yXG4gKiAgIGEgcmVjb25zdHJ1Y3RlZCBwYWNrZXQgb2JqZWN0IGlmIGFsbCBidWZmZXJzIGhhdmUgYmVlbiByZWNlaXZlZC5cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkJpbmFyeVJlY29uc3RydWN0b3IucHJvdG90eXBlLnRha2VCaW5hcnlEYXRhID0gZnVuY3Rpb24oYmluRGF0YSkge1xuICB0aGlzLmJ1ZmZlcnMucHVzaChiaW5EYXRhKTtcbiAgaWYgKHRoaXMuYnVmZmVycy5sZW5ndGggPT09IHRoaXMucmVjb25QYWNrLmF0dGFjaG1lbnRzKSB7IC8vIGRvbmUgd2l0aCBidWZmZXIgbGlzdFxuICAgIHZhciBwYWNrZXQgPSBiaW5hcnkucmVjb25zdHJ1Y3RQYWNrZXQodGhpcy5yZWNvblBhY2ssIHRoaXMuYnVmZmVycyk7XG4gICAgdGhpcy5maW5pc2hlZFJlY29uc3RydWN0aW9uKCk7XG4gICAgcmV0dXJuIHBhY2tldDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogQ2xlYW5zIHVwIGJpbmFyeSBwYWNrZXQgcmVjb25zdHJ1Y3Rpb24gdmFyaWFibGVzLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkJpbmFyeVJlY29uc3RydWN0b3IucHJvdG90eXBlLmZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZWNvblBhY2sgPSBudWxsO1xuICB0aGlzLmJ1ZmZlcnMgPSBbXTtcbn07XG5cbmZ1bmN0aW9uIGVycm9yKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGV4cG9ydHMuRVJST1IsXG4gICAgZGF0YTogJ3BhcnNlciBlcnJvcidcbiAgfTtcbn1cbiIsIlxubW9kdWxlLmV4cG9ydHMgPSBpc0J1ZjtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgb2JqIGlzIGEgYnVmZmVyIG9yIGFuIGFycmF5YnVmZmVyLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzQnVmKG9iaikge1xuICByZXR1cm4gKGdsb2JhbC5CdWZmZXIgJiYgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihvYmopKSB8fFxuICAgICAgICAgKGdsb2JhbC5BcnJheUJ1ZmZlciAmJiBvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIGlzRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZyB8fCBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSAnJyArIGVuY29kaW5nO1xuICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOmNhc2UgJ3V0ZjgnOmNhc2UgJ3V0Zi04JzpjYXNlICdhc2NpaSc6Y2FzZSAnYmluYXJ5JzpjYXNlICdiYXNlNjQnOmNhc2UgJ3VjczInOmNhc2UgJ3Vjcy0yJzpjYXNlICd1dGYxNmxlJzpjYXNlICd1dGYtMTZsZSc6Y2FzZSAncmF3JzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgaWYgKCFlbmMpIHJldHVybiAndXRmOCc7XG4gIHZhciByZXRyaWVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jKSB7XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuICd1dGY4JztcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiAndXRmMTZsZSc7XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuICdsYXRpbjEnO1xuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBlbmM7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocmV0cmllZCkgcmV0dXJuOyAvLyB1bmRlZmluZWRcbiAgICAgICAgZW5jID0gKCcnICsgZW5jKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXRyaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIERvIG5vdCBjYWNoZSBgQnVmZmVyLmlzRW5jb2RpbmdgIHdoZW4gY2hlY2tpbmcgZW5jb2RpbmcgbmFtZXMgYXMgc29tZVxuLy8gbW9kdWxlcyBtb25rZXktcGF0Y2ggaXQgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIGVuY29kaW5nc1xuZnVuY3Rpb24gbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIHZhciBuZW5jID0gX25vcm1hbGl6ZUVuY29kaW5nKGVuYyk7XG4gIGlmICh0eXBlb2YgbmVuYyAhPT0gJ3N0cmluZycgJiYgKEJ1ZmZlci5pc0VuY29kaW5nID09PSBpc0VuY29kaW5nIHx8ICFpc0VuY29kaW5nKGVuYykpKSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmMpO1xuICByZXR1cm4gbmVuYyB8fCBlbmM7XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy5cbmV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IFN0cmluZ0RlY29kZXI7XG5mdW5jdGlvbiBTdHJpbmdEZWNvZGVyKGVuY29kaW5nKSB7XG4gIHRoaXMuZW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyhlbmNvZGluZyk7XG4gIHZhciBuYjtcbiAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICB0aGlzLnRleHQgPSB1dGYxNlRleHQ7XG4gICAgICB0aGlzLmVuZCA9IHV0ZjE2RW5kO1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgICB0aGlzLmZpbGxMYXN0ID0gdXRmOEZpbGxMYXN0O1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIHRoaXMudGV4dCA9IGJhc2U2NFRleHQ7XG4gICAgICB0aGlzLmVuZCA9IGJhc2U2NEVuZDtcbiAgICAgIG5iID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gc2ltcGxlV3JpdGU7XG4gICAgICB0aGlzLmVuZCA9IHNpbXBsZUVuZDtcbiAgICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgdGhpcy5sYXN0VG90YWwgPSAwO1xuICB0aGlzLmxhc3RDaGFyID0gQnVmZmVyLmFsbG9jVW5zYWZlKG5iKTtcbn1cblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gIHZhciByO1xuICB2YXIgaTtcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICByID0gdGhpcy5maWxsTGFzdChidWYpO1xuICAgIGlmIChyID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICBpID0gdGhpcy5sYXN0TmVlZDtcbiAgICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgfSBlbHNlIHtcbiAgICBpID0gMDtcbiAgfVxuICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHJldHVybiByID8gciArIHRoaXMudGV4dChidWYsIGkpIDogdGhpcy50ZXh0KGJ1ZiwgaSk7XG4gIHJldHVybiByIHx8ICcnO1xufTtcblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gdXRmOEVuZDtcblxuLy8gUmV0dXJucyBvbmx5IGNvbXBsZXRlIGNoYXJhY3RlcnMgaW4gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLnRleHQgPSB1dGY4VGV4dDtcblxuLy8gQXR0ZW1wdHMgdG8gY29tcGxldGUgYSBwYXJ0aWFsIG5vbi1VVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZmlsbExhc3QgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7XG59O1xuXG4vLyBDaGVja3MgdGhlIHR5cGUgb2YgYSBVVEYtOCBieXRlLCB3aGV0aGVyIGl0J3MgQVNDSUksIGEgbGVhZGluZyBieXRlLCBvciBhXG4vLyBjb250aW51YXRpb24gYnl0ZS5cbmZ1bmN0aW9uIHV0ZjhDaGVja0J5dGUoYnl0ZSkge1xuICBpZiAoYnl0ZSA8PSAweDdGKSByZXR1cm4gMDtlbHNlIGlmIChieXRlID4+IDUgPT09IDB4MDYpIHJldHVybiAyO2Vsc2UgaWYgKGJ5dGUgPj4gNCA9PT0gMHgwRSkgcmV0dXJuIDM7ZWxzZSBpZiAoYnl0ZSA+PiAzID09PSAweDFFKSByZXR1cm4gNDtcbiAgcmV0dXJuIC0xO1xufVxuXG4vLyBDaGVja3MgYXQgbW9zdCAzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBCdWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IGFuXG4vLyBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyLiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzICgyLCAzLCBvciA0KVxuLy8gbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBVVEYtOCBjaGFyYWN0ZXIgKGlmIGFwcGxpY2FibGUpIGFyZSByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0luY29tcGxldGUoc2VsZiwgYnVmLCBpKSB7XG4gIHZhciBqID0gYnVmLmxlbmd0aCAtIDE7XG4gIGlmIChqIDwgaSkgcmV0dXJuIDA7XG4gIHZhciBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAxO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSkgcmV0dXJuIDA7XG4gIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHNlbGYubGFzdE5lZWQgPSBuYiAtIDI7XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIGlmICgtLWogPCBpKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkge1xuICAgICAgaWYgKG5iID09PSAyKSBuYiA9IDA7ZWxzZSBzZWxmLmxhc3ROZWVkID0gbmIgLSAzO1xuICAgIH1cbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIFZhbGlkYXRlcyBhcyBtYW55IGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciBhc1xuLy8gbmVlZGVkIG9yIGFyZSBhdmFpbGFibGUuIElmIHdlIHNlZSBhIG5vbi1jb250aW51YXRpb24gYnl0ZSB3aGVyZSB3ZSBleHBlY3Rcbi8vIG9uZSwgd2UgXCJyZXBsYWNlXCIgdGhlIHZhbGlkYXRlZCBjb250aW51YXRpb24gYnl0ZXMgd2UndmUgc2VlbiBzbyBmYXIgd2l0aFxuLy8gVVRGLTggcmVwbGFjZW1lbnQgY2hhcmFjdGVycyAoJ1xcdWZmZmQnKSwgdG8gbWF0Y2ggdjgncyBVVEYtOCBkZWNvZGluZ1xuLy8gYmVoYXZpb3IuIFRoZSBjb250aW51YXRpb24gYnl0ZSBjaGVjayBpcyBpbmNsdWRlZCB0aHJlZSB0aW1lcyBpbiB0aGUgY2FzZVxuLy8gd2hlcmUgYWxsIG9mIHRoZSBjb250aW51YXRpb24gYnl0ZXMgZm9yIGEgY2hhcmFjdGVyIGV4aXN0IGluIHRoZSBzYW1lIGJ1ZmZlci5cbi8vIEl0IGlzIGFsc28gZG9uZSB0aGlzIHdheSBhcyBhIHNsaWdodCBwZXJmb3JtYW5jZSBpbmNyZWFzZSBpbnN0ZWFkIG9mIHVzaW5nIGFcbi8vIGxvb3AuXG5mdW5jdGlvbiB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHNlbGYsIGJ1ZiwgcCkge1xuICBpZiAoKGJ1ZlswXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgc2VsZi5sYXN0TmVlZCA9IDA7XG4gICAgcmV0dXJuICdcXHVmZmZkJy5yZXBlYXQocCk7XG4gIH1cbiAgaWYgKHNlbGYubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7XG4gICAgaWYgKChidWZbMV0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgc2VsZi5sYXN0TmVlZCA9IDE7XG4gICAgICByZXR1cm4gJ1xcdWZmZmQnLnJlcGVhdChwICsgMSk7XG4gICAgfVxuICAgIGlmIChzZWxmLmxhc3ROZWVkID4gMiAmJiBidWYubGVuZ3RoID4gMikge1xuICAgICAgaWYgKChidWZbMl0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICBzZWxmLmxhc3ROZWVkID0gMjtcbiAgICAgICAgcmV0dXJuICdcXHVmZmZkJy5yZXBlYXQocCArIDIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXIuXG5mdW5jdGlvbiB1dGY4RmlsbExhc3QoYnVmKSB7XG4gIHZhciBwID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICB2YXIgciA9IHV0ZjhDaGVja0V4dHJhQnl0ZXModGhpcywgYnVmLCBwKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHI7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn1cblxuLy8gUmV0dXJucyBhbGwgY29tcGxldGUgVVRGLTggY2hhcmFjdGVycyBpbiBhIEJ1ZmZlci4gSWYgdGhlIEJ1ZmZlciBlbmRlZCBvbiBhXG4vLyBwYXJ0aWFsIGNoYXJhY3RlciwgdGhlIGNoYXJhY3RlcidzIGJ5dGVzIGFyZSBidWZmZXJlZCB1bnRpbCB0aGUgcmVxdWlyZWRcbi8vIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlLlxuZnVuY3Rpb24gdXRmOFRleHQoYnVmLCBpKSB7XG4gIHZhciB0b3RhbCA9IHV0ZjhDaGVja0luY29tcGxldGUodGhpcywgYnVmLCBpKTtcbiAgaWYgKCF0aGlzLmxhc3ROZWVkKSByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSk7XG4gIHRoaXMubGFzdFRvdGFsID0gdG90YWw7XG4gIHZhciBlbmQgPSBidWYubGVuZ3RoIC0gKHRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIDAsIGVuZCk7XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpLCBlbmQpO1xufVxuXG4vLyBGb3IgVVRGLTgsIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGZvciBlYWNoIGJ1ZmZlcmVkIGJ5dGUgb2YgYSAocGFydGlhbClcbi8vIGNoYXJhY3RlciBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgb3V0cHV0LlxuZnVuY3Rpb24gdXRmOEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyAnXFx1ZmZmZCcucmVwZWF0KHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIHJldHVybiByO1xufVxuXG4vLyBVVEYtMTZMRSB0eXBpY2FsbHkgbmVlZHMgdHdvIGJ5dGVzIHBlciBjaGFyYWN0ZXIsIGJ1dCBldmVuIGlmIHdlIGhhdmUgYW4gZXZlblxuLy8gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBlbmQgb24gYSBsZWFkaW5nL2hpZ2hcbi8vIHN1cnJvZ2F0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0IHR3byBieXRlcyBpbiBvcmRlciB0b1xuLy8gZGVjb2RlIHRoZSBsYXN0IGNoYXJhY3RlciBwcm9wZXJseS5cbmZ1bmN0aW9uIHV0ZjE2VGV4dChidWYsIGkpIHtcbiAgaWYgKChidWYubGVuZ3RoIC0gaSkgJSAyID09PSAwKSB7XG4gICAgdmFyIHIgPSBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpKTtcbiAgICBpZiAocikge1xuICAgICAgdmFyIGMgPSByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKTtcbiAgICAgIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REJGRikge1xuICAgICAgICB0aGlzLmxhc3ROZWVkID0gMjtcbiAgICAgICAgdGhpcy5sYXN0VG90YWwgPSA0O1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiByLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDE7XG4gIHRoaXMubGFzdFRvdGFsID0gMjtcbiAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpLCBidWYubGVuZ3RoIC0gMSk7XG59XG5cbi8vIEZvciBVVEYtMTZMRSB3ZSBkbyBub3QgZXhwbGljaXRseSBhcHBlbmQgc3BlY2lhbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGlmIHdlXG4vLyBlbmQgb24gYSBwYXJ0aWFsIGNoYXJhY3Rlciwgd2Ugc2ltcGx5IGxldCB2OCBoYW5kbGUgdGhhdC5cbmZ1bmN0aW9uIHV0ZjE2RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgdmFyIGVuZCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgICByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ3V0ZjE2bGUnLCAwLCBlbmQpO1xuICB9XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRUZXh0KGJ1ZiwgaSkge1xuICB2YXIgbiA9IChidWYubGVuZ3RoIC0gaSkgJSAzO1xuICBpZiAobiA9PT0gMCkgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSk7XG4gIHRoaXMubGFzdE5lZWQgPSAzIC0gbjtcbiAgdGhpcy5sYXN0VG90YWwgPSAzO1xuICBpZiAobiA9PT0gMSkge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGksIGJ1Zi5sZW5ndGggLSBuKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ2Jhc2U2NCcsIDAsIDMgLSB0aGlzLmxhc3ROZWVkKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFBhc3MgYnl0ZXMgb24gdGhyb3VnaCBmb3Igc2luZ2xlLWJ5dGUgZW5jb2RpbmdzIChlLmcuIGFzY2lpLCBsYXRpbjEsIGhleClcbmZ1bmN0aW9uIHNpbXBsZVdyaXRlKGJ1Zikge1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFbmQoYnVmKSB7XG4gIHJldHVybiBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xufSIsImZ1bmN0aW9uIEFnZW50KCkge1xuICB0aGlzLl9kZWZhdWx0cyA9IFtdO1xufVxuXG5bXCJ1c2VcIiwgXCJvblwiLCBcIm9uY2VcIiwgXCJzZXRcIiwgXCJxdWVyeVwiLCBcInR5cGVcIiwgXCJhY2NlcHRcIiwgXCJhdXRoXCIsIFwid2l0aENyZWRlbnRpYWxzXCIsIFwic29ydFF1ZXJ5XCIsIFwicmV0cnlcIiwgXCJva1wiLCBcInJlZGlyZWN0c1wiLFxuIFwidGltZW91dFwiLCBcImJ1ZmZlclwiLCBcInNlcmlhbGl6ZVwiLCBcInBhcnNlXCIsIFwiY2FcIiwgXCJrZXlcIiwgXCJwZnhcIiwgXCJjZXJ0XCJdLmZvckVhY2goZnVuY3Rpb24oZm4pIHtcbiAgLyoqIERlZmF1bHQgc2V0dGluZyBmb3IgYWxsIHJlcXVlc3RzIGZyb20gdGhpcyBhZ2VudCAqL1xuICBBZ2VudC5wcm90b3R5cGVbZm5dID0gZnVuY3Rpb24oLyp2YXJhcmdzKi8pIHtcbiAgICB0aGlzLl9kZWZhdWx0cy5wdXNoKHtmbjpmbiwgYXJndW1lbnRzOmFyZ3VtZW50c30pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59KTtcblxuQWdlbnQucHJvdG90eXBlLl9zZXREZWZhdWx0cyA9IGZ1bmN0aW9uKHJlcSkge1xuICAgIHRoaXMuX2RlZmF1bHRzLmZvckVhY2goZnVuY3Rpb24oZGVmKSB7XG4gICAgICByZXFbZGVmLmZuXS5hcHBseShyZXEsIGRlZi5hcmd1bWVudHMpO1xuICAgIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBBZ2VudDtcbiIsIi8qKlxuICogUm9vdCByZWZlcmVuY2UgZm9yIGlmcmFtZXMuXG4gKi9cblxudmFyIHJvb3Q7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHsgLy8gQnJvd3NlciB3aW5kb3dcbiAgcm9vdCA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7IC8vIFdlYiBXb3JrZXJcbiAgcm9vdCA9IHNlbGY7XG59IGVsc2UgeyAvLyBPdGhlciBlbnZpcm9ubWVudHNcbiAgY29uc29sZS53YXJuKFwiVXNpbmcgYnJvd3Nlci1vbmx5IHZlcnNpb24gb2Ygc3VwZXJhZ2VudCBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudFwiKTtcbiAgcm9vdCA9IHRoaXM7XG59XG5cbnZhciBFbWl0dGVyID0gcmVxdWlyZSgnY29tcG9uZW50LWVtaXR0ZXInKTtcbnZhciBSZXF1ZXN0QmFzZSA9IHJlcXVpcmUoJy4vcmVxdWVzdC1iYXNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzLW9iamVjdCcpO1xudmFyIFJlc3BvbnNlQmFzZSA9IHJlcXVpcmUoJy4vcmVzcG9uc2UtYmFzZScpO1xudmFyIEFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudC1iYXNlJyk7XG5cbi8qKlxuICogTm9vcC5cbiAqL1xuXG5mdW5jdGlvbiBub29wKCl7fTtcblxuLyoqXG4gKiBFeHBvc2UgYHJlcXVlc3RgLlxuICovXG5cbnZhciByZXF1ZXN0ID0gZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obWV0aG9kLCB1cmwpIHtcbiAgLy8gY2FsbGJhY2tcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHVybCkge1xuICAgIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KCdHRVQnLCBtZXRob2QpLmVuZCh1cmwpO1xuICB9XG5cbiAgLy8gdXJsIGZpcnN0XG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IGV4cG9ydHMuUmVxdWVzdCgnR0VUJywgbWV0aG9kKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KG1ldGhvZCwgdXJsKTtcbn1cblxuZXhwb3J0cy5SZXF1ZXN0ID0gUmVxdWVzdDtcblxuLyoqXG4gKiBEZXRlcm1pbmUgWEhSLlxuICovXG5cbnJlcXVlc3QuZ2V0WEhSID0gZnVuY3Rpb24gKCkge1xuICBpZiAocm9vdC5YTUxIdHRwUmVxdWVzdFxuICAgICAgJiYgKCFyb290LmxvY2F0aW9uIHx8ICdmaWxlOicgIT0gcm9vdC5sb2NhdGlvbi5wcm90b2NvbFxuICAgICAgICAgIHx8ICFyb290LkFjdGl2ZVhPYmplY3QpKSB7XG4gICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdDtcbiAgfSBlbHNlIHtcbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7IH0gY2F0Y2goZSkge31cbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQLjYuMCcpOyB9IGNhdGNoKGUpIHt9XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUC4zLjAnKTsgfSBjYXRjaChlKSB7fVxuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKTsgfSBjYXRjaChlKSB7fVxuICB9XG4gIHRocm93IEVycm9yKFwiQnJvd3Nlci1vbmx5IHZlcnNpb24gb2Ygc3VwZXJhZ2VudCBjb3VsZCBub3QgZmluZCBYSFJcIik7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgYWRkZWQgdG8gc3VwcG9ydCBJRS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxudmFyIHRyaW0gPSAnJy50cmltXG4gID8gZnVuY3Rpb24ocykgeyByZXR1cm4gcy50cmltKCk7IH1cbiAgOiBmdW5jdGlvbihzKSB7IHJldHVybiBzLnJlcGxhY2UoLyheXFxzKnxcXHMqJCkvZywgJycpOyB9O1xuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gYG9iamAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VyaWFsaXplKG9iaikge1xuICBpZiAoIWlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gIHZhciBwYWlycyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgcHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIocGFpcnMsIGtleSwgb2JqW2tleV0pO1xuICB9XG4gIHJldHVybiBwYWlycy5qb2luKCcmJyk7XG59XG5cbi8qKlxuICogSGVscHMgJ3NlcmlhbGl6ZScgd2l0aCBzZXJpYWxpemluZyBhcnJheXMuXG4gKiBNdXRhdGVzIHRoZSBwYWlycyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYWlyc1xuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHtNaXhlZH0gdmFsXG4gKi9cblxuZnVuY3Rpb24gcHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIocGFpcnMsIGtleSwgdmFsKSB7XG4gIGlmICh2YWwgIT0gbnVsbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHZhbC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgcHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIocGFpcnMsIGtleSwgdik7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGZvcih2YXIgc3Via2V5IGluIHZhbCkge1xuICAgICAgICBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5ICsgJ1snICsgc3Via2V5ICsgJ10nLCB2YWxbc3Via2V5XSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaXJzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICAgICAgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgIHBhaXJzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSkpO1xuICB9XG59XG5cbi8qKlxuICogRXhwb3NlIHNlcmlhbGl6YXRpb24gbWV0aG9kLlxuICovXG5cbnJlcXVlc3Quc2VyaWFsaXplT2JqZWN0ID0gc2VyaWFsaXplO1xuXG4vKipcbiAgKiBQYXJzZSB0aGUgZ2l2ZW4geC13d3ctZm9ybS11cmxlbmNvZGVkIGBzdHJgLlxuICAqXG4gICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICAqIEByZXR1cm4ge09iamVjdH1cbiAgKiBAYXBpIHByaXZhdGVcbiAgKi9cblxuZnVuY3Rpb24gcGFyc2VTdHJpbmcoc3RyKSB7XG4gIHZhciBvYmogPSB7fTtcbiAgdmFyIHBhaXJzID0gc3RyLnNwbGl0KCcmJyk7XG4gIHZhciBwYWlyO1xuICB2YXIgcG9zO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIHBhaXIgPSBwYWlyc1tpXTtcbiAgICBwb3MgPSBwYWlyLmluZGV4T2YoJz0nKTtcbiAgICBpZiAocG9zID09IC0xKSB7XG4gICAgICBvYmpbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIpXSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmpbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2xpY2UoMCwgcG9zKSldID1cbiAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2xpY2UocG9zICsgMSkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogRXhwb3NlIHBhcnNlci5cbiAqL1xuXG5yZXF1ZXN0LnBhcnNlU3RyaW5nID0gcGFyc2VTdHJpbmc7XG5cbi8qKlxuICogRGVmYXVsdCBNSU1FIHR5cGUgbWFwLlxuICpcbiAqICAgICBzdXBlcmFnZW50LnR5cGVzLnhtbCA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICpcbiAqL1xuXG5yZXF1ZXN0LnR5cGVzID0ge1xuICBodG1sOiAndGV4dC9odG1sJyxcbiAganNvbjogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICB4bWw6ICd0ZXh0L3htbCcsXG4gIHVybGVuY29kZWQ6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAnZm9ybSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAnZm9ybS1kYXRhJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbi8qKlxuICogRGVmYXVsdCBzZXJpYWxpemF0aW9uIG1hcC5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24ob2JqKXtcbiAqICAgICAgIHJldHVybiAnZ2VuZXJhdGVkIHhtbCBoZXJlJztcbiAqICAgICB9O1xuICpcbiAqL1xuXG5yZXF1ZXN0LnNlcmlhbGl6ZSA9IHtcbiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6IHNlcmlhbGl6ZSxcbiAgJ2FwcGxpY2F0aW9uL2pzb24nOiBKU09OLnN0cmluZ2lmeVxufTtcblxuLyoqXG4gICogRGVmYXVsdCBwYXJzZXJzLlxuICAqXG4gICogICAgIHN1cGVyYWdlbnQucGFyc2VbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24oc3RyKXtcbiAgKiAgICAgICByZXR1cm4geyBvYmplY3QgcGFyc2VkIGZyb20gc3RyIH07XG4gICogICAgIH07XG4gICpcbiAgKi9cblxucmVxdWVzdC5wYXJzZSA9IHtcbiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6IHBhcnNlU3RyaW5nLFxuICAnYXBwbGljYXRpb24vanNvbic6IEpTT04ucGFyc2Vcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGhlYWRlciBgc3RyYCBpbnRvXG4gKiBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgbWFwcGVkIGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUhlYWRlcihzdHIpIHtcbiAgdmFyIGxpbmVzID0gc3RyLnNwbGl0KC9cXHI/XFxuLyk7XG4gIHZhciBmaWVsZHMgPSB7fTtcbiAgdmFyIGluZGV4O1xuICB2YXIgbGluZTtcbiAgdmFyIGZpZWxkO1xuICB2YXIgdmFsO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGxpbmUgPSBsaW5lc1tpXTtcbiAgICBpbmRleCA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHsgLy8gY291bGQgYmUgZW1wdHkgbGluZSwganVzdCBza2lwIGl0XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZmllbGQgPSBsaW5lLnNsaWNlKDAsIGluZGV4KS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IHRyaW0obGluZS5zbGljZShpbmRleCArIDEpKTtcbiAgICBmaWVsZHNbZmllbGRdID0gdmFsO1xuICB9XG5cbiAgcmV0dXJuIGZpZWxkcztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgbWltZWAgaXMganNvbiBvciBoYXMgK2pzb24gc3RydWN0dXJlZCBzeW50YXggc3VmZml4LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNKU09OKG1pbWUpIHtcbiAgLy8gc2hvdWxkIG1hdGNoIC9qc29uIG9yICtqc29uXG4gIC8vIGJ1dCBub3QgL2pzb24tc2VxXG4gIHJldHVybiAvW1xcLytdanNvbigkfFteLVxcd10pLy50ZXN0KG1pbWUpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlc3BvbnNlYCB3aXRoIHRoZSBnaXZlbiBgeGhyYC5cbiAqXG4gKiAgLSBzZXQgZmxhZ3MgKC5vaywgLmVycm9yLCBldGMpXG4gKiAgLSBwYXJzZSBoZWFkZXJcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgQWxpYXNpbmcgYHN1cGVyYWdlbnRgIGFzIGByZXF1ZXN0YCBpcyBuaWNlOlxuICpcbiAqICAgICAgcmVxdWVzdCA9IHN1cGVyYWdlbnQ7XG4gKlxuICogIFdlIGNhbiB1c2UgdGhlIHByb21pc2UtbGlrZSBBUEksIG9yIHBhc3MgY2FsbGJhY2tzOlxuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy8nKS5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqICAgICAgcmVxdWVzdC5nZXQoJy8nLCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBTZW5kaW5nIGRhdGEgY2FuIGJlIGNoYWluZWQ6XG4gKlxuICogICAgICByZXF1ZXN0XG4gKiAgICAgICAgLnBvc3QoJy91c2VyJylcbiAqICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAuZW5kKGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIE9yIHBhc3NlZCB0byBgLnNlbmQoKWA6XG4gKlxuICogICAgICByZXF1ZXN0XG4gKiAgICAgICAgLnBvc3QoJy91c2VyJylcbiAqICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSwgZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgT3IgcGFzc2VkIHRvIGAucG9zdCgpYDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInLCB7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAuZW5kKGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogT3IgZnVydGhlciByZWR1Y2VkIHRvIGEgc2luZ2xlIGNhbGwgZm9yIHNpbXBsZSBjYXNlczpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInLCB7IG5hbWU6ICd0aicgfSwgZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiBAcGFyYW0ge1hNTEhUVFBSZXF1ZXN0fSB4aHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBSZXNwb25zZShyZXEpIHtcbiAgdGhpcy5yZXEgPSByZXE7XG4gIHRoaXMueGhyID0gdGhpcy5yZXEueGhyO1xuICAvLyByZXNwb25zZVRleHQgaXMgYWNjZXNzaWJsZSBvbmx5IGlmIHJlc3BvbnNlVHlwZSBpcyAnJyBvciAndGV4dCcgYW5kIG9uIG9sZGVyIGJyb3dzZXJzXG4gIHRoaXMudGV4dCA9ICgodGhpcy5yZXEubWV0aG9kICE9J0hFQUQnICYmICh0aGlzLnhoci5yZXNwb25zZVR5cGUgPT09ICcnIHx8IHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnKSkgfHwgdHlwZW9mIHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgID8gdGhpcy54aHIucmVzcG9uc2VUZXh0XG4gICAgIDogbnVsbDtcbiAgdGhpcy5zdGF0dXNUZXh0ID0gdGhpcy5yZXEueGhyLnN0YXR1c1RleHQ7XG4gIHZhciBzdGF0dXMgPSB0aGlzLnhoci5zdGF0dXM7XG4gIC8vIGhhbmRsZSBJRTkgYnVnOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwMDQ2OTcyL21zaWUtcmV0dXJucy1zdGF0dXMtY29kZS1vZi0xMjIzLWZvci1hamF4LXJlcXVlc3RcbiAgaWYgKHN0YXR1cyA9PT0gMTIyMykge1xuICAgIHN0YXR1cyA9IDIwNDtcbiAgfVxuICB0aGlzLl9zZXRTdGF0dXNQcm9wZXJ0aWVzKHN0YXR1cyk7XG4gIHRoaXMuaGVhZGVyID0gdGhpcy5oZWFkZXJzID0gcGFyc2VIZWFkZXIodGhpcy54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpO1xuICAvLyBnZXRBbGxSZXNwb25zZUhlYWRlcnMgc29tZXRpbWVzIGZhbHNlbHkgcmV0dXJucyBcIlwiIGZvciBDT1JTIHJlcXVlc3RzLCBidXRcbiAgLy8gZ2V0UmVzcG9uc2VIZWFkZXIgc3RpbGwgd29ya3MuIHNvIHdlIGdldCBjb250ZW50LXR5cGUgZXZlbiBpZiBnZXR0aW5nXG4gIC8vIG90aGVyIGhlYWRlcnMgZmFpbHMuXG4gIHRoaXMuaGVhZGVyWydjb250ZW50LXR5cGUnXSA9IHRoaXMueGhyLmdldFJlc3BvbnNlSGVhZGVyKCdjb250ZW50LXR5cGUnKTtcbiAgdGhpcy5fc2V0SGVhZGVyUHJvcGVydGllcyh0aGlzLmhlYWRlcik7XG5cbiAgaWYgKG51bGwgPT09IHRoaXMudGV4dCAmJiByZXEuX3Jlc3BvbnNlVHlwZSkge1xuICAgIHRoaXMuYm9keSA9IHRoaXMueGhyLnJlc3BvbnNlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYm9keSA9IHRoaXMucmVxLm1ldGhvZCAhPSAnSEVBRCdcbiAgICAgID8gdGhpcy5fcGFyc2VCb2R5KHRoaXMudGV4dCA/IHRoaXMudGV4dCA6IHRoaXMueGhyLnJlc3BvbnNlKVxuICAgICAgOiBudWxsO1xuICB9XG59XG5cblJlc3BvbnNlQmFzZShSZXNwb25zZS5wcm90b3R5cGUpO1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBib2R5IGBzdHJgLlxuICpcbiAqIFVzZWQgZm9yIGF1dG8tcGFyc2luZyBvZiBib2RpZXMuIFBhcnNlcnNcbiAqIGFyZSBkZWZpbmVkIG9uIHRoZSBgc3VwZXJhZ2VudC5wYXJzZWAgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge01peGVkfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVzcG9uc2UucHJvdG90eXBlLl9wYXJzZUJvZHkgPSBmdW5jdGlvbihzdHIpIHtcbiAgdmFyIHBhcnNlID0gcmVxdWVzdC5wYXJzZVt0aGlzLnR5cGVdO1xuICBpZiAodGhpcy5yZXEuX3BhcnNlcikge1xuICAgIHJldHVybiB0aGlzLnJlcS5fcGFyc2VyKHRoaXMsIHN0cik7XG4gIH1cbiAgaWYgKCFwYXJzZSAmJiBpc0pTT04odGhpcy50eXBlKSkge1xuICAgIHBhcnNlID0gcmVxdWVzdC5wYXJzZVsnYXBwbGljYXRpb24vanNvbiddO1xuICB9XG4gIHJldHVybiBwYXJzZSAmJiBzdHIgJiYgKHN0ci5sZW5ndGggfHwgc3RyIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgID8gcGFyc2Uoc3RyKVxuICAgIDogbnVsbDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGFuIGBFcnJvcmAgcmVwcmVzZW50YXRpdmUgb2YgdGhpcyByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJuIHtFcnJvcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVzcG9uc2UucHJvdG90eXBlLnRvRXJyb3IgPSBmdW5jdGlvbigpe1xuICB2YXIgcmVxID0gdGhpcy5yZXE7XG4gIHZhciBtZXRob2QgPSByZXEubWV0aG9kO1xuICB2YXIgdXJsID0gcmVxLnVybDtcblxuICB2YXIgbXNnID0gJ2Nhbm5vdCAnICsgbWV0aG9kICsgJyAnICsgdXJsICsgJyAoJyArIHRoaXMuc3RhdHVzICsgJyknO1xuICB2YXIgZXJyID0gbmV3IEVycm9yKG1zZyk7XG4gIGVyci5zdGF0dXMgPSB0aGlzLnN0YXR1cztcbiAgZXJyLm1ldGhvZCA9IG1ldGhvZDtcbiAgZXJyLnVybCA9IHVybDtcblxuICByZXR1cm4gZXJyO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYFJlc3BvbnNlYC5cbiAqL1xuXG5yZXF1ZXN0LlJlc3BvbnNlID0gUmVzcG9uc2U7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVxdWVzdGAgd2l0aCB0aGUgZ2l2ZW4gYG1ldGhvZGAgYW5kIGB1cmxgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVxdWVzdChtZXRob2QsIHVybCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX3F1ZXJ5ID0gdGhpcy5fcXVlcnkgfHwgW107XG4gIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICB0aGlzLnVybCA9IHVybDtcbiAgdGhpcy5oZWFkZXIgPSB7fTsgLy8gcHJlc2VydmVzIGhlYWRlciBuYW1lIGNhc2VcbiAgdGhpcy5faGVhZGVyID0ge307IC8vIGNvZXJjZXMgaGVhZGVyIG5hbWVzIHRvIGxvd2VyY2FzZVxuICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbigpe1xuICAgIHZhciBlcnIgPSBudWxsO1xuICAgIHZhciByZXMgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IG5ldyBSZXNwb25zZShzZWxmKTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIGVyciA9IG5ldyBFcnJvcignUGFyc2VyIGlzIHVuYWJsZSB0byBwYXJzZSB0aGUgcmVzcG9uc2UnKTtcbiAgICAgIGVyci5wYXJzZSA9IHRydWU7XG4gICAgICBlcnIub3JpZ2luYWwgPSBlO1xuICAgICAgLy8gaXNzdWUgIzY3NTogcmV0dXJuIHRoZSByYXcgcmVzcG9uc2UgaWYgdGhlIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHNcbiAgICAgIGlmIChzZWxmLnhocikge1xuICAgICAgICAvLyBpZTkgZG9lc24ndCBoYXZlICdyZXNwb25zZScgcHJvcGVydHlcbiAgICAgICAgZXJyLnJhd1Jlc3BvbnNlID0gdHlwZW9mIHNlbGYueGhyLnJlc3BvbnNlVHlwZSA9PSAndW5kZWZpbmVkJyA/IHNlbGYueGhyLnJlc3BvbnNlVGV4dCA6IHNlbGYueGhyLnJlc3BvbnNlO1xuICAgICAgICAvLyBpc3N1ZSAjODc2OiByZXR1cm4gdGhlIGh0dHAgc3RhdHVzIGNvZGUgaWYgdGhlIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgZXJyLnN0YXR1cyA9IHNlbGYueGhyLnN0YXR1cyA/IHNlbGYueGhyLnN0YXR1cyA6IG51bGw7XG4gICAgICAgIGVyci5zdGF0dXNDb2RlID0gZXJyLnN0YXR1czsgLy8gYmFja3dhcmRzLWNvbXBhdCBvbmx5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnIucmF3UmVzcG9uc2UgPSBudWxsO1xuICAgICAgICBlcnIuc3RhdHVzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBzZWxmLmVtaXQoJ3Jlc3BvbnNlJywgcmVzKTtcblxuICAgIHZhciBuZXdfZXJyO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXNlbGYuX2lzUmVzcG9uc2VPSyhyZXMpKSB7XG4gICAgICAgIG5ld19lcnIgPSBuZXcgRXJyb3IocmVzLnN0YXR1c1RleHQgfHwgJ1Vuc3VjY2Vzc2Z1bCBIVFRQIHJlc3BvbnNlJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaChjdXN0b21fZXJyKSB7XG4gICAgICBuZXdfZXJyID0gY3VzdG9tX2VycjsgLy8gb2soKSBjYWxsYmFjayBjYW4gdGhyb3dcbiAgICB9XG5cbiAgICAvLyAjMTAwMCBkb24ndCBjYXRjaCBlcnJvcnMgZnJvbSB0aGUgY2FsbGJhY2sgdG8gYXZvaWQgZG91YmxlIGNhbGxpbmcgaXRcbiAgICBpZiAobmV3X2Vycikge1xuICAgICAgbmV3X2Vyci5vcmlnaW5hbCA9IGVycjtcbiAgICAgIG5ld19lcnIucmVzcG9uc2UgPSByZXM7XG4gICAgICBuZXdfZXJyLnN0YXR1cyA9IHJlcy5zdGF0dXM7XG4gICAgICBzZWxmLmNhbGxiYWNrKG5ld19lcnIsIHJlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIE1peGluIGBFbWl0dGVyYCBhbmQgYFJlcXVlc3RCYXNlYC5cbiAqL1xuXG5FbWl0dGVyKFJlcXVlc3QucHJvdG90eXBlKTtcblJlcXVlc3RCYXNlKFJlcXVlc3QucHJvdG90eXBlKTtcblxuLyoqXG4gKiBTZXQgQ29udGVudC1UeXBlIHRvIGB0eXBlYCwgbWFwcGluZyB2YWx1ZXMgZnJvbSBgcmVxdWVzdC50eXBlc2AuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICBzdXBlcmFnZW50LnR5cGVzLnhtbCA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICpcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvJylcbiAqICAgICAgICAudHlwZSgneG1sJylcbiAqICAgICAgICAuc2VuZCh4bWxzdHJpbmcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCdhcHBsaWNhdGlvbi94bWwnKVxuICogICAgICAgIC5zZW5kKHhtbHN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbih0eXBlKXtcbiAgdGhpcy5zZXQoJ0NvbnRlbnQtVHlwZScsIHJlcXVlc3QudHlwZXNbdHlwZV0gfHwgdHlwZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgQWNjZXB0IHRvIGB0eXBlYCwgbWFwcGluZyB2YWx1ZXMgZnJvbSBgcmVxdWVzdC50eXBlc2AuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICBzdXBlcmFnZW50LnR5cGVzLmpzb24gPSAnYXBwbGljYXRpb24vanNvbic7XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnL2FnZW50JylcbiAqICAgICAgICAuYWNjZXB0KCdqc29uJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2FwcGxpY2F0aW9uL2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2NlcHRcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbih0eXBlKXtcbiAgdGhpcy5zZXQoJ0FjY2VwdCcsIHJlcXVlc3QudHlwZXNbdHlwZV0gfHwgdHlwZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgQXV0aG9yaXphdGlvbiBmaWVsZCB2YWx1ZSB3aXRoIGB1c2VyYCBhbmQgYHBhc3NgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1c2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gW3Bhc3NdIG9wdGlvbmFsIGluIGNhc2Ugb2YgdXNpbmcgJ2JlYXJlcicgYXMgdHlwZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgd2l0aCAndHlwZScgcHJvcGVydHkgJ2F1dG8nLCAnYmFzaWMnIG9yICdiZWFyZXInIChkZWZhdWx0ICdiYXNpYycpXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXV0aCA9IGZ1bmN0aW9uKHVzZXIsIHBhc3MsIG9wdGlvbnMpe1xuICBpZiAoMSA9PT0gYXJndW1lbnRzLmxlbmd0aCkgcGFzcyA9ICcnO1xuICBpZiAodHlwZW9mIHBhc3MgPT09ICdvYmplY3QnICYmIHBhc3MgIT09IG51bGwpIHsgLy8gcGFzcyBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHJlcGxhY2VkIHdpdGggb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBwYXNzO1xuICAgIHBhc3MgPSAnJztcbiAgfVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgdHlwZTogJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGJ0b2EgPyAnYmFzaWMnIDogJ2F1dG8nLFxuICAgIH07XG4gIH1cblxuICB2YXIgZW5jb2RlciA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgYnRvYSkge1xuICAgICAgcmV0dXJuIGJ0b2Eoc3RyaW5nKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXNlIGJhc2ljIGF1dGgsIGJ0b2EgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgfTtcblxuICByZXR1cm4gdGhpcy5fYXV0aCh1c2VyLCBwYXNzLCBvcHRpb25zLCBlbmNvZGVyKTtcbn07XG5cbi8qKlxuICogQWRkIHF1ZXJ5LXN0cmluZyBgdmFsYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgIHJlcXVlc3QuZ2V0KCcvc2hvZXMnKVxuICogICAgIC5xdWVyeSgnc2l6ZT0xMCcpXG4gKiAgICAgLnF1ZXJ5KHsgY29sb3I6ICdibHVlJyB9KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbih2YWwpe1xuICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHZhbCkgdmFsID0gc2VyaWFsaXplKHZhbCk7XG4gIGlmICh2YWwpIHRoaXMuX3F1ZXJ5LnB1c2godmFsKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFF1ZXVlIHRoZSBnaXZlbiBgZmlsZWAgYXMgYW4gYXR0YWNobWVudCB0byB0aGUgc3BlY2lmaWVkIGBmaWVsZGAsXG4gKiB3aXRoIG9wdGlvbmFsIGBvcHRpb25zYCAob3IgZmlsZW5hbWUpLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAqICAgLmF0dGFjaCgnY29udGVudCcsIG5ldyBCbG9iKFsnPGEgaWQ9XCJhXCI+PGIgaWQ9XCJiXCI+aGV5ITwvYj48L2E+J10sIHsgdHlwZTogXCJ0ZXh0L2h0bWxcIn0pKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHBhcmFtIHtCbG9ifEZpbGV9IGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF0dGFjaCA9IGZ1bmN0aW9uKGZpZWxkLCBmaWxlLCBvcHRpb25zKXtcbiAgaWYgKGZpbGUpIHtcbiAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgdGhyb3cgRXJyb3IoXCJzdXBlcmFnZW50IGNhbid0IG1peCAuc2VuZCgpIGFuZCAuYXR0YWNoKClcIik7XG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0Rm9ybURhdGEoKS5hcHBlbmQoZmllbGQsIGZpbGUsIG9wdGlvbnMgfHwgZmlsZS5uYW1lKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLl9nZXRGb3JtRGF0YSA9IGZ1bmN0aW9uKCl7XG4gIGlmICghdGhpcy5fZm9ybURhdGEpIHtcbiAgICB0aGlzLl9mb3JtRGF0YSA9IG5ldyByb290LkZvcm1EYXRhKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2Zvcm1EYXRhO1xufTtcblxuLyoqXG4gKiBJbnZva2UgdGhlIGNhbGxiYWNrIHdpdGggYGVycmAgYW5kIGByZXNgXG4gKiBhbmQgaGFuZGxlIGFyaXR5IGNoZWNrLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5jYWxsYmFjayA9IGZ1bmN0aW9uKGVyciwgcmVzKXtcbiAgaWYgKHRoaXMuX3Nob3VsZFJldHJ5KGVyciwgcmVzKSkge1xuICAgIHJldHVybiB0aGlzLl9yZXRyeSgpO1xuICB9XG5cbiAgdmFyIGZuID0gdGhpcy5fY2FsbGJhY2s7XG4gIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG5cbiAgaWYgKGVycikge1xuICAgIGlmICh0aGlzLl9tYXhSZXRyaWVzKSBlcnIucmV0cmllcyA9IHRoaXMuX3JldHJpZXMgLSAxO1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICB9XG5cbiAgZm4oZXJyLCByZXMpO1xufTtcblxuLyoqXG4gKiBJbnZva2UgY2FsbGJhY2sgd2l0aCB4LWRvbWFpbiBlcnJvci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5jcm9zc0RvbWFpbkVycm9yID0gZnVuY3Rpb24oKXtcbiAgdmFyIGVyciA9IG5ldyBFcnJvcignUmVxdWVzdCBoYXMgYmVlbiB0ZXJtaW5hdGVkXFxuUG9zc2libGUgY2F1c2VzOiB0aGUgbmV0d29yayBpcyBvZmZsaW5lLCBPcmlnaW4gaXMgbm90IGFsbG93ZWQgYnkgQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luLCB0aGUgcGFnZSBpcyBiZWluZyB1bmxvYWRlZCwgZXRjLicpO1xuICBlcnIuY3Jvc3NEb21haW4gPSB0cnVlO1xuXG4gIGVyci5zdGF0dXMgPSB0aGlzLnN0YXR1cztcbiAgZXJyLm1ldGhvZCA9IHRoaXMubWV0aG9kO1xuICBlcnIudXJsID0gdGhpcy51cmw7XG5cbiAgdGhpcy5jYWxsYmFjayhlcnIpO1xufTtcblxuLy8gVGhpcyBvbmx5IHdhcm5zLCBiZWNhdXNlIHRoZSByZXF1ZXN0IGlzIHN0aWxsIGxpa2VseSB0byB3b3JrXG5SZXF1ZXN0LnByb3RvdHlwZS5idWZmZXIgPSBSZXF1ZXN0LnByb3RvdHlwZS5jYSA9IFJlcXVlc3QucHJvdG90eXBlLmFnZW50ID0gZnVuY3Rpb24oKXtcbiAgY29uc29sZS53YXJuKFwiVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgdmVyc2lvbiBvZiBzdXBlcmFnZW50XCIpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIFRoaXMgdGhyb3dzLCBiZWNhdXNlIGl0IGNhbid0IHNlbmQvcmVjZWl2ZSBkYXRhIGFzIGV4cGVjdGVkXG5SZXF1ZXN0LnByb3RvdHlwZS5waXBlID0gUmVxdWVzdC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbigpe1xuICB0aHJvdyBFcnJvcihcIlN0cmVhbWluZyBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgdmVyc2lvbiBvZiBzdXBlcmFnZW50XCIpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhIGhvc3Qgb2JqZWN0LFxuICogd2UgZG9uJ3Qgd2FudCB0byBzZXJpYWxpemUgdGhlc2UgOilcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblJlcXVlc3QucHJvdG90eXBlLl9pc0hvc3QgPSBmdW5jdGlvbiBfaXNIb3N0KG9iaikge1xuICAvLyBOYXRpdmUgb2JqZWN0cyBzdHJpbmdpZnkgdG8gW29iamVjdCBGaWxlXSwgW29iamVjdCBCbG9iXSwgW29iamVjdCBGb3JtRGF0YV0sIGV0Yy5cbiAgcmV0dXJuIG9iaiAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG9iaiAmJiAhQXJyYXkuaXNBcnJheShvYmopICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopICE9PSAnW29iamVjdCBPYmplY3RdJztcbn1cblxuLyoqXG4gKiBJbml0aWF0ZSByZXF1ZXN0LCBpbnZva2luZyBjYWxsYmFjayBgZm4ocmVzKWBcbiAqIHdpdGggYW4gaW5zdGFuY2VvZiBgUmVzcG9uc2VgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oZm4pe1xuICBpZiAodGhpcy5fZW5kQ2FsbGVkKSB7XG4gICAgY29uc29sZS53YXJuKFwiV2FybmluZzogLmVuZCgpIHdhcyBjYWxsZWQgdHdpY2UuIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBzdXBlcmFnZW50XCIpO1xuICB9XG4gIHRoaXMuX2VuZENhbGxlZCA9IHRydWU7XG5cbiAgLy8gc3RvcmUgY2FsbGJhY2tcbiAgdGhpcy5fY2FsbGJhY2sgPSBmbiB8fCBub29wO1xuXG4gIC8vIHF1ZXJ5c3RyaW5nXG4gIHRoaXMuX2ZpbmFsaXplUXVlcnlTdHJpbmcoKTtcblxuICByZXR1cm4gdGhpcy5fZW5kKCk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZW5kID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHhociA9ICh0aGlzLnhociA9IHJlcXVlc3QuZ2V0WEhSKCkpO1xuICB2YXIgZGF0YSA9IHRoaXMuX2Zvcm1EYXRhIHx8IHRoaXMuX2RhdGE7XG5cbiAgdGhpcy5fc2V0VGltZW91dHMoKTtcblxuICAvLyBzdGF0ZSBjaGFuZ2VcbiAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHJlYWR5U3RhdGUgPSB4aHIucmVhZHlTdGF0ZTtcbiAgICBpZiAocmVhZHlTdGF0ZSA+PSAyICYmIHNlbGYuX3Jlc3BvbnNlVGltZW91dFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQoc2VsZi5fcmVzcG9uc2VUaW1lb3V0VGltZXIpO1xuICAgIH1cbiAgICBpZiAoNCAhPSByZWFkeVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW4gSUU5LCByZWFkcyB0byBhbnkgcHJvcGVydHkgKGUuZy4gc3RhdHVzKSBvZmYgb2YgYW4gYWJvcnRlZCBYSFIgd2lsbFxuICAgIC8vIHJlc3VsdCBpbiB0aGUgZXJyb3IgXCJDb3VsZCBub3QgY29tcGxldGUgdGhlIG9wZXJhdGlvbiBkdWUgdG8gZXJyb3IgYzAwYzAyM2ZcIlxuICAgIHZhciBzdGF0dXM7XG4gICAgdHJ5IHsgc3RhdHVzID0geGhyLnN0YXR1cyB9IGNhdGNoKGUpIHsgc3RhdHVzID0gMDsgfVxuXG4gICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgIGlmIChzZWxmLnRpbWVkb3V0IHx8IHNlbGYuX2Fib3J0ZWQpIHJldHVybjtcbiAgICAgIHJldHVybiBzZWxmLmNyb3NzRG9tYWluRXJyb3IoKTtcbiAgICB9XG4gICAgc2VsZi5lbWl0KCdlbmQnKTtcbiAgfTtcblxuICAvLyBwcm9ncmVzc1xuICB2YXIgaGFuZGxlUHJvZ3Jlc3MgPSBmdW5jdGlvbihkaXJlY3Rpb24sIGUpIHtcbiAgICBpZiAoZS50b3RhbCA+IDApIHtcbiAgICAgIGUucGVyY2VudCA9IGUubG9hZGVkIC8gZS50b3RhbCAqIDEwMDtcbiAgICB9XG4gICAgZS5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgc2VsZi5lbWl0KCdwcm9ncmVzcycsIGUpO1xuICB9O1xuICBpZiAodGhpcy5oYXNMaXN0ZW5lcnMoJ3Byb2dyZXNzJykpIHtcbiAgICB0cnkge1xuICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSBoYW5kbGVQcm9ncmVzcy5iaW5kKG51bGwsICdkb3dubG9hZCcpO1xuICAgICAgaWYgKHhoci51cGxvYWQpIHtcbiAgICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gaGFuZGxlUHJvZ3Jlc3MuYmluZChudWxsLCAndXBsb2FkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAvLyBBY2Nlc3NpbmcgeGhyLnVwbG9hZCBmYWlscyBpbiBJRSBmcm9tIGEgd2ViIHdvcmtlciwgc28ganVzdCBwcmV0ZW5kIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICAvLyBSZXBvcnRlZCBoZXJlOlxuICAgICAgLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy84MzcyNDUveG1saHR0cHJlcXVlc3QtdXBsb2FkLXRocm93cy1pbnZhbGlkLWFyZ3VtZW50LXdoZW4tdXNlZC1mcm9tLXdlYi13b3JrZXItY29udGV4dFxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYXRlIHJlcXVlc3RcbiAgdHJ5IHtcbiAgICBpZiAodGhpcy51c2VybmFtZSAmJiB0aGlzLnBhc3N3b3JkKSB7XG4gICAgICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRydWUsIHRoaXMudXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRydWUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gc2VlICMxMTQ5XG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2soZXJyKTtcbiAgfVxuXG4gIC8vIENPUlNcbiAgaWYgKHRoaXMuX3dpdGhDcmVkZW50aWFscykgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG5cbiAgLy8gYm9keVxuICBpZiAoIXRoaXMuX2Zvcm1EYXRhICYmICdHRVQnICE9IHRoaXMubWV0aG9kICYmICdIRUFEJyAhPSB0aGlzLm1ldGhvZCAmJiAnc3RyaW5nJyAhPSB0eXBlb2YgZGF0YSAmJiAhdGhpcy5faXNIb3N0KGRhdGEpKSB7XG4gICAgLy8gc2VyaWFsaXplIHN0dWZmXG4gICAgdmFyIGNvbnRlbnRUeXBlID0gdGhpcy5faGVhZGVyWydjb250ZW50LXR5cGUnXTtcbiAgICB2YXIgc2VyaWFsaXplID0gdGhpcy5fc2VyaWFsaXplciB8fCByZXF1ZXN0LnNlcmlhbGl6ZVtjb250ZW50VHlwZSA/IGNvbnRlbnRUeXBlLnNwbGl0KCc7JylbMF0gOiAnJ107XG4gICAgaWYgKCFzZXJpYWxpemUgJiYgaXNKU09OKGNvbnRlbnRUeXBlKSkge1xuICAgICAgc2VyaWFsaXplID0gcmVxdWVzdC5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgICB9XG4gICAgaWYgKHNlcmlhbGl6ZSkgZGF0YSA9IHNlcmlhbGl6ZShkYXRhKTtcbiAgfVxuXG4gIC8vIHNldCBoZWFkZXIgZmllbGRzXG4gIGZvciAodmFyIGZpZWxkIGluIHRoaXMuaGVhZGVyKSB7XG4gICAgaWYgKG51bGwgPT0gdGhpcy5oZWFkZXJbZmllbGRdKSBjb250aW51ZTtcblxuICAgIGlmICh0aGlzLmhlYWRlci5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpXG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihmaWVsZCwgdGhpcy5oZWFkZXJbZmllbGRdKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9yZXNwb25zZVR5cGUpIHtcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gdGhpcy5fcmVzcG9uc2VUeXBlO1xuICB9XG5cbiAgLy8gc2VuZCBzdHVmZlxuICB0aGlzLmVtaXQoJ3JlcXVlc3QnLCB0aGlzKTtcblxuICAvLyBJRTExIHhoci5zZW5kKHVuZGVmaW5lZCkgc2VuZHMgJ3VuZGVmaW5lZCcgc3RyaW5nIGFzIFBPU1QgcGF5bG9hZCAoaW5zdGVhZCBvZiBub3RoaW5nKVxuICAvLyBXZSBuZWVkIG51bGwgaGVyZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICB4aHIuc2VuZCh0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcgPyBkYXRhIDogbnVsbCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxucmVxdWVzdC5hZ2VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IEFnZW50KCk7XG59O1xuXG5bXCJHRVRcIiwgXCJQT1NUXCIsIFwiT1BUSU9OU1wiLCBcIlBBVENIXCIsIFwiUFVUXCIsIFwiREVMRVRFXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gIEFnZW50LnByb3RvdHlwZVttZXRob2QudG9Mb3dlckNhc2UoKV0gPSBmdW5jdGlvbih1cmwsIGZuKSB7XG4gICAgdmFyIHJlcSA9IG5ldyByZXF1ZXN0LlJlcXVlc3QobWV0aG9kLCB1cmwpO1xuICAgIHRoaXMuX3NldERlZmF1bHRzKHJlcSk7XG4gICAgaWYgKGZuKSB7XG4gICAgICByZXEuZW5kKGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcTtcbiAgfTtcbn0pO1xuXG5BZ2VudC5wcm90b3R5cGUuZGVsID0gQWdlbnQucHJvdG90eXBlWydkZWxldGUnXTtcblxuLyoqXG4gKiBHRVQgYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gW2RhdGFdIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LmdldCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4pIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5xdWVyeShkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogSEVBRCBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBbZGF0YV0gb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QuaGVhZCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4pIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0hFQUQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEucXVlcnkoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIE9QVElPTlMgcXVlcnkgdG8gYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gW2RhdGFdIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0Lm9wdGlvbnMgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdPUFRJT05TJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIERFTEVURSBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR9IFtkYXRhXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVsKHVybCwgZGF0YSwgZm4pIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0RFTEVURScsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufVxuXG5yZXF1ZXN0WydkZWwnXSA9IGRlbDtcbnJlcXVlc3RbJ2RlbGV0ZSddID0gZGVsO1xuXG4vKipcbiAqIFBBVENIIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gW2RhdGFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnBhdGNoID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnUEFUQ0gnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogUE9TVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR9IFtkYXRhXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wb3N0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnUE9TVCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBQVVQgYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBbZGF0YV0gb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucHV0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnUFVUJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBudWxsICE9PSBvYmogJiYgJ29iamVjdCcgPT09IHR5cGVvZiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIG9mIG1peGVkLWluIGZ1bmN0aW9ucyBzaGFyZWQgYmV0d2VlbiBub2RlIGFuZCBjbGllbnQgY29kZVxuICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzLW9iamVjdCcpO1xuXG4vKipcbiAqIEV4cG9zZSBgUmVxdWVzdEJhc2VgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gUmVxdWVzdEJhc2U7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVxdWVzdEJhc2VgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVxdWVzdEJhc2Uob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufVxuXG4vKipcbiAqIE1peGluIHRoZSBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBtaXhpbihvYmopIHtcbiAgZm9yICh2YXIga2V5IGluIFJlcXVlc3RCYXNlLnByb3RvdHlwZSkge1xuICAgIG9ialtrZXldID0gUmVxdWVzdEJhc2UucHJvdG90eXBlW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBDbGVhciBwcmV2aW91cyB0aW1lb3V0LlxuICpcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gX2NsZWFyVGltZW91dCgpe1xuICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICBjbGVhclRpbWVvdXQodGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXIpO1xuICBkZWxldGUgdGhpcy5fdGltZXI7XG4gIGRlbGV0ZSB0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIE92ZXJyaWRlIGRlZmF1bHQgcmVzcG9uc2UgYm9keSBwYXJzZXJcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRvIGNvbnZlcnQgaW5jb21pbmcgZGF0YSBpbnRvIHJlcXVlc3QuYm9keVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKGZuKXtcbiAgdGhpcy5fcGFyc2VyID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgZm9ybWF0IG9mIGJpbmFyeSByZXNwb25zZSBib2R5LlxuICogSW4gYnJvd3NlciB2YWxpZCBmb3JtYXRzIGFyZSAnYmxvYicgYW5kICdhcnJheWJ1ZmZlcicsXG4gKiB3aGljaCByZXR1cm4gQmxvYiBhbmQgQXJyYXlCdWZmZXIsIHJlc3BlY3RpdmVseS5cbiAqXG4gKiBJbiBOb2RlIGFsbCB2YWx1ZXMgcmVzdWx0IGluIEJ1ZmZlci5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHJlcS5nZXQoJy8nKVxuICogICAgICAgIC5yZXNwb25zZVR5cGUoJ2Jsb2InKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUucmVzcG9uc2VUeXBlID0gZnVuY3Rpb24odmFsKXtcbiAgdGhpcy5fcmVzcG9uc2VUeXBlID0gdmFsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogT3ZlcnJpZGUgZGVmYXVsdCByZXF1ZXN0IGJvZHkgc2VyaWFsaXplclxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gY29udmVydCBkYXRhIHNldCB2aWEgLnNlbmQgb3IgLmF0dGFjaCBpbnRvIHBheWxvYWQgdG8gc2VuZFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiBzZXJpYWxpemUoZm4pe1xuICB0aGlzLl9zZXJpYWxpemVyID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGltZW91dHMuXG4gKlxuICogLSByZXNwb25zZSB0aW1lb3V0IGlzIHRpbWUgYmV0d2VlbiBzZW5kaW5nIHJlcXVlc3QgYW5kIHJlY2VpdmluZyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVzcG9uc2UuIEluY2x1ZGVzIEROUyBhbmQgY29ubmVjdGlvbiB0aW1lLlxuICogLSBkZWFkbGluZSBpcyB0aGUgdGltZSBmcm9tIHN0YXJ0IG9mIHRoZSByZXF1ZXN0IHRvIHJlY2VpdmluZyByZXNwb25zZSBib2R5IGluIGZ1bGwuIElmIHRoZSBkZWFkbGluZSBpcyB0b28gc2hvcnQgbGFyZ2UgZmlsZXMgbWF5IG5vdCBsb2FkIGF0IGFsbCBvbiBzbG93IGNvbm5lY3Rpb25zLlxuICpcbiAqIFZhbHVlIG9mIDAgb3IgZmFsc2UgbWVhbnMgbm8gdGltZW91dC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcnxPYmplY3R9IG1zIG9yIHtyZXNwb25zZSwgZGVhZGxpbmV9XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnRpbWVvdXQgPSBmdW5jdGlvbiB0aW1lb3V0KG9wdGlvbnMpe1xuICBpZiAoIW9wdGlvbnMgfHwgJ29iamVjdCcgIT09IHR5cGVvZiBvcHRpb25zKSB7XG4gICAgdGhpcy5fdGltZW91dCA9IG9wdGlvbnM7XG4gICAgdGhpcy5fcmVzcG9uc2VUaW1lb3V0ID0gMDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZvcih2YXIgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICBzd2l0Y2gob3B0aW9uKSB7XG4gICAgICBjYXNlICdkZWFkbGluZSc6XG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSBvcHRpb25zLmRlYWRsaW5lO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Jlc3BvbnNlJzpcbiAgICAgICAgdGhpcy5fcmVzcG9uc2VUaW1lb3V0ID0gb3B0aW9ucy5yZXNwb25zZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLndhcm4oXCJVbmtub3duIHRpbWVvdXQgb3B0aW9uXCIsIG9wdGlvbik7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgbnVtYmVyIG9mIHJldHJ5IGF0dGVtcHRzIG9uIGVycm9yLlxuICpcbiAqIEZhaWxlZCByZXF1ZXN0cyB3aWxsIGJlIHJldHJpZWQgJ2NvdW50JyB0aW1lcyBpZiB0aW1lb3V0IG9yIGVyci5jb2RlID49IDUwMC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUucmV0cnkgPSBmdW5jdGlvbiByZXRyeShjb3VudCwgZm4pe1xuICAvLyBEZWZhdWx0IHRvIDEgaWYgbm8gY291bnQgcGFzc2VkIG9yIHRydWVcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgY291bnQgPT09IHRydWUpIGNvdW50ID0gMTtcbiAgaWYgKGNvdW50IDw9IDApIGNvdW50ID0gMDtcbiAgdGhpcy5fbWF4UmV0cmllcyA9IGNvdW50O1xuICB0aGlzLl9yZXRyaWVzID0gMDtcbiAgdGhpcy5fcmV0cnlDYWxsYmFjayA9IGZuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnZhciBFUlJPUl9DT0RFUyA9IFtcbiAgJ0VDT05OUkVTRVQnLFxuICAnRVRJTUVET1VUJyxcbiAgJ0VBRERSSU5GTycsXG4gICdFU09DS0VUVElNRURPVVQnXG5dO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHJlcXVlc3Qgc2hvdWxkIGJlIHJldHJpZWQuXG4gKiAoQm9ycm93ZWQgZnJvbSBzZWdtZW50aW8vc3VwZXJhZ2VudC1yZXRyeSlcbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IFtyZXNdXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9zaG91bGRSZXRyeSA9IGZ1bmN0aW9uKGVyciwgcmVzKSB7XG4gIGlmICghdGhpcy5fbWF4UmV0cmllcyB8fCB0aGlzLl9yZXRyaWVzKysgPj0gdGhpcy5fbWF4UmV0cmllcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodGhpcy5fcmV0cnlDYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgb3ZlcnJpZGUgPSB0aGlzLl9yZXRyeUNhbGxiYWNrKGVyciwgcmVzKTtcbiAgICAgIGlmIChvdmVycmlkZSA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAob3ZlcnJpZGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyB1bmRlZmluZWQgZmFsbHMgYmFjayB0byBkZWZhdWx0c1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG4gIH1cbiAgaWYgKHJlcyAmJiByZXMuc3RhdHVzICYmIHJlcy5zdGF0dXMgPj0gNTAwICYmIHJlcy5zdGF0dXMgIT0gNTAxKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGVycikge1xuICAgIGlmIChlcnIuY29kZSAmJiB+RVJST1JfQ09ERVMuaW5kZXhPZihlcnIuY29kZSkpIHJldHVybiB0cnVlO1xuICAgIC8vIFN1cGVyYWdlbnQgdGltZW91dFxuICAgIGlmIChlcnIudGltZW91dCAmJiBlcnIuY29kZSA9PSAnRUNPTk5BQk9SVEVEJykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGVyci5jcm9zc0RvbWFpbikgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXRyeSByZXF1ZXN0XG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX3JldHJ5ID0gZnVuY3Rpb24oKSB7XG5cbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcblxuICAvLyBub2RlXG4gIGlmICh0aGlzLnJlcSkge1xuICAgIHRoaXMucmVxID0gbnVsbDtcbiAgICB0aGlzLnJlcSA9IHRoaXMucmVxdWVzdCgpO1xuICB9XG5cbiAgdGhpcy5fYWJvcnRlZCA9IGZhbHNlO1xuICB0aGlzLnRpbWVkb3V0ID0gZmFsc2U7XG5cbiAgcmV0dXJuIHRoaXMuX2VuZCgpO1xufTtcblxuLyoqXG4gKiBQcm9taXNlIHN1cHBvcnRcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVqZWN0XVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIHRoZW4ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gIGlmICghdGhpcy5fZnVsbGZpbGxlZFByb21pc2UpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuX2VuZENhbGxlZCkge1xuICAgICAgY29uc29sZS53YXJuKFwiV2FybmluZzogc3VwZXJhZ2VudCByZXF1ZXN0IHdhcyBzZW50IHR3aWNlLCBiZWNhdXNlIGJvdGggLmVuZCgpIGFuZCAudGhlbigpIHdlcmUgY2FsbGVkLiBOZXZlciBjYWxsIC5lbmQoKSBpZiB5b3UgdXNlIHByb21pc2VzXCIpO1xuICAgIH1cbiAgICB0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKGlubmVyUmVzb2x2ZSwgaW5uZXJSZWplY3QpIHtcbiAgICAgIHNlbGYuZW5kKGZ1bmN0aW9uKGVyciwgcmVzKSB7XG4gICAgICAgIGlmIChlcnIpIGlubmVyUmVqZWN0KGVycik7XG4gICAgICAgIGVsc2UgaW5uZXJSZXNvbHZlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdGhpcy5fZnVsbGZpbGxlZFByb21pc2UudGhlbihyZXNvbHZlLCByZWplY3QpO1xufTtcblxuUmVxdWVzdEJhc2UucHJvdG90eXBlWydjYXRjaCddID0gZnVuY3Rpb24oY2IpIHtcbiAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIGNiKTtcbn07XG5cbi8qKlxuICogQWxsb3cgZm9yIGV4dGVuc2lvblxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiB1c2UoZm4pIHtcbiAgZm4odGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLm9rID0gZnVuY3Rpb24oY2IpIHtcbiAgaWYgKCdmdW5jdGlvbicgIT09IHR5cGVvZiBjYikgdGhyb3cgRXJyb3IoXCJDYWxsYmFjayByZXF1aXJlZFwiKTtcbiAgdGhpcy5fb2tDYWxsYmFjayA9IGNiO1xuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5faXNSZXNwb25zZU9LID0gZnVuY3Rpb24ocmVzKSB7XG4gIGlmICghcmVzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHRoaXMuX29rQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5fb2tDYWxsYmFjayhyZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcy5zdGF0dXMgPj0gMjAwICYmIHJlcy5zdGF0dXMgPCAzMDA7XG59O1xuXG4vKipcbiAqIEdldCByZXF1ZXN0IGhlYWRlciBgZmllbGRgLlxuICogQ2FzZS1pbnNlbnNpdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgcmV0dXJuIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbn07XG5cbi8qKlxuICogR2V0IGNhc2UtaW5zZW5zaXRpdmUgaGVhZGVyIGBmaWVsZGAgdmFsdWUuXG4gKiBUaGlzIGlzIGEgZGVwcmVjYXRlZCBpbnRlcm5hbCBBUEkuIFVzZSBgLmdldChmaWVsZClgIGluc3RlYWQuXG4gKlxuICogKGdldEhlYWRlciBpcyBubyBsb25nZXIgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBzdXBlcmFnZW50IGNvZGUgYmFzZSlcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICogQGRlcHJlY2F0ZWRcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuZ2V0SGVhZGVyID0gUmVxdWVzdEJhc2UucHJvdG90eXBlLmdldDtcblxuLyoqXG4gKiBTZXQgaGVhZGVyIGBmaWVsZGAgdG8gYHZhbGAsIG9yIG11bHRpcGxlIGZpZWxkcyB3aXRoIG9uZSBvYmplY3QuXG4gKiBDYXNlLWluc2Vuc2l0aXZlLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnNldCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKVxuICogICAgICAgIC5zZXQoJ1gtQVBJLUtleScsICdmb29iYXInKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnNldCh7IEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLCAnWC1BUEktS2V5JzogJ2Zvb2JhcicgfSlcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGZpZWxkXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKGZpZWxkLCB2YWwpe1xuICBpZiAoaXNPYmplY3QoZmllbGQpKSB7XG4gICAgZm9yICh2YXIga2V5IGluIGZpZWxkKSB7XG4gICAgICB0aGlzLnNldChrZXksIGZpZWxkW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB0aGlzLl9oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV0gPSB2YWw7XG4gIHRoaXMuaGVhZGVyW2ZpZWxkXSA9IHZhbDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBoZWFkZXIgYGZpZWxkYC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAgIHJlcS5nZXQoJy8nKVxuICogICAgICAgIC51bnNldCgnVXNlci1BZ2VudCcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS51bnNldCA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgZGVsZXRlIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbiAgZGVsZXRlIHRoaXMuaGVhZGVyW2ZpZWxkXTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdyaXRlIHRoZSBmaWVsZCBgbmFtZWAgYW5kIGB2YWxgLCBvciBtdWx0aXBsZSBmaWVsZHMgd2l0aCBvbmUgb2JqZWN0XG4gKiBmb3IgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIgcmVxdWVzdCBib2RpZXMuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuZmllbGQoJ2ZvbycsICdiYXInKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuZmllbGQoeyBmb286ICdiYXInLCBiYXo6ICdxdXgnIH0pXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ3xCbG9ifEZpbGV8QnVmZmVyfGZzLlJlYWRTdHJlYW19IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuZmllbGQgPSBmdW5jdGlvbihuYW1lLCB2YWwpIHtcbiAgLy8gbmFtZSBzaG91bGQgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIG9iamVjdC5cbiAgaWYgKG51bGwgPT09IG5hbWUgfHwgdW5kZWZpbmVkID09PSBuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCcuZmllbGQobmFtZSwgdmFsKSBuYW1lIGNhbiBub3QgYmUgZW1wdHknKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgY29uc29sZS5lcnJvcihcIi5maWVsZCgpIGNhbid0IGJlIHVzZWQgaWYgLnNlbmQoKSBpcyB1c2VkLiBQbGVhc2UgdXNlIG9ubHkgLnNlbmQoKSBvciBvbmx5IC5maWVsZCgpICYgLmF0dGFjaCgpXCIpO1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgZm9yICh2YXIga2V5IGluIG5hbWUpIHtcbiAgICAgIHRoaXMuZmllbGQoa2V5LCBuYW1lW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICBmb3IgKHZhciBpIGluIHZhbCkge1xuICAgICAgdGhpcy5maWVsZChuYW1lLCB2YWxbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHZhbCBzaG91bGQgYmUgZGVmaW5lZCBub3dcbiAgaWYgKG51bGwgPT09IHZhbCB8fCB1bmRlZmluZWQgPT09IHZhbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignLmZpZWxkKG5hbWUsIHZhbCkgdmFsIGNhbiBub3QgYmUgZW1wdHknKTtcbiAgfVxuICBpZiAoJ2Jvb2xlYW4nID09PSB0eXBlb2YgdmFsKSB7XG4gICAgdmFsID0gJycgKyB2YWw7XG4gIH1cbiAgdGhpcy5fZ2V0Rm9ybURhdGEoKS5hcHBlbmQobmFtZSwgdmFsKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFib3J0IHRoZSByZXF1ZXN0LCBhbmQgY2xlYXIgcG90ZW50aWFsIHRpbWVvdXQuXG4gKlxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uKCl7XG4gIGlmICh0aGlzLl9hYm9ydGVkKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdGhpcy5fYWJvcnRlZCA9IHRydWU7XG4gIHRoaXMueGhyICYmIHRoaXMueGhyLmFib3J0KCk7IC8vIGJyb3dzZXJcbiAgdGhpcy5yZXEgJiYgdGhpcy5yZXEuYWJvcnQoKTsgLy8gbm9kZVxuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICB0aGlzLmVtaXQoJ2Fib3J0Jyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9hdXRoID0gZnVuY3Rpb24odXNlciwgcGFzcywgb3B0aW9ucywgYmFzZTY0RW5jb2Rlcikge1xuICBzd2l0Y2ggKG9wdGlvbnMudHlwZSkge1xuICAgIGNhc2UgJ2Jhc2ljJzpcbiAgICAgIHRoaXMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBiYXNlNjRFbmNvZGVyKHVzZXIgKyAnOicgKyBwYXNzKSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2F1dG8nOlxuICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXI7XG4gICAgICB0aGlzLnBhc3N3b3JkID0gcGFzcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYmVhcmVyJzogLy8gdXNhZ2Ugd291bGQgYmUgLmF1dGgoYWNjZXNzVG9rZW4sIHsgdHlwZTogJ2JlYXJlcicgfSlcbiAgICAgIHRoaXMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgdXNlcik7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRW5hYmxlIHRyYW5zbWlzc2lvbiBvZiBjb29raWVzIHdpdGggeC1kb21haW4gcmVxdWVzdHMuXG4gKlxuICogTm90ZSB0aGF0IGZvciB0aGlzIHRvIHdvcmsgdGhlIG9yaWdpbiBtdXN0IG5vdCBiZVxuICogdXNpbmcgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIiB3aXRoIGEgd2lsZGNhcmQsXG4gKiBhbmQgYWxzbyBtdXN0IHNldCBcIkFjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzXCJcbiAqIHRvIFwidHJ1ZVwiLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLndpdGhDcmVkZW50aWFscyA9IGZ1bmN0aW9uKG9uKSB7XG4gIC8vIFRoaXMgaXMgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uYWxpdHkuIE5vZGUgc2lkZSBpcyBuby1vcC5cbiAgaWYgKG9uID09IHVuZGVmaW5lZCkgb24gPSB0cnVlO1xuICB0aGlzLl93aXRoQ3JlZGVudGlhbHMgPSBvbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgbWF4IHJlZGlyZWN0cyB0byBgbmAuIERvZXMgbm90aW5nIGluIGJyb3dzZXIgWEhSIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnJlZGlyZWN0cyA9IGZ1bmN0aW9uKG4pe1xuICB0aGlzLl9tYXhSZWRpcmVjdHMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogTWF4aW11bSBzaXplIG9mIGJ1ZmZlcmVkIHJlc3BvbnNlIGJvZHksIGluIGJ5dGVzLiBDb3VudHMgdW5jb21wcmVzc2VkIHNpemUuXG4gKiBEZWZhdWx0IDIwME1CLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLm1heFJlc3BvbnNlU2l6ZSA9IGZ1bmN0aW9uKG4pe1xuICBpZiAoJ251bWJlcicgIT09IHR5cGVvZiBuKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiSW52YWxpZCBhcmd1bWVudFwiKTtcbiAgfVxuICB0aGlzLl9tYXhSZXNwb25zZVNpemUgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ29udmVydCB0byBhIHBsYWluIGphdmFzY3JpcHQgb2JqZWN0IChub3QgSlNPTiBzdHJpbmcpIG9mIHNjYWxhciBwcm9wZXJ0aWVzLlxuICogTm90ZSBhcyB0aGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byByZXR1cm4gYSB1c2VmdWwgbm9uLXRoaXMgdmFsdWUsXG4gKiBpdCBjYW5ub3QgYmUgY2hhaW5lZC5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGRlc2NyaWJpbmcgbWV0aG9kLCB1cmwsIGFuZCBkYXRhIG9mIHRoaXMgcmVxdWVzdFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiB0aGlzLm1ldGhvZCxcbiAgICB1cmw6IHRoaXMudXJsLFxuICAgIGRhdGE6IHRoaXMuX2RhdGEsXG4gICAgaGVhZGVyczogdGhpcy5faGVhZGVyLFxuICB9O1xufTtcblxuLyoqXG4gKiBTZW5kIGBkYXRhYCBhcyB0aGUgcmVxdWVzdCBib2R5LCBkZWZhdWx0aW5nIHRoZSBgLnR5cGUoKWAgdG8gXCJqc29uXCIgd2hlblxuICogYW4gb2JqZWN0IGlzIGdpdmVuLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgIC8vIG1hbnVhbCBqc29uXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnR5cGUoJ2pzb24nKVxuICogICAgICAgICAuc2VuZCgne1wibmFtZVwiOlwidGpcIn0nKVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGF1dG8ganNvblxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIG1hbnVhbCB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnZm9ybScpXG4gKiAgICAgICAgIC5zZW5kKCduYW1lPXRqJylcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBhdXRvIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdmb3JtJylcbiAqICAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gZGVmYXVsdHMgdG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKCduYW1lPXRvYmknKVxuICogICAgICAgIC5zZW5kKCdzcGVjaWVzPWZlcnJldCcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGRhdGFcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uKGRhdGEpe1xuICB2YXIgaXNPYmogPSBpc09iamVjdChkYXRhKTtcbiAgdmFyIHR5cGUgPSB0aGlzLl9oZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuXG4gIGlmICh0aGlzLl9mb3JtRGF0YSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCIuc2VuZCgpIGNhbid0IGJlIHVzZWQgaWYgLmF0dGFjaCgpIG9yIC5maWVsZCgpIGlzIHVzZWQuIFBsZWFzZSB1c2Ugb25seSAuc2VuZCgpIG9yIG9ubHkgLmZpZWxkKCkgJiAuYXR0YWNoKClcIik7XG4gIH1cblxuICBpZiAoaXNPYmogJiYgIXRoaXMuX2RhdGEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgdGhpcy5fZGF0YSA9IFtdO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzSG9zdChkYXRhKSkge1xuICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgIH1cbiAgfSBlbHNlIGlmIChkYXRhICYmIHRoaXMuX2RhdGEgJiYgdGhpcy5faXNIb3N0KHRoaXMuX2RhdGEpKSB7XG4gICAgdGhyb3cgRXJyb3IoXCJDYW4ndCBtZXJnZSB0aGVzZSBzZW5kIGNhbGxzXCIpO1xuICB9XG5cbiAgLy8gbWVyZ2VcbiAgaWYgKGlzT2JqICYmIGlzT2JqZWN0KHRoaXMuX2RhdGEpKSB7XG4gICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgIHRoaXMuX2RhdGFba2V5XSA9IGRhdGFba2V5XTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGRhdGEpIHtcbiAgICAvLyBkZWZhdWx0IHRvIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICAgIGlmICghdHlwZSkgdGhpcy50eXBlKCdmb3JtJyk7XG4gICAgdHlwZSA9IHRoaXMuX2hlYWRlclsnY29udGVudC10eXBlJ107XG4gICAgaWYgKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnID09IHR5cGUpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9kYXRhXG4gICAgICAgID8gdGhpcy5fZGF0YSArICcmJyArIGRhdGFcbiAgICAgICAgOiBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhID0gKHRoaXMuX2RhdGEgfHwgJycpICsgZGF0YTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gIH1cblxuICBpZiAoIWlzT2JqIHx8IHRoaXMuX2lzSG9zdChkYXRhKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZGVmYXVsdCB0byBqc29uXG4gIGlmICghdHlwZSkgdGhpcy50eXBlKCdqc29uJyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTb3J0IGBxdWVyeXN0cmluZ2AgYnkgdGhlIHNvcnQgZnVuY3Rpb25cbiAqXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICAgLy8gZGVmYXVsdCBvcmRlclxuICogICAgICAgcmVxdWVzdC5nZXQoJy91c2VyJylcbiAqICAgICAgICAgLnF1ZXJ5KCduYW1lPU5pY2snKVxuICogICAgICAgICAucXVlcnkoJ3NlYXJjaD1NYW5ueScpXG4gKiAgICAgICAgIC5zb3J0UXVlcnkoKVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGN1c3RvbWl6ZWQgc29ydCBmdW5jdGlvblxuICogICAgICAgcmVxdWVzdC5nZXQoJy91c2VyJylcbiAqICAgICAgICAgLnF1ZXJ5KCduYW1lPU5pY2snKVxuICogICAgICAgICAucXVlcnkoJ3NlYXJjaD1NYW5ueScpXG4gKiAgICAgICAgIC5zb3J0UXVlcnkoZnVuY3Rpb24oYSwgYil7XG4gKiAgICAgICAgICAgcmV0dXJuIGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gKiAgICAgICAgIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNvcnRcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuc29ydFF1ZXJ5ID0gZnVuY3Rpb24oc29ydCkge1xuICAvLyBfc29ydCBkZWZhdWx0IHRvIHRydWUgYnV0IG90aGVyd2lzZSBjYW4gYmUgYSBmdW5jdGlvbiBvciBib29sZWFuXG4gIHRoaXMuX3NvcnQgPSB0eXBlb2Ygc29ydCA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogc29ydDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENvbXBvc2UgcXVlcnlzdHJpbmcgdG8gYXBwZW5kIHRvIHJlcS51cmxcbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9maW5hbGl6ZVF1ZXJ5U3RyaW5nID0gZnVuY3Rpb24oKXtcbiAgdmFyIHF1ZXJ5ID0gdGhpcy5fcXVlcnkuam9pbignJicpO1xuICBpZiAocXVlcnkpIHtcbiAgICB0aGlzLnVybCArPSAodGhpcy51cmwuaW5kZXhPZignPycpID49IDAgPyAnJicgOiAnPycpICsgcXVlcnk7XG4gIH1cbiAgdGhpcy5fcXVlcnkubGVuZ3RoID0gMDsgLy8gTWFrZXMgdGhlIGNhbGwgaWRlbXBvdGVudFxuXG4gIGlmICh0aGlzLl9zb3J0KSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy51cmwuaW5kZXhPZignPycpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgcXVlcnlBcnIgPSB0aGlzLnVybC5zdWJzdHJpbmcoaW5kZXggKyAxKS5zcGxpdCgnJicpO1xuICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiB0aGlzLl9zb3J0KSB7XG4gICAgICAgIHF1ZXJ5QXJyLnNvcnQodGhpcy5fc29ydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeUFyci5zb3J0KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnVybCA9IHRoaXMudXJsLnN1YnN0cmluZygwLCBpbmRleCkgKyAnPycgKyBxdWVyeUFyci5qb2luKCcmJyk7XG4gICAgfVxuICB9XG59O1xuXG4vLyBGb3IgYmFja3dhcmRzIGNvbXBhdCBvbmx5XG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2FwcGVuZFF1ZXJ5U3RyaW5nID0gZnVuY3Rpb24oKSB7Y29uc29sZS50cmFjZShcIlVuc3VwcG9ydGVkXCIpO31cblxuLyoqXG4gKiBJbnZva2UgY2FsbGJhY2sgd2l0aCB0aW1lb3V0IGVycm9yLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fdGltZW91dEVycm9yID0gZnVuY3Rpb24ocmVhc29uLCB0aW1lb3V0LCBlcnJubyl7XG4gIGlmICh0aGlzLl9hYm9ydGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IocmVhc29uICsgdGltZW91dCArICdtcyBleGNlZWRlZCcpO1xuICBlcnIudGltZW91dCA9IHRpbWVvdXQ7XG4gIGVyci5jb2RlID0gJ0VDT05OQUJPUlRFRCc7XG4gIGVyci5lcnJubyA9IGVycm5vO1xuICB0aGlzLnRpbWVkb3V0ID0gdHJ1ZTtcbiAgdGhpcy5hYm9ydCgpO1xuICB0aGlzLmNhbGxiYWNrKGVycik7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX3NldFRpbWVvdXRzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBkZWFkbGluZVxuICBpZiAodGhpcy5fdGltZW91dCAmJiAhdGhpcy5fdGltZXIpIHtcbiAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHNlbGYuX3RpbWVvdXRFcnJvcignVGltZW91dCBvZiAnLCBzZWxmLl90aW1lb3V0LCAnRVRJTUUnKTtcbiAgICB9LCB0aGlzLl90aW1lb3V0KTtcbiAgfVxuICAvLyByZXNwb25zZSB0aW1lb3V0XG4gIGlmICh0aGlzLl9yZXNwb25zZVRpbWVvdXQgJiYgIXRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyKSB7XG4gICAgdGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICBzZWxmLl90aW1lb3V0RXJyb3IoJ1Jlc3BvbnNlIHRpbWVvdXQgb2YgJywgc2VsZi5fcmVzcG9uc2VUaW1lb3V0LCAnRVRJTUVET1VUJyk7XG4gICAgfSwgdGhpcy5fcmVzcG9uc2VUaW1lb3V0KTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBFeHBvc2UgYFJlc3BvbnNlQmFzZWAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBSZXNwb25zZUJhc2U7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVzcG9uc2VCYXNlYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFJlc3BvbnNlQmFzZShvYmopIHtcbiAgaWYgKG9iaikgcmV0dXJuIG1peGluKG9iaik7XG59XG5cbi8qKlxuICogTWl4aW4gdGhlIHByb3RvdHlwZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1peGluKG9iaikge1xuICBmb3IgKHZhciBrZXkgaW4gUmVzcG9uc2VCYXNlLnByb3RvdHlwZSkge1xuICAgIG9ialtrZXldID0gUmVzcG9uc2VCYXNlLnByb3RvdHlwZVtrZXldO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogR2V0IGNhc2UtaW5zZW5zaXRpdmUgYGZpZWxkYCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVzcG9uc2VCYXNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihmaWVsZCkge1xuICByZXR1cm4gdGhpcy5oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV07XG59O1xuXG4vKipcbiAqIFNldCBoZWFkZXIgcmVsYXRlZCBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBgLnR5cGVgIHRoZSBjb250ZW50IHR5cGUgd2l0aG91dCBwYXJhbXNcbiAqXG4gKiBBIHJlc3BvbnNlIG9mIFwiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCJcbiAqIHdpbGwgcHJvdmlkZSB5b3Ugd2l0aCBhIGAudHlwZWAgb2YgXCJ0ZXh0L3BsYWluXCIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlclxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVzcG9uc2VCYXNlLnByb3RvdHlwZS5fc2V0SGVhZGVyUHJvcGVydGllcyA9IGZ1bmN0aW9uKGhlYWRlcil7XG4gICAgLy8gVE9ETzogbW9hciFcbiAgICAvLyBUT0RPOiBtYWtlIHRoaXMgYSB1dGlsXG5cbiAgICAvLyBjb250ZW50LXR5cGVcbiAgICB2YXIgY3QgPSBoZWFkZXJbJ2NvbnRlbnQtdHlwZSddIHx8ICcnO1xuICAgIHRoaXMudHlwZSA9IHV0aWxzLnR5cGUoY3QpO1xuXG4gICAgLy8gcGFyYW1zXG4gICAgdmFyIHBhcmFtcyA9IHV0aWxzLnBhcmFtcyhjdCk7XG4gICAgZm9yICh2YXIga2V5IGluIHBhcmFtcykgdGhpc1trZXldID0gcGFyYW1zW2tleV07XG5cbiAgICB0aGlzLmxpbmtzID0ge307XG5cbiAgICAvLyBsaW5rc1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChoZWFkZXIubGluaykge1xuICAgICAgICAgICAgdGhpcy5saW5rcyA9IHV0aWxzLnBhcnNlTGlua3MoaGVhZGVyLmxpbmspO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgIH1cbn07XG5cbi8qKlxuICogU2V0IGZsYWdzIHN1Y2ggYXMgYC5va2AgYmFzZWQgb24gYHN0YXR1c2AuXG4gKlxuICogRm9yIGV4YW1wbGUgYSAyeHggcmVzcG9uc2Ugd2lsbCBnaXZlIHlvdSBhIGAub2tgIG9mIF9fdHJ1ZV9fXG4gKiB3aGVyZWFzIDV4eCB3aWxsIGJlIF9fZmFsc2VfXyBhbmQgYC5lcnJvcmAgd2lsbCBiZSBfX3RydWVfXy4gVGhlXG4gKiBgLmNsaWVudEVycm9yYCBhbmQgYC5zZXJ2ZXJFcnJvcmAgYXJlIGFsc28gYXZhaWxhYmxlIHRvIGJlIG1vcmVcbiAqIHNwZWNpZmljLCBhbmQgYC5zdGF0dXNUeXBlYCBpcyB0aGUgY2xhc3Mgb2YgZXJyb3IgcmFuZ2luZyBmcm9tIDEuLjVcbiAqIHNvbWV0aW1lcyB1c2VmdWwgZm9yIG1hcHBpbmcgcmVzcG9uZCBjb2xvcnMgZXRjLlxuICpcbiAqIFwic3VnYXJcIiBwcm9wZXJ0aWVzIGFyZSBhbHNvIGRlZmluZWQgZm9yIGNvbW1vbiBjYXNlcy4gQ3VycmVudGx5IHByb3ZpZGluZzpcbiAqXG4gKiAgIC0gLm5vQ29udGVudFxuICogICAtIC5iYWRSZXF1ZXN0XG4gKiAgIC0gLnVuYXV0aG9yaXplZFxuICogICAtIC5ub3RBY2NlcHRhYmxlXG4gKiAgIC0gLm5vdEZvdW5kXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVzcG9uc2VCYXNlLnByb3RvdHlwZS5fc2V0U3RhdHVzUHJvcGVydGllcyA9IGZ1bmN0aW9uKHN0YXR1cyl7XG4gICAgdmFyIHR5cGUgPSBzdGF0dXMgLyAxMDAgfCAwO1xuXG4gICAgLy8gc3RhdHVzIC8gY2xhc3NcbiAgICB0aGlzLnN0YXR1cyA9IHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1cztcbiAgICB0aGlzLnN0YXR1c1R5cGUgPSB0eXBlO1xuXG4gICAgLy8gYmFzaWNzXG4gICAgdGhpcy5pbmZvID0gMSA9PSB0eXBlO1xuICAgIHRoaXMub2sgPSAyID09IHR5cGU7XG4gICAgdGhpcy5yZWRpcmVjdCA9IDMgPT0gdHlwZTtcbiAgICB0aGlzLmNsaWVudEVycm9yID0gNCA9PSB0eXBlO1xuICAgIHRoaXMuc2VydmVyRXJyb3IgPSA1ID09IHR5cGU7XG4gICAgdGhpcy5lcnJvciA9ICg0ID09IHR5cGUgfHwgNSA9PSB0eXBlKVxuICAgICAgICA/IHRoaXMudG9FcnJvcigpXG4gICAgICAgIDogZmFsc2U7XG5cbiAgICAvLyBzdWdhclxuICAgIHRoaXMuY3JlYXRlZCA9IDIwMSA9PSBzdGF0dXM7XG4gICAgdGhpcy5hY2NlcHRlZCA9IDIwMiA9PSBzdGF0dXM7XG4gICAgdGhpcy5ub0NvbnRlbnQgPSAyMDQgPT0gc3RhdHVzO1xuICAgIHRoaXMuYmFkUmVxdWVzdCA9IDQwMCA9PSBzdGF0dXM7XG4gICAgdGhpcy51bmF1dGhvcml6ZWQgPSA0MDEgPT0gc3RhdHVzO1xuICAgIHRoaXMubm90QWNjZXB0YWJsZSA9IDQwNiA9PSBzdGF0dXM7XG4gICAgdGhpcy5mb3JiaWRkZW4gPSA0MDMgPT0gc3RhdHVzO1xuICAgIHRoaXMubm90Rm91bmQgPSA0MDQgPT0gc3RhdHVzO1xuICAgIHRoaXMudW5wcm9jZXNzYWJsZUVudGl0eSA9IDQyMiA9PSBzdGF0dXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFJldHVybiB0aGUgbWltZSB0eXBlIGZvciB0aGUgZ2l2ZW4gYHN0cmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy50eXBlID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5zcGxpdCgvICo7ICovKS5zaGlmdCgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gaGVhZGVyIGZpZWxkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5wYXJhbXMgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnNwbGl0KC8gKjsgKi8pLnJlZHVjZShmdW5jdGlvbihvYmosIHN0cil7XG4gICAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KC8gKj0gKi8pO1xuICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpO1xuICAgIHZhciB2YWwgPSBwYXJ0cy5zaGlmdCgpO1xuXG4gICAgaWYgKGtleSAmJiB2YWwpIG9ialtrZXldID0gdmFsO1xuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbn07XG5cbi8qKlxuICogUGFyc2UgTGluayBoZWFkZXIgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMucGFyc2VMaW5rcyA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAqLCAqLykucmVkdWNlKGZ1bmN0aW9uKG9iaiwgc3RyKXtcbiAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoLyAqOyAqLyk7XG4gICAgdmFyIHVybCA9IHBhcnRzWzBdLnNsaWNlKDEsIC0xKTtcbiAgICB2YXIgcmVsID0gcGFydHNbMV0uc3BsaXQoLyAqPSAqLylbMV0uc2xpY2UoMSwgLTEpO1xuICAgIG9ialtyZWxdID0gdXJsO1xuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbn07XG5cbi8qKlxuICogU3RyaXAgY29udGVudCByZWxhdGVkIGZpZWxkcyBmcm9tIGBoZWFkZXJgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJcbiAqIEByZXR1cm4ge09iamVjdH0gaGVhZGVyXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmNsZWFuSGVhZGVyID0gZnVuY3Rpb24oaGVhZGVyLCBjaGFuZ2VzT3JpZ2luKXtcbiAgZGVsZXRlIGhlYWRlclsnY29udGVudC10eXBlJ107XG4gIGRlbGV0ZSBoZWFkZXJbJ2NvbnRlbnQtbGVuZ3RoJ107XG4gIGRlbGV0ZSBoZWFkZXJbJ3RyYW5zZmVyLWVuY29kaW5nJ107XG4gIGRlbGV0ZSBoZWFkZXJbJ2hvc3QnXTtcbiAgLy8gc2VjdWlydHlcbiAgaWYgKGNoYW5nZXNPcmlnaW4pIHtcbiAgICBkZWxldGUgaGVhZGVyWydhdXRob3JpemF0aW9uJ107XG4gICAgZGVsZXRlIGhlYWRlclsnY29va2llJ107XG4gIH1cbiAgcmV0dXJuIGhlYWRlcjtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHRvQXJyYXlcblxuZnVuY3Rpb24gdG9BcnJheShsaXN0LCBpbmRleCkge1xuICAgIHZhciBhcnJheSA9IFtdXG5cbiAgICBpbmRleCA9IGluZGV4IHx8IDBcblxuICAgIGZvciAodmFyIGkgPSBpbmRleCB8fCAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJheVtpIC0gaW5kZXhdID0gbGlzdFtpXVxuICAgIH1cblxuICAgIHJldHVybiBhcnJheVxufVxuIiwiXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlO1xuXG4vKipcbiAqIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2Uubm9EZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudGhyb3dEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCB0aHJvdyBhbiBFcnJvciB3aGVuIGludm9rZWQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50cmFjZURlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGludm9rZSBgY29uc29sZS50cmFjZSgpYCBpbnN0ZWFkIG9mIGBjb25zb2xlLmVycm9yKClgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIGRlcHJlY2F0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIGNvbnNvbGUgd2hlbiBgZm5gIGlzIGludm9rZWRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBuZXcgXCJkZXByZWNhdGVkXCIgdmVyc2lvbiBvZiBgZm5gXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZSAoZm4sIG1zZykge1xuICBpZiAoY29uZmlnKCdub0RlcHJlY2F0aW9uJykpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChjb25maWcoJ3Rocm93RGVwcmVjYXRpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnKCd0cmFjZURlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBgbG9jYWxTdG9yYWdlYCBmb3IgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29uZmlnIChuYW1lKSB7XG4gIC8vIGFjY2Vzc2luZyBnbG9iYWwubG9jYWxTdG9yYWdlIGNhbiB0cmlnZ2VyIGEgRE9NRXhjZXB0aW9uIGluIHNhbmRib3hlZCBpZnJhbWVzXG4gIHRyeSB7XG4gICAgaWYgKCFnbG9iYWwubG9jYWxTdG9yYWdlKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IGdsb2JhbC5sb2NhbFN0b3JhZ2VbbmFtZV07XG4gIGlmIChudWxsID09IHZhbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYWxwaGFiZXQgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXotXycuc3BsaXQoJycpXG4gICwgbGVuZ3RoID0gNjRcbiAgLCBtYXAgPSB7fVxuICAsIHNlZWQgPSAwXG4gICwgaSA9IDBcbiAgLCBwcmV2O1xuXG4vKipcbiAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBudW1iZXIuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG51bSBUaGUgbnVtYmVyIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiBlbmNvZGUobnVtKSB7XG4gIHZhciBlbmNvZGVkID0gJyc7XG5cbiAgZG8ge1xuICAgIGVuY29kZWQgPSBhbHBoYWJldFtudW0gJSBsZW5ndGhdICsgZW5jb2RlZDtcbiAgICBudW0gPSBNYXRoLmZsb29yKG51bSAvIGxlbmd0aCk7XG4gIH0gd2hpbGUgKG51bSA+IDApO1xuXG4gIHJldHVybiBlbmNvZGVkO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiBkZWNvZGUoc3RyKSB7XG4gIHZhciBkZWNvZGVkID0gMDtcblxuICBmb3IgKGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVjb2RlZCA9IGRlY29kZWQgKiBsZW5ndGggKyBtYXBbc3RyLmNoYXJBdChpKV07XG4gIH1cblxuICByZXR1cm4gZGVjb2RlZDtcbn1cblxuLyoqXG4gKiBZZWFzdDogQSB0aW55IGdyb3dpbmcgaWQgZ2VuZXJhdG9yLlxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdW5pcXVlIGlkLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuZnVuY3Rpb24geWVhc3QoKSB7XG4gIHZhciBub3cgPSBlbmNvZGUoK25ldyBEYXRlKCkpO1xuXG4gIGlmIChub3cgIT09IHByZXYpIHJldHVybiBzZWVkID0gMCwgcHJldiA9IG5vdztcbiAgcmV0dXJuIG5vdyArJy4nKyBlbmNvZGUoc2VlZCsrKTtcbn1cblxuLy9cbi8vIE1hcCBlYWNoIGNoYXJhY3RlciB0byBpdHMgaW5kZXguXG4vL1xuZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgbWFwW2FscGhhYmV0W2ldXSA9IGk7XG5cbi8vXG4vLyBFeHBvc2UgdGhlIGB5ZWFzdGAsIGBlbmNvZGVgIGFuZCBgZGVjb2RlYCBmdW5jdGlvbnMuXG4vL1xueWVhc3QuZW5jb2RlID0gZW5jb2RlO1xueWVhc3QuZGVjb2RlID0gZGVjb2RlO1xubW9kdWxlLmV4cG9ydHMgPSB5ZWFzdDtcbiJdfQ==